diff --git a/.github/workflows/bridge-bindings.yml b/.github/workflows/bridge-bindings.yml index 5359e72eb0..740aa64603 100644 --- a/.github/workflows/bridge-bindings.yml +++ b/.github/workflows/bridge-bindings.yml @@ -2,9 +2,20 @@ name: Rust bridge validation on: workflow_dispatch: + inputs: + allow_generated_drift: + description: Upload regenerated bindings without failing the manual run + required: false + default: false + type: boolean push: paths: - ".github/workflows/bridge-bindings.yml" + - ".gitmodules" + - "rust/Cargo.toml" + - "rust/Cargo.lock" + - "rust/src/**" + - "rustpush" - "rust/src/api/**" - "flutter_rust_bridge.yaml" - "lib/src/rust/**" @@ -12,6 +23,11 @@ on: pull_request: paths: - ".github/workflows/bridge-bindings.yml" + - ".gitmodules" + - "rust/Cargo.toml" + - "rust/Cargo.lock" + - "rust/src/**" + - "rustpush" - "rust/src/api/**" - "flutter_rust_bridge.yaml" - "lib/src/rust/**" @@ -19,15 +35,23 @@ on: jobs: bindings: - runs-on: ubuntu-latest + # Generated bindings must be reproducible, so pin the image instead of + # letting ubuntu-latest drift the toolchain under the drift check. + runs-on: ubuntu-24.04 steps: - - uses: actions/checkout@v4 + - uses: actions/checkout@v7 with: submodules: recursive - name: Set up Rust uses: dtolnay/rust-toolchain@stable + - name: Set up Flutter for bridge generation + uses: subosito/flutter-action@v2 + with: + flutter-version: "3.44.8" + channel: stable + - name: Install native build tools run: | sudo apt-get update @@ -54,5 +78,76 @@ jobs: cp rustpush/certs/legacy-fairplay/fairplay.crt "$destination/$name.crt" done + - name: Install pinned Flutter Rust Bridge generator + shell: bash + run: | + archive="${RUNNER_TEMP}/flutter_rust_bridge_codegen.tgz" + url="https://github.com/fzyzcjy/flutter_rust_bridge/releases/download/v2.3.0/flutter_rust_bridge_codegen-x86_64-unknown-linux-gnu-v2.3.0.tgz" + curl --fail --location --silent --show-error "$url" --output "$archive" + echo "bb3a5e3d1f17a543e73f8dfff886e883928b95e3a9d19ca5268da40952d80cee $archive" | sha256sum --check --strict + mkdir -p "${RUNNER_TEMP}/frb-codegen" + tar -xzf "$archive" -C "${RUNNER_TEMP}/frb-codegen" + echo "${RUNNER_TEMP}/frb-codegen" >> "$GITHUB_PATH" + + - name: Regenerate committed bridge bindings + shell: bash + run: flutter_rust_bridge_codegen generate --config-file flutter_rust_bridge.yaml + + - name: Normalize generated SSE implementations + shell: pwsh + run: | + ./tooling/frb/guard_generated_sse_impls.ps1 -Mode Deduplicate -ExpectedRemovalCount 6 + ./tooling/frb/guard_generated_sse_impls.ps1 -Mode Verify + + - name: Upload regenerated bridge bindings + if: always() + uses: actions/upload-artifact@v7 + with: + name: regenerated-rust-bridge-bindings + if-no-files-found: error + retention-days: 7 + path: | + lib/src/rust/api/api.dart + lib/src/rust/frb_generated.dart + lib/src/rust/frb_generated.io.dart + lib/src/rust/frb_generated.web.dart + rust/src/frb_generated.rs + rust/src/frb_generated.io.rs + rust/src/frb_generated.web.rs + + - name: Verify committed bridge bindings are reproducible + if: github.event_name != 'workflow_dispatch' || inputs.allow_generated_drift != true + shell: bash + run: | + git diff --exit-code -- \ + lib/src/rust/api/api.dart \ + lib/src/rust/frb_generated.dart \ + lib/src/rust/frb_generated.io.dart \ + lib/src/rust/frb_generated.web.dart \ + rust/src/frb_generated.rs \ + rust/src/frb_generated.io.rs \ + rust/src/frb_generated.web.rs + - name: Compile committed Rust bridge run: cargo check --manifest-path rust/Cargo.toml --lib --message-format short + + # cargo check --lib does not even compile #[cfg(test)] code, so until now + # no Rust test in this repository could fail a build. That covered the + # canonical converter, the DTO parsers, the protected store, and the + # keyed identity hasher. A suite that cannot fail a build is not a gate. + - name: Run Rust tests + run: cargo test --manifest-path rust/Cargo.toml --lib + + # Tests inside the rustpush submodule are not executed when rustpush is + # compiled only as a dependency of the bridge crate. Keep its protocol, + # concurrency, and log-redaction tests as an independent gate. Match the + # production bridge's non-macOS Anisette provider feature so icloud_auth + # exposes the same provider types that the application compiles against. + - name: Run rustpush tests + run: cargo test --manifest-path rustpush/Cargo.toml --lib --features remote-anisette-v3 + + # The protector harness is a separate crate and is deliberately + # dependency-light so these security invariants can run on hosts where the + # full application crate cannot build. + - name: Run the Cloud Sync protector harness + run: cargo test --manifest-path rust/cloud_sync_protector_harness/Cargo.toml diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index fad9677085..edaca8dbaa 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -3,7 +3,10 @@ name: Build jobs: build: name: OpenBubbles APK - runs-on: ubuntu-latest + # Pinned rather than ubuntu-latest so the image cannot drift underneath the + # gates. ubuntu-latest moved to an image without PowerShell, which silently + # broke the protected-data logging scan below. + runs-on: ubuntu-24.04 steps: - name: Free Disk Space (Ubuntu) uses: jlumbroso/free-disk-space@main @@ -15,23 +18,21 @@ jobs: large-packages: true swap-storage: true - - uses: actions/checkout@v4 + - uses: actions/checkout@v7 with: submodules: recursive - name: Set up Rust - uses: actions-rs/toolchain@v1 - with: - toolchain: stable + uses: dtolnay/rust-toolchain@stable - name: Set up Flutter uses: subosito/flutter-action@v2 with: channel: stable - flutter-version: 3.24.0 + flutter-version: 3.44.8 - name: Set up Java - uses: actions/setup-java@v2 + uses: actions/setup-java@v5 with: java-version: '21' distribution: 'temurin' @@ -64,28 +65,361 @@ jobs: cp rustpush/certs/legacy-fairplay/fairplay.crt rustpush/certs/fairplay/$name.crt done - - name: Run focused message helper tests - run: flutter test test/helpers/message_helper_test.dart + # The Dart test host loads the ObjectBox C library from the system loader + # path, and the runner image does not ship one. Without this the Cloud + # Sync suite fails 63 ObjectBox-backed tests with a dynamic-library error + # that names nothing about the real cause. The version must track the + # objectbox trio pinned in pubspec.yaml, and the archive is hash-checked + # because the upstream download script is unpinned. + - name: Install ObjectBox C library + env: + OBJECTBOX_VERSION: 5.3.2 + OBJECTBOX_SHA256: 6dbb5450c36dd11ee9074f16ecc61e79b45ff43c2082934601f3166b39c8a613 + run: | + set -euo pipefail + pinned="$(grep -oP '^\s{2}objectbox:\s*\K\d+\.\d+\.\d+' pubspec.yaml)" + if [ "$pinned" != "$OBJECTBOX_VERSION" ]; then + echo "pubspec pins objectbox $pinned but this step installs $OBJECTBOX_VERSION" >&2 + exit 1 + fi + archive="objectbox-linux-x64.tar.gz" + curl -fsSL -o "$archive" \ + "https://github.com/objectbox/objectbox-c/releases/download/v${OBJECTBOX_VERSION}/${archive}" + echo "${OBJECTBOX_SHA256} ${archive}" | sha256sum --check --strict + mkdir -p "$RUNNER_TEMP/objectbox" + tar -xzf "$archive" -C "$RUNNER_TEMP/objectbox" + library="$(find "$RUNNER_TEMP/objectbox" -name libobjectbox.so -print -quit)" + if [ -z "$library" ]; then + echo "libobjectbox.so was not present in $archive" >&2 + exit 1 + fi + echo "LD_LIBRARY_PATH=$(dirname "$library")${LD_LIBRARY_PATH:+:$LD_LIBRARY_PATH}" >> "$GITHUB_ENV" + + # Deliberately the whole suite rather than an enumerated list. The list + # had drifted: eleven test files were never executed by any workflow, + # including the only coverage for the attachment-GUID parser and the + # reaction-type mapper. A test that cannot fail a build is not a gate. + - name: Run the Dart test suite + run: flutter test - - name: Run bounded memory cache tests + # This gate is a .ps1 shared with local Windows runs, so install pwsh + # rather than forking the scan logic into a second implementation that + # could drift. Guarded so a runner image that already ships PowerShell + # costs nothing. + - name: Ensure PowerShell is available + run: | + set -euo pipefail + if command -v pwsh >/dev/null 2>&1; then + pwsh --version + exit 0 + fi + sudo snap install powershell --classic + pwsh --version + + - name: Scan Rust diagnostics for protected-data logging + shell: pwsh run: >- - flutter test - test/helpers/memory/bounded_byte_cache_test.dart - test/helpers/memory/bounded_lru_map_test.dart + ./tooling/cloud_sync/check_sensitive_rust_logs.ps1 + -RepositoryRoot $env:GITHUB_WORKSPACE + + # android/.gitignore excludes /gradlew and gradle-wrapper.jar, and upstream + # tracks neither, so ./gradlew does not exist in a fresh checkout and this + # step exited 127. Only gradle-wrapper.properties is tracked, so install + # exactly the distribution it pins and drive Gradle directly. The version + # is cross-checked against that file so the two cannot drift, and the + # archive is hash-verified against Gradle's published checksum. + - name: Install pinned Gradle + env: + GRADLE_VERSION: 8.9 + GRADLE_SHA256: d725d707bfabd4dfdc958c624003b3c80accc03f7037b5122c4b1d0ef15cecab + run: | + set -euo pipefail + pinned="$(sed -n 's|^distributionUrl=.*/gradle-\([0-9.]*\)-bin\.zip$|\1|p' \ + android/gradle/wrapper/gradle-wrapper.properties)" + if [ "$pinned" != "$GRADLE_VERSION" ]; then + echo "wrapper pins Gradle $pinned but this step installs $GRADLE_VERSION" >&2 + exit 1 + fi + archive="gradle-${GRADLE_VERSION}-bin.zip" + curl -fsSL -o "$archive" \ + "https://services.gradle.org/distributions/${archive}" + echo "${GRADLE_SHA256} ${archive}" | sha256sum --check --strict + unzip -q "$archive" -d "$RUNNER_TEMP/gradle" + echo "$RUNNER_TEMP/gradle/gradle-${GRADLE_VERSION}/bin" >> "$GITHUB_PATH" + + # Same vendored-CargoKit fix as the sampler job below. Without it the + # alpha APKs uploaded here install and hang on launch. + - name: Patch vendored CargoKit for the Flutter Kotlin plugin + run: | + set -euo pipefail + flutter pub get + bash ./tooling/android/patch_pub_cache_cargokit.sh + + - name: Set up Node for FaceTime WebRTC replay tests + uses: actions/setup-node@v4 + with: + node-version: "22" + + - name: Run FaceTime WebRTC diagnostic replay tests + run: node --test tooling/facetime/web_rtc_diagnostic_bootstrap.test.mjs + + # Slower than it used to be: CargoKit now actually applies, so this + # compile also builds the Rust bridge and vendored OpenSSL. That cost is + # the price of the APKs below containing a native library at all, since + # before the fix they were uploaded without one. + - name: Run Android cold-start delivery tests + working-directory: android + run: gradle --no-daemon :app:testAlphaDebugUnitTest :app:compileAlphaDebugKotlin - # First run is expected to fail until ffmpeg_kit_flutter_new is fixed. - name: Build Alpha Profile APK - run: flutter build apk --flavor alpha --profile --target-platform android-arm64 + env: + REGISTRATION_RELAY_ACCESS_TOKEN: ${{ secrets.REGISTRATION_RELAY_ACCESS_TOKEN }} + run: >- + flutter build apk --flavor alpha --profile --target-platform android-arm64 + "--dart-define=OPENBUBBLES_REGISTRATION_RELAY_ACCESS_TOKEN=$REGISTRATION_RELAY_ACCESS_TOKEN" - - uses: actions/upload-artifact@v4 + - uses: actions/upload-artifact@v7 with: name: Alpha Profile APK path: build/app/outputs/flutter-apk/app-alpha-profile.apk - name: Build Alpha Debug APK - run: flutter build apk --flavor alpha --debug --target-platform android-arm64 + env: + REGISTRATION_RELAY_ACCESS_TOKEN: ${{ secrets.REGISTRATION_RELAY_ACCESS_TOKEN }} + run: >- + flutter build apk --flavor alpha --debug --target-platform android-arm64 + "--dart-define=OPENBUBBLES_REGISTRATION_RELAY_ACCESS_TOKEN=$REGISTRATION_RELAY_ACCESS_TOKEN" + + - name: Verify the alpha APKs carry all native libraries + run: | + set -euo pipefail + for apk in \ + build/app/outputs/flutter-apk/app-alpha-profile.apk \ + build/app/outputs/flutter-apk/app-alpha-debug.apk; do + for entry in \ + lib/arm64-v8a/libflutter.so \ + lib/arm64-v8a/librust_lib_bluebubbles.so \ + lib/arm64-v8a/libirondash_engine_context_native.so \ + lib/arm64-v8a/libsuper_native_extensions.so; do + if ! unzip -l "$apk" | grep -q "$entry"; then + echo "$apk is missing $entry" >&2 + unzip -l "$apk" | grep 'lib/' >&2 || true + exit 1 + fi + done + done - - uses: actions/upload-artifact@v4 + - uses: actions/upload-artifact@v7 with: name: Alpha Debug APK path: build/app/outputs/flutter-apk/app-alpha-debug.apk + + # Separate job so the developer sampler APK is not queued behind the full + # test suite and the two alpha APK builds, each of which now pays its own + # CargoKit Rust and vendored-OpenSSL compile. Setup mirrors the APK job above, + # including the Fairplay fixtures the Rust build needs. + sampler-apk: + name: Beta Sampler APK + runs-on: ubuntu-24.04 + steps: + - name: Free Disk Space (Ubuntu) + uses: jlumbroso/free-disk-space@main + with: + tool-cache: true + android: true + dotnet: true + haskell: true + large-packages: true + swap-storage: true + + - uses: actions/checkout@v7 + with: + submodules: recursive + + - name: Set up Rust + uses: dtolnay/rust-toolchain@stable + + - name: Set up Flutter + uses: subosito/flutter-action@v2 + with: + channel: stable + flutter-version: 3.44.8 + + - name: Set up Java + uses: actions/setup-java@v5 + with: + java-version: '21' + distribution: 'temurin' + + - name: Setup Android SDK + uses: amyu/setup-android@v5 + + - name: Install Protobuf compiler + run: sudo apt-get install -y protobuf-compiler + + - name: Set up fake Fairplay keys + run: | + mkdir -p rustpush/certs/fairplay + + cert_names=( + "4056631661436364584235346952193" + "4056631661436364584235346952194" + "4056631661436364584235346952195" + "4056631661436364584235346952196" + "4056631661436364584235346952197" + "4056631661436364584235346952198" + "4056631661436364584235346952199" + "4056631661436364584235346952200" + "4056631661436364584235346952201" + "4056631661436364584235346952208" + ) + + for name in "${cert_names[@]}"; do + cp rustpush/certs/legacy-fairplay/fairplay.pem rustpush/certs/fairplay/$name.pem + cp rustpush/certs/legacy-fairplay/fairplay.crt rustpush/certs/fairplay/$name.crt + done + + # irondash_engine_context and super_native_extensions each vendor their + # own CargoKit, and neither can see Flutter 3.44.8's Kotlin plugin, so + # their Rust is never built. The resulting APK installs and then hangs on + # launch: the missing libirondash_engine_context_native.so throws + # UnsatisfiedLinkError from a static initializer inside + # GeneratedPluginRegistrant.registerWith, which aborts registration for + # every other plugin, so path_provider has no channel and the app dies + # during startup behind an error that names none of this. Those copies + # live in the pub cache and cannot be fixed by a committed edit. + - name: Patch vendored CargoKit for the Flutter Kotlin plugin + run: | + set -euo pipefail + flutter pub get + bash ./tooling/android/patch_pub_cache_cargokit.sh + + # Developer-only build for the first live read-only Cloud Sync V2 run. + # The beta flavour is a separate applicationId, so it installs alongside + # alpha without touching its database. Debug rather than release because + # the beta release config needs a signing keystore, and because the shadow + # report has no in-app export and must be pulled with adb run-as, which a + # release build does not permit. + - name: Build Beta Debug APK with the Cloud Sync V2 sampler + env: + REGISTRATION_RELAY_ACCESS_TOKEN: ${{ secrets.REGISTRATION_RELAY_ACCESS_TOKEN }} + run: >- + flutter build apk --flavor beta --debug --target-platform android-arm64 + --dart-define=OPENBUBBLES_CLOUD_SYNC_V2_SAMPLER=true + --dart-define=OPENBUBBLES_CLOUD_SYNC_V2_SEMANTIC_PULL=true + --dart-define=OPENBUBBLES_BUILD_COMMIT=${{ github.sha }} + "--dart-define=OPENBUBBLES_REGISTRATION_RELAY_ACCESS_TOKEN=$REGISTRATION_RELAY_ACCESS_TOKEN" + + - name: Verify the beta APK carries the Rust bridge + run: | + set -euo pipefail + apk=build/app/outputs/flutter-apk/app-beta-debug.apk + # CargoKit silently skipped the Rust build on Flutter 3.44.8 until the + # plugin-detection fix, producing a package that installs and cannot + # work. Fail here rather than ship that again. + # This is the complete set of CargoKit-built libraries the app loads, + # derived from GeneratedPluginRegistrant plus the app's own bridge, + # not from whichever one happened to crash last. A missing entry + # fails no build: it yields an APK that installs cleanly and dies on + # launch, because the loadLibrary throw happens inside + # GeneratedPluginRegistrant.registerWith and takes every other plugin + # down with it. Only an explicit assertion catches that. + for entry in \ + lib/arm64-v8a/libflutter.so \ + lib/arm64-v8a/librust_lib_bluebubbles.so \ + lib/arm64-v8a/libirondash_engine_context_native.so \ + lib/arm64-v8a/libsuper_native_extensions.so; do + if ! unzip -l "$apk" | grep -q "$entry"; then + echo "beta APK is missing $entry" >&2 + unzip -l "$apk" | grep 'lib/' >&2 || true + exit 1 + fi + done + unzip -l "$apk" | grep 'lib/arm64-v8a/' + + - uses: actions/upload-artifact@v7 + with: + name: Beta Debug APK (Cloud Sync sampler) + path: build/app/outputs/flutter-apk/app-beta-debug.apk + + # Separate applicationId for bounded, local-only protocol evidence. The + # audited outbound path remains compile-time absent until a remote- + # absence proof can prevent duplicate logical messages. + - name: Build developer-only CloudKit V2 Evidence Canary APK + env: + REGISTRATION_RELAY_ACCESS_TOKEN: ${{ secrets.REGISTRATION_RELAY_ACCESS_TOKEN }} + run: >- + flutter build apk --flavor canary --debug --target-platform android-arm64 + --dart-define=OPENBUBBLES_CLOUD_SYNC_V2_SAMPLER=true + --dart-define=OPENBUBBLES_CLOUD_SYNC_V2_SEMANTIC_PULL=true + --dart-define=OPENBUBBLES_CLOUD_SYNC_V2_EVIDENCE=true + --dart-define=OPENBUBBLES_BUILD_COMMIT=${{ github.sha }} + "--dart-define=OPENBUBBLES_REGISTRATION_RELAY_ACCESS_TOKEN=$REGISTRATION_RELAY_ACCESS_TOKEN" + + # Debug APKs otherwise use a runner-generated key that changes between + # jobs. A stable, Canary-only key permits safe in-place updates without + # sharing the production signing identity. + - name: Sign the evidence canary with its stable key + env: + CANARY_KEYSTORE_BASE64: ${{ secrets.CANARY_KEYSTORE_BASE64 }} + CANARY_KEYSTORE_PASSWORD: ${{ secrets.CANARY_KEYSTORE_PASSWORD }} + CANARY_KEY_PASSWORD: ${{ secrets.CANARY_KEY_PASSWORD }} + CANARY_KEY_ALIAS: ${{ secrets.CANARY_KEY_ALIAS }} + run: | + set -euo pipefail + apk=build/app/outputs/flutter-apk/app-canary-debug.apk + keystore="$RUNNER_TEMP/cloudkit-canary.p12" + signed_apk="$RUNNER_TEMP/app-canary-debug-signed.apk" + sdk_root="${ANDROID_SDK_ROOT:-${ANDROID_HOME:-}}" + apksigner="$( + find "$sdk_root/build-tools" -type f -name apksigner -print \ + | sort -V \ + | tail -n 1 + )" + + test -n "$CANARY_KEYSTORE_BASE64" + test -n "$CANARY_KEYSTORE_PASSWORD" + test -n "$CANARY_KEY_PASSWORD" + test -n "$CANARY_KEY_ALIAS" + test -x "$apksigner" + printf '%s' "$CANARY_KEYSTORE_BASE64" | base64 --decode > "$keystore" + + "$apksigner" sign \ + --ks "$keystore" \ + --ks-key-alias "$CANARY_KEY_ALIAS" \ + --ks-pass env:CANARY_KEYSTORE_PASSWORD \ + --key-pass env:CANARY_KEY_PASSWORD \ + --out "$signed_apk" \ + "$apk" + mv "$signed_apk" "$apk" + + actual_fingerprint="$( + "$apksigner" verify --print-certs "$apk" \ + | sed -n 's/^Signer #1 certificate SHA-256 digest: //p' + )" + expected_fingerprint='0ea17c1b67581ca79660d33db45af0a36b71ea36a4cbafec5293d3ae80570d79' + if [[ "$actual_fingerprint" != "$expected_fingerprint" ]]; then + echo "Unexpected Canary signing certificate: $actual_fingerprint" >&2 + exit 1 + fi + + - name: Verify the evidence canary APK carries all native libraries + run: | + set -euo pipefail + apk=build/app/outputs/flutter-apk/app-canary-debug.apk + for entry in \ + lib/arm64-v8a/libflutter.so \ + lib/arm64-v8a/librust_lib_bluebubbles.so \ + lib/arm64-v8a/libirondash_engine_context_native.so \ + lib/arm64-v8a/libsuper_native_extensions.so; do + if ! unzip -l "$apk" | grep -q "$entry"; then + echo "evidence canary APK is missing $entry" >&2 + unzip -l "$apk" | grep 'lib/' >&2 || true + exit 1 + fi + done + + - uses: actions/upload-artifact@v7 + with: + name: CloudKit V2 Evidence Canary APK + path: build/app/outputs/flutter-apk/app-canary-debug.apk diff --git a/.github/workflows/windows-arm64-native-media.yml b/.github/workflows/windows-arm64-native-media.yml new file mode 100644 index 0000000000..9c08ed10d4 --- /dev/null +++ b/.github/workflows/windows-arm64-native-media.yml @@ -0,0 +1,359 @@ +name: Windows native media provenance + +on: + pull_request: + paths: + - "packages/media_kit_libs_windows_video/**" + - "docs/WINDOWS_ARM64_NATIVE_MEDIA.md" + - "pubspec.yaml" + - "pubspec.lock" + - "tooling/windows/*.ps1" + - "windows/CMakeLists.txt" + - ".github/workflows/windows-arm64-native-media.yml" + push: + branches: + - rustpush + paths: + - "packages/media_kit_libs_windows_video/**" + - "docs/WINDOWS_ARM64_NATIVE_MEDIA.md" + - "pubspec.yaml" + - "pubspec.lock" + - "tooling/windows/*.ps1" + - "windows/CMakeLists.txt" + - ".github/workflows/windows-arm64-native-media.yml" + workflow_dispatch: + +permissions: + contents: read + +concurrency: + group: windows-native-media-${{ github.workflow }}-${{ github.ref }} + cancel-in-progress: true + +jobs: + static-verification: + name: Fail-closed scaffold tests + runs-on: windows-2025 + timeout-minutes: 10 + steps: + - name: Check out reviewed source + uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1 + + - name: Test manifests, hashes, PE guards, and rejection paths + shell: pwsh + run: >- + ./packages/media_kit_libs_windows_video/tool/test_native_media_scaffold.ps1 + + - name: Verify application dependency and runner packaging contract + shell: pwsh + run: >- + ./tooling/windows/verify_native_media_integration.ps1 + + native-source-build: + name: Official ANGLE, runner, and runtime (${{ matrix.arch }}) + if: github.event_name == 'workflow_dispatch' + needs: static-verification + permissions: + contents: read + id-token: write + attestations: write + strategy: + fail-fast: false + matrix: + include: + - arch: x64 + runner: windows-2025 + rust-target: x86_64-pc-windows-msvc + - arch: arm64 + runner: windows-11-arm + rust-target: aarch64-pc-windows-msvc + runs-on: ${{ matrix.runner }} + timeout-minutes: 420 + steps: + - name: Check out reviewed source + uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1 + with: + submodules: recursive + + - name: Record native runner architecture + id: runner + shell: pwsh + run: | + $native = $env:PROCESSOR_ARCHITEW6432 + if (-not $native) { + $native = $env:PROCESSOR_ARCHITECTURE + } + "native_architecture=$native" >> $env:GITHUB_OUTPUT + Get-ComputerInfo | + Select-Object WindowsProductName, WindowsVersion, OsArchitecture + + - name: Build ANGLE from pinned official Google source + shell: pwsh + run: | + $package = Join-Path $env:GITHUB_WORKSPACE ` + "packages/media_kit_libs_windows_video" + & (Join-Path $package "tool/build_official_angle.ps1") ` + -Architecture "${{ matrix.arch }}" ` + -WorkRoot (Join-Path $env:RUNNER_TEMP "official-angle-work") ` + -OutputRoot ( + Join-Path $package "windows/native/${{ matrix.arch }}/angle" + ) + + - name: Resolve pinned libmpv and verify all native inputs + shell: pwsh + run: | + $package = Join-Path $env:GITHUB_WORKSPACE ` + "packages/media_kit_libs_windows_video" + $cache = Join-Path $env:RUNNER_TEMP "native-media" + & (Join-Path $package "tool/prepare_native_media.ps1") ` + -Architecture "${{ matrix.arch }}" ` + -AngleBundleRoot ( + Join-Path $package "windows/native/${{ matrix.arch }}/angle" + ) ` + -CacheRoot $cache ` + -GeneratedCmakePath (Join-Path $cache "native-media.cmake") ` + -ResolutionPath (Join-Path $cache "native-media-resolution.json") + + - name: Load DLLs and verify required exports natively + shell: pwsh + run: | + $package = Join-Path $env:GITHUB_WORKSPACE ` + "packages/media_kit_libs_windows_video" + & (Join-Path $package "tool/runtime_smoke.ps1") ` + -ResolutionPath ( + Join-Path $env:RUNNER_TEMP ` + "native-media/native-media-resolution.json" + ) + + - name: Configure and compile the package registration target + shell: pwsh + run: | + $package = Join-Path $env:GITHUB_WORKSPACE ` + "packages/media_kit_libs_windows_video" + $resolution = Get-Content -LiteralPath ( + Join-Path $env:RUNNER_TEMP ` + "native-media/native-media-resolution.json" + ) -Raw | ConvertFrom-Json + if ("${{ matrix.arch }}" -eq "arm64") { + & (Join-Path $package "tool/test_native_media_scaffold.ps1") ` + -Arm64LibmpvArchive $resolution.libmpv.archive_path + } + else { + & (Join-Path $package "tool/test_native_media_scaffold.ps1") ` + -X64LibmpvArchive $resolution.libmpv.archive_path + } + + - name: Set up Flutter 3.44.8 + id: flutter + uses: subosito/flutter-action@1a449444c387b1966244ae4d4f8c696479add0b2 + with: + channel: stable + flutter-version: 3.44.8 + architecture: x64 + cache: true + + - name: Bootstrap native ARM64 Dart and Flutter engine + if: matrix.arch == 'arm64' + shell: pwsh + run: | + $flutterRoot = "${{ steps.flutter.outputs['cache-path'] }}" + Remove-Item -Force ` + "$flutterRoot\bin\cache\engine-dart-sdk.stamp" ` + -ErrorAction SilentlyContinue + & "$flutterRoot\bin\internal\update_dart_sdk.ps1" + $dartVersion = & "$flutterRoot\bin\dart.bat" --version 2>&1 | + Out-String + if ($dartVersion -notmatch "windows_arm64") { + throw "Expected native ARM64 Dart; got: $dartVersion" + } + & "$flutterRoot\bin\flutter.bat" precache --windows + if (-not (Test-Path ( + Join-Path $flutterRoot ` + "bin/cache/artifacts/engine/windows-arm64-release" + ))) { + throw "Flutter did not install its Windows ARM64 release engine." + } + + - name: Set up Rust target + uses: dtolnay/rust-toolchain@4cda84d5c5c54efe2404f9d843567869ab1699d4 + with: + targets: ${{ matrix.rust-target }} + + - name: Set up pinned Protocol Buffers compiler + shell: pwsh + run: | + $version = "29.5" + $expectedHash = "633d3e555fc97f0a1f55b4adb03256cd94b8059e51e7abbae98ff39e58a9dfa5" + $archive = Join-Path $env:RUNNER_TEMP "protoc-$version-win64.zip" + $destination = Join-Path $env:RUNNER_TOOL_CACHE "protoc\$version\x64" + Invoke-WebRequest ` + "https://github.com/protocolbuffers/protobuf/releases/download/v$version/protoc-$version-win64.zip" ` + -OutFile $archive + $actualHash = ( + Get-FileHash $archive -Algorithm SHA256 + ).Hash.ToLowerInvariant() + if ($actualHash -ne $expectedHash) { + throw "protoc archive checksum mismatch." + } + Expand-Archive -Path $archive -DestinationPath $destination -Force + "$destination\bin" | + Out-File -FilePath $env:GITHUB_PATH -Encoding utf8 -Append + & "$destination\bin\protoc.exe" --version + + - name: Set up test FairPlay certificates + shell: pwsh + run: | + $destination = "rustpush\certs\fairplay" + New-Item -ItemType Directory -Force -Path $destination | Out-Null + $certificateNames = @( + "4056631661436364584235346952193", + "4056631661436364584235346952194", + "4056631661436364584235346952195", + "4056631661436364584235346952196", + "4056631661436364584235346952197", + "4056631661436364584235346952198", + "4056631661436364584235346952199", + "4056631661436364584235346952200", + "4056631661436364584235346952201", + "4056631661436364584235346952208" + ) + foreach ($name in $certificateNames) { + Copy-Item ` + "rustpush\certs\legacy-fairplay\fairplay.pem" ` + "$destination\$name.pem" + Copy-Item ` + "rustpush\certs\legacy-fairplay\fairplay.crt" ` + "$destination\$name.crt" + } + + - name: Build and verify complete native Windows runner + shell: pwsh + env: + CARGO_BUILD_JOBS: "2" + CARGO_PROFILE_RELEASE_CODEGEN_UNITS: "4" + CARGO_TERM_COLOR: never + run: | + $shortWorkspace = "D:\s" + New-Item -ItemType Directory -Force -Path $shortWorkspace | + Out-Null + robocopy "$env:GITHUB_WORKSPACE" $shortWorkspace /E ` + /XD ` + "$env:GITHUB_WORKSPACE\.git" ` + "$env:GITHUB_WORKSPACE\.dart_tool" ` + "$env:GITHUB_WORKSPACE\build" ` + "$env:GITHUB_WORKSPACE\windows\flutter\ephemeral" ` + /NFL /NDL /NJH /NJS /NP + if ($LASTEXITCODE -ge 8) { + throw "Failed to stage the short Windows build workspace." + } + + $architecture = "${{ matrix.arch }}" + $package = Join-Path $env:GITHUB_WORKSPACE ` + "packages/media_kit_libs_windows_video" + $angle = Join-Path $package ` + "windows/native/$architecture/angle" + $resolution = Get-Content -LiteralPath ( + Join-Path $env:RUNNER_TEMP ` + "native-media/native-media-resolution.json" + ) -Raw | ConvertFrom-Json + & (Join-Path $shortWorkspace ` + "tooling/windows/build_verified_native_media_runner.ps1") ` + -Architecture $architecture ` + -AngleBundleRoot $angle ` + -LibmpvArchivePath $resolution.libmpv.archive_path ` + -FlutterRoot "${{ steps.flutter.outputs['cache-path'] }}" ` + -RepoRoot $shortWorkspace ` + -Configuration release + if ($LASTEXITCODE -ne 0) { + throw "Verified $architecture runner build failed." + } + + - name: Package attested ANGLE engineering evidence + id: package + shell: pwsh + run: | + $architecture = "${{ matrix.arch }}" + $package = Join-Path $env:GITHUB_WORKSPACE ` + "packages/media_kit_libs_windows_video" + $angle = Join-Path $package "windows/native/$architecture/angle" + $resolutionPath = Join-Path $env:RUNNER_TEMP ` + "native-media/native-media-resolution.json" + $resolution = Get-Content -LiteralPath $resolutionPath -Raw | + ConvertFrom-Json + $stage = Join-Path $env:RUNNER_TEMP ` + "openbubbles-native-media-$architecture" + New-Item -ItemType Directory -Path $stage -Force | Out-Null + Copy-Item -LiteralPath $angle -Destination ( + Join-Path $stage "angle" + ) -Recurse + Copy-Item -LiteralPath ( + Join-Path $package "provenance/native-dependencies.json" + ) -Destination $stage + Copy-Item -LiteralPath ( + Join-Path $package "THIRD_PARTY_NOTICES.md" + ) -Destination $stage + + $evidence = [ordered]@{ + schema_version = 1 + architecture = $architecture + runner_native_architecture = "${{ steps.runner.outputs.native_architecture }}" + source_commit = "${{ github.sha }}" + angle_manifest_sha256 = $resolution.angle.manifest_sha256 + angle_source_commit = $resolution.angle.source_commit + depot_tools_commit = $resolution.angle.depot_tools_commit + libmpv_archive_sha256 = $resolution.libmpv.archive_sha256 + libmpv_builder_commit = $resolution.libmpv.builder_commit + mpv_commit = $resolution.libmpv.mpv_commit + runtime_load_and_export_smoke = "passed" + libmpv_binary_in_artifact = $false + redistribution_status = $resolution.libmpv.redistribution_status + } + $evidence | ConvertTo-Json -Depth 8 | + Set-Content -LiteralPath ( + Join-Path $stage "native-verification.json" + ) -Encoding utf8NoBOM + + $fileInventory = @( + Get-ChildItem -LiteralPath $stage -File -Recurse | + Sort-Object FullName | + ForEach-Object { + [pscustomobject]@{ + relative_path = $_.FullName.Substring( + $stage.Length + 1 + ).Replace('\', '/') + sha256 = ( + Get-FileHash -LiteralPath $_.FullName -Algorithm SHA256 + ).Hash.ToLowerInvariant() + } + } + ) + $fileInventory | ConvertTo-Json -Depth 5 | + Set-Content -LiteralPath ( + Join-Path $stage "artifact-file-inventory.json" + ) -Encoding utf8NoBOM + + $archive = Join-Path $env:RUNNER_TEMP ` + "openbubbles-official-angle-$architecture.zip" + Compress-Archive -Path (Join-Path $stage "*") -DestinationPath $archive + $archiveHash = ( + Get-FileHash -LiteralPath $archive -Algorithm SHA256 + ).Hash.ToLowerInvariant() + Set-Content -LiteralPath "$archive.sha256" ` + -Value "$archiveHash $([IO.Path]::GetFileName($archive))" ` + -Encoding ascii + "archive=$archive" >> $env:GITHUB_OUTPUT + + - name: Attest official-source ANGLE artifact + uses: actions/attest-build-provenance@e8998f949152b193b063cb0ec769d69d929409be + with: + subject-path: ${{ steps.package.outputs.archive }} + + - name: Upload short-lived engineering artifact + uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # v7.0.1 + with: + name: official-angle-${{ matrix.arch }}-${{ github.sha }} + path: | + ${{ steps.package.outputs.archive }} + ${{ steps.package.outputs.archive }}.sha256 + if-no-files-found: error + retention-days: 7 diff --git a/.github/workflows/windows-build.yml b/.github/workflows/windows-build.yml index 7396509840..dbdd2c78b0 100644 --- a/.github/workflows/windows-build.yml +++ b/.github/workflows/windows-build.yml @@ -1,4 +1,4 @@ -name: Windows builds +name: Windows validation on: workflow_dispatch: @@ -22,26 +22,23 @@ jobs: matrix: include: - arch: x64 - # Flutter 3.24 does not recognize the Visual Studio 2026 image - # currently behind windows-latest. Pin VS 2022 until the app's - # Flutter toolchain is upgraded. + # Keep x64 and ARM64 on one Flutter/Dart release so generated + # bindings and package resolution are architecture-neutral. The + # stable VS 2022 image also avoids runner-image drift during the + # parity rollout. runner: windows-2022 - flutter-version: 3.24.0 - rust-target: x86_64-pc-windows-msvc - build-directory: x64 + flutter-version: 3.44.8 experimental: false - arch: arm64 runner: windows-11-arm # Native Windows ARM64 Dart and engine artifacts are available # starting with Flutter 3.44. flutter-version: 3.44.8 - rust-target: aarch64-pc-windows-msvc - build-directory: arm64 experimental: true steps: - name: Check out source - uses: actions/checkout@v4 + uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1 with: submodules: recursive @@ -55,48 +52,43 @@ jobs: throw "Expected a native ${{ matrix.arch }} runner, but received $osArchitecture." } - # Do not remove this guard merely to make CI green. A native ARM64 - # executable cannot load the x64 DLLs currently selected by these - # packages. Re-audit all three dependencies before enabling the build. - - name: Audit native ARM64 dependency compatibility - if: matrix.arch == 'arm64' - shell: pwsh - run: | - Write-Error @" - Native Windows ARM64 packaging is blocked by the locked native dependencies: - - 1. objectbox_flutter_libs 4.0.3 selects ObjectBox C 4.0.2 using - CMAKE_SYSTEM_PROCESSOR, but that release provides Windows x86 and - x64 archives only. There is no objectbox-windows-ARM64.zip. - 2. printing 5.13.4 hard-codes PDFIUM_ARCH=x64 and downloads an x64 - PDFium archive. - 3. media_kit_libs_windows_video 1.0.10 hard-codes an x86_64 libmpv - archive and an x64 ANGLE bundle. - - This job is experimental and allowed to fail. Keep it blocked until - native ARM64 replacements exist and are runtime-tested. - "@ - exit 1 - - name: Set up Flutter id: flutter - uses: subosito/flutter-action@v2 + uses: subosito/flutter-action@1a449444c387b1966244ae4d4f8c696479add0b2 with: channel: stable flutter-version: ${{ matrix.flutter-version }} - # Flutter's full Windows SDK archive is x64. On the ARM64 runner, - # the next step replaces its Dart SDK and downloads ARM64 engines. + # Flutter publishes only an x64 Windows SDK archive; every entry in + # releases_windows.json reports dart_sdk_arch x64. On the ARM64 runner + # the next step swaps in the ARM64 Dart SDK and ARM64 engines. architecture: x64 cache: true + # Uses $env:FLUTTER_ROOT rather than the action's cache-path output. The + # SDK lives one directory below cache-path, so the previous + # "$cachePath\bin\internal\update_dart_sdk.ps1" never resolved and this + # step failed with command-not-found before doing any work. The script + # itself does ship in 3.44.8. - name: Bootstrap native ARM64 Dart and Flutter engine if: matrix.arch == 'arm64' shell: pwsh run: | - $flutterRoot = "${{ steps.flutter.outputs['cache-path'] }}" + $flutterRoot = "$env:FLUTTER_ROOT" + if (-not (Test-Path "$flutterRoot\bin\internal\update_dart_sdk.ps1")) { + throw "Flutter SDK layout changed: no bin\internal\update_dart_sdk.ps1 under $flutterRoot" + } Remove-Item -Force "$flutterRoot\bin\cache\engine-dart-sdk.stamp" -ErrorAction SilentlyContinue & "$flutterRoot\bin\internal\update_dart_sdk.ps1" + # flutter_tools.snapshot ships compiled for the archive's x64 Dart VM. + # Once the VM above is ARM64 that snapshot is rejected with "Snapshot + # not compatible with the current VM configuration", so every later + # flutter command fails and no ARM64 engine is ever fetched. Dropping + # the snapshot and its stamp makes the next flutter invocation + # recompile the tool against the ARM64 VM. + Remove-Item -Force "$flutterRoot\bin\cache\flutter_tools.snapshot" -ErrorAction SilentlyContinue + Remove-Item -Force "$flutterRoot\bin\cache\flutter_tools.stamp" -ErrorAction SilentlyContinue + $dartVersion = & "$flutterRoot\bin\dart.bat" --version 2>&1 | Out-String Write-Host $dartVersion if ($dartVersion -notmatch "windows_arm64") { @@ -104,59 +96,20 @@ jobs: } & "$flutterRoot\bin\flutter.bat" precache --windows - $engineDirectory = "$flutterRoot\bin\cache\artifacts\engine\windows-arm64-release" - if (-not (Test-Path $engineDirectory)) { - throw "Flutter did not install the native Windows ARM64 release engine." - } - - - name: Set up Rust - uses: dtolnay/rust-toolchain@stable - with: - targets: ${{ matrix.rust-target }} - - - name: Set up Protocol Buffers compiler - shell: pwsh - run: | - # protobuf does not publish a native Windows ARM64 protoc archive. - # The official win64 compiler is build-time tooling and runs under - # Windows 11 ARM's x64 emulation without affecting app architecture. - $version = "29.5" - $expectedHash = "633d3e555fc97f0a1f55b4adb03256cd94b8059e51e7abbae98ff39e58a9dfa5" - $archive = Join-Path $env:RUNNER_TEMP "protoc-$version-win64.zip" - $destination = Join-Path $env:RUNNER_TOOL_CACHE "protoc\$version\x64" - Invoke-WebRequest ` - "https://github.com/protocolbuffers/protobuf/releases/download/v$version/protoc-$version-win64.zip" ` - -OutFile $archive - - $actualHash = (Get-FileHash $archive -Algorithm SHA256).Hash.ToLowerInvariant() - if ($actualHash -ne $expectedHash) { - throw "protoc archive checksum mismatch: expected $expectedHash, got $actualHash" - } - - Expand-Archive -Path $archive -DestinationPath $destination -Force - "$destination\bin" | Out-File -FilePath $env:GITHUB_PATH -Encoding utf8 -Append - & "$destination\bin\protoc.exe" --version - - name: Set up test FairPlay certificates - shell: pwsh - run: | - $destination = "rustpush\certs\fairplay" - New-Item -ItemType Directory -Force -Path $destination | Out-Null - $certificateNames = @( - "4056631661436364584235346952193", - "4056631661436364584235346952194", - "4056631661436364584235346952195", - "4056631661436364584235346952196", - "4056631661436364584235346952197", - "4056631661436364584235346952198", - "4056631661436364584235346952199", - "4056631661436364584235346952200", - "4056631661436364584235346952201", - "4056631661436364584235346952208" - ) - foreach ($name in $certificateNames) { - Copy-Item "rustpush\certs\legacy-fairplay\fairplay.pem" "$destination\$name.pem" - Copy-Item "rustpush\certs\legacy-fairplay\fairplay.crt" "$destination\$name.crt" + # precache fetches only the host debug engine, "windows-arm64". + # The profile and release engines download on demand during the build, + # so asserting windows-arm64-release here always fails. Verified by + # reproducing this exact sequence on an ARM64 host: precache produced + # windows-arm64 alongside the archive's x64 engines and no + # windows-arm64-release. What matters at this point is that Flutter + # resolved ARM64 artifacts at all rather than silently staying on x64. + $engineRoot = "$flutterRoot\bin\cache\artifacts\engine" + if (-not (Test-Path "$engineRoot\windows-arm64")) { + $present = (Get-ChildItem $engineRoot -Directory -ErrorAction SilentlyContinue | + Where-Object { $_.Name -like 'windows*' } | + Select-Object -ExpandProperty Name) -join ', ' + throw "Flutter did not install a native Windows ARM64 engine. Present: $present" } - name: Resolve Flutter dependencies @@ -166,58 +119,52 @@ jobs: flutter doctor -v flutter pub get - - name: Build Windows release + - name: Verify architecture-aware native media integration shell: pwsh - env: - # Keep the large Rust release link inside the standard hosted - # runner's memory budget. - CARGO_BUILD_JOBS: "2" - CARGO_PROFILE_RELEASE_CODEGEN_UNITS: "4" - CARGO_TERM_COLOR: never - CARGOKIT_VERBOSE: "1" - run: | - # OpenSSL's longest generated object path exceeds the legacy - # 260-character compiler limit from GitHub's nested checkout path. - # Build from a real short path and regenerate Flutter's absolute - # plugin links there. A substituted drive breaks Cargokit's link - # integrity checks because the links retain the original drive. - $shortWorkspace = "D:\s" - New-Item -ItemType Directory -Force -Path $shortWorkspace | Out-Null - robocopy "$env:GITHUB_WORKSPACE" $shortWorkspace /E ` - /XD ` - "$env:GITHUB_WORKSPACE\.git" ` - "$env:GITHUB_WORKSPACE\.dart_tool" ` - "$env:GITHUB_WORKSPACE\build" ` - "$env:GITHUB_WORKSPACE\windows\flutter\ephemeral" ` - /NFL /NDL /NJH /NJS /NP - if ($LASTEXITCODE -ge 8) { - throw "Failed to stage the short Windows build workspace." - } - - Set-Location $shortWorkspace - flutter pub get - flutter build windows --release + run: >- + ./tooling/windows/verify_native_media_integration.ps1 + -RequireEphemeralSymlink - - name: Package Windows release + - name: Run focused Windows quality gates + if: matrix.arch == 'x64' shell: pwsh run: | - $bundle = "D:\s\build\windows\${{ matrix.build-directory }}\runner\Release" - if (-not (Test-Path "$bundle\bluebubbles_app.exe")) { - throw "Expected release executable was not produced at $bundle\bluebubbles_app.exe" + flutter test --no-pub ` + test/helpers/memory/bounded_byte_cache_test.dart ` + test/helpers/memory/bounded_lru_map_test.dart ` + test/layouts/fullscreen_media/fullscreen_media_list_test.dart ` + test/services/desktop_notification_actions_test.dart ` + test/services/download_file_utils_test.dart + + # Analyze the application surfaces exercised by this workflow rather + # than vendored Cargokit/example packages with independent pubspecs. + flutter analyze --no-pub --no-fatal-infos --no-fatal-warnings ` + lib/app/layouts/fullscreen_media ` + lib/app/layouts/settings/pages/desktop/desktop_panel.dart ` + lib/services/backend/notifications ` + lib/services/network/download_file_utils.dart ` + lib/services/network/downloads_service.dart + + - name: Enforce public native-binary release gate + shell: pwsh + run: | + $provenance = Get-Content -LiteralPath ( + "packages/media_kit_libs_windows_video/" + + "provenance/native-dependencies.json" + ) -Raw | ConvertFrom-Json + $status = [string] ( + $provenance.libmpv.license_mode_evidence.redistribution_status + ) + if ($status -ne "blocked_pending_transitive_license_inventory") { + throw "Unreviewed native-media redistribution status: $status" } - - New-Item -ItemType Directory -Force -Path dist | Out-Null - $archive = "dist\OpenBubbles-windows-${{ matrix.arch }}.zip" - Compress-Archive -Path "$bundle\*" -DestinationPath $archive -Force - $hash = (Get-FileHash $archive -Algorithm SHA256).Hash.ToLowerInvariant() - "$hash OpenBubbles-windows-${{ matrix.arch }}.zip" | - Set-Content "$archive.sha256" - - - name: Upload Windows artifact - uses: actions/upload-artifact@v4 - with: - name: OpenBubbles-windows-${{ matrix.arch }} - path: | - dist/OpenBubbles-windows-${{ matrix.arch }}.zip - dist/OpenBubbles-windows-${{ matrix.arch }}.zip.sha256 - if-no-files-found: error + if (-not (Test-Path -LiteralPath ( + ".github/workflows/windows-arm64-native-media.yml" + ))) { + throw "The verified native Windows build workflow is missing." + } + Write-Host ( + "Public Windows binary publishing remains blocked. Use the " + + "manual Windows native media provenance workflow for x64 and " + + "ARM64 engineering builds." + ) diff --git a/.gitignore b/.gitignore index 7e848794a5..4348e746af 100644 --- a/.gitignore +++ b/.gitignore @@ -28,6 +28,7 @@ .pub-cache/ .pub/ /build/ +/build-*/ pubspeck.lock # Web related @@ -44,6 +45,8 @@ pubspeck.lock .dart_tool/* !.dart_tool/build .dart_tool/build/entrypoint +.dart_tool/build/asset_graph.json +.dart_tool/build/lock/ .dart_tool/build/*/error_cache/** .dart_tool/build/generated !.dart_tool/build/generated/*/*.info @@ -57,4 +60,7 @@ pubspeck.lock native-lib/target/** /rust/src/api/hw_testing.plist -/rust/src/api/id_testing.plist \ No newline at end of file +/rust/src/api/id_testing.plist +/rust/cloud_sync_protector_harness/target/ +/rust/target-cloudsync-check/ +/ios/Flutter/ephemeral/ diff --git a/.gitmodules b/.gitmodules index 468942beac..2d7e8a0aec 100644 --- a/.gitmodules +++ b/.gitmodules @@ -1,6 +1,6 @@ [submodule "rustpush"] path = rustpush - url = https://github.com/OpenBubbles/rustpush.git + url = https://github.com/Xare123/rustpush.git [submodule "telephony_plus"] path = telephony_plus url = https://github.com/OpenBubbles/telephony_plus.git diff --git a/android/app/build.gradle b/android/app/build.gradle index bec2bfc8ab..7dc90bc2cd 100644 --- a/android/app/build.gradle +++ b/android/app/build.gradle @@ -99,6 +99,13 @@ android { resValue "string", "file_provider", "com.bluebubbles.messaging.beta.fileprovider" applicationId "com.bluebubbles.messaging.beta" } + canary { + dimension "app" + resValue "string", "app_name_en", "OpenBubbles (CK Canary)" + resValue "color", "ic_launcher_background", "#de8b49" + resValue "string", "file_provider", "com.bluebubbles.messaging.cloudkitcanary.fileprovider" + applicationId "com.bluebubbles.messaging.cloudkitcanary" + } prod { getIsDefault().set(true) dimension "app" @@ -120,6 +127,7 @@ android { productFlavors.tanay.signingConfig signingConfigs.debug productFlavors.alpha.signingConfig signingConfigs.debug productFlavors.beta.signingConfig signingConfigs.release + productFlavors.canary.signingConfig signingConfigs.release productFlavors.prod.signingConfig signingConfigs.release productFlavors.alpha.signingConfig signingConfigs.release minifyEnabled false @@ -148,6 +156,8 @@ configurations.all { } dependencies { + testImplementation 'junit:junit:4.13.2' + // Android native functions implementation "androidx.core:core-ktx:1.13.1" implementation "androidx.sharetarget:sharetarget:1.2.0" diff --git a/android/app/src/main/AndroidManifest.xml b/android/app/src/main/AndroidManifest.xml index 3f99ba3dd9..7b12b435d2 100644 --- a/android/app/src/main/AndroidManifest.xml +++ b/android/app/src/main/AndroidManifest.xml @@ -9,13 +9,6 @@ - @@ -58,6 +51,7 @@ + diff --git a/android/app/src/main/kotlin/com/bluebubbles/messaging/MainActivity.kt b/android/app/src/main/kotlin/com/bluebubbles/messaging/MainActivity.kt index 00ff1915d8..ce03d6296e 100644 --- a/android/app/src/main/kotlin/com/bluebubbles/messaging/MainActivity.kt +++ b/android/app/src/main/kotlin/com/bluebubbles/messaging/MainActivity.kt @@ -29,6 +29,8 @@ class MainActivity : FlutterFragmentActivity(), ComponentCallbacks2 { var engine_ready = false } + private var activityEngine: FlutterEngine? = null + override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) { @@ -40,15 +42,22 @@ class MainActivity : FlutterFragmentActivity(), ComponentCallbacks2 { override fun configureFlutterEngine(flutterEngine: FlutterEngine) { engine_ready = false + activityEngine = flutterEngine engine = flutterEngine super.configureFlutterEngine(flutterEngine) MethodChannel(flutterEngine.dartExecutor.binaryMessenger, Constants.methodChannel).setMethodCallHandler { call, result -> if (call.method == "engine-done") { Log.i("BBEngine", "Destroyed"); // this must be here in case another engine has been spawned in the meantime - flutterEngine.destroy() - if (engine == flutterEngine) + if (engine === flutterEngine) { + engine_ready = false engine = null + APNService.onMainEngineUnavailable() + } + if (activityEngine === flutterEngine) { + activityEngine = null + } + flutterEngine.destroy() } MethodCallHandler().methodCallHandler(call, result, this) } @@ -58,7 +67,12 @@ class MainActivity : FlutterFragmentActivity(), ComponentCallbacks2 { override fun onDestroy() { Log.d(Constants.logTag, "BlueBubbles MainActivity is being destroyed") - engine = null + if (engine === activityEngine) { + engine_ready = false + engine = null + APNService.onMainEngineUnavailable() + } + activityEngine = null // If we are finishing "gracefully", the dart code would have started the foreground service. // If we are finishing because the system is destroying the activity, we need to start the foreground service @@ -121,4 +135,4 @@ class MainActivity : FlutterFragmentActivity(), ComponentCallbacks2 { result.success(true) } } -} \ No newline at end of file +} diff --git a/android/app/src/main/kotlin/com/bluebubbles/messaging/services/backend_ui_interop/DartWorker.kt b/android/app/src/main/kotlin/com/bluebubbles/messaging/services/backend_ui_interop/DartWorker.kt index e8130b58e7..009b35d3c1 100644 --- a/android/app/src/main/kotlin/com/bluebubbles/messaging/services/backend_ui_interop/DartWorker.kt +++ b/android/app/src/main/kotlin/com/bluebubbles/messaging/services/backend_ui_interop/DartWorker.kt @@ -17,12 +17,11 @@ import com.google.common.util.concurrent.ListenableFuture import com.google.gson.GsonBuilder import com.google.gson.ToNumberPolicy import com.google.gson.reflect.TypeToken +import io.flutter.FlutterInjector import io.flutter.embedding.engine.FlutterEngine import io.flutter.embedding.engine.dart.DartExecutor -import io.flutter.embedding.engine.loader.ApplicationInfoLoader import io.flutter.plugin.common.MethodChannel import io.flutter.view.FlutterCallbackInformation -import io.flutter.view.FlutterMain import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.coroutineScope @@ -49,12 +48,12 @@ class DartWorker(context: Context, workerParams: WorkerParameters): ListenableWo /// Code idea taken from https://github.com/flutter/flutter/wiki/Experimental:-Reuse-FlutterEngine-across-screens private suspend fun initNewEngine(applicationContext: Context) { Log.d(Constants.logTag, "Ensuring Flutter is initialized before creating engine") - // We use the deprecated class here anyways, the new one doesn't work correctly using the same code - FlutterMain.startInitialization(applicationContext) - FlutterMain.ensureInitializationComplete(applicationContext, null) + val flutterLoader = FlutterInjector.instance().flutterLoader() + flutterLoader.startInitialization(applicationContext) + flutterLoader.ensureInitializationComplete(applicationContext, null) + val appBundlePath = flutterLoader.findAppBundlePath() Log.d(Constants.logTag, "Loading callback info") - val info = ApplicationInfoLoader.load(applicationContext) workerEngine = FlutterEngine(applicationContext) currentJobs.set(0) @@ -81,7 +80,7 @@ class DartWorker(context: Context, workerParams: WorkerParameters): ListenableWo } } val callbackInfo = FlutterCallbackInformation.lookupCallbackInformation(applicationContext.getSharedPreferences("FlutterSharedPreferences", 0).getLong("flutter.backgroundCallbackHandle", -1)) - val callback = DartExecutor.DartCallback(applicationContext.assets, info.flutterAssetsDir, callbackInfo) + val callback = DartExecutor.DartCallback(applicationContext.assets, appBundlePath, callbackInfo) Log.d(Constants.logTag, "Executing Dart callback") workerEngine!!.dartExecutor.executeDartCallback(callback) @@ -207,4 +206,4 @@ class DartWorker(context: Context, workerParams: WorkerParameters): ListenableWo .build() return Futures.immediateFuture(ForegroundInfo(Constants.dartWorkerNotificationId, notification)) } -} \ No newline at end of file +} diff --git a/android/app/src/main/kotlin/com/bluebubbles/messaging/services/backend_ui_interop/MethodCallHandler.kt b/android/app/src/main/kotlin/com/bluebubbles/messaging/services/backend_ui_interop/MethodCallHandler.kt index e759c517fa..22a1e243ba 100644 --- a/android/app/src/main/kotlin/com/bluebubbles/messaging/services/backend_ui_interop/MethodCallHandler.kt +++ b/android/app/src/main/kotlin/com/bluebubbles/messaging/services/backend_ui_interop/MethodCallHandler.kt @@ -24,6 +24,7 @@ import com.bluebubbles.messaging.services.notifications.NotificationChannelHandl import com.bluebubbles.messaging.services.notifications.NotificationListenerPermissionRequestHandler import com.bluebubbles.messaging.services.notifications.StartNotificationListenerHandler import com.bluebubbles.messaging.services.notifications.UnifiedPushHandler +import com.bluebubbles.messaging.services.rustpush.APNService import com.bluebubbles.messaging.services.rustpush.NotifyNativeConfiguredHandler import com.bluebubbles.messaging.services.rustpush.SIMInfoQuery import com.bluebubbles.messaging.services.rustpush.SMSAuthGateway @@ -54,6 +55,7 @@ import com.bluebubbles.messaging.services.system.GetZenMode import com.bluebubbles.messaging.services.system.HeifDecoder import com.bluebubbles.messaging.services.system.HeifEncoder import com.bluebubbles.messaging.services.system.NativeSyncIsolateHandler +import com.bluebubbles.messaging.services.system.NearbyFindMyAccessoryHandler import com.bluebubbles.messaging.services.system.OpenSMSAppHandler import com.bluebubbles.messaging.services.system.RecentContactsRequestHandler import com.bluebubbles.messaging.services.system.ShizukuGrantPermissionHandler @@ -138,12 +140,17 @@ class MethodCallHandler { CircleProximitySessionHandler.tag -> CircleProximitySessionHandler().handleMethodCall(call, result, context) EnableBTHandler.tag -> EnableBTHandler().handleMethodCall(call, result, context) NativeSyncIsolateHandler.tag -> NativeSyncIsolateHandler().handleMethodCall(call, result, context) + NearbyFindMyAccessoryHandler.scanTag, + NearbyFindMyAccessoryHandler.playTag -> NearbyFindMyAccessoryHandler.instance.handleMethodCall(call, result, context) SMSLessAuthGateway.tag -> SMSLessAuthGateway().handleMethodCall(call, result, context) ShizukuGrantPermissionHandler.tag -> ShizukuGrantPermissionHandler().handleMethodCall(call, result, context) ProvisionNative.tag -> ProvisionNative().handleMethodCall(call, result, context) EAPAKAGateway.tag -> EAPAKAGateway().handleMethodCall(call, result, context) KeystoreUnlockHandler.tag -> KeystoreUnlockHandler().handleMethodCall(call, result, context) - "ready" -> { MainActivity.engine_ready = true } + "ready" -> { + MainActivity.engine_ready = true + APNService.onMainEngineReady() + } else -> { val error = "Could not find method call handler for ${call.method}!" Log.d(Constants.logTag, error) diff --git a/android/app/src/main/kotlin/com/bluebubbles/messaging/services/facetime/CachedWebview.kt b/android/app/src/main/kotlin/com/bluebubbles/messaging/services/facetime/CachedWebview.kt index 028ebdc68c..5e964d8ef0 100644 --- a/android/app/src/main/kotlin/com/bluebubbles/messaging/services/facetime/CachedWebview.kt +++ b/android/app/src/main/kotlin/com/bluebubbles/messaging/services/facetime/CachedWebview.kt @@ -8,9 +8,11 @@ import android.os.Handler import android.os.Looper import android.util.Log import android.view.View +import android.webkit.ConsoleMessage import android.webkit.JavascriptInterface import android.webkit.PermissionRequest import android.webkit.WebChromeClient +import android.webkit.WebResourceError import android.webkit.WebResourceRequest import android.webkit.WebResourceResponse import android.webkit.WebView @@ -24,7 +26,60 @@ import java.io.File @SuppressLint("SetJavaScriptEnabled") class CachedWebview(context: Context, name: String?, desc: String, url: String) { + companion object { + private const val diagnosticTag = "FaceTimeDiag" + + /** + * Return a JavaScript string literal for values supplied by the user. + * + * This deliberately follows JSON string escaping, which is also valid + * JavaScript, and additionally escapes the two Unicode line separators + * that are valid JSON but terminate a classic JavaScript string literal. + */ + internal fun javascriptStringLiteral(value: String): String = buildString { + append('"') + var index = 0 + while (index < value.length) { + val character = value[index] + when (character) { + '"' -> append("\\\"") + '\\' -> append("\\\\") + '\b' -> append("\\b") + '\u000C' -> append("\\f") + '\n' -> append("\\n") + '\r' -> append("\\r") + '\t' -> append("\\t") + '\u2028', '\u2029' -> append( + "\\u${character.code.toString(16).padStart(4, '0')}" + ) + in '\u0000'..'\u001F' -> append( + "\\u${character.code.toString(16).padStart(4, '0')}" + ) + in '\uD800'..'\uDBFF' -> { + val lowSurrogate = value.getOrNull(index + 1) + if (lowSurrogate != null && lowSurrogate in '\uDC00'..'\uDFFF') { + append(character) + append(lowSurrogate) + index++ + } else { + append("\\u${character.code.toString(16).padStart(4, '0')}") + } + } + in '\uDC00'..'\uDFFF' -> append( + "\\u${character.code.toString(16).padStart(4, '0')}" + ) + else -> append(character) + } + index++ + } + append('"') + } + } + val webView = WebView(context) + private val applicationContext = context.applicationContext + private val callbackHandler = Handler(Looper.getMainLooper()) + private var mirrorReadyRunnable: Runnable? = null var mirrorReady = false var mirrorReadyCall: (() -> Unit)? = null @@ -36,8 +91,32 @@ class CachedWebview(context: Context, name: String?, desc: String, url: String) val deferredRequests = arrayListOf() var deferredRequestsUpdated: () -> Unit = {} + fun cancelCallbacks() { + mirrorReadyRunnable?.let(callbackHandler::removeCallbacks) + mirrorReadyRunnable = null + mirrorReadyCall = null + deferredRequestsUpdated = {} + } + + private fun safeResourceLabel(requestUrl: String?): String { + if (requestUrl == null) return "unknown" + return try { + val uri = android.net.Uri.parse(requestUrl) + val segment = uri.lastPathSegment.orEmpty() + when { + segment.endsWith(".js", ignoreCase = true) -> "script" + segment.endsWith(".css", ignoreCase = true) -> "style" + else -> "page-or-media" + } + } catch (_: Exception) { + "unparseable" + } + } + + private fun diagnosticsEnabled(): Boolean = FaceTimeDiagnostics.isEnabled(applicationContext) + fun getScriptData(request: WebResourceRequest, client: OkHttpClient, name: String?, desc: String): String { - Log.i("FT", "Getting script") + if (diagnosticsEnabled()) Log.i(diagnosticTag, "getting main.js") // OKHTTP should handle caching for us val okhttp = Request.Builder() .method(request.method, null) @@ -55,17 +134,172 @@ class CachedWebview(context: Context, name: String?, desc: String, url: String) } val body = response.body() ?: throw Exception("Failed to load resource! Empty body!") var string = body.string() + val waitingPattern = """"GenericToast\.Waiting": *"Waiting to be let in…",""".toRegex() + val bannerPattern = """"SessionBanner\.FaceTime": *"FaceTime Call",""".toRegex() + val submitNamePattern = "(submitName: *([a-zA-Z]+?)[ a-zA-Z,}=:]*?;)".toRegex() + val diagnosticsEnabled = diagnosticsEnabled() + val waitingMatches = if (diagnosticsEnabled) waitingPattern.findAll(string).count() else 0 + val bannerMatches = if (diagnosticsEnabled) bannerPattern.findAll(string).count() else 0 + val leaveMatches = if (diagnosticsEnabled) "this.onLeave.notifyListeners()".toRegex().findAll(string).count() else 0 + val submitNameMatches = if (diagnosticsEnabled && name != null) submitNamePattern.findAll(string).count() else 0 + + string = string .replace(""""GenericToast\.Waiting": *"Waiting to be let in…",""".toRegex(), """"GenericToast.Waiting":"Connecting…",""") .replace(""""SessionBanner\.FaceTime": *"FaceTime Call",""".toRegex(), """"SessionBanner.FaceTime":"$desc",""") .replace("this.onLeave.notifyListeners()", "Native.leave(), this.onLeave.notifyListeners()") if (name != null) { - string = string.replace("(submitName: *([a-zA-Z]+?)[ a-zA-Z,}=:]*?;)".toRegex(), "$1 $2(\"$name\").then(() => Native.mirrored());") + val javascriptName = javascriptStringLiteral(name) + string = string.replace(submitNamePattern) { match -> + "${match.groupValues[1]} ${match.groupValues[2]}($javascriptName).then(() => Native.mirrored());" + } + } + + val patchCount = waitingMatches + bannerMatches + leaveMatches + submitNameMatches + if (diagnosticsEnabled) { + FaceTimeDiagnostics.logStage( + applicationContext, + FaceTimeDiagnosticStage.JS_PATCHED, + state = if (patchCount > 0) "true" else "false", + count = patchCount, + ) } - return string + return webRtcDiagnosticBootstrap + string } + private val webRtcDiagnosticBootstrap = """ + (() => { + if (window.__obFaceTimeDiagnostics) return; + const state = { + peers: [], + nextPeerId: 1, + }; + const updateIceState = (peerState) => { + peerState.iceState = peerState.peer.iceConnectionState || peerState.peer.connectionState || "unknown"; + }; + const watchPeer = (pc) => { + const peerState = { + id: state.nextPeerId++, + peer: pc, + iceState: "unknown", + previousInboundBytes: null, + remoteAudioTracks: new Map(), + remoteVideoTracks: new Map() + }; + state.peers.push(peerState); + updateIceState(peerState); + pc.addEventListener("iceconnectionstatechange", () => updateIceState(peerState)); + pc.addEventListener("connectionstatechange", () => updateIceState(peerState)); + pc.addEventListener("track", (event) => { + if (!event.track || !event.track.id) return; + const tracks = event.track.kind === "audio" + ? peerState.remoteAudioTracks + : event.track.kind === "video" ? peerState.remoteVideoTracks : null; + if (!tracks) return; + const track = event.track; + tracks.set(track.id, track); + track.addEventListener("ended", () => { + if (tracks.get(track.id) === track) tracks.delete(track.id); + }); + }); + }; + const install = () => { + const original = window.RTCPeerConnection; + if (!original || window.__obFaceTimeRtcWrapped) return !!original; + window.__obFaceTimeRtcWrapped = true; + window.RTCPeerConnection = new Proxy(original, { + construct(target, args, newTarget) { + const peer = Reflect.construct(target, args, newTarget); + watchPeer(peer); + return peer; + } + }); + return true; + }; + const controlText = (button) => + (button.innerText || button.textContent || button.getAttribute("aria-label") || "") + .trim() + .replace(/\s+/g, " ") + .toLowerCase(); + const isVisible = (button) => + button.hidden !== true && + button.getAttribute("aria-hidden") !== "true" && + button.offsetParent !== null; + const controlState = (names) => { + const matches = Array.from(document.querySelectorAll("button")) + .filter((button) => names.includes(controlText(button))); + const visible = matches.some((button) => isVisible(button)); + const enabled = matches.some((button) => + isVisible(button) && + button.disabled !== true && + button.getAttribute("aria-disabled") !== "true" + ); + return { visible, enabled, count: matches.length }; + }; + install(); + if (!window.__obFaceTimeRtcInstallTimer) { + window.__obFaceTimeRtcInstallTimer = window.setInterval(() => { + if (install()) window.clearInterval(window.__obFaceTimeRtcInstallTimer); + }, 100); + } + window.__obFaceTimeDiagnostics = { + snapshot: async () => { + const candidates = []; + for (const peerState of state.peers) { + updateIceState(peerState); + if (peerState.iceState === "closed") continue; + let bytes = 0; + let bytesObserved = false; + const peer = peerState.peer; + try { + const reports = await peer.getStats(); + reports.forEach((report) => { + if (report.type === "inbound-rtp" && typeof report.bytesReceived === "number") { + bytes += report.bytesReceived; + bytesObserved = true; + } + }); + } catch (_) {} + const remoteAudioTracks = Array.from(peerState.remoteAudioTracks.values()) + .filter((track) => track.readyState !== "ended").length; + const remoteVideoTracks = Array.from(peerState.remoteVideoTracks.values()) + .filter((track) => track.readyState !== "ended").length; + const bytesAdvancing = bytesObserved && + peerState.previousInboundBytes !== null && + bytes > peerState.previousInboundBytes; + peerState.previousInboundBytes = bytesObserved ? bytes : null; + candidates.push({ + peerId: peerState.id, + iceState: peerState.iceState, + remoteAudioTracks, + remoteVideoTracks, + mediaBytes: bytesObserved ? bytes : null, + bytesAdvancing, + }); + } + const active = [...candidates].reverse().find((candidate) => candidate.bytesAdvancing) + || candidates.at(-1) + || null; + const controls = { + join: controlState(["join"]), + rejoin: controlState(["rejoin"]), + leave: controlState(["leave", "end call"]), + }; + return JSON.stringify({ + peerId: active ? active.peerId : null, + iceState: active ? active.iceState : "unknown", + remoteAudioTracks: active ? active.remoteAudioTracks : 0, + remoteVideoTracks: active ? active.remoteVideoTracks : 0, + mediaBytes: active ? active.mediaBytes : null, + webLeaveVisible: controls.leave.visible, + webControls: controls + }); + } + }; + })(); + """.trimIndent() + init { val client = OkHttpClient.Builder() .cache( @@ -82,10 +316,25 @@ class CachedWebview(context: Context, name: String?, desc: String, url: String) request: WebResourceRequest? ): WebResourceResponse? { if (request == null) return null - if (!request.url.toString().endsWith("main.js")) return null + if (!request.url.toString().endsWith("main.js")) { + if (diagnosticsEnabled() && request.url.lastPathSegment == "main.js") { + Log.w(diagnosticTag, "main.js candidate was not intercepted because its URL has a suffix") + } + return null + } // intercept and patch request - val scriptData = getScriptData(request, client, name, desc) + if (diagnosticsEnabled()) { + Log.i(diagnosticTag, "intercepting ${safeResourceLabel(request.url.toString())}") + } + val scriptData = try { + getScriptData(request, client, name, desc) + } catch (error: Exception) { + if (diagnosticsEnabled()) { + Log.e(diagnosticTag, "main.js interception failed: ${error.javaClass.simpleName}") + } + throw error + } return WebResourceResponse( "application/javascript", @@ -93,34 +342,106 @@ class CachedWebview(context: Context, name: String?, desc: String, url: String) ByteArrayInputStream(scriptData.encodeToByteArray()) ) } + + override fun onPageStarted(view: WebView?, url: String?, favicon: Bitmap?) { + if (diagnosticsEnabled()) { + Log.i(diagnosticTag, "page started ${safeResourceLabel(url)}") + } + } + + override fun onPageFinished(view: WebView?, url: String?) { + if (diagnosticsEnabled()) { + FaceTimeDiagnostics.logStage( + applicationContext, + FaceTimeDiagnosticStage.WEBVIEW_LOADED, + state = "true", + ) + } + } + + override fun onReceivedError( + view: WebView?, + request: WebResourceRequest?, + error: WebResourceError? + ) { + if (diagnosticsEnabled()) { + Log.w( + diagnosticTag, + "resource error mainFrame=${request?.isForMainFrame} code=${error?.errorCode} resource=${safeResourceLabel(request?.url?.toString())}" + ) + } + } + + override fun onReceivedHttpError( + view: WebView?, + request: WebResourceRequest?, + errorResponse: WebResourceResponse? + ) { + if (diagnosticsEnabled()) { + Log.w( + diagnosticTag, + "http error mainFrame=${request?.isForMainFrame} status=${errorResponse?.statusCode} resource=${safeResourceLabel(request?.url?.toString())}" + ) + } + } } webView.setBackgroundColor(Color.BLACK) webView.addJavascriptInterface(object { @JavascriptInterface fun leave() { - endTask() + callbackHandler.post { endTask() } } @JavascriptInterface fun mirrored() { + if (mirrorReady || mirrorReadyRunnable != null) { + if (diagnosticsEnabled()) { + Log.i(diagnosticTag, "duplicate Native.mirrored ignored") + } + return + } // takes a second for the mirror to be ready - Handler(Looper.getMainLooper()).postDelayed({ + val runnable = Runnable { + mirrorReadyRunnable = null mirrorReady = true mirrorReadyCall?.let { it() } - }, 250) - Log.i("Got Mirror", "") + } + mirrorReadyRunnable = runnable + callbackHandler.postDelayed(runnable, 250) + if (diagnosticsEnabled()) { + Log.i(diagnosticTag, "Native.mirrored received; mirrorReady scheduled") + } } }, "Native") webView.webChromeClient = object : WebChromeClient() { override fun onPermissionRequest(request: PermissionRequest?) { if (request == null) return + if (diagnosticsEnabled()) { + FaceTimeDiagnostics.logStage( + applicationContext, + FaceTimeDiagnosticStage.PERMISSIONS_REQUESTED, + count = request.resources.size, + ) + } deferredRequests.add(request) deferredRequestsUpdated() } + override fun onConsoleMessage(consoleMessage: ConsoleMessage?): Boolean { + if (!diagnosticsEnabled() || consoleMessage == null) return false + if (consoleMessage.messageLevel() == ConsoleMessage.MessageLevel.ERROR || + consoleMessage.messageLevel() == ConsoleMessage.MessageLevel.WARNING) { + Log.w( + diagnosticTag, + "console ${consoleMessage.messageLevel()} line=${consoleMessage.lineNumber()} source=${safeResourceLabel(consoleMessage.sourceId())} message=" + ) + } + return false + } + override fun getDefaultVideoPoster(): Bitmap { return Bitmap.createBitmap(1, 1, Bitmap.Config.RGB_565) } @@ -129,4 +450,4 @@ class CachedWebview(context: Context, name: String?, desc: String, url: String) webView.loadUrl(url) } -} \ No newline at end of file +} diff --git a/android/app/src/main/kotlin/com/bluebubbles/messaging/services/facetime/FaceTimeActivity.kt b/android/app/src/main/kotlin/com/bluebubbles/messaging/services/facetime/FaceTimeActivity.kt index ad4ea24429..aacc49f73f 100644 --- a/android/app/src/main/kotlin/com/bluebubbles/messaging/services/facetime/FaceTimeActivity.kt +++ b/android/app/src/main/kotlin/com/bluebubbles/messaging/services/facetime/FaceTimeActivity.kt @@ -22,6 +22,7 @@ import android.util.Log import android.util.Rational import android.view.View import android.view.ViewGroup.MarginLayoutParams +import android.view.Gravity import android.view.WindowInsets import android.view.WindowManager import android.webkit.PermissionRequest @@ -43,6 +44,12 @@ import com.google.android.material.math.MathUtils import kotlin.math.roundToInt class FaceTimeActivity : Activity() { + companion object { + private const val diagnosticTag = "FaceTimeDiag" + var activeFaceTimeActivity: FaceTimeActivity? = null + var cachedWebview: CachedWebview? = null + } + private lateinit var binding: ActivityFaceTimeBinding private var permissionRequests = ArrayList() @@ -59,14 +66,210 @@ class FaceTimeActivity : Activity() { private lateinit var webView: WebView private var initialMediaVolume: Int? = null; + private val mainHandler = Handler(Looper.getMainLooper()) + private val joinPolicy = FaceTimeJoinPolicy() + private val callLifecycle = FaceTimeCallLifecycle() + private var joinRetryRunnable: Runnable? = null + private var manualRecoveryRunnable: Runnable? = null + private var connectionProbeRunnable: Runnable? = null + private var endFallbackRunnable: Runnable? = null + private var connectionProbeCount = 0 + private var callEnding = false + + private fun diagnosticsEnabled(): Boolean = FaceTimeDiagnostics.isEnabled(this) + + private val joinButtonScript = """ + (() => { + const visible = (element) => !!element && element.offsetParent !== null; + const label = (element) => (element?.innerText || element?.textContent || element?.getAttribute?.("aria-label") || "").trim(); + const buttons = Array.from(document.querySelectorAll("button")); + const leave = document.getElementById("callcontrols-leave-button-session-banner") || + buttons.find((button) => /^(leave|end call)$/i.test(label(button))); + if (visible(leave)) return "already-joined"; + const join = document.getElementById("callcontrols-join-button-session-banner") || + buttons.find((button) => /^(join|rejoin)$/i.test(label(button))); + if (!join) return "missing"; + if (join.disabled || join.getAttribute("aria-disabled") === "true") return "disabled"; + if (!visible(join)) return "hidden"; + join.click(); + return "clicked"; + })() + """.trimIndent() + + private fun logJoinButtonState(reason: String) { + if (!diagnosticsEnabled()) return + webView.evaluateJavascript( + """(() => { const button = document.getElementById("callcontrols-join-button-session-banner"); return button ? "present:" + (!button.disabled) + ":" + (button.offsetParent !== null) : "missing"; })()""" + ) { result -> + if (diagnosticsEnabled()) { + Log.i(diagnosticTag, "join button state reason=$reason result=$result mirrorReady=$mirrorReady answered=$answered") + } + } + } - companion object { - var activeFaceTimeActivity: FaceTimeActivity? = null - var cachedWebview: CachedWebview? = null + private fun positionNativeEndControl(webLeaveVisible: Boolean) { + val layoutParams = binding.nativeCallControls.layoutParams as? android.widget.FrameLayout.LayoutParams + ?: return + val density = resources.displayMetrics.density + val topMargin = (48 * density).roundToInt() + val bottomMargin = (96 * density).roundToInt() + when (FaceTimeControlPolicy.nativeEndPlacement(webLeaveVisible)) { + FaceTimeNativeEndPlacement.TOP_RIGHT -> { + layoutParams.gravity = Gravity.TOP or Gravity.END + layoutParams.topMargin = topMargin + layoutParams.bottomMargin = 0 + } + FaceTimeNativeEndPlacement.BOTTOM_LEFT -> { + layoutParams.gravity = Gravity.BOTTOM or Gravity.START + layoutParams.topMargin = 0 + layoutParams.bottomMargin = bottomMargin + } + } + if (webLeaveVisible) { + layoutParams.marginStart = (20 * density).roundToInt() + layoutParams.marginEnd = 0 + } else { + layoutParams.marginStart = 0 + layoutParams.marginEnd = (20 * density).roundToInt() + } + binding.nativeCallControls.layoutParams = layoutParams + binding.nativeCallControls.elevation = (12 * density) + } + + private fun showCallUi(joined: Boolean, webLeaveVisible: Boolean = false) { + binding.mainFrame.visibility = View.VISIBLE + binding.splashLayout.visibility = View.GONE + positionNativeEndControl(webLeaveVisible) + binding.nativeCallControls.visibility = if (FaceTimeControlPolicy.shouldShowNativeEndControl()) { + View.VISIBLE + } else { + View.GONE + } + binding.connectionStatus.visibility = if (joined) View.GONE else View.VISIBLE + if (!joined) { + binding.connectionStatus.text = if (joinPolicy.completedJoin) { + "FaceTime media unavailable" + } else { + "Finishing FaceTime connection..." + } + } + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.S) { + window.setBackgroundBlurRadius(0) + } + } + + private fun scheduleConnectionProbe(delayMillis: Long = 0) { + if (callEnding || isFinishing || isDestroyed || connectionProbeCount >= FaceTimeConnectionProbePolicy.maxProbes) return + connectionProbeRunnable?.let(mainHandler::removeCallbacks) + val runnable = Runnable { + if (callEnding || isFinishing || isDestroyed) return@Runnable + webView.evaluateJavascript( + """window.__obFaceTimeDiagnostics ? window.__obFaceTimeDiagnostics.snapshot() : JSON.stringify({peerId:null,iceState:"unknown",remoteAudioTracks:0,remoteVideoTracks:0,mediaBytes:null,webLeaveVisible:false})""" + ) { result -> + connectionProbeCount += 1 + val evidence = parseMediaEvidence(result) + if (evidence == null) { + FaceTimeDiagnostics.logStage(this, FaceTimeDiagnosticStage.ICE_STATE, state = "unknown") + scheduleConnectionProbe(FaceTimeConnectionProbePolicy.pendingDelayMillis) + return@evaluateJavascript + } + FaceTimeDiagnostics.logStage(this, FaceTimeDiagnosticStage.ICE_STATE, state = evidence.iceState.name.lowercase()) + FaceTimeDiagnostics.logStage(this, FaceTimeDiagnosticStage.REMOTE_AUDIO_TRACK, count = evidence.remoteAudioTracks) + FaceTimeDiagnostics.logStage(this, FaceTimeDiagnosticStage.REMOTE_VIDEO_TRACK, count = evidence.remoteVideoTracks) + evidence.mediaBytes?.let { FaceTimeDiagnostics.logStage(this, FaceTimeDiagnosticStage.MEDIA_BYTES, bytes = it) } + val decision = joinPolicy.recordMediaEvidence(evidence) + if (decision.joined) { + joinRetryRunnable?.let(mainHandler::removeCallbacks) + FaceTimeDiagnostics.logStage(this, FaceTimeDiagnosticStage.ADMITTED, state = "true") + } else if (joinPolicy.completedJoin) { + joinRetryRunnable?.let(mainHandler::removeCallbacks) + FaceTimeDiagnostics.logStage( + this, + FaceTimeDiagnosticStage.MEDIA_LOST, + state = decision.outcome.name.lowercase(), + ) + } + showCallUi(joined = decision.joined, webLeaveVisible = evidence.webLeaveVisible) + scheduleConnectionProbe( + if (decision.joined) { + FaceTimeConnectionProbePolicy.connectedDelayMillis + } else { + FaceTimeConnectionProbePolicy.pendingDelayMillis + } + ) + } + } + connectionProbeRunnable = runnable + mainHandler.postDelayed(runnable, delayMillis) + } + + private fun scheduleJoinAttempt(reason: String, delayMillis: Long = 0) { + if (!answered || callEnding || joinPolicy.joined || joinPolicy.completedJoin || isFinishing || isDestroyed) return + joinRetryRunnable?.let(mainHandler::removeCallbacks) + val runnable = Runnable { attemptJoin(reason) } + joinRetryRunnable = runnable + mainHandler.postDelayed(runnable, delayMillis) + } + + private fun attemptJoin(reason: String) { + if (!answered || callEnding || joinPolicy.joined || joinPolicy.completedJoin || isFinishing || isDestroyed) return + webView.evaluateJavascript(joinButtonScript) { result -> + if (callEnding || isFinishing || isDestroyed) return@evaluateJavascript + val decision = joinPolicy.record(result) + if (diagnosticsEnabled()) { + FaceTimeDiagnostics.logStage( + this, + FaceTimeDiagnosticStage.ADMISSION_REQUESTED, + state = decision.outcome.name.lowercase(), + count = joinPolicy.attempts, + ) + } + if (decision.revealManualRecovery) { + showCallUi( + joined = false, + webLeaveVisible = decision.outcome == FaceTimeJoinOutcome.ALREADY_JOINED, + ) + } + scheduleConnectionProbe(FaceTimeConnectionProbePolicy.initialDelayMillis) + if (decision.retry) { + scheduleJoinAttempt("retry-${decision.outcome}", 750) + } else { + showCallUi(joined = false) + binding.connectionStatus.text = "Tap Join or Rejoin to connect" + if (diagnosticsEnabled()) { + Log.w(diagnosticTag, "automatic join attempts exhausted") + } + } + } } fun endCall() { - webView.loadUrl("javascript:document.getElementById(\"callcontrols-leave-button-session-banner\").click()") + if (callEnding) return + callEnding = true + FaceTimeDiagnostics.logStage(this, FaceTimeDiagnosticStage.LEAVE, state = "requested") + joinRetryRunnable?.let(mainHandler::removeCallbacks) + binding.connectionStatus.text = "Ending FaceTime..." + binding.connectionStatus.visibility = View.VISIBLE + binding.endCall.isEnabled = false + val fallback = Runnable { + if (!isFinishing && !isDestroyed) { + if (diagnosticsEnabled()) { + Log.w(diagnosticTag, "native end call fallback finishing activity") + } + finishAndRemoveTask() + } + } + endFallbackRunnable = fallback + mainHandler.postDelayed(fallback, 1500) + webView.evaluateJavascript( + """(() => { const buttons = Array.from(document.querySelectorAll("button")); const label = (element) => (element?.innerText || element?.textContent || element?.getAttribute?.("aria-label") || "").trim(); const button = document.getElementById("callcontrols-leave-button-session-banner") || buttons.find((item) => /^(leave|end call)$/i.test(label(item))); if (!button) return "missing"; button.click(); return "clicked"; })()""" + ) { result -> + if (diagnosticsEnabled()) { + Log.i(diagnosticTag, "native end call result=$result") + } + mainHandler.removeCallbacks(fallback) + mainHandler.postDelayed(fallback, 500) + } } private fun hideControlsForPIP() { @@ -163,8 +366,15 @@ class FaceTimeActivity : Activity() { } private fun answerCall() { + if (answered) return answered = true + FaceTimeDiagnostics.logStage(this, FaceTimeDiagnosticStage.ADMISSION_REQUESTED, state = "answer") + + if (diagnosticsEnabled()) { + Log.i(diagnosticTag, "answer requested mirrorReady=$mirrorReady deferredPermissions=${cached.deferredRequests.size}") + } + handlePermissionRequests() if (notificationId != 0) { @@ -172,12 +382,8 @@ class FaceTimeActivity : Activity() { } if (mirrorReady) { - binding.mainFrame.visibility = View.VISIBLE - binding.splashLayout.visibility = View.GONE - if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.S) { - window.setBackgroundBlurRadius(0) - } - webView.loadUrl("javascript:document.getElementById(\"callcontrols-join-button-session-banner\").click()") + logJoinButtonState("answer-ready") + scheduleJoinAttempt("answer-ready") } else { connecting() } @@ -185,7 +391,38 @@ class FaceTimeActivity : Activity() { override fun onNewIntent(intent: Intent?) { super.onNewIntent(intent) + if (intent == null) return + setIntent(intent) + when (val disposition = callLifecycle.acceptIntent(intent.getStringExtra("callUuid"))) { + FaceTimeIntentDisposition.DUPLICATE -> { + FaceTimeDiagnostics.logStage(this, FaceTimeDiagnosticStage.LIFECYCLE, state = "duplicate_intent") + if (intent.getBooleanExtra("answer", false)) answerCall() + } + FaceTimeIntentDisposition.REJECTED_MISMATCHED_CALL, + FaceTimeIntentDisposition.REJECTED_MISSING_CALL_ID -> { + FaceTimeDiagnostics.logStage(this, FaceTimeDiagnosticStage.LIFECYCLE, state = "ignored_intent") + } + FaceTimeIntentDisposition.ACCEPTED -> { + FaceTimeDiagnostics.logStage(this, FaceTimeDiagnosticStage.LIFECYCLE, state = disposition.name.lowercase()) + } + } + } + private fun startOutgoingCall() { + if (answered) return + // The shared admission loop is also required for outgoing FaceTime + // links. Previously only answered incoming calls could click Join or + // Rejoin, leaving an outgoing page probing forever if Apple did not + // auto-admit it. + answered = true + FaceTimeDiagnostics.logStage(this, FaceTimeDiagnosticStage.ADMISSION_REQUESTED, state = "outgoing") + handlePermissionRequests() + if (mirrorReady) { + logJoinButtonState("outgoing-ready") + scheduleJoinAttempt("outgoing-ready") + } else { + connecting() + } } override fun onCreate(savedInstanceState: Bundle?) { @@ -222,6 +459,10 @@ class FaceTimeActivity : Activity() { decline() } + binding.endCall.setOnClickListener { + endCall() + } + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.S) { @@ -281,8 +522,15 @@ class FaceTimeActivity : Activity() { fun handlePermissionRequest(request: PermissionRequest) { val permissions = request.resources.flatMap { i -> permissionMap[i] ?: listOf() } - if (permissions.all { checkSelfPermission(it) == PackageManager.PERMISSION_GRANTED }) { + if (diagnosticsEnabled()) { + Log.i( + diagnosticTag, + "handling WebView permission resources=${request.resources.sorted().joinToString()} androidPermissions=${permissions.joinToString()} alreadyGranted=${permissions.all { checkSelfPermission(it) == PackageManager.PERMISSION_GRANTED }}" + ) + } + if (permissions.isNotEmpty() && permissions.all { checkSelfPermission(it) == PackageManager.PERMISSION_GRANTED }) { request.grant(request.resources) + FaceTimeDiagnostics.logStage(this, FaceTimeDiagnosticStage.PERMISSIONS_RESULT, state = "granted") startService() return } @@ -291,27 +539,40 @@ class FaceTimeActivity : Activity() { } override fun onDestroy() { - webView.destroy() - activeFaceTimeActivity = null - - val intent = Intent(this, FaceTimeInCallService::class.java) - stopService(intent) - serviceStarted = false - - // restore default media volume - initialMediaVolume?.let { - try { - val audioManager = getSystemService(AUDIO_SERVICE) as AudioManager - audioManager.setStreamVolume( - AudioManager.STREAM_MUSIC, - it, - 0 - ) - } catch (e: SecurityException) { - Log.w("FaceTime", "Unable to set stream volume!") + joinRetryRunnable?.let(mainHandler::removeCallbacks) + manualRecoveryRunnable?.let(mainHandler::removeCallbacks) + connectionProbeRunnable?.let(mainHandler::removeCallbacks) + endFallbackRunnable?.let(mainHandler::removeCallbacks) + if (::cached.isInitialized) { + cached.cancelCallbacks() + } + + val isCurrentActivity = activeFaceTimeActivity === this + if (isCurrentActivity) { + activeFaceTimeActivity = null + val intent = Intent(this, FaceTimeInCallService::class.java) + stopService(intent) + serviceStarted = false + + // An older FaceTime activity must not mute or reroute a newer call. + initialMediaVolume?.let { + try { + val audioManager = getSystemService(AUDIO_SERVICE) as AudioManager + audioManager.setStreamVolume( + AudioManager.STREAM_MUSIC, + it, + 0 + ) + } catch (e: SecurityException) { + Log.w("FaceTime", "Unable to set stream volume!") + } } } + if (::webView.isInitialized) webView.destroy() + + callLifecycle.reset() + contentObserver?.let { applicationContext.contentResolver.unregisterContentObserver(it) } @@ -325,28 +586,54 @@ class FaceTimeActivity : Activity() { grantResults: IntArray ) { if (requestCode != 1) return + if (diagnosticsEnabled()) { + Log.i( + diagnosticTag, + "Android permission result ${permissions.zip(grantResults.toTypedArray()).joinToString { (permission, result) -> "$permission=${result == PackageManager.PERMISSION_GRANTED}" }}" + ) + } for (request in permissionRequests) { request.grant(request.resources.filter { i -> - (permissionMap[i] ?: listOf()).all { + permissionMap[i]?.takeIf { it.isNotEmpty() }?.all { val permissionIdx = permissions.indexOf(it) - grantResults[permissionIdx] == PackageManager.PERMISSION_GRANTED - } + FaceTimePermissionPolicy.isGranted(grantResults, permissionIdx) + } == true }.toTypedArray()) } permissionRequests = arrayListOf() - startService() + FaceTimeDiagnostics.logStage( + this, + FaceTimeDiagnosticStage.PERMISSIONS_RESULT, + state = if (FaceTimePermissionPolicy.shouldStartInCallService(permissions.size, grantResults)) { + "granted" + } else { + "denied" + }, + ) + if (FaceTimePermissionPolicy.shouldStartInCallService(permissions.size, grantResults)) { + startService() + } else if (diagnosticsEnabled()) { + Log.w(diagnosticTag, "not starting in-call service because camera/microphone permission was denied or incomplete") + } } private fun connecting() { + if (diagnosticsEnabled()) { + Log.i(diagnosticTag, "waiting for mirrorReady") + } binding.acceptButtons.visibility = View.GONE binding.loadingBanner.text = "Connecting..." - Handler(Looper.getMainLooper()).postDelayed({ - binding.mainFrame.visibility = View.VISIBLE - binding.splashLayout.visibility = View.GONE - if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.S) { - window.setBackgroundBlurRadius(0) + scheduleJoinAttempt("connecting") + val recoveryRunnable = Runnable { + if (callEnding || isFinishing || isDestroyed || joinPolicy.joined) return@Runnable + if (diagnosticsEnabled()) { + Log.w(diagnosticTag, "mirrorReady timeout reached mirrorReady=$mirrorReady answered=$answered") } - }, 15000) + logJoinButtonState("mirror-timeout") + showCallUi(joined = false) + } + manualRecoveryRunnable = recoveryRunnable + mainHandler.postDelayed(recoveryRunnable, 15000) } private fun handleConfig(extras: Bundle) { @@ -368,13 +655,12 @@ class FaceTimeActivity : Activity() { mirrorReady = cached.mirrorReady cached.mirrorReadyCall = { mirrorReady = true + if (diagnosticsEnabled()) { + Log.i(diagnosticTag, "mirrorReady callback answered=$answered") + } if (answered) { - binding.mainFrame.visibility = View.VISIBLE - binding.splashLayout.visibility = View.GONE - if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.S) { - window.setBackgroundBlurRadius(0) - } - webView.loadUrl("javascript:document.getElementById(\"callcontrols-join-button-session-banner\").click()") + logJoinButtonState("mirror-ready") + scheduleJoinAttempt("mirror-ready") } } @@ -383,13 +669,18 @@ class FaceTimeActivity : Activity() { val isAnsweringCall = extras.containsKey("answer") notificationId = extras.getString("notificationId")?.toInt() ?: 0 callUuid = extras.getString("callUuid") + if (callLifecycle.acceptIntent(callUuid) == FaceTimeIntentDisposition.REJECTED_MISSING_CALL_ID) { + FaceTimeDiagnostics.logStage(this, FaceTimeDiagnosticStage.LIFECYCLE, state = "missing_call_id") + } if (CreateIncomingFaceTimeNotification.avatarCache.containsKey(callUuid)) { val bitmap = CreateIncomingFaceTimeNotification.avatarCache.remove(callUuid)!! binding.avatarView.setImageBitmap(bitmap) } - Log.i("FaceTime", "started activity for call $callUuid") + if (diagnosticsEnabled()) { + Log.i(diagnosticTag, "started activity hasCallUuid=${callUuid != null} answering=$isAnsweringCall") + } val poster = extras.getString("poster") if (poster != null) { @@ -413,10 +704,16 @@ class FaceTimeActivity : Activity() { } else { binding.splashLayout.visibility = View.GONE binding.mainFrame.visibility = View.VISIBLE + positionNativeEndControl(webLeaveVisible = false) + binding.nativeCallControls.visibility = View.VISIBLE if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.S) { window.setBackgroundBlurRadius(0) } - handlePermissionRequests() + startOutgoingCall() + scheduleConnectionProbe(1000) } } -} \ No newline at end of file + + private fun parseMediaEvidence(rawResult: String?): FaceTimeMediaEvidence? = + FaceTimeMediaEvidenceParser.parse(rawResult) +} diff --git a/android/app/src/main/kotlin/com/bluebubbles/messaging/services/facetime/FaceTimeCallStateHandler.kt b/android/app/src/main/kotlin/com/bluebubbles/messaging/services/facetime/FaceTimeCallStateHandler.kt index 61cc59f7ce..2b57a65723 100644 --- a/android/app/src/main/kotlin/com/bluebubbles/messaging/services/facetime/FaceTimeCallStateHandler.kt +++ b/android/app/src/main/kotlin/com/bluebubbles/messaging/services/facetime/FaceTimeCallStateHandler.kt @@ -36,6 +36,7 @@ class FaceTimeCallStateHandler: MethodCallHandlerImpl() { } // cancel any unused webview FaceTimeActivity.cachedWebview?.let { + it.cancelCallbacks() it.webView.destroy() FaceTimeActivity.cachedWebview = null } @@ -44,4 +45,4 @@ class FaceTimeCallStateHandler: MethodCallHandlerImpl() { result.success(null) } -} \ No newline at end of file +} diff --git a/android/app/src/main/kotlin/com/bluebubbles/messaging/services/facetime/FaceTimeDiagnostics.kt b/android/app/src/main/kotlin/com/bluebubbles/messaging/services/facetime/FaceTimeDiagnostics.kt new file mode 100644 index 0000000000..d7da44c97f --- /dev/null +++ b/android/app/src/main/kotlin/com/bluebubbles/messaging/services/facetime/FaceTimeDiagnostics.kt @@ -0,0 +1,76 @@ +package com.bluebubbles.messaging.services.facetime + +import android.content.Context +import android.util.Log + +internal enum class FaceTimeDiagnosticStage(val wireName: String) { + WEBVIEW_LOADED("webview_loaded"), + JS_PATCHED("js_patched"), + PERMISSIONS_REQUESTED("permissions_requested"), + PERMISSIONS_RESULT("permissions_result"), + ADMISSION_REQUESTED("admission_requested"), + ADMITTED("admitted"), + ICE_STATE("ice_state"), + REMOTE_AUDIO_TRACK("remote_audio_track"), + REMOTE_VIDEO_TRACK("remote_video_track"), + MEDIA_BYTES("media_bytes"), + MEDIA_LOST("media_lost"), + LEAVE("leave"), + LIFECYCLE("lifecycle"), +} + +internal object FaceTimeDiagnostics { + private const val diagnosticTag = "FaceTimeDiag" + private const val preferencesName = "FlutterSharedPreferences" + private const val developerModeKey = "flutter.developerEnabled" + private const val diagnosticsKey = "flutter.faceTimeDiagnosticsEnabled" + + fun isEnabled(context: Context): Boolean { + val preferences = context.getSharedPreferences(preferencesName, Context.MODE_PRIVATE) + return shouldEnable( + developerModeEnabled = preferences.getBoolean(developerModeKey, false), + diagnosticsEnabled = preferences.getBoolean(diagnosticsKey, false), + ) + } + + internal fun shouldEnable( + developerModeEnabled: Boolean, + diagnosticsEnabled: Boolean, + ): Boolean = developerModeEnabled && diagnosticsEnabled + + internal fun formatStage( + stage: FaceTimeDiagnosticStage, + state: String? = null, + count: Int? = null, + bytes: Long? = null, + ): String { + val fields = buildList { + add("stage=${stage.wireName}") + state?.let { add("state=${safeValue(it)}") } + count?.let { add("count=${it.coerceAtLeast(0)}") } + bytes?.let { add("bytes=${it.coerceAtLeast(0)}") } + } + return fields.joinToString(" ") + } + + internal fun logStage( + context: Context, + stage: FaceTimeDiagnosticStage, + state: String? = null, + count: Int? = null, + bytes: Long? = null, + ) { + if (isEnabled(context)) { + Log.i(diagnosticTag, formatStage(stage, state, count, bytes)) + } + } + + internal fun safeIceState(rawValue: String?): String = when (rawValue?.lowercase()) { + "new", "checking", "connected", "completed", "disconnected", "failed", "closed" -> rawValue.lowercase() + else -> "unknown" + } + + private fun safeValue(value: String): String = value + .lowercase() + .replace(Regex("[^a-z0-9_.-]"), "_") +} diff --git a/android/app/src/main/kotlin/com/bluebubbles/messaging/services/facetime/FaceTimeJoinPolicy.kt b/android/app/src/main/kotlin/com/bluebubbles/messaging/services/facetime/FaceTimeJoinPolicy.kt new file mode 100644 index 0000000000..910d10788b --- /dev/null +++ b/android/app/src/main/kotlin/com/bluebubbles/messaging/services/facetime/FaceTimeJoinPolicy.kt @@ -0,0 +1,213 @@ +package com.bluebubbles.messaging.services.facetime + +internal enum class FaceTimeJoinOutcome { + CLICKED, + ALREADY_JOINED, + MISSING, + DISABLED, + HIDDEN, + UNKNOWN, + MEDIA_PENDING, + MEDIA_CONNECTED, + MEDIA_FAILED, +} + +internal enum class FaceTimeIceState { + NEW, + CHECKING, + CONNECTED, + COMPLETED, + DISCONNECTED, + FAILED, + CLOSED, + UNKNOWN, + ; + + companion object { + fun fromWireValue(rawValue: String?): FaceTimeIceState = when (rawValue?.lowercase()) { + "new" -> NEW + "checking" -> CHECKING + "connected" -> CONNECTED + "completed" -> COMPLETED + "disconnected" -> DISCONNECTED + "failed" -> FAILED + "closed" -> CLOSED + else -> UNKNOWN + } + } +} + +internal data class FaceTimeMediaEvidence( + val iceState: FaceTimeIceState, + val remoteAudioTracks: Int, + val remoteVideoTracks: Int, + val mediaBytes: Long?, + val webLeaveVisible: Boolean, + val peerId: Int? = null, +) { + val hasRemoteTrack: Boolean + get() = remoteAudioTracks > 0 || remoteVideoTracks > 0 + + val hasConnectedIce: Boolean + get() = iceState == FaceTimeIceState.CONNECTED || iceState == FaceTimeIceState.COMPLETED + + val isConnected: Boolean + get() = hasConnectedIce && hasRemoteTrack +} + +internal data class FaceTimeJoinDecision( + val outcome: FaceTimeJoinOutcome, + val joined: Boolean, + val revealManualRecovery: Boolean, + val retry: Boolean, +) + +internal enum class FaceTimeIntentDisposition { + ACCEPTED, + DUPLICATE, + REJECTED_MISMATCHED_CALL, + REJECTED_MISSING_CALL_ID, +} + +internal enum class FaceTimeNativeEndPlacement { + TOP_RIGHT, + BOTTOM_LEFT, +} + +internal object FaceTimeConnectionProbePolicy { + const val maxProbes = 80 + const val initialDelayMillis = 500L + const val pendingDelayMillis = 1500L + const val connectedDelayMillis = 5000L +} + +/** Keeps a new FaceTime intent attached to one call. */ +internal class FaceTimeCallLifecycle { + private var activeCallUuid: String? = null + + fun acceptIntent(incomingCallUuid: String?): FaceTimeIntentDisposition { + val active = activeCallUuid + if (active == null) { + if (incomingCallUuid == null) { + return FaceTimeIntentDisposition.REJECTED_MISSING_CALL_ID + } + activeCallUuid = incomingCallUuid + return FaceTimeIntentDisposition.ACCEPTED + } + + return when { + incomingCallUuid == active -> FaceTimeIntentDisposition.DUPLICATE + incomingCallUuid == null -> FaceTimeIntentDisposition.REJECTED_MISSING_CALL_ID + else -> FaceTimeIntentDisposition.REJECTED_MISMATCHED_CALL + } + } + + fun reset() { + activeCallUuid = null + } +} + +internal object FaceTimeControlPolicy { + fun shouldShowNativeEndControl(): Boolean = true + + fun nativeEndPlacement(webLeaveVisible: Boolean): FaceTimeNativeEndPlacement = + if (webLeaveVisible) FaceTimeNativeEndPlacement.BOTTOM_LEFT else FaceTimeNativeEndPlacement.TOP_RIGHT +} + +internal class FaceTimeJoinPolicy( + private val manualRecoveryAttempt: Int = 20, + private val maxAttempts: Int = 80, +) { + private var previousPeerId: Int? = null + private var previousInboundMediaBytes: Long? = null + + var attempts: Int = 0 + private set + + var admissionRequested: Boolean = false + private set + + var joined: Boolean = false + private set + + var completedJoin: Boolean = false + private set + + fun record(rawResult: String?): FaceTimeJoinDecision { + attempts += 1 + val outcome = parseOutcome(rawResult) + if (outcome == FaceTimeJoinOutcome.CLICKED || outcome == FaceTimeJoinOutcome.ALREADY_JOINED) { + admissionRequested = true + } + + // A click and a visible Leave button are only signaling evidence. The + // WebView must later report connected ICE and advancing inbound media. + return decision(outcome) + } + + fun recordMediaEvidence(evidence: FaceTimeMediaEvidence): FaceTimeJoinDecision { + val currentBytes = evidence.mediaBytes + val previousBytes = previousInboundMediaBytes + val currentPeerId = evidence.peerId + val validBaseline = evidence.isConnected && + currentPeerId != null && + currentBytes != null && + currentBytes in 1 until Long.MAX_VALUE + val mediaIsAdvancing = validBaseline && + previousPeerId == currentPeerId && + previousBytes != null && + currentBytes > previousBytes + + previousPeerId = if (validBaseline) currentPeerId else null + previousInboundMediaBytes = if (validBaseline) currentBytes else null + + if (mediaIsAdvancing) { + joined = true + completedJoin = true + return decision(FaceTimeJoinOutcome.MEDIA_CONNECTED) + } + + joined = false + + val outcome = if (evidence.iceState == FaceTimeIceState.FAILED) { + FaceTimeJoinOutcome.MEDIA_FAILED + } else { + FaceTimeJoinOutcome.MEDIA_PENDING + } + return decision(outcome) + } + + fun reset() { + attempts = 0 + admissionRequested = false + joined = false + completedJoin = false + previousPeerId = null + previousInboundMediaBytes = null + } + + private fun decision(outcome: FaceTimeJoinOutcome): FaceTimeJoinDecision = FaceTimeJoinDecision( + outcome = outcome, + joined = joined, + revealManualRecovery = joined || attempts >= manualRecoveryAttempt, + retry = !joined && !completedJoin && attempts < maxAttempts, + ) + + companion object { + fun parseOutcome(rawResult: String?): FaceTimeJoinOutcome { + val normalized = rawResult + ?.trim() + ?.removeSurrounding("\"") + ?.lowercase() + + return when (normalized) { + "clicked" -> FaceTimeJoinOutcome.CLICKED + "already-joined" -> FaceTimeJoinOutcome.ALREADY_JOINED + "missing" -> FaceTimeJoinOutcome.MISSING + "disabled" -> FaceTimeJoinOutcome.DISABLED + "hidden" -> FaceTimeJoinOutcome.HIDDEN + else -> FaceTimeJoinOutcome.UNKNOWN + } + } + } +} diff --git a/android/app/src/main/kotlin/com/bluebubbles/messaging/services/facetime/FaceTimeMediaEvidenceParser.kt b/android/app/src/main/kotlin/com/bluebubbles/messaging/services/facetime/FaceTimeMediaEvidenceParser.kt new file mode 100644 index 0000000000..57a88b244b --- /dev/null +++ b/android/app/src/main/kotlin/com/bluebubbles/messaging/services/facetime/FaceTimeMediaEvidenceParser.kt @@ -0,0 +1,117 @@ +package com.bluebubbles.messaging.services.facetime + +import org.json.JSONObject +import java.math.BigDecimal +import java.math.BigInteger + +/** Parses the JSON string returned by WebView.evaluateJavascript safely. */ +internal object FaceTimeMediaEvidenceParser { + fun parse(rawResult: String?): FaceTimeMediaEvidence? { + val raw = rawResult?.trim() + if (raw.isNullOrEmpty() || raw == "null" || raw == "undefined") return null + + return try { + val payload = decodeJavascriptResult(raw)?.trim() ?: return null + if (!payload.startsWith("{") || !payload.endsWith("}")) return null + val decodedPayload = payload + JSONObject(decodedPayload) + + FaceTimeMediaEvidence( + peerId = parseNullablePositiveInt(fieldValue(decodedPayload, "peerId")), + iceState = FaceTimeIceState.fromWireValue( + fieldValue(decodedPayload, "iceState") + .takeUnless { it == null || it.isBlank() || it == "null" }, + ), + remoteAudioTracks = parseBoundedInt(fieldValue(decodedPayload, "remoteAudioTracks")), + remoteVideoTracks = parseBoundedInt(fieldValue(decodedPayload, "remoteVideoTracks")), + mediaBytes = parseNullableBoundedLong(fieldValue(decodedPayload, "mediaBytes")), + webLeaveVisible = fieldValue(decodedPayload, "webLeaveVisible")?.toBoolean() ?: false, + ) + } catch (_: Exception) { + null + } + } + + private fun decodeJavascriptResult(raw: String): String? { + if (raw.startsWith("{")) return raw + if (!raw.startsWith("\"") || !raw.endsWith("\"")) return null + + val result = StringBuilder() + var index = 1 + val end = raw.length - 1 + while (index < end) { + val character = raw[index] + if (character != '\\') { + if (character == '"') return null + result.append(character) + index += 1 + continue + } + + if (index + 1 >= end) return null + when (val escaped = raw[index + 1]) { + '"', '\\', '/' -> result.append(escaped) + 'b' -> result.append('\b') + 'f' -> result.append('\u000C') + 'n' -> result.append('\n') + 'r' -> result.append('\r') + 't' -> result.append('\t') + 'u' -> { + if (index + 5 >= end) return null + val codePoint = raw.substring(index + 2, index + 6).toIntOrNull(16) ?: return null + result.append(codePoint.toChar()) + index += 4 + } + else -> return null + } + index += 2 + } + return result.toString() + } + + private fun parseBoundedInt(value: String?): Int = + parseBoundedLong(value, Int.MAX_VALUE.toLong()).toInt() + + private fun parseNullableBoundedLong(value: String?): Long? { + if (value == null || value == "null") return null + val decimal = value.toBigDecimalOrNull() ?: return 0L + if (decimal.signum() <= 0) return 0L + val integer = decimal.toBigIntegerExactOrNull() ?: return 0L + return if (integer > BigInteger.valueOf(Long.MAX_VALUE)) null else integer.toLong() + } + + private fun parseNullablePositiveInt(value: String?): Int? { + if (value == null || value == "null") return null + val parsed = parseBoundedLong(value, Int.MAX_VALUE.toLong()).toInt() + return parsed.takeIf { it > 0 } + } + + private fun fieldValue(payload: String, key: String): String? { + val token = Regex( + "\\\"${Regex.escape(key)}\\\"\\s*:\\s*(\\\"(?:\\\\.|[^\\\"\\\\])*\\\"|[^,}\\s]+)" + ).find(payload)?.groupValues?.get(1) ?: return null + if (!token.startsWith("\"") || !token.endsWith("\"")) return token + return token.substring(1, token.length - 1) + .replace("\\\"", "\"") + .replace("\\/", "/") + .replace("\\\\", "\\") + } + + private fun parseBoundedLong(value: String?, maximum: Long): Long { + val decimal = value?.toBigDecimalOrNull() ?: return 0L + if (decimal.signum() <= 0) return 0L + + val integer = decimal.toBigIntegerExactOrNull() ?: return 0L + return if (integer > BigInteger.valueOf(maximum)) { + maximum + } else { + integer.toLong() + } + } + + private fun BigDecimal.toBigIntegerExactOrNull(): BigInteger? = try { + toBigIntegerExact() + } catch (_: ArithmeticException) { + null + } +} diff --git a/android/app/src/main/kotlin/com/bluebubbles/messaging/services/facetime/FaceTimePermissionPolicy.kt b/android/app/src/main/kotlin/com/bluebubbles/messaging/services/facetime/FaceTimePermissionPolicy.kt new file mode 100644 index 0000000000..39c0184e3a --- /dev/null +++ b/android/app/src/main/kotlin/com/bluebubbles/messaging/services/facetime/FaceTimePermissionPolicy.kt @@ -0,0 +1,14 @@ +package com.bluebubbles.messaging.services.facetime + +/** Pure decision logic for starting the FaceTime in-call foreground service. */ +internal object FaceTimePermissionPolicy { + private const val grantedResult = 0 + + fun isGranted(grantResults: IntArray, index: Int): Boolean = + index >= 0 && grantResults.getOrNull(index) == grantedResult + + fun shouldStartInCallService(permissionCount: Int, grantResults: IntArray): Boolean = + permissionCount > 0 && + permissionCount == grantResults.size && + grantResults.all { it == grantedResult } +} diff --git a/android/app/src/main/kotlin/com/bluebubbles/messaging/services/intents/InternalIntentReceiver.kt b/android/app/src/main/kotlin/com/bluebubbles/messaging/services/intents/InternalIntentReceiver.kt index 02ab55955d..55830ee081 100644 --- a/android/app/src/main/kotlin/com/bluebubbles/messaging/services/intents/InternalIntentReceiver.kt +++ b/android/app/src/main/kotlin/com/bluebubbles/messaging/services/intents/InternalIntentReceiver.kt @@ -49,6 +49,7 @@ class InternalIntentReceiver: BroadcastReceiver() { val notificationId: Int = intent.getIntExtra("notificationId", 0) DeleteNotificationHandler().deleteNotification(context, notificationId, null) FaceTimeActivity.cachedWebview?.let { + it.cancelCallbacks() it.webView.destroy() FaceTimeActivity.cachedWebview = null } @@ -115,4 +116,4 @@ class InternalIntentReceiver: BroadcastReceiver() { } } } -} \ No newline at end of file +} diff --git a/android/app/src/main/kotlin/com/bluebubbles/messaging/services/rustpush/APNService.kt b/android/app/src/main/kotlin/com/bluebubbles/messaging/services/rustpush/APNService.kt index 8f531715df..9c4f1f6deb 100644 --- a/android/app/src/main/kotlin/com/bluebubbles/messaging/services/rustpush/APNService.kt +++ b/android/app/src/main/kotlin/com/bluebubbles/messaging/services/rustpush/APNService.kt @@ -43,15 +43,39 @@ import uniffi.rust_lib_bluebubbles.setupKeystore import uniffi.rust_lib_bluebubbles.start class APNService : Service(), MsgReceiver { + companion object { + private const val RECEIVE_LOG_TAG = "RustPushReceive" + private const val MAX_PENDING_ENGINE_DISPATCHES = 256 + + @Volatile + private var activeService: APNService? = null + + fun onMainEngineReady() { + activeService?.flushPendingMainEngineDispatches() + } + + fun onMainEngineUnavailable() { + activeService?.handoffPendingMainEngineDispatches() + } + } + var pushState: NativePushState? = null private var started = false private val binder = APNBinder() private var ready = false private val waitingHandleCb = ArrayList<(handle: ULong) -> Unit>() private val waitingStartedCb = ArrayList<() -> Unit>() + private val pendingMainEngineDispatches = + PendingApnDispatchQueue(MAX_PENDING_ENGINE_DISPATCHES) + private val mainHandler = Handler(Looper.getMainLooper()) private val job = SupervisorJob() val scope = CoroutineScope(Dispatchers.IO + job) + override fun onCreate() { + super.onCreate() + activeService = this + } + fun ready() { Log.i("launching agent", "ready") synchronized(waitingHandleCb) { @@ -94,15 +118,122 @@ class APNService : Service(), MsgReceiver { } override fun receievedMsg(ptr: ULong, retry: ULong) { - Handler(Looper.getMainLooper()).post { + mainHandler.post { + if (MainActivity.engine != null && MainActivity.engine_ready) { + dispatchToMainEngine(PendingApnDispatch(ptr, retry)) + return@post + } + if (MainActivity.engine != null) { - // app is alive, deliver directly there - MethodCallHandler.invokeMethod("APNMsg", mapOf("pointer" to ptr.toString(), "retry" to retry.toString())) + val result = pendingMainEngineDispatches.enqueue(ptr, retry) + when { + result.evicted -> Log.w( + RECEIVE_LOG_TAG, + "engine_buffer_evicted retry=$retry pending_count=${result.size}", + ) + result.added -> Log.i( + RECEIVE_LOG_TAG, + "engine_buffered retry=$retry pending_count=${result.size}", + ) + else -> Log.d( + RECEIVE_LOG_TAG, + "engine_buffer_coalesced retry=$retry pending_count=${result.size}", + ) + } return@post } - CoroutineScope(Dispatchers.Main).launch { - DartWorker.callMethod(this@APNService, "APNMsg", mapOf("pointer" to ptr.toString(), "retry" to retry.toString())) + + dispatchToHeadless( + listOf(PendingApnDispatch(ptr, retry)), + reason = "no_main_engine", + ) + } + } + + private fun dispatchToMainEngine(dispatch: PendingApnDispatch) { + MethodCallHandler.invokeMethod( + "APNMsg", + mapOf( + "pointer" to dispatch.pointer.toString(), + "retry" to dispatch.retry.toString(), + ), + ) + } + + private fun flushPendingMainEngineDispatches() { + runOnMainThread { + if (MainActivity.engine == null || !MainActivity.engine_ready) { + return@runOnMainThread + } + + val dispatches = pendingMainEngineDispatches.drain() + if (dispatches.isEmpty()) { + return@runOnMainThread } + + Log.i( + RECEIVE_LOG_TAG, + "engine_buffer_flush count=${dispatches.size}", + ) + for (dispatch in dispatches) { + dispatchToMainEngine(dispatch) + } + } + } + + private fun handoffPendingMainEngineDispatches() { + runOnMainThread { + if (MainActivity.engine != null) { + if (MainActivity.engine_ready) { + flushPendingMainEngineDispatches() + } + return@runOnMainThread + } + + val dispatches = pendingMainEngineDispatches.drain() + dispatchToHeadless(dispatches, reason = "main_engine_unavailable") + } + } + + private fun dispatchToHeadless( + dispatches: List, + reason: String, + ) { + if (dispatches.isEmpty()) { + return + } + + Log.i( + RECEIVE_LOG_TAG, + "headless_handoff reason=$reason count=${dispatches.size}", + ) + CoroutineScope(Dispatchers.Main).launch { + for (dispatch in dispatches) { + Log.d(RECEIVE_LOG_TAG, "headless_dispatch retry=${dispatch.retry}") + try { + DartWorker.callMethod( + this@APNService, + "APNMsg", + mapOf( + "pointer" to dispatch.pointer.toString(), + "retry" to dispatch.retry.toString(), + ), + ) + } catch (error: Exception) { + Log.w( + RECEIVE_LOG_TAG, + "headless_dispatch_failed retry=${dispatch.retry} error=${error.javaClass.simpleName}", + ) + } + } + } + } + + private inline fun runOnMainThread(crossinline block: () -> Unit) { + if (Looper.myLooper() == Looper.getMainLooper()) { + block() + } else { + mainHandler.post { block() } } } @@ -287,6 +418,16 @@ class APNService : Service(), MsgReceiver { } override fun onDestroy() { + if (activeService === this) { + activeService = null + } + val discarded = pendingMainEngineDispatches.clear() + if (discarded > 0) { + Log.i( + RECEIVE_LOG_TAG, + "engine_buffer_cleared_on_service_destroy count=$discarded", + ) + } super.onDestroy() pushState?.destroy() job.cancel() diff --git a/android/app/src/main/kotlin/com/bluebubbles/messaging/services/rustpush/CloudSyncV2WorkPolicy.kt b/android/app/src/main/kotlin/com/bluebubbles/messaging/services/rustpush/CloudSyncV2WorkPolicy.kt new file mode 100644 index 0000000000..d1f6998186 --- /dev/null +++ b/android/app/src/main/kotlin/com/bluebubbles/messaging/services/rustpush/CloudSyncV2WorkPolicy.kt @@ -0,0 +1,43 @@ +package com.bluebubbles.messaging.services.rustpush + +/** + * Pure scheduling policy for the dormant Cloud Sync V2 Android adapter. + * + * This is intentionally independent of WorkManager so its safety invariants + * can be tested without starting Android framework code. It is a scheduling + * policy only: it does not authorize a CloudKit operation. + */ +internal enum class CloudSyncV2WorkKind { + METADATA, + AUTOMATIC_MEDIA, + USER_VISIBLE_MANUAL, +} + +internal enum class CloudSyncV2NetworkRequirement { + CONNECTED, + UNMETERED, +} + +internal data class CloudSyncV2WorkPolicy( + val networkRequirement: CloudSyncV2NetworkRequirement, + val requiresBatteryNotLow: Boolean = true, + val requiresStorageNotLow: Boolean = true, + val initialDelayMillis: Long = CloudSyncV2WorkPolicy.COALESCE_DELAY_MILLIS, + /** + * Kept explicit so a future user-visible flow cannot accidentally become + * expedited. V2 currently never requests expedited execution. + */ + val requestsExpeditedExecution: Boolean = false, +) { + companion object { + const val COALESCE_DELAY_MILLIS = 15_000L + + fun forKind(kind: CloudSyncV2WorkKind): CloudSyncV2WorkPolicy = when (kind) { + CloudSyncV2WorkKind.METADATA, + CloudSyncV2WorkKind.USER_VISIBLE_MANUAL -> + CloudSyncV2WorkPolicy(CloudSyncV2NetworkRequirement.CONNECTED) + CloudSyncV2WorkKind.AUTOMATIC_MEDIA -> + CloudSyncV2WorkPolicy(CloudSyncV2NetworkRequirement.UNMETERED) + } + } +} diff --git a/android/app/src/main/kotlin/com/bluebubbles/messaging/services/rustpush/CloudSyncV2WorkScheduler.kt b/android/app/src/main/kotlin/com/bluebubbles/messaging/services/rustpush/CloudSyncV2WorkScheduler.kt new file mode 100644 index 0000000000..376c99496b --- /dev/null +++ b/android/app/src/main/kotlin/com/bluebubbles/messaging/services/rustpush/CloudSyncV2WorkScheduler.kt @@ -0,0 +1,91 @@ +package com.bluebubbles.messaging.services.rustpush + +import android.content.Context +import androidx.work.Constraints +import androidx.work.ExistingWorkPolicy +import androidx.work.NetworkType +import androidx.work.OneTimeWorkRequestBuilder +import androidx.work.WorkManager +import java.security.MessageDigest +import java.util.concurrent.TimeUnit + +/** + * Android-side durable scheduling boundary for Cloud Sync V2. + * + * The default gate is closed. IDS/APNs callers may eventually submit a hint to + * this class, but must return immediately and never perform CloudKit work on + * that latency-sensitive path. WorkManager's unique-work KEEP semantics only + * coalesce wake hints; it never replaces ObjectBox coordinator leases. + */ +internal object CloudSyncV2WorkScheduler { + const val INPUT_SCOPE_HASH = "cloud_sync_v2_scope_hash" + const val INPUT_WORK_KIND = "cloud_sync_v2_work_kind" + private const val UNIQUE_WORK_PREFIX = "cloud-sync-v2/" + + /** Closed unless a future reviewed composition explicitly opens it. */ + @Volatile + var schedulingEnabled: Boolean = false + + fun enqueueHint( + context: Context, + scopeKey: String, + kind: CloudSyncV2WorkKind = CloudSyncV2WorkKind.METADATA, + ): Boolean { + if (!schedulingEnabled) return false + + val scopeHash = hashScope(scopeKey) + val policy = CloudSyncV2WorkPolicy.forKind(kind) + val constraints = Constraints.Builder() + .setRequiredNetworkType( + when (policy.networkRequirement) { + CloudSyncV2NetworkRequirement.CONNECTED -> NetworkType.CONNECTED + CloudSyncV2NetworkRequirement.UNMETERED -> NetworkType.UNMETERED + }, + ) + .setRequiresBatteryNotLow(policy.requiresBatteryNotLow) + .setRequiresStorageNotLow(policy.requiresStorageNotLow) + .build() + + val request = OneTimeWorkRequestBuilder() + .setConstraints(constraints) + .setInitialDelay(policy.initialDelayMillis, TimeUnit.MILLISECONDS) + .setInputData( + androidx.work.Data.Builder() + .putString(INPUT_SCOPE_HASH, scopeHash) + .putString(INPUT_WORK_KIND, kind.name) + .build(), + ) + .addTag(UNIQUE_WORK_PREFIX + scopeHash) + // Do not use setExpedited. Even USER_VISIBLE_MANUAL remains normal + // work until a separately reviewed foreground/user-visible design + // can prove Android policy compliance. + .build() + + WorkManager.getInstance(context.applicationContext).enqueueUniqueWork( + uniqueWorkName(scopeHash), + ExistingWorkPolicy.KEEP, + request, + ) + return true + } + + fun cancel(context: Context, scopeKey: String) { + WorkManager.getInstance(context.applicationContext).cancelUniqueWork( + uniqueWorkName(hashScope(scopeKey)), + ) + } + + internal fun uniqueWorkNameForScopeKey(scopeKey: String): String = + uniqueWorkName(hashScope(scopeKey)) + + internal fun hashScope(scopeKey: String): String { + require(scopeKey.isNotBlank()) { "Cloud Sync V2 scope key must not be blank" } + return MessageDigest.getInstance("SHA-256") + .digest(scopeKey.toByteArray(Charsets.UTF_8)) + .joinToString(separator = "") { byte -> + "%02x".format(byte.toInt() and 0xff) + } + } + + private fun uniqueWorkName(scopeHash: String): String = UNIQUE_WORK_PREFIX + scopeHash +} diff --git a/android/app/src/main/kotlin/com/bluebubbles/messaging/services/rustpush/CloudSyncV2Worker.kt b/android/app/src/main/kotlin/com/bluebubbles/messaging/services/rustpush/CloudSyncV2Worker.kt new file mode 100644 index 0000000000..168174ab04 --- /dev/null +++ b/android/app/src/main/kotlin/com/bluebubbles/messaging/services/rustpush/CloudSyncV2Worker.kt @@ -0,0 +1,34 @@ +package com.bluebubbles.messaging.services.rustpush + +import android.content.Context +import android.util.Log +import androidx.work.Worker +import androidx.work.WorkerParameters +import com.bluebubbles.messaging.Constants + +/** + * Durable WorkManager endpoint for the future Cloud Sync V2 handoff. + * + * This deliberately performs no CloudKit work. WorkManager preserves the + * request across process death, but ObjectBox's coordinator lease remains the + * only authority that may later claim and run a scoped sync. A future rollout + * must add that lease-aware handoff behind its own reviewed feature gate. + */ +class CloudSyncV2Worker( + appContext: Context, + params: WorkerParameters, +) : Worker(appContext, params) { + override fun doWork(): Result { + val scopeHash = inputData.getString(CloudSyncV2WorkScheduler.INPUT_SCOPE_HASH) + val kind = inputData.getString(CloudSyncV2WorkScheduler.INPUT_WORK_KIND) + if (scopeHash.isNullOrBlank() || kind.isNullOrBlank()) { + Log.w(Constants.logTag, "Cloud Sync V2 work rejected: missing safe scheduling input") + return Result.failure() + } + + // Deliberate no-op while V2 remains disabled. In particular, do not + // initialize a Flutter engine or call Rust/CloudKit from this worker. + Log.i(Constants.logTag, "Cloud Sync V2 durable handoff reached kind=$kind") + return Result.success() + } +} diff --git a/android/app/src/main/kotlin/com/bluebubbles/messaging/services/rustpush/PendingApnDispatchQueue.kt b/android/app/src/main/kotlin/com/bluebubbles/messaging/services/rustpush/PendingApnDispatchQueue.kt new file mode 100644 index 0000000000..18e6bb5c82 --- /dev/null +++ b/android/app/src/main/kotlin/com/bluebubbles/messaging/services/rustpush/PendingApnDispatchQueue.kt @@ -0,0 +1,75 @@ +package com.bluebubbles.messaging.services.rustpush + +internal data class PendingApnDispatch( + val pointer: ULong, + val retry: ULong, +) + +internal data class PendingApnEnqueueResult( + val added: Boolean, + val evicted: Boolean, + val size: Int, +) + +/** + * A short-lived Android-side dispatch buffer for APNs pointers received while + * the main Flutter engine exists but has not registered its method channel yet. + * + * Rust remains the source of truth for retrying and dropping each pointer. + * Removing an entry here never acknowledges or removes it from the Rust queue. + */ +internal class PendingApnDispatchQueue( + private val capacity: Int, +) { + private val pending = LinkedHashMap() + + init { + require(capacity > 0) { "capacity must be positive" } + } + + @Synchronized + fun enqueue(pointer: ULong, retry: ULong): PendingApnEnqueueResult { + val existing = pending[pointer] + if (existing != null) { + if (retry > existing.retry) { + pending[pointer] = existing.copy(retry = retry) + } + return PendingApnEnqueueResult( + added = false, + evicted = false, + size = pending.size, + ) + } + + var evicted = false + if (pending.size >= capacity) { + val oldest = pending.entries.iterator() + if (oldest.hasNext()) { + oldest.next() + oldest.remove() + evicted = true + } + } + + pending[pointer] = PendingApnDispatch(pointer, retry) + return PendingApnEnqueueResult( + added = true, + evicted = evicted, + size = pending.size, + ) + } + + @Synchronized + fun drain(): List { + val result = pending.values.toList() + pending.clear() + return result + } + + @Synchronized + fun clear(): Int { + val size = pending.size + pending.clear() + return size + } +} diff --git a/android/app/src/main/kotlin/com/bluebubbles/messaging/services/system/NativeSyncIsolateHandler.kt b/android/app/src/main/kotlin/com/bluebubbles/messaging/services/system/NativeSyncIsolateHandler.kt index f88b2b592d..c137eae5cf 100644 --- a/android/app/src/main/kotlin/com/bluebubbles/messaging/services/system/NativeSyncIsolateHandler.kt +++ b/android/app/src/main/kotlin/com/bluebubbles/messaging/services/system/NativeSyncIsolateHandler.kt @@ -5,13 +5,12 @@ import android.util.Log import com.bluebubbles.messaging.Constants import com.bluebubbles.messaging.models.MethodCallHandlerImpl import com.bluebubbles.messaging.services.backend_ui_interop.MethodCallHandler +import io.flutter.FlutterInjector import io.flutter.embedding.engine.FlutterEngine import io.flutter.embedding.engine.dart.DartExecutor -import io.flutter.embedding.engine.loader.ApplicationInfoLoader import io.flutter.plugin.common.MethodCall import io.flutter.plugin.common.MethodChannel import io.flutter.view.FlutterCallbackInformation -import io.flutter.view.FlutterMain import kotlin.coroutines.resume import kotlin.coroutines.suspendCoroutine @@ -42,11 +41,12 @@ class NativeSyncIsolateHandler : MethodCallHandlerImpl() { return } - FlutterMain.startInitialization(context) - FlutterMain.ensureInitializationComplete(context, null) + val flutterLoader = FlutterInjector.instance().flutterLoader() + flutterLoader.startInitialization(context) + flutterLoader.ensureInitializationComplete(context, null) + val appBundlePath = flutterLoader.findAppBundlePath() Log.d(Constants.logTag, "Loading callback info") - val info = ApplicationInfoLoader.load(context) val workerEngine = FlutterEngine(context) engine = workerEngine MethodChannel(workerEngine.dartExecutor.binaryMessenger, Constants.methodChannel).setMethodCallHandler { @@ -63,9 +63,9 @@ class NativeSyncIsolateHandler : MethodCallHandlerImpl() { } } val callbackInfo = FlutterCallbackInformation.lookupCallbackInformation(context.getSharedPreferences("FlutterSharedPreferences", 0).getLong("flutter.backgroundSyncIsolate", -1)) - val callback = DartExecutor.DartCallback(context.assets, info.flutterAssetsDir, callbackInfo) + val callback = DartExecutor.DartCallback(context.assets, appBundlePath, callbackInfo) Log.d(Constants.logTag, "Executing Dart callback") workerEngine.dartExecutor.executeDartCallback(callback) } -} \ No newline at end of file +} diff --git a/android/app/src/main/kotlin/com/bluebubbles/messaging/services/system/NearbyFindMyAccessoryHandler.kt b/android/app/src/main/kotlin/com/bluebubbles/messaging/services/system/NearbyFindMyAccessoryHandler.kt new file mode 100644 index 0000000000..7282337f6e --- /dev/null +++ b/android/app/src/main/kotlin/com/bluebubbles/messaging/services/system/NearbyFindMyAccessoryHandler.kt @@ -0,0 +1,574 @@ +package com.bluebubbles.messaging.services.system + +import android.Manifest +import android.app.Activity +import android.bluetooth.BluetoothAdapter +import android.bluetooth.BluetoothDevice +import android.bluetooth.BluetoothGatt +import android.bluetooth.BluetoothGattCallback +import android.bluetooth.BluetoothGattCharacteristic +import android.bluetooth.BluetoothGattDescriptor +import android.bluetooth.BluetoothManager +import android.bluetooth.le.BluetoothLeScanner +import android.bluetooth.le.ScanCallback +import android.bluetooth.le.ScanResult +import android.bluetooth.le.ScanSettings +import android.content.Context +import android.content.pm.PackageManager +import android.os.Build +import android.os.Handler +import android.os.Looper +import android.os.ParcelUuid +import com.bluebubbles.messaging.models.MethodCallHandlerImpl +import io.flutter.plugin.common.MethodCall +import io.flutter.plugin.common.MethodChannel +import java.util.Locale +import java.util.UUID +import java.util.concurrent.atomic.AtomicBoolean + +/** + * Foreground-only, user-triggered nearby sound support for compatible Find My trackers. + * + * The protocol compatibility was informed by the Apache-2.0 AirGuard project, especially + * its AppleFindMy model and BluetoothLeService. This is an original, deliberately narrow + * implementation: it never exposes addresses or advertisement bytes, and it does not run + * in the background or claim ownership of a discovered tracker. + */ +class NearbyFindMyAccessoryHandler private constructor() : MethodCallHandlerImpl() { + companion object { + const val scanTag = "scanNearbyFindMyAccessories" + const val playTag = "playNearbyFindMyAccessorySound" + + val instance: NearbyFindMyAccessoryHandler by lazy { NearbyFindMyAccessoryHandler() } + + private const val defaultScanDurationMs = 8_000L + private const val minScanDurationMs = 3_000L + private const val maxScanDurationMs = 15_000L + private const val tokenLifetimeMs = 60_000L + private const val soundDurationMs = 5_000L + private const val operationTimeoutMs = 20_000L + private const val cccdUuidString = "00002902-0000-1000-8000-00805f9b34fb" + private const val appleManufacturerId = 0x004C + private const val findMyAdvertisementType = 0x12 + private const val separatedFindMyAdvertisementType = 0x19 + + private val dultServiceUuid = UUID.fromString("15190001-12F4-C226-88ED-2AC5579F2A85") + private val dultCharacteristicUuid = UUID.fromString("8E0C0001-1D68-FB92-BF61-48377421680E") + private val findMyCharacteristicUuid = UUID.fromString("4F860003-943B-49EF-BED4-2F730304427A") + private val airtagServiceUuid = UUID.fromString("7DFC9000-7D1C-4951-86AA-8D9728F8D66C") + private val airtagCharacteristicUuid = UUID.fromString("7DFC9001-7D1C-4951-86AA-8D9728F8D66C") + } + + private enum class Protocol(val wireName: String) { + DULT("dult"), + FIND_MY("find_my"), + AIRTAG("airtag") + } + + private enum class CommandPhase { START, STOP } + + private data class TokenEntry( + val device: BluetoothDevice, + val protocol: Protocol, + val expiresAtMs: Long, + ) + + private val mainHandler = Handler(Looper.getMainLooper()) + private val tokenLock = Any() + private val tokens = HashMap() + private var activeScan: ScanOperation? = null + + override fun handleMethodCall( + call: MethodCall, + result: MethodChannel.Result, + context: Context, + ) { + when (call.method) { + scanTag -> scan(call, result, context) + playTag -> play(call, result, context) + else -> result.error("NOT_IMPLEMENTED", "Unsupported nearby Find My method", null) + } + } + + private fun scan(call: MethodCall, result: MethodChannel.Result, context: Context) { + val once = OnceResult(result) + if (!isUsableForeground(context)) { + once.error("FOREGROUND_REQUIRED", "Nearby tracker actions require the app to be open", null) + return + } + + val permissionError = permissionError(context, requireConnect = true) + if (permissionError != null) { + once.error("PERMISSION_DENIED", permissionError, null) + return + } + + val adapter = bluetoothAdapter(context) + if (adapter == null) { + once.error("BLUETOOTH_UNAVAILABLE", "This device does not provide Bluetooth", null) + return + } + if (!adapter.isEnabled) { + once.error("BLUETOOTH_DISABLED", "Bluetooth is turned off", null) + return + } + + val scanner = try { + adapter.bluetoothLeScanner + } catch (_: SecurityException) { + null + } + if (scanner == null) { + once.error("BLUETOOTH_UNAVAILABLE", "Bluetooth scanning is unavailable", null) + return + } + + val requestedDuration = call.argument("scanDurationMs")?.toLong() ?: defaultScanDurationMs + val durationMs = requestedDuration.coerceIn(minScanDurationMs, maxScanDurationMs) + synchronized(tokenLock) { + expireTokensLocked(System.currentTimeMillis()) + if (activeScan != null) { + once.error("SCAN_IN_PROGRESS", "A nearby tracker scan is already running", null) + return + } + val operation = ScanOperation(context.applicationContext, scanner, once, durationMs) + activeScan = operation + operation.start() + } + } + + private fun play(call: MethodCall, result: MethodChannel.Result, context: Context) { + val once = OnceResult(result) + if (!isUsableForeground(context)) { + once.error("FOREGROUND_REQUIRED", "Nearby tracker actions require the app to be open", null) + return + } + + val permissionError = permissionError(context, requireConnect = true) + if (permissionError != null) { + once.error("PERMISSION_DENIED", permissionError, null) + return + } + + val token = call.argument("token")?.trim() + if (token.isNullOrEmpty()) { + once.error("INVALID_TOKEN", "A nearby tracker token is required", null) + return + } + + val entry = synchronized(tokenLock) { + expireTokensLocked(System.currentTimeMillis()) + tokens.remove(token) + } + if (entry == null) { + once.error("TOKEN_EXPIRED", "That nearby tracker result has expired", null) + return + } + + val adapter = bluetoothAdapter(context) + if (adapter == null) { + once.error("BLUETOOTH_UNAVAILABLE", "This device does not provide Bluetooth", null) + return + } + if (!adapter.isEnabled) { + once.error("BLUETOOTH_DISABLED", "Bluetooth is turned off", null) + return + } + + SoundGattSession(context.applicationContext, entry, once).start() + } + + private fun bluetoothAdapter(context: Context): BluetoothAdapter? { + val manager = context.getSystemService(Context.BLUETOOTH_SERVICE) as? BluetoothManager ?: return null + return try { + manager.adapter + } catch (_: SecurityException) { + null + } + } + + private fun permissionError(context: Context, requireConnect: Boolean): String? { + if (Build.VERSION.SDK_INT < Build.VERSION_CODES.S) return null + if (context.checkSelfPermission(Manifest.permission.BLUETOOTH_SCAN) != PackageManager.PERMISSION_GRANTED) { + return "Nearby device scan permission is not granted" + } + if (requireConnect && context.checkSelfPermission(Manifest.permission.BLUETOOTH_CONNECT) != PackageManager.PERMISSION_GRANTED) { + return "Nearby device connection permission is not granted" + } + return null + } + + private fun isUsableForeground(context: Context): Boolean { + val activity = context as? Activity ?: return false + return !activity.isFinishing && (Build.VERSION.SDK_INT < 17 || !activity.isDestroyed) + } + + private fun expireTokensLocked(nowMs: Long) { + tokens.entries.removeIf { it.value.expiresAtMs <= nowMs } + } + + private inner class ScanOperation( + private val context: Context, + private val scanner: BluetoothLeScanner, + private val result: OnceResult, + private val durationMs: Long, + ) { + private val completed = AtomicBoolean(false) + private val devicesByAddress = HashMap() + private val timeout = Runnable { finishSuccess() } + private val callback = object : ScanCallback() { + override fun onScanResult(callbackType: Int, scanResult: ScanResult) { + record(scanResult) + } + + override fun onBatchScanResults(results: MutableList) { + results.forEach(::record) + } + + override fun onScanFailed(errorCode: Int) { + finishError("SCAN_FAILED", "Bluetooth scan failed", errorCode) + } + } + + fun start() { + try { + scanner.startScan( + null, + ScanSettings.Builder() + .setScanMode(ScanSettings.SCAN_MODE_LOW_LATENCY) + .setReportDelay(0L) + .build(), + callback, + ) + mainHandler.postDelayed(timeout, durationMs) + } catch (_: SecurityException) { + finishError("PERMISSION_DENIED", "Bluetooth scan permission is not granted", null) + } catch (_: Exception) { + finishError("BLUETOOTH_UNAVAILABLE", "Bluetooth scanning is unavailable", null) + } + } + + private fun record(scanResult: ScanResult) { + if (completed.get()) return + val protocol = protocolFor(scanResult.scanRecord) ?: return + try { + val address = scanResult.device.address + val previous = devicesByAddress[address] + if (previous == null || scanResult.rssi > previous.rssi) { + devicesByAddress[address] = DiscoveredDevice(scanResult.device, protocol, scanResult.rssi) + } + } catch (_: SecurityException) { + finishError("PERMISSION_DENIED", "Bluetooth connection permission is not granted", null) + } + } + + private fun finishSuccess() { + if (!completed.compareAndSet(false, true)) return + stop() + val now = System.currentTimeMillis() + val output = synchronized(tokenLock) { + expireTokensLocked(now) + devicesByAddress.values.sortedByDescending { it.rssi }.map { discovered -> + val token = UUID.randomUUID().toString() + tokens[token] = TokenEntry( + device = discovered.device, + protocol = discovered.protocol, + expiresAtMs = now + tokenLifetimeMs, + ) + mapOf( + "token" to token, + "protocol" to discovered.protocol.wireName, + "signal" to signalFor(discovered.rssi), + "rssi" to discovered.rssi, + ) + } + } + result.success(output) + synchronized(tokenLock) { + if (activeScan === this) activeScan = null + } + } + + private fun finishError(code: String, message: String, details: Any?) { + if (!completed.compareAndSet(false, true)) return + stop() + result.error(code, message, details) + synchronized(tokenLock) { + if (activeScan === this) activeScan = null + } + } + + private fun stop() { + mainHandler.removeCallbacks(timeout) + try { + scanner.stopScan(callback) + } catch (_: SecurityException) { + // The operation is already completing. Do not call the result twice. + } + } + } + + private data class DiscoveredDevice( + val device: BluetoothDevice, + val protocol: Protocol, + val rssi: Int, + ) + + private inner class SoundGattSession( + private val context: Context, + private val entry: TokenEntry, + private val result: OnceResult, + ) : BluetoothGattCallback() { + private val completed = AtomicBoolean(false) + private val callbackTimeout = Runnable { fail("GATT_TIMEOUT", "The nearby tracker did not respond") } + private var stopRunnable: Runnable? = null + private var gatt: BluetoothGatt? = null + private var characteristic: BluetoothGattCharacteristic? = null + private var activeProtocol = entry.protocol + private var commandPhase = CommandPhase.START + private var started = false + + fun start() { + try { + gatt = entry.device.connectGatt(context, false, this, BluetoothDevice.TRANSPORT_LE) + if (gatt == null) { + fail("GATT_UNAVAILABLE", "Could not connect to the nearby tracker") + return + } + mainHandler.postDelayed(callbackTimeout, operationTimeoutMs) + } catch (_: SecurityException) { + fail("PERMISSION_DENIED", "Bluetooth connection permission is not granted") + } catch (_: Exception) { + fail("GATT_UNAVAILABLE", "Could not connect to the nearby tracker") + } + } + + override fun onConnectionStateChange(gatt: BluetoothGatt, status: Int, newState: Int) { + if (completed.get()) return + if (status == 19 && activeProtocol == Protocol.AIRTAG && started) { + succeed() + return + } + if (status != BluetoothGatt.GATT_SUCCESS) { + fail("GATT_CONNECTION_FAILED", "The nearby tracker connection failed") + return + } + if (newState == BluetoothGatt.STATE_CONNECTED) { + try { + if (!gatt.discoverServices()) { + fail("GATT_DISCOVERY_FAILED", "Could not inspect the nearby tracker") + } + } catch (_: SecurityException) { + fail("PERMISSION_DENIED", "Bluetooth connection permission is not granted") + } + } else if (newState == BluetoothGatt.STATE_DISCONNECTED && !started) { + fail("GATT_DISCONNECTED", "The nearby tracker disconnected before sounding") + } + } + + override fun onServicesDiscovered(gatt: BluetoothGatt, status: Int) { + if (completed.get()) return + if (status != BluetoothGatt.GATT_SUCCESS) { + fail("GATT_DISCOVERY_FAILED", "Could not inspect the nearby tracker") + return + } + + val protocols = listOf(entry.protocol) + Protocol.values().filter { it != entry.protocol } + val match = protocols.firstNotNullOfOrNull { protocol -> + findService(gatt, protocol)?.getCharacteristic(characteristicUuidFor(protocol))?.let { protocol to it } + } + if (match == null) { + fail("UNSUPPORTED_TRACKER", "The nearby tracker sound protocol is unavailable") + return + } + activeProtocol = match.first + val target = match.second + characteristic = target + + if (activeProtocol == Protocol.AIRTAG) { + writeCommand(byteArrayOf(0xAF.toByte())) + } else { + enableNotifications(gatt, target) + } + } + + override fun onDescriptorWrite(gatt: BluetoothGatt, descriptor: BluetoothGattDescriptor, status: Int) { + if (completed.get()) return + if (descriptor.uuid.toString().equals(cccdUuidString, ignoreCase = true) && status == BluetoothGatt.GATT_SUCCESS) { + writeCommand(startCommandFor(activeProtocol)) + } else { + fail("GATT_NOTIFICATION_FAILED", "Could not prepare the nearby tracker sound command") + } + } + + override fun onCharacteristicWrite( + gatt: BluetoothGatt, + characteristic: BluetoothGattCharacteristic, + status: Int, + ) { + if (completed.get()) return + if (status != BluetoothGatt.GATT_SUCCESS) { + fail("GATT_WRITE_FAILED", "The nearby tracker rejected the sound command") + return + } + + if (commandPhase == CommandPhase.START) { + started = true + if (activeProtocol == Protocol.AIRTAG) { + // First-generation AirTags confirm the trigger by closing the GATT link + // with status 19. Keep the session open until that confirmation arrives. + return + } else { + commandPhase = CommandPhase.STOP + stopRunnable = Runnable { + if (!completed.get()) writeCommand(stopCommandFor(activeProtocol)) + } + mainHandler.postDelayed(stopRunnable!!, soundDurationMs) + } + } else { + succeed() + } + } + + private fun findService(gatt: BluetoothGatt, protocol: Protocol) = gatt.services.firstOrNull { service -> + when (protocol) { + Protocol.DULT -> service.uuid == dultServiceUuid + Protocol.FIND_MY -> service.uuid.toString().lowercase(Locale.US).contains("fd44") + Protocol.AIRTAG -> service.uuid == airtagServiceUuid + } + } + + private fun characteristicUuidFor(protocol: Protocol): UUID = when (protocol) { + Protocol.DULT -> dultCharacteristicUuid + Protocol.FIND_MY -> findMyCharacteristicUuid + Protocol.AIRTAG -> airtagCharacteristicUuid + } + + private fun startCommandFor(protocol: Protocol): ByteArray = when (protocol) { + Protocol.DULT -> byteArrayOf(0x00, 0x03) + Protocol.FIND_MY -> byteArrayOf(0x01, 0x00, 0x03) + Protocol.AIRTAG -> byteArrayOf(0xAF.toByte()) + } + + private fun stopCommandFor(protocol: Protocol): ByteArray = when (protocol) { + Protocol.DULT -> byteArrayOf(0x01, 0x03) + Protocol.FIND_MY -> byteArrayOf(0x01, 0x01, 0x03) + Protocol.AIRTAG -> byteArrayOf(0xAF.toByte()) + } + + private fun enableNotifications(gatt: BluetoothGatt, target: BluetoothGattCharacteristic) { + try { + if (!gatt.setCharacteristicNotification(target, true)) { + fail("GATT_NOTIFICATION_FAILED", "Could not enable nearby tracker notifications") + return + } + val descriptor = target.getDescriptor(UUID.fromString(cccdUuidString)) + if (descriptor == null) { + fail("GATT_NOTIFICATION_FAILED", "The nearby tracker has no notification control") + return + } + val cccdValue = if ( + (target.properties and BluetoothGattCharacteristic.PROPERTY_INDICATE) != 0 + ) BluetoothGattDescriptor.ENABLE_INDICATION_VALUE else BluetoothGattDescriptor.ENABLE_NOTIFICATION_VALUE + val accepted = if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU) { + gatt.writeDescriptor(descriptor, cccdValue) == BluetoothGatt.GATT_SUCCESS + } else { + @Suppress("DEPRECATION") + descriptor.value = cccdValue + @Suppress("DEPRECATION") + gatt.writeDescriptor(descriptor) + } + if (!accepted) fail("GATT_NOTIFICATION_FAILED", "Could not prepare the nearby tracker sound command") + } catch (_: SecurityException) { + fail("PERMISSION_DENIED", "Bluetooth connection permission is not granted") + } + } + + private fun writeCommand(value: ByteArray) { + val gatt = gatt ?: return fail("GATT_UNAVAILABLE", "The nearby tracker connection is gone") + val target = characteristic ?: return fail("GATT_UNAVAILABLE", "The nearby tracker sound channel is gone") + try { + val accepted = if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU) { + gatt.writeCharacteristic(target, value, BluetoothGattCharacteristic.WRITE_TYPE_DEFAULT) == BluetoothGatt.GATT_SUCCESS + } else { + @Suppress("DEPRECATION") + target.value = value + @Suppress("DEPRECATION") + gatt.writeCharacteristic(target) + } + if (!accepted) fail("GATT_WRITE_FAILED", "The nearby tracker rejected the sound command") + } catch (_: SecurityException) { + fail("PERMISSION_DENIED", "Bluetooth connection permission is not granted") + } + } + + private fun fail(code: String, message: String) { + if (!completed.compareAndSet(false, true)) return + cleanup() + result.error(code, message, null) + } + + private fun succeed() { + if (!completed.compareAndSet(false, true)) return + cleanup() + result.success(true) + } + + private fun cleanup() { + completed.set(true) + mainHandler.removeCallbacks(callbackTimeout) + stopRunnable?.let(mainHandler::removeCallbacks) + stopRunnable = null + val currentGatt = gatt + gatt = null + try { + currentGatt?.disconnect() + currentGatt?.close() + } catch (_: SecurityException) { + // Cleanup is best effort after the one result has been completed. + } + } + + } + + private class OnceResult(private val delegate: MethodChannel.Result) { + private val completed = AtomicBoolean(false) + + fun success(value: Any?) { + if (completed.compareAndSet(false, true)) delegate.success(value) + } + + fun error(code: String, message: String, details: Any?) { + if (completed.compareAndSet(false, true)) delegate.error(code, message, details) + } + } + + private fun protocolFor(scanRecord: android.bluetooth.le.ScanRecord?): Protocol? { + val normalized = (scanRecord?.serviceUuids ?: emptyList()) + .map { it.uuid.toString().lowercase(Locale.US) } + // Legacy/separated Find My advertisements often expose no service UUID. AirGuard's + // AppleFindMy detector identifies this Apple company-data format as type 0x12 with + // the separated/offline marker 0x19 in the second byte. Treat this only as a scan + // hint. GATT discovery below independently tries every supported sound protocol. + val appleFindMyAdvertisement = scanRecord + ?.getManufacturerSpecificData(appleManufacturerId) + ?.let { data -> + data.size >= 2 && + (data[0].toInt() and 0xFF) == findMyAdvertisementType && + (data[1].toInt() and 0xFF) == separatedFindMyAdvertisementType + } == true + return when { + normalized.any { it == dultServiceUuid.toString().lowercase(Locale.US) } -> Protocol.DULT + normalized.any { it.contains("fd44") } -> Protocol.FIND_MY + normalized.any { it == airtagServiceUuid.toString().lowercase(Locale.US) } -> Protocol.AIRTAG + appleFindMyAdvertisement -> Protocol.AIRTAG + else -> null + } + } + + private fun signalFor(rssi: Int): String = when { + rssi >= -60 -> "strong" + rssi >= -80 -> "medium" + else -> "weak" + } +} diff --git a/android/app/src/main/res/layout/activity_face_time.xml b/android/app/src/main/res/layout/activity_face_time.xml index 00447c806d..8e0c5c5545 100644 --- a/android/app/src/main/res/layout/activity_face_time.xml +++ b/android/app/src/main/res/layout/activity_face_time.xml @@ -140,4 +140,51 @@ - \ No newline at end of file + + + + + + + + + + diff --git a/android/app/src/test/kotlin/com/bluebubbles/messaging/services/backend_ui_interop/FlutterBackgroundIsolateEmbeddingContractTest.kt b/android/app/src/test/kotlin/com/bluebubbles/messaging/services/backend_ui_interop/FlutterBackgroundIsolateEmbeddingContractTest.kt new file mode 100644 index 0000000000..e1b75d5306 --- /dev/null +++ b/android/app/src/test/kotlin/com/bluebubbles/messaging/services/backend_ui_interop/FlutterBackgroundIsolateEmbeddingContractTest.kt @@ -0,0 +1,113 @@ +package com.bluebubbles.messaging.services.backend_ui_interop + +import java.io.File +import org.junit.Assert.assertFalse +import org.junit.Assert.assertTrue +import org.junit.Test + +class FlutterBackgroundIsolateEmbeddingContractTest { + private val sourceRoot = locateSourceRoot() + + @Test + fun `background isolate paths use the current Flutter loader`() { + for (source in backgroundIsolateSources()) { + assertTrue( + "${source.name} must obtain FlutterLoader from FlutterInjector", + source.text.contains("FlutterInjector.instance().flutterLoader()"), + ) + assertOrdered( + source, + "flutterLoader.startInitialization(", + "flutterLoader.ensureInitializationComplete(", + "flutterLoader.findAppBundlePath()", + "DartExecutor.DartCallback(", + "executeDartCallback(callback)", + ) + } + } + + @Test + fun `callback handles retain their exact shared preference keys`() { + val worker = readSource( + "services/backend_ui_interop/DartWorker.kt", + ) + val nativeSync = readSource( + "services/system/NativeSyncIsolateHandler.kt", + ) + + assertTrue( + worker.text.contains( + "FlutterCallbackInformation.lookupCallbackInformation(", + ), + ) + assertTrue(worker.text.contains("\"flutter.backgroundCallbackHandle\"")) + assertTrue( + nativeSync.text.contains( + "FlutterCallbackInformation.lookupCallbackInformation(", + ), + ) + assertTrue(nativeSync.text.contains("\"flutter.backgroundSyncIsolate\"")) + } + + @Test + fun `background isolate sources contain no removed v1 embedding APIs`() { + val removedApis = listOf( + "io.flutter.view.Flutter" + "Main", + "Flutter" + "Main.", + "PluginRegistry." + "Registrar", + "ShimPlugin" + "Registry", + "Shim" + "Registrar", + ) + + for (source in backgroundIsolateSources()) { + for (removedApi in removedApis) { + assertFalse( + "${source.name} still references removed API $removedApi", + source.text.contains(removedApi), + ) + } + } + } + + private fun backgroundIsolateSources(): List = listOf( + readSource("services/backend_ui_interop/DartWorker.kt"), + readSource("services/system/NativeSyncIsolateHandler.kt"), + ) + + private fun readSource(relativePath: String): KotlinSource { + val file = File(sourceRoot, relativePath) + assertTrue("Missing Android source file: ${file.absolutePath}", file.isFile) + return KotlinSource(file.name, file.readText()) + } + + private fun assertOrdered(source: KotlinSource, vararg snippets: String) { + var previousIndex = -1 + for (snippet in snippets) { + val index = source.text.indexOf(snippet) + assertTrue( + "${source.name} is missing or reorders '$snippet'", + index > previousIndex, + ) + previousIndex = index + } + } + + private data class KotlinSource( + val name: String, + val text: String, + ) + + companion object { + private fun locateSourceRoot(): File { + val candidates = listOf( + File("src/main/kotlin/com/bluebubbles/messaging"), + File("android/app/src/main/kotlin/com/bluebubbles/messaging"), + ) + return candidates.firstOrNull(File::isDirectory) + ?: error( + "Unable to locate Android source root from " + + File(".").absolutePath, + ) + } + } +} diff --git a/android/app/src/test/kotlin/com/bluebubbles/messaging/services/facetime/CachedWebviewTest.kt b/android/app/src/test/kotlin/com/bluebubbles/messaging/services/facetime/CachedWebviewTest.kt new file mode 100644 index 0000000000..fac30b0230 --- /dev/null +++ b/android/app/src/test/kotlin/com/bluebubbles/messaging/services/facetime/CachedWebviewTest.kt @@ -0,0 +1,21 @@ +package com.bluebubbles.messaging.services.facetime + +import org.junit.Assert.assertEquals +import org.junit.Test + +class CachedWebviewTest { + @Test + fun `javascript string literal escapes injection characters and line separators`() { + val value = "A\"B\\C\nD\rE\u2028F\u2029G\u0000H" + + assertEquals( + "\"A\\\"B\\\\C\\nD\\rE\\u2028F\\u2029G\\u0000H\"", + CachedWebview.javascriptStringLiteral(value), + ) + } + + @Test + fun `javascript string literal preserves ordinary unicode`() { + assertEquals("\"Rami 👋 مرحبًا\"", CachedWebview.javascriptStringLiteral("Rami 👋 مرحبًا")) + } +} diff --git a/android/app/src/test/kotlin/com/bluebubbles/messaging/services/facetime/FaceTimeDiagnosticsTest.kt b/android/app/src/test/kotlin/com/bluebubbles/messaging/services/facetime/FaceTimeDiagnosticsTest.kt new file mode 100644 index 0000000000..8e22b66c88 --- /dev/null +++ b/android/app/src/test/kotlin/com/bluebubbles/messaging/services/facetime/FaceTimeDiagnosticsTest.kt @@ -0,0 +1,36 @@ +package com.bluebubbles.messaging.services.facetime + +import org.junit.Assert.assertEquals +import org.junit.Assert.assertFalse +import org.junit.Assert.assertTrue +import org.junit.Test + +class FaceTimeDiagnosticsTest { + @Test + fun diagnosticsRequireDeveloperModeAndExplicitOptIn() { + assertFalse(FaceTimeDiagnostics.shouldEnable(false, false)) + assertFalse(FaceTimeDiagnostics.shouldEnable(false, true)) + assertFalse(FaceTimeDiagnostics.shouldEnable(true, false)) + assertTrue(FaceTimeDiagnostics.shouldEnable(true, true)) + } + + @Test + fun structuredStagesContainOnlyRedactedFields() { + val line = FaceTimeDiagnostics.formatStage( + stage = FaceTimeDiagnosticStage.MEDIA_BYTES, + state = "Connected", + count = 2, + bytes = 4096, + ) + + assertEquals("stage=media_bytes state=connected count=2 bytes=4096", line) + assertFalse(line.contains("http", ignoreCase = true)) + assertFalse(line.contains("sdp", ignoreCase = true)) + } + + @Test + fun unknownIceStateIsRedacted() { + assertEquals("connected", FaceTimeDiagnostics.safeIceState("connected")) + assertEquals("unknown", FaceTimeDiagnostics.safeIceState("secret-token")) + } +} diff --git a/android/app/src/test/kotlin/com/bluebubbles/messaging/services/facetime/FaceTimeJoinPolicyTest.kt b/android/app/src/test/kotlin/com/bluebubbles/messaging/services/facetime/FaceTimeJoinPolicyTest.kt new file mode 100644 index 0000000000..549bde47d7 --- /dev/null +++ b/android/app/src/test/kotlin/com/bluebubbles/messaging/services/facetime/FaceTimeJoinPolicyTest.kt @@ -0,0 +1,213 @@ +package com.bluebubbles.messaging.services.facetime + +import org.junit.Assert.assertEquals +import org.junit.Assert.assertFalse +import org.junit.Assert.assertTrue +import org.junit.Test + +class FaceTimeJoinPolicyTest { + @Test + fun clickedRequestsAdmissionButDoesNotClaimJoined() { + val decision = FaceTimeJoinPolicy().record("\"clicked\"") + + assertEquals(FaceTimeJoinOutcome.CLICKED, decision.outcome) + assertTrue(decision.revealManualRecovery.not()) + assertFalse(decision.joined) + assertTrue(decision.retry) + } + + @Test + fun visibleLeaveButtonIsNotConnectionEvidence() { + val policy = FaceTimeJoinPolicy() + + val action = policy.record("\"already-joined\"") + assertFalse(action.joined) + val decision = policy.recordMediaEvidence( + FaceTimeMediaEvidence( + iceState = FaceTimeIceState.CHECKING, + remoteAudioTracks = 0, + remoteVideoTracks = 0, + mediaBytes = null, + webLeaveVisible = true, + ) + ) + + assertTrue(policy.admissionRequested) + assertFalse(decision.joined) + assertEquals(FaceTimeJoinOutcome.MEDIA_PENDING, decision.outcome) + } + + @Test + fun connectedIceAndRemoteAudioAdmitAudioOnlyCall() { + val policy = FaceTimeJoinPolicy() + policy.record("\"clicked\"") + + policy.recordMediaEvidence( + FaceTimeMediaEvidence( + iceState = FaceTimeIceState.CONNECTED, + remoteAudioTracks = 1, + remoteVideoTracks = 0, + mediaBytes = 64, + webLeaveVisible = true, + peerId = 1, + ) + ) + + val decision = policy.recordMediaEvidence( + FaceTimeMediaEvidence( + iceState = FaceTimeIceState.CONNECTED, + remoteAudioTracks = 1, + remoteVideoTracks = 0, + mediaBytes = 128, + webLeaveVisible = true, + peerId = 1, + ) + ) + + assertTrue(decision.joined) + assertFalse(decision.retry) + assertEquals(FaceTimeJoinOutcome.MEDIA_CONNECTED, decision.outcome) + } + + @Test + fun failedIceDoesNotAdmitCall() { + val policy = FaceTimeJoinPolicy() + policy.record("\"clicked\"") + + val decision = policy.recordMediaEvidence( + FaceTimeMediaEvidence( + iceState = FaceTimeIceState.FAILED, + remoteAudioTracks = 1, + remoteVideoTracks = 1, + mediaBytes = 0, + webLeaveVisible = false, + ) + ) + + assertFalse(decision.joined) + assertEquals(FaceTimeJoinOutcome.MEDIA_FAILED, decision.outcome) + assertTrue(decision.retry) + } + + @Test + fun mediaLossClearsJoinedButDoesNotBlindlyRetryAfterCompletedJoin() { + val policy = FaceTimeJoinPolicy() + policy.record("\"clicked\"") + policy.recordMediaEvidence( + FaceTimeMediaEvidence( + iceState = FaceTimeIceState.CONNECTED, + remoteAudioTracks = 1, + remoteVideoTracks = 1, + mediaBytes = 512, + webLeaveVisible = true, + peerId = 1, + ) + ) + assertTrue(policy.recordMediaEvidence( + FaceTimeMediaEvidence( + iceState = FaceTimeIceState.CONNECTED, + remoteAudioTracks = 1, + remoteVideoTracks = 1, + mediaBytes = 1024, + webLeaveVisible = true, + peerId = 1, + ) + ).joined) + + val decision = policy.recordMediaEvidence( + FaceTimeMediaEvidence( + iceState = FaceTimeIceState.DISCONNECTED, + remoteAudioTracks = 0, + remoteVideoTracks = 0, + mediaBytes = null, + webLeaveVisible = true, + ) + ) + + assertFalse(decision.joined) + assertTrue(policy.completedJoin) + assertEquals(FaceTimeJoinOutcome.MEDIA_PENDING, decision.outcome) + assertFalse(decision.retry) + } + + @Test + fun delayedEvidenceCanAdmitAfterMultipleJoinAttempts() { + val policy = FaceTimeJoinPolicy(manualRecoveryAttempt = 2, maxAttempts = 4) + + assertFalse(policy.record("\"missing\"").joined) + assertFalse(policy.record("\"clicked\"").joined) + policy.recordMediaEvidence( + FaceTimeMediaEvidence( + iceState = FaceTimeIceState.COMPLETED, + remoteAudioTracks = 1, + remoteVideoTracks = 1, + mediaBytes = 1024, + webLeaveVisible = true, + peerId = 1, + ) + ) + assertTrue(policy.recordMediaEvidence( + FaceTimeMediaEvidence( + iceState = FaceTimeIceState.COMPLETED, + remoteAudioTracks = 1, + remoteVideoTracks = 1, + mediaBytes = 2048, + webLeaveVisible = true, + peerId = 1, + ) + ).joined) + } + + @Test + fun retriesEventuallyStopWithoutClaimingJoined() { + val policy = FaceTimeJoinPolicy(manualRecoveryAttempt = 1, maxAttempts = 2) + + policy.record("\"disabled\"") + val finalDecision = policy.record(null) + + assertEquals(FaceTimeJoinOutcome.UNKNOWN, finalDecision.outcome) + assertTrue(finalDecision.revealManualRecovery) + assertFalse(finalDecision.retry) + assertFalse(finalDecision.joined) + } + + @Test + fun duplicateIntentDoesNotReplaceActiveCall() { + val lifecycle = FaceTimeCallLifecycle() + + assertEquals(FaceTimeIntentDisposition.ACCEPTED, lifecycle.acceptIntent("call-a")) + assertEquals(FaceTimeIntentDisposition.DUPLICATE, lifecycle.acceptIntent("call-a")) + assertEquals( + FaceTimeIntentDisposition.REJECTED_MISMATCHED_CALL, + lifecycle.acceptIntent("call-b"), + ) + assertEquals( + FaceTimeIntentDisposition.REJECTED_MISSING_CALL_ID, + lifecycle.acceptIntent(null), + ) + } + + @Test + fun lifecycleCanAcceptNewCallAfterReset() { + val lifecycle = FaceTimeCallLifecycle() + + lifecycle.acceptIntent("call-a") + lifecycle.reset() + + assertEquals(FaceTimeIntentDisposition.ACCEPTED, lifecycle.acceptIntent("call-b")) + } + + @Test + fun nativeEndRemainsAvailableAndMovesAwayFromWebLeave() { + assertTrue(FaceTimeControlPolicy.shouldShowNativeEndControl()) + assertEquals(FaceTimeNativeEndPlacement.TOP_RIGHT, FaceTimeControlPolicy.nativeEndPlacement(false)) + assertEquals(FaceTimeNativeEndPlacement.BOTTOM_LEFT, FaceTimeControlPolicy.nativeEndPlacement(true)) + } + + @Test + fun connectionProbeWindowAllowsLateMediaWithoutExtendingJoinRetries() { + assertEquals(80, FaceTimeConnectionProbePolicy.maxProbes) + assertTrue(FaceTimeConnectionProbePolicy.pendingDelayMillis in 750L..1500L) + assertTrue(FaceTimeConnectionProbePolicy.initialDelayMillis < FaceTimeConnectionProbePolicy.pendingDelayMillis) + } +} diff --git a/android/app/src/test/kotlin/com/bluebubbles/messaging/services/facetime/FaceTimeMediaAdmissionReplayTest.kt b/android/app/src/test/kotlin/com/bluebubbles/messaging/services/facetime/FaceTimeMediaAdmissionReplayTest.kt new file mode 100644 index 0000000000..cc6719ed0a --- /dev/null +++ b/android/app/src/test/kotlin/com/bluebubbles/messaging/services/facetime/FaceTimeMediaAdmissionReplayTest.kt @@ -0,0 +1,227 @@ +package com.bluebubbles.messaging.services.facetime + +import org.junit.Assert.assertEquals +import org.junit.Assert.assertFalse +import org.junit.Assert.assertTrue +import org.junit.Test + +class FaceTimeMediaAdmissionReplayTest { + @Test + fun replaysPendingToConnectedMediaAdmissionAndMediaLoss() { + val policy = FaceTimeJoinPolicy() + + val checking = policy.recordMediaEvidence( + evidence( + iceState = FaceTimeIceState.CHECKING, + remoteAudioTracks = 0, + remoteVideoTracks = 0, + mediaBytes = null, + peerId = null, + ), + ) + assertFalse(checking.joined) + assertEquals(FaceTimeJoinOutcome.MEDIA_PENDING, checking.outcome) + + val failed = policy.recordMediaEvidence( + evidence( + iceState = FaceTimeIceState.FAILED, + remoteAudioTracks = 0, + remoteVideoTracks = 0, + mediaBytes = null, + peerId = null, + ), + ) + assertFalse(failed.joined) + assertEquals(FaceTimeJoinOutcome.MEDIA_FAILED, failed.outcome) + + val connectedWithoutTrack = policy.recordMediaEvidence( + evidence( + iceState = FaceTimeIceState.CONNECTED, + remoteAudioTracks = 0, + remoteVideoTracks = 0, + mediaBytes = 0, + peerId = 7, + ), + ) + assertFalse(connectedWithoutTrack.joined) + assertEquals(FaceTimeJoinOutcome.MEDIA_PENDING, connectedWithoutTrack.outcome) + + val zeroInboundBytes = policy.recordMediaEvidence( + evidence( + iceState = FaceTimeIceState.CONNECTED, + remoteAudioTracks = 1, + remoteVideoTracks = 1, + mediaBytes = 0, + peerId = 7, + ), + ) + assertFalse(zeroInboundBytes.joined) + assertEquals(FaceTimeJoinOutcome.MEDIA_PENDING, zeroInboundBytes.outcome) + + val firstInboundSample = policy.recordMediaEvidence( + evidence( + iceState = FaceTimeIceState.CONNECTED, + remoteAudioTracks = 1, + remoteVideoTracks = 1, + mediaBytes = 128, + peerId = 7, + ), + ) + assertFalse(firstInboundSample.joined) + + val admitted = policy.recordMediaEvidence( + evidence( + iceState = FaceTimeIceState.CONNECTED, + remoteAudioTracks = 1, + remoteVideoTracks = 1, + mediaBytes = 256, + peerId = 7, + ), + ) + assertTrue(admitted.joined) + assertEquals(FaceTimeJoinOutcome.MEDIA_CONNECTED, admitted.outcome) + + val mediaLoss = policy.recordMediaEvidence( + evidence( + iceState = FaceTimeIceState.DISCONNECTED, + remoteAudioTracks = 0, + remoteVideoTracks = 0, + mediaBytes = null, + peerId = null, + ), + ) + assertFalse(mediaLoss.joined) + assertEquals(FaceTimeJoinOutcome.MEDIA_PENDING, mediaLoss.outcome) + assertTrue(policy.completedJoin) + assertFalse(mediaLoss.retry) + } + + @Test + fun connectedVideoOnlyCallAdmitsVideoWithoutAudio() { + val policy = FaceTimeJoinPolicy() + policy.recordMediaEvidence( + FaceTimeMediaEvidence( + iceState = FaceTimeIceState.CONNECTED, + remoteAudioTracks = 0, + remoteVideoTracks = 1, + mediaBytes = 64, + webLeaveVisible = true, + peerId = 1, + ), + ) + val decision = policy.recordMediaEvidence( + FaceTimeMediaEvidence( + iceState = FaceTimeIceState.CONNECTED, + remoteAudioTracks = 0, + remoteVideoTracks = 1, + mediaBytes = 128, + webLeaveVisible = true, + peerId = 1, + ), + ) + + assertTrue(decision.joined) + } + + @Test + fun zeroInboundBytesMustNotAdmitEvenWhenRemoteTracksExist() { + val decision = FaceTimeJoinPolicy().recordMediaEvidence( + FaceTimeMediaEvidence( + iceState = FaceTimeIceState.CONNECTED, + remoteAudioTracks = 1, + remoteVideoTracks = 1, + mediaBytes = 0, + webLeaveVisible = true, + peerId = 1, + ), + ) + + assertFalse("a connected track with no inbound bytes is not verified media", decision.joined) + } + + @Test + fun inboundBytesMustIncreaseBeforeMediaIsAdmitted() { + val policy = FaceTimeJoinPolicy() + + val firstSample = policy.recordMediaEvidence( + FaceTimeMediaEvidence( + iceState = FaceTimeIceState.CONNECTED, + remoteAudioTracks = 1, + remoteVideoTracks = 1, + mediaBytes = 128, + webLeaveVisible = true, + peerId = 1, + ), + ) + val secondSample = policy.recordMediaEvidence( + FaceTimeMediaEvidence( + iceState = FaceTimeIceState.CONNECTED, + remoteAudioTracks = 1, + remoteVideoTracks = 1, + mediaBytes = 256, + webLeaveVisible = true, + peerId = 1, + ), + ) + + assertFalse("one positive counter sample does not prove media is flowing", firstSample.joined) + assertTrue("a later larger counter sample proves inbound progress", secondSample.joined) + } + + @Test + fun peerReplacementRequiresASecondSampleFromTheNewPeer() { + val policy = FaceTimeJoinPolicy() + policy.recordMediaEvidence(connectedEvidence(peerId = 1, mediaBytes = 100)) + val replacement = policy.recordMediaEvidence(connectedEvidence(peerId = 2, mediaBytes = 200)) + val confirmed = policy.recordMediaEvidence(connectedEvidence(peerId = 2, mediaBytes = 250)) + + assertFalse(replacement.joined) + assertTrue(confirmed.joined) + } + + @Test + fun counterResetRequiresTwoFreshPostResetSamples() { + val policy = FaceTimeJoinPolicy() + policy.recordMediaEvidence(connectedEvidence(peerId = 1, mediaBytes = 100)) + val reset = policy.recordMediaEvidence(connectedEvidence(peerId = 1, mediaBytes = 0)) + val firstAfterReset = policy.recordMediaEvidence(connectedEvidence(peerId = 1, mediaBytes = 1)) + val advancingAfterReset = policy.recordMediaEvidence(connectedEvidence(peerId = 1, mediaBytes = 2)) + + assertFalse(reset.joined) + assertFalse(firstAfterReset.joined) + assertTrue(advancingAfterReset.joined) + } + + @Test + fun missingPeerIdentityCannotAdmitMedia() { + val policy = FaceTimeJoinPolicy() + policy.recordMediaEvidence(connectedEvidence(peerId = null, mediaBytes = 100)) + val decision = policy.recordMediaEvidence(connectedEvidence(peerId = null, mediaBytes = 200)) + + assertFalse(decision.joined) + } + + private fun connectedEvidence(peerId: Int?, mediaBytes: Long) = FaceTimeMediaEvidence( + iceState = FaceTimeIceState.CONNECTED, + remoteAudioTracks = 1, + remoteVideoTracks = 1, + mediaBytes = mediaBytes, + webLeaveVisible = true, + peerId = peerId, + ) + + private fun evidence( + iceState: FaceTimeIceState, + remoteAudioTracks: Int, + remoteVideoTracks: Int, + mediaBytes: Long?, + peerId: Int?, + ) = FaceTimeMediaEvidence( + iceState = iceState, + remoteAudioTracks = remoteAudioTracks, + remoteVideoTracks = remoteVideoTracks, + mediaBytes = mediaBytes, + webLeaveVisible = true, + peerId = peerId, + ) +} diff --git a/android/app/src/test/kotlin/com/bluebubbles/messaging/services/facetime/FaceTimeMediaEvidenceParserTest.kt b/android/app/src/test/kotlin/com/bluebubbles/messaging/services/facetime/FaceTimeMediaEvidenceParserTest.kt new file mode 100644 index 0000000000..086122fc6e --- /dev/null +++ b/android/app/src/test/kotlin/com/bluebubbles/messaging/services/facetime/FaceTimeMediaEvidenceParserTest.kt @@ -0,0 +1,111 @@ +package com.bluebubbles.messaging.services.facetime + +import org.junit.Assert.assertEquals +import org.junit.Assert.assertNull +import org.junit.Assert.assertTrue +import org.junit.Test + +class FaceTimeMediaEvidenceParserTest { + @Test + fun nullAndEmptyJavascriptResultsAreUnavailable() { + assertNull(FaceTimeMediaEvidenceParser.parse(null)) + assertNull(FaceTimeMediaEvidenceParser.parse("null")) + assertNull(FaceTimeMediaEvidenceParser.parse(" undefined ")) + assertNull(FaceTimeMediaEvidenceParser.parse("")) + } + + @Test + fun parsesEscapedEvaluateJavascriptJson() { + val json = """{"peerId":7,"iceState":"connected","remoteAudioTracks":1,"remoteVideoTracks":1,"mediaBytes":128,"webLeaveVisible":true}""" + + val evidence = FaceTimeMediaEvidenceParser.parse(asEvaluateJavascriptString(json)) + + assertEquals(FaceTimeIceState.CONNECTED, evidence?.iceState) + assertEquals(7, evidence?.peerId) + assertEquals(1, evidence?.remoteAudioTracks) + assertEquals(1, evidence?.remoteVideoTracks) + assertEquals(128L, evidence?.mediaBytes) + assertTrue(evidence?.webLeaveVisible == true) + assertTrue(evidence?.isConnected == true) + } + + @Test + fun parsesDirectJsonObjectToo() { + val evidence = FaceTimeMediaEvidenceParser.parse( + """{"iceState":"completed","remoteAudioTracks":1,"remoteVideoTracks":0}""" + ) + + assertEquals(FaceTimeIceState.COMPLETED, evidence?.iceState) + assertEquals(1, evidence?.remoteAudioTracks) + assertEquals(0, evidence?.remoteVideoTracks) + assertNull(evidence?.mediaBytes) + } + + @Test + fun malformedOuterOrInnerJsonReturnsUnavailable() { + assertNull(FaceTimeMediaEvidenceParser.parse("{not-json")) + assertNull(FaceTimeMediaEvidenceParser.parse(asEvaluateJavascriptString("{not-json"))) + assertNull(FaceTimeMediaEvidenceParser.parse(asEvaluateJavascriptString("not an object"))) + } + + @Test + fun missingAndExplicitlyNullMediaBytesRemainNull() { + val missing = FaceTimeMediaEvidenceParser.parse( + """{"iceState":"connected","remoteAudioTracks":1}""" + ) + val explicitNull = FaceTimeMediaEvidenceParser.parse( + """{"iceState":"connected","remoteAudioTracks":1,"mediaBytes":null}""" + ) + + assertNull(missing?.mediaBytes) + assertNull(explicitNull?.mediaBytes) + } + + @Test + fun unknownIceStateIsSafeAndDoesNotClaimConnected() { + val evidence = FaceTimeMediaEvidenceParser.parse( + """{"iceState":"future-state","remoteAudioTracks":1,"remoteVideoTracks":1,"mediaBytes":1}""" + ) + + assertEquals(FaceTimeIceState.UNKNOWN, evidence?.iceState) + assertTrue(evidence?.hasRemoteTrack == true) + assertTrue(evidence?.isConnected == false) + } + + @Test + fun negativeCountersAndBytesClampToZero() { + val evidence = FaceTimeMediaEvidenceParser.parse( + """{"iceState":"connected","remoteAudioTracks":-2,"remoteVideoTracks":-9,"mediaBytes":-1}""" + ) + + assertEquals(0, evidence?.remoteAudioTracks) + assertEquals(0, evidence?.remoteVideoTracks) + assertEquals(0L, evidence?.mediaBytes) + assertTrue(evidence?.isConnected == false) + } + + @Test + fun oversizedValuesFailClosedWithoutOverflow() { + val evidence = FaceTimeMediaEvidenceParser.parse( + """{"iceState":"connected","remoteAudioTracks":999999999999999999999999999999,"remoteVideoTracks":1,"mediaBytes":999999999999999999999999999999999999999999999999999999999999}""" + ) + + assertEquals(Int.MAX_VALUE, evidence?.remoteAudioTracks) + assertEquals(1, evidence?.remoteVideoTracks) + assertNull(evidence?.mediaBytes) + } + + @Test + fun nonIntegralNumericValuesAreIgnoredSafely() { + val evidence = FaceTimeMediaEvidenceParser.parse( + """{"remoteAudioTracks":1.5,"remoteVideoTracks":"2.5","mediaBytes":"3.25"}""" + ) + + assertEquals(0, evidence?.remoteAudioTracks) + assertEquals(0, evidence?.remoteVideoTracks) + assertEquals(0L, evidence?.mediaBytes) + } + + private fun asEvaluateJavascriptString(json: String): String = + "\"" + json.replace("\\", "\\\\").replace("\"", "\\\"") + "\"" +} diff --git a/android/app/src/test/kotlin/com/bluebubbles/messaging/services/facetime/FaceTimePermissionPolicyTest.kt b/android/app/src/test/kotlin/com/bluebubbles/messaging/services/facetime/FaceTimePermissionPolicyTest.kt new file mode 100644 index 0000000000..db1be49321 --- /dev/null +++ b/android/app/src/test/kotlin/com/bluebubbles/messaging/services/facetime/FaceTimePermissionPolicyTest.kt @@ -0,0 +1,32 @@ +package com.bluebubbles.messaging.services.facetime + +import org.junit.Assert.assertFalse +import org.junit.Assert.assertTrue +import org.junit.Test + +class FaceTimePermissionPolicyTest { + @Test + fun startsServiceOnlyWhenEveryRequestedPermissionIsGranted() { + assertTrue(FaceTimePermissionPolicy.shouldStartInCallService(2, intArrayOf(0, 0))) + assertTrue(FaceTimePermissionPolicy.shouldStartInCallService(1, intArrayOf(0))) + } + + @Test + fun denialPartialGrantEmptyAndMismatchedResultsDoNotStartService() { + assertFalse(FaceTimePermissionPolicy.shouldStartInCallService(2, intArrayOf(0, -1))) + assertFalse(FaceTimePermissionPolicy.shouldStartInCallService(2, intArrayOf(-1, 0))) + assertFalse(FaceTimePermissionPolicy.shouldStartInCallService(2, intArrayOf(0))) + assertFalse(FaceTimePermissionPolicy.shouldStartInCallService(2, intArrayOf())) + assertFalse(FaceTimePermissionPolicy.shouldStartInCallService(0, intArrayOf())) + } + + @Test + fun permissionLookupRejectsMissingAndOutOfRangeResults() { + val results = intArrayOf(0, -1) + + assertTrue(FaceTimePermissionPolicy.isGranted(results, 0)) + assertFalse(FaceTimePermissionPolicy.isGranted(results, 1)) + assertFalse(FaceTimePermissionPolicy.isGranted(results, -1)) + assertFalse(FaceTimePermissionPolicy.isGranted(results, 2)) + } +} diff --git a/android/app/src/test/kotlin/com/bluebubbles/messaging/services/rustpush/CloudSyncV2WorkPolicyTest.kt b/android/app/src/test/kotlin/com/bluebubbles/messaging/services/rustpush/CloudSyncV2WorkPolicyTest.kt new file mode 100644 index 0000000000..292c7f247d --- /dev/null +++ b/android/app/src/test/kotlin/com/bluebubbles/messaging/services/rustpush/CloudSyncV2WorkPolicyTest.kt @@ -0,0 +1,56 @@ +package com.bluebubbles.messaging.services.rustpush + +import org.junit.Assert.assertEquals +import org.junit.Assert.assertFalse +import org.junit.Assert.assertNotEquals +import org.junit.Assert.assertTrue +import org.junit.Test + +class CloudSyncV2WorkPolicyTest { + @Test + fun `durable scheduling gate is closed by default`() { + assertFalse(CloudSyncV2WorkScheduler.schedulingEnabled) + } + + @Test + fun `metadata work is battery safe and coalesces for fifteen seconds`() { + val policy = CloudSyncV2WorkPolicy.forKind(CloudSyncV2WorkKind.METADATA) + + assertEquals(CloudSyncV2NetworkRequirement.CONNECTED, policy.networkRequirement) + assertTrue(policy.requiresBatteryNotLow) + assertTrue(policy.requiresStorageNotLow) + assertEquals(15_000L, policy.initialDelayMillis) + assertFalse(policy.requestsExpeditedExecution) + } + + @Test + fun `automatic media requires unmetered network`() { + val policy = CloudSyncV2WorkPolicy.forKind(CloudSyncV2WorkKind.AUTOMATIC_MEDIA) + + assertEquals(CloudSyncV2NetworkRequirement.UNMETERED, policy.networkRequirement) + assertTrue(policy.requiresBatteryNotLow) + assertTrue(policy.requiresStorageNotLow) + assertFalse(policy.requestsExpeditedExecution) + } + + @Test + fun `user visible work is explicitly modeled but never expedited`() { + val policy = CloudSyncV2WorkPolicy.forKind(CloudSyncV2WorkKind.USER_VISIBLE_MANUAL) + + assertEquals(CloudSyncV2NetworkRequirement.CONNECTED, policy.networkRequirement) + assertFalse(policy.requestsExpeditedExecution) + } + + @Test + fun `unique work name hashes the complete scope and does not expose it`() { + val scope = "account-fingerprint\u001fcontainer\u001fprivate\u001fzone\u001fmessages\u001f2" + val name = CloudSyncV2WorkScheduler.uniqueWorkNameForScopeKey(scope) + + assertTrue(name.startsWith("cloud-sync-v2/")) + assertFalse(name.contains("account-fingerprint")) + assertNotEquals( + name, + CloudSyncV2WorkScheduler.uniqueWorkNameForScopeKey("$scope-other"), + ) + } +} diff --git a/android/app/src/test/kotlin/com/bluebubbles/messaging/services/rustpush/PendingApnDispatchQueueTest.kt b/android/app/src/test/kotlin/com/bluebubbles/messaging/services/rustpush/PendingApnDispatchQueueTest.kt new file mode 100644 index 0000000000..978c9fd5e2 --- /dev/null +++ b/android/app/src/test/kotlin/com/bluebubbles/messaging/services/rustpush/PendingApnDispatchQueueTest.kt @@ -0,0 +1,78 @@ +package com.bluebubbles.messaging.services.rustpush + +import org.junit.Assert.assertEquals +import org.junit.Assert.assertFalse +import org.junit.Assert.assertTrue +import org.junit.Test + +class PendingApnDispatchQueueTest { + @Test + fun `coalesces retries without changing dispatch order`() { + val queue = PendingApnDispatchQueue(capacity = 4) + + queue.enqueue(pointer = 10UL, retry = 0UL) + queue.enqueue(pointer = 20UL, retry = 0UL) + val duplicate = queue.enqueue(pointer = 10UL, retry = 2UL) + + assertFalse(duplicate.added) + assertFalse(duplicate.evicted) + assertEquals(2, duplicate.size) + assertEquals( + listOf( + PendingApnDispatch(pointer = 10UL, retry = 2UL), + PendingApnDispatch(pointer = 20UL, retry = 0UL), + ), + queue.drain(), + ) + } + + @Test + fun `evicts only the oldest Android dispatch when capacity is reached`() { + val queue = PendingApnDispatchQueue(capacity = 2) + + queue.enqueue(pointer = 10UL, retry = 0UL) + queue.enqueue(pointer = 20UL, retry = 0UL) + val overflow = queue.enqueue(pointer = 30UL, retry = 1UL) + + assertTrue(overflow.added) + assertTrue(overflow.evicted) + assertEquals(2, overflow.size) + assertEquals( + listOf( + PendingApnDispatch(pointer = 20UL, retry = 0UL), + PendingApnDispatch(pointer = 30UL, retry = 1UL), + ), + queue.drain(), + ) + } + + @Test + fun `drain is deterministic and empties the buffer`() { + val queue = PendingApnDispatchQueue(capacity = 3) + + queue.enqueue(pointer = 1UL, retry = 0UL) + queue.enqueue(pointer = 2UL, retry = 1UL) + + assertEquals(listOf(1UL, 2UL), queue.drain().map { it.pointer }) + assertTrue(queue.drain().isEmpty()) + assertEquals(0, queue.clear()) + } + + @Test + fun `headless handoff removes stale pointer before a later retry`() { + val queue = PendingApnDispatchQueue(capacity = 3) + + queue.enqueue(pointer = 7UL, retry = 0UL) + val handedOff = queue.drain() + queue.enqueue(pointer = 7UL, retry = 1UL) + + assertEquals( + listOf(PendingApnDispatch(pointer = 7UL, retry = 0UL)), + handedOff, + ) + assertEquals( + listOf(PendingApnDispatch(pointer = 7UL, retry = 1UL)), + queue.drain(), + ) + } +} diff --git a/android/gradle.properties b/android/gradle.properties index 3313a4d1da..d0089e0542 100644 --- a/android/gradle.properties +++ b/android/gradle.properties @@ -1,3 +1,7 @@ org.gradle.jvmargs=-Xmx6400M android.useAndroidX=true android.enableJetifier=true +# This builtInKotlin flag was added automatically by Flutter migrator +android.builtInKotlin=false +# This newDsl flag was added automatically by Flutter migrator +android.newDsl=false diff --git a/docs/CLOUD_SYNC_V2.md b/docs/CLOUD_SYNC_V2.md new file mode 100644 index 0000000000..65df923f27 --- /dev/null +++ b/docs/CLOUD_SYNC_V2.md @@ -0,0 +1,616 @@ +--- +type: architecture_plan +title: OpenBubbles Cloud Sync V2 +description: Safety-first architecture for message reconciliation across Pixel Android, Windows ARM64, and Windows x64. +resource: openbubbles-app +tags: [android, pixel, windows, arm64, x64, cloudkit, sync, objectbox, rust, security] +timestamp: 2026-07-31 +--- + +# OpenBubbles Cloud Sync V2 + +## Decision + +Build one architecture-neutral Cloud Sync V2 engine for Android, Windows ARM64, +and Windows x64. Keep IDS as the live messaging path, ObjectBox as the local +source of truth, and Apple's private Messages CloudKit container as a delayed +reconciliation layer. + +Do not enable new CloudKit writes until Windows secret storage, durable +checkpoints, and a read-only shadow-sync phase pass the gates in this document. +Do not automatically reset an iCloud Keychain clique or delete CloudKit zones. + +## Why this boundary + +The current implementation talks to Apple's private +`com.apple.messages.cloud` container. It does not use a supported public +CloudKit SDK or a documented third-party contract. It requires Apple +authentication, CloudKit tokens, iCloud Keychain clique membership, and PCS +keys. Apple can change the protocol or server policy without notice. + +CloudKit is therefore useful for eventual reconciliation, but it is the wrong +place to put latency-sensitive message delivery. A CloudKit outage must never +delay IDS sends, incoming pushes, local persistence, or UI updates. + +## Current implementation findings + +| Finding | Evidence | Risk | +| --- | --- | --- | +| Private Apple Messages container | `rustpush/src/imessage/cloud_messages.rs`, container declaration | No supported compatibility guarantee | +| Three implemented zones | `chatManateeZone`, `messageManateeZone`, and `attachmentManateeZone` | Other Apple zones and features are not synchronized | +| SharedPreferences checkpoints | `chatSyncToken`, `messageSyncToken`, and `attachmentSyncToken` in `rustpush_service.dart` | Tokens are not account-scoped or transactionally coupled to applied data | +| Fixed retries | Three attempts with a constant five-second delay in `cloud_messages.rs` | Restarts and outages can cause retry bursts | +| Static desktop encryption key | `SoftwareEncryptor(*b"desktopisinsecureyoushouldn'tber")` in `rust/src/api/api.rs` | Apple secrets are not protected by the Windows user account | +| Daily/startup scheduling | Timers in `rustpush_service.dart` | Not real-time and not durable across crashes | +| Existing-GUID short circuit | Current pull logic updates limited CloudKit state for some existing messages | Reads, edits, retractions, and other mutable state can remain stale | +| Random server record IDs | Upload path and later logical-GUID deduplication | Two clients can race and create duplicate logical records | + +The current uncommitted `cloud_message_upload_state.dart` logic is worth +preserving. It serializes operations and treats only explicit per-record success +as confirmation. Missing or failed response entries remain retryable. + +### Uncommitted implementation snapshot (2026-08-01) + +The current working tree now contains the Phase 0 foundation and a dormant +Phase 1 read-only path: + +- Rust returns one ordered, bounded raw page for the chat, message, or + attachment zone. It preserves tombstones and malformed or unsupported records + for quarantine and applies request and response size limits. Dart additionally + enforces a 32 MiB whole-page admission before the first protector call, + including binary payloads, UTF-8 metadata, continuation token, and + conservative object overhead. The uncommitted native path now preserves + HTTP `Retry-After` and maps repeated continuation tokens to a typed, + nonretryable no-progress failure. Those new bridge and rustpush tests still + require a clean ARM64 and x64 native compile before the gate is closed. +- The V2 transport adapter exposes that page through generated Flutter Rust + Bridge bindings and refuses every V2 write/delete operation. The wider + generated API still contains legacy CloudKit mutation methods, so a live V2 + composition also needs an explicit write-call tripwire. +- A second, narrower protected-fetch bridge now keeps raw CloudKit record + names, etags, tombstone payloads, encrypted envelopes, and continuation + tokens in Rust. Its Dart transport receives only keyed digests, bounded safe + scalars, fixed codes, `obcs2.ref.*` protected capabilities, and + `obcs2.lease.*` adoption leases. It is generated and contract-tested but + remains absent from runtime composition. Native protected-blob liveness and + bounded garbage collection, concrete semantic decoding, platform reopen + tests, and process-kill testing are required before it may replace the raw + shadow transport. +- Dart converts each record into one authenticated protected envelope before + journaling. Persisted record IDs, etags, change tags, and batch identifiers are + hashed; raw account identifiers are limited to the native HMAC boundary. +- Cloud Sync journal values on Windows use current-user DPAPI plus a per-install + HMAC secret. Android uses AES-256-GCM with a non-auth-bound Android Keystore + key. Protection context includes account, container, database, zone, stream, + schema, and purpose. The broader Windows Apple-keystore initialization still + contains a legacy static software-encryption path and must be migrated before + Windows live testing. +- A preflight-invalid record is journaled and quarantined without invoking the + semantic decoder. A page that exceeds the entry, byte, age, or generation + boundary is rejected atomically with no continuation-token movement. +- Automatic startup, network, IDS, and gap triggers remain disabled. Existing + message tables and Apple's CloudKit container are not mutated by this path. + Runtime disposal is idempotent and waits for active work to become quiescent + before an account can replace its credentials. +- Incoming attachment materialization now has a durable, account- and + generation-scoped state machine. It records only protected references and a + contiguous native-verified byte boundary. A crash tail is truncated back to + that boundary, an incomplete verified prefix restarts from zero, and a final + file cannot be referenced until content verification and atomic placement + have both completed. + +Local validation re-measured on 2026-08-06 on a Windows-on-ARM host: + +- 294 Cloud Sync Dart/ObjectBox tests pass on both the ARM64 and the x64 Dart + test host, with a clean focused analyzer. +- 388 tests pass across the whole Dart suite. +- The standalone `cloud_sync_protector_harness` passes 39 tests on ARM64. +- 12 Alpha Kotlin/JUnit tests pass, including Kotlin compilation. +- `cargo check --locked --all-targets` is clean for + `aarch64-pc-windows-msvc`, and release libraries build for + `aarch64-pc-windows-msvc`, `x86_64-pc-windows-msvc`, and + `aarch64-linux-android` with the expected PE and ELF machine types. + +`cargo test` on the main crate is currently blocked by this host's Smart App +Control policy rather than by the repository; see +[Windows host build environment](WINDOWS_HOST_BUILD_ENVIRONMENT.md). + +This is still not live CloudKit, native semantic-decoder, crash-injection, or +physical-device validation. The native bridge must also compile after every +binding regeneration before any app build is considered installable. + +## Architecture + +```text +IDS receive/send + | + v +Semantic message upsert <---- Cloud inbox apply + | ^ + v | +ObjectBox source of truth Cloud fetch journal + | + +---- local mutation ----> Cloud outbox + | + v + Rust Apple transport/crypto +``` + +The same semantic upsert pipeline must process IDS events and CloudKit changes. +This prevents the two transports from implementing different merge behavior. + +Suggested Dart module: + +```text +lib/services/rustpush/cloud_sync/ + cloud_sync_engine.dart + cloud_sync_store.dart + cloud_merge_policy.dart + cloud_sync_scheduler.dart + cloud_sync_observability.dart +``` + +Rust should retain Apple protocol, authentication, PCS, and cryptography work. +The existing `rustpush_service.dart` should become a thin facade rather than +owning sync transactions and retry policy. + +## Durable records + +Use ObjectBox records rather than SharedPreferences for Cloud Sync V2 state. + +### `CloudSyncCheckpoint` + +- Account fingerprint, never a raw DSID +- Container, database, zone, typed stream, and schema version +- Fetched server token +- Last completed apply position +- Last successful run and last error category + +Every inbox, outbox, record-map, lease, and run row stores the same hashed +scope key. Querying by account plus zone alone is forbidden because a zone name +can be reused across containers, databases, streams, or schema generations. + +### `CloudInboxChange` + +- Account fingerprint and zone +- Server record ID hash and etag +- Change type +- Original PCS ciphertext or an encrypted local reference. Do not duplicate + decrypted message content in the sync journal. +- Fetch sequence +- `pending`, `applied`, or `quarantined` status +- Typed failure category and retry count + +### `CloudOutboxOperation` + +- Stable local operation ID +- Logical entity key +- Save or delete action +- Dependency operation IDs +- Payload version +- Durable, monotonically increasing local mutation revision. Wall-clock time + and operation-ID lexical order must not decide which save is newer. +- Attempt count and next eligible time +- Last typed error +- Explicit server confirmation state + +### `CloudRecordMap` + +- Logical application key +- Apple record ID +- Last-known etag and server metadata +- Last-known encrypted raw record reference + +### `CloudSyncRun` + +- Trigger and architecture +- Fetched, applied, quarantined, confirmed, and retried counts +- Redacted timing and failure categories +- Start and finish timestamps + +### `CloudAttachmentMaterialization` + +- Complete account scope, generation, and keyed logical attachment identity +- Expected byte count and a keyed digest of the native MMCS integrity tag +- Monotonic stage: metadata, streaming, verified, placed, then referenced +- Contiguous native-verified byte count +- Protected temporary-file, resume-manifest, verification, and final-file + references, never raw paths or MMCS credentials +- Last update timestamp + +Creation and every transition use an ObjectBox transaction. Updates are +compare-and-swap operations over the complete expected state so a stale +process, isolate, or resumed worker cannot regress a verified boundary. Network +I/O, hashing, decryption, truncation, and atomic file placement remain outside +the ObjectBox transaction. + +## Pull transaction + +1. Fetch records with record ID, etag, type, server metadata, and next token. +2. Persist the inbox batch and fetched token in one ObjectBox transaction. +3. Apply inbox entries separately through the shared semantic upsert pipeline. +4. Mark each entry `applied` only after its local mutation commits. +5. Quarantine malformed or undecryptable records. Never silently drop them. +6. Advance the applied position only through a contiguous successful range. + +This makes a crash or malformed record recoverable without replaying the entire +zone or permanently skipping a change. + +### Read-only shadow journal budget + +Phase 1 currently contains a dormant runtime and scheduler foundation designed +for a future manual sampler. It has no production composition or invocation +path yet. Startup, network-reconnect, IDS-reconnect, and detected-gap callbacks +do nothing unless a later rollout explicitly enables automatic triggers. +Read-only fetch, semantic apply, saves, deletes, profiles, and notification +hints remain independently gated. In this phase, read-only fetch is the only +permitted capability; the shadow runtime rejects every engine with read-only +fetch disabled or with a mutation, profile, or notification gate enabled. + +Pending shadow rows have deterministic limits per complete account scope: + +- 4,096 pending entries +- 32 MiB conservative journal-row estimate +- Seven days from the oldest pending entry + +These are client safety limits, not Apple quotas and not estimates of attachment +payload size or the complete ObjectBox file. Byte accounting uses fixed row and +index overhead plus UTF-8 lengths of protected references and redacted hashes. +It never inspects or logs decrypted message content. + +Admission is all-or-nothing with the continuation token. Exact entry and byte +boundaries are accepted. A page that would cross either boundary is rejected +without persisting any row or advancing the token. Once the current journal is +at a limit or older than the age limit, the engine blocks before another +network fetch where possible. Diagnostics expose only retained entry count, +estimated bytes, rejected entry count, and the typed reason `maximumAge`, +`maximumEntries`, or `maximumEstimatedBytes`. + +The policy never deletes inbox data. Existing databases created before the +budget are measured in place on first use; an over-budget database becomes +blocked while its rows and checkpoint remain unchanged. Pending records remain +correctness-relevant until a separately reviewed migration explicitly marks +them as disposable shadow samples or replays the zone from a safe checkpoint. +Do not enable semantic apply by silently pruning them. + +## Outbox transaction + +1. Queue a CloudKit operation in the same ObjectBox transaction as its local + mutation. +2. Coalesce repeated saves for the same logical entity. +3. Let a confirmed delete supersede an unconfirmed save only after tombstone + support passes its dedicated safety gate. +4. Pull before pushing after startup, reconnect, or a detected IDS gap. +5. Upload attachment records before their owning message record. +6. Clear an operation only after explicit per-record confirmation. +7. Persist typed retry state across process restarts. + +IDS delivery state and CloudKit backup state must remain separate. A message can +be delivered through IDS while its CloudKit copy is still pending. + +## Merge policy + +Stable logical keys: + +- Message: Apple message GUID +- Reaction: reaction GUID plus parent GUID +- Attachment: attachment GUID plus owning message GUID +- Chat: Apple group or chat identifier, with a participant-set fallback + +Rules: + +- Immutable content: first valid canonical event wins. Conflicting content is + quarantined for diagnosis. +- Read and delivery timestamps: monotonic maximum. +- Reactions without a parent: defer until the parent exists. +- Edits: union message parts by Apple edit metadata. +- Retractions: win only when newer or represented by Apple's canonical state. +- Group metadata: higher group version wins. +- Equal group versions: retain the last-known server base and log the conflict. +- Mark-unread: local only until Apple's server representation is verified. +- Unknown fields: retain the last-known raw record and etag. + +## Scope + +### Supported after validation + +- iMessage chats and messages +- Read and delivery metadata +- Reactions +- Edit summaries and retractions +- Attachment metadata and encrypted assets +- Group photos +- Explicitly shared profile records when the pointer and decryption key are + already known + +### Not provided by this design + +- SMS or RCS synchronization +- Windows or Android contact synchronization +- General iCloud Contacts synchronization +- Reliable discovery of an existing iPhone profile on a fresh Windows device +- Conversation wallpaper or call-background parity +- Custom records inside Apple's Messages container +- Scheduled-message or recoverable-delete zones + +Profile sharing uses separate Apple records and encryption material. It should +be a later opt-in module, not a dependency of message reconciliation. + +## Security gate + +Cloud Sync V2 writes are blocked until all items below pass: + +- Replace the static desktop key with Windows DPAPI or Credential Manager. +- Preserve protected state across ARM64 and x64 upgrades for the same Windows + user and application identity. +- Protect Apple tokens, PCS material, keychain state, and profile keys. +- Hash account identifiers before writing journals or diagnostics. +- Redact message content, handles, DSIDs, tokens, keys, and raw server IDs. +- Require an explicit user action for any clique or zone reset. +- Prove that an account switch cannot reuse another account's checkpoints, + inbox, outbox, or record map. +- Coordinate Android's foreground and background Flutter engines with the same + durable database lease. A process-local Dart lock is not sufficient. + +### Windows secret-storage design + +Protect one randomly generated 256-bit master key with current-user Windows +DPAPI, then continue using the existing `SoftwareEncryptor` AES-GCM path for +normal keystore operations. DPAPI runs only during initialization, so signing, +IDS, CloudKit, and message processing do not gain per-operation IPC or +cryptography overhead. + +Use the official Windows Rust bindings for: + +- `CryptProtectData` +- `CryptUnprotectData` +- `CRYPTPROTECT_UI_FORBIDDEN` +- `DATA_BLOB` +- `LocalFree` +- `FlushFileBuffers` +- `ReplaceFileW` with flags set to zero + +The repository lockfiles already contain `windows-sys` 0.59.0 and its ARM64 +MSVC target. Use current-user scope. Do not use machine scope or optional +entropy, since either can break ARM64/x64 access for the same Windows user. + +Version the persisted software-keystore format: + +```text +format_version = 2 +protected_master_key = +keys = +secrets = +``` + +Migration must: + +1. Acquire an exclusive profile lock. +2. Strictly parse the existing file. Existing corruption must never become an + empty default keystore. +3. Authenticate and decrypt every legacy entry in memory. +4. Re-encrypt all entries with the random master. +5. DPAPI-protect a complete recovery copy of the original legacy file. +6. Write a same-directory temporary V2 file and flush its file handle. +7. Reopen it, unlock the master, and verify every entry. +8. Atomically replace the original with `ReplaceFileW`, using a backup path and + flags set to zero. Microsoft documents `REPLACEFILE_WRITE_THROUGH` as + unsupported. +9. Reopen and verify the installed file before global initialization. + +The old static key may exist only in an isolated legacy decoder. It must never +encrypt new or migrated state. If DPAPI cannot unlock a V2 master, fail closed +with a typed error. Do not fall back to the legacy key, create an empty +keystore, or reset the account. + +Before migration ships, harden AES-GCM parsing so truncated nonces, invalid +tags, and unauthenticated data return typed errors rather than panicking. Make +all later writes atomic, return an error on duplicate global initialization, +correct the existing AES key-type label, and remove private-key material from +logs. + +Ship DPAPI-capable x64 and ARM64 builds together. A pre-migration executable +cannot read V2 state. Validate x64 to ARM64 to x64 read/write compatibility +against a synthetic copied profile before touching a live profile. + +### Android secret-storage and worker design + +Use the existing Android Keystore integration to protect a random application +master key with a non-biometric AES-GCM key. The protected key must remain +available to the existing background APNs Flutter engine while the phone is +locked. Do not store the raw master, CloudKit tokens, Apple record IDs, or PCS +material in SharedPreferences. + +The foreground app and background APNs service can run in separate Flutter +engines. They must coordinate through the ObjectBox coordinator lease and +outbox leases, not a process-local Dart mutex. Every lease acquisition, +renewal, release, and expired-lease recovery must be a short transaction. +Network work and Apple cryptography happen outside ObjectBox transactions. + +An Android account switch must create a new account-scoped checkpoint, journal, +outbox, record map, and lease namespace. Old encrypted state is retained for +explicit recovery or deletion, but it is never automatically opened under the +new account. + +### Platform and architecture parity + +Android, Windows ARM64, and Windows x64 must use the same: + +- Dart and Rust sync source +- ObjectBox schema and migration hashes +- CloudKit fixtures +- Merge tests +- Feature flags +- Application identity and protected-state migration contract + +Only platform adapters, compiled native binaries, and packaging should differ. +Windows CI must inspect the PE architecture of the executable, Rust library, +ObjectBox library, media libraries, and TLS dependencies. Android CI must +inspect the APK or app bundle for the expected `arm64-v8a` Rust and ObjectBox +libraries. + +Use a cross-process single-instance lock before opening the database. An ARM64 +and x64 process must never open the same ObjectBox store concurrently. + +### Windows shared-profile process boundary + +Windows shared-profile support requires the official OpenBubbles runner. The +runner atomically creates or opens its named mutex before it creates the window +or initializes Flutter, keeps the first-instance handle alive until shutdown, +and makes later official launches forward their app link and exit without +opening the ObjectBox profile. + +Opening the same profile from a custom runner, a second Windows session, a test +harness, or simultaneous x64 and ARM64 processes is unsupported. Those +processes do not inherit this invariant and can corrupt or race the shared +store. Release validation must keep the runner source-contract test green and +must never use a shared profile for parallel architecture testing. + +## Scheduler and retry policy + +Triggers: + +- Startup +- Network reconnection +- Local outbox activity +- IDS reconnect or detected event gap +- Manual synchronization +- Optional Apple notification hint after read-only validation + +Policy: + +- One active coordinator per account and database. +- Debounce bursts of local mutations. +- Preserve the existing maximum batch size of 256 records. +- Use exponential backoff with full jitter for network, throttling, and server + errors. +- Honor `Retry-After` when present. +- Refresh authentication once after an authorization failure. +- Pause cleanly when clique or PCS access is unavailable. +- Persist backoff so restarting cannot create a retry storm. + +Apple does not publish dependable limits for this private service. These values +are conservative client policy, not claimed Apple quotas. + +## Rollout + +### Phase 0: protocol and security baseline + +- Replace static-key secret storage. +- Define typed Rust errors and response envelopes. +- Return record IDs, etags, server metadata, and per-record outcomes. +- Freeze the exact ObjectBox schema, IDs, indexes, uniqueness rules, and + forward/rollback migration invariants before transport code depends on it. +- Create sanitized fixtures for chat, message, attachment, reaction, edit, + retraction, missing-key, and corrupt-record cases. + +Exit gate: no secret leaves DPAPI-protected storage, and ARM64/x64 fixture +outputs are identical after normalization. + +### Phase 1: read-only durable shadow sync + +- Add ObjectBox checkpoint, inbox, map, and run records. +- Fetch without mutating existing message tables. +- Compare normalized CloudKit records with current local state. +- Quarantine failures and expose redacted diagnostics. +- Keep automatic triggers dormant and enforce per-scope entry, estimated-byte, + and age admission limits without deleting pending data. + +Exit gate: repeated runs lose no records, leak no account state, and resume +correctly after crash injection. Boundary rejection and a keystore failure must +leave both the inbox and continuation token unchanged. + +### Phase 2: semantic pull + +- Apply chats, messages, reactions, read state, and attachment metadata through + the shared upsert path. +- Keep writes and deletions disabled. + +Exit gate: deterministic results across replay, process restart, ARM64, and x64. + +### Phase 3: durable saves + +- Add the durable outbox. +- Require explicit per-record confirmation. +- Keep deletions disabled. + +Exit gate: a failed, partial, or missing server response cannot suppress retry +or lose the local operation. + +### Phase 4: mutable conflicts and guarded tombstones + +- Add edits, retractions, group changes, and conflict tests. +- Enable deletion only behind a separate opt-in flag. + +Exit gate: two-device races, offline changes, and repeated replay produce one +logical result without destructive resets. + +### Phase 5: profile and notification experiments + +- Add group photos and explicit shared profiles. +- Evaluate notification hints only as a scheduler optimization. + +Exit gate: feature failure cannot block messaging, startup, or core sync. + +## Feature flags and rollback + +Use independent flags for: + +- Read-only fetch +- Semantic apply +- Saves +- Deletions +- Profiles +- Notification hints + +Rollback disables network writes while retaining checkpoints, quarantined +records, and pending outbox operations. Never repair a failed rollout by +silently clearing the clique, deleting Apple zones, or discarding the local +database. + +## Validation matrix + +- Crash before and after every inbox/checkpoint transaction +- Exact-limit, one-over-limit, stale-journal, pre-budget migration, and + checkpoint-protection fault cases +- Duplicate-record and cross-device race +- Existing-message semantic update +- Reaction before parent +- Edit, unsend, delivery, and read-state conflicts +- Attachment dependency, partial response, and bounded-memory behavior +- Interrupted attachment download before and after each verified chunk, + corrupt tail truncation, manifest reauthorization, content-integrity failure, + atomic placement, and restart after every materialization stage +- Authorization failure, throttling, server failure, and disk full +- Account switch and application-architecture switch +- Corrupt record and missing PCS key with no Rust panic +- Identical normalized output on Pixel Android, Windows ARM64, and Windows x64 +- Android foreground and background-engine contention, process death, and + expired-lease recovery +- Two Windows devices plus an iPhone, including offline sends, media, group + changes, process restart, and network changes + +Acceptance requires: + +- Zero lost logical message GUIDs +- Zero duplicate logical messages after replay +- No account-token bleed +- Durable retry across restarts +- Bounded attachment memory +- No automatic destructive reset +- No CloudKit failure delaying IDS messaging + +## Estimate and priority + +A trustworthy beta is approximately two to four weeks: + +- Security and durable foundation: four to seven engineering days +- Safe pull and cross-architecture parity: four to seven days +- Uploads, conflicts, and attachment reliability: five to ten days +- Profiles, notification experiments, and multi-device soak: one to two + additional calendar weeks + +The highest-value contribution is Phase 0 followed by read-only Phase 1. +Profile bootstrap and conversation backgrounds should wait. They are +higher-risk and deliver less user value than proving that messages cannot be +lost, duplicated, or exposed. diff --git a/docs/CLOUD_SYNC_V2_ANDROID_SCHEDULING.md b/docs/CLOUD_SYNC_V2_ANDROID_SCHEDULING.md new file mode 100644 index 0000000000..dd9a30a774 --- /dev/null +++ b/docs/CLOUD_SYNC_V2_ANDROID_SCHEDULING.md @@ -0,0 +1,47 @@ +--- +type: implementation_note +title: Cloud Sync V2 Android Scheduling Foundation +description: Dormant WorkManager policy, constraints, and integration gates for Cloud Sync V2. +resource: openbubbles-app +tags: [android, workmanager, cloud-sync, battery, safety] +timestamp: 2026-08-01 +--- + +# Cloud Sync V2 Android Scheduling Foundation + +## Current behavior + +The Android scheduling adapter is present but disabled by default. Nothing in +`MainActivity`, `APNService`, `MethodCallHandler`, or the APNs/IDS receive path +calls it. The dormant worker validates only redacted scheduling input and exits +successfully. It does not start a Flutter engine, call Rust, open ObjectBox, or +perform CloudKit I/O. + +When a future reviewed composition explicitly enables it, each request will: + +- wait 15 seconds from the first hint, coalescing same-scope hints with one + scope-hashed WorkManager unique-work name and `ExistingWorkPolicy.KEEP`; +- require `CONNECTED`, `BatteryNotLow`, and `StorageNotLow` for metadata; +- additionally require `UNMETERED` for automatic media; +- use normal one-time work only. No polling, battery-optimization prompt, or + expedited request is present. A user-visible manual kind is explicit but is + still normal work until its foreground/user-notification contract is reviewed; +- allow explicit cancellation by the same scope-hashed unique-work name. + +The WorkManager request surviving process death is only a wake handoff. It is +not a lock and never authorizes work by itself. Any live handoff must acquire, +renew, and release the existing ObjectBox coordinator lease transactionally. +Network I/O, Apple cryptography, and CloudKit remain outside ObjectBox +transactions. + +## Remaining gates before any activation + +1. Compose a Flutter/Rust entrypoint that reads the durable account-scoped + ObjectBox state and treats a lost lease or cancellation as a clean stop. +2. Test foreground-engine versus APNs-worker contention, process death before + and during lease acquisition, and cancellation while the durable worker is + pending or active. +3. Require the V2 read-only shadow, protected storage, and explicit rollout + gates already documented in `CLOUD_SYNC_V2.md`. Keep all writes blocked. +4. Add a user-visible foreground/notification design before considering any + expedited behavior. Do not place CloudKit on the IDS/APNs receive path. diff --git a/docs/CLOUD_SYNC_V2_CANONICAL_MAPPING.md b/docs/CLOUD_SYNC_V2_CANONICAL_MAPPING.md new file mode 100644 index 0000000000..d23995632a --- /dev/null +++ b/docs/CLOUD_SYNC_V2_CANONICAL_MAPPING.md @@ -0,0 +1,750 @@ +--- +type: design-spec +title: Cloud Sync V2 Canonical Mapping +description: Field-level contract between native CloudKit decoding, transient Flutter Rust Bridge payloads, canonical app entities, and content-free sync metadata. +resource: C:\Codex\OpenBubblesReview\openbubbles-app +tags: + - openbubbles + - cloud-sync-v2 + - cloudkit + - reconciliation + - privacy +timestamp: 2026-08-01 +--- + +# Cloud Sync V2 Canonical Mapping + +## Status and scope + +This document is the reviewed semantic boundary required before Cloud Sync V2 +may write a chat, message, reaction, attachment, or group photo into the +canonical application database. + +It is based on the current Rust CloudKit structs and the existing Dart +`Chat.applyFromCloud`, `Message.applyFromCloud`, and +`Attachment.applyFromCloud` behavior. It is a mapping specification, not proof +that semantic pull is production-ready. + +The current V2 decoder only produces a content-free identity projection. The +current Dart semantic payloads are deliberately narrow scaffolding. Neither is +yet sufficient to perform the mappings below. `semanticApply` must remain +disabled until the blockers and fixture gates in this document pass. + +This specification does not cover SMS, RCS, iCloud Contacts, scheduled-message +zones, or general profile discovery. Shared profile records remain a separate, +opt-in module. + +## Source of truth and terminology + +The relevant sources are: + +- `rustpush/src/imessage/cloud_messages.rs`: `CloudChat`, `CloudMessage`, + `CloudAttachment`, `AttachmentMeta`, `MMCSAttachmentMeta`, and edit metadata. +- `rustpush/src/imessage/cloud_messages.proto`: the four message protobuf + envelopes. +- `lib/database/io/chat.dart`: current chat lookup, upload, and download + mapping. +- `lib/database/io/message.dart`: attributed-body, message, reaction, reply, + edit, and retraction mapping. +- `lib/database/io/attachment.dart`: attachment identity and metadata mapping. +- `lib/services/rustpush/cloud_sync/cloud_inbox_applier.dart`: dormant + transient semantic payload and transactional apply boundary. +- `rust/src/cloud_sync_semantic_decoder.rs`: current native content-free + projection and tombstone reversal. + +The words **observed**, **proposed**, and **blocked** are used precisely: + +- **Observed** means the current source establishes the format or behavior. +- **Proposed** means V2 should adopt the rule after the specified fixtures pass. +- **Blocked** means V2 must not apply that field yet. + +## Data lanes and privacy classification + +Cloud Sync V2 needs four distinct data lanes. Mixing them is a release blocker. + +| Class | Meaning | Examples | Allowed lifetime and destination | +|---|---|---|---| +| `N0` native secret | Apple transport, PCS, or MMCS material that the Flutter layer does not need | DSID, PCS keys, raw record name, raw decrypted CloudKit record, MMCS signature, owner, URL, decryption key, `Asset` | Native memory or protected native storage only. Never cross FRB as plaintext. Never log. | +| `T1` transient canonical plaintext | Decrypted information needed to update the app's existing user-visible data | message GUID and body, sender handle, participant handles, chat name, attributed runs, edit text, attachment display name | May cross FRB only in a typed, redacted, non-serializable DTO. Consume immediately in the canonical write transaction. Never persist in sync journals, checkpoints, conflicts, or diagnostics. | +| `C1` canonical app data | User data the application already stores and renders | `Message`, `Chat`, `Handle`, `Attachment`, edit history, local materialized media file | May be stored in the existing canonical app entities. This is not sync metadata. Existing app backup and at-rest protections still apply. | +| `D0` durable content-free sync metadata | State needed for replay, merge, and recovery without user content | account-scoped HMAC identities, etag hash, content digest, protected-reference token, timestamps, counters, allowlisted safe code | May be stored in Cloud Sync V2 ObjectBox records and redacted diagnostics. | + +`T1` and `C1` are intentionally different. A message body may be transiently +decoded and then written to the existing `Message` row because the app must +render it. The same body must never be copied into a V2 inbox, snapshot, +record-map, checkpoint, run record, or exception. + +The protected raw-envelope reference is a `D0` opaque token. Resolving that +token yields `N0` data and must remain inside the native protector boundary. + +## Common envelope rules + +Every decoded mutation must carry: + +1. account and zone scope, validated against the active generation; +2. ordered inbox `changeId`; +3. HMAC of the opaque server record ID; +4. HMAC of the logical entity identity; +5. Cloud entity kind and upsert or tombstone kind; +6. optional etag hash and validated server timestamps; +7. a protected raw-envelope reference; +8. a typed transient payload for an upsert, or a mapped logical identity for a + tombstone. + +The native decoder must validate record type, encrypted-record shape, required +identity fields, and PCS availability before returning a semantic DTO. Dart +must not receive a partially decoded raw `CloudChat`, `CloudMessage`, or +`CloudAttachment`. + +Unknown optional fields are retained through the protected raw envelope. +Unknown or malformed core identity fields quarantine the event. Missing PCS or +an unclassified native/upstream error is retryable and must not be converted to +`malformedRecord`. + +## Identity rules + +### Scope + +All HMAC identities are scoped to: + +``` +accountIdentityHash + container + database + zone + rebootstrapGeneration +``` + +The HMAC input also includes a versioned domain and entity kind. A hash from one +account, zone, generation, or entity kind must not resolve in another. + +Raw Apple IDs may cross FRB only as `T1` values when the canonical app entity +needs them. Durable V2 metadata stores their HMACs, never their plaintext. + +### Server record identity + +`serverRecordIdHash` is the immutable identity of the CloudKit record envelope. +The raw record name remains `N0`. A record map binds: + +``` +serverRecordIdHash -> entity kind + logicalEntityKeyHash + protected server ID +``` + +Inbound duplicate logical records are mapping conflicts. V2 must not reproduce +the legacy behavior that deletes a prior server record while processing an +inbound page. + +### Chat identity and aliases + +**Proposed primary identity:** HMAC of `CloudChat.guid` under the chat identity +domain. + +`group_id`, `original_group_id`, and `(service_name, chat_identifier)` are +aliases, not independent chat entities: + +- group `CloudMessage.chat_id` normally resolves through `group_id`; +- direct `CloudMessage.chat_id` normally has + `iMessage;-;` shape and may equal the chat GUID; +- legacy or restored records can refer to `original_group_id`. + +Store each alias as an account-scoped HMAC that resolves to the primary chat +hash. A conflicting alias mapping quarantines the later mutation. + +Display name and participant set are never identity. The current +`Chat.findFromCloud` participant/display-name fallback is useful for manual +legacy repair but is unsafe for deterministic V2 replay. It can merge two +different chats with the same members. + +### Message identity + +The primary identity is HMAC of `CloudMessage.guid` under the message domain. +The canonical `Message.guid` receives the plaintext GUID through the transient +DTO. + +The message-to-chat link uses the HMAC of `chat_id` resolved through the chat +alias map. A missing parent chat defers the message. V2 must not attach it to a +"current" chat or create a chat from message content alone. + +### Reaction identity + +A reaction is a `CloudMessage` whose decoded +`associated_message_type` is in the validated add or removal range. Its +proposed logical identity is: + +``` +HMAC(reaction-domain, reactionGuid + NUL + parentGuid + NUL + parentPart) +``` + +Its parent link is the message-domain HMAC of `parentGuid`. The plaintext +reaction GUID is still stored in the canonical `Message.guid`. + +The reaction is deferred if the parent is missing. An add and a removal are +separate immutable reaction records whose canonical reduction determines the +visible reaction state. Do not mutate or delete the parent message merely +because a reaction removal arrived. + +A sticker (`associated_message_type == 2`) remains a message with a typed parent +association. It is not classified as a reaction because its attachment and +rendering semantics differ. + +### Attachment identity and ownership + +Observed CloudKit attachment IDs commonly use: + +``` +at__ +``` + +Parse the prefix and decimal part, then treat the entire remaining suffix as +the message GUID. Do not use `split("_")[2]`, because that truncates a GUID that +contains an underscore. + +For an owned attachment: + +``` +logical attachment key = + HMAC(attachment-domain, messageGuid + NUL + decimalPart) +canonical local Attachment.guid = messageGuid + "_" + decimalPart +owner key = HMAC(message-domain, messageGuid) +``` + +For an attachment GUID that does not match the owned form, use an HMAC of the +complete raw attachment GUID and leave the owner unresolved. Filename, path, +MD5 prefix, record arrival order, and currently open conversation are never +identity. + +### Group photo identity + +A group photo is an embedded chat asset, not an independently trustworthy +message attachment. Its proposed subentity identity is: + +``` +HMAC(group-photo-domain, chatLogicalKeyHash + NUL + groupPhotoGuid) +``` + +The root `group_photo_guid` and +`properties.group_photo_guid` must agree when both are present. A mismatch +quarantines the photo mutation while allowing independently valid chat fields +to remain reviewable. A photo asset without a usable photo GUID is not applied. + +The `Asset`, MMCS descriptors, and download credentials remain `N0`. Dart +receives only a protected local file reference after native verification and +materialization. + +## Typed parent-reference parsing + +### Reaction and sticker parent + +Observed upload grammar: + +``` +p:/ +``` + +The native parser must: + +1. require the exact `p:` prefix; +2. split once at the first `/` after the prefix; +3. require a non-negative decimal part that fits the canonical integer type; +4. require a non-empty GUID suffix; +5. return `{ parentGuid, parentPart, rawRangeLocation, rawRangeLength }`; +6. HMAC `parentGuid` before producing durable metadata. + +The associated range is validation evidence. It must not be used to derive the +part from the reaction message's own attributed body. The current download +mapper does exactly that and also stores the unparsed `p:` wrapper in +`associatedMessageGuid`, so current parent lookup can fail. + +`bp` and `bpdi` are balloon payload fields in the native incoming message +schema. They are not aliases for `p:`. No `bp:` parent wrapper should be +accepted without a sanitized CloudKit fixture proving a separate format. + +### Thread reply parent + +Observed upload grammar: + +``` +r:: +``` + +Parse the `r:` prefix and the last separator. The middle substring is the part +string and the final non-empty substring is the parent GUID. A missing +separator, empty parent, or implausible part is an unresolved association and +must be quarantined or durably deferred, not silently discarded. + +This grammar is independent of the reaction `p:` grammar. Sanitized fixtures +must determine whether colons can occur in real part strings or GUIDs before +the parser is declared final. + +## Presence, clear, and default semantics + +V2 must preserve field presence before Rust `Default` or Serde defaults erase +the distinction. + +Use three semantic states for every optional or defaulted mutable field: + +| State | Meaning | Merge behavior | +|---|---|---| +| absent | Field was not present in the decrypted record | Preserve the existing canonical value. | +| value | Field was present with a valid value, including an intentionally empty string or list | Apply according to field merge rules. | +| explicit clear | The schema and fixture prove that the present representation means removal | Clear only if the mutation is otherwise authoritative. | + +Concrete FRB DTOs should use a non-generic `CloudFieldStateDto` plus a nullable +typed value, because bridge support for generic presence wrappers should not be +assumed. + +Additional rules: + +- Missing required identity is malformed. Empty required identity is malformed. +- A zero message read or delivery timestamp means no timestamp on creation. It + must not erase a newer existing timestamp. +- `last_read_message_timestamp == 0` is not proof that the chat's latest date + should be cleared. +- Negative attachment dates are valid wire values and must not be rejected. +- Negative attachment byte counts mean unknown for the current non-negative + canonical size field. Do not clamp to zero. +- An absent vector or map is not automatically an explicit empty collection. + The native presence bitmap must distinguish them. +- Unknown flag bits remain in the protected raw envelope. Known bits may be + projected to typed canonical fields. +- A tombstone without server time remains a server-confirmed tombstone with a + null `deletedAt`. Never invent the local clock time. + +## Chat field mapping + +| Cloud source | Canonical target | Classification | Absent/default and merge rule | Status | +|---|---|---:|---|---| +| `guid` | `Chat.guid` or stable cloud identity field, plus logical HMAC | `T1/C1`, HMAC `D0` | Required, non-empty, immutable. Never reconcile by display name. | Proposed after identity fixtures | +| `chat_identifier` | `Chat.chatIdentifier`, alias HMAC | `T1/C1`, HMAC `D0` | Required for current schema. A changed alias must not create a second chat. | Proposed | +| `group_id` | `Chat.cloudGuid`, alias HMAC | `T1/C1`, HMAC `D0` | Required for group relationship resolution. Empty is malformed. | Proposed | +| `original_group_id` | alias HMAC only, optionally canonical compatibility field | `T1`, HMAC `D0` | Preserve prior alias if absent. Conflict quarantines. | Proposed | +| `service_name` | service validation and chat route | `T1/C1` | Only validated `iMessage` is in V2 scope. Other services are unsupported, not coerced. | Proposed | +| `style` | `Chat.style` and validated group/direct classification | `C1` | Known observed values 43 and 45 may map. Unknown value is retained protected and does not change group routing. | Fixture required | +| `is_filtered` | no safe canonical target | protected `N0` | Preserve only in protected raw record. | Blocked | +| `successful_query` | no safe canonical target | protected `N0` | Upload default is observed, meaning is not established. | Blocked | +| `state` | no safe canonical target | protected `N0` | Value 3 is common, not a proven canonical state machine. | Blocked | +| `participants[].uri` | `Chat.handles` and `Handle` rows | `T1/C1`, set digest `D0` | Apply an authoritative participant set only on create or a valid higher group version. Respect account scope and URI normalization. | Proposed | +| `display_name` | `Chat.displayName` | `T1/C1`, digest `D0` | Absent preserves. Explicit clear requires a fixture. Respect `lockChatName`. | Proposed with clear fixture | +| `last_addressed_handle` | `Chat.usingHandle` | `T1/C1` | Normalize only recognized email/telephone handles. Empty or malformed preserves existing. | Proposed | +| `last_read_message_timestamp` | content-free snapshot timestamp; possibly chat latest-date hint | `D0` | Do not overwrite `dbOnlyLatestMessageDate` until fixtures prove the field's meaning. Zero preserves existing. | Blocked for canonical date | +| `prop001.syndication_type` | no safe canonical target | protected `N0` | Upload code sets 0, semantic meaning is marked as a guess. | Blocked | +| `proto001.unk1` | no canonical target | protected `N0` | Preserve protected. | Blocked | +| `properties.pv` | `Chat.groupVersion`, snapshot group version | `C1/D0` | Higher version wins. Equal version with different metadata digest is a conflict. Null cannot authorize group mutation. | Proposed | +| `properties.last_seen_message_guid` | `Chat.lastReadMessageGuid` | `T1/C1`, HMAC `D0` | Apply only when referenced message identity is valid. Missing parent may defer this subfield. | Proposed | +| `properties.group_photo_guid` | validated photo identity | `T1`, HMAC `D0` | Must agree with root photo GUID if both exist. | Proposed | +| `properties.last_modification_date` | group metadata modified time | `D0` | Validate finite/range. It is merge evidence, not local wall-clock authority. | Proposed | +| `properties.gpufc` | no safe canonical target | protected `N0` | Meaning unverified. | Blocked | +| `properties.number_of_times_respondedto_thread` | no safe canonical target | protected `N0` | Upload value is guessed. | Blocked | +| `properties.should_force_to_sms` | no V2 iMessage target | protected `N0` | Must not change SMS routing. | Blocked | +| `properties.message_handshake_state` | no safe canonical target | protected `N0` | Must not be used as authentication proof. | Blocked | +| `properties.legacy_group_identifiers` | alias candidates only after format validation | `T1`, HMAC `D0` | Never store plaintext in sync metadata or auto-merge on an unvalidated value. | Fixture required | +| root `group_photo_guid` | group-photo identity and `Chat.photoAttachmentGuid` compatibility value | `T1/C1`, HMAC `D0` | Absent preserves. Explicit clear requires presence evidence and authoritative group version. | Proposed with clear fixture | +| `group_photo: Asset` | `Chat.customAvatarPath` after verified materialization | native `N0`, protected reference `D0`, file `C1` | Network and file work occur outside ObjectBox transaction. Respect `lockChatIcon`. | Proposed after media adapter | +| CloudKit etag/create/modify/permission | semantic snapshot and record map | `D0` | Hash etag. Validate timestamps. Permission is safe numeric metadata but not authorization by itself. | Proposed | + +The legacy `cloudData` field serializes the complete decrypted `CloudChat` for +later upload reconstruction. V2 must not copy a raw decrypted record into +Cloud Sync metadata or use `cloudData` as its semantic snapshot. Unknown fields +belong behind the protected raw-envelope reference. + +## Message envelope mapping + +| Cloud source | Canonical target | Classification | Absent/default and merge rule | Status | +|---|---|---:|---|---| +| `guid` | `Message.guid`, logical HMAC | `T1/C1`, HMAC `D0` | Required, non-empty, immutable. Conflicting immutable content for one GUID quarantines. | Proposed | +| `chat_id` | `Message.chat` through chat alias map | plaintext stays native/transient, HMAC `D0` | Missing parent chat defers. Do not split an arbitrary semicolon string by fixed index without grammar validation. | Proposed | +| `sender` | `Message.handle` and `handleId` | `T1/C1`, HMAC or digest `D0` | Empty is valid for from-me records. Otherwise normalize recognized handle syntax. | Proposed | +| `time` | `Message.dateCreated`, snapshot created time | `C1/D0` | Required Apple-epoch nanoseconds. Validate conversion and range. Immutable after first valid event. | Proposed | +| `utm` | server/update ordering evidence | `D0` | Optional unencrypted timestamp. It does not replace CloudKit system modification time without fixtures. | Fixture required | +| `msgType` | semantic classification | `D0` safe enum | Type 2 is an associated record in current upload code, but final classification also requires decoded proto fields. | Proposed | +| `eCode` | `Message.error` | `C1` | Present unencrypted integer. Do not turn an unknown code into a transport failure. | Proposed | +| `destination_caller_id` | validation against chat sending handle | `T1` | Do not mutate `Chat.usingHandle` from a single message without corroboration. | Blocked for write | +| `flags.IS_FROM_ME` | `Message.isFromMe` | `C1/D0` | Typed bit. Cross-check empty sender and account handles, but flags remain authoritative only after fixtures. | Proposed | +| `flags.IS_DELIVERED`, `IS_READ` | delivery/read booleans corroborating proto timestamps | `C1/D0` | A bit without a timestamp must not invent a date. | Proposed as validation | +| `flags.HAS_DD_RESULTS` | `Message.hasDdResults` | `C1` | Apply known bit. | Proposed | +| `flags.IS_FORWARD` | `Message.hasBeenForwarded` only if it represents the same semantic concept | `C1` | Current field is also used for local SMS forwarding. Do not conflate without fixture. | Blocked | +| `flags.WAS_DELIVERED_QUIETLY` | `Message.wasDeliveredQuietly` | `C1` | Apply known bit. | Proposed | +| `flags.DID_NOTIFY_RECIPIENT` | `Message.didNotifyRecipient` | `C1` | Apply known bit. | Proposed | +| other known and unknown flags | typed future fields or protected raw | `D0` or protected `N0` | Never truncate the protected representation merely because current Dart lacks a target. | Protected only | +| `service` | message/chat service validation | `T1/C1` | V2 accepts validated iMessage. SMS is outside scope and must not be silently imported. | Proposed | +| `msgProto3.unk2`, `unk3` | no safe canonical target | protected `N0` | Preserve protected. | Blocked | + +### `MessageProto` + +| Proto field | Canonical target | Classification | Absent/default and merge rule | Status | +|---|---|---:|---|---| +| `unk1` | no safe canonical target | protected `N0` | Upload code uses 1, meaning is not established. | Blocked | +| `subject` | `Message.subject` | `T1/C1`, digest `D0` | Absent preserves on an update. Explicit empty is a value. | Proposed | +| `text` | `Message.text` | `T1/C1`, digest `D0` | Use as plain-text representation. Do not discard a valid attributed body. | Proposed | +| `attributedBody` | `Message.attributedBody` | `T1/C1`, digest `D0` | Decode natively into validated strings, ranges, and attributes. Invalid ranges quarantine the content mutation. | Proposed | +| attributed run message part | `Attributes.messagePart` | `T1/C1`, part hash `D0` | Non-negative integer; stable per message part. | Proposed | +| attributed run attachment GUID | `Attributes.attachmentGuid` and deferred attachment link | `T1/C1`, attachment HMAC `D0` | Normalize with the safe attachment parser. Missing attachment defers the link, not the message body. | Proposed | +| mention | `Attributes.mention` | `T1/C1` | Validate range and handle-like value. Never log. | Proposed | +| audio transcript | `Attributes.audioTranscript` | `T1/C1`, digest `D0` | User content, never sync metadata. | Proposed | +| text effect and formatting | corresponding `Attributes` fields | `C1` | Unknown effects stay protected. | Proposed for known values | +| sticker data | `Attributes.stickerData` | `T1/C1`, digest `D0` | Validate numeric ranges and required strings. | Fixture required | +| `balloonBundleId` | `Message.balloonBundleId` | `T1/C1` | An allowlisted identifier may be stored. Unknown bundle is not an error. | Proposed | +| `payloadData` | decoded `Message.payloadData` for allowlisted extensions | `T1/C1`, digest `D0` | Decode outside the ObjectBox transaction. Unknown or failed payload stays protected without logging bytes or content. URL balloon support is currently incomplete. | Partial, fixture required | +| `messageSummaryInfo` | `Message.messageSummaryInfo` | `T1/C1`, edit/retraction digests `D0` | Apply only through the edit contract below. | Proposed after fixtures | +| `effect` | `Message.expressiveSendStyleId` | `T1/C1` | Allowlisted effect ID, absent preserves. | Proposed | +| `dateRead` | `Message.dateRead`, snapshot read time | `C1/D0` | Zero means no date on create. Merge by monotonic maximum. Never clear a newer date. | Proposed | +| `dateDelivered` | `Message.dateDelivered`, snapshot delivered time | `C1/D0` | Same monotonic rule as read time. | Proposed | +| `unk10`, `unk11`, `unk14` | no safe canonical target | protected `N0` | Preserve protected. | Blocked | +| `associatedMessageType` | sticker/reaction typed association | `C1/D0` | Validate exact ranges and reaction enum bounds before indexing. Unknown value preserves protected and does not create a reaction. | Proposed | +| `associatedMessageGuid` | `associatedMessageGuid`, `associatedMessagePart`, parent hash | `T1/C1`, HMAC `D0` | Parse exact `p:` grammar. Never store the wrapper as the canonical GUID. | Proposed, current legacy bug | +| `associatedMessageRangeLocation/Length` | association validation evidence | `C1/D0` | Validate against the parent part when available. Do not derive the part from the child body. | Proposed | + +### `MessageProto2`, replies + +| Proto field | Canonical target | Classification | Rule | Status | +|---|---|---:|---|---| +| `reply` | `threadOriginatorGuid`, `threadOriginatorPart`, parent hash | `T1/C1`, HMAC `D0` | Parse exact `r:` contract. Missing parent defers association only. | Proposed after grammar fixtures | + +### `MessageProto4` + +| Proto field | Canonical target | Classification | Rule | Status | +|---|---|---:|---|---| +| `associated_message_emoji` | `Message.associatedMessageEmoji` | `T1/C1` | Apply only with a valid associated-message type and parent. | Proposed | +| `service` | validation only | `T1` | Must agree with supported message service when present. | Proposed | +| `schedule_type`, `schedule_state` | no verified canonical mapping | protected `N0` | Scheduled-message behavior is out of V2 scope. | Blocked | +| `groupId` | chat alias validation | `T1`, HMAC `D0` | May corroborate `chat_id`; it must not silently reparent a message. | Fixture required | +| `sent_or_received_off_grid` | no verified canonical target | protected `N0` | Preserve protected until satellite/off-grid semantics are tested. | Blocked | + +## Edit and retraction mapping + +`MessageSummaryInfo` is mutable semantic state on the original message. It is +not a replacement message and must not overwrite immutable original content. + +| Summary field | Canonical target | Rule | Status | +|---|---|---|---| +| `ec[part][]` | `editedContent[part]` | Part key must be a validated decimal part. Decode every `MessageEdit.t` as attributed content. Order by validated edit date, retain duplicates idempotently by digest. | Proposed | +| `MessageEdit.d` | `EditedContent.date`, edit-part modified time | Validate finite Apple timestamp representation. Never substitute local now. | Proposed | +| `MessageEdit.bcg` | no safe target | Preserve protected. Meaning is unverified. | Blocked | +| `ep` | `editedParts` | Deduplicate validated non-negative parts. A listed part without usable edit content is a conflict or deferred subfield. | Proposed | +| `otr[part].lo/le` | `originalTextRange[part]` | Validate non-negative range and bounds against original content when available. | Proposed | +| `rp` | `retractedParts` | Retraction applies to the listed part only. It does not tombstone the whole message. Merge with server-authoritative newer summary state. | Proposed | +| `ams`, `ampt`, `amc`, `amb`, `amd` | no verified target | Preserve protected. | Blocked | +| `ust`, `hbr`, `oui`, `osn`, `euh` | no verified target | Preserve protected. `euh` contains handles and must never enter diagnostics. | Blocked | + +The snapshot stores only per-part HMAC, revision/date, and content digest. +Edited plaintext belongs only in the canonical `Message.messageSummaryInfo`. + +When an edit and retraction mention the same part, a sanitized Apple fixture +must establish precedence. Until then, preserve the raw envelope and quarantine +that part-level mutation rather than choosing by local arrival order. + +## Attachment and media mapping + +| Cloud source | Canonical target | Classification | Absent/default and merge rule | Status | +|---|---|---:|---|---| +| `cm.aguid` | `Attachment.guid`, logical HMAC, owner hash/part | `T1/C1`, HMAC `D0` | Required, non-empty. Parse owned form safely. | Proposed | +| `cm.mimet` | `Attachment.mimeType` | `T1/C1` | Validate bounded MIME syntax. Absent preserves. | Proposed | +| `cm.t` | `Attachment.uti` | `T1/C1` | Bounded identifier. Absent preserves. | Proposed | +| `cm.tn` | `Attachment.transferName` | `T1/C1` | Treat as display name, sanitize path separators for local materialization. | Proposed | +| `cm.tb` | `Attachment.totalBytes` | `C1/D0` | Non-negative maps directly. Negative means unknown and must not become zero. | Proposed | +| `cm.ig` | `Attachment.isOutgoing` | `C1` | Apply present boolean. | Proposed | +| `cm.sdt`, `cm.cdt` | snapshot timing evidence | `D0` | Negative values are valid wire values. Canonical `Attachment` currently lacks date fields. | Snapshot only | +| `cm.st` | no current canonical transfer-state field | protected `N0` or safe enum `D0` | Do not infer file availability from this value alone. | Blocked for entity | +| `cm.is` | sticker association validation | `C1/D0` | Current `Attachment` has no sticker field. Corroborate parent message only after fixtures. | Fixture required | +| `cm.ha` | no current canonical target | protected `N0` | Hidden attachment behavior is unverified. | Blocked | +| `cm.fn`, `cm.pathc` | no local filesystem authority | `T1`, protected raw | Never materialize to the supplied Apple path. It may be retained only as transient compatibility data. | Blocked for path | +| `cm.vers` | schema compatibility evidence | `D0` | Unknown version should preserve protected record and block unsafe media apply. | Proposed | +| `cm.mdh` | weak source checksum hint | `D0` | It is only an observed MD5 prefix. Do not use as sole integrity proof or identity. | Validation hint only | +| `cm.aui.pgens` | no current canonical target | protected `N0` | Preview generation meaning is not established. | Blocked | +| `cm.ui.file-size`, UTI, MIME, name | validation against outer metadata | `T1/D0` | Normalize `NumOrString` without panics. Mismatch is diagnostic-safe conflict metadata. | Proposed | +| `cm.ui.inline-attachment`, `message-part` | native inline media source and part validation | native `N0`, part `D0` | Materialize bounded bytes outside transaction and verify owner/part. | Proposed after fixtures | +| `cm.ui.mmcs-*`, `decryption-key` | native MMCS downloader only | `N0` | Never cross FRB or enter canonical metadata. | Native only | +| `lqa: Asset` | verified protected media source | native `N0`, protected ref `D0` | Download, authenticate, and atomically stage outside ObjectBox transaction. | Proposed after media adapter | +| verified final file | canonical attachment path/file state | `C1` | Rename staged file atomically, then link file and entity in the canonical transaction or recovery journal. | Proposed | + +The current attachment mapper stores the raw CloudKit record ID in +`Attachment.metadata["cloud"]`. V2 must use the protected record map instead. +The current upload helper also invents a macOS path ending in `test.png` and +uses current time for several fields. Those guessed upload defaults do not +define incoming canonical semantics. + +## Proposed redacted FRB DTO contract + +The following is contract pseudocode. It intentionally does not reuse the +generated raw CloudKit models. + +```text +CloudCanonicalMutationDto + scopeFingerprint: String // D0 + generation: u64 // D0 + changeId: String // D0 + kind: CloudEntityKindDto // D0 + mutationKind: Upsert | Tombstone // D0 + serverRecordIdHash: String // D0 + logicalEntityKeyHash: String // D0 + parentLogicalKeyHash: String? // D0 + aliasKeyHashes: List // D0 + etagHash: String? // D0 + serverCreatedAtMillis: i64? // D0 + serverModifiedAtMillis: i64? // D0 + protectedRawEnvelopeReference: String // D0 + snapshot: CloudCanonicalSnapshotDto? // D0, content-free + payload: CloudCanonicalPayloadDto? // T1, upsert only + tombstone: CloudCanonicalTombstoneDto? // D0, tombstone only +``` + +Concrete payload variants: + +```text +CloudCanonicalChatDto + guid, chatIdentifier, groupId, originalGroupId, service + style + participantHandles + displayName + displayNameState + lastAddressedHandle + state + groupVersion + state + lastSeenMessageGuid + state + groupPhotoGuid + state + verifiedGroupPhotoLocalReference + state + +CloudCanonicalMessageDto + guid + chatAliasKeyHash + senderHandle + createdAt + error + service + subject + state + text + state + attributedBodies + state + balloonBundleId + state + decodedExtensionPayload + state + effect + state + readAt + state + deliveredAt + state + knownFlags + association: none | sticker | reactionAdd | reactionRemove + parentGuid, parentPart, parentKeyHash + associatedRangeLocation, associatedRangeLength + replyParentGuid, replyPart, replyParentKeyHash + edits, retractedParts + associatedEmoji + state + +CloudCanonicalAttachmentDto + canonicalGuid + ownerMessageKeyHash + ownerPart + uti + state + mimeType + state + transferName + state + totalBytes + state + isOutgoing + state + verifiedLocalFileReference + state + +CloudCanonicalGroupPhotoDto + chatKeyHash + photoKeyHash + photoGuid + verifiedLocalFileReference +``` + +Contract requirements: + +- DTOs implement a fixed redacted `Debug` string and no content-bearing + `Display`. +- DTOs have no JSON, plist, map, analytics, or persistence conversion. +- Raw record IDs, account IDs, PCS data, MMCS data, `Asset`, and raw CloudKit + objects are absent from the DTO types. +- Payload fields are immutable for the duration of the Dart call. +- Dart consumes the payload immediately. It may copy values only into existing + canonical `C1` entities. +- Errors expose only an allowlisted category, retry hint, and safe code. +- Native code clears temporary plaintext byte buffers where practical after + bridge transfer and after protected re-encoding. +- The bridge schema is versioned. Unsupported schema versions defer or + quarantine without a partial write. + +## Canonical apply transaction + +Network, PCS, protobuf/plist decoding, content hashing, MMCS download, and file +materialization happen before the ObjectBox transaction. + +The synchronous canonical transaction must: + +1. revalidate scope, generation, and coordinator lease; +2. check the applied `changeId`; +3. resolve primary and alias HMAC identities; +4. verify required parent entities or write a content-free deferred dependency; +5. read the existing content-free semantic snapshot; +6. run deterministic merge policy; +7. write the transient DTO into the existing canonical `Chat`, `Message`, + `Handle`, or `Attachment` entities; +8. write the merged `D0` snapshot and record-map entry; +9. mark the inbox event applied; +10. commit all ObjectBox changes atomically. + +No `await`, network call, native call, file read, hash calculation, media decode, +or UI notification is allowed inside that transaction. + +The transaction must respect local user locks such as `lockChatName` and +`lockChatIcon`. A local UI preference is not CloudKit merge state. + +## Sanitized fixture matrix + +Every fixture must use synthetic GUIDs, handles, names, bodies, filenames, +record names, keys, and URLs. Test output must assert that none of those +sentinels appear in logs, snapshots, record maps, exceptions, or `toString`. + +| Fixture | Required assertion | +|---|---| +| minimal direct chat | Primary chat and service/chat-identifier alias hashes resolve; no display-name/participant identity fallback. | +| group chat create with `pv` | Participants, group name, and aliases apply once; replay is a no-op. | +| higher group `pv` | Authoritative mutable group fields update; immutable identity does not. | +| equal `pv`, same digest | No-op. | +| equal `pv`, different digest | Content-free conflict, no guessed winner. | +| missing `pv` on existing group | Identity mapping may update, group-mutating fields preserve. | +| group photo asset and matching GUIDs | Verified protected file reference reaches canonical photo apply; secrets remain native. | +| mismatched root/property photo GUIDs | Photo submutation quarantines without corrupting chat. | +| explicit group photo clear | Clears only with proven presence encoding, authoritative version, and unlocked local icon. | +| normal text message | Attributed and plain text map, replay does not duplicate. | +| message before chat | Defers, then applies exactly once after alias resolution. | +| duplicate message with same immutable digest | No-op plus metadata merge. | +| duplicate GUID with different immutable body | Quarantine immutable-content conflict. | +| reaction add `p:0/` | Canonical parent GUID is bare GUID, part is 0, parent hash resolves. | +| reaction removal in 3000 range | Reduction removes matching reaction without deleting parent. | +| reaction before parent | Durable content-free dependency, successful replay after parent. | +| malformed `p:` wrapper | Quarantine without array bounds exception or plaintext log. | +| unknown reaction type or out-of-range enum index | Preserve protected, no reaction row. | +| sticker with parent and attachment | Remains associated message, not reaction; attachment link resolves. | +| reply `r:0:` | Separate reply parent and part map. | +| malformed reply | Association is deferred/quarantined without dropping base message. | +| edited part with `ec`, `ep`, and `otr` | Attributed edit, range, timestamp, and digest map idempotently. | +| multi-edit replay in different page grouping | Deterministic edit order and no duplicate revision. | +| retracted part in `rp` | Only listed part is retracted. | +| edit and retract same part | No guessed precedence until fixture-defined policy. | +| URL balloon | Base message remains usable; unsupported extension stays protected. | +| unknown extension payload | No payload bytes or content in warning/error text. | +| attachment `at_0_` | Parser retains entire suffix and correct owner. | +| standalone attachment GUID | Stable attachment identity with unresolved owner, no guessed message. | +| MMCS attachment | Key, signature, URL, and owner never cross FRB; verified file does. | +| inline attachment | Bounded bytes materialize and link to validated part. | +| negative attachment dates and size | Decode does not panic; size becomes unknown, date preserved as wire evidence. | +| `NumOrString` numeric/string/bool variants | Valid variants normalize safely; malformed value quarantines field or record per criticality. | +| omitted optional field versus explicit empty | Preserve versus value semantics remain distinct. | +| omitted `change_type` with valid record | Classified as upsert by validated record shape. | +| tombstone with server time | Prior record map resolves authoritative delete. | +| tombstone without server time | `deletedAt` remains null; no local time is invented. | +| tombstone without record map | Durable `tombstoneMappingMissing`; no entity guess or delete. | +| PCS unavailable | Retryable, protected inbox retained. | +| unknown native/upstream error | Retryable safe failure, not malformed quarantine. | +| process death after entity write attempt | Entity, snapshot, map, and replay marker all roll back or all commit. | +| account switch during decode | Scope revalidation rejects mutation before canonical write. | + +## Current blockers + +### Canonical ObjectBox adapter boundary + +`ObjectBoxCanonicalSemanticEntityAdapter` now provides the synchronous, +default-off boundary used by a future semantic gateway composition. It is not a +general-purpose importer and must not be enabled by configuration alone. + +The adapter requires all of the following for any transaction: + +1. an exact active `CloudSyncScope` and rebootstrap generation supplied from + already-loaded process state; +2. a synchronous, scope- and generation-bound resolver from a verified native + transient DTO HMAC identity to a canonical plaintext GUID; +3. an explicit semantic-apply enablement flag; and +4. no network, filesystem, platform-keystore, hash, async, or UI work while + the ObjectBox transaction is open. + +Today it can only update a non-null display name on an already-existing, +unlocked `Chat`. It never creates chats from participant/display-name hints, +never writes a raw CloudKit ID or protected reference into a canonical entity, +and refuses message, attachment, reaction, group-photo, profile, and +tombstone mutations. This narrow implementation is intentional: the current +payloads do not carry the proven canonical GUIDs, field-presence bitmap, +direction, timestamps, relationship data, or materialized-media state required +for safe writes. The identity resolver is a seam for the future native DTO, not +a hash-reversal mechanism or a durable plaintext mapping table. + +The next adapter expansion requires the typed native DTO and the fixture gates +below. Until then, a caller receives a typed safe failure and the enclosing +transaction rolls back atomically. + +1. `rust/src/cloud_sync_semantic_decoder.rs` returns only an identity projection. + It does not produce the rich canonical DTO or field-presence bitmap. +2. The generated/defaulted Rust record models can collapse missing required + fields into empty or zero defaults. V2 must validate raw field presence + before typed construction. +3. The existing Dart semantic payloads contain only a small subset of message, + chat, attachment, and reaction data. +4. ~~`CloudSemanticTombstone.deletedAt` is required in Dart even though a valid + server tombstone can omit its timestamp. It must become nullable.~~ + **Closed.** `deletedAt` is `DateTime?` and covered by Rust + `tombstone_supports_present_or_missing_server_time` plus Dart cases in + `cloud_inbox_applier_test.dart` and `cloud_sync_release_validation_test.dart`. +5. Dart currently treats `CloudFailureCategory.unknown` as non-retryable. An + unclassified native/upstream failure must remain retryable unless the native + boundary positively identifies malformed permanent data. + + **Correction (2026-08-06): do not fix this by flipping the enum.** The + bounded-retry behavior this asks for already exists, assembled from three + places: `CloudInboxApplier` only *returns* a quarantine without persisting + it, and `CloudSyncEngine` re-promotes an `unknown` quarantine to retryable + while `attemptCount + 1 < maximumUnknownAttempts`. Because + `cloud_sync_engine.dart` gates on `error.category.isRetryable` first, making + `unknown` unconditionally retryable would bypass `maximumUnknownAttempts` + and turn a bounded retry into an unbounded one. + + The real remaining defect is narrower and belongs with the three-way + outcome work: Rust classifies an unrecognized `PushError` as + `RetryableUpstreamFailure`, but `CloudSyncProtectedFailureCategory` has no + such member, so `native_protected_cloud_sync_transport.dart` collapses it to + `CloudFailureCategory.unknown`. A positively-retryable native failure is + therefore capped at `maximumUnknownAttempts` and then quarantined. Closing + it means carrying a distinct retryable-native category across the bridge, + which requires a binding regeneration. +6. Current legacy message download stores `p:/` directly in + `associatedMessageGuid` and derives the part from the child attributed body. + This breaks canonical reaction-parent lookup. The V2 Rust converter is + correct; `lib/database/io/message.dart` still does both. +7. ~~Current reaction type indexing can throw if Apple supplies an unknown value + inside the broad numeric range.~~ **Closed for the legacy download path.** + `ReactionTypes.fromAssociatedMessageType` bounds the lookup and returns null + for an unnamed type, so the message still syncs without a reaction row. + Covered by `test/helpers/reaction_helpers_test.dart`, which sweeps the whole + 2000-3999 range. The V2 Rust converter already used narrow ranges. +8. ~~Current attachment owner parsing uses fixed underscore indexes and can + truncate identifiers.~~ **Closed.** `lib/utils/attachment_guid_utils.dart` + parses the prefix, one decimal part, and the whole remaining suffix, and is + now the single implementation behind all five former copies plus + `Attachment.applyFromCloud`. Covered by + `test/utils/attachment_guid_utils_test.dart`. +9. Current attachment mapping stores a raw CloudKit record ID in canonical + attachment metadata rather than using the protected record map. +10. Current chat fallback identity uses display name and participant sets. + Deterministic V2 reconciliation must not use it. +11. Current chat apply stores a serialized decrypted `CloudChat` in + `cloudData`. V2 has no reviewed protected replacement for lossless + round-trip upload. +12. Root versus property group-photo GUID precedence and explicit-clear + encoding are not fixture-proven. +13. No V2 media adapter currently turns native `Asset` or MMCS state into an + authenticated protected local file reference. +14. URL balloons, unknown extension payloads, scheduled/off-grid fields, legacy + group aliases, and several summary properties have no safe canonical + mapping. +15. The ObjectBox semantic gateway that atomically writes canonical entities, + snapshots, mappings, dependency rows, and replay markers is not implemented. +16. Sanitized real-device fixtures for parent grammar, group versions, clear + semantics, edits, retractions, and media have not passed on Android, + Windows ARM64, and Windows x64. + +## Implementation gates + +Implement in this order: + +1. Freeze sanitized fixtures and required-field presence rules. +2. Add private native canonical DTOs and tests without exposing FRB symbols. +3. Review redaction and secret-lane tests, then expose only the typed DTO + facade through FRB and regenerate bindings once. +4. Expand Dart transient payloads and implement the synchronous ObjectBox + canonical gateway. +5. Run replay, rollback, account-switch, parent-ordering, media-integrity, and + cross-architecture fixture suites in read-only shadow comparison. +6. Enable semantic apply only behind a kill switch and staged validation plan. + +No save, delete, tombstone apply, or production composition should be enabled +merely because the field mapping compiles. diff --git a/docs/CLOUD_SYNC_V2_FIELD_OWNERSHIP.md b/docs/CLOUD_SYNC_V2_FIELD_OWNERSHIP.md new file mode 100644 index 0000000000..e81ab25446 --- /dev/null +++ b/docs/CLOUD_SYNC_V2_FIELD_OWNERSHIP.md @@ -0,0 +1,200 @@ +--- +type: specification +title: OpenBubbles Cloud Sync V2 Field Ownership +description: Which fields the server owns, which the device owns, and the merge rule each class carries, so that semantic apply cannot silently overwrite local state. +resource: openbubbles-app +tags: [cloudkit, sync, merge, schema, phase2] +timestamp: 2026-08-06 +--- + +# Cloud Sync V2 field ownership + +## Why this exists before the adapter + +Semantic apply is the first thing that writes CloudKit-derived data into the +local message tables. Without a written classification, "the server wins" is +implemented field by field from memory, and the first time it is wrong the +symptom is a user's local state being silently overwritten. That is discovered +from a bug report, not from a test. + +This document is the input to that adapter. It is deliberately derived from +what the existing `applyFromCloud` path actually writes, not from what the +schema could theoretically carry. + +## The three classes + +**Server-immutable.** Content that cannot legitimately change after the message +exists. First valid canonical event wins. A later record carrying different +content is a conflict and is quarantined for diagnosis, never applied over the +existing value. + +**Server-mutable.** State Apple continues to update. The server is the +authority, but a record may arrive carrying older state than we already hold, +because CloudKit gives no intra-batch ordering guarantee. Every write in this +class must go through a monotonic comparison rather than direct assignment. + +**Device-owned.** Never written by projection under any circumstance. Not +"usually not" — the adapter must have no code path that assigns them. + +## Message + +### Server-immutable + +`guid`, `dateCreated`, `isFromMe`, `handleId`, `handle`, `text`, `subject`, +`attributedBody`, `payloadData`, `hasApplePayloadData`, `balloonBundleId`, +`expressiveSendStyleId`, `threadOriginatorGuid`, `threadOriginatorPart`, +`associatedMessageGuid`, `associatedMessagePart`, `associatedMessageType`, +`associatedMessageEmoji`, `chat`. + +Notes that matter for the adapter: + +- `associatedMessageGuid` holds the **parsed** parent GUID, never Apple's + `p:/` wrapper. `associatedMessagePart` is null when Apple sent a + bare GUID, which is its partless form. Both come from + `CloudAssociatedMessageParentReference`. +- `associatedMessageType` is null for a reaction type this build has no name + for. Null means "not a reaction row", not "unknown reaction". +- `text` and `attributedBody` are immutable **only for the original message**. + Edits do not mutate them; they arrive as edit history, which is + server-mutable below. + +### Server-mutable + +| Field | Merge rule | +| --- | --- | +| `dateRead` | Monotonic maximum. Never move backwards. | +| `dateDelivered` | Monotonic maximum. | +| `dateDeleted` | Set once by a server-confirmed tombstone. Never cleared by a later record. | +| `error` | Latest server value. | +| `hasAttachments` | Recomputed from attachment links, not copied. | +| `hasReactions` | Recomputed from child reaction rows, not copied. | +| edit history (`messageSummaryInfo`) | Union by Apple edit metadata. Never replaced wholesale, and an empty collection is not a clear instruction. | +| retracted parts | Union. A retraction is not undone by a later record that omits it. | + +`Message.save()` already preserves the monotonic rule for `dateDelivered` and +`dateRead`; the adapter must not bypass it by assigning directly. + +### Device-owned + +`id`, `isBookmarked`, `hasBeenForwarded`, `stagingGuid`, `verificationFailed`, +`bigEmoji`, `datePlayed`, `country`, `hasDdResults`. + +`ckRecordId` and `ckSyncState` are owned by the **legacy** CloudKit path. +Cloud Sync V2 must not write either. Doing so would make the two paths fight +over the same columns, and the record map exists precisely so V2 does not need +them. + +#### Divergence from upstream on conversion failure + +This branch changed how the legacy upload path sets `ckSyncState` when +`Message.toCloud()` throws, and a reviewer will notice, so the reasoning is +recorded here rather than left to a diff. + +Upstream marks the message synced regardless of outcome: + +```dart +} catch (e, s) { + Logger.warn("Failure to convert to cloud", error: e, trace: s); + continue; +} finally { + message.ckSyncState = true; +} +``` + +A message that fails to convert is therefore recorded as crawled and is never +retried. It silently never reaches CloudKit. This branch drops the `finally`, +leaves `ckSyncState` false, releases any record id that was minted for the +failed attempt, and counts the message as retryable. + +The trade is deliberate: upstream terminates but loses the message, and this +branch keeps the message but re-attempts it on every future sync. The +re-attempt is bounded within a pass. `CloudMessageUploadBatchResult.madeProgress` +is false when nothing converted, and the driver in `rustpush_service.dart` +breaks out and logs how many messages stayed queued, so a wholly unconvertible +backlog cannot spin. + +What is still missing is persistence. Nothing records that a specific message +has failed conversion across sessions, so a permanently unconvertible message +is invisible unless someone reads the logs and correlates by hand. A pass that +converts some messages and not others never trips the `madeProgress` break, so +the stuck ones ride along indefinitely without being surfaced. Closing that +properly needs a durable per-message attempt count, which is an ObjectBox schema +change and is deliberately not being made ahead of the first live run. This +affects the upload direction only; the read-only sampler does not exercise it. + +## Chat + +**Server-immutable:** `guid`, `chatIdentifier`, `isGroup`, `style`. + +**Server-mutable:** `displayName`, `participants` and the `handles` relation, +`groupVersion` (higher wins), `lastReadMessageGuid` (monotonic against local +read position), `photoAttachmentGuid`. + +**Device-owned:** `id`, `isPinned`, `isMuted`, `muteType`, `muteArgs`, +`isArchived`, `hasUnreadMessage`, `textFieldText`, `textFieldAttachments`, +`customAvatarPath`, `pinIndex`, `autoSendReadReceipts`, +`autoSendTypingIndicators`. + +Two locks already exist and are load-bearing: `lockChatName` and +`lockChatIcon`. When either is set the user has overridden that value +deliberately, and projection must skip the corresponding server-mutable field +even though the server owns it. This is the one place where a device-owned +decision outranks server authority. + +## Attachment + +**Server-immutable:** `guid`, `uti`, `mimeType`, `transferName`, `totalBytes`, +`isOutgoing`, `message` relation, owner part. + +**Server-mutable:** none currently identified. Attachment metadata does not +change after upload in the shapes we handle. + +**Device-owned:** `id`, `bytes`, `sourcePath`, local file placement, and +`metadata["cloud"]`, which the canonical mapping already says should move to +the protected record map rather than being written into entity metadata. + +## Rules the adapter must follow + +1. **No direct assignment to a server-mutable field.** Every one goes through a + comparison helper. `cloud_merge_policy.dart` already has the monotonic + helper and the `modifiedAt` and `retractedAt` comparisons; extend it rather + than assigning in the adapter. +2. **No assignment to a device-owned field, ever.** Not conditionally, not with + a null check. +3. **A conflicting server-immutable value is a quarantine**, not an overwrite. + The record is preserved for diagnosis and the local row is left alone. +4. **Respect `lockChatName` and `lockChatIcon`** before writing the fields they + guard. +5. **Recompute rather than copy** `hasAttachments` and `hasReactions`. They are + derived, and copying them from a record makes them disagree with the rows + they summarise. + +## Why this removes the need for a per-row sequence number + +The checkpoint, the inbox status, and the projected rows already commit inside +one ObjectBox write transaction, so a crash cannot apply a row without also +recording that it was applied. Exactly-once projection follows from that +transaction, not from a version column. + +What the transaction does not prevent is a record carrying **older** state +overwriting newer state, since CloudKit gives no intra-batch ordering +guarantee. That is an ordering problem confined to the server-mutable set +above, and the monotonic rules there address it directly. + +A per-row watermark would additionally require deciding what a single sequence +means for a row written from more than one zone. This classification dissolves +that question: a message body only ever comes from the message zone and an +attachment link only from the attachment zone, so field ownership already +partitions by zone. + +Revisit if a second writer appears. Once Phase 3 uploads land, local mutations +compete with server state and "server wins" stops being sufficient on its own. + +## Open items + +- The device-owned lists were read from the current entity definitions. They + must be re-checked whenever a field is added, and that check belongs in the + schema-freeze review. +- `Chat.lastReadMessageGuid` needs a decision on whether the local read + position may ever move backwards to match the server. It is currently listed + as monotonic against the local position, which is the conservative reading. diff --git a/docs/CLOUD_SYNC_V2_LIVE_VALIDATION.md b/docs/CLOUD_SYNC_V2_LIVE_VALIDATION.md new file mode 100644 index 0000000000..aef67dc2b1 --- /dev/null +++ b/docs/CLOUD_SYNC_V2_LIVE_VALIDATION.md @@ -0,0 +1,375 @@ +--- +type: validation_plan +title: OpenBubbles Cloud Sync V2 Live Validation +description: Safety-gated two-account validation runbook for Pixel Android, Windows ARM64, Windows x64, and a Mac truth source. +resource: openbubbles-app +tags: [android, pixel, windows, arm64, x64, cloudkit, sync, testing, security] +timestamp: 2026-08-22 +--- + +# OpenBubbles Cloud Sync V2 live validation + +## Current readiness + +The bounded Android read-only shadow and semantic-pull canaries now have +production composition paths, explicit developer-only manual triggers, +fail-closed preflight, protected persistence, and redacted reports. They remain +separately compile-gated and are not connected to the legacy `Messages in +iCloud (BETA)` switch. That legacy switch must remain off throughout these +canaries. + +Offline evidence on 2026-08-22 at `75e779b2d`: 533 Flutter tests, 130 main +Rust tests, and 43 standalone protector tests passed. An independent final +audit found no P0-P2 release blocker for the bounded read-only semantic canary, +and its 84 focused tests passed. The exact Beta sampler job, Windows x64, +Windows ARM64, bridge, and fail-closed media-provenance jobs are green. The +remaining Alpha packaging steps are not prerequisites for installing the +separate Beta canary. + +This is readiness for the **first controlled live canary**, not evidence that +CloudKit V2 works with Apple's production service. No real Apple record has yet +been decoded or projected by V2. Remote saves, remote deletes, local +tombstones, automatic triggers, and full-history sync remain disabled. + +### Blockers to the first live fetch + +| Priority | Blocker | State | Required closure | +| --- | --- | --- | --- | +| 1 | Authoritative CI and APK provenance | Closed for Beta canary | Exact `75e779b2d` Beta job passed; downloaded artifact package, APK v2 signature, SHA-256, ARM64 ABI, and required native libraries were verified | +| 2 | Account and app-data isolation | Open on device | Prove Beta has a distinct package, UID, and data directory; use only the Mac-activated test account and never restore Alpha data into Beta | +| 3 | Live PCS/keychain authorization | Open | The fail-closed preflight must pass on the test account without resetting a clique, zone, token, or trust relationship | +| 4 | Account-switch disposal race | Closed offline | Keep the idempotent cancel-and-quiesce tests green; reset must abort before client disposal if the bounded 50-second quiescence wait expires | +| 5 | Raw-page resource bounds | Closed offline | Keep the 32 MiB page admission and one-page/50-change-per-zone semantic limits green before every device build | +| 6 | Native package architecture and bridge parity | Closed for Beta canary | ARM64 Android libraries plus Windows x64, Windows ARM64, and bridge jobs passed from exact commit `75e779b2d` | +| 7 | Live Apple record shapes and ordering | Open | Run shadow first, then the bounded semantic pull, then an immediate replay; stop safely on any deferred, quarantined, retried, skipped, duplicate, or remote-write count | +| 8 | Remote mutation isolation | Closed for read-only canary | Confirm saves, deletes, tombstones, notification hints, profiles, and automatic triggers remain disabled and the outbox count stays zero | + +## Decision + +Use a separate, Mac-activated Apple Account as the Cloud Sync V2 test account. +Keep the user's real account as a message counterparty and do not enable +experimental CloudKit writes against it. + +A different account is useful for producing IDS traffic, but it does not by +itself prove CloudKit reconciliation. The same test account must run on at +least two isolated clients, initially Pixel beta and one isolated Windows +profile. The Mac signed into that test account is the Apple-side truth source. +Even then, a message appearing on both clients is not proof of Cloud Sync: +both clients may have independently received the same IDS push. A passing +semantic-sync test requires explicit `source=cloud` provenance. + +## Non-negotiable guardrails + +- IDS remains the live send and receive path. CloudKit failure must not delay + delivery, local persistence, notifications, or UI updates. +- The first live phase is manual, read-only shadow sync. The semantic pull is a + distinct second canary and may project bounded CloudKit records locally. +- Keep the existing `Messages in iCloud (BETA)` switch off. It is the legacy + mutating engine, not the V2 shadow sampler. +- Required shadow flags are: + - `readOnlyFetch: true` + - `semanticApply: false` + - `saves: false` + - `deletions: false` + - `profiles: false` + - `notificationHints: false` + - `automaticTriggersEnabled: false` +- Required semantic-canary flags are: + - `readOnlyFetch: true` + - `semanticApply: true` + - `saves: false` + - `deletions: false` + - `profiles: false` + - `notificationHints: false` + - `automaticTriggersEnabled: false` +- The Beta artifact must be compiled with both + `OPENBUBBLES_CLOUD_SYNC_V2_SAMPLER=true` and + `OPENBUBBLES_CLOUD_SYNC_V2_SEMANTIC_PULL=true`. +- Never automatically reset an iCloud Keychain clique, delete a CloudKit zone, + clear a token after an unknown failure, or discard a pending shadow journal. +- Never copy a database, checkpoint, protected install secret, or Apple account + state between Account A and Account B. +- Never run Windows ARM64 and Windows x64 processes against the same ObjectBox + profile concurrently. +- Do not place Apple credentials, device passcodes, handles, message content, + DSIDs, tokens, PCS keys, or raw server record IDs in test notes or logs. + +## Test topology + +| Role | Account | Client | Purpose | +| --- | --- | --- | --- | +| Counterparty | Account A, real | Existing Pixel OpenBubbles alpha or Apple client | Sends and receives controlled synthetic messages only | +| System under test | Account B, test | Pixel OpenBubbles beta | IDS baseline and Cloud Sync V2 shadow client | +| System under test | Account B, test | Isolated Windows profile | Same-account cross-client reconciliation | +| Truth source | Account B, test | Mac with Messages in iCloud | Confirms Apple-visible message and mutation state | +| Architecture parity | Account B, test | Windows ARM64 then x64, sequentially | Confirms identical normalized output and protected-state compatibility | + +Use a separate Windows user profile for Account B during the first live test. +That is a stronger isolation boundary than changing environment variables or +renaming an executable. Architecture-switch testing can later use a synthetic +copied profile, followed by a backed-up Account B profile, but never Account A +first. + +The current Gradle flavors use distinct Android package IDs: + +- Alpha: `com.bluebubbles.messaging.alpha` +- Beta: `com.bluebubbles.messaging.beta` + +Verify each built APK's package, signature, UID, native ABI, and private data +directory before installing it. Set up Beta fresh for Account B and never +restore Alpha's backup into it. If that isolation cannot be proven on the +actual artifacts, use a second Android device rather than an app-cloning tool. + +### Verified Beta canary artifact + +- Source commit: `75e779b2d86dc3964662a5118e9a58b0d1ffdff1` +- GitHub Actions run/job: `32583069161` / `Beta Sampler APK` +- Artifact: `Beta Debug APK (Cloud Sync sampler)` +- Local file: `C:\Codex\OpenBubblesReview\artifacts\cloud-sync-v2-canary-75e779b2d-run-32583069161\app-beta-debug.apk` +- Package: `com.bluebubbles.messaging.beta` +- Version: `1.15.0` (`20002227`) +- SHA-256: `79F94A0E6456F5EE43BD6164527959709FFBD8712687049AA02BC6DD5B818CBA` +- APK signature: v2 verified, one Android Debug signer; certificate SHA-256 + `0c06a6d3d619476917521e75e5c56bd6af81390161217a99419efe48e0577d1c` +- Required ARM64 libraries present: + `libflutter.so`, `libobjectbox-jni.so`, and + `librust_lib_bluebubbles.so` + +The package/UID/data-directory isolation check remains a live-device gate. Do +not infer it solely from the distinct package name. + +## Readiness gates + +### Gate 0: offline foundation + +- All focused Dart Cloud Sync tests pass, including ObjectBox durability tests. +- Focused analyzer reports no issues. +- Native protector harness passes on Windows ARM64 and x64. +- Windows production composition uses protected per-install key material rather + than the legacy static desktop software-encryption key. +- Native `Retry-After` reaches Dart and is durably honored across restarts. +- Repeated continuation tokens produce a typed, bounded no-progress failure, + not a generic local-storage error. +- Generated Flutter Rust Bridge bindings expose the bounded raw-page fetch and + protection calls. +- APK and Windows packages contain the correct native architecture libraries. +- Read-only shadow runtime rejects every non-shadow feature configuration. +- A raw-page byte cap is enforced before protection or persistence. +- A dedicated developer-only V2 shadow sampler passes its fail-closed + preflight. It is not wired to the legacy Cloud Sync setting. + +### Gate 1: account and storage isolation + +- Account B has its own Android app data and Windows profile. +- Account fingerprints differ without logging either raw identifier. +- Each checkpoint is scoped by account fingerprint, container, database, zone, + stream, and schema version. +- Switching accounts cannot open the previous account's checkpoint, inbox, + outbox, record map, lease, or protected values. + +### Gate 2: IDS baseline + +With Cloud Sync V2 dormant, Account A and Account B exchange controlled text +and media in both directions. Capture delivery latency and confirm that no +message is missing or duplicated. Do not proceed if IDS is already unreliable. + +### Gate 3: read-only shadow + +Run one manual shadow pass on Account B. It may fetch and journal encrypted raw +changes, checkpoints, and redacted run metadata. It must not: + +- change the existing message, chat, or attachment tables; +- save or delete any Apple record; +- reset a trust relationship or CloudKit zone; +- download full attachment bodies; +- schedule a second run automatically. + +Run the same manual pass again. The second pass must be bounded and +deterministic, with no duplicate logical changes and no token regression. + +### Gate 3B: bounded semantic pull + +Proceed only after both shadow passes are clean. Run one manual semantic pull +in this exact zone order: chats, messages, attachments. Each zone is bounded to +one page and 50 changes. This canary may project chats, messages, reactions, +and attachment metadata into the isolated Beta ObjectBox profile. It must not +download media bodies or apply profiles, display clears, group photos, or +tombstones. + +The UI may report `Cloud Sync V2 Complete` only when all three zones report +`completed`, no zone is skipped, deferred, quarantined, or retried counts are +zero, and the remote-write/outbox tripwire remains zero. Any other outcome is +`Cloud Sync V2 Stopped Safely`; preserve the redacted report and do not repeat +until the cause is understood. + +Immediately run the semantic pull once more in the same account session. The +replay must create zero duplicate logical records, retain monotonic state, and +perform zero remote saves or deletes. Confirm the active Apple account scope is +unchanged immediately before each local transaction. + +### Gate 4: same-account cross-client reconciliation + +Keep the Windows Account B client offline. Generate controlled events between +Accounts A and B, then reconnect Windows and run one manual shadow pass. The +bounded semantic canary can now decode and locally project selected chat, +message, reaction, and attachment-metadata lanes, but this has not been proven +against either platform's live Apple data. Raw encrypted bytes and +platform-specific protection envelopes may differ. + +Before cross-client comparison, add an ephemeral test-run HMAC key used only to +derive comparable event fingerprints from stable Apple record identity. The +current per-install account fingerprint cannot correlate Pixel and Windows +events. Never export the raw record identity or HMAC key. + +For cross-client semantic comparisons, first add a developer-only, +auto-expiring **cloud-only destination mode** on Account B that pauses semantic +IDS ingestion while leaving manual V2 fetch available. Sends remain disabled. +Without explicit `source=cloud` provenance, visibility on two clients is only +an IDS test and must not be reported as Cloud Sync proof. + +### Gate 5: outbound canary + +CloudKit saves remain disabled until the read-only gates pass and outbound +write activation receives a separate review. When approved, enable writes only +for Account B and progress in this order: + +1. one text message; +2. one reaction; +3. one edit; +4. one retraction; +5. one small image; +6. one larger video. + +CloudKit deletions remain separately disabled. + +## Controlled test matrix + +Use markers such as `OB-CS2-T01--` so evidence can be correlated +without storing personal conversation content. + +| ID | Event | Required result | +| --- | --- | --- | +| T01 | Account A sends text to B | IDS delivery is immediate; Phase 1 later contains one protected raw event fingerprint; Phase 2 records `source=cloud` | +| T02 | Account B sends text to A | IDS delivery succeeds independently of CloudKit | +| T03 | A sends image and video to B | Metadata is bounded; no eager full-media load in the shadow phase | +| T04 | A reacts to a message | Phase 2: reaction is linked to one parent or safely deferred | +| T05 | A edits a message twice | Phase 2: revisions are deterministic and no stale text replaces a newer revision | +| T06 | A retracts a message | Phase 2: tombstone is preserved and the original is not resurrected | +| T07 | A marks conversation read | Phase 2: read state moves monotonically and cannot move backward | +| T08 | Windows B offline, then reconnects | One bounded catch-up pass, no duplicates, no IDS delay | +| T09 | Repeat the same page and token | Idempotent journal result and no checkpoint regression | +| T10 | Deterministic transport repeats the same non-final token | Typed no-progress failure, bounded retry, no hot loop | +| T11 | Malformed or undecryptable record | Quarantined with redacted reason; later records are retained | +| T12 | Process stops around journal/checkpoint commit | Restart produces either the complete transaction or no transaction | +| T13 | Network changes Wi-Fi to cellular and back | IDS remains healthy; no automatic shadow storm | +| T14 | Windows ARM64 to x64 to ARM64 | Sequential access only, identical normalized result, protected state still opens | +| T15 | Account switch on test profile | Previous account namespace is inaccessible; no state bleed | + +Advanced Data Protection and Messages-key rotation are separate later tests. +Do not combine them with the first functional run. +Repeated tokens, forced server failures, reaction-before-parent ordering, and +crash boundaries belong in deterministic fault-injection tests; do not try to +provoke them against Apple's production services. + +## Evidence and diagnostics + +Every run should record only: + +- test ID and build commit; +- platform, architecture, and client label; +- phase, trigger, and explicit event source (`ids` or `cloud`); +- bounded fetched, journaled, quarantined, and rejected counts; +- duration and typed failure category; +- checkpoint generation and a keyed or protected diagnostic fingerprint; +- duplicate logical-GUID count; +- process memory and CPU summary; +- whether IDS delivery remained healthy. + +For cross-client correlation, derive an event fingerprint with a temporary +test-run HMAC key. The key must be memory-only, scoped to one run, and destroyed +after evidence comparison. Do not reuse the per-install account fingerprint +for this purpose. + +Logs must not include message text, handles, Apple account identifiers, DSIDs, +tokens, PCS material, device passcodes, record names, raw etags, or attachment +paths. Exported diagnostics must be reviewed before sharing publicly. + +## Pass criteria + +- Zero lost logical message GUIDs. +- Zero duplicate logical messages after replay. +- Zero Account A or Account B state bleed. +- Zero CloudKit writes or deletions during the shadow phase. +- Zero automatic clique or zone resets. +- No checkpoint advance past a rejected or unjournaled page. +- Bounded pages, records, bytes, wall time, and retries. +- No measurable IDS send or receive regression. +- Deterministic normalized results across Pixel, Windows ARM64, and Windows x64. +- No unbounded attachment memory or eager media download. + +## Stop conditions + +Stop immediately and preserve diagnostics if any of these occur: + +- missing or duplicate message; +- local message table changes during shadow mode; +- repeated continuation token without a typed stop; +- sustained CPU, heat, or memory growth after cancellation; +- account fingerprint or protected-state mismatch; +- automatic sync trigger despite the dormant setting; +- any Apple save, delete, reset, or zone mutation call; +- any secret or personal content in logs. + +## Fastest execution schedule + +### First 30 minutes + +Do not begin this section until the authoritative PR-head workflows pass and +the exact downloaded Beta APK passes package, signature, ABI, and native-library +verification. + +1. Confirm Account B, Mac activation, Messages in iCloud, and iCloud Keychain. +2. Confirm isolated Android package and Windows user profile. +3. Verify Alpha and Beta package IDs, UIDs, and data directories are distinct. +4. Run `tooling/cloud_sync/verify_foundation.ps1`. +5. Back up the Account B test profiles. +6. Confirm the legacy sync switch is off and V2 has no automatic trigger. + +### Next 90 minutes + +1. Run the IDS baseline. +2. Run one manual read-only shadow pass on Pixel. +3. Replay the shadow pass and inspect its redacted report. +4. Run one bounded semantic pull and inspect all strict pass criteria. +5. Replay the semantic pull and verify zero duplicates and zero remote writes. +6. Repeat the shadow phase on isolated Windows only after Pixel is clean. +7. Run T01 through T09 and compare redacted counters. + +### Soak + +Run offline/reconnect, process restart, network change, large-history, and +architecture-switch cases for at least 24 hours before considering outbound +CloudKit writes. + +## Inputs needed when the operator returns + +- A Mac-activated test Apple Account with Messages in iCloud enabled. +- Access to its 2FA and trusted-device verification, entered locally. +- A second Android device or proof that Alpha and Beta package/data + directories are isolated. The preferred same-device test uses the verified + Alpha and Beta flavor packages listed above. +- Permission to create or use a separate local Windows user for Account B. +- The Pixel and Mac connected when live validation begins. + +Do not send Apple credentials or device passcodes through chat. + +## Primary references + +- [Apple Platform Security: iMessage security overview](https://support.apple.com/guide/security/imessage-security-overview-secd9764312f/web) +- [Apple Platform Security: how iMessage sends and receives messages](https://support.apple.com/guide/security/how-imessage-sends-and-receives-messages-sec70e68c949/web) +- [Apple: Messages in iCloud](https://support.apple.com/guide/icloud/what-you-can-do-with-icloud-and-messages-mma17ed475f7/icloud) +- [Apple CloudKit synchronization state](https://developer.apple.com/documentation/cloudkit/cksyncengine-5sie5/state-swift.class) +- [OpenBubbles large-history sync stall](https://github.com/OpenBubbles/openbubbles-app/issues/168) +- [OpenBubbles large-history performance issue](https://github.com/OpenBubbles/openbubbles-app/issues/194) +- [OpenBubbles current iCloud sync failures](https://github.com/OpenBubbles/openbubbles-app/issues/222) +- [OpenBubbles rustpush](https://github.com/OpenBubbles/rustpush) diff --git a/docs/CLOUD_SYNC_V2_MANUAL_SAMPLER.md b/docs/CLOUD_SYNC_V2_MANUAL_SAMPLER.md new file mode 100644 index 0000000000..f378bd5e4e --- /dev/null +++ b/docs/CLOUD_SYNC_V2_MANUAL_SAMPLER.md @@ -0,0 +1,231 @@ +--- +type: implementation_plan +title: Cloud Sync V2 Developer Shadow Sampler +description: Implementation-ready design for the first fail-closed, one-shot, read-only CloudKit validation entry point. +resource: openbubbles-app +tags: [cloud-sync, cloudkit, developer-tools, security, validation] +timestamp: 2026-08-01 +--- + +# Cloud Sync V2 developer shadow sampler + +## Decision + +Build a one-shot sampler available only in explicitly enabled developer builds. +It is created after a confirmation, fetches at most one bounded page from each +Messages zone, writes only protected V2 journal/checkpoint metadata, exports an +allowlisted report, and disposes immediately. + +Do not create a persistent runtime or connect startup, network, IDS, or +background callbacks. Do not reuse the legacy `Messages in iCloud (BETA)` +setting. + +Estimated implementation and offline validation: 10 to 16 engineering hours. +Controlled Account B sampling adds 1 to 2 hours, followed by a 24 to 72-hour +soak. + +## Existing seams + +Reuse: + +- `CloudSyncShadowRuntime` +- `CloudSyncEngine` +- `RustCloudSyncTransport` +- `RustCloudSyncProtector` +- `ObjectBoxCloudSyncStore` +- the existing V2 ObjectBox checkpoint, inbox, lease, outbox, record-map, and + run-history boxes +- the active `cloudMessagesClient` +- the active application-document directory + +The UI belongs behind the active developer controls in +`troubleshoot_panel.dart`. The similarly named +`developer_mode_panel.dart_` file is not compiled. + +## Hard-coded composition + +Use only: + +```text +container: com.apple.messages.cloud +database: private +zones: + chatManateeZone + messageManateeZone + attachmentManateeZone +``` + +Sampler limits: + +- one page per zone; +- at most 50 changes per page; +- 8 MiB pending journal budget per scope; +- 512 pending entries per scope; +- 24-hour pending age ceiling; +- 32 MiB raw transport page admission; +- automatic triggers off; +- read-only fetch on; +- semantic apply, saves, deletions, profiles, and notification hints off. + +Use one shared protector and ObjectBox store. Construct one read-only engine per +zone and run them sequentially through `CloudSyncShadowRuntime`. + +## Active-account binding + +Do not use a cached settings value as the account identity. Add a narrow native +call that receives the active Cloud Messages client, reads its DSID internally, +derives the existing per-install HMAC account fingerprint, and returns only the +fingerprint. + +Capture the active push-state object, Cloud Messages client object, and native +fingerprint. Recheck all three immediately before and after every fetch. If any +identity changes, discard the fetched page without journaling and return the +allowlisted `account_changed` failure. + +The raw DSID must never enter Dart or diagnostics. + +### Dormant production adapter + +`CloudSyncProductionSamplerAdapter` is the only production composition seam. +Constructing it performs no network request and schedules no callback. It +creates the ObjectBox store, Rust protector, and Rust raw-read transport only +inside the explicitly confirmed manual sampler. + +`cloud_sync_capture_auth_snapshot` accepts the active opaque Cloud Messages +client and private storage directory. Rust reads the client's DSID, derives the +per-install account fingerprint and an opaque client-generation tag, then +returns only those redacted HMAC values. Dart never receives the DSID, Apple +Account address, token, or key. The same opaque client object is retained in +the immutable snapshot and supplied to the raw-read transport. + +The provider checks object identity after the native capture. The sampler then +checks the native generation, fingerprint, and client identity before each +zone and on both sides of every fetch. A replacement race therefore fails +before the fetched page can reach ObjectBox. + +## Fail-closed preflight + +Refuse the run unless: + +- the compile-time sampler flag is enabled; +- the platform is Android or Windows; +- execution is on the UI isolate; +- RustPush setup and ObjectBox initialization are complete; +- the private storage directory exists; +- an active Cloud Messages client exists; +- logout and legacy cloud sync are inactive; +- no foreground or background legacy sync is active; +- no other sampler or coordinator lease owns the three scopes; +- all V2 outboxes for those scopes are empty; +- a local protector sentinel round trip succeeds; +- the account fingerprint remains unchanged; +- current journal use is inside the sampler budget. + +Preflight must not check or reset the clique, refresh authorization or PCS, +erase tokens, delete zones, or make a network request. The first network call +occurs only after the confirmation and successful local preflight. + +## Write tripwires + +Use three independent barriers: + +1. `RustCloudSyncTransport` refuses V2 push, allocation, conflict-write, and + delete operations. +2. A shadow-only store façade delegates checkpoint, journal, lease, + pull-result, and run-record methods, and rejects semantic/outbox/record-map + mutation. +3. A rejecting inbox applier throws if semantic apply is attempted. + +Also add a session-only `cloudV2ShadowRunActive` interlock to legacy CloudKit +save/delete/upload entry points. An attempted legacy write during a sampler +must fail locally with `cloud_sync_shadow_write_tripwire`. + +Move `recoverExpiredOutboxLeases()` under the `saves` feature gate. A read-only +sampler must never inspect or mutate outbox work. + +A successful report requires `applied`, `confirmed`, `deferred`, and `retried` +to remain zero. + +## Lifecycle + +The one-shot controller follows: + +```text +register active sampler +try + run local preflight + create runtime + run one manual pass + validate write tripwires + produce redacted report +finally + await runtime disposal and full quiescence + unregister active sampler +``` + +Logout and account replacement must cancel and await the active sampler before +clearing state or disposing the Cloud Messages client. + +## Report contract + +Export only: + +- schema version and random local run ID; +- UTC timestamp; +- platform, architecture, and build commit; +- manual read-only mode and disabled automatic-trigger state; +- at most an eight-character fingerprint prefix; +- legacy-sync state; +- configured page/change limits; +- tripwire state and outbox counts before/after; +- per-zone status, fetched/journaled/rejected counts, conservative bytes, + elapsed time, and allowlisted failure/skip/block category. + +Never export Apple IDs, DSIDs, full fingerprints, handles, participants, +message bodies, filenames, raw or hashed Apple record identifiers, etags, +batch/change IDs, continuation tokens, protected values, ciphertext, keys, or +server bodies. + +Phase 1 does not prove message semantics. It proves bounded CloudKit access, +durable protected journaling, checkpoint behavior, isolation, and replay +idempotence. + +## Planned files + +New: + +- `cloud_sync_dev_gate.dart` +- `cloud_sync_shadow_store.dart` +- `cloud_sync_manual_shadow_sampler.dart` +- `cloud_sync_shadow_report.dart` +- `cloud_sync_v2_shadow_panel.dart` + +Modify: + +- `cloud_sync_engine.dart` +- `rust_cloud_sync_transport.dart` +- `cloud_sync.dart` +- `rust/src/api/api.rs` and generated bindings +- `rustpush_service.dart` +- `troubleshoot_panel.dart` + +No ObjectBox schema change is required. + +## Required tests + +- sampler is absent when the compile flag is false; +- construction performs zero network calls; +- unsupported platform, non-UI isolate, missing/stale account, legacy-sync, + active lease, active sampler, and nonempty outbox all fail closed; +- exact scopes, flags, page count, change count, and budgets cannot be relaxed + by UI input; +- shadow store, transport, and applier reject every mutation route; +- saves disabled means outbox recovery is never called; +- account change after fetch discards the page before journaling; +- success, error, cancellation, concurrent run, route close, logout, and + account switch all await quiescence; +- protector failure leaves checkpoint and journal unchanged; +- report serialization is allowlisted and passes a forbidden-value scan; +- static scan confirms sampler files contain no save/delete/upload bridge call; +- Android fake-binding behavior and Windows ARM64/x64 fixtures normalize + identically. diff --git a/docs/CLOUD_SYNC_V2_NATIVE_PROTECTED_FETCH.md b/docs/CLOUD_SYNC_V2_NATIVE_PROTECTED_FETCH.md new file mode 100644 index 0000000000..cede0b5f1a --- /dev/null +++ b/docs/CLOUD_SYNC_V2_NATIVE_PROTECTED_FETCH.md @@ -0,0 +1,277 @@ +--- +type: design +title: Cloud Sync V2 Native Protected Fetch Boundary +description: Private default-off CloudKit page fetch, protection, and two-phase local adoption contract. +resource: OpenBubbles +tags: + - cloud-sync-v2 + - cloudkit + - privacy + - rust + - recovery +timestamp: 2026-08-02 +--- + +# Cloud Sync V2 Native Protected Fetch Boundary + +## Status + +This is a private, default-off Rust boundary with a generated Flutter Rust +Bridge wrapper and a concrete read-only Dart transport. The protected transport +is deliberately absent from production runtime composition and does not replace +the dormant Dart raw transport yet. + +The boundary proves that raw CloudKit record names, etags, encrypted record +envelopes, tombstone payloads, and continuation tokens can remain in native +code. Its outward data is limited to typed operations, fixed safe codes, bounded +lengths, keyed identifiers, payload digests, opaque protected-local references, +and an opaque page lease. This is compile- and contract-tested foundation, not a +production-ready or runtime-enabled sync path. + +## Canonical outward grammar + +- `change_id`: bare 43-character base64url HMAC-SHA256 +- `record_id_hash`: bare 43-character base64url HMAC-SHA256 +- `etag_hash`: optional bare 43-character base64url HMAC-SHA256 +- `payload_digest`: lowercase 64-character SHA-256 hex +- protected record identity and raw-envelope references: `obcs2.ref.<43-character-token>` +- page adoption lease: `obcs2.lease.<32-character-hex-token>` +- protected native-store recovery identity: `obcs2.store.<43-character-token>` + +The HMAC domains for change, record, and etag identifiers are distinct. Raw record identity is stored only in the scope-bound `serverRecordId` protected value. The raw encrypted record or tombstone is stored only in the scope-bound `rawRecord` protected value. A continuation token is stored only in the scope-bound `checkpointToken` protected value. + +## Bounds + +- maximum 200 changes per page +- maximum 8 MiB raw bytes per record +- maximum 24 MiB admitted raw bytes per page +- maximum 64 KiB continuation token +- maximum 16 KiB combined record metadata +- maximum 18 MiB per protected local file +- maximum 36 MiB aggregate protected plaintext per page lease +- maximum 48 MiB aggregate protected ciphertext per page lease +- maximum 401 protected references total per page lease (two per change plus + one checkpoint) +- maximum 128 KiB lease manifest +- maximum 64 lease manifests processed per recovery pass +- maximum 4,096 adopted lease identifiers supplied to one recovery call +- maximum 131,072 ObjectBox-live protected references per maintenance snapshot +- maximum 64 explicitly retired references per call +- maximum 64 protected blobs examined per garbage-collection pass +- maximum 4,096 active lease manifests examined as garbage-collection roots +- 24-hour minimum orphan grace period across two scans +- 40-second native fetch deadline + +An individually oversized record is represented as a quarantined change. Its protected envelope retains only its digest and length, not the oversized raw bytes. A page that exceeds aggregate admission bounds is rejected before protection. + +## Two-phase journal adoption + +Protection happens before ObjectBox journal admission, so the native store returns a page lease with the protected page. + +The required caller sequence is: + +1. Fetch and protect one page. Native code returns D0-safe page data and `page_lease_reference`. +2. In one ObjectBox transaction, validate the page, write every journal row and protected reference, advance the protected checkpoint when appropriate, and durably record the same `page_lease_reference` as adopted. +3. After the transaction commits, enumerate a complete ObjectBox liveness + snapshot. Compute the exact intersection between references in this page and + references adopted by newly inserted inbox rows plus the newly committed + checkpoint. Pass that retained subset to + `cloud_sync_commit_protected_page_lease`. + - Native verifies that every retained reference belongs to the lease and its + ciphertext digest still matches. + - Native deletes exact-digest manifest entries omitted from the retained + subset. This removes duplicate-page blobs immediately. + - Native durably writes a committed receipt, then removes the active + manifest. Repeating the commit is accepted only with the same exact + retained subset. +4. If validation or the ObjectBox transaction rejects the page, call + `cloud_sync_rollback_protected_page_lease`. This removes only files created + by that lease whose ciphertext digest still matches the manifest. +5. Delete the ObjectBox adoption marker only after native commit succeeds, then + acknowledge the committed receipt. Receipt acknowledgement is idempotent. + A release or acknowledgement failure invalidates the process recovery cache, + so the next fetch performs bounded cleanup without requiring a restart. +6. At startup, before any fetch begins, load durable adopted lease identifiers + and a complete ObjectBox liveness snapshot, then pass both to + `cloud_sync_recover_abandoned_page_leases`. + - An adopted active lease retains only its manifest entries present in the + complete ObjectBox liveness set. + - An adopted committed receipt is verified against the liveness set and + reported for exact marker release. + - An unadopted lease is rolled back. + - An unadopted committed receipt is removed without deleting its blobs. + - Recovery is bounded to 64 manifests per pass and can be called repeatedly. + +This closes the crash windows before and after the ObjectBox transaction and +native commit. Recovery and collection reject an incomplete liveness snapshot. +The durable adopted-lease row can be deleted only after native recovery or +commit confirms finalization. A crash before old-checkpoint retirement leaks +the old capability safely; retirement never precedes the ObjectBox checkpoint +replacement transaction. + +The private native lifecycle signatures are: + +```text +cloud_sync_commit_protected_page_lease( + storage_directory, + page_lease_reference, + retained_references[exact manifest subset] +) + -> Result<(), fixed safe failure> + +cloud_sync_acknowledge_committed_page_lease( + storage_directory, + page_lease_reference +) -> Result<(), fixed safe failure> + +cloud_sync_rollback_protected_page_lease(storage_directory, page_lease_reference) + -> Result<(), fixed safe failure> + +cloud_sync_recover_abandoned_page_leases( + storage_directory, + adopted_lease_references[0..=4096], + live_references[0..=131072], + live_reference_enumeration_complete +) -> Result<{ + finalized_adopted_lease_references[], + absent_adopted_lease_references[], + rolled_back_count, + removed_temporary_file_count, + has_more +}, fixed safe failure> + +cloud_sync_retire_protected_references( + storage_directory, + references[0..=64] +) -> Result + +cloud_sync_collect_protected_garbage( + storage_directory, + live_references[0..=131072], + live_reference_enumeration_complete +) -> Result<{ + scanned_count, + first_observed_count, + deleted_count, + preserved_live_count, + preserved_active_lease_count, + has_more +}, fixed safe failure> +``` + +Commit and rollback accept only `obcs2.lease.<32 lowercase hex characters>`. +They do not accept a page object or any raw record identity. The generated D0 +FRB adapter exposes only these reference-based calls, not the private page +helper overloads. + +The exact finalized-adopted list lets Dart delete only the corresponding ObjectBox adoption rows after recovery. A count alone is insufficient because each recovery pass handles at most 64 manifests. + +When `has_more` is true, Dart must keep the full remaining ObjectBox adoption set and call recovery again. It may delete only adoption rows named in `finalized_adopted_lease_references`. This repeats until `has_more` is false. A crash between passes is safe because both native finalization and adoption-row deletion are idempotent. + +When `has_more` is false, native recovery has scanned every remaining manifest. It then returns any supplied adoption references with no manifest in `absent_adopted_lease_references`. These are the crash-after-native-commit, before-ObjectBox-marker-delete case and are also safe for Dart to retire. Dart may delete only the union of the exact finalized and absent reference lists from that result. + +Commit is idempotent only for the exact retained subset recorded in its durable +receipt. Rollback and receipt acknowledgement are idempotent for an +already-finalized valid lease reference. This permits safe retry after a +process interruption or a directory-fsync error without accepting a broadened +retained set. + +Startup recovery is keyed process-wide by the native-issued +`obcs2.store.<43-character-token>` identity. Separate Dart wrapper instances +for the same native store therefore share one recovery barrier without exposing +the storage path. A failed commit, rollback, adoption-marker release, or +receipt acknowledgement invalidates that successful process recovery so the +next fetch re-enters bounded native recovery. + +Lease-specific blob tokens prevent one page from owning a pre-existing blob. Rollback also verifies the ciphertext SHA-256 recorded by the lease before deletion. A file that was replaced or did not originate from the lease is preserved. + +The store fsyncs the lease manifest before protected blobs become visible, fsyncs every protected blob before rename, and fsyncs the containing directory after manifest creation, blob rename, rollback, and lease commit. + +Lease manifests and in-progress files live in dedicated `.leases` and `.temporary` subdirectories. Startup recovery therefore remains bounded even when the store contains years of adopted protected blobs. It removes at most 64 abandoned temporary files and processes at most 64 lease manifests per pass. Either backlog sets `has_more`. + +## Liveness, retirement, and bounded garbage collection + +ObjectBox is the mark authority. Its complete snapshot includes native +references from every inbox row, including pending, applied, and quarantined +terminal rows, plus outbox rows, record maps, attachment materializations, and +every protected checkpoint. Applied inbox rows are intentionally never +collectible until a separately reviewed compaction policy removes those rows. +Enumeration runs in one ObjectBox read transaction and pages row materialization +in batches of 1,024 to bound transient entity memory. + +Native adoption, rollback, retirement, and collection share one store-operation +mutex. Active lease manifests are additional roots, so a page cannot be +collected between native protection and ObjectBox adoption. A liveness snapshot +can become stale after its read transaction; the active-manifest root plus a +two-scan, 24-hour grace period makes that race leak-first instead of +delete-first. + +One collection pass: + +1. rejects an incomplete or malformed liveness snapshot; +2. reads at most 4,096 active manifests as temporary roots; +3. examines at most 64 sorted protected files after a durable cursor; +4. clears prior orphan marks for ObjectBox-live or active-lease references; +5. records first observation for an unreferenced blob; +6. deletes only a still-unreferenced blob observed again after at least 24 + hours, after recomputing and verifying its reference token from the stored + bytes. + +Collection is private and default-off. The caller must invoke bounded passes; +no production scheduler is enabled by this gate. + +## Retry and checkpoint behavior + +Network, throttling, server, authorization, PCS, conflict, malformed response, +continuation-no-progress, and local-storage failures map to fixed enums. +Retry-after seconds survive CloudKit and HTTP 429 mapping and are clamped to +seven days before crossing the bridge. + +Checkpoint plaintext binds format version, generation, stream, and the raw continuation token. Platform protection additionally binds account fingerprint, container, database, zone, stream kind, schema version, and purpose. A reference protected under another account, zone, stream, schema, or purpose is rejected before a CloudKit request. + +## Remaining production blockers + +- Integrate the protected transport into a default-off manual shadow composition + and prove the real journal, checkpoint, semantic-store, and restart path. The + current adapter maps the protected record-identity reference into + `CloudFetchedChange.encryptedServerRecordId`, but it is intentionally not + selected by production composition. +- Serialize recovery and maintenance against every protected fetch sharing the + same native-store identity. Recovery is correct only when no fetch is in + flight, and a complete ObjectBox liveness snapshot must remain fenced from + concurrent protected-reference adoption until its native maintenance call + completes. +- Add platform reopen tests for Android and Windows protected storage. +- Add process-kill tests around manifest fsync, each blob rename, ObjectBox commit, native lease commit, and bounded recovery. +- Add real platform endurance tests for periodic maintenance, ObjectBox + enumeration near the 131,072-reference fail-closed bound, and interrupted + garbage-collection cursor/candidate updates. +- Complete the concrete native semantic decoder and integrate the canonical + converter only after journal durability. +- Validate native binary packaging and protected-store identity continuity on + Pixel Android, Windows x64, and Windows ARM64. +- Remove or permanently disable the dormant Dart raw transport only after the protected path passes shadow comparison and endurance testing. + +## Verification completed for this gate + +- FRB 2.3.0 bindings were generated from the Rust API and the generated Rust + bridge passed `cargo check --lib` in the Linux ARM64 toolchain. +- Focused Dart tests cover safe page mapping, tombstone shape, malformed + capabilities, read-only enforcement, exact retained subsets, duplicate-page + deletion, checkpoint-retirement ordering, lease commit/rollback/recovery, + shared native-store recovery identity, same-process release/ack retry, + fail-closed incomplete liveness, and strict 43-character account + fingerprints. +- Rust tests cover exact empty/mixed retention, manifest/receipt crash windows, + reopen/idempotence, active-lease roots, incomplete liveness, 24-hour + two-scan collection, and bounded progress beyond 64 blobs. +- ObjectBox liveness capture explicitly retains applied terminal inbox + references and materializes rows in 1,024-row pages inside one read + transaction. +- Rust and Dart source-contract tests reject raw identifiers, etags, tokens, + payloads, credentials, plaintext, and paths from the protected DTO surface. +- The protected transport remains absent from every production Dart + composition. + +No production enablement, commit, push, device installation, live CloudKit +exchange, or platform process-kill validation is part of this gate. diff --git a/docs/CLOUD_SYNC_V2_OPEN_SOURCE_REVIEW.md b/docs/CLOUD_SYNC_V2_OPEN_SOURCE_REVIEW.md new file mode 100644 index 0000000000..3d14642863 --- /dev/null +++ b/docs/CLOUD_SYNC_V2_OPEN_SOURCE_REVIEW.md @@ -0,0 +1,122 @@ +--- +type: research_note +title: Cloud Sync V2 Open-Source Pattern Review +description: License-aware review of synchronization projects whose proven patterns can strengthen OpenBubbles Cloud Sync V2. +resource: openbubbles-app +tags: [cloud-sync, cloudkit, reliability, open-source, licensing, testing] +timestamp: 2026-08-01 +--- + +# Cloud Sync V2 open-source pattern review + +## Recommendation + +Reimplement four mature patterns in OpenBubbles' own architecture: + +1. a durable dependency-aware outbox; +2. explicit, account-scoped checkpoints; +3. journal-first page commits with poison-record quarantine; +4. content-addressed, atomic media storage. + +These directly address message loss, duplicate replay, stuck retries, and large +attachment recovery. Do not add a CRDT engine or replace IDS with CloudKit. +Those changes add substantial complexity without improving the current +read-only foundation. + +No third-party source code was copied during this review. + +## Best references + +| Project | Pattern to learn | OpenBubbles application | License posture | +| --- | --- | --- | --- | +| [Matrix Rust SDK](https://github.com/matrix-org/matrix-rust-sdk) | Durable per-room send queues, restart rehydration, dependent work such as upload-before-send, and explicit wedged items | Model each pending CloudKit save as durable work with prerequisites, retry eligibility, terminal quarantine, and restart recovery | Apache-2.0; compatible reference, but reimplement to fit the existing engine | +| [Apache PouchDB](https://github.com/apache/pouchdb) | Replication-specific checkpoints and conservative recovery from divergent endpoints | Scope tokens by account, container, database, zone, stream, and schema; advance only in the same durable transaction as the complete page journal | Apache-2.0; compatible reference | +| [Mozilla Application Services](https://github.com/mozilla/application-services) | Independent sync engines coordinated by shared authentication, scheduling, backoff, and telemetry | Keep messages, attachments, profiles, and future state engines isolated while sharing one coordinator and retry policy | Mixed/file-specific licensing; use architectural concepts only unless each source file is reviewed | +| [Chatmail Core](https://github.com/chatmail/core) | Restart-safe message processing, deduplication, bounded failure handling, and blob lifecycle patterns | Quarantine malformed records without losing later work; write media to a temporary file, verify it, then atomically rename into content-addressed storage | MPL-2.0 at repository root; reimplement concepts or isolate any modified MPL-covered file | +| [flutter_secure_storage](https://github.com/juliansteenbakker/flutter_secure_storage) | Platform-backed secret storage and migration concerns | Use as a behavior checklist for Android Keystore and Windows protected storage, not as a mandatory dependency | BSD-3-Clause | +| [Automerge](https://github.com/automerge/automerge) | Conflict-free merging of app-owned collaborative data | Consider only for future drafts or app-owned settings; Apple message history has server semantics and should not become a generic CRDT | MIT | +| [Signal Desktop](https://github.com/signalapp/Signal-Desktop) | Desktop queue, media, database, and recovery ideas | Architecture-only comparison; do not copy implementation into the Apache-2.0 app without an explicit relicensing decision | AGPL-3.0; direct reuse is not acceptable under the current app license | +| [OpenBubbles rustpush](https://github.com/OpenBubbles/rustpush) | Existing IDS and private CloudKit protocol boundary | Keep protocol-specific behavior behind the transport interface and document derivative-work boundaries | SSPL-1.0; handle separately from the Apache-2.0 Flutter app | + +## Concrete design translations + +### 1. Durable outbox state machine + +Each outbound logical operation should persist: + +- stable operation ID and account-scoped destination; +- prerequisites, such as attachment upload completion; +- attempt count, next eligible time, and server `Retry-After`; +- idempotency identity; +- `pending`, `inFlight`, `retryable`, `wedged`, `confirmed`, or `cancelled` + state; +- a redacted failure category. + +Process one account and stream through a single coordinator. A process crash +must return stale `inFlight` work to a safe replay state. User-visible failure +must not silently discard the operation. + +### 2. Checkpoint contract + +A checkpoint is valid only for one: + +`account fingerprint + container + database + zone + stream + schema version` + +The page journal, quarantined-record decisions, and replacement continuation +token must commit atomically. A record that was neither journaled nor durably +quarantined blocks token advancement. Repeating a completed page must create no +new logical work. + +### 3. Poison-record handling + +Malformed, undecryptable, oversized, or unsupported records should enter a +bounded quarantine with: + +- keyed diagnostic fingerprint; +- safe failure category; +- first and last observed timestamps; +- bounded attempt count; +- source page/run identity without raw Apple identifiers. + +Quarantine is evidence, not deletion. A later decoder or key recovery can +replay it. Repeated poison records must not create an infinite retry loop. + +### 4. Media pipeline + +For downloaded attachments: + +1. stream into a bounded temporary file; +2. enforce declared and observed byte limits; +3. compute a content hash while streaming; +4. verify integrity and expected media type; +5. atomically rename into content-addressed storage; +6. persist the database reference only after the file is durable; +7. reclaim unreferenced temporary files on startup. + +This avoids holding full media in memory and makes retry, deduplication, and +cross-client evidence straightforward. + +## What to build first + +The highest-return sequence is: + +1. propagate and persist `Retry-After`; +2. add a raw-page byte cap before protection; +3. add fail-closed V2 composition and a manual shadow sampler; +4. add redacted provenance and ephemeral cross-client event fingerprints; +5. add deterministic crash points around journal/checkpoint commit; +6. only then implement semantic apply and the durable outbox. + +CRDT merging, broad background scheduling, CloudKit deletions, and profile +synchronization should remain deferred. They would expand the failure surface +before the read-only transport and recovery invariants are live-proven. + +## License rule for implementation + +For every borrowed implementation idea, record the project, exact source URL, +license, whether code or only a concept was used, and the OpenBubbles file that +implements it. Those entries live in the +[provenance ledger](CLOUD_SYNC_V2_PROVENANCE_LEDGER.md); this section states the +rule, that document records the evidence. Apache-2.0, BSD, and MIT material may still require notices and +attribution. MPL code needs file-level handling. AGPL and SSPL code must not be +copied into the Apache-2.0 application without a deliberate licensing decision. diff --git a/docs/CLOUD_SYNC_V2_PATH_TO_PRODUCTION.md b/docs/CLOUD_SYNC_V2_PATH_TO_PRODUCTION.md new file mode 100644 index 0000000000..15ea8ca987 --- /dev/null +++ b/docs/CLOUD_SYNC_V2_PATH_TO_PRODUCTION.md @@ -0,0 +1,305 @@ +--- +type: roadmap +title: OpenBubbles Cloud Sync V2 Path to Production +description: Dependency-ordered sequence from the current verified state to a production rollout, separating code work from work that needs live Apple access, hardware, or a licensing decision. +resource: openbubbles-app +tags: [cloudkit, sync, rollout, validation, android, windows, arm64, x64] +timestamp: 2026-08-22 +--- + +# Cloud Sync V2 path to production + +## Purpose + +The rollout plan in [Cloud Sync V2](CLOUD_SYNC_V2.md) describes phases. The +gate documents describe conditions. Neither says, in order, what is actually +left and which parts cannot be finished by writing code. This does. + +Every claim below is either measured or labelled as an estimate. Where a +prior document is stale, this one says so rather than repeating it. + +## Where this actually stands + +Latest local evidence was refreshed on 2026-08-22. The current CI rerun is +pending after removing an unrelated protobuf rename that broke the committed +FRB mirror; Windows x64 and ARM64 already pass on the same change set: + +| Evidence | Result | +| --- | --- | +| Dart suite, ARM64 host | 533 tests pass | +| Cloud Sync suite, ARM64 host | 388 tests pass | +| Legacy ObjectBox upgrade probe, ARM64 host | copied pre-V2 database opens; source SHA-256 remains unchanged | +| Cloud Sync suite, x64 host | 296 pass on the prior cross-platform run | +| Cloud Sync suite in CI on Linux | passes, first time it has ever run there | +| `cloud_sync_protector_harness`, ARM64 | 43 tests pass | +| Kotlin FaceTime unit tests, Alpha variant | 14 tests pass | +| Windows x64 CI lane | passes | +| Windows ARM64 CI lane | passes | +| Release Rust libraries | correct PE ARM64, PE x64, ELF64 AArch64 | +| `cargo test` on the main crate | 130 tests pass | + +What that evidence does **not** cover: no live CloudKit fetch has ever run, no +record has been decoded from a real Apple account, and nothing has been written +to a message table by the V2 path. The production code now supports that first +bounded semantic canary, but code-path coverage is not live-account evidence. + +## The honest shape of the remaining work + +Three categories, and only the first is ours to finish by typing. + +1. **Code and tests.** The bounded semantic canary is now composed behind its + own compile-time and Developer Mode gates. It projects supported chats, + messages, reactions, and attachment metadata into ObjectBox while remote + saves, remote deletes, local tombstones, automatic triggers, and unbounded + traversal remain structurally disabled. The remaining code work is + hardening found by review and the later write path, not the first read-only + semantic projection. +2. **Live validation.** Cannot be done offline at any effort level. Needs a + Mac-activated Apple account with real history, a trusted device for PCS key + access, and soak time measured in days. +3. **Blocked by something other than engineering.** ANGLE from pinned source + for the Windows desktop package, a signing keystore for release Android + builds, and the licensing question on redistributing libmpv/FFmpeg. + +## Sequence + +Dependency-ordered. Each step assumes the ones above it. + +### Stage 1 — close what CI can prove + +Nothing here needs a device or an Apple account. + +1. ~~**Land the protocol corrections** from the prior-art review.~~ **Done, + with one correction worth recording.** The reaction parent now accepts the + bare-GUID partless form and the `bp:` bubble/tapback spelling, both parsers + agree on the part spelling, and the legacy CloudKit download path parses the + parent instead of storing the wrapper. + + Two of the four items in the original review were already correct in the + tree: `filt`/`sqry`/`ste` were already `i64`, and the `MessageSummaryInfo` + nesting was already right down to `bcg` inside `MessageEdit`. + + The fourth was wrong, and the error is instructive. The review said + `bp`/`bpdi` are IDS wire keys rather than record fields. That is true of the + **field names** in the IDS payload, and says nothing about the `bp:` + **prefix** inside `associatedMessageGuid`, which is a real shape that this + app's own `Message.fromMap` has always stripped. Acting on the first + statement as though it covered the second briefly made both parsers reject a + valid parent. Field names and identifier prefixes are different things even + when they share letters. +2. ~~**Decide the discovery zone set.**~~ **Done for the raw sampler.** The + bounded read-only sampler now inspects the original three Manatee zones plus + `messageUpdateZone`, `recoverableMessageDeleteZone`, + `scheduledMessageZone`, and `chat1ManateeZone`. Stable native stream tags 4 + through 7 preserve checkpoint separation. The four auxiliary streams are + deliberately rejected before semantic decode, and the existing production + record-count path remains limited to its original three zones. +3. **Resolve the `EMPTY_LIST` question.** The CloudKit wire format has a + distinct type for "present but empty" and our tri-state depends on it. Prior + art collapses it with absent and therefore cannot answer whether Apple emits + it. This is a question for the first live fetch, but the transport must be + able to *record* the distinction before that run, or the run cannot answer it. + +4. ~~**Decide what unblocks a stalled applied floor.**~~ **Done: advance + through terminal quarantine while retaining the journal evidence.** + `_advanceContiguousApplied` now treats both `applied` and `quarantined` as + terminal. Pending and retryable rows still block the floor. + + The consequence chain is worth stating plainly. One malformed record blocks + the floor, the pending journal keeps growing, the journal budget eventually + refuses further fetches, and sync stops. If the stall outlasts the CloudKit + change-token lifetime the token expires and the cost is a full re-bootstrap + of the entire zone, which is far worse than the single record that caused it. + That lifetime is undocumented, so no safe stall duration can be assumed. + + The retained quarantine row preserves the protected source reference, + failure category, and replay evidence for a later decoder or targeted + recovery. It is not silently deleted. The tradeoff is explicit: CloudKit + will not automatically re-offer that change after the terminal floor moves, + so a future fetch-by-record-name repair path remains useful. This is safer + than allowing one malformed record to stop an entire zone indefinitely when + Apple's change-token lifetime is undocumented. + +Additional safety closures in this stage: + +- Dependency-deferred inbox rows now have a bounded terminal path, but only + after both eight attempts and three days by default. Ordinary retryable + network, server, and storage failures are not captured by that terminal rule. +- The outbox leases only the earliest nonterminal mutation for each logical + entity, so a newer delete cannot overtake an older leased or paused save. +- Push-only runs can revive an all-paused authorization or PCS outbox after a + successful subsystem refresh. Failed refreshes retain the paused row and a + durable six-hour retry delay prevents a trigger-driven refresh storm. +- The current ObjectBox model successfully opens a copied legacy database and + leaves the source hash unchanged. That source contained no canonical message + rows, so a non-empty real-history migration probe is still required before + rollout. + +Exit: CI green on all lanes with the corrections landed. + +### Stage 2 — first live read-only run + +The prerequisites here are the reason this stage is not schedulable purely by us. + +Operator inputs, none of which the app can supply: a Mac-activated Apple +account with Messages in iCloud enabled and real message history; iCloud +Keychain on with the device admitted to the clique; a trusted device passcode, +because PCS keys are only available to trusted devices and under Advanced Data +Protection there is no server-side fallback at all; and local 2FA entry. + +5. **Install the sampler build** on a device whose profile is separate from any + real account, and verify package identity, UID, native ABI, and data + directory before trusting isolation. +6. **Run the shadow sampler first.** This fetches and protects one bounded page + without canonical message-table writes. Do not move to semantic projection + if any zone fails its transport, journal, checkpoint, account, or write + tripwire checks. +7. **Read the shadow result carefully.** A zone that returns `completed` with + `fetched: 0` and no failure category is a success, but an empty zone and a + never-populated zone are indistinguishable in the report. Confirm upload + from the Mac first or this stage proves only that transport works. +8. **Run one semantic pull canary, then one immediate replay in the same + session.** It processes chats, messages, then attachments, at one page and + 50 changes per zone. A pass requires all three exact zones to complete, zero + deferred, quarantined, or retried records, and unchanged empty outbox + tripwires. The replay must be in-session: the journal budget rejects pending + entries older than 24 hours, so a next-day replay can be legitimately + blocked and look like a failure. + +Exit: bounded fetch, protected journaling, checkpoint behaviour, canonical +projection, and replay idempotence demonstrated against a real account. It +still does not prove full-history coverage, legacy coexistence, or writes. + +### Stage 3 — semantic apply + +The largest block of code work, and the first point at which the local message +database is written by this path. + +9. ~~**Widen the bridge once.**~~ **Done.** Rich transient payloads now carry + validated canonical identities for chats, messages, reactions, and + attachment metadata without exposing raw CloudKit identifiers or records. + + Carry the `EMPTY_LIST` observation across at the same time. + `CloudRawRecordPresence` already records which fields arrived with that wire + type, but nothing can read it from Dart, so the evidence is gathered and + discarded. It is held back rather than regenerated for one diagnostic field. +10. ~~**Implement the Dart semantic decoder boundary.**~~ **Done and composed + only by the manual semantic canary.** + `RustCloudSemanticDecoder` validates the complete scope, generation, + protected source capability, native session before and after decode, + one-of result shape, mutation kind, entity kind, logical hashes, field + presence, and timestamps. Native failures map only to typed safe categories. + Partial messages and unproven tombstone identities defer instead of + inventing content or deletion targets. Fifteen focused tests cover all + current payload lanes, every native failure code, source/session mismatches, + mixed dispositions, partial messages, reactions and removals, explicit + clears, edit revisions, tombstones, and auxiliary-zone rejection. The + separately compile-gated canary now enables bounded local semantic apply; + remote mutations and automatic execution remain disabled. +11. ~~**Expand the production entity adapter.**~~ **Done for the current canary + lanes.** Supported chat, message, reaction, and attachment metadata records + map onto the real ObjectBox entities. Display-name clears, profiles, group + photos, media bytes, and tombstones remain gated or unsupported rather than + guessed. +12. ~~**Respect the transaction boundary.**~~ **Done.** Canonical mutation, + merge snapshot, identity mapping, replay outcome, inbox terminal state, and + checkpoint floor share one ObjectBox transaction. A full native account + identity recheck occurs immediately before that write. +13. **Prove no duplicate rows.** `Message.guid` is unique, and the legacy + CloudKit path still ships. A live coexistence test is the only way to show + V2 does not create duplicates alongside it. + +Exit: deterministic identical projection across replay, restart, ARM64, and +x64, with zero lost and zero duplicated logical message GUIDs. + +### Stage 4 — writes + +14. **Enforce one writer per account.** V2 becomes the only CloudKit writer. + The legacy path may remain available for read/restore during migration, but + its uploads and duplicate-record deletion must be structurally unavailable + whenever V2 owns the profile. Today the two paths have separate record maps, + and legacy duplicate cleanup can otherwise delete a valid V2-owned record. +15. **Complete durable record and request identity.** Store the proven CloudKit + predecessor change tag/CAS value, record type, owner, generation, server + ordering, deletion fence, HTTP request UUID, and per-operation UUID. Add + reverse uniqueness for server record identity. Do not treat a different + opaque ETag hash as proof that an observation is newer, and do not conflate + the request UUID, operation UUID, record ETag, or change-feed ETag. Prepare + authentication first, then assign and persist the request and operation + UUIDs in the same transaction that marks submission started. The native + writer must consume those exact identities without refreshing or replaying. +16. **Validate every push result exactly.** Reject duplicate, missing, and + unknown operation IDs before durable confirmation, and bind every result to + action, logical identity, payload digest, server identity, and expected + change tag. Chat saves are atomic in Apple's iOS 26 implementation; message + and attachment saves are non-atomic and require per-record outcomes. +17. **Fence network workers through completion.** An expired outbox lease may + never confirm a late result. Add lease generation/expiry CAS, bounded push + duration or heartbeat renewal, coordinator renewal during network work, and + attempt-plus-age retry/dead-letter policy. The direct expired-lease result + race is now fixed in both ObjectBox and the in-memory reference store; the + remaining generation and heartbeat work stays open. +18. **Couple local mutation and outbox admission.** One ObjectBox transaction + must perform the canonical local mutation, allocate its monotonic revision, + insert/coalesce the outbox operation, update any proven mapping, and + revalidate account plus generation. No production caller has this API yet. +19. **Retain durable tombstone causality.** A delete needs an existing validated + mapping, local/outbox revision checks, a durable deletion fence, and tests + proving an older save cannot resurrect it. Incoming chat-record deletion + must not erase a local conversation merely because CloudKit reported it; + Apple's current importer deliberately leaves that action to IDS. +20. **Build a dedicated V2 Rust writer.** It must expose zone-specific PCS + protection, explicit save policy and atomicity, per-record save/delete + results, returned server change tags, conflict classification, and + read-after-ambiguous-result reconciliation. The current private protobuf is + missing fixture-verified request/response ETag and conflict/protection + fields visible in Apple's private client declarations. Obtain serialized + fixtures and establish their wire numbers before implementing them; never + infer wire numbers from header property order. A missing record after an + ambiguous delete and `REQUEST_ALREADY_PROCESSED` without authoritative + per-record results both remain unresolved. Do not expose the legacy + wrappers as though they satisfy this contract. + +Exit: lost-response, duplicate/missing/unknown-result, change-tag conflict, +lease-expiry, crash-boundary, account-switch, reset-with-outbox, +save/delete/save, tombstone-replay, and legacy/V2 coexistence tests all pass. +Only then may a disposable test account run a one-record outbound canary. + +### Stage 5 — rollout + +21. Android wake-cost suite under Doze, Battery Saver, locked screen, and 24-hour + idle, with paired sync-off and sync-on runs. No credible battery claim can + be made before this, and none is made now. +22. Staged rollout with the alarm thresholds already specified in the + production-readiness notes wired as rollback signals. + +## What is blocked on something other than code + +| Item | Blocker | Consequence if unresolved | +| --- | --- | --- | +| Windows desktop package | ANGLE built from pinned official source; the bundled media package deliberately refuses the unlicensed third-party ARM64 bundle | No runnable Windows build; the Rust bridge itself already builds for both architectures | +| Android release signing | Keystore and `android/key.properties` absent | Debug and profile packages only | +| Public redistribution | libmpv/FFmpeg transitive licence inventory incomplete | Cannot ship publicly regardless of engineering state | +| `rustpush` crate-level test execution on the Windows host | Smart App Control blocks newly rebuilt test executables | The dedicated CI gate now runs these tests; do not disable the local policy | +| Cross-client provenance | Per-install fingerprints cannot prove the same event reached two clients | Two clients showing the same message proves nothing without explicit cloud provenance | + +## Standing constraints + +These are invariants, not preferences. + +- IDS delivery and CloudKit state stay separate. A CloudKit failure must never + delay a send, a receive, local persistence, or the UI. +- Never automatically reset an iCloud Keychain clique, delete a zone, clear a + token after an unknown failure, or discard a pending journal. +- Never switch an account in place on an existing local profile. +- rustpush is SSPL-licensed. Protocol facts learned from it are facts; its code, + derive macros, and generated protobuf definitions are expression and must not + be absorbed into the Apache-2.0 layer. Keep a provenance ledger entry per + borrowed idea. + +## What would change this plan + +Finding that `messageUpdateZone` and `recoverableMessageDeleteZone` carry edits +and recoverable deletes would move zone coverage ahead of semantic apply, +because building the adapter against an incomplete zone set would need redoing. +That question is answerable in the first live run and should be asked then. diff --git a/docs/CLOUD_SYNC_V2_PRODUCTION_READINESS_RESEARCH.md b/docs/CLOUD_SYNC_V2_PRODUCTION_READINESS_RESEARCH.md new file mode 100644 index 0000000000..d30632ccb3 --- /dev/null +++ b/docs/CLOUD_SYNC_V2_PRODUCTION_READINESS_RESEARCH.md @@ -0,0 +1,1925 @@ +--- +type: research_note +title: Cloud Sync V2 Production Readiness Research +description: Current primary-source and upstream-issue evidence for production gates on Android, Windows x64, and Windows ARM64. +resource: openbubbles-app +tags: [cloud-sync, cloudkit, android, windows, objectbox, rustpush, production-readiness] +timestamp: 2026-08-01 +--- + +# Cloud Sync V2 production readiness research + +## Decision + +Keep Cloud Sync V2 in read-only shadow mode. Do not enable semantic pull, saves, +or tombstones for general users until the release gates below pass on a real Pixel, +Windows x64, and Windows ARM64. The architecture in `CLOUD_SYNC_V2.md` remains +sound, but current upstream reports prove that authentication/PCS, partial history, +large-history responsiveness, and two-phase attachments are not yet production +risks that can be treated as hypothetical. + +This note is source research, not an assertion that the private Apple Messages +CloudKit service supports a particular client behavior. No Apple access was made, +and no third-party code was copied. + +## Primary-source findings that change the implementation gate + +### CKSyncEngine is a model, not a usable transport replacement + +Apple documents that `CKSyncEngine` must be initialized with its last state +serialization, and that an app must durably persist every state update together +with the local changes to which it applies. It batches record changes, has a +250-record request maximum, emits per-record failures, uses push subscriptions as +sync hints, monitors account changes, and can cancel outstanding operations. +It handles transient network and throttling failures, but the application still +owns conflict handling, zone recreation, and local persistence. + +OpenBubbles cannot substitute this API for the private Messages container. Apply +the same invariants to the Rust transport: atomically couple journal/checkpoint, +make deletions tombstones, retain a pending operation after a missing or failed +per-record response, and treat any push as a coalesced *hint* to fetch rather +than proof of data. On account switch or sign-out, stop the scoped coordinator, +retire its lease, and never reuse its checkpoint or queue for a different account. + +Sources: [Apple CKSyncEngine](https://developer.apple.com/documentation/cloudkit/cksyncengine-5sie5), +[WWDC23 Sync to iCloud with CKSyncEngine](https://developer.apple.com/videos/play/wwdc2023/10188/), +and [Apple's MIT sample](https://github.com/apple/sample-cloudkit-sync-engine). + +### Android must not poll for near-real-time reconciliation + +Android Doze suspends network access and defers JobScheduler work, including +WorkManager. The platform recommends FCM rather than a persistent client +connection when it is available. Normal-priority notifications may wait for a +maintenance window. High priority is only for user-visible, time-sensitive +notifications; it receives a short processing window, after which an expedited +WorkManager job may continue necessary work. WorkManager is restart/reboot +durable, but normal workers are not real-time and have a ten-minute execution +limit. + +For the private APNs/IDS path, do not request a battery-optimization exemption +merely to improve CloudKit freshness. A received IDS/APNs event, foreground +resume, manual sync, or detected local gap should enqueue one named, account- +scoped sync request. Coalesce events for 15 seconds, give an interactive manual +request a 30-second foreground budget, and let ordinary reconciliation use a +network-constrained WorkManager job. Use unmetered network for attachment +prefetch and user-selected media only; metadata and user-tapped media may use a +connected network. Persist the lease before scheduling, and release it only after +the ObjectBox transaction marks the page outcome. + +Android Keystore operations cross into a system process and Android explicitly +warns of performance trade-offs. It should unwrap a per-install master once when +the worker starts, protect it in memory only for that bounded run, and encrypt +small journal values locally. It must not Keystore-wrap every record, attachment +chunk, retry, or UI frame. + +Sources: [Doze and App Standby](https://developer.android.com/training/monitoring-device-state/doze-standby), +[WorkManager scheduling](https://developer.android.com/develop/background-work/background-tasks/persistent), +[battery optimization guidance](https://developer.android.com/develop/background-work/background-tasks/optimize-battery), +[FCM priority](https://firebase.google.com/docs/cloud-messaging/android-message-priority), +and [Android Keystore](https://developer.android.com/privacy-and-security/keystore). + +### Windows secrets and migrations need one user-scoped, architecture-neutral contract + +Default DPAPI protection is decryptable by the same Windows user on the same +machine. `CRYPTPROTECT_LOCAL_MACHINE` instead permits every local user and is not +appropriate for Apple identity material. DPAPI is an OS service, not a portable +backup format; a copied Windows profile or different user must fail closed and +enter an explicit recovery flow. + +Use the same current-user DPAPI blob and format for x64 and ARM64. Protect one +random master key at profile initialization and use that master for normal +authenticated encryption, rather than calling DPAPI for every secret use. For a +migration: take an exclusive, user-qualified lock; parse/authenticate the whole +legacy file; write and flush a same-directory temporary V2; reopen and verify it; +then invoke `ReplaceFileW` with a backup. `ReplaceFile` may still fail at several +steps, so startup must examine original, replacement, and backup candidates by +format version and authenticated content before declaring a corrupt empty store. +Do not use TxF as the recovery strategy. + +Sources: [CryptProtectData](https://learn.microsoft.com/en-us/windows/win32/api/dpapi/nf-dpapi-cryptprotectdata), +[DPAPI scope guidance](https://learn.microsoft.com/en-us/windows/win32/seccrypto/example-c-program-using-cryptprotectdata), +and [ReplaceFileFromAppW failure semantics](https://learn.microsoft.com/en-us/windows/win32/api/fileapifromapp/nf-fileapifromapp-replacefilefromappw). + +### ObjectBox needs page-level writes, not message-level durability calls + +ObjectBox states that commits require a filesystem sync and can cost milliseconds; +many implicit puts turn a large history into a write-amplification and UI-jank +problem. Its explicit transactions are ACID and are the right boundary for +`inbox rows + semantic writes + contiguous applied position`, not for network, +PCS decryption, or attachment downloading. Keep external Apple IDs as stable +unique properties, not ObjectBox IDs. Preserve the ObjectBox model JSON and UIDs +as source-controlled migration state across all three platforms. + +For media, stream into a bounded temporary file, hash while streaming, validate, +flush, atomically place it under a content hash, then transactionally create the +attachment reference. A message with text and an attachment is expressly a +two-phase delivery shape upstream, so attachment updates must be idempotent and +requeue a missing local blob after the metadata replacement commits. + +Sources: [ObjectBox transactions](https://docs.objectbox.io/transactions), +[ObjectBox IDs](https://docs.objectbox.io/advanced/object-ids), and +[ObjectBox model IDs and UIDs](https://docs.objectbox.io/advanced/meta-model-ids-and-uids). + +## Current OpenBubbles evidence + +| Evidence | Production implication | +| --- | --- | +| [#222](https://github.com/OpenBubbles/openbubbles-app/issues/222), updated 2026-07-22: `AnyhowException (Bad message)` after reinstall/sync | Never make local-state wipe the recovery path. Preserve a redacted failure envelope, checkpoint, and raw protected record reference for diagnosis. | +| [#186](https://github.com/OpenBubbles/openbubbles-app/issues/186): PCS share-key failure | Missing PCS/clique material is a paused, typed, non-destructive state, not a retry loop or reset condition. | +| [#212](https://github.com/OpenBubbles/openbubbles-app/issues/212): only partial history and empty chats | A completion UI must distinguish fetched pages, semantically applied records, quarantined records, and declared time-window exclusions. | +| [#194](https://github.com/OpenBubbles/openbubbles-app/issues/194): eight-year history causes performance issues | Enforce bounded raw-page, protected-journal, semantic-apply, and UI-yield budgets. Time-window sync is a product choice, never an invisible data-loss mechanism. | +| [#207](https://github.com/OpenBubbles/openbubbles-app/issues/207): text-plus-attachment second phase persists metadata but does not start download | Make attachment metadata updates enqueue idempotent blob work; expose pending/retry state rather than a dead MIME placeholder. | +| [#169](https://github.com/OpenBubbles/openbubbles-app/issues/169): Apple response schema lacks `trustedPhoneNumbers` | Treat login/profile responses as versioned, optional-field protocol data; decode failures must be recoverable diagnostics, never an unhandled setup crash. | +| [#226](https://github.com/OpenBubbles/openbubbles-app/pull/226): acknowledged push after failed handling could permanently drop an incoming message | Retain the ordering invariant: commit semantic message state before acknowledgement; a failure leaves the event retryable. | +| [#231](https://github.com/OpenBubbles/openbubbles-app/pull/231), draft: remaining long-duration and Windows validation | Its Android cache limits are useful guardrails, but x64 installation/launch and ARM64 remain explicit readiness gaps. | + +`rustpush` is presently reported by GitHub as license `Other`; keep it as a +protocol boundary and do not copy source into the Apache-2.0 Flutter layer without +an explicit license decision. Apple's sample is MIT. ObjectBox documentation and +Android/Windows documentation are design references, not code sources. + +## Direct rustpush transport evidence and V2 adapter requirements + +The current [`cloud_messages.rs`](https://github.com/OpenBubbles/rustpush/blob/master/src/imessage/cloud_messages.rs) +implements three private zones: `chatManateeZone`, `messageManateeZone`, and +`attachmentManateeZone`. The record decoder defines encrypted +[`chatEncryptedv2`](https://github.com/OpenBubbles/rustpush/blob/master/src/imessage/cloud_messages.rs#L232-L233), +[`MessageEncryptedV3`](https://github.com/OpenBubbles/rustpush/blob/master/src/imessage/cloud_messages.rs#L314-L315), +and [`attachment`](https://github.com/OpenBubbles/rustpush/blob/master/src/imessage/cloud_messages.rs#L473-L474) +records. `CloudAttachment` contains metadata and CloudKit assets, but the +fetch path requests `NO_ASSETS`; it is therefore metadata reconciliation, not +proof that a local attachment blob is present. + +The generic fetch path forwards an opaque continuation token to CloudKit and +returns the next token plus an in-memory map of `record ID -> decoded record or +None`. A missing `change.record` becomes `None` (a deletion/tombstone signal). +However, a record whose type differs from the requested type is silently skipped, +and a `PCSRecordKeyMissing` clears the cached zone configuration then aborts the +entire call. The code also dereferences several server fields with `unwrap`. +See [`sync_records`, lines 503-549](https://github.com/OpenBubbles/rustpush/blob/master/src/imessage/cloud_messages.rs#L503-L549). + +V2 must not expose that lossy map as its checkpoint boundary. The Rust bridge +should return an ordered, bounded raw change envelope for *every* change with: +record-ID hash, record type, deletion marker, raw protected payload reference, +server status, and next-token candidate. Dart can then commit the complete page +to the account-scoped journal before invoking a strict decoder. A missing PCS +record key becomes a per-record quarantined/paused outcome where possible. If the +private protocol makes it impossible to continue past the missing key, preserve +the pre-page token and report the whole page as blocked. Do not silently advance +to the returned token. + +The current save path batches 256 operations and records individual save +outcomes, which is useful for V2's explicit-confirmation rule. The delete path +instead retries whole 256-record batches three times at a fixed five-second +delay and returns only a batch-level result. See +[`save_records`, lines 552-582](https://github.com/OpenBubbles/rustpush/blob/master/src/imessage/cloud_messages.rs#L552-L582) +and [`delete_records`, lines 584-599](https://github.com/OpenBubbles/rustpush/blob/master/src/imessage/cloud_messages.rs#L584-L599). +Before enabling tombstones, change the V2 adapter contract, not necessarily the +legacy path: retain each delete as a durable outbox item until a specific server +confirmation is recorded; retry only classified transient failures; and preserve +any server-provided retry hint. Fixed retries are unacceptable for an automatic +mobile/desktop scheduler. + +The upstream implementation includes a `reset()` routine that deletes the three +active zones plus several additional private zones. It is not a recovery action +for V2. An automatic call would be destructive and cannot repair an account +switch, failed PCS fetch, or continuation issue. See +[`reset`, lines 620-652](https://github.com/OpenBubbles/rustpush/blob/master/src/imessage/cloud_messages.rs#L620-L652). + +One current issue supplies a Windows ARM64 production failure mode that belongs +in the scheduler tests: a backward NTP correction after Modern Standby can panic +the IDS identity cache and drive a CloudKit retry loop at approximately 13 +errors/minute with a pegged core. [rustpush #29](https://github.com/OpenBubbles/rustpush/issues/29) +has the reproduction and evidence. All sync backoff and lease expiry must use a +monotonic elapsed clock in-process. Persisted eligibility time must tolerate a +wall-clock rollback by imposing a bounded restart delay, not repeatedly becoming +immediately eligible. + +## Exact platform constraints and recovery additions + +For normal metadata reconciliation, require `NetworkType.CONNECTED` plus +`BatteryNotLow` and `StorageNotLow`. For automatic attachment prefetch, require +`NetworkType.UNMETERED`, `BatteryNotLow`, and `StorageNotLow`; add `RequiresCharging` +only for non-user-visible catch-up/backfill. Multiple WorkManager constraints are +conjunctive, and a worker stops and retries if one becomes unmet mid-run. Do not +set `DeviceIdle` on an interaction-triggered sync because it intentionally waits +for inactivity. Sources: [Android work-request constraints](https://developer.android.com/develop/background-work/background-tasks/persistent/getting-started/define-work) +and [Constraints.Builder](https://developer.android.com/reference/kotlin/androidx/work/Constraints.Builder). + +DPAPI's documented same-user/same-machine scope means a protected blob should +be architecture-neutral in representation, but this is an interoperability +requirement to prove, not a Windows guarantee specific to OpenBubbles. The +release test must copy one synthetic profile between an x64 and ARM64 build +under the same user, protect/unprotect fixture secrets in both directions, then +repeat after a partial migration. A different Windows user or machine must fail +closed. `ReplaceFileW` requires replacement, target, and optional backup to be +on the same volume, and documents intermediate failure outcomes, so startup +recovery must authenticate and choose among original, replacement, and backup; +it must never pick a file merely because it exists. Source: +[ReplaceFileW](https://learn.microsoft.com/en-us/windows/win32/api/winbase/nf-winbase-replacefilew). + +## Additional focused tests + +1. A fixture page containing a tombstone, an unsupported record type, a malformed + encrypted record, and a PCS-key-missing record must either journal all four + outcomes or leave the old checkpoint unchanged. +2. Replay a raw page twice on Pixel, Windows x64, and Windows ARM64. Compare a + normalized export of logical IDs, revisions, tombstone state, attachment + content hashes, and quarantine category. ObjectBox internal IDs, timestamps, + filesystem paths, and protected bytes are deliberately excluded. +3. Deliver attachment metadata twice, then complete or cancel the blob stream in + each order. The message must have one attachment reference and at most one + final content-addressed file. A restart between file placement and database + reference must be repairable by startup reconciliation. +4. Inject a backward wall-clock adjustment during exponential backoff and after + a Windows Modern Standby resume. Assert no panic, no CPU spin, one lease, and + no more than the configured retry attempt before its monotonic delay expires. + +## Decoder, scheduler, and media details from this follow-up pass + +### Treat the private schema as partial knowledge, not a complete contract + +Direct inspection shows useful but deliberately uncertain field semantics in +rustpush. A chat records a stable chat identifier, group identifier, service, +participants, read timestamp, GUID, optional display name, and optional group +photo; its `style` comment identifies 45 as normal and 43 as group. See +[`CloudChat`](https://github.com/OpenBubbles/rustpush/blob/master/src/imessage/cloud_messages.rs#L231-L269). +A message exposes unencrypted `utm`, `msgType`, and `eCode`, while its chat ID, +sender, Apple-epoch nanosecond time, GUID, service, flags, and compressed +protobuf payloads are encrypted. See +[`CloudMessage`](https://github.com/OpenBubbles/rustpush/blob/master/src/imessage/cloud_messages.rs#L313-L340). +Attachment metadata includes MIME type, declared total bytes, transfer state, +attachment GUID, filename, UTI, created date, and a truncated MD5 field, while +the record also has an `lqa` asset. See +[`AttachmentMeta` and `CloudAttachment`](https://github.com/OpenBubbles/rustpush/blob/master/src/imessage/cloud_messages.rs#L424-L477). + +The comments explicitly call some fields unknown and state that dates can be +negative. V2 must therefore not treat `style`, `state`, transfer state, display +name, timestamps, filename, or truncated MD5 as an authoritative conflict key +or integrity proof. Use record identity plus the explicit logical GUIDs where +present; store unrecognized fields in the protected raw envelope for a later +decoder instead of normalizing them away. Validate actual blob byte count and a +full locally computed digest after download. Never derive a filesystem path from +the cloud filename or UTI. + +The local private protocol defines each change as `identifier`, `etag`, +`recordType`, integer `type`, and optional `record`, and returns both a server +continuation token and a client change token. That makes a no-record change a +tombstone observation tied to the immutable identifier and etag, not a reason to +discard the record identity. It also carries `changedShares`, archived-record, +delta, obligation, and zone-attribute fields that the current path does not +model. See +[`RetrieveChangesResponse`](https://github.com/OpenBubbles/rustpush/blob/master/cloudkit-proto/src/cloudkit.proto#L772-L800). +V2 raw pages must preserve all of these known fields or explicitly record the +unsupported field category before checkpoint advancement. A tombstone's durable +identity is `account scope + zone + record identifier hash + etag`, not only a +message GUID that may be unavailable after deletion. + +### Checkpoint and quarantine model + +The Apache CouchDB replication protocol provides a directly applicable durable +checkpoint rule: record a checkpoint only after a batch has been uploaded and +committed successfully, so recovery resumes at the last point of success. Its +history/common-ancestry algorithm also demonstrates why a checkpoint needs a +replication identity and session provenance, not merely a naked token. See +[CouchDB replication protocol](https://docs.couchdb.org/en/stable/replication/protocol.html). + +For V2, add `checkpointGeneration`, `runID`, and `rawPageDigest` to the +account-scoped checkpoint. The one ObjectBox transaction that admits a page must +write: raw inbox rows or per-record quarantine rows, the page digest/generation, +and the next token candidate. The separate semantic transaction advances the +applied generation only through the contiguous resolved prefix. If current +protocol limitations force a whole-page PCS failure, store a scoped +`blockedPCS` generation with the old fetch token, not the returned token. A +manual credential/key recovery may clear only that scoped block and replay. + +### Android process coordination and unique-work policy + +`WorkManager.enqueueUniqueWork` guarantees only one named *work chain*, not a +single owner of ObjectBox across a foreground Flutter engine, background Flutter +engine, or an already-running worker. Use a unique name derived from an +account-scope hash and `KEEP` for a pure debounce trigger. Do not use `REPLACE`: +it cancels running work, and cancellation/constraint loss invokes `onStopped`. +The worker must make cleanup/cancellation idempotent and leave its durable lease +recoverable. `APPEND` is also wrong for recurring hints because a failed or +cancelled prerequisite propagates that status; `APPEND_OR_REPLACE` is useful only +when intentionally building a durable follow-up chain. Sources: +[Manage work](https://developer.android.com/develop/background-work/background-tasks/persistent/how-to/manage-work), +[ExistingWorkPolicy](https://developer.android.com/reference/androidx/work/ExistingWorkPolicy), +and [WorkManager](https://developer.android.com/reference/kotlin/androidx/work/WorkManager). + +A Dart `RandomAccessFile` lock is not sufficient as the only coordinator: the +Dart API documents platform-specific semantics, including that multiple isolates +in one Linux/macOS process can obtain an exclusive advisory lock; on Windows the +lock is associated with the acquiring file handle. Use the ObjectBox lease row as +the authority, with a fencing generation checked in every write transaction. +Optionally add a best-effort native/file lock to reduce contention, but never let +it decide correctness. Source: [Dart RandomAccessFile.lock](https://api.dart.dev/dart-io/RandomAccessFile/lock.html). + +### Attachment placement and time contract + +The directly relevant `atomic-blob-store` project documents an appropriate +media-file contract: size-limited streaming write, content-addressed key, +complete-blob validation on read, explicit quarantine, and the possibility that +an atomic-commit error is ambiguous and must be resolved by reloading the +canonical location. Its license is reported by GitHub as `Other`, so use this as +an architectural reference only, not copied code. Source: +[atomic-blob-store](https://github.com/thehouseisonfire/atomic-blob-store). + +Implement `attachment_download` as a durable state machine: +`metadataReady -> tempStreaming -> contentVerified -> filePlaced -> referenced`. +The temp filename must be generated in the final directory, opened exclusively, +and never exposed to the UI. Stream with a hard byte limit and a full SHA-256 or +BLAKE3 digest; validate expected length/type; flush and close; atomically place +under the digest; reopen and validate on an ambiguous placement error; then add +the ObjectBox reference. At startup, reconcile final files with references and +only remove an old, application-owned temp file after confirming that it is not +the sole recovery evidence for an in-flight journal row. + +Use a monotonic clock only for in-process lease expiry, cancellation deadlines, +and retry delays. Rust documents `Instant` as opaque and monotonic but not +persistable or guaranteed to span suspension consistently, so it cannot be the +on-disk schedule. Android's `elapsedRealtime` is monotonic and includes deep +sleep; Windows QPC is monotonic and independent of external time. On restart, +compare a persisted wall deadline defensively: if it is implausibly far in the +future after clock rollback, cap the wait to a small conservative delay, retain +the attempt count, and record `clockSkew`; do not make the work immediately due +or reset its budget. Sources: [Rust Instant](https://doc.rust-lang.org/std/time/struct.Instant.html), +[Android SystemClock](https://developer.android.google.cn/reference/android/os/SystemClock), +and [Windows QPC guidance](https://learn.microsoft.com/en-us/windows/win32/sysinfo/acquiring-high-resolution-time-stamps). + +## New regression cases + +1. Decode every known field from the three record types, plus negative dates, + unknown enum values, absent optional fields, an unknown record type, and a + tombstone with only identifier/etag/type. Assert lossless protected-envelope + journaling and no panic. +2. Race a foreground engine, an APNs background engine, and a WorkManager worker + against one account scope. Verify unique-work coalesces hints while the + ObjectBox fencing lease admits exactly one semantic/page writer. +3. Cancel an active unique work request and drop the network constraint mid-page. + Verify `onStopped` leaves no in-flight lease permanent, no token movement, + and no partially referenced attachment. +4. Kill during each attachment state and simulate a final-placement ambiguity. + Restart must reach one of: verified final blob plus reference, verified final + blob awaiting reference, or a retained recoverable temp/journal row. It must + never display a completed attachment whose digest was not verified. + +## Budget proposal and acceptance tests + +These are client policies, deliberately not claimed Apple service limits. + +| Area | Budget | Gate | +| --- | --- | --- | +| Metadata fetch/admission | 256 records and 4 MiB decoded metadata per page; reject atomically above either bound | Exact limit, one-over, repeated continuation, malformed record, and crash before/after page journal commit. | +| Semantic apply | 100 records or 100 ms per ObjectBox transaction, then yield; no network/PCS work inside transaction | 8-year sanitized fixture: no duplicate GUID, no skipped contiguous checkpoint, UI remains responsive. | +| Automatic work | One coordinator/account/scope; 15 s trigger debounce; full-jitter persisted backoff, honor `Retry-After` | 100 push/reconnect hints, process death, clock change, and metered/unmetered transitions produce one active lease and no retry storm. | +| Android wake cost | No polling; normal background work for reconciliation; expedited work only immediately after a user-visible high-priority event | Doze, Battery Saver, locked screen, and 24-hour idle run: no exemption prompt, no persistent socket kept only for CloudKit. | +| Media | 1 concurrent automatic transfer, 2 user-tapped transfers; 8 MiB RAM buffer ceiling per transfer; streamed hash/dedupe | Text-plus-media two-phase event, duplicate attachment, cancellation midstream, disk full, resume, and orphan-temp cleanup. | +| Windows migration | x64 -> ARM64 -> x64 under the same Windows user; no plaintext secret file; crash points at every migration step | Original/temp/backup recovery permutations, second process lock contention, wrong user, and corrupted authenticated blob fail closed. | + +## Ship criteria + +Enable Phase 2 semantic pull only after all three platforms pass the same +fixture/replay corpus, Android passes the Doze and locked-phone suite, and both +Windows architectures pass profile migration plus installed-artifact smoke tests. +Enable writes only after partial save/delete responses, zone loss, retry-after, +PCS unavailable, account switch, and offline two-client convergence have no +message loss, duplicate logical GUID, account bleed, or implicit destructive +recovery. Profiles remain a separate opt-in because their transport/auth failure +must never block Messages reconciliation. + +## Blocker-focused evidence update: 2026-08-01 + +### FRB 2.3.0 bindings: one canonical generator, multiple compile consumers + +This tree pins `flutter_rust_bridge` 2.3.0 in both Rust and Dart, and both +generated roots report codegen version 2.3.0. FRB performs a runtime codegen +version sanity check, so a locally newer generator is not a harmless formatting +change. The upstream 2.3.0 CI generated examples on Windows, macOS, and Ubuntu +and failed when regeneration changed committed output. This is evidence that +generation is intended to be deterministic across hosts, not evidence that an +ARM64 Windows host must generate ARM64-specific Dart bindings. Source: +[FRB 2.3.0 generation CI](https://github.com/fzyzcjy/flutter_rust_bridge/blob/v2.3.0/.github/workflows/ci.yaml#L170-L221). + +Make Ubuntu the only binding-authority job. Regenerate with the exact released +generator, then fail on any committed-output drift: + +```bash +cargo install flutter_rust_bridge_codegen --version 2.3.0 --locked +flutter_rust_bridge_codegen --version +flutter pub get +flutter_rust_bridge_codegen generate +git diff --exit-code -- \ + lib/src/rust \ + rust/src/frb_generated.rs \ + rust/src/frb_generated.io.rs \ + rust/src/frb_generated.web.rs +``` + +`flutter pub get` is deliberately separate because FRB's `generate` command +does not perform the integration command's package setup. The Windows x64 and +Windows ARM64 jobs should consume the committed output without regenerating it, +then compile and run an ABI/load smoke test. A Windows-only generated diff is a +generator bug to isolate, not output to commit conditionally. The drift check +must include the namespace/API Dart files as well as the three top-level Rust +files. + +### Vendored OpenSSL on `aarch64-pc-windows-msvc` + +The locked path is `openssl` 0.10.68, `openssl-sys` 0.9.104, and +`openssl-src` `300.4.1+3.4.0`. That `openssl-src` release maps +`aarch64-pc-windows-msvc` to OpenSSL Configure target `VC-WIN64-ARM`, then uses +the MSVC and `nmake` branch. It does not use the Unix `clang` path for that +target. Source: +[openssl-src target selection](https://github.com/alexcrichton/openssl-src-rs/blob/300.4.1%2B3.4.0/src/lib.rs#L310-L313). + +Therefore an error where GNU `clang` receives flags such as `/O2`, `/Fd`, or +other MSVC-style options is a contaminated or unsupported toolchain route. It +is not fixed safely by suppressing the flags. A reported Rust ARM64 Windows +failure was resolved by installing the Visual Studio ARM64 components plus +Perl and making `nmake` available: +[rust-openssl issue 2236](https://github.com/sfackler/rust-openssl/issues/2236). +OpenSSL's `VC-WIN64-ARM` configuration was also reported as Windows-specific +and unsuitable for Linux `clang-cl` cross compilation: +[OpenSSL issue 12363](https://github.com/openssl/openssl/issues/12363). +A later cross-configuration effort exists, but it is not present in this locked +OpenSSL 3.4.0 source: +[OpenSSL PR 28545](https://github.com/openssl/openssl/pull/28545). + +The preferred CI lane is a native Windows ARM64 runner initialized with the +Visual Studio ARM64 build environment. Before Cargo, remove generic GNU +compiler overrides from the current process and prove the required tools: + +```powershell +'CC','CXX','CFLAGS','CXXFLAGS','AR','RANLIB','CROSS_COMPILE' | + ForEach-Object { Remove-Item "Env:$_" -ErrorAction SilentlyContinue } + +where.exe cl +where.exe link +where.exe lib +where.exe nmake +where.exe perl +cargo build --locked --target aarch64-pc-windows-msvc +``` + +If vendoring remains unreliable, the supported escape hatch is a versioned, +checksummed ARM64 OpenSSL artifact, not a Linux GNU-clang build. `openssl-sys` +checks target-prefixed environment variables before generic ones, so the +fallback can be scoped without changing x64: + +```powershell +$env:AARCH64_PC_WINDOWS_MSVC_OPENSSL_NO_VENDOR = '1' +$env:AARCH64_PC_WINDOWS_MSVC_OPENSSL_LIB_DIR = 'D:\deps\openssl-arm64\lib' +$env:AARCH64_PC_WINDOWS_MSVC_OPENSSL_INCLUDE_DIR = 'D:\deps\openssl-arm64\include' +$env:AARCH64_PC_WINDOWS_MSVC_OPENSSL_STATIC = '1' +cargo build --locked --target aarch64-pc-windows-msvc +``` + +The job must inspect the `.lib` machine type as ARM64 and record the dependency +hash before accepting this route. The prefix behavior and vendored opt-out are +defined by the locked build script: +[openssl-sys environment resolution](https://github.com/sfackler/rust-openssl/blob/openssl-v0.10.68/openssl-sys/build/main.rs#L41-L54). + +### CloudKit and PCS: safe two-account, read-only validation + +Apple's public automation boundary is important here. A CloudKit management +token can manage schema but cannot access private or shared data. A user token +can access private/shared data only after interactive authorization and is +short-lived. `cktool` stores its credentials in the macOS Keychain and operates +against a developer's own container. Sources: +[Automating CloudKit Development](https://developer.apple.com/icloud/cloudkit/automating/) +and [cktool](https://developer.apple.com/icloud/ck-tool/). + +OpenBubbles reads Apple's private `com.apple.messages.cloud` service container, +not an OpenBubbles-owned development container. Consequently, CloudKit Console, +schema reset, `cktool`, management tokens, and a development-environment clone +are not safe or applicable ways to test this integration. Apple does recommend +real-world tests on multiple devices with different iCloud accounts, and its +sharing sample explicitly uses two devices logged into different accounts: +[CloudKit testing guidance](https://developer.apple.com/library/archive/documentation/DataManagement/Conceptual/CloudKitQuickStart/TestingYourApp/TestingYourApp.html) +and [CloudKit sharing sample](https://developer.apple.com/documentation/cloudkit/sharing-cloudkit-data-with-other-icloud-users). + +Use this read-only live protocol: + +1. Create two dedicated, consenting, non-personal Apple test accounts, each + containing only synthetic Messages text and media. Use one isolated device + or OS profile and one application data directory per account. +2. Gate the build to fetch and raw-journal only: + `semanticApply=false`, `saves=false`, `deletes=false`, `profiles=false`, and + outbound notification/write paths disabled. Abort the run if instrumentation + observes any write-class request. +3. Run cold fetch, continuation, retry, and replay for account A, then repeat + independently for B. Hash account identifiers in telemetry. Do not store + Apple credentials, user tokens, PCS material, or message contents in CI. +4. Test switching only after the independent runs pass. Stop the old + coordinator, prove its lease is released, select the new account-scoped + store/checkpoint, and then start B. A row, token, media reference, or log + correlation crossing scopes is a hard failure. +5. Never reset a trusted clique, delete a zone, modify records, or invoke + CloudKit developer tooling against the Messages service as a recovery step. + +PCS fault behavior should be fixture-driven first. At the current rustpush +revision, `pcs_keys_for_record` can panic when both `protection_info` and +`pcs_key` are absent, and returns `PCSRecordKeyMissing` when the requested key +ID is absent from zone defaults: +[rustpush PCS key path](https://github.com/OpenBubbles/rustpush/blob/70ec162c6838830194d55792c8b26e4d6681c816/src/icloud/cloudkit.rs). +Add fixtures for both fields absent, unknown key ID, stale zone-key cache, +corrupted wrapped key, and successful refresh. V2 must translate every case to +a typed scoped result, retain the old checkpoint, and never panic or trigger a +destructive clique action. The live two-account pass then validates only that +these boundaries stay read-only under real authentication. + +### Android production telemetry: published redlines and local gates + +The exact public Android production thresholds are platform vitals, not a +universal sync-specific mAh or CPU budget: + +| Signal | Published production threshold | +| --- | --- | +| Excessive partial wake lock | At least 2 cumulative background hours in a 24-hour session; the Android Vitals bad-behavior threshold is 5% of sessions over 28 days. | +| Stuck partial wake lock | At least one background partial wake lock held for 1 hour in a 24-hour period. | +| Excessive wakeups | Play Reporting classifies users with more than 10 wakeups per hour. | +| User-perceived crash | 1.09% overall; 8% per-device bad-behavior threshold. | +| User-perceived ANR | 0.47% overall; 8% per-device bad-behavior threshold. | +| App launch target | Cold under 500 ms, warm under 200 ms, hot under 150 ms. | + +Sources: +[excessive partial wake locks](https://developer.android.com/topic/performance/vitals/excessive-wakelock), +[stuck partial wake locks](https://developer.android.com/topic/performance/vitals/stuck-wakelock), +[Android Vitals core thresholds](https://developer.android.com/topic/performance/vitals), +[Play excessive wakeup rate](https://developers.google.com/play/developer/reporting/reference/rest/v1alpha1/vitals.excessivewakeuprate), +and [Android performance measurement](https://developer.android.com/topic/performance/measuring-performance). + +A current production sync implementation provides useful scheduling constants, +but not a battery-consumption acceptance number. Firefox Android uses unique +work with `ExistingWorkPolicy.KEEP`, requires a connected network, applies +exponential backoff starting at 3 minutes, delays startup sync by 5 seconds to +avoid database contention, and notes WorkManager's 15-minute minimum periodic +interval: +[Firefox WorkManagerSyncManager at commit fe8a71c](https://github.com/mozilla-mobile/firefox-android/blob/fe8a71cd70ad5674abe1824fe11dc78372b736c2/android-components/components/service/firefox-accounts/src/main/java/mozilla/components/service/fxa/sync/WorkManagerSyncManager.kt#L184-L266) +and [its timing constants](https://github.com/mozilla-mobile/firefox-android/blob/fe8a71cd70ad5674abe1824fe11dc78372b736c2/android-components/components/service/firefox-accounts/src/main/java/mozilla/components/service/fxa/sync/WorkManagerSyncManager.kt#L546). + +Do not invent a cross-device `mAh/hour` limit. Battery hardware, radio state, +message volume, and OEM scheduling make that number non-portable. Use paired +sync-off/sync-on runs on the same reference devices and retain raw charge, +worker-start, network-byte, CPU-time, wakeup, and wake-lock deltas. + +For rollout, adopt stricter OpenBubbles alarms, explicitly labeled as local +policy rather than published Android limits: + +| Signal | Proposed OpenBubbles stop/alarm gate | +| --- | --- | +| Sync-attributed wakeups | No account exceeds 10/hour; any repeated periodic pattern while idle is a hard failure. | +| Excessive partial wake-lock sessions | Alarm at 1%; stop staged rollout before the Play 5% redline. Cloud Sync V2 should acquire no manual partial wake lock. | +| User-perceived ANR | Alarm at 0.2% overall or 4% for a device cohort; stop on a statistically credible regression versus control. | +| User-perceived crash | Alarm at 0.5% overall or 4% for a device cohort; stop on a statistically credible regression versus control. | +| Launch time | Stop if enabled-vs-disabled P95 regresses by more than 10% on the same device/build; separately drive toward Android's absolute launch targets. | +| Battery energy | No universal absolute number. The enabled-run delta must remain inside the predeclared paired-test tolerance derived from control-run variance; publish the raw delta and interval. | + +These gates turn published external failure thresholds into earlier rollback +signals while avoiding a fabricated battery precision that will not transfer +between Pixel, Samsung, and emulator cohorts. + +## Notification, profiles, assets, and CI evidence update: 2026-08-01 + +### Private Messages zone change notifications + +#### Verified facts + +Apple documents CloudKit subscriptions as per-user notification sources, not +durable delivery logs. Changes in custom record zones can trigger push +notifications, but notifications may be coalesced, may omit the originating +device, and can be lost through APNs or network failure. Apple therefore +requires clients to treat push as a hint and fetch changes using persistent, +opaque server tokens: +[CKDatabaseSubscription](https://developer.apple.com/documentation/CloudKit/CKDatabaseSubscription), +[CKFetchRecordZoneChangesOperation](https://developer.apple.com/documentation/cloudkit/ckfetchrecordzonechangesoperation), +and [Apple QA1917](https://developer.apple.com/library/archive/qa/qa1917/_index.html). +Apple's private-database sample creates a `CKRecordZoneSubscription` with a +content-available notification: +[ViewModel.swift](https://github.com/apple/sample-cloudkit-privatedb-sync/blob/b30a0ccef9a2e22cc8d2dccf46819e0f9327ffcb/PrivateSync/ViewModel.swift). +Apple's current CKSyncEngine sample also states that remote-notification testing +requires a real device or Mac because simulators do not receive those pushes: +[sample-cloudkit-sync-engine](https://github.com/apple/sample-cloudkit-sync-engine). + +Public rustpush master at commit +[`70ec162`](https://github.com/OpenBubbles/rustpush/commit/70ec162c6838830194d55792c8b26e4d6681c816) +already contains a generic `CloudKitNotifWatcher`. It parses APS CloudKit +payloads, filters them by container, deduplicates zones, debounces for 10 +seconds, and returns changed record-zone identifiers: +[cloudkit.rs lines 618-655](https://github.com/OpenBubbles/rustpush/blob/70ec162c6838830194d55792c8b26e4d6681c816/src/icloud/cloudkit.rs#L618-L655). +The same client can request the container APS topic, create a database +subscription, and register its token: +[watch_notifs](https://github.com/OpenBubbles/rustpush/blob/70ec162c6838830194d55792c8b26e4d6681c816/src/icloud/cloudkit.rs#L1298-L1310) +and [subscription/token registration](https://github.com/OpenBubbles/rustpush/blob/70ec162c6838830194d55792c8b26e4d6681c816/src/icloud/cloudkit.rs#L1632-L1665). +The password-manager implementation proves that this generic path is wired for +another container in rustpush today: +[passwords.rs lines 1090-1175](https://github.com/OpenBubbles/rustpush/blob/70ec162c6838830194d55792c8b26e4d6681c816/src/passwords.rs#L1090-L1175). + +Messages uses the private database in container `com.apple.messages.cloud` with +bundle identifier `com.apple.imagent`: +[cloud_messages.rs lines 78-82](https://github.com/OpenBubbles/rustpush/blob/70ec162c6838830194d55792c8b26e4d6681c816/src/imessage/cloud_messages.rs#L78-L82). +However, the current `CloudMessagesClient` owns only a container client and +keychain and does not create a subscription, register a token, or own a +`CloudKitNotifWatcher`: +[cloud_messages.rs lines 479-493](https://github.com/OpenBubbles/rustpush/blob/70ec162c6838830194d55792c8b26e4d6681c816/src/imessage/cloud_messages.rs#L479-L493). +The current IDS APS client requests only the Madrid and SMS topics, not the +Messages CloudKit container topic: +[aps_client.rs lines 116-130](https://github.com/OpenBubbles/rustpush/blob/70ec162c6838830194d55792c8b26e4d6681c816/src/imessage/aps_client.rs#L116-L130). + +#### Inference and production action + +Rustpush has a reusable CloudKit hint mechanism, but it does not currently +expose a reliable Messages-zone hint source to OpenBubbles. IDS arrival can +trigger an inexpensive reconciliation attempt, but it cannot prove that the +private zone is current. It does not represent missed history, deletions, +attachment materialization, or changes that occurred while the client was +offline. + +Add a read-only experimental lane that requests the +`com.apple.icloud-container.com.apple.imagent` APS topic, creates the Messages +database subscription, registers its token, and maps returned zone identifiers +to the V2 scheduler. Keep that lane behind an experiment flag because this is +reverse-engineered use of an Apple private container. A push must only schedule +a checkpoint fetch. It must never advance a change token itself. Startup, +manual refresh, account reauthentication, and network recovery must still +reconcile without a notification. + +### Shared profile, contact card, and avatar storage + +#### Verified facts + +Rustpush's current shared-profile implementation uses the public CloudKit +database in container `com.apple.messages.profiles`, bundle +`com.apple.imtransferagent`: +[name_photo_sharing.rs lines 253-282](https://github.com/OpenBubbles/rustpush/blob/70ec162c6838830194d55792c8b26e4d6681c816/src/imessage/name_photo_sharing.rs#L253-L282). +Its primary record type is `imsgNicknamePublicv2`, with name field `n`, avatar +metadata `am`, and avatar asset `ad`. The optional companion `poster` record +contains poster metadata `pr` and `wm` plus `lrwd` and `wd` assets: +[record definitions](https://github.com/OpenBubbles/rustpush/blob/70ec162c6838830194d55792c8b26e4d6681c816/src/imessage/name_photo_sharing.rs#L25-L80). +Inbound resolution fetches an exact pointer record and optional `-wp` +companion, downloads their assets, and decrypts them using the key delivered in +the IDS `ShareProfileMessage`: +[get_record](https://github.com/OpenBubbles/rustpush/blob/70ec162c6838830194d55792c8b26e4d6681c816/src/imessage/name_photo_sharing.rs#L282-L335). + +The public OpenBubbles default branch at commit +[`eed1b63`](https://github.com/OpenBubbles/openbubbles-app/commit/eed1b6332efbb17adbf5ebfa2263ad770169f75e) +attaches `ShareProfileMessage` to a one-to-one IDS message, then projects the +resolved name, raw avatar bytes, shared state, and optional poster path into an +ObjectBox `Contact`: +[rustpush_service.dart lines 2819-2906](https://github.com/OpenBubbles/openbubbles-app/blob/eed1b6332efbb17adbf5ebfa2263ad770169f75e/lib/services/rustpush/rustpush_service.dart#L2819-L2906) +and [contact.dart lines 15-42](https://github.com/OpenBubbles/openbubbles-app/blob/eed1b6332efbb17adbf5ebfa2263ad770169f75e/lib/database/io/contact.dart#L15-L42). +Its `savePoster()` and `saveTranscriptPoster()` paths call asynchronous +`savePosterData(...)` without awaiting completion, so a returned path or +preview can race file persistence: +[rustpush_service.dart lines 2957-2988](https://github.com/OpenBubbles/openbubbles-app/blob/eed1b6332efbb17adbf5ebfa2263ad770169f75e/lib/services/rustpush/rustpush_service.dart#L2957-L2988). +Open pull request +[#227](https://github.com/OpenBubbles/openbubbles-app/pull/227) explicitly +isolates malformed CloudKit profile failures from message delivery and adds a +bounded retry, but it is not merged into the default branch. Open issue +[#103](https://github.com/OpenBubbles/openbubbles-app/issues/103) records a +Linux chat-avatar flow stuck at “Saving avatar.” That issue concerns chat/group +avatar handling, not the shared-profile record schema, but it is still a +relevant avatar-persistence regression. + +The rustpush write path has additional concrete hazards. It deletes the prior +record before replacement is ready, requests poster asset uploads using the +nickname record type, unwraps missing `lrwd` and `wd` upload responses, and may +delete the currently queried record before retrying a failed save: +[set_record lines 336-425](https://github.com/OpenBubbles/rustpush/blob/70ec162c6838830194d55792c8b26e4d6681c816/src/imessage/name_photo_sharing.rs#L336-L425). +Its own-record query returns the first public-zone result without an explicit +ordering or duplicate-reconciliation rule: +[get_my_record lines 426-461](https://github.com/OpenBubbles/rustpush/blob/70ec162c6838830194d55792c8b26e4d6681c816/src/imessage/name_photo_sharing.rs#L426-L461). +The mismatched upload record type is suspicious, but server-side failure from +that mismatch is not proven by the available source. + +Reverse-engineered iOS 26.1 framework source independently corroborates the +schema. It queries `imsgNicknamePublicv2` by creator, reads `ad`, `wd`, `lrwd`, +and `wm`, and constructs both nickname and `poster` records: +[IMTransferAgent.mm](https://github.com/EthanArbuckle/iPhone18-3_26.1_23B85_Restore/blob/90aa0cfe59d9682b4265e1354c8b19ec3c7823ab/System/Library/PrivateFrameworks/IMTransferAgent.framework/IMTransferAgent/IMTransferAgent.mm#L3087-L3089). +The decompiled nickname controller identifies container +`com.apple.messages.profiles`: +[IMTransferAgentNicknameController.mm](https://github.com/EthanArbuckle/iPhone18-3_26.1_23B85_Restore/blob/90aa0cfe59d9682b4265e1354c8b19ec3c7823ab/System/Library/PrivateFrameworks/IMTransferAgent.framework/IMTransferAgent/IMTransferAgentNicknameController.mm#L635). +Private SDK symbols also expose CloudKit record-key and decryption-key message +dictionary entries: +[IMDaemonCore.tbd](https://github.com/xybp888/iOS-SDKs/blob/1b92ff4a8928f582876e1d388d1381c6a0c59eb9/iPhoneOS26.1.sdk/System/Library/PrivateFrameworks/IMDaemonCore.framework/IMDaemonCore.tbd). +These are useful reverse-engineered schema witnesses, not supported Apple API +contracts. + +#### Inference and production action + +The shared-profile path is pointer-driven public-record retrieval, not a +private-zone stream like Messages. Build a durable profile-pointer inbox from +decoded IDS metadata rather than inventing a public-database checkpoint poll. +Key each work item by account scope, sender, CloudKit record key, and +decryption-key fingerprint. Retain the received pointer, journal the raw +profile and asset metadata, fetch the exact record and optional poster, verify +the selected assets, then transactionally update the contact projection. + +Keep device Contacts sync and own-profile publishing outside this stream. +Replace `unwrap` and unbounded in-memory asset failure paths with typed, +per-asset errors and bounded retry. Do not expose a poster path before its +atomic file write completes. Preserve pointer history and deduplicate it +because one sender may share the same profile with multiple handles. Treat +own-profile writes as a separate, explicit feature until replacement can be +made without delete-first data loss. + +### Attachment retrieval, resume, and integrity + +#### Verified facts + +The Messages `CloudAttachment` field named `md5` contains only the first eight +bytes of MD5: +[cloud_messages.rs line 466](https://github.com/OpenBubbles/rustpush/blob/70ec162c6838830194d55792c8b26e4d6681c816/src/imessage/cloud_messages.rs#L466). +The available CloudKit asset record contains stronger transport metadata: +asset signature, reference signature, expected size, download token and URLs, +expiration, protection information, and bundled request identifier: +[cloudkit.proto lines 1009-1027](https://github.com/OpenBubbles/rustpush/blob/70ec162c6838830194d55792c8b26e4d6681c816/cloudkit-proto/src/cloudkit.proto#L1009-L1027). +The generic proto also defines `sha256Signature`, but the current Messages +asset path does not populate or consume that field. It is therefore not a +proven expected digest for Messages attachments. + +`download_attachment` accepts whole-record identifiers and caller-provided +write sinks, requests all assets, then delegates to `get_assets`: +[cloud_messages.rs lines 694-706](https://github.com/OpenBubbles/rustpush/blob/70ec162c6838830194d55792c8b26e4d6681c816/src/imessage/cloud_messages.rs#L694-L706). +`get_assets` uses the full asset signature and protection information and +streams through MMCS: +[cloudkit.rs lines 2072-2100](https://github.com/OpenBubbles/rustpush/blob/70ec162c6838830194d55792c8b26e4d6681c816/src/icloud/cloudkit.rs#L2072-L2100). +MMCS records a full file checksum plus per-chunk checksums, sizes, and offsets. +It splits files into 5 MiB chunks and cryptographically checks V2 chunk IDs +during decryption: +[mmcs.rs](https://github.com/OpenBubbles/rustpush/blob/70ec162c6838830194d55792c8b26e4d6681c816/src/icloud/mmcs.rs). +Those verification branches currently use assertions, so corrupted input can +panic instead of returning a typed integrity failure. + +The public API exposes no durable offset or resume token. The current MMCS +container opens an ordinary GET from the beginning and contains no Range, +If-Range, or Content-Range request handling: +[ensure_stream lines 927-980](https://github.com/OpenBubbles/rustpush/blob/70ec162c6838830194d55792c8b26e4d6681c816/src/icloud/mmcs.rs#L927-L980). +Its offset bookkeeping consumes bytes within the active stream; it is not +process-death resume. Apple's generic resumable-download guidance requires a +saved ETag plus `Range` and `If-Range`, followed by validation of a `206` +response and exact `Content-Range`: +[Apple QA1761](https://developer.apple.com/library/archive/qa/qa1761/_index.html). +That guidance defines a safe experiment, but it does not prove that MMCS +endpoints support ranges. + +Open issue [#207](https://github.com/OpenBubbles/openbubbles-app/issues/207) +reports that the text-plus-attachment two-phase path persists replacement +metadata but does not start automatic download, while attachment-only messages +do. This is a current queue-orchestration failure rather than evidence of an +MMCS integrity defect. + +#### Inference and production action + +Persist the CloudKit asset signature, reference signature, expected size, MMCS +file checksum, and chunk manifest before transfer. Compute an +application-owned SHA-256 over final plaintext and use it as the content +address. The truncated MD5 may remain a compatibility field but must not be +the production integrity decision. + +Implement the first safe resume boundary at verified MMCS chunks. Persist only +completed chunk identifiers, digests, sizes, and offsets, reauthorize after +restart, and assemble only verified chunks. Never blindly append to a partial +plaintext file. Convert all integrity assertions and missing-field unwraps to +typed `integrityMismatch`, `manifestChanged`, or `authorizationExpired` +failures before enabling production sync. + +Treat byte-range resume as a later capability probe. Require `Accept-Ranges` +and ETag, send `If-Range`, accept only `206` with an exact `Content-Range`, and +discard the partial object on any mismatch or full `200` response. The durable +attachment queue must also model the issue #207 replacement event so metadata +arrival wakes the same download state machine as attachment-only delivery. + +### Flutter Rust Bridge generation and native Windows CI + +#### Verified facts + +A current Flutter Rust Bridge project pins its generator, runs generation once +on Linux, fails on generated-file drift, and builds with +`--skip-frb-codegen` afterward: +[Xybrid build-flutter.yml](https://github.com/xybrid-ai/xybrid/blob/6f664540b17b2ff5c1cc13dd59a28e82ef475959/.github/workflows/build-flutter.yml#L123-L160). +Another current project checks both `git status --porcelain` and +`git diff --exit-code` after exact-version generation: +[NTS CI workflow](https://github.com/nick-llewellyn/nts/blob/236e78f803a8a7ce54a2136f911774a200256db6/.github/workflows/ci.yml) +and [development contract](https://github.com/nick-llewellyn/nts/blob/236e78f803a8a7ce54a2136f911774a200256db6/DEVELOPMENT.md). +Both checks are necessary because `git diff` alone misses newly generated, +untracked files. + +GitHub now provides the standard `windows-11-arm` hosted runner to public and +private repositories, alongside x64 Windows labels: +[GitHub-hosted runner reference](https://docs.github.com/en/actions/reference/runners/github-hosted-runners) +and [private-repository availability announcement](https://github.blog/changelog/2026-01-29-arm64-standard-runners-are-now-available-in-private-repositories/). +Current Flutter Rust Bridge documentation identifies +`x86_64-pc-windows-msvc` and `aarch64-pc-windows-msvc` as the Windows targets. +A native Windows ARM64 build pattern from XNNPACK confirms that +`windows-11-arm` can use the native ARM64 MSVC compiler without a cross +toolchain: +[build-windows-arm64-native.cmd](https://github.com/google/XNNPACK/blob/c0e881d1947dc72787db45c380abed2a0e4e68c3/scripts/build-windows-arm64-native.cmd). + +#### Inference and production action + +Use one required `bindings` job on `ubuntu-24.04`. Install the exact project +Flutter Rust Bridge version, currently 2.3.0, with `--locked`; generate once; +then fail if either tracked generated content changed or a new generated file +appeared. Scope both checks to the configured Dart and Rust output paths. +Include `flutter_rust_bridge.yaml`, Cargo and pub manifests and locks, Rust API +sources, mirrored types, and generated outputs in the workflow path filter. + +Make two native Windows jobs depend on `bindings`: + +| Architecture | Runner | Rust target | +| --- | --- | --- | +| x64 | `windows-2022` | `x86_64-pc-windows-msvc` | +| ARM64 | `windows-11-arm` | `aarch64-pc-windows-msvc` | + +Neither Windows job may install or invoke the generator. Each should assert +the runner architecture with +`[System.Runtime.InteropServices.RuntimeInformation]::OSArchitecture`, record +`rustc -vV`, run locked native compile and test steps, perform a PE +architecture/load smoke test, and verify that generated paths remain clean +after the build. If an ARM64 dependency is not yet portable, isolate only that +specific compile step as experimental and retain its logs. Do not mark the +whole architecture job successful while skipping native compilation. + +## Decoder contract evidence update: 2026-08-01 + +### Fact: Messages stream identity is zone-scoped and type-specific + +The current public rustpush Messages client reads `chatManateeZone`, +`messageManateeZone`, and `attachmentManateeZone`. Its encrypted record types +are respectively `chatEncryptedv2`, `MessageEncryptedV3`, and `attachment`. +The attachment record contains encrypted `cm` metadata plus the `lqa` asset; +message records include both encrypted fields and a small set of explicitly +unencrypted fields. These are reverse-engineered implementation schemas, not +an Apple public contract. + +Source: [rustpush Messages schemas and zones at 70ec162](https://github.com/OpenBubbles/rustpush/blob/70ec162c6838830194d55792c8b26e4d6681c816/src/imessage/cloud_messages.rs#L231-L314), +[attachment schema](https://github.com/OpenBubbles/rustpush/blob/70ec162c6838830194d55792c8b26e4d6681c816/src/imessage/cloud_messages.rs#L444-L475), +and [zone methods](https://github.com/OpenBubbles/rustpush/blob/70ec162c6838830194d55792c8b26e4d6681c816/src/imessage/cloud_messages.rs#L660-L730). + +**Action:** Retain zone plus expected record type in every protected V2 raw +envelope. The semantic decoder may only project an upsert when the stream, +record type, record identifier, and encrypted record agree. Do not infer an +attachment's final content identity from its short `md5` metadata or from +unencrypted message fields. + +### Fact: `change_type` cannot be the sole semantic discriminator + +The V2 transport currently preserves `change_type` as `Option`. Its page +mapper treats `Some(1)` with a record as an upsert and `Some(2)` without one as +a tombstone, but deliberately permits `None` when the record shape is otherwise +well formed. The new `cloud_sync_semantic_decoder.rs`, in contrast, currently +requires raw value `1` for an upsert and `2` for a tombstone. Therefore a +transport-valid change with absent raw type would be rejected by the semantic +layer even though the transport had enough information to classify it. + +Source: current V2 transport mapping in +[`cloud_messages.rs`](../rustpush/src/imessage/cloud_messages.rs) lines +`800-882`, and the decoder's raw-type checks in +[`cloud_sync_semantic_decoder.rs`](../rust/src/cloud_sync_semantic_decoder.rs) +lines `172-204` and `215-219`. Public rustpush also represents synced records +as `Option` values, where absence is the deletion signal, in +[the generic Messages sync contract](https://github.com/OpenBubbles/rustpush/blob/70ec162c6838830194d55792c8b26e4d6681c816/src/imessage/cloud_messages.rs#L660-L688). + +**Action:** Change the semantic boundary to accept the transport's validated +`CloudMessageRecordKind` (or a similarly closed `Upsert | Tombstone` enum), +not a guessed raw integer. Preserve the optional raw type for redacted +diagnostics. Add fixtures for `None` with a valid upsert, `None` with a valid +tombstone, and contradictory record/type shapes. No checkpoint may advance +until each is projected or durably quarantined. + +### Fact: PCS failures are wider than malformed record data + +The public Messages sync loop specifically treats `PCSRecordKeyMissing` as a +key-material problem, clears the cached zone encryption configuration, and +returns the error. Rustpush also exposes distinct `NotInClique`, +`ShareKeyNotFound`, `MasterKeyNotFound`, and `NoRoutingKey` errors. Its older +generic decode paths still contain `expect` calls around PCS lookup, so a native +failure must not be reclassified as malformed payload merely because it reaches +the V2 boundary. + +Source: [Messages PCS retry path](https://github.com/OpenBubbles/rustpush/blob/70ec162c6838830194d55792c8b26e4d6681c816/src/imessage/cloud_messages.rs#L994-L1007), +[PCS lookup](https://github.com/OpenBubbles/rustpush/blob/70ec162c6838830194d55792c8b26e4d6681c816/src/icloud/cloudkit.rs#L548-L568), +[error definitions](https://github.com/OpenBubbles/rustpush/blob/70ec162c6838830194d55792c8b26e4d6681c816/src/error.rs#L200-L220), +and [generic panic-prone decode path](https://github.com/OpenBubbles/rustpush/blob/70ec162c6838830194d55792c8b26e4d6681c816/src/icloud/cloudkit.rs#L220-L239). + +**Action:** Preserve a three-way V2 outcome: `blockedPCS` for known +key/clique/routing states, `retryableNativeFailure` for transport or unexpected +native errors, and `malformedProtectedRecord` only after deterministic envelope +or schema validation fails. All three retain the protected raw envelope and +keep the existing checkpoint. The decoder must never convert an unknown +`PushError` into a discardable malformed record. + +### Fact: current upstream reports match the V2 loss and latency risks + +Open issue [#222](https://github.com/OpenBubbles/openbubbles-app/issues/222) +reports a `Bad message` failure after reinstall, and open issue +[#212](https://github.com/OpenBubbles/openbubbles-app/issues/212) reports +partial history and empty conversations. Open issue +[#141](https://github.com/OpenBubbles/openbubbles-app/issues/141) reports +historical videos repeatedly failing while newly received videos work. These +reports do not prove a single root cause, but they rule out treating raw decode, +checkpoint, and attachment resumption as independent best-effort features. + +Source: [#222](https://github.com/OpenBubbles/openbubbles-app/issues/222), +[#212](https://github.com/OpenBubbles/openbubbles-app/issues/212), and +[#141](https://github.com/OpenBubbles/openbubbles-app/issues/141). + +**Action:** Production readiness requires fault-injection tests that interrupt +after raw page persistence, during PCS refresh, during semantic projection, and +during attachment transfer. Verify restart convergence against the same source +history, with no page-token jump, duplicate logical record, or permanently +stuck attachment job. + +### Fact: a Windows ARM64 sleep/wake report shows native wall-clock panic can +wedge CloudKit retries + +Open rustpush issue [#29](https://github.com/OpenBubbles/rustpush/issues/29) +documents a Windows ARM64 Modern Standby wake where a backward NTP correction +triggers `SystemTime::duration_since(...).expect(...)` in identity-cache +staleness logic, followed by repeated CloudKit sync failures, a frozen UI, and +high CPU. This is an upstream report, not yet a reproduced V2 defect. + +Source: [rustpush issue #29](https://github.com/OpenBubbles/rustpush/issues/29) +and the implicated [identity-cache implementation](https://github.com/OpenBubbles/rustpush/blob/70ec162c6838830194d55792c8b26e4d6681c816/src/ids/identity_manager.rs#L45-L65). + +**Action:** Add an ARM64 and x64 sleep/wake and backward-clock test gate around +Cloud Sync V2's cancellation/retry supervisor. Native panics must become a +single bounded failed run with diagnostics and backoff, never a tight restart +loop. Keep persisted server timestamps separate from eligibility deadlines and +continue using monotonic time for in-process lease and timeout decisions. + +## Canonical local-projection evidence update: 2026-08-01 + +### Fact: the legacy CloudKit conversion path already carries most message +semantics, but it mutates while converting + +`Message.applyFromCloud` decodes `MessageProto`, maps body and attachments, +reconstructs `MessageSummaryInfo` edit history (`ec`, `ep`, `otr`) and +retracted parts (`rp`), reads delivery/read timestamps, maps reaction ranges, +and reads threaded-reply and emoji metadata. It then calls `save(chat: chat)` +directly. Its matching upload method encodes the same edit/retraction/receipt +fields, so this is the closest existing field-level mapping witness. + +Source: current legacy mapper in +[`message.dart`](../lib/database/io/message.dart) lines `1021-1220`, including +the [upload mapping](../lib/database/io/message.dart#L1021-L1106) and +[download mapping](../lib/database/io/message.dart#L1107-L1220). The public +Messages schema supplies `msgProto`, optional `msgProto2/3/4`, flags, GUID, and +chat ID: [rustpush schema at 70ec162](https://github.com/OpenBubbles/rustpush/blob/70ec162c6838830194d55792c8b26e4d6681c816/src/imessage/cloud_messages.rs#L314-L368). + +**Action:** Reuse the existing protobuf and attributed-body parsers as field +decoders, but not `Message.applyFromCloud` as an unguarded V2 callback. The +semantic adapter must first resolve its record-map idempotency key, then apply +the complete message, its edit/retraction history, and its associated-message +links in one bounded ObjectBox transaction. A completed journal entry must make +a second pass a no-op rather than a second `save`. + +### Fact: legacy chat and attachment helpers have useful canonical identities, +but are not transactional primitives + +`Chat.findFromCloud` resolves a cloud chat in priority order by `groupId`, +`chatIdentifier`, then exact participant set, and otherwise creates a chat. +`Chat.applyFromCloud` updates group version from `properties.pv`, last-read +GUID, participants, display name, cloud payload, and group photo state, then +writes to ObjectBox. `Attachment.applyFromCloud` maps a CloudKit attachment +record into its local metadata and normalizes an Apple attachment GUID of the +form `at__` into local `_`, then writes +and optionally links it to the message. + +Source: [chat lookup and creation](../lib/database/io/chat.dart#L1047-L1088), +[chat projection and persistence](../lib/database/io/chat.dart#L1167-L1208), +and [attachment GUID conversion plus persistence](../lib/database/io/attachment.dart#L57-L77). +The corresponding encrypted CloudKit records expose chat `group_id`, +participants, `properties`, optional `group_photo`, and attachment `cm` plus +`lqa`: [rustpush schemas](https://github.com/OpenBubbles/rustpush/blob/70ec162c6838830194d55792c8b26e4d6681c816/src/imessage/cloud_messages.rs#L231-L297) +and [attachment schema](https://github.com/OpenBubbles/rustpush/blob/70ec162c6838830194d55792c8b26e4d6681c816/src/imessage/cloud_messages.rs#L444-L475). + +**Action:** Treat the legacy lookup order and attachment GUID transform as +compatibility rules to test, not as a ready-made V2 transaction. Split V2 into +pure `resolveChat`, `projectChat`, and `projectAttachment` stages, then persist +their record-map updates and local entities atomically. Do not let a record-map +collision call legacy `findFromCloud`, `applyFromCloud`, or `backend.createChat` +outside that transaction. + +### Fact: associated-message GUIDs need an explicit normalization contract + +The legacy upload path serializes a reaction target as +`p:/`. The download path assigns the received +`associatedMessageGuid` directly, while the local reaction lookup later queries +by exact local `Message.guid`. The source therefore does not establish that +CloudKit reaction targets arrive already normalized to the local GUID format. + +Source: [reaction target serialization](../lib/database/io/message.dart#L1055-L1062), +[direct receive assignment](../lib/database/io/message.dart#L1180-L1191), and +[associated-message lookup](../lib/database/io/message.dart#L1222-L1235). + +**Action:** Define one tested V2 parser for `p:/` that yields the +logical parent GUID and part separately, while preserving the original raw value +in the protected envelope. Include fixtures for reaction add/remove, sticker, +thread reply, edit before parent arrival, unsend before parent arrival, and +parent record deletion. Deferred associations must be durable and must resolve +only when the parent record map is present. + +### Fact: the legacy loop mixes inbound recovery with outbound deletion and +main-isolate writes + +The current legacy sync loops immediately delete local rows for tombstones, +deduplicate record-ID conflicts by adding prior IDs to outbound deletion lists, +persist continuation tokens page by page, and call the mutation helpers while +decoding. It also performs the message loop on the Flutter main isolate and +yields only after every 25 records. Those choices explain why the helpers cannot +be reused as a crash-safe reconciliation engine without a transaction boundary. + +Source: [legacy chat, attachment, and message loops](../lib/services/rustpush/rustpush_service.dart#L3157-L3445), +[local delete behavior](../lib/database/io/message.dart#L1253-L1271), and open +[large-history issue #194](https://github.com/OpenBubbles/openbubbles-app/issues/194) +plus [restart/hang issue #168](https://github.com/OpenBubbles/openbubbles-app/issues/168). + +**Action:** V2 semantic apply must never enqueue an outbound CloudKit delete +while processing a remote upsert or tombstone. Retain tombstones and conflicting +record mappings for review, make the token/journal/entity update atomic, and +execute bounded batches outside the presentation-critical path. Require a +large-history restart test that injects interruption before and after each +commit, then verifies no duplicate entity, no outbound delete, and no +re-download of an already committed page. + +### Fact: historical media and ARM64 resume failures are active upstream risk +signals + +Open issue [#141](https://github.com/OpenBubbles/openbubbles-app/issues/141) +reports historical iCloud videos repeatedly failing to download even though +newly received video works. Open rustpush issue +[#29](https://github.com/OpenBubbles/rustpush/issues/29) remains open and +documents a Windows ARM64 sleep/wake backward-clock panic that can wedge +CloudKit retry behavior. Neither report proves V2 behavior, but both require +platform-specific interruption coverage before a production claim. + +Source: [OpenBubbles #141](https://github.com/OpenBubbles/openbubbles-app/issues/141) +and [rustpush #29](https://github.com/OpenBubbles/rustpush/issues/29). + +**Action:** Add a test matrix with a historical-video fixture and a simulated +ARM64 sleep/wake cancellation. The attachment state machine must leave a +durable retryable state with its verified metadata after interruption; the +supervisor must suppress tight retries after a native panic and require an +explicit safe re-entry trigger. + +## Attachment resume and cross-box transaction evidence update: 2026-08-01 + +### Fact: the current MMCS read path verifies V2 chunks, but has no persisted +resume contract + +The MMCS preparation path splits data into `5,242,880` byte chunks and carries +their IDs, sizes, and encryption metadata. During a V2 read, the decoder +decrypts a chunk, hashes its plaintext, and checks the derived HMAC against the +chunk ID. However, that integrity failure is currently an `assert_eq!`, not a +typed recoverable error. The get container opens an ordinary fresh HTTP stream, +tracks progress only in its in-memory `transfer_progress`, and does not expose a +range, ETag, `If-Range`, checkpoint, or cancellation argument. The generic +`FileContainer` writes each decoded chunk straight into its supplied writer. + +Source: [5 MiB preparation and chunk descriptors](../rustpush/src/icloud/mmcs.rs#L185-L310), +[V2 decrypt and assertion](../rustpush/src/icloud/mmcs.rs#L933-L972), +[fresh stream and volatile progress](../rustpush/src/icloud/mmcs.rs#L1207-L1325), +and [get pipeline plus direct writer target](../rustpush/src/icloud/mmcs.rs#L1366-L1557). +The same durability pattern is used by mature resumable downloaders: Rustup +writes and verifies a `.partial` file before replacing the final file, while +Helmor persists a `.part`, verifies SHA-256, and only then renames it +([Rustup implementation](https://github.com/rust-lang/rustup/blob/a1676f4adf942c22c4a5ae58a8e30b8bb81a2029/src/dist/download.rs), +[Helmor worker](https://github.com/dohooo/helmor/blob/main/src-tauri/src/downloads/worker.rs)). + +**Action:** Model MMCS authorization as an expiring transfer epoch, not as a +resumable HTTP byte stream. Persist, before writing, an immutable job identity +containing the CloudKit record/asset identity, expected logical size, ordered +chunk IDs and sizes, the authorization epoch, and a versioned local-stage +format. Persist only a verified contiguous chunk prefix, then on restart +re-authorize and compare the returned manifest before reuse. If the manifest or +record identity differs, abandon the stage as stale rather than appending. +Replace each V2 assertion with a typed integrity failure that preserves the +stage for diagnosis but never marks it complete. Do not promise byte-range +resume until MMCS authorization responses and `transfer_mmcs_container` prove +that range requests are supported. + +### Fact: Cloud attachment downloads currently stream directly into their +final visible path + +For cloud attachments, `RustPushBackend.downloadAttachment` gives the Rust +bridge `(attachment.path, cloudRecordID)`, so the MMCS writer owns the final +attachment path during the transfer. `FileContainer.write` calls `write_all` +without a staging or durable-sync step. The non-cloud `Attachment.writeToDisk` +helper also creates and writes its final path directly. + +Source: [cloud download call site](../lib/services/rustpush/rustpush_service.dart#L554-L565), +[MMCS file writer](../rustpush/src/icloud/mmcs.rs#L518-L565), and +[direct local write helper](../lib/database/io/attachment.dart#L161-L165). +The Dart `File.rename` API documents that a rename cannot cross file systems and +may replace an existing destination, so a safe implementation must make the +destination and staging-path rules explicit rather than treating rename as a +general recovery mechanism ([Dart File API](https://api.dart.dev/stable/dart-io/File/rename.html)). + +**Action:** Never send a final attachment path to a new V2 transfer. Create a +unique same-directory `.cloudsync..partial` file and stream only +there. The state machine is `metadataReady -> transferPending -> streaming -> +verified -> filePlaced -> referenced`; file creation, writes, hashing, flush, +and rename stay outside ObjectBox transactions. After every verified contiguous +chunk, write a compact atomic sidecar/checkpoint; after the final size and +digest check, atomically place the file on the same volume, then perform the +short database commit that exposes the attachment. Startup reconciliation must +compare the final file, partial file, sidecar, and job state, and must never +blindly delete a partial merely because the process previously stopped. Guard +against an existing final destination before rename, because replacement would +otherwise turn a duplicate retry into data loss. + +### Fact: cancellation is not presently a first-class MMCS download control + +`get_mmcs` accepts the configuration, authorization response, output writers, +progress callback, and Ford flag. Its public signature contains no cancellation +token, and the inner reader awaits response chunks until EOF or an error. The +current native call surface can therefore report progress but cannot describe a +safe pause point or distinguish an intentional stop from a transport failure. + +Source: [`get_mmcs` signature and transfer loop](../rustpush/src/icloud/mmcs.rs#L1366-L1377) +and [response-chunk read loop](../rustpush/src/icloud/mmcs.rs#L1300-L1315). +Open-source transfer engines that support recovery make this control explicit: +they observe cancel between chunks, preserve partial state, and resume only +after a protocol-supported checkpoint ([Helmor worker](https://github.com/dohooo/helmor/blob/main/src-tauri/src/downloads/worker.rs), +[rusty-cat restart design](https://github.com/0barman/rusty-cat)). + +**Action:** Add a V2 native cancellation handle checked before each next chunk +read, before each stage write, and before final placement. Cancellation must +flush and retain the partial/checkpoint as `paused`, without publishing a final +attachment or advancing the semantic replay record. Treat network errors as +`retryable` only when the last durable checkpoint still validates; integrity, +manifest, or final-placement conflicts need distinct terminal or operator-visible +states. Keep transfer concurrency deliberately bounded, especially on mobile, +until actual battery, memory, and historical-video measurements justify a higher +limit. + +### Fact: ObjectBox can compose multiple boxes in one Store transaction, but +the callback itself must be synchronous + +OpenBubbles already wraps `Store.runInTransaction` as +`Database.runInTransaction`. Current ObjectBox Dart source rejects an async +transaction callback, because it would leave the transaction boundary while the +Future is outstanding. `runInTransactionAsync` instead opens an independent +Store connection in a worker isolate and still executes the transaction body +synchronously there. `Box.putMany` automatically wraps its own work in a +transaction for that box, but it does not define an atomic boundary with writes +to other boxes. + +Source: [OpenBubbles database wrapper](../lib/database/database.dart#L240-L243), +[ObjectBox Store transaction implementation](https://github.com/objectbox/objectbox-dart/blob/main/objectbox/lib/src/native/store.dart), +and [ObjectBox Box batch implementation](https://github.com/objectbox/objectbox-dart/blob/main/objectbox/lib/src/native/box.dart). + +**Action:** Every V2 state transition that changes a `Message`, `Chat`, or +`Attachment` together with a Cloud Sync record map, replay journal, inbox row, +or transfer-state row must execute in one short, +`Database.runInTransaction(TxMode.write, ...)` callback. Resolve network, +PCS/MMCS work, parsing, file I/O, hashing, and UI notifications before or after +that callback, never with `await` inside it. Where projection work is genuinely +expensive, use `runInTransactionAsync` with primitive immutable payloads, but +retain the same all-box transaction and idempotency key. A per-box `putMany` +call is not sufficient for exactly-once Cloud Sync replay. + +## Semantic reconciliation and rebootstrap evidence update: 2026-08-01 + +### Fact: the three CloudKit streams have distinct canonical identities and +relationships + +`chatEncryptedv2` carries a chat GUID, `chat_identifier`, `group_id`, service, +participants, optional properties, group-photo fields, and a display name. +`MessageEncryptedV3` carries message GUID, `chatID`, sender, timestamp, +service, flags, four protobuf envelopes, and unencrypted message type/error +fields. The `attachment` record carries encrypted attachment metadata (`cm`) +and an asset (`lqa`); the metadata includes the attachment GUID, transfer state, +filename/name, type, byte count, outgoing flag, dates, and optional MMCS or +inline transfer metadata. The actual message-to-attachment relation is therefore +not an ObjectBox foreign key supplied by CloudKit: it is reconstructed from the +message body and attachment GUID normalization. + +Source: [chat schema](../rustpush/src/imessage/cloud_messages.rs#L231-L297), +[message schema](../rustpush/src/imessage/cloud_messages.rs#L314-L368), +and [attachment schema and metadata](../rustpush/src/imessage/cloud_messages.rs#L444-L475). +The existing local projection performs attachment-guid normalization before +persistence: [attachment mapping](../lib/database/io/attachment.dart#L57-L77). + +**Action:** Define V2 keys explicitly: `serverRecordId` is the immutable +CloudKit-envelope key, `chatGuid`, `messageGuid`, and normalized +`attachmentGuid` are logical entity keys, and a link is valid only after both +logical entities exist. Retain a protected raw envelope and its schema version +for each mapping. Apply chat, message, and attachment records independently, +then resolve message attachment references from the canonical decoded message +body in the same idempotent local-apply transaction. Never infer a link from a +file path, filename, record arrival order, or a best-effort current chat. + +### Fact: `p:` identifies an associated-message target, while `bp` is a +separate balloon-payload field + +The CloudKit upload mapper serializes an associated-message target as +`p:/`. Its download counterpart presently assigns the whole raw +value into `associatedMessageGuid`, while later local queries compare that field +to a bare local `Message.guid`. This is a real normalization mismatch. By +contrast, `bp` in the native incoming iMessage schema is `balloon_part` data, +with `bpdi` as its MMCS descriptor; it is fed into the extension/balloon parser, +not used as a reaction-parent identity. + +Source: [CloudKit reaction serialization](../lib/database/io/message.dart#L1055-L1062), +[current direct assignment](../lib/database/io/message.dart#L1180-L1191), +[local parent lookup](../lib/database/io/message.dart#L1222-L1235), and +[raw `bp`/`bpdi` fields](../rustpush/src/imessage/rawmessages.rs#L388-L447) with +[balloon parsing](../rustpush/src/imessage/messages.rs#L3613-L3645). + +**Action:** Parse `p:/` into a typed parent reference +`{ parentGuid, parentPart, rawValue }` before any ObjectBox write, and persist a +durable unresolved-association row when the parent is not yet present. Parse +thread replies (`r::`) under a separate typed contract. Treat `bp` +and `bpdi` exclusively as extension payload material, not as aliases for a +reaction parent. The replay suite must cover parent-before-child, +child-before-parent, several reactions to one parent, reaction removal, sticker, +thread reply, edit, and unsend, all with duplicate delivery and restart between +the child apply and parent resolution. + +### Fact: raw-page transport retains the information needed for replay, but +the legacy sync loop loses that safety boundary + +The page API emits an ordered list rather than a map. Each entry includes the +opaque record name/type, optional system fields, the encoded encrypted record +for an upsert, or the original encoded change envelope for a tombstone. It +classifies malformed metadata and unsupported record types without decoding +them. The legacy loop instead converts received records to `HashMap`s, directly +deletes a locally mapped entity on a null value, and asks CloudKit to delete +prior record IDs when it sees a logical duplicate. The page fetcher itself uses +`newest_first: false`, while the older generic path requests `newest_first: +true`; neither order establishes a parent-before-child guarantee across streams. + +Source: [replay-capable page shape and classification](../rustpush/src/imessage/cloud_messages.rs#L738-L883), +[page fetch path](../rustpush/src/imessage/cloud_messages.rs#L922-L946), +[legacy direct delete and duplicate-delete behavior](../lib/services/rustpush/rustpush_service.dart#L3176-L3445), +and [the two fetch-order settings](../rustpush/src/icloud/cloudkit.rs#L1312-L1322) +plus [legacy request](../rustpush/src/imessage/cloud_messages.rs#L963-L972). + +**Action:** V2 must consume the ordered page envelope one event at a time and +first insert it into a durable inbox keyed by `(account, zone, serverRecordId, +serverVersion-or-envelopeDigest)`. In a single local transaction, apply an +eligible envelope, update record map/tombstone/deferred-parent rows, mark the +inbox row applied, and advance only that page's candidate token. A server +tombstone may hide a local item only after its record map resolves it; a missing +map is a durable `tombstoneMappingMissing` review/rebootstrap condition, not a +guess or deletion. A logical duplicate must be diagnosed as a mapping conflict, +not resolved by emitting an outbound delete during inbound replay. + +### Fact: CloudKit continuation tokens are opaque, per-zone checkpoints and +can require a full reset + +Apple documents a record-zone change token as an opaque point in that zone's +history, with `nil` meaning a fetch from the beginning; the platform also has a +`changeTokenExpired` error. Rustpush already recognizes its protocol's +`FullResetNeeded` result: the Find My client clears its token and materialized +state, then fetches again. The message-stream page API returns a next token and +completion status, but the existing iMessage sync loop persists tokens +independently in preferences, outside the record mutations it just performed. + +Source: [Apple record-zone changes documentation](https://developer.apple.com/documentation/cloudkit/ckdatabase/recordzonechanges(inzonewith:since:desiredkeys:resultslimit:)), +[Apple change-token error documentation](https://developer.apple.com/documentation/cloudkit/ckerror/code/changetokenexpired), +[rustpush `FullResetNeeded` classifier](../rustpush/src/icloud/cloudkit.rs#L1530-L1537), +[existing safe-reset call site](../rustpush/src/findmy.rs#L1019-L1039), and +[legacy iMessage token writes](../lib/services/rustpush/rustpush_service.dart#L3250-L3457). + +**Action:** Store a token with an explicit namespace of account identity hash, +private database, zone name, stream schema version, and rebootstrap generation. +Commit it only with the successful local inbox/apply state for that page. On a +recognized token-expired/full-reset response, atomically mark the zone +`rebootstrapRequired`, stop all workers for that zone, retain raw journal and +record-map evidence, invalidate the token, then refetch with `nil` into a new +generation. Reconcile that generation by stable logical identity and +server-version rules, not by clearing user-visible messages or files. Do not +reuse a message-zone token for chats or attachments, and do not inspect or sort +an opaque token. + +### Fact: exactly-once is achievable only for the local apply, not for the +CloudKit fetch itself + +The replay-safe inbox pattern persists an event before handling it and commits +the local effect together with its processed marker. This absorbs fetch retries +and process crashes, while external transport remains at-least-once. Reference +implementations also retain failed records for bounded retry and operator +requeue rather than silently dropping them. + +Source: [transactional inbox/outbox reference](https://github.com/qwertyboy0325/handoff-semantics) +and [event-ID replay protection and local transaction boundary](https://github.com/inbox4j/inbox4j). + +**Action:** State the production guarantee precisely: Cloud Sync V2 provides +at-least-once CloudKit fetch with exactly-once *local database projection* for a +retained inbox key. It cannot claim global exactly-once delivery or ordering +across Apple zones. Add fault tests for crash before inbox insert, after inbox +insert, after entity apply but before token commit, duplicate page, token reset, +older upsert after newer upsert, tombstone before upsert, and conflicting server +record IDs for the same logical GUID. Keep malformed, PCS-blocked, and mapping +conflict rows out of normal retry loops and visible in redacted diagnostics. + +### Fact: a push or IDS event is a reconcile hint, never evidence that a +CloudKit checkpoint is current + +Apple documents that CloudKit can coalesce notifications and prune their +payloads. A client must treat a notification as an indication that a remote +change might exist, then fetch from its saved change token. Rustpush's APNS +transport reconnects over TCP 5223 with TCP 443 fallback, while the message +CloudKit API separately fetches record pages from a continuation token. The +current tree contains generic CloudKit subscription machinery used by the +Passwords and keychain clients, but no equivalent subscription-creation call in +the Messages sync path. An incoming IDS message, APNS reconnect, or +network-change event therefore cannot prove that every message-zone change has +been received, nor authorize a token advance. + +Source: [Apple Remote Records](https://developer.apple.com/documentation/cloudkit/remote-records), +[Apple CKQueryNotification](https://developer.apple.com/documentation/cloudkit/ckquerynotification), +[APNS transport ports](../rustpush/src/aps.rs#L1596-L1599), +[message page fetch](../rustpush/src/imessage/cloud_messages.rs#L922-L946), and +[non-Messages subscription call sites](../rustpush/src/passwords.rs#L1310-L1317). + +**Action:** Create one durable, account-scoped `reconcileRequested` latch. +Foreground activation, network restoration, a native connection resume, an +inbound IDS event, and any validated CloudKit notification may set that latch, +but none may write a CloudKit token. A single per-account worker should debounce +and coalesce those hints, drain each zone until its page indicates completion, +then atomically commit its candidate token with the local projection. Keep a +bounded, jittered recovery poll only as a missed-hint safety net, with no +one-request-per-push behavior. Do not add or depend on subscriptions to Apple's +Messages container without explicit protocol and account-safety validation. + +### Fact: name/photo sharing is a separate, two-stage public-CloudKit protocol, +not message-history replication + +Apple states that a shared iMessage name/photo is an immutable encrypted public +CloudKit record with a new record ID and key whenever the sender changes their +profile. The record ID and key are carried in an encrypted iMessage payload; a +recipient then fetches, authenticates, and optionally adopts the profile. +OpenBubbles matches this separation: it attaches a profile only to eligible +one-to-one sends, deduplicates its download by CloudKit record key, and retries +transient profile failures independently so they cannot disrupt message +delivery. + +Source: [Apple secure iMessage name and photo sharing](https://support.apple.com/guide/security/secure-imessage-name-and-photo-sharing-secea5f2e977/web), +[profile-send eligibility](../lib/services/rustpush/rustpush_service.dart#L3806-L3831), +and [independent profile retry and fetch](../lib/services/rustpush/rustpush_service.dart#L3842-L3972). + +**Action:** Keep profile processing outside the message-history inbox. Persist a +separate `ProfileFetchJob` keyed by sender identity hash, CloudKit record ID, +and record-key version, with immutable provenance of `shared-profile`. It may +update a shared contact/avatar only after decrypt-and-authenticate success; it +must never silently overwrite a local My Card, manually selected avatar, or +conversation background. The release suite must distinguish no embedded profile +payload, public-record fetch failure, cryptographic validation failure, and +user-policy refusal. Test a normal message, an initial profile share, and a +changed profile which must arrive under a new record reference. + +### Fact: account topology determines what a Cloud Sync test proves + +Apple's Messages in iCloud guidance is scoped to devices using the same Apple +Account. A second account can validate peer send/receive, reactions, media, and +profile sharing, but cannot by itself prove that one account's history converges +across local OpenBubbles installations. Reusing a local state store while +changing accounts also risks mixing opaque tokens and record maps that belong to +different accounts. + +Source: [Apple Messages in iCloud setup](https://support.apple.com/guide/icloud/set-up-messages-mm0de0d4528d/icloud) +and [opaque, segregated change-token guidance](https://developer.apple.com/documentation/cloudkit/ckserverchangetoken). + +**Action:** Use a disposable test Apple Account A for three clean, +independently stored OpenBubbles profiles: Android, Windows x64, and Windows +ARM64. This is the replication cohort. Use a separate disposable Account B on +an Apple-native peer only to generate inbound/outbound traffic. Never switch an +existing local test profile in place: an account mismatch must quarantine its +tokens, journal, record map, and profile jobs, then require a new generation. +Record each test's sender, receiver, attachment SHA-256, operation type, and +timestamps so same-account convergence and cross-account transport failures are +not conflated. + +### Fact: Android and Windows should coalesce recovery work around lifecycle +events, not keep the device artificially awake for metadata sync + +Android documents WorkManager as persistent work that survives process death +and reboot, supports unique work, constraints, and retry/backoff. It also warns +that immediate execution is not guaranteed and recommends combining related +work to reduce device wakeups. The existing setup currently recommends disabling +battery optimization to preserve notifications. Windows App SDK lifecycle APIs +provide power and system-state notifications, including suspend and resume. + +Source: [Android persistent task scheduling](https://developer.android.com/develop/background-work/background-tasks/persistent), +[Android battery optimization guidance](https://developer.android.com/develop/background-work/background-tasks/optimize-battery), +[Windows AppLifecycle sample](https://learn.microsoft.com/en-us/samples/microsoft/windowsappsdk-samples/applifecycle/), +[existing Android notification recommendation](../lib/app/layouts/setup/pages/setup_checks/battery_optimization.dart#L14-L22), +and [current network-change debounce](../lib/services/rustpush/rustpush_service.dart#L1555-L1595). + +**Action:** On Android, use one unique, network-constrained V2 reconcile worker +for a hint or connectivity recovery, with bounded metadata work and documented +backoff. Keep attachment prefetch/materialization as separately constrained +work, such as unmetered or charging when it is not user-initiated. Do not claim +background immediate delivery, and do not require a permanent wake lock for +Cloud Sync metadata. On Windows, request a coalesced reconcile after a valid +resume or network restoration while the desktop app can run; persist the dirty +latch before suspend and accept that a sleeping PC cannot provide a live-sync +guarantee. Both clients must expose the reason, last completed zone/token +generation, retry class, and next eligible attempt in redacted diagnostics. + +### Fact: the release gate must force every crash boundary and stale-state path + +The current page interface can return a bounded ordered batch and a next token, +while the implementation has explicit token-reset recognition elsewhere. Those +properties permit deterministic fault injection without relying on an Apple +account failure to occur naturally. A correctness test that only sends messages +on a healthy network cannot detect a token committed ahead of its local +projection, stale-account reuse, or a duplicate-hint storm. + +Source: [bounded page request and next-token result](../rustpush/src/icloud/cloudkit.rs#L1291-L1367), +[page-envelope classification](../rustpush/src/imessage/cloud_messages.rs#L738-L883), +and [existing reset detection](../rustpush/src/icloud/cloudkit.rs#L1530-L1537). + +**Action:** Add a scripted fault matrix to the live gate: duplicate and +coalesced hints; offline before raw-inbox write; process kill after inbox write, +after projection, and before token commit; token-expired/full-reset response; +account identity change; malformed encrypted record; deferred reaction parent; +profile public-record missing or invalid; and interrupted attachment download. +For every case, require one of successful eventual convergence with one local +projection, durable quarantine with an actionable code, or explicit +rebootstrap-required state. The gate fails if any case silently drops a message, +advances a token without its local apply, reuses another account's state, or +keeps a high-frequency background wake loop alive. + +### Fact: Flutter and Rust have native Windows ARM64 targets, but the current +application matrix is intentionally not a shippable ARM64 release + +Flutter's Windows build output is architecture-specific (`build/windows/x64` or +`build/windows/arm64`). Rust officially supports both +`x86_64-pc-windows-msvc` and `aarch64-pc-windows-msvc`, and MSVC can +cross-compile between Windows architectures when the matching Visual Studio +components are installed. Cargokit already passes its selected Rust target to +Cargo and installs it through Rustup. The repository's CI correctly separates +x64 from ARM64, bootstraps an ARM64 Dart SDK/Flutter engine on a native ARM64 +runner, and selects the matching Rust target. However, that ARM64 job is marked +experimental and exits before build because locked native dependencies are not +ARM64-compatible. + +Source: [Flutter Windows build architecture](https://docs.flutter.dev/release/breaking-changes/windows-build-architecture), +[Rust Windows MSVC targets](https://doc.rust-lang.org/stable/rustc/platform-support/windows-msvc.html), +[Cargokit target invocation](../rust_builder/cargokit/build_tool/lib/src/builder.dart#L116-L156), +and [current CI architecture and block](../.github/workflows/windows-build.yml#L23-L109). + +**Action:** Treat x64 as the only release-capable Windows architecture until +the ARM64 preflight passes. Keep independent `windows-x64` and `windows-arm64` +jobs on native runners, using `x86_64-pc-windows-msvc` and +`aarch64-pc-windows-msvc` respectively. Each job must emit an architecture +manifest for every PE in the final directory, including the runner, Flutter +engine, Rust bridge, ObjectBox, media DLLs, PDF renderer, WebView2 loader, and +plugin DLLs. Reject a bundle if any machine type differs from its declared +artifact architecture; do not use x64 emulation as evidence of an ARM64 release. + +### Fact: CMake platform selection must follow the Visual Studio target, not +the host processor + +For Visual Studio generators, CMake's `-A` option selects the target platform +and stores it in `CMAKE_GENERATOR_PLATFORM`. This repository already compensates +for an ARM64 host generating an x64 target by normalizing +`CMAKE_SYSTEM_PROCESSOR` to `AMD64`, because ObjectBox uses that value to select +its native archive. The explicit install rules also add the target-architecture +WebView2 loader and exclude a media package's debug-runtime DLLs. The existing +normalization is deliberately x64-only; ARM64 must retain its requested target +value so an ARM64-aware dependency chooses ARM64, rather than inheriting an +emulated process architecture. + +Source: [CMake Visual Studio platform selection](https://cmake.org/cmake/help/latest/variable/CMAKE_GENERATOR_PLATFORM.html), +[repository architecture normalization and packaging](../windows/CMakeLists.txt#L1-L19), +and [WebView2/media install handling](../windows/CMakeLists.txt#L52-L76). + +**Action:** Require each CI configure/build log to record +`CMAKE_GENERATOR_PLATFORM`, `CMAKE_VS_PLATFORM_NAME`, +`CMAKE_SYSTEM_PROCESSOR`, the Rust target triple, and the resulting PE machine +types. ARM64 enablement must use a clean build/cache directory, never a reused +x64 Flutter, CMake, Cargo, or dependency cache. Keep the current x64 override +only for a true x64 target on an ARM64 host, and add a targeted configure test +that fails if an ARM64 job resolves an x64 ObjectBox, WebView2, PDFium, libmpv, +ANGLE, or Rust bridge artifact. + +### Fact: ObjectBox Windows ARM64 is now available upstream, but the locked +ObjectBox package in this repository still blocks it + +The current CI records that `objectbox_flutter_libs 4.0.3` selects ObjectBox C +4.0.2 and that release has only x86/x64 Windows archives. Newer ObjectBox C +5.3.2 release assets include `objectbox-windows-arm64.zip`, and the current +ObjectBox Flutter Windows CMake source derives the archive from +`CMAKE_SYSTEM_PROCESSOR`. This removes one external blocker only after a +reviewed ObjectBox Flutter package upgrade; it does not prove that the current +lockfile, generated bindings, database migration behavior, or release bundle +will work unchanged. + +Source: [current repository ARM64 block](../.github/workflows/windows-build.yml#L58-L79), +[ObjectBox C 5.3.2 Windows ARM64 asset](https://github.com/objectbox/objectbox-c/releases/tag/v5.3.2), +and [current ObjectBox Flutter Windows CMake](https://github.com/objectbox/objectbox-dart/blob/main/flutter_libs/windows/CMakeLists.txt). + +**Action:** Split ObjectBox from the broad ARM64 effort. First upgrade it in a +dedicated, reviewable branch, regenerate only required bindings, and run the +existing ObjectBox/open-store/migration tests on both architectures. Inspect the +final `objectbox.dll` machine type and open a copied production-shaped database +on native ARM64 before removing only the ObjectBox blocker. Do not change the +application model or Cloud Sync V2 schema merely to achieve architecture parity. + +### Fact: media and PDF native dependencies remain the higher-risk ARM64 gate + +The repository's locked `media_kit_libs_windows_video` package selects an +x86_64 libmpv archive and x64 ANGLE bundle, while the locked `printing` package +hard-codes x64 PDFium. The CI stops for those reasons. Upstream media-kit work +shows an ARM64 libmpv/ANGLE path is being developed, but that work has had +upstream-binary and runtime-validation dependencies. Therefore an ARM64 media +compile, even if forced through CMake, cannot demonstrate safe video, audio, +GPU, or PDF behavior. + +Source: [current CI dependency block](../.github/workflows/windows-build.yml#L66-L77), +[locked media/PDF dependencies](../pubspec.yaml#L118-L123), +[locked printing dependency](../pubspec.yaml#L132-L145), and +[media-kit ARM64 work status](https://github.com/media-kit/media-kit/pull/1381). + +**Action:** Before enabling ARM64 packaging, require independently maintained, +pinned ARM64-capable replacements for libmpv, ANGLE, and PDFium. Verify their +license notices and checksums, then run native ARM64 smoke tests covering: +MP4/H.264 and HEVC playback, audio-only messages, paused/fullscreen swipe +transitions, thumbnail generation, a large image/PDF render, GPU fallback, and +app exit/relaunch. The test artifact may be labeled `arm64-preview` only after +all PE checks and those runtime tests pass; otherwise keep it absent rather than +publishing a package that can launch but fails on received media. + +### Fact: the existing Windows CI produces hashable draft ZIPs, not a signed +Windows release package + +The x64 workflow builds a release directory, compresses it, writes a SHA-256 +sidecar, and uploads both as a GitHub Actions artifact. It does not sign the +executables/DLLs, create an MSIX, or produce provenance attestations. GitHub +artifact attestations can establish build provenance, but are distinct from +Windows publisher trust. Microsoft documents that an installable MSIX must be +signed; self-signed certificates are appropriate only where each test user +explicitly trusts the certificate, and the certificate subject must match the +package publisher. + +Source: [current ZIP and SHA packaging](../.github/workflows/windows-build.yml#L221-L247), +[GitHub artifact attestations](https://docs.github.com/en/actions/how-tos/secure-your-work/use-artifact-attestations/use-artifact-attestations), +and [Microsoft MSIX test signing](https://learn.microsoft.com/en-us/windows/msix/package/create-certificate-package-signing). + +**Action:** Keep unsigned, SHA-256-checked ZIPs as restricted draft-test +artifacts only. For a public pre-release, create separate x64 and ARM64 +packages from the verified bundle, attach the architecture manifest, test log, +SBOM/license inventory, SHA-256, and provenance attestation. Choose one +distribution path before public release: signed portable bundle/installer, or +signed MSIX with a publisher identity that matches the certificate. Sign the +final package and each executable native payload after staging, timestamp it, +and verify both signature and architecture in a clean Windows VM/native ARM64 +machine. Never place a PFX, password, Apple credential, or self-signed trust +step in a public workflow or release artifact. + +### Fact: the ObjectBox ARM64 unblock is a coordinated SDK, generator, and +runtime upgrade, not a one-line native-library substitution + +The repository locks `objectbox`, `objectbox_flutter_libs`, and +`objectbox_generator` at 4.0.3, with an older `build_runner` resolution. The +current 5.3.2 Flutter runtime package requires Dart 3.7, and the matching +generator requires Dart 3.7, analyzer 8.1.1+, build 4+, and source_gen 4+. +ObjectBox's 5.0/5.1 release notes require regenerated code after an upgrade; +5.1 adds a required generated `GeneratorVersion` parameter, so retaining the +4.0.3 `objectbox.g.dart` produces a compile error. The x64 CI still uses +Flutter 3.24, which is below the Flutter 3.29/Dart 3.7 baseline documented by +ObjectBox for its newer packages. + +Source: [locked package set](../pubspec.lock#L2276-L2299), +[current ObjectBox Flutter package constraints](https://pub.dev/packages/objectbox_flutter_libs/versions/5.3.2), +[ObjectBox 5.0-5.3 release notes](https://pub.dev/packages/objectbox/changelog), +and [current x64 Flutter CI version](../.github/workflows/windows-build.yml#L23-L40). + +**Action:** Make this a dedicated dependency branch with exact, aligned +versions of `objectbox`, `objectbox_flutter_libs`, and `objectbox_generator` +at 5.3.2, rather than allowing one package to float. Raise the shared Dart and +Flutter toolchain to a validated Dart 3.7/Flutter 3.29-or-newer baseline before +resolving packages, and deliberately update the generator toolchain until +`build_runner`, `build`, `analyzer`, and `source_gen` satisfy ObjectBox 5.3. +Then run `dart run build_runner build`, review only the model/generator diff, +and fail CI if a subsequent generator run is not clean. Do not land the +ObjectBox package update mixed with unrelated Flutter upgrades or Cloud Sync +schema edits. + +### Fact: the model JSON and generated bindings, not the Dart class names +alone, protect existing stores + +ObjectBox persists entity/property IDs and UIDs in `lib/objectbox-model.json`, +then uses the generated model when opening a store. Adding/removing properties +is generally automatic, but renaming requires the preserved UID and changing a +persisted property type requires application-managed migration. The repository +has a version-controlled model with message, contact, attachment, and Cloud +Sync V2 journal entities; its generated file is currently emitted by the 4.0 +generator and has no ObjectBox 5.1 `generatorVersion` argument. Its Cloud Sync +V2 state is ordinary local ObjectBox data, not ObjectBox Sync: there is no +`SyncClient` or ObjectBox Admin dependency in the application paths. + +Source: [ObjectBox data-model update rules](https://docs.objectbox.io/advanced/data-model-updates), +[ObjectBox meta-model/UID rules](https://docs.objectbox.io/advanced/meta-model-ids-and-uids), +[current repository model](../lib/objectbox-model.json#L1625-L1633), +[current generated model definition](../lib/objectbox.g.dart#L1643-L1757), and +[Cloud Sync V2 entity source](../lib/database/io/cloud_sync_records.dart#L1-L11). + +**Action:** Freeze `lib/objectbox-model.json` before the package upgrade and +compare entity names, IDs, UIDs, property IDs/UIDs, relation IDs, and retired +UID lists after generation. No entity/property rename or type change is in +scope for the ARM64 unblock. Add a schema-fixture test that opens a realistic +4.0.3-created store under 5.3.2 and verifies messages, chats, attachments, +contacts, and every Cloud Sync V2 journal/checkpoint/lease/outbox row before +and after a close/reopen. Treat any unexpected model-JSON semantic change as a +release blocker, not formatting noise. + +### Fact: rollback must restore a closed-store snapshot, not assume that a +newer native runtime is backward-compatible + +ObjectBox documents how a model mismatch can prevent a store from opening and +identifies reconstructing the UID model or deleting the database as its two +resolution paths. Deleting a published user's database loses data. The +documentation does not make a general promise that an older ObjectBox 4.0.3 +runtime can reopen every store that a newer 5.3.2 runtime has written. This +application opens its live desktop store directly from the app documents path +and already copies an older custom-path store into that location, so an +in-place package replacement without a closed-store rollback artifact would be +unsafe. + +Source: [ObjectBox meta-model conflict guidance](https://docs.objectbox.io/advanced/meta-model-ids-and-uids), +[ObjectBox troubleshooting](https://docs.objectbox.io/troubleshooting), and +[repository desktop-store open/copy path](../lib/database/database.dart#L135-L151). + +**Action:** Before first production launch of the upgraded build, take a +verified cold copy of the entire ObjectBox directory only after the store is +closed, plus the matching app settings/database-version record. In validation, +run both directions on disposable copies: 4.0.3-created store -> 5.3.2 open, +mutate, close, then 4.0.3 reopen; and 5.3.2-created store -> 5.3.2 reopen. If +the first reverse-open is not explicitly validated, rollback means restoring +the cold snapshot with the prior application build, never downgrading against +the modified live store. Do not use a data-directory deletion as recovery for +an update failure. + +### Fact: ObjectBox 5.3.2 supplies the Windows ARM64 archive, but its Flutter +CMake package does not pin that download's digest + +ObjectBox C 5.3.2 publishes both `objectbox-windows-arm64.zip` and +`objectbox-windows-x64.zip`. The current Flutter package derives the archive +name from `CMAKE_SYSTEM_PROCESSOR`, maps `AMD64` to `x64`, links +`objectbox.dll`, and exports it as a bundled library. The upstream CMake +`FetchContent` declaration pins the release URL but contains no `URL_HASH`. +GitHub's release metadata provides SHA-256 digests: ARM64 +`e32ea12aebd76f00bcf9def941a3c73b24d2cc2dcd0e79a033b49522a2b2c0fd` and +x64 `57d7db013bbb46efe415307c9f3baf7564bdc40818ee1f1c42046f4241403d63`. + +Source: [ObjectBox 5.3.2 release assets](https://github.com/objectbox/objectbox-c/releases/tag/v5.3.2), +[ObjectBox Flutter Windows CMake](https://github.com/objectbox/objectbox-dart/blob/main/flutter_libs/windows/CMakeLists.txt), +and [repository platform normalization](../windows/CMakeLists.txt#L6-L11). + +**Action:** In CI, independently download or inspect the resolved ObjectBox C +archive and verify the architecture-specific SHA-256 before CMake configures +the release. Record the archive name, digest, ObjectBox version, final +`objectbox.dll` SHA-256, and PE machine type in the per-architecture manifest. +Use fresh per-architecture FetchContent/CMake caches. The x64 target on an +ARM64 host may retain the existing `AMD64` normalization; the native ARM64 +target must resolve `objectbox-windows-arm64.zip`. Do not accept an x64 DLL +loaded through emulation as an ARM64 validation. + +### Fact: dual-architecture validation needs physical-store portability tests, +not only a build and unit-test pass + +The repository already has focused ObjectBox Cloud Sync store tests that create +a store, exercise journal/checkpoint/outbox state, close it, and reopen it. +That demonstrates a useful test harness, but it currently runs only against +the active local native library and does not prove x64-to-ARM64 store +interoperability. The application itself relies on transactions, `Store.attach`, +and a persisted store containing user history, making an architecture-specific +corruption or model-open failure a release-critical defect. + +Source: [existing ObjectBox Cloud Sync reopen tests](../test/services/cloud_sync/objectbox_cloud_sync_store_test.dart#L17-L45), +[existing attachment-state reopen test](../test/services/cloud_sync/cloud_attachment_materialization_store_test.dart#L32-L63), +and [production store initialization](../lib/database/database.dart#L112-L151). + +**Action:** Build a disposable seed store with the 4.0.3 x64 baseline and +record stable counts/hashes for each core box and V2 Cloud Sync box. Validate +four clean-machine sequences: baseline x64 -> upgraded x64; baseline x64 -> +upgraded ARM64; upgraded ARM64 -> upgraded x64; and upgraded x64 -> upgraded +ARM64. In each sequence open, query, write one reversible fixture row, close, +reopen, then assert stable data plus all journal invariants. Run the same +smoke test through the packaged release directories, not just `flutter test`. +Remove the ObjectBox entry from the ARM64 CI block only after all four +sequences, PE/digest manifest checks, and a native ARM64 physical-device run +pass; leave PDF/media blockers in place independently. + +### Fact: the local ARM64 branch's Flutter blocker is obsolete, but its +cross-compilation warning remains valid + +Flutter's current stable `BuildWindowsCommand` selects `windows-arm64` when +the host platform is `HostPlatform.windows_arm64`, selects `windows-x64` on +other Windows hosts, and passes the resulting platform through to CMake as +both `-A ARM64`/`-A x64` and `FLUTTER_TARGET_PLATFORM`. The same behavior is +present in the verified 3.44.8 source. The Windows ARM64 umbrella records that +Flutter 3.44.0 stable began producing the ARM64 Dart SDK and Flutter engine +for every release; the issue remains open because its broader checklist still +includes cross-compilation and other follow-up work. The local +`agent/windows-arm64-native` guide instead says stock 3.44.8 cannot produce a +native ARM64 application. That statement conflicts with the current 3.44.8 +tool source and must not remain a release decision input. + +Source: [Flutter stable Windows build command](https://github.com/flutter/flutter/blob/stable/packages/flutter_tools/lib/src/commands/build_windows.dart), +[Flutter stable CMake target selection](https://github.com/flutter/flutter/blob/stable/packages/flutter_tools/lib/src/windows/build_windows.dart), +[Flutter ARM64 umbrella, current open state](https://github.com/flutter/flutter/issues/62597), +[Flutter 3.44.8 tag](https://github.com/flutter/flutter/tree/3.44.8), and +[stale local alpha guide](windows-arm64-alpha.md#blocker-flutter-windows-arm64-target). + +**Action:** Replace the alpha guide's "blocker zero" assertion with a +host/target matrix: native Windows ARM64 host plus ARM64 Dart/engine builds +ARM64 by default; native x64 host builds x64 by default; x64-to-ARM64 +cross-compilation is not a supported release path. Retain Flutter 3.44.8 as +the minimum native-ARM64 CI baseline, because 3.44.0 is the first stable +release with the required downloadable artifacts, but do not describe it as a +patched Flutter requirement. Re-run dependency resolution and a minimal +native ARM64 app build before treating the application-level dependency work +as the remaining blocker. + +### Fact: `flutter build windows --target-platform windows-arm64` is not the +official stable command path + +The current stable command exposes no Windows `--target-platform` argument; +its target is derived from the host architecture. Flutter issue #129808, +still open, explicitly proposes that option for cross-compilation and says it +should error on the beta and stable channels. A native ARM64 runner must +therefore execute plain `flutter build windows --release` after its ARM64 SDK +and engine have been selected. Passing a proposed flag, forcing an ARM64 +CMake generator from an x64 Flutter tool, or interpreting an x64-emulated +build as an ARM64 artifact would create a false validation result. + +Source: [Flutter stable build command](https://github.com/flutter/flutter/blob/stable/packages/flutter_tools/lib/src/commands/build_windows.dart), +[cross-compilation proposal #129808](https://github.com/flutter/flutter/issues/129808), and +[repository native ARM64 CI lane](../.github/workflows/windows-build.yml#L26-L92). + +**Action:** Keep separate native `windows-2022` x64 and `windows-11-arm` ARM64 +jobs. For each, use plain `flutter build windows --release`, retain the +post-build PE-machine manifest check, and publish neither job as the other +architecture. Close the ARM64 experimental gate only after the ARM64 job +finishes package resolution, release build, and native-device smoke tests; +do not wait for cross-compilation support that the product does not require. + +### Fact: the existing cache refresh is an upstream-described artifact +selection workaround, not a local Flutter patch + +The Windows Flutter SDK archive still starts with x64 Dart and engine +components. The ARM64 umbrella documents the same sequence used in this +repository: remove `bin/cache/engine-dart-sdk.stamp`, refresh Dart so it +downloads `windows_arm64`, then run `flutter precache --windows` and verify +the ARM64 engine. The repository currently forces +`subosito/flutter-action@v2` to install `architecture: x64` and then performs +that refresh manually. The action itself now declares `arm64` as a supported +SDK architecture and defaults its architecture input to the runner's +architecture. This makes the forced-x64/bootstrap combination a candidate +for removal, but third-party action behavior must be demonstrated on the +native GitHub runner before deleting the independent Dart/engine assertions. + +Source: [Flutter ARM64 artifact instructions](https://github.com/flutter/flutter/issues/62597), +[repository forced-x64/bootstrap sequence](../.github/workflows/windows-build.yml#L60-L92), and +[flutter-action architecture input](https://github.com/subosito/flutter-action/blob/main/action.yaml). + +**Action:** In a disposable ARM64 CI run, set the action architecture to +`arm64` (or omit it and verify its native-runner default), retain only the +read-only assertions that `dart --version` reports `windows_arm64` and that +`windows-arm64-release` exists, then run a clean minimal app build. If that +passes from an empty Flutter-action cache, remove the forced `architecture: +x64`, stamp deletion, and direct call to Flutter's internal update script. +Keep the architecture and engine-directory assertions permanently. If the +action does not supply the correct artifacts, restore the documented refresh +sequence and record that as a tool bootstrap constraint rather than a Flutter +source fork. + +### Fact: the ARM64 branch's application changes are native-dependency work, +not Flutter-framework patches, and cannot be removed on framework support +alone + +The ARM64 branch contains no Flutter engine/tool fork. It removes the +`printing` plugin's x64-only PDFium use and vendors an ARM64 media bundle; +its remaining ObjectBox path requires the coordinated 5.3.2 upgrade above. +Flutter's closed ARM64 plugin-linking report confirms that a clean Flutter app +builds natively and that failures from plugins carrying x64-only precompiled +libraries are expected, not a framework regression. Consequently, native +Flutter support resolves the stale framework blocker but does not make an +x64-only PDF, media, database, WebView, or other DLL loadable in an ARM64 +process. + +Source: [ARM64 branch commit/file delta](https://github.com/OpenBubbles/openbubbles-app/compare/main...agent/windows-arm64-native), +[local ARM64 media/PDF guide](windows-arm64-alpha.md), and +[Flutter native-plugin architecture report #186836](https://github.com/flutter/flutter/issues/186836). + +**Action:** Preserve the printing removal, media PE-machine verification, and +ObjectBox upgrade plan until an upstream dependency release replaces each one +and a clean native ARM64 release package passes audio, video, PDF export, and +existing-store tests. Update the alpha guide to separate framework readiness +from dependency readiness: Flutter is now a host-build prerequisite that can +be validated in CI, while each native dependency remains an independently +testable release gate. Do not remove a dependency workaround merely because a +framework-level ARM64 build succeeds. + +### Fact: ObjectBox publishes the Dart API, Flutter runtime package, generator, +and desktop C library as a matched release set + +The repository currently resolves `objectbox`, `objectbox_flutter_libs`, and +`objectbox_generator` to 4.0.3. In that release, both the Flutter runtime +package and generator depend on `objectbox: 4.0.3` exactly. The corresponding +5.3.2 packages likewise require `objectbox: 5.3.2` exactly. ObjectBox's +getting-started guidance instructs Flutter users to add compatible package +versions together, and its 4.0.3 and 5.3.2 release notes each name the desktop +ObjectBox C version bundled for Flutter Windows/Linux and Dart Native apps. +This is a published release-coupling pattern, not a collection of independent +native artifacts. + +Source: [current repository lockfile](../pubspec.lock#L2276-L2298), +[ObjectBox Dart 4.0.3 package definitions](https://github.com/objectbox/objectbox-dart/tree/v4.0.3), +[ObjectBox Dart 5.3.2 package definitions](https://github.com/objectbox/objectbox-dart/tree/v5.3.2), +[ObjectBox getting-started guidance](https://docs.objectbox.io/getting-started), +[ObjectBox Dart 4.0.3 release](https://github.com/objectbox/objectbox-dart/releases/tag/v4.0.3), and +[ObjectBox Dart 5.3.2 release](https://github.com/objectbox/objectbox-dart/releases/tag/v5.3.2). + +**Action:** Treat `objectbox`, `objectbox_flutter_libs`, and +`objectbox_generator` as one versioned unit. Do not ship a manifest or local +native-artifact override that claims the 4.0.3 Dart/generator packages are a +supported counterpart of ObjectBox C 5.3.2 merely because it supplies the +needed ARM64 DLL. + +### Fact: ObjectBox Dart 4.0.3 performs only a lower-bound native-library +check, so it will not by itself reject ObjectBox C 5.3.2 + +The 4.0.3 Dart binding loads `objectbox.dll` dynamically and accepts a native +library whose reported C API is at least 4.0.1 and whose core version is at +least `4.0.2-2024-10-15`; it has no upper-bound or exact-version comparison. +ObjectBox C's own header instructs dynamic-library consumers to verify that a +compatible version was linked through `obx_version()` or +`obx_version_is_at_least()`. Therefore, assuming the ARM64 DLL reports its +published 5.3.2 version, 4.0.3's startup guard is expected to accept it. + +Source: [4.0.3 native loader and compatibility guard](https://github.com/objectbox/objectbox-dart/blob/v4.0.3/objectbox/lib/src/native/bindings/bindings.dart), +[ObjectBox C version-check contract](https://github.com/objectbox/objectbox-c/blob/v5.3.2/include/objectbox.h), and +[ObjectBox C 5.3.2 release](https://github.com/objectbox/objectbox-c/releases/tag/v5.3.2). + +**Action:** Use the lower-bound result only as a diagnostic fact: it explains +why a 4.0.3/5.3.2 experiment may load rather than fail immediately. Add an +explicit startup diagnostic that records the loaded C API/core version and PE +machine type during any temporary experiment, but do not use a successful +load, smoke test, or absence of a guard failure as proof of production ABI or +store compatibility. + +### Inference: loading is not a published guarantee that the 4.0.3 FFI binding +is production-safe with ObjectBox C 5.3.2 + +The 4.0.3 binding was generated from older ObjectBox C headers, while the +5.3.2 release updates C API headers and generated Dart FFI bindings. ObjectBox +has added explicit runtime/generator compatibility enforcement in the 5.x +series and repeatedly directs users to release-matched native dependencies +when the runtime changes. No official compatibility matrix or maintainer +statement found in this review guarantees every 4.0.3 Dart FFI call, callback, +observer, query stream, or on-disk behavior against ObjectBox C 5.3.2 across a +major version boundary. That absence does not prove an ABI break, but it makes +the mixed-major configuration unsupported for a production messaging store. + +Source: [5.3.2 C-API/binding update commit](https://github.com/objectbox/objectbox-dart/commit/30936773c6f2a4ea6d11758f9564dd8dbe589ea5), +[ObjectBox 5.1 generator compatibility release note](https://github.com/objectbox/objectbox-dart/releases/tag/v5.1.0), +[maintainer guidance on matching runtime dependencies](https://github.com/objectbox/objectbox-dart/issues/690), and +[5.3.2 release pairing](https://github.com/objectbox/objectbox-dart/releases/tag/v5.3.2). + +**Action:** Reject 4.0.3 Dart bindings plus ObjectBox C 5.3.2 as the release +baseline for both Windows architectures. It may remain an isolated, +non-production proof-of-load only if it uses a disposable database, contains +no Sync/Admin features, records exact native versions, and is never used to +mutate or validate an upgrade path for a user's live store. + +### Fact: the 5.3.2 upgrade requires Dart 3.7 and generator regeneration, so +the current x64 and ARM64 toolchains must move together + +`objectbox_flutter_libs` 5.3.2 and `objectbox_generator` 5.3.2 require Dart +`^3.7.0`; the generator also requires analyzer 8.1.1+, build 4+, and +source_gen 4.0.1+. ObjectBox 5.1 introduced a mandatory `GeneratorVersion` +argument specifically to enforce generated-code/runtime compatibility and +states that `dart run build_runner build` must be run after updating the +ObjectBox package. The repository's x64 workflow is pinned to Flutter 3.24.0, +whose release coincided with Dart 3.5, so it cannot satisfy the 5.3.2 Dart +floor. Flutter 3.44 includes Dart 3.12 and meets that floor, but an ARM64-only +toolchain upgrade would leave x64 package resolution and generated code out of +parity. + +Source: [ObjectBox 5.3.2 Flutter runtime package](https://github.com/objectbox/objectbox-dart/blob/v5.3.2/flutter_libs/pubspec.yaml), +[ObjectBox 5.3.2 generator constraints](https://github.com/objectbox/objectbox-dart/blob/v5.3.2/generator/pubspec.yaml), +[ObjectBox 5.1 regeneration requirement](https://github.com/objectbox/objectbox-dart/releases/tag/v5.1.0), +[current x64/ARM64 CI matrix](../.github/workflows/windows-build.yml#L18-L40), +[Flutter 3.24/Dart 3.5 release context](https://docs.flutter.dev/release/archive-whats-new), and +[Flutter 3.44 release notes](https://docs.flutter.dev/release/release-notes/release-notes-3.44.0). + +**Action:** Use one coordinated baseline for the production migration: +Flutter 3.44.8 on both Windows x64 and ARM64, with the exact ObjectBox 5.3.2 +trio and a reviewed Dart/build-runner/analyzer/source_gen resolution. Regenerate +`objectbox.g.dart`, preserve the model JSON/UIDs, and run the existing-store +portability matrix before any release. This is a larger upgrade than a DLL +swap, but it is the safest route because it gives both architectures the same +toolchain, generated bindings, native API expectation, and supportable +rollback boundary. diff --git a/docs/CLOUD_SYNC_V2_PROVENANCE_LEDGER.md b/docs/CLOUD_SYNC_V2_PROVENANCE_LEDGER.md new file mode 100644 index 0000000000..d711f900d6 --- /dev/null +++ b/docs/CLOUD_SYNC_V2_PROVENANCE_LEDGER.md @@ -0,0 +1,122 @@ +--- +type: provenance_ledger +title: OpenBubbles Cloud Sync V2 Provenance Ledger +description: Per-idea record of borrowed protocol facts and patterns, their source licence, whether code or only a concept was taken, and the file that implements each one. +resource: openbubbles-app +tags: [licensing, provenance, cloudkit, sspl, apache-2.0, compliance] +timestamp: 2026-08-22 +--- + +# Cloud Sync V2 provenance ledger + +## Why this exists + +[Open-source pattern review](CLOUD_SYNC_V2_OPEN_SOURCE_REVIEW.md) states the +rule: for every borrowed implementation idea, record the project, exact source +URL, licence, whether code or only a concept was used, and the OpenBubbles file +that implements it. That document holds a per-project table. This one holds the +per-idea entries the rule actually asks for, and it is a release gate. + +## The distinction this ledger turns on + +A field name, a wire type number, a zone name, and the grammar of an identifier +are **facts about Apple's protocol**. Observing that Apple encodes a reaction +parent as `p:/` is a fact, and facts are not copyrightable. + +A struct definition, a derive macro, a `.proto` file, and a function body are +**expression**. They carry the licence of the project that wrote them. + +Every entry below records which of the two was taken. Where the source is +SSPL-1.0 or GPL-family, only facts were used and the implementation was written +independently against them. + +## The rustpush boundary, stated precisely + +`rustpush` is **SSPL-1.0** and ships an exception granting an MIT-style licence +to OpenBubbles itself, not to third parties. The application already depends on +it as a submodule and links it, which is a deliberate existing architecture +decision, not something this work introduced. + +What this ledger governs is narrower: **no rustpush source may be copied into +the Apache-2.0 Dart or `rust/src` layer.** Protocol facts learned by reading it +may be, and each one is listed below. + +## Ledger + +### Apple protocol facts + +| # | Fact taken | Source | Licence | Code or concept | Implemented in | +| --- | --- | --- | --- | --- | --- | +| 1 | Reaction parent is encoded `p:/`, and as a **bare GUID with no prefix** when no part is targeted | [rustpush `messages.rs`](https://github.com/OpenBubbles/rustpush/blob/master/src/imessage/messages.rs) `amk` construction | SSPL-1.0 | Fact only | `rust/src/cloud_sync_canonical_dto.rs` (`parse_associated_parent`), `lib/services/rustpush/cloud_sync/cloud_associated_message_parent_reference.dart` | +| 2 | Reply parent is `r::`, colon-separated, an independent grammar from the reaction form | same, `tg` field | SSPL-1.0 | Fact only | `rust/src/cloud_sync_canonical_dto.rs` (`parse_reply_parent`) | +| 3 | Owned attachment identity is `at__`, and the GUID may itself contain underscores | same, `transfer_guid` | SSPL-1.0 | Fact only | `lib/utils/attachment_guid_utils.dart`, `rust/src/cloud_sync_canonical_dto.rs` (`parse_owned_attachment_guid`) | +| 4 | `bp` and `bpdi` are IDS wire-payload keys, **not** CloudKit record fields; the record equivalent is `MessageProto.payloadData` | [rustpush `rawmessages.rs`](https://github.com/OpenBubbles/rustpush/blob/master/src/imessage/rawmessages.rs) vs `cloud_messages.rs` | SSPL-1.0 | Fact only | No code change. Recorded because it prevented inventing presence rules for fields that do not exist on these records. | +| 5 | `filt`, `sqry`, `ste` are `i64`, not booleans | [rustpush `cloud_messages.rs`](https://github.com/OpenBubbles/rustpush/blob/master/src/imessage/cloud_messages.rs) | SSPL-1.0 | Fact only | Already correct before this review; verified, not changed | +| 6 | `ust`, `hbr`, `oui`, `osn`, `euh`, `bcg`, `ams`/`ampt`/`amc`/`amb`/`amd` live inside a `MessageSummaryInfo` plist at protobuf field 7, gzipped; `bcg` sits inside a `MessageEdit`; `ec` and `otr` are keyed by decimal-string part | same | SSPL-1.0 | Fact only | Already correct before this review; verified, not changed | +| 7 | Apple's summary plist omits empty collections rather than sending them, so there is no explicit-clear state in that plist | same, serde `skip_serializing_if` on collections | SSPL-1.0 | Fact only | `rust/src/cloud_sync_canonical_converter.rs` (empty `ec`/`rp` now reads as absent rather than a clear instruction) | +| 8 | Zone-to-record-type mapping for the three Manatee zones | same | SSPL-1.0 | Fact only | `rust/src/cloud_sync_native_fetch.rs` | +| 9 | `messageUpdateZone` and `recoverableMessageDeleteZone` exist and are not currently read | same, zone reset list | SSPL-1.0 | Fact only | Not implemented. Recorded as an open scope question in [path to production](CLOUD_SYNC_V2_PATH_TO_PRODUCTION.md). | +| 10 | PCS GCM additional authenticated data is scoped `zone-record-field`, so a wrong field name fails authentication rather than yielding wrong plaintext | [rustpush `pcs.rs`](https://github.com/OpenBubbles/rustpush/blob/master/src/icloud/pcs.rs) | SSPL-1.0 | Fact only | Not code. Informs live validation: field names are self-verifying against real data. | + +### Wire-format facts + +| # | Fact taken | Source | Licence | Code or concept | Implemented in | +| --- | --- | --- | --- | --- | --- | +| 11 | CloudKit's field value type enum includes `EMPTY_LIST = 9`, a distinct representation of "present but empty" | `rustpush/cloudkit-proto/src/cloudkit.proto`, vendored in-tree | SSPL-1.0 | Fact only | `rust/src/cloud_sync_canonical_converter.rs` records the observation as evidence; no decision reads it | +| 12 | Error codes `RESET_NEEDED = 17` and `FULL_RESET_NEEDED = 40` | same | SSPL-1.0 | Fact only | Not implemented. Feeds the rebootstrap requirement in the production-readiness notes. | + +### Engineering patterns + +| # | Pattern taken | Source | Licence | Code or concept | Implemented in | +| --- | --- | --- | --- | --- | --- | +| 13 | Windows provides no directory-sync primitive; a no-op is the correct implementation and durability rests on startup reconciliation | [Restic](https://github.com/restic/restic) `local_windows.go` | BSD-2-Clause | Concept only | `rust/src/cloud_sync_native_fetch.rs` (`sync_directory` on Windows) | +| 14 | Part-index semantics, and that `bp:` is a real GUID prefix for bubble/tapback messages in the local database schema | [imessage-exporter](https://github.com/ReagentX/imessage-exporter) `variants.rs` doc comments | **GPL-3.0** | Concept only, no code | Informed entry 4. No GPL code is present in this repository. | +| 15 | Exactly-once local projection is achieved by writing the cursor in the same transaction as the projected rows, with a sequence-guarded upsert, rather than a dedup table | CouchDB replication protocol (Apache-2.0), Replicache server-pull docs, Debezium docs | Apache-2.0 and documentation | Concept only | Not yet implemented. Recorded as a binding constraint for semantic apply. | +| 16 | Contiguous-prefix cursor with a separate high watermark, and a bounded gap set that stops admission rather than evicting | NATS JetStream docs, Apache Pulsar PIP-81, PostgreSQL replication slots | Apache-2.0 and documentation | Concept only | Partially present as the existing contiguous checkpoint. The bounded retry queue and stall timer are not implemented. | +| 17 | Server-authoritative field classification instead of CRDTs for a single-writer projection | [Figma multiplayer writeup](https://www.figma.com/blog/how-figmas-multiplayer-technology-works/) | Article | Concept only | Not yet implemented. Recorded as a Phase 2 prerequisite. | +| 18 | One fsynced contiguous-prefix integer per blob, truncated to on startup | Restic, Syncthing (MPL-2.0) design docs | BSD-2-Clause, MPL-2.0 | Concept only, no code from either | Attachment materialisation design; not yet implemented | +| 19 | Two-level fault injection where a call site is armed per run and then fires probabilistically | FoundationDB `BUGGIFY` | Apache-2.0 | Concept only | Not yet implemented | +| 20 | Incrementing fail-on-Nth-operation loop for crash testing, run in both fail-once and fail-persistently modes | [SQLite testing](https://www.sqlite.org/testing.html) | Public domain | Concept only | Not yet implemented | + +### Apple iOS 26 implementation evidence + +These entries record protocol and orchestration facts observed in a fixed-commit +decompilation of Apple's iOS 26.1 Messages implementation. The mirror does not +grant a source-code licence. No function body, control flow, symbol layout, or +other expression from it is copied into OpenBubbles. The facts are corroborated +where possible with Apple's public CloudKit documentation. + +| # | Fact taken | Source | Licence | Code or concept | Implemented in | +| --- | --- | --- | --- | --- | --- | +| 21 | Chat record saves use an atomic modify-records operation, while message and attachment saves use non-atomic operations with per-record outcomes | [iOS 26.1 chat factory](https://github.com/EthanArbuckle/iPhone18-3_26.1_23B85_Restore/blob/90aa0cfe59d9682b4265e1354c8b19ec3c7823ab/System/Library/PrivateFrameworks/IMDaemonCore.framework/IMDaemonCore/IMDCKChatSyncCKOperationFactory.mm), [message factory](https://github.com/EthanArbuckle/iPhone18-3_26.1_23B85_Restore/blob/90aa0cfe59d9682b4265e1354c8b19ec3c7823ab/System/Library/PrivateFrameworks/IMDaemonCore.framework/IMDaemonCore/IMDCKMessageSyncCKOperationFactory.mm), and [attachment factory](https://github.com/EthanArbuckle/iPhone18-3_26.1_23B85_Restore/blob/90aa0cfe59d9682b4265e1354c8b19ec3c7823ab/System/Library/PrivateFrameworks/IMDaemonCore.framework/IMDaemonCore/IMDCKAttachmentSyncCKOperationFactory.mm); [Apple `isAtomic`](https://developer.apple.com/documentation/cloudkit/ckmodifyrecordsoperation/isatomic) | Binary-derived fact; Apple documentation | Fact only | Not implemented. Binding input to the Stage 4 batch and acknowledgement design. | +| 22 | Chat and message factories explicitly select raw save policy `1`, which SDK declarations identify as changed-keys. The attachment factory does not override the operation default; Apple's documented default is if-server-record-unchanged | Same fixed factory sources; [Apple `savePolicy`](https://developer.apple.com/documentation/cloudkit/ckmodifyrecordsoperation/savepolicy) | Binary-derived fact; Apple documentation | Fact only | Not implemented. Stage 4 must represent save policy explicitly and test conflict behavior rather than inheriting one generic policy. | +| 23 | Apple's chat importer deliberately drops incoming chat-record deletions because IDS handles them in real time | [iOS 26.1 `IMDCKChatSyncController`](https://github.com/EthanArbuckle/iPhone18-3_26.1_23B85_Restore/blob/90aa0cfe59d9682b4265e1354c8b19ec3c7823ab/System/Library/PrivateFrameworks/IMDaemonCore.framework/IMDaemonCore/IMDCKChatSyncController.mm) | Binary-derived fact; no source licence | Fact only | The read-only canary already quarantines all tombstones. Stage 4 must keep chat tombstones from deleting local conversations merely because CloudKit reported a deletion. | +| 24 | Chat, message, and attachment record deletes use non-atomic modify operations; the controllers deduplicate pending record IDs before scheduling deletion | Same fixed factories and controllers | Binary-derived fact; no source licence | Fact only | Not implemented. Stage 4 delete identity, deduplication, partial-result acknowledgement, and retry tests required. | +| 25 | The update-zone importer treats record deletion as unsupported and routes UT1/UT2 save conflicts through type-specific conflict handlers | [iOS 26.1 `IMDCKUpdateSyncController`](https://github.com/EthanArbuckle/iPhone18-3_26.1_23B85_Restore/blob/90aa0cfe59d9682b4265e1354c8b19ec3c7823ab/System/Library/PrivateFrameworks/IMDaemonCore.framework/IMDaemonCore/IMDCKUpdateSyncController.mm) | Binary-derived fact; no source licence | Fact only | Not implemented. `messageUpdateZone` remains outside the first semantic canary and needs a separate conflict model before activation. | +| 26 | CloudKit has distinct HTTP-request UUID, per-operation UUID, record ETag/change tag, and change-feed ETag identities; none is a substitute for another | [Apple `CKDPOperation`](https://raw.githubusercontent.com/nst/iOS-Runtime-Headers/master/PrivateFrameworks/CloudKitDaemon.framework/CKDPOperation.h), [Apple `CKDPRecord`](https://raw.githubusercontent.com/nst/iOS-Runtime-Headers/master/PrivateFrameworks/CloudKitDaemon.framework/CKDPRecord.h), and the in-tree rustpush request builder | Header declarations and protocol facts | Fact only | `CloudOutboxOperation` and `CloudOutboxOperationEntity` now persist exact request and operation UUIDs atomically at the ambiguity boundary. Predecessor record ETag binding remains a write-activation gate. | +| 27 | Apple's private save request and response models expose ETag, conflict, protection-tag, and time-statistics fields beyond the fields represented by the current rustpush protobuf | [Apple `CKDPRecordSaveRequest`](https://raw.githubusercontent.com/nst/iOS-Runtime-Headers/master/PrivateFrameworks/CloudKitDaemon.framework/CKDPRecordSaveRequest.h), [Apple `CKDPRecordSaveResponse`](https://raw.githubusercontent.com/nst/iOS-Runtime-Headers/master/PrivateFrameworks/CloudKitDaemon.framework/CKDPRecordSaveResponse.h), and [rustpush `cloudkit.proto`](https://github.com/OpenBubbles/rustpush/blob/master/cloudkit-proto/src/cloudkit.proto) | Header declarations; SSPL-1.0 local schema | Fact only | Not implemented. Wire numbers must come from a serialized fixture or another directly verified schema, never from guessing based on header property order. | +| 28 | The private error grammar includes request-already-processed, operation-lock, atomic-failure, stale-record-update, and record/zone protection-tag mismatch codes | [InflatableDonkey `cloud_kit.proto`](https://github.com/horrorho/InflatableDonkey/blob/master/src/main/resources/cloud_kit.proto) | MIT | Fact only | Existing rustpush classification covers only part of this set. Stage 4 needs fixture-backed typed outcomes before enabling writes. | +| 29 | `REQUEST_ALREADY_PROCESSED` without authoritative per-record results is not itself a commit receipt | Same private error grammar, compared with Apple's documented per-record modify results | MIT; Apple documentation | Conservative inference from verified facts | `CloudOutboxStatus.unknownOutcome` remains fail-closed. No replay or confirmation may be based on this error code alone. | +| 30 | Readback absence after an ambiguous delete does not prove that this operation deleted the record; another writer or a pre-existing absence can produce the same observation | Apple's optimistic-concurrency and per-record result model | Apple documentation | Conservative inference from verified facts | `reconcileUnknownOutcome` must remain unresolved unless a protected proof binds an authoritative operation result or stronger predecessor-version evidence. | +| 31 | Public CloudKit modify calls return one result per saved or deleted record, while atomic operations can fail the entire zone batch | [Apple `modifyRecords`](https://developer.apple.com/documentation/cloudkit/ckdatabase/modifyrecords(saving:deleting:savepolicy:atomically:)) | Apple documentation | Fact only | V2 must reject missing, duplicate, or unexpected private-operation results and may confirm only exact per-record successes. | +| 32 | A server-record-changed conflict supplies client, server, and ancestor records; a retry must merge onto the server record because it owns the current change tag | [Apple `serverRecordChanged`](https://developer.apple.com/documentation/cloudkit/ckerror/serverrecordchanged) | Apple documentation | Fact only | The private writer needs fixture-proven predecessor ETag/change-tag fields and a typed conflict result before writes can be enabled. | +| 33 | Database and record-zone change tokens are opaque, persistable, and not interchangeable; token expiry requires a scoped refetch rather than interpreting token contents | [Apple `CKFetchDatabaseChangesOperation`](https://developer.apple.com/documentation/cloudkit/ckfetchdatabasechangesoperation), [Apple `CKFetchRecordZoneChangesOperation`](https://developer.apple.com/documentation/cloudkit/ckfetchrecordzonechangesoperation) | Apple documentation | Fact only | Keep token bytes protected and stream-scoped. Expiry must preserve local rows, reset only the affected checkpoint, and restart that stream from no token. | +| 34 | CloudKit subscriptions are change hints, not complete change records, and notifications may be coalesced | [Apple `CKDatabaseSubscription`](https://developer.apple.com/documentation/cloudkit/ckdatabasesubscription), [Apple `CKRecordZoneSubscription`](https://developer.apple.com/documentation/cloudkit/ckrecordzonesubscription) | Apple documentation | Fact only | Poll/fetch remains authoritative. Subscription setup must be idempotent and cannot replace checkpointed page fetching. | + +## Sources deliberately not used + +| Project | Licence | Why excluded | +| --- | --- | --- | +| Signal Desktop | AGPL-3.0 | Incompatible with the Apache-2.0 layer; architecture comparison only | +| mautrix/imessage | AGPL-3.0 | Same, and it reads a local database rather than CloudKit | +| imessage-exporter | GPL-3.0 | Concepts only, as recorded in entry 14 | +| Apple Security / CKKS mirror | Apple Public Source-style, no licence metadata on the mirror | Concepts only; also predates Advanced Data Protection | +| Decompiled iOS restoration mirrors | No source-code licence | Protocol and orchestration facts only, as recorded in entries 21-25; no expression copied | +| InflatableDonkey | MIT | Permissively licensed and reusable, but scoped to iOS 9 backups with no Manatee zones or per-field encryption. Nothing taken so far. | + +## Maintenance + +Add an entry whenever a protocol fact or pattern is taken from an outside +project, in the same change that implements it. An entry naming no +OpenBubbles file is acceptable only when the fact prevented work, as in entries +4 and 9, and that should be stated in the row. diff --git a/docs/CLOUD_SYNC_V2_SEMANTIC_APPLIER.md b/docs/CLOUD_SYNC_V2_SEMANTIC_APPLIER.md new file mode 100644 index 0000000000..027b8dd2e3 --- /dev/null +++ b/docs/CLOUD_SYNC_V2_SEMANTIC_APPLIER.md @@ -0,0 +1,94 @@ +--- +type: design +title: Cloud Sync V2 Semantic Applier Boundary +description: Platform-neutral reconciliation contract and remaining adapters for guarded semantic pull. +resource: OpenBubbles Cloud Sync V2 +tags: + - openbubbles + - cloud-sync + - reconciliation +timestamp: 2026-08-01 +--- + +# Cloud Sync V2 Semantic Applier Boundary + +`TransactionalCloudInboxApplier` and +`ObjectBoxCloudSemanticStoreGateway` are dormant Phase 2 building blocks. +Neither has a production canonical adapter or runtime composition, and +`semanticApply` remains disabled. + +## Established boundary + +The native decoder must return a `CloudDecodedMutation` with two deliberately +separate lanes: + +- A typed `CloudSemanticEntityPayload` carries transient plaintext needed to + create or update the canonical Message, Chat, Attachment, Reaction, group + photo, or shared-profile row. Payload types have no JSON or Map conversion, + and their string representation is permanently redacted. +- A `CloudSemanticSnapshot` carries only account-scoped, content-free merge + metadata: digests, timestamps, protected raw-record references, and safe + logical-key hashes. + +The transient payload may exist in memory because the app must render the +decrypted entity. It must never be persisted in Cloud Sync replay, conflict, +quarantine, checkpoint, or diagnostic metadata. + +The local adapter must implement `CloudSemanticStoreGateway`. Its transaction +must atomically: + +1. Revalidate the active account, coordinator lease owner/generation/expiry, + checkpoint scope/generation, and exact pending inbox row. +2. Check a replay outcome bound to the change, server-record digest, payload + digest/protected-reference digest, generation, sequence, and change type. +3. Read and merge the content-free local semantic snapshot. +4. Apply the transient payload to the canonical entity, write the semantic + snapshot, and upsert the protected record map. +5. Commit exactly one replay outcome (`applied`, `appliedWithConflict`, or + `quarantined`) and the matching inbox terminal state. + +The transaction callback is synchronous by design. An adapter must not await +network, native decoding, or another isolate while an ObjectBox write +transaction is open. Per-Store reentrancy and transaction-lifetime guards reject +nested calls, discarded nested futures, microtask use, and use after return. + +Every durable semantic digest is either a 43-character unpadded base64url value +or a 64-character lowercase hexadecimal value. Scope components are bounded +and reject control characters and the storage-key delimiter. Unknown +adapter/ObjectBox exceptions are converted to a fixed redacted failure code. + +## Remaining native decoder adapter + +The Rust adapter still needs a reviewed decoder for each supported Apple record +type. It must: + +- decrypt only inside the existing native/keystore boundary; +- canonicalize logical keys, content, edit parts, group metadata, reactions, + and parent references into keyed hashes or digests; +- prove whether a tombstone is authoritative server state; +- preserve unknown fields through a protected raw-record reference; +- return typed malformed, PCS, authorization, and unsupported-record failures; +- clear plaintext buffers after decoding where practical; +- never send message bodies, handles, account identifiers, or keys to Dart + diagnostics or durable sync metadata. + +## Established ObjectBox metadata adapter + +The ObjectBox gateway now provides the fenced transaction, snapshot, protected +record-map, replay, and inbox-status metadata boundary. Tests cover lease +takeover/expiry, account switch, generation reset, exact inbox matching, +rollback, replay binding, record-map conflicts, strict digest privacy, +secret-bearing exceptions, nested/escaped transactions, process reopen, +parent-integrity checks, and stream/entity allowlists. + +The remaining production adapter must map the transient payload to the app's +existing canonical chat/message/reaction models rather than create a second +message database. The current fixture adapter exists only to prove transaction +behavior. + +Tombstones remain disabled in the durable gateway. Before enabling +`semanticApply`, add the production canonical adapter, reviewed native-to-Dart +binding, real canonical-model relation tests, cross-architecture reopen tests, +schema migration fixtures, reaction-parent arrival ordering, local-outbox +ordering, and authoritative deletion recovery. No adapter may reuse the Phase 1 +shadow inbox row itself as plaintext semantic storage. diff --git a/docs/DECISION_OBJECTBOX_DEPENDENCY.md b/docs/DECISION_OBJECTBOX_DEPENDENCY.md new file mode 100644 index 0000000000..d9c59043d0 --- /dev/null +++ b/docs/DECISION_OBJECTBOX_DEPENDENCY.md @@ -0,0 +1,102 @@ +--- +type: decision_record +title: ObjectBox Dependency Posture +description: What OpenBubbles actually depends on from ObjectBox, which licence covers which part, and the two conditions that would force this decision to be revisited. +resource: openbubbles-app +tags: [objectbox, licensing, dependencies, redistribution, decision] +timestamp: 2026-08-06 +--- + +# Decision: ObjectBox dependency posture + +## Status + +Accepted, with two named review triggers. Recorded now because Cloud Sync V2 is +about to make ObjectBox the durability boundary for reconciled message data, and +a storage engine is expensive to change once a schema is frozen. + +## What we actually depend on + +Verified in the tree on 2026-08-06 rather than assumed: + +| Component | Version | How it is used | +| --- | --- | --- | +| `objectbox` (Dart) | 5.3.2 | Official Dart binding, used throughout `lib/database` | +| `objectbox_flutter_libs` | 5.3.2 | Ships the native library into the app bundle | +| `objectbox_generator` | 5.3.2 | Build-time code generation | +| ObjectBox C native library | 5.3.2 | Loaded at runtime on Android and Windows | + +**There is no Rust dependency on ObjectBox.** `rust/Cargo.toml` and +`rustpush/Cargo.toml` do not reference it, and the only occurrences in +`rust/src` are comments describing the Dart-side transaction boundary that +native work must not cross. + +This matters because published commentary warns about the community Rust +binding `vaind/objectbox-rust`, which its owner archived on 2024-07-24. **That +warning does not apply here.** We use the official Dart binding, which is +maintained. Any future proposal to reach ObjectBox from Rust would be adopting +that archived-binding risk for the first time, and should be treated as a new +decision rather than an extension of this one. + +## The licence split + +The bindings are Apache-2.0. The **native library is proprietary** under the +ObjectBox Binary Licence, and ObjectBox's own FAQ describes the current terms as +temporary. So the app ships a proprietary binary inside an Apache-2.0 +application. + +This is not a new condition introduced by Cloud Sync V2. The app already +depends on ObjectBox for its entire local database. What Cloud Sync V2 changes +is the consequence of a future forced migration: reconciled CloudKit state, +checkpoints, journals, and quarantine records would all have to move with it. + +## Decision + +Continue with ObjectBox for Cloud Sync V2, for three reasons. + +**Its durability contract is the one this design needs.** ObjectBox commits +synchronously to physical storage and waits for filesystem confirmation, with +MVCC and serialised writers. The exactly-once local projection this engine +depends on requires writing the checkpoint and the projected rows in a single +durable transaction, and that is available today. + +**Switching now would be the more dangerous change.** The alternative is +migrating the app's whole local database, not just the sync tables, while the +CloudKit work is mid-flight and unvalidated against a live account. + +**The licence exposure is bounded and already present.** A proprietary runtime +library inside a distributed application is a redistribution question, and +redistribution is already blocked on a separate and larger licensing item: the +libmpv and FFmpeg transitive inventory for the Windows media stack. + +## Consequences + +- The pending redistribution review must cover the ObjectBox Binary Licence + explicitly, alongside libmpv and FFmpeg. It is currently unlisted. +- The repository has a `LICENSE` but no `NOTICE` or third-party notices file. + One is needed before public distribution, and ObjectBox belongs in it. +- Schema changes stay behind the freeze the Cloud Sync V2 documents already + require. A storage engine we cannot fork makes an unplanned migration more + expensive, not less. + +## Review triggers + +Revisit this decision if either occurs: + +1. **ObjectBox changes the binary licence terms** in a way that restricts + redistribution in a shipped application. Their FAQ already signals the + current terms are provisional. +2. **A proposal appears to access ObjectBox from Rust.** That would mean either + depending on an archived community binding or writing and owning an FFI + layer against a proprietary library, and neither is covered by this record. + +## What was considered and rejected + +**Moving the sync tables to SQLite while leaving the app on ObjectBox.** Two +storage engines with two durability models, and the single-transaction +checkpoint guarantee would have to span both. The guarantee is the point, so +splitting it is self-defeating. + +**Migrating the whole app now.** Correct only if the licence forced it, which it +does not yet. Doing it during unvalidated CloudKit work would confound two large +risks at once. diff --git a/docs/DEVELOPMENT.md b/docs/DEVELOPMENT.md index cb860ae2e7..642f0f14fd 100644 --- a/docs/DEVELOPMENT.md +++ b/docs/DEVELOPMENT.md @@ -27,8 +27,8 @@ configuration behaves identically. The current CI workflow is the source of truth for the tested build matrix: -- Flutter 3.24.0, stable channel -- Dart SDK supplied by that Flutter release +- Flutter 3.44.8, stable channel +- Dart 3.12 or newer, supplied by that Flutter release - Rust stable for the Rust bridge and RustPush components - Java 21 (Temurin in CI) - Android SDK and command-line tools @@ -85,6 +85,57 @@ with a store release and attribute every frame difference to application code. Generated files, signing keys, `.env` values, relay registration codes, and Apple credentials must not be committed. +### Rust bridge regeneration guard + +The currently pinned `flutter_rust_bridge_codegen` can emit six duplicate SSE +codec implementations after the Cloud Sync API types are added. The duplicate +bodies observed in this repository are byte-identical, but Rust correctly +rejects the duplicate trait implementations. + +After bridge regeneration, run the guarded postprocessor once and then verify +the result: + +```powershell +flutter_rust_bridge_codegen generate +.\tooling\frb\guard_generated_sse_impls.ps1 -Mode Deduplicate -ExpectedRemovalCount 6 +.\tooling\frb\guard_generated_sse_impls.ps1 -Mode Verify +``` + +The script refuses to write if the number changes, duplicate bodies differ, +the generated file changes concurrently, or any duplicate signature remains. +Treat any refusal as a code-generation change that requires review. Do not +increase the expected count merely to make generation pass. The long-term fix +is to update or correct the generator, then remove this narrow guard. + +## Windows x64 build notes + +When an x64 build runs on a Windows ARM64 host, use the Visual Studio x64 +generator and confirm every packaged PE has machine type `0x8664`. The +repository CMake configuration normalizes `CMAKE_SYSTEM_PROCESSOR` for this +case so ObjectBox selects its x64 binary. + +Long OpenSSL build paths can exceed compiler limits. `cargokit.cmake` accepts +`CARGOKIT_TARGET_TEMP_DIR_OVERRIDE` for an explicit short Cargo target +directory. Keep that cache outside the source tree and do not silently reuse +an artifact built for another architecture. + +The Windows install rule excludes the isolated debug-runtime cluster copied by +the media package and explicitly bundles the target-specific +`WebView2Loader.dll`. After packaging, require all of the following: + +1. every EXE and DLL reports x64 machine type; +2. no static import points to a missing redistributable DLL; +3. no debug C/C++ runtime is bundled or imported; +4. all Flutter tests pass with the release directory on `PATH`; +5. signing is applied only to the isolated release bundle, never to build + inputs. + +The local x64 verification currently also depends on an uncommitted +`desktop_webview_auth` package-cache patch that replaces ATL `CW2A` conversion +with `WideCharToMultiByte` and frees the WebView2 source buffer with +`CoTaskMemFree`. Move that change to a reviewable plugin fork and pin its +revision before claiming clean-machine reproducibility. + ## Change and review workflow 1. Start from a clean branch based on the intended upstream branch. diff --git a/docs/DIAGNOSTICS.md b/docs/DIAGNOSTICS.md index 179146afc5..0aadd42da8 100644 --- a/docs/DIAGNOSTICS.md +++ b/docs/DIAGNOSTICS.md @@ -49,6 +49,18 @@ An acknowledgement before persistence can create a loss window after a process restart. Any instrumentation should use a short redacted event ID and elapsed milliseconds, never message text or a secret. +On Android, a notification can arrive before Flutter finishes registering its +method-channel handler. The bounded startup handoff records only these redacted +state markers: + +- `engine_buffered`: the pointer is waiting for the UI engine to become ready; +- `engine_buffer_flush`: the ready UI engine accepted the buffered pointer; +- `headless_handoff`: a destroyed UI engine transferred the pointer once to + the existing headless worker. + +The raw native pointer must never be logged. Repeated `engine_buffered` entries +without a flush or handoff indicate a startup-readiness regression. + ### Duplicates or wrong app routing Check that only one SMS/MMS/RCS path is enabled. If both Google Messages and @@ -78,19 +90,77 @@ format. Validation errors should be surfaced as a bounded failure and retry, not a tight loop. Relay registration secrets belong in Keychain on iOS and must never appear in logs or shared preferences. +### Cloud message sync + +A message is synchronized only after the CloudKit API explicitly confirms the +write. A missing or false result remains pending and should be retried. A batch +that contains only retryable failures stops without spinning forever. + +When diagnosing a cross-device gap, distinguish: + +1. local database save; +2. cloud upload requested; +3. cloud write confirmed; +4. other device pull started; +5. pulled record saved locally. + +Do not treat an upload request or generated record ID as proof of cloud +persistence. Current sync is startup, periodic, or manual rather than a +continuous real-time replication channel. + ## Current audit themes -The recent field logs identified four recurring classes to keep covered by +The recent field logs identified five recurring classes to keep covered by tests and review: - notification avatar data can be incomplete; - CloudKit plist decoding can receive an unexpected byte-array shape; - reaction events can race message persistence; -- anisette/validation WebSockets can reset during provisioning. +- anisette/validation WebSockets can reset during provisioning; +- APS can lose DNS or a socket, reconnect, and then miss or mis-correlate a + rapid send acknowledgement. Keep DNS, TCP 5223-to-443 fallback, connection + budget, subscribe-before-send, and acknowledgement-ID tests together. These are not all necessarily present in every build. When a fix is proposed, include the before/after log counts and a focused test or reproduction. +### Redacted Pixel field evidence + +The pre-fix Pixel capture contained 406 warnings and 9 errors in the affected +archived log. The useful signals were: + +- contact matching emitted hundreds of per-candidate warnings that included + phone or email identifiers; +- relay reminder scheduling sometimes ran before timezone initialization; +- initial clique checks and scheduled password or CloudKit maintenance could + escape as unhandled asynchronous errors when the account was not in a + clique. + +The current implementation replaces candidate-level output with one redacted +debug summary, initializes timezone data inside the notification service +owner with a UTC fallback, and awaits or catches the initial and scheduled +maintenance futures. A failed clique check now records the service as not +ready instead of escaping through the Flutter zone. + +After the updated profile APK was installed over the existing package, the +bounded per-process `logcat` check contained no matching fatal, exception, +timeout, clique, APS, CloudKit, or WebSocket entry. The active on-device +developer log was still empty, so this is a startup smoke check, not an +endurance or delivery-pass claim. + +### Fullscreen video paging + +On mobile, video controls and the surrounding `PageView` can both claim a +horizontal drag. The fullscreen viewer now gives an active video one +navigation owner: a bounded raw-pointer swipe surface advances the parent +pager, while the bottom 88 logical pixels remain reserved for playback +controls. Inactive videos pause and do not retain their page unnecessarily. + +Keep the gesture unit tests and a physical-device check together. Test from +the middle of a playing video in both directions, then verify that seeking, +play/pause, and the bottom controls still work. Do not call the gesture fix +device-validated until that exact check passes. + ## Privacy and retention Keep raw captures in a local, access-controlled folder. Delete them when the diff --git a/docs/VERIFICATION.md b/docs/VERIFICATION.md index 55a3a96e81..bbfd358af7 100644 --- a/docs/VERIFICATION.md +++ b/docs/VERIFICATION.md @@ -19,22 +19,127 @@ Run the same commands locally from the repository root: ```bash flutter pub get -flutter test test/helpers/message_helper_test.dart -flutter analyze -flutter build apk --flavor alpha --profile --target-platform android-arm64 -flutter build apk --flavor alpha --debug --target-platform android-arm64 +flutter test --no-pub +flutter analyze --no-pub ``` -The focused helper test is the required CI test today. `flutter analyze` is an -additional local gate for source changes. Do not call a build verified when the -machine has a different Flutter or Java major version. +The repository still contains analyzer noise in vendored and example sources, +so review the changed Dart paths directly and require zero analyzer errors +there. Existing warnings or deprecations should be listed rather than hidden. + +On Windows, use the verified Android wrapper so a stale or incomplete APK +cannot be mistaken for a successful build: + +```powershell +.\tooling\android\build_verified_alpha.ps1 -Mode profile +.\tooling\android\build_verified_alpha.ps1 -Mode debug +.\tooling\android\build_verified_alpha.ps1 -Mode profile -SplitPerAbi +``` + +The wrapper removes the prior target artifact before building and verifies +that the APK contains nonempty ARM64 `libflutter.so`, `libapp.so`, and +`librust_lib_bluebubbles.so` entries. `-SplitPerAbi` additionally rejects any +native library outside `lib/arm64-v8a/`; use it for a Pixel-specific sideload +instead of carrying unused ARMv7 and x86 libraries. `-Mode release` is +supported only when `android/key.properties` supplies the release signing +configuration. The Android CI job also runs: + +```bash +cd android +./gradlew :app:testAlphaDebugUnitTest :app:compileAlphaDebugKotlin +``` + +Do not call a build verified when tests failed, the native-library inspection +was skipped, or the machine used a different Flutter or Java major version. ### Environment evidence from the Windows review host -On 2026-07-24 this host had `adb 37.0.0` and Java 8, but `flutter` and `dart` -were not on `PATH`. Therefore no Flutter test, analyzer, or APK build was -claimed locally. The expected next action is to install/use Flutter 3.24.0 and -Java 21, then run the commands above or rely on the GitHub workflow. +On 2026-07-31 this host verified the changed surfaces with Flutter 3.24.0, +Java 21, the local Android SDK, and Rust-backed APK packaging. Record the exact +test count, artifact byte size, SHA-256, and required native-library entries in +the review handoff. Device installation and live delivery behavior remain +separate gates. + +### Pixel profile installation record + +The ARM64-only Alpha profile artifact installed as an in-place update on the +Pixel test device. The installation retained the application package and data; +no uninstall or data clear was used. + +```text +version name: 1.15.0 +version code: 20004227 +artifact bytes: 194,911,911 +SHA-256: 518E6F0ADD5811170B13F57E222B7021060BE032A0EC5BC74C9B0F2428407539 +lib/arm64-v8a/libflutter.so: 15,402,480 bytes +lib/arm64-v8a/libapp.so: 39,388,064 bytes +lib/arm64-v8a/librust_lib_bluebubbles.so: 36,620,096 bytes +``` + +The post-install inspection found no native library outside `arm64-v8a`. +ObjectBox files, app-managed files, and existing logs remained present. The +app started without a native-library load failure or fatal startup exception. +That proves packaging, upgrade preservation, and startup only. It does not +replace foreground/background delivery, locked-phone endurance, battery, or +the explicit fullscreen-video gesture check. + +### Windows x64 release record + +The same source state produced a Windows x64 Release bundle on the ARM64 +review host. The portable bundle was isolated from the build tree before +signing and contains: + +```text +files: 167 +bundle bytes: 170,009,166 +PE files: 99 +PE machine type: 0x8664 (x64), 99 of 99 +Authenticode status: Valid, 99 of 99 +portable archive bytes: 66,633,911 +portable archive SHA-256: +00253D214A45F4AC78DD68A4AB2B73C6FC3719008AE6819796F50ABB894A84E4 +``` + +Static import inspection found no unresolved redistributable DLL. The eight +names not present as physical files are Windows API-set contracts. The bundle +includes the target-specific `WebView2Loader.dll`, the Rust library, ObjectBox, +Flutter, and media playback libraries. Debug-only C/C++ runtime DLLs were +excluded. + +All 152 Flutter tests passed with the x64 bundle on `PATH`. The changed Pixel +logging, fullscreen-video, and Cloud Sync surfaces also passed focused +analysis with no issue, and the generated-Rust guard reported zero duplicate +SSE implementation groups. + +The bundle is signed for local testing with a certificate trusted only in the +current user's certificate stores. That signature is not a public publisher +identity and should not be used for distribution. + +One clean-build dependency remains before an upstream Windows submission is +fully reproducible: `desktop_webview_auth` currently requires a small +Windows patch that removes its unnecessary ATL dependency, converts the +WebView URL with `WideCharToMultiByte`, and releases the COM-allocated source +buffer. The verified host used that patch in its package cache. Publish it in +a dedicated plugin fork or upstream plugin change, then pin the reviewed +revision in `pubspec.yaml`; do not present the application repository alone as +a clean-machine reproduction until that is done. + +### Windows ARM64 boundary + +The Windows ARM64 port has source parity for the transport, Cloud Sync, +diagnostic, fullscreen-media, and UI fixes. Its Flutter tests pass, focused +analysis has no errors, and a WSL ARM64 Rust check succeeds. A native Windows +ARM64 Release artifact is not yet validated because this host's Code Integrity +policy blocks an unsigned Rust proc-macro DLL during compilation. The locked +`media_kit_libs_windows_video` 1.0.11 package still selects an x86_64 libmpv +archive and an x64 ANGLE bundle. ObjectBox 5.3.2 publishes a Windows ARM64 +binary, and `printing` 5.15.0 derives its PDFium architecture from the Flutter +target and uses a release that publishes `pdfium-win-arm64`. Those two +dependencies are no longer known static blockers, but neither has been +validated inside a complete native ARM64 app bundle. WSL proves source +compatibility only; it does not produce a Windows executable. Keep the ARM64 +package experimental until the native build, PE architecture audit, dependency +audit, signing, launch, media playback, and sync tests all pass. ## Functional delivery matrix diff --git a/docs/WINDOWS_ARM64_NATIVE_MEDIA.md b/docs/WINDOWS_ARM64_NATIVE_MEDIA.md new file mode 100644 index 0000000000..47bc19ebed --- /dev/null +++ b/docs/WINDOWS_ARM64_NATIVE_MEDIA.md @@ -0,0 +1,232 @@ +--- +type: implementation-guide +title: Windows ARM64 Native Media Supply Chain +description: Auditable x64 and ARM64 libmpv and ANGLE build, verification, CI, and release gates. +resource: packages/media_kit_libs_windows_video +tags: + - windows + - arm64 + - media-kit + - supply-chain + - provenance +timestamp: 2026-08-02 +--- + +# Windows ARM64 native media supply chain + +## Current status + +The repo-local `media_kit_libs_windows_video` fork removes the remaining +architecture assumption from the native media package without accepting an +opaque ARM64 binary. + +The scaffold is integrated through a repo-local dependency override. The +existing x64 input remains pinned, and CMake now selects either x64 or ARM64 +explicitly and rejects every other architecture. Flutter's generated plugin +path installs the three runtime DLLs. The runner separately installs portable +provenance and the ANGLE license inventory under `data/native-media`. + +The installed evidence deliberately excludes resolver and cache paths. CMake +fails before compilation if any required portable manifest, notice, or ANGLE +license directory is missing. + +The package currently proves: + +* x64 and ARM64 are selected explicitly from the CMake generator; +* libmpv assets are pinned by URL, source-build metadata, and SHA-256; +* ANGLE is built from pinned official Google source with pinned depot_tools; +* each accepted DLL is present in its manifest, has the committed hash, and + has the expected PE machine; +* extra DLL or EXE files in the ANGLE bundle are rejected; +* generated ANGLE builds carry resolved source revisions, GN arguments, + tool versions, runtime hashes, and a license-file inventory; +* installed evidence carries runtime hashes, source pins, the libmpv archive + hash, the release gate, and sanitized ANGLE/license manifests without local + absolute paths; +* a missing, altered, or wrong-architecture input stops CMake configuration. + +No native binary or downloaded archive is committed. + +## Dependency flow + +```text +pinned Google ANGLE + pinned depot_tools + | + v + build_official_angle.ps1 + | + v +manifest + SHA-256 + PE machine + licenses + resolved revisions + | + v + prepare_native_media.ps1 <--- pinned SHA-256 libmpv archive + | + v + generated CMake paths + resolution record + | + v + Flutter Windows runner bundles three DLLs + libmpv-2.dll, libEGL.dll, libGLESv2.dll +``` + +Windows supplies the Direct3D compiler and Direct3D runtime. This fork does +not copy an untracked `d3dcompiler_47.dll` from an unrelated archive. + +## Reviewed source pins + +The machine-readable authority is +`packages/media_kit_libs_windows_video/provenance/native-dependencies.json`. + +| Input | Pin | +| --- | --- | +| ANGLE | `cd05752a5137b5f068c11a7a3561e7441a34df75` | +| depot_tools | `e154c8eda5e63cbe85a765ae9d06e2b7af05139e` | +| libmpv builder | `8ddbe5472465950b87853789f7173f2eedc5586a` | +| mpv | `0f7858451817c5fd5ebdb74a807a7c997662c390` | +| libmpv release | `20241021`, separate committed SHA-256 per architecture | + +A pin update is a supply-chain change. Review the source diff, licenses, +release assets, expected exports, and PE machines together. + +## Local verification + +Run the non-native tests on any Windows host: + +```powershell +pwsh -NoProfile -File ` + .\packages\media_kit_libs_windows_video\tool\test_native_media_scaffold.ps1 + +pwsh -NoProfile -File ` + .\tooling\windows\verify_native_media_integration.ps1 ` + -RequireEphemeralSymlink +``` + +The tests create synthetic PE fixtures in a unique temporary directory and +prove the rejection paths for bad hashes, wrong architecture, missing files, +unlisted executables, evidence tampering, and path traversal. They also parse +every PowerShell file and confirm no binary or archive was committed. + +Build ANGLE from official source: + +```powershell +pwsh -NoProfile -File ` + .\packages\media_kit_libs_windows_video\tool\build_official_angle.ps1 ` + -Architecture arm64 ` + -WorkRoot C:\Codex\OpenBubblesReview\build-cache\angle-arm64 ` + -OutputRoot ` + .\packages\media_kit_libs_windows_video\windows\native\arm64\angle +``` + +Resolve the pinned libmpv archive and verify the combined inputs: + +```powershell +pwsh -NoProfile -File ` + .\packages\media_kit_libs_windows_video\tool\prepare_native_media.ps1 ` + -Architecture arm64 ` + -AngleBundleRoot ` + .\packages\media_kit_libs_windows_video\windows\native\arm64\angle ` + -CacheRoot C:\Codex\OpenBubblesReview\build-cache\native-arm64 ` + -GeneratedCmakePath ` + C:\Codex\OpenBubblesReview\build-cache\native-arm64\native-media.cmake +``` + +Finally, run the DLL load and export smoke test on a native machine of the +same architecture: + +```powershell +pwsh -NoProfile -File ` + .\packages\media_kit_libs_windows_video\tool\runtime_smoke.ps1 ` + -ResolutionPath ` + C:\Codex\OpenBubblesReview\build-cache\native-arm64\native-media-resolution.json +``` + +An x64 process is not accepted as ARM64 runtime evidence, even when Windows +emulation can launch it. + +Build and verify the complete Flutter runner after the official ANGLE bundle +exists: + +```powershell +pwsh -NoProfile -File ` + .\tooling\windows\build_verified_native_media_runner.ps1 ` + -Architecture arm64 ` + -AngleBundleRoot ` + C:\Codex\OpenBubblesReview\build-cache\official-angle-arm64 ` + -FlutterRoot C:\path\to\native-arm64-flutter ` + -Configuration release +``` + +The wrapper verifies that the Flutter/Dart toolchain matches the target, +builds without cleaning or overwriting app data, inventories every bundled PE +file, checks the three media-runtime hashes against installed evidence, +loads libmpv through the target-architecture Dart process, checks the evidence +and license layout, and runs the full three-DLL smoke test when the host +architecture matches. + +The heavyweight source-build job in +`.github/workflows/windows-arm64-native-media.yml` is intentionally manual. It +builds official ANGLE and the complete runner on native x64 and ARM64 Windows +runners, rejects an emulated PowerShell process for the three-DLL load test, +and uploads only a short-lived, attested ANGLE engineering bundle. It does not +upload the application or libmpv while the redistribution gate is closed. +Ordinary pull requests still run the fast fail-closed scaffold and application +integration checks. + +## Application integration + +`pubspec.yaml` overrides `media_kit_libs_windows_video` to the local package, +while retaining the normal dependency declaration for upstream compatibility. +`pubspec.lock` must resolve version `1.0.11+openbubbles.1` from that relative +path. The integration verifier checks the pubspec, lockfile, Dart package +configuration, ephemeral Flutter symlink, generated plugin registration, +runner install rules, provenance gate, and absence of committed binaries. + +The same override serves x64 and ARM64. There is no separate ARM-only Dart +package and no fallback to an x64 DLL on ARM64. + +Before distributing a runner: + +1. Build or consume CI-attested ANGLE bundles from the reviewed source pins. +2. Build both Windows runners with the matching native Flutter toolchain. +3. Confirm the runner PE machine and every bundled native DLL. +4. Confirm `data/native-media` contains the portable evidence, dependency + manifest, third-party notice, libmpv extraction manifest, sanitized ANGLE + manifest, and complete ANGLE license tree. +5. Run native DLL load/export smoke tests. +6. Exercise photo, audio, and video playback, seeking, full-screen navigation, + attachment download, suspend/resume, and relaunch on both architectures. +7. Compare startup, first-frame latency, seek latency, memory, handles, and + crash-free playback against the existing x64 release. + +## Release gates + +The following are still required before calling this production-ready: + +- [ ] Official ANGLE x64 source build passes on a native x64 CI runner. +- [ ] Official ANGLE ARM64 cross-build and load test pass on a native Windows + ARM64 CI runner. +- [ ] Flutter x64 and ARM64 runners compile and package the local fork. +- [ ] Playback and endurance testing pass on both architectures. +- [ ] Exact libmpv, FFmpeg, and linked-library source and license inventory is + complete. +- [ ] Installer notices, LGPL source/relinkability obligations, and source + offers are reviewed. +- [ ] Generated artifacts retain hashes, manifests, license inventory, and + build provenance attestation. + +The libmpv release metadata requests non-GPL builds, but flags alone do not +prove the final linked binary is redistributable under the intended terms. +Both reviewed archives contain eight entries and no license, notice, source +revision, or relinkability inventory. The pinned builder recipe also leaves +some transitive inputs on floating default branches or `main`, so the exact +linked source set cannot be reconstructed from the builder commit. +Public installer redistribution therefore remains blocked until the +transitive inventory is complete. Local engineering validation is not a +release approval. + +## Failure handling + +Do not delete or silently replace a cached file after a hash mismatch. Keep +the failed artifact for diagnosis, use a new clean cache path, and identify +whether the source pin, release asset, or local transport changed. Never fix a +failure by weakening a hash, PE, manifest, or source-origin check. diff --git a/docs/WINDOWS_HOST_BUILD_ENVIRONMENT.md b/docs/WINDOWS_HOST_BUILD_ENVIRONMENT.md new file mode 100644 index 0000000000..3410e80f04 --- /dev/null +++ b/docs/WINDOWS_HOST_BUILD_ENVIRONMENT.md @@ -0,0 +1,245 @@ +--- +type: build_runbook +title: OpenBubbles Windows ARM64 Host Build Environment +description: Verified toolchain layout and the non-obvious constraints for building the Rust bridge and running the test suites for Android, Windows ARM64, and Windows x64 from one Windows-on-ARM host. +resource: openbubbles-app +tags: [windows, arm64, x64, android, rust, objectbox, openssl, toolchain, testing] +timestamp: 2026-08-06 +--- + +# OpenBubbles Windows ARM64 host build environment + +## Decision + +Drive all three architecture targets from one Windows-on-ARM host. Nothing here +changes shipped code; it records the host constraints that otherwise present as +unrelated failures (60+ Dart test errors, a missing proc-macro crate, an +OpenSSL Makefile that never appears). + +Every item below was verified on this host on 2026-08-06. Where a constraint is +a host-policy interaction rather than a repository problem, that is stated. + +## Toolchain layout + +| Component | Path | Notes | +| --- | --- | --- | +| Flutter ARM64 | `C:\Codex\Toolchains\flutter-3.44.8-arm64` | Native host; Dart 3.12.2 | +| Flutter x64 | `C:\Codex\Toolchains\flutter-3.44.8` | Runs emulated | +| Cargo/rustup | `C:\Codex\Toolchains\cargo`, `C:\Codex\Toolchains\rustup` | Set `CARGO_HOME` and `RUSTUP_HOME` | +| MSVC | Visual Studio Build Tools 2022 17.14, MSVC 14.44.35207 | `Hostarm64` tools present | +| clang | `C:\Codex\Toolchains\LLVM-22.1.8-woa64-portable\bin` | Required by `ring`; see below | +| Android SDK/NDK | `C:\Codex\Toolchains\AndroidSdk`, NDK `26.1.10909125` | Host prebuilt is `windows-x86_64` | +| GNU make | `C:\Codex\Toolchains\android-build-bin\make.exe` | Needs Strawberry's mingw runtime DLLs on PATH | +| Perl modules | `C:\Codex\Toolchains\git-perl-extra` | Point `PERL5LIB` here | +| ObjectBox ARM64 | `C:\Codex\Toolchains\objectbox-windows-arm64-v5.3.2\lib` | Matches the pinned 5.3.2 | + +Installed Rust targets: `aarch64-pc-windows-msvc`, `x86_64-pc-windows-msvc`, +`aarch64-linux-android`. + +## Constraint: the Dart test host needs an architecture- and version-matched ObjectBox + +`pubspec.yaml` pins the `objectbox` trio to 5.3.2. The Dart test host loads +`objectbox.dll` from `PATH`, so that library must match both the pinned version +and the architecture of the Flutter SDK's own `dart.exe`. + +A stale 4.0.2 `objectbox.dll` still sits in this repository's +`build\windows\x64\runner\Release`. Selecting it fails 63 Cloud Sync tests with +`LateInitializationError: Local 'objectBox' has not been initialized`, which +names neither the version nor the library. `tooling\cloud_sync\verify_foundation.ps1` +now derives the host architecture from `dart.exe`, reads the pinned version from +`pubspec.yaml`, inspects each candidate library's PE machine type and embedded +version banner, and refuses to run on a mismatch. + +Verified libraries: + +- ARM64 host: `C:\Codex\Toolchains\objectbox-windows-arm64-v5.3.2\lib` +- x64 host: `..\cloudsync_objectbox5_sandbox\build\windows\x64\runner\Release` + +## Constraint: `ring` needs clang for the ARM64 MSVC target + +`ring` 0.17.8 assembles GNU-syntax `.S` sources for +`aarch64-pc-windows-msvc`. `cl.exe` cannot consume them, so `clang` must be +reachable or the build fails with `failed to find tool "clang"`. Put the +portable LLVM `bin` directory after the MSVC directories so `cl`, `link`, and +`lib` still resolve to Visual Studio. + +Remove `CC`, `CXX`, `AR`, `LD`, `RANLIB`, `CFLAGS`, and `CXXFLAGS` before +building an MSVC target. The `cc` crate honours them ahead of `cl.exe`, and a +stale GNU value either fails compiler detection or produces the wrong machine +type. Drop Strawberry's `c\bin` from `PATH` for the same reason, but keep +`C:\Strawberry\perl\bin` because the OpenSSL build needs perl. + +## Constraint: `ring` 0.16.20 cannot target ARM64 and was reachable only through a dead dependency + +`icloud_auth` declared `rustls = "0.20.7"` and `rustls-pemfile = "1.0.1"` while +using neither; its `reqwest` uses `default-tls`, and `rustpush` itself uses +rustls 0.23.38. Those two unused declarations pulled `rustls` 0.20.9 and with it +`ring` 0.16.20, which predates ARM64 Windows support and fails in `build.rs`. + +Removing them drops `ring` 0.16.20, `rustls` 0.20.9, `spin` 0.5.2, +`untrusted` 0.7.1, and `webpki` 0.22.4 and changes no other resolved package. +This edit lands in the `rustpush` submodule. + +## Constraint: vendored OpenSSL for Android needs a Unix-path perl, GNU make, and forward-slash compiler paths + +`openssl` is a vendored dependency, so the Android build compiles OpenSSL from +source. Three separate host requirements follow, each of which fails with a +different and unrelated-looking message: + +1. **Configure needs Unix-style paths.** Strawberry's MSWin32 perl reports + `This perl implementation doesn't produce Unix like paths` and no Makefile + appears. Git's msys perl (`C:\Program Files\Git\usr\bin\perl.exe`) must win + the `perl` lookup. +2. **Configure needs modules Git's minimal perl omits.** Point `PERL5LIB` at + `C:\Codex\Toolchains\git-perl-extra`. `tooling\android\build_verified_alpha.ps1` + converts that to a `//localhost/C$/...` UNC path first, because OpenSSL runs + perl through a POSIX shell where the drive-letter colon would otherwise be + read as a `PERL5LIB` separator. +3. **The generated Makefile routes `CC` through msys `sh`, which eats + backslashes.** A Windows-style compiler path arrives as + `C:CodexToolchains...clang.exe: command not found`. Set + `CC_aarch64_linux_android`, `AR_aarch64_linux_android`, and + `RANLIB_aarch64_linux_android` with forward slashes. Configure already + supplies `--target=aarch64-linux-android24`, so plain `clang.exe` is + correct; the `.cmd` wrapper is still right for the Cargo linker. + +`make` must also be on `PATH`, and `android-build-bin\make.exe` links +`libintl-8.dll` from Strawberry's `c\bin`. Removing Strawberry entirely to force +msys perl makes `make` fail with `0xc0000135` (DLL not found). Order `PATH` so +Git's `usr\bin` precedes Strawberry rather than removing Strawberry. + +## Host policy: Smart App Control blocks `cargo test` on the main crate + +This host runs Smart App Control in enforcement mode +(`HKLM:\SYSTEM\CurrentControlSet\Control\CI\Policy` → +`VerifiedAndReputablePolicyState = 1`). It intermittently blocks freshly built, +unsigned binaries with `An Application Control policy has blocked this file. +(os error 4551)`. + +This affects `cargo test` on `rust_lib_bluebubbles`, which builds +dev-dependencies and their proc-macro DLLs. A blocked proc-macro surfaces as the +misleading `error[E0463]: can't find crate for 'rinja_derive'` even though that +crate compiles and its DLL exists. Retrying gets different binaries through, so +the failure moves rather than clearing. + +What this does and does not block: + +- **Not affected:** `cargo build --release`, which needs no dev-dependencies. + All three release libraries build cleanly. +- **Not affected:** the standalone `cloud_sync_protector_harness`, whose 39 + tests run on ARM64. +- **Affected:** `cargo test` on the main crate. + +Do not disable Smart App Control to work around this; on Windows 11 it cannot be +re-enabled without reinstalling. Run the main crate's Rust tests on a host or CI +runner without the policy. This is the open item that the live-validation +document records as "run the x64 harness without triggering Windows Application +Control". + +## Defect: CargoKit silently skipped the entire Rust build on Flutter 3.44.8 + +`rust_builder/cargokit/gradle/plugin.gradle` located Flutter's Gradle plugin by +comparing the fully qualified class name to `"FlutterPlugin"`. That matched while +Flutter's plugin was Groovy in the default package. Flutter 3.44.8 ships the +Kotlin rewrite as `com.flutter.gradle.FlutterPlugin`, so the comparison failed +and CargoKit printed `Flutter plugin not found, CargoKit plugin will not be +applied.` and returned. + +The consequence is silent and serious: the Android build completes and reports +success while packaging no `librust_lib_bluebubbles.so` at all. A split ARM64 +profile APK built before the fix contained `libflutter.so` and `libapp.so` but +no Rust bridge; `tooling\android\build_verified_alpha.ps1` is what caught it. +Its ABI assertion is the only thing standing between this failure mode and a +package that installs and then cannot work. + +The fix accepts either the bare class name or any package-qualified +`.FlutterPlugin`. After it, the skip message no longer appears under +`flutter build`. Note that invoking a CargoKit Gradle task directly, rather than +through `flutter build`, legitimately prints the same message because the +Flutter plugin is not applied in that invocation; that is not a regression and +is not a valid way to test this. + +`build_verified_alpha.ps1` also required `lib/arm64-v8a/libapp.so` for every +mode even though a debug package carries interpreted Dart in its asset bundle +instead. It now requires that entry only for profile and release. + +### Host limit: memory, not correctness + +Re-verifying a packaged APK after the CargoKit fix did not complete on this +host. With the fix in place Gradle additionally drives the Android cargo build, +including compiling OpenSSL from source in CargoKit's own target directory. This +machine has 15.6 GB of RAM, `android/gradle.properties` requests +`-Xmx6400M`, and with a browser and editor resident the daemon settles at +roughly 2.6 GB while free memory falls to about 1.4 GB. It then burns CPU +without writing build output, which is memory thrash rather than progress. + +Before rerunning, free memory first and stop stale daemons +(`android\gradlew.bat --stop`), or lower `org.gradle.jvmargs`, or build on a +larger machine or CI runner: + +```powershell +pwsh -NoProfile -File .\tooling\android\build_verified_alpha.ps1 -Mode profile -SplitPerAbi ` + -AndroidSdkRoot C:\Codex\Toolchains\AndroidSdk ` + -CargoHome C:\Codex\Toolchains\cargo -RustupHome C:\Codex\Toolchains\rustup ` + -ProtocPath C:\Codex\Toolchains\protoc-35.1-win64\bin\protoc.exe ` + -PerlExecutable "C:\Program Files\Git\usr\bin\perl.exe" ` + -PerlModuleRoot C:\Codex\Toolchains\git-perl-extra ` + -MakeExecutable C:\Codex\Toolchains\android-build-bin\make.exe +``` + +## Verified state on 2026-08-06 + +| Check | Result | +| --- | --- | +| Dart suite, ARM64 host | 388 tests pass | +| Cloud Sync Dart suite, x64 host | 294 tests pass | +| Cloud Sync focused analyzer | clean | +| `cloud_sync_protector_harness`, ARM64 | 39 tests pass | +| Kotlin unit tests, Alpha variant | 12 tests pass | +| `cargo check --locked --all-targets`, ARM64 | clean | +| Release library, `aarch64-pc-windows-msvc` | PE ARM64 | +| Release library, `x86_64-pc-windows-msvc` | PE x64 | +| Release library, `aarch64-linux-android` | ELF64 AArch64 | +| `cargo test`, main crate | blocked by host policy above | + +No live CloudKit access, account mutation, or message send was performed. + +## Deliberate gate: the Windows desktop build needs an ANGLE bundle built from source + +`flutter build windows` fails at CMake configure on this host: + +```text +Cannot find path '...\media_kit_libs_windows_video\windows\native\arm64\angle' +because it does not exist. +``` + +This is the repo-local `media_kit_libs_windows_video` fork failing closed on +purpose. Its README states that both architectures fail closed unless an ANGLE +bundle built from pinned official Google ANGLE source is present and passes its +manifest, SHA-256, PE-machine, provenance, and license-inventory checks, and +that the package never accepts the unlicensed third-party ARM64 ANGLE bundle. + +`..\scratch\arm64-media-provenance` holds bare `angle-x64.7z`, +`libmpv-arm64.7z`, and `libmpv-x64.7z` with no manifest, license inventory, or +attestation beside them. **Do not stage those to satisfy the gate.** Produce a +bundle instead: + +```powershell +pwsh -NoProfile -File .\packages\media_kit_libs_windows_video\tool\build_official_angle.ps1 -Architecture arm64 -WorkRoot C:\Codex\OpenBubblesReview\build-cache\official-angle-arm64 -OutputRoot .\packages\media_kit_libs_windows_video\windows\native\arm64\angle +``` + +That fetches pinned depot_tools and ANGLE source and runs a Chromium-scale +build, so treat it as a maintainer or CI step. Note also that +`provenance/native-dependencies.json` records libmpv redistribution as +`blocked_pending_transitive_license_inventory`, so this gate is not the only +thing standing between the current tree and a public Windows release. + +This gate is unrelated to Cloud Sync. The CloudKit-relevant Windows artifact, +the Rust bridge, builds and verifies for both architectures. + +## Not covered here + +Android release signing needs a keystore and `android/key.properties`, neither +of which is present. The `alpha`, `beta`, and `prod` flavours use +`signingConfigs.release`, so only debug-signed packages can be produced on this +host. diff --git a/docs/index.md b/docs/index.md new file mode 100644 index 0000000000..238ed63822 --- /dev/null +++ b/docs/index.md @@ -0,0 +1,53 @@ +--- +type: index +title: OpenBubbles Engineering Documents +description: Progressive index for local technical designs, diagnostics, and verification plans. +resource: openbubbles-app +tags: [openbubbles, engineering, documentation] +timestamp: 2026-07-31 +--- + +# OpenBubbles engineering documents + +- [Development](DEVELOPMENT.md): local development and build guidance. +- [Diagnostics](DIAGNOSTICS.md): bounded, redacted runtime logging. +- [Verification](VERIFICATION.md): delivery, routing, and performance gates. +- [Memory management](MEMORY_MANAGEMENT.md): bounded media and conversation + resource ownership. +- [Cloud Sync V2](CLOUD_SYNC_V2.md): guarded Pixel Android and Windows + ARM64/x64 reconciliation architecture and rollout. +- [Cloud Sync V2 live validation](CLOUD_SYNC_V2_LIVE_VALIDATION.md): + two-account test topology, safety gates, evidence, and stop conditions. +- [Cloud Sync V2 open-source pattern review](CLOUD_SYNC_V2_OPEN_SOURCE_REVIEW.md): + license-aware queue, checkpoint, recovery, and media patterns worth + reimplementing. +- [Cloud Sync V2 production-readiness research](CLOUD_SYNC_V2_PRODUCTION_READINESS_RESEARCH.md): + current platform evidence, upstream risks, bounded operating budgets, and + cross-platform release gates. +- [Cloud Sync V2 developer shadow sampler](CLOUD_SYNC_V2_MANUAL_SAMPLER.md): + exact fail-closed composition, tripwires, report contract, and tests for the + first live entry point. +- [Cloud Sync V2 semantic applier](CLOUD_SYNC_V2_SEMANTIC_APPLIER.md): + content-free decoder contract, transactional reconciliation boundary, and + remaining native and ObjectBox adapters. +- [Cloud Sync V2 canonical mapping](CLOUD_SYNC_V2_CANONICAL_MAPPING.md): Apple + record field mapping, presence rules, parsing grammars, and fixture matrix. +- [Cloud Sync V2 Android scheduling](CLOUD_SYNC_V2_ANDROID_SCHEDULING.md): + dormant WorkManager wake policy and its activation gates. +- [Cloud Sync V2 native protected fetch](CLOUD_SYNC_V2_NATIVE_PROTECTED_FETCH.md): + narrow protected-page bridge, adoption leases, and bounded collection. +- [Cloud Sync V2 path to production](CLOUD_SYNC_V2_PATH_TO_PRODUCTION.md): + dependency-ordered remaining sequence, separating code work from work that + needs live Apple access, hardware, or a licensing decision. +- [Cloud Sync V2 field ownership](CLOUD_SYNC_V2_FIELD_OWNERSHIP.md): which + fields the server owns, which the device owns, and the merge rule each class + carries. +- [Cloud Sync V2 provenance ledger](CLOUD_SYNC_V2_PROVENANCE_LEDGER.md): + per-idea record of borrowed protocol facts and patterns, their source licence, + and the file implementing each one. +- [Decision: ObjectBox dependency posture](DECISION_OBJECTBOX_DEPENDENCY.md): + what is actually depended on, which licence covers which part, and the + triggers that would reopen the choice. +- [Windows host build environment](WINDOWS_HOST_BUILD_ENVIRONMENT.md): verified + Windows-on-ARM toolchain layout and the host constraints for building the + Rust bridge and running the suites for all three targets. diff --git a/lib/app/components/custom_text_editing_controllers.dart b/lib/app/components/custom_text_editing_controllers.dart index 30934ea600..582493bd2a 100644 --- a/lib/app/components/custom_text_editing_controllers.dart +++ b/lib/app/components/custom_text_editing_controllers.dart @@ -17,7 +17,6 @@ import "package:languagetool_textfield/core/enums/mistake_type.dart"; import 'package:languagetool_textfield/languagetool_textfield.dart'; import "package:languagetool_textfield/utils/closed_range.dart"; import "package:languagetool_textfield/utils/keep_latest_response_service.dart"; -import 'package:tuple/tuple.dart'; import 'package:bluebubbles/utils/logger/logger.dart'; class Mentionable { @@ -41,6 +40,70 @@ class Mentionable { String toString() => displayName; } +/// Repairs the annotation partition after keyboards or IMEs report an editing +/// delta that does not line up exactly with the previous selection. +/// +/// Composer annotations are expected to cover the text once, without gaps or +/// overlaps. Preserve valid formatting, clip overlaps, and fill uncovered text +/// with a plain annotation. +void normalizeComposerAnnotationCoverage( + List annotations, int textLength) { + if (textLength <= 0) { + annotations.clear(); + return; + } + + final candidates = annotations.where((annotation) { + if (annotation.range.length < 2) return false; + final start = annotation.range[0].clamp(0, textLength); + final end = annotation.range[1].clamp(0, textLength); + annotation.range = [start, end]; + return end > start; + }).toList() + ..sort((a, b) { + final startComparison = a.range[0].compareTo(b.range[0]); + return startComparison != 0 + ? startComparison + : a.range[1].compareTo(b.range[1]); + }); + + final repaired = []; + var pointer = 0; + + void append(Annotation annotation) { + final last = repaired.lastOrNull; + if (last != null && + last.range[1] == annotation.range[0] && + last.eqUnranged(annotation)) { + last.range[1] = annotation.range[1]; + } else { + repaired.add(annotation); + } + } + + for (final annotation in candidates) { + final end = annotation.range[1]; + if (end <= pointer) continue; + + final start = max(pointer, annotation.range[0]); + if (start > pointer) { + append(Annotation(range: [pointer, start])); + } + + annotation.range = [start, end]; + append(annotation); + pointer = end; + } + + if (pointer < textLength) { + append(Annotation(range: [pointer, textLength])); + } + + annotations + ..clear() + ..addAll(repaired); +} + class SpellCheckTextEditingController extends TextEditingController { SpellCheckTextEditingController({super.text, this.focusNode}) { assert(focusNode != null || !(kIsDesktop || kIsWeb)); @@ -442,14 +505,13 @@ class MentionTextEditingController extends SpellCheckTextEditingController { @override void notifyListeners() { super.notifyListeners(); - Logger.info("a $lastText $text"); if (lastText != text) { // something changed, compute deltas // use text diff because some keyboards can bump the cursor forward into an existing space when typing a period during an autocorrect. int caret = min(selection.baseOffset, selection.extentOffset) - min(oldTextFieldSelection.baseOffset, oldTextFieldSelection.extentOffset); var textdiff = text.length - lastText.length; if (caret != textdiff) { - Logger.info("Caret diff $caret $textdiff"); + Logger.debug("Caret diff $caret $textdiff"); } try { mutateRange(oldTextFieldSelection, oldTextFieldSelection.isCollapsed ? textdiff : caret); @@ -509,30 +571,7 @@ class MentionTextEditingController extends SpellCheckTextEditingController { bool changeLock = false; void validateRange() { - annotations.sort((a, b) => a.range[0].compareTo(b.range[0])); - if (text.isEmpty) { - assert(annotations.isEmpty); - } - Annotation? lastAnnotation; - var pointer = 0; - while (pointer < text.length) { - var annotation = annotations.firstWhere((a) => a.range[0] == pointer); - // do we overlap with any other annotation? - assert(!annotations.any((a) => ((a.range[0] >= annotation.range[0] && a.range[0] < annotation.range[1]) || - (a.range[1] > annotation.range[0] && a.range[1] <= annotation.range[1])) && annotation != a)); - // we cannot have zero length - assert(annotation.range[0] != annotation.range[1]); - pointer = annotation.range[1]; - - if (lastAnnotation?.eqUnranged(annotation) ?? false) { - lastAnnotation!.range[1] = annotation.range[1]; // merge equal annotations - annotations.remove(annotation); - } else { - lastAnnotation = annotation; - } - } - assert(pointer == text.length); - assert(lastAnnotation == annotations.lastOrNull); + normalizeComposerAnnotationCoverage(annotations, text.length); } List annotationsForRange(TextSelection range) { @@ -545,7 +584,6 @@ class MentionTextEditingController extends SpellCheckTextEditingController { } void mutateRange(TextSelection collapse, int length, { Annotation? newAnnotation }) { - Logger.info("annotations ${annotations.map((a) => a.toMap()).toList()}"); // base < offset if (collapse.baseOffset > collapse.extentOffset) { collapse = TextSelection(baseOffset: collapse.extentOffset, extentOffset: collapse.baseOffset); diff --git a/lib/app/layouts/conversation_details/conversation_details.dart b/lib/app/layouts/conversation_details/conversation_details.dart index c92ae8ca9d..824849748c 100644 --- a/lib/app/layouts/conversation_details/conversation_details.dart +++ b/lib/app/layouts/conversation_details/conversation_details.dart @@ -44,12 +44,13 @@ class _ConversationDetailsState extends OptimizedState with bool showMoreParticipants = false; late Chat chat = widget.chat; late StreamSubscription sub; + late final ConversationMediaPager mediaPager; + bool _attachmentsLoaded = false; + bool _fetchingAttachments = false; final RxList selected = [].obs; bool get shouldShowMore => chat.participants.length > 5; - List get clippedParticipants => showMoreParticipants - ? chat.participants - : chat.participants.take(5).toList(); + List get clippedParticipants => showMoreParticipants ? chat.participants : chat.participants.take(5).toList(); List ftSupportedParticipants = []; @@ -60,11 +61,13 @@ class _ConversationDetailsState extends OptimizedState with cm.setActiveToDead(); cvc(widget.chat).showingOverlays = true; + mediaPager = ConversationMediaPager(chat: chat)..addListener(_onMediaChanged); (() async { var data = await chat.getConversationData(); - ftSupportedParticipants = await api.validateTargetsFacetime(state: pushService.state!.client, targets: data.participants, sender: await chat.ensureHandle()); - setState(() { }); + ftSupportedParticipants = await api.validateTargetsFacetime( + state: pushService.state!.client, targets: data.participants, sender: await chat.ensureHandle()); + setState(() {}); })(); if (!kIsWeb) { @@ -102,6 +105,9 @@ class _ConversationDetailsState extends OptimizedState with @override void dispose() { sub.cancel(); + mediaPager + ..removeListener(_onMediaChanged) + ..dispose(); cvc(widget.chat).showingOverlays = false; if (cm.activeChat != null) { cm.setActiveToAlive(); @@ -110,39 +116,55 @@ class _ConversationDetailsState extends OptimizedState with super.dispose(); } - void fetchAttachments() { - if (kIsWeb) return; - chat.getAttachmentsAsync().then((value) { - final _media = value.where((e) => !(e.message.target?.isGroupEvent ?? true) - && !(e.message.target?.isInteractive ?? true) - && (e.mimeStart == "image" || e.mimeStart == "video")).take(24); - final _docs = value.where((e) => !(e.message.target?.isGroupEvent ?? true) - && !(e.message.target?.isInteractive ?? true) - && e.mimeStart != "image" && e.mimeStart != "video" && !(e.mimeType ?? "").contains("location")).take(24); - final _locations = value.where((e) => (e.mimeType ?? "").contains("location")).take(10); - for (Attachment a in _media) { - a.message.target?.handle = chat.participants.firstWhereOrNull((e) => e.originalROWID == a.message.target?.handleId); - } - for (Attachment a in _docs) { - a.message.target?.handle = chat.participants.firstWhereOrNull((e) => e.originalROWID == a.message.target?.handleId); + void _onMediaChanged() { + if (!mounted) return; + final updated = mediaPager.items; + for (final attachment in updated) { + _attachHandle(attachment); + } + setState(() => media = updated); + } + + void _attachHandle(Attachment attachment) { + attachment.message.target?.handle = chat.participants.firstWhereOrNull( + (handle) => handle.originalROWID == attachment.message.target?.handleId, + ); + } + + Future fetchAttachments() async { + if (kIsWeb || _fetchingAttachments) return; + _fetchingAttachments = true; + try { + final overviewFuture = chat.getAttachmentOverviewAsync(); + if (_attachmentsLoaded) { + await mediaPager.refreshNewer(); + } else { + await mediaPager.loadInitial(); } - for (Attachment a in _locations) { - a.message.target?.handle = chat.participants.firstWhereOrNull((e) => e.originalROWID == a.message.target?.handleId); + final overview = await overviewFuture; + for (final attachment in [ + ...overview.documents, + ...overview.locations, + ]) { + _attachHandle(attachment); } + if (!mounted) return; setState(() { - media = _media.toList(); - docs = _docs.toList(); - locations = _locations.toList(); + docs = overview.documents; + locations = overview.locations; + _attachmentsLoaded = true; }); - }); + } finally { + _fetchingAttachments = false; + } } void fetchLinks() { - final query = (Database.messages.query(Message_.dateDeleted.isNull() - & Message_.dbPayloadData.notNull() - & Message_.balloonBundleId.contains("URLBalloonProvider")) - ..link(Message_.chat, Chat_.id.equals(chat.id!)) - ..order(Message_.dateCreated, flags: Order.descending)) + final query = (Database.messages.query(Message_.dateDeleted.isNull() & + Message_.dbPayloadData.notNull() & + Message_.balloonBundleId.contains("URLBalloonProvider")) + ..link(Message_.chat, Chat_.id.equals(chat.id!)) + ..order(Message_.dateCreated, flags: Order.descending)) .build(); query.limit = 20; links = query.find(); @@ -153,186 +175,180 @@ class _ConversationDetailsState extends OptimizedState with Widget build(BuildContext context) { return AnnotatedRegion( value: SystemUiOverlayStyle( - systemNavigationBarColor: ss.settings.immersiveMode.value ? Colors.transparent : context.theme.colorScheme.background, // navigation bar color + systemNavigationBarColor: ss.settings.immersiveMode.value + ? Colors.transparent + : context.theme.colorScheme.background, // navigation bar color systemNavigationBarIconBrightness: context.theme.colorScheme.brightness.opposite, statusBarColor: Colors.transparent, // status bar color statusBarIconBrightness: context.theme.colorScheme.brightness.opposite, ), child: Theme( - data: context.theme.copyWith( - // in case some components still use legacy theming - primaryColor: context.theme.colorScheme.bubble(context, chat.isIMessage), - colorScheme: context.theme.colorScheme.copyWith( - primary: context.theme.colorScheme.bubble(context, chat.isIMessage), - onPrimary: context.theme.colorScheme.onBubble(context, chat.isIMessage), - surface: ss.settings.monetTheming.value == Monet.full - ? null - : (context.theme.extensions[BubbleColors] as BubbleColors?)?.receivedBubbleColor, - onSurface: ss.settings.monetTheming.value == Monet.full - ? null - : (context.theme.extensions[BubbleColors] as BubbleColors?)?.onReceivedBubbleColor, + data: context.theme.copyWith( + // in case some components still use legacy theming + primaryColor: context.theme.colorScheme.bubble(context, chat.isIMessage), + colorScheme: context.theme.colorScheme.copyWith( + primary: context.theme.colorScheme.bubble(context, chat.isIMessage), + onPrimary: context.theme.colorScheme.onBubble(context, chat.isIMessage), + surface: ss.settings.monetTheming.value == Monet.full + ? null + : (context.theme.extensions[BubbleColors] as BubbleColors?)?.receivedBubbleColor, + onSurface: ss.settings.monetTheming.value == Monet.full + ? null + : (context.theme.extensions[BubbleColors] as BubbleColors?)?.onReceivedBubbleColor, + ), ), - ), - child: Obx(() { - var actions = [ - Obx(() { - if (selected.isNotEmpty) { - return IconButton( - icon: Icon(iOS ? CupertinoIcons.xmark : Icons.close, color: context.theme.colorScheme.onBackground), - onPressed: () { - selected.clear(); - }, - ); - } else { - return const SizedBox.shrink(); - } - }), - Obx(() { - if (selected.isNotEmpty) { - return IconButton( - icon: Icon(iOS ? CupertinoIcons.cloud_download : Icons.file_download, color: context.theme.colorScheme.onBackground), - onPressed: () { - final attachments = media.where((e) => selected.contains(e.guid!)); - for (Attachment a in attachments) { - final file = as.getContent(a, autoDownload: false); - if (file is PlatformFile) { - as.saveToDisk(file); + child: Obx(() { + var actions = [ + Obx(() { + if (selected.isNotEmpty) { + return IconButton( + icon: Icon(iOS ? CupertinoIcons.xmark : Icons.close, color: context.theme.colorScheme.onBackground), + onPressed: () { + selected.clear(); + }, + ); + } else { + return const SizedBox.shrink(); + } + }), + Obx(() { + if (selected.isNotEmpty) { + return IconButton( + icon: Icon(iOS ? CupertinoIcons.cloud_download : Icons.file_download, + color: context.theme.colorScheme.onBackground), + onPressed: () { + final attachments = media.where((e) => selected.contains(e.guid!)); + for (Attachment a in attachments) { + final file = as.getContent(a, autoDownload: false); + if (file is PlatformFile) { + as.saveToDisk(file); + } } - } - }, - ); - } else { - return const SizedBox.shrink(); - } - }), - ]; - - var slivers = [ - if (chat.isGroup) - SliverToBoxAdapter( - child: ChatInfo(chat: chat, ftSupportedParticipants: ftSupportedParticipants,), - ), - if (chat.isGroup) - SliverList( - delegate: SliverChildBuilderDelegate((context, index) { - final addMember = ListTile( - mouseCursor: MouseCursor.defer, - title: Text("Add ${iOS ? "Member" : "people"}", style: context.theme.textTheme.bodyLarge!.copyWith(color: context.theme.colorScheme.primary)), - leading: Container( - width: 40 * ss.settings.avatarScale.value, - height: 40 * ss.settings.avatarScale.value, - decoration: BoxDecoration( - color: !iOS ? null : context.theme.colorScheme.properSurface, - shape: BoxShape.circle, - border: iOS ? null : Border.all(color: context.theme.colorScheme.primary, width: 3) - ), - child: Icon( - Icons.add, - color: context.theme.colorScheme.primary, - size: 20 - ), - ), - onTap: () { - showAddParticipant(context, chat); }, ); + } else { + return const SizedBox.shrink(); + } + }), + ]; - if (index > clippedParticipants.length) { - if (ss.settings.enablePrivateAPI.value && chat.isIMessage && chat.isGroup && shouldShowMore) { - return addMember; - } else { - return const SizedBox.shrink(); + var slivers = [ + if (chat.isGroup) + SliverToBoxAdapter( + child: ChatInfo( + chat: chat, + ftSupportedParticipants: ftSupportedParticipants, + ), + ), + if (chat.isGroup) + SliverList( + delegate: SliverChildBuilderDelegate((context, index) { + final addMember = ListTile( + mouseCursor: MouseCursor.defer, + title: Text("Add ${iOS ? "Member" : "people"}", + style: context.theme.textTheme.bodyLarge!.copyWith(color: context.theme.colorScheme.primary)), + leading: Container( + width: 40 * ss.settings.avatarScale.value, + height: 40 * ss.settings.avatarScale.value, + decoration: BoxDecoration( + color: !iOS ? null : context.theme.colorScheme.properSurface, + shape: BoxShape.circle, + border: iOS ? null : Border.all(color: context.theme.colorScheme.primary, width: 3)), + child: Icon(Icons.add, color: context.theme.colorScheme.primary, size: 20), + ), + onTap: () { + showAddParticipant(context, chat); + }, + ); + + if (index > clippedParticipants.length) { + if (ss.settings.enablePrivateAPI.value && chat.isIMessage && chat.isGroup && shouldShowMore) { + return addMember; + } else { + return const SizedBox.shrink(); + } } - } - if (index == clippedParticipants.length) { - if (shouldShowMore) { - return ListTile( - mouseCursor: SystemMouseCursors.click, - onTap: () { - setState(() { - showMoreParticipants = !showMoreParticipants; - }); - }, - title: Text( - showMoreParticipants ? "Show less" : "Show more", - style: context.theme.textTheme.bodyLarge!.copyWith(color: context.theme.colorScheme.primary), - ), - leading: Container( - width: 40 * ss.settings.avatarScale.value, - height: 40 * ss.settings.avatarScale.value, - decoration: BoxDecoration( - color: !iOS ? null : context.theme.colorScheme.properSurface, - shape: BoxShape.circle, - border: iOS ? null : Border.all(color: context.theme.colorScheme.primary, width: 3) + if (index == clippedParticipants.length) { + if (shouldShowMore) { + return ListTile( + mouseCursor: SystemMouseCursors.click, + onTap: () { + setState(() { + showMoreParticipants = !showMoreParticipants; + }); + }, + title: Text( + showMoreParticipants ? "Show less" : "Show more", + style: + context.theme.textTheme.bodyLarge!.copyWith(color: context.theme.colorScheme.primary), ), - child: Icon( - Icons.more_horiz, - color: context.theme.colorScheme.primary, - size: 20 + leading: Container( + width: 40 * ss.settings.avatarScale.value, + height: 40 * ss.settings.avatarScale.value, + decoration: BoxDecoration( + color: !iOS ? null : context.theme.colorScheme.properSurface, + shape: BoxShape.circle, + border: iOS ? null : Border.all(color: context.theme.colorScheme.primary, width: 3)), + child: Icon(Icons.more_horiz, color: context.theme.colorScheme.primary, size: 20), ), - ), - ); - } else if (ss.settings.enablePrivateAPI.value && chat.isIMessage && chat.isGroup) { - return addMember; - } else { - return const SizedBox.shrink(); + ); + } else if (ss.settings.enablePrivateAPI.value && chat.isIMessage && chat.isGroup) { + return addMember; + } else { + return const SizedBox.shrink(); + } } - } - return ContactTile( - key: Key(chat.participants[index].address), - handle: chat.participants[index], - chat: chat, - canBeRemoved: chat.participants.length > 1 - && ss.settings.enablePrivateAPI.value - && chat.isIMessage, - facetimeSupported: ftSupportedParticipants.contains(RustPushBBUtils.bbHandleToRust(chat.participants[index])), - ); - }, childCount: clippedParticipants.length + 2), - ), - if (ss.settings.enablePrivateAPI.value && chat.participants.length > 2 && backend.canLeaveChat()) // evaluate this first to make GetX happy - SliverToBoxAdapter( - child: Builder( - builder: (context) { + return ContactTile( + key: Key(chat.participants[index].address), + handle: chat.participants[index], + chat: chat, + canBeRemoved: + chat.participants.length > 1 && ss.settings.enablePrivateAPI.value && chat.isIMessage, + facetimeSupported: + ftSupportedParticipants.contains(RustPushBBUtils.bbHandleToRust(chat.participants[index])), + ); + }, childCount: clippedParticipants.length + 2), + ), + if (ss.settings.enablePrivateAPI.value && + chat.participants.length > 2 && + backend.canLeaveChat()) // evaluate this first to make GetX happy + SliverToBoxAdapter( + child: Builder(builder: (context) { return ListTile( mouseCursor: MouseCursor.defer, - title: Text("Leave ${iOS ? "Chat" : "chat"}", style: context.theme.textTheme.bodyLarge!.copyWith(color: context.theme.colorScheme.error)), + title: Text("Leave ${iOS ? "Chat" : "chat"}", + style: context.theme.textTheme.bodyLarge!.copyWith(color: context.theme.colorScheme.error)), leading: Container( width: 40 * ss.settings.avatarScale.value, height: 40 * ss.settings.avatarScale.value, decoration: BoxDecoration( - color: !iOS ? null : context.theme.colorScheme.properSurface, - shape: BoxShape.circle, - border: iOS ? null : Border.all(color: context.theme.colorScheme.error, width: 3) - ), - child: Icon( - Icons.error_outline, - color: context.theme.colorScheme.error, - size: 20 - ), + color: !iOS ? null : context.theme.colorScheme.properSurface, + shape: BoxShape.circle, + border: iOS ? null : Border.all(color: context.theme.colorScheme.error, width: 3)), + child: Icon(Icons.error_outline, color: context.theme.colorScheme.error, size: 20), ), onTap: () async { showDialog( - context: context, - builder: (BuildContext context) { - return AlertDialog( - backgroundColor: context.theme.colorScheme.properSurface, - title: Text( - "Leaving chat...", - style: context.theme.textTheme.titleLarge, - ), - content: Container( - height: 70, - child: Center( - child: CircularProgressIndicator( - backgroundColor: context.theme.colorScheme.properSurface, - valueColor: AlwaysStoppedAnimation(context.theme.colorScheme.primary), + context: context, + builder: (BuildContext context) { + return AlertDialog( + backgroundColor: context.theme.colorScheme.properSurface, + title: Text( + "Leaving chat...", + style: context.theme.textTheme.titleLarge, + ), + content: Container( + height: 70, + child: Center( + child: CircularProgressIndicator( + backgroundColor: context.theme.colorScheme.properSurface, + valueColor: AlwaysStoppedAnimation(context.theme.colorScheme.primary), + ), ), ), - ), - ); - } - ); + ); + }); final response = await backend.leaveChat(chat); if (response) { Get.back(); @@ -343,239 +359,243 @@ class _ConversationDetailsState extends OptimizedState with } }, ); - } + }), ), + const SliverPadding( + padding: EdgeInsets.symmetric(vertical: 10), ), - const SliverPadding( - padding: EdgeInsets.symmetric(vertical: 10), - ), - ChatOptions(chat: chat), - if (!kIsWeb && media.isNotEmpty) - SliverPadding( - padding: const EdgeInsets.only(top: 20, bottom: 10, left: 15), - sliver: SliverToBoxAdapter( - child: Text("IMAGES & VIDEOS", style: context.theme.textTheme.bodyMedium!.copyWith(color: context.theme.colorScheme.outline)), - ), - ), - if (!kIsWeb && media.isNotEmpty) - SliverPadding( - padding: const EdgeInsets.all(10), - sliver: SliverGrid( - gridDelegate: SliverGridDelegateWithFixedCrossAxisCount( - crossAxisCount: max(2, ns.width(context) ~/ 200), - mainAxisSpacing: 10, - crossAxisSpacing: 10 + ChatOptions(chat: chat), + if (!kIsWeb && media.isNotEmpty) + SliverPadding( + padding: const EdgeInsets.only(top: 20, bottom: 10, left: 15), + sliver: SliverToBoxAdapter( + child: Text("IMAGES & VIDEOS", + style: context.theme.textTheme.bodyMedium!.copyWith(color: context.theme.colorScheme.outline)), ), - delegate: SliverChildBuilderDelegate( - (context, int index) { - return Obx(() => AnimatedContainer( - duration: const Duration(milliseconds: 250), - margin: EdgeInsets.all(selected.contains(media[index].guid) ? 10 : 0), - decoration: BoxDecoration( - borderRadius: BorderRadius.circular(20), - ), - clipBehavior: Clip.antiAlias, - child: GestureDetector( - onTap: selected.isNotEmpty ? () { - if (selected.contains(media[index].guid)) { - selected.remove(media[index].guid!); - } else { - selected.add(media[index].guid!); - } - } : null, - onLongPress: () { - if (selected.contains(media[index].guid)) { - selected.remove(media[index].guid!); - } else { - selected.add(media[index].guid!); - } - }, - child: AbsorbPointer( - absorbing: selected.isNotEmpty, - child: Stack( - alignment: Alignment.center, - children: [ - MediaGalleryCard( - attachment: media[index], - ), - if (selected.contains(media[index].guid)) - Container( - decoration: BoxDecoration( - shape: BoxShape.circle, - color: context.theme.colorScheme.primary - ), - child: Padding( - padding: const EdgeInsets.all(5.0), - child: Icon( - iOS ? CupertinoIcons.check_mark : Icons.check, - color: context.theme.colorScheme.onPrimary, - size: 18, + ), + if (!kIsWeb && media.isNotEmpty) + SliverPadding( + padding: const EdgeInsets.all(10), + sliver: SliverGrid( + gridDelegate: SliverGridDelegateWithFixedCrossAxisCount( + crossAxisCount: max(2, ns.width(context) ~/ 200), mainAxisSpacing: 10, crossAxisSpacing: 10), + delegate: SliverChildBuilderDelegate( + (context, int index) { + if (index >= media.length - 4 && mediaPager.hasOlder && !mediaPager.loadingOlder) { + WidgetsBinding.instance.addPostFrameCallback((_) { + mediaPager.loadOlder(); + }); + } + return Obx(() => AnimatedContainer( + duration: const Duration(milliseconds: 250), + margin: EdgeInsets.all(selected.contains(media[index].guid) ? 10 : 0), + decoration: BoxDecoration( + borderRadius: BorderRadius.circular(20), + ), + clipBehavior: Clip.antiAlias, + child: GestureDetector( + onTap: selected.isNotEmpty + ? () { + if (selected.contains(media[index].guid)) { + selected.remove(media[index].guid!); + } else { + selected.add(media[index].guid!); + } + } + : null, + onLongPress: () { + if (selected.contains(media[index].guid)) { + selected.remove(media[index].guid!); + } else { + selected.add(media[index].guid!); + } + }, + child: AbsorbPointer( + absorbing: selected.isNotEmpty, + child: Stack( + alignment: Alignment.center, + children: [ + MediaGalleryCard( + attachment: media[index], + mediaPager: mediaPager, ), - ), + if (selected.contains(media[index].guid)) + Container( + decoration: BoxDecoration( + shape: BoxShape.circle, color: context.theme.colorScheme.primary), + child: Padding( + padding: const EdgeInsets.all(5.0), + child: Icon( + iOS ? CupertinoIcons.check_mark : Icons.check, + color: context.theme.colorScheme.onPrimary, + size: 18, + ), + ), + ), + ], ), - ], - ), - ), - ), - )); - }, - childCount: media.length, + ), + ), + )); + }, + childCount: media.length, + ), ), ), - ), - if (!kIsWeb && links.isNotEmpty) - SliverPadding( - padding: const EdgeInsets.only(top: 20, bottom: 10, left: 15), - sliver: SliverToBoxAdapter( - child: Text("LINKS", style: context.theme.textTheme.bodyMedium!.copyWith(color: context.theme.colorScheme.outline)), + if (!kIsWeb && links.isNotEmpty) + SliverPadding( + padding: const EdgeInsets.only(top: 20, bottom: 10, left: 15), + sliver: SliverToBoxAdapter( + child: Text("LINKS", + style: context.theme.textTheme.bodyMedium!.copyWith(color: context.theme.colorScheme.outline)), + ), ), - ), - if (!kIsWeb && links.isNotEmpty) - SliverPadding( - padding: const EdgeInsets.all(10), - sliver: SliverToBoxAdapter( - child: MasonryGridView.count( - crossAxisCount: max(2, ns.width(context) ~/ 200), - mainAxisSpacing: 10, - crossAxisSpacing: 10, - shrinkWrap: true, - physics: const NeverScrollableScrollPhysics(), - itemBuilder: (context, index) { - if (links[index].payloadData?.urlData?.firstOrNull == null) { - return const Text("Failed to load link!"); - } - return Material( - color: context.theme.colorScheme.properSurface, - borderRadius: BorderRadius.circular(20), - clipBehavior: Clip.antiAlias, - child: InkWell( + if (!kIsWeb && links.isNotEmpty) + SliverPadding( + padding: const EdgeInsets.all(10), + sliver: SliverToBoxAdapter( + child: MasonryGridView.count( + crossAxisCount: max(2, ns.width(context) ~/ 200), + mainAxisSpacing: 10, + crossAxisSpacing: 10, + shrinkWrap: true, + physics: const NeverScrollableScrollPhysics(), + itemBuilder: (context, index) { + if (links[index].payloadData?.urlData?.firstOrNull == null) { + return const Text("Failed to load link!"); + } + return Material( + color: context.theme.colorScheme.properSurface, borderRadius: BorderRadius.circular(20), - onTap: () async { - final data = links[index].payloadData!.urlData!.first; - if ((data.url ?? data.originalUrl) == null) return; - await launchUrl( - Uri.parse((data.url ?? data.originalUrl)!), - mode: LaunchMode.externalApplication - ); - }, - child: Center( - child: UrlPreview( - data: links[index].payloadData!.urlData!.first, - message: links[index], + clipBehavior: Clip.antiAlias, + child: InkWell( + borderRadius: BorderRadius.circular(20), + onTap: () async { + final data = links[index].payloadData!.urlData!.first; + if ((data.url ?? data.originalUrl) == null) return; + await launchUrl(Uri.parse((data.url ?? data.originalUrl)!), + mode: LaunchMode.externalApplication); + }, + child: Center( + child: UrlPreview( + data: links[index].payloadData!.urlData!.first, + message: links[index], + ), ), ), - ), - ); - }, - itemCount: links.length, + ); + }, + itemCount: links.length, + ), ), ), - ), - if (!kIsWeb && locations.isNotEmpty) - SliverPadding( - padding: const EdgeInsets.only(top: 20, bottom: 10, left: 15), - sliver: SliverToBoxAdapter( - child: Text("LOCATIONS", style: context.theme.textTheme.bodyMedium!.copyWith(color: context.theme.colorScheme.outline)), + if (!kIsWeb && locations.isNotEmpty) + SliverPadding( + padding: const EdgeInsets.only(top: 20, bottom: 10, left: 15), + sliver: SliverToBoxAdapter( + child: Text("LOCATIONS", + style: context.theme.textTheme.bodyMedium!.copyWith(color: context.theme.colorScheme.outline)), + ), ), - ), - if (!kIsWeb && locations.isNotEmpty) - SliverPadding( - padding: const EdgeInsets.all(10), - sliver: SliverToBoxAdapter( - child: MasonryGridView.count( - crossAxisCount: max(2, ns.width(context) ~/ 200), - mainAxisSpacing: 10, - crossAxisSpacing: 10, - shrinkWrap: true, - physics: const NeverScrollableScrollPhysics(), - itemBuilder: (context, index) { - if (as.getContent(locations[index]) is! PlatformFile) { - return const Text("Failed to load location!"); - } - return Material( - color: context.theme.colorScheme.properSurface, - borderRadius: BorderRadius.circular(20), - clipBehavior: Clip.antiAlias, - child: InkWell( + if (!kIsWeb && locations.isNotEmpty) + SliverPadding( + padding: const EdgeInsets.all(10), + sliver: SliverToBoxAdapter( + child: MasonryGridView.count( + crossAxisCount: max(2, ns.width(context) ~/ 200), + mainAxisSpacing: 10, + crossAxisSpacing: 10, + shrinkWrap: true, + physics: const NeverScrollableScrollPhysics(), + itemBuilder: (context, index) { + if (as.getContent(locations[index]) is! PlatformFile) { + return const Text("Failed to load location!"); + } + return Material( + color: context.theme.colorScheme.properSurface, borderRadius: BorderRadius.circular(20), - onTap: () async { - final data = links[index].payloadData!.urlData!.first; - if ((data.url ?? data.originalUrl) == null) return; - await launchUrl( - Uri.parse((data.url ?? data.originalUrl)!), - mode: LaunchMode.externalApplication - ); - }, - child: Center( - child: UrlPreview( - data: UrlPreviewData( - title: "Location from ${DateFormat.yMd().format(locations[index].message.target!.dateCreated!)}", - siteName: "Tap to open", + clipBehavior: Clip.antiAlias, + child: InkWell( + borderRadius: BorderRadius.circular(20), + onTap: () async { + final data = links[index].payloadData!.urlData!.first; + if ((data.url ?? data.originalUrl) == null) return; + await launchUrl(Uri.parse((data.url ?? data.originalUrl)!), + mode: LaunchMode.externalApplication); + }, + child: Center( + child: UrlPreview( + data: UrlPreviewData( + title: + "Location from ${DateFormat.yMd().format(locations[index].message.target!.dateCreated!)}", + siteName: "Tap to open", + ), + message: locations[index].message.target!, + file: as.getContent(locations[index]), ), - message: locations[index].message.target!, - file: as.getContent(locations[index]), ), ), - ), - ); - }, - itemCount: locations.length, + ); + }, + itemCount: locations.length, + ), ), ), - ), - if (!kIsWeb && docs.isNotEmpty) - SliverPadding( - padding: const EdgeInsets.only(top: 20, bottom: 10, left: 15), - sliver: SliverToBoxAdapter( - child: Text("OTHER FILES", style: context.theme.textTheme.bodyMedium!.copyWith(color: context.theme.colorScheme.outline)), - ), - ), - if (!kIsWeb && docs.isNotEmpty) - SliverPadding( - padding: const EdgeInsets.all(10), - sliver: SliverGrid( - gridDelegate: SliverGridDelegateWithFixedCrossAxisCount( - crossAxisCount: max(2, ns.width(context) ~/ 200), - mainAxisSpacing: 10, - crossAxisSpacing: 10, - childAspectRatio: 1.75, + if (!kIsWeb && docs.isNotEmpty) + SliverPadding( + padding: const EdgeInsets.only(top: 20, bottom: 10, left: 15), + sliver: SliverToBoxAdapter( + child: Text("OTHER FILES", + style: context.theme.textTheme.bodyMedium!.copyWith(color: context.theme.colorScheme.outline)), ), - delegate: SliverChildBuilderDelegate( - (context, int index) { - return MediaGalleryCard( - attachment: docs[index], - ); - }, - childCount: docs.length, + ), + if (!kIsWeb && docs.isNotEmpty) + SliverPadding( + padding: const EdgeInsets.all(10), + sliver: SliverGrid( + gridDelegate: SliverGridDelegateWithFixedCrossAxisCount( + crossAxisCount: max(2, ns.width(context) ~/ 200), + mainAxisSpacing: 10, + crossAxisSpacing: 10, + childAspectRatio: 1.75, + ), + delegate: SliverChildBuilderDelegate( + (context, int index) { + return MediaGalleryCard( + attachment: docs[index], + ); + }, + childCount: docs.length, + ), ), ), + const SliverPadding( + padding: EdgeInsets.only(top: 50), ), - const SliverPadding( - padding: EdgeInsets.only(top: 50), - ), - ]; - - if (!chat.isGroup) { - return ProfileScaffold( - bodySlivers: slivers, - handle: chat.participants[0], - actions: actions, - chatOptions: ChatInfo(chat: chat, ftSupportedParticipants: ftSupportedParticipants,), - ); - } + ]; - return SettingsScaffold( - headerColor: headerColor, - title: "Details", - tileColor: tileColor, - initialHeader: null, - iosSubtitle: iosSubtitle, - materialSubtitle: materialSubtitle, - actions: actions, - bodySlivers: slivers - ); - }) - ), + if (!chat.isGroup) { + return ProfileScaffold( + bodySlivers: slivers, + handle: chat.participants[0], + actions: actions, + chatOptions: ChatInfo( + chat: chat, + ftSupportedParticipants: ftSupportedParticipants, + ), + ); + } + + return SettingsScaffold( + headerColor: headerColor, + title: "Details", + tileColor: tileColor, + initialHeader: null, + iosSubtitle: iosSubtitle, + materialSubtitle: materialSubtitle, + actions: actions, + bodySlivers: slivers); + })), ); } } diff --git a/lib/app/layouts/conversation_details/widgets/media_gallery_card.dart b/lib/app/layouts/conversation_details/widgets/media_gallery_card.dart index 518e651578..c06f8b9fbb 100644 --- a/lib/app/layouts/conversation_details/widgets/media_gallery_card.dart +++ b/lib/app/layouts/conversation_details/widgets/media_gallery_card.dart @@ -18,8 +18,9 @@ import 'package:universal_io/io.dart'; import 'package:video_player/video_player.dart'; class MediaGalleryCard extends StatefulWidget { - MediaGalleryCard({super.key, required this.attachment}); + MediaGalleryCard({super.key, required this.attachment, this.mediaPager}); final Attachment attachment; + final ConversationMediaPager? mediaPager; @override State createState() => _MediaGalleryCardState(); @@ -29,6 +30,8 @@ class _MediaGalleryCardState extends OptimizedState with Autom Uint8List? videoPreview; Duration? duration; AttachmentDownloadController? controller; + bool localFileAvailable = false; + String? galleryThumbnailPath; late PlatformFile attachmentFile = PlatformFile( name: attachment.transferName!, path: kIsWeb ? null : attachment.path, @@ -41,20 +44,26 @@ class _MediaGalleryCardState extends OptimizedState with Autom @override void initState() { super.initState(); + localFileAvailable = attachment.bytes != null; // check active downloader otherwise check file exists if (attachmentDownloader.getController(attachment.guid) != null) { controller = attachmentDownloader.getController(attachment.guid); controller!.completeFuncs.add((file) { + if (!mounted) return; setState(() { controller = null; attachmentFile = file; + localFileAvailable = file.bytes != null || file.path != null; }); if (attachment.mimeType?.contains("video") ?? false) { getVideoPreview(file); + } else if (attachment.mimeStart == 'image') { + getBytes(); } }); controller!.errorFuncs.add(() { + if (!mounted) return; setState(() { controller = null; }); @@ -70,15 +79,20 @@ class _MediaGalleryCardState extends OptimizedState with Autom AttachmentDownloadController( attachment: attachment, onComplete: (file) { + if (!mounted) return; setState(() { controller = null; attachmentFile = file; + localFileAvailable = file.bytes != null || file.path != null; }); if (attachment.mimeType?.contains("video") ?? false) { getVideoPreview(file); + } else if (attachment.mimeStart == 'image') { + getBytes(); } }, onError: () { + if (!mounted) return; setState(() { controller = null; }); @@ -92,8 +106,37 @@ class _MediaGalleryCardState extends OptimizedState with Autom Future getBytes() async { final file = File(attachment.path); - if (await file.exists()) { + if (await file.exists() && mounted) { + if (attachment.mimeStart == 'image') { + final thumbnail = await as.getImageGalleryThumbnail(attachment.path); + if (!mounted) return; + setState(() { + attachmentFile = PlatformFile( + name: attachment.transferName!, + path: attachment.path, + size: attachment.totalBytes!, + ); + galleryThumbnailPath = thumbnail; + localFileAvailable = true; + }); + return; + } + if (attachment.mimeStart == 'video') { + setState(() { + attachmentFile = PlatformFile( + name: attachment.transferName!, + path: attachment.path, + size: attachment.totalBytes!, + ); + localFileAvailable = true; + }); + if (attachment.mimeStart == 'video') { + getVideoPreview(attachmentFile); + } + return; + } final bytes = await file.readAsBytes(); + if (!mounted) return; setState(() { attachmentFile = PlatformFile( name: attachment.transferName!, @@ -101,6 +144,7 @@ class _MediaGalleryCardState extends OptimizedState with Autom bytes: bytes, size: attachment.totalBytes!, ); + localFileAvailable = true; }); if (attachment.mimeType?.contains("video") ?? false) { getVideoPreview(attachmentFile); @@ -114,10 +158,10 @@ class _MediaGalleryCardState extends OptimizedState with Autom return; } + VideoPlayerController? tempController; try { videoPreview = await as.getVideoThumbnail(file.path!); - dynamic _file = File(file.path!); - final tempController = VideoPlayerController.file(_file); + tempController = VideoPlayerController.file(File(file.path!)); await tempController.initialize(); duration = tempController.value.duration; } catch (_) { @@ -129,9 +173,11 @@ class _MediaGalleryCardState extends OptimizedState with Autom attachment.metadata!['thumbnail_status'] = 'error'; attachment.save(null); } + } finally { + await tempController?.dispose(); } - setState(() {}); + if (mounted) setState(() {}); } @override @@ -153,12 +199,11 @@ class _MediaGalleryCardState extends OptimizedState with Autom height: 40, width: 40, child: Obx(() => CircleProgressBar( - foregroundColor: context.theme.colorScheme.primary, - backgroundColor: context.theme.colorScheme.outline, - value: controller!.progress.value?.toDouble() ?? 0 - )), + foregroundColor: context.theme.colorScheme.primary, + backgroundColor: context.theme.colorScheme.outline, + value: controller!.progress.value?.toDouble() ?? 0)), ); - } else if (attachmentFile.bytes == null) { + } else if (!localFileAvailable) { child = InkWell( onTap: downloadAttachment, child: Column( @@ -169,12 +214,8 @@ class _MediaGalleryCardState extends OptimizedState with Autom style: Theme.of(context).textTheme.bodyLarge, ), const SizedBox(height: 5), - Icon(ss.settings.skin.value == Skins.iOS - ? CupertinoIcons.cloud_download - : Icons.cloud_download, - size: 28.0, - color: context.theme.colorScheme.properOnSurface - ), + Icon(ss.settings.skin.value == Skins.iOS ? CupertinoIcons.cloud_download : Icons.cloud_download, + size: 28.0, color: context.theme.colorScheme.properOnSurface), const SizedBox(height: 5), Text( attachment.mimeType ?? "Unknown File Type", @@ -185,11 +226,21 @@ class _MediaGalleryCardState extends OptimizedState with Autom ), ); } else if (attachment.mimeType?.startsWith("image") ?? false) { - child = ImageDisplay(attachment: attachment, image: attachmentFile.bytes!); + child = ImageDisplay( + attachment: attachment, + image: attachmentFile.bytes, + path: galleryThumbnailPath ?? (attachmentFile.bytes == null ? attachmentFile.path : null), + mediaPager: widget.mediaPager, + ); addPadding = false; } else if ((attachment.mimeType?.startsWith("video") ?? false) && !kIsDesktop && !kIsWeb) { if (videoPreview != null) { - child = ImageDisplay(attachment: attachment, image: videoPreview!, duration: duration); + child = ImageDisplay( + attachment: attachment, + image: videoPreview!, + duration: duration, + mediaPager: widget.mediaPager, + ); addPadding = false; } else { child = const Text( @@ -226,20 +277,28 @@ class ImageDisplay extends StatelessWidget { const ImageDisplay({ super.key, required this.attachment, - required this.image, + this.image, + this.path, this.duration, + this.mediaPager, }); final Attachment attachment; - final Uint8List image; + final Uint8List? image; + final String? path; final Duration? duration; + final ConversationMediaPager? mediaPager; @override Widget build(BuildContext context) { + final columns = max(2, ns.width(context) ~/ 200); + final logicalWidth = ns.width(context) / columns; + final cacheWidth = (logicalWidth * MediaQuery.devicePixelRatioOf(context)).ceil().clamp(256, 1024); return OpenContainer( openBuilder: (_, closeContainer) { return FullscreenMediaHolder( attachment: attachment, + mediaPager: mediaPager, showInteractions: true, ); }, @@ -253,27 +312,43 @@ class ImageDisplay extends StatelessWidget { height: ns.width(context) / max(2, ns.width(context) ~/ 200), child: Stack( children: [ - Image.memory( - image, - fit: BoxFit.cover, - alignment: Alignment.center, - cacheWidth: ns.width(context) ~/ max(2, ns.width(context) ~/ 200) * 2, - width: ns.width(context) / max(2, ns.width(context) ~/ 200), - height: ns.width(context) / max(2, ns.width(context) ~/ 200), - ), + if (path != null && !kIsWeb) + Image.file( + File(path!), + fit: BoxFit.cover, + alignment: Alignment.center, + cacheWidth: cacheWidth, + width: logicalWidth, + height: logicalWidth, + ) + else + Image.memory( + image!, + fit: BoxFit.cover, + alignment: Alignment.center, + cacheWidth: cacheWidth, + width: logicalWidth, + height: logicalWidth, + ), if ((attachment.mimeType?.contains("video") ?? false) && duration != null) Positioned( bottom: 10, right: 10, - child: Text(duration.toString().split('.').first - .padLeft(8, "0").padLeft(9, "a") - .replaceFirst("a00:", "").replaceFirst("a", ""), + child: Text( + duration + .toString() + .split('.') + .first + .padLeft(8, "0") + .padLeft(9, "a") + .replaceFirst("a00:", "") + .replaceFirst("a", ""), style: context.theme.textTheme.bodyMedium!.copyWith(fontWeight: FontWeight.bold), ), ), - if (!(attachment.message.target?.isFromMe ?? true) - && attachment.message.target?.handle != null - && ss.settings.skin.value == Skins.iOS) + if (!(attachment.message.target?.isFromMe ?? true) && + attachment.message.target?.handle != null && + ss.settings.skin.value == Skins.iOS) Positioned( top: 10, right: 10, diff --git a/lib/app/layouts/conversation_list/pages/conversation_list.dart b/lib/app/layouts/conversation_list/pages/conversation_list.dart index 3486e11a9b..23933aa794 100644 --- a/lib/app/layouts/conversation_list/pages/conversation_list.dart +++ b/lib/app/layouts/conversation_list/pages/conversation_list.dart @@ -2,6 +2,7 @@ import 'dart:async'; import 'package:bluebubbles/app/layouts/chat_creator/chat_creator.dart'; import 'package:bluebubbles/app/layouts/conversation_list/widgets/conversation_list_fab.dart'; +import 'package:bluebubbles/app/layouts/conversation_list/widgets/apple_network_banner.dart'; import 'package:bluebubbles/app/layouts/conversation_list/widgets/footer/samsung_footer.dart'; import 'package:bluebubbles/app/layouts/conversation_list/widgets/header/material_header.dart'; import 'package:bluebubbles/app/layouts/conversation_list/widgets/header/samsung_header.dart'; @@ -41,11 +42,11 @@ class ConversationListController extends StatefulController { bool showMaterialFABText = true; double materialScrollStartPosition = 0; - ConversationListController({required this.showArchivedChats, required this.showUnknownSenders, this.showDeletedMessages = false}) { + ConversationListController( + {required this.showArchivedChats, required this.showUnknownSenders, this.showDeletedMessages = false}) { if (showDeletedMessages) { - var subscription = (Database.chats.query() - ..backlink(Message_.chat, Message_.dateDeleted.notNull())) - .watch(triggerImmediately: true); + var subscription = (Database.chats.query()..backlink(Message_.chat, Message_.dateDeleted.notNull())) + .watch(triggerImmediately: true); sub = subscription.listen((Query query) { deletedChats.value = query.find(); @@ -121,7 +122,8 @@ class ConversationListController extends StatefulController { } class ConversationList extends CustomStateful { - ConversationList({super.key, required bool showArchivedChats, required bool showUnknownSenders, showDeletedMessages = false}) + ConversationList( + {super.key, required bool showArchivedChats, required bool showUnknownSenders, showDeletedMessages = false}) : super( parentController: Get.put( ConversationListController( @@ -150,8 +152,8 @@ class _ConversationListState extends CustomState( value: SystemUiOverlayStyle( - systemNavigationBarColor: ss.settings.immersiveMode.value ? Colors.transparent : context.theme.colorScheme.background, // navigation bar color + systemNavigationBarColor: ss.settings.immersiveMode.value + ? Colors.transparent + : context.theme.colorScheme.background, // navigation bar color systemNavigationBarIconBrightness: brightness, statusBarColor: Colors.transparent, // status bar color statusBarIconBrightness: brightness.opposite, diff --git a/lib/app/layouts/conversation_list/widgets/apple_network_banner.dart b/lib/app/layouts/conversation_list/widgets/apple_network_banner.dart new file mode 100644 index 0000000000..755f5419af --- /dev/null +++ b/lib/app/layouts/conversation_list/widgets/apple_network_banner.dart @@ -0,0 +1,68 @@ +import 'package:bluebubbles/services/rustpush/apple_network_health.dart'; +import 'package:bluebubbles/services/rustpush/rustpush_service.dart'; +import 'package:flutter/material.dart'; +import 'package:get/get.dart'; + +class AppleNetworkBanner extends StatelessWidget { + const AppleNetworkBanner({super.key}); + + @override + Widget build(BuildContext context) { + return Obx(() { + final health = pushService.appleNetworkHealth.value; + final (Color color, IconData icon, String message) = switch (health) { + AppleNetworkHealth.fallback => ( + Colors.green.shade700, + Icons.security, + pushService.appleNetworkDetail.value ?? "Apple messaging connected through TCP 443 fallback", + ), + AppleNetworkHealth.reconnecting => ( + Colors.amber.shade800, + Icons.sync, + pushService.appleNetworkDetail.value ?? "Reconnecting to Apple messaging...", + ), + AppleNetworkHealth.blocked => ( + Colors.red.shade700, + Icons.wifi_off, + pushService.appleNetworkDetail.value ?? "This network may be blocking Apple messaging.", + ), + _ => (Colors.transparent, Icons.check, ""), + }; + + if (health != AppleNetworkHealth.fallback && + health != AppleNetworkHealth.reconnecting && + health != AppleNetworkHealth.blocked) { + return const SizedBox.shrink(); + } + + return Material( + color: color, + child: Semantics( + liveRegion: true, + label: message, + child: Padding( + padding: const EdgeInsets.symmetric(horizontal: 12, vertical: 8), + child: Row( + children: [ + Icon(icon, size: 18, color: Colors.white), + const SizedBox(width: 8), + Expanded( + child: Text( + message, + maxLines: 2, + overflow: TextOverflow.ellipsis, + style: const TextStyle( + color: Colors.white, + fontSize: 13, + fontWeight: FontWeight.w600, + ), + ), + ), + ], + ), + ), + ), + ); + }); + } +} diff --git a/lib/app/layouts/conversation_view/pages/conversation_keyboard_policy.dart b/lib/app/layouts/conversation_view/pages/conversation_keyboard_policy.dart new file mode 100644 index 0000000000..4887d75720 --- /dev/null +++ b/lib/app/layouts/conversation_view/pages/conversation_keyboard_policy.dart @@ -0,0 +1,9 @@ +bool shouldDismissKeyboardFromTranscript({ + required bool hasActiveMessageEdit, + required bool keyboardOpen, + required bool composerHasFocus, + required bool subjectHasFocus, +}) { + if (hasActiveMessageEdit) return false; + return keyboardOpen || composerHasFocus || subjectHasFocus; +} diff --git a/lib/app/layouts/conversation_view/pages/conversation_view.dart b/lib/app/layouts/conversation_view/pages/conversation_view.dart index 5844f077e0..2e92fcdf82 100644 --- a/lib/app/layouts/conversation_view/pages/conversation_view.dart +++ b/lib/app/layouts/conversation_view/pages/conversation_view.dart @@ -1,6 +1,7 @@ import 'package:bluebubbles/app/layouts/conversation_view/widgets/header/cupertino_header.dart'; import 'package:bluebubbles/app/layouts/conversation_view/widgets/header/material_header.dart'; import 'package:bluebubbles/app/layouts/conversation_view/widgets/text_field/conversation_text_field.dart'; +import 'package:bluebubbles/app/layouts/conversation_view/pages/conversation_keyboard_policy.dart'; import 'package:bluebubbles/app/layouts/settings/pages/profile/posterkit.dart'; import 'package:bluebubbles/app/wrappers/gradient_background_wrapper.dart'; import 'package:bluebubbles/app/wrappers/stateful_boilerplate.dart'; @@ -61,6 +62,10 @@ class ConversationViewState extends OptimizedState { @override void dispose() { controller.saveReplyToMessageState(); // P8bda + // Keep the controller alive until the route and its scrollable children + // have actually been disposed. Deleting it from a back-button callback + // leaves the mounted transcript using a disposed scroll controller. + controller.close(); super.dispose(); } @@ -113,9 +118,9 @@ class ConversationViewState extends OptimizedState { } if (ls.isBubble) { SystemNavigator.pop(); + controller.close(); + return; } - controller.close(); - if (ls.isBubble) return; return Navigator.of(context).pop(); }, child: SafeArea( @@ -166,9 +171,12 @@ class ConversationViewState extends OptimizedState { Listener( behavior: HitTestBehavior.translucent, onPointerDown: (_) { - if (controller.keyboardOpen || - controller.focusNode.hasFocus || - controller.subjectFocusNode.hasFocus) { + if (shouldDismissKeyboardFromTranscript( + hasActiveMessageEdit: controller.editing.isNotEmpty, + keyboardOpen: controller.keyboardOpen, + composerHasFocus: controller.focusNode.hasFocus, + subjectHasFocus: controller.subjectFocusNode.hasFocus, + )) { controller.dismissKeyboard(); } }, diff --git a/lib/app/layouts/conversation_view/pages/messages_view.dart b/lib/app/layouts/conversation_view/pages/messages_view.dart index 9c8de0f055..f49495d39d 100644 --- a/lib/app/layouts/conversation_view/pages/messages_view.dart +++ b/lib/app/layouts/conversation_view/pages/messages_view.dart @@ -4,6 +4,7 @@ import 'dart:math'; import 'package:audio_waveforms/audio_waveforms.dart'; import 'package:audio_waveforms/audio_waveforms.dart' as audio; import 'package:bluebubbles/app/components/avatars/contact_avatar_group_widget.dart'; +import 'package:bluebubbles/app/layouts/conversation_view/pages/transcript_pagination.dart'; import 'package:bluebubbles/app/layouts/conversation_view/widgets/message/message_holder.dart'; import 'package:bluebubbles/app/layouts/conversation_view/widgets/message/typing/typing_indicator.dart'; import 'package:bluebubbles/database/database.dart'; @@ -375,17 +376,26 @@ class MessagesViewState extends OptimizedState { return; } - final oldLength = _messages.length; - _messages = messageService.struct.messages; - _messages.sort(Message.sort); - _messages.sublist(max(oldLength - 1, 0)).forEachIndexed((i, m) { - final c = mwc(m); + final previousMessages = List.from(_messages); + final nextMessages = List.from(messageService.struct.messages) + ..sort(Message.sort); + final insertions = transcriptInsertions( + previous: previousMessages, + next: nextMessages, + identityOf: (message) => message.guid!, + ); + _messages = nextMessages; + for (final insertion in insertions) { + final c = mwc(insertion.item); c.cvController = controller; - listKey.currentState!.insertItem(i, duration: const Duration(milliseconds: 0)); - }); + listKey.currentState?.insertItem( + insertion.index, + duration: Duration.zero, + ); + } _syncBottomMessageFocusNode(); // should only happen when a reaction is the most recent message - if (oldLength == 0) { + if (previousMessages.isEmpty) { setState(() {}); } } finally { diff --git a/lib/app/layouts/conversation_view/pages/transcript_pagination.dart b/lib/app/layouts/conversation_view/pages/transcript_pagination.dart new file mode 100644 index 0000000000..9b225e1bb6 --- /dev/null +++ b/lib/app/layouts/conversation_view/pages/transcript_pagination.dart @@ -0,0 +1,34 @@ +class TranscriptInsertion { + const TranscriptInsertion({ + required this.index, + required this.item, + }); + + final int index; + final T item; +} + +/// Returns only the items newly present in [next], at their authoritative +/// indices in that already-sorted transcript. +/// +/// The result is ordered by ascending index so it can be applied directly to +/// an AnimatedList. For the normal newest-first transcript case, older page +/// items remain tail insertions and do not shift the current reverse-scroll +/// anchor. +List> transcriptInsertions({ + required Iterable previous, + required List next, + required Object Function(T item) identityOf, +}) { + final knownIdentities = previous.map(identityOf).toSet(); + final insertions = >[]; + + for (var index = 0; index < next.length; index++) { + final item = next[index]; + if (knownIdentities.add(identityOf(item))) { + insertions.add(TranscriptInsertion(index: index, item: item)); + } + } + + return List.unmodifiable(insertions); +} diff --git a/lib/app/layouts/conversation_view/widgets/header/cupertino_header.dart b/lib/app/layouts/conversation_view/widgets/header/cupertino_header.dart index 5b60474f8c..e98b07abaa 100644 --- a/lib/app/layouts/conversation_view/widgets/header/cupertino_header.dart +++ b/lib/app/layouts/conversation_view/widgets/header/cupertino_header.dart @@ -55,10 +55,6 @@ class CupertinoHeader extends StatelessWidget implements PreferredSizeWidget { SystemNavigator.pop(); return; } - controller.close(); - if (Get.isSnackbarOpen) { - Get.closeAllSnackbars(); - } Navigator.of(context).pop(); } diff --git a/lib/app/layouts/conversation_view/widgets/header/material_header.dart b/lib/app/layouts/conversation_view/widgets/header/material_header.dart index 6c315cc8fd..3b7e510715 100644 --- a/lib/app/layouts/conversation_view/widgets/header/material_header.dart +++ b/lib/app/layouts/conversation_view/widgets/header/material_header.dart @@ -58,7 +58,6 @@ class MaterialHeader extends StatelessWidget implements PreferredSizeWidget { SystemNavigator.pop(); return true; } - controller.close(); return false; }, ), diff --git a/lib/app/layouts/conversation_view/widgets/message/attachment/attachment_holder.dart b/lib/app/layouts/conversation_view/widgets/message/attachment/attachment_holder.dart index 43e8b1b5f9..003e47d9da 100644 --- a/lib/app/layouts/conversation_view/widgets/message/attachment/attachment_holder.dart +++ b/lib/app/layouts/conversation_view/widgets/message/attachment/attachment_holder.dart @@ -89,9 +89,9 @@ class _AttachmentHolderState extends CustomState with AutomaticKeepAliveClientMixin { Message get message => widget.message; - late Metadata? metadata = MetadataHelper.mapIsNotEmpty(message.metadata) ? Metadata.fromJson(message.metadata!) : null; + /// The URL this preview should resolve and open. + String? get effectiveUrl => widget.previewUrl ?? message.url; + + /// `message.metadata` is a single blob per message, so it can only ever + /// describe one link. Only the message's primary URL may read or write it; + /// the other links in the same message stay in memory rather than + /// overwriting each other in the database. + bool get isPrimaryUrl => widget.previewUrl == null || widget.previewUrl == message.url; + + late Metadata? metadata = isPrimaryUrl && MetadataHelper.mapIsNotEmpty(message.metadata) + ? Metadata.fromJson(message.metadata!) + : null; @override void initState() { @@ -33,13 +53,13 @@ class _LegacyUrlPreviewState extends OptimizedState with Autom updateObx(() async { if (metadata == null) { try { - metadata = await MetadataHelper.fetchMetadata(message); + metadata = await MetadataHelper.fetchMetadata(message, previewUrl: widget.previewUrl); } catch (ex, stack) { Logger.error("Failed to fetch metadata!", error: ex, trace: stack); return; } // If the data isn't empty, save/update it in the DB - if (MetadataHelper.isNotEmpty(metadata)) { + if (isPrimaryUrl && MetadataHelper.isNotEmpty(metadata)) { message.updateMetadata(metadata); } setState(() {}); @@ -53,14 +73,21 @@ class _LegacyUrlPreviewState extends OptimizedState with Autom @override Widget build(BuildContext context) { super.build(context); - final siteText = Uri.tryParse(metadata?.url ?? message.text ?? "")?.host; + // Fall back to this preview's own URL rather than the whole message text. + // With several links in one message that text is not a parseable URI, so + // the host came back null and the card rendered with no site label at all. + final siteText = Uri.tryParse(metadata?.url ?? effectiveUrl ?? "")?.host; return InkWell( onTap: () async { - if ((metadata?.url ?? message.text) != null) { - await launchUrl( - Uri.parse((metadata?.url ?? message.text)!), - mode: LaunchMode.externalApplication, - ); + final target = metadata?.url ?? effectiveUrl; + if (target != null) { + final parsed = Uri.tryParse(target); + if (parsed != null) { + await launchUrl( + parsed, + mode: LaunchMode.externalApplication, + ); + } } }, child: Column( diff --git a/lib/app/layouts/conversation_view/widgets/message/message_edit_tap_surface.dart b/lib/app/layouts/conversation_view/widgets/message/message_edit_tap_surface.dart new file mode 100644 index 0000000000..65e3d0f636 --- /dev/null +++ b/lib/app/layouts/conversation_view/widgets/message/message_edit_tap_surface.dart @@ -0,0 +1,27 @@ +import 'package:flutter/widgets.dart'; + +/// Makes the complete inline-edit bubble a focus target without disturbing an +/// existing cursor or text selection. +class MessageEditTapSurface extends StatelessWidget { + const MessageEditTapSurface({ + super.key, + required this.focusNode, + required this.child, + }); + + final FocusNode focusNode; + final Widget child; + + @override + Widget build(BuildContext context) { + return Listener( + behavior: HitTestBehavior.opaque, + onPointerDown: (_) { + if (!focusNode.hasFocus && focusNode.canRequestFocus) { + focusNode.requestFocus(); + } + }, + child: child, + ); + } +} diff --git a/lib/app/layouts/conversation_view/widgets/message/message_holder.dart b/lib/app/layouts/conversation_view/widgets/message/message_holder.dart index 18a2299d10..fa3201432d 100644 --- a/lib/app/layouts/conversation_view/widgets/message/message_holder.dart +++ b/lib/app/layouts/conversation_view/widgets/message/message_holder.dart @@ -12,6 +12,7 @@ import 'package:bluebubbles/app/layouts/conversation_view/widgets/message/misc/m import 'package:bluebubbles/app/layouts/conversation_view/widgets/message/misc/select_checkbox.dart'; import 'package:bluebubbles/app/layouts/conversation_view/widgets/message/misc/slide_to_reply.dart'; import 'package:bluebubbles/app/layouts/conversation_view/widgets/message/misc/tail_clipper.dart'; +import 'package:bluebubbles/app/layouts/conversation_view/widgets/message/message_edit_tap_surface.dart'; import 'package:bluebubbles/app/layouts/conversation_view/widgets/message/popup/message_popup_holder.dart'; import 'package:bluebubbles/app/layouts/conversation_view/widgets/message/reaction/reaction_holder.dart'; import 'package:bluebubbles/app/layouts/conversation_view/widgets/message/reply/reply_bubble.dart'; @@ -59,27 +60,40 @@ class MessageHolder extends CustomStateful { CustomState createState() => _MessageHolderState(); } -class _MessageHolderState extends CustomState { +class _MessageHolderState + extends CustomState { Message get message => controller.message; Message? get olderMessage => controller.oldMessage; Message? get newerMessage => controller.newMessage; Message? get replyTo => message.threadOriginatorGuid == null ? null : ss.settings.repliesToPrevious.value - ? (service.struct.getPreviousReply(message.threadOriginatorGuid!, message.normalizedThreadPart, message.guid!) ?? service.struct.getThreadOriginator(message.threadOriginatorGuid!)) - : service.struct.getThreadOriginator(message.threadOriginatorGuid!); + ? (service.struct.getPreviousReply(message.threadOriginatorGuid!, + message.normalizedThreadPart, message.guid!) ?? + service.struct.getThreadOriginator(message.threadOriginatorGuid!)) + : service.struct.getThreadOriginator(message.threadOriginatorGuid!); Chat get chat => widget.cvController.chat; MessagesService get service => ms(widget.cvController.chat.guid); - bool get canSwipeToReply => ss.settings.enablePrivateAPI.value - && ss.isMinBigSurSync - && chat.isIMessage - && !widget.isReplyThread - && !message.guid!.startsWith("temp") - && !message.guid!.startsWith("error"); - bool get showSender => !message.isGroupEvent && (!message.sameSender(olderMessage) || (olderMessage?.isGroupEvent ?? false) - || (olderMessage == null || !message.dateCreated!.isWithin(olderMessage!.dateCreated!, minutes: 30))); + bool get canSwipeToReply => + ss.settings.enablePrivateAPI.value && + ss.isMinBigSurSync && + chat.isIMessage && + !widget.isReplyThread && + !message.guid!.startsWith("temp") && + !message.guid!.startsWith("error"); + bool get showSender => + !message.isGroupEvent && + (!message.sameSender(olderMessage) || + (olderMessage?.isGroupEvent ?? false) || + (olderMessage == null || + !message.dateCreated! + .isWithin(olderMessage!.dateCreated!, minutes: 30))); bool get showAvatar => chat.isGroup; - bool isEditing(int part) => message.isFromMe! && widget.cvController.editing.firstWhereOrNull((e2) => e2.item1.guid == message.guid! && e2.item2.part == part) != null; + bool isEditing(int part) => + message.isFromMe! && + widget.cvController.editing.firstWhereOrNull((e2) => + e2.item1.guid == message.guid! && e2.item2.part == part) != + null; List messageParts = []; List replyOffsets = []; @@ -92,7 +106,7 @@ class _MessageHolderState extends CustomState getBubbleColors() { - List bubbleColors = [context.theme.colorScheme.properSurface, context.theme.colorScheme.properSurface]; + List bubbleColors = [ + context.theme.colorScheme.properSurface, + context.theme.colorScheme.properSurface + ]; if (ss.settings.colorfulBubbles.value && !message.isFromMe!) { if (message.handle?.color == null) { bubbleColors = toColorGradient(message.handle?.address); @@ -145,32 +162,34 @@ class _MessageHolderState extends CustomState e2.item1.guid == message.guid! && e2.item2.part == part); - if (newEdit.string.isNotEmpty && jsonEncode(newEdit.toMap()) != jsonEncode(message.attributedBody.first.toMap())) { + widget.cvController.stopEditing(message.guid!, part); + if (newEdit.string.isNotEmpty && + jsonEncode(newEdit.toMap()) != + jsonEncode(message.attributedBody.first.toMap())) { showDialog( - context: context, - builder: (BuildContext context) { - return AlertDialog( - backgroundColor: context.theme.colorScheme.properSurface, - title: Text( - "Editing message...", - style: context.theme.textTheme.titleLarge, - ), - content: Container( - height: 70, - child: Center( - child: CircularProgressIndicator( - backgroundColor: context.theme.colorScheme.properSurface, - valueColor: AlwaysStoppedAnimation(context.theme.colorScheme.primary), + context: context, + builder: (BuildContext context) { + return AlertDialog( + backgroundColor: context.theme.colorScheme.properSurface, + title: Text( + "Editing message...", + style: context.theme.textTheme.titleLarge, + ), + content: Container( + height: 70, + child: Center( + child: CircularProgressIndicator( + backgroundColor: context.theme.colorScheme.properSurface, + valueColor: AlwaysStoppedAnimation( + context.theme.colorScheme.primary), + ), ), ), - ), - ); - } - ); + ); + }); final updatedMessage = await backend.edit(message, newEdit, part); if (updatedMessage != null) { - ah.handleUpdatedMessage(chat, updatedMessage, null); + await ah.handleUpdatedMessage(chat, updatedMessage, null); } if (ns.isTabletMode(context)) { Get.close(1); @@ -178,26 +197,36 @@ class _MessageHolderState extends CustomState e.associatedMessageType == "sticker"); - final reactions = message.associatedMessages.where((e) => ReactionTypes.toList().contains(e.associatedMessageType?.replaceAll("-", ""))); + // Gesture callbacks can run while their element is being deactivated. + // Cache this inherited-state lookup during build instead of consulting a + // stale BuildContext from drag update/end/cancel callbacks. + final isInReplyScope = ReplyScope.maybeOf(context) != null; + final stickers = message.associatedMessages + .where((e) => e.associatedMessageType == "sticker"); + final reactions = message.associatedMessages.where((e) => + ReactionTypes.toList() + .contains(e.associatedMessageType?.replaceAll("-", ""))); Iterable stickersForPart(int part) { return stickers.where((s) => (s.associatedMessagePart ?? 0) == part); } + Iterable reactionsForPart(int part) { return reactions.where((s) => (s.associatedMessagePart ?? 0) == part); } + final replyTarget = replyTo; MessageWidgetController? replyController; if (replyTarget?.guid != null) { replyController = getActiveMwc(replyTarget!.guid!) ?? mwc(replyTarget); replyController.cvController ??= widget.cvController; } + /// Layout tree /// - Timestamp /// - Stack (see code comment) @@ -216,17 +245,27 @@ class _MessageHolderState extends CustomState Padding( - padding: const EdgeInsets.symmetric(vertical: 2.0), - child: Column( - mainAxisSize: MainAxisSize.min, - crossAxisAlignment: message.isFromMe! ? CrossAxisAlignment.end : CrossAxisAlignment.start, - children: [ - // add previous edits if needed - if (e.isEdited) - Padding( - padding: showAvatar || ss.settings.alwaysShowAvatars.value - ? EdgeInsets.only(left: 35.0 * ss.settings.avatarScale.value) : EdgeInsets.zero, - child: Obx(() => AnimatedSize( - duration: const Duration(milliseconds: 250), - alignment: Alignment.bottomCenter, - curve: controller.showEdits.value ? Curves.easeOutBack : Curves.easeOut, - child: controller.showEdits.value ? Opacity( - opacity: 0.75, - child: Column( - crossAxisAlignment: message.isFromMe! ? CrossAxisAlignment.end : CrossAxisAlignment.start, - mainAxisSize: MainAxisSize.min, - children: e.edits.map((edit) => ClipPath( - clipper: TailClipper( - isFromMe: message.isFromMe!, - showTail: message.showTail(newerMessage) && e.part == controller.parts.length - 1, - connectLower: iOS ? false : (e.part != 0 && e.part != controller.parts.length - 1) - || (e.part == 0 && controller.parts.length > 1), - connectUpper: iOS ? false : e.part != 0, - ), - child: TextBubble( - parentController: controller, - message: edit, + padding: const EdgeInsets.symmetric(vertical: 2.0), + child: Column( + mainAxisSize: MainAxisSize.min, + crossAxisAlignment: message.isFromMe! + ? CrossAxisAlignment.end + : CrossAxisAlignment.start, + children: [ + // add previous edits if needed + if (e.isEdited) + Padding( + padding: showAvatar || + ss.settings.alwaysShowAvatars.value + ? EdgeInsets.only( + left: 35.0 * + ss.settings.avatarScale.value) + : EdgeInsets.zero, + child: Obx(() => AnimatedSize( + duration: + const Duration(milliseconds: 250), + alignment: Alignment.bottomCenter, + curve: controller.showEdits.value + ? Curves.easeOutBack + : Curves.easeOut, + child: controller.showEdits.value + ? Opacity( + opacity: 0.75, + child: Column( + crossAxisAlignment: message + .isFromMe! + ? CrossAxisAlignment.end + : CrossAxisAlignment + .start, + mainAxisSize: + MainAxisSize.min, + children: e.edits + .map((edit) => ClipPath( + clipper: + TailClipper( + isFromMe: message + .isFromMe!, + showTail: message + .showTail( + newerMessage) && + e.part == + controller + .parts + .length - + 1, + connectLower: iOS + ? false + : (e.part != + 0 && + e.part != + controller.parts.length - + 1) || + (e.part == + 0 && + controller.parts.length > + 1), + connectUpper: iOS + ? false + : e.part != 0, + ), + child: TextBubble( + parentController: + controller, + message: edit, + ), + )) + .toList(), + ), + ) + : Container( + height: 0, + constraints: BoxConstraints( + maxWidth: ns.width( + context) * + MessageWidgetController + .maxBubbleSizeFactor - + 30)), + )), + ), + if (iOS && + index == 0 && + !widget.isReplyThread && + olderMessage != null && + message.threadOriginatorGuid != null && + message.showUpperMessage(olderMessage!) && + replyTarget != null && + replyController != null) + Padding( + padding: EdgeInsets.only( + left: (showAvatar || + ss.settings.alwaysShowAvatars + .value) && + replyTarget.isFromMe! + ? 35 + : 0), + child: DecoratedBox( + decoration: + replyTarget.isFromMe == message.isFromMe + ? ReplyLineDecoration( + isFromMe: message.isFromMe!, + color: context.theme.colorScheme + .properSurface, + connectUpper: false, + connectLower: true, + context: context, + ) + : const BoxDecoration(), + child: Container( + width: double.infinity, + alignment: replyTarget.isFromMe! + ? Alignment.centerRight + : Alignment.centerLeft, + child: ReplyBubble( + parentController: replyController, + part: replyTarget.guid! == + message.threadOriginatorGuid + ? message.normalizedThreadPart + : 0, + showAvatar: (chat.isGroup || + ss.settings.alwaysShowAvatars + .value || + !iOS) && + !replyTarget.isFromMe!, + cvController: widget.cvController, ), - )).toList(), - ), - ) : Container( - height: 0, - constraints: BoxConstraints( - maxWidth: ns.width(context) * MessageWidgetController.maxBubbleSizeFactor - 30 - )), - )), - ), - if (iOS && index == 0 && !widget.isReplyThread - && olderMessage != null - && message.threadOriginatorGuid != null - && message.showUpperMessage(olderMessage!) - && replyTarget != null - && replyController != null) - Padding( - padding: EdgeInsets.only(left: (showAvatar || ss.settings.alwaysShowAvatars.value) && replyTarget.isFromMe! ? 35 : 0), - child: DecoratedBox( - decoration: replyTarget.isFromMe == message.isFromMe ? ReplyLineDecoration( - isFromMe: message.isFromMe!, - color: context.theme.colorScheme.properSurface, - connectUpper: false, - connectLower: true, - context: context, - ) : const BoxDecoration(), - child: Container( - width: double.infinity, - alignment: replyTarget.isFromMe! ? Alignment.centerRight : Alignment.centerLeft, - child: ReplyBubble( - parentController: replyController, - part: replyTarget.guid! == message.threadOriginatorGuid ? message.normalizedThreadPart : 0, - showAvatar: (chat.isGroup || ss.settings.alwaysShowAvatars.value || !iOS) && !replyTarget.isFromMe!, - cvController: widget.cvController, + ), ), ), - ), - ), - // show sender, if needed - if (chat.isGroup - && !message.isFromMe! - && showSender - && e.part == (messageParts.firstWhereOrNull((e) => !e.isUnsent)?.part)) - Padding( - padding: showAvatar || ss.settings.alwaysShowAvatars.value - ? EdgeInsets.only(left: 35.0 * ss.settings.avatarScale.value) : EdgeInsets.zero, - child: MessageSender(olderMessage: olderMessage, message: message), - ), - // add a box to account for height of reactions - if ((messageParts.length == 1 && reactions.isNotEmpty) || reactionsForPart(e.part).isNotEmpty) - const SizedBox(height: 12.5), - if (!iOS && index == 0 && !widget.isReplyThread - && olderMessage != null - && message.threadOriginatorGuid != null - && replyTarget != null - && replyController != null) - Padding( - padding: showAvatar || ss.settings.alwaysShowAvatars.value - ? const EdgeInsets.only(left: 45.0, right: 10) : const EdgeInsets.symmetric(horizontal: 10), - child: DecoratedBox( - decoration: BoxDecoration( - borderRadius: BorderRadius.circular(25), - border: Border.fromBorderSide(BorderSide(color: context.theme.colorScheme.properSurface)), - ), - child: ReplyBubble( - parentController: replyController, - part: replyTarget.guid! == message.threadOriginatorGuid ? message.normalizedThreadPart : 0, - showAvatar: (chat.isGroup || ss.settings.alwaysShowAvatars.value || !iOS) - && !replyTarget.isFromMe!, - cvController: widget.cvController, + // show sender, if needed + if (chat.isGroup && + !message.isFromMe! && + showSender && + e.part == + (messageParts + .firstWhereOrNull((e) => !e.isUnsent) + ?.part)) + Padding( + padding: showAvatar || + ss.settings.alwaysShowAvatars.value + ? EdgeInsets.only( + left: 35.0 * + ss.settings.avatarScale.value) + : EdgeInsets.zero, + child: MessageSender( + olderMessage: olderMessage, + message: message), ), - ), - ), - Stack( - alignment: Alignment.bottomLeft, - children: [ - // avatar, if needed - if (message.showTail(newerMessage) - && e.part == controller.parts.length - 1 - && (showAvatar || ss.settings.alwaysShowAvatars.value) - && !message.isFromMe! && !message.isGroupEvent) + // add a box to account for height of reactions + if ((messageParts.length == 1 && + reactions.isNotEmpty) || + reactionsForPart(e.part).isNotEmpty) + const SizedBox(height: 12.5), + if (!iOS && + index == 0 && + !widget.isReplyThread && + olderMessage != null && + message.threadOriginatorGuid != null && + replyTarget != null && + replyController != null) Padding( - padding: const EdgeInsets.only(left: 5.0), - child: ContactAvatarWidget( - handle: message.handle, - size: iOS ? 30 : 35, - fontSize: context.theme.textTheme.bodyLarge!.fontSize!, - borderThickness: 0.1, + padding: showAvatar || + ss.settings.alwaysShowAvatars.value + ? const EdgeInsets.only( + left: 45.0, right: 10) + : const EdgeInsets.symmetric( + horizontal: 10), + child: DecoratedBox( + decoration: BoxDecoration( + borderRadius: BorderRadius.circular(25), + border: Border.fromBorderSide(BorderSide( + color: context.theme.colorScheme + .properSurface)), + ), + child: ReplyBubble( + parentController: replyController, + part: replyTarget.guid! == + message.threadOriginatorGuid + ? message.normalizedThreadPart + : 0, + showAvatar: (chat.isGroup || + ss.settings.alwaysShowAvatars + .value || + !iOS) && + !replyTarget.isFromMe!, + cvController: widget.cvController, + ), ), ), - Padding( - padding: (showAvatar || ss.settings.alwaysShowAvatars.value) && !(message.isGroupEvent || e.isUnsent) - ? EdgeInsets.only(left: 35.0 * ss.settings.avatarScale.value) : EdgeInsets.zero, - child: DecoratedBox( - decoration: iOS && !widget.isReplyThread && ((index == 0 && message.threadOriginatorGuid != null && olderMessage != null) - || (index == messageParts.length - 1 && service.struct.threads(message.guid!, index).isNotEmpty && newerMessage != null)) - ? ReplyLineDecoration( - isFromMe: message.isFromMe!, - color: context.theme.colorScheme.properSurface, - connectUpper: message.connectToUpper(), - connectLower: newerMessage != null && message.connectToLower(newerMessage!), - context: context, - ) : const BoxDecoration(), - child: Obx(() => GestureDetector( - behavior: HitTestBehavior.translucent, - onTap: widget.cvController.inSelectMode.value ? () { - if (widget.cvController.isSelected(message.guid!)) { - widget.cvController.selected.remove(message); - } else { - widget.cvController.selected.add(message); - } - } : message.threadOriginatorGuid != null && !widget.isReplyThread ? () { - showReplyThread(context, message, e, service, widget.cvController); - } : kIsDesktop || kIsWeb || iOS || material ? () => tapped.value = !tapped.value : null, - child: IgnorePointer( - ignoring: widget.cvController.inSelectMode.value, - child: Container( - width: double.infinity, - alignment: message.isFromMe! ? Alignment.centerRight : Alignment.centerLeft, - child: Row( - mainAxisSize: MainAxisSize.min, - children: [ - // show group event - if (message.isGroupEvent || e.isUnsent) - ChatEvent( - part: e, - message: message, - ), - if (samsung) - Padding( - padding: (messageParts.length == 1 && reactions.isNotEmpty) || reactionsForPart(e.part).isNotEmpty - ? EdgeInsets.only(left: message.isFromMe! ? 0 : 10, right: message.isFromMe! ? 20 : 0) - : const EdgeInsets.only(right: 10), - child: MessageTimestamp(controller: controller, cvController: widget.cvController), - ), - // otherwise show content - if (!message.isGroupEvent && !e.isUnsent) - Column( - crossAxisAlignment: message.isFromMe! ? CrossAxisAlignment.end : CrossAxisAlignment.start, - children: [ - // interactive messages may have subjects, so render them here - // also render the subject for attachments that may have not rendered already - if ((message.hasApplePayloadData || message.isLegacyUrlPreview || message.isInteractive - || (e.part == 0 && isNullOrEmpty(e.text) && e.attachments.isNotEmpty)) - && !isNullOrEmpty(message.subject)) - Padding( - padding: const EdgeInsets.only(bottom: 2.0), - child: ClipPath( - clipper: TailClipper( - isFromMe: message.isFromMe!, - showTail: false, - connectLower: iOS ? false : (e.part != 0 && e.part != controller.parts.length - 1) - || (e.part == 0 && controller.parts.length > 1), - connectUpper: iOS ? false : e.part != 0, - ), - child: TextBubble( - parentController: controller, - message: MessagePart( - subject: e.subject, - part: e.part, - ), - ), - ), - ), - Stack( - alignment: Alignment.center, - fit: StackFit.loose, - clipBehavior: Clip.none, - children: [ - // actual message content - BubbleEffects( + Stack( + alignment: Alignment.bottomLeft, + children: [ + // avatar, if needed + if (message.showTail(newerMessage) && + e.part == controller.parts.length - 1 && + (showAvatar || + ss.settings.alwaysShowAvatars + .value) && + !message.isFromMe! && + !message.isGroupEvent) + Padding( + padding: const EdgeInsets.only(left: 5.0), + child: ContactAvatarWidget( + handle: message.handle, + size: iOS ? 30 : 35, + fontSize: context.theme.textTheme + .bodyLarge!.fontSize!, + borderThickness: 0.1, + ), + ), + Padding( + padding: (showAvatar || + ss.settings.alwaysShowAvatars + .value) && + !(message.isGroupEvent || + e.isUnsent) + ? EdgeInsets.only( + left: 35.0 * + ss.settings.avatarScale.value) + : EdgeInsets.zero, + child: DecoratedBox( + decoration: iOS && + !widget.isReplyThread && + ((index == 0 && + message.threadOriginatorGuid != + null && + olderMessage != null) || + (index == + messageParts + .length - + 1 && + service.struct + .threads( + message.guid!, + index) + .isNotEmpty && + newerMessage != null)) + ? ReplyLineDecoration( + isFromMe: message.isFromMe!, + color: context.theme.colorScheme + .properSurface, + connectUpper: + message.connectToUpper(), + connectLower: + newerMessage != null && + message.connectToLower( + newerMessage!), + context: context, + ) + : const BoxDecoration(), + child: Obx( + () => GestureDetector( + behavior: + HitTestBehavior.translucent, + onTap: widget.cvController + .inSelectMode.value + ? () { + if (widget.cvController + .isSelected( + message.guid!)) { + widget + .cvController.selected + .remove(message); + } else { + widget + .cvController.selected + .add(message); + } + } + : message.threadOriginatorGuid != + null && + !widget.isReplyThread + ? () { + showReplyThread( + context, + message, + e, + service, + widget + .cvController); + } + : kIsDesktop || + kIsWeb || + iOS || + material + ? () => tapped.value = + !tapped.value + : null, + child: IgnorePointer( + ignoring: widget.cvController + .inSelectMode.value, + child: Container( + width: double.infinity, + alignment: message.isFromMe! + ? Alignment.centerRight + : Alignment.centerLeft, + child: Row( + mainAxisSize: + MainAxisSize.min, + children: [ + // show group event + if (message.isGroupEvent || + e.isUnsent) + ChatEvent( + part: e, message: message, - part: index, - globalKey: keys.length > index ? keys[index] : null, - showTail: message.showTail(newerMessage) && e.part == controller.parts.length - 1, - child: MessagePopupHolder( - key: keys.length > index ? keys[index] : null, - controller: controller, - cvController: widget.cvController, - part: e, - isEditing: isEditing(e.part), - child: GestureDetector( - behavior: HitTestBehavior.deferToChild, - onHorizontalDragUpdate: !canSwipeToReply || isEditing(e.part) ? null : (details) { - if (ReplyScope.maybeOf(context) != null) return; - final offset = replyOffsets[index]; - offset.value += details.delta.dx * 0.5; - if (message.isFromMe!) { - offset.value = offset.value.clamp(-double.infinity, 0); - } else { - offset.value = offset.value.clamp(0, double.infinity); - } - if (!gaveHapticFeedback && offset.value.abs() >= SlideToReply.replyThreshold) { - HapticFeedback.lightImpact(); - gaveHapticFeedback = true; - } else if (offset.value.abs() < SlideToReply.replyThreshold) { - gaveHapticFeedback = false; - } - }, - onHorizontalDragEnd: !canSwipeToReply || isEditing(e.part) ? null : (details) { - if (ReplyScope.maybeOf(context) != null) return; - final offset = replyOffsets[index]; - if (offset.value.abs() >= SlideToReply.replyThreshold) { - widget.cvController.replyToMessage = Tuple2(message, index); - } - offset.value = 0; - }, - onHorizontalDragCancel: !canSwipeToReply || isEditing(e.part) ? null : () { - if (ReplyScope.maybeOf(context) != null) return; - replyOffsets[index].value = 0; - }, - child: Builder(builder: (context) { - var child = ClipPath( - clipper: TailClipper( - isFromMe: message.isFromMe!, - showTail: message.showTail(newerMessage) && e.part == controller.parts.length - 1, - connectLower: iOS ? false : (e.part != 0 && e.part != controller.parts.length - 1) - || (e.part == 0 && controller.parts.length > 1), - connectUpper: iOS ? false : e.part != 0, + ), + if (samsung) + Padding( + padding: (messageParts + .length == + 1 && + reactions + .isNotEmpty) || + reactionsForPart( + e.part) + .isNotEmpty + ? EdgeInsets.only( + left: message + .isFromMe! + ? 0 + : 10, + right: message + .isFromMe! + ? 20 + : 0) + : const EdgeInsets + .only( + right: 10), + child: MessageTimestamp( + controller: + controller, + cvController: widget + .cvController), + ), + // otherwise show content + if (!message.isGroupEvent && + !e.isUnsent) + Column( + crossAxisAlignment: message + .isFromMe! + ? CrossAxisAlignment + .end + : CrossAxisAlignment + .start, + children: [ + // interactive messages may have subjects, so render them here + // also render the subject for attachments that may have not rendered already + if ((message.hasApplePayloadData || + message + .isLegacyUrlPreview || + message + .isInteractive || + (e.part == + 0 && + isNullOrEmpty(e + .text) && + e.attachments + .isNotEmpty)) && + !isNullOrEmpty( + message + .subject)) + Padding( + padding: + const EdgeInsets + .only( + bottom: + 2.0), + child: ClipPath( + clipper: + TailClipper( + isFromMe: message + .isFromMe!, + showTail: + false, + connectLower: iOS + ? false + : (e.part != 0 && e.part != controller.parts.length - 1) || + (e.part == 0 && + controller.parts.length > 1), + connectUpper: iOS + ? false + : e.part != + 0, + ), + child: + TextBubble( + parentController: + controller, + message: + MessagePart( + subject: e + .subject, + part: + e.part, + ), + ), ), - child: Stack( - alignment: Alignment.centerRight, - children: [ - message.hasApplePayloadData - || message.isLegacyUrlPreview - || message.isInteractive ? InteractiveHolder( - parentController: controller, - message: e, - ) : e.attachments.isEmpty - && (e.text != null || e.subject != null) ? TextBubble( - parentController: controller, - message: e, - ) : e.attachments.isNotEmpty ? AttachmentHolder( - parentController: controller, - message: e, - ) : const SizedBox.shrink(), - if (message.isFromMe!) - Obx(() { - final editStuff = widget.cvController.editing.firstWhereOrNull((e2) => e2.item1.guid == message.guid! && e2.item2.part == e.part); - return AnimatedSize( - duration: const Duration(milliseconds: 250), - alignment: Alignment.centerRight, - curve: Curves.easeOutBack, - child: editStuff == null ? const SizedBox.shrink() : Material( - color: Colors.transparent, - child: Container( - decoration: BoxDecoration( - color: !message.isBigEmoji - ? context.theme.colorScheme.primary - : context.theme.colorScheme.background, - ), - constraints: BoxConstraints( - maxWidth: ns.width(context) * MessageWidgetController.maxBubbleSizeFactor - 40, - minHeight: 40, - ), - padding: const EdgeInsets.only(right: 10).add(const EdgeInsets.all(5)), - child: Focus( - focusNode: FocusNode(), - onKeyEvent: (_, ev) { - if (ev is! KeyDownEvent) { - if (ev.logicalKey == LogicalKeyboardKey.tab) { // Absorb tab - return KeyEventResult.skipRemainingHandlers; - } - return KeyEventResult.ignored; - } - if (ev.logicalKey == LogicalKeyboardKey.enter && !HardwareKeyboard.instance.isShiftPressed) { - completeEdit(editStuff.item3.getFinalAnnotations(), e.part); - return KeyEventResult.handled; - } - if (ev.logicalKey == LogicalKeyboardKey.escape) { - widget.cvController.editing.removeWhere((e2) => e2.item1.guid == message.guid! && e2.item2.part == e.part); - if (widget.cvController.editing.isEmpty) { - widget.cvController.lastFocusedNode.requestFocus(); - } else { - widget.cvController.editing.last.item3.focusNode?.requestFocus(); - } - return KeyEventResult.handled; - } - if (ev.logicalKey == LogicalKeyboardKey.tab) { // Absorb tab - return KeyEventResult.skipRemainingHandlers; - } - return KeyEventResult.ignored; - }, - child: CallbackShortcuts( - bindings: editStuff.item3.getShortcuts(), - child: TextField( - textCapitalization: TextCapitalization.sentences, - autocorrect: true, - controller: editStuff.item3, - focusNode: editStuff.item3.focusNode, - scrollPhysics: const CustomBouncingScrollPhysics(), - style: context.theme.extension()!.bubbleText.apply( - fontSizeFactor: message.isBigEmoji ? 3 : 1, - color: context.theme.colorScheme.onPrimary, - ), - keyboardType: TextInputType.multiline, - maxLines: 14, - minLines: 1, - contextMenuBuilder: editStuff.item3.getContextMenuBuilder(), - autofocus: !(kIsDesktop || kIsWeb), - enableIMEPersonalizedLearning: !ss.settings.incognitoKeyboard.value, - textInputAction: ss.settings.sendWithReturn.value && !kIsWeb && !kIsDesktop - ? TextInputAction.send - : TextInputAction.newline, - cursorColor: context.theme.colorScheme.onPrimary, - cursorHeight: context.theme.extension()!.bubbleText.fontSize! * 1.25 * (message.isBigEmoji ? 3 : 1), - decoration: InputDecoration( - contentPadding: EdgeInsets.all(iOS ? 10 : 12.5), - isDense: true, - isCollapsed: true, - hintText: "Edited Message", - enabledBorder: OutlineInputBorder( - borderSide: BorderSide( - color: context.theme.colorScheme.onPrimary, - width: 1.5 - ), - borderRadius: BorderRadius.circular(20), - ), - border: OutlineInputBorder( - borderSide: BorderSide( - color: context.theme.colorScheme.onPrimary, - width: 1.5 - ), - borderRadius: BorderRadius.circular(20), - ), - focusedBorder: OutlineInputBorder( - borderSide: BorderSide( - color: context.theme.colorScheme.onPrimary, - width: 1.5 - ), - borderRadius: BorderRadius.circular(20), - ), - fillColor: Colors.transparent, - hintStyle: context.theme.extension()!.bubbleText.copyWith(color: context.theme.colorScheme.outline), - prefixIconConstraints: const BoxConstraints(minHeight: 0, minWidth: 40), - prefixIcon: IconButton( - constraints: const BoxConstraints(maxWidth: 27), - padding: const EdgeInsets.only(left: 5), - visualDensity: VisualDensity.compact, - icon: Icon( - CupertinoIcons.xmark_circle_fill, - color: context.theme.colorScheme.onPrimary, - size: 22, - ), - onPressed: () { - widget.cvController.editing.removeWhere((e2) => e2.item1.guid == message.guid! && e2.item2.part == e.part); - widget.cvController.lastFocusedNode.requestFocus(); - }, - iconSize: 22, - style: const ButtonStyle( - tapTargetSize: MaterialTapTargetSize.shrinkWrap, - visualDensity: VisualDensity.compact, - ), - ), - suffixIconConstraints: const BoxConstraints(minHeight: 0, minWidth: 40), - suffixIcon: ValueListenableBuilder( - valueListenable: editStuff.item3, - builder: (context, value, _) { - return Padding( - padding: const EdgeInsets.all(3.0), - child: TextButton( - style: TextButton.styleFrom( - backgroundColor: Colors.transparent, - shape: const CircleBorder(), - padding: const EdgeInsets.all(0), - maximumSize: const Size(27, 27), - minimumSize: const Size(27, 27), - tapTargetSize: MaterialTapTargetSize.shrinkWrap, - ), - child: AnimatedContainer( - duration: const Duration(milliseconds: 150), - constraints: const BoxConstraints(minHeight: 27, minWidth: 27), - decoration: BoxDecoration( - shape: iOS ? BoxShape.circle : BoxShape.rectangle, - color: !iOS ? null : editStuff.item3.text.isNotEmpty ? Colors.white : context.theme.colorScheme.outline, - ), - alignment: Alignment.center, - child: Icon( - iOS ? CupertinoIcons.arrow_up : Icons.send_outlined, - color: !iOS ? context.theme.extension()!.bubbleText.color : context.theme.colorScheme.bubble(context, chat.isIMessage), - size: iOS ? 18 : 26, - ), - ), - onPressed: () { - completeEdit(editStuff.item3.getFinalAnnotations(), e.part); - }, - ), - ); - }, - ), - ), - onTap: () { - HapticFeedback.selectionClick(); - }, - onSubmitted: (String value) { - completeEdit(editStuff.item3.getFinalAnnotations(), e.part); - }, - ), - ), - ), + ), + Stack( + alignment: Alignment + .center, + fit: StackFit.loose, + clipBehavior: + Clip.none, + children: [ + // actual message content + BubbleEffects( + message: + message, + part: index, + globalKey: + keys.length > + index + ? keys[ + index] + : null, + showTail: message + .showTail( + newerMessage) && + e.part == + controller.parts.length - + 1, + child: + MessagePopupHolder( + key: keys.length > + index + ? keys[ + index] + : null, + controller: + controller, + cvController: + widget + .cvController, + part: e, + isEditing: + isEditing( + e.part), + child: GestureDetector( + behavior: HitTestBehavior.deferToChild, + onHorizontalDragUpdate: !canSwipeToReply || isEditing(e.part) + ? null + : (details) { + if (isInReplyScope) { + return; + } + final offset = replyOffsets[index]; + offset.value += details.delta.dx * 0.5; + if (message.isFromMe!) { + offset.value = offset.value.clamp(-double.infinity, 0); + } else { + offset.value = offset.value.clamp(0, double.infinity); + } + if (!gaveHapticFeedback && offset.value.abs() >= SlideToReply.replyThreshold) { + HapticFeedback.lightImpact(); + gaveHapticFeedback = true; + } else if (offset.value.abs() < SlideToReply.replyThreshold) { + gaveHapticFeedback = false; + } + }, + onHorizontalDragEnd: !canSwipeToReply || isEditing(e.part) + ? null + : (details) { + if (isInReplyScope) { + return; + } + final offset = replyOffsets[index]; + if (offset.value.abs() >= SlideToReply.replyThreshold) { + widget.cvController.replyToMessage = Tuple2(message, index); + } + offset.value = 0; + }, + onHorizontalDragCancel: !canSwipeToReply || isEditing(e.part) + ? null + : () { + if (isInReplyScope) { + return; + } + replyOffsets[index].value = 0; + }, + child: Builder(builder: (context) { + final rawMessageContent = message.hasApplePayloadData || + message.isLegacyUrlPreview || + message.isInteractive + ? InteractiveHolder( + parentController: controller, + message: e, + ) + : e.attachments.isEmpty && (e.text != null || e.subject != null) + ? TextBubble( + parentController: controller, + message: e, + ) + : e.attachments.isNotEmpty + ? AttachmentHolder( + parentController: controller, + message: e, + ) + : const SizedBox.shrink(); + final messageContent = e.isEdited + ? GestureDetector( + behavior: HitTestBehavior.opaque, + onTap: controller.showEdits.toggle, + child: rawMessageContent, + ) + : rawMessageContent; + var child = + ClipPath( + clipper: + TailClipper( + isFromMe: + message.isFromMe!, + showTail: + message.showTail(newerMessage) && e.part == controller.parts.length - 1, + connectLower: iOS + ? false + : (e.part != 0 && e.part != controller.parts.length - 1) || (e.part == 0 && controller.parts.length > 1), + connectUpper: iOS + ? false + : e.part != 0, ), - ) - ); - }), - ], - ), - ); + child: + Stack( + alignment: + Alignment.centerRight, + children: [ + message.isFromMe! + ? Obx( + () => isEditing(e.part) ? const SizedBox.shrink() : messageContent, + ) + : messageContent, + if (message.isFromMe!) + Obx(() { + final editStuff = widget.cvController.editing.firstWhereOrNull((e2) => e2.item1.guid == message.guid! && e2.item2.part == e.part); + return AnimatedSize( + duration: const Duration(milliseconds: 250), + alignment: Alignment.centerRight, + curve: Curves.easeOutBack, + child: editStuff == null + ? const SizedBox.shrink() + : Material( + key: ValueKey("message-edit-${message.guid}-${e.part}"), + color: Colors.transparent, + child: MessageEditTapSurface( + focusNode: editStuff.item3.focusNode!, + child: Container( + decoration: BoxDecoration( + color: !message.isBigEmoji ? context.theme.colorScheme.primary : context.theme.colorScheme.background, + ), + constraints: BoxConstraints( + maxWidth: ns.width(context) * MessageWidgetController.maxBubbleSizeFactor - 40, + maxHeight: MediaQuery.sizeOf(context).height * 0.5, + minHeight: 40, + ), + padding: const EdgeInsets.only(right: 10).add(const EdgeInsets.all(5)), + child: Focus( + onKeyEvent: (_, ev) { + if (ev is! KeyDownEvent) { + if (ev.logicalKey == LogicalKeyboardKey.tab) { + // Absorb tab + return KeyEventResult.skipRemainingHandlers; + } + return KeyEventResult.ignored; + } + if (ev.logicalKey == LogicalKeyboardKey.enter && !HardwareKeyboard.instance.isShiftPressed) { + completeEdit(editStuff.item3.getFinalAnnotations(), e.part); + return KeyEventResult.handled; + } + if (ev.logicalKey == LogicalKeyboardKey.escape) { + widget.cvController.stopEditing( + message.guid!, + e.part, + restoreInputFocus: true, + ); + return KeyEventResult.handled; + } + if (ev.logicalKey == LogicalKeyboardKey.tab) { + // Absorb tab + return KeyEventResult.skipRemainingHandlers; + } + return KeyEventResult.ignored; + }, + child: CallbackShortcuts( + bindings: editStuff.item3.getShortcuts(), + child: TextField( + textCapitalization: TextCapitalization.sentences, + autocorrect: true, + controller: editStuff.item3, + focusNode: editStuff.item3.focusNode, + scrollPhysics: const CustomBouncingScrollPhysics(), + style: context.theme.extension()!.bubbleText.apply( + fontSizeFactor: message.isBigEmoji ? 3 : 1, + color: context.theme.colorScheme.onPrimary, + ), + keyboardType: TextInputType.multiline, + maxLines: null, + minLines: 1, + contextMenuBuilder: editStuff.item3.getContextMenuBuilder(), + autofocus: !(kIsDesktop || kIsWeb), + enableIMEPersonalizedLearning: !ss.settings.incognitoKeyboard.value, + textInputAction: ss.settings.sendWithReturn.value && !kIsWeb && !kIsDesktop ? TextInputAction.send : TextInputAction.newline, + cursorColor: context.theme.colorScheme.onPrimary, + cursorHeight: context.theme.extension()!.bubbleText.fontSize! * 1.25 * (message.isBigEmoji ? 3 : 1), + decoration: InputDecoration( + contentPadding: EdgeInsets.all(iOS ? 10 : 12.5), + isDense: true, + isCollapsed: true, + hintText: "Edited Message", + enabledBorder: OutlineInputBorder( + borderSide: BorderSide(color: context.theme.colorScheme.onPrimary, width: 1.5), + borderRadius: BorderRadius.circular(20), + ), + border: OutlineInputBorder( + borderSide: BorderSide(color: context.theme.colorScheme.onPrimary, width: 1.5), + borderRadius: BorderRadius.circular(20), + ), + focusedBorder: OutlineInputBorder( + borderSide: BorderSide(color: context.theme.colorScheme.onPrimary, width: 1.5), + borderRadius: BorderRadius.circular(20), + ), + fillColor: Colors.transparent, + hintStyle: context.theme.extension()!.bubbleText.copyWith(color: context.theme.colorScheme.outline), + prefixIconConstraints: const BoxConstraints(minHeight: 0, minWidth: 40), + prefixIcon: IconButton( + constraints: const BoxConstraints(maxWidth: 27), + padding: const EdgeInsets.only(left: 5), + visualDensity: VisualDensity.compact, + icon: Icon( + CupertinoIcons.xmark_circle_fill, + color: context.theme.colorScheme.onPrimary, + size: 22, + ), + onPressed: () { + widget.cvController.stopEditing( + message.guid!, + e.part, + restoreInputFocus: true, + ); + }, + iconSize: 22, + style: const ButtonStyle( + tapTargetSize: MaterialTapTargetSize.shrinkWrap, + visualDensity: VisualDensity.compact, + ), + ), + suffixIconConstraints: const BoxConstraints(minHeight: 0, minWidth: 40), + suffixIcon: ValueListenableBuilder( + valueListenable: editStuff.item3, + builder: (context, value, _) { + return Padding( + padding: const EdgeInsets.all(3.0), + child: TextButton( + style: TextButton.styleFrom( + backgroundColor: Colors.transparent, + shape: const CircleBorder(), + padding: const EdgeInsets.all(0), + maximumSize: const Size(27, 27), + minimumSize: const Size(27, 27), + tapTargetSize: MaterialTapTargetSize.shrinkWrap, + ), + child: AnimatedContainer( + duration: const Duration(milliseconds: 150), + constraints: const BoxConstraints(minHeight: 27, minWidth: 27), + decoration: BoxDecoration( + shape: iOS ? BoxShape.circle : BoxShape.rectangle, + color: !iOS + ? null + : editStuff.item3.text.isNotEmpty + ? Colors.white + : context.theme.colorScheme.outline, + ), + alignment: Alignment.center, + child: Icon( + iOS ? CupertinoIcons.arrow_up : Icons.send_outlined, + color: !iOS ? context.theme.extension()!.bubbleText.color : context.theme.colorScheme.bubble(context, chat.isIMessage), + size: iOS ? 18 : 26, + ), + ), + onPressed: () { + completeEdit(editStuff.item3.getFinalAnnotations(), e.part); + }, + ), + ); + }, + ), + ), + onTap: () { + HapticFeedback.selectionClick(); + }, + onSubmitted: (String value) { + completeEdit(editStuff.item3.getFinalAnnotations(), e.part); + }, + ), + ), + ), + ), + ), + )); + }), + ], + ), + ); - return message.dateScheduled != null ? DottedBorder( - customPath: (size) => TailClipper( - isFromMe: message.isFromMe!, - showTail: message.showTail(newerMessage) && e.part == controller.parts.length - 1, - connectLower: iOS ? false : (e.part != 0 && e.part != controller.parts.length - 1) - || (e.part == 0 && controller.parts.length > 1), - connectUpper: iOS ? false : e.part != 0, - ).getClip(size), - color: context.theme.colorScheme.primaryContainer, - strokeWidth: 2, - dashPattern: [7, 4], - child: child, - ) : child; - }) - - + return message.dateScheduled != + null + ? DottedBorder( + customPath: (size) => TailClipper( + isFromMe: message.isFromMe!, + showTail: message.showTail(newerMessage) && e.part == controller.parts.length - 1, + connectLower: iOS ? false : (e.part != 0 && e.part != controller.parts.length - 1) || (e.part == 0 && controller.parts.length > 1), + connectUpper: iOS ? false : e.part != 0, + ).getClip(size), + color: context.theme.colorScheme.primaryContainer, + strokeWidth: 2, + dashPattern: [ + 7, + 4 + ], + child: child, + ) + : child; + })), + ), + ), + // show stickers on top + if ((messageParts + .length == + 1 + ? stickers + : stickersForPart( + e.part)) + .isNotEmpty) + StickerHolder( + stickerMessages: messageParts + .length == + 1 + ? stickers + : stickersForPart( + e.part), + controller: widget + .cvController, + ), + // show reactions on top + if (message + .isFromMe!) + Positioned( + top: -14, + left: -20, + child: + ReactionHolder( + reactions: messageParts.length == + 1 + ? reactions + : reactionsForPart( + e.part), + message: + message, + ), + ), + if (!message + .isFromMe!) + Positioned( + top: -14, + right: -20, + child: + ReactionHolder( + reactions: messageParts.length == + 1 + ? reactions + : reactionsForPart( + e.part), + message: + message, + ), + ), + ], ), - ), + ], ), - // show stickers on top - if ((messageParts.length == 1 ? stickers : stickersForPart(e.part)).isNotEmpty) - StickerHolder( - stickerMessages: messageParts.length == 1 ? stickers : stickersForPart(e.part), - controller: widget.cvController, - ), - // show reactions on top - if (message.isFromMe!) - Positioned( - top: -14, - left: -20, - child: ReactionHolder( - reactions: messageParts.length == 1 ? reactions : reactionsForPart(e.part), - message: message, - ), - ), - if (!message.isFromMe!) - Positioned( - top: -14, - right: -20, - child: ReactionHolder( - reactions: messageParts.length == 1 ? reactions : reactionsForPart(e.part), - message: message, - ), - ), - ], - ), - ], + // swipe to reply + if (canSwipeToReply && + !message.isGroupEvent && + !e.isUnsent) + Obx(() => SlideToReply( + width: replyOffsets[ + index] + .value + .abs(), + isFromMe: message + .isFromMe!)), + ].conditionalReverse( + message.isFromMe!), + ), ), - // swipe to reply - if (canSwipeToReply && !message.isGroupEvent && !e.isUnsent) - Obx(() => SlideToReply(width: replyOffsets[index].value.abs(), isFromMe: message.isFromMe!)), - ].conditionalReverse(message.isFromMe!), - ), - ), - ), + ), + ), + )), ), - )), + ], + ), + // message properties (replies, edits, effect) + Padding( + padding: showAvatar || + ss.settings.alwaysShowAvatars.value + ? EdgeInsets.only( + left: 35.0 * + ss.settings.avatarScale.value) + : EdgeInsets.zero, + child: MessageProperties( + globalKey: keys.length > index + ? keys[index] + : null, + parentController: controller, + part: e), ), ], ), - // message properties (replies, edits, effect) - Padding( - padding: showAvatar || ss.settings.alwaysShowAvatars.value - ? EdgeInsets.only(left: 35.0 * ss.settings.avatarScale.value) : EdgeInsets.zero, - child: MessageProperties( - globalKey: keys.length > index ? keys[index] : null, - parentController: controller, - part: e - ), - ), - ], - ), - )), + )), // delivered / read receipt - Obx(() => DeliveredIndicator(parentController: controller, forceShow: tapped.value)), + Obx(() => DeliveredIndicator( + parentController: controller, forceShow: tapped.value)), ], ), ), if (message.isFromMe! && !message.isGroupEvent) - SelectCheckbox(message: message, controller: widget.cvController), + SelectCheckbox( + message: message, controller: widget.cvController), Obx(() { if (message.error > 0 || message.guid!.startsWith("error-")) { int errorCode = message.error; String errorText = "An unknown internal error occurred."; if (errorCode == 22) { - errorText = "The recipient is not registered with iMessage!"; + errorText = + "The recipient is not registered with iMessage!"; } else if (message.guid!.startsWith("error-")) { errorText = errorFromGuid(message.guid!); } return IconButton( icon: Icon( - iOS ? CupertinoIcons.exclamationmark_circle : Icons.error_outline, + iOS + ? CupertinoIcons.exclamationmark_circle + : Icons.error_outline, color: context.theme.colorScheme.error, ), onPressed: () { @@ -782,15 +1139,19 @@ class _MessageHolderState extends CustomState[ TextButton( - child: Text( - "Retry", - style: context.theme.textTheme.bodyLarge!.copyWith(color: Get.context!.theme.colorScheme.primary) - ), + child: Text("Retry", + style: context.theme.textTheme.bodyLarge! + .copyWith( + color: Get.context!.theme + .colorScheme.primary)), onPressed: () async { // Remove the original message and notification Navigator.of(context).pop(); @@ -822,10 +1183,11 @@ class _MessageHolderState extends CustomState latest = Chat.getMessages(chat, limit: 1); + List latest = + Chat.getMessages(chat, limit: 1); chat.latestMessage = latest.first; chat.save(); }, ), TextButton( - child: Text( - "Cancel", - style: context.theme.textTheme.bodyLarge!.copyWith(color: Get.context!.theme.colorScheme.primary) - ), + child: Text("Cancel", + style: context.theme.textTheme.bodyLarge! + .copyWith( + color: Get.context!.theme + .colorScheme.primary)), onPressed: () async { Navigator.of(context).pop(); await notif.clearFailedToSend(chat.id!); @@ -860,7 +1224,8 @@ class _MessageHolderState extends CustomState createState() => _MessagePopupState(); } -class _MessagePopupState extends OptimizedState with SingleTickerProviderStateMixin { +class _MessagePopupState extends OptimizedState + with SingleTickerProviderStateMixin { late final AnimationController controller = AnimationController( vsync: this, duration: const Duration(milliseconds: 150), @@ -83,15 +83,19 @@ class _MessagePopupState extends OptimizedState with SingleTickerP final double itemHeight = kIsDesktop || kIsWeb ? 56 : 48; List reactions = []; - late double messageOffset = Get.height - widget.childPosition.dy - widget.size.height; + late double messageOffset = + Get.height - widget.childPosition.dy - widget.size.height; late double materialOffset = widget.childPosition.dy + EdgeInsets.fromViewPadding( View.of(context).viewInsets, View.of(context).devicePixelRatio, ).bottom; late int numberToShow = 5; - late Chat? dmChat = chats.chats - .firstWhereOrNull((chat) => !chat.isGroup && chat.participants.firstWhereOrNull((handle) => handle.address == message.handle?.address) != null); + late Chat? dmChat = chats.chats.firstWhereOrNull((chat) => + !chat.isGroup && + chat.participants.firstWhereOrNull( + (handle) => handle.address == message.handle?.address) != + null); String? selfReaction; String? currentlySelectedReaction = "init"; @@ -105,13 +109,19 @@ class _MessagePopupState extends OptimizedState with SingleTickerP Message get message => widget.controller.message; - bool get isSent => !message.guid!.startsWith('temp') && !message.guid!.startsWith('error'); + bool get isSent => + !message.guid!.startsWith('temp') && !message.guid!.startsWith('error'); bool get showDownload => - (isSent && part.attachments.isNotEmpty && part.attachments.where((element) => as.getContent(element) is PlatformFile).isNotEmpty) || + (isSent && + part.attachments.isNotEmpty && + part.attachments + .where((element) => as.getContent(element) is PlatformFile) + .isNotEmpty) || isEmbeddedMedia; - late bool isEmbeddedMedia = (message.balloonBundleId == "com.apple.Handwriting.HandwritingProvider" || + late bool isEmbeddedMedia = (message.balloonBundleId == + "com.apple.Handwriting.HandwritingProvider" || message.balloonBundleId == "com.apple.DigitalTouchBalloonProvider") && File(message.interactiveMediaPath!).existsSync(); @@ -129,7 +139,9 @@ class _MessagePopupState extends OptimizedState with SingleTickerP super.initState(); controller.forward(); if (iOS) { - final remainingHeight = max(Get.height - Get.statusBarHeight - 135 - widget.size.height, itemHeight); + final remainingHeight = max( + Get.height - Get.statusBarHeight - 135 - widget.size.height, + itemHeight); numberToShow = min(remainingHeight ~/ itemHeight, 5); } else { // Potentially make this dynamic in the future @@ -139,17 +151,21 @@ class _MessagePopupState extends OptimizedState with SingleTickerP updateObx(() { currentlySelectedReaction = null; reactions = getUniqueReactionMessages(message.associatedMessages - .where((e) => ReactionTypes.toList().contains(e.associatedMessageType?.replaceAll("-", "")) && (e.associatedMessagePart ?? 0) == part.part) + .where((e) => + ReactionTypes.toList() + .contains(e.associatedMessageType?.replaceAll("-", "")) && + (e.associatedMessagePart ?? 0) == part.part) .toList()); final reaction = reactions.firstWhereOrNull((e) => e.isFromMe!); final myReact = reaction?.associatedMessageType; if (!(myReact?.contains("-") ?? true)) { - selfReaction = myReact == "emoji" ? reaction!.associatedMessageEmoji : myReact; + selfReaction = + myReact == "emoji" ? reaction!.associatedMessageEmoji : myReact; currentlySelectedReaction = selfReaction; } (() async { - var reactions = await getReactionList(); + var reactions = await getReactionList(); setState(() { reactOptions = reactions; if (reactions.length == 6) { @@ -183,9 +199,13 @@ class _MessagePopupState extends OptimizedState with SingleTickerP Future> getReactionList() async { final recentEmojis = await EmojiPickerUtils().getRecentEmojis(); - var reactions = ReactionTypes.toList().where((i) => ReactionTypes.reactionToEmoji.containsKey(i)).toList(); + var reactions = ReactionTypes.toList() + .where((i) => ReactionTypes.reactionToEmoji.containsKey(i)) + .toList(); - if (currentlySelectedReaction != "init" && currentlySelectedReaction != null && !reactions.contains(currentlySelectedReaction)) { + if (currentlySelectedReaction != "init" && + currentlySelectedReaction != null && + !reactions.contains(currentlySelectedReaction)) { reactions.add(currentlySelectedReaction!); // add current reaction } @@ -202,14 +222,15 @@ class _MessagePopupState extends OptimizedState with SingleTickerP reactions.add(emoji); } - - return reactions; } void reactEmoji(String emoji) { HapticFeedback.lightImpact(); - widget.sendTapback(selfReaction == emoji ? "-${ReactionTypes.EMOJI}" : ReactionTypes.EMOJI, emoji, part.part); + widget.sendTapback( + selfReaction == emoji ? "-${ReactionTypes.EMOJI}" : ReactionTypes.EMOJI, + emoji, + part.part); popDetails(); } @@ -232,47 +253,63 @@ class _MessagePopupState extends OptimizedState with SingleTickerP @override Widget build(BuildContext context) { - double narrowWidth = message.isFromMe! || !ss.settings.alwaysShowAvatars.value ? 330 : 360; + double narrowWidth = + message.isFromMe! || !ss.settings.alwaysShowAvatars.value ? 330 : 360; bool narrowScreen = ns.width(widthContext) < narrowWidth; return AnnotatedRegion( value: SystemUiOverlayStyle( - systemNavigationBarColor: ss.settings.immersiveMode.value ? Colors.transparent : context.theme.colorScheme.background, // navigation bar color - systemNavigationBarIconBrightness: context.theme.colorScheme.brightness.opposite, + systemNavigationBarColor: ss.settings.immersiveMode.value + ? Colors.transparent + : context.theme.colorScheme.background, // navigation bar color + systemNavigationBarIconBrightness: + context.theme.colorScheme.brightness.opposite, statusBarColor: Colors.transparent, // status bar color statusBarIconBrightness: context.theme.colorScheme.brightness.opposite, ), child: Theme( data: context.theme.copyWith( // in case some components still use legacy theming - primaryColor: context.theme.colorScheme.bubble(context, chat.isIMessage), + primaryColor: + context.theme.colorScheme.bubble(context, chat.isIMessage), colorScheme: context.theme.colorScheme.copyWith( primary: context.theme.colorScheme.bubble(context, chat.isIMessage), - onPrimary: context.theme.colorScheme.onBubble(context, chat.isIMessage), - surface: - ss.settings.monetTheming.value == Monet.full ? null : (context.theme.extensions[BubbleColors] as BubbleColors?)?.receivedBubbleColor, + onPrimary: + context.theme.colorScheme.onBubble(context, chat.isIMessage), + surface: ss.settings.monetTheming.value == Monet.full + ? null + : (context.theme.extensions[BubbleColors] as BubbleColors?) + ?.receivedBubbleColor, onSurface: ss.settings.monetTheming.value == Monet.full ? null - : (context.theme.extensions[BubbleColors] as BubbleColors?)?.onReceivedBubbleColor, + : (context.theme.extensions[BubbleColors] as BubbleColors?) + ?.onReceivedBubbleColor, ), ), child: TitleBarWrapper( child: Scaffold( extendBodyBehindAppBar: true, - backgroundColor: kIsDesktop && iOS && ss.settings.windowEffect.value != WindowEffect.disabled + backgroundColor: kIsDesktop && + iOS && + ss.settings.windowEffect.value != WindowEffect.disabled ? context.theme.colorScheme.properSurface.withOpacity(0.6) : Colors.transparent, appBar: iOS ? null : AppBar( - backgroundColor: context.theme.colorScheme.background.oppositeLightenOrDarken(5), + backgroundColor: context.theme.colorScheme.background + .oppositeLightenOrDarken(5), systemOverlayStyle: - context.theme.colorScheme.brightness == Brightness.dark ? SystemUiOverlayStyle.light : SystemUiOverlayStyle.dark, + context.theme.colorScheme.brightness == + Brightness.dark + ? SystemUiOverlayStyle.light + : SystemUiOverlayStyle.dark, automaticallyImplyLeading: false, leadingWidth: 40, toolbarHeight: kIsDesktop ? 80 : null, leading: Padding( - padding: EdgeInsets.only(top: kIsDesktop ? 20 : 0, left: 10.0), + padding: EdgeInsets.only( + top: kIsDesktop ? 20 : 0, left: 10.0), child: BackButton( color: context.theme.colorScheme.onBackground, onPressed: () { @@ -282,7 +319,7 @@ class _MessagePopupState extends OptimizedState with SingleTickerP ), ), actions: buildMaterialDetailsMenu(context), - ), + ), body: Stack( fit: StackFit.expand, children: [ @@ -290,13 +327,25 @@ class _MessagePopupState extends OptimizedState with SingleTickerP onTap: popDetails, child: iOS ? (ss.settings.highPerfMode.value - ? Container(color: context.theme.colorScheme.background.withOpacity(0.8)) + ? Container( + color: context.theme.colorScheme.background + .withOpacity(0.8)) : BackdropFilter( filter: ImageFilter.blur( - sigmaX: kIsDesktop && ss.settings.windowEffect.value != WindowEffect.disabled ? 10 : 30, - sigmaY: kIsDesktop && ss.settings.windowEffect.value != WindowEffect.disabled ? 10 : 30), + sigmaX: kIsDesktop && + ss.settings.windowEffect.value != + WindowEffect.disabled + ? 10 + : 30, + sigmaY: kIsDesktop && + ss.settings.windowEffect.value != + WindowEffect.disabled + ? 10 + : 30), child: Container( - color: context.theme.colorScheme.properSurface.withOpacity(0.3), + color: context + .theme.colorScheme.properSurface + .withOpacity(0.3), ), )) : null, @@ -311,12 +360,17 @@ class _MessagePopupState extends OptimizedState with SingleTickerP tween: Tween(begin: 0.8, end: 1), curve: Curves.easeOutBack, duration: const Duration(milliseconds: 500), - child: ConstrainedBox(constraints: BoxConstraints(maxWidth: widget.size.width), child: widget.child), + child: ConstrainedBox( + constraints: + BoxConstraints(maxWidth: widget.size.width), + child: widget.child), builder: (context, size, child) { return Transform.scale( scale: size.clamp(1, double.infinity), child: child, - alignment: message.isFromMe! ? Alignment.centerRight : Alignment.centerLeft, + alignment: message.isFromMe! + ? Alignment.centerRight + : Alignment.centerLeft, ); }, ), @@ -330,27 +384,52 @@ class _MessagePopupState extends OptimizedState with SingleTickerP duration: const Duration(milliseconds: 500), curve: Sprung.underDamped, alignment: Alignment.center, - child: reactions.isNotEmpty ? ReactionDetails(reactions: reactions) : const SizedBox.shrink(), + child: reactions.isNotEmpty + ? ReactionDetails(reactions: reactions) + : const SizedBox.shrink(), ), ), - if (ss.settings.enablePrivateAPI.value && isSent && minSierra && message.dateScheduled == null) + if (ss.settings.enablePrivateAPI.value && + isSent && + minSierra && + message.dateScheduled == null) Positioned( - bottom: (iOS ? itemHeight * numberToShow + 35 + widget.size.height : context.height - materialOffset) - .clamp(0, context.height - (narrowScreen ? 200 : 125)), - right: message.isFromMe! ? max(15, widget.size.width - emojiPickerSize + 65) : null, - left: !message.isFromMe! ? max(widget.childPosition.dx + 10, widget.childPosition.dx + widget.size.width - emojiPickerSize + 65) : null, + bottom: (iOS + ? itemHeight * numberToShow + + 35 + + widget.size.height + : context.height - materialOffset) + .clamp( + 0, context.height - (narrowScreen ? 200 : 125)), + right: message.isFromMe! + ? max(15, widget.size.width - emojiPickerSize + 65) + : null, + left: !message.isFromMe! + ? max( + widget.childPosition.dx + 10, + widget.childPosition.dx + + widget.size.width - + emojiPickerSize + + 65) + : null, child: AnimatedSize( curve: Curves.easeInOut, - alignment: message.isFromMe! ? Alignment.centerRight : Alignment.centerLeft, + alignment: message.isFromMe! + ? Alignment.centerRight + : Alignment.centerLeft, duration: const Duration(milliseconds: 250), child: currentlySelectedReaction == "init" ? const SizedBox(height: 80) : ClipShadowPath( shadow: iOS ? BoxShadow( - color: context.theme.colorScheme.properSurface.withAlpha(iOS ? 150 : 255).lightenOrDarken(iOS ? 0 : 10)) + color: context + .theme.colorScheme.properSurface + .withAlpha(iOS ? 150 : 255) + .lightenOrDarken(iOS ? 0 : 10)) : BoxShadow( - color: context.theme.colorScheme.shadow, + color: + context.theme.colorScheme.shadow, blurRadius: 2, ), clipper: ReactionPickerClipper( @@ -358,86 +437,167 @@ class _MessagePopupState extends OptimizedState with SingleTickerP isFromMe: message.isFromMe!, ), child: BackdropFilter( - filter: ImageFilter.blur(sigmaX: 15, sigmaY: 15), + filter: ImageFilter.blur( + sigmaX: 15, sigmaY: 15), child: Container( - padding: const EdgeInsets.all(5).add(const EdgeInsets.only(bottom: 15)), - color: context.theme.colorScheme.properSurface.lightenOrDarken(iOS ? 0 : 10), + padding: const EdgeInsets.all(5).add( + const EdgeInsets.only(bottom: 15)), + color: context + .theme.colorScheme.properSurface + .lightenOrDarken(iOS ? 0 : 10), width: emojiPickerSize.toDouble(), child: ShaderMask( shaderCallback: (Rect rect) { return LinearGradient( - begin: Alignment.centerLeft, - end: Alignment.centerRight, - colors: [Colors.transparent, emojiMode == 2 ? Colors.purple : Colors.transparent], - stops: [0.9, 1.0], // 10% purple, 80% transparent, 10% purple - ).createShader(rect); + begin: Alignment.centerLeft, + end: Alignment.centerRight, + colors: [ + Colors.transparent, + emojiMode == 2 + ? Colors.purple + : Colors.transparent + ], + stops: [ + 0.9, + 1.0 + ], // 10% purple, 80% transparent, 10% purple + ).createShader(rect); }, blendMode: BlendMode.dstOut, - child: - SingleChildScrollView( - scrollDirection: Axis.horizontal, - padding: emojiMode == 2 ? const EdgeInsets.only(right: 25) : EdgeInsets.zero, - child: Row( - children: reactOptions - .map((e) { + child: SingleChildScrollView( + scrollDirection: Axis.horizontal, + padding: emojiMode == 2 + ? const EdgeInsets.only(right: 25) + : EdgeInsets.zero, + child: Row( + children: reactOptions.map((e) { return Padding( - padding: iOS ? const EdgeInsets.all(5.0) : const EdgeInsets.symmetric(horizontal: 5), + padding: iOS + ? const EdgeInsets.all(5.0) + : const EdgeInsets + .symmetric( + horizontal: 5), child: Material( - color: currentlySelectedReaction == e ? context.theme.colorScheme.primary : Colors.transparent, - borderRadius: BorderRadius.circular(20), + color: + currentlySelectedReaction == + e + ? context + .theme + .colorScheme + .primary + : Colors.transparent, + borderRadius: + BorderRadius.circular(20), child: SizedBox( width: iOS ? 35 : null, height: iOS ? 35 : null, child: InkWell( - borderRadius: BorderRadius.circular(20), + borderRadius: + BorderRadius.circular( + 20), onTap: () { - if (currentlySelectedReaction == e) { - currentlySelectedReaction = null; + if (currentlySelectedReaction == + e) { + currentlySelectedReaction = + null; } else { - currentlySelectedReaction = e; + currentlySelectedReaction = + e; } setState(() {}); - if (ReactionTypes.toList().contains(e)) { - HapticFeedback.lightImpact(); - widget.sendTapback(selfReaction == e ? "-$e" : e, null, part.part); + if (ReactionTypes + .toList() + .contains(e)) { + HapticFeedback + .lightImpact(); + widget.sendTapback( + selfReaction == e + ? "-$e" + : e, + null, + part.part); popDetails(); } else { - if (selfReaction != e) { + if (selfReaction != + e) { (() async { // Add an emoji to recently used list or increase its counter - Emoji? emoji = emojiMap[e]; - if (emoji == null) { + Emoji? emoji = + emojiMap[e]; + if (emoji == + null) { outerLoop: - for (var category in defaultEmojiSet) { - for (var myEmoji in category.emoji) { - if (myEmoji.emoji == e) { - emojiMap[e] = myEmoji; - emoji = myEmoji; + for (var category + in defaultEmojiSet) { + for (var myEmoji + in category + .emoji) { + if (myEmoji + .emoji == + e) { + emojiMap[ + e] = + myEmoji; + emoji = + myEmoji; break outerLoop; } } } } - if (emoji != null) await EmojiPickerUtils().addEmojiToRecentlyUsed(key: GlobalKey(), emoji: emoji); + if (emoji != null) + await EmojiPickerUtils() + .addEmojiToRecentlyUsed( + key: + GlobalKey(), + emoji: + emoji); })(); } reactEmoji(e); } }, child: Padding( - padding: EdgeInsets.symmetric(horizontal: 6.5, vertical: iOS ? 4.5 : 6.5).add(EdgeInsets.only(right: e == "emphasize" ? 2.5 : 0)), + padding: EdgeInsets + .symmetric( + horizontal: + 6.5, + vertical: iOS + ? 4.5 + : 6.5) + .add(EdgeInsets.only( + right: e == + "emphasize" + ? 2.5 + : 0)), child: Center( - child: Builder(builder: (context) { + child: Builder( + builder: + (context) { final text = Text( - ReactionTypes.reactionToEmoji[e] ?? e ?? "X", - style: const TextStyle(fontSize: 18, fontFamily: 'Apple Color Emoji'), - textAlign: TextAlign.center, + ReactionTypes + .reactionToEmoji[ + e] ?? + e ?? + "X", + style: const TextStyle( + fontSize: 18, + fontFamily: + 'Apple Color Emoji'), + textAlign: + TextAlign + .center, ); // rotate thumbs down to match iOS - if (e == "dislike") { + if (e == + "dislike") { return Transform( - transform: Matrix4.identity()..rotateY(pi), - alignment: FractionalOffset.center, + transform: Matrix4 + .identity() + ..rotateY(pi), + alignment: + FractionalOffset + .center, child: text, ); } @@ -451,147 +611,235 @@ class _MessagePopupState extends OptimizedState with SingleTickerP ); }).toList(), ), - ), + ), ), ), ), ), ), ), - if (ss.settings.enablePrivateAPI.value && isSent && minSierra && message.dateScheduled == null) + if (ss.settings.enablePrivateAPI.value && + isSent && + minSierra && + message.dateScheduled == null) Positioned( - bottom: (iOS ? itemHeight * numberToShow + 5 + widget.size.height : context.height - materialOffset - 30) - .clamp(0, context.height - (narrowScreen ? 200 : 125)), - right: message.isFromMe! ? widget.size.width + 10 + (iOS ? 0 : 60) : null, - left: !message.isFromMe! ? widget.childPosition.dx + widget.size.width + 10 + (iOS ? 0 : 60) : null, + bottom: (iOS + ? itemHeight * numberToShow + + 5 + + widget.size.height + : context.height - materialOffset - 30) + .clamp( + 0, context.height - (narrowScreen ? 200 : 125)), + right: message.isFromMe! + ? widget.size.width + 10 + (iOS ? 0 : 60) + : null, + left: !message.isFromMe! + ? widget.childPosition.dx + + widget.size.width + + 10 + + (iOS ? 0 : 60) + : null, child: AnimatedSize( curve: Curves.easeInOut, - alignment: message.isFromMe! ? Alignment.centerRight : Alignment.centerLeft, + alignment: message.isFromMe! + ? Alignment.centerRight + : Alignment.centerLeft, duration: const Duration(milliseconds: 100), - child: currentlySelectedReaction == "init" ? const SizedBox(height: 80) : ClipPath( - clipper: ReactionClipper(isFromMe: message.isFromMe!), - child: Material( - color: context.theme.colorScheme.properSurface, - child: Container( - width: iosSize, - height: iosSize, - alignment: message.isFromMe! ? Alignment.topRight : Alignment.topLeft, - child: InkWell( - borderRadius: BorderRadius.circular(20), - onTap: () { - - - Widget content = Container( - width: 512, - child: Theme( - data: context.theme.copyWith(canvasColor: Colors.transparent), - child: EmojiPicker( - scrollController: ScrollController(), - config: Config( - height: 512, - checkPlatformCompatibility: true, - emojiViewConfig: EmojiViewConfig( - emojiSizeMax: 28, - backgroundColor: Colors.transparent, - columns: min(ns.width(context), 512) ~/ 56, - noRecents: Text("No Recents", style: context.textTheme.headlineMedium!.copyWith(color: context.theme.colorScheme.outline)) - ), - swapCategoryAndBottomBar: true, - skinToneConfig: const SkinToneConfig(enabled: false), - categoryViewConfig: const CategoryViewConfig( - backgroundColor: Colors.transparent, - dividerColor: Colors.transparent, - ), - bottomActionBarConfig: BottomActionBarConfig( - customBottomActionBar: (Config config, EmojiViewState state, VoidCallback showSearchView) { - return Container( - margin: const EdgeInsets.only(top: 10), - child: Row( - mainAxisSize: MainAxisSize.min, - children: [ - const SizedBox(width: 8), - Expanded( - child: Material( - child: InkWell( - onTap: showSearchView, - child: Padding( - padding: const EdgeInsets.all(12), - child: Row(children: [ - Icon( - iOS ? cupertino.CupertinoIcons.search : Icons.search, - color: context.theme.colorScheme.outline, - ), - const SizedBox(width: 8), - Expanded( - child: Text( - "Search...", - style: context.theme.textTheme.bodyLarge!.copyWith( - color: context.theme.colorScheme.outline, + clipper: ReactionClipper( + isFromMe: message.isFromMe!), + child: Material( + color: + context.theme.colorScheme.properSurface, + child: Container( + width: iosSize, + height: iosSize, + alignment: message.isFromMe! + ? Alignment.topRight + : Alignment.topLeft, + child: InkWell( + borderRadius: BorderRadius.circular(20), + onTap: () { + Widget content = Container( + width: 512, + child: Theme( + data: context.theme.copyWith( + canvasColor: + Colors.transparent), + child: EmojiPicker( + scrollController: + ScrollController(), + config: Config( + height: 512, + checkPlatformCompatibility: + true, + emojiViewConfig: EmojiViewConfig( + emojiSizeMax: 28, + backgroundColor: + Colors.transparent, + columns: min( + ns.width( + context), + 512) ~/ + 56, + noRecents: Text( + "No Recents", + style: context + .textTheme + .headlineMedium! + .copyWith( + color: context + .theme + .colorScheme + .outline))), + swapCategoryAndBottomBar: + true, + skinToneConfig: + const SkinToneConfig( + enabled: false), + categoryViewConfig: + const CategoryViewConfig( + backgroundColor: + Colors.transparent, + dividerColor: + Colors.transparent, + ), + bottomActionBarConfig: + BottomActionBarConfig( + customBottomActionBar: + (Config config, + EmojiViewState + state, + VoidCallback + showSearchView) { + return Container( + margin: + const EdgeInsets + .only( + top: 10), + child: Row( + mainAxisSize: + MainAxisSize + .min, + children: [ + const SizedBox( + width: 8), + Expanded( + child: Material( + child: + InkWell( + onTap: + showSearchView, + child: + Padding( + padding: const EdgeInsets + .all( + 12), + child: Row( + children: [ + Icon( + iOS ? cupertino.CupertinoIcons.search : Icons.search, + color: context.theme.colorScheme.outline, + ), + const SizedBox(width: 8), + Expanded( + child: Text( + "Search...", + style: context.theme.textTheme.bodyLarge!.copyWith( + color: context.theme.colorScheme.outline, + ), + ), + ), + ]), + ), + ), ), ), - ), - ]), - ), - ), - ), - ), - Padding( - padding: const EdgeInsets.all(12), - child: IconButton( - icon: Icon( - iOS ? cupertino.CupertinoIcons.xmark : Icons.close, - color: context.theme.colorScheme.outline, - ), - onPressed: () { - Get.back(); + Padding( + padding: + const EdgeInsets + .all( + 12), + child: + IconButton( + icon: Icon( + iOS + ? cupertino + .CupertinoIcons + .xmark + : Icons + .close, + color: context + .theme + .colorScheme + .outline, + ), + onPressed: + () { + Get.back(); + }, + ), + ), + const SizedBox( + width: 8), + ], + ), + ); }, ), + searchViewConfig: + SearchViewConfig( + backgroundColor: + Colors.transparent, + buttonIconColor: context + .theme + .colorScheme + .outline, + ), ), - const SizedBox(width: 8), - ], + onEmojiSelected: + (cat, emoji) { + Get.back(); + reactEmoji(emoji.emoji); + }, + ), + )); + Get.dialog( + AlertDialog( + backgroundColor: context.theme + .colorScheme.properSurface, + content: content, ), - ); - }, - ), - searchViewConfig: SearchViewConfig( - backgroundColor: Colors.transparent, - buttonIconColor: context.theme.colorScheme.outline, + name: 'Popup Menu'); + }, + child: const SizedBox( + width: iosSize * 0.8, + height: iosSize * 0.8, + child: Center( + child: Icon( + cupertino.CupertinoIcons.smiley, + size: 20), + ), ), ), - onEmojiSelected: (cat, emoji) { - Get.back(); - reactEmoji(emoji.emoji); - }, ), - ) - ); - Get.dialog( - AlertDialog( - backgroundColor: context.theme.colorScheme.properSurface, - content: content, - ), - name: 'Popup Menu'); - }, - child: const SizedBox( - width: iosSize*0.8, - height: iosSize*0.8, - child: Center( - child: Icon(cupertino.CupertinoIcons.smiley, size: 20), - ), - ), - ), - ), - ) - ), + )), ), ), if (iOS) Positioned( - right: message.isFromMe! ? max(15, widget.size.width - maxMenuWidth) : null, - left: !message.isFromMe! ? max(widget.childPosition.dx + 10, widget.childPosition.dx + widget.size.width - maxMenuWidth) : null, + right: message.isFromMe! + ? max(15, widget.size.width - maxMenuWidth) + : null, + left: !message.isFromMe! + ? max( + widget.childPosition.dx + 10, + widget.childPosition.dx + + widget.size.width - + maxMenuWidth) + : null, bottom: 30, child: TweenAnimationBuilder( tween: Tween(begin: 0.8, end: 1), @@ -600,7 +848,8 @@ class _MessagePopupState extends OptimizedState with SingleTickerP child: FadeTransition( opacity: CurvedAnimation( parent: controller, - curve: const Interval(0.0, .9, curve: Curves.ease), + curve: + const Interval(0.0, .9, curve: Curves.ease), reverseCurve: Curves.easeInCubic, ), child: Column( @@ -619,10 +868,16 @@ class _MessagePopupState extends OptimizedState with SingleTickerP }, ), ), - if (!iOS && ss.settings.enablePrivateAPI.value && minBigSur && chat.isIMessage && isSent) + if (!iOS && + ss.settings.enablePrivateAPI.value && + minBigSur && + chat.isIMessage && + isSent) Positioned( left: !message.isFromMe! - ? widget.childPosition.dx + widget.size.width + (reactions.isNotEmpty ? 20 : 5) + ? widget.childPosition.dx + + widget.size.width + + (reactions.isNotEmpty ? 20 : 5) : widget.childPosition.dx - 55, top: materialOffset, child: Material( @@ -634,7 +889,8 @@ class _MessagePopupState extends OptimizedState with SingleTickerP child: InkWell( borderRadius: BorderRadius.circular(20), onTap: reply, - child: const Center(child: Icon(Icons.reply, size: 20)), + child: const Center( + child: Icon(Icons.reply, size: 20)), ), ), ), @@ -664,10 +920,13 @@ class _MessagePopupState extends OptimizedState with SingleTickerP } if (content is PlatformFile) { popDetails(); - await as.saveToDisk(content, isDocument: part.attachments.first.mimeStart != "image" && part.attachments.first.mimeStart != "video"); + await as.saveToDisk(content, + isDocument: part.attachments.first.mimeStart != "image" && + part.attachments.first.mimeStart != "video"); } } catch (ex, trace) { - Logger.error("Error downloading attachment: ${ex.toString()}", error: ex, trace: trace); + Logger.error("Error downloading attachment: ${ex.toString()}", + error: ex, trace: trace); showSnackbar("Save Error", ex.toString()); } } @@ -679,7 +938,8 @@ class _MessagePopupState extends OptimizedState with SingleTickerP } Future openAttachmentWeb() async { - await launchUrlString("${part.attachments.first.webUrl!}?guid=${ss.settings.guidAuthKey}"); + await launchUrlString( + "${part.attachments.first.webUrl!}?guid=${ss.settings.guidAuthKey}"); popDetails(); } @@ -696,8 +956,10 @@ class _MessagePopupState extends OptimizedState with SingleTickerP context: context, builder: (context) => AlertDialog( backgroundColor: context.theme.colorScheme.properSurface, - title: Text("Copy Selection", style: context.theme.textTheme.titleLarge), - content: SelectableText(part.fullText, style: context.theme.extension()!.bubbleText), + title: + Text("Copy Selection", style: context.theme.textTheme.titleLarge), + content: SelectableText(part.fullText, + style: context.theme.extension()!.bubbleText), ), ); } @@ -717,43 +979,50 @@ class _MessagePopupState extends OptimizedState with SingleTickerP context: context, builder: (context) => AlertDialog( backgroundColor: context.theme.colorScheme.properSurface, - title: Text("Downloading attachment${length > 1 ? "s" : ""}...", style: context.theme.textTheme.titleLarge), - content: Column(mainAxisAlignment: MainAxisAlignment.center, mainAxisSize: MainAxisSize.min, children: [ - Obx( - () => Text( - '${progress.value != null && attachmentObs.value != null ? (progress.value! * attachmentObs.value!.totalBytes!).getFriendlySize() : ""} / ${(attachmentObs.value!.totalBytes!.toDouble()).getFriendlySize()} (${((progress.value ?? 0) * 100).floor()}%)', - style: context.theme.textTheme.bodyLarge), - ), - const SizedBox(height: 10.0), - Obx( - () => ClipRRect( - borderRadius: BorderRadius.circular(20), - child: LinearProgressIndicator( - backgroundColor: context.theme.colorScheme.outline, - valueColor: AlwaysStoppedAnimation(Get.context!.theme.colorScheme.primary), - value: progress.value, - minHeight: 5, + title: Text("Downloading attachment${length > 1 ? "s" : ""}...", + style: context.theme.textTheme.titleLarge), + content: Column( + mainAxisAlignment: MainAxisAlignment.center, + mainAxisSize: MainAxisSize.min, + children: [ + Obx( + () => Text( + '${progress.value != null && attachmentObs.value != null ? (progress.value! * attachmentObs.value!.totalBytes!).getFriendlySize() : ""} / ${(attachmentObs.value!.totalBytes!.toDouble()).getFriendlySize()} (${((progress.value ?? 0) * 100).floor()}%)', + style: context.theme.textTheme.bodyLarge), ), - ), - ), - const SizedBox( - height: 15.0, - ), - Obx(() => Text( - progress.value == 1 - ? "Download Complete!" - : "You can close this dialog. The attachment(s) will continue to download in the background.", - maxLines: 2, - textAlign: TextAlign.center, - style: context.theme.textTheme.bodyLarge, - )), - ]), + const SizedBox(height: 10.0), + Obx( + () => ClipRRect( + borderRadius: BorderRadius.circular(20), + child: LinearProgressIndicator( + backgroundColor: context.theme.colorScheme.outline, + valueColor: AlwaysStoppedAnimation( + Get.context!.theme.colorScheme.primary), + value: progress.value, + minHeight: 5, + ), + ), + ), + const SizedBox( + height: 15.0, + ), + Obx(() => Text( + progress.value == 1 + ? "Download Complete!" + : "You can close this dialog. The attachment(s) will continue to download in the background.", + maxLines: 2, + textAlign: TextAlign.center, + style: context.theme.textTheme.bodyLarge, + )), + ]), actions: [ Obx( () => downloadingAttachments.value ? Container(height: 0, width: 0) : TextButton( - child: Text("Close", style: context.theme.textTheme.bodyLarge!.copyWith(color: Get.context!.theme.colorScheme.primary)), + child: Text("Close", + style: context.theme.textTheme.bodyLarge!.copyWith( + color: Get.context!.theme.colorScheme.primary)), onPressed: () async { Get.closeAllSnackbars(); Navigator.of(context).pop(); @@ -768,13 +1037,18 @@ class _MessagePopupState extends OptimizedState with SingleTickerP for (Attachment? element in toDownload) { attachmentObs.value = element; final file = await backend.downloadAttachment(element!, - original: true, onReceiveProgress: (count, total) => progress.value = kIsWeb ? (count / total) : (count / element.totalBytes!)); - await as.saveToDisk(file, isDocument: element.mimeStart != "image" && element.mimeStart != "video"); + original: true, + onReceiveProgress: (count, total) => progress.value = + kIsWeb ? (count / total) : (count / element.totalBytes!)); + await as.saveToDisk(file, + isDocument: + element.mimeStart != "image" && element.mimeStart != "video"); } progress.value = 1; downloadingAttachments.value = false; } catch (ex, trace) { - Logger.error("Failed to download original attachment!", error: ex, trace: trace); + Logger.error("Failed to download original attachment!", + error: ex, trace: trace); showSnackbar("Download Error", ex.toString()); } } @@ -783,50 +1057,58 @@ class _MessagePopupState extends OptimizedState with SingleTickerP final RxBool downloadingAttachments = true.obs; final RxnInt progress = RxnInt(); final Rxn attachmentObs = Rxn(); - final toDownload = part.attachments.where((element) => element.hasLivePhoto); + final toDownload = + part.attachments.where((element) => element.hasLivePhoto); final length = toDownload.length; showDialog( context: context, builder: (context) => AlertDialog( backgroundColor: context.theme.colorScheme.properSurface, - title: Text("Downloading live photo${length > 1 ? "s" : ""}...", style: context.theme.textTheme.titleLarge), - content: Column(mainAxisAlignment: MainAxisAlignment.center, mainAxisSize: MainAxisSize.min, children: [ - Obx( - () => Text( - progress.value?.toDouble().getFriendlySize() ?? "", - style: context.theme.textTheme.bodyLarge, - ), - ), - const SizedBox(height: 10.0), - Obx( - () => ClipRRect( - borderRadius: BorderRadius.circular(20), - child: LinearProgressIndicator( - backgroundColor: context.theme.colorScheme.outline, - valueColor: AlwaysStoppedAnimation(Get.context!.theme.colorScheme.primary), - value: downloadingAttachments.value ? null : 1, - minHeight: 5, + title: Text("Downloading live photo${length > 1 ? "s" : ""}...", + style: context.theme.textTheme.titleLarge), + content: Column( + mainAxisAlignment: MainAxisAlignment.center, + mainAxisSize: MainAxisSize.min, + children: [ + Obx( + () => Text( + progress.value?.toDouble().getFriendlySize() ?? "", + style: context.theme.textTheme.bodyLarge, + ), ), - ), - ), - const SizedBox( - height: 15.0, - ), - Obx(() => Text( - !downloadingAttachments.value - ? "Download Complete!" - : "You can close this dialog. The live photo(s) will continue to download in the background.", - maxLines: 2, - textAlign: TextAlign.center, - style: context.theme.textTheme.bodyLarge, - )), - ]), + const SizedBox(height: 10.0), + Obx( + () => ClipRRect( + borderRadius: BorderRadius.circular(20), + child: LinearProgressIndicator( + backgroundColor: context.theme.colorScheme.outline, + valueColor: AlwaysStoppedAnimation( + Get.context!.theme.colorScheme.primary), + value: downloadingAttachments.value ? null : 1, + minHeight: 5, + ), + ), + ), + const SizedBox( + height: 15.0, + ), + Obx(() => Text( + !downloadingAttachments.value + ? "Download Complete!" + : "You can close this dialog. The live photo(s) will continue to download in the background.", + maxLines: 2, + textAlign: TextAlign.center, + style: context.theme.textTheme.bodyLarge, + )), + ]), actions: [ Obx( () => downloadingAttachments.value ? Container(height: 0, width: 0) : TextButton( - child: Text("Close", style: context.theme.textTheme.bodyLarge!.copyWith(color: Get.context!.theme.colorScheme.primary)), + child: Text("Close", + style: context.theme.textTheme.bodyLarge!.copyWith( + color: Get.context!.theme.colorScheme.primary)), onPressed: () async { Get.closeAllSnackbars(); Navigator.of(context).pop(); @@ -841,7 +1123,8 @@ class _MessagePopupState extends OptimizedState with SingleTickerP for (Attachment? element in toDownload) { attachmentObs.value = element; final nameSplit = element!.transferName!.split("."); - await backend.downloadLivePhoto(element, "${nameSplit.take(nameSplit.length - 1).join(".")}.mov", + await backend.downloadLivePhoto( + element, "${nameSplit.take(nameSplit.length - 1).join(".")}.mov", onReceiveProgress: (count, total) => progress.value = count); } downloadingAttachments.value = false; @@ -867,8 +1150,10 @@ class _MessagePopupState extends OptimizedState with SingleTickerP void createContact() async { popDetails(); - await mcs - .invokeMethod("open-contact-form", {'address': message.handle!.address, 'address_type': message.handle!.address.isEmail ? 'email' : 'phone'}); + await mcs.invokeMethod("open-contact-form", { + 'address': message.handle!.address, + 'address_type': message.handle!.address.isEmail ? 'email' : 'phone' + }); } void showThread() { @@ -876,7 +1161,8 @@ class _MessagePopupState extends OptimizedState with SingleTickerP if (message.threadOriginatorGuid != null) { final mwc = getActiveMwc(message.threadOriginatorGuid!); if (mwc == null) return showSnackbar("Error", "Failed to find thread!"); - showReplyThread(context, mwc.message, mwc.parts[message.normalizedThreadPart], service, cvController); + showReplyThread(context, mwc.message, + mwc.parts[message.normalizedThreadPart], service, cvController); } else { showReplyThread(context, message, part, service, cvController); } @@ -888,7 +1174,10 @@ class _MessagePopupState extends OptimizedState with SingleTickerP popDetails(); ns.pushAndRemoveUntil( context, - ChatCreator(initialSelected: [SelectedContact(displayName: handle.displayName, address: handle.address)]), + ChatCreator(initialSelected: [ + SelectedContact( + displayName: handle.displayName, address: handle.address) + ]), (route) => route.isFirst, ); } @@ -936,7 +1225,10 @@ class _MessagePopupState extends OptimizedState with SingleTickerP } void share() { - if (part.attachments.isNotEmpty && !message.isLegacyUrlPreview && !kIsWeb && !kIsDesktop) { + if (part.attachments.isNotEmpty && + !message.isLegacyUrlPreview && + !kIsWeb && + !kIsDesktop) { for (Attachment? element in part.attachments) { Share.file( "${element!.mimeType!.split("/")[0].capitalizeFirst} shared from OpenBubbles: ${element.transferName}", @@ -960,138 +1252,168 @@ class _MessagePopupState extends OptimizedState with SingleTickerP final TextEditingController participantController = TextEditingController(); Uint8List? attachment; showDialog( - context: context, - builder: (_) { - return AlertDialog( - actions: [ - TextButton( - child: Text("Cancel", style: context.theme.textTheme.bodyLarge!.copyWith(color: context.theme.colorScheme.primary)), - onPressed: () => Get.back(), - ), - TextButton( - child: Text("Screenshot", style: context.theme.textTheme.bodyLarge!.copyWith(color: context.theme.colorScheme.primary)), - onPressed: () async { - final res = await picker.FilePicker.platform.pickFiles(withData: true, type: picker.FileType.custom, allowedExtensions: ['png', 'jpg', 'jpeg']); - if (res == null || res.count == 0) return; - attachment = await File(res.files[0].path!).readAsBytes(); - showSnackbar("Notice", "Screenshot added"); - }, - ), - TextButton( - child: Text("OK", style: context.theme.textTheme.bodyLarge!.copyWith(color: context.theme.colorScheme.primary)), - onPressed: () async { - if (participantController.text == "") return; - - showDialog( - context: context, - builder: (BuildContext context) { - return AlertDialog( - backgroundColor: context.theme.colorScheme.properSurface, - title: Text( - "Uploading log...", - style: context.theme.textTheme.titleLarge, - ), - content: Container( - height: 70, - child: Center( - child: CircularProgressIndicator( - backgroundColor: context.theme.colorScheme.properSurface, - valueColor: AlwaysStoppedAnimation(context.theme.colorScheme.primary), + context: context, + builder: (_) { + return AlertDialog( + actions: [ + TextButton( + child: Text("Cancel", + style: context.theme.textTheme.bodyLarge! + .copyWith(color: context.theme.colorScheme.primary)), + onPressed: () => Get.back(), + ), + TextButton( + child: Text("Screenshot", + style: context.theme.textTheme.bodyLarge! + .copyWith(color: context.theme.colorScheme.primary)), + onPressed: () async { + final res = await picker.FilePicker.platform.pickFiles( + withData: true, + type: picker.FileType.custom, + allowedExtensions: ['png', 'jpg', 'jpeg']); + if (res == null || res.count == 0) return; + attachment = await File(res.files[0].path!).readAsBytes(); + showSnackbar("Notice", "Screenshot added"); + }, + ), + TextButton( + child: Text("OK", + style: context.theme.textTheme.bodyLarge! + .copyWith(color: context.theme.colorScheme.primary)), + onPressed: () async { + if (participantController.text == "") return; + + showDialog( + context: context, + builder: (BuildContext context) { + return AlertDialog( + backgroundColor: + context.theme.colorScheme.properSurface, + title: Text( + "Uploading log...", + style: context.theme.textTheme.titleLarge, ), - ), - ), - ); + content: Container( + height: 70, + child: Center( + child: CircularProgressIndicator( + backgroundColor: + context.theme.colorScheme.properSurface, + valueColor: AlwaysStoppedAnimation( + context.theme.colorScheme.primary), + ), + ), + ), + ); + }); + + // + var file = Directory(Platform.isAndroid + ? "${fs.appDocDir.path}/../files/logs" + : "${fs.appDocDir.path}/logs"); + final List entities = + await file.list().toList(); + var current = entities.indexWhere( + (element) => element.path.endsWith("CURRENT.log")); + var item = entities.removeAt(current); + var end = await File(item.path).readAsBytes(); + var b = BytesBuilder(); + if (entities.isNotEmpty) { + var next = await File(entities.first.path).readAsBytes(); + b.add(next); } - ); - - // - var file = Directory(Platform.isAndroid ? "${fs.appDocDir.path}/../files/logs" : "${fs.appDocDir.path}/logs"); - final List entities = await file.list().toList(); - var current = entities.indexWhere((element) => element.path.endsWith("CURRENT.log")); - var item = entities.removeAt(current); - var end = await File(item.path).readAsBytes(); - var b = BytesBuilder(); - if (entities.isNotEmpty) { - var next = await File(entities.first.path).readAsBytes(); - b.add(next); - } - b.add(end); - var total = b.toBytes(); - - var encoder = const JsonEncoder.withIndent(" "); - var messageMeta = encoder.convert(message.toMap(includeObjects: true)); - var chatMeta = encoder.convert(chat.toMap()); - - // stop stupid automatic cralwers from spamming the webhook - var url = dotenv.get('REPORT_ISSUE_WEBHOOK'); - - try { - final response = await http.dio.post( + b.add(end); + var total = b.toBytes(); + + var encoder = const JsonEncoder.withIndent(" "); + var messageMeta = + encoder.convert(message.toMap(includeObjects: true)); + var chatMeta = encoder.convert(chat.toMap()); + + // stop stupid automatic cralwers from spamming the webhook + var url = dotenv.get('REPORT_ISSUE_WEBHOOK'); + + try { + final response = await http.dio.post( url, data: FormData.fromMap({ - "content": "Handle: ${(await api.getHandles(state: pushService.state!.client)).first} \nDesc: ${participantController.text}", + "content": + "Handle: ${(await api.getHandles(state: pushService.state!.client)).first} \nDesc: ${participantController.text}", "username": ss.settings.userName.value, - "files[0]": MultipartFile.fromBytes(total, filename: "rustpush-logs.log"), - "files[1]": MultipartFile.fromString(messageMeta, filename: "message.json"), - "files[2]": MultipartFile.fromString(chatMeta, filename: "chat.json"), + "files[0]": MultipartFile.fromBytes(total, + filename: "rustpush-logs.log"), + "files[1]": MultipartFile.fromString(messageMeta, + filename: "message.json"), + "files[2]": MultipartFile.fromString(chatMeta, + filename: "chat.json"), if (attachment != null) - "files[3]": MultipartFile.fromBytes(attachment!, filename: "screenshot.png") + "files[3]": MultipartFile.fromBytes(attachment!, + filename: "screenshot.png") }), - ); + ); - if (response.statusCode == 200) { - Get.back(); - Get.back(); - showSnackbar("Notice", "Logs sent! Thank you!"); - } else { + if (response.statusCode == 200) { + Get.back(); + Get.back(); + showSnackbar("Notice", "Logs sent! Thank you!"); + } else { + Get.back(); + Logger.error(response.toString()); + showSnackbar("Error", "There was an issue sending logs"); + } + } catch (e, s) { Get.back(); - Logger.error(response.toString()); - showSnackbar("Error", "There was an issue sending logs"); + Logger.error("failed", error: e, trace: s); + showSnackbar("Error", "There was an issue sending logs $e"); } - } catch(e, s) { - Get.back(); - Logger.error("failed", error: e, trace: s); - showSnackbar("Error", "There was an issue sending logs $e"); - } - }, - ), - ], - content: Column(children: [ - const Text("Logs will be sent to developer for review. Logs contain personal identifiers and 48 hours of message and chat history. Do not submit logs containing sensitive chats or messages. Your logs will be shared with Discord for storage subject to their Privacy Policy. We may contact you on iMessage for further information."), - const SizedBox(height: 16,), - TextField( - controller: participantController, - decoration: const InputDecoration( - labelText: "Description", - border: OutlineInputBorder(), + }, ), - keyboardType: TextInputType.multiline, - maxLines: null, - ) - ], - mainAxisSize: MainAxisSize.min,), - title: Text("Report issue", style: context.theme.textTheme.titleLarge), - backgroundColor: context.theme.colorScheme.properSurface, - ); - } - ); + ], + content: Column( + children: [ + const Text( + "Logs will be sent to developer for review. Logs contain personal identifiers and 48 hours of message and chat history. Do not submit logs containing sensitive chats or messages. Your logs will be shared with Discord for storage subject to their Privacy Policy. We may contact you on iMessage for further information."), + const SizedBox( + height: 16, + ), + TextField( + controller: participantController, + decoration: const InputDecoration( + labelText: "Description", + border: OutlineInputBorder(), + ), + keyboardType: TextInputType.multiline, + maxLines: null, + ) + ], + mainAxisSize: MainAxisSize.min, + ), + title: + Text("Report issue", style: context.theme.textTheme.titleLarge), + backgroundColor: context.theme.colorScheme.properSurface, + ); + }); } Future remindLater() async { if (Platform.isAndroid) { bool denied = await Permission.scheduleExactAlarm.isDenied; ; - bool permanentlyDenied = await Permission.scheduleExactAlarm.isPermanentlyDenied; + bool permanentlyDenied = + await Permission.scheduleExactAlarm.isPermanentlyDenied; if (denied && !permanentlyDenied) { await Permission.scheduleExactAlarm.request(); } else if (permanentlyDenied) { - showSnackbar("Error", "You must enable the manage alarm permission to use this feature"); + showSnackbar("Error", + "You must enable the manage alarm permission to use this feature"); return; } } final finalDate = await showTimeframePicker("Select Reminder Time", context, - presetsAhead: true, additionalTimeframes: {"3 Hours": 3, "6 Hours": 6}, useTodayYesterday: true); + presetsAhead: true, + additionalTimeframes: {"3 Hours": 3, "6 Hours": 6}, + useTodayYesterday: true); if (finalDate != null) { if (!finalDate.isAfter(DateTime.now().toLocal())) { showSnackbar("Error", "Select a date in the future"); @@ -1112,14 +1434,19 @@ class _MessagePopupState extends OptimizedState with SingleTickerP ah.handleUpdatedMessage(chat, updatedMessage, null); } - void edit() { + void edit() async { + final popupRoute = ModalRoute.of(context); popDetails(); - final FocusNode? node = kIsDesktop || kIsWeb ? FocusNode() : null; - - var controller = MentionTextEditingController(text: "", focusNode: node); - controller.importMessagePart(part); - - cvController.editing.add(Tuple3(message, part, controller)); + await popupRoute?.completed; + final editController = cvController.startEditing(message, part); + WidgetsBinding.instance.addPostFrameCallback((_) { + final focusNode = editController.focusNode; + if (focusNode == null || !focusNode.canRequestFocus) return; + focusNode.requestFocus(); + if (!(kIsDesktop || kIsWeb)) { + SystemChannels.textInput.invokeMethod('TextInput.show'); + } + }); } void delete() { @@ -1146,16 +1473,20 @@ class _MessagePopupState extends OptimizedState with SingleTickerP const encoder = JsonEncoder.withIndent(" "); Map map = message.toMap(includeObjects: true); if (map["dateCreated"] is int) { - map["dateCreated"] = DateFormat("MMMM d, yyyy h:mm:ss a").format(DateTime.fromMillisecondsSinceEpoch(map["dateCreated"])); + map["dateCreated"] = DateFormat("MMMM d, yyyy h:mm:ss a") + .format(DateTime.fromMillisecondsSinceEpoch(map["dateCreated"])); } if (map["dateDelivered"] is int) { - map["dateDelivered"] = DateFormat("MMMM d, yyyy h:mm:ss a").format(DateTime.fromMillisecondsSinceEpoch(map["dateDelivered"])); + map["dateDelivered"] = DateFormat("MMMM d, yyyy h:mm:ss a") + .format(DateTime.fromMillisecondsSinceEpoch(map["dateDelivered"])); } if (map["dateRead"] is int) { - map["dateRead"] = DateFormat("MMMM d, yyyy h:mm:ss a").format(DateTime.fromMillisecondsSinceEpoch(map["dateRead"])); + map["dateRead"] = DateFormat("MMMM d, yyyy h:mm:ss a") + .format(DateTime.fromMillisecondsSinceEpoch(map["dateRead"])); } if (map["dateEdited"] is int) { - map["dateEdited"] = DateFormat("MMMM d, yyyy h:mm:ss a").format(DateTime.fromMillisecondsSinceEpoch(map["dateEdited"])); + map["dateEdited"] = DateFormat("MMMM d, yyyy h:mm:ss a") + .format(DateTime.fromMillisecondsSinceEpoch(map["dateEdited"])); } String str = encoder.convert(map); showDialog( @@ -1171,7 +1502,9 @@ class _MessagePopupState extends OptimizedState with SingleTickerP height: context.height * 1 / 4, child: Container( padding: const EdgeInsets.all(10.0), - decoration: BoxDecoration(color: context.theme.colorScheme.background, borderRadius: const BorderRadius.all(Radius.circular(10))), + decoration: BoxDecoration( + color: context.theme.colorScheme.background, + borderRadius: const BorderRadius.all(Radius.circular(10))), child: SingleChildScrollView( child: SelectableText( str, @@ -1182,7 +1515,9 @@ class _MessagePopupState extends OptimizedState with SingleTickerP ), actions: [ TextButton( - child: Text("Close", style: context.theme.textTheme.bodyLarge!.copyWith(color: context.theme.colorScheme.primary)), + child: Text("Close", + style: context.theme.textTheme.bodyLarge! + .copyWith(color: context.theme.colorScheme.primary)), onPressed: () => Navigator.of(context).pop(), ), ], @@ -1191,147 +1526,173 @@ class _MessagePopupState extends OptimizedState with SingleTickerP } get _allActions { - final canEdit = (message.dateCreated?.toUtc().isWithin(DateTime.now().toUtc(), minutes: 15) ?? false) - || (message.dateCreated?.toUtc().isAfter(DateTime.now().toUtc()) ?? false); + final canEdit = (message.dateCreated + ?.toUtc() + .isWithin(DateTime.now().toUtc(), minutes: 15) ?? + false) || + (message.dateCreated?.toUtc().isAfter(DateTime.now().toUtc()) ?? false); return [ - if (ss.settings.enablePrivateAPI.value && minBigSur && chat.isIMessage && isSent) - DetailsMenuActionWidget( - onTap: reply, - action: DetailsMenuAction.Reply, - ), - if (showDownload) - DetailsMenuActionWidget( - onTap: download, - action: DetailsMenuAction.Save, - ), - if ((part.text?.hasUrl ?? false) && !kIsWeb && !kIsDesktop && !ls.isBubble) - DetailsMenuActionWidget( - onTap: openLink, - action: DetailsMenuAction.OpenInBrowser, - ), - if (showDownload && kIsWeb && part.attachments.firstOrNull?.webUrl != null) - DetailsMenuActionWidget( - onTap: openAttachmentWeb, - action: DetailsMenuAction.OpenInNewTab, - ), - if (!isNullOrEmptyString(part.fullText)) - DetailsMenuActionWidget( - onTap: copyText, - action: DetailsMenuAction.CopyText, - ), - if (showDownload && - supportsOriginalDownload && - part.attachments - .where((element) => - (element.uti?.contains("heic") ?? false) || - (element.uti?.contains("heif") ?? false) || - (element.uti?.contains("quicktime") ?? false) || - (element.uti?.contains("coreaudio") ?? false) || - (element.uti?.contains("tiff") ?? false)) - .isNotEmpty) - DetailsMenuActionWidget( - onTap: downloadOriginal, - action: DetailsMenuAction.SaveOriginal, - ), - if (showDownload && part.attachments.where((e) => e.hasLivePhoto).isNotEmpty) - DetailsMenuActionWidget( - onTap: downloadLivePhoto, - action: DetailsMenuAction.SaveLivePhoto, - ), - if (chat.isGroup && !message.isFromMe! && dmChat != null && !ls.isBubble) - DetailsMenuActionWidget( - onTap: openDm, - action: DetailsMenuAction.OpenDirectMessage, - ), - if (message.threadOriginatorGuid != null || service.struct.threads(message.guid!, part.part, returnOriginator: false).isNotEmpty) - DetailsMenuActionWidget( - onTap: showThread, - action: DetailsMenuAction.ViewThread, - ), - if ((part.attachments.isNotEmpty && !kIsWeb && !kIsDesktop) || (!kIsWeb && !kIsDesktop && !isNullOrEmpty(part.text))) - DetailsMenuActionWidget( - onTap: share, - action: DetailsMenuAction.Share, - ), - if (showDownload) - DetailsMenuActionWidget( - onTap: redownload, - action: DetailsMenuAction.ReDownloadFromServer, - ), - if (!kIsWeb && !kIsDesktop) - DetailsMenuActionWidget( - onTap: remindLater, - action: DetailsMenuAction.RemindLater, - ), - if (!kIsWeb && !kIsDesktop) - DetailsMenuActionWidget( - onTap: reportIssue, - action: DetailsMenuAction.ReportIssue, - ), - if (message.attachments.isNotEmpty && ss.settings.cloudSyncingEnabled.value) - DetailsMenuActionWidget( - onTap: uploadAttachment, - action: DetailsMenuAction.UploadAttachment, - ), - if (!kIsWeb && !kIsDesktop && !message.isFromMe! && message.handle != null && message.handle!.contact == null) - DetailsMenuActionWidget( - onTap: createContact, - action: DetailsMenuAction.CreateContact, - ), - if (backend.canEditUnsend() && message.isFromMe! && !message.guid!.startsWith("temp") && message.dateScheduled == null) - DetailsMenuActionWidget( - onTap: unsend, - action: DetailsMenuAction.UndoSend, - ), - if (backend.canEditUnsend() && - message.isFromMe! && - !message.guid!.startsWith("temp") && - (part.text?.isNotEmpty ?? false)) - DetailsMenuActionWidget( - onTap: edit, - customTitle: canEdit ? 'Edit' : 'Edit (too old)', - shouldDisableBtn: !canEdit, - action: DetailsMenuAction.Edit, - ), - if (!ls.isBubble && !message.isInteractive) - DetailsMenuActionWidget( - onTap: forward, - action: DetailsMenuAction.Forward, - ), - if (chat.isGroup && !message.isFromMe! && dmChat == null && !ls.isBubble) - DetailsMenuActionWidget( - onTap: newConvo, - action: DetailsMenuAction.StartConversation, - ), - if (!isNullOrEmptyString(part.fullText) && (kIsDesktop || kIsWeb)) - DetailsMenuActionWidget( - onTap: copySelection, - action: DetailsMenuAction.CopySelection, - ), + if (ss.settings.enablePrivateAPI.value && + minBigSur && + chat.isIMessage && + isSent) + DetailsMenuActionWidget( + onTap: reply, + action: DetailsMenuAction.Reply, + ), + if (showDownload) + DetailsMenuActionWidget( + onTap: download, + action: DetailsMenuAction.Save, + ), + if ((part.text?.hasUrl ?? false) && + !kIsWeb && + !kIsDesktop && + !ls.isBubble) DetailsMenuActionWidget( - onTap: delete, - action: DetailsMenuAction.Delete, + onTap: openLink, + action: DetailsMenuAction.OpenInBrowser, ), + if (showDownload && + kIsWeb && + part.attachments.firstOrNull?.webUrl != null) DetailsMenuActionWidget( - onTap: toggleBookmark, - action: DetailsMenuAction.Bookmark, - customTitle: message.isBookmarked ? "Remove Bookmark" : "Add Bookmark", + onTap: openAttachmentWeb, + action: DetailsMenuAction.OpenInNewTab, ), + if (!isNullOrEmptyString(part.fullText)) DetailsMenuActionWidget( - onTap: selectMultiple, - action: DetailsMenuAction.SelectMultiple, + onTap: copyText, + action: DetailsMenuAction.CopyText, ), + if (showDownload && + supportsOriginalDownload && + part.attachments + .where((element) => + (element.uti?.contains("heic") ?? false) || + (element.uti?.contains("heif") ?? false) || + (element.uti?.contains("quicktime") ?? false) || + (element.uti?.contains("coreaudio") ?? false) || + (element.uti?.contains("tiff") ?? false)) + .isNotEmpty) DetailsMenuActionWidget( - onTap: messageInfo, - action: DetailsMenuAction.MessageInfo, + onTap: downloadOriginal, + action: DetailsMenuAction.SaveOriginal, ), - ].sorted((a, b) => ss.settings.detailsMenuActions.indexOf(a.action).compareTo(ss.settings.detailsMenuActions.indexOf(b.action))); + if (showDownload && + part.attachments.where((e) => e.hasLivePhoto).isNotEmpty) + DetailsMenuActionWidget( + onTap: downloadLivePhoto, + action: DetailsMenuAction.SaveLivePhoto, + ), + if (chat.isGroup && !message.isFromMe! && dmChat != null && !ls.isBubble) + DetailsMenuActionWidget( + onTap: openDm, + action: DetailsMenuAction.OpenDirectMessage, + ), + if (message.threadOriginatorGuid != null || + service.struct + .threads(message.guid!, part.part, returnOriginator: false) + .isNotEmpty) + DetailsMenuActionWidget( + onTap: showThread, + action: DetailsMenuAction.ViewThread, + ), + if ((part.attachments.isNotEmpty && !kIsWeb && !kIsDesktop) || + (!kIsWeb && !kIsDesktop && !isNullOrEmpty(part.text))) + DetailsMenuActionWidget( + onTap: share, + action: DetailsMenuAction.Share, + ), + if (showDownload) + DetailsMenuActionWidget( + onTap: redownload, + action: DetailsMenuAction.ReDownloadFromServer, + ), + if (!kIsWeb && !kIsDesktop) + DetailsMenuActionWidget( + onTap: remindLater, + action: DetailsMenuAction.RemindLater, + ), + if (!kIsWeb && !kIsDesktop) + DetailsMenuActionWidget( + onTap: reportIssue, + action: DetailsMenuAction.ReportIssue, + ), + if (message.attachments.isNotEmpty && + ss.settings.cloudSyncingEnabled.value && + legacyCloudKitMutationsEnabled) + DetailsMenuActionWidget( + onTap: uploadAttachment, + action: DetailsMenuAction.UploadAttachment, + ), + if (!kIsWeb && + !kIsDesktop && + !message.isFromMe! && + message.handle != null && + message.handle!.contact == null) + DetailsMenuActionWidget( + onTap: createContact, + action: DetailsMenuAction.CreateContact, + ), + if (backend.canEditUnsend() && + message.isFromMe! && + !message.guid!.startsWith("temp") && + message.dateScheduled == null) + DetailsMenuActionWidget( + onTap: unsend, + action: DetailsMenuAction.UndoSend, + ), + if (backend.canEditUnsend() && + message.isFromMe! && + !message.guid!.startsWith("temp") && + (part.text?.isNotEmpty ?? false)) + DetailsMenuActionWidget( + onTap: edit, + customTitle: canEdit ? 'Edit' : 'Edit (too old)', + shouldDisableBtn: !canEdit, + action: DetailsMenuAction.Edit, + ), + if (!ls.isBubble && !message.isInteractive) + DetailsMenuActionWidget( + onTap: forward, + action: DetailsMenuAction.Forward, + ), + if (chat.isGroup && !message.isFromMe! && dmChat == null && !ls.isBubble) + DetailsMenuActionWidget( + onTap: newConvo, + action: DetailsMenuAction.StartConversation, + ), + if (!isNullOrEmptyString(part.fullText) && (kIsDesktop || kIsWeb)) + DetailsMenuActionWidget( + onTap: copySelection, + action: DetailsMenuAction.CopySelection, + ), + DetailsMenuActionWidget( + onTap: delete, + action: DetailsMenuAction.Delete, + ), + DetailsMenuActionWidget( + onTap: toggleBookmark, + action: DetailsMenuAction.Bookmark, + customTitle: message.isBookmarked ? "Remove Bookmark" : "Add Bookmark", + ), + DetailsMenuActionWidget( + onTap: selectMultiple, + action: DetailsMenuAction.SelectMultiple, + ), + DetailsMenuActionWidget( + onTap: messageInfo, + action: DetailsMenuAction.MessageInfo, + ), + ].sorted((a, b) => ss.settings.detailsMenuActions + .indexOf(a.action) + .compareTo(ss.settings.detailsMenuActions.indexOf(b.action))); } double maxMenuWidth = 300; Widget buildDetailsMenu(BuildContext context) { - List allActions = _allActions; return ClipRRect( @@ -1344,7 +1705,9 @@ class _MessagePopupState extends OptimizedState with SingleTickerP child: Column( mainAxisSize: MainAxisSize.min, mainAxisAlignment: MainAxisAlignment.center, - children: allActions.cast().sublist(0, numberToShow - 1) + children: allActions + .cast() + .sublist(0, numberToShow - 1) ..add( CustomDetailsMenuActionWidget( onTap: () async { @@ -1356,11 +1719,13 @@ class _MessagePopupState extends OptimizedState with SingleTickerP Get.dialog( ss.settings.skin.value == Skins.iOS ? CupertinoAlertDialog( - backgroundColor: context.theme.colorScheme.properSurface, + backgroundColor: + context.theme.colorScheme.properSurface, content: content, ) : AlertDialog( - backgroundColor: context.theme.colorScheme.properSurface, + backgroundColor: + context.theme.colorScheme.properSurface, content: content, ), name: 'Popup Menu'); @@ -1383,42 +1748,49 @@ class _MessagePopupState extends OptimizedState with SingleTickerP ...allActions.slice(0, numberToShow - 1).map((action) { bool isDisabled = false; if (action.action == DetailsMenuAction.Edit) { - isDisabled = !((message.dateCreated?.toUtc().isWithin(DateTime.now().toUtc(), minutes: 15) ?? false)); + isDisabled = !((message.dateCreated + ?.toUtc() + .isWithin(DateTime.now().toUtc(), minutes: 15) ?? + false)); } - - Color color = isDisabled ? context.theme.colorScheme.properOnSurface.withOpacity(0.5) : context.theme.colorScheme.properOnSurface; + + Color color = isDisabled + ? context.theme.colorScheme.properOnSurface.withOpacity(0.5) + : context.theme.colorScheme.properOnSurface; return Padding( - padding: EdgeInsets.only(top: kIsDesktop ? 20 : 0), - child: IconButton( - icon: Icon(action.nonIosIcon, color: color), - onPressed: isDisabled ? null : action.onTap, - tooltip: action.title, - ) - ); + padding: EdgeInsets.only(top: kIsDesktop ? 20 : 0), + child: IconButton( + icon: Icon(action.nonIosIcon, color: color), + onPressed: isDisabled ? null : action.onTap, + tooltip: action.title, + )); }), Padding( - padding: EdgeInsets.only(top: kIsDesktop ? 20 : 0), - child: PopupMenuButton( - color: context.theme.colorScheme.properSurface, - shape: ss.settings.skin.value != Skins.Material ? const RoundedRectangleBorder( - borderRadius: BorderRadius.all(Radius.circular(20.0)), - ) : null, - onSelected: (int value) { - allActions[value + numberToShow - 1].onTap?.call(); - }, - itemBuilder: (context) { - return allActions.slice(numberToShow - 1).mapIndexed((index, action) { - return PopupMenuItem( - value: index, - child: Text( - action.title, - style: context.textTheme.bodyLarge!.apply(color: context.theme.colorScheme.properOnSurface), - ), - ); - }).toList(); - } - ) - ) + padding: EdgeInsets.only(top: kIsDesktop ? 20 : 0), + child: PopupMenuButton( + color: context.theme.colorScheme.properSurface, + shape: ss.settings.skin.value != Skins.Material + ? const RoundedRectangleBorder( + borderRadius: BorderRadius.all(Radius.circular(20.0)), + ) + : null, + onSelected: (int value) { + allActions[value + numberToShow - 1].onTap?.call(); + }, + itemBuilder: (context) { + return allActions + .slice(numberToShow - 1) + .mapIndexed((index, action) { + return PopupMenuItem( + value: index, + child: Text( + action.title, + style: context.textTheme.bodyLarge!.apply( + color: context.theme.colorScheme.properOnSurface), + ), + ); + }).toList(); + })) ]; } } @@ -1442,14 +1814,16 @@ class ReactionDetails extends StatelessWidget { child: Container( alignment: Alignment.center, height: 120, - color: context.theme.colorScheme.properSurface.withAlpha(ss.settings.skin.value == Skins.iOS ? 150 : 255), + color: context.theme.colorScheme.properSurface + .withAlpha(ss.settings.skin.value == Skins.iOS ? 150 : 255), child: Padding( padding: const EdgeInsets.symmetric(horizontal: 10.0), child: ListView.separated( shrinkWrap: true, physics: ThemeSwitcher.getScrollPhysics(), scrollDirection: Axis.horizontal, - findChildIndexCallback: (key) => findChildIndexByKey(reactions, key, (item) => item.guid), + findChildIndexCallback: (key) => + findChildIndexByKey(reactions, key, (item) => item.guid), separatorBuilder: (context, index) => const SizedBox(width: 10), itemBuilder: (context, index) { final message = reactions[index]; @@ -1458,7 +1832,8 @@ class ReactionDetails extends StatelessWidget { mainAxisSize: MainAxisSize.min, children: [ Padding( - padding: const EdgeInsets.symmetric(horizontal: 25.0, vertical: 10), + padding: const EdgeInsets.symmetric( + horizontal: 25.0, vertical: 10), child: ContactAvatarWidget( handle: message.handle, borderThickness: 0.1, @@ -1470,8 +1845,11 @@ class ReactionDetails extends StatelessWidget { Padding( padding: const EdgeInsets.only(bottom: 8.0), child: Text( - message.isFromMe! ? ss.settings.userName.value : (message.handle?.displayName ?? "Unknown"), - style: context.theme.textTheme.bodySmall!.copyWith(color: context.theme.colorScheme.properOnSurface), + message.isFromMe! + ? ss.settings.userName.value + : (message.handle?.displayName ?? "Unknown"), + style: context.theme.textTheme.bodySmall!.copyWith( + color: context.theme.colorScheme.properOnSurface), ), ), if (ss.settings.hideNamesForReactions.value) @@ -1483,7 +1861,9 @@ class ReactionDetails extends StatelessWidget { width: 28, decoration: BoxDecoration( borderRadius: BorderRadius.circular(100), - color: message.isFromMe! ? context.theme.colorScheme.primary : context.theme.colorScheme.properSurface, + color: message.isFromMe! + ? context.theme.colorScheme.primary + : context.theme.colorScheme.properSurface, boxShadow: [ BoxShadow( blurRadius: 1.0, @@ -1493,21 +1873,31 @@ class ReactionDetails extends StatelessWidget { ), child: Center( child: Builder(builder: (context) { - if (message.associatedMessageType == ReactionTypes.STICKERBACK) { - var image = cvc(message.chat.target!).stickerData[message.guid]?[message.attachments[0]?.guid]?.$1; - return image != null ? Padding( - padding: const EdgeInsets.all(5), - child: Image.memory( - image, - gaplessPlayback: true, - cacheHeight: 200, - filterQuality: FilterQuality.none, - ), - ) : const SizedBox.shrink(); + if (message.associatedMessageType == + ReactionTypes.STICKERBACK) { + var image = cvc(message.chat.target!) + .stickerData[message.guid] + ?[message.attachments[0]?.guid] + ?.$1; + return image != null + ? Padding( + padding: const EdgeInsets.all(5), + child: Image.memory( + image, + gaplessPlayback: true, + cacheHeight: 200, + filterQuality: FilterQuality.none, + ), + ) + : const SizedBox.shrink(); } final text = Text( - ReactionTypes.reactionToEmoji[message.associatedMessageType] ?? message.associatedMessageEmoji ?? "X", - style: const TextStyle(fontSize: 18, fontFamily: 'Apple Color Emoji'), + ReactionTypes.reactionToEmoji[ + message.associatedMessageType] ?? + message.associatedMessageEmoji ?? + "X", + style: const TextStyle( + fontSize: 18, fontFamily: 'Apple Color Emoji'), textAlign: TextAlign.center, ); // rotate thumbs down to match iOS diff --git a/lib/app/layouts/conversation_view/widgets/message/send_animation.dart b/lib/app/layouts/conversation_view/widgets/message/send_animation.dart index 5f4d73957d..bdfa199705 100644 --- a/lib/app/layouts/conversation_view/widgets/message/send_animation.dart +++ b/lib/app/layouts/conversation_view/widgets/message/send_animation.dart @@ -5,17 +5,16 @@ import 'dart:ui'; import 'package:async_task/async_task_extension.dart'; import 'package:audio_waveforms/audio_waveforms.dart'; -import 'package:bluebubbles/app/components/custom_text_editing_controllers.dart'; import 'package:bluebubbles/app/layouts/conversation_view/widgets/message/misc/tail_clipper.dart'; import 'package:bluebubbles/app/wrappers/stateful_boilerplate.dart'; import 'package:bluebubbles/helpers/helpers.dart'; import 'package:bluebubbles/database/models.dart'; import 'package:bluebubbles/services/rustpush/rustpush_service.dart'; import 'package:bluebubbles/services/services.dart'; +import 'package:bluebubbles/utils/attachment_mime_utils.dart'; import 'package:dotted_border/dotted_border.dart'; import 'package:flutter/material.dart'; import 'package:get/get.dart'; -import 'package:mime_type/mime_type.dart'; import 'package:simple_animations/simple_animations.dart'; import 'package:tuple/tuple.dart'; @@ -76,6 +75,7 @@ class _SendAnimationState final file = attachments[i]; String data = await DefaultAssetBundle.of(Get.context!).loadString("assets/rustpush/uti-map.json"); final utiMap = jsonDecode(data); + final attachmentMimeType = resolveAttachmentMimeType(file.name, file.path); final message = Message( text: "", @@ -85,8 +85,8 @@ class _SendAnimationState attachments: [ Attachment( isOutgoing: true, - mimeType: mime(file.path ?? file.name), - uti: utiMap[mime(file.path ?? file.name)] ?? "public.data", + mimeType: attachmentMimeType, + uti: utiMap[attachmentMimeType] ?? "public.data", bytes: file.bytes, transferName: file.name, totalBytes: file.size, @@ -148,7 +148,7 @@ class _SendAnimationState ], ); _message.generateTempGuid(); - outq.queue(OutgoingItem( + await outq.queue(OutgoingItem( type: QueueType.sendMessage, chat: controller.chat, message: _message, @@ -253,4 +253,4 @@ class _SendAnimationState ), ); } -} \ No newline at end of file +} diff --git a/lib/app/layouts/conversation_view/widgets/text_field/conversation_text_field.dart b/lib/app/layouts/conversation_view/widgets/text_field/conversation_text_field.dart index 47252f5d05..66e83df3d0 100644 --- a/lib/app/layouts/conversation_view/widgets/text_field/conversation_text_field.dart +++ b/lib/app/layouts/conversation_view/widgets/text_field/conversation_text_field.dart @@ -6,7 +6,6 @@ import 'package:audio_waveforms/audio_waveforms.dart'; import 'package:bluebubbles/app/components/custom/custom_bouncing_scroll_physics.dart'; import 'package:bluebubbles/app/components/custom_text_editing_controllers.dart'; import 'package:bluebubbles/app/layouts/conversation_details/dialogs/timeframe_picker.dart'; -import 'package:bluebubbles/app/layouts/conversation_view/dialogs/custom_mention_dialog.dart'; import 'package:bluebubbles/app/layouts/conversation_view/widgets/media_picker/text_field_attachment_picker.dart'; import 'package:bluebubbles/app/layouts/conversation_view/widgets/message/send_animation.dart'; import 'package:bluebubbles/app/layouts/conversation_view/widgets/text_field/picked_attachments_holder.dart'; @@ -40,7 +39,6 @@ import 'package:pasteboard/pasteboard.dart'; import 'package:path/path.dart' hide context; import 'package:permission_handler/permission_handler.dart'; import 'package:supercharged/supercharged.dart'; -import 'package:tuple/tuple.dart'; import 'package:universal_io/io.dart'; class ConversationTextField extends CustomStateful { @@ -343,17 +341,42 @@ class ConversationTextFieldState extends CustomState attachment.path != null) + .map((attachment) => attachment.path!) + .toList(); + chat.save( + updateTextFieldText: true, + updateTextFieldAnnotations: true, + updateTextFieldAttachments: true, ); + + try { + await controller.send( + controller.pickedApp.value?.$1 != null ? [controller.pickedApp.value!.$1!] : controller.pickedAttachments, + controller.textController.getFinalAnnotations(), + controller.subjectTextController.text, + controller.replyToMessage?.item1.threadOriginatorGuid ?? controller.replyToMessage?.item1.guid, + controller.replyToMessage?.item2, + effect, + controller.pickedApp.value?.$2, + false, + controller.scheduledDate.value + ); + } catch (error, stack) { + Logger.error( + "Failed to prepare outgoing message; composer preserved", + error: error, + trace: stack, + ); + showSnackbar("Message not sent", "Your text was preserved. Please try again."); + return; + } controller.pickedApp.value = null; controller.pickedAttachments.clear(); controller.textController.clear(); @@ -851,7 +874,8 @@ class TextFieldComponentState extends State { final txtController = controller?.textController ?? textController; final subjController = controller?.subjectTextController ?? subjectTextController; return Focus( - onKeyEvent: (_, ev) => handleKey(_, ev, context, isChatCreator), + onKeyEvent: (node, ev) => + handleKey(node, ev, context, isChatCreator), child: Padding( padding: const EdgeInsets.only(right: 5.0), child: ValueListenableBuilder( @@ -1143,13 +1167,8 @@ class TextFieldComponentState extends State { final parts = mwc(message).parts; final part = parts.filter((p) => p.text?.isNotEmpty ?? false).lastOrNull; if (part != null) { - final FocusNode? node = kIsDesktop || kIsWeb ? FocusNode() : null; - - var e = MentionTextEditingController(text: "", focusNode: node); - e.importMessagePart(part); - - controller!.editing.add(Tuple3(message, part, e)); - node?.requestFocus(); + final editController = controller!.startEditing(message, part); + editController.focusNode?.requestFocus(); return KeyEventResult.handled; } } diff --git a/lib/app/layouts/findmy/findmy_page.dart b/lib/app/layouts/findmy/findmy_page.dart index 0dbf01cf7c..76376a7c62 100644 --- a/lib/app/layouts/findmy/findmy_page.dart +++ b/lib/app/layouts/findmy/findmy_page.dart @@ -4,6 +4,7 @@ import 'dart:math'; import 'dart:ui'; import 'package:bitsdojo_window/bitsdojo_window.dart'; +import 'package:collection/collection.dart'; import 'package:bluebubbles/app/components/avatars/contact_avatar_widget.dart'; import 'package:bluebubbles/app/layouts/findmy/findmy_location_clipper.dart'; import 'package:bluebubbles/app/layouts/findmy/findmy_pin_clipper.dart'; @@ -29,12 +30,46 @@ import 'package:flutter_map_marker_popup/flutter_map_marker_popup.dart'; import 'package:get/get.dart' hide Response; import 'package:latlong2/latlong.dart'; import 'package:maps_launcher/maps_launcher.dart'; +import 'package:permission_handler/permission_handler.dart'; import 'package:sliding_up_panel2/sliding_up_panel2.dart'; import 'package:tuple/tuple.dart'; import 'package:universal_io/io.dart'; import 'package:bluebubbles/src/rust/api/api.dart' as api; import 'package:url_launcher/url_launcher.dart'; +@visibleForTesting +bool canPlayFindMySound({required String? deviceId, required bool isCloudManaged}) { + return deviceId != null && deviceId.isNotEmpty && isCloudManaged; +} + +@visibleForTesting +bool canPlayNearbyFindMySound({required bool isAccessory, required bool isAndroid}) { + return isAccessory && isAndroid; +} + +@visibleForTesting +bool canScanNearbyFindMyTrackers({required bool isAndroid}) => isAndroid; + +@visibleForTesting +String nearbyTrackerSignalLabel(Map tracker) { + final signal = tracker["signal"]?.toString() ?? "unknown"; + final rssi = tracker["rssi"]; + final readableSignal = signal.isEmpty ? "Unknown" : "${signal[0].toUpperCase()}${signal.substring(1)}"; + return rssi is num ? "$readableSignal signal (${rssi.toInt()} dBm)" : "$readableSignal signal"; +} + +@visibleForTesting +String findMyCloudFailureMessage(Object error) { + final message = error.toString().toLowerCase(); + if (message.contains("relay device offline")) { + return "Your relay device is offline. Cloud Find My will resume when it reconnects."; + } + if (error is TimeoutException || message.contains("timeoutexception")) { + return "Cloud Find My timed out. Check the relay connection and try again."; + } + return "Cloud Find My is unavailable right now."; +} + class FindMyPage extends StatefulWidget { FindMyPage({super.key, this.defaultFriend}); @@ -67,6 +102,13 @@ class _FindMyPageState extends OptimizedState with SingleTickerProvi bool refreshing2 = false; bool canRefresh = false; bool isInClique = true; + final Set soundingDevices = {}; + bool nearbyAccessoryBusy = false; + bool locationsRequestInFlight = false; + bool currentLocationRequestInFlight = false; + String? cloudFindMyError; + DateTime? automaticCloudRetryAfter; + Completer? fmipRequest; Map<(double, double), Address> cachedAddresses = {}; @@ -78,6 +120,209 @@ class _FindMyPageState extends OptimizedState with SingleTickerProvi api.FindMyFriendsClientDefaultAnisetteProvider? fmfClient; api.FindMyPhoneClientDefaultAnisetteProvider? fmipClient; + Future withFmipLock(Future Function() operation) async { + while (fmipRequest != null) { + await fmipRequest!.future; + } + final request = Completer(); + fmipRequest = request; + try { + return await operation(); + } finally { + request.complete(); + if (identical(fmipRequest, request)) fmipRequest = null; + } + } + + Future playSound(FindMyDevice device) async { + final deviceId = device.id; + if (deviceId == null || deviceId.isEmpty || fmipClient == null || soundingDevices.contains(deviceId)) return; + + final confirmed = await showDialog( + context: context, + builder: (context) => AlertDialog( + title: const Text("Play Sound?"), + content: Text( + "${ss.settings.redactedMode.value ? "This device" : (device.name ?? "This device")} will play a Find My alert.", + ), + actions: [ + TextButton( + onPressed: () => Navigator.of(context).pop(false), + child: const Text("Cancel"), + ), + TextButton( + onPressed: () => Navigator.of(context).pop(true), + child: const Text("Play Sound"), + ), + ], + ), + ); + if (confirmed != true || !mounted) return; + + setState(() => soundingDevices.add(deviceId)); + try { + await withFmipLock(() => api.playFindMySound( + config: pushService.state!.osConfig, + client: fmipClient!, + deviceId: deviceId, + )); + if (mounted) showSnackbar("Find My", "Sound request sent."); + } catch (e, s) { + Logger.warn("Find My Play Sound request failed", error: e, trace: s); + if (mounted) showSnackbar("Error", "Could not play sound on this device."); + } finally { + if (mounted) setState(() => soundingDevices.remove(deviceId)); + } + } + + String nearbyTrackerLabel(String protocol) { + switch (protocol) { + case "dult": + return "Compatible tracker"; + case "find_my": + return "Find My accessory"; + case "airtag": + return "AirTag"; + default: + return "Nearby tracker"; + } + } + + Future playNearbyAccessorySound() async { + if (nearbyAccessoryBusy || !Platform.isAndroid) return; + + final permissions = await [Permission.bluetoothScan, Permission.bluetoothConnect].request(); + if (permissions.values.any((status) => !status.isGranted)) { + if (mounted) { + final permanentlyDenied = permissions.values.any((status) => status.isPermanentlyDenied); + showSnackbar( + "Bluetooth required", + permanentlyDenied + ? "Enable Nearby devices for OpenBubbles in Android settings." + : "Allow nearby-device access to find and play a tracker sound.", + ); + } + return; + } + + if (mounted) setState(() => nearbyAccessoryBusy = true); + try { + final raw = await mcs.invokeMethod("scanNearbyFindMyAccessories", {"scanDurationMs": 8000}); + final trackers = (raw as List?) + ?.whereType() + .map((entry) => entry.cast()) + .where((entry) => entry["token"] is String) + .toList() ?? + >[]; + if (!mounted) return; + if (trackers.isEmpty) { + showSnackbar("No tracker found", "Keep the accessory close to this phone and try again."); + return; + } + + final selected = await showDialog>( + context: context, + builder: (context) => AlertDialog( + title: const Text("Play a nearby tracker sound"), + content: SizedBox( + width: 420, + child: Column( + mainAxisSize: MainAxisSize.min, + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + const Text( + "Choose a tracker near this phone. Apple rotates Bluetooth identifiers, so Android cannot prove which iCloud item is selected on the map.", + ), + const SizedBox(height: 12), + Flexible( + child: ListView.builder( + shrinkWrap: true, + itemCount: trackers.length, + itemBuilder: (context, index) { + final tracker = trackers[index]; + final protocol = tracker["protocol"]?.toString() ?? "unknown"; + return ListTile( + leading: const Icon(Icons.bluetooth_searching), + title: Text("${nearbyTrackerLabel(protocol)} candidate ${index + 1}"), + subtitle: Text(index == 0 + ? "Closest detected • ${nearbyTrackerSignalLabel(tracker)}" + : nearbyTrackerSignalLabel(tracker)), + trailing: const Icon(Icons.volume_up), + onTap: () => Navigator.of(context).pop(tracker), + ); + }, + ), + ), + ], + ), + ), + actions: [ + TextButton(onPressed: () => Navigator.of(context).pop(), child: const Text("Cancel")), + ], + ), + ); + if (selected == null || !mounted) return; + + await mcs.invokeMethod("playNearbyFindMyAccessorySound", {"token": selected["token"]}); + if (mounted) showSnackbar("Find My", "Nearby sound command sent."); + } on PlatformException catch (e) { + Logger.warn("Nearby Find My sound failed (${e.code})"); + if (mounted) { + final message = e.code == "BLUETOOTH_DISABLED" + ? "Turn on Bluetooth and try again." + : e.code == "TOKEN_EXPIRED" || e.code == "TRACKER_EXPIRED" + ? "That nearby tracker expired. Scan again." + : "Could not play a sound on the nearby tracker."; + showSnackbar("Find My", message); + } + } catch (e, s) { + Logger.warn("Nearby Find My sound failed", error: e, trace: s); + if (mounted) showSnackbar("Find My", "Could not play a sound on the nearby tracker."); + } finally { + if (mounted) setState(() => nearbyAccessoryBusy = false); + } + } + + Widget deviceActions(FindMyDevice item) { + final deviceId = item.id; + // FMIP devices, including AirPods, are returned without a beacon role and + // are accepted by the cloud playSound endpoint. Beacon-backed accessories + // (AirTags and compatible trackers) use the separate nearby BLE action. + final isCloudManaged = item.role == null; + return Row( + mainAxisSize: MainAxisSize.min, + children: [ + if (canPlayFindMySound(deviceId: deviceId, isCloudManaged: isCloudManaged)) + IconButton( + tooltip: "Play Sound", + onPressed: soundingDevices.contains(deviceId) ? null : () => playSound(item), + icon: soundingDevices.contains(deviceId) + ? buildProgressIndicator(context, size: 18) + : const Icon(Icons.volume_up, size: 20), + ), + if (canPlayNearbyFindMySound(isAccessory: item.isConsideredAccessory, isAndroid: Platform.isAndroid)) + IconButton( + tooltip: "Play Nearby Tracker Sound", + onPressed: nearbyAccessoryBusy ? null : playNearbyAccessorySound, + icon: nearbyAccessoryBusy + ? buildProgressIndicator(context, size: 18) + : const Icon(Icons.bluetooth_searching, size: 20), + ), + if (item.location?.latitude != null && item.location?.longitude != null) + TextButton( + style: TextButton.styleFrom( + shape: const CircleBorder(), + backgroundColor: context.theme.colorScheme.primaryContainer, + ), + onPressed: () async { + await MapsLauncher.launchCoordinates(item.location!.latitude!, item.location!.longitude!); + }, + child: const Icon(Icons.directions, size: 20), + ), + ], + ); + } + @override void initState() { super.initState(); @@ -87,7 +332,7 @@ class _FindMyPageState extends OptimizedState with SingleTickerProvi } getLocations(); - myTimer = Timer.periodic(const Duration(seconds: 5), (timer) => getLocations()); + myTimer = Timer.periodic(const Duration(seconds: 30), (timer) => getLocations()); socket.socket.on("new-findmy-location", (data) { try { @@ -125,14 +370,50 @@ class _FindMyPageState extends OptimizedState with SingleTickerProvi /// however, the refresh friends endpoint does. The way this was coded assumes that the server /// will return the data for both endpoints. A server update will fix this, but for now, /// we will "patch" it by only "refreshing" devices when the user manually refreshes the data. - void getLocations({bool refreshFriends = true, bool refreshDevices = true}) async { - if (!(Platform.isLinux && !kIsWeb)) { + Future getLocations({ + bool refreshFriends = true, + bool refreshDevices = true, + bool userInitiated = false, + }) async { + if (locationsRequestInFlight) return; + if (!userInitiated && automaticCloudRetryAfter?.isAfter(DateTime.now()) == true) return; + + locationsRequestInFlight = true; + unawaited(refreshCurrentLocation(refreshFriends: refreshFriends)); + try { + await getCloudLocations(refreshFriends: refreshFriends, refreshDevices: refreshDevices); + automaticCloudRetryAfter = null; + if (mounted && cloudFindMyError != null) { + setState(() => cloudFindMyError = null); + } + } catch (e) { + automaticCloudRetryAfter = DateTime.now().add(const Duration(minutes: 1)); + locationsRequestInFlight = false; + if (mounted) { + setState(() { + cloudFindMyError = findMyCloudFailureMessage(e); + fetching = null; + fetching2 = null; + refreshing = false; + refreshing2 = false; + }); + } + } finally { + locationsRequestInFlight = false; + if (mounted && !canRefresh) setState(() => canRefresh = true); + } + } + + Future refreshCurrentLocation({required bool refreshFriends}) async { + if (currentLocationRequestInFlight || (Platform.isLinux && !kIsWeb)) return; + currentLocationRequestInFlight = true; + try { LocationPermission granted = await Geolocator.checkPermission(); if (granted == LocationPermission.denied) { granted = await Geolocator.requestPermission(); } if (granted == LocationPermission.whileInUse || granted == LocationPermission.always) { - Geolocator.getCurrentPosition(locationSettings: const LocationSettings(timeLimit: Duration(seconds: 30))).then((loc) { + final loc = await Geolocator.getCurrentPosition(locationSettings: const LocationSettings(timeLimit: Duration(seconds: 30))); if (!mounted) return; if (ss.settings.lastLocation.value == null) { mapController.move(LatLng(loc.latitude, loc.longitude), 10); @@ -140,23 +421,33 @@ class _FindMyPageState extends OptimizedState with SingleTickerProvi ss.settings.lastLocation.value = "${loc.latitude},${loc.longitude}"; ss.saveSettings(); location = loc; - buildLocationMarker(location!); + setState(() => buildLocationMarker(loc)); if (!kIsDesktop && locationSub == null) { locationSub = Geolocator.getPositionStream().listen((event) { + if (!mounted) return; ss.settings.lastLocation.value = "${event.latitude},${event.longitude}"; ss.saveSettings(); setState(() { buildLocationMarker(event); }); + }, onError: (Object error, StackTrace trace) { + Logger.warn("Find My location stream failed", error: error, trace: trace); }); } if (!refreshFriends) { - mapController.move(LatLng(location!.latitude, location!.longitude), 10); + mapController.move(LatLng(loc.latitude, loc.longitude), 10); } - }); } + } on TimeoutException { + Logger.info("Find My current-location request timed out"); + } catch (e, s) { + Logger.warn("Find My current-location request failed", error: e, trace: s); + } finally { + currentLocationRequestInFlight = false; } + } + Future getCloudLocations({bool refreshFriends = true, bool refreshDevices = true}) async { var isNew = fmfClient == null; fmfClient ??= await api.makeFindMyFriends( path: pushService.statePath, @@ -216,8 +507,9 @@ class _FindMyPageState extends OptimizedState with SingleTickerProvi if (friend.latitude != null) { - final marker = markers.values.firstWhere( + final marker = markers.values.firstWhereOrNull( (e) => (e.key as ValueKey?)?.value == "friend-${friend.handle?.uniqueAddressAndService}"); + if (marker == null) return; popupController.showPopupsOnlyFor([marker]); mapController.move(LatLng(friend.latitude!, friend.longitude!), 10); @@ -226,11 +518,13 @@ class _FindMyPageState extends OptimizedState with SingleTickerProvi } } catch (e, s) { Logger.error("Failed to parse FindMy Friends location data!", error: e, trace: s); - setState(() { - fetching2 = null; - refreshing2 = false; - }); - return; + if (mounted) { + setState(() { + fetching2 = null; + refreshing2 = false; + }); + } + rethrow; } var isNewi = fmipClient == null; @@ -245,7 +539,10 @@ class _FindMyPageState extends OptimizedState with SingleTickerProvi try { if (refreshDevices && !isNewi) { - await api.refreshDevices(config: pushService.state!.osConfig, client: fmipClient!); + await withFmipLock(() => api.refreshDevices( + config: pushService.state!.osConfig, + client: fmipClient!, + )); } var following = await api.getDevices(client: fmipClient!); @@ -482,11 +779,13 @@ class _FindMyPageState extends OptimizedState with SingleTickerProvi }); } catch (e, s) { Logger.error("Failed to parse FindMy Devices location data!", error: e, trace: s); - setState(() { - fetching = null; - refreshing = false; - }); - return; + if (mounted) { + setState(() { + fetching = null; + refreshing = false; + }); + } + rethrow; } @@ -620,17 +919,32 @@ class _FindMyPageState extends OptimizedState with SingleTickerProvi final devicesBodySlivers = [ SliverList( delegate: SliverChildListDelegate([ + if (canScanNearbyFindMyTrackers(isAndroid: Platform.isAndroid)) + SettingsHeader(iosSubtitle: iosSubtitle, materialSubtitle: materialSubtitle, text: "Nearby Trackers"), + if (canScanNearbyFindMyTrackers(isAndroid: Platform.isAndroid)) + SettingsSection( + backgroundColor: tileColor, + children: [ + SettingsTile( + title: "Scan Nearby Trackers", + subtitle: "Find and play a sound on a nearby compatible tracker. This works without the cloud relay.", + leading: const Icon(Icons.bluetooth_searching), + trailing: nearbyAccessoryBusy ? buildProgressIndicator(context, size: 18) : const NextButton(), + onTap: nearbyAccessoryBusy ? null : playNearbyAccessorySound, + ), + ], + ), if (fetching == null || fetching == true || (fetching == false && devices.isEmpty)) Center( child: Padding( - padding: const EdgeInsets.only(top: 100), + padding: const EdgeInsets.only(top: 32, bottom: 16), child: Column( children: [ Padding( padding: const EdgeInsets.all(8.0), child: Text( fetching == null - ? "Something went wrong!" + ? (cloudFindMyError ?? "Cloud Find My is unavailable right now.") : fetching == false ? "You have no devices." : "Getting FindMy data...", @@ -638,6 +952,12 @@ class _FindMyPageState extends OptimizedState with SingleTickerProvi ), ), if (fetching == true) buildProgressIndicator(context, size: 15), + if (fetching == null) + TextButton.icon( + onPressed: locationsRequestInFlight ? null : () => getLocations(userInitiated: true), + icon: const Icon(Icons.refresh), + label: const Text("Retry Cloud Find My"), + ), ], ), ), @@ -667,29 +987,15 @@ class _FindMyPageState extends OptimizedState with SingleTickerProvi await panelController.close(); } await completer.future; - final marker = markers.values.firstWhere((e) => + final marker = markers.values.firstWhereOrNull((e) => e.point.latitude == item.location?.latitude && e.point.longitude == item.location?.longitude); + if (marker == null) return; popupController.showPopupsOnlyFor([marker]); mapController.move(LatLng(item.location!.latitude!, item.location!.longitude!), 10); } : null, - trailing: item.location?.latitude != null && item.location?.longitude != null ? ButtonTheme( - minWidth: 1, - child: TextButton( - style: TextButton.styleFrom( - shape: const CircleBorder(), - backgroundColor: context.theme.colorScheme.primaryContainer, - ), - onPressed: () async { - await MapsLauncher.launchCoordinates(item.location!.latitude!, item.location!.longitude!); - }, - child: const Icon( - Icons.directions, - size: 20 - ), - ), - ) : null, + trailing: deviceActions(item), onLongPress: () async { const encoder = JsonEncoder.withIndent(" "); final str = encoder.convert(item.toJson()); @@ -832,9 +1138,10 @@ class _FindMyPageState extends OptimizedState with SingleTickerProvi await panelController.close(); } await completer.future; - final marker = markers.values.firstWhere((e) => + final marker = markers.values.firstWhereOrNull((e) => e.point.latitude == item.location?.latitude && e.point.longitude == item.location?.longitude); + if (marker == null) return; popupController.showPopupsOnlyFor([marker]); mapController.move(LatLng(item.location!.latitude!, item.location!.longitude!), 10); } @@ -904,15 +1211,17 @@ class _FindMyPageState extends OptimizedState with SingleTickerProvi var tile = ListTile( title: Text(ss.settings.redactedMode.value ? "Device" : (item.name ?? "Unknown Device")), subtitle: Text(ss.settings.redactedMode.value ? "Location" : (item.address?.label ?? item.address?.mapItemFullAddress ?? "No location found")), + trailing: deviceActions(item), onTap: item.location?.latitude != null && item.location?.longitude != null ? () async { if (context.isPhone) { await panelController.close(); } await completer.future; - final marker = markers.values.firstWhere((e) => + final marker = markers.values.firstWhereOrNull((e) => e.point.latitude == item.location?.latitude && e.point.longitude == item.location?.longitude); + if (marker == null) return; popupController.showPopupsOnlyFor([marker]); mapController.move( LatLng(item.location!.latitude!, item.location!.longitude!), 10); @@ -1045,8 +1354,9 @@ class _FindMyPageState extends OptimizedState with SingleTickerProvi await panelController.close(); } await completer.future; - final marker = markers.values.firstWhere( + final marker = markers.values.firstWhereOrNull( (e) => e.point.latitude == item.latitude && e.point.longitude == item.longitude); + if (marker == null) return; popupController.showPopupsOnlyFor([marker]); mapController.move(LatLng(item.latitude!, item.longitude!), 10); }, @@ -1416,6 +1726,7 @@ class _FindMyPageState extends OptimizedState with SingleTickerProvi children: [ SlidingUpPanel( controller: panelController, + scrollController: controller1, color: Theme.of(context).colorScheme.surface, borderRadius: const BorderRadius.only( topLeft: Radius.circular(25.0), @@ -1454,6 +1765,7 @@ class _FindMyPageState extends OptimizedState with SingleTickerProvi if (ss.settings.skin.value != Skins.Samsung || kIsWeb || kIsDesktop) return false; final scrollDistance = context.height / 3 - 57; + if (!controller1.hasClients) return false; if (controller1.offset > 0 && controller1.offset < scrollDistance) { final double snapOffset = controller1.offset / scrollDistance > 0.5 ? scrollDistance : 0; @@ -1498,6 +1810,7 @@ class _FindMyPageState extends OptimizedState with SingleTickerProvi if (ss.settings.skin.value != Skins.Samsung || kIsWeb || kIsDesktop) return false; final scrollDistance = context.height / 3 - 57; + if (!controller2.hasClients) return false; if (controller2.offset > 0 && controller2.offset < scrollDistance) { final double snapOffset = controller2.offset / scrollDistance > 0.5 ? scrollDistance : 0; @@ -1770,9 +2083,14 @@ class _FindMyPageState extends OptimizedState with SingleTickerProvi PopupMarkerLayer( options: PopupMarkerLayerOptions( onPopupEvent: (ev, m) async { - final item = m.isEmpty ? null : friends - .firstWhere((e) => e.latitude == m[0].point.latitude && e.longitude == m[0].point.longitude).id; - await api.selectFriend(config: pushService.state!.osConfig, client: fmfClient!, friend: item); + final friend = m.isEmpty + ? null + : friends.firstWhereOrNull( + (e) => e.latitude == m[0].point.latitude && e.longitude == m[0].point.longitude); + if (fmfClient != null) { + await api.selectFriend( + config: pushService.state!.osConfig, client: fmfClient!, friend: friend?.id); + } }, popupController: popupController, markers: markers.values.toList(), @@ -1782,7 +2100,8 @@ class _FindMyPageState extends OptimizedState with SingleTickerProvi if (key?.value == "current") return const SizedBox(); if (key?.value.contains("device")) { String prefix = key!.value.replaceFirst("device-", ""); - final item = devices.firstWhere((e) => e.id == prefix); + final item = devices.firstWhereOrNull((e) => e.id == prefix); + if (item == null) return const SizedBox(); return Padding( padding: const EdgeInsets.only(bottom: 5.0), child: Container( @@ -1826,7 +2145,8 @@ class _FindMyPageState extends OptimizedState with SingleTickerProvi ); } else { String prefix = key!.value.replaceFirst("friend-", ""); - final item = friends.firstWhere((e) => e.handle?.uniqueAddressAndService == prefix); + final item = friends.firstWhereOrNull((e) => e.handle?.uniqueAddressAndService == prefix); + if (item == null) return const SizedBox(); return Padding( padding: const EdgeInsets.only(bottom: 5.0), child: Container( diff --git a/lib/app/layouts/fullscreen_media/dialogs/metadata_dialog.dart b/lib/app/layouts/fullscreen_media/dialogs/metadata_dialog.dart index cfafa3428c..6cb3950126 100644 --- a/lib/app/layouts/fullscreen_media/dialogs/metadata_dialog.dart +++ b/lib/app/layouts/fullscreen_media/dialogs/metadata_dialog.dart @@ -44,7 +44,7 @@ void showMetadataDialog(Attachment a, BuildContext context) { child: Container( padding: const EdgeInsets.all(10.0), decoration: BoxDecoration( - color: context.theme.colorScheme.background, + color: context.theme.colorScheme.surface, borderRadius: BorderRadius.circular(10) ), child: ListView( @@ -64,4 +64,4 @@ void showMetadataDialog(Attachment a, BuildContext context) { ], ), ); -} \ No newline at end of file +} diff --git a/lib/app/layouts/fullscreen_media/fullscreen_holder.dart b/lib/app/layouts/fullscreen_media/fullscreen_holder.dart index f02e7975ad..01c2e9520e 100644 --- a/lib/app/layouts/fullscreen_media/fullscreen_holder.dart +++ b/lib/app/layouts/fullscreen_media/fullscreen_holder.dart @@ -3,7 +3,10 @@ import 'package:bluebubbles/app/wrappers/stateful_boilerplate.dart'; import 'package:bluebubbles/utils/logger/logger.dart'; import 'package:bluebubbles/helpers/helpers.dart'; import 'package:bluebubbles/app/layouts/fullscreen_media/fullscreen_image.dart'; +import 'package:bluebubbles/app/layouts/fullscreen_media/fullscreen_media_list.dart'; +import 'package:bluebubbles/app/layouts/fullscreen_media/fullscreen_media_operation_gate.dart'; import 'package:bluebubbles/app/layouts/fullscreen_media/fullscreen_video.dart'; +import 'package:bluebubbles/app/layouts/fullscreen_media/fullscreen_video_page_swipe.dart'; import 'package:bluebubbles/app/wrappers/titlebar_wrapper.dart'; import 'package:bluebubbles/app/wrappers/theme_switcher.dart'; import 'package:bluebubbles/database/models.dart'; @@ -17,17 +20,18 @@ import 'package:get/get.dart'; import 'package:photo_view/photo_view.dart' show PhotoViewGestureDetectorScope; class FullscreenMediaHolder extends StatefulWidget { - FullscreenMediaHolder({ - super.key, - required this.attachment, - required this.showInteractions, - this.currentChat, - this.videoController, - this.mute - }); + FullscreenMediaHolder( + {super.key, + required this.attachment, + required this.showInteractions, + this.currentChat, + this.mediaPager, + this.videoController, + this.mute}); final ChatLifecycleManager? currentChat; final Attachment attachment; + final ConversationMediaPager? mediaPager; final bool showInteractions; final VideoController? videoController; final RxBool? mute; @@ -38,37 +42,146 @@ class FullscreenMediaHolder extends StatefulWidget { class FullscreenMediaHolderState extends OptimizedState { final focusNode = FocusNode(); + final Map _downloadGates = {}; late final PageController controller; - late final messageService = widget.currentChat == null ? null : ms(widget.currentChat!.chat.guid); - late List attachments = widget.currentChat == null - ? [attachment] - : messageService!.struct.attachments.where((e) => e.mimeStart == "image" || e.mimeStart == "video").toList(); + late final messageService = + widget.currentChat == null ? null : ms(widget.currentChat!.chat.guid); + late List attachments; + ConversationMediaPager? mediaPager; + bool ownsMediaPager = false; int currentIndex = 0; ScrollPhysics? physics; Attachment get attachment => widget.attachment; bool showAppBar = true; + bool _isCurrentAttachment(Attachment candidate) { + if (attachments.isEmpty || + currentIndex < 0 || + currentIndex >= attachments.length) return false; + final current = attachments[currentIndex]; + if (candidate.guid != null && current.guid != null) { + return candidate.guid == current.guid; + } + return identical(candidate, current); + } + + AttachmentDownloadController _startDownload(Attachment target) { + final gate = _downloadGates.putIfAbsent( + target.guid!, + FullscreenMediaOperationGate.new, + ); + final generation = gate.begin(); + return attachmentDownloader.startDownload(target, onComplete: (_) { + if (!mounted || + !gate.isCurrent(generation) || + !_isCurrentAttachment(target)) return; + setState(() {}); + }); + } + @override void initState() { super.initState(); + mediaPager = widget.mediaPager; + if (mediaPager == null && !kIsWeb && widget.currentChat != null) { + mediaPager = ConversationMediaPager(chat: widget.currentChat!.chat); + ownsMediaPager = true; + mediaPager!.seed( + buildFullscreenMediaList( + messageService!.struct.attachments, + attachment, + ), + selected: attachment, + ); + } + attachments = mediaPager?.items ?? + buildFullscreenMediaList([], attachment); + mediaPager?.addListener(_onMediaChanged); + if (kIsWeb || !widget.showInteractions) { controller = PageController(initialPage: 0); } else { - if (widget.currentChat != null) { + if (widget.currentChat != null || mediaPager != null) { currentIndex = attachments.indexWhere((e) => e.guid == attachment.guid); if (currentIndex == -1) { - attachments.add(attachment); - currentIndex = attachments.indexWhere((e) => e.guid == attachment.guid); + attachments = [...attachments, attachment]; + currentIndex = attachments.length - 1; } } controller = PageController(initialPage: currentIndex); + physics = _pagePhysicsFor(currentIndex); + } + if (ownsMediaPager) { + mediaPager!.primeAroundSelection(); + } + } + + void _onMediaChanged() { + if (!mounted || mediaPager == null) return; + final currentGuid = attachments.isEmpty + ? attachment.guid + : attachments[currentIndex.clamp(0, attachments.length - 1)].guid; + final updated = mediaPager!.items; + final updatedIndex = updated.indexWhere((item) => + item.guid == currentGuid || + (currentGuid == null && identical(item, attachment))); + if (updatedIndex < 0) return; + + setState(() { + attachments = updated; + currentIndex = updatedIndex; + physics = _pagePhysicsFor(updatedIndex); + }); + WidgetsBinding.instance.addPostFrameCallback((_) { + if (mounted && controller.hasClients) { + controller.jumpToPage(updatedIndex); + } + }); + } + + void _onVideoPageSwipe(FullscreenVideoPageSwipeDirection direction) { + if (!mounted || !controller.hasClients || attachments.length < 2) return; + + final reverse = + ss.settings.fullscreenViewerSwipeDir.value == SwipeDirection.RIGHT; + final indexDelta = fullscreenVideoPageDelta(direction, reverse: reverse); + final target = currentIndex + indexDelta; + if (target < 0 || target >= attachments.length) return; + + controller.animateToPage( + target, + duration: const Duration(milliseconds: 260), + curve: Curves.easeOutCubic, + ); + } + + ScrollPhysics _pagePhysicsFor(int index) { + if (attachments.length < 2) { + return const NeverScrollableScrollPhysics(); + } + if (!kIsWeb && + !kIsDesktop && + index >= 0 && + index < attachments.length && + attachments[index].mimeStart == "video") { + // Video controls also observe horizontal drags. Disable the PageView's + // competing recognizer while a video is active so the raw video swipe + // surface is the single owner of page navigation. + return const NeverScrollableScrollPhysics(); } + return ThemeSwitcher.getScrollPhysics(); } @override void dispose() { + for (final gate in _downloadGates.values) { + gate.dispose(); + } + mediaPager?.removeListener(_onMediaChanged); + if (ownsMediaPager) mediaPager?.dispose(); controller.dispose(); + focusNode.dispose(); super.dispose(); } @@ -79,11 +192,13 @@ class FullscreenMediaHolderState extends OptimizedState { value: SystemUiOverlayStyle( systemNavigationBarColor: ss.settings.immersiveMode.value ? Colors.transparent - : context.theme.colorScheme.background, // navigation bar color - systemNavigationBarIconBrightness: context.theme.colorScheme.brightness.opposite, + : context.theme.colorScheme.surface, // navigation bar color + systemNavigationBarIconBrightness: + context.theme.colorScheme.brightness.opposite, statusBarColor: Colors.transparent, // status bar color - statusBarIconBrightness: - ss.settings.skin.value != Skins.iOS ? Brightness.light : context.theme.colorScheme.brightness.opposite, + statusBarIconBrightness: ss.settings.skin.value != Skins.iOS + ? Brightness.light + : context.theme.colorScheme.brightness.opposite, ), child: Actions( actions: { @@ -92,7 +207,9 @@ class FullscreenMediaHolderState extends OptimizedState { child: Scaffold( appBar: !iOS || !showAppBar // AppBar placeholder to prevent shifting of content when toggling the app bar - ? PreferredSize(preferredSize: const Size.fromHeight(56), child: Container()) + ? PreferredSize( + preferredSize: const Size.fromHeight(56), + child: Container()) : AppBar( leading: XGestureDetector( supportTouch: true, @@ -103,8 +220,8 @@ class FullscreenMediaHolderState extends OptimizedState { }, child: TextButton( child: Text("Done", - style: - context.theme.textTheme.bodyLarge!.copyWith(color: context.theme.colorScheme.primary)), + style: context.theme.textTheme.bodyLarge!.copyWith( + color: context.theme.colorScheme.primary)), onPressed: () { if (kIsDesktop) return; Navigator.of(context).pop(); @@ -113,17 +230,21 @@ class FullscreenMediaHolderState extends OptimizedState { ), leadingWidth: 75, title: Text( - kIsWeb || !widget.showInteractions || widget.currentChat == null + kIsWeb || + !widget.showInteractions || + attachments.length == 1 ? "Media" : "${currentIndex + 1} of ${attachments.length}", - style: context.theme.textTheme.titleLarge! - .copyWith(color: context.theme.colorScheme.properOnSurface)), + style: context.theme.textTheme.titleLarge!.copyWith( + color: context.theme.colorScheme.properOnSurface)), centerTitle: iOS, - iconTheme: IconThemeData(color: context.theme.colorScheme.primary), + iconTheme: + IconThemeData(color: context.theme.colorScheme.primary), backgroundColor: context.theme.colorScheme.properSurface, - systemOverlayStyle: context.theme.colorScheme.brightness == Brightness.dark - ? SystemUiOverlayStyle.light - : SystemUiOverlayStyle.dark, + systemOverlayStyle: + context.theme.colorScheme.brightness == Brightness.dark + ? SystemUiOverlayStyle.light + : SystemUiOverlayStyle.dark, ), backgroundColor: Colors.black, body: FocusScope( @@ -135,16 +256,26 @@ class FullscreenMediaHolderState extends OptimizedState { "Got device label ${event.deviceType.label}, physical key ${event.physicalKey.toString()}, logical key ${event.logicalKey.toString()}", tag: "RawKeyboardListener"); if (event.physicalKey.debugName == "Arrow Right") { - if (ss.settings.fullscreenViewerSwipeDir.value == SwipeDirection.RIGHT) { - controller.previousPage(duration: const Duration(milliseconds: 300), curve: Curves.easeIn); + if (ss.settings.fullscreenViewerSwipeDir.value == + SwipeDirection.RIGHT) { + controller.previousPage( + duration: const Duration(milliseconds: 300), + curve: Curves.easeIn); } else { - controller.nextPage(duration: const Duration(milliseconds: 300), curve: Curves.easeIn); + controller.nextPage( + duration: const Duration(milliseconds: 300), + curve: Curves.easeIn); } } else if (event.physicalKey.debugName == "Arrow Left") { - if (ss.settings.fullscreenViewerSwipeDir.value == SwipeDirection.LEFT) { - controller.previousPage(duration: const Duration(milliseconds: 300), curve: Curves.easeIn); + if (ss.settings.fullscreenViewerSwipeDir.value == + SwipeDirection.LEFT) { + controller.previousPage( + duration: const Duration(milliseconds: 300), + curve: Curves.easeIn); } else { - controller.nextPage(duration: const Duration(milliseconds: 300), curve: Curves.easeIn); + controller.nextPage( + duration: const Duration(milliseconds: 300), + curve: Curves.easeIn); } } else if (event.physicalKey.debugName == "Escape") { Navigator.of(context).pop(); @@ -158,156 +289,196 @@ class FullscreenMediaHolderState extends OptimizedState { // FullscreenImage disables this PageView while zoomed. axis: Axis.horizontal, child: PageView.builder( - physics: physics ?? - (attachments.length == 1 - ? const NeverScrollableScrollPhysics() - : ThemeSwitcher.getScrollPhysics()), - reverse: ss.settings.fullscreenViewerSwipeDir.value == SwipeDirection.RIGHT, - itemCount: attachments.length, - onPageChanged: (int val) { - widget.videoController?.player.pause(); - setState(() { - currentIndex = val; - }); - }, - controller: controller, - itemBuilder: (BuildContext context, int index) { - final attachment = attachments[index]; - dynamic content = - as.getContent(attachment, path: attachment.guid == null ? attachment.sourcePath : null); - final key = attachment.guid ?? attachment.transferName ?? randomString(8); + physics: physics ?? + (attachments.length == 1 + ? const NeverScrollableScrollPhysics() + : ThemeSwitcher.getScrollPhysics()), + reverse: ss.settings.fullscreenViewerSwipeDir.value == + SwipeDirection.RIGHT, + itemCount: attachments.length, + onPageChanged: (int val) { + widget.videoController?.player.pause(); + setState(() { + currentIndex = val; + physics = _pagePhysicsFor(val); + }); + if (val <= 2) { + mediaPager?.loadNewer(); + } + if (val >= attachments.length - 3) { + mediaPager?.loadOlder(); + } + }, + controller: controller, + itemBuilder: (BuildContext context, int index) { + final attachment = attachments[index]; + final content = as.getContent(attachment, + path: attachment.guid == null + ? attachment.sourcePath + : null); + final key = attachment.guid ?? + attachment.transferName ?? + randomString(8); - if (content is PlatformFile) { - if (attachment.mimeStart == "image") { - return FullscreenImage( - key: Key(key), - attachment: attachment, - file: content, - showInteractions: widget.showInteractions, - updatePhysics: (ScrollPhysics p) { - if (physics != p) { - setState(() { - physics = p; - }); - } - }, - onOverlayToggle: (show) { - if (showAppBar != show) { - setState(() { - showAppBar = show; - }); - } + if (content is PlatformFile) { + if (attachment.mimeStart == "image") { + return FullscreenImage( + key: Key(key), + attachment: attachment, + file: content, + showInteractions: widget.showInteractions, + updatePhysics: (ScrollPhysics p) { + if (!mounted || + !_isCurrentAttachment(attachment)) { + return; + } + if (physics != p) { + setState(() { + physics = p; + }); + } + }, + onOverlayToggle: (show) { + if (!mounted || + !_isCurrentAttachment(attachment)) { + return; + } + if (showAppBar != show) { + setState(() { + showAppBar = show; + }); + } + }, + ); + } else if (attachment.mimeStart == "video") { + return FullscreenVideo( + key: Key(key), + file: content, + attachment: attachment, + showInteractions: widget.showInteractions, + isActive: index == currentIndex, + onPageSwipe: attachments.length < 2 + ? null + : _onVideoPageSwipe, + videoController: widget.videoController, + mute: widget.mute, + ); + } else { + return const SizedBox.shrink(); + } + } else if (content is Attachment) { + final Attachment _content = content; + return InkWell( + onTap: () { + _startDownload(_content); + setState(() {}); }, + child: Column( + mainAxisSize: MainAxisSize.min, + children: [ + SizedBox( + height: 40, + width: 40, + child: Center( + child: Icon( + iOS + ? CupertinoIcons.cloud_download + : Icons.cloud_download_outlined, + size: 30)), + ), + const SizedBox(height: 5), + Text( + (_content.mimeType ?? ""), + style: context.theme.textTheme.bodyLarge! + .copyWith( + color: context + .theme.colorScheme.properOnSurface), + maxLines: 2, + overflow: TextOverflow.ellipsis, + ), + const SizedBox(height: 10), + Text( + _content.getFriendlySize(), + style: context.theme.textTheme.bodyMedium! + .copyWith( + color: context + .theme.colorScheme.properOnSurface), + maxLines: 1, + ), + ], + ), ); - } else if (attachment.mimeStart == "video") { - return FullscreenVideo( - key: Key(key), - file: content, - attachment: attachment, - showInteractions: widget.showInteractions, - videoController: widget.videoController, - mute: widget.mute, + } else if (content is AttachmentDownloadController) { + final AttachmentDownloadController _content = content; + return InkWell( + onTap: () { + final AttachmentDownloadController _content = + content; + if (!_content.error.value) return; + Get.delete( + tag: _content.attachment.guid); + _startDownload(_content.attachment); + setState(() {}); + }, + child: Padding( + padding: const EdgeInsets.all(20.0), + child: Obx(() { + return Column( + mainAxisSize: MainAxisSize.min, + children: [ + SizedBox( + height: 40, + width: 40, + child: Center( + child: _content.error.value + ? Icon( + iOS + ? CupertinoIcons + .arrow_clockwise + : Icons.refresh, + size: 30) + : CircleProgressBar( + value: _content.progress.value + ?.toDouble() ?? + 0, + backgroundColor: context + .theme.colorScheme.outline, + foregroundColor: context.theme + .colorScheme.properOnSurface, + ), + ), + ), + _content.error.value + ? const SizedBox(height: 10) + : const SizedBox(height: 5), + Text( + _content.error.value + ? "Failed to download!" + : (_content.attachment.mimeType ?? ""), + style: context.theme.textTheme.bodyLarge! + .copyWith( + color: context.theme.colorScheme + .properOnSurface), + maxLines: 2, + overflow: TextOverflow.ellipsis, + ) + ], + ); + }), + ), ); } else { - return const SizedBox.shrink(); - } - } else if (content is Attachment) { - final Attachment _content = content; - return InkWell( - onTap: () { - setState(() { - content = attachmentDownloader.startDownload(content, onComplete: (file) { - setState(() { - content = file; - }); - }); - }); - }, - child: Column( - mainAxisSize: MainAxisSize.min, - children: [ - SizedBox( - height: 40, - width: 40, - child: Center( - child: Icon(iOS ? CupertinoIcons.cloud_download : Icons.cloud_download_outlined, - size: 30)), - ), - const SizedBox(height: 5), - Text( - (_content.mimeType ?? ""), - style: context.theme.textTheme.bodyLarge! - .copyWith(color: context.theme.colorScheme.properOnSurface), - maxLines: 2, - overflow: TextOverflow.ellipsis, - ), - const SizedBox(height: 10), + return Column( + mainAxisAlignment: MainAxisAlignment.center, + children: [ Text( - _content.getFriendlySize(), - style: context.theme.textTheme.bodyMedium! - .copyWith(color: context.theme.colorScheme.properOnSurface), - maxLines: 1, + "Error loading attachment", + style: context.theme.textTheme.bodyLarge, ), ], - ), - ); - } else if (content is AttachmentDownloadController) { - final AttachmentDownloadController _content = content; - return InkWell( - onTap: () { - final AttachmentDownloadController _content = content; - if (!_content.error.value) return; - Get.delete(tag: _content.attachment.guid); - content = attachmentDownloader.startDownload(_content.attachment, onComplete: (file) { - setState(() { - content = file; - }); - }); - }, - child: Padding( - padding: const EdgeInsets.all(20.0), - child: Obx(() { - return Column( - mainAxisSize: MainAxisSize.min, - children: [ - SizedBox( - height: 40, - width: 40, - child: Center( - child: _content.error.value - ? Icon(iOS ? CupertinoIcons.arrow_clockwise : Icons.refresh, size: 30) - : CircleProgressBar( - value: _content.progress.value?.toDouble() ?? 0, - backgroundColor: context.theme.colorScheme.outline, - foregroundColor: context.theme.colorScheme.properOnSurface, - ), - ), - ), - _content.error.value ? const SizedBox(height: 10) : const SizedBox(height: 5), - Text( - _content.error.value ? "Failed to download!" : (_content.attachment.mimeType ?? ""), - style: context.theme.textTheme.bodyLarge! - .copyWith(color: context.theme.colorScheme.properOnSurface), - maxLines: 2, - overflow: TextOverflow.ellipsis, - ) - ], - ); - }), - ), - ); - } else { - return Column( - mainAxisAlignment: MainAxisAlignment.center, - children: [ - Text( - "Error loading attachment", - style: context.theme.textTheme.bodyLarge, - ), - ], - ); - } - }, + ); + } + }, ), ), ), diff --git a/lib/app/layouts/fullscreen_media/fullscreen_image.dart b/lib/app/layouts/fullscreen_media/fullscreen_image.dart index ededaaaa15..2f79a29c57 100644 --- a/lib/app/layouts/fullscreen_media/fullscreen_image.dart +++ b/lib/app/layouts/fullscreen_media/fullscreen_image.dart @@ -2,6 +2,7 @@ import 'dart:async'; import 'dart:isolate'; import 'package:bluebubbles/app/layouts/fullscreen_media/dialogs/metadata_dialog.dart'; +import 'package:bluebubbles/app/layouts/fullscreen_media/fullscreen_media_operation_gate.dart'; import 'package:bluebubbles/app/wrappers/stateful_boilerplate.dart'; import 'package:bluebubbles/utils/share.dart'; import 'package:bluebubbles/helpers/helpers.dart'; @@ -38,8 +39,10 @@ class FullscreenImage extends StatefulWidget { class _FullscreenImageState extends OptimizedState with AutomaticKeepAliveClientMixin { final PhotoViewController controller = PhotoViewController(); + final FullscreenMediaOperationGate _loadGate = FullscreenMediaOperationGate(); bool showOverlay = true; bool hasError = false; + bool _refreshInProgress = false; Uint8List? bytes; PlatformFile get file => widget.file; @@ -50,47 +53,83 @@ class _FullscreenImageState extends OptimizedState with Automat void initState() { super.initState(); message?.handle = message?.getHandle(); + final initialFile = file; + final initialAttachment = attachment; + final generation = _loadGate.begin(); updateObx(() { - initBytes(); + _loadBytes(initialFile, initialAttachment, generation); }); } Future initBytes() async { - if (kIsWeb || file.path == null) { - if (attachment.mimeType?.contains("image/tif") ?? false) { + final generation = _loadGate.begin(); + await _loadBytes(file, attachment, generation); + } + + Future _loadBytes( + PlatformFile sourceFile, + Attachment sourceAttachment, + int generation, + ) async { + Uint8List? loadedBytes; + if (kIsWeb || sourceFile.path == null) { + if (sourceAttachment.mimeType?.contains("image/tif") ?? false) { final receivePort = ReceivePort(); - await Isolate.spawn(unsupportedToPngIsolate, IsolateData(file, receivePort.sendPort)); + await Isolate.spawn(unsupportedToPngIsolate, IsolateData(sourceFile, receivePort.sendPort)); // Get the processed image from the isolate. - final image = await receivePort.first as Uint8List?; - bytes = image; + loadedBytes = await receivePort.first as Uint8List?; } else { - bytes = file.bytes; + loadedBytes = sourceFile.bytes; } - } else if (attachment.canCompress) { - bytes = await as.loadAndGetProperties(attachment, actualPath: file.path!); + } else if (sourceAttachment.canCompress) { + loadedBytes = await as.loadAndGetProperties(sourceAttachment, actualPath: sourceFile.path!); // All other attachments can be held in memory as bytes } else { - bytes = await File(file.path!).readAsBytes(); + loadedBytes = await File(sourceFile.path!).readAsBytes(); } - setState(() {}); + + if (!mounted || !_loadGate.isCurrent(generation)) return; + setState(() { + bytes = loadedBytes; + hasError = false; + }); + } + + @override + void didUpdateWidget(covariant FullscreenImage oldWidget) { + super.didUpdateWidget(oldWidget); + if (oldWidget.file == widget.file && oldWidget.attachment == widget.attachment) return; + _refreshInProgress = false; + bytes = null; + hasError = false; + initBytes(); } @override void dispose() { + _loadGate.dispose(); controller.dispose(); super.dispose(); } void refreshAttachment() { + if (_refreshInProgress) return; + _refreshInProgress = true; + final generation = _loadGate.begin(); + final sourceAttachment = widget.attachment; showSnackbar('In Progress', 'Redownloading attachment. Please wait...'); setState(() { bytes = null; + hasError = false; }); - as.redownloadAttachment(widget.attachment, onComplete: (file) { - setState(() { - bytes = file.bytes; - }); + as.redownloadAttachment(sourceAttachment, onComplete: (file) async { + if (!mounted || !_loadGate.isCurrent(generation)) return; + await _loadBytes(file, sourceAttachment, generation); + if (!mounted || !_loadGate.isCurrent(generation)) return; + _refreshInProgress = false; }, onError: () { + if (!mounted || !_loadGate.isCurrent(generation)) return; + _refreshInProgress = false; setState(() { hasError = true; }); @@ -126,8 +165,9 @@ class _FullscreenImageState extends OptimizedState with Automat color: context.theme.colorScheme.onSecondary, ), onPressed: () async { - if (widget.file.path == null) + if (widget.file.path == null) { return showSnackbar("Error", "Failed to find a path to share attachment!"); + } Share.file( "Shared ${widget.attachment.mimeType!.split("/")[0]} from OpenBubbles: ${widget.attachment.transferName}", widget.file.path!, diff --git a/lib/app/layouts/fullscreen_media/fullscreen_media_list.dart b/lib/app/layouts/fullscreen_media/fullscreen_media_list.dart new file mode 100644 index 0000000000..4247ce486d --- /dev/null +++ b/lib/app/layouts/fullscreen_media/fullscreen_media_list.dart @@ -0,0 +1,41 @@ +import 'package:bluebubbles/database/models.dart'; + +/// Builds the ordered set of images and videos shown by the fullscreen viewer. +/// +/// The selected attachment is retained even when it has not yet reached the +/// conversation's loaded-message cache. GUID-backed entries are deduplicated +/// without changing the conversation's existing media order. +List buildFullscreenMediaList( + Iterable candidates, + Attachment selected, +) { + final media = []; + final guids = {}; + + void add(Attachment attachment) { + if (media.contains(attachment)) { + return; + } + if (attachment.mimeStart != 'image' && attachment.mimeStart != 'video') { + return; + } + final guid = attachment.guid; + if (guid != null && !guids.add(guid)) { + return; + } + media.add(attachment); + } + + for (final attachment in candidates) { + add(attachment); + } + add(selected); + + // A malformed or not-yet-hydrated MIME type must not make the attachment + // that opened the viewer disappear. + if (!media.contains(selected) && + (selected.guid == null || !media.any((attachment) => attachment.guid == selected.guid))) { + media.add(selected); + } + return media; +} diff --git a/lib/app/layouts/fullscreen_media/fullscreen_media_operation_gate.dart b/lib/app/layouts/fullscreen_media/fullscreen_media_operation_gate.dart new file mode 100644 index 0000000000..9c6a7f5bf2 --- /dev/null +++ b/lib/app/layouts/fullscreen_media/fullscreen_media_operation_gate.dart @@ -0,0 +1,16 @@ +/// Rejects asynchronous fullscreen-media results that no longer belong to the +/// active operation. +class FullscreenMediaOperationGate { + int _generation = 0; + bool _disposed = false; + + int begin() => ++_generation; + + bool isCurrent(int generation) => !_disposed && generation == _generation; + + void dispose() { + if (_disposed) return; + _disposed = true; + _generation++; + } +} diff --git a/lib/app/layouts/fullscreen_media/fullscreen_video.dart b/lib/app/layouts/fullscreen_media/fullscreen_video.dart index 03e0a22eda..94e85f525f 100644 --- a/lib/app/layouts/fullscreen_media/fullscreen_video.dart +++ b/lib/app/layouts/fullscreen_media/fullscreen_video.dart @@ -1,6 +1,7 @@ import 'dart:async'; import 'package:bluebubbles/app/layouts/fullscreen_media/dialogs/metadata_dialog.dart'; +import 'package:bluebubbles/app/layouts/fullscreen_media/fullscreen_video_page_swipe.dart'; import 'package:bluebubbles/app/wrappers/stateful_boilerplate.dart'; import 'package:bluebubbles/helpers/helpers.dart'; import 'package:bluebubbles/database/models.dart'; @@ -22,6 +23,8 @@ class FullscreenVideo extends StatefulWidget { required this.file, required this.attachment, required this.showInteractions, + this.isActive = true, + this.onPageSwipe, this.videoController, this.mute, }); @@ -29,6 +32,8 @@ class FullscreenVideo extends StatefulWidget { final PlatformFile file; final Attachment attachment; final bool showInteractions; + final bool isActive; + final ValueChanged? onPageSwipe; final VideoController? videoController; final RxBool? mute; @@ -92,6 +97,39 @@ class _FullscreenVideoState extends OptimizedState setState(() {}); } + @override + void didUpdateWidget(covariant FullscreenVideo oldWidget) { + super.didUpdateWidget(oldWidget); + if (oldWidget.isActive != widget.isActive) { + updateKeepAlive(); + } + if (oldWidget.isActive && !widget.isActive) { + unawaited(_pauseWhenInactive()); + } + } + + Future _pauseWhenInactive() async { + final initialization = _initialization; + if (initialization != null) { + try { + await initialization; + } catch (_) { + return; + } + } + if (hasDisposed || widget.isActive) return; + await videoController.player.pause(); + if (hasDisposed || widget.isActive) return; + showPlayPauseOverlay.value = true; + } + + void _handlePageSwipe(FullscreenVideoPageSwipeDirection direction) { + if (!widget.isActive || widget.onPageSwipe == null) return; + unawaited(videoController.player.pause()); + showPlayPauseOverlay.value = true; + widget.onPageSwipe!(direction); + } + void createListener(VideoController controller) { if (hasListener) return; @@ -185,7 +223,7 @@ class _FullscreenVideoState extends OptimizedState } @override - bool get wantKeepAlive => true; + bool get wantKeepAlive => widget.isActive; @override Widget build(BuildContext context) { @@ -283,18 +321,43 @@ class _FullscreenVideoState extends OptimizedState child: Stack( alignment: Alignment.center, children: [ - Video( + FullscreenVideoPageSwipeSurface( + onPageSwipe: widget.onPageSwipe == null + ? null + : _handlePageSwipe, + child: Video( controller: videoController, - controls: (state) => Padding( - padding: EdgeInsets.all( - !kIsWeb && !kIsDesktop ? 0 : 20) - .copyWith( - bottom: - !kIsWeb && !kIsDesktop ? 10 : 0), - child: media_kit_video_controls - .AdaptiveVideoControls(state), - ), - filterQuality: FilterQuality.medium), + controls: (state) { + Widget controls = Padding( + padding: EdgeInsets.all( + !kIsWeb && !kIsDesktop ? 0 : 20) + .copyWith( + bottom: !kIsWeb && !kIsDesktop ? 10 : 0), + child: media_kit_video_controls + .AdaptiveVideoControls(state), + ); + + if (widget.onPageSwipe != null && + !kIsWeb && + !kIsDesktop) { + // Preserve timeline scrubbing while yielding + // full-surface horizontal swipes to the pager. + controls = media_kit_video_controls + .MaterialVideoControlsTheme( + normal: media_kit_video_controls + .kDefaultMaterialVideoControlsThemeData + .copyWith(seekGesture: false), + fullscreen: media_kit_video_controls + .kDefaultMaterialVideoControlsThemeDataFullscreen + .copyWith(seekGesture: false), + child: controls, + ); + } + return controls; + }, + filterQuality: FilterQuality.medium, + ), + ), if (kIsWeb || kIsDesktop) Obx(() { return MouseRegion( @@ -329,7 +392,7 @@ class _FullscreenVideoState extends OptimizedState width: 75, decoration: BoxDecoration( color: context - .theme.colorScheme.background + .theme.colorScheme.surface .withOpacity(0.5), borderRadius: BorderRadius.circular(40), ), diff --git a/lib/app/layouts/fullscreen_media/fullscreen_video_page_swipe.dart b/lib/app/layouts/fullscreen_media/fullscreen_video_page_swipe.dart new file mode 100644 index 0000000000..c2b9268b93 --- /dev/null +++ b/lib/app/layouts/fullscreen_media/fullscreen_video_page_swipe.dart @@ -0,0 +1,148 @@ +import 'dart:math' as math; + +import 'package:flutter/widgets.dart'; + +/// The physical direction of a swipe over a fullscreen video. +enum FullscreenVideoPageSwipeDirection { + left, + right, +} + +/// Converts a physical swipe to the neighboring PageView index delta. +int fullscreenVideoPageDelta( + FullscreenVideoPageSwipeDirection direction, { + required bool reverse, +}) { + final physicalForward = direction == FullscreenVideoPageSwipeDirection.left; + return physicalForward == reverse ? -1 : 1; +} + +/// Lets fullscreen videos participate in the surrounding media [PageView]. +/// +/// media_kit's mobile controls own a full-surface horizontal drag recognizer +/// for seeking. That recognizer wins Flutter's gesture arena before the parent +/// PageView can see the drag, even when seeking is disabled. A raw [Listener] +/// observes the same pointer sequence without competing in that arena, so +/// video controls and timeline scrubbing remain interactive while deliberate +/// swipes over the video can still request an adjacent media page. +class FullscreenVideoPageSwipeSurface extends StatefulWidget { + const FullscreenVideoPageSwipeSurface({ + super.key, + required this.child, + required this.onPageSwipe, + this.controlsExclusionHeight = 88, + this.minimumDistance = 48, + this.minimumFlingDistance = 18, + this.minimumFlingVelocity = 500, + }); + + final Widget child; + final ValueChanged? onPageSwipe; + + /// Bottom area reserved for the seek bar and transport controls. + final double controlsExclusionHeight; + + /// Distance needed for a normal swipe. + final double minimumDistance; + + /// Minimum distance accepted for a fast fling. + final double minimumFlingDistance; + + /// Horizontal logical pixels per second needed for a short fling. + final double minimumFlingVelocity; + + @override + State createState() => + _FullscreenVideoPageSwipeSurfaceState(); +} + +class _FullscreenVideoPageSwipeSurfaceState + extends State { + int? _pointer; + Offset? _origin; + Duration? _startedAt; + bool _startedOverControls = false; + + void _reset() { + _pointer = null; + _origin = null; + _startedAt = null; + _startedOverControls = false; + } + + void _onPointerDown(PointerDownEvent event, double height) { + if (widget.onPageSwipe == null || _pointer != null) return; + + _pointer = event.pointer; + _origin = event.localPosition; + _startedAt = event.timeStamp; + _startedOverControls = event.localPosition.dy >= + math.max(0, height - widget.controlsExclusionHeight); + } + + void _onPointerUp(PointerUpEvent event) { + if (event.pointer != _pointer) return; + + final origin = _origin; + final latest = event.localPosition; + final startedAt = _startedAt; + final callback = widget.onPageSwipe; + final startedOverControls = _startedOverControls; + _reset(); + + if (origin == null || + startedAt == null || + callback == null || + startedOverControls) { + return; + } + + final delta = latest - origin; + final horizontalDistance = delta.dx.abs(); + final verticalDistance = delta.dy.abs(); + if (horizontalDistance <= verticalDistance * 1.2) return; + + final elapsedMicros = + math.max(1, (event.timeStamp - startedAt).inMicroseconds); + final horizontalVelocity = + horizontalDistance * Duration.microsecondsPerSecond / elapsedMicros; + final isDistanceSwipe = horizontalDistance >= widget.minimumDistance; + final isFling = horizontalDistance >= widget.minimumFlingDistance && + horizontalVelocity >= widget.minimumFlingVelocity; + if (!isDistanceSwipe && !isFling) return; + + callback( + delta.dx < 0 + ? FullscreenVideoPageSwipeDirection.left + : FullscreenVideoPageSwipeDirection.right, + ); + } + + void _onPointerCancel(PointerCancelEvent event) { + if (event.pointer == _pointer) _reset(); + } + + @override + void didUpdateWidget(covariant FullscreenVideoPageSwipeSurface oldWidget) { + super.didUpdateWidget(oldWidget); + if (widget.onPageSwipe == null) _reset(); + } + + @override + Widget build(BuildContext context) { + if (widget.onPageSwipe == null) return widget.child; + + return LayoutBuilder( + builder: (context, constraints) { + return Listener( + behavior: HitTestBehavior.translucent, + onPointerDown: (event) => + _onPointerDown(event, constraints.maxHeight), + onPointerUp: _onPointerUp, + onPointerCancel: _onPointerCancel, + child: widget.child, + ); + }, + ); + } +} diff --git a/lib/app/layouts/settings/pages/desktop/desktop_panel.dart b/lib/app/layouts/settings/pages/desktop/desktop_panel.dart index cafe7d6b52..800e2f2cc2 100644 --- a/lib/app/layouts/settings/pages/desktop/desktop_panel.dart +++ b/lib/app/layouts/settings/pages/desktop/desktop_panel.dart @@ -19,9 +19,12 @@ class DesktopPanel extends StatefulWidget { @override State createState() => _DesktopPanelState(); } - class _DesktopPanelState extends OptimizedState { - final RxList showButtons = RxList.filled(ReactionTypes.toList().length + 1, false); + // Notification actions intentionally exclude reaction types that cannot be + // represented as fixed Windows notification buttons (for example, arbitrary + // emoji and sticker reactions). Keep hover state aligned to the configured + // action list so future ReactionTypes cannot create out-of-range widgets. + final RxList showButtons = RxList.filled(ss.settings.actionList.length, false); final int maxActions = Platform.isWindows ? 5 : ss.settings.actionList.length; // Don't limit actions on Linux @override @@ -205,7 +208,7 @@ class _DesktopPanelState extends OptimizedState { saveSettings(); }, children: List.generate( - ReactionTypes.toList().length + 1, + ss.settings.actionList.length, (int index) => MouseRegion( cursor: SystemMouseCursors.click, onEnter: (event) => showButtons[index] = true, @@ -312,7 +315,9 @@ class _DesktopPanelState extends OptimizedState { .settings .selectedActionIndices .where((s) => - ss.settings.enablePrivateAPI.value || s == markReadIndex); + s >= 0 && + s < ss.settings.actionList.length && + (ss.settings.enablePrivateAPI.value || s == markReadIndex)); int numActions = actualIndices.length; bool showMarkRead = ss.settings.selectedActionIndices.contains(markReadIndex); @@ -438,7 +443,8 @@ class _DesktopPanelState extends OptimizedState { index == markReadIndex ? ss.settings.actionList[index] : ReactionTypes.reactionToEmoji[ - ss.settings.actionList[index]]!, + ss.settings.actionList[index]] ?? + ss.settings.actionList[index], style: context.textTheme.bodyMedium! .copyWith(fontSize: size * 0.037), textAlign: TextAlign.center, @@ -459,7 +465,9 @@ class _DesktopPanelState extends OptimizedState { .settings .selectedActionIndices .where((s) => - ss.settings.enablePrivateAPI.value || s == markReadIndex); + s >= 0 && + s < ss.settings.actionList.length && + (ss.settings.enablePrivateAPI.value || s == markReadIndex)); int numActions = actualIndices.length; bool showMarkRead = ss.settings.selectedActionIndices.contains(markReadIndex); diff --git a/lib/app/layouts/settings/pages/misc/troubleshoot_panel.dart b/lib/app/layouts/settings/pages/misc/troubleshoot_panel.dart index 437c901aff..633103f850 100644 --- a/lib/app/layouts/settings/pages/misc/troubleshoot_panel.dart +++ b/lib/app/layouts/settings/pages/misc/troubleshoot_panel.dart @@ -4,6 +4,9 @@ import 'package:bluebubbles/app/layouts/settings/widgets/content/next_button.dar import 'package:bluebubbles/helpers/backend/settings_helpers.dart'; import 'package:bluebubbles/main.dart'; import 'package:bluebubbles/services/backend/sync/chat_sync_manager.dart'; +import 'package:bluebubbles/services/rustpush/cloud_sync/cloud_sync_dev_gate.dart'; +import 'package:bluebubbles/services/rustpush/cloud_sync/cloud_sync_engine.dart'; +import 'package:bluebubbles/services/rustpush/cloud_sync/cloud_sync_safe_failure.dart'; import 'package:bluebubbles/services/rustpush/rustpush_service.dart'; import 'package:bluebubbles/utils/logger/logger.dart'; import 'package:bluebubbles/helpers/helpers.dart'; @@ -17,7 +20,6 @@ import 'package:flutter/cupertino.dart'; import 'package:flutter/foundation.dart'; import 'package:flutter/material.dart'; import 'package:get/get.dart'; -import 'package:path/path.dart'; import 'package:universal_io/io.dart'; import 'package:url_launcher/url_launcher.dart'; import 'package:bluebubbles/src/rust/api/api.dart' as api; @@ -36,6 +38,7 @@ class _TroubleshootPanelState extends OptimizedState { final RxInt logFileCount = 1.obs; final RxInt logFileSize = 0.obs; final RxBool optimizationsDisabled = false.obs; + final RxBool cloudSyncV2Running = false.obs; final TextEditingController participantController = TextEditingController(); bool isExportingLogs = false; @@ -302,6 +305,253 @@ class _TroubleshootPanelState extends OptimizedState { color: context.theme.colorScheme.outline))), ]), + if ((CloudSyncDevGate.manualShadowSamplerEnabled || + CloudSyncDevGate.manualSemanticPullEnabled || + CloudSyncDevGate.protocolEvidenceAvailable) && + ss.settings.developerEnabled.value && + (Platform.isAndroid || Platform.isWindows)) + SettingsHeader( + iosSubtitle: iosSubtitle, + materialSubtitle: materialSubtitle, + text: "Cloud Sync V2", + ), + if ((CloudSyncDevGate.manualShadowSamplerEnabled || + CloudSyncDevGate.manualSemanticPullEnabled || + CloudSyncDevGate.protocolEvidenceAvailable) && + ss.settings.developerEnabled.value && + (Platform.isAndroid || Platform.isWindows)) + SettingsSection( + backgroundColor: tileColor, + children: [ + if (CloudSyncDevGate.protocolEvidenceAvailable) + Obx(() => SettingsSwitch( + initialVal: ss.settings.cloudSyncV2EvidenceEnabled.value, + onChanged: (bool val) async { + ss.settings.cloudSyncV2EvidenceEnabled.value = val; + await ss.settings.saveOne('cloudSyncV2EvidenceEnabled'); + }, + title: "Record CloudKit protocol evidence", + subtitle: "Local-only, bounded structural diagnostics for the CloudKit canary. Never records message text, contacts, credentials, keys, raw records, or change tokens.", + isThreeLine: true, + backgroundColor: tileColor, + )), + if (CloudSyncDevGate.manualShadowSamplerEnabled) + Obx(() => SettingsTile( + leading: const SettingsLeadingIcon( + iosIcon: CupertinoIcons.cloud_download, + materialIcon: Icons.cloud_download_outlined, + containerColor: Colors.indigo, + ), + title: "Run Read-only Shadow Sample", + subtitle: "Developer-only diagnostic. Fetches one bounded page per Messages in iCloud zone without CloudKit writes, semantic applies, or background scheduling. A protected local journal, checkpoint, and redacted report are saved in private app storage.", + trailing: cloudSyncV2Running.value + ? SizedBox( + width: 20, + height: 20, + child: CircularProgressIndicator( + strokeWidth: 3, + color: context.theme.colorScheme.primary, + ), + ) + : const NextButton(), + onTap: () async { + if (cloudSyncV2Running.value) return; + if (!pushService.cloudSyncV2ManualShadowAvailable) { + showSnackbar( + "Cloud Sync V2 Blocked", + "Finish OpenBubbles setup, enable Developer Mode on Android, turn off legacy Messages in iCloud sync, and wait for active sync or logout work to finish.", + ); + return; + } + final confirmed = await showDialog( + context: context, + builder: (dialogContext) => AlertDialog( + backgroundColor: context.theme.colorScheme.properSurface, + title: Text( + "Run read-only Cloud Sync sample?", + style: context.theme.textTheme.titleLarge, + ), + content: Text( + "This performs one manual, bounded CloudKit read for diagnostics. It will not apply messages, upload or delete records, enable background sync, or replace live IDS delivery.", + style: context.theme.textTheme.bodyLarge, + ), + actions: [ + TextButton( + onPressed: () => Navigator.of(dialogContext).pop(false), + child: const Text("Cancel"), + ), + TextButton( + onPressed: () => Navigator.of(dialogContext).pop(true), + child: const Text("Run Once"), + ), + ], + ), + ); + if (confirmed != true) return; + if (cloudSyncV2Running.value) return; + cloudSyncV2Running.value = true; + try { + final report = await pushService.runCloudSyncV2ManualShadowConfirmed(); + final fetched = report.zones.fold( + 0, + (total, zone) => total + zone.fetched, + ); + final journaled = report.zones.fold( + 0, + (total, zone) => total + zone.journaled, + ); + if (report.isValidReadOnlySuccess) { + showSnackbar( + "Cloud Sync V2 Complete", + "Read-only checks passed. Fetched $fetched and journaled $journaled protected change(s). A redacted report was saved in private app storage.", + ); + } else { + showSnackbar( + "Cloud Sync V2 Stopped Safely", + "One or more zones did not pass the read-only checks. No CloudKit writes or semantic applies were enabled.", + ); + } + } catch (error) { + final safeCode = + cloudSyncV2SafeFailureCode(error); + Logger.warn( + "Cloud Sync V2 shadow sample stopped safely code=$safeCode", + ); + showSnackbar( + "Cloud Sync V2 Stopped Safely", + "Diagnostic code: $safeCode. No CloudKit writes or semantic applies were enabled.", + ); + } finally { + cloudSyncV2Running.value = false; + } + }, + )), + if (CloudSyncDevGate.manualSemanticPullEnabled) + Obx(() => SettingsTile( + leading: const SettingsLeadingIcon( + iosIcon: CupertinoIcons.cloud_download, + materialIcon: Icons.cloud_sync, + containerColor: Colors.teal, + ), + title: "Run Semantic Pull Canary", + subtitle: "Developer-only bounded read. Local canonical chats, messages, reactions, and attachment metadata may be added or updated. No CloudKit uploads or deletes, no local message deletes, and tombstones are quarantined.", + trailing: cloudSyncV2Running.value + ? SizedBox( + width: 20, + height: 20, + child: CircularProgressIndicator( + strokeWidth: 3, + color: context.theme.colorScheme.primary, + ), + ) + : const NextButton(), + onTap: () async { + if (cloudSyncV2Running.value) return; + if (!pushService.cloudSyncV2ManualSemanticPullAvailable) { + showSnackbar( + "Cloud Sync V2 Blocked", + "Finish OpenBubbles setup, enable Developer Mode, turn off legacy Messages in iCloud sync, and wait for active sync or logout work to finish.", + ); + return; + } + final confirmed = await showDialog( + context: context, + builder: (dialogContext) => AlertDialog( + backgroundColor: context.theme.colorScheme.properSurface, + title: Text( + "Run semantic pull canary?", + style: context.theme.textTheme.titleLarge, + ), + content: Text( + "This performs one manual, bounded CloudKit read. Local canonical chats, messages, reactions, and attachment metadata may be added or updated. It will not upload or delete CloudKit records, delete local messages, or apply tombstones. Tombstones are quarantined. No background run is enabled.", + style: context.theme.textTheme.bodyLarge, + ), + actions: [ + TextButton( + onPressed: () => Navigator.of(dialogContext).pop(false), + child: const Text("Cancel"), + ), + TextButton( + onPressed: () => Navigator.of(dialogContext).pop(true), + child: const Text("Run Once"), + ), + ], + ), + ); + if (confirmed != true) return; + if (cloudSyncV2Running.value) return; + cloudSyncV2Running.value = true; + try { + final report = await pushService.runCloudSyncV2ManualSemanticPullConfirmed(); + final fetched = report.zones.fold( + 0, + (total, zone) => total + zone.fetched, + ); + final applied = report.zones.fold( + 0, + (total, zone) => total + zone.applied, + ); + final deferred = report.zones.fold( + 0, + (total, zone) => total + zone.deferred, + ); + final quarantined = report.zones.fold( + 0, + (total, zone) => total + zone.quarantined, + ); + final retried = report.zones.fold( + 0, + (total, zone) => total + zone.retried, + ); + const expectedZones = { + "chats", + "messages", + "attachments", + }; + final reportedZones = report.zones + .map((zone) => zone.zoneLabel) + .toSet(); + final canaryPassed = + report.zones.length == expectedZones.length && + reportedZones.length == expectedZones.length && + reportedZones.containsAll(expectedZones) && + report.zones.every((zone) => + zone.status == + CloudSyncRunStatus.completed) && + deferred == 0 && + quarantined == 0 && + retried == 0 && + report.remoteWriteTripwiresIntact; + final totals = + "Fetched $fetched, applied $applied, deferred $deferred, quarantined $quarantined, retried $retried."; + if (canaryPassed) { + showSnackbar( + "Cloud Sync V2 Complete", + "$totals No CloudKit uploads or deletes occurred.", + ); + } else { + showSnackbar( + "Cloud Sync V2 Stopped Safely", + "$totals Incomplete records/zone or a write tripwire was detected. No further work was allowed.", + ); + } + } catch (error) { + final safeCode = cloudSyncV2SafeFailureCode(error); + Logger.warn( + "Cloud Sync V2 semantic pull stopped safely code=$safeCode", + ); + showSnackbar( + "Cloud Sync V2 Stopped Safely", + "Diagnostic code: $safeCode. No CloudKit uploads or deletes were enabled.", + ); + } finally { + cloudSyncV2Running.value = false; + } + }, + )), + ], + ), + SettingsHeader( iosSubtitle: iosSubtitle, @@ -332,7 +582,6 @@ class _TroubleshootPanelState extends OptimizedState { var total = b.toBytes(); // Copy the file to downloads - final Directory logDir = Directory(Logger.logDir); final date = DateTime.now().toIso8601String().split('T').first; final File logFile = File("${fs.appDocDir.path}/openbubbles-logs-$date.log"); @@ -556,6 +805,33 @@ class _TroubleshootPanelState extends OptimizedState { )) : Icon(Icons.check, color: context.theme.colorScheme.outline)) ) ]), + if (usingRustPush && Platform.isAndroid) + Obx(() => ss.settings.developerEnabled.value + ? SettingsHeader( + iosSubtitle: iosSubtitle, + materialSubtitle: materialSubtitle, + text: "FaceTime Diagnostics", + ) + : const SizedBox.shrink()), + if (usingRustPush && Platform.isAndroid) + Obx(() => ss.settings.developerEnabled.value + ? SettingsSection( + backgroundColor: tileColor, + children: [ + SettingsSwitch( + initialVal: ss.settings.faceTimeDiagnosticsEnabled.value, + onChanged: (bool val) async { + ss.settings.faceTimeDiagnosticsEnabled.value = val; + await ss.settings.saveOne('faceTimeDiagnosticsEnabled'); + }, + title: "Enable FaceTime diagnostics", + subtitle: "Logs FaceTime WebView, join, permission, and media state for debugging. Join recovery and End Call remain enabled when this is off.", + isThreeLine: true, + backgroundColor: tileColor, + ), + ], + ) + : const SizedBox.shrink()), if(!kIsDesktop) SettingsHeader( iosSubtitle: iosSubtitle, @@ -567,7 +843,7 @@ class _TroubleshootPanelState extends OptimizedState { backgroundColor: tileColor, children: [ Obx(() => SettingsSwitch( - onChanged: (bool val) { + onChanged: (bool val) async { if (val) { showDialog( context: context, @@ -604,7 +880,17 @@ class _TroubleshootPanelState extends OptimizedState { return; } ss.settings.developerEnabled.value = val; - ss.settings.save(); + if (!val) { + ss.settings.faceTimeDiagnosticsEnabled.value = false; + ss.settings.cloudSyncV2EvidenceEnabled.value = false; + await ss.settings.saveMany([ + 'developerEnabled', + 'faceTimeDiagnosticsEnabled', + 'cloudSyncV2EvidenceEnabled', + ]); + } else { + await ss.settings.saveOne('developerEnabled'); + } showSnackbar("Success", "Restart device or force quit OpenBubbles to unload extensions"); }, initialVal: ss.settings.developerEnabled.value, diff --git a/lib/app/layouts/settings/pages/profile/profile_panel.dart b/lib/app/layouts/settings/pages/profile/profile_panel.dart index 295f3e3331..ed4d1db5c9 100644 --- a/lib/app/layouts/settings/pages/profile/profile_panel.dart +++ b/lib/app/layouts/settings/pages/profile/profile_panel.dart @@ -81,7 +81,7 @@ class _ProfilePanelState extends OptimizedState with WidgetsBindin if (pushService.relayReachable.value == false) { final lastSuccessSuffix = successText == null ? "" : " Last successful check: $successText."; - return "Unavailable${checkedText == null ? "" : " as of $checkedText"}.$lastSuccessSuffix Turn on the relay and tap to retry."; + return "Relay service unavailable${checkedText == null ? "" : " as of $checkedText"}.$lastSuccessSuffix Open ValidationRelay on the iPhone, verify its Wi-Fi/tunnel, then tap to retry."; } return "Not checked yet. Tap to verify the iPhone is online before registration renewal."; } @@ -740,11 +740,12 @@ class _ProfilePanelState extends OptimizedState with WidgetsBindin final result = await pushService.checkRelayHealth(); if (result == true) { + getDetails(); showSnackbar("iPhone Relay", - "The relay is online and responding."); + "The relay service is responding. Registration recovery was started if needed."); } else if (result == false) { showSnackbar("iPhone Relay", - "The relay could not be reached. Check its power, Wi-Fi, and ValidationRelay status."); + "The relay service could not be reached, even if the iPhone is powered on. Open ValidationRelay and check its Wi-Fi and tunnel status."); } }, ); diff --git a/lib/database/database.dart b/lib/database/database.dart index 15ad7e7e2f..ffa3ed86b9 100644 --- a/lib/database/database.dart +++ b/lib/database/database.dart @@ -15,6 +15,21 @@ class Database { static late final Store store; static late final Box attachments; static late final Box chats; + static late final Box cloudSyncCheckpoints; + static late final Box cloudSyncInbox; + static late final Box cloudSyncLeases; + static late final Box + cloudProtectedPageLeases; + static late final Box cloudSyncOutbox; + static late final Box cloudSyncRecordMap; + static late final Box cloudSyncRuns; + static late final Box + cloudAttachmentMaterializations; + static late final Box cloudSemanticSnapshots; + static late final Box cloudSemanticReplay; + static late final Box cloudKitDeletionIntents; + static late final Box + cloudKitDeletionQuarantines; static late final Box contacts; static late final Box fcmData; static late final Box handles; @@ -41,6 +56,23 @@ class Database { try { Database.attachments = store.box(); Database.chats = store.box(); + Database.cloudSyncCheckpoints = store.box(); + Database.cloudSyncInbox = store.box(); + Database.cloudSyncLeases = store.box(); + Database.cloudProtectedPageLeases = + store.box(); + Database.cloudSyncOutbox = store.box(); + Database.cloudSyncRecordMap = store.box(); + Database.cloudSyncRuns = store.box(); + Database.cloudAttachmentMaterializations = + store.box(); + Database.cloudSemanticSnapshots = + store.box(); + Database.cloudSemanticReplay = store.box(); + Database.cloudKitDeletionIntents = + store.box(); + Database.cloudKitDeletionQuarantines = + store.box(); Database.contacts = store.box(); Database.fcmData = store.box(); Database.handles = store.box(); @@ -235,4 +267,4 @@ class Database { Database.messages.removeAll(); Database.themes.removeAll(); } -} \ No newline at end of file +} diff --git a/lib/database/global/chat_media_page.dart b/lib/database/global/chat_media_page.dart new file mode 100644 index 0000000000..f4ceed08a9 --- /dev/null +++ b/lib/database/global/chat_media_page.dart @@ -0,0 +1,52 @@ +import 'package:bluebubbles/database/io/attachment.dart' + if (dart.library.html) 'package:bluebubbles/database/html/attachment.dart'; + +enum ChatMediaDirection { + older, + newer, +} + +class ChatMediaCursor { + const ChatMediaCursor({ + required this.dateMilliseconds, + required this.messageId, + }); + + final int dateMilliseconds; + final int messageId; + + List toParameters() => [dateMilliseconds, messageId]; +} + +class ChatMediaPage { + const ChatMediaPage({ + required this.items, + required this.nextCursor, + required this.hasMore, + }); + + final List items; + final ChatMediaCursor? nextCursor; + final bool hasMore; + + static const empty = ChatMediaPage( + items: [], + nextCursor: null, + hasMore: false, + ); +} + +class ChatAttachmentOverview { + const ChatAttachmentOverview({ + required this.documents, + required this.locations, + }); + + final List documents; + final List locations; + + static const empty = ChatAttachmentOverview( + documents: [], + locations: [], + ); +} diff --git a/lib/database/global/chat_messages.dart b/lib/database/global/chat_messages.dart index 399dad255b..efaa9aad59 100644 --- a/lib/database/global/chat_messages.dart +++ b/lib/database/global/chat_messages.dart @@ -84,7 +84,11 @@ class ChatMessages { } void _attachReaction(Message parent, Message reaction) { - if (!parent.associatedMessages.any((item) => item.guid == reaction.guid)) { + final existingIndex = parent.associatedMessages + .indexWhere((item) => item.guid == reaction.guid); + if (existingIndex >= 0) { + parent.associatedMessages[existingIndex] = reaction; + } else { parent.associatedMessages.add(reaction); } parent.hasReactions = true; diff --git a/lib/database/global/settings.dart b/lib/database/global/settings.dart index f9d30fd536..f360c38520 100644 --- a/lib/database/global/settings.dart +++ b/lib/database/global/settings.dart @@ -211,6 +211,8 @@ class Settings { final RxBool developerEnabled = false.obs; final RxList developerMode = [].obs; + final RxBool faceTimeDiagnosticsEnabled = false.obs; + final RxBool cloudSyncV2EvidenceEnabled = false.obs; final RxBool cloudSyncingEnabled = false.obs; final RxBool attachmentSyncEnabled = false.obs; @@ -432,6 +434,8 @@ class Settings { 'keychainDefaultPassword': keychainDefaultPassword.value, 'isSmsRouter': isSmsRouter.value, 'developerEnabled': developerEnabled.value, + 'faceTimeDiagnosticsEnabled': faceTimeDiagnosticsEnabled.value, + 'cloudSyncV2EvidenceEnabled': cloudSyncV2EvidenceEnabled.value, 'vpnWarned': vpnWarned.value, 'smsForwardingTargets': smsRoutingTargets, 'developerMode': developerMode, @@ -612,6 +616,10 @@ class Settings { ss.settings.keychainDefaultPassword.value = map['keychainDefaultPassword']; ss.settings.isSmsRouter.value = map['isSmsRouter'] ?? false; ss.settings.developerEnabled.value = map['developerEnabled'] ?? false; + ss.settings.faceTimeDiagnosticsEnabled.value = map['faceTimeDiagnosticsEnabled'] ?? false; + ss.settings.cloudSyncV2EvidenceEnabled.value = + ss.settings.developerEnabled.value && + (map['cloudSyncV2EvidenceEnabled'] ?? false); ss.settings.vpnWarned.value = map['vpnWarned'] ?? false; ss.settings.cachedCodes.value = map['cachedCodes'] ?? {}; ss.settings.smsForwardingTargets.value = map['smsIncomingTargets'] ?? {}; @@ -789,6 +797,10 @@ class Settings { s.keychainDefaultPassword.value = map['keychainDefaultPassword']; s.isSmsRouter.value = map['isSmsRouter'] ?? false; s.developerEnabled.value = map['developerEnabled'] ?? false; + s.faceTimeDiagnosticsEnabled.value = map['faceTimeDiagnosticsEnabled'] ?? false; + s.cloudSyncV2EvidenceEnabled.value = + s.developerEnabled.value && + (map['cloudSyncV2EvidenceEnabled'] ?? false); s.vpnWarned.value = map['vpnWarned'] ?? false; s.cachedCodes.value = map['cachedCodes'] is String ? jsonDecode(map['cachedCodes']).cast() : {}; s.smsForwardingTargets.value = map['smsIncomingTargets'] is String ? jsonDecode(map['smsIncomingTargets']).cast() : {}; diff --git a/lib/database/html/chat.dart b/lib/database/html/chat.dart index e736a04f45..71f3377e54 100644 --- a/lib/database/html/chat.dart +++ b/lib/database/html/chat.dart @@ -5,6 +5,7 @@ import 'package:bluebubbles/helpers/helpers.dart'; import 'package:bluebubbles/database/html/attachment.dart'; import 'package:bluebubbles/database/html/handle.dart'; import 'package:bluebubbles/database/html/message.dart'; +import 'package:bluebubbles/database/global/chat_media_page.dart'; import 'package:bluebubbles/services/services.dart'; import 'package:collection/collection.dart'; import 'package:flutter/foundation.dart'; @@ -66,6 +67,7 @@ class Chat { title ??= getTitle(); return title!; } + String? displayName; List _participants = []; List get participants { @@ -74,6 +76,7 @@ class Chat { } return _participants; } + bool? autoSendReadReceipts = true; bool? autoSendTypingIndicators = true; String? textFieldText; @@ -81,12 +84,14 @@ class Chat { Message? _latestMessage; Message get latestMessage { if (_latestMessage != null) return _latestMessage!; - _latestMessage = Chat.getMessages(this, limit: 1, getDetails: true).firstOrNull ?? Message( - dateCreated: DateTime.fromMillisecondsSinceEpoch(0), - guid: guid, - ); + _latestMessage = Chat.getMessages(this, limit: 1, getDetails: true).firstOrNull ?? + Message( + dateCreated: DateTime.fromMillisecondsSinceEpoch(0), + guid: guid, + ); return _latestMessage!; } + set latestMessage(Message m) => _latestMessage = m; DateTime? dbOnlyLatestMessageDate; DateTime? dateDeleted; @@ -207,7 +212,9 @@ class Chat { /// Get a chat's title String getChatCreatorSubtitle() { // generate names for group chats or DMs - List titles = participants.map((e) => e.displayName.trim().split(isGroup && e.contact != null ? " " : String.fromCharCode(65532)).first).toList(); + List titles = participants + .map((e) => e.displayName.trim().split(isGroup && e.contact != null ? " " : String.fromCharCode(65532)).first) + .toList(); if (titles.isEmpty) { if (chatIdentifier!.startsWith("urn:biz")) { return "Business Chat"; @@ -230,9 +237,7 @@ class Chat { } bool shouldMuteNotification(Message? message) { - if (ss.settings.filterUnknownSenders.value && - participants.length == 1 && - participants[0].contact == null) { + if (ss.settings.filterUnknownSenders.value && participants.length == 1 && participants[0].contact == null) { return true; } else if (ss.settings.globalTextDetection.value.isNotEmpty) { List text = ss.settings.globalTextDetection.value.split(","); @@ -266,8 +271,7 @@ class Chat { } return true; } - return !ss.settings.notifyReactions.value && - ReactionTypes.toList().contains(message?.associatedMessageType ?? ""); + return !ss.settings.notifyReactions.value && ReactionTypes.toList().contains(message?.associatedMessageType ?? ""); } static void unDelete(Chat chat) { @@ -278,7 +282,8 @@ class Chat { return; } - Chat toggleHasUnread(bool hasUnread, {bool force = false, bool clearLocalNotifications = true, bool privateMark = true}) { + Chat toggleHasUnread(bool hasUnread, + {bool force = false, bool clearLocalNotifications = true, bool privateMark = true}) { if (hasUnreadMessage == hasUnread && !force) return this; if (!cm.isChatActive(guid) || !hasUnread || force) { hasUnreadMessage = hasUnread; @@ -287,7 +292,8 @@ class Chat { try { if (!hasUnread && autoSendReadReceipts!) { - backend.markRead(this, privateMark && ss.settings.enablePrivateAPI.value && ss.settings.privateMarkChatAsRead.value); + backend.markRead( + this, privateMark && ss.settings.enablePrivateAPI.value && ss.settings.privateMarkChatAsRead.value); } else if (hasUnread) { backend.markUnread(this); } @@ -296,7 +302,8 @@ class Chat { return this; } - Future addMessage(Message message, {bool changeUnreadStatus = true, bool checkForMessageText = true, bool clearNotificationsIfFromMe = true}) async { + Future addMessage(Message message, + {bool changeUnreadStatus = true, bool checkForMessageText = true, bool clearNotificationsIfFromMe = true}) async { // Save the message Message? latest = latestMessage; Message? newMessage; @@ -306,7 +313,8 @@ class Chat { } catch (ex, stacktrace) { newMessage = Message.findOne(guid: message.guid); if (newMessage == null) { - Logger.error("Failed to add message (GUID: ${message.guid}) to chat (GUID: $guid)", error: ex, trace: stacktrace); + Logger.error("Failed to add message (GUID: ${message.guid}) to chat (GUID: $guid)", + error: ex, trace: stacktrace); } } bool isNewer = false; @@ -314,8 +322,8 @@ class Chat { // If the message was saved correctly, update this chat's latestMessage info, // but only if the incoming message's date is newer if ((newMessage?.id != null || kIsWeb) && checkForMessageText) { - isNewer = message.dateCreated!.isAfter(latest.dateCreated!) - || (message.guid != latest.guid && message.dateCreated == latest.dateCreated); + isNewer = message.dateCreated!.isAfter(latest.dateCreated!) || + (message.guid != latest.guid && message.dateCreated == latest.dateCreated); if (isNewer) { _latestMessage = message; dateDeleted = null; @@ -376,6 +384,23 @@ class Chat { return []; } + Future getMediaPageAsync({ + required ChatMediaDirection direction, + ChatMediaCursor? cursor, + int limit = 24, + int scanLimit = 500, + }) async { + return ChatMediaPage.empty; + } + + Future getAttachmentOverviewAsync({ + int documentLimit = 24, + int locationLimit = 10, + int scanLimit = 1000, + }) async { + return ChatAttachmentOverview.empty; + } + static List getMessages(Chat chat, {int offset = 0, int limit = 25, bool includeDeleted = false, bool getDetails = false}) { return []; @@ -392,7 +417,8 @@ class Chat { void webSyncParticipants() { // ignore: argument_type_not_assignable, return_of_invalid_type, invalid_assignment, for_in_of_invalid_element_type - _participants = chats.webCachedHandles.where((e) => _participants.map((e2) => e2.address).contains(e.address)).toList(); + _participants = + chats.webCachedHandles.where((e) => _participants.map((e2) => e2.address).contains(e.address)).toList(); } Chat addParticipant(Handle participant) { @@ -460,7 +486,7 @@ class Chat { this.autoSendTypingIndicators = autoSendTypingIndicators; save(updateAutoSendTypingIndicators: true); if (!(autoSendTypingIndicators ?? ss.settings.privateSendTypingIndicators.value)) { - backend.stoppedTyping(this); + backend.stoppedTyping(this); } return this; } @@ -557,24 +583,24 @@ class Chat { static Future getIcon(Chat c, {bool force = false}) async {} Map toMap() => { - "ROWID": id, - "guid": guid, - "chatIdentifier": chatIdentifier, - "isArchived": isArchived!, - "muteType": muteType, - "muteArgs": muteArgs, - "isPinned": isPinned!, - "displayName": displayName, - "participants": participants.map((item) => item.toMap()).toList(), - "hasUnreadMessage": hasUnreadMessage!, - "_customAvatarPath": _customAvatarPath.value, - "_pinIndex": _pinIndex.value, - "autoSendReadReceipts": autoSendReadReceipts!, - "autoSendTypingIndicators": autoSendTypingIndicators!, - "dateDeleted": dateDeleted?.millisecondsSinceEpoch, - "style": style, - "lockChatName": lockChatName, - "lockChatIcon": lockChatIcon, - "lastReadMessageGuid": lastReadMessageGuid, - }; + "ROWID": id, + "guid": guid, + "chatIdentifier": chatIdentifier, + "isArchived": isArchived!, + "muteType": muteType, + "muteArgs": muteArgs, + "isPinned": isPinned!, + "displayName": displayName, + "participants": participants.map((item) => item.toMap()).toList(), + "hasUnreadMessage": hasUnreadMessage!, + "_customAvatarPath": _customAvatarPath.value, + "_pinIndex": _pinIndex.value, + "autoSendReadReceipts": autoSendReadReceipts!, + "autoSendTypingIndicators": autoSendTypingIndicators!, + "dateDeleted": dateDeleted?.millisecondsSinceEpoch, + "style": style, + "lockChatName": lockChatName, + "lockChatIcon": lockChatIcon, + "lastReadMessageGuid": lastReadMessageGuid, + }; } diff --git a/lib/database/html/cloud_sync_records.dart b/lib/database/html/cloud_sync_records.dart new file mode 100644 index 0000000000..dd3682739a --- /dev/null +++ b/lib/database/html/cloud_sync_records.dart @@ -0,0 +1,31 @@ +/// Web placeholders for the native ObjectBox Cloud Sync V2 entities. +/// +/// Cloud Sync V2 is unavailable on web. Keeping these types allows the shared +/// database exports to compile without creating a web persistence path. +const int cloudSyncSchemaVersion = 2; + +class CloudSyncCheckpointEntity {} + +class CloudInboxChangeEntity {} + +class CloudSyncLeaseEntity {} + +class CloudProtectedPageLeaseEntity {} + +class CloudOutboxOperationEntity {} + +class CloudRecordMapEntity {} + +class CloudSyncRunEntity {} + +class CloudAttachmentMaterializationEntity {} + +class CloudSemanticSnapshotEntity {} + +class CloudSemanticReplayEntity {} + +class CloudKitWriterAuthorityEntity {} + +class CloudKitDeletionIntentEntity {} + +class CloudKitDeletionQuarantineEntity {} diff --git a/lib/database/io/attachment.dart b/lib/database/io/attachment.dart index 057ca17166..c874d786e7 100644 --- a/lib/database/io/attachment.dart +++ b/lib/database/io/attachment.dart @@ -1,11 +1,16 @@ import 'dart:convert'; +import 'dart:async'; + import 'package:bluebubbles/helpers/helpers.dart'; import 'package:bluebubbles/database/database.dart'; import 'package:bluebubbles/database/models.dart'; import 'package:bluebubbles/services/network/backend_service.dart'; +import 'package:bluebubbles/services/rustpush/cloud_sync/legacy_cloudkit_deletion_intents.dart'; import 'package:bluebubbles/services/rustpush/rustpush_service.dart'; +import 'package:bluebubbles/utils/attachment_guid_utils.dart'; import 'package:bluebubbles/services/services.dart'; +import 'package:bluebubbles/utils/logger/logger.dart'; import 'package:collection/collection.dart'; import 'package:flutter/foundation.dart'; import 'package:mime_type/mime_type.dart'; @@ -54,7 +59,7 @@ class Attachment { set dbMetadata(String? json) => metadata = json == null ? null : jsonDecode(json) as Map; - void applyFromCloud(api.CloudAttachment c, String ckRecordId) { + bool applyFromCloud(api.CloudAttachment c, String ckRecordId) { this.ckRecordId = ckRecordId; var decoded = api.decodeAttachmentmeta(wrapped: c.cm); uti = decoded.uti; @@ -64,23 +69,21 @@ class Attachment { totalBytes = decoded.totalBytes; metadata ??= {}; metadata!["cloud"] = ckRecordId; - if (decoded.guid.startsWith("at")) { - var items = decoded.guid.split("_"); - // format defined in indexedPartsToAttributedBodyDyn - var message = Message.findOne(guid: items[2]); - guid = "${items[2]}_${items[1]}"; - save(message); + // format defined in indexedPartsToAttributedBodyDyn + var owned = parseAppleOwnedAttachmentGuid(decoded.guid); + if (owned != null) { + var message = Message.findOne(guid: owned.messageGuid); + guid = "${owned.messageGuid}_${owned.part}"; + save(message, throwOnUniqueViolation: true); } else { guid = decoded.guid; - save(null); + save(null, throwOnUniqueViolation: true); } + return true; } - String unconvertAttachmentGuid(String guid) { - var items = guid.split("_"); - if (items.length == 1) return guid; - return "at_${items[1]}_${items[0]}"; - } + String unconvertAttachmentGuid(String guid) => + unconvertAppleAttachmentGuid(guid); Future getAttachmentMeta() async { var sum = md5.convert(File(path).readAsBytesSync()); @@ -179,7 +182,10 @@ class Attachment { /// Save a new attachment or update an existing attachment on disk /// [message] is used to create a link between the attachment and message, /// when provided - Attachment save(Message? message) { + Attachment save( + Message? message, { + bool throwOnUniqueViolation = false, + }) { if (kIsWeb) return this; Database.runInTransaction(TxMode.write, () { /// Find an existing attachment and update the attachment ID if applicable @@ -195,7 +201,14 @@ class Attachment { } id = Database.attachments.put(this); - } on UniqueViolationException catch (_) {} + } on UniqueViolationException catch (ex, stack) { + Logger.error( + 'Failed to save attachment due to a unique constraint violation', + error: ex, + trace: stack, + ); + if (throwOnUniqueViolation) rethrow; + } }); return this; } @@ -292,19 +305,26 @@ class Attachment { /// Delete an attachment and remove all instances of that attachment in the DB static void delete(String guid) { if (kIsWeb) return; + String? cloudRecordId; Database.runInTransaction(TxMode.write, () { final query = Database.attachments.query(Attachment_.guid.equals(guid)).build(); final result = query.findFirst(); query.close(); if (result?.id != null) { if (result?.ckRecordId != null && !pushService.syncStopDelete) { - var list = ss.prefs.getStringList("attachmentDeletionIds-1") ?? []; - list.add(result!.ckRecordId!); - ss.prefs.setStringList("attachmentDeletionIds-1", list); + cloudRecordId = result!.ckRecordId; } Database.attachments.remove(result!.id!); } }); + if (cloudRecordId != null) { + unawaited( + pushService.queueLegacyCloudKitDeletion( + kind: LegacyCloudKitDeletionKind.attachment, + recordId: cloudRecordId!, + ), + ); + } } String getFriendlySize({decimals = 2}) { diff --git a/lib/database/io/chat.dart b/lib/database/io/chat.dart index 82ee7ed437..6608d76853 100644 --- a/lib/database/io/chat.dart +++ b/lib/database/io/chat.dart @@ -3,11 +3,13 @@ import 'dart:convert'; import 'dart:math'; import 'package:async_task/async_task.dart'; +import 'package:bluebubbles/utils/attachment_guid_utils.dart'; import 'package:bluebubbles/utils/logger/logger.dart'; import 'package:bluebubbles/helpers/helpers.dart'; import 'package:bluebubbles/database/database.dart'; import 'package:bluebubbles/src/rust/api/api.dart' as api; import 'package:bluebubbles/services/network/backend_service.dart'; +import 'package:bluebubbles/services/rustpush/cloud_sync/legacy_cloudkit_deletion_intents.dart'; import 'package:bluebubbles/services/rustpush/rustpush_service.dart'; import 'package:bluebubbles/database/models.dart'; import 'package:bluebubbles/services/services.dart'; @@ -33,7 +35,8 @@ class GetChatAttachments extends AsyncTask, List> { GetChatAttachments(this.stuff); @override - AsyncTask, List> instantiate(List parameters, + AsyncTask, List> instantiate( + List parameters, [Map? sharedData]) { return GetChatAttachments(parameters); } @@ -52,8 +55,12 @@ class GetChatAttachments extends AsyncTask, List> { /// Query the [Database.messageBox] for all the message IDs and order by date /// descending final query = (Database.messages.query(includeDeleted - ? Message_.dateCreated.notNull().and(Message_.dateDeleted.isNull().or(Message_.dateDeleted.notNull())) - : Message_.dateDeleted.isNull().and(Message_.dateCreated.notNull())) + ? Message_.dateCreated.notNull().and(Message_.dateDeleted + .isNull() + .or(Message_.dateDeleted.notNull())) + : Message_.dateDeleted + .isNull() + .and(Message_.dateCreated.notNull())) ..link(Message_.chat, Chat_.id.equals(chatId)) ..order(Message_.dateCreated, flags: Order.descending)) .build(); @@ -64,7 +71,8 @@ class GetChatAttachments extends AsyncTask, List> { /// Match the attachments to their messages for (Message m in messages) { - m.attachments = List.from(m.dbAttachments.where((element) => element.mimeType != null)); + m.attachments = List.from( + m.dbAttachments.where((element) => element.mimeType != null)); actualAttachments.addAll((m.attachments).map((e) => e!)); } @@ -78,6 +86,172 @@ class GetChatAttachments extends AsyncTask, List> { } } +/// Fetches one bounded page of media attachments without materializing the +/// chat's complete message or attachment history. +class GetChatMediaPage extends AsyncTask, ChatMediaPage> { + final List stuff; + + GetChatMediaPage(this.stuff); + + @override + AsyncTask, ChatMediaPage> instantiate(List parameters, + [Map? sharedData]) { + return GetChatMediaPage(parameters); + } + + @override + List parameters() => stuff; + + @override + FutureOr run() { + final chatId = stuff[0] as int; + final direction = ChatMediaDirection.values[stuff[1] as int]; + final cursorDate = stuff[2] as int?; + final cursorMessageId = stuff[3] as int?; + final itemLimit = stuff[4] as int; + final scanLimit = stuff[5] as int; + + return Database.runInTransaction(TxMode.read, () { + var condition = + Message_.dateDeleted.isNull().and(Message_.dateCreated.notNull()); + if (cursorDate != null && cursorMessageId != null) { + final cursorCondition = direction == ChatMediaDirection.older + ? Message_.dateCreated.lessThan(cursorDate).or( + Message_.dateCreated.equals(cursorDate).and( + Message_.id.lessThan(cursorMessageId), + ), + ) + : Message_.dateCreated.greaterThan(cursorDate).or( + Message_.dateCreated.equals(cursorDate).and( + Message_.id.greaterThan(cursorMessageId), + ), + ); + condition = condition.and(cursorCondition); + } + + final descending = direction == ChatMediaDirection.older; + final builder = Database.messages.query(condition) + ..link(Message_.chat, Chat_.id.equals(chatId)) + ..order( + Message_.dateCreated, + flags: descending ? Order.descending : 0, + ) + ..order( + Message_.id, + flags: descending ? Order.descending : 0, + ); + final query = builder.build()..limit = scanLimit + 1; + final messages = query.find(); + query.close(); + + final groups = >[]; + var itemCount = 0; + var processed = 0; + Message? lastScanned; + for (final message in messages.take(scanLimit)) { + processed++; + lastScanned = message; + if (message.isGroupEvent || message.isInteractive) continue; + + final media = message.dbAttachments + .where((attachment) => + attachment.mimeStart == 'image' || + attachment.mimeStart == 'video') + .toList(); + if (media.isEmpty) continue; + + message.attachments = List.from(message.dbAttachments); + groups.add(media); + itemCount += media.length; + // Finish the current message so another page never skips sibling + // attachments that share the same message cursor. + if (itemCount >= itemLimit) break; + } + + final orderedGroups = + descending ? groups : groups.reversed.toList(growable: false); + final items = orderedGroups.expand((group) => group).toList(); + final cursor = lastScanned?.dateCreated == null || lastScanned?.id == null + ? null + : ChatMediaCursor( + dateMilliseconds: + lastScanned!.dateCreated!.millisecondsSinceEpoch, + messageId: lastScanned.id!, + ); + + return ChatMediaPage( + items: items, + nextCursor: cursor, + hasMore: processed < messages.length, + ); + }); + } +} + +/// Fetches the bounded non-media cards shown on conversation details. +class GetChatAttachmentOverview + extends AsyncTask, ChatAttachmentOverview> { + final List stuff; + + GetChatAttachmentOverview(this.stuff); + + @override + AsyncTask, ChatAttachmentOverview> instantiate( + List parameters, + [Map? sharedData]) { + return GetChatAttachmentOverview(parameters); + } + + @override + List parameters() => stuff; + + @override + FutureOr run() { + final chatId = stuff[0] as int; + final documentLimit = stuff[1] as int; + final locationLimit = stuff[2] as int; + final scanLimit = stuff[3] as int; + + return Database.runInTransaction(TxMode.read, () { + final query = (Database.messages.query( + Message_.dateDeleted.isNull().and(Message_.dateCreated.notNull()), + ) + ..link(Message_.chat, Chat_.id.equals(chatId)) + ..order(Message_.dateCreated, flags: Order.descending) + ..order(Message_.id, flags: Order.descending)) + .build() + ..limit = scanLimit; + final messages = query.find(); + query.close(); + + final documents = []; + final locations = []; + for (final message in messages) { + if (message.isGroupEvent || message.isInteractive) continue; + message.attachments = List.from(message.dbAttachments); + for (final attachment in message.attachments.whereType()) { + final mimeType = attachment.mimeType ?? ''; + if (mimeType.contains('location')) { + if (locations.length < locationLimit) locations.add(attachment); + } else if (attachment.mimeStart != 'image' && + attachment.mimeStart != 'video' && + documents.length < documentLimit) { + documents.add(attachment); + } + } + if (documents.length >= documentLimit && + locations.length >= locationLimit) { + break; + } + } + return ChatAttachmentOverview( + documents: documents, + locations: locations, + ); + }); + } +} + /// Async method to get messages from objectbox class GetMessages extends AsyncTask, List> { final List stuff; @@ -85,7 +259,8 @@ class GetMessages extends AsyncTask, List> { GetMessages(this.stuff); @override - AsyncTask, List> instantiate(List parameters, [Map? sharedData]) { + AsyncTask, List> instantiate(List parameters, + [Map? sharedData]) { return GetMessages(parameters); } @@ -107,10 +282,14 @@ class GetMessages extends AsyncTask, List> { final messages = []; if (searchAround == null) { final query = (Database.messages.query(includeDeleted - ? Message_.dateCreated.notNull().and(Message_.dateDeleted.isNull().or(Message_.dateDeleted.notNull())) - : Message_.dateDeleted.isNull().and(Message_.dateCreated.notNull())) - ..link(Message_.chat, Chat_.id.equals(chatId)) - ..order(Message_.dateCreated, flags: Order.descending)) + ? Message_.dateCreated.notNull().and(Message_.dateDeleted + .isNull() + .or(Message_.dateDeleted.notNull())) + : Message_.dateDeleted + .isNull() + .and(Message_.dateCreated.notNull())) + ..link(Message_.chat, Chat_.id.equals(chatId)) + ..order(Message_.dateCreated, flags: Order.descending)) .build(); query ..limit = limit @@ -118,33 +297,52 @@ class GetMessages extends AsyncTask, List> { messages.addAll(query.find()); query.close(); } else { - final beforeQuery = (Database.messages.query(Message_.dateCreated.lessThan(searchAround).and(includeDeleted - ? Message_.dateCreated.notNull().and(Message_.dateDeleted.isNull().or(Message_.dateDeleted.notNull())) - : Message_.dateDeleted.isNull().and(Message_.dateCreated.notNull()))) - ..link(Message_.chat, Chat_.id.equals(chatId)) - ..order(Message_.dateCreated, flags: Order.descending)) + final beforeQuery = (Database.messages.query(Message_.dateCreated + .lessThan(searchAround) + .and(includeDeleted + ? Message_.dateCreated.notNull().and(Message_.dateDeleted + .isNull() + .or(Message_.dateDeleted.notNull())) + : Message_.dateDeleted + .isNull() + .and(Message_.dateCreated.notNull()))) + ..link(Message_.chat, Chat_.id.equals(chatId)) + ..order(Message_.dateCreated, flags: Order.descending)) .build(); beforeQuery.limit = limit; final before = beforeQuery.find(); beforeQuery.close(); - final afterQuery = (Database.messages.query(Message_.dateCreated.greaterThan(searchAround).and(includeDeleted - ? Message_.dateCreated.notNull().and(Message_.dateDeleted.isNull().or(Message_.dateDeleted.notNull())) - : Message_.dateDeleted.isNull().and(Message_.dateCreated.notNull()))) - ..link(Message_.chat, Chat_.id.equals(chatId)) - ..order(Message_.dateCreated)) + final afterQuery = (Database.messages.query(Message_.dateCreated + .greaterThan(searchAround) + .and(includeDeleted + ? Message_.dateCreated.notNull().and(Message_.dateDeleted + .isNull() + .or(Message_.dateDeleted.notNull())) + : Message_.dateDeleted + .isNull() + .and(Message_.dateCreated.notNull()))) + ..link(Message_.chat, Chat_.id.equals(chatId)) + ..order(Message_.dateCreated)) .build(); afterQuery.limit = limit; final after = afterQuery.find(); afterQuery.close(); - messages..addAll(before)..addAll(after); + messages + ..addAll(before) + ..addAll(after); } /// Fetch and match handles final chat = Database.chats.get(chatId); for (int i = 0; i < messages.length; i++) { Message message = messages[i]; - if (chat!.participants.isNotEmpty && !message.isFromMe! && message.handleId != null && message.handleId != 0) { - Handle? handle = chat.participants.firstWhereOrNull((e) => e.originalROWID == message.handleId) ?? message.getHandle(); + if (chat!.participants.isNotEmpty && + !message.isFromMe! && + message.handleId != null && + message.handleId != 0) { + Handle? handle = chat.participants.firstWhereOrNull( + (e) => e.originalROWID == message.handleId) ?? + message.getHandle(); if (handle == null && message.originalROWID != null) { messages.remove(message); i--; @@ -154,18 +352,23 @@ class GetMessages extends AsyncTask, List> { } } final messageGuids = messages.map((e) => e.guid!).toList(); - final associatedMessagesQuery = - (Database.messages.query(Message_.associatedMessageGuid.oneOf(messageGuids))..order(Message_.originalROWID)).build(); + final associatedMessagesQuery = (Database.messages + .query(Message_.associatedMessageGuid.oneOf(messageGuids)) + ..order(Message_.originalROWID)) + .build(); List associatedMessages = associatedMessagesQuery.find(); associatedMessagesQuery.close(); - associatedMessages = MessageHelper.normalizedAssociatedMessages(associatedMessages); + associatedMessages = + MessageHelper.normalizedAssociatedMessages(associatedMessages); for (Message m in associatedMessages) { if (m.associatedMessageType != "sticker") continue; m.attachments = List.from(m.dbAttachments); } for (Message m in messages) { m.attachments = List.from(m.dbAttachments); - m.associatedMessages = associatedMessages.where((e) => e.associatedMessageGuid == m.guid).toList(); + m.associatedMessages = associatedMessages + .where((e) => e.associatedMessageGuid == m.guid) + .toList(); } return messages; }); @@ -173,21 +376,17 @@ class GetMessages extends AsyncTask, List> { } Future getZenKey(String key) async { - return await mcs.invokeMethod("zen-mode-uuid", { "key": key }); + return await mcs.invokeMethod("zen-mode-uuid", {"key": key}); } Future configForMask(int mask) async { bool isStarredContact = ((mask >> 0) & 1) == 1; bool isPriority = ((mask >> 1) & 1) == 1; - return api.StatusKitPersonalConfig(allowedModes: [ - if (isStarredContact) - await getZenKey("starred"), - if (isPriority) - await getZenKey("priority"), - if (isStarredContact || isPriority) - await getZenKey("starred_priority"), + if (isStarredContact) await getZenKey("starred"), + if (isPriority) await getZenKey("priority"), + if (isStarredContact || isPriority) await getZenKey("starred_priority"), ]); } @@ -198,7 +397,8 @@ class AddMessages extends AsyncTask, List> { AddMessages(this.stuff); @override - AsyncTask, List> instantiate(List parameters, [Map? sharedData]) { + AsyncTask, List> instantiate(List parameters, + [Map? sharedData]) { return AddMessages(parameters); } @@ -210,13 +410,14 @@ class AddMessages extends AsyncTask, List> { @override FutureOr> run() { /// Pull args from input and create new instances of store and boxes - List messages = stuff[0].map((e) => Message.fromMap(e)).toList().cast(); + List messages = + stuff[0].map((e) => Message.fromMap(e)).toList().cast(); /// Save the new messages and their attachments in a write transaction final newMessages = Database.runInTransaction(TxMode.write, () { List newMessages = Message.bulkSave(messages); - Attachment.bulkSave( - Map.fromIterables(newMessages, newMessages.map((e) => (e.attachments).map((e) => e!).toList()))); + Attachment.bulkSave(Map.fromIterables(newMessages, + newMessages.map((e) => (e.attachments).map((e) => e!).toList()))); return newMessages; }); @@ -226,11 +427,14 @@ class AddMessages extends AsyncTask, List> { /// Query the [Database.messageBox] for associated messages (reactions) matching the /// message IDs - final associatedMessagesQuery = - (Database.messages.query(Message_.associatedMessageGuid.oneOf(messageGuids))..order(Message_.originalROWID)).build(); + final associatedMessagesQuery = (Database.messages + .query(Message_.associatedMessageGuid.oneOf(messageGuids)) + ..order(Message_.originalROWID)) + .build(); List associatedMessages = associatedMessagesQuery.find(); associatedMessagesQuery.close(); - associatedMessages = MessageHelper.normalizedAssociatedMessages(associatedMessages); + associatedMessages = + MessageHelper.normalizedAssociatedMessages(associatedMessages); /// Assign the relevant attachments and associated messages to the original /// messages @@ -240,7 +444,9 @@ class AddMessages extends AsyncTask, List> { } for (Message m in newMessages) { m.attachments = List.from(m.dbAttachments); - m.associatedMessages = associatedMessages.where((e) => e.associatedMessageGuid == m.guid).toList(); + m.associatedMessages = associatedMessages + .where((e) => e.associatedMessageGuid == m.guid) + .toList(); } return newMessages; }); @@ -254,7 +460,8 @@ class GetChats extends AsyncTask, List> { GetChats(this.stuff); @override - AsyncTask, List> instantiate(List parameters, [Map? sharedData]) { + AsyncTask, List> instantiate(List parameters, + [Map? sharedData]) { return GetChats(parameters); } @@ -271,9 +478,13 @@ class GetChats extends AsyncTask, List> { // If the 3rd param is available, it's for an ID query. // Otherwise, query without any criteria if (stuff.length >= 3 && stuff[2] != null && stuff[2] is List) { - queryBuilder = Database.chats.query(Chat_.id.oneOf(stuff[2] as List)); + queryBuilder = + Database.chats.query(Chat_.id.oneOf(stuff[2] as List)); } else { - queryBuilder = Database.chats.query(Chat_.dateDeleted.isNull().and(Chat_.isRoutingStub.equals(false).or(Chat_.isRoutingStub.isNull()))); + queryBuilder = Database.chats.query(Chat_.dateDeleted.isNull().and(Chat_ + .isRoutingStub + .equals(false) + .or(Chat_.isRoutingStub.isNull()))); } // Build the query, applying some sorting so we get data in the correct order. @@ -301,7 +512,6 @@ class GetChats extends AsyncTask, List> { } } - @Entity() class Chat { int? id; @@ -325,6 +535,7 @@ class Chat { title ??= getTitle(); return title!; } + String? displayName; List _participants = []; List get participants { @@ -333,6 +544,7 @@ class Chat { } return _participants; } + bool? autoSendReadReceipts; bool? autoSendTypingIndicators; String? textFieldText; @@ -341,19 +553,25 @@ class Chat { Message? _latestMessage; Message get latestMessage { if (_latestMessage != null) return _latestMessage!; - _latestMessage = Chat.getMessages(this, limit: 1, getDetails: true).firstOrNull ?? Message( - dateCreated: DateTime.fromMillisecondsSinceEpoch(0), - guid: guid, - ); + _latestMessage = + Chat.getMessages(this, limit: 1, getDetails: true).firstOrNull ?? + Message( + dateCreated: DateTime.fromMillisecondsSinceEpoch(0), + guid: guid, + ); return _latestMessage!; } + Message get dbLatestMessage { - _latestMessage = Chat.getMessages(this, limit: 1, getDetails: true).firstOrNull ?? Message( - dateCreated: DateTime.fromMillisecondsSinceEpoch(0), - guid: guid, - ); + _latestMessage = + Chat.getMessages(this, limit: 1, getDetails: true).firstOrNull ?? + Message( + dateCreated: DateTime.fromMillisecondsSinceEpoch(0), + guid: guid, + ); return _latestMessage!; } + set latestMessage(Message m) => _latestMessage = m; @Property(uid: 526293286661780207) DateTime? dbOnlyLatestMessageDate; @@ -372,10 +590,15 @@ class Chat { Message get sendLastMessage { var messages = Chat.getMessages(this, limit: 10, getDetails: true); - return messages.firstWhereOrNull((msg) => msg.stagingGuid != null || (msg.guid != null && !msg.guid!.contains("temp") && !msg.guid!.contains("error"))) ?? Message( - dateCreated: DateTime.fromMillisecondsSinceEpoch(0), - guid: guid, - ); + return messages.firstWhereOrNull((msg) => + msg.stagingGuid != null || + (msg.guid != null && + !msg.guid!.contains("temp") && + !msg.guid!.contains("error"))) ?? + Message( + dateCreated: DateTime.fromMillisecondsSinceEpoch(0), + guid: guid, + ); } final RxnString _customAvatarPath = RxnString(); @@ -462,7 +685,9 @@ class Chat { } factory Chat.fromMap(Map json) { - final message = json['lastMessage'] != null ? Message.fromMap(json['lastMessage']!.cast()) : null; + final message = json['lastMessage'] != null + ? Message.fromMap(json['lastMessage']!.cast()) + : null; return Chat( id: json["ROWID"] ?? json["id"], guid: json["guid"], @@ -476,7 +701,9 @@ class Chat { displayName: json["displayName"], customAvatar: json['_customAvatarPath'], pinnedIndex: json['_pinIndex'], - participants: (json['participants'] as List? ?? []).map((e) => Handle.fromMap(e!.cast())).toList(), + participants: (json['participants'] as List? ?? []) + .map((e) => Handle.fromMap(e!.cast())) + .toList(), autoSendReadReceipts: json["autoSendReadReceipts"], autoSendTypingIndicators: json["autoSendTypingIndicators"], dateDeleted: parseDate(json["dateDeleted"]), @@ -500,7 +727,8 @@ class Chat { if (usingHandle != null && isRpSms) { var acceptableHandles = []; if (isRoutingStub) { - acceptableHandles = await api.getMyPhoneHandles(state: pushService.state!.client); + acceptableHandles = + await api.getMyPhoneHandles(state: pushService.state!.client); } else { acceptableHandles = ss.settings.smsForwardingTargets.keys.toList(); } @@ -511,7 +739,8 @@ class Chat { if (usingHandle == null) { if (isRpSms) { if (isRoutingStub) { - usingHandle = (await api.getMyPhoneHandles(state: pushService.state!.client))[0]; + usingHandle = (await api.getMyPhoneHandles( + state: pushService.state!.client))[0]; } else { usingHandle = ss.settings.smsForwardingTargets.keys.firstOrNull!; } @@ -603,7 +832,8 @@ class Chat { ckSyncState = existing?.ckSyncState ?? ckSyncState; } if (!updateAttachmentGuid) { - photoAttachmentGuid = existing?.photoAttachmentGuid ?? photoAttachmentGuid; + photoAttachmentGuid = + existing?.photoAttachmentGuid ?? photoAttachmentGuid; } if (!updateHasUnreadMessage) { hasUnreadMessage = existing?.hasUnreadMessage ?? hasUnreadMessage; @@ -621,13 +851,15 @@ class Chat { textFieldText = existing?.textFieldText ?? textFieldText; } if (!updateTextFieldAnnotations) { - textFieldAnnotations = existing?.textFieldAnnotations ?? textFieldAnnotations; + textFieldAnnotations = + existing?.textFieldAnnotations ?? textFieldAnnotations; } if (!updateAPNTitle) { apnTitle = existing?.apnTitle ?? apnTitle; } if (!updateTextFieldAttachments) { - textFieldAttachments = existing?.textFieldAttachments ?? textFieldAttachments; + textFieldAttachments = + existing?.textFieldAttachments ?? textFieldAttachments; } if (!updateDisplayName) { displayName = existing?.displayName ?? displayName; @@ -642,7 +874,8 @@ class Chat { lockChatIcon = existing?.lockChatIcon ?? false; } if (!updateLastReadMessageGuid) { - lastReadMessageGuid = existing?.lastReadMessageGuid ?? lastReadMessageGuid; + lastReadMessageGuid = + existing?.lastReadMessageGuid ?? lastReadMessageGuid; } if (!updateGroupVersion) { groupVersion = existing?.groupVersion ?? groupVersion; @@ -669,16 +902,19 @@ class Chat { shareZenMode = existing?.shareZenMode ?? shareZenMode; } if (!updateDateNotifiedAnyways) { - dateNotifiedAnyways = existing?.dateNotifiedAnyways ?? dateNotifiedAnyways; + dateNotifiedAnyways = + existing?.dateNotifiedAnyways ?? dateNotifiedAnyways; } if (!updateSenderIsKnown) { senderIsKnown = existing?.senderIsKnown ?? senderIsKnown; } if (!updateTranscriptPosterPath) { - transcriptPosterPath = existing?.transcriptPosterPath ?? transcriptPosterPath; + transcriptPosterPath = + existing?.transcriptPosterPath ?? transcriptPosterPath; } if (!updateTranscriptBackgroundVersion) { - transcriptBackgroundVersion = existing?.transcriptBackgroundVersion ?? transcriptBackgroundVersion; + transcriptBackgroundVersion = existing?.transcriptBackgroundVersion ?? + transcriptBackgroundVersion; } /// Save the chat and add the participants @@ -704,63 +940,76 @@ class Chat { } Future getPersonalConfig() async { - if (participants.length > 1 || participants.isEmpty || !Platform.isAndroid) return 0; + if (participants.length > 1 || + participants.isEmpty || + !Platform.isAndroid) { + return 0; + } bool isStarredContact = await mcs.invokeMethod("is-conversation-exempt", { "mode": "star", "contactId": participants.first.contact!.id.toInt(), }); - bool isPriority = await mcs.invokeMethod("is-conversation-exempt", { - "mode": "priority", - "guid": guid - }); + bool isPriority = await mcs.invokeMethod( + "is-conversation-exempt", {"mode": "priority", "guid": guid}); - int configMask = - ((isStarredContact ? 1 : 0) << 0) | - ((isPriority ? 1 : 0) << 1); + int configMask = + ((isStarredContact ? 1 : 0) << 0) | ((isPriority ? 1 : 0) << 1); return configMask; } void fixZenModeShared() async { if (!ss.settings.enableShareZen.value) return; - bool wantsZenMode = (shareZenMode ?? true) && participants.firstOrNull?.contact?.isShared == false; + bool wantsZenMode = (shareZenMode ?? true) && + participants.firstOrNull?.contact?.isShared == false; var config = wantsZenMode ? await getPersonalConfig() : null; if (config == zenModeIsShared) return; var statuskit = pushService.state?.icloudServices?.statuskitClient; if (statuskit == null) return; if (wantsZenMode) { - await api.inviteToChannel(status: statuskit, handle: await ensureHandle(), to: { - getRustHandlesExcludingMine()[0]: await configForMask(config!) - }); + await api.inviteToChannel( + status: statuskit, + handle: await ensureHandle(), + to: {getRustHandlesExcludingMine()[0]: await configForMask(config!)}); zenModeIsShared = config; save(updateZenModeIsShared: true); } else { // okay, sooo // get everyone who *is* allowed to have my status updates - final query = Database.chats.query(Chat_.zenModeIsShared.notNull().and(Chat_.dbOnlyLatestMessageDate.greaterThanDate(DateTime.now().subtract(const Duration(days: 7))))).build(); + final query = Database.chats + .query(Chat_.zenModeIsShared.notNull().and( + Chat_.dbOnlyLatestMessageDate.greaterThanDate( + DateTime.now().subtract(const Duration(days: 7))))) + .build(); final results = query.find(); query.close(); - + Map> sendMap = {}; for (var result in results) { if (result.guid == guid) continue; // no longer share us var handle = await result.ensureHandle(); sendMap.putIfAbsent(handle, () => {}); - sendMap[handle]![result.getRustHandlesExcludingMine()[0]] = await configForMask(result.zenModeIsShared!); + sendMap[handle]![result.getRustHandlesExcludingMine()[0]] = + await configForMask(result.zenModeIsShared!); } - + await api.resetChannelKeys(status: statuskit); for (var handle in sendMap.entries) { - await api.inviteToChannel(status: statuskit, handle: handle.key, to: handle.value); + await api.inviteToChannel( + status: statuskit, handle: handle.key, to: handle.value); } zenModeIsShared = null; save(updateZenModeIsShared: true); // these people sadly fall off - final o = Database.chats.query(Chat_.zenModeIsShared.notNull().and(Chat_.dbOnlyLatestMessageDate.lessThanDate(DateTime.now().subtract(const Duration(days: 7))))).build(); + final o = Database.chats + .query(Chat_.zenModeIsShared.notNull().and(Chat_ + .dbOnlyLatestMessageDate + .lessThanDate(DateTime.now().subtract(const Duration(days: 7))))) + .build(); final older = o.find(); o.close(); for (var item in older) { @@ -801,19 +1050,21 @@ class Chat { var chat = Chat.findByRustGuid(c.groupId); if (chat != null) return chat; - final query2= Database.chats.query(Chat_.chatIdentifier.equals(c.chatIdentifier)).build(); + final query2 = Database.chats + .query(Chat_.chatIdentifier.equals(c.chatIdentifier)) + .build(); final result2 = query2.findFirst(); query2.close(); if (result2 != null) return result2; - var cond = Chat_.isRoutingStub.equals(false); if (c.displayName != null) { cond = cond.and(Chat_.apnTitle.equals(c.displayName!)); } final query = (Database.chats.query(cond) - ..linkMany(Chat_.handles, Handle_.address.oneOf(c.participants.map((e) => e.uri).toList()))) - .build(); + ..linkMany(Chat_.handles, + Handle_.address.oneOf(c.participants.map((e) => e.uri).toList()))) + .build(); final results = query.find(); query.close(); @@ -831,7 +1082,9 @@ class Chat { if (result != null) return result; - chat = await backend.createChat(c.participants.map((p) => p.uri).toList(), null, c.serviceName, existingGuid: c.groupId); + chat = await backend.createChat( + c.participants.map((p) => p.uri).toList(), null, c.serviceName, + existingGuid: c.groupId); chat.senderIsKnown = true; chat.save(updateSenderIsKnown: true); return chat; @@ -842,27 +1095,35 @@ class Chat { if (cloudData != null) { existing = api.restoreCloudChat(data: cloudData!); } else { - chatIdentifier = participants.length == 1 ? participants[0].address : "chat${(Random().nextInt(pow(2, 32).toInt()) << 32) | Random().nextInt(pow(2, 32).toInt())}"; + chatIdentifier = participants.length == 1 + ? participants[0].address + : "chat${(Random().nextInt(pow(2, 32).toInt()) << 32) | Random().nextInt(pow(2, 32).toInt())}"; cloudGuid ??= guid; existing = api.CloudChat( - style: isGroup ? 43 : 45, - isFiltered: 0, - successfulQuery: 1, - state: 3, // seems to be a constant - chatIdentifier: chatIdentifier!, - groupId: cloudGuid!, - serviceName: "iMessage", - originalGroupId: cloudGuid!, + style: isGroup ? 43 : 45, + isFiltered: 0, + successfulQuery: 1, + state: 3, // seems to be a constant + chatIdentifier: chatIdentifier!, + groupId: cloudGuid!, + serviceName: "iMessage", + originalGroupId: cloudGuid!, properties: api.CloudProp( numberOfTimesRespondedtoThread: 3, // always 3? shouldForceToSms: false, legacyGroupIdentifiers: [], messageHandshakeState: 1, ), - participants: participants.map((p) => api.CloudParticipant(uri: p.address)).toList(), - prop001: const api.CloudProp001(syndicationType: 0), - lastReadMessageTimestamp: dbOnlyLatestMessageDate == null ? 0 : RustPushBBUtils.nsSinceAppleEpoch(dbOnlyLatestMessageDate!), - lastAddressedHandle: (await ensureHandle()).replaceFirst("mailto:", "").replaceFirst("tel:", ""), + participants: participants + .map((p) => api.CloudParticipant(uri: p.address)) + .toList(), + prop001: const api.CloudProp001(syndicationType: 0), + lastReadMessageTimestamp: dbOnlyLatestMessageDate == null + ? 0 + : RustPushBBUtils.nsSinceAppleEpoch(dbOnlyLatestMessageDate!), + lastAddressedHandle: (await ensureHandle()) + .replaceFirst("mailto:", "") + .replaceFirst("tel:", ""), guid: "iMessage;${isGroup ? '+' : '-'};$chatIdentifier", displayName: displayName, proto001: api.encodeChatproto(chat: const api.ChatProto(unk1: 0)), @@ -870,31 +1131,37 @@ class Chat { } existing.style = isGroup ? 43 : 45; existing.chatIdentifier = chatIdentifier!; - existing.participants = participants.map((p) => api.CloudParticipant(uri: p.address)).toList(); - existing.lastReadMessageTimestamp = dbOnlyLatestMessageDate == null ? 0 : RustPushBBUtils.nsSinceAppleEpoch(dbOnlyLatestMessageDate!); - existing.lastAddressedHandle = (await ensureHandle()).replaceFirst("mailto:", "").replaceFirst("tel:", ""); + existing.participants = + participants.map((p) => api.CloudParticipant(uri: p.address)).toList(); + existing.lastReadMessageTimestamp = dbOnlyLatestMessageDate == null + ? 0 + : RustPushBBUtils.nsSinceAppleEpoch(dbOnlyLatestMessageDate!); + existing.lastAddressedHandle = (await ensureHandle()) + .replaceFirst("mailto:", "") + .replaceFirst("tel:", ""); existing.displayName = displayName; if (existing.properties != null) { existing.properties!.pv = groupVersion ?? 1; // existing.properties!.gpufc = groupVersion ?? 1; existing.properties!.lastSeenMessageGuid = lastReadMessageGuid; existing.properties!.lastModificationDate = api.dateNow(); - existing.properties!.groupPhotoGuid = photoAttachmentGuid != null ? unconvertAttachmentGuid(photoAttachmentGuid!) : null; + existing.properties!.groupPhotoGuid = photoAttachmentGuid != null + ? unconvertAttachmentGuid(photoAttachmentGuid!) + : null; } if (customAvatarPath == null) { existing.groupPhoto = null; existing.groupPhotoGuid = null; } else { - existing.groupPhotoGuid = photoAttachmentGuid != null ? unconvertAttachmentGuid(photoAttachmentGuid!) : null; + existing.groupPhotoGuid = photoAttachmentGuid != null + ? unconvertAttachmentGuid(photoAttachmentGuid!) + : null; } return existing; } - String unconvertAttachmentGuid(String guid) { - var items = guid.split("_"); - if (items.length == 1) return guid; - return "at_${items[1]}_${items[0]}"; - } + String unconvertAttachmentGuid(String guid) => + unconvertAppleAttachmentGuid(guid); bool applyFromCloud(api.CloudChat c, String record) { chatIdentifier = c.chatIdentifier; @@ -912,12 +1179,16 @@ class Chat { groupVersion = c.properties?.pv; // techincally uri doesn't have mailto: or tel: prefix, but that's fine handles.clear(); - handles.addAll(c.participants.map((i) => RustPushBBUtils.rustHandleToBB(i.uri))); + handles.addAll( + c.participants.map((i) => RustPushBBUtils.rustHandleToBB(i.uri))); handles.applyToDb(); - - usingHandle = c.lastAddressedHandle.isEmail ? "mailto:${c.lastAddressedHandle}" : "tel:${c.lastAddressedHandle}"; + + usingHandle = c.lastAddressedHandle.isEmail + ? "mailto:${c.lastAddressedHandle}" + : "tel:${c.lastAddressedHandle}"; displayName = c.displayName; - dbOnlyLatestMessageDate = RustPushBBUtils.fromNsSinceAppleEpoch(c.lastReadMessageTimestamp); + dbOnlyLatestMessageDate = + RustPushBBUtils.fromNsSinceAppleEpoch(c.lastReadMessageTimestamp); cloudData = api.saveCloudChat(value: c); ckSyncState = true; @@ -934,14 +1205,22 @@ class Chat { } static Future getChatForTel(int tid, List participants) async { - final query3 = Database.chats.query(Chat_.telephonyId.equals(tid).and(Chat_.dateDeleted.isNull()).and(Chat_.isRoutingStub.equals(true))).build(); + final query3 = Database.chats + .query(Chat_.telephonyId + .equals(tid) + .and(Chat_.dateDeleted.isNull()) + .and(Chat_.isRoutingStub.equals(true))) + .build(); final result4 = query3.findFirst(); query3.close(); if (result4 != null) return result4; - final query = (Database.chats.query(Chat_.dateDeleted.isNull().and(Chat_.isRpSms.equals(true)).and(Chat_.isRoutingStub.equals(true))) + final query = (Database.chats.query(Chat_.dateDeleted + .isNull() + .and(Chat_.isRpSms.equals(true)) + .and(Chat_.isRoutingStub.equals(true))) ..linkMany(Chat_.handles, Handle_.address.oneOf(participants))) - .build(); + .build(); final results = query.find(); query.close(); @@ -966,23 +1245,25 @@ class Chat { return result; } - Future deliverSMS(String sender, bool fromMe, List> parts) async { + Future deliverSMS( + String sender, bool fromMe, List> parts) async { if (!ss.settings.isSmsRouter.value) { return; // don't deliver if not enabled :) } - if (sender.isEmail) return; // no one uses this feature anyway, and can't debug it due to TMO's MXRT AUP + if (sender.isEmail) { + return; // no one uses this feature anyway, and can't debug it due to TMO's MXRT AUP + } if (fromMe && "tel:$sender" != usingHandle) { - Logger.info("Chat delivering sms, handle $usingHandle not sms handle $sender"); + Logger.info( + "Chat delivering sms, handle $usingHandle not sms handle $sender"); usingHandle = "tel:$sender"; save(updateUsingHandle: true); } var handle = Handle.findOne(addressAndService: Tuple2(sender, "iMessage")); if (handle == null) { - handle = Handle( - address: sender - ); + handle = Handle(address: sender); handle.save(); } if (handle.originalROWID == null) { @@ -990,7 +1271,9 @@ class Chat { handle.save(); } for (var part in parts) { - var partContent = part["body"] is Uint8List ? part["body"] as Uint8List : Uint8List.fromList(part["body"].cast().toList()); + var partContent = part["body"] is Uint8List + ? part["body"] as Uint8List + : Uint8List.fromList(part["body"].cast().toList()); // smil is for unnessesary if (part["contentType"] == "application/smil") continue; if (part["contentType"] == "text/plain") { @@ -1007,24 +1290,28 @@ class Chat { handle: handle, hasDdResults: true, hasBeenForwarded: true, - attributedBody: [AttributedBody(string: bodyString, runs: [Run( - range: [0, bodyString.length], - attributes: Attributes( - messagePart: 0, - ) - )])], + attributedBody: [ + AttributedBody(string: bodyString, runs: [ + Run( + range: [0, bodyString.length], + attributes: Attributes( + messagePart: 0, + )) + ]) + ], temp: true, ); await backend.sendMessage(this, _message); if (fromMe) { - await (backend as RustPushBackend).confirmSmsSent(_message, this, true); + await (backend as RustPushBackend) + .confirmSmsSent(_message, this, true); } } else { var myUuid = "${part["id"]}_0"; - String data = await rootBundle.loadString("assets/rustpush/uti-map.json"); + String data = + await rootBundle.loadString("assets/rustpush/uti-map.json"); final utiMap = jsonDecode(data); - final _message = Message( text: " ", threadOriginatorPart: "0:0:0", @@ -1036,31 +1323,34 @@ class Chat { handle: handle, hasDdResults: true, hasBeenForwarded: true, - attributedBody: [AttributedBody(string: " ", runs: [Run( - range: [0, 1], - attributes: Attributes( - attachmentGuid: myUuid, - messagePart: 0 - ) - )])], + attributedBody: [ + AttributedBody(string: " ", runs: [ + Run(range: [ + 0, + 1 + ], attributes: Attributes(attachmentGuid: myUuid, messagePart: 0)) + ]) + ], attachments: [ Attachment( - guid: myUuid, - uti: utiMap[part["contentType"] as String] ?? "public.data", - mimeType: part["contentType"] as String, - isOutgoing: false, - bytes: partContent, - totalBytes: partContent.length, - transferName: "${part["id"]}.${extensionFromMime(part["contentType"] as String) ?? "bin"}" - ) + guid: myUuid, + uti: utiMap[part["contentType"] as String] ?? "public.data", + mimeType: part["contentType"] as String, + isOutgoing: false, + bytes: partContent, + totalBytes: partContent.length, + transferName: + "${part["id"]}.${extensionFromMime(part["contentType"] as String) ?? "bin"}") ], temp: true, ); await _message.attachments.first!.writeToDisk(); - await (backend as RustPushBackend).forwardMMSAttachment(this, _message, _message.attachments.first!); + await (backend as RustPushBackend) + .forwardMMSAttachment(this, _message, _message.attachments.first!); File(_message.attachments.first!.path).deleteSync(); if (fromMe) { - await (backend as RustPushBackend).confirmSmsSent(_message, this, true); + await (backend as RustPushBackend) + .confirmSmsSent(_message, this, true); } } } @@ -1075,11 +1365,15 @@ class Chat { } }).toList(); } - + Future getConversationData() async { var handles = getRustHandlesExcludingMine(); handles.add(await ensureHandle()); - return api.ConversationData(participants: handles, cvName: apnTitle, senderGuid: guid, afterGuid: sendLastMessage.stagingGuid ?? sendLastMessage.guid); + return api.ConversationData( + participants: handles, + cvName: apnTitle, + senderGuid: guid, + afterGuid: sendLastMessage.stagingGuid ?? sendLastMessage.guid); } /// Change a chat's display name @@ -1106,9 +1400,15 @@ class Chat { /// Get a chat's title String getChatCreatorSubtitle() { // generate names for group chats or DMs - List titles = participants.map((e) => e.displayName.trim().split(isGroup && e.contact != null ? " " : String.fromCharCode(65532)).first).toList(); + List titles = participants + .map((e) => e.displayName + .trim() + .split( + isGroup && e.contact != null ? " " : String.fromCharCode(65532)) + .first) + .toList(); if (titles.isEmpty) { - if(chatIdentifier != null) { + if (chatIdentifier != null) { if (chatIdentifier!.startsWith("urn:biz")) { return "Business Chat"; } @@ -1162,7 +1462,8 @@ class Chat { /// Check if the chat is temporarily muted } else if (muteType == "temporary_mute") { DateTime time = DateTime.parse(muteArgs!); - bool shouldMute = DateTime.now().toLocal().difference(time).inSeconds.isNegative; + bool shouldMute = + DateTime.now().toLocal().difference(time).inSeconds.isNegative; if (!shouldMute) { toggleMute(false); } @@ -1198,7 +1499,7 @@ class Chat { for (Attachment attachment in attachments) { try { File(attachment.getFile().path!).deleteSync(); - } catch(e) { + } catch (e) { Logger.debug("Failed to rm attachment $e"); } } @@ -1209,9 +1510,10 @@ class Chat { Database.attachments.removeMany(attachments.map((e) => e.id!).toList()); }); if (chat.ckRecordId != null && !pushService.syncStopDelete) { - var list = ss.prefs.getStringList("chatDeletionIds-1") ?? []; - list.add(chat.ckRecordId!); - ss.prefs.setStringList("chatDeletionIds-1", list); + await pushService.queueLegacyCloudKitDeletion( + kind: LegacyCloudKitDeletionKind.chat, + recordId: chat.ckRecordId!, + ); } } @@ -1238,12 +1540,17 @@ class Chat { if (kIsWeb) return; Database.runInTransaction(TxMode.write, () { chat.dateDeleted = null; - chat.senderIsKnown = chat.handles.any((handle) => !(handle.contact?.isShared ?? true)); + chat.senderIsKnown = + chat.handles.any((handle) => !(handle.contact?.isShared ?? true)); chat.save(updateDateDeleted: true, updateSenderIsKnown: true); }); } - Chat toggleHasUnread(bool hasUnread, {bool force = false, bool newOnMessage = false, bool clearLocalNotifications = true, bool privateMark = true}) { + Chat toggleHasUnread(bool hasUnread, + {bool force = false, + bool newOnMessage = false, + bool clearLocalNotifications = true, + bool privateMark = true}) { if (kIsDesktop && !hasUnread) { notif.clearDesktopNotificationsForChat(guid); } @@ -1251,7 +1558,8 @@ class Chat { if (hasUnreadMessage == hasUnread && !force) return this; var changed = false; if (!cm.isChatActive(guid) || !hasUnread || force) { - changed = Chat.findOne(guid: guid)!.hasUnreadMessage! != hasUnread || newOnMessage; + changed = Chat.findOne(guid: guid)!.hasUnreadMessage! != hasUnread || + newOnMessage; hasUnreadMessage = hasUnread; save(updateHasUnreadMessage: true); } @@ -1262,17 +1570,18 @@ class Chat { try { if (clearLocalNotifications && !hasUnread && !ls.isBubble) { - mcs.invokeMethod( - "delete-notification", - { - "notification_id": id, - "tag": NotificationsService.NEW_MESSAGE_TAG - } - ); + mcs.invokeMethod("delete-notification", { + "notification_id": id, + "tag": NotificationsService.NEW_MESSAGE_TAG + }); } if (privateMark && changed) { if (!hasUnread) { - backend.markRead(this, ss.settings.enablePrivateAPI.value && (autoSendReadReceipts ?? ss.settings.privateMarkChatAsRead.value)); + backend.markRead( + this, + ss.settings.enablePrivateAPI.value && + (autoSendReadReceipts ?? + ss.settings.privateMarkChatAsRead.value)); } else if (hasUnread) { backend.markUnread(this); } @@ -1282,9 +1591,14 @@ class Chat { return this; } - Future addMessage(Message message, {bool changeUnreadStatus = true, bool checkForMessageText = true, bool clearNotificationsIfFromMe = true}) async { + Future addMessage(Message message, + {bool changeUnreadStatus = true, + bool checkForMessageText = true, + bool clearNotificationsIfFromMe = true}) async { // If this is a message preview and we don't already have metadata for this, get it - if (message.fullText.replaceAll("\n", " ").hasUrl && !MetadataHelper.mapIsNotEmpty(message.metadata) && !message.hasApplePayloadData) { + if (message.fullText.replaceAll("\n", " ").hasUrl && + !MetadataHelper.mapIsNotEmpty(message.metadata) && + !message.hasApplePayloadData) { MetadataHelper.fetchMetadata(message).then((Metadata? meta) async { // If the metadata is empty, don't do anything if (!MetadataHelper.isNotEmpty(meta)) return; @@ -1303,7 +1617,10 @@ class Chat { } catch (ex, stacktrace) { newMessage = Message.findOne(guid: message.guid); if (newMessage == null) { - Logger.error("Failed to add message (GUID: ${message.guid}) to chat (GUID: $guid)", error: ex, trace: stacktrace); + Logger.error( + "Failed to add message (GUID: ${message.guid}) to chat (GUID: $guid)", + error: ex, + trace: stacktrace); } } // Save any attachments @@ -1315,8 +1632,9 @@ class Chat { // If the message was saved correctly, update this chat's latestMessage info, // but only if the incoming message's date is newer if ((newMessage?.id != null || kIsWeb) && checkForMessageText) { - isNewer = message.dateCreated!.isAfter(latest.dateCreated!) - || (message.guid != latest.guid && message.dateCreated == latest.dateCreated); + isNewer = message.dateCreated!.isAfter(latest.dateCreated!) || + (message.guid != latest.guid && + message.dateCreated == latest.dateCreated); if (isNewer) { _latestMessage = message; if (dateDeleted != null) { @@ -1324,7 +1642,10 @@ class Chat { save(updateDateDeleted: true); await chats.addChat(this); } - if (isArchived! && !_latestMessage!.isFromMe! && ss.settings.unarchiveOnNewMessage.value && !participants.first.isBlocked()) { + if (isArchived! && + !_latestMessage!.isFromMe! && + ss.settings.unarchiveOnNewMessage.value && + !participants.first.isBlocked()) { toggleArchived(false); } } @@ -1347,14 +1668,12 @@ class Chat { // If the message is not from the same chat as the current chat, mark unread if (message.isFromMe! || cm.isChatActive(guid)) { // force if the chat is active to ensure private api mark read - toggleHasUnread( - false, - clearLocalNotifications: clearNotificationsIfFromMe, - force: cm.isChatActive(guid), - // only private mark if the chat is active - privateMark: cm.isChatActive(guid), - newOnMessage: !message.isFromMe! - ); + toggleHasUnread(false, + clearLocalNotifications: clearNotificationsIfFromMe, + force: cm.isChatActive(guid), + // only private mark if the chat is active + privateMark: cm.isChatActive(guid), + newOnMessage: !message.isFromMe!); } else if (!cm.isChatActive(guid)) { toggleHasUnread(true, privateMark: false); } @@ -1382,21 +1701,66 @@ class Chat { return Database.chats.count(); } - Future> getAttachmentsAsync({bool fetchDeleted = false}) async { + Future> getAttachmentsAsync( + {bool fetchDeleted = false}) async { if (kIsWeb || id == null) return []; final task = GetChatAttachments([id!, fetchDeleted]); return (await createAsyncTask>(task)) ?? []; } + Future getMediaPageAsync({ + required ChatMediaDirection direction, + ChatMediaCursor? cursor, + int limit = 24, + int scanLimit = 500, + }) async { + if (kIsWeb || id == null) return ChatMediaPage.empty; + + final task = GetChatMediaPage([ + id, + direction.index, + cursor?.dateMilliseconds, + cursor?.messageId, + limit, + scanLimit, + ]); + return (await createAsyncTask(task)) ?? ChatMediaPage.empty; + } + + Future getAttachmentOverviewAsync({ + int documentLimit = 24, + int locationLimit = 10, + int scanLimit = 1000, + }) async { + if (kIsWeb || id == null) return ChatAttachmentOverview.empty; + + final task = GetChatAttachmentOverview([ + id, + documentLimit, + locationLimit, + scanLimit, + ]); + return (await createAsyncTask(task)) ?? + ChatAttachmentOverview.empty; + } + /// Gets messages synchronously - DO NOT use in performance-sensitive areas, /// otherwise prefer [getMessagesAsync] - static List getMessages(Chat chat, {int offset = 0, int limit = 25, bool includeDeleted = false, bool getDetails = false}) { + static List getMessages(Chat chat, + {int offset = 0, + int limit = 25, + bool includeDeleted = false, + bool getDetails = false}) { if (kIsWeb || chat.id == null) return []; return Database.runInTransaction(TxMode.read, () { final query = (Database.messages.query(includeDeleted - ? Message_.dateCreated.notNull().and(Message_.dateDeleted.isNull().or(Message_.dateDeleted.notNull())) - : Message_.dateDeleted.isNull().and(Message_.dateCreated.notNull())) + ? Message_.dateCreated.notNull().and(Message_.dateDeleted + .isNull() + .or(Message_.dateDeleted.notNull())) + : Message_.dateDeleted + .isNull() + .and(Message_.dateCreated.notNull())) ..link(Message_.chat, Chat_.id.equals(chat.id!)) ..order(Message_.dateCreated, flags: Order.descending)) .build(); @@ -1407,8 +1771,13 @@ class Chat { query.close(); for (int i = 0; i < messages.length; i++) { Message message = messages[i]; - if (chat.participants.isNotEmpty && !message.isFromMe! && message.handleId != null && message.handleId != 0) { - Handle? handle = chat.participants.firstWhereOrNull((e) => e.originalROWID == message.handleId) ?? message.getHandle(); + if (chat.participants.isNotEmpty && + !message.isFromMe! && + message.handleId != null && + message.handleId != 0) { + Handle? handle = chat.participants.firstWhereOrNull( + (e) => e.originalROWID == message.handleId) ?? + message.getHandle(); if (handle == null) { messages.remove(message); i--; @@ -1420,15 +1789,19 @@ class Chat { // fetch attachments and reactions if requested if (getDetails) { final messageGuids = messages.map((e) => e.guid!).toList(); - final associatedMessagesQuery = (Database.messages.query(Message_.associatedMessageGuid.oneOf(messageGuids)) + final associatedMessagesQuery = (Database.messages + .query(Message_.associatedMessageGuid.oneOf(messageGuids)) ..order(Message_.originalROWID)) .build(); List associatedMessages = associatedMessagesQuery.find(); associatedMessagesQuery.close(); - associatedMessages = MessageHelper.normalizedAssociatedMessages(associatedMessages); + associatedMessages = + MessageHelper.normalizedAssociatedMessages(associatedMessages); for (Message m in messages) { m.attachments = List.from(m.dbAttachments); - m.associatedMessages = associatedMessages.where((e) => e.associatedMessageGuid == m.guid).toList(); + m.associatedMessages = associatedMessages + .where((e) => e.associatedMessageGuid == m.guid) + .toList(); } } return messages; @@ -1437,10 +1810,14 @@ class Chat { /// Fetch messages asynchronously static Future> getMessagesAsync(Chat chat, - {int offset = 0, int limit = 25, bool includeDeleted = false, int? searchAround}) async { + {int offset = 0, + int limit = 25, + bool includeDeleted = false, + int? searchAround}) async { if (kIsWeb || chat.id == null) return []; - final task = GetMessages([chat.id, offset, limit, includeDeleted, searchAround]); + final task = + GetMessages([chat.id, offset, limit, includeDeleted, searchAround]); return (await createAsyncTask>(task)) ?? []; } @@ -1460,7 +1837,8 @@ class Chat { void _deduplicateParticipants() { if (_participants.isEmpty) return; final ids = _participants.map((e) => e.uniqueAddressAndService).toSet(); - _participants.retainWhere((element) => ids.remove(element.uniqueAddressAndService)); + _participants + .retainWhere((element) => ids.remove(element.uniqueAddressAndService)); } Chat togglePin(bool isPinned) { @@ -1495,7 +1873,8 @@ class Chat { if (id == null) return this; this.autoSendReadReceipts = autoSendReadReceipts; save(updateAutoSendReadReceipts: true); - backend.markRead(this, autoSendReadReceipts ?? ss.settings.privateMarkChatAsRead.value); + backend.markRead( + this, autoSendReadReceipts ?? ss.settings.privateMarkChatAsRead.value); return this; } @@ -1503,21 +1882,23 @@ class Chat { if (id == null) return this; this.autoSendTypingIndicators = autoSendTypingIndicators; save(updateAutoSendTypingIndicators: true); - if (!(autoSendTypingIndicators ?? ss.settings.privateSendTypingIndicators.value)) { + if (!(autoSendTypingIndicators ?? + ss.settings.privateSendTypingIndicators.value)) { backend.stoppedTyping(this); } return this; } /// Finds a chat - only use this method on Flutter Web!!! - static Future findOneWeb({String? guid, String? chatIdentifier}) async { + static Future findOneWeb( + {String? guid, String? chatIdentifier}) async { return null; } static Chat? findByHandle(String handle) { final query = (Database.chats.query() ..linkMany(Chat_.handles, Handle_.address.oneOf([handle]))) - .build(); + .build(); final results = query.find(); query.close(); @@ -1529,7 +1910,8 @@ class Chat { if (direct != null) return direct; // prioritize finding by related GUID - final query = Database.chats.query(Chat_.guidRefs.containsElement(guid)).build(); + final query = + Database.chats.query(Chat_.guidRefs.containsElement(guid)).build(); final results = query.find(); query.close(); if (results.isNotEmpty) { @@ -1541,7 +1923,8 @@ class Chat { // if soft is false, return is never null // only null if soft is true and no matching chat is found - static Future findByRust(api.ConversationData data, String service, {bool soft = false, bool routingStub = false}) async { + static Future findByRust(api.ConversationData data, String service, + {bool soft = false, bool routingStub = false}) async { if (data.participants.isEmpty) { throw Exception("empty participants!??"); } @@ -1552,7 +1935,9 @@ class Chat { if (direct != null) return direct; // prioritize finding by related GUID - final query = Database.chats.query(Chat_.guidRefs.containsElement(data.senderGuid!)).build(); + final query = Database.chats + .query(Chat_.guidRefs.containsElement(data.senderGuid!)) + .build(); final results = query.find(); query.close(); if (results.isNotEmpty) { @@ -1561,7 +1946,8 @@ class Chat { } } - var (mine, dartParticipants) = await RustPushBBUtils.rustParticipantsToBB(data.participants); + var (mine, dartParticipants) = + await RustPushBBUtils.rustParticipantsToBB(data.participants); final name = data.cvName; @@ -1570,28 +1956,41 @@ class Chat { cond = cond.and(Chat_.apnTitle.equals(name)); } final query = (Database.chats.query(cond) - ..linkMany(Chat_.handles, Handle_.address.oneOf(dartParticipants.map((e) => e.address).toList()))) - .build(); + ..linkMany( + Chat_.handles, + Handle_.address + .oneOf(dartParticipants.map((e) => e.address).toList()))) + .build(); final results = query.find(); query.close(); - Logger.warn("Found ${results.length} candidates"); + var rejectedAddressMismatch = 0; + var rejectedParticipantMismatch = 0; var result = results.firstWhereOrNull((element) { var participantsCopy = [...dartParticipants]; for (var handle in element.handles) { var included = participantsCopy.contains(handle); if (!included) { - Logger.warn("Bailing on candidate because ${handle.address} ${handle.id} is not ${participantsCopy.map((i) => "${i.address} ${i.id}").join(", ")} .. ${element.handles.map((i) => "${i.address} ${i.id}").join(", ")}"); + rejectedAddressMismatch++; return false; } participantsCopy.remove(handle); } - Logger.warn("Bailing on candidate left ${participantsCopy.map((i) => "${i.address} ${i.id}").join(", ")} .. ${element.handles.map((i) => "${i.address} ${i.id}").join(", ")}"); + if (participantsCopy.isNotEmpty) { + rejectedParticipantMismatch++; + } return participantsCopy.isEmpty; }); + Logger.debug( + "Rust conversation candidate scan: candidates=${results.length}, " + "addressMismatch=$rejectedAddressMismatch, " + "participantMismatch=$rejectedParticipantMismatch, " + "matched=${result != null}"); if (result == null && !soft) { - result = await backend.createChat(dartParticipants.map((e) => e.address).toList(), null, service, existingGuid: data.senderGuid); + result = await backend.createChat( + dartParticipants.map((e) => e.address).toList(), null, service, + existingGuid: data.senderGuid); result.displayName = data.cvName; result.isRoutingStub = routingStub; result.apnTitle = data.cvName; @@ -1611,7 +2010,9 @@ class Chat { query.close(); return result; } else if (chatIdentifier != null) { - final query = Database.chats.query(Chat_.chatIdentifier.equals(chatIdentifier)).build(); + final query = Database.chats + .query(Chat_.chatIdentifier.equals(chatIdentifier)) + .build(); final result = query.findFirst(); query.close(); return result; @@ -1619,14 +2020,16 @@ class Chat { return null; } - static Future> getChats({int limit = 15, int offset = 0, List ids = const []}) async { + static Future> getChats( + {int limit = 15, int offset = 0, List ids = const []}) async { if (kIsWeb) throw Exception("Use socket to get chats on Web!"); final task = GetChats([limit, offset, ids.isEmpty ? null : ids]); return (await createAsyncTask>(task)) ?? []; } - static Future> syncLatestMessages(List chats, bool toggleUnread) async { + static Future> syncLatestMessages( + List chats, bool toggleUnread) async { if (kIsWeb) throw Exception("Use socket to sync the last message on Web!"); final task = SyncLastMessages([chats, toggleUnread]); @@ -1641,7 +2044,8 @@ class Chat { return (await createAsyncTask>(task)) ?? []; } - static Future> bulkSyncMessages(Chat chat, List messages) async { + static Future> bulkSyncMessages( + Chat chat, List messages) async { if (kIsWeb) throw Exception("Web does not support saving messages!"); if (messages.isEmpty) return []; @@ -1708,21 +2112,29 @@ class Chat { static int sort(Chat? a, Chat? b) { // If they both are pinned & ordered, reflect the order - if (a!.isPinned! && b!.isPinned! && a.pinIndex != null && b.pinIndex != null) { + if (a!.isPinned! && + b!.isPinned! && + a.pinIndex != null && + b.pinIndex != null) { return a.pinIndex!.compareTo(b.pinIndex!); } // If b is pinned & ordered, but a isn't either pinned or ordered, return accordingly - if (b!.isPinned! && b.pinIndex != null && (!a.isPinned! || a.pinIndex == null)) return 1; + if (b!.isPinned! && + b.pinIndex != null && + (!a.isPinned! || a.pinIndex == null)) return 1; // If a is pinned & ordered, but b isn't either pinned or ordered, return accordingly - if (a.isPinned! && a.pinIndex != null && (!b.isPinned! || b.pinIndex == null)) return -1; + if (a.isPinned! && + a.pinIndex != null && + (!b.isPinned! || b.pinIndex == null)) return -1; // Compare when one is pinned and the other isn't if (!a.isPinned! && b.isPinned!) return 1; if (a.isPinned! && !b.isPinned!) return -1; // Compare the last message dates - return -(a.latestMessage.dateCreated)!.compareTo(b.latestMessage.dateCreated!); + return -(a.latestMessage.dateCreated)! + .compareTo(b.latestMessage.dateCreated!); } String getIconPath(int responseLength) { @@ -1730,10 +2142,17 @@ class Chat { } static Future getIcon(Chat c, {bool force = false}) async { - if ((!force && c.lockChatIcon) || backend.getRemoteService() == null) return; - final response = await backend.getRemoteService()!.getChatIcon(c.guid).catchError((err, stack) async { - Logger.error("Failed to get chat icon for chat ${c.getTitle()}", error: err, trace: stack); - return Response(statusCode: 500, requestOptions: RequestOptions(path: "")); + if ((!force && c.lockChatIcon) || backend.getRemoteService() == null) { + return; + } + final response = await backend + .getRemoteService()! + .getChatIcon(c.guid) + .catchError((err, stack) async { + Logger.error("Failed to get chat icon for chat ${c.getTitle()}", + error: err, trace: stack); + return Response( + statusCode: 500, requestOptions: RequestOptions(path: "")); }); if (response.statusCode != 200 || isNullOrEmpty(response.data)) { if (c.customAvatarPath != null) { @@ -1757,35 +2176,35 @@ class Chat { } Map toMap() => { - "ROWID": id, - "guid": guid, - "chatIdentifier": chatIdentifier, - "isArchived": isArchived!, - "muteType": muteType, - "muteArgs": muteArgs, - "isPinned": isPinned!, - "displayName": displayName, - "participants": participants.map((item) => item.toMap()).toList(), - "hasUnreadMessage": hasUnreadMessage!, - "_customAvatarPath": _customAvatarPath.value, - "_pinIndex": _pinIndex.value, - "autoSendReadReceipts": autoSendReadReceipts, - "autoSendTypingIndicators": autoSendTypingIndicators, - "dateDeleted": dateDeleted?.millisecondsSinceEpoch, - "style": style, - "lockChatName": lockChatName, - "lockChatIcon": lockChatIcon, - "lastReadMessageGuid": lastReadMessageGuid, - "isRpSms": isRpSms, - "guidRefs": guidRefs, - "telephonyId": telephonyId, - // intentionally not [from] for debugging, - "textFieldText": textFieldText, - "textFieldAnnotations": textFieldAnnotations, - "notifsSilenced": notifsSilenced, - "zenModeIsShared": zenModeIsShared, - "shareZenMode": shareZenMode, - "dateNotifiedAnyways": dateNotifiedAnyways?.millisecondsSinceEpoch, - "isRoutingStub": isRoutingStub, - }; + "ROWID": id, + "guid": guid, + "chatIdentifier": chatIdentifier, + "isArchived": isArchived!, + "muteType": muteType, + "muteArgs": muteArgs, + "isPinned": isPinned!, + "displayName": displayName, + "participants": participants.map((item) => item.toMap()).toList(), + "hasUnreadMessage": hasUnreadMessage!, + "_customAvatarPath": _customAvatarPath.value, + "_pinIndex": _pinIndex.value, + "autoSendReadReceipts": autoSendReadReceipts, + "autoSendTypingIndicators": autoSendTypingIndicators, + "dateDeleted": dateDeleted?.millisecondsSinceEpoch, + "style": style, + "lockChatName": lockChatName, + "lockChatIcon": lockChatIcon, + "lastReadMessageGuid": lastReadMessageGuid, + "isRpSms": isRpSms, + "guidRefs": guidRefs, + "telephonyId": telephonyId, + // intentionally not [from] for debugging, + "textFieldText": textFieldText, + "textFieldAnnotations": textFieldAnnotations, + "notifsSilenced": notifsSilenced, + "zenModeIsShared": zenModeIsShared, + "shareZenMode": shareZenMode, + "dateNotifiedAnyways": dateNotifiedAnyways?.millisecondsSinceEpoch, + "isRoutingStub": isRoutingStub, + }; } diff --git a/lib/database/io/cloud_sync_records.dart b/lib/database/io/cloud_sync_records.dart new file mode 100644 index 0000000000..08684d5fcb --- /dev/null +++ b/lib/database/io/cloud_sync_records.dart @@ -0,0 +1,771 @@ +import 'package:objectbox/objectbox.dart'; + +/// Durable, account-scoped Cloud Sync V2 state. +/// +/// These records intentionally contain only hashes, typed metadata, or +/// application-encrypted references. Apple account identifiers, record IDs, +/// continuation tokens, message bodies, handles, and keys must never be +/// written to ObjectBox in plaintext. +const int cloudSyncSchemaVersion = 2; + +@Entity() +class CloudSyncCheckpointEntity { + int id; + + /// SHA-256 over account fingerprint, container, database, zone, stream and + /// schema. Every related record carries the same key to prevent cross-scope + /// reads when Apple reuses a zone name. + @Index(type: IndexType.hash64) + @Unique() + String checkpointKey; + + @Index(type: IndexType.hash64) + String accountFingerprint; + + String container; + String database; + + @Index(type: IndexType.hash64) + String zone; + + String streamKind; + int schemaVersion; + + /// Base64 application ciphertext. Never a raw CloudKit continuation token. + String? fetchedTokenCiphertext; + int generation; + String? lastBatchId; + int fetchedSequence; + + /// Highest contiguous terminal inbox sequence. The historical field name is + /// retained for schema compatibility; both applied and quarantined rows are + /// terminal and advance this floor. + int appliedSequence; + int lastSuccessfulAtMs; + int lastAttemptAtMs; + String? lastErrorCategory; + int backoffAttempt; + int nextEligibleAtMs; + int mutationRevisionCounter; + int updatedAtMs; + + CloudSyncCheckpointEntity({ + this.id = 0, + required this.checkpointKey, + required this.accountFingerprint, + required this.container, + required this.database, + required this.zone, + required this.streamKind, + this.schemaVersion = cloudSyncSchemaVersion, + this.fetchedTokenCiphertext, + this.generation = 1, + this.lastBatchId, + this.fetchedSequence = 0, + this.appliedSequence = 0, + this.lastSuccessfulAtMs = 0, + this.lastAttemptAtMs = 0, + this.lastErrorCategory, + this.backoffAttempt = 0, + this.nextEligibleAtMs = 0, + this.mutationRevisionCounter = 0, + required this.updatedAtMs, + }); +} + +@Entity() +class CloudInboxChangeEntity { + int id; + + /// SHA-256 over account, zone, record hash, etag hash and change type. + @Index(type: IndexType.hash64) + @Unique() + String changeKey; + + /// Original account-keyed native change identifier. Unlike [changeKey], + /// this value is preserved exactly for semantic decoder and replay binding. + String changeIdHash; + + @Index(type: IndexType.hash64) + String scopeKey; + + @Index(type: IndexType.hash64) + String accountFingerprint; + + @Index(type: IndexType.hash64) + String zone; + + /// Redacted identifiers used for equality and diagnostics. + @Index(type: IndexType.hash64) + String serverRecordIdHash; + + String? etagHash; + String changeType; + + /// Protected raw identifiers/system fields needed to replay tombstones and + /// preserve unknown CloudKit metadata. Hashes remain the query keys. + String? encryptedServerRecordId; + String? protectedSystemFieldsRef; + + /// Original PCS ciphertext, or a protected local reference to it. + String? encryptedPayloadRef; + String? payloadSha256; + + @Index(type: IndexType.hash64) + String batchId; + + int generation; + + @Index() + int fetchSequence; + + /// 0 pending, 1 applied, 2 quarantined. + @Index() + int status; + + bool isTombstone; + String? failureCategory; + int retryCount; + int nextEligibleAtMs; + int serverModifiedAtMs; + int createdAtMs; + int updatedAtMs; + int completedAtMs; + + CloudInboxChangeEntity({ + this.id = 0, + required this.changeKey, + required this.changeIdHash, + required this.scopeKey, + required this.accountFingerprint, + required this.zone, + required this.serverRecordIdHash, + this.etagHash, + required this.changeType, + this.encryptedServerRecordId, + this.protectedSystemFieldsRef, + this.encryptedPayloadRef, + this.payloadSha256, + required this.batchId, + this.generation = 1, + required this.fetchSequence, + this.status = 0, + this.isTombstone = false, + this.failureCategory, + this.retryCount = 0, + this.nextEligibleAtMs = 0, + this.serverModifiedAtMs = 0, + required this.createdAtMs, + required this.updatedAtMs, + this.completedAtMs = 0, + }); +} + +@Entity() +class CloudSyncLeaseEntity { + int id; + + /// SHA-256 over account, container and database. + @Index(type: IndexType.hash64) + @Unique() + String leaseKey; + + @Index(type: IndexType.hash64) + String scopeKey; + + @Index(type: IndexType.hash64) + String accountFingerprint; + + /// Random per-process owner value, stored as a hash. + String ownerIdHash; + int generation; + int acquiredAtMs; + + @Index() + int expiresAtMs; + + CloudSyncLeaseEntity({ + this.id = 0, + required this.leaseKey, + required this.scopeKey, + required this.accountFingerprint, + required this.ownerIdHash, + required this.generation, + required this.acquiredAtMs, + required this.expiresAtMs, + }); +} + +/// Durable adoption marker for a native protected-page lease. +/// +/// The marker is inserted in the same ObjectBox transaction as the fetched +/// inbox rows and checkpoint. Native crash recovery preserves protected blobs +/// only while this marker exists. The lease reference is an opaque, +/// content-free `obcs2.lease.*` token, never a CloudKit identifier. +@Entity() +class CloudProtectedPageLeaseEntity { + int id; + + @Index(type: IndexType.hash64) + @Unique() + String leaseReference; + + @Index(type: IndexType.hash64) + String scopeKey; + + @Index(type: IndexType.hash64) + String accountFingerprint; + + int generation; + String batchIdHash; + int adoptedAtMs; + int finalizeAttemptCount; + int nextFinalizeEligibleAtMs; + + CloudProtectedPageLeaseEntity({ + this.id = 0, + required this.leaseReference, + required this.scopeKey, + required this.accountFingerprint, + required this.generation, + required this.batchIdHash, + required this.adoptedAtMs, + this.finalizeAttemptCount = 0, + this.nextFinalizeEligibleAtMs = 0, + }); +} + +@Entity() +class CloudOutboxOperationEntity { + int id; + + /// Stable SHA-256 operation identity used for idempotency and coalescing. + @Index(type: IndexType.hash64) + @Unique() + String operationId; + + @Index(type: IndexType.hash64) + String scopeKey; + + @Index(type: IndexType.hash64) + String accountFingerprint; + + @Index(type: IndexType.hash64) + String zone; + + @Index(type: IndexType.hash64) + String logicalEntityKeyHash; + + /// 0 save, 1 delete. Deletes remain feature-gated. + int action; + + /// JSON list containing only hashed operation IDs. + String dependencyOperationIdsJson; + int payloadVersion; + int mutationRevision; + + /// Checkpoint generation which admitted this row. Existing rows from before + /// this property deserialize as zero and are fail-closed by the store. + int checkpointGeneration; + + /// Persisted Apple HTTP request identity shared by one submitted batch. + String? appleRequestUuid; + + /// Persisted Apple operation identity unique within the submitted batch. + String? appleOperationUuid; + + /// Protected local reference or application ciphertext, never message text. + String? encryptedPayloadRef; + String? payloadSha256; + + /// Native protected lease adopted by this non-terminal outbound operation. + /// + /// This is distinct from CloudProtectedPageLeaseEntity. It is nullable so + /// rows written before the schema migration remain readable. + String? protectedLeaseReference; + + /// 0 pending, 1 in-flight, 2 confirmed, 3 paused, 4 quarantined, + /// 5 unknown outcome. These values are stable persisted state codes. + @Index() + int state; + + int attemptCount; + + @Index() + int nextEligibleAtMs; + + String? lastErrorCategory; + String? serverRecordIdHash; + String? leaseIdHash; + int leaseExpiresAtMs; + int confirmedAtMs; + int createdAtMs; + int updatedAtMs; + + CloudOutboxOperationEntity({ + this.id = 0, + required this.operationId, + required this.scopeKey, + required this.accountFingerprint, + required this.zone, + required this.logicalEntityKeyHash, + required this.action, + this.dependencyOperationIdsJson = '[]', + this.payloadVersion = 1, + required this.mutationRevision, + this.checkpointGeneration = 0, + this.appleRequestUuid, + this.appleOperationUuid, + this.encryptedPayloadRef, + this.payloadSha256, + this.protectedLeaseReference, + this.state = 0, + this.attemptCount = 0, + this.nextEligibleAtMs = 0, + this.lastErrorCategory, + this.serverRecordIdHash, + this.leaseIdHash, + this.leaseExpiresAtMs = 0, + this.confirmedAtMs = 0, + required this.createdAtMs, + required this.updatedAtMs, + }); +} + +@Entity() +class CloudRecordMapEntity { + int id; + + /// SHA-256 over account, zone and logical entity key. + @Index(type: IndexType.hash64) + @Unique() + String mapKey; + + @Index(type: IndexType.hash64) + String scopeKey; + + @Index(type: IndexType.hash64) + String accountFingerprint; + + @Index(type: IndexType.hash64) + String zone; + + @Index(type: IndexType.hash64) + String logicalEntityKeyHash; + + @Index(type: IndexType.hash64) + String serverRecordIdHash; + + /// Checkpoint generation that proved this server identity. + /// Existing rows deserialize as zero and are ignored until reproven. + int generation; + + /// Application-encrypted Apple record ID and last-known raw record reference. + String encryptedServerRecordId; + String? etagHash; + String? encryptedRawRecordRef; + int updatedAtMs; + + CloudRecordMapEntity({ + this.id = 0, + required this.mapKey, + required this.scopeKey, + required this.accountFingerprint, + required this.zone, + required this.logicalEntityKeyHash, + required this.serverRecordIdHash, + this.generation = 0, + required this.encryptedServerRecordId, + this.etagHash, + this.encryptedRawRecordRef, + required this.updatedAtMs, + }); +} + +@Entity() +class CloudSyncRunEntity { + int id; + + @Index(type: IndexType.hash64) + @Unique() + String runId; + + @Index(type: IndexType.hash64) + String scopeKey; + + @Index(type: IndexType.hash64) + String accountFingerprint; + + String trigger; + String architecture; + String mode; + int fetchedCount; + int appliedCount; + int deferredCount; + int quarantinedCount; + int confirmedCount; + int retriedCount; + int startedAtMs; + int finishedAtMs; + String? failureCategory; + + CloudSyncRunEntity({ + this.id = 0, + required this.runId, + required this.scopeKey, + required this.accountFingerprint, + required this.trigger, + required this.architecture, + required this.mode, + this.fetchedCount = 0, + this.appliedCount = 0, + this.deferredCount = 0, + this.quarantinedCount = 0, + this.confirmedCount = 0, + this.retriedCount = 0, + required this.startedAtMs, + this.finishedAtMs = 0, + this.failureCategory, + }); +} + +@Entity() +class CloudAttachmentMaterializationEntity { + int id; + + /// SHA-256 over the complete account scope and native-keyed logical entity + /// identity. It is an equality key, never an Apple record identifier. + @Index(type: IndexType.hash64) + @Unique() + String transferKey; + + @Index(type: IndexType.hash64) + String scopeKey; + + @Index(type: IndexType.hash64) + String accountFingerprint; + + @Index(type: IndexType.hash64) + String zone; + + int generation; + + @Index(type: IndexType.hash64) + String logicalEntityKeyHash; + + int expectedBytes; + String expectedIntegrityTagHash; + + /// See CloudAttachmentMaterializationStage. Stored as a monotonic ordinal. + @Index() + int stage; + + int verifiedBytes; + + /// Application-protected references only. Raw paths, MMCS credentials, and + /// signatures must never be placed in these fields. + String? protectedTempReference; + String? protectedResumeManifestReference; + String? protectedContentVerificationReference; + String? protectedFinalReference; + int updatedAtMs; + + CloudAttachmentMaterializationEntity({ + this.id = 0, + required this.transferKey, + required this.scopeKey, + required this.accountFingerprint, + required this.zone, + required this.generation, + required this.logicalEntityKeyHash, + required this.expectedBytes, + required this.expectedIntegrityTagHash, + required this.stage, + required this.verifiedBytes, + this.protectedTempReference, + this.protectedResumeManifestReference, + this.protectedContentVerificationReference, + this.protectedFinalReference, + required this.updatedAtMs, + }); +} + +/// Content-free merge metadata for one canonical semantic entity. +/// +/// Every identifier is already a one-way digest. Message bodies, handles, +/// filenames, raw Apple identifiers, credentials, and local paths are not +/// valid fields on this entity. +@Entity() +class CloudSemanticSnapshotEntity { + int id; + + /// Composite of the scope-generation digest, entity kind, and logical key + /// hash. It contains no raw account or entity identifier. + @Index(type: IndexType.hash64) + @Unique() + String snapshotKey; + + @Index(type: IndexType.hash64) + String scopeGenerationKey; + + @Index(type: IndexType.hash64) + String scopeKey; + + @Index(type: IndexType.hash64) + String accountFingerprint; + + String container; + String database; + + @Index(type: IndexType.hash64) + String zone; + + String streamKind; + int schemaVersion; + int generation; + String entityKind; + + @Index(type: IndexType.hash64) + String logicalEntityKeyHash; + + String? parentLogicalKeyHash; + String? immutableContentDigest; + int createdAtMs; + int readAtMs; + int deliveredAtMs; + + /// Deterministic JSON containing only hashed part keys/content, revisions, + /// and millisecond timestamps. + String editPartsJson; + + int retractedAtMs; + int? groupVersion; + String? groupMetadataDigest; + String? etagHash; + int updatedAtMs; + + CloudSemanticSnapshotEntity({ + this.id = 0, + required this.snapshotKey, + required this.scopeGenerationKey, + required this.scopeKey, + required this.accountFingerprint, + required this.container, + required this.database, + required this.zone, + required this.streamKind, + required this.schemaVersion, + required this.generation, + required this.entityKind, + required this.logicalEntityKeyHash, + this.parentLogicalKeyHash, + this.immutableContentDigest, + this.createdAtMs = -1, + this.readAtMs = -1, + this.deliveredAtMs = -1, + this.editPartsJson = '[]', + this.retractedAtMs = -1, + this.groupVersion, + this.groupMetadataDigest, + this.etagHash, + required this.updatedAtMs, + }); +} + +/// Durable replay, quarantine, and conflict state for one decoded change. +/// +/// The change identity is re-digested with the complete account scope and +/// generation before persistence. Diagnostic fields accept safe codes only. +@Entity() +class CloudSemanticReplayEntity { + int id; + + @Index(type: IndexType.hash64) + @Unique() + String replayKey; + + @Index(type: IndexType.hash64) + String scopeGenerationKey; + + @Index(type: IndexType.hash64) + String scopeKey; + + @Index(type: IndexType.hash64) + String accountFingerprint; + + String container; + String database; + + @Index(type: IndexType.hash64) + String zone; + + String streamKind; + int schemaVersion; + int generation; + + @Index(type: IndexType.hash64) + String changeIdHash; + + @Index(type: IndexType.hash64) + String serverRecordIdHash; + + @Index(type: IndexType.hash64) + String? logicalEntityKeyHash; + + String? payloadSha256; + String? protectedPayloadReferenceHash; + int inboxSequence; + String changeType; + + /// One legal terminal state: applied, appliedWithConflict, or quarantined. + /// + /// A pending semantic attempt is never persisted. Keeping one closed + /// outcome prevents contradictory applied/quarantined/conflicted flags. + @Index(type: IndexType.hash64) + String terminalOutcome; + String? terminalSafeCode; + int updatedAtMs; + + CloudSemanticReplayEntity({ + this.id = 0, + required this.replayKey, + required this.scopeGenerationKey, + required this.scopeKey, + required this.accountFingerprint, + required this.container, + required this.database, + required this.zone, + required this.streamKind, + required this.schemaVersion, + required this.generation, + required this.changeIdHash, + required this.serverRecordIdHash, + this.logicalEntityKeyHash, + this.payloadSha256, + this.protectedPayloadReferenceHash, + required this.inboxSequence, + required this.changeType, + required this.terminalOutcome, + this.terminalSafeCode, + required this.updatedAtMs, + }); +} + +/// Durable single-writer authority for one Apple account/container/database. +/// +/// The account value is an application-scoped one-way fingerprint. Owner, +/// state, and targetOwner use stable integer encodings validated by the +/// authority adapter before any permit is issued. +@Entity() +class CloudKitWriterAuthorityEntity { + int id; + + @Index(type: IndexType.hash64) + @Unique() + String authorityKey; + + @Index(type: IndexType.hash64) + String accountFingerprint; + + String container; + String database; + int owner; + int state; + int targetOwner; + int epoch; + String? transitionIdHash; + String? resetScopeKeyHash; + String? resetProofReferenceHash; + int resetGeneration; + int updatedAtMs; + + CloudKitWriterAuthorityEntity({ + this.id = 0, + required this.authorityKey, + required this.accountFingerprint, + required this.container, + required this.database, + this.owner = 0, + this.state = 0, + this.targetOwner = 0, + this.epoch = 1, + this.transitionIdHash, + this.resetScopeKeyHash, + this.resetProofReferenceHash, + this.resetGeneration = 0, + required this.updatedAtMs, + }); +} + +/// One legacy CloudKit deletion target admitted under a complete writer scope. +/// +/// The raw record ID is retained because the legacy Rust API requires it to +/// issue a delete. It is never selected for a remote call unless the supplied +/// scope and writer epoch still match the durable legacy authority. +@Entity() +class CloudKitDeletionIntentEntity { + int id; + + @Index(type: IndexType.hash64) + @Unique() + String intentKey; + + @Index(type: IndexType.hash64) + String accountFingerprint; + + String container; + String database; + int writerEpoch; + int kind; + String recordId; + + /// 0 pending, 1 quarantined. Values are stable persisted state codes. + @Index() + int state; + + String? quarantineReason; + int createdAtMs; + int updatedAtMs; + + CloudKitDeletionIntentEntity({ + this.id = 0, + required this.intentKey, + required this.accountFingerprint, + required this.container, + required this.database, + required this.writerEpoch, + required this.kind, + required this.recordId, + this.state = 0, + this.quarantineReason, + required this.createdAtMs, + required this.updatedAtMs, + }); +} + +/// Durable evidence for a pre-V2 SharedPreferences deletion value. +/// +/// These rows intentionally have no CloudKit scope. They are evidence only, +/// and the deletion-intent store never includes them in a remote batch. +@Entity() +class CloudKitDeletionQuarantineEntity { + int id; + + @Index(type: IndexType.hash64) + @Unique() + String quarantineKey; + + String sourceKey; + String recordId; + String reason; + int createdAtMs; + + CloudKitDeletionQuarantineEntity({ + this.id = 0, + required this.quarantineKey, + required this.sourceKey, + required this.recordId, + required this.reason, + required this.createdAtMs, + }); +} diff --git a/lib/database/io/message.dart b/lib/database/io/message.dart index 14bb87bfdc..51a9f676fc 100644 --- a/lib/database/io/message.dart +++ b/lib/database/io/message.dart @@ -4,6 +4,8 @@ import 'dart:io'; import 'dart:math'; import 'package:async_task/async_task.dart'; +import 'package:bluebubbles/services/rustpush/cloud_sync/cloud_sync.dart'; +import 'package:bluebubbles/utils/attachment_guid_utils.dart'; import 'package:bluebubbles/utils/logger/logger.dart'; import 'package:bluebubbles/services/network/backend_service.dart'; import 'package:bluebubbles/services/rustpush/rustpush_service.dart'; @@ -61,6 +63,65 @@ const IS_PENDING_SATELLITE_SEND = 1 << 41; const NEEDS_RELAY = 1 << 42; const SENT_OR_RECEIVED_OFF_GRID = 1 << 43; +enum CloudAssociationImportFailure { + unknownType, + missingParent, + malformedParent, +} + +final class CloudAssociationImportException implements Exception { + const CloudAssociationImportException(this.failure); + + final CloudAssociationImportFailure failure; + + @override + String toString() => 'CloudAssociationImportException($failure)'; +} + +final class CloudAssociationImport { + const CloudAssociationImport({ + required this.type, + required this.parent, + }); + + final String type; + final CloudAssociatedMessageParentReference parent; +} + +CloudAssociationImport? parseCloudAssociation({ + required int? associatedMessageType, + required String? associatedMessageGuid, +}) { + if (associatedMessageType == null) return null; + + final type = associatedMessageType == 2 + ? 'sticker' + : ReactionTypes.fromAssociatedMessageType(associatedMessageType); + if (type == null) { + throw const CloudAssociationImportException( + CloudAssociationImportFailure.unknownType, + ); + } + if (associatedMessageGuid == null) { + throw const CloudAssociationImportException( + CloudAssociationImportFailure.missingParent, + ); + } + + try { + return CloudAssociationImport( + type: type, + parent: CloudAssociatedMessageParentReference.parse( + associatedMessageGuid, + ), + ); + } on CloudAssociatedMessageParentReferenceFormatException { + throw const CloudAssociationImportException( + CloudAssociationImportFailure.malformedParent, + ); + } +} + /// Async method to fetch attachments class GetMessageAttachments extends AsyncTask, Map>> { final List stuff; @@ -757,7 +818,12 @@ class Message { /// Save a single message - prefer [bulkSave] for multiple messages rather /// than iterating through them - Message save({Chat? chat, bool updateIsBookmarked = false, bool updateSendingServiceId = false}) { + Message save({ + Chat? chat, + bool updateIsBookmarked = false, + bool updateSendingServiceId = false, + bool throwOnUniqueViolation = false, + }) { if (kIsWeb || temp) return this; Database.runInTransaction(TxMode.write, () { Message? existing = Message.findOne(guid: guid); @@ -801,7 +867,16 @@ class Message { try { if (chat != null) this.chat.target = chat; id = Database.messages.put(this); - } on UniqueViolationException catch (_) {} + } on UniqueViolationException catch (ex, stack) { + // Still swallowed, because callers rely on save() not throwing. But no + // longer silent: on this path `id` stays null and the message is + // returned as though it had been persisted, so nothing downstream can + // distinguish a saved message from a dropped one. replaceMessage + // already logs this exact constraint below; these two sites did not. + Logger.error('Failed to save message! This is likely due to a unique constraint being violated.', + error: ex, trace: stack); + if (throwOnUniqueViolation) rethrow; + } }); return this; } @@ -867,7 +942,13 @@ class Message { for (int i = 0; i < messages.length; i++) { messages[i].id = ids[i]; } - } on UniqueViolationException catch (_) {} + } on UniqueViolationException catch (ex, stack) { + // The reaction-linking pass above did not persist. The ids assigned by + // the earlier putMany still stand, so this is narrower than the save() + // case, but it is the same invisible failure and worth seeing. + Logger.error('Failed to bulk save messages! This is likely due to a unique constraint being violated.', + error: ex, trace: stack); + } }); return messages; } @@ -948,19 +1029,10 @@ class Message { }); } - String convertAttachmentGuid(String guid) { - if (guid.startsWith("at")) { - var items = guid.split("_"); - guid = "${items[2]}_${items[1]}"; - } - return guid; - } + String convertAttachmentGuid(String guid) => convertAppleAttachmentGuid(guid); - String unconvertAttachmentGuid(String guid) { - var items = guid.split("_"); - if (items.length == 1) return guid; - return "at_${items[1]}_${items[0]}"; - } + String unconvertAttachmentGuid(String guid) => + unconvertAppleAttachmentGuid(guid); Uint8List? encodeAttributedBody(List body, bool noAttachments) { if (body.isEmpty) return null; @@ -1077,7 +1149,15 @@ class Message { dateDelivered: dateDelivered != null ? RustPushBBUtils.nsSinceAppleEpoch(dateDelivered!) : 0, unk14: 0, associatedMessageType: amt, - associatedMessageGuid: associatedMessageGuid != null ? "p:$associatedMessagePart/$associatedMessageGuid" : null, + // Emit the bare GUID when there is no part. Interpolating a null part + // produced the literal "p:null/", which Apple never sends and + // which both of this app's parsers reject, so a round trip through the + // uploader could not be read back. + associatedMessageGuid: associatedMessageGuid == null + ? null + : (associatedMessagePart == null + ? associatedMessageGuid + : "p:$associatedMessagePart/$associatedMessageGuid"), associatedMessageRangeLength: associatedMessagePart != null ? Message.findOne(guid: associatedMessageGuid!)?.attributedBody[0].runs.firstWhere((r) => r.attributes!.messagePart == associatedMessagePart).range[1] : null, associatedMessageRangeLocation: associatedMessagePart != null ? Message.findOne(guid: associatedMessageGuid!)?.attributedBody[0].runs.firstWhere((r) => r.attributes!.messagePart == associatedMessagePart).range[0] : null )), @@ -1104,7 +1184,7 @@ class Message { ); } - void applyFromCloud(api.CloudMessage c, String cloudkitId) { + bool applyFromCloud(api.CloudMessage c, String cloudkitId) { Chat? chat; if (c.chatId.contains(";")) { final query = Database.chats.query(Chat_.chatIdentifier.equals(c.chatId.split(";")[2])).build(); @@ -1118,9 +1198,12 @@ class Message { chat ??= Chat.findByRustGuid(c.chatId); } - if (chat?.isRpSms ?? true) return; + if (chat == null || chat.isRpSms) { + throw StateError('Cloud message has no eligible local iMessage chat'); + } ckRecordId = cloudkitId; + ckSyncState = true; error = c.error; handle = RustPushBBUtils.rustHandleToBB(c.sender); @@ -1163,17 +1246,20 @@ class Message { expressiveSendStyleId = proto1.effect; dateRead = proto1.dateRead == null || proto1.dateRead == 0 ? null : RustPushBBUtils.fromNsSinceAppleEpoch(proto1.dateRead!); dateDelivered = proto1.dateDelivered == null || proto1.dateDelivered == 0 ? null : RustPushBBUtils.fromNsSinceAppleEpoch(proto1.dateDelivered!); - if (proto1.associatedMessageType != null) { - if (proto1.associatedMessageType == 2) { - associatedMessageType = "sticker"; - } else if (proto1.associatedMessageType! >= 2000 && proto1.associatedMessageType! < 3000) { - associatedMessageType = ReactionTypes.toList()[proto1.associatedMessageType! - 2000]; - } else if (proto1.associatedMessageType! >= 3000 && proto1.associatedMessageType! < 4000) { - associatedMessageType = "-${ReactionTypes.toList()[proto1.associatedMessageType! - 3000]}"; - } - } - associatedMessageGuid = proto1.associatedMessageGuid; - associatedMessagePart = attributedBody.firstOrNull?.runs.firstWhereOrNull((b) => b.range[0] == proto1.associatedMessageRangeLocation && b.range[1] == proto1.associatedMessageRangeLength)?.attributes?.messagePart; + final association = parseCloudAssociation( + associatedMessageType: proto1.associatedMessageType, + associatedMessageGuid: proto1.associatedMessageGuid, + ); + associatedMessageType = association?.type; + // Apple sends the parent as `p:/`, or as a bare GUID when the + // reaction targets no particular part. This previously stored that value + // verbatim, so a wrapped parent never matched Message_.guid and every + // CloudKit reaction stayed orphaned from its parent. The part was also + // derived from the reaction's own attributed body, which the canonical + // mapping explicitly forbids: the associated range is validation evidence, + // not the source of the part. + associatedMessageGuid = association?.parent.localMessageGuid; + associatedMessagePart = association?.parent.part; guid = c.guid; var bits = c.flags.bits(); isFromMe = (bits & IS_FROM_ME) != 0; @@ -1192,7 +1278,8 @@ class Message { associatedMessageEmoji = proto4.associatedMessageEmoji; } - save(chat: chat); + save(chat: chat, throwOnUniqueViolation: true); + return true; } /// Fetch reactions @@ -1253,19 +1340,26 @@ class Message { /// Delete a message and remove all instances of that message in the DB static void delete(String guid) { if (kIsWeb) return; + String? cloudRecordId; Database.runInTransaction(TxMode.write, () { final query = Database.messages.query(Message_.guid.equals(guid)).build(); final result = query.findFirst(); query.close(); if (result?.id != null) { if (result?.ckRecordId != null && !pushService.syncStopDelete) { - var list = ss.prefs.getStringList("messageDeletionIds-1") ?? []; - list.add(result!.ckRecordId!); - ss.prefs.setStringList("messageDeletionIds-1", list); + cloudRecordId = result!.ckRecordId; } Database.messages.remove(result!.id!); } }); + if (cloudRecordId != null) { + unawaited( + pushService.queueLegacyCloudKitDeletion( + kind: LegacyCloudKitDeletionKind.message, + recordId: cloudRecordId!, + ), + ); + } } static void softDelete(String guid) async { diff --git a/lib/database/models.dart b/lib/database/models.dart index c45d0a616f..b802023275 100644 --- a/lib/database/models.dart +++ b/lib/database/models.dart @@ -1,13 +1,13 @@ export 'package:bluebubbles/database/io/attachment.dart' if (dart.library.html) 'package:bluebubbles/models/html/attachment.dart'; -export 'package:bluebubbles/database/io/chat.dart' - if (dart.library.html) 'package:bluebubbles/models/html/chat.dart'; +export 'package:bluebubbles/database/io/chat.dart' if (dart.library.html) 'package:bluebubbles/models/html/chat.dart'; +export 'package:bluebubbles/database/io/cloud_sync_records.dart' + if (dart.library.html) 'package:bluebubbles/database/html/cloud_sync_records.dart'; export 'package:bluebubbles/database/io/contact.dart' - if (dart.library.html) 'package:bluebubbles/models/html/contact.dart'; -export 'package:media_kit/media_kit.dart' - if (dart.library.html) 'package:bluebubbles/models/html/media_kit.dart'; + if (dart.library.html) 'package:bluebubbles/models/html/contact.dart'; +export 'package:media_kit/media_kit.dart' if (dart.library.html) 'package:bluebubbles/models/html/media_kit.dart'; export 'package:media_kit_video/media_kit_video.dart' - if (dart.library.html) 'package:bluebubbles/models/html/media_kit.dart'; + if (dart.library.html) 'package:bluebubbles/models/html/media_kit.dart'; export 'package:bluebubbles/database/io/fcm_data.dart' if (dart.library.html) 'package:bluebubbles/models/html/fcm_data.dart'; export 'package:bluebubbles/database/io/handle.dart' @@ -16,16 +16,14 @@ export 'package:bluebubbles/database/io/launch_at_startup.dart' if (dart.library.html) 'package:bluebubbles/models/html/launch_at_startup.dart'; export 'package:bluebubbles/database/io/message.dart' if (dart.library.html) 'package:bluebubbles/models/html/message.dart'; -export 'package:bluebubbles/objectbox.g.dart' - if (dart.library.html) 'package:bluebubbles/models/html/objectbox.dart' hide Version; -export 'package:bluebubbles/database/io/theme.dart' - if (dart.library.html) 'package:bluebubbles/models/html/theme.dart'; +export 'package:bluebubbles/objectbox.g.dart' if (dart.library.html) 'package:bluebubbles/models/html/objectbox.dart' + hide Version; +export 'package:bluebubbles/database/io/theme.dart' if (dart.library.html) 'package:bluebubbles/models/html/theme.dart'; export 'package:bluebubbles/database/io/theme_entry.dart' - if (dart.library.html) 'package:bluebubbles/models/html/theme_entry.dart'; + if (dart.library.html) 'package:bluebubbles/models/html/theme_entry.dart'; export 'package:bluebubbles/database/io/theme_object.dart' - if (dart.library.html) 'package:bluebubbles/models/html/theme_object.dart'; -export 'package:bluebubbles/database/io/giphy.dart' - if (dart.library.html) 'package:bluebubbles/models/html/giphy.dart'; + if (dart.library.html) 'package:bluebubbles/models/html/theme_object.dart'; +export 'package:bluebubbles/database/io/giphy.dart' if (dart.library.html) 'package:bluebubbles/models/html/giphy.dart'; export 'package:bluebubbles/database/global/platform_file.dart'; export 'package:bluebubbles/database/global/settings.dart'; export 'package:bluebubbles/database/global/attributed_body.dart'; @@ -33,6 +31,7 @@ export 'package:bluebubbles/database/global/structured_name.dart'; export 'package:bluebubbles/database/global/queue_items.dart'; export 'package:bluebubbles/database/global/async_image_input.dart'; export 'package:bluebubbles/database/global/chat_messages.dart'; +export 'package:bluebubbles/database/global/chat_media_page.dart'; export 'package:bluebubbles/database/global/apple_location.dart'; export 'package:bluebubbles/database/global/isolate.dart'; export 'package:bluebubbles/database/global/theme_colors.dart'; @@ -42,4 +41,4 @@ export 'package:bluebubbles/database/global/message_part.dart'; export 'package:bluebubbles/database/global/scheduled_message.dart'; export 'package:bluebubbles/database/global/findmy_device.dart'; export 'package:bluebubbles/database/global/findmy_friend.dart'; -export 'package:bluebubbles/database/global/server_payload.dart'; \ No newline at end of file +export 'package:bluebubbles/database/global/server_payload.dart'; diff --git a/lib/helpers/network/metadata_helper.dart b/lib/helpers/network/metadata_helper.dart index d9e895d9ce..7f8ee6d14e 100644 --- a/lib/helpers/network/metadata_helper.dart +++ b/lib/helpers/network/metadata_helper.dart @@ -21,22 +21,34 @@ class MetadataHelper { static final Map> _metaCache = {}; - static Future fetchMetadata(Message message) async { + /// Fetches link preview metadata for [previewUrl], falling back to the first + /// URL in the message when no URL is given. + /// + /// [previewUrl] exists because a message can carry more than one link. The + /// cache used to be keyed by message GUID alone and the URL was always + /// `message.url`, which is the *first* URL in the whole message text. A + /// message with three links therefore fetched the first link three times and + /// shared a single cache entry between all three previews, so the second and + /// third rendered as empty boxes. + static Future fetchMetadata(Message message, {String? previewUrl}) async { Metadata? data; + + // Get the URL + final url = _resolveUrl(previewUrl) ?? _resolveUrl(message.url); + if (url == null) return null; + + // Key on the message and the URL together. Keying on the message alone + // made every link in a multi-link message collide. + final cacheKey = "${message.guid}|$url"; + // If we have a cached item for this already, return that future - if (_metaCache.containsKey(message.guid)) { - return _metaCache[message.guid]!.future; + if (_metaCache.containsKey(cacheKey)) { + return _metaCache[cacheKey]!.future; } // Create a new completer for this request Completer completer = Completer(); - _metaCache[message.guid!] = completer; - - // Get the URL - String url = message.url!; - if (!url.startsWith("http")) { - url = "https://$url"; - } + _metaCache[cacheKey] = completer; try { data = await MetadataFetch.extract(url); } catch (ex, stack) { @@ -48,10 +60,22 @@ class MetadataHelper { data = await MetadataHelper._manuallyGetMetadata(url); } - // If the URL is supposedly to an actual image, set the image to the URL manually - RegExp exp = RegExp(r"(.png|.jpg|.gif|.tiff|.jpeg)$"); - if (data?.image == null && data?.title == null && data!.url != null && exp.hasMatch(data.url!)) { - data.image = data.url; + // If the URL points at an actual image, use it as the preview image. + // + // This used to test `data.url`, which is not assigned until the bottom of + // this method, so for a bare image link it was still null here and the + // check could never fire. A link straight to a .jpg has no HTML metadata + // to scrape, so this fallback is the only thing that gives it a preview, + // and it rendered as an empty card instead. + // + // The pattern is matched against the path so a query string does not + // defeat the anchor, and the dots are escaped: unescaped `.jpg` matches + // any character before "jpg". + final urlPath = Uri.tryParse(url)?.path ?? url; + final imageExtension = RegExp(r"\.(png|jpe?g|gif|tiff?|webp|heic|bmp)$", caseSensitive: false); + if (data?.image == null && data?.title == null && imageExtension.hasMatch(urlPath)) { + data ??= Metadata(); + data.image = url; data.title = "Image Preview"; } @@ -75,9 +99,7 @@ class MetadataHelper { // Delete from the cache after 15 seconds (arbitrary) Future.delayed(const Duration(seconds: 15), () { - if (_metaCache.containsKey(message.guid)) { - _metaCache.remove(message.guid); - } + _metaCache.remove(cacheKey); }); // Tell everyone that it's complete @@ -85,6 +107,22 @@ class MetadataHelper { return completer.future; } + static String? _resolveUrl(String? candidate) { + final value = candidate?.trim(); + if (value == null || value.isEmpty || value.contains(RegExp(r"\s")) || !value.hasUrl) { + return null; + } + + final parsed = Uri.tryParse(value); + final normalized = parsed?.hasScheme == true ? value : "https://$value"; + final normalizedUri = Uri.tryParse(normalized); + if (normalizedUri == null || normalizedUri.host.isEmpty || + !["http", "https"].contains(normalizedUri.scheme.toLowerCase())) { + return null; + } + return normalized; + } + /// Manually tries to parse out metadata from a given [url] static Future _manuallyGetMetadata(String url) async { Metadata meta = Metadata(); diff --git a/lib/helpers/types/constants.dart b/lib/helpers/types/constants.dart index 6e374265ba..f7c8d615d5 100644 --- a/lib/helpers/types/constants.dart +++ b/lib/helpers/types/constants.dart @@ -140,7 +140,9 @@ enum PlayerStatus { NONE, STOPPED, PAUSED, PLAYING, ENDED } enum PayloadType {url, app} final urlRegex = RegExp( - r"(?:^| )(((((H|h)(T|t)|(F|f))(T|t)(P|p)((S|s)?))\://)|www.)[a-zA-Z0-9\-\.]+\.[a-zA-Z]{2,6}(\:[0-9]{1,5})*(/($|[a-zA-Z0-9\.\,\;\?\'\\\+&%\$#@!^*()\=~_\/-]+))*"); + r"(?:(?:https?|ftp)://|www\.)[-a-zA-Z0-9@:%._+~#=]{1,256}\.[a-zA-Z0-9()]{1,63}([-a-zA-Z0-9/()@:%_.+~#?&=*\[\]!$';,]*)\b", + caseSensitive: false, +); final RegExp emojiRegex = RegExp(r"[#*0-9]\uFE0F?\u20E3|[\xA9\xAE\u203C\u2049\u2122\u2139\u2194-\u2199\u21A9\u21AA\u231A\u231B\u2328\u23CF\u23ED-\u23EF\u23F1\u23F2\u23F8-\u23FA\u24C2\u25AA\u25AB\u25B6\u25C0\u25FB\u25FC\u25FE\u2600-\u2604\u260E\u2611\u2614\u2615\u2618\u2620\u2622\u2623\u2626\u262A\u262E\u262F\u2638-\u263A\u2640\u2642\u2648-\u2653\u265F\u2660\u2663\u2665\u2666\u2668\u267B\u267E\u267F\u2692\u2694-\u2697\u2699\u269B\u269C\u26A0\u26A7\u26AA\u26B0\u26B1\u26BD\u26BE\u26C4\u26C8\u26CF\u26D1\u26E9\u26F0-\u26F5\u26F7\u26F8\u26FA\u2702\u2708\u2709\u270F\u2712\u2714\u2716\u271D\u2721\u2733\u2734\u2744\u2747\u2757\u2763\u27A1\u2934\u2935\u2B05-\u2B07\u2B1B\u2B1C\u2B55\u3030\u303D\u3297\u3299]\uFE0F?|[\u261D\u270C\u270D](?:\uFE0F|\uD83C[\uDFFB-\uDFFF])?|[\u270A\u270B](?:\uD83C[\uDFFB-\uDFFF])?|[\u23E9-\u23EC\u23F0\u23F3\u25FD\u2693\u26A1\u26AB\u26C5\u26CE\u26D4\u26EA\u26FD\u2705\u2728\u274C\u274E\u2753-\u2755\u2795-\u2797\u27B0\u27BF\u2B50]|\u26D3\uFE0F?(?:\u200D\uD83D\uDCA5)?|\u26F9(?:\uFE0F|\uD83C[\uDFFB-\uDFFF])?(?:\u200D[\u2640\u2642]\uFE0F?)?|\u2764\uFE0F?(?:\u200D(?:\uD83D\uDD25|\uD83E\uDE79))?|\uD83C(?:[\uDC04\uDD70\uDD71\uDD7E\uDD7F\uDE02\uDE37\uDF21\uDF24-\uDF2C\uDF36\uDF7D\uDF96\uDF97\uDF99-\uDF9B\uDF9E\uDF9F\uDFCD\uDFCE\uDFD4-\uDFDF\uDFF5\uDFF7]\uFE0F?|[\uDF85\uDFC2\uDFC7](?:\uD83C[\uDFFB-\uDFFF])?|[\uDFC4\uDFCA](?:\uD83C[\uDFFB-\uDFFF])?(?:\u200D[\u2640\u2642]\uFE0F?)?|[\uDFCB\uDFCC](?:\uFE0F|\uD83C[\uDFFB-\uDFFF])?(?:\u200D[\u2640\u2642]\uFE0F?)?|[\uDCCF\uDD8E\uDD91-\uDD9A\uDE01\uDE1A\uDE2F\uDE32-\uDE36\uDE38-\uDE3A\uDE50\uDE51\uDF00-\uDF20\uDF2D-\uDF35\uDF37-\uDF43\uDF45-\uDF4A\uDF4C-\uDF7C\uDF7E-\uDF84\uDF86-\uDF93\uDFA0-\uDFC1\uDFC5\uDFC6\uDFC8\uDFC9\uDFCF-\uDFD3\uDFE0-\uDFF0\uDFF8-\uDFFF]|\uDDE6\uD83C[\uDDE8-\uDDEC\uDDEE\uDDF1\uDDF2\uDDF4\uDDF6-\uDDFA\uDDFC\uDDFD\uDDFF]|\uDDE7\uD83C[\uDDE6\uDDE7\uDDE9-\uDDEF\uDDF1-\uDDF4\uDDF6-\uDDF9\uDDFB\uDDFC\uDDFE\uDDFF]|\uDDE8\uD83C[\uDDE6\uDDE8\uDDE9\uDDEB-\uDDEE\uDDF0-\uDDF5\uDDF7\uDDFA-\uDDFF]|\uDDE9\uD83C[\uDDEA\uDDEC\uDDEF\uDDF0\uDDF2\uDDF4\uDDFF]|\uDDEA\uD83C[\uDDE6\uDDE8\uDDEA\uDDEC\uDDED\uDDF7-\uDDFA]|\uDDEB\uD83C[\uDDEE-\uDDF0\uDDF2\uDDF4\uDDF7]|\uDDEC\uD83C[\uDDE6\uDDE7\uDDE9-\uDDEE\uDDF1-\uDDF3\uDDF5-\uDDFA\uDDFC\uDDFE]|\uDDED\uD83C[\uDDF0\uDDF2\uDDF3\uDDF7\uDDF9\uDDFA]|\uDDEE\uD83C[\uDDE8-\uDDEA\uDDF1-\uDDF4\uDDF6-\uDDF9]|\uDDEF\uD83C[\uDDEA\uDDF2\uDDF4\uDDF5]|\uDDF0\uD83C[\uDDEA\uDDEC-\uDDEE\uDDF2\uDDF3\uDDF5\uDDF7\uDDFC\uDDFE\uDDFF]|\uDDF1\uD83C[\uDDE6-\uDDE8\uDDEE\uDDF0\uDDF7-\uDDFB\uDDFE]|\uDDF2\uD83C[\uDDE6\uDDE8-\uDDED\uDDF0-\uDDFF]|\uDDF3\uD83C[\uDDE6\uDDE8\uDDEA-\uDDEC\uDDEE\uDDF1\uDDF4\uDDF5\uDDF7\uDDFA\uDDFF]|\uDDF4\uD83C\uDDF2|\uDDF5\uD83C[\uDDE6\uDDEA-\uDDED\uDDF0-\uDDF3\uDDF7-\uDDF9\uDDFC\uDDFE]|\uDDF6\uD83C\uDDE6|\uDDF7\uD83C[\uDDEA\uDDF4\uDDF8\uDDFA\uDDFC]|\uDDF8\uD83C[\uDDE6-\uDDEA\uDDEC-\uDDF4\uDDF7-\uDDF9\uDDFB\uDDFD-\uDDFF]|\uDDF9\uD83C[\uDDE6\uDDE8\uDDE9\uDDEB-\uDDED\uDDEF-\uDDF4\uDDF7\uDDF9\uDDFB\uDDFC\uDDFF]|\uDDFA\uD83C[\uDDE6\uDDEC\uDDF2\uDDF3\uDDF8\uDDFE\uDDFF]|\uDDFB\uD83C[\uDDE6\uDDE8\uDDEA\uDDEC\uDDEE\uDDF3\uDDFA]|\uDDFC\uD83C[\uDDEB\uDDF8]|\uDDFD\uD83C\uDDF0|\uDDFE\uD83C[\uDDEA\uDDF9]|\uDDFF\uD83C[\uDDE6\uDDF2\uDDFC]|\uDF44(?:\u200D\uD83D\uDFEB)?|\uDF4B(?:\u200D\uD83D\uDFE9)?|\uDFC3(?:\uD83C[\uDFFB-\uDFFF])?(?:\u200D(?:[\u2640\u2642]\uFE0F?(?:\u200D\u27A1\uFE0F?)?|\u27A1\uFE0F?))?|\uDFF3\uFE0F?(?:\u200D(?:\u26A7\uFE0F?|\uD83C\uDF08))?|\uDFF4(?:\u200D\u2620\uFE0F?|\uDB40\uDC67\uDB40\uDC62\uDB40(?:\uDC65\uDB40\uDC6E\uDB40\uDC67|\uDC73\uDB40\uDC63\uDB40\uDC74|\uDC77\uDB40\uDC6C\uDB40\uDC73)\uDB40\uDC7F)?)|\uD83D(?:[\uDC3F\uDCFD\uDD49\uDD4A\uDD6F\uDD70\uDD73\uDD76-\uDD79\uDD87\uDD8A-\uDD8D\uDDA5\uDDA8\uDDB1\uDDB2\uDDBC\uDDC2-\uDDC4\uDDD1-\uDDD3\uDDDC-\uDDDE\uDDE1\uDDE3\uDDE8\uDDEF\uDDF3\uDDFA\uDECB\uDECD-\uDECF\uDEE0-\uDEE5\uDEE9\uDEF0\uDEF3]\uFE0F?|[\uDC42\uDC43\uDC46-\uDC50\uDC66\uDC67\uDC6B-\uDC6D\uDC72\uDC74-\uDC76\uDC78\uDC7C\uDC83\uDC85\uDC8F\uDC91\uDCAA\uDD7A\uDD95\uDD96\uDE4C\uDE4F\uDEC0\uDECC](?:\uD83C[\uDFFB-\uDFFF])?|[\uDC6E\uDC70\uDC71\uDC73\uDC77\uDC81\uDC82\uDC86\uDC87\uDE45-\uDE47\uDE4B\uDE4D\uDE4E\uDEA3\uDEB4\uDEB5](?:\uD83C[\uDFFB-\uDFFF])?(?:\u200D[\u2640\u2642]\uFE0F?)?|[\uDD74\uDD90](?:\uFE0F|\uD83C[\uDFFB-\uDFFF])?|[\uDC00-\uDC07\uDC09-\uDC14\uDC16-\uDC25\uDC27-\uDC3A\uDC3C-\uDC3E\uDC40\uDC44\uDC45\uDC51-\uDC65\uDC6A\uDC79-\uDC7B\uDC7D-\uDC80\uDC84\uDC88-\uDC8E\uDC90\uDC92-\uDCA9\uDCAB-\uDCFC\uDCFF-\uDD3D\uDD4B-\uDD4E\uDD50-\uDD67\uDDA4\uDDFB-\uDE2D\uDE2F-\uDE34\uDE37-\uDE41\uDE43\uDE44\uDE48-\uDE4A\uDE80-\uDEA2\uDEA4-\uDEB3\uDEB7-\uDEBF\uDEC1-\uDEC5\uDED0-\uDED2\uDED5-\uDED7\uDEDC-\uDEDF\uDEEB\uDEEC\uDEF4-\uDEFC\uDFE0-\uDFEB\uDFF0]|\uDC08(?:\u200D\u2B1B)?|\uDC15(?:\u200D\uD83E\uDDBA)?|\uDC26(?:\u200D(?:\u2B1B|\uD83D\uDD25))?|\uDC3B(?:\u200D\u2744\uFE0F?)?|\uDC41\uFE0F?(?:\u200D\uD83D\uDDE8\uFE0F?)?|\uDC68(?:\u200D(?:[\u2695\u2696\u2708]\uFE0F?|\u2764\uFE0F?\u200D\uD83D(?:\uDC8B\u200D\uD83D)?\uDC68|\uD83C[\uDF3E\uDF73\uDF7C\uDF93\uDFA4\uDFA8\uDFEB\uDFED]|\uD83D(?:[\uDC68\uDC69]\u200D\uD83D(?:\uDC66(?:\u200D\uD83D\uDC66)?|\uDC67(?:\u200D\uD83D[\uDC66\uDC67])?)|[\uDCBB\uDCBC\uDD27\uDD2C\uDE80\uDE92]|\uDC66(?:\u200D\uD83D\uDC66)?|\uDC67(?:\u200D\uD83D[\uDC66\uDC67])?)|\uD83E(?:[\uDDAF\uDDBC\uDDBD](?:\u200D\u27A1\uFE0F?)?|[\uDDB0-\uDDB3]))|\uD83C(?:\uDFFB(?:\u200D(?:[\u2695\u2696\u2708]\uFE0F?|\u2764\uFE0F?\u200D\uD83D(?:\uDC8B\u200D\uD83D)?\uDC68\uD83C[\uDFFB-\uDFFF]|\uD83C[\uDF3E\uDF73\uDF7C\uDF93\uDFA4\uDFA8\uDFEB\uDFED]|\uD83D[\uDCBB\uDCBC\uDD27\uDD2C\uDE80\uDE92]|\uD83E(?:[\uDDAF\uDDBC\uDDBD](?:\u200D\u27A1\uFE0F?)?|[\uDDB0-\uDDB3]|\uDD1D\u200D\uD83D\uDC68\uD83C[\uDFFC-\uDFFF])))?|\uDFFC(?:\u200D(?:[\u2695\u2696\u2708]\uFE0F?|\u2764\uFE0F?\u200D\uD83D(?:\uDC8B\u200D\uD83D)?\uDC68\uD83C[\uDFFB-\uDFFF]|\uD83C[\uDF3E\uDF73\uDF7C\uDF93\uDFA4\uDFA8\uDFEB\uDFED]|\uD83D[\uDCBB\uDCBC\uDD27\uDD2C\uDE80\uDE92]|\uD83E(?:[\uDDAF\uDDBC\uDDBD](?:\u200D\u27A1\uFE0F?)?|[\uDDB0-\uDDB3]|\uDD1D\u200D\uD83D\uDC68\uD83C[\uDFFB\uDFFD-\uDFFF])))?|\uDFFD(?:\u200D(?:[\u2695\u2696\u2708]\uFE0F?|\u2764\uFE0F?\u200D\uD83D(?:\uDC8B\u200D\uD83D)?\uDC68\uD83C[\uDFFB-\uDFFF]|\uD83C[\uDF3E\uDF73\uDF7C\uDF93\uDFA4\uDFA8\uDFEB\uDFED]|\uD83D[\uDCBB\uDCBC\uDD27\uDD2C\uDE80\uDE92]|\uD83E(?:[\uDDAF\uDDBC\uDDBD](?:\u200D\u27A1\uFE0F?)?|[\uDDB0-\uDDB3]|\uDD1D\u200D\uD83D\uDC68\uD83C[\uDFFB\uDFFC\uDFFE\uDFFF])))?|\uDFFE(?:\u200D(?:[\u2695\u2696\u2708]\uFE0F?|\u2764\uFE0F?\u200D\uD83D(?:\uDC8B\u200D\uD83D)?\uDC68\uD83C[\uDFFB-\uDFFF]|\uD83C[\uDF3E\uDF73\uDF7C\uDF93\uDFA4\uDFA8\uDFEB\uDFED]|\uD83D[\uDCBB\uDCBC\uDD27\uDD2C\uDE80\uDE92]|\uD83E(?:[\uDDAF\uDDBC\uDDBD](?:\u200D\u27A1\uFE0F?)?|[\uDDB0-\uDDB3]|\uDD1D\u200D\uD83D\uDC68\uD83C[\uDFFB-\uDFFD\uDFFF])))?|\uDFFF(?:\u200D(?:[\u2695\u2696\u2708]\uFE0F?|\u2764\uFE0F?\u200D\uD83D(?:\uDC8B\u200D\uD83D)?\uDC68\uD83C[\uDFFB-\uDFFF]|\uD83C[\uDF3E\uDF73\uDF7C\uDF93\uDFA4\uDFA8\uDFEB\uDFED]|\uD83D[\uDCBB\uDCBC\uDD27\uDD2C\uDE80\uDE92]|\uD83E(?:[\uDDAF\uDDBC\uDDBD](?:\u200D\u27A1\uFE0F?)?|[\uDDB0-\uDDB3]|\uDD1D\u200D\uD83D\uDC68\uD83C[\uDFFB-\uDFFE])))?))?|\uDC69(?:\u200D(?:[\u2695\u2696\u2708]\uFE0F?|\u2764\uFE0F?\u200D\uD83D(?:\uDC8B\u200D\uD83D)?[\uDC68\uDC69]|\uD83C[\uDF3E\uDF73\uDF7C\uDF93\uDFA4\uDFA8\uDFEB\uDFED]|\uD83D(?:[\uDCBB\uDCBC\uDD27\uDD2C\uDE80\uDE92]|\uDC66(?:\u200D\uD83D\uDC66)?|\uDC67(?:\u200D\uD83D[\uDC66\uDC67])?|\uDC69\u200D\uD83D(?:\uDC66(?:\u200D\uD83D\uDC66)?|\uDC67(?:\u200D\uD83D[\uDC66\uDC67])?))|\uD83E(?:[\uDDAF\uDDBC\uDDBD](?:\u200D\u27A1\uFE0F?)?|[\uDDB0-\uDDB3]))|\uD83C(?:\uDFFB(?:\u200D(?:[\u2695\u2696\u2708]\uFE0F?|\u2764\uFE0F?\u200D\uD83D(?:[\uDC68\uDC69]|\uDC8B\u200D\uD83D[\uDC68\uDC69])\uD83C[\uDFFB-\uDFFF]|\uD83C[\uDF3E\uDF73\uDF7C\uDF93\uDFA4\uDFA8\uDFEB\uDFED]|\uD83D[\uDCBB\uDCBC\uDD27\uDD2C\uDE80\uDE92]|\uD83E(?:[\uDDAF\uDDBC\uDDBD](?:\u200D\u27A1\uFE0F?)?|[\uDDB0-\uDDB3]|\uDD1D\u200D\uD83D[\uDC68\uDC69]\uD83C[\uDFFC-\uDFFF])))?|\uDFFC(?:\u200D(?:[\u2695\u2696\u2708]\uFE0F?|\u2764\uFE0F?\u200D\uD83D(?:[\uDC68\uDC69]|\uDC8B\u200D\uD83D[\uDC68\uDC69])\uD83C[\uDFFB-\uDFFF]|\uD83C[\uDF3E\uDF73\uDF7C\uDF93\uDFA4\uDFA8\uDFEB\uDFED]|\uD83D[\uDCBB\uDCBC\uDD27\uDD2C\uDE80\uDE92]|\uD83E(?:[\uDDAF\uDDBC\uDDBD](?:\u200D\u27A1\uFE0F?)?|[\uDDB0-\uDDB3]|\uDD1D\u200D\uD83D[\uDC68\uDC69]\uD83C[\uDFFB\uDFFD-\uDFFF])))?|\uDFFD(?:\u200D(?:[\u2695\u2696\u2708]\uFE0F?|\u2764\uFE0F?\u200D\uD83D(?:[\uDC68\uDC69]|\uDC8B\u200D\uD83D[\uDC68\uDC69])\uD83C[\uDFFB-\uDFFF]|\uD83C[\uDF3E\uDF73\uDF7C\uDF93\uDFA4\uDFA8\uDFEB\uDFED]|\uD83D[\uDCBB\uDCBC\uDD27\uDD2C\uDE80\uDE92]|\uD83E(?:[\uDDAF\uDDBC\uDDBD](?:\u200D\u27A1\uFE0F?)?|[\uDDB0-\uDDB3]|\uDD1D\u200D\uD83D[\uDC68\uDC69]\uD83C[\uDFFB\uDFFC\uDFFE\uDFFF])))?|\uDFFE(?:\u200D(?:[\u2695\u2696\u2708]\uFE0F?|\u2764\uFE0F?\u200D\uD83D(?:[\uDC68\uDC69]|\uDC8B\u200D\uD83D[\uDC68\uDC69])\uD83C[\uDFFB-\uDFFF]|\uD83C[\uDF3E\uDF73\uDF7C\uDF93\uDFA4\uDFA8\uDFEB\uDFED]|\uD83D[\uDCBB\uDCBC\uDD27\uDD2C\uDE80\uDE92]|\uD83E(?:[\uDDAF\uDDBC\uDDBD](?:\u200D\u27A1\uFE0F?)?|[\uDDB0-\uDDB3]|\uDD1D\u200D\uD83D[\uDC68\uDC69]\uD83C[\uDFFB-\uDFFD\uDFFF])))?|\uDFFF(?:\u200D(?:[\u2695\u2696\u2708]\uFE0F?|\u2764\uFE0F?\u200D\uD83D(?:[\uDC68\uDC69]|\uDC8B\u200D\uD83D[\uDC68\uDC69])\uD83C[\uDFFB-\uDFFF]|\uD83C[\uDF3E\uDF73\uDF7C\uDF93\uDFA4\uDFA8\uDFEB\uDFED]|\uD83D[\uDCBB\uDCBC\uDD27\uDD2C\uDE80\uDE92]|\uD83E(?:[\uDDAF\uDDBC\uDDBD](?:\u200D\u27A1\uFE0F?)?|[\uDDB0-\uDDB3]|\uDD1D\u200D\uD83D[\uDC68\uDC69]\uD83C[\uDFFB-\uDFFE])))?))?|\uDC6F(?:\u200D[\u2640\u2642]\uFE0F?)?|\uDD75(?:\uFE0F|\uD83C[\uDFFB-\uDFFF])?(?:\u200D[\u2640\u2642]\uFE0F?)?|\uDE2E(?:\u200D\uD83D\uDCA8)?|\uDE35(?:\u200D\uD83D\uDCAB)?|\uDE36(?:\u200D\uD83C\uDF2B\uFE0F?)?|\uDE42(?:\u200D[\u2194\u2195]\uFE0F?)?|\uDEB6(?:\uD83C[\uDFFB-\uDFFF])?(?:\u200D(?:[\u2640\u2642]\uFE0F?(?:\u200D\u27A1\uFE0F?)?|\u27A1\uFE0F?))?)|\uD83E(?:[\uDD0C\uDD0F\uDD18-\uDD1F\uDD30-\uDD34\uDD36\uDD77\uDDB5\uDDB6\uDDBB\uDDD2\uDDD3\uDDD5\uDEC3-\uDEC5\uDEF0\uDEF2-\uDEF8](?:\uD83C[\uDFFB-\uDFFF])?|[\uDD26\uDD35\uDD37-\uDD39\uDD3D\uDD3E\uDDB8\uDDB9\uDDCD\uDDCF\uDDD4\uDDD6-\uDDDD](?:\uD83C[\uDFFB-\uDFFF])?(?:\u200D[\u2640\u2642]\uFE0F?)?|[\uDDDE\uDDDF](?:\u200D[\u2640\u2642]\uFE0F?)?|[\uDD0D\uDD0E\uDD10-\uDD17\uDD20-\uDD25\uDD27-\uDD2F\uDD3A\uDD3F-\uDD45\uDD47-\uDD76\uDD78-\uDDB4\uDDB7\uDDBA\uDDBC-\uDDCC\uDDD0\uDDE0-\uDDFF\uDE70-\uDE7C\uDE80-\uDE88\uDE90-\uDEBD\uDEBF-\uDEC2\uDECE-\uDEDB\uDEE0-\uDEE8]|\uDD3C(?:\u200D[\u2640\u2642]\uFE0F?|\uD83C[\uDFFB-\uDFFF])?|\uDDCE(?:\uD83C[\uDFFB-\uDFFF])?(?:\u200D(?:[\u2640\u2642]\uFE0F?(?:\u200D\u27A1\uFE0F?)?|\u27A1\uFE0F?))?|\uDDD1(?:\u200D(?:[\u2695\u2696\u2708]\uFE0F?|\uD83C[\uDF3E\uDF73\uDF7C\uDF84\uDF93\uDFA4\uDFA8\uDFEB\uDFED]|\uD83D[\uDCBB\uDCBC\uDD27\uDD2C\uDE80\uDE92]|\uD83E(?:[\uDDAF\uDDBC\uDDBD](?:\u200D\u27A1\uFE0F?)?|[\uDDB0-\uDDB3]|\uDD1D\u200D\uD83E\uDDD1|\uDDD1\u200D\uD83E\uDDD2(?:\u200D\uD83E\uDDD2)?|\uDDD2(?:\u200D\uD83E\uDDD2)?))|\uD83C(?:\uDFFB(?:\u200D(?:[\u2695\u2696\u2708]\uFE0F?|\u2764\uFE0F?\u200D(?:\uD83D\uDC8B\u200D)?\uD83E\uDDD1\uD83C[\uDFFC-\uDFFF]|\uD83C[\uDF3E\uDF73\uDF7C\uDF84\uDF93\uDFA4\uDFA8\uDFEB\uDFED]|\uD83D[\uDCBB\uDCBC\uDD27\uDD2C\uDE80\uDE92]|\uD83E(?:[\uDDAF\uDDBC\uDDBD](?:\u200D\u27A1\uFE0F?)?|[\uDDB0-\uDDB3]|\uDD1D\u200D\uD83E\uDDD1\uD83C[\uDFFB-\uDFFF])))?|\uDFFC(?:\u200D(?:[\u2695\u2696\u2708]\uFE0F?|\u2764\uFE0F?\u200D(?:\uD83D\uDC8B\u200D)?\uD83E\uDDD1\uD83C[\uDFFB\uDFFD-\uDFFF]|\uD83C[\uDF3E\uDF73\uDF7C\uDF84\uDF93\uDFA4\uDFA8\uDFEB\uDFED]|\uD83D[\uDCBB\uDCBC\uDD27\uDD2C\uDE80\uDE92]|\uD83E(?:[\uDDAF\uDDBC\uDDBD](?:\u200D\u27A1\uFE0F?)?|[\uDDB0-\uDDB3]|\uDD1D\u200D\uD83E\uDDD1\uD83C[\uDFFB-\uDFFF])))?|\uDFFD(?:\u200D(?:[\u2695\u2696\u2708]\uFE0F?|\u2764\uFE0F?\u200D(?:\uD83D\uDC8B\u200D)?\uD83E\uDDD1\uD83C[\uDFFB\uDFFC\uDFFE\uDFFF]|\uD83C[\uDF3E\uDF73\uDF7C\uDF84\uDF93\uDFA4\uDFA8\uDFEB\uDFED]|\uD83D[\uDCBB\uDCBC\uDD27\uDD2C\uDE80\uDE92]|\uD83E(?:[\uDDAF\uDDBC\uDDBD](?:\u200D\u27A1\uFE0F?)?|[\uDDB0-\uDDB3]|\uDD1D\u200D\uD83E\uDDD1\uD83C[\uDFFB-\uDFFF])))?|\uDFFE(?:\u200D(?:[\u2695\u2696\u2708]\uFE0F?|\u2764\uFE0F?\u200D(?:\uD83D\uDC8B\u200D)?\uD83E\uDDD1\uD83C[\uDFFB-\uDFFD\uDFFF]|\uD83C[\uDF3E\uDF73\uDF7C\uDF84\uDF93\uDFA4\uDFA8\uDFEB\uDFED]|\uD83D[\uDCBB\uDCBC\uDD27\uDD2C\uDE80\uDE92]|\uD83E(?:[\uDDAF\uDDBC\uDDBD](?:\u200D\u27A1\uFE0F?)?|[\uDDB0-\uDDB3]|\uDD1D\u200D\uD83E\uDDD1\uD83C[\uDFFB-\uDFFF])))?|\uDFFF(?:\u200D(?:[\u2695\u2696\u2708]\uFE0F?|\u2764\uFE0F?\u200D(?:\uD83D\uDC8B\u200D)?\uD83E\uDDD1\uD83C[\uDFFB-\uDFFE]|\uD83C[\uDF3E\uDF73\uDF7C\uDF84\uDF93\uDFA4\uDFA8\uDFEB\uDFED]|\uD83D[\uDCBB\uDCBC\uDD27\uDD2C\uDE80\uDE92]|\uD83E(?:[\uDDAF\uDDBC\uDDBD](?:\u200D\u27A1\uFE0F?)?|[\uDDB0-\uDDB3]|\uDD1D\u200D\uD83E\uDDD1\uD83C[\uDFFB-\uDFFF])))?))?|\uDEF1(?:\uD83C(?:\uDFFB(?:\u200D\uD83E\uDEF2\uD83C[\uDFFC-\uDFFF])?|\uDFFC(?:\u200D\uD83E\uDEF2\uD83C[\uDFFB\uDFFD-\uDFFF])?|\uDFFD(?:\u200D\uD83E\uDEF2\uD83C[\uDFFB\uDFFC\uDFFE\uDFFF])?|\uDFFE(?:\u200D\uD83E\uDEF2\uD83C[\uDFFB-\uDFFD\uDFFF])?|\uDFFF(?:\u200D\uD83E\uDEF2\uD83C[\uDFFB-\uDFFE])?))?)"); diff --git a/lib/helpers/ui/message_widget_helpers.dart b/lib/helpers/ui/message_widget_helpers.dart index 253ffadb30..852e189068 100644 --- a/lib/helpers/ui/message_widget_helpers.dart +++ b/lib/helpers/ui/message_widget_helpers.dart @@ -22,6 +22,39 @@ String? safeMessageSubstring(String? text, List range) { return text.substring(start, end); } +@visibleForTesting +List messageUrlMatches(String text) => + urlRegex.allMatches(text).toList(growable: false); + +@visibleForTesting +void markEnrichedMessageRange( + List annotations, Tuple3, List?> annotation) { + final range = annotation.item2; + final extras = []; + for (final existing in annotations) { + if (existing.range[0] < range[0] && existing.range[1] > range[0]) { + final duplicate = existing.copy(); + duplicate.range[1] = range[0]; + extras.add(duplicate); + existing.range[0] = range[0]; + } + + if (existing.range[0] < range[1] && existing.range[1] > range[1]) { + final duplicate = existing.copy(); + duplicate.range[0] = range[1]; + extras.add(duplicate); + existing.range[1] = range[1]; + } + } + annotations.addAll(extras); + + for (final existing in annotations) { + if (existing.range[0] >= range[0] && existing.range[1] <= range[1]) { + existing.renderExtras.add(annotation); + } + } +} + List buildMessageSpans( BuildContext context, MessagePart part, Message message, {Color? colorOverride, bool hideBodyText = false}) { @@ -110,49 +143,21 @@ Future> buildEnrichedMessageSpans( : context.theme.colorScheme.properOnSurface), fontSizeFactor: message.isBigEmoji ? 3 : 1, ); - // extract rich content - final urlRegex = RegExp( - r'((https?://)|(www\.))[-a-zA-Z0-9@:%._+~#=]{1,256}\.[a-zA-Z0-9()]{1,6}([-a-zA-Z0-9/()@:%_.~#?&=*\[\]]*)\b'); - List annotations = part.annotations .where((annotation) => safeMessageSubstring(part.displayText, annotation.range) != null) .map((annotation) => annotation.copy()) .toList(); - void markRange(Tuple3, List?> annotation) { - var range = annotation.item2; - List extras = []; - // split em up correctly - for (var a in annotations) { - if (a.range[0] < range[0] && a.range[1] > range[0]) { - var dup = a.copy(); - dup.range[1] = range[0]; - extras.add(dup); - - // end this range at the start of my new range - a.range[0] = range[0]; - } - - if (a.range[0] < range[1] && a.range[1] > range[1]) { - var dup = a.copy(); - dup.range[0] = range[1]; - extras.add(dup); - - // end this range at the start of my new range - a.range[1] = range[1]; - } - } - annotations.addAll(extras); - - for (var a in annotations) { - if (a.range[0] >= range[0] && a.range[1] <= range[1]) { - a.renderExtras.add(annotation); - } - } - } - final controller = cvc(message.chat.target ?? cm.activeChat!.chat); if (!isNullOrEmpty(part.text)) { + // ML Kit may stop a URL at a literal `+`, leaving the remainder as plain + // text. Mark deterministic URL ranges first so later entity annotations + // can split styled runs without shortening the clickable target. + for (final match in messageUrlMatches(part.text!)) { + markEnrichedMessageRange( + annotations, Tuple3("link", [match.start, match.end], null)); + } + if (!kIsWeb && !kIsDesktop && ss.settings.smartReply.value) { if (controller.mlKitParsedText["${message.guid!}-${part.part}"] == null) { final extractor = @@ -171,36 +176,40 @@ Future> buildEnrichedMessageSpans( controller.mlKitParsedText["${message.guid!}-${part.part}"] ?? []; for (EntityAnnotation element in entities) { if (element.entities.first is AddressEntity) { - markRange(Tuple3("map", [element.start, element.end], null)); + markEnrichedMessageRange(annotations, + Tuple3("map", [element.start, element.end], null)); } else if (element.entities.first is PhoneEntity) { - markRange(Tuple3("phone", [element.start, element.end], null)); + markEnrichedMessageRange(annotations, + Tuple3("phone", [element.start, element.end], null)); } else if (element.entities.first is EmailEntity) { - markRange(Tuple3("email", [element.start, element.end], null)); + markEnrichedMessageRange(annotations, + Tuple3("email", [element.start, element.end], null)); } else if (element.entities.first is UrlEntity) { - markRange(Tuple3("link", [element.start, element.end], null)); + markEnrichedMessageRange(annotations, + Tuple3("link", [element.start, element.end], null)); } else if (element.entities.first is DateTimeEntity) { final ent = (element.entities.first as DateTimeEntity); if (part.text?.substring(element.start, element.end).toLowerCase() == "now") { continue; } - markRange( + markEnrichedMessageRange( + annotations, Tuple3("date", [element.start, element.end], [ent.timestamp])); } else if (element.entities.first is TrackingNumberEntity) { final ent = (element.entities.first as TrackingNumberEntity); - markRange(Tuple3("tracking", [element.start, element.end], - [ent.carrier, ent.number])); + markEnrichedMessageRange( + annotations, + Tuple3("tracking", [element.start, element.end], + [ent.carrier, ent.number])); } else if (element.entities.first is FlightNumberEntity) { final ent = (element.entities.first as FlightNumberEntity); - markRange(Tuple3("flight", [element.start, element.end], - [ent.airlineCode, ent.flightNumber])); + markEnrichedMessageRange( + annotations, + Tuple3("flight", [element.start, element.end], + [ent.airlineCode, ent.flightNumber])); } } - } else { - List matches = urlRegex.allMatches(part.text!).toList(); - for (RegExpMatch match in matches) { - markRange(Tuple3("link", [match.start, match.end], null)); - } } } @@ -273,8 +282,7 @@ Future> buildEnrichedMessageSpans( ..onTap = () async { if (type == "link") { String url = text; - if (!url.startsWith("http://") && - !url.startsWith("https://")) { + if (Uri.tryParse(url)?.hasScheme != true) { url = "http://$url"; } await launchUrl(Uri.parse(url), diff --git a/lib/helpers/ui/reaction_helpers.dart b/lib/helpers/ui/reaction_helpers.dart index c30bcbf24a..c1cc1bd7df 100644 --- a/lib/helpers/ui/reaction_helpers.dart +++ b/lib/helpers/ui/reaction_helpers.dart @@ -20,6 +20,21 @@ class ReactionTypes { // ignore: non_constant_identifier_names static const String STICKERBACK = "stickerback"; + /// Maps Apple's `associatedMessageType` to a reaction name, or null when this + /// build has no name for it. + /// + /// Apple uses 2000+ for an applied reaction and 3000+ for a removed one, but + /// it can send an index beyond the names below. Callers must treat null as + /// "not a reaction" rather than indexing [toList] directly, which throws a + /// RangeError on an unknown type. + static String? fromAssociatedMessageType(int associatedMessageType) { + final removed = associatedMessageType >= 3000; + final index = associatedMessageType - (removed ? 3000 : 2000); + final names = toList(); + if (index < 0 || index >= names.length) return null; + return removed ? "-${names[index]}" : names[index]; + } + static List toList() { return [ LOVE, @@ -80,17 +95,22 @@ List getUniqueReactionMessages(List messages) { messages.sort(Message.sort); // Iterate over the messages and insert the latest reaction for each user for (Message msg in messages) { + final reactionType = msg.associatedMessageType; + // Old databases can contain rows written before unknown CloudKit reaction + // types were rejected. They are ordinary messages, not renderable + // reactions, and must not crash this view. + if (reactionType == null) continue; int cache = msg.isFromMe! ? 0 : msg.handleId ?? 0; if (!handleCache.contains(cache) && !kIsWeb) { handleCache.add(cache); // Only add the reaction if it's not a "negative" - if (!msg.associatedMessageType!.startsWith("-")) { + if (!reactionType.startsWith("-")) { output.add(msg); } - } else if (kIsWeb && !msg.associatedMessageType!.startsWith("-")) { + } else if (kIsWeb && !reactionType.startsWith("-")) { output.add(msg); } } return output; -} \ No newline at end of file +} diff --git a/lib/helpers/ui/ui_helpers.dart b/lib/helpers/ui/ui_helpers.dart index 94b57af924..87bf5f5d90 100644 --- a/lib/helpers/ui/ui_helpers.dart +++ b/lib/helpers/ui/ui_helpers.dart @@ -348,7 +348,88 @@ IconData getAttachmentIcon(String mimeType) { return ss.settings.skin.value == Skins.iOS ? CupertinoIcons.arrow_up_right_square : Icons.open_in_new; } +bool _hasUsableSnackbarOverlay() { + final lifecycleState = WidgetsBinding.instance.lifecycleState; + final overlay = Get.key.currentState?.overlay; + final hasUsableOverlay = overlay?.mounted == true; + + if (lifecycleState != AppLifecycleState.resumed || !hasUsableOverlay) { + Logger.debug( + "Skipped snackbar: lifecycle=$lifecycleState overlay=$hasUsableOverlay", + tag: "UI", + ); + return false; + } + + return true; +} + +bool _canUseGetSnackbarOverlay() { + final overlayContext = Get.overlayContext; + return overlayContext != null && Overlay.maybeOf(overlayContext) != null; +} + +void _showScaffoldSnackbar( + String title, + String message, { + required int durationMs, + Function(GetSnackBar)? onTap, + TextButton? button, +}) { + final messenger = Get.rootController.scaffoldMessengerKey.currentState; + if (messenger == null) { + Logger.debug("Skipped snackbar: root messenger unavailable", tag: "UI"); + return; + } + + final fallbackBar = GetSnackBar(title: title, message: message); + Widget content = Column( + mainAxisSize: MainAxisSize.min, + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Text(title, style: const TextStyle(fontWeight: FontWeight.bold)), + Text(message), + ], + ); + if (button != null) { + content = Row( + children: [ + Expanded(child: content), + button, + ], + ); + } + if (onTap != null) { + content = GestureDetector( + onTap: () => onTap(fallbackBar), + child: content, + ); + } + + messenger.showSnackBar( + SnackBar( + content: content, + behavior: SnackBarBehavior.floating, + margin: const EdgeInsets.only(bottom: 10), + duration: Duration(milliseconds: durationMs), + ), + ); +} + void showSnackbar(String title, String message, {int animationMs = 250, int durationMs = 1500, Function(GetSnackBar)? onTap, TextButton? button}) { + if (!_hasUsableSnackbarOverlay()) return; + + if (!_canUseGetSnackbarOverlay()) { + _showScaffoldSnackbar( + title, + message, + durationMs: durationMs, + onTap: onTap, + button: button, + ); + return; + } + Get.snackbar( title, message, diff --git a/lib/objectbox-model.json b/lib/objectbox-model.json index de73215b97..14c9532f21 100644 --- a/lib/objectbox-model.json +++ b/lib/objectbox-model.json @@ -5,7 +5,7 @@ "entities": [ { "id": "1:2065429213543838585", - "lastPropertyId": "20:4318192841720051066", + "lastPropertyId": "21:3774502131190190769", "name": "Attachment", "properties": [ { @@ -22,9 +22,9 @@ { "id": "3:895699641082029197", "name": "guid", + "indexId": "1:1274831956298930522", "type": 9, - "flags": 40, - "indexId": "1:1274831956298930522" + "flags": 40 }, { "id": "4:6047065591027683672", @@ -69,9 +69,9 @@ { "id": "17:5777776419087046056", "name": "messageId", + "indexId": "8:2010461783272999439", "type": 11, "flags": 520, - "indexId": "8:2010461783272999439", "relationTarget": "Message" }, { @@ -88,6 +88,11 @@ "id": "20:4318192841720051066", "name": "ckRecordId", "type": 9 + }, + { + "id": "21:3774502131190190769", + "name": "metadata", + "type": 13 } ], "relations": [] @@ -106,9 +111,9 @@ { "id": "3:318412581013308394", "name": "guid", + "indexId": "2:4712841847590882583", "type": 9, - "flags": 40, - "indexId": "2:4712841847590882583" + "flags": 40 }, { "id": "5:9099706644901956287", @@ -412,17 +417,17 @@ { "id": "11:6784884866959942259", "name": "contactRelationId", + "indexId": "14:1213475652575340910", "type": 11, "flags": 520, - "indexId": "14:1213475652575340910", "relationTarget": "Contact" }, { "id": "12:7288262795934250307", "name": "uniqueAddressAndService", + "indexId": "15:2647319022047266708", "type": 9, - "flags": 2080, - "indexId": "15:2647319022047266708" + "flags": 2080 }, { "id": "13:2987973275926761435", @@ -486,9 +491,9 @@ { "id": "8:4809686302323910258", "name": "themeObjectId", + "indexId": "10:9160679880876705382", "type": 11, "flags": 520, - "indexId": "10:9160679880876705382", "relationTarget": "ThemeObject" } ], @@ -496,7 +501,7 @@ }, { "id": "13:4148278195232901830", - "lastPropertyId": "59:8549583242275112644", + "lastPropertyId": "60:2236183729631725046", "name": "Message", "properties": [ { @@ -513,9 +518,9 @@ { "id": "3:8669586978455730639", "name": "guid", + "indexId": "6:4451778671291639024", "type": 9, - "flags": 40, - "indexId": "6:4451778671291639024" + "flags": 40 }, { "id": "4:9142895361605464091", @@ -545,9 +550,9 @@ { "id": "9:5531207057664871058", "name": "dateCreated", + "indexId": "16:4323200293672047337", "type": 10, - "flags": 8, - "indexId": "16:4323200293672047337" + "flags": 8 }, { "id": "10:3811604236432549817", @@ -647,9 +652,9 @@ { "id": "39:1372898255926257108", "name": "chatId", + "indexId": "9:1947853053588120767", "type": 11, "flags": 520, - "indexId": "9:1947853053588120767", "relationTarget": "Chat" }, { @@ -751,6 +756,11 @@ "id": "59:8549583242275112644", "name": "ckSyncState", "type": 1 + }, + { + "id": "60:2236183729631725046", + "name": "metadata", + "type": 13 } ], "relations": [] @@ -769,9 +779,9 @@ { "id": "2:3805851416487185429", "name": "name", + "indexId": "7:6926665461572101158", "type": 9, - "flags": 2080, - "indexId": "7:6926665461572101158" + "flags": 2080 }, { "id": "3:621312794123477095", @@ -815,9 +825,9 @@ { "id": "2:6644283342768530799", "name": "name", + "indexId": "11:8452066780532720626", "type": 9, - "flags": 2080, - "indexId": "11:8452066780532720626" + "flags": 2080 }, { "id": "3:8412087896868925153", @@ -851,9 +861,9 @@ { "id": "2:708918913606465689", "name": "id", + "indexId": "12:8665353868334070555", "type": 9, - "flags": 2048, - "indexId": "12:8665353868334070555" + "flags": 2048 }, { "id": "3:3572501485957552445", @@ -897,10 +907,1294 @@ } ], "relations": [] + }, + { + "id": "18:6719772093493207335", + "lastPropertyId": "25:4451177903685227588", + "name": "CloudInboxChangeEntity", + "properties": [ + { + "id": "1:1895907410778974924", + "name": "id", + "type": 6, + "flags": 1 + }, + { + "id": "2:4032652183471247709", + "name": "changeKey", + "indexId": "17:5174860094616047747", + "type": 9, + "flags": 4128 + }, + { + "id": "3:5983731795781636076", + "name": "accountFingerprint", + "indexId": "18:7783959298344182122", + "type": 9, + "flags": 4096 + }, + { + "id": "4:8678544169124423987", + "name": "zone", + "indexId": "19:821204552706254830", + "type": 9, + "flags": 4096 + }, + { + "id": "5:2136167124009199311", + "name": "serverRecordIdHash", + "indexId": "20:6843515083576547121", + "type": 9, + "flags": 4096 + }, + { + "id": "6:617092932104382307", + "name": "etagHash", + "type": 9 + }, + { + "id": "7:64019184264750896", + "name": "changeType", + "type": 9 + }, + { + "id": "8:2328711545206180923", + "name": "encryptedPayloadRef", + "type": 9 + }, + { + "id": "9:3676607222232263", + "name": "payloadSha256", + "type": 9 + }, + { + "id": "10:1669804813770590457", + "name": "fetchSequence", + "indexId": "21:2885795424266777500", + "type": 6, + "flags": 8 + }, + { + "id": "11:5135084822522519610", + "name": "status", + "indexId": "22:7905330438985774204", + "type": 6, + "flags": 8 + }, + { + "id": "12:8575275500382195174", + "name": "isTombstone", + "type": 1 + }, + { + "id": "13:5224296750110920597", + "name": "failureCategory", + "type": 9 + }, + { + "id": "14:9109742928607863948", + "name": "retryCount", + "type": 6 + }, + { + "id": "15:2122087258225924885", + "name": "createdAtMs", + "type": 6 + }, + { + "id": "16:8310828696055987169", + "name": "updatedAtMs", + "type": 6 + }, + { + "id": "17:2385681725155050415", + "name": "scopeKey", + "indexId": "39:3360430129523727354", + "type": 9, + "flags": 4096 + }, + { + "id": "18:942265256405421186", + "name": "encryptedServerRecordId", + "type": 9 + }, + { + "id": "19:1452880395700277269", + "name": "protectedSystemFieldsRef", + "type": 9 + }, + { + "id": "20:1370342980241388939", + "name": "batchId", + "indexId": "40:8891088444757782392", + "type": 9, + "flags": 4096 + }, + { + "id": "21:8085608731784905006", + "name": "generation", + "type": 6 + }, + { + "id": "22:7803520175828220783", + "name": "nextEligibleAtMs", + "type": 6 + }, + { + "id": "23:2359335986298063461", + "name": "serverModifiedAtMs", + "type": 6 + }, + { + "id": "24:5348089514051084893", + "name": "completedAtMs", + "type": 6 + }, + { + "id": "25:4451177903685227588", + "name": "changeIdHash", + "type": 9 + } + ], + "relations": [] + }, + { + "id": "19:6209808242097333245", + "lastPropertyId": "26:4302324668053862926", + "name": "CloudOutboxOperationEntity", + "properties": [ + { + "id": "1:1453923979681070039", + "name": "id", + "type": 6, + "flags": 1 + }, + { + "id": "2:5482215586868617465", + "name": "operationId", + "indexId": "23:2902044484437898756", + "type": 9, + "flags": 4128 + }, + { + "id": "3:7822186106200261916", + "name": "accountFingerprint", + "indexId": "24:1438057816700047656", + "type": 9, + "flags": 4096 + }, + { + "id": "4:9073324705939660391", + "name": "zone", + "indexId": "25:4176121958468359790", + "type": 9, + "flags": 4096 + }, + { + "id": "5:5030438638097882343", + "name": "logicalEntityKeyHash", + "indexId": "26:1229409407214613375", + "type": 9, + "flags": 4096 + }, + { + "id": "6:3360967592185918908", + "name": "action", + "type": 6 + }, + { + "id": "7:8739970205884330074", + "name": "dependencyOperationIdsJson", + "type": 9 + }, + { + "id": "8:4164289290106487159", + "name": "payloadVersion", + "type": 6 + }, + { + "id": "9:2114718060008374593", + "name": "encryptedPayloadRef", + "type": 9 + }, + { + "id": "10:7424732699000879073", + "name": "payloadSha256", + "type": 9 + }, + { + "id": "11:6365640570467255843", + "name": "state", + "indexId": "27:28639336516046221", + "type": 6, + "flags": 8 + }, + { + "id": "12:8957972381723831102", + "name": "attemptCount", + "type": 6 + }, + { + "id": "13:6974379095018398482", + "name": "nextEligibleAtMs", + "indexId": "28:3434010190981668931", + "type": 6, + "flags": 8 + }, + { + "id": "14:1713088269741338724", + "name": "lastErrorCategory", + "type": 9 + }, + { + "id": "15:3023724616636969011", + "name": "serverRecordIdHash", + "type": 9 + }, + { + "id": "16:908674649408606076", + "name": "createdAtMs", + "type": 6 + }, + { + "id": "17:2395909016293033875", + "name": "updatedAtMs", + "type": 6 + }, + { + "id": "18:7045932923442181147", + "name": "scopeKey", + "indexId": "41:7669028522258602254", + "type": 9, + "flags": 4096 + }, + { + "id": "19:8671106639445127584", + "name": "mutationRevision", + "type": 6 + }, + { + "id": "20:8829434107583151203", + "name": "leaseIdHash", + "type": 9 + }, + { + "id": "21:8352574949953478905", + "name": "leaseExpiresAtMs", + "type": 6 + }, + { + "id": "22:1517823970736287654", + "name": "confirmedAtMs", + "type": 6 + }, + { + "id": "23:3453625028306797643", + "name": "checkpointGeneration", + "type": 6 + }, + { + "id": "24:2838853240019164046", + "name": "appleRequestUuid", + "type": 9 + }, + { + "id": "25:593864995002474100", + "name": "appleOperationUuid", + "type": 9 + }, + { + "id": "26:4302324668053862926", + "name": "protectedLeaseReference", + "type": 9 + } + ], + "relations": [] + }, + { + "id": "20:8623084761715763815", + "lastPropertyId": "12:7135872154167319448", + "name": "CloudRecordMapEntity", + "properties": [ + { + "id": "1:9097529941931140001", + "name": "id", + "type": 6, + "flags": 1 + }, + { + "id": "2:3528403730967002101", + "name": "mapKey", + "indexId": "29:471127199829308194", + "type": 9, + "flags": 4128 + }, + { + "id": "3:8031419087023122271", + "name": "accountFingerprint", + "indexId": "30:6809918130192761355", + "type": 9, + "flags": 4096 + }, + { + "id": "4:596246986889589728", + "name": "zone", + "indexId": "31:6419846787958831018", + "type": 9, + "flags": 4096 + }, + { + "id": "5:3866959842373768393", + "name": "logicalEntityKeyHash", + "indexId": "32:5741250032786933729", + "type": 9, + "flags": 4096 + }, + { + "id": "6:1720064144660637343", + "name": "serverRecordIdHash", + "indexId": "33:2137526312204345044", + "type": 9, + "flags": 4096 + }, + { + "id": "7:7059827757810134893", + "name": "encryptedServerRecordId", + "type": 9 + }, + { + "id": "8:6064824751437364913", + "name": "etagHash", + "type": 9 + }, + { + "id": "9:3511222388893390366", + "name": "encryptedRawRecordRef", + "type": 9 + }, + { + "id": "10:4476992720778999527", + "name": "updatedAtMs", + "type": 6 + }, + { + "id": "11:6045468503885689678", + "name": "scopeKey", + "indexId": "42:8580390230204763517", + "type": 9, + "flags": 4096 + }, + { + "id": "12:7135872154167319448", + "name": "generation", + "type": 6 + } + ], + "relations": [] + }, + { + "id": "21:4610418443336266937", + "lastPropertyId": "20:469503483284611167", + "name": "CloudSyncCheckpointEntity", + "properties": [ + { + "id": "1:1503513831301718558", + "name": "id", + "type": 6, + "flags": 1 + }, + { + "id": "2:4028596345806531255", + "name": "checkpointKey", + "indexId": "34:1579181902505607669", + "type": 9, + "flags": 4128 + }, + { + "id": "3:5485993030475628060", + "name": "accountFingerprint", + "indexId": "35:4382044364901605135", + "type": 9, + "flags": 4096 + }, + { + "id": "4:575887715290289427", + "name": "container", + "type": 9 + }, + { + "id": "5:8918464312948592927", + "name": "database", + "type": 9 + }, + { + "id": "6:4967773343283709776", + "name": "zone", + "indexId": "36:1694676353845812008", + "type": 9, + "flags": 4096 + }, + { + "id": "7:8851160100117306846", + "name": "schemaVersion", + "type": 6 + }, + { + "id": "8:8714485857066159220", + "name": "fetchedTokenCiphertext", + "type": 9 + }, + { + "id": "9:9039140338019416063", + "name": "fetchedSequence", + "type": 6 + }, + { + "id": "10:461883346597482809", + "name": "appliedSequence", + "type": 6 + }, + { + "id": "11:7559900551993333666", + "name": "lastSuccessfulAtMs", + "type": 6 + }, + { + "id": "12:1542051308030024045", + "name": "lastAttemptAtMs", + "type": 6 + }, + { + "id": "13:6338716602832862273", + "name": "lastErrorCategory", + "type": 9 + }, + { + "id": "14:4946610067634546596", + "name": "backoffAttempt", + "type": 6 + }, + { + "id": "15:3803599633056384253", + "name": "nextEligibleAtMs", + "type": 6 + }, + { + "id": "16:3893748363581671178", + "name": "updatedAtMs", + "type": 6 + }, + { + "id": "17:7898159843947289985", + "name": "streamKind", + "type": 9 + }, + { + "id": "18:5644534535062464011", + "name": "generation", + "type": 6 + }, + { + "id": "19:3704484740564181784", + "name": "lastBatchId", + "type": 9 + }, + { + "id": "20:469503483284611167", + "name": "mutationRevisionCounter", + "type": 6 + } + ], + "relations": [] + }, + { + "id": "22:259334693033865836", + "lastPropertyId": "16:6257537762912465363", + "name": "CloudSyncRunEntity", + "properties": [ + { + "id": "1:1782232589038116265", + "name": "id", + "type": 6, + "flags": 1 + }, + { + "id": "2:2420496326771660332", + "name": "runId", + "indexId": "37:5579835729402978725", + "type": 9, + "flags": 4128 + }, + { + "id": "3:5578798528327770139", + "name": "accountFingerprint", + "indexId": "38:1353148650192326406", + "type": 9, + "flags": 4096 + }, + { + "id": "4:7951416976844075650", + "name": "trigger", + "type": 9 + }, + { + "id": "5:1210921649776027278", + "name": "architecture", + "type": 9 + }, + { + "id": "6:2764764522538084616", + "name": "mode", + "type": 9 + }, + { + "id": "7:2688680483849660813", + "name": "fetchedCount", + "type": 6 + }, + { + "id": "8:6162153589821911026", + "name": "appliedCount", + "type": 6 + }, + { + "id": "9:791556381302722054", + "name": "quarantinedCount", + "type": 6 + }, + { + "id": "10:1390082525507774243", + "name": "confirmedCount", + "type": 6 + }, + { + "id": "11:4541580426093217663", + "name": "retriedCount", + "type": 6 + }, + { + "id": "12:857320526491939146", + "name": "startedAtMs", + "type": 6 + }, + { + "id": "13:3056229026698237423", + "name": "finishedAtMs", + "type": 6 + }, + { + "id": "14:9083894370969100067", + "name": "failureCategory", + "type": 9 + }, + { + "id": "15:1232110106438769869", + "name": "scopeKey", + "indexId": "47:3060485928735691412", + "type": 9, + "flags": 4096 + }, + { + "id": "16:6257537762912465363", + "name": "deferredCount", + "type": 6 + } + ], + "relations": [] + }, + { + "id": "23:4070283325319950409", + "lastPropertyId": "8:5690477582462752090", + "name": "CloudSyncLeaseEntity", + "properties": [ + { + "id": "1:2729282918387786382", + "name": "id", + "type": 6, + "flags": 1 + }, + { + "id": "2:2769029684737707461", + "name": "leaseKey", + "indexId": "43:637443236713783532", + "type": 9, + "flags": 4128 + }, + { + "id": "3:8190732138318068473", + "name": "scopeKey", + "indexId": "44:9151336404221461594", + "type": 9, + "flags": 4096 + }, + { + "id": "4:8073672003493449321", + "name": "accountFingerprint", + "indexId": "45:5155866284077893836", + "type": 9, + "flags": 4096 + }, + { + "id": "5:8728846936974993304", + "name": "ownerIdHash", + "type": 9 + }, + { + "id": "6:772462836942356017", + "name": "generation", + "type": 6 + }, + { + "id": "7:2572401958863969816", + "name": "acquiredAtMs", + "type": 6 + }, + { + "id": "8:5690477582462752090", + "name": "expiresAtMs", + "indexId": "46:649461146512244572", + "type": 6, + "flags": 8 + } + ], + "relations": [] + }, + { + "id": "24:6298856735630642402", + "lastPropertyId": "16:115530251783195004", + "name": "CloudAttachmentMaterializationEntity", + "properties": [ + { + "id": "1:1733707656886255486", + "name": "id", + "type": 6, + "flags": 1 + }, + { + "id": "2:2829480575482014625", + "name": "transferKey", + "indexId": "48:8511204723626225136", + "type": 9, + "flags": 4128 + }, + { + "id": "3:3054457580958471772", + "name": "scopeKey", + "indexId": "49:3868889113762672438", + "type": 9, + "flags": 4096 + }, + { + "id": "4:7527309380540369961", + "name": "accountFingerprint", + "indexId": "50:9057833165170278504", + "type": 9, + "flags": 4096 + }, + { + "id": "5:5122274897448961713", + "name": "zone", + "indexId": "51:8904544591634042596", + "type": 9, + "flags": 4096 + }, + { + "id": "6:8957933126875551600", + "name": "generation", + "type": 6 + }, + { + "id": "7:4815227610925886891", + "name": "logicalEntityKeyHash", + "indexId": "52:8064650573204067089", + "type": 9, + "flags": 4096 + }, + { + "id": "8:350444312191614898", + "name": "expectedBytes", + "type": 6 + }, + { + "id": "9:4652270939056213993", + "name": "expectedIntegrityTagHash", + "type": 9 + }, + { + "id": "10:6314008561402639966", + "name": "stage", + "indexId": "53:3559574499631432073", + "type": 6, + "flags": 8 + }, + { + "id": "11:3947295453349546213", + "name": "verifiedBytes", + "type": 6 + }, + { + "id": "12:4286934476255007712", + "name": "protectedTempReference", + "type": 9 + }, + { + "id": "13:6102671074598874882", + "name": "protectedResumeManifestReference", + "type": 9 + }, + { + "id": "14:5110684721177215462", + "name": "protectedContentVerificationReference", + "type": 9 + }, + { + "id": "15:531054111286031189", + "name": "protectedFinalReference", + "type": 9 + }, + { + "id": "16:115530251783195004", + "name": "updatedAtMs", + "type": 6 + } + ], + "relations": [] + }, + { + "id": "25:2707792941267997758", + "lastPropertyId": "24:6134120491357238156", + "name": "CloudSemanticReplayEntity", + "properties": [ + { + "id": "1:3880903860070244039", + "name": "id", + "type": 6, + "flags": 1 + }, + { + "id": "2:2817476290092230342", + "name": "replayKey", + "indexId": "54:2661950643500352932", + "type": 9, + "flags": 4128 + }, + { + "id": "3:5845736057897842633", + "name": "scopeGenerationKey", + "indexId": "55:6656797492340960508", + "type": 9, + "flags": 4096 + }, + { + "id": "4:1353183097380652891", + "name": "scopeKey", + "indexId": "56:7550401169650593817", + "type": 9, + "flags": 4096 + }, + { + "id": "5:1580690780664760772", + "name": "accountFingerprint", + "indexId": "57:1758564168966321462", + "type": 9, + "flags": 4096 + }, + { + "id": "6:7674256512701354196", + "name": "container", + "type": 9 + }, + { + "id": "7:3735485937229566834", + "name": "database", + "type": 9 + }, + { + "id": "8:1239116557652113152", + "name": "zone", + "indexId": "58:1437734903549199516", + "type": 9, + "flags": 4096 + }, + { + "id": "9:2503794915196890881", + "name": "streamKind", + "type": 9 + }, + { + "id": "10:8528671671014893912", + "name": "schemaVersion", + "type": 6 + }, + { + "id": "11:9103596916327534004", + "name": "generation", + "type": 6 + }, + { + "id": "12:5062059703884467225", + "name": "changeIdHash", + "indexId": "59:8454019426905867269", + "type": 9, + "flags": 4096 + }, + { + "id": "16:7486724007131892173", + "name": "updatedAtMs", + "type": 6 + }, + { + "id": "17:3765812835902269445", + "name": "serverRecordIdHash", + "indexId": "66:6913311950121421051", + "type": 9, + "flags": 4096 + }, + { + "id": "18:8462982952394987262", + "name": "logicalEntityKeyHash", + "indexId": "67:9016942969599814282", + "type": 9, + "flags": 4096 + }, + { + "id": "19:1416321247527772100", + "name": "payloadSha256", + "type": 9 + }, + { + "id": "20:1168518400042208803", + "name": "protectedPayloadReferenceHash", + "type": 9 + }, + { + "id": "21:2926325749401488941", + "name": "inboxSequence", + "type": 6 + }, + { + "id": "22:5443645776082689040", + "name": "changeType", + "type": 9 + }, + { + "id": "23:5938564578107542446", + "name": "terminalOutcome", + "indexId": "68:3019787364371978747", + "type": 9, + "flags": 4096 + }, + { + "id": "24:6134120491357238156", + "name": "terminalSafeCode", + "type": 9 + } + ], + "relations": [] + }, + { + "id": "26:7701837625666464233", + "lastPropertyId": "24:5035678304275097058", + "name": "CloudSemanticSnapshotEntity", + "properties": [ + { + "id": "1:8520227360481418389", + "name": "id", + "type": 6, + "flags": 1 + }, + { + "id": "2:7488477600905998136", + "name": "snapshotKey", + "indexId": "60:5644677902998818408", + "type": 9, + "flags": 4128 + }, + { + "id": "3:7329013381340357172", + "name": "scopeGenerationKey", + "indexId": "61:1226266756750185226", + "type": 9, + "flags": 4096 + }, + { + "id": "4:6401139088990627667", + "name": "scopeKey", + "indexId": "62:2298928435832767244", + "type": 9, + "flags": 4096 + }, + { + "id": "5:5773934355110739738", + "name": "accountFingerprint", + "indexId": "63:3017974133359173059", + "type": 9, + "flags": 4096 + }, + { + "id": "6:2192943532550866420", + "name": "container", + "type": 9 + }, + { + "id": "7:4243885286916349439", + "name": "database", + "type": 9 + }, + { + "id": "8:1122439571203719362", + "name": "zone", + "indexId": "64:6674403394799987160", + "type": 9, + "flags": 4096 + }, + { + "id": "9:8532578789865062424", + "name": "streamKind", + "type": 9 + }, + { + "id": "10:6974539497241102296", + "name": "schemaVersion", + "type": 6 + }, + { + "id": "11:1250931896109604799", + "name": "generation", + "type": 6 + }, + { + "id": "12:1451806406255824259", + "name": "entityKind", + "type": 9 + }, + { + "id": "13:3131079412139954216", + "name": "logicalEntityKeyHash", + "indexId": "65:7107073535763836024", + "type": 9, + "flags": 4096 + }, + { + "id": "14:9116431593188019474", + "name": "parentLogicalKeyHash", + "type": 9 + }, + { + "id": "15:5647270430356373616", + "name": "immutableContentDigest", + "type": 9 + }, + { + "id": "16:3489430996458561289", + "name": "createdAtMs", + "type": 6 + }, + { + "id": "17:8182786500145730176", + "name": "readAtMs", + "type": 6 + }, + { + "id": "18:3348921457693473272", + "name": "deliveredAtMs", + "type": 6 + }, + { + "id": "19:2070179914062438898", + "name": "editPartsJson", + "type": 9 + }, + { + "id": "20:2837338191269536128", + "name": "retractedAtMs", + "type": 6 + }, + { + "id": "21:5535400344419239642", + "name": "groupVersion", + "type": 6 + }, + { + "id": "22:236557598042741275", + "name": "groupMetadataDigest", + "type": 9 + }, + { + "id": "23:4137057345787739447", + "name": "etagHash", + "type": 9 + }, + { + "id": "24:5035678304275097058", + "name": "updatedAtMs", + "type": 6 + } + ], + "relations": [] + }, + { + "id": "27:4280538170716883312", + "lastPropertyId": "9:7761394260513099254", + "name": "CloudProtectedPageLeaseEntity", + "properties": [ + { + "id": "1:1759726867224472058", + "name": "id", + "type": 6, + "flags": 1 + }, + { + "id": "2:3492550884558884121", + "name": "leaseReference", + "indexId": "69:435771699388467906", + "type": 9, + "flags": 4128 + }, + { + "id": "3:1803024814487980708", + "name": "scopeKey", + "indexId": "70:3620302744458223619", + "type": 9, + "flags": 4096 + }, + { + "id": "4:657197473658330316", + "name": "accountFingerprint", + "indexId": "71:9143856129043954915", + "type": 9, + "flags": 4096 + }, + { + "id": "5:913730073842346540", + "name": "generation", + "type": 6 + }, + { + "id": "6:6474542508711130616", + "name": "batchIdHash", + "type": 9 + }, + { + "id": "7:5246214786452390887", + "name": "adoptedAtMs", + "type": 6 + }, + { + "id": "8:2103033795181318938", + "name": "finalizeAttemptCount", + "type": 6 + }, + { + "id": "9:7761394260513099254", + "name": "nextFinalizeEligibleAtMs", + "type": 6 + } + ], + "relations": [] + }, + { + "id": "28:889478301778181246", + "lastPropertyId": "14:4174520670149979908", + "name": "CloudKitWriterAuthorityEntity", + "properties": [ + { + "id": "1:5473247877995585615", + "name": "id", + "type": 6, + "flags": 1 + }, + { + "id": "2:1642692165078650755", + "name": "authorityKey", + "indexId": "72:6121958980954465281", + "type": 9, + "flags": 4128 + }, + { + "id": "3:5104060885702386570", + "name": "accountFingerprint", + "indexId": "73:5488879845786692064", + "type": 9, + "flags": 4096 + }, + { + "id": "4:1430241371294861401", + "name": "container", + "type": 9 + }, + { + "id": "5:4032154290354580986", + "name": "database", + "type": 9 + }, + { + "id": "6:2423775511408165446", + "name": "owner", + "type": 6 + }, + { + "id": "7:1072554348408456591", + "name": "state", + "type": 6 + }, + { + "id": "8:7868095992651810717", + "name": "targetOwner", + "type": 6 + }, + { + "id": "9:676908442821730166", + "name": "epoch", + "type": 6 + }, + { + "id": "10:151617614527735346", + "name": "updatedAtMs", + "type": 6 + }, + { + "id": "11:5989769012840038573", + "name": "transitionIdHash", + "type": 9 + }, + { + "id": "12:9160103618601374829", + "name": "resetScopeKeyHash", + "type": 9 + }, + { + "id": "13:2198164706224214236", + "name": "resetGeneration", + "type": 6 + }, + { + "id": "14:4174520670149979908", + "name": "resetProofReferenceHash", + "type": 9 + } + ], + "relations": [] + }, + { + "id": "29:3887662870209685934", + "lastPropertyId": "12:4810596780446149463", + "name": "CloudKitDeletionIntentEntity", + "properties": [ + { + "id": "1:4826700441964631379", + "name": "id", + "type": 6, + "flags": 1 + }, + { + "id": "2:3159247580443387695", + "name": "intentKey", + "indexId": "74:8915222881106965724", + "type": 9, + "flags": 4128 + }, + { + "id": "3:6722727339572908414", + "name": "accountFingerprint", + "indexId": "75:3577054364456742958", + "type": 9, + "flags": 4096 + }, + { + "id": "4:458894881388309981", + "name": "container", + "type": 9 + }, + { + "id": "5:6503045858666304076", + "name": "database", + "type": 9 + }, + { + "id": "6:9128063155847659726", + "name": "writerEpoch", + "type": 6 + }, + { + "id": "7:8745333787754726390", + "name": "kind", + "type": 6 + }, + { + "id": "8:8231123974175741804", + "name": "recordId", + "type": 9 + }, + { + "id": "9:8313675762076426993", + "name": "state", + "indexId": "76:4653884840954261598", + "type": 6, + "flags": 8 + }, + { + "id": "10:1791582430176981252", + "name": "quarantineReason", + "type": 9 + }, + { + "id": "11:6754220496000410228", + "name": "createdAtMs", + "type": 6 + }, + { + "id": "12:4810596780446149463", + "name": "updatedAtMs", + "type": 6 + } + ], + "relations": [] + }, + { + "id": "30:156682190547124916", + "lastPropertyId": "6:7608873074433568741", + "name": "CloudKitDeletionQuarantineEntity", + "properties": [ + { + "id": "1:9016454772102266426", + "name": "id", + "type": 6, + "flags": 1 + }, + { + "id": "2:6218233504524201595", + "name": "quarantineKey", + "indexId": "77:1999680227156715272", + "type": 9, + "flags": 4128 + }, + { + "id": "3:5288728045287545979", + "name": "sourceKey", + "type": 9 + }, + { + "id": "4:7940712078234941674", + "name": "recordId", + "type": 9 + }, + { + "id": "5:8871707048403049958", + "name": "reason", + "type": 9 + }, + { + "id": "6:7608873074433568741", + "name": "createdAtMs", + "type": 6 + } + ], + "relations": [] } ], - "lastEntityId": "17:2547083341603323785", - "lastIndexId": "16:4323200293672047337", + "lastEntityId": "30:156682190547124916", + "lastIndexId": "77:1999680227156715272", "lastRelationId": "1:7492985733214117623", "lastSequenceId": "0:0", "modelVersion": 5, @@ -1010,7 +2304,10 @@ 7997144491374144435, 1278586999912993922, 696004914151488398, - 5516087858141459065 + 5516087858141459065, + 7269255294897696731, + 8215014452962792686, + 1551080847505267540 ], "retiredRelationUids": [], "version": 1 diff --git a/lib/objectbox.g.dart b/lib/objectbox.g.dart index 71dc5d13f2..edefa00ff5 100644 --- a/lib/objectbox.g.dart +++ b/lib/objectbox.g.dart @@ -16,6 +16,7 @@ import 'package:objectbox_flutter_libs/objectbox_flutter_libs.dart'; import 'database/io/attachment.dart'; import 'database/io/chat.dart'; +import 'database/io/cloud_sync_records.dart'; import 'database/io/contact.dart'; import 'database/io/fcm_data.dart'; import 'database/io/handle.dart'; @@ -28,898 +29,2532 @@ export 'package:objectbox/objectbox.dart'; // so that callers only have to impor final _entities = [ obx_int.ModelEntity( - id: const obx_int.IdUid(1, 2065429213543838585), - name: 'Attachment', - lastPropertyId: const obx_int.IdUid(20, 4318192841720051066), - flags: 0, - properties: [ - obx_int.ModelProperty( - id: const obx_int.IdUid(1, 1511554263230297197), - name: 'id', - type: 6, - flags: 1), - obx_int.ModelProperty( - id: const obx_int.IdUid(2, 2178477183992316459), - name: 'originalROWID', - type: 6, - flags: 0), - obx_int.ModelProperty( - id: const obx_int.IdUid(3, 895699641082029197), - name: 'guid', - type: 9, - flags: 40, - indexId: const obx_int.IdUid(1, 1274831956298930522)), - obx_int.ModelProperty( - id: const obx_int.IdUid(4, 6047065591027683672), - name: 'uti', - type: 9, - flags: 0), - obx_int.ModelProperty( - id: const obx_int.IdUid(5, 8856072667843358452), - name: 'mimeType', - type: 9, - flags: 0), - obx_int.ModelProperty( - id: const obx_int.IdUid(7, 2217746424870068461), - name: 'isOutgoing', - type: 1, - flags: 0), - obx_int.ModelProperty( - id: const obx_int.IdUid(8, 5943814485048944977), - name: 'transferName', - type: 9, - flags: 0), - obx_int.ModelProperty( - id: const obx_int.IdUid(9, 2227654525168892418), - name: 'totalBytes', - type: 6, - flags: 0), - obx_int.ModelProperty( - id: const obx_int.IdUid(13, 171869175523313868), - name: 'height', - type: 6, - flags: 0), - obx_int.ModelProperty( - id: const obx_int.IdUid(14, 2450795986531805384), - name: 'width', - type: 6, - flags: 0), - obx_int.ModelProperty( - id: const obx_int.IdUid(16, 396659320299238462), - name: 'webUrl', - type: 9, - flags: 0), - obx_int.ModelProperty( - id: const obx_int.IdUid(17, 5777776419087046056), - name: 'messageId', - type: 11, - flags: 520, - indexId: const obx_int.IdUid(8, 2010461783272999439), - relationTarget: 'Message'), - obx_int.ModelProperty( - id: const obx_int.IdUid(18, 4627777114429677812), - name: 'dbMetadata', - type: 9, - flags: 0), - obx_int.ModelProperty( - id: const obx_int.IdUid(19, 2980761301143366690), - name: 'hasLivePhoto', - type: 1, - flags: 0), - obx_int.ModelProperty( - id: const obx_int.IdUid(20, 4318192841720051066), - name: 'ckRecordId', - type: 9, - flags: 0) - ], - relations: [], - backlinks: []), + id: const obx_int.IdUid(1, 2065429213543838585), + name: 'Attachment', + lastPropertyId: const obx_int.IdUid(21, 3774502131190190769), + flags: 0, + properties: [ + obx_int.ModelProperty( + id: const obx_int.IdUid(1, 1511554263230297197), + name: 'id', + type: 6, + flags: 1, + ), + obx_int.ModelProperty( + id: const obx_int.IdUid(2, 2178477183992316459), + name: 'originalROWID', + type: 6, + flags: 0, + ), + obx_int.ModelProperty( + id: const obx_int.IdUid(3, 895699641082029197), + name: 'guid', + type: 9, + flags: 40, + indexId: const obx_int.IdUid(1, 1274831956298930522), + ), + obx_int.ModelProperty( + id: const obx_int.IdUid(4, 6047065591027683672), + name: 'uti', + type: 9, + flags: 0, + ), + obx_int.ModelProperty( + id: const obx_int.IdUid(5, 8856072667843358452), + name: 'mimeType', + type: 9, + flags: 0, + ), + obx_int.ModelProperty( + id: const obx_int.IdUid(7, 2217746424870068461), + name: 'isOutgoing', + type: 1, + flags: 0, + ), + obx_int.ModelProperty( + id: const obx_int.IdUid(8, 5943814485048944977), + name: 'transferName', + type: 9, + flags: 0, + ), + obx_int.ModelProperty( + id: const obx_int.IdUid(9, 2227654525168892418), + name: 'totalBytes', + type: 6, + flags: 0, + ), + obx_int.ModelProperty( + id: const obx_int.IdUid(13, 171869175523313868), + name: 'height', + type: 6, + flags: 0, + ), + obx_int.ModelProperty( + id: const obx_int.IdUid(14, 2450795986531805384), + name: 'width', + type: 6, + flags: 0, + ), + obx_int.ModelProperty( + id: const obx_int.IdUid(16, 396659320299238462), + name: 'webUrl', + type: 9, + flags: 0, + ), + obx_int.ModelProperty( + id: const obx_int.IdUid(17, 5777776419087046056), + name: 'messageId', + type: 11, + flags: 520, + indexId: const obx_int.IdUid(8, 2010461783272999439), + relationField: 'message', + relationTarget: 'Message', + ), + obx_int.ModelProperty( + id: const obx_int.IdUid(18, 4627777114429677812), + name: 'dbMetadata', + type: 9, + flags: 0, + ), + obx_int.ModelProperty( + id: const obx_int.IdUid(19, 2980761301143366690), + name: 'hasLivePhoto', + type: 1, + flags: 0, + ), + obx_int.ModelProperty( + id: const obx_int.IdUid(20, 4318192841720051066), + name: 'ckRecordId', + type: 9, + flags: 0, + ), + obx_int.ModelProperty( + id: const obx_int.IdUid(21, 3774502131190190769), + name: 'metadata', + type: 13, + flags: 0, + ), + ], + relations: [], + backlinks: [], + ), obx_int.ModelEntity( - id: const obx_int.IdUid(3, 9017250848141753702), - name: 'Chat', - lastPropertyId: const obx_int.IdUid(48, 6101265134976618931), - flags: 0, - properties: [ - obx_int.ModelProperty( - id: const obx_int.IdUid(1, 297833828287439140), - name: 'id', - type: 6, - flags: 1), - obx_int.ModelProperty( - id: const obx_int.IdUid(3, 318412581013308394), - name: 'guid', - type: 9, - flags: 40, - indexId: const obx_int.IdUid(2, 4712841847590882583)), - obx_int.ModelProperty( - id: const obx_int.IdUid(5, 9099706644901956287), - name: 'chatIdentifier', - type: 9, - flags: 0), - obx_int.ModelProperty( - id: const obx_int.IdUid(6, 9117376896883192460), - name: 'isArchived', - type: 1, - flags: 0), - obx_int.ModelProperty( - id: const obx_int.IdUid(8, 2937507201037513710), - name: 'muteType', - type: 9, - flags: 0), - obx_int.ModelProperty( - id: const obx_int.IdUid(9, 3354772670242853270), - name: 'muteArgs', - type: 9, - flags: 0), - obx_int.ModelProperty( - id: const obx_int.IdUid(10, 3734639758158862923), - name: 'isPinned', - type: 1, - flags: 0), - obx_int.ModelProperty( - id: const obx_int.IdUid(11, 2937716363156975856), - name: 'hasUnreadMessage', - type: 1, - flags: 0), - obx_int.ModelProperty( - id: const obx_int.IdUid(12, 526293286661780207), - name: 'dbOnlyLatestMessageDate', - type: 10, - flags: 0), - obx_int.ModelProperty( - id: const obx_int.IdUid(15, 4266631519717388837), - name: 'title', - type: 9, - flags: 0), - obx_int.ModelProperty( - id: const obx_int.IdUid(16, 1181486482872028222), - name: 'displayName', - type: 9, - flags: 0), - obx_int.ModelProperty( - id: const obx_int.IdUid(18, 3666111733726849006), - name: 'customAvatarPath', - type: 9, - flags: 0), - obx_int.ModelProperty( - id: const obx_int.IdUid(19, 4234470006262207812), - name: 'pinIndex', - type: 6, - flags: 0), - obx_int.ModelProperty( - id: const obx_int.IdUid(20, 2695161584801983484), - name: 'autoSendReadReceipts', - type: 1, - flags: 0), - obx_int.ModelProperty( - id: const obx_int.IdUid(21, 55197157095191277), - name: 'autoSendTypingIndicators', - type: 1, - flags: 0), - obx_int.ModelProperty( - id: const obx_int.IdUid(22, 8357397541593794158), - name: 'textFieldText', - type: 9, - flags: 0), - obx_int.ModelProperty( - id: const obx_int.IdUid(23, 7756745453707268462), - name: 'textFieldAttachments', - type: 30, - flags: 0), - obx_int.ModelProperty( - id: const obx_int.IdUid(24, 1609660383308913679), - name: 'dateDeleted', - type: 10, - flags: 0), - obx_int.ModelProperty( - id: const obx_int.IdUid(25, 2054740103145852197), - name: 'style', - type: 6, - flags: 0), - obx_int.ModelProperty( - id: const obx_int.IdUid(26, 4203733486781204313), - name: 'lockChatName', - type: 1, - flags: 0), - obx_int.ModelProperty( - id: const obx_int.IdUid(27, 5967587520649064381), - name: 'lockChatIcon', - type: 1, - flags: 0), - obx_int.ModelProperty( - id: const obx_int.IdUid(28, 3841196368520260614), - name: 'lastReadMessageGuid', - type: 9, - flags: 0), - obx_int.ModelProperty( - id: const obx_int.IdUid(29, 419554443603699639), - name: 'groupVersion', - type: 6, - flags: 0), - obx_int.ModelProperty( - id: const obx_int.IdUid(30, 4623900363927990505), - name: 'usingHandle', - type: 9, - flags: 0), - obx_int.ModelProperty( - id: const obx_int.IdUid(31, 2890558203307402859), - name: 'apnTitle', - type: 9, - flags: 0), - obx_int.ModelProperty( - id: const obx_int.IdUid(32, 3790179132714024264), - name: 'isRpSms', - type: 1, - flags: 0), - obx_int.ModelProperty( - id: const obx_int.IdUid(33, 7747554395546158964), - name: 'guidRefs', - type: 30, - flags: 0), - obx_int.ModelProperty( - id: const obx_int.IdUid(34, 6743935942891315857), - name: 'telephonyId', - type: 6, - flags: 0), - obx_int.ModelProperty( - id: const obx_int.IdUid(35, 7774397079877699895), - name: 'textFieldAnnotations', - type: 9, - flags: 0), - obx_int.ModelProperty( - id: const obx_int.IdUid(36, 7143894652284556003), - name: 'shareZenMode', - type: 1, - flags: 0), - obx_int.ModelProperty( - id: const obx_int.IdUid(37, 420507915079790972), - name: 'notifsSilenced', - type: 1, - flags: 0), - obx_int.ModelProperty( - id: const obx_int.IdUid(38, 7629993644602445500), - name: 'dateNotifiedAnyways', - type: 10, - flags: 0), - obx_int.ModelProperty( - id: const obx_int.IdUid(39, 1450447556768339740), - name: 'zenModeIsShared', - type: 6, - flags: 0), - obx_int.ModelProperty( - id: const obx_int.IdUid(40, 5580492826274966240), - name: 'senderIsKnown', - type: 1, - flags: 0), - obx_int.ModelProperty( - id: const obx_int.IdUid(41, 7342392293130604386), - name: 'isRoutingStub', - type: 1, - flags: 0), - obx_int.ModelProperty( - id: const obx_int.IdUid(42, 4361624812823479978), - name: 'transcriptPosterPath', - type: 9, - flags: 0), - obx_int.ModelProperty( - id: const obx_int.IdUid(43, 9027611778744022691), - name: 'transcriptBackgroundVersion', - type: 6, - flags: 0), - obx_int.ModelProperty( - id: const obx_int.IdUid(44, 6303048169382671264), - name: 'cloudData', - type: 23, - flags: 0), - obx_int.ModelProperty( - id: const obx_int.IdUid(45, 3549423414997445177), - name: 'ckRecordId', - type: 9, - flags: 0), - obx_int.ModelProperty( - id: const obx_int.IdUid(46, 2938538298825979541), - name: 'ckSyncState', - type: 1, - flags: 0), - obx_int.ModelProperty( - id: const obx_int.IdUid(47, 3819874096338136746), - name: 'photoAttachmentGuid', - type: 9, - flags: 0), - obx_int.ModelProperty( - id: const obx_int.IdUid(48, 6101265134976618931), - name: 'cloudGuid', - type: 9, - flags: 0) - ], - relations: [ - obx_int.ModelRelation( - id: const obx_int.IdUid(1, 7492985733214117623), - name: 'handles', - targetId: const obx_int.IdUid(7, 1716592500251888002)) - ], - backlinks: [ - obx_int.ModelBacklink( - name: 'messages', srcEntity: 'Message', srcField: 'chat') - ]), + id: const obx_int.IdUid(3, 9017250848141753702), + name: 'Chat', + lastPropertyId: const obx_int.IdUid(48, 6101265134976618931), + flags: 0, + properties: [ + obx_int.ModelProperty( + id: const obx_int.IdUid(1, 297833828287439140), + name: 'id', + type: 6, + flags: 1, + ), + obx_int.ModelProperty( + id: const obx_int.IdUid(3, 318412581013308394), + name: 'guid', + type: 9, + flags: 40, + indexId: const obx_int.IdUid(2, 4712841847590882583), + ), + obx_int.ModelProperty( + id: const obx_int.IdUid(5, 9099706644901956287), + name: 'chatIdentifier', + type: 9, + flags: 0, + ), + obx_int.ModelProperty( + id: const obx_int.IdUid(6, 9117376896883192460), + name: 'isArchived', + type: 1, + flags: 0, + ), + obx_int.ModelProperty( + id: const obx_int.IdUid(8, 2937507201037513710), + name: 'muteType', + type: 9, + flags: 0, + ), + obx_int.ModelProperty( + id: const obx_int.IdUid(9, 3354772670242853270), + name: 'muteArgs', + type: 9, + flags: 0, + ), + obx_int.ModelProperty( + id: const obx_int.IdUid(10, 3734639758158862923), + name: 'isPinned', + type: 1, + flags: 0, + ), + obx_int.ModelProperty( + id: const obx_int.IdUid(11, 2937716363156975856), + name: 'hasUnreadMessage', + type: 1, + flags: 0, + ), + obx_int.ModelProperty( + id: const obx_int.IdUid(12, 526293286661780207), + name: 'dbOnlyLatestMessageDate', + type: 10, + flags: 0, + ), + obx_int.ModelProperty( + id: const obx_int.IdUid(15, 4266631519717388837), + name: 'title', + type: 9, + flags: 0, + ), + obx_int.ModelProperty( + id: const obx_int.IdUid(16, 1181486482872028222), + name: 'displayName', + type: 9, + flags: 0, + ), + obx_int.ModelProperty( + id: const obx_int.IdUid(18, 3666111733726849006), + name: 'customAvatarPath', + type: 9, + flags: 0, + ), + obx_int.ModelProperty( + id: const obx_int.IdUid(19, 4234470006262207812), + name: 'pinIndex', + type: 6, + flags: 0, + ), + obx_int.ModelProperty( + id: const obx_int.IdUid(20, 2695161584801983484), + name: 'autoSendReadReceipts', + type: 1, + flags: 0, + ), + obx_int.ModelProperty( + id: const obx_int.IdUid(21, 55197157095191277), + name: 'autoSendTypingIndicators', + type: 1, + flags: 0, + ), + obx_int.ModelProperty( + id: const obx_int.IdUid(22, 8357397541593794158), + name: 'textFieldText', + type: 9, + flags: 0, + ), + obx_int.ModelProperty( + id: const obx_int.IdUid(23, 7756745453707268462), + name: 'textFieldAttachments', + type: 30, + flags: 0, + ), + obx_int.ModelProperty( + id: const obx_int.IdUid(24, 1609660383308913679), + name: 'dateDeleted', + type: 10, + flags: 0, + ), + obx_int.ModelProperty( + id: const obx_int.IdUid(25, 2054740103145852197), + name: 'style', + type: 6, + flags: 0, + ), + obx_int.ModelProperty( + id: const obx_int.IdUid(26, 4203733486781204313), + name: 'lockChatName', + type: 1, + flags: 0, + ), + obx_int.ModelProperty( + id: const obx_int.IdUid(27, 5967587520649064381), + name: 'lockChatIcon', + type: 1, + flags: 0, + ), + obx_int.ModelProperty( + id: const obx_int.IdUid(28, 3841196368520260614), + name: 'lastReadMessageGuid', + type: 9, + flags: 0, + ), + obx_int.ModelProperty( + id: const obx_int.IdUid(29, 419554443603699639), + name: 'groupVersion', + type: 6, + flags: 0, + ), + obx_int.ModelProperty( + id: const obx_int.IdUid(30, 4623900363927990505), + name: 'usingHandle', + type: 9, + flags: 0, + ), + obx_int.ModelProperty( + id: const obx_int.IdUid(31, 2890558203307402859), + name: 'apnTitle', + type: 9, + flags: 0, + ), + obx_int.ModelProperty( + id: const obx_int.IdUid(32, 3790179132714024264), + name: 'isRpSms', + type: 1, + flags: 0, + ), + obx_int.ModelProperty( + id: const obx_int.IdUid(33, 7747554395546158964), + name: 'guidRefs', + type: 30, + flags: 0, + ), + obx_int.ModelProperty( + id: const obx_int.IdUid(34, 6743935942891315857), + name: 'telephonyId', + type: 6, + flags: 0, + ), + obx_int.ModelProperty( + id: const obx_int.IdUid(35, 7774397079877699895), + name: 'textFieldAnnotations', + type: 9, + flags: 0, + ), + obx_int.ModelProperty( + id: const obx_int.IdUid(36, 7143894652284556003), + name: 'shareZenMode', + type: 1, + flags: 0, + ), + obx_int.ModelProperty( + id: const obx_int.IdUid(37, 420507915079790972), + name: 'notifsSilenced', + type: 1, + flags: 0, + ), + obx_int.ModelProperty( + id: const obx_int.IdUid(38, 7629993644602445500), + name: 'dateNotifiedAnyways', + type: 10, + flags: 0, + ), + obx_int.ModelProperty( + id: const obx_int.IdUid(39, 1450447556768339740), + name: 'zenModeIsShared', + type: 6, + flags: 0, + ), + obx_int.ModelProperty( + id: const obx_int.IdUid(40, 5580492826274966240), + name: 'senderIsKnown', + type: 1, + flags: 0, + ), + obx_int.ModelProperty( + id: const obx_int.IdUid(41, 7342392293130604386), + name: 'isRoutingStub', + type: 1, + flags: 0, + ), + obx_int.ModelProperty( + id: const obx_int.IdUid(42, 4361624812823479978), + name: 'transcriptPosterPath', + type: 9, + flags: 0, + ), + obx_int.ModelProperty( + id: const obx_int.IdUid(43, 9027611778744022691), + name: 'transcriptBackgroundVersion', + type: 6, + flags: 0, + ), + obx_int.ModelProperty( + id: const obx_int.IdUid(44, 6303048169382671264), + name: 'cloudData', + type: 23, + flags: 0, + ), + obx_int.ModelProperty( + id: const obx_int.IdUid(45, 3549423414997445177), + name: 'ckRecordId', + type: 9, + flags: 0, + ), + obx_int.ModelProperty( + id: const obx_int.IdUid(46, 2938538298825979541), + name: 'ckSyncState', + type: 1, + flags: 0, + ), + obx_int.ModelProperty( + id: const obx_int.IdUid(47, 3819874096338136746), + name: 'photoAttachmentGuid', + type: 9, + flags: 0, + ), + obx_int.ModelProperty( + id: const obx_int.IdUid(48, 6101265134976618931), + name: 'cloudGuid', + type: 9, + flags: 0, + ), + ], + relations: [ + obx_int.ModelRelation( + id: const obx_int.IdUid(1, 7492985733214117623), + name: 'handles', + targetId: const obx_int.IdUid(7, 1716592500251888002), + ), + ], + backlinks: [ + obx_int.ModelBacklink( + name: 'messages', + srcEntity: 'Message', + srcField: 'chat', + ), + ], + ), obx_int.ModelEntity( - id: const obx_int.IdUid(6, 5390756932993878582), - name: 'FCMData', - lastPropertyId: const obx_int.IdUid(7, 4724783625435560776), - flags: 0, - properties: [ - obx_int.ModelProperty( - id: const obx_int.IdUid(1, 843767696595301490), - name: 'id', - type: 6, - flags: 1), - obx_int.ModelProperty( - id: const obx_int.IdUid(2, 4393840145875077709), - name: 'projectID', - type: 9, - flags: 0), - obx_int.ModelProperty( - id: const obx_int.IdUid(3, 7264245173656870052), - name: 'storageBucket', - type: 9, - flags: 0), - obx_int.ModelProperty( - id: const obx_int.IdUid(4, 3998672972942379984), - name: 'apiKey', - type: 9, - flags: 0), - obx_int.ModelProperty( - id: const obx_int.IdUid(5, 3295687739104688136), - name: 'firebaseURL', - type: 9, - flags: 0), - obx_int.ModelProperty( - id: const obx_int.IdUid(6, 8856592728926530171), - name: 'clientID', - type: 9, - flags: 0), - obx_int.ModelProperty( - id: const obx_int.IdUid(7, 4724783625435560776), - name: 'applicationID', - type: 9, - flags: 0) - ], - relations: [], - backlinks: []), + id: const obx_int.IdUid(6, 5390756932993878582), + name: 'FCMData', + lastPropertyId: const obx_int.IdUid(7, 4724783625435560776), + flags: 0, + properties: [ + obx_int.ModelProperty( + id: const obx_int.IdUid(1, 843767696595301490), + name: 'id', + type: 6, + flags: 1, + ), + obx_int.ModelProperty( + id: const obx_int.IdUid(2, 4393840145875077709), + name: 'projectID', + type: 9, + flags: 0, + ), + obx_int.ModelProperty( + id: const obx_int.IdUid(3, 7264245173656870052), + name: 'storageBucket', + type: 9, + flags: 0, + ), + obx_int.ModelProperty( + id: const obx_int.IdUid(4, 3998672972942379984), + name: 'apiKey', + type: 9, + flags: 0, + ), + obx_int.ModelProperty( + id: const obx_int.IdUid(5, 3295687739104688136), + name: 'firebaseURL', + type: 9, + flags: 0, + ), + obx_int.ModelProperty( + id: const obx_int.IdUid(6, 8856592728926530171), + name: 'clientID', + type: 9, + flags: 0, + ), + obx_int.ModelProperty( + id: const obx_int.IdUid(7, 4724783625435560776), + name: 'applicationID', + type: 9, + flags: 0, + ), + ], + relations: [], + backlinks: [], + ), obx_int.ModelEntity( - id: const obx_int.IdUid(7, 1716592500251888002), - name: 'Handle', - lastPropertyId: const obx_int.IdUid(15, 3522348185317901483), - flags: 0, - properties: [ - obx_int.ModelProperty( - id: const obx_int.IdUid(1, 683096758365457558), - name: 'id', - type: 6, - flags: 1), - obx_int.ModelProperty( - id: const obx_int.IdUid(2, 191994702917313644), - name: 'originalROWID', - type: 6, - flags: 0), - obx_int.ModelProperty( - id: const obx_int.IdUid(3, 2544513926695389102), - name: 'address', - type: 9, - flags: 0), - obx_int.ModelProperty( - id: const obx_int.IdUid(4, 8884526609844353946), - name: 'country', - type: 9, - flags: 0), - obx_int.ModelProperty( - id: const obx_int.IdUid(5, 3522974353771163433), - name: 'color', - type: 9, - flags: 0), - obx_int.ModelProperty( - id: const obx_int.IdUid(6, 57094839621772204), - name: 'defaultPhone', - type: 9, - flags: 0), - obx_int.ModelProperty( - id: const obx_int.IdUid(8, 9192015144235467286), - name: 'defaultEmail', - type: 9, - flags: 0), - obx_int.ModelProperty( - id: const obx_int.IdUid(9, 7485620678567449081), - name: 'formattedAddress', - type: 9, - flags: 0), - obx_int.ModelProperty( - id: const obx_int.IdUid(11, 6784884866959942259), - name: 'contactRelationId', - type: 11, - flags: 520, - indexId: const obx_int.IdUid(14, 1213475652575340910), - relationTarget: 'Contact'), - obx_int.ModelProperty( - id: const obx_int.IdUid(12, 7288262795934250307), - name: 'uniqueAddressAndService', - type: 9, - flags: 2080, - indexId: const obx_int.IdUid(15, 2647319022047266708)), - obx_int.ModelProperty( - id: const obx_int.IdUid(13, 2987973275926761435), - name: 'service', - type: 9, - flags: 0), - obx_int.ModelProperty( - id: const obx_int.IdUid(14, 7319540363051031629), - name: 'posterPath', - type: 9, - flags: 0), - obx_int.ModelProperty( - id: const obx_int.IdUid(15, 3522348185317901483), - name: 'blocked', - type: 1, - flags: 0) - ], - relations: [], - backlinks: []), + id: const obx_int.IdUid(7, 1716592500251888002), + name: 'Handle', + lastPropertyId: const obx_int.IdUid(15, 3522348185317901483), + flags: 0, + properties: [ + obx_int.ModelProperty( + id: const obx_int.IdUid(1, 683096758365457558), + name: 'id', + type: 6, + flags: 1, + ), + obx_int.ModelProperty( + id: const obx_int.IdUid(2, 191994702917313644), + name: 'originalROWID', + type: 6, + flags: 0, + ), + obx_int.ModelProperty( + id: const obx_int.IdUid(3, 2544513926695389102), + name: 'address', + type: 9, + flags: 0, + ), + obx_int.ModelProperty( + id: const obx_int.IdUid(4, 8884526609844353946), + name: 'country', + type: 9, + flags: 0, + ), + obx_int.ModelProperty( + id: const obx_int.IdUid(5, 3522974353771163433), + name: 'color', + type: 9, + flags: 0, + ), + obx_int.ModelProperty( + id: const obx_int.IdUid(6, 57094839621772204), + name: 'defaultPhone', + type: 9, + flags: 0, + ), + obx_int.ModelProperty( + id: const obx_int.IdUid(8, 9192015144235467286), + name: 'defaultEmail', + type: 9, + flags: 0, + ), + obx_int.ModelProperty( + id: const obx_int.IdUid(9, 7485620678567449081), + name: 'formattedAddress', + type: 9, + flags: 0, + ), + obx_int.ModelProperty( + id: const obx_int.IdUid(11, 6784884866959942259), + name: 'contactRelationId', + type: 11, + flags: 520, + indexId: const obx_int.IdUid(14, 1213475652575340910), + relationField: 'contactRelation', + relationTarget: 'Contact', + ), + obx_int.ModelProperty( + id: const obx_int.IdUid(12, 7288262795934250307), + name: 'uniqueAddressAndService', + type: 9, + flags: 2080, + indexId: const obx_int.IdUid(15, 2647319022047266708), + ), + obx_int.ModelProperty( + id: const obx_int.IdUid(13, 2987973275926761435), + name: 'service', + type: 9, + flags: 0, + ), + obx_int.ModelProperty( + id: const obx_int.IdUid(14, 7319540363051031629), + name: 'posterPath', + type: 9, + flags: 0, + ), + obx_int.ModelProperty( + id: const obx_int.IdUid(15, 3522348185317901483), + name: 'blocked', + type: 1, + flags: 0, + ), + ], + relations: [], + backlinks: [], + ), obx_int.ModelEntity( - id: const obx_int.IdUid(10, 7380334062783734091), - name: 'ThemeEntry', - lastPropertyId: const obx_int.IdUid(8, 4809686302323910258), - flags: 0, - properties: [ - obx_int.ModelProperty( - id: const obx_int.IdUid(1, 3364349183457626105), - name: 'id', - type: 6, - flags: 1), - obx_int.ModelProperty( - id: const obx_int.IdUid(2, 378260260370164099), - name: 'themeId', - type: 6, - flags: 0), - obx_int.ModelProperty( - id: const obx_int.IdUid(3, 1711484628702995090), - name: 'name', - type: 9, - flags: 0), - obx_int.ModelProperty( - id: const obx_int.IdUid(4, 5820153989252425651), - name: 'isFont', - type: 1, - flags: 0), - obx_int.ModelProperty( - id: const obx_int.IdUid(5, 357044983311472123), - name: 'fontSize', - type: 6, - flags: 0), - obx_int.ModelProperty( - id: const obx_int.IdUid(6, 205399809771216750), - name: 'dbColor', - type: 9, - flags: 0), - obx_int.ModelProperty( - id: const obx_int.IdUid(7, 2424613981822393823), - name: 'fontWeight', - type: 6, - flags: 0), - obx_int.ModelProperty( - id: const obx_int.IdUid(8, 4809686302323910258), - name: 'themeObjectId', - type: 11, - flags: 520, - indexId: const obx_int.IdUid(10, 9160679880876705382), - relationTarget: 'ThemeObject') - ], - relations: [], - backlinks: []), + id: const obx_int.IdUid(10, 7380334062783734091), + name: 'ThemeEntry', + lastPropertyId: const obx_int.IdUid(8, 4809686302323910258), + flags: 0, + properties: [ + obx_int.ModelProperty( + id: const obx_int.IdUid(1, 3364349183457626105), + name: 'id', + type: 6, + flags: 1, + ), + obx_int.ModelProperty( + id: const obx_int.IdUid(2, 378260260370164099), + name: 'themeId', + type: 6, + flags: 0, + ), + obx_int.ModelProperty( + id: const obx_int.IdUid(3, 1711484628702995090), + name: 'name', + type: 9, + flags: 0, + ), + obx_int.ModelProperty( + id: const obx_int.IdUid(4, 5820153989252425651), + name: 'isFont', + type: 1, + flags: 0, + ), + obx_int.ModelProperty( + id: const obx_int.IdUid(5, 357044983311472123), + name: 'fontSize', + type: 6, + flags: 0, + ), + obx_int.ModelProperty( + id: const obx_int.IdUid(6, 205399809771216750), + name: 'dbColor', + type: 9, + flags: 0, + ), + obx_int.ModelProperty( + id: const obx_int.IdUid(7, 2424613981822393823), + name: 'fontWeight', + type: 6, + flags: 0, + ), + obx_int.ModelProperty( + id: const obx_int.IdUid(8, 4809686302323910258), + name: 'themeObjectId', + type: 11, + flags: 520, + indexId: const obx_int.IdUid(10, 9160679880876705382), + relationField: 'themeObject', + relationTarget: 'ThemeObject', + ), + ], + relations: [], + backlinks: [], + ), obx_int.ModelEntity( - id: const obx_int.IdUid(13, 4148278195232901830), - name: 'Message', - lastPropertyId: const obx_int.IdUid(59, 8549583242275112644), - flags: 0, - properties: [ - obx_int.ModelProperty( - id: const obx_int.IdUid(1, 2871568629586737055), - name: 'id', - type: 6, - flags: 1), - obx_int.ModelProperty( - id: const obx_int.IdUid(2, 1582361484724166619), - name: 'originalROWID', - type: 6, - flags: 0), - obx_int.ModelProperty( - id: const obx_int.IdUid(3, 8669586978455730639), - name: 'guid', - type: 9, - flags: 40, - indexId: const obx_int.IdUid(6, 4451778671291639024)), - obx_int.ModelProperty( - id: const obx_int.IdUid(4, 9142895361605464091), - name: 'handleId', - type: 6, - flags: 0), - obx_int.ModelProperty( - id: const obx_int.IdUid(5, 7874018753129857845), - name: 'otherHandle', - type: 6, - flags: 0), - obx_int.ModelProperty( - id: const obx_int.IdUid(6, 4547092920121180060), - name: 'text', - type: 9, - flags: 0), - obx_int.ModelProperty( - id: const obx_int.IdUid(7, 2233028199063732172), - name: 'subject', - type: 9, - flags: 0), - obx_int.ModelProperty( - id: const obx_int.IdUid(8, 3994409138392851632), - name: 'country', - type: 9, - flags: 0), - obx_int.ModelProperty( - id: const obx_int.IdUid(9, 5531207057664871058), - name: 'dateCreated', - type: 10, - flags: 8, - indexId: const obx_int.IdUid(16, 4323200293672047337)), - obx_int.ModelProperty( - id: const obx_int.IdUid(10, 3811604236432549817), - name: 'dateRead', - type: 10, - flags: 0), - obx_int.ModelProperty( - id: const obx_int.IdUid(11, 7356445736232735146), - name: 'dateDelivered', - type: 10, - flags: 0), - obx_int.ModelProperty( - id: const obx_int.IdUid(12, 626638148258506930), - name: 'isFromMe', - type: 1, - flags: 0), - obx_int.ModelProperty( - id: const obx_int.IdUid(19, 5938275663538454436), - name: 'hasDdResults', - type: 1, - flags: 0), - obx_int.ModelProperty( - id: const obx_int.IdUid(22, 8082781591108942969), - name: 'datePlayed', - type: 10, - flags: 0), - obx_int.ModelProperty( - id: const obx_int.IdUid(23, 7621327072355688575), - name: 'itemType', - type: 6, - flags: 0), - obx_int.ModelProperty( - id: const obx_int.IdUid(24, 7649146516477763838), - name: 'groupTitle', - type: 9, - flags: 0), - obx_int.ModelProperty( - id: const obx_int.IdUid(25, 1515848557190125128), - name: 'groupActionType', - type: 6, - flags: 0), - obx_int.ModelProperty( - id: const obx_int.IdUid(27, 4765948580516232913), - name: 'balloonBundleId', - type: 9, - flags: 0), - obx_int.ModelProperty( - id: const obx_int.IdUid(28, 8696985708980146227), - name: 'associatedMessageGuid', - type: 9, - flags: 0), - obx_int.ModelProperty( - id: const obx_int.IdUid(29, 574575341112766208), - name: 'associatedMessageType', - type: 9, - flags: 0), - obx_int.ModelProperty( - id: const obx_int.IdUid(30, 7125401610778464945), - name: 'expressiveSendStyleId', - type: 9, - flags: 0), - obx_int.ModelProperty( - id: const obx_int.IdUid(32, 397296906153054772), - name: 'hasAttachments', - type: 1, - flags: 0), - obx_int.ModelProperty( - id: const obx_int.IdUid(33, 3092611940313786692), - name: 'hasReactions', - type: 1, - flags: 0), - obx_int.ModelProperty( - id: const obx_int.IdUid(34, 3672248506437712660), - name: 'dateDeleted', - type: 10, - flags: 0), - obx_int.ModelProperty( - id: const obx_int.IdUid(35, 5022296267274326910), - name: 'threadOriginatorGuid', - type: 9, - flags: 0), - obx_int.ModelProperty( - id: const obx_int.IdUid(36, 2742958821028567046), - name: 'threadOriginatorPart', - type: 9, - flags: 0), - obx_int.ModelProperty( - id: const obx_int.IdUid(37, 5359949882738167432), - name: 'bigEmoji', - type: 1, - flags: 0), - obx_int.ModelProperty( - id: const obx_int.IdUid(38, 2993306046047010488), - name: 'error', - type: 6, - flags: 0), - obx_int.ModelProperty( - id: const obx_int.IdUid(39, 1372898255926257108), - name: 'chatId', - type: 11, - flags: 520, - indexId: const obx_int.IdUid(9, 1947853053588120767), - relationTarget: 'Chat'), - obx_int.ModelProperty( - id: const obx_int.IdUid(40, 5039085638407799291), - name: 'dbAttributedBody', - type: 9, - flags: 0), - obx_int.ModelProperty( - id: const obx_int.IdUid(41, 4740279940509235463), - name: 'associatedMessagePart', - type: 6, - flags: 0), - obx_int.ModelProperty( - id: const obx_int.IdUid(42, 5528059355711105816), - name: 'hasApplePayloadData', - type: 1, - flags: 0), - obx_int.ModelProperty( - id: const obx_int.IdUid(43, 3013626603452809145), - name: 'dateEdited', - type: 10, - flags: 0), - obx_int.ModelProperty( - id: const obx_int.IdUid(44, 317511503043460053), - name: 'dbMessageSummaryInfo', - type: 9, - flags: 0), - obx_int.ModelProperty( - id: const obx_int.IdUid(45, 9157460167218193355), - name: 'dbPayloadData', - type: 9, - flags: 0), - obx_int.ModelProperty( - id: const obx_int.IdUid(46, 55112057161128513), - name: 'dbMetadata', - type: 9, - flags: 0), - obx_int.ModelProperty( - id: const obx_int.IdUid(47, 2946661728932667087), - name: 'wasDeliveredQuietly', - type: 1, - flags: 0), - obx_int.ModelProperty( - id: const obx_int.IdUid(48, 8353240741127563871), - name: 'didNotifyRecipient', - type: 1, - flags: 0), - obx_int.ModelProperty( - id: const obx_int.IdUid(49, 4357660909480898880), - name: 'isBookmarked', - type: 1, - flags: 0), - obx_int.ModelProperty( - id: const obx_int.IdUid(50, 6516059048310614016), - name: 'hasBeenForwarded', - type: 1, - flags: 0), - obx_int.ModelProperty( - id: const obx_int.IdUid(51, 2206983384887094884), - name: 'stagingGuid', - type: 9, - flags: 0), - obx_int.ModelProperty( - id: const obx_int.IdUid(52, 2416690828698123601), - name: 'amkSessionId', - type: 9, - flags: 0), - obx_int.ModelProperty( - id: const obx_int.IdUid(53, 2179513762379822209), - name: 'isDelivered', - type: 1, - flags: 0), - obx_int.ModelProperty( - id: const obx_int.IdUid(54, 684200636816633360), - name: 'verificationFailed', - type: 1, - flags: 0), - obx_int.ModelProperty( - id: const obx_int.IdUid(55, 5249321850957672701), - name: 'sendingServiceId', - type: 9, - flags: 0), - obx_int.ModelProperty( - id: const obx_int.IdUid(56, 1614237679156627573), - name: 'associatedMessageEmoji', - type: 9, - flags: 0), - obx_int.ModelProperty( - id: const obx_int.IdUid(57, 5276795239995260938), - name: 'dateScheduled', - type: 10, - flags: 0), - obx_int.ModelProperty( - id: const obx_int.IdUid(58, 5464844875358527751), - name: 'ckRecordId', - type: 9, - flags: 0), - obx_int.ModelProperty( - id: const obx_int.IdUid(59, 8549583242275112644), - name: 'ckSyncState', - type: 1, - flags: 0) - ], - relations: [], - backlinks: [ - obx_int.ModelBacklink( - name: 'dbAttachments', srcEntity: 'Attachment', srcField: 'message') - ]), + id: const obx_int.IdUid(13, 4148278195232901830), + name: 'Message', + lastPropertyId: const obx_int.IdUid(60, 2236183729631725046), + flags: 0, + properties: [ + obx_int.ModelProperty( + id: const obx_int.IdUid(1, 2871568629586737055), + name: 'id', + type: 6, + flags: 1, + ), + obx_int.ModelProperty( + id: const obx_int.IdUid(2, 1582361484724166619), + name: 'originalROWID', + type: 6, + flags: 0, + ), + obx_int.ModelProperty( + id: const obx_int.IdUid(3, 8669586978455730639), + name: 'guid', + type: 9, + flags: 40, + indexId: const obx_int.IdUid(6, 4451778671291639024), + ), + obx_int.ModelProperty( + id: const obx_int.IdUid(4, 9142895361605464091), + name: 'handleId', + type: 6, + flags: 0, + ), + obx_int.ModelProperty( + id: const obx_int.IdUid(5, 7874018753129857845), + name: 'otherHandle', + type: 6, + flags: 0, + ), + obx_int.ModelProperty( + id: const obx_int.IdUid(6, 4547092920121180060), + name: 'text', + type: 9, + flags: 0, + ), + obx_int.ModelProperty( + id: const obx_int.IdUid(7, 2233028199063732172), + name: 'subject', + type: 9, + flags: 0, + ), + obx_int.ModelProperty( + id: const obx_int.IdUid(8, 3994409138392851632), + name: 'country', + type: 9, + flags: 0, + ), + obx_int.ModelProperty( + id: const obx_int.IdUid(9, 5531207057664871058), + name: 'dateCreated', + type: 10, + flags: 8, + indexId: const obx_int.IdUid(16, 4323200293672047337), + ), + obx_int.ModelProperty( + id: const obx_int.IdUid(10, 3811604236432549817), + name: 'dateRead', + type: 10, + flags: 0, + ), + obx_int.ModelProperty( + id: const obx_int.IdUid(11, 7356445736232735146), + name: 'dateDelivered', + type: 10, + flags: 0, + ), + obx_int.ModelProperty( + id: const obx_int.IdUid(12, 626638148258506930), + name: 'isFromMe', + type: 1, + flags: 0, + ), + obx_int.ModelProperty( + id: const obx_int.IdUid(19, 5938275663538454436), + name: 'hasDdResults', + type: 1, + flags: 0, + ), + obx_int.ModelProperty( + id: const obx_int.IdUid(22, 8082781591108942969), + name: 'datePlayed', + type: 10, + flags: 0, + ), + obx_int.ModelProperty( + id: const obx_int.IdUid(23, 7621327072355688575), + name: 'itemType', + type: 6, + flags: 0, + ), + obx_int.ModelProperty( + id: const obx_int.IdUid(24, 7649146516477763838), + name: 'groupTitle', + type: 9, + flags: 0, + ), + obx_int.ModelProperty( + id: const obx_int.IdUid(25, 1515848557190125128), + name: 'groupActionType', + type: 6, + flags: 0, + ), + obx_int.ModelProperty( + id: const obx_int.IdUid(27, 4765948580516232913), + name: 'balloonBundleId', + type: 9, + flags: 0, + ), + obx_int.ModelProperty( + id: const obx_int.IdUid(28, 8696985708980146227), + name: 'associatedMessageGuid', + type: 9, + flags: 0, + ), + obx_int.ModelProperty( + id: const obx_int.IdUid(29, 574575341112766208), + name: 'associatedMessageType', + type: 9, + flags: 0, + ), + obx_int.ModelProperty( + id: const obx_int.IdUid(30, 7125401610778464945), + name: 'expressiveSendStyleId', + type: 9, + flags: 0, + ), + obx_int.ModelProperty( + id: const obx_int.IdUid(32, 397296906153054772), + name: 'hasAttachments', + type: 1, + flags: 0, + ), + obx_int.ModelProperty( + id: const obx_int.IdUid(33, 3092611940313786692), + name: 'hasReactions', + type: 1, + flags: 0, + ), + obx_int.ModelProperty( + id: const obx_int.IdUid(34, 3672248506437712660), + name: 'dateDeleted', + type: 10, + flags: 0, + ), + obx_int.ModelProperty( + id: const obx_int.IdUid(35, 5022296267274326910), + name: 'threadOriginatorGuid', + type: 9, + flags: 0, + ), + obx_int.ModelProperty( + id: const obx_int.IdUid(36, 2742958821028567046), + name: 'threadOriginatorPart', + type: 9, + flags: 0, + ), + obx_int.ModelProperty( + id: const obx_int.IdUid(37, 5359949882738167432), + name: 'bigEmoji', + type: 1, + flags: 0, + ), + obx_int.ModelProperty( + id: const obx_int.IdUid(38, 2993306046047010488), + name: 'error', + type: 6, + flags: 0, + ), + obx_int.ModelProperty( + id: const obx_int.IdUid(39, 1372898255926257108), + name: 'chatId', + type: 11, + flags: 520, + indexId: const obx_int.IdUid(9, 1947853053588120767), + relationField: 'chat', + relationTarget: 'Chat', + ), + obx_int.ModelProperty( + id: const obx_int.IdUid(40, 5039085638407799291), + name: 'dbAttributedBody', + type: 9, + flags: 0, + ), + obx_int.ModelProperty( + id: const obx_int.IdUid(41, 4740279940509235463), + name: 'associatedMessagePart', + type: 6, + flags: 0, + ), + obx_int.ModelProperty( + id: const obx_int.IdUid(42, 5528059355711105816), + name: 'hasApplePayloadData', + type: 1, + flags: 0, + ), + obx_int.ModelProperty( + id: const obx_int.IdUid(43, 3013626603452809145), + name: 'dateEdited', + type: 10, + flags: 0, + ), + obx_int.ModelProperty( + id: const obx_int.IdUid(44, 317511503043460053), + name: 'dbMessageSummaryInfo', + type: 9, + flags: 0, + ), + obx_int.ModelProperty( + id: const obx_int.IdUid(45, 9157460167218193355), + name: 'dbPayloadData', + type: 9, + flags: 0, + ), + obx_int.ModelProperty( + id: const obx_int.IdUid(46, 55112057161128513), + name: 'dbMetadata', + type: 9, + flags: 0, + ), + obx_int.ModelProperty( + id: const obx_int.IdUid(47, 2946661728932667087), + name: 'wasDeliveredQuietly', + type: 1, + flags: 0, + ), + obx_int.ModelProperty( + id: const obx_int.IdUid(48, 8353240741127563871), + name: 'didNotifyRecipient', + type: 1, + flags: 0, + ), + obx_int.ModelProperty( + id: const obx_int.IdUid(49, 4357660909480898880), + name: 'isBookmarked', + type: 1, + flags: 0, + ), + obx_int.ModelProperty( + id: const obx_int.IdUid(50, 6516059048310614016), + name: 'hasBeenForwarded', + type: 1, + flags: 0, + ), + obx_int.ModelProperty( + id: const obx_int.IdUid(51, 2206983384887094884), + name: 'stagingGuid', + type: 9, + flags: 0, + ), + obx_int.ModelProperty( + id: const obx_int.IdUid(52, 2416690828698123601), + name: 'amkSessionId', + type: 9, + flags: 0, + ), + obx_int.ModelProperty( + id: const obx_int.IdUid(53, 2179513762379822209), + name: 'isDelivered', + type: 1, + flags: 0, + ), + obx_int.ModelProperty( + id: const obx_int.IdUid(54, 684200636816633360), + name: 'verificationFailed', + type: 1, + flags: 0, + ), + obx_int.ModelProperty( + id: const obx_int.IdUid(55, 5249321850957672701), + name: 'sendingServiceId', + type: 9, + flags: 0, + ), + obx_int.ModelProperty( + id: const obx_int.IdUid(56, 1614237679156627573), + name: 'associatedMessageEmoji', + type: 9, + flags: 0, + ), + obx_int.ModelProperty( + id: const obx_int.IdUid(57, 5276795239995260938), + name: 'dateScheduled', + type: 10, + flags: 0, + ), + obx_int.ModelProperty( + id: const obx_int.IdUid(58, 5464844875358527751), + name: 'ckRecordId', + type: 9, + flags: 0, + ), + obx_int.ModelProperty( + id: const obx_int.IdUid(59, 8549583242275112644), + name: 'ckSyncState', + type: 1, + flags: 0, + ), + obx_int.ModelProperty( + id: const obx_int.IdUid(60, 2236183729631725046), + name: 'metadata', + type: 13, + flags: 0, + ), + ], + relations: [], + backlinks: [ + obx_int.ModelBacklink( + name: 'dbAttachments', + srcEntity: 'Attachment', + srcField: 'message', + ), + ], + ), obx_int.ModelEntity( - id: const obx_int.IdUid(15, 7753273527865539946), - name: 'ThemeObject', - lastPropertyId: const obx_int.IdUid(7, 7718171125722310355), - flags: 0, - properties: [ - obx_int.ModelProperty( - id: const obx_int.IdUid(1, 7682268131019867778), - name: 'id', - type: 6, - flags: 1), - obx_int.ModelProperty( - id: const obx_int.IdUid(2, 3805851416487185429), - name: 'name', - type: 9, - flags: 2080, - indexId: const obx_int.IdUid(7, 6926665461572101158)), - obx_int.ModelProperty( - id: const obx_int.IdUid(3, 621312794123477095), - name: 'selectedLightTheme', - type: 1, - flags: 0), - obx_int.ModelProperty( - id: const obx_int.IdUid(4, 2380808371075786065), - name: 'selectedDarkTheme', - type: 1, - flags: 0), - obx_int.ModelProperty( - id: const obx_int.IdUid(5, 7474338997382293502), - name: 'gradientBg', - type: 1, - flags: 0), - obx_int.ModelProperty( - id: const obx_int.IdUid(6, 7459499326275659791), - name: 'previousLightTheme', - type: 1, - flags: 0), - obx_int.ModelProperty( - id: const obx_int.IdUid(7, 7718171125722310355), - name: 'previousDarkTheme', - type: 1, - flags: 0) - ], - relations: [], - backlinks: [ - obx_int.ModelBacklink( - name: 'themeEntries', - srcEntity: 'ThemeEntry', - srcField: 'themeObject') - ]), + id: const obx_int.IdUid(15, 7753273527865539946), + name: 'ThemeObject', + lastPropertyId: const obx_int.IdUid(7, 7718171125722310355), + flags: 0, + properties: [ + obx_int.ModelProperty( + id: const obx_int.IdUid(1, 7682268131019867778), + name: 'id', + type: 6, + flags: 1, + ), + obx_int.ModelProperty( + id: const obx_int.IdUid(2, 3805851416487185429), + name: 'name', + type: 9, + flags: 2080, + indexId: const obx_int.IdUid(7, 6926665461572101158), + ), + obx_int.ModelProperty( + id: const obx_int.IdUid(3, 621312794123477095), + name: 'selectedLightTheme', + type: 1, + flags: 0, + ), + obx_int.ModelProperty( + id: const obx_int.IdUid(4, 2380808371075786065), + name: 'selectedDarkTheme', + type: 1, + flags: 0, + ), + obx_int.ModelProperty( + id: const obx_int.IdUid(5, 7474338997382293502), + name: 'gradientBg', + type: 1, + flags: 0, + ), + obx_int.ModelProperty( + id: const obx_int.IdUid(6, 7459499326275659791), + name: 'previousLightTheme', + type: 1, + flags: 0, + ), + obx_int.ModelProperty( + id: const obx_int.IdUid(7, 7718171125722310355), + name: 'previousDarkTheme', + type: 1, + flags: 0, + ), + ], + relations: [], + backlinks: [ + obx_int.ModelBacklink( + name: 'themeEntries', + srcEntity: 'ThemeEntry', + srcField: 'themeObject', + ), + ], + ), obx_int.ModelEntity( - id: const obx_int.IdUid(16, 1815690088052698449), - name: 'ThemeStruct', - lastPropertyId: const obx_int.IdUid(5, 5263969220071020408), - flags: 0, - properties: [ - obx_int.ModelProperty( - id: const obx_int.IdUid(1, 7043518911115753096), - name: 'id', - type: 6, - flags: 1), - obx_int.ModelProperty( - id: const obx_int.IdUid(2, 6644283342768530799), - name: 'name', - type: 9, - flags: 2080, - indexId: const obx_int.IdUid(11, 8452066780532720626)), - obx_int.ModelProperty( - id: const obx_int.IdUid(3, 8412087896868925153), - name: 'gradientBg', - type: 1, - flags: 0), - obx_int.ModelProperty( - id: const obx_int.IdUid(4, 1129102363347301238), - name: 'dbThemeData', - type: 9, - flags: 0), - obx_int.ModelProperty( - id: const obx_int.IdUid(5, 5263969220071020408), - name: 'googleFont', - type: 9, - flags: 0) - ], - relations: [], - backlinks: []), + id: const obx_int.IdUid(16, 1815690088052698449), + name: 'ThemeStruct', + lastPropertyId: const obx_int.IdUid(5, 5263969220071020408), + flags: 0, + properties: [ + obx_int.ModelProperty( + id: const obx_int.IdUid(1, 7043518911115753096), + name: 'id', + type: 6, + flags: 1, + ), + obx_int.ModelProperty( + id: const obx_int.IdUid(2, 6644283342768530799), + name: 'name', + type: 9, + flags: 2080, + indexId: const obx_int.IdUid(11, 8452066780532720626), + ), + obx_int.ModelProperty( + id: const obx_int.IdUid(3, 8412087896868925153), + name: 'gradientBg', + type: 1, + flags: 0, + ), + obx_int.ModelProperty( + id: const obx_int.IdUid(4, 1129102363347301238), + name: 'dbThemeData', + type: 9, + flags: 0, + ), + obx_int.ModelProperty( + id: const obx_int.IdUid(5, 5263969220071020408), + name: 'googleFont', + type: 9, + flags: 0, + ), + ], + relations: [], + backlinks: [], + ), obx_int.ModelEntity( - id: const obx_int.IdUid(17, 2547083341603323785), - name: 'Contact', - lastPropertyId: const obx_int.IdUid(13, 6585143364094241703), - flags: 0, - properties: [ - obx_int.ModelProperty( - id: const obx_int.IdUid(1, 755766469677376751), - name: 'dbId', - type: 6, - flags: 1), - obx_int.ModelProperty( - id: const obx_int.IdUid(2, 708918913606465689), - name: 'id', - type: 9, - flags: 2048, - indexId: const obx_int.IdUid(12, 8665353868334070555)), - obx_int.ModelProperty( - id: const obx_int.IdUid(3, 3572501485957552445), - name: 'displayName', - type: 9, - flags: 0), - obx_int.ModelProperty( - id: const obx_int.IdUid(4, 4938259396546143140), - name: 'phones', - type: 30, - flags: 0), - obx_int.ModelProperty( - id: const obx_int.IdUid(6, 2909427687923431080), - name: 'emails', - type: 30, - flags: 0), - obx_int.ModelProperty( - id: const obx_int.IdUid(8, 765867408744391809), - name: 'avatar', - type: 23, - flags: 0), - obx_int.ModelProperty( - id: const obx_int.IdUid(10, 3612117664568604198), - name: 'dbStructuredName', - type: 9, - flags: 0), - obx_int.ModelProperty( - id: const obx_int.IdUid(11, 3140177684889918471), - name: 'isShared', - type: 1, - flags: 0), - obx_int.ModelProperty( - id: const obx_int.IdUid(12, 761555548860852325), - name: 'isDismissed', - type: 1, - flags: 0), - obx_int.ModelProperty( - id: const obx_int.IdUid(13, 6585143364094241703), - name: 'posterPath', - type: 9, - flags: 0) - ], - relations: [], - backlinks: []) + id: const obx_int.IdUid(17, 2547083341603323785), + name: 'Contact', + lastPropertyId: const obx_int.IdUid(13, 6585143364094241703), + flags: 0, + properties: [ + obx_int.ModelProperty( + id: const obx_int.IdUid(1, 755766469677376751), + name: 'dbId', + type: 6, + flags: 1, + ), + obx_int.ModelProperty( + id: const obx_int.IdUid(2, 708918913606465689), + name: 'id', + type: 9, + flags: 2048, + indexId: const obx_int.IdUid(12, 8665353868334070555), + ), + obx_int.ModelProperty( + id: const obx_int.IdUid(3, 3572501485957552445), + name: 'displayName', + type: 9, + flags: 0, + ), + obx_int.ModelProperty( + id: const obx_int.IdUid(4, 4938259396546143140), + name: 'phones', + type: 30, + flags: 0, + ), + obx_int.ModelProperty( + id: const obx_int.IdUid(6, 2909427687923431080), + name: 'emails', + type: 30, + flags: 0, + ), + obx_int.ModelProperty( + id: const obx_int.IdUid(8, 765867408744391809), + name: 'avatar', + type: 23, + flags: 0, + ), + obx_int.ModelProperty( + id: const obx_int.IdUid(10, 3612117664568604198), + name: 'dbStructuredName', + type: 9, + flags: 0, + ), + obx_int.ModelProperty( + id: const obx_int.IdUid(11, 3140177684889918471), + name: 'isShared', + type: 1, + flags: 0, + ), + obx_int.ModelProperty( + id: const obx_int.IdUid(12, 761555548860852325), + name: 'isDismissed', + type: 1, + flags: 0, + ), + obx_int.ModelProperty( + id: const obx_int.IdUid(13, 6585143364094241703), + name: 'posterPath', + type: 9, + flags: 0, + ), + ], + relations: [], + backlinks: [], + ), + obx_int.ModelEntity( + id: const obx_int.IdUid(18, 6719772093493207335), + name: 'CloudInboxChangeEntity', + lastPropertyId: const obx_int.IdUid(25, 4451177903685227588), + flags: 0, + properties: [ + obx_int.ModelProperty( + id: const obx_int.IdUid(1, 1895907410778974924), + name: 'id', + type: 6, + flags: 1, + ), + obx_int.ModelProperty( + id: const obx_int.IdUid(2, 4032652183471247709), + name: 'changeKey', + type: 9, + flags: 4128, + indexId: const obx_int.IdUid(17, 5174860094616047747), + ), + obx_int.ModelProperty( + id: const obx_int.IdUid(3, 5983731795781636076), + name: 'accountFingerprint', + type: 9, + flags: 4096, + indexId: const obx_int.IdUid(18, 7783959298344182122), + ), + obx_int.ModelProperty( + id: const obx_int.IdUid(4, 8678544169124423987), + name: 'zone', + type: 9, + flags: 4096, + indexId: const obx_int.IdUid(19, 821204552706254830), + ), + obx_int.ModelProperty( + id: const obx_int.IdUid(5, 2136167124009199311), + name: 'serverRecordIdHash', + type: 9, + flags: 4096, + indexId: const obx_int.IdUid(20, 6843515083576547121), + ), + obx_int.ModelProperty( + id: const obx_int.IdUid(6, 617092932104382307), + name: 'etagHash', + type: 9, + flags: 0, + ), + obx_int.ModelProperty( + id: const obx_int.IdUid(7, 64019184264750896), + name: 'changeType', + type: 9, + flags: 0, + ), + obx_int.ModelProperty( + id: const obx_int.IdUid(8, 2328711545206180923), + name: 'encryptedPayloadRef', + type: 9, + flags: 0, + ), + obx_int.ModelProperty( + id: const obx_int.IdUid(9, 3676607222232263), + name: 'payloadSha256', + type: 9, + flags: 0, + ), + obx_int.ModelProperty( + id: const obx_int.IdUid(10, 1669804813770590457), + name: 'fetchSequence', + type: 6, + flags: 8, + indexId: const obx_int.IdUid(21, 2885795424266777500), + ), + obx_int.ModelProperty( + id: const obx_int.IdUid(11, 5135084822522519610), + name: 'status', + type: 6, + flags: 8, + indexId: const obx_int.IdUid(22, 7905330438985774204), + ), + obx_int.ModelProperty( + id: const obx_int.IdUid(12, 8575275500382195174), + name: 'isTombstone', + type: 1, + flags: 0, + ), + obx_int.ModelProperty( + id: const obx_int.IdUid(13, 5224296750110920597), + name: 'failureCategory', + type: 9, + flags: 0, + ), + obx_int.ModelProperty( + id: const obx_int.IdUid(14, 9109742928607863948), + name: 'retryCount', + type: 6, + flags: 0, + ), + obx_int.ModelProperty( + id: const obx_int.IdUid(15, 2122087258225924885), + name: 'createdAtMs', + type: 6, + flags: 0, + ), + obx_int.ModelProperty( + id: const obx_int.IdUid(16, 8310828696055987169), + name: 'updatedAtMs', + type: 6, + flags: 0, + ), + obx_int.ModelProperty( + id: const obx_int.IdUid(17, 2385681725155050415), + name: 'scopeKey', + type: 9, + flags: 4096, + indexId: const obx_int.IdUid(39, 3360430129523727354), + ), + obx_int.ModelProperty( + id: const obx_int.IdUid(18, 942265256405421186), + name: 'encryptedServerRecordId', + type: 9, + flags: 0, + ), + obx_int.ModelProperty( + id: const obx_int.IdUid(19, 1452880395700277269), + name: 'protectedSystemFieldsRef', + type: 9, + flags: 0, + ), + obx_int.ModelProperty( + id: const obx_int.IdUid(20, 1370342980241388939), + name: 'batchId', + type: 9, + flags: 4096, + indexId: const obx_int.IdUid(40, 8891088444757782392), + ), + obx_int.ModelProperty( + id: const obx_int.IdUid(21, 8085608731784905006), + name: 'generation', + type: 6, + flags: 0, + ), + obx_int.ModelProperty( + id: const obx_int.IdUid(22, 7803520175828220783), + name: 'nextEligibleAtMs', + type: 6, + flags: 0, + ), + obx_int.ModelProperty( + id: const obx_int.IdUid(23, 2359335986298063461), + name: 'serverModifiedAtMs', + type: 6, + flags: 0, + ), + obx_int.ModelProperty( + id: const obx_int.IdUid(24, 5348089514051084893), + name: 'completedAtMs', + type: 6, + flags: 0, + ), + obx_int.ModelProperty( + id: const obx_int.IdUid(25, 4451177903685227588), + name: 'changeIdHash', + type: 9, + flags: 0, + ), + ], + relations: [], + backlinks: [], + ), + obx_int.ModelEntity( + id: const obx_int.IdUid(19, 6209808242097333245), + name: 'CloudOutboxOperationEntity', + lastPropertyId: const obx_int.IdUid(26, 4302324668053862926), + flags: 0, + properties: [ + obx_int.ModelProperty( + id: const obx_int.IdUid(1, 1453923979681070039), + name: 'id', + type: 6, + flags: 1, + ), + obx_int.ModelProperty( + id: const obx_int.IdUid(2, 5482215586868617465), + name: 'operationId', + type: 9, + flags: 4128, + indexId: const obx_int.IdUid(23, 2902044484437898756), + ), + obx_int.ModelProperty( + id: const obx_int.IdUid(3, 7822186106200261916), + name: 'accountFingerprint', + type: 9, + flags: 4096, + indexId: const obx_int.IdUid(24, 1438057816700047656), + ), + obx_int.ModelProperty( + id: const obx_int.IdUid(4, 9073324705939660391), + name: 'zone', + type: 9, + flags: 4096, + indexId: const obx_int.IdUid(25, 4176121958468359790), + ), + obx_int.ModelProperty( + id: const obx_int.IdUid(5, 5030438638097882343), + name: 'logicalEntityKeyHash', + type: 9, + flags: 4096, + indexId: const obx_int.IdUid(26, 1229409407214613375), + ), + obx_int.ModelProperty( + id: const obx_int.IdUid(6, 3360967592185918908), + name: 'action', + type: 6, + flags: 0, + ), + obx_int.ModelProperty( + id: const obx_int.IdUid(7, 8739970205884330074), + name: 'dependencyOperationIdsJson', + type: 9, + flags: 0, + ), + obx_int.ModelProperty( + id: const obx_int.IdUid(8, 4164289290106487159), + name: 'payloadVersion', + type: 6, + flags: 0, + ), + obx_int.ModelProperty( + id: const obx_int.IdUid(9, 2114718060008374593), + name: 'encryptedPayloadRef', + type: 9, + flags: 0, + ), + obx_int.ModelProperty( + id: const obx_int.IdUid(10, 7424732699000879073), + name: 'payloadSha256', + type: 9, + flags: 0, + ), + obx_int.ModelProperty( + id: const obx_int.IdUid(11, 6365640570467255843), + name: 'state', + type: 6, + flags: 8, + indexId: const obx_int.IdUid(27, 28639336516046221), + ), + obx_int.ModelProperty( + id: const obx_int.IdUid(12, 8957972381723831102), + name: 'attemptCount', + type: 6, + flags: 0, + ), + obx_int.ModelProperty( + id: const obx_int.IdUid(13, 6974379095018398482), + name: 'nextEligibleAtMs', + type: 6, + flags: 8, + indexId: const obx_int.IdUid(28, 3434010190981668931), + ), + obx_int.ModelProperty( + id: const obx_int.IdUid(14, 1713088269741338724), + name: 'lastErrorCategory', + type: 9, + flags: 0, + ), + obx_int.ModelProperty( + id: const obx_int.IdUid(15, 3023724616636969011), + name: 'serverRecordIdHash', + type: 9, + flags: 0, + ), + obx_int.ModelProperty( + id: const obx_int.IdUid(16, 908674649408606076), + name: 'createdAtMs', + type: 6, + flags: 0, + ), + obx_int.ModelProperty( + id: const obx_int.IdUid(17, 2395909016293033875), + name: 'updatedAtMs', + type: 6, + flags: 0, + ), + obx_int.ModelProperty( + id: const obx_int.IdUid(18, 7045932923442181147), + name: 'scopeKey', + type: 9, + flags: 4096, + indexId: const obx_int.IdUid(41, 7669028522258602254), + ), + obx_int.ModelProperty( + id: const obx_int.IdUid(19, 8671106639445127584), + name: 'mutationRevision', + type: 6, + flags: 0, + ), + obx_int.ModelProperty( + id: const obx_int.IdUid(20, 8829434107583151203), + name: 'leaseIdHash', + type: 9, + flags: 0, + ), + obx_int.ModelProperty( + id: const obx_int.IdUid(21, 8352574949953478905), + name: 'leaseExpiresAtMs', + type: 6, + flags: 0, + ), + obx_int.ModelProperty( + id: const obx_int.IdUid(22, 1517823970736287654), + name: 'confirmedAtMs', + type: 6, + flags: 0, + ), + obx_int.ModelProperty( + id: const obx_int.IdUid(23, 3453625028306797643), + name: 'checkpointGeneration', + type: 6, + flags: 0, + ), + obx_int.ModelProperty( + id: const obx_int.IdUid(24, 2838853240019164046), + name: 'appleRequestUuid', + type: 9, + flags: 0, + ), + obx_int.ModelProperty( + id: const obx_int.IdUid(25, 593864995002474100), + name: 'appleOperationUuid', + type: 9, + flags: 0, + ), + obx_int.ModelProperty( + id: const obx_int.IdUid(26, 4302324668053862926), + name: 'protectedLeaseReference', + type: 9, + flags: 0, + ), + ], + relations: [], + backlinks: [], + ), + obx_int.ModelEntity( + id: const obx_int.IdUid(20, 8623084761715763815), + name: 'CloudRecordMapEntity', + lastPropertyId: const obx_int.IdUid(12, 7135872154167319448), + flags: 0, + properties: [ + obx_int.ModelProperty( + id: const obx_int.IdUid(1, 9097529941931140001), + name: 'id', + type: 6, + flags: 1, + ), + obx_int.ModelProperty( + id: const obx_int.IdUid(2, 3528403730967002101), + name: 'mapKey', + type: 9, + flags: 4128, + indexId: const obx_int.IdUid(29, 471127199829308194), + ), + obx_int.ModelProperty( + id: const obx_int.IdUid(3, 8031419087023122271), + name: 'accountFingerprint', + type: 9, + flags: 4096, + indexId: const obx_int.IdUid(30, 6809918130192761355), + ), + obx_int.ModelProperty( + id: const obx_int.IdUid(4, 596246986889589728), + name: 'zone', + type: 9, + flags: 4096, + indexId: const obx_int.IdUid(31, 6419846787958831018), + ), + obx_int.ModelProperty( + id: const obx_int.IdUid(5, 3866959842373768393), + name: 'logicalEntityKeyHash', + type: 9, + flags: 4096, + indexId: const obx_int.IdUid(32, 5741250032786933729), + ), + obx_int.ModelProperty( + id: const obx_int.IdUid(6, 1720064144660637343), + name: 'serverRecordIdHash', + type: 9, + flags: 4096, + indexId: const obx_int.IdUid(33, 2137526312204345044), + ), + obx_int.ModelProperty( + id: const obx_int.IdUid(7, 7059827757810134893), + name: 'encryptedServerRecordId', + type: 9, + flags: 0, + ), + obx_int.ModelProperty( + id: const obx_int.IdUid(8, 6064824751437364913), + name: 'etagHash', + type: 9, + flags: 0, + ), + obx_int.ModelProperty( + id: const obx_int.IdUid(9, 3511222388893390366), + name: 'encryptedRawRecordRef', + type: 9, + flags: 0, + ), + obx_int.ModelProperty( + id: const obx_int.IdUid(10, 4476992720778999527), + name: 'updatedAtMs', + type: 6, + flags: 0, + ), + obx_int.ModelProperty( + id: const obx_int.IdUid(11, 6045468503885689678), + name: 'scopeKey', + type: 9, + flags: 4096, + indexId: const obx_int.IdUid(42, 8580390230204763517), + ), + obx_int.ModelProperty( + id: const obx_int.IdUid(12, 7135872154167319448), + name: 'generation', + type: 6, + flags: 0, + ), + ], + relations: [], + backlinks: [], + ), + obx_int.ModelEntity( + id: const obx_int.IdUid(21, 4610418443336266937), + name: 'CloudSyncCheckpointEntity', + lastPropertyId: const obx_int.IdUid(20, 469503483284611167), + flags: 0, + properties: [ + obx_int.ModelProperty( + id: const obx_int.IdUid(1, 1503513831301718558), + name: 'id', + type: 6, + flags: 1, + ), + obx_int.ModelProperty( + id: const obx_int.IdUid(2, 4028596345806531255), + name: 'checkpointKey', + type: 9, + flags: 4128, + indexId: const obx_int.IdUid(34, 1579181902505607669), + ), + obx_int.ModelProperty( + id: const obx_int.IdUid(3, 5485993030475628060), + name: 'accountFingerprint', + type: 9, + flags: 4096, + indexId: const obx_int.IdUid(35, 4382044364901605135), + ), + obx_int.ModelProperty( + id: const obx_int.IdUid(4, 575887715290289427), + name: 'container', + type: 9, + flags: 0, + ), + obx_int.ModelProperty( + id: const obx_int.IdUid(5, 8918464312948592927), + name: 'database', + type: 9, + flags: 0, + ), + obx_int.ModelProperty( + id: const obx_int.IdUid(6, 4967773343283709776), + name: 'zone', + type: 9, + flags: 4096, + indexId: const obx_int.IdUid(36, 1694676353845812008), + ), + obx_int.ModelProperty( + id: const obx_int.IdUid(7, 8851160100117306846), + name: 'schemaVersion', + type: 6, + flags: 0, + ), + obx_int.ModelProperty( + id: const obx_int.IdUid(8, 8714485857066159220), + name: 'fetchedTokenCiphertext', + type: 9, + flags: 0, + ), + obx_int.ModelProperty( + id: const obx_int.IdUid(9, 9039140338019416063), + name: 'fetchedSequence', + type: 6, + flags: 0, + ), + obx_int.ModelProperty( + id: const obx_int.IdUid(10, 461883346597482809), + name: 'appliedSequence', + type: 6, + flags: 0, + ), + obx_int.ModelProperty( + id: const obx_int.IdUid(11, 7559900551993333666), + name: 'lastSuccessfulAtMs', + type: 6, + flags: 0, + ), + obx_int.ModelProperty( + id: const obx_int.IdUid(12, 1542051308030024045), + name: 'lastAttemptAtMs', + type: 6, + flags: 0, + ), + obx_int.ModelProperty( + id: const obx_int.IdUid(13, 6338716602832862273), + name: 'lastErrorCategory', + type: 9, + flags: 0, + ), + obx_int.ModelProperty( + id: const obx_int.IdUid(14, 4946610067634546596), + name: 'backoffAttempt', + type: 6, + flags: 0, + ), + obx_int.ModelProperty( + id: const obx_int.IdUid(15, 3803599633056384253), + name: 'nextEligibleAtMs', + type: 6, + flags: 0, + ), + obx_int.ModelProperty( + id: const obx_int.IdUid(16, 3893748363581671178), + name: 'updatedAtMs', + type: 6, + flags: 0, + ), + obx_int.ModelProperty( + id: const obx_int.IdUid(17, 7898159843947289985), + name: 'streamKind', + type: 9, + flags: 0, + ), + obx_int.ModelProperty( + id: const obx_int.IdUid(18, 5644534535062464011), + name: 'generation', + type: 6, + flags: 0, + ), + obx_int.ModelProperty( + id: const obx_int.IdUid(19, 3704484740564181784), + name: 'lastBatchId', + type: 9, + flags: 0, + ), + obx_int.ModelProperty( + id: const obx_int.IdUid(20, 469503483284611167), + name: 'mutationRevisionCounter', + type: 6, + flags: 0, + ), + ], + relations: [], + backlinks: [], + ), + obx_int.ModelEntity( + id: const obx_int.IdUid(22, 259334693033865836), + name: 'CloudSyncRunEntity', + lastPropertyId: const obx_int.IdUid(16, 6257537762912465363), + flags: 0, + properties: [ + obx_int.ModelProperty( + id: const obx_int.IdUid(1, 1782232589038116265), + name: 'id', + type: 6, + flags: 1, + ), + obx_int.ModelProperty( + id: const obx_int.IdUid(2, 2420496326771660332), + name: 'runId', + type: 9, + flags: 4128, + indexId: const obx_int.IdUid(37, 5579835729402978725), + ), + obx_int.ModelProperty( + id: const obx_int.IdUid(3, 5578798528327770139), + name: 'accountFingerprint', + type: 9, + flags: 4096, + indexId: const obx_int.IdUid(38, 1353148650192326406), + ), + obx_int.ModelProperty( + id: const obx_int.IdUid(4, 7951416976844075650), + name: 'trigger', + type: 9, + flags: 0, + ), + obx_int.ModelProperty( + id: const obx_int.IdUid(5, 1210921649776027278), + name: 'architecture', + type: 9, + flags: 0, + ), + obx_int.ModelProperty( + id: const obx_int.IdUid(6, 2764764522538084616), + name: 'mode', + type: 9, + flags: 0, + ), + obx_int.ModelProperty( + id: const obx_int.IdUid(7, 2688680483849660813), + name: 'fetchedCount', + type: 6, + flags: 0, + ), + obx_int.ModelProperty( + id: const obx_int.IdUid(8, 6162153589821911026), + name: 'appliedCount', + type: 6, + flags: 0, + ), + obx_int.ModelProperty( + id: const obx_int.IdUid(9, 791556381302722054), + name: 'quarantinedCount', + type: 6, + flags: 0, + ), + obx_int.ModelProperty( + id: const obx_int.IdUid(10, 1390082525507774243), + name: 'confirmedCount', + type: 6, + flags: 0, + ), + obx_int.ModelProperty( + id: const obx_int.IdUid(11, 4541580426093217663), + name: 'retriedCount', + type: 6, + flags: 0, + ), + obx_int.ModelProperty( + id: const obx_int.IdUid(12, 857320526491939146), + name: 'startedAtMs', + type: 6, + flags: 0, + ), + obx_int.ModelProperty( + id: const obx_int.IdUid(13, 3056229026698237423), + name: 'finishedAtMs', + type: 6, + flags: 0, + ), + obx_int.ModelProperty( + id: const obx_int.IdUid(14, 9083894370969100067), + name: 'failureCategory', + type: 9, + flags: 0, + ), + obx_int.ModelProperty( + id: const obx_int.IdUid(15, 1232110106438769869), + name: 'scopeKey', + type: 9, + flags: 4096, + indexId: const obx_int.IdUid(47, 3060485928735691412), + ), + obx_int.ModelProperty( + id: const obx_int.IdUid(16, 6257537762912465363), + name: 'deferredCount', + type: 6, + flags: 0, + ), + ], + relations: [], + backlinks: [], + ), + obx_int.ModelEntity( + id: const obx_int.IdUid(23, 4070283325319950409), + name: 'CloudSyncLeaseEntity', + lastPropertyId: const obx_int.IdUid(8, 5690477582462752090), + flags: 0, + properties: [ + obx_int.ModelProperty( + id: const obx_int.IdUid(1, 2729282918387786382), + name: 'id', + type: 6, + flags: 1, + ), + obx_int.ModelProperty( + id: const obx_int.IdUid(2, 2769029684737707461), + name: 'leaseKey', + type: 9, + flags: 4128, + indexId: const obx_int.IdUid(43, 637443236713783532), + ), + obx_int.ModelProperty( + id: const obx_int.IdUid(3, 8190732138318068473), + name: 'scopeKey', + type: 9, + flags: 4096, + indexId: const obx_int.IdUid(44, 9151336404221461594), + ), + obx_int.ModelProperty( + id: const obx_int.IdUid(4, 8073672003493449321), + name: 'accountFingerprint', + type: 9, + flags: 4096, + indexId: const obx_int.IdUid(45, 5155866284077893836), + ), + obx_int.ModelProperty( + id: const obx_int.IdUid(5, 8728846936974993304), + name: 'ownerIdHash', + type: 9, + flags: 0, + ), + obx_int.ModelProperty( + id: const obx_int.IdUid(6, 772462836942356017), + name: 'generation', + type: 6, + flags: 0, + ), + obx_int.ModelProperty( + id: const obx_int.IdUid(7, 2572401958863969816), + name: 'acquiredAtMs', + type: 6, + flags: 0, + ), + obx_int.ModelProperty( + id: const obx_int.IdUid(8, 5690477582462752090), + name: 'expiresAtMs', + type: 6, + flags: 8, + indexId: const obx_int.IdUid(46, 649461146512244572), + ), + ], + relations: [], + backlinks: [], + ), + obx_int.ModelEntity( + id: const obx_int.IdUid(24, 6298856735630642402), + name: 'CloudAttachmentMaterializationEntity', + lastPropertyId: const obx_int.IdUid(16, 115530251783195004), + flags: 0, + properties: [ + obx_int.ModelProperty( + id: const obx_int.IdUid(1, 1733707656886255486), + name: 'id', + type: 6, + flags: 1, + ), + obx_int.ModelProperty( + id: const obx_int.IdUid(2, 2829480575482014625), + name: 'transferKey', + type: 9, + flags: 4128, + indexId: const obx_int.IdUid(48, 8511204723626225136), + ), + obx_int.ModelProperty( + id: const obx_int.IdUid(3, 3054457580958471772), + name: 'scopeKey', + type: 9, + flags: 4096, + indexId: const obx_int.IdUid(49, 3868889113762672438), + ), + obx_int.ModelProperty( + id: const obx_int.IdUid(4, 7527309380540369961), + name: 'accountFingerprint', + type: 9, + flags: 4096, + indexId: const obx_int.IdUid(50, 9057833165170278504), + ), + obx_int.ModelProperty( + id: const obx_int.IdUid(5, 5122274897448961713), + name: 'zone', + type: 9, + flags: 4096, + indexId: const obx_int.IdUid(51, 8904544591634042596), + ), + obx_int.ModelProperty( + id: const obx_int.IdUid(6, 8957933126875551600), + name: 'generation', + type: 6, + flags: 0, + ), + obx_int.ModelProperty( + id: const obx_int.IdUid(7, 4815227610925886891), + name: 'logicalEntityKeyHash', + type: 9, + flags: 4096, + indexId: const obx_int.IdUid(52, 8064650573204067089), + ), + obx_int.ModelProperty( + id: const obx_int.IdUid(8, 350444312191614898), + name: 'expectedBytes', + type: 6, + flags: 0, + ), + obx_int.ModelProperty( + id: const obx_int.IdUid(9, 4652270939056213993), + name: 'expectedIntegrityTagHash', + type: 9, + flags: 0, + ), + obx_int.ModelProperty( + id: const obx_int.IdUid(10, 6314008561402639966), + name: 'stage', + type: 6, + flags: 8, + indexId: const obx_int.IdUid(53, 3559574499631432073), + ), + obx_int.ModelProperty( + id: const obx_int.IdUid(11, 3947295453349546213), + name: 'verifiedBytes', + type: 6, + flags: 0, + ), + obx_int.ModelProperty( + id: const obx_int.IdUid(12, 4286934476255007712), + name: 'protectedTempReference', + type: 9, + flags: 0, + ), + obx_int.ModelProperty( + id: const obx_int.IdUid(13, 6102671074598874882), + name: 'protectedResumeManifestReference', + type: 9, + flags: 0, + ), + obx_int.ModelProperty( + id: const obx_int.IdUid(14, 5110684721177215462), + name: 'protectedContentVerificationReference', + type: 9, + flags: 0, + ), + obx_int.ModelProperty( + id: const obx_int.IdUid(15, 531054111286031189), + name: 'protectedFinalReference', + type: 9, + flags: 0, + ), + obx_int.ModelProperty( + id: const obx_int.IdUid(16, 115530251783195004), + name: 'updatedAtMs', + type: 6, + flags: 0, + ), + ], + relations: [], + backlinks: [], + ), + obx_int.ModelEntity( + id: const obx_int.IdUid(25, 2707792941267997758), + name: 'CloudSemanticReplayEntity', + lastPropertyId: const obx_int.IdUid(24, 6134120491357238156), + flags: 0, + properties: [ + obx_int.ModelProperty( + id: const obx_int.IdUid(1, 3880903860070244039), + name: 'id', + type: 6, + flags: 1, + ), + obx_int.ModelProperty( + id: const obx_int.IdUid(2, 2817476290092230342), + name: 'replayKey', + type: 9, + flags: 4128, + indexId: const obx_int.IdUid(54, 2661950643500352932), + ), + obx_int.ModelProperty( + id: const obx_int.IdUid(3, 5845736057897842633), + name: 'scopeGenerationKey', + type: 9, + flags: 4096, + indexId: const obx_int.IdUid(55, 6656797492340960508), + ), + obx_int.ModelProperty( + id: const obx_int.IdUid(4, 1353183097380652891), + name: 'scopeKey', + type: 9, + flags: 4096, + indexId: const obx_int.IdUid(56, 7550401169650593817), + ), + obx_int.ModelProperty( + id: const obx_int.IdUid(5, 1580690780664760772), + name: 'accountFingerprint', + type: 9, + flags: 4096, + indexId: const obx_int.IdUid(57, 1758564168966321462), + ), + obx_int.ModelProperty( + id: const obx_int.IdUid(6, 7674256512701354196), + name: 'container', + type: 9, + flags: 0, + ), + obx_int.ModelProperty( + id: const obx_int.IdUid(7, 3735485937229566834), + name: 'database', + type: 9, + flags: 0, + ), + obx_int.ModelProperty( + id: const obx_int.IdUid(8, 1239116557652113152), + name: 'zone', + type: 9, + flags: 4096, + indexId: const obx_int.IdUid(58, 1437734903549199516), + ), + obx_int.ModelProperty( + id: const obx_int.IdUid(9, 2503794915196890881), + name: 'streamKind', + type: 9, + flags: 0, + ), + obx_int.ModelProperty( + id: const obx_int.IdUid(10, 8528671671014893912), + name: 'schemaVersion', + type: 6, + flags: 0, + ), + obx_int.ModelProperty( + id: const obx_int.IdUid(11, 9103596916327534004), + name: 'generation', + type: 6, + flags: 0, + ), + obx_int.ModelProperty( + id: const obx_int.IdUid(12, 5062059703884467225), + name: 'changeIdHash', + type: 9, + flags: 4096, + indexId: const obx_int.IdUid(59, 8454019426905867269), + ), + obx_int.ModelProperty( + id: const obx_int.IdUid(16, 7486724007131892173), + name: 'updatedAtMs', + type: 6, + flags: 0, + ), + obx_int.ModelProperty( + id: const obx_int.IdUid(17, 3765812835902269445), + name: 'serverRecordIdHash', + type: 9, + flags: 4096, + indexId: const obx_int.IdUid(66, 6913311950121421051), + ), + obx_int.ModelProperty( + id: const obx_int.IdUid(18, 8462982952394987262), + name: 'logicalEntityKeyHash', + type: 9, + flags: 4096, + indexId: const obx_int.IdUid(67, 9016942969599814282), + ), + obx_int.ModelProperty( + id: const obx_int.IdUid(19, 1416321247527772100), + name: 'payloadSha256', + type: 9, + flags: 0, + ), + obx_int.ModelProperty( + id: const obx_int.IdUid(20, 1168518400042208803), + name: 'protectedPayloadReferenceHash', + type: 9, + flags: 0, + ), + obx_int.ModelProperty( + id: const obx_int.IdUid(21, 2926325749401488941), + name: 'inboxSequence', + type: 6, + flags: 0, + ), + obx_int.ModelProperty( + id: const obx_int.IdUid(22, 5443645776082689040), + name: 'changeType', + type: 9, + flags: 0, + ), + obx_int.ModelProperty( + id: const obx_int.IdUid(23, 5938564578107542446), + name: 'terminalOutcome', + type: 9, + flags: 4096, + indexId: const obx_int.IdUid(68, 3019787364371978747), + ), + obx_int.ModelProperty( + id: const obx_int.IdUid(24, 6134120491357238156), + name: 'terminalSafeCode', + type: 9, + flags: 0, + ), + ], + relations: [], + backlinks: [], + ), + obx_int.ModelEntity( + id: const obx_int.IdUid(26, 7701837625666464233), + name: 'CloudSemanticSnapshotEntity', + lastPropertyId: const obx_int.IdUid(24, 5035678304275097058), + flags: 0, + properties: [ + obx_int.ModelProperty( + id: const obx_int.IdUid(1, 8520227360481418389), + name: 'id', + type: 6, + flags: 1, + ), + obx_int.ModelProperty( + id: const obx_int.IdUid(2, 7488477600905998136), + name: 'snapshotKey', + type: 9, + flags: 4128, + indexId: const obx_int.IdUid(60, 5644677902998818408), + ), + obx_int.ModelProperty( + id: const obx_int.IdUid(3, 7329013381340357172), + name: 'scopeGenerationKey', + type: 9, + flags: 4096, + indexId: const obx_int.IdUid(61, 1226266756750185226), + ), + obx_int.ModelProperty( + id: const obx_int.IdUid(4, 6401139088990627667), + name: 'scopeKey', + type: 9, + flags: 4096, + indexId: const obx_int.IdUid(62, 2298928435832767244), + ), + obx_int.ModelProperty( + id: const obx_int.IdUid(5, 5773934355110739738), + name: 'accountFingerprint', + type: 9, + flags: 4096, + indexId: const obx_int.IdUid(63, 3017974133359173059), + ), + obx_int.ModelProperty( + id: const obx_int.IdUid(6, 2192943532550866420), + name: 'container', + type: 9, + flags: 0, + ), + obx_int.ModelProperty( + id: const obx_int.IdUid(7, 4243885286916349439), + name: 'database', + type: 9, + flags: 0, + ), + obx_int.ModelProperty( + id: const obx_int.IdUid(8, 1122439571203719362), + name: 'zone', + type: 9, + flags: 4096, + indexId: const obx_int.IdUid(64, 6674403394799987160), + ), + obx_int.ModelProperty( + id: const obx_int.IdUid(9, 8532578789865062424), + name: 'streamKind', + type: 9, + flags: 0, + ), + obx_int.ModelProperty( + id: const obx_int.IdUid(10, 6974539497241102296), + name: 'schemaVersion', + type: 6, + flags: 0, + ), + obx_int.ModelProperty( + id: const obx_int.IdUid(11, 1250931896109604799), + name: 'generation', + type: 6, + flags: 0, + ), + obx_int.ModelProperty( + id: const obx_int.IdUid(12, 1451806406255824259), + name: 'entityKind', + type: 9, + flags: 0, + ), + obx_int.ModelProperty( + id: const obx_int.IdUid(13, 3131079412139954216), + name: 'logicalEntityKeyHash', + type: 9, + flags: 4096, + indexId: const obx_int.IdUid(65, 7107073535763836024), + ), + obx_int.ModelProperty( + id: const obx_int.IdUid(14, 9116431593188019474), + name: 'parentLogicalKeyHash', + type: 9, + flags: 0, + ), + obx_int.ModelProperty( + id: const obx_int.IdUid(15, 5647270430356373616), + name: 'immutableContentDigest', + type: 9, + flags: 0, + ), + obx_int.ModelProperty( + id: const obx_int.IdUid(16, 3489430996458561289), + name: 'createdAtMs', + type: 6, + flags: 0, + ), + obx_int.ModelProperty( + id: const obx_int.IdUid(17, 8182786500145730176), + name: 'readAtMs', + type: 6, + flags: 0, + ), + obx_int.ModelProperty( + id: const obx_int.IdUid(18, 3348921457693473272), + name: 'deliveredAtMs', + type: 6, + flags: 0, + ), + obx_int.ModelProperty( + id: const obx_int.IdUid(19, 2070179914062438898), + name: 'editPartsJson', + type: 9, + flags: 0, + ), + obx_int.ModelProperty( + id: const obx_int.IdUid(20, 2837338191269536128), + name: 'retractedAtMs', + type: 6, + flags: 0, + ), + obx_int.ModelProperty( + id: const obx_int.IdUid(21, 5535400344419239642), + name: 'groupVersion', + type: 6, + flags: 0, + ), + obx_int.ModelProperty( + id: const obx_int.IdUid(22, 236557598042741275), + name: 'groupMetadataDigest', + type: 9, + flags: 0, + ), + obx_int.ModelProperty( + id: const obx_int.IdUid(23, 4137057345787739447), + name: 'etagHash', + type: 9, + flags: 0, + ), + obx_int.ModelProperty( + id: const obx_int.IdUid(24, 5035678304275097058), + name: 'updatedAtMs', + type: 6, + flags: 0, + ), + ], + relations: [], + backlinks: [], + ), + obx_int.ModelEntity( + id: const obx_int.IdUid(27, 4280538170716883312), + name: 'CloudProtectedPageLeaseEntity', + lastPropertyId: const obx_int.IdUid(9, 7761394260513099254), + flags: 0, + properties: [ + obx_int.ModelProperty( + id: const obx_int.IdUid(1, 1759726867224472058), + name: 'id', + type: 6, + flags: 1, + ), + obx_int.ModelProperty( + id: const obx_int.IdUid(2, 3492550884558884121), + name: 'leaseReference', + type: 9, + flags: 4128, + indexId: const obx_int.IdUid(69, 435771699388467906), + ), + obx_int.ModelProperty( + id: const obx_int.IdUid(3, 1803024814487980708), + name: 'scopeKey', + type: 9, + flags: 4096, + indexId: const obx_int.IdUid(70, 3620302744458223619), + ), + obx_int.ModelProperty( + id: const obx_int.IdUid(4, 657197473658330316), + name: 'accountFingerprint', + type: 9, + flags: 4096, + indexId: const obx_int.IdUid(71, 9143856129043954915), + ), + obx_int.ModelProperty( + id: const obx_int.IdUid(5, 913730073842346540), + name: 'generation', + type: 6, + flags: 0, + ), + obx_int.ModelProperty( + id: const obx_int.IdUid(6, 6474542508711130616), + name: 'batchIdHash', + type: 9, + flags: 0, + ), + obx_int.ModelProperty( + id: const obx_int.IdUid(7, 5246214786452390887), + name: 'adoptedAtMs', + type: 6, + flags: 0, + ), + obx_int.ModelProperty( + id: const obx_int.IdUid(8, 2103033795181318938), + name: 'finalizeAttemptCount', + type: 6, + flags: 0, + ), + obx_int.ModelProperty( + id: const obx_int.IdUid(9, 7761394260513099254), + name: 'nextFinalizeEligibleAtMs', + type: 6, + flags: 0, + ), + ], + relations: [], + backlinks: [], + ), + obx_int.ModelEntity( + id: const obx_int.IdUid(28, 889478301778181246), + name: 'CloudKitWriterAuthorityEntity', + lastPropertyId: const obx_int.IdUid(14, 4174520670149979908), + flags: 0, + properties: [ + obx_int.ModelProperty( + id: const obx_int.IdUid(1, 5473247877995585615), + name: 'id', + type: 6, + flags: 1, + ), + obx_int.ModelProperty( + id: const obx_int.IdUid(2, 1642692165078650755), + name: 'authorityKey', + type: 9, + flags: 4128, + indexId: const obx_int.IdUid(72, 6121958980954465281), + ), + obx_int.ModelProperty( + id: const obx_int.IdUid(3, 5104060885702386570), + name: 'accountFingerprint', + type: 9, + flags: 4096, + indexId: const obx_int.IdUid(73, 5488879845786692064), + ), + obx_int.ModelProperty( + id: const obx_int.IdUid(4, 1430241371294861401), + name: 'container', + type: 9, + flags: 0, + ), + obx_int.ModelProperty( + id: const obx_int.IdUid(5, 4032154290354580986), + name: 'database', + type: 9, + flags: 0, + ), + obx_int.ModelProperty( + id: const obx_int.IdUid(6, 2423775511408165446), + name: 'owner', + type: 6, + flags: 0, + ), + obx_int.ModelProperty( + id: const obx_int.IdUid(7, 1072554348408456591), + name: 'state', + type: 6, + flags: 0, + ), + obx_int.ModelProperty( + id: const obx_int.IdUid(8, 7868095992651810717), + name: 'targetOwner', + type: 6, + flags: 0, + ), + obx_int.ModelProperty( + id: const obx_int.IdUid(9, 676908442821730166), + name: 'epoch', + type: 6, + flags: 0, + ), + obx_int.ModelProperty( + id: const obx_int.IdUid(10, 151617614527735346), + name: 'updatedAtMs', + type: 6, + flags: 0, + ), + obx_int.ModelProperty( + id: const obx_int.IdUid(11, 5989769012840038573), + name: 'transitionIdHash', + type: 9, + flags: 0, + ), + obx_int.ModelProperty( + id: const obx_int.IdUid(12, 9160103618601374829), + name: 'resetScopeKeyHash', + type: 9, + flags: 0, + ), + obx_int.ModelProperty( + id: const obx_int.IdUid(13, 2198164706224214236), + name: 'resetGeneration', + type: 6, + flags: 0, + ), + obx_int.ModelProperty( + id: const obx_int.IdUid(14, 4174520670149979908), + name: 'resetProofReferenceHash', + type: 9, + flags: 0, + ), + ], + relations: [], + backlinks: [], + ), + obx_int.ModelEntity( + id: const obx_int.IdUid(29, 3887662870209685934), + name: 'CloudKitDeletionIntentEntity', + lastPropertyId: const obx_int.IdUid(12, 4810596780446149463), + flags: 0, + properties: [ + obx_int.ModelProperty( + id: const obx_int.IdUid(1, 4826700441964631379), + name: 'id', + type: 6, + flags: 1, + ), + obx_int.ModelProperty( + id: const obx_int.IdUid(2, 3159247580443387695), + name: 'intentKey', + type: 9, + flags: 4128, + indexId: const obx_int.IdUid(74, 8915222881106965724), + ), + obx_int.ModelProperty( + id: const obx_int.IdUid(3, 6722727339572908414), + name: 'accountFingerprint', + type: 9, + flags: 4096, + indexId: const obx_int.IdUid(75, 3577054364456742958), + ), + obx_int.ModelProperty( + id: const obx_int.IdUid(4, 458894881388309981), + name: 'container', + type: 9, + flags: 0, + ), + obx_int.ModelProperty( + id: const obx_int.IdUid(5, 6503045858666304076), + name: 'database', + type: 9, + flags: 0, + ), + obx_int.ModelProperty( + id: const obx_int.IdUid(6, 9128063155847659726), + name: 'writerEpoch', + type: 6, + flags: 0, + ), + obx_int.ModelProperty( + id: const obx_int.IdUid(7, 8745333787754726390), + name: 'kind', + type: 6, + flags: 0, + ), + obx_int.ModelProperty( + id: const obx_int.IdUid(8, 8231123974175741804), + name: 'recordId', + type: 9, + flags: 0, + ), + obx_int.ModelProperty( + id: const obx_int.IdUid(9, 8313675762076426993), + name: 'state', + type: 6, + flags: 8, + indexId: const obx_int.IdUid(76, 4653884840954261598), + ), + obx_int.ModelProperty( + id: const obx_int.IdUid(10, 1791582430176981252), + name: 'quarantineReason', + type: 9, + flags: 0, + ), + obx_int.ModelProperty( + id: const obx_int.IdUid(11, 6754220496000410228), + name: 'createdAtMs', + type: 6, + flags: 0, + ), + obx_int.ModelProperty( + id: const obx_int.IdUid(12, 4810596780446149463), + name: 'updatedAtMs', + type: 6, + flags: 0, + ), + ], + relations: [], + backlinks: [], + ), + obx_int.ModelEntity( + id: const obx_int.IdUid(30, 156682190547124916), + name: 'CloudKitDeletionQuarantineEntity', + lastPropertyId: const obx_int.IdUid(6, 7608873074433568741), + flags: 0, + properties: [ + obx_int.ModelProperty( + id: const obx_int.IdUid(1, 9016454772102266426), + name: 'id', + type: 6, + flags: 1, + ), + obx_int.ModelProperty( + id: const obx_int.IdUid(2, 6218233504524201595), + name: 'quarantineKey', + type: 9, + flags: 4128, + indexId: const obx_int.IdUid(77, 1999680227156715272), + ), + obx_int.ModelProperty( + id: const obx_int.IdUid(3, 5288728045287545979), + name: 'sourceKey', + type: 9, + flags: 0, + ), + obx_int.ModelProperty( + id: const obx_int.IdUid(4, 7940712078234941674), + name: 'recordId', + type: 9, + flags: 0, + ), + obx_int.ModelProperty( + id: const obx_int.IdUid(5, 8871707048403049958), + name: 'reason', + type: 9, + flags: 0, + ), + obx_int.ModelProperty( + id: const obx_int.IdUid(6, 7608873074433568741), + name: 'createdAtMs', + type: 6, + flags: 0, + ), + ], + relations: [], + backlinks: [], + ), ]; /// Shortcut for [obx.Store.new] that passes [getObjectBoxModel] and for Flutter @@ -933,1205 +2568,3468 @@ final _entities = [ /// For Flutter apps, also calls `loadObjectBoxLibraryAndroidCompat()` from /// the ObjectBox Flutter library to fix loading the native ObjectBox library /// on Android 6 and older. -Future openStore( - {String? directory, - int? maxDBSizeInKB, - int? maxDataSizeInKB, - int? fileMode, - int? maxReaders, - bool queriesCaseSensitiveDefault = true, - String? macosApplicationGroup}) async { +Future openStore({ + String? directory, + int? maxDBSizeInKB, + int? maxDataSizeInKB, + int? fileMode, + int? maxReaders, + bool queriesCaseSensitiveDefault = true, + String? macosApplicationGroup, +}) async { await loadObjectBoxLibraryAndroidCompat(); - return obx.Store(getObjectBoxModel(), - directory: directory ?? (await defaultStoreDirectory()).path, - maxDBSizeInKB: maxDBSizeInKB, - maxDataSizeInKB: maxDataSizeInKB, - fileMode: fileMode, - maxReaders: maxReaders, - queriesCaseSensitiveDefault: queriesCaseSensitiveDefault, - macosApplicationGroup: macosApplicationGroup); + return obx.Store( + getObjectBoxModel(), + directory: directory ?? (await defaultStoreDirectory()).path, + maxDBSizeInKB: maxDBSizeInKB, + maxDataSizeInKB: maxDataSizeInKB, + fileMode: fileMode, + maxReaders: maxReaders, + queriesCaseSensitiveDefault: queriesCaseSensitiveDefault, + macosApplicationGroup: macosApplicationGroup, + ); } /// Returns the ObjectBox model definition for this project for use with /// [obx.Store.new]. obx_int.ModelDefinition getObjectBoxModel() { final model = obx_int.ModelInfo( - entities: _entities, - lastEntityId: const obx_int.IdUid(17, 2547083341603323785), - lastIndexId: const obx_int.IdUid(16, 4323200293672047337), - lastRelationId: const obx_int.IdUid(1, 7492985733214117623), - lastSequenceId: const obx_int.IdUid(0, 0), - retiredEntityUids: const [ - 7018417362319461469, - 2687525031757751054, - 1550674322389882817, - 1619417403499629985, - 4450451951397945314, - 1700370751061310153, - 3483028772414651169, - 4579555475244243263 - ], - retiredIndexUids: const [8277667704777683261, 9132680703832217528], - retiredPropertyUids: const [ - 8075530627827069587, - 614139107975861462, - 4854433937459051257, - 5895852794473158582, - 3012867958425492030, - 7948534483488402365, - 7283017531024613481, - 6884032144126638879, - 6176853844548763600, - 9009878668681532753, - 7709208038424465489, - 3701890428713468427, - 735091670169932122, - 3235490937430157681, - 8126854405033462697, - 82657294837234349, - 8117526523647192200, - 8413228078295213488, - 6626097234365517692, - 939052079357746566, - 3171806281750931518, - 4464802064429422611, - 5542585324402061600, - 572939669859263693, - 3185617998247778963, - 769751664576031863, - 4077882089992206144, - 7238968990385881383, - 2316337434845256835, - 3331740086129339824, - 4741144250901643688, - 1646799728535719055, - 2482744653836740926, - 3558704390717166171, - 6156393125011218685, - 861137718943970360, - 4613854641642738901, - 5956431335972854454, - 8252934173466443273, - 7658149783933949012, - 7323923293952799044, - 115725376021487478, - 8802290647274083834, - 5487740941825196608, - 2406258303326474883, - 245348312617052981, - 3858153704624052397, - 63810393639568631, - 977456607049558352, - 2275379924137725049, - 6032584536718919119, - 7725198227526963956, - 4236934751716676271, - 8224006478743498888, - 7392117204304535224, - 5590979280237537790, - 4510870919779209192, - 5203631054946486128, - 2649653758394363860, - 1439376349402210172, - 8308083337629235136, - 790519381961958997, - 5176315239890900498, - 4255445772578528269, - 4403726864971073396, - 2957720185959973011, - 226618350909080419, - 7216531465575414151, - 8776591297555015451, - 549408491521049277, - 6839394073781850549, - 4584830839955803056, - 5300777612659164835, - 7579043230224812288, - 5309991997782167547, - 6035615005231958928, - 457159365740007120, - 6085502636952418888, - 7378813296315172429, - 7968765094195569385, - 8252364803444354563, - 4143511131199296878, - 172817608355620424, - 130925169208448361, - 4983193271800913860, - 4810718806330671770, - 8558367758823185430, - 7997144491374144435, - 1278586999912993922, - 696004914151488398, - 5516087858141459065 - ], - retiredRelationUids: const [], - modelVersion: 5, - modelVersionParserMinimum: 5, - version: 1); + // If this version is not found, it means that this file was generated + // with an older version of the ObjectBox Dart generator. + // Please regenerate this file with the current generator version. + // Typically, this is done with `dart run build_runner build`. + generatorVersion: obx_int.GeneratorVersion.v2025_12_16, + entities: _entities, + lastEntityId: const obx_int.IdUid(30, 156682190547124916), + lastIndexId: const obx_int.IdUid(77, 1999680227156715272), + lastRelationId: const obx_int.IdUid(1, 7492985733214117623), + lastSequenceId: const obx_int.IdUid(0, 0), + retiredEntityUids: const [ + 7018417362319461469, + 2687525031757751054, + 1550674322389882817, + 1619417403499629985, + 4450451951397945314, + 1700370751061310153, + 3483028772414651169, + 4579555475244243263, + ], + retiredIndexUids: const [8277667704777683261, 9132680703832217528], + retiredPropertyUids: const [ + 8075530627827069587, + 614139107975861462, + 4854433937459051257, + 5895852794473158582, + 3012867958425492030, + 7948534483488402365, + 7283017531024613481, + 6884032144126638879, + 6176853844548763600, + 9009878668681532753, + 7709208038424465489, + 3701890428713468427, + 735091670169932122, + 3235490937430157681, + 8126854405033462697, + 82657294837234349, + 8117526523647192200, + 8413228078295213488, + 6626097234365517692, + 939052079357746566, + 3171806281750931518, + 4464802064429422611, + 5542585324402061600, + 572939669859263693, + 3185617998247778963, + 769751664576031863, + 4077882089992206144, + 7238968990385881383, + 2316337434845256835, + 3331740086129339824, + 4741144250901643688, + 1646799728535719055, + 2482744653836740926, + 3558704390717166171, + 6156393125011218685, + 861137718943970360, + 4613854641642738901, + 5956431335972854454, + 8252934173466443273, + 7658149783933949012, + 7323923293952799044, + 115725376021487478, + 8802290647274083834, + 5487740941825196608, + 2406258303326474883, + 245348312617052981, + 3858153704624052397, + 63810393639568631, + 977456607049558352, + 2275379924137725049, + 6032584536718919119, + 7725198227526963956, + 4236934751716676271, + 8224006478743498888, + 7392117204304535224, + 5590979280237537790, + 4510870919779209192, + 5203631054946486128, + 2649653758394363860, + 1439376349402210172, + 8308083337629235136, + 790519381961958997, + 5176315239890900498, + 4255445772578528269, + 4403726864971073396, + 2957720185959973011, + 226618350909080419, + 7216531465575414151, + 8776591297555015451, + 549408491521049277, + 6839394073781850549, + 4584830839955803056, + 5300777612659164835, + 7579043230224812288, + 5309991997782167547, + 6035615005231958928, + 457159365740007120, + 6085502636952418888, + 7378813296315172429, + 7968765094195569385, + 8252364803444354563, + 4143511131199296878, + 172817608355620424, + 130925169208448361, + 4983193271800913860, + 4810718806330671770, + 8558367758823185430, + 7997144491374144435, + 1278586999912993922, + 696004914151488398, + 5516087858141459065, + 7269255294897696731, + 8215014452962792686, + 1551080847505267540, + ], + retiredRelationUids: const [], + modelVersion: 5, + modelVersionParserMinimum: 5, + version: 1, + ); final bindings = { Attachment: obx_int.EntityDefinition( - model: _entities[0], - toOneRelations: (Attachment object) => [object.message], - toManyRelations: (Attachment object) => {}, - getId: (Attachment object) => object.id, - setId: (Attachment object, int id) { - object.id = id; - }, - objectToFB: (Attachment object, fb.Builder fbb) { - final guidOffset = - object.guid == null ? null : fbb.writeString(object.guid!); - final utiOffset = - object.uti == null ? null : fbb.writeString(object.uti!); - final mimeTypeOffset = object.mimeType == null - ? null - : fbb.writeString(object.mimeType!); - final transferNameOffset = object.transferName == null - ? null - : fbb.writeString(object.transferName!); - final webUrlOffset = - object.webUrl == null ? null : fbb.writeString(object.webUrl!); - final dbMetadataOffset = object.dbMetadata == null - ? null - : fbb.writeString(object.dbMetadata!); - final ckRecordIdOffset = object.ckRecordId == null - ? null - : fbb.writeString(object.ckRecordId!); - fbb.startTable(21); - fbb.addInt64(0, object.id ?? 0); - fbb.addInt64(1, object.originalROWID); - fbb.addOffset(2, guidOffset); - fbb.addOffset(3, utiOffset); - fbb.addOffset(4, mimeTypeOffset); - fbb.addBool(6, object.isOutgoing); - fbb.addOffset(7, transferNameOffset); - fbb.addInt64(8, object.totalBytes); - fbb.addInt64(12, object.height); - fbb.addInt64(13, object.width); - fbb.addOffset(15, webUrlOffset); - fbb.addInt64(16, object.message.targetId); - fbb.addOffset(17, dbMetadataOffset); - fbb.addBool(18, object.hasLivePhoto); - fbb.addOffset(19, ckRecordIdOffset); - fbb.finish(fbb.endTable()); - return object.id ?? 0; - }, - objectFromFB: (obx.Store store, ByteData fbData) { - final buffer = fb.BufferContext(fbData); - final rootOffset = buffer.derefObject(0); - final idParam = - const fb.Int64Reader().vTableGetNullable(buffer, rootOffset, 4); - final originalROWIDParam = - const fb.Int64Reader().vTableGetNullable(buffer, rootOffset, 6); - final guidParam = const fb.StringReader(asciiOptimization: true) - .vTableGetNullable(buffer, rootOffset, 8); - final utiParam = const fb.StringReader(asciiOptimization: true) - .vTableGetNullable(buffer, rootOffset, 10); - final mimeTypeParam = const fb.StringReader(asciiOptimization: true) - .vTableGetNullable(buffer, rootOffset, 12); - final isOutgoingParam = - const fb.BoolReader().vTableGetNullable(buffer, rootOffset, 16); - final transferNameParam = - const fb.StringReader(asciiOptimization: true) - .vTableGetNullable(buffer, rootOffset, 18); - final totalBytesParam = - const fb.Int64Reader().vTableGetNullable(buffer, rootOffset, 20); - final heightParam = - const fb.Int64Reader().vTableGetNullable(buffer, rootOffset, 28); - final widthParam = - const fb.Int64Reader().vTableGetNullable(buffer, rootOffset, 30); - final webUrlParam = const fb.StringReader(asciiOptimization: true) - .vTableGetNullable(buffer, rootOffset, 34); - final hasLivePhotoParam = - const fb.BoolReader().vTableGet(buffer, rootOffset, 40, false); - final object = Attachment( - id: idParam, - originalROWID: originalROWIDParam, - guid: guidParam, - uti: utiParam, - mimeType: mimeTypeParam, - isOutgoing: isOutgoingParam, - transferName: transferNameParam, - totalBytes: totalBytesParam, - height: heightParam, - width: widthParam, - webUrl: webUrlParam, - hasLivePhoto: hasLivePhotoParam) - ..dbMetadata = const fb.StringReader(asciiOptimization: true) - .vTableGetNullable(buffer, rootOffset, 38) - ..ckRecordId = const fb.StringReader(asciiOptimization: true) - .vTableGetNullable(buffer, rootOffset, 42); - object.message.targetId = - const fb.Int64Reader().vTableGet(buffer, rootOffset, 36, 0); - object.message.attach(store); - return object; - }), + model: _entities[0], + toOneRelations: (Attachment object) => [object.message], + toManyRelations: (Attachment object) => {}, + getId: (Attachment object) => object.id, + setId: (Attachment object, int id) { + object.id = id; + }, + objectToFB: (Attachment object, fb.Builder fbb) { + final guidOffset = object.guid == null + ? null + : fbb.writeString(object.guid!); + final utiOffset = object.uti == null + ? null + : fbb.writeString(object.uti!); + final mimeTypeOffset = object.mimeType == null + ? null + : fbb.writeString(object.mimeType!); + final transferNameOffset = object.transferName == null + ? null + : fbb.writeString(object.transferName!); + final webUrlOffset = object.webUrl == null + ? null + : fbb.writeString(object.webUrl!); + final dbMetadataOffset = object.dbMetadata == null + ? null + : fbb.writeString(object.dbMetadata!); + final ckRecordIdOffset = object.ckRecordId == null + ? null + : fbb.writeString(object.ckRecordId!); + final metadataOffset = object.metadata == null + ? null + : fbb.writeListInt8(obx_int.toFlexBuffer(object.metadata!)); + fbb.startTable(22); + fbb.addInt64(0, object.id ?? 0); + fbb.addInt64(1, object.originalROWID); + fbb.addOffset(2, guidOffset); + fbb.addOffset(3, utiOffset); + fbb.addOffset(4, mimeTypeOffset); + fbb.addBool(6, object.isOutgoing); + fbb.addOffset(7, transferNameOffset); + fbb.addInt64(8, object.totalBytes); + fbb.addInt64(12, object.height); + fbb.addInt64(13, object.width); + fbb.addOffset(15, webUrlOffset); + fbb.addInt64(16, object.message.targetId); + fbb.addOffset(17, dbMetadataOffset); + fbb.addBool(18, object.hasLivePhoto); + fbb.addOffset(19, ckRecordIdOffset); + fbb.addOffset(20, metadataOffset); + fbb.finish(fbb.endTable()); + return object.id ?? 0; + }, + objectFromFB: (obx.Store store, ByteData fbData) { + final buffer = fb.BufferContext(fbData); + final rootOffset = buffer.derefObject(0); + final idParam = const fb.Int64Reader().vTableGetNullable( + buffer, + rootOffset, + 4, + ); + final originalROWIDParam = const fb.Int64Reader().vTableGetNullable( + buffer, + rootOffset, + 6, + ); + final guidParam = const fb.StringReader( + asciiOptimization: true, + ).vTableGetNullable(buffer, rootOffset, 8); + final utiParam = const fb.StringReader( + asciiOptimization: true, + ).vTableGetNullable(buffer, rootOffset, 10); + final mimeTypeParam = const fb.StringReader( + asciiOptimization: true, + ).vTableGetNullable(buffer, rootOffset, 12); + final isOutgoingParam = const fb.BoolReader().vTableGetNullable( + buffer, + rootOffset, + 16, + ); + final transferNameParam = const fb.StringReader( + asciiOptimization: true, + ).vTableGetNullable(buffer, rootOffset, 18); + final totalBytesParam = const fb.Int64Reader().vTableGetNullable( + buffer, + rootOffset, + 20, + ); + final heightParam = const fb.Int64Reader().vTableGetNullable( + buffer, + rootOffset, + 28, + ); + final widthParam = const fb.Int64Reader().vTableGetNullable( + buffer, + rootOffset, + 30, + ); + final metadataParam = obx_int.flexBufferToMap(buffer, rootOffset, 44); + final webUrlParam = const fb.StringReader( + asciiOptimization: true, + ).vTableGetNullable(buffer, rootOffset, 34); + final hasLivePhotoParam = const fb.BoolReader().vTableGet( + buffer, + rootOffset, + 40, + false, + ); + final object = + Attachment( + id: idParam, + originalROWID: originalROWIDParam, + guid: guidParam, + uti: utiParam, + mimeType: mimeTypeParam, + isOutgoing: isOutgoingParam, + transferName: transferNameParam, + totalBytes: totalBytesParam, + height: heightParam, + width: widthParam, + metadata: metadataParam, + webUrl: webUrlParam, + hasLivePhoto: hasLivePhotoParam, + ) + ..dbMetadata = const fb.StringReader( + asciiOptimization: true, + ).vTableGetNullable(buffer, rootOffset, 38) + ..ckRecordId = const fb.StringReader( + asciiOptimization: true, + ).vTableGetNullable(buffer, rootOffset, 42); + object.message.targetId = const fb.Int64Reader().vTableGet( + buffer, + rootOffset, + 36, + 0, + ); + object.message.attach(store); + return object; + }, + ), Chat: obx_int.EntityDefinition( - model: _entities[1], - toOneRelations: (Chat object) => [], - toManyRelations: (Chat object) => { - obx_int.RelInfo.toMany(1, object.id!): object.handles, - obx_int.RelInfo.toOneBacklink( - 39, object.id!, (Message srcObject) => srcObject.chat): - object.messages - }, - getId: (Chat object) => object.id, - setId: (Chat object, int id) { - object.id = id; - }, - objectToFB: (Chat object, fb.Builder fbb) { - final guidOffset = fbb.writeString(object.guid); - final chatIdentifierOffset = object.chatIdentifier == null - ? null - : fbb.writeString(object.chatIdentifier!); - final muteTypeOffset = object.muteType == null - ? null - : fbb.writeString(object.muteType!); - final muteArgsOffset = object.muteArgs == null - ? null - : fbb.writeString(object.muteArgs!); - final titleOffset = - object.title == null ? null : fbb.writeString(object.title!); - final displayNameOffset = object.displayName == null - ? null - : fbb.writeString(object.displayName!); - final customAvatarPathOffset = object.customAvatarPath == null - ? null - : fbb.writeString(object.customAvatarPath!); - final textFieldTextOffset = object.textFieldText == null - ? null - : fbb.writeString(object.textFieldText!); - final textFieldAttachmentsOffset = fbb.writeList(object - .textFieldAttachments + model: _entities[1], + toOneRelations: (Chat object) => [], + toManyRelations: (Chat object) => { + obx_int.RelInfo.toMany(1, object.id!): object.handles, + obx_int.RelInfo.toOneBacklink( + 39, + object.id!, + (Message srcObject) => srcObject.chat, + ): object.messages, + }, + getId: (Chat object) => object.id, + setId: (Chat object, int id) { + object.id = id; + }, + objectToFB: (Chat object, fb.Builder fbb) { + final guidOffset = fbb.writeString(object.guid); + final chatIdentifierOffset = object.chatIdentifier == null + ? null + : fbb.writeString(object.chatIdentifier!); + final muteTypeOffset = object.muteType == null + ? null + : fbb.writeString(object.muteType!); + final muteArgsOffset = object.muteArgs == null + ? null + : fbb.writeString(object.muteArgs!); + final titleOffset = object.title == null + ? null + : fbb.writeString(object.title!); + final displayNameOffset = object.displayName == null + ? null + : fbb.writeString(object.displayName!); + final customAvatarPathOffset = object.customAvatarPath == null + ? null + : fbb.writeString(object.customAvatarPath!); + final textFieldTextOffset = object.textFieldText == null + ? null + : fbb.writeString(object.textFieldText!); + final textFieldAttachmentsOffset = fbb.writeList( + object.textFieldAttachments .map(fbb.writeString) - .toList(growable: false)); - final lastReadMessageGuidOffset = object.lastReadMessageGuid == null - ? null - : fbb.writeString(object.lastReadMessageGuid!); - final usingHandleOffset = object.usingHandle == null - ? null - : fbb.writeString(object.usingHandle!); - final apnTitleOffset = object.apnTitle == null - ? null - : fbb.writeString(object.apnTitle!); - final guidRefsOffset = fbb.writeList( - object.guidRefs.map(fbb.writeString).toList(growable: false)); - final textFieldAnnotationsOffset = object.textFieldAnnotations == null - ? null - : fbb.writeString(object.textFieldAnnotations!); - final transcriptPosterPathOffset = object.transcriptPosterPath == null - ? null - : fbb.writeString(object.transcriptPosterPath!); - final cloudDataOffset = object.cloudData == null - ? null - : fbb.writeListInt8(object.cloudData!); - final ckRecordIdOffset = object.ckRecordId == null - ? null - : fbb.writeString(object.ckRecordId!); - final photoAttachmentGuidOffset = object.photoAttachmentGuid == null - ? null - : fbb.writeString(object.photoAttachmentGuid!); - final cloudGuidOffset = object.cloudGuid == null - ? null - : fbb.writeString(object.cloudGuid!); - fbb.startTable(49); - fbb.addInt64(0, object.id ?? 0); - fbb.addOffset(2, guidOffset); - fbb.addOffset(4, chatIdentifierOffset); - fbb.addBool(5, object.isArchived); - fbb.addOffset(7, muteTypeOffset); - fbb.addOffset(8, muteArgsOffset); - fbb.addBool(9, object.isPinned); - fbb.addBool(10, object.hasUnreadMessage); - fbb.addInt64( - 11, object.dbOnlyLatestMessageDate?.millisecondsSinceEpoch); - fbb.addOffset(14, titleOffset); - fbb.addOffset(15, displayNameOffset); - fbb.addOffset(17, customAvatarPathOffset); - fbb.addInt64(18, object.pinIndex); - fbb.addBool(19, object.autoSendReadReceipts); - fbb.addBool(20, object.autoSendTypingIndicators); - fbb.addOffset(21, textFieldTextOffset); - fbb.addOffset(22, textFieldAttachmentsOffset); - fbb.addInt64(23, object.dateDeleted?.millisecondsSinceEpoch); - fbb.addInt64(24, object.style); - fbb.addBool(25, object.lockChatName); - fbb.addBool(26, object.lockChatIcon); - fbb.addOffset(27, lastReadMessageGuidOffset); - fbb.addInt64(28, object.groupVersion); - fbb.addOffset(29, usingHandleOffset); - fbb.addOffset(30, apnTitleOffset); - fbb.addBool(31, object.isRpSms); - fbb.addOffset(32, guidRefsOffset); - fbb.addInt64(33, object.telephonyId); - fbb.addOffset(34, textFieldAnnotationsOffset); - fbb.addBool(35, object.shareZenMode); - fbb.addBool(36, object.notifsSilenced); - fbb.addInt64(37, object.dateNotifiedAnyways?.millisecondsSinceEpoch); - fbb.addInt64(38, object.zenModeIsShared); - fbb.addBool(39, object.senderIsKnown); - fbb.addBool(40, object.isRoutingStub); - fbb.addOffset(41, transcriptPosterPathOffset); - fbb.addInt64(42, object.transcriptBackgroundVersion); - fbb.addOffset(43, cloudDataOffset); - fbb.addOffset(44, ckRecordIdOffset); - fbb.addBool(45, object.ckSyncState); - fbb.addOffset(46, photoAttachmentGuidOffset); - fbb.addOffset(47, cloudGuidOffset); - fbb.finish(fbb.endTable()); - return object.id ?? 0; - }, - objectFromFB: (obx.Store store, ByteData fbData) { - final buffer = fb.BufferContext(fbData); - final rootOffset = buffer.derefObject(0); - final dbOnlyLatestMessageDateValue = - const fb.Int64Reader().vTableGetNullable(buffer, rootOffset, 26); - final dateDeletedValue = - const fb.Int64Reader().vTableGetNullable(buffer, rootOffset, 50); - final dateNotifiedAnywaysValue = - const fb.Int64Reader().vTableGetNullable(buffer, rootOffset, 78); - final idParam = - const fb.Int64Reader().vTableGetNullable(buffer, rootOffset, 4); - final guidParam = const fb.StringReader(asciiOptimization: true) - .vTableGet(buffer, rootOffset, 8, ''); - final chatIdentifierParam = - const fb.StringReader(asciiOptimization: true) - .vTableGetNullable(buffer, rootOffset, 12); - final isArchivedParam = - const fb.BoolReader().vTableGetNullable(buffer, rootOffset, 14); - final isPinnedParam = - const fb.BoolReader().vTableGetNullable(buffer, rootOffset, 22); - final muteTypeParam = const fb.StringReader(asciiOptimization: true) - .vTableGetNullable(buffer, rootOffset, 18); - final muteArgsParam = const fb.StringReader(asciiOptimization: true) - .vTableGetNullable(buffer, rootOffset, 20); - final hasUnreadMessageParam = - const fb.BoolReader().vTableGetNullable(buffer, rootOffset, 24); - final displayNameParam = - const fb.StringReader(asciiOptimization: true) - .vTableGetNullable(buffer, rootOffset, 34); - final autoSendReadReceiptsParam = - const fb.BoolReader().vTableGetNullable(buffer, rootOffset, 42); - final autoSendTypingIndicatorsParam = - const fb.BoolReader().vTableGetNullable(buffer, rootOffset, 44); - final textFieldTextParam = - const fb.StringReader(asciiOptimization: true) - .vTableGetNullable(buffer, rootOffset, 46); - final textFieldAnnotationsParam = - const fb.StringReader(asciiOptimization: true) - .vTableGetNullable(buffer, rootOffset, 72); - final textFieldAttachmentsParam = const fb.ListReader( - fb.StringReader(asciiOptimization: true), - lazy: false) - .vTableGet(buffer, rootOffset, 48, []); - final dateDeletedParam = dateDeletedValue == null - ? null - : DateTime.fromMillisecondsSinceEpoch(dateDeletedValue); - final styleParam = - const fb.Int64Reader().vTableGetNullable(buffer, rootOffset, 52); - final lockChatNameParam = - const fb.BoolReader().vTableGet(buffer, rootOffset, 54, false); - final lockChatIconParam = - const fb.BoolReader().vTableGet(buffer, rootOffset, 56, false); - final lastReadMessageGuidParam = - const fb.StringReader(asciiOptimization: true) - .vTableGetNullable(buffer, rootOffset, 58); - final usingHandleParam = - const fb.StringReader(asciiOptimization: true) - .vTableGetNullable(buffer, rootOffset, 62); - final isRpSmsParam = - const fb.BoolReader().vTableGet(buffer, rootOffset, 66, false); - final telephonyIdParam = - const fb.Int64Reader().vTableGetNullable(buffer, rootOffset, 70); - final shareZenModeParam = - const fb.BoolReader().vTableGetNullable(buffer, rootOffset, 74); - final notifsSilencedParam = - const fb.BoolReader().vTableGet(buffer, rootOffset, 76, false); - final dateNotifiedAnywaysParam = dateNotifiedAnywaysValue == null - ? null - : DateTime.fromMillisecondsSinceEpoch(dateNotifiedAnywaysValue); - final zenModeIsSharedParam = - const fb.Int64Reader().vTableGetNullable(buffer, rootOffset, 80); - final senderIsKnownParam = - const fb.BoolReader().vTableGetNullable(buffer, rootOffset, 82); - final isRoutingStubParam = - const fb.BoolReader().vTableGet(buffer, rootOffset, 84, false); - final guidRefsParam = const fb.ListReader( - fb.StringReader(asciiOptimization: true), - lazy: false) - .vTableGet(buffer, rootOffset, 68, []); - final object = Chat( + .toList(growable: false), + ); + final lastReadMessageGuidOffset = object.lastReadMessageGuid == null + ? null + : fbb.writeString(object.lastReadMessageGuid!); + final usingHandleOffset = object.usingHandle == null + ? null + : fbb.writeString(object.usingHandle!); + final apnTitleOffset = object.apnTitle == null + ? null + : fbb.writeString(object.apnTitle!); + final guidRefsOffset = fbb.writeList( + object.guidRefs.map(fbb.writeString).toList(growable: false), + ); + final textFieldAnnotationsOffset = object.textFieldAnnotations == null + ? null + : fbb.writeString(object.textFieldAnnotations!); + final transcriptPosterPathOffset = object.transcriptPosterPath == null + ? null + : fbb.writeString(object.transcriptPosterPath!); + final cloudDataOffset = object.cloudData == null + ? null + : fbb.writeListInt8(object.cloudData!); + final ckRecordIdOffset = object.ckRecordId == null + ? null + : fbb.writeString(object.ckRecordId!); + final photoAttachmentGuidOffset = object.photoAttachmentGuid == null + ? null + : fbb.writeString(object.photoAttachmentGuid!); + final cloudGuidOffset = object.cloudGuid == null + ? null + : fbb.writeString(object.cloudGuid!); + fbb.startTable(49); + fbb.addInt64(0, object.id ?? 0); + fbb.addOffset(2, guidOffset); + fbb.addOffset(4, chatIdentifierOffset); + fbb.addBool(5, object.isArchived); + fbb.addOffset(7, muteTypeOffset); + fbb.addOffset(8, muteArgsOffset); + fbb.addBool(9, object.isPinned); + fbb.addBool(10, object.hasUnreadMessage); + fbb.addInt64( + 11, + object.dbOnlyLatestMessageDate?.millisecondsSinceEpoch, + ); + fbb.addOffset(14, titleOffset); + fbb.addOffset(15, displayNameOffset); + fbb.addOffset(17, customAvatarPathOffset); + fbb.addInt64(18, object.pinIndex); + fbb.addBool(19, object.autoSendReadReceipts); + fbb.addBool(20, object.autoSendTypingIndicators); + fbb.addOffset(21, textFieldTextOffset); + fbb.addOffset(22, textFieldAttachmentsOffset); + fbb.addInt64(23, object.dateDeleted?.millisecondsSinceEpoch); + fbb.addInt64(24, object.style); + fbb.addBool(25, object.lockChatName); + fbb.addBool(26, object.lockChatIcon); + fbb.addOffset(27, lastReadMessageGuidOffset); + fbb.addInt64(28, object.groupVersion); + fbb.addOffset(29, usingHandleOffset); + fbb.addOffset(30, apnTitleOffset); + fbb.addBool(31, object.isRpSms); + fbb.addOffset(32, guidRefsOffset); + fbb.addInt64(33, object.telephonyId); + fbb.addOffset(34, textFieldAnnotationsOffset); + fbb.addBool(35, object.shareZenMode); + fbb.addBool(36, object.notifsSilenced); + fbb.addInt64(37, object.dateNotifiedAnyways?.millisecondsSinceEpoch); + fbb.addInt64(38, object.zenModeIsShared); + fbb.addBool(39, object.senderIsKnown); + fbb.addBool(40, object.isRoutingStub); + fbb.addOffset(41, transcriptPosterPathOffset); + fbb.addInt64(42, object.transcriptBackgroundVersion); + fbb.addOffset(43, cloudDataOffset); + fbb.addOffset(44, ckRecordIdOffset); + fbb.addBool(45, object.ckSyncState); + fbb.addOffset(46, photoAttachmentGuidOffset); + fbb.addOffset(47, cloudGuidOffset); + fbb.finish(fbb.endTable()); + return object.id ?? 0; + }, + objectFromFB: (obx.Store store, ByteData fbData) { + final buffer = fb.BufferContext(fbData); + final rootOffset = buffer.derefObject(0); + final dbOnlyLatestMessageDateValue = const fb.Int64Reader() + .vTableGetNullable(buffer, rootOffset, 26); + final dateDeletedValue = const fb.Int64Reader().vTableGetNullable( + buffer, + rootOffset, + 50, + ); + final dateNotifiedAnywaysValue = const fb.Int64Reader() + .vTableGetNullable(buffer, rootOffset, 78); + final idParam = const fb.Int64Reader().vTableGetNullable( + buffer, + rootOffset, + 4, + ); + final guidParam = const fb.StringReader( + asciiOptimization: true, + ).vTableGet(buffer, rootOffset, 8, ''); + final chatIdentifierParam = const fb.StringReader( + asciiOptimization: true, + ).vTableGetNullable(buffer, rootOffset, 12); + final isArchivedParam = const fb.BoolReader().vTableGetNullable( + buffer, + rootOffset, + 14, + ); + final isPinnedParam = const fb.BoolReader().vTableGetNullable( + buffer, + rootOffset, + 22, + ); + final muteTypeParam = const fb.StringReader( + asciiOptimization: true, + ).vTableGetNullable(buffer, rootOffset, 18); + final muteArgsParam = const fb.StringReader( + asciiOptimization: true, + ).vTableGetNullable(buffer, rootOffset, 20); + final hasUnreadMessageParam = const fb.BoolReader().vTableGetNullable( + buffer, + rootOffset, + 24, + ); + final displayNameParam = const fb.StringReader( + asciiOptimization: true, + ).vTableGetNullable(buffer, rootOffset, 34); + final autoSendReadReceiptsParam = const fb.BoolReader() + .vTableGetNullable(buffer, rootOffset, 42); + final autoSendTypingIndicatorsParam = const fb.BoolReader() + .vTableGetNullable(buffer, rootOffset, 44); + final textFieldTextParam = const fb.StringReader( + asciiOptimization: true, + ).vTableGetNullable(buffer, rootOffset, 46); + final textFieldAnnotationsParam = const fb.StringReader( + asciiOptimization: true, + ).vTableGetNullable(buffer, rootOffset, 72); + final textFieldAttachmentsParam = const fb.ListReader( + fb.StringReader(asciiOptimization: true), + lazy: false, + ).vTableGet(buffer, rootOffset, 48, []); + final dateDeletedParam = dateDeletedValue == null + ? null + : DateTime.fromMillisecondsSinceEpoch(dateDeletedValue); + final styleParam = const fb.Int64Reader().vTableGetNullable( + buffer, + rootOffset, + 52, + ); + final lockChatNameParam = const fb.BoolReader().vTableGet( + buffer, + rootOffset, + 54, + false, + ); + final lockChatIconParam = const fb.BoolReader().vTableGet( + buffer, + rootOffset, + 56, + false, + ); + final lastReadMessageGuidParam = const fb.StringReader( + asciiOptimization: true, + ).vTableGetNullable(buffer, rootOffset, 58); + final usingHandleParam = const fb.StringReader( + asciiOptimization: true, + ).vTableGetNullable(buffer, rootOffset, 62); + final isRpSmsParam = const fb.BoolReader().vTableGet( + buffer, + rootOffset, + 66, + false, + ); + final telephonyIdParam = const fb.Int64Reader().vTableGetNullable( + buffer, + rootOffset, + 70, + ); + final shareZenModeParam = const fb.BoolReader().vTableGetNullable( + buffer, + rootOffset, + 74, + ); + final notifsSilencedParam = const fb.BoolReader().vTableGet( + buffer, + rootOffset, + 76, + false, + ); + final dateNotifiedAnywaysParam = dateNotifiedAnywaysValue == null + ? null + : DateTime.fromMillisecondsSinceEpoch(dateNotifiedAnywaysValue); + final zenModeIsSharedParam = const fb.Int64Reader().vTableGetNullable( + buffer, + rootOffset, + 80, + ); + final senderIsKnownParam = const fb.BoolReader().vTableGetNullable( + buffer, + rootOffset, + 82, + ); + final isRoutingStubParam = const fb.BoolReader().vTableGet( + buffer, + rootOffset, + 84, + false, + ); + final guidRefsParam = const fb.ListReader( + fb.StringReader(asciiOptimization: true), + lazy: false, + ).vTableGet(buffer, rootOffset, 68, []); + final object = + Chat( + id: idParam, + guid: guidParam, + chatIdentifier: chatIdentifierParam, + isArchived: isArchivedParam, + isPinned: isPinnedParam, + muteType: muteTypeParam, + muteArgs: muteArgsParam, + hasUnreadMessage: hasUnreadMessageParam, + displayName: displayNameParam, + autoSendReadReceipts: autoSendReadReceiptsParam, + autoSendTypingIndicators: autoSendTypingIndicatorsParam, + textFieldText: textFieldTextParam, + textFieldAnnotations: textFieldAnnotationsParam, + textFieldAttachments: textFieldAttachmentsParam, + dateDeleted: dateDeletedParam, + style: styleParam, + lockChatName: lockChatNameParam, + lockChatIcon: lockChatIconParam, + lastReadMessageGuid: lastReadMessageGuidParam, + usingHandle: usingHandleParam, + isRpSms: isRpSmsParam, + telephonyId: telephonyIdParam, + shareZenMode: shareZenModeParam, + notifsSilenced: notifsSilencedParam, + dateNotifiedAnyways: dateNotifiedAnywaysParam, + zenModeIsShared: zenModeIsSharedParam, + senderIsKnown: senderIsKnownParam, + isRoutingStub: isRoutingStubParam, + guidRefs: guidRefsParam, + ) + ..dbOnlyLatestMessageDate = dbOnlyLatestMessageDateValue == null + ? null + : DateTime.fromMillisecondsSinceEpoch( + dbOnlyLatestMessageDateValue, + ) + ..title = const fb.StringReader( + asciiOptimization: true, + ).vTableGetNullable(buffer, rootOffset, 32) + ..customAvatarPath = const fb.StringReader( + asciiOptimization: true, + ).vTableGetNullable(buffer, rootOffset, 38) + ..pinIndex = const fb.Int64Reader().vTableGetNullable( + buffer, + rootOffset, + 40, + ) + ..groupVersion = const fb.Int64Reader().vTableGetNullable( + buffer, + rootOffset, + 60, + ) + ..apnTitle = const fb.StringReader( + asciiOptimization: true, + ).vTableGetNullable(buffer, rootOffset, 64) + ..transcriptPosterPath = const fb.StringReader( + asciiOptimization: true, + ).vTableGetNullable(buffer, rootOffset, 86) + ..transcriptBackgroundVersion = const fb.Int64Reader().vTableGet( + buffer, + rootOffset, + 88, + 0, + ) + ..cloudData = + const fb.Uint8ListReader( + lazy: false, + ).vTableGetNullable(buffer, rootOffset, 90) + as Uint8List? + ..ckRecordId = const fb.StringReader( + asciiOptimization: true, + ).vTableGetNullable(buffer, rootOffset, 92) + ..ckSyncState = const fb.BoolReader().vTableGet( + buffer, + rootOffset, + 94, + false, + ) + ..photoAttachmentGuid = const fb.StringReader( + asciiOptimization: true, + ).vTableGetNullable(buffer, rootOffset, 96) + ..cloudGuid = const fb.StringReader( + asciiOptimization: true, + ).vTableGetNullable(buffer, rootOffset, 98); + obx_int.InternalToManyAccess.setRelInfo( + object.handles, + store, + obx_int.RelInfo.toMany(1, object.id!), + ); + obx_int.InternalToManyAccess.setRelInfo( + object.messages, + store, + obx_int.RelInfo.toOneBacklink( + 39, + object.id!, + (Message srcObject) => srcObject.chat, + ), + ); + return object; + }, + ), + FCMData: obx_int.EntityDefinition( + model: _entities[2], + toOneRelations: (FCMData object) => [], + toManyRelations: (FCMData object) => {}, + getId: (FCMData object) => object.id, + setId: (FCMData object, int id) { + object.id = id; + }, + objectToFB: (FCMData object, fb.Builder fbb) { + final projectIDOffset = object.projectID == null + ? null + : fbb.writeString(object.projectID!); + final storageBucketOffset = object.storageBucket == null + ? null + : fbb.writeString(object.storageBucket!); + final apiKeyOffset = object.apiKey == null + ? null + : fbb.writeString(object.apiKey!); + final firebaseURLOffset = object.firebaseURL == null + ? null + : fbb.writeString(object.firebaseURL!); + final clientIDOffset = object.clientID == null + ? null + : fbb.writeString(object.clientID!); + final applicationIDOffset = object.applicationID == null + ? null + : fbb.writeString(object.applicationID!); + fbb.startTable(8); + fbb.addInt64(0, object.id ?? 0); + fbb.addOffset(1, projectIDOffset); + fbb.addOffset(2, storageBucketOffset); + fbb.addOffset(3, apiKeyOffset); + fbb.addOffset(4, firebaseURLOffset); + fbb.addOffset(5, clientIDOffset); + fbb.addOffset(6, applicationIDOffset); + fbb.finish(fbb.endTable()); + return object.id ?? 0; + }, + objectFromFB: (obx.Store store, ByteData fbData) { + final buffer = fb.BufferContext(fbData); + final rootOffset = buffer.derefObject(0); + final idParam = const fb.Int64Reader().vTableGetNullable( + buffer, + rootOffset, + 4, + ); + final projectIDParam = const fb.StringReader( + asciiOptimization: true, + ).vTableGetNullable(buffer, rootOffset, 6); + final storageBucketParam = const fb.StringReader( + asciiOptimization: true, + ).vTableGetNullable(buffer, rootOffset, 8); + final apiKeyParam = const fb.StringReader( + asciiOptimization: true, + ).vTableGetNullable(buffer, rootOffset, 10); + final firebaseURLParam = const fb.StringReader( + asciiOptimization: true, + ).vTableGetNullable(buffer, rootOffset, 12); + final clientIDParam = const fb.StringReader( + asciiOptimization: true, + ).vTableGetNullable(buffer, rootOffset, 14); + final applicationIDParam = const fb.StringReader( + asciiOptimization: true, + ).vTableGetNullable(buffer, rootOffset, 16); + final object = FCMData( + id: idParam, + projectID: projectIDParam, + storageBucket: storageBucketParam, + apiKey: apiKeyParam, + firebaseURL: firebaseURLParam, + clientID: clientIDParam, + applicationID: applicationIDParam, + ); + + return object; + }, + ), + Handle: obx_int.EntityDefinition( + model: _entities[3], + toOneRelations: (Handle object) => [object.contactRelation], + toManyRelations: (Handle object) => {}, + getId: (Handle object) => object.id, + setId: (Handle object, int id) { + object.id = id; + }, + objectToFB: (Handle object, fb.Builder fbb) { + final addressOffset = fbb.writeString(object.address); + final countryOffset = object.country == null + ? null + : fbb.writeString(object.country!); + final colorOffset = object.color == null + ? null + : fbb.writeString(object.color!); + final defaultPhoneOffset = object.defaultPhone == null + ? null + : fbb.writeString(object.defaultPhone!); + final defaultEmailOffset = object.defaultEmail == null + ? null + : fbb.writeString(object.defaultEmail!); + final formattedAddressOffset = object.formattedAddress == null + ? null + : fbb.writeString(object.formattedAddress!); + final uniqueAddressAndServiceOffset = fbb.writeString( + object.uniqueAddressAndService, + ); + final serviceOffset = fbb.writeString(object.service); + final posterPathOffset = object.posterPath == null + ? null + : fbb.writeString(object.posterPath!); + fbb.startTable(16); + fbb.addInt64(0, object.id ?? 0); + fbb.addInt64(1, object.originalROWID); + fbb.addOffset(2, addressOffset); + fbb.addOffset(3, countryOffset); + fbb.addOffset(4, colorOffset); + fbb.addOffset(5, defaultPhoneOffset); + fbb.addOffset(7, defaultEmailOffset); + fbb.addOffset(8, formattedAddressOffset); + fbb.addInt64(10, object.contactRelation.targetId); + fbb.addOffset(11, uniqueAddressAndServiceOffset); + fbb.addOffset(12, serviceOffset); + fbb.addOffset(13, posterPathOffset); + fbb.addBool(14, object.blocked); + fbb.finish(fbb.endTable()); + return object.id ?? 0; + }, + objectFromFB: (obx.Store store, ByteData fbData) { + final buffer = fb.BufferContext(fbData); + final rootOffset = buffer.derefObject(0); + final idParam = const fb.Int64Reader().vTableGetNullable( + buffer, + rootOffset, + 4, + ); + final originalROWIDParam = const fb.Int64Reader().vTableGetNullable( + buffer, + rootOffset, + 6, + ); + final addressParam = const fb.StringReader( + asciiOptimization: true, + ).vTableGet(buffer, rootOffset, 8, ''); + final formattedAddressParam = const fb.StringReader( + asciiOptimization: true, + ).vTableGetNullable(buffer, rootOffset, 20); + final serviceParam = const fb.StringReader( + asciiOptimization: true, + ).vTableGet(buffer, rootOffset, 28, ''); + final uniqueAddressAndServiceParam = const fb.StringReader( + asciiOptimization: true, + ).vTableGet(buffer, rootOffset, 26, ''); + final countryParam = const fb.StringReader( + asciiOptimization: true, + ).vTableGetNullable(buffer, rootOffset, 10); + final defaultEmailParam = const fb.StringReader( + asciiOptimization: true, + ).vTableGetNullable(buffer, rootOffset, 18); + final defaultPhoneParam = const fb.StringReader( + asciiOptimization: true, + ).vTableGetNullable(buffer, rootOffset, 14); + final blockedParam = const fb.BoolReader().vTableGet( + buffer, + rootOffset, + 32, + false, + ); + final object = + Handle( + id: idParam, + originalROWID: originalROWIDParam, + address: addressParam, + formattedAddress: formattedAddressParam, + service: serviceParam, + uniqueAddressAndService: uniqueAddressAndServiceParam, + country: countryParam, + defaultEmail: defaultEmailParam, + defaultPhone: defaultPhoneParam, + blocked: blockedParam, + ) + ..color = const fb.StringReader( + asciiOptimization: true, + ).vTableGetNullable(buffer, rootOffset, 12) + ..posterPath = const fb.StringReader( + asciiOptimization: true, + ).vTableGetNullable(buffer, rootOffset, 30); + object.contactRelation.targetId = const fb.Int64Reader().vTableGet( + buffer, + rootOffset, + 24, + 0, + ); + object.contactRelation.attach(store); + return object; + }, + ), + ThemeEntry: obx_int.EntityDefinition( + model: _entities[4], + toOneRelations: (ThemeEntry object) => [object.themeObject], + toManyRelations: (ThemeEntry object) => {}, + getId: (ThemeEntry object) => object.id, + setId: (ThemeEntry object, int id) { + object.id = id; + }, + objectToFB: (ThemeEntry object, fb.Builder fbb) { + final nameOffset = object.name == null + ? null + : fbb.writeString(object.name!); + final dbColorOffset = object.dbColor == null + ? null + : fbb.writeString(object.dbColor!); + fbb.startTable(9); + fbb.addInt64(0, object.id ?? 0); + fbb.addInt64(1, object.themeId); + fbb.addOffset(2, nameOffset); + fbb.addBool(3, object.isFont); + fbb.addInt64(4, object.fontSize); + fbb.addOffset(5, dbColorOffset); + fbb.addInt64(6, object.fontWeight); + fbb.addInt64(7, object.themeObject.targetId); + fbb.finish(fbb.endTable()); + return object.id ?? 0; + }, + objectFromFB: (obx.Store store, ByteData fbData) { + final buffer = fb.BufferContext(fbData); + final rootOffset = buffer.derefObject(0); + final idParam = const fb.Int64Reader().vTableGetNullable( + buffer, + rootOffset, + 4, + ); + final themeIdParam = const fb.Int64Reader().vTableGetNullable( + buffer, + rootOffset, + 6, + ); + final nameParam = const fb.StringReader( + asciiOptimization: true, + ).vTableGetNullable(buffer, rootOffset, 8); + final isFontParam = const fb.BoolReader().vTableGetNullable( + buffer, + rootOffset, + 10, + ); + final fontSizeParam = const fb.Int64Reader().vTableGetNullable( + buffer, + rootOffset, + 12, + ); + final fontWeightParam = const fb.Int64Reader().vTableGetNullable( + buffer, + rootOffset, + 16, + ); + final object = + ThemeEntry( + id: idParam, + themeId: themeIdParam, + name: nameParam, + isFont: isFontParam, + fontSize: fontSizeParam, + fontWeight: fontWeightParam, + ) + ..dbColor = const fb.StringReader( + asciiOptimization: true, + ).vTableGetNullable(buffer, rootOffset, 14); + object.themeObject.targetId = const fb.Int64Reader().vTableGet( + buffer, + rootOffset, + 18, + 0, + ); + object.themeObject.attach(store); + return object; + }, + ), + Message: obx_int.EntityDefinition( + model: _entities[5], + toOneRelations: (Message object) => [object.chat], + toManyRelations: (Message object) => { + obx_int.RelInfo.toOneBacklink( + 17, + object.id!, + (Attachment srcObject) => srcObject.message, + ): object.dbAttachments, + }, + getId: (Message object) => object.id, + setId: (Message object, int id) { + object.id = id; + }, + objectToFB: (Message object, fb.Builder fbb) { + final guidOffset = object.guid == null + ? null + : fbb.writeString(object.guid!); + final textOffset = object.text == null + ? null + : fbb.writeString(object.text!); + final subjectOffset = object.subject == null + ? null + : fbb.writeString(object.subject!); + final countryOffset = object.country == null + ? null + : fbb.writeString(object.country!); + final groupTitleOffset = object.groupTitle == null + ? null + : fbb.writeString(object.groupTitle!); + final balloonBundleIdOffset = object.balloonBundleId == null + ? null + : fbb.writeString(object.balloonBundleId!); + final associatedMessageGuidOffset = object.associatedMessageGuid == null + ? null + : fbb.writeString(object.associatedMessageGuid!); + final associatedMessageTypeOffset = object.associatedMessageType == null + ? null + : fbb.writeString(object.associatedMessageType!); + final expressiveSendStyleIdOffset = object.expressiveSendStyleId == null + ? null + : fbb.writeString(object.expressiveSendStyleId!); + final threadOriginatorGuidOffset = object.threadOriginatorGuid == null + ? null + : fbb.writeString(object.threadOriginatorGuid!); + final threadOriginatorPartOffset = object.threadOriginatorPart == null + ? null + : fbb.writeString(object.threadOriginatorPart!); + final dbAttributedBodyOffset = object.dbAttributedBody == null + ? null + : fbb.writeString(object.dbAttributedBody!); + final dbMessageSummaryInfoOffset = object.dbMessageSummaryInfo == null + ? null + : fbb.writeString(object.dbMessageSummaryInfo!); + final dbPayloadDataOffset = object.dbPayloadData == null + ? null + : fbb.writeString(object.dbPayloadData!); + final dbMetadataOffset = object.dbMetadata == null + ? null + : fbb.writeString(object.dbMetadata!); + final stagingGuidOffset = object.stagingGuid == null + ? null + : fbb.writeString(object.stagingGuid!); + final amkSessionIdOffset = object.amkSessionId == null + ? null + : fbb.writeString(object.amkSessionId!); + final sendingServiceIdOffset = object.sendingServiceId == null + ? null + : fbb.writeString(object.sendingServiceId!); + final associatedMessageEmojiOffset = + object.associatedMessageEmoji == null + ? null + : fbb.writeString(object.associatedMessageEmoji!); + final ckRecordIdOffset = object.ckRecordId == null + ? null + : fbb.writeString(object.ckRecordId!); + final metadataOffset = object.metadata == null + ? null + : fbb.writeListInt8(obx_int.toFlexBuffer(object.metadata!)); + fbb.startTable(61); + fbb.addInt64(0, object.id ?? 0); + fbb.addInt64(1, object.originalROWID); + fbb.addOffset(2, guidOffset); + fbb.addInt64(3, object.handleId); + fbb.addInt64(4, object.otherHandle); + fbb.addOffset(5, textOffset); + fbb.addOffset(6, subjectOffset); + fbb.addOffset(7, countryOffset); + fbb.addInt64(8, object.dateCreated?.millisecondsSinceEpoch); + fbb.addInt64(9, object.dateRead?.millisecondsSinceEpoch); + fbb.addInt64(10, object.dateDelivered?.millisecondsSinceEpoch); + fbb.addBool(11, object.isFromMe); + fbb.addBool(18, object.hasDdResults); + fbb.addInt64(21, object.datePlayed?.millisecondsSinceEpoch); + fbb.addInt64(22, object.itemType); + fbb.addOffset(23, groupTitleOffset); + fbb.addInt64(24, object.groupActionType); + fbb.addOffset(26, balloonBundleIdOffset); + fbb.addOffset(27, associatedMessageGuidOffset); + fbb.addOffset(28, associatedMessageTypeOffset); + fbb.addOffset(29, expressiveSendStyleIdOffset); + fbb.addBool(31, object.hasAttachments); + fbb.addBool(32, object.hasReactions); + fbb.addInt64(33, object.dateDeleted?.millisecondsSinceEpoch); + fbb.addOffset(34, threadOriginatorGuidOffset); + fbb.addOffset(35, threadOriginatorPartOffset); + fbb.addBool(36, object.bigEmoji); + fbb.addInt64(37, object.error); + fbb.addInt64(38, object.chat.targetId); + fbb.addOffset(39, dbAttributedBodyOffset); + fbb.addInt64(40, object.associatedMessagePart); + fbb.addBool(41, object.hasApplePayloadData); + fbb.addInt64(42, object.dateEdited?.millisecondsSinceEpoch); + fbb.addOffset(43, dbMessageSummaryInfoOffset); + fbb.addOffset(44, dbPayloadDataOffset); + fbb.addOffset(45, dbMetadataOffset); + fbb.addBool(46, object.wasDeliveredQuietly); + fbb.addBool(47, object.didNotifyRecipient); + fbb.addBool(48, object.isBookmarked); + fbb.addBool(49, object.hasBeenForwarded); + fbb.addOffset(50, stagingGuidOffset); + fbb.addOffset(51, amkSessionIdOffset); + fbb.addBool(52, object.isDelivered); + fbb.addBool(53, object.verificationFailed); + fbb.addOffset(54, sendingServiceIdOffset); + fbb.addOffset(55, associatedMessageEmojiOffset); + fbb.addInt64(56, object.dateScheduled?.millisecondsSinceEpoch); + fbb.addOffset(57, ckRecordIdOffset); + fbb.addBool(58, object.ckSyncState); + fbb.addOffset(59, metadataOffset); + fbb.finish(fbb.endTable()); + return object.id ?? 0; + }, + objectFromFB: (obx.Store store, ByteData fbData) { + final buffer = fb.BufferContext(fbData); + final rootOffset = buffer.derefObject(0); + final dateCreatedValue = const fb.Int64Reader().vTableGetNullable( + buffer, + rootOffset, + 20, + ); + final dateReadValue = const fb.Int64Reader().vTableGetNullable( + buffer, + rootOffset, + 22, + ); + final dateDeliveredValue = const fb.Int64Reader().vTableGetNullable( + buffer, + rootOffset, + 24, + ); + final datePlayedValue = const fb.Int64Reader().vTableGetNullable( + buffer, + rootOffset, + 46, + ); + final dateDeletedValue = const fb.Int64Reader().vTableGetNullable( + buffer, + rootOffset, + 70, + ); + final dateEditedValue = const fb.Int64Reader().vTableGetNullable( + buffer, + rootOffset, + 88, + ); + final dateScheduledValue = const fb.Int64Reader().vTableGetNullable( + buffer, + rootOffset, + 116, + ); + final idParam = const fb.Int64Reader().vTableGetNullable( + buffer, + rootOffset, + 4, + ); + final originalROWIDParam = const fb.Int64Reader().vTableGetNullable( + buffer, + rootOffset, + 6, + ); + final guidParam = const fb.StringReader( + asciiOptimization: true, + ).vTableGetNullable(buffer, rootOffset, 8); + final handleIdParam = const fb.Int64Reader().vTableGetNullable( + buffer, + rootOffset, + 10, + ); + final otherHandleParam = const fb.Int64Reader().vTableGetNullable( + buffer, + rootOffset, + 12, + ); + final textParam = const fb.StringReader( + asciiOptimization: true, + ).vTableGetNullable(buffer, rootOffset, 14); + final subjectParam = const fb.StringReader( + asciiOptimization: true, + ).vTableGetNullable(buffer, rootOffset, 16); + final countryParam = const fb.StringReader( + asciiOptimization: true, + ).vTableGetNullable(buffer, rootOffset, 18); + final errorParam = const fb.Int64Reader().vTableGet( + buffer, + rootOffset, + 78, + 0, + ); + final dateCreatedParam = dateCreatedValue == null + ? null + : DateTime.fromMillisecondsSinceEpoch(dateCreatedValue); + final dateReadParam = dateReadValue == null + ? null + : DateTime.fromMillisecondsSinceEpoch(dateReadValue); + final dateDeliveredParam = dateDeliveredValue == null + ? null + : DateTime.fromMillisecondsSinceEpoch(dateDeliveredValue); + final isFromMeParam = const fb.BoolReader().vTableGetNullable( + buffer, + rootOffset, + 26, + ); + final hasDdResultsParam = const fb.BoolReader().vTableGetNullable( + buffer, + rootOffset, + 40, + ); + final datePlayedParam = datePlayedValue == null + ? null + : DateTime.fromMillisecondsSinceEpoch(datePlayedValue); + final itemTypeParam = const fb.Int64Reader().vTableGetNullable( + buffer, + rootOffset, + 48, + ); + final groupTitleParam = const fb.StringReader( + asciiOptimization: true, + ).vTableGetNullable(buffer, rootOffset, 50); + final groupActionTypeParam = const fb.Int64Reader().vTableGetNullable( + buffer, + rootOffset, + 52, + ); + final balloonBundleIdParam = const fb.StringReader( + asciiOptimization: true, + ).vTableGetNullable(buffer, rootOffset, 56); + final associatedMessageGuidParam = const fb.StringReader( + asciiOptimization: true, + ).vTableGetNullable(buffer, rootOffset, 58); + final associatedMessagePartParam = const fb.Int64Reader() + .vTableGetNullable(buffer, rootOffset, 84); + final associatedMessageTypeParam = const fb.StringReader( + asciiOptimization: true, + ).vTableGetNullable(buffer, rootOffset, 60); + final expressiveSendStyleIdParam = const fb.StringReader( + asciiOptimization: true, + ).vTableGetNullable(buffer, rootOffset, 62); + final hasAttachmentsParam = const fb.BoolReader().vTableGet( + buffer, + rootOffset, + 66, + false, + ); + final hasReactionsParam = const fb.BoolReader().vTableGet( + buffer, + rootOffset, + 68, + false, + ); + final dateDeletedParam = dateDeletedValue == null + ? null + : DateTime.fromMillisecondsSinceEpoch(dateDeletedValue); + final metadataParam = obx_int.flexBufferToMap(buffer, rootOffset, 122); + final threadOriginatorGuidParam = const fb.StringReader( + asciiOptimization: true, + ).vTableGetNullable(buffer, rootOffset, 72); + final threadOriginatorPartParam = const fb.StringReader( + asciiOptimization: true, + ).vTableGetNullable(buffer, rootOffset, 74); + final hasApplePayloadDataParam = const fb.BoolReader().vTableGet( + buffer, + rootOffset, + 86, + false, + ); + final dateEditedParam = dateEditedValue == null + ? null + : DateTime.fromMillisecondsSinceEpoch(dateEditedValue); + final wasDeliveredQuietlyParam = const fb.BoolReader().vTableGet( + buffer, + rootOffset, + 96, + false, + ); + final didNotifyRecipientParam = const fb.BoolReader().vTableGet( + buffer, + rootOffset, + 98, + false, + ); + final isBookmarkedParam = const fb.BoolReader().vTableGet( + buffer, + rootOffset, + 100, + false, + ); + final hasBeenForwardedParam = const fb.BoolReader().vTableGet( + buffer, + rootOffset, + 102, + false, + ); + final stagingGuidParam = const fb.StringReader( + asciiOptimization: true, + ).vTableGetNullable(buffer, rootOffset, 104); + final amkSessionIdParam = const fb.StringReader( + asciiOptimization: true, + ).vTableGetNullable(buffer, rootOffset, 106); + final verificationFailedParam = const fb.BoolReader().vTableGet( + buffer, + rootOffset, + 110, + false, + ); + final sendingServiceIdParam = const fb.StringReader( + asciiOptimization: true, + ).vTableGetNullable(buffer, rootOffset, 112); + final associatedMessageEmojiParam = const fb.StringReader( + asciiOptimization: true, + ).vTableGetNullable(buffer, rootOffset, 114); + final dateScheduledParam = dateScheduledValue == null + ? null + : DateTime.fromMillisecondsSinceEpoch(dateScheduledValue); + final ckRecordIdParam = const fb.StringReader( + asciiOptimization: true, + ).vTableGetNullable(buffer, rootOffset, 118); + final object = + Message( + id: idParam, + originalROWID: originalROWIDParam, + guid: guidParam, + handleId: handleIdParam, + otherHandle: otherHandleParam, + text: textParam, + subject: subjectParam, + country: countryParam, + error: errorParam, + dateCreated: dateCreatedParam, + dateRead: dateReadParam, + dateDelivered: dateDeliveredParam, + isFromMe: isFromMeParam, + hasDdResults: hasDdResultsParam, + datePlayed: datePlayedParam, + itemType: itemTypeParam, + groupTitle: groupTitleParam, + groupActionType: groupActionTypeParam, + balloonBundleId: balloonBundleIdParam, + associatedMessageGuid: associatedMessageGuidParam, + associatedMessagePart: associatedMessagePartParam, + associatedMessageType: associatedMessageTypeParam, + expressiveSendStyleId: expressiveSendStyleIdParam, + hasAttachments: hasAttachmentsParam, + hasReactions: hasReactionsParam, + dateDeleted: dateDeletedParam, + metadata: metadataParam, + threadOriginatorGuid: threadOriginatorGuidParam, + threadOriginatorPart: threadOriginatorPartParam, + hasApplePayloadData: hasApplePayloadDataParam, + dateEdited: dateEditedParam, + wasDeliveredQuietly: wasDeliveredQuietlyParam, + didNotifyRecipient: didNotifyRecipientParam, + isBookmarked: isBookmarkedParam, + hasBeenForwarded: hasBeenForwardedParam, + stagingGuid: stagingGuidParam, + amkSessionId: amkSessionIdParam, + verificationFailed: verificationFailedParam, + sendingServiceId: sendingServiceIdParam, + associatedMessageEmoji: associatedMessageEmojiParam, + dateScheduled: dateScheduledParam, + ckRecordId: ckRecordIdParam, + ) + ..bigEmoji = const fb.BoolReader().vTableGetNullable( + buffer, + rootOffset, + 76, + ) + ..dbAttributedBody = const fb.StringReader( + asciiOptimization: true, + ).vTableGetNullable(buffer, rootOffset, 82) + ..dbMessageSummaryInfo = const fb.StringReader( + asciiOptimization: true, + ).vTableGetNullable(buffer, rootOffset, 90) + ..dbPayloadData = const fb.StringReader( + asciiOptimization: true, + ).vTableGetNullable(buffer, rootOffset, 92) + ..dbMetadata = const fb.StringReader( + asciiOptimization: true, + ).vTableGetNullable(buffer, rootOffset, 94) + ..isDelivered = const fb.BoolReader().vTableGet( + buffer, + rootOffset, + 108, + false, + ) + ..ckSyncState = const fb.BoolReader().vTableGet( + buffer, + rootOffset, + 120, + false, + ); + object.chat.targetId = const fb.Int64Reader().vTableGet( + buffer, + rootOffset, + 80, + 0, + ); + object.chat.attach(store); + obx_int.InternalToManyAccess.setRelInfo( + object.dbAttachments, + store, + obx_int.RelInfo.toOneBacklink( + 17, + object.id!, + (Attachment srcObject) => srcObject.message, + ), + ); + return object; + }, + ), + ThemeObject: obx_int.EntityDefinition( + model: _entities[6], + toOneRelations: (ThemeObject object) => [], + toManyRelations: (ThemeObject object) => { + obx_int.RelInfo.toOneBacklink( + 8, + object.id!, + (ThemeEntry srcObject) => srcObject.themeObject, + ): object.themeEntries, + }, + getId: (ThemeObject object) => object.id, + setId: (ThemeObject object, int id) { + object.id = id; + }, + objectToFB: (ThemeObject object, fb.Builder fbb) { + final nameOffset = object.name == null + ? null + : fbb.writeString(object.name!); + fbb.startTable(8); + fbb.addInt64(0, object.id ?? 0); + fbb.addOffset(1, nameOffset); + fbb.addBool(2, object.selectedLightTheme); + fbb.addBool(3, object.selectedDarkTheme); + fbb.addBool(4, object.gradientBg); + fbb.addBool(5, object.previousLightTheme); + fbb.addBool(6, object.previousDarkTheme); + fbb.finish(fbb.endTable()); + return object.id ?? 0; + }, + objectFromFB: (obx.Store store, ByteData fbData) { + final buffer = fb.BufferContext(fbData); + final rootOffset = buffer.derefObject(0); + final idParam = const fb.Int64Reader().vTableGetNullable( + buffer, + rootOffset, + 4, + ); + final nameParam = const fb.StringReader( + asciiOptimization: true, + ).vTableGetNullable(buffer, rootOffset, 6); + final selectedLightThemeParam = const fb.BoolReader().vTableGet( + buffer, + rootOffset, + 8, + false, + ); + final selectedDarkThemeParam = const fb.BoolReader().vTableGet( + buffer, + rootOffset, + 10, + false, + ); + final gradientBgParam = const fb.BoolReader().vTableGet( + buffer, + rootOffset, + 12, + false, + ); + final previousLightThemeParam = const fb.BoolReader().vTableGet( + buffer, + rootOffset, + 14, + false, + ); + final previousDarkThemeParam = const fb.BoolReader().vTableGet( + buffer, + rootOffset, + 16, + false, + ); + final object = ThemeObject( + id: idParam, + name: nameParam, + selectedLightTheme: selectedLightThemeParam, + selectedDarkTheme: selectedDarkThemeParam, + gradientBg: gradientBgParam, + previousLightTheme: previousLightThemeParam, + previousDarkTheme: previousDarkThemeParam, + ); + obx_int.InternalToManyAccess.setRelInfo( + object.themeEntries, + store, + obx_int.RelInfo.toOneBacklink( + 8, + object.id!, + (ThemeEntry srcObject) => srcObject.themeObject, + ), + ); + return object; + }, + ), + ThemeStruct: obx_int.EntityDefinition( + model: _entities[7], + toOneRelations: (ThemeStruct object) => [], + toManyRelations: (ThemeStruct object) => {}, + getId: (ThemeStruct object) => object.id, + setId: (ThemeStruct object, int id) { + object.id = id; + }, + objectToFB: (ThemeStruct object, fb.Builder fbb) { + final nameOffset = fbb.writeString(object.name); + final dbThemeDataOffset = fbb.writeString(object.dbThemeData); + final googleFontOffset = fbb.writeString(object.googleFont); + fbb.startTable(6); + fbb.addInt64(0, object.id ?? 0); + fbb.addOffset(1, nameOffset); + fbb.addBool(2, object.gradientBg); + fbb.addOffset(3, dbThemeDataOffset); + fbb.addOffset(4, googleFontOffset); + fbb.finish(fbb.endTable()); + return object.id ?? 0; + }, + objectFromFB: (obx.Store store, ByteData fbData) { + final buffer = fb.BufferContext(fbData); + final rootOffset = buffer.derefObject(0); + final idParam = const fb.Int64Reader().vTableGetNullable( + buffer, + rootOffset, + 4, + ); + final nameParam = const fb.StringReader( + asciiOptimization: true, + ).vTableGet(buffer, rootOffset, 6, ''); + final gradientBgParam = const fb.BoolReader().vTableGet( + buffer, + rootOffset, + 8, + false, + ); + final googleFontParam = const fb.StringReader( + asciiOptimization: true, + ).vTableGet(buffer, rootOffset, 12, ''); + final object = + ThemeStruct( + id: idParam, + name: nameParam, + gradientBg: gradientBgParam, + googleFont: googleFontParam, + ) + ..dbThemeData = const fb.StringReader( + asciiOptimization: true, + ).vTableGet(buffer, rootOffset, 10, ''); + + return object; + }, + ), + Contact: obx_int.EntityDefinition( + model: _entities[8], + toOneRelations: (Contact object) => [], + toManyRelations: (Contact object) => {}, + getId: (Contact object) => object.dbId, + setId: (Contact object, int id) { + object.dbId = id; + }, + objectToFB: (Contact object, fb.Builder fbb) { + final idOffset = fbb.writeString(object.id); + final displayNameOffset = fbb.writeString(object.displayName); + final phonesOffset = fbb.writeList( + object.phones.map(fbb.writeString).toList(growable: false), + ); + final emailsOffset = fbb.writeList( + object.emails.map(fbb.writeString).toList(growable: false), + ); + final avatarOffset = object.avatar == null + ? null + : fbb.writeListInt8(object.avatar!); + final dbStructuredNameOffset = object.dbStructuredName == null + ? null + : fbb.writeString(object.dbStructuredName!); + final posterPathOffset = object.posterPath == null + ? null + : fbb.writeString(object.posterPath!); + fbb.startTable(14); + fbb.addInt64(0, object.dbId ?? 0); + fbb.addOffset(1, idOffset); + fbb.addOffset(2, displayNameOffset); + fbb.addOffset(3, phonesOffset); + fbb.addOffset(5, emailsOffset); + fbb.addOffset(7, avatarOffset); + fbb.addOffset(9, dbStructuredNameOffset); + fbb.addBool(10, object.isShared); + fbb.addBool(11, object.isDismissed); + fbb.addOffset(12, posterPathOffset); + fbb.finish(fbb.endTable()); + return object.dbId ?? 0; + }, + objectFromFB: (obx.Store store, ByteData fbData) { + final buffer = fb.BufferContext(fbData); + final rootOffset = buffer.derefObject(0); + final dbIdParam = const fb.Int64Reader().vTableGetNullable( + buffer, + rootOffset, + 4, + ); + final idParam = const fb.StringReader( + asciiOptimization: true, + ).vTableGet(buffer, rootOffset, 6, ''); + final displayNameParam = const fb.StringReader( + asciiOptimization: true, + ).vTableGet(buffer, rootOffset, 8, ''); + final phonesParam = const fb.ListReader( + fb.StringReader(asciiOptimization: true), + lazy: false, + ).vTableGet(buffer, rootOffset, 10, []); + final emailsParam = const fb.ListReader( + fb.StringReader(asciiOptimization: true), + lazy: false, + ).vTableGet(buffer, rootOffset, 14, []); + final avatarParam = + const fb.Uint8ListReader( + lazy: false, + ).vTableGetNullable(buffer, rootOffset, 18) + as Uint8List?; + final isSharedParam = const fb.BoolReader().vTableGet( + buffer, + rootOffset, + 24, + false, + ); + final isDismissedParam = const fb.BoolReader().vTableGet( + buffer, + rootOffset, + 26, + false, + ); + final posterPathParam = const fb.StringReader( + asciiOptimization: true, + ).vTableGetNullable(buffer, rootOffset, 28); + final object = + Contact( + dbId: dbIdParam, + id: idParam, + displayName: displayNameParam, + phones: phonesParam, + emails: emailsParam, + avatar: avatarParam, + isShared: isSharedParam, + isDismissed: isDismissedParam, + posterPath: posterPathParam, + ) + ..dbStructuredName = const fb.StringReader( + asciiOptimization: true, + ).vTableGetNullable(buffer, rootOffset, 22); + + return object; + }, + ), + CloudInboxChangeEntity: obx_int.EntityDefinition( + model: _entities[9], + toOneRelations: (CloudInboxChangeEntity object) => [], + toManyRelations: (CloudInboxChangeEntity object) => {}, + getId: (CloudInboxChangeEntity object) => object.id, + setId: (CloudInboxChangeEntity object, int id) { + object.id = id; + }, + objectToFB: (CloudInboxChangeEntity object, fb.Builder fbb) { + final changeKeyOffset = fbb.writeString(object.changeKey); + final accountFingerprintOffset = fbb.writeString( + object.accountFingerprint, + ); + final zoneOffset = fbb.writeString(object.zone); + final serverRecordIdHashOffset = fbb.writeString( + object.serverRecordIdHash, + ); + final etagHashOffset = object.etagHash == null + ? null + : fbb.writeString(object.etagHash!); + final changeTypeOffset = fbb.writeString(object.changeType); + final encryptedPayloadRefOffset = object.encryptedPayloadRef == null + ? null + : fbb.writeString(object.encryptedPayloadRef!); + final payloadSha256Offset = object.payloadSha256 == null + ? null + : fbb.writeString(object.payloadSha256!); + final failureCategoryOffset = object.failureCategory == null + ? null + : fbb.writeString(object.failureCategory!); + final scopeKeyOffset = fbb.writeString(object.scopeKey); + final encryptedServerRecordIdOffset = + object.encryptedServerRecordId == null + ? null + : fbb.writeString(object.encryptedServerRecordId!); + final protectedSystemFieldsRefOffset = + object.protectedSystemFieldsRef == null + ? null + : fbb.writeString(object.protectedSystemFieldsRef!); + final batchIdOffset = fbb.writeString(object.batchId); + final changeIdHashOffset = fbb.writeString(object.changeIdHash); + fbb.startTable(26); + fbb.addInt64(0, object.id); + fbb.addOffset(1, changeKeyOffset); + fbb.addOffset(2, accountFingerprintOffset); + fbb.addOffset(3, zoneOffset); + fbb.addOffset(4, serverRecordIdHashOffset); + fbb.addOffset(5, etagHashOffset); + fbb.addOffset(6, changeTypeOffset); + fbb.addOffset(7, encryptedPayloadRefOffset); + fbb.addOffset(8, payloadSha256Offset); + fbb.addInt64(9, object.fetchSequence); + fbb.addInt64(10, object.status); + fbb.addBool(11, object.isTombstone); + fbb.addOffset(12, failureCategoryOffset); + fbb.addInt64(13, object.retryCount); + fbb.addInt64(14, object.createdAtMs); + fbb.addInt64(15, object.updatedAtMs); + fbb.addOffset(16, scopeKeyOffset); + fbb.addOffset(17, encryptedServerRecordIdOffset); + fbb.addOffset(18, protectedSystemFieldsRefOffset); + fbb.addOffset(19, batchIdOffset); + fbb.addInt64(20, object.generation); + fbb.addInt64(21, object.nextEligibleAtMs); + fbb.addInt64(22, object.serverModifiedAtMs); + fbb.addInt64(23, object.completedAtMs); + fbb.addOffset(24, changeIdHashOffset); + fbb.finish(fbb.endTable()); + return object.id; + }, + objectFromFB: (obx.Store store, ByteData fbData) { + final buffer = fb.BufferContext(fbData); + final rootOffset = buffer.derefObject(0); + final idParam = const fb.Int64Reader().vTableGet( + buffer, + rootOffset, + 4, + 0, + ); + final changeKeyParam = const fb.StringReader( + asciiOptimization: true, + ).vTableGet(buffer, rootOffset, 6, ''); + final changeIdHashParam = const fb.StringReader( + asciiOptimization: true, + ).vTableGet(buffer, rootOffset, 52, ''); + final scopeKeyParam = const fb.StringReader( + asciiOptimization: true, + ).vTableGet(buffer, rootOffset, 36, ''); + final accountFingerprintParam = const fb.StringReader( + asciiOptimization: true, + ).vTableGet(buffer, rootOffset, 8, ''); + final zoneParam = const fb.StringReader( + asciiOptimization: true, + ).vTableGet(buffer, rootOffset, 10, ''); + final serverRecordIdHashParam = const fb.StringReader( + asciiOptimization: true, + ).vTableGet(buffer, rootOffset, 12, ''); + final etagHashParam = const fb.StringReader( + asciiOptimization: true, + ).vTableGetNullable(buffer, rootOffset, 14); + final changeTypeParam = const fb.StringReader( + asciiOptimization: true, + ).vTableGet(buffer, rootOffset, 16, ''); + final encryptedServerRecordIdParam = const fb.StringReader( + asciiOptimization: true, + ).vTableGetNullable(buffer, rootOffset, 38); + final protectedSystemFieldsRefParam = const fb.StringReader( + asciiOptimization: true, + ).vTableGetNullable(buffer, rootOffset, 40); + final encryptedPayloadRefParam = const fb.StringReader( + asciiOptimization: true, + ).vTableGetNullable(buffer, rootOffset, 18); + final payloadSha256Param = const fb.StringReader( + asciiOptimization: true, + ).vTableGetNullable(buffer, rootOffset, 20); + final batchIdParam = const fb.StringReader( + asciiOptimization: true, + ).vTableGet(buffer, rootOffset, 42, ''); + final generationParam = const fb.Int64Reader().vTableGet( + buffer, + rootOffset, + 44, + 0, + ); + final fetchSequenceParam = const fb.Int64Reader().vTableGet( + buffer, + rootOffset, + 22, + 0, + ); + final statusParam = const fb.Int64Reader().vTableGet( + buffer, + rootOffset, + 24, + 0, + ); + final isTombstoneParam = const fb.BoolReader().vTableGet( + buffer, + rootOffset, + 26, + false, + ); + final failureCategoryParam = const fb.StringReader( + asciiOptimization: true, + ).vTableGetNullable(buffer, rootOffset, 28); + final retryCountParam = const fb.Int64Reader().vTableGet( + buffer, + rootOffset, + 30, + 0, + ); + final nextEligibleAtMsParam = const fb.Int64Reader().vTableGet( + buffer, + rootOffset, + 46, + 0, + ); + final serverModifiedAtMsParam = const fb.Int64Reader().vTableGet( + buffer, + rootOffset, + 48, + 0, + ); + final createdAtMsParam = const fb.Int64Reader().vTableGet( + buffer, + rootOffset, + 32, + 0, + ); + final updatedAtMsParam = const fb.Int64Reader().vTableGet( + buffer, + rootOffset, + 34, + 0, + ); + final completedAtMsParam = const fb.Int64Reader().vTableGet( + buffer, + rootOffset, + 50, + 0, + ); + final object = CloudInboxChangeEntity( + id: idParam, + changeKey: changeKeyParam, + changeIdHash: changeIdHashParam, + scopeKey: scopeKeyParam, + accountFingerprint: accountFingerprintParam, + zone: zoneParam, + serverRecordIdHash: serverRecordIdHashParam, + etagHash: etagHashParam, + changeType: changeTypeParam, + encryptedServerRecordId: encryptedServerRecordIdParam, + protectedSystemFieldsRef: protectedSystemFieldsRefParam, + encryptedPayloadRef: encryptedPayloadRefParam, + payloadSha256: payloadSha256Param, + batchId: batchIdParam, + generation: generationParam, + fetchSequence: fetchSequenceParam, + status: statusParam, + isTombstone: isTombstoneParam, + failureCategory: failureCategoryParam, + retryCount: retryCountParam, + nextEligibleAtMs: nextEligibleAtMsParam, + serverModifiedAtMs: serverModifiedAtMsParam, + createdAtMs: createdAtMsParam, + updatedAtMs: updatedAtMsParam, + completedAtMs: completedAtMsParam, + ); + + return object; + }, + ), + CloudOutboxOperationEntity: + obx_int.EntityDefinition( + model: _entities[10], + toOneRelations: (CloudOutboxOperationEntity object) => [], + toManyRelations: (CloudOutboxOperationEntity object) => {}, + getId: (CloudOutboxOperationEntity object) => object.id, + setId: (CloudOutboxOperationEntity object, int id) { + object.id = id; + }, + objectToFB: (CloudOutboxOperationEntity object, fb.Builder fbb) { + final operationIdOffset = fbb.writeString(object.operationId); + final accountFingerprintOffset = fbb.writeString( + object.accountFingerprint, + ); + final zoneOffset = fbb.writeString(object.zone); + final logicalEntityKeyHashOffset = fbb.writeString( + object.logicalEntityKeyHash, + ); + final dependencyOperationIdsJsonOffset = fbb.writeString( + object.dependencyOperationIdsJson, + ); + final encryptedPayloadRefOffset = object.encryptedPayloadRef == null + ? null + : fbb.writeString(object.encryptedPayloadRef!); + final payloadSha256Offset = object.payloadSha256 == null + ? null + : fbb.writeString(object.payloadSha256!); + final lastErrorCategoryOffset = object.lastErrorCategory == null + ? null + : fbb.writeString(object.lastErrorCategory!); + final serverRecordIdHashOffset = object.serverRecordIdHash == null + ? null + : fbb.writeString(object.serverRecordIdHash!); + final scopeKeyOffset = fbb.writeString(object.scopeKey); + final leaseIdHashOffset = object.leaseIdHash == null + ? null + : fbb.writeString(object.leaseIdHash!); + final appleRequestUuidOffset = object.appleRequestUuid == null + ? null + : fbb.writeString(object.appleRequestUuid!); + final appleOperationUuidOffset = object.appleOperationUuid == null + ? null + : fbb.writeString(object.appleOperationUuid!); + final protectedLeaseReferenceOffset = + object.protectedLeaseReference == null + ? null + : fbb.writeString(object.protectedLeaseReference!); + fbb.startTable(27); + fbb.addInt64(0, object.id); + fbb.addOffset(1, operationIdOffset); + fbb.addOffset(2, accountFingerprintOffset); + fbb.addOffset(3, zoneOffset); + fbb.addOffset(4, logicalEntityKeyHashOffset); + fbb.addInt64(5, object.action); + fbb.addOffset(6, dependencyOperationIdsJsonOffset); + fbb.addInt64(7, object.payloadVersion); + fbb.addOffset(8, encryptedPayloadRefOffset); + fbb.addOffset(9, payloadSha256Offset); + fbb.addInt64(10, object.state); + fbb.addInt64(11, object.attemptCount); + fbb.addInt64(12, object.nextEligibleAtMs); + fbb.addOffset(13, lastErrorCategoryOffset); + fbb.addOffset(14, serverRecordIdHashOffset); + fbb.addInt64(15, object.createdAtMs); + fbb.addInt64(16, object.updatedAtMs); + fbb.addOffset(17, scopeKeyOffset); + fbb.addInt64(18, object.mutationRevision); + fbb.addOffset(19, leaseIdHashOffset); + fbb.addInt64(20, object.leaseExpiresAtMs); + fbb.addInt64(21, object.confirmedAtMs); + fbb.addInt64(22, object.checkpointGeneration); + fbb.addOffset(23, appleRequestUuidOffset); + fbb.addOffset(24, appleOperationUuidOffset); + fbb.addOffset(25, protectedLeaseReferenceOffset); + fbb.finish(fbb.endTable()); + return object.id; + }, + objectFromFB: (obx.Store store, ByteData fbData) { + final buffer = fb.BufferContext(fbData); + final rootOffset = buffer.derefObject(0); + final idParam = const fb.Int64Reader().vTableGet( + buffer, + rootOffset, + 4, + 0, + ); + final operationIdParam = const fb.StringReader( + asciiOptimization: true, + ).vTableGet(buffer, rootOffset, 6, ''); + final scopeKeyParam = const fb.StringReader( + asciiOptimization: true, + ).vTableGet(buffer, rootOffset, 38, ''); + final accountFingerprintParam = const fb.StringReader( + asciiOptimization: true, + ).vTableGet(buffer, rootOffset, 8, ''); + final zoneParam = const fb.StringReader( + asciiOptimization: true, + ).vTableGet(buffer, rootOffset, 10, ''); + final logicalEntityKeyHashParam = const fb.StringReader( + asciiOptimization: true, + ).vTableGet(buffer, rootOffset, 12, ''); + final actionParam = const fb.Int64Reader().vTableGet( + buffer, + rootOffset, + 14, + 0, + ); + final dependencyOperationIdsJsonParam = const fb.StringReader( + asciiOptimization: true, + ).vTableGet(buffer, rootOffset, 16, ''); + final payloadVersionParam = const fb.Int64Reader().vTableGet( + buffer, + rootOffset, + 18, + 0, + ); + final mutationRevisionParam = const fb.Int64Reader().vTableGet( + buffer, + rootOffset, + 40, + 0, + ); + final checkpointGenerationParam = const fb.Int64Reader().vTableGet( + buffer, + rootOffset, + 48, + 0, + ); + final appleRequestUuidParam = const fb.StringReader( + asciiOptimization: true, + ).vTableGetNullable(buffer, rootOffset, 50); + final appleOperationUuidParam = const fb.StringReader( + asciiOptimization: true, + ).vTableGetNullable(buffer, rootOffset, 52); + final encryptedPayloadRefParam = const fb.StringReader( + asciiOptimization: true, + ).vTableGetNullable(buffer, rootOffset, 20); + final payloadSha256Param = const fb.StringReader( + asciiOptimization: true, + ).vTableGetNullable(buffer, rootOffset, 22); + final protectedLeaseReferenceParam = const fb.StringReader( + asciiOptimization: true, + ).vTableGetNullable(buffer, rootOffset, 54); + final stateParam = const fb.Int64Reader().vTableGet( + buffer, + rootOffset, + 24, + 0, + ); + final attemptCountParam = const fb.Int64Reader().vTableGet( + buffer, + rootOffset, + 26, + 0, + ); + final nextEligibleAtMsParam = const fb.Int64Reader().vTableGet( + buffer, + rootOffset, + 28, + 0, + ); + final lastErrorCategoryParam = const fb.StringReader( + asciiOptimization: true, + ).vTableGetNullable(buffer, rootOffset, 30); + final serverRecordIdHashParam = const fb.StringReader( + asciiOptimization: true, + ).vTableGetNullable(buffer, rootOffset, 32); + final leaseIdHashParam = const fb.StringReader( + asciiOptimization: true, + ).vTableGetNullable(buffer, rootOffset, 42); + final leaseExpiresAtMsParam = const fb.Int64Reader().vTableGet( + buffer, + rootOffset, + 44, + 0, + ); + final confirmedAtMsParam = const fb.Int64Reader().vTableGet( + buffer, + rootOffset, + 46, + 0, + ); + final createdAtMsParam = const fb.Int64Reader().vTableGet( + buffer, + rootOffset, + 34, + 0, + ); + final updatedAtMsParam = const fb.Int64Reader().vTableGet( + buffer, + rootOffset, + 36, + 0, + ); + final object = CloudOutboxOperationEntity( id: idParam, - guid: guidParam, - chatIdentifier: chatIdentifierParam, - isArchived: isArchivedParam, - isPinned: isPinnedParam, - muteType: muteTypeParam, - muteArgs: muteArgsParam, - hasUnreadMessage: hasUnreadMessageParam, - displayName: displayNameParam, - autoSendReadReceipts: autoSendReadReceiptsParam, - autoSendTypingIndicators: autoSendTypingIndicatorsParam, - textFieldText: textFieldTextParam, - textFieldAnnotations: textFieldAnnotationsParam, - textFieldAttachments: textFieldAttachmentsParam, - dateDeleted: dateDeletedParam, - style: styleParam, - lockChatName: lockChatNameParam, - lockChatIcon: lockChatIconParam, - lastReadMessageGuid: lastReadMessageGuidParam, - usingHandle: usingHandleParam, - isRpSms: isRpSmsParam, - telephonyId: telephonyIdParam, - shareZenMode: shareZenModeParam, - notifsSilenced: notifsSilencedParam, - dateNotifiedAnyways: dateNotifiedAnywaysParam, - zenModeIsShared: zenModeIsSharedParam, - senderIsKnown: senderIsKnownParam, - isRoutingStub: isRoutingStubParam, - guidRefs: guidRefsParam) - ..dbOnlyLatestMessageDate = dbOnlyLatestMessageDateValue == null + operationId: operationIdParam, + scopeKey: scopeKeyParam, + accountFingerprint: accountFingerprintParam, + zone: zoneParam, + logicalEntityKeyHash: logicalEntityKeyHashParam, + action: actionParam, + dependencyOperationIdsJson: dependencyOperationIdsJsonParam, + payloadVersion: payloadVersionParam, + mutationRevision: mutationRevisionParam, + checkpointGeneration: checkpointGenerationParam, + appleRequestUuid: appleRequestUuidParam, + appleOperationUuid: appleOperationUuidParam, + encryptedPayloadRef: encryptedPayloadRefParam, + payloadSha256: payloadSha256Param, + protectedLeaseReference: protectedLeaseReferenceParam, + state: stateParam, + attemptCount: attemptCountParam, + nextEligibleAtMs: nextEligibleAtMsParam, + lastErrorCategory: lastErrorCategoryParam, + serverRecordIdHash: serverRecordIdHashParam, + leaseIdHash: leaseIdHashParam, + leaseExpiresAtMs: leaseExpiresAtMsParam, + confirmedAtMs: confirmedAtMsParam, + createdAtMs: createdAtMsParam, + updatedAtMs: updatedAtMsParam, + ); + + return object; + }, + ), + CloudRecordMapEntity: obx_int.EntityDefinition( + model: _entities[11], + toOneRelations: (CloudRecordMapEntity object) => [], + toManyRelations: (CloudRecordMapEntity object) => {}, + getId: (CloudRecordMapEntity object) => object.id, + setId: (CloudRecordMapEntity object, int id) { + object.id = id; + }, + objectToFB: (CloudRecordMapEntity object, fb.Builder fbb) { + final mapKeyOffset = fbb.writeString(object.mapKey); + final accountFingerprintOffset = fbb.writeString( + object.accountFingerprint, + ); + final zoneOffset = fbb.writeString(object.zone); + final logicalEntityKeyHashOffset = fbb.writeString( + object.logicalEntityKeyHash, + ); + final serverRecordIdHashOffset = fbb.writeString( + object.serverRecordIdHash, + ); + final encryptedServerRecordIdOffset = fbb.writeString( + object.encryptedServerRecordId, + ); + final etagHashOffset = object.etagHash == null + ? null + : fbb.writeString(object.etagHash!); + final encryptedRawRecordRefOffset = object.encryptedRawRecordRef == null + ? null + : fbb.writeString(object.encryptedRawRecordRef!); + final scopeKeyOffset = fbb.writeString(object.scopeKey); + fbb.startTable(13); + fbb.addInt64(0, object.id); + fbb.addOffset(1, mapKeyOffset); + fbb.addOffset(2, accountFingerprintOffset); + fbb.addOffset(3, zoneOffset); + fbb.addOffset(4, logicalEntityKeyHashOffset); + fbb.addOffset(5, serverRecordIdHashOffset); + fbb.addOffset(6, encryptedServerRecordIdOffset); + fbb.addOffset(7, etagHashOffset); + fbb.addOffset(8, encryptedRawRecordRefOffset); + fbb.addInt64(9, object.updatedAtMs); + fbb.addOffset(10, scopeKeyOffset); + fbb.addInt64(11, object.generation); + fbb.finish(fbb.endTable()); + return object.id; + }, + objectFromFB: (obx.Store store, ByteData fbData) { + final buffer = fb.BufferContext(fbData); + final rootOffset = buffer.derefObject(0); + final idParam = const fb.Int64Reader().vTableGet( + buffer, + rootOffset, + 4, + 0, + ); + final mapKeyParam = const fb.StringReader( + asciiOptimization: true, + ).vTableGet(buffer, rootOffset, 6, ''); + final scopeKeyParam = const fb.StringReader( + asciiOptimization: true, + ).vTableGet(buffer, rootOffset, 24, ''); + final accountFingerprintParam = const fb.StringReader( + asciiOptimization: true, + ).vTableGet(buffer, rootOffset, 8, ''); + final zoneParam = const fb.StringReader( + asciiOptimization: true, + ).vTableGet(buffer, rootOffset, 10, ''); + final logicalEntityKeyHashParam = const fb.StringReader( + asciiOptimization: true, + ).vTableGet(buffer, rootOffset, 12, ''); + final serverRecordIdHashParam = const fb.StringReader( + asciiOptimization: true, + ).vTableGet(buffer, rootOffset, 14, ''); + final generationParam = const fb.Int64Reader().vTableGet( + buffer, + rootOffset, + 26, + 0, + ); + final encryptedServerRecordIdParam = const fb.StringReader( + asciiOptimization: true, + ).vTableGet(buffer, rootOffset, 16, ''); + final etagHashParam = const fb.StringReader( + asciiOptimization: true, + ).vTableGetNullable(buffer, rootOffset, 18); + final encryptedRawRecordRefParam = const fb.StringReader( + asciiOptimization: true, + ).vTableGetNullable(buffer, rootOffset, 20); + final updatedAtMsParam = const fb.Int64Reader().vTableGet( + buffer, + rootOffset, + 22, + 0, + ); + final object = CloudRecordMapEntity( + id: idParam, + mapKey: mapKeyParam, + scopeKey: scopeKeyParam, + accountFingerprint: accountFingerprintParam, + zone: zoneParam, + logicalEntityKeyHash: logicalEntityKeyHashParam, + serverRecordIdHash: serverRecordIdHashParam, + generation: generationParam, + encryptedServerRecordId: encryptedServerRecordIdParam, + etagHash: etagHashParam, + encryptedRawRecordRef: encryptedRawRecordRefParam, + updatedAtMs: updatedAtMsParam, + ); + + return object; + }, + ), + CloudSyncCheckpointEntity: + obx_int.EntityDefinition( + model: _entities[12], + toOneRelations: (CloudSyncCheckpointEntity object) => [], + toManyRelations: (CloudSyncCheckpointEntity object) => {}, + getId: (CloudSyncCheckpointEntity object) => object.id, + setId: (CloudSyncCheckpointEntity object, int id) { + object.id = id; + }, + objectToFB: (CloudSyncCheckpointEntity object, fb.Builder fbb) { + final checkpointKeyOffset = fbb.writeString(object.checkpointKey); + final accountFingerprintOffset = fbb.writeString( + object.accountFingerprint, + ); + final containerOffset = fbb.writeString(object.container); + final databaseOffset = fbb.writeString(object.database); + final zoneOffset = fbb.writeString(object.zone); + final fetchedTokenCiphertextOffset = + object.fetchedTokenCiphertext == null ? null - : DateTime.fromMillisecondsSinceEpoch( - dbOnlyLatestMessageDateValue) - ..title = const fb.StringReader(asciiOptimization: true) - .vTableGetNullable(buffer, rootOffset, 32) - ..customAvatarPath = const fb.StringReader(asciiOptimization: true) - .vTableGetNullable(buffer, rootOffset, 38) - ..pinIndex = - const fb.Int64Reader().vTableGetNullable(buffer, rootOffset, 40) - ..groupVersion = - const fb.Int64Reader().vTableGetNullable(buffer, rootOffset, 60) - ..apnTitle = const fb.StringReader(asciiOptimization: true) - .vTableGetNullable(buffer, rootOffset, 64) - ..transcriptPosterPath = - const fb.StringReader(asciiOptimization: true) - .vTableGetNullable(buffer, rootOffset, 86) - ..transcriptBackgroundVersion = - const fb.Int64Reader().vTableGet(buffer, rootOffset, 88, 0) - ..cloudData = const fb.Uint8ListReader(lazy: false) - .vTableGetNullable(buffer, rootOffset, 90) as Uint8List? - ..ckRecordId = const fb.StringReader(asciiOptimization: true) - .vTableGetNullable(buffer, rootOffset, 92) - ..ckSyncState = - const fb.BoolReader().vTableGet(buffer, rootOffset, 94, false) - ..photoAttachmentGuid = - const fb.StringReader(asciiOptimization: true) - .vTableGetNullable(buffer, rootOffset, 96) - ..cloudGuid = const fb.StringReader(asciiOptimization: true) - .vTableGetNullable(buffer, rootOffset, 98); - obx_int.InternalToManyAccess.setRelInfo(object.handles, store, - obx_int.RelInfo.toMany(1, object.id!)); - obx_int.InternalToManyAccess.setRelInfo( - object.messages, - store, - obx_int.RelInfo.toOneBacklink( - 39, object.id!, (Message srcObject) => srcObject.chat)); - return object; - }), - FCMData: obx_int.EntityDefinition( - model: _entities[2], - toOneRelations: (FCMData object) => [], - toManyRelations: (FCMData object) => {}, - getId: (FCMData object) => object.id, - setId: (FCMData object, int id) { - object.id = id; - }, - objectToFB: (FCMData object, fb.Builder fbb) { - final projectIDOffset = object.projectID == null - ? null - : fbb.writeString(object.projectID!); - final storageBucketOffset = object.storageBucket == null - ? null - : fbb.writeString(object.storageBucket!); - final apiKeyOffset = - object.apiKey == null ? null : fbb.writeString(object.apiKey!); - final firebaseURLOffset = object.firebaseURL == null - ? null - : fbb.writeString(object.firebaseURL!); - final clientIDOffset = object.clientID == null - ? null - : fbb.writeString(object.clientID!); - final applicationIDOffset = object.applicationID == null - ? null - : fbb.writeString(object.applicationID!); - fbb.startTable(8); - fbb.addInt64(0, object.id ?? 0); - fbb.addOffset(1, projectIDOffset); - fbb.addOffset(2, storageBucketOffset); - fbb.addOffset(3, apiKeyOffset); - fbb.addOffset(4, firebaseURLOffset); - fbb.addOffset(5, clientIDOffset); - fbb.addOffset(6, applicationIDOffset); - fbb.finish(fbb.endTable()); - return object.id ?? 0; - }, - objectFromFB: (obx.Store store, ByteData fbData) { - final buffer = fb.BufferContext(fbData); - final rootOffset = buffer.derefObject(0); - final idParam = - const fb.Int64Reader().vTableGetNullable(buffer, rootOffset, 4); - final projectIDParam = const fb.StringReader(asciiOptimization: true) - .vTableGetNullable(buffer, rootOffset, 6); - final storageBucketParam = - const fb.StringReader(asciiOptimization: true) - .vTableGetNullable(buffer, rootOffset, 8); - final apiKeyParam = const fb.StringReader(asciiOptimization: true) - .vTableGetNullable(buffer, rootOffset, 10); - final firebaseURLParam = - const fb.StringReader(asciiOptimization: true) - .vTableGetNullable(buffer, rootOffset, 12); - final clientIDParam = const fb.StringReader(asciiOptimization: true) - .vTableGetNullable(buffer, rootOffset, 14); - final applicationIDParam = - const fb.StringReader(asciiOptimization: true) - .vTableGetNullable(buffer, rootOffset, 16); - final object = FCMData( + : fbb.writeString(object.fetchedTokenCiphertext!); + final lastErrorCategoryOffset = object.lastErrorCategory == null + ? null + : fbb.writeString(object.lastErrorCategory!); + final streamKindOffset = fbb.writeString(object.streamKind); + final lastBatchIdOffset = object.lastBatchId == null + ? null + : fbb.writeString(object.lastBatchId!); + fbb.startTable(21); + fbb.addInt64(0, object.id); + fbb.addOffset(1, checkpointKeyOffset); + fbb.addOffset(2, accountFingerprintOffset); + fbb.addOffset(3, containerOffset); + fbb.addOffset(4, databaseOffset); + fbb.addOffset(5, zoneOffset); + fbb.addInt64(6, object.schemaVersion); + fbb.addOffset(7, fetchedTokenCiphertextOffset); + fbb.addInt64(8, object.fetchedSequence); + fbb.addInt64(9, object.appliedSequence); + fbb.addInt64(10, object.lastSuccessfulAtMs); + fbb.addInt64(11, object.lastAttemptAtMs); + fbb.addOffset(12, lastErrorCategoryOffset); + fbb.addInt64(13, object.backoffAttempt); + fbb.addInt64(14, object.nextEligibleAtMs); + fbb.addInt64(15, object.updatedAtMs); + fbb.addOffset(16, streamKindOffset); + fbb.addInt64(17, object.generation); + fbb.addOffset(18, lastBatchIdOffset); + fbb.addInt64(19, object.mutationRevisionCounter); + fbb.finish(fbb.endTable()); + return object.id; + }, + objectFromFB: (obx.Store store, ByteData fbData) { + final buffer = fb.BufferContext(fbData); + final rootOffset = buffer.derefObject(0); + final idParam = const fb.Int64Reader().vTableGet( + buffer, + rootOffset, + 4, + 0, + ); + final checkpointKeyParam = const fb.StringReader( + asciiOptimization: true, + ).vTableGet(buffer, rootOffset, 6, ''); + final accountFingerprintParam = const fb.StringReader( + asciiOptimization: true, + ).vTableGet(buffer, rootOffset, 8, ''); + final containerParam = const fb.StringReader( + asciiOptimization: true, + ).vTableGet(buffer, rootOffset, 10, ''); + final databaseParam = const fb.StringReader( + asciiOptimization: true, + ).vTableGet(buffer, rootOffset, 12, ''); + final zoneParam = const fb.StringReader( + asciiOptimization: true, + ).vTableGet(buffer, rootOffset, 14, ''); + final streamKindParam = const fb.StringReader( + asciiOptimization: true, + ).vTableGet(buffer, rootOffset, 36, ''); + final schemaVersionParam = const fb.Int64Reader().vTableGet( + buffer, + rootOffset, + 16, + 0, + ); + final fetchedTokenCiphertextParam = const fb.StringReader( + asciiOptimization: true, + ).vTableGetNullable(buffer, rootOffset, 18); + final generationParam = const fb.Int64Reader().vTableGet( + buffer, + rootOffset, + 38, + 0, + ); + final lastBatchIdParam = const fb.StringReader( + asciiOptimization: true, + ).vTableGetNullable(buffer, rootOffset, 40); + final fetchedSequenceParam = const fb.Int64Reader().vTableGet( + buffer, + rootOffset, + 20, + 0, + ); + final appliedSequenceParam = const fb.Int64Reader().vTableGet( + buffer, + rootOffset, + 22, + 0, + ); + final lastSuccessfulAtMsParam = const fb.Int64Reader().vTableGet( + buffer, + rootOffset, + 24, + 0, + ); + final lastAttemptAtMsParam = const fb.Int64Reader().vTableGet( + buffer, + rootOffset, + 26, + 0, + ); + final lastErrorCategoryParam = const fb.StringReader( + asciiOptimization: true, + ).vTableGetNullable(buffer, rootOffset, 28); + final backoffAttemptParam = const fb.Int64Reader().vTableGet( + buffer, + rootOffset, + 30, + 0, + ); + final nextEligibleAtMsParam = const fb.Int64Reader().vTableGet( + buffer, + rootOffset, + 32, + 0, + ); + final mutationRevisionCounterParam = const fb.Int64Reader() + .vTableGet(buffer, rootOffset, 42, 0); + final updatedAtMsParam = const fb.Int64Reader().vTableGet( + buffer, + rootOffset, + 34, + 0, + ); + final object = CloudSyncCheckpointEntity( id: idParam, - projectID: projectIDParam, - storageBucket: storageBucketParam, - apiKey: apiKeyParam, - firebaseURL: firebaseURLParam, - clientID: clientIDParam, - applicationID: applicationIDParam); - - return object; - }), - Handle: obx_int.EntityDefinition( - model: _entities[3], - toOneRelations: (Handle object) => [object.contactRelation], - toManyRelations: (Handle object) => {}, - getId: (Handle object) => object.id, - setId: (Handle object, int id) { - object.id = id; - }, - objectToFB: (Handle object, fb.Builder fbb) { - final addressOffset = fbb.writeString(object.address); - final countryOffset = - object.country == null ? null : fbb.writeString(object.country!); - final colorOffset = - object.color == null ? null : fbb.writeString(object.color!); - final defaultPhoneOffset = object.defaultPhone == null - ? null - : fbb.writeString(object.defaultPhone!); - final defaultEmailOffset = object.defaultEmail == null - ? null - : fbb.writeString(object.defaultEmail!); - final formattedAddressOffset = object.formattedAddress == null - ? null - : fbb.writeString(object.formattedAddress!); - final uniqueAddressAndServiceOffset = - fbb.writeString(object.uniqueAddressAndService); - final serviceOffset = fbb.writeString(object.service); - final posterPathOffset = object.posterPath == null - ? null - : fbb.writeString(object.posterPath!); - fbb.startTable(16); - fbb.addInt64(0, object.id ?? 0); - fbb.addInt64(1, object.originalROWID); - fbb.addOffset(2, addressOffset); - fbb.addOffset(3, countryOffset); - fbb.addOffset(4, colorOffset); - fbb.addOffset(5, defaultPhoneOffset); - fbb.addOffset(7, defaultEmailOffset); - fbb.addOffset(8, formattedAddressOffset); - fbb.addInt64(10, object.contactRelation.targetId); - fbb.addOffset(11, uniqueAddressAndServiceOffset); - fbb.addOffset(12, serviceOffset); - fbb.addOffset(13, posterPathOffset); - fbb.addBool(14, object.blocked); - fbb.finish(fbb.endTable()); - return object.id ?? 0; - }, - objectFromFB: (obx.Store store, ByteData fbData) { - final buffer = fb.BufferContext(fbData); - final rootOffset = buffer.derefObject(0); - final idParam = - const fb.Int64Reader().vTableGetNullable(buffer, rootOffset, 4); - final originalROWIDParam = - const fb.Int64Reader().vTableGetNullable(buffer, rootOffset, 6); - final addressParam = const fb.StringReader(asciiOptimization: true) - .vTableGet(buffer, rootOffset, 8, ''); - final formattedAddressParam = - const fb.StringReader(asciiOptimization: true) - .vTableGetNullable(buffer, rootOffset, 20); - final serviceParam = const fb.StringReader(asciiOptimization: true) - .vTableGet(buffer, rootOffset, 28, ''); - final uniqueAddressAndServiceParam = - const fb.StringReader(asciiOptimization: true) - .vTableGet(buffer, rootOffset, 26, ''); - final countryParam = const fb.StringReader(asciiOptimization: true) - .vTableGetNullable(buffer, rootOffset, 10); - final defaultEmailParam = - const fb.StringReader(asciiOptimization: true) - .vTableGetNullable(buffer, rootOffset, 18); - final defaultPhoneParam = - const fb.StringReader(asciiOptimization: true) - .vTableGetNullable(buffer, rootOffset, 14); - final blockedParam = - const fb.BoolReader().vTableGet(buffer, rootOffset, 32, false); - final object = Handle( + checkpointKey: checkpointKeyParam, + accountFingerprint: accountFingerprintParam, + container: containerParam, + database: databaseParam, + zone: zoneParam, + streamKind: streamKindParam, + schemaVersion: schemaVersionParam, + fetchedTokenCiphertext: fetchedTokenCiphertextParam, + generation: generationParam, + lastBatchId: lastBatchIdParam, + fetchedSequence: fetchedSequenceParam, + appliedSequence: appliedSequenceParam, + lastSuccessfulAtMs: lastSuccessfulAtMsParam, + lastAttemptAtMs: lastAttemptAtMsParam, + lastErrorCategory: lastErrorCategoryParam, + backoffAttempt: backoffAttemptParam, + nextEligibleAtMs: nextEligibleAtMsParam, + mutationRevisionCounter: mutationRevisionCounterParam, + updatedAtMs: updatedAtMsParam, + ); + + return object; + }, + ), + CloudSyncRunEntity: obx_int.EntityDefinition( + model: _entities[13], + toOneRelations: (CloudSyncRunEntity object) => [], + toManyRelations: (CloudSyncRunEntity object) => {}, + getId: (CloudSyncRunEntity object) => object.id, + setId: (CloudSyncRunEntity object, int id) { + object.id = id; + }, + objectToFB: (CloudSyncRunEntity object, fb.Builder fbb) { + final runIdOffset = fbb.writeString(object.runId); + final accountFingerprintOffset = fbb.writeString( + object.accountFingerprint, + ); + final triggerOffset = fbb.writeString(object.trigger); + final architectureOffset = fbb.writeString(object.architecture); + final modeOffset = fbb.writeString(object.mode); + final failureCategoryOffset = object.failureCategory == null + ? null + : fbb.writeString(object.failureCategory!); + final scopeKeyOffset = fbb.writeString(object.scopeKey); + fbb.startTable(17); + fbb.addInt64(0, object.id); + fbb.addOffset(1, runIdOffset); + fbb.addOffset(2, accountFingerprintOffset); + fbb.addOffset(3, triggerOffset); + fbb.addOffset(4, architectureOffset); + fbb.addOffset(5, modeOffset); + fbb.addInt64(6, object.fetchedCount); + fbb.addInt64(7, object.appliedCount); + fbb.addInt64(8, object.quarantinedCount); + fbb.addInt64(9, object.confirmedCount); + fbb.addInt64(10, object.retriedCount); + fbb.addInt64(11, object.startedAtMs); + fbb.addInt64(12, object.finishedAtMs); + fbb.addOffset(13, failureCategoryOffset); + fbb.addOffset(14, scopeKeyOffset); + fbb.addInt64(15, object.deferredCount); + fbb.finish(fbb.endTable()); + return object.id; + }, + objectFromFB: (obx.Store store, ByteData fbData) { + final buffer = fb.BufferContext(fbData); + final rootOffset = buffer.derefObject(0); + final idParam = const fb.Int64Reader().vTableGet( + buffer, + rootOffset, + 4, + 0, + ); + final runIdParam = const fb.StringReader( + asciiOptimization: true, + ).vTableGet(buffer, rootOffset, 6, ''); + final scopeKeyParam = const fb.StringReader( + asciiOptimization: true, + ).vTableGet(buffer, rootOffset, 32, ''); + final accountFingerprintParam = const fb.StringReader( + asciiOptimization: true, + ).vTableGet(buffer, rootOffset, 8, ''); + final triggerParam = const fb.StringReader( + asciiOptimization: true, + ).vTableGet(buffer, rootOffset, 10, ''); + final architectureParam = const fb.StringReader( + asciiOptimization: true, + ).vTableGet(buffer, rootOffset, 12, ''); + final modeParam = const fb.StringReader( + asciiOptimization: true, + ).vTableGet(buffer, rootOffset, 14, ''); + final fetchedCountParam = const fb.Int64Reader().vTableGet( + buffer, + rootOffset, + 16, + 0, + ); + final appliedCountParam = const fb.Int64Reader().vTableGet( + buffer, + rootOffset, + 18, + 0, + ); + final deferredCountParam = const fb.Int64Reader().vTableGet( + buffer, + rootOffset, + 34, + 0, + ); + final quarantinedCountParam = const fb.Int64Reader().vTableGet( + buffer, + rootOffset, + 20, + 0, + ); + final confirmedCountParam = const fb.Int64Reader().vTableGet( + buffer, + rootOffset, + 22, + 0, + ); + final retriedCountParam = const fb.Int64Reader().vTableGet( + buffer, + rootOffset, + 24, + 0, + ); + final startedAtMsParam = const fb.Int64Reader().vTableGet( + buffer, + rootOffset, + 26, + 0, + ); + final finishedAtMsParam = const fb.Int64Reader().vTableGet( + buffer, + rootOffset, + 28, + 0, + ); + final failureCategoryParam = const fb.StringReader( + asciiOptimization: true, + ).vTableGetNullable(buffer, rootOffset, 30); + final object = CloudSyncRunEntity( + id: idParam, + runId: runIdParam, + scopeKey: scopeKeyParam, + accountFingerprint: accountFingerprintParam, + trigger: triggerParam, + architecture: architectureParam, + mode: modeParam, + fetchedCount: fetchedCountParam, + appliedCount: appliedCountParam, + deferredCount: deferredCountParam, + quarantinedCount: quarantinedCountParam, + confirmedCount: confirmedCountParam, + retriedCount: retriedCountParam, + startedAtMs: startedAtMsParam, + finishedAtMs: finishedAtMsParam, + failureCategory: failureCategoryParam, + ); + + return object; + }, + ), + CloudSyncLeaseEntity: obx_int.EntityDefinition( + model: _entities[14], + toOneRelations: (CloudSyncLeaseEntity object) => [], + toManyRelations: (CloudSyncLeaseEntity object) => {}, + getId: (CloudSyncLeaseEntity object) => object.id, + setId: (CloudSyncLeaseEntity object, int id) { + object.id = id; + }, + objectToFB: (CloudSyncLeaseEntity object, fb.Builder fbb) { + final leaseKeyOffset = fbb.writeString(object.leaseKey); + final scopeKeyOffset = fbb.writeString(object.scopeKey); + final accountFingerprintOffset = fbb.writeString( + object.accountFingerprint, + ); + final ownerIdHashOffset = fbb.writeString(object.ownerIdHash); + fbb.startTable(9); + fbb.addInt64(0, object.id); + fbb.addOffset(1, leaseKeyOffset); + fbb.addOffset(2, scopeKeyOffset); + fbb.addOffset(3, accountFingerprintOffset); + fbb.addOffset(4, ownerIdHashOffset); + fbb.addInt64(5, object.generation); + fbb.addInt64(6, object.acquiredAtMs); + fbb.addInt64(7, object.expiresAtMs); + fbb.finish(fbb.endTable()); + return object.id; + }, + objectFromFB: (obx.Store store, ByteData fbData) { + final buffer = fb.BufferContext(fbData); + final rootOffset = buffer.derefObject(0); + final idParam = const fb.Int64Reader().vTableGet( + buffer, + rootOffset, + 4, + 0, + ); + final leaseKeyParam = const fb.StringReader( + asciiOptimization: true, + ).vTableGet(buffer, rootOffset, 6, ''); + final scopeKeyParam = const fb.StringReader( + asciiOptimization: true, + ).vTableGet(buffer, rootOffset, 8, ''); + final accountFingerprintParam = const fb.StringReader( + asciiOptimization: true, + ).vTableGet(buffer, rootOffset, 10, ''); + final ownerIdHashParam = const fb.StringReader( + asciiOptimization: true, + ).vTableGet(buffer, rootOffset, 12, ''); + final generationParam = const fb.Int64Reader().vTableGet( + buffer, + rootOffset, + 14, + 0, + ); + final acquiredAtMsParam = const fb.Int64Reader().vTableGet( + buffer, + rootOffset, + 16, + 0, + ); + final expiresAtMsParam = const fb.Int64Reader().vTableGet( + buffer, + rootOffset, + 18, + 0, + ); + final object = CloudSyncLeaseEntity( + id: idParam, + leaseKey: leaseKeyParam, + scopeKey: scopeKeyParam, + accountFingerprint: accountFingerprintParam, + ownerIdHash: ownerIdHashParam, + generation: generationParam, + acquiredAtMs: acquiredAtMsParam, + expiresAtMs: expiresAtMsParam, + ); + + return object; + }, + ), + CloudAttachmentMaterializationEntity: + obx_int.EntityDefinition( + model: _entities[15], + toOneRelations: (CloudAttachmentMaterializationEntity object) => [], + toManyRelations: (CloudAttachmentMaterializationEntity object) => {}, + getId: (CloudAttachmentMaterializationEntity object) => object.id, + setId: (CloudAttachmentMaterializationEntity object, int id) { + object.id = id; + }, + objectToFB: + (CloudAttachmentMaterializationEntity object, fb.Builder fbb) { + final transferKeyOffset = fbb.writeString(object.transferKey); + final scopeKeyOffset = fbb.writeString(object.scopeKey); + final accountFingerprintOffset = fbb.writeString( + object.accountFingerprint, + ); + final zoneOffset = fbb.writeString(object.zone); + final logicalEntityKeyHashOffset = fbb.writeString( + object.logicalEntityKeyHash, + ); + final expectedIntegrityTagHashOffset = fbb.writeString( + object.expectedIntegrityTagHash, + ); + final protectedTempReferenceOffset = + object.protectedTempReference == null + ? null + : fbb.writeString(object.protectedTempReference!); + final protectedResumeManifestReferenceOffset = + object.protectedResumeManifestReference == null + ? null + : fbb.writeString(object.protectedResumeManifestReference!); + final protectedContentVerificationReferenceOffset = + object.protectedContentVerificationReference == null + ? null + : fbb.writeString( + object.protectedContentVerificationReference!, + ); + final protectedFinalReferenceOffset = + object.protectedFinalReference == null + ? null + : fbb.writeString(object.protectedFinalReference!); + fbb.startTable(17); + fbb.addInt64(0, object.id); + fbb.addOffset(1, transferKeyOffset); + fbb.addOffset(2, scopeKeyOffset); + fbb.addOffset(3, accountFingerprintOffset); + fbb.addOffset(4, zoneOffset); + fbb.addInt64(5, object.generation); + fbb.addOffset(6, logicalEntityKeyHashOffset); + fbb.addInt64(7, object.expectedBytes); + fbb.addOffset(8, expectedIntegrityTagHashOffset); + fbb.addInt64(9, object.stage); + fbb.addInt64(10, object.verifiedBytes); + fbb.addOffset(11, protectedTempReferenceOffset); + fbb.addOffset(12, protectedResumeManifestReferenceOffset); + fbb.addOffset(13, protectedContentVerificationReferenceOffset); + fbb.addOffset(14, protectedFinalReferenceOffset); + fbb.addInt64(15, object.updatedAtMs); + fbb.finish(fbb.endTable()); + return object.id; + }, + objectFromFB: (obx.Store store, ByteData fbData) { + final buffer = fb.BufferContext(fbData); + final rootOffset = buffer.derefObject(0); + final idParam = const fb.Int64Reader().vTableGet( + buffer, + rootOffset, + 4, + 0, + ); + final transferKeyParam = const fb.StringReader( + asciiOptimization: true, + ).vTableGet(buffer, rootOffset, 6, ''); + final scopeKeyParam = const fb.StringReader( + asciiOptimization: true, + ).vTableGet(buffer, rootOffset, 8, ''); + final accountFingerprintParam = const fb.StringReader( + asciiOptimization: true, + ).vTableGet(buffer, rootOffset, 10, ''); + final zoneParam = const fb.StringReader( + asciiOptimization: true, + ).vTableGet(buffer, rootOffset, 12, ''); + final generationParam = const fb.Int64Reader().vTableGet( + buffer, + rootOffset, + 14, + 0, + ); + final logicalEntityKeyHashParam = const fb.StringReader( + asciiOptimization: true, + ).vTableGet(buffer, rootOffset, 16, ''); + final expectedBytesParam = const fb.Int64Reader().vTableGet( + buffer, + rootOffset, + 18, + 0, + ); + final expectedIntegrityTagHashParam = const fb.StringReader( + asciiOptimization: true, + ).vTableGet(buffer, rootOffset, 20, ''); + final stageParam = const fb.Int64Reader().vTableGet( + buffer, + rootOffset, + 22, + 0, + ); + final verifiedBytesParam = const fb.Int64Reader().vTableGet( + buffer, + rootOffset, + 24, + 0, + ); + final protectedTempReferenceParam = const fb.StringReader( + asciiOptimization: true, + ).vTableGetNullable(buffer, rootOffset, 26); + final protectedResumeManifestReferenceParam = const fb.StringReader( + asciiOptimization: true, + ).vTableGetNullable(buffer, rootOffset, 28); + final protectedContentVerificationReferenceParam = + const fb.StringReader( + asciiOptimization: true, + ).vTableGetNullable(buffer, rootOffset, 30); + final protectedFinalReferenceParam = const fb.StringReader( + asciiOptimization: true, + ).vTableGetNullable(buffer, rootOffset, 32); + final updatedAtMsParam = const fb.Int64Reader().vTableGet( + buffer, + rootOffset, + 34, + 0, + ); + final object = CloudAttachmentMaterializationEntity( id: idParam, - originalROWID: originalROWIDParam, - address: addressParam, - formattedAddress: formattedAddressParam, - service: serviceParam, - uniqueAddressAndService: uniqueAddressAndServiceParam, - country: countryParam, - defaultEmail: defaultEmailParam, - defaultPhone: defaultPhoneParam, - blocked: blockedParam) - ..color = const fb.StringReader(asciiOptimization: true) - .vTableGetNullable(buffer, rootOffset, 12) - ..posterPath = const fb.StringReader(asciiOptimization: true) - .vTableGetNullable(buffer, rootOffset, 30); - object.contactRelation.targetId = - const fb.Int64Reader().vTableGet(buffer, rootOffset, 24, 0); - object.contactRelation.attach(store); - return object; - }), - ThemeEntry: obx_int.EntityDefinition( - model: _entities[4], - toOneRelations: (ThemeEntry object) => [object.themeObject], - toManyRelations: (ThemeEntry object) => {}, - getId: (ThemeEntry object) => object.id, - setId: (ThemeEntry object, int id) { - object.id = id; - }, - objectToFB: (ThemeEntry object, fb.Builder fbb) { - final nameOffset = - object.name == null ? null : fbb.writeString(object.name!); - final dbColorOffset = - object.dbColor == null ? null : fbb.writeString(object.dbColor!); - fbb.startTable(9); - fbb.addInt64(0, object.id ?? 0); - fbb.addInt64(1, object.themeId); - fbb.addOffset(2, nameOffset); - fbb.addBool(3, object.isFont); - fbb.addInt64(4, object.fontSize); - fbb.addOffset(5, dbColorOffset); - fbb.addInt64(6, object.fontWeight); - fbb.addInt64(7, object.themeObject.targetId); - fbb.finish(fbb.endTable()); - return object.id ?? 0; - }, - objectFromFB: (obx.Store store, ByteData fbData) { - final buffer = fb.BufferContext(fbData); - final rootOffset = buffer.derefObject(0); - final idParam = - const fb.Int64Reader().vTableGetNullable(buffer, rootOffset, 4); - final themeIdParam = - const fb.Int64Reader().vTableGetNullable(buffer, rootOffset, 6); - final nameParam = const fb.StringReader(asciiOptimization: true) - .vTableGetNullable(buffer, rootOffset, 8); - final isFontParam = - const fb.BoolReader().vTableGetNullable(buffer, rootOffset, 10); - final fontSizeParam = - const fb.Int64Reader().vTableGetNullable(buffer, rootOffset, 12); - final fontWeightParam = - const fb.Int64Reader().vTableGetNullable(buffer, rootOffset, 16); - final object = ThemeEntry( + transferKey: transferKeyParam, + scopeKey: scopeKeyParam, + accountFingerprint: accountFingerprintParam, + zone: zoneParam, + generation: generationParam, + logicalEntityKeyHash: logicalEntityKeyHashParam, + expectedBytes: expectedBytesParam, + expectedIntegrityTagHash: expectedIntegrityTagHashParam, + stage: stageParam, + verifiedBytes: verifiedBytesParam, + protectedTempReference: protectedTempReferenceParam, + protectedResumeManifestReference: + protectedResumeManifestReferenceParam, + protectedContentVerificationReference: + protectedContentVerificationReferenceParam, + protectedFinalReference: protectedFinalReferenceParam, + updatedAtMs: updatedAtMsParam, + ); + + return object; + }, + ), + CloudSemanticReplayEntity: + obx_int.EntityDefinition( + model: _entities[16], + toOneRelations: (CloudSemanticReplayEntity object) => [], + toManyRelations: (CloudSemanticReplayEntity object) => {}, + getId: (CloudSemanticReplayEntity object) => object.id, + setId: (CloudSemanticReplayEntity object, int id) { + object.id = id; + }, + objectToFB: (CloudSemanticReplayEntity object, fb.Builder fbb) { + final replayKeyOffset = fbb.writeString(object.replayKey); + final scopeGenerationKeyOffset = fbb.writeString( + object.scopeGenerationKey, + ); + final scopeKeyOffset = fbb.writeString(object.scopeKey); + final accountFingerprintOffset = fbb.writeString( + object.accountFingerprint, + ); + final containerOffset = fbb.writeString(object.container); + final databaseOffset = fbb.writeString(object.database); + final zoneOffset = fbb.writeString(object.zone); + final streamKindOffset = fbb.writeString(object.streamKind); + final changeIdHashOffset = fbb.writeString(object.changeIdHash); + final serverRecordIdHashOffset = fbb.writeString( + object.serverRecordIdHash, + ); + final logicalEntityKeyHashOffset = + object.logicalEntityKeyHash == null + ? null + : fbb.writeString(object.logicalEntityKeyHash!); + final payloadSha256Offset = object.payloadSha256 == null + ? null + : fbb.writeString(object.payloadSha256!); + final protectedPayloadReferenceHashOffset = + object.protectedPayloadReferenceHash == null + ? null + : fbb.writeString(object.protectedPayloadReferenceHash!); + final changeTypeOffset = fbb.writeString(object.changeType); + final terminalOutcomeOffset = fbb.writeString( + object.terminalOutcome, + ); + final terminalSafeCodeOffset = object.terminalSafeCode == null + ? null + : fbb.writeString(object.terminalSafeCode!); + fbb.startTable(25); + fbb.addInt64(0, object.id); + fbb.addOffset(1, replayKeyOffset); + fbb.addOffset(2, scopeGenerationKeyOffset); + fbb.addOffset(3, scopeKeyOffset); + fbb.addOffset(4, accountFingerprintOffset); + fbb.addOffset(5, containerOffset); + fbb.addOffset(6, databaseOffset); + fbb.addOffset(7, zoneOffset); + fbb.addOffset(8, streamKindOffset); + fbb.addInt64(9, object.schemaVersion); + fbb.addInt64(10, object.generation); + fbb.addOffset(11, changeIdHashOffset); + fbb.addInt64(15, object.updatedAtMs); + fbb.addOffset(16, serverRecordIdHashOffset); + fbb.addOffset(17, logicalEntityKeyHashOffset); + fbb.addOffset(18, payloadSha256Offset); + fbb.addOffset(19, protectedPayloadReferenceHashOffset); + fbb.addInt64(20, object.inboxSequence); + fbb.addOffset(21, changeTypeOffset); + fbb.addOffset(22, terminalOutcomeOffset); + fbb.addOffset(23, terminalSafeCodeOffset); + fbb.finish(fbb.endTable()); + return object.id; + }, + objectFromFB: (obx.Store store, ByteData fbData) { + final buffer = fb.BufferContext(fbData); + final rootOffset = buffer.derefObject(0); + final idParam = const fb.Int64Reader().vTableGet( + buffer, + rootOffset, + 4, + 0, + ); + final replayKeyParam = const fb.StringReader( + asciiOptimization: true, + ).vTableGet(buffer, rootOffset, 6, ''); + final scopeGenerationKeyParam = const fb.StringReader( + asciiOptimization: true, + ).vTableGet(buffer, rootOffset, 8, ''); + final scopeKeyParam = const fb.StringReader( + asciiOptimization: true, + ).vTableGet(buffer, rootOffset, 10, ''); + final accountFingerprintParam = const fb.StringReader( + asciiOptimization: true, + ).vTableGet(buffer, rootOffset, 12, ''); + final containerParam = const fb.StringReader( + asciiOptimization: true, + ).vTableGet(buffer, rootOffset, 14, ''); + final databaseParam = const fb.StringReader( + asciiOptimization: true, + ).vTableGet(buffer, rootOffset, 16, ''); + final zoneParam = const fb.StringReader( + asciiOptimization: true, + ).vTableGet(buffer, rootOffset, 18, ''); + final streamKindParam = const fb.StringReader( + asciiOptimization: true, + ).vTableGet(buffer, rootOffset, 20, ''); + final schemaVersionParam = const fb.Int64Reader().vTableGet( + buffer, + rootOffset, + 22, + 0, + ); + final generationParam = const fb.Int64Reader().vTableGet( + buffer, + rootOffset, + 24, + 0, + ); + final changeIdHashParam = const fb.StringReader( + asciiOptimization: true, + ).vTableGet(buffer, rootOffset, 26, ''); + final serverRecordIdHashParam = const fb.StringReader( + asciiOptimization: true, + ).vTableGet(buffer, rootOffset, 36, ''); + final logicalEntityKeyHashParam = const fb.StringReader( + asciiOptimization: true, + ).vTableGetNullable(buffer, rootOffset, 38); + final payloadSha256Param = const fb.StringReader( + asciiOptimization: true, + ).vTableGetNullable(buffer, rootOffset, 40); + final protectedPayloadReferenceHashParam = const fb.StringReader( + asciiOptimization: true, + ).vTableGetNullable(buffer, rootOffset, 42); + final inboxSequenceParam = const fb.Int64Reader().vTableGet( + buffer, + rootOffset, + 44, + 0, + ); + final changeTypeParam = const fb.StringReader( + asciiOptimization: true, + ).vTableGet(buffer, rootOffset, 46, ''); + final terminalOutcomeParam = const fb.StringReader( + asciiOptimization: true, + ).vTableGet(buffer, rootOffset, 48, ''); + final terminalSafeCodeParam = const fb.StringReader( + asciiOptimization: true, + ).vTableGetNullable(buffer, rootOffset, 50); + final updatedAtMsParam = const fb.Int64Reader().vTableGet( + buffer, + rootOffset, + 34, + 0, + ); + final object = CloudSemanticReplayEntity( id: idParam, - themeId: themeIdParam, - name: nameParam, - isFont: isFontParam, - fontSize: fontSizeParam, - fontWeight: fontWeightParam) - ..dbColor = const fb.StringReader(asciiOptimization: true) - .vTableGetNullable(buffer, rootOffset, 14); - object.themeObject.targetId = - const fb.Int64Reader().vTableGet(buffer, rootOffset, 18, 0); - object.themeObject.attach(store); - return object; - }), - Message: obx_int.EntityDefinition( - model: _entities[5], - toOneRelations: (Message object) => [object.chat], - toManyRelations: (Message object) => { - obx_int.RelInfo.toOneBacklink(17, object.id!, - (Attachment srcObject) => srcObject.message): - object.dbAttachments - }, - getId: (Message object) => object.id, - setId: (Message object, int id) { - object.id = id; - }, - objectToFB: (Message object, fb.Builder fbb) { - final guidOffset = - object.guid == null ? null : fbb.writeString(object.guid!); - final textOffset = - object.text == null ? null : fbb.writeString(object.text!); - final subjectOffset = - object.subject == null ? null : fbb.writeString(object.subject!); - final countryOffset = - object.country == null ? null : fbb.writeString(object.country!); - final groupTitleOffset = object.groupTitle == null - ? null - : fbb.writeString(object.groupTitle!); - final balloonBundleIdOffset = object.balloonBundleId == null - ? null - : fbb.writeString(object.balloonBundleId!); - final associatedMessageGuidOffset = - object.associatedMessageGuid == null - ? null - : fbb.writeString(object.associatedMessageGuid!); - final associatedMessageTypeOffset = - object.associatedMessageType == null - ? null - : fbb.writeString(object.associatedMessageType!); - final expressiveSendStyleIdOffset = - object.expressiveSendStyleId == null - ? null - : fbb.writeString(object.expressiveSendStyleId!); - final threadOriginatorGuidOffset = object.threadOriginatorGuid == null - ? null - : fbb.writeString(object.threadOriginatorGuid!); - final threadOriginatorPartOffset = object.threadOriginatorPart == null - ? null - : fbb.writeString(object.threadOriginatorPart!); - final dbAttributedBodyOffset = object.dbAttributedBody == null - ? null - : fbb.writeString(object.dbAttributedBody!); - final dbMessageSummaryInfoOffset = object.dbMessageSummaryInfo == null - ? null - : fbb.writeString(object.dbMessageSummaryInfo!); - final dbPayloadDataOffset = object.dbPayloadData == null - ? null - : fbb.writeString(object.dbPayloadData!); - final dbMetadataOffset = object.dbMetadata == null - ? null - : fbb.writeString(object.dbMetadata!); - final stagingGuidOffset = object.stagingGuid == null - ? null - : fbb.writeString(object.stagingGuid!); - final amkSessionIdOffset = object.amkSessionId == null - ? null - : fbb.writeString(object.amkSessionId!); - final sendingServiceIdOffset = object.sendingServiceId == null - ? null - : fbb.writeString(object.sendingServiceId!); - final associatedMessageEmojiOffset = - object.associatedMessageEmoji == null - ? null - : fbb.writeString(object.associatedMessageEmoji!); - final ckRecordIdOffset = object.ckRecordId == null - ? null - : fbb.writeString(object.ckRecordId!); - fbb.startTable(60); - fbb.addInt64(0, object.id ?? 0); - fbb.addInt64(1, object.originalROWID); - fbb.addOffset(2, guidOffset); - fbb.addInt64(3, object.handleId); - fbb.addInt64(4, object.otherHandle); - fbb.addOffset(5, textOffset); - fbb.addOffset(6, subjectOffset); - fbb.addOffset(7, countryOffset); - fbb.addInt64(8, object.dateCreated?.millisecondsSinceEpoch); - fbb.addInt64(9, object.dateRead?.millisecondsSinceEpoch); - fbb.addInt64(10, object.dateDelivered?.millisecondsSinceEpoch); - fbb.addBool(11, object.isFromMe); - fbb.addBool(18, object.hasDdResults); - fbb.addInt64(21, object.datePlayed?.millisecondsSinceEpoch); - fbb.addInt64(22, object.itemType); - fbb.addOffset(23, groupTitleOffset); - fbb.addInt64(24, object.groupActionType); - fbb.addOffset(26, balloonBundleIdOffset); - fbb.addOffset(27, associatedMessageGuidOffset); - fbb.addOffset(28, associatedMessageTypeOffset); - fbb.addOffset(29, expressiveSendStyleIdOffset); - fbb.addBool(31, object.hasAttachments); - fbb.addBool(32, object.hasReactions); - fbb.addInt64(33, object.dateDeleted?.millisecondsSinceEpoch); - fbb.addOffset(34, threadOriginatorGuidOffset); - fbb.addOffset(35, threadOriginatorPartOffset); - fbb.addBool(36, object.bigEmoji); - fbb.addInt64(37, object.error); - fbb.addInt64(38, object.chat.targetId); - fbb.addOffset(39, dbAttributedBodyOffset); - fbb.addInt64(40, object.associatedMessagePart); - fbb.addBool(41, object.hasApplePayloadData); - fbb.addInt64(42, object.dateEdited?.millisecondsSinceEpoch); - fbb.addOffset(43, dbMessageSummaryInfoOffset); - fbb.addOffset(44, dbPayloadDataOffset); - fbb.addOffset(45, dbMetadataOffset); - fbb.addBool(46, object.wasDeliveredQuietly); - fbb.addBool(47, object.didNotifyRecipient); - fbb.addBool(48, object.isBookmarked); - fbb.addBool(49, object.hasBeenForwarded); - fbb.addOffset(50, stagingGuidOffset); - fbb.addOffset(51, amkSessionIdOffset); - fbb.addBool(52, object.isDelivered); - fbb.addBool(53, object.verificationFailed); - fbb.addOffset(54, sendingServiceIdOffset); - fbb.addOffset(55, associatedMessageEmojiOffset); - fbb.addInt64(56, object.dateScheduled?.millisecondsSinceEpoch); - fbb.addOffset(57, ckRecordIdOffset); - fbb.addBool(58, object.ckSyncState); - fbb.finish(fbb.endTable()); - return object.id ?? 0; - }, - objectFromFB: (obx.Store store, ByteData fbData) { - final buffer = fb.BufferContext(fbData); - final rootOffset = buffer.derefObject(0); - final dateCreatedValue = - const fb.Int64Reader().vTableGetNullable(buffer, rootOffset, 20); - final dateReadValue = - const fb.Int64Reader().vTableGetNullable(buffer, rootOffset, 22); - final dateDeliveredValue = - const fb.Int64Reader().vTableGetNullable(buffer, rootOffset, 24); - final datePlayedValue = - const fb.Int64Reader().vTableGetNullable(buffer, rootOffset, 46); - final dateDeletedValue = - const fb.Int64Reader().vTableGetNullable(buffer, rootOffset, 70); - final dateEditedValue = - const fb.Int64Reader().vTableGetNullable(buffer, rootOffset, 88); - final dateScheduledValue = - const fb.Int64Reader().vTableGetNullable(buffer, rootOffset, 116); - final idParam = - const fb.Int64Reader().vTableGetNullable(buffer, rootOffset, 4); - final originalROWIDParam = - const fb.Int64Reader().vTableGetNullable(buffer, rootOffset, 6); - final guidParam = const fb.StringReader(asciiOptimization: true) - .vTableGetNullable(buffer, rootOffset, 8); - final handleIdParam = - const fb.Int64Reader().vTableGetNullable(buffer, rootOffset, 10); - final otherHandleParam = - const fb.Int64Reader().vTableGetNullable(buffer, rootOffset, 12); - final textParam = const fb.StringReader(asciiOptimization: true) - .vTableGetNullable(buffer, rootOffset, 14); - final subjectParam = const fb.StringReader(asciiOptimization: true) - .vTableGetNullable(buffer, rootOffset, 16); - final countryParam = const fb.StringReader(asciiOptimization: true) - .vTableGetNullable(buffer, rootOffset, 18); - final errorParam = - const fb.Int64Reader().vTableGet(buffer, rootOffset, 78, 0); - final dateCreatedParam = dateCreatedValue == null - ? null - : DateTime.fromMillisecondsSinceEpoch(dateCreatedValue); - final dateReadParam = dateReadValue == null - ? null - : DateTime.fromMillisecondsSinceEpoch(dateReadValue); - final dateDeliveredParam = dateDeliveredValue == null - ? null - : DateTime.fromMillisecondsSinceEpoch(dateDeliveredValue); - final isFromMeParam = - const fb.BoolReader().vTableGetNullable(buffer, rootOffset, 26); - final hasDdResultsParam = - const fb.BoolReader().vTableGetNullable(buffer, rootOffset, 40); - final datePlayedParam = datePlayedValue == null - ? null - : DateTime.fromMillisecondsSinceEpoch(datePlayedValue); - final itemTypeParam = - const fb.Int64Reader().vTableGetNullable(buffer, rootOffset, 48); - final groupTitleParam = const fb.StringReader(asciiOptimization: true) - .vTableGetNullable(buffer, rootOffset, 50); - final groupActionTypeParam = - const fb.Int64Reader().vTableGetNullable(buffer, rootOffset, 52); - final balloonBundleIdParam = - const fb.StringReader(asciiOptimization: true) - .vTableGetNullable(buffer, rootOffset, 56); - final associatedMessageGuidParam = - const fb.StringReader(asciiOptimization: true) - .vTableGetNullable(buffer, rootOffset, 58); - final associatedMessagePartParam = - const fb.Int64Reader().vTableGetNullable(buffer, rootOffset, 84); - final associatedMessageTypeParam = - const fb.StringReader(asciiOptimization: true) - .vTableGetNullable(buffer, rootOffset, 60); - final expressiveSendStyleIdParam = - const fb.StringReader(asciiOptimization: true) - .vTableGetNullable(buffer, rootOffset, 62); - final hasAttachmentsParam = - const fb.BoolReader().vTableGet(buffer, rootOffset, 66, false); - final hasReactionsParam = - const fb.BoolReader().vTableGet(buffer, rootOffset, 68, false); - final dateDeletedParam = dateDeletedValue == null - ? null - : DateTime.fromMillisecondsSinceEpoch(dateDeletedValue); - final threadOriginatorGuidParam = - const fb.StringReader(asciiOptimization: true) - .vTableGetNullable(buffer, rootOffset, 72); - final threadOriginatorPartParam = - const fb.StringReader(asciiOptimization: true) - .vTableGetNullable(buffer, rootOffset, 74); - final hasApplePayloadDataParam = - const fb.BoolReader().vTableGet(buffer, rootOffset, 86, false); - final dateEditedParam = dateEditedValue == null - ? null - : DateTime.fromMillisecondsSinceEpoch(dateEditedValue); - final wasDeliveredQuietlyParam = - const fb.BoolReader().vTableGet(buffer, rootOffset, 96, false); - final didNotifyRecipientParam = - const fb.BoolReader().vTableGet(buffer, rootOffset, 98, false); - final isBookmarkedParam = - const fb.BoolReader().vTableGet(buffer, rootOffset, 100, false); - final hasBeenForwardedParam = - const fb.BoolReader().vTableGet(buffer, rootOffset, 102, false); - final stagingGuidParam = - const fb.StringReader(asciiOptimization: true) - .vTableGetNullable(buffer, rootOffset, 104); - final amkSessionIdParam = - const fb.StringReader(asciiOptimization: true) - .vTableGetNullable(buffer, rootOffset, 106); - final verificationFailedParam = - const fb.BoolReader().vTableGet(buffer, rootOffset, 110, false); - final sendingServiceIdParam = - const fb.StringReader(asciiOptimization: true) - .vTableGetNullable(buffer, rootOffset, 112); - final associatedMessageEmojiParam = - const fb.StringReader(asciiOptimization: true) - .vTableGetNullable(buffer, rootOffset, 114); - final dateScheduledParam = dateScheduledValue == null - ? null - : DateTime.fromMillisecondsSinceEpoch(dateScheduledValue); - final ckRecordIdParam = const fb.StringReader(asciiOptimization: true) - .vTableGetNullable(buffer, rootOffset, 118); - final object = Message( + replayKey: replayKeyParam, + scopeGenerationKey: scopeGenerationKeyParam, + scopeKey: scopeKeyParam, + accountFingerprint: accountFingerprintParam, + container: containerParam, + database: databaseParam, + zone: zoneParam, + streamKind: streamKindParam, + schemaVersion: schemaVersionParam, + generation: generationParam, + changeIdHash: changeIdHashParam, + serverRecordIdHash: serverRecordIdHashParam, + logicalEntityKeyHash: logicalEntityKeyHashParam, + payloadSha256: payloadSha256Param, + protectedPayloadReferenceHash: protectedPayloadReferenceHashParam, + inboxSequence: inboxSequenceParam, + changeType: changeTypeParam, + terminalOutcome: terminalOutcomeParam, + terminalSafeCode: terminalSafeCodeParam, + updatedAtMs: updatedAtMsParam, + ); + + return object; + }, + ), + CloudSemanticSnapshotEntity: + obx_int.EntityDefinition( + model: _entities[17], + toOneRelations: (CloudSemanticSnapshotEntity object) => [], + toManyRelations: (CloudSemanticSnapshotEntity object) => {}, + getId: (CloudSemanticSnapshotEntity object) => object.id, + setId: (CloudSemanticSnapshotEntity object, int id) { + object.id = id; + }, + objectToFB: (CloudSemanticSnapshotEntity object, fb.Builder fbb) { + final snapshotKeyOffset = fbb.writeString(object.snapshotKey); + final scopeGenerationKeyOffset = fbb.writeString( + object.scopeGenerationKey, + ); + final scopeKeyOffset = fbb.writeString(object.scopeKey); + final accountFingerprintOffset = fbb.writeString( + object.accountFingerprint, + ); + final containerOffset = fbb.writeString(object.container); + final databaseOffset = fbb.writeString(object.database); + final zoneOffset = fbb.writeString(object.zone); + final streamKindOffset = fbb.writeString(object.streamKind); + final entityKindOffset = fbb.writeString(object.entityKind); + final logicalEntityKeyHashOffset = fbb.writeString( + object.logicalEntityKeyHash, + ); + final parentLogicalKeyHashOffset = + object.parentLogicalKeyHash == null + ? null + : fbb.writeString(object.parentLogicalKeyHash!); + final immutableContentDigestOffset = + object.immutableContentDigest == null + ? null + : fbb.writeString(object.immutableContentDigest!); + final editPartsJsonOffset = fbb.writeString(object.editPartsJson); + final groupMetadataDigestOffset = object.groupMetadataDigest == null + ? null + : fbb.writeString(object.groupMetadataDigest!); + final etagHashOffset = object.etagHash == null + ? null + : fbb.writeString(object.etagHash!); + fbb.startTable(25); + fbb.addInt64(0, object.id); + fbb.addOffset(1, snapshotKeyOffset); + fbb.addOffset(2, scopeGenerationKeyOffset); + fbb.addOffset(3, scopeKeyOffset); + fbb.addOffset(4, accountFingerprintOffset); + fbb.addOffset(5, containerOffset); + fbb.addOffset(6, databaseOffset); + fbb.addOffset(7, zoneOffset); + fbb.addOffset(8, streamKindOffset); + fbb.addInt64(9, object.schemaVersion); + fbb.addInt64(10, object.generation); + fbb.addOffset(11, entityKindOffset); + fbb.addOffset(12, logicalEntityKeyHashOffset); + fbb.addOffset(13, parentLogicalKeyHashOffset); + fbb.addOffset(14, immutableContentDigestOffset); + fbb.addInt64(15, object.createdAtMs); + fbb.addInt64(16, object.readAtMs); + fbb.addInt64(17, object.deliveredAtMs); + fbb.addOffset(18, editPartsJsonOffset); + fbb.addInt64(19, object.retractedAtMs); + fbb.addInt64(20, object.groupVersion); + fbb.addOffset(21, groupMetadataDigestOffset); + fbb.addOffset(22, etagHashOffset); + fbb.addInt64(23, object.updatedAtMs); + fbb.finish(fbb.endTable()); + return object.id; + }, + objectFromFB: (obx.Store store, ByteData fbData) { + final buffer = fb.BufferContext(fbData); + final rootOffset = buffer.derefObject(0); + final idParam = const fb.Int64Reader().vTableGet( + buffer, + rootOffset, + 4, + 0, + ); + final snapshotKeyParam = const fb.StringReader( + asciiOptimization: true, + ).vTableGet(buffer, rootOffset, 6, ''); + final scopeGenerationKeyParam = const fb.StringReader( + asciiOptimization: true, + ).vTableGet(buffer, rootOffset, 8, ''); + final scopeKeyParam = const fb.StringReader( + asciiOptimization: true, + ).vTableGet(buffer, rootOffset, 10, ''); + final accountFingerprintParam = const fb.StringReader( + asciiOptimization: true, + ).vTableGet(buffer, rootOffset, 12, ''); + final containerParam = const fb.StringReader( + asciiOptimization: true, + ).vTableGet(buffer, rootOffset, 14, ''); + final databaseParam = const fb.StringReader( + asciiOptimization: true, + ).vTableGet(buffer, rootOffset, 16, ''); + final zoneParam = const fb.StringReader( + asciiOptimization: true, + ).vTableGet(buffer, rootOffset, 18, ''); + final streamKindParam = const fb.StringReader( + asciiOptimization: true, + ).vTableGet(buffer, rootOffset, 20, ''); + final schemaVersionParam = const fb.Int64Reader().vTableGet( + buffer, + rootOffset, + 22, + 0, + ); + final generationParam = const fb.Int64Reader().vTableGet( + buffer, + rootOffset, + 24, + 0, + ); + final entityKindParam = const fb.StringReader( + asciiOptimization: true, + ).vTableGet(buffer, rootOffset, 26, ''); + final logicalEntityKeyHashParam = const fb.StringReader( + asciiOptimization: true, + ).vTableGet(buffer, rootOffset, 28, ''); + final parentLogicalKeyHashParam = const fb.StringReader( + asciiOptimization: true, + ).vTableGetNullable(buffer, rootOffset, 30); + final immutableContentDigestParam = const fb.StringReader( + asciiOptimization: true, + ).vTableGetNullable(buffer, rootOffset, 32); + final createdAtMsParam = const fb.Int64Reader().vTableGet( + buffer, + rootOffset, + 34, + 0, + ); + final readAtMsParam = const fb.Int64Reader().vTableGet( + buffer, + rootOffset, + 36, + 0, + ); + final deliveredAtMsParam = const fb.Int64Reader().vTableGet( + buffer, + rootOffset, + 38, + 0, + ); + final editPartsJsonParam = const fb.StringReader( + asciiOptimization: true, + ).vTableGet(buffer, rootOffset, 40, ''); + final retractedAtMsParam = const fb.Int64Reader().vTableGet( + buffer, + rootOffset, + 42, + 0, + ); + final groupVersionParam = const fb.Int64Reader().vTableGetNullable( + buffer, + rootOffset, + 44, + ); + final groupMetadataDigestParam = const fb.StringReader( + asciiOptimization: true, + ).vTableGetNullable(buffer, rootOffset, 46); + final etagHashParam = const fb.StringReader( + asciiOptimization: true, + ).vTableGetNullable(buffer, rootOffset, 48); + final updatedAtMsParam = const fb.Int64Reader().vTableGet( + buffer, + rootOffset, + 50, + 0, + ); + final object = CloudSemanticSnapshotEntity( id: idParam, - originalROWID: originalROWIDParam, - guid: guidParam, - handleId: handleIdParam, - otherHandle: otherHandleParam, - text: textParam, - subject: subjectParam, - country: countryParam, - error: errorParam, - dateCreated: dateCreatedParam, - dateRead: dateReadParam, - dateDelivered: dateDeliveredParam, - isFromMe: isFromMeParam, - hasDdResults: hasDdResultsParam, - datePlayed: datePlayedParam, - itemType: itemTypeParam, - groupTitle: groupTitleParam, - groupActionType: groupActionTypeParam, - balloonBundleId: balloonBundleIdParam, - associatedMessageGuid: associatedMessageGuidParam, - associatedMessagePart: associatedMessagePartParam, - associatedMessageType: associatedMessageTypeParam, - expressiveSendStyleId: expressiveSendStyleIdParam, - hasAttachments: hasAttachmentsParam, - hasReactions: hasReactionsParam, - dateDeleted: dateDeletedParam, - threadOriginatorGuid: threadOriginatorGuidParam, - threadOriginatorPart: threadOriginatorPartParam, - hasApplePayloadData: hasApplePayloadDataParam, - dateEdited: dateEditedParam, - wasDeliveredQuietly: wasDeliveredQuietlyParam, - didNotifyRecipient: didNotifyRecipientParam, - isBookmarked: isBookmarkedParam, - hasBeenForwarded: hasBeenForwardedParam, - stagingGuid: stagingGuidParam, - amkSessionId: amkSessionIdParam, - verificationFailed: verificationFailedParam, - sendingServiceId: sendingServiceIdParam, - associatedMessageEmoji: associatedMessageEmojiParam, - dateScheduled: dateScheduledParam, - ckRecordId: ckRecordIdParam) - ..bigEmoji = - const fb.BoolReader().vTableGetNullable(buffer, rootOffset, 76) - ..dbAttributedBody = const fb.StringReader(asciiOptimization: true) - .vTableGetNullable(buffer, rootOffset, 82) - ..dbMessageSummaryInfo = - const fb.StringReader(asciiOptimization: true) - .vTableGetNullable(buffer, rootOffset, 90) - ..dbPayloadData = const fb.StringReader(asciiOptimization: true) - .vTableGetNullable(buffer, rootOffset, 92) - ..dbMetadata = const fb.StringReader(asciiOptimization: true) - .vTableGetNullable(buffer, rootOffset, 94) - ..isDelivered = - const fb.BoolReader().vTableGet(buffer, rootOffset, 108, false) - ..ckSyncState = - const fb.BoolReader().vTableGet(buffer, rootOffset, 120, false); - object.chat.targetId = - const fb.Int64Reader().vTableGet(buffer, rootOffset, 80, 0); - object.chat.attach(store); - obx_int.InternalToManyAccess.setRelInfo( - object.dbAttachments, - store, - obx_int.RelInfo.toOneBacklink( - 17, object.id!, (Attachment srcObject) => srcObject.message)); - return object; - }), - ThemeObject: obx_int.EntityDefinition( - model: _entities[6], - toOneRelations: (ThemeObject object) => [], - toManyRelations: (ThemeObject object) => { - obx_int.RelInfo.toOneBacklink(8, object.id!, - (ThemeEntry srcObject) => srcObject.themeObject): - object.themeEntries - }, - getId: (ThemeObject object) => object.id, - setId: (ThemeObject object, int id) { - object.id = id; - }, - objectToFB: (ThemeObject object, fb.Builder fbb) { - final nameOffset = - object.name == null ? null : fbb.writeString(object.name!); - fbb.startTable(8); - fbb.addInt64(0, object.id ?? 0); - fbb.addOffset(1, nameOffset); - fbb.addBool(2, object.selectedLightTheme); - fbb.addBool(3, object.selectedDarkTheme); - fbb.addBool(4, object.gradientBg); - fbb.addBool(5, object.previousLightTheme); - fbb.addBool(6, object.previousDarkTheme); - fbb.finish(fbb.endTable()); - return object.id ?? 0; - }, - objectFromFB: (obx.Store store, ByteData fbData) { - final buffer = fb.BufferContext(fbData); - final rootOffset = buffer.derefObject(0); - final idParam = - const fb.Int64Reader().vTableGetNullable(buffer, rootOffset, 4); - final nameParam = const fb.StringReader(asciiOptimization: true) - .vTableGetNullable(buffer, rootOffset, 6); - final selectedLightThemeParam = - const fb.BoolReader().vTableGet(buffer, rootOffset, 8, false); - final selectedDarkThemeParam = - const fb.BoolReader().vTableGet(buffer, rootOffset, 10, false); - final gradientBgParam = - const fb.BoolReader().vTableGet(buffer, rootOffset, 12, false); - final previousLightThemeParam = - const fb.BoolReader().vTableGet(buffer, rootOffset, 14, false); - final previousDarkThemeParam = - const fb.BoolReader().vTableGet(buffer, rootOffset, 16, false); - final object = ThemeObject( + snapshotKey: snapshotKeyParam, + scopeGenerationKey: scopeGenerationKeyParam, + scopeKey: scopeKeyParam, + accountFingerprint: accountFingerprintParam, + container: containerParam, + database: databaseParam, + zone: zoneParam, + streamKind: streamKindParam, + schemaVersion: schemaVersionParam, + generation: generationParam, + entityKind: entityKindParam, + logicalEntityKeyHash: logicalEntityKeyHashParam, + parentLogicalKeyHash: parentLogicalKeyHashParam, + immutableContentDigest: immutableContentDigestParam, + createdAtMs: createdAtMsParam, + readAtMs: readAtMsParam, + deliveredAtMs: deliveredAtMsParam, + editPartsJson: editPartsJsonParam, + retractedAtMs: retractedAtMsParam, + groupVersion: groupVersionParam, + groupMetadataDigest: groupMetadataDigestParam, + etagHash: etagHashParam, + updatedAtMs: updatedAtMsParam, + ); + + return object; + }, + ), + CloudProtectedPageLeaseEntity: + obx_int.EntityDefinition( + model: _entities[18], + toOneRelations: (CloudProtectedPageLeaseEntity object) => [], + toManyRelations: (CloudProtectedPageLeaseEntity object) => {}, + getId: (CloudProtectedPageLeaseEntity object) => object.id, + setId: (CloudProtectedPageLeaseEntity object, int id) { + object.id = id; + }, + objectToFB: (CloudProtectedPageLeaseEntity object, fb.Builder fbb) { + final leaseReferenceOffset = fbb.writeString(object.leaseReference); + final scopeKeyOffset = fbb.writeString(object.scopeKey); + final accountFingerprintOffset = fbb.writeString( + object.accountFingerprint, + ); + final batchIdHashOffset = fbb.writeString(object.batchIdHash); + fbb.startTable(10); + fbb.addInt64(0, object.id); + fbb.addOffset(1, leaseReferenceOffset); + fbb.addOffset(2, scopeKeyOffset); + fbb.addOffset(3, accountFingerprintOffset); + fbb.addInt64(4, object.generation); + fbb.addOffset(5, batchIdHashOffset); + fbb.addInt64(6, object.adoptedAtMs); + fbb.addInt64(7, object.finalizeAttemptCount); + fbb.addInt64(8, object.nextFinalizeEligibleAtMs); + fbb.finish(fbb.endTable()); + return object.id; + }, + objectFromFB: (obx.Store store, ByteData fbData) { + final buffer = fb.BufferContext(fbData); + final rootOffset = buffer.derefObject(0); + final idParam = const fb.Int64Reader().vTableGet( + buffer, + rootOffset, + 4, + 0, + ); + final leaseReferenceParam = const fb.StringReader( + asciiOptimization: true, + ).vTableGet(buffer, rootOffset, 6, ''); + final scopeKeyParam = const fb.StringReader( + asciiOptimization: true, + ).vTableGet(buffer, rootOffset, 8, ''); + final accountFingerprintParam = const fb.StringReader( + asciiOptimization: true, + ).vTableGet(buffer, rootOffset, 10, ''); + final generationParam = const fb.Int64Reader().vTableGet( + buffer, + rootOffset, + 12, + 0, + ); + final batchIdHashParam = const fb.StringReader( + asciiOptimization: true, + ).vTableGet(buffer, rootOffset, 14, ''); + final adoptedAtMsParam = const fb.Int64Reader().vTableGet( + buffer, + rootOffset, + 16, + 0, + ); + final finalizeAttemptCountParam = const fb.Int64Reader().vTableGet( + buffer, + rootOffset, + 18, + 0, + ); + final nextFinalizeEligibleAtMsParam = const fb.Int64Reader() + .vTableGet(buffer, rootOffset, 20, 0); + final object = CloudProtectedPageLeaseEntity( id: idParam, - name: nameParam, - selectedLightTheme: selectedLightThemeParam, - selectedDarkTheme: selectedDarkThemeParam, - gradientBg: gradientBgParam, - previousLightTheme: previousLightThemeParam, - previousDarkTheme: previousDarkThemeParam); - obx_int.InternalToManyAccess.setRelInfo( - object.themeEntries, - store, - obx_int.RelInfo.toOneBacklink(8, object.id!, - (ThemeEntry srcObject) => srcObject.themeObject)); - return object; - }), - ThemeStruct: obx_int.EntityDefinition( - model: _entities[7], - toOneRelations: (ThemeStruct object) => [], - toManyRelations: (ThemeStruct object) => {}, - getId: (ThemeStruct object) => object.id, - setId: (ThemeStruct object, int id) { - object.id = id; - }, - objectToFB: (ThemeStruct object, fb.Builder fbb) { - final nameOffset = fbb.writeString(object.name); - final dbThemeDataOffset = fbb.writeString(object.dbThemeData); - final googleFontOffset = fbb.writeString(object.googleFont); - fbb.startTable(6); - fbb.addInt64(0, object.id ?? 0); - fbb.addOffset(1, nameOffset); - fbb.addBool(2, object.gradientBg); - fbb.addOffset(3, dbThemeDataOffset); - fbb.addOffset(4, googleFontOffset); - fbb.finish(fbb.endTable()); - return object.id ?? 0; - }, - objectFromFB: (obx.Store store, ByteData fbData) { - final buffer = fb.BufferContext(fbData); - final rootOffset = buffer.derefObject(0); - final idParam = - const fb.Int64Reader().vTableGetNullable(buffer, rootOffset, 4); - final nameParam = const fb.StringReader(asciiOptimization: true) - .vTableGet(buffer, rootOffset, 6, ''); - final gradientBgParam = - const fb.BoolReader().vTableGet(buffer, rootOffset, 8, false); - final googleFontParam = const fb.StringReader(asciiOptimization: true) - .vTableGet(buffer, rootOffset, 12, ''); - final object = ThemeStruct( + leaseReference: leaseReferenceParam, + scopeKey: scopeKeyParam, + accountFingerprint: accountFingerprintParam, + generation: generationParam, + batchIdHash: batchIdHashParam, + adoptedAtMs: adoptedAtMsParam, + finalizeAttemptCount: finalizeAttemptCountParam, + nextFinalizeEligibleAtMs: nextFinalizeEligibleAtMsParam, + ); + + return object; + }, + ), + CloudKitWriterAuthorityEntity: + obx_int.EntityDefinition( + model: _entities[19], + toOneRelations: (CloudKitWriterAuthorityEntity object) => [], + toManyRelations: (CloudKitWriterAuthorityEntity object) => {}, + getId: (CloudKitWriterAuthorityEntity object) => object.id, + setId: (CloudKitWriterAuthorityEntity object, int id) { + object.id = id; + }, + objectToFB: (CloudKitWriterAuthorityEntity object, fb.Builder fbb) { + final authorityKeyOffset = fbb.writeString(object.authorityKey); + final accountFingerprintOffset = fbb.writeString( + object.accountFingerprint, + ); + final containerOffset = fbb.writeString(object.container); + final databaseOffset = fbb.writeString(object.database); + final transitionIdHashOffset = object.transitionIdHash == null + ? null + : fbb.writeString(object.transitionIdHash!); + final resetScopeKeyHashOffset = object.resetScopeKeyHash == null + ? null + : fbb.writeString(object.resetScopeKeyHash!); + final resetProofReferenceHashOffset = + object.resetProofReferenceHash == null + ? null + : fbb.writeString(object.resetProofReferenceHash!); + fbb.startTable(15); + fbb.addInt64(0, object.id); + fbb.addOffset(1, authorityKeyOffset); + fbb.addOffset(2, accountFingerprintOffset); + fbb.addOffset(3, containerOffset); + fbb.addOffset(4, databaseOffset); + fbb.addInt64(5, object.owner); + fbb.addInt64(6, object.state); + fbb.addInt64(7, object.targetOwner); + fbb.addInt64(8, object.epoch); + fbb.addInt64(9, object.updatedAtMs); + fbb.addOffset(10, transitionIdHashOffset); + fbb.addOffset(11, resetScopeKeyHashOffset); + fbb.addInt64(12, object.resetGeneration); + fbb.addOffset(13, resetProofReferenceHashOffset); + fbb.finish(fbb.endTable()); + return object.id; + }, + objectFromFB: (obx.Store store, ByteData fbData) { + final buffer = fb.BufferContext(fbData); + final rootOffset = buffer.derefObject(0); + final idParam = const fb.Int64Reader().vTableGet( + buffer, + rootOffset, + 4, + 0, + ); + final authorityKeyParam = const fb.StringReader( + asciiOptimization: true, + ).vTableGet(buffer, rootOffset, 6, ''); + final accountFingerprintParam = const fb.StringReader( + asciiOptimization: true, + ).vTableGet(buffer, rootOffset, 8, ''); + final containerParam = const fb.StringReader( + asciiOptimization: true, + ).vTableGet(buffer, rootOffset, 10, ''); + final databaseParam = const fb.StringReader( + asciiOptimization: true, + ).vTableGet(buffer, rootOffset, 12, ''); + final ownerParam = const fb.Int64Reader().vTableGet( + buffer, + rootOffset, + 14, + 0, + ); + final stateParam = const fb.Int64Reader().vTableGet( + buffer, + rootOffset, + 16, + 0, + ); + final targetOwnerParam = const fb.Int64Reader().vTableGet( + buffer, + rootOffset, + 18, + 0, + ); + final epochParam = const fb.Int64Reader().vTableGet( + buffer, + rootOffset, + 20, + 0, + ); + final transitionIdHashParam = const fb.StringReader( + asciiOptimization: true, + ).vTableGetNullable(buffer, rootOffset, 24); + final resetScopeKeyHashParam = const fb.StringReader( + asciiOptimization: true, + ).vTableGetNullable(buffer, rootOffset, 26); + final resetProofReferenceHashParam = const fb.StringReader( + asciiOptimization: true, + ).vTableGetNullable(buffer, rootOffset, 30); + final resetGenerationParam = const fb.Int64Reader().vTableGet( + buffer, + rootOffset, + 28, + 0, + ); + final updatedAtMsParam = const fb.Int64Reader().vTableGet( + buffer, + rootOffset, + 22, + 0, + ); + final object = CloudKitWriterAuthorityEntity( id: idParam, - name: nameParam, - gradientBg: gradientBgParam, - googleFont: googleFontParam) - ..dbThemeData = const fb.StringReader(asciiOptimization: true) - .vTableGet(buffer, rootOffset, 10, ''); - - return object; - }), - Contact: obx_int.EntityDefinition( - model: _entities[8], - toOneRelations: (Contact object) => [], - toManyRelations: (Contact object) => {}, - getId: (Contact object) => object.dbId, - setId: (Contact object, int id) { - object.dbId = id; - }, - objectToFB: (Contact object, fb.Builder fbb) { - final idOffset = fbb.writeString(object.id); - final displayNameOffset = fbb.writeString(object.displayName); - final phonesOffset = fbb.writeList( - object.phones.map(fbb.writeString).toList(growable: false)); - final emailsOffset = fbb.writeList( - object.emails.map(fbb.writeString).toList(growable: false)); - final avatarOffset = - object.avatar == null ? null : fbb.writeListInt8(object.avatar!); - final dbStructuredNameOffset = object.dbStructuredName == null - ? null - : fbb.writeString(object.dbStructuredName!); - final posterPathOffset = object.posterPath == null - ? null - : fbb.writeString(object.posterPath!); - fbb.startTable(14); - fbb.addInt64(0, object.dbId ?? 0); - fbb.addOffset(1, idOffset); - fbb.addOffset(2, displayNameOffset); - fbb.addOffset(3, phonesOffset); - fbb.addOffset(5, emailsOffset); - fbb.addOffset(7, avatarOffset); - fbb.addOffset(9, dbStructuredNameOffset); - fbb.addBool(10, object.isShared); - fbb.addBool(11, object.isDismissed); - fbb.addOffset(12, posterPathOffset); - fbb.finish(fbb.endTable()); - return object.dbId ?? 0; - }, - objectFromFB: (obx.Store store, ByteData fbData) { - final buffer = fb.BufferContext(fbData); - final rootOffset = buffer.derefObject(0); - final dbIdParam = - const fb.Int64Reader().vTableGetNullable(buffer, rootOffset, 4); - final idParam = const fb.StringReader(asciiOptimization: true) - .vTableGet(buffer, rootOffset, 6, ''); - final displayNameParam = - const fb.StringReader(asciiOptimization: true) - .vTableGet(buffer, rootOffset, 8, ''); - final phonesParam = const fb.ListReader( - fb.StringReader(asciiOptimization: true), - lazy: false) - .vTableGet(buffer, rootOffset, 10, []); - final emailsParam = const fb.ListReader( - fb.StringReader(asciiOptimization: true), - lazy: false) - .vTableGet(buffer, rootOffset, 14, []); - final avatarParam = const fb.Uint8ListReader(lazy: false) - .vTableGetNullable(buffer, rootOffset, 18) as Uint8List?; - final isSharedParam = - const fb.BoolReader().vTableGet(buffer, rootOffset, 24, false); - final isDismissedParam = - const fb.BoolReader().vTableGet(buffer, rootOffset, 26, false); - final posterPathParam = const fb.StringReader(asciiOptimization: true) - .vTableGetNullable(buffer, rootOffset, 28); - final object = Contact( - dbId: dbIdParam, + authorityKey: authorityKeyParam, + accountFingerprint: accountFingerprintParam, + container: containerParam, + database: databaseParam, + owner: ownerParam, + state: stateParam, + targetOwner: targetOwnerParam, + epoch: epochParam, + transitionIdHash: transitionIdHashParam, + resetScopeKeyHash: resetScopeKeyHashParam, + resetProofReferenceHash: resetProofReferenceHashParam, + resetGeneration: resetGenerationParam, + updatedAtMs: updatedAtMsParam, + ); + + return object; + }, + ), + CloudKitDeletionIntentEntity: + obx_int.EntityDefinition( + model: _entities[20], + toOneRelations: (CloudKitDeletionIntentEntity object) => [], + toManyRelations: (CloudKitDeletionIntentEntity object) => {}, + getId: (CloudKitDeletionIntentEntity object) => object.id, + setId: (CloudKitDeletionIntentEntity object, int id) { + object.id = id; + }, + objectToFB: (CloudKitDeletionIntentEntity object, fb.Builder fbb) { + final intentKeyOffset = fbb.writeString(object.intentKey); + final accountFingerprintOffset = fbb.writeString( + object.accountFingerprint, + ); + final containerOffset = fbb.writeString(object.container); + final databaseOffset = fbb.writeString(object.database); + final recordIdOffset = fbb.writeString(object.recordId); + final quarantineReasonOffset = object.quarantineReason == null + ? null + : fbb.writeString(object.quarantineReason!); + fbb.startTable(13); + fbb.addInt64(0, object.id); + fbb.addOffset(1, intentKeyOffset); + fbb.addOffset(2, accountFingerprintOffset); + fbb.addOffset(3, containerOffset); + fbb.addOffset(4, databaseOffset); + fbb.addInt64(5, object.writerEpoch); + fbb.addInt64(6, object.kind); + fbb.addOffset(7, recordIdOffset); + fbb.addInt64(8, object.state); + fbb.addOffset(9, quarantineReasonOffset); + fbb.addInt64(10, object.createdAtMs); + fbb.addInt64(11, object.updatedAtMs); + fbb.finish(fbb.endTable()); + return object.id; + }, + objectFromFB: (obx.Store store, ByteData fbData) { + final buffer = fb.BufferContext(fbData); + final rootOffset = buffer.derefObject(0); + final idParam = const fb.Int64Reader().vTableGet( + buffer, + rootOffset, + 4, + 0, + ); + final intentKeyParam = const fb.StringReader( + asciiOptimization: true, + ).vTableGet(buffer, rootOffset, 6, ''); + final accountFingerprintParam = const fb.StringReader( + asciiOptimization: true, + ).vTableGet(buffer, rootOffset, 8, ''); + final containerParam = const fb.StringReader( + asciiOptimization: true, + ).vTableGet(buffer, rootOffset, 10, ''); + final databaseParam = const fb.StringReader( + asciiOptimization: true, + ).vTableGet(buffer, rootOffset, 12, ''); + final writerEpochParam = const fb.Int64Reader().vTableGet( + buffer, + rootOffset, + 14, + 0, + ); + final kindParam = const fb.Int64Reader().vTableGet( + buffer, + rootOffset, + 16, + 0, + ); + final recordIdParam = const fb.StringReader( + asciiOptimization: true, + ).vTableGet(buffer, rootOffset, 18, ''); + final stateParam = const fb.Int64Reader().vTableGet( + buffer, + rootOffset, + 20, + 0, + ); + final quarantineReasonParam = const fb.StringReader( + asciiOptimization: true, + ).vTableGetNullable(buffer, rootOffset, 22); + final createdAtMsParam = const fb.Int64Reader().vTableGet( + buffer, + rootOffset, + 24, + 0, + ); + final updatedAtMsParam = const fb.Int64Reader().vTableGet( + buffer, + rootOffset, + 26, + 0, + ); + final object = CloudKitDeletionIntentEntity( + id: idParam, + intentKey: intentKeyParam, + accountFingerprint: accountFingerprintParam, + container: containerParam, + database: databaseParam, + writerEpoch: writerEpochParam, + kind: kindParam, + recordId: recordIdParam, + state: stateParam, + quarantineReason: quarantineReasonParam, + createdAtMs: createdAtMsParam, + updatedAtMs: updatedAtMsParam, + ); + + return object; + }, + ), + CloudKitDeletionQuarantineEntity: + obx_int.EntityDefinition( + model: _entities[21], + toOneRelations: (CloudKitDeletionQuarantineEntity object) => [], + toManyRelations: (CloudKitDeletionQuarantineEntity object) => {}, + getId: (CloudKitDeletionQuarantineEntity object) => object.id, + setId: (CloudKitDeletionQuarantineEntity object, int id) { + object.id = id; + }, + objectToFB: + (CloudKitDeletionQuarantineEntity object, fb.Builder fbb) { + final quarantineKeyOffset = fbb.writeString( + object.quarantineKey, + ); + final sourceKeyOffset = fbb.writeString(object.sourceKey); + final recordIdOffset = fbb.writeString(object.recordId); + final reasonOffset = fbb.writeString(object.reason); + fbb.startTable(7); + fbb.addInt64(0, object.id); + fbb.addOffset(1, quarantineKeyOffset); + fbb.addOffset(2, sourceKeyOffset); + fbb.addOffset(3, recordIdOffset); + fbb.addOffset(4, reasonOffset); + fbb.addInt64(5, object.createdAtMs); + fbb.finish(fbb.endTable()); + return object.id; + }, + objectFromFB: (obx.Store store, ByteData fbData) { + final buffer = fb.BufferContext(fbData); + final rootOffset = buffer.derefObject(0); + final idParam = const fb.Int64Reader().vTableGet( + buffer, + rootOffset, + 4, + 0, + ); + final quarantineKeyParam = const fb.StringReader( + asciiOptimization: true, + ).vTableGet(buffer, rootOffset, 6, ''); + final sourceKeyParam = const fb.StringReader( + asciiOptimization: true, + ).vTableGet(buffer, rootOffset, 8, ''); + final recordIdParam = const fb.StringReader( + asciiOptimization: true, + ).vTableGet(buffer, rootOffset, 10, ''); + final reasonParam = const fb.StringReader( + asciiOptimization: true, + ).vTableGet(buffer, rootOffset, 12, ''); + final createdAtMsParam = const fb.Int64Reader().vTableGet( + buffer, + rootOffset, + 14, + 0, + ); + final object = CloudKitDeletionQuarantineEntity( id: idParam, - displayName: displayNameParam, - phones: phonesParam, - emails: emailsParam, - avatar: avatarParam, - isShared: isSharedParam, - isDismissed: isDismissedParam, - posterPath: posterPathParam) - ..dbStructuredName = const fb.StringReader(asciiOptimization: true) - .vTableGetNullable(buffer, rootOffset, 22); - - return object; - }) + quarantineKey: quarantineKeyParam, + sourceKey: sourceKeyParam, + recordId: recordIdParam, + reason: reasonParam, + createdAtMs: createdAtMsParam, + ); + + return object; + }, + ), }; return obx_int.ModelDefinition(model, bindings); @@ -2140,64 +6038,79 @@ obx_int.ModelDefinition getObjectBoxModel() { /// [Attachment] entity fields to define ObjectBox queries. class Attachment_ { /// See [Attachment.id]. - static final id = - obx.QueryIntegerProperty(_entities[0].properties[0]); + static final id = obx.QueryIntegerProperty( + _entities[0].properties[0], + ); /// See [Attachment.originalROWID]. - static final originalROWID = - obx.QueryIntegerProperty(_entities[0].properties[1]); + static final originalROWID = obx.QueryIntegerProperty( + _entities[0].properties[1], + ); /// See [Attachment.guid]. - static final guid = - obx.QueryStringProperty(_entities[0].properties[2]); + static final guid = obx.QueryStringProperty( + _entities[0].properties[2], + ); /// See [Attachment.uti]. - static final uti = - obx.QueryStringProperty(_entities[0].properties[3]); + static final uti = obx.QueryStringProperty( + _entities[0].properties[3], + ); /// See [Attachment.mimeType]. - static final mimeType = - obx.QueryStringProperty(_entities[0].properties[4]); + static final mimeType = obx.QueryStringProperty( + _entities[0].properties[4], + ); /// See [Attachment.isOutgoing]. - static final isOutgoing = - obx.QueryBooleanProperty(_entities[0].properties[5]); + static final isOutgoing = obx.QueryBooleanProperty( + _entities[0].properties[5], + ); /// See [Attachment.transferName]. - static final transferName = - obx.QueryStringProperty(_entities[0].properties[6]); + static final transferName = obx.QueryStringProperty( + _entities[0].properties[6], + ); /// See [Attachment.totalBytes]. - static final totalBytes = - obx.QueryIntegerProperty(_entities[0].properties[7]); + static final totalBytes = obx.QueryIntegerProperty( + _entities[0].properties[7], + ); /// See [Attachment.height]. - static final height = - obx.QueryIntegerProperty(_entities[0].properties[8]); + static final height = obx.QueryIntegerProperty( + _entities[0].properties[8], + ); /// See [Attachment.width]. - static final width = - obx.QueryIntegerProperty(_entities[0].properties[9]); + static final width = obx.QueryIntegerProperty( + _entities[0].properties[9], + ); /// See [Attachment.webUrl]. - static final webUrl = - obx.QueryStringProperty(_entities[0].properties[10]); + static final webUrl = obx.QueryStringProperty( + _entities[0].properties[10], + ); /// See [Attachment.message]. - static final message = - obx.QueryRelationToOne(_entities[0].properties[11]); + static final message = obx.QueryRelationToOne( + _entities[0].properties[11], + ); /// See [Attachment.dbMetadata]. - static final dbMetadata = - obx.QueryStringProperty(_entities[0].properties[12]); + static final dbMetadata = obx.QueryStringProperty( + _entities[0].properties[12], + ); /// See [Attachment.hasLivePhoto]. - static final hasLivePhoto = - obx.QueryBooleanProperty(_entities[0].properties[13]); + static final hasLivePhoto = obx.QueryBooleanProperty( + _entities[0].properties[13], + ); /// See [Attachment.ckRecordId]. - static final ckRecordId = - obx.QueryStringProperty(_entities[0].properties[14]); + static final ckRecordId = obx.QueryStringProperty( + _entities[0].properties[14], + ); } /// [Chat] entity fields to define ObjectBox queries. @@ -2209,168 +6122,209 @@ class Chat_ { static final guid = obx.QueryStringProperty(_entities[1].properties[1]); /// See [Chat.chatIdentifier]. - static final chatIdentifier = - obx.QueryStringProperty(_entities[1].properties[2]); + static final chatIdentifier = obx.QueryStringProperty( + _entities[1].properties[2], + ); /// See [Chat.isArchived]. - static final isArchived = - obx.QueryBooleanProperty(_entities[1].properties[3]); + static final isArchived = obx.QueryBooleanProperty( + _entities[1].properties[3], + ); /// See [Chat.muteType]. - static final muteType = - obx.QueryStringProperty(_entities[1].properties[4]); + static final muteType = obx.QueryStringProperty( + _entities[1].properties[4], + ); /// See [Chat.muteArgs]. - static final muteArgs = - obx.QueryStringProperty(_entities[1].properties[5]); + static final muteArgs = obx.QueryStringProperty( + _entities[1].properties[5], + ); /// See [Chat.isPinned]. - static final isPinned = - obx.QueryBooleanProperty(_entities[1].properties[6]); + static final isPinned = obx.QueryBooleanProperty( + _entities[1].properties[6], + ); /// See [Chat.hasUnreadMessage]. - static final hasUnreadMessage = - obx.QueryBooleanProperty(_entities[1].properties[7]); + static final hasUnreadMessage = obx.QueryBooleanProperty( + _entities[1].properties[7], + ); /// See [Chat.dbOnlyLatestMessageDate]. - static final dbOnlyLatestMessageDate = - obx.QueryDateProperty(_entities[1].properties[8]); + static final dbOnlyLatestMessageDate = obx.QueryDateProperty( + _entities[1].properties[8], + ); /// See [Chat.title]. - static final title = - obx.QueryStringProperty(_entities[1].properties[9]); + static final title = obx.QueryStringProperty( + _entities[1].properties[9], + ); /// See [Chat.displayName]. - static final displayName = - obx.QueryStringProperty(_entities[1].properties[10]); + static final displayName = obx.QueryStringProperty( + _entities[1].properties[10], + ); /// See [Chat.customAvatarPath]. - static final customAvatarPath = - obx.QueryStringProperty(_entities[1].properties[11]); + static final customAvatarPath = obx.QueryStringProperty( + _entities[1].properties[11], + ); /// See [Chat.pinIndex]. - static final pinIndex = - obx.QueryIntegerProperty(_entities[1].properties[12]); + static final pinIndex = obx.QueryIntegerProperty( + _entities[1].properties[12], + ); /// See [Chat.autoSendReadReceipts]. - static final autoSendReadReceipts = - obx.QueryBooleanProperty(_entities[1].properties[13]); + static final autoSendReadReceipts = obx.QueryBooleanProperty( + _entities[1].properties[13], + ); /// See [Chat.autoSendTypingIndicators]. - static final autoSendTypingIndicators = - obx.QueryBooleanProperty(_entities[1].properties[14]); + static final autoSendTypingIndicators = obx.QueryBooleanProperty( + _entities[1].properties[14], + ); /// See [Chat.textFieldText]. - static final textFieldText = - obx.QueryStringProperty(_entities[1].properties[15]); + static final textFieldText = obx.QueryStringProperty( + _entities[1].properties[15], + ); /// See [Chat.textFieldAttachments]. - static final textFieldAttachments = - obx.QueryStringVectorProperty(_entities[1].properties[16]); + static final textFieldAttachments = obx.QueryStringVectorProperty( + _entities[1].properties[16], + ); /// See [Chat.dateDeleted]. - static final dateDeleted = - obx.QueryDateProperty(_entities[1].properties[17]); + static final dateDeleted = obx.QueryDateProperty( + _entities[1].properties[17], + ); /// See [Chat.style]. - static final style = - obx.QueryIntegerProperty(_entities[1].properties[18]); + static final style = obx.QueryIntegerProperty( + _entities[1].properties[18], + ); /// See [Chat.lockChatName]. - static final lockChatName = - obx.QueryBooleanProperty(_entities[1].properties[19]); + static final lockChatName = obx.QueryBooleanProperty( + _entities[1].properties[19], + ); /// See [Chat.lockChatIcon]. - static final lockChatIcon = - obx.QueryBooleanProperty(_entities[1].properties[20]); + static final lockChatIcon = obx.QueryBooleanProperty( + _entities[1].properties[20], + ); /// See [Chat.lastReadMessageGuid]. - static final lastReadMessageGuid = - obx.QueryStringProperty(_entities[1].properties[21]); + static final lastReadMessageGuid = obx.QueryStringProperty( + _entities[1].properties[21], + ); /// See [Chat.groupVersion]. - static final groupVersion = - obx.QueryIntegerProperty(_entities[1].properties[22]); + static final groupVersion = obx.QueryIntegerProperty( + _entities[1].properties[22], + ); /// See [Chat.usingHandle]. - static final usingHandle = - obx.QueryStringProperty(_entities[1].properties[23]); + static final usingHandle = obx.QueryStringProperty( + _entities[1].properties[23], + ); /// See [Chat.apnTitle]. - static final apnTitle = - obx.QueryStringProperty(_entities[1].properties[24]); + static final apnTitle = obx.QueryStringProperty( + _entities[1].properties[24], + ); /// See [Chat.isRpSms]. - static final isRpSms = - obx.QueryBooleanProperty(_entities[1].properties[25]); + static final isRpSms = obx.QueryBooleanProperty( + _entities[1].properties[25], + ); /// See [Chat.guidRefs]. - static final guidRefs = - obx.QueryStringVectorProperty(_entities[1].properties[26]); + static final guidRefs = obx.QueryStringVectorProperty( + _entities[1].properties[26], + ); /// See [Chat.telephonyId]. - static final telephonyId = - obx.QueryIntegerProperty(_entities[1].properties[27]); + static final telephonyId = obx.QueryIntegerProperty( + _entities[1].properties[27], + ); /// See [Chat.textFieldAnnotations]. - static final textFieldAnnotations = - obx.QueryStringProperty(_entities[1].properties[28]); + static final textFieldAnnotations = obx.QueryStringProperty( + _entities[1].properties[28], + ); /// See [Chat.shareZenMode]. - static final shareZenMode = - obx.QueryBooleanProperty(_entities[1].properties[29]); + static final shareZenMode = obx.QueryBooleanProperty( + _entities[1].properties[29], + ); /// See [Chat.notifsSilenced]. - static final notifsSilenced = - obx.QueryBooleanProperty(_entities[1].properties[30]); + static final notifsSilenced = obx.QueryBooleanProperty( + _entities[1].properties[30], + ); /// See [Chat.dateNotifiedAnyways]. - static final dateNotifiedAnyways = - obx.QueryDateProperty(_entities[1].properties[31]); + static final dateNotifiedAnyways = obx.QueryDateProperty( + _entities[1].properties[31], + ); /// See [Chat.zenModeIsShared]. - static final zenModeIsShared = - obx.QueryIntegerProperty(_entities[1].properties[32]); + static final zenModeIsShared = obx.QueryIntegerProperty( + _entities[1].properties[32], + ); /// See [Chat.senderIsKnown]. - static final senderIsKnown = - obx.QueryBooleanProperty(_entities[1].properties[33]); + static final senderIsKnown = obx.QueryBooleanProperty( + _entities[1].properties[33], + ); /// See [Chat.isRoutingStub]. - static final isRoutingStub = - obx.QueryBooleanProperty(_entities[1].properties[34]); + static final isRoutingStub = obx.QueryBooleanProperty( + _entities[1].properties[34], + ); /// See [Chat.transcriptPosterPath]. - static final transcriptPosterPath = - obx.QueryStringProperty(_entities[1].properties[35]); + static final transcriptPosterPath = obx.QueryStringProperty( + _entities[1].properties[35], + ); /// See [Chat.transcriptBackgroundVersion]. - static final transcriptBackgroundVersion = - obx.QueryIntegerProperty(_entities[1].properties[36]); + static final transcriptBackgroundVersion = obx.QueryIntegerProperty( + _entities[1].properties[36], + ); /// See [Chat.cloudData]. - static final cloudData = - obx.QueryByteVectorProperty(_entities[1].properties[37]); + static final cloudData = obx.QueryByteVectorProperty( + _entities[1].properties[37], + ); /// See [Chat.ckRecordId]. - static final ckRecordId = - obx.QueryStringProperty(_entities[1].properties[38]); + static final ckRecordId = obx.QueryStringProperty( + _entities[1].properties[38], + ); /// See [Chat.ckSyncState]. - static final ckSyncState = - obx.QueryBooleanProperty(_entities[1].properties[39]); + static final ckSyncState = obx.QueryBooleanProperty( + _entities[1].properties[39], + ); /// See [Chat.photoAttachmentGuid]. - static final photoAttachmentGuid = - obx.QueryStringProperty(_entities[1].properties[40]); + static final photoAttachmentGuid = obx.QueryStringProperty( + _entities[1].properties[40], + ); /// See [Chat.cloudGuid]. - static final cloudGuid = - obx.QueryStringProperty(_entities[1].properties[41]); + static final cloudGuid = obx.QueryStringProperty( + _entities[1].properties[41], + ); /// see [Chat.handles] - static final handles = - obx.QueryRelationToMany(_entities[1].relations[0]); + static final handles = obx.QueryRelationToMany( + _entities[1].relations[0], + ); /// see [Chat.messages] static final messages = obx.QueryBacklinkToMany(Message_.chat); @@ -2379,424 +6333,1732 @@ class Chat_ { /// [FCMData] entity fields to define ObjectBox queries. class FCMData_ { /// See [FCMData.id]. - static final id = - obx.QueryIntegerProperty(_entities[2].properties[0]); + static final id = obx.QueryIntegerProperty( + _entities[2].properties[0], + ); /// See [FCMData.projectID]. - static final projectID = - obx.QueryStringProperty(_entities[2].properties[1]); + static final projectID = obx.QueryStringProperty( + _entities[2].properties[1], + ); /// See [FCMData.storageBucket]. - static final storageBucket = - obx.QueryStringProperty(_entities[2].properties[2]); + static final storageBucket = obx.QueryStringProperty( + _entities[2].properties[2], + ); /// See [FCMData.apiKey]. - static final apiKey = - obx.QueryStringProperty(_entities[2].properties[3]); + static final apiKey = obx.QueryStringProperty( + _entities[2].properties[3], + ); /// See [FCMData.firebaseURL]. - static final firebaseURL = - obx.QueryStringProperty(_entities[2].properties[4]); + static final firebaseURL = obx.QueryStringProperty( + _entities[2].properties[4], + ); /// See [FCMData.clientID]. - static final clientID = - obx.QueryStringProperty(_entities[2].properties[5]); + static final clientID = obx.QueryStringProperty( + _entities[2].properties[5], + ); /// See [FCMData.applicationID]. - static final applicationID = - obx.QueryStringProperty(_entities[2].properties[6]); + static final applicationID = obx.QueryStringProperty( + _entities[2].properties[6], + ); } /// [Handle] entity fields to define ObjectBox queries. class Handle_ { /// See [Handle.id]. - static final id = - obx.QueryIntegerProperty(_entities[3].properties[0]); + static final id = obx.QueryIntegerProperty( + _entities[3].properties[0], + ); /// See [Handle.originalROWID]. - static final originalROWID = - obx.QueryIntegerProperty(_entities[3].properties[1]); + static final originalROWID = obx.QueryIntegerProperty( + _entities[3].properties[1], + ); /// See [Handle.address]. - static final address = - obx.QueryStringProperty(_entities[3].properties[2]); + static final address = obx.QueryStringProperty( + _entities[3].properties[2], + ); /// See [Handle.country]. - static final country = - obx.QueryStringProperty(_entities[3].properties[3]); + static final country = obx.QueryStringProperty( + _entities[3].properties[3], + ); /// See [Handle.color]. - static final color = - obx.QueryStringProperty(_entities[3].properties[4]); + static final color = obx.QueryStringProperty( + _entities[3].properties[4], + ); /// See [Handle.defaultPhone]. - static final defaultPhone = - obx.QueryStringProperty(_entities[3].properties[5]); + static final defaultPhone = obx.QueryStringProperty( + _entities[3].properties[5], + ); /// See [Handle.defaultEmail]. - static final defaultEmail = - obx.QueryStringProperty(_entities[3].properties[6]); + static final defaultEmail = obx.QueryStringProperty( + _entities[3].properties[6], + ); /// See [Handle.formattedAddress]. - static final formattedAddress = - obx.QueryStringProperty(_entities[3].properties[7]); + static final formattedAddress = obx.QueryStringProperty( + _entities[3].properties[7], + ); /// See [Handle.contactRelation]. - static final contactRelation = - obx.QueryRelationToOne(_entities[3].properties[8]); + static final contactRelation = obx.QueryRelationToOne( + _entities[3].properties[8], + ); /// See [Handle.uniqueAddressAndService]. - static final uniqueAddressAndService = - obx.QueryStringProperty(_entities[3].properties[9]); + static final uniqueAddressAndService = obx.QueryStringProperty( + _entities[3].properties[9], + ); /// See [Handle.service]. - static final service = - obx.QueryStringProperty(_entities[3].properties[10]); + static final service = obx.QueryStringProperty( + _entities[3].properties[10], + ); /// See [Handle.posterPath]. - static final posterPath = - obx.QueryStringProperty(_entities[3].properties[11]); + static final posterPath = obx.QueryStringProperty( + _entities[3].properties[11], + ); /// See [Handle.blocked]. - static final blocked = - obx.QueryBooleanProperty(_entities[3].properties[12]); + static final blocked = obx.QueryBooleanProperty( + _entities[3].properties[12], + ); } /// [ThemeEntry] entity fields to define ObjectBox queries. class ThemeEntry_ { /// See [ThemeEntry.id]. - static final id = - obx.QueryIntegerProperty(_entities[4].properties[0]); + static final id = obx.QueryIntegerProperty( + _entities[4].properties[0], + ); /// See [ThemeEntry.themeId]. - static final themeId = - obx.QueryIntegerProperty(_entities[4].properties[1]); + static final themeId = obx.QueryIntegerProperty( + _entities[4].properties[1], + ); /// See [ThemeEntry.name]. - static final name = - obx.QueryStringProperty(_entities[4].properties[2]); + static final name = obx.QueryStringProperty( + _entities[4].properties[2], + ); /// See [ThemeEntry.isFont]. - static final isFont = - obx.QueryBooleanProperty(_entities[4].properties[3]); + static final isFont = obx.QueryBooleanProperty( + _entities[4].properties[3], + ); /// See [ThemeEntry.fontSize]. - static final fontSize = - obx.QueryIntegerProperty(_entities[4].properties[4]); + static final fontSize = obx.QueryIntegerProperty( + _entities[4].properties[4], + ); /// See [ThemeEntry.dbColor]. - static final dbColor = - obx.QueryStringProperty(_entities[4].properties[5]); + static final dbColor = obx.QueryStringProperty( + _entities[4].properties[5], + ); /// See [ThemeEntry.fontWeight]. - static final fontWeight = - obx.QueryIntegerProperty(_entities[4].properties[6]); + static final fontWeight = obx.QueryIntegerProperty( + _entities[4].properties[6], + ); /// See [ThemeEntry.themeObject]. static final themeObject = obx.QueryRelationToOne( - _entities[4].properties[7]); + _entities[4].properties[7], + ); } /// [Message] entity fields to define ObjectBox queries. class Message_ { /// See [Message.id]. - static final id = - obx.QueryIntegerProperty(_entities[5].properties[0]); + static final id = obx.QueryIntegerProperty( + _entities[5].properties[0], + ); /// See [Message.originalROWID]. - static final originalROWID = - obx.QueryIntegerProperty(_entities[5].properties[1]); + static final originalROWID = obx.QueryIntegerProperty( + _entities[5].properties[1], + ); /// See [Message.guid]. - static final guid = - obx.QueryStringProperty(_entities[5].properties[2]); + static final guid = obx.QueryStringProperty( + _entities[5].properties[2], + ); /// See [Message.handleId]. - static final handleId = - obx.QueryIntegerProperty(_entities[5].properties[3]); + static final handleId = obx.QueryIntegerProperty( + _entities[5].properties[3], + ); /// See [Message.otherHandle]. - static final otherHandle = - obx.QueryIntegerProperty(_entities[5].properties[4]); + static final otherHandle = obx.QueryIntegerProperty( + _entities[5].properties[4], + ); /// See [Message.text]. - static final text = - obx.QueryStringProperty(_entities[5].properties[5]); + static final text = obx.QueryStringProperty( + _entities[5].properties[5], + ); /// See [Message.subject]. - static final subject = - obx.QueryStringProperty(_entities[5].properties[6]); + static final subject = obx.QueryStringProperty( + _entities[5].properties[6], + ); /// See [Message.country]. - static final country = - obx.QueryStringProperty(_entities[5].properties[7]); + static final country = obx.QueryStringProperty( + _entities[5].properties[7], + ); /// See [Message.dateCreated]. - static final dateCreated = - obx.QueryDateProperty(_entities[5].properties[8]); + static final dateCreated = obx.QueryDateProperty( + _entities[5].properties[8], + ); /// See [Message.dateRead]. - static final dateRead = - obx.QueryDateProperty(_entities[5].properties[9]); + static final dateRead = obx.QueryDateProperty( + _entities[5].properties[9], + ); /// See [Message.dateDelivered]. - static final dateDelivered = - obx.QueryDateProperty(_entities[5].properties[10]); + static final dateDelivered = obx.QueryDateProperty( + _entities[5].properties[10], + ); /// See [Message.isFromMe]. - static final isFromMe = - obx.QueryBooleanProperty(_entities[5].properties[11]); + static final isFromMe = obx.QueryBooleanProperty( + _entities[5].properties[11], + ); /// See [Message.hasDdResults]. - static final hasDdResults = - obx.QueryBooleanProperty(_entities[5].properties[12]); + static final hasDdResults = obx.QueryBooleanProperty( + _entities[5].properties[12], + ); /// See [Message.datePlayed]. - static final datePlayed = - obx.QueryDateProperty(_entities[5].properties[13]); + static final datePlayed = obx.QueryDateProperty( + _entities[5].properties[13], + ); /// See [Message.itemType]. - static final itemType = - obx.QueryIntegerProperty(_entities[5].properties[14]); + static final itemType = obx.QueryIntegerProperty( + _entities[5].properties[14], + ); /// See [Message.groupTitle]. - static final groupTitle = - obx.QueryStringProperty(_entities[5].properties[15]); + static final groupTitle = obx.QueryStringProperty( + _entities[5].properties[15], + ); /// See [Message.groupActionType]. - static final groupActionType = - obx.QueryIntegerProperty(_entities[5].properties[16]); + static final groupActionType = obx.QueryIntegerProperty( + _entities[5].properties[16], + ); /// See [Message.balloonBundleId]. - static final balloonBundleId = - obx.QueryStringProperty(_entities[5].properties[17]); + static final balloonBundleId = obx.QueryStringProperty( + _entities[5].properties[17], + ); /// See [Message.associatedMessageGuid]. - static final associatedMessageGuid = - obx.QueryStringProperty(_entities[5].properties[18]); + static final associatedMessageGuid = obx.QueryStringProperty( + _entities[5].properties[18], + ); /// See [Message.associatedMessageType]. - static final associatedMessageType = - obx.QueryStringProperty(_entities[5].properties[19]); + static final associatedMessageType = obx.QueryStringProperty( + _entities[5].properties[19], + ); /// See [Message.expressiveSendStyleId]. - static final expressiveSendStyleId = - obx.QueryStringProperty(_entities[5].properties[20]); + static final expressiveSendStyleId = obx.QueryStringProperty( + _entities[5].properties[20], + ); /// See [Message.hasAttachments]. - static final hasAttachments = - obx.QueryBooleanProperty(_entities[5].properties[21]); + static final hasAttachments = obx.QueryBooleanProperty( + _entities[5].properties[21], + ); /// See [Message.hasReactions]. - static final hasReactions = - obx.QueryBooleanProperty(_entities[5].properties[22]); + static final hasReactions = obx.QueryBooleanProperty( + _entities[5].properties[22], + ); /// See [Message.dateDeleted]. - static final dateDeleted = - obx.QueryDateProperty(_entities[5].properties[23]); + static final dateDeleted = obx.QueryDateProperty( + _entities[5].properties[23], + ); /// See [Message.threadOriginatorGuid]. - static final threadOriginatorGuid = - obx.QueryStringProperty(_entities[5].properties[24]); + static final threadOriginatorGuid = obx.QueryStringProperty( + _entities[5].properties[24], + ); /// See [Message.threadOriginatorPart]. - static final threadOriginatorPart = - obx.QueryStringProperty(_entities[5].properties[25]); + static final threadOriginatorPart = obx.QueryStringProperty( + _entities[5].properties[25], + ); /// See [Message.bigEmoji]. - static final bigEmoji = - obx.QueryBooleanProperty(_entities[5].properties[26]); + static final bigEmoji = obx.QueryBooleanProperty( + _entities[5].properties[26], + ); /// See [Message.error]. - static final error = - obx.QueryIntegerProperty(_entities[5].properties[27]); + static final error = obx.QueryIntegerProperty( + _entities[5].properties[27], + ); /// See [Message.chat]. - static final chat = - obx.QueryRelationToOne(_entities[5].properties[28]); + static final chat = obx.QueryRelationToOne( + _entities[5].properties[28], + ); /// See [Message.dbAttributedBody]. - static final dbAttributedBody = - obx.QueryStringProperty(_entities[5].properties[29]); + static final dbAttributedBody = obx.QueryStringProperty( + _entities[5].properties[29], + ); /// See [Message.associatedMessagePart]. - static final associatedMessagePart = - obx.QueryIntegerProperty(_entities[5].properties[30]); + static final associatedMessagePart = obx.QueryIntegerProperty( + _entities[5].properties[30], + ); /// See [Message.hasApplePayloadData]. - static final hasApplePayloadData = - obx.QueryBooleanProperty(_entities[5].properties[31]); + static final hasApplePayloadData = obx.QueryBooleanProperty( + _entities[5].properties[31], + ); /// See [Message.dateEdited]. - static final dateEdited = - obx.QueryDateProperty(_entities[5].properties[32]); + static final dateEdited = obx.QueryDateProperty( + _entities[5].properties[32], + ); /// See [Message.dbMessageSummaryInfo]. - static final dbMessageSummaryInfo = - obx.QueryStringProperty(_entities[5].properties[33]); + static final dbMessageSummaryInfo = obx.QueryStringProperty( + _entities[5].properties[33], + ); /// See [Message.dbPayloadData]. - static final dbPayloadData = - obx.QueryStringProperty(_entities[5].properties[34]); + static final dbPayloadData = obx.QueryStringProperty( + _entities[5].properties[34], + ); /// See [Message.dbMetadata]. - static final dbMetadata = - obx.QueryStringProperty(_entities[5].properties[35]); + static final dbMetadata = obx.QueryStringProperty( + _entities[5].properties[35], + ); /// See [Message.wasDeliveredQuietly]. - static final wasDeliveredQuietly = - obx.QueryBooleanProperty(_entities[5].properties[36]); + static final wasDeliveredQuietly = obx.QueryBooleanProperty( + _entities[5].properties[36], + ); /// See [Message.didNotifyRecipient]. - static final didNotifyRecipient = - obx.QueryBooleanProperty(_entities[5].properties[37]); + static final didNotifyRecipient = obx.QueryBooleanProperty( + _entities[5].properties[37], + ); /// See [Message.isBookmarked]. - static final isBookmarked = - obx.QueryBooleanProperty(_entities[5].properties[38]); + static final isBookmarked = obx.QueryBooleanProperty( + _entities[5].properties[38], + ); /// See [Message.hasBeenForwarded]. - static final hasBeenForwarded = - obx.QueryBooleanProperty(_entities[5].properties[39]); + static final hasBeenForwarded = obx.QueryBooleanProperty( + _entities[5].properties[39], + ); /// See [Message.stagingGuid]. - static final stagingGuid = - obx.QueryStringProperty(_entities[5].properties[40]); + static final stagingGuid = obx.QueryStringProperty( + _entities[5].properties[40], + ); /// See [Message.amkSessionId]. - static final amkSessionId = - obx.QueryStringProperty(_entities[5].properties[41]); + static final amkSessionId = obx.QueryStringProperty( + _entities[5].properties[41], + ); /// See [Message.isDelivered]. - static final isDelivered = - obx.QueryBooleanProperty(_entities[5].properties[42]); + static final isDelivered = obx.QueryBooleanProperty( + _entities[5].properties[42], + ); /// See [Message.verificationFailed]. - static final verificationFailed = - obx.QueryBooleanProperty(_entities[5].properties[43]); + static final verificationFailed = obx.QueryBooleanProperty( + _entities[5].properties[43], + ); /// See [Message.sendingServiceId]. - static final sendingServiceId = - obx.QueryStringProperty(_entities[5].properties[44]); + static final sendingServiceId = obx.QueryStringProperty( + _entities[5].properties[44], + ); /// See [Message.associatedMessageEmoji]. - static final associatedMessageEmoji = - obx.QueryStringProperty(_entities[5].properties[45]); + static final associatedMessageEmoji = obx.QueryStringProperty( + _entities[5].properties[45], + ); /// See [Message.dateScheduled]. - static final dateScheduled = - obx.QueryDateProperty(_entities[5].properties[46]); + static final dateScheduled = obx.QueryDateProperty( + _entities[5].properties[46], + ); /// See [Message.ckRecordId]. - static final ckRecordId = - obx.QueryStringProperty(_entities[5].properties[47]); + static final ckRecordId = obx.QueryStringProperty( + _entities[5].properties[47], + ); /// See [Message.ckSyncState]. - static final ckSyncState = - obx.QueryBooleanProperty(_entities[5].properties[48]); + static final ckSyncState = obx.QueryBooleanProperty( + _entities[5].properties[48], + ); /// see [Message.dbAttachments] - static final dbAttachments = - obx.QueryBacklinkToMany(Attachment_.message); + static final dbAttachments = obx.QueryBacklinkToMany( + Attachment_.message, + ); } /// [ThemeObject] entity fields to define ObjectBox queries. class ThemeObject_ { /// See [ThemeObject.id]. - static final id = - obx.QueryIntegerProperty(_entities[6].properties[0]); + static final id = obx.QueryIntegerProperty( + _entities[6].properties[0], + ); /// See [ThemeObject.name]. - static final name = - obx.QueryStringProperty(_entities[6].properties[1]); + static final name = obx.QueryStringProperty( + _entities[6].properties[1], + ); /// See [ThemeObject.selectedLightTheme]. - static final selectedLightTheme = - obx.QueryBooleanProperty(_entities[6].properties[2]); + static final selectedLightTheme = obx.QueryBooleanProperty( + _entities[6].properties[2], + ); /// See [ThemeObject.selectedDarkTheme]. - static final selectedDarkTheme = - obx.QueryBooleanProperty(_entities[6].properties[3]); + static final selectedDarkTheme = obx.QueryBooleanProperty( + _entities[6].properties[3], + ); /// See [ThemeObject.gradientBg]. - static final gradientBg = - obx.QueryBooleanProperty(_entities[6].properties[4]); + static final gradientBg = obx.QueryBooleanProperty( + _entities[6].properties[4], + ); /// See [ThemeObject.previousLightTheme]. - static final previousLightTheme = - obx.QueryBooleanProperty(_entities[6].properties[5]); + static final previousLightTheme = obx.QueryBooleanProperty( + _entities[6].properties[5], + ); /// See [ThemeObject.previousDarkTheme]. - static final previousDarkTheme = - obx.QueryBooleanProperty(_entities[6].properties[6]); + static final previousDarkTheme = obx.QueryBooleanProperty( + _entities[6].properties[6], + ); /// see [ThemeObject.themeEntries] - static final themeEntries = - obx.QueryBacklinkToMany(ThemeEntry_.themeObject); + static final themeEntries = obx.QueryBacklinkToMany( + ThemeEntry_.themeObject, + ); } /// [ThemeStruct] entity fields to define ObjectBox queries. class ThemeStruct_ { /// See [ThemeStruct.id]. - static final id = - obx.QueryIntegerProperty(_entities[7].properties[0]); + static final id = obx.QueryIntegerProperty( + _entities[7].properties[0], + ); /// See [ThemeStruct.name]. - static final name = - obx.QueryStringProperty(_entities[7].properties[1]); + static final name = obx.QueryStringProperty( + _entities[7].properties[1], + ); /// See [ThemeStruct.gradientBg]. - static final gradientBg = - obx.QueryBooleanProperty(_entities[7].properties[2]); + static final gradientBg = obx.QueryBooleanProperty( + _entities[7].properties[2], + ); /// See [ThemeStruct.dbThemeData]. - static final dbThemeData = - obx.QueryStringProperty(_entities[7].properties[3]); + static final dbThemeData = obx.QueryStringProperty( + _entities[7].properties[3], + ); /// See [ThemeStruct.googleFont]. - static final googleFont = - obx.QueryStringProperty(_entities[7].properties[4]); + static final googleFont = obx.QueryStringProperty( + _entities[7].properties[4], + ); } /// [Contact] entity fields to define ObjectBox queries. class Contact_ { /// See [Contact.dbId]. - static final dbId = - obx.QueryIntegerProperty(_entities[8].properties[0]); + static final dbId = obx.QueryIntegerProperty( + _entities[8].properties[0], + ); /// See [Contact.id]. - static final id = - obx.QueryStringProperty(_entities[8].properties[1]); + static final id = obx.QueryStringProperty( + _entities[8].properties[1], + ); /// See [Contact.displayName]. - static final displayName = - obx.QueryStringProperty(_entities[8].properties[2]); + static final displayName = obx.QueryStringProperty( + _entities[8].properties[2], + ); /// See [Contact.phones]. - static final phones = - obx.QueryStringVectorProperty(_entities[8].properties[3]); + static final phones = obx.QueryStringVectorProperty( + _entities[8].properties[3], + ); /// See [Contact.emails]. - static final emails = - obx.QueryStringVectorProperty(_entities[8].properties[4]); + static final emails = obx.QueryStringVectorProperty( + _entities[8].properties[4], + ); /// See [Contact.avatar]. - static final avatar = - obx.QueryByteVectorProperty(_entities[8].properties[5]); + static final avatar = obx.QueryByteVectorProperty( + _entities[8].properties[5], + ); /// See [Contact.dbStructuredName]. - static final dbStructuredName = - obx.QueryStringProperty(_entities[8].properties[6]); + static final dbStructuredName = obx.QueryStringProperty( + _entities[8].properties[6], + ); /// See [Contact.isShared]. - static final isShared = - obx.QueryBooleanProperty(_entities[8].properties[7]); + static final isShared = obx.QueryBooleanProperty( + _entities[8].properties[7], + ); /// See [Contact.isDismissed]. - static final isDismissed = - obx.QueryBooleanProperty(_entities[8].properties[8]); + static final isDismissed = obx.QueryBooleanProperty( + _entities[8].properties[8], + ); /// See [Contact.posterPath]. - static final posterPath = - obx.QueryStringProperty(_entities[8].properties[9]); + static final posterPath = obx.QueryStringProperty( + _entities[8].properties[9], + ); +} + +/// [CloudInboxChangeEntity] entity fields to define ObjectBox queries. +class CloudInboxChangeEntity_ { + /// See [CloudInboxChangeEntity.id]. + static final id = obx.QueryIntegerProperty( + _entities[9].properties[0], + ); + + /// See [CloudInboxChangeEntity.changeKey]. + static final changeKey = obx.QueryStringProperty( + _entities[9].properties[1], + ); + + /// See [CloudInboxChangeEntity.accountFingerprint]. + static final accountFingerprint = + obx.QueryStringProperty( + _entities[9].properties[2], + ); + + /// See [CloudInboxChangeEntity.zone]. + static final zone = obx.QueryStringProperty( + _entities[9].properties[3], + ); + + /// See [CloudInboxChangeEntity.serverRecordIdHash]. + static final serverRecordIdHash = + obx.QueryStringProperty( + _entities[9].properties[4], + ); + + /// See [CloudInboxChangeEntity.etagHash]. + static final etagHash = obx.QueryStringProperty( + _entities[9].properties[5], + ); + + /// See [CloudInboxChangeEntity.changeType]. + static final changeType = obx.QueryStringProperty( + _entities[9].properties[6], + ); + + /// See [CloudInboxChangeEntity.encryptedPayloadRef]. + static final encryptedPayloadRef = + obx.QueryStringProperty( + _entities[9].properties[7], + ); + + /// See [CloudInboxChangeEntity.payloadSha256]. + static final payloadSha256 = obx.QueryStringProperty( + _entities[9].properties[8], + ); + + /// See [CloudInboxChangeEntity.fetchSequence]. + static final fetchSequence = obx.QueryIntegerProperty( + _entities[9].properties[9], + ); + + /// See [CloudInboxChangeEntity.status]. + static final status = obx.QueryIntegerProperty( + _entities[9].properties[10], + ); + + /// See [CloudInboxChangeEntity.isTombstone]. + static final isTombstone = obx.QueryBooleanProperty( + _entities[9].properties[11], + ); + + /// See [CloudInboxChangeEntity.failureCategory]. + static final failureCategory = + obx.QueryStringProperty( + _entities[9].properties[12], + ); + + /// See [CloudInboxChangeEntity.retryCount]. + static final retryCount = obx.QueryIntegerProperty( + _entities[9].properties[13], + ); + + /// See [CloudInboxChangeEntity.createdAtMs]. + static final createdAtMs = obx.QueryIntegerProperty( + _entities[9].properties[14], + ); + + /// See [CloudInboxChangeEntity.updatedAtMs]. + static final updatedAtMs = obx.QueryIntegerProperty( + _entities[9].properties[15], + ); + + /// See [CloudInboxChangeEntity.scopeKey]. + static final scopeKey = obx.QueryStringProperty( + _entities[9].properties[16], + ); + + /// See [CloudInboxChangeEntity.encryptedServerRecordId]. + static final encryptedServerRecordId = + obx.QueryStringProperty( + _entities[9].properties[17], + ); + + /// See [CloudInboxChangeEntity.protectedSystemFieldsRef]. + static final protectedSystemFieldsRef = + obx.QueryStringProperty( + _entities[9].properties[18], + ); + + /// See [CloudInboxChangeEntity.batchId]. + static final batchId = obx.QueryStringProperty( + _entities[9].properties[19], + ); + + /// See [CloudInboxChangeEntity.generation]. + static final generation = obx.QueryIntegerProperty( + _entities[9].properties[20], + ); + + /// See [CloudInboxChangeEntity.nextEligibleAtMs]. + static final nextEligibleAtMs = + obx.QueryIntegerProperty( + _entities[9].properties[21], + ); + + /// See [CloudInboxChangeEntity.serverModifiedAtMs]. + static final serverModifiedAtMs = + obx.QueryIntegerProperty( + _entities[9].properties[22], + ); + + /// See [CloudInboxChangeEntity.completedAtMs]. + static final completedAtMs = obx.QueryIntegerProperty( + _entities[9].properties[23], + ); + + /// See [CloudInboxChangeEntity.changeIdHash]. + static final changeIdHash = obx.QueryStringProperty( + _entities[9].properties[24], + ); +} + +/// [CloudOutboxOperationEntity] entity fields to define ObjectBox queries. +class CloudOutboxOperationEntity_ { + /// See [CloudOutboxOperationEntity.id]. + static final id = obx.QueryIntegerProperty( + _entities[10].properties[0], + ); + + /// See [CloudOutboxOperationEntity.operationId]. + static final operationId = + obx.QueryStringProperty( + _entities[10].properties[1], + ); + + /// See [CloudOutboxOperationEntity.accountFingerprint]. + static final accountFingerprint = + obx.QueryStringProperty( + _entities[10].properties[2], + ); + + /// See [CloudOutboxOperationEntity.zone]. + static final zone = obx.QueryStringProperty( + _entities[10].properties[3], + ); + + /// See [CloudOutboxOperationEntity.logicalEntityKeyHash]. + static final logicalEntityKeyHash = + obx.QueryStringProperty( + _entities[10].properties[4], + ); + + /// See [CloudOutboxOperationEntity.action]. + static final action = obx.QueryIntegerProperty( + _entities[10].properties[5], + ); + + /// See [CloudOutboxOperationEntity.dependencyOperationIdsJson]. + static final dependencyOperationIdsJson = + obx.QueryStringProperty( + _entities[10].properties[6], + ); + + /// See [CloudOutboxOperationEntity.payloadVersion]. + static final payloadVersion = + obx.QueryIntegerProperty( + _entities[10].properties[7], + ); + + /// See [CloudOutboxOperationEntity.encryptedPayloadRef]. + static final encryptedPayloadRef = + obx.QueryStringProperty( + _entities[10].properties[8], + ); + + /// See [CloudOutboxOperationEntity.payloadSha256]. + static final payloadSha256 = + obx.QueryStringProperty( + _entities[10].properties[9], + ); + + /// See [CloudOutboxOperationEntity.state]. + static final state = obx.QueryIntegerProperty( + _entities[10].properties[10], + ); + + /// See [CloudOutboxOperationEntity.attemptCount]. + static final attemptCount = + obx.QueryIntegerProperty( + _entities[10].properties[11], + ); + + /// See [CloudOutboxOperationEntity.nextEligibleAtMs]. + static final nextEligibleAtMs = + obx.QueryIntegerProperty( + _entities[10].properties[12], + ); + + /// See [CloudOutboxOperationEntity.lastErrorCategory]. + static final lastErrorCategory = + obx.QueryStringProperty( + _entities[10].properties[13], + ); + + /// See [CloudOutboxOperationEntity.serverRecordIdHash]. + static final serverRecordIdHash = + obx.QueryStringProperty( + _entities[10].properties[14], + ); + + /// See [CloudOutboxOperationEntity.createdAtMs]. + static final createdAtMs = + obx.QueryIntegerProperty( + _entities[10].properties[15], + ); + + /// See [CloudOutboxOperationEntity.updatedAtMs]. + static final updatedAtMs = + obx.QueryIntegerProperty( + _entities[10].properties[16], + ); + + /// See [CloudOutboxOperationEntity.scopeKey]. + static final scopeKey = obx.QueryStringProperty( + _entities[10].properties[17], + ); + + /// See [CloudOutboxOperationEntity.mutationRevision]. + static final mutationRevision = + obx.QueryIntegerProperty( + _entities[10].properties[18], + ); + + /// See [CloudOutboxOperationEntity.leaseIdHash]. + static final leaseIdHash = + obx.QueryStringProperty( + _entities[10].properties[19], + ); + + /// See [CloudOutboxOperationEntity.leaseExpiresAtMs]. + static final leaseExpiresAtMs = + obx.QueryIntegerProperty( + _entities[10].properties[20], + ); + + /// See [CloudOutboxOperationEntity.confirmedAtMs]. + static final confirmedAtMs = + obx.QueryIntegerProperty( + _entities[10].properties[21], + ); + + /// See [CloudOutboxOperationEntity.checkpointGeneration]. + static final checkpointGeneration = + obx.QueryIntegerProperty( + _entities[10].properties[22], + ); + + /// See [CloudOutboxOperationEntity.appleRequestUuid]. + static final appleRequestUuid = + obx.QueryStringProperty( + _entities[10].properties[23], + ); + + /// See [CloudOutboxOperationEntity.appleOperationUuid]. + static final appleOperationUuid = + obx.QueryStringProperty( + _entities[10].properties[24], + ); + + /// See [CloudOutboxOperationEntity.protectedLeaseReference]. + static final protectedLeaseReference = + obx.QueryStringProperty( + _entities[10].properties[25], + ); +} + +/// [CloudRecordMapEntity] entity fields to define ObjectBox queries. +class CloudRecordMapEntity_ { + /// See [CloudRecordMapEntity.id]. + static final id = obx.QueryIntegerProperty( + _entities[11].properties[0], + ); + + /// See [CloudRecordMapEntity.mapKey]. + static final mapKey = obx.QueryStringProperty( + _entities[11].properties[1], + ); + + /// See [CloudRecordMapEntity.accountFingerprint]. + static final accountFingerprint = + obx.QueryStringProperty( + _entities[11].properties[2], + ); + + /// See [CloudRecordMapEntity.zone]. + static final zone = obx.QueryStringProperty( + _entities[11].properties[3], + ); + + /// See [CloudRecordMapEntity.logicalEntityKeyHash]. + static final logicalEntityKeyHash = + obx.QueryStringProperty( + _entities[11].properties[4], + ); + + /// See [CloudRecordMapEntity.serverRecordIdHash]. + static final serverRecordIdHash = + obx.QueryStringProperty( + _entities[11].properties[5], + ); + + /// See [CloudRecordMapEntity.encryptedServerRecordId]. + static final encryptedServerRecordId = + obx.QueryStringProperty( + _entities[11].properties[6], + ); + + /// See [CloudRecordMapEntity.etagHash]. + static final etagHash = obx.QueryStringProperty( + _entities[11].properties[7], + ); + + /// See [CloudRecordMapEntity.encryptedRawRecordRef]. + static final encryptedRawRecordRef = + obx.QueryStringProperty( + _entities[11].properties[8], + ); + + /// See [CloudRecordMapEntity.updatedAtMs]. + static final updatedAtMs = obx.QueryIntegerProperty( + _entities[11].properties[9], + ); + + /// See [CloudRecordMapEntity.scopeKey]. + static final scopeKey = obx.QueryStringProperty( + _entities[11].properties[10], + ); + + /// See [CloudRecordMapEntity.generation]. + static final generation = obx.QueryIntegerProperty( + _entities[11].properties[11], + ); +} + +/// [CloudSyncCheckpointEntity] entity fields to define ObjectBox queries. +class CloudSyncCheckpointEntity_ { + /// See [CloudSyncCheckpointEntity.id]. + static final id = obx.QueryIntegerProperty( + _entities[12].properties[0], + ); + + /// See [CloudSyncCheckpointEntity.checkpointKey]. + static final checkpointKey = + obx.QueryStringProperty( + _entities[12].properties[1], + ); + + /// See [CloudSyncCheckpointEntity.accountFingerprint]. + static final accountFingerprint = + obx.QueryStringProperty( + _entities[12].properties[2], + ); + + /// See [CloudSyncCheckpointEntity.container]. + static final container = obx.QueryStringProperty( + _entities[12].properties[3], + ); + + /// See [CloudSyncCheckpointEntity.database]. + static final database = obx.QueryStringProperty( + _entities[12].properties[4], + ); + + /// See [CloudSyncCheckpointEntity.zone]. + static final zone = obx.QueryStringProperty( + _entities[12].properties[5], + ); + + /// See [CloudSyncCheckpointEntity.schemaVersion]. + static final schemaVersion = + obx.QueryIntegerProperty( + _entities[12].properties[6], + ); + + /// See [CloudSyncCheckpointEntity.fetchedTokenCiphertext]. + static final fetchedTokenCiphertext = + obx.QueryStringProperty( + _entities[12].properties[7], + ); + + /// See [CloudSyncCheckpointEntity.fetchedSequence]. + static final fetchedSequence = + obx.QueryIntegerProperty( + _entities[12].properties[8], + ); + + /// See [CloudSyncCheckpointEntity.appliedSequence]. + static final appliedSequence = + obx.QueryIntegerProperty( + _entities[12].properties[9], + ); + + /// See [CloudSyncCheckpointEntity.lastSuccessfulAtMs]. + static final lastSuccessfulAtMs = + obx.QueryIntegerProperty( + _entities[12].properties[10], + ); + + /// See [CloudSyncCheckpointEntity.lastAttemptAtMs]. + static final lastAttemptAtMs = + obx.QueryIntegerProperty( + _entities[12].properties[11], + ); + + /// See [CloudSyncCheckpointEntity.lastErrorCategory]. + static final lastErrorCategory = + obx.QueryStringProperty( + _entities[12].properties[12], + ); + + /// See [CloudSyncCheckpointEntity.backoffAttempt]. + static final backoffAttempt = + obx.QueryIntegerProperty( + _entities[12].properties[13], + ); + + /// See [CloudSyncCheckpointEntity.nextEligibleAtMs]. + static final nextEligibleAtMs = + obx.QueryIntegerProperty( + _entities[12].properties[14], + ); + + /// See [CloudSyncCheckpointEntity.updatedAtMs]. + static final updatedAtMs = + obx.QueryIntegerProperty( + _entities[12].properties[15], + ); + + /// See [CloudSyncCheckpointEntity.streamKind]. + static final streamKind = obx.QueryStringProperty( + _entities[12].properties[16], + ); + + /// See [CloudSyncCheckpointEntity.generation]. + static final generation = obx.QueryIntegerProperty( + _entities[12].properties[17], + ); + + /// See [CloudSyncCheckpointEntity.lastBatchId]. + static final lastBatchId = obx.QueryStringProperty( + _entities[12].properties[18], + ); + + /// See [CloudSyncCheckpointEntity.mutationRevisionCounter]. + static final mutationRevisionCounter = + obx.QueryIntegerProperty( + _entities[12].properties[19], + ); +} + +/// [CloudSyncRunEntity] entity fields to define ObjectBox queries. +class CloudSyncRunEntity_ { + /// See [CloudSyncRunEntity.id]. + static final id = obx.QueryIntegerProperty( + _entities[13].properties[0], + ); + + /// See [CloudSyncRunEntity.runId]. + static final runId = obx.QueryStringProperty( + _entities[13].properties[1], + ); + + /// See [CloudSyncRunEntity.accountFingerprint]. + static final accountFingerprint = obx.QueryStringProperty( + _entities[13].properties[2], + ); + + /// See [CloudSyncRunEntity.trigger]. + static final trigger = obx.QueryStringProperty( + _entities[13].properties[3], + ); + + /// See [CloudSyncRunEntity.architecture]. + static final architecture = obx.QueryStringProperty( + _entities[13].properties[4], + ); + + /// See [CloudSyncRunEntity.mode]. + static final mode = obx.QueryStringProperty( + _entities[13].properties[5], + ); + + /// See [CloudSyncRunEntity.fetchedCount]. + static final fetchedCount = obx.QueryIntegerProperty( + _entities[13].properties[6], + ); + + /// See [CloudSyncRunEntity.appliedCount]. + static final appliedCount = obx.QueryIntegerProperty( + _entities[13].properties[7], + ); + + /// See [CloudSyncRunEntity.quarantinedCount]. + static final quarantinedCount = obx.QueryIntegerProperty( + _entities[13].properties[8], + ); + + /// See [CloudSyncRunEntity.confirmedCount]. + static final confirmedCount = obx.QueryIntegerProperty( + _entities[13].properties[9], + ); + + /// See [CloudSyncRunEntity.retriedCount]. + static final retriedCount = obx.QueryIntegerProperty( + _entities[13].properties[10], + ); + + /// See [CloudSyncRunEntity.startedAtMs]. + static final startedAtMs = obx.QueryIntegerProperty( + _entities[13].properties[11], + ); + + /// See [CloudSyncRunEntity.finishedAtMs]. + static final finishedAtMs = obx.QueryIntegerProperty( + _entities[13].properties[12], + ); + + /// See [CloudSyncRunEntity.failureCategory]. + static final failureCategory = obx.QueryStringProperty( + _entities[13].properties[13], + ); + + /// See [CloudSyncRunEntity.scopeKey]. + static final scopeKey = obx.QueryStringProperty( + _entities[13].properties[14], + ); + + /// See [CloudSyncRunEntity.deferredCount]. + static final deferredCount = obx.QueryIntegerProperty( + _entities[13].properties[15], + ); +} + +/// [CloudSyncLeaseEntity] entity fields to define ObjectBox queries. +class CloudSyncLeaseEntity_ { + /// See [CloudSyncLeaseEntity.id]. + static final id = obx.QueryIntegerProperty( + _entities[14].properties[0], + ); + + /// See [CloudSyncLeaseEntity.leaseKey]. + static final leaseKey = obx.QueryStringProperty( + _entities[14].properties[1], + ); + + /// See [CloudSyncLeaseEntity.scopeKey]. + static final scopeKey = obx.QueryStringProperty( + _entities[14].properties[2], + ); + + /// See [CloudSyncLeaseEntity.accountFingerprint]. + static final accountFingerprint = + obx.QueryStringProperty( + _entities[14].properties[3], + ); + + /// See [CloudSyncLeaseEntity.ownerIdHash]. + static final ownerIdHash = obx.QueryStringProperty( + _entities[14].properties[4], + ); + + /// See [CloudSyncLeaseEntity.generation]. + static final generation = obx.QueryIntegerProperty( + _entities[14].properties[5], + ); + + /// See [CloudSyncLeaseEntity.acquiredAtMs]. + static final acquiredAtMs = obx.QueryIntegerProperty( + _entities[14].properties[6], + ); + + /// See [CloudSyncLeaseEntity.expiresAtMs]. + static final expiresAtMs = obx.QueryIntegerProperty( + _entities[14].properties[7], + ); +} + +/// [CloudAttachmentMaterializationEntity] entity fields to define ObjectBox queries. +class CloudAttachmentMaterializationEntity_ { + /// See [CloudAttachmentMaterializationEntity.id]. + static final id = + obx.QueryIntegerProperty( + _entities[15].properties[0], + ); + + /// See [CloudAttachmentMaterializationEntity.transferKey]. + static final transferKey = + obx.QueryStringProperty( + _entities[15].properties[1], + ); + + /// See [CloudAttachmentMaterializationEntity.scopeKey]. + static final scopeKey = + obx.QueryStringProperty( + _entities[15].properties[2], + ); + + /// See [CloudAttachmentMaterializationEntity.accountFingerprint]. + static final accountFingerprint = + obx.QueryStringProperty( + _entities[15].properties[3], + ); + + /// See [CloudAttachmentMaterializationEntity.zone]. + static final zone = + obx.QueryStringProperty( + _entities[15].properties[4], + ); + + /// See [CloudAttachmentMaterializationEntity.generation]. + static final generation = + obx.QueryIntegerProperty( + _entities[15].properties[5], + ); + + /// See [CloudAttachmentMaterializationEntity.logicalEntityKeyHash]. + static final logicalEntityKeyHash = + obx.QueryStringProperty( + _entities[15].properties[6], + ); + + /// See [CloudAttachmentMaterializationEntity.expectedBytes]. + static final expectedBytes = + obx.QueryIntegerProperty( + _entities[15].properties[7], + ); + + /// See [CloudAttachmentMaterializationEntity.expectedIntegrityTagHash]. + static final expectedIntegrityTagHash = + obx.QueryStringProperty( + _entities[15].properties[8], + ); + + /// See [CloudAttachmentMaterializationEntity.stage]. + static final stage = + obx.QueryIntegerProperty( + _entities[15].properties[9], + ); + + /// See [CloudAttachmentMaterializationEntity.verifiedBytes]. + static final verifiedBytes = + obx.QueryIntegerProperty( + _entities[15].properties[10], + ); + + /// See [CloudAttachmentMaterializationEntity.protectedTempReference]. + static final protectedTempReference = + obx.QueryStringProperty( + _entities[15].properties[11], + ); + + /// See [CloudAttachmentMaterializationEntity.protectedResumeManifestReference]. + static final protectedResumeManifestReference = + obx.QueryStringProperty( + _entities[15].properties[12], + ); + + /// See [CloudAttachmentMaterializationEntity.protectedContentVerificationReference]. + static final protectedContentVerificationReference = + obx.QueryStringProperty( + _entities[15].properties[13], + ); + + /// See [CloudAttachmentMaterializationEntity.protectedFinalReference]. + static final protectedFinalReference = + obx.QueryStringProperty( + _entities[15].properties[14], + ); + + /// See [CloudAttachmentMaterializationEntity.updatedAtMs]. + static final updatedAtMs = + obx.QueryIntegerProperty( + _entities[15].properties[15], + ); +} + +/// [CloudSemanticReplayEntity] entity fields to define ObjectBox queries. +class CloudSemanticReplayEntity_ { + /// See [CloudSemanticReplayEntity.id]. + static final id = obx.QueryIntegerProperty( + _entities[16].properties[0], + ); + + /// See [CloudSemanticReplayEntity.replayKey]. + static final replayKey = obx.QueryStringProperty( + _entities[16].properties[1], + ); + + /// See [CloudSemanticReplayEntity.scopeGenerationKey]. + static final scopeGenerationKey = + obx.QueryStringProperty( + _entities[16].properties[2], + ); + + /// See [CloudSemanticReplayEntity.scopeKey]. + static final scopeKey = obx.QueryStringProperty( + _entities[16].properties[3], + ); + + /// See [CloudSemanticReplayEntity.accountFingerprint]. + static final accountFingerprint = + obx.QueryStringProperty( + _entities[16].properties[4], + ); + + /// See [CloudSemanticReplayEntity.container]. + static final container = obx.QueryStringProperty( + _entities[16].properties[5], + ); + + /// See [CloudSemanticReplayEntity.database]. + static final database = obx.QueryStringProperty( + _entities[16].properties[6], + ); + + /// See [CloudSemanticReplayEntity.zone]. + static final zone = obx.QueryStringProperty( + _entities[16].properties[7], + ); + + /// See [CloudSemanticReplayEntity.streamKind]. + static final streamKind = obx.QueryStringProperty( + _entities[16].properties[8], + ); + + /// See [CloudSemanticReplayEntity.schemaVersion]. + static final schemaVersion = + obx.QueryIntegerProperty( + _entities[16].properties[9], + ); + + /// See [CloudSemanticReplayEntity.generation]. + static final generation = obx.QueryIntegerProperty( + _entities[16].properties[10], + ); + + /// See [CloudSemanticReplayEntity.changeIdHash]. + static final changeIdHash = + obx.QueryStringProperty( + _entities[16].properties[11], + ); + + /// See [CloudSemanticReplayEntity.updatedAtMs]. + static final updatedAtMs = + obx.QueryIntegerProperty( + _entities[16].properties[12], + ); + + /// See [CloudSemanticReplayEntity.serverRecordIdHash]. + static final serverRecordIdHash = + obx.QueryStringProperty( + _entities[16].properties[13], + ); + + /// See [CloudSemanticReplayEntity.logicalEntityKeyHash]. + static final logicalEntityKeyHash = + obx.QueryStringProperty( + _entities[16].properties[14], + ); + + /// See [CloudSemanticReplayEntity.payloadSha256]. + static final payloadSha256 = + obx.QueryStringProperty( + _entities[16].properties[15], + ); + + /// See [CloudSemanticReplayEntity.protectedPayloadReferenceHash]. + static final protectedPayloadReferenceHash = + obx.QueryStringProperty( + _entities[16].properties[16], + ); + + /// See [CloudSemanticReplayEntity.inboxSequence]. + static final inboxSequence = + obx.QueryIntegerProperty( + _entities[16].properties[17], + ); + + /// See [CloudSemanticReplayEntity.changeType]. + static final changeType = obx.QueryStringProperty( + _entities[16].properties[18], + ); + + /// See [CloudSemanticReplayEntity.terminalOutcome]. + static final terminalOutcome = + obx.QueryStringProperty( + _entities[16].properties[19], + ); + + /// See [CloudSemanticReplayEntity.terminalSafeCode]. + static final terminalSafeCode = + obx.QueryStringProperty( + _entities[16].properties[20], + ); +} + +/// [CloudSemanticSnapshotEntity] entity fields to define ObjectBox queries. +class CloudSemanticSnapshotEntity_ { + /// See [CloudSemanticSnapshotEntity.id]. + static final id = obx.QueryIntegerProperty( + _entities[17].properties[0], + ); + + /// See [CloudSemanticSnapshotEntity.snapshotKey]. + static final snapshotKey = + obx.QueryStringProperty( + _entities[17].properties[1], + ); + + /// See [CloudSemanticSnapshotEntity.scopeGenerationKey]. + static final scopeGenerationKey = + obx.QueryStringProperty( + _entities[17].properties[2], + ); + + /// See [CloudSemanticSnapshotEntity.scopeKey]. + static final scopeKey = obx.QueryStringProperty( + _entities[17].properties[3], + ); + + /// See [CloudSemanticSnapshotEntity.accountFingerprint]. + static final accountFingerprint = + obx.QueryStringProperty( + _entities[17].properties[4], + ); + + /// See [CloudSemanticSnapshotEntity.container]. + static final container = obx.QueryStringProperty( + _entities[17].properties[5], + ); + + /// See [CloudSemanticSnapshotEntity.database]. + static final database = obx.QueryStringProperty( + _entities[17].properties[6], + ); + + /// See [CloudSemanticSnapshotEntity.zone]. + static final zone = obx.QueryStringProperty( + _entities[17].properties[7], + ); + + /// See [CloudSemanticSnapshotEntity.streamKind]. + static final streamKind = + obx.QueryStringProperty( + _entities[17].properties[8], + ); + + /// See [CloudSemanticSnapshotEntity.schemaVersion]. + static final schemaVersion = + obx.QueryIntegerProperty( + _entities[17].properties[9], + ); + + /// See [CloudSemanticSnapshotEntity.generation]. + static final generation = + obx.QueryIntegerProperty( + _entities[17].properties[10], + ); + + /// See [CloudSemanticSnapshotEntity.entityKind]. + static final entityKind = + obx.QueryStringProperty( + _entities[17].properties[11], + ); + + /// See [CloudSemanticSnapshotEntity.logicalEntityKeyHash]. + static final logicalEntityKeyHash = + obx.QueryStringProperty( + _entities[17].properties[12], + ); + + /// See [CloudSemanticSnapshotEntity.parentLogicalKeyHash]. + static final parentLogicalKeyHash = + obx.QueryStringProperty( + _entities[17].properties[13], + ); + + /// See [CloudSemanticSnapshotEntity.immutableContentDigest]. + static final immutableContentDigest = + obx.QueryStringProperty( + _entities[17].properties[14], + ); + + /// See [CloudSemanticSnapshotEntity.createdAtMs]. + static final createdAtMs = + obx.QueryIntegerProperty( + _entities[17].properties[15], + ); + + /// See [CloudSemanticSnapshotEntity.readAtMs]. + static final readAtMs = obx.QueryIntegerProperty( + _entities[17].properties[16], + ); + + /// See [CloudSemanticSnapshotEntity.deliveredAtMs]. + static final deliveredAtMs = + obx.QueryIntegerProperty( + _entities[17].properties[17], + ); + + /// See [CloudSemanticSnapshotEntity.editPartsJson]. + static final editPartsJson = + obx.QueryStringProperty( + _entities[17].properties[18], + ); + + /// See [CloudSemanticSnapshotEntity.retractedAtMs]. + static final retractedAtMs = + obx.QueryIntegerProperty( + _entities[17].properties[19], + ); + + /// See [CloudSemanticSnapshotEntity.groupVersion]. + static final groupVersion = + obx.QueryIntegerProperty( + _entities[17].properties[20], + ); + + /// See [CloudSemanticSnapshotEntity.groupMetadataDigest]. + static final groupMetadataDigest = + obx.QueryStringProperty( + _entities[17].properties[21], + ); + + /// See [CloudSemanticSnapshotEntity.etagHash]. + static final etagHash = obx.QueryStringProperty( + _entities[17].properties[22], + ); + + /// See [CloudSemanticSnapshotEntity.updatedAtMs]. + static final updatedAtMs = + obx.QueryIntegerProperty( + _entities[17].properties[23], + ); +} + +/// [CloudProtectedPageLeaseEntity] entity fields to define ObjectBox queries. +class CloudProtectedPageLeaseEntity_ { + /// See [CloudProtectedPageLeaseEntity.id]. + static final id = obx.QueryIntegerProperty( + _entities[18].properties[0], + ); + + /// See [CloudProtectedPageLeaseEntity.leaseReference]. + static final leaseReference = + obx.QueryStringProperty( + _entities[18].properties[1], + ); + + /// See [CloudProtectedPageLeaseEntity.scopeKey]. + static final scopeKey = + obx.QueryStringProperty( + _entities[18].properties[2], + ); + + /// See [CloudProtectedPageLeaseEntity.accountFingerprint]. + static final accountFingerprint = + obx.QueryStringProperty( + _entities[18].properties[3], + ); + + /// See [CloudProtectedPageLeaseEntity.generation]. + static final generation = + obx.QueryIntegerProperty( + _entities[18].properties[4], + ); + + /// See [CloudProtectedPageLeaseEntity.batchIdHash]. + static final batchIdHash = + obx.QueryStringProperty( + _entities[18].properties[5], + ); + + /// See [CloudProtectedPageLeaseEntity.adoptedAtMs]. + static final adoptedAtMs = + obx.QueryIntegerProperty( + _entities[18].properties[6], + ); + + /// See [CloudProtectedPageLeaseEntity.finalizeAttemptCount]. + static final finalizeAttemptCount = + obx.QueryIntegerProperty( + _entities[18].properties[7], + ); + + /// See [CloudProtectedPageLeaseEntity.nextFinalizeEligibleAtMs]. + static final nextFinalizeEligibleAtMs = + obx.QueryIntegerProperty( + _entities[18].properties[8], + ); +} + +/// [CloudKitWriterAuthorityEntity] entity fields to define ObjectBox queries. +class CloudKitWriterAuthorityEntity_ { + /// See [CloudKitWriterAuthorityEntity.id]. + static final id = obx.QueryIntegerProperty( + _entities[19].properties[0], + ); + + /// See [CloudKitWriterAuthorityEntity.authorityKey]. + static final authorityKey = + obx.QueryStringProperty( + _entities[19].properties[1], + ); + + /// See [CloudKitWriterAuthorityEntity.accountFingerprint]. + static final accountFingerprint = + obx.QueryStringProperty( + _entities[19].properties[2], + ); + + /// See [CloudKitWriterAuthorityEntity.container]. + static final container = + obx.QueryStringProperty( + _entities[19].properties[3], + ); + + /// See [CloudKitWriterAuthorityEntity.database]. + static final database = + obx.QueryStringProperty( + _entities[19].properties[4], + ); + + /// See [CloudKitWriterAuthorityEntity.owner]. + static final owner = obx.QueryIntegerProperty( + _entities[19].properties[5], + ); + + /// See [CloudKitWriterAuthorityEntity.state]. + static final state = obx.QueryIntegerProperty( + _entities[19].properties[6], + ); + + /// See [CloudKitWriterAuthorityEntity.targetOwner]. + static final targetOwner = + obx.QueryIntegerProperty( + _entities[19].properties[7], + ); + + /// See [CloudKitWriterAuthorityEntity.epoch]. + static final epoch = obx.QueryIntegerProperty( + _entities[19].properties[8], + ); + + /// See [CloudKitWriterAuthorityEntity.updatedAtMs]. + static final updatedAtMs = + obx.QueryIntegerProperty( + _entities[19].properties[9], + ); + + /// See [CloudKitWriterAuthorityEntity.transitionIdHash]. + static final transitionIdHash = + obx.QueryStringProperty( + _entities[19].properties[10], + ); + + /// See [CloudKitWriterAuthorityEntity.resetScopeKeyHash]. + static final resetScopeKeyHash = + obx.QueryStringProperty( + _entities[19].properties[11], + ); + + /// See [CloudKitWriterAuthorityEntity.resetGeneration]. + static final resetGeneration = + obx.QueryIntegerProperty( + _entities[19].properties[12], + ); + + /// See [CloudKitWriterAuthorityEntity.resetProofReferenceHash]. + static final resetProofReferenceHash = + obx.QueryStringProperty( + _entities[19].properties[13], + ); +} + +/// [CloudKitDeletionIntentEntity] entity fields to define ObjectBox queries. +class CloudKitDeletionIntentEntity_ { + /// See [CloudKitDeletionIntentEntity.id]. + static final id = obx.QueryIntegerProperty( + _entities[20].properties[0], + ); + + /// See [CloudKitDeletionIntentEntity.intentKey]. + static final intentKey = + obx.QueryStringProperty( + _entities[20].properties[1], + ); + + /// See [CloudKitDeletionIntentEntity.accountFingerprint]. + static final accountFingerprint = + obx.QueryStringProperty( + _entities[20].properties[2], + ); + + /// See [CloudKitDeletionIntentEntity.container]. + static final container = + obx.QueryStringProperty( + _entities[20].properties[3], + ); + + /// See [CloudKitDeletionIntentEntity.database]. + static final database = obx.QueryStringProperty( + _entities[20].properties[4], + ); + + /// See [CloudKitDeletionIntentEntity.writerEpoch]. + static final writerEpoch = + obx.QueryIntegerProperty( + _entities[20].properties[5], + ); + + /// See [CloudKitDeletionIntentEntity.kind]. + static final kind = obx.QueryIntegerProperty( + _entities[20].properties[6], + ); + + /// See [CloudKitDeletionIntentEntity.recordId]. + static final recordId = obx.QueryStringProperty( + _entities[20].properties[7], + ); + + /// See [CloudKitDeletionIntentEntity.state]. + static final state = obx.QueryIntegerProperty( + _entities[20].properties[8], + ); + + /// See [CloudKitDeletionIntentEntity.quarantineReason]. + static final quarantineReason = + obx.QueryStringProperty( + _entities[20].properties[9], + ); + + /// See [CloudKitDeletionIntentEntity.createdAtMs]. + static final createdAtMs = + obx.QueryIntegerProperty( + _entities[20].properties[10], + ); + + /// See [CloudKitDeletionIntentEntity.updatedAtMs]. + static final updatedAtMs = + obx.QueryIntegerProperty( + _entities[20].properties[11], + ); +} + +/// [CloudKitDeletionQuarantineEntity] entity fields to define ObjectBox queries. +class CloudKitDeletionQuarantineEntity_ { + /// See [CloudKitDeletionQuarantineEntity.id]. + static final id = obx.QueryIntegerProperty( + _entities[21].properties[0], + ); + + /// See [CloudKitDeletionQuarantineEntity.quarantineKey]. + static final quarantineKey = + obx.QueryStringProperty( + _entities[21].properties[1], + ); + + /// See [CloudKitDeletionQuarantineEntity.sourceKey]. + static final sourceKey = + obx.QueryStringProperty( + _entities[21].properties[2], + ); + + /// See [CloudKitDeletionQuarantineEntity.recordId]. + static final recordId = + obx.QueryStringProperty( + _entities[21].properties[3], + ); + + /// See [CloudKitDeletionQuarantineEntity.reason]. + static final reason = + obx.QueryStringProperty( + _entities[21].properties[4], + ); + + /// See [CloudKitDeletionQuarantineEntity.createdAtMs]. + static final createdAtMs = + obx.QueryIntegerProperty( + _entities[21].properties[5], + ); } diff --git a/lib/services/backend/action_handler.dart b/lib/services/backend/action_handler.dart index 15d3498a7f..66228c0b67 100644 --- a/lib/services/backend/action_handler.dart +++ b/lib/services/backend/action_handler.dart @@ -26,10 +26,13 @@ import 'package:tuple/tuple.dart'; import 'package:universal_io/io.dart'; import 'package:bluebubbles/src/rust/api/api.dart' as api; -ActionHandler ah = Get.isRegistered() ? Get.find() : Get.put(ActionHandler()); +ActionHandler ah = Get.isRegistered() + ? Get.find() + : Get.put(ActionHandler()); class ActionHandler extends GetxService { - final RxList> attachmentProgress = >[].obs; + final RxList> attachmentProgress = + >[].obs; final List outOfOrderTempGuids = []; final List handledNewMessages = []; final Map> _inFlightNewMessages = {}; @@ -37,11 +40,13 @@ class ActionHandler extends GetxService { Future _notifyNewMessageBestEffort(Message message, Chat chat) async { try { - await MessageHelper.handleNotification(message, chat, findExisting: false); + await MessageHelper.handleNotification(message, chat, + findExisting: false); } catch (_, stack) { // Notification rendering must never prevent a message from being kept. // Do not include the message or sender in diagnostics. - Logger.warn("Incoming message notification failed after persistence", tag: "Notification", trace: stack); + Logger.warn("Incoming message notification failed after persistence", + tag: "Notification", trace: stack); } } @@ -57,13 +62,24 @@ class ActionHandler extends GetxService { return true; } - - Future> prepMessage(Chat c, Message m, Message? selected, String? r, {bool clearNotificationsIfFromMe = true}) async { - if ((m.text?.isEmpty ?? true) && (m.subject?.isEmpty ?? true) && r == null && m.payloadData == null) return []; + + Future> prepMessage( + Chat c, Message m, Message? selected, String? r, + {bool clearNotificationsIfFromMe = true}) async { + if ((m.text?.isEmpty ?? true) && + (m.subject?.isEmpty ?? true) && + r == null && + m.payloadData == null) return []; final List messages = []; - if (!(await ss.isMinBigSur) && r == null) { + // This workaround belongs only to the legacy Mac-server path. Modern + // composers always provide an attributed body; changing only Message.text + // would leave its ranges inconsistent and can make queue preparation fail. + if (backend is! RustPushBackend && + !(await ss.isMinBigSur) && + r == null && + m.attributedBody.isEmpty) { // Split URL messages on OS X to prevent message matching glitches String mainText = m.text!; String? secondaryText; @@ -94,35 +110,46 @@ class ActionHandler extends GetxService { for (Message message in messages) { message.generateTempGuid(); - await c.addMessage(message, clearNotificationsIfFromMe: clearNotificationsIfFromMe); + await c.addMessage(message, + clearNotificationsIfFromMe: clearNotificationsIfFromMe); } } else { m.generateTempGuid(); - await c.addMessage(m, clearNotificationsIfFromMe: clearNotificationsIfFromMe); + await c.addMessage(m, + clearNotificationsIfFromMe: clearNotificationsIfFromMe); messages.add(m); } return messages; } - Future matchMessageWithExisting(Chat chat, String existingGuid, Message replacement, {Message? existing}) async { + Future matchMessageWithExisting( + Chat chat, String existingGuid, Message replacement, + {Message? existing}) async { // First, try to find a matching message with the replacement's GUID. // We check this first because if an event came in for that GUID, we should be able to ignore // the API response. final existingReplacementMessage = Message.findOne(guid: replacement.guid); if (existingReplacementMessage != null) { - Logger.debug("Found existing message with GUID ${replacement.guid}...", tag: "MessageStatus"); + Logger.debug("Found existing message with GUID ${replacement.guid}...", + tag: "MessageStatus"); // if we are the source of truth (eg there is no remote omniscient DB) partial updates are good and intended. Always do them. - if (backend.getRemoteService() == null || replacement.isNewerThan(existingReplacementMessage)) { - Logger.debug("Replacing existing message with newer message (GUID: ${replacement.guid})...", tag: "MessageStatus"); + if (backend.getRemoteService() == null || + replacement.isNewerThan(existingReplacementMessage)) { + Logger.debug( + "Replacing existing message with newer message (GUID: ${replacement.guid})...", + tag: "MessageStatus"); await Message.replaceMessage(replacement.guid, replacement); } else { - Logger.debug("Existing message with GUID ${replacement.guid} is newer than the replacement...", tag: "MessageStatus"); + Logger.debug( + "Existing message with GUID ${replacement.guid} is newer than the replacement...", + tag: "MessageStatus"); } - + // Delete the temp message if it exists if (existingGuid != replacement.guid) { - Logger.debug("Deleting temp message with GUID $existingGuid...", tag: "MessageStatus"); + Logger.debug("Deleting temp message with GUID $existingGuid...", + tag: "MessageStatus"); final existingTempMessage = Message.findOne(guid: existingGuid); if (existingTempMessage != null) { Message.delete(existingTempMessage.guid!); @@ -134,26 +161,36 @@ class ActionHandler extends GetxService { } else { try { // If we didn't find a matching message with the replacement's GUID, replace the existing message. - Logger.debug("Replacing message with GUID $existingGuid with ${replacement.guid}...", tag: "MessageStatus"); - await Message.replaceMessage(existingGuid, replacement); + Logger.debug( + "Replacing message with GUID $existingGuid with ${replacement.guid}...", + tag: "MessageStatus"); + await Message.replaceMessage(existingGuid, replacement); } catch (ex) { - Logger.warn("Unable to find & replace message with GUID $existingGuid...", tag: "MessageStatus", error: ex); + Logger.warn( + "Unable to find & replace message with GUID $existingGuid...", + tag: "MessageStatus", + error: ex); } } } - Future matchAttachmentWithExisting(Chat chat, String existingGuid, Attachment replacement, {Attachment? existing}) async { + Future matchAttachmentWithExisting( + Chat chat, String existingGuid, Attachment replacement, + {Attachment? existing}) async { // First, try to find a matching message with the replacement's GUID. // We check this first because if an event came in for that GUID, we should be able to ignore // the API response. final existingReplacementMessage = Attachment.findOne(replacement.guid!); if (existingReplacementMessage != null) { - Logger.debug("Replacing existing attachment with GUID ${replacement.guid}...", tag: "AttachmentStatus"); + Logger.debug( + "Replacing existing attachment with GUID ${replacement.guid}...", + tag: "AttachmentStatus"); await Attachment.replaceAttachment(replacement.guid, replacement); - + // Delete the temp message if it exists if (existingGuid != replacement.guid) { - Logger.debug("Deleting temp attachment with GUID $existingGuid...", tag: "AttachmentStatus"); + Logger.debug("Deleting temp attachment with GUID $existingGuid...", + tag: "AttachmentStatus"); final existingTempMessage = Attachment.findOne(existingGuid); if (existingTempMessage != null) { Attachment.delete(existingTempMessage.guid!); @@ -161,23 +198,35 @@ class ActionHandler extends GetxService { } } else { try { - Logger.debug("Replacing original attachment with GUID $existingGuid with ${replacement.guid}...", tag: "AttachmentStatus"); + Logger.debug( + "Replacing original attachment with GUID $existingGuid with ${replacement.guid}...", + tag: "AttachmentStatus"); await Attachment.replaceAttachment(existingGuid, replacement); } catch (ex) { - Logger.warn("Unable to find & replace attachment with GUID $existingGuid...", error: ex, tag: "AttachmentStatus"); + Logger.warn( + "Unable to find & replace attachment with GUID $existingGuid...", + error: ex, + tag: "AttachmentStatus"); } } } - Future sendMessage(Chat c, Message m, Message? selected, String? r) async { + Future sendMessage( + Chat c, Message m, Message? selected, String? r) async { final completer = Completer(); if (r == null) { // timeout here, don't timeout attachments, because attachments can go on forever - backend.sendMessage(c, m).timeout(const Duration(minutes: 5)).then((newMessage) async { + backend + .sendMessage(c, m) + .timeout(const Duration(minutes: 5)) + .then((newMessage) async { try { await matchMessageWithExisting(c, m.guid!, newMessage, existing: m); } catch (ex) { - Logger.warn("Failed to find message match for ${m.guid} -> ${newMessage.guid}!", error: ex, tag: "MessageStatus"); + Logger.warn( + "Failed to find message match for ${m.guid} -> ${newMessage.guid}!", + error: ex, + tag: "MessageStatus"); } completer.complete(); @@ -194,11 +243,17 @@ class ActionHandler extends GetxService { completer.completeError(error); }); } else { - backend.sendTapback(c, selected!, r, m.associatedMessagePart).timeout(const Duration(minutes: 5)).then((newMessage) async { + backend + .sendTapback(c, selected!, r, m.associatedMessagePart) + .timeout(const Duration(minutes: 5)) + .then((newMessage) async { try { await matchMessageWithExisting(c, m.guid!, newMessage, existing: m); } catch (ex) { - Logger.warn("Failed to find message match for ${m.guid} -> ${newMessage.guid}!", error: ex, tag: "MessageStatus"); + Logger.warn( + "Failed to find message match for ${m.guid} -> ${newMessage.guid}!", + error: ex, + tag: "MessageStatus"); } completer.complete(); }).catchError((error, stack) async { @@ -218,30 +273,37 @@ class ActionHandler extends GetxService { return completer.future; } - Future sendMultipart(Chat c, Message m, Message? selected, String? r) async { + Future sendMultipart( + Chat c, Message m, Message? selected, String? r) async { final completer = Completer(); - List> parts = m.attributedBody.first.runs.map((e) => { - "text": m.attributedBody.first.string.substring(e.range.first, e.range.first + e.range.last), - "mention": e.attributes!.mention, - "partIndex": e.attributes!.messagePart, - }).toList(); - - http.sendMultipart( - c.guid, - m.guid!, - parts, - subject: m.subject, - selectedMessageGuid: m.threadOriginatorGuid, - effectId: m.expressiveSendStyleId, - partIndex: int.tryParse(m.threadOriginatorPart?.split(":").firstOrNull ?? ""), - ddScan: !ss.isMinSonomaSync && parts.any((e) => e["text"].toString().hasUrl) - ).then((response) async { + List> parts = m.attributedBody.first.runs + .map((e) => { + "text": m.attributedBody.first.string + .substring(e.range.first, e.range.first + e.range.last), + "mention": e.attributes!.mention, + "partIndex": e.attributes!.messagePart, + }) + .toList(); + + http + .sendMultipart(c.guid, m.guid!, parts, + subject: m.subject, + selectedMessageGuid: m.threadOriginatorGuid, + effectId: m.expressiveSendStyleId, + partIndex: int.tryParse( + m.threadOriginatorPart?.split(":").firstOrNull ?? ""), + ddScan: !ss.isMinSonomaSync && + parts.any((e) => e["text"].toString().hasUrl)) + .then((response) async { final newMessage = Message.fromMap(response.data['data']); try { await matchMessageWithExisting(c, m.guid!, newMessage, existing: m); } catch (ex) { - Logger.warn("Failed to find message match for ${m.guid} -> ${newMessage.guid}!", error: ex, tag: "MessageStatus"); + Logger.warn( + "Failed to find message match for ${m.guid} -> ${newMessage.guid}!", + error: ex, + tag: "MessageStatus"); } completer.complete(); }).catchError((error, stack) async { @@ -259,7 +321,7 @@ class ActionHandler extends GetxService { return completer.future; } - + Future prepAttachment(Chat c, Message m) async { final attachment = m.attachments.first!; final progress = Tuple2(attachment.guid!, 0.0.obs); @@ -268,17 +330,19 @@ class ActionHandler extends GetxService { if (!kIsWeb) { var dialog = attachment.totalBytes! > 100 * 1000 * 1000; if (dialog) { - showDialog(context: Get.context!, - barrierDismissible: false, - builder: (BuildContext context) { - return AlertDialog( - title: Text("Preparing...", style: context.theme.textTheme.titleLarge), - backgroundColor: context.theme.colorScheme.properSurface, - actions: [], - ); - }); + showDialog( + context: Get.context!, + barrierDismissible: false, + builder: (BuildContext context) { + return AlertDialog( + title: Text("Preparing...", + style: context.theme.textTheme.titleLarge), + backgroundColor: context.theme.colorScheme.properSurface, + actions: [], + ); + }); } - + String directory = "${fs.appDocDir.path}/attachments/${attachment.guid}"; String pathName = "$directory/${attachment.transferName}"; if (!canonicalize(pathName).startsWith(canonicalize(directory))) { @@ -296,8 +360,10 @@ class ActionHandler extends GetxService { var mm = attachment.mimeType ?? mime(attachment.transferName); // 100 MB - if (dialog && mm != null && mm.startsWith("video/") && Platform.isAndroid) { - + if (dialog && + mm != null && + mm.startsWith("video/") && + Platform.isAndroid) { String tempPath = "$directory/temp.mp4"; file.renameSync(tempPath); // use FFMPEG to shrink @@ -306,10 +372,14 @@ class ActionHandler extends GetxService { var output = json.decode((await info.getOutput())!); double duration = double.parse(output["format"]["duration"]); List streams = output["streams"]; - var videoStream = streams.firstWhereOrNull((stream) => stream["codec_type"] == "video"); + var videoStream = streams + .firstWhereOrNull((stream) => stream["codec_type"] == "video"); int width = videoStream?["width"] ?? 1; int height = videoStream?["height"] ?? 1; - var rotation = ((videoStream?["side_data_list"] as List?)?.firstOrNull?["rotation"] ?? 0).abs(); + var rotation = ((videoStream?["side_data_list"] as List?) + ?.firstOrNull?["rotation"] ?? + 0) + .abs(); var flip = rotation == 90 || rotation == 270; if (flip) { var tmp = width; @@ -334,61 +404,67 @@ class ActionHandler extends GetxService { var audioRate = 128 * 1000; var maxBits = (50 * 1000 * 1000 * 8) - (audioRate * duration).floor(); var bitsPerSecond = (maxBits / duration).floor(); - var executed = await FFmpegKit.executeAsync("-i \"$directory/temp.mp4\" -b:v $bitsPerSecond -vf \"scale=$width:$height\" -c:a aac -b:a $audioRate \"$directory/compressed.mp4\"", - (Session session) async { - if (myUpdate != null) { - Navigator.of(Get.context!).pop(); // dismiss dialog - } - c.complete(); - Logger.info("Session finsihed $session"); - }, - (Log log) async { }, - (Statistics statistics) { - progress = statistics.getTime() / 1000; // ms to s - if (myUpdate != null) { - myUpdate!(() {}); - } - Logger.info("Time $progress"); - }); + var executed = await FFmpegKit.executeAsync( + "-i \"$directory/temp.mp4\" -b:v $bitsPerSecond -vf \"scale=$width:$height\" -c:a aac -b:a $audioRate \"$directory/compressed.mp4\"", + (Session session) async { + if (myUpdate != null) { + Navigator.of(Get.context!).pop(); // dismiss dialog + } + c.complete(); + Logger.info("Session finsihed $session"); + }, + (Log log) async {}, + (Statistics statistics) { + progress = statistics.getTime() / 1000; // ms to s + if (myUpdate != null) { + myUpdate!(() {}); + } + Logger.info("Time $progress"); + }); Get.back(); - showDialog(context: Get.context!, - barrierDismissible: false, - builder: (BuildContext context) { - return AlertDialog( - title: Text("Compressing...", style: context.theme.textTheme.titleLarge), - content: SizedBox( - height: 5, - child: Center( - child: StatefulBuilder(builder: (context, update) { - myUpdate = update; - return LinearProgressIndicator( - value: progress / duration, - backgroundColor: context.theme.colorScheme.outline, - valueColor: AlwaysStoppedAnimation(context.theme.colorScheme.primary), - ); - }), - ), - ), - backgroundColor: context.theme.colorScheme.properSurface, - actions: [ - TextButton( - onPressed: () { - Navigator.of(context).pop(); - }, - child: Text( - "Cancel", style: context.theme.textTheme.bodyLarge!.copyWith(color: context.theme.colorScheme.primary), + showDialog( + context: Get.context!, + barrierDismissible: false, + builder: (BuildContext context) { + return AlertDialog( + title: Text("Compressing...", + style: context.theme.textTheme.titleLarge), + content: SizedBox( + height: 5, + child: Center( + child: StatefulBuilder(builder: (context, update) { + myUpdate = update; + return LinearProgressIndicator( + value: progress / duration, + backgroundColor: context.theme.colorScheme.outline, + valueColor: AlwaysStoppedAnimation( + context.theme.colorScheme.primary), + ); + }), ), - ) - ], - ); - }).then((_) async { - myUpdate = null; - executed.cancel(); - await File(tempPath).delete(); - }); - + ), + backgroundColor: context.theme.colorScheme.properSurface, + actions: [ + TextButton( + onPressed: () { + Navigator.of(context).pop(); + }, + child: Text( + "Cancel", + style: context.theme.textTheme.bodyLarge! + .copyWith(color: context.theme.colorScheme.primary), + ), + ) + ], + ); + }).then((_) async { + myUpdate = null; + executed.cancel(); + await File(tempPath).delete(); + }); + await c.future; var returnCode = await executed.getReturnCode(); @@ -403,7 +479,7 @@ class ActionHandler extends GetxService { var output = await executed.getOutput(); showSnackbar("Error", "Failed to compress video"); throw Exception("FFMpeg failed $output code $returnCode"); - } + } File("$directory/compressed.mp4").renameSync(pathName); attachment.totalBytes = File(pathName).lengthSync(); } else if (dialog) { @@ -416,33 +492,42 @@ class ActionHandler extends GetxService { Future sendAttachment(Chat c, Message m, bool isAudioMessage) async { if (m.attachments.isEmpty) return; final attachment = m.attachments.first!; - final progress = attachmentProgress.firstWhere((e) => e.item1 == attachment.guid); + final progress = + attachmentProgress.firstWhere((e) => e.item1 == attachment.guid); final completer = Completer(); latestCancelToken = CancelToken(); var apnsSuccess = false; - backend.sendAttachment( - c, m, isAudioMessage, attachment, onSendProgress: (count, total) => progress.item2.value = count / total, + backend + .sendAttachment( + c, + m, + isAudioMessage, + attachment, + onSendProgress: (count, total) => progress.item2.value = count / total, cancelToken: latestCancelToken, - ).then((newMessage) async { + ) + .then((newMessage) async { latestCancelToken = null; for (Attachment? a in newMessage.attachments) { if (a == null) continue; matchAttachmentWithExisting(c, m.guid!, a, existing: attachment) - .then((_) { - ms(c.guid).updateMessage(newMessage); - }) - .catchError((e, stack) { - Logger.warn("Failed to replace attachment ${a.guid}!", error: e, tag: "AttachmentStatus"); - } - ); + .then((_) { + ms(c.guid).updateMessage(newMessage); + }).catchError((e, stack) { + Logger.warn("Failed to replace attachment ${a.guid}!", + error: e, tag: "AttachmentStatus"); + }); } try { await matchMessageWithExisting(c, m.guid!, newMessage, existing: m); } catch (e) { - Logger.warn("Failed to find message match for ${m.guid} -> ${newMessage.guid}!", error: e, tag: "MessageStatus"); + Logger.warn( + "Failed to find message match for ${m.guid} -> ${newMessage.guid}!", + error: e, + tag: "MessageStatus"); } apnsSuccess = true; await m.forwardIfNessesary(c); @@ -460,24 +545,26 @@ class ActionHandler extends GetxService { var messageGuid = uuid.v4(); for (Attachment? a in m.attachments) { if (a == null) continue; - Attachment.replaceAttachment(m.guid, Attachment( - guid: "${messageGuid}_0", - uti: a.uti, - mimeType: a.mimeType, - isOutgoing: true, - transferName: a.transferName, - totalBytes: a.totalBytes, - hasLivePhoto: a.hasLivePhoto, - metadata: a.metadata, - bytes: a.bytes, - )); + Attachment.replaceAttachment( + m.guid, + Attachment( + guid: "${messageGuid}_0", + uti: a.uti, + mimeType: a.mimeType, + isOutgoing: true, + transferName: a.transferName, + totalBytes: a.totalBytes, + hasLivePhoto: a.hasLivePhoto, + metadata: a.metadata, + bytes: a.bytes, + )); } await Message.replaceMessage(m.guid, m); m.guid = messageGuid; // mark it as non-temp m.save(); completer.complete(); // oh well, didn't get to apns, still "sent" return; - } catch(e) { + } catch (e) { error = e; Logger.info("Message match failed to forward!", tag: "MessageStatus"); } @@ -497,7 +584,8 @@ class ActionHandler extends GetxService { return completer.future; } - Future handleNewMessage(Chat c, Message m, String? tempGuid, {bool checkExisting = true}) async { + Future handleNewMessage(Chat c, Message m, String? tempGuid, + {bool checkExisting = true}) async { final key = m.guid; final existingFlight = key == null ? null : _inFlightNewMessages[key]; if (existingFlight != null) { @@ -512,10 +600,12 @@ class ActionHandler extends GetxService { } if (key == null) { - return await _handleNewMessage(c, m, tempGuid, checkExisting: checkExisting); + return await _handleNewMessage(c, m, tempGuid, + checkExisting: checkExisting); } - final flight = _handleNewMessage(c, m, tempGuid, checkExisting: checkExisting); + final flight = + _handleNewMessage(c, m, tempGuid, checkExisting: checkExisting); _inFlightNewMessages[key] = flight; try { await flight; @@ -526,7 +616,8 @@ class ActionHandler extends GetxService { } } - Future _handleNewMessage(Chat c, Message m, String? tempGuid, {bool checkExisting = true}) async { + Future _handleNewMessage(Chat c, Message m, String? tempGuid, + {bool checkExisting = true}) async { Logger.info("handling new ${m.id}"); // sanity check if (checkExisting) { @@ -538,28 +629,39 @@ class ActionHandler extends GetxService { } // should have been handled by the sanity check if (tempGuid != null) return; - Logger.debug("Received new message (attachments=${m.hasAttachments})", tag: "ActionHandler"); + Logger.debug("Received new message (attachments=${m.hasAttachments})", + tag: "ActionHandler"); // Gets the chat from the db or server (if new) - c = m.isParticipantEvent ? await handleNewOrUpdatedChat(c) : kIsWeb ? c : (Chat.findOne(guid: c.guid) ?? await handleNewOrUpdatedChat(c)); + c = m.isParticipantEvent + ? await handleNewOrUpdatedChat(c) + : kIsWeb + ? c + : (Chat.findOne(guid: c.guid) ?? await handleNewOrUpdatedChat(c)); // Get the message handle - m.handle = c.handles.firstWhereOrNull((e) => e.originalROWID == m.handleId) ?? Handle.findOne(originalROWID: m.handleId); - + m.handle = + c.handles.firstWhereOrNull((e) => e.originalROWID == m.handleId) ?? + Handle.findOne(originalROWID: m.handleId); + // Display notification if needed and save everything to DB bool shouldNotify = shouldNotifyForNewMessageGuid(m.guid!); if (!shouldNotify) { - Logger.info("Not notifying for already handled new message with GUID ${m.guid}...", tag: "ActionHandler"); + Logger.info( + "Not notifying for already handled new message with GUID ${m.guid}...", + tag: "ActionHandler"); } await c.addMessage(m); await m.forwardIfNessesary(c, markFailed: true); // Persistence is complete before notification work begins. Notification // failures are isolated so they cannot make the transport drop the message. - if ((!ls.isAlive || ss.settings.endpointUnifiedPush.value != "") && shouldNotify) { + if ((!ls.isAlive || ss.settings.endpointUnifiedPush.value != "") && + shouldNotify) { unawaited(_notifyNewMessageBestEffort(m, c)); } } - Future handleUpdatedMessage(Chat c, Message m, String? tempGuid, {bool checkExisting = true}) async { + Future handleUpdatedMessage(Chat c, Message m, String? tempGuid, + {bool checkExisting = true}) async { // sanity check if (checkExisting) { final existing = Message.findOne(guid: tempGuid ?? m.guid); @@ -567,27 +669,49 @@ class ActionHandler extends GetxService { return await handleNewMessage(c, m, tempGuid, checkExisting: false); } } - Logger.info("Updated message: [${m.text}] ${m.getLastUpdate().toLowerCase()} - for chat [${c.guid}]", tag: "ActionHandler"); + Logger.info( + "Updated message state=${m.getLastUpdate().toLowerCase()} attachments=${m.hasAttachments}", + tag: "ActionHandler"); // update any attachments for (Attachment? a in m.attachments) { if (a == null) continue; - matchAttachmentWithExisting(c, tempGuid ?? m.guid!, a) - .then((_) { - ms(c.guid).updateMessage(m); - }) - .catchError((e, stack) { - Logger.warn("Failed to replace attachment ${a.guid}!", error: e, trace: stack, tag: "AttachmentStatus"); - } - ); + matchAttachmentWithExisting(c, tempGuid ?? m.guid!, a).then((_) { + ms(c.guid).updateMessage(m); + }).catchError((e, stack) { + Logger.warn("Failed to replace attachment ${a.guid}!", + error: e, trace: stack, tag: "AttachmentStatus"); + }); } await m.forwardIfNessesary(c, markFailed: true); // forward even if retrying // update the message in the DB await matchMessageWithExisting(c, tempGuid ?? m.guid!, m); + refreshActiveMessage(c, m, oldGuid: tempGuid); eventDispatcher.emit("message-updated-${m.guid}"); } + /// Refreshes a message that is already loaded in the active conversation. + /// + /// Database persistence remains the source of truth, but relying only on the + /// ObjectBox watcher can leave locally edited text visible until the next + /// query event. Prefer the active bubble controller so its message parts are + /// rebuilt immediately. Fall back to the conversation service for messages + /// that are loaded but currently off screen. + @visibleForTesting + void refreshActiveMessage(Chat chat, Message message, {String? oldGuid}) { + final activeController = getActiveMwc(oldGuid ?? message.guid!); + if (activeController != null) { + activeController.updateMessage(message); + return; + } + + if (Get.isRegistered(tag: chat.guid)) { + Get.find(tag: chat.guid) + .updateMessage(message, oldGuid: oldGuid); + } + } + Future handleNewOrUpdatedChat(Chat partialData) async { // fetch all contacts for matching new handles if in background if (!ls.isUiThread) { @@ -627,7 +751,12 @@ class ActionHandler extends GetxService { if (Platform.isAndroid) { mcs.invokeMethod("update-call-state", { - "name": ss.settings.userName.value == "You" ? (await api.getHandles(state: pushService.state!.client)).first.replaceFirst("tel:", "").replaceFirst("mailto:", "") : ss.settings.userName.value, + "name": ss.settings.userName.value == "You" + ? (await api.getHandles(state: pushService.state!.client)) + .first + .replaceFirst("tel:", "") + .replaceFirst("mailto:", "") + : ss.settings.userName.value, "desc": caller, "url": link, "callUuid": callUuid, @@ -640,10 +769,12 @@ class ActionHandler extends GetxService { await showFaceTimeOverlay(callUuid, caller, chatIcon, link); } // always show facetime notification for ringtone - await notif.createIncomingFaceTimeNotification(callUuid, caller, link, chatIcon, poster); + await notif.createIncomingFaceTimeNotification( + callUuid, caller, link, chatIcon, poster); } - Future handleIncomingFaceTimeCallLegacy(Map data) async { + Future handleIncomingFaceTimeCallLegacy( + Map data) async { Logger.info("Handling incoming FaceTime call (legacy)"); await cs.init(); String? address = data["caller"]; @@ -656,11 +787,14 @@ class ActionHandler extends GetxService { Contact? contact = cs.getContact(address); chatIcon = contact?.avatar; caller = contact?.displayName ?? caller; - await notif.createIncomingFaceTimeNotification(null, caller!, "", chatIcon, null); + await notif.createIncomingFaceTimeNotification( + null, caller!, "", chatIcon, null); } } - Future handleEvent(String event, Map data, String source, {bool useQueue = true}) async { + Future handleEvent( + String event, Map data, String source, + {bool useQueue = true}) async { Logger.info("Received $event from $source"); switch (event) { case "new-message": @@ -677,7 +811,8 @@ class ActionHandler extends GetxService { } } - IncomingItem item = IncomingItem.fromMap(QueueType.newMessage, payload.data); + IncomingItem item = + IncomingItem.fromMap(QueueType.newMessage, payload.data); if (useQueue) { inq.queue(item); } else { @@ -688,11 +823,13 @@ class ActionHandler extends GetxService { case "updated-message": if (!isNullOrEmpty(data)) { final payload = ServerPayload.fromJson(data); - IncomingItem item = IncomingItem.fromMap(QueueType.updatedMessage, payload.data); + IncomingItem item = + IncomingItem.fromMap(QueueType.updatedMessage, payload.data); if (useQueue) { inq.queue(item); } else { - await ah.handleUpdatedMessage(item.chat, item.message, item.tempGuid); + await ah.handleUpdatedMessage( + item.chat, item.message, item.tempGuid); } } return; @@ -712,7 +849,8 @@ class ActionHandler extends GetxService { } return; case "typing-indicator": - final chat = chats.chats.firstWhereOrNull((element) => element.guid == data["guid"]); + final chat = chats.chats + .firstWhereOrNull((element) => element.guid == data["guid"]); if (chat != null) { final controller = cvc(chat); // controller.showTypingIndicator.value = data["display"]; @@ -728,7 +866,8 @@ class ActionHandler extends GetxService { return; case "imessage-aliases-removed": Logger.info("Alias(es) removed ${data["aliases"]}"); - await notif.createAliasesRemovedNotification((data["aliases"] as List).cast()); + await notif.createAliasesRemovedNotification( + (data["aliases"] as List).cast()); return; default: return; diff --git a/lib/services/backend/java_dart_interop/method_channel_service.dart b/lib/services/backend/java_dart_interop/method_channel_service.dart index bdc327e6f8..9e86782eca 100644 --- a/lib/services/backend/java_dart_interop/method_channel_service.dart +++ b/lib/services/backend/java_dart_interop/method_channel_service.dart @@ -1,5 +1,4 @@ import 'dart:async'; -import 'dart:collection'; import 'dart:convert'; import 'package:bluebubbles/helpers/backend/settings_helpers.dart'; @@ -12,7 +11,6 @@ import 'package:bluebubbles/services/services.dart'; import 'package:flutter/foundation.dart'; import 'package:flutter/services.dart'; import 'package:get/get.dart'; -import 'package:bluebubbles/src/rust/api/api.dart' as api; MethodChannelService mcs = Get.isRegistered() ? Get.find() : Get.put(MethodChannelService()); @@ -85,9 +83,9 @@ class MethodChannelService extends GetxService { try { String pointer = call.arguments["pointer"]; String retry = call.arguments["retry"]; - Logger.info("got message $pointer $retry"); + Logger.info("rustpush_receive dispatch_start retry=$retry"); await pushService.recievedMsgPointer(pointer, retry); - Logger.info("finish message $pointer $retry"); + Logger.info("rustpush_receive dispatch_complete retry=$retry"); } catch (e, s) { Logger.error("APN MSG error", error: e, trace: s); rethrow; diff --git a/lib/services/backend/notifications/desktop_notification_actions.dart b/lib/services/backend/notifications/desktop_notification_actions.dart new file mode 100644 index 0000000000..b5f38ea8fd --- /dev/null +++ b/lib/services/backend/notifications/desktop_notification_actions.dart @@ -0,0 +1,27 @@ +List resolveDesktopNotificationActions({ + required List actionList, + required Iterable selectedIndices, + required bool privateApiEnabled, + required bool sourceIsReaction, + required bool sourceIsGroupEvent, + required Map reactionEmojis, +}) { + final selected = selectedIndices.toSet(); + final actions = []; + + for (var index = 0; index < actionList.length; index++) { + if (!selected.contains(index)) continue; + + final action = actionList[index]; + if (action == 'Mark Read') { + actions.add(action); + continue; + } + + if (!privateApiEnabled || sourceIsReaction || sourceIsGroupEvent) continue; + final emoji = reactionEmojis[action]; + if (emoji != null) actions.add(emoji); + } + + return actions; +} diff --git a/lib/services/backend/notifications/notifications_service.dart b/lib/services/backend/notifications/notifications_service.dart index 405ae21d8c..d3502ed556 100644 --- a/lib/services/backend/notifications/notifications_service.dart +++ b/lib/services/backend/notifications/notifications_service.dart @@ -12,7 +12,7 @@ import 'package:bluebubbles/helpers/helpers.dart'; import 'package:bluebubbles/helpers/ui/facetime_helpers.dart'; import 'package:bluebubbles/database/models.dart'; import 'package:bluebubbles/database/database.dart'; -import 'package:bluebubbles/services/network/backend_service.dart'; +import 'package:bluebubbles/services/backend/notifications/desktop_notification_actions.dart'; import 'package:bluebubbles/services/rustpush/rustpush_service.dart'; import 'package:bluebubbles/services/services.dart'; import 'package:bluebubbles/utils/logger/logger.dart'; @@ -20,11 +20,14 @@ import 'package:collection/collection.dart'; import 'package:flutter/foundation.dart'; import 'package:flutter/material.dart' hide Notification; import 'package:flutter/services.dart'; -import 'package:flutter_local_notifications/flutter_local_notifications.dart' hide Message; +import 'package:flutter_local_notifications/flutter_local_notifications.dart' + hide Message; +import 'package:flutter_timezone/flutter_timezone.dart'; import 'package:get/get.dart'; import 'package:local_notifier/local_notifier.dart'; import 'package:path/path.dart'; import 'package:synchronized/synchronized.dart'; +import 'package:timezone/data/latest.dart' as timezone_data; import 'package:timezone/timezone.dart'; import 'package:universal_html/html.dart' hide File, Platform, Navigator, Text; import 'package:universal_io/io.dart'; @@ -32,7 +35,9 @@ import 'package:window_manager/window_manager.dart'; import 'package:bluebubbles/src/rust/api/api.dart' as api; import 'package:bluebubbles/app/layouts/findmy/findmy_page.dart'; -NotificationsService notif = Get.isRegistered() ? Get.find() : Get.put(NotificationsService()); +NotificationsService notif = Get.isRegistered() + ? Get.find() + : Get.put(NotificationsService()); class NotificationsService extends GetxService { static const String NEW_MESSAGE_CHANNEL = "com.bluebubbles.new_messages"; @@ -41,14 +46,18 @@ class NotificationsService extends GetxService { static const String SHARED_BEACONS_CHANNEL = "com.bluebubbles.sharedbeacons"; static const String REMINDER_CHANNEL = "com.bluebubbles.reminders"; static const String FACETIME_CHANNEL = "com.bluebubbles.incoming_facetimes"; - static const String FOREGROUND_SERVICE_CHANNEL = "com.bluebubbles.foreground_service"; + static const String FOREGROUND_SERVICE_CHANNEL = + "com.bluebubbles.foreground_service"; static const String AUTH_CODES_CHANNEL = "com.bluebubbles.auth_codes"; static const String SYNC_STATUS_CHANNEL = "com.bluebubbles.sync_status"; - static const String NEW_MESSAGE_TAG = "com.bluebubbles.messaging.NEW_MESSAGE_NOTIFICATION"; - static const String NEW_FACETIME_TAG = "com.bluebubbles.messaging.NEW_FACETIME_NOTIFICATION"; + static const String NEW_MESSAGE_TAG = + "com.bluebubbles.messaging.NEW_MESSAGE_NOTIFICATION"; + static const String NEW_FACETIME_TAG = + "com.bluebubbles.messaging.NEW_FACETIME_NOTIFICATION"; - final FlutterLocalNotificationsPlugin flnp = FlutterLocalNotificationsPlugin(); + final FlutterLocalNotificationsPlugin flnp = + FlutterLocalNotificationsPlugin(); StreamSubscription? countSub; int currentCount = 0; Timer? relayReminderTimer; @@ -76,16 +85,39 @@ class NotificationsService extends GetxService { } Future _init() async { + if (!kIsWeb) { + // Notification scheduling may be requested by a background relay before + // main.dart performs its UI-only timezone setup. + timezone_data.initializeTimeZones(); + setLocalLocation(getLocation('UTC')); + if (!kIsDesktop) { + try { + setLocalLocation( + getLocation(await FlutterTimezone.getLocalTimezone())); + } catch (e, stack) { + Logger.warn( + "Local timezone unavailable; scheduled notifications will use UTC", + error: e, + trace: stack); + } + } + } + if (!kIsWeb && !kIsDesktop) { - const AndroidInitializationSettings initializationSettingsAndroid = AndroidInitializationSettings('ic_stat_icon'); - const InitializationSettings initializationSettings = InitializationSettings(android: initializationSettingsAndroid); - await flnp.initialize(initializationSettings, onDidReceiveNotificationResponse: (NotificationResponse? response) { + const AndroidInitializationSettings initializationSettingsAndroid = + AndroidInitializationSettings('ic_stat_icon'); + const InitializationSettings initializationSettings = + InitializationSettings(android: initializationSettingsAndroid); + await flnp.initialize(initializationSettings, + onDidReceiveNotificationResponse: (NotificationResponse? response) { if (response?.payload != null) { intents.openChat(response!.payload); } }); final details = await flnp.getNotificationAppLaunchDetails(); - if (details != null && details.didNotificationLaunchApp && details.notificationResponse?.payload != null) { + if (details != null && + details.didNotificationLaunchApp && + details.notificationResponse?.payload != null) { intents.openChat(details.notificationResponse!.payload!); } // create notif channels @@ -99,11 +131,8 @@ class NotificationsService extends GetxService { "Errors", "Displays message send failures, connection failures, and more", ); - createNotificationChannel( - SHARED_STREAMS_CHANNEL, - "Shared Albums", - "Displays invitations and updates for shared albums." - ); + createNotificationChannel(SHARED_STREAMS_CHANNEL, "Shared Albums", + "Displays invitations and updates for shared albums."); createNotificationChannel( REMINDER_CHANNEL, "Message Reminders", @@ -119,32 +148,31 @@ class NotificationsService extends GetxService { "Foreground Service", "Allows BlueBubbles to stay open in the background for notifications if FCM is not being used", ); - createNotificationChannel( - AUTH_CODES_CHANNEL, - "Apple Account login requests", - "Shows Apple Account login requests" - ); - createNotificationChannel( - SYNC_STATUS_CHANNEL, - "Sync Status", - "View the status of iCloud syncing." - ); - createNotificationChannel( - SHARED_BEACONS_CHANNEL, - "Shared Items", - "Displays invitations and updates for shared items." - ); + createNotificationChannel(AUTH_CODES_CHANNEL, + "Apple Account login requests", "Shows Apple Account login requests"); + createNotificationChannel(SYNC_STATUS_CHANNEL, "Sync Status", + "View the status of iCloud syncing."); + createNotificationChannel(SHARED_BEACONS_CHANNEL, "Shared Items", + "Displays invitations and updates for shared items."); } // watch for new messages and handle the notification if (!kIsWeb) { - final countQuery = (Database.messages.query()..order(Message_.id, flags: Order.descending)).watch(triggerImmediately: true); + final countQuery = (Database.messages.query() + ..order(Message_.id, flags: Order.descending)) + .watch(triggerImmediately: true); countSub = countQuery.listen((event) { if (chats.restoring) return; if (!ss.settings.finishedSetup.value) return; final newCount = event.count(); - final activeChatFetching = cm.activeChat != null ? ms(cm.activeChat!.chat.guid).isFetching : false; - if (ls.isAlive && (!sync.isIncrementalSyncing.value && !kIsDesktop) && !activeChatFetching && newCount > currentCount && currentCount != 0) { + final activeChatFetching = cm.activeChat != null + ? ms(cm.activeChat!.chat.guid).isFetching + : false; + if (ls.isAlive && + (!sync.isIncrementalSyncing.value && !kIsDesktop) && + !activeChatFetching && + newCount > currentCount && + currentCount != 0) { event.limit = newCount - currentCount; final messages = event.find(); event.limit = 0; @@ -154,10 +182,12 @@ class NotificationsService extends GetxService { message.attachments = List.from(message.dbAttachments); } if (kIsDesktop && messages.length > 1) { - MessageHelper.handleSummaryNotification(messages, findExisting: false); + MessageHelper.handleSummaryNotification(messages, + findExisting: false); } else { for (Message message in messages) { - MessageHelper.handleNotification(message, message.chat.target!, findExisting: false); + MessageHelper.handleNotification(message, message.chat.target!, + findExisting: false); } } } @@ -165,9 +195,12 @@ class NotificationsService extends GetxService { }); } else { countSub = WebListeners.newMessage.listen((tuple) { - final activeChatFetching = cm.activeChat != null ? ms(cm.activeChat!.chat.guid).isFetching : false; + final activeChatFetching = cm.activeChat != null + ? ms(cm.activeChat!.chat.guid).isFetching + : false; if (ls.isAlive && !activeChatFetching && tuple.item2 != null) { - MessageHelper.handleNotification(tuple.item1, tuple.item2!, findExisting: false); + MessageHelper.handleNotification(tuple.item1, tuple.item2!, + findExisting: false); } }); } @@ -181,7 +214,8 @@ class NotificationsService extends GetxService { super.onClose(); } - Future createNotificationChannel(String channelID, String channelName, String channelDescription) async { + Future createNotificationChannel( + String channelID, String channelName, String channelDescription) async { await mcs.invokeMethod("create-notification-channel", { "channel_name": channelName, "channel_description": channelDescription, @@ -189,11 +223,15 @@ class NotificationsService extends GetxService { }); } - Future createReminder(Chat? chat, Message? message, DateTime time, {String? chatTitle, String? messageText}) async { + Future createReminder(Chat? chat, Message? message, DateTime time, + {String? chatTitle, String? messageText}) async { await flnp.zonedSchedule( Random().nextInt(9998) + 50000, chatTitle ?? 'Reminder: ${chat!.getTitle()}', - messageText ?? (hideContent ? "iMessage" : MessageHelper.getNotificationText(message!)), + messageText ?? + (hideContent + ? "iMessage" + : MessageHelper.getNotificationText(message!)), TZDateTime.from(time, local), NotificationDetails( android: AndroidNotificationDetails( @@ -207,25 +245,34 @@ class NotificationsService extends GetxService { ), payload: "${time.millisecondsSinceEpoch}", androidScheduleMode: AndroidScheduleMode.exactAllowWhileIdle, - uiLocalNotificationDateInterpretation: UILocalNotificationDateInterpretation.absoluteTime, + uiLocalNotificationDateInterpretation: + UILocalNotificationDateInterpretation.absoluteTime, ); } - Future createNotification(Chat chat, Message message, {bool notifyAnyways = false}) async { + Future createNotification(Chat chat, Message message, + {bool notifyAnyways = false}) async { if (chat.shouldMuteNotification(message) || message.isFromMe!) return; final isGroup = chat.isGroup; final guid = chat.guid; final contactName = message.handle?.displayName ?? "Unknown"; final title = isGroup ? chat.getTitle() : contactName; - final text = hideContent ? "iMessage" : MessageHelper.getNotificationText(message); + final text = + hideContent ? "iMessage" : MessageHelper.getNotificationText(message); final isReaction = !isNullOrEmpty(message.associatedMessageGuid); - final personIcon = (await rootBundle.load("assets/images/person64.png")).buffer.asUint8List(); + final personIcon = (await rootBundle.load("assets/images/person64.png")) + .buffer + .asUint8List(); Uint8List chatIcon = await avatarAsBytes(chat: chat, quality: 256); Uint8List contactIcon = message.isFromMe! ? personIcon : await avatarAsBytes( - participantsOverride: !chat.isGroup ? null : chat.participants.where((e) => e.address == message.handle!.address).toList(), + participantsOverride: !chat.isGroup + ? null + : chat.participants + .where((e) => e.address == message.handle!.address) + .toList(), chat: chat, quality: 256); if (chatIcon.isEmpty) { @@ -236,12 +283,26 @@ class NotificationsService extends GetxService { } if (kIsWeb && Notification.permission == "granted") { - final notif = Notification(title, body: text, icon: "data:image/png;base64,${base64Encode(chatIcon)}", tag: message.guid); + final notif = Notification(title, + body: text, + icon: "data:image/png;base64,${base64Encode(chatIcon)}", + tag: message.guid); notif.onClick.listen((event) async { await intents.openChat(guid); }); } else if (kIsDesktop) { - _lock.synchronized(() async => await showDesktopNotif(message, text, chat, guid, title, contactName, isGroup, isReaction)); + await _lock.synchronized( + () async => await showDesktopNotif( + message, + text, + chat, + guid, + title, + contactName, + isGroup, + isReaction, + ), + ); } else { await mcs.invokeMethod("create-incoming-message-notification", { "channel_id": NEW_MESSAGE_CHANNEL, @@ -251,7 +312,10 @@ class NotificationsService extends GetxService { "chat_title": title, "chat_icon": isGroup ? chatIcon : contactIcon, "contact_name": contactName, - "contact_uri": isGroup ? null : chat.getRustHandlesExcludingMine()[0], // other people use uris :wink: + "contact_uri": isGroup + ? null + : chat.getRustHandlesExcludingMine()[ + 0], // other people use uris :wink: "notify_anyways": notifyAnyways, "contact_avatar": contactIcon, "message_guid": message.guid!, @@ -262,33 +326,52 @@ class NotificationsService extends GetxService { } } - Future createIncomingFaceTimeNotification(String? callUuid, String caller, String link, Uint8List? chatIcon, String? poster) async { + Future createIncomingFaceTimeNotification(String? callUuid, + String caller, String link, Uint8List? chatIcon, String? poster) async { // Set some notification defaults String title = caller; String text = "${callUuid == null ? "Incoming" : "Answer"} FaceTime Call"; - chatIcon ??= (await rootBundle.load("assets/images/person64.png")).buffer.asUint8List(); + chatIcon ??= (await rootBundle.load("assets/images/person64.png")) + .buffer + .asUint8List(); if (kIsWeb && Notification.permission == "granted") { - final notif = Notification(title, body: text, icon: "data:image/png;base64,${base64Encode(chatIcon)}", tag: callUuid); + final notif = Notification(title, + body: text, + icon: "data:image/png;base64,${base64Encode(chatIcon)}", + tag: callUuid); if (callUuid != null) { notif.onClick.listen((event) async { await intents.answerFaceTime(callUuid); }); } } else if (kIsDesktop) { - _lock.synchronized(() async => await showPersistentDesktopFaceTimeNotif(callUuid, caller, chatIcon)); + await _lock.synchronized( + () async => await showPersistentDesktopFaceTimeNotif( + callUuid, + caller, + chatIcon, + ), + ); } else { final numeric = callUuid?.numericOnly(); await mcs.invokeMethod("create-incoming-facetime-notification", { "channel_id": FACETIME_CHANNEL, - "notification_id": numeric != null ? int.parse(numeric.substring(0, min(8, numeric.length))) : Random().nextInt(9998) + 1, + "notification_id": numeric != null + ? int.parse(numeric.substring(0, min(8, numeric.length))) + : Random().nextInt(9998) + 1, "title": title, "body": text, "caller_avatar": chatIcon, "caller": caller, "call_uuid": callUuid, "link": link, - "name": ss.settings.userName.value == "You" ? (await api.getHandles(state: pushService.state!.client)).first.replaceFirst("tel:", "").replaceFirst("mailto:", "") : ss.settings.userName.value, + "name": ss.settings.userName.value == "You" + ? (await api.getHandles(state: pushService.state!.client)) + .first + .replaceFirst("tel:", "") + .replaceFirst("mailto:", "") + : ss.settings.userName.value, "poster": poster, }); } @@ -299,19 +382,19 @@ class NotificationsService extends GetxService { await clearDesktopFaceTimeNotif(callUuid); } else if (!kIsWeb) { final numeric = callUuid.numericOnly(); - mcs.invokeMethod( - "delete-notification", - { - "notification_id": int.parse(numeric.substring(0, min(8, numeric.length))), - "tag": NEW_FACETIME_TAG - } - ); + mcs.invokeMethod("delete-notification", { + "notification_id": + int.parse(numeric.substring(0, min(8, numeric.length))), + "tag": NEW_FACETIME_TAG + }); } } - Future showPersistentDesktopFaceTimeNotif(String? callUuid, String caller, Uint8List? avatar) async { + Future showPersistentDesktopFaceTimeNotif( + String? callUuid, String caller, Uint8List? avatar) async { List actions = ["Answer", "Ignore"]; - List nActions = actions.map((String a) => LocalNotificationAction(text: a)).toList(); + List nActions = + actions.map((String a) => LocalNotificationAction(text: a)).toList(); LocalNotification? toast; String? path; @@ -350,7 +433,8 @@ class NotificationsService extends GetxService { } toast.onClose = (reason) async { - if (reason == LocalNotificationCloseReason.timedOut && faceTimeOverlays.containsKey(callUuid)) { + if (reason == LocalNotificationCloseReason.timedOut && + faceTimeOverlays.containsKey(callUuid)) { await toast?.show(); } }; @@ -369,24 +453,32 @@ class NotificationsService extends GetxService { facetimeNotifications.remove(callerUuid); } - Future showDesktopNotif(Message message, String text, Chat chat, String guid, String title, String contactName, bool isGroup, bool isReaction) async { + Future showDesktopNotif( + Message message, + String text, + Chat chat, + String guid, + String title, + String contactName, + bool isGroup, + bool isReaction) async { List selectedIndices = ss.settings.selectedActionIndices; List _actions = ss.settings.actionList; final papi = ss.settings.enablePrivateAPI.value; - List actions = _actions - .whereIndexed((i, e) => selectedIndices.contains(i)) - .map((action) => action == "Mark Read" - ? action - : !isReaction && !message.isGroupEvent && papi - ? ReactionTypes.reactionToEmoji[action]! - : null) - .whereNotNull() - .toList(); + List actions = resolveDesktopNotificationActions( + actionList: _actions, + selectedIndices: selectedIndices, + privateApiEnabled: papi, + sourceIsReaction: isReaction, + sourceIsGroupEvent: message.isGroupEvent, + reactionEmojis: ReactionTypes.reactionToEmoji, + ); bool showMarkRead = actions.contains("Mark Read"); - List nActions = actions.map((String a) => LocalNotificationAction(text: a)).toList(); + List nActions = + actions.map((String a) => LocalNotificationAction(text: a)).toList(); LocalNotification? toast; @@ -397,7 +489,8 @@ class NotificationsService extends GetxService { Iterable _chats = notifications.keys.toList(); if (_chats.length > maxChatCount) { - return await showSummaryNotifDesktop(notificationCounts.values.sum, _chats, showMarkRead); + return await showSummaryNotifDesktop( + notificationCounts.values.sum, _chats, showMarkRead); } Uint8List avatar = await avatarAsBytes(chat: chat, quality: 256); @@ -414,15 +507,26 @@ class NotificationsService extends GetxService { String? sender; RegExp re = RegExp("\n"); if (isGroup && !message.isGroupEvent && !isReaction) { - Contact? contact = message.handle != null ? cs.getContact(message.handle!.address) : null; + Contact? contact = message.handle != null + ? cs.getContact(message.handle!.address) + : null; sender = contact?.displayName.split(" ")[0]; } - int newLines = (((sender == null ? 0 : "$sender: ".length) + text.length) / charsPerLineEst).ceil() + re.allMatches(text).length; + int newLines = (((sender == null ? 0 : "$sender: ".length) + text.length) / + charsPerLineEst) + .ceil() + + re.allMatches(text).length; String body = ""; int count = 0; for (LocalNotification _toast in notifications[guid]!) { - if (newLines + ((_toast.body ?? "").length ~/ charsPerLineEst).ceil() + re.allMatches("${_toast.body}\n").length <= maxLines) { - if (isGroup && count == 0 && notifications[guid]!.isNotEmpty && _toast.title.length > "$title: ".length) { + if (newLines + + ((_toast.body ?? "").length ~/ charsPerLineEst).ceil() + + re.allMatches("${_toast.body}\n").length <= + maxLines) { + if (isGroup && + count == 0 && + notifications[guid]!.isNotEmpty && + _toast.title.length > "$title: ".length) { String name = _toast.title.substring("$title: ".length).split(" ")[0]; body += "$name: "; } @@ -451,13 +555,18 @@ class NotificationsService extends GetxService { if (toasted) return; toast = LocalNotification( imagePath: path, - title: isGroup && count == 1 && !isReaction && !message.isGroupEvent ? "$title: $contactName" : title, + title: isGroup && count == 1 && !isReaction && !message.isGroupEvent + ? "$title: $contactName" + : title, subtitle: "$count", body: sender != null && count == 1 ? body.split("$sender: ")[1] : body, duration: LocalNotificationDuration.long, actions: notifications[guid]!.isNotEmpty ? showMarkRead - ? [LocalNotificationAction(text: "Mark ${notificationCounts[guid]!} Messages Read")] + ? [ + LocalNotificationAction( + text: "Mark ${notificationCounts[guid]!} Messages Read") + ] : [] : nActions, ); @@ -473,7 +582,8 @@ class NotificationsService extends GetxService { return; } - if (ChatManager().activeChat?.chat.guid != guid && Get.context != null) { + if (ChatManager().activeChat?.chat.guid != guid && + Get.context != null) { ns.pushAndRemoveUntil( Get.context!, ConversationView(chat: chat), @@ -547,7 +657,8 @@ class NotificationsService extends GetxService { title: title, body: "${notificationCounts[guid]!} messages", duration: LocalNotificationDuration.short, - actions: showMarkRead ? [LocalNotificationAction(text: "Mark Read")] : [], + actions: + showMarkRead ? [LocalNotificationAction(text: "Mark Read")] : [], ); notifications[guid]!.add(toast); @@ -562,7 +673,8 @@ class NotificationsService extends GetxService { return; } - if (ChatManager().activeChat?.chat.guid != guid && Get.context != null) { + if (ChatManager().activeChat?.chat.guid != guid && + Get.context != null) { ns.pushAndRemoveUntil( Get.context!, ConversationView(chat: chat), @@ -612,7 +724,8 @@ class NotificationsService extends GetxService { await toast.show(); } - Future showSummaryNotifDesktop(int count, Iterable _chats, bool showMarkRead) async { + Future showSummaryNotifDesktop( + int count, Iterable _chats, bool showMarkRead) async { for (String chat in _chats) { for (LocalNotification _toast in (notifications[chat] ?? [])) { await _toast.close(); @@ -632,7 +745,8 @@ class NotificationsService extends GetxService { title: title, body: body, duration: LocalNotificationDuration.short, - actions: showMarkRead ? [LocalNotificationAction(text: "Mark All Read")] : [], + actions: + showMarkRead ? [LocalNotificationAction(text: "Mark All Read")] : [], ); allToast!.onClick = () async { @@ -685,7 +799,9 @@ class NotificationsService extends GetxService { return; } else { final notifs = await flnp.getActiveNotifications(); - if (notifs.firstWhereOrNull((element) => element.id == -2) != null) return; + if (notifs.firstWhereOrNull((element) => element.id == -2) != null) { + return; + } await flnp.show( -2, title, @@ -694,7 +810,8 @@ class NotificationsService extends GetxService { android: AndroidNotificationDetails( ERROR_CHANNEL, 'Errors', - channelDescription: 'Displays message send failures, connection failures, and more', + channelDescription: + 'Displays message send failures, connection failures, and more', priority: Priority.max, importance: Importance.max, color: HexColor("4990de"), @@ -708,15 +825,18 @@ class NotificationsService extends GetxService { Future notifySignInRequest(api.IdmsRequestedSignIn message) async { var title = message.aps.alert.title.replaceAll("Apple ID", "Apple Account"); - var subtitle = message.aps.alert.body.replaceAll("Apple ID", "Apple Account"); + var subtitle = + message.aps.alert.body.replaceAll("Apple ID", "Apple Account"); try { - var geocode = await pushService.reverseGeocode(message.akdata.lat, message.akdata.lng); + var geocode = await pushService.reverseGeocode( + message.akdata.lat, message.akdata.lng); String text; if (geocode!.administrativeArea != null) { String? city = geocode.locality; if (city != null) { - String? state = geocode.administrativeArea?.substring(0, 2).toUpperCase(); + String? state = + geocode.administrativeArea?.substring(0, 2).toUpperCase(); String? country = geocode.isoCountryCode; if (state != null) { text = "$city, $state"; @@ -729,7 +849,7 @@ class NotificationsService extends GetxService { } else { text = geocode.name!; } - + subtitle = subtitle.replaceAll("%loc%", text); } catch (e, s) { Logger.error("Failed to geocode!", error: e, trace: s); @@ -740,60 +860,96 @@ class NotificationsService extends GetxService { context: Get.context!, barrierDismissible: false, builder: (context) => AlertDialog( - backgroundColor: Get.theme.colorScheme.properSurface, - title: Text(title, style: Get.textTheme.titleLarge), - content: Text( - subtitle, - style: Get.textTheme.bodyLarge, - ), - actions: [ - TextButton( - onPressed: () { - api.teardown2Fa(account: pushService.state!.icloudServices!.account, action: "albtn", txnid: message.txnid); - Get.back(); - }, - child: Text(message.aps.alert.albtn, style: Get.textTheme.bodyLarge!.copyWith(color: Get.theme.colorScheme.primary))), - TextButton( - onPressed: () async { - api.teardown2Fa(account: pushService.state!.icloudServices!.account, action: "defbtn", txnid: message.txnid); - Get.back(); - - var code = await api.approveCircle(state: pushService.state!.activeCircleSessions, account: pushService.state!.icloudServices!.account, txnid: message.txnid); - pushService.authing = true; - var context = Get.context!; - await showDialog( - context: context, - builder: (_) { - return AlertDialog( - actions: [ - TextButton( - child: Text("OK", style: context.theme.textTheme.bodyLarge!.copyWith(color: context.theme.colorScheme.primary)), - onPressed: () async { - Get.back(); - }, + backgroundColor: Get.theme.colorScheme.properSurface, + title: Text(title, style: Get.textTheme.titleLarge), + content: Text( + subtitle, + style: Get.textTheme.bodyLarge, + ), + actions: [ + TextButton( + onPressed: () { + api.teardown2Fa( + account: pushService.state!.icloudServices!.account, + action: "albtn", + txnid: message.txnid); + Get.back(); + }, + child: Text(message.aps.alert.albtn, + style: Get.textTheme.bodyLarge! + .copyWith(color: Get.theme.colorScheme.primary))), + TextButton( + onPressed: () async { + api.teardown2Fa( + account: pushService.state!.icloudServices!.account, + action: "defbtn", + txnid: message.txnid); + Get.back(); + + var code = await api.approveCircle( + state: pushService.state!.activeCircleSessions, + account: pushService.state!.icloudServices!.account, + txnid: message.txnid); + pushService.authing = true; + var context = Get.context!; + await showDialog( + context: context, + builder: (_) { + return AlertDialog( + actions: [ + TextButton( + child: Text("OK", + style: context + .theme.textTheme.bodyLarge! + .copyWith( + color: context.theme.colorScheme + .primary)), + onPressed: () async { + Get.back(); + }, + ), + ], + content: Column( + mainAxisSize: MainAxisSize.min, + children: [ + Text( + "Use this code to log into your Apple Account on another device.", + style: context.textTheme.bodyLarge, + ), + const SizedBox( + height: 30, + ), + Text( + code.toString().padLeft(6, '0'), + style: context.textTheme.displaySmall + ?.copyWith( + color: context + .textTheme.bodyLarge?.color, + letterSpacing: 20), + ), + const SizedBox( + height: 30, + ), + Text( + "Do not share it with anyone. Apple will never call or text you for this code.", + style: context.textTheme.bodyLarge, ), ], - content: Column( - mainAxisSize: MainAxisSize.min, - children: [ - Text("Use this code to log into your Apple Account on another device.", style: context.textTheme.bodyLarge,), - const SizedBox(height: 30,), - Text(code.toString().padLeft(6, '0'), style: context.textTheme.displaySmall?.copyWith(color: context.textTheme.bodyLarge?.color, letterSpacing: 20),), - const SizedBox(height: 30,), - Text("Do not share it with anyone. Apple will never call or text you for this code.", style: context.textTheme.bodyLarge,), - ], - ), - title: Text("Verification code", style: context.theme.textTheme.titleLarge), - backgroundColor: context.theme.colorScheme.properSurface, - ); - } - ); - - pushService.authing = false; - }, - child: Text(message.aps.alert.defbtn, style: Get.textTheme.bodyLarge!.copyWith(color: Get.theme.colorScheme.primary))) - ], - )); + ), + title: Text("Verification code", + style: context.theme.textTheme.titleLarge), + backgroundColor: + context.theme.colorScheme.properSurface, + ); + }); + + pushService.authing = false; + }, + child: Text(message.aps.alert.defbtn, + style: Get.textTheme.bodyLarge! + .copyWith(color: Get.theme.colorScheme.primary))) + ], + )); if (socketToast != null) return; socketToast = LocalNotification( @@ -832,28 +988,27 @@ class NotificationsService extends GetxService { } const AndroidNotificationDetails androidPlatformChannelSpecifics = - AndroidNotificationDetails( - SYNC_STATUS_CHANNEL, // channel ID - 'Sync Status', // channel name - channelDescription: 'View the status of iCloud syncing.', - channelShowBadge: false, - importance: Importance.low, - priority: Priority.low, - onlyAlertOnce: true, - showProgress: true, - indeterminate: true, // 👈 this makes it indeterminate - ); + AndroidNotificationDetails( + SYNC_STATUS_CHANNEL, // channel ID + 'Sync Status', // channel name + channelDescription: 'View the status of iCloud syncing.', + channelShowBadge: false, + importance: Importance.low, + priority: Priority.low, + onlyAlertOnce: true, + showProgress: true, + indeterminate: true, // 👈 this makes it indeterminate + ); const NotificationDetails platformChannelSpecifics = NotificationDetails(android: androidPlatformChannelSpecifics); await flnp.show( - -3 - 50, // OB - 'Syncing with iCloud', - status, - platformChannelSpecifics, - payload: "-53" - ); + -3 - 50, // OB + 'Syncing with iCloud', + status, + platformChannelSpecifics, + payload: "-53"); } Future createSyncFailed(String status) async { @@ -862,14 +1017,14 @@ class NotificationsService extends GetxService { } const AndroidNotificationDetails androidPlatformChannelSpecifics = - AndroidNotificationDetails( - SYNC_STATUS_CHANNEL, // channel ID - 'Sync Status', // channel name - channelDescription: 'View the status of iCloud syncing.', - channelShowBadge: false, - importance: Importance.low, - priority: Priority.low, - ); + AndroidNotificationDetails( + SYNC_STATUS_CHANNEL, // channel ID + 'Sync Status', // channel name + channelDescription: 'View the status of iCloud syncing.', + channelShowBadge: false, + importance: Importance.low, + priority: Priority.low, + ); const NotificationDetails platformChannelSpecifics = NotificationDetails(android: androidPlatformChannelSpecifics); @@ -882,7 +1037,8 @@ class NotificationsService extends GetxService { ); } - Future createMissedCallNotification(String name, String callUuid) async { + Future createMissedCallNotification( + String name, String callUuid) async { const text = "Missed FaceTime Call"; if (kIsDesktop) { @@ -908,7 +1064,6 @@ class NotificationsService extends GetxService { final numeric = callUuid.numericOnly(); var notifId = int.parse(numeric.substring(0, min(8, numeric.length))) + 2; - await mcs.invokeMethod("create-missed-facetime-notification", { "channel_id": FACETIME_CHANNEL, "notification_id": notifId, @@ -921,7 +1076,9 @@ class NotificationsService extends GetxService { Future createAliasesRemovedNotification(List aliases) async { const title = "iMessage alias deregistered!"; const notifId = -3; - final text = aliases.length == 1 ? "${aliases[0]} has been deregistered!" : "The following aliases have been deregistered:\n${aliases.join("\n")}"; + final text = aliases.length == 1 + ? "${aliases[0]} has been deregistered!" + : "The following aliases have been deregistered:\n${aliases.join("\n")}"; if (kIsDesktop) { if (aliasesToast?.body == text) { @@ -943,37 +1100,38 @@ class NotificationsService extends GetxService { await aliasesToast!.show(); } else { - final notifs = await flnp.getActiveNotifications(); + final notifs = await flnp.getActiveNotifications(); - //Already have this notification - if (notifs.firstWhereOrNull((n) => n.id == notifId && n.body == text) != null) { - return; - } + //Already have this notification + if (notifs.firstWhereOrNull((n) => n.id == notifId && n.body == text) != + null) { + return; + } - await flnp.show( - notifId, - title, - text, - NotificationDetails( - android: AndroidNotificationDetails( - ERROR_CHANNEL, - 'Errors', - channelDescription: 'Displays message send failures, connection failures, and more', + await flnp.show( + notifId, + title, + text, + NotificationDetails( + android: AndroidNotificationDetails(ERROR_CHANNEL, 'Errors', + channelDescription: + 'Displays message send failures, connection failures, and more', priority: Priority.max, importance: Importance.max, color: HexColor("4990de"), ongoing: false, onlyAlertOnce: false, - styleInformation: const BigTextStyleInformation('') - ), - ), - ); + styleInformation: const BigTextStyleInformation('')), + ), + ); } } Future createFailedToSend(Chat chat, {bool scheduled = false}) async { final title = 'Failed to send${scheduled ? " scheduled" : ""} message'; - final subtitle = scheduled ? 'Tap to open scheduled messages list' : 'Tap to see more details or retry'; + final subtitle = scheduled + ? 'Tap to open scheduled messages list' + : 'Tap to see more details or retry'; if (kIsDesktop) { failedToast = LocalNotification( title: title, @@ -1010,14 +1168,15 @@ class NotificationsService extends GetxService { return; } await flnp.show( - (chat.id! + 75000) * (scheduled ? -1 : 1), + (chat.id! + 75000) * (scheduled ? -1 : 1), title, subtitle, NotificationDetails( android: AndroidNotificationDetails( ERROR_CHANNEL, 'Errors', - channelDescription: 'Displays message send failures, connection failures, and more', + channelDescription: + 'Displays message send failures, connection failures, and more', priority: Priority.max, importance: Importance.max, color: HexColor("4990de"), @@ -1029,17 +1188,15 @@ class NotificationsService extends GetxService { void clearRegisterFailed() { if (Platform.isAndroid) { - mcs.invokeMethod( - "delete-notification", - { - "notification_id": -1 - 50, - } - ); + mcs.invokeMethod("delete-notification", { + "notification_id": -1 - 50, + }); } } Future createRegisterFailed(bool loggedOut) async { - final title = loggedOut ? 'Logged out by Apple!' : 'Failed to renew registration!'; + final title = + loggedOut ? 'Logged out by Apple!' : 'Failed to renew registration!'; const subtitle = 'You can no longer send or receive iMessages. Tap for more info.'; if (kIsDesktop) { @@ -1061,22 +1218,21 @@ class NotificationsService extends GetxService { return; } await flnp.show( - -1 - 50 /* OB */, - title, - subtitle, - NotificationDetails( - android: AndroidNotificationDetails( - ERROR_CHANNEL, - 'Errors', - channelDescription: - 'Displays message send failures, connection failures, and more', - priority: Priority.max, - importance: Importance.max, - color: HexColor("4990de"), + -1 - 50 /* OB */, + title, + subtitle, + NotificationDetails( + android: AndroidNotificationDetails( + ERROR_CHANNEL, + 'Errors', + channelDescription: + 'Displays message send failures, connection failures, and more', + priority: Priority.max, + importance: Importance.max, + color: HexColor("4990de"), + ), ), - ), - payload: loggedOut ? "" : "-51" - ); + payload: loggedOut ? "" : "-51"); } Future cancelRelayCheckReminder() async { @@ -1173,27 +1329,27 @@ class NotificationsService extends GetxService { return; } await flnp.show( - -1 - 50 /* OB */, - title, - subtitle, - NotificationDetails( - android: AndroidNotificationDetails( - ERROR_CHANNEL, - 'Errors', - channelDescription: - 'Displays message send failures, connection failures, and more', - priority: Priority.max, - importance: Importance.max, - color: HexColor("4990de"), + -1 - 50 /* OB */, + title, + subtitle, + NotificationDetails( + android: AndroidNotificationDetails( + ERROR_CHANNEL, + 'Errors', + channelDescription: + 'Displays message send failures, connection failures, and more', + priority: Priority.max, + importance: Importance.max, + color: HexColor("4990de"), + ), ), - ), - payload: "-51" - ); + payload: "-51"); } - Future createBeaconInvitation(Handle sender, api.BeaconAttributes attributes) async { + Future createBeaconInvitation( + Handle sender, api.BeaconAttributes attributes) async { const title = "A new item has been shared with you!"; - + final subtitle = "${sender.displayName} has shared the location of ${attributes.name} with you!"; if (kIsDesktop) { @@ -1215,28 +1371,26 @@ class NotificationsService extends GetxService { return; } await flnp.show( - -4 - 50 /* OB */, - title, - subtitle, - NotificationDetails( - android: AndroidNotificationDetails( - SHARED_BEACONS_CHANNEL, - 'Shared Items', - channelDescription: - 'Displays invitations and updates for shared items.', - priority: Priority.max, - importance: Importance.max, - color: HexColor("4990de"), + -4 - 50 /* OB */, + title, + subtitle, + NotificationDetails( + android: AndroidNotificationDetails( + SHARED_BEACONS_CHANNEL, + 'Shared Items', + channelDescription: + 'Displays invitations and updates for shared items.', + priority: Priority.max, + importance: Importance.max, + color: HexColor("4990de"), + ), ), - ), - payload: "-54" - ); + payload: "-54"); } Future createInvitation(api.SharedAlbum album) async { const title = "Shared albums"; - final subtitle = - "${album.fullname} invited you to join \"${album.name}\""; + final subtitle = "${album.fullname} invited you to join \"${album.name}\""; if (kIsDesktop) { failedToast = LocalNotification( title: title, @@ -1256,22 +1410,21 @@ class NotificationsService extends GetxService { return; } await flnp.show( - -2 - 50 /* OB */, - title, - subtitle, - NotificationDetails( - android: AndroidNotificationDetails( - SHARED_STREAMS_CHANNEL, - 'Shared Albums', - channelDescription: - 'Displays invitations and updates for shared albums.', - priority: Priority.max, - importance: Importance.max, - color: HexColor("4990de"), + -2 - 50 /* OB */, + title, + subtitle, + NotificationDetails( + android: AndroidNotificationDetails( + SHARED_STREAMS_CHANNEL, + 'Shared Albums', + channelDescription: + 'Displays invitations and updates for shared albums.', + priority: Priority.max, + importance: Importance.max, + color: HexColor("4990de"), + ), ), - ), - payload: "-52" - ); + payload: "-52"); } Future clearSocketError() async { diff --git a/lib/services/backend/queue/incoming_queue.dart b/lib/services/backend/queue/incoming_queue.dart index df9376444a..fc83dea031 100644 --- a/lib/services/backend/queue/incoming_queue.dart +++ b/lib/services/backend/queue/incoming_queue.dart @@ -12,9 +12,9 @@ class IncomingQueue extends Queue { Future prepItem(QueueItem _) async {} @override - Future handleQueueItem(QueueItem _) async { - assert(_ is IncomingItem); - final item = _ as IncomingItem; + Future handleQueueItem(QueueItem queueItem) async { + assert(queueItem is IncomingItem); + final item = queueItem as IncomingItem; switch (item.type) { case QueueType.newMessage: diff --git a/lib/services/backend/queue/outgoing_queue.dart b/lib/services/backend/queue/outgoing_queue.dart index 9ff68b6b27..1f19e95657 100644 --- a/lib/services/backend/queue/outgoing_queue.dart +++ b/lib/services/backend/queue/outgoing_queue.dart @@ -11,9 +11,9 @@ OutgoingQueue outq = Get.isRegistered() ? Get.find class OutgoingQueue extends Queue { @override - Future prepItem(QueueItem _) async { - assert(_ is OutgoingItem); - final item = _ as OutgoingItem; + Future prepItem(QueueItem queueItem) async { + assert(queueItem is OutgoingItem); + final item = queueItem as OutgoingItem; switch (item.type) { case QueueType.sendMultipart: @@ -53,9 +53,9 @@ class OutgoingQueue extends Queue { } @override - Future handleQueueItem(QueueItem _) async { - assert(_ is OutgoingItem); - final item = _ as OutgoingItem; + Future handleQueueItem(QueueItem queueItem) async { + assert(queueItem is OutgoingItem); + final item = queueItem as OutgoingItem; switch (item.type) { case QueueType.sendMessage: @@ -69,4 +69,4 @@ class OutgoingQueue extends Queue { break; } } -} \ No newline at end of file +} diff --git a/lib/services/network/download_file_utils.dart b/lib/services/network/download_file_utils.dart new file mode 100644 index 0000000000..52e0b7130b --- /dev/null +++ b/lib/services/network/download_file_utils.dart @@ -0,0 +1,92 @@ +import 'dart:io'; +import 'dart:typed_data'; + +int _stagingFileCounter = 0; + +/// Makes a completed download available at [targetPath] before consumers are +/// notified. Byte-backed downloads are staged next to the destination and +/// promoted only after a non-empty file has been written. +Future materializeDownloadedFile({ + required String targetPath, + Uint8List? bytes, + String? sourcePath, +}) async { + final target = File(targetPath); + + if (bytes != null && bytes.isNotEmpty) { + await _stageAndPromote( + target, + (stagingPath) => File(stagingPath).writeAsBytes(bytes, flush: true), + ); + } else if (!await _isNonEmpty(target)) { + final source = sourcePath == null ? null : File(sourcePath); + if (source == null || !await _isNonEmpty(source)) { + throw FileSystemException( + 'Downloaded attachment is missing or empty', + targetPath, + ); + } + + if (!_samePath(source.path, target.path)) { + await _stageAndPromote( + target, + (stagingPath) => source.copy(stagingPath), + ); + } + } + + if (!await _isNonEmpty(target)) { + throw FileSystemException( + 'Downloaded attachment is missing or empty', + targetPath, + ); + } + return target; +} + +Future _stageAndPromote( + File target, + Future Function(String stagingPath) writeStagingFile, +) async { + await target.parent.create(recursive: true); + final staging = File( + '${target.path}.download-$pid-' + '${DateTime.now().microsecondsSinceEpoch}-${_stagingFileCounter++}.part', + ); + + try { + await writeStagingFile(staging.path); + if (!await _isNonEmpty(staging)) { + throw FileSystemException( + 'Downloaded attachment staging file is empty', + staging.path, + ); + } + + try { + await staging.rename(target.path); + } on FileSystemException { + // Dart replaces existing files on supported Windows versions. Retain a + // narrow fallback for filesystems that reject replacement by rename. + if (await target.exists()) await target.delete(); + await staging.rename(target.path); + } + } finally { + if (await staging.exists()) { + await staging.delete(); + } + } +} + +Future _isNonEmpty(File file) async { + return await file.exists() && await file.length() > 0; +} + +bool _samePath(String first, String second) { + final firstAbsolute = File(first).absolute.path; + final secondAbsolute = File(second).absolute.path; + if (Platform.isWindows) { + return firstAbsolute.toLowerCase() == secondAbsolute.toLowerCase(); + } + return firstAbsolute == secondAbsolute; +} diff --git a/lib/services/network/downloads_service.dart b/lib/services/network/downloads_service.dart index a44049d3df..dc4b1262e5 100644 --- a/lib/services/network/downloads_service.dart +++ b/lib/services/network/downloads_service.dart @@ -1,4 +1,5 @@ import 'package:bluebubbles/services/network/backend_service.dart'; +import 'package:bluebubbles/services/network/download_file_utils.dart'; import 'package:bluebubbles/utils/logger/logger.dart'; import 'package:bluebubbles/helpers/helpers.dart'; import 'package:bluebubbles/database/models.dart'; @@ -114,8 +115,20 @@ class AttachmentDownloadController extends GetxController { stopwatch.start(); PlatformFile response; try { - response = await backend.downloadAttachment(attachment, - onReceiveProgress: (count, total) => setProgress(kIsWeb ? (count / total) : (count / attachment.totalBytes!))); + response = await backend.downloadAttachment( + attachment, + onReceiveProgress: (count, total) => setProgress( + kIsWeb ? (count / total) : (count / attachment.totalBytes!), + ), + ); + if (!kIsWeb) { + final file = await materializeDownloadedFile( + targetPath: attachment.path, + bytes: response.bytes, + sourcePath: response.path, + ); + response.path = file.path; + } } catch (e, stack) { Logger.error("Attachment fetch error", error: e, trace: stack); if (!kIsWeb) { @@ -132,11 +145,6 @@ class AttachmentDownloadController extends GetxController { attachmentDownloader._removeFromQueue(this); return; } - if (!kIsWeb && !kIsDesktop && response.path == null) { - File _file = await File(attachment.path).create(recursive: true); - await _file.writeAsBytes(response.bytes!); - response.path = attachment.path; - } Logger.info("Finished fetching attachment"); stopwatch.stop(); Logger.info("Attachment downloaded in ${stopwatch.elapsedMilliseconds} ms"); @@ -159,12 +167,6 @@ class AttachmentDownloadController extends GetxController { for (Function f in completeFuncs) { f.call(file.value); } - if (kIsDesktop) { - if (attachment.bytes != null) { - File _file = await File(attachment.path).create(recursive: true); - await _file.writeAsBytes(attachment.bytes!.toList()); - } - } if (ss.settings.autoSave.value && !kIsWeb && !kIsDesktop diff --git a/lib/services/rustpush/apple_network_health.dart b/lib/services/rustpush/apple_network_health.dart new file mode 100644 index 0000000000..3947d6da67 --- /dev/null +++ b/lib/services/rustpush/apple_network_health.dart @@ -0,0 +1,21 @@ +enum AppleNetworkHealth { + unknown, + connected, + fallback, + reconnecting, + blocked, + offline, +} + +AppleNetworkHealth classifyAppleNetworkHealth( + String state, + int? activePort, +) { + return switch (state) { + "connected" when activePort == 443 => AppleNetworkHealth.fallback, + "connected" => AppleNetworkHealth.connected, + "reconnecting" => AppleNetworkHealth.reconnecting, + "blocked" || "closed" => AppleNetworkHealth.blocked, + _ => AppleNetworkHealth.unknown, + }; +} diff --git a/lib/services/rustpush/cloud_message_upload_state.dart b/lib/services/rustpush/cloud_message_upload_state.dart new file mode 100644 index 0000000000..74275fcb52 --- /dev/null +++ b/lib/services/rustpush/cloud_message_upload_state.dart @@ -0,0 +1,77 @@ +import 'package:synchronized/synchronized.dart'; + +class CloudKitOperationCoordinator { + final Lock _lock = Lock(); + + Future run(Future Function() operation) => _lock.synchronized(operation); +} + +class CloudMessageSaveOutcome { + final Set confirmedRecordIds; + final Set retryableRecordIds; + + const CloudMessageSaveOutcome({ + required this.confirmedRecordIds, + required this.retryableRecordIds, + }); + + factory CloudMessageSaveOutcome.fromResponse({ + required Iterable attemptedRecordIds, + required Map response, + }) { + final attempted = attemptedRecordIds.toSet(); + final confirmed = attempted.where((recordId) => response[recordId] == true).toSet(); + + return CloudMessageSaveOutcome( + confirmedRecordIds: confirmed, + // A missing result is not confirmation. Keep it retryable just like an + // explicit failure so transient or partial CloudKit responses cannot + // silently strand a local message. + retryableRecordIds: attempted.difference(confirmed), + ); + } +} + +class CloudAttachmentSaveOutcome { + final Set confirmedRecordIds; + final Set retryableRecordIds; + final Set retryableMessageRecordIds; + + const CloudAttachmentSaveOutcome({ + required this.confirmedRecordIds, + required this.retryableRecordIds, + required this.retryableMessageRecordIds, + }); + + factory CloudAttachmentSaveOutcome.fromResponse({ + required Iterable attemptedRecordIds, + required Map response, + required Map messageRecordIdByAttachmentRecordId, + }) { + final recordOutcome = CloudMessageSaveOutcome.fromResponse( + attemptedRecordIds: attemptedRecordIds, + response: response, + ); + + return CloudAttachmentSaveOutcome( + confirmedRecordIds: recordOutcome.confirmedRecordIds, + retryableRecordIds: recordOutcome.retryableRecordIds, + retryableMessageRecordIds: recordOutcome.retryableRecordIds + .map((recordId) => messageRecordIdByAttachmentRecordId[recordId]) + .whereType() + .toSet(), + ); + } +} + +class CloudMessageUploadBatchResult { + final int confirmedCount; + final int retryableCount; + + const CloudMessageUploadBatchResult({ + required this.confirmedCount, + required this.retryableCount, + }); + + bool get madeProgress => confirmedCount > 0; +} diff --git a/lib/services/rustpush/cloud_sync/cloud_associated_message_parent_reference.dart b/lib/services/rustpush/cloud_sync/cloud_associated_message_parent_reference.dart new file mode 100644 index 0000000000..74d9212c61 --- /dev/null +++ b/lib/services/rustpush/cloud_sync/cloud_associated_message_parent_reference.dart @@ -0,0 +1,150 @@ +/// A validated CloudKit reference to the local parent of an associated message. +/// +/// Apple encodes the reference as `p:/` when the reaction +/// targets a specific part, `bp:/` for a bubble or tapback +/// message, and as a bare `` when it targets the message as a +/// whole. The raw envelope is accepted only at the parsing +/// boundary and is never retained. In particular, diagnostic rendering must not +/// reveal the message GUID. +final class CloudAssociatedMessageParentReference { + const CloudAssociatedMessageParentReference._({ + required this.part, + required this.localMessageGuid, + }); + + /// A conservative bound that prevents an untrusted CloudKit field from + /// becoming an unbounded local identifier. + static const int maximumGuidCodeUnits = 512; + static const int _maximumPartDigits = 19; + + /// Null when Apple sent a bare GUID, meaning the reaction targets the whole + /// message rather than one of its parts. + final int? part; + final String localMessageGuid; + + static CloudAssociatedMessageParentReference parse(String encoded) { + const prefix = 'p:'; + const bubblePrefix = 'bp:'; + const separatorLength = 1; + // Bound against the longer prefix so a maximal `bp:` value is not rejected + // one code unit early. + const maximumEncodedCodeUnits = + bubblePrefix.length + + _maximumPartDigits + + separatorLength + + maximumGuidCodeUnits; + if (encoded.length > maximumEncodedCodeUnits) { + throw const CloudAssociatedMessageParentReferenceFormatException(); + } + + // Apple uses `p:` for an ordinary message part and `bp:` for a bubble or + // tapback message. Both name a parent GUID and a part, and this app's JSON + // ingestion path has always stripped `bp:` for that reason. `bpdi:` is the + // balloon payload reference and is deliberately not accepted. + final matchedPrefix = encoded.startsWith(prefix) + ? prefix + : (encoded.startsWith(bubblePrefix) ? bubblePrefix : null); + + if (matchedPrefix == null) { + // The partless form is a bare GUID. It must carry no structure of its + // own, or a malformed wrapper such as `0/` or `bpdi:0/` + // would be accepted whole as the parent identifier. + if (encoded.contains('/') || + encoded.contains(':') || + !_isValidGuid(encoded)) { + throw const CloudAssociatedMessageParentReferenceFormatException(); + } + return CloudAssociatedMessageParentReference._( + part: null, + localMessageGuid: encoded, + ); + } + + final separator = encoded.indexOf('/', matchedPrefix.length); + if (separator == -1 || + encoded.indexOf('/', separator + 1) != -1 || + separator == matchedPrefix.length) { + throw const CloudAssociatedMessageParentReferenceFormatException(); + } + + final encodedPart = encoded.substring(matchedPrefix.length, separator); + // Reject a non-canonical part spelling. The native parser rejects leading + // zeros, and accepting them here made `p:0003/` convert on one side + // of the bridge and quarantine on the other. + if (encodedPart.length > _maximumPartDigits || + !_isAsciiDecimal(encodedPart) || + (encodedPart.length > 1 && encodedPart.startsWith('0'))) { + throw const CloudAssociatedMessageParentReferenceFormatException(); + } + final part = int.tryParse(encodedPart); + if (part == null || part < 0) { + throw const CloudAssociatedMessageParentReferenceFormatException(); + } + + final guid = encoded.substring(separator + 1); + if (!_isValidGuid(guid)) { + throw const CloudAssociatedMessageParentReferenceFormatException(); + } + + return CloudAssociatedMessageParentReference._( + part: part, + localMessageGuid: guid, + ); + } + + static bool _isAsciiDecimal(String value) { + for (final codeUnit in value.codeUnits) { + if (codeUnit < 0x30 || codeUnit > 0x39) return false; + } + return value.isNotEmpty; + } + + static bool _isValidGuid(String value) { + if (value.isEmpty || value.length > maximumGuidCodeUnits) return false; + for (final codeUnit in value.codeUnits) { + if (codeUnit <= 0x20 || + (codeUnit >= 0x7f && codeUnit <= 0x9f) || + codeUnit == 0x2028 || + codeUnit == 0x2029) { + return false; + } + } + return true; + } + + @override + bool operator ==(Object other) => + other is CloudAssociatedMessageParentReference && + other.part == part && + other.localMessageGuid == localMessageGuid; + + @override + int get hashCode => Object.hash(part, localMessageGuid); + + @override + String toString() => 'CloudAssociatedMessageParentReference(redacted)'; +} + +/// A deliberately redacted parse failure. +/// +/// A single safe code is used for every rejected shape so logs cannot expose +/// either the raw CloudKit value or which portion of it was accepted. +final class CloudAssociatedMessageParentReferenceFormatException + implements FormatException { + const CloudAssociatedMessageParentReferenceFormatException(); + + static const String safeCode = 'invalid_associated_message_parent_reference'; + + @override + String get message => safeCode; + + @override + int? get offset => null; + + @override + Object? get source => null; + + @override + String toString() => + 'CloudAssociatedMessageParentReferenceFormatException($safeCode)'; +} diff --git a/lib/services/rustpush/cloud_sync/cloud_attachment_materialization.dart b/lib/services/rustpush/cloud_sync/cloud_attachment_materialization.dart new file mode 100644 index 0000000000..5204bd8d04 --- /dev/null +++ b/lib/services/rustpush/cloud_sync/cloud_attachment_materialization.dart @@ -0,0 +1,462 @@ +import 'cloud_sync_models.dart'; + +enum CloudAttachmentMaterializationStage { + metadataReady, + tempStreaming, + contentVerified, + filePlaced, + referenced, +} + +enum CloudAttachmentRecoveryAction { + startFromZero, + resumeFromVerifiedBoundary, + verifyThenPlace, + referencePlacedFile, + complete, +} + +enum CloudAttachmentMaterializationFailureCode { + invalidTransition, + invalidBoundary, + sizeMismatch, + generationMismatch, + protectedReferenceMismatch, +} + +/// Typed, content-free attachment state failure. +/// +/// It deliberately exposes only an allowlisted code. Paths, CloudKit record +/// identifiers, MMCS tokens, signatures, and attachment names must not enter +/// diagnostics through this exception. +final class CloudAttachmentMaterializationFailure implements Exception { + const CloudAttachmentMaterializationFailure(this.code); + + final CloudAttachmentMaterializationFailureCode code; + + @override + String toString() => + 'CloudAttachmentMaterializationFailure(${code.name}, redacted)'; +} + +/// Restart plan derived without touching the filesystem. +/// +/// The caller must validate or truncate the actual temporary file before +/// resuming. A verified byte offset is useful only together with the protected +/// native resume manifest referenced by the snapshot. +final class CloudAttachmentRecoveryPlan { + const CloudAttachmentRecoveryPlan({ + required this.action, + required this.resumeOffset, + this.truncateTempToBytes, + }); + + final CloudAttachmentRecoveryAction action; + final int resumeOffset; + final int? truncateTempToBytes; +} + +/// Durable, content-free state for one incoming Cloud Sync attachment. +/// +/// Raw filesystem paths and native MMCS metadata are represented only by +/// protected references. The verified prefix is always contiguous, so a crash +/// can resume from a complete native-verified chunk boundary without trusting +/// an arbitrary partial tail. +final class CloudAttachmentMaterialization { + CloudAttachmentMaterialization.metadata({ + required this.scope, + required this.generation, + required this.logicalEntityKeyHash, + required this.expectedBytes, + required this.expectedIntegrityTagHash, + required this.updatedAt, + }) : stage = CloudAttachmentMaterializationStage.metadataReady, + verifiedBytes = 0, + protectedTempReference = null, + protectedResumeManifestReference = null, + protectedContentVerificationReference = null, + protectedFinalReference = null { + _validateBase(); + } + + factory CloudAttachmentMaterialization.restore({ + required CloudSyncScope scope, + required int generation, + required String logicalEntityKeyHash, + required int expectedBytes, + required String expectedIntegrityTagHash, + required CloudAttachmentMaterializationStage stage, + required int verifiedBytes, + required DateTime updatedAt, + String? protectedTempReference, + String? protectedResumeManifestReference, + String? protectedContentVerificationReference, + String? protectedFinalReference, + }) { + final value = CloudAttachmentMaterialization._( + scope: scope, + generation: generation, + logicalEntityKeyHash: logicalEntityKeyHash, + expectedBytes: expectedBytes, + expectedIntegrityTagHash: expectedIntegrityTagHash, + stage: stage, + verifiedBytes: verifiedBytes, + protectedTempReference: protectedTempReference, + protectedResumeManifestReference: protectedResumeManifestReference, + protectedContentVerificationReference: + protectedContentVerificationReference, + protectedFinalReference: protectedFinalReference, + updatedAt: updatedAt, + ); + value._validateRestored(); + return value; + } + + const CloudAttachmentMaterialization._({ + required this.scope, + required this.generation, + required this.logicalEntityKeyHash, + required this.expectedBytes, + required this.expectedIntegrityTagHash, + required this.stage, + required this.verifiedBytes, + required this.updatedAt, + this.protectedTempReference, + this.protectedResumeManifestReference, + this.protectedContentVerificationReference, + this.protectedFinalReference, + }); + + final CloudSyncScope scope; + final int generation; + final String logicalEntityKeyHash; + final int expectedBytes; + + /// Keyed digest of the native integrity tag, never the MMCS signature itself. + final String expectedIntegrityTagHash; + final CloudAttachmentMaterializationStage stage; + + /// Contiguous bytes verified by native MMCS chunk validation. + final int verifiedBytes; + final String? protectedTempReference; + final String? protectedResumeManifestReference; + final String? protectedContentVerificationReference; + final String? protectedFinalReference; + final DateTime updatedAt; + + CloudAttachmentMaterialization beginStreaming({ + required int activeGeneration, + required String protectedTempReference, + required String protectedResumeManifestReference, + required DateTime now, + }) { + _requireGeneration(activeGeneration); + _requireProtectedReference(protectedTempReference); + _requireProtectedReference(protectedResumeManifestReference); + if (stage == CloudAttachmentMaterializationStage.tempStreaming) { + if (this.protectedTempReference == protectedTempReference && + this.protectedResumeManifestReference == + protectedResumeManifestReference && + verifiedBytes == 0) { + return this; + } + throw const CloudAttachmentMaterializationFailure( + CloudAttachmentMaterializationFailureCode.protectedReferenceMismatch, + ); + } + _requireStage(CloudAttachmentMaterializationStage.metadataReady); + return _copy( + stage: CloudAttachmentMaterializationStage.tempStreaming, + protectedTempReference: protectedTempReference, + protectedResumeManifestReference: protectedResumeManifestReference, + updatedAt: now, + ); + } + + CloudAttachmentMaterialization recordVerifiedBoundary({ + required int activeGeneration, + required int cumulativeVerifiedBytes, + required String protectedResumeManifestReference, + required DateTime now, + }) { + _requireGeneration(activeGeneration); + _requireStage(CloudAttachmentMaterializationStage.tempStreaming); + _requireProtectedReference(protectedResumeManifestReference); + if (cumulativeVerifiedBytes == verifiedBytes) { + if (this.protectedResumeManifestReference == + protectedResumeManifestReference) { + return this; + } + throw const CloudAttachmentMaterializationFailure( + CloudAttachmentMaterializationFailureCode.protectedReferenceMismatch, + ); + } + if (cumulativeVerifiedBytes <= verifiedBytes || + cumulativeVerifiedBytes > expectedBytes) { + throw const CloudAttachmentMaterializationFailure( + CloudAttachmentMaterializationFailureCode.invalidBoundary, + ); + } + return _copy( + verifiedBytes: cumulativeVerifiedBytes, + protectedResumeManifestReference: protectedResumeManifestReference, + updatedAt: now, + ); + } + + CloudAttachmentMaterialization markContentVerified({ + required int activeGeneration, + required String protectedContentVerificationReference, + required DateTime now, + }) { + _requireGeneration(activeGeneration); + _requireProtectedReference(protectedContentVerificationReference); + if (stage == CloudAttachmentMaterializationStage.contentVerified) { + if (this.protectedContentVerificationReference == + protectedContentVerificationReference) { + return this; + } + throw const CloudAttachmentMaterializationFailure( + CloudAttachmentMaterializationFailureCode.protectedReferenceMismatch, + ); + } + _requireStage(CloudAttachmentMaterializationStage.tempStreaming); + if (verifiedBytes != expectedBytes) { + throw const CloudAttachmentMaterializationFailure( + CloudAttachmentMaterializationFailureCode.sizeMismatch, + ); + } + return _copy( + stage: CloudAttachmentMaterializationStage.contentVerified, + protectedContentVerificationReference: + protectedContentVerificationReference, + updatedAt: now, + ); + } + + CloudAttachmentMaterialization markFilePlaced({ + required int activeGeneration, + required String protectedFinalReference, + required DateTime now, + }) { + _requireGeneration(activeGeneration); + _requireProtectedReference(protectedFinalReference); + if (stage == CloudAttachmentMaterializationStage.filePlaced) { + if (this.protectedFinalReference == protectedFinalReference) return this; + throw const CloudAttachmentMaterializationFailure( + CloudAttachmentMaterializationFailureCode.protectedReferenceMismatch, + ); + } + _requireStage(CloudAttachmentMaterializationStage.contentVerified); + return _copy( + stage: CloudAttachmentMaterializationStage.filePlaced, + protectedFinalReference: protectedFinalReference, + updatedAt: now, + ); + } + + CloudAttachmentMaterialization markReferenced({ + required int activeGeneration, + required DateTime now, + }) { + _requireGeneration(activeGeneration); + if (stage == CloudAttachmentMaterializationStage.referenced) return this; + _requireStage(CloudAttachmentMaterializationStage.filePlaced); + return _copy( + stage: CloudAttachmentMaterializationStage.referenced, + updatedAt: now, + ); + } + + CloudAttachmentRecoveryPlan recoveryPlan({ + required int activeGeneration, + required int? temporaryFileBytes, + required bool finalFileExists, + }) { + _requireGeneration(activeGeneration); + if (temporaryFileBytes != null && temporaryFileBytes < 0) { + throw const CloudAttachmentMaterializationFailure( + CloudAttachmentMaterializationFailureCode.sizeMismatch, + ); + } + return switch (stage) { + CloudAttachmentMaterializationStage.metadataReady => + const CloudAttachmentRecoveryPlan( + action: CloudAttachmentRecoveryAction.startFromZero, + resumeOffset: 0, + ), + CloudAttachmentMaterializationStage.tempStreaming => _streamingRecovery( + temporaryFileBytes, + ), + CloudAttachmentMaterializationStage.contentVerified => + temporaryFileBytes == expectedBytes + ? CloudAttachmentRecoveryPlan( + action: CloudAttachmentRecoveryAction.verifyThenPlace, + resumeOffset: expectedBytes, + ) + : const CloudAttachmentRecoveryPlan( + action: CloudAttachmentRecoveryAction.startFromZero, + resumeOffset: 0, + truncateTempToBytes: 0, + ), + CloudAttachmentMaterializationStage.filePlaced => + finalFileExists + ? CloudAttachmentRecoveryPlan( + action: CloudAttachmentRecoveryAction.referencePlacedFile, + resumeOffset: expectedBytes, + ) + : temporaryFileBytes == expectedBytes + ? CloudAttachmentRecoveryPlan( + action: CloudAttachmentRecoveryAction.verifyThenPlace, + resumeOffset: expectedBytes, + ) + : const CloudAttachmentRecoveryPlan( + action: CloudAttachmentRecoveryAction.startFromZero, + resumeOffset: 0, + truncateTempToBytes: 0, + ), + CloudAttachmentMaterializationStage.referenced => + CloudAttachmentRecoveryPlan( + action: CloudAttachmentRecoveryAction.complete, + resumeOffset: expectedBytes, + ), + }; + } + + CloudAttachmentRecoveryPlan _streamingRecovery(int? temporaryFileBytes) { + if (temporaryFileBytes == null || temporaryFileBytes < verifiedBytes) { + return const CloudAttachmentRecoveryPlan( + action: CloudAttachmentRecoveryAction.startFromZero, + resumeOffset: 0, + truncateTempToBytes: 0, + ); + } + return CloudAttachmentRecoveryPlan( + action: CloudAttachmentRecoveryAction.resumeFromVerifiedBoundary, + resumeOffset: verifiedBytes, + truncateTempToBytes: temporaryFileBytes == verifiedBytes + ? null + : verifiedBytes, + ); + } + + CloudAttachmentMaterialization _copy({ + CloudAttachmentMaterializationStage? stage, + int? verifiedBytes, + String? protectedTempReference, + String? protectedResumeManifestReference, + String? protectedContentVerificationReference, + String? protectedFinalReference, + required DateTime updatedAt, + }) { + return CloudAttachmentMaterialization._( + scope: scope, + generation: generation, + logicalEntityKeyHash: logicalEntityKeyHash, + expectedBytes: expectedBytes, + expectedIntegrityTagHash: expectedIntegrityTagHash, + stage: stage ?? this.stage, + verifiedBytes: verifiedBytes ?? this.verifiedBytes, + protectedTempReference: + protectedTempReference ?? this.protectedTempReference, + protectedResumeManifestReference: + protectedResumeManifestReference ?? + this.protectedResumeManifestReference, + protectedContentVerificationReference: + protectedContentVerificationReference ?? + this.protectedContentVerificationReference, + protectedFinalReference: + protectedFinalReference ?? this.protectedFinalReference, + updatedAt: updatedAt, + ); + } + + void _validateBase() { + if (generation < 0 || + logicalEntityKeyHash.isEmpty || + expectedBytes < 0 || + expectedIntegrityTagHash.isEmpty) { + throw const CloudAttachmentMaterializationFailure( + CloudAttachmentMaterializationFailureCode.invalidTransition, + ); + } + } + + void _validateRestored() { + _validateBase(); + if (verifiedBytes < 0 || verifiedBytes > expectedBytes) { + throw const CloudAttachmentMaterializationFailure( + CloudAttachmentMaterializationFailureCode.invalidBoundary, + ); + } + switch (stage) { + case CloudAttachmentMaterializationStage.metadataReady: + if (verifiedBytes != 0 || + protectedTempReference != null || + protectedResumeManifestReference != null || + protectedContentVerificationReference != null || + protectedFinalReference != null) { + throw const CloudAttachmentMaterializationFailure( + CloudAttachmentMaterializationFailureCode.invalidTransition, + ); + } + case CloudAttachmentMaterializationStage.tempStreaming: + _requireProtectedReference(protectedTempReference ?? ''); + _requireProtectedReference(protectedResumeManifestReference ?? ''); + if (protectedContentVerificationReference != null || + protectedFinalReference != null) { + throw const CloudAttachmentMaterializationFailure( + CloudAttachmentMaterializationFailureCode.invalidTransition, + ); + } + case CloudAttachmentMaterializationStage.contentVerified: + _requireProtectedReference(protectedTempReference ?? ''); + _requireProtectedReference(protectedResumeManifestReference ?? ''); + _requireProtectedReference(protectedContentVerificationReference ?? ''); + if (verifiedBytes != expectedBytes || protectedFinalReference != null) { + throw const CloudAttachmentMaterializationFailure( + CloudAttachmentMaterializationFailureCode.invalidTransition, + ); + } + case CloudAttachmentMaterializationStage.filePlaced: + case CloudAttachmentMaterializationStage.referenced: + _requireProtectedReference(protectedTempReference ?? ''); + _requireProtectedReference(protectedResumeManifestReference ?? ''); + _requireProtectedReference(protectedContentVerificationReference ?? ''); + _requireProtectedReference(protectedFinalReference ?? ''); + if (verifiedBytes != expectedBytes) { + throw const CloudAttachmentMaterializationFailure( + CloudAttachmentMaterializationFailureCode.invalidTransition, + ); + } + } + } + + void _requireGeneration(int activeGeneration) { + if (activeGeneration != generation) { + throw const CloudAttachmentMaterializationFailure( + CloudAttachmentMaterializationFailureCode.generationMismatch, + ); + } + } + + void _requireStage(CloudAttachmentMaterializationStage expected) { + if (stage != expected) { + throw const CloudAttachmentMaterializationFailure( + CloudAttachmentMaterializationFailureCode.invalidTransition, + ); + } + } + + void _requireProtectedReference(String value) { + if (value.trim().isEmpty) { + throw const CloudAttachmentMaterializationFailure( + CloudAttachmentMaterializationFailureCode.protectedReferenceMismatch, + ); + } + } + + @override + String toString() => + 'CloudAttachmentMaterialization(${stage.name}, redacted)'; +} diff --git a/lib/services/rustpush/cloud_sync/cloud_attachment_materialization_store.dart b/lib/services/rustpush/cloud_sync/cloud_attachment_materialization_store.dart new file mode 100644 index 0000000000..4f97bbd603 --- /dev/null +++ b/lib/services/rustpush/cloud_sync/cloud_attachment_materialization_store.dart @@ -0,0 +1,225 @@ +import 'dart:convert'; + +import 'package:bluebubbles/database/database.dart'; +import 'package:bluebubbles/database/models.dart'; +import 'package:crypto/crypto.dart'; + +import 'cloud_attachment_materialization.dart'; +import 'cloud_sync_models.dart'; + +abstract interface class CloudAttachmentMaterializationStore { + Future read({ + required CloudSyncScope scope, + required int generation, + required String logicalEntityKeyHash, + }); + + /// Creates [initial] if absent. Returns false when an entry already exists. + Future create(CloudAttachmentMaterialization initial); + + /// Atomically replaces [expected] with [next]. + /// + /// Returns false when another process or isolate has already advanced the + /// entry. Callers must reread and derive a new recovery plan. + Future compareAndSwap({ + required CloudAttachmentMaterialization expected, + required CloudAttachmentMaterialization next, + }); +} + +final class ObjectBoxCloudAttachmentMaterializationStore + implements CloudAttachmentMaterializationStore { + ObjectBoxCloudAttachmentMaterializationStore({required Store store}) + : _store = store, + _box = store.box(); + + factory ObjectBoxCloudAttachmentMaterializationStore.fromDatabase() => + ObjectBoxCloudAttachmentMaterializationStore(store: Database.store); + + final Store _store; + final Box _box; + + @override + Future read({ + required CloudSyncScope scope, + required int generation, + required String logicalEntityKeyHash, + }) async { + return _store.runInTransaction(TxMode.read, () { + final entity = _findLocked( + scope: scope, + logicalEntityKeyHash: logicalEntityKeyHash, + ); + if (entity == null || entity.generation != generation) return null; + return _fromEntity(scope, entity); + }); + } + + @override + Future create(CloudAttachmentMaterialization initial) async { + return _store.runInTransaction(TxMode.write, () { + if (_findLocked( + scope: initial.scope, + logicalEntityKeyHash: initial.logicalEntityKeyHash, + ) != + null) { + return false; + } + if (initial.stage != CloudAttachmentMaterializationStage.metadataReady) { + throw const CloudAttachmentMaterializationFailure( + CloudAttachmentMaterializationFailureCode.invalidTransition, + ); + } + _box.put(_toEntity(initial)); + return true; + }); + } + + @override + Future compareAndSwap({ + required CloudAttachmentMaterialization expected, + required CloudAttachmentMaterialization next, + }) async { + _validateSameIdentity(expected, next); + return _store.runInTransaction(TxMode.write, () { + final entity = _findLocked( + scope: expected.scope, + logicalEntityKeyHash: expected.logicalEntityKeyHash, + ); + if (entity == null || !_matches(entity, expected)) return false; + if (next.stage.index < expected.stage.index || + next.verifiedBytes < expected.verifiedBytes) { + throw const CloudAttachmentMaterializationFailure( + CloudAttachmentMaterializationFailureCode.invalidTransition, + ); + } + final replacement = _toEntity(next)..id = entity.id; + _box.put(replacement, mode: PutMode.update); + return true; + }); + } + + CloudAttachmentMaterializationEntity? _findLocked({ + required CloudSyncScope scope, + required String logicalEntityKeyHash, + }) { + final query = _box + .query( + CloudAttachmentMaterializationEntity_.transferKey.equals( + _transferKey(scope, logicalEntityKeyHash), + ), + ) + .build(); + try { + return query.findFirst(); + } finally { + query.close(); + } + } + + CloudAttachmentMaterialization _fromEntity( + CloudSyncScope scope, + CloudAttachmentMaterializationEntity entity, + ) { + if (entity.scopeKey != _scopeKey(scope) || + entity.accountFingerprint != scope.accountFingerprint || + entity.zone != scope.zone || + entity.stage < 0 || + entity.stage >= CloudAttachmentMaterializationStage.values.length) { + throw const CloudAttachmentMaterializationFailure( + CloudAttachmentMaterializationFailureCode.invalidTransition, + ); + } + return CloudAttachmentMaterialization.restore( + scope: scope, + generation: entity.generation, + logicalEntityKeyHash: entity.logicalEntityKeyHash, + expectedBytes: entity.expectedBytes, + expectedIntegrityTagHash: entity.expectedIntegrityTagHash, + stage: CloudAttachmentMaterializationStage.values[entity.stage], + verifiedBytes: entity.verifiedBytes, + protectedTempReference: entity.protectedTempReference, + protectedResumeManifestReference: entity.protectedResumeManifestReference, + protectedContentVerificationReference: + entity.protectedContentVerificationReference, + protectedFinalReference: entity.protectedFinalReference, + updatedAt: DateTime.fromMillisecondsSinceEpoch( + entity.updatedAtMs, + isUtc: true, + ), + ); + } + + CloudAttachmentMaterializationEntity _toEntity( + CloudAttachmentMaterialization value, + ) { + return CloudAttachmentMaterializationEntity( + transferKey: _transferKey(value.scope, value.logicalEntityKeyHash), + scopeKey: _scopeKey(value.scope), + accountFingerprint: value.scope.accountFingerprint, + zone: value.scope.zone, + generation: value.generation, + logicalEntityKeyHash: value.logicalEntityKeyHash, + expectedBytes: value.expectedBytes, + expectedIntegrityTagHash: value.expectedIntegrityTagHash, + stage: value.stage.index, + verifiedBytes: value.verifiedBytes, + protectedTempReference: value.protectedTempReference, + protectedResumeManifestReference: value.protectedResumeManifestReference, + protectedContentVerificationReference: + value.protectedContentVerificationReference, + protectedFinalReference: value.protectedFinalReference, + updatedAtMs: value.updatedAt.toUtc().millisecondsSinceEpoch, + ); + } + + bool _matches( + CloudAttachmentMaterializationEntity entity, + CloudAttachmentMaterialization expected, + ) { + return entity.scopeKey == _scopeKey(expected.scope) && + entity.generation == expected.generation && + entity.logicalEntityKeyHash == expected.logicalEntityKeyHash && + entity.expectedBytes == expected.expectedBytes && + entity.expectedIntegrityTagHash == expected.expectedIntegrityTagHash && + entity.stage == expected.stage.index && + entity.verifiedBytes == expected.verifiedBytes && + entity.protectedTempReference == expected.protectedTempReference && + entity.protectedResumeManifestReference == + expected.protectedResumeManifestReference && + entity.protectedContentVerificationReference == + expected.protectedContentVerificationReference && + entity.protectedFinalReference == expected.protectedFinalReference && + entity.updatedAtMs == expected.updatedAt.toUtc().millisecondsSinceEpoch; + } + + void _validateSameIdentity( + CloudAttachmentMaterialization expected, + CloudAttachmentMaterialization next, + ) { + if (expected.scope != next.scope || + expected.generation != next.generation || + expected.logicalEntityKeyHash != next.logicalEntityKeyHash || + expected.expectedBytes != next.expectedBytes || + expected.expectedIntegrityTagHash != next.expectedIntegrityTagHash) { + throw const CloudAttachmentMaterializationFailure( + CloudAttachmentMaterializationFailureCode.generationMismatch, + ); + } + } + + String _scopeKey(CloudSyncScope scope) => sha256 + .convert(utf8.encode('cloud-sync-scope\u001f${scope.storageKey}')) + .toString(); + + String _transferKey( + CloudSyncScope scope, + String logicalEntityKeyHash, + ) => sha256 + .convert( + utf8.encode( + 'cloud-sync-attachment-transfer\u001f${scope.storageKey}\u001f$logicalEntityKeyHash', + ), + ) + .toString(); +} diff --git a/lib/services/rustpush/cloud_sync/cloud_inbox_applier.dart b/lib/services/rustpush/cloud_sync/cloud_inbox_applier.dart new file mode 100644 index 0000000000..8e8e89db09 --- /dev/null +++ b/lib/services/rustpush/cloud_sync/cloud_inbox_applier.dart @@ -0,0 +1,1074 @@ +import 'dart:typed_data'; + +import 'cloud_merge_policy.dart'; +import 'cloud_sync_models.dart'; +import 'cloud_sync_store.dart'; +import 'cloud_sync_transport.dart'; + +enum CloudDecodedMutationKind { upsert, tombstone } + +enum CloudSemanticFieldState { absent, value, explicitClear } + +enum CloudSemanticService { iMessage } + +enum CloudSemanticChatStyle { direct, group } + +enum CloudSemanticAssociationKind { none, sticker, reactionAdd, reactionRemove } + +final class CloudSemanticKnownMessageFlags { + const CloudSemanticKnownMessageFlags({ + required this.fromMe, + required this.delivered, + required this.read, + required this.hasDataDetectorResults, + required this.deliveredQuietly, + required this.didNotifyRecipient, + }); + + final bool fromMe; + final bool delivered; + final bool read; + final bool hasDataDetectorResults; + final bool deliveredQuietly; + final bool didNotifyRecipient; + + @override + String toString() => 'CloudSemanticKnownMessageFlags(redacted)'; +} + +final class CloudSemanticTextRun { + CloudSemanticTextRun({ + required this.startUtf16, + required this.lengthUtf16, + required this.messagePart, + required this.attachmentCanonicalGuid, + required this.attachmentLogicalKeyHash, + required this.mentionHandle, + required this.audioTranscript, + required this.textEffect, + required this.bold, + required this.italic, + required this.strikethrough, + required this.underline, + }) { + if (startUtf16 < 0 || lengthUtf16 < 0) { + throw ArgumentError('cloud_text_run_range_invalid'); + } + if ((attachmentCanonicalGuid == null) != + (attachmentLogicalKeyHash == null)) { + throw ArgumentError('cloud_text_run_attachment_identity_invalid'); + } + } + + final int startUtf16; + final int lengthUtf16; + final int? messagePart; + final String? attachmentCanonicalGuid; + final String? attachmentLogicalKeyHash; + final String? mentionHandle; + final String? audioTranscript; + final int? textEffect; + final bool? bold; + final bool? italic; + final bool? strikethrough; + final bool? underline; + + @override + String toString() => 'CloudSemanticTextRun(redacted)'; +} + +final class CloudSemanticAttributedBody { + CloudSemanticAttributedBody({ + required this.text, + required Iterable runs, + }) : runs = List.unmodifiable(runs); + + final String text; + final List runs; + + @override + String toString() => 'CloudSemanticAttributedBody(redacted)'; +} + +final class CloudSemanticMessageEdit { + CloudSemanticMessageEdit({ + required this.part, + required this.revision, + required Iterable bodies, + required this.modifiedAt, + required this.originalRangeLocation, + required this.originalRangeLength, + }) : bodies = List.unmodifiable(bodies) { + if (part < 0 || + revision < 0 || + bodies.isEmpty || + (originalRangeLocation == null) != (originalRangeLength == null)) { + throw ArgumentError('cloud_message_edit_invalid'); + } + } + + final int part; + final int revision; + final List bodies; + final DateTime modifiedAt; + final int? originalRangeLocation; + final int? originalRangeLength; + + @override + String toString() => 'CloudSemanticMessageEdit(redacted)'; +} + +void _validateSemanticField( + CloudSemanticFieldState state, + Object? value, + String safeFieldName, +) { + if ((state == CloudSemanticFieldState.value) != (value != null)) { + throw ArgumentError('cloud_semantic_${safeFieldName}_presence_invalid'); + } +} + +void _validateSemanticCollectionField( + CloudSemanticFieldState state, + List value, + String safeFieldName, +) { + if (state != CloudSemanticFieldState.value && value.isNotEmpty) { + throw ArgumentError('cloud_semantic_${safeFieldName}_presence_invalid'); + } +} + +/// Transient user-visible entity data produced by the native decoder. +/// +/// Payloads have no JSON/Map conversion and their string representation is +/// permanently redacted. They may be consumed only by the canonical local-store +/// adapter and must never be placed in Cloud Sync metadata, observability, or +/// exception messages. +sealed class CloudSemanticEntityPayload { + const CloudSemanticEntityPayload(); + + CloudEntityKind get kind; + String get logicalEntityKeyHash; + + @override + String toString() => 'CloudSemanticEntityPayload(${kind.name}, redacted)'; +} + +final class CloudMessageEntityPayload extends CloudSemanticEntityPayload { + CloudMessageEntityPayload({ + required this.logicalEntityKeyHash, + required this.canonicalGuid, + required this.chatAliasKeyHash, + required this.chatIdentifier, + required this.body, + required this.senderHandle, + this.createdAt, + this.error, + this.service, + this.subjectState = CloudSemanticFieldState.absent, + this.subject, + this.bodyState = CloudSemanticFieldState.value, + this.attributedBodiesState = CloudSemanticFieldState.absent, + Iterable attributedBodies = const [], + this.balloonBundleIdState = CloudSemanticFieldState.absent, + this.balloonBundleId, + this.decodedExtensionPayloadState = CloudSemanticFieldState.absent, + Uint8List? decodedExtensionPayload, + this.effectState = CloudSemanticFieldState.absent, + this.effect, + this.readAtState = CloudSemanticFieldState.absent, + this.readAt, + this.deliveredAtState = CloudSemanticFieldState.absent, + this.deliveredAt, + this.knownFlags, + this.associationKind = CloudSemanticAssociationKind.none, + this.associationParentLogicalKeyHash, + this.associationParentCanonicalGuid, + this.associationParentPart, + this.associatedRangeLocation, + this.associatedRangeLength, + this.replyParentLogicalKeyHash, + this.replyParentCanonicalGuid, + this.replyParentPart, + this.editsState = CloudSemanticFieldState.absent, + Iterable edits = const [], + this.retractedPartsState = CloudSemanticFieldState.absent, + Iterable retractedParts = const [], + }) : attributedBodies = List.unmodifiable(attributedBodies), + decodedExtensionPayload = decodedExtensionPayload == null + ? null + : Uint8List.fromList(decodedExtensionPayload), + edits = List.unmodifiable(edits), + retractedParts = List.unmodifiable(retractedParts) { + if (logicalEntityKeyHash.isEmpty) { + throw ArgumentError('cloud_message_payload_logical_key_invalid'); + } + if (canonicalGuid.isEmpty || chatIdentifier.isEmpty) { + throw ArgumentError('cloud_message_payload_canonical_identity_invalid'); + } + if (chatAliasKeyHash.isEmpty) { + throw ArgumentError('cloud_message_payload_chat_key_invalid'); + } + _validateSemanticField(subjectState, subject, 'subject'); + _validateSemanticField(bodyState, body, 'body'); + _validateSemanticCollectionField( + attributedBodiesState, + this.attributedBodies, + 'attributed_bodies', + ); + _validateSemanticField( + balloonBundleIdState, + balloonBundleId, + 'balloon_bundle_id', + ); + _validateSemanticField( + decodedExtensionPayloadState, + this.decodedExtensionPayload, + 'decoded_extension_payload', + ); + _validateSemanticField(effectState, effect, 'effect'); + _validateSemanticField(readAtState, readAt, 'read_at'); + _validateSemanticField(deliveredAtState, deliveredAt, 'delivered_at'); + _validateSemanticCollectionField(editsState, this.edits, 'edits'); + _validateSemanticCollectionField( + retractedPartsState, + this.retractedParts, + 'retracted_parts', + ); + if ((replyParentCanonicalGuid == null) != (replyParentPart == null) || + (replyParentCanonicalGuid == null) != + (replyParentLogicalKeyHash == null)) { + throw ArgumentError('cloud_message_payload_reply_identity_invalid'); + } + final hasAssociationParent = associationParentCanonicalGuid != null; + if (hasAssociationParent != (associationParentLogicalKeyHash != null) || + (associationKind == CloudSemanticAssociationKind.none && + hasAssociationParent) || + (associationKind != CloudSemanticAssociationKind.none && + !hasAssociationParent) || + (!hasAssociationParent && + (associationParentPart != null || + associatedRangeLocation != null || + associatedRangeLength != null)) || + (associatedRangeLocation == null) != (associatedRangeLength == null)) { + throw ArgumentError('cloud_message_payload_association_invalid'); + } + } + + @override + final String logicalEntityKeyHash; + final String canonicalGuid; + final String chatAliasKeyHash; + final String chatIdentifier; + final String? body; + final String senderHandle; + final DateTime? createdAt; + final int? error; + final CloudSemanticService? service; + final CloudSemanticFieldState subjectState; + final String? subject; + final CloudSemanticFieldState bodyState; + final CloudSemanticFieldState attributedBodiesState; + final List attributedBodies; + final CloudSemanticFieldState balloonBundleIdState; + final String? balloonBundleId; + final CloudSemanticFieldState decodedExtensionPayloadState; + final Uint8List? decodedExtensionPayload; + final CloudSemanticFieldState effectState; + final String? effect; + final CloudSemanticFieldState readAtState; + final DateTime? readAt; + final CloudSemanticFieldState deliveredAtState; + final DateTime? deliveredAt; + final CloudSemanticKnownMessageFlags? knownFlags; + final CloudSemanticAssociationKind associationKind; + final String? associationParentLogicalKeyHash; + final String? associationParentCanonicalGuid; + final int? associationParentPart; + final int? associatedRangeLocation; + final int? associatedRangeLength; + final String? replyParentLogicalKeyHash; + final String? replyParentCanonicalGuid; + final String? replyParentPart; + final CloudSemanticFieldState editsState; + final List edits; + final CloudSemanticFieldState retractedPartsState; + final List retractedParts; + + @override + CloudEntityKind get kind => CloudEntityKind.message; +} + +final class CloudChatEntityPayload extends CloudSemanticEntityPayload { + CloudChatEntityPayload({ + required this.logicalEntityKeyHash, + required this.canonicalGuid, + required this.chatIdentifier, + required this.displayName, + required Iterable participantHandles, + this.groupId, + this.originalGroupId, + this.service, + this.style, + CloudSemanticFieldState? displayNameState, + this.lastAddressedHandleState = CloudSemanticFieldState.absent, + this.lastAddressedHandle, + this.groupVersionState = CloudSemanticFieldState.absent, + this.groupVersion, + this.lastSeenMessageGuidState = CloudSemanticFieldState.absent, + this.lastSeenMessageGuid, + this.groupPhotoGuidState = CloudSemanticFieldState.absent, + this.groupPhotoGuid, + }) : displayNameState = + displayNameState ?? + (displayName == null + ? CloudSemanticFieldState.absent + : CloudSemanticFieldState.value), + participantHandles = List.unmodifiable(participantHandles) { + if (logicalEntityKeyHash.isEmpty) { + throw ArgumentError('cloud_chat_payload_logical_key_invalid'); + } + if (canonicalGuid.isEmpty || chatIdentifier.isEmpty) { + throw ArgumentError('cloud_chat_payload_canonical_identity_invalid'); + } + if (this.participantHandles.any((handle) => handle.isEmpty)) { + throw ArgumentError('cloud_chat_payload_participant_invalid'); + } + _validateSemanticField(this.displayNameState, displayName, 'display_name'); + _validateSemanticField( + lastAddressedHandleState, + lastAddressedHandle, + 'last_addressed_handle', + ); + _validateSemanticField(groupVersionState, groupVersion, 'group_version'); + _validateSemanticField( + lastSeenMessageGuidState, + lastSeenMessageGuid, + 'last_seen_message_guid', + ); + _validateSemanticField( + groupPhotoGuidState, + groupPhotoGuid, + 'group_photo_guid', + ); + } + + @override + final String logicalEntityKeyHash; + final String canonicalGuid; + final String chatIdentifier; + final String? groupId; + final String? originalGroupId; + final CloudSemanticService? service; + final CloudSemanticChatStyle? style; + final CloudSemanticFieldState displayNameState; + final String? displayName; + final List participantHandles; + final CloudSemanticFieldState lastAddressedHandleState; + final String? lastAddressedHandle; + final CloudSemanticFieldState groupVersionState; + final int? groupVersion; + final CloudSemanticFieldState lastSeenMessageGuidState; + final String? lastSeenMessageGuid; + final CloudSemanticFieldState groupPhotoGuidState; + final String? groupPhotoGuid; + + @override + CloudEntityKind get kind => CloudEntityKind.chat; +} + +final class CloudAttachmentEntityPayload extends CloudSemanticEntityPayload { + CloudAttachmentEntityPayload({ + required this.logicalEntityKeyHash, + required this.canonicalGuid, + required this.ownerLogicalKeyHash, + required this.ownerCanonicalGuid, + required this.ownerPart, + required this.fileName, + required this.mimeType, + required this.protectedLocalReference, + this.utiState = CloudSemanticFieldState.absent, + this.uti, + this.fileNameState = CloudSemanticFieldState.value, + CloudSemanticFieldState? mimeTypeState, + this.totalBytesState = CloudSemanticFieldState.absent, + this.totalBytes, + this.isOutgoingState = CloudSemanticFieldState.absent, + this.isOutgoing, + this.protectedLocalReferenceState = CloudSemanticFieldState.value, + }) : mimeTypeState = + mimeTypeState ?? + (mimeType == null + ? CloudSemanticFieldState.absent + : CloudSemanticFieldState.value) { + if (logicalEntityKeyHash.isEmpty) { + throw ArgumentError('cloud_attachment_payload_logical_key_invalid'); + } + if (canonicalGuid.isEmpty || + (ownerCanonicalGuid != null && ownerCanonicalGuid!.isEmpty) || + (ownerPart != null && ownerPart! < 0)) { + throw ArgumentError( + 'cloud_attachment_payload_canonical_identity_invalid', + ); + } + final ownerParts = [ + ownerLogicalKeyHash != null, + ownerCanonicalGuid != null, + ownerPart != null, + ]; + if (ownerParts.any((present) => present) && + !ownerParts.every((present) => present)) { + throw ArgumentError('cloud_attachment_payload_owner_identity_invalid'); + } + if (ownerLogicalKeyHash?.isEmpty ?? false) { + throw ArgumentError('cloud_attachment_payload_owner_key_invalid'); + } + _validateSemanticField(utiState, uti, 'uti'); + _validateSemanticField(fileNameState, fileName, 'file_name'); + _validateSemanticField(this.mimeTypeState, mimeType, 'mime_type'); + _validateSemanticField(totalBytesState, totalBytes, 'total_bytes'); + _validateSemanticField(isOutgoingState, isOutgoing, 'is_outgoing'); + _validateSemanticField( + protectedLocalReferenceState, + protectedLocalReference, + 'protected_local_reference', + ); + if (protectedLocalReference?.isEmpty ?? false) { + throw ArgumentError('cloud_attachment_payload_reference_invalid'); + } + } + + @override + final String logicalEntityKeyHash; + final String canonicalGuid; + final String? ownerLogicalKeyHash; + final String? ownerCanonicalGuid; + final int? ownerPart; + final CloudSemanticFieldState utiState; + final String? uti; + final CloudSemanticFieldState fileNameState; + final String? fileName; + final CloudSemanticFieldState mimeTypeState; + final String? mimeType; + final CloudSemanticFieldState totalBytesState; + final int? totalBytes; + final CloudSemanticFieldState isOutgoingState; + final bool? isOutgoing; + final CloudSemanticFieldState protectedLocalReferenceState; + final String? protectedLocalReference; + + @override + CloudEntityKind get kind => CloudEntityKind.attachment; +} + +final class CloudReactionEntityPayload extends CloudSemanticEntityPayload { + CloudReactionEntityPayload({ + required this.logicalEntityKeyHash, + required this.canonicalGuid, + required this.parentLogicalKeyHash, + required this.parentCanonicalGuid, + required this.parentPart, + required this.senderHandle, + required this.reactionType, + this.associatedEmoji, + this.createdAt, + this.error, + this.service, + this.knownFlags, + this.readAtState = CloudSemanticFieldState.absent, + this.readAt, + this.deliveredAtState = CloudSemanticFieldState.absent, + this.deliveredAt, + this.associatedRangeLocation, + this.associatedRangeLength, + }) { + if (logicalEntityKeyHash.isEmpty) { + throw ArgumentError('cloud_reaction_payload_logical_key_invalid'); + } + if (canonicalGuid.isEmpty || + parentCanonicalGuid.isEmpty || + (parentPart != null && parentPart! < 0)) { + throw ArgumentError('cloud_reaction_payload_canonical_identity_invalid'); + } + if (parentLogicalKeyHash.isEmpty) { + throw ArgumentError('cloud_reaction_payload_parent_key_invalid'); + } + if (reactionType.isEmpty) { + throw ArgumentError('cloud_reaction_payload_type_invalid'); + } + final baseType = reactionType.startsWith('-') + ? reactionType.substring(1) + : reactionType; + if ((baseType == 'emoji') != + (associatedEmoji != null && associatedEmoji!.isNotEmpty)) { + throw ArgumentError('cloud_reaction_payload_emoji_invalid'); + } + if ((associatedRangeLocation == null) != (associatedRangeLength == null)) { + throw ArgumentError('cloud_reaction_payload_range_invalid'); + } + _validateSemanticField(readAtState, readAt, 'reaction_read_at'); + _validateSemanticField( + deliveredAtState, + deliveredAt, + 'reaction_delivered_at', + ); + } + + @override + final String logicalEntityKeyHash; + final String canonicalGuid; + final String parentLogicalKeyHash; + final String parentCanonicalGuid; + final int? parentPart; + final String senderHandle; + final String reactionType; + final String? associatedEmoji; + final DateTime? createdAt; + final int? error; + final CloudSemanticService? service; + final CloudSemanticKnownMessageFlags? knownFlags; + final CloudSemanticFieldState readAtState; + final DateTime? readAt; + final CloudSemanticFieldState deliveredAtState; + final DateTime? deliveredAt; + final int? associatedRangeLocation; + final int? associatedRangeLength; + + @override + CloudEntityKind get kind => CloudEntityKind.reaction; +} + +final class CloudProfileEntityPayload extends CloudSemanticEntityPayload { + CloudProfileEntityPayload({ + required this.logicalEntityKeyHash, + required this.displayName, + required this.handle, + Uint8List? avatarBytes, + }) : avatarBytes = avatarBytes == null + ? null + : Uint8List.fromList(avatarBytes) { + if (logicalEntityKeyHash.isEmpty) { + throw ArgumentError('cloud_profile_payload_logical_key_invalid'); + } + if (handle.isEmpty) { + throw ArgumentError('cloud_profile_payload_handle_invalid'); + } + } + + @override + final String logicalEntityKeyHash; + final String? displayName; + final String handle; + final Uint8List? avatarBytes; + + @override + CloudEntityKind get kind => CloudEntityKind.sharedProfile; +} + +final class CloudGroupPhotoEntityPayload extends CloudSemanticEntityPayload { + CloudGroupPhotoEntityPayload({ + required this.logicalEntityKeyHash, + required this.ownerLogicalKeyHash, + required this.photoGuid, + required this.protectedLocalReference, + }) { + if (logicalEntityKeyHash.isEmpty) { + throw ArgumentError('cloud_group_photo_payload_logical_key_invalid'); + } + if (ownerLogicalKeyHash.isEmpty) { + throw ArgumentError('cloud_group_photo_payload_owner_key_invalid'); + } + if (photoGuid.isEmpty) { + throw ArgumentError( + 'cloud_group_photo_payload_canonical_identity_invalid', + ); + } + if (protectedLocalReference.isEmpty) { + throw ArgumentError('cloud_group_photo_payload_reference_invalid'); + } + } + + @override + final String logicalEntityKeyHash; + final String ownerLogicalKeyHash; + final String photoGuid; + final String protectedLocalReference; + + @override + CloudEntityKind get kind => CloudEntityKind.groupPhoto; +} + +/// In-memory output of the future native semantic decoder. +/// +/// [snapshot] is content-free durable merge metadata. [payload] is transient +/// user-visible data and must flow only into the canonical entity adapter. +class CloudDecodedMutation { + factory CloudDecodedMutation.upsert({ + required CloudSyncScope scope, + required int generation, + required String changeId, + required CloudSemanticSnapshot snapshot, + required CloudSemanticEntityPayload payload, + }) { + if (generation <= 0) { + throw ArgumentError('cloud_decoded_mutation_generation_invalid'); + } + if (changeId.isEmpty) { + throw ArgumentError('cloud_decoded_mutation_change_id_invalid'); + } + if (snapshot.kind != payload.kind) { + throw ArgumentError('cloud_decoded_mutation_kind_mismatch'); + } + if (snapshot.logicalEntityKeyHash != payload.logicalEntityKeyHash) { + throw ArgumentError('cloud_decoded_mutation_logical_key_mismatch'); + } + return CloudDecodedMutation._( + scope: scope, + generation: generation, + changeId: changeId, + kind: CloudDecodedMutationKind.upsert, + snapshot: snapshot, + payload: payload, + ); + } + + factory CloudDecodedMutation.tombstone({ + required CloudSyncScope scope, + required int generation, + required String changeId, + required CloudSemanticTombstone tombstone, + }) { + if (generation <= 0) { + throw ArgumentError('cloud_decoded_mutation_generation_invalid'); + } + if (changeId.isEmpty) { + throw ArgumentError('cloud_decoded_mutation_change_id_invalid'); + } + return CloudDecodedMutation._( + scope: scope, + generation: generation, + changeId: changeId, + kind: CloudDecodedMutationKind.tombstone, + tombstone: tombstone, + ); + } + + const CloudDecodedMutation._({ + required this.scope, + required this.generation, + required this.changeId, + required this.kind, + this.snapshot, + this.payload, + this.tombstone, + }); + + final CloudSyncScope scope; + final int generation; + final String changeId; + final CloudDecodedMutationKind kind; + final CloudSemanticSnapshot? snapshot; + final CloudSemanticEntityPayload? payload; + final CloudSemanticTombstone? tombstone; + + @override + String toString() => + 'CloudDecodedMutation(${kind.name}, generation=$generation, redacted)'; +} + +class CloudSemanticTombstone { + CloudSemanticTombstone({ + required this.kind, + required this.logicalEntityKeyHash, + required this.deletedAt, + required this.serverConfirmed, + }) { + if (logicalEntityKeyHash.isEmpty) { + throw ArgumentError('cloud_semantic_tombstone_logical_key_invalid'); + } + } + + final CloudEntityKind kind; + final String logicalEntityKeyHash; + + /// Server deletion time when CloudKit supplied embedded record metadata. + /// + /// Valid zone tombstones may omit that metadata. A missing time must not be + /// replaced with local wall time because doing so could erase a newer local + /// mutation. + final DateTime? deletedAt; + final bool serverConfirmed; +} + +abstract interface class CloudSemanticDecoder { + Future decode(CloudInboxEntry entry); +} + +abstract interface class CloudTransientCanonicalIdentityLease { + void release(); +} + +/// Installs the plaintext canonical identities for exactly one decoded +/// mutation while its synchronous ObjectBox transaction is active. +/// +/// Implementations must remain memory-only and clear every identity when the +/// returned lease is released. +abstract interface class CloudTransientCanonicalIdentityRegistrar { + CloudTransientCanonicalIdentityLease bind(CloudDecodedMutation mutation); +} + +class CloudSemanticDecodeFailure implements Exception { + const CloudSemanticDecodeFailure(this.category); + + final CloudFailureCategory category; +} + +/// Transactional gateway to the app's canonical local message store. +/// +/// The future ObjectBox adapter must commit the semantic mutation and replay +/// marker in one transaction. Implementations must not persist plaintext +/// bodies, handles, decoder credentials, or raw account identifiers as sync +/// metadata. +abstract interface class CloudSemanticStoreGateway { + Future writeTransaction({ + required CloudInboxEntry entry, + required CloudCoordinatorLeaseFence leaseFence, + required T Function(CloudSemanticStoreTransaction transaction) action, + }); +} + +abstract interface class CloudSemanticStoreTransaction { + CloudSyncScope get activeScope; + int get activeGeneration; + + bool hasAppliedChange(String changeId); + + CloudSemanticSnapshot? readSnapshot({ + required CloudEntityKind kind, + required String logicalEntityKeyHash, + }); + + bool entityExists({ + required CloudEntityKind kind, + required String logicalEntityKeyHash, + }); + + /// Binds the current inbox record to one canonical logical identity. + /// + /// The durable gateway must update the protected record map in the same + /// transaction as the canonical mutation, snapshot, replay outcome, and + /// inbox terminal state. A conflicting mapping must fail closed. + void bindRecordIdentity({ + required String logicalEntityKeyHash, + String? encryptedRawRecordReference, + }); + + /// Applies the transient payload to the canonical app entity and stores its + /// content-free merge snapshot in the same transaction. + void applyEntity({ + required CloudSemanticEntityPayload payload, + required CloudSemanticSnapshot snapshot, + }); + + void applyTombstone(CloudSemanticTombstone tombstone); + + void markChangeApplied(String changeId); + + void quarantineChange(String changeId, String safeCode); + + void recordConflict(String changeId, String safeCode); +} + +class TransactionalCloudInboxApplier implements CloudInboxApplier { + const TransactionalCloudInboxApplier({ + required this._decoder, + required this._store, + this._mergePolicy = const CloudMergePolicy(), + this._identityRegistrar, + this._activeScopeRevalidator, + this._allowTombstones = false, + }); + + final CloudSemanticDecoder _decoder; + final CloudSemanticStoreGateway _store; + final CloudMergePolicy _mergePolicy; + final CloudTransientCanonicalIdentityRegistrar? _identityRegistrar; + final Future Function()? _activeScopeRevalidator; + final bool _allowTombstones; + + @override + Future apply( + CloudInboxEntry entry, { + required CloudCoordinatorLeaseFence leaseFence, + }) async { + if (entry.change.isTombstone && !_allowTombstones) { + // Do not ask the native decoder for a reversible plaintext identity when + // this build is forbidden to delete canonical state. The protected raw + // tombstone remains in the quarantined inbox for future reprocessing. + return const CloudInboxApplyResult.quarantined( + failureCategory: CloudFailureCategory.conflict, + ); + } + final CloudDecodedMutation decoded; + try { + decoded = await _decoder.decode(entry); + } on CloudSemanticDecodeFailure catch (failure) { + if (failure.category.isRetryable) { + return CloudInboxApplyResult.retryable( + failureCategory: failure.category, + ); + } + return CloudInboxApplyResult.quarantined( + failureCategory: failure.category, + ); + } catch (_) { + return const CloudInboxApplyResult.quarantined( + failureCategory: CloudFailureCategory.unknown, + ); + } + + if (decoded.scope != entry.scope || + decoded.generation != entry.generation || + decoded.changeId != entry.change.changeId) { + return const CloudInboxApplyResult.quarantined( + failureCategory: CloudFailureCategory.conflict, + ); + } + final decodedAsTombstone = + decoded.kind == CloudDecodedMutationKind.tombstone; + if (decodedAsTombstone != entry.change.isTombstone || + decodedAsTombstone != (entry.change.type == CloudChangeType.delete)) { + return const CloudInboxApplyResult.quarantined( + failureCategory: CloudFailureCategory.malformedRecord, + ); + } + if (!decodedAsTombstone) { + final snapshot = decoded.snapshot; + final payload = decoded.payload; + if (snapshot == null || + payload == null || + snapshot.kind != payload.kind || + snapshot.logicalEntityKeyHash != payload.logicalEntityKeyHash) { + return const CloudInboxApplyResult.quarantined( + failureCategory: CloudFailureCategory.malformedRecord, + ); + } + } else if (decoded.tombstone == null || + decoded.snapshot != null || + decoded.payload != null) { + return const CloudInboxApplyResult.quarantined( + failureCategory: CloudFailureCategory.malformedRecord, + ); + } + CloudTransientCanonicalIdentityLease? identityLease; + if (!decodedAsTombstone && _identityRegistrar != null) { + try { + identityLease = _identityRegistrar.bind(decoded); + } catch (_) { + return const CloudInboxApplyResult.quarantined( + failureCategory: CloudFailureCategory.conflict, + ); + } + } + + try { + if (_activeScopeRevalidator != null) { + try { + if (!await _activeScopeRevalidator()) { + return const CloudInboxApplyResult.quarantined( + failureCategory: CloudFailureCategory.conflict, + ); + } + } catch (_) { + return const CloudInboxApplyResult.retryable( + failureCategory: CloudFailureCategory.authorization, + ); + } + } + return await _store.writeTransaction( + entry: entry, + leaseFence: leaseFence, + action: (transaction) { + if (transaction.activeScope != entry.scope || + transaction.activeGeneration != entry.generation) { + return const CloudInboxApplyResult.quarantined( + failureCategory: CloudFailureCategory.conflict, + ); + } + if (transaction.hasAppliedChange(decoded.changeId)) { + transaction.markChangeApplied(decoded.changeId); + return const CloudInboxApplyResult.applied( + inboxStatusPersisted: true, + ); + } + + return switch (decoded.kind) { + CloudDecodedMutationKind.upsert => _applyUpsert( + transaction, + decoded, + ), + CloudDecodedMutationKind.tombstone => _applyTombstone( + transaction, + decoded, + ), + }; + }, + ); + } on CloudSyncFailure catch (failure) { + if (failure.category.isRetryable) { + return CloudInboxApplyResult.retryable( + failureCategory: failure.category, + retryAfter: failure.retryAfter, + ); + } + return CloudInboxApplyResult.quarantined( + failureCategory: failure.category, + ); + } catch (_) { + return const CloudInboxApplyResult.quarantined( + failureCategory: CloudFailureCategory.unknown, + ); + } finally { + identityLease?.release(); + } + } + + CloudInboxApplyResult _applyUpsert( + CloudSemanticStoreTransaction transaction, + CloudDecodedMutation decoded, + ) { + final incoming = decoded.snapshot!; + final local = transaction.readSnapshot( + kind: incoming.kind, + logicalEntityKeyHash: incoming.logicalEntityKeyHash, + ); + final decision = _mergePolicy.merge( + local: local, + incoming: incoming, + parentExists: + incoming.parentLogicalKeyHash == null || + transaction.entityExists( + kind: _parentKind(incoming.kind), + logicalEntityKeyHash: incoming.parentLogicalKeyHash!, + ), + ); + + if (decision.action == CloudMergeAction.defer) { + return const CloudInboxApplyResult.deferred(); + } + + if (decision.action == CloudMergeAction.quarantine || + decision.conflicts.contains( + CloudMergeConflict.immutableContentMismatch, + ) || + decision.conflicts.contains(CloudMergeConflict.editRevisionMismatch)) { + transaction.quarantineChange( + decoded.changeId, + _conflictCode(decision.conflicts), + ); + return const CloudInboxApplyResult.quarantined( + failureCategory: CloudFailureCategory.conflict, + inboxStatusPersisted: true, + ); + } + + if (decision.conflicts.contains( + CloudMergeConflict.equalGroupVersionMismatch, + )) { + transaction.bindRecordIdentity( + logicalEntityKeyHash: incoming.logicalEntityKeyHash, + encryptedRawRecordReference: incoming.encryptedRawRecordReference, + ); + transaction.recordConflict( + decoded.changeId, + 'equal_group_version_mismatch', + ); + transaction.markChangeApplied(decoded.changeId); + return const CloudInboxApplyResult.applied(inboxStatusPersisted: true); + } + + if (decision.action == CloudMergeAction.create || + decision.action == CloudMergeAction.update) { + transaction.applyEntity( + payload: decoded.payload!, + snapshot: decision.snapshot!, + ); + } else { + transaction.bindRecordIdentity( + logicalEntityKeyHash: incoming.logicalEntityKeyHash, + encryptedRawRecordReference: incoming.encryptedRawRecordReference, + ); + } + transaction.markChangeApplied(decoded.changeId); + return const CloudInboxApplyResult.applied(inboxStatusPersisted: true); + } + + CloudEntityKind _parentKind(CloudEntityKind kind) => switch (kind) { + // Message snapshots carry a parent only for a reply/association. The chat + // relationship is represented separately by chatAliasKeyHash and is not + // the semantic snapshot parent. + CloudEntityKind.message => CloudEntityKind.message, + CloudEntityKind.attachment || + CloudEntityKind.reaction => CloudEntityKind.message, + CloudEntityKind.groupPhoto => CloudEntityKind.chat, + _ => throw StateError('cloud_semantic_parent_kind_invalid'), + }; + + CloudInboxApplyResult _applyTombstone( + CloudSemanticStoreTransaction transaction, + CloudDecodedMutation decoded, + ) { + final tombstone = decoded.tombstone!; + if (!tombstone.serverConfirmed) { + transaction.quarantineChange(decoded.changeId, 'unconfirmed_tombstone'); + return const CloudInboxApplyResult.quarantined( + failureCategory: CloudFailureCategory.conflict, + inboxStatusPersisted: true, + ); + } + if (tombstone.deletedAt == null) { + return const CloudInboxApplyResult.deferred(); + } + + final local = transaction.readSnapshot( + kind: tombstone.kind, + logicalEntityKeyHash: tombstone.logicalEntityKeyHash, + ); + final latestLocalMutation = _latestMutation(local); + if (latestLocalMutation != null && + tombstone.deletedAt!.isBefore(latestLocalMutation)) { + transaction.recordConflict(decoded.changeId, 'stale_tombstone'); + transaction.markChangeApplied(decoded.changeId); + return const CloudInboxApplyResult.applied(inboxStatusPersisted: true); + } + + transaction.applyTombstone(tombstone); + transaction.markChangeApplied(decoded.changeId); + return const CloudInboxApplyResult.applied(inboxStatusPersisted: true); + } + + DateTime? _latestMutation(CloudSemanticSnapshot? snapshot) { + if (snapshot == null) return null; + final candidates = [ + if (snapshot.createdAt != null) snapshot.createdAt!, + if (snapshot.readAt != null) snapshot.readAt!, + if (snapshot.deliveredAt != null) snapshot.deliveredAt!, + if (snapshot.retractedAt != null) snapshot.retractedAt!, + ...snapshot.editParts.values.map((part) => part.modifiedAt), + ]; + if (candidates.isEmpty) return null; + return candidates.reduce( + (current, candidate) => candidate.isAfter(current) ? candidate : current, + ); + } + + String _conflictCode(Set conflicts) { + if (conflicts.contains(CloudMergeConflict.immutableContentMismatch)) { + return 'immutable_content_mismatch'; + } + if (conflicts.contains(CloudMergeConflict.editRevisionMismatch)) { + return 'edit_revision_mismatch'; + } + return 'semantic_conflict'; + } +} diff --git a/lib/services/rustpush/cloud_sync/cloud_merge_policy.dart b/lib/services/rustpush/cloud_sync/cloud_merge_policy.dart new file mode 100644 index 0000000000..0955b6f89c --- /dev/null +++ b/lib/services/rustpush/cloud_sync/cloud_merge_policy.dart @@ -0,0 +1,318 @@ +import 'dart:collection'; + +import 'cloud_sync_models.dart'; + +class CloudEditPart { + CloudEditPart({ + required this.partKeyHash, + required this.revision, + required this.contentDigest, + required DateTime modifiedAt, + }) : modifiedAt = _normalizeCloudTimestamp(modifiedAt) { + if (partKeyHash.isEmpty) { + throw ArgumentError('cloud_edit_part_key_invalid'); + } + if (revision < 0) { + throw ArgumentError('cloud_edit_part_revision_invalid'); + } + if (contentDigest.isEmpty) { + throw ArgumentError('cloud_edit_part_digest_invalid'); + } + } + + final String partKeyHash; + final int revision; + final String contentDigest; + final DateTime modifiedAt; +} + +/// Content-free semantic state used to make deterministic merge decisions. +/// +/// Digests and encrypted references may identify state, but this type must +/// never contain a decrypted message body, handle, Apple credential, or key. +class CloudSemanticSnapshot { + CloudSemanticSnapshot({ + required this.kind, + required this.logicalEntityKeyHash, + this.parentLogicalKeyHash, + this.immutableContentDigest, + DateTime? createdAt, + DateTime? readAt, + DateTime? deliveredAt, + Map editParts = const {}, + DateTime? retractedAt, + this.groupVersion, + this.groupMetadataDigest, + this.etagHash, + this.encryptedRawRecordReference, + }) : createdAt = _normalizeOptionalCloudTimestamp(createdAt), + readAt = _normalizeOptionalCloudTimestamp(readAt), + deliveredAt = _normalizeOptionalCloudTimestamp(deliveredAt), + editParts = UnmodifiableMapView(Map.of(editParts)), + retractedAt = _normalizeOptionalCloudTimestamp(retractedAt) { + if (logicalEntityKeyHash.isEmpty) { + throw ArgumentError('cloud_semantic_snapshot_logical_key_invalid'); + } + if (parentLogicalKeyHash != null && parentLogicalKeyHash!.isEmpty) { + throw ArgumentError('cloud_semantic_snapshot_parent_key_invalid'); + } + if (immutableContentDigest != null && immutableContentDigest!.isEmpty) { + throw ArgumentError('cloud_semantic_snapshot_content_digest_invalid'); + } + if (groupVersion != null && groupVersion! < 0) { + throw ArgumentError('cloud_semantic_snapshot_group_version_invalid'); + } + if (groupMetadataDigest != null && groupMetadataDigest!.isEmpty) { + throw ArgumentError('cloud_semantic_snapshot_group_digest_invalid'); + } + if (etagHash != null && etagHash!.isEmpty) { + throw ArgumentError('cloud_semantic_snapshot_etag_hash_invalid'); + } + if (encryptedRawRecordReference != null && + encryptedRawRecordReference!.isEmpty) { + throw ArgumentError('cloud_semantic_snapshot_record_reference_invalid'); + } + } + + final CloudEntityKind kind; + final String logicalEntityKeyHash; + final String? parentLogicalKeyHash; + final String? immutableContentDigest; + final DateTime? createdAt; + final DateTime? readAt; + final DateTime? deliveredAt; + final Map editParts; + final DateTime? retractedAt; + final int? groupVersion; + final String? groupMetadataDigest; + final String? etagHash; + + /// Encrypted record or protected reference retained for unknown fields. + final String? encryptedRawRecordReference; + + CloudSemanticSnapshot copyWith({ + String? immutableContentDigest, + bool clearImmutableContentDigest = false, + DateTime? createdAt, + bool clearCreatedAt = false, + DateTime? readAt, + bool clearReadAt = false, + DateTime? deliveredAt, + bool clearDeliveredAt = false, + Map? editParts, + DateTime? retractedAt, + bool clearRetractedAt = false, + int? groupVersion, + bool clearGroupVersion = false, + String? groupMetadataDigest, + bool clearGroupMetadataDigest = false, + String? etagHash, + bool clearEtagHash = false, + String? encryptedRawRecordReference, + bool clearEncryptedRawRecordReference = false, + }) { + if ((clearImmutableContentDigest && immutableContentDigest != null) || + (clearCreatedAt && createdAt != null) || + (clearReadAt && readAt != null) || + (clearDeliveredAt && deliveredAt != null) || + (clearRetractedAt && retractedAt != null) || + (clearGroupVersion && groupVersion != null) || + (clearGroupMetadataDigest && groupMetadataDigest != null) || + (clearEtagHash && etagHash != null) || + (clearEncryptedRawRecordReference && + encryptedRawRecordReference != null)) { + throw ArgumentError('cloud_semantic_snapshot_clear_conflict'); + } + return CloudSemanticSnapshot( + kind: kind, + logicalEntityKeyHash: logicalEntityKeyHash, + parentLogicalKeyHash: parentLogicalKeyHash, + immutableContentDigest: clearImmutableContentDigest + ? null + : immutableContentDigest ?? this.immutableContentDigest, + createdAt: clearCreatedAt ? null : createdAt ?? this.createdAt, + readAt: clearReadAt ? null : readAt ?? this.readAt, + deliveredAt: clearDeliveredAt ? null : deliveredAt ?? this.deliveredAt, + editParts: editParts ?? this.editParts, + retractedAt: clearRetractedAt ? null : retractedAt ?? this.retractedAt, + groupVersion: clearGroupVersion + ? null + : groupVersion ?? this.groupVersion, + groupMetadataDigest: clearGroupMetadataDigest + ? null + : groupMetadataDigest ?? this.groupMetadataDigest, + etagHash: clearEtagHash ? null : etagHash ?? this.etagHash, + encryptedRawRecordReference: clearEncryptedRawRecordReference + ? null + : encryptedRawRecordReference ?? this.encryptedRawRecordReference, + ); + } +} + +DateTime _normalizeCloudTimestamp(DateTime value) => + DateTime.fromMillisecondsSinceEpoch( + value.toUtc().millisecondsSinceEpoch, + isUtc: true, + ); + +DateTime? _normalizeOptionalCloudTimestamp(DateTime? value) => + value == null ? null : _normalizeCloudTimestamp(value); + +enum CloudMergeAction { create, update, noChange, defer, quarantine } + +enum CloudMergeConflict { + immutableContentMismatch, + editRevisionMismatch, + equalGroupVersionMismatch, +} + +class CloudMergeDecision { + CloudMergeDecision({ + required this.action, + required this.snapshot, + Iterable conflicts = const [], + }) : conflicts = Set.unmodifiable(conflicts.toSet()); + + final CloudMergeAction action; + final CloudSemanticSnapshot? snapshot; + final Set conflicts; +} + +class CloudMergePolicy { + const CloudMergePolicy(); + + CloudMergeDecision merge({ + required CloudSemanticSnapshot? local, + required CloudSemanticSnapshot incoming, + bool parentExists = true, + }) { + if (incoming.parentLogicalKeyHash != null && !parentExists) { + return CloudMergeDecision( + action: CloudMergeAction.defer, + snapshot: local, + ); + } + + if (local == null) { + return CloudMergeDecision( + action: CloudMergeAction.create, + snapshot: incoming, + ); + } + if (local.kind != incoming.kind || + local.logicalEntityKeyHash != incoming.logicalEntityKeyHash) { + throw ArgumentError( + 'Cloud merge requires matching entity kind and logical key hash', + ); + } + + if (local.immutableContentDigest != null && + incoming.immutableContentDigest != null && + local.immutableContentDigest != incoming.immutableContentDigest) { + return CloudMergeDecision( + action: CloudMergeAction.quarantine, + snapshot: local, + conflicts: const [CloudMergeConflict.immutableContentMismatch], + ); + } + + final conflicts = {}; + var changed = false; + var immutableContentDigest = local.immutableContentDigest; + if (immutableContentDigest == null && + incoming.immutableContentDigest != null) { + immutableContentDigest = incoming.immutableContentDigest; + changed = true; + } + final createdAt = _minimum(local.createdAt, incoming.createdAt); + if (createdAt != local.createdAt) { + changed = true; + } + final readAt = _maximum(local.readAt, incoming.readAt); + final deliveredAt = _maximum(local.deliveredAt, incoming.deliveredAt); + if (readAt != local.readAt || deliveredAt != local.deliveredAt) { + changed = true; + } + + final mergedEdits = Map.of(local.editParts); + for (final entry in incoming.editParts.entries) { + final current = mergedEdits[entry.key]; + final candidate = entry.value; + if (current == null || + candidate.revision > current.revision || + (candidate.revision == current.revision && + candidate.modifiedAt.isAfter(current.modifiedAt) && + candidate.contentDigest == current.contentDigest)) { + mergedEdits[entry.key] = candidate; + changed = true; + } else if (candidate.revision == current.revision && + candidate.contentDigest != current.contentDigest) { + conflicts.add(CloudMergeConflict.editRevisionMismatch); + } + } + + var retractedAt = local.retractedAt; + if (incoming.retractedAt != null && + (retractedAt == null || incoming.retractedAt!.isAfter(retractedAt))) { + retractedAt = incoming.retractedAt; + changed = true; + } + + var groupVersion = local.groupVersion; + var groupMetadataDigest = local.groupMetadataDigest; + final incomingGroupVersion = incoming.groupVersion; + if (incomingGroupVersion != null && + (groupVersion == null || incomingGroupVersion > groupVersion)) { + groupVersion = incomingGroupVersion; + groupMetadataDigest = incoming.groupMetadataDigest; + changed = true; + } else if (incomingGroupVersion != null && + groupVersion == incomingGroupVersion && + incoming.groupMetadataDigest != null && + groupMetadataDigest != null && + incoming.groupMetadataDigest != groupMetadataDigest) { + conflicts.add(CloudMergeConflict.equalGroupVersionMismatch); + } + + // Unknown fields and their etag are retained from the latest observed + // server record without attempting to interpret them. + var etagHash = local.etagHash; + var encryptedRawRecordReference = local.encryptedRawRecordReference; + if (incoming.etagHash != null && incoming.etagHash != local.etagHash) { + etagHash = incoming.etagHash; + encryptedRawRecordReference = + incoming.encryptedRawRecordReference ?? encryptedRawRecordReference; + changed = true; + } + + final merged = local.copyWith( + immutableContentDigest: immutableContentDigest, + createdAt: createdAt, + readAt: readAt, + deliveredAt: deliveredAt, + editParts: mergedEdits, + retractedAt: retractedAt, + groupVersion: groupVersion, + groupMetadataDigest: groupMetadataDigest, + etagHash: etagHash, + encryptedRawRecordReference: encryptedRawRecordReference, + ); + return CloudMergeDecision( + action: changed ? CloudMergeAction.update : CloudMergeAction.noChange, + snapshot: merged, + conflicts: conflicts, + ); + } + + DateTime? _maximum(DateTime? first, DateTime? second) { + if (first == null) return second; + if (second == null) return first; + return second.isAfter(first) ? second : first; + } + + DateTime? _minimum(DateTime? first, DateTime? second) { + if (first == null) return second; + if (second == null) return first; + return second.isBefore(first) ? second : first; + } +} diff --git a/lib/services/rustpush/cloud_sync/cloud_operation_identity.dart b/lib/services/rustpush/cloud_sync/cloud_operation_identity.dart new file mode 100644 index 0000000000..d6788db0b1 --- /dev/null +++ b/lib/services/rustpush/cloud_sync/cloud_operation_identity.dart @@ -0,0 +1,75 @@ +import 'dart:convert'; + +import 'package:crypto/crypto.dart'; + +import 'cloud_sync_models.dart'; + +/// Builds deterministic operation IDs without placing raw entity identifiers +/// or payloads in the outbox key. +abstract final class CloudOperationIdentity { + /// Stable identity for the one initial create of a logical cloud entity. + /// Retries and crash recovery must find this same row before allocating a + /// new mutation revision or CloudKit record name. + static String forInitialCreate({ + required CloudSyncScope scope, + required String logicalEntityKeyHash, + required int payloadVersion, + }) { + if (logicalEntityKeyHash.isEmpty) { + throw ArgumentError.value(logicalEntityKeyHash, 'logicalEntityKeyHash'); + } + if (payloadVersion <= 0) { + throw ArgumentError.value(payloadVersion, 'payloadVersion'); + } + final canonical = [ + 'cloud-sync-initial-create-v1', + scope.storageKey, + logicalEntityKeyHash, + CloudOutboxAction.save.name, + payloadVersion.toString(), + ].join('\u001f'); + return 'op1:${sha256.convert(utf8.encode(canonical))}'; + } + + static String forMutation({ + required CloudSyncScope scope, + required String logicalEntityKeyHash, + required CloudOutboxAction action, + required int payloadVersion, + required int mutationRevision, + String? payloadSha256, + }) { + if (logicalEntityKeyHash.isEmpty) { + throw ArgumentError.value( + logicalEntityKeyHash, + 'logicalEntityKeyHash', + 'must be a non-empty one-way digest', + ); + } + if (payloadVersion <= 0) { + throw ArgumentError.value(payloadVersion, 'payloadVersion'); + } + if (action == CloudOutboxAction.save && + (payloadSha256 == null || payloadSha256.isEmpty)) { + throw ArgumentError.value( + payloadSha256, + 'payloadSha256', + 'save operations require a protected payload digest', + ); + } + if (mutationRevision < 0) { + throw ArgumentError.value(mutationRevision, 'mutationRevision'); + } + + final canonical = [ + 'cloud-sync-operation-v1', + scope.storageKey, + logicalEntityKeyHash, + action.name, + payloadVersion.toString(), + mutationRevision.toString(), + payloadSha256 ?? 'tombstone', + ].join('\u001f'); + return 'op1:${sha256.convert(utf8.encode(canonical))}'; + } +} diff --git a/lib/services/rustpush/cloud_sync/cloud_protected_page_lease_lifecycle.dart b/lib/services/rustpush/cloud_sync/cloud_protected_page_lease_lifecycle.dart new file mode 100644 index 0000000000..e3729914ba --- /dev/null +++ b/lib/services/rustpush/cloud_sync/cloud_protected_page_lease_lifecycle.dart @@ -0,0 +1,295 @@ +import 'cloud_sync_models.dart'; +import 'cloud_sync_store.dart'; +import 'cloud_sync_transport.dart'; + +/// Coordinates the native protected-file lease with the durable ObjectBox +/// adoption marker. +/// +/// The static identity map serializes startup recovery across engines sharing +/// one store. A failed recovery is removed so a later run may retry. A +/// successful recovery is process-wide and precedes every subsequent fetch. +final class CloudProtectedPageLeaseLifecycle { + CloudProtectedPageLeaseLifecycle({ + required this._store, + required CloudProtectedPageLeaseTransport transport, + }) : _transport = transport, + _recoveryIdentity = transport.protectedPageLeaseRecoveryIdentity { + if (!_nativeStoreIdentityPattern.hasMatch(_recoveryIdentity)) { + throw ArgumentError('protected_page_lease_recovery_identity_invalid'); + } + } + + static const int maximumAdoptedLeases = 4096; + static const int maximumLiveProtectedReferences = 131072; + static final RegExp _nativeStoreIdentityPattern = RegExp( + r'^obcs2\.store\.[A-Za-z0-9_-]{43}$', + ); + static final Map> _recoveries = {}; + + final CloudProtectedPageLeaseAdoptionStore _store; + final CloudProtectedPageLeaseTransport _transport; + final String _recoveryIdentity; + + Future runProtectedStoreExclusive(Future Function() action) => + _transport.runProtectedStoreExclusive(action); + + Future ensureRecoveredBeforeFetch() { + final existing = _recoveries[_recoveryIdentity]; + if (existing != null) return existing; + return _startRecovery(); + } + + /// Writes need a fresh recovery pass even when startup recovery succeeded. + /// A native lease commit can fail later in the same process, leaving a new + /// durable outbound adoption marker that the cached startup pass never saw. + Future ensureRecoveredBeforeWrite() => _startRecovery(); + + Future _startRecovery() { + final recovery = _recover(); + _recoveries[_recoveryIdentity] = recovery; + recovery.catchError((Object _) { + if (identical(_recoveries[_recoveryIdentity], recovery)) { + _recoveries.remove(_recoveryIdentity); + } + }); + return recovery; + } + + Future _recover() => + runProtectedStoreExclusive(_recoverWhileStoreExclusive); + + Future _recoverWhileStoreExclusive() async { + final adoptedPages = await _store.readAdoptedProtectedPageLeaseReferences( + maximumCount: maximumAdoptedLeases, + ); + final outboundStore = _store; + final adoptedOutbound = + outboundStore is CloudProtectedOutboundLeaseAdoptionStore + ? await (outboundStore as CloudProtectedOutboundLeaseAdoptionStore) + .readNonterminalProtectedOutboundLeaseReferences( + maximumCount: maximumAdoptedLeases, + ) + : const {}; + if (adoptedPages.intersection(adoptedOutbound).isNotEmpty) { + throw CloudSyncFailure( + category: CloudFailureCategory.localStorage, + safeCode: 'protected_lease_namespace_collision', + ); + } + final adopted = {...adoptedPages, ...adoptedOutbound}; + if (adopted.length > maximumAdoptedLeases) { + throw CloudSyncFailure( + category: CloudFailureCategory.localStorage, + safeCode: 'protected_lease_recovery_bound_exceeded', + ); + } + final live = await _readCompleteLivenessSnapshot(); + final remaining = adopted.toSet(); + var passes = 0; + while (true) { + if (passes++ >= maximumAdoptedLeases) { + throw CloudSyncFailure( + category: CloudFailureCategory.localStorage, + safeCode: 'protected_page_lease_recovery_pass_bound_exceeded', + ); + } + final result = await _transport.recoverProtectedPageLeases( + Set.unmodifiable(remaining), + live, + ); + if (result.rolledBackCount < 0 || + result.rolledBackCount > 64 || + result.removedTemporaryFilesCount < 0 || + result.removedTemporaryFilesCount > 64) { + throw CloudSyncFailure( + category: CloudFailureCategory.localStorage, + safeCode: 'protected_page_lease_recovery_result_invalid', + ); + } + final resolved = { + ...result.finalizedAdoptedLeaseReferences, + ...result.absentAdoptedLeaseReferences, + }; + if (!remaining.containsAll(resolved) || + (result.hasMore && result.absentAdoptedLeaseReferences.isNotEmpty)) { + throw CloudSyncFailure( + category: CloudFailureCategory.localStorage, + safeCode: 'protected_page_lease_recovery_result_invalid', + ); + } + final absentOutbound = result.absentAdoptedLeaseReferences.intersection( + adoptedOutbound, + ); + if (absentOutbound.isNotEmpty) { + throw CloudSyncFailure( + category: CloudFailureCategory.localStorage, + safeCode: 'protected_outbound_lease_missing', + ); + } + if (resolved.isNotEmpty) { + final resolvedPages = resolved.intersection(adoptedPages); + if (resolvedPages.isNotEmpty) { + try { + await _store.releaseAdoptedProtectedPageLeaseReferences( + resolvedPages, + ); + } catch (_) { + _recoveries.remove(_recoveryIdentity); + rethrow; + } + for (final leaseReference in resolvedPages) { + try { + await _transport.acknowledgeCommittedPageLease(leaseReference); + } catch (_) { + // The receipt contains only opaque references and is safe to + // leak. Outbound receipts are never acknowledged here. + _recoveries.remove(_recoveryIdentity); + } + } + } + remaining.removeAll(resolved); + } + if (!result.hasMore) return; + if (resolved.isEmpty && + result.rolledBackCount == 0 && + result.removedTemporaryFilesCount == 0) { + throw CloudSyncFailure( + category: CloudFailureCategory.localStorage, + safeCode: 'protected_page_lease_recovery_no_progress', + ); + } + } + } + + Future commitJournaledPage( + CloudFetchBatch batch, { + required String? previousCheckpointReference, + }) => runProtectedStoreExclusive( + () => _commitJournaledPageWhileStoreExclusive( + batch, + previousCheckpointReference: previousCheckpointReference, + ), + ); + + Future _commitJournaledPageWhileStoreExclusive( + CloudFetchBatch batch, { + required String? previousCheckpointReference, + }) async { + final leaseReference = batch.protectedPageLeaseReference; + if (leaseReference == null) return; + final live = await _readCompleteLivenessSnapshot(); + final retained = _pageProtectedReferences( + batch, + ).where(live.references.contains).toSet(); + try { + await _transport.commitProtectedPageLease(leaseReference, retained); + } catch (_) { + // The durable adoption marker remains. Force the next fetch attempt to + // retry native recovery even when startup recovery already succeeded in + // this process. + _recoveries.remove(_recoveryIdentity); + rethrow; + } + try { + await _store.releaseAdoptedProtectedPageLeaseReferences({leaseReference}); + } catch (_) { + // Native commit is durable and idempotent. Force the next fetch through + // recovery so it can finalize the retained adoption/receipt pair. + _recoveries.remove(_recoveryIdentity); + rethrow; + } + try { + await _transport.acknowledgeCommittedPageLease(leaseReference); + } catch (_) { + // The adoption marker is already gone. Invalidate the process cache so + // the next fetch runs bounded recovery and removes the safe receipt leak. + _recoveries.remove(_recoveryIdentity); + } + if (previousCheckpointReference != null && + previousCheckpointReference != batch.nextToken && + !live.references.contains(previousCheckpointReference)) { + try { + await _transport.retireProtectedReferences({ + previousCheckpointReference, + }); + } catch (_) { + // The ObjectBox transaction already replaced this checkpoint. A + // retirement failure is a bounded leak and mark-sweep will retry it. + } + } + } + + Future rollbackUnjournaledPage(CloudFetchBatch batch) => + runProtectedStoreExclusive( + () => _rollbackUnjournaledPageWhileStoreExclusive(batch), + ); + + Future _rollbackUnjournaledPageWhileStoreExclusive( + CloudFetchBatch batch, + ) async { + final leaseReference = batch.protectedPageLeaseReference; + if (leaseReference == null) return; + try { + await _transport.rollbackProtectedPageLease(leaseReference); + } catch (_) { + // An unadopted manifest may remain. Invalidate the successful recovery + // cache so the next fetch performs bounded rollback recovery first. + _recoveries.remove(_recoveryIdentity); + rethrow; + } + } + + Future + collectOneProtectedGarbagePage() async { + await ensureRecoveredBeforeFetch(); + return runProtectedStoreExclusive( + () async => _transport.collectProtectedGarbage( + await _readCompleteLivenessSnapshot(), + ), + ); + } + + Future + _readCompleteLivenessSnapshot() async { + final snapshot = await _store.readLiveProtectedReferences( + maximumCount: maximumLiveProtectedReferences, + ); + if (!snapshot.isComplete) { + throw CloudSyncFailure( + category: CloudFailureCategory.localStorage, + safeCode: 'protected_reference_enumeration_incomplete', + ); + } + return snapshot; + } + + Set _pageProtectedReferences(CloudFetchBatch batch) { + final references = {}; + void add(String? value) { + if (value == null) return; + if (!_protectedReferencePattern.hasMatch(value)) { + throw CloudSyncFailure( + category: CloudFailureCategory.localStorage, + safeCode: 'protected_page_reference_invalid', + ); + } + references.add(value); + } + + for (final change in batch.changes) { + add(change.encryptedServerRecordId); + add(change.protectedSystemFieldsReference); + add(change.encryptedPayloadReference); + } + add(batch.nextToken); + return references; + } + + static void resetRecoveryStateForTests() { + _recoveries.clear(); + } + + static final RegExp _protectedReferencePattern = RegExp( + r'^obcs2\.ref\.[A-Za-z0-9_-]{43}$', + ); +} diff --git a/lib/services/rustpush/cloud_sync/cloud_shadow_journal_budget.dart b/lib/services/rustpush/cloud_sync/cloud_shadow_journal_budget.dart new file mode 100644 index 0000000000..9d1b0fec43 --- /dev/null +++ b/lib/services/rustpush/cloud_sync/cloud_shadow_journal_budget.dart @@ -0,0 +1,208 @@ +import 'dart:convert'; + +import 'cloud_sync_models.dart'; + +/// Content-free reason a read-only shadow journal refused more records. +/// +/// These values are safe to expose in diagnostics. They reveal neither Apple +/// record identifiers nor message content. +enum CloudShadowJournalBlockReason { + maximumAge, + maximumEntries, + maximumEstimatedBytes, +} + +/// Deterministic, per-scope usage of pending read-only shadow records. +class CloudShadowJournalUsage { + CloudShadowJournalUsage({ + required this.pendingEntries, + required this.estimatedBytes, + this.oldestPendingAt, + }) { + if (pendingEntries < 0) { + throw ArgumentError('cloud_shadow_usage_entries_invalid'); + } + if (estimatedBytes < 0) { + throw ArgumentError('cloud_shadow_usage_bytes_invalid'); + } + if (pendingEntries == 0 && oldestPendingAt != null) { + throw ArgumentError('cloud_shadow_usage_oldest_invalid'); + } + } + + static final empty = CloudShadowJournalUsage( + pendingEntries: 0, + estimatedBytes: 0, + ); + + final int pendingEntries; + final int estimatedBytes; + final DateTime? oldestPendingAt; + + CloudShadowJournalUsage add({ + required int entries, + required int bytes, + DateTime? oldestAt, + }) { + if (entries < 0) { + throw ArgumentError('cloud_shadow_usage_added_entries_invalid'); + } + if (bytes < 0) { + throw ArgumentError('cloud_shadow_usage_added_bytes_invalid'); + } + final currentOldest = oldestPendingAt; + final nextOldest = currentOldest == null + ? oldestAt + : oldestAt == null || !oldestAt.isBefore(currentOldest) + ? currentOldest + : oldestAt; + return CloudShadowJournalUsage( + pendingEntries: pendingEntries + entries, + estimatedBytes: estimatedBytes + bytes, + oldestPendingAt: nextOldest, + ); + } +} + +/// Atomic result of trying to journal one read-only shadow page. +class CloudShadowJournalAdmission { + CloudShadowJournalAdmission({ + required this.insertedEntries, + required this.rejectedEntries, + required this.usage, + this.blockReason, + }) { + if (insertedEntries < 0) { + throw ArgumentError('cloud_shadow_admission_inserted_invalid'); + } + if (rejectedEntries < 0) { + throw ArgumentError('cloud_shadow_admission_rejected_invalid'); + } + if (blockReason != null && insertedEntries != 0) { + throw ArgumentError('cloud_shadow_admission_blocked_insert_invalid'); + } + } + + final int insertedEntries; + final int rejectedEntries; + final CloudShadowJournalUsage usage; + final CloudShadowJournalBlockReason? blockReason; + + bool get admitted => blockReason == null; +} + +/// Hard admission limits for Phase 1 read-only shadow sampling. +/// +/// The policy never deletes inbox rows. Once a scope reaches a limit, the +/// engine stops fetching before the next request where possible, and rejects +/// an oversized fetched page atomically without advancing its checkpoint. +/// Existing pending records therefore remain available for a future semantic +/// migration or an explicit, separately reviewed shadow-sample reset. +class CloudShadowJournalBudget { + static const int maximumAllowedEntriesPerScope = 16 * 1024; + static const int maximumAllowedEstimatedBytesPerScope = 128 * 1024 * 1024; + static const Duration maximumAllowedPendingAge = Duration(days: 30); + + CloudShadowJournalBudget({ + this.maximumEntriesPerScope = 4096, + this.maximumEstimatedBytesPerScope = 32 * 1024 * 1024, + this.maximumPendingAge = const Duration(days: 7), + }) { + validate(); + } + + /// Two full default pull runs. This is a client safety limit, not an Apple + /// service quota. + final int maximumEntriesPerScope; + + /// Conservative journal-row estimate, not payload or ObjectBox file size. + final int maximumEstimatedBytesPerScope; + final Duration maximumPendingAge; + + /// Runtime validation keeps release builds fail-closed even though the + /// constructor remains const for feature-flag configuration. + void validate() { + if (maximumEntriesPerScope <= 0 || + maximumEntriesPerScope > maximumAllowedEntriesPerScope) { + throw ArgumentError('cloud_shadow_budget_entries_invalid'); + } + if (maximumEstimatedBytesPerScope <= 0 || + maximumEstimatedBytesPerScope > maximumAllowedEstimatedBytesPerScope) { + throw ArgumentError('cloud_shadow_budget_bytes_invalid'); + } + if (maximumPendingAge.inMicroseconds <= 0 || + maximumPendingAge > maximumAllowedPendingAge) { + throw ArgumentError('cloud_shadow_budget_age_invalid'); + } + } + + /// Returns a deterministic reason in age, entry, then byte precedence. + CloudShadowJournalBlockReason? blockReasonForCurrentUsage( + CloudShadowJournalUsage usage, { + required DateTime now, + }) { + final oldest = usage.oldestPendingAt; + if (oldest != null && + now.isAfter(oldest) && + now.difference(oldest) > maximumPendingAge) { + return CloudShadowJournalBlockReason.maximumAge; + } + if (usage.pendingEntries >= maximumEntriesPerScope) { + return CloudShadowJournalBlockReason.maximumEntries; + } + if (usage.estimatedBytes >= maximumEstimatedBytesPerScope) { + return CloudShadowJournalBlockReason.maximumEstimatedBytes; + } + return null; + } + + /// Checks a projected atomic page. Exact entry and byte limits are allowed; + /// only a value over either limit is rejected. + CloudShadowJournalBlockReason? blockReasonForProjectedUsage( + CloudShadowJournalUsage projected, { + required DateTime now, + }) { + final oldest = projected.oldestPendingAt; + if (oldest != null && + now.isAfter(oldest) && + now.difference(oldest) > maximumPendingAge) { + return CloudShadowJournalBlockReason.maximumAge; + } + if (projected.pendingEntries > maximumEntriesPerScope) { + return CloudShadowJournalBlockReason.maximumEntries; + } + if (projected.estimatedBytes > maximumEstimatedBytesPerScope) { + return CloudShadowJournalBlockReason.maximumEstimatedBytes; + } + return null; + } + + /// Stable upper-bound estimate of one inbox row's journal footprint. + /// + /// The original change ID is intentionally excluded because production + /// stores persist a fixed-width scoped SHA-256 digest instead. No plaintext + /// or identifier is emitted by this calculation. + int estimateEntryBytes({ + required CloudSyncScope scope, + required String batchId, + required CloudFetchedChange change, + }) { + const fixedRowAndIndexOverhead = 256; + const scopedDigestBytes = 64; + return fixedRowAndIndexOverhead + + scopedDigestBytes + + _utf8Length(scope.accountFingerprint) + + _utf8Length(scope.zone) + + _utf8Length(batchId) + + _utf8Length(change.recordIdHash) + + _utf8Length(change.etagHash) + + _utf8Length(change.type.name) + + _utf8Length(change.encryptedServerRecordId) + + _utf8Length(change.protectedSystemFieldsReference) + + _utf8Length(change.encryptedPayloadReference) + + _utf8Length(change.payloadSha256); + } + + int _utf8Length(String? value) => + value == null ? 0 : utf8.encode(value).length; +} diff --git a/lib/services/rustpush/cloud_sync/cloud_sync.dart b/lib/services/rustpush/cloud_sync/cloud_sync.dart new file mode 100644 index 0000000000..7de79b404d --- /dev/null +++ b/lib/services/rustpush/cloud_sync/cloud_sync.dart @@ -0,0 +1,47 @@ +export 'cloud_merge_policy.dart'; +export 'cloud_associated_message_parent_reference.dart'; +export 'cloud_attachment_materialization.dart'; +export 'cloud_attachment_materialization_store.dart'; +export 'cloud_inbox_applier.dart'; +export 'cloudkit_writer_authority.dart'; +export 'cloudkit_writer_mutation_guard.dart'; +export 'cloudkit_writer_ownership.dart'; +export 'legacy_cloudkit_deletion_intents.dart'; +export 'cloud_operation_identity.dart'; +export 'cloud_protected_page_lease_lifecycle.dart'; +export 'cloud_shadow_journal_budget.dart'; +export 'cloud_sync_backoff.dart'; +export 'cloud_sync_android_work_policy.dart'; +export 'cloud_sync_cancellation.dart'; +export 'cloud_sync_dev_gate.dart'; +export 'cloud_sync_engine.dart'; +export 'cloud_sync_manual_shadow_sampler.dart'; +export 'cloud_sync_manual_semantic_pull_sampler.dart'; +export 'cloud_sync_manual_outbound_canary.dart'; +export 'cloud_sync_manual_shadow_controller.dart'; +export 'cloud_sync_manual_shadow_owner.dart'; +export 'cloud_sync_models.dart'; +export 'cloud_sync_observability.dart'; +export 'cloud_sync_outbound_admission.dart'; +export 'cloud_sync_outbound_staging.dart'; +export 'cloud_sync_platform.dart'; +export 'cloud_sync_production_preflight.dart'; +export 'cloud_sync_protector.dart'; +export 'cloud_sync_protector_health.dart'; +export 'cloud_sync_production_sampler_adapter.dart'; +export 'cloud_sync_runtime.dart'; +export 'cloud_sync_safe_failure.dart'; +export 'cloud_sync_shadow_report.dart'; +export 'cloud_sync_semantic_pull_report.dart'; +export 'cloud_sync_shadow_report_file.dart'; +export 'cloud_sync_shadow_transport.dart'; +export 'cloud_sync_scheduler.dart'; +export 'cloud_sync_store.dart'; +export 'cloud_sync_transport.dart'; +export 'cloud_sync_writer_authority.dart'; +export 'objectbox_cloud_semantic_store_gateway.dart'; +export 'objectbox_canonical_semantic_entity_adapter.dart'; +export 'objectbox_cloud_sync_preflight.dart'; +export 'native_protected_cloud_sync_transport.dart'; +export 'rust_cloud_sync_transport.dart'; +export 'transient_cloud_canonical_identity_registry.dart'; diff --git a/lib/services/rustpush/cloud_sync/cloud_sync_android_work_policy.dart b/lib/services/rustpush/cloud_sync/cloud_sync_android_work_policy.dart new file mode 100644 index 0000000000..ad5504026b --- /dev/null +++ b/lib/services/rustpush/cloud_sync/cloud_sync_android_work_policy.dart @@ -0,0 +1,64 @@ +/// Platform-neutral contract mirrored by Android's WorkManager adapter. +/// +/// This is deliberately a policy description, not an execution switch. The +/// Android adapter starts disabled and, while dormant, its worker does not +/// initialize Flutter, Rust, or CloudKit. +enum CloudSyncAndroidWorkKind { metadata, automaticMedia, userVisibleManual } + +enum CloudSyncAndroidNetworkRequirement { connected, unmetered } + +class CloudSyncAndroidWorkPolicy { + const CloudSyncAndroidWorkPolicy({ + required this.networkRequirement, + this.requiresBatteryNotLow = true, + this.requiresStorageNotLow = true, + this.coalescingDelay = const Duration(seconds: 15), + this.requestsExpeditedExecution = false, + }); + + /// The earliest a durable Android wake may run after the first hint. + /// + /// Repeated hints use unique-work KEEP semantics, so they coalesce rather + /// than resetting this delay or producing a queue of CloudKit work. + final Duration coalescingDelay; + final CloudSyncAndroidNetworkRequirement networkRequirement; + final bool requiresBatteryNotLow; + final bool requiresStorageNotLow; + + /// V2 never requests expedited work. [userVisibleManual] is named + /// explicitly so a later user-visible design cannot silently inherit an + /// expedited policy without a separate review. + final bool requestsExpeditedExecution; + + static const uniqueWorkPrefix = 'cloud-sync-v2/'; + + static CloudSyncAndroidWorkPolicy forKind(CloudSyncAndroidWorkKind kind) { + switch (kind) { + case CloudSyncAndroidWorkKind.metadata: + case CloudSyncAndroidWorkKind.userVisibleManual: + return const CloudSyncAndroidWorkPolicy( + networkRequirement: CloudSyncAndroidNetworkRequirement.connected, + ); + case CloudSyncAndroidWorkKind.automaticMedia: + return const CloudSyncAndroidWorkPolicy( + networkRequirement: CloudSyncAndroidNetworkRequirement.unmetered, + ); + } + } + + /// WorkManager receives only a canonical SHA-256 of the full V2 scope key. + /// + /// Keeping validation here prevents accidental use of a partial account, + /// zone, or raw Apple identifier as WorkManager's durable unique-work name. + static String uniqueWorkNameForScopeHash(String scopeHash) { + final normalized = scopeHash.trim(); + if (!RegExp(r'^[a-f0-9]{64}$').hasMatch(normalized)) { + throw ArgumentError.value( + scopeHash, + 'scopeHash', + 'Must be a lowercase SHA-256 hash of the complete Cloud Sync scope', + ); + } + return '$uniqueWorkPrefix$normalized'; + } +} diff --git a/lib/services/rustpush/cloud_sync/cloud_sync_backoff.dart b/lib/services/rustpush/cloud_sync/cloud_sync_backoff.dart new file mode 100644 index 0000000000..10d5441441 --- /dev/null +++ b/lib/services/rustpush/cloud_sync/cloud_sync_backoff.dart @@ -0,0 +1,63 @@ +import 'dart:math'; + +import 'cloud_sync_models.dart'; + +typedef CloudRandomUnit = double Function(); + +class CloudSyncBackoffPolicy { + CloudSyncBackoffPolicy({ + this.baseDelay = const Duration(seconds: 2), + this.maximumDelay = const Duration(minutes: 15), + CloudRandomUnit? randomUnit, + }) : _randomUnit = randomUnit ?? Random.secure().nextDouble { + if (baseDelay.isNegative || baseDelay == Duration.zero) { + throw ArgumentError.value(baseDelay, 'baseDelay'); + } + if (maximumDelay < baseDelay) { + throw ArgumentError.value(maximumDelay, 'maximumDelay'); + } + } + + final Duration baseDelay; + final Duration maximumDelay; + final CloudRandomUnit _randomUnit; + + Duration delayFor({ + required int attempt, + required CloudFailureCategory category, + Duration? retryAfter, + }) { + if (attempt <= 0) { + throw ArgumentError.value(attempt, 'attempt'); + } + + final exponent = min(attempt - 1, 30); + final exponentialMs = min( + baseDelay.inMilliseconds * (1 << exponent), + maximumDelay.inMilliseconds, + ); + final unit = _randomUnit().clamp(0.0, 1.0); + final jitterMs = (exponentialMs * unit).round(); + var delay = Duration(milliseconds: jitterMs); + + if (category == CloudFailureCategory.pcsUnavailable && + delay < const Duration(seconds: 30)) { + delay = const Duration(seconds: 30); + } + if (retryAfter != null && retryAfter > delay) { + delay = retryAfter; + } + return delay > maximumDelay && retryAfter == null ? maximumDelay : delay; + } + + DateTime nextEligibleAt({ + required DateTime now, + required int attempt, + required CloudFailureCategory category, + Duration? retryAfter, + }) { + return now.add( + delayFor(attempt: attempt, category: category, retryAfter: retryAfter), + ); + } +} diff --git a/lib/services/rustpush/cloud_sync/cloud_sync_cancellation.dart b/lib/services/rustpush/cloud_sync/cloud_sync_cancellation.dart new file mode 100644 index 0000000000..805333b1fc --- /dev/null +++ b/lib/services/rustpush/cloud_sync/cloud_sync_cancellation.dart @@ -0,0 +1,9 @@ +class CloudSyncCancellationToken { + bool _cancelled = false; + + bool get isCancelled => _cancelled; + + void cancel() { + _cancelled = true; + } +} diff --git a/lib/services/rustpush/cloud_sync/cloud_sync_dev_gate.dart b/lib/services/rustpush/cloud_sync/cloud_sync_dev_gate.dart new file mode 100644 index 0000000000..ee7d7ea594 --- /dev/null +++ b/lib/services/rustpush/cloud_sync/cloud_sync_dev_gate.dart @@ -0,0 +1,34 @@ +/// Compile-time gate for the developer-only Cloud Sync V2 shadow sampler. +/// +/// Production builds omit the sampler unless the build explicitly supplies +/// `--dart-define=OPENBUBBLES_CLOUD_SYNC_V2_SAMPLER=true`. +abstract final class CloudSyncDevGate { + static const bool manualShadowSamplerEnabled = bool.fromEnvironment( + 'OPENBUBBLES_CLOUD_SYNC_V2_SAMPLER', + defaultValue: false, + ); + + /// Separate opt-in for the developer-only local semantic projection canary. + /// Enabling the read-only sampler alone can never enable local mutations. + static const bool manualSemanticPullEnabled = bool.fromEnvironment( + 'OPENBUBBLES_CLOUD_SYNC_V2_SEMANTIC_PULL', + defaultValue: false, + ); + + /// Independent opt-in for the one-existing-text, create-only write canary. + /// This gate is insufficient by itself: the build must also select the V2 + /// writer owner, Developer Mode must be active, and two confirmations are + /// required at runtime. + static const bool manualOutboundCanaryEnabled = bool.fromEnvironment( + 'OPENBUBBLES_CLOUD_SYNC_V2_OUTBOUND_CANARY', + defaultValue: false, + ); + + /// Separate compile-time availability gate for the local-only protocol + /// evidence trace. Ordinary Alpha, Beta, and production artifacts omit the + /// toggle even if a stale preference exists. + static const bool protocolEvidenceAvailable = bool.fromEnvironment( + 'OPENBUBBLES_CLOUD_SYNC_V2_EVIDENCE', + defaultValue: false, + ); +} diff --git a/lib/services/rustpush/cloud_sync/cloud_sync_engine.dart b/lib/services/rustpush/cloud_sync/cloud_sync_engine.dart new file mode 100644 index 0000000000..417dd4fc55 --- /dev/null +++ b/lib/services/rustpush/cloud_sync/cloud_sync_engine.dart @@ -0,0 +1,2172 @@ +// ignore_for_file: prefer_initializing_formals + +import 'dart:async'; +import 'dart:math'; + +import 'package:uuid/uuid.dart'; + +import 'cloud_shadow_journal_budget.dart'; +import 'cloud_protected_page_lease_lifecycle.dart'; +import 'cloud_sync_backoff.dart'; +import 'cloud_sync_cancellation.dart'; +import 'cloud_sync_models.dart'; +import 'cloud_sync_observability.dart'; +import 'cloud_sync_store.dart'; +import 'cloud_sync_transport.dart'; +import 'cloud_sync_write_transport.dart'; +import 'cloud_sync_writer_authority.dart'; +import 'cloudkit_operation_interlock.dart'; + +typedef CloudSyncClock = DateTime Function(); +typedef CloudSyncUuidFactory = String Function(); + +class CloudSyncFeatureFlags { + const CloudSyncFeatureFlags({ + this.readOnlyFetch = true, + this.semanticApply = false, + this.saves = false, + this.deletions = false, + this.profiles = false, + this.notificationHints = false, + }); + + final bool readOnlyFetch; + final bool semanticApply; + final bool saves; + final bool deletions; + final bool profiles; + final bool notificationHints; +} + +class CloudSyncEngineConfig { + static const int maximumAllowedFetchPagesPerRun = 64; + static const int maximumAllowedInboxEntriesPerRun = 4096; + static const int maximumAllowedOutboxBatchesPerRun = 64; + static const int maximumAllowedUnknownAttempts = 16; + static const int maximumAllowedDeferredAttempts = 64; + static const Duration maximumAllowedFetchOperationTimeout = Duration( + minutes: 5, + ); + static const Duration maximumAllowedWriteOperationTimeout = Duration( + minutes: 5, + ); + static const Duration maximumAllowedCoordinatorLeaseDuration = Duration( + minutes: 30, + ); + static const Duration maximumAllowedOutboxLeaseDuration = Duration( + minutes: 30, + ); + static const Duration maximumAllowedPausedRetryDelay = Duration(days: 30); + static const Duration maximumAllowedDeferredAge = Duration(days: 30); + + CloudSyncEngineConfig({ + this.maximumBatchSize = 256, + this.maximumFetchPagesPerRun = 8, + this.maximumInboxEntriesPerRun = 512, + this.maximumOutboxBatchesPerRun = 8, + this.fetchOperationTimeout = const Duration(seconds: 45), + this.writeOperationTimeout = const Duration(seconds: 45), + this.coordinatorLeaseDuration = const Duration(minutes: 5), + this.outboxLeaseDuration = const Duration(minutes: 2), + this.pausedRetryDelay = const Duration(hours: 6), + this.maximumDeferredAttempts = 8, + this.maximumDeferredAge = const Duration(days: 3), + this.maximumUnknownAttempts = 3, + CloudShadowJournalBudget? shadowJournalBudget, + this.flags = const CloudSyncFeatureFlags(), + }) : shadowJournalBudget = shadowJournalBudget ?? CloudShadowJournalBudget() { + validate(); + } + + final int maximumBatchSize; + final int maximumFetchPagesPerRun; + final int maximumInboxEntriesPerRun; + final int maximumOutboxBatchesPerRun; + final Duration fetchOperationTimeout; + final Duration writeOperationTimeout; + final Duration coordinatorLeaseDuration; + final Duration outboxLeaseDuration; + final Duration pausedRetryDelay; + final int maximumDeferredAttempts; + final Duration maximumDeferredAge; + final int maximumUnknownAttempts; + final CloudShadowJournalBudget shadowJournalBudget; + final CloudSyncFeatureFlags flags; + + void validate() { + if (maximumBatchSize <= 0 || maximumBatchSize > 256) { + throw ArgumentError('cloud_sync_config_batch_size_invalid'); + } + if (maximumFetchPagesPerRun <= 0 || + maximumFetchPagesPerRun > maximumAllowedFetchPagesPerRun) { + throw ArgumentError('cloud_sync_config_fetch_pages_invalid'); + } + if (maximumInboxEntriesPerRun <= 0 || + maximumInboxEntriesPerRun > maximumAllowedInboxEntriesPerRun) { + throw ArgumentError('cloud_sync_config_inbox_entries_invalid'); + } + if (maximumOutboxBatchesPerRun <= 0 || + maximumOutboxBatchesPerRun > maximumAllowedOutboxBatchesPerRun) { + throw ArgumentError('cloud_sync_config_outbox_batches_invalid'); + } + if (maximumUnknownAttempts <= 0 || + maximumUnknownAttempts > maximumAllowedUnknownAttempts) { + throw ArgumentError('cloud_sync_config_unknown_attempts_invalid'); + } + if (maximumDeferredAttempts <= 0 || + maximumDeferredAttempts > maximumAllowedDeferredAttempts) { + throw ArgumentError('cloud_sync_config_deferred_attempts_invalid'); + } + if (fetchOperationTimeout.inMicroseconds <= 0 || + fetchOperationTimeout > maximumAllowedFetchOperationTimeout) { + throw ArgumentError('cloud_sync_config_fetch_timeout_invalid'); + } + if (writeOperationTimeout.inMicroseconds <= 0 || + writeOperationTimeout > maximumAllowedWriteOperationTimeout) { + throw ArgumentError('cloud_sync_config_write_timeout_invalid'); + } + if (coordinatorLeaseDuration.inMicroseconds <= 0 || + coordinatorLeaseDuration > maximumAllowedCoordinatorLeaseDuration) { + throw ArgumentError('cloud_sync_config_coordinator_lease_invalid'); + } + if (outboxLeaseDuration.inMicroseconds <= 0 || + outboxLeaseDuration > maximumAllowedOutboxLeaseDuration) { + throw ArgumentError('cloud_sync_config_outbox_lease_invalid'); + } + if (pausedRetryDelay.inMicroseconds <= 0 || + pausedRetryDelay > maximumAllowedPausedRetryDelay) { + throw ArgumentError('cloud_sync_config_paused_retry_invalid'); + } + if (maximumDeferredAge.inMicroseconds <= 0 || + maximumDeferredAge > maximumAllowedDeferredAge) { + throw ArgumentError('cloud_sync_config_deferred_age_invalid'); + } + shadowJournalBudget.validate(); + } +} + +enum CloudSyncRunStatus { completed, degraded, skipped, cancelled, failed } + +class CloudSyncRunResult { + const CloudSyncRunResult({ + required this.status, + required this.counters, + required this.startedAt, + required this.finishedAt, + this.skipReason, + this.failureCategory, + this.shadowJournalBlockReason, + }); + + final CloudSyncRunStatus status; + final CloudSyncRunCounters counters; + final DateTime startedAt; + final DateTime finishedAt; + final CloudSyncSkipReason? skipReason; + final CloudFailureCategory? failureCategory; + final CloudShadowJournalBlockReason? shadowJournalBlockReason; +} + +CloudProtectedPageLeaseTransport? _protectedLeaseTransportFor( + CloudSyncTransport transport, +) { + if (transport case CloudProtectedPageLeaseTransport protected) { + return protected; + } + if (transport case CloudProtectedPageLeaseTransportProvider provider) { + return provider.protectedPageLeaseTransport; + } + return null; +} + +/// Platform-neutral Cloud Sync V2 coordinator. +/// +/// One instance is scoped to one account/container/database/zone. Platform +/// differences are confined to [CloudSyncTransport] and [CloudSyncStore]. +class CloudSyncEngine { + CloudSyncEngine({ + required this.scope, + required this.coordinatorId, + this.architectureName = 'generic', + required CloudSyncStore store, + required CloudSyncTransport transport, + required this._inboxApplier, + CloudSyncWriterAuthority? writerAuthority, + CloudKitOperationExclusion? writerExclusion, + CloudSyncBackoffPolicy? backoff, + this._observer = const NoopCloudSyncObserver(), + CloudSyncClock? clock, + CloudSyncUuidFactory? uuidFactory, + CloudSyncEngineConfig? config, + }) : config = config ?? CloudSyncEngineConfig(), + _store = store, + _transport = transport, + _writeTransport = transport is CloudSyncWriteTransport + ? transport as CloudSyncWriteTransport + : null, + _nativeOperationQuiescence = + transport is CloudSyncNativeOperationQuiescence + ? transport as CloudSyncNativeOperationQuiescence + : null, + _writerAuthority = writerAuthority, + _writerExclusion = writerExclusion, + _unknownOutcomeStore = store is CloudSyncUnknownOutcomeLeasingStore + ? store as CloudSyncUnknownOutcomeLeasingStore + : null, + _protectedPageLeaseLifecycle = + store is CloudProtectedPageLeaseAdoptionStore && + _protectedLeaseTransportFor(transport) != null + ? CloudProtectedPageLeaseLifecycle( + store: store as CloudProtectedPageLeaseAdoptionStore, + transport: _protectedLeaseTransportFor(transport)!, + ) + : null, + _backoff = backoff ?? CloudSyncBackoffPolicy(), + _clock = clock ?? DateTime.now, + _uuidFactory = uuidFactory ?? (() => const Uuid().v4().toUpperCase()) { + if (coordinatorId.isEmpty) { + throw ArgumentError('cloud_sync_coordinator_id_invalid'); + } + this.config.validate(); + if (this.config.flags.saves && _writerAuthority == null) { + throw ArgumentError('cloud_sync_writer_authority_required'); + } + if (this.config.flags.saves && _unknownOutcomeStore == null) { + throw ArgumentError('cloud_sync_unknown_outcome_store_required'); + } + if (this.config.flags.saves && _writerExclusion == null) { + throw ArgumentError('cloud_sync_writer_exclusion_required'); + } + if (this.config.flags.saves && _nativeOperationQuiescence == null) { + throw ArgumentError('cloud_sync_native_operation_quiescence_required'); + } + if (this.config.flags.saves && _writeTransport == null) { + throw ArgumentError('cloud_sync_write_preflight_transport_required'); + } + if (this.config.flags.saves && + _writeTransport != null && + _protectedLeaseTransportFor(transport) != null && + (_protectedPageLeaseLifecycle == null || + store is! CloudProtectedOutboundLeaseAdoptionStore)) { + throw ArgumentError( + 'cloud_sync_native_protected_writer_recovery_required', + ); + } + } + + final CloudSyncScope scope; + final String coordinatorId; + final String architectureName; + final CloudSyncStore _store; + final CloudSyncTransport _transport; + final CloudSyncWriteTransport? _writeTransport; + final CloudSyncNativeOperationQuiescence? _nativeOperationQuiescence; + final CloudSyncWriterAuthority? _writerAuthority; + final CloudKitOperationExclusion? _writerExclusion; + final CloudSyncUnknownOutcomeLeasingStore? _unknownOutcomeStore; + final CloudProtectedPageLeaseLifecycle? _protectedPageLeaseLifecycle; + final CloudInboxApplier _inboxApplier; + final CloudSyncBackoffPolicy _backoff; + final CloudSyncObserver _observer; + final CloudSyncClock _clock; + final CloudSyncUuidFactory _uuidFactory; + final CloudSyncEngineConfig config; + + bool _runActive = false; + int _runSerial = 0; + DateTime? _lastCoordinatorLeaseRenewal; + CloudCoordinatorLeaseFence? _activeLeaseFence; + CloudSyncWriterPermit? _activeWriterPermit; + + Future synchronize({ + required CloudSyncTrigger trigger, + CloudSyncCancellationToken? cancellationToken, + }) { + if (config.flags.saves) { + return _writerExclusion!.runExclusive( + kind: CloudKitOperationKind.v2ReadWrite, + action: () => _synchronize( + trigger: trigger, + cancellationToken: cancellationToken, + ), + ); + } + return _synchronize(trigger: trigger, cancellationToken: cancellationToken); + } + + Future _synchronize({ + required CloudSyncTrigger trigger, + CloudSyncCancellationToken? cancellationToken, + }) async { + final startedAt = _clock(); + if (scope.streamKind == CloudSyncStreamKind.profiles && + !config.flags.profiles) { + _emit( + CloudSyncEventType.runSkipped, + at: startedAt, + trigger: trigger, + skipReason: CloudSyncSkipReason.featureDisabled, + ); + return _finishRun( + runId: 'profile-disabled-${startedAt.microsecondsSinceEpoch}', + trigger: trigger, + status: CloudSyncRunStatus.skipped, + counters: const CloudSyncRunCounters(), + startedAt: startedAt, + finishedAt: startedAt, + skipReason: CloudSyncSkipReason.featureDisabled, + ); + } + if (_runActive) { + _emit( + CloudSyncEventType.runSkipped, + at: startedAt, + trigger: trigger, + skipReason: CloudSyncSkipReason.localRunActive, + ); + return _finishRun( + runId: 'overlap-${startedAt.microsecondsSinceEpoch}', + trigger: trigger, + status: CloudSyncRunStatus.skipped, + counters: const CloudSyncRunCounters(), + startedAt: startedAt, + finishedAt: startedAt, + skipReason: CloudSyncSkipReason.localRunActive, + ); + } + + _runActive = true; + final runNumber = ++_runSerial; + CloudCoordinatorLeaseFence? leaseFence; + var counters = const CloudSyncRunCounters(); + _emit(CloudSyncEventType.runStarted, at: startedAt, trigger: trigger); + + try { + final leaseOwnerId = _newLeaseOwnerId(runNumber); + leaseFence = await _store.tryAcquireCoordinatorLease( + scope, + ownerId: leaseOwnerId, + now: startedAt, + leaseDuration: config.coordinatorLeaseDuration, + ); + if (leaseFence == null) { + final finishedAt = _clock(); + _emit( + CloudSyncEventType.runSkipped, + at: finishedAt, + trigger: trigger, + skipReason: CloudSyncSkipReason.coordinatorLeaseUnavailable, + ); + return await _finishRun( + runId: 'run-$runNumber-${startedAt.microsecondsSinceEpoch}', + trigger: trigger, + status: CloudSyncRunStatus.skipped, + counters: counters, + startedAt: startedAt, + finishedAt: finishedAt, + skipReason: CloudSyncSkipReason.coordinatorLeaseUnavailable, + ); + } + _activeLeaseFence = leaseFence; + _lastCoordinatorLeaseRenewal = startedAt; + + // A read-only shadow pass must not inspect or mutate durable outbox + // state. Lease recovery is part of the write pipeline, even though it + // does not contact CloudKit. + if (config.flags.saves) { + _activeWriterPermit = await _writerAuthority!.issue(scope); + await _verifyWriterPermit(); + await _store.recoverExpiredOutboxLeases(scope, now: _clock()); + } + var pullSucceeded = !config.flags.readOnlyFetch; + CloudFailureCategory? degradedFailure; + CloudShadowJournalBlockReason? shadowJournalBlockReason; + var remainingInboxEntries = config.maximumInboxEntriesPerRun; + var semanticInboxCounters = const CloudSyncRunCounters(); + var semanticInboxPhaseStarted = false; + var pullAttempted = false; + + // A restart may leave semantic rows waiting in the durable inbox. Apply + // the contiguous prefix before fetching so local state is repaired as + // early as possible, while still allowing the fetch to bring in older + // parent records needed by a deferred row. + if (config.flags.semanticApply && !_isCancelled(cancellationToken)) { + semanticInboxPhaseStarted = true; + final startupApply = await _applyInbox( + cancellationToken, + maximumEntries: remainingInboxEntries, + emitEvent: false, + ); + semanticInboxCounters = semanticInboxCounters.add( + applied: startupApply.counters.applied, + deferred: startupApply.counters.deferred, + quarantined: startupApply.counters.quarantined, + retried: startupApply.counters.retried, + ); + counters = counters.add( + applied: startupApply.counters.applied, + deferred: startupApply.counters.deferred, + quarantined: startupApply.counters.quarantined, + retried: startupApply.counters.retried, + ); + remainingInboxEntries -= startupApply.processedEntries; + } + + if (config.flags.readOnlyFetch && + !_isCancelled(cancellationToken) && + _notificationTriggerAllowed(trigger)) { + pullAttempted = true; + final pullResult = await _pullChanges( + trigger: trigger, + cancellationToken: cancellationToken, + ); + counters = counters.add( + fetched: pullResult.fetched, + shadowJournalEntries: pullResult.journalUsage.pendingEntries, + shadowJournalEstimatedBytes: pullResult.journalUsage.estimatedBytes, + shadowJournalRejectedEntries: pullResult.rejectedEntries, + ); + pullSucceeded = pullResult.succeeded; + degradedFailure = pullResult.failureCategory; + shadowJournalBlockReason = pullResult.journalBlockReason; + } + + if (config.flags.semanticApply && + remainingInboxEntries > 0 && + pullAttempted && + !_isCancelled(cancellationToken)) { + semanticInboxPhaseStarted = true; + final postFetchApply = await _applyInbox( + cancellationToken, + maximumEntries: remainingInboxEntries, + emitEvent: false, + ); + semanticInboxCounters = semanticInboxCounters.add( + applied: postFetchApply.counters.applied, + deferred: postFetchApply.counters.deferred, + quarantined: postFetchApply.counters.quarantined, + retried: postFetchApply.counters.retried, + ); + counters = counters.add( + applied: postFetchApply.counters.applied, + deferred: postFetchApply.counters.deferred, + quarantined: postFetchApply.counters.quarantined, + retried: postFetchApply.counters.retried, + ); + remainingInboxEntries -= postFetchApply.processedEntries; + } + + if (semanticInboxPhaseStarted) { + _emit( + CloudSyncEventType.inboxApplied, + at: _clock(), + count: semanticInboxCounters.applied, + ); + } + + final pullRequired = _requiresPullBeforePush(trigger); + if (config.flags.saves && + !_isCancelled(cancellationToken) && + (!pullRequired || pullSucceeded)) { + final pushCounters = await _flushOutbox( + runNumber: runNumber, + cancellationToken: cancellationToken, + ); + counters = counters.add( + confirmed: pushCounters.confirmed, + quarantined: pushCounters.quarantined, + retried: pushCounters.retried, + ); + } + + final finishedAt = _clock(); + if (_isCancelled(cancellationToken)) { + _emit( + CloudSyncEventType.runCancelled, + at: finishedAt, + trigger: trigger, + elapsed: finishedAt.difference(startedAt), + ); + return await _finishRun( + runId: 'run-$runNumber-${startedAt.microsecondsSinceEpoch}', + trigger: trigger, + status: CloudSyncRunStatus.cancelled, + counters: counters, + startedAt: startedAt, + finishedAt: finishedAt, + failureCategory: CloudFailureCategory.cancelled, + shadowJournalBlockReason: shadowJournalBlockReason, + ); + } + + _emit( + CloudSyncEventType.runCompleted, + at: finishedAt, + trigger: trigger, + elapsed: finishedAt.difference(startedAt), + ); + return await _finishRun( + runId: 'run-$runNumber-${startedAt.microsecondsSinceEpoch}', + trigger: trigger, + status: degradedFailure == null && shadowJournalBlockReason == null + ? CloudSyncRunStatus.completed + : CloudSyncRunStatus.degraded, + counters: counters, + startedAt: startedAt, + finishedAt: finishedAt, + failureCategory: degradedFailure, + shadowJournalBlockReason: shadowJournalBlockReason, + ); + } on CloudSyncFailure catch (error) { + final finishedAt = _clock(); + _emit( + CloudSyncEventType.runFailed, + at: finishedAt, + trigger: trigger, + failureCategory: error.category, + elapsed: finishedAt.difference(startedAt), + ); + return await _finishRun( + runId: 'run-$runNumber-${startedAt.microsecondsSinceEpoch}', + trigger: trigger, + status: CloudSyncRunStatus.failed, + counters: counters, + startedAt: startedAt, + finishedAt: finishedAt, + failureCategory: error.category, + ); + } catch (_) { + final finishedAt = _clock(); + _emit( + CloudSyncEventType.runFailed, + at: finishedAt, + trigger: trigger, + failureCategory: CloudFailureCategory.unknown, + elapsed: finishedAt.difference(startedAt), + ); + return await _finishRun( + runId: 'run-$runNumber-${startedAt.microsecondsSinceEpoch}', + trigger: trigger, + status: CloudSyncRunStatus.failed, + counters: counters, + startedAt: startedAt, + finishedAt: finishedAt, + failureCategory: CloudFailureCategory.unknown, + ); + } finally { + try { + if (leaseFence != null) { + await _store.releaseCoordinatorLease(scope, leaseFence: leaseFence); + } + } catch (_) { + // The durable lease has an expiry. A release failure must not wedge + // this engine instance or change an already persisted sync outcome. + } finally { + _lastCoordinatorLeaseRenewal = null; + _activeLeaseFence = null; + _activeWriterPermit = null; + _runActive = false; + } + } + } + + Future<_PullResult> _pullChanges({ + required CloudSyncTrigger trigger, + CloudSyncCancellationToken? cancellationToken, + }) { + final lifecycle = _protectedPageLeaseLifecycle; + if (lifecycle == null) { + return _pullChangesWhileStoreExclusive( + trigger: trigger, + cancellationToken: cancellationToken, + ); + } + return lifecycle.runProtectedStoreExclusive( + () => _pullChangesWhileStoreExclusive( + trigger: trigger, + cancellationToken: cancellationToken, + ), + ); + } + + Future<_PullResult> _pullChangesWhileStoreExclusive({ + required CloudSyncTrigger trigger, + CloudSyncCancellationToken? cancellationToken, + }) async { + await _protectedPageLeaseLifecycle?.ensureRecoveredBeforeFetch(); + var checkpoint = await _store.readCheckpoint(scope); + final initialNow = _clock(); + final nextEligible = checkpoint.nextPullEligibleAt; + if (nextEligible != null && nextEligible.isAfter(initialNow)) { + _emit( + CloudSyncEventType.runSkipped, + at: initialNow, + trigger: trigger, + skipReason: CloudSyncSkipReason.pullBackoffActive, + ); + return _PullResult( + fetched: 0, + succeeded: false, + failureCategory: checkpoint.lastFailure ?? CloudFailureCategory.network, + ); + } + + var fetched = 0; + var sawSuccessfulPage = false; + var authenticationRefreshUsed = false; + var pcsRefreshUsed = false; + var journalUsage = CloudShadowJournalUsage.empty; + final shadowMode = + config.flags.readOnlyFetch && !config.flags.semanticApply; + if (shadowMode) { + journalUsage = await _store.readShadowJournalUsage( + scope, + budget: config.shadowJournalBudget, + ); + final blockReason = config.shadowJournalBudget.blockReasonForCurrentUsage( + journalUsage, + now: initialNow, + ); + if (blockReason != null) { + _emitShadowJournalBlocked( + blockReason, + usage: journalUsage, + rejectedEntries: 0, + at: initialNow, + ); + return _PullResult( + fetched: 0, + succeeded: false, + journalUsage: journalUsage, + journalBlockReason: blockReason, + ); + } + } + for ( + var page = 0; + page < config.maximumFetchPagesPerRun && !_isCancelled(cancellationToken); + page++ + ) { + CloudFetchBatch batch; + while (true) { + await _renewCoordinatorLeaseOrThrow(); + try { + batch = await _transport + .fetchChanges( + scope, + previousToken: checkpoint.fetchedToken, + generation: checkpoint.generation, + limit: config.maximumBatchSize, + ) + .timeout( + config.fetchOperationTimeout, + onTimeout: () => throw CloudSyncFailure( + category: CloudFailureCategory.network, + safeCode: 'fetch_timeout', + ), + ); + break; + } on CloudSyncFailure catch (error) { + if (error.category == CloudFailureCategory.authorization && + !authenticationRefreshUsed) { + authenticationRefreshUsed = true; + final refreshed = await _tryRefreshAuthentication(); + if (refreshed) { + continue; + } + } else if (error.category == CloudFailureCategory.pcsUnavailable && + !pcsRefreshUsed) { + pcsRefreshUsed = true; + final refreshed = await _tryRefreshPcs(); + if (refreshed) { + continue; + } + } + final pausedError = + error.category == CloudFailureCategory.authorization || + error.category == CloudFailureCategory.pcsUnavailable + ? CloudSyncFailure( + category: error.category, + retryAfter: config.pausedRetryDelay, + safeCode: error.safeCode, + ) + : error; + await _recordPullFailure(checkpoint, pausedError); + return _PullResult( + fetched: fetched, + succeeded: false, + failureCategory: pausedError.category, + journalUsage: journalUsage, + ); + } catch (_) { + final attempt = checkpoint.consecutivePullFailures + 1; + final unknown = CloudSyncFailure( + category: CloudFailureCategory.unknown, + retryAfter: attempt >= config.maximumUnknownAttempts + ? config.pausedRetryDelay + : null, + ); + await _recordPullFailure(checkpoint, unknown); + return _PullResult( + fetched: fetched, + succeeded: false, + failureCategory: CloudFailureCategory.unknown, + journalUsage: journalUsage, + ); + } + } + _requireMatchingScope(batch.scope); + if (batch.generation != checkpoint.generation) { + throw CloudSyncFailure( + category: CloudFailureCategory.localStorage, + safeCode: 'generation_mismatch', + ); + } + if (authenticationRefreshUsed) { + await _store.resumePausedOutbox( + scope, + categories: const {CloudFailureCategory.authorization}, + now: _clock(), + ); + } + if (pcsRefreshUsed) { + await _store.resumePausedOutbox( + scope, + categories: const {CloudFailureCategory.pcsUnavailable}, + now: _clock(), + ); + } + + // The journal and fetched token are committed even if cancellation + // arrives while the network request is in flight. + final journalNow = _clock(); + await _renewCoordinatorLeaseOrThrow(force: true); + if (batch.protectedPageLeaseReference != null && + _protectedPageLeaseLifecycle == null) { + if (_transport case CloudProtectedPageLeaseTransport transport) { + await transport.rollbackProtectedPageLease( + batch.protectedPageLeaseReference!, + ); + } + throw CloudSyncFailure( + category: CloudFailureCategory.localStorage, + safeCode: 'protected_page_lease_lifecycle_unavailable', + ); + } + int inserted; + try { + if (shadowMode) { + final leaseFence = _activeLeaseFence; + if (leaseFence == null) { + throw CloudSyncFailure( + category: CloudFailureCategory.localStorage, + safeCode: 'coordinator_lease_fence_missing', + ); + } + final admission = await _store.journalShadowFetchedBatch( + batch, + now: journalNow, + budget: config.shadowJournalBudget, + leaseFence: leaseFence, + expectedGeneration: checkpoint.generation, + expectedFetchedToken: checkpoint.fetchedToken, + ); + journalUsage = admission.usage; + final blockReason = admission.blockReason; + if (blockReason != null) { + await _protectedPageLeaseLifecycle?.rollbackUnjournaledPage(batch); + _emitShadowJournalBlocked( + blockReason, + usage: admission.usage, + rejectedEntries: admission.rejectedEntries, + at: journalNow, + ); + return _PullResult( + fetched: fetched, + succeeded: sawSuccessfulPage, + journalUsage: admission.usage, + rejectedEntries: admission.rejectedEntries, + journalBlockReason: blockReason, + ); + } + inserted = admission.insertedEntries; + } else { + final leaseFence = _activeLeaseFence; + if (leaseFence == null) { + throw CloudSyncFailure( + category: CloudFailureCategory.localStorage, + safeCode: 'coordinator_lease_fence_missing', + ); + } + inserted = await _store.journalFetchedBatch( + batch, + now: journalNow, + leaseFence: leaseFence, + expectedGeneration: checkpoint.generation, + expectedFetchedToken: checkpoint.fetchedToken, + ); + } + } catch (_) { + await _protectedPageLeaseLifecycle?.rollbackUnjournaledPage(batch); + rethrow; + } + await _protectedPageLeaseLifecycle?.commitJournaledPage( + batch, + previousCheckpointReference: checkpoint.fetchedToken, + ); + fetched += inserted; + sawSuccessfulPage = true; + _emit(CloudSyncEventType.fetchCompleted, at: _clock(), count: inserted); + checkpoint = await _store.readCheckpoint(scope); + if (!batch.hasMore) break; + } + + if (sawSuccessfulPage) { + await _store.recordPullSuccess(scope, now: _clock()); + } + return _PullResult( + fetched: fetched, + succeeded: sawSuccessfulPage, + journalUsage: journalUsage, + ); + } + + Future _recordPullFailure( + CloudSyncCheckpoint checkpoint, + CloudSyncFailure error, + ) async { + final attempt = checkpoint.consecutivePullFailures + 1; + final now = _clock(); + final nextEligibleAt = _backoff.nextEligibleAt( + now: now, + attempt: attempt, + category: error.category, + retryAfter: error.retryAfter, + ); + await _store.recordPullFailure( + scope, + category: error.category, + nextEligibleAt: nextEligibleAt, + ); + _emit( + CloudSyncEventType.backoffScheduled, + at: now, + failureCategory: error.category, + attempt: attempt, + ); + } + + Future<_InboxApplyResult> _applyInbox( + CloudSyncCancellationToken? cancellationToken, { + required int maximumEntries, + required bool emitEvent, + }) async { + var counters = const CloudSyncRunCounters(); + var processedEntries = 0; + while (processedEntries < maximumEntries) { + if (_isCancelled(cancellationToken)) break; + final entries = await _store.readEligibleInbox( + scope, + now: _clock(), + limit: 1, + ); + if (entries.isEmpty) break; + final entry = entries.single; + processedEntries++; + await _renewCoordinatorLeaseOrThrow(); + + CloudInboxApplyResult result; + final preflightFailure = entry.change.preflightFailure; + if (preflightFailure != null) { + result = CloudInboxApplyResult.quarantined( + failureCategory: preflightFailure, + ); + } else { + try { + final leaseFence = _activeLeaseFence; + if (leaseFence == null) { + throw CloudSyncFailure( + category: CloudFailureCategory.localStorage, + safeCode: 'coordinator_lease_fence_missing', + ); + } + result = await _inboxApplier.apply(entry, leaseFence: leaseFence); + } on CloudSyncFailure catch (error) { + result = + error.category.isRetryable || + (error.category == CloudFailureCategory.unknown && + entry.attemptCount + 1 < config.maximumUnknownAttempts) + ? CloudInboxApplyResult.retryable( + failureCategory: error.category, + retryAfter: error.retryAfter, + ) + : CloudInboxApplyResult.quarantined( + failureCategory: error.category, + ); + } catch (_) { + result = entry.attemptCount + 1 < config.maximumUnknownAttempts + ? const CloudInboxApplyResult.retryable( + failureCategory: CloudFailureCategory.unknown, + ) + : const CloudInboxApplyResult.quarantined( + failureCategory: CloudFailureCategory.unknown, + ); + } + } + + if (result.disposition == CloudInboxApplyDisposition.quarantined && + result.failureCategory == CloudFailureCategory.unknown && + entry.attemptCount + 1 < config.maximumUnknownAttempts) { + result = const CloudInboxApplyResult.retryable( + failureCategory: CloudFailureCategory.unknown, + ); + } + + final now = _clock(); + var canApplyNextSequence = false; + switch (result.disposition) { + case CloudInboxApplyDisposition.applied: + if (!result.inboxStatusPersisted) { + await _store.markInboxApplied( + scope, + sequence: entry.sequence, + now: now, + leaseFence: _requireActiveLeaseFence(), + ); + } + counters = counters.add(applied: 1); + canApplyNextSequence = true; + break; + case CloudInboxApplyDisposition.deferred: + case CloudInboxApplyDisposition.retryable: + final category = + result.failureCategory ?? CloudFailureCategory.dependency; + final terminalBoundApplies = + result.disposition == CloudInboxApplyDisposition.deferred || + (result.disposition == CloudInboxApplyDisposition.retryable && + category == CloudFailureCategory.dependency); + if (terminalBoundApplies && + _shouldQuarantineDeferredInboxEntry(entry, now)) { + if (!result.inboxStatusPersisted) { + await _store.quarantineInbox( + scope, + sequence: entry.sequence, + category: category, + now: now, + leaseFence: _requireActiveLeaseFence(), + ); + } + counters = counters.add(quarantined: 1); + canApplyNextSequence = true; + break; + } + final nextEligibleAt = _backoff.nextEligibleAt( + now: now, + attempt: entry.attemptCount + 1, + category: category, + retryAfter: result.retryAfter, + ); + await _store.markInboxRetryable( + scope, + sequence: entry.sequence, + category: category, + now: now, + nextEligibleAt: nextEligibleAt, + leaseFence: _requireActiveLeaseFence(), + ); + counters = counters.add( + deferred: result.disposition == CloudInboxApplyDisposition.deferred + ? 1 + : 0, + retried: result.disposition == CloudInboxApplyDisposition.retryable + ? 1 + : 0, + ); + break; + case CloudInboxApplyDisposition.quarantined: + if (!result.inboxStatusPersisted) { + await _store.quarantineInbox( + scope, + sequence: entry.sequence, + category: result.failureCategory ?? CloudFailureCategory.unknown, + now: now, + leaseFence: _requireActiveLeaseFence(), + ); + } + counters = counters.add(quarantined: 1); + canApplyNextSequence = true; + break; + } + // A pending/deferred/retryable predecessor remains the causal barrier. + // Do not let a later journal row mutate canonical state in this run. + if (!canApplyNextSequence) break; + } + if (emitEvent) { + _emit( + CloudSyncEventType.inboxApplied, + at: _clock(), + count: counters.applied, + ); + } + return _InboxApplyResult( + counters: counters, + processedEntries: processedEntries, + ); + } + + bool _shouldQuarantineDeferredInboxEntry( + CloudInboxEntry entry, + DateTime now, + ) { + final age = now.difference(entry.createdAt); + return entry.attemptCount + 1 >= config.maximumDeferredAttempts && + !age.isNegative && + age >= config.maximumDeferredAge; + } + + Future _flushOutbox({ + required int runNumber, + CloudSyncCancellationToken? cancellationToken, + }) async { + var counters = const CloudSyncRunCounters(); + + // A push-only localOutbox run bypasses _pullChanges, which is otherwise + // where the protected-store lifecycle recovers crash leftovers. Recovery + // must therefore happen at the start of every protected native flush, + // before either ambiguity reconciliation or write preflight can inspect + // protected references. + await _ensureProtectedStoreRecoveredBeforeOutboxFlush(); + + final pausedCategories = await _store.readPausedOutboxFailureCategories( + scope, + now: _clock(), + ); + if (pausedCategories.contains(CloudFailureCategory.authorization)) { + final refreshed = await _tryRefreshAuthentication(); + _emit( + CloudSyncEventType.authenticationRefreshed, + at: _clock(), + count: refreshed ? 1 : 0, + ); + if (refreshed) { + await _resumePausedOutbox( + categories: const {CloudFailureCategory.authorization}, + ); + } else { + await _postponeEligiblePausedOutbox( + categories: const {CloudFailureCategory.authorization}, + ); + } + } + if (pausedCategories.contains(CloudFailureCategory.pcsUnavailable)) { + final refreshed = await _tryRefreshPcs(); + _emit( + CloudSyncEventType.pcsRefreshed, + at: _clock(), + count: refreshed ? 1 : 0, + ); + if (refreshed) { + await _resumePausedOutbox( + categories: const {CloudFailureCategory.pcsUnavailable}, + ); + } else { + await _postponeEligiblePausedOutbox( + categories: const {CloudFailureCategory.pcsUnavailable}, + ); + } + } + + final reconciliation = await _reconcileUnknownOutcomes( + runNumber: runNumber, + cancellationToken: cancellationToken, + ); + final reconciliationCounters = reconciliation.counters; + counters = counters.add( + confirmed: reconciliationCounters.confirmed, + quarantined: reconciliationCounters.quarantined, + retried: reconciliationCounters.retried, + ); + + // Clearing an earlier submission identity is a durable decision boundary, + // not permission to submit the operation again immediately. A later, + // separately triggered run must make that new submission decision. + if (reconciliation.requiresNewSubmissionDecision) return counters; + + final allowedActions = { + CloudOutboxAction.save, + if (config.flags.deletions) CloudOutboxAction.delete, + }; + for ( + var batchIndex = 0; + batchIndex < config.maximumOutboxBatchesPerRun && + !_isCancelled(cancellationToken); + batchIndex++ + ) { + final now = _clock(); + await _renewCoordinatorLeaseOrThrow(); + final leaseId = + '$coordinatorId:$runNumber:$batchIndex:' + '${now.microsecondsSinceEpoch}'; + final leased = await _store.leaseEligibleOutbox( + scope, + now: now, + limit: config.maximumBatchSize, + leaseId: leaseId, + leaseDuration: config.outboxLeaseDuration, + allowedActions: allowedActions, + ); + if (leased.isEmpty) break; + + final preparation = await _prepareOutboxMappings(leased, leaseId); + final transitions = [...preparation.transitions]; + for (final transition in preparation.transitions) { + counters = _countOutboxTransition(counters, transition); + } + var ready = preparation.ready; + var outcomes = {}; + if (ready.isNotEmpty) { + await _verifyWriterPermit(); + final submissionIdentity = CloudOutboxSubmissionIdentity( + requestUuid: _uuidFactory(), + operationUuids: { + for (final operation in ready) + operation.operationId: _uuidFactory(), + }, + ); + CloudSyncPreparedSubmission? preparedSubmission; + List? protectedOperations; + try { + protectedOperations = List.unmodifiable( + await _protectedWriteOperationsFor(ready), + ); + preparedSubmission = await _withCoordinatorLeaseHeartbeat( + () => _withWriteOperationTimeout( + operationName: 'write_preflight', + action: () => _writeTransport!.prepareSubmission( + scope, + submissionIdentity: submissionIdentity, + operations: protectedOperations!, + ), + ), + ); + } on CloudSyncFailure catch (error) { + if (_isCoordinatorLeaseFailure(error)) rethrow; + for (final operation in ready) { + final transition = _transitionForFailure(operation, error); + transitions.add(transition); + counters = _countOutboxTransition(counters, transition); + } + } catch (_) { + for (final operation in ready) { + final transition = _retryOrQuarantineTransition( + operation, + category: CloudFailureCategory.unknown, + ); + transitions.add(transition); + counters = _countOutboxTransition(counters, transition); + } + } + + if (preparedSubmission == null) { + ready = const []; + } else { + await _verifyWriterPermit(); + // Persist the ambiguity boundary only after native authentication, + // PCS lookup, protected payload compilation, and request creation + // have completed without sending a remote mutation. + ready = await _store.markOutboxSubmissionStarted( + scope, + leaseId: leaseId, + submissionIdentity: submissionIdentity, + now: _clock(), + ); + final persistedIdentity = CloudOutboxSubmissionIdentity( + requestUuid: ready.first.appleRequestUuid!, + operationUuids: { + for (final operation in ready) + operation.operationId: operation.appleOperationUuid!, + }, + ); + try { + final result = await _withCoordinatorLeaseHeartbeat( + () => _withWriteOperationTimeout( + operationName: 'push', + action: () async { + await _verifyWriterPermit(); + return _writeTransport!.consumePreparedSubmission( + scope, + preparedSubmission: preparedSubmission!, + persistedIdentity: persistedIdentity, + protectedOperations: protectedOperations!, + operations: ready, + ); + }, + ), + ); + await _verifyWriterPermitAfterRemote(); + outcomes = _requireExactPushOutcomes(ready, result); + } on CloudSyncFailure catch (error) { + if (_isCoordinatorLeaseFailure(error)) rethrow; + for (final operation in ready) { + outcomes[operation.operationId] = _outcomeForThrownFailure( + operation.operationId, + ); + } + } catch (_) { + for (final operation in ready) { + outcomes[operation.operationId] = CloudPushOutcome( + operationId: operation.operationId, + disposition: CloudPushDisposition.unknownOutcome, + failureCategory: CloudFailureCategory.unknown, + ); + } + } + } + } + + for (final operation in ready) { + final outcome = outcomes[operation.operationId]; + if (outcome == null) { + final transition = CloudOutboxTransition.unknownOutcome( + operation.operationId, + ); + transitions.add(transition); + counters = _countOutboxTransition(counters, transition); + continue; + } + switch (outcome.disposition) { + case CloudPushDisposition.confirmed: + transitions.add( + CloudOutboxTransition.confirmed(operation.operationId), + ); + counters = counters.add(confirmed: 1); + break; + case CloudPushDisposition.retryable: + final transition = CloudOutboxTransition.unknownOutcome( + operation.operationId, + nextEligibleAt: _backoff.nextEligibleAt( + now: _clock(), + attempt: operation.attemptCount + 1, + category: CloudFailureCategory.unknown, + retryAfter: outcome.retryAfter, + ), + ); + transitions.add(transition); + counters = _countOutboxTransition(counters, transition); + break; + case CloudPushDisposition.unknownOutcome: + final transition = CloudOutboxTransition.unknownOutcome( + operation.operationId, + ); + transitions.add(transition); + counters = _countOutboxTransition(counters, transition); + break; + case CloudPushDisposition.unauthorized: + final transition = CloudOutboxTransition.provenNotAppliedPaused( + operation.operationId, + category: CloudFailureCategory.authorization, + nextEligibleAt: _clock().add(config.pausedRetryDelay), + ); + transitions.add(transition); + counters = _countOutboxTransition(counters, transition); + break; + case CloudPushDisposition.pcsUnavailable: + final transition = CloudOutboxTransition.provenNotAppliedPaused( + operation.operationId, + category: CloudFailureCategory.pcsUnavailable, + nextEligibleAt: _clock().add(config.pausedRetryDelay), + ); + transitions.add(transition); + counters = _countOutboxTransition(counters, transition); + break; + case CloudPushDisposition.serverRecordChanged: + final transition = await _resolveServerRecordChanged(operation); + transitions.add(transition); + counters = _countOutboxTransition(counters, transition); + break; + case CloudPushDisposition.quarantined: + final category = + outcome.failureCategory ?? CloudFailureCategory.unknown; + final transition = category == CloudFailureCategory.unknown + ? CloudOutboxTransition.unknownOutcome(operation.operationId) + : CloudOutboxTransition.quarantined( + operation.operationId, + category: category, + ); + transitions.add(transition); + counters = _countOutboxTransition(counters, transition); + break; + } + } + + // Outcomes are durable even if cancellation arrives during upload. + await _store.applyOutboxTransitions( + scope, + leaseId: leaseId, + transitions: transitions, + now: _clock(), + ); + await _acknowledgeDurableTerminalOutboxReceipts( + operations: leased, + transitions: transitions, + ); + _emit( + CloudSyncEventType.outboxFlushed, + at: _clock(), + count: ready.length, + ); + } + return counters; + } + + Future _ensureProtectedStoreRecoveredBeforeOutboxFlush() async { + await _protectedPageLeaseLifecycle?.ensureRecoveredBeforeWrite(); + } + + Future<({CloudSyncRunCounters counters, bool requiresNewSubmissionDecision})> + _reconcileUnknownOutcomes({ + required int runNumber, + CloudSyncCancellationToken? cancellationToken, + }) async { + var counters = const CloudSyncRunCounters(); + var requiresNewSubmissionDecision = false; + for ( + var batchIndex = 0; + batchIndex < config.maximumOutboxBatchesPerRun && + !_isCancelled(cancellationToken); + batchIndex++ + ) { + final now = _clock(); + await _renewCoordinatorLeaseOrThrow(); + final leaseId = + '$coordinatorId:$runNumber:reconcile:$batchIndex:' + '${now.microsecondsSinceEpoch}'; + final operations = await _unknownOutcomeStore!.leaseUnknownOutcomes( + scope, + now: now, + limit: config.maximumBatchSize, + leaseId: leaseId, + leaseDuration: config.outboxLeaseDuration, + ); + if (operations.isEmpty) break; + + final transitions = []; + for (final operation in operations) { + CloudOutboxTransition transition; + try { + final resolution = await _withCoordinatorLeaseHeartbeat( + () => _withWriteOperationTimeout( + operationName: 'reconcile', + action: () => _transport.reconcileUnknownOutcome( + scope, + operation: operation, + ), + ), + ); + transition = await _transitionForUnknownResolution( + operation, + resolution, + ); + } on CloudSyncFailure catch (error) { + if (_isCoordinatorLeaseFailure(error)) rethrow; + transition = _unresolvedUnknownTransition(operation, error); + } catch (_) { + transition = _unresolvedUnknownTransition( + operation, + CloudSyncFailure( + category: CloudFailureCategory.unknown, + safeCode: 'unknown_outcome_reconciliation_failed', + ), + ); + } + transitions.add(transition); + requiresNewSubmissionDecision |= + transition.type == CloudOutboxTransitionType.retryable && + transition.clearSubmissionIdentity; + counters = _countOutboxTransition(counters, transition); + } + + await _store.applyOutboxTransitions( + scope, + leaseId: leaseId, + transitions: transitions, + now: _clock(), + ); + await _acknowledgeDurableTerminalOutboxReceipts( + operations: operations, + transitions: transitions, + ); + } + return ( + counters: counters, + requiresNewSubmissionDecision: requiresNewSubmissionDecision, + ); + } + + Future _acknowledgeDurableTerminalOutboxReceipts({ + required List operations, + required List transitions, + }) async { + final transport = _writeTransport; + if (transport is! CloudSyncWriteReceiptFinalizer) return; + try { + await (transport as CloudSyncWriteReceiptFinalizer) + .acknowledgeDurableTerminalOperations( + scope, + operations: operations, + transitions: transitions, + ); + } catch (_) { + // The outbox transition is already durable. A receipt leak is safe and + // bounded recovery removes it after the terminal row leaves adoption. + } + } + + Future _transitionForUnknownResolution( + CloudOutboxOperation operation, + CloudUnknownOutcomeResolution resolution, + ) async { + final proofRequired = switch (resolution.disposition) { + CloudUnknownOutcomeDisposition.committed || + CloudUnknownOutcomeDisposition.notApplied || + CloudUnknownOutcomeDisposition.serverRecordChanged => true, + CloudUnknownOutcomeDisposition.unresolved || + CloudUnknownOutcomeDisposition.quarantined => false, + }; + if (proofRequired && !(resolution.proof?.binds(operation) ?? false)) { + return _unresolvedUnknownTransition( + operation, + CloudSyncFailure( + category: CloudFailureCategory.unknown, + safeCode: 'unknown_outcome_proof_mismatch', + ), + ); + } + switch (resolution.disposition) { + case CloudUnknownOutcomeDisposition.committed: + return CloudOutboxTransition.confirmed(operation.operationId); + case CloudUnknownOutcomeDisposition.notApplied: + return CloudOutboxTransition.provenNotApplied( + operation.operationId, + category: CloudFailureCategory.server, + nextEligibleAt: _clock(), + ); + case CloudUnknownOutcomeDisposition.serverRecordChanged: + return _resolveServerRecordChanged(operation); + case CloudUnknownOutcomeDisposition.unresolved: + return _unresolvedUnknownTransition( + operation, + CloudSyncFailure( + category: + resolution.failureCategory ?? CloudFailureCategory.unknown, + retryAfter: resolution.retryAfter, + safeCode: 'unknown_outcome_unresolved', + ), + ); + case CloudUnknownOutcomeDisposition.quarantined: + final category = + resolution.failureCategory ?? CloudFailureCategory.unknown; + if (category == CloudFailureCategory.unknown || category.isRetryable) { + return _unresolvedUnknownTransition( + operation, + CloudSyncFailure( + category: category, + safeCode: 'unknown_outcome_not_terminal', + ), + ); + } + return CloudOutboxTransition.quarantined( + operation.operationId, + category: category, + ); + } + } + + CloudOutboxTransition _unresolvedUnknownTransition( + CloudOutboxOperation operation, + CloudSyncFailure error, + ) { + return CloudOutboxTransition.unknownOutcome( + operation.operationId, + nextEligibleAt: _backoff.nextEligibleAt( + now: _clock(), + attempt: operation.attemptCount + 1, + category: error.category, + retryAfter: error.retryAfter, + ), + ); + } + + Future<_OutboxPreparation> _prepareOutboxMappings( + List leased, + String leaseId, + ) async { + final ready = []; + final transitions = []; + for (final operation in leased) { + try { + var mapping = await _store.readRecordMap( + scope, + logicalEntityKeyHash: operation.logicalEntityKeyHash, + generation: operation.checkpointGeneration, + ); + if (operation.serverRecordIdHash != null) { + if (mapping == null) { + transitions.add( + CloudOutboxTransition.paused( + operation.operationId, + category: CloudFailureCategory.dependency, + ), + ); + continue; + } + if (mapping.serverRecordIdHash != operation.serverRecordIdHash) { + transitions.add( + CloudOutboxTransition.quarantined( + operation.operationId, + category: CloudFailureCategory.conflict, + ), + ); + continue; + } + ready.add(operation); + continue; + } + + if (mapping == null) { + if (operation.action == CloudOutboxAction.delete) { + transitions.add( + CloudOutboxTransition.paused( + operation.operationId, + category: CloudFailureCategory.dependency, + ), + ); + continue; + } + mapping = await _transport.allocateServerRecordMapping( + scope, + logicalEntityKeyHash: operation.logicalEntityKeyHash, + ); + if (mapping.scope != scope || + mapping.logicalEntityKeyHash != operation.logicalEntityKeyHash || + mapping.serverRecordIdHash.isEmpty || + mapping.encryptedServerRecordId.isEmpty) { + throw CloudSyncFailure( + category: CloudFailureCategory.conflict, + safeCode: 'invalid_server_mapping', + ); + } + await _store.upsertRecordMap( + mapping, + generation: operation.checkpointGeneration, + ); + } + await _store.attachOutboxRecordMapping( + scope, + leaseId: leaseId, + operationId: operation.operationId, + serverRecordIdHash: mapping.serverRecordIdHash, + now: _clock(), + ); + ready.add( + operation.copyWith(serverRecordIdHash: mapping.serverRecordIdHash), + ); + } on CloudSyncFailure catch (error) { + transitions.add(_transitionForFailure(operation, error)); + } catch (_) { + transitions.add( + _retryOrQuarantineTransition( + operation, + category: CloudFailureCategory.unknown, + ), + ); + } + } + return _OutboxPreparation(ready: ready, transitions: transitions); + } + + Future> _protectedWriteOperationsFor( + List operations, + ) async { + final protected = []; + for (final operation in operations) { + final mapping = await _store.readRecordMap( + scope, + logicalEntityKeyHash: operation.logicalEntityKeyHash, + generation: operation.checkpointGeneration, + ); + if (mapping == null) { + throw CloudSyncFailure( + category: CloudFailureCategory.dependency, + safeCode: 'write_preflight_record_mapping_missing', + ); + } + protected.add( + CloudSyncProtectedWriteOperation.fromOutbox( + operation, + recordMapping: mapping, + ), + ); + } + return protected; + } + + CloudOutboxTransition _transitionForFailure( + CloudOutboxOperation operation, + CloudSyncFailure error, + ) { + if (error.category == CloudFailureCategory.authorization || + error.category == CloudFailureCategory.pcsUnavailable || + error.category == CloudFailureCategory.dependency) { + return CloudOutboxTransition.paused( + operation.operationId, + category: error.category, + nextEligibleAt: error.category == CloudFailureCategory.dependency + ? null + : _clock().add(config.pausedRetryDelay), + ); + } + if (error.category.isRetryable || + error.category == CloudFailureCategory.unknown) { + return _retryOrQuarantineTransition( + operation, + category: error.category, + retryAfter: error.retryAfter, + ); + } + return CloudOutboxTransition.quarantined( + operation.operationId, + category: error.category, + ); + } + + CloudPushOutcome _outcomeForThrownFailure(String operationId) { + return CloudPushOutcome( + operationId: operationId, + disposition: CloudPushDisposition.unknownOutcome, + failureCategory: CloudFailureCategory.unknown, + ); + } + + Map _requireExactPushOutcomes( + List operations, + CloudPushBatchResult result, + ) { + final expected = operations + .map((operation) => operation.operationId) + .toSet(); + final actual = result.outcomes.keys.toSet(); + if (expected.length != operations.length || + actual.length != expected.length || + !actual.containsAll(expected)) { + // A missing result is ambiguous: the server may have committed the + // operation before the response was lost. An unknown result can be + // misattributed. Fail the complete batch closed and let later + // reconciliation decide instead of confirming a subset. + throw CloudSyncFailure( + category: CloudFailureCategory.unknown, + safeCode: 'push_outcome_set_mismatch', + ); + } + return Map.of(result.outcomes); + } + + Future _resumePausedOutbox({ + required Set categories, + }) async { + await _store.resumePausedOutbox( + scope, + categories: categories, + now: _clock(), + ); + } + + Future _postponeEligiblePausedOutbox({ + required Set categories, + }) async { + final now = _clock(); + await _store.postponeEligiblePausedOutbox( + scope, + categories: categories, + now: now, + nextEligibleAt: now.add(config.pausedRetryDelay), + ); + } + + Future _resolveServerRecordChanged( + CloudOutboxOperation operation, + ) async { + try { + final resolution = await _transport.reconcileServerRecordChanged( + scope, + operation: operation, + ); + _emit( + CloudSyncEventType.serverConflictReconciled, + at: _clock(), + count: + resolution.disposition == + CloudServerConflictDisposition.mergedForRetry + ? 1 + : 0, + ); + switch (resolution.disposition) { + case CloudServerConflictDisposition.mergedForRetry: + if (resolution.encryptedPayloadReference == null || + resolution.encryptedPayloadReference!.isEmpty || + resolution.payloadSha256 == null || + resolution.payloadSha256!.isEmpty || + resolution.serverRecordIdHash == null || + resolution.serverRecordIdHash != operation.serverRecordIdHash || + resolution.encryptedRawRecordReference == null || + resolution.encryptedRawRecordReference!.isEmpty) { + return CloudOutboxTransition.quarantined( + operation.operationId, + category: CloudFailureCategory.conflict, + ); + } + final mapping = await _store.readRecordMap( + scope, + logicalEntityKeyHash: operation.logicalEntityKeyHash, + generation: operation.checkpointGeneration, + ); + if (mapping == null || + mapping.serverRecordIdHash != resolution.serverRecordIdHash) { + return _unresolvedUnknownTransition( + operation, + CloudSyncFailure( + category: CloudFailureCategory.dependency, + safeCode: 'server_conflict_mapping_missing', + ), + ); + } + await _store.upsertRecordMap( + CloudRecordMapEntry( + scope: scope, + logicalEntityKeyHash: operation.logicalEntityKeyHash, + serverRecordIdHash: mapping.serverRecordIdHash, + encryptedServerRecordId: mapping.encryptedServerRecordId, + etagHash: resolution.etagHash, + encryptedRawRecordReference: + resolution.encryptedRawRecordReference, + updatedAt: _clock(), + ), + generation: operation.checkpointGeneration, + ); + return CloudOutboxTransition.provenNotApplied( + operation.operationId, + category: CloudFailureCategory.conflict, + nextEligibleAt: _clock(), + encryptedPayloadReference: resolution.encryptedPayloadReference, + payloadSha256: resolution.payloadSha256, + serverRecordIdHash: resolution.serverRecordIdHash, + ); + case CloudServerConflictDisposition.retryable: + return _unresolvedUnknownTransition( + operation, + CloudSyncFailure( + category: + resolution.failureCategory ?? CloudFailureCategory.network, + retryAfter: resolution.retryAfter, + safeCode: 'server_conflict_retryable', + ), + ); + case CloudServerConflictDisposition.quarantined: + final category = + resolution.failureCategory ?? CloudFailureCategory.unknown; + return category == CloudFailureCategory.unknown || + category.isRetryable + ? _unresolvedUnknownTransition( + operation, + CloudSyncFailure( + category: category, + safeCode: 'server_conflict_not_terminal', + ), + ) + : CloudOutboxTransition.quarantined( + operation.operationId, + category: category, + ); + } + } on CloudSyncFailure catch (error) { + return error.category.isRetryable || + error.category == CloudFailureCategory.unknown || + error.category == CloudFailureCategory.authorization || + error.category == CloudFailureCategory.pcsUnavailable || + error.category == CloudFailureCategory.dependency + ? _unresolvedUnknownTransition(operation, error) + : CloudOutboxTransition.quarantined( + operation.operationId, + category: error.category, + ); + } catch (_) { + return _unresolvedUnknownTransition( + operation, + CloudSyncFailure( + category: CloudFailureCategory.unknown, + safeCode: 'server_conflict_reconciliation_failed', + ), + ); + } + } + + Future _tryRefreshAuthentication() async { + try { + return await _transport.refreshAuthentication(scope); + } catch (_) { + return false; + } + } + + Future _tryRefreshPcs() async { + try { + return await _transport.refreshPcsAccess(scope); + } catch (_) { + return false; + } + } + + Future _renewCoordinatorLeaseOrThrow({bool force = false}) async { + final now = _clock(); + final lastRenewal = _lastCoordinatorLeaseRenewal; + final renewalInterval = Duration( + microseconds: config.coordinatorLeaseDuration.inMicroseconds ~/ 3, + ); + if (!force && + lastRenewal != null && + !now.isBefore(lastRenewal) && + now.difference(lastRenewal) < renewalInterval) { + return; + } + final leaseFence = _activeLeaseFence; + if (leaseFence == null) { + throw CloudSyncFailure( + category: CloudFailureCategory.localStorage, + safeCode: 'coordinator_lease_fence_missing', + ); + } + final renewed = await _store.renewCoordinatorLease( + scope, + leaseFence: leaseFence, + now: now, + leaseDuration: config.coordinatorLeaseDuration, + ); + if (!renewed) { + throw CloudSyncFailure( + category: CloudFailureCategory.localStorage, + safeCode: 'coordinator_lease_lost', + ); + } + _lastCoordinatorLeaseRenewal = now; + } + + Future _withCoordinatorLeaseHeartbeat( + Future Function() action, + ) async { + await _renewCoordinatorLeaseOrThrow(force: true); + final heartbeatInterval = Duration( + microseconds: max(1, config.coordinatorLeaseDuration.inMicroseconds ~/ 3), + ); + Object? renewalFailure; + StackTrace? renewalFailureStack; + Future? renewalInFlight; + late final Timer heartbeat; + heartbeat = Timer.periodic(heartbeatInterval, (_) { + if (renewalInFlight != null || renewalFailure != null) return; + final renewal = _renewCoordinatorLeaseOrThrow(force: true); + renewalInFlight = renewal + .then((_) {}) + .catchError((Object error, StackTrace stack) { + renewalFailure = error; + renewalFailureStack = stack; + }) + .whenComplete(() { + renewalInFlight = null; + }); + }); + try { + final result = await action(); + heartbeat.cancel(); + await renewalInFlight; + final failure = renewalFailure; + if (failure != null) { + Error.throwWithStackTrace(failure, renewalFailureStack!); + } + // Covers an operation that completed before the first timer tick and + // closes the takeover window immediately before outcome processing. + await _renewCoordinatorLeaseOrThrow(force: true); + return result; + } finally { + heartbeat.cancel(); + await renewalInFlight; + } + } + + Future _withWriteOperationTimeout({ + required String operationName, + required Future Function() action, + }) async { + try { + return await action().timeout(config.writeOperationTimeout); + } on TimeoutException { + try { + await _nativeOperationQuiescence!.quiesceNativeOperations(); + } catch (_) { + throw CloudSyncFailure( + category: CloudFailureCategory.unknown, + retryAfter: config.writeOperationTimeout, + safeCode: 'cloud_sync_native_quiescence_failed', + ); + } + throw CloudSyncFailure( + category: CloudFailureCategory.unknown, + retryAfter: config.writeOperationTimeout, + safeCode: 'cloud_sync_${operationName}_timeout', + ); + } + } + + bool _isCoordinatorLeaseFailure(CloudSyncFailure error) => + error.safeCode == 'coordinator_lease_fence_missing' || + error.safeCode == 'coordinator_lease_lost'; + + Future _verifyWriterPermit() async { + if (!config.flags.saves) return; + final permit = _activeWriterPermit; + if (permit == null) { + throw CloudSyncFailure( + category: CloudFailureCategory.authorization, + safeCode: 'cloud_sync_writer_permit_missing', + ); + } + await permit.verify(); + } + + Future _verifyWriterPermitAfterRemote() async { + try { + await _verifyWriterPermit(); + } catch (_) { + throw CloudSyncFailure( + category: CloudFailureCategory.unknown, + safeCode: 'cloud_sync_writer_post_push_verification_failed', + ); + } + } + + CloudCoordinatorLeaseFence _requireActiveLeaseFence() { + final leaseFence = _activeLeaseFence; + if (leaseFence == null) { + throw CloudSyncFailure( + category: CloudFailureCategory.localStorage, + safeCode: 'coordinator_lease_fence_missing', + ); + } + return leaseFence; + } + + String _newLeaseOwnerId(int runNumber) { + final random = Random.secure(); + final nonce = List.generate( + 16, + (_) => random.nextInt(256), + ).map((value) => value.toRadixString(16).padLeft(2, '0')).join(); + return '$coordinatorId:$runNumber:$nonce'; + } + + CloudSyncRunCounters _countOutboxTransition( + CloudSyncRunCounters counters, + CloudOutboxTransition transition, + ) { + return switch (transition.type) { + CloudOutboxTransitionType.confirmed => counters.add(confirmed: 1), + CloudOutboxTransitionType.retryable => counters.add(retried: 1), + CloudOutboxTransitionType.paused => counters, + CloudOutboxTransitionType.quarantined => counters.add(quarantined: 1), + CloudOutboxTransitionType.unknownOutcome => counters, + }; + } + + CloudOutboxTransition _retryOrQuarantineTransition( + CloudOutboxOperation operation, { + required CloudFailureCategory category, + Duration? retryAfter, + String? encryptedPayloadReference, + String? payloadSha256, + String? serverRecordIdHash, + }) { + if (category == CloudFailureCategory.unknown && + operation.attemptCount + 1 >= config.maximumUnknownAttempts) { + return CloudOutboxTransition.quarantined( + operation.operationId, + category: category, + ); + } + return CloudOutboxTransition.retryable( + operation.operationId, + category: category, + nextEligibleAt: _backoff.nextEligibleAt( + now: _clock(), + attempt: operation.attemptCount + 1, + category: category, + retryAfter: retryAfter, + ), + encryptedPayloadReference: encryptedPayloadReference, + payloadSha256: payloadSha256, + serverRecordIdHash: serverRecordIdHash, + ); + } + + bool _notificationTriggerAllowed(CloudSyncTrigger trigger) => + trigger != CloudSyncTrigger.notificationHint || + config.flags.notificationHints; + + bool _requiresPullBeforePush(CloudSyncTrigger trigger) => switch (trigger) { + CloudSyncTrigger.localOutbox || CloudSyncTrigger.notificationHint => false, + CloudSyncTrigger.startup || + CloudSyncTrigger.networkReconnect || + CloudSyncTrigger.idsReconnect || + CloudSyncTrigger.detectedGap || + CloudSyncTrigger.manual => true, + }; + + bool _isCancelled(CloudSyncCancellationToken? token) => + token?.isCancelled ?? false; + + void _requireMatchingScope(CloudSyncScope received) { + if (received != scope) { + throw CloudSyncFailure( + category: CloudFailureCategory.authorization, + safeCode: 'scope_mismatch', + ); + } + } + + void _emit( + CloudSyncEventType type, { + required DateTime at, + CloudSyncTrigger? trigger, + CloudFailureCategory? failureCategory, + CloudSyncSkipReason? skipReason, + CloudShadowJournalBlockReason? shadowJournalBlockReason, + int count = 0, + int estimatedBytes = 0, + int attempt = 0, + Duration elapsed = Duration.zero, + }) { + _observer.onEvent( + CloudSyncEvent( + type: type, + scopeDiagnosticKey: scope.diagnosticKey, + at: at, + trigger: trigger, + failureCategory: failureCategory, + skipReason: skipReason, + shadowJournalBlockReason: shadowJournalBlockReason, + count: count, + estimatedBytes: estimatedBytes, + attempt: attempt, + elapsed: elapsed, + ), + ); + } + + void _emitShadowJournalBlocked( + CloudShadowJournalBlockReason reason, { + required CloudShadowJournalUsage usage, + required int rejectedEntries, + required DateTime at, + }) { + _emit( + CloudSyncEventType.shadowJournalBlocked, + at: at, + shadowJournalBlockReason: reason, + count: usage.pendingEntries + rejectedEntries, + estimatedBytes: usage.estimatedBytes, + ); + } + + Future _finishRun({ + required String runId, + required CloudSyncTrigger trigger, + required CloudSyncRunStatus status, + required CloudSyncRunCounters counters, + required DateTime startedAt, + required DateTime finishedAt, + CloudSyncSkipReason? skipReason, + CloudFailureCategory? failureCategory, + CloudShadowJournalBlockReason? shadowJournalBlockReason, + }) async { + final result = CloudSyncRunResult( + status: status, + counters: counters, + startedAt: startedAt, + finishedAt: finishedAt, + skipReason: skipReason, + failureCategory: failureCategory, + shadowJournalBlockReason: shadowJournalBlockReason, + ); + try { + await _store.recordRun( + CloudSyncRunRecord( + scope: scope, + runId: runId, + triggerName: trigger.name, + architectureName: architectureName, + startedAt: startedAt, + finishedAt: finishedAt, + counters: counters, + modeName: + '${_configuredModeName()}/${status.name}' + '${shadowJournalBlockReason == null ? '' : '/journal-${shadowJournalBlockReason.name}'}', + failureCategory: failureCategory, + ), + ); + } catch (_) { + // Diagnostic retention must never delay IDS or change sync correctness. + } + return result; + } + + String _configuredModeName() { + if (config.flags.deletions) return 'guarded-deletes'; + if (config.flags.saves) return 'durable-saves'; + if (config.flags.semanticApply) return 'semantic-pull'; + if (config.flags.readOnlyFetch) return 'read-only-shadow'; + return 'disabled'; + } +} + +class _PullResult { + _PullResult({ + required this.fetched, + required this.succeeded, + this.failureCategory, + CloudShadowJournalUsage? journalUsage, + this.rejectedEntries = 0, + this.journalBlockReason, + }) : journalUsage = journalUsage ?? CloudShadowJournalUsage.empty; + + final int fetched; + final bool succeeded; + final CloudFailureCategory? failureCategory; + final CloudShadowJournalUsage journalUsage; + final int rejectedEntries; + final CloudShadowJournalBlockReason? journalBlockReason; +} + +class _InboxApplyResult { + const _InboxApplyResult({ + required this.counters, + required this.processedEntries, + }); + + final CloudSyncRunCounters counters; + final int processedEntries; +} + +class _OutboxPreparation { + const _OutboxPreparation({required this.ready, required this.transitions}); + + final List ready; + final List transitions; +} diff --git a/lib/services/rustpush/cloud_sync/cloud_sync_manual_outbound_canary.dart b/lib/services/rustpush/cloud_sync/cloud_sync_manual_outbound_canary.dart new file mode 100644 index 0000000000..517fc7b183 --- /dev/null +++ b/lib/services/rustpush/cloud_sync/cloud_sync_manual_outbound_canary.dart @@ -0,0 +1,443 @@ +// ignore_for_file: prefer_initializing_formals + +import 'package:bluebubbles/src/rust/api/api.dart' as frb_api; + +import 'cloud_operation_identity.dart'; +import 'cloud_sync_dev_gate.dart'; +import 'cloud_sync_engine.dart'; +import 'cloud_sync_manual_shadow_sampler.dart'; +import 'cloud_sync_models.dart'; +import 'cloudkit_writer_ownership.dart'; + +typedef CloudSyncOutboundCanarySessionFactory = + Future Function( + CloudSyncNativeAuthSnapshot authSnapshot, + CloudSyncScope scope, + ); + +/// One production-composed write session for the single-message canary. +/// +/// The sampler owns ordering and account checks. The session owns the native +/// protected transport, durable ObjectBox store, admission coordinator, writer +/// authority, and operation interlock used by the engine. +abstract interface class CloudSyncOutboundCanarySession { + Future admitMessage({ + required frb_api.CloudMessage message, + required DateTime createdAt, + }); + + Future flushOneBatch(); + + Future> readOutbox(); + + Future quiesce(); +} + +/// Opaque, single-use evidence that the user completed the first confirmation. +/// +/// The selected message is retained only in memory and is intentionally absent +/// from diagnostics and [toString]. A second explicit call is required before +/// any durable admission or CloudKit mutation can occur. +final class CloudSyncOutboundCanaryConfirmation { + CloudSyncOutboundCanaryConfirmation._({ + this.message, + this.createdAt, + required this.authSnapshot, + required this.expiresAt, + required this.recovery, + }); + + final frb_api.CloudMessage? message; + final DateTime? createdAt; + final CloudSyncNativeAuthSnapshot authSnapshot; + final DateTime expiresAt; + final bool recovery; + bool consumed = false; + + @override + String toString() => 'CloudSyncOutboundCanaryConfirmation(redacted)'; +} + +/// Content-free result for one developer-confirmed outbound text canary. +final class CloudSyncOutboundCanaryReport { + const CloudSyncOutboundCanaryReport({ + required this.timestampUtc, + required this.status, + required this.confirmed, + required this.quarantined, + required this.retried, + required this.outboxStatus, + required this.recovery, + }); + + final DateTime timestampUtc; + final CloudSyncRunStatus status; + final int confirmed; + final int quarantined; + final int retried; + final CloudOutboxStatus outboxStatus; + final bool recovery; + + bool get terminal => + outboxStatus == CloudOutboxStatus.confirmed || + outboxStatus == CloudOutboxStatus.quarantined; + + Map toJson() => { + 'mode': 'manual-outbound-text-canary', + 'timestampUtc': timestampUtc.toIso8601String(), + 'status': status.name, + 'confirmed': confirmed, + 'quarantined': quarantined, + 'retried': retried, + 'outboxStatus': outboxStatus.name, + 'recovery': recovery, + }; + + @override + String toString() => + 'CloudSyncOutboundCanaryReport(status=${status.name}, redacted)'; +} + +/// Developer-only, one-message, create-only CloudKit V2 write canary. +/// +/// It is compile-time disabled by default, requires the exclusive V2 writer +/// build, requires two separate confirmation calls, admits exactly one already +/// existing local message, performs no pull or semantic apply, and runs at most +/// one outbox batch. CloudKit and local deletions are never enabled here. +final class CloudSyncManualOutboundCanary { + CloudSyncManualOutboundCanary({ + required CloudSyncShadowPreflightReader readPreflight, + required CloudSyncNativeAuthSnapshotReader readAuthSnapshot, + required CloudSyncOutboundCanarySessionFactory createSession, + bool? compileGateOverrideForTest, + bool? v2WriterOverrideForTest, + DateTime Function()? clock, + }) : _readPreflight = readPreflight, + _readAuthSnapshot = readAuthSnapshot, + _createSession = createSession, + _enabled = + compileGateOverrideForTest ?? + CloudSyncDevGate.manualOutboundCanaryEnabled, + _v2WriterEnabled = + v2WriterOverrideForTest ?? + CloudKitWriterOwnership.v2MutationsEnabled, + _clock = clock ?? DateTime.now; + + static const container = 'com.apple.messages.cloud'; + static const database = 'private'; + static const zone = 'messageManateeZone'; + static const confirmationLifetime = Duration(minutes: 5); + static final RegExp _nativeDigestPattern = RegExp(r'^[A-Za-z0-9_-]{43}$'); + static final RegExp _contentDigestPattern = RegExp(r'^[0-9a-f]{64}$'); + static final RegExp _protectedReferencePattern = RegExp( + r'^obcs2\.ref\.[A-Za-z0-9_-]{43}$', + ); + static final RegExp _leaseReferencePattern = RegExp( + r'^obcs2\.lease\.[0-9a-f]{32}$', + ); + + final CloudSyncShadowPreflightReader _readPreflight; + final CloudSyncNativeAuthSnapshotReader _readAuthSnapshot; + final CloudSyncOutboundCanarySessionFactory _createSession; + final bool _enabled; + final bool _v2WriterEnabled; + final DateTime Function() _clock; + + CloudSyncOutboundCanaryConfirmation? _armedConfirmation; + bool _active = false; + + bool get isActive => _active; + + /// First confirmation. This performs only fail-closed local/auth checks and + /// retains the selected existing message in memory for at most five minutes. + Future armConfirmed({ + required frb_api.CloudMessage message, + required DateTime createdAt, + }) async { + _requireEnabled(); + if (_active) throw StateError('cloud_sync_outbound_canary_active'); + if (_armedConfirmation != null) { + throw StateError('cloud_sync_outbound_canary_already_armed'); + } + if (createdAt.isAfter(_clock().toUtc())) { + throw StateError('cloud_sync_outbound_canary_message_time_invalid'); + } + _validatePreflight(await _readPreflight(), expectedOutboxCount: 0); + final auth = await _readAuthSnapshot(); + if (auth == null) throw StateError('account_unavailable'); + final confirmation = CloudSyncOutboundCanaryConfirmation._( + message: message, + createdAt: createdAt.toUtc(), + authSnapshot: auth, + expiresAt: _clock().toUtc().add(confirmationLifetime), + recovery: false, + ); + _armedConfirmation = confirmation; + return confirmation; + } + + /// First confirmation for a process-death or interrupted-run recovery. + /// No new message is staged or admitted. The second confirmation may only + /// inspect and advance the one exact durable create already in the outbox. + Future armRecoveryConfirmed() async { + _requireEnabled(); + if (_active) throw StateError('cloud_sync_outbound_canary_active'); + if (_armedConfirmation != null) { + throw StateError('cloud_sync_outbound_canary_already_armed'); + } + _validatePreflight(await _readPreflight(), expectedOutboxCount: 1); + final auth = await _readAuthSnapshot(); + if (auth == null) throw StateError('account_unavailable'); + final confirmation = CloudSyncOutboundCanaryConfirmation._( + authSnapshot: auth, + expiresAt: _clock().toUtc().add(confirmationLifetime), + recovery: true, + ); + _armedConfirmation = confirmation; + return confirmation; + } + + /// Second confirmation. The token is consumed before the first await so a + /// repeated or concurrent invocation cannot replay the write. + Future runDoubleConfirmed( + CloudSyncOutboundCanaryConfirmation confirmation, + ) async { + _requireEnabled(); + if (_active) throw StateError('cloud_sync_outbound_canary_active'); + if (!identical(_armedConfirmation, confirmation) || confirmation.consumed) { + throw StateError('cloud_sync_outbound_canary_confirmation_invalid'); + } + confirmation.consumed = true; + _armedConfirmation = null; + if (_clock().toUtc().isAfter(confirmation.expiresAt)) { + throw StateError('cloud_sync_outbound_canary_confirmation_expired'); + } + + _active = true; + CloudSyncOutboundCanarySession? session; + try { + _validatePreflight( + await _readPreflight(), + expectedOutboxCount: confirmation.recovery ? 1 : 0, + ); + final auth = await _readAuthSnapshot(); + if (!confirmation.authSnapshot.sameIdentity(auth)) { + throw StateError('account_changed'); + } + final scope = CloudSyncScope( + accountFingerprint: auth!.accountFingerprint, + container: container, + database: database, + zone: zone, + streamKind: CloudSyncStreamKind.messages, + schemaVersion: 2, + ); + session = await _createSession(auth, scope); + final CloudOutboxOperation operation; + if (confirmation.recovery) { + operation = _requireSingleRecoverableOperation( + await session.readOutbox(), + scope, + ); + } else { + operation = await session.admitMessage( + message: confirmation.message!, + createdAt: confirmation.createdAt!, + ); + _validateAdmission(operation, scope, confirmation.createdAt!); + } + await _requireSameAuth(auth); + + final result = await session.flushOneBatch(); + _validateRunResult(result); + await _requireSameAuth(auth); + _validatePreflight(await _readPreflight(), expectedOutboxCount: 1); + final durableOperation = _requireSameDurableOperation( + await session.readOutbox(), + operation, + ); + return CloudSyncOutboundCanaryReport( + timestampUtc: _clock().toUtc(), + status: result.status, + confirmed: result.counters.confirmed, + quarantined: result.counters.quarantined, + retried: result.counters.retried, + outboxStatus: durableOperation.status, + recovery: confirmation.recovery, + ); + } finally { + try { + await session?.quiesce(); + } finally { + _active = false; + } + } + } + + void disarm(CloudSyncOutboundCanaryConfirmation confirmation) { + if (!identical(_armedConfirmation, confirmation) || confirmation.consumed) { + return; + } + confirmation.consumed = true; + _armedConfirmation = null; + } + + void _requireEnabled() { + if (!_enabled) throw StateError('cloud_sync_outbound_canary_disabled'); + if (!_v2WriterEnabled) { + throw StateError('cloud_sync_outbound_canary_writer_disabled'); + } + } + + void _validatePreflight( + CloudSyncShadowPreflightState state, { + required int expectedOutboxCount, + }) { + if (!state.platformSupported) throw StateError('unsupported_platform'); + if (!state.uiIsolate) throw StateError('not_ui_isolate'); + if (!state.rustPushReady) throw StateError('rustpush_not_ready'); + if (!state.objectBoxReady) throw StateError('objectbox_not_ready'); + if (!state.privateStorageExists) throw StateError('storage_unavailable'); + if (state.logoutActive) throw StateError('logout_active'); + if (state.legacySyncEnabled || state.legacySyncActive) { + throw StateError('legacy_sync_active'); + } + if (state.coordinatorLeaseActive) throw StateError('coordinator_active'); + if (state.outboxCount != expectedOutboxCount) { + throw StateError('cloud_sync_outbound_canary_outbox_invalid'); + } + if (!state.protectorSentinelValid) { + throw StateError('protector_unavailable'); + } + } + + void _validateAdmission( + CloudOutboxOperation operation, + CloudSyncScope expectedScope, + DateTime expectedCreatedAt, + ) { + if (operation.scope != expectedScope || + operation.operationId != + CloudOperationIdentity.forInitialCreate( + scope: expectedScope, + logicalEntityKeyHash: operation.logicalEntityKeyHash, + payloadVersion: operation.payloadVersion, + ) || + !_nativeDigestPattern.hasMatch(operation.logicalEntityKeyHash) || + operation.action != CloudOutboxAction.save || + operation.payloadVersion != 1 || + operation.mutationRevision <= 0 || + operation.status != CloudOutboxStatus.pending || + operation.attemptCount != 0 || + operation.dependencyOperationIds.isNotEmpty || + operation.encryptedPayloadReference == null || + !_protectedReferencePattern.hasMatch( + operation.encryptedPayloadReference!, + ) || + operation.payloadSha256 == null || + !_contentDigestPattern.hasMatch(operation.payloadSha256!) || + operation.serverRecordIdHash == null || + !_nativeDigestPattern.hasMatch(operation.serverRecordIdHash!) || + operation.protectedLeaseReference == null || + !_leaseReferencePattern.hasMatch(operation.protectedLeaseReference!) || + operation.appleRequestUuid != null || + operation.appleOperationUuid != null || + operation.nextEligibleAt != null || + operation.lastFailure != null || + operation.leaseId != null || + operation.leaseExpiresAt != null || + operation.confirmedAt != null || + operation.createdAt.millisecondsSinceEpoch != + expectedCreatedAt.millisecondsSinceEpoch) { + throw StateError('cloud_sync_outbound_canary_admission_invalid'); + } + } + + CloudOutboxOperation _requireSingleRecoverableOperation( + List operations, + CloudSyncScope expectedScope, + ) { + if (operations.length != 1) { + throw StateError('cloud_sync_outbound_canary_recovery_invalid'); + } + final operation = operations.single; + if (!_hasExactCreateBinding(operation, expectedScope) || + operation.status == CloudOutboxStatus.leased) { + throw StateError('cloud_sync_outbound_canary_recovery_invalid'); + } + return operation; + } + + CloudOutboxOperation _requireSameDurableOperation( + List operations, + CloudOutboxOperation expected, + ) { + if (operations.length != 1) { + throw StateError('cloud_sync_outbound_canary_postflight_invalid'); + } + final actual = operations.single; + if (!_hasExactCreateBinding(actual, expected.scope) || + actual.operationId != expected.operationId || + actual.logicalEntityKeyHash != expected.logicalEntityKeyHash || + actual.payloadSha256 != expected.payloadSha256 || + actual.serverRecordIdHash != expected.serverRecordIdHash || + actual.encryptedPayloadReference != + expected.encryptedPayloadReference || + actual.protectedLeaseReference != expected.protectedLeaseReference || + actual.mutationRevision != expected.mutationRevision || + actual.checkpointGeneration != expected.checkpointGeneration || + actual.createdAt.millisecondsSinceEpoch != + expected.createdAt.millisecondsSinceEpoch || + actual.status == CloudOutboxStatus.leased) { + throw StateError('cloud_sync_outbound_canary_postflight_invalid'); + } + return actual; + } + + bool _hasExactCreateBinding( + CloudOutboxOperation operation, + CloudSyncScope expectedScope, + ) { + return operation.scope == expectedScope && + operation.operationId == + CloudOperationIdentity.forInitialCreate( + scope: expectedScope, + logicalEntityKeyHash: operation.logicalEntityKeyHash, + payloadVersion: operation.payloadVersion, + ) && + _nativeDigestPattern.hasMatch(operation.logicalEntityKeyHash) && + operation.action == CloudOutboxAction.save && + operation.payloadVersion == 1 && + operation.mutationRevision > 0 && + operation.checkpointGeneration > 0 && + operation.dependencyOperationIds.isEmpty && + operation.encryptedPayloadReference != null && + _protectedReferencePattern.hasMatch( + operation.encryptedPayloadReference!, + ) && + operation.payloadSha256 != null && + _contentDigestPattern.hasMatch(operation.payloadSha256!) && + operation.serverRecordIdHash != null && + _nativeDigestPattern.hasMatch(operation.serverRecordIdHash!) && + operation.protectedLeaseReference != null && + _leaseReferencePattern.hasMatch(operation.protectedLeaseReference!); + } + + void _validateRunResult(CloudSyncRunResult result) { + final counters = result.counters; + final outboundTotal = + counters.confirmed + counters.quarantined + counters.retried; + if (counters.fetched != 0 || + counters.applied != 0 || + counters.deferred != 0 || + outboundTotal > 1) { + throw StateError('cloud_sync_outbound_canary_tripwire'); + } + } + + Future _requireSameAuth(CloudSyncNativeAuthSnapshot expected) async { + if (!expected.sameIdentity(await _readAuthSnapshot())) { + throw StateError('account_changed'); + } + } +} diff --git a/lib/services/rustpush/cloud_sync/cloud_sync_manual_semantic_pull_sampler.dart b/lib/services/rustpush/cloud_sync/cloud_sync_manual_semantic_pull_sampler.dart new file mode 100644 index 0000000000..f6a72ceefe --- /dev/null +++ b/lib/services/rustpush/cloud_sync/cloud_sync_manual_semantic_pull_sampler.dart @@ -0,0 +1,268 @@ +import 'cloud_shadow_journal_budget.dart'; +import 'cloud_sync_dev_gate.dart'; +import 'cloud_sync_engine.dart'; +import 'cloud_sync_manual_shadow_sampler.dart'; +import 'cloud_sync_models.dart'; +import 'cloud_sync_observability.dart'; +import 'cloud_sync_semantic_pull_report.dart'; +import 'cloud_sync_shadow_transport.dart'; +import 'cloud_sync_store.dart'; +import 'cloud_sync_transport.dart'; +import 'cloudkit_operation_interlock.dart'; + +typedef CloudSyncSemanticStoreFactory = + Future Function(CloudSyncScope scope); +typedef CloudSyncSemanticRawTransportFactory = + Future Function( + CloudSyncNativeAuthSnapshot authSnapshot, + CloudSyncScope scope, + ); +typedef CloudSyncSemanticInboxApplierFactory = + Future Function( + CloudSyncNativeAuthSnapshot authSnapshot, + CloudSyncScope scope, + int generation, + ); + +/// Developer-only one-shot CloudKit reader that may project supported records +/// into canonical local ObjectBox entities but has no remote write capability. +final class CloudSyncManualSemanticPullSampler { + CloudSyncManualSemanticPullSampler({ + required this._readPreflight, + required this._readAuthSnapshot, + required this._createStore, + required this._createRawTransport, + required this._createInboxApplier, + required CloudSyncStore operationFenceStore, + required String privateStorageDirectory, + required this.platform, + required this.architecture, + required this.buildCommit, + this._observerFactory, + bool? compileGateOverrideForTest, + Duration? fetchTimeoutOverrideForTest, + }) : _operationInterlock = CloudKitOperationInterlock( + privateStorageDirectory: privateStorageDirectory, + fenceStore: operationFenceStore, + ), + _fetchTimeout = fetchTimeoutOverrideForTest ?? _maximumFetchTimeout, + _enabled = + compileGateOverrideForTest ?? + CloudSyncDevGate.manualSemanticPullEnabled { + if (_fetchTimeout <= Duration.zero || + _fetchTimeout > _maximumFetchTimeout) { + throw ArgumentError.value(fetchTimeoutOverrideForTest); + } + } + + static const container = 'com.apple.messages.cloud'; + static const database = 'private'; + static const zones = [ + 'chatManateeZone', + 'messageManateeZone', + 'attachmentManateeZone', + ]; + static const pageLimit = 1; + static const changeLimit = 50; + static const _maximumFetchTimeout = Duration(seconds: 45); + static final _journalBudget = CloudShadowJournalBudget( + maximumEntriesPerScope: 512, + maximumEstimatedBytesPerScope: 8 * 1024 * 1024, + maximumPendingAge: const Duration(hours: 24), + ); + + final CloudSyncShadowPreflightReader _readPreflight; + final CloudSyncNativeAuthSnapshotReader _readAuthSnapshot; + final CloudSyncSemanticStoreFactory _createStore; + final CloudSyncSemanticRawTransportFactory _createRawTransport; + final CloudSyncSemanticInboxApplierFactory _createInboxApplier; + final CloudKitOperationInterlock _operationInterlock; + final String platform; + final String architecture; + final String buildCommit; + final CloudSyncObserverFactory? _observerFactory; + final Duration _fetchTimeout; + final bool _enabled; + bool _active = false; + + bool get isActive => _active; + + CloudSyncFeatureFlags get debugFlags => _config().flags; + + Future runConfirmed() async { + if (!_enabled) throw StateError('cloud_sync_semantic_pull_disabled'); + if (_active) throw StateError('cloud_sync_semantic_pull_active'); + _active = true; + try { + return await _operationInterlock.runExclusive( + kind: CloudKitOperationKind.v2SemanticRead, + action: _runConfirmedUnderInterlock, + ); + } finally { + _active = false; + } + } + + Future _runConfirmedUnderInterlock() async { + final before = await _readPreflight(); + _validatePreflight(before); + final auth = await _readAuthSnapshot(); + if (auth == null) throw StateError('account_unavailable'); + + final reports = []; + for (final zone in zones) { + await _requireSameAuth(auth); + final scope = CloudSyncScope( + accountFingerprint: auth.accountFingerprint, + container: container, + database: database, + zone: zone, + ); + final store = await _createStore(scope); + final observer = await _createObserver(scope); + final checkpoint = await store.readCheckpoint(scope); + final inboxApplier = await _createInboxApplier( + auth, + scope, + checkpoint.generation, + ); + final rawTransport = await _createRawTransport(auth, scope); + try { + final guardedTransport = AccountBoundShadowTransport( + delegate: rawTransport, + readActiveFingerprint: () async { + final current = await _readAuthSnapshot(); + return auth.sameIdentity(current) + ? current!.accountFingerprint + : null; + }, + expectedFingerprint: auth.accountFingerprint, + ); + final engine = CloudSyncEngine( + scope: scope, + coordinatorId: 'manual-semantic-${auth.nativeSessionId}-$zone', + architectureName: architecture, + store: store, + transport: guardedTransport, + inboxApplier: inboxApplier, + config: _config(), + observer: observer, + ); + final result = await engine.synchronize( + trigger: CloudSyncTrigger.manual, + ); + await _flushObserver(observer); + if (result.counters.confirmed != 0) { + throw StateError('cloud_sync_semantic_remote_write_tripwire'); + } + reports.add( + CloudSyncSemanticPullZoneReport( + zoneLabel: _zoneLabel(zone), + status: result.status, + fetched: result.counters.fetched, + applied: result.counters.applied, + deferred: result.counters.deferred, + quarantined: result.counters.quarantined, + retried: result.counters.retried, + elapsedMilliseconds: result.finishedAt + .difference(result.startedAt) + .inMilliseconds, + failureCategory: result.failureCategory, + skipReason: result.skipReason, + ), + ); + } catch (_) { + await _flushObserverAfterFailure(observer); + rethrow; + } finally { + if (rawTransport case CloudSyncNativeOperationQuiescence quiescence) { + await quiescence.quiesceNativeOperations(); + } + } + await _requireSameAuth(auth); + } + + final after = await _readPreflight(); + _validatePreflight(after); + if (after.outboxCount != before.outboxCount) { + throw StateError('cloud_sync_semantic_remote_write_tripwire'); + } + return CloudSyncSemanticPullReport( + timestampUtc: DateTime.now().toUtc(), + platform: platform, + architecture: architecture, + buildCommit: buildCommit, + pageLimit: pageLimit, + changeLimit: changeLimit, + outboxCountBefore: before.outboxCount, + outboxCountAfter: after.outboxCount, + zones: reports, + ); + } + + Future _createObserver(CloudSyncScope scope) async => + _observerFactory == null + ? const NoopCloudSyncObserver() + : _observerFactory(scope); + + Future _flushObserver(CloudSyncObserver observer) async { + if (observer case FlushableCloudSyncObserver flushable) { + await flushable.flush(); + } + } + + Future _flushObserverAfterFailure(CloudSyncObserver observer) async { + try { + await _flushObserver(observer); + } catch (_) { + // Preserve the primary synchronization failure. + } + } + + CloudSyncEngineConfig _config() => CloudSyncEngineConfig( + maximumBatchSize: changeLimit, + maximumFetchPagesPerRun: pageLimit, + maximumInboxEntriesPerRun: changeLimit, + maximumOutboxBatchesPerRun: 1, + fetchOperationTimeout: _fetchTimeout, + shadowJournalBudget: _journalBudget, + flags: const CloudSyncFeatureFlags( + readOnlyFetch: true, + semanticApply: true, + saves: false, + deletions: false, + profiles: false, + notificationHints: false, + ), + ); + + void _validatePreflight(CloudSyncShadowPreflightState state) { + if (!state.platformSupported) throw StateError('unsupported_platform'); + if (!state.uiIsolate) throw StateError('not_ui_isolate'); + if (!state.rustPushReady) throw StateError('rustpush_not_ready'); + if (!state.objectBoxReady) throw StateError('objectbox_not_ready'); + if (!state.privateStorageExists) throw StateError('storage_unavailable'); + if (state.logoutActive) throw StateError('logout_active'); + if (state.legacySyncEnabled || state.legacySyncActive) { + throw StateError('legacy_sync_active'); + } + if (state.coordinatorLeaseActive) throw StateError('coordinator_active'); + if (state.outboxCount != 0) throw StateError('outbox_not_empty'); + if (!state.protectorSentinelValid) { + throw StateError('protector_unavailable'); + } + } + + Future _requireSameAuth(CloudSyncNativeAuthSnapshot expected) async { + if (!expected.sameIdentity(await _readAuthSnapshot())) { + throw StateError('account_changed'); + } + } + + String _zoneLabel(String zone) => switch (zone) { + 'chatManateeZone' => 'chats', + 'messageManateeZone' => 'messages', + 'attachmentManateeZone' => 'attachments', + _ => throw StateError('unsupported_cloud_zone'), + }; +} diff --git a/lib/services/rustpush/cloud_sync/cloud_sync_manual_shadow_controller.dart b/lib/services/rustpush/cloud_sync/cloud_sync_manual_shadow_controller.dart new file mode 100644 index 0000000000..9be76802ab --- /dev/null +++ b/lib/services/rustpush/cloud_sync/cloud_sync_manual_shadow_controller.dart @@ -0,0 +1,76 @@ +import 'cloud_sync_manual_shadow_sampler.dart'; +import 'cloud_sync_shadow_report.dart'; +import 'cloud_sync_shadow_report_file.dart'; + +typedef CloudSyncConfirmedShadowRun = Future Function(); +typedef CloudSyncShadowReportPersist = + Future Function(CloudSyncShadowReport report); + +/// Account-lifecycle owner for the developer-only manual shadow run. +/// +/// Disposal closes admission immediately and then waits for the bounded native +/// fetch to finish before the owning Rust client can be released. This avoids +/// a logout or account switch disposing credentials underneath an in-flight +/// CloudKit operation. +final class CloudSyncManualShadowController { + factory CloudSyncManualShadowController({ + required CloudSyncConfirmedShadowRun runConfirmed, + required CloudSyncShadowReportPersist persistReport, + }) => CloudSyncManualShadowController._(runConfirmed, persistReport); + + CloudSyncManualShadowController._(this._runConfirmed, this._persistReport); + + factory CloudSyncManualShadowController.production({ + required CloudSyncManualShadowSampler sampler, + required CloudSyncShadowReportFileWriter reportWriter, + }) { + return CloudSyncManualShadowController( + runConfirmed: sampler.runConfirmed, + persistReport: reportWriter.write, + ); + } + + final CloudSyncConfirmedShadowRun _runConfirmed; + final CloudSyncShadowReportPersist _persistReport; + Future? _inFlight; + Future? _disposeFuture; + bool _admissionClosed = false; + + bool get isActive => _inFlight != null; + bool get isDisposed => _admissionClosed; + + Future runConfirmedAndPersist() { + if (_admissionClosed) { + throw StateError('cloud_sync_shadow_controller_disposed'); + } + if (_inFlight != null) { + throw StateError('cloud_sync_shadow_controller_active'); + } + late final Future operation; + operation = _runAndPersist().whenComplete(() { + if (identical(_inFlight, operation)) _inFlight = null; + }); + _inFlight = operation; + return operation; + } + + Future _runAndPersist() async { + final report = await _runConfirmed(); + await _persistReport(report); + return report; + } + + Future dispose() { + _admissionClosed = true; + return _disposeFuture ??= _waitForQuiescence(); + } + + Future _waitForQuiescence() async { + try { + await _inFlight; + } catch (_) { + // The caller of runConfirmedAndPersist receives the original error. + // Teardown cares only that the operation has stopped using credentials. + } + } +} diff --git a/lib/services/rustpush/cloud_sync/cloud_sync_manual_shadow_owner.dart b/lib/services/rustpush/cloud_sync/cloud_sync_manual_shadow_owner.dart new file mode 100644 index 0000000000..518b358afd --- /dev/null +++ b/lib/services/rustpush/cloud_sync/cloud_sync_manual_shadow_owner.dart @@ -0,0 +1,105 @@ +import 'cloud_sync_manual_shadow_controller.dart'; +import 'cloud_sync_shadow_report.dart'; + +typedef CloudSyncShadowControllerBuilder = + Future Function(); + +/// Lazily owns the developer-only sampler across account lifecycle changes. +/// +/// Account teardown closes admission before waiting for construction or an +/// active run. The owning Rust credentials can therefore be disposed only +/// after [quiesceForAccountTransition] completes. A later account may call +/// [resumeAfterAccountTransition], which forces a fresh controller. +final class CloudSyncManualShadowOwner { + CloudSyncManualShadowOwner({required this.buildController}); + + final CloudSyncShadowControllerBuilder buildController; + CloudSyncManualShadowController? _controller; + Future? _buildFuture; + Future? _quiesceFuture; + int _generation = 0; + bool _admissionOpen = true; + bool _disposed = false; + + bool get isActive => _controller?.isActive ?? false; + bool get isQuiescing => !_admissionOpen && !_disposed; + bool get isDisposed => _disposed; + + Future runConfirmedAndPersist() async { + if (_disposed) throw StateError('cloud_sync_shadow_owner_disposed'); + if (!_admissionOpen) { + throw StateError('cloud_sync_shadow_owner_quiescing'); + } + final generation = _generation; + final controller = await _controllerFor(generation); + if (_disposed || + !_admissionOpen || + generation != _generation || + !identical(controller, _controller)) { + throw StateError('cloud_sync_shadow_owner_superseded'); + } + return controller.runConfirmedAndPersist(); + } + + Future _controllerFor(int generation) { + final existing = _controller; + if (existing != null) return Future.value(existing); + final building = _buildFuture; + if (building != null) return building; + + late final Future operation; + operation = Future.sync(buildController) + .then((candidate) async { + if (_disposed || !_admissionOpen || generation != _generation) { + await candidate.dispose(); + throw StateError('cloud_sync_shadow_owner_superseded'); + } + _controller = candidate; + return candidate; + }) + .whenComplete(() { + if (identical(_buildFuture, operation)) _buildFuture = null; + }); + _buildFuture = operation; + return operation; + } + + /// Closes admission immediately and waits for all credential users to stop. + Future quiesceForAccountTransition() { + if (_disposed) return Future.value(); + _admissionOpen = false; + _generation++; + return _quiesceFuture ??= _quiesce(); + } + + Future _quiesce() async { + final building = _buildFuture; + if (building != null) { + try { + await building; + } catch (_) { + // A superseded build disposes its own candidate. + } + } + final controller = _controller; + _controller = null; + await controller?.dispose(); + } + + /// Reopens admission only after the previous account is fully quiescent. + Future resumeAfterAccountTransition() async { + if (_disposed) throw StateError('cloud_sync_shadow_owner_disposed'); + await _quiesceFuture; + _quiesceFuture = null; + _admissionOpen = true; + } + + Future dispose() async { + if (_disposed) return _quiesceFuture; + _disposed = true; + _admissionOpen = false; + _generation++; + _quiesceFuture ??= _quiesce(); + await _quiesceFuture; + } +} diff --git a/lib/services/rustpush/cloud_sync/cloud_sync_manual_shadow_sampler.dart b/lib/services/rustpush/cloud_sync/cloud_sync_manual_shadow_sampler.dart new file mode 100644 index 0000000000..aaedb750f9 --- /dev/null +++ b/lib/services/rustpush/cloud_sync/cloud_sync_manual_shadow_sampler.dart @@ -0,0 +1,370 @@ +import 'dart:async'; +import 'dart:convert'; +import 'dart:math'; + +import 'cloud_shadow_journal_budget.dart'; +import 'cloud_sync_dev_gate.dart'; +import 'cloud_sync_engine.dart'; +import 'cloud_sync_models.dart'; +import 'cloud_sync_observability.dart'; +import 'cloud_sync_runtime.dart'; +import 'cloud_sync_shadow_report.dart'; +import 'cloud_sync_shadow_transport.dart'; +import 'cloud_sync_store.dart'; +import 'cloud_sync_transport.dart'; +import 'cloudkit_operation_interlock.dart'; +import 'shadow_only_cloud_sync_store.dart'; + +/// Immutable native-issued binding between one Rust Cloud Messages client, +/// its raw account identifier (retained natively), and its derived fingerprint. +/// +/// [nativeSessionId] is an opaque, non-secret generation tag. The raw account +/// identifier and client object never enter Dart. +final class CloudSyncNativeAuthSnapshot { + const CloudSyncNativeAuthSnapshot._({ + required this.nativeSessionId, + required this.accountFingerprint, + required this.protectedStoreIdentity, + required this.cloudMessagesClient, + }); + + /// Native adapters are the only production callers of this constructor. + /// Tests may use it to model account replacement without exposing a DSID. + factory CloudSyncNativeAuthSnapshot.fromNative({ + required String nativeSessionId, + required String accountFingerprint, + required String protectedStoreIdentity, + required Object cloudMessagesClient, + }) { + if (nativeSessionId.isEmpty || + !RegExp(r'^[A-Za-z0-9_-]{43}$').hasMatch(accountFingerprint) || + !RegExp( + r'^obcs2\.store\.[A-Za-z0-9_-]{43}$', + ).hasMatch(protectedStoreIdentity)) { + throw ArgumentError('Native auth snapshot fields are invalid'); + } + return CloudSyncNativeAuthSnapshot._( + nativeSessionId: nativeSessionId, + accountFingerprint: accountFingerprint, + protectedStoreIdentity: protectedStoreIdentity, + cloudMessagesClient: cloudMessagesClient, + ); + } + + final String nativeSessionId; + final String accountFingerprint; + final String protectedStoreIdentity; + final Object cloudMessagesClient; + + bool sameIdentity(CloudSyncNativeAuthSnapshot? other) => + other != null && + identical(cloudMessagesClient, other.cloudMessagesClient) && + nativeSessionId == other.nativeSessionId && + accountFingerprint == other.accountFingerprint && + protectedStoreIdentity == other.protectedStoreIdentity; +} + +typedef CloudSyncNativeAuthSnapshotReader = + Future Function(); +typedef CloudSyncShadowStoreFactory = + Future Function(CloudSyncScope scope); +typedef CloudSyncShadowRawTransportFactory = + Future Function( + CloudSyncNativeAuthSnapshot authSnapshot, + CloudSyncScope scope, + ); + +class CloudSyncShadowPreflightState { + const CloudSyncShadowPreflightState({ + required this.platformSupported, + required this.uiIsolate, + required this.rustPushReady, + required this.objectBoxReady, + required this.privateStorageExists, + required this.logoutActive, + required this.legacySyncEnabled, + required this.legacySyncActive, + required this.coordinatorLeaseActive, + required this.outboxCount, + required this.protectorSentinelValid, + }); + + final bool platformSupported; + final bool uiIsolate; + final bool rustPushReady; + final bool objectBoxReady; + final bool privateStorageExists; + final bool logoutActive; + final bool legacySyncEnabled; + final bool legacySyncActive; + final bool coordinatorLeaseActive; + final int outboxCount; + final bool protectorSentinelValid; +} + +typedef CloudSyncShadowPreflightReader = + Future Function(); + +/// Owns the complete safe composition. Callers cannot inject an engine, +/// semantic applier, or unguarded transport. +final class CloudSyncManualShadowSampler { + CloudSyncManualShadowSampler({ + required this._readPreflight, + required this._readAuthSnapshot, + required this._createStore, + required this._createRawTransport, + required CloudSyncStore operationFenceStore, + required String privateStorageDirectory, + required this.platform, + required this.architecture, + required this.buildCommit, + this._observerFactory, + bool? compileGateOverrideForTest, + Duration? fetchTimeoutOverrideForTest, + }) : _operationInterlock = CloudKitOperationInterlock( + privateStorageDirectory: privateStorageDirectory, + fenceStore: operationFenceStore, + ), + _fetchTimeout = fetchTimeoutOverrideForTest ?? _maximumFetchTimeout, + _enabled = + compileGateOverrideForTest ?? + CloudSyncDevGate.manualShadowSamplerEnabled { + if (_fetchTimeout <= Duration.zero || + _fetchTimeout > _maximumFetchTimeout) { + throw ArgumentError.value(fetchTimeoutOverrideForTest); + } + } + + static const container = 'com.apple.messages.cloud'; + static const database = 'private'; + static const zones = [ + 'chatManateeZone', + 'messageManateeZone', + 'attachmentManateeZone', + 'messageUpdateZone', + 'recoverableMessageDeleteZone', + 'scheduledMessageZone', + 'chat1ManateeZone', + ]; + static const pageLimit = 1; + static const changeLimit = 50; + static const _maximumFetchTimeout = Duration(seconds: 45); + static final journalBudget = CloudShadowJournalBudget( + maximumEntriesPerScope: 512, + maximumEstimatedBytesPerScope: 8 * 1024 * 1024, + maximumPendingAge: const Duration(hours: 24), + ); + + final CloudSyncShadowPreflightReader _readPreflight; + final CloudSyncNativeAuthSnapshotReader _readAuthSnapshot; + final CloudSyncShadowStoreFactory _createStore; + final CloudSyncShadowRawTransportFactory _createRawTransport; + final CloudKitOperationInterlock _operationInterlock; + final String platform; + final String architecture; + final String buildCommit; + final CloudSyncObserverFactory? _observerFactory; + final Duration _fetchTimeout; + final bool _enabled; + bool _active = false; + + bool get isActive => _active; + CloudSyncFeatureFlags get debugFlags => _config().flags; + + Future runConfirmed() async { + if (!_enabled) throw StateError('cloud_sync_sampler_disabled'); + if (_active) throw StateError('cloud_sync_sampler_active'); + _active = true; + try { + return await _operationInterlock.runExclusive( + kind: CloudKitOperationKind.v2ShadowRead, + action: _runConfirmedUnderInterlock, + ); + } finally { + _active = false; + } + } + + Future _runConfirmedUnderInterlock() async { + final before = await _readPreflight(); + _validatePreflight(before); + final auth = await _readAuthSnapshot(); + if (auth == null) throw StateError('account_unavailable'); + + final reports = []; + for (final zone in zones) { + await _requireSameAuth(auth); + final scope = CloudSyncScope( + accountFingerprint: auth.accountFingerprint, + container: container, + database: database, + zone: zone, + ); + final store = ShadowOnlyCloudSyncStore(await _createStore(scope)); + final observer = await _createObserver(scope); + final rawTransport = await _createRawTransport(auth, scope); + CloudSyncShadowRuntime? runtime; + try { + final guardedTransport = AccountBoundShadowTransport( + delegate: rawTransport, + readActiveFingerprint: () async { + final current = await _readAuthSnapshot(); + return auth.sameIdentity(current) + ? current!.accountFingerprint + : null; + }, + expectedFingerprint: auth.accountFingerprint, + ); + final engine = CloudSyncEngine( + scope: scope, + coordinatorId: 'manual-shadow-${auth.nativeSessionId}-$zone', + architectureName: architecture, + store: store, + transport: guardedTransport, + inboxApplier: const RejectingShadowInboxApplier(), + config: _config(), + observer: observer, + ); + runtime = CloudSyncShadowRuntime( + engines: [engine], + automaticTriggersEnabled: false, + debounce: Duration.zero, + ); + final result = (await runtime.synchronizeNow()).single; + await _flushObserver(observer); + _requireZeroMutationCounters(result.counters); + reports.add( + CloudSyncShadowZoneReport( + zoneLabel: _zoneLabel(zone), + status: result.status, + fetched: result.counters.fetched, + journaled: result.counters.shadowJournalEntries, + rejected: result.counters.shadowJournalRejectedEntries, + estimatedBytes: result.counters.shadowJournalEstimatedBytes, + elapsedMilliseconds: result.finishedAt + .difference(result.startedAt) + .inMilliseconds, + failureCategory: result.failureCategory, + skipReason: result.skipReason, + blockReason: result.shadowJournalBlockReason, + ), + ); + } catch (_) { + await _flushObserverAfterFailure(observer); + rethrow; + } finally { + await runtime?.dispose(); + if (rawTransport case CloudSyncNativeOperationQuiescence quiescence) { + await quiescence.quiesceNativeOperations(); + } + } + await _requireSameAuth(auth); + } + + final after = await _readPreflight(); + _validatePreflight(after); + if (after.outboxCount != before.outboxCount) { + throw StateError('cloud_sync_shadow_write_tripwire'); + } + return CloudSyncShadowReport( + runId: 'obcs2-shadow-${DateTime.now().microsecondsSinceEpoch}', + correlationTag: _ephemeralCorrelationTag(), + timestampUtc: DateTime.now().toUtc(), + platform: platform, + architecture: architecture, + buildCommit: buildCommit, + legacySyncEnabled: before.legacySyncEnabled, + pageLimit: pageLimit, + changeLimit: changeLimit, + tripwiresArmed: true, + outboxCountBefore: before.outboxCount, + outboxCountAfter: after.outboxCount, + zones: reports, + ); + } + + Future _createObserver(CloudSyncScope scope) async => + _observerFactory == null + ? const NoopCloudSyncObserver() + : _observerFactory(scope); + + Future _flushObserver(CloudSyncObserver observer) async { + if (observer case FlushableCloudSyncObserver flushable) { + await flushable.flush(); + } + } + + Future _flushObserverAfterFailure(CloudSyncObserver observer) async { + try { + await _flushObserver(observer); + } catch (_) { + // Preserve the primary synchronization failure. + } + } + + CloudSyncEngineConfig _config() => CloudSyncEngineConfig( + maximumBatchSize: changeLimit, + maximumFetchPagesPerRun: pageLimit, + maximumInboxEntriesPerRun: changeLimit, + maximumOutboxBatchesPerRun: 1, + fetchOperationTimeout: _fetchTimeout, + shadowJournalBudget: journalBudget, + flags: const CloudSyncFeatureFlags( + readOnlyFetch: true, + semanticApply: false, + saves: false, + deletions: false, + profiles: false, + notificationHints: false, + ), + ); + + void _validatePreflight(CloudSyncShadowPreflightState state) { + if (!state.platformSupported) throw StateError('unsupported_platform'); + if (!state.uiIsolate) throw StateError('not_ui_isolate'); + if (!state.rustPushReady) throw StateError('rustpush_not_ready'); + if (!state.objectBoxReady) throw StateError('objectbox_not_ready'); + if (!state.privateStorageExists) throw StateError('storage_unavailable'); + if (state.logoutActive) throw StateError('logout_active'); + if (state.legacySyncEnabled || state.legacySyncActive) { + throw StateError('legacy_sync_active'); + } + if (state.coordinatorLeaseActive) throw StateError('coordinator_active'); + if (state.outboxCount != 0) throw StateError('outbox_not_empty'); + if (!state.protectorSentinelValid) { + throw StateError('protector_unavailable'); + } + } + + Future _requireSameAuth(CloudSyncNativeAuthSnapshot expected) async { + if (!expected.sameIdentity(await _readAuthSnapshot())) { + throw StateError('account_changed'); + } + } + + void _requireZeroMutationCounters(CloudSyncRunCounters counters) { + if (counters.applied != 0 || + counters.confirmed != 0 || + counters.deferred != 0 || + counters.retried != 0) { + throw StateError('cloud_sync_shadow_write_tripwire'); + } + } + + String _ephemeralCorrelationTag() { + final random = Random.secure(); + final bytes = List.generate(12, (_) => random.nextInt(256)); + return base64Url.encode(bytes).replaceAll('=', ''); + } + + String _zoneLabel(String zone) => switch (zone) { + 'chatManateeZone' => 'chats', + 'messageManateeZone' => 'messages', + 'attachmentManateeZone' => 'attachments', + 'messageUpdateZone' => 'message updates', + 'recoverableMessageDeleteZone' => 'recoverable deletes', + 'scheduledMessageZone' => 'scheduled messages', + 'chat1ManateeZone' => 'chat1 manatee', + _ => throw StateError('unsupported_cloud_zone'), + }; +} diff --git a/lib/services/rustpush/cloud_sync/cloud_sync_models.dart b/lib/services/rustpush/cloud_sync/cloud_sync_models.dart new file mode 100644 index 0000000000..16a361e490 --- /dev/null +++ b/lib/services/rustpush/cloud_sync/cloud_sync_models.dart @@ -0,0 +1,1107 @@ +import 'dart:collection'; + +final RegExp _canonicalAppleUuidPattern = RegExp( + r'^[0-9A-F]{8}-[0-9A-F]{4}-[0-9A-F]{4}-[0-9A-F]{4}-[0-9A-F]{12}$', +); + +bool _isCanonicalAppleUuid(String value) => + _canonicalAppleUuidPattern.hasMatch(value); + +enum CloudSyncStreamKind { messages, profiles } + +/// Account and CloudKit-zone boundary for every V2 record and operation. +/// +/// [accountFingerprint] must be a one-way, application-scoped fingerprint. +/// Raw DSIDs and Apple IDs are not valid values. +class CloudSyncScope { + static final RegExp _accountFingerprintPattern = RegExp( + r'^[A-Za-z0-9_-]{43}$', + ); + static const int _maximumComponentLength = 256; + static const int _maximumSchemaVersion = 1 << 20; + + CloudSyncScope({ + required this.accountFingerprint, + required this.container, + required this.database, + required this.zone, + this.streamKind = CloudSyncStreamKind.messages, + this.schemaVersion = 2, + }) { + if (!_accountFingerprintPattern.hasMatch(accountFingerprint)) { + throw ArgumentError('cloud_sync_scope_account_fingerprint_invalid'); + } + if (!_isValidComponent(container)) { + throw ArgumentError('cloud_sync_scope_container_invalid'); + } + if (!_isValidComponent(database)) { + throw ArgumentError('cloud_sync_scope_database_invalid'); + } + if (!_isValidComponent(zone)) { + throw ArgumentError('cloud_sync_scope_zone_invalid'); + } + if (schemaVersion <= 0 || schemaVersion > _maximumSchemaVersion) { + throw ArgumentError('cloud_sync_scope_schema_version_invalid'); + } + } + + static bool _isValidComponent( + String value, { + int maximumLength = _maximumComponentLength, + }) { + if (value.isEmpty || value.length > maximumLength) return false; + for (final codeUnit in value.codeUnits) { + if (codeUnit == 0x1f || + codeUnit < 0x20 || + (codeUnit >= 0x7f && codeUnit <= 0x9f)) { + return false; + } + } + return true; + } + + final String accountFingerprint; + final String container; + final String database; + final String zone; + final CloudSyncStreamKind streamKind; + final int schemaVersion; + + String get storageKey => + '$accountFingerprint\u001f$container\u001f$database\u001f$zone\u001f${streamKind.name}\u001f$schemaVersion'; + + /// Safe, bounded identifier for diagnostics. It intentionally excludes the + /// container, database, zone, and full account fingerprint. + String get diagnosticKey { + final prefix = accountFingerprint.length <= 8 + ? accountFingerprint + : accountFingerprint.substring(0, 8); + return 'acct:$prefix/v$schemaVersion'; + } + + @override + bool operator ==(Object other) => + other is CloudSyncScope && other.storageKey == storageKey; + + @override + int get hashCode => storageKey.hashCode; + + @override + String toString() => 'CloudSyncScope($diagnosticKey)'; +} + +/// Typed reset input produced after the protected remote reset/identity +/// checks have completed. The store treats the proof reference as opaque and +/// never resolves it inside an ObjectBox transaction. +final class CloudSyncResetRebootstrapRequest { + CloudSyncResetRebootstrapRequest({ + required this.scope, + required this.transitionIdHash, + required this.activeIdentityFingerprint, + required this.expectedGeneration, + required this.protectedRemoteStateProofReference, + }) { + if (!_isDigest(transitionIdHash) || + activeIdentityFingerprint != scope.accountFingerprint || + expectedGeneration <= 0 || + !_isProtectedReference(protectedRemoteStateProofReference)) { + throw ArgumentError('cloud_reset_rebootstrap_request_invalid'); + } + } + + final CloudSyncScope scope; + final String transitionIdHash; + final String activeIdentityFingerprint; + final int expectedGeneration; + final String protectedRemoteStateProofReference; + + @override + String toString() => 'CloudSyncResetRebootstrapRequest(redacted)'; +} + +/// Receipt emitted only after the store has atomically completed a reset +/// rebootstrap. It is the only accepted input for authority reset completion. +final class CloudSyncResetCompletionProof { + CloudSyncResetCompletionProof({ + required this.scope, + required this.transitionIdHash, + required this.activeIdentityFingerprint, + required this.previousGeneration, + required this.generation, + required this.protectedRemoteStateProofReference, + }) { + if (!_isDigest(transitionIdHash) || + activeIdentityFingerprint != scope.accountFingerprint || + previousGeneration <= 0 || + generation != previousGeneration + 1 || + !_isProtectedReference(protectedRemoteStateProofReference)) { + throw ArgumentError('cloud_reset_completion_proof_invalid'); + } + } + + final CloudSyncScope scope; + final String transitionIdHash; + final String activeIdentityFingerprint; + final int previousGeneration; + final int generation; + final String protectedRemoteStateProofReference; + + bool binds(CloudSyncResetRebootstrapRequest request) => + scope == request.scope && + transitionIdHash == request.transitionIdHash && + activeIdentityFingerprint == request.activeIdentityFingerprint && + previousGeneration == request.expectedGeneration && + protectedRemoteStateProofReference == + request.protectedRemoteStateProofReference; + + @override + String toString() => 'CloudSyncResetCompletionProof(redacted)'; +} + +bool _isDigest(String value) => RegExp(r'^[a-f0-9]{64}$').hasMatch(value); + +bool _isProtectedReference(String value) => + value.length <= 256 && + value.startsWith('obcs2.ref.') && + !value.contains(RegExp(r'[\x00-\x1f\x7f-\x9f]')); + +bool _isProtectedLeaseReference(String value) => + RegExp(r'^obcs2\.lease\.[0-9a-f]{32}$').hasMatch(value); + +bool _isNativeProtectedReference(String value) => + RegExp(r'^obcs2\.ref\.[A-Za-z0-9_-]{43}$').hasMatch(value); + +bool _isNativeDigest(String value) => + RegExp(r'^[A-Za-z0-9_-]{43}$').hasMatch(value); + +bool _isOperationId(String value) => + RegExp(r'^op1:[a-f0-9]{64}$').hasMatch(value); + +enum CloudChangeType { save, delete } + +enum CloudInboxStatus { pending, applied, quarantined } + +enum CloudOutboxAction { save, delete } + +/// Durable outbox states. Keep the order stable because ObjectBox persists the +/// explicit integer mapping in its state column. +enum CloudOutboxStatus { + pending, + leased, + confirmed, + paused, + quarantined, + unknownOutcome, +} + +enum CloudEntityKind { + chat, + message, + attachment, + reaction, + groupPhoto, + sharedProfile, +} + +enum CloudFailureCategory { + network, + throttled, + server, + authorization, + pcsUnavailable, + malformedRecord, + conflict, + dependency, + localStorage, + cancelled, + unknown, +} + +extension CloudFailureCategoryBehavior on CloudFailureCategory { + bool get isRetryable => switch (this) { + CloudFailureCategory.network || + CloudFailureCategory.throttled || + CloudFailureCategory.server || + CloudFailureCategory.authorization || + CloudFailureCategory.pcsUnavailable || + CloudFailureCategory.dependency || + CloudFailureCategory.localStorage => true, + CloudFailureCategory.malformedRecord || + CloudFailureCategory.conflict || + CloudFailureCategory.cancelled || + CloudFailureCategory.unknown => false, + }; +} + +class CloudSyncFailure implements Exception { + CloudSyncFailure({required this.category, this.retryAfter, this.safeCode}) { + if (retryAfter != null && retryAfter!.inMicroseconds < 0) { + throw ArgumentError('cloud_sync_failure_retry_after_invalid'); + } + if (safeCode != null && !_safeCodePattern.hasMatch(safeCode!)) { + throw ArgumentError('cloud_sync_failure_safe_code_invalid'); + } + } + + static final RegExp _safeCodePattern = RegExp(r'^[a-z0-9][a-z0-9_-]{0,95}$'); + + final CloudFailureCategory category; + final Duration? retryAfter; + + /// An allowlisted diagnostic code only. Never place server bodies, record + /// identifiers, handles, tokens, or message content here. + final String? safeCode; + + @override + String toString() => + 'CloudSyncFailure(category: ${category.name}, code: ${safeCode ?? 'none'})'; +} + +/// A fetched CloudKit change whose payload remains encrypted or is represented +/// by an encrypted local reference. +class CloudFetchedChange { + CloudFetchedChange({ + required this.changeId, + required this.recordIdHash, + required this.type, + this.etagHash, + this.encryptedServerRecordId, + this.protectedSystemFieldsReference, + this.encryptedPayloadReference, + this.payloadSha256, + this.isTombstone = false, + this.serverModifiedAt, + this.preflightFailure, + }) { + if (changeId.isEmpty) { + throw ArgumentError('cloud_fetched_change_id_invalid'); + } + if (recordIdHash.isEmpty) { + throw ArgumentError('cloud_fetched_record_id_hash_invalid'); + } + if (etagHash != null && etagHash!.isEmpty) { + throw ArgumentError('cloud_fetched_etag_hash_invalid'); + } + if (encryptedServerRecordId != null && encryptedServerRecordId!.isEmpty) { + throw ArgumentError('cloud_fetched_server_record_reference_invalid'); + } + if (protectedSystemFieldsReference != null && + protectedSystemFieldsReference!.isEmpty) { + throw ArgumentError('cloud_fetched_system_fields_reference_invalid'); + } + if (encryptedPayloadReference != null && + encryptedPayloadReference!.isEmpty) { + throw ArgumentError('cloud_fetched_payload_reference_invalid'); + } + if (payloadSha256 != null && payloadSha256!.isEmpty) { + throw ArgumentError('cloud_fetched_payload_digest_invalid'); + } + if (isTombstone != (type == CloudChangeType.delete)) { + throw ArgumentError('cloud_fetched_tombstone_type_invalid'); + } + } + + /// Deterministic, account-scoped digest used to deduplicate replayed pages. + final String changeId; + final String recordIdHash; + final String? etagHash; + final CloudChangeType type; + + /// Application-encrypted server identifier and raw CloudKit system fields. + /// Tombstones may need these even when no etag or payload remains. + final String? encryptedServerRecordId; + final String? protectedSystemFieldsReference; + + /// A ciphertext blob identifier or protected local keystore reference. + /// Decrypted message content must never be placed here. + final String? encryptedPayloadReference; + final String? payloadSha256; + final bool isTombstone; + final DateTime? serverModifiedAt; + + /// Set only when the Rust ingestion boundary has already proven that the + /// raw server record is malformed or unsupported. The durable engine + /// journals the original protected bytes, then quarantines the entry + /// without invoking a semantic decoder. + final CloudFailureCategory? preflightFailure; +} + +class CloudFetchBatch { + CloudFetchBatch({ + required this.scope, + required Iterable changes, + required this.batchId, + required this.generation, + required this.nextToken, + required this.hasMore, + this.protectedPageLeaseReference, + }) : changes = List.unmodifiable(changes) { + if (batchId.isEmpty) { + throw ArgumentError('cloud_fetch_batch_id_invalid'); + } + if (generation <= 0) { + throw ArgumentError('cloud_fetch_batch_generation_invalid'); + } + if (protectedPageLeaseReference != null && + !RegExp( + r'^obcs2\.lease\.[0-9a-f]{32}$', + ).hasMatch(protectedPageLeaseReference!)) { + throw ArgumentError('cloud_fetch_batch_lease_reference_invalid'); + } + } + + final CloudSyncScope scope; + final List changes; + final String batchId; + final int generation; + + /// Opaque token. Store adapters must protect it at rest and observers must + /// never emit it. + final String? nextToken; + final bool hasMore; + + /// Opaque native protected-page lease. The durable store adopts this value + /// atomically with the journal/checkpoint before native blob finalization. + final String? protectedPageLeaseReference; +} + +class CloudInboxEntry { + CloudInboxEntry({ + required this.scope, + required this.sequence, + required this.change, + required this.status, + required this.attemptCount, + required this.createdAt, + required this.batchId, + required this.generation, + this.nextEligibleAt, + this.lastFailure, + this.completedAt, + }) { + if (sequence <= 0) { + throw ArgumentError('cloud_inbox_sequence_invalid'); + } + if (attemptCount < 0) { + throw ArgumentError('cloud_inbox_attempt_count_invalid'); + } + if (batchId.isEmpty) { + throw ArgumentError('cloud_inbox_batch_id_invalid'); + } + if (generation <= 0) { + throw ArgumentError('cloud_inbox_generation_invalid'); + } + } + + final CloudSyncScope scope; + final int sequence; + final CloudFetchedChange change; + final CloudInboxStatus status; + final int attemptCount; + final DateTime createdAt; + final String batchId; + final int generation; + final DateTime? nextEligibleAt; + final CloudFailureCategory? lastFailure; + final DateTime? completedAt; + + CloudInboxEntry copyWith({ + CloudInboxStatus? status, + int? attemptCount, + DateTime? nextEligibleAt, + bool clearNextEligibleAt = false, + CloudFailureCategory? lastFailure, + bool clearLastFailure = false, + DateTime? completedAt, + }) { + return CloudInboxEntry( + scope: scope, + sequence: sequence, + change: change, + status: status ?? this.status, + attemptCount: attemptCount ?? this.attemptCount, + createdAt: createdAt, + batchId: batchId, + generation: generation, + nextEligibleAt: clearNextEligibleAt + ? null + : nextEligibleAt ?? this.nextEligibleAt, + lastFailure: clearLastFailure ? null : lastFailure ?? this.lastFailure, + completedAt: completedAt ?? this.completedAt, + ); + } +} + +class CloudSyncCheckpoint { + CloudSyncCheckpoint({ + required this.scope, + this.fetchedToken, + this.generation = 1, + this.lastBatchId, + this.fetchedSequence = 0, + this.lastAppliedSequence = 0, + this.mutationRevisionCounter = 0, + this.consecutivePullFailures = 0, + this.nextPullEligibleAt, + this.lastSuccessfulRunAt, + this.lastFailure, + }) { + if (generation <= 0) { + throw ArgumentError('cloud_checkpoint_generation_invalid'); + } + if (fetchedSequence < 0) { + throw ArgumentError('cloud_checkpoint_fetched_sequence_invalid'); + } + if (lastAppliedSequence < 0) { + throw ArgumentError('cloud_checkpoint_applied_sequence_invalid'); + } + if (mutationRevisionCounter < 0) { + throw ArgumentError('cloud_checkpoint_mutation_revision_invalid'); + } + if (consecutivePullFailures < 0) { + throw ArgumentError('cloud_checkpoint_pull_failures_invalid'); + } + } + + final CloudSyncScope scope; + final String? fetchedToken; + final int generation; + final String? lastBatchId; + final int fetchedSequence; + + /// Highest contiguous terminal inbox sequence. Applied and quarantined rows + /// advance it; pending and retryable rows continue to block it. + final int lastAppliedSequence; + final int mutationRevisionCounter; + final int consecutivePullFailures; + final DateTime? nextPullEligibleAt; + final DateTime? lastSuccessfulRunAt; + final CloudFailureCategory? lastFailure; + + CloudSyncCheckpoint copyWith({ + String? fetchedToken, + bool clearFetchedToken = false, + int? generation, + String? lastBatchId, + int? fetchedSequence, + int? lastAppliedSequence, + int? mutationRevisionCounter, + int? consecutivePullFailures, + DateTime? nextPullEligibleAt, + bool clearNextPullEligibleAt = false, + DateTime? lastSuccessfulRunAt, + CloudFailureCategory? lastFailure, + bool clearLastFailure = false, + }) { + return CloudSyncCheckpoint( + scope: scope, + fetchedToken: clearFetchedToken + ? null + : fetchedToken ?? this.fetchedToken, + generation: generation ?? this.generation, + lastBatchId: lastBatchId ?? this.lastBatchId, + fetchedSequence: fetchedSequence ?? this.fetchedSequence, + lastAppliedSequence: lastAppliedSequence ?? this.lastAppliedSequence, + mutationRevisionCounter: + mutationRevisionCounter ?? this.mutationRevisionCounter, + consecutivePullFailures: + consecutivePullFailures ?? this.consecutivePullFailures, + nextPullEligibleAt: clearNextPullEligibleAt + ? null + : nextPullEligibleAt ?? this.nextPullEligibleAt, + lastSuccessfulRunAt: lastSuccessfulRunAt ?? this.lastSuccessfulRunAt, + lastFailure: clearLastFailure ? null : lastFailure ?? this.lastFailure, + ); + } +} + +class CloudOutboxSubmissionIdentity { + CloudOutboxSubmissionIdentity({ + required this.requestUuid, + required Map operationUuids, + }) : operationUuids = Map.unmodifiable(operationUuids) { + if (!_isCanonicalAppleUuid(requestUuid)) { + throw ArgumentError('cloud_outbox_request_uuid_invalid'); + } + if (operationUuids.isEmpty || + operationUuids.keys.any((operationId) => operationId.isEmpty) || + operationUuids.values.any((uuid) => !_isCanonicalAppleUuid(uuid)) || + operationUuids.values.toSet().length != operationUuids.length || + operationUuids.values.contains(requestUuid)) { + throw ArgumentError('cloud_outbox_operation_uuid_map_invalid'); + } + } + + final String requestUuid; + final Map operationUuids; + + void validateOperationIds(Iterable operationIds) { + final expected = operationIds.toSet(); + if (expected.length != operationUuids.length || + !expected.containsAll(operationUuids.keys)) { + throw ArgumentError('cloud_outbox_submission_identity_mismatch'); + } + } +} + +class CloudOutboxOperation { + CloudOutboxOperation({ + required this.scope, + required this.operationId, + required this.logicalEntityKeyHash, + required this.action, + required this.payloadVersion, + required this.mutationRevision, + required this.checkpointGeneration, + required Iterable dependencyOperationIds, + required this.createdAt, + this.encryptedPayloadReference, + this.payloadSha256, + this.serverRecordIdHash, + this.protectedLeaseReference, + this.appleRequestUuid, + this.appleOperationUuid, + this.status = CloudOutboxStatus.pending, + this.attemptCount = 0, + this.nextEligibleAt, + this.lastFailure, + this.leaseId, + this.leaseExpiresAt, + this.confirmedAt, + }) : dependencyOperationIds = Set.unmodifiable( + dependencyOperationIds.toSet(), + ) { + if (operationId.isEmpty) { + throw ArgumentError('cloud_outbox_operation_id_invalid'); + } + if (logicalEntityKeyHash.isEmpty) { + throw ArgumentError('cloud_outbox_logical_key_invalid'); + } + if (payloadVersion <= 0) { + throw ArgumentError('cloud_outbox_payload_version_invalid'); + } + if (mutationRevision < 0) { + throw ArgumentError('cloud_outbox_mutation_revision_invalid'); + } + if (checkpointGeneration <= 0) { + throw ArgumentError('cloud_outbox_checkpoint_generation_invalid'); + } + if (encryptedPayloadReference != null && + encryptedPayloadReference!.isEmpty) { + throw ArgumentError('cloud_outbox_payload_reference_invalid'); + } + if (payloadSha256 != null && payloadSha256!.isEmpty) { + throw ArgumentError('cloud_outbox_payload_digest_invalid'); + } + if (serverRecordIdHash != null && serverRecordIdHash!.isEmpty) { + throw ArgumentError('cloud_outbox_server_record_hash_invalid'); + } + if (protectedLeaseReference != null && + !_isProtectedLeaseReference(protectedLeaseReference!)) { + throw ArgumentError('cloud_outbox_protected_lease_reference_invalid'); + } + if ((appleRequestUuid == null) != (appleOperationUuid == null)) { + throw ArgumentError('cloud_outbox_submission_identity_incomplete'); + } + if (appleRequestUuid != null && + (!_isCanonicalAppleUuid(appleRequestUuid!) || + !_isCanonicalAppleUuid(appleOperationUuid!) || + appleRequestUuid == appleOperationUuid || + operationId == appleOperationUuid)) { + throw ArgumentError('cloud_outbox_submission_identity_invalid'); + } + if (action != CloudOutboxAction.delete && + (encryptedPayloadReference == null || payloadSha256 == null)) { + throw ArgumentError('cloud_outbox_save_payload_missing'); + } + if (attemptCount < 0) { + throw ArgumentError('cloud_outbox_attempt_count_invalid'); + } + } + + final CloudSyncScope scope; + final String operationId; + final String logicalEntityKeyHash; + final CloudOutboxAction action; + final int payloadVersion; + final int mutationRevision; + + /// Generation of the scope checkpoint which admitted this mutation. + /// + /// A rebootstrap advances the checkpoint generation and terminally fences + /// every older non-terminal outbox row. This value must therefore never be + /// zero, including after an ObjectBox schema migration. + final int checkpointGeneration; + + /// A ciphertext blob identifier or protected local keystore reference. + final String? encryptedPayloadReference; + final String? payloadSha256; + final String? serverRecordIdHash; + + /// Native protected lease adopted by this outbox row. + /// + /// This is deliberately separate from the page-lease adoption marker. It + /// remains live while the outbound operation is non-terminal. + final String? protectedLeaseReference; + final String? appleRequestUuid; + final String? appleOperationUuid; + final Set dependencyOperationIds; + final DateTime createdAt; + final CloudOutboxStatus status; + final int attemptCount; + final DateTime? nextEligibleAt; + final CloudFailureCategory? lastFailure; + final String? leaseId; + final DateTime? leaseExpiresAt; + final DateTime? confirmedAt; + + CloudOutboxOperation copyWith({ + CloudOutboxStatus? status, + int? attemptCount, + DateTime? nextEligibleAt, + bool clearNextEligibleAt = false, + CloudFailureCategory? lastFailure, + bool clearLastFailure = false, + String? leaseId, + bool clearLeaseId = false, + DateTime? leaseExpiresAt, + bool clearLeaseExpiresAt = false, + DateTime? confirmedAt, + Set? dependencyOperationIds, + String? encryptedPayloadReference, + String? payloadSha256, + String? serverRecordIdHash, + String? protectedLeaseReference, + bool clearProtectedLeaseReference = false, + String? appleRequestUuid, + String? appleOperationUuid, + bool clearSubmissionIdentity = false, + }) { + return CloudOutboxOperation( + scope: scope, + operationId: operationId, + logicalEntityKeyHash: logicalEntityKeyHash, + action: action, + payloadVersion: payloadVersion, + mutationRevision: mutationRevision, + checkpointGeneration: checkpointGeneration, + encryptedPayloadReference: + encryptedPayloadReference ?? this.encryptedPayloadReference, + payloadSha256: payloadSha256 ?? this.payloadSha256, + serverRecordIdHash: serverRecordIdHash ?? this.serverRecordIdHash, + protectedLeaseReference: clearProtectedLeaseReference + ? null + : protectedLeaseReference ?? this.protectedLeaseReference, + appleRequestUuid: clearSubmissionIdentity + ? null + : appleRequestUuid ?? this.appleRequestUuid, + appleOperationUuid: clearSubmissionIdentity + ? null + : appleOperationUuid ?? this.appleOperationUuid, + dependencyOperationIds: + dependencyOperationIds ?? this.dependencyOperationIds, + createdAt: createdAt, + status: status ?? this.status, + attemptCount: attemptCount ?? this.attemptCount, + nextEligibleAt: clearNextEligibleAt + ? null + : nextEligibleAt ?? this.nextEligibleAt, + lastFailure: clearLastFailure ? null : lastFailure ?? this.lastFailure, + leaseId: clearLeaseId ? null : leaseId ?? this.leaseId, + leaseExpiresAt: clearLeaseExpiresAt + ? null + : leaseExpiresAt ?? this.leaseExpiresAt, + confirmedAt: confirmedAt ?? this.confirmedAt, + ); + } +} + +class CloudOutboxDraft { + CloudOutboxDraft({ + required this.scope, + required this.logicalEntityKeyHash, + required this.action, + required this.payloadVersion, + required Iterable dependencyOperationIds, + required this.createdAt, + this.encryptedPayloadReference, + this.payloadSha256, + this.serverRecordIdHash, + this.protectedLeaseReference, + }) : dependencyOperationIds = Set.unmodifiable( + dependencyOperationIds.toSet(), + ) { + if (logicalEntityKeyHash.isEmpty) { + throw ArgumentError('cloud_outbox_draft_logical_key_invalid'); + } + if (payloadVersion <= 0) { + throw ArgumentError('cloud_outbox_draft_payload_version_invalid'); + } + if (encryptedPayloadReference != null && + encryptedPayloadReference!.isEmpty) { + throw ArgumentError('cloud_outbox_draft_payload_reference_invalid'); + } + if (payloadSha256 != null && payloadSha256!.isEmpty) { + throw ArgumentError('cloud_outbox_draft_payload_digest_invalid'); + } + if (serverRecordIdHash != null && serverRecordIdHash!.isEmpty) { + throw ArgumentError('cloud_outbox_draft_server_record_hash_invalid'); + } + if (protectedLeaseReference != null && + !_isProtectedLeaseReference(protectedLeaseReference!)) { + throw ArgumentError( + 'cloud_outbox_draft_protected_lease_reference_invalid', + ); + } + if (action != CloudOutboxAction.delete && + (encryptedPayloadReference == null || payloadSha256 == null)) { + throw ArgumentError('cloud_outbox_draft_save_payload_missing'); + } + } + + final CloudSyncScope scope; + final String logicalEntityKeyHash; + final CloudOutboxAction action; + final int payloadVersion; + final Set dependencyOperationIds; + final DateTime createdAt; + final String? encryptedPayloadReference; + final String? payloadSha256; + final String? serverRecordIdHash; + final String? protectedLeaseReference; +} + +enum CloudPushDisposition { + confirmed, + retryable, + unauthorized, + pcsUnavailable, + serverRecordChanged, + quarantined, + unknownOutcome, +} + +class CloudPushOutcome { + CloudPushOutcome({ + required this.operationId, + required this.disposition, + this.failureCategory, + this.retryAfter, + }) { + final operationIdMatch = _operationIdPattern.matchAsPrefix(operationId); + if (operationIdMatch == null || + operationIdMatch.end != operationId.length) { + // Keep the rejected value out of the exception. Operation IDs are + // correlation keys and must not become a diagnostic data-leak path. + throw ArgumentError('cloud_push_outcome_operation_id_invalid'); + } + if (retryAfter != null && retryAfter!.isNegative) { + throw ArgumentError('cloud_push_outcome_retry_after_invalid'); + } + if (disposition == CloudPushDisposition.unknownOutcome && + failureCategory != CloudFailureCategory.unknown) { + throw ArgumentError('cloud_push_unknown_outcome_requires_unknown'); + } + } + + static final RegExp _operationIdPattern = RegExp(r'op1:[0-9a-f]{64}'); + + final String operationId; + final CloudPushDisposition disposition; + final CloudFailureCategory? failureCategory; + final Duration? retryAfter; + + @override + String toString() => 'CloudPushOutcome(${disposition.name}, redacted)'; +} + +class CloudPushBatchResult { + CloudPushBatchResult({required Iterable outcomes}) + : outcomes = UnmodifiableMapView(_indexOutcomes(outcomes)); + + static Map _indexOutcomes( + Iterable values, + ) { + final indexed = {}; + for (final outcome in values) { + if (indexed.containsKey(outcome.operationId)) { + // Do not include the duplicate ID in the exception. The batch must + // fail closed instead of silently choosing one of two outcomes. + throw ArgumentError('cloud_push_batch_duplicate_outcome_id'); + } + indexed[outcome.operationId] = outcome; + } + return indexed; + } + + final Map outcomes; + + @override + String toString() => 'CloudPushBatchResult(count: ${outcomes.length})'; +} + +/// Result of reading CloudKit after a write response was lost. +/// +/// The transport performs the protected semantic comparison. The Dart engine +/// never inspects message content or treats a transport retry as proof that a +/// write did not commit. +enum CloudUnknownOutcomeDisposition { + committed, + notApplied, + serverRecordChanged, + unresolved, + quarantined, +} + +/// Content-free evidence binding one protected server-state comparison to the +/// exact durable mutation it resolved. Production transports create the +/// opaque proof reference inside the protected Rust boundary. +final class CloudUnknownOutcomeProof { + CloudUnknownOutcomeProof({ + required this.operationId, + required this.appleRequestUuid, + required this.appleOperationUuid, + required this.scopeStorageKey, + required this.checkpointGeneration, + required this.logicalEntityKeyHash, + required this.serverRecordIdHash, + required this.action, + required this.expectedPayloadSha256, + required this.protectedProofReference, + this.observedEtagHash, + }) { + if (!_isOperationId(operationId) || + !_isCanonicalAppleUuid(appleRequestUuid) || + !_isCanonicalAppleUuid(appleOperationUuid) || + appleRequestUuid == appleOperationUuid || + scopeStorageKey.isEmpty || + checkpointGeneration <= 0 || + !_isNativeDigest(logicalEntityKeyHash) || + !_isNativeDigest(serverRecordIdHash) || + !_isNativeProtectedReference(protectedProofReference) || + (action == CloudOutboxAction.save && expectedPayloadSha256 == null) || + (expectedPayloadSha256 != null && !_isDigest(expectedPayloadSha256!)) || + (action == CloudOutboxAction.delete && expectedPayloadSha256 != null)) { + throw ArgumentError('cloud_unknown_outcome_proof_invalid'); + } + } + + final String operationId; + final String appleRequestUuid; + final String appleOperationUuid; + final String scopeStorageKey; + final int checkpointGeneration; + final String logicalEntityKeyHash; + final String serverRecordIdHash; + final CloudOutboxAction action; + final String? expectedPayloadSha256; + final String protectedProofReference; + final String? observedEtagHash; + + bool binds(CloudOutboxOperation operation) => + action == CloudOutboxAction.save && + operationId == operation.operationId && + appleRequestUuid == operation.appleRequestUuid && + appleOperationUuid == operation.appleOperationUuid && + scopeStorageKey == operation.scope.storageKey && + checkpointGeneration == operation.checkpointGeneration && + logicalEntityKeyHash == operation.logicalEntityKeyHash && + serverRecordIdHash == operation.serverRecordIdHash && + action == operation.action && + expectedPayloadSha256 == operation.payloadSha256 && + protectedProofReference == operation.encryptedPayloadReference; + + @override + String toString() => 'CloudUnknownOutcomeProof(redacted)'; +} + +class CloudUnknownOutcomeResolution { + const CloudUnknownOutcomeResolution._({ + required this.disposition, + this.proof, + this.failureCategory, + this.retryAfter, + }); + + const CloudUnknownOutcomeResolution.committed({ + required CloudUnknownOutcomeProof proof, + }) : this._( + disposition: CloudUnknownOutcomeDisposition.committed, + proof: proof, + ); + + const CloudUnknownOutcomeResolution.notApplied({ + required CloudUnknownOutcomeProof proof, + }) : this._( + disposition: CloudUnknownOutcomeDisposition.notApplied, + proof: proof, + ); + + const CloudUnknownOutcomeResolution.serverRecordChanged({ + required CloudUnknownOutcomeProof proof, + }) : this._( + disposition: CloudUnknownOutcomeDisposition.serverRecordChanged, + proof: proof, + failureCategory: CloudFailureCategory.conflict, + ); + + const CloudUnknownOutcomeResolution.unresolved({ + required CloudFailureCategory failureCategory, + Duration? retryAfter, + }) : this._( + disposition: CloudUnknownOutcomeDisposition.unresolved, + failureCategory: failureCategory, + retryAfter: retryAfter, + ); + + const CloudUnknownOutcomeResolution.quarantined({ + required CloudFailureCategory failureCategory, + }) : this._( + disposition: CloudUnknownOutcomeDisposition.quarantined, + failureCategory: failureCategory, + ); + + final CloudUnknownOutcomeDisposition disposition; + final CloudUnknownOutcomeProof? proof; + final CloudFailureCategory? failureCategory; + final Duration? retryAfter; + + @override + String toString() => + 'CloudUnknownOutcomeResolution(${disposition.name}, redacted)'; +} + +class CloudRecordMapEntry { + const CloudRecordMapEntry({ + required this.scope, + required this.logicalEntityKeyHash, + required this.serverRecordIdHash, + required this.encryptedServerRecordId, + this.etagHash, + this.encryptedRawRecordReference, + required this.updatedAt, + }); + + final CloudSyncScope scope; + final String logicalEntityKeyHash; + final String serverRecordIdHash; + + /// Protected keystore reference to the Apple record ID. Observers must never + /// emit the resolved value. + final String encryptedServerRecordId; + final String? etagHash; + final String? encryptedRawRecordReference; + final DateTime updatedAt; +} + +class CloudSyncRunRecord { + const CloudSyncRunRecord({ + required this.scope, + required this.runId, + required this.triggerName, + required this.architectureName, + required this.startedAt, + required this.finishedAt, + required this.counters, + required this.modeName, + this.failureCategory, + }); + + final CloudSyncScope scope; + final String runId; + final String triggerName; + final String architectureName; + final DateTime startedAt; + final DateTime finishedAt; + final CloudSyncRunCounters counters; + final String modeName; + final CloudFailureCategory? failureCategory; +} + +enum CloudInboxApplyDisposition { applied, deferred, retryable, quarantined } + +class CloudInboxApplyResult { + const CloudInboxApplyResult.applied({this.inboxStatusPersisted = false}) + : disposition = CloudInboxApplyDisposition.applied, + failureCategory = null, + retryAfter = null; + + const CloudInboxApplyResult.deferred({ + this.failureCategory = CloudFailureCategory.dependency, + this.retryAfter, + }) : disposition = CloudInboxApplyDisposition.deferred, + inboxStatusPersisted = false; + + const CloudInboxApplyResult.retryable({ + required this.failureCategory, + this.retryAfter, + }) : disposition = CloudInboxApplyDisposition.retryable, + inboxStatusPersisted = false; + + const CloudInboxApplyResult.quarantined({ + required this.failureCategory, + this.inboxStatusPersisted = false, + }) : disposition = CloudInboxApplyDisposition.quarantined, + retryAfter = null; + + final CloudInboxApplyDisposition disposition; + final CloudFailureCategory? failureCategory; + final Duration? retryAfter; + + /// True only when the semantic gateway committed the canonical mutation, + /// replay outcome, record mapping, and inbox terminal state atomically. + final bool inboxStatusPersisted; +} + +class CloudSyncRunCounters { + const CloudSyncRunCounters({ + this.fetched = 0, + this.applied = 0, + this.deferred = 0, + this.quarantined = 0, + this.confirmed = 0, + this.retried = 0, + this.shadowJournalEntries = 0, + this.shadowJournalEstimatedBytes = 0, + this.shadowJournalRejectedEntries = 0, + }); + + final int fetched; + final int applied; + final int deferred; + final int quarantined; + final int confirmed; + final int retried; + + /// Redacted Phase 1 gauges. They contain counts only, never identifiers, + /// tokens, payload references, or message content. + final int shadowJournalEntries; + final int shadowJournalEstimatedBytes; + final int shadowJournalRejectedEntries; + + CloudSyncRunCounters add({ + int fetched = 0, + int applied = 0, + int deferred = 0, + int quarantined = 0, + int confirmed = 0, + int retried = 0, + int shadowJournalEntries = 0, + int shadowJournalEstimatedBytes = 0, + int shadowJournalRejectedEntries = 0, + }) { + return CloudSyncRunCounters( + fetched: this.fetched + fetched, + applied: this.applied + applied, + deferred: this.deferred + deferred, + quarantined: this.quarantined + quarantined, + confirmed: this.confirmed + confirmed, + retried: this.retried + retried, + shadowJournalEntries: this.shadowJournalEntries + shadowJournalEntries, + shadowJournalEstimatedBytes: + this.shadowJournalEstimatedBytes + shadowJournalEstimatedBytes, + shadowJournalRejectedEntries: + this.shadowJournalRejectedEntries + shadowJournalRejectedEntries, + ); + } +} diff --git a/lib/services/rustpush/cloud_sync/cloud_sync_observability.dart b/lib/services/rustpush/cloud_sync/cloud_sync_observability.dart new file mode 100644 index 0000000000..a37c2f9571 --- /dev/null +++ b/lib/services/rustpush/cloud_sync/cloud_sync_observability.dart @@ -0,0 +1,119 @@ +import 'cloud_shadow_journal_budget.dart'; +import 'cloud_sync_models.dart'; + +enum CloudSyncEventType { + runStarted, + runSkipped, + fetchCompleted, + inboxApplied, + outboxFlushed, + authenticationRefreshed, + pcsRefreshed, + serverConflictReconciled, + backoffScheduled, + shadowJournalBlocked, + runCompleted, + runFailed, + runCancelled, +} + +enum CloudSyncTrigger { + startup, + networkReconnect, + localOutbox, + idsReconnect, + detectedGap, + manual, + notificationHint, +} + +enum CloudSyncSkipReason { + localRunActive, + coordinatorLeaseUnavailable, + pullBackoffActive, + featureDisabled, +} + +/// Redacted, bounded event. It has no arbitrary message field by design. +class CloudSyncEvent { + const CloudSyncEvent({ + required this.type, + required this.scopeDiagnosticKey, + required this.at, + this.trigger, + this.failureCategory, + this.skipReason, + this.shadowJournalBlockReason, + this.count = 0, + this.estimatedBytes = 0, + this.attempt = 0, + this.elapsed = Duration.zero, + }); + + final CloudSyncEventType type; + final String scopeDiagnosticKey; + final DateTime at; + final CloudSyncTrigger? trigger; + final CloudFailureCategory? failureCategory; + final CloudSyncSkipReason? skipReason; + final CloudShadowJournalBlockReason? shadowJournalBlockReason; + final int count; + final int estimatedBytes; + final int attempt; + final Duration elapsed; + + @override + String toString() { + return 'CloudSyncEvent(' + 'type=${type.name}, ' + 'scope=$scopeDiagnosticKey, ' + 'trigger=${trigger?.name ?? 'none'}, ' + 'failure=${failureCategory?.name ?? 'none'}, ' + 'skip=${skipReason?.name ?? 'none'}, ' + 'journalBlock=${shadowJournalBlockReason?.name ?? 'none'}, ' + 'count=$count, estimatedBytes=$estimatedBytes, attempt=$attempt, ' + 'elapsedMs=${elapsed.inMilliseconds})'; + } +} + +abstract interface class CloudSyncObserver { + void onEvent(CloudSyncEvent event); +} + +abstract interface class FlushableCloudSyncObserver + implements CloudSyncObserver { + Future flush(); +} + +typedef CloudSyncObserverFactory = + Future Function(CloudSyncScope scope); + +class NoopCloudSyncObserver implements CloudSyncObserver { + const NoopCloudSyncObserver(); + + @override + void onEvent(CloudSyncEvent event) {} +} + +class MemoryCloudSyncObserver implements CloudSyncObserver { + static const int maximumAllowedEvents = 4096; + + MemoryCloudSyncObserver({this.maximumEvents = 256}) { + if (maximumEvents <= 0 || maximumEvents > maximumAllowedEvents) { + throw ArgumentError('cloud_sync_observer_capacity_invalid'); + } + } + + final int maximumEvents; + final List _events = []; + + List get events => List.unmodifiable(_events); + + @override + void onEvent(CloudSyncEvent event) { + if (_events.length == maximumEvents) { + _events.removeAt(0); + } + _events.add(event); + } +} diff --git a/lib/services/rustpush/cloud_sync/cloud_sync_outbound_admission.dart b/lib/services/rustpush/cloud_sync/cloud_sync_outbound_admission.dart new file mode 100644 index 0000000000..a8ec74835d --- /dev/null +++ b/lib/services/rustpush/cloud_sync/cloud_sync_outbound_admission.dart @@ -0,0 +1,83 @@ +// ignore_for_file: prefer_initializing_formals + +import 'package:bluebubbles/src/rust/api/api.dart' as frb_api; + +import 'cloud_sync_models.dart'; +import 'cloud_sync_outbound_staging.dart'; +import 'objectbox_cloud_sync_store.dart'; + +/// Crash-safe admission for the first create-only outbound text canary. +final class CloudSyncOutboundAdmissionCoordinator { + const CloudSyncOutboundAdmissionCoordinator({ + required ObjectBoxCloudSyncStore store, + required CloudSyncOutboundStagingTransport transport, + required Future Function() ensureProtectedStoreRecovered, + }) : _store = store, + _transport = transport, + _ensureProtectedStoreRecovered = ensureProtectedStoreRecovered; + + final ObjectBoxCloudSyncStore _store; + final CloudSyncOutboundStagingTransport _transport; + final Future Function() _ensureProtectedStoreRecovered; + + Future admitMessage( + CloudSyncScope scope, { + required frb_api.CloudMessage message, + required DateTime createdAt, + }) => _transport.runOutboundAdmissionExclusive(() async { + await _ensureProtectedStoreRecovered(); + final stage = await _transport.stageOutboundMessage( + scope, + message: message, + ); + final draft = CloudOutboxDraft( + scope: scope, + logicalEntityKeyHash: stage.logicalEntityKeyHash, + action: CloudOutboxAction.save, + payloadVersion: 1, + dependencyOperationIds: const {}, + createdAt: createdAt, + encryptedPayloadReference: stage.protectedEnvelopeReference, + payloadSha256: stage.payloadSha256, + serverRecordIdHash: stage.serverRecordIdHash, + protectedLeaseReference: stage.leaseReference, + ); + var adoptedByOutbox = false; + try { + final operation = await _store.admitProtectedOutboundCreate( + draft: draft, + recordMapping: CloudRecordMapEntry( + scope: scope, + logicalEntityKeyHash: stage.logicalEntityKeyHash, + serverRecordIdHash: stage.serverRecordIdHash, + encryptedServerRecordId: stage.protectedEnvelopeReference, + updatedAt: createdAt, + ), + ); + if (operation.protectedLeaseReference != stage.leaseReference) { + await _rollbackBestEffort(stage.leaseReference); + return operation; + } + adoptedByOutbox = true; + await _transport.commitOutboundLease( + stage.leaseReference, + stage.protectedEnvelopeReference, + ); + return operation; + } catch (_) { + if (!adoptedByOutbox) { + await _rollbackBestEffort(stage.leaseReference); + } + rethrow; + } + }); + + Future _rollbackBestEffort(String leaseReference) async { + try { + await _transport.rollbackOutboundLease(leaseReference); + } catch (_) { + // An unadopted manifest is safe to leak. Bounded startup recovery rolls + // it back without touching any ObjectBox-adopted operation. + } + } +} diff --git a/lib/services/rustpush/cloud_sync/cloud_sync_outbound_canary_candidate.dart b/lib/services/rustpush/cloud_sync/cloud_sync_outbound_canary_candidate.dart new file mode 100644 index 0000000000..561b886ad9 --- /dev/null +++ b/lib/services/rustpush/cloud_sync/cloud_sync_outbound_canary_candidate.dart @@ -0,0 +1,293 @@ +import 'dart:convert'; + +import 'package:bluebubbles/database/database.dart'; +import 'package:bluebubbles/database/models.dart'; +import 'package:bluebubbles/src/rust/api/api.dart' as api; +import 'package:crypto/crypto.dart'; + +/// Read-only source used by the outbound canary candidate selector. +/// +/// Implementations must not save, update, or delete any entity while reading. +abstract interface class CloudSyncOutboundCanaryMessageReader { + List readMessages(); +} + +/// The production ObjectBox reader. The query is deliberately limited to +/// outgoing rows; the selector still validates [Message.isFromMe] again so a +/// different reader cannot weaken the safety boundary. +final class ObjectBoxCloudSyncOutboundCanaryMessageReader + implements CloudSyncOutboundCanaryMessageReader { + const ObjectBoxCloudSyncOutboundCanaryMessageReader({this.messages}); + + final Box? messages; + + Box get _box => messages ?? Database.messages; + + @override + List readMessages() { + final query = _box.query(Message_.isFromMe.equals(true)).build(); + try { + return query.find(); + } finally { + query.close(); + } + } +} + +typedef CloudSyncOutboundCanaryCloudEncoder = + api.CloudMessage Function(Message message); + +/// Redacted information about one already-existing local message that passed +/// every outbound canary safety check. +/// +/// The CloudMessage is intentionally available for the next, separately +/// confirmed canary step, but this object's diagnostics never include its +/// contents, destination, or local handle. +final class CloudSyncOutboundCanaryCandidate { + CloudSyncOutboundCanaryCandidate._({ + required this.cloudMessage, + required this.guidHash, + required this.createdAtUtc, + required this.characterCount, + }); + + final api.CloudMessage cloudMessage; + + /// The first 16 hexadecimal characters of SHA-256(guid). + final String guidHash; + + final DateTime createdAtUtc; + final int characterCount; + + Map toJson() => { + 'guidHash': guidHash, + 'createdAtUtc': createdAtUtc.toIso8601String(), + 'characterCount': characterCount, + }; + + @override + String toString() => + 'CloudSyncOutboundCanaryCandidate(' + 'guidHash=$guidHash, ' + 'createdAtUtc=${createdAtUtc.toIso8601String()}, ' + 'characterCount=$characterCount)'; +} + +/// Selects the newest strictly ordinary, one-to-one outgoing iMessage text. +/// +/// Selection is read-only. No legacy uploader is called. Conversion to a +/// [api.CloudMessage] is deferred until after all local filters pass, and the +/// default conversion is the existing [Message.toCloud] path with attachments +/// disabled. The rejected shapes are intentionally conservative because this +/// candidate is the first possible V2 write. +final class CloudSyncOutboundCanaryCandidateSelector { + static const maximumCandidateAge = Duration(minutes: 10); + + CloudSyncOutboundCanaryCandidateSelector({ + CloudSyncOutboundCanaryMessageReader? reader, + CloudSyncOutboundCanaryCloudEncoder? encoder, + DateTime Function()? clock, + }) : _reader = + reader ?? const ObjectBoxCloudSyncOutboundCanaryMessageReader(), + _encoder = encoder ?? ((message) => message.toCloud(true)), + _clock = clock ?? DateTime.now; + + final CloudSyncOutboundCanaryMessageReader _reader; + final CloudSyncOutboundCanaryCloudEncoder _encoder; + final DateTime Function() _clock; + + /// Returns the newest eligible candidate, or null if no row is safe. + /// + /// Only the newest outgoing row is considered. Falling back to an older row + /// could silently select a different conversation than the operator expects. + CloudSyncOutboundCanaryCandidate? selectNewest() { + final messages = List.of(_reader.readMessages()); + messages.sort(_newestFirst); + if (messages.isEmpty) return null; + + final now = _clock().toUtc(); + final message = messages.first; + final validated = _validate(message, now: now); + if (validated == null) return null; + + try { + final cloudMessage = _encoder(message); + return CloudSyncOutboundCanaryCandidate._( + cloudMessage: cloudMessage, + guidHash: _guidHash(message.guid!), + createdAtUtc: validated.createdAtUtc, + characterCount: validated.characterCount, + ); + } catch (_) { + // Conversion failure rejects this selection without trying another row. + // Message text must never enter diagnostics. + return null; + } + } + + static int _newestFirst(Message left, Message right) { + final leftDate = left.dateCreated; + final rightDate = right.dateCreated; + if (leftDate == null && rightDate == null) { + return (right.guid ?? '').compareTo(left.guid ?? ''); + } + if (leftDate == null) return 1; + if (rightDate == null) return -1; + final dateOrder = rightDate.compareTo(leftDate); + if (dateOrder != 0) return dateOrder; + return (right.guid ?? '').compareTo(left.guid ?? ''); + } + + static String _guidHash(String guid) => + sha256.convert(utf8.encode(guid)).toString().substring(0, 16); + + static _ValidatedCanaryMessage? _validate( + Message message, { + required DateTime now, + }) { + if (message.isFromMe != true) return null; + + final guid = message.guid; + if (guid == null || guid.isEmpty || guid.trim() != guid) return null; + if (guid.startsWith('temp') || guid.startsWith('error')) return null; + + final text = message.text; + final createdAt = message.dateCreated; + if (text == null || text.trim().isEmpty || createdAt == null) return null; + final createdAtUtc = createdAt.toUtc(); + if (createdAtUtc.isAfter(now)) return null; + if (now.difference(createdAtUtc) > maximumCandidateAge) return null; + + // These fields identify non-ordinary messages or a row that another + // writer is still changing. Treat even empty metadata maps as unsafe. + if (message.dateScheduled != null || + message.dateDeleted != null || + message.stagingGuid != null || + message.sendingServiceId != null || + message.error != 0 || + message.temp || + message.verificationFailed) { + return null; + } + if (message.ckRecordId != null || message.ckSyncState) return null; + if (message.subject?.trim().isNotEmpty == true) return null; + if (message.expressiveSendStyleId != null || + message.balloonBundleId != null || + message.payloadData != null || + message.hasApplePayloadData || + message.metadata != null || + message.messageSummaryInfo.isNotEmpty || + message.dateEdited != null || + message.amkSessionId != null) { + return null; + } + + // Do not select a reaction, sticker, reply, group event, or any message + // with an associated child. The associatedMessages relation is read-only. + if (message.associatedMessageGuid != null || + message.associatedMessagePart != null || + message.associatedMessageType != null || + message.associatedMessageEmoji != null || + message.associatedMessages.isNotEmpty || + message.hasReactions || + message.threadOriginatorGuid != null || + message.threadOriginatorPart != null || + message.itemType != null && message.itemType! > 0 || + message.groupTitle != null || + message.groupActionType != null && message.groupActionType! > 0 || + message.bigEmoji == true) { + return null; + } + + // Check both serialized attachment fields and the ObjectBox relation. + // Attachment-bearing attributed runs are rejected before toCloud(true). + if (message.hasAttachments || + message.attachments.isNotEmpty || + message.dbAttachments.isNotEmpty) { + return null; + } + + final bodies = message.attributedBody; + if (bodies.length != 1) return null; + final body = bodies.single; + if (body.string.isEmpty || + body.string.trim().isEmpty || + text != body.string) { + return null; + } + + var cursor = 0; + if (body.runs.isEmpty) return null; + for (final run in body.runs) { + if (run.range.length != 2) return null; + final start = run.range[0]; + final length = run.range[1]; + if (start != cursor || length <= 0 || start < 0) return null; + final end = start + length; + if (end > body.string.length) return null; + + final attributes = run.attributes; + if (attributes == null || + attributes.messagePart != 0 || + attributes.attachmentGuid != null || + attributes.mention != null || + attributes.audioTranscript != null || + attributes.stickerData != null || + attributes.textEffect != null || + attributes.bold == true || + attributes.italic == true || + attributes.strikethrough == true || + attributes.underline == true) { + return null; + } + cursor = end; + } + if (cursor != body.string.length) return null; + + final chat = message.chat.target; + if (chat == null || + chat.guid.trim().isEmpty || + chat.chatIdentifier?.trim().isEmpty != false || + chat.usingHandle?.trim().isEmpty != false || + chat.isRpSms || + chat.isRoutingStub || + chat.style == 43) { + return null; + } + + final chatGuid = chat.guid.toLowerCase(); + if (chatGuid.startsWith('sms') || + chatGuid.startsWith('mms') || + chatGuid.startsWith('rcs')) { + return null; + } + + // A single loaded iMessage participant plus the non-group style is the + // minimum evidence needed to safely avoid group-chat encoding. + // Use the persisted relation directly when available. This keeps the + // selector read-only and avoids requiring a second global ObjectBox + // lookup merely to inspect a chat returned by the supplied box. + final participants = chat.handles.isNotEmpty + ? chat.handles.toList(growable: false) + : chat.participants; + if (participants.length != 1 || chat.style == 43) return null; + if (participants.single.service.trim().toLowerCase() != 'imessage') { + return null; + } + + return _ValidatedCanaryMessage( + createdAtUtc: createdAtUtc, + characterCount: body.string.runes.length, + ); + } +} + +final class _ValidatedCanaryMessage { + const _ValidatedCanaryMessage({ + required this.createdAtUtc, + required this.characterCount, + }); + + final DateTime createdAtUtc; + final int characterCount; +} diff --git a/lib/services/rustpush/cloud_sync/cloud_sync_outbound_staging.dart b/lib/services/rustpush/cloud_sync/cloud_sync_outbound_staging.dart new file mode 100644 index 0000000000..0804b2e04b --- /dev/null +++ b/lib/services/rustpush/cloud_sync/cloud_sync_outbound_staging.dart @@ -0,0 +1,37 @@ +import 'package:bluebubbles/src/rust/api/api.dart' as frb_api; + +import 'cloud_sync_models.dart'; + +final class CloudSyncProtectedOutboundStageData { + const CloudSyncProtectedOutboundStageData({ + required this.logicalEntityKeyHash, + required this.protectedEnvelopeReference, + required this.payloadSha256, + required this.serverRecordIdHash, + required this.leaseReference, + }); + + final String logicalEntityKeyHash; + final String protectedEnvelopeReference; + final String payloadSha256; + final String serverRecordIdHash; + final String leaseReference; +} + +abstract interface class CloudSyncOutboundStagingTransport { + /// Holds the same per-store gate used by recovery across the complete + /// stage -> durable adoption -> native lease commit crash window. + Future runOutboundAdmissionExclusive(Future Function() action); + + Future stageOutboundMessage( + CloudSyncScope scope, { + required frb_api.CloudMessage message, + }); + + Future commitOutboundLease( + String leaseReference, + String protectedEnvelopeReference, + ); + + Future rollbackOutboundLease(String leaseReference); +} diff --git a/lib/services/rustpush/cloud_sync/cloud_sync_persistent_keys.dart b/lib/services/rustpush/cloud_sync/cloud_sync_persistent_keys.dart new file mode 100644 index 0000000000..9d0433f573 --- /dev/null +++ b/lib/services/rustpush/cloud_sync/cloud_sync_persistent_keys.dart @@ -0,0 +1,13 @@ +import 'dart:convert'; + +import 'package:crypto/crypto.dart'; + +import 'cloud_sync_models.dart'; + +/// Canonical durable key for a Cloud Sync scope. +/// +/// Keep every ObjectBox producer and query on this helper. Comparing a raw +/// [CloudSyncScope.storageKey] with the persisted digest silently misses the +/// same scope. +String cloudSyncPersistentScopeKey(CloudSyncScope scope) => + 'scope2:${sha256.convert(utf8.encode(scope.storageKey))}'; diff --git a/lib/services/rustpush/cloud_sync/cloud_sync_platform.dart b/lib/services/rustpush/cloud_sync/cloud_sync_platform.dart new file mode 100644 index 0000000000..7f85bcf605 --- /dev/null +++ b/lib/services/rustpush/cloud_sync/cloud_sync_platform.dart @@ -0,0 +1,208 @@ +import 'package:path/path.dart' as path; + +import 'cloud_sync_engine.dart'; +import 'cloud_sync_runtime.dart'; + +enum CloudSyncPlatformKind { android, windows } + +enum CloudSyncArchitecture { arm64, x64 } + +/// Account and private-storage boundary supplied by the platform bootstrap. +/// +/// [accountFingerprint] is the protected application-scoped fingerprint, never +/// a DSID or Apple Account address. The private storage directory is used only +/// for platform protection material and must not be a filesystem root. +final class CloudSyncPlatformContext { + CloudSyncPlatformContext({ + required this.platform, + required this.architecture, + required String accountFingerprint, + required String privateStorageDirectory, + }) : accountFingerprint = _requireNonempty( + accountFingerprint, + 'accountFingerprint', + ), + privateStorageDirectory = _validatePrivateStorageDirectory( + privateStorageDirectory, + ); + + final CloudSyncPlatformKind platform; + final CloudSyncArchitecture architecture; + final String accountFingerprint; + final String privateStorageDirectory; + + static String _requireNonempty(String value, String name) { + final normalized = value.trim(); + if (normalized.isEmpty) throw ArgumentError.value(value, name); + return normalized; + } + + static String _validatePrivateStorageDirectory(String value) { + final normalized = _requireNonempty(value, 'privateStorageDirectory'); + final style = normalized.startsWith('/') + ? path.Style.posix + : path.Style.windows; + final context = path.Context(style: style); + if (!context.isAbsolute(normalized)) { + throw ArgumentError.value( + value, + 'privateStorageDirectory', + 'Must be an absolute private application-support directory', + ); + } + final canonical = context.normalize(normalized); + if (canonical == context.rootPrefix(canonical)) { + throw ArgumentError.value( + value, + 'privateStorageDirectory', + 'A filesystem root is not a valid private storage directory', + ); + } + return canonical; + } +} + +/// Future platform wake sources. Every source is disabled by default. +/// +/// Enabling a field alone is insufficient: [automaticTriggerRolloutEnabled] +/// must also be enabled when composing the adapter. This two-key boundary +/// prevents a platform callback from accidentally activating the dormant +/// shadow engine. +class CloudSyncPlatformTriggerPolicy { + const CloudSyncPlatformTriggerPolicy({ + this.androidApnsWake = false, + this.androidWorkManagerWake = false, + this.windowsStartup = false, + this.windowsResume = false, + this.networkReconnect = false, + }); + + final bool androidApnsWake; + final bool androidWorkManagerWake; + final bool windowsStartup; + final bool windowsResume; + final bool networkReconnect; +} + +/// Dormant lifecycle owner for one account-scoped shadow runtime. +/// +/// It contains no timers or polling. A manual run is possible only when the +/// developer sampler gate is explicitly supplied by its future composition. +class CloudSyncPlatformAdapter { + CloudSyncPlatformAdapter({ + required this.context, + required CloudSyncShadowRuntime runtime, + this.triggerPolicy = const CloudSyncPlatformTriggerPolicy(), + this.manualSamplerEnabled = false, + this.automaticTriggerRolloutEnabled = false, + }) : _runtime = runtime { + if (_runtime.automaticTriggersEnabled) { + throw ArgumentError.value( + runtime, + 'runtime', + 'Platform composition requires a dormant shadow runtime', + ); + } + } + + final CloudSyncPlatformContext context; + final CloudSyncPlatformTriggerPolicy triggerPolicy; + final bool manualSamplerEnabled; + final bool automaticTriggerRolloutEnabled; + final CloudSyncShadowRuntime _runtime; + Future? _disposeFuture; + + bool get isDisposed => _disposeFuture != null || _runtime.isDisposed; + + Future> synchronizeNow() { + if (isDisposed) { + throw StateError('Cloud Sync platform adapter is disposed'); + } + if (!manualSamplerEnabled) { + throw StateError('Cloud Sync V2 manual sampler is disabled'); + } + return _runtime.synchronizeNow(); + } + + void onAndroidApnsWake() { + if (_automaticAllowed(triggerPolicy.androidApnsWake)) { + _runtime.onIdsReconnect(); + } + } + + void onAndroidWorkManagerWake() { + if (_automaticAllowed(triggerPolicy.androidWorkManagerWake)) { + _runtime.onNetworkReconnect(); + } + } + + void onWindowsStartup() { + if (_automaticAllowed(triggerPolicy.windowsStartup)) { + _runtime.onStartup(); + } + } + + void onWindowsResume() { + if (_automaticAllowed(triggerPolicy.windowsResume)) { + _runtime.onNetworkReconnect(); + } + } + + void onNetworkReconnect() { + if (_automaticAllowed(triggerPolicy.networkReconnect)) { + _runtime.onNetworkReconnect(); + } + } + + Future dispose() => _disposeFuture ??= _runtime.dispose(); + + bool _automaticAllowed(bool sourceEnabled) => + !isDisposed && automaticTriggerRolloutEnabled && sourceEnabled; +} + +typedef CloudSyncPlatformAdapterBuilder = + Future Function(CloudSyncPlatformContext context); + +/// Owns at most one account composition and quiesces it before replacement. +/// +/// This is the lifecycle boundary for logout/account switch. It prevents old +/// credentials from remaining active while a new account opens its namespace. +class CloudSyncPlatformHost { + CloudSyncPlatformAdapter? _active; + int _activationGeneration = 0; + + CloudSyncPlatformAdapter? get active => _active; + + Future activate({ + required CloudSyncPlatformContext context, + required CloudSyncPlatformAdapterBuilder build, + }) async { + final generation = ++_activationGeneration; + final previous = _active; + _active = null; + if (previous != null) await previous.dispose(); + + final created = await build(context); + if (generation != _activationGeneration) { + await created.dispose(); + throw StateError('Cloud Sync platform activation was superseded'); + } + if (created.context.accountFingerprint != context.accountFingerprint || + created.context.privateStorageDirectory != + context.privateStorageDirectory || + created.context.platform != context.platform || + created.context.architecture != context.architecture) { + await created.dispose(); + throw StateError('Cloud Sync platform composition context mismatch'); + } + _active = created; + return created; + } + + Future dispose() async { + _activationGeneration++; + final current = _active; + _active = null; + await current?.dispose(); + } +} diff --git a/lib/services/rustpush/cloud_sync/cloud_sync_production_preflight.dart b/lib/services/rustpush/cloud_sync/cloud_sync_production_preflight.dart new file mode 100644 index 0000000000..2b2a88411e --- /dev/null +++ b/lib/services/rustpush/cloud_sync/cloud_sync_production_preflight.dart @@ -0,0 +1,133 @@ +import 'dart:async'; + +import 'cloud_sync_manual_shadow_sampler.dart'; + +typedef CloudSyncBooleanProbe = FutureOr Function(); +typedef CloudSyncLocalPreflightProbe = + FutureOr Function(); + +final class CloudSyncLocalPreflightState { + const CloudSyncLocalPreflightState({ + required this.objectBoxReady, + required this.coordinatorLeaseActive, + required this.outboxCount, + }); + + const CloudSyncLocalPreflightState.blocked() + : objectBoxReady = false, + coordinatorLeaseActive = true, + outboxCount = -1; + + final bool objectBoxReady; + final bool coordinatorLeaseActive; + final int outboxCount; +} + +/// Fail-closed production probe for the developer-only shadow sampler. +/// +/// Platform composition supplies narrow readers instead of exposing mutable +/// service or ObjectBox objects to the sampler. A failed read is represented by +/// the safest blocking value and never includes the underlying exception in a +/// diagnostic surface. +final class CloudSyncProductionPreflightProbe { + factory CloudSyncProductionPreflightProbe({ + required CloudSyncBooleanProbe platformSupported, + required CloudSyncBooleanProbe uiIsolate, + required CloudSyncBooleanProbe rustPushReady, + required CloudSyncLocalPreflightProbe localState, + required CloudSyncBooleanProbe privateStorageExists, + required CloudSyncBooleanProbe logoutActive, + required CloudSyncBooleanProbe legacySyncEnabled, + required CloudSyncBooleanProbe legacySyncActive, + required CloudSyncBooleanProbe protectorSentinelValid, + }) => CloudSyncProductionPreflightProbe._( + platformSupported, + uiIsolate, + rustPushReady, + localState, + privateStorageExists, + logoutActive, + legacySyncEnabled, + legacySyncActive, + protectorSentinelValid, + ); + + const CloudSyncProductionPreflightProbe._( + this._platformSupported, + this._uiIsolate, + this._rustPushReady, + this._localState, + this._privateStorageExists, + this._logoutActive, + this._legacySyncEnabled, + this._legacySyncActive, + this._protectorSentinelValid, + ); + + final CloudSyncBooleanProbe _platformSupported; + final CloudSyncBooleanProbe _uiIsolate; + final CloudSyncBooleanProbe _rustPushReady; + final CloudSyncLocalPreflightProbe _localState; + final CloudSyncBooleanProbe _privateStorageExists; + final CloudSyncBooleanProbe _logoutActive; + final CloudSyncBooleanProbe _legacySyncEnabled; + final CloudSyncBooleanProbe _legacySyncActive; + final CloudSyncBooleanProbe _protectorSentinelValid; + + Future read() async { + final localState = await _readLocalState(); + return CloudSyncShadowPreflightState( + platformSupported: await _readBoolean( + _platformSupported, + failureValue: false, + ), + uiIsolate: await _readBoolean(_uiIsolate, failureValue: false), + rustPushReady: await _readBoolean(_rustPushReady, failureValue: false), + objectBoxReady: localState.objectBoxReady, + privateStorageExists: await _readBoolean( + _privateStorageExists, + failureValue: false, + ), + // Uncertainty about teardown, legacy work, or another coordinator must + // block the shadow sampler. + logoutActive: await _readBoolean(_logoutActive, failureValue: true), + legacySyncEnabled: await _readBoolean( + _legacySyncEnabled, + failureValue: true, + ), + legacySyncActive: await _readBoolean( + _legacySyncActive, + failureValue: true, + ), + coordinatorLeaseActive: localState.coordinatorLeaseActive, + outboxCount: localState.outboxCount, + protectorSentinelValid: await _readBoolean( + _protectorSentinelValid, + failureValue: false, + ), + ); + } + + Future _readBoolean( + CloudSyncBooleanProbe probe, { + required bool failureValue, + }) async { + try { + return await probe(); + } catch (_) { + return failureValue; + } + } + + Future _readLocalState() async { + try { + final state = await _localState(); + if (state.outboxCount < 0) { + return const CloudSyncLocalPreflightState.blocked(); + } + return state; + } catch (_) { + return const CloudSyncLocalPreflightState.blocked(); + } + } +} diff --git a/lib/services/rustpush/cloud_sync/cloud_sync_production_sampler_adapter.dart b/lib/services/rustpush/cloud_sync/cloud_sync_production_sampler_adapter.dart new file mode 100644 index 0000000000..9443068646 --- /dev/null +++ b/lib/services/rustpush/cloud_sync/cloud_sync_production_sampler_adapter.dart @@ -0,0 +1,455 @@ +// ignore_for_file: prefer_initializing_formals + +import 'package:bluebubbles/src/rust/api/api.dart' as frb_api; +import 'package:bluebubbles/src/rust/frb_generated.dart' as frb_generated; +import 'package:bluebubbles/src/rust/lib.dart' as frb_lib; +import 'package:bluebubbles/database/database.dart'; + +import 'cloud_inbox_applier.dart'; +import 'cloud_protected_page_lease_lifecycle.dart'; +import 'cloud_sync_engine.dart'; +import 'cloud_sync_manual_outbound_canary.dart'; +import 'cloud_sync_manual_semantic_pull_sampler.dart'; +import 'cloud_sync_manual_shadow_sampler.dart'; +import 'cloud_sync_models.dart'; +import 'cloud_sync_observability.dart'; +import 'native_protected_cloud_sync_transport.dart'; +import 'objectbox_canonical_semantic_entity_adapter.dart'; +import 'objectbox_cloud_semantic_store_gateway.dart'; +import 'cloud_sync_protector.dart'; +import 'cloud_sync_outbound_admission.dart'; +import 'cloud_sync_writer_authority.dart'; +import 'cloudkit_operation_interlock.dart'; +import 'cloudkit_writer_authority.dart'; +import 'cloudkit_writer_ownership.dart'; +import 'objectbox_cloud_sync_store.dart'; +import 'cloud_sync_shadow_transport.dart'; +import 'rust_cloud_semantic_decoder.dart'; +import 'transient_cloud_canonical_identity_registry.dart'; + +/// Redacted metadata returned by one native operation that reads the DSID from +/// the supplied Rust Cloud Messages client and derives its per-install +/// fingerprint internally. Raw account identifiers never enter Dart. +final class CloudSyncNativeAuthMetadata { + const CloudSyncNativeAuthMetadata({ + required this.nativeSessionId, + required this.accountFingerprint, + required this.protectedStoreIdentity, + }); + + final String nativeSessionId; + final String accountFingerprint; + final String protectedStoreIdentity; +} + +abstract interface class CloudSyncNativeAuthBinding { + Future capture({ + required Object cloudMessagesClient, + required String privateStorageDirectory, + }); +} + +/// Production binding for the native client-bound authentication snapshot. +/// +/// Rust reads the raw DSID from the supplied Cloud Messages client and derives +/// both returned values with the private per-install key. Raw Apple account +/// identifiers therefore never cross the FRB boundary into Dart. +final class FrbCloudSyncNativeAuthBinding + implements CloudSyncNativeAuthBinding { + FrbCloudSyncNativeAuthBinding({frb_generated.RustLibApi? api}) + : _apiOverride = api; + + final frb_generated.RustLibApi? _apiOverride; + + @override + Future capture({ + required Object cloudMessagesClient, + required String privateStorageDirectory, + }) async { + if (cloudMessagesClient + is! frb_lib.ArcCloudMessagesClientDefaultAnisetteProvider) { + throw ArgumentError( + 'cloudMessagesClient must be the generated FRB Cloud Messages client', + ); + } + if (privateStorageDirectory.isEmpty) { + throw ArgumentError.value( + privateStorageDirectory, + 'privateStorageDirectory', + 'must not be empty', + ); + } + + // Resolving the generated singleton is intentionally delayed until after + // validation so malformed calls fail closed without loading native state. + // ignore: invalid_use_of_internal_member + final api = _apiOverride ?? frb_generated.RustLib.instance.api; + final metadata = await api.crateApiApiCloudSyncCaptureAuthSnapshot( + cloudMessagesClient: cloudMessagesClient, + storageDirectory: privateStorageDirectory, + ); + return _metadataFromFrb(metadata); + } + + CloudSyncNativeAuthMetadata _metadataFromFrb( + frb_api.CloudSyncNativeAuthMetadata metadata, + ) { + final nativeDigest = RegExp(r'^[A-Za-z0-9_-]{43}$'); + if (!nativeDigest.hasMatch(metadata.nativeSessionId) || + !nativeDigest.hasMatch(metadata.accountFingerprint) || + !RegExp( + r'^obcs2\.store\.[A-Za-z0-9_-]{43}$', + ).hasMatch(metadata.protectedStoreIdentity)) { + throw StateError('cloud_sync_native_auth_metadata_invalid'); + } + return CloudSyncNativeAuthMetadata( + nativeSessionId: metadata.nativeSessionId, + accountFingerprint: metadata.accountFingerprint, + protectedStoreIdentity: metadata.protectedStoreIdentity, + ); + } +} + +typedef ActiveCloudMessagesClientReader = Object? Function(); + +/// Dormant production composition for the developer-only manual sampler. +/// +/// Constructing this adapter performs no network access and schedules no work. +/// The returned sampler remains compile-time disabled by default and can run +/// only through its explicit `runConfirmed` entry point. +final class CloudSyncProductionSamplerAdapter { + CloudSyncProductionSamplerAdapter({ + required ActiveCloudMessagesClientReader readActiveClient, + CloudSyncNativeAuthBinding? nativeAuthBinding, + required CloudSyncShadowPreflightReader readPreflight, + required String privateStorageDirectory, + required String platform, + required String architecture, + required String buildCommit, + CloudSyncObserverFactory? observerFactory, + RustCloudSyncProtectionBindings? protectionBindings, + NativeProtectedCloudSyncBindings? transportBindings, + bool? compileGateOverrideForTest, + }) { + final authProvider = CloudSyncProductionAuthSnapshotProvider( + readActiveClient: readActiveClient, + nativeAuthBinding: nativeAuthBinding ?? FrbCloudSyncNativeAuthBinding(), + privateStorageDirectory: privateStorageDirectory, + ); + final protector = RustCloudSyncProtector( + storageDirectory: privateStorageDirectory, + bindings: protectionBindings, + ); + final durableStore = ObjectBoxCloudSyncStore.fromDatabase( + protector: protector, + ); + sampler = CloudSyncManualShadowSampler( + readPreflight: readPreflight, + readAuthSnapshot: authProvider.capture, + createStore: (scope) async => durableStore, + createRawTransport: (snapshot, scope) async => + NativeProtectedCloudSyncTransport( + cloudMessagesClient: snapshot.cloudMessagesClient, + storageDirectory: privateStorageDirectory, + protectedStoreIdentity: snapshot.protectedStoreIdentity, + bindings: transportBindings, + ), + operationFenceStore: durableStore, + privateStorageDirectory: privateStorageDirectory, + platform: platform, + architecture: architecture, + buildCommit: buildCommit, + observerFactory: observerFactory, + compileGateOverrideForTest: compileGateOverrideForTest, + ); + } + + late final CloudSyncManualShadowSampler sampler; +} + +/// Production composition for the separately compile-gated manual semantic +/// pull canary. CloudKit transport remains read-only while supported chat, +/// message, reaction, and attachment metadata records are projected locally. +final class CloudSyncProductionSemanticPullAdapter { + CloudSyncProductionSemanticPullAdapter({ + required ActiveCloudMessagesClientReader readActiveClient, + CloudSyncNativeAuthBinding? nativeAuthBinding, + required CloudSyncShadowPreflightReader readPreflight, + required String privateStorageDirectory, + required String platform, + required String architecture, + required String buildCommit, + CloudSyncObserverFactory? observerFactory, + RustCloudSyncProtectionBindings? protectionBindings, + NativeProtectedCloudSyncBindings? transportBindings, + RustCloudSemanticDecodeBindings? semanticDecodeBindings, + bool? compileGateOverrideForTest, + }) { + final authProvider = CloudSyncProductionAuthSnapshotProvider( + readActiveClient: readActiveClient, + nativeAuthBinding: nativeAuthBinding ?? FrbCloudSyncNativeAuthBinding(), + privateStorageDirectory: privateStorageDirectory, + ); + final protector = RustCloudSyncProtector( + storageDirectory: privateStorageDirectory, + bindings: protectionBindings, + ); + final durableStore = ObjectBoxCloudSyncStore.fromDatabase( + protector: protector, + ); + sampler = CloudSyncManualSemanticPullSampler( + readPreflight: readPreflight, + readAuthSnapshot: authProvider.capture, + createStore: (scope) async => durableStore, + createRawTransport: (snapshot, scope) async => + NativeProtectedCloudSyncTransport( + cloudMessagesClient: snapshot.cloudMessagesClient, + storageDirectory: privateStorageDirectory, + protectedStoreIdentity: snapshot.protectedStoreIdentity, + bindings: transportBindings, + ), + createInboxApplier: (snapshot, scope, generation) async { + final identityRegistry = TransientCloudCanonicalIdentityRegistry(); + final activeScope = CloudCanonicalActiveScope( + scope: scope, + generation: generation, + ); + final canonicalAdapter = ObjectBoxCanonicalSemanticEntityAdapter( + store: Database.store, + activeScopeProvider: () => + identical(snapshot.cloudMessagesClient, readActiveClient()) + ? activeScope + : null, + identityResolver: identityRegistry, + semanticApplyEnabled: true, + allowExistingChatPresentationUpdates: false, + allowChatUpserts: true, + allowExistingChatDisplayNameClears: false, + allowMessageUpserts: true, + allowReactionUpserts: true, + allowAttachmentMetadataUpserts: true, + ); + final gateway = ObjectBoxCloudSemanticStoreGateway.fromDatabase( + canonicalAdapter: canonicalAdapter, + allowTombstones: false, + ); + return TransactionalCloudInboxApplier( + decoder: RustCloudSemanticDecoder( + readAuthSnapshot: authProvider.capture, + storageDirectory: privateStorageDirectory, + bindings: semanticDecodeBindings, + ), + store: gateway, + identityRegistrar: identityRegistry, + activeScopeRevalidator: () async { + final current = await authProvider.capture(); + return snapshot.sameIdentity(current) && + identical(snapshot.cloudMessagesClient, readActiveClient()); + }, + allowTombstones: false, + ); + }, + operationFenceStore: durableStore, + privateStorageDirectory: privateStorageDirectory, + platform: platform, + architecture: architecture, + buildCommit: buildCommit, + observerFactory: observerFactory, + compileGateOverrideForTest: compileGateOverrideForTest, + ); + } + + late final CloudSyncManualSemanticPullSampler sampler; +} + +/// Production composition for the separately gated one-text outbound canary. +/// +/// Constructing this adapter performs no network access and admits no work. +/// The durable writer authority must already be stable and owned by V2 before +/// [CloudSyncManualOutboundCanary.runDoubleConfirmed] can flush an operation. +final class CloudSyncProductionOutboundCanaryAdapter { + CloudSyncProductionOutboundCanaryAdapter({ + required ActiveCloudMessagesClientReader readActiveClient, + CloudSyncNativeAuthBinding? nativeAuthBinding, + required CloudSyncShadowPreflightReader readPreflight, + required String privateStorageDirectory, + RustCloudSyncProtectionBindings? protectionBindings, + NativeProtectedCloudSyncBindings? transportBindings, + required CloudKitWriterLegacyQueueQuarantine quarantineLegacyDeletionQueues, + required CloudKitWriterProvisioningMeasurementsReader + readWriterMeasurements, + bool? compileGateOverrideForTest, + bool? v2WriterOverrideForTest, + }) { + final authProvider = CloudSyncProductionAuthSnapshotProvider( + readActiveClient: readActiveClient, + nativeAuthBinding: nativeAuthBinding ?? FrbCloudSyncNativeAuthBinding(), + privateStorageDirectory: privateStorageDirectory, + ); + final protector = RustCloudSyncProtector( + storageDirectory: privateStorageDirectory, + bindings: protectionBindings, + ); + final durableStore = ObjectBoxCloudSyncStore.fromDatabase( + protector: protector, + ); + final authority = ObjectBoxCloudKitWriterAuthority(store: Database.store); + final interlock = CloudKitOperationInterlock( + privateStorageDirectory: privateStorageDirectory, + fenceStore: durableStore, + ); + writerProvisioner = CloudKitV2WriterProvisioner( + authority: authority, + interlock: interlock, + readAuthSnapshot: authProvider.capture, + quarantineLegacyDeletionQueues: quarantineLegacyDeletionQueues, + readMeasurements: readWriterMeasurements, + ); + _captureAuth = authProvider.capture; + canary = CloudSyncManualOutboundCanary( + readPreflight: readPreflight, + readAuthSnapshot: authProvider.capture, + createSession: (snapshot, scope) async { + final writerScope = CloudKitWriterScope( + accountFingerprint: scope.accountFingerprint, + container: scope.container, + database: scope.database, + ); + final permit = authority.issuePermit( + writerScope, + expectedOwner: CloudKitWriterOwner.v2, + ); + authority.verifyPermit(permit); + final transport = NativeProtectedCloudSyncTransport( + cloudMessagesClient: snapshot.cloudMessagesClient, + storageDirectory: privateStorageDirectory, + protectedStoreIdentity: snapshot.protectedStoreIdentity, + bindings: transportBindings, + ); + final lifecycle = CloudProtectedPageLeaseLifecycle( + store: durableStore, + transport: transport, + ); + final admission = CloudSyncOutboundAdmissionCoordinator( + store: durableStore, + transport: transport, + ensureProtectedStoreRecovered: lifecycle.ensureRecoveredBeforeWrite, + ); + final engine = CloudSyncEngine( + scope: scope, + coordinatorId: + 'manual-outbound-${snapshot.nativeSessionId}-${scope.zone}', + store: durableStore, + transport: transport, + inboxApplier: const RejectingShadowInboxApplier(), + writerAuthority: ObjectBoxCloudSyncWriterAuthority( + store: Database.store, + ), + writerExclusion: interlock, + config: CloudSyncEngineConfig( + maximumBatchSize: 1, + maximumFetchPagesPerRun: 1, + maximumInboxEntriesPerRun: 1, + maximumOutboxBatchesPerRun: 1, + flags: const CloudSyncFeatureFlags( + readOnlyFetch: false, + semanticApply: false, + saves: true, + deletions: false, + profiles: false, + notificationHints: false, + ), + ), + ); + return _ProductionOutboundCanarySession( + scope: scope, + admission: admission, + engine: engine, + transport: transport, + store: durableStore, + ); + }, + compileGateOverrideForTest: compileGateOverrideForTest, + v2WriterOverrideForTest: v2WriterOverrideForTest, + ); + } + + late final CloudSyncManualOutboundCanary canary; + late final CloudKitV2WriterProvisioner writerProvisioner; + late final CloudSyncNativeAuthSnapshotReader _captureAuth; + + Future ensureWriterOwned() async { + final auth = await _captureAuth(); + if (auth == null) { + throw StateError('native_auth_unavailable'); + } + return writerProvisioner.ensureV2Owned(expectedAuth: auth); + } +} + +final class _ProductionOutboundCanarySession + implements CloudSyncOutboundCanarySession { + const _ProductionOutboundCanarySession({ + required this.scope, + required CloudSyncOutboundAdmissionCoordinator admission, + required CloudSyncEngine engine, + required NativeProtectedCloudSyncTransport transport, + required ObjectBoxCloudSyncStore store, + }) : _admission = admission, + _engine = engine, + _transport = transport, + _store = store; + + final CloudSyncScope scope; + final CloudSyncOutboundAdmissionCoordinator _admission; + final CloudSyncEngine _engine; + final NativeProtectedCloudSyncTransport _transport; + final ObjectBoxCloudSyncStore _store; + + @override + Future admitMessage({ + required frb_api.CloudMessage message, + required DateTime createdAt, + }) => _admission.admitMessage(scope, message: message, createdAt: createdAt); + + @override + Future flushOneBatch() => + _engine.synchronize(trigger: CloudSyncTrigger.localOutbox); + + @override + Future> readOutbox() => + _store.readOutboxEntries(scope); + + @override + Future quiesce() => _transport.quiesceNativeOperations(); +} + +/// Captures a client-bound snapshot and rejects replacement races. +final class CloudSyncProductionAuthSnapshotProvider { + CloudSyncProductionAuthSnapshotProvider({ + required this._readActiveClient, + required this._nativeAuthBinding, + required this.privateStorageDirectory, + }); + + final ActiveCloudMessagesClientReader _readActiveClient; + final CloudSyncNativeAuthBinding _nativeAuthBinding; + final String privateStorageDirectory; + + Future capture() async { + final client = _readActiveClient(); + if (client == null) return null; + final metadata = await _nativeAuthBinding.capture( + cloudMessagesClient: client, + privateStorageDirectory: privateStorageDirectory, + ); + // Reject a session replacement that raced the native capture. + if (!identical(client, _readActiveClient())) return null; + return CloudSyncNativeAuthSnapshot.fromNative( + nativeSessionId: metadata.nativeSessionId, + accountFingerprint: metadata.accountFingerprint, + protectedStoreIdentity: metadata.protectedStoreIdentity, + cloudMessagesClient: client, + ); + } +} diff --git a/lib/services/rustpush/cloud_sync/cloud_sync_protector.dart b/lib/services/rustpush/cloud_sync/cloud_sync_protector.dart new file mode 100644 index 0000000000..be54934fec --- /dev/null +++ b/lib/services/rustpush/cloud_sync/cloud_sync_protector.dart @@ -0,0 +1,230 @@ +import 'package:bluebubbles/src/rust/frb_generated.dart'; + +import 'cloud_sync_models.dart'; + +/// Purpose separation for Cloud Sync V2 protected values. +/// +/// Platform implementations must bind the purpose and [CloudSyncScope] into +/// authenticated encryption so a ciphertext cannot be moved between accounts, +/// zones, or value types. +enum CloudSyncProtectedValueKind { + checkpointToken, + serverRecordId, + systemFields, + payloadReference, + rawRecord, +} + +/// Platform secret-storage boundary for Cloud Sync V2. +/// +/// Android implementations use an AES-256-GCM key retained by Android +/// Keystore. Windows implementations protect values and the per-install HMAC +/// secret with current-user DPAPI on both ARM64 and x64. Implementations must +/// never log plaintext, ciphertext, raw account identifiers, or derived keys. +abstract interface class CloudSyncProtector { + Future protect({ + required CloudSyncScope scope, + required CloudSyncProtectedValueKind kind, + required String plaintext, + }); + + Future unprotect({ + required CloudSyncScope scope, + required CloudSyncProtectedValueKind kind, + required String ciphertext, + }); + + /// Produces an application-scoped HMAC identifier. + /// + /// A plain hash of a low-entropy DSID is not sufficient because it can be + /// guessed offline. The raw identifier must never be persisted or logged. + Future fingerprintAccount(String rawAccountIdentifier); +} + +/// Narrow binding seam for the FRB Cloud Sync protection entry points. +/// +/// Keeping this seam explicit allows the adapter to be tested without loading +/// the native library and avoids exposing protected values to diagnostics. +abstract interface class RustCloudSyncProtectionBindings { + Future protect({ + required String storageDirectory, + required String accountFingerprint, + required String container, + required String database, + required String zone, + required String streamKind, + required int schemaVersion, + required String purpose, + required String plaintext, + }); + + Future unprotect({ + required String storageDirectory, + required String accountFingerprint, + required String container, + required String database, + required String zone, + required String streamKind, + required int schemaVersion, + required String purpose, + required String ciphertext, + }); + + Future fingerprintAccount({ + required String storageDirectory, + required String rawAccountIdentifier, + }); +} + +/// Production [CloudSyncProtector] backed by the platform Rust bridge. +/// +/// [storageDirectory] must be the existing private application-support +/// directory. The adapter never creates a profile, starts CloudKit work, or +/// enables sync writes. +final class RustCloudSyncProtector implements CloudSyncProtector { + RustCloudSyncProtector({ + required String storageDirectory, + RustCloudSyncProtectionBindings? bindings, + }) : _storageDirectory = _validatedStorageDirectory(storageDirectory), + _bindings = bindings ?? FrbCloudSyncProtectionBindings(); + + final String _storageDirectory; + final RustCloudSyncProtectionBindings _bindings; + + @override + Future protect({ + required CloudSyncScope scope, + required CloudSyncProtectedValueKind kind, + required String plaintext, + }) { + return _bindings.protect( + storageDirectory: _storageDirectory, + accountFingerprint: scope.accountFingerprint, + container: scope.container, + database: scope.database, + zone: scope.zone, + streamKind: scope.streamKind.name, + schemaVersion: scope.schemaVersion, + purpose: kind.name, + plaintext: plaintext, + ); + } + + @override + Future unprotect({ + required CloudSyncScope scope, + required CloudSyncProtectedValueKind kind, + required String ciphertext, + }) { + return _bindings.unprotect( + storageDirectory: _storageDirectory, + accountFingerprint: scope.accountFingerprint, + container: scope.container, + database: scope.database, + zone: scope.zone, + streamKind: scope.streamKind.name, + schemaVersion: scope.schemaVersion, + purpose: kind.name, + ciphertext: ciphertext, + ); + } + + @override + Future fingerprintAccount(String rawAccountIdentifier) { + return _bindings.fingerprintAccount( + storageDirectory: _storageDirectory, + rawAccountIdentifier: rawAccountIdentifier, + ); + } + + static String _validatedStorageDirectory(String value) { + if (value.trim().isEmpty) { + throw ArgumentError.value( + value, + 'storageDirectory', + 'Must be an existing private application-support directory', + ); + } + return value; + } +} + +/// Typed façade over the generated FRB protection entry points. +/// +/// Keeping the generated API typed makes binding drift a compile-time error +/// while [RustCloudSyncProtectionBindings] remains injectable in unit tests. +final class FrbCloudSyncProtectionBindings + implements RustCloudSyncProtectionBindings { + FrbCloudSyncProtectionBindings({RustLibApi? api}) + // ignore: invalid_use_of_internal_member + : _api = api ?? RustLib.instance.api; + + final RustLibApi _api; + + @override + Future protect({ + required String storageDirectory, + required String accountFingerprint, + required String container, + required String database, + required String zone, + required String streamKind, + required int schemaVersion, + required String purpose, + required String plaintext, + }) { + return Future.sync(() { + return _api.crateApiApiCloudSyncProtect( + storageDirectory: storageDirectory, + accountFingerprint: accountFingerprint, + container: container, + database: database, + zone: zone, + streamKind: streamKind, + schemaVersion: schemaVersion, + purpose: purpose, + plaintext: plaintext, + ); + }); + } + + @override + Future unprotect({ + required String storageDirectory, + required String accountFingerprint, + required String container, + required String database, + required String zone, + required String streamKind, + required int schemaVersion, + required String purpose, + required String ciphertext, + }) { + return Future.sync(() { + return _api.crateApiApiCloudSyncUnprotect( + storageDirectory: storageDirectory, + accountFingerprint: accountFingerprint, + container: container, + database: database, + zone: zone, + streamKind: streamKind, + schemaVersion: schemaVersion, + purpose: purpose, + ciphertext: ciphertext, + ); + }); + } + + @override + Future fingerprintAccount({ + required String storageDirectory, + required String rawAccountIdentifier, + }) { + return Future.sync(() { + return _api.crateApiApiCloudSyncFingerprintAccount( + storageDirectory: storageDirectory, + rawAccountIdentifier: rawAccountIdentifier, + ); + }); + } +} diff --git a/lib/services/rustpush/cloud_sync/cloud_sync_protector_health.dart b/lib/services/rustpush/cloud_sync/cloud_sync_protector_health.dart new file mode 100644 index 0000000000..350e927709 --- /dev/null +++ b/lib/services/rustpush/cloud_sync/cloud_sync_protector_health.dart @@ -0,0 +1,44 @@ +import 'cloud_sync_models.dart'; +import 'cloud_sync_protector.dart'; + +/// Exercises the platform protection boundary without retaining protected +/// material or using an Apple account identifier. +/// +/// The probe uses a fixed synthetic scope and plaintext. A successful +/// round-trip proves that the current process can reach Android Keystore or +/// Windows DPAPI before a manual CloudKit shadow fetch is admitted. +final class CloudSyncProtectorHealthProbe { + const CloudSyncProtectorHealthProbe({required this.protector}); + + static final CloudSyncScope _scope = CloudSyncScope( + accountFingerprint: 'AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA', + container: 'com.openbubbles.cloud-sync-v2-health', + database: 'local', + zone: 'protector', + ); + static const String _plaintext = 'cloud-sync-v2-protector-health-v1'; + + final CloudSyncProtector protector; + + /// Returns false for every protection, validation, or platform failure. + /// + /// Neither the ciphertext nor an exception is returned to diagnostics. + Future read() async { + try { + final ciphertext = await protector.protect( + scope: _scope, + kind: CloudSyncProtectedValueKind.rawRecord, + plaintext: _plaintext, + ); + if (ciphertext.isEmpty || ciphertext == _plaintext) return false; + final roundTrip = await protector.unprotect( + scope: _scope, + kind: CloudSyncProtectedValueKind.rawRecord, + ciphertext: ciphertext, + ); + return roundTrip == _plaintext; + } catch (_) { + return false; + } + } +} diff --git a/lib/services/rustpush/cloud_sync/cloud_sync_protocol_evidence.dart b/lib/services/rustpush/cloud_sync/cloud_sync_protocol_evidence.dart new file mode 100644 index 0000000000..2367b110aa --- /dev/null +++ b/lib/services/rustpush/cloud_sync/cloud_sync_protocol_evidence.dart @@ -0,0 +1,740 @@ +import 'dart:async'; +import 'dart:convert'; + +import 'package:path/path.dart' as path; +import 'package:universal_io/io.dart'; + +import 'cloud_sync_observability.dart'; + +/// A fixed, local-only diagnostic record for the CloudKit V2 canary. +/// +/// This is deliberately separate from the application logger. In +/// particular, [CloudSyncEvent.scopeDiagnosticKey] is accepted as part of the +/// source event but is never copied into this record or its JSON encoding. +final class CloudSyncProtocolEvidenceRecord { + static const int schemaVersion = 1; + static const int maximumCount = 1 << 30; + static const int maximumEstimatedBytes = 1 << 30; + static const int maximumAttempt = 1 << 20; + static const int maximumElapsedMilliseconds = 24 * 60 * 60 * 1000; + + static const Set supportedZoneLabels = { + 'chatManateeZone', + 'messageManateeZone', + 'attachmentManateeZone', + 'messageUpdateZone', + 'recoverableMessageDeleteZone', + 'scheduledMessageZone', + 'chat1ManateeZone', + 'recoverableMessageManateeZone', + 'profileManateeZone', + 'chats', + 'messages', + 'attachments', + 'profiles', + }; + + static const Set supportedStreamLabels = {'messages', 'profiles'}; + static const Set supportedPlatforms = {'android', 'windows'}; + static const Set supportedArchitectures = { + 'arm64', + 'x64', + 'android_arm64', + 'windows_arm64', + 'windows_x64', + }; + + static const Set jsonKeys = { + 'schemaVersion', + 'timestampUtc', + 'zone', + 'stream', + 'eventType', + 'trigger', + 'failure', + 'skip', + 'journalBlock', + 'count', + 'estimatedBytes', + 'attempt', + 'elapsedMs', + 'platform', + 'architecture', + 'buildCommit', + }; + + CloudSyncProtocolEvidenceRecord({ + required this.zoneLabel, + required this.streamKindLabel, + required this.platform, + required this.architecture, + required this.buildCommit, + required this.eventType, + required this.timestampUtc, + this.triggerLabel = 'none', + this.failureLabel = 'none', + this.skipLabel = 'none', + this.journalBlockLabel = 'none', + this.count = 0, + this.estimatedBytes = 0, + this.attempt = 0, + this.elapsedMilliseconds = 0, + }) { + _validateLabel(zoneLabel, supportedZoneLabels, 'zone'); + _validateLabel(streamKindLabel, supportedStreamLabels, 'stream'); + _validateLabel(platform, supportedPlatforms, 'platform'); + _validateLabel(architecture, supportedArchitectures, 'architecture'); + _validateBuildCommit(buildCommit); + _validateLabel(eventType, _eventTypeLabels, 'event_type'); + _validateOptionalLabel(triggerLabel, _triggerLabels, 'trigger'); + _validateOptionalLabel(failureLabel, _failureLabels, 'failure'); + _validateOptionalLabel(skipLabel, _skipLabels, 'skip'); + _validateOptionalLabel( + journalBlockLabel, + _journalBlockLabels, + 'journal_block', + ); + _validateRange(count, 0, maximumCount, 'count'); + _validateRange(estimatedBytes, 0, maximumEstimatedBytes, 'estimated_bytes'); + _validateRange(attempt, 0, maximumAttempt, 'attempt'); + _validateRange( + elapsedMilliseconds, + 0, + maximumElapsedMilliseconds, + 'elapsed_ms', + ); + if (timestampUtc.isUtc == false || + timestampUtc.year < 2000 || + timestampUtc.year > 2100) { + throw const CloudSyncProtocolEvidenceException( + 'cloud_sync_protocol_evidence_timestamp_invalid', + ); + } + } + + factory CloudSyncProtocolEvidenceRecord.fromEvent( + CloudSyncEvent event, { + required String zoneLabel, + required String streamKindLabel, + required String platform, + required String architecture, + required String buildCommit, + }) { + return CloudSyncProtocolEvidenceRecord( + zoneLabel: zoneLabel, + streamKindLabel: streamKindLabel, + platform: platform, + architecture: architecture, + buildCommit: buildCommit, + eventType: event.type.name, + timestampUtc: event.at.toUtc(), + triggerLabel: event.trigger?.name ?? 'none', + failureLabel: event.failureCategory?.name ?? 'none', + skipLabel: event.skipReason?.name ?? 'none', + journalBlockLabel: event.shadowJournalBlockReason?.name ?? 'none', + count: event.count, + estimatedBytes: event.estimatedBytes, + attempt: event.attempt, + elapsedMilliseconds: event.elapsed.inMilliseconds, + ); + } + + final String zoneLabel; + final String streamKindLabel; + final String platform; + final String architecture; + final String buildCommit; + final String eventType; + final DateTime timestampUtc; + final String triggerLabel; + final String failureLabel; + final String skipLabel; + final String journalBlockLabel; + final int count; + final int estimatedBytes; + final int attempt; + final int elapsedMilliseconds; + + /// A fixed-key object. Callers cannot supply additional fields. + Map toJson() => { + 'schemaVersion': schemaVersion, + 'timestampUtc': timestampUtc.toUtc().toIso8601String(), + 'zone': zoneLabel, + 'stream': streamKindLabel, + 'eventType': eventType, + 'trigger': triggerLabel, + 'failure': failureLabel, + 'skip': skipLabel, + 'journalBlock': journalBlockLabel, + 'count': count, + 'estimatedBytes': estimatedBytes, + 'attempt': attempt, + 'elapsedMs': elapsedMilliseconds, + 'platform': platform, + 'architecture': architecture, + 'buildCommit': buildCommit, + }; + + String toJsonLine() { + final encoded = jsonEncode(toJson()); + if (utf8.encode(encoded).length + 1 > + CloudSyncProtocolEvidenceWriter.maximumFileBytes) { + throw const CloudSyncProtocolEvidenceException( + 'cloud_sync_protocol_evidence_line_too_large', + ); + } + return encoded; + } + + static const Set _eventTypeLabels = { + 'runStarted', + 'runSkipped', + 'fetchCompleted', + 'inboxApplied', + 'outboxFlushed', + 'authenticationRefreshed', + 'pcsRefreshed', + 'serverConflictReconciled', + 'backoffScheduled', + 'shadowJournalBlocked', + 'runCompleted', + 'runFailed', + 'runCancelled', + }; + + static const Set _triggerLabels = { + 'startup', + 'networkReconnect', + 'localOutbox', + 'idsReconnect', + 'detectedGap', + 'manual', + 'notificationHint', + 'none', + }; + + static const Set _failureLabels = { + 'network', + 'throttled', + 'server', + 'authorization', + 'pcsUnavailable', + 'malformedRecord', + 'conflict', + 'dependency', + 'localStorage', + 'cancelled', + 'unknown', + 'none', + }; + + static const Set _skipLabels = { + 'localRunActive', + 'coordinatorLeaseUnavailable', + 'pullBackoffActive', + 'featureDisabled', + 'none', + }; + + static const Set _journalBlockLabels = { + 'maximumAge', + 'maximumEntries', + 'maximumEstimatedBytes', + 'none', + }; + + static void _validateLabel( + String value, + Set allowlist, + String field, + ) { + if (!allowlist.contains(value)) { + throw CloudSyncProtocolEvidenceException( + 'cloud_sync_protocol_evidence_${field}_invalid', + ); + } + } + + static void _validateOptionalLabel( + String value, + Set allowlist, + String field, + ) { + if (!allowlist.contains(value)) { + throw CloudSyncProtocolEvidenceException( + 'cloud_sync_protocol_evidence_${field}_invalid', + ); + } + } + + static void _validateBuildCommit(String value) { + if (!RegExp(r'^[A-Za-z0-9._+\-]{1,80}$').hasMatch(value)) { + throw const CloudSyncProtocolEvidenceException( + 'cloud_sync_protocol_evidence_build_commit_invalid', + ); + } + } + + static void _validateRange( + int value, + int minimum, + int maximum, + String field, + ) { + if (value < minimum || value > maximum) { + throw CloudSyncProtocolEvidenceException( + 'cloud_sync_protocol_evidence_${field}_invalid', + ); + } + } +} + +/// Writes only the three owned JSONL files in a verified private directory. +final class CloudSyncProtocolEvidenceWriter { + static const int maximumFileBytes = 256 * 1024; + static const int maximumRetainedFiles = 3; + static const String _filePrefix = 'cloud-sync-v2-evidence'; + static final RegExp _ownedFileName = RegExp( + r'^cloud-sync-v2-evidence-(?:0|1|2)\.jsonl$', + ); + + CloudSyncProtocolEvidenceWriter._({ + required Directory privateDirectory, + required Directory trustedRoot, + required this.now, + }) : _privateDirectory = privateDirectory.absolute, + _trustedRoot = trustedRoot.absolute; + + static Future open({ + required String privateDirectory, + required String trustedRoot, + DateTime Function()? now, + }) async { + final writer = CloudSyncProtocolEvidenceWriter._( + privateDirectory: Directory(privateDirectory), + trustedRoot: Directory(trustedRoot), + now: now ?? DateTime.now, + ); + await writer._initialize(); + return writer; + } + + final Directory _privateDirectory; + final Directory _trustedRoot; + final DateTime Function() now; + String? _canonicalRootPath; + String? _canonicalDirectoryPath; + Future _pending = Future.value(); + CloudSyncProtocolEvidenceException? _pendingFailure; + + String get currentFilePath => + path.join(_canonicalDirectoryPath!, '$_filePrefix-0.jsonl'); + + Future append(CloudSyncProtocolEvidenceRecord record) { + final result = _pending.then((_) async { + if (_pendingFailure != null) return; + try { + await _appendNow(record); + } on CloudSyncProtocolEvidenceException catch (error) { + _pendingFailure ??= error; + } catch (_) { + _pendingFailure ??= const CloudSyncProtocolEvidenceException( + 'cloud_sync_protocol_evidence_write_failed', + ); + } + }); + _pending = result.catchError((_) {}); + return result.then((_) { + final failure = _pendingFailure; + if (failure != null) throw failure; + }); + } + + Future flush() async { + await _pending; + final failure = _pendingFailure; + if (failure != null) throw failure; + } + + Future _initialize() async { + try { + final rootType = await FileSystemEntity.type( + _trustedRoot.path, + followLinks: false, + ); + if (rootType != FileSystemEntityType.directory) { + throw const CloudSyncProtocolEvidenceException( + 'cloud_sync_protocol_evidence_trusted_root_invalid', + ); + } + final canonicalRoot = path.normalize( + await _trustedRoot.resolveSymbolicLinks(), + ); + final requestedDirectory = path.normalize(_privateDirectory.path); + if (!_isStrictChild(canonicalRoot, requestedDirectory)) { + throw const CloudSyncProtocolEvidenceException( + 'cloud_sync_protocol_evidence_path_escape', + ); + } + await _rejectSymlinkAncestors(requestedDirectory, canonicalRoot); + await _privateDirectory.create(recursive: true); + final directoryType = await FileSystemEntity.type( + requestedDirectory, + followLinks: false, + ); + if (directoryType != FileSystemEntityType.directory) { + throw const CloudSyncProtocolEvidenceException( + 'cloud_sync_protocol_evidence_directory_unsafe', + ); + } + final canonicalDirectory = path.normalize( + await Directory(requestedDirectory).resolveSymbolicLinks(), + ); + if (!_isStrictChild(canonicalRoot, canonicalDirectory)) { + throw const CloudSyncProtocolEvidenceException( + 'cloud_sync_protocol_evidence_directory_unsafe', + ); + } + _canonicalRootPath = canonicalRoot; + _canonicalDirectoryPath = canonicalDirectory; + await _verifyDirectory(); + for (var index = 0; index < maximumRetainedFiles; index++) { + await _verifyOwnedFile(File(_ownedPath(index)), allowMissing: true); + } + await _recoverPartialFinalLine(); + } on CloudSyncProtocolEvidenceException { + rethrow; + } on FileSystemException { + throw const CloudSyncProtocolEvidenceException( + 'cloud_sync_protocol_evidence_directory_unavailable', + ); + } catch (_) { + throw const CloudSyncProtocolEvidenceException( + 'cloud_sync_protocol_evidence_directory_unavailable', + ); + } + } + + Future _appendNow(CloudSyncProtocolEvidenceRecord record) async { + final line = record.toJsonLine(); + final bytes = [...utf8.encode(line), 0x0a]; + if (bytes.length > maximumFileBytes) { + throw const CloudSyncProtocolEvidenceException( + 'cloud_sync_protocol_evidence_line_too_large', + ); + } + await _verifyDirectory(); + await _recoverPartialFinalLine(); + + final current = File(currentFilePath); + await _verifyOwnedFile(current, allowMissing: true); + final currentLength = await current.exists() ? await current.length() : 0; + if (currentLength > maximumFileBytes) { + throw const CloudSyncProtocolEvidenceException( + 'cloud_sync_protocol_evidence_file_corrupt', + ); + } + if (currentLength + bytes.length > maximumFileBytes) { + await _rotate(); + } + + RandomAccessFile? handle; + try { + handle = await File(currentFilePath).open(mode: FileMode.append); + await handle.writeFrom(bytes); + await handle.flush(); + } on FileSystemException { + throw const CloudSyncProtocolEvidenceException( + 'cloud_sync_protocol_evidence_write_failed', + ); + } finally { + if (handle != null) { + try { + await handle.close(); + } on FileSystemException { + // The fixed write failure, if any, remains authoritative. + } + } + } + if (await File(currentFilePath).length() > maximumFileBytes) { + throw const CloudSyncProtocolEvidenceException( + 'cloud_sync_protocol_evidence_file_corrupt', + ); + } + } + + Future _rotate() async { + await _verifyDirectory(); + try { + for (var index = maximumRetainedFiles - 1; index >= 1; index--) { + final source = File(_ownedPath(index - 1)); + final destination = File(_ownedPath(index)); + await _verifyOwnedFile(source, allowMissing: true); + await _verifyOwnedFile(destination, allowMissing: true); + if (!await source.exists()) continue; + if (await destination.exists()) await destination.delete(); + await source.rename(destination.path); + } + } on CloudSyncProtocolEvidenceException { + rethrow; + } on FileSystemException { + throw const CloudSyncProtocolEvidenceException( + 'cloud_sync_protocol_evidence_retention_failed', + ); + } + } + + Future _recoverPartialFinalLine() async { + final current = File(currentFilePath); + await _verifyOwnedFile(current, allowMissing: true); + if (!await current.exists()) return; + final bytes = await current.readAsBytes(); + if (bytes.isEmpty || bytes.last == 0x0a) return; + final lastNewline = bytes.lastIndexOf(0x0a); + final tail = bytes.sublist(lastNewline + 1); + if (_isValidEncodedLine(tail)) { + RandomAccessFile? handle; + try { + handle = await current.open(mode: FileMode.append); + await handle.writeByte(0x0a); + await handle.flush(); + } on FileSystemException { + throw const CloudSyncProtocolEvidenceException( + 'cloud_sync_protocol_evidence_write_failed', + ); + } finally { + await handle?.close(); + } + return; + } + try { + await current.writeAsBytes( + bytes.sublist(0, lastNewline + 1), + flush: true, + ); + } on FileSystemException { + throw const CloudSyncProtocolEvidenceException( + 'cloud_sync_protocol_evidence_write_failed', + ); + } + } + + bool _isValidEncodedLine(List bytes) { + try { + final decoded = jsonDecode(utf8.decode(bytes)); + if (decoded is! Map) return false; + return decoded.keys.toSet().containsAll( + CloudSyncProtocolEvidenceRecord.jsonKeys, + ) && + decoded.keys.toSet().length == + CloudSyncProtocolEvidenceRecord.jsonKeys.length; + } catch (_) { + return false; + } + } + + Future _verifyDirectory() async { + final root = _canonicalRootPath; + final directory = _canonicalDirectoryPath; + if (root == null || directory == null) { + throw const CloudSyncProtocolEvidenceException( + 'cloud_sync_protocol_evidence_directory_unsafe', + ); + } + try { + final rootType = await FileSystemEntity.type( + _trustedRoot.path, + followLinks: false, + ); + final directoryType = await FileSystemEntity.type( + _privateDirectory.path, + followLinks: false, + ); + if (rootType != FileSystemEntityType.directory || + directoryType != FileSystemEntityType.directory || + path.normalize(await _trustedRoot.resolveSymbolicLinks()) != root || + path.normalize(await _privateDirectory.resolveSymbolicLinks()) != + directory || + !_isStrictChild(root, directory)) { + throw const CloudSyncProtocolEvidenceException( + 'cloud_sync_protocol_evidence_directory_unsafe', + ); + } + } on CloudSyncProtocolEvidenceException { + rethrow; + } on FileSystemException { + throw const CloudSyncProtocolEvidenceException( + 'cloud_sync_protocol_evidence_directory_unavailable', + ); + } + } + + Future _verifyOwnedFile(File file, {bool allowMissing = false}) async { + final name = path.basename(file.path); + if (!_ownedFileName.hasMatch(name) || + path.dirname(file.path) != _canonicalDirectoryPath) { + throw const CloudSyncProtocolEvidenceException( + 'cloud_sync_protocol_evidence_path_escape', + ); + } + final type = await FileSystemEntity.type(file.path, followLinks: false); + if (type == FileSystemEntityType.notFound && allowMissing) return; + if (type != FileSystemEntityType.file) { + throw const CloudSyncProtocolEvidenceException( + 'cloud_sync_protocol_evidence_owned_file_invalid', + ); + } + try { + if (path.normalize(await file.resolveSymbolicLinks()) != file.path) { + throw const CloudSyncProtocolEvidenceException( + 'cloud_sync_protocol_evidence_owned_file_invalid', + ); + } + } on CloudSyncProtocolEvidenceException { + rethrow; + } on FileSystemException { + throw const CloudSyncProtocolEvidenceException( + 'cloud_sync_protocol_evidence_owned_file_invalid', + ); + } + } + + Future _rejectSymlinkAncestors( + String requestedDirectory, + String canonicalRoot, + ) async { + var current = requestedDirectory; + while (_isStrictChild(canonicalRoot, current)) { + final type = await FileSystemEntity.type(current, followLinks: false); + if (type == FileSystemEntityType.link) { + throw const CloudSyncProtocolEvidenceException( + 'cloud_sync_protocol_evidence_directory_unsafe', + ); + } + current = path.dirname(current); + } + } + + String _ownedPath(int index) => + path.join(_canonicalDirectoryPath!, '$_filePrefix-$index.jsonl'); + + static bool _isStrictChild(String parent, String child) => + path.normalize(parent) != path.normalize(child) && + path.isWithin(path.normalize(parent), path.normalize(child)); +} + +/// An observer that queues fixed-schema evidence in event order. +final class CloudSyncProtocolEvidenceObserver + implements FlushableCloudSyncObserver { + CloudSyncProtocolEvidenceObserver({ + required this.writer, + required this.zoneLabel, + required this.streamKindLabel, + required this.platform, + required this.architecture, + required this.buildCommit, + }); + + final CloudSyncProtocolEvidenceWriter writer; + final String zoneLabel; + final String streamKindLabel; + final String platform; + final String architecture; + final String buildCommit; + Future _pending = Future.value(); + CloudSyncProtocolEvidenceException? _failure; + + @override + void onEvent(CloudSyncEvent event) { + CloudSyncProtocolEvidenceRecord record; + try { + record = CloudSyncProtocolEvidenceRecord.fromEvent( + event, + zoneLabel: zoneLabel, + streamKindLabel: streamKindLabel, + platform: platform, + architecture: architecture, + buildCommit: buildCommit, + ); + } on CloudSyncProtocolEvidenceException catch (error) { + _failure ??= error; + return; + } catch (_) { + _failure ??= const CloudSyncProtocolEvidenceException( + 'cloud_sync_protocol_evidence_event_invalid', + ); + return; + } + + _pending = _pending.then((_) async { + if (_failure != null) return; + try { + await writer.append(record); + } on CloudSyncProtocolEvidenceException catch (error) { + _failure ??= error; + } catch (_) { + _failure ??= const CloudSyncProtocolEvidenceException( + 'cloud_sync_protocol_evidence_write_failed', + ); + } + }); + } + + @override + Future flush() async { + await _pending; + try { + await writer.flush(); + } on CloudSyncProtocolEvidenceException catch (error) { + _failure ??= error; + } catch (_) { + _failure ??= const CloudSyncProtocolEvidenceException( + 'cloud_sync_protocol_evidence_write_failed', + ); + } + final failure = _failure; + if (failure != null) throw failure; + } +} + +final class CloudSyncProtocolEvidenceException implements Exception { + const CloudSyncProtocolEvidenceException(this._requestedCode); + + static const Set _safeCodes = { + 'cloud_sync_protocol_evidence_unknown_failure', + 'cloud_sync_protocol_evidence_trusted_root_invalid', + 'cloud_sync_protocol_evidence_path_escape', + 'cloud_sync_protocol_evidence_directory_unsafe', + 'cloud_sync_protocol_evidence_directory_unavailable', + 'cloud_sync_protocol_evidence_owned_file_invalid', + 'cloud_sync_protocol_evidence_write_failed', + 'cloud_sync_protocol_evidence_retention_failed', + 'cloud_sync_protocol_evidence_file_corrupt', + 'cloud_sync_protocol_evidence_line_too_large', + 'cloud_sync_protocol_evidence_event_invalid', + 'cloud_sync_protocol_evidence_zone_invalid', + 'cloud_sync_protocol_evidence_stream_invalid', + 'cloud_sync_protocol_evidence_platform_invalid', + 'cloud_sync_protocol_evidence_architecture_invalid', + 'cloud_sync_protocol_evidence_build_commit_invalid', + 'cloud_sync_protocol_evidence_event_type_invalid', + 'cloud_sync_protocol_evidence_trigger_invalid', + 'cloud_sync_protocol_evidence_failure_invalid', + 'cloud_sync_protocol_evidence_skip_invalid', + 'cloud_sync_protocol_evidence_journal_block_invalid', + 'cloud_sync_protocol_evidence_count_invalid', + 'cloud_sync_protocol_evidence_estimated_bytes_invalid', + 'cloud_sync_protocol_evidence_attempt_invalid', + 'cloud_sync_protocol_evidence_elapsed_ms_invalid', + 'cloud_sync_protocol_evidence_timestamp_invalid', + }; + + final String _requestedCode; + + String get safeCode => _safeCodes.contains(_requestedCode) + ? _requestedCode + : 'cloud_sync_protocol_evidence_unknown_failure'; + + @override + String toString() => 'CloudSyncProtocolEvidenceException($safeCode)'; +} diff --git a/lib/services/rustpush/cloud_sync/cloud_sync_runtime.dart b/lib/services/rustpush/cloud_sync/cloud_sync_runtime.dart new file mode 100644 index 0000000000..f9b3b18486 --- /dev/null +++ b/lib/services/rustpush/cloud_sync/cloud_sync_runtime.dart @@ -0,0 +1,194 @@ +import 'dart:collection'; + +import 'cloud_sync_cancellation.dart'; +import 'cloud_sync_engine.dart'; +import 'cloud_sync_models.dart'; +import 'cloud_sync_observability.dart'; +import 'cloud_sync_scheduler.dart'; + +/// Safe Phase 1 facade for running the same Cloud Sync V2 engine across the +/// Android foreground/background engines and Windows ARM64/x64 processes. +/// +/// This facade intentionally accepts only read-only shadow engines. Semantic +/// apply, CloudKit saves, deletes, profiles, and notification hints remain +/// blocked until their later rollout gates pass. +class CloudSyncShadowRuntime { + CloudSyncShadowRuntime({ + required Iterable engines, + Duration debounce = const Duration(seconds: 15), + this.automaticTriggersEnabled = false, + CloudSyncSchedulerErrorHandler? onError, + }) : _engines = List.unmodifiable(engines) { + if (_engines.isEmpty) { + throw ArgumentError.value(engines, 'engines', 'must not be empty'); + } + for (final engine in _engines) { + _requireShadowFlags(engine); + } + _scheduler = CloudSyncScheduler( + debounce: debounce, + onError: onError, + run: _runAll, + ); + } + + final List _engines; + final bool automaticTriggersEnabled; + late final CloudSyncScheduler _scheduler; + List _lastResults = const []; + Future? _disposeFuture; + bool _disposed = false; + + bool get isDisposed => _disposed; + bool get isRunning => _scheduler.isRunning; + bool get hasPendingWork => _scheduler.hasPendingWork; + UnmodifiableListView get lastResults => + UnmodifiableListView(_lastResults); + + /// Queues one non-blocking startup reconciliation pass only after a future + /// rollout explicitly enables automatic triggers. The safe default is a + /// dormant, user-requested shadow sampler. + void onStartup() { + if (automaticTriggersEnabled) _request(CloudSyncTrigger.startup); + } + + /// Queues one pass after the active route changes. + void onNetworkReconnect() { + if (automaticTriggersEnabled) { + _request(CloudSyncTrigger.networkReconnect); + } + } + + /// Queues one pass after IDS reconnects. IDS remains the live delivery path. + void onIdsReconnect() { + if (automaticTriggersEnabled) _request(CloudSyncTrigger.idsReconnect); + } + + /// Queues one immediate integrity pass after an observed local gap. + void onDetectedGap() { + if (automaticTriggersEnabled) _request(CloudSyncTrigger.detectedGap); + } + + /// Runs an immediate user-requested shadow pass and returns after all scoped + /// engines become idle. + Future> synchronizeNow() async { + _request(CloudSyncTrigger.manual); + await _scheduler.waitUntilIdle(); + return List.unmodifiable(_lastResults); + } + + Future waitUntilIdle() => _scheduler.waitUntilIdle(); + + Future dispose() => _disposeFuture ??= _dispose(); + + Future _dispose() { + _disposed = true; + return _scheduler.dispose(); + } + + void _request(CloudSyncTrigger trigger) { + if (_disposed) return; + _scheduler.request(trigger); + } + + Future _runAll( + CloudSyncTrigger trigger, + CloudSyncCancellationToken cancellationToken, + ) async { + final results = []; + for (final engine in _engines) { + if (cancellationToken.isCancelled) break; + results.add( + await engine.synchronize( + trigger: trigger, + cancellationToken: cancellationToken, + ), + ); + } + _lastResults = List.unmodifiable(results); + return _aggregate(results, cancellationToken); + } + + static void _requireShadowFlags(CloudSyncEngine engine) { + final flags = engine.config.flags; + if (!flags.readOnlyFetch || + flags.semanticApply || + flags.saves || + flags.deletions || + flags.profiles || + flags.notificationHints) { + throw ArgumentError.value( + flags, + 'engines', + 'CloudSyncShadowRuntime accepts read-only Phase 1 flags only', + ); + } + } + + static CloudSyncRunResult _aggregate( + List results, + CloudSyncCancellationToken cancellationToken, + ) { + if (results.isEmpty) { + final now = DateTime.now(); + return CloudSyncRunResult( + status: cancellationToken.isCancelled + ? CloudSyncRunStatus.cancelled + : CloudSyncRunStatus.skipped, + counters: const CloudSyncRunCounters(), + startedAt: now, + finishedAt: now, + failureCategory: cancellationToken.isCancelled + ? CloudFailureCategory.cancelled + : null, + ); + } + + var counters = const CloudSyncRunCounters(); + var startedAt = results.first.startedAt; + var finishedAt = results.first.finishedAt; + var worst = results.first; + var shadowJournalBlockReason = results.first.shadowJournalBlockReason; + for (final result in results) { + counters = counters.add( + fetched: result.counters.fetched, + applied: result.counters.applied, + deferred: result.counters.deferred, + quarantined: result.counters.quarantined, + confirmed: result.counters.confirmed, + retried: result.counters.retried, + shadowJournalEntries: result.counters.shadowJournalEntries, + shadowJournalEstimatedBytes: + result.counters.shadowJournalEstimatedBytes, + shadowJournalRejectedEntries: + result.counters.shadowJournalRejectedEntries, + ); + shadowJournalBlockReason ??= result.shadowJournalBlockReason; + if (result.startedAt.isBefore(startedAt)) startedAt = result.startedAt; + if (result.finishedAt.isAfter(finishedAt)) { + finishedAt = result.finishedAt; + } + if (_statusPriority(result.status) > _statusPriority(worst.status)) { + worst = result; + } + } + + return CloudSyncRunResult( + status: worst.status, + counters: counters, + startedAt: startedAt, + finishedAt: finishedAt, + skipReason: worst.skipReason, + failureCategory: worst.failureCategory, + shadowJournalBlockReason: shadowJournalBlockReason, + ); + } + + static int _statusPriority(CloudSyncRunStatus status) => switch (status) { + CloudSyncRunStatus.failed => 5, + CloudSyncRunStatus.cancelled => 4, + CloudSyncRunStatus.degraded => 3, + CloudSyncRunStatus.completed => 2, + CloudSyncRunStatus.skipped => 1, + }; +} diff --git a/lib/services/rustpush/cloud_sync/cloud_sync_safe_failure.dart b/lib/services/rustpush/cloud_sync/cloud_sync_safe_failure.dart new file mode 100644 index 0000000000..49ff99576e --- /dev/null +++ b/lib/services/rustpush/cloud_sync/cloud_sync_safe_failure.dart @@ -0,0 +1,100 @@ +import 'cloud_sync_shadow_report_file.dart'; +import 'cloud_sync_models.dart'; +import 'cloudkit_operation_interlock.dart'; +import 'cloudkit_writer_authority.dart'; + +const _cloudSyncV2SafeFailureCodes = { + 'account_changed', + 'account_unavailable', + 'cloud_sync_outbound_canary_active', + 'cloud_sync_outbound_canary_admission_invalid', + 'cloud_sync_outbound_canary_already_armed', + 'cloud_sync_outbound_canary_confirmation_expired', + 'cloud_sync_outbound_canary_confirmation_invalid', + 'cloud_sync_outbound_canary_disabled', + 'cloud_sync_outbound_canary_message_time_invalid', + 'cloud_sync_outbound_canary_outbox_invalid', + 'cloud_sync_outbound_canary_postflight_invalid', + 'cloud_sync_outbound_canary_quiescing', + 'cloud_sync_outbound_canary_recovery_invalid', + 'cloud_sync_outbound_canary_tripwire', + 'cloud_sync_outbound_canary_unavailable', + 'cloud_sync_outbound_canary_writer_disabled', + 'cloud_sync_outbound_candidate_selection_failed', + 'cloud_sync_outbound_quiescence_timeout', + 'cloud_sync_developer_mode_required', + 'cloud_sync_private_storage_unavailable', + 'cloud_sync_report_already_exists', + 'cloud_sync_report_contract_invalid', + 'cloud_sync_report_directory_changed', + 'cloud_sync_report_directory_unavailable', + 'cloud_sync_report_directory_unsafe', + 'cloud_sync_report_path_invalid', + 'cloud_sync_report_retention_failed', + 'cloud_sync_report_run_id_invalid', + 'cloud_sync_report_storage_unavailable', + 'cloud_sync_report_too_large', + 'cloud_sync_report_write_failed', + 'cloud_sync_sampler_active', + 'cloud_sync_sampler_disabled', + 'cloud_sync_semantic_pull_active', + 'cloud_sync_semantic_pull_disabled', + 'cloud_sync_semantic_pull_quiescing', + 'cloud_sync_semantic_pull_quiescence_timeout', + 'cloud_sync_semantic_remote_write_tripwire', + 'cloud_sync_shadow_controller_active', + 'cloud_sync_shadow_controller_disposed', + 'cloud_sync_shadow_owner_disposed', + 'cloud_sync_shadow_owner_quiescing', + 'cloud_sync_shadow_owner_superseded', + 'cloud_sync_shadow_write_tripwire', + 'cloudkit_interlock_busy', + 'cloudkit_interlock_fence_lost', + 'cloudkit_interlock_mode_violation', + 'cloudkit_interlock_profile_mismatch', + 'cloudkit_interlock_storage_unavailable', + 'cloudkit_interlock_unavailable', + 'cloudkit_writer_authority_requires_manual_recovery', + 'cloudkit_writer_build_owner_mismatch', + 'cloudkit_writer_identity_changed', + 'cloudkit_writer_identity_revalidation_failed', + 'cloudkit_writer_legacy_queue_quarantine_failed', + 'cloudkit_writer_migration_commit_precondition_failed', + 'cloudkit_writer_provisioning_measurements_invalid', + 'cloudkit_writer_provisioning_probe_failed', + 'cloudkit_writer_transition_evidence_incomplete', + 'cloudkit_writer_transition_evidence_untrusted', + 'cloudkit_writer_transition_precondition_failed', + 'cloudkit_writer_v2_readback_failed', + 'cloudkit_writer_v2_restore_precondition_failed', + 'coordinator_active', + 'legacy_sync_active', + 'legacy_cloudkit_blocked_by_v2_writer', + 'logout_active', + 'not_ui_isolate', + 'objectbox_not_ready', + 'outbox_not_empty', + 'protector_unavailable', + 'rustpush_not_ready', + 'storage_unavailable', + 'unsupported_cloud_zone', + 'unsupported_platform', +}; + +/// Returns only a fixed diagnostic code safe for logs and user-visible copy. +/// +/// Exception text is never forwarded. Unknown or newly introduced failures +/// collapse to one generic code until they receive an explicit review. +String cloudSyncV2SafeFailureCode(Object error) { + final String? candidate = switch (error) { + CloudSyncShadowReportFileException() => error.safeCode, + CloudSyncFailure() => error.safeCode, + CloudKitOperationInterlockException() => error.safeCode, + CloudKitWriterAuthorityFailure() => error.safeCode, + StateError() => error.message.toString(), + _ => null, + }; + return _cloudSyncV2SafeFailureCodes.contains(candidate) + ? candidate! + : 'cloud_sync_unknown_failure'; +} diff --git a/lib/services/rustpush/cloud_sync/cloud_sync_scheduler.dart b/lib/services/rustpush/cloud_sync/cloud_sync_scheduler.dart new file mode 100644 index 0000000000..7369eb6d3f --- /dev/null +++ b/lib/services/rustpush/cloud_sync/cloud_sync_scheduler.dart @@ -0,0 +1,162 @@ +import 'dart:async'; + +import 'cloud_sync_cancellation.dart'; +import 'cloud_sync_engine.dart'; +import 'cloud_sync_observability.dart'; + +typedef CloudSyncScheduledRun = + Future Function( + CloudSyncTrigger trigger, + CloudSyncCancellationToken cancellationToken, + ); + +typedef CloudSyncSchedulerErrorHandler = + void Function(Object error, StackTrace stackTrace); + +/// Coalesces Cloud Sync V2 triggers without delaying IDS delivery. +/// +/// Callers enqueue work and return immediately. At most one run is active, and +/// a burst that arrives during a run becomes one follow-up run. The engine's +/// durable coordinator lease remains the cross-isolate and cross-process +/// correctness boundary. +class CloudSyncScheduler { + CloudSyncScheduler({ + required this._run, + this.debounce = const Duration(seconds: 15), + this._onError, + }) { + if (debounce.isNegative) { + throw ArgumentError.value(debounce, 'debounce'); + } + } + + final Duration debounce; + final CloudSyncScheduledRun _run; + final CloudSyncSchedulerErrorHandler? _onError; + + Timer? _timer; + CloudSyncTrigger? _pendingTrigger; + CloudSyncCancellationToken? _activeCancellation; + Completer? _idleCompleter; + Future? _disposeFuture; + bool _running = false; + bool _disposed = false; + + bool get isRunning => _running; + bool get hasPendingWork => _pendingTrigger != null || _timer != null; + bool get isDisposed => _disposed; + + /// Schedules a synchronization and returns without waiting for network I/O. + /// + /// Manual sync and an observed IDS gap bypass the debounce because the user + /// or integrity signal is already explicit. Other bursty triggers coalesce. + void request(CloudSyncTrigger trigger) { + if (_disposed) return; + _markBusy(); + _pendingTrigger = _strongerTrigger(_pendingTrigger, trigger); + + if (_running) return; + final immediate = + trigger == CloudSyncTrigger.manual || + trigger == CloudSyncTrigger.detectedGap; + _schedule(immediate ? Duration.zero : debounce); + } + + /// Completes after the currently queued and active work becomes idle. + /// + /// This is intended for tests, diagnostics, and an explicit manual-sync UI. + /// IDS and push handlers should only call [request]. + Future waitUntilIdle() { + if (!_running && !hasPendingWork) return Future.value(); + _markBusy(); + return _idleCompleter!.future; + } + + Future dispose() => _disposeFuture ??= _dispose(); + + Future _dispose() async { + _disposed = true; + _timer?.cancel(); + _timer = null; + _pendingTrigger = null; + _activeCancellation?.cancel(); + if (!_running) _completeIdle(); + await waitUntilIdle(); + } + + void _schedule(Duration delay) { + _timer?.cancel(); + _timer = Timer(delay, _drainOne); + } + + Future _drainOne() async { + _timer = null; + if (_disposed || _running) { + if (!_running) _completeIdle(); + return; + } + + final trigger = _pendingTrigger; + if (trigger == null) { + _completeIdle(); + return; + } + _pendingTrigger = null; + _running = true; + final cancellation = CloudSyncCancellationToken(); + _activeCancellation = cancellation; + + try { + await _run(trigger, cancellation); + } catch (error, stackTrace) { + try { + _onError?.call(error, stackTrace); + } catch (_) { + // Diagnostics must never destabilize IDS or scheduler cleanup. + } + } finally { + _activeCancellation = null; + _running = false; + if (_disposed) { + _pendingTrigger = null; + _completeIdle(); + } else if (_pendingTrigger != null) { + _schedule(Duration.zero); + } else { + _completeIdle(); + } + } + } + + void _markBusy() { + final completer = _idleCompleter; + if (completer == null || completer.isCompleted) { + _idleCompleter = Completer(); + } + } + + void _completeIdle() { + final completer = _idleCompleter; + if (completer != null && !completer.isCompleted) { + completer.complete(); + } + } + + CloudSyncTrigger _strongerTrigger( + CloudSyncTrigger? current, + CloudSyncTrigger incoming, + ) { + if (current == null) return incoming; + return _priority(incoming) > _priority(current) ? incoming : current; + } + + int _priority(CloudSyncTrigger trigger) => switch (trigger) { + CloudSyncTrigger.detectedGap => 7, + CloudSyncTrigger.manual => 6, + CloudSyncTrigger.startup => 5, + CloudSyncTrigger.networkReconnect => 4, + CloudSyncTrigger.idsReconnect => 3, + CloudSyncTrigger.localOutbox => 2, + CloudSyncTrigger.notificationHint => 1, + }; +} diff --git a/lib/services/rustpush/cloud_sync/cloud_sync_semantic_pull_report.dart b/lib/services/rustpush/cloud_sync/cloud_sync_semantic_pull_report.dart new file mode 100644 index 0000000000..c57f6d686d --- /dev/null +++ b/lib/services/rustpush/cloud_sync/cloud_sync_semantic_pull_report.dart @@ -0,0 +1,89 @@ +import 'cloud_sync_engine.dart'; +import 'cloud_sync_models.dart'; +import 'cloud_sync_observability.dart'; + +/// Content-free result for one developer-confirmed local semantic projection. +final class CloudSyncSemanticPullZoneReport { + const CloudSyncSemanticPullZoneReport({ + required this.zoneLabel, + required this.status, + required this.fetched, + required this.applied, + required this.deferred, + required this.quarantined, + required this.retried, + required this.elapsedMilliseconds, + this.failureCategory, + this.skipReason, + }); + + final String zoneLabel; + final CloudSyncRunStatus status; + final int fetched; + final int applied; + final int deferred; + final int quarantined; + final int retried; + final int elapsedMilliseconds; + final CloudFailureCategory? failureCategory; + final CloudSyncSkipReason? skipReason; + + Map toJson() => { + 'zone': zoneLabel, + 'status': status.name, + 'fetched': fetched, + 'applied': applied, + 'deferred': deferred, + 'quarantined': quarantined, + 'retried': retried, + 'elapsedMilliseconds': elapsedMilliseconds, + 'failureCategory': failureCategory?.name, + 'skipReason': skipReason?.name, + }; +} + +final class CloudSyncSemanticPullReport { + CloudSyncSemanticPullReport({ + required this.timestampUtc, + required this.platform, + required this.architecture, + required this.buildCommit, + required this.pageLimit, + required this.changeLimit, + required this.outboxCountBefore, + required this.outboxCountAfter, + required Iterable zones, + }) : zones = List.unmodifiable(zones); + + static const schemaVersion = 1; + final DateTime timestampUtc; + final String platform; + final String architecture; + final String buildCommit; + final int pageLimit; + final int changeLimit; + final int outboxCountBefore; + final int outboxCountAfter; + final List zones; + + bool get remoteWriteTripwiresIntact => + outboxCountBefore == 0 && outboxCountAfter == 0; + + Map toJson() => { + 'schemaVersion': schemaVersion, + 'timestampUtc': timestampUtc.toUtc().toIso8601String(), + 'platform': platform, + 'architecture': architecture, + 'buildCommit': buildCommit, + 'mode': 'manual-semantic-read-only-cloudkit', + 'automaticTriggersEnabled': false, + 'remoteSavesEnabled': false, + 'remoteDeletesEnabled': false, + 'tombstonesEnabled': false, + 'pageLimit': pageLimit, + 'changeLimit': changeLimit, + 'outboxCountBefore': outboxCountBefore, + 'outboxCountAfter': outboxCountAfter, + 'zones': zones.map((zone) => zone.toJson()).toList(growable: false), + }; +} diff --git a/lib/services/rustpush/cloud_sync/cloud_sync_shadow_report.dart b/lib/services/rustpush/cloud_sync/cloud_sync_shadow_report.dart new file mode 100644 index 0000000000..33c6b48c2d --- /dev/null +++ b/lib/services/rustpush/cloud_sync/cloud_sync_shadow_report.dart @@ -0,0 +1,109 @@ +import 'cloud_shadow_journal_budget.dart'; +import 'cloud_sync_engine.dart'; +import 'cloud_sync_models.dart'; +import 'cloud_sync_observability.dart'; + +/// Allowlisted, content-free result for a one-shot read-only shadow sample. +/// +/// Keep serialization here explicit. Do not add generic object serialization: +/// CloudKit identifiers, tokens, protected values, and message data must never +/// enter this report. +class CloudSyncShadowZoneReport { + const CloudSyncShadowZoneReport({ + required this.zoneLabel, + required this.status, + required this.fetched, + required this.journaled, + required this.rejected, + required this.estimatedBytes, + required this.elapsedMilliseconds, + this.failureCategory, + this.skipReason, + this.blockReason, + }); + + final String zoneLabel; + final CloudSyncRunStatus status; + final int fetched; + final int journaled; + final int rejected; + final int estimatedBytes; + final int elapsedMilliseconds; + final CloudFailureCategory? failureCategory; + final CloudSyncSkipReason? skipReason; + final CloudShadowJournalBlockReason? blockReason; + + Map toJson() => { + 'zone': zoneLabel, + 'status': status.name, + 'fetched': fetched, + 'journaled': journaled, + 'rejected': rejected, + 'estimatedBytes': estimatedBytes, + 'elapsedMilliseconds': elapsedMilliseconds, + 'failureCategory': failureCategory?.name, + 'skipReason': skipReason?.name, + 'blockReason': blockReason?.name, + }; +} + +class CloudSyncShadowReport { + CloudSyncShadowReport({ + required this.runId, + required this.correlationTag, + required this.timestampUtc, + required this.platform, + required this.architecture, + required this.buildCommit, + required this.legacySyncEnabled, + required this.pageLimit, + required this.changeLimit, + required this.tripwiresArmed, + required this.outboxCountBefore, + required this.outboxCountAfter, + required Iterable zones, + }) : zones = List.unmodifiable(zones); + + static const int schemaVersion = 1; + final String runId; + + /// Random per-run tag. It is not stable across runs or derived from account + /// identity, so exported reports cannot be correlated to an Apple account. + final String correlationTag; + final DateTime timestampUtc; + final String platform; + final String architecture; + final String buildCommit; + final bool legacySyncEnabled; + final int pageLimit; + final int changeLimit; + final bool tripwiresArmed; + final int outboxCountBefore; + final int outboxCountAfter; + final List zones; + + bool get isValidReadOnlySuccess => + tripwiresArmed && + !legacySyncEnabled && + outboxCountBefore == outboxCountAfter && + zones.every((zone) => zone.status == CloudSyncRunStatus.completed); + + Map toJson() => { + 'schemaVersion': schemaVersion, + 'runId': runId, + 'timestampUtc': timestampUtc.toUtc().toIso8601String(), + 'platform': platform, + 'architecture': architecture, + 'buildCommit': buildCommit, + 'mode': 'manual-read-only', + 'automaticTriggersEnabled': false, + 'correlationTag': correlationTag, + 'legacySyncEnabled': legacySyncEnabled, + 'pageLimit': pageLimit, + 'changeLimit': changeLimit, + 'tripwiresArmed': tripwiresArmed, + 'outboxCountBefore': outboxCountBefore, + 'outboxCountAfter': outboxCountAfter, + 'zones': zones.map((zone) => zone.toJson()).toList(growable: false), + }; +} diff --git a/lib/services/rustpush/cloud_sync/cloud_sync_shadow_report_file.dart b/lib/services/rustpush/cloud_sync/cloud_sync_shadow_report_file.dart new file mode 100644 index 0000000000..190110e765 --- /dev/null +++ b/lib/services/rustpush/cloud_sync/cloud_sync_shadow_report_file.dart @@ -0,0 +1,267 @@ +import 'dart:convert'; +import 'dart:math'; + +import 'package:path/path.dart' as path; +import 'package:universal_io/io.dart'; + +import 'cloud_sync_shadow_report.dart'; + +/// Persists one allowlisted shadow report through a same-directory atomic +/// rename. +/// +/// Reports contain only [CloudSyncShadowReport.toJson]. The writer never +/// accepts arbitrary maps, log lines, account identifiers, or CloudKit data. +final class CloudSyncShadowReportFileWriter { + CloudSyncShadowReportFileWriter({ + required String privateReportDirectory, + String? trustedStorageRoot, + this.maximumRetainedReports = 20, + DateTime Function()? now, + }) : _directory = Directory(privateReportDirectory).absolute, + _trustedStorageRoot = Directory( + trustedStorageRoot ?? path.dirname(privateReportDirectory), + ).absolute, + _now = now ?? DateTime.now { + if (maximumRetainedReports < 1 || maximumRetainedReports > 100) { + throw ArgumentError.value( + maximumRetainedReports, + 'maximumRetainedReports', + 'cloud_sync_report_retention_invalid', + ); + } + if (!path.isWithin(_trustedStorageRoot.path, _directory.path)) { + throw ArgumentError('cloud_sync_report_directory_outside_storage'); + } + } + + static const int maximumEncodedBytes = 256 * 1024; + static final RegExp _safeRunId = RegExp( + r'^obcs2-shadow-[A-Za-z0-9_-]{1,60}$', + ); + static final RegExp _ownedReportName = RegExp( + r'^obcs2-shadow-[A-Za-z0-9_-]{1,60}\.json$', + ); + static final RegExp _ownedTemporaryName = RegExp( + r'^\.obcs2-shadow-[A-Za-z0-9_-]{1,60}\.[0-9a-f]{24}\.tmp$', + ); + static final RegExp _safeCorrelationTag = RegExp(r'^[A-Za-z0-9_-]{8,64}$'); + static final RegExp _safeBuildIdentifier = RegExp(r'^[A-Za-z0-9._+-]{1,80}$'); + static const Set _supportedPlatforms = {'android', 'windows'}; + static const Set _supportedArchitectures = { + 'android_arm64', + 'windows_arm64', + 'windows_x64', + // Test and imported redacted reports may use the architecture shorthand. + 'arm64', + 'x64', + }; + static const Set _supportedZoneLabels = { + 'chats', + 'messages', + 'attachments', + 'message updates', + 'recoverable deletes', + 'scheduled messages', + 'chat1 manatee', + }; + static const Duration _orphanedTemporaryAge = Duration(hours: 24); + static const int _maximumZoneElapsedMilliseconds = 10 * 60 * 1000; + + final Directory _directory; + final Directory _trustedStorageRoot; + final DateTime Function() _now; + final int maximumRetainedReports; + + Future write(CloudSyncShadowReport report) async { + if (!_safeRunId.hasMatch(report.runId)) { + throw const CloudSyncShadowReportFileException( + 'cloud_sync_report_run_id_invalid', + ); + } + if (!_isValidReportContract(report)) { + throw const CloudSyncShadowReportFileException( + 'cloud_sync_report_contract_invalid', + ); + } + + try { + if (!await _trustedStorageRoot.exists()) { + throw const CloudSyncShadowReportFileException( + 'cloud_sync_report_storage_unavailable', + ); + } + await _directory.create(recursive: true); + } on FileSystemException { + throw const CloudSyncShadowReportFileException( + 'cloud_sync_report_directory_unavailable', + ); + } + + final canonicalDirectory = await _verifiedDirectoryPath(); + final verifiedDirectory = Directory(canonicalDirectory); + final target = File(path.join(canonicalDirectory, '${report.runId}.json')); + if (path.dirname(path.normalize(target.path)) != canonicalDirectory) { + throw const CloudSyncShadowReportFileException( + 'cloud_sync_report_path_invalid', + ); + } + if (await target.exists()) { + throw const CloudSyncShadowReportFileException( + 'cloud_sync_report_already_exists', + ); + } + await _makeRoomForOneReport(verifiedDirectory); + + final encoded = utf8.encode( + const JsonEncoder.withIndent(' ').convert(report.toJson()), + ); + if (encoded.length > maximumEncodedBytes) { + throw const CloudSyncShadowReportFileException( + 'cloud_sync_report_too_large', + ); + } + + final random = Random.secure(); + final nonce = List.generate( + 12, + (_) => random.nextInt(256), + growable: false, + ).map((value) => value.toRadixString(16).padLeft(2, '0')).join(); + final temporary = File( + path.join(canonicalDirectory, '.${report.runId}.$nonce.tmp'), + ); + + RandomAccessFile? handle; + try { + await temporary.create(exclusive: true); + handle = await temporary.open(mode: FileMode.writeOnly); + await handle.writeFrom(encoded); + await handle.flush(); + await handle.close(); + handle = null; + if (await _verifiedDirectoryPath() != canonicalDirectory) { + throw const CloudSyncShadowReportFileException( + 'cloud_sync_report_directory_changed', + ); + } + return await temporary.rename(target.path); + } on FileSystemException { + throw const CloudSyncShadowReportFileException( + 'cloud_sync_report_write_failed', + ); + } finally { + if (handle != null) { + try { + await handle.close(); + } on FileSystemException { + // The original fixed failure remains authoritative. + } + } + if (await temporary.exists()) { + try { + await temporary.delete(); + } on FileSystemException { + // A unique, content-free temporary report can be reclaimed later. + } + } + } + } + + bool _isValidReportContract(CloudSyncShadowReport report) { + if (!_safeCorrelationTag.hasMatch(report.correlationTag) || + !_supportedPlatforms.contains(report.platform) || + !_supportedArchitectures.contains(report.architecture) || + !_safeBuildIdentifier.hasMatch(report.buildCommit) || + !report.timestampUtc.isUtc || + report.legacySyncEnabled || + report.pageLimit != 1 || + report.changeLimit != 50 || + !report.tripwiresArmed || + report.outboxCountBefore != 0 || + report.outboxCountAfter != 0 || + report.zones.length != _supportedZoneLabels.length) { + return false; + } + final labels = {}; + for (final zone in report.zones) { + if (!_supportedZoneLabels.contains(zone.zoneLabel) || + !labels.add(zone.zoneLabel) || + zone.fetched < 0 || + zone.fetched > report.pageLimit * report.changeLimit || + zone.journaled < 0 || + zone.journaled > report.pageLimit * report.changeLimit || + zone.rejected < 0 || + zone.rejected > report.pageLimit * report.changeLimit || + zone.estimatedBytes < 0 || + zone.estimatedBytes > 8 * 1024 * 1024 || + zone.elapsedMilliseconds < 0 || + zone.elapsedMilliseconds > _maximumZoneElapsedMilliseconds) { + return false; + } + } + return labels.length == _supportedZoneLabels.length; + } + + Future _verifiedDirectoryPath() async { + try { + final trusted = path.normalize( + await _trustedStorageRoot.resolveSymbolicLinks(), + ); + final reports = path.normalize(await _directory.resolveSymbolicLinks()); + if (!path.isWithin(trusted, reports)) { + throw const CloudSyncShadowReportFileException( + 'cloud_sync_report_directory_unsafe', + ); + } + return reports; + } on CloudSyncShadowReportFileException { + rethrow; + } on FileSystemException { + throw const CloudSyncShadowReportFileException( + 'cloud_sync_report_directory_unavailable', + ); + } + } + + Future _makeRoomForOneReport(Directory verifiedDirectory) async { + try { + final reports = <({File file, DateTime modified})>[]; + final reclaimBefore = _now().toUtc().subtract(_orphanedTemporaryAge); + await for (final entity in verifiedDirectory.list(followLinks: false)) { + if (entity is! File) continue; + final name = path.basename(entity.path); + final modified = await entity.lastModified(); + if (_ownedReportName.hasMatch(name)) { + reports.add((file: entity, modified: modified)); + } else if (_ownedTemporaryName.hasMatch(name) && + modified.toUtc().isBefore(reclaimBefore)) { + await entity.delete(); + } + } + final removeCount = reports.length - maximumRetainedReports + 1; + if (removeCount <= 0) return; + reports.sort((left, right) { + final modified = left.modified.compareTo(right.modified); + return modified != 0 + ? modified + : left.file.path.compareTo(right.file.path); + }); + for (final report in reports.take(removeCount)) { + await report.file.delete(); + } + } on FileSystemException { + throw const CloudSyncShadowReportFileException( + 'cloud_sync_report_retention_failed', + ); + } + } +} + +final class CloudSyncShadowReportFileException implements Exception { + const CloudSyncShadowReportFileException(this.safeCode); + + final String safeCode; + + @override + String toString() => 'CloudSyncShadowReportFileException($safeCode)'; +} diff --git a/lib/services/rustpush/cloud_sync/cloud_sync_shadow_transport.dart b/lib/services/rustpush/cloud_sync/cloud_sync_shadow_transport.dart new file mode 100644 index 0000000000..186b20e076 --- /dev/null +++ b/lib/services/rustpush/cloud_sync/cloud_sync_shadow_transport.dart @@ -0,0 +1,108 @@ +import 'cloud_sync_models.dart'; +import 'cloud_sync_store.dart'; +import 'cloud_sync_transport.dart'; + +typedef CloudSyncAccountFingerprintReader = Future Function(); + +/// Read-only transport guard for the developer shadow sampler. +/// +/// Identity is checked immediately before and after every fetch. A change +/// causes the page to be rejected before the engine can journal it. +final class AccountBoundShadowTransport + implements CloudSyncTransport, CloudProtectedPageLeaseTransportProvider { + AccountBoundShadowTransport({ + required this._delegate, + required this._readActiveFingerprint, + required this._expectedFingerprint, + }); + + final CloudSyncTransport _delegate; + final CloudSyncAccountFingerprintReader _readActiveFingerprint; + final String _expectedFingerprint; + + @override + CloudProtectedPageLeaseTransport? get protectedPageLeaseTransport { + final delegate = _delegate; + return delegate is CloudProtectedPageLeaseTransport + ? delegate as CloudProtectedPageLeaseTransport + : null; + } + + @override + Future fetchChanges( + CloudSyncScope scope, { + required String? previousToken, + required int generation, + required int limit, + }) async { + await _requireSameAccount(); + final batch = await _delegate.fetchChanges( + scope, + previousToken: previousToken, + generation: generation, + limit: limit, + ); + await _requireSameAccount(); + return batch; + } + + Future _requireSameAccount() async { + if (await _readActiveFingerprint() != _expectedFingerprint) { + throw CloudSyncFailure( + category: CloudFailureCategory.authorization, + safeCode: 'account_changed', + ); + } + } + + Never _rejectWrite() => throw CloudSyncFailure( + category: CloudFailureCategory.authorization, + safeCode: 'cloud_sync_shadow_write_tripwire', + ); + + @override + Future pushOperations( + CloudSyncScope scope, { + required List operations, + }) async => _rejectWrite(); + + @override + Future reconcileUnknownOutcome( + CloudSyncScope scope, { + required CloudOutboxOperation operation, + }) async => _rejectWrite(); + + @override + Future allocateServerRecordMapping( + CloudSyncScope scope, { + required String logicalEntityKeyHash, + }) async => _rejectWrite(); + + @override + Future reconcileServerRecordChanged( + CloudSyncScope scope, { + required CloudOutboxOperation operation, + }) async => _rejectWrite(); + + @override + Future refreshAuthentication(CloudSyncScope scope) async => + _rejectWrite(); + + @override + Future refreshPcsAccess(CloudSyncScope scope) async => _rejectWrite(); +} + +final class RejectingShadowInboxApplier implements CloudInboxApplier { + const RejectingShadowInboxApplier(); + + @override + Future apply( + CloudInboxEntry entry, { + required CloudCoordinatorLeaseFence leaseFence, + }) { + throw CloudSyncFailure( + category: CloudFailureCategory.authorization, + safeCode: 'cloud_sync_shadow_apply_tripwire', + ); + } +} diff --git a/lib/services/rustpush/cloud_sync/cloud_sync_store.dart b/lib/services/rustpush/cloud_sync/cloud_sync_store.dart new file mode 100644 index 0000000000..c940d8db0f --- /dev/null +++ b/lib/services/rustpush/cloud_sync/cloud_sync_store.dart @@ -0,0 +1,432 @@ +import 'cloud_shadow_journal_budget.dart'; +import 'cloud_sync_models.dart'; + +class CloudCoordinatorLeaseFence { + const CloudCoordinatorLeaseFence({ + required this.ownerId, + required this.generation, + }); + + final String ownerId; + final int generation; +} + +/// Durable persistence boundary for Cloud Sync V2. +/// +/// Production implementations should use ObjectBox transactions for every +/// method documented as atomic. The interface intentionally carries no +/// decrypted message body or Apple credential. +abstract interface class CloudSyncStore { + /// Returns the account-scoped checkpoint, creating an empty one if needed. + Future readCheckpoint(CloudSyncScope scope); + + /// Atomically inserts unseen inbox changes, allocates their monotonically + /// increasing sequence numbers, and advances the fetched token. + /// + /// A crash must commit both the journal and token, or neither. + Future journalFetchedBatch( + CloudFetchBatch batch, { + required DateTime now, + required CloudCoordinatorLeaseFence leaseFence, + required int expectedGeneration, + required String? expectedFetchedToken, + }); + + /// Returns deterministic pending-journal usage for one full account scope. + /// + /// This is an admission gauge only. Implementations must not prune records + /// while measuring usage. + Future readShadowJournalUsage( + CloudSyncScope scope, { + required CloudShadowJournalBudget budget, + }); + + /// Atomically admits a read-only shadow page under [budget]. + /// + /// On rejection, neither inbox rows nor the continuation token may change. + /// This method never deletes old, applied, quarantined, or pending records. + /// The commit must atomically verify [leaseFence], [expectedGeneration], and + /// [expectedFetchedToken]. A fetch that completes after lease takeover or + /// checkpoint advancement is a stale writer and must fail without mutation. + Future journalShadowFetchedBatch( + CloudFetchBatch batch, { + required DateTime now, + required CloudShadowJournalBudget budget, + required CloudCoordinatorLeaseFence leaseFence, + required int expectedGeneration, + required String? expectedFetchedToken, + }); + + /// Persists pull backoff so a process restart cannot create a retry storm. + Future recordPullFailure( + CloudSyncScope scope, { + required CloudFailureCategory category, + required DateTime nextEligibleAt, + }); + + Future recordPullSuccess(CloudSyncScope scope, {required DateTime now}); + + Future> readEligibleInbox( + CloudSyncScope scope, { + required DateTime now, + required int limit, + }); + + /// Atomically updates the journal entry and advances the checkpoint's + /// contiguous terminal position where possible. Fallback transitions must + /// match the exact active coordinator owner and generation. A terminal row + /// may be repeated idempotently, but must never be regressed or replaced. + Future markInboxApplied( + CloudSyncScope scope, { + required int sequence, + required DateTime now, + required CloudCoordinatorLeaseFence leaseFence, + }); + + Future markInboxRetryable( + CloudSyncScope scope, { + required int sequence, + required CloudFailureCategory category, + required DateTime now, + required DateTime nextEligibleAt, + required CloudCoordinatorLeaseFence leaseFence, + }); + + Future quarantineInbox( + CloudSyncScope scope, { + required int sequence, + required CloudFailureCategory category, + required DateTime now, + required CloudCoordinatorLeaseFence leaseFence, + }); + + /// Atomically creates or coalesces a pending save for the same logical + /// entity. A production adapter should invoke this in the same transaction + /// as the local semantic mutation that created it. + Future enqueueOutbox(CloudOutboxOperation operation); + + /// Production enqueue path. Allocates the per-scope mutation revision, + /// builds the deterministic local operation ID, and persists/coalesces the + /// operation in one transaction. + Future enqueueOutboxMutation(CloudOutboxDraft draft); + + /// Atomically starts a new reset generation. + /// + /// The transaction fences every old-generation outbox operation and record + /// mapping, preserves old inbox evidence outside the active generation, + /// clears the continuation/checkpoint sequencing and pull backoff state, + /// and returns a proof tied to the exact request. No network or protected + /// reference resolution is permitted while the transaction is open. + Future rebootstrapAfterReset( + CloudSyncResetRebootstrapRequest request, { + required DateTime now, + }); + + /// Atomically advances the account/scope checkpoint generation and fences + /// every non-terminal outbox row admitted under an older generation. + /// + /// This is the required rebootstrap boundary for account-reset recovery. + /// Fenced rows are terminal and cannot lease, block later work, attach a + /// record map, or accept a late transition. + /// + /// The advance fails while the exact scope has an active coordinator lease. + /// A reset must first quiesce and release the writer coordinator, which + /// closes the race where an already-leased operation reaches CloudKit after + /// its local generation has been fenced. + Future advanceOutboxGeneration( + CloudSyncScope scope, { + required DateTime now, + }); + + /// Atomically leases eligible operations. Confirmed dependencies are + /// enforced by the store so callers cannot upload a message before its + /// attachments. + Future> leaseEligibleOutbox( + CloudSyncScope scope, { + required DateTime now, + required int limit, + required String leaseId, + required Duration leaseDuration, + required Set allowedActions, + }); + + /// Marks rows as having been submitted before the remote request begins. + /// + /// This is a crash-safety boundary: the rows become non-leasable while the + /// original live lease is retained, so a process restart cannot replay an + /// ambiguous submission as a fresh upload. A returned remote response may + /// still resolve the rows through [applyOutboxTransitions]. + Future> markOutboxSubmissionStarted( + CloudSyncScope scope, { + required String leaseId, + required CloudOutboxSubmissionIdentity submissionIdentity, + required DateTime now, + }); + + /// Applies all per-record outcomes atomically. Every transition must match + /// [leaseId], preventing a stale worker from confirming another run's work. + Future applyOutboxTransitions( + CloudSyncScope scope, { + required String leaseId, + required Iterable transitions, + required DateTime now, + }); + + /// Returns abandoned leases to pending state after process death. + Future recoverExpiredOutboxLeases( + CloudSyncScope scope, { + required DateTime now, + }); + + Future attachOutboxRecordMapping( + CloudSyncScope scope, { + required String leaseId, + required String operationId, + required String serverRecordIdHash, + required DateTime now, + }); + + /// Resumes deliberately paused authorization or PCS operations only after + /// the owning subsystem has signaled that access is healthy again. + Future resumePausedOutbox( + CloudSyncScope scope, { + required Set categories, + required DateTime now, + }); + + /// Returns failure categories holding paused operations whose durable retry + /// delay has elapsed. This lets a push-only run refresh only blocked systems. + Future> readPausedOutboxFailureCategories( + CloudSyncScope scope, { + required DateTime now, + }); + + /// Moves only currently eligible paused operations back behind a durable + /// retry boundary after their subsystem refresh fails. Rows whose existing + /// delay has not elapsed are left unchanged. + Future postponeEligiblePausedOutbox( + CloudSyncScope scope, { + required Set categories, + required DateTime now, + required DateTime nextEligibleAt, + }); + + /// Cross-process coordinator lease. This supplements the engine's in-memory + /// reentrancy guard and must be implemented transactionally. Renewal and + /// release require the exact returned fence, not merely the owner string; + /// released generations must remain unavailable to prevent same-owner ABA. + Future tryAcquireCoordinatorLease( + CloudSyncScope scope, { + required String ownerId, + required DateTime now, + required Duration leaseDuration, + }); + + Future renewCoordinatorLease( + CloudSyncScope scope, { + required CloudCoordinatorLeaseFence leaseFence, + required DateTime now, + required Duration leaseDuration, + }); + + Future releaseCoordinatorLease( + CloudSyncScope scope, { + required CloudCoordinatorLeaseFence leaseFence, + }); + + Future readRecordMap( + CloudSyncScope scope, { + required String logicalEntityKeyHash, + required int generation, + }); + + Future upsertRecordMap( + CloudRecordMapEntry entry, { + required int generation, + }); + + /// Appends a bounded, content-free diagnostic run record. + Future recordRun(CloudSyncRunRecord run); +} + +/// Optional outbox capability used by the reconciliation worker. +/// +/// The read-only shadow wrapper deliberately does not expose this mutation +/// surface. Keeping it as a capability instead of adding it to +/// [CloudSyncStore] preserves that compile-time restriction while still +/// allowing production stores to share the same leasing contract. +abstract interface class CloudSyncUnknownOutcomeLeasingStore { + /// Atomically leases current-generation unknown-outcome rows that are due. + /// + /// A live lease is never taken over. An expired lease may be replaced. The + /// rows remain [CloudOutboxStatus.unknownOutcome] for the entire operation. + Future> leaseUnknownOutcomes( + CloudSyncScope scope, { + required DateTime now, + required int limit, + required String leaseId, + required Duration leaseDuration, + }); +} + +/// Crash-recovery metadata for native protected page blobs. +/// +/// Implementations must never return a truncated set: native recovery treats +/// every lease omitted from the adopted set as abandoned and may delete its +/// blobs. Release methods are called only after native finalization succeeds. +abstract interface class CloudProtectedPageLeaseAdoptionStore { + Future> readAdoptedProtectedPageLeaseReferences({ + required int maximumCount, + }); + + /// Returns every native `obcs2.ref.*` capability still referenced by + /// ObjectBox. Applied and quarantined inbox rows remain live until a + /// separately reviewed compaction policy explicitly removes them. + /// + /// A truncated result must set [CloudProtectedReferenceSnapshot.isComplete] + /// to false. Native recovery and garbage collection fail closed on an + /// incomplete snapshot. + Future readLiveProtectedReferences({ + required int maximumCount, + }); + + Future releaseAdoptedProtectedPageLeaseReferences( + Iterable leaseReferences, + ); +} + +/// Optional capability for native protected leases owned by non-terminal +/// outbound operations. These are intentionally separate from page leases so +/// page cleanup can never acknowledge an outbox receipt prematurely. +abstract interface class CloudProtectedOutboundLeaseAdoptionStore { + Future> readNonterminalProtectedOutboundLeaseReferences({ + required int maximumCount, + }); +} + +final class CloudProtectedReferenceSnapshot { + CloudProtectedReferenceSnapshot({ + required Iterable references, + required this.isComplete, + }) : references = Set.unmodifiable(references.toSet()); + + final Set references; + final bool isComplete; +} + +enum CloudOutboxTransitionType { + confirmed, + retryable, + paused, + quarantined, + unknownOutcome, +} + +class CloudOutboxTransition { + const CloudOutboxTransition._({ + required this.operationId, + required this.type, + this.category, + this.nextEligibleAt, + this.encryptedPayloadReference, + this.payloadSha256, + this.serverRecordIdHash, + this.clearSubmissionIdentity = false, + }); + + const CloudOutboxTransition.confirmed(String operationId) + : this._( + operationId: operationId, + type: CloudOutboxTransitionType.confirmed, + ); + + const CloudOutboxTransition.retryable( + String operationId, { + required CloudFailureCategory category, + required DateTime nextEligibleAt, + String? encryptedPayloadReference, + String? payloadSha256, + String? serverRecordIdHash, + }) : this._( + operationId: operationId, + type: CloudOutboxTransitionType.retryable, + category: category, + nextEligibleAt: nextEligibleAt, + encryptedPayloadReference: encryptedPayloadReference, + payloadSha256: payloadSha256, + serverRecordIdHash: serverRecordIdHash, + ); + + /// Opens a new submission attempt only after authoritative reconciliation + /// proved that the prior identified request did not commit this operation. + const CloudOutboxTransition.provenNotApplied( + String operationId, { + required CloudFailureCategory category, + required DateTime nextEligibleAt, + String? encryptedPayloadReference, + String? payloadSha256, + String? serverRecordIdHash, + }) : this._( + operationId: operationId, + type: CloudOutboxTransitionType.retryable, + category: category, + nextEligibleAt: nextEligibleAt, + encryptedPayloadReference: encryptedPayloadReference, + payloadSha256: payloadSha256, + serverRecordIdHash: serverRecordIdHash, + clearSubmissionIdentity: true, + ); + + const CloudOutboxTransition.paused( + String operationId, { + required CloudFailureCategory category, + DateTime? nextEligibleAt, + }) : this._( + operationId: operationId, + type: CloudOutboxTransitionType.paused, + category: category, + nextEligibleAt: nextEligibleAt, + ); + + /// Pauses for credential or PCS recovery after an authoritative response + /// proved that the prior identified operation was not committed. + const CloudOutboxTransition.provenNotAppliedPaused( + String operationId, { + required CloudFailureCategory category, + DateTime? nextEligibleAt, + }) : this._( + operationId: operationId, + type: CloudOutboxTransitionType.paused, + category: category, + nextEligibleAt: nextEligibleAt, + clearSubmissionIdentity: true, + ); + + const CloudOutboxTransition.quarantined( + String operationId, { + required CloudFailureCategory category, + }) : this._( + operationId: operationId, + type: CloudOutboxTransitionType.quarantined, + category: category, + ); + + const CloudOutboxTransition.unknownOutcome( + String operationId, { + DateTime? nextEligibleAt, + }) : this._( + operationId: operationId, + type: CloudOutboxTransitionType.unknownOutcome, + category: CloudFailureCategory.unknown, + nextEligibleAt: nextEligibleAt, + ); + + final String operationId; + final CloudOutboxTransitionType type; + final CloudFailureCategory? category; + final DateTime? nextEligibleAt; + final String? encryptedPayloadReference; + final String? payloadSha256; + final String? serverRecordIdHash; + final bool clearSubmissionIdentity; +} diff --git a/lib/services/rustpush/cloud_sync/cloud_sync_testing.dart b/lib/services/rustpush/cloud_sync/cloud_sync_testing.dart new file mode 100644 index 0000000000..a36da20690 --- /dev/null +++ b/lib/services/rustpush/cloud_sync/cloud_sync_testing.dart @@ -0,0 +1,386 @@ +import 'dart:collection'; + +import 'cloud_sync_models.dart'; +import 'cloud_sync_store.dart'; +import 'cloud_sync_transport.dart'; +import 'cloud_sync_write_transport.dart'; +import 'cloud_sync_writer_authority.dart'; +import 'cloudkit_operation_interlock.dart'; + +final class FakeCloudKitOperationExclusion + implements CloudKitOperationExclusion { + int runCallCount = 0; + final List observedKinds = []; + + @override + Future runExclusive({ + required CloudKitOperationKind kind, + required CloudKitOperationBody action, + }) async { + runCallCount++; + observedKinds.add(kind); + return action(); + } +} + +/// Test authority that can deterministically revoke a writer between permit +/// issuance and transport invocation. +final class FakeCloudSyncWriterAuthority implements CloudSyncWriterAuthority { + bool allowIssue = true; + bool allowVerify = true; + Future Function(int call)? verifyHandler; + int issueCallCount = 0; + int verifyCallCount = 0; + + @override + Future issue(CloudSyncScope scope) async { + issueCallCount++; + if (!allowIssue) { + throw CloudSyncFailure( + category: CloudFailureCategory.authorization, + safeCode: 'test_writer_authority_denied', + ); + } + return _FakeCloudSyncWriterPermit(this); + } +} + +final class _FakeCloudSyncWriterPermit implements CloudSyncWriterPermit { + const _FakeCloudSyncWriterPermit(this._authority); + + final FakeCloudSyncWriterAuthority _authority; + + @override + Future verify() async { + _authority.verifyCallCount++; + await _authority.verifyHandler?.call(_authority.verifyCallCount); + if (!_authority.allowVerify) { + throw CloudSyncFailure( + category: CloudFailureCategory.authorization, + safeCode: 'test_writer_permit_revoked', + ); + } + } +} + +typedef CloudFetchHandler = + Future Function( + CloudSyncScope scope, + String? previousToken, + int generation, + int limit, + ); + +typedef CloudPushHandler = + Future Function( + CloudSyncScope scope, + List operations, + ); + +typedef CloudAuthenticationRefreshHandler = + Future Function(CloudSyncScope scope); + +typedef CloudPcsRefreshHandler = Future Function(CloudSyncScope scope); + +typedef CloudRecordMappingHandler = + Future Function( + CloudSyncScope scope, + String logicalEntityKeyHash, + ); + +typedef CloudConflictHandler = + Future Function( + CloudSyncScope scope, + CloudOutboxOperation operation, + ); + +typedef CloudUnknownOutcomeHandler = + Future Function( + CloudSyncScope scope, + CloudOutboxOperation operation, + ); + +typedef CloudNativeOperationQuiescenceHandler = Future Function(); + +typedef CloudWritePreflightHandler = + Future Function( + CloudSyncScope scope, + CloudOutboxSubmissionIdentity submissionIdentity, + List operations, + ); + +typedef CloudPreparedSubmissionHandler = + Future Function( + CloudSyncScope scope, + CloudSyncPreparedSubmission preparedSubmission, + CloudOutboxSubmissionIdentity persistedIdentity, + ); + +class FakeCloudSyncTransport + implements + CloudSyncTransport, + CloudSyncWriteTransport, + CloudSyncNativeOperationQuiescence { + final Queue _fetchResponses = Queue(); + final Queue _pushResponses = Queue(); + final Queue _preparedPushResponses = Queue(); + + CloudFetchHandler? fetchHandler; + CloudPushHandler? pushHandler; + CloudWritePreflightHandler? writePreflightHandler; + CloudPreparedSubmissionHandler? preparedSubmissionHandler; + CloudAuthenticationRefreshHandler? authenticationRefreshHandler; + CloudPcsRefreshHandler? pcsRefreshHandler; + CloudRecordMappingHandler? recordMappingHandler; + CloudConflictHandler? conflictHandler; + CloudUnknownOutcomeHandler? unknownOutcomeHandler; + CloudNativeOperationQuiescenceHandler? quiescenceHandler; + + int fetchCallCount = 0; + int pushCallCount = 0; + int prepareSubmissionCallCount = 0; + int consumePreparedSubmissionCallCount = 0; + int authenticationRefreshCallCount = 0; + int pcsRefreshCallCount = 0; + int recordMappingCallCount = 0; + int conflictCallCount = 0; + int unknownOutcomeCallCount = 0; + int quiescenceCallCount = 0; + final List observedFetchTokens = []; + final List> observedPushOperationIds = []; + final List> observedAppleRequestUuids = []; + final List> observedAppleOperationUuids = []; + final List> observedPreparedOperationIds = []; + final List observedUnknownOutcomeOperationIds = []; + + @override + Future quiesceNativeOperations() async { + quiescenceCallCount++; + await quiescenceHandler?.call(); + } + + void enqueueFetchBatch(CloudFetchBatch batch) => _fetchResponses.add(batch); + + void enqueueFetchFailure(CloudSyncFailure failure) => + _fetchResponses.add(failure); + + void enqueuePushResult(CloudPushBatchResult result) => + _pushResponses.add(result); + + void enqueuePushFailure(CloudSyncFailure failure) => + _pushResponses.add(failure); + + void enqueuePreparedPushResult(CloudPushBatchResult result) => + _preparedPushResponses.add(result); + + void enqueuePreparedPushFailure(CloudSyncFailure failure) => + _preparedPushResponses.add(failure); + + @override + Future prepareSubmission( + CloudSyncScope scope, { + required CloudOutboxSubmissionIdentity submissionIdentity, + required List operations, + }) async { + prepareSubmissionCallCount++; + final operationIds = operations + .map((operation) => operation.operationId) + .toList(growable: false); + if (operationIds.isEmpty || + operationIds.toSet().length != operationIds.length) { + throw ArgumentError('cloud_sync_write_operations_invalid'); + } + submissionIdentity.validateOperationIds(operationIds); + observedPreparedOperationIds.add(List.unmodifiable(operationIds)); + await writePreflightHandler?.call( + scope, + submissionIdentity, + List.unmodifiable(operations), + ); + return CloudSyncPreparedSubmission.fromProtectedPreflight( + scope: scope, + identity: submissionIdentity, + operations: operations, + ); + } + + @override + Future consumePreparedSubmission( + CloudSyncScope scope, { + required CloudSyncPreparedSubmission preparedSubmission, + required CloudOutboxSubmissionIdentity persistedIdentity, + required List protectedOperations, + required List operations, + }) async { + preparedSubmission.claimForConsumption( + scope, + persistedIdentity: persistedIdentity, + protectedOperations: protectedOperations, + ); + consumePreparedSubmissionCallCount++; + if (!_sameStringList( + preparedSubmission.operationIds, + operations.map((operation) => operation.operationId).toList(), + )) { + throw ArgumentError('cloud_sync_prepared_submission_operations_mismatch'); + } + final handler = preparedSubmissionHandler; + if (handler != null) { + return handler(scope, preparedSubmission, persistedIdentity); + } + if (_preparedPushResponses.isNotEmpty) { + final response = _preparedPushResponses.removeFirst(); + if (response is CloudSyncFailure) throw response; + return response as CloudPushBatchResult; + } + // Preserve the existing fake seam and its observations while the engine + // migrates to the prepared-submission contract. + return pushOperations(scope, operations: operations); + } + + @override + Future fetchChanges( + CloudSyncScope scope, { + required String? previousToken, + required int generation, + required int limit, + }) async { + fetchCallCount++; + observedFetchTokens.add(previousToken); + if (fetchHandler != null) { + return fetchHandler!(scope, previousToken, generation, limit); + } + if (_fetchResponses.isEmpty) { + return CloudFetchBatch( + scope: scope, + changes: const [], + batchId: 'fake-empty-batch-$fetchCallCount', + generation: generation, + nextToken: previousToken, + hasMore: false, + ); + } + final response = _fetchResponses.removeFirst(); + if (response is CloudSyncFailure) throw response; + return response as CloudFetchBatch; + } + + @override + Future pushOperations( + CloudSyncScope scope, { + required List operations, + }) async { + pushCallCount++; + observedPushOperationIds.add( + operations.map((operation) => operation.operationId).toList(), + ); + observedAppleRequestUuids.add( + operations.map((operation) => operation.appleRequestUuid).toList(), + ); + observedAppleOperationUuids.add( + operations.map((operation) => operation.appleOperationUuid).toList(), + ); + if (pushHandler != null) return pushHandler!(scope, operations); + if (_pushResponses.isEmpty) { + return CloudPushBatchResult(outcomes: const []); + } + final response = _pushResponses.removeFirst(); + if (response is CloudSyncFailure) throw response; + return response as CloudPushBatchResult; + } + + @override + Future reconcileUnknownOutcome( + CloudSyncScope scope, { + required CloudOutboxOperation operation, + }) async { + unknownOutcomeCallCount++; + observedUnknownOutcomeOperationIds.add(operation.operationId); + final handler = unknownOutcomeHandler; + if (handler != null) return handler(scope, operation); + return const CloudUnknownOutcomeResolution.unresolved( + failureCategory: CloudFailureCategory.network, + ); + } + + @override + Future refreshAuthentication(CloudSyncScope scope) async { + authenticationRefreshCallCount++; + final handler = authenticationRefreshHandler; + if (handler == null) return false; + return handler(scope); + } + + @override + Future refreshPcsAccess(CloudSyncScope scope) async { + pcsRefreshCallCount++; + final handler = pcsRefreshHandler; + if (handler == null) return false; + return handler(scope); + } + + @override + Future allocateServerRecordMapping( + CloudSyncScope scope, { + required String logicalEntityKeyHash, + }) async { + recordMappingCallCount++; + final handler = recordMappingHandler; + if (handler != null) return handler(scope, logicalEntityKeyHash); + final marker = (recordMappingCallCount % 10).toString(); + return CloudRecordMapEntry( + scope: scope, + logicalEntityKeyHash: logicalEntityKeyHash, + serverRecordIdHash: List.filled(43, marker).join(), + encryptedServerRecordId: 'obcs2.ref.${List.filled(43, marker).join()}', + updatedAt: DateTime.utc(2026), + ); + } + + @override + Future reconcileServerRecordChanged( + CloudSyncScope scope, { + required CloudOutboxOperation operation, + }) async { + conflictCallCount++; + final handler = conflictHandler; + if (handler != null) return handler(scope, operation); + return const CloudServerConflictResolution.retryable( + failureCategory: CloudFailureCategory.network, + ); + } +} + +bool _sameStringList(List left, List right) { + if (left.length != right.length) return false; + for (var index = 0; index < left.length; index++) { + if (left[index] != right[index]) return false; + } + return true; +} + +typedef CloudInboxApplyHandler = + Future Function(CloudInboxEntry entry); + +class FakeCloudInboxApplier implements CloudInboxApplier { + FakeCloudInboxApplier({this._handler}); + + CloudInboxApplyHandler? _handler; + final Map resultsBySequence = {}; + final List appliedSequences = []; + final List appliedLeaseFences = []; + + set handler(CloudInboxApplyHandler value) => _handler = value; + + @override + Future apply( + CloudInboxEntry entry, { + required CloudCoordinatorLeaseFence leaseFence, + }) async { + appliedSequences.add(entry.sequence); + appliedLeaseFences.add(leaseFence); + if (_handler != null) return _handler!(entry); + return resultsBySequence[entry.sequence] ?? + const CloudInboxApplyResult.applied(); + } +} diff --git a/lib/services/rustpush/cloud_sync/cloud_sync_transport.dart b/lib/services/rustpush/cloud_sync/cloud_sync_transport.dart new file mode 100644 index 0000000000..fa6addc096 --- /dev/null +++ b/lib/services/rustpush/cloud_sync/cloud_sync_transport.dart @@ -0,0 +1,215 @@ +import 'cloud_sync_models.dart'; +import 'cloud_sync_store.dart'; + +/// Apple protocol and cryptography boundary. +/// +/// The Rust adapter is responsible for authentication, PCS, encryption, and +/// translating private CloudKit responses into the typed envelopes below. +abstract interface class CloudSyncTransport { + Future fetchChanges( + CloudSyncScope scope, { + required String? previousToken, + required int generation, + required int limit, + }); + + /// Must return one explicit outcome per attempted operation. An omitted, + /// extra, or otherwise untrustworthy outcome set is ambiguous and remains + /// frozen until server-state reconciliation proves what CloudKit committed. + Future pushOperations( + CloudSyncScope scope, { + required List operations, + }); + + /// Reads the current server record after an ambiguous write and compares it + /// with the protected desired payload. `notApplied` may be returned only + /// when the read proves that replaying this stable record operation cannot + /// duplicate a committed mutation. + Future reconcileUnknownOutcome( + CloudSyncScope scope, { + required CloudOutboxOperation operation, + }); + + /// Performs at most one credential refresh when requested by an engine run. + Future refreshAuthentication(CloudSyncScope scope); + + /// Performs at most one PCS/clique refresh when requested by an engine run. + Future refreshPcsAccess(CloudSyncScope scope); + + /// Allocates a cryptographically random Apple server record ID and returns + /// its protected mapping. Local operation IDs are deterministic; Apple + /// server record IDs are not. + Future allocateServerRecordMapping( + CloudSyncScope scope, { + required String logicalEntityKeyHash, + }); + + /// Fetches the newer server record, semantically merges it, and prepares the + /// existing local operation for retry after a server-record-changed result. + Future reconcileServerRecordChanged( + CloudSyncScope scope, { + required CloudOutboxOperation operation, + }); +} + +/// Native protected-page crash lifecycle. +/// +/// Implementations accept only opaque `obcs2.lease.*` references. Recovery +/// must complete before a fetch starts whenever the shared process barrier is +/// not valid, using the complete durable adoption and protected-reference +/// liveness sets from [CloudProtectedPageLeaseAdoptionStore]. +abstract interface class CloudProtectedPageLeaseTransport { + /// Stable, non-reversible identity for the native protected store. + /// + /// Recovery coordination uses this value across independently-created Dart + /// wrappers. It must never contain a filesystem path. + String get protectedPageLeaseRecoveryIdentity; + + /// Serializes one complete protected-store lifecycle for this native store. + /// + /// Calls made by [action] into this same transport identity are reentrant. + /// A caller should use this around fetch, durable adoption, and native + /// commit/rollback as one unit so recovery or maintenance cannot enter the + /// crash window between those steps. + Future runProtectedStoreExclusive(Future Function() action); + + Future recoverProtectedPageLeases( + Set adoptedLeaseReferences, + CloudProtectedReferenceSnapshot liveReferences, + ); + + Future commitProtectedPageLease( + String leaseReference, + Set retainedReferences, + ); + + Future acknowledgeCommittedPageLease(String leaseReference); + + Future rollbackProtectedPageLease(String leaseReference); + + Future retireProtectedReferences(Set references); + + Future collectProtectedGarbage( + CloudProtectedReferenceSnapshot liveReferences, + ); +} + +/// Join boundary for native operations that may outlive a Dart timeout wrapper. +/// +/// Owners must await this before releasing credentials, native clients, or the +/// cross-process CloudKit interlock. +abstract interface class CloudSyncNativeOperationQuiescence { + Future quiesceNativeOperations(); +} + +/// Lets a read-only guard expose an underlying protected lifecycle without +/// weakening the guard's [CloudSyncTransport] fetch boundary. +abstract interface class CloudProtectedPageLeaseTransportProvider { + CloudProtectedPageLeaseTransport? get protectedPageLeaseTransport; +} + +final class CloudProtectedPageLeaseRecoveryResult { + CloudProtectedPageLeaseRecoveryResult({ + required Iterable finalizedAdoptedLeaseReferences, + Iterable absentAdoptedLeaseReferences = const [], + this.rolledBackCount = 0, + this.removedTemporaryFilesCount = 0, + required this.hasMore, + }) : finalizedAdoptedLeaseReferences = Set.unmodifiable( + finalizedAdoptedLeaseReferences.toSet(), + ), + absentAdoptedLeaseReferences = Set.unmodifiable( + absentAdoptedLeaseReferences.toSet(), + ); + + final Set finalizedAdoptedLeaseReferences; + final Set absentAdoptedLeaseReferences; + final int rolledBackCount; + final int removedTemporaryFilesCount; + final bool hasMore; +} + +final class CloudProtectedGarbageCollectionResult { + const CloudProtectedGarbageCollectionResult({ + required this.scannedCount, + required this.firstObservedCount, + required this.deletedCount, + required this.preservedLiveCount, + required this.preservedActiveLeaseCount, + required this.hasMore, + }); + + final int scannedCount; + final int firstObservedCount; + final int deletedCount; + final int preservedLiveCount; + final int preservedActiveLeaseCount; + final bool hasMore; +} + +/// Shared semantic-upsert boundary used by both IDS and CloudKit. +/// +/// Implementations decrypt the protected payload reference within the Rust / +/// keystore boundary and commit the local mutation before returning `applied`. +abstract interface class CloudInboxApplier { + Future apply( + CloudInboxEntry entry, { + required CloudCoordinatorLeaseFence leaseFence, + }); +} + +enum CloudServerConflictDisposition { mergedForRetry, retryable, quarantined } + +class CloudServerConflictResolution { + const CloudServerConflictResolution._({ + required this.disposition, + this.encryptedPayloadReference, + this.payloadSha256, + this.serverRecordIdHash, + this.retryAfter, + this.failureCategory, + this.encryptedRawRecordReference, + this.etagHash, + }); + + const CloudServerConflictResolution.mergedForRetry({ + required String encryptedPayloadReference, + required String payloadSha256, + required String serverRecordIdHash, + required String encryptedRawRecordReference, + String? etagHash, + }) : this._( + disposition: CloudServerConflictDisposition.mergedForRetry, + encryptedPayloadReference: encryptedPayloadReference, + payloadSha256: payloadSha256, + serverRecordIdHash: serverRecordIdHash, + encryptedRawRecordReference: encryptedRawRecordReference, + etagHash: etagHash, + failureCategory: CloudFailureCategory.conflict, + ); + + const CloudServerConflictResolution.retryable({ + required CloudFailureCategory failureCategory, + Duration? retryAfter, + }) : this._( + disposition: CloudServerConflictDisposition.retryable, + failureCategory: failureCategory, + retryAfter: retryAfter, + ); + + const CloudServerConflictResolution.quarantined({ + required CloudFailureCategory failureCategory, + }) : this._( + disposition: CloudServerConflictDisposition.quarantined, + failureCategory: failureCategory, + ); + + final CloudServerConflictDisposition disposition; + final String? encryptedPayloadReference; + final String? payloadSha256; + final String? serverRecordIdHash; + final Duration? retryAfter; + final CloudFailureCategory? failureCategory; + final String? encryptedRawRecordReference; + final String? etagHash; +} diff --git a/lib/services/rustpush/cloud_sync/cloud_sync_write_transport.dart b/lib/services/rustpush/cloud_sync/cloud_sync_write_transport.dart new file mode 100644 index 0000000000..4b2dbb1f47 --- /dev/null +++ b/lib/services/rustpush/cloud_sync/cloud_sync_write_transport.dart @@ -0,0 +1,233 @@ +import 'cloud_sync_models.dart'; +import 'cloud_sync_store.dart'; + +/// A write operation containing only protected local references. +/// +/// Plaintext records, Apple credentials, and resolved server record IDs must +/// stay behind the native protected boundary. The native implementation can +/// resolve these references during preflight, but Dart only carries the +/// references and their digests. +final class CloudSyncProtectedWriteOperation { + CloudSyncProtectedWriteOperation({ + required this.operationId, + required this.logicalEntityKeyHash, + required this.action, + this.protectedLeaseReference, + required this.protectedServerRecordIdReference, + required this.serverRecordIdHash, + this.protectedPayloadReference, + this.payloadSha256, + }) { + if (operationId.isEmpty) { + throw ArgumentError('cloud_sync_write_operation_id_invalid'); + } + if (!_isNativeDigest(logicalEntityKeyHash)) { + throw ArgumentError('cloud_sync_write_logical_key_hash_invalid'); + } + if (protectedLeaseReference != null && + !_isLeaseReference(protectedLeaseReference!)) { + throw ArgumentError('cloud_sync_write_lease_reference_invalid'); + } + if (!_isProtectedReference(protectedServerRecordIdReference)) { + throw ArgumentError('cloud_sync_write_server_record_reference_invalid'); + } + if (!_isNativeDigest(serverRecordIdHash)) { + throw ArgumentError('cloud_sync_write_server_record_hash_invalid'); + } + if (action == CloudOutboxAction.save && + (protectedPayloadReference == null || + payloadSha256 == null || + protectedLeaseReference == null)) { + throw ArgumentError('cloud_sync_write_payload_missing'); + } + if (action == CloudOutboxAction.delete && + (protectedPayloadReference != null || payloadSha256 != null)) { + throw ArgumentError('cloud_sync_write_delete_payload_invalid'); + } + if (protectedPayloadReference != null && + !_isProtectedReference(protectedPayloadReference!)) { + throw ArgumentError('cloud_sync_write_payload_reference_invalid'); + } + if (payloadSha256 != null && !_isContentDigest(payloadSha256!)) { + throw ArgumentError('cloud_sync_write_payload_digest_invalid'); + } + } + + /// Builds the protected write input after the local record map has been + /// resolved. The map's Apple record ID remains an opaque protected + /// reference; it is never resolved in Dart. + factory CloudSyncProtectedWriteOperation.fromOutbox( + CloudOutboxOperation operation, { + required CloudRecordMapEntry recordMapping, + }) { + if (operation.scope != recordMapping.scope || + operation.logicalEntityKeyHash != recordMapping.logicalEntityKeyHash || + operation.serverRecordIdHash != recordMapping.serverRecordIdHash) { + throw ArgumentError('cloud_sync_write_record_mapping_mismatch'); + } + + return CloudSyncProtectedWriteOperation( + operationId: operation.operationId, + logicalEntityKeyHash: operation.logicalEntityKeyHash, + action: operation.action, + protectedLeaseReference: operation.protectedLeaseReference, + protectedServerRecordIdReference: recordMapping.encryptedServerRecordId, + serverRecordIdHash: recordMapping.serverRecordIdHash, + protectedPayloadReference: operation.encryptedPayloadReference, + payloadSha256: operation.payloadSha256, + ); + } + + final String operationId; + final String logicalEntityKeyHash; + final CloudOutboxAction action; + final String? protectedLeaseReference; + final String protectedServerRecordIdReference; + final String serverRecordIdHash; + final String? protectedPayloadReference; + final String? payloadSha256; +} + +/// A native-prepared submission that can cross the Dart/native boundary once. +/// +/// The prepared operation material and identity are intentionally private and +/// there is no serialization or copying API. Dart cannot make an object truly +/// opaque, so the only public inspection is redacted binding metadata and the +/// single-use claim used by a transport implementation. +class CloudSyncPreparedSubmission { + /// Internal construction seam for native transport implementations and + /// fakes. The resulting object contains only protected references and is + /// still bound to one exact identity before it can be consumed. + CloudSyncPreparedSubmission.fromProtectedPreflight({ + required CloudSyncScope scope, + required CloudOutboxSubmissionIdentity identity, + required List operations, + }) : _scopeStorageKey = scope.storageKey, + _requestUuid = identity.requestUuid, + _operationUuids = Map.unmodifiable(identity.operationUuids), + _operationBindings = List.unmodifiable( + operations.map(_protectedOperationBinding), + ), + _operationIds = List.unmodifiable( + operations.map((operation) => operation.operationId), + ) { + if (_operationIds.isEmpty || + _operationIds.length > 256 || + _operationIds.toSet().length != _operationIds.length) { + throw ArgumentError('cloud_sync_prepared_submission_operations_invalid'); + } + if (operations.map((operation) => operation.action).toSet().length != 1) { + throw ArgumentError('cloud_sync_prepared_submission_mixed_actions'); + } + identity.validateOperationIds(_operationIds); + } + + final String _scopeStorageKey; + final String _requestUuid; + final Map _operationUuids; + final List _operationBindings; + final List _operationIds; + bool _claimed = false; + + /// Number of protected operations held by the native-prepared submission. + int get operationCount => _operationIds.length; + + /// Local correlation IDs only. No payload, record ID, token, or credential + /// is exposed through this diagnostic view. + List get operationIds => _operationIds; + + /// Claims this prepared submission for its one permitted network consume. + /// + /// The claim is made before the caller awaits network work, so concurrent or + /// repeated consumption attempts fail closed instead of replaying a write. + void claimForConsumption( + CloudSyncScope scope, { + required CloudOutboxSubmissionIdentity persistedIdentity, + required List protectedOperations, + }) { + if (_claimed) { + throw StateError('cloud_sync_prepared_submission_already_consumed'); + } + if (scope.storageKey != _scopeStorageKey) { + throw ArgumentError('cloud_sync_prepared_submission_scope_mismatch'); + } + persistedIdentity.validateOperationIds(_operationIds); + if (persistedIdentity.requestUuid != _requestUuid || + !_sameMap(persistedIdentity.operationUuids, _operationUuids)) { + throw ArgumentError('cloud_sync_prepared_submission_identity_mismatch'); + } + final bindings = protectedOperations + .map(_protectedOperationBinding) + .toList(growable: false); + if (!_sameList(bindings, _operationBindings)) { + throw ArgumentError('cloud_sync_prepared_submission_binding_mismatch'); + } + _claimed = true; + } + + static bool _sameMap(Map left, Map right) { + if (left.length != right.length) return false; + for (final entry in left.entries) { + if (right[entry.key] != entry.value) return false; + } + return true; + } + + static bool _sameList(List left, List right) { + if (left.length != right.length) return false; + for (var index = 0; index < left.length; index++) { + if (left[index] != right[index]) return false; + } + return true; + } +} + +/// Write-only capability used after protected preflight succeeds. +/// +/// Callers must complete [prepareSubmission] before making the durable +/// outbox submission marker. A prepared object is then consumed exactly once. +abstract interface class CloudSyncWriteTransport { + Future prepareSubmission( + CloudSyncScope scope, { + required CloudOutboxSubmissionIdentity submissionIdentity, + required List operations, + }); + + Future consumePreparedSubmission( + CloudSyncScope scope, { + required CloudSyncPreparedSubmission preparedSubmission, + required CloudOutboxSubmissionIdentity persistedIdentity, + required List protectedOperations, + required List operations, + }); +} + +/// Optional native receipt cleanup invoked only after outbox outcomes are +/// durable. Implementations must retain receipts for every non-terminal row. +abstract interface class CloudSyncWriteReceiptFinalizer { + Future acknowledgeDurableTerminalOperations( + CloudSyncScope scope, { + required List operations, + required List transitions, + }); +} + +String _protectedOperationBinding(CloudSyncProtectedWriteOperation operation) => + '${operation.operationId}\u001f${operation.logicalEntityKeyHash}\u001f' + '${operation.action.name}\u001f${operation.protectedLeaseReference ?? ''}\u001f' + '${operation.protectedServerRecordIdReference}\u001f' + '${operation.serverRecordIdHash}\u001f' + '${operation.protectedPayloadReference ?? ''}\u001f' + '${operation.payloadSha256 ?? ''}'; + +bool _isContentDigest(String value) => + RegExp(r'^[a-f0-9]{64}$').hasMatch(value); + +bool _isNativeDigest(String value) => + RegExp(r'^[A-Za-z0-9_-]{43}$').hasMatch(value); + +bool _isLeaseReference(String value) => + RegExp(r'^obcs2\.lease\.[0-9a-f]{32}$').hasMatch(value); + +bool _isProtectedReference(String value) => + RegExp(r'^obcs2\.ref\.[A-Za-z0-9_-]{43}$').hasMatch(value); diff --git a/lib/services/rustpush/cloud_sync/cloud_sync_writer_authority.dart b/lib/services/rustpush/cloud_sync/cloud_sync_writer_authority.dart new file mode 100644 index 0000000000..5b1c947b11 --- /dev/null +++ b/lib/services/rustpush/cloud_sync/cloud_sync_writer_authority.dart @@ -0,0 +1,78 @@ +// ignore_for_file: prefer_initializing_formals + +import 'package:objectbox/objectbox.dart'; + +import 'cloud_sync_models.dart'; +import 'cloudkit_writer_authority.dart'; +import 'cloudkit_writer_ownership.dart'; + +/// One revocable authorization to mutate a specific CloudKit account. +abstract interface class CloudSyncWriterPermit { + Future verify(); +} + +/// Required by every V2 engine configured with remote saves enabled. +abstract interface class CloudSyncWriterAuthority { + Future issue(CloudSyncScope scope); +} + +/// Production adapter from the platform-neutral engine to durable ObjectBox +/// writer ownership. A build not explicitly compiled as the V2 writer cannot +/// issue a permit. +final class ObjectBoxCloudSyncWriterAuthority + implements CloudSyncWriterAuthority { + ObjectBoxCloudSyncWriterAuthority({required Store store}) + : _authority = ObjectBoxCloudKitWriterAuthority(store: store); + + final ObjectBoxCloudKitWriterAuthority _authority; + + @override + Future issue(CloudSyncScope scope) async { + try { + final writerScope = CloudKitWriterScope( + accountFingerprint: scope.accountFingerprint, + container: scope.container, + database: scope.database, + ); + final permit = _authority.issuePermit( + writerScope, + expectedOwner: CloudKitWriterOwner.v2, + ); + return _ObjectBoxCloudSyncWriterPermit( + authority: _authority, + permit: permit, + ); + } on CloudKitWriterAuthorityFailure catch (error) { + throw CloudSyncFailure( + category: CloudFailureCategory.authorization, + safeCode: error.safeCode, + ); + } + } +} + +final class _ObjectBoxCloudSyncWriterPermit implements CloudSyncWriterPermit { + const _ObjectBoxCloudSyncWriterPermit({ + required ObjectBoxCloudKitWriterAuthority authority, + required CloudKitWriterPermit permit, + }) : _authority = authority, + _permit = permit; + + final ObjectBoxCloudKitWriterAuthority _authority; + final CloudKitWriterPermit _permit; + + @override + Future verify() async { + try { + _authority.verifyPermit(_permit); + } on CloudKitWriterAuthorityFailure catch (error) { + throw CloudSyncFailure( + category: CloudFailureCategory.authorization, + safeCode: error.safeCode, + ); + } + } + + @override + String toString() => 'CloudSyncWriterPermit(redacted)'; +} diff --git a/lib/services/rustpush/cloud_sync/cloudkit_operation_interlock.dart b/lib/services/rustpush/cloud_sync/cloudkit_operation_interlock.dart new file mode 100644 index 0000000000..552da1286c --- /dev/null +++ b/lib/services/rustpush/cloud_sync/cloudkit_operation_interlock.dart @@ -0,0 +1,309 @@ +import 'dart:async'; +import 'dart:convert'; +import 'dart:math'; + +import 'package:path/path.dart' as path; +import 'package:universal_io/io.dart'; + +import 'cloud_sync_models.dart'; +import 'cloud_sync_persistent_keys.dart'; +import 'cloud_sync_store.dart'; + +enum CloudKitOperationKind { + legacyReadWrite, + v2ReadWrite, + v2ShadowRead, + v2SemanticRead, + writerTransition, + destructiveReset, +} + +typedef CloudKitOperationBody = Future Function(); + +abstract interface class CloudKitOperationExclusion { + Future runExclusive({ + required CloudKitOperationKind kind, + required CloudKitOperationBody action, + }); +} + +/// A process- and isolate-wide exclusion boundary for private CloudKit work. +/// +/// Android may run the legacy CloudKit path in a second Dart isolate, while +/// Windows may have more than one app process touching the same profile. A +/// static mutex cannot cover either case, so every operation also holds an +/// operating-system file lock in the existing private support directory. +/// +/// Re-entry is permitted only for the same operation kind. This lets the +/// legacy sync call smaller legacy upload helpers without deadlocking, while +/// ensuring a write helper accidentally reached from the V2 shadow sampler +/// fails closed. +final class CloudKitOperationInterlock implements CloudKitOperationExclusion { + CloudKitOperationInterlock({ + required String privateStorageDirectory, + required this._fenceStore, + Duration leaseDuration = const Duration(minutes: 5), + Duration heartbeatInterval = const Duration(seconds: 30), + }) : _privateStorageDirectory = _validateStorageDirectory( + privateStorageDirectory, + ), + _leaseDuration = leaseDuration, + _heartbeatInterval = heartbeatInterval { + if (leaseDuration.inMicroseconds <= 0 || + heartbeatInterval.inMicroseconds <= 0 || + heartbeatInterval.inMicroseconds >= leaseDuration.inMicroseconds) { + throw ArgumentError( + 'The heartbeat interval must be positive and shorter than the lease', + ); + } + } + + static const _lockFileName = '.openbubbles-cloudkit-operation.lock'; + static const _fenceAccountFingerprint = + '-8hryNWhXHChrtLXXv9CZEP9PRsA_fGw2ltOR79b3yQ'; + static final _fenceScope = CloudSyncScope( + accountFingerprint: _fenceAccountFingerprint, + container: 'openbubbles.local', + database: 'private', + zone: 'cloudkit-operation-fence', + ); + + /// Storage key of the mutual-exclusion fence lease. + /// + /// This interlock holds a lease on a sentinel scope for the duration of the + /// work it guards, including while that work runs its own preflight. A + /// coordinator-lease probe must exclude this key, because a mutual-exclusion + /// fence is not another sync coordinator and an operation must not observe + /// itself as one. + static String get fenceScopeKey => cloudSyncPersistentScopeKey(_fenceScope); + + static final Object _zoneLeaseKey = Object(); + static final Set _locallyReservedPaths = {}; + + final String _privateStorageDirectory; + final CloudSyncStore _fenceStore; + final Duration _leaseDuration; + final Duration _heartbeatInterval; + + String get lockPath => path.join(_privateStorageDirectory, _lockFileName); + + static void throwIfActiveFenceLost() { + final active = Zone.current[_zoneLeaseKey]; + if (active is _ActiveCloudKitOperation && active.fenceLost) { + throw const CloudKitOperationInterlockException( + 'cloudkit_interlock_fence_lost', + ); + } + } + + /// Proves that a mutation guard is executing inside the expected exclusion + /// boundary. This prevents future callers from treating the interlock as a + /// documentation-only precondition. + static void requireActive(CloudKitOperationKind kind) { + final active = Zone.current[_zoneLeaseKey]; + if (active is! _ActiveCloudKitOperation) { + throw const CloudKitOperationInterlockException( + 'cloudkit_interlock_required', + ); + } + if (active.kind != kind) { + throw const CloudKitOperationInterlockException( + 'cloudkit_interlock_mode_violation', + ); + } + throwIfActiveFenceLost(); + } + + static void requireActiveAny(Set kinds) { + final active = Zone.current[_zoneLeaseKey]; + if (active is! _ActiveCloudKitOperation) { + throw const CloudKitOperationInterlockException( + 'cloudkit_interlock_required', + ); + } + if (!kinds.contains(active.kind)) { + throw const CloudKitOperationInterlockException( + 'cloudkit_interlock_mode_violation', + ); + } + throwIfActiveFenceLost(); + } + + @override + Future runExclusive({ + required CloudKitOperationKind kind, + required CloudKitOperationBody action, + }) async { + final inherited = Zone.current[_zoneLeaseKey]; + if (inherited is _ActiveCloudKitOperation) { + if (inherited.lockPath != lockPath) { + throw const CloudKitOperationInterlockException( + 'cloudkit_interlock_profile_mismatch', + ); + } + if (inherited.kind != kind) { + throw const CloudKitOperationInterlockException( + 'cloudkit_interlock_mode_violation', + ); + } + return action(); + } + + if (!_locallyReservedPaths.add(lockPath)) { + throw const CloudKitOperationInterlockException( + 'cloudkit_interlock_busy', + ); + } + + RandomAccessFile? handle; + Timer? heartbeat; + Future? renewalInFlight; + final ownerId = _newOwnerId(); + CloudCoordinatorLeaseFence? databaseFence; + try { + final fence = await _fenceStore.tryAcquireCoordinatorLease( + _fenceScope, + ownerId: ownerId, + now: DateTime.now(), + leaseDuration: _leaseDuration, + ); + if (fence == null) { + throw const CloudKitOperationInterlockException( + 'cloudkit_interlock_busy', + ); + } + databaseFence = fence; + + try { + handle = await File(lockPath).open(mode: FileMode.append); + } on FileSystemException { + throw const CloudKitOperationInterlockException( + 'cloudkit_interlock_unavailable', + ); + } + + try { + await handle.lock(FileLock.exclusive); + } on FileSystemException { + await _closeQuietly(handle); + handle = null; + throw const CloudKitOperationInterlockException( + 'cloudkit_interlock_busy', + ); + } + + final active = _ActiveCloudKitOperation(lockPath: lockPath, kind: kind); + heartbeat = Timer.periodic(_heartbeatInterval, (_) { + if (renewalInFlight != null || active.fenceLost) return; + final renewal = _renewFence(fence, active); + renewalInFlight = renewal; + renewal.whenComplete(() { + if (identical(renewalInFlight, renewal)) { + renewalInFlight = null; + } + }); + }); + final result = await runZoned( + action, + zoneValues: {_zoneLeaseKey: active}, + ); + throwIfActiveFenceLost(); + return result; + } finally { + heartbeat?.cancel(); + await renewalInFlight; + if (handle != null) { + await _releaseQuietly(handle); + } + final fence = databaseFence; + if (fence != null) { + try { + await _fenceStore.releaseCoordinatorLease( + _fenceScope, + leaseFence: fence, + ); + } catch (_) { + // Lease expiry is the final recovery boundary after process death or + // an unavailable local store. The operation itself has already + // stopped before this best-effort release. + } + } + _locallyReservedPaths.remove(lockPath); + } + } + + Future _renewFence( + CloudCoordinatorLeaseFence leaseFence, + _ActiveCloudKitOperation active, + ) async { + try { + final renewed = await _fenceStore.renewCoordinatorLease( + _fenceScope, + leaseFence: leaseFence, + now: DateTime.now(), + leaseDuration: _leaseDuration, + ); + if (!renewed) active.fenceLost = true; + } catch (_) { + active.fenceLost = true; + } + } + + static String _newOwnerId() { + final random = Random.secure(); + final bytes = List.generate(18, (_) => random.nextInt(256)); + return base64Url.encode(bytes).replaceAll('=', ''); + } + + static String _validateStorageDirectory(String value) { + final trimmed = value.trim(); + if (trimmed.isEmpty) { + throw ArgumentError.value(value, 'privateStorageDirectory'); + } + final directory = Directory(trimmed).absolute; + if (!directory.existsSync()) { + throw ArgumentError.value( + value, + 'privateStorageDirectory', + 'The existing private storage directory is required', + ); + } + return path.normalize(directory.path); + } + + static Future _releaseQuietly(RandomAccessFile handle) async { + try { + await handle.unlock(); + } on FileSystemException { + // Closing the handle releases the operating-system lock even if an + // explicit unlock fails during shutdown or profile teardown. + } + await _closeQuietly(handle); + } + + static Future _closeQuietly(RandomAccessFile handle) async { + try { + await handle.close(); + } on FileSystemException { + // The operation has already ended. Never mask its result with cleanup + // noise; the operating system will reclaim the handle with the process. + } + } +} + +final class _ActiveCloudKitOperation { + _ActiveCloudKitOperation({required this.lockPath, required this.kind}); + + final String lockPath; + final CloudKitOperationKind kind; + bool fenceLost = false; +} + +final class CloudKitOperationInterlockException implements Exception { + const CloudKitOperationInterlockException(this.safeCode); + + final String safeCode; + + @override + String toString() => 'CloudKitOperationInterlockException($safeCode)'; +} diff --git a/lib/services/rustpush/cloud_sync/cloudkit_writer_authority.dart b/lib/services/rustpush/cloud_sync/cloudkit_writer_authority.dart new file mode 100644 index 0000000000..5ceb360e67 --- /dev/null +++ b/lib/services/rustpush/cloud_sync/cloudkit_writer_authority.dart @@ -0,0 +1,1205 @@ +// ignore_for_file: prefer_initializing_formals + +import 'dart:async'; +import 'dart:convert'; + +import 'package:bluebubbles/database/models.dart'; +import 'package:crypto/crypto.dart'; + +import 'cloudkit_writer_ownership.dart'; +import 'cloudkit_operation_interlock.dart'; +import 'cloud_sync_manual_shadow_sampler.dart'; +import 'cloud_sync_models.dart'; + +enum CloudKitWriterAuthorityState { + stable, + migrationPrepared, + resetPrepared, + resetUnknown, + mutationUnknown, +} + +enum LegacyMutationQueueDisposition { empty, quarantined } + +final class CloudKitWriterScope { + CloudKitWriterScope({ + required this.accountFingerprint, + this.container = 'com.apple.messages.cloud', + this.database = 'private', + }) { + if (!RegExp(r'^[A-Za-z0-9_-]{43}$').hasMatch(accountFingerprint)) { + throw ArgumentError('cloudkit_writer_account_fingerprint_invalid'); + } + if (!RegExp(r'^[A-Za-z0-9.-]{1,128}$').hasMatch(container)) { + throw ArgumentError('cloudkit_writer_container_invalid'); + } + if (database != 'private') { + throw ArgumentError('cloudkit_writer_database_invalid'); + } + } + + final String accountFingerprint; + final String container; + final String database; + + String get storageKey => '$accountFingerprint\u001f$container\u001f$database'; + + @override + bool operator ==(Object other) => + other is CloudKitWriterScope && + other.accountFingerprint == accountFingerprint && + other.container == container && + other.database == database; + + @override + int get hashCode => Object.hash(accountFingerprint, container, database); + + @override + String toString() => 'CloudKitWriterScope(redacted)'; +} + +final class CloudKitWriterTransitionEvidence { + const CloudKitWriterTransitionEvidence._({ + required this.operationsQuiesced, + required this.activeIdentityRevalidated, + required this.legacyMutationQueues, + required bool productionMeasured, + }) : _productionMeasured = productionMeasured; + + /// Synthetic evidence is available only to authorities created with + /// [ObjectBoxCloudKitWriterAuthority.forTest]. Production authorities reject + /// it even when every boolean is true. + const CloudKitWriterTransitionEvidence.forTest({ + required bool operationsQuiesced, + required bool activeIdentityRevalidated, + required LegacyMutationQueueDisposition legacyMutationQueues, + }) : this._( + operationsQuiesced: operationsQuiesced, + activeIdentityRevalidated: activeIdentityRevalidated, + legacyMutationQueues: legacyMutationQueues, + productionMeasured: false, + ); + + const CloudKitWriterTransitionEvidence._productionMeasured({ + required bool operationsQuiesced, + required bool activeIdentityRevalidated, + required LegacyMutationQueueDisposition legacyMutationQueues, + }) : this._( + operationsQuiesced: operationsQuiesced, + activeIdentityRevalidated: activeIdentityRevalidated, + legacyMutationQueues: legacyMutationQueues, + productionMeasured: true, + ); + + final bool operationsQuiesced; + final bool activeIdentityRevalidated; + final LegacyMutationQueueDisposition legacyMutationQueues; + final bool _productionMeasured; + + bool get isComplete => + operationsQuiesced && + activeIdentityRevalidated && + legacyMutationQueues == LegacyMutationQueueDisposition.empty; + + @override + String toString() => 'CloudKitWriterTransitionEvidence(redacted)'; +} + +final class CloudKitWriterAuthoritySnapshot { + const CloudKitWriterAuthoritySnapshot({ + required this.scope, + required this.owner, + required this.state, + required this.epoch, + this.targetOwner = CloudKitWriterOwner.none, + this.transitionIdHash, + }); + + final CloudKitWriterScope scope; + final CloudKitWriterOwner owner; + final CloudKitWriterAuthorityState state; + final CloudKitWriterOwner targetOwner; + final int epoch; + final String? transitionIdHash; + + @override + String toString() => + 'CloudKitWriterAuthoritySnapshot(owner=${owner.name}, state=${state.name}, epoch=$epoch, redacted)'; +} + +final class CloudKitWriterPermit { + const CloudKitWriterPermit._({ + required this.scope, + required this.owner, + required this.epoch, + }); + + final CloudKitWriterScope scope; + final CloudKitWriterOwner owner; + final int epoch; + + @override + String toString() => + 'CloudKitWriterPermit(owner=${owner.name}, epoch=$epoch, redacted)'; +} + +final class CloudKitResetFence { + const CloudKitResetFence._({ + required this.scope, + required this.syncScope, + required this.owner, + required this.epoch, + required this.expectedGeneration, + required this.transitionIdHash, + required this.proofReferenceHash, + }); + + final CloudKitWriterScope scope; + final CloudSyncScope syncScope; + final CloudKitWriterOwner owner; + final int epoch; + final int expectedGeneration; + final String transitionIdHash; + final String proofReferenceHash; + + @override + String toString() => + 'CloudKitResetFence(owner=${owner.name}, epoch=$epoch, redacted)'; +} + +final class CloudKitWriterAuthorityFailure implements Exception { + const CloudKitWriterAuthorityFailure(this.safeCode); + + final String safeCode; + + @override + String toString() => 'CloudKitWriterAuthorityFailure($safeCode)'; +} + +/// Transactional, per-account single-writer authority. +/// +/// A build-time owner selector is necessary but insufficient: a stale process +/// or a migration crash can otherwise keep writing. Durable epochs make every +/// permit revocable, while prepared/unknown states prevent either writer from +/// operating until the transition is explicitly completed or reconciled. +final class ObjectBoxCloudKitWriterAuthority { + ObjectBoxCloudKitWriterAuthority({required Store store}) + : _store = store, + _authorities = store.box(), + _leases = store.box(), + _buildDecision = CloudKitWriterOwnership.decision, + _requireInterlock = true; + + ObjectBoxCloudKitWriterAuthority.forTest({ + required Store store, + required CloudKitWriterOwnershipDecision buildDecision, + }) : _store = store, + _authorities = store.box(), + _leases = store.box(), + _buildDecision = buildDecision, + _requireInterlock = false; + + final Store _store; + final Box _authorities; + final Box _leases; + final CloudKitWriterOwnershipDecision _buildDecision; + final bool _requireInterlock; + + CloudKitWriterAuthoritySnapshot initializeDisabled( + CloudKitWriterScope scope, { + required DateTime now, + }) { + try { + return _store.runInTransaction(TxMode.write, () { + final existing = _find(scope); + if (existing != null) return _snapshot(scope, existing); + final created = CloudKitWriterAuthorityEntity( + authorityKey: _authorityKey(scope), + accountFingerprint: scope.accountFingerprint, + container: scope.container, + database: scope.database, + updatedAtMs: now.millisecondsSinceEpoch, + ); + _authorities.put(created); + return _snapshot(scope, created); + }); + } on UniqueViolationException { + final raced = read(scope); + if (raced != null) return raced; + throw const CloudKitWriterAuthorityFailure( + 'cloudkit_writer_authority_initialize_race', + ); + } + } + + CloudKitWriterAuthoritySnapshot? read(CloudKitWriterScope scope) { + return _store.runInTransaction(TxMode.read, () { + final entity = _find(scope); + return entity == null ? null : _snapshot(scope, entity); + }); + } + + CloudKitWriterAuthoritySnapshot provisionInitialOwner( + CloudKitWriterScope scope, { + required CloudKitWriterOwner owner, + required int expectedEpoch, + required CloudKitWriterTransitionEvidence evidence, + required DateTime now, + }) { + _requireTransitionInterlock(); + _requireSelectedOwner(owner); + _requireEvidence(evidence); + return _store.runInTransaction(TxMode.write, () { + final entity = _require(scope); + final current = _requireStable(scope, entity); + _requireNoActiveCoordinator(scope, now: now); + if (current.owner != CloudKitWriterOwner.none || + current.epoch != expectedEpoch) { + throw const CloudKitWriterAuthorityFailure( + 'cloudkit_writer_initial_owner_precondition_failed', + ); + } + entity + ..owner = _ownerCode(owner) + ..targetOwner = _ownerCode(CloudKitWriterOwner.none) + ..epoch += 1 + ..updatedAtMs = now.millisecondsSinceEpoch; + _authorities.put(entity); + return _snapshot(scope, entity); + }); + } + + CloudKitWriterPermit issuePermit( + CloudKitWriterScope scope, { + required CloudKitWriterOwner expectedOwner, + }) { + _requireSelectedOwner(expectedOwner); + return _store.runInTransaction(TxMode.read, () { + final entity = _require(scope); + final current = _requireStable(scope, entity); + if (current.owner != expectedOwner) { + throw const CloudKitWriterAuthorityFailure( + 'cloudkit_writer_owner_mismatch', + ); + } + return CloudKitWriterPermit._( + scope: scope, + owner: expectedOwner, + epoch: current.epoch, + ); + }); + } + + void verifyPermit(CloudKitWriterPermit permit) { + _store.runInTransaction(TxMode.read, () { + final entity = _require(permit.scope); + final current = _requireStable(permit.scope, entity); + if (current.owner != permit.owner || current.epoch != permit.epoch) { + throw const CloudKitWriterAuthorityFailure( + 'cloudkit_writer_permit_stale', + ); + } + }); + } + + void markMutationUnknown( + CloudKitWriterPermit permit, { + required DateTime now, + }) { + _requireMutationInterlock(permit.owner); + _store.runInTransaction(TxMode.write, () { + final entity = _require(permit.scope); + final current = _requireStable(permit.scope, entity); + if (current.owner != permit.owner || current.epoch != permit.epoch) { + throw const CloudKitWriterAuthorityFailure( + 'cloudkit_writer_permit_stale', + ); + } + entity + ..state = _stateCode(CloudKitWriterAuthorityState.mutationUnknown) + ..epoch += 1 + ..updatedAtMs = now.millisecondsSinceEpoch; + _authorities.put(entity); + }); + } + + CloudKitWriterAuthoritySnapshot prepareMigration( + CloudKitWriterScope scope, { + required CloudKitWriterOwner from, + required CloudKitWriterOwner to, + required int expectedEpoch, + required String transitionIdHash, + required CloudKitWriterTransitionEvidence evidence, + required DateTime now, + }) { + _requireTransitionInterlock(); + if (from == CloudKitWriterOwner.none || from == to) { + throw const CloudKitWriterAuthorityFailure( + 'cloudkit_writer_migration_invalid', + ); + } + _requireSelectedOwner(to); + _requireTransitionIdHash(transitionIdHash); + _requireEvidence(evidence); + return _store.runInTransaction(TxMode.write, () { + final entity = _require(scope); + final current = _requireStable(scope, entity); + _requireNoActiveCoordinator(scope, now: now); + if (current.owner != from || current.epoch != expectedEpoch) { + throw const CloudKitWriterAuthorityFailure( + 'cloudkit_writer_migration_precondition_failed', + ); + } + entity + ..state = _stateCode(CloudKitWriterAuthorityState.migrationPrepared) + ..targetOwner = _ownerCode(to) + ..transitionIdHash = transitionIdHash + ..epoch += 1 + ..updatedAtMs = now.millisecondsSinceEpoch; + _authorities.put(entity); + return _snapshot(scope, entity); + }); + } + + CloudKitWriterAuthoritySnapshot commitMigration( + CloudKitWriterScope scope, { + required CloudKitWriterOwner targetOwner, + required int expectedEpoch, + required String transitionIdHash, + required DateTime now, + }) { + _requireTransitionInterlock(); + _requireSelectedOwner(targetOwner); + _requireTransitionIdHash(transitionIdHash); + return _store.runInTransaction(TxMode.write, () { + final entity = _require(scope); + final current = _snapshot(scope, entity); + _requireNoActiveCoordinator(scope, now: now); + if (current.state != CloudKitWriterAuthorityState.migrationPrepared || + current.targetOwner != targetOwner || + current.epoch != expectedEpoch || + current.transitionIdHash != transitionIdHash) { + throw const CloudKitWriterAuthorityFailure( + 'cloudkit_writer_migration_commit_precondition_failed', + ); + } + entity + ..owner = _ownerCode(targetOwner) + ..state = _stateCode(CloudKitWriterAuthorityState.stable) + ..targetOwner = _ownerCode(CloudKitWriterOwner.none) + ..transitionIdHash = null + ..epoch += 1 + ..updatedAtMs = now.millisecondsSinceEpoch; + _authorities.put(entity); + return _snapshot(scope, entity); + }); + } + + CloudKitWriterAuthoritySnapshot abortMigration( + CloudKitWriterScope scope, { + required CloudKitWriterOwner targetOwner, + required int expectedEpoch, + required String transitionIdHash, + required DateTime now, + }) { + _requireTransitionInterlock(); + _requireSelectedOwner(targetOwner); + _requireTransitionIdHash(transitionIdHash); + return _store.runInTransaction(TxMode.write, () { + final entity = _require(scope); + final current = _snapshot(scope, entity); + _requireNoActiveCoordinator(scope, now: now); + if (current.state != CloudKitWriterAuthorityState.migrationPrepared || + current.targetOwner != targetOwner || + current.epoch != expectedEpoch || + current.transitionIdHash != transitionIdHash) { + throw const CloudKitWriterAuthorityFailure( + 'cloudkit_writer_migration_abort_precondition_failed', + ); + } + entity + ..state = _stateCode(CloudKitWriterAuthorityState.stable) + ..targetOwner = _ownerCode(CloudKitWriterOwner.none) + ..transitionIdHash = null + ..epoch += 1 + ..updatedAtMs = now.millisecondsSinceEpoch; + _authorities.put(entity); + return _snapshot(scope, entity); + }); + } + + CloudKitResetFence prepareReset( + CloudKitWriterPermit permit, { + required CloudSyncResetRebootstrapRequest request, + required DateTime now, + }) { + _requireTransitionInterlock(); + _requireResetRequest(permit.scope, request); + return _store.runInTransaction(TxMode.write, () { + final entity = _require(permit.scope); + final current = _requireStable(permit.scope, entity); + _requireNoActiveCoordinator(permit.scope, now: now); + if (current.owner != permit.owner || current.epoch != permit.epoch) { + throw const CloudKitWriterAuthorityFailure( + 'cloudkit_writer_reset_precondition_failed', + ); + } + entity + ..state = _stateCode(CloudKitWriterAuthorityState.resetPrepared) + ..transitionIdHash = request.transitionIdHash + ..resetScopeKeyHash = _scopeDigest(request.scope) + ..resetProofReferenceHash = _digest( + 'cloudkit-reset-proof\u001f${request.protectedRemoteStateProofReference}', + ) + ..resetGeneration = request.expectedGeneration + ..epoch += 1 + ..updatedAtMs = now.millisecondsSinceEpoch; + _authorities.put(entity); + return CloudKitResetFence._( + scope: permit.scope, + syncScope: request.scope, + owner: permit.owner, + epoch: entity.epoch, + expectedGeneration: request.expectedGeneration, + transitionIdHash: request.transitionIdHash, + proofReferenceHash: entity.resetProofReferenceHash!, + ); + }); + } + + /// Reconstructs an interrupted reset strictly from durable state. + CloudKitResetFence? recoverResetFence( + CloudKitWriterScope scope, { + required CloudSyncScope syncScope, + }) { + return _store.runInTransaction(TxMode.read, () { + final entity = _find(scope); + if (entity == null) return null; + final snapshot = _snapshot(scope, entity); + if (snapshot.state != CloudKitWriterAuthorityState.resetPrepared && + snapshot.state != CloudKitWriterAuthorityState.resetUnknown) { + return null; + } + if (entity.resetScopeKeyHash != _scopeDigest(syncScope)) { + throw const CloudKitWriterAuthorityFailure( + 'cloudkit_writer_reset_scope_mismatch', + ); + } + if (entity.resetProofReferenceHash == null) { + throw const CloudKitWriterAuthorityFailure( + 'cloudkit_writer_reset_proof_binding_missing', + ); + } + return CloudKitResetFence._( + scope: scope, + syncScope: syncScope, + owner: snapshot.owner, + epoch: snapshot.epoch, + expectedGeneration: entity.resetGeneration, + transitionIdHash: snapshot.transitionIdHash!, + proofReferenceHash: entity.resetProofReferenceHash!, + ); + }); + } + + CloudKitWriterAuthoritySnapshot completeReset( + CloudKitResetFence fence, { + required CloudSyncResetCompletionProof proof, + required DateTime now, + }) { + _requireTransitionInterlock(); + _requireResetCompletionProof(fence, proof); + return _finishReset( + fence, + expectedState: CloudKitWriterAuthorityState.resetPrepared, + now: now, + ); + } + + CloudKitWriterAuthoritySnapshot markResetUnknown( + CloudKitResetFence fence, { + required DateTime now, + }) { + _requireTransitionInterlock(); + return _store.runInTransaction(TxMode.write, () { + final entity = _require(fence.scope); + final current = _snapshot(fence.scope, entity); + _requireNoActiveCoordinator(fence.scope, now: now); + if (current.state != CloudKitWriterAuthorityState.resetPrepared || + current.owner != fence.owner || + current.epoch != fence.epoch || + current.transitionIdHash != fence.transitionIdHash) { + throw const CloudKitWriterAuthorityFailure( + 'cloudkit_writer_reset_unknown_precondition_failed', + ); + } + entity + ..state = _stateCode(CloudKitWriterAuthorityState.resetUnknown) + ..updatedAtMs = now.millisecondsSinceEpoch; + _authorities.put(entity); + return _snapshot(fence.scope, entity); + }); + } + + CloudKitWriterAuthoritySnapshot reconcileResetUnknown( + CloudKitResetFence fence, { + required CloudSyncResetCompletionProof proof, + required DateTime now, + }) { + _requireTransitionInterlock(); + _requireResetCompletionProof(fence, proof); + return _finishReset( + fence, + expectedState: CloudKitWriterAuthorityState.resetUnknown, + now: now, + ); + } + + CloudKitWriterAuthoritySnapshot _finishReset( + CloudKitResetFence fence, { + required CloudKitWriterAuthorityState expectedState, + required DateTime now, + }) { + return _store.runInTransaction(TxMode.write, () { + final entity = _require(fence.scope); + final current = _snapshot(fence.scope, entity); + _requireNoActiveCoordinator(fence.scope, now: now); + if (current.state != expectedState || + current.owner != fence.owner || + current.epoch != fence.epoch || + current.transitionIdHash != fence.transitionIdHash) { + throw const CloudKitWriterAuthorityFailure( + 'cloudkit_writer_reset_finish_precondition_failed', + ); + } + entity + ..state = _stateCode(CloudKitWriterAuthorityState.stable) + ..transitionIdHash = null + ..resetScopeKeyHash = null + ..resetProofReferenceHash = null + ..resetGeneration = 0 + ..epoch += 1 + ..updatedAtMs = now.millisecondsSinceEpoch; + _authorities.put(entity); + return _snapshot(fence.scope, entity); + }); + } + + void _requireTransitionInterlock() { + if (!_requireInterlock) return; + CloudKitOperationInterlock.requireActiveAny(const { + CloudKitOperationKind.writerTransition, + CloudKitOperationKind.destructiveReset, + }); + } + + void _requireMutationInterlock(CloudKitWriterOwner owner) { + if (!_requireInterlock) return; + CloudKitOperationInterlock.requireActive(switch (owner) { + CloudKitWriterOwner.legacy => CloudKitOperationKind.legacyReadWrite, + CloudKitWriterOwner.v2 => CloudKitOperationKind.v2ReadWrite, + CloudKitWriterOwner.none => throw const CloudKitWriterAuthorityFailure( + 'cloudkit_writer_mutation_owner_invalid', + ), + }); + } + + void _requireSelectedOwner(CloudKitWriterOwner owner) { + if (owner == CloudKitWriterOwner.none || + !_buildDecision.configurationValid || + _buildDecision.owner != owner) { + throw const CloudKitWriterAuthorityFailure( + 'cloudkit_writer_build_owner_mismatch', + ); + } + } + + void _requireEvidence(CloudKitWriterTransitionEvidence evidence) { + if (!evidence.isComplete) { + throw const CloudKitWriterAuthorityFailure( + 'cloudkit_writer_transition_evidence_incomplete', + ); + } + if (_requireInterlock && !evidence._productionMeasured) { + throw const CloudKitWriterAuthorityFailure( + 'cloudkit_writer_transition_evidence_untrusted', + ); + } + } + + void _requireResetRequest( + CloudKitWriterScope writerScope, + CloudSyncResetRebootstrapRequest request, + ) { + if (request.scope.accountFingerprint != writerScope.accountFingerprint || + request.scope.container != writerScope.container || + request.scope.database != writerScope.database) { + throw const CloudKitWriterAuthorityFailure( + 'cloudkit_writer_reset_scope_mismatch', + ); + } + } + + void _requireResetCompletionProof( + CloudKitResetFence fence, + CloudSyncResetCompletionProof proof, + ) { + if (proof.scope != fence.syncScope || + proof.transitionIdHash != fence.transitionIdHash || + proof.activeIdentityFingerprint != fence.scope.accountFingerprint || + proof.previousGeneration != fence.expectedGeneration || + proof.generation != fence.expectedGeneration + 1 || + _digest( + 'cloudkit-reset-proof\u001f${proof.protectedRemoteStateProofReference}', + ) != + fence.proofReferenceHash) { + throw const CloudKitWriterAuthorityFailure( + 'cloudkit_writer_reset_completion_proof_mismatch', + ); + } + } + + CloudKitWriterAuthoritySnapshot _requireStable( + CloudKitWriterScope scope, + CloudKitWriterAuthorityEntity entity, + ) { + final snapshot = _snapshot(scope, entity); + if (snapshot.state != CloudKitWriterAuthorityState.stable || + snapshot.targetOwner != CloudKitWriterOwner.none) { + throw const CloudKitWriterAuthorityFailure( + 'cloudkit_writer_authority_not_stable', + ); + } + return snapshot; + } + + void _requireNoActiveCoordinator( + CloudKitWriterScope scope, { + required DateTime now, + }) { + final nowMs = now.millisecondsSinceEpoch; + final query = _leases + .query( + CloudSyncLeaseEntity_.accountFingerprint.equals( + scope.accountFingerprint, + ), + ) + .build(); + try { + if (query.find().any((lease) => lease.expiresAtMs > nowMs)) { + throw const CloudKitWriterAuthorityFailure( + 'cloudkit_writer_transition_coordinator_active', + ); + } + } finally { + query.close(); + } + } + + void _requireTransitionIdHash(String value) { + if (!RegExp(r'^[a-f0-9]{64}$').hasMatch(value)) { + throw const CloudKitWriterAuthorityFailure( + 'cloudkit_writer_transition_id_invalid', + ); + } + } + + CloudKitWriterAuthorityEntity _require(CloudKitWriterScope scope) { + final entity = _find(scope); + if (entity == null) { + throw const CloudKitWriterAuthorityFailure( + 'cloudkit_writer_authority_missing', + ); + } + return entity; + } + + CloudKitWriterAuthorityEntity? _find(CloudKitWriterScope scope) { + final query = + _authorities + .query( + CloudKitWriterAuthorityEntity_.authorityKey.equals( + _authorityKey(scope), + ), + ) + .build() + ..limit = 2; + try { + final values = query.find(); + if (values.length > 1) { + throw const CloudKitWriterAuthorityFailure( + 'cloudkit_writer_authority_ambiguous', + ); + } + if (values.isEmpty) return null; + final entity = values.single; + if (entity.accountFingerprint != scope.accountFingerprint || + entity.container != scope.container || + entity.database != scope.database) { + throw const CloudKitWriterAuthorityFailure( + 'cloudkit_writer_authority_scope_collision', + ); + } + return entity; + } finally { + query.close(); + } + } + + CloudKitWriterAuthoritySnapshot _snapshot( + CloudKitWriterScope scope, + CloudKitWriterAuthorityEntity entity, + ) { + if (entity.epoch <= 0) { + throw const CloudKitWriterAuthorityFailure( + 'cloudkit_writer_authority_epoch_invalid', + ); + } + final state = _state(entity.state); + final owner = _owner(entity.owner); + final target = _owner(entity.targetOwner); + final transitionIdHash = entity.transitionIdHash; + if (state == CloudKitWriterAuthorityState.migrationPrepared) { + if (owner == CloudKitWriterOwner.none || + target == CloudKitWriterOwner.none || + target == owner || + transitionIdHash == null) { + throw const CloudKitWriterAuthorityFailure( + 'cloudkit_writer_authority_state_invalid', + ); + } + } else if (state == CloudKitWriterAuthorityState.resetPrepared || + state == CloudKitWriterAuthorityState.resetUnknown) { + if (target != CloudKitWriterOwner.none || + transitionIdHash == null || + entity.resetScopeKeyHash == null || + entity.resetProofReferenceHash == null || + entity.resetGeneration <= 0) { + throw const CloudKitWriterAuthorityFailure( + 'cloudkit_writer_authority_state_invalid', + ); + } + } else if (state == CloudKitWriterAuthorityState.mutationUnknown) { + if (owner == CloudKitWriterOwner.none || + target != CloudKitWriterOwner.none || + transitionIdHash != null) { + throw const CloudKitWriterAuthorityFailure( + 'cloudkit_writer_authority_state_invalid', + ); + } + } else if (target != CloudKitWriterOwner.none || transitionIdHash != null) { + throw const CloudKitWriterAuthorityFailure( + 'cloudkit_writer_authority_state_invalid', + ); + } + if (transitionIdHash != null) { + _requireTransitionIdHash(transitionIdHash); + } + if (state != CloudKitWriterAuthorityState.resetPrepared && + state != CloudKitWriterAuthorityState.resetUnknown && + (entity.resetScopeKeyHash != null || + entity.resetProofReferenceHash != null || + entity.resetGeneration != 0)) { + throw const CloudKitWriterAuthorityFailure( + 'cloudkit_writer_authority_state_invalid', + ); + } + return CloudKitWriterAuthoritySnapshot( + scope: scope, + owner: owner, + state: state, + targetOwner: target, + epoch: entity.epoch, + transitionIdHash: transitionIdHash, + ); + } + + CloudKitWriterOwner _owner(int value) { + if (value < 0 || value >= CloudKitWriterOwner.values.length) { + throw const CloudKitWriterAuthorityFailure( + 'cloudkit_writer_authority_owner_invalid', + ); + } + return switch (value) { + 0 => CloudKitWriterOwner.none, + 1 => CloudKitWriterOwner.legacy, + 2 => CloudKitWriterOwner.v2, + _ => throw const CloudKitWriterAuthorityFailure( + 'cloudkit_writer_authority_owner_invalid', + ), + }; + } + + CloudKitWriterAuthorityState _state(int value) { + if (value < 0 || value >= CloudKitWriterAuthorityState.values.length) { + throw const CloudKitWriterAuthorityFailure( + 'cloudkit_writer_authority_state_invalid', + ); + } + return switch (value) { + 0 => CloudKitWriterAuthorityState.stable, + 1 => CloudKitWriterAuthorityState.migrationPrepared, + 2 => CloudKitWriterAuthorityState.resetPrepared, + 3 => CloudKitWriterAuthorityState.resetUnknown, + 4 => CloudKitWriterAuthorityState.mutationUnknown, + _ => throw const CloudKitWriterAuthorityFailure( + 'cloudkit_writer_authority_state_invalid', + ), + }; + } + + int _ownerCode(CloudKitWriterOwner value) => switch (value) { + CloudKitWriterOwner.none => 0, + CloudKitWriterOwner.legacy => 1, + CloudKitWriterOwner.v2 => 2, + }; + + int _stateCode(CloudKitWriterAuthorityState value) => switch (value) { + CloudKitWriterAuthorityState.stable => 0, + CloudKitWriterAuthorityState.migrationPrepared => 1, + CloudKitWriterAuthorityState.resetPrepared => 2, + CloudKitWriterAuthorityState.resetUnknown => 3, + CloudKitWriterAuthorityState.mutationUnknown => 4, + }; + + String _authorityKey(CloudKitWriterScope scope) => sha256 + .convert( + utf8.encode('cloudkit-writer-authority\u001f${scope.storageKey}'), + ) + .toString(); + + String _scopeDigest(CloudSyncScope scope) => sha256 + .convert(utf8.encode('cloudkit-reset-scope\u001f${scope.storageKey}')) + .toString(); + + String _digest(String value) => sha256.convert(utf8.encode(value)).toString(); +} + +typedef CloudKitWriterProvisioningMeasurementsReader = + FutureOr Function( + CloudKitWriterScope scope, + ); +typedef CloudKitWriterLegacyQueueQuarantine = FutureOr Function(); +typedef CloudKitWriterProvisioningClock = DateTime Function(); + +/// Direct, read-only measurements used before changing durable writer owner. +/// +/// Counts are deliberately retained instead of collapsed into caller-supplied +/// booleans. A transition can be authorized only by the production provisioner +/// after it has obtained a complete zero-risk snapshot under the shared writer +/// interlock. +final class CloudKitWriterProvisioningMeasurements { + const CloudKitWriterProvisioningMeasurements({ + required this.objectBoxReady, + required this.legacySyncEnabled, + required this.legacySyncActive, + required this.backgroundSyncActive, + required this.coordinatorLeaseActive, + required this.pendingLegacyDeletionIntents, + required this.legacyPreferenceQueueEntries, + required this.unsyncedLegacyMessages, + required this.unsyncedLegacyChats, + required this.existingV2OutboxOperations, + }); + + final bool objectBoxReady; + final bool legacySyncEnabled; + final bool legacySyncActive; + final bool backgroundSyncActive; + final bool coordinatorLeaseActive; + final int pendingLegacyDeletionIntents; + final int legacyPreferenceQueueEntries; + + /// `ckSyncState == false/null` marks a record as a possible input to the old + /// uploader; it is not itself durable queued work. These counts are retained + /// for migration diagnostics while the V2-only build keeps those rows inert. + final int unsyncedLegacyMessages; + final int unsyncedLegacyChats; + final int existingV2OutboxOperations; + + bool get hasValidCounts => + pendingLegacyDeletionIntents >= 0 && + legacyPreferenceQueueEntries >= 0 && + unsyncedLegacyMessages >= 0 && + unsyncedLegacyChats >= 0 && + existingV2OutboxOperations >= 0; + + bool get operationsQuiesced => + objectBoxReady && + !legacySyncEnabled && + !legacySyncActive && + !backgroundSyncActive && + !coordinatorLeaseActive; + + bool get legacyMutationQueuesEmpty => + pendingLegacyDeletionIntents == 0 && legacyPreferenceQueueEntries == 0; + + bool get safeForTransition => + hasValidCounts && + operationsQuiesced && + legacyMutationQueuesEmpty && + existingV2OutboxOperations == 0; + + /// Once V2 already owns the profile, its durable outbox and newly received + /// local rows are expected. Legacy execution and deletion queues must still + /// remain absent on every permit restoration. + bool get safeForStableV2 => + hasValidCounts && + operationsQuiesced && + pendingLegacyDeletionIntents == 0 && + legacyPreferenceQueueEntries == 0; + + @override + String toString() => 'CloudKitWriterProvisioningMeasurements(redacted)'; +} + +enum CloudKitV2WriterProvisioningDisposition { + provisioned, + migrated, + alreadyOwned, +} + +final class CloudKitV2WriterProvisioningResult { + const CloudKitV2WriterProvisioningResult({ + required this.snapshot, + required this.permit, + required this.disposition, + }); + + final CloudKitWriterAuthoritySnapshot snapshot; + final CloudKitWriterPermit permit; + final CloudKitV2WriterProvisioningDisposition disposition; +} + +/// The sole production entry point for establishing V2 writer ownership. +/// +/// Every probe and identity read occurs while the cross-process writer +/// transition interlock is held. Probe errors, account replacement, non-stable +/// authority state, pending legacy work, and stale permits all fail closed. +final class CloudKitV2WriterProvisioner { + CloudKitV2WriterProvisioner({ + required ObjectBoxCloudKitWriterAuthority authority, + required CloudKitOperationExclusion interlock, + required CloudSyncNativeAuthSnapshotReader readAuthSnapshot, + required CloudKitWriterLegacyQueueQuarantine quarantineLegacyDeletionQueues, + required CloudKitWriterProvisioningMeasurementsReader readMeasurements, + CloudKitWriterProvisioningClock? clock, + }) : _authority = authority, + _interlock = interlock, + _readAuthSnapshot = readAuthSnapshot, + _quarantineLegacyDeletionQueues = quarantineLegacyDeletionQueues, + _readMeasurements = readMeasurements, + _clock = clock ?? DateTime.now; + + final ObjectBoxCloudKitWriterAuthority _authority; + final CloudKitOperationExclusion _interlock; + final CloudSyncNativeAuthSnapshotReader _readAuthSnapshot; + final CloudKitWriterLegacyQueueQuarantine _quarantineLegacyDeletionQueues; + final CloudKitWriterProvisioningMeasurementsReader _readMeasurements; + final CloudKitWriterProvisioningClock _clock; + + Future ensureV2Owned({ + required CloudSyncNativeAuthSnapshot expectedAuth, + }) { + if (!_authority._buildDecision.configurationValid || + _authority._buildDecision.owner != CloudKitWriterOwner.v2) { + throw const CloudKitWriterAuthorityFailure( + 'cloudkit_writer_build_owner_mismatch', + ); + } + final scope = CloudKitWriterScope( + accountFingerprint: expectedAuth.accountFingerprint, + ); + return _interlock.runExclusive( + kind: CloudKitOperationKind.writerTransition, + action: () => _ensureV2OwnedInsideInterlock( + scope: scope, + expectedAuth: expectedAuth, + ), + ); + } + + Future _ensureV2OwnedInsideInterlock({ + required CloudKitWriterScope scope, + required CloudSyncNativeAuthSnapshot expectedAuth, + }) async { + await _requireSameAuth(expectedAuth); + final initial = _authority.initializeDisabled(scope, now: _clock()); + await _quarantineLegacyQueuesFailClosed(); + var measurements = await _readMeasurementsFailClosed(scope); + await _requireSameAuth(expectedAuth); + + if (initial.owner == CloudKitWriterOwner.v2) { + if (initial.state != CloudKitWriterAuthorityState.stable || + initial.targetOwner != CloudKitWriterOwner.none || + !measurements.safeForStableV2) { + throw const CloudKitWriterAuthorityFailure( + 'cloudkit_writer_v2_restore_precondition_failed', + ); + } + return _finish( + scope, + expectedAuth, + disposition: CloudKitV2WriterProvisioningDisposition.alreadyOwned, + ); + } + + if (!measurements.safeForTransition) { + throw const CloudKitWriterAuthorityFailure( + 'cloudkit_writer_transition_precondition_failed', + ); + } + final evidence = _productionEvidence(measurements); + CloudKitV2WriterProvisioningDisposition disposition; + if (initial.owner == CloudKitWriterOwner.none && + initial.state == CloudKitWriterAuthorityState.stable && + initial.targetOwner == CloudKitWriterOwner.none) { + _authority.provisionInitialOwner( + scope, + owner: CloudKitWriterOwner.v2, + expectedEpoch: initial.epoch, + evidence: evidence, + now: _clock(), + ); + disposition = CloudKitV2WriterProvisioningDisposition.provisioned; + } else if (initial.owner == CloudKitWriterOwner.legacy && + initial.state == CloudKitWriterAuthorityState.stable && + initial.targetOwner == CloudKitWriterOwner.none) { + final transitionIdHash = _migrationTransitionId( + scope, + expectedAuth, + initial.epoch, + ); + final prepared = _authority.prepareMigration( + scope, + from: CloudKitWriterOwner.legacy, + to: CloudKitWriterOwner.v2, + expectedEpoch: initial.epoch, + transitionIdHash: transitionIdHash, + evidence: evidence, + now: _clock(), + ); + await _requireSameAuth(expectedAuth); + measurements = await _readMeasurementsFailClosed(scope); + if (!measurements.safeForTransition) { + throw const CloudKitWriterAuthorityFailure( + 'cloudkit_writer_migration_commit_precondition_failed', + ); + } + _authority.commitMigration( + scope, + targetOwner: CloudKitWriterOwner.v2, + expectedEpoch: prepared.epoch, + transitionIdHash: transitionIdHash, + now: _clock(), + ); + disposition = CloudKitV2WriterProvisioningDisposition.migrated; + } else { + throw const CloudKitWriterAuthorityFailure( + 'cloudkit_writer_authority_requires_manual_recovery', + ); + } + + return _finish(scope, expectedAuth, disposition: disposition); + } + + Future _finish( + CloudKitWriterScope scope, + CloudSyncNativeAuthSnapshot expectedAuth, { + required CloudKitV2WriterProvisioningDisposition disposition, + }) async { + await _requireSameAuth(expectedAuth); + final snapshot = _authority.read(scope); + if (snapshot == null || + snapshot.owner != CloudKitWriterOwner.v2 || + snapshot.state != CloudKitWriterAuthorityState.stable || + snapshot.targetOwner != CloudKitWriterOwner.none) { + throw const CloudKitWriterAuthorityFailure( + 'cloudkit_writer_v2_readback_failed', + ); + } + final permit = _authority.issuePermit( + scope, + expectedOwner: CloudKitWriterOwner.v2, + ); + _authority.verifyPermit(permit); + await _requireSameAuth(expectedAuth); + return CloudKitV2WriterProvisioningResult( + snapshot: snapshot, + permit: permit, + disposition: disposition, + ); + } + + Future _quarantineLegacyQueuesFailClosed() async { + try { + await _quarantineLegacyDeletionQueues(); + } catch (_) { + throw const CloudKitWriterAuthorityFailure( + 'cloudkit_writer_legacy_queue_quarantine_failed', + ); + } + } + + Future _readMeasurementsFailClosed( + CloudKitWriterScope scope, + ) async { + try { + final measurements = await _readMeasurements(scope); + if (!measurements.hasValidCounts) { + throw const CloudKitWriterAuthorityFailure( + 'cloudkit_writer_provisioning_measurements_invalid', + ); + } + return measurements; + } on CloudKitWriterAuthorityFailure { + rethrow; + } catch (_) { + throw const CloudKitWriterAuthorityFailure( + 'cloudkit_writer_provisioning_probe_failed', + ); + } + } + + Future _requireSameAuth( + CloudSyncNativeAuthSnapshot expectedAuth, + ) async { + CloudSyncNativeAuthSnapshot? current; + try { + current = await _readAuthSnapshot(); + } catch (_) { + throw const CloudKitWriterAuthorityFailure( + 'cloudkit_writer_identity_revalidation_failed', + ); + } + if (!expectedAuth.sameIdentity(current)) { + throw const CloudKitWriterAuthorityFailure( + 'cloudkit_writer_identity_changed', + ); + } + } + + CloudKitWriterTransitionEvidence _productionEvidence( + CloudKitWriterProvisioningMeasurements measurements, + ) => CloudKitWriterTransitionEvidence._productionMeasured( + operationsQuiesced: measurements.operationsQuiesced, + activeIdentityRevalidated: true, + legacyMutationQueues: measurements.legacyMutationQueuesEmpty + ? LegacyMutationQueueDisposition.empty + : LegacyMutationQueueDisposition.quarantined, + ); + + String _migrationTransitionId( + CloudKitWriterScope scope, + CloudSyncNativeAuthSnapshot auth, + int epoch, + ) => sha256 + .convert( + utf8.encode( + 'cloudkit-v2-writer-migration\u001f${scope.storageKey}\u001f' + '${auth.nativeSessionId}\u001f$epoch\u001f' + '${_clock().microsecondsSinceEpoch}', + ), + ) + .toString(); +} diff --git a/lib/services/rustpush/cloud_sync/cloudkit_writer_mutation_guard.dart b/lib/services/rustpush/cloud_sync/cloudkit_writer_mutation_guard.dart new file mode 100644 index 0000000000..343e2006bd --- /dev/null +++ b/lib/services/rustpush/cloud_sync/cloudkit_writer_mutation_guard.dart @@ -0,0 +1,144 @@ +// ignore_for_file: prefer_initializing_formals + +import 'package:objectbox/objectbox.dart'; + +import 'cloud_sync_production_sampler_adapter.dart'; +import 'cloudkit_operation_interlock.dart'; +import 'cloudkit_writer_authority.dart'; +import 'cloudkit_writer_ownership.dart'; + +typedef ActiveCloudKitClientReader = Object? Function(); + +/// Binds one remote mutation to the active native identity and a durable +/// single-writer permit. +/// +/// This guard must run inside [CloudKitOperationInterlock]. Authority +/// transitions use the same interlock, so a transition cannot overtake a +/// mutation after its permit is issued. The post-action checks turn any +/// impossible identity/epoch race into an unknown outcome instead of allowing +/// the caller to record an unverified success. +final class CloudKitWriterMutationGuard { + CloudKitWriterMutationGuard({ + required Store store, + required ActiveCloudKitClientReader readActiveClient, + required String privateStorageDirectory, + CloudSyncNativeAuthBinding? nativeAuthBinding, + DateTime Function()? clock, + }) : _readActiveClient = readActiveClient, + _privateStorageDirectory = privateStorageDirectory, + _clock = clock ?? DateTime.now, + _nativeAuthBinding = + nativeAuthBinding ?? FrbCloudSyncNativeAuthBinding(), + _authority = ObjectBoxCloudKitWriterAuthority(store: store) { + if (privateStorageDirectory.isEmpty) { + throw ArgumentError.value( + privateStorageDirectory, + 'privateStorageDirectory', + 'must not be empty', + ); + } + } + + CloudKitWriterMutationGuard.forTest({ + required Store store, + required ActiveCloudKitClientReader readActiveClient, + required String privateStorageDirectory, + required CloudKitWriterOwnershipDecision buildDecision, + CloudSyncNativeAuthBinding? nativeAuthBinding, + DateTime Function()? clock, + }) : _readActiveClient = readActiveClient, + _privateStorageDirectory = privateStorageDirectory, + _clock = clock ?? DateTime.now, + _nativeAuthBinding = + nativeAuthBinding ?? FrbCloudSyncNativeAuthBinding(), + _authority = ObjectBoxCloudKitWriterAuthority.forTest( + store: store, + buildDecision: buildDecision, + ) { + if (privateStorageDirectory.isEmpty) { + throw ArgumentError.value( + privateStorageDirectory, + 'privateStorageDirectory', + 'must not be empty', + ); + } + } + + final ActiveCloudKitClientReader _readActiveClient; + final String _privateStorageDirectory; + final CloudSyncNativeAuthBinding _nativeAuthBinding; + final ObjectBoxCloudKitWriterAuthority _authority; + final DateTime Function() _clock; + + Future run({ + required CloudKitWriterOwner owner, + required Future Function() action, + }) async { + CloudKitOperationInterlock.requireActive( + CloudKitOperationKind.legacyReadWrite, + ); + final client = _readActiveClient(); + if (client == null) { + throw const CloudKitWriterAuthorityFailure( + 'cloudkit_writer_active_client_missing', + ); + } + final before = await _capture(client); + if (!identical(client, _readActiveClient())) { + throw const CloudKitWriterAuthorityFailure( + 'cloudkit_writer_identity_changed_before_mutation', + ); + } + final scope = CloudKitWriterScope( + accountFingerprint: before.accountFingerprint, + ); + final permit = _authority.issuePermit(scope, expectedOwner: owner); + + late final T value; + try { + value = await action(); + } catch (_) { + // Once the remote action starts, an exception cannot prove that Apple + // rejected the request. Revoke the durable writer epoch and require + // explicit reconciliation instead of allowing any automatic retry. + try { + _authority.markMutationUnknown(permit, now: _clock()); + } catch (_) { + // A concurrent fence only strengthens the fail-closed result. + } + throw const CloudKitWriterAuthorityFailure( + 'cloudkit_writer_mutation_outcome_unknown', + ); + } + + try { + if (!identical(client, _readActiveClient())) { + throw const CloudKitWriterAuthorityFailure( + 'cloudkit_writer_active_client_replaced', + ); + } + final after = await _capture(client); + if (after.accountFingerprint != before.accountFingerprint || + after.protectedStoreIdentity != before.protectedStoreIdentity) { + throw const CloudKitWriterAuthorityFailure( + 'cloudkit_writer_active_identity_changed', + ); + } + _authority.verifyPermit(permit); + } catch (_) { + // The network action already returned. A failed postcondition cannot + // prove whether CloudKit committed it, so never expose it as a normal + // retryable failure. + throw const CloudKitWriterAuthorityFailure( + 'cloudkit_writer_mutation_outcome_unknown', + ); + } + return value; + } + + Future _capture(Object client) => + _nativeAuthBinding.capture( + cloudMessagesClient: client, + privateStorageDirectory: _privateStorageDirectory, + ); +} diff --git a/lib/services/rustpush/cloud_sync/cloudkit_writer_ownership.dart b/lib/services/rustpush/cloud_sync/cloudkit_writer_ownership.dart new file mode 100644 index 0000000000..692e369181 --- /dev/null +++ b/lib/services/rustpush/cloud_sync/cloudkit_writer_ownership.dart @@ -0,0 +1,63 @@ +/// The only CloudKit implementation permitted to mutate the Messages zones. +enum CloudKitWriterOwner { none, legacy, v2 } + +/// A fail-closed interpretation of the build-time writer selection. +final class CloudKitWriterOwnershipDecision { + const CloudKitWriterOwnershipDecision({ + required this.owner, + required this.configurationValid, + }); + + final CloudKitWriterOwner owner; + final bool configurationValid; + + bool get legacyMutationsEnabled => + configurationValid && owner == CloudKitWriterOwner.legacy; + + bool get v2MutationsEnabled => + configurationValid && owner == CloudKitWriterOwner.v2; + + String get safeStatusCode => configurationValid + ? 'cloudkit_writer_${owner.name}' + : 'cloudkit_writer_configuration_invalid'; + + @override + String toString() => + 'CloudKitWriterOwnershipDecision(status=$safeStatusCode)'; +} + +/// A single build-time selector prevents the legacy and V2 implementations +/// from independently enabling writes in the same application build. +/// +/// Unknown or missing values fail closed to [CloudKitWriterOwner.none]. The +/// raw build value is intentionally never retained in diagnostics. +abstract final class CloudKitWriterOwnership { + static const String _configuredOwner = String.fromEnvironment( + 'OPENBUBBLES_CLOUDKIT_WRITER_OWNER', + defaultValue: 'none', + ); + + static final CloudKitWriterOwnershipDecision decision = resolve( + _configuredOwner, + ); + + static bool get legacyMutationsEnabled => decision.legacyMutationsEnabled; + + static bool get v2MutationsEnabled => decision.v2MutationsEnabled; + + static CloudKitWriterOwnershipDecision resolve(String configuredOwner) { + final owner = switch (configuredOwner) { + 'none' => CloudKitWriterOwner.none, + 'legacy' => CloudKitWriterOwner.legacy, + 'v2' => CloudKitWriterOwner.v2, + _ => CloudKitWriterOwner.none, + }; + return CloudKitWriterOwnershipDecision( + owner: owner, + configurationValid: + configuredOwner == 'none' || + configuredOwner == 'legacy' || + configuredOwner == 'v2', + ); + } +} diff --git a/lib/services/rustpush/cloud_sync/in_memory_cloud_sync_store.dart b/lib/services/rustpush/cloud_sync/in_memory_cloud_sync_store.dart new file mode 100644 index 0000000000..302eb1f636 --- /dev/null +++ b/lib/services/rustpush/cloud_sync/in_memory_cloud_sync_store.dart @@ -0,0 +1,1304 @@ +import 'dart:collection'; + +import 'package:synchronized/synchronized.dart'; + +import 'cloud_operation_identity.dart'; +import 'cloud_shadow_journal_budget.dart'; +import 'cloud_sync_models.dart'; +import 'cloud_sync_store.dart'; + +/// Transactional reference implementation used by unit tests and adapter +/// development. It is not durable across process restarts. +class InMemoryCloudSyncStore + implements CloudSyncStore, CloudSyncUnknownOutcomeLeasingStore { + final Lock _lock = Lock(); + final Map _checkpoints = {}; + final Map> _inbox = {}; + final Map> _seenChangeIds = {}; + final Map> _outbox = {}; + final Map _coordinatorLeases = {}; + final Map _recordMaps = {}; + final List _runs = []; + + List get runs => List.unmodifiable(_runs); + + Future> inboxEntries(CloudSyncScope scope) { + return _lock.synchronized(() async { + return List.unmodifiable( + _inbox[scope.storageKey]?.values ?? const [], + ); + }); + } + + Future> outboxEntries(CloudSyncScope scope) { + return _lock.synchronized(() async { + return List.unmodifiable( + _outbox[scope.storageKey]?.values ?? const [], + ); + }); + } + + @override + Future readCheckpoint(CloudSyncScope scope) { + return _lock.synchronized(() async => _checkpoint(scope)); + } + + @override + Future journalFetchedBatch( + CloudFetchBatch batch, { + required DateTime now, + required CloudCoordinatorLeaseFence leaseFence, + required int expectedGeneration, + required String? expectedFetchedToken, + }) { + return _lock.synchronized(() async { + _requireCommitFenceLocked( + batch.scope, + leaseFence: leaseFence, + expectedGeneration: expectedGeneration, + expectedFetchedToken: expectedFetchedToken, + now: now, + ); + return _journalFetchedBatchLocked(batch, now: now); + }); + } + + @override + Future readShadowJournalUsage( + CloudSyncScope scope, { + required CloudShadowJournalBudget budget, + }) { + budget.validate(); + return _lock.synchronized( + () async => _shadowJournalUsageLocked(scope, budget), + ); + } + + @override + Future journalShadowFetchedBatch( + CloudFetchBatch batch, { + required DateTime now, + required CloudShadowJournalBudget budget, + required CloudCoordinatorLeaseFence leaseFence, + required int expectedGeneration, + required String? expectedFetchedToken, + }) { + budget.validate(); + return _lock.synchronized(() async { + final checkpoint = _requireCommitFenceLocked( + batch.scope, + leaseFence: leaseFence, + expectedGeneration: expectedGeneration, + expectedFetchedToken: expectedFetchedToken, + now: now, + ); + _requireGeneration(batch, checkpoint); + + final current = _shadowJournalUsageLocked(batch.scope, budget); + final currentReason = budget.blockReasonForCurrentUsage( + current, + now: now, + ); + if (currentReason != null) { + return CloudShadowJournalAdmission( + insertedEntries: 0, + rejectedEntries: 0, + usage: current, + blockReason: currentReason, + ); + } + + final seen = _seenChangeIds[batch.scope.storageKey] ?? const {}; + final pageIds = {}; + final unseen = batch.changes + .where( + (change) => + pageIds.add(change.changeId) && !seen.contains(change.changeId), + ) + .toList(growable: false); + final incomingBytes = unseen.fold( + 0, + (total, change) => + total + + budget.estimateEntryBytes( + scope: batch.scope, + batchId: batch.batchId, + change: change, + ), + ); + final projected = current.add( + entries: unseen.length, + bytes: incomingBytes, + oldestAt: unseen.isEmpty ? null : now, + ); + final projectedReason = budget.blockReasonForProjectedUsage( + projected, + now: now, + ); + if (projectedReason != null) { + return CloudShadowJournalAdmission( + insertedEntries: 0, + rejectedEntries: unseen.length, + usage: current, + blockReason: projectedReason, + ); + } + + final inserted = _journalFetchedBatchLocked(batch, now: now); + return CloudShadowJournalAdmission( + insertedEntries: inserted, + rejectedEntries: 0, + usage: projected, + ); + }); + } + + @override + Future recordPullFailure( + CloudSyncScope scope, { + required CloudFailureCategory category, + required DateTime nextEligibleAt, + }) { + return _lock.synchronized(() async { + final checkpoint = _checkpoint(scope); + _checkpoints[scope.storageKey] = checkpoint.copyWith( + consecutivePullFailures: checkpoint.consecutivePullFailures + 1, + nextPullEligibleAt: nextEligibleAt, + lastFailure: category, + ); + }); + } + + @override + Future recordPullSuccess( + CloudSyncScope scope, { + required DateTime now, + }) { + return _lock.synchronized(() async { + _checkpoints[scope.storageKey] = _checkpoint(scope).copyWith( + consecutivePullFailures: 0, + clearNextPullEligibleAt: true, + lastSuccessfulRunAt: now, + clearLastFailure: true, + ); + }); + } + + @override + Future> readEligibleInbox( + CloudSyncScope scope, { + required DateTime now, + required int limit, + }) { + _requirePositiveLimit(limit); + return _lock.synchronized(() async { + // Only the first non-terminal sequence after the contiguous floor is + // eligible. Returning later rows here would let a caller mutate local + // state out of order if the predecessor is deferred or retryable. + final nextSequence = _checkpoint(scope).lastAppliedSequence + 1; + final entry = _inbox[scope.storageKey]?[nextSequence]; + if (entry == null || + entry.status != CloudInboxStatus.pending || + (entry.nextEligibleAt != null && + entry.nextEligibleAt!.isAfter(now))) { + return const []; + } + return [entry]; + }); + } + + @override + Future markInboxApplied( + CloudSyncScope scope, { + required int sequence, + required DateTime now, + required CloudCoordinatorLeaseFence leaseFence, + }) { + return _lock.synchronized(() async { + _requireActiveCoordinatorLeaseLocked(scope, leaseFence, now); + final entry = _requireInboxEntry(scope, sequence); + if (entry.status == CloudInboxStatus.applied) return; + if (entry.status != CloudInboxStatus.pending) { + throw CloudSyncFailure( + category: CloudFailureCategory.localStorage, + safeCode: 'inbox_transition_not_pending', + ); + } + _inbox[scope.storageKey]![sequence] = entry.copyWith( + status: CloudInboxStatus.applied, + completedAt: now, + clearLastFailure: true, + clearNextEligibleAt: true, + ); + _advanceContiguousAppliedPosition(scope); + }); + } + + @override + Future markInboxRetryable( + CloudSyncScope scope, { + required int sequence, + required CloudFailureCategory category, + required DateTime now, + required DateTime nextEligibleAt, + required CloudCoordinatorLeaseFence leaseFence, + }) { + return _lock.synchronized(() async { + _requireActiveCoordinatorLeaseLocked(scope, leaseFence, now); + final entry = _requireInboxEntry(scope, sequence); + if (entry.status != CloudInboxStatus.pending) { + throw CloudSyncFailure( + category: CloudFailureCategory.localStorage, + safeCode: 'inbox_transition_not_pending', + ); + } + if (entry.lastFailure == category && + entry.nextEligibleAt != null && + !entry.nextEligibleAt!.isBefore(nextEligibleAt)) { + return; + } + _inbox[scope.storageKey]![sequence] = entry.copyWith( + status: CloudInboxStatus.pending, + attemptCount: entry.attemptCount + 1, + nextEligibleAt: + entry.nextEligibleAt != null && + entry.nextEligibleAt!.isAfter(nextEligibleAt) + ? entry.nextEligibleAt + : nextEligibleAt, + lastFailure: category, + ); + }); + } + + @override + Future quarantineInbox( + CloudSyncScope scope, { + required int sequence, + required CloudFailureCategory category, + required DateTime now, + required CloudCoordinatorLeaseFence leaseFence, + }) { + return _lock.synchronized(() async { + _requireActiveCoordinatorLeaseLocked(scope, leaseFence, now); + final entry = _requireInboxEntry(scope, sequence); + if (entry.status == CloudInboxStatus.quarantined && + entry.lastFailure == category) { + return; + } + if (entry.status != CloudInboxStatus.pending) { + throw CloudSyncFailure( + category: CloudFailureCategory.localStorage, + safeCode: 'inbox_transition_not_pending', + ); + } + _inbox[scope.storageKey]![sequence] = entry.copyWith( + status: CloudInboxStatus.quarantined, + attemptCount: entry.attemptCount + 1, + lastFailure: category, + completedAt: now, + clearNextEligibleAt: true, + ); + _advanceContiguousAppliedPosition(scope); + }); + } + + @override + Future enqueueOutbox(CloudOutboxOperation operation) { + return _lock.synchronized(() async { + _fenceStaleOutboxLocked(operation.scope, now: operation.createdAt); + _enqueueOutboxLocked(operation); + }); + } + + @override + Future enqueueOutboxMutation(CloudOutboxDraft draft) { + return _lock.synchronized(() async { + final checkpoint = _checkpoint(draft.scope); + _fenceStaleOutboxLocked(draft.scope, now: draft.createdAt); + final revision = checkpoint.mutationRevisionCounter + 1; + _checkpoints[draft.scope.storageKey] = checkpoint.copyWith( + mutationRevisionCounter: revision, + ); + final operation = CloudOutboxOperation( + scope: draft.scope, + operationId: CloudOperationIdentity.forMutation( + scope: draft.scope, + logicalEntityKeyHash: draft.logicalEntityKeyHash, + action: draft.action, + payloadVersion: draft.payloadVersion, + mutationRevision: revision, + payloadSha256: draft.payloadSha256, + ), + logicalEntityKeyHash: draft.logicalEntityKeyHash, + action: draft.action, + payloadVersion: draft.payloadVersion, + mutationRevision: revision, + checkpointGeneration: checkpoint.generation, + encryptedPayloadReference: draft.encryptedPayloadReference, + payloadSha256: draft.payloadSha256, + serverRecordIdHash: draft.serverRecordIdHash, + dependencyOperationIds: draft.dependencyOperationIds, + createdAt: draft.createdAt, + ); + _enqueueOutboxLocked(operation); + return operation; + }); + } + + @override + Future rebootstrapAfterReset( + CloudSyncResetRebootstrapRequest request, { + required DateTime now, + }) { + return _lock.synchronized(() async { + final activeLease = _coordinatorLeases[request.scope.storageKey]; + if (activeLease != null && activeLease.expiresAt.isAfter(now)) { + throw CloudSyncFailure( + category: CloudFailureCategory.localStorage, + safeCode: 'reset_rebootstrap_coordinator_active', + ); + } + final checkpoint = _checkpoint(request.scope); + if (checkpoint.generation != request.expectedGeneration) { + throw CloudSyncFailure( + category: CloudFailureCategory.localStorage, + safeCode: 'reset_rebootstrap_generation_mismatch', + ); + } + final previousGeneration = checkpoint.generation; + final generation = previousGeneration + 1; + _checkpoints[request.scope.storageKey] = checkpoint.copyWith( + generation: generation, + clearFetchedToken: true, + lastBatchId: null, + fetchedSequence: 0, + lastAppliedSequence: 0, + consecutivePullFailures: 0, + clearNextPullEligibleAt: true, + lastSuccessfulRunAt: null, + clearLastFailure: true, + ); + _fenceStaleOutboxLocked( + request.scope, + now: now, + checkpoint: _checkpoints[request.scope.storageKey], + ); + // The in-memory implementation has no durable archive; dropping only + // its test journal is the equivalent of fencing old ObjectBox rows. + _inbox.remove(request.scope.storageKey); + _seenChangeIds.remove(request.scope.storageKey); + return CloudSyncResetCompletionProof( + scope: request.scope, + transitionIdHash: request.transitionIdHash, + activeIdentityFingerprint: request.activeIdentityFingerprint, + previousGeneration: previousGeneration, + generation: generation, + protectedRemoteStateProofReference: + request.protectedRemoteStateProofReference, + ); + }); + } + + @override + Future advanceOutboxGeneration( + CloudSyncScope scope, { + required DateTime now, + }) { + return _lock.synchronized(() async { + final activeLease = _coordinatorLeases[scope.storageKey]; + if (activeLease != null && activeLease.expiresAt.isAfter(now)) { + throw CloudSyncFailure( + category: CloudFailureCategory.localStorage, + safeCode: 'generation_advance_coordinator_active', + ); + } + final checkpoint = _checkpoint(scope); + final advanced = checkpoint.copyWith( + generation: checkpoint.generation + 1, + ); + _checkpoints[scope.storageKey] = advanced; + _fenceStaleOutboxLocked(scope, now: now, checkpoint: advanced); + return advanced; + }); + } + + @override + Future> leaseEligibleOutbox( + CloudSyncScope scope, { + required DateTime now, + required int limit, + required String leaseId, + required Duration leaseDuration, + required Set allowedActions, + }) { + _requirePositiveLimit(limit); + if (leaseId.isEmpty) throw ArgumentError.value(leaseId, 'leaseId'); + return _lock.synchronized(() async { + _fenceStaleOutboxLocked(scope, now: now); + _recoverExpiredOutboxLeasesLocked(scope, now); + final entries = _outbox[scope.storageKey]; + if (entries == null) return const []; + + final blockingByLogicalKey = {}; + for (final operation in entries.values) { + if (!_isBlockingOutboxStatus(operation.status)) continue; + final existing = blockingByLogicalKey[operation.logicalEntityKeyHash]; + if (existing == null || + _compareMutationOrder(operation, existing) < 0) { + blockingByLogicalKey[operation.logicalEntityKeyHash] = operation; + } + } + + final eligible = + entries.values + .where( + (operation) => + operation.status == CloudOutboxStatus.pending && + allowedActions.contains(operation.action) && + (operation.nextEligibleAt == null || + !operation.nextEligibleAt!.isAfter(now)) && + operation.dependencyOperationIds.every((dependencyId) { + final dependency = entries[dependencyId]; + return dependency?.status == + CloudOutboxStatus.confirmed && + dependency?.checkpointGeneration == + operation.checkpointGeneration; + }), + ) + .toList() + ..sort((first, second) { + final created = first.createdAt.compareTo(second.createdAt); + if (created != 0) return created; + return first.operationId.compareTo(second.operationId); + }); + + final leased = []; + for (final operation in eligible) { + if (leased.length == limit) break; + final blocker = blockingByLogicalKey[operation.logicalEntityKeyHash]; + if (blocker != null && _compareMutationOrder(blocker, operation) < 0) { + continue; + } + final updated = operation.copyWith( + status: CloudOutboxStatus.leased, + leaseId: leaseId, + leaseExpiresAt: now.add(leaseDuration), + ); + entries[operation.operationId] = updated; + leased.add(updated); + } + return leased; + }); + } + + @override + Future> leaseUnknownOutcomes( + CloudSyncScope scope, { + required DateTime now, + required int limit, + required String leaseId, + required Duration leaseDuration, + }) { + _requirePositiveLimit(limit); + if (leaseId.isEmpty) throw ArgumentError.value(leaseId, 'leaseId'); + return _lock.synchronized(() async { + _fenceStaleOutboxLocked(scope, now: now); + final checkpoint = _checkpoint(scope); + final entries = _outbox[scope.storageKey]; + if (entries == null) return const []; + + final eligible = + entries.values + .where( + (operation) => + operation.checkpointGeneration == checkpoint.generation && + operation.status == CloudOutboxStatus.unknownOutcome && + operation.appleRequestUuid != null && + operation.appleOperationUuid != null && + (operation.leaseExpiresAt == null || + !operation.leaseExpiresAt!.isAfter(now)) && + (operation.nextEligibleAt == null || + !operation.nextEligibleAt!.isAfter(now)), + ) + .toList() + ..sort((first, second) { + final revision = first.mutationRevision.compareTo( + second.mutationRevision, + ); + if (revision != 0) return revision; + return first.operationId.compareTo(second.operationId); + }); + + final leased = []; + for (final operation in eligible) { + if (leased.length == limit) break; + final updated = operation.copyWith( + status: CloudOutboxStatus.unknownOutcome, + leaseId: leaseId, + leaseExpiresAt: now.add(leaseDuration), + ); + entries[operation.operationId] = updated; + leased.add(updated); + } + return leased; + }); + } + + @override + Future> markOutboxSubmissionStarted( + CloudSyncScope scope, { + required String leaseId, + required CloudOutboxSubmissionIdentity submissionIdentity, + required DateTime now, + }) { + final ids = submissionIdentity.operationUuids.keys.toList(growable: false); + if (ids.isEmpty) { + throw ArgumentError('outbox_submission_operation_ids_empty'); + } + if (leaseId.isEmpty) throw ArgumentError.value(leaseId, 'leaseId'); + return _lock.synchronized(() async { + final checkpoint = _checkpoint(scope); + final entries = _outbox[scope.storageKey]; + final operations = []; + final seen = {}; + for (final operationId in ids) { + if (!seen.add(operationId)) { + throw CloudSyncFailure( + category: CloudFailureCategory.localStorage, + safeCode: 'duplicate_outbox_submission_operation', + ); + } + final operation = entries?[operationId]; + if (operation == null || + operation.checkpointGeneration <= 0 || + operation.checkpointGeneration != checkpoint.generation) { + throw CloudSyncFailure( + category: CloudFailureCategory.localStorage, + safeCode: 'stale_outbox_generation', + ); + } + if (operation.status != CloudOutboxStatus.leased || + operation.leaseId != leaseId || + operation.leaseExpiresAt == null || + !operation.leaseExpiresAt!.isAfter(now)) { + throw CloudSyncFailure( + category: CloudFailureCategory.localStorage, + safeCode: 'stale_outbox_lease', + ); + } + if (operation.appleRequestUuid != null || + operation.appleOperationUuid != null) { + throw CloudSyncFailure( + category: CloudFailureCategory.localStorage, + safeCode: 'outbox_submission_identity_already_assigned', + ); + } + operations.add(operation); + } + final updated = []; + for (final operation in operations) { + final submitted = operation.copyWith( + status: CloudOutboxStatus.unknownOutcome, + lastFailure: CloudFailureCategory.unknown, + appleRequestUuid: submissionIdentity.requestUuid, + appleOperationUuid: + submissionIdentity.operationUuids[operation.operationId], + ); + entries![operation.operationId] = submitted; + updated.add(submitted); + } + return updated; + }); + } + + @override + Future applyOutboxTransitions( + CloudSyncScope scope, { + required String leaseId, + required Iterable transitions, + required DateTime now, + }) { + return _lock.synchronized(() async { + final checkpoint = _checkpoint(scope); + final transitionList = transitions.toList(growable: false); + final entries = _outbox[scope.storageKey]; + if (entries == null && transitionList.isNotEmpty) { + throw CloudSyncFailure( + category: CloudFailureCategory.localStorage, + safeCode: 'outbox_missing', + ); + } + + final transitionIds = {}; + for (final transition in transitionList) { + if (!transitionIds.add(transition.operationId)) { + throw CloudSyncFailure( + category: CloudFailureCategory.localStorage, + safeCode: 'duplicate_outbox_transition', + ); + } + final operation = entries?[transition.operationId]; + if (operation != null && + (operation.checkpointGeneration <= 0 || + operation.checkpointGeneration != checkpoint.generation)) { + throw CloudSyncFailure( + category: CloudFailureCategory.localStorage, + safeCode: 'stale_outbox_generation', + ); + } + if (operation == null || + (operation.status != CloudOutboxStatus.leased && + operation.status != CloudOutboxStatus.unknownOutcome) || + operation.leaseId != leaseId || + operation.leaseExpiresAt == null || + !operation.leaseExpiresAt!.isAfter(now)) { + throw CloudSyncFailure( + category: CloudFailureCategory.localStorage, + safeCode: 'stale_outbox_lease', + ); + } + if (transition.type == CloudOutboxTransitionType.retryable && + (transition.category == null || + transition.nextEligibleAt == null)) { + throw ArgumentError( + 'Retryable outbox transitions require category and next time', + ); + } + if (transition.type == CloudOutboxTransitionType.paused && + transition.category == null) { + throw ArgumentError( + 'Paused outbox transitions require a failure category', + ); + } + if (transition.type == CloudOutboxTransitionType.unknownOutcome && + transition.category != CloudFailureCategory.unknown) { + throw ArgumentError( + 'Unknown outcome transitions require unknown category', + ); + } + } + + for (final transition in transitionList) { + final operation = entries![transition.operationId]!; + switch (transition.type) { + case CloudOutboxTransitionType.confirmed: + entries[operation.operationId] = operation.copyWith( + status: CloudOutboxStatus.confirmed, + confirmedAt: now, + clearLeaseId: true, + clearLeaseExpiresAt: true, + clearLastFailure: true, + clearNextEligibleAt: true, + ); + break; + case CloudOutboxTransitionType.retryable: + entries[operation.operationId] = operation.copyWith( + status: CloudOutboxStatus.pending, + attemptCount: operation.attemptCount + 1, + nextEligibleAt: transition.nextEligibleAt, + lastFailure: transition.category, + encryptedPayloadReference: transition.encryptedPayloadReference, + payloadSha256: transition.payloadSha256, + serverRecordIdHash: transition.serverRecordIdHash, + clearSubmissionIdentity: transition.clearSubmissionIdentity, + clearLeaseId: true, + clearLeaseExpiresAt: true, + ); + break; + case CloudOutboxTransitionType.paused: + entries[operation.operationId] = operation.copyWith( + status: CloudOutboxStatus.paused, + attemptCount: operation.attemptCount + 1, + lastFailure: transition.category, + nextEligibleAt: transition.nextEligibleAt, + clearSubmissionIdentity: transition.clearSubmissionIdentity, + clearLeaseId: true, + clearLeaseExpiresAt: true, + clearNextEligibleAt: transition.nextEligibleAt == null, + ); + break; + case CloudOutboxTransitionType.quarantined: + entries[operation.operationId] = operation.copyWith( + status: CloudOutboxStatus.quarantined, + attemptCount: operation.attemptCount + 1, + lastFailure: transition.category ?? CloudFailureCategory.unknown, + clearLeaseId: true, + clearLeaseExpiresAt: true, + clearNextEligibleAt: true, + ); + break; + case CloudOutboxTransitionType.unknownOutcome: + entries[operation.operationId] = operation.copyWith( + status: CloudOutboxStatus.unknownOutcome, + attemptCount: operation.attemptCount + 1, + lastFailure: CloudFailureCategory.unknown, + nextEligibleAt: transition.nextEligibleAt, + clearLeaseId: true, + clearLeaseExpiresAt: true, + clearNextEligibleAt: transition.nextEligibleAt == null, + ); + break; + } + } + }); + } + + @override + Future recoverExpiredOutboxLeases( + CloudSyncScope scope, { + required DateTime now, + }) { + return _lock.synchronized(() async { + _fenceStaleOutboxLocked(scope, now: now); + return _recoverExpiredOutboxLeasesLocked(scope, now); + }); + } + + @override + Future attachOutboxRecordMapping( + CloudSyncScope scope, { + required String leaseId, + required String operationId, + required String serverRecordIdHash, + required DateTime now, + }) { + return _lock.synchronized(() async { + final checkpoint = _checkpoint(scope); + final operation = _outbox[scope.storageKey]?[operationId]; + if (operation != null && + (operation.checkpointGeneration <= 0 || + operation.checkpointGeneration != checkpoint.generation)) { + throw CloudSyncFailure( + category: CloudFailureCategory.localStorage, + safeCode: 'stale_outbox_generation', + ); + } + if (operation == null || + operation.status != CloudOutboxStatus.leased || + operation.leaseId != leaseId || + operation.leaseExpiresAt == null || + !operation.leaseExpiresAt!.isAfter(now)) { + throw CloudSyncFailure( + category: CloudFailureCategory.localStorage, + safeCode: 'stale_outbox_lease', + ); + } + if (operation.serverRecordIdHash != null && + operation.serverRecordIdHash != serverRecordIdHash) { + throw CloudSyncFailure( + category: CloudFailureCategory.conflict, + safeCode: 'server_mapping_changed', + ); + } + _outbox[scope.storageKey]![operationId] = operation.copyWith( + serverRecordIdHash: serverRecordIdHash, + ); + }); + } + + @override + Future resumePausedOutbox( + CloudSyncScope scope, { + required Set categories, + required DateTime now, + }) { + return _lock.synchronized(() async { + _fenceStaleOutboxLocked(scope, now: now); + final entries = _outbox[scope.storageKey]; + if (entries == null) return 0; + var resumed = 0; + for (final entry in entries.entries.toList()) { + final operation = entry.value; + if (operation.status == CloudOutboxStatus.paused && + operation.lastFailure != null && + categories.contains(operation.lastFailure) && + (operation.nextEligibleAt == null || + !operation.nextEligibleAt!.isAfter(now))) { + entries[entry.key] = operation.copyWith( + status: CloudOutboxStatus.pending, + nextEligibleAt: now, + clearLastFailure: true, + ); + resumed++; + } + } + return resumed; + }); + } + + @override + Future> readPausedOutboxFailureCategories( + CloudSyncScope scope, { + required DateTime now, + }) { + return _lock.synchronized(() async { + final generation = _checkpoint(scope).generation; + final entries = _outbox[scope.storageKey]; + if (entries == null) return {}; + return entries.values + .where( + (operation) => + operation.checkpointGeneration == generation && + operation.status == CloudOutboxStatus.paused && + (operation.nextEligibleAt == null || + !operation.nextEligibleAt!.isAfter(now)), + ) + .map((operation) => operation.lastFailure) + .whereType() + .toSet(); + }); + } + + @override + Future postponeEligiblePausedOutbox( + CloudSyncScope scope, { + required Set categories, + required DateTime now, + required DateTime nextEligibleAt, + }) { + return _lock.synchronized(() async { + _fenceStaleOutboxLocked(scope, now: now); + final entries = _outbox[scope.storageKey]; + if (entries == null) return 0; + var postponed = 0; + for (final entry in entries.entries.toList()) { + final operation = entry.value; + if (operation.status != CloudOutboxStatus.paused || + operation.lastFailure == null || + !categories.contains(operation.lastFailure) || + (operation.nextEligibleAt != null && + operation.nextEligibleAt!.isAfter(now))) { + continue; + } + entries[entry.key] = operation.copyWith(nextEligibleAt: nextEligibleAt); + postponed++; + } + return postponed; + }); + } + + @override + Future tryAcquireCoordinatorLease( + CloudSyncScope scope, { + required String ownerId, + required DateTime now, + required Duration leaseDuration, + }) { + return _lock.synchronized(() async { + final existing = _coordinatorLeases[scope.storageKey]; + if (existing != null && existing.expiresAt.isAfter(now)) { + return null; + } + final generation = (existing?.generation ?? 0) + 1; + _coordinatorLeases[scope.storageKey] = _CoordinatorLease( + ownerId, + generation, + now.add(leaseDuration), + ); + return CloudCoordinatorLeaseFence( + ownerId: ownerId, + generation: generation, + ); + }); + } + + @override + Future renewCoordinatorLease( + CloudSyncScope scope, { + required CloudCoordinatorLeaseFence leaseFence, + required DateTime now, + required Duration leaseDuration, + }) { + return _lock.synchronized(() async { + final existing = _coordinatorLeases[scope.storageKey]; + if (existing == null || + existing.ownerId != leaseFence.ownerId || + existing.generation != leaseFence.generation || + !existing.expiresAt.isAfter(now)) { + return false; + } + _coordinatorLeases[scope.storageKey] = _CoordinatorLease( + leaseFence.ownerId, + existing.generation, + now.add(leaseDuration), + ); + return true; + }); + } + + @override + Future releaseCoordinatorLease( + CloudSyncScope scope, { + required CloudCoordinatorLeaseFence leaseFence, + }) { + return _lock.synchronized(() async { + final existing = _coordinatorLeases[scope.storageKey]; + if (existing?.ownerId == leaseFence.ownerId && + existing?.generation == leaseFence.generation) { + _coordinatorLeases[scope.storageKey] = _CoordinatorLease( + existing!.ownerId, + existing.generation, + DateTime.fromMillisecondsSinceEpoch(0, isUtc: true), + ); + } + }); + } + + @override + Future readRecordMap( + CloudSyncScope scope, { + required String logicalEntityKeyHash, + required int generation, + }) { + return _lock.synchronized(() async { + final checkpoint = _checkpoint(scope); + if (generation <= 0 || generation != checkpoint.generation) { + throw CloudSyncFailure( + category: CloudFailureCategory.localStorage, + safeCode: 'record_map_generation_mismatch', + ); + } + final entry = _recordMaps[_recordMapKey(scope, logicalEntityKeyHash)]; + if (entry == null || entry.generation != generation) return null; + return entry.value; + }); + } + + @override + Future upsertRecordMap( + CloudRecordMapEntry entry, { + required int generation, + }) { + return _lock.synchronized(() async { + final checkpoint = _checkpoint(entry.scope); + if (generation <= 0 || generation != checkpoint.generation) { + throw CloudSyncFailure( + category: CloudFailureCategory.localStorage, + safeCode: 'record_map_generation_mismatch', + ); + } + final key = _recordMapKey(entry.scope, entry.logicalEntityKeyHash); + final existing = _recordMaps[key]; + if (existing != null && + existing.generation == generation && + existing.value.serverRecordIdHash != entry.serverRecordIdHash) { + throw CloudSyncFailure( + category: CloudFailureCategory.conflict, + safeCode: 'server_mapping_changed', + ); + } + _recordMaps[key] = _GenerationBoundRecordMap(generation, entry); + }); + } + + @override + Future recordRun(CloudSyncRunRecord run) { + return _lock.synchronized(() async { + if (_runs.length == 256) _runs.removeAt(0); + _runs.add(run); + }); + } + + int _journalFetchedBatchLocked( + CloudFetchBatch batch, { + required DateTime now, + }) { + final scope = batch.scope; + var checkpoint = _checkpoint(scope); + _requireGeneration(batch, checkpoint); + final entries = _inbox.putIfAbsent( + scope.storageKey, + SplayTreeMap.new, + ); + final seen = _seenChangeIds.putIfAbsent(scope.storageKey, () => {}); + var inserted = 0; + var nextSequence = checkpoint.fetchedSequence + 1; + for (final change in batch.changes) { + if (!seen.add(change.changeId)) continue; + entries[nextSequence] = CloudInboxEntry( + scope: scope, + sequence: nextSequence, + change: change, + status: CloudInboxStatus.pending, + attemptCount: 0, + createdAt: now, + batchId: batch.batchId, + generation: batch.generation, + lastFailure: change.preflightFailure, + ); + nextSequence++; + inserted++; + } + checkpoint = checkpoint.copyWith( + fetchedToken: batch.nextToken, + clearFetchedToken: batch.nextToken == null, + generation: batch.generation, + lastBatchId: batch.batchId, + fetchedSequence: nextSequence - 1, + ); + _checkpoints[scope.storageKey] = checkpoint; + return inserted; + } + + CloudSyncCheckpoint _requireCommitFenceLocked( + CloudSyncScope scope, { + required CloudCoordinatorLeaseFence leaseFence, + required int expectedGeneration, + required String? expectedFetchedToken, + required DateTime now, + }) { + final checkpoint = _checkpoint(scope); + _requireActiveCoordinatorLeaseLocked(scope, leaseFence, now); + if (checkpoint.generation != expectedGeneration || + checkpoint.fetchedToken != expectedFetchedToken) { + throw CloudSyncFailure( + category: CloudFailureCategory.localStorage, + safeCode: 'checkpoint_compare_and_swap_failed', + ); + } + return checkpoint; + } + + void _requireActiveCoordinatorLeaseLocked( + CloudSyncScope scope, + CloudCoordinatorLeaseFence leaseFence, + DateTime now, + ) { + final lease = _coordinatorLeases[scope.storageKey]; + if (lease == null || + lease.ownerId != leaseFence.ownerId || + lease.generation != leaseFence.generation || + !lease.expiresAt.isAfter(now)) { + throw CloudSyncFailure( + category: CloudFailureCategory.localStorage, + safeCode: 'coordinator_lease_fence_lost', + ); + } + } + + CloudShadowJournalUsage _shadowJournalUsageLocked( + CloudSyncScope scope, + CloudShadowJournalBudget budget, + ) { + var usage = CloudShadowJournalUsage.empty; + final entries = + _inbox[scope.storageKey]?.values ?? const []; + for (final entry in entries) { + if (entry.status != CloudInboxStatus.pending) continue; + usage = usage.add( + entries: 1, + bytes: budget.estimateEntryBytes( + scope: scope, + batchId: entry.batchId, + change: entry.change, + ), + oldestAt: entry.createdAt, + ); + } + return usage; + } + + void _requireGeneration( + CloudFetchBatch batch, + CloudSyncCheckpoint checkpoint, + ) { + if (batch.generation != checkpoint.generation) { + throw CloudSyncFailure( + category: CloudFailureCategory.localStorage, + safeCode: 'generation_mismatch', + ); + } + } + + CloudSyncCheckpoint _checkpoint(CloudSyncScope scope) { + return _checkpoints.putIfAbsent( + scope.storageKey, + () => CloudSyncCheckpoint(scope: scope), + ); + } + + CloudInboxEntry _requireInboxEntry(CloudSyncScope scope, int sequence) { + final entry = _inbox[scope.storageKey]?[sequence]; + if (entry == null) { + throw CloudSyncFailure( + category: CloudFailureCategory.localStorage, + safeCode: 'inbox_entry_missing', + ); + } + return entry; + } + + void _advanceContiguousAppliedPosition(CloudSyncScope scope) { + var checkpoint = _checkpoint(scope); + final entries = _inbox[scope.storageKey]; + var next = checkpoint.lastAppliedSequence + 1; + while (_isTerminalInboxStatus(entries?[next]?.status)) { + next++; + } + final appliedThrough = next - 1; + if (appliedThrough != checkpoint.lastAppliedSequence) { + checkpoint = checkpoint.copyWith(lastAppliedSequence: appliedThrough); + _checkpoints[scope.storageKey] = checkpoint; + } + } + + bool _isTerminalInboxStatus(CloudInboxStatus? status) => + status == CloudInboxStatus.applied || + status == CloudInboxStatus.quarantined; + + int _recoverExpiredOutboxLeasesLocked(CloudSyncScope scope, DateTime now) { + final entries = _outbox[scope.storageKey]; + if (entries == null) return 0; + var recovered = 0; + for (final entry in entries.entries.toList()) { + final operation = entry.value; + if (operation.status == CloudOutboxStatus.leased && + operation.leaseExpiresAt != null && + !operation.leaseExpiresAt!.isAfter(now)) { + entries[entry.key] = operation.copyWith( + status: CloudOutboxStatus.pending, + clearLeaseId: true, + clearLeaseExpiresAt: true, + ); + recovered++; + } + } + return recovered; + } + + bool _isBlockingOutboxStatus(CloudOutboxStatus status) => + status == CloudOutboxStatus.pending || + status == CloudOutboxStatus.leased || + status == CloudOutboxStatus.paused || + status == CloudOutboxStatus.unknownOutcome; + + String _recordMapKey(CloudSyncScope scope, String logicalKeyHash) => + '${scope.storageKey}\u001f$logicalKeyHash'; + + void _enqueueOutboxLocked(CloudOutboxOperation operation) { + for (final scopedEntry in _outbox.entries) { + if (scopedEntry.key != operation.scope.storageKey && + scopedEntry.value.containsKey(operation.operationId)) { + throw CloudSyncFailure( + category: CloudFailureCategory.localStorage, + safeCode: 'outbox_operation_scope_collision', + ); + } + } + final checkpoint = _checkpoint(operation.scope); + if (operation.checkpointGeneration != checkpoint.generation) { + throw CloudSyncFailure( + category: CloudFailureCategory.localStorage, + safeCode: 'outbox_generation_mismatch', + ); + } + if (operation.mutationRevision > checkpoint.mutationRevisionCounter) { + _checkpoints[operation.scope.storageKey] = checkpoint.copyWith( + mutationRevisionCounter: operation.mutationRevision, + ); + } + + final entries = _outbox.putIfAbsent( + operation.scope.storageKey, + () => {}, + ); + if (entries.containsKey(operation.operationId)) return; + + if (operation.action == CloudOutboxAction.save) { + final newerOrEqualExists = entries.values.any( + (candidate) => + candidate.status != CloudOutboxStatus.quarantined && + candidate.action == CloudOutboxAction.save && + candidate.logicalEntityKeyHash == operation.logicalEntityKeyHash && + _compareMutationOrder(candidate, operation) >= 0, + ); + if (newerOrEqualExists) return; + + final superseded = entries.values + .where( + (candidate) => + candidate.status == CloudOutboxStatus.pending && + candidate.action == CloudOutboxAction.save && + candidate.logicalEntityKeyHash == + operation.logicalEntityKeyHash && + _compareMutationOrder(candidate, operation) < 0, + ) + .map((candidate) => candidate.operationId) + .toList(); + if (superseded.isNotEmpty) { + for (final entry in entries.entries.toList()) { + final candidate = entry.value; + if (candidate.status != CloudOutboxStatus.pending || + !candidate.dependencyOperationIds.any(superseded.contains)) { + continue; + } + entries[entry.key] = candidate.copyWith( + dependencyOperationIds: { + ...candidate.dependencyOperationIds.where( + (dependency) => !superseded.contains(dependency), + ), + operation.operationId, + }, + ); + } + } + for (final operationId in superseded) { + entries.remove(operationId); + } + } + entries[operation.operationId] = operation; + } + + void _fenceStaleOutboxLocked( + CloudSyncScope scope, { + required DateTime now, + CloudSyncCheckpoint? checkpoint, + }) { + final activeCheckpoint = checkpoint ?? _checkpoint(scope); + final entries = _outbox[scope.storageKey]; + if (entries == null) return; + for (final entry in entries.entries.toList()) { + final operation = entry.value; + if (!_isBlockingOutboxStatus(operation.status) || + operation.checkpointGeneration == activeCheckpoint.generation) { + continue; + } + entries[entry.key] = operation.copyWith( + status: CloudOutboxStatus.quarantined, + attemptCount: operation.attemptCount + 1, + lastFailure: CloudFailureCategory.localStorage, + clearLeaseId: true, + clearLeaseExpiresAt: true, + clearNextEligibleAt: true, + ); + } + } + + int _compareMutationOrder( + CloudOutboxOperation first, + CloudOutboxOperation second, + ) { + return first.mutationRevision.compareTo(second.mutationRevision); + } + + void _requirePositiveLimit(int limit) { + if (limit <= 0 || limit > 256 * 8) { + throw ArgumentError.value(limit, 'limit'); + } + } +} + +class _CoordinatorLease { + const _CoordinatorLease(this.ownerId, this.generation, this.expiresAt); + + final String ownerId; + final int generation; + final DateTime expiresAt; +} + +class _GenerationBoundRecordMap { + const _GenerationBoundRecordMap(this.generation, this.value); + + final int generation; + final CloudRecordMapEntry value; +} diff --git a/lib/services/rustpush/cloud_sync/legacy_cloudkit_deletion_intents.dart b/lib/services/rustpush/cloud_sync/legacy_cloudkit_deletion_intents.dart new file mode 100644 index 0000000000..744c5bace7 --- /dev/null +++ b/lib/services/rustpush/cloud_sync/legacy_cloudkit_deletion_intents.dart @@ -0,0 +1,472 @@ +import 'dart:convert'; + +import 'package:bluebubbles/database/models.dart'; +import 'package:crypto/crypto.dart'; +import 'package:shared_preferences/shared_preferences.dart'; + +import 'cloudkit_writer_authority.dart'; +import 'cloudkit_writer_ownership.dart'; + +enum LegacyCloudKitDeletionKind { message, attachment, chat } + +enum CloudKitDeletionIntentState { pending, quarantined } + +final class LegacyCloudKitDeletionContext { + const LegacyCloudKitDeletionContext({ + required this.scope, + required this.writerEpoch, + }) : assert(writerEpoch > 0); + + final CloudKitWriterScope scope; + final int writerEpoch; +} + +final class LegacyCloudKitDeletionIntent { + const LegacyCloudKitDeletionIntent({ + required this.id, + required this.scope, + required this.writerEpoch, + required this.kind, + required this.recordId, + }); + + final int id; + final CloudKitWriterScope scope; + final int writerEpoch; + final LegacyCloudKitDeletionKind kind; + final String recordId; +} + +final class LegacyCloudKitDeletionIntentFailure implements Exception { + const LegacyCloudKitDeletionIntentFailure(this.safeCode); + + final String safeCode; + + @override + String toString() => 'LegacyCloudKitDeletionIntentFailure($safeCode)'; +} + +/// Durable adapter for the legacy CloudKit delete API. +/// +/// The old implementation stored three account-less StringLists in +/// SharedPreferences. This adapter accepts only a complete scope plus the +/// authority epoch that admitted the delete. It also checks the durable +/// authority again when selecting a remote batch, so an old process cannot +/// send a target after an account switch or writer transition. +final class LegacyCloudKitDeletionIntentStore { + LegacyCloudKitDeletionIntentStore({ + required Store store, + ObjectBoxCloudKitWriterAuthority? authority, + }) : _store = store, + _intents = store.box(), + _quarantines = store.box(), + _authority = authority ?? ObjectBoxCloudKitWriterAuthority(store: store); + + static const legacyMessageKey = 'messageDeletionIds-1'; + static const legacyAttachmentKey = 'attachmentDeletionIds-1'; + static const legacyChatKey = 'chatDeletionIds-1'; + + static const _pendingState = 0; + static const _quarantinedState = 1; + + final Store _store; + final Box _intents; + final Box _quarantines; + final ObjectBoxCloudKitWriterAuthority _authority; + + void enqueue({ + required LegacyCloudKitDeletionContext context, + required LegacyCloudKitDeletionKind kind, + required String recordId, + required DateTime now, + }) { + _validateRecordId(recordId); + final key = _intentKey(context, kind, recordId); + final timestamp = now.millisecondsSinceEpoch; + _store.runInTransaction(TxMode.write, () { + final query = _intents + .query(CloudKitDeletionIntentEntity_.intentKey.equals(key)) + .build(); + try { + final existing = query.findFirst(); + if (existing != null) { + if (existing.accountFingerprint != context.scope.accountFingerprint || + existing.container != context.scope.container || + existing.database != context.scope.database || + existing.writerEpoch != context.writerEpoch || + existing.kind != _kindCode(kind) || + existing.recordId != recordId) { + throw const LegacyCloudKitDeletionIntentFailure( + 'cloudkit_delete_intent_identity_collision', + ); + } + return; + } + } finally { + query.close(); + } + + _intents.put( + CloudKitDeletionIntentEntity( + intentKey: key, + accountFingerprint: context.scope.accountFingerprint, + container: context.scope.container, + database: context.scope.database, + writerEpoch: context.writerEpoch, + kind: _kindCode(kind), + recordId: recordId, + createdAtMs: timestamp, + updatedAtMs: timestamp, + ), + ); + }); + } + + /// Returns only targets authorized by the currently durable legacy writer. + /// A stale requested epoch therefore returns no target, even if a caller + /// still holds an old in-memory context. + List pendingForFlush({ + required CloudKitWriterScope scope, + required int writerEpoch, + required LegacyCloudKitDeletionKind kind, + }) { + if (writerEpoch <= 0) return const []; + final snapshot = _authority.read(scope); + if (snapshot == null || + snapshot.owner != CloudKitWriterOwner.legacy || + snapshot.state != CloudKitWriterAuthorityState.stable || + snapshot.epoch != writerEpoch) { + return const []; + } + + final now = DateTime.now().millisecondsSinceEpoch; + return _store.runInTransaction(TxMode.write, () { + _quarantineStaleRows(scope, writerEpoch, now); + final query = _intents + .query( + CloudKitDeletionIntentEntity_.accountFingerprint.equals( + scope.accountFingerprint, + ) & + CloudKitDeletionIntentEntity_.container.equals( + scope.container, + ) & + CloudKitDeletionIntentEntity_.database.equals(scope.database) & + CloudKitDeletionIntentEntity_.writerEpoch.equals(writerEpoch) & + CloudKitDeletionIntentEntity_.kind.equals(_kindCode(kind)) & + CloudKitDeletionIntentEntity_.state.equals(_pendingState), + ) + .build(); + try { + return query + .find() + .map( + (entity) => LegacyCloudKitDeletionIntent( + id: entity.id, + scope: scope, + writerEpoch: entity.writerEpoch, + kind: _kindFromCode(entity.kind), + recordId: entity.recordId, + ), + ) + .toList(growable: false); + } finally { + query.close(); + } + }); + } + + /// Removes exactly the intents that the corresponding legacy API confirmed. + /// A changed scope or epoch is rejected and leaves every row durable. + void confirmFlushed({ + required LegacyCloudKitDeletionContext context, + required LegacyCloudKitDeletionKind kind, + required List intents, + }) { + if (intents.isEmpty) return; + final snapshot = _authority.read(context.scope); + if (snapshot == null || + snapshot.owner != CloudKitWriterOwner.legacy || + snapshot.state != CloudKitWriterAuthorityState.stable || + snapshot.epoch != context.writerEpoch) { + throw const LegacyCloudKitDeletionIntentFailure( + 'cloudkit_delete_intent_confirmation_scope_stale', + ); + } + + _store.runInTransaction(TxMode.write, () { + for (final intent in intents) { + final entity = _intents.get(intent.id); + if (entity == null || + entity.state != _pendingState || + entity.accountFingerprint != context.scope.accountFingerprint || + entity.container != context.scope.container || + entity.database != context.scope.database || + entity.writerEpoch != context.writerEpoch || + entity.kind != _kindCode(kind) || + entity.recordId != intent.recordId) { + throw const LegacyCloudKitDeletionIntentFailure( + 'cloudkit_delete_intent_confirmation_mismatch', + ); + } + } + for (final intent in intents) { + _intents.remove(intent.id); + } + }); + } + + /// Moves stale rows for one scope out of the sendable state. + int quarantineStale({ + required CloudKitWriterScope scope, + required int currentWriterEpoch, + required DateTime now, + }) { + if (currentWriterEpoch <= 0) return 0; + return _store.runInTransaction(TxMode.write, () { + return _quarantineStaleRows( + scope, + currentWriterEpoch, + now.millisecondsSinceEpoch, + ); + }); + } + + /// Quarantines every pre-V2 preference value before any legacy sync can + /// inspect it. The values are retained as evidence and never become a + /// scoped pending intent. + Future quarantineLegacySharedPreferenceQueues( + SharedPreferences prefs, { + required DateTime now, + }) async { + final entries = <(String, String)>[]; + final presentKeys = []; + for (final sourceKey in const [ + legacyMessageKey, + legacyAttachmentKey, + legacyChatKey, + ]) { + final value = prefs.get(sourceKey); + if (value == null) continue; + presentKeys.add(sourceKey); + if (value is List && value.every((item) => item is String)) { + for (final recordId in value.cast()) { + entries.add((sourceKey, recordId)); + } + } else { + entries.add((sourceKey, '')); + } + } + + if (entries.isEmpty) { + await Future.wait(presentKeys.map((key) => prefs.remove(key))); + return 0; + } + final timestamp = now.millisecondsSinceEpoch; + final inserted = _store.runInTransaction(TxMode.write, () { + var count = 0; + for (final (sourceKey, recordId) in entries) { + final key = _quarantineKey(sourceKey, recordId); + final query = _quarantines + .query(CloudKitDeletionQuarantineEntity_.quarantineKey.equals(key)) + .build(); + try { + if (query.findFirst() != null) continue; + } finally { + query.close(); + } + _quarantines.put( + CloudKitDeletionQuarantineEntity( + quarantineKey: key, + sourceKey: sourceKey, + recordId: recordId, + reason: 'legacy_unscoped_shared_preferences', + createdAtMs: timestamp, + ), + ); + count++; + } + return count; + }); + + // Removal happens only after durable quarantine succeeds. Re-running is + // idempotent because quarantineKey is unique. + await Future.wait(presentKeys.map((key) => prefs.remove(key))); + return inserted; + } + + /// Retains a newly requested delete when no complete active scope exists. + /// This is deliberately not represented as a pending intent. + void quarantineUnscoped({ + required LegacyCloudKitDeletionKind kind, + required String recordId, + required String reason, + required DateTime now, + }) { + _validateRecordId(recordId); + final sourceKey = 'new-${_kindName(kind)}'; + final key = _quarantineKey('$sourceKey:$reason', recordId); + _store.runInTransaction(TxMode.write, () { + final query = _quarantines + .query(CloudKitDeletionQuarantineEntity_.quarantineKey.equals(key)) + .build(); + try { + if (query.findFirst() != null) return; + } finally { + query.close(); + } + _quarantines.put( + CloudKitDeletionQuarantineEntity( + quarantineKey: key, + sourceKey: sourceKey, + recordId: recordId, + reason: reason, + createdAtMs: now.millisecondsSinceEpoch, + ), + ); + }); + } + + int get pendingCount => _countIntentsWithState(_pendingState); + + /// Counts values still present in the three pre-V2 preference queues. + /// Malformed values count as one blocking entry and are never ignored. + int legacySharedPreferenceQueueEntryCount(SharedPreferences prefs) { + var count = 0; + for (final sourceKey in const [ + legacyMessageKey, + legacyAttachmentKey, + legacyChatKey, + ]) { + final value = prefs.get(sourceKey); + if (value == null) continue; + if (value is List && value.every((item) => item is String)) { + count += value.length; + } else { + count++; + } + } + return count; + } + + /// Returns the number of pending deletion intents for exactly one CloudKit + /// scope. This is a read-only inventory probe: it deliberately does not + /// consult writer ownership or epoch, and it does not quarantine or mutate + /// any row. + int pendingCountForScope(CloudKitWriterScope scope) { + final query = _intents + .query( + CloudKitDeletionIntentEntity_.accountFingerprint.equals( + scope.accountFingerprint, + ) & + CloudKitDeletionIntentEntity_.container.equals(scope.container) & + CloudKitDeletionIntentEntity_.database.equals(scope.database) & + CloudKitDeletionIntentEntity_.state.equals(_pendingState), + ) + .build(); + try { + return query.count(); + } finally { + query.close(); + } + } + + int get quarantinedIntentCount => _countIntentsWithState(_quarantinedState); + + int get quarantineEvidenceCount => _quarantines.count(); + + int _countIntentsWithState(int state) { + final query = _intents + .query(CloudKitDeletionIntentEntity_.state.equals(state)) + .build(); + try { + return query.count(); + } finally { + query.close(); + } + } + + int _quarantineStaleRows( + CloudKitWriterScope scope, + int currentWriterEpoch, + int nowMs, + ) { + final query = _intents + .query( + CloudKitDeletionIntentEntity_.accountFingerprint.equals( + scope.accountFingerprint, + ) & + CloudKitDeletionIntentEntity_.container.equals(scope.container) & + CloudKitDeletionIntentEntity_.database.equals(scope.database) & + CloudKitDeletionIntentEntity_.state.equals(_pendingState), + ) + .build(); + try { + final stale = query + .find() + .where((entity) => entity.writerEpoch != currentWriterEpoch) + .toList(growable: false); + for (final entity in stale) { + entity + ..state = _quarantinedState + ..quarantineReason = 'writer_epoch_stale' + ..updatedAtMs = nowMs; + _intents.put(entity); + } + return stale.length; + } finally { + query.close(); + } + } + + static int _kindCode(LegacyCloudKitDeletionKind kind) => switch (kind) { + LegacyCloudKitDeletionKind.message => 0, + LegacyCloudKitDeletionKind.attachment => 1, + LegacyCloudKitDeletionKind.chat => 2, + }; + + static LegacyCloudKitDeletionKind _kindFromCode(int value) => switch (value) { + 0 => LegacyCloudKitDeletionKind.message, + 1 => LegacyCloudKitDeletionKind.attachment, + 2 => LegacyCloudKitDeletionKind.chat, + _ => throw const LegacyCloudKitDeletionIntentFailure( + 'cloudkit_delete_intent_kind_invalid', + ), + }; + + static String _kindName(LegacyCloudKitDeletionKind kind) => kind.name; + + static String _intentKey( + LegacyCloudKitDeletionContext context, + LegacyCloudKitDeletionKind kind, + String recordId, + ) => sha256 + .convert( + utf8.encode( + 'legacy-cloudkit-delete\u001f${context.scope.storageKey}\u001f${context.writerEpoch}\u001f${kind.name}\u001f$recordId', + ), + ) + .toString(); + + static String _quarantineKey(String sourceKey, String recordId) => sha256 + .convert( + utf8.encode( + 'legacy-cloudkit-quarantine\u001f$sourceKey\u001f$recordId', + ), + ) + .toString(); + + static void _validateRecordId(String value) { + if (value.isEmpty || value.length > 1024) { + throw const LegacyCloudKitDeletionIntentFailure( + 'cloudkit_delete_intent_record_id_invalid', + ); + } + for (final codeUnit in value.codeUnits) { + if (codeUnit < 0x20 || (codeUnit >= 0x7f && codeUnit <= 0x9f)) { + throw const LegacyCloudKitDeletionIntentFailure( + 'cloudkit_delete_intent_record_id_invalid', + ); + } + } + } +} diff --git a/lib/services/rustpush/cloud_sync/legacy_cloudkit_page_guard.dart b/lib/services/rustpush/cloud_sync/legacy_cloudkit_page_guard.dart new file mode 100644 index 0000000000..43c4bca4ea --- /dev/null +++ b/lib/services/rustpush/cloud_sync/legacy_cloudkit_page_guard.dart @@ -0,0 +1,36 @@ +import 'dart:convert'; + +/// Validates a legacy CloudKit page before its opaque continuation token is +/// committed. A failed item must keep the old token so the page can be replayed +/// instead of permanently skipping that record. +class LegacyCloudKitPageGuard { + static const int maxPagesPerZone = 10000; + + static String validate({ + required String zone, + required String? previousToken, + required List nextToken, + required int state, + required bool hadItemFailure, + required int page, + }) { + if (page > maxPagesPerZone) { + throw StateError( + 'Stopped $zone CloudKit sync after $maxPagesPerZone pages', + ); + } + if (hadItemFailure) { + throw StateError( + 'Not advancing $zone CloudKit token because at least one item failed', + ); + } + + final encoded = base64Encode(nextToken); + if (state != 3 && encoded == previousToken) { + throw StateError( + 'Stopped $zone CloudKit sync because its token made no progress', + ); + } + return encoded; + } +} diff --git a/lib/services/rustpush/cloud_sync/native_protected_cloud_sync_transport.dart b/lib/services/rustpush/cloud_sync/native_protected_cloud_sync_transport.dart new file mode 100644 index 0000000000..6dca8ded6a --- /dev/null +++ b/lib/services/rustpush/cloud_sync/native_protected_cloud_sync_transport.dart @@ -0,0 +1,1725 @@ +import 'dart:async'; + +import 'package:bluebubbles/src/rust/api/api.dart' as frb_api; +import 'package:bluebubbles/src/rust/frb_generated.dart'; +import 'package:bluebubbles/src/rust/lib.dart' as frb_lib; + +import 'cloud_operation_identity.dart'; +import 'cloud_sync_models.dart'; +import 'cloud_sync_outbound_staging.dart'; +import 'cloud_sync_store.dart'; +import 'cloud_sync_transport.dart'; +import 'cloud_sync_write_transport.dart'; + +const int _maximumChangesPerPage = 200; +const int _maximumProtectedReferencesPerLease = + (_maximumChangesPerPage * 2) + 1; +const int _maximumAdmittedRawPageBytes = 24 * 1024 * 1024; +const int _maximumRecoveryReferences = 4096; +const int _maximumRecoveryResultsPerPass = 64; +const int _maximumLiveProtectedReferences = 131072; +const int _maximumGarbageCollectionResultsPerPass = 64; +const int _maximumProtectedStoreOperationsPerIdentity = 64; +const int _maximumRetryAfterSeconds = 7 * 24 * 60 * 60; + +final RegExp _nativeDigestPattern = RegExp(r'^[A-Za-z0-9_-]{43}$'); +final RegExp _contentDigestPattern = RegExp(r'^[0-9a-f]{64}$'); +final RegExp _protectedReferencePattern = RegExp( + r'^obcs2\.ref\.[A-Za-z0-9_-]{43}$', +); +final RegExp _leaseReferencePattern = RegExp(r'^obcs2\.lease\.[0-9a-f]{32}$'); +final RegExp _outboundOperationIdPattern = RegExp(r'^op1:[0-9a-f]{64}$'); +final RegExp _canonicalAppleUuidPattern = RegExp( + r'^[0-9A-F]{8}-[0-9A-F]{4}-[0-9A-F]{4}-[0-9A-F]{4}-[0-9A-F]{12}$', +); +final RegExp _nativeStoreIdentityPattern = RegExp( + r'^obcs2\.store\.[A-Za-z0-9_-]{43}$', +); + +final class _NativeProtectedStoreOperationFailure implements Exception { + const _NativeProtectedStoreOperationFailure(this.safeCode); + + final String safeCode; +} + +final class _NativeProtectedStoreOperationQueue { + Future tail = Future.value(); + int outstanding = 0; +} + +/// One isolate-local, process-wide gate shared by every protected transport. +/// +/// The platform composition interlock remains responsible for cross-isolate +/// and cross-process exclusion. This gate closes same-isolate overlap between +/// a protected fetch lifecycle and recovery or maintenance. Same-identity +/// nesting is intentionally reentrant so a lifecycle may hold the gate while +/// its transport invokes one or more native bindings. +final class _NativeProtectedStoreOperationGate { + static final Object _heldIdentityZoneKey = Object(); + static final Map _queues = {}; + + bool isHeldByCurrentZone(String identity) => + Zone.current[_heldIdentityZoneKey] == identity; + + Future run(String identity, FutureOr Function() operation) { + final heldIdentity = Zone.current[_heldIdentityZoneKey] as String?; + if (heldIdentity == identity) { + return Future.sync(operation); + } + if (heldIdentity != null) { + return Future.error( + const _NativeProtectedStoreOperationFailure( + 'protected_store_cross_identity_nesting', + ), + ); + } + + final queue = _queues.putIfAbsent( + identity, + _NativeProtectedStoreOperationQueue.new, + ); + if (queue.outstanding >= _maximumProtectedStoreOperationsPerIdentity) { + return Future.error( + const _NativeProtectedStoreOperationFailure( + 'protected_store_operation_queue_bound_exceeded', + ), + ); + } + + final predecessor = queue.tail; + final release = Completer(); + final tail = release.future; + queue + ..tail = tail + ..outstanding += 1; + + return () async { + await predecessor; + try { + return await runZoned>( + () => Future.sync(operation), + zoneValues: {_heldIdentityZoneKey: identity}, + ); + } finally { + queue.outstanding -= 1; + release.complete(); + if (queue.outstanding == 0 && identical(queue.tail, tail)) { + _queues.remove(identity); + } + } + }(); + } +} + +final _NativeProtectedStoreOperationGate _protectedStoreOperationGate = + _NativeProtectedStoreOperationGate(); + +enum NativeProtectedChangeKind { save, delete, quarantined } + +enum NativeProtectedPreflightCode { + unsupportedRecordType, + malformedMetadata, + oversizedRecord, + invalidChangeShape, +} + +enum NativeProtectedFailureCategory { + network, + throttled, + server, + authorization, + pcsUnavailable, + malformedRecord, + conflict, + localStorage, + unknown, +} + +final class NativeProtectedFailure { + const NativeProtectedFailure({ + required this.category, + required this.safeCode, + this.retryAfterSeconds, + }); + + final NativeProtectedFailureCategory category; + final String safeCode; + final int? retryAfterSeconds; +} + +final class NativeProtectedChange { + const NativeProtectedChange({ + required this.changeId, + required this.recordIdHash, + required this.kind, + required this.payloadSha256, + required this.payloadLength, + required this.protectedRecordIdentityReference, + required this.protectedRawEnvelopeReference, + required this.isTombstone, + this.etagHash, + this.serverModifiedAtMillis, + this.preflightCode, + }); + + final String changeId; + final String recordIdHash; + final String? etagHash; + final NativeProtectedChangeKind kind; + final String payloadSha256; + final int payloadLength; + final String protectedRecordIdentityReference; + final String protectedRawEnvelopeReference; + final int? serverModifiedAtMillis; + final NativeProtectedPreflightCode? preflightCode; + final bool isTombstone; +} + +final class NativeProtectedPage { + const NativeProtectedPage({ + required this.changes, + required this.batchId, + required this.generation, + required this.pageLeaseReference, + required this.complete, + required this.admittedRawBytes, + this.protectedNextCheckpointReference, + }); + + final List changes; + final String batchId; + final int generation; + final String pageLeaseReference; + final String? protectedNextCheckpointReference; + final bool complete; + final int admittedRawBytes; +} + +final class NativeProtectedFetchResult { + const NativeProtectedFetchResult({this.page, this.failure}); + + final NativeProtectedPage? page; + final NativeProtectedFailure? failure; +} + +final class NativeProtectedLeaseResult { + const NativeProtectedLeaseResult({this.failure}); + + final NativeProtectedFailure? failure; +} + +final class NativeProtectedRecovery { + const NativeProtectedRecovery({ + required this.finalizedAdoptedLeaseReferences, + required this.absentAdoptedLeaseReferences, + required this.rolledBackCount, + required this.removedTemporaryFilesCount, + required this.hasMore, + }); + + final List finalizedAdoptedLeaseReferences; + final List absentAdoptedLeaseReferences; + final int rolledBackCount; + final int removedTemporaryFilesCount; + final bool hasMore; +} + +final class NativeProtectedRecoveryResult { + const NativeProtectedRecoveryResult({this.recovery, this.failure}); + + final NativeProtectedRecovery? recovery; + final NativeProtectedFailure? failure; +} + +final class NativeProtectedRetirementResult { + const NativeProtectedRetirementResult({ + required this.retiredCount, + this.failure, + }); + + final int retiredCount; + final NativeProtectedFailure? failure; +} + +final class NativeProtectedGarbageCollection { + const NativeProtectedGarbageCollection({ + required this.scannedCount, + required this.firstObservedCount, + required this.deletedCount, + required this.preservedLiveCount, + required this.preservedActiveLeaseCount, + required this.hasMore, + }); + + final int scannedCount; + final int firstObservedCount; + final int deletedCount; + final int preservedLiveCount; + final int preservedActiveLeaseCount; + final bool hasMore; +} + +final class NativeProtectedGarbageCollectionResult { + const NativeProtectedGarbageCollectionResult({this.collection, this.failure}); + + final NativeProtectedGarbageCollection? collection; + final NativeProtectedFailure? failure; +} + +/// Narrow test seam around D0-only generated Flutter Rust Bridge calls. +abstract interface class NativeProtectedCloudSyncBindings { + Future fetchProtectedPage({ + required Object cloudMessagesClient, + required String storageDirectory, + required String expectedAccountFingerprint, + required String stream, + required int generation, + required String? previousCheckpointReference, + required int maximumChanges, + }); + + Future commitProtectedPageLease({ + required String storageDirectory, + required String leaseReference, + required List retainedReferences, + }); + + Future acknowledgeCommittedPageLease({ + required String storageDirectory, + required String leaseReference, + }); + + Future rollbackProtectedPageLease({ + required String storageDirectory, + required String leaseReference, + }); + + Future recoverProtectedPageLeases({ + required String storageDirectory, + required List adoptedLeaseReferences, + required List liveReferences, + required bool liveReferenceEnumerationComplete, + }); + + Future retireProtectedReferences({ + required String storageDirectory, + required List references, + }); + + Future collectProtectedGarbage({ + required String storageDirectory, + required List liveReferences, + required bool liveReferenceEnumerationComplete, + }); +} + +abstract interface class NativeProtectedCloudSyncWriteBindings { + Future stageOutboundMessage({ + required Object cloudMessagesClient, + required String storageDirectory, + required String expectedAccountFingerprint, + required String expectedProtectedStoreIdentity, + required frb_api.CloudMessage message, + }); + + Future prepareMessageCreate({ + required Object cloudMessagesClient, + required String storageDirectory, + required String expectedAccountFingerprint, + required String expectedProtectedStoreIdentity, + required String requestUuid, + required Duration requestTimeout, + required List inputs, + }); + + Future consumePreparedMessageCreate({ + required frb_api.CloudSyncPreparedMessageCreateHandle handle, + }); + + Future reconcileMessageCreate({ + required Object cloudMessagesClient, + required String storageDirectory, + required String expectedAccountFingerprint, + required String expectedProtectedStoreIdentity, + required String requestUuid, + required frb_api.CloudSyncPreparedMessageCreateInput input, + }); +} + +final class _NativeCloudSyncPreparedSubmission + extends CloudSyncPreparedSubmission { + // Named superclass construction keeps the native handle explicit here. + // ignore: use_super_parameters + _NativeCloudSyncPreparedSubmission({ + required CloudSyncScope scope, + required CloudOutboxSubmissionIdentity identity, + required List operations, + required this.handle, + }) : super.fromProtectedPreflight( + scope: scope, + identity: identity, + operations: operations, + ); + + final frb_api.CloudSyncPreparedMessageCreateHandle handle; +} + +/// Default-off Cloud Sync V2 transport whose bridge surface contains +/// only keyed hashes and opaque protected-local references. +/// +/// This class is intentionally absent from production runtime composition. +/// Periodic maintenance scheduling and cross-platform process-kill/endurance +/// testing remain rollout blockers. +final class NativeProtectedCloudSyncTransport + implements + CloudSyncTransport, + CloudProtectedPageLeaseTransport, + CloudSyncOutboundStagingTransport, + CloudSyncWriteTransport, + CloudSyncWriteReceiptFinalizer, + CloudSyncNativeOperationQuiescence { + NativeProtectedCloudSyncTransport({ + required this._cloudMessagesClient, + required String storageDirectory, + required String protectedStoreIdentity, + NativeProtectedCloudSyncBindings? bindings, + this._refreshAuthentication, + this._refreshPcsAccess, + }) : _storageDirectory = storageDirectory, + _protectedStoreIdentity = protectedStoreIdentity, + _bindings = bindings ?? FrbNativeProtectedCloudSyncBindings() { + if (storageDirectory.isEmpty) { + throw ArgumentError.value(storageDirectory, 'storageDirectory'); + } + if (!_nativeStoreIdentityPattern.hasMatch(protectedStoreIdentity)) { + throw ArgumentError('protected_store_identity_invalid'); + } + } + + final Object _cloudMessagesClient; + final String _storageDirectory; + final String _protectedStoreIdentity; + final NativeProtectedCloudSyncBindings _bindings; + final Future Function(CloudSyncScope scope)? _refreshAuthentication; + final Future Function(CloudSyncScope scope)? _refreshPcsAccess; + final Set> _activeNativeOperations = {}; + Future? _nativeQuiescence; + bool _nativeAdmissionClosed = false; + + @override + String get protectedPageLeaseRecoveryIdentity => _protectedStoreIdentity; + + @override + Future runOutboundAdmissionExclusive(Future Function() action) => + runProtectedStoreExclusive(action); + + @override + Future runProtectedStoreExclusive(Future Function() action) => + _runProtectedStoreOperation(action); + + Future _runProtectedStoreOperation(FutureOr Function() operation) { + if (_nativeAdmissionClosed && + !_protectedStoreOperationGate.isHeldByCurrentZone( + _protectedStoreIdentity, + )) { + return Future.error( + _localStorage('protected_store_operation_admission_closed'), + ); + } + final nativeOperation = () async { + try { + return await _protectedStoreOperationGate.run( + _protectedStoreIdentity, + operation, + ); + } on _NativeProtectedStoreOperationFailure catch (failure) { + throw _localStorage(failure.safeCode); + } + }(); + late final Future completion; + completion = nativeOperation + .then((_) {}, onError: (Object _, StackTrace __) {}) + .whenComplete(() { + _activeNativeOperations.remove(completion); + }); + _activeNativeOperations.add(completion); + return nativeOperation; + } + + @override + Future quiesceNativeOperations() { + _nativeAdmissionClosed = true; + return _nativeQuiescence ??= _waitForNativeQuiescence(); + } + + NativeProtectedCloudSyncWriteBindings _requireWriteBindings() { + final bindings = _bindings; + if (bindings is! NativeProtectedCloudSyncWriteBindings) { + throw _readOnlyFailure(); + } + return bindings as NativeProtectedCloudSyncWriteBindings; + } + + @override + Future stageOutboundMessage( + CloudSyncScope scope, { + required frb_api.CloudMessage message, + }) async { + _validateOutboundMessageScope(scope); + final result = await _runProtectedStoreOperation( + () => _requireWriteBindings().stageOutboundMessage( + cloudMessagesClient: _cloudMessagesClient, + storageDirectory: _storageDirectory, + expectedAccountFingerprint: scope.accountFingerprint, + expectedProtectedStoreIdentity: _protectedStoreIdentity, + message: message, + ), + ); + if ((result.stage == null) == (result.failure == null)) { + throw _localStorage('cloud_sync_outbound_stage_envelope_invalid'); + } + if (result.failure case final failure?) { + throw _mapOutboundFailure(failure); + } + final stage = result.stage!; + if (!_nativeDigestPattern.hasMatch(stage.logicalEntityKeyHash) || + !_protectedReferencePattern.hasMatch(stage.protectedPayloadReference) || + stage.protectedPayloadReference != + stage.protectedServerRecordReference || + !_contentDigestPattern.hasMatch(stage.payloadSha256) || + !_nativeDigestPattern.hasMatch(stage.serverRecordIdHash) || + !_leaseReferencePattern.hasMatch(stage.leaseReference) || + stage.payloadLength <= BigInt.zero || + stage.payloadLength > BigInt.from(_maximumAdmittedRawPageBytes)) { + throw _localStorage('cloud_sync_outbound_stage_invalid'); + } + return CloudSyncProtectedOutboundStageData( + logicalEntityKeyHash: stage.logicalEntityKeyHash, + protectedEnvelopeReference: stage.protectedPayloadReference, + payloadSha256: stage.payloadSha256, + serverRecordIdHash: stage.serverRecordIdHash, + leaseReference: stage.leaseReference, + ); + } + + @override + Future commitOutboundLease( + String leaseReference, + String protectedEnvelopeReference, + ) => commitProtectedPageLease(leaseReference, {protectedEnvelopeReference}); + + @override + Future rollbackOutboundLease(String leaseReference) => + rollbackProtectedPageLease(leaseReference); + + @override + Future prepareSubmission( + CloudSyncScope scope, { + required CloudOutboxSubmissionIdentity submissionIdentity, + required List operations, + }) async { + _validateOutboundMessageScope(scope); + if (operations.isEmpty || + operations.length > _maximumChangesPerPage || + operations.any( + (operation) => + operation.action != CloudOutboxAction.save || + !_isInitialCreateOperationIdentity( + scope, + operationId: operation.operationId, + logicalEntityKeyHash: operation.logicalEntityKeyHash, + payloadVersion: 1, + ) || + operation.protectedPayloadReference == null || + operation.payloadSha256 == null || + operation.protectedPayloadReference != + operation.protectedServerRecordIdReference, + )) { + throw CloudSyncFailure( + category: CloudFailureCategory.cancelled, + safeCode: 'cloud_sync_outbound_create_only', + ); + } + submissionIdentity.validateOperationIds( + operations.map((operation) => operation.operationId), + ); + final result = await _runProtectedStoreOperation( + () => _requireWriteBindings().prepareMessageCreate( + cloudMessagesClient: _cloudMessagesClient, + storageDirectory: _storageDirectory, + expectedAccountFingerprint: scope.accountFingerprint, + expectedProtectedStoreIdentity: _protectedStoreIdentity, + requestUuid: submissionIdentity.requestUuid, + requestTimeout: const Duration(seconds: 45), + inputs: operations + .map( + (operation) => frb_api.CloudSyncPreparedMessageCreateInput( + localOperationId: operation.operationId, + logicalEntityKeyHash: operation.logicalEntityKeyHash, + protectedLeaseReference: operation.protectedLeaseReference!, + protectedPayloadReference: operation.protectedPayloadReference!, + payloadSha256: operation.payloadSha256!, + protectedServerRecordReference: + operation.protectedServerRecordIdReference, + serverRecordIdHash: operation.serverRecordIdHash, + appleOperationUuid: + submissionIdentity.operationUuids[operation.operationId]!, + ), + ) + .toList(growable: false), + ), + ); + if ((result.handle == null) == (result.failure == null)) { + throw CloudSyncFailure( + category: CloudFailureCategory.localStorage, + safeCode: 'cloud_sync_outbound_prepare_envelope_invalid', + ); + } + if (result.failure case final failure?) { + throw _mapOutboundFailure(failure); + } + return _NativeCloudSyncPreparedSubmission( + scope: scope, + identity: submissionIdentity, + operations: operations, + handle: result.handle!, + ); + } + + @override + Future consumePreparedSubmission( + CloudSyncScope scope, { + required CloudSyncPreparedSubmission preparedSubmission, + required CloudOutboxSubmissionIdentity persistedIdentity, + required List protectedOperations, + required List operations, + }) async { + _validateOutboundMessageScope(scope); + if (preparedSubmission is! _NativeCloudSyncPreparedSubmission) { + throw ArgumentError('cloud_sync_native_prepared_submission_required'); + } + preparedSubmission.claimForConsumption( + scope, + persistedIdentity: persistedIdentity, + protectedOperations: protectedOperations, + ); + final result = await _runProtectedStoreOperation( + () => _requireWriteBindings().consumePreparedMessageCreate( + handle: preparedSubmission.handle, + ), + ); + if (result.failure case final failure?) { + throw _mapOutboundFailure(failure); + } + if (result.outcomes.length != operations.length) { + throw CloudSyncFailure( + category: CloudFailureCategory.unknown, + safeCode: 'cloud_sync_outbound_correlation_mismatch', + ); + } + final outcomes = []; + final seen = {}; + for (final outcome in result.outcomes) { + if (!seen.add(outcome.localOperationId) || + persistedIdentity.operationUuids[outcome.localOperationId] != + outcome.appleOperationUuid) { + throw CloudSyncFailure( + category: CloudFailureCategory.unknown, + safeCode: 'cloud_sync_outbound_correlation_mismatch', + ); + } + outcomes.add(_mapOutboundOutcome(outcome)); + } + return CloudPushBatchResult(outcomes: outcomes); + } + + CloudSyncFailure _mapOutboundFailure( + frb_api.CloudSyncOutboundSafeCode failure, + ) { + final category = switch (failure) { + frb_api.CloudSyncOutboundSafeCode.invalidScope || + frb_api.CloudSyncOutboundSafeCode.nativeAuthUnavailable => + CloudFailureCategory.authorization, + frb_api.CloudSyncOutboundSafeCode.protectedStorage => + CloudFailureCategory.localStorage, + frb_api.CloudSyncOutboundSafeCode.nativePrepareFailed => + CloudFailureCategory.server, + frb_api.CloudSyncOutboundSafeCode.alreadyConsumed || + frb_api.CloudSyncOutboundSafeCode.correlationMismatch => + CloudFailureCategory.unknown, + _ => CloudFailureCategory.cancelled, + }; + return CloudSyncFailure( + category: category, + safeCode: 'cloud_sync_outbound_${failure.name}', + ); + } + + CloudPushOutcome _mapOutboundOutcome( + frb_api.CloudSyncOutboundSaveOutcome outcome, + ) { + final retryAfter = _boundedRetryAfter(outcome.retryAfterSeconds); + return switch (outcome.disposition) { + frb_api.CloudSyncOutboundSaveDisposition.succeeded => CloudPushOutcome( + operationId: outcome.localOperationId, + disposition: CloudPushDisposition.confirmed, + ), + frb_api.CloudSyncOutboundSaveDisposition.unknownOutcome => + CloudPushOutcome( + operationId: outcome.localOperationId, + disposition: CloudPushDisposition.unknownOutcome, + failureCategory: CloudFailureCategory.unknown, + retryAfter: retryAfter, + ), + frb_api.CloudSyncOutboundSaveDisposition.failed => + _mapProvenFailedOutboundOutcome(outcome, retryAfter), + }; + } + + Duration? _boundedRetryAfter(BigInt? seconds) { + if (seconds == null) return null; + if (seconds < BigInt.zero) { + throw _localStorage('cloud_sync_outbound_retry_after_invalid'); + } + final maximum = BigInt.from(_maximumRetryAfterSeconds); + final bounded = seconds > maximum ? maximum : seconds; + return Duration(seconds: bounded.toInt()); + } + + CloudPushOutcome _mapProvenFailedOutboundOutcome( + frb_api.CloudSyncOutboundSaveOutcome outcome, + Duration? retryAfter, + ) { + final operationId = outcome.localOperationId; + return switch (outcome.failureClass) { + frb_api.CloudSyncOutboundFailureClass.throttled => CloudPushOutcome( + operationId: operationId, + disposition: CloudPushDisposition.retryable, + failureCategory: CloudFailureCategory.throttled, + retryAfter: retryAfter, + ), + frb_api.CloudSyncOutboundFailureClass.transientServer => CloudPushOutcome( + operationId: operationId, + disposition: CloudPushDisposition.retryable, + failureCategory: CloudFailureCategory.server, + retryAfter: retryAfter, + ), + frb_api.CloudSyncOutboundFailureClass.authentication => CloudPushOutcome( + operationId: operationId, + disposition: CloudPushDisposition.unauthorized, + failureCategory: CloudFailureCategory.authorization, + ), + frb_api.CloudSyncOutboundFailureClass.conflict => CloudPushOutcome( + operationId: operationId, + disposition: CloudPushDisposition.serverRecordChanged, + failureCategory: CloudFailureCategory.conflict, + ), + frb_api.CloudSyncOutboundFailureClass.resetRequired => CloudPushOutcome( + operationId: operationId, + disposition: CloudPushDisposition.pcsUnavailable, + failureCategory: CloudFailureCategory.pcsUnavailable, + ), + _ => CloudPushOutcome( + operationId: operationId, + disposition: CloudPushDisposition.unknownOutcome, + failureCategory: CloudFailureCategory.unknown, + ), + }; + } + + @override + Future acknowledgeDurableTerminalOperations( + CloudSyncScope scope, { + required List operations, + required List transitions, + }) async { + final operationsById = {}; + for (final operation in operations) { + if (operation.scope != scope || + operationsById.containsKey(operation.operationId)) { + throw _localStorage('cloud_sync_outbound_receipt_scope_invalid'); + } + operationsById[operation.operationId] = operation; + } + final seenTransitionIds = {}; + for (final transition in transitions) { + if (!seenTransitionIds.add(transition.operationId) || + !operationsById.containsKey(transition.operationId)) { + throw _localStorage('cloud_sync_outbound_receipt_transition_invalid'); + } + } + final terminalIds = transitions + .where( + (transition) => + transition.type == CloudOutboxTransitionType.confirmed || + transition.type == CloudOutboxTransitionType.quarantined, + ) + .map((transition) => transition.operationId) + .toSet(); + final leases = operations + .where((operation) => terminalIds.contains(operation.operationId)) + .map((operation) => operation.protectedLeaseReference) + .whereType() + .toSet(); + for (final lease in leases) { + _validateLeaseReference(lease); + final result = await _runProtectedStoreOperation( + () => _bindings.acknowledgeCommittedPageLease( + storageDirectory: _storageDirectory, + leaseReference: lease, + ), + ); + if (result.failure != null) { + throw _mapFailure(result.failure!); + } + } + } + + Future _waitForNativeQuiescence() async { + while (_activeNativeOperations.isNotEmpty) { + await Future.wait(_activeNativeOperations.toList(growable: false)); + } + } + + @override + Future fetchChanges( + CloudSyncScope scope, { + required String? previousToken, + required int generation, + required int limit, + }) async { + final stream = _validateScopeAndStream(scope); + if (generation <= 0) { + throw _malformed('invalid_generation'); + } + if (previousToken != null && + !_protectedReferencePattern.hasMatch(previousToken)) { + throw _localStorage('invalid_checkpoint_reference'); + } + if (limit <= 0) { + throw _malformed('invalid_fetch_limit'); + } + final maximumChanges = limit.clamp(1, _maximumChangesPerPage); + final result = await _runProtectedStoreOperation( + () => _bindings.fetchProtectedPage( + cloudMessagesClient: _cloudMessagesClient, + storageDirectory: _storageDirectory, + expectedAccountFingerprint: scope.accountFingerprint, + stream: stream, + generation: generation, + previousCheckpointReference: previousToken, + maximumChanges: maximumChanges, + ), + ); + final page = result.page; + final failure = result.failure; + if ((page == null) == (failure == null)) { + throw _malformed('invalid_protected_fetch_envelope'); + } + if (failure != null) throw _mapFailure(failure); + return _mapPage(scope, page!, generation, maximumChanges); + } + + CloudFetchBatch _mapPage( + CloudSyncScope scope, + NativeProtectedPage page, + int expectedGeneration, + int maximumChanges, + ) { + if (page.generation != expectedGeneration || + page.changes.length > maximumChanges || + page.changes.length > _maximumChangesPerPage || + page.admittedRawBytes < 0 || + page.admittedRawBytes > _maximumAdmittedRawPageBytes || + !_nativeDigestPattern.hasMatch(page.batchId) || + !_leaseReferencePattern.hasMatch(page.pageLeaseReference) || + (page.protectedNextCheckpointReference != null && + !_protectedReferencePattern.hasMatch( + page.protectedNextCheckpointReference!, + )) || + (!page.complete && page.protectedNextCheckpointReference == null)) { + throw _malformed('invalid_protected_page'); + } + final changes = page.changes.map(_mapChange).toList(growable: false); + return CloudFetchBatch( + scope: scope, + changes: changes, + batchId: page.batchId, + generation: page.generation, + nextToken: page.protectedNextCheckpointReference, + hasMore: !page.complete, + protectedPageLeaseReference: page.pageLeaseReference, + ); + } + + CloudFetchedChange _mapChange(NativeProtectedChange change) { + final preflight = change.preflightCode; + final validKind = switch (change.kind) { + NativeProtectedChangeKind.save => + !change.isTombstone && preflight == null, + NativeProtectedChangeKind.delete => + change.isTombstone && preflight == null, + NativeProtectedChangeKind.quarantined => preflight != null, + }; + if (!validKind || + !_nativeDigestPattern.hasMatch(change.changeId) || + !_nativeDigestPattern.hasMatch(change.recordIdHash) || + (change.etagHash != null && + !_nativeDigestPattern.hasMatch(change.etagHash!)) || + !_contentDigestPattern.hasMatch(change.payloadSha256) || + change.payloadLength < 0 || + change.payloadLength > _maximumAdmittedRawPageBytes || + !_protectedReferencePattern.hasMatch( + change.protectedRecordIdentityReference, + ) || + !_protectedReferencePattern.hasMatch( + change.protectedRawEnvelopeReference, + )) { + throw _malformed('invalid_protected_change'); + } + DateTime? modifiedAt; + final modifiedMillis = change.serverModifiedAtMillis; + if (modifiedMillis != null) { + try { + modifiedAt = DateTime.fromMillisecondsSinceEpoch( + modifiedMillis, + isUtc: true, + ); + } on RangeError { + throw _malformed('invalid_server_modified_time'); + } + } + return CloudFetchedChange( + changeId: change.changeId, + recordIdHash: change.recordIdHash, + etagHash: change.etagHash, + type: change.isTombstone ? CloudChangeType.delete : CloudChangeType.save, + encryptedServerRecordId: change.protectedRecordIdentityReference, + encryptedPayloadReference: change.protectedRawEnvelopeReference, + payloadSha256: change.payloadSha256, + isTombstone: change.isTombstone, + serverModifiedAt: modifiedAt, + preflightFailure: preflight == null + ? null + : CloudFailureCategory.malformedRecord, + ); + } + + @override + Future recoverProtectedPageLeases( + Set adoptedLeaseReferences, + CloudProtectedReferenceSnapshot liveReferences, + ) async { + if (adoptedLeaseReferences.length > _maximumRecoveryReferences || + adoptedLeaseReferences.any( + (reference) => !_leaseReferencePattern.hasMatch(reference), + )) { + throw _localStorage('invalid_adopted_lease_set'); + } + _validateLiveReferenceSnapshot(liveReferences); + final sorted = adoptedLeaseReferences.toList()..sort(); + final sortedLive = liveReferences.references.toList()..sort(); + final result = await _runProtectedStoreOperation( + () => _bindings.recoverProtectedPageLeases( + storageDirectory: _storageDirectory, + adoptedLeaseReferences: sorted, + liveReferences: sortedLive, + liveReferenceEnumerationComplete: liveReferences.isComplete, + ), + ); + final recovery = result.recovery; + final failure = result.failure; + if ((recovery == null) == (failure == null)) { + throw _localStorage('invalid_lease_recovery_envelope'); + } + if (failure != null) throw _mapFailure(failure); + final finalized = recovery!.finalizedAdoptedLeaseReferences.toSet(); + final absent = recovery.absentAdoptedLeaseReferences.toSet(); + if (finalized.length != recovery.finalizedAdoptedLeaseReferences.length || + absent.length != recovery.absentAdoptedLeaseReferences.length || + finalized.length > _maximumRecoveryResultsPerPass || + absent.length > _maximumRecoveryReferences || + recovery.rolledBackCount < 0 || + recovery.rolledBackCount > _maximumRecoveryResultsPerPass || + recovery.removedTemporaryFilesCount < 0 || + recovery.removedTemporaryFilesCount > _maximumRecoveryResultsPerPass || + finalized.any( + (reference) => !adoptedLeaseReferences.contains(reference), + ) || + absent.any( + (reference) => !adoptedLeaseReferences.contains(reference), + ) || + finalized.intersection(absent).isNotEmpty || + (recovery.hasMore && absent.isNotEmpty)) { + throw _localStorage('invalid_lease_recovery_result'); + } + return CloudProtectedPageLeaseRecoveryResult( + finalizedAdoptedLeaseReferences: finalized, + absentAdoptedLeaseReferences: absent, + rolledBackCount: recovery.rolledBackCount, + removedTemporaryFilesCount: recovery.removedTemporaryFilesCount, + hasMore: recovery.hasMore, + ); + } + + @override + Future commitProtectedPageLease( + String leaseReference, + Set retainedReferences, + ) async { + _validateLeaseReference(leaseReference); + _validateProtectedReferences( + retainedReferences, + maximumCount: _maximumProtectedReferencesPerLease, + ); + final sorted = retainedReferences.toList()..sort(); + final result = await _runProtectedStoreOperation( + () => _bindings.commitProtectedPageLease( + storageDirectory: _storageDirectory, + leaseReference: leaseReference, + retainedReferences: sorted, + ), + ); + final failure = result.failure; + if (failure != null) throw _mapFailure(failure); + } + + @override + Future acknowledgeCommittedPageLease(String leaseReference) async { + _validateLeaseReference(leaseReference); + final result = await _runProtectedStoreOperation( + () => _bindings.acknowledgeCommittedPageLease( + storageDirectory: _storageDirectory, + leaseReference: leaseReference, + ), + ); + final failure = result.failure; + if (failure != null) throw _mapFailure(failure); + } + + @override + Future rollbackProtectedPageLease(String leaseReference) async { + _validateLeaseReference(leaseReference); + final result = await _runProtectedStoreOperation( + () => _bindings.rollbackProtectedPageLease( + storageDirectory: _storageDirectory, + leaseReference: leaseReference, + ), + ); + final failure = result.failure; + if (failure != null) throw _mapFailure(failure); + } + + @override + Future retireProtectedReferences(Set references) async { + _validateProtectedReferences( + references, + maximumCount: _maximumGarbageCollectionResultsPerPass, + ); + if (references.isEmpty) return 0; + final sorted = references.toList()..sort(); + final result = await _runProtectedStoreOperation( + () => _bindings.retireProtectedReferences( + storageDirectory: _storageDirectory, + references: sorted, + ), + ); + final failure = result.failure; + if (failure != null) throw _mapFailure(failure); + if (result.retiredCount < 0 || result.retiredCount > references.length) { + throw _localStorage('invalid_retirement_result'); + } + return result.retiredCount; + } + + @override + Future collectProtectedGarbage( + CloudProtectedReferenceSnapshot liveReferences, + ) async { + _validateLiveReferenceSnapshot(liveReferences); + final sorted = liveReferences.references.toList()..sort(); + final result = await _runProtectedStoreOperation( + () => _bindings.collectProtectedGarbage( + storageDirectory: _storageDirectory, + liveReferences: sorted, + liveReferenceEnumerationComplete: liveReferences.isComplete, + ), + ); + final collection = result.collection; + final failure = result.failure; + if ((collection == null) == (failure == null)) { + throw _localStorage('invalid_garbage_collection_envelope'); + } + if (failure != null) throw _mapFailure(failure); + final value = collection!; + final counts = [ + value.scannedCount, + value.firstObservedCount, + value.deletedCount, + value.preservedLiveCount, + value.preservedActiveLeaseCount, + ]; + if (counts.any( + (count) => + count < 0 || count > _maximumGarbageCollectionResultsPerPass, + ) || + value.firstObservedCount > value.scannedCount || + value.deletedCount > value.scannedCount || + value.preservedLiveCount > value.scannedCount || + value.preservedActiveLeaseCount > value.scannedCount || + value.firstObservedCount + + value.deletedCount + + value.preservedLiveCount + + value.preservedActiveLeaseCount > + value.scannedCount) { + throw _localStorage('invalid_garbage_collection_result'); + } + return CloudProtectedGarbageCollectionResult( + scannedCount: value.scannedCount, + firstObservedCount: value.firstObservedCount, + deletedCount: value.deletedCount, + preservedLiveCount: value.preservedLiveCount, + preservedActiveLeaseCount: value.preservedActiveLeaseCount, + hasMore: value.hasMore, + ); + } + + void _validateLeaseReference(String reference) { + if (!_leaseReferencePattern.hasMatch(reference)) { + throw _localStorage('invalid_lease_reference'); + } + } + + void _validateLiveReferenceSnapshot( + CloudProtectedReferenceSnapshot snapshot, + ) { + if (!snapshot.isComplete) { + throw _localStorage('protected_reference_enumeration_incomplete'); + } + _validateProtectedReferences(snapshot.references); + } + + void _validateProtectedReferences( + Set references, { + int maximumCount = _maximumLiveProtectedReferences, + }) { + if (references.length > maximumCount || + references.any( + (reference) => !_protectedReferencePattern.hasMatch(reference), + )) { + throw _localStorage('invalid_protected_reference_set'); + } + } + + void _validateOutboundMessageScope(CloudSyncScope scope) { + if (_validateScopeAndStream(scope) != 'messages') { + throw CloudSyncFailure( + category: CloudFailureCategory.cancelled, + safeCode: 'unsupported_protected_outbound_scope', + ); + } + } + + bool _isInitialCreateOperationIdentity( + CloudSyncScope scope, { + required String operationId, + required String logicalEntityKeyHash, + required int payloadVersion, + }) { + if (!_outboundOperationIdPattern.hasMatch(operationId) || + !_nativeDigestPattern.hasMatch(logicalEntityKeyHash)) { + return false; + } + return operationId == + CloudOperationIdentity.forInitialCreate( + scope: scope, + logicalEntityKeyHash: logicalEntityKeyHash, + payloadVersion: payloadVersion, + ); + } + + CloudFailureCategory _mapOutboundFailureClass( + frb_api.CloudSyncOutboundFailureClass? failure, + ) => switch (failure) { + frb_api.CloudSyncOutboundFailureClass.throttled => + CloudFailureCategory.throttled, + frb_api.CloudSyncOutboundFailureClass.transientServer => + CloudFailureCategory.server, + frb_api.CloudSyncOutboundFailureClass.authentication => + CloudFailureCategory.authorization, + frb_api.CloudSyncOutboundFailureClass.conflict => + CloudFailureCategory.conflict, + frb_api.CloudSyncOutboundFailureClass.resetRequired => + CloudFailureCategory.pcsUnavailable, + frb_api.CloudSyncOutboundFailureClass.permanent || + frb_api.CloudSyncOutboundFailureClass.unknown || + null => CloudFailureCategory.unknown, + }; + + String _validateScopeAndStream(CloudSyncScope scope) { + if (!_nativeDigestPattern.hasMatch(scope.accountFingerprint) || + scope.container != 'com.apple.messages.cloud' || + scope.database != 'private' || + scope.streamKind != CloudSyncStreamKind.messages || + scope.schemaVersion != 2) { + throw CloudSyncFailure( + category: CloudFailureCategory.cancelled, + safeCode: 'unsupported_protected_cloud_scope', + ); + } + return switch (scope.zone) { + 'chatManateeZone' => 'chats', + 'messageManateeZone' => 'messages', + 'attachmentManateeZone' => 'attachments', + 'messageUpdateZone' => 'messageUpdateZone', + 'recoverableMessageDeleteZone' => 'recoverableMessageDeleteZone', + 'scheduledMessageZone' => 'scheduledMessageZone', + 'chat1ManateeZone' => 'chat1ManateeZone', + _ => throw CloudSyncFailure( + category: CloudFailureCategory.cancelled, + safeCode: 'unsupported_protected_cloud_zone', + ), + }; + } + + CloudSyncFailure _mapFailure(NativeProtectedFailure failure) { + final retryAfter = failure.retryAfterSeconds == null + ? null + : Duration(seconds: failure.retryAfterSeconds!); + final category = switch (failure.category) { + NativeProtectedFailureCategory.network => CloudFailureCategory.network, + NativeProtectedFailureCategory.throttled => + CloudFailureCategory.throttled, + NativeProtectedFailureCategory.server => CloudFailureCategory.server, + NativeProtectedFailureCategory.authorization => + CloudFailureCategory.authorization, + NativeProtectedFailureCategory.pcsUnavailable => + CloudFailureCategory.pcsUnavailable, + NativeProtectedFailureCategory.malformedRecord => + CloudFailureCategory.malformedRecord, + NativeProtectedFailureCategory.conflict => CloudFailureCategory.conflict, + NativeProtectedFailureCategory.localStorage => + CloudFailureCategory.localStorage, + NativeProtectedFailureCategory.unknown => CloudFailureCategory.unknown, + }; + return CloudSyncFailure( + category: category, + retryAfter: retryAfter, + safeCode: failure.safeCode, + ); + } + + CloudSyncFailure _malformed(String code) => CloudSyncFailure( + category: CloudFailureCategory.malformedRecord, + safeCode: code, + ); + + CloudSyncFailure _localStorage(String code) => CloudSyncFailure( + category: CloudFailureCategory.localStorage, + safeCode: code, + ); + + @override + Future refreshAuthentication(CloudSyncScope scope) async { + final callback = _refreshAuthentication; + return callback == null ? false : await callback(scope); + } + + @override + Future refreshPcsAccess(CloudSyncScope scope) async { + final callback = _refreshPcsAccess; + return callback == null ? false : await callback(scope); + } + + @override + Future pushOperations( + CloudSyncScope scope, { + required List operations, + }) => throw _readOnlyFailure(); + + @override + Future reconcileUnknownOutcome( + CloudSyncScope scope, { + required CloudOutboxOperation operation, + }) async { + _validateOutboundMessageScope(scope); + final payloadReference = operation.encryptedPayloadReference; + final payloadSha256 = operation.payloadSha256; + final serverRecordIdHash = operation.serverRecordIdHash; + final leaseReference = operation.protectedLeaseReference; + final requestUuid = operation.appleRequestUuid; + final operationUuid = operation.appleOperationUuid; + if (operation.scope != scope || + operation.status != CloudOutboxStatus.unknownOutcome || + operation.action != CloudOutboxAction.save || + operation.payloadVersion != 1 || + !_isInitialCreateOperationIdentity( + scope, + operationId: operation.operationId, + logicalEntityKeyHash: operation.logicalEntityKeyHash, + payloadVersion: operation.payloadVersion, + ) || + payloadReference == null || + !_protectedReferencePattern.hasMatch(payloadReference) || + payloadSha256 == null || + !_contentDigestPattern.hasMatch(payloadSha256) || + serverRecordIdHash == null || + !_nativeDigestPattern.hasMatch(serverRecordIdHash) || + leaseReference == null || + !_leaseReferencePattern.hasMatch(leaseReference) || + requestUuid == null || + !_canonicalAppleUuidPattern.hasMatch(requestUuid) || + operationUuid == null || + !_canonicalAppleUuidPattern.hasMatch(operationUuid) || + requestUuid == operationUuid) { + throw _localStorage('cloud_sync_outbound_reconcile_operation_invalid'); + } + + final result = await _runProtectedStoreOperation( + () => _requireWriteBindings().reconcileMessageCreate( + cloudMessagesClient: _cloudMessagesClient, + storageDirectory: _storageDirectory, + expectedAccountFingerprint: scope.accountFingerprint, + expectedProtectedStoreIdentity: _protectedStoreIdentity, + requestUuid: requestUuid, + input: frb_api.CloudSyncPreparedMessageCreateInput( + localOperationId: operation.operationId, + logicalEntityKeyHash: operation.logicalEntityKeyHash, + protectedLeaseReference: leaseReference, + protectedPayloadReference: payloadReference, + payloadSha256: payloadSha256, + protectedServerRecordReference: payloadReference, + serverRecordIdHash: serverRecordIdHash, + appleOperationUuid: operationUuid, + ), + ), + ); + if (result.failure case final failure?) { + if (result.disposition != null || + result.protectedProofReference != null || + result.failureClass != null || + result.retryAfterSeconds != null) { + throw _localStorage('cloud_sync_outbound_reconcile_envelope_invalid'); + } + throw _mapOutboundFailure(failure); + } + final disposition = result.disposition; + if (disposition == null) { + throw _localStorage('cloud_sync_outbound_reconcile_envelope_invalid'); + } + final decisive = + disposition != frb_api.CloudSyncOutboundReconcileDisposition.unresolved; + if ((decisive && result.protectedProofReference != payloadReference) || + (!decisive && result.protectedProofReference != null) || + (disposition != + frb_api.CloudSyncOutboundReconcileDisposition.unresolved && + result.retryAfterSeconds != null) || + ((disposition == + frb_api.CloudSyncOutboundReconcileDisposition.committed || + disposition == + frb_api.CloudSyncOutboundReconcileDisposition.notApplied) && + result.failureClass != null) || + (disposition == + frb_api.CloudSyncOutboundReconcileDisposition.diverged && + result.failureClass != + frb_api.CloudSyncOutboundFailureClass.conflict)) { + throw _localStorage('cloud_sync_outbound_reconcile_envelope_invalid'); + } + + CloudUnknownOutcomeProof proof() => CloudUnknownOutcomeProof( + operationId: operation.operationId, + appleRequestUuid: requestUuid, + appleOperationUuid: operationUuid, + scopeStorageKey: scope.storageKey, + checkpointGeneration: operation.checkpointGeneration, + logicalEntityKeyHash: operation.logicalEntityKeyHash, + serverRecordIdHash: serverRecordIdHash, + action: operation.action, + expectedPayloadSha256: payloadSha256, + protectedProofReference: result.protectedProofReference!, + ); + + return switch (disposition) { + frb_api.CloudSyncOutboundReconcileDisposition.committed => + CloudUnknownOutcomeResolution.committed(proof: proof()), + frb_api.CloudSyncOutboundReconcileDisposition.notApplied => + CloudUnknownOutcomeResolution.notApplied(proof: proof()), + frb_api.CloudSyncOutboundReconcileDisposition.diverged => + const CloudUnknownOutcomeResolution.quarantined( + failureCategory: CloudFailureCategory.conflict, + ), + frb_api.CloudSyncOutboundReconcileDisposition.unresolved => + CloudUnknownOutcomeResolution.unresolved( + failureCategory: _mapOutboundFailureClass(result.failureClass), + retryAfter: _boundedRetryAfter(result.retryAfterSeconds), + ), + }; + } + + @override + Future allocateServerRecordMapping( + CloudSyncScope scope, { + required String logicalEntityKeyHash, + }) => throw _readOnlyFailure(); + + @override + Future reconcileServerRecordChanged( + CloudSyncScope scope, { + required CloudOutboxOperation operation, + }) => throw _readOnlyFailure(); + + CloudSyncFailure _readOnlyFailure() => CloudSyncFailure( + category: CloudFailureCategory.cancelled, + safeCode: 'cloud_sync_protected_read_only', + ); +} + +/// Typed façade over the generated protected FRB surface. +final class FrbNativeProtectedCloudSyncBindings + implements + NativeProtectedCloudSyncBindings, + NativeProtectedCloudSyncWriteBindings { + FrbNativeProtectedCloudSyncBindings({RustLibApi? api}) + // ignore: invalid_use_of_internal_member + : _api = api ?? RustLib.instance.api; + + final RustLibApi _api; + + @override + Future stageOutboundMessage({ + required Object cloudMessagesClient, + required String storageDirectory, + required String expectedAccountFingerprint, + required String expectedProtectedStoreIdentity, + required frb_api.CloudMessage message, + }) => _api.crateApiApiCloudSyncStageOutboundMessage( + cloudMessagesClient: _requireCloudMessagesClient(cloudMessagesClient), + storageDirectory: storageDirectory, + expectedAccountFingerprint: expectedAccountFingerprint, + expectedProtectedStoreIdentity: expectedProtectedStoreIdentity, + message: message, + ); + + @override + Future prepareMessageCreate({ + required Object cloudMessagesClient, + required String storageDirectory, + required String expectedAccountFingerprint, + required String expectedProtectedStoreIdentity, + required String requestUuid, + required Duration requestTimeout, + required List inputs, + }) => _api.crateApiApiCloudSyncPrepareMessageCreate( + cloudMessagesClient: _requireCloudMessagesClient(cloudMessagesClient), + storageDirectory: storageDirectory, + expectedAccountFingerprint: expectedAccountFingerprint, + expectedProtectedStoreIdentity: expectedProtectedStoreIdentity, + requestUuid: requestUuid, + requestTimeoutSeconds: BigInt.from(requestTimeout.inSeconds), + inputs: inputs, + ); + + @override + Future consumePreparedMessageCreate({ + required frb_api.CloudSyncPreparedMessageCreateHandle handle, + }) => _api.crateApiApiCloudSyncConsumePreparedMessageCreate(handle: handle); + + @override + Future reconcileMessageCreate({ + required Object cloudMessagesClient, + required String storageDirectory, + required String expectedAccountFingerprint, + required String expectedProtectedStoreIdentity, + required String requestUuid, + required frb_api.CloudSyncPreparedMessageCreateInput input, + }) => _api.crateApiApiCloudSyncReconcileMessageCreate( + cloudMessagesClient: _requireCloudMessagesClient(cloudMessagesClient), + storageDirectory: storageDirectory, + expectedAccountFingerprint: expectedAccountFingerprint, + expectedProtectedStoreIdentity: expectedProtectedStoreIdentity, + requestUuid: requestUuid, + input: input, + ); + + @override + Future fetchProtectedPage({ + required Object cloudMessagesClient, + required String storageDirectory, + required String expectedAccountFingerprint, + required String stream, + required int generation, + required String? previousCheckpointReference, + required int maximumChanges, + }) async { + final result = await _api.crateApiApiCloudSyncFetchProtectedPage( + cloudMessagesClient: _requireCloudMessagesClient(cloudMessagesClient), + storageDirectory: storageDirectory, + expectedAccountFingerprint: expectedAccountFingerprint, + stream: stream, + generation: BigInt.from(generation), + previousCheckpointReference: previousCheckpointReference, + maximumChanges: maximumChanges, + ); + return NativeProtectedFetchResult( + page: result.page == null ? null : _pageFromFrb(result.page!), + failure: result.failure == null ? null : _failureFromFrb(result.failure!), + ); + } + + @override + Future commitProtectedPageLease({ + required String storageDirectory, + required String leaseReference, + required List retainedReferences, + }) async { + final result = _api.crateApiApiCloudSyncCommitProtectedPageLease( + storageDirectory: storageDirectory, + pageLeaseReference: leaseReference, + retainedReferences: retainedReferences, + ); + return NativeProtectedLeaseResult( + failure: result.failure == null ? null : _failureFromFrb(result.failure!), + ); + } + + @override + Future acknowledgeCommittedPageLease({ + required String storageDirectory, + required String leaseReference, + }) async { + final result = _api.crateApiApiCloudSyncAcknowledgeCommittedPageLease( + storageDirectory: storageDirectory, + pageLeaseReference: leaseReference, + ); + return NativeProtectedLeaseResult( + failure: result.failure == null ? null : _failureFromFrb(result.failure!), + ); + } + + @override + Future rollbackProtectedPageLease({ + required String storageDirectory, + required String leaseReference, + }) async { + final result = _api.crateApiApiCloudSyncRollbackProtectedPageLease( + storageDirectory: storageDirectory, + pageLeaseReference: leaseReference, + ); + return NativeProtectedLeaseResult( + failure: result.failure == null ? null : _failureFromFrb(result.failure!), + ); + } + + @override + Future recoverProtectedPageLeases({ + required String storageDirectory, + required List adoptedLeaseReferences, + required List liveReferences, + required bool liveReferenceEnumerationComplete, + }) async { + final result = _api.crateApiApiCloudSyncRecoverAbandonedPageLeases( + storageDirectory: storageDirectory, + adoptedLeaseReferences: adoptedLeaseReferences, + liveReferences: liveReferences, + liveReferenceEnumerationComplete: liveReferenceEnumerationComplete, + ); + return NativeProtectedRecoveryResult( + recovery: result.recovery == null + ? null + : _recoveryFromFrb(result.recovery!), + failure: result.failure == null ? null : _failureFromFrb(result.failure!), + ); + } + + @override + Future retireProtectedReferences({ + required String storageDirectory, + required List references, + }) async { + final result = _api.crateApiApiCloudSyncRetireProtectedReferences( + storageDirectory: storageDirectory, + references: references, + ); + return NativeProtectedRetirementResult( + retiredCount: result.retiredCount, + failure: result.failure == null ? null : _failureFromFrb(result.failure!), + ); + } + + @override + Future collectProtectedGarbage({ + required String storageDirectory, + required List liveReferences, + required bool liveReferenceEnumerationComplete, + }) async { + final result = _api.crateApiApiCloudSyncCollectProtectedGarbage( + storageDirectory: storageDirectory, + liveReferences: liveReferences, + liveReferenceEnumerationComplete: liveReferenceEnumerationComplete, + ); + return NativeProtectedGarbageCollectionResult( + collection: result.collection == null + ? null + : NativeProtectedGarbageCollection( + scannedCount: result.collection!.scannedCount, + firstObservedCount: result.collection!.firstObservedCount, + deletedCount: result.collection!.deletedCount, + preservedLiveCount: result.collection!.preservedLiveCount, + preservedActiveLeaseCount: + result.collection!.preservedActiveLeaseCount, + hasMore: result.collection!.hasMore, + ), + failure: result.failure == null ? null : _failureFromFrb(result.failure!), + ); + } + + frb_lib.ArcCloudMessagesClientDefaultAnisetteProvider + _requireCloudMessagesClient(Object value) { + if (value is! frb_lib.ArcCloudMessagesClientDefaultAnisetteProvider) { + throw ArgumentError( + 'cloudMessagesClient must be the generated FRB Cloud Messages client', + ); + } + return value; + } + + NativeProtectedPage _pageFromFrb(frb_api.CloudSyncProtectedPage page) { + return NativeProtectedPage( + changes: page.changes.map(_changeFromFrb).toList(growable: false), + batchId: page.batchId, + generation: page.generation.toInt(), + pageLeaseReference: page.pageLeaseReference, + protectedNextCheckpointReference: page.protectedNextCheckpointReference, + complete: page.complete, + admittedRawBytes: page.admittedRawBytes.toInt(), + ); + } + + NativeProtectedChange _changeFromFrb( + frb_api.CloudSyncProtectedChange change, + ) { + return NativeProtectedChange( + changeId: change.changeId, + recordIdHash: change.recordIdHash, + etagHash: change.etagHash, + kind: _changeKind(change.kind), + payloadSha256: change.payloadSha256, + payloadLength: change.payloadLength.toInt(), + protectedRecordIdentityReference: change.protectedRecordIdentityReference, + protectedRawEnvelopeReference: change.protectedRawEnvelopeReference, + serverModifiedAtMillis: change.serverModifiedAtMillis?.toInt(), + preflightCode: change.preflightCode == null + ? null + : _preflightCode(change.preflightCode!), + isTombstone: change.isTombstone, + ); + } + + NativeProtectedRecovery _recoveryFromFrb( + frb_api.CloudSyncProtectedRecovery recovery, + ) { + return NativeProtectedRecovery( + finalizedAdoptedLeaseReferences: recovery.finalizedAdoptedLeaseReferences, + absentAdoptedLeaseReferences: recovery.absentAdoptedLeaseReferences, + rolledBackCount: recovery.rolledBackCount, + removedTemporaryFilesCount: recovery.removedTemporaryFilesCount, + hasMore: recovery.hasMore, + ); + } + + NativeProtectedFailure _failureFromFrb( + frb_api.CloudSyncProtectedFailure failure, + ) { + return NativeProtectedFailure( + category: _failureCategory(failure.category), + safeCode: _safeCode(failure.safeCode), + retryAfterSeconds: failure.retryAfterSeconds?.toInt(), + ); + } + + NativeProtectedChangeKind _changeKind( + frb_api.CloudSyncProtectedChangeKind kind, + ) => switch (kind) { + frb_api.CloudSyncProtectedChangeKind.save => NativeProtectedChangeKind.save, + frb_api.CloudSyncProtectedChangeKind.delete => + NativeProtectedChangeKind.delete, + frb_api.CloudSyncProtectedChangeKind.quarantined => + NativeProtectedChangeKind.quarantined, + }; + + NativeProtectedPreflightCode _preflightCode( + frb_api.CloudSyncProtectedPreflightCode code, + ) => switch (code) { + frb_api.CloudSyncProtectedPreflightCode.unsupportedRecordType => + NativeProtectedPreflightCode.unsupportedRecordType, + frb_api.CloudSyncProtectedPreflightCode.malformedMetadata => + NativeProtectedPreflightCode.malformedMetadata, + frb_api.CloudSyncProtectedPreflightCode.oversizedRecord => + NativeProtectedPreflightCode.oversizedRecord, + frb_api.CloudSyncProtectedPreflightCode.invalidChangeShape => + NativeProtectedPreflightCode.invalidChangeShape, + }; + + NativeProtectedFailureCategory _failureCategory( + frb_api.CloudSyncProtectedFailureCategory category, + ) => switch (category) { + frb_api.CloudSyncProtectedFailureCategory.network => + NativeProtectedFailureCategory.network, + frb_api.CloudSyncProtectedFailureCategory.throttled => + NativeProtectedFailureCategory.throttled, + frb_api.CloudSyncProtectedFailureCategory.server => + NativeProtectedFailureCategory.server, + frb_api.CloudSyncProtectedFailureCategory.authorization => + NativeProtectedFailureCategory.authorization, + frb_api.CloudSyncProtectedFailureCategory.pcsUnavailable => + NativeProtectedFailureCategory.pcsUnavailable, + frb_api.CloudSyncProtectedFailureCategory.malformedRecord => + NativeProtectedFailureCategory.malformedRecord, + frb_api.CloudSyncProtectedFailureCategory.conflict => + NativeProtectedFailureCategory.conflict, + frb_api.CloudSyncProtectedFailureCategory.localStorage => + NativeProtectedFailureCategory.localStorage, + frb_api.CloudSyncProtectedFailureCategory.unknown => + NativeProtectedFailureCategory.unknown, + }; + + String _safeCode(frb_api.CloudSyncProtectedSafeCode code) => switch (code) { + frb_api.CloudSyncProtectedSafeCode.invalidScope => 'invalid_scope', + frb_api.CloudSyncProtectedSafeCode.invalidRequest => 'invalid_request', + frb_api.CloudSyncProtectedSafeCode.invalidCheckpoint => + 'invalid_checkpoint', + frb_api.CloudSyncProtectedSafeCode.checkpointContextMismatch => + 'checkpoint_context_mismatch', + frb_api.CloudSyncProtectedSafeCode.oversizedPage => 'oversized_page', + frb_api.CloudSyncProtectedSafeCode.oversizedRecord => 'oversized_record', + frb_api.CloudSyncProtectedSafeCode.protectionFailed => 'protection_failed', + frb_api.CloudSyncProtectedSafeCode.localStoreFailed => 'local_store_failed', + frb_api.CloudSyncProtectedSafeCode.fetchDeadline => 'fetch_deadline', + frb_api.CloudSyncProtectedSafeCode.network => 'network', + frb_api.CloudSyncProtectedSafeCode.cloudKitThrottled => + 'cloudkit_throttled', + frb_api.CloudSyncProtectedSafeCode.cloudKitServer => 'cloudkit_server', + frb_api.CloudSyncProtectedSafeCode.cloudKitAuthorization => + 'cloudkit_authorization', + frb_api.CloudSyncProtectedSafeCode.cloudKitConflict => 'cloudkit_conflict', + frb_api.CloudSyncProtectedSafeCode.cloudKitResetRequired => + 'cloudkit_reset_required', + frb_api.CloudSyncProtectedSafeCode.cloudKitPermanent => + 'cloudkit_permanent', + frb_api.CloudSyncProtectedSafeCode.cloudKitUnknown => 'cloudkit_unknown', + frb_api.CloudSyncProtectedSafeCode.httpAuthorization => + 'http_authorization', + frb_api.CloudSyncProtectedSafeCode.httpTimeout => 'http_timeout', + frb_api.CloudSyncProtectedSafeCode.httpThrottled => 'http_throttled', + frb_api.CloudSyncProtectedSafeCode.httpServer => 'http_server', + frb_api.CloudSyncProtectedSafeCode.httpUnknown => 'http_unknown', + frb_api.CloudSyncProtectedSafeCode.pcsUnavailable => 'pcs_unavailable', + frb_api.CloudSyncProtectedSafeCode.malformedResponse => + 'malformed_response', + frb_api.CloudSyncProtectedSafeCode.continuationNoProgress => + 'continuation_no_progress', + frb_api.CloudSyncProtectedSafeCode.nativeAuthUnavailable => + 'native_auth_unavailable', + frb_api.CloudSyncProtectedSafeCode.unknown => 'unknown', + }; +} diff --git a/lib/services/rustpush/cloud_sync/objectbox_canonical_semantic_entity_adapter.dart b/lib/services/rustpush/cloud_sync/objectbox_canonical_semantic_entity_adapter.dart new file mode 100644 index 0000000000..d60f0a48a2 --- /dev/null +++ b/lib/services/rustpush/cloud_sync/objectbox_canonical_semantic_entity_adapter.dart @@ -0,0 +1,1069 @@ +import 'package:bluebubbles/database/models.dart'; + +import 'cloud_inbox_applier.dart'; +import 'cloud_merge_policy.dart'; +import 'cloud_sync_models.dart'; +import 'objectbox_cloud_semantic_store_gateway.dart'; + +/// Immutable, content-free account and rebootstrap fence supplied by the +/// synchronous Cloud Sync composition layer. +/// +/// It deliberately contains an account fingerprint rather than an Apple ID. +/// The provider used by [ObjectBoxCanonicalSemanticEntityAdapter] must read +/// already-loaded process state only. It must not query the network, secure +/// storage, or a Flutter service while an ObjectBox transaction is active. +final class CloudCanonicalActiveScope { + const CloudCanonicalActiveScope({ + required this.scope, + required this.generation, + }); + + final CloudSyncScope scope; + final int generation; +} + +/// Synchronous lookup for a verified transient canonical identity. +/// +/// Cloud Sync V2 durable metadata stores only keyed hashes. A hash cannot be +/// reversed into a canonical `Chat.guid`, `Message.guid`, or +/// `Attachment.guid`. The future native DTO boundary must therefore retain a +/// short-lived, scope- and generation-bound identity lookup while the decoded +/// mutation is applied. Implementations must not log, serialize, persist, or +/// perform I/O with the returned plaintext GUID. +abstract interface class CloudCanonicalIdentityResolver { + String? resolveCanonicalGuid({ + required CloudSyncScope scope, + required int generation, + required CloudEntityKind kind, + required String logicalEntityKeyHash, + }); +} + +/// Default-off synchronous adapter for the app's canonical ObjectBox boxes. +/// +/// The legacy presentation-only lane can update the non-null display name of +/// an existing, exactly-resolved chat. A separate default-off chat-upsert lane +/// can create or update a chat only from a scope-bound canonical GUID and an +/// exact, conflict-free chat alias. Participant sets are authoritative only on +/// create or a strictly higher group version. +/// +/// Independently gated lanes project ordinary messages, reactions, and +/// attachment metadata by exact canonical identity. Stickers, extension +/// payloads that still require decoding, media materialization, profiles, +/// group photos, and tombstones fail closed. The adapter never writes raw +/// CloudKit record IDs, account identifiers, protected references, attachment +/// paths, or media bytes into canonical entities. The only production +/// composition is the separately compile-gated manual semantic pull canary. +final class ObjectBoxCanonicalSemanticEntityAdapter + implements CloudCanonicalSemanticEntityAdapter { + ObjectBoxCanonicalSemanticEntityAdapter({ + required this.store, + required this._activeScopeProvider, + required this._identityResolver, + this._semanticApplyEnabled = false, + this._allowExistingChatPresentationUpdates = false, + this._allowChatUpserts = false, + this._allowExistingChatDisplayNameClears = false, + this._allowMessageUpserts = false, + this._allowReactionUpserts = false, + this._allowAttachmentMetadataUpserts = false, + }) : _chats = store.box(), + _handles = store.box(), + _messages = store.box(), + _attachments = store.box(); + + @override + final Store store; + final CloudCanonicalActiveScope? Function() _activeScopeProvider; + final CloudCanonicalIdentityResolver _identityResolver; + final bool _semanticApplyEnabled; + final bool _allowExistingChatPresentationUpdates; + final bool _allowChatUpserts; + final bool _allowExistingChatDisplayNameClears; + final bool _allowMessageUpserts; + final bool _allowReactionUpserts; + final bool _allowAttachmentMetadataUpserts; + final Box _chats; + final Box _handles; + final Box _messages; + final Box _attachments; + + @override + bool isActiveAccountScope({ + required CloudSyncScope scope, + required int generation, + }) => _semanticApplyEnabled && _matchesActiveScope(scope, generation); + + @override + bool entityExists({ + required CloudSyncScope scope, + required int generation, + required CloudEntityKind kind, + required String logicalEntityKeyHash, + }) { + if (!isActiveAccountScope(scope: scope, generation: generation)) { + return false; + } + final guid = _resolveCanonicalGuid( + scope: scope, + generation: generation, + kind: kind, + logicalEntityKeyHash: logicalEntityKeyHash, + ); + if (guid == null) return false; + + return switch (kind) { + CloudEntityKind.chat => _findChat(guid) != null, + CloudEntityKind.message || + CloudEntityKind.reaction => _findMessage(guid) != null, + CloudEntityKind.attachment => _findAttachment(guid) != null, + // Group photos and profiles do not have a canonical primary row whose + // existence can be safely inferred from the current V2 DTO. + CloudEntityKind.groupPhoto || CloudEntityKind.sharedProfile => false, + }; + } + + @override + CloudCanonicalSemanticMutationReceipt applyEntity({ + required CloudSyncScope scope, + required int generation, + required CloudSemanticEntityPayload payload, + required CloudSemanticSnapshot snapshot, + }) { + _requireActiveScope(scope, generation); + if (payload.kind != snapshot.kind || + payload.logicalEntityKeyHash != snapshot.logicalEntityKeyHash) { + throw CloudSyncFailure( + category: CloudFailureCategory.malformedRecord, + safeCode: 'canonical_payload_snapshot_mismatch', + ); + } + + // There is one deliberately narrow safe mapping. The merge gateway has + // already decided the incoming snapshot wins; this adapter still refuses + // chat creation and respects the user's local name lock. + if (payload case CloudChatEntityPayload()) { + if (_allowChatUpserts) { + return _applyChatUpsert( + scope: scope, + generation: generation, + payload: payload, + ); + } + return _applyExistingChatPresentation( + scope: scope, + generation: generation, + payload: payload, + ); + } + if (payload case CloudMessageEntityPayload()) { + if (_allowMessageUpserts) { + return _applyMessageUpsert( + scope: scope, + generation: generation, + payload: payload, + ); + } + } + if (payload case CloudReactionEntityPayload()) { + if (_allowReactionUpserts) { + return _applyReactionUpsert( + scope: scope, + generation: generation, + payload: payload, + ); + } + } + if (payload case CloudAttachmentEntityPayload()) { + if (_allowAttachmentMetadataUpserts) { + return _applyAttachmentMetadataUpsert( + scope: scope, + generation: generation, + payload: payload, + ); + } + } + + throw CloudSyncFailure( + category: CloudFailureCategory.dependency, + safeCode: 'canonical_payload_dto_incomplete', + ); + } + + @override + CloudCanonicalSemanticMutationReceipt applyTombstone({ + required CloudSyncScope scope, + required int generation, + required CloudSemanticTombstone tombstone, + }) { + _requireActiveScope(scope, generation); + // A tombstone contains a hash, not a proven canonical GUID/alias mapping. + // Do not infer an entity or turn a server deletion into a broad local wipe. + throw CloudSyncFailure( + category: CloudFailureCategory.dependency, + safeCode: 'canonical_tombstone_dto_incomplete', + ); + } + + CloudCanonicalSemanticMutationReceipt _applyExistingChatPresentation({ + required CloudSyncScope scope, + required int generation, + required CloudChatEntityPayload payload, + }) { + if (!_allowExistingChatPresentationUpdates) { + throw CloudSyncFailure( + category: CloudFailureCategory.dependency, + safeCode: 'canonical_chat_apply_disabled', + ); + } + final guid = _resolveCanonicalGuid( + scope: scope, + generation: generation, + kind: CloudEntityKind.chat, + logicalEntityKeyHash: payload.logicalEntityKeyHash, + ); + if (guid == null) { + throw CloudSyncFailure( + category: CloudFailureCategory.dependency, + safeCode: 'canonical_identity_unavailable', + ); + } + if (guid != payload.canonicalGuid) { + throw CloudSyncFailure( + category: CloudFailureCategory.conflict, + safeCode: 'canonical_identity_mismatch', + ); + } + final existing = _findChat(guid); + if (existing == null) { + throw CloudSyncFailure( + category: CloudFailureCategory.dependency, + safeCode: 'canonical_chat_creation_unavailable', + ); + } + + // The current payload has no presence bitmap, so null means preserve, not + // clear. Participant, service, group-version, icon, and raw-cloud fields + // remain untouched because this DTO does not prove their semantics. + if (payload.displayName != null && !existing.lockChatName) { + existing.displayName = payload.displayName; + _chats.put(existing); + } + return CloudCanonicalSemanticMutationReceipt.committed; + } + + CloudCanonicalSemanticMutationReceipt _applyChatUpsert({ + required CloudSyncScope scope, + required int generation, + required CloudChatEntityPayload payload, + }) { + if (payload.service != CloudSemanticService.iMessage || + payload.style == null || + (payload.groupVersion != null && payload.groupVersion! < 0)) { + throw CloudSyncFailure( + category: CloudFailureCategory.malformedRecord, + safeCode: 'canonical_chat_shape_invalid', + ); + } + + final guid = _resolveCanonicalGuid( + scope: scope, + generation: generation, + kind: CloudEntityKind.chat, + logicalEntityKeyHash: payload.logicalEntityKeyHash, + ); + if (guid == null) { + throw CloudSyncFailure( + category: CloudFailureCategory.dependency, + safeCode: 'canonical_identity_unavailable', + ); + } + if (guid != payload.canonicalGuid) { + throw CloudSyncFailure( + category: CloudFailureCategory.conflict, + safeCode: 'canonical_identity_mismatch', + ); + } + + final aliasMatch = _findChatByIdentifier(payload.chatIdentifier); + if (aliasMatch != null && aliasMatch.guid != guid) { + throw CloudSyncFailure( + category: CloudFailureCategory.conflict, + safeCode: 'canonical_chat_alias_conflict', + ); + } + + var chat = _findChat(guid); + final isCreate = chat == null; + final style = switch (payload.style!) { + CloudSemanticChatStyle.direct => 45, + CloudSemanticChatStyle.group => 43, + }; + if (chat != null && chat.style != null && chat.style != style) { + throw CloudSyncFailure( + category: CloudFailureCategory.conflict, + safeCode: 'canonical_chat_style_conflict', + ); + } + if (!isCreate && + payload.displayNameState == CloudSemanticFieldState.explicitClear && + !_allowExistingChatDisplayNameClears && + !chat.lockChatName) { + throw CloudSyncFailure( + category: CloudFailureCategory.dependency, + safeCode: 'canonical_chat_display_name_clear_unverified', + ); + } + + final incomingVersion = switch (payload.groupVersionState) { + CloudSemanticFieldState.value => payload.groupVersion, + CloudSemanticFieldState.absent || + CloudSemanticFieldState.explicitClear => null, + }; + final replacesParticipants = + isCreate || + (incomingVersion != null && + (chat.groupVersion == null || + incomingVersion > chat.groupVersion!)); + final participantHandles = replacesParticipants + ? _resolveParticipantHandles(payload.participantHandles) + : const []; + + chat ??= Chat( + guid: guid, + chatIdentifier: payload.chatIdentifier, + style: style, + ); + chat.chatIdentifier = payload.chatIdentifier; + chat.style = style; + + if (!chat.lockChatName) { + switch (payload.displayNameState) { + case CloudSemanticFieldState.absent: + break; + case CloudSemanticFieldState.value: + chat.displayName = payload.displayName; + case CloudSemanticFieldState.explicitClear: + chat.displayName = null; + } + } + + if (payload.lastAddressedHandleState == CloudSemanticFieldState.value) { + final normalized = _normalizeHandle(payload.lastAddressedHandle!); + if (normalized != null) chat.usingHandle = normalized.prefixed; + } + if (incomingVersion != null && + (chat.groupVersion == null || incomingVersion > chat.groupVersion!)) { + chat.groupVersion = incomingVersion; + } + + if (payload.lastSeenMessageGuidState == CloudSemanticFieldState.value) { + final referenced = _findMessage(payload.lastSeenMessageGuid!); + if (referenced != null && referenced.chat.targetId == chat.id) { + chat.lastReadMessageGuid = payload.lastSeenMessageGuid; + } + } + + _chats.put(chat); + if (replacesParticipants) { + final attached = _chats.get(chat.id!); + if (attached == null) { + throw CloudSyncFailure( + category: CloudFailureCategory.dependency, + safeCode: 'canonical_chat_relation_unavailable', + ); + } + attached.handles.clear(); + attached.handles.addAll(participantHandles); + attached.handles.applyToDb(); + } + + return CloudCanonicalSemanticMutationReceipt.committed; + } + + List _resolveParticipantHandles(Iterable rawHandles) { + final handles = []; + final seen = {}; + for (final raw in rawHandles) { + final normalized = _normalizeHandle(raw); + if (normalized == null) { + throw CloudSyncFailure( + category: CloudFailureCategory.malformedRecord, + safeCode: 'canonical_chat_participant_invalid', + ); + } + final uniqueKey = '${normalized.address}/iMessage'; + if (!seen.add(uniqueKey)) continue; + var handle = _findHandle(uniqueKey); + if (handle == null) { + handle = Handle( + address: normalized.address, + service: 'iMessage', + uniqueAddressAndService: uniqueKey, + ); + final id = _handles.put(handle); + handle.id = id; + handle.originalROWID = id; + _handles.put(handle); + } else if (handle.originalROWID == null) { + handle.originalROWID = handle.id; + _handles.put(handle); + } + handles.add(handle); + } + return handles; + } + + CloudCanonicalSemanticMutationReceipt _applyMessageUpsert({ + required CloudSyncScope scope, + required int generation, + required CloudMessageEntityPayload payload, + }) { + if (payload.service != CloudSemanticService.iMessage || + payload.createdAt == null || + payload.knownFlags == null || + payload.associationKind != CloudSemanticAssociationKind.none) { + throw CloudSyncFailure( + category: CloudFailureCategory.dependency, + safeCode: 'canonical_message_shape_unsupported', + ); + } + if (payload.decodedExtensionPayloadState == CloudSemanticFieldState.value) { + // Extension decoding must happen before the ObjectBox transaction. Do + // not discard URL-balloon or app payload bytes and still advance replay. + throw CloudSyncFailure( + category: CloudFailureCategory.dependency, + safeCode: 'canonical_message_extension_decode_required', + ); + } + + final guid = _requireResolvedGuid( + scope: scope, + generation: generation, + kind: CloudEntityKind.message, + logicalEntityKeyHash: payload.logicalEntityKeyHash, + payloadCanonicalGuid: payload.canonicalGuid, + ); + final chat = _findChatByIdentifier(payload.chatIdentifier); + if (chat == null) { + throw CloudSyncFailure( + category: CloudFailureCategory.dependency, + safeCode: 'canonical_message_chat_unavailable', + ); + } + + final flags = payload.knownFlags!; + final sender = _resolveMessageSender(payload.senderHandle, flags.fromMe); + var message = _findMessage(guid); + if (message != null) { + if (message.chat.targetId != 0 && message.chat.targetId != chat.id) { + throw CloudSyncFailure( + category: CloudFailureCategory.conflict, + safeCode: 'canonical_message_chat_conflict', + ); + } + if (message.isFromMe != null && message.isFromMe != flags.fromMe) { + throw CloudSyncFailure( + category: CloudFailureCategory.conflict, + safeCode: 'canonical_message_sender_conflict', + ); + } + if (message.dateCreated != null && + message.dateCreated!.toUtc() != payload.createdAt!.toUtc()) { + throw CloudSyncFailure( + category: CloudFailureCategory.conflict, + safeCode: 'canonical_message_created_at_conflict', + ); + } + } + + message ??= Message(guid: guid, dateCreated: payload.createdAt); + message.chat.target = chat; + message.dateCreated ??= payload.createdAt; + message.isFromMe = flags.fromMe; + message.handle = sender; + message.handleId = sender?.originalROWID ?? 0; + message.error = payload.error ?? message.error; + message.hasDdResults = flags.hasDataDetectorResults; + message.wasDeliveredQuietly = flags.deliveredQuietly; + message.didNotifyRecipient = flags.didNotifyRecipient; + + message.subject = _applyNullableStringField( + state: payload.subjectState, + incoming: payload.subject, + existing: message.subject, + ); + message.text = _applyNullableStringField( + state: payload.bodyState, + incoming: payload.body, + existing: message.text, + ); + message.balloonBundleId = _applyNullableStringField( + state: payload.balloonBundleIdState, + incoming: payload.balloonBundleId, + existing: message.balloonBundleId, + ); + message.expressiveSendStyleId = _applyNullableStringField( + state: payload.effectState, + incoming: payload.effect, + existing: message.expressiveSendStyleId, + ); + if (payload.decodedExtensionPayloadState == + CloudSemanticFieldState.explicitClear) { + message.payloadData = null; + message.hasApplePayloadData = false; + } + + switch (payload.attributedBodiesState) { + case CloudSemanticFieldState.absent: + break; + case CloudSemanticFieldState.value: + message.attributedBody = _attributedBodies(payload.attributedBodies); + case CloudSemanticFieldState.explicitClear: + message.attributedBody = []; + } + // Attachment records can arrive before a later replay of their owner. + // Until attachment tombstones are enabled, a message's confirmed + // attachment bit is monotonic and must not be cleared merely because one + // message payload omitted attributed-body attachment runs. + message.hasAttachments = + message.hasAttachments || + message.attributedBody.any( + (body) => + body.runs.any((run) => run.attributes?.attachmentGuid != null), + ); + + message.dateRead = _maximumDate( + message.dateRead, + payload.readAtState == CloudSemanticFieldState.value + ? payload.readAt + : null, + ); + message.dateDelivered = _maximumDate( + message.dateDelivered, + payload.deliveredAtState == CloudSemanticFieldState.value + ? payload.deliveredAt + : null, + ); + message.isDelivered = flags.delivered || message.dateDelivered != null; + + if (payload.replyParentCanonicalGuid != null) { + final replyGuid = _requireResolvedGuid( + scope: scope, + generation: generation, + kind: CloudEntityKind.message, + logicalEntityKeyHash: payload.replyParentLogicalKeyHash!, + payloadCanonicalGuid: payload.replyParentCanonicalGuid!, + ); + final replyParent = _findMessage(replyGuid); + if (replyParent == null || replyParent.chat.targetId != chat.id) { + throw CloudSyncFailure( + category: CloudFailureCategory.dependency, + safeCode: 'canonical_message_reply_parent_unavailable', + ); + } + message.threadOriginatorGuid = replyGuid; + message.threadOriginatorPart = payload.replyParentPart; + } + + _applyMessageSummary(message, payload); + _messages.put(message); + return CloudCanonicalSemanticMutationReceipt.committed; + } + + CloudCanonicalSemanticMutationReceipt _applyReactionUpsert({ + required CloudSyncScope scope, + required int generation, + required CloudReactionEntityPayload payload, + }) { + if (payload.service != CloudSemanticService.iMessage || + payload.createdAt == null || + payload.knownFlags == null || + !_reactionTypes.contains(payload.reactionType)) { + throw CloudSyncFailure( + category: CloudFailureCategory.dependency, + safeCode: 'canonical_reaction_shape_unsupported', + ); + } + final guid = _requireResolvedGuid( + scope: scope, + generation: generation, + kind: CloudEntityKind.reaction, + logicalEntityKeyHash: payload.logicalEntityKeyHash, + payloadCanonicalGuid: payload.canonicalGuid, + ); + final parentGuid = _requireResolvedGuid( + scope: scope, + generation: generation, + kind: CloudEntityKind.message, + logicalEntityKeyHash: payload.parentLogicalKeyHash, + payloadCanonicalGuid: payload.parentCanonicalGuid, + ); + final parent = _findMessage(parentGuid); + final chat = parent?.chat.target; + if (parent == null || chat == null) { + throw CloudSyncFailure( + category: CloudFailureCategory.dependency, + safeCode: 'canonical_reaction_parent_unavailable', + ); + } + + final flags = payload.knownFlags!; + final sender = _resolveMessageSender(payload.senderHandle, flags.fromMe); + var reaction = _findMessage(guid); + if (reaction != null) { + if (reaction.associatedMessageGuid != parentGuid || + (reaction.chat.targetId != 0 && reaction.chat.targetId != chat.id)) { + throw CloudSyncFailure( + category: CloudFailureCategory.conflict, + safeCode: 'canonical_reaction_parent_conflict', + ); + } + if (reaction.isFromMe != null && reaction.isFromMe != flags.fromMe) { + throw CloudSyncFailure( + category: CloudFailureCategory.conflict, + safeCode: 'canonical_reaction_sender_conflict', + ); + } + if (reaction.dateCreated != null && + reaction.dateCreated!.toUtc() != payload.createdAt!.toUtc()) { + throw CloudSyncFailure( + category: CloudFailureCategory.conflict, + safeCode: 'canonical_reaction_created_at_conflict', + ); + } + } + reaction ??= Message(guid: guid, dateCreated: payload.createdAt); + reaction.chat.target = chat; + reaction.dateCreated ??= payload.createdAt; + reaction.isFromMe = flags.fromMe; + reaction.handle = sender; + reaction.handleId = sender?.originalROWID ?? 0; + reaction.error = payload.error ?? reaction.error; + reaction.associatedMessageGuid = parentGuid; + reaction.associatedMessagePart = payload.parentPart; + reaction.associatedMessageType = payload.reactionType; + reaction.associatedMessageEmoji = payload.associatedEmoji; + reaction.hasDdResults = flags.hasDataDetectorResults; + reaction.wasDeliveredQuietly = flags.deliveredQuietly; + reaction.didNotifyRecipient = flags.didNotifyRecipient; + reaction.dateRead = _maximumDate( + reaction.dateRead, + payload.readAtState == CloudSemanticFieldState.value + ? payload.readAt + : null, + ); + reaction.dateDelivered = _maximumDate( + reaction.dateDelivered, + payload.deliveredAtState == CloudSemanticFieldState.value + ? payload.deliveredAt + : null, + ); + reaction.isDelivered = flags.delivered || reaction.dateDelivered != null; + _messages.put(reaction); + + if (!parent.hasReactions) { + parent.hasReactions = true; + _messages.put(parent); + } + return CloudCanonicalSemanticMutationReceipt.committed; + } + + CloudCanonicalSemanticMutationReceipt _applyAttachmentMetadataUpsert({ + required CloudSyncScope scope, + required int generation, + required CloudAttachmentEntityPayload payload, + }) { + final canonicalGuid = _requireResolvedGuid( + scope: scope, + generation: generation, + kind: CloudEntityKind.attachment, + logicalEntityKeyHash: payload.logicalEntityKeyHash, + payloadCanonicalGuid: payload.canonicalGuid, + ); + final hasOwner = payload.ownerCanonicalGuid != null; + // Rust has already normalized Apple's `at__` wire form to + // the app's canonical `_` form and independently verified + // the owner hash. Do not parse the normalized value as wire syntax again. + if (hasOwner && + canonicalGuid != '${payload.ownerCanonicalGuid}_${payload.ownerPart}') { + throw CloudSyncFailure( + category: CloudFailureCategory.conflict, + safeCode: 'canonical_attachment_owner_conflict', + ); + } + + Message? owner; + if (hasOwner) { + final ownerGuid = _requireResolvedGuid( + scope: scope, + generation: generation, + kind: CloudEntityKind.message, + logicalEntityKeyHash: payload.ownerLogicalKeyHash!, + payloadCanonicalGuid: payload.ownerCanonicalGuid!, + ); + owner = _findMessage(ownerGuid); + if (owner == null) { + throw CloudSyncFailure( + category: CloudFailureCategory.dependency, + safeCode: 'canonical_attachment_owner_unavailable', + ); + } + } + + final localGuid = canonicalGuid; + var attachment = _findAttachment(localGuid); + if (attachment != null && + attachment.message.targetId != 0 && + attachment.message.targetId != owner?.id) { + throw CloudSyncFailure( + category: CloudFailureCategory.conflict, + safeCode: 'canonical_attachment_relation_conflict', + ); + } + attachment ??= Attachment(guid: localGuid); + if (owner != null) attachment.message.target = owner; + attachment.uti = _applyNullableStringField( + state: payload.utiState, + incoming: payload.uti, + existing: attachment.uti, + ); + attachment.transferName = _applyNullableStringField( + state: payload.fileNameState, + incoming: payload.fileName, + existing: attachment.transferName, + ); + attachment.mimeType = _applyNullableStringField( + state: payload.mimeTypeState, + incoming: payload.mimeType, + existing: attachment.mimeType, + ); + switch (payload.totalBytesState) { + case CloudSemanticFieldState.absent: + break; + case CloudSemanticFieldState.value: + if (payload.totalBytes! < 0) { + throw CloudSyncFailure( + category: CloudFailureCategory.malformedRecord, + safeCode: 'canonical_attachment_size_invalid', + ); + } + attachment.totalBytes = payload.totalBytes; + case CloudSemanticFieldState.explicitClear: + attachment.totalBytes = null; + } + switch (payload.isOutgoingState) { + case CloudSemanticFieldState.absent: + break; + case CloudSemanticFieldState.value: + attachment.isOutgoing = payload.isOutgoing; + case CloudSemanticFieldState.explicitClear: + attachment.isOutgoing = null; + } + _attachments.put(attachment); + if (owner != null && !owner.hasAttachments) { + owner.hasAttachments = true; + _messages.put(owner); + } + return CloudCanonicalSemanticMutationReceipt.committed; + } + + String _requireResolvedGuid({ + required CloudSyncScope scope, + required int generation, + required CloudEntityKind kind, + required String logicalEntityKeyHash, + required String payloadCanonicalGuid, + }) { + final resolved = _resolveCanonicalGuid( + scope: scope, + generation: generation, + kind: kind, + logicalEntityKeyHash: logicalEntityKeyHash, + ); + if (resolved == null) { + throw CloudSyncFailure( + category: CloudFailureCategory.dependency, + safeCode: 'canonical_identity_unavailable', + ); + } + if (resolved != payloadCanonicalGuid) { + throw CloudSyncFailure( + category: CloudFailureCategory.conflict, + safeCode: 'canonical_identity_mismatch', + ); + } + return resolved; + } + + Handle? _resolveMessageSender(String raw, bool fromMe) { + if (raw.isEmpty && fromMe) return null; + final normalized = _normalizeHandle(raw); + if (normalized == null) { + throw CloudSyncFailure( + category: CloudFailureCategory.malformedRecord, + safeCode: 'canonical_message_sender_invalid', + ); + } + final key = '${normalized.address}/iMessage'; + var handle = _findHandle(key); + if (handle == null) { + handle = Handle( + address: normalized.address, + service: 'iMessage', + uniqueAddressAndService: key, + ); + final id = _handles.put(handle); + handle.id = id; + handle.originalROWID = id; + _handles.put(handle); + } else if (handle.originalROWID == null) { + handle.originalROWID = handle.id; + _handles.put(handle); + } + return handle; + } + + List _attributedBodies( + Iterable bodies, + ) => bodies + .map((body) { + final runs = body.runs + .map((run) { + final end = run.startUtf16 + run.lengthUtf16; + if (end < run.startUtf16 || end > body.text.length) { + throw CloudSyncFailure( + category: CloudFailureCategory.malformedRecord, + safeCode: 'canonical_message_text_range_invalid', + ); + } + return Run( + range: [run.startUtf16, run.lengthUtf16], + attributes: Attributes( + messagePart: run.messagePart, + attachmentGuid: run.attachmentCanonicalGuid, + mention: run.mentionHandle, + audioTranscript: run.audioTranscript, + textEffect: run.textEffect, + bold: run.bold, + italic: run.italic, + strikethrough: run.strikethrough, + underline: run.underline, + ), + ); + }) + .toList(growable: false); + return AttributedBody(string: body.text, runs: runs); + }) + .toList(growable: false); + + void _applyMessageSummary( + Message message, + CloudMessageEntityPayload payload, + ) { + if (payload.editsState == CloudSemanticFieldState.absent && + payload.retractedPartsState == CloudSemanticFieldState.absent) { + return; + } + final current = message.messageSummaryInfo.isEmpty + ? MessageSummaryInfo.empty() + : message.messageSummaryInfo.first; + if (payload.editsState == CloudSemanticFieldState.explicitClear) { + current.editedContent = {}; + current.editedParts = []; + current.originalTextRange = {}; + } else if (payload.editsState == CloudSemanticFieldState.value) { + final grouped = >{}; + final ranges = >{}; + for (final edit in payload.edits) { + final key = edit.part.toString(); + grouped + .putIfAbsent(key, () => []) + .add( + EditedContent( + text: Content(values: _attributedBodies(edit.bodies)), + date: edit.modifiedAt.millisecondsSinceEpoch.toDouble(), + ), + ); + if (edit.originalRangeLocation != null) { + ranges[key] = [ + edit.originalRangeLocation!, + edit.originalRangeLength!, + ]; + } + } + current.editedContent = grouped; + current.editedParts = grouped.keys.map(int.parse).toList()..sort(); + current.originalTextRange = ranges; + } + if (payload.retractedPartsState == CloudSemanticFieldState.explicitClear) { + current.retractedParts = []; + } else if (payload.retractedPartsState == CloudSemanticFieldState.value) { + current.retractedParts = payload.retractedParts.toSet().toList()..sort(); + } + message.messageSummaryInfo = [current]; + } + + String? _applyNullableStringField({ + required CloudSemanticFieldState state, + required String? incoming, + required String? existing, + }) => switch (state) { + CloudSemanticFieldState.absent => existing, + CloudSemanticFieldState.value => incoming, + CloudSemanticFieldState.explicitClear => null, + }; + + DateTime? _maximumDate(DateTime? existing, DateTime? incoming) { + if (existing == null) return incoming; + if (incoming == null || !incoming.isAfter(existing)) return existing; + return incoming; + } + + _NormalizedCanonicalHandle? _normalizeHandle(String raw) { + if (raw.isEmpty || raw != raw.trim() || raw.length > 512) return null; + String address; + bool email; + if (raw.startsWith('mailto:')) { + address = raw.substring('mailto:'.length); + email = true; + } else if (raw.startsWith('tel:')) { + address = raw.substring('tel:'.length); + email = false; + } else { + address = raw; + email = raw.contains('@'); + } + if (address.isEmpty || address != address.trim()) return null; + if (email) { + if (!_emailPattern.hasMatch(address)) return null; + } else if (!_telephonePattern.hasMatch(address)) { + return null; + } + return _NormalizedCanonicalHandle(address: address, email: email); + } + + bool _matchesActiveScope(CloudSyncScope scope, int generation) { + final active = _activeScopeProvider(); + return active != null && + active.scope == scope && + active.generation == generation; + } + + void _requireActiveScope(CloudSyncScope scope, int generation) { + if (!isActiveAccountScope(scope: scope, generation: generation)) { + throw CloudSyncFailure( + category: CloudFailureCategory.conflict, + safeCode: 'canonical_scope_fence_rejected', + ); + } + } + + String? _resolveCanonicalGuid({ + required CloudSyncScope scope, + required int generation, + required CloudEntityKind kind, + required String logicalEntityKeyHash, + }) { + final value = _identityResolver.resolveCanonicalGuid( + scope: scope, + generation: generation, + kind: kind, + logicalEntityKeyHash: logicalEntityKeyHash, + ); + if (value == null || !_isValidCanonicalGuid(value)) return null; + return value; + } + + static bool _isValidCanonicalGuid(String value) { + if (value.isEmpty || value.length > 1024) return false; + return value.codeUnits.every((unit) => unit >= 0x20 && unit != 0x7f); + } + + Chat? _findChat(String guid) { + final query = _chats.query(Chat_.guid.equals(guid)).build()..limit = 1; + try { + return query.findFirst(); + } finally { + query.close(); + } + } + + Chat? _findChatByIdentifier(String chatIdentifier) { + final query = + _chats.query(Chat_.chatIdentifier.equals(chatIdentifier)).build() + ..limit = 1; + try { + return query.findFirst(); + } finally { + query.close(); + } + } + + Handle? _findHandle(String uniqueAddressAndService) { + final query = + _handles + .query( + Handle_.uniqueAddressAndService.equals(uniqueAddressAndService), + ) + .build() + ..limit = 1; + try { + return query.findFirst(); + } finally { + query.close(); + } + } + + Message? _findMessage(String guid) { + final query = _messages.query(Message_.guid.equals(guid)).build() + ..limit = 1; + try { + return query.findFirst(); + } finally { + query.close(); + } + } + + Attachment? _findAttachment(String guid) { + final query = _attachments.query(Attachment_.guid.equals(guid)).build() + ..limit = 1; + try { + return query.findFirst(); + } finally { + query.close(); + } + } + + static final RegExp _emailPattern = RegExp(r'^[^@\s:]+@[^@\s:]+\.[^@\s:]+$'); + static final RegExp _telephonePattern = RegExp(r'^\+?[0-9]{3,20}$'); + static const Set _reactionTypes = { + 'love', + 'like', + 'dislike', + 'laugh', + 'emphasize', + 'question', + 'emoji', + 'stickerback', + '-love', + '-like', + '-dislike', + '-laugh', + '-emphasize', + '-question', + '-emoji', + '-stickerback', + }; +} + +final class _NormalizedCanonicalHandle { + const _NormalizedCanonicalHandle({ + required this.address, + required this.email, + }); + + final String address; + final bool email; + String get prefixed => '${email ? 'mailto' : 'tel'}:$address'; +} diff --git a/lib/services/rustpush/cloud_sync/objectbox_cloud_semantic_store_gateway.dart b/lib/services/rustpush/cloud_sync/objectbox_cloud_semantic_store_gateway.dart new file mode 100644 index 0000000000..cd021c61c2 --- /dev/null +++ b/lib/services/rustpush/cloud_sync/objectbox_cloud_semantic_store_gateway.dart @@ -0,0 +1,1456 @@ +import 'dart:collection'; +import 'dart:convert'; + +import 'package:bluebubbles/database/database.dart'; +import 'package:bluebubbles/database/models.dart'; +import 'package:crypto/crypto.dart'; + +import 'cloud_inbox_applier.dart'; +import 'cloud_merge_policy.dart'; +import 'cloud_sync_models.dart'; +import 'cloud_sync_store.dart'; + +/// Positive acknowledgement from a synchronous canonical ObjectBox mutation. +/// +/// Returning a concrete enum instead of `void` prevents an async callback from +/// satisfying this contract accidentally. +enum CloudCanonicalSemanticMutationReceipt { committed } + +/// Synchronous bridge to the app's canonical Message/Chat/Attachment boxes. +/// +/// Implementations must mutate only boxes from [store]. Network, filesystem, +/// hashing, platform-keystore, isolate, and async work are forbidden. Because +/// the exact same Store instance is required, the canonical mutation joins the +/// gateway's ObjectBox write transaction and rolls back with its metadata. +abstract interface class CloudCanonicalSemanticEntityAdapter { + Store get store; + + /// Revalidates the currently authenticated account immediately before any + /// canonical mutation. Implementations must not perform async or I/O work. + bool isActiveAccountScope({ + required CloudSyncScope scope, + required int generation, + }); + + bool entityExists({ + required CloudSyncScope scope, + required int generation, + required CloudEntityKind kind, + required String logicalEntityKeyHash, + }); + + CloudCanonicalSemanticMutationReceipt applyEntity({ + required CloudSyncScope scope, + required int generation, + required CloudSemanticEntityPayload payload, + required CloudSemanticSnapshot snapshot, + }); + + CloudCanonicalSemanticMutationReceipt applyTombstone({ + required CloudSyncScope scope, + required int generation, + required CloudSemanticTombstone tombstone, + }); +} + +enum _SemanticReplayOutcome { applied, appliedWithConflict, quarantined } + +enum _SemanticTransactionPhase { open, appliedTerminal, quarantinedTerminal } + +/// Durable ObjectBox implementation of [CloudSemanticStoreGateway]. +/// +/// This gateway remains default-off outside the separately compile-gated +/// manual semantic pull canary. When enabled, it fences the active account, +/// coordinator lease, checkpoint, and exact inbox row inside the same +/// ObjectBox write transaction as canonical state, snapshot metadata, record +/// mapping, replay outcome, and inbox terminal status. +final class ObjectBoxCloudSemanticStoreGateway + implements CloudSemanticStoreGateway { + ObjectBoxCloudSemanticStoreGateway({ + required Store store, + required CloudCanonicalSemanticEntityAdapter canonicalAdapter, + DateTime Function()? clock, + this._allowTombstones = false, + }) : _store = store, + _canonicalAdapter = canonicalAdapter, + _clock = clock ?? DateTime.now, + _checkpoints = store.box(), + _inbox = store.box(), + _leases = store.box(), + _recordMaps = store.box(), + _snapshots = store.box(), + _replay = store.box() { + if (!identical(canonicalAdapter.store, store)) { + throw ArgumentError('canonical_adapter_store_mismatch'); + } + } + + factory ObjectBoxCloudSemanticStoreGateway.fromDatabase({ + required CloudCanonicalSemanticEntityAdapter canonicalAdapter, + DateTime Function()? clock, + bool allowTombstones = false, + }) { + return ObjectBoxCloudSemanticStoreGateway( + store: Database.store, + canonicalAdapter: canonicalAdapter, + clock: clock, + allowTombstones: allowTombstones, + ); + } + + static const int _maximumEditParts = 1024; + static const int _maximumEditPartsBytes = 256 * 1024; + static const int _nullDateSentinel = -9223372036854775808; + static final RegExp _safeCodePattern = RegExp(r'^[a-z0-9][a-z0-9_-]{0,95}$'); + static final RegExp _base64UrlDigestPattern = RegExp(r'^[A-Za-z0-9_-]{43}$'); + static final RegExp _lowerHexDigestPattern = RegExp(r'^[0-9a-f]{64}$'); + static final RegExp _protectedReferencePattern = RegExp( + r'^obcs2\.ref\.[A-Za-z0-9_-]{43}$', + ); + static final HashSet _activeStores = HashSet.identity(); + + final Store _store; + final CloudCanonicalSemanticEntityAdapter _canonicalAdapter; + final DateTime Function() _clock; + final bool _allowTombstones; + final Box _checkpoints; + final Box _inbox; + final Box _leases; + final Box _recordMaps; + final Box _snapshots; + final Box _replay; + + @override + Future writeTransaction({ + required CloudInboxEntry entry, + required CloudCoordinatorLeaseFence leaseFence, + required T Function(CloudSemanticStoreTransaction transaction) action, + }) { + _validateEntryContext(entry, leaseFence); + if (!_activeStores.add(_store)) { + throw _failure('semantic_nested_transaction_forbidden'); + } + + try { + final context = _SemanticTransactionContext.prepare( + entry: entry, + leaseFence: leaseFence, + ); + final result = _store.runInTransaction(TxMode.write, () { + // Sample time only after ObjectBox grants the write transaction. A + // process can wait behind another writer long enough for its lease to + // expire, so a pre-lock timestamp is not a truthful fencing check. + final updatedAtMs = _clock().toUtc().millisecondsSinceEpoch; + final durable = _validateDurableFenceLocked( + context: context, + nowMs: updatedAtMs, + ); + final transaction = _ObjectBoxCloudSemanticStoreTransaction( + context: context, + updatedAtMs: updatedAtMs, + inboxEntity: durable.inbox, + checkpointEntity: durable.checkpoint, + checkpoints: _checkpoints, + inbox: _inbox, + recordMaps: _recordMaps, + snapshots: _snapshots, + replay: _replay, + canonicalAdapter: _canonicalAdapter, + allowTombstones: _allowTombstones, + ); + try { + final value = action(transaction); + if (value is Future) { + throw _failure('semantic_async_transaction_forbidden'); + } + transaction.validateCompletion(); + return value; + } finally { + transaction.invalidate(); + } + }); + return Future.value(result); + } on CloudSyncFailure catch (failure) { + return Future.error(failure); + } catch (_) { + return Future.error(_failure('semantic_canonical_write_failed')); + } finally { + _activeStores.remove(_store); + } + } + + _DurableSemanticFence _validateDurableFenceLocked({ + required _SemanticTransactionContext context, + required int nowMs, + }) { + final leaseQuery = + _leases + .query(CloudSyncLeaseEntity_.leaseKey.equals(context.leaseKey)) + .build() + ..limit = 1; + final CloudSyncLeaseEntity? lease; + try { + lease = leaseQuery.findFirst(); + } finally { + leaseQuery.close(); + } + if (lease == null || + lease.scopeKey != context.scopeKey || + lease.accountFingerprint != context.entry.scope.accountFingerprint || + lease.ownerIdHash != context.ownerIdHash || + lease.generation != context.leaseFence.generation || + lease.expiresAtMs <= nowMs) { + throw _failure('semantic_coordinator_lease_fence_lost'); + } + + final checkpointQuery = + _checkpoints + .query( + CloudSyncCheckpointEntity_.checkpointKey.equals(context.scopeKey), + ) + .build() + ..limit = 1; + final CloudSyncCheckpointEntity? checkpoint; + try { + checkpoint = checkpointQuery.findFirst(); + } finally { + checkpointQuery.close(); + } + if (checkpoint == null || + checkpoint.checkpointKey != context.scopeKey || + checkpoint.accountFingerprint != + context.entry.scope.accountFingerprint || + checkpoint.container != context.entry.scope.container || + checkpoint.database != context.entry.scope.database || + checkpoint.zone != context.entry.scope.zone || + checkpoint.streamKind != context.entry.scope.streamKind.name || + checkpoint.schemaVersion != context.entry.scope.schemaVersion || + checkpoint.generation != context.entry.generation || + checkpoint.appliedSequence < 0 || + checkpoint.appliedSequence > checkpoint.fetchedSequence || + checkpoint.fetchedSequence < context.entry.sequence) { + throw _failure('semantic_checkpoint_fence_lost'); + } + + final inboxQuery = + _inbox + .query(CloudInboxChangeEntity_.changeKey.equals(context.changeKey)) + .build() + ..limit = 1; + final CloudInboxChangeEntity? inbox; + try { + inbox = inboxQuery.findFirst(); + } finally { + inboxQuery.close(); + } + final change = context.entry.change; + if (inbox == null || + inbox.changeKey != context.changeKey || + inbox.changeIdHash != change.changeId || + inbox.scopeKey != context.scopeKey || + inbox.accountFingerprint != context.entry.scope.accountFingerprint || + inbox.zone != context.entry.scope.zone || + inbox.serverRecordIdHash != change.recordIdHash || + inbox.etagHash != change.etagHash || + inbox.changeType != change.type.name || + inbox.encryptedServerRecordId != change.encryptedServerRecordId || + inbox.protectedSystemFieldsRef != + change.protectedSystemFieldsReference || + inbox.encryptedPayloadRef != change.encryptedPayloadReference || + inbox.payloadSha256 != change.payloadSha256 || + inbox.batchId != context.entry.batchId || + inbox.generation != context.entry.generation || + inbox.fetchSequence != context.entry.sequence || + inbox.status != CloudInboxStatus.pending.index || + inbox.isTombstone != change.isTombstone) { + throw _failure('semantic_inbox_fence_lost'); + } + + if (!_canonicalAdapter.isActiveAccountScope( + scope: context.entry.scope, + generation: context.entry.generation, + )) { + throw CloudSyncFailure( + category: CloudFailureCategory.authorization, + safeCode: 'semantic_active_account_scope_changed', + ); + } + return _DurableSemanticFence(checkpoint: checkpoint, inbox: inbox); + } + + static void _validateEntryContext( + CloudInboxEntry entry, + CloudCoordinatorLeaseFence leaseFence, + ) { + _validateExternalDigest(entry.scope.accountFingerprint); + _validateExternalDigest(entry.change.changeId); + _validateExternalDigest(entry.change.recordIdHash); + _validateOptionalExternalDigest(entry.change.etagHash); + _validateOptionalContentDigest(entry.change.payloadSha256); + _validateProtectedReference(entry.change.encryptedServerRecordId); + _validateProtectedReference(entry.change.protectedSystemFieldsReference); + _validateProtectedReference(entry.change.encryptedPayloadReference); + if (entry.change.encryptedServerRecordId == null || + entry.change.encryptedPayloadReference == null) { + throw _malformed('semantic_protected_reference_missing'); + } + if (entry.sequence <= 0 || + entry.generation <= 0 || + entry.status != CloudInboxStatus.pending || + entry.batchId.isEmpty || + entry.batchId.length > 256 || + leaseFence.ownerId.isEmpty || + leaseFence.ownerId.length > 256 || + leaseFence.generation <= 0) { + throw _failure('semantic_transaction_context_invalid'); + } + } + + static void _validateProtectedReference(String? value) { + if (value == null) return; + if (!_protectedReferencePattern.hasMatch(value)) { + throw _malformed('semantic_protected_reference_invalid'); + } + } + + static void _validateOptionalExternalDigest(String? value) { + if (value != null) _validateExternalDigest(value); + } + + static void _validateOptionalContentDigest(String? value) { + if (value != null) _validateContentDigest(value); + } + + static void _validateExternalDigest(String value) { + if (!_base64UrlDigestPattern.hasMatch(value)) { + throw _malformed('semantic_digest_invalid'); + } + } + + static void _validateContentDigest(String value) { + if (!_base64UrlDigestPattern.hasMatch(value) && + !_lowerHexDigestPattern.hasMatch(value)) { + throw _malformed('semantic_digest_invalid'); + } + } + + static CloudSyncFailure _failure(String safeCode) => CloudSyncFailure( + category: CloudFailureCategory.localStorage, + safeCode: safeCode, + ); + + static CloudSyncFailure _malformed(String safeCode) => CloudSyncFailure( + category: CloudFailureCategory.malformedRecord, + safeCode: safeCode, + ); +} + +final class _DurableSemanticFence { + const _DurableSemanticFence({required this.checkpoint, required this.inbox}); + + final CloudSyncCheckpointEntity checkpoint; + final CloudInboxChangeEntity inbox; +} + +final class _SemanticTransactionContext { + const _SemanticTransactionContext({ + required this.entry, + required this.leaseFence, + required this.scopeKey, + required this.scopeGenerationKey, + required this.changeKey, + required this.changeIdHash, + required this.leaseKey, + required this.ownerIdHash, + required this.payloadReferenceHash, + required this.replayKey, + }); + + factory _SemanticTransactionContext.prepare({ + required CloudInboxEntry entry, + required CloudCoordinatorLeaseFence leaseFence, + }) { + final scopeKey = 'scope2:${_digest(entry.scope.storageKey)}'; + final scopeGenerationKey = + 'semantic-generation4:${_digest('$scopeKey\u001f${entry.generation}')}'; + final changeIdHash = _digest(entry.change.changeId); + final payloadReferenceHash = entry.change.encryptedPayloadReference == null + ? null + : _digest( + 'semantic-payload-reference\u001f' + '${entry.change.encryptedPayloadReference}', + ); + return _SemanticTransactionContext( + entry: entry, + leaseFence: leaseFence, + scopeKey: scopeKey, + scopeGenerationKey: scopeGenerationKey, + changeKey: _scopedDigest(entry.scope, 'change', entry.change.changeId), + changeIdHash: changeIdHash, + leaseKey: _scopedDigest(entry.scope, 'coordinator-lease', 'v1'), + ownerIdHash: _digest('coordinator-owner\u001f${leaseFence.ownerId}'), + payloadReferenceHash: payloadReferenceHash, + replayKey: 'semantic-replay4:$scopeGenerationKey:$changeIdHash', + ); + } + + final CloudInboxEntry entry; + final CloudCoordinatorLeaseFence leaseFence; + final String scopeKey; + final String scopeGenerationKey; + final String changeKey; + final String changeIdHash; + final String leaseKey; + final String ownerIdHash; + final String? payloadReferenceHash; + final String replayKey; + + String snapshotKey(CloudEntityKind kind, String logicalEntityKeyHash) => + 'semantic-snapshot4:$scopeGenerationKey:${kind.name}:' + '$logicalEntityKeyHash'; + + String recordMapKey(String logicalEntityKeyHash) => + _scopedDigest(entry.scope, 'record-map', logicalEntityKeyHash); + + static String _scopedDigest( + CloudSyncScope scope, + String purpose, + String value, + ) => '$purpose:${_digest('${scope.storageKey}\u001f$purpose\u001f$value')}'; + + static String _digest(String value) => + sha256.convert(utf8.encode(value)).toString(); +} + +final class _ObjectBoxCloudSemanticStoreTransaction + implements CloudSemanticStoreTransaction { + _ObjectBoxCloudSemanticStoreTransaction({ + required this._context, + required this._updatedAtMs, + required this._inboxEntity, + required this._checkpointEntity, + required this._checkpoints, + required this._inbox, + required this._recordMaps, + required this._snapshots, + required this._replay, + required this._canonicalAdapter, + required this._allowTombstones, + }); + + final _SemanticTransactionContext _context; + final int _updatedAtMs; + final CloudInboxChangeEntity _inboxEntity; + final CloudSyncCheckpointEntity _checkpointEntity; + final Box _checkpoints; + final Box _inbox; + final Box _recordMaps; + final Box _snapshots; + final Box _replay; + final CloudCanonicalSemanticEntityAdapter _canonicalAdapter; + final bool _allowTombstones; + + bool _active = true; + bool _canonicalMutationPerformed = false; + bool _recordMapWritten = false; + _SemanticTransactionPhase _phase = _SemanticTransactionPhase.open; + String? _boundLogicalEntityKeyHash; + String? _pendingConflictSafeCode; + + @override + CloudSyncScope get activeScope { + _ensureActive(); + return _context.entry.scope; + } + + @override + int get activeGeneration { + _ensureActive(); + return _context.entry.generation; + } + + @override + bool hasAppliedChange(String changeId) { + _ensureActive(); + _requireActiveChange(changeId); + final entity = _findReplay(); + if (entity == null) return false; + _validateReplayScope(entity); + final outcome = _replayOutcome(entity.terminalOutcome); + return outcome == _SemanticReplayOutcome.applied || + outcome == _SemanticReplayOutcome.appliedWithConflict; + } + + @override + CloudSemanticSnapshot? readSnapshot({ + required CloudEntityKind kind, + required String logicalEntityKeyHash, + }) { + _ensureActive(); + _validateEntityKindForStream(kind); + _validateHashedValue(logicalEntityKeyHash); + final entity = _findSnapshot( + _context.snapshotKey(kind, logicalEntityKeyHash), + ); + if (entity == null) return null; + _validateSnapshotScope( + entity, + expectedKind: kind, + expectedLogicalKeyHash: logicalEntityKeyHash, + ); + return _snapshotFromEntity(entity); + } + + @override + bool entityExists({ + required CloudEntityKind kind, + required String logicalEntityKeyHash, + }) { + _ensureActive(); + _validateHashedValue(logicalEntityKeyHash); + if (_context.entry.scope.streamKind != CloudSyncStreamKind.messages || + (kind != CloudEntityKind.chat && kind != CloudEntityKind.message)) { + throw ObjectBoxCloudSemanticStoreGateway._malformed( + 'semantic_parent_kind_invalid', + ); + } + return _canonicalAdapter.entityExists( + scope: _context.entry.scope, + generation: _context.entry.generation, + kind: kind, + logicalEntityKeyHash: logicalEntityKeyHash, + ); + } + + @override + void bindRecordIdentity({ + required String logicalEntityKeyHash, + String? encryptedRawRecordReference, + }) { + _ensureActive(); + _ensureOpen(); + _validateHashedValue(logicalEntityKeyHash); + ObjectBoxCloudSemanticStoreGateway._validateProtectedReference( + encryptedRawRecordReference, + ); + final expectedRawReference = + _context.entry.change.encryptedPayloadReference!; + if (encryptedRawRecordReference != expectedRawReference) { + throw CloudSyncFailure( + category: CloudFailureCategory.malformedRecord, + safeCode: 'semantic_raw_record_reference_mismatch', + ); + } + if (_boundLogicalEntityKeyHash != null && + _boundLogicalEntityKeyHash != logicalEntityKeyHash) { + throw ObjectBoxCloudSemanticStoreGateway._failure( + 'semantic_record_binding_changed', + ); + } + + final mapKey = _context.recordMapKey(logicalEntityKeyHash); + final existing = _findRecordMapByKey(mapKey); + if (existing != null) { + _validateRecordMapScope(existing, logicalEntityKeyHash); + if (existing.serverRecordIdHash != _context.entry.change.recordIdHash) { + throw CloudSyncFailure( + category: CloudFailureCategory.conflict, + safeCode: 'semantic_record_mapping_conflict', + ); + } + } + + final collisions = _findRecordMapsByServerHash( + _context.entry.change.recordIdHash, + ); + for (final collision in collisions) { + if (collision.mapKey != mapKey || + collision.logicalEntityKeyHash != logicalEntityKeyHash) { + throw CloudSyncFailure( + category: CloudFailureCategory.conflict, + safeCode: 'semantic_record_mapping_conflict', + ); + } + } + + final encryptedServerRecordId = + _context.entry.change.encryptedServerRecordId!; + _recordMaps.put( + CloudRecordMapEntity( + id: existing?.id ?? 0, + mapKey: mapKey, + scopeKey: _context.scopeKey, + accountFingerprint: _context.entry.scope.accountFingerprint, + zone: _context.entry.scope.zone, + logicalEntityKeyHash: logicalEntityKeyHash, + serverRecordIdHash: _context.entry.change.recordIdHash, + encryptedServerRecordId: encryptedServerRecordId, + etagHash: _context.entry.change.etagHash, + encryptedRawRecordRef: expectedRawReference, + updatedAtMs: _updatedAtMs, + ), + ); + _recordMapWritten = true; + _boundLogicalEntityKeyHash = logicalEntityKeyHash; + } + + @override + void applyEntity({ + required CloudSemanticEntityPayload payload, + required CloudSemanticSnapshot snapshot, + }) { + _ensureActive(); + _ensureOpen(); + if (_canonicalMutationPerformed) { + throw ObjectBoxCloudSemanticStoreGateway._failure( + 'semantic_multiple_canonical_mutations_forbidden', + ); + } + if (payload.kind != snapshot.kind || + payload.logicalEntityKeyHash != snapshot.logicalEntityKeyHash) { + throw ObjectBoxCloudSemanticStoreGateway._malformed( + 'semantic_payload_snapshot_mismatch', + ); + } + _validateEntityKindForStream(snapshot.kind); + _validatePayloadParent(payload, snapshot); + _validateSnapshot(snapshot); + bindRecordIdentity( + logicalEntityKeyHash: snapshot.logicalEntityKeyHash, + encryptedRawRecordReference: snapshot.encryptedRawRecordReference, + ); + final receipt = _canonicalAdapter.applyEntity( + scope: _context.entry.scope, + generation: _context.entry.generation, + payload: payload, + snapshot: snapshot, + ); + if (receipt != CloudCanonicalSemanticMutationReceipt.committed) { + throw ObjectBoxCloudSemanticStoreGateway._failure( + 'semantic_canonical_apply_uncommitted', + ); + } + _canonicalMutationPerformed = true; + + final key = _context.snapshotKey( + snapshot.kind, + snapshot.logicalEntityKeyHash, + ); + final existing = _findSnapshot(key); + if (existing != null) { + _validateSnapshotScope( + existing, + expectedKind: snapshot.kind, + expectedLogicalKeyHash: snapshot.logicalEntityKeyHash, + ); + } + _snapshots.put( + _snapshotEntity( + snapshot, + snapshotKey: key, + existingId: existing?.id ?? 0, + ), + ); + } + + @override + void applyTombstone(CloudSemanticTombstone tombstone) { + _ensureActive(); + _ensureOpen(); + if (_canonicalMutationPerformed) { + throw ObjectBoxCloudSemanticStoreGateway._failure( + 'semantic_multiple_canonical_mutations_forbidden', + ); + } + if (!_allowTombstones) { + throw CloudSyncFailure( + category: CloudFailureCategory.conflict, + safeCode: 'semantic_tombstones_disabled', + ); + } + if (!tombstone.serverConfirmed || tombstone.deletedAt == null) { + throw CloudSyncFailure( + category: CloudFailureCategory.conflict, + safeCode: 'semantic_tombstone_order_unproven', + ); + } + _validateEntityKindForStream(tombstone.kind); + _validateHashedValue(tombstone.logicalEntityKeyHash); + bindRecordIdentity( + logicalEntityKeyHash: tombstone.logicalEntityKeyHash, + encryptedRawRecordReference: + _context.entry.change.encryptedPayloadReference, + ); + final receipt = _canonicalAdapter.applyTombstone( + scope: _context.entry.scope, + generation: _context.entry.generation, + tombstone: tombstone, + ); + if (receipt != CloudCanonicalSemanticMutationReceipt.committed) { + throw ObjectBoxCloudSemanticStoreGateway._failure( + 'semantic_canonical_tombstone_uncommitted', + ); + } + _canonicalMutationPerformed = true; + final existing = _findSnapshot( + _context.snapshotKey(tombstone.kind, tombstone.logicalEntityKeyHash), + ); + if (existing != null) { + _validateSnapshotScope( + existing, + expectedKind: tombstone.kind, + expectedLogicalKeyHash: tombstone.logicalEntityKeyHash, + ); + _snapshots.remove(existing.id); + } + } + + @override + void markChangeApplied(String changeId) { + _ensureActive(); + _ensureOpen(); + _requireActiveChange(changeId); + final existing = _findReplay(); + if (existing != null) { + _validateReplayScope(existing); + final existingOutcome = _replayOutcome(existing.terminalOutcome); + if (existingOutcome == _SemanticReplayOutcome.quarantined) { + throw CloudSyncFailure( + category: CloudFailureCategory.conflict, + safeCode: 'semantic_replay_terminal_conflict', + ); + } + _writeInboxTerminal(existingOutcome); + _phase = _SemanticTransactionPhase.appliedTerminal; + return; + } + final logicalEntityKeyHash = _boundLogicalEntityKeyHash; + if (logicalEntityKeyHash == null) { + throw ObjectBoxCloudSemanticStoreGateway._failure( + 'semantic_record_binding_missing', + ); + } + final outcome = _pendingConflictSafeCode == null + ? _SemanticReplayOutcome.applied + : _SemanticReplayOutcome.appliedWithConflict; + _replay.put( + _newReplayEntity( + outcome: outcome, + terminalSafeCode: _pendingConflictSafeCode, + logicalEntityKeyHash: logicalEntityKeyHash, + ), + ); + _writeInboxTerminal(outcome); + _phase = _SemanticTransactionPhase.appliedTerminal; + } + + @override + void quarantineChange(String changeId, String safeCode) { + _ensureActive(); + _ensureOpen(); + _requireActiveChange(changeId); + _validateSafeCode(safeCode); + if (_canonicalMutationPerformed || _recordMapWritten) { + throw CloudSyncFailure( + category: CloudFailureCategory.conflict, + safeCode: 'semantic_quarantine_after_mutation_forbidden', + ); + } + final existing = _findReplay(); + if (existing != null) { + _validateReplayScope(existing); + if (_replayOutcome(existing.terminalOutcome) != + _SemanticReplayOutcome.quarantined || + existing.terminalSafeCode != safeCode) { + throw CloudSyncFailure( + category: CloudFailureCategory.conflict, + safeCode: 'semantic_replay_terminal_conflict', + ); + } + } else { + _replay.put( + _newReplayEntity( + outcome: _SemanticReplayOutcome.quarantined, + terminalSafeCode: safeCode, + logicalEntityKeyHash: _boundLogicalEntityKeyHash, + ), + ); + } + _writeInboxTerminal(_SemanticReplayOutcome.quarantined); + _phase = _SemanticTransactionPhase.quarantinedTerminal; + } + + @override + void recordConflict(String changeId, String safeCode) { + _ensureActive(); + _ensureOpen(); + _requireActiveChange(changeId); + _validateSafeCode(safeCode); + if (_pendingConflictSafeCode != null && + _pendingConflictSafeCode != safeCode) { + throw CloudSyncFailure( + category: CloudFailureCategory.conflict, + safeCode: 'semantic_replay_terminal_conflict', + ); + } + _pendingConflictSafeCode = safeCode; + } + + void validateCompletion() { + _ensureActive(); + if ((_canonicalMutationPerformed || _recordMapWritten) && + _phase == _SemanticTransactionPhase.open) { + throw ObjectBoxCloudSemanticStoreGateway._failure( + 'semantic_terminal_outcome_missing', + ); + } + if (_phase != _SemanticTransactionPhase.open && + _inboxEntity.status == CloudInboxStatus.pending.index) { + throw ObjectBoxCloudSemanticStoreGateway._failure( + 'semantic_inbox_terminal_missing', + ); + } + } + + void invalidate() { + _active = false; + } + + void _ensureActive() { + if (!_active) { + throw ObjectBoxCloudSemanticStoreGateway._failure( + 'semantic_transaction_inactive', + ); + } + } + + void _ensureOpen() { + if (_phase != _SemanticTransactionPhase.open) { + throw ObjectBoxCloudSemanticStoreGateway._failure( + 'semantic_transaction_terminal', + ); + } + } + + void _writeInboxTerminal(_SemanticReplayOutcome outcome) { + final alreadyApplied = + _inboxEntity.status == CloudInboxStatus.applied.index; + final alreadyQuarantined = + _inboxEntity.status == CloudInboxStatus.quarantined.index; + if (outcome == _SemanticReplayOutcome.quarantined) { + if (alreadyApplied) { + throw CloudSyncFailure( + category: CloudFailureCategory.conflict, + safeCode: 'semantic_inbox_terminal_conflict', + ); + } + _inboxEntity + ..status = CloudInboxStatus.quarantined.index + ..retryCount += alreadyQuarantined ? 0 : 1 + ..failureCategory = CloudFailureCategory.conflict.name + ..nextEligibleAtMs = 0 + ..completedAtMs = _updatedAtMs + ..updatedAtMs = _updatedAtMs; + _inbox.put(_inboxEntity); + _advanceContiguousApplied(); + return; + } + if (alreadyQuarantined) { + throw CloudSyncFailure( + category: CloudFailureCategory.conflict, + safeCode: 'semantic_inbox_terminal_conflict', + ); + } + _inboxEntity + ..status = CloudInboxStatus.applied.index + ..failureCategory = null + ..nextEligibleAtMs = 0 + ..completedAtMs = _updatedAtMs + ..updatedAtMs = _updatedAtMs; + _inbox.put(_inboxEntity); + _advanceContiguousApplied(); + } + + void _advanceContiguousApplied() { + var next = _checkpointEntity.appliedSequence + 1; + while (next <= _checkpointEntity.fetchedSequence) { + final query = + _inbox + .query( + CloudInboxChangeEntity_.scopeKey + .equals(_context.scopeKey) + .and(CloudInboxChangeEntity_.fetchSequence.equals(next)), + ) + .build() + ..limit = 2; + final List rows; + try { + rows = query.find(); + } finally { + query.close(); + } + if (rows.length > 1) { + throw ObjectBoxCloudSemanticStoreGateway._failure( + 'semantic_inbox_sequence_ambiguous', + ); + } + if (rows.isEmpty) break; + final row = rows.single; + if (row.scopeKey != _context.scopeKey || + row.accountFingerprint != _context.entry.scope.accountFingerprint || + row.generation != _context.entry.generation || + row.fetchSequence != next) { + throw ObjectBoxCloudSemanticStoreGateway._failure( + 'semantic_inbox_sequence_scope_mismatch', + ); + } + if (row.status != CloudInboxStatus.applied.index && + row.status != CloudInboxStatus.quarantined.index) { + break; + } + next++; + } + final appliedThrough = next - 1; + if (appliedThrough > _checkpointEntity.fetchedSequence) { + throw ObjectBoxCloudSemanticStoreGateway._failure( + 'semantic_checkpoint_advance_invalid', + ); + } + if (appliedThrough != _checkpointEntity.appliedSequence) { + _checkpointEntity + ..appliedSequence = appliedThrough + ..updatedAtMs = _updatedAtMs; + _checkpoints.put(_checkpointEntity); + } + } + + CloudSemanticReplayEntity _newReplayEntity({ + required _SemanticReplayOutcome outcome, + required String? terminalSafeCode, + required String? logicalEntityKeyHash, + }) { + final scope = _context.entry.scope; + return CloudSemanticReplayEntity( + replayKey: _context.replayKey, + scopeGenerationKey: _context.scopeGenerationKey, + scopeKey: _context.scopeKey, + accountFingerprint: scope.accountFingerprint, + container: scope.container, + database: scope.database, + zone: scope.zone, + streamKind: scope.streamKind.name, + schemaVersion: scope.schemaVersion, + generation: _context.entry.generation, + changeIdHash: _context.changeIdHash, + serverRecordIdHash: _context.entry.change.recordIdHash, + logicalEntityKeyHash: logicalEntityKeyHash, + payloadSha256: _context.entry.change.payloadSha256, + protectedPayloadReferenceHash: _context.payloadReferenceHash, + inboxSequence: _context.entry.sequence, + changeType: _context.entry.change.type.name, + terminalOutcome: outcome.name, + terminalSafeCode: terminalSafeCode, + updatedAtMs: _updatedAtMs, + ); + } + + CloudSemanticSnapshotEntity _snapshotEntity( + CloudSemanticSnapshot snapshot, { + required String snapshotKey, + required int existingId, + }) { + final scope = _context.entry.scope; + return CloudSemanticSnapshotEntity( + id: existingId, + snapshotKey: snapshotKey, + scopeGenerationKey: _context.scopeGenerationKey, + scopeKey: _context.scopeKey, + accountFingerprint: scope.accountFingerprint, + container: scope.container, + database: scope.database, + zone: scope.zone, + streamKind: scope.streamKind.name, + schemaVersion: scope.schemaVersion, + generation: _context.entry.generation, + entityKind: snapshot.kind.name, + logicalEntityKeyHash: snapshot.logicalEntityKeyHash, + parentLogicalKeyHash: snapshot.parentLogicalKeyHash, + immutableContentDigest: snapshot.immutableContentDigest, + createdAtMs: _millisecondsOrSentinel(snapshot.createdAt), + readAtMs: _millisecondsOrSentinel(snapshot.readAt), + deliveredAtMs: _millisecondsOrSentinel(snapshot.deliveredAt), + editPartsJson: _encodeEditParts(snapshot.editParts), + retractedAtMs: _millisecondsOrSentinel(snapshot.retractedAt), + groupVersion: snapshot.groupVersion, + groupMetadataDigest: snapshot.groupMetadataDigest, + etagHash: snapshot.etagHash, + updatedAtMs: _updatedAtMs, + ); + } + + CloudSemanticSnapshot _snapshotFromEntity( + CloudSemanticSnapshotEntity entity, + ) { + final recordMap = _findRecordMapByKey( + _context.recordMapKey(entity.logicalEntityKeyHash), + ); + if (recordMap != null) { + _validateRecordMapScope(recordMap, entity.logicalEntityKeyHash); + } + return CloudSemanticSnapshot( + kind: _entityKind(entity.entityKind), + logicalEntityKeyHash: entity.logicalEntityKeyHash, + parentLogicalKeyHash: entity.parentLogicalKeyHash, + immutableContentDigest: entity.immutableContentDigest, + createdAt: _dateOrNull(entity.createdAtMs), + readAt: _dateOrNull(entity.readAtMs), + deliveredAt: _dateOrNull(entity.deliveredAtMs), + editParts: _decodeEditParts(entity.editPartsJson), + retractedAt: _dateOrNull(entity.retractedAtMs), + groupVersion: entity.groupVersion, + groupMetadataDigest: entity.groupMetadataDigest, + etagHash: entity.etagHash, + encryptedRawRecordReference: recordMap?.encryptedRawRecordRef, + ); + } + + CloudSemanticSnapshotEntity? _findSnapshot(String snapshotKey) { + final query = + _snapshots + .query(CloudSemanticSnapshotEntity_.snapshotKey.equals(snapshotKey)) + .build() + ..limit = 1; + try { + return query.findFirst(); + } finally { + query.close(); + } + } + + CloudSemanticReplayEntity? _findReplay() { + final query = + _replay + .query( + CloudSemanticReplayEntity_.replayKey.equals(_context.replayKey), + ) + .build() + ..limit = 1; + try { + return query.findFirst(); + } finally { + query.close(); + } + } + + CloudRecordMapEntity? _findRecordMapByKey(String mapKey) { + final query = + _recordMaps.query(CloudRecordMapEntity_.mapKey.equals(mapKey)).build() + ..limit = 1; + try { + return query.findFirst(); + } finally { + query.close(); + } + } + + List _findRecordMapsByServerHash( + String serverRecordIdHash, + ) { + final query = _recordMaps + .query( + CloudRecordMapEntity_.scopeKey + .equals(_context.scopeKey) + .and( + CloudRecordMapEntity_.serverRecordIdHash.equals( + serverRecordIdHash, + ), + ), + ) + .build(); + try { + return query.find(); + } finally { + query.close(); + } + } + + void _validateRecordMapScope( + CloudRecordMapEntity entity, + String logicalEntityKeyHash, + ) { + final scope = _context.entry.scope; + ObjectBoxCloudSemanticStoreGateway._validateExternalDigest( + entity.serverRecordIdHash, + ); + ObjectBoxCloudSemanticStoreGateway._validateProtectedReference( + entity.encryptedServerRecordId, + ); + ObjectBoxCloudSemanticStoreGateway._validateOptionalExternalDigest( + entity.etagHash, + ); + ObjectBoxCloudSemanticStoreGateway._validateProtectedReference( + entity.encryptedRawRecordRef, + ); + if (entity.mapKey != _context.recordMapKey(logicalEntityKeyHash) || + entity.scopeKey != _context.scopeKey || + entity.accountFingerprint != scope.accountFingerprint || + entity.zone != scope.zone || + entity.logicalEntityKeyHash != logicalEntityKeyHash) { + throw ObjectBoxCloudSemanticStoreGateway._failure( + 'semantic_record_map_scope_mismatch', + ); + } + } + + void _validateSnapshot(CloudSemanticSnapshot snapshot) { + _validateHashedValue(snapshot.logicalEntityKeyHash); + _validateOptionalHashedValue(snapshot.parentLogicalKeyHash); + _validateOptionalContentDigest(snapshot.immutableContentDigest); + _validateOptionalContentDigest(snapshot.groupMetadataDigest); + ObjectBoxCloudSemanticStoreGateway._validateOptionalExternalDigest( + snapshot.etagHash, + ); + ObjectBoxCloudSemanticStoreGateway._validateProtectedReference( + snapshot.encryptedRawRecordReference, + ); + if (snapshot.encryptedRawRecordReference != + _context.entry.change.encryptedPayloadReference || + snapshot.etagHash != _context.entry.change.etagHash) { + throw ObjectBoxCloudSemanticStoreGateway._malformed( + 'semantic_snapshot_envelope_mismatch', + ); + } + if (snapshot.editParts.length > + ObjectBoxCloudSemanticStoreGateway._maximumEditParts) { + throw ObjectBoxCloudSemanticStoreGateway._malformed( + 'semantic_edit_parts_oversized', + ); + } + for (final entry in snapshot.editParts.entries) { + _validateHashedValue(entry.key); + _validateHashedValue(entry.value.partKeyHash); + _validateContentDigest(entry.value.contentDigest); + if (entry.key != entry.value.partKeyHash || entry.value.revision < 0) { + throw ObjectBoxCloudSemanticStoreGateway._malformed( + 'semantic_edit_part_invalid', + ); + } + } + } + + void _validatePayloadParent( + CloudSemanticEntityPayload payload, + CloudSemanticSnapshot snapshot, + ) { + final expectedParent = switch (payload) { + CloudMessageEntityPayload value => value.replyParentLogicalKeyHash, + CloudAttachmentEntityPayload value => value.ownerLogicalKeyHash, + CloudReactionEntityPayload value => value.parentLogicalKeyHash, + CloudGroupPhotoEntityPayload value => value.ownerLogicalKeyHash, + _ => null, + }; + if (expectedParent != null && + snapshot.parentLogicalKeyHash != expectedParent) { + throw CloudSyncFailure( + category: CloudFailureCategory.malformedRecord, + safeCode: 'semantic_parent_identity_mismatch', + ); + } + if (expectedParent == null && snapshot.parentLogicalKeyHash != null) { + throw CloudSyncFailure( + category: CloudFailureCategory.malformedRecord, + safeCode: 'semantic_parent_identity_invalid', + ); + } + final (CloudEntityKind, String)? requiredParent = switch (payload) { + CloudMessageEntityPayload value + when value.replyParentLogicalKeyHash != null => + (CloudEntityKind.message, value.replyParentLogicalKeyHash!), + CloudMessageEntityPayload _ => null, + CloudAttachmentEntityPayload value + when value.ownerLogicalKeyHash != null => + (CloudEntityKind.message, value.ownerLogicalKeyHash!), + CloudAttachmentEntityPayload _ => null, + CloudReactionEntityPayload value => ( + CloudEntityKind.message, + value.parentLogicalKeyHash, + ), + CloudGroupPhotoEntityPayload value => ( + CloudEntityKind.chat, + value.ownerLogicalKeyHash, + ), + _ => null, + }; + if (requiredParent != null) { + _validateHashedValue(requiredParent.$2); + if (!_canonicalAdapter.entityExists( + scope: _context.entry.scope, + generation: _context.entry.generation, + kind: requiredParent.$1, + logicalEntityKeyHash: requiredParent.$2, + )) { + throw CloudSyncFailure( + category: CloudFailureCategory.dependency, + safeCode: 'semantic_parent_missing', + ); + } + } + if (payload case CloudMessageEntityPayload value) { + _validateHashedValue(value.chatAliasKeyHash); + } + } + + void _validateEntityKindForStream(CloudEntityKind kind) { + final scope = _context.entry.scope; + final allowed = switch (scope.streamKind) { + CloudSyncStreamKind.messages => switch (scope.zone) { + 'chatManateeZone' => + kind == CloudEntityKind.chat || kind == CloudEntityKind.groupPhoto, + 'messageManateeZone' => + kind == CloudEntityKind.message || kind == CloudEntityKind.reaction, + 'attachmentManateeZone' => kind == CloudEntityKind.attachment, + _ => false, + }, + CloudSyncStreamKind.profiles => kind == CloudEntityKind.sharedProfile, + }; + if (!allowed) { + throw CloudSyncFailure( + category: CloudFailureCategory.malformedRecord, + safeCode: 'semantic_stream_entity_mismatch', + ); + } + } + + void _validateSnapshotScope( + CloudSemanticSnapshotEntity entity, { + required CloudEntityKind expectedKind, + required String expectedLogicalKeyHash, + }) { + final scope = _context.entry.scope; + if (entity.scopeGenerationKey != _context.scopeGenerationKey || + entity.scopeKey != _context.scopeKey || + entity.accountFingerprint != scope.accountFingerprint || + entity.container != scope.container || + entity.database != scope.database || + entity.zone != scope.zone || + entity.streamKind != scope.streamKind.name || + entity.schemaVersion != scope.schemaVersion || + entity.generation != _context.entry.generation || + entity.entityKind != expectedKind.name || + entity.logicalEntityKeyHash != expectedLogicalKeyHash) { + throw ObjectBoxCloudSemanticStoreGateway._failure( + 'semantic_snapshot_scope_mismatch', + ); + } + } + + void _validateReplayScope(CloudSemanticReplayEntity entity) { + final scope = _context.entry.scope; + ObjectBoxCloudSemanticStoreGateway._validateOptionalExternalDigest( + entity.logicalEntityKeyHash, + ); + if (entity.replayKey != _context.replayKey || + entity.scopeGenerationKey != _context.scopeGenerationKey || + entity.scopeKey != _context.scopeKey || + entity.accountFingerprint != scope.accountFingerprint || + entity.container != scope.container || + entity.database != scope.database || + entity.zone != scope.zone || + entity.streamKind != scope.streamKind.name || + entity.schemaVersion != scope.schemaVersion || + entity.generation != _context.entry.generation || + entity.changeIdHash != _context.changeIdHash || + entity.serverRecordIdHash != _context.entry.change.recordIdHash || + entity.payloadSha256 != _context.entry.change.payloadSha256 || + entity.protectedPayloadReferenceHash != _context.payloadReferenceHash || + entity.inboxSequence != _context.entry.sequence || + entity.changeType != _context.entry.change.type.name) { + throw ObjectBoxCloudSemanticStoreGateway._failure( + 'semantic_replay_binding_mismatch', + ); + } + final outcome = _replayOutcome(entity.terminalOutcome); + if (outcome != _SemanticReplayOutcome.quarantined) { + final logicalEntityKeyHash = entity.logicalEntityKeyHash; + if (logicalEntityKeyHash == null) { + throw ObjectBoxCloudSemanticStoreGateway._failure( + 'semantic_replay_record_binding_missing', + ); + } + final recordMap = _findRecordMapByKey( + _context.recordMapKey(logicalEntityKeyHash), + ); + if (recordMap == null) { + throw ObjectBoxCloudSemanticStoreGateway._failure( + 'semantic_replay_record_binding_missing', + ); + } + _validateRecordMapScope(recordMap, logicalEntityKeyHash); + if (recordMap.serverRecordIdHash != entity.serverRecordIdHash || + recordMap.encryptedServerRecordId != + _context.entry.change.encryptedServerRecordId || + recordMap.etagHash != _context.entry.change.etagHash || + recordMap.encryptedRawRecordRef != + _context.entry.change.encryptedPayloadReference) { + throw ObjectBoxCloudSemanticStoreGateway._failure( + 'semantic_replay_record_binding_mismatch', + ); + } + } + if ((outcome == _SemanticReplayOutcome.applied && + entity.terminalSafeCode != null) || + (outcome != _SemanticReplayOutcome.applied && + (entity.terminalSafeCode == null || + !ObjectBoxCloudSemanticStoreGateway._safeCodePattern.hasMatch( + entity.terminalSafeCode!, + )))) { + throw ObjectBoxCloudSemanticStoreGateway._failure( + 'semantic_replay_outcome_invalid', + ); + } + } + + void _requireActiveChange(String changeId) { + if (changeId != _context.entry.change.changeId) { + throw ObjectBoxCloudSemanticStoreGateway._failure( + 'semantic_change_context_mismatch', + ); + } + } + + static void _validateSafeCode(String safeCode) { + if (!ObjectBoxCloudSemanticStoreGateway._safeCodePattern.hasMatch( + safeCode, + )) { + throw ObjectBoxCloudSemanticStoreGateway._failure( + 'semantic_safe_code_invalid', + ); + } + } + + static void _validateOptionalHashedValue(String? value) { + if (value != null) _validateHashedValue(value); + } + + static void _validateOptionalContentDigest(String? value) { + if (value != null) _validateContentDigest(value); + } + + static void _validateHashedValue(String value) { + ObjectBoxCloudSemanticStoreGateway._validateExternalDigest(value); + } + + static void _validateContentDigest(String value) { + ObjectBoxCloudSemanticStoreGateway._validateContentDigest(value); + } + + static int _millisecondsOrSentinel(DateTime? value) => + value?.toUtc().millisecondsSinceEpoch ?? + ObjectBoxCloudSemanticStoreGateway._nullDateSentinel; + + static DateTime? _dateOrNull(int value) { + if (value == ObjectBoxCloudSemanticStoreGateway._nullDateSentinel) { + return null; + } + try { + return DateTime.fromMillisecondsSinceEpoch(value, isUtc: true); + } catch (_) { + throw ObjectBoxCloudSemanticStoreGateway._failure( + 'semantic_timestamp_invalid', + ); + } + } + + static String _encodeEditParts(Map parts) { + final keys = parts.keys.toList()..sort(); + final encoded = jsonEncode([ + for (final key in keys) + { + 'mapKeyHash': key, + 'partKeyHash': parts[key]!.partKeyHash, + 'revision': parts[key]!.revision, + 'contentDigest': parts[key]!.contentDigest, + 'modifiedAtMs': parts[key]!.modifiedAt.toUtc().millisecondsSinceEpoch, + }, + ]); + if (utf8.encode(encoded).length > + ObjectBoxCloudSemanticStoreGateway._maximumEditPartsBytes) { + throw ObjectBoxCloudSemanticStoreGateway._malformed( + 'semantic_edit_parts_oversized', + ); + } + return encoded; + } + + static Map _decodeEditParts(String encoded) { + try { + if (utf8.encode(encoded).length > + ObjectBoxCloudSemanticStoreGateway._maximumEditPartsBytes) { + throw const FormatException(); + } + final decoded = jsonDecode(encoded); + if (decoded is! List || + decoded.length > + ObjectBoxCloudSemanticStoreGateway._maximumEditParts) { + throw const FormatException(); + } + final result = {}; + for (final raw in decoded) { + if (raw is! Map || + raw.length != 5 || + raw['mapKeyHash'] is! String || + raw['partKeyHash'] is! String || + raw['revision'] is! int || + raw['contentDigest'] is! String || + raw['modifiedAtMs'] is! int) { + throw const FormatException(); + } + final mapKeyHash = raw['mapKeyHash'] as String; + final partKeyHash = raw['partKeyHash'] as String; + final revision = raw['revision'] as int; + final modifiedAtMs = raw['modifiedAtMs'] as int; + _validateHashedValue(mapKeyHash); + _validateHashedValue(partKeyHash); + _validateHashedValue(raw['contentDigest'] as String); + if (mapKeyHash != partKeyHash || + revision < 0 || + result.containsKey(mapKeyHash)) { + throw const FormatException(); + } + result[mapKeyHash] = CloudEditPart( + partKeyHash: partKeyHash, + revision: revision, + contentDigest: raw['contentDigest'] as String, + modifiedAt: _dateOrNull(modifiedAtMs)!, + ); + } + if (_encodeEditParts(result) != encoded) { + throw const FormatException(); + } + return result; + } catch (error) { + if (error is CloudSyncFailure) rethrow; + throw ObjectBoxCloudSemanticStoreGateway._failure( + 'semantic_edit_parts_invalid', + ); + } + } + + static CloudEntityKind _entityKind(String name) { + for (final kind in CloudEntityKind.values) { + if (kind.name == name) return kind; + } + throw ObjectBoxCloudSemanticStoreGateway._failure( + 'semantic_entity_kind_invalid', + ); + } + + static _SemanticReplayOutcome _replayOutcome(String name) { + for (final outcome in _SemanticReplayOutcome.values) { + if (outcome.name == name) return outcome; + } + throw ObjectBoxCloudSemanticStoreGateway._failure( + 'semantic_replay_outcome_invalid', + ); + } +} diff --git a/lib/services/rustpush/cloud_sync/objectbox_cloud_sync_preflight.dart b/lib/services/rustpush/cloud_sync/objectbox_cloud_sync_preflight.dart new file mode 100644 index 0000000000..e5701154d9 --- /dev/null +++ b/lib/services/rustpush/cloud_sync/objectbox_cloud_sync_preflight.dart @@ -0,0 +1,59 @@ +import 'package:bluebubbles/database/database.dart'; +import 'package:bluebubbles/database/models.dart'; + +import 'cloud_sync_production_preflight.dart'; +import 'cloudkit_operation_interlock.dart'; + +/// Reads the local mutation fence in one ObjectBox transaction. +/// +/// Keeping the active coordinator-lease check and outbox count in the same +/// snapshot prevents a manual shadow run from observing a torn local state. +final class ObjectBoxCloudSyncPreflightReader { + ObjectBoxCloudSyncPreflightReader({ + required Store store, + DateTime Function()? now, + Set? ignoredScopeKeys, + }) : _store = store, + _leases = store.box(), + _outbox = store.box(), + _now = now ?? DateTime.now, + _ignoredScopeKeys = + ignoredScopeKeys ?? + {CloudKitOperationInterlock.fenceScopeKey}; + + factory ObjectBoxCloudSyncPreflightReader.fromDatabase() => + ObjectBoxCloudSyncPreflightReader(store: Database.store); + + final Store _store; + final Box _leases; + final Box _outbox; + final DateTime Function() _now; + final Set _ignoredScopeKeys; + + CloudSyncLocalPreflightState read() { + return _store.runInTransaction(TxMode.read, () { + final nowMs = _now().millisecondsSinceEpoch; + // The caller of this probe runs inside the operation interlock, which + // holds its own fence lease for the duration of the guarded work. Reading + // every unexpired lease made an operation observe its own fence and fail + // closed with coordinator_active before any network call. Every other + // scope, including any unrecognized one, still blocks. + var condition = CloudSyncLeaseEntity_.expiresAtMs.greaterThan(nowMs); + for (final ignored in _ignoredScopeKeys) { + condition = condition.and( + CloudSyncLeaseEntity_.scopeKey.notEquals(ignored), + ); + } + final query = _leases.query(condition).build()..limit = 1; + try { + return CloudSyncLocalPreflightState( + objectBoxReady: true, + coordinatorLeaseActive: query.findFirst() != null, + outboxCount: _outbox.count(), + ); + } finally { + query.close(); + } + }); + } +} diff --git a/lib/services/rustpush/cloud_sync/objectbox_cloud_sync_store.dart b/lib/services/rustpush/cloud_sync/objectbox_cloud_sync_store.dart new file mode 100644 index 0000000000..80dd769962 --- /dev/null +++ b/lib/services/rustpush/cloud_sync/objectbox_cloud_sync_store.dart @@ -0,0 +1,2538 @@ +import 'dart:convert'; + +import 'package:bluebubbles/database/database.dart'; +import 'package:bluebubbles/database/models.dart'; +import 'package:crypto/crypto.dart'; + +import 'cloud_operation_identity.dart'; +import 'cloud_shadow_journal_budget.dart'; +import 'cloud_sync_models.dart'; +import 'cloud_sync_persistent_keys.dart'; +import 'cloud_sync_protector.dart'; +import 'cloud_sync_store.dart'; + +/// Durable ObjectBox implementation of the Cloud Sync V2 journal and outbox. +/// +/// Every state transition that changes a checkpoint, lease, journal entry, or +/// outbox operation is synchronous inside one ObjectBox transaction. Network +/// and platform-keystore work always happen outside the transaction. +class ObjectBoxCloudSyncStore + implements + CloudSyncStore, + CloudSyncUnknownOutcomeLeasingStore, + CloudProtectedPageLeaseAdoptionStore, + CloudProtectedOutboundLeaseAdoptionStore { + ObjectBoxCloudSyncStore({ + required Store store, + required this._protector, + DateTime Function()? clock, + }) : _store = store, + _clock = clock ?? DateTime.now, + _checkpoints = store.box(), + _inbox = store.box(), + _leases = store.box(), + _protectedPageLeases = store.box(), + _outbox = store.box(), + _recordMaps = store.box(), + _attachmentMaterializations = store + .box(), + _runs = store.box(); + + factory ObjectBoxCloudSyncStore.fromDatabase({ + required CloudSyncProtector protector, + }) { + return ObjectBoxCloudSyncStore(store: Database.store, protector: protector); + } + + static const int _maximumRetainedRunsPerScope = 256; + + final Store _store; + final CloudSyncProtector _protector; + final DateTime Function() _clock; + final Box _checkpoints; + final Box _inbox; + final Box _leases; + final Box _protectedPageLeases; + final Box _outbox; + final Box _recordMaps; + final Box _attachmentMaterializations; + final Box _runs; + + @override + Future readCheckpoint(CloudSyncScope scope) async { + final entity = _store.runInTransaction( + TxMode.write, + () => _checkpointLocked(scope, nowMs: _nowMs()), + ); + final ciphertext = entity.fetchedTokenCiphertext; + String? token; + if (ciphertext != null) { + try { + token = await _protector.unprotect( + scope: scope, + kind: CloudSyncProtectedValueKind.checkpointToken, + ciphertext: ciphertext, + ); + } catch (_) { + throw _storageFailure('checkpoint_unprotect_failed'); + } + } + return _checkpointFromEntity(scope, entity, fetchedToken: token); + } + + @override + Future journalFetchedBatch( + CloudFetchBatch batch, { + required DateTime now, + required CloudCoordinatorLeaseFence leaseFence, + required int expectedGeneration, + required String? expectedFetchedToken, + }) async { + final preflightNowMs = _nowMs(); + final leaseKey = _scopedDigest(batch.scope, 'coordinator-lease', 'v1'); + final ownerIdHash = _digest('coordinator-owner\u001f${leaseFence.ownerId}'); + final checkpointCiphertextSnapshot = _store.runInTransaction( + TxMode.read, + () { + final lease = _findLeaseByKeyLocked(leaseKey); + if (lease == null || + lease.scopeKey != _scopeKey(batch.scope) || + lease.ownerIdHash != ownerIdHash || + lease.generation != leaseFence.generation || + lease.expiresAtMs <= preflightNowMs) { + throw _storageFailure('coordinator_lease_fence_lost'); + } + final checkpoint = _findCheckpointByKeyLocked(_scopeKey(batch.scope)); + if (checkpoint == null) return null; + _validateCheckpointScope(checkpoint, batch.scope); + return checkpoint.fetchedTokenCiphertext; + }, + ); + String? currentFetchedToken; + if (checkpointCiphertextSnapshot != null) { + try { + currentFetchedToken = await _protector.unprotect( + scope: batch.scope, + kind: CloudSyncProtectedValueKind.checkpointToken, + ciphertext: checkpointCiphertextSnapshot, + ); + } catch (_) { + throw _storageFailure('checkpoint_unprotect_failed'); + } + } + if (currentFetchedToken != expectedFetchedToken) { + throw _storageFailure('checkpoint_compare_and_swap_failed'); + } + + final tokenCiphertext = await _protectCheckpointToken( + batch.scope, + batch.nextToken, + ); + return _store.runInTransaction(TxMode.write, () { + final transactionNowMs = _nowMs(); + final checkpoint = _checkpointLocked( + batch.scope, + nowMs: transactionNowMs, + ); + final lease = _findLeaseByKeyLocked(leaseKey); + if (lease == null || + lease.scopeKey != _scopeKey(batch.scope) || + lease.ownerIdHash != ownerIdHash || + lease.generation != leaseFence.generation || + lease.expiresAtMs <= transactionNowMs) { + throw _storageFailure('coordinator_lease_fence_lost'); + } + if (checkpoint.generation != expectedGeneration || + checkpoint.fetchedTokenCiphertext != checkpointCiphertextSnapshot) { + throw _storageFailure('checkpoint_compare_and_swap_failed'); + } + if (checkpoint.generation != batch.generation) { + throw _storageFailure('generation_mismatch'); + } + + var nextSequence = checkpoint.fetchedSequence + 1; + var inserted = 0; + for (final change in batch.changes) { + final changeKey = _changeKey( + batch.scope, + batch.generation, + change.changeId, + ); + if (_findInboxByChangeKeyLocked(changeKey) != null) continue; + _inbox.put( + CloudInboxChangeEntity( + changeKey: changeKey, + changeIdHash: change.changeId, + scopeKey: _scopeKey(batch.scope), + accountFingerprint: batch.scope.accountFingerprint, + zone: batch.scope.zone, + serverRecordIdHash: change.recordIdHash, + etagHash: change.etagHash, + changeType: change.type.name, + encryptedServerRecordId: change.encryptedServerRecordId, + protectedSystemFieldsRef: change.protectedSystemFieldsReference, + encryptedPayloadRef: change.encryptedPayloadReference, + payloadSha256: change.payloadSha256, + batchId: batch.batchId, + generation: batch.generation, + fetchSequence: nextSequence, + status: _inboxStatusToInt(CloudInboxStatus.pending), + isTombstone: change.isTombstone, + failureCategory: change.preflightFailure?.name, + serverModifiedAtMs: + change.serverModifiedAt?.millisecondsSinceEpoch ?? 0, + createdAtMs: transactionNowMs, + updatedAtMs: transactionNowMs, + ), + ); + nextSequence++; + inserted++; + } + + checkpoint + ..fetchedTokenCiphertext = tokenCiphertext + ..generation = batch.generation + ..lastBatchId = batch.batchId + ..fetchedSequence = nextSequence - 1 + ..lastAttemptAtMs = transactionNowMs + ..updatedAtMs = transactionNowMs; + _checkpoints.put(checkpoint); + _adoptProtectedPageLeaseLocked(batch, nowMs: transactionNowMs); + return inserted; + }); + } + + @override + Future readShadowJournalUsage( + CloudSyncScope scope, { + required CloudShadowJournalBudget budget, + }) async { + budget.validate(); + return _store.runInTransaction( + TxMode.read, + () => _shadowJournalUsageLocked(scope, budget), + ); + } + + @override + Future journalShadowFetchedBatch( + CloudFetchBatch batch, { + required DateTime now, + required CloudShadowJournalBudget budget, + required CloudCoordinatorLeaseFence leaseFence, + required int expectedGeneration, + required String? expectedFetchedToken, + }) async { + budget.validate(); + // Avoid touching the keystore if a migrated/pre-existing journal is + // already blocked. The write transaction below repeats this check to make + // admission race-safe across engines and processes. + final preliminary = _store.runInTransaction( + TxMode.read, + () => _shadowJournalUsageLocked(batch.scope, budget), + ); + final preliminaryNow = _clock().toUtc(); + final preliminaryReason = budget.blockReasonForCurrentUsage( + preliminary, + now: preliminaryNow, + ); + if (preliminaryReason != null) { + return CloudShadowJournalAdmission( + insertedEntries: 0, + rejectedEntries: 0, + usage: preliminary, + blockReason: preliminaryReason, + ); + } + + final preflightNowMs = preliminaryNow.millisecondsSinceEpoch; + final leaseKey = _scopedDigest(batch.scope, 'coordinator-lease', 'v1'); + final ownerIdHash = _digest('coordinator-owner\u001f${leaseFence.ownerId}'); + final leaseMatches = _store.runInTransaction(TxMode.read, () { + final lease = _findLeaseByKeyLocked(leaseKey); + return lease != null && + lease.scopeKey == _scopeKey(batch.scope) && + lease.ownerIdHash == ownerIdHash && + lease.generation == leaseFence.generation && + lease.expiresAtMs > preflightNowMs; + }); + if (!leaseMatches) { + throw _storageFailure('coordinator_lease_fence_lost'); + } + + final checkpointCiphertextSnapshot = _store.runInTransaction( + TxMode.read, + () { + final checkpoint = _findCheckpointByKeyLocked(_scopeKey(batch.scope)); + if (checkpoint == null) return null; + _validateCheckpointScope(checkpoint, batch.scope); + return checkpoint.fetchedTokenCiphertext; + }, + ); + String? currentFetchedToken; + if (checkpointCiphertextSnapshot != null) { + try { + currentFetchedToken = await _protector.unprotect( + scope: batch.scope, + kind: CloudSyncProtectedValueKind.checkpointToken, + ciphertext: checkpointCiphertextSnapshot, + ); + } catch (_) { + throw _storageFailure('checkpoint_unprotect_failed'); + } + } + if (currentFetchedToken != expectedFetchedToken) { + throw _storageFailure('checkpoint_compare_and_swap_failed'); + } + + // Protection happens before the ObjectBox transaction. A keystore fault + // therefore cannot partially commit rows or a continuation token. + final tokenCiphertext = await _protectCheckpointToken( + batch.scope, + batch.nextToken, + ); + return _store.runInTransaction(TxMode.write, () { + final transactionNow = _clock().toUtc(); + final transactionNowMs = transactionNow.millisecondsSinceEpoch; + final checkpoint = _checkpointLocked( + batch.scope, + nowMs: transactionNowMs, + ); + final lease = _findLeaseByKeyLocked(leaseKey); + if (lease == null || + lease.scopeKey != _scopeKey(batch.scope) || + lease.ownerIdHash != ownerIdHash || + lease.generation != leaseFence.generation || + lease.expiresAtMs <= transactionNowMs) { + throw _storageFailure('coordinator_lease_fence_lost'); + } + if (checkpoint.generation != expectedGeneration || + checkpoint.generation != batch.generation || + checkpoint.fetchedTokenCiphertext != checkpointCiphertextSnapshot) { + throw _storageFailure('checkpoint_compare_and_swap_failed'); + } + + final current = _shadowJournalUsageLocked(batch.scope, budget); + final currentReason = budget.blockReasonForCurrentUsage( + current, + now: transactionNow, + ); + if (currentReason != null) { + return CloudShadowJournalAdmission( + insertedEntries: 0, + rejectedEntries: 0, + usage: current, + blockReason: currentReason, + ); + } + + final unseen = []; + final pageKeys = {}; + for (final change in batch.changes) { + final changeKey = _changeKey( + batch.scope, + batch.generation, + change.changeId, + ); + if (!pageKeys.add(changeKey) || + _findInboxByChangeKeyLocked(changeKey) != null) { + continue; + } + unseen.add(change); + } + final incomingBytes = unseen.fold( + 0, + (total, change) => + total + + budget.estimateEntryBytes( + scope: batch.scope, + batchId: batch.batchId, + change: change, + ), + ); + final projected = current.add( + entries: unseen.length, + bytes: incomingBytes, + oldestAt: unseen.isEmpty ? null : transactionNow, + ); + final projectedReason = budget.blockReasonForProjectedUsage( + projected, + now: transactionNow, + ); + if (projectedReason != null) { + return CloudShadowJournalAdmission( + insertedEntries: 0, + rejectedEntries: unseen.length, + usage: current, + blockReason: projectedReason, + ); + } + + var nextSequence = checkpoint.fetchedSequence + 1; + for (final change in unseen) { + final changeKey = _changeKey( + batch.scope, + batch.generation, + change.changeId, + ); + _inbox.put( + CloudInboxChangeEntity( + changeKey: changeKey, + changeIdHash: change.changeId, + scopeKey: _scopeKey(batch.scope), + accountFingerprint: batch.scope.accountFingerprint, + zone: batch.scope.zone, + serverRecordIdHash: change.recordIdHash, + etagHash: change.etagHash, + changeType: change.type.name, + encryptedServerRecordId: change.encryptedServerRecordId, + protectedSystemFieldsRef: change.protectedSystemFieldsReference, + encryptedPayloadRef: change.encryptedPayloadReference, + payloadSha256: change.payloadSha256, + batchId: batch.batchId, + generation: batch.generation, + fetchSequence: nextSequence, + status: _inboxStatusToInt(CloudInboxStatus.pending), + isTombstone: change.isTombstone, + failureCategory: change.preflightFailure?.name, + serverModifiedAtMs: + change.serverModifiedAt?.millisecondsSinceEpoch ?? 0, + createdAtMs: transactionNowMs, + updatedAtMs: transactionNowMs, + ), + ); + nextSequence++; + } + + checkpoint + ..fetchedTokenCiphertext = tokenCiphertext + ..generation = batch.generation + ..lastBatchId = batch.batchId + ..fetchedSequence = nextSequence - 1 + ..lastAttemptAtMs = transactionNowMs + ..updatedAtMs = transactionNowMs; + _checkpoints.put(checkpoint); + _adoptProtectedPageLeaseLocked(batch, nowMs: transactionNowMs); + return CloudShadowJournalAdmission( + insertedEntries: unseen.length, + rejectedEntries: 0, + usage: projected, + ); + }); + } + + @override + Future> readAdoptedProtectedPageLeaseReferences({ + required int maximumCount, + }) async { + if (maximumCount <= 0 || maximumCount > 4096) { + throw ArgumentError.value(maximumCount, 'maximumCount'); + } + return _store.runInTransaction(TxMode.read, () { + final count = _protectedPageLeases.count(); + if (count > maximumCount) { + throw _storageFailure('protected_page_lease_recovery_bound_exceeded'); + } + final references = _protectedPageLeases + .getAll() + .map((entity) => entity.leaseReference) + .toSet(); + if (references.length != count || + references.any((reference) => !_isProtectedPageLease(reference))) { + throw _storageFailure('protected_page_lease_adoption_corrupt'); + } + return Set.unmodifiable(references); + }); + } + + /// Returns protected outbound lease references adopted by non-terminal + /// outbox rows. + /// + /// These references are intentionally returned separately from page leases: + /// page-lease cleanup must not acknowledge or release an outbound receipt. + /// Existing rows without the not-yet-generated schema property are treated + /// as having no outbound lease reference. + @override + Future> readNonterminalProtectedOutboundLeaseReferences({ + required int maximumCount, + }) async { + if (maximumCount <= 0 || maximumCount > 4096) { + throw ArgumentError.value(maximumCount, 'maximumCount'); + } + return _store.runInTransaction(TxMode.read, () { + final references = {}; + for (final entity in _outbox.getAll()) { + if (!_isBlockingOutboxStatus(_outboxStatusFromInt(entity.state))) { + continue; + } + final reference = entity.protectedLeaseReference; + if (reference == null) continue; + if (!_isProtectedPageLease(reference)) { + throw _storageFailure('protected_outbound_lease_corrupt'); + } + references.add(reference); + if (references.length > maximumCount) { + throw _storageFailure( + 'protected_outbound_lease_recovery_bound_exceeded', + ); + } + } + return Set.unmodifiable(references); + }); + } + + @override + Future readLiveProtectedReferences({ + required int maximumCount, + }) async { + if (maximumCount <= 0 || maximumCount > 131072) { + throw ArgumentError.value(maximumCount, 'maximumCount'); + } + final captured = _store.runInTransaction(TxMode.read, () { + final upperBound = + _checkpoints.count() + + (_inbox.count() * 3) + + _outbox.count() + + (_recordMaps.count() * 2) + + (_attachmentMaterializations.count() * 4); + if (upperBound > maximumCount) { + return const _ProtectedReferenceCapture.incomplete(); + } + final references = {}; + void capture(String? value) { + if (value == null) return; + if (_isNativeProtectedReference(value)) { + references.add(value); + return; + } + if (value.startsWith('obcs2.')) { + throw _storageFailure('protected_reference_corrupt'); + } + } + + void scanPaged(Query query, void Function(T entry) visit) { + const pageSize = 1024; + var offset = 0; + try { + while (true) { + query + ..offset = offset + ..limit = pageSize; + final page = query.find(); + for (final entry in page) { + visit(entry); + } + if (page.length < pageSize) return; + offset += page.length; + } + } finally { + query.close(); + } + } + + scanPaged((_inbox.query()..order(CloudInboxChangeEntity_.id)).build(), ( + entry, + ) { + // Deliberately include pending, applied, and quarantined rows. There is + // no reviewed terminal-inbox compaction policy yet. + capture(entry.encryptedServerRecordId); + capture(entry.protectedSystemFieldsRef); + capture(entry.encryptedPayloadRef); + }); + scanPaged( + (_outbox.query()..order(CloudOutboxOperationEntity_.id)).build(), + (entry) => capture(entry.encryptedPayloadRef), + ); + scanPaged( + (_recordMaps.query()..order(CloudRecordMapEntity_.id)).build(), + (entry) { + capture(entry.encryptedServerRecordId); + capture(entry.encryptedRawRecordRef); + }, + ); + scanPaged( + (_attachmentMaterializations.query() + ..order(CloudAttachmentMaterializationEntity_.id)) + .build(), + (entry) { + capture(entry.protectedTempReference); + capture(entry.protectedResumeManifestReference); + capture(entry.protectedContentVerificationReference); + capture(entry.protectedFinalReference); + }, + ); + + final checkpoints = <_ProtectedCheckpointCapture>[]; + scanPaged( + (_checkpoints.query()..order(CloudSyncCheckpointEntity_.id)).build(), + (entry) { + final ciphertext = entry.fetchedTokenCiphertext; + if (ciphertext == null) return; + checkpoints.add( + _ProtectedCheckpointCapture( + scope: _scopeFromCheckpointEntity(entry), + ciphertext: ciphertext, + ), + ); + }, + ); + return _ProtectedReferenceCapture( + references: references, + checkpoints: checkpoints, + isComplete: true, + ); + }); + if (!captured.isComplete) { + return CloudProtectedReferenceSnapshot( + references: const {}, + isComplete: false, + ); + } + + final references = captured.references.toSet(); + for (final checkpoint in captured.checkpoints) { + final value = await _protector + .unprotect( + scope: checkpoint.scope, + kind: CloudSyncProtectedValueKind.checkpointToken, + ciphertext: checkpoint.ciphertext, + ) + .catchError((Object _) { + throw _storageFailure('checkpoint_unprotect_failed'); + }); + if (_isNativeProtectedReference(value)) { + references.add(value); + } else if (value.startsWith('obcs2.')) { + throw _storageFailure('protected_reference_corrupt'); + } + if (references.length > maximumCount) { + return CloudProtectedReferenceSnapshot( + references: const {}, + isComplete: false, + ); + } + } + return CloudProtectedReferenceSnapshot( + references: references, + isComplete: true, + ); + } + + @override + Future releaseAdoptedProtectedPageLeaseReferences( + Iterable leaseReferences, + ) async { + final references = leaseReferences.toSet(); + if (references.any((reference) => !_isProtectedPageLease(reference))) { + throw _storageFailure('protected_page_lease_reference_invalid'); + } + if (references.isEmpty) return; + _store.runInTransaction(TxMode.write, () { + for (final reference in references) { + final entity = _findProtectedPageLeaseLocked(reference); + if (entity != null) { + _protectedPageLeases.remove(entity.id); + } + } + }); + } + + @override + Future recordPullFailure( + CloudSyncScope scope, { + required CloudFailureCategory category, + required DateTime nextEligibleAt, + }) async { + final nowMs = _nowMs(); + _store.runInTransaction(TxMode.write, () { + final checkpoint = _checkpointLocked(scope, nowMs: nowMs); + checkpoint + ..lastAttemptAtMs = nowMs + ..lastErrorCategory = category.name + ..backoffAttempt += 1 + ..nextEligibleAtMs = nextEligibleAt.millisecondsSinceEpoch + ..updatedAtMs = nowMs; + _checkpoints.put(checkpoint); + }); + } + + @override + Future recordPullSuccess( + CloudSyncScope scope, { + required DateTime now, + }) async { + final nowMs = now.millisecondsSinceEpoch; + _store.runInTransaction(TxMode.write, () { + final checkpoint = _checkpointLocked(scope, nowMs: nowMs); + checkpoint + ..lastSuccessfulAtMs = nowMs + ..lastAttemptAtMs = nowMs + ..lastErrorCategory = null + ..backoffAttempt = 0 + ..nextEligibleAtMs = 0 + ..updatedAtMs = nowMs; + _checkpoints.put(checkpoint); + }); + } + + @override + Future> readEligibleInbox( + CloudSyncScope scope, { + required DateTime now, + required int limit, + }) async { + _requirePositiveLimit(limit); + final scopeKey = _scopeKey(scope); + final nowMs = now.millisecondsSinceEpoch; + final checkpoint = _findCheckpointByKeyLocked(scopeKey); + if (checkpoint != null) _validateCheckpointScope(checkpoint, scope); + final nextSequence = (checkpoint?.appliedSequence ?? 0) + 1; + final entity = _findInboxBySequenceLocked(scope, nextSequence); + if (entity == null || + _inboxStatusFromInt(entity.status) != CloudInboxStatus.pending || + entity.nextEligibleAtMs > nowMs) { + return const []; + } + return [_inboxFromEntity(scope, entity)]; + } + + @override + Future markInboxApplied( + CloudSyncScope scope, { + required int sequence, + required DateTime now, + required CloudCoordinatorLeaseFence leaseFence, + }) async { + _store.runInTransaction(TxMode.write, () { + final transactionNowMs = _nowMs(); + _requireActiveCoordinatorLeaseLocked( + scope, + leaseFence, + nowMs: transactionNowMs, + ); + final entity = _requireInboxLocked(scope, sequence); + final status = _inboxStatusFromInt(entity.status); + if (status == CloudInboxStatus.applied) return; + if (status != CloudInboxStatus.pending) { + throw _storageFailure('inbox_transition_not_pending'); + } + entity + ..status = _inboxStatusToInt(CloudInboxStatus.applied) + ..failureCategory = null + ..nextEligibleAtMs = 0 + ..completedAtMs = transactionNowMs + ..updatedAtMs = transactionNowMs; + _inbox.put(entity); + _advanceContiguousAppliedLocked(scope, transactionNowMs); + }); + } + + @override + Future markInboxRetryable( + CloudSyncScope scope, { + required int sequence, + required CloudFailureCategory category, + required DateTime now, + required DateTime nextEligibleAt, + required CloudCoordinatorLeaseFence leaseFence, + }) async { + _store.runInTransaction(TxMode.write, () { + final transactionNowMs = _nowMs(); + _requireActiveCoordinatorLeaseLocked( + scope, + leaseFence, + nowMs: transactionNowMs, + ); + final entity = _requireInboxLocked(scope, sequence); + if (_inboxStatusFromInt(entity.status) != CloudInboxStatus.pending) { + throw _storageFailure('inbox_transition_not_pending'); + } + final nextEligibleAtMs = nextEligibleAt.millisecondsSinceEpoch; + if (entity.failureCategory == category.name && + entity.nextEligibleAtMs >= nextEligibleAtMs) { + return; + } + entity + ..status = _inboxStatusToInt(CloudInboxStatus.pending) + ..retryCount += 1 + ..failureCategory = category.name + ..nextEligibleAtMs = entity.nextEligibleAtMs > nextEligibleAtMs + ? entity.nextEligibleAtMs + : nextEligibleAtMs + ..updatedAtMs = transactionNowMs; + _inbox.put(entity); + }); + } + + @override + Future quarantineInbox( + CloudSyncScope scope, { + required int sequence, + required CloudFailureCategory category, + required DateTime now, + required CloudCoordinatorLeaseFence leaseFence, + }) async { + _store.runInTransaction(TxMode.write, () { + final transactionNowMs = _nowMs(); + _requireActiveCoordinatorLeaseLocked( + scope, + leaseFence, + nowMs: transactionNowMs, + ); + final entity = _requireInboxLocked(scope, sequence); + final status = _inboxStatusFromInt(entity.status); + if (status == CloudInboxStatus.quarantined && + entity.failureCategory == category.name) { + return; + } + if (status != CloudInboxStatus.pending) { + throw _storageFailure('inbox_transition_not_pending'); + } + entity + ..status = _inboxStatusToInt(CloudInboxStatus.quarantined) + ..retryCount += 1 + ..failureCategory = category.name + ..nextEligibleAtMs = 0 + ..completedAtMs = transactionNowMs + ..updatedAtMs = transactionNowMs; + _inbox.put(entity); + _advanceContiguousAppliedLocked(scope, transactionNowMs); + }); + } + + @override + Future enqueueOutbox(CloudOutboxOperation operation) async { + _store.runInTransaction(TxMode.write, () { + final checkpoint = _checkpointLocked( + operation.scope, + nowMs: operation.createdAt.millisecondsSinceEpoch, + ); + _fenceStaleOutboxLocked( + operation.scope, + checkpoint: checkpoint, + nowMs: operation.createdAt.millisecondsSinceEpoch, + ); + if (operation.checkpointGeneration != checkpoint.generation) { + throw _storageFailure('outbox_generation_mismatch'); + } + if (operation.mutationRevision > checkpoint.mutationRevisionCounter) { + checkpoint + ..mutationRevisionCounter = operation.mutationRevision + ..updatedAtMs = operation.createdAt.millisecondsSinceEpoch; + _checkpoints.put(checkpoint); + } + _enqueueOutboxLocked(operation); + }); + } + + @override + Future enqueueOutboxMutation( + CloudOutboxDraft draft, + ) async { + return _store.runInTransaction(TxMode.write, () { + final nowMs = draft.createdAt.millisecondsSinceEpoch; + final checkpoint = _checkpointLocked(draft.scope, nowMs: nowMs); + _fenceStaleOutboxLocked( + draft.scope, + checkpoint: checkpoint, + nowMs: nowMs, + ); + final revision = checkpoint.mutationRevisionCounter + 1; + checkpoint + ..mutationRevisionCounter = revision + ..updatedAtMs = nowMs; + _checkpoints.put(checkpoint); + + final operation = CloudOutboxOperation( + scope: draft.scope, + operationId: CloudOperationIdentity.forMutation( + scope: draft.scope, + logicalEntityKeyHash: draft.logicalEntityKeyHash, + action: draft.action, + payloadVersion: draft.payloadVersion, + mutationRevision: revision, + payloadSha256: draft.payloadSha256, + ), + logicalEntityKeyHash: draft.logicalEntityKeyHash, + action: draft.action, + payloadVersion: draft.payloadVersion, + mutationRevision: revision, + checkpointGeneration: checkpoint.generation, + encryptedPayloadReference: draft.encryptedPayloadReference, + payloadSha256: draft.payloadSha256, + serverRecordIdHash: draft.serverRecordIdHash, + protectedLeaseReference: draft.protectedLeaseReference, + dependencyOperationIds: draft.dependencyOperationIds, + createdAt: draft.createdAt, + ); + _enqueueOutboxLocked(operation); + return operation; + }); + } + + /// Atomically adopts one protected create envelope into both the outbox and + /// its stable server-record mapping. Native lease commit happens only after + /// this transaction returns successfully. + Future admitProtectedOutboundCreate({ + required CloudOutboxDraft draft, + required CloudRecordMapEntry recordMapping, + }) async { + if (draft.action != CloudOutboxAction.save || + draft.payloadVersion != 1 || + draft.dependencyOperationIds.isNotEmpty || + draft.protectedLeaseReference == null || + !_isProtectedPageLease(draft.protectedLeaseReference!) || + draft.encryptedPayloadReference == null || + !_isNativeProtectedReference(draft.encryptedPayloadReference!) || + draft.payloadSha256 == null || + !_isContentDigest(draft.payloadSha256!) || + draft.serverRecordIdHash == null || + !_isNativeDigest(draft.logicalEntityKeyHash) || + !_isNativeDigest(draft.serverRecordIdHash!) || + recordMapping.scope != draft.scope || + recordMapping.logicalEntityKeyHash != draft.logicalEntityKeyHash || + recordMapping.serverRecordIdHash != draft.serverRecordIdHash || + recordMapping.encryptedServerRecordId != + draft.encryptedPayloadReference || + recordMapping.etagHash != null || + recordMapping.encryptedRawRecordReference != null) { + throw _storageFailure('protected_outbound_admission_invalid'); + } + return _store.runInTransaction(TxMode.write, () { + final nowMs = draft.createdAt.millisecondsSinceEpoch; + final checkpoint = _checkpointLocked(draft.scope, nowMs: nowMs); + _fenceStaleOutboxLocked( + draft.scope, + checkpoint: checkpoint, + nowMs: nowMs, + ); + final operationId = CloudOperationIdentity.forInitialCreate( + scope: draft.scope, + logicalEntityKeyHash: draft.logicalEntityKeyHash, + payloadVersion: draft.payloadVersion, + ); + final existingOperation = _findOutboxByOperationIdLocked(operationId); + if (existingOperation != null) { + final existing = _outboxFromEntity(draft.scope, existingOperation); + if (existing.scope != draft.scope || + existing.logicalEntityKeyHash != draft.logicalEntityKeyHash || + existing.action != CloudOutboxAction.save || + existing.payloadVersion != draft.payloadVersion || + existing.payloadSha256 != draft.payloadSha256) { + throw CloudSyncFailure( + category: CloudFailureCategory.conflict, + safeCode: 'protected_outbound_retry_payload_changed', + ); + } + return existing; + } + + final mapKey = _scopedDigest( + draft.scope, + 'record-map', + draft.logicalEntityKeyHash, + ); + final existingMapping = _findRecordMapByKeyLocked(mapKey); + if (existingMapping != null && + existingMapping.generation == checkpoint.generation && + existingMapping.serverRecordIdHash != + recordMapping.serverRecordIdHash) { + throw CloudSyncFailure( + category: CloudFailureCategory.conflict, + safeCode: 'server_mapping_changed', + ); + } + final reverseCollision = _findRecordMapsForScopeLocked(draft.scope).any( + (entity) => + entity.generation == checkpoint.generation && + entity.serverRecordIdHash == recordMapping.serverRecordIdHash && + entity.logicalEntityKeyHash != draft.logicalEntityKeyHash, + ); + if (reverseCollision) { + throw CloudSyncFailure( + category: CloudFailureCategory.conflict, + safeCode: 'server_mapping_reverse_collision', + ); + } + + final revision = checkpoint.mutationRevisionCounter + 1; + checkpoint + ..mutationRevisionCounter = revision + ..updatedAtMs = nowMs; + _checkpoints.put(checkpoint); + final operation = CloudOutboxOperation( + scope: draft.scope, + operationId: operationId, + logicalEntityKeyHash: draft.logicalEntityKeyHash, + action: CloudOutboxAction.save, + payloadVersion: draft.payloadVersion, + mutationRevision: revision, + checkpointGeneration: checkpoint.generation, + encryptedPayloadReference: draft.encryptedPayloadReference, + payloadSha256: draft.payloadSha256, + serverRecordIdHash: draft.serverRecordIdHash, + protectedLeaseReference: draft.protectedLeaseReference, + dependencyOperationIds: draft.dependencyOperationIds, + createdAt: draft.createdAt, + ); + _enqueueOutboxLocked(operation); + _recordMaps.put( + CloudRecordMapEntity( + id: existingMapping?.id ?? 0, + mapKey: mapKey, + scopeKey: _scopeKey(draft.scope), + accountFingerprint: draft.scope.accountFingerprint, + zone: draft.scope.zone, + logicalEntityKeyHash: draft.logicalEntityKeyHash, + serverRecordIdHash: recordMapping.serverRecordIdHash, + generation: checkpoint.generation, + encryptedServerRecordId: recordMapping.encryptedServerRecordId, + etagHash: recordMapping.etagHash, + encryptedRawRecordRef: recordMapping.encryptedRawRecordReference, + updatedAtMs: nowMs, + ), + ); + return operation; + }); + } + + @override + Future rebootstrapAfterReset( + CloudSyncResetRebootstrapRequest request, { + required DateTime now, + }) async { + final nowMs = now.millisecondsSinceEpoch; + late int previousGeneration; + late int nextGeneration; + _store.runInTransaction(TxMode.write, () { + final leaseKey = _scopedDigest(request.scope, 'coordinator-lease', 'v1'); + final activeLease = _findLeaseByKeyLocked(leaseKey); + if (activeLease != null && activeLease.expiresAtMs > nowMs) { + throw _storageFailure('reset_rebootstrap_coordinator_active'); + } + + final checkpoint = _checkpointLocked(request.scope, nowMs: nowMs); + if (checkpoint.generation != request.expectedGeneration) { + throw _storageFailure('reset_rebootstrap_generation_mismatch'); + } + previousGeneration = checkpoint.generation; + nextGeneration = previousGeneration + 1; + checkpoint + ..generation = nextGeneration + ..fetchedTokenCiphertext = null + ..lastBatchId = null + ..fetchedSequence = 0 + ..appliedSequence = 0 + ..lastSuccessfulAtMs = 0 + ..lastAttemptAtMs = 0 + ..lastErrorCategory = null + ..backoffAttempt = 0 + ..nextEligibleAtMs = 0 + ..updatedAtMs = nowMs; + _checkpoints.put(checkpoint); + + // Keep rows as evidence, but make every old-generation operation + // terminal and every old mapping unreadable by the active generation. + _fenceStaleOutboxLocked( + request.scope, + checkpoint: checkpoint, + nowMs: nowMs, + ); + for (final entity in _findRecordMapsForScopeLocked(request.scope)) { + entity + ..generation = 0 + ..updatedAtMs = nowMs; + _recordMaps.put(entity); + } + for (final entity in _findInboxForScopeLocked(request.scope)) { + final status = _inboxStatusFromInt(entity.status); + entity + ..generation = 0 + ..updatedAtMs = nowMs; + if (status == CloudInboxStatus.pending) { + entity + ..status = _inboxStatusToInt(CloudInboxStatus.quarantined) + ..retryCount += 1 + ..failureCategory = CloudFailureCategory.localStorage.name + ..nextEligibleAtMs = 0 + ..completedAtMs = nowMs; + } + _inbox.put(entity); + } + }); + return CloudSyncResetCompletionProof( + scope: request.scope, + transitionIdHash: request.transitionIdHash, + activeIdentityFingerprint: request.activeIdentityFingerprint, + previousGeneration: previousGeneration, + generation: nextGeneration, + protectedRemoteStateProofReference: + request.protectedRemoteStateProofReference, + ); + } + + @override + Future advanceOutboxGeneration( + CloudSyncScope scope, { + required DateTime now, + }) async { + final nowMs = now.millisecondsSinceEpoch; + _store.runInTransaction(TxMode.write, () { + final leaseKey = _scopedDigest(scope, 'coordinator-lease', 'v1'); + final activeLease = _findLeaseByKeyLocked(leaseKey); + if (activeLease != null && activeLease.expiresAtMs > nowMs) { + throw _storageFailure('generation_advance_coordinator_active'); + } + final checkpoint = _checkpointLocked(scope, nowMs: nowMs); + checkpoint + ..generation += 1 + ..updatedAtMs = nowMs; + _checkpoints.put(checkpoint); + _fenceStaleOutboxLocked(scope, checkpoint: checkpoint, nowMs: nowMs); + }); + // Preserve the caller-visible protected continuation token. It is never + // needed inside the fencing transaction and is deliberately unprotected + // only after the durable generation advance commits. + return readCheckpoint(scope); + } + + @override + Future> leaseEligibleOutbox( + CloudSyncScope scope, { + required DateTime now, + required int limit, + required String leaseId, + required Duration leaseDuration, + required Set allowedActions, + }) async { + _requirePositiveLimit(limit); + if (leaseId.isEmpty) throw ArgumentError.value(leaseId, 'leaseId'); + final nowMs = now.millisecondsSinceEpoch; + final leaseIdHash = _digest('outbox-lease\u001f$leaseId'); + return _store.runInTransaction(TxMode.write, () { + final checkpoint = _checkpointLocked(scope, nowMs: nowMs); + _fenceStaleOutboxLocked(scope, checkpoint: checkpoint, nowMs: nowMs); + _recoverExpiredOutboxLeasesLocked(scope, nowMs); + final allEntities = _findOutboxForScopeLocked(scope).toList(); + final blockingByLogicalKey = {}; + for (final entity in allEntities) { + if (!_isBlockingOutboxStatus(_outboxStatusFromInt(entity.state))) { + continue; + } + final existing = blockingByLogicalKey[entity.logicalEntityKeyHash]; + if (existing == null || _compareMutationOrder(entity, existing) < 0) { + blockingByLogicalKey[entity.logicalEntityKeyHash] = entity; + } + } + + final candidates = + allEntities + .where( + (entity) => + _outboxStatusFromInt(entity.state) == + CloudOutboxStatus.pending && + allowedActions.contains(_actionFromInt(entity.action)) && + entity.nextEligibleAtMs <= nowMs, + ) + .toList() + ..sort((first, second) { + final revision = first.mutationRevision.compareTo( + second.mutationRevision, + ); + if (revision != 0) return revision; + return first.operationId.compareTo(second.operationId); + }); + + final allById = { + for (final entity in allEntities) entity.operationId: entity, + }; + final leased = []; + for (final entity in candidates) { + if (leased.length == limit) break; + final blocker = blockingByLogicalKey[entity.logicalEntityKeyHash]; + if (blocker != null && _compareMutationOrder(blocker, entity) < 0) { + continue; + } + final dependencies = _decodeDependencies( + entity.dependencyOperationIdsJson, + ); + final dependenciesConfirmed = dependencies.every((operationId) { + final dependency = allById[operationId]; + return dependency != null && + dependency.checkpointGeneration == entity.checkpointGeneration && + _outboxStatusFromInt(dependency.state) == + CloudOutboxStatus.confirmed; + }); + if (!dependenciesConfirmed) continue; + + entity + ..state = _outboxStatusToInt(CloudOutboxStatus.leased) + ..leaseIdHash = leaseIdHash + ..leaseExpiresAtMs = now.add(leaseDuration).millisecondsSinceEpoch + ..updatedAtMs = nowMs; + _outbox.put(entity); + leased.add(_outboxFromEntity(scope, entity, leaseId: leaseId)); + } + return leased; + }); + } + + @override + Future> leaseUnknownOutcomes( + CloudSyncScope scope, { + required DateTime now, + required int limit, + required String leaseId, + required Duration leaseDuration, + }) async { + _requirePositiveLimit(limit); + if (leaseId.isEmpty) throw ArgumentError.value(leaseId, 'leaseId'); + final nowMs = now.millisecondsSinceEpoch; + final leaseIdHash = _digest('outbox-lease\u001f$leaseId'); + return _store.runInTransaction(TxMode.write, () { + final checkpoint = _checkpointLocked(scope, nowMs: nowMs); + _fenceStaleOutboxLocked(scope, checkpoint: checkpoint, nowMs: nowMs); + final eligible = + _findOutboxForScopeLocked(scope) + .where( + (entity) => + entity.checkpointGeneration == checkpoint.generation && + _outboxStatusFromInt(entity.state) == + CloudOutboxStatus.unknownOutcome && + entity.appleRequestUuid != null && + entity.appleOperationUuid != null && + entity.leaseExpiresAtMs <= nowMs && + entity.nextEligibleAtMs <= nowMs, + ) + .toList() + ..sort((first, second) { + final revision = first.mutationRevision.compareTo( + second.mutationRevision, + ); + if (revision != 0) return revision; + return first.operationId.compareTo(second.operationId); + }); + + final leased = []; + for (final entity in eligible) { + if (leased.length == limit) break; + entity + ..state = _outboxStatusToInt(CloudOutboxStatus.unknownOutcome) + ..leaseIdHash = leaseIdHash + ..leaseExpiresAtMs = now.add(leaseDuration).millisecondsSinceEpoch + ..updatedAtMs = nowMs; + _outbox.put(entity); + leased.add(_outboxFromEntity(scope, entity, leaseId: leaseId)); + } + return leased; + }); + } + + @override + Future> markOutboxSubmissionStarted( + CloudSyncScope scope, { + required String leaseId, + required CloudOutboxSubmissionIdentity submissionIdentity, + required DateTime now, + }) async { + final ids = submissionIdentity.operationUuids.keys.toList(growable: false); + if (ids.isEmpty) { + throw ArgumentError('outbox_submission_operation_ids_empty'); + } + if (leaseId.isEmpty) throw ArgumentError.value(leaseId, 'leaseId'); + final leaseIdHash = _digest('outbox-lease\u001f$leaseId'); + final nowMs = now.millisecondsSinceEpoch; + return _store.runInTransaction(TxMode.write, () { + final checkpoint = _checkpointLocked(scope, nowMs: nowMs); + final entities = {}; + for (final operationId in ids) { + if (entities.containsKey(operationId)) { + throw _storageFailure('duplicate_outbox_submission_operation'); + } + final entity = _findOutboxByOperationIdLocked(operationId); + if (entity == null || + entity.scopeKey != _scopeKey(scope) || + entity.checkpointGeneration <= 0 || + entity.checkpointGeneration != checkpoint.generation) { + throw _storageFailure('stale_outbox_generation'); + } + if (_outboxStatusFromInt(entity.state) != CloudOutboxStatus.leased || + entity.leaseIdHash != leaseIdHash || + entity.leaseExpiresAtMs <= nowMs) { + throw _storageFailure('stale_outbox_lease'); + } + if (entity.appleRequestUuid != null || + entity.appleOperationUuid != null) { + throw _storageFailure('outbox_submission_identity_already_assigned'); + } + entities[operationId] = entity; + } + for (final entity in entities.values) { + entity + ..state = _outboxStatusToInt(CloudOutboxStatus.unknownOutcome) + ..lastErrorCategory = CloudFailureCategory.unknown.name + ..appleRequestUuid = submissionIdentity.requestUuid + ..appleOperationUuid = + submissionIdentity.operationUuids[entity.operationId] + ..updatedAtMs = nowMs; + _outbox.put(entity); + } + return entities.values + .map((entity) => _outboxFromEntity(scope, entity, leaseId: leaseId)) + .toList(growable: false); + }); + } + + @override + Future applyOutboxTransitions( + CloudSyncScope scope, { + required String leaseId, + required Iterable transitions, + required DateTime now, + }) async { + final transitionList = transitions.toList(growable: false); + final leaseIdHash = _digest('outbox-lease\u001f$leaseId'); + final nowMs = now.millisecondsSinceEpoch; + _store.runInTransaction(TxMode.write, () { + final checkpoint = _checkpointLocked(scope, nowMs: nowMs); + final entities = {}; + for (final transition in transitionList) { + if (entities.containsKey(transition.operationId)) { + throw _storageFailure('duplicate_outbox_transition'); + } + final entity = _findOutboxByOperationIdLocked(transition.operationId); + if (entity != null && + (entity.checkpointGeneration <= 0 || + entity.checkpointGeneration != checkpoint.generation)) { + throw _storageFailure('stale_outbox_generation'); + } + if (entity == null || + entity.scopeKey != _scopeKey(scope) || + (_outboxStatusFromInt(entity.state) != CloudOutboxStatus.leased && + _outboxStatusFromInt(entity.state) != + CloudOutboxStatus.unknownOutcome) || + entity.leaseIdHash != leaseIdHash || + entity.leaseExpiresAtMs <= nowMs) { + throw _storageFailure('stale_outbox_lease'); + } + _validateTransition(transition); + entities[transition.operationId] = entity; + } + + for (final transition in transitionList) { + final entity = entities[transition.operationId]!; + switch (transition.type) { + case CloudOutboxTransitionType.confirmed: + entity + ..state = _outboxStatusToInt(CloudOutboxStatus.confirmed) + ..confirmedAtMs = nowMs + ..lastErrorCategory = null + ..nextEligibleAtMs = 0; + break; + case CloudOutboxTransitionType.retryable: + entity + ..state = _outboxStatusToInt(CloudOutboxStatus.pending) + ..attemptCount += 1 + ..nextEligibleAtMs = + transition.nextEligibleAt!.millisecondsSinceEpoch + ..lastErrorCategory = transition.category!.name + ..encryptedPayloadRef = + transition.encryptedPayloadReference ?? + entity.encryptedPayloadRef + ..payloadSha256 = transition.payloadSha256 ?? entity.payloadSha256 + ..serverRecordIdHash = + transition.serverRecordIdHash ?? entity.serverRecordIdHash; + if (transition.clearSubmissionIdentity) { + entity + ..appleRequestUuid = null + ..appleOperationUuid = null; + } + break; + case CloudOutboxTransitionType.paused: + entity + ..state = _outboxStatusToInt(CloudOutboxStatus.paused) + ..attemptCount += 1 + ..nextEligibleAtMs = + transition.nextEligibleAt?.millisecondsSinceEpoch ?? 0 + ..lastErrorCategory = transition.category!.name; + if (transition.clearSubmissionIdentity) { + entity + ..appleRequestUuid = null + ..appleOperationUuid = null; + } + break; + case CloudOutboxTransitionType.quarantined: + entity + ..state = _outboxStatusToInt(CloudOutboxStatus.quarantined) + ..attemptCount += 1 + ..nextEligibleAtMs = 0 + ..lastErrorCategory = + (transition.category ?? CloudFailureCategory.unknown).name; + break; + case CloudOutboxTransitionType.unknownOutcome: + if (transition.category != CloudFailureCategory.unknown) { + throw ArgumentError( + 'Unknown outcome transitions require unknown category', + ); + } + entity + ..state = _outboxStatusToInt(CloudOutboxStatus.unknownOutcome) + ..attemptCount += 1 + ..nextEligibleAtMs = + transition.nextEligibleAt?.millisecondsSinceEpoch ?? 0 + ..lastErrorCategory = CloudFailureCategory.unknown.name; + break; + } + entity + ..leaseIdHash = null + ..leaseExpiresAtMs = 0 + ..updatedAtMs = nowMs; + _outbox.put(entity); + } + }); + } + + @override + Future recoverExpiredOutboxLeases( + CloudSyncScope scope, { + required DateTime now, + }) async { + final nowMs = now.millisecondsSinceEpoch; + return _store.runInTransaction(TxMode.write, () { + final checkpoint = _checkpointLocked(scope, nowMs: nowMs); + _fenceStaleOutboxLocked(scope, checkpoint: checkpoint, nowMs: nowMs); + return _recoverExpiredOutboxLeasesLocked(scope, nowMs); + }); + } + + @override + Future attachOutboxRecordMapping( + CloudSyncScope scope, { + required String leaseId, + required String operationId, + required String serverRecordIdHash, + required DateTime now, + }) async { + final leaseIdHash = _digest('outbox-lease\u001f$leaseId'); + final nowMs = now.millisecondsSinceEpoch; + _store.runInTransaction(TxMode.write, () { + final checkpoint = _checkpointLocked(scope, nowMs: nowMs); + final entity = _findOutboxByOperationIdLocked(operationId); + if (entity != null && + (entity.checkpointGeneration <= 0 || + entity.checkpointGeneration != checkpoint.generation)) { + throw _storageFailure('stale_outbox_generation'); + } + if (entity == null || + entity.scopeKey != _scopeKey(scope) || + _outboxStatusFromInt(entity.state) != CloudOutboxStatus.leased || + entity.leaseIdHash != leaseIdHash || + entity.leaseExpiresAtMs <= nowMs) { + throw _storageFailure('stale_outbox_lease'); + } + if (entity.serverRecordIdHash != null && + entity.serverRecordIdHash != serverRecordIdHash) { + throw CloudSyncFailure( + category: CloudFailureCategory.conflict, + safeCode: 'server_mapping_changed', + ); + } + entity + ..serverRecordIdHash = serverRecordIdHash + ..updatedAtMs = _nowMs(); + _outbox.put(entity); + }); + } + + @override + Future resumePausedOutbox( + CloudSyncScope scope, { + required Set categories, + required DateTime now, + }) async { + final nowMs = now.millisecondsSinceEpoch; + return _store.runInTransaction(TxMode.write, () { + final checkpoint = _checkpointLocked(scope, nowMs: nowMs); + _fenceStaleOutboxLocked(scope, checkpoint: checkpoint, nowMs: nowMs); + var resumed = 0; + for (final entity in _findOutboxForScopeLocked(scope)) { + if (_outboxStatusFromInt(entity.state) != CloudOutboxStatus.paused || + entity.lastErrorCategory == null || + entity.nextEligibleAtMs > nowMs || + !categories + .map((category) => category.name) + .contains(entity.lastErrorCategory)) { + continue; + } + entity + ..state = _outboxStatusToInt(CloudOutboxStatus.pending) + ..lastErrorCategory = null + ..nextEligibleAtMs = nowMs + ..updatedAtMs = nowMs; + _outbox.put(entity); + resumed++; + } + return resumed; + }); + } + + @override + Future> readPausedOutboxFailureCategories( + CloudSyncScope scope, { + required DateTime now, + }) async { + final nowMs = now.millisecondsSinceEpoch; + return _store.runInTransaction(TxMode.read, () { + final checkpoint = _findCheckpointByKeyLocked(_scopeKey(scope)); + if (checkpoint == null) return {}; + return _findOutboxForScopeLocked(scope) + .where( + (entity) => + entity.checkpointGeneration == checkpoint.generation && + _outboxStatusFromInt(entity.state) == + CloudOutboxStatus.paused && + entity.nextEligibleAtMs <= nowMs, + ) + .map((entity) => entity.lastErrorCategory) + .whereType() + .map(_failureOrNull) + .whereType() + .toSet(); + }); + } + + /// Read-only, exact-scope inspection used by the manual one-row canary and + /// its process-death recovery path. No row is leased or mutated. + Future> readOutboxEntries( + CloudSyncScope scope, + ) async { + return _store.runInTransaction(TxMode.read, () { + final entries = _findOutboxForScopeLocked(scope) + .map((entity) => _outboxFromEntity(scope, entity)) + .toList(growable: false); + entries.sort((left, right) { + final revision = left.mutationRevision.compareTo( + right.mutationRevision, + ); + return revision != 0 + ? revision + : left.operationId.compareTo(right.operationId); + }); + return entries; + }); + } + + @override + Future postponeEligiblePausedOutbox( + CloudSyncScope scope, { + required Set categories, + required DateTime now, + required DateTime nextEligibleAt, + }) async { + final nowMs = now.millisecondsSinceEpoch; + final nextEligibleAtMs = nextEligibleAt.millisecondsSinceEpoch; + final categoryNames = categories.map((category) => category.name).toSet(); + return _store.runInTransaction(TxMode.write, () { + final checkpoint = _checkpointLocked(scope, nowMs: nowMs); + _fenceStaleOutboxLocked(scope, checkpoint: checkpoint, nowMs: nowMs); + var postponed = 0; + for (final entity in _findOutboxForScopeLocked(scope)) { + if (_outboxStatusFromInt(entity.state) != CloudOutboxStatus.paused || + entity.lastErrorCategory == null || + !categoryNames.contains(entity.lastErrorCategory) || + entity.nextEligibleAtMs > nowMs) { + continue; + } + entity + ..nextEligibleAtMs = nextEligibleAtMs + ..updatedAtMs = nowMs; + _outbox.put(entity); + postponed++; + } + return postponed; + }); + } + + @override + Future tryAcquireCoordinatorLease( + CloudSyncScope scope, { + required String ownerId, + required DateTime now, + required Duration leaseDuration, + }) async { + if (ownerId.isEmpty) throw ArgumentError.value(ownerId, 'ownerId'); + final scopeKey = _scopeKey(scope); + final leaseKey = _scopedDigest(scope, 'coordinator-lease', 'v1'); + final ownerIdHash = _digest('coordinator-owner\u001f$ownerId'); + final nowMs = now.millisecondsSinceEpoch; + return _store.runInTransaction(TxMode.write, () { + final existing = _findLeaseByKeyLocked(leaseKey); + if (existing != null && existing.expiresAtMs > nowMs) return null; + final generation = (existing?.generation ?? 0) + 1; + _leases.put( + CloudSyncLeaseEntity( + id: existing?.id ?? 0, + leaseKey: leaseKey, + scopeKey: scopeKey, + accountFingerprint: scope.accountFingerprint, + ownerIdHash: ownerIdHash, + generation: generation, + acquiredAtMs: nowMs, + expiresAtMs: now.add(leaseDuration).millisecondsSinceEpoch, + ), + ); + return CloudCoordinatorLeaseFence( + ownerId: ownerId, + generation: generation, + ); + }); + } + + @override + Future renewCoordinatorLease( + CloudSyncScope scope, { + required CloudCoordinatorLeaseFence leaseFence, + required DateTime now, + required Duration leaseDuration, + }) async { + if (leaseFence.ownerId.isEmpty) { + throw ArgumentError.value(leaseFence.ownerId, 'leaseFence.ownerId'); + } + final leaseKey = _scopedDigest(scope, 'coordinator-lease', 'v1'); + final ownerIdHash = _digest('coordinator-owner\u001f${leaseFence.ownerId}'); + final nowMs = now.millisecondsSinceEpoch; + return _store.runInTransaction(TxMode.write, () { + final existing = _findLeaseByKeyLocked(leaseKey); + if (existing == null || + existing.scopeKey != _scopeKey(scope) || + existing.ownerIdHash != ownerIdHash || + existing.generation != leaseFence.generation || + existing.expiresAtMs <= nowMs) { + return false; + } + existing.expiresAtMs = now.add(leaseDuration).millisecondsSinceEpoch; + _leases.put(existing); + return true; + }); + } + + @override + Future releaseCoordinatorLease( + CloudSyncScope scope, { + required CloudCoordinatorLeaseFence leaseFence, + }) async { + final leaseKey = _scopedDigest(scope, 'coordinator-lease', 'v1'); + final ownerIdHash = _digest('coordinator-owner\u001f${leaseFence.ownerId}'); + _store.runInTransaction(TxMode.write, () { + final existing = _findLeaseByKeyLocked(leaseKey); + if (existing != null && + existing.scopeKey == _scopeKey(scope) && + existing.ownerIdHash == ownerIdHash && + existing.generation == leaseFence.generation) { + // Preserve the generation tombstone. Deleting the row would let a + // same-owner release/reacquire cycle reuse generation 1 and make an + // old fence valid again. + existing.expiresAtMs = 0; + _leases.put(existing); + } + }); + } + + @override + Future readRecordMap( + CloudSyncScope scope, { + required String logicalEntityKeyHash, + required int generation, + }) async { + final mapKey = _scopedDigest(scope, 'record-map', logicalEntityKeyHash); + return _store.runInTransaction(TxMode.read, () { + final checkpoint = _findCheckpointByKeyLocked(_scopeKey(scope)); + if (generation <= 0 || checkpoint?.generation != generation) { + throw _storageFailure('record_map_generation_mismatch'); + } + final entity = _findRecordMapByKeyLocked(mapKey); + if (entity == null || entity.generation != generation) return null; + if (entity.scopeKey != _scopeKey(scope)) { + throw _storageFailure('scope_collision'); + } + return CloudRecordMapEntry( + scope: scope, + logicalEntityKeyHash: entity.logicalEntityKeyHash, + serverRecordIdHash: entity.serverRecordIdHash, + encryptedServerRecordId: entity.encryptedServerRecordId, + etagHash: entity.etagHash, + encryptedRawRecordReference: entity.encryptedRawRecordRef, + updatedAt: DateTime.fromMillisecondsSinceEpoch( + entity.updatedAtMs, + isUtc: true, + ), + ); + }); + } + + @override + Future upsertRecordMap( + CloudRecordMapEntry entry, { + required int generation, + }) async { + final mapKey = _scopedDigest( + entry.scope, + 'record-map', + entry.logicalEntityKeyHash, + ); + _store.runInTransaction(TxMode.write, () { + final checkpoint = _checkpointLocked( + entry.scope, + nowMs: entry.updatedAt.millisecondsSinceEpoch, + ); + if (generation <= 0 || checkpoint.generation != generation) { + throw _storageFailure('record_map_generation_mismatch'); + } + final existing = _findRecordMapByKeyLocked(mapKey); + if (existing != null && + existing.generation == generation && + existing.serverRecordIdHash != entry.serverRecordIdHash) { + throw CloudSyncFailure( + category: CloudFailureCategory.conflict, + safeCode: 'server_mapping_changed', + ); + } + _recordMaps.put( + CloudRecordMapEntity( + id: existing?.id ?? 0, + mapKey: mapKey, + scopeKey: _scopeKey(entry.scope), + accountFingerprint: entry.scope.accountFingerprint, + zone: entry.scope.zone, + logicalEntityKeyHash: entry.logicalEntityKeyHash, + serverRecordIdHash: entry.serverRecordIdHash, + generation: generation, + encryptedServerRecordId: existing?.generation == generation + ? existing!.encryptedServerRecordId + : entry.encryptedServerRecordId, + etagHash: entry.etagHash, + encryptedRawRecordRef: entry.encryptedRawRecordReference, + updatedAtMs: entry.updatedAt.millisecondsSinceEpoch, + ), + ); + }); + } + + @override + Future recordRun(CloudSyncRunRecord run) async { + _store.runInTransaction(TxMode.write, () { + _runs.put( + CloudSyncRunEntity( + runId: _scopedDigest(run.scope, 'run', run.runId), + scopeKey: _scopeKey(run.scope), + accountFingerprint: run.scope.accountFingerprint, + trigger: run.triggerName, + architecture: run.architectureName, + mode: run.modeName, + fetchedCount: run.counters.fetched, + appliedCount: run.counters.applied, + deferredCount: run.counters.deferred, + quarantinedCount: run.counters.quarantined, + confirmedCount: run.counters.confirmed, + retriedCount: run.counters.retried, + startedAtMs: run.startedAt.millisecondsSinceEpoch, + finishedAtMs: run.finishedAt.millisecondsSinceEpoch, + failureCategory: run.failureCategory?.name, + ), + ); + _trimRunHistoryLocked(run.scope); + }); + } + + Future _protectCheckpointToken( + CloudSyncScope scope, + String? token, + ) async { + if (token == null) return null; + try { + return await _protector.protect( + scope: scope, + kind: CloudSyncProtectedValueKind.checkpointToken, + plaintext: token, + ); + } catch (_) { + throw _storageFailure('checkpoint_protect_failed'); + } + } + + CloudSyncCheckpointEntity _checkpointLocked( + CloudSyncScope scope, { + required int nowMs, + }) { + final checkpointKey = _scopeKey(scope); + final existing = _findCheckpointByKeyLocked(checkpointKey); + if (existing != null) { + _validateCheckpointScope(existing, scope); + if (existing.generation == 0) { + if (existing.fetchedTokenCiphertext != null || + existing.lastBatchId != null || + existing.fetchedSequence != 0 || + existing.appliedSequence != 0 || + existing.mutationRevisionCounter != 0 || + _findInboxForScopeLocked(scope).isNotEmpty) { + throw _storageFailure( + 'checkpoint_generation_zero_requires_rebootstrap', + ); + } + existing + ..generation = 1 + ..updatedAtMs = nowMs; + _checkpoints.put(existing); + } + if (existing.generation <= 0) { + throw _storageFailure('checkpoint_generation_invalid'); + } + return existing; + } + final created = CloudSyncCheckpointEntity( + checkpointKey: checkpointKey, + accountFingerprint: scope.accountFingerprint, + container: scope.container, + database: scope.database, + zone: scope.zone, + streamKind: scope.streamKind.name, + schemaVersion: scope.schemaVersion, + updatedAtMs: nowMs, + ); + created.id = _checkpoints.put(created); + return created; + } + + CloudSyncCheckpoint _checkpointFromEntity( + CloudSyncScope scope, + CloudSyncCheckpointEntity entity, { + required String? fetchedToken, + }) { + _validateCheckpointScope(entity, scope); + return CloudSyncCheckpoint( + scope: scope, + fetchedToken: fetchedToken, + generation: entity.generation, + lastBatchId: entity.lastBatchId, + fetchedSequence: entity.fetchedSequence, + lastAppliedSequence: entity.appliedSequence, + mutationRevisionCounter: entity.mutationRevisionCounter, + consecutivePullFailures: entity.backoffAttempt, + nextPullEligibleAt: _dateOrNull(entity.nextEligibleAtMs), + lastSuccessfulRunAt: _dateOrNull(entity.lastSuccessfulAtMs), + lastFailure: _failureOrNull(entity.lastErrorCategory), + ); + } + + void _validateCheckpointScope( + CloudSyncCheckpointEntity entity, + CloudSyncScope scope, + ) { + if (entity.checkpointKey != _scopeKey(scope) || + entity.accountFingerprint != scope.accountFingerprint || + entity.container != scope.container || + entity.database != scope.database || + entity.zone != scope.zone || + entity.streamKind != scope.streamKind.name || + entity.schemaVersion != scope.schemaVersion) { + throw _storageFailure('scope_collision'); + } + } + + CloudInboxEntry _inboxFromEntity( + CloudSyncScope scope, + CloudInboxChangeEntity entity, + ) { + if (entity.scopeKey != _scopeKey(scope)) { + throw _storageFailure('scope_collision'); + } + if (!RegExp(r'^[A-Za-z0-9_-]{43}$').hasMatch(entity.changeIdHash)) { + throw _storageFailure('inbox_change_id_missing_or_invalid'); + } + return CloudInboxEntry( + scope: scope, + sequence: entity.fetchSequence, + change: CloudFetchedChange( + changeId: entity.changeIdHash, + recordIdHash: entity.serverRecordIdHash, + etagHash: entity.etagHash, + type: _changeTypeFromName(entity.changeType), + encryptedServerRecordId: entity.encryptedServerRecordId, + protectedSystemFieldsReference: entity.protectedSystemFieldsRef, + encryptedPayloadReference: entity.encryptedPayloadRef, + payloadSha256: entity.payloadSha256, + isTombstone: entity.isTombstone, + serverModifiedAt: _dateOrNull(entity.serverModifiedAtMs), + preflightFailure: _failureOrNull(entity.failureCategory), + ), + status: _inboxStatusFromInt(entity.status), + attemptCount: entity.retryCount, + createdAt: DateTime.fromMillisecondsSinceEpoch( + entity.createdAtMs, + isUtc: true, + ), + batchId: entity.batchId, + generation: entity.generation, + nextEligibleAt: _dateOrNull(entity.nextEligibleAtMs), + lastFailure: _failureOrNull(entity.failureCategory), + completedAt: _dateOrNull(entity.completedAtMs), + ); + } + + CloudOutboxOperation _outboxFromEntity( + CloudSyncScope scope, + CloudOutboxOperationEntity entity, { + String? leaseId, + }) { + if (entity.scopeKey != _scopeKey(scope)) { + throw _storageFailure('scope_collision'); + } + return CloudOutboxOperation( + scope: scope, + operationId: entity.operationId, + logicalEntityKeyHash: entity.logicalEntityKeyHash, + action: _actionFromInt(entity.action), + payloadVersion: entity.payloadVersion, + mutationRevision: entity.mutationRevision, + checkpointGeneration: entity.checkpointGeneration, + encryptedPayloadReference: entity.encryptedPayloadRef, + payloadSha256: entity.payloadSha256, + serverRecordIdHash: entity.serverRecordIdHash, + protectedLeaseReference: entity.protectedLeaseReference, + appleRequestUuid: entity.appleRequestUuid, + appleOperationUuid: entity.appleOperationUuid, + dependencyOperationIds: _decodeDependencies( + entity.dependencyOperationIdsJson, + ), + createdAt: DateTime.fromMillisecondsSinceEpoch( + entity.createdAtMs, + isUtc: true, + ), + status: _outboxStatusFromInt(entity.state), + attemptCount: entity.attemptCount, + nextEligibleAt: _dateOrNull(entity.nextEligibleAtMs), + lastFailure: _failureOrNull(entity.lastErrorCategory), + leaseId: leaseId, + leaseExpiresAt: _dateOrNull(entity.leaseExpiresAtMs), + confirmedAt: _dateOrNull(entity.confirmedAtMs), + ); + } + + void _enqueueOutboxLocked(CloudOutboxOperation operation) { + final identical = _findOutboxByOperationIdLocked(operation.operationId); + if (identical != null) { + if (identical.scopeKey != _scopeKey(operation.scope)) { + throw _storageFailure('outbox_operation_scope_collision'); + } + return; + } + + if (operation.action == CloudOutboxAction.save) { + final candidates = _findOutboxForScopeLocked(operation.scope) + .where( + (entity) => + _actionFromInt(entity.action) == CloudOutboxAction.save && + entity.logicalEntityKeyHash == operation.logicalEntityKeyHash, + ) + .toList(); + final newerOrEqualExists = candidates.any( + (entity) => + _outboxStatusFromInt(entity.state) != + CloudOutboxStatus.quarantined && + entity.mutationRevision >= operation.mutationRevision, + ); + if (newerOrEqualExists) return; + + final superseded = candidates + .where( + (entity) => + _outboxStatusFromInt(entity.state) == + CloudOutboxStatus.pending && + entity.mutationRevision < operation.mutationRevision, + ) + .toList(); + final supersededIds = superseded + .map((entity) => entity.operationId) + .toSet(); + if (supersededIds.isNotEmpty) { + for (final dependent in _findOutboxForScopeLocked(operation.scope)) { + if (_outboxStatusFromInt(dependent.state) != + CloudOutboxStatus.pending) { + continue; + } + final dependencies = _decodeDependencies( + dependent.dependencyOperationIdsJson, + ); + if (!dependencies.any(supersededIds.contains)) continue; + dependent + ..dependencyOperationIdsJson = _encodeDependencies({ + ...dependencies.where( + (dependency) => !supersededIds.contains(dependency), + ), + operation.operationId, + }) + ..updatedAtMs = operation.createdAt.millisecondsSinceEpoch; + _outbox.put(dependent); + } + _outbox.removeMany( + superseded.map((entity) => entity.id).toList(growable: false), + ); + } + } + _outbox.put(_outboxEntity(operation)); + } + + CloudOutboxOperationEntity _outboxEntity(CloudOutboxOperation operation) { + final createdAtMs = operation.createdAt.millisecondsSinceEpoch; + return CloudOutboxOperationEntity( + operationId: operation.operationId, + scopeKey: _scopeKey(operation.scope), + accountFingerprint: operation.scope.accountFingerprint, + zone: operation.scope.zone, + logicalEntityKeyHash: operation.logicalEntityKeyHash, + action: _actionToInt(operation.action), + dependencyOperationIdsJson: _encodeDependencies( + operation.dependencyOperationIds, + ), + payloadVersion: operation.payloadVersion, + mutationRevision: operation.mutationRevision, + checkpointGeneration: operation.checkpointGeneration, + encryptedPayloadRef: operation.encryptedPayloadReference, + payloadSha256: operation.payloadSha256, + protectedLeaseReference: operation.protectedLeaseReference, + state: _outboxStatusToInt(operation.status), + attemptCount: operation.attemptCount, + nextEligibleAtMs: operation.nextEligibleAt?.millisecondsSinceEpoch ?? 0, + lastErrorCategory: operation.lastFailure?.name, + serverRecordIdHash: operation.serverRecordIdHash, + appleRequestUuid: operation.appleRequestUuid, + appleOperationUuid: operation.appleOperationUuid, + leaseIdHash: operation.leaseId == null + ? null + : _digest('outbox-lease\u001f${operation.leaseId}'), + leaseExpiresAtMs: operation.leaseExpiresAt?.millisecondsSinceEpoch ?? 0, + confirmedAtMs: operation.confirmedAt?.millisecondsSinceEpoch ?? 0, + createdAtMs: createdAtMs, + updatedAtMs: createdAtMs, + ); + } + + int _recoverExpiredOutboxLeasesLocked(CloudSyncScope scope, int nowMs) { + var recovered = 0; + for (final entity in _findOutboxForScopeLocked(scope)) { + if (_outboxStatusFromInt(entity.state) == CloudOutboxStatus.leased && + entity.leaseExpiresAtMs > 0 && + entity.leaseExpiresAtMs <= nowMs) { + entity + ..state = _outboxStatusToInt(CloudOutboxStatus.pending) + ..leaseIdHash = null + ..leaseExpiresAtMs = 0 + ..updatedAtMs = nowMs; + _outbox.put(entity); + recovered++; + } + } + return recovered; + } + + void _fenceStaleOutboxLocked( + CloudSyncScope scope, { + required CloudSyncCheckpointEntity checkpoint, + required int nowMs, + }) { + for (final entity in _findOutboxForScopeLocked(scope)) { + final status = _outboxStatusFromInt(entity.state); + if (!_isBlockingOutboxStatus(status) || + entity.checkpointGeneration == checkpoint.generation) { + continue; + } + entity + ..state = _outboxStatusToInt(CloudOutboxStatus.quarantined) + ..attemptCount += 1 + ..lastErrorCategory = CloudFailureCategory.localStorage.name + ..nextEligibleAtMs = 0 + ..leaseIdHash = null + ..leaseExpiresAtMs = 0 + ..updatedAtMs = nowMs; + _outbox.put(entity); + } + } + + bool _isBlockingOutboxStatus(CloudOutboxStatus status) => + status == CloudOutboxStatus.pending || + status == CloudOutboxStatus.leased || + status == CloudOutboxStatus.paused || + status == CloudOutboxStatus.unknownOutcome; + + int _compareMutationOrder( + CloudOutboxOperationEntity first, + CloudOutboxOperationEntity second, + ) { + final revision = first.mutationRevision.compareTo(second.mutationRevision); + if (revision != 0) return revision; + return first.operationId.compareTo(second.operationId); + } + + void _advanceContiguousAppliedLocked(CloudSyncScope scope, int nowMs) { + final checkpoint = _checkpointLocked(scope, nowMs: nowMs); + var next = checkpoint.appliedSequence + 1; + while (true) { + final entity = _findInboxBySequenceLocked(scope, next); + if (entity == null || + !_isTerminalInboxStatus(_inboxStatusFromInt(entity.status))) { + break; + } + next++; + } + final appliedThrough = next - 1; + if (appliedThrough != checkpoint.appliedSequence) { + checkpoint + ..appliedSequence = appliedThrough + ..updatedAtMs = nowMs; + _checkpoints.put(checkpoint); + } + } + + bool _isTerminalInboxStatus(CloudInboxStatus status) => + status == CloudInboxStatus.applied || + status == CloudInboxStatus.quarantined; + + void _validateTransition(CloudOutboxTransition transition) { + if (transition.type == CloudOutboxTransitionType.retryable && + (transition.category == null || transition.nextEligibleAt == null)) { + throw ArgumentError( + 'Retryable outbox transitions require category and next time', + ); + } + if (transition.type == CloudOutboxTransitionType.paused && + transition.category == null) { + throw ArgumentError( + 'Paused outbox transitions require a failure category', + ); + } + } + + void _trimRunHistoryLocked(CloudSyncScope scope) { + final builder = _runs.query( + CloudSyncRunEntity_.scopeKey.equals(_scopeKey(scope)), + )..order(CloudSyncRunEntity_.startedAtMs); + final query = builder.build(); + try { + final rows = query.find(); + final excess = rows.length - _maximumRetainedRunsPerScope; + if (excess > 0) { + _runs.removeMany( + rows.take(excess).map((row) => row.id).toList(growable: false), + ); + } + } finally { + query.close(); + } + } + + CloudShadowJournalUsage _shadowJournalUsageLocked( + CloudSyncScope scope, + CloudShadowJournalBudget budget, + ) { + final builder = _inbox.query( + CloudInboxChangeEntity_.scopeKey + .equals(_scopeKey(scope)) + .and( + CloudInboxChangeEntity_.status.equals( + _inboxStatusToInt(CloudInboxStatus.pending), + ), + ), + )..order(CloudInboxChangeEntity_.fetchSequence); + final query = builder.build(); + try { + var usage = CloudShadowJournalUsage.empty; + for (final entity in query.find()) { + final checkpoint = _findCheckpointByKeyLocked(_scopeKey(scope)); + if (checkpoint == null || entity.generation != checkpoint.generation) { + continue; + } + final entry = _inboxFromEntity(scope, entity); + usage = usage.add( + entries: 1, + bytes: budget.estimateEntryBytes( + scope: scope, + batchId: entry.batchId, + change: entry.change, + ), + oldestAt: entry.createdAt, + ); + } + return usage; + } finally { + query.close(); + } + } + + CloudSyncCheckpointEntity? _findCheckpointByKeyLocked(String key) { + final query = + _checkpoints + .query(CloudSyncCheckpointEntity_.checkpointKey.equals(key)) + .build() + ..limit = 1; + try { + return query.findFirst(); + } finally { + query.close(); + } + } + + CloudInboxChangeEntity? _findInboxByChangeKeyLocked(String key) { + final query = + _inbox.query(CloudInboxChangeEntity_.changeKey.equals(key)).build() + ..limit = 1; + try { + return query.findFirst(); + } finally { + query.close(); + } + } + + CloudInboxChangeEntity? _findInboxBySequenceLocked( + CloudSyncScope scope, + int sequence, + ) { + final query = _inbox + .query( + CloudInboxChangeEntity_.scopeKey + .equals(_scopeKey(scope)) + .and(CloudInboxChangeEntity_.fetchSequence.equals(sequence)), + ) + .build(); + try { + final checkpoint = _findCheckpointByKeyLocked(_scopeKey(scope)); + final matches = query + .find() + .where((entity) => entity.generation == checkpoint?.generation) + .toList(growable: false); + if (matches.length > 1) { + throw _storageFailure('inbox_sequence_ambiguous'); + } + return matches.isEmpty ? null : matches.single; + } finally { + query.close(); + } + } + + List _findInboxForScopeLocked(CloudSyncScope scope) { + final query = _inbox + .query(CloudInboxChangeEntity_.scopeKey.equals(_scopeKey(scope))) + .build(); + try { + return query.find(); + } finally { + query.close(); + } + } + + List _findRecordMapsForScopeLocked( + CloudSyncScope scope, + ) { + final query = _recordMaps + .query(CloudRecordMapEntity_.scopeKey.equals(_scopeKey(scope))) + .build(); + try { + return query.find(); + } finally { + query.close(); + } + } + + CloudInboxChangeEntity _requireInboxLocked( + CloudSyncScope scope, + int sequence, + ) { + final entity = _findInboxBySequenceLocked(scope, sequence); + if (entity == null) throw _storageFailure('inbox_entry_missing'); + return entity; + } + + List _findOutboxForScopeLocked( + CloudSyncScope scope, + ) { + final query = _outbox + .query(CloudOutboxOperationEntity_.scopeKey.equals(_scopeKey(scope))) + .build(); + try { + return query.find(); + } finally { + query.close(); + } + } + + CloudOutboxOperationEntity? _findOutboxByOperationIdLocked( + String operationId, + ) { + final query = + _outbox + .query(CloudOutboxOperationEntity_.operationId.equals(operationId)) + .build() + ..limit = 1; + try { + return query.findFirst(); + } finally { + query.close(); + } + } + + CloudSyncLeaseEntity? _findLeaseByKeyLocked(String leaseKey) { + final query = + _leases.query(CloudSyncLeaseEntity_.leaseKey.equals(leaseKey)).build() + ..limit = 1; + try { + return query.findFirst(); + } finally { + query.close(); + } + } + + void _requireActiveCoordinatorLeaseLocked( + CloudSyncScope scope, + CloudCoordinatorLeaseFence leaseFence, { + required int nowMs, + }) { + final leaseKey = _scopedDigest(scope, 'coordinator-lease', 'v1'); + final ownerIdHash = _digest('coordinator-owner\u001f${leaseFence.ownerId}'); + final lease = _findLeaseByKeyLocked(leaseKey); + if (lease == null || + lease.scopeKey != _scopeKey(scope) || + lease.ownerIdHash != ownerIdHash || + lease.generation != leaseFence.generation || + lease.expiresAtMs <= nowMs) { + throw _storageFailure('coordinator_lease_fence_lost'); + } + } + + void _adoptProtectedPageLeaseLocked( + CloudFetchBatch batch, { + required int nowMs, + }) { + final leaseReference = batch.protectedPageLeaseReference; + if (leaseReference == null) return; + if (!_isProtectedPageLease(leaseReference)) { + throw _storageFailure('protected_page_lease_reference_invalid'); + } + final scopeKey = _scopeKey(batch.scope); + final batchIdHash = _digest('protected-page-batch\u001f${batch.batchId}'); + final existing = _findProtectedPageLeaseLocked(leaseReference); + if (existing != null) { + if (existing.scopeKey != scopeKey || + existing.accountFingerprint != batch.scope.accountFingerprint || + existing.generation != batch.generation || + existing.batchIdHash != batchIdHash) { + throw _storageFailure('protected_page_lease_adoption_collision'); + } + return; + } + _protectedPageLeases.put( + CloudProtectedPageLeaseEntity( + leaseReference: leaseReference, + scopeKey: scopeKey, + accountFingerprint: batch.scope.accountFingerprint, + generation: batch.generation, + batchIdHash: batchIdHash, + adoptedAtMs: nowMs, + ), + ); + } + + CloudProtectedPageLeaseEntity? _findProtectedPageLeaseLocked( + String leaseReference, + ) { + final query = + _protectedPageLeases + .query( + CloudProtectedPageLeaseEntity_.leaseReference.equals( + leaseReference, + ), + ) + .build() + ..limit = 1; + try { + return query.findFirst(); + } finally { + query.close(); + } + } + + bool _isProtectedPageLease(String value) => + RegExp(r'^obcs2\.lease\.[0-9a-f]{32}$').hasMatch(value); + + bool _isNativeProtectedReference(String value) => + RegExp(r'^obcs2\.ref\.[A-Za-z0-9_-]{43}$').hasMatch(value); + + bool _isNativeDigest(String value) => + RegExp(r'^[A-Za-z0-9_-]{43}$').hasMatch(value); + + bool _isContentDigest(String value) => + RegExp(r'^[a-f0-9]{64}$').hasMatch(value); + + CloudSyncScope _scopeFromCheckpointEntity(CloudSyncCheckpointEntity entity) { + final stream = CloudSyncStreamKind.values + .where((candidate) => candidate.name == entity.streamKind) + .toList(growable: false); + if (stream.length != 1) { + throw _storageFailure('checkpoint_stream_invalid'); + } + final scope = CloudSyncScope( + accountFingerprint: entity.accountFingerprint, + container: entity.container, + database: entity.database, + zone: entity.zone, + streamKind: stream.single, + schemaVersion: entity.schemaVersion, + ); + _validateCheckpointScope(entity, scope); + return scope; + } + + CloudRecordMapEntity? _findRecordMapByKey(String mapKey) { + final query = + _recordMaps.query(CloudRecordMapEntity_.mapKey.equals(mapKey)).build() + ..limit = 1; + try { + return query.findFirst(); + } finally { + query.close(); + } + } + + CloudRecordMapEntity? _findRecordMapByKeyLocked(String mapKey) => + _findRecordMapByKey(mapKey); + + String _scopeKey(CloudSyncScope scope) => cloudSyncPersistentScopeKey(scope); + + String _scopedDigest(CloudSyncScope scope, String purpose, String value) => + '$purpose:${_digest('${scope.storageKey}\u001f$purpose\u001f$value')}'; + + String _digest(String value) => sha256.convert(utf8.encode(value)).toString(); + + String _changeKey(CloudSyncScope scope, int generation, String changeId) => + generation == 1 + ? _scopedDigest(scope, 'change', changeId) + : _scopedDigest(scope, 'change-generation-$generation', changeId); + + String _encodeDependencies(Iterable values) { + final sorted = values.toSet().toList()..sort(); + return jsonEncode(sorted); + } + + Set _decodeDependencies(String encoded) { + try { + final decoded = jsonDecode(encoded); + if (decoded is! List || + decoded.any((value) => value is! String || value.isEmpty)) { + throw const FormatException(); + } + return decoded.cast().toSet(); + } catch (_) { + throw _storageFailure('outbox_dependencies_invalid'); + } + } + + DateTime? _dateOrNull(int milliseconds) => milliseconds <= 0 + ? null + : DateTime.fromMillisecondsSinceEpoch(milliseconds, isUtc: true); + + CloudFailureCategory? _failureOrNull(String? name) { + if (name == null) return null; + for (final value in CloudFailureCategory.values) { + if (value.name == name) return value; + } + throw _storageFailure('failure_category_invalid'); + } + + CloudChangeType _changeTypeFromName(String name) { + for (final value in CloudChangeType.values) { + if (value.name == name) return value; + } + throw _storageFailure('change_type_invalid'); + } + + int _inboxStatusToInt(CloudInboxStatus status) => switch (status) { + CloudInboxStatus.pending => 0, + CloudInboxStatus.applied => 1, + CloudInboxStatus.quarantined => 2, + }; + + CloudInboxStatus _inboxStatusFromInt(int status) => switch (status) { + 0 => CloudInboxStatus.pending, + 1 => CloudInboxStatus.applied, + 2 => CloudInboxStatus.quarantined, + _ => throw _storageFailure('inbox_status_invalid'), + }; + + int _actionToInt(CloudOutboxAction action) => switch (action) { + CloudOutboxAction.save => 0, + CloudOutboxAction.delete => 1, + }; + + CloudOutboxAction _actionFromInt(int action) => switch (action) { + 0 => CloudOutboxAction.save, + 1 => CloudOutboxAction.delete, + _ => throw _storageFailure('outbox_action_invalid'), + }; + + int _outboxStatusToInt(CloudOutboxStatus status) => switch (status) { + CloudOutboxStatus.pending => 0, + CloudOutboxStatus.leased => 1, + CloudOutboxStatus.confirmed => 2, + CloudOutboxStatus.paused => 3, + CloudOutboxStatus.quarantined => 4, + CloudOutboxStatus.unknownOutcome => 5, + }; + + CloudOutboxStatus _outboxStatusFromInt(int status) => switch (status) { + 0 => CloudOutboxStatus.pending, + 1 => CloudOutboxStatus.leased, + 2 => CloudOutboxStatus.confirmed, + 3 => CloudOutboxStatus.paused, + 4 => CloudOutboxStatus.quarantined, + 5 => CloudOutboxStatus.unknownOutcome, + _ => throw _storageFailure('outbox_status_invalid'), + }; + + void _requirePositiveLimit(int limit) { + if (limit <= 0 || limit > 256 * 8) { + throw ArgumentError.value(limit, 'limit'); + } + } + + int _nowMs() => _clock().toUtc().millisecondsSinceEpoch; + + CloudSyncFailure _storageFailure(String safeCode) => CloudSyncFailure( + category: CloudFailureCategory.localStorage, + safeCode: safeCode, + ); +} + +final class _ProtectedCheckpointCapture { + const _ProtectedCheckpointCapture({ + required this.scope, + required this.ciphertext, + }); + + final CloudSyncScope scope; + final String ciphertext; +} + +final class _ProtectedReferenceCapture { + const _ProtectedReferenceCapture({ + required this.references, + required this.checkpoints, + required this.isComplete, + }); + + const _ProtectedReferenceCapture.incomplete() + : references = const {}, + checkpoints = const [], + isComplete = false; + + final Set references; + final List<_ProtectedCheckpointCapture> checkpoints; + final bool isComplete; +} diff --git a/lib/services/rustpush/cloud_sync/rust_cloud_semantic_decoder.dart b/lib/services/rustpush/cloud_sync/rust_cloud_semantic_decoder.dart new file mode 100644 index 0000000000..7b2cec8c24 --- /dev/null +++ b/lib/services/rustpush/cloud_sync/rust_cloud_semantic_decoder.dart @@ -0,0 +1,976 @@ +import 'package:bluebubbles/src/rust/api/api.dart' as frb_api; +import 'package:bluebubbles/src/rust/frb_generated.dart' as frb_generated; +import 'package:bluebubbles/src/rust/lib.dart' as frb_lib; + +import 'cloud_inbox_applier.dart'; +import 'cloud_merge_policy.dart'; +import 'cloud_sync_manual_shadow_sampler.dart'; +import 'cloud_sync_models.dart'; + +final class CloudTombstoneIdentity { + const CloudTombstoneIdentity({ + required this.scope, + required this.generation, + required this.changeId, + required this.serverRecordIdHash, + required this.kind, + required this.logicalEntityKeyHash, + }); + + final CloudSyncScope scope; + final int generation; + final String changeId; + final String serverRecordIdHash; + final CloudEntityKind kind; + final String logicalEntityKeyHash; +} + +abstract interface class CloudTombstoneIdentityResolver { + Future resolve(CloudInboxEntry entry); +} + +final class RustCloudSemanticDecodeRequest { + const RustCloudSemanticDecodeRequest({ + required this.authSnapshot, + required this.storageDirectory, + required this.entry, + required this.protectedStoreIdentity, + required this.nativeStream, + this.tombstoneIdentity, + }); + + final CloudSyncNativeAuthSnapshot authSnapshot; + final String storageDirectory; + final CloudInboxEntry entry; + final String protectedStoreIdentity; + final String nativeStream; + final CloudTombstoneIdentity? tombstoneIdentity; +} + +abstract interface class RustCloudSemanticDecodeBindings { + Future decode( + RustCloudSemanticDecodeRequest request, + ); +} + +final class FrbRustCloudSemanticDecodeBindings + implements RustCloudSemanticDecodeBindings { + FrbRustCloudSemanticDecodeBindings({frb_generated.RustLibApi? api}) + // ignore: invalid_use_of_internal_member + : _api = api ?? frb_generated.RustLib.instance.api; + + final frb_generated.RustLibApi _api; + + @override + Future decode( + RustCloudSemanticDecodeRequest request, + ) { + final client = request.authSnapshot.cloudMessagesClient; + if (client is! frb_lib.ArcCloudMessagesClientDefaultAnisetteProvider) { + throw ArgumentError('cloud_semantic_decoder_client_invalid'); + } + final entry = request.entry; + final change = entry.change; + final tombstone = request.tombstoneIdentity; + return _api.crateApiApiCloudSyncDecodeProtectedChange( + cloudMessagesClient: client, + storageDirectory: request.storageDirectory, + expectedAccountFingerprint: entry.scope.accountFingerprint, + expectedProtectedStoreIdentity: request.protectedStoreIdentity, + container: entry.scope.container, + database: entry.scope.database, + zone: entry.scope.zone, + streamKind: entry.scope.streamKind.name, + schemaVersion: entry.scope.schemaVersion, + nativeStream: request.nativeStream, + generation: BigInt.from(entry.generation), + expectedChangeKind: switch (change.type) { + CloudChangeType.save => frb_api.CloudSyncProtectedChangeKind.save, + CloudChangeType.delete => frb_api.CloudSyncProtectedChangeKind.delete, + }, + expectedChangeId: change.changeId, + expectedRecordIdHash: change.recordIdHash, + expectedEtagHash: change.etagHash, + expectedPayloadSha256: change.payloadSha256!, + expectedPayloadLength: null, + expectedServerModifiedAtMillis: + change.serverModifiedAt?.millisecondsSinceEpoch, + protectedRawEnvelopeReference: change.encryptedPayloadReference!, + tombstoneEntityKind: tombstone == null + ? null + : _entityKindToFrb(tombstone.kind), + tombstoneLogicalEntityKeyHash: tombstone?.logicalEntityKeyHash, + ); + } +} + +/// Production-capable, default-uncomposed semantic decoder for one protected +/// CloudKit journal entry. +/// +/// Decrypted payloads remain in memory and are mapped directly into redacted +/// semantic DTOs. This class never logs or persists their contents. Production +/// composition must still supply the separately reviewed canonical identity +/// and entity adapters before semantic apply can be enabled. +final class RustCloudSemanticDecoder implements CloudSemanticDecoder { + factory RustCloudSemanticDecoder({ + required CloudSyncNativeAuthSnapshotReader readAuthSnapshot, + required String storageDirectory, + RustCloudSemanticDecodeBindings? bindings, + CloudTombstoneIdentityResolver? tombstoneIdentityResolver, + }) => RustCloudSemanticDecoder._( + readAuthSnapshot, + _validateStorageDirectory(storageDirectory), + bindings ?? FrbRustCloudSemanticDecodeBindings(), + tombstoneIdentityResolver, + ); + + RustCloudSemanticDecoder._( + this._readAuthSnapshot, + this._storageDirectory, + this._bindings, + this._tombstoneIdentityResolver, + ); + + static final RegExp _externalDigest = RegExp(r'^[A-Za-z0-9_-]{43}$'); + static final RegExp _contentDigest = RegExp( + r'^(?:[A-Za-z0-9_-]{43}|[0-9a-f]{64})$', + ); + static final RegExp _payloadDigest = RegExp(r'^[0-9a-f]{64}$'); + static final RegExp _protectedReference = RegExp( + r'^obcs2\.ref\.[A-Za-z0-9_-]{43}$', + ); + + final CloudSyncNativeAuthSnapshotReader _readAuthSnapshot; + final String _storageDirectory; + final RustCloudSemanticDecodeBindings _bindings; + final CloudTombstoneIdentityResolver? _tombstoneIdentityResolver; + + @override + Future decode(CloudInboxEntry entry) async { + _validateEntry(entry); + final auth = await _readAuthSnapshot(); + if (auth == null || + auth.accountFingerprint != entry.scope.accountFingerprint) { + throw const CloudSemanticDecodeFailure( + CloudFailureCategory.authorization, + ); + } + + CloudTombstoneIdentity? tombstoneIdentity; + if (entry.change.isTombstone) { + tombstoneIdentity = await _tombstoneIdentityResolver?.resolve(entry); + if (tombstoneIdentity == null || + tombstoneIdentity.scope != entry.scope || + tombstoneIdentity.generation != entry.generation || + tombstoneIdentity.changeId != entry.change.changeId || + tombstoneIdentity.serverRecordIdHash != entry.change.recordIdHash || + tombstoneIdentity.kind == CloudEntityKind.sharedProfile || + !_externalDigest.hasMatch(tombstoneIdentity.logicalEntityKeyHash)) { + throw const CloudSemanticDecodeFailure(CloudFailureCategory.dependency); + } + if (!auth.sameIdentity(await _readAuthSnapshot())) { + throw const CloudSemanticDecodeFailure(CloudFailureCategory.conflict); + } + } + + final result = await _bindings.decode( + RustCloudSemanticDecodeRequest( + authSnapshot: auth, + storageDirectory: _storageDirectory, + entry: entry, + protectedStoreIdentity: auth.protectedStoreIdentity, + nativeStream: _nativeStream(entry.scope), + tombstoneIdentity: tombstoneIdentity, + ), + ); + + final currentAuth = await _readAuthSnapshot(); + if (!auth.sameIdentity(currentAuth)) { + throw const CloudSemanticDecodeFailure(CloudFailureCategory.conflict); + } + return _mapResult(entry, result, tombstoneIdentity); + } + + CloudDecodedMutation _mapResult( + CloudInboxEntry entry, + frb_api.CloudSyncTransientDecodeResult result, + CloudTombstoneIdentity? tombstoneIdentity, + ) { + final hasReadyField = + result.changeId != null || + result.entityKind != null || + result.mutationKind != null || + result.snapshot != null || + result.payload != null || + result.tombstone != null; + final dispositionCount = + (hasReadyField ? 1 : 0) + + (result.deferredReason == null ? 0 : 1) + + (result.quarantineReason == null ? 0 : 1) + + (result.failureCode == null ? 0 : 1); + if (dispositionCount != 1 || + result.generation != BigInt.from(entry.generation) || + result.protectedSourceReference != + entry.change.encryptedPayloadReference) { + throw const CloudSemanticDecodeFailure(CloudFailureCategory.conflict); + } + if (result.failureCode case final failure?) { + throw CloudSemanticDecodeFailure(_failureCategory(failure)); + } + if (result.deferredReason != null) { + // Native deferred reasons describe deterministic record shapes that this + // build cannot project (stickers, scheduling, extension payloads, etc.). + // Retrying the same protected record cannot make those fields supported + // and would stall the contiguous replay prefix for days. Preserve the + // raw record in quarantine and allow later supported history to proceed. + throw const CloudSemanticDecodeFailure( + CloudFailureCategory.malformedRecord, + ); + } + if (result.quarantineReason != null) { + throw const CloudSemanticDecodeFailure( + CloudFailureCategory.malformedRecord, + ); + } + + if (result.changeId != entry.change.changeId || + result.entityKind == null || + result.mutationKind == null) { + throw const CloudSemanticDecodeFailure( + CloudFailureCategory.malformedRecord, + ); + } + final expectedTombstone = entry.change.type == CloudChangeType.delete; + final decodedTombstone = + result.mutationKind == frb_api.CloudSyncTransientMutationKind.tombstone; + if (decodedTombstone != expectedTombstone) { + throw const CloudSemanticDecodeFailure(CloudFailureCategory.conflict); + } + + if (decodedTombstone) { + if (result.snapshot != null || result.payload != null) { + throw const CloudSemanticDecodeFailure( + CloudFailureCategory.malformedRecord, + ); + } + final tombstone = result.tombstone; + if (tombstone == null || + tombstoneIdentity == null || + tombstone.entityKind != result.entityKind || + _entityKindFromFrb(tombstone.entityKind) != tombstoneIdentity.kind || + tombstone.logicalEntityKeyHash != + tombstoneIdentity.logicalEntityKeyHash) { + throw const CloudSemanticDecodeFailure( + CloudFailureCategory.malformedRecord, + ); + } + final mapped = CloudSemanticTombstone( + kind: _entityKindFromFrb(tombstone.entityKind), + logicalEntityKeyHash: _requireExternalDigest( + tombstone.logicalEntityKeyHash, + ), + deletedAt: _dateTime(tombstone.deletedAtMillis), + serverConfirmed: tombstone.serverConfirmed, + ); + return CloudDecodedMutation.tombstone( + scope: entry.scope, + generation: entry.generation, + changeId: entry.change.changeId, + tombstone: mapped, + ); + } + + if (result.tombstone != null || + result.snapshot == null || + result.payload == null) { + throw const CloudSemanticDecodeFailure( + CloudFailureCategory.malformedRecord, + ); + } + final snapshot = _snapshotFromFrb( + result.snapshot!, + expectedSourceReference: entry.change.encryptedPayloadReference!, + ); + final payload = _payloadFromFrb(result.entityKind!, result.payload!); + if (snapshot.kind != _entityKindFromFrb(result.entityKind!) || + snapshot.kind != payload.kind || + snapshot.logicalEntityKeyHash != payload.logicalEntityKeyHash) { + throw const CloudSemanticDecodeFailure(CloudFailureCategory.conflict); + } + return CloudDecodedMutation.upsert( + scope: entry.scope, + generation: entry.generation, + changeId: entry.change.changeId, + snapshot: snapshot, + payload: payload, + ); + } + + CloudSemanticSnapshot _snapshotFromFrb( + frb_api.CloudSyncTransientSnapshot value, { + required String expectedSourceReference, + }) { + final editParts = {}; + for (final part in value.editParts) { + final key = _requireExternalDigest(part.partKeyHash); + final candidate = CloudEditPart( + partKeyHash: key, + revision: part.revision, + contentDigest: _requireContentDigest(part.contentDigest), + modifiedAt: _dateTime(part.modifiedAtMillis)!, + ); + final current = editParts[key]; + if (current == null || candidate.revision > current.revision) { + editParts[key] = candidate; + } else if (candidate.revision == current.revision) { + throw const CloudSemanticDecodeFailure( + CloudFailureCategory.malformedRecord, + ); + } + } + if (!_protectedReference.hasMatch(value.protectedSourceReference) || + value.protectedSourceReference != expectedSourceReference) { + throw const CloudSemanticDecodeFailure( + CloudFailureCategory.malformedRecord, + ); + } + return CloudSemanticSnapshot( + kind: _entityKindFromFrb(value.entityKind), + logicalEntityKeyHash: _requireExternalDigest(value.logicalEntityKeyHash), + parentLogicalKeyHash: _optionalExternalDigest(value.parentLogicalKeyHash), + immutableContentDigest: _optionalContentDigest( + value.immutableContentDigest, + ), + createdAt: _dateTime(value.createdAtMillis), + readAt: _dateTime(value.readAtMillis), + deliveredAt: _dateTime(value.deliveredAtMillis), + editParts: editParts, + retractedAt: _dateTime(value.retractedAtMillis), + groupVersion: value.groupVersion, + groupMetadataDigest: _optionalContentDigest(value.groupMetadataDigest), + etagHash: _optionalExternalDigest(value.etagHash), + encryptedRawRecordReference: value.protectedSourceReference, + ); + } + + CloudSemanticEntityPayload _payloadFromFrb( + frb_api.CloudSyncTransientEntityKind kind, + frb_api.CloudSyncTransientPayload value, + ) { + final populated = [ + value.chat, + value.message, + value.attachment, + value.groupPhoto, + ].where((payload) => payload != null).length; + if (populated != 1) { + throw const CloudSemanticDecodeFailure( + CloudFailureCategory.malformedRecord, + ); + } + return switch (kind) { + frb_api.CloudSyncTransientEntityKind.chat => _chatPayload(value), + frb_api.CloudSyncTransientEntityKind.message => _messagePayload(value), + frb_api.CloudSyncTransientEntityKind.reaction => _reactionPayload(value), + frb_api.CloudSyncTransientEntityKind.attachment => _attachmentPayload( + value, + ), + frb_api.CloudSyncTransientEntityKind.groupPhoto => _groupPhotoPayload( + value, + ), + }; + } + + CloudSemanticFieldState _fieldState( + frb_api.CloudSyncTransientFieldState value, + ) => switch (value) { + frb_api.CloudSyncTransientFieldState.absent => + CloudSemanticFieldState.absent, + frb_api.CloudSyncTransientFieldState.value => CloudSemanticFieldState.value, + frb_api.CloudSyncTransientFieldState.explicitClear => + CloudSemanticFieldState.explicitClear, + }; + + CloudSemanticService _service(frb_api.CloudSyncTransientService value) => + switch (value) { + frb_api.CloudSyncTransientService.iMessage => + CloudSemanticService.iMessage, + }; + + CloudSemanticChatStyle _chatStyle( + frb_api.CloudSyncTransientChatStyle value, + ) => switch (value) { + frb_api.CloudSyncTransientChatStyle.direct => CloudSemanticChatStyle.direct, + frb_api.CloudSyncTransientChatStyle.group => CloudSemanticChatStyle.group, + }; + + CloudSemanticAssociationKind _associationKind( + frb_api.CloudSyncTransientAssociationKind value, + ) => switch (value) { + frb_api.CloudSyncTransientAssociationKind.none => + CloudSemanticAssociationKind.none, + frb_api.CloudSyncTransientAssociationKind.sticker => + CloudSemanticAssociationKind.sticker, + frb_api.CloudSyncTransientAssociationKind.reactionAdd => + CloudSemanticAssociationKind.reactionAdd, + frb_api.CloudSyncTransientAssociationKind.reactionRemove => + CloudSemanticAssociationKind.reactionRemove, + }; + + CloudSemanticKnownMessageFlags _knownFlags( + frb_api.CloudSyncTransientKnownMessageFlags value, + ) => CloudSemanticKnownMessageFlags( + fromMe: value.fromMe, + delivered: value.delivered, + read: value.read, + hasDataDetectorResults: value.hasDataDetectorResults, + deliveredQuietly: value.deliveredQuietly, + didNotifyRecipient: value.didNotifyRecipient, + ); + + CloudSemanticTextRun _textRun(frb_api.CloudSyncTransientTextRun value) { + if ((value.attachmentCanonicalGuid == null) != + (value.attachmentLogicalKeyHash == null)) { + throw const CloudSemanticDecodeFailure( + CloudFailureCategory.malformedRecord, + ); + } + return CloudSemanticTextRun( + startUtf16: value.startUtf16, + lengthUtf16: value.lengthUtf16, + messagePart: value.messagePart, + attachmentCanonicalGuid: value.attachmentCanonicalGuid, + attachmentLogicalKeyHash: _optionalExternalDigest( + value.attachmentLogicalKeyHash, + ), + mentionHandle: value.mentionHandle, + audioTranscript: value.audioTranscript, + textEffect: value.textEffect, + bold: value.bold, + italic: value.italic, + strikethrough: value.strikethrough, + underline: value.underline, + ); + } + + CloudSemanticAttributedBody _attributedBody( + frb_api.CloudSyncTransientAttributedBody value, + ) => CloudSemanticAttributedBody( + text: value.text, + runs: value.runs.map(_textRun), + ); + + CloudSemanticMessageEdit _messageEdit( + frb_api.CloudSyncTransientMessageEdit value, + ) { + if ((value.originalRangeLocation == null) != + (value.originalRangeLength == null)) { + throw const CloudSemanticDecodeFailure( + CloudFailureCategory.malformedRecord, + ); + } + final modifiedAt = _dateTime(value.modifiedAtMillis); + if (modifiedAt == null) { + throw const CloudSemanticDecodeFailure( + CloudFailureCategory.malformedRecord, + ); + } + return CloudSemanticMessageEdit( + part: value.part_, + revision: value.revision, + bodies: value.bodies.map(_attributedBody), + modifiedAt: modifiedAt, + originalRangeLocation: value.originalRangeLocation, + originalRangeLength: value.originalRangeLength, + ); + } + + CloudChatEntityPayload _chatPayload(frb_api.CloudSyncTransientPayload value) { + final payload = value.chat; + if (payload == null || + !_fieldStateMatches(payload.displayNameState, payload.displayName) || + !_fieldStateMatches( + payload.lastAddressedHandleState, + payload.lastAddressedHandle, + ) || + !_fieldStateMatches(payload.groupVersionState, payload.groupVersion) || + !_fieldStateMatches( + payload.lastSeenMessageGuidState, + payload.lastSeenMessageGuid, + ) || + !_fieldStateMatches( + payload.groupPhotoGuidState, + payload.groupPhotoGuid, + )) { + throw const CloudSemanticDecodeFailure( + CloudFailureCategory.malformedRecord, + ); + } + return CloudChatEntityPayload( + logicalEntityKeyHash: _requireExternalDigest( + payload.logicalEntityKeyHash, + ), + canonicalGuid: payload.canonicalGuid, + chatIdentifier: payload.chatIdentifier, + groupId: payload.groupId, + originalGroupId: payload.originalGroupId, + service: _service(payload.service), + style: _chatStyle(payload.style), + displayNameState: _fieldState(payload.displayNameState), + displayName: payload.displayName, + participantHandles: payload.participantHandles, + lastAddressedHandleState: _fieldState(payload.lastAddressedHandleState), + lastAddressedHandle: payload.lastAddressedHandle, + groupVersionState: _fieldState(payload.groupVersionState), + groupVersion: payload.groupVersion, + lastSeenMessageGuidState: _fieldState(payload.lastSeenMessageGuidState), + lastSeenMessageGuid: payload.lastSeenMessageGuid, + groupPhotoGuidState: _fieldState(payload.groupPhotoGuidState), + groupPhotoGuid: payload.groupPhotoGuid, + ); + } + + CloudMessageEntityPayload _messagePayload( + frb_api.CloudSyncTransientPayload value, + ) { + final payload = value.message; + if (payload == null || + (payload.associationKind != + frb_api.CloudSyncTransientAssociationKind.none && + payload.associationKind != + frb_api.CloudSyncTransientAssociationKind.sticker) || + payload.reactionKind != null || + payload.reactionRemoved || + !_fieldStateMatches(payload.subjectState, payload.subject) || + !_fieldStateMatches(payload.bodyState, payload.body) || + !_collectionFieldStateMatches( + payload.attributedBodiesState, + payload.attributedBodies, + ) || + !_fieldStateMatches( + payload.balloonBundleIdState, + payload.balloonBundleId, + ) || + !_fieldStateMatches(payload.effectState, payload.effect) || + !_fieldStateMatches(payload.readAtMillisState, payload.readAtMillis) || + !_fieldStateMatches( + payload.deliveredAtMillisState, + payload.deliveredAtMillis, + ) || + !_collectionFieldStateMatches(payload.editsState, payload.edits) || + !_collectionFieldStateMatches( + payload.retractedPartsState, + payload.retractedParts, + ) || + !_fieldStateMatches( + payload.associatedEmojiState, + payload.associatedEmoji, + ) || + payload.associatedEmojiState != + frb_api.CloudSyncTransientFieldState.absent || + !_associationShapeMatches(payload, isReaction: false) || + !_replyShapeMatches(payload)) { + throw const CloudSemanticDecodeFailure(CloudFailureCategory.dependency); + } + return CloudMessageEntityPayload( + logicalEntityKeyHash: _requireExternalDigest( + payload.logicalEntityKeyHash, + ), + canonicalGuid: payload.canonicalGuid, + chatAliasKeyHash: _requireExternalDigest(payload.chatAliasKeyHash), + chatIdentifier: payload.chatIdentifier, + body: payload.body, + senderHandle: payload.senderHandle, + createdAt: _dateTime(payload.createdAtMillis), + error: payload.error, + service: _service(payload.service), + subjectState: _fieldState(payload.subjectState), + subject: payload.subject, + bodyState: _fieldState(payload.bodyState), + attributedBodiesState: _fieldState(payload.attributedBodiesState), + attributedBodies: payload.attributedBodies.map(_attributedBody), + balloonBundleIdState: _fieldState(payload.balloonBundleIdState), + balloonBundleId: payload.balloonBundleId, + // Native currently defers any extension payload before this boundary. + // Binary extension bytes must never cross the transient FRB contract. + decodedExtensionPayloadState: CloudSemanticFieldState.absent, + effectState: _fieldState(payload.effectState), + effect: payload.effect, + readAtState: _fieldState(payload.readAtMillisState), + readAt: _dateTime(payload.readAtMillis), + deliveredAtState: _fieldState(payload.deliveredAtMillisState), + deliveredAt: _dateTime(payload.deliveredAtMillis), + knownFlags: _knownFlags(payload.knownFlags), + associationKind: _associationKind(payload.associationKind), + associationParentLogicalKeyHash: _optionalExternalDigest( + payload.reactionParentLogicalKeyHash, + ), + associationParentCanonicalGuid: payload.reactionParentCanonicalGuid, + associationParentPart: payload.reactionParentPart, + associatedRangeLocation: payload.associatedRangeLocation, + associatedRangeLength: payload.associatedRangeLength, + replyParentLogicalKeyHash: _optionalExternalDigest( + payload.replyParentLogicalKeyHash, + ), + replyParentCanonicalGuid: payload.replyParentCanonicalGuid, + replyParentPart: payload.replyParentPart, + editsState: _fieldState(payload.editsState), + edits: payload.edits.map(_messageEdit), + retractedPartsState: _fieldState(payload.retractedPartsState), + retractedParts: payload.retractedParts, + ); + } + + CloudReactionEntityPayload _reactionPayload( + frb_api.CloudSyncTransientPayload value, + ) { + final payload = value.message; + final parent = payload?.reactionParentLogicalKeyHash; + final parentGuid = payload?.reactionParentCanonicalGuid; + final reactionKind = payload?.reactionKind; + if (payload == null || + parent == null || + parentGuid == null || + reactionKind == null || + !_associationShapeMatches(payload, isReaction: true) || + !_replyShapeMatches(payload) || + payload.replyParentCanonicalGuid != null || + payload.subjectState != frb_api.CloudSyncTransientFieldState.absent || + !_fieldStateMatches(payload.bodyState, payload.body) || + payload.bodyState != frb_api.CloudSyncTransientFieldState.absent || + !_collectionFieldStateMatches( + payload.attributedBodiesState, + payload.attributedBodies, + ) || + payload.attributedBodiesState != + frb_api.CloudSyncTransientFieldState.absent || + payload.balloonBundleIdState != + frb_api.CloudSyncTransientFieldState.absent || + payload.effectState != frb_api.CloudSyncTransientFieldState.absent || + !_fieldStateMatches(payload.readAtMillisState, payload.readAtMillis) || + !_fieldStateMatches( + payload.deliveredAtMillisState, + payload.deliveredAtMillis, + ) || + !_collectionFieldStateMatches(payload.editsState, payload.edits) || + payload.editsState != frb_api.CloudSyncTransientFieldState.absent || + !_collectionFieldStateMatches( + payload.retractedPartsState, + payload.retractedParts, + ) || + payload.retractedPartsState != + frb_api.CloudSyncTransientFieldState.absent || + !_fieldStateMatches( + payload.associatedEmojiState, + payload.associatedEmoji, + ) || + (reactionKind == frb_api.CloudSyncTransientReactionKind.emoji && + (payload.associatedEmojiState != + frb_api.CloudSyncTransientFieldState.value || + payload.associatedEmoji == null))) { + throw const CloudSemanticDecodeFailure(CloudFailureCategory.dependency); + } + final baseType = switch (reactionKind) { + frb_api.CloudSyncTransientReactionKind.heart => 'love', + frb_api.CloudSyncTransientReactionKind.like => 'like', + frb_api.CloudSyncTransientReactionKind.dislike => 'dislike', + frb_api.CloudSyncTransientReactionKind.laugh => 'laugh', + frb_api.CloudSyncTransientReactionKind.emphasize => 'emphasize', + frb_api.CloudSyncTransientReactionKind.question => 'question', + frb_api.CloudSyncTransientReactionKind.emoji => 'emoji', + frb_api.CloudSyncTransientReactionKind.stickerBack => 'stickerback', + }; + final type = payload.reactionRemoved ? '-$baseType' : baseType; + return CloudReactionEntityPayload( + logicalEntityKeyHash: _requireExternalDigest( + payload.logicalEntityKeyHash, + ), + canonicalGuid: payload.canonicalGuid, + parentLogicalKeyHash: _requireExternalDigest(parent), + parentCanonicalGuid: parentGuid, + parentPart: payload.reactionParentPart, + senderHandle: payload.senderHandle, + reactionType: type, + associatedEmoji: payload.associatedEmoji, + createdAt: _dateTime(payload.createdAtMillis), + error: payload.error, + service: _service(payload.service), + knownFlags: _knownFlags(payload.knownFlags), + readAtState: _fieldState(payload.readAtMillisState), + readAt: _dateTime(payload.readAtMillis), + deliveredAtState: _fieldState(payload.deliveredAtMillisState), + deliveredAt: _dateTime(payload.deliveredAtMillis), + associatedRangeLocation: payload.associatedRangeLocation, + associatedRangeLength: payload.associatedRangeLength, + ); + } + + CloudAttachmentEntityPayload _attachmentPayload( + frb_api.CloudSyncTransientPayload value, + ) { + final payload = value.attachment; + if (payload == null || + !_ownerShapeMatches(payload) || + !_fieldStateMatches(payload.utiState, payload.uti) || + !_fieldStateMatches(payload.fileNameState, payload.fileName) || + !_fieldStateMatches(payload.mimeTypeState, payload.mimeType) || + !_fieldStateMatches(payload.totalBytesState, payload.totalBytes) || + !_fieldStateMatches(payload.isOutgoingState, payload.isOutgoing) || + !_fieldStateMatches( + payload.protectedLocalReferenceState, + payload.protectedLocalReference, + ) || + (payload.protectedLocalReference != null && + !_protectedReference.hasMatch(payload.protectedLocalReference!))) { + throw const CloudSemanticDecodeFailure(CloudFailureCategory.dependency); + } + return CloudAttachmentEntityPayload( + logicalEntityKeyHash: _requireExternalDigest( + payload.logicalEntityKeyHash, + ), + canonicalGuid: payload.canonicalGuid, + ownerLogicalKeyHash: _optionalExternalDigest(payload.ownerLogicalKeyHash), + ownerCanonicalGuid: payload.ownerCanonicalGuid, + ownerPart: payload.ownerPart, + utiState: _fieldState(payload.utiState), + uti: payload.uti, + fileNameState: _fieldState(payload.fileNameState), + fileName: payload.fileName, + mimeTypeState: _fieldState(payload.mimeTypeState), + mimeType: payload.mimeType, + totalBytesState: _fieldState(payload.totalBytesState), + totalBytes: _boundedUnsignedInt64(payload.totalBytes), + isOutgoingState: _fieldState(payload.isOutgoingState), + isOutgoing: payload.isOutgoing, + protectedLocalReferenceState: _fieldState( + payload.protectedLocalReferenceState, + ), + protectedLocalReference: payload.protectedLocalReference, + ); + } + + CloudGroupPhotoEntityPayload _groupPhotoPayload( + frb_api.CloudSyncTransientPayload value, + ) { + final payload = value.groupPhoto; + if (payload == null || + !_protectedReference.hasMatch(payload.protectedLocalReference)) { + throw const CloudSemanticDecodeFailure( + CloudFailureCategory.malformedRecord, + ); + } + return CloudGroupPhotoEntityPayload( + logicalEntityKeyHash: _requireExternalDigest( + payload.logicalEntityKeyHash, + ), + ownerLogicalKeyHash: _requireExternalDigest(payload.ownerLogicalKeyHash), + photoGuid: payload.photoGuid, + protectedLocalReference: payload.protectedLocalReference, + ); + } + + void _validateEntry(CloudInboxEntry entry) { + final change = entry.change; + if (change.preflightFailure != null || + !_externalDigest.hasMatch(change.changeId) || + !_externalDigest.hasMatch(change.recordIdHash) || + (change.etagHash != null && + !_externalDigest.hasMatch(change.etagHash!)) || + change.payloadSha256 == null || + !_payloadDigest.hasMatch(change.payloadSha256!) || + change.encryptedPayloadReference == null || + !_protectedReference.hasMatch(change.encryptedPayloadReference!) || + change.isTombstone != (change.type == CloudChangeType.delete)) { + throw const CloudSemanticDecodeFailure( + CloudFailureCategory.malformedRecord, + ); + } + _nativeStream(entry.scope); + } + + String _nativeStream(CloudSyncScope scope) { + if (scope.container != 'com.apple.messages.cloud' || + scope.database != 'private' || + scope.streamKind != CloudSyncStreamKind.messages || + scope.schemaVersion != 2) { + throw const CloudSemanticDecodeFailure(CloudFailureCategory.conflict); + } + return switch (scope.zone) { + 'chatManateeZone' => 'chats', + 'messageManateeZone' => 'messages', + 'attachmentManateeZone' => 'attachments', + _ => throw const CloudSemanticDecodeFailure( + CloudFailureCategory.conflict, + ), + }; + } + + static String _validateStorageDirectory(String value) { + if (value.trim().isEmpty) { + throw ArgumentError('cloud_semantic_decoder_storage_invalid'); + } + return value; + } + + String _requireExternalDigest(String value) { + if (!_externalDigest.hasMatch(value)) { + throw const CloudSemanticDecodeFailure( + CloudFailureCategory.malformedRecord, + ); + } + return value; + } + + String? _optionalExternalDigest(String? value) => + value == null ? null : _requireExternalDigest(value); + + String _requireContentDigest(String value) { + if (!_contentDigest.hasMatch(value)) { + throw const CloudSemanticDecodeFailure( + CloudFailureCategory.malformedRecord, + ); + } + return value; + } + + String? _optionalContentDigest(String? value) => + value == null ? null : _requireContentDigest(value); + + DateTime? _dateTime(int? milliseconds) { + if (milliseconds == null) return null; + try { + return DateTime.fromMillisecondsSinceEpoch(milliseconds, isUtc: true); + } on RangeError { + throw const CloudSemanticDecodeFailure( + CloudFailureCategory.malformedRecord, + ); + } + } + + bool _fieldStateMatches( + frb_api.CloudSyncTransientFieldState state, + Object? value, + ) => switch (state) { + frb_api.CloudSyncTransientFieldState.value => value != null, + frb_api.CloudSyncTransientFieldState.absent || + frb_api.CloudSyncTransientFieldState.explicitClear => value == null, + }; + + bool _collectionFieldStateMatches( + frb_api.CloudSyncTransientFieldState state, + Iterable value, + ) => state == frb_api.CloudSyncTransientFieldState.value || value.isEmpty; + + bool _associationShapeMatches( + frb_api.CloudSyncTransientMessagePayload payload, { + required bool isReaction, + }) { + final parentHash = payload.reactionParentLogicalKeyHash; + final parentGuid = payload.reactionParentCanonicalGuid; + final hasParent = parentHash != null && parentGuid != null; + if ((parentHash == null) != (parentGuid == null) || + (payload.associatedRangeLocation == null) != + (payload.associatedRangeLength == null) || + (!hasParent && + (payload.reactionParentPart != null || + payload.associatedRangeLocation != null))) { + return false; + } + return switch (payload.associationKind) { + frb_api.CloudSyncTransientAssociationKind.none => + !isReaction && + !hasParent && + payload.reactionKind == null && + !payload.reactionRemoved, + frb_api.CloudSyncTransientAssociationKind.sticker => + !isReaction && + hasParent && + payload.reactionKind == null && + !payload.reactionRemoved, + frb_api.CloudSyncTransientAssociationKind.reactionAdd => + isReaction && + hasParent && + payload.reactionKind != null && + !payload.reactionRemoved, + frb_api.CloudSyncTransientAssociationKind.reactionRemove => + isReaction && + hasParent && + payload.reactionKind != null && + payload.reactionRemoved, + }; + } + + bool _replyShapeMatches(frb_api.CloudSyncTransientMessagePayload payload) { + final fields = [ + payload.replyParentLogicalKeyHash, + payload.replyParentCanonicalGuid, + payload.replyParentPart, + ]; + return fields.every((value) => value == null) || + fields.every((value) => value != null); + } + + bool _ownerShapeMatches(frb_api.CloudSyncTransientAttachmentPayload payload) { + final fields = [ + payload.ownerLogicalKeyHash, + payload.ownerCanonicalGuid, + payload.ownerPart, + ]; + return fields.every((value) => value == null) || + fields.every((value) => value != null); + } + + int? _boundedUnsignedInt64(BigInt? value) { + if (value == null) return null; + final maximum = BigInt.parse('9223372036854775807'); + if (value.isNegative || value > maximum) { + throw const CloudSemanticDecodeFailure(CloudFailureCategory.dependency); + } + return value.toInt(); + } + + CloudFailureCategory _failureCategory( + frb_api.CloudSyncTransientFailureCode value, + ) => switch (value) { + frb_api.CloudSyncTransientFailureCode.invalidRequest || + frb_api.CloudSyncTransientFailureCode.malformedRecord || + frb_api.CloudSyncTransientFailureCode.oversizedRecord => + CloudFailureCategory.malformedRecord, + frb_api.CloudSyncTransientFailureCode.activeAccountMismatch => + CloudFailureCategory.authorization, + frb_api.CloudSyncTransientFailureCode.scopeMismatch || + frb_api.CloudSyncTransientFailureCode.generationMismatch || + frb_api.CloudSyncTransientFailureCode.storeIdentityMismatch || + frb_api.CloudSyncTransientFailureCode.protectedReferenceMismatch => + CloudFailureCategory.conflict, + frb_api.CloudSyncTransientFailureCode.pcsUnavailable => + CloudFailureCategory.pcsUnavailable, + frb_api.CloudSyncTransientFailureCode.retryableUpstream => + CloudFailureCategory.server, + frb_api.CloudSyncTransientFailureCode.decoderFailure => + CloudFailureCategory.unknown, + }; +} + +CloudEntityKind _entityKindFromFrb( + frb_api.CloudSyncTransientEntityKind value, +) => switch (value) { + frb_api.CloudSyncTransientEntityKind.chat => CloudEntityKind.chat, + frb_api.CloudSyncTransientEntityKind.message => CloudEntityKind.message, + frb_api.CloudSyncTransientEntityKind.reaction => CloudEntityKind.reaction, + frb_api.CloudSyncTransientEntityKind.attachment => CloudEntityKind.attachment, + frb_api.CloudSyncTransientEntityKind.groupPhoto => CloudEntityKind.groupPhoto, +}; + +frb_api.CloudSyncTransientEntityKind _entityKindToFrb( + CloudEntityKind value, +) => switch (value) { + CloudEntityKind.chat => frb_api.CloudSyncTransientEntityKind.chat, + CloudEntityKind.message => frb_api.CloudSyncTransientEntityKind.message, + CloudEntityKind.reaction => frb_api.CloudSyncTransientEntityKind.reaction, + CloudEntityKind.attachment => frb_api.CloudSyncTransientEntityKind.attachment, + CloudEntityKind.groupPhoto => frb_api.CloudSyncTransientEntityKind.groupPhoto, + CloudEntityKind.sharedProfile => throw ArgumentError( + 'cloud_semantic_decoder_profile_unsupported', + ), +}; diff --git a/lib/services/rustpush/cloud_sync/rust_cloud_sync_transport.dart b/lib/services/rustpush/cloud_sync/rust_cloud_sync_transport.dart new file mode 100644 index 0000000000..81cc20ea44 --- /dev/null +++ b/lib/services/rustpush/cloud_sync/rust_cloud_sync_transport.dart @@ -0,0 +1,610 @@ +import 'dart:convert'; +import 'dart:typed_data'; + +import 'package:bluebubbles/src/rust/api/api.dart' as frb_api; +import 'package:bluebubbles/src/rust/frb_generated.dart'; +import 'package:bluebubbles/src/rust/lib.dart' as frb_lib; +import 'package:crypto/crypto.dart'; + +import 'cloud_sync_models.dart'; +import 'cloud_sync_protector.dart'; +import 'cloud_sync_transport.dart'; + +const int _maximumRawRecordBytes = 8 * 1024 * 1024; +const int _defaultMaximumRawPageBytes = 32 * 1024 * 1024; +const int _maximumContinuationTokenBytes = 1024 * 1024; + +// These deliberately conservative estimates cover list/option framing and the +// fixed page/change/system scalars that are not represented by byte arrays or +// strings below. At the 200-change transport maximum they consume less than +// 40 KiB of the default page budget. +const int _rawPageFixedOverheadBytes = 64; +const int _rawChangeFixedOverheadBytes = 128; +const int _rawSystemFieldsFixedOverheadBytes = 64; + +enum RustCloudSyncRawRecordKind { + encryptedUpsert, + tombstone, + unsupportedRecordType, + malformedMetadata, +} + +enum RustCloudSyncRawFailureCategory { + network, + throttled, + server, + authorization, + pcsUnavailable, + malformedRecord, + conflict, + localStorage, + unknown, +} + +class RustCloudSyncRawSystemFields { + const RustCloudSyncRawSystemFields({ + this.etag, + this.createdAt, + this.modifiedAt, + this.permission, + }); + + final String? etag; + final double? createdAt; + final double? modifiedAt; + final int? permission; +} + +class RustCloudSyncRawChange { + const RustCloudSyncRawChange({ + required this.kind, + this.recordName, + this.recordType, + this.changeType, + this.systemFields, + this.encryptedRecord, + this.tombstonePayload, + }); + + final RustCloudSyncRawRecordKind kind; + final String? recordName; + final String? recordType; + final int? changeType; + final RustCloudSyncRawSystemFields? systemFields; + final Uint8List? encryptedRecord; + final Uint8List? tombstonePayload; +} + +class RustCloudSyncRawPage { + const RustCloudSyncRawPage({ + required this.changes, + required this.status, + required this.complete, + this.nextToken, + }); + + final List changes; + final Uint8List? nextToken; + final int status; + final bool complete; +} + +class RustCloudSyncRawFailure { + const RustCloudSyncRawFailure({ + required this.category, + required this.safeCode, + this.retryAfterSeconds, + }); + + final RustCloudSyncRawFailureCategory category; + final int? retryAfterSeconds; + final String safeCode; +} + +class RustCloudSyncRawFetchResult { + const RustCloudSyncRawFetchResult({this.page, this.failure}); + + final RustCloudSyncRawPage? page; + final RustCloudSyncRawFailure? failure; +} + +/// Narrow seam around the generated FRB page call. Tests inject this boundary +/// so malformed pages can be exercised without loading a native library. +abstract interface class RustCloudSyncTransportBindings { + Future fetchRawPage({ + required Object cloudMessagesClient, + required String stream, + required Uint8List? continuationToken, + required int maximumChanges, + }); +} + +/// Read-only production transport for the dormant Cloud Sync V2 shadow phase. +/// +/// The adapter protects one canonical raw envelope per change before any value +/// reaches ObjectBox. It does not expose save, delete, allocation, or conflict +/// write paths. +final class RustCloudSyncTransport implements CloudSyncTransport { + RustCloudSyncTransport({ + required this._cloudMessagesClient, + required this._protector, + RustCloudSyncTransportBindings? bindings, + this._refreshAuthentication, + this._refreshPcsAccess, + this.maximumRawPageBytes = _defaultMaximumRawPageBytes, + }) : _bindings = bindings ?? FrbRustCloudSyncTransportBindings() { + if (maximumRawPageBytes <= 0) { + throw ArgumentError.value(maximumRawPageBytes, 'maximumRawPageBytes'); + } + } + + final Object _cloudMessagesClient; + final CloudSyncProtector _protector; + final RustCloudSyncTransportBindings _bindings; + final Future Function(CloudSyncScope scope)? _refreshAuthentication; + final Future Function(CloudSyncScope scope)? _refreshPcsAccess; + + /// Maximum estimated raw-page size before local protection. + /// + /// Admission includes the opaque continuation token, encrypted-record and + /// tombstone byte fields, UTF-8 metadata, and conservative fixed overhead + /// for each page, change, and system-fields structure. + /// + /// The complete page is admitted before the first record is protected, so an + /// over-limit page cannot produce a partial [CloudFetchBatch]. + final int maximumRawPageBytes; + + @override + Future fetchChanges( + CloudSyncScope scope, { + required String? previousToken, + required int generation, + required int limit, + }) async { + final stream = _streamForScope(scope); + final token = _decodeToken(previousToken); + final result = await _bindings.fetchRawPage( + cloudMessagesClient: _cloudMessagesClient, + stream: stream, + continuationToken: token, + maximumChanges: limit.clamp(1, 200).toInt(), + ); + + final page = result.page; + final failure = result.failure; + if ((page == null) == (failure == null)) { + throw CloudSyncFailure( + category: CloudFailureCategory.malformedRecord, + safeCode: 'invalid_transport_envelope', + ); + } + if (failure != null) throw _mapFailure(failure); + + _ensureRawPageWithinByteLimit(page!); + final nextToken = _encodeToken(page.nextToken); + if (!page.complete && nextToken == null) { + throw CloudSyncFailure( + category: CloudFailureCategory.malformedRecord, + safeCode: 'missing_continuation_token', + ); + } + + final changes = []; + for (var index = 0; index < page.changes.length; index++) { + changes.add(await _protectChange(scope, page.changes[index], index)); + } + final batchId = _digest( + [ + 'cloud-sync-batch-v2', + scope.storageKey, + _digestValue(previousToken ?? 'initial'), + _digestValue(nextToken ?? 'complete'), + page.status.toString(), + ...changes.map((change) => change.changeId), + ].join('\u001f'), + ); + + return CloudFetchBatch( + scope: scope, + changes: changes, + batchId: 'batch2:$batchId', + generation: generation, + nextToken: nextToken, + hasMore: !page.complete, + ); + } + + void _ensureRawPageWithinByteLimit(RustCloudSyncRawPage page) { + var totalBytes = 0; + + void addLength(int length) { + // Subtracting from the validated positive limit avoids a wrapping + // addition in runtimes whose integer representation is bounded. + if (length > maximumRawPageBytes - totalBytes) { + throw CloudSyncFailure( + category: CloudFailureCategory.malformedRecord, + safeCode: 'oversized_raw_page', + ); + } + totalBytes += length; + } + + void addBytes(Uint8List? bytes) { + if (bytes != null) addLength(bytes.length); + } + + void addString(String? value) { + if (value != null) addLength(_utf8ByteLength(value)); + } + + addLength(_rawPageFixedOverheadBytes); + addBytes(page.nextToken); + for (final change in page.changes) { + addLength(_rawChangeFixedOverheadBytes); + addString(change.recordName); + addString(change.recordType); + addBytes(change.encryptedRecord); + addBytes(change.tombstonePayload); + final systemFields = change.systemFields; + if (systemFields != null) { + addLength(_rawSystemFieldsFixedOverheadBytes); + addString(systemFields.etag); + } + } + } + + Future _protectChange( + CloudSyncScope scope, + RustCloudSyncRawChange change, + int pageIndex, + ) async { + final encryptedRecord = change.encryptedRecord; + final tombstonePayload = change.tombstonePayload; + final rawBytes = encryptedRecord ?? tombstonePayload ?? Uint8List(0); + final rawDigest = sha256.convert(rawBytes).toString(); + final oversize = rawBytes.length > _maximumRawRecordBytes; + final preflightFailure = switch (change.kind) { + RustCloudSyncRawRecordKind.encryptedUpsert || + RustCloudSyncRawRecordKind.tombstone => + oversize ? CloudFailureCategory.malformedRecord : null, + RustCloudSyncRawRecordKind.unsupportedRecordType || + RustCloudSyncRawRecordKind.malformedMetadata => + CloudFailureCategory.malformedRecord, + }; + + final systemFields = change.systemFields; + final canonicalEnvelope = jsonEncode({ + 'v': 1, + 'kind': change.kind.name, + 'recordName': change.recordName, + 'recordType': change.recordType, + 'changeType': change.changeType, + 'system': systemFields == null + ? null + : { + 'etag': systemFields.etag, + 'createdAt': systemFields.createdAt, + 'modifiedAt': systemFields.modifiedAt, + 'permission': systemFields.permission, + }, + // An oversized record is represented by its digest and metadata only. + // This prevents one hostile page from exceeding the protector's hard + // plaintext limit while retaining enough evidence to quarantine it. + 'rawEncoding': oversize + ? null + : encryptedRecord != null + ? 'record' + : tombstonePayload != null + ? 'tombstone' + : null, + 'raw': oversize ? null : base64UrlEncode(rawBytes), + 'rawSha256': rawDigest, + 'rawLength': rawBytes.length, + }); + final protectedEnvelope = await _protector.protect( + scope: scope, + kind: CloudSyncProtectedValueKind.rawRecord, + plaintext: canonicalEnvelope, + ); + + final recordIdentity = change.recordName?.trim(); + final recordIdHash = _digestValue( + recordIdentity == null || recordIdentity.isEmpty + ? 'missing\u001f$rawDigest\u001f$pageIndex' + : recordIdentity, + ); + final etag = systemFields?.etag; + final etagHash = etag == null || etag.isEmpty ? null : _digestValue(etag); + final isTombstone = change.kind == RustCloudSyncRawRecordKind.tombstone; + final changeId = _digest( + [ + 'cloud-sync-change-v2', + scope.storageKey, + recordIdHash, + change.kind.name, + change.changeType?.toString() ?? 'none', + etagHash ?? 'none', + rawDigest, + ].join('\u001f'), + ); + + return CloudFetchedChange( + changeId: 'change2:$changeId', + recordIdHash: recordIdHash, + etagHash: etagHash, + type: isTombstone ? CloudChangeType.delete : CloudChangeType.save, + encryptedPayloadReference: protectedEnvelope, + payloadSha256: rawDigest, + isTombstone: isTombstone, + preflightFailure: preflightFailure, + ); + } + + @override + Future refreshAuthentication(CloudSyncScope scope) async { + final callback = _refreshAuthentication; + return callback == null ? false : await callback(scope); + } + + @override + Future refreshPcsAccess(CloudSyncScope scope) async { + final callback = _refreshPcsAccess; + return callback == null ? false : await callback(scope); + } + + @override + Future pushOperations( + CloudSyncScope scope, { + required List operations, + }) => throw _readOnlyFailure(); + + @override + Future reconcileUnknownOutcome( + CloudSyncScope scope, { + required CloudOutboxOperation operation, + }) => throw _readOnlyFailure(); + + @override + Future allocateServerRecordMapping( + CloudSyncScope scope, { + required String logicalEntityKeyHash, + }) => throw _readOnlyFailure(); + + @override + Future reconcileServerRecordChanged( + CloudSyncScope scope, { + required CloudOutboxOperation operation, + }) => throw _readOnlyFailure(); + + CloudSyncFailure _readOnlyFailure() => CloudSyncFailure( + category: CloudFailureCategory.cancelled, + safeCode: 'cloud_sync_shadow_read_only', + ); + + String _streamForScope(CloudSyncScope scope) { + if (scope.database != 'private' || + scope.streamKind != CloudSyncStreamKind.messages) { + throw CloudSyncFailure( + category: CloudFailureCategory.cancelled, + safeCode: 'unsupported_cloud_scope', + ); + } + return switch (scope.zone) { + 'chatManateeZone' => 'chats', + 'messageManateeZone' => 'messages', + 'attachmentManateeZone' => 'attachments', + 'messageUpdateZone' => 'messageUpdateZone', + 'recoverableMessageDeleteZone' => 'recoverableMessageDeleteZone', + 'scheduledMessageZone' => 'scheduledMessageZone', + 'chat1ManateeZone' => 'chat1ManateeZone', + _ => throw CloudSyncFailure( + category: CloudFailureCategory.cancelled, + safeCode: 'unsupported_cloud_zone', + ), + }; + } + + Uint8List? _decodeToken(String? value) { + if (value == null) return null; + try { + final normalized = value.padRight((value.length + 3) ~/ 4 * 4, '='); + final decoded = base64Url.decode(normalized); + if (decoded.length > _maximumContinuationTokenBytes) { + throw const FormatException('token too large'); + } + return Uint8List.fromList(decoded); + } on FormatException { + throw CloudSyncFailure( + category: CloudFailureCategory.localStorage, + safeCode: 'invalid_checkpoint_token', + ); + } + } + + String? _encodeToken(Uint8List? value) { + if (value == null) return null; + if (value.length > _maximumContinuationTokenBytes) { + throw CloudSyncFailure( + category: CloudFailureCategory.malformedRecord, + safeCode: 'oversized_continuation_token', + ); + } + return base64UrlEncode(value).replaceAll('=', ''); + } + + CloudSyncFailure _mapFailure(RustCloudSyncRawFailure failure) { + final retryAfter = failure.retryAfterSeconds == null + ? null + : Duration(seconds: failure.retryAfterSeconds!); + final category = switch (failure.category) { + RustCloudSyncRawFailureCategory.network => CloudFailureCategory.network, + RustCloudSyncRawFailureCategory.throttled => + CloudFailureCategory.throttled, + RustCloudSyncRawFailureCategory.server => CloudFailureCategory.server, + RustCloudSyncRawFailureCategory.authorization => + CloudFailureCategory.authorization, + RustCloudSyncRawFailureCategory.pcsUnavailable => + CloudFailureCategory.pcsUnavailable, + RustCloudSyncRawFailureCategory.malformedRecord => + CloudFailureCategory.malformedRecord, + RustCloudSyncRawFailureCategory.conflict => CloudFailureCategory.conflict, + RustCloudSyncRawFailureCategory.localStorage => + CloudFailureCategory.localStorage, + RustCloudSyncRawFailureCategory.unknown => CloudFailureCategory.unknown, + }; + return CloudSyncFailure( + category: category, + retryAfter: retryAfter, + safeCode: failure.safeCode, + ); + } +} + +/// Typed façade over generated FRB internals. The public adapter above keeps +/// generated DTOs behind an injectable seam, while binding drift is caught by +/// the analyzer instead of at runtime. +final class FrbRustCloudSyncTransportBindings + implements RustCloudSyncTransportBindings { + FrbRustCloudSyncTransportBindings({RustLibApi? api}) + // ignore: invalid_use_of_internal_member + : _api = api ?? RustLib.instance.api; + + final RustLibApi _api; + + @override + Future fetchRawPage({ + required Object cloudMessagesClient, + required String stream, + required Uint8List? continuationToken, + required int maximumChanges, + }) async { + final result = await _api.crateApiApiCloudSyncFetchRawPage( + cloudMessagesClient: _requireCloudMessagesClient(cloudMessagesClient), + stream: stream, + continuationToken: continuationToken, + maxChanges: maximumChanges, + ); + final page = result.page; + final failure = result.failure; + return RustCloudSyncRawFetchResult( + page: page == null ? null : _pageFromFrb(page), + failure: failure == null ? null : _failureFromFrb(failure), + ); + } + + frb_lib.ArcCloudMessagesClientDefaultAnisetteProvider + _requireCloudMessagesClient(Object value) { + if (value is! frb_lib.ArcCloudMessagesClientDefaultAnisetteProvider) { + throw ArgumentError( + 'cloudMessagesClient must be the generated FRB Cloud Messages client', + ); + } + return value; + } + + RustCloudSyncRawPage _pageFromFrb(frb_api.CloudSyncRawPage page) { + return RustCloudSyncRawPage( + changes: page.changes.map(_changeFromFrb).toList(growable: false), + nextToken: _bytesOrNull(page.nextToken), + status: page.status, + complete: page.complete, + ); + } + + RustCloudSyncRawChange _changeFromFrb(frb_api.CloudSyncRawChange change) { + final system = change.systemFields; + return RustCloudSyncRawChange( + kind: _recordKind(change.kind), + recordName: change.recordName, + recordType: change.recordType, + changeType: change.changeType, + systemFields: system == null + ? null + : RustCloudSyncRawSystemFields( + etag: system.etag, + createdAt: system.createdAt, + modifiedAt: system.modifiedAt, + permission: system.permission, + ), + encryptedRecord: _bytesOrNull(change.encryptedRecord), + tombstonePayload: _bytesOrNull(change.tombstonePayload), + ); + } + + RustCloudSyncRawFailure _failureFromFrb(frb_api.CloudSyncRawFailure failure) { + return RustCloudSyncRawFailure( + category: _failureCategory(failure.category), + retryAfterSeconds: failure.retryAfterSeconds?.toInt(), + safeCode: failure.safeCode, + ); + } + + Uint8List? _bytesOrNull(Uint8List? value) => + value == null ? null : Uint8List.fromList(value); + + RustCloudSyncRawRecordKind _recordKind(frb_api.CloudSyncRawRecordKind kind) => + switch (kind) { + frb_api.CloudSyncRawRecordKind.encryptedUpsert => + RustCloudSyncRawRecordKind.encryptedUpsert, + frb_api.CloudSyncRawRecordKind.tombstone => + RustCloudSyncRawRecordKind.tombstone, + frb_api.CloudSyncRawRecordKind.unsupportedRecordType => + RustCloudSyncRawRecordKind.unsupportedRecordType, + frb_api.CloudSyncRawRecordKind.malformedMetadata => + RustCloudSyncRawRecordKind.malformedMetadata, + }; + + RustCloudSyncRawFailureCategory _failureCategory( + frb_api.CloudSyncRawFailureCategory category, + ) => switch (category) { + frb_api.CloudSyncRawFailureCategory.network => + RustCloudSyncRawFailureCategory.network, + frb_api.CloudSyncRawFailureCategory.throttled => + RustCloudSyncRawFailureCategory.throttled, + frb_api.CloudSyncRawFailureCategory.server => + RustCloudSyncRawFailureCategory.server, + frb_api.CloudSyncRawFailureCategory.authorization => + RustCloudSyncRawFailureCategory.authorization, + frb_api.CloudSyncRawFailureCategory.pcsUnavailable => + RustCloudSyncRawFailureCategory.pcsUnavailable, + frb_api.CloudSyncRawFailureCategory.malformedRecord => + RustCloudSyncRawFailureCategory.malformedRecord, + frb_api.CloudSyncRawFailureCategory.conflict => + RustCloudSyncRawFailureCategory.conflict, + frb_api.CloudSyncRawFailureCategory.localStorage => + RustCloudSyncRawFailureCategory.localStorage, + frb_api.CloudSyncRawFailureCategory.unknown => + RustCloudSyncRawFailureCategory.unknown, + }; +} + +String _digest(String value) => sha256.convert(utf8.encode(value)).toString(); + +String _digestValue(String value) => + 'sha256:${sha256.convert(utf8.encode(value))}'; + +int _utf8ByteLength(String value) { + var bytes = 0; + for (var index = 0; index < value.length; index++) { + final codeUnit = value.codeUnitAt(index); + if (codeUnit <= 0x7f) { + bytes += 1; + } else if (codeUnit <= 0x7ff) { + bytes += 2; + } else if (codeUnit >= 0xd800 && + codeUnit <= 0xdbff && + index + 1 < value.length) { + final next = value.codeUnitAt(index + 1); + if (next >= 0xdc00 && next <= 0xdfff) { + bytes += 4; + index++; + } else { + // Match the UTF-8 replacement width for a malformed surrogate. + bytes += 3; + } + } else { + bytes += 3; + } + } + return bytes; +} diff --git a/lib/services/rustpush/cloud_sync/shadow_only_cloud_sync_store.dart b/lib/services/rustpush/cloud_sync/shadow_only_cloud_sync_store.dart new file mode 100644 index 0000000000..777915f616 --- /dev/null +++ b/lib/services/rustpush/cloud_sync/shadow_only_cloud_sync_store.dart @@ -0,0 +1,274 @@ +import 'cloud_shadow_journal_budget.dart'; +import 'cloud_sync_models.dart'; +import 'cloud_sync_store.dart'; + +/// Capability-restricted store exposed to the V2 read-only shadow sampler. +/// +/// The delegate can durably journal protected raw pages and maintain its +/// checkpoint/lease diagnostics. Every semantic, record-map, or outbox method +/// fails closed even if a future engine regression attempts to call it while +/// the feature flags still claim to be read-only. +final class ShadowOnlyCloudSyncStore + implements CloudSyncStore, CloudProtectedPageLeaseAdoptionStore { + const ShadowOnlyCloudSyncStore(this._delegate); + + final CloudSyncStore _delegate; + + CloudProtectedPageLeaseAdoptionStore get _adoptionStore { + final delegate = _delegate; + if (delegate is CloudProtectedPageLeaseAdoptionStore) { + return delegate as CloudProtectedPageLeaseAdoptionStore; + } + throw CloudSyncFailure( + category: CloudFailureCategory.localStorage, + safeCode: 'protected_page_lease_adoption_store_unavailable', + ); + } + + @override + Future> readAdoptedProtectedPageLeaseReferences({ + required int maximumCount, + }) => _adoptionStore.readAdoptedProtectedPageLeaseReferences( + maximumCount: maximumCount, + ); + + @override + Future readLiveProtectedReferences({ + required int maximumCount, + }) => _adoptionStore.readLiveProtectedReferences(maximumCount: maximumCount); + + @override + Future releaseAdoptedProtectedPageLeaseReferences( + Iterable leaseReferences, + ) => _adoptionStore.releaseAdoptedProtectedPageLeaseReferences( + leaseReferences, + ); + + @override + Future readCheckpoint(CloudSyncScope scope) => + _delegate.readCheckpoint(scope); + + @override + Future readShadowJournalUsage( + CloudSyncScope scope, { + required CloudShadowJournalBudget budget, + }) => _delegate.readShadowJournalUsage(scope, budget: budget); + + @override + Future journalShadowFetchedBatch( + CloudFetchBatch batch, { + required DateTime now, + required CloudShadowJournalBudget budget, + required CloudCoordinatorLeaseFence leaseFence, + required int expectedGeneration, + required String? expectedFetchedToken, + }) => _delegate.journalShadowFetchedBatch( + batch, + now: now, + budget: budget, + leaseFence: leaseFence, + expectedGeneration: expectedGeneration, + expectedFetchedToken: expectedFetchedToken, + ); + + @override + Future recordPullFailure( + CloudSyncScope scope, { + required CloudFailureCategory category, + required DateTime nextEligibleAt, + }) => _delegate.recordPullFailure( + scope, + category: category, + nextEligibleAt: nextEligibleAt, + ); + + @override + Future recordPullSuccess( + CloudSyncScope scope, { + required DateTime now, + }) => _delegate.recordPullSuccess(scope, now: now); + + @override + Future tryAcquireCoordinatorLease( + CloudSyncScope scope, { + required String ownerId, + required DateTime now, + required Duration leaseDuration, + }) => _delegate.tryAcquireCoordinatorLease( + scope, + ownerId: ownerId, + now: now, + leaseDuration: leaseDuration, + ); + + @override + Future renewCoordinatorLease( + CloudSyncScope scope, { + required CloudCoordinatorLeaseFence leaseFence, + required DateTime now, + required Duration leaseDuration, + }) => _delegate.renewCoordinatorLease( + scope, + leaseFence: leaseFence, + now: now, + leaseDuration: leaseDuration, + ); + + @override + Future releaseCoordinatorLease( + CloudSyncScope scope, { + required CloudCoordinatorLeaseFence leaseFence, + }) => _delegate.releaseCoordinatorLease(scope, leaseFence: leaseFence); + + @override + Future recordRun(CloudSyncRunRecord run) => _delegate.recordRun(run); + + @override + Future journalFetchedBatch( + CloudFetchBatch batch, { + required DateTime now, + required CloudCoordinatorLeaseFence leaseFence, + required int expectedGeneration, + required String? expectedFetchedToken, + }) => _blocked(); + + @override + Future> readEligibleInbox( + CloudSyncScope scope, { + required DateTime now, + required int limit, + }) => _blocked(); + + @override + Future markInboxApplied( + CloudSyncScope scope, { + required int sequence, + required DateTime now, + required CloudCoordinatorLeaseFence leaseFence, + }) => _blocked(); + + @override + Future markInboxRetryable( + CloudSyncScope scope, { + required int sequence, + required CloudFailureCategory category, + required DateTime now, + required DateTime nextEligibleAt, + required CloudCoordinatorLeaseFence leaseFence, + }) => _blocked(); + + @override + Future quarantineInbox( + CloudSyncScope scope, { + required int sequence, + required CloudFailureCategory category, + required DateTime now, + required CloudCoordinatorLeaseFence leaseFence, + }) => _blocked(); + + @override + Future enqueueOutbox(CloudOutboxOperation operation) => _blocked(); + + @override + Future enqueueOutboxMutation(CloudOutboxDraft draft) => + _blocked(); + + @override + Future rebootstrapAfterReset( + CloudSyncResetRebootstrapRequest request, { + required DateTime now, + }) => _blocked(); + + @override + Future advanceOutboxGeneration( + CloudSyncScope scope, { + required DateTime now, + }) => _blocked(); + + @override + Future> leaseEligibleOutbox( + CloudSyncScope scope, { + required DateTime now, + required int limit, + required String leaseId, + required Duration leaseDuration, + required Set allowedActions, + }) => _blocked(); + + @override + Future> markOutboxSubmissionStarted( + CloudSyncScope scope, { + required String leaseId, + required CloudOutboxSubmissionIdentity submissionIdentity, + required DateTime now, + }) => _blocked(); + + @override + Future applyOutboxTransitions( + CloudSyncScope scope, { + required String leaseId, + required Iterable transitions, + required DateTime now, + }) => _blocked(); + + @override + Future recoverExpiredOutboxLeases( + CloudSyncScope scope, { + required DateTime now, + }) => _blocked(); + + @override + Future attachOutboxRecordMapping( + CloudSyncScope scope, { + required String leaseId, + required String operationId, + required String serverRecordIdHash, + required DateTime now, + }) => _blocked(); + + @override + Future resumePausedOutbox( + CloudSyncScope scope, { + required Set categories, + required DateTime now, + }) => _blocked(); + + @override + Future> readPausedOutboxFailureCategories( + CloudSyncScope scope, { + required DateTime now, + }) => _blocked(); + + @override + Future postponeEligiblePausedOutbox( + CloudSyncScope scope, { + required Set categories, + required DateTime now, + required DateTime nextEligibleAt, + }) => _blocked(); + + @override + Future readRecordMap( + CloudSyncScope scope, { + required String logicalEntityKeyHash, + required int generation, + }) => _blocked(); + + @override + Future upsertRecordMap( + CloudRecordMapEntry entry, { + required int generation, + }) => _blocked(); + + Future _blocked() => + Future.error(const CloudSyncShadowStoreTripwireException()); +} + +final class CloudSyncShadowStoreTripwireException implements Exception { + const CloudSyncShadowStoreTripwireException(); + + static const safeCode = 'cloud_sync_shadow_store_tripwire'; + + @override + String toString() => 'CloudSyncShadowStoreTripwireException($safeCode)'; +} diff --git a/lib/services/rustpush/cloud_sync/transient_cloud_canonical_identity_registry.dart b/lib/services/rustpush/cloud_sync/transient_cloud_canonical_identity_registry.dart new file mode 100644 index 0000000000..09bfd8320f --- /dev/null +++ b/lib/services/rustpush/cloud_sync/transient_cloud_canonical_identity_registry.dart @@ -0,0 +1,150 @@ +import 'cloud_inbox_applier.dart'; +import 'cloud_sync_models.dart'; +import 'objectbox_canonical_semantic_entity_adapter.dart'; + +/// Single-mutation, memory-only identity bridge between native decode and the +/// synchronous canonical ObjectBox adapter. +/// +/// Canonical GUIDs are never serialized or retained after [release]. One +/// registry intentionally supports only one active mutation so overlapping or +/// stale transactions fail closed. +final class TransientCloudCanonicalIdentityRegistry + implements + CloudCanonicalIdentityResolver, + CloudTransientCanonicalIdentityRegistrar { + CloudSyncScope? _scope; + int? _generation; + int _leaseGeneration = 0; + Map<(CloudEntityKind, String), String>? _identities; + + bool get hasActiveLease => _identities != null; + + @override + CloudTransientCanonicalIdentityLease bind(CloudDecodedMutation mutation) { + if (_identities != null) { + throw StateError('cloud_canonical_identity_registry_active'); + } + if (mutation.kind != CloudDecodedMutationKind.upsert || + mutation.payload == null) { + throw StateError('cloud_canonical_identity_registry_payload_invalid'); + } + + final identities = <(CloudEntityKind, String), String>{}; + void add(CloudEntityKind kind, String hash, String guid) { + if (hash.isEmpty || guid.isEmpty) { + throw StateError('cloud_canonical_identity_registry_entry_invalid'); + } + final key = (kind, hash); + final existing = identities[key]; + if (existing != null && existing != guid) { + throw StateError('cloud_canonical_identity_registry_conflict'); + } + identities[key] = guid; + } + + final payload = mutation.payload!; + switch (payload) { + case CloudMessageEntityPayload value: + add( + CloudEntityKind.message, + value.logicalEntityKeyHash, + value.canonicalGuid, + ); + if (value.replyParentLogicalKeyHash != null) { + add( + CloudEntityKind.message, + value.replyParentLogicalKeyHash!, + value.replyParentCanonicalGuid!, + ); + } + if (value.associationParentLogicalKeyHash != null) { + add( + CloudEntityKind.message, + value.associationParentLogicalKeyHash!, + value.associationParentCanonicalGuid!, + ); + } + case CloudChatEntityPayload value: + add( + CloudEntityKind.chat, + value.logicalEntityKeyHash, + value.canonicalGuid, + ); + case CloudAttachmentEntityPayload value: + add( + CloudEntityKind.attachment, + value.logicalEntityKeyHash, + value.canonicalGuid, + ); + if (value.ownerLogicalKeyHash != null) { + add( + CloudEntityKind.message, + value.ownerLogicalKeyHash!, + value.ownerCanonicalGuid!, + ); + } + case CloudReactionEntityPayload value: + add( + CloudEntityKind.reaction, + value.logicalEntityKeyHash, + value.canonicalGuid, + ); + add( + CloudEntityKind.message, + value.parentLogicalKeyHash, + value.parentCanonicalGuid, + ); + case CloudGroupPhotoEntityPayload value: + add( + CloudEntityKind.groupPhoto, + value.logicalEntityKeyHash, + value.photoGuid, + ); + case CloudProfileEntityPayload _: + throw StateError( + 'cloud_canonical_identity_registry_payload_unsupported', + ); + } + + _scope = mutation.scope; + _generation = mutation.generation; + _identities = Map.unmodifiable(identities); + final leaseGeneration = ++_leaseGeneration; + return _TransientCloudCanonicalIdentityLease( + releaseCallback: () => _release(leaseGeneration), + ); + } + + @override + String? resolveCanonicalGuid({ + required CloudSyncScope scope, + required int generation, + required CloudEntityKind kind, + required String logicalEntityKeyHash, + }) { + if (_scope != scope || _generation != generation) return null; + return _identities?[(kind, logicalEntityKeyHash)]; + } + + void _release(int leaseGeneration) { + if (_identities == null || leaseGeneration != _leaseGeneration) return; + _identities = null; + _scope = null; + _generation = null; + } +} + +final class _TransientCloudCanonicalIdentityLease + implements CloudTransientCanonicalIdentityLease { + _TransientCloudCanonicalIdentityLease({required this.releaseCallback}); + + final void Function() releaseCallback; + bool _released = false; + + @override + void release() { + if (_released) return; + _released = true; + releaseCallback(); + } +} diff --git a/lib/services/rustpush/rustpush_service.dart b/lib/services/rustpush/rustpush_service.dart index 5c6de9bdff..d0c411df81 100644 --- a/lib/services/rustpush/rustpush_service.dart +++ b/lib/services/rustpush/rustpush_service.dart @@ -1,4 +1,5 @@ import 'dart:convert'; +import 'dart:ffi' as ffi; import 'dart:isolate'; import 'dart:math'; import 'dart:typed_data'; @@ -13,15 +14,41 @@ import 'package:bluebubbles/app/layouts/setup/setup_view.dart'; import 'package:bluebubbles/app/wrappers/titlebar_wrapper.dart'; import 'package:bluebubbles/database/database.dart'; import 'package:bluebubbles/helpers/ui/facetime_helpers.dart'; -import 'package:bluebubbles/main.dart'; import 'package:bluebubbles/src/rust/api/api.dart' as api; import 'package:bluebubbles/src/rust/lib.dart' as lib; import 'package:bluebubbles/helpers/helpers.dart'; import 'package:bluebubbles/database/models.dart'; import 'package:bluebubbles/services/services.dart'; +import 'package:bluebubbles/services/rustpush/apple_network_health.dart'; +import 'package:bluebubbles/services/rustpush/cloud_message_upload_state.dart'; +import 'package:bluebubbles/services/rustpush/cloud_sync/cloudkit_operation_interlock.dart'; +import 'package:bluebubbles/services/rustpush/cloud_sync/cloudkit_writer_authority.dart'; +import 'package:bluebubbles/services/rustpush/cloud_sync/cloudkit_writer_mutation_guard.dart'; +import 'package:bluebubbles/services/rustpush/cloud_sync/cloudkit_writer_ownership.dart'; +import 'package:bluebubbles/services/rustpush/cloud_sync/cloud_sync_dev_gate.dart'; +import 'package:bluebubbles/services/rustpush/cloud_sync/cloud_sync_manual_outbound_canary.dart'; +import 'package:bluebubbles/services/rustpush/cloud_sync/cloud_sync_outbound_canary_candidate.dart'; +import 'package:bluebubbles/services/rustpush/cloud_sync/cloud_sync_manual_shadow_controller.dart'; +import 'package:bluebubbles/services/rustpush/cloud_sync/cloud_sync_manual_shadow_owner.dart'; +import 'package:bluebubbles/services/rustpush/cloud_sync/cloud_sync_models.dart'; +import 'package:bluebubbles/services/rustpush/cloud_sync/cloud_sync_observability.dart'; +import 'package:bluebubbles/services/rustpush/cloud_sync/cloud_sync_production_preflight.dart'; +import 'package:bluebubbles/services/rustpush/cloud_sync/cloud_sync_production_sampler_adapter.dart'; +import 'package:bluebubbles/services/rustpush/cloud_sync/cloud_sync_protocol_evidence.dart'; +import 'package:bluebubbles/services/rustpush/cloud_sync/cloud_sync_protector.dart'; +import 'package:bluebubbles/services/rustpush/cloud_sync/cloud_sync_protector_health.dart'; +import 'package:bluebubbles/services/rustpush/cloud_sync/cloud_sync_semantic_pull_report.dart'; +import 'package:bluebubbles/services/rustpush/cloud_sync/cloud_sync_shadow_report.dart'; +import 'package:bluebubbles/services/rustpush/cloud_sync/cloud_sync_shadow_report_file.dart'; +import 'package:bluebubbles/services/rustpush/cloud_sync/legacy_cloudkit_page_guard.dart'; +import 'package:bluebubbles/services/rustpush/cloud_sync/legacy_cloudkit_deletion_intents.dart'; +import 'package:bluebubbles/services/rustpush/cloud_sync/objectbox_cloud_sync_preflight.dart'; +import 'package:bluebubbles/services/rustpush/cloud_sync/objectbox_cloud_sync_store.dart'; +import 'package:bluebubbles/utils/attachment_guid_utils.dart'; import 'package:bluebubbles/utils/crypto_utils.dart'; import 'package:bluebubbles/utils/logger/logger.dart'; import 'package:collection/collection.dart'; +import 'package:connectivity_plus/connectivity_plus.dart'; import 'package:crypto/crypto.dart'; import 'package:ffmpeg_kit_flutter_new/ffmpeg_kit.dart'; import 'package:flutter/cupertino.dart'; @@ -33,7 +60,6 @@ import 'package:geocoding/geocoding.dart'; import 'package:mime_type/mime_type.dart'; import 'package:path/path.dart'; import 'package:path_provider/path_provider.dart'; -import 'package:slugify/slugify.dart'; import 'package:supercharged/supercharged.dart'; import 'package:tuple/tuple.dart'; import 'package:universal_io/io.dart'; @@ -42,38 +68,185 @@ import '../network/backend_service.dart'; import 'package:dio/dio.dart'; import 'package:uuid/uuid.dart'; import 'package:dlibphonenumber/dlibphonenumber.dart'; -import 'package:telephony_plus/telephony_plus.dart'; import 'package:vpn_connection_detector/vpn_connection_detector.dart'; import 'package:convert/convert.dart'; import 'package:bluebubbles/helpers/types/constants.dart' as constants; import 'dart:ui' as ui; import 'package:mixpanel_flutter/mixpanel_flutter.dart'; import 'package:bluebubbles/helpers/backend/startup_tasks.dart'; -import 'package:flutter_isolate/flutter_isolate.dart'; import 'package:google_sign_in_all_platforms/google_sign_in_all_platforms.dart'; import 'package:synchronized/synchronized.dart'; var uuid = const Uuid(); -RustPushService pushService = - Get.isRegistered() ? Get.find() : Get.put(RustPushService()); - +RustPushService pushService = Get.isRegistered() + ? Get.find() + : Get.put(RustPushService()); const rpApiRoot = "https://hw.openbubbles.app/code"; const registrationRelayHost = "https://registration-relay.beeper.com"; -const registrationRelayAccessToken = - "5c175851953ecaf5209185d897591badb6c3e712"; +const registrationRelayAccessToken = String.fromEnvironment( + 'OPENBUBBLES_REGISTRATION_RELAY_ACCESS_TOKEN', +); + +bool get legacyCloudKitMutationsEnabled => + CloudKitWriterOwnership.legacyMutationsEnabled; -const clientId = '1041242226917-ik21n86fp43e82iu1e5soh6bu6gvuste.apps.googleusercontent.com'; +const clientId = + '1041242226917-ik21n86fp43e82iu1e5soh6bu6gvuste.apps.googleusercontent.com'; const clientSecret = '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'; -String _diagnosticHash(String value) => sha256.convert(utf8.encode(value)).toString().substring(0, 12); +String _diagnosticHash(String value) => + sha256.convert(utf8.encode(value)).toString().substring(0, 12); + +String _durationMs(Stopwatch stopwatch) => + stopwatch.elapsedMilliseconds.toString(); + +enum FaceTimeIncomingAdmissionStatus { + approved, + missingCallUuid, + stale, + mismatched, + alreadyClaimed, +} + +class FaceTimeIncomingAdmissionResult { + const FaceTimeIncomingAdmissionResult._({ + required this.status, + this.approvedGroup, + }); + + const FaceTimeIncomingAdmissionResult.approved(String groupUuid) + : this._( + status: FaceTimeIncomingAdmissionStatus.approved, + approvedGroup: groupUuid, + ); + + const FaceTimeIncomingAdmissionResult.rejected( + FaceTimeIncomingAdmissionStatus status) + : this._(status: status); + + final FaceTimeIncomingAdmissionStatus status; + final String? approvedGroup; + + bool get isApproved => status == FaceTimeIncomingAdmissionStatus.approved; +} + +bool shouldAnswerIncomingFaceTimeAdmission( + FaceTimeIncomingAdmissionResult? admission) => + admission?.isApproved == true; + +Future answerFaceTimeAdmissionIfAllowed({ + required bool isIncomingAdmission, + required FaceTimeIncomingAdmissionResult? incomingAdmission, + required FaceTimeIncomingAdmissionCorrelation? correlation, + required String? fallbackApprovedGroup, + required Future Function(String? approvedGroup) answer, +}) async { + if (isIncomingAdmission && + !shouldAnswerIncomingFaceTimeAdmission(incomingAdmission)) { + return false; + } + + final approvedGroup = isIncomingAdmission + ? incomingAdmission!.approvedGroup + : fallbackApprovedGroup; + try { + await answer(approvedGroup); + if (isIncomingAdmission && approvedGroup != null) { + correlation?.complete(); + } + return true; + } catch (_) { + if (isIncomingAdmission && approvedGroup != null) { + correlation?.release(); + } + rethrow; + } +} + +/// Correlates a WebView admission request with the ring that opened it. +/// +/// Direct incoming let-me-in requests do not carry the FaceTime group UUID. +/// The Android call activity supplies the UUID through `get-active-call`, so +/// admission is allowed only when that UUID matches the still-pending ring. +/// The claim remains held until the response completes. The completed ticket +/// stays boundedly available for an idempotent retry of the same request, while +/// a concurrent in-flight duplicate is ignored. +class FaceTimeIncomingAdmissionCorrelation { + FaceTimeIncomingAdmissionCorrelation({ + required this.callUuid, + required this.receivedAt, + }); + + static const maxAge = Duration(minutes: 2); + + final String callUuid; + final DateTime receivedAt; + bool _claimed = false; + bool _completed = false; + bool _expired = false; + + bool get isCompleted => _completed; + + FaceTimeIncomingAdmissionResult claim({ + required String? activeCallUuid, + required DateTime now, + }) { + if (_expired) { + return const FaceTimeIncomingAdmissionResult.rejected( + FaceTimeIncomingAdmissionStatus.stale, + ); + } + if (now.isBefore(receivedAt) || now.difference(receivedAt) > maxAge) { + _expired = true; + return const FaceTimeIncomingAdmissionResult.rejected( + FaceTimeIncomingAdmissionStatus.stale, + ); + } + if (activeCallUuid == null || activeCallUuid.trim().isEmpty) { + return const FaceTimeIncomingAdmissionResult.rejected( + FaceTimeIncomingAdmissionStatus.missingCallUuid, + ); + } + if (activeCallUuid != callUuid) { + return const FaceTimeIncomingAdmissionResult.rejected( + FaceTimeIncomingAdmissionStatus.mismatched, + ); + } + if (_completed) { + // Direct incoming requests have no delegation UUID, so rustpush cannot + // deduplicate a retry for us. Re-approve the same call while its ticket + // remains live in case the first response was lost in transit. + return FaceTimeIncomingAdmissionResult.approved(callUuid); + } + if (_claimed) { + return const FaceTimeIncomingAdmissionResult.rejected( + FaceTimeIncomingAdmissionStatus.alreadyClaimed, + ); + } + + _claimed = true; + return FaceTimeIncomingAdmissionResult.approved(callUuid); + } -String _durationMs(Stopwatch stopwatch) => stopwatch.elapsedMilliseconds.toString(); + void complete() { + if (_claimed) { + _completed = true; + _claimed = false; + } + } + void release() { + if (!_completed) { + _claimed = false; + } + } +} class SyncIsolate { static void initialize() { - ui.CallbackHandle callbackHandle = ui.PluginUtilities.getCallbackHandle(backgroundSyncIsolate)!; + ui.CallbackHandle callbackHandle = + ui.PluginUtilities.getCallbackHandle(backgroundSyncIsolate)!; ss.prefs.setInt("backgroundSyncIsolate", callbackHandle.toRawHandle()); } } @@ -121,18 +294,17 @@ Future backgroundSyncIsolate() async { ui.IsolateNameServer.removePortNameMapping("bg_sync"); mcs.invokeMethod("exit"); } - } // utils for communicating between dart and rustpush. class RustPushBBUtils { static Handle rustHandleToBB(String handle) { var address = handle.replaceAll("tel:", "").replaceAll("mailto:", ""); - var mHandle = Handle.findOne(addressAndService: Tuple2(address, "iMessage")); + var mHandle = + Handle.findOne(addressAndService: Tuple2(address, "iMessage")); if (mHandle == null) { mHandle = Handle( - address: handle.replaceAll("tel:", "").replaceAll("mailto:", "") - ); + address: handle.replaceAll("tel:", "").replaceAll("mailto:", "")); mHandle.save(); } if (mHandle.originalROWID == null) { @@ -161,12 +333,16 @@ class RustPushBBUtils { static DateTime fromNsSinceAppleEpoch(int ns) { const coreDataEpochOffsetSeconds = 978307200; - return DateTime.fromMicrosecondsSinceEpoch((ns ~/ 1000) + coreDataEpochOffsetSeconds * 1000000, isUtc: true); + return DateTime.fromMicrosecondsSinceEpoch( + (ns ~/ 1000) + coreDataEpochOffsetSeconds * 1000000, + isUtc: true); } static int nsSinceAppleEpoch(DateTime time) { const coreDataEpochOffsetSeconds = 978307200; - return (time.microsecondsSinceEpoch - coreDataEpochOffsetSeconds * 1000000) * 1000; + return (time.microsecondsSinceEpoch - + coreDataEpochOffsetSeconds * 1000000) * + 1000; } static String bbHandleToRust(Handle handle) { @@ -178,10 +354,17 @@ class RustPushBBUtils { } } - static Future<(List, List)> rustParticipantsToBB(List participants) async { + static Future<(List, List)> rustParticipantsToBB( + List participants) async { var myHandles = (await api.getHandles(state: pushService.state!.client)); var mine = myHandles.filter((e) => participants.contains(e)).toList(); - return (mine, participants.filter((e) => !myHandles.contains(e)).map((e) => rustHandleToBB(e)).toList()); + return ( + mine, + participants + .filter((e) => !myHandles.contains(e)) + .map((e) => rustHandleToBB(e)) + .toList() + ); } static Map modelMap = { @@ -401,7 +584,10 @@ class RustPushBackend implements BackendService { fromHandle = sender; // this is a forwarded message } } - return api.MessageType.sms(isPhone: await chat.shouldRoute(), usingNumber: await chat.ensureHandle(), fromHandle: fromHandle); + return api.MessageType.sms( + isPhone: await chat.shouldRoute(), + usingNumber: await chat.ensureHandle(), + fromHandle: fromHandle); } return const api.MessageType.iMessage(); } @@ -421,7 +607,8 @@ class RustPushBackend implements BackendService { // lookup) already burned its own immediate retries, the resource itself is still coming back. if (!e.message.contains("Failed to generate resource")) return null; if (e.message.contains("not retrying")) return null; - var seconds = int.tryParse(resourceRetryRegex.firstMatch(e.message)?.group(1) ?? ""); + var seconds = + int.tryParse(resourceRetryRegex.firstMatch(e.message)?.group(1) ?? ""); if (seconds == null) return null; var wait = Duration(seconds: seconds); return wait > maxResourceWait ? maxResourceWait : wait; @@ -433,7 +620,9 @@ class RustPushBackend implements BackendService { static const sendTimeoutRetryWait = Duration(seconds: 2); static const maxSendTimeoutRetries = 1; - Future sendMsg(api.MessageInst msg, {bool waitForResource = true}) async { + Future sendMsg(api.MessageInst msg, + {bool waitForResource = true, + Future Function()? rebuildForRetry}) async { var message = Message.findOne(guid: msg.id); if (message != null) { message.sendingServiceId = pushService.serviceId; @@ -445,18 +634,27 @@ class RustPushBackend implements BackendService { try { while (true) { try { - stillRunning = await api.send(state: pushService.state!.client, local: pushService.state!.localBroadcast, msg: msg); + stillRunning = await api.send( + state: pushService.state!.client, + local: pushService.state!.localBroadcast, + msg: msg); break; } catch (e) { if (e is AnyhowException) { - if (e.message.contains("Failed to generate resource") && e.message.contains("not retrying")) { + if (e.message.contains("Failed to generate resource") && + e.message.contains("not retrying")) { pushService.markFailedToLogin(); rethrow; } - if (e.message.contains("Send timeout; try again") && sendTimeoutRetries < maxSendTimeoutRetries) { + if (e.message.contains("Send timeout; try again") && + sendTimeoutRetries < maxSendTimeoutRetries) { sendTimeoutRetries++; - Logger.warn("Send confirmation timed out; retrying once after the push connection reload"); + Logger.warn( + "Send confirmation timed out; retrying once after the push connection reload"); await Future.delayed(sendTimeoutRetryWait); + if (rebuildForRetry != null) { + msg = await rebuildForRetry(); + } continue; } } @@ -464,9 +662,13 @@ class RustPushBackend implements BackendService { // add a second so we retry *after* rustpush has had a chance to regenerate if (wait != null) wait += const Duration(seconds: 1); if (wait == null || waited + wait > sendRetryBudget) rethrow; - Logger.warn("Connection isn't ready; retrying ${msg.id} in ${wait.inSeconds}s ($e)"); + Logger.warn( + "Connection isn't ready; retrying ${msg.id} in ${wait.inSeconds}s ($e)"); await Future.delayed(wait); waited += wait; + if (rebuildForRetry != null) { + msg = await rebuildForRetry(); + } } } } finally { @@ -481,27 +683,33 @@ class RustPushBackend implements BackendService { } @override - Future createChat(List addresses, AttributedBody? message, String service, + Future createChat( + List addresses, AttributedBody? message, String service, {CancelToken? cancelToken, String? existingGuid}) async { - var handle = service == "SMS" ? await getDefaultSMSHandle() : await getDefaultHandle(); - var formattedHandles = addresses.map((e) => RustPushBBUtils.rustHandleToBB(e)).toList(); + var handle = service == "SMS" + ? await getDefaultSMSHandle() + : await getDefaultHandle(); + var formattedHandles = + addresses.map((e) => RustPushBBUtils.rustHandleToBB(e)).toList(); var chat = Chat( guid: existingGuid ?? uuid.v4(), participants: formattedHandles, usingHandle: handle, isRpSms: service == "SMS", - senderIsKnown: formattedHandles.any((handle) => !(handle.contact?.isShared ?? true)), + senderIsKnown: + formattedHandles.any((handle) => !(handle.contact?.isShared ?? true)), ); chat.save(); //save for reflectMessage if (message != null) { var msg = await api.newMsg( conversation: await chat.getConversationData(), message: api.Message.message(api.NormalMessage( - parts: await partsFromBody(message), - service: await getService(chat), - voice: false, - embeddedProfile: await pushService.getShareProfileMessageFor(chat.participants), - )), + parts: await partsFromBody(message), + service: await getService(chat), + voice: false, + embeddedProfile: + await pushService.getShareProfileMessageFor(chat.participants), + )), sender: handle); if (chat.isRpSms) { msg.target = await getSMSTargets(handle); @@ -520,13 +728,22 @@ class RustPushBackend implements BackendService { @override Future downloadAttachment(Attachment attachment, - {void Function(int p1, int p2)? onReceiveProgress, bool original = false, CancelToken? cancelToken}) async { + {void Function(int p1, int p2)? onReceiveProgress, + bool original = false, + CancelToken? cancelToken}) async { if (attachment.metadata!.containsKey("cloud")) { - await api.downloadCloudAttachments(cloudMessagesClient: pushService.state!.icloudServices!.cloudMessagesClient!, files: [(attachment.path, attachment.metadata!["cloud"])]); + await api.downloadCloudAttachments( + cloudMessagesClient: + pushService.state!.icloudServices!.cloudMessagesClient!, + files: [(attachment.path, attachment.metadata!["cloud"])]); return attachment.getFile(); } - var rustAttachment = api.restoreAttachment(data: attachment.metadata!["rustpush"]); - var stream = api.downloadAttachment(aps: pushService.state!.conn, attachment: rustAttachment, path: attachment.path); + var rustAttachment = + api.restoreAttachment(data: attachment.metadata!["rustpush"]); + var stream = api.downloadAttachment( + aps: pushService.state!.conn, + attachment: rustAttachment, + path: attachment.path); await for (final event in stream) { if (onReceiveProgress != null) { onReceiveProgress(event.prog, event.total); @@ -536,7 +753,8 @@ class RustPushBackend implements BackendService { // android doesn't support CAF, convert to m4a if (attachment.uti == "com.apple.coreaudio-format" && Platform.isAndroid) { await File(attachment.path).rename("${attachment.directory}/encode.caf"); - var session = await FFmpegKit.execute("-i \"${attachment.directory}/encode.caf\" \"${attachment.directory}/encode.m4a\""); + var session = await FFmpegKit.execute( + "-i \"${attachment.directory}/encode.caf\" \"${attachment.directory}/encode.m4a\""); var output = (await session.getOutput())!; while (output.isNotEmpty) { @@ -552,9 +770,12 @@ class RustPushBackend implements BackendService { Future> getSMSTargets(String handle) async { if (ss.settings.isSmsRouter.value) { - var registered = await api.getMyPhoneHandles(state: pushService.state!.client); + var registered = + await api.getMyPhoneHandles(state: pushService.state!.client); if (registered.contains(handle)) { - return ss.settings.smsRoutingTargets.map((element) => api.MessageTarget.uuid(element)).toList(); + return ss.settings.smsRoutingTargets + .map((element) => api.MessageTarget.uuid(element)) + .toList(); } } var target = ss.settings.smsForwardingTargets[handle]; @@ -563,7 +784,10 @@ class RustPushBackend implements BackendService { } @override - Future sendAttachment(Chat chat, Message m, bool isAudioMessage, Attachment att, {void Function(int p1, int p2)? onSendProgress, CancelToken? cancelToken}) async { + Future sendAttachment( + Chat chat, Message m, bool isAudioMessage, Attachment att, + {void Function(int p1, int p2)? onSendProgress, + CancelToken? cancelToken}) async { if (chat.isRpSms && !smsForwardingEnabled()) { throw Exception("SMS is not enabled (enable in settings -> user)"); } @@ -590,21 +814,30 @@ class RustPushBackend implements BackendService { conversation: await chat.getConversationData(), sender: await chat.ensureHandle(), message: api.Message.message(api.NormalMessage( - parts: api.MessageParts( - field0: [ - if (m.payloadData?.appData?.first.ldText != null) - api.IndexedMessagePart(part_: api.MessagePart.object(m.payloadData!.appData!.first.ldText!)), - api.IndexedMessagePart(part_: api.MessagePart.attachment(attachment!)) - ]), + parts: api.MessageParts(field0: [ + if (m.payloadData?.appData?.first.ldText != null) + api.IndexedMessagePart( + part_: api.MessagePart.object( + m.payloadData!.appData!.first.ldText!)), + api.IndexedMessagePart( + part_: api.MessagePart.attachment(attachment!)) + ]), replyGuid: m.threadOriginatorGuid, - replyPart: m.threadOriginatorGuid == null ? null : m.threadOriginatorPart, + replyPart: + m.threadOriginatorGuid == null ? null : m.threadOriginatorPart, effect: m.expressiveSendStyleId, service: await getService(chat, forMessage: m), subject: m.subject, - app: m.payloadData == null ? null : pushService.dataToApp(m.payloadData!), + app: m.payloadData == null + ? null + : pushService.dataToApp(m.payloadData!), voice: isAudioMessage, - scheduled: m.dateScheduled != null ? api.ScheduleMode(ms: m.dateScheduled!.millisecondsSinceEpoch, schedule: true) : null, - embeddedProfile: await pushService.getShareProfileMessageFor(chat.participants), + scheduled: m.dateScheduled != null + ? api.ScheduleMode( + ms: m.dateScheduled!.millisecondsSinceEpoch, schedule: true) + : null, + embeddedProfile: + await pushService.getShareProfileMessageFor(chat.participants), ))); if (m.stagingGuid != null) { msg.id = m.stagingGuid!; @@ -612,7 +845,8 @@ class RustPushBackend implements BackendService { if (chat.isRpSms) { msg.target = await getSMSTargets(msg.sender!); } - m.stagingGuid = msg.id; // in case delivered comes in before sending "finishes" (also for retries, duh) + m.stagingGuid = msg + .id; // in case delivered comes in before sending "finishes" (also for retries, duh) m.save(chat: chat); await sendMsg(msg); if (chat.isRpSms) { @@ -625,7 +859,8 @@ class RustPushBackend implements BackendService { return (await pushService.reflectMessageDyn(msg))!; } - Future forwardMMSAttachment(Chat chat, Message m, Attachment att) async { + Future forwardMMSAttachment( + Chat chat, Message m, Attachment att) async { // 300 kb api.Attachment? attachment; var stream = api.uploadAttachment( @@ -657,15 +892,20 @@ class RustPushBackend implements BackendService { conversation: await chat.getConversationData(), sender: await chat.ensureHandle(), message: api.Message.message(api.NormalMessage( - parts: api.MessageParts( - field0: [api.IndexedMessagePart(part_: api.MessagePart.attachment(attachment!))]), - replyGuid: m.threadOriginatorGuid, - replyPart: m.threadOriginatorGuid == null ? null : m.threadOriginatorPart, - effect: m.expressiveSendStyleId, - service: service, - voice: false - ))); - if (m.stagingGuid != null || (m.guid != null && m.guid!.contains("error") && m.guid!.contains("temp"))) { + parts: api.MessageParts(field0: [ + api.IndexedMessagePart( + part_: api.MessagePart.attachment(attachment!)) + ]), + replyGuid: m.threadOriginatorGuid, + replyPart: + m.threadOriginatorGuid == null ? null : m.threadOriginatorPart, + effect: m.expressiveSendStyleId, + service: service, + voice: false))); + if (m.stagingGuid != null || + (m.guid != null && + m.guid!.contains("error") && + m.guid!.contains("temp"))) { msg.id = m.stagingGuid ?? m.guid!; } msg.target = await getSMSTargets(msg.sender!); @@ -679,11 +919,15 @@ class RustPushBackend implements BackendService { return false; } - Future broadcastSmsForwardingState(bool state, List uuids) async { + Future broadcastSmsForwardingState( + bool state, List uuids) async { var handles = await api.getHandles(state: pushService.state!.client); - var useHandle = handles.firstWhereOrNull((handle) => handle.contains("tel:")) ?? handles.first; + var useHandle = + handles.firstWhereOrNull((handle) => handle.contains("tel:")) ?? + handles.first; var msg = await api.newMsg( - conversation: api.ConversationData(participants: [useHandle], cvName: null, senderGuid: null), + conversation: api.ConversationData( + participants: [useHandle], cvName: null, senderGuid: null), sender: useHandle, message: api.Message.enableSmsActivation(state), ); @@ -714,7 +958,8 @@ class RustPushBackend implements BackendService { var msg = await api.newMsg( conversation: await chat.getConversationData(), sender: await chat.ensureHandle(), - message: api.Message.iconChange(api.IconChangeMessage(groupVersion: chat.groupVersion!)), + message: api.Message.iconChange( + api.IconChangeMessage(groupVersion: chat.groupVersion!)), ); await sendMsg(msg); Attachment.delete(chat.photoAttachmentGuid!); @@ -743,9 +988,12 @@ class RustPushBackend implements BackendService { var detail = await pushService.checkPurchaseState(); var handles = await api.getHandles(state: pushService.state!.client); var state = await api.getRegstate(state: pushService.state!.client); - var deviceState = await api.getDeviceInfo(config: pushService.state!.osConfig); + var deviceState = + await api.getDeviceInfo(config: pushService.state!.osConfig); var stateStr = ""; - if (!detail && ss.settings.deviceIsHosted.value && ss.settings.hostedToken.value != null) { + if (!detail && + ss.settings.deviceIsHosted.value && + ss.settings.hostedToken.value != null) { stateStr = "Subscription not active!"; } else if (state is api.RegisterState_Registered) { stateStr = "Connected (renew in ${formatDuration(state.nextS)})"; @@ -755,7 +1003,9 @@ class RustPushBackend implements BackendService { String suffix = ""; if (state.retryWait != null) { var data = state.retryWait!.toInt(); - suffix = "(waiting ${formatDuration(data)}; error: ${state.error})"; + final displayError = state.error.replaceAll( + "Relay device offline!", "Relay service unavailable!"); + suffix = "(waiting ${formatDuration(data)}; error: $displayError)"; } stateStr = "Deregistered $suffix"; } @@ -763,21 +1013,31 @@ class RustPushBackend implements BackendService { "account_name": ss.settings.userName.value, "apple_id": ss.settings.iCloudAccount.value, "login_status_message": stateStr, - "vetted_aliases": handles.map((e) => { - "Alias": e.replaceFirst("tel:", "").replaceFirst("mailto:", ""), - "Status": state is api.RegisterState_Registered ? 3 : 0, - }).toList(), - "active_alias": (await getDefaultHandle()).replaceFirst("tel:", "").replaceFirst("mailto:", ""), + "vetted_aliases": handles + .map((e) => { + "Alias": e.replaceFirst("tel:", "").replaceFirst("mailto:", ""), + "Status": state is api.RegisterState_Registered ? 3 : 0, + }) + .toList(), + "active_alias": (await getDefaultHandle()) + .replaceFirst("tel:", "") + .replaceFirst("mailto:", ""), "sms_forwarding_capable": true, "sms_forwarding_enabled": smsForwardingEnabled(), - "can_pnr": deviceState.name.contains("iPhone") || deviceState.name.contains("iPod") || deviceState.name.contains("iPad"), - "can_forward": (await api.getMyPhoneHandles(state: pushService.state!.client)).isNotEmpty || ss.settings.isTester.value, + "can_pnr": deviceState.name.contains("iPhone") || + deviceState.name.contains("iPod") || + deviceState.name.contains("iPad"), + "can_forward": + (await api.getMyPhoneHandles(state: pushService.state!.client)) + .isNotEmpty || + ss.settings.isTester.value, }; } @override Future setDefaultHandle(String defaultHandle) async { - ss.settings.defaultHandle.value = await RustPushBBUtils.formatAndAddPrefix(defaultHandle); + ss.settings.defaultHandle.value = + await RustPushBBUtils.formatAndAddPrefix(defaultHandle); ss.saveSettings(); } @@ -788,7 +1048,8 @@ class RustPushBackend implements BackendService { @override Future setChatIcon(Chat chat, String path, - {void Function(int p1, int p2)? onSendProgress, CancelToken? cancelToken}) async { + {void Function(int p1, int p2)? onSendProgress, + CancelToken? cancelToken}) async { chat.groupVersion = (chat.groupVersion ?? -1) + 1; var mmcsStream = api.uploadMmcs(aps: pushService.state!.conn, path: path); api.MMCSFile? mmcs; @@ -805,45 +1066,57 @@ class RustPushBackend implements BackendService { var msg = await api.newMsg( conversation: await chat.getConversationData(), sender: await chat.ensureHandle(), - message: api.Message.iconChange(api.IconChangeMessage(groupVersion: chat.groupVersion!, file: mmcs!)), + message: api.Message.iconChange( + api.IconChangeMessage(groupVersion: chat.groupVersion!, file: mmcs!)), ); await sendMsg(msg); chat.updateAttachmentGuid(msg.id); chat.ckSyncState = false; - chat.save(updateAttachmentGuid: true, updateCustomAvatarPath: true, updateGroupVersion: true, updateCkSyncState: true); + chat.save( + updateAttachmentGuid: true, + updateCustomAvatarPath: true, + updateGroupVersion: true, + updateCkSyncState: true); msg.sentTimestamp = DateTime.now().millisecondsSinceEpoch; inq.queue(IncomingItem( - chat: chat, - message: (await pushService.reflectMessageDyn(msg))!, - type: QueueType.newMessage - )); + chat: chat, + message: (await pushService.reflectMessageDyn(msg))!, + type: QueueType.newMessage)); return true; } Future getOperatedChat(Chat c) async { var conversationData = await c.getConversationData(); - var name = c.participants.length == 1 ? "iMessage;-;${c.participants[0].address}" : "iMessage;+;chat${Random().nextInt(9999999999999999)}"; + var name = c.participants.length == 1 + ? "iMessage;-;${c.participants[0].address}" + : "iMessage;+;chat${Random().nextInt(9999999999999999)}"; return api.OperatedChat( - participants: conversationData.participants.map((p) => p.replaceFirst("mailto:", "").replaceFirst("tel:", "")).toList(), - groupId: conversationData.senderGuid!, + participants: conversationData.participants + .map((p) => p.replaceFirst("mailto:", "").replaceFirst("tel:", "")) + .toList(), + groupId: conversationData.senderGuid!, guid: name, ); } @override Future moveToRecycleBin(Chat c, Message? message) async { - var handle = await c.ensureHandle(); var msg = await api.newMsg( - conversation: message?.dateScheduled != null ? await c.getConversationData() : api.ConversationData(participants: [handle]), - sender: handle, - message: message?.dateScheduled != null ? - const api.Message.unschedule() - : api.Message.moveToRecycleBin(api.MoveToRecycleBinMessage(target: message != null ? api.DeleteTarget.messages([message.guid!]) : api.DeleteTarget.chat(await getOperatedChat(c)), recoverableDeleteDate: DateTime.now().millisecondsSinceEpoch)) - ); + conversation: message?.dateScheduled != null + ? await c.getConversationData() + : api.ConversationData(participants: [handle]), + sender: handle, + message: message?.dateScheduled != null + ? const api.Message.unschedule() + : api.Message.moveToRecycleBin(api.MoveToRecycleBinMessage( + target: message != null + ? api.DeleteTarget.messages([message.guid!]) + : api.DeleteTarget.chat(await getOperatedChat(c)), + recoverableDeleteDate: DateTime.now().millisecondsSinceEpoch))); if (message?.dateScheduled != null) { msg.id = message!.guid!; } @@ -854,10 +1127,9 @@ class RustPushBackend implements BackendService { Future restoreChat(Chat c) async { var handle = await c.ensureHandle(); var msg = await api.newMsg( - conversation: api.ConversationData(participants: [handle]), - sender: handle, - message: api.Message.recoverChat(await getOperatedChat(c)) - ); + conversation: api.ConversationData(participants: [handle]), + sender: handle, + message: api.Message.recoverChat(await getOperatedChat(c))); await sendMsg(msg); } @@ -865,48 +1137,58 @@ class RustPushBackend implements BackendService { Future permanentlyDeleteChat(Chat c) async { var handle = await c.ensureHandle(); var msg = await api.newMsg( - conversation: api.ConversationData(participants: [handle]), - sender: handle, - message: api.Message.permanentDelete(api.PermanentDeleteMessage(target: api.DeleteTarget.chat(await getOperatedChat(c)), isScheduled: false)) - ); + conversation: api.ConversationData(participants: [handle]), + sender: handle, + message: api.Message.permanentDelete(api.PermanentDeleteMessage( + target: api.DeleteTarget.chat(await getOperatedChat(c)), + isScheduled: false))); await sendMsg(msg); } bool smsForwardingEnabled() { - return ss.settings.isSmsRouter.value || ss.settings.smsForwardingTargets.isNotEmpty; + return ss.settings.isSmsRouter.value || + ss.settings.smsForwardingTargets.isNotEmpty; } Future partsFromBody(AttributedBody body) async { - List parts = []; for (var e in body.runs) { if (e.isAttachment) { var attachment = Attachment.findOne(e.attributes!.attachmentGuid!); if (attachment == null) continue; - var rustAttachment = api.restoreAttachment(data: attachment.metadata!["rustpush"]); - parts.add(api.IndexedMessagePart(part_: api.MessagePart.attachment(rustAttachment))); + var rustAttachment = + api.restoreAttachment(data: attachment.metadata!["rustpush"]); + parts.add(api.IndexedMessagePart( + part_: api.MessagePart.attachment(rustAttachment))); continue; } - var text = body.string.substring(e.range.first, e.range.first + e.range.last); - parts.add(api.IndexedMessagePart(part_: e.hasMention ? - api.MessagePart.mention(e.attributes!.mention!, text) : - api.MessagePart.text(text, pushService.fromAttributes(e.attributes!)))); + var text = + body.string.substring(e.range.first, e.range.first + e.range.last); + parts.add(api.IndexedMessagePart( + part_: e.hasMention + ? api.MessagePart.mention(e.attributes!.mention!, text) + : api.MessagePart.text( + text, pushService.fromAttributes(e.attributes!)))); } return api.MessageParts(field0: parts); } @override - Future sendMessage(Chat chat, Message m, {CancelToken? cancelToken}) async { + Future sendMessage(Chat chat, Message m, + {CancelToken? cancelToken}) async { if (chat.isRpSms && !smsForwardingEnabled()) { throw Exception("SMS is not enabled (enable in settings -> user)"); } - api.LinkMeta? linkMeta; + Future Function()? buildLinkMeta; try { - if (m.fullText.replaceAll("\n", " ").hasUrl && !MetadataHelper.mapIsNotEmpty(m.metadata) && !m.hasApplePayloadData) { - var metadata = await MetadataHelper.fetchMetadata(m).timeout(const Duration(seconds: 15)); - + if (m.fullText.replaceAll("\n", " ").hasUrl && + !MetadataHelper.mapIsNotEmpty(m.metadata) && + !m.hasApplePayloadData) { + var metadata = await MetadataHelper.fetchMetadata(m) + .timeout(const Duration(seconds: 15)); + if (MetadataHelper.isNotEmpty(metadata)) { m.metadata = metadata!.toJson(); List attachments = []; @@ -917,88 +1199,157 @@ class RustPushBackend implements BackendService { var uri = Uri.parse(m.url!).replace(path: "/favicon.ico"); var iconUrl = uri.toString(); - final response = await http.dio.get(iconUrl, options: Options(responseType: ResponseType.bytes, receiveTimeout: const Duration(seconds: 15))); + final response = await http.dio.get(iconUrl, + options: Options( + responseType: ResponseType.bytes, + receiveTimeout: const Duration(seconds: 15))); if (response.statusCode == 200) { var contentType = response.headers.value('content-type')!; // some sites don't send favicons for the favicon if (contentType.startsWith("image/")) { - - iconmeta = api.LPIconMetadata(url: api.NSURL(base: "\$null", relative: iconUrl), version: 1); - - icon = api.RichLinkImageAttachmentSubstitute(mimeType: contentType, richLinkImageAttachmentSubstituteIndex: BigInt.from(attachments.length)); + iconmeta = api.LPIconMetadata( + url: api.NSURL(base: "\$null", relative: iconUrl), + version: 1); + + icon = api.RichLinkImageAttachmentSubstitute( + mimeType: contentType, + richLinkImageAttachmentSubstituteIndex: + BigInt.from(attachments.length)); attachments.add(response.data as Uint8List); } } if (metadata.image != null) { - imagemeta = api.LPImageMetadata(size: "{0, 0}", url: api.NSURL(base: "\$null", relative: metadata.image!), version: 1); - - final response = await http.dio.get(metadata.image!, options: Options(responseType: ResponseType.bytes, receiveTimeout: const Duration(seconds: 15))); + imagemeta = api.LPImageMetadata( + size: "{0, 0}", + url: api.NSURL(base: "\$null", relative: metadata.image!), + version: 1); + + final response = await http.dio.get(metadata.image!, + options: Options( + responseType: ResponseType.bytes, + receiveTimeout: const Duration(seconds: 15))); var contentType = response.headers.value('content-type')!; - image = api.RichLinkImageAttachmentSubstitute(mimeType: contentType, richLinkImageAttachmentSubstituteIndex: BigInt.from(attachments.length)); + image = api.RichLinkImageAttachmentSubstitute( + mimeType: contentType, + richLinkImageAttachmentSubstituteIndex: + BigInt.from(attachments.length)); attachments.add(response.data as Uint8List); } - linkMeta = api.LinkMeta( - attachments: attachments, - data: api.LPLinkMetadata( - imageMetadata: imagemeta, - image: image, - originalUrl: api.NSURL(base: "\$null", relative: m.url!), - url: api.NSURL(base: "\$null", relative: metadata.url!), - title: metadata.title, - summary: metadata.description, - images: imagemeta == null ? null : await api.createImageArray(img: imagemeta), - iconMetadata: iconmeta, - icon: icon, - icons: iconmeta == null ? null : await api.createIconArray(img: iconmeta), - version: 1, - ), - ); + final originalUrl = m.url!; + final resolvedUrl = metadata.url ?? originalUrl; + final title = metadata.title; + final summary = metadata.description; + final attachmentBytes = attachments + .map((bytes) => Uint8List.fromList(bytes)) + .toList(growable: false); + + // `images` and `icons` are Rust-owned opaque arrays. Encoding a + // MessageInst moves them out of Dart, so a transport retry must build + // fresh arrays rather than reuse the disposed objects from attempt 1. + buildLinkMeta = () async => api.LinkMeta( + attachments: attachmentBytes + .map((bytes) => Uint8List.fromList(bytes)) + .toList(growable: false), + data: api.LPLinkMetadata( + imageMetadata: imagemeta, + image: image, + originalUrl: + api.NSURL(base: "\$null", relative: originalUrl), + url: api.NSURL(base: "\$null", relative: resolvedUrl), + title: title, + summary: summary, + images: imagemeta == null + ? null + : await api.createImageArray(img: imagemeta), + iconMetadata: iconmeta, + icon: icon, + icons: iconmeta == null + ? null + : await api.createIconArray(img: iconmeta), + version: 1, + ), + ); } } } catch (e, s) { Logger.error("Failed to generate meta $e $s"); } // await Future.delayed(const Duration(seconds: 15)); - api.MessageParts parts; - if (m.attributedBody.isNotEmpty) { - parts = await partsFromBody(m.attributedBody.first); - } else { - parts = api.MessageParts(field0: [api.IndexedMessagePart(part_: api.MessagePart.text(m.text!, pushService.defaultFormat()))]); - } - if (m.payloadData?.appData?.first.ldText != null) { - parts.field0.add(api.IndexedMessagePart(part_: api.MessagePart.object(m.payloadData!.appData!.first.ldText!))); + Future buildWireMessage() async { + api.MessageParts parts; + if (m.attributedBody.isNotEmpty) { + parts = await partsFromBody(m.attributedBody.first); + } else { + parts = api.MessageParts(field0: [ + api.IndexedMessagePart( + part_: + api.MessagePart.text(m.text!, pushService.defaultFormat())) + ]); + } + if (m.payloadData?.appData?.first.ldText != null) { + parts.field0.add(api.IndexedMessagePart( + part_: + api.MessagePart.object(m.payloadData!.appData!.first.ldText!))); + } + return api.newMsg( + conversation: await chat.getConversationData(), + sender: await chat.ensureHandle(), + message: api.Message.message(api.NormalMessage( + parts: parts, + replyGuid: m.threadOriginatorGuid, + replyPart: + m.threadOriginatorGuid == null ? null : m.threadOriginatorPart, + effect: m.expressiveSendStyleId, + service: await getService(chat, forMessage: m), + subject: m.subject == "" ? null : m.subject, + app: m.payloadData == null + ? null + : pushService.dataToApp(m.payloadData!), + linkMeta: buildLinkMeta == null ? null : await buildLinkMeta(), + voice: false, + scheduled: m.dateScheduled != null + ? api.ScheduleMode( + ms: m.dateScheduled!.millisecondsSinceEpoch, schedule: true) + : null, + embeddedProfile: + await pushService.getShareProfileMessageFor(chat.participants), + )), + ); } - var msg = await api.newMsg( - conversation: await chat.getConversationData(), - sender: await chat.ensureHandle(), - message: api.Message.message(api.NormalMessage( - parts: parts, - replyGuid: m.threadOriginatorGuid, - replyPart: m.threadOriginatorGuid == null ? null : m.threadOriginatorPart, - effect: m.expressiveSendStyleId, - service: await getService(chat, forMessage: m), - subject: m.subject == "" ? null : m.subject, - app: m.payloadData == null ? null : pushService.dataToApp(m.payloadData!), - linkMeta: linkMeta, - voice: false, - scheduled: m.dateScheduled != null ? api.ScheduleMode(ms: m.dateScheduled!.millisecondsSinceEpoch, schedule: true) : null, - embeddedProfile: await pushService.getShareProfileMessageFor(chat.participants), - )), - ); + + var msg = await buildWireMessage(); Logger.info("sending ${msg.id}"); - if (m.stagingGuid != null || (m.dateScheduled != null && !m.guid!.contains("temp") && !m.guid!.contains("error")) || (chat.isRpSms && m.guid != null && m.guid!.contains("error") && m.guid!.contains("temp"))) { - msg.id = m.stagingGuid ?? m.guid!; // make sure we pass forwarded messages's original GUID so it doesn't get overwritten and marked as a different msg + if (m.stagingGuid != null || + (m.dateScheduled != null && + !m.guid!.contains("temp") && + !m.guid!.contains("error")) || + (chat.isRpSms && + m.guid != null && + m.guid!.contains("error") && + m.guid!.contains("temp"))) { + msg.id = m.stagingGuid ?? + m.guid!; // make sure we pass forwarded messages's original GUID so it doesn't get overwritten and marked as a different msg } if (chat.isRpSms) { msg.target = await getSMSTargets(msg.sender!); } - m.stagingGuid = msg.id; // in case delivered comes in before sending "finishes" (also for retries, duh) + final stableMessageId = msg.id; + Future rebuildWireMessage() async { + final rebuilt = await buildWireMessage(); + rebuilt.id = stableMessageId; + if (chat.isRpSms) { + rebuilt.target = await getSMSTargets(rebuilt.sender!); + } + return rebuilt; + } + m.stagingGuid = msg + .id; // in case delivered comes in before sending "finishes" (also for retries, duh) m.save(chat: chat); try { - await sendMsg(msg); + await sendMsg(msg, rebuildForRetry: rebuildWireMessage); } catch (e) { Logger.error(e); if (!chat.isRpSms || !ss.settings.isSmsRouter.value) { @@ -1014,11 +1365,12 @@ class RustPushBackend implements BackendService { await m.forwardIfNessesary(chat); m.save(chat: chat); msg.sentTimestamp = DateTime.now().millisecondsSinceEpoch; - if (m.hasBeenForwarded) return m; // do not reflect back, it will just send it out again + if (m.hasBeenForwarded) { + return m; // do not reflect back, it will just send it out again + } return (await pushService.reflectMessageDyn(msg)) ?? m; } - @override bool supportsFocusStates() { return false; @@ -1037,7 +1389,7 @@ class RustPushBackend implements BackendService { conversation: data, sender: await chat.ensureHandle(), message: const api.Message.read()); - + msg.id = latestMsg!; if (msg.id.contains("temp") || msg.id.contains("error")) { return true; @@ -1072,30 +1424,33 @@ class RustPushBackend implements BackendService { var msg = await api.newMsg( conversation: data, sender: await chat.ensureHandle(), - message: api.Message.renameMessage(api.RenameMessage(newName: newName))); + message: + api.Message.renameMessage(api.RenameMessage(newName: newName))); await sendMsg(msg); msg.sentTimestamp = DateTime.now().millisecondsSinceEpoch; chat.apnTitle = newName; chat.ckSyncState = false; chat.save(updateAPNTitle: true, updateCkSyncState: true); inq.queue(IncomingItem( - chat: chat, - message: (await pushService.reflectMessageDyn(msg))!, - type: QueueType.newMessage - )); + chat: chat, + message: (await pushService.reflectMessageDyn(msg))!, + type: QueueType.newMessage)); return true; } @override - Future chatParticipant(ParticipantOp method, Chat chat, String newName) async { + Future chatParticipant( + ParticipantOp method, Chat chat, String newName) async { chat.groupVersion = (chat.groupVersion ?? -1) + 1; var data = await chat.getConversationData(); var newParticipants = data.participants.copy(); if (method == ParticipantOp.Add) { var target = await RustPushBBUtils.formatAndAddPrefix(newName); - var valid = - (await api.validateTargets(state: pushService.state!.client, targets: [target], sender: await chat.ensureHandle())) - .isNotEmpty; + var valid = (await api.validateTargets( + state: pushService.state!.client, + targets: [target], + sender: await chat.ensureHandle())) + .isNotEmpty; if (!valid) { return false; } @@ -1106,8 +1461,9 @@ class RustPushBackend implements BackendService { var msg = await api.newMsg( conversation: data, sender: await chat.ensureHandle(), - message: api.Message.changeParticipants( - api.ChangeParticipantMessage(groupVersion: chat.groupVersion!, newParticipants: newParticipants))); + message: api.Message.changeParticipants(api.ChangeParticipantMessage( + groupVersion: chat.groupVersion!, + newParticipants: newParticipants))); await sendMsg(msg); msg.sentTimestamp = DateTime.now().millisecondsSinceEpoch; await pushService.reflectMessageDyn(msg); // change participants does itself @@ -1139,7 +1495,9 @@ class RustPushBackend implements BackendService { // capitalize first letter text = "${time[0].toUpperCase()}${time.substring(1).toLowerCase()}"; } else { - text = reaction.startsWith("-") ? "Removed ${reaction.substring(1)} from" : "Reacted $reaction to"; + text = reaction.startsWith("-") + ? "Removed ${reaction.substring(1)} from" + : "Reacted $reaction to"; } var annotations = AttributedBody.raw("$text “${selected.text}”"); final _message = Message( @@ -1149,14 +1507,21 @@ class RustPushBackend implements BackendService { isFromMe: true, associatedMessageGuid: selected.guid, associatedMessagePart: 0, - associatedMessageType: ReactionTypes.reactionToVerb.containsKey(reaction) ? reaction : reaction.startsWith("-") ? "-${ReactionTypes.EMOJI}" : ReactionTypes.EMOJI, - associatedMessageEmoji: ReactionTypes.reactionToVerb.containsKey(reaction) ? null : reaction.startsWith("-") ? reaction.substring(1) : reaction, + associatedMessageType: + ReactionTypes.reactionToVerb.containsKey(reaction) + ? reaction + : reaction.startsWith("-") + ? "-${ReactionTypes.EMOJI}" + : ReactionTypes.EMOJI, + associatedMessageEmoji: + ReactionTypes.reactionToVerb.containsKey(reaction) + ? null + : reaction.startsWith("-") + ? reaction.substring(1) + : reaction, handleId: 0, hasDdResults: true, - attributedBody: [ - if (annotations.string.isNotEmpty) - annotations - ], + attributedBody: [if (annotations.string.isNotEmpty) annotations], ); _message.generateTempGuid(); return await sendMessage(chat, _message); @@ -1169,20 +1534,25 @@ class RustPushBackend implements BackendService { message: api.Message.react(api.ReactMessage( toUuid: selected.guid!, toPart: repPart ?? 0, - embeddedProfile: await pushService.getShareProfileMessageFor(chat.participants), + embeddedProfile: + await pushService.getShareProfileMessageFor(chat.participants), toText: selected.text ?? "", - reaction: api.ReactMessageType.react(reaction: reactionMap[reaction]?.call() ?? api.Reaction.emoji(reaction), enable: enabled)))); + reaction: api.ReactMessageType.react( + reaction: reactionMap[reaction]?.call() ?? + api.Reaction.emoji(reaction), + enable: enabled)))); await sendMsg(msg); msg.sentTimestamp = DateTime.now().millisecondsSinceEpoch; return (await pushService.reflectMessageDyn(msg))!; } @override - Future updateMessage( - Chat chat, Message old, PayloadData newData, PlatformFile? newImage, bool isMeta, String? notifText) async { + Future updateMessage(Chat chat, Message old, PayloadData newData, + PlatformFile? newImage, bool isMeta, String? notifText) async { api.Attachment? attachment; if (newImage != null) { - String data = await DefaultAssetBundle.of(Get.context!).loadString("assets/rustpush/uti-map.json"); + String data = await DefaultAssetBundle.of(Get.context!) + .loadString("assets/rustpush/uti-map.json"); final utiMap = jsonDecode(data); var att = Attachment( isOutgoing: true, @@ -1205,7 +1575,9 @@ class RustPushBackend implements BackendService { if (event.attachment != null) { Logger.info("upload finish"); attachment = event.attachment; - att.metadata = {"rustpush": await api.saveAttachment(att: attachment!)}; + att.metadata = { + "rustpush": await api.saveAttachment(att: attachment!) + }; } else { Logger.info("upload progress ${event.prog} of ${event.total}"); } @@ -1219,13 +1591,17 @@ class RustPushBackend implements BackendService { message: api.Message.react(api.ReactMessage( toUuid: isMeta ? old.guid! : old.amkSessionId!, toText: notifText ?? "", - embeddedProfile: await pushService.getShareProfileMessageFor(chat.participants), + embeddedProfile: + await pushService.getShareProfileMessageFor(chat.participants), reaction: api.ReactMessageType.extension_( spec: pushService.dataToApp(newData), body: api.MessageParts(field0: [ - api.IndexedMessagePart(part_: api.MessagePart.object(newData.appData![0].ldText ?? "")), + api.IndexedMessagePart( + part_: api.MessagePart.object( + newData.appData![0].ldText ?? "")), if (attachment != null) - api.IndexedMessagePart(part_: api.MessagePart.attachment(attachment)), + api.IndexedMessagePart( + part_: api.MessagePart.attachment(attachment)), ]), isMeta: isMeta, )))); @@ -1239,11 +1615,19 @@ class RustPushBackend implements BackendService { var msg = await api.newMsg( sender: await msgObj.chat.target!.ensureHandle(), conversation: await msgObj.chat.target!.getConversationData(), - message: api.Message.unsend(api.UnsendMessage(tuuid: msgObj.guid!, editPart: part.part))); + message: api.Message.unsend( + api.UnsendMessage(tuuid: msgObj.guid!, editPart: part.part))); await sendMsg(msg); - if (msgObj.ckRecordId != null) { - await api.saveMessages(cloudMessagesClient: pushService.state!.icloudServices!.cloudMessagesClient!, messages: {msgObj.ckRecordId!: msgObj.toCloud(true)}); + if (CloudKitWriterOwnership.legacyMutationsEnabled && + msgObj.ckRecordId != null) { + await pushService._runLegacyCloudKitOperation( + () => api.saveMessages( + cloudMessagesClient: + pushService.state!.icloudServices!.cloudMessagesClient!, + messages: {msgObj.ckRecordId!: msgObj.toCloud(true)}, + ), + ); } return await pushService.reflectMessageDyn(msg); @@ -1291,23 +1675,28 @@ class RustPushBackend implements BackendService { @override Future downloadLivePhoto(Attachment attachment, String target, - {void Function(int p1, int p2)? onReceiveProgress, CancelToken? cancelToken}) async { - var rustAttachment = api.restoreAttachment(data: attachment.metadata!["myIris"]); + {void Function(int p1, int p2)? onReceiveProgress, + CancelToken? cancelToken}) async { + var rustAttachment = + api.restoreAttachment(data: attachment.metadata!["myIris"]); var filePath = "${attachment.directory}/$target"; - if (!canonicalize(filePath).startsWith(canonicalize(attachment.directory))) { + if (!canonicalize(filePath) + .startsWith(canonicalize(attachment.directory))) { throw Exception("Path traversal detected, are we under attack??"); } - var stream = api.downloadAttachment(aps: pushService.state!.conn, attachment: rustAttachment, path: filePath); + var stream = api.downloadAttachment( + aps: pushService.state!.conn, + attachment: rustAttachment, + path: filePath); await for (final event in stream) { if (onReceiveProgress != null) { onReceiveProgress(event.prog, event.total); } } final file = PlatformFile( - name: target, - size: await rustAttachment.getSize(), - path: "${attachment.directory}/$target" - ); + name: target, + size: await rustAttachment.getSize(), + path: "${attachment.directory}/$target"); await as.saveToDisk(file); return true; @@ -1327,41 +1716,145 @@ class RustPushBackend implements BackendService { void startedTyping(Chat c, [iMessageAppData? appdata]) async { if (c.isRpSms) return; var msg = await api.newMsg( - conversation: await c.getConversationData(), - sender: await c.ensureHandle(), - message: api.Message.typing(true, appdata?.appIcon != null ? api.TypingApp( - bundleId: appdata!.bundleId, - icon: base64Decode(appdata.appIcon!), - ) : null) - ); - await sendMsg(msg, waitForResource: false); // a typing indicator is worthless by the time we reconnect + conversation: await c.getConversationData(), + sender: await c.ensureHandle(), + message: api.Message.typing( + true, + appdata?.appIcon != null + ? api.TypingApp( + bundleId: appdata!.bundleId, + icon: base64Decode(appdata.appIcon!), + ) + : null)); + await sendMsg(msg, + waitForResource: + false); // a typing indicator is worthless by the time we reconnect } @override void stoppedTyping(Chat c) async { if (c.isRpSms) return; var msg = await api.newMsg( - conversation: await c.getConversationData(), - sender: await c.ensureHandle(), - message: const api.Message.typing(false) - ); + conversation: await c.getConversationData(), + sender: await c.ensureHandle(), + message: const api.Message.typing(false)); await sendMsg(msg, waitForResource: false); } @override - void updateTypingStatus(Chat c) { } + void updateTypingStatus(Chat c) {} @override Future handleiMessageState(String address) async { var handle = await getDefaultHandle(); var formatted = await RustPushBBUtils.formatAndAddPrefix(address); - List available = await pushService.doValidateTargets([formatted], handle); + List available = + await pushService.doValidateTargets([formatted], handle); return available.isNotEmpty; } - } class RustPushService extends GetxService { + final Rx appleNetworkHealth = + AppleNetworkHealth.unknown.obs; + final RxnString appleNetworkDetail = RxnString(); + final RxnInt applePushPort = RxnInt(); + StreamSubscription>? _networkSubscription; + Timer? _networkRefreshTimer; + DateTime? _lastNetworkWarning; + int _networkRefreshGeneration = 0; + + void _watchNetworkChanges() { + _networkSubscription ??= + Connectivity().onConnectivityChanged.listen((results) { + if (results.contains(ConnectivityResult.none)) { + _networkRefreshGeneration++; + appleNetworkHealth.value = AppleNetworkHealth.offline; + appleNetworkDetail.value = "No internet connection"; + applePushPort.value = null; + return; + } + + _networkRefreshTimer?.cancel(); + final generation = ++_networkRefreshGeneration; + _networkRefreshTimer = Timer(const Duration(milliseconds: 750), () { + unawaited(_refreshAppleNetworkConnection(generation)); + }); + }); + } + + Future _refreshAppleNetworkConnection(int generation) async { + final currentState = state; + if (currentState == null) return; + + appleNetworkHealth.value = AppleNetworkHealth.reconnecting; + appleNetworkDetail.value = "Checking Apple messaging connection..."; + applePushPort.value = null; + try { + await api.refreshApsConnection(aps: currentState.conn); + } catch (e, s) { + Logger.warn("Failed to request Apple Push refresh", error: e, trace: s); + } + + for (var attempt = 0; attempt < 12; attempt++) { + await Future.delayed(const Duration(seconds: 2)); + if (generation != _networkRefreshGeneration || + !identical(state, currentState)) { + return; + } + try { + final status = await api.getApsConnectionStatus(aps: currentState.conn); + _applyAppleNetworkStatus(status); + if (status.state != "reconnecting") return; + } catch (e, s) { + Logger.warn("Failed to read Apple Push status", error: e, trace: s); + } + } + + appleNetworkHealth.value = AppleNetworkHealth.blocked; + appleNetworkDetail.value = + "This network is not allowing a stable Apple messaging connection."; + _warnAboutBlockedAppleNetwork(); + } + + void _applyAppleNetworkStatus(api.ApsConnectionStatus status) { + applePushPort.value = status.activePort; + final health = classifyAppleNetworkHealth(status.state, status.activePort); + appleNetworkHealth.value = health; + switch (health) { + case AppleNetworkHealth.connected: + case AppleNetworkHealth.fallback: + appleNetworkDetail.value = status.activePort == 443 + ? "Connected through TCP 443 fallback" + : null; + return; + case AppleNetworkHealth.reconnecting: + appleNetworkDetail.value = "Reconnecting to Apple messaging..."; + return; + case AppleNetworkHealth.blocked: + appleNetworkDetail.value = + "This network may be blocking Apple messaging. Try cellular or another permitted network."; + _warnAboutBlockedAppleNetwork(); + return; + default: + appleNetworkDetail.value = status.error; + } + } + + void _warnAboutBlockedAppleNetwork() { + if (!ls.isUiThread) return; + final now = DateTime.now(); + if (_lastNetworkWarning != null && + now.difference(_lastNetworkWarning!) < const Duration(minutes: 10)) { + return; + } + _lastNetworkWarning = now; + showSnackbar( + "Apple messaging unavailable", + "This network appears to block the Apple connection. Messages will remain queued. Try cellular or another permitted network.", + ); + } + api.SharedPushState? state; Mixpanel? mixpanel; @@ -1384,8 +1877,7 @@ class RustPushService extends GetxService { return null; } - final device = - await api.getDeviceInfo(config: currentState.osConfig); + final device = await api.getDeviceInfo(config: currentState.osConfig); if (device.name.contains("iPhone") || device.name.contains("iPod") || device.name.contains("iPad")) { @@ -1395,8 +1887,8 @@ class RustPushService extends GetxService { } String relayHealthFingerprint(api.DeviceInfo device) { - final relayHost = ss.prefs.getString("registration-relay-host") ?? - registrationRelayHost; + final relayHost = + ss.prefs.getString("registration-relay-host") ?? registrationRelayHost; final fingerprintSource = "${device.serial}|${ss.settings.iCloudAccount.value}|$relayHost"; return sha256.convert(utf8.encode(fingerprintSource)).toString(); @@ -1429,14 +1921,12 @@ class RustPushService extends GetxService { final fingerprint = relayHealthFingerprint(device); relayHealthAvailable.value = true; - final savedFingerprint = - ss.prefs.getString("relay-health-fingerprint"); + final savedFingerprint = ss.prefs.getString("relay-health-fingerprint"); if (savedFingerprint != fingerprint) { await clearRelayHealthState(); relayHealthAvailable.value = true; _relayHealthFingerprint = fingerprint; - await ss.prefs.setString( - "relay-health-fingerprint", fingerprint); + await ss.prefs.setString("relay-health-fingerprint", fingerprint); return; } @@ -1481,11 +1971,10 @@ class RustPushService extends GetxService { api.DeviceInfo? relayDevice; try { - relayDevice = await getUserManagedIPhoneRelayDevice( - fromState: currentState); + relayDevice = + await getUserManagedIPhoneRelayDevice(fromState: currentState); } catch (e, s) { - Logger.warn("Failed to identify iPhone relay", - error: e, trace: s); + Logger.warn("Failed to identify iPhone relay", error: e, trace: s); return null; } if (relayDevice == null) { @@ -1498,38 +1987,34 @@ class RustPushService extends GetxService { await clearRelayHealthState(); relayHealthAvailable.value = true; _relayHealthFingerprint = fingerprint; - await ss.prefs.setString( - "relay-health-fingerprint", fingerprint); + await ss.prefs.setString("relay-health-fingerprint", fingerprint); } relayHealthChecking.value = true; final checkedAt = DateTime.now(); relayLastChecked.value = checkedAt; - await ss.prefs.setInt( - "relay-health-last-checked", checkedAt.millisecondsSinceEpoch); + await ss.prefs + .setInt("relay-health-last-checked", checkedAt.millisecondsSinceEpoch); try { final relayCode = await api.validateRelay(configRef: currentState.osConfig); var reachable = false; if (relayCode != null) { - final relayHost = - ss.prefs.getString("registration-relay-host") ?? - registrationRelayHost; + final relayHost = ss.prefs.getString("registration-relay-host") ?? + registrationRelayHost; final response = await http.dio.post( "$relayHost/api/v1/bridge/get-version-info", data: {}, options: Options( headers: { - "X-Beeper-Access-Token": - registrationRelayAccessToken, + "X-Beeper-Access-Token": registrationRelayAccessToken, "Authorization": "Bearer $relayCode", }, ), ); final responseData = response.data; - final versions = - responseData is Map ? responseData["versions"] : null; + final versions = responseData is Map ? responseData["versions"] : null; reachable = response.statusCode == 200 && versions is Map && versions["software_name"] == "iPhone OS"; @@ -1542,6 +2027,20 @@ class RustPushService extends GetxService { relayLastSuccess.value = checkedAt; await ss.prefs.setInt( "relay-health-last-success", checkedAt.millisecondsSinceEpoch); + + // A successful manual probe is explicit evidence that the relay has + // returned. Wake a failed IDS registration immediately instead of + // leaving it asleep in the ten-minute resource backoff. + try { + final registrationState = + await api.getRegstate(state: currentState.client); + if (registrationState is api.RegisterState_Failed) { + await api.doReregister(state: currentState.client); + } + } catch (e, s) { + Logger.warn("Relay reachable but registration retry failed", + error: e, trace: s); + } } return reachable; @@ -1555,8 +2054,7 @@ class RustPushService extends GetxService { } } - Future scheduleRelayHealthReminder( - int secondsUntilRenewal) async { + Future scheduleRelayHealthReminder(int secondsUntilRenewal) async { await _relayReminderLock.synchronized(() async { await notif.cancelRelayCheckReminder(); final currentState = state; @@ -1564,14 +2062,11 @@ class RustPushService extends GetxService { return; } try { - if (await getUserManagedIPhoneRelayDevice( - fromState: currentState) == + if (await getUserManagedIPhoneRelayDevice(fromState: currentState) == null) { return; } - if ((await api.getMyPhoneHandles( - state: currentState.client)) - .isEmpty) { + if ((await api.getMyPhoneHandles(state: currentState.client)).isEmpty) { return; } } catch (e, s) { @@ -1592,19 +2087,22 @@ class RustPushService extends GetxService { } Future cancelRelayHealthReminder() async { - await _relayReminderLock.synchronized( - () => notif.cancelRelayCheckReminder()); + await _relayReminderLock + .synchronized(() => notif.cancelRelayCheckReminder()); } Map attachments = {}; - Future> doValidateTargets(List targets, String handle) async { + Future> doValidateTargets( + List targets, String handle) async { List available; try { - available = await api.validateTargets(state: pushService.state!.client, targets: targets, sender: handle); + available = await api.validateTargets( + state: pushService.state!.client, targets: targets, sender: handle); } catch (e) { if (e is AnyhowException) { - if (e.message.contains("Failed to generate resource") && e.message.contains("not retrying")) { + if (e.message.contains("Failed to generate resource") && + e.message.contains("not retrying")) { pushService.markFailedToLogin(); } } @@ -1615,34 +2113,36 @@ class RustPushService extends GetxService { StickerData stickerFromDart(api.PartExtension_Sticker ext) { return StickerData( - msgWidth: ext.msgWidth, - rotation: ext.rotation, - sai: ext.sai.toInt(), - scale: ext.scale, - update: ext.update, - sli: ext.sli.toInt(), - normalizedX: ext.normalizedX, - normalizedY: ext.normalizedY, - version: ext.version.toInt(), - hash: ext.hash, - safi: ext.safi.toInt(), - effectType: ext.effectType, - stickerId: ext.stickerId - ); - } - - Future updateChatParticipants(Chat c, api.MessageInst myMsg, List oldParticipants, List newParticipants) async { + msgWidth: ext.msgWidth, + rotation: ext.rotation, + sai: ext.sai.toInt(), + scale: ext.scale, + update: ext.update, + sli: ext.sli.toInt(), + normalizedX: ext.normalizedX, + normalizedY: ext.normalizedY, + version: ext.version.toInt(), + hash: ext.hash, + safi: ext.safi.toInt(), + effectType: ext.effectType, + stickerId: ext.stickerId); + } + + Future updateChatParticipants(Chat c, api.MessageInst myMsg, + List oldParticipants, List newParticipants) async { final sender = myMsg.sender; if (sender == null || sender.isEmpty) { Logger.warn("Ignoring participant update without a sender"); return; } var myHandles = await api.getHandles(state: pushService.state!.client); - var newP = newParticipants.filter((p) => !oldParticipants.contains(p) && !myHandles.contains(p)); + var newP = newParticipants + .filter((p) => !oldParticipants.contains(p) && !myHandles.contains(p)); var delP = oldParticipants.filter((p) => !newParticipants.contains(p)); if (newP.isEmpty && delP.isEmpty) return; // nothing to do c.handles.clear(); - var (_, participantHandles) = await RustPushBBUtils.rustParticipantsToBB(newParticipants); + var (_, participantHandles) = + await RustPushBBUtils.rustParticipantsToBB(newParticipants); c.handles.addAll(participantHandles); c.handles.applyToDb(); c.handlesChanged(); @@ -1654,45 +2154,38 @@ class RustPushService extends GetxService { for (var item in newP) { var bb = RustPushBBUtils.rustHandleToBB(item); var msg = Message( - guid: useId ? myMsg.id : uuid.v4(), - isFromMe: myHandles.contains(sender), - handleId: RustPushBBUtils.rustHandleToBB(sender).originalROWID!, - dateCreated: DateTime.fromMillisecondsSinceEpoch(myMsg.sentTimestamp), - itemType: 1, - groupActionType: 0, - otherHandle: bb.originalROWID - ); + guid: useId ? myMsg.id : uuid.v4(), + isFromMe: myHandles.contains(sender), + handleId: RustPushBBUtils.rustHandleToBB(sender).originalROWID!, + dateCreated: DateTime.fromMillisecondsSinceEpoch(myMsg.sentTimestamp), + itemType: 1, + groupActionType: 0, + otherHandle: bb.originalROWID); - inq.queue(IncomingItem( - chat: c, - message: msg, - type: QueueType.newMessage - )); + inq.queue( + IncomingItem(chat: c, message: msg, type: QueueType.newMessage)); } for (var item in delP) { var bb = RustPushBBUtils.rustHandleToBB(item); var personDidLeave = item == sender; var msg = Message( - guid: useId ? myMsg.id : uuid.v4(), - isFromMe: myHandles.contains(sender), - handleId: RustPushBBUtils.rustHandleToBB(sender).originalROWID!, - dateCreated: DateTime.fromMillisecondsSinceEpoch(myMsg.sentTimestamp), - itemType: personDidLeave ? 3 : 1, - groupActionType: personDidLeave ? 0 : 1, - otherHandle: bb.originalROWID - ); + guid: useId ? myMsg.id : uuid.v4(), + isFromMe: myHandles.contains(sender), + handleId: RustPushBBUtils.rustHandleToBB(sender).originalROWID!, + dateCreated: DateTime.fromMillisecondsSinceEpoch(myMsg.sentTimestamp), + itemType: personDidLeave ? 3 : 1, + groupActionType: personDidLeave ? 0 : 1, + otherHandle: bb.originalROWID); - inq.queue(IncomingItem( - chat: c, - message: msg, - type: QueueType.newMessage - )); + inq.queue( + IncomingItem(chat: c, message: msg, type: QueueType.newMessage)); } } - Future<(AttributedBody, String, List)> indexedPartsToAttributedBodyDyn( - List parts, String msgId, AttributedBody? existingBody) async { + Future<(AttributedBody, String, List)> + indexedPartsToAttributedBodyDyn(List parts, + String msgId, AttributedBody? existingBody) async { var bodyString = ""; List body = existingBody?.runs.copy() ?? []; List attachments = []; @@ -1701,10 +2194,14 @@ class RustPushService extends GetxService { for (var indexedParts in parts) { index += 1; var part = indexedParts.part_; - var fieldIdx = indexedParts.idx ?? body.count((i) => i.attributes?.attachmentGuid != null); // only count attachments increment parts by default + var fieldIdx = indexedParts.idx ?? + body.count((i) => + i.attributes?.attachmentGuid != + null); // only count attachments increment parts by default // remove old elements if (!addedIndicies.contains(fieldIdx)) { - body.removeWhere((element) => element.attributes?.messagePart == fieldIdx); + body.removeWhere( + (element) => element.attributes?.messagePart == fieldIdx); addedIndicies.add(fieldIdx); } if (part is api.MessagePart_Text) { @@ -1727,25 +2224,21 @@ class RustPushService extends GetxService { textEffect = invertedEffectMap[effect.field0]; } body.add(Run( - range: [bodyString.length, part.field0.length], - attributes: Attributes( - messagePart: fieldIdx, - textEffect: textEffect, - bold: flags?.bold, - italic: flags?.italic, - strikethrough: flags?.strikethrough, - underline: flags?.underline, - ) - )); + range: [bodyString.length, part.field0.length], + attributes: Attributes( + messagePart: fieldIdx, + textEffect: textEffect, + bold: flags?.bold, + italic: flags?.italic, + strikethrough: flags?.strikethrough, + underline: flags?.underline, + ))); bodyString += part.field0; } else if (part is api.MessagePart_Mention) { body.add(Run( - range: [bodyString.length, part.field1.length], - attributes: Attributes( - messagePart: fieldIdx, - mention: part.field0 - ) - )); + range: [bodyString.length, part.field1.length], + attributes: + Attributes(messagePart: fieldIdx, mention: part.field0))); bodyString += part.field1; } else if (part is api.MessagePart_Attachment) { if (part.field0.iris) { @@ -1764,122 +2257,140 @@ class RustPushService extends GetxService { } StickerData? stickerData; - if (indexedParts.ext != null && indexedParts.ext is api.PartExtension_Sticker) { + if (indexedParts.ext != null && + indexedParts.ext is api.PartExtension_Sticker) { var ext = indexedParts.ext! as api.PartExtension_Sticker; stickerData = stickerFromDart(ext); } - + var myUuid = "${msgId}_$fieldIdx"; attachments.add(Attachment( guid: myUuid, uti: part.field0.utiType, mimeType: part.field0.mime, isOutgoing: false, - transferName: part.field0.name.replaceAll(RegExp(r'/'), "_").replaceAll(RegExp(r'\\'), "_"), + transferName: part.field0.name + .replaceAll(RegExp(r'/'), "_") + .replaceAll(RegExp(r'\\'), "_"), totalBytes: await part.field0.getSize(), hasLivePhoto: myIris != null, - metadata: {"rustpush": await api.saveAttachment(att: part.field0), "myIris": myIris != null ? await api.saveAttachment(att: myIris) : null}, + metadata: { + "rustpush": await api.saveAttachment(att: part.field0), + "myIris": + myIris != null ? await api.saveAttachment(att: myIris) : null + }, )); body.add(Run( - range: [bodyString.length, 1], - attributes: Attributes( - attachmentGuid: myUuid, - messagePart: body.length, - stickerData: stickerData, - ) - )); + range: [bodyString.length, 1], + attributes: Attributes( + attachmentGuid: myUuid, + messagePart: body.length, + stickerData: stickerData, + ))); bodyString += " "; } } - return (AttributedBody(string: bodyString, runs: body), bodyString, attachments); + return ( + AttributedBody(string: bodyString, runs: body), + bodyString, + attachments + ); } api.ExtensionApp dataToApp(PayloadData data) { var appData = data.appData!.first; return api.ExtensionApp( - name: appData.appName!, - appId: appData.appId, - bundleId: appData.bundleId, - balloon: api.Balloon( - icon: appData.appIcon != null && appData.appIcon!.length < 100000 ? base64Decode(appData.appIcon!) : null, - url: appData.url!, - session: appData.session, - ldText: appData.ldText, - isLive: appData.isLive ?? false, - layout: appData.userInfo != null ? api.BalloonLayout.templateLayout( - imageSubtitle: appData.userInfo!.imageSubtitle ?? "", - imageTitle: appData.userInfo!.imageTitle ?? "", - caption: appData.userInfo!.caption ?? "", - secondarySubcaption: appData.userInfo!.secondarySubcaption ?? "", - tertiarySubcaption: appData.userInfo!.tertiarySubcaption ?? "", - subcaption: appData.userInfo!.subcaption ?? "", - class_: api.NSDictionaryClass.nsDictionary, - ) : null, - ) - ); + name: appData.appName!, + appId: appData.appId, + bundleId: appData.bundleId, + balloon: api.Balloon( + icon: appData.appIcon != null && appData.appIcon!.length < 100000 + ? base64Decode(appData.appIcon!) + : null, + url: appData.url!, + session: appData.session, + ldText: appData.ldText, + isLive: appData.isLive ?? false, + layout: appData.userInfo != null + ? api.BalloonLayout.templateLayout( + imageSubtitle: appData.userInfo!.imageSubtitle ?? "", + imageTitle: appData.userInfo!.imageTitle ?? "", + caption: appData.userInfo!.caption ?? "", + secondarySubcaption: + appData.userInfo!.secondarySubcaption ?? "", + tertiarySubcaption: + appData.userInfo!.tertiarySubcaption ?? "", + subcaption: appData.userInfo!.subcaption ?? "", + class_: api.NSDictionaryClass.nsDictionary, + ) + : null, + )); } PayloadData appToData(api.ExtensionApp app) { var layout = app.balloon!.layout as api.BalloonLayout_TemplateLayout?; return PayloadData( - type: constants.PayloadType.app, - urlData: null, - appData: [ - iMessageAppData( - appName: app.name, - ldText: app.balloon?.ldText, - url: app.balloon?.url, - session: app.balloon?.session, - appIcon: app.balloon?.icon != null ? base64Encode(app.balloon!.icon!) : null, - appId: app.appId, - isLive: app.balloon?.isLive ?? false, - userInfo: layout != null ? UserInfo( - imageSubtitle: layout.imageSubtitle, - imageTitle: layout.imageTitle, - caption: layout.caption, - secondarySubcaption: layout.secondarySubcaption, - subcaption: layout.subcaption, - tertiarySubcaption: layout.tertiarySubcaption, - ) : null, - ) - ] - ); + type: constants.PayloadType.app, + urlData: null, + appData: [ + iMessageAppData( + appName: app.name, + ldText: app.balloon?.ldText, + url: app.balloon?.url, + session: app.balloon?.session, + appIcon: app.balloon?.icon != null + ? base64Encode(app.balloon!.icon!) + : null, + appId: app.appId, + isLive: app.balloon?.isLive ?? false, + userInfo: layout != null + ? UserInfo( + imageSubtitle: layout.imageSubtitle, + imageTitle: layout.imageTitle, + caption: layout.caption, + secondarySubcaption: layout.secondarySubcaption, + subcaption: layout.subcaption, + tertiarySubcaption: layout.tertiarySubcaption, + ) + : null, + ) + ]); } MediaMetadata? rpToMedia(api.LPImageMetadata? imagemeta) { if (imagemeta == null) return null; - var data = Size(double.parse(imagemeta.size.split(",").first.toString().numericOnly()), double.parse(imagemeta.size.split(",").last.toString().numericOnly())); - return MediaMetadata( - size: data, - url: imagemeta.url.relative - ); + var data = Size( + double.parse(imagemeta.size.split(",").first.toString().numericOnly()), + double.parse(imagemeta.size.split(",").last.toString().numericOnly())); + return MediaMetadata(size: data, url: imagemeta.url.relative); } MediaMetadata? rpIToMedia(api.LPIconMetadata? imagemeta) { if (imagemeta == null) return null; - return MediaMetadata( - size: null, - url: imagemeta.url.relative - ); + return MediaMetadata(size: null, url: imagemeta.url.relative); } String linkToBalloonBundleId(api.LinkMeta link) { - if (link.data.specialization2 is api.LPSpecializationMetadata_LPPasswordsInviteMetadata) { + if (link.data.specialization2 + is api.LPSpecializationMetadata_LPPasswordsInviteMetadata) { return "com.openbubbles.passwords"; } return "com.apple.messages.URLBalloonProvider"; } PayloadData linkToData(api.LinkMeta link) { - if (link.data.specialization2 is api.LPSpecializationMetadata_LPPasswordsInviteMetadata) { - var data = link.data.specialization2 as api.LPSpecializationMetadata_LPPasswordsInviteMetadata; + if (link.data.specialization2 + is api.LPSpecializationMetadata_LPPasswordsInviteMetadata) { + var data = link.data.specialization2 + as api.LPSpecializationMetadata_LPPasswordsInviteMetadata; return PayloadData( type: constants.PayloadType.app, urlData: null, appData: [ iMessageAppData( appName: "Shared Passwords", - ldText: "You have been invited to join the group “${data.groupName}”.", + ldText: + "You have been invited to join the group “${data.groupName}”.", url: data.urlParameters, ) ], @@ -1911,13 +2422,15 @@ class RustPushService extends GetxService { var msgObj = Message.findOne(guid: myMsg.id)!; msgObj.wasDeliveredQuietly = false; Logger.info("Got notify anyways message"); - MessageHelper.handleNotification(msgObj, msgObj.chat.target!, findExisting: false, notifyAnyways: true); + MessageHelper.handleNotification(msgObj, msgObj.chat.target!, + findExisting: false, notifyAnyways: true); return msgObj; } else if (myMsg.message is api.Message_Message) { var innerMsg = myMsg.message as api.Message_Message; - var attributedBodyData = await indexedPartsToAttributedBodyDyn(innerMsg.field0.parts.field0, myMsg.id, null); + var attributedBodyData = await indexedPartsToAttributedBodyDyn( + innerMsg.field0.parts.field0, myMsg.id, null); var sender = myMsg.sender; - + bool hasBeenForwarded = false; var staging = false; var tempGuid = "temp-${randomString(8)}"; @@ -1927,7 +2440,8 @@ class RustPushService extends GetxService { sender = smsServ.fromHandle; } staging = myHandles.contains(sender); - var myPhoneHandles = await api.getMyPhoneHandles(state: pushService.state!.client); + var myPhoneHandles = + await api.getMyPhoneHandles(state: pushService.state!.client); if (!myPhoneHandles.contains(smsServ.usingNumber)) { // this is a forwarded message from someone else hasBeenForwarded = true; @@ -1947,7 +2461,9 @@ class RustPushService extends GetxService { isFromMe: myHandles.contains(sender), handle: RustPushBBUtils.rustHandleToBB(sender!), dateCreated: DateTime.fromMillisecondsSinceEpoch(myMsg.sentTimestamp), - dateScheduled: innerMsg.field0.scheduled != null ? DateTime.fromMillisecondsSinceEpoch(innerMsg.field0.scheduled!.ms) : null, + dateScheduled: innerMsg.field0.scheduled != null + ? DateTime.fromMillisecondsSinceEpoch(innerMsg.field0.scheduled!.ms) + : null, subject: innerMsg.field0.subject, threadOriginatorPart: innerMsg.field0.replyPart?.toString(), threadOriginatorGuid: innerMsg.field0.replyGuid, @@ -1955,8 +2471,16 @@ class RustPushService extends GetxService { attributedBody: [attributedBodyData.$1], attachments: attributedBodyData.$3, hasAttachments: attributedBodyData.$3.isNotEmpty, - balloonBundleId: innerMsg.field0.app?.balloon != null ? innerMsg.field0.app?.bundleId : innerMsg.field0.linkMeta != null ? linkToBalloonBundleId(innerMsg.field0.linkMeta!) : null, - payloadData: innerMsg.field0.app?.balloon != null ? appToData(innerMsg.field0.app!) : innerMsg.field0.linkMeta != null ? linkToData(innerMsg.field0.linkMeta!) : null, + balloonBundleId: innerMsg.field0.app?.balloon != null + ? innerMsg.field0.app?.bundleId + : innerMsg.field0.linkMeta != null + ? linkToBalloonBundleId(innerMsg.field0.linkMeta!) + : null, + payloadData: innerMsg.field0.app?.balloon != null + ? appToData(innerMsg.field0.app!) + : innerMsg.field0.linkMeta != null + ? linkToData(innerMsg.field0.linkMeta!) + : null, amkSessionId: innerMsg.field0.app?.balloon != null ? myMsg.id : null, verificationFailed: myMsg.verificationFailed, hasApplePayloadData: innerMsg.field0.app?.balloon != null, @@ -1970,11 +2494,14 @@ class RustPushService extends GetxService { } else if (myMsg.message is api.Message_RenameMessage) { var msg = myMsg.message as api.Message_RenameMessage; final sender = myMsg.sender; - if (myMsg.verificationFailed || chat == null || sender == null || sender.isEmpty) return null; + if (myMsg.verificationFailed || + chat == null || + sender == null || + sender.isEmpty) return null; chat.ckSyncState = false; chat.save(updateCkSyncState: true); - + return Message( guid: myMsg.id, isFromMe: myHandles.contains(sender), @@ -1987,8 +2514,12 @@ class RustPushService extends GetxService { } else if (myMsg.message is api.Message_ChangeParticipants) { var msg = myMsg.message as api.Message_ChangeParticipants; final conversation = myMsg.conversation; - if (myMsg.verificationFailed || chat == null || conversation == null || myMsg.sender == null) return null; - await updateChatParticipants(chat, myMsg, conversation.participants, msg.field0.newParticipants); + if (myMsg.verificationFailed || + chat == null || + conversation == null || + myMsg.sender == null) return null; + await updateChatParticipants( + chat, myMsg, conversation.participants, msg.field0.newParticipants); chat.groupVersion = msg.field0.groupVersion; chat.ckSyncState = false; chat.save(updateGroupVersion: true, updateCkSyncState: true); @@ -1997,22 +2528,29 @@ class RustPushService extends GetxService { var innerMsg = myMsg.message as api.Message_IconChange; final sender = myMsg.sender; if (chat == null || sender == null || sender.isEmpty) return null; - if (!chat.lockChatIcon && (chat.groupVersion ?? 0) < innerMsg.field0.groupVersion) { + if (!chat.lockChatIcon && + (chat.groupVersion ?? 0) < innerMsg.field0.groupVersion) { var file = innerMsg.field0.file; chat.groupVersion = innerMsg.field0.groupVersion; chat.ckSyncState = false; if (file != null) { var path = chat.getIconPath(file.size); - var stream = api.downloadMmcs(aps: pushService.state!.conn, attachment: file, path: path); + var stream = api.downloadMmcs( + aps: pushService.state!.conn, attachment: file, path: path); await for (final event in stream) { - Logger.info("Downloaded attachment ${event.prog} bytes of ${event.total}"); + Logger.info( + "Downloaded attachment ${event.prog} bytes of ${event.total}"); } chat.customAvatarPath = path; } else { chat.removeProfilePhoto(); } chat.updateAttachmentGuid(myMsg.id); - chat.save(updateCustomAvatarPath: true, updateGroupVersion: true, updateCkSyncState: true, updateAttachmentGuid: true); + chat.save( + updateCustomAvatarPath: true, + updateGroupVersion: true, + updateCkSyncState: true, + updateAttachmentGuid: true); } return Message( guid: myMsg.id, @@ -2030,7 +2568,8 @@ class RustPushService extends GetxService { return null; } if (msg.field0.embeddedProfile != null) { - handleSharedProfile(msg.field0.embeddedProfile!, sender, chat?.participants ?? []); + handleSharedProfile( + msg.field0.embeddedProfile!, sender, chat?.participants ?? []); } String? reaction; @@ -2057,7 +2596,8 @@ class RustPushService extends GetxService { } else if (msgType.reaction is api.Reaction_Sticker) { var sticker = msgType.reaction as api.Reaction_Sticker; app = sticker.spec; - attributedBodyData = await indexedPartsToAttributedBodyDyn(sticker.body.field0, myMsg.id, null); + attributedBodyData = await indexedPartsToAttributedBodyDyn( + sticker.body.field0, myMsg.id, null); reaction = ReactionTypes.STICKERBACK; } if (!msgType.enable) { @@ -2066,7 +2606,8 @@ class RustPushService extends GetxService { } else if (msg.field0.reaction is api.ReactMessageType_Extension) { var msgType = msg.field0.reaction as api.ReactMessageType_Extension; app = msgType.spec; - attributedBodyData = await indexedPartsToAttributedBodyDyn(msgType.body.field0, myMsg.id, null); + attributedBodyData = await indexedPartsToAttributedBodyDyn( + msgType.body.field0, myMsg.id, null); if (msgType.isMeta) { reaction = "meta"; } @@ -2074,15 +2615,17 @@ class RustPushService extends GetxService { // copy over assets reaction = null; - final query = (Database.messages.query(Message_.amkSessionId.equals(msg.field0.toUuid)) - ..order(Message_.dateCreated, flags: Order.descending)) - .build(); + final query = (Database.messages + .query(Message_.amkSessionId.equals(msg.field0.toUuid)) + ..order(Message_.dateCreated, flags: Order.descending)) + .build(); query.limit = 2; final messages = query.find(); query.close(); - final original = messages.firstWhereOrNull((msg) => (msg.stagingGuid ?? msg.guid) != myMsg.id); + final original = messages.firstWhereOrNull( + (msg) => (msg.stagingGuid ?? msg.guid) != myMsg.id); if (original == null) { Logger.warn("Ignoring extension update without a base message"); return null; @@ -2096,14 +2639,22 @@ class RustPushService extends GetxService { associated.associatedMessageGuid = myMsg.id; associated.save(); } - + // allow updating image final originalBody = original.attributedBody.firstOrNull; if (attributedBodyData.$3.isEmpty && originalBody == null) { Logger.warn("Ignoring extension update without message content"); return null; } - attributedBodyData = (attributedBodyData.$3.isEmpty ? originalBody! : attributedBodyData.$1, original.text ?? "", attributedBodyData.$3.isEmpty ? original.dbAttachments : attributedBodyData.$3); + attributedBodyData = ( + attributedBodyData.$3.isEmpty + ? originalBody! + : attributedBodyData.$1, + original.text ?? "", + attributedBodyData.$3.isEmpty + ? original.dbAttachments + : attributedBodyData.$3 + ); var tag = es.getLatest(msg.field0.toUuid); // updates cached value; we are latest if (tag.firstOrNull != myMsg.id) { @@ -2133,12 +2684,14 @@ class RustPushService extends GetxService { associatedMessageType: reaction == "meta" ? null : reaction, associatedMessageEmoji: emoji, text: attributedBodyData?.$2, - attributedBody: attributedBodyData != null ? [attributedBodyData.$1] : [], + attributedBody: + attributedBodyData != null ? [attributedBodyData.$1] : [], attachments: attributedBodyData?.$3 ?? [], hasAttachments: attributedBodyData?.$3.isNotEmpty ?? false, balloonBundleId: app?.bundleId, payloadData: app?.balloon != null ? appToData(app!) : null, - amkSessionId: app?.balloon != null && reaction == null ? msg.field0.toUuid : null, + amkSessionId: + app?.balloon != null && reaction == null ? msg.field0.toUuid : null, verificationFailed: myMsg.verificationFailed, hasApplePayloadData: app?.balloon != null, ); @@ -2172,10 +2725,13 @@ class RustPushService extends GetxService { } msgObj.verificationFailed = myMsg.verificationFailed; - + var attributedBodyDataInclusive = await indexedPartsToAttributedBodyDyn( - msg.field0.newParts.field0, myMsg.id, msgObj.attributedBody.firstOrNull); - var attributedBodyEdited = await indexedPartsToAttributedBodyDyn(msg.field0.newParts.field0, myMsg.id, null); + msg.field0.newParts.field0, + myMsg.id, + msgObj.attributedBody.firstOrNull); + var attributedBodyEdited = await indexedPartsToAttributedBodyDyn( + msg.field0.newParts.field0, myMsg.id, null); msgObj.text = attributedBodyDataInclusive.$2; msgObj.dateEdited = DateTime.now(); @@ -2192,18 +2748,15 @@ class RustPushService extends GetxService { if (contentMap[msg.field0.editPart.toString()] == null) { contentMap[msg.field0.editPart.toString()] = [ EditedContent( - date: (msgObj.dateCreated?.millisecondsSinceEpoch ?? 0).toDouble(), - text: Content(values: msgObj.attributedBody) - ) + date: + (msgObj.dateCreated?.millisecondsSinceEpoch ?? 0).toDouble(), + text: Content(values: msgObj.attributedBody)) ]; } - contentMap[msg.field0.editPart.toString()]!.add( - EditedContent( + contentMap[msg.field0.editPart.toString()]!.add(EditedContent( date: myMsg.sentTimestamp.toDouble(), - text: Content(values: [attributedBodyEdited.$1]) - ) - ); + text: Content(values: [attributedBodyEdited.$1]))); msgObj.attributedBody = [attributedBodyDataInclusive.$1]; return msgObj; @@ -2211,7 +2764,8 @@ class RustPushService extends GetxService { throw Exception("bad message type! ${myMsg.message}"); } - File fileForAsset(String path, api.PosterAsset asset, String n, {bool friendly = false}) { + File fileForAsset(String path, api.PosterAsset asset, String n, + {bool friendly = false}) { var name = "${asset.uuid}_$n"; if (friendly) { File f2 = File("$path/${sha256.convert(name.codeUnits).toString()}.png"); @@ -2234,7 +2788,8 @@ class RustPushService extends GetxService { // finds chat for message. Use over `Chat.findByRust` for incoming messages // to handle after conversation changes (renames, participants) - Future chatForMessageInner(api.MessageInst myMsg, {bool routingStub = false}) async { + Future chatForMessageInner(api.MessageInst myMsg, + {bool routingStub = false}) async { // find existing saved message and use that chat if we're getting a replay var existing = Message.findOne(guid: myMsg.id); if (myMsg.message is api.Message_Edit) { @@ -2251,11 +2806,16 @@ class RustPushService extends GetxService { var existing = Message.findOne(guid: myMsg.conversation!.afterGuid!); if (existing?.getChat() != null) { var result = existing!.getChat()!; - if (myMsg.sender == null || result.participants.contains(RustPushBBUtils.rustHandleToBB(myMsg.sender!))) return existing.getChat()!; + if (myMsg.sender == null || + result.participants + .contains(RustPushBBUtils.rustHandleToBB(myMsg.sender!))) { + return existing.getChat()!; + } } } if (myMsg.message is api.Message_RenameMessage) { - var found = (await Chat.findByRust(myMsg.conversation!, getService(myMsg), soft: true)); + var found = (await Chat.findByRust(myMsg.conversation!, getService(myMsg), + soft: true)); if (found == null) { // try using the new name var msg = myMsg.message as api.Message_RenameMessage; @@ -2266,7 +2826,8 @@ class RustPushService extends GetxService { } } if (myMsg.message is api.Message_ChangeParticipants) { - var found = (await Chat.findByRust(myMsg.conversation!, getService(myMsg), soft: true)); + var found = (await Chat.findByRust(myMsg.conversation!, getService(myMsg), + soft: true)); if (found == null) { // try using the new participants var msg = myMsg.message as api.Message_ChangeParticipants; @@ -2284,29 +2845,34 @@ class RustPushService extends GetxService { myMsg.conversation?.participants.remove(service.usingNumber); } } - return (await Chat.findByRust(myMsg.conversation!, getService(myMsg), routingStub: routingStub))!; + return (await Chat.findByRust(myMsg.conversation!, getService(myMsg), + routingStub: routingStub))!; } Future chatForMessage(api.MessageInst myMsg) async { var routingStub = false; if (myMsg.message is api.Message_Message) { - var message = myMsg.message as api.Message_Message; - var service = message.field0.service; - var myNumbers = await api.getMyPhoneHandles(state: pushService.state!.client); - if (service is api.MessageType_SMS) { - if (myNumbers.contains(service.usingNumber)) { - routingStub = true; // we are just forwarding this, search for routing stubs - } + var message = myMsg.message as api.Message_Message; + var service = message.field0.service; + var myNumbers = + await api.getMyPhoneHandles(state: pushService.state!.client); + if (service is api.MessageType_SMS) { + if (myNumbers.contains(service.usingNumber)) { + routingStub = + true; // we are just forwarding this, search for routing stubs } } + } var result = await chatForMessageInner(myMsg, routingStub: routingStub); if (myMsg.conversation != null) { // conformance stuff - if (myMsg.conversation!.senderGuid != null && !result.guidRefs.contains(myMsg.conversation!.senderGuid!)) { + if (myMsg.conversation!.senderGuid != null && + !result.guidRefs.contains(myMsg.conversation!.senderGuid!)) { result.guidRefs.add(myMsg.conversation!.senderGuid!); result.save(updateGuidRefs: true); } - var (mine, _) = await RustPushBBUtils.rustParticipantsToBB(myMsg.conversation!.participants); + var (mine, _) = await RustPushBBUtils.rustParticipantsToBB( + myMsg.conversation!.participants); if (mine.isNotEmpty && !mine.contains(result.usingHandle)) { result.usingHandle = mine[0]; result.save(updateUsingHandle: true); @@ -2316,7 +2882,8 @@ class RustPushService extends GetxService { var service = message.field0.service; if (service is api.MessageType_SMS) { if (service.usingNumber != result.usingHandle) { - Logger.info("Mismatch between chat handle ${result.usingHandle} and incoming handle ${service.usingNumber}, updating chat handle!"); + Logger.info( + "Mismatch between chat handle ${result.usingHandle} and incoming handle ${service.usingNumber}, updating chat handle!"); result.usingHandle = service.usingNumber; result.save(updateUsingHandle: true); } @@ -2324,14 +2891,19 @@ class RustPushService extends GetxService { } if (myMsg.message is! api.Message_ChangeParticipants) { var isNormal = myMsg.message is api.Message_Message; - var isSms = isNormal && (myMsg.message as api.Message_Message).field0.service is api.MessageType_SMS; + var isSms = isNormal && + (myMsg.message as api.Message_Message).field0.service + is api.MessageType_SMS; if (!isSms) { var data = await result.getConversationData(); // make sure we are in consensus - await updateChatParticipants(result, myMsg, data.participants, myMsg.conversation!.participants); + await updateChatParticipants(result, myMsg, data.participants, + myMsg.conversation!.participants); } } - if (myMsg.message is! api.Message_RenameMessage && myMsg.conversation!.cvName != null && myMsg.conversation!.cvName != result.apnTitle) { + if (myMsg.message is! api.Message_RenameMessage && + myMsg.conversation!.cvName != null && + myMsg.conversation!.cvName != result.apnTitle) { if (!result.lockChatName) { result.displayName = myMsg.conversation!.cvName; } @@ -2343,7 +2915,8 @@ class RustPushService extends GetxService { var msg = Message( guid: uuid.v4(), isFromMe: myHandles.contains(myMsg.sender), - handleId: RustPushBBUtils.rustHandleToBB(myMsg.sender!).originalROWID!, + handleId: + RustPushBBUtils.rustHandleToBB(myMsg.sender!).originalROWID!, dateCreated: DateTime.fromMillisecondsSinceEpoch(myMsg.sentTimestamp), itemType: 2, groupActionType: 2, @@ -2351,10 +2924,7 @@ class RustPushService extends GetxService { ); inq.queue(IncomingItem( - chat: result, - message: msg, - type: QueueType.newMessage - )); + chat: result, message: msg, type: QueueType.newMessage)); } } if (result.dateDeleted != null) { @@ -2365,11 +2935,14 @@ class RustPushService extends GetxService { } Future markFailed(Message mistakeFor, String error) async { - if (mistakeFor.guid != null && !mistakeFor.guid!.contains("temp") && !mistakeFor.guid!.contains("error")) { + if (mistakeFor.guid != null && + !mistakeFor.guid!.contains("temp") && + !mistakeFor.guid!.contains("error")) { mistakeFor.stagingGuid = mistakeFor.guid; } mistakeFor.generateTempGuid(); - mistakeFor.guid = mistakeFor.guid!.replaceAll("temp", "error-protocol: $error"); + mistakeFor.guid = + mistakeFor.guid!.replaceAll("temp", "error-protocol: $error"); var chat = mistakeFor.chat.target!; if (!ls.isAlive || !(cm.getChatController(chat.guid)?.isAlive ?? false)) { await notif.createFailedToSend(chat); @@ -2378,20 +2951,29 @@ class RustPushService extends GetxService { } Future findOperatedChat(api.OperatedChat chat) async { - var conversation = api.ConversationData(participants: chat.participants.map((p) => p.isEmail ? "mailto:$p" : "tel:$p").toList(), senderGuid: chat.groupId); - return await Chat.findByRust(conversation, chat.guid.startsWith("iMessage") ? "iMessage" : "SMS"); + var conversation = api.ConversationData( + participants: chat.participants + .map((p) => p.isEmail ? "mailto:$p" : "tel:$p") + .toList(), + senderGuid: chat.groupId); + return await Chat.findByRust( + conversation, chat.guid.startsWith("iMessage") ? "iMessage" : "SMS"); } bool isSessionActive(api.FTSession session) { var anHourAgo = DateTime.now().millisecondsSinceEpoch - 3600000; - return session.participants.values.any((value) => value.active != null) && (session.lastRekey ?? session.startTime) != null && (session.lastRekey ?? session.startTime)! > anHourAgo; + return session.participants.values.any((value) => value.active != null) && + (session.lastRekey ?? session.startTime) != null && + (session.lastRekey ?? session.startTime)! > anHourAgo; } - RxList sessions = [].obs; RxList activeSessions = [].obs; Future updateState() async { - var ftSessions = (await api.ftSessions(facetime: pushService.state!.ftClient)).filter((a) => a.startTime != null).toList(); + var ftSessions = + (await api.ftSessions(facetime: pushService.state!.ftClient)) + .filter((a) => a.startTime != null) + .toList(); ftSessions.sort((a, b) { return b.startTime! - a.startTime!; }); @@ -2405,22 +2987,16 @@ class RustPushService extends GetxService { othersessions.add(session); } } - + sessions.value = othersessions; activeSessions.value = activesessions; } - String convertAttachmentGuid(String guid) { - if (guid.startsWith("at")) { - var items = guid.split("_"); - guid = "${items[2]}_${items[1]}"; - } - return guid; - } + String convertAttachmentGuid(String guid) => convertAppleAttachmentGuid(guid); String generateCloudKitId() { final random = Random.secure(); // cryptographically secure RNG - final bytes = Uint8List(32); // 32 bytes + final bytes = Uint8List(32); // 32 bytes for (int i = 0; i < bytes.length; i++) { bytes[i] = random.nextInt(256); // fill with random byte } @@ -2429,45 +3005,183 @@ class RustPushService extends GetxService { bool syncStopDelete = false; - void eraseCloudKitSync() { - if (ss.prefs.getString("chatSyncToken") == null) return; - ss.prefs.remove("chatSyncToken"); - ss.prefs.remove("messageSyncToken"); - ss.prefs.remove("attachmentSyncToken"); - ss.prefs.remove("chatDeletionIds-1"); - ss.prefs.remove("messageDeletionIds-1"); - ss.prefs.remove("attachmentDeletionIds-1"); - var messages = Database.messages.getAll(); - for (var message in messages) { - message.ckRecordId = null; - message.ckSyncState = false; - } - Database.messages.putMany(messages); - var chats = Database.chats.getAll(); - for (var chat in chats) { - chat.ckRecordId = null; - chat.ckSyncState = false; - chat.cloudData = null; - chat.photoAttachmentGuid = null; - } - Database.chats.putMany(chats); - var attachments = Database.attachments.getAll(); - for (var attachment in attachments) { - attachment.ckRecordId = null; + Future queueLegacyCloudKitDeletion({ + required LegacyCloudKitDeletionKind kind, + required String recordId, + }) async { + final deletionStore = LegacyCloudKitDeletionIntentStore( + store: Database.store, + ); + final now = DateTime.now().toUtc(); + try { + if (!CloudKitWriterOwnership.legacyMutationsEnabled) { + deletionStore.quarantineUnscoped( + kind: kind, + recordId: recordId, + reason: 'legacy_writer_disabled', + now: now, + ); + return; + } + final context = await _readLegacyCloudKitDeletionContext(); + if (context == null) { + deletionStore.quarantineUnscoped( + kind: kind, + recordId: recordId, + reason: 'legacy_writer_scope_unavailable', + now: now, + ); + return; + } + deletionStore.enqueue( + context: context, + kind: kind, + recordId: recordId, + now: now, + ); + } catch (error, trace) { + Logger.warn( + 'Legacy CloudKit deletion was quarantined after scope binding failed', + error: error, + trace: trace, + ); + try { + deletionStore.quarantineUnscoped( + kind: kind, + recordId: recordId, + reason: 'legacy_writer_scope_binding_failed', + now: now, + ); + } catch (quarantineError, quarantineTrace) { + Logger.error( + 'Failed to persist legacy CloudKit deletion quarantine', + error: quarantineError, + trace: quarantineTrace, + ); + } } - Database.attachments.putMany(attachments); + } + + Future + _readLegacyCloudKitDeletionContext() async { + final currentState = state; + final client = currentState?.icloudServices?.cloudMessagesClient; + if (client == null || statePath.isEmpty) return null; + + final metadata = await FrbCloudSyncNativeAuthBinding().capture( + cloudMessagesClient: client, + privateStorageDirectory: statePath, + ); + if (!identical(currentState, state) || + !identical(client, state?.icloudServices?.cloudMessagesClient)) { + return null; + } + + final scope = CloudKitWriterScope( + accountFingerprint: metadata.accountFingerprint, + ); + final authority = ObjectBoxCloudKitWriterAuthority(store: Database.store); + final snapshot = authority.read(scope); + if (snapshot == null || + snapshot.owner != CloudKitWriterOwner.legacy || + snapshot.state != CloudKitWriterAuthorityState.stable) { + return null; + } + return LegacyCloudKitDeletionContext( + scope: scope, + writerEpoch: snapshot.epoch, + ); + } + + Future _flushLegacyCloudKitDeletions( + LegacyCloudKitDeletionContext context, + ) async { + final currentState = state; + final client = currentState?.icloudServices?.cloudMessagesClient; + if (client == null) return; + final deletionStore = LegacyCloudKitDeletionIntentStore( + store: Database.store, + ); + + Future flushKind( + LegacyCloudKitDeletionKind kind, + Future Function(List) delete, + ) async { + final intents = deletionStore.pendingForFlush( + scope: context.scope, + writerEpoch: context.writerEpoch, + kind: kind, + ); + if (intents.isEmpty) return; + await delete(intents.map((intent) => intent.recordId).toList()); + deletionStore.confirmFlushed( + context: context, + kind: kind, + intents: intents, + ); + } + + await flushKind( + LegacyCloudKitDeletionKind.message, + (ids) => api.deleteMessages(cloudMessagesClient: client, messages: ids), + ); + await flushKind( + LegacyCloudKitDeletionKind.attachment, + (ids) => api.deleteAttachments( + cloudMessagesClient: client, + attachments: ids, + ), + ); + await flushKind( + LegacyCloudKitDeletionKind.chat, + (ids) => api.deleteChats(cloudMessagesClient: client, chats: ids), + ); + } + + void eraseCloudKitSync() { + if (ss.prefs.getString("chatSyncToken") == null) return; + ss.prefs.remove("chatSyncToken"); + ss.prefs.remove("messageSyncToken"); + ss.prefs.remove("attachmentSyncToken"); + var messages = Database.messages.getAll(); + for (var message in messages) { + message.ckRecordId = null; + message.ckSyncState = false; + } + Database.messages.putMany(messages); + var chats = Database.chats.getAll(); + for (var chat in chats) { + chat.ckRecordId = null; + chat.ckSyncState = false; + chat.cloudData = null; + chat.photoAttachmentGuid = null; + } + Database.chats.putMany(chats); + var attachments = Database.attachments.getAll(); + for (var attachment in attachments) { + attachment.ckRecordId = null; + } + Database.attachments.putMany(attachments); } // forcibly stops a running sync operation. Future resetCloudKitSync() async { - if (isSyncing.value == null) return; - if (kIsDesktop) { - exit(0); + final activeSync = _desktopCloudKitSync; + if (activeSync != null) { + // CloudKit operations are not safely interruptible midway through a + // continuation-token or delete batch. Wait for the single active pass + // instead of terminating the entire desktop application. + Logger.info("Waiting for active desktop CloudKit sync to finish"); + await activeSync; + } else if (isSyncing.value == null) { + return; + } + isSyncing.value = null; + chats.restoring = false; } else { - await mcs.invokeMethod("native-sync-isolate", { - "close": true - }); + if (isSyncing.value == null) return; + await mcs.invokeMethod("native-sync-isolate", {"close": true}); ui.IsolateNameServer.removePortNameMapping("bg_sync"); pushService.isSyncing.value = null; chats.restoring = false; @@ -2475,14 +3189,26 @@ class RustPushService extends GetxService { } Rxn isSyncing = Rxn(null); + Future? _desktopCloudKitSync; + final CloudKitOperationCoordinator _desktopCloudKitOperations = + CloudKitOperationCoordinator(); + Future doCloudKitSync() async { if (kIsDesktop) { - chats.restoring = true; + final activeSync = _desktopCloudKitSync; + if (activeSync != null) { + Logger.info("Joining active desktop CloudKit sync"); + return activeSync; + } + + final operation = _desktopCloudKitOperations.run(_runDesktopCloudKitSync); + _desktopCloudKitSync = operation; try { - await pushService.doCloudKitSyncPrivate(); + await operation; } finally { - pushService.isSyncing.value = null; - chats.restoring = false; + if (identical(_desktopCloudKitSync, operation)) { + _desktopCloudKitSync = null; + } } return; } @@ -2493,7 +3219,7 @@ class RustPushService extends GetxService { } isSyncing.value = "Starting Sync..."; await mcs.invokeMethod("native-sync-isolate"); - + var port = ReceivePort(); port.listen((data) { if (data == null) { @@ -2505,12 +3231,22 @@ class RustPushService extends GetxService { syncing!.send(port.sendPort); } + Future _runDesktopCloudKitSync() async { + chats.restoring = true; + try { + await pushService.doCloudKitSyncPrivate(); + } finally { + pushService.isSyncing.value = null; + chats.restoring = false; + } + } + String formatBytes(int bytes, [int decimals = 2]) { if (bytes <= 0) return "0 B"; const suffixes = ["B", "KB", "MB", "GB", "TB"]; var i = (log(bytes) / log(1024)).floor(); var size = bytes / pow(1024, i); - return "${size.toStringAsFixed(decimals)} ${suffixes[i]}"; + return "${size.toStringAsFixed(decimals)} ${suffixes[i]}"; } (int, DateTime) getCutoffTime() { @@ -2521,23 +3257,54 @@ class RustPushService extends GetxService { var cutoffDateTime = DateTime.fromMillisecondsSinceEpoch(0); var cutoffTime = 0; if (time != 0) { - cutoffTime = RustPushBBUtils.nsSinceAppleEpoch(DateTime.now()) - (time * 1000000); + cutoffTime = + RustPushBBUtils.nsSinceAppleEpoch(DateTime.now()) - (time * 1000000); cutoffDateTime = DateTime.now().subtract(Duration(milliseconds: time)); } return (cutoffTime, cutoffDateTime); } - Future uploadMessages( - List messages, - List<(String, String)> uploadAttachments, - Map idToAttachment, - bool noAttachments, - ) async { - var availableSize = await api.getQuotaInfo(info: pushService.state!.icloudServices!.tokenProvider); + Future uploadMessages( + List messages, + List<(String, String)> uploadAttachments, + Map idToAttachment, + bool noAttachments, + ) { + if (!CloudKitWriterOwnership.legacyMutationsEnabled) { + Logger.warn('Legacy CloudKit upload blocked by restore-only build'); + return Future.value(CloudMessageUploadBatchResult( + confirmedCount: 0, + retryableCount: messages.length, + )); + } + return _runLegacyCloudKitOperation( + () => _uploadMessagesUnlocked( + messages, + uploadAttachments, + idToAttachment, + noAttachments, + ), + ); + } + + Future _uploadMessagesUnlocked( + List messages, + List<(String, String)> uploadAttachments, + Map idToAttachment, + bool noAttachments, + ) async { + var availableSize = await api.getQuotaInfo( + info: pushService.state!.icloudServices!.tokenProvider); Map saveMessages = {}; - var totalSize = 0; + var totalSize = uploadAttachments.fold( + 0, + (total, item) => total + File(item.$1).lengthSync(), + ); + var confirmedCount = 0; + var retryableCount = 0; List newCloudKitIds = []; + Map messageRecordIdByAttachmentRecordId = {}; String createNewCloudKitId() { var id = generateCloudKitId(); @@ -2551,71 +3318,140 @@ class RustPushService extends GetxService { // Logger.info("Processing message $counter of ${messages.length}"); if (message.chat.target?.isRpSms == true) { message.ckSyncState = true; + confirmedCount++; continue; } message.fetchAttachments(); // remember: other invocations + final createdRecordId = message.ckRecordId == null; message.ckRecordId ??= createNewCloudKitId(); - var saveMessageAttachments = !noAttachments || message.attachments.every((a) => a!.ckRecordId != null); + var saveMessageAttachments = !noAttachments || + message.attachments.every((a) => a!.ckRecordId != null); try { - saveMessages[message.ckRecordId!] = message.toCloud(!saveMessageAttachments); + saveMessages[message.ckRecordId!] = + message.toCloud(!saveMessageAttachments); } catch (e, s) { + if (createdRecordId) message.ckRecordId = null; + message.ckSyncState = false; + retryableCount++; Logger.warn("Failure to convert to cloud", error: e, trace: s); continue; - } finally { - message.ckSyncState = true; } if (!noAttachments) { for (var attachment in message.attachments) { - if (!attachment!.getFile().exists() || File(attachment.path).lengthSync() == 0 || attachment.ckRecordId != null) continue; + if (!attachment!.getFile().exists() || + File(attachment.path).lengthSync() == 0 || + attachment.ckRecordId != null) continue; totalSize += File(attachment.path).lengthSync(); attachment.ckRecordId ??= createNewCloudKitId(); uploadAttachments.add((attachment.path, attachment.ckRecordId!)); idToAttachment[attachment.ckRecordId!] = attachment; + messageRecordIdByAttachmentRecordId[attachment.ckRecordId!] = + message.ckRecordId!; } } } // sub 25 mb off the top just for other things - if (totalSize != 0 && totalSize > availableSize.availableBytes - (25 * 1024 * 1024)) { - throw Exception("Not enough space for attachments, needed ${formatBytes(totalSize)}!"); + if (totalSize != 0 && + totalSize > availableSize.availableBytes - (25 * 1024 * 1024)) { + throw Exception( + "Not enough space for attachments, needed ${formatBytes(totalSize)}!"); } Logger.info("Attachment total size $totalSize!"); if (uploadAttachments.isNotEmpty) { + final attemptedAttachmentRecordIds = + uploadAttachments.map((item) => item.$2).toSet(); Map saveAttachments = {}; - var results = await api.uploadCloudAttachments(cloudMessagesClient: pushService.state!.icloudServices!.cloudMessagesClient!, files: uploadAttachments); + var results = await api.uploadCloudAttachments( + cloudMessagesClient: + pushService.state!.icloudServices!.cloudMessagesClient!, + files: uploadAttachments); for (var result in results.entries) { - var attachment = idToAttachment[result.key]!; + var attachment = idToAttachment[result.key]; + if (attachment == null) continue; saveAttachments[attachment.ckRecordId!] = api.CloudAttachment( - cm: api.encodeAttachmentmeta(attachmentmeta: await attachment.getAttachmentMeta()), + cm: api.encodeAttachmentmeta( + attachmentmeta: await attachment.getAttachmentMeta()), lqa: result.value, ); } - var result = await api.saveAttachments(cloudMessagesClient: pushService.state!.icloudServices!.cloudMessagesClient!, attachments: saveAttachments); + final saveResult = saveAttachments.isEmpty + ? {} + : await api.saveAttachments( + cloudMessagesClient: + pushService.state!.icloudServices!.cloudMessagesClient!, + attachments: saveAttachments); + final attachmentOutcome = CloudAttachmentSaveOutcome.fromResponse( + attemptedRecordIds: attemptedAttachmentRecordIds, + response: saveResult, + messageRecordIdByAttachmentRecordId: + messageRecordIdByAttachmentRecordId, + ); - for (var result in result.entries) { - if (result.value) continue; // success - var failedAttachment = idToAttachment.values.firstWhere((c) => c.ckRecordId == result.key); - if (newCloudKitIds.contains(failedAttachment.ckRecordId!)) failedAttachment.ckRecordId = null; + for (final recordId in attachmentOutcome.retryableRecordIds) { + var failedAttachment = idToAttachment[recordId]; + if (failedAttachment == null) continue; + // Every attachment in this batch received its record ID locally before + // upload. Without an explicit CloudKit success it must be retried. + failedAttachment.ckRecordId = null; Logger.warn("Failed to save attachment ${failedAttachment.guid}"); } - for (var result in idToAttachment.values) { - result.save(null); // save ckRecordId + for (final messageRecordId + in attachmentOutcome.retryableMessageRecordIds) { + saveMessages.remove(messageRecordId); + final failedMessage = messages.firstWhereOrNull( + (message) => message.ckRecordId == messageRecordId); + if (failedMessage == null) continue; + if (newCloudKitIds.contains(messageRecordId)) { + failedMessage.ckRecordId = null; + } + failedMessage.ckSyncState = false; + retryableCount++; + } + + for (var attachment in idToAttachment.values) { + attachment.save(null); // save confirmed or cleared ckRecordId } + + // These collections are shared by the caller only to assemble one batch. + // Leaving successful entries in them makes the next message batch upload + // the same bytes and CloudKit records again. + uploadAttachments.clear(); + idToAttachment.clear(); } if (saveMessages.isNotEmpty) { - var result = await api.saveMessages(cloudMessagesClient: pushService.state!.icloudServices!.cloudMessagesClient!, messages: saveMessages); + var result = await api.saveMessages( + cloudMessagesClient: + pushService.state!.icloudServices!.cloudMessagesClient!, + messages: saveMessages); + + final outcome = CloudMessageSaveOutcome.fromResponse( + attemptedRecordIds: saveMessages.keys, + response: result, + ); - for (var result in result.entries) { - if (result.value) continue; // success - var failedMessage = messages.firstWhere((c) => c.ckRecordId == result.key); - if (newCloudKitIds.contains(failedMessage.ckRecordId!)) failedMessage.ckRecordId = null; + for (final recordId in outcome.confirmedRecordIds) { + final savedMessage = + messages.firstWhere((message) => message.ckRecordId == recordId); + savedMessage.ckSyncState = true; + confirmedCount++; + } + + for (final recordId in outcome.retryableRecordIds) { + var failedMessage = + messages.firstWhere((message) => message.ckRecordId == recordId); + if (newCloudKitIds.contains(failedMessage.ckRecordId!)) { + failedMessage.ckRecordId = null; + } + failedMessage.ckSyncState = false; + retryableCount++; Logger.warn("Failed to save message ${failedMessage.guid}"); } } @@ -2624,21 +3460,73 @@ class RustPushService extends GetxService { result.save(); // save ckRecordId getActiveMwc(result.guid!)?.message.ckRecordId = result.ckRecordId; } + + return CloudMessageUploadBatchResult( + confirmedCount: confirmedCount, + retryableCount: retryableCount, + ); } Future uploadAttachment(Message message) async { + if (!CloudKitWriterOwnership.legacyMutationsEnabled) { + showSnackbar( + 'Upload unavailable', + 'Legacy CloudKit uploads are disabled in this safety build.', + ); + return; + } + message = message.guid == null + ? message + : Message.findOne(guid: message.guid!) ?? message; + message.fetchAttachments(); if (message.attachments.every((att) => att!.ckRecordId != null)) { showSnackbar("Success", "Attachment already uploaded"); return; } - await wrapPromise(uploadMessages([message], [], {}, false), "Uploading to iCloud..."); + + Future performUpload() async { + final currentMessage = message.guid == null + ? message + : Message.findOne(guid: message.guid!) ?? message; + currentMessage.fetchAttachments(); + if (currentMessage.attachments.every((att) => att!.ckRecordId != null)) { + return null; + } + return uploadMessages([currentMessage], [], {}, false); + } + + final operation = kIsDesktop + ? _desktopCloudKitOperations.run(performUpload) + : performUpload(); + final result = await wrapPromise(operation, "Uploading to iCloud..."); + if (result == null) { + showSnackbar("Success", "Attachment already uploaded"); + return; + } + if (result.retryableCount > 0) { + showSnackbar("Upload pending", + "iCloud did not confirm the upload. OpenBubbles will retry it."); + return; + } showSnackbar("Success", "Attachment uploaded"); } - Future doCloudKitSyncPrivate() async { + Future doCloudKitSyncPrivate() => + _runLegacyCloudKitOperation(_doCloudKitSyncPrivateUnlocked); + + Future _doCloudKitSyncPrivateUnlocked() async { isSyncing.value = "Syncing Now..."; - var isInClique = await api.isInClique(keychain: pushService.state!.icloudServices!.keychain!); + final deletionStore = LegacyCloudKitDeletionIntentStore( + store: Database.store, + ); + await deletionStore.quarantineLegacySharedPreferenceQueues( + ss.prefs, + now: DateTime.now().toUtc(), + ); + + var isInClique = await api.isInClique( + keychain: pushService.state!.icloudServices!.keychain!); if (!isInClique) { Logger.warn("Skipping sync because we are no longer in the clique!"); ss.settings.cloudSyncingEnabled.value = false; @@ -2646,19 +3534,11 @@ class RustPushService extends GetxService { return; } - if (ss.prefs.getStringList("messageDeletionIds-1")?.isNotEmpty ?? false) { - await api.deleteMessages(cloudMessagesClient: pushService.state!.icloudServices!.cloudMessagesClient!, messages: ss.prefs.getStringList("messageDeletionIds-1")!); - ss.prefs.remove("messageDeletionIds-1"); - } - - if (ss.prefs.getStringList("attachmentDeletionIds-1")?.isNotEmpty ?? false) { - await api.deleteAttachments(cloudMessagesClient: pushService.state!.icloudServices!.cloudMessagesClient!, attachments: ss.prefs.getStringList("attachmentDeletionIds-1")!); - ss.prefs.remove("attachmentDeletionIds-1"); - } - - if (ss.prefs.getStringList("chatDeletionIds-1")?.isNotEmpty ?? false) { - await api.deleteChats(cloudMessagesClient: pushService.state!.icloudServices!.cloudMessagesClient!, chats: ss.prefs.getStringList("chatDeletionIds-1")!); - ss.prefs.remove("chatDeletionIds-1"); + if (CloudKitWriterOwnership.legacyMutationsEnabled) { + final context = await _readLegacyCloudKitDeletionContext(); + if (context != null) { + await _flushLegacyCloudKitDeletions(context); + } } ss.saveSettings(); @@ -2667,21 +3547,34 @@ class RustPushService extends GetxService { List<(String, String)> downloadPfPics = []; var currentState = 0; + var chatPage = 0; while (currentState != 3) { - var (token, items, state) = await api.syncChats(cloudMessagesClient: pushService.state!.icloudServices!.cloudMessagesClient!, - continuationToken: ss.prefs.getString("chatSyncToken") != null ? base64Decode(ss.prefs.getString("chatSyncToken")!) : null); + chatPage++; + final previousToken = ss.prefs.getString("chatSyncToken"); + var (token, items, state) = await api.syncChats( + cloudMessagesClient: + pushService.state!.icloudServices!.cloudMessagesClient!, + continuationToken: ss.prefs.getString("chatSyncToken") != null + ? base64Decode(ss.prefs.getString("chatSyncToken")!) + : null); currentState = state; + var pageHadItemFailure = false; List dupDeleteChats = []; for (var item in items.entries) { try { if (item.value == null) { - final query = Database.chats.query(Chat_.ckRecordId.equals(item.key)).build(); + final query = + Database.chats.query(Chat_.ckRecordId.equals(item.key)).build(); final result = query.findFirst(); - if (result != null) { + if (CloudKitWriterOwnership.legacyMutationsEnabled && + result != null) { syncStopDelete = true; - chats.removeChat(result); - Chat.deleteChat(result); - syncStopDelete = false; + try { + chats.removeChat(result); + Chat.deleteChat(result); + } finally { + syncStopDelete = false; + } } var index = downloadPfPics.indexWhere((i) => i.$2 == item.key); if (index != -1) { @@ -2706,30 +3599,56 @@ class RustPushService extends GetxService { downloadPfPics.add((chat.customAvatarPath!, item.key)); } } catch (e, s) { + pageHadItemFailure = true; Logger.error("Failed to sync item ${item.key}", error: e, trace: s); } } - if (dupDeleteChats.isNotEmpty) { + if (CloudKitWriterOwnership.legacyMutationsEnabled && + !pageHadItemFailure && + dupDeleteChats.isNotEmpty) { Logger.info("Deleting ${dupDeleteChats.length} duplicate chats"); try { - await api.deleteChats(cloudMessagesClient: pushService.state!.icloudServices!.cloudMessagesClient!, chats: dupDeleteChats); + await api.deleteChats( + cloudMessagesClient: + pushService.state!.icloudServices!.cloudMessagesClient!, + chats: dupDeleteChats); } catch (e) { if (e is AnyhowException) { if (e.message.contains("Too many requests")) { Logger.warn("Too many requests, waiting 10s"); await Future.delayed(const Duration(seconds: 10)); - await api.deleteChats(cloudMessagesClient: pushService.state!.icloudServices!.cloudMessagesClient!, chats: dupDeleteChats); - } else { rethrow; } - } else { rethrow; } + await api.deleteChats( + cloudMessagesClient: + pushService.state!.icloudServices!.cloudMessagesClient!, + chats: dupDeleteChats); + } else { + rethrow; + } + } else { + rethrow; + } } } - ss.prefs.setString("chatSyncToken", base64Encode(token)); - } + ss.prefs.setString( + "chatSyncToken", + LegacyCloudKitPageGuard.validate( + zone: "chat", + previousToken: previousToken, + nextToken: token, + state: currentState, + hadItemFailure: pageHadItemFailure, + page: chatPage, + ), + ); + } if (downloadPfPics.isNotEmpty) { - await api.downloadCloudGroupPhotos(cloudMessagesClient: pushService.state!.icloudServices!.cloudMessagesClient!, files: downloadPfPics); + await api.downloadCloudGroupPhotos( + cloudMessagesClient: + pushService.state!.icloudServices!.cloudMessagesClient!, + files: downloadPfPics); } isSyncing.value = "Downloading Attachments..."; @@ -2738,19 +3657,35 @@ class RustPushService extends GetxService { var (cutoffTime, cutoffDateTime) = getCutoffTime(); var attCount = 0; currentState = 0; + var attachmentPage = 0; while (currentState != 3) { - var (token3, items3, state3) = await api.syncAttachments(cloudMessagesClient: pushService.state!.icloudServices!.cloudMessagesClient!, - continuationToken: ss.prefs.getString("attachmentSyncToken") != null ? base64Decode(ss.prefs.getString("attachmentSyncToken")!) : null); + attachmentPage++; + final previousToken = ss.prefs.getString("attachmentSyncToken"); + var (token3, items3, state3) = await api.syncAttachments( + cloudMessagesClient: + pushService.state!.icloudServices!.cloudMessagesClient!, + continuationToken: ss.prefs.getString("attachmentSyncToken") != null + ? base64Decode(ss.prefs.getString("attachmentSyncToken")!) + : null); currentState = state3; + var pageHadItemFailure = false; List dupDeleteAttachments = []; for (var item in items3.entries) { try { if (item.value == null) { - final query = Database.attachments.query(Attachment_.ckRecordId.equals(item.key)).build(); + final query = Database.attachments + .query(Attachment_.ckRecordId.equals(item.key)) + .build(); final result = query.findFirst(); - syncStopDelete = true; - if (result != null) Attachment.delete(result.guid!); - syncStopDelete = false; + if (CloudKitWriterOwnership.legacyMutationsEnabled && + result != null) { + syncStopDelete = true; + try { + Attachment.delete(result.guid!); + } finally { + syncStopDelete = false; + } + } continue; } if (dupDeleteAttachments.contains(item.key)) continue; @@ -2761,43 +3696,72 @@ class RustPushService extends GetxService { currentState = 3; } - var existing = Attachment.findOne(convertAttachmentGuid(decoded.guid)); + var existing = + Attachment.findOne(convertAttachmentGuid(decoded.guid)); if (existing != null) { - if (existing.ckRecordId != null && existing.ckRecordId != item.key) { + if (existing.ckRecordId != null && + existing.ckRecordId != item.key) { // we have a different record id dupDeleteAttachments.add(existing.ckRecordId!); } existing.ckRecordId = item.key; - existing.save(null); + existing.save(null, throwOnUniqueViolation: true); continue; } // don't overwrite existing Logger.info("Syncing new attachment"); var attachment = Attachment(); - attachment.applyFromCloud(item.value!, item.key); + if (!attachment.applyFromCloud(item.value!, item.key)) { + throw StateError('Cloud attachment was not persisted'); + } } catch (e, s) { - Logger.error("Failed to sync attachment ${item.key}", error: e, trace: s); + pageHadItemFailure = true; + Logger.error("Failed to sync attachment ${item.key}", + error: e, trace: s); } } - if (dupDeleteAttachments.isNotEmpty) { - Logger.info("Deleting ${dupDeleteAttachments.length} duplicate attachments"); + if (CloudKitWriterOwnership.legacyMutationsEnabled && + !pageHadItemFailure && + dupDeleteAttachments.isNotEmpty) { + Logger.info( + "Deleting ${dupDeleteAttachments.length} duplicate attachments"); try { - await api.deleteAttachments(cloudMessagesClient: pushService.state!.icloudServices!.cloudMessagesClient!, attachments: dupDeleteAttachments); + await api.deleteAttachments( + cloudMessagesClient: + pushService.state!.icloudServices!.cloudMessagesClient!, + attachments: dupDeleteAttachments); } catch (e) { if (e is AnyhowException) { if (e.message.contains("Too many requests")) { Logger.warn("Too many requests, waiting 10s"); await Future.delayed(const Duration(seconds: 10)); - await api.deleteAttachments(cloudMessagesClient: pushService.state!.icloudServices!.cloudMessagesClient!, attachments: dupDeleteAttachments); - } else { rethrow; } - } else { rethrow; } + await api.deleteAttachments( + cloudMessagesClient: + pushService.state!.icloudServices!.cloudMessagesClient!, + attachments: dupDeleteAttachments); + } else { + rethrow; + } + } else { + rethrow; + } } } attCount += items3.length; isSyncing.value = "Downloaded $attCount attachments"; - ss.prefs.setString("attachmentSyncToken", base64Encode(token3)); + ss.prefs.setString( + "attachmentSyncToken", + LegacyCloudKitPageGuard.validate( + zone: "attachment", + previousToken: previousToken, + nextToken: token3, + state: currentState, + hadItemFailure: pageHadItemFailure, + page: attachmentPage, + ), + ); } int localUnchanged = 0; @@ -2810,24 +3774,41 @@ class RustPushService extends GetxService { isSyncing.value = "Downloading Messages..."; currentState = 0; + var messagePage = 0; while (currentState != 3) { - var (token2, items2, state2) = await api.syncMessages(cloudMessagesClient: pushService.state!.icloudServices!.cloudMessagesClient!, - continuationToken: ss.prefs.getString("messageSyncToken") != null ? base64Decode(ss.prefs.getString("messageSyncToken")!) : null); + messagePage++; + final previousToken = ss.prefs.getString("messageSyncToken"); + var (token2, items2, state2) = await api.syncMessages( + cloudMessagesClient: + pushService.state!.icloudServices!.cloudMessagesClient!, + continuationToken: ss.prefs.getString("messageSyncToken") != null + ? base64Decode(ss.prefs.getString("messageSyncToken")!) + : null); currentState = state2; + var pageHadItemFailure = false; List dupDeleteMessages = []; - Logger.info("Syncing group of ${items2.length} messages, total $totalMessages"); + Logger.info( + "Syncing group of ${items2.length} messages, total $totalMessages"); totalMessages += items2.length; var processedInBatch = 0; for (var item in items2.entries) { try { if (item.value == null) { - final query = Database.messages.query(Message_.ckRecordId.equals(item.key)).build(); + final query = Database.messages + .query(Message_.ckRecordId.equals(item.key)) + .build(); final result = query.findFirst(); - syncStopDelete = true; - if (result != null) Message.delete(result.guid!); - syncStopDelete = false; + if (CloudKitWriterOwnership.legacyMutationsEnabled && + result != null) { + syncStopDelete = true; + try { + Message.delete(result.guid!); + } finally { + syncStopDelete = false; + } + } continue; } if (dupDeleteMessages.contains(item.key)) continue; @@ -2849,14 +3830,18 @@ class RustPushService extends GetxService { localSet++; } existing.ckRecordId = item.key; - existing.save(); + existing.ckSyncState = true; + existing.save(throwOnUniqueViolation: true); remoteSaved++; continue; } // don't overwrite existing var message = Message(); - message.applyFromCloud(item.value!, item.key); + if (!message.applyFromCloud(item.value!, item.key)) { + throw StateError('Cloud message was not persisted'); + } remoteNew++; } catch (e, s) { + pageHadItemFailure = true; Logger.error("Failed to sync cloud message", error: e, trace: s); } finally { processedInBatch++; @@ -2869,24 +3854,54 @@ class RustPushService extends GetxService { } } - if (dupDeleteMessages.isNotEmpty) { + if (CloudKitWriterOwnership.legacyMutationsEnabled && + !pageHadItemFailure && + dupDeleteMessages.isNotEmpty) { Logger.info("Deleting ${dupDeleteMessages.length} duplicate messages"); try { - await api.deleteMessages(cloudMessagesClient: pushService.state!.icloudServices!.cloudMessagesClient!, messages: dupDeleteMessages); + await api.deleteMessages( + cloudMessagesClient: + pushService.state!.icloudServices!.cloudMessagesClient!, + messages: dupDeleteMessages); } catch (e) { if (e is AnyhowException) { if (e.message.contains("Too many requests")) { Logger.warn("Too many requests, waiting 10s"); await Future.delayed(const Duration(seconds: 10)); - await api.deleteMessages(cloudMessagesClient: pushService.state!.icloudServices!.cloudMessagesClient!, messages: dupDeleteMessages); - } else { rethrow; } - } else { rethrow; } + await api.deleteMessages( + cloudMessagesClient: + pushService.state!.icloudServices!.cloudMessagesClient!, + messages: dupDeleteMessages); + } else { + rethrow; + } + } else { + rethrow; + } } } isSyncing.value = "Downloaded $totalMessages messages"; - - ss.prefs.setString("messageSyncToken", base64Encode(token2)); + + ss.prefs.setString( + "messageSyncToken", + LegacyCloudKitPageGuard.validate( + zone: "message", + previousToken: previousToken, + nextToken: token2, + state: currentState, + hadItemFailure: pageHadItemFailure, + page: messagePage, + ), + ); + } + + if (!CloudKitWriterOwnership.legacyMutationsEnabled) { + ss.prefs.setInt("lastSynced", DateTime.now().millisecondsSinceEpoch); + Logger.info( + "Legacy CloudKit restore completed with uploads and deletes disabled", + ); + return; } isSyncing.value = "Uploading chats..."; @@ -2896,7 +3911,12 @@ class RustPushService extends GetxService { List<(String, String)> uploadAttachments = []; Map idToAttachment = {}; - var unsyncedChats = Database.chats.query(Chat_.ckSyncState.equals(false).and(Chat_.dateDeleted.isNull()).and(Chat_.isRpSms.equals(false))).build(); + var unsyncedChats = Database.chats + .query(Chat_.ckSyncState + .equals(false) + .and(Chat_.dateDeleted.isNull()) + .and(Chat_.isRpSms.equals(false))) + .build(); var useChats = unsyncedChats.find(); Logger.info("Out2"); Map saveChats = {}; @@ -2907,7 +3927,9 @@ class RustPushService extends GetxService { if (chat.photoAttachmentGuid != null) { var attachment = Attachment.findOne(chat.photoAttachmentGuid!); - if (attachment != null && attachment.getFile().exists() && attachment.ckRecordId == null) { + if (attachment != null && + attachment.getFile().exists() && + attachment.ckRecordId == null) { attachment.ckRecordId = generateCloudKitId(); uploadAttachments.add((attachment.path, attachment.ckRecordId!)); idToAttachment[attachment.ckRecordId!] = attachment; @@ -2928,7 +3950,10 @@ class RustPushService extends GetxService { if (saveChats.isNotEmpty) { if (uploadPhotos.isNotEmpty) { - var results = await api.uploadGroupPhoto(cloudMessagesClient: pushService.state!.icloudServices!.cloudMessagesClient!, files: uploadPhotos); + var results = await api.uploadGroupPhoto( + cloudMessagesClient: + pushService.state!.icloudServices!.cloudMessagesClient!, + files: uploadPhotos); for (var result in results.entries) { saveChats[result.key]!.groupPhoto = result.value; } @@ -2936,7 +3961,10 @@ class RustPushService extends GetxService { totalSavedChats += saveChats.length; - var result = await api.saveChats(cloudMessagesClient: pushService.state!.icloudServices!.cloudMessagesClient!, chats: saveChats); + var result = await api.saveChats( + cloudMessagesClient: + pushService.state!.icloudServices!.cloudMessagesClient!, + chats: saveChats); for (var result in result.entries) { if (result.value) continue; // success var failedChat = useChats.firstWhere((c) => c.ckRecordId == result.key); @@ -2950,39 +3978,66 @@ class RustPushService extends GetxService { isSyncing.value = "Uploaded $totalSavedChats chats"; } + // Chat photo attachments are assembled before the message query. Flush + // that batch even when there are no unsynced messages to drive the loop. + if (uploadAttachments.isNotEmpty) { + await uploadMessages( + const [], uploadAttachments, idToAttachment, false); + } + Logger.info("Syncing messages"); bool noAttachments = !ss.settings.attachmentSyncEnabled.value; - - var unsyncedMessages = Database.messages.query(Message_.ckRecordId.isNull().and(Message_.itemType.equals(0)).and(Message_.ckSyncState.equals(false).or(Message_.ckSyncState.isNull())) - .and(Message_.dateCreated.greaterThanDate(cutoffDateTime))) - .build() + var unsyncedMessages = Database.messages + .query(Message_.itemType + .equals(0) + .and(Message_.ckSyncState + .equals(false) + .or(Message_.ckSyncState.isNull())) + .and(Message_.dateCreated.greaterThanDate(cutoffDateTime))) + .build() ..limit = 3000; var messages = unsyncedMessages.find(); - int localUpload = messages.length; + int localUpload = 0; while (messages.isNotEmpty) { Logger.info("Syncing batch ${messages.length}"); - await uploadMessages(messages, uploadAttachments, idToAttachment, noAttachments); - - var unsyncedMessages = Database.messages.query(Message_.ckRecordId.isNull().and(Message_.itemType.equals(0)).and(Message_.ckSyncState.equals(false).or(Message_.ckSyncState.isNull())) - .and(Message_.dateCreated.greaterThanDate(cutoffDateTime))) - .build() + final batchResult = await uploadMessages( + messages, uploadAttachments, idToAttachment, noAttachments); + localUpload += batchResult.confirmedCount; + + var unsyncedMessages = Database.messages + .query(Message_.itemType + .equals(0) + .and(Message_.ckSyncState + .equals(false) + .or(Message_.ckSyncState.isNull())) + .and(Message_.dateCreated.greaterThanDate(cutoffDateTime))) + .build() ..limit = 3000; messages = unsyncedMessages.find(); - localUpload += messages.length; isSyncing.value = "Uploaded $localUpload messages"; + + if (!batchResult.madeProgress && messages.isNotEmpty) { + Logger.warn( + "Stopping CloudKit upload pass with ${messages.length} retryable messages; " + "they remain queued for the next sync", + ); + break; + } } ss.prefs.setInt("lastSynced", DateTime.now().millisecondsSinceEpoch); Logger.info("Syncing completed"); - Logger.info("Sync stats: $localUnchanged $localChanged $localSet $remoteSaved $localUpload $totalMessages $remoteNew"); + Logger.info( + "Sync stats: $localUnchanged $localChanged $localSet $remoteSaved $localUpload $totalMessages $remoteNew"); } Future getPurchaseDetails() async { if (!Platform.isAndroid) return null; try { - var purchases = await pushService.client.runWithClient((client) => client.queryPurchases(ProductType.subs)); + var purchases = await pushService.client + .runWithClient((client) => client.queryPurchases(ProductType.subs)); var token = purchases.purchasesList.firstOrNull?.purchaseToken; if (token != null && ss.settings.deviceIsHosted.value) { ss.settings.hostedToken.value = token; @@ -2998,7 +4053,11 @@ class RustPushService extends GetxService { // true if active purchase is valid. Future checkPurchaseState() async { if (ss.settings.hostedToken.value == null) return false; - final status = await http.dio.post("https://hw.openbubbles.app/restore", data: {"purchase_token": ss.settings.hostedToken.value!}, options: Options(responseType: ResponseType.plain),); + final status = await http.dio.post( + "https://hw.openbubbles.app/restore", + data: {"purchase_token": ss.settings.hostedToken.value!}, + options: Options(responseType: ResponseType.plain), + ); var elapsed = status.data.toString().contains("Invalid subscription!"); return !elapsed; @@ -3011,20 +4070,34 @@ class RustPushService extends GetxService { if (detail == null) return; if (!detail.isAcknowledged) { - await pushService.client.runWithClient((client) => client.acknowledgePurchase(detail.purchaseToken)); + await pushService.client.runWithClient( + (client) => client.acknowledgePurchase(detail.purchaseToken)); } } } Future rotateIncomingLink() async { - await api.useLinkFor(facetime: pushService.state!.ftClient, oldUsage: "incomingcall", usage: "incomingcall-old"); - await api.useLinkFor(facetime: pushService.state!.ftClient, oldUsage: "nextincomingcall", usage: "incomingcall"); - await api.getFtLink(facetime: pushService.state!.ftClient, usage: "nextincomingcall"); + await api.useLinkFor( + facetime: pushService.state!.ftClient, + oldUsage: "incomingcall", + usage: "incomingcall-old"); + await api.useLinkFor( + facetime: pushService.state!.ftClient, + oldUsage: "nextincomingcall", + usage: "incomingcall"); + await api.getFtLink( + facetime: pushService.state!.ftClient, usage: "nextincomingcall"); } Future rotateLink() async { - await api.useLinkFor(facetime: pushService.state!.ftClient, oldUsage: "current", usage: "current-old"); - await api.useLinkFor(facetime: pushService.state!.ftClient, oldUsage: "next", usage: "current"); + await api.useLinkFor( + facetime: pushService.state!.ftClient, + oldUsage: "current", + usage: "current-old"); + await api.useLinkFor( + facetime: pushService.state!.ftClient, + oldUsage: "next", + usage: "current"); await api.getFtLink(facetime: pushService.state!.ftClient, usage: "next"); } @@ -3032,11 +4105,13 @@ class RustPushService extends GetxService { Map outgoingCallMeta = {}; RxString? currentOutgoingCall; Future placeOutgoingCall(String caller, List targets) async { - var outgoingguid = uuid.v4().toUpperCase(); - var link = await api.getFtLink(facetime: pushService.state!.ftClient, usage: "next"); - var desc = targets.map((p) => RustPushBBUtils.rustHandleToBB(p).displayName).join(" & "); + var link = await api.getFtLink( + facetime: pushService.state!.ftClient, usage: "next"); + var desc = targets + .map((p) => RustPushBBUtils.rustHandleToBB(p).displayName) + .join(" & "); // rotate link pushService.rotateLink().catchError((e, s) { Logger.error("Failed to rotate link", error: e, trace: s); @@ -3044,7 +4119,12 @@ class RustPushService extends GetxService { // preload mcs.invokeMethod("update-call-state", { - "name": ss.settings.userName.value == "You" ? (await api.getHandles(state: pushService.state!.client)).first.replaceFirst("tel:", "").replaceFirst("mailto:", "") : ss.settings.userName.value, + "name": ss.settings.userName.value == "You" + ? (await api.getHandles(state: pushService.state!.client)) + .first + .replaceFirst("tel:", "") + .replaceFirst("mailto:", "") + : ss.settings.userName.value, "desc": desc, "url": link, "callUuid": outgoingguid, @@ -3052,17 +4132,23 @@ class RustPushService extends GetxService { }); outgoingCallMeta = { - 'link': link, - 'callUuid': outgoingguid, - 'desc': desc, - 'name': ss.settings.userName.value == "You" ? (await api.getHandles(state: pushService.state!.client)).first.replaceFirst("tel:", "").replaceFirst("mailto:", "") : ss.settings.userName.value, + 'link': link, + 'callUuid': outgoingguid, + 'desc': desc, + 'name': ss.settings.userName.value == "You" + ? (await api.getHandles(state: pushService.state!.client)) + .first + .replaceFirst("tel:", "") + .replaceFirst("mailto:", "") + : ss.settings.userName.value, 'answer': true }; outgoingCallTimer = Timer(const Duration(seconds: 30), () async { currentOutgoingCall?.value = "timeout"; - await api.cancelFacetime(facetime: pushService.state!.ftClient, guid: outgoingguid); + await api.cancelFacetime( + facetime: pushService.state!.ftClient, guid: outgoingguid); // destroy webview mcs.invokeMethod("update-call-state", { @@ -3082,8 +4168,13 @@ class RustPushService extends GetxService { poster = handle.getPoster(); } - showOutgoingFaceTimeOverlay(currentOutgoingCall!, desc, caller, targets, icon, link, poster); - await api.createFacetime(facetime: pushService.state!.ftClient, uuid: outgoingguid, handle: caller, participants: targets); + showOutgoingFaceTimeOverlay( + currentOutgoingCall!, desc, caller, targets, icon, link, poster); + await api.createFacetime( + facetime: pushService.state!.ftClient, + uuid: outgoingguid, + handle: caller, + participants: targets); } // returns handle to show poster of @@ -3097,7 +4188,10 @@ class RustPushService extends GetxService { return null; } } - return session.members.where((a) => !session!.myHandles.contains(a.handle)).firstOrNull?.handle; + return session.members + .where((a) => !session!.myHandles.contains(a.handle)) + .firstOrNull + ?.handle; } String? getSessionName(String guid, bool active) { @@ -3110,7 +4204,9 @@ class RustPushService extends GetxService { return null; } } - var participants = session.members.where((a) => !session!.myHandles.contains(a.handle)).map((a) { + var participants = session.members + .where((a) => !session!.myHandles.contains(a.handle)) + .map((a) { if (a.nickname != null) { return Handle(address: "Maybe: ${a.nickname}"); } else { @@ -3136,14 +4232,30 @@ class RustPushService extends GetxService { ss.saveSettings(); } - Future getShareProfileMessageFor(List targets) async { - if (targets.length != 1) return null; // only share in 1-1 chats atm - if (ss.settings.shareProfileMessage.value == null || !ss.settings.shareContactAutomatically.value || !ss.settings.nameAndPhotoSharing.value) return null; - if (targets.every((t) => !(t.contact?.isShared ?? true) && !ss.settings.sharedContacts.contains(t.address))) { + Future getShareProfileMessageFor( + List targets) async { + if (targets.length != 1) { + Logger.info( + "Profile share not attached reason=not_one_to_one targets=${targets.length}"); + return null; // only share in 1-1 chats atm + } + if (ss.settings.shareProfileMessage.value == null || + !ss.settings.shareContactAutomatically.value || + !ss.settings.nameAndPhotoSharing.value) { + Logger.info( + "Profile share not attached reason=settings profileConfigured=${ss.settings.shareProfileMessage.value != null} automatic=${ss.settings.shareContactAutomatically.value} enabled=${ss.settings.nameAndPhotoSharing.value}"); + return null; + } + if (targets.every((t) => + !(t.contact?.isShared ?? true) && + !ss.settings.sharedContacts.contains(t.address))) { ss.settings.sharedContacts.addAll(targets.map((t) => t.address)); ss.saveSettings(); - return api.decodeProfileMessage(s: ss.settings.shareProfileMessage.value!); + Logger.info("Profile share attached mode=embedded targets=1"); + return api.decodeProfileMessage( + s: ss.settings.shareProfileMessage.value!); } + Logger.info("Profile share not attached reason=already_shared targets=1"); return null; } @@ -3163,7 +4275,9 @@ class RustPushService extends GetxService { String _profileFailureCategory(Object error) { final description = error.toString().toLowerCase(); - if (description.contains("profile service unavailable")) return "service_unavailable"; + if (description.contains("profile service unavailable")) { + return "service_unavailable"; + } if (description.contains("timeout")) return "timeout"; if (description.contains("connection") || description.contains("network") || @@ -3171,8 +4285,12 @@ class RustPushService extends GetxService { description.contains("dns")) { return "network"; } - if (description.contains("record") && description.contains("not found")) return "record_not_found"; - if (description.contains("plist") || description.contains("serde")) return "plist"; + if (description.contains("record") && description.contains("not found")) { + return "record_not_found"; + } + if (description.contains("plist") || description.contains("serde")) { + return "plist"; + } if (description.contains("decrypt") || description.contains("hmac") || description.contains("crypto")) { @@ -3198,14 +4316,16 @@ class RustPushService extends GetxService { if (_profileRetryTimers.containsKey(profileKey)) return; if (!_isTransientProfileFailure(category)) { _profileRetryAttempts.remove(profileKey); - Logger.warn("Shared profile fetch skipped retry category=$category transient=false"); + Logger.warn( + "Shared profile fetch skipped retry category=$category transient=false"); return; } final attempt = _profileRetryAttempts[profileKey] ?? 0; if (attempt >= _profileRetryDelays.length) { _profileRetryAttempts.remove(profileKey); - Logger.warn("Shared profile fetch exhausted category=$category attempts=$attempt"); + Logger.warn( + "Shared profile fetch exhausted category=$category attempts=$attempt"); return; } @@ -3221,27 +4341,42 @@ class RustPushService extends GetxService { }); } - Future handleSharedProfile(api.ShareProfileMessage shared, String sender, List targets) async { + Future handleSharedProfile(api.ShareProfileMessage shared, + String sender, List targets) async { final profileKey = shared.cloudKitRecordKey; - if (_profileRetryTimers.containsKey(profileKey) || !profilesDownloading.add(profileKey)) return; + if (_profileRetryTimers.containsKey(profileKey)) { + Logger.info("Shared profile deferred reason=retry_pending"); + return; + } + if (!profilesDownloading.add(profileKey)) { + Logger.info("Shared profile suppressed reason=download_in_progress"); + return; + } try { + Logger.info( + "Shared profile processing started poster=${shared.poster != null} targets=${targets.length}"); await _handleSharedProfile(shared, sender, targets); _clearProfileRetry(profileKey); + Logger.info("Shared profile processing completed"); } catch (error) { // Shared profile payloads are optional message metadata. A malformed // CloudKit plist must not escape an unawaited profile task and disturb // message delivery. Retry independently so the contact image can recover // after transient CloudKit, network, or service-initialization failures. - _scheduleProfileRetry(shared, sender, targets, _profileFailureCategory(error)); + _scheduleProfileRetry( + shared, sender, targets, _profileFailureCategory(error)); } finally { profilesDownloading.remove(profileKey); } } - Future _handleSharedProfile(api.ShareProfileMessage shared, String sender, List targets) async { + Future _handleSharedProfile(api.ShareProfileMessage shared, + String sender, List targets) async { var myHandles = await api.getHandles(state: pushService.state!.client); if (myHandles.contains(sender)) { + Logger.info( + "Shared profile treated as self-sent targets=${targets.length}"); for (var target in targets) { if (ss.settings.sharedContacts.contains(target.address)) { continue; @@ -3255,9 +4390,15 @@ class RustPushService extends GetxService { if (profiles == null) throw StateError("Profile service unavailable"); // mask with profilesDownloading because iPhones have a nasty habit of sharing once to every handle. We don't want to download 15 times for each handle - if (Contact.findOne(id: shared.cloudKitRecordKey) != null) return; // already downloaded + if (Contact.findOne(id: shared.cloudKitRecordKey) != null) { + Logger.info("Shared profile suppressed reason=record_already_stored"); + return; // already downloaded + } + Logger.info("Shared profile CloudKit fetch started"); var fetch = await api.fetchProfile(profiles: profiles, message: shared); + Logger.info( + "Shared profile CloudKit fetch completed image=${fetch.image?.isNotEmpty ?? false} poster=${fetch.poster != null}"); var otherHandle = RustPushBBUtils.rustHandleToBB(sender); String? posterPath; @@ -3278,7 +4419,8 @@ class RustPushService extends GetxService { } } - var existingShared = Contact.findOne(address: otherHandle.address, wantShared: true); + var existingShared = + Contact.findOne(address: otherHandle.address, wantShared: true); if (existingShared != null) { if (otherHandle.contactRelation.targetId == existingShared.dbId) { otherHandle.contactRelation.target = null; @@ -3286,7 +4428,7 @@ class RustPushService extends GetxService { if (existingShared.posterPath != null) { try { await deletePoster(existingShared.posterPath!); - } catch (e) { /* */ } + } catch (e) {/* */} } Database.contacts.remove(existingShared.dbId!); } @@ -3306,18 +4448,29 @@ class RustPushService extends GetxService { ), avatar: avatar, isShared: true, - phones: otherHandle.contact?.phones ?? (otherHandle.address.isEmail ? [] : [otherHandle.address]), - emails: otherHandle.contact?.emails ?? (otherHandle.address.isEmail ? [otherHandle.address] : []), + phones: otherHandle.contact?.phones ?? + (otherHandle.address.isEmail ? [] : [otherHandle.address]), + emails: otherHandle.contact?.emails ?? + (otherHandle.address.isEmail ? [otherHandle.address] : []), posterPath: posterPath, )); + Logger.info( + "Shared profile persisted sharedContact=true image=${avatar?.isNotEmpty ?? false}"); if (otherHandle.contactRelation.target == null) { otherHandle.contactRelation.targetId = newId; Database.handles.put(otherHandle); } - eventDispatcher.emit("refresh-avatar", [otherHandle.address, otherHandle.color]); - final result = (await Chat.findByRust(api.ConversationData(participants: [sender]), "iMessage", soft: true)); + eventDispatcher + .emit("refresh-avatar", [otherHandle.address, otherHandle.color]); + final result = (await Chat.findByRust( + api.ConversationData(participants: [sender]), "iMessage", + soft: true)); if (result != null) { cvc(result).updateContactInfo(); + Logger.info("Shared profile prompt refresh requested oneToOne=true"); + } else { + Logger.info( + "Shared profile stored without prompt reason=chat_not_loaded"); } } @@ -3326,7 +4479,7 @@ class RustPushService extends GetxService { await Directory(path).delete(recursive: true); } if (File("$path.jpg").existsSync()) { - await File("$path.jpg").delete(); + await File("$path.jpg").delete(); } if (File("$path-preview.png").existsSync()) { await File("$path-preview.png").delete(); @@ -3340,14 +4493,16 @@ class RustPushService extends GetxService { for (var asset in photo.assets) { Map entries = {}; for (var file in asset.files.entries) { - File f = fileForAsset("$appDocPath/avatars/you/poster-$number", asset, file.key); + File f = fileForAsset( + "$appDocPath/avatars/you/poster-$number", asset, file.key); if (!(await f.exists())) { await f.create(recursive: true); } await f.writeAsBytes(file.value); if (file.key.endsWith("HEIC")) { - await mcs.invokeMethod("decode-heif", {"file": f.path, "output": "${f.path}.png"}); + await mcs.invokeMethod( + "decode-heif", {"file": f.path, "output": "${f.path}.png"}); } entries[file.key] = Uint8List(0); @@ -3364,7 +4519,10 @@ class RustPushService extends GetxService { } await f.writeAsBytes(memoji.data.avatarImageData); - await mcs.invokeMethod("decode-heif", {"file": f.path, "output": "$appDocPath/avatars/you/poster-$number/memoji.png"}); + await mcs.invokeMethod("decode-heif", { + "file": f.path, + "output": "$appDocPath/avatars/you/poster-$number/memoji.png" + }); memoji.data.avatarImageData = Uint8List(0); } } @@ -3388,7 +4546,8 @@ class RustPushService extends GetxService { return "$appDocPath/avatars/you/poster-$number"; } - Future saveTranscriptPoster(api.SimplifiedTranscriptPoster decoded) async { + Future saveTranscriptPoster( + api.SimplifiedTranscriptPoster decoded) async { int number = Random().nextInt(9999999); String appDocPath = fs.appDocDir.path; @@ -3410,7 +4569,11 @@ class RustPushService extends GetxService { Future invalidatePeerCaches() async { var myHandles = (await api.getHandles(state: pushService.state!.client)); // loop through recent chats (1 day or newer) - Query query = Database.chats.query(Chat_.dateDeleted.isNull().and(Chat_.dbOnlyLatestMessageDate.greaterThan(DateTime.now().subtract(const Duration(hours: 12)).millisecondsSinceEpoch))) + Query query = Database.chats + .query(Chat_.dateDeleted.isNull().and(Chat_.dbOnlyLatestMessageDate + .greaterThan(DateTime.now() + .subtract(const Duration(hours: 12)) + .millisecondsSinceEpoch))) .build(); // Execute the query, then close the DB connection @@ -3431,9 +4594,12 @@ class RustPushService extends GetxService { } for (var handle in myHandles) { - if (handleChats[handle]!.length == 1) continue; // if it's just us, we're good. + if (handleChats[handle]!.length == 1) { + continue; // if it's just us, we're good. + } var msg = await api.newMsg( - conversation: api.ConversationData(participants: handleChats[handle]!.toList()), + conversation: + api.ConversationData(participants: handleChats[handle]!.toList()), sender: handle, message: const api.Message.peerCacheInvalidate(), ); @@ -3442,7 +4608,9 @@ class RustPushService extends GetxService { } void wantAddNumber() { - final status = http.dio.get("https://hw.openbubbles.app/status").then((status) => status.data["available"]); + final status = http.dio + .get("https://hw.openbubbles.app/status") + .then((status) => status.data["available"]); showDialog( context: Get.context!, builder: (context) => AlertDialog( @@ -3451,39 +4619,37 @@ class RustPushService extends GetxService { style: context.theme.textTheme.titleLarge, ), backgroundColor: context.theme.colorScheme.properSurface, - content: Text("Try hosted for a just-works, paid, hosted solution. Or, jailbreak your own to self-host.", style: context.theme.textTheme.bodyLarge), + content: Text( + "Try hosted for a just-works, paid, hosted solution. Or, jailbreak your own to self-host.", + style: context.theme.textTheme.bodyLarge), actions: [ TextButton( - child: Text( - "Close", - style: context.theme.textTheme.bodyLarge!.copyWith(color: context.theme.colorScheme.primary) - ), + child: Text("Close", + style: context.theme.textTheme.bodyLarge! + .copyWith(color: context.theme.colorScheme.primary)), onPressed: () => Navigator.of(context).pop(), ), TextButton( - child: Text( - "Learn to Self-host", - style: context.theme.textTheme.bodyLarge!.copyWith(color: context.theme.colorScheme.primary) - ), - onPressed: () { - Navigator.of(context).pop(); - launchUrl(Uri.parse("https://openbubbles.app/docs/pnr.html")); - } - ), + child: Text("Learn to Self-host", + style: context.theme.textTheme.bodyLarge! + .copyWith(color: context.theme.colorScheme.primary)), + onPressed: () { + Navigator.of(context).pop(); + launchUrl(Uri.parse("https://openbubbles.app/docs/pnr.html")); + }), TextButton( - child: Text( - "Switch to Hosted", - style: context.theme.textTheme.bodyLarge!.copyWith(color: context.theme.colorScheme.primary) - ), - onPressed: () async { - Navigator.of(context).pop(); - if (await status) { - pushService.markFailedToLogin(hw: true, logout: true, ui: true); - } else { - launchUrl(Uri.parse("https://openbubbles.app/#hosted")); - } - } - ), + child: Text("Switch to Hosted", + style: context.theme.textTheme.bodyLarge! + .copyWith(color: context.theme.colorScheme.primary)), + onPressed: () async { + Navigator.of(context).pop(); + if (await status) { + pushService.markFailedToLogin( + hw: true, logout: true, ui: true); + } else { + launchUrl(Uri.parse("https://openbubbles.app/#hosted")); + } + }), ], ), ); @@ -3493,35 +4659,37 @@ class RustPushService extends GetxService { var notifiedSubFailed = false; String? chosenFTRoomGuid; - String? incomingRingingCallGuid; + FaceTimeIncomingAdmissionCorrelation? _incomingAdmission; Future markCertified(api.PushMessage push) async { if (push is! api.PushMessage_IMessage) return; var sendDelivered = push.field0.sendDelivered; try { var chat = await pushService.chatForMessage(push.field0); - if (!chat.isGroup && chat.handles.length == 1 && chat.handles.first.isBlocked()) { + if (!chat.isGroup && + chat.handles.length == 1 && + chat.handles.first.isBlocked()) { sendDelivered = false; // we are blocked } if (chat.isRpSms) { sendDelivered = false; // no delivery recipts :) } - } catch (e) { /* sending a receipt is more important */ } + } catch (e) {/* sending a receipt is more important */} if (push.field0.certifiedContext == null) { if (sendDelivered) { var chat = await pushService.chatForMessage(push.field0); var message = push.field0; var msg = await api.newMsg( conversation: api.ConversationData( - participants: [message.sender!], - cvName: message.conversation!.cvName, - senderGuid: message.conversation!.senderGuid - ), + participants: [message.sender!], + cvName: message.conversation!.cvName, + senderGuid: message.conversation!.senderGuid), sender: await chat.ensureHandle(), message: const api.Message.delivered(), ); msg.id = message.id; - msg.target = message.target; // delivered is only sent to the device that sent it + msg.target = + message.target; // delivered is only sent to the device that sent it if (msg.id.contains("temp") || msg.id.contains("error")) { return; } @@ -3529,7 +4697,10 @@ class RustPushService extends GetxService { } return; } - await api.certifyDelivery(state: pushService.state!.client, context: push.field0.certifiedContext!, notify: sendDelivered); + await api.certifyDelivery( + state: pushService.state!.client, + context: push.field0.certifiedContext!, + notify: sendDelivered); } Future markAsSpam(Chat chat) async { @@ -3538,20 +4709,29 @@ class RustPushService extends GetxService { for (var message in chatMessages) { api.MessageParts parts; if (message.attributedBody.isNotEmpty) { - parts = await (backend as RustPushBackend).partsFromBody(message.attributedBody.first); + parts = await (backend as RustPushBackend) + .partsFromBody(message.attributedBody.first); } else { - parts = api.MessageParts(field0: [api.IndexedMessagePart(part_: api.MessagePart.text(message.text!, pushService.defaultFormat()))]); + parts = api.MessageParts(field0: [ + api.IndexedMessagePart( + part_: api.MessagePart.text( + message.text!, pushService.defaultFormat())) + ]); } if (message.isFromMe!) continue; messages.add(api.ReportMessage( - guid: message.guid!, - sender: RustPushBBUtils.bbHandleToRust(message.handle!), - conversationSize: chat.participants.length, - parts: parts, - timeOfMessage: message.dateCreated!.microsecondsSinceEpoch.toDouble() / 1000000 - )); - } - await api.reportMessages(state: pushService.state!.client, handle: await chat.ensureHandle(), messages: messages); + guid: message.guid!, + sender: RustPushBBUtils.bbHandleToRust(message.handle!), + conversationSize: chat.participants.length, + parts: parts, + timeOfMessage: + message.dateCreated!.microsecondsSinceEpoch.toDouble() / + 1000000)); + } + await api.reportMessages( + state: pushService.state!.client, + handle: await chat.ensureHandle(), + messages: messages); Chat.softDelete(chat); } @@ -3564,10 +4744,11 @@ class RustPushService extends GetxService { bool authing = false; Future handleMsgInner(api.PushMessage push) async { if (push is api.PushMessage_CircleFinishEvent) { - if (await api.isInClique(keychain: pushService.state!.icloudServices!.keychain!)) { + if (await api.isInClique( + keychain: pushService.state!.icloudServices!.keychain!)) { cachedInClique = true; // enable after battle testing - + // Logger.info("Joined clique, enabling sync!"); // ss.settings.cloudSyncingEnabled.value = true; // ss.settings.attachmentSyncEnabled.value = false; @@ -3578,12 +4759,15 @@ class RustPushService extends GetxService { } if (push is api.PushMessage_StatusUpdate) { var status = push.field0; - final result = (await Chat.findByRust(api.ConversationData(participants: [status.user]), "iMessage", soft: true)); + final result = (await Chat.findByRust( + api.ConversationData(participants: [status.user]), "iMessage", + soft: true)); if (result == null) return; result.notifsSilenced = !status.allowed; result.save(updateNotifsSilenced: true); cvc(result).recipientNotifsSilenced.value = !status.allowed; - cvc(result).chat.notifsSilenced = !status.allowed; // make sure all our objects are in sync lmao + cvc(result).chat.notifsSilenced = + !status.allowed; // make sure all our objects are in sync lmao return; } @@ -3631,13 +4815,11 @@ class RustPushService extends GetxService { if (Platform.isAndroid) { await mcs.invokeMethod("launch-facetime", outgoingCallMeta); } else { - await launchUrl( - Uri.parse(outgoingCallMeta['link']), - mode: LaunchMode.externalApplication - ); + await launchUrl(Uri.parse(outgoingCallMeta['link']), + mode: LaunchMode.externalApplication); } - - incomingRingingCallGuid = null; + + _incomingAdmission = null; } } else if (facetime is api.FTMessage_AddMembers) { if (facetime.ring) { @@ -3650,7 +4832,7 @@ class RustPushService extends GetxService { if (facetime is api.FTMessage_Decline) { if (currentOutgoingCall?.value == facetime.guid) { currentOutgoingCall?.value = "declined"; - + outgoingCallTimer?.cancel(); // destroy webview @@ -3666,7 +4848,8 @@ class RustPushService extends GetxService { String? existingCall = await mcs.invokeMethod("get-active-call"); if (existingCall == ring) { // we already answered this call - Logger.info("Not ringing call $ring because we have already answered it!"); + Logger.info( + "Not ringing call $ring because we have already answered it!"); return; } @@ -3675,9 +4858,14 @@ class RustPushService extends GetxService { Logger.warn("Rung call $ring not found in active sessions!"); return; } - var link = await api.getFtLink(facetime: pushService.state!.ftClient, usage: "nextincomingcall"); + var link = await api.getFtLink( + facetime: pushService.state!.ftClient, usage: "nextincomingcall"); rotateIncomingLink(); - incomingRingingCallGuid = ring; + final incomingAdmission = FaceTimeIncomingAdmissionCorrelation( + callUuid: ring, + receivedAt: DateTime.now(), + ); + _incomingAdmission = incomingAdmission; String? myPoster; Uint8List? icon; @@ -3685,31 +4873,43 @@ class RustPushService extends GetxService { if (identity != null) { var handle = RustPushBBUtils.rustHandleToBB(identity); if (handle.isBlocked()) { - incomingRingingCallGuid = null; + if (identical(_incomingAdmission, incomingAdmission)) { + _incomingAdmission = null; + } Logger.info("Dropping call from blocked handle $handle"); return; } icon = handle.contact?.avatar; var poster = handle.getPoster(); if (poster != null && !kIsDesktop) { - var loaded = await api.fromPosterSave(poster: await File("$poster.jpg").readAsBytes()); + var loaded = await api.fromPosterSave( + poster: await File("$poster.jpg").readAsBytes()); var images = await loadPosterImages(poster, loaded.poster); var recorder = ui.PictureRecorder(); var canvas = Canvas(recorder); - var painter = PosterPainter(poster: loaded.poster, images: images, name: handle.displayName); + var painter = PosterPainter( + poster: loaded.poster, + images: images, + name: handle.displayName); - Map results = await mcs.invokeMethod("get-full-resolution"); + Map results = + await mcs.invokeMethod("get-full-resolution"); - var size = Size((results["width"]! as int).toDouble(), (results["height"]! as int).toDouble()); + var size = Size((results["width"]! as int).toDouble(), + (results["height"]! as int).toDouble()); canvas.scale(results["ratio"]! as double); painter.paint(canvas, size / (results["ratio"]! as double)); ui.Picture picture = recorder.endRecording(); - ui.Image image = await picture.toImage(size.width.toInt(), size.height.toInt()); + ui.Image image = + await picture.toImage(size.width.toInt(), size.height.toInt()); - Uint8List bytes = (await image.toByteData(format: ui.ImageByteFormat.png))!.buffer.asUint8List(); + Uint8List bytes = + (await image.toByteData(format: ui.ImageByteFormat.png))! + .buffer + .asUint8List(); File file = File("$poster-preview.png"); await file.writeAsBytes(bytes); myPoster = file.path; @@ -3726,9 +4926,13 @@ class RustPushService extends GetxService { } if (facetime is api.FTMessage_LeaveEvent) { - var nonActive = sessions.firstWhereOrNull((a) => a.groupId == facetime.guid); + var nonActive = + sessions.firstWhereOrNull((a) => a.groupId == facetime.guid); if (nonActive != null) { - if (incomingRingingCallGuid != null) { + final pendingAdmission = _incomingAdmission; + if (pendingAdmission != null && + !pendingAdmission.isCompleted && + pendingAdmission.callUuid == facetime.guid) { var session = getSessionName(facetime.guid, false); if (session == null) { Logger.warn("Missed call $ring not found in active sessions!"); @@ -3736,25 +4940,82 @@ class RustPushService extends GetxService { } // this is a missed call notif.createMissedCallNotification(session, facetime.guid); - incomingRingingCallGuid = null; + _incomingAdmission = null; } - hideFaceTimeOverlay(facetime.guid, timeout: true); // they have given up the ringing + hideFaceTimeOverlay(facetime.guid, + timeout: true); // they have given up the ringing } } if (facetime is api.FTMessage_RespondedElsewhere) { - hideFaceTimeOverlay(facetime.guid, timeout: true); // they have given up the ringing - incomingRingingCallGuid = null; + hideFaceTimeOverlay(facetime.guid, + timeout: true); // they have given up the ringing + if (_incomingAdmission?.callUuid == facetime.guid) { + _incomingAdmission = null; + } } if (facetime is api.FTMessage_LetMeInRequest) { var approvedGroup = chosenFTRoomGuid; - if (facetime.field0.usage == "incomingcall" || facetime.field0.usage == "nextincomingcall") { - approvedGroup = incomingRingingCallGuid; - incomingRingingCallGuid = null; + FaceTimeIncomingAdmissionCorrelation? claimedAdmission; + FaceTimeIncomingAdmissionResult? incomingAdmission; + final isIncomingAdmission = facetime.field0.usage == "incomingcall" || + facetime.field0.usage == "nextincomingcall"; + if (isIncomingAdmission) { + claimedAdmission = _incomingAdmission; + String? activeCallUuid; + try { + activeCallUuid = + (await mcs.invokeMethod("get-active-call")) as String?; + } catch (error, trace) { + Logger.warn( + "FaceTime incoming admission UUID lookup failed", + error: error, + trace: trace, + ); + } + + incomingAdmission = claimedAdmission?.claim( + activeCallUuid: activeCallUuid, + now: DateTime.now(), + ); + approvedGroup = incomingAdmission?.approvedGroup; + if (!shouldAnswerIncomingFaceTimeAdmission(incomingAdmission)) { + Logger.warn( + "FaceTime incoming admission rejected: ${incomingAdmission?.status.name ?? 'missingPendingCall'}", + ); + if (incomingAdmission?.status == + FaceTimeIncomingAdmissionStatus.alreadyClaimed) { + Logger.info( + "Ignoring concurrent duplicate FaceTime incoming admission request"); + } + return; + } + } + Logger.info( + "FaceTime web admission request: usage=${facetime.field0.usage ?? 'unknown'}, approvedGroupPresent=${approvedGroup != null}"); + try { + final answered = await answerFaceTimeAdmissionIfAllowed( + isIncomingAdmission: isIncomingAdmission, + incomingAdmission: incomingAdmission, + correlation: claimedAdmission, + fallbackApprovedGroup: approvedGroup, + answer: (resolvedApprovedGroup) => api.answerFtRequest( + facetime: pushService.state!.ftClient, + request: facetime.field0, + approvedGroup: resolvedApprovedGroup), + ); + if (!answered) { + Logger.warn("FaceTime admission response blocked by final gate"); + return; + } + Logger.info("FaceTime web admission response sent"); + } catch (error, trace) { + Logger.error("FaceTime web admission response failed", + error: error, trace: trace); + rethrow; } - await api.answerFtRequest(facetime: pushService.state!.ftClient, request: facetime.field0, approvedGroup: approvedGroup); } return; } @@ -3787,7 +5048,8 @@ class RustPushService extends GetxService { } if (push is api.PushMessage_BeaconShared) { - notif.createBeaconInvitation(RustPushBBUtils.rustHandleToBB(push.sender), push.attributes); + notif.createBeaconInvitation( + RustPushBBUtils.rustHandleToBB(push.sender), push.attributes); return; } @@ -3812,7 +5074,10 @@ class RustPushService extends GetxService { if (myMsg.verificationFailed) return; var message = myMsg.message as api.Message_EnableSmsActivation; try { - var peerUuid = await api.convertTokenToUuid(state: pushService.state!.client, handle: myMsg.sender!, token: (myMsg.target!.first as api.MessageTarget_Token).field0); + var peerUuid = await api.convertTokenToUuid( + state: pushService.state!.client, + handle: myMsg.sender!, + token: (myMsg.target!.first as api.MessageTarget_Token).field0); if (message.field0) { ss.settings.smsForwardingTargets[myMsg.sender!] = peerUuid; } else { @@ -3833,13 +5098,15 @@ class RustPushService extends GetxService { Chat? chat; if (innerMsg.field0.chatId != null) { - if (innerMsg.field0.chatId!.contains("+") || innerMsg.field0.chatId!.contains("@")) { + if (innerMsg.field0.chatId!.contains("+") || + innerMsg.field0.chatId!.contains("@")) { chat = Chat.findByHandle(innerMsg.field0.chatId!); } else { chat = Chat.findByRustGuid(innerMsg.field0.chatId!)!; } } else { - chat = Chat.findByHandle(RustPushBBUtils.rustHandleToBB(myMsg.sender!).address); + chat = Chat.findByHandle( + RustPushBBUtils.rustHandleToBB(myMsg.sender!).address); } if (chat == null) return null; @@ -3847,22 +5114,27 @@ class RustPushService extends GetxService { if (innerMsg.field0 is api.SetTranscriptBackgroundMessage_Set) { var value = innerMsg.field0 as api.SetTranscriptBackgroundMessage_Set; - var path = "${(await getApplicationCacheDirectory()).path}/${Random().nextInt(9999999)}"; - var stream = api.downloadMmcs(aps: pushService.state!.conn, attachment: api.MMCSFile( - signature: base64.decode(value.signature), - object: value.objectId, - url: value.url, - key: base64.decode(value.key).sublist(1), - size: 0, - ), path: path); + var path = + "${(await getApplicationCacheDirectory()).path}/${Random().nextInt(9999999)}"; + var stream = api.downloadMmcs( + aps: pushService.state!.conn, + attachment: api.MMCSFile( + signature: base64.decode(value.signature), + object: value.objectId, + url: value.url, + key: base64.decode(value.key).sublist(1), + size: 0, + ), + path: path); try { await for (final event in stream) { - Logger.info("Downloaded transcript ${event.prog} bytes of ${event.total}"); + Logger.info( + "Downloaded transcript ${event.prog} bytes of ${event.total}"); } } catch (e) { try { File(path).deleteSync(); - } catch (_) { } + } catch (_) {} rethrow; } @@ -3870,16 +5142,18 @@ class RustPushService extends GetxService { File(path).deleteSync(); var poster = await api.parseTranscriptPoster(payload: data); - if (poster.poster.type is api.PosterType_TranscriptDynamic || poster.poster.type is api.PosterType_TranscriptGradient) { + if (poster.poster.type is api.PosterType_TranscriptDynamic || + poster.poster.type is api.PosterType_TranscriptGradient) { // dynamic posters are deleted posters if (chat.transcriptPosterPath != null) { await deletePoster(chat.transcriptPosterPath!); chat.transcriptPosterPath = null; chat.transcriptBackgroundVersion = innerMsg.field0.bid.toInt(); - chat.save(updateTranscriptPosterPath: true, updateTranscriptBackgroundVersion: true); + chat.save( + updateTranscriptPosterPath: true, + updateTranscriptBackgroundVersion: true); } } else { - var saved = await saveTranscriptPoster(poster); if (chat.transcriptPosterPath != null) { @@ -3888,14 +5162,18 @@ class RustPushService extends GetxService { chat.transcriptBackgroundVersion = value.bid.toInt(); chat.transcriptPosterPath = saved; - chat.save(updateTranscriptPosterPath: true, updateTranscriptBackgroundVersion: true); + chat.save( + updateTranscriptPosterPath: true, + updateTranscriptBackgroundVersion: true); } } else { if (chat.transcriptPosterPath != null) { await deletePoster(chat.transcriptPosterPath!); chat.transcriptPosterPath = null; chat.transcriptBackgroundVersion = innerMsg.field0.bid.toInt(); - chat.save(updateTranscriptPosterPath: true, updateTranscriptBackgroundVersion: true); + chat.save( + updateTranscriptPosterPath: true, + updateTranscriptBackgroundVersion: true); } } cvc(chat).chat.transcriptPosterPath = chat.transcriptPosterPath; @@ -3921,30 +5199,34 @@ class RustPushService extends GetxService { var message = myMsg.message as api.Message_UpdateProfile; ss.settings.nameAndPhotoSharing.value = message.field0.profile != null; if (message.field0.profile != null) { - ss.settings.shareProfileMessage.value = await api.encodeProfileMessage(p: message.field0.profile!); + ss.settings.shareProfileMessage.value = + await api.encodeProfileMessage(p: message.field0.profile!); // delete old data if (ss.settings.userAvatarPath.value != null) { try { - await File(ss.settings.userAvatarPath.value!).delete(); - } catch (e) { /*pass*/ } + await File(ss.settings.userAvatarPath.value!).delete(); + } catch (e) {/*pass*/} ss.settings.userAvatarPath.value = null; } if (ss.settings.userPosterPath.value != null) { try { await deletePoster(ss.settings.userPosterPath.value!); - } catch (e) { /*pass*/ } + } catch (e) {/*pass*/} ss.settings.userPosterPath.value = null; } - ss.settings.shareContactAutomatically.value = message.field0.shareContacts; + ss.settings.shareContactAutomatically.value = + message.field0.shareContacts; ss.saveSettings(); - + var profile = pushService.state?.icloudServices?.profilesClient; if (profile == null) return; - var result = await api.fetchProfile(profiles: profile, message: message.field0.profile!); + var result = await api.fetchProfile( + profiles: profile, message: message.field0.profile!); if (result.image != null) { String appDocPath = fs.appDocDir.path; - File file = File("$appDocPath/avatars/you/avatar-${result.image!.length}.jpg"); + File file = File( + "$appDocPath/avatars/you/avatar-${result.image!.length}.jpg"); if (!(await file.exists())) { await file.create(recursive: true); } @@ -3957,7 +5239,7 @@ class RustPushService extends GetxService { try { ss.settings.userPosterPath.value = await savePoster(decoded); } catch (e, t) { - Logger.error("Could not decode poster", error: e, trace: t); + Logger.error("Could not decode poster", error: e, trace: t); } } @@ -3973,8 +5255,10 @@ class RustPushService extends GetxService { if (myMsg.message is api.Message_Error) { var message = myMsg.message as api.Message_Error; var mistakeFor = Message.findOne(guid: message.field0.forUuid); - // if we've been delivered, well :shrug: probably some stray device complaining - if (mistakeFor == null || mistakeFor.isDelivered) return; // multiple errors will likely come in, at which point guid will be bad. + // if we've been delivered, well :shrug: probably some stray device complaining + if (mistakeFor == null || mistakeFor.isDelivered) { + return; // multiple errors will likely come in, at which point guid will be bad. + } // do not flag 300 error messages for self handles var myHandles = (await api.getHandles(state: pushService.state!.client)); if (!myHandles.contains(myMsg.sender)) return; @@ -3990,7 +5274,8 @@ class RustPushService extends GetxService { var data = message.field0.ext; if (data is! api.PartExtension_Sticker) return; var body = subject.attributedBody.first.toMap(); - body["runs"].first["attributes"]["sticker"] = stickerFromDart(data).toMap(); + body["runs"].first["attributes"]["sticker"] = + stickerFromDart(data).toMap(); subject.attributedBody = [AttributedBody.fromMap(body)]; subject.save(); return; @@ -4018,7 +5303,8 @@ class RustPushService extends GetxService { await notif.createFailedToSend(c); } await Message.replaceMessage(lastGuid, m); - ah.attachmentProgress.removeWhere((e) => e.item1 == lastGuid || e.item2 >= 1); + ah.attachmentProgress + .removeWhere((e) => e.item1 == lastGuid || e.item2 >= 1); } return; } @@ -4030,7 +5316,8 @@ class RustPushService extends GetxService { var msg2 = Message.findOne(guid: message); if (msg2 == null) continue; ms(msg2.getChat()!.guid).removeMessage(msg2); - msg2.dateDeleted = DateTime.fromMillisecondsSinceEpoch(msg.recoverableDeleteDate); + msg2.dateDeleted = + DateTime.fromMillisecondsSinceEpoch(msg.recoverableDeleteDate); msg2.save(); } } else if (target is api.DeleteTarget_Chat) { @@ -4063,14 +5350,14 @@ class RustPushService extends GetxService { } else { // some messages are deleted final query = (Database.messages.query(Message_.dateDeleted.notNull()) - ..link(Message_.chat, Chat_.id.equals(msg2.id!))) + ..link(Message_.chat, Chat_.id.equals(msg2.id!))) .build(); for (var message in query.find()) { for (var attachment in (message.fetchAttachments() ?? [])) { if (attachment == null) continue; try { File(attachment.getFile().path!).deleteSync(); - } catch(e) { + } catch (e) { Logger.debug("Failed to rm attachment $e"); } } @@ -4085,7 +5372,7 @@ class RustPushService extends GetxService { if (attachment == null) continue; try { File(attachment.getFile().path!).deleteSync(); - } catch(e) { + } catch (e) { Logger.debug("Failed to rm attachment $e"); } } @@ -4096,7 +5383,8 @@ class RustPushService extends GetxService { } return; } - if (myMsg.message is api.Message_Delivered || myMsg.message is api.Message_Read) { + if (myMsg.message is api.Message_Delivered || + myMsg.message is api.Message_Read) { var myHandles = (await api.getHandles(state: pushService.state!.client)); var message = Message.findOne(guid: myMsg.id); if (message == null) { @@ -4117,20 +5405,20 @@ class RustPushService extends GetxService { } if (message.chat.target!.notifsSilenced) { var lastNotifiedAnyways = message.chat.target!.dateNotifiedAnyways; - message.wasDeliveredQuietly = lastNotifiedAnyways == null || DateTime.now().difference(lastNotifiedAnyways).inMinutes > 5; + message.wasDeliveredQuietly = lastNotifiedAnyways == null || + DateTime.now().difference(lastNotifiedAnyways).inMinutes > 5; } message.save(); inq.queue(IncomingItem( - chat: message.chat.target!, - message: message, - type: QueueType.updatedMessage - )); + chat: message.chat.target!, + message: message, + type: QueueType.updatedMessage)); return; } var chat = await chatForMessage(myMsg); if (myMsg.message is api.Message_RenameMessage) { var msg = myMsg.message as api.Message_RenameMessage; - if (myMsg.verificationFailed) return; + if (myMsg.verificationFailed) return; if (!chat.lockChatName) { chat.displayName = msg.field0.newName; } @@ -4144,7 +5432,7 @@ class RustPushService extends GetxService { return; } if (myMsg.message is api.Message_Typing) { - if (myMsg.verificationFailed) return; + if (myMsg.verificationFailed) return; final controller = cvc(chat); var handle = RustPushBBUtils.rustHandleToBB(myMsg.sender!); @@ -4155,7 +5443,8 @@ class RustPushService extends GetxService { var typing = myMsg.message as api.Message_Typing; if (typing.field0) { - if (!controller.showTypingIndicatorFor.any((h) => handle.address == h.address)) { + if (!controller.showTypingIndicatorFor + .any((h) => handle.address == h.address)) { controller.showTypingIndicatorFor.add(handle); } var future = Future.delayed(const Duration(minutes: 1)); @@ -4165,7 +5454,11 @@ class RustPushService extends GetxService { }); Uint8List? icon; if (typing.field1 != null) { - String? i = es.cachedStatus.firstWhereOrNull((i) => i.madridBundleId == typing.field1!.bundleId)?.available?.icon; + String? i = es.cachedStatus + .firstWhereOrNull( + (i) => i.madridBundleId == typing.field1!.bundleId) + ?.available + ?.icon; if (i != null) { icon = base64Decode(i); } else { @@ -4174,7 +5467,8 @@ class RustPushService extends GetxService { } controller.typingIndicatorData[handle.address] = (subscription, icon); } else { - var existing = controller.showTypingIndicatorFor.firstWhereOrNull((h) => handle.address == h.address); + var existing = controller.showTypingIndicatorFor + .firstWhereOrNull((h) => handle.address == h.address); if (existing != null) { controller.showTypingIndicatorFor.remove(existing); } @@ -4183,9 +5477,10 @@ class RustPushService extends GetxService { } if (myMsg.message is api.Message_Message) { final controller = cvc(chat); - + var handle = RustPushBBUtils.rustHandleToBB(myMsg.sender!); - var existing = controller.showTypingIndicatorFor.firstWhereOrNull((h) => handle.address == h.address); + var existing = controller.showTypingIndicatorFor + .firstWhereOrNull((h) => handle.address == h.address); if (existing != null) { controller.showTypingIndicatorFor.remove(existing); } @@ -4195,15 +5490,22 @@ class RustPushService extends GetxService { } if (chat.isRpSms && !myMsg.verificationFailed) { - var myHandles = await api.getMyPhoneHandles(state: pushService.state!.client); + var myHandles = + await api.getMyPhoneHandles(state: pushService.state!.client); var service = (myMsg.message as api.Message_Message).field0.service; - if (service is api.MessageType_SMS && myHandles.contains(service.usingNumber)) { + if (service is api.MessageType_SMS && + myHandles.contains(service.usingNumber)) { var otherIds = ss.settings.smsRoutingTargets.copy(); var myToken = (myMsg.target!.first as api.MessageTarget_Token).field0; - var myId = await api.convertTokenToUuid(state: pushService.state!.client, handle: myMsg.sender!, token: myToken); + var myId = await api.convertTokenToUuid( + state: pushService.state!.client, + handle: myMsg.sender!, + token: myToken); otherIds.remove(myId); if (otherIds.isNotEmpty) { - myMsg.target = otherIds.map((element) => api.MessageTarget.uuid(element)).toList(); // forward to other devices + myMsg.target = otherIds + .map((element) => api.MessageTarget.uuid(element)) + .toList(); // forward to other devices await (backend as RustPushBackend).sendMsg(myMsg); } final msg = await pushService.reflectMessageDyn(myMsg); @@ -4216,10 +5518,12 @@ class RustPushService extends GetxService { } var msg = myMsg.message as api.Message_Message; if (msg.field0.embeddedProfile != null) { - handleSharedProfile(msg.field0.embeddedProfile!, myMsg.sender!, chat.participants); + handleSharedProfile( + msg.field0.embeddedProfile!, myMsg.sender!, chat.participants); } if ((await msg.field0.parts.rawText()) == "" && - msg.field0.parts.field0.none((p0) => p0.part_ is api.MessagePart_Attachment)) { + msg.field0.parts.field0 + .none((p0) => p0.part_ is api.MessagePart_Attachment)) { return; } } @@ -4227,11 +5531,13 @@ class RustPushService extends GetxService { final receiveId = _diagnosticHash(myMsg.id); Logger.info("rustpush_receive reflection_start id=$receiveId"); var reflected = await pushService.reflectMessageDyn(myMsg); - Logger.info("rustpush_receive reflection_complete id=$receiveId duration_ms=${_durationMs(receiveStopwatch)} reflected=${reflected != null}"); + Logger.info( + "rustpush_receive reflection_complete id=$receiveId duration_ms=${_durationMs(receiveStopwatch)} reflected=${reflected != null}"); if (reflected != null) { final queueStopwatch = Stopwatch()..start(); final queueCompletion = Completer(); - Logger.info("rustpush_receive incoming_queue_enqueue id=$receiveId pending_count=${inq.items.length}"); + Logger.info( + "rustpush_receive incoming_queue_enqueue id=$receiveId pending_count=${inq.items.length}"); await inq.queue(IncomingItem( chat: chat, message: reflected, @@ -4239,7 +5545,8 @@ class RustPushService extends GetxService { completer: queueCompletion, )); await queueCompletion.future; - Logger.info("rustpush_receive incoming_queue_complete id=$receiveId duration_ms=${_durationMs(queueStopwatch)} pending_count=${inq.items.length}"); + Logger.info( + "rustpush_receive incoming_queue_complete id=$receiveId duration_ms=${_durationMs(queueStopwatch)} pending_count=${inq.items.length}"); } } @@ -4248,12 +5555,11 @@ class RustPushService extends GetxService { var result = await placemarkFromCoordinates(lat, lng); return result.firstOrNull; } catch (e, s) { - Logger.warn("failed to native geocode, falling back to nominatim", error: e, trace: s); - var request = await http.dio.get("https://nominatim.openstreetmap.org/reverse?lat=$lat&lon=$lng&format=jsonv2&zoom=10", options: Options( - headers: { - "User-Agent": "OpenBubbles" - } - )); + Logger.warn("failed to native geocode, falling back to nominatim", + error: e, trace: s); + var request = await http.dio.get( + "https://nominatim.openstreetmap.org/reverse?lat=$lat&lon=$lng&format=jsonv2&zoom=10", + options: Options(headers: {"User-Agent": "OpenBubbles"})); // Logger.info("Got location $request"); return Placemark( name: request.data["name"], @@ -4265,13 +5571,15 @@ class RustPushService extends GetxService { ); } } - + Timer? myTimer; List subscriptions = []; Function subscribeToLocationUpdates(Function subscribe) { var timer = ((timer) async { - var subs = await api.refreshBackgroundFollowing(state: pushService.state!.icloudServices!.fmfd!, config: pushService.state!.osConfig); + var subs = await api.refreshBackgroundFollowing( + state: pushService.state!.icloudServices!.fmfd!, + config: pushService.state!.osConfig); for (var sub in subscriptions) { sub(subs); } @@ -4290,14 +5598,18 @@ class RustPushService extends GetxService { }; } - Future updateChatPoster(Chat chat) async { + Future updateChatPoster(Chat chat) async { api.SetTranscriptBackgroundMessage Function(String? chat) message; if (chat.transcriptPosterPath != null) { - api.SimplifiedTranscriptPoster poster = await api.fromTranscriptPosterSave(poster: await File("${chat.transcriptPosterPath!}.jpg").readAsBytes()); + api.SimplifiedTranscriptPoster poster = + await api.fromTranscriptPosterSave( + poster: await File("${chat.transcriptPosterPath!}.jpg") + .readAsBytes()); await restorePoster(poster.poster, chat.transcriptPosterPath!); var result = await api.packTranscriptPoster(payload: poster); - var path = "${(await getApplicationCacheDirectory()).path}/${Random().nextInt(9999999)}"; + var path = + "${(await getApplicationCacheDirectory()).path}/${Random().nextInt(9999999)}"; await File(path).writeAsBytes(result); var mmcsStream = api.uploadMmcs(aps: pushService.state!.conn, path: path); @@ -4314,56 +5626,58 @@ class RustPushService extends GetxService { File(path).deleteSync(); // ns since core data epoch - chat.transcriptBackgroundVersion = (DateTime.now().microsecondsSinceEpoch - 978307200000000) * 1000; + chat.transcriptBackgroundVersion = + (DateTime.now().microsecondsSinceEpoch - 978307200000000) * 1000; chat.save(updateTranscriptBackgroundVersion: true); message = (c) => api.SetTranscriptBackgroundMessage.set_( - aid: 1, - bid: BigInt.from(chat.transcriptBackgroundVersion), - objectId: mmcs!.object, - payloadVersion: 1, - backgroundId: uuid.v4().toUpperCase(), - url: mmcs.url, - signature: base64Encode(mmcs.signature), - key: base64Encode([0, ...mmcs.key]), - fileSize: BigInt.from(mmcs.size), - chatId: c, - ); + aid: 1, + bid: BigInt.from(chat.transcriptBackgroundVersion), + objectId: mmcs!.object, + payloadVersion: 1, + backgroundId: uuid.v4().toUpperCase(), + url: mmcs.url, + signature: base64Encode(mmcs.signature), + key: base64Encode([0, ...mmcs.key]), + fileSize: BigInt.from(mmcs.size), + chatId: c, + ); } else { chat.transcriptBackgroundVersion++; chat.save(updateTranscriptBackgroundVersion: true); message = (c) => api.SetTranscriptBackgroundMessage.remove( - aid: 1, - bid: BigInt.from(chat.transcriptBackgroundVersion), - remove: true, - chatId: c, - ); + aid: 1, + bid: BigInt.from(chat.transcriptBackgroundVersion), + remove: true, + chatId: c, + ); } var myhandle = await chat.ensureHandle(); if (chat.participants.length > 1) { var m = message(chat.guid); var msg = await api.newMsg( - conversation: await chat.getConversationData(), - message: api.Message.setTranscriptBackground(m), - sender: myhandle); + conversation: await chat.getConversationData(), + message: api.Message.setTranscriptBackground(m), + sender: myhandle); await (backend as RustPushBackend).sendMsg(msg); } else { var cv = await chat.getConversationData(); cv.participants.remove(myhandle); var msg = await api.newMsg( - conversation: cv, - message: api.Message.setTranscriptBackground(message(null)), - sender: myhandle); + conversation: cv, + message: api.Message.setTranscriptBackground(message(null)), + sender: myhandle); await (backend as RustPushBackend).sendMsg(msg); cv.participants = [myhandle]; var msg2 = await api.newMsg( - conversation: cv, - message: api.Message.setTranscriptBackground(message(chat.participants[0].address)), - sender: myhandle); + conversation: cv, + message: api.Message.setTranscriptBackground( + message(chat.participants[0].address)), + sender: myhandle); await (backend as RustPushBackend).sendMsg(msg2); } @@ -4386,17 +5700,22 @@ class RustPushService extends GetxService { await ss.saveSettings(); cs.refreshContacts(); } + await showDialog( context: Get.context!, builder: (_) { return AlertDialog( actions: [ TextButton( - child: Text("Cancel", style: Get.context!.theme.textTheme.bodyLarge!.copyWith(color: Get.context!.theme.colorScheme.primary)), + child: Text("Cancel", + style: Get.context!.theme.textTheme.bodyLarge!.copyWith( + color: Get.context!.theme.colorScheme.primary)), onPressed: () => Get.back(), ), TextButton( - child: Text("OK", style: Get.context!.theme.textTheme.bodyLarge!.copyWith(color: Get.context!.theme.colorScheme.primary)), + child: Text("OK", + style: Get.context!.theme.textTheme.bodyLarge!.copyWith( + color: Get.context!.theme.colorScheme.primary)), onPressed: () async { done.call(); }, @@ -4414,7 +5733,9 @@ class RustPushService extends GetxService { border: OutlineInputBorder(), ), ), - const SizedBox(height: 16,), + const SizedBox( + height: 16, + ), TextField( controller: user, textInputAction: TextInputAction.next, @@ -4423,7 +5744,9 @@ class RustPushService extends GetxService { border: OutlineInputBorder(), ), ), - const SizedBox(height: 16,), + const SizedBox( + height: 16, + ), TextField( controller: pass, onSubmitted: (_) => done.call(), @@ -4434,118 +5757,148 @@ class RustPushService extends GetxService { ) ], ), - title: Text("Set CardDav details", style: Get.context!.theme.textTheme.titleLarge), + title: Text("Set CardDav details", + style: Get.context!.theme.textTheme.titleLarge), backgroundColor: Get.context!.theme.colorScheme.properSurface, ); - } - ); + }); } - Future<(bool, String?)> promptPassword(api.ViableBottle bottle, String desc) async { + Future<(bool, String?)> promptPassword( + api.ViableBottle bottle, String desc) async { var context = Get.context!; bool change = false; bool obscureText = true; String? text; var codeController = TextEditingController(); await showDialog( - context: context, - builder: (_) { - return AlertDialog( - actions: [ - TextButton( - child: Text("Choose Device", style: context.theme.textTheme.bodyLarge!.copyWith(color: context.theme.colorScheme.primary)), - onPressed: () { - text = null; - change = true; - Get.back(); - }, - ), - TextButton( - child: Text("OK", style: context.theme.textTheme.bodyLarge!.copyWith(color: context.theme.colorScheme.primary)), - onPressed: () async { - text = codeController.text; - Get.back(); - }, - ), - ], - title: Text("Enter the ${bottle.numericLength > 0 ? "passcode" : "password"} for “${bottle.deviceName}”", style: context.theme.textTheme.titleLarge), - content: Column( - mainAxisSize: MainAxisSize.min, - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - Text(desc), - const SizedBox(height: 20,), - bottle.numericLength > 0 ? StatefulBuilder(builder: (context, state) => Stack( - children: [ - Row( - children: List.generate(bottle.numericLength, (index) { - var text = index < codeController.text.length ? "•" : ""; - return Expanded(child: - Container( - decoration: index == codeController.text.length ? - BoxDecoration( - border: Border.all( - color: context.theme.colorScheme.primary, - width: 2 - ), - borderRadius: const BorderRadius.all(Radius.circular(10)), - ) - : BoxDecoration( - border: Border.all( - color: context.theme.colorScheme.outline, - ), - borderRadius: const BorderRadius.all(Radius.circular(10)), - ), - margin: const EdgeInsets.all(3), - height: 50, - child: Center( - child: Text( - text, - style: context.theme.textTheme.titleLarge?.copyWith(fontSize: 40, fontWeight: FontWeight.bold) - ), - ) - ) - ); - }), - ), - Opacity( - opacity: 0, - child: TextField( - cursorColor: context.theme.colorScheme.primary, - autocorrect: false, - autofocus: true, - controller: codeController, - textInputAction: TextInputAction.next, - keyboardType: TextInputType.number, - onChanged: (v) { - state(() {}); - }, - )), - ], - )) : StatefulBuilder(builder: (context, update) => TextField( - controller: codeController, - decoration: InputDecoration( - labelText: "Password", - border: const OutlineInputBorder(), - suffixIcon: IconButton( - icon: Icon(obscureText ? Icons.visibility_off : Icons.visibility), - color: context.theme.colorScheme.outline, - onPressed: () { - update(() { - obscureText = !obscureText; - }); - }, - ), - ), - autofocus: true, - obscureText: obscureText, - )) + context: context, + builder: (_) { + return AlertDialog( + actions: [ + TextButton( + child: Text("Choose Device", + style: context.theme.textTheme.bodyLarge! + .copyWith(color: context.theme.colorScheme.primary)), + onPressed: () { + text = null; + change = true; + Get.back(); + }, + ), + TextButton( + child: Text("OK", + style: context.theme.textTheme.bodyLarge! + .copyWith(color: context.theme.colorScheme.primary)), + onPressed: () async { + text = codeController.text; + Get.back(); + }, + ), ], - ), - backgroundColor: context.theme.colorScheme.properSurface, - ); - } - ); + title: Text( + "Enter the ${bottle.numericLength > 0 ? "passcode" : "password"} for “${bottle.deviceName}”", + style: context.theme.textTheme.titleLarge), + content: Column( + mainAxisSize: MainAxisSize.min, + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Text(desc), + const SizedBox( + height: 20, + ), + bottle.numericLength > 0 + ? StatefulBuilder( + builder: (context, state) => Stack( + children: [ + Row( + children: List.generate(bottle.numericLength, + (index) { + var text = + index < codeController.text.length + ? "•" + : ""; + return Expanded( + child: Container( + decoration: index == + codeController.text.length + ? BoxDecoration( + border: Border.all( + color: context + .theme + .colorScheme + .primary, + width: 2), + borderRadius: + const BorderRadius.all( + Radius.circular( + 10)), + ) + : BoxDecoration( + border: Border.all( + color: context.theme + .colorScheme.outline, + ), + borderRadius: + const BorderRadius.all( + Radius.circular( + 10)), + ), + margin: const EdgeInsets.all(3), + height: 50, + child: Center( + child: Text(text, + style: context.theme.textTheme + .titleLarge + ?.copyWith( + fontSize: 40, + fontWeight: + FontWeight.bold)), + ))); + }), + ), + Opacity( + opacity: 0, + child: TextField( + cursorColor: + context.theme.colorScheme.primary, + autocorrect: false, + autofocus: true, + controller: codeController, + textInputAction: TextInputAction.next, + keyboardType: TextInputType.number, + onChanged: (v) { + state(() {}); + }, + )), + ], + )) + : StatefulBuilder( + builder: (context, update) => TextField( + controller: codeController, + decoration: InputDecoration( + labelText: "Password", + border: const OutlineInputBorder(), + suffixIcon: IconButton( + icon: Icon(obscureText + ? Icons.visibility_off + : Icons.visibility), + color: context.theme.colorScheme.outline, + onPressed: () { + update(() { + obscureText = !obscureText; + }); + }, + ), + ), + autofocus: true, + obscureText: obscureText, + )) + ], + ), + backgroundColor: context.theme.colorScheme.properSurface, + ); + }); return (change, text); } @@ -4553,7 +5906,8 @@ class RustPushService extends GetxService { // See 'How to Get Google OAuth Credentials' section below params: const GoogleSignInParams( clientId: clientId, - clientSecret: clientSecret, // Don't worry - not truly a secret! See 'Client Secret Requirements' + clientSecret: + clientSecret, // Don't worry - not truly a secret! See 'Client Secret Requirements' scopes: ['https://www.googleapis.com/auth/carddav'], ), ); @@ -4563,46 +5917,50 @@ class RustPushService extends GetxService { api.ViableBottle? newBottle; var promptReset = false; await showDialog( - context: context, - builder: (_) { - return AlertDialog( - actions: [ - TextButton( - child: Text("Don't know any passwords", style: context.theme.textTheme.bodyLarge!.copyWith(color: context.theme.colorScheme.primary)), - onPressed: () { - promptReset = true; - Get.back(); - }, - ), - ], - title: Text("Choose a device", style: context.theme.textTheme.titleLarge), - content: SingleChildScrollView( - child: Column( - mainAxisSize: MainAxisSize.min, - crossAxisAlignment: CrossAxisAlignment.stretch, - children: bottles.map((bottle) => Material( // provides a Material ancestor for the ripple - color: Colors.transparent, - child: InkWell( - onTap: () { - newBottle = bottle; - Get.back(); - }, - child: Padding( - padding: const EdgeInsets.symmetric(vertical: 12), - child: Text( - bottle.deviceName, - style: Theme.of(context).textTheme.titleMedium, - ), - ), - ), - - )).toList(), + context: context, + builder: (_) { + return AlertDialog( + actions: [ + TextButton( + child: Text("Don't know any passwords", + style: context.theme.textTheme.bodyLarge! + .copyWith(color: context.theme.colorScheme.primary)), + onPressed: () { + promptReset = true; + Get.back(); + }, + ), + ], + title: Text("Choose a device", + style: context.theme.textTheme.titleLarge), + content: SingleChildScrollView( + child: Column( + mainAxisSize: MainAxisSize.min, + crossAxisAlignment: CrossAxisAlignment.stretch, + children: bottles + .map((bottle) => Material( + // provides a Material ancestor for the ripple + color: Colors.transparent, + child: InkWell( + onTap: () { + newBottle = bottle; + Get.back(); + }, + child: Padding( + padding: const EdgeInsets.symmetric(vertical: 12), + child: Text( + bottle.deviceName, + style: Theme.of(context).textTheme.titleMedium, + ), + ), + ), + )) + .toList(), + ), ), - ), - backgroundColor: context.theme.colorScheme.properSurface, - ); - } - ); + backgroundColor: context.theme.colorScheme.properSurface, + ); + }); if (promptReset) { await promptResetData(false); } @@ -4612,90 +5970,125 @@ class RustPushService extends GetxService { Future promptResetData(bool mandatory) async { var context = Get.context!; await showDialog( - context: context, - builder: (_) { - return AlertDialog( - actions: [ - TextButton( - child: Text("Cancel", style: context.theme.textTheme.bodyLarge!.copyWith(color: context.theme.colorScheme.primary)), - onPressed: () { - Get.back(); - }, - ), - TextButton( - child: Text("Reset encrypted data", style: context.theme.textTheme.bodyLarge!.copyWith(color: context.theme.colorScheme.primary)), - onPressed: () async { - var defaultPassword = Random.secure().nextInt(1000000).toString().padLeft(6, '0'); - ss.settings.keychainDefaultPassword.value = defaultPassword; - ss.saveSettings(); - - Get.back(); - await wrapPromise(api.resetClique(keychain: pushService.state!.icloudServices!.keychain!, cloudMessages: pushService.state!.icloudServices!.cloudMessagesClient!, devicePassword: defaultPassword), "Resetting clique..."); - - showDialog( - context: Get.context!, - builder: (_) { - return AlertDialog( - actions: [ - TextButton( - child: Text("Ok", style: Get.context!.theme.textTheme.bodyLarge!.copyWith(color: Get.context!.theme.colorScheme.primary)), - onPressed: () async { - Get.back(); - }, - ), - ], - title: Text("Encrypted data reset", style: Get.context!.theme.textTheme.titleLarge), - content: Text.rich( - TextSpan( - text: "This device's iCloud Keychain code is ", - style: Get.context!.theme.textTheme.bodyLarge, - children: [ - TextSpan( - text: '${ss.settings.keychainDefaultPassword.value}', - style: const TextStyle(fontWeight: FontWeight.bold), - ), - const TextSpan( - text: '.', - ), - const TextSpan( - text: '\n\nYou will need this code to sync iCloud data on other devices. ', - style: TextStyle(fontWeight: FontWeight.bold), - ), - const TextSpan( - text: 'This code can be found again in Settings -> Device.', + context: context, + builder: (_) { + return AlertDialog( + actions: [ + TextButton( + child: Text("Cancel", + style: context.theme.textTheme.bodyLarge! + .copyWith(color: context.theme.colorScheme.primary)), + onPressed: () { + Get.back(); + }, + ), + TextButton( + child: Text("Reset encrypted data", + style: context.theme.textTheme.bodyLarge! + .copyWith(color: context.theme.colorScheme.primary)), + onPressed: () async { + var defaultPassword = Random.secure() + .nextInt(1000000) + .toString() + .padLeft(6, '0'); + ss.settings.keychainDefaultPassword.value = defaultPassword; + ss.saveSettings(); + + Get.back(); + await wrapPromise( + _runCloudKitDestructiveReset( + () => api.resetClique( + keychain: + pushService.state!.icloudServices!.keychain!, + cloudMessages: pushService + .state!.icloudServices!.cloudMessagesClient!, + devicePassword: defaultPassword), + ), + "Resetting clique..."); + + showDialog( + context: Get.context!, + builder: (_) { + return AlertDialog( + actions: [ + TextButton( + child: Text("Ok", + style: Get.context!.theme.textTheme.bodyLarge! + .copyWith( + color: Get.context!.theme.colorScheme + .primary)), + onPressed: () async { + Get.back(); + }, ), ], - ), - ), - backgroundColor: Get.context!.theme.colorScheme.properSurface, - ); - } - ); - }, - ), - ], - title: Text("Reset data?", style: context.theme.textTheme.titleLarge), - content: Text(mandatory ? "Your encrypted data needs to be reset." : "If you can't remember the credentials to any of your devices, you won't be able to recover your data.", style: context.theme.textTheme.bodyLarge), - backgroundColor: context.theme.colorScheme.properSurface, - ); - } - ); + title: Text("Encrypted data reset", + style: Get.context!.theme.textTheme.titleLarge), + content: Text.rich( + TextSpan( + text: "This device's iCloud Keychain code is ", + style: Get.context!.theme.textTheme.bodyLarge, + children: [ + TextSpan( + text: + '${ss.settings.keychainDefaultPassword.value}', + style: const TextStyle( + fontWeight: FontWeight.bold), + ), + const TextSpan( + text: '.', + ), + const TextSpan( + text: + '\n\nYou will need this code to sync iCloud data on other devices. ', + style: TextStyle(fontWeight: FontWeight.bold), + ), + const TextSpan( + text: + 'This code can be found again in Settings -> Device.', + ), + ], + ), + ), + backgroundColor: + Get.context!.theme.colorScheme.properSurface, + ); + }); + }, + ), + ], + title: + Text("Reset data?", style: context.theme.textTheme.titleLarge), + content: Text( + mandatory + ? "Your encrypted data needs to be reset." + : "If you can't remember the credentials to any of your devices, you won't be able to recover your data.", + style: context.theme.textTheme.bodyLarge), + backgroundColor: context.theme.colorScheme.properSurface, + ); + }); } Future attemptBottle(api.ViableBottle bottle) async { - var desc = "Your device's password is required to access end-to-end encrypted data in iCloud."; + var desc = + "Your device's password is required to access end-to-end encrypted data in iCloud."; while (true) { var (change, password) = await promptPassword(bottle, desc); if (change) return 2; if (password == null) return 1; - var defaultPassword = Random.secure().nextInt(1000000).toString().padLeft(6, '0'); + var defaultPassword = + Random.secure().nextInt(1000000).toString().padLeft(6, '0'); ss.settings.keychainDefaultPassword.value = defaultPassword; ss.saveSettings(); - if(!await wrapPromise((() async { + if (!await wrapPromise((() async { try { - await api.joinCliqueWithBottle(keychain: pushService.state!.icloudServices!.keychain!, bottle: bottle.escrow, password: password, devicePassword: defaultPassword); + await api.joinCliqueWithBottle( + keychain: pushService.state!.icloudServices!.keychain!, + bottle: bottle.escrow, + password: password, + devicePassword: defaultPassword); } catch (e) { if (e is AnyhowException) { if (e.message.contains("Credential is not verified.")) { @@ -4717,30 +6110,30 @@ class RustPushService extends GetxService { Future wrapPromise(Future inner, String text) async { showDialog( - context: Get.context!, - builder: (BuildContext context) { - return AlertDialog( - backgroundColor: context.theme.colorScheme.properSurface, - title: Text( - text, - style: context.theme.textTheme.titleLarge, - ), - content: Container( - height: 70, - child: Center( - child: CircularProgressIndicator( - backgroundColor: context.theme.colorScheme.properSurface, - valueColor: AlwaysStoppedAnimation(context.theme.colorScheme.primary), + context: Get.context!, + builder: (BuildContext context) { + return AlertDialog( + backgroundColor: context.theme.colorScheme.properSurface, + title: Text( + text, + style: context.theme.textTheme.titleLarge, + ), + content: Container( + height: 70, + child: Center( + child: CircularProgressIndicator( + backgroundColor: context.theme.colorScheme.properSurface, + valueColor: AlwaysStoppedAnimation( + context.theme.colorScheme.primary), + ), ), ), - ), - ); - } - ); + ); + }); T result; try { result = await inner; - } catch (e, s) { + } catch (e) { Get.back(); showSnackbar("Failure! Please try again", e.toString()); rethrow; @@ -4750,7 +6143,8 @@ class RustPushService extends GetxService { } Future checkClique() async { - var isInClique = await api.isInClique(keychain: pushService.state!.icloudServices!.keychain!); + var isInClique = await api.isInClique( + keychain: pushService.state!.icloudServices!.keychain!); cachedInClique = isInClique; return isInClique; } @@ -4760,12 +6154,14 @@ class RustPushService extends GetxService { if (isInClique) return true; var bottles = await wrapPromise( - api.getBottles(keychain: pushService.state!.icloudServices!.keychain!).timeout( - const Duration(seconds: 30), - onTimeout: () => throw TimeoutException( - "Apple did not return recovery data within 30 seconds.", - ), - ), + api + .getBottles(keychain: pushService.state!.icloudServices!.keychain!) + .timeout( + const Duration(seconds: 30), + onTimeout: () => throw TimeoutException( + "Apple did not return recovery data within 30 seconds.", + ), + ), "Fetching Bottles...", ); @@ -4773,10 +6169,10 @@ class RustPushService extends GetxService { await promptResetData(true); return await checkClique(); } - + api.ViableBottle? bottle = bottles[0]; - while(await attemptBottle(bottle!) == 2) { + while (await attemptBottle(bottle!) == 2) { bottle = await promptChange(bottles); if (bottle == null) { return await checkClique(); @@ -4796,15 +6192,13 @@ class RustPushService extends GetxService { groupActionType: chat.transcriptPosterPath != null ? 1 : 2, ); - inq.queue(IncomingItem( - chat: chat, - message: msg, - type: QueueType.newMessage - )); + inq.queue( + IncomingItem(chat: chat, message: msg, type: QueueType.newMessage)); } api.TextFormat defaultFormat() { - return const api.TextFormat.flags(api.TextFlags(bold: false, italic: false, underline: false, strikethrough: false)); + return const api.TextFormat.flags(api.TextFlags( + bold: false, italic: false, underline: false, strikethrough: false)); } api.TextFormat fromAttributes(Attributes attributes) { @@ -4840,7 +6234,8 @@ class RustPushService extends GetxService { return b.toBytes(); } - Future uploadCode(bool allowSharing, api.DeviceInfo deviceInfo) async { + Future uploadCode( + bool allowSharing, api.DeviceInfo deviceInfo) async { var data = getQrInfo(allowSharing, deviceInfo.encodedData!); if (allowSharing) { return base64Encode(data); @@ -4851,7 +6246,7 @@ class RustPushService extends GetxService { String code = "MB"; for (var i = 0; i < 4; i++) { code += String.fromCharCodes(Iterable.generate( - 4, (_) => _chars.codeUnitAt(_rnd.nextInt(_chars.length)))); + 4, (_) => _chars.codeUnitAt(_rnd.nextInt(_chars.length)))); if (i != 3) { code += "-"; } @@ -4861,34 +6256,32 @@ class RustPushService extends GetxService { var encrypted = encryptAESCryptoJS(data, code); showDialog( - context: Get.context!, - barrierDismissible: false, - builder: (BuildContext context) { - return AlertDialog( - backgroundColor: context.theme.colorScheme.properSurface, - title: Text( - "Creating code...", - style: context.theme.textTheme.titleLarge, - ), - content: Container( - height: 70, - child: Center( - child: CircularProgressIndicator( - backgroundColor: context.theme.colorScheme.properSurface, - valueColor: AlwaysStoppedAnimation(context.theme.colorScheme.primary), + context: Get.context!, + barrierDismissible: false, + builder: (BuildContext context) { + return AlertDialog( + backgroundColor: context.theme.colorScheme.properSurface, + title: Text( + "Creating code...", + style: context.theme.textTheme.titleLarge, + ), + content: Container( + height: 70, + child: Center( + child: CircularProgressIndicator( + backgroundColor: context.theme.colorScheme.properSurface, + valueColor: AlwaysStoppedAnimation( + context.theme.colorScheme.primary), + ), ), ), - ), - ); - }); + ); + }); try { - final response = await http.dio.post( - rpApiRoot, - data: { - "data": encrypted, - "id": hash, - } - ); + final response = await http.dio.post(rpApiRoot, data: { + "data": encrypted, + "id": hash, + }); if (response.statusCode != 200) { throw Exception("bad!"); } @@ -4901,14 +6294,17 @@ class RustPushService extends GetxService { } } - Future markAsHandledAfter(String ptr, {required String eventId, required int retry}) async { + Future markAsHandledAfter(String ptr, + {required String eventId, required int retry}) async { final ackStopwatch = Stopwatch()..start(); // handleMsg awaits the completion for this pointer's queue item. Do not // wait for unrelated incoming work before acknowledging this message. - Logger.info("rustpush_receive durable_work_complete id=$eventId retry=$retry pending_count=${inq.items.length}"); + Logger.info( + "rustpush_receive durable_work_complete id=$eventId retry=$retry pending_count=${inq.items.length}"); Logger.info("rustpush_receive ack_commit id=$eventId retry=$retry"); await api.completeMsg(ptr: ptr); - Logger.info("rustpush_receive ack_complete id=$eventId retry=$retry duration_ms=${_durationMs(ackStopwatch)}"); + Logger.info( + "rustpush_receive ack_complete id=$eventId retry=$retry duration_ms=${_durationMs(ackStopwatch)}"); } Future recievedMsgPointer(String pointer, String retry) async { @@ -4917,18 +6313,23 @@ class RustPushService extends GetxService { final receiveStopwatch = Stopwatch()..start(); var message = await api.ptrToDart(ptr: pointer); if (message == null) { - Logger.info("rustpush_receive pointer_missing id=$eventId retry=$retryCount"); + Logger.info( + "rustpush_receive pointer_missing id=$eventId retry=$retryCount"); return; } final initStopwatch = Stopwatch()..start(); - Logger.info("rustpush_receive aps_init_wait_start id=$eventId retry=$retryCount"); + Logger.info( + "rustpush_receive aps_init_wait_start id=$eventId retry=$retryCount"); await initFuture; - Logger.info("rustpush_receive aps_init_wait_complete id=$eventId retry=$retryCount duration_ms=${_durationMs(initStopwatch)} total_ms=${_durationMs(receiveStopwatch)}"); + Logger.info( + "rustpush_receive aps_init_wait_complete id=$eventId retry=$retryCount duration_ms=${_durationMs(initStopwatch)} total_ms=${_durationMs(receiveStopwatch)}"); try { final handlingStopwatch = Stopwatch()..start(); - Logger.info("rustpush_receive handle_start id=$eventId retry=$retryCount"); + Logger.info( + "rustpush_receive handle_start id=$eventId retry=$retryCount"); await handleMsg(message); - Logger.info("rustpush_receive handle_complete id=$eventId retry=$retryCount duration_ms=${_durationMs(handlingStopwatch)} total_ms=${_durationMs(receiveStopwatch)}"); + Logger.info( + "rustpush_receive handle_complete id=$eventId retry=$retryCount duration_ms=${_durationMs(handlingStopwatch)} total_ms=${_durationMs(receiveStopwatch)}"); await markAsHandledAfter(pointer, eventId: eventId, retry: retryCount); } catch (e, s) { Logger.error("Handle failed", error: e, trace: s); @@ -4938,10 +6339,12 @@ class RustPushService extends GetxService { } } - void doPoll(api.ApsWatcher watcher, lib.ArcSharedPushState sharedPushState) async { + void doPoll( + api.ApsWatcher watcher, lib.ArcSharedPushState sharedPushState) async { while (true) { try { - var msgRaw = await api.recvWait(state: sharedPushState, watcher: watcher); + var msgRaw = + await api.recvWait(state: sharedPushState, watcher: watcher); if (msgRaw is api.PollResult_Stop) { break; } @@ -4973,14 +6376,16 @@ class RustPushService extends GetxService { Future setupZenMode(bool val) async { if (val) { if (pushService.state?.icloudServices?.statuskitClient == null) { - showSnackbar("Relog Required", "Re-log in Settings -> Reconfigure to use zen modes"); + showSnackbar("Relog Required", + "Re-log in Settings -> Reconfigure to use zen modes"); ss.settings.zenModeAware.value = false; ss.saveSettings(); return false; } if (!await mcs.invokeMethod("zen-mode-setup")) return false; } - await mcs.invokeMethod("zen-mode-uuid", {"key": val ? "enable" : "disable"}); + await mcs + .invokeMethod("zen-mode-uuid", {"key": val ? "enable" : "disable"}); ss.settings.enableShareZen.value = val; ss.settings.zenModeAware.value = true; ss.saveSettings(); @@ -4988,7 +6393,9 @@ class RustPushService extends GetxService { } void onboardZenMode() async { - if (ss.settings.zenModeAware.value || !ss.settings.finishedSetup.value) return; + if (ss.settings.zenModeAware.value || !ss.settings.finishedSetup.value) { + return; + } String? currentMode = await mcs.invokeMethod("get-zen-mode"); if (currentMode == null) return; ss.settings.zenModeAware.value = true; @@ -4998,25 +6405,31 @@ class RustPushService extends GetxService { context: Get.context!, barrierDismissible: false, builder: (context) => AlertDialog( - backgroundColor: Get.theme.colorScheme.properSurface, - title: Text("Allow OpenBubbles to share that you have notifications silenced?", style: Get.textTheme.titleLarge), - content: Text( - "When you're using Do Not Disturb or other modes, OpenBubbles will share with your contacts that you have notifications silenced. Focus sharing on other devices will be turned off.", - style: Get.textTheme.bodyLarge, - ), - actions: [ - TextButton( - onPressed: () => Get.back(), - child: Text("Don't allow", style: Get.textTheme.bodyLarge!.copyWith(color: Get.theme.colorScheme.primary))), - TextButton( - onPressed: () async { - if (await setupZenMode(true)) { - Get.back(); - } - }, - child: Text("Allow", style: Get.textTheme.bodyLarge!.copyWith(color: Get.theme.colorScheme.primary))) - ], - )); + backgroundColor: Get.theme.colorScheme.properSurface, + title: Text( + "Allow OpenBubbles to share that you have notifications silenced?", + style: Get.textTheme.titleLarge), + content: Text( + "When you're using Do Not Disturb or other modes, OpenBubbles will share with your contacts that you have notifications silenced. Focus sharing on other devices will be turned off.", + style: Get.textTheme.bodyLarge, + ), + actions: [ + TextButton( + onPressed: () => Get.back(), + child: Text("Don't allow", + style: Get.textTheme.bodyLarge! + .copyWith(color: Get.theme.colorScheme.primary))), + TextButton( + onPressed: () async { + if (await setupZenMode(true)) { + Get.back(); + } + }, + child: Text("Allow", + style: Get.textTheme.bodyLarge! + .copyWith(color: Get.theme.colorScheme.primary))) + ], + )); } void offerHostedRefund(bool revoke) async { @@ -5024,32 +6437,42 @@ class RustPushService extends GetxService { context: Get.context!, barrierDismissible: false, builder: (context) => AlertDialog( - backgroundColor: Get.theme.colorScheme.properSurface, - title: Text("Get a refund?", style: Get.textTheme.titleLarge), - content: Text(revoke ? "You're subscribed but we don't have a device for you at this time. You can come back later, or, get a refund here. After your refund, your subscription will be cancelled." : "You're subscribed but we don't have a device for you at this time. This is on us. We usually keep devices in reserve for customers in good standing, however, for some reason, all of them are offline. If you choose to take a refund, you will get the month free and can still use OpenBubbles when we have gotten our affairs in order.", - style: Get.textTheme.bodyLarge, - ), - actions: [ - TextButton( - onPressed: () => Get.back(), - child: Text("Cancel", style: Get.textTheme.bodyLarge!.copyWith(color: Get.theme.colorScheme.primary))), - TextButton( - onPressed: () async { - Get.back(); - await wrapPromise((() async { - var details = (await pushService.getPurchaseDetails())?.purchaseToken; - details ??= ss.settings.hostedToken.value; - - var activated = await http.dio.post("https://hw.openbubbles.app/refund-token", data: {"purchase_token": details}); - if (activated.statusCode != 200) { - throw Exception("Failed to refund ${activated.data}"); - } - })(), "Refunding..."); - showSnackbar("Success", "Refund succeded!"); - }, - child: Text("Refund", style: Get.textTheme.bodyLarge!.copyWith(color: Get.theme.colorScheme.primary))) - ], - )); + backgroundColor: Get.theme.colorScheme.properSurface, + title: Text("Get a refund?", style: Get.textTheme.titleLarge), + content: Text( + revoke + ? "You're subscribed but we don't have a device for you at this time. You can come back later, or, get a refund here. After your refund, your subscription will be cancelled." + : "You're subscribed but we don't have a device for you at this time. This is on us. We usually keep devices in reserve for customers in good standing, however, for some reason, all of them are offline. If you choose to take a refund, you will get the month free and can still use OpenBubbles when we have gotten our affairs in order.", + style: Get.textTheme.bodyLarge, + ), + actions: [ + TextButton( + onPressed: () => Get.back(), + child: Text("Cancel", + style: Get.textTheme.bodyLarge! + .copyWith(color: Get.theme.colorScheme.primary))), + TextButton( + onPressed: () async { + Get.back(); + await wrapPromise((() async { + var details = (await pushService.getPurchaseDetails()) + ?.purchaseToken; + details ??= ss.settings.hostedToken.value; + + var activated = await http.dio.post( + "https://hw.openbubbles.app/refund-token", + data: {"purchase_token": details}); + if (activated.statusCode != 200) { + throw Exception("Failed to refund ${activated.data}"); + } + })(), "Refunding..."); + showSnackbar("Success", "Refund succeded!"); + }, + child: Text("Refund", + style: Get.textTheme.bodyLarge! + .copyWith(color: Get.theme.colorScheme.primary))) + ], + )); } void tryWarnVpn() async { @@ -5058,21 +6481,23 @@ class RustPushService extends GetxService { ss.settings.vpnWarned.value = true; await ss.saveSettings(); await showDialog( - context: Get.context!, - barrierDismissible: false, - builder: (context) => AlertDialog( - backgroundColor: Get.theme.colorScheme.properSurface, - title: Text("VPN warning", style: Get.textTheme.titleLarge), - content: Text( - "It appears you may be using a VPN. Apple blocks some VPN servers from using iMessage as real iDevices bypass them. Exclude OpenBubbles from your VPN app if you have trouble sending messages.", - style: Get.textTheme.bodyLarge, - ), - actions: [ - TextButton( - onPressed: () => Get.back(), - child: Text("Got it", style: Get.textTheme.bodyLarge!.copyWith(color: Get.theme.colorScheme.primary))) - ], - )); + context: Get.context!, + barrierDismissible: false, + builder: (context) => AlertDialog( + backgroundColor: Get.theme.colorScheme.properSurface, + title: Text("VPN warning", style: Get.textTheme.titleLarge), + content: Text( + "It appears you may be using a VPN. Apple blocks some VPN servers from using iMessage as real iDevices bypass them. Exclude OpenBubbles from your VPN app if you have trouble sending messages.", + style: Get.textTheme.bodyLarge, + ), + actions: [ + TextButton( + onPressed: () => Get.back(), + child: Text("Got it", + style: Get.textTheme.bodyLarge! + .copyWith(color: Get.theme.colorScheme.primary))) + ], + )); Logger.info("VPN connected."); } } @@ -5082,7 +6507,9 @@ class RustPushService extends GetxService { void handleAppLink(Uri link) async { var text = link.toString(); Logger.info("Got uri stream $text"); - if ((text.startsWith("https://hw.openbubbles.app/ticket/") || text.startsWith("https://hw.openbubbles.app/waitlist/")) && ss.settings.finishedSetup.value) { + if ((text.startsWith("https://hw.openbubbles.app/ticket/") || + text.startsWith("https://hw.openbubbles.app/waitlist/")) && + ss.settings.finishedSetup.value) { showDialog( barrierDismissible: true, context: Get.context!, @@ -5090,43 +6517,29 @@ class RustPushService extends GetxService { return AlertDialog( title: Text( "Welcome to Hosted!", - style: context - .theme.textTheme.titleLarge, + style: context.theme.textTheme.titleLarge, ), content: Text( "To get started, you'll have to drop your old device. Re-login will be required. No messages will be deleted.", - style: context - .theme.textTheme.bodyLarge, + style: context.theme.textTheme.bodyLarge, ), - backgroundColor: context.theme - .colorScheme.properSurface, + backgroundColor: context.theme.colorScheme.properSurface, actions: [ TextButton( child: Text("Not yet", - style: context.theme - .textTheme.bodyLarge! - .copyWith( - color: context - .theme - .colorScheme - .primary)), + style: context.theme.textTheme.bodyLarge! + .copyWith(color: context.theme.colorScheme.primary)), onPressed: () { Navigator.of(context).pop(); }, ), TextButton( - child: Text("Continue", - style: context.theme - .textTheme.bodyLarge! - .copyWith( - color: context - .theme - .colorScheme - .primary)), - onPressed: () async { - pushService.markFailedToLogin(hw: true, ui: true); - } - ), + child: Text("Continue", + style: context.theme.textTheme.bodyLarge! + .copyWith(color: context.theme.colorScheme.primary)), + onPressed: () async { + pushService.markFailedToLogin(hw: true, ui: true); + }), ], ); }, @@ -5141,30 +6554,35 @@ class RustPushService extends GetxService { if (subscribing) return; subscribing = true; showDialog( - context: Get.context!, - barrierDismissible: false, - builder: (BuildContext context) { - return AlertDialog( - backgroundColor: context.theme.colorScheme.properSurface, - title: Text( - "Subscribing...", - style: context.theme.textTheme.titleLarge, - ), - content: Container( - height: 70, - child: Center(child: buildProgressIndicator(context)), - ), - ); - } - ); + context: Get.context!, + barrierDismissible: false, + builder: (BuildContext context) { + return AlertDialog( + backgroundColor: context.theme.colorScheme.properSurface, + title: Text( + "Subscribing...", + style: context.theme.textTheme.titleLarge, + ), + content: Container( + height: 70, + child: Center(child: buildProgressIndicator(context)), + ), + ); + }); try { try { - await api.subscribeToken(lock: pushService.state!.icloudServices!.sharedstreams!, token: invitationId); + await api.subscribeToken( + lock: pushService.state!.icloudServices!.sharedstreams!, + token: invitationId); } catch (e) { // sometimes first one can give 500, try again - await api.subscribeToken(lock: pushService.state!.icloudServices!.sharedstreams!, token: invitationId); + await api.subscribeToken( + lock: pushService.state!.icloudServices!.sharedstreams!, + token: invitationId); } - await api.getAlbums(lock: pushService.state!.icloudServices!.sharedstreams!, refresh: true); + await api.getAlbums( + lock: pushService.state!.icloudServices!.sharedstreams!, + refresh: true); } catch (e, stack) { Logger.error("Failed to subscribe!!", error: e, trace: stack); Get.back(); @@ -5182,8 +6600,8 @@ class RustPushService extends GetxService { var link = await _appLinks.getLatestLink(); if (link != null) handleAppLink(link); - final sub = _appLinks.uriLinkStream.listen((uri) { - handleAppLink(uri); + _appLinks.uriLinkStream.listen((uri) { + handleAppLink(uri); }); } @@ -5192,7 +6610,8 @@ class RustPushService extends GetxService { if (state == null) { return; } - if (!ss.settings.deviceIsHosted.value || ss.settings.hostedToken.value == null) return; + if (!ss.settings.deviceIsHosted.value || + ss.settings.hostedToken.value == null) return; var detail = await checkPurchaseState(); if (!detail) { if (!notifiedSubFailed) { @@ -5229,6 +6648,7 @@ class RustPushService extends GetxService { @override Future onInit() async { super.onInit(); + _watchNetworkChanges(); api.doFirstTimeInit(path: fs.appDocDir.path); initFuture = (() async { statePath = (await getApplicationSupportDirectory()).path; @@ -5242,7 +6662,7 @@ class RustPushService extends GetxService { if (serviceId != "0") { state = await api.serviceFromPtr(ptr: serviceId); } - + Logger.info("service"); } else { var data = await api.SharedPushState.restore(path: fs.appDocDir.path); @@ -5256,45 +6676,72 @@ class RustPushService extends GetxService { ss.settings.finishedSetup.value = false; ss.saveSettings(); try { - Get.offAll(() => PopScope( - canPop: false, - child: TitleBarWrapper(child: SetupView()), - ), duration: Duration.zero, transition: Transition.noTransition); - } catch (e) { } + Get.offAll( + () => PopScope( + canPop: false, + child: TitleBarWrapper(child: SetupView()), + ), + duration: Duration.zero, + transition: Transition.noTransition); + } catch (e, s) { + Logger.warn( + "Failed to return to setup after registration state changed", + error: e, + trace: s); + } } if (state != null && !ss.settings.finishedSetup.value) { handleRegistered(); ss.settings.finishedSetup.value = true; ss.saveSettings(); try { - Get.offAll(() => ConversationList( - showArchivedChats: false, - showUnknownSenders: false, - ), - routeName: "", - duration: Duration.zero, - transition: Transition.noTransition - ); + Get.offAll( + () => ConversationList( + showArchivedChats: false, + showUnknownSenders: false, + ), + routeName: "", + duration: Duration.zero, + transition: Transition.noTransition); Get.delete(force: true); - } catch (e) { } + } catch (e, s) { + Logger.warn("Failed to show the conversation list after registration", + error: e, trace: s); + } } Timer.periodic(const Duration(days: 1), (timer) => validateSubState()); validateSubState(); if (ls.isUiThread) { Timer.periodic(const Duration(days: 1), (timer) async { - if (state == null) return; - var passwords = state!.icloudServices?.passwords; - if (passwords != null) { - api.syncPasswords(passwords: passwords, conn: state!.conn); + final currentState = state; + if (currentState == null) { + return; + } + try { + final passwords = currentState.icloudServices?.passwords; + if (passwords != null) { + await api.syncPasswords( + passwords: passwords, conn: currentState.conn); + } + if (!ss.settings.cloudSyncingEnabled.value) { + return; + } + Logger.info("Doing scheduled CloudKit sync"); + await pushService.doCloudKitSync(); + } catch (e, stackTrace) { + Logger.warn("Scheduled CloudKit maintenance failed", + error: e, trace: stackTrace); } - if (!ss.settings.cloudSyncingEnabled.value) return; - Logger.info("Doing cloudkit sync!"); - await pushService.doCloudKitSync(); }); if (state != null) { var passwords = state!.icloudServices?.passwords; if (passwords != null) { - api.syncPasswords(passwords: passwords, conn: state!.conn); + try { + await api.syncPasswords(passwords: passwords, conn: state!.conn); + } catch (e, stackTrace) { + Logger.warn("Initial iCloud Passwords sync failed", + error: e, trace: stackTrace); + } } if (ss.settings.cloudSyncingEnabled.value) { Logger.info("Doing cloudkit sync!"); @@ -5306,7 +6753,13 @@ class RustPushService extends GetxService { } var keychain = pushService.state?.icloudServices?.keychain; if (keychain != null) { - cachedInClique = await api.isInClique(keychain: keychain); + try { + cachedInClique = await api.isInClique(keychain: keychain); + } catch (e, stackTrace) { + cachedInClique = false; + Logger.warn("Unable to read initial iCloud clique state", + error: e, trace: stackTrace); + } } } })(); @@ -5314,17 +6767,25 @@ class RustPushService extends GetxService { initAppLinks(); initMixPanel(); await initFuture; + if (state != null) { + try { + _applyAppleNetworkStatus( + await api.getApsConnectionStatus(aps: state!.conn), + ); + } catch (e, s) { + Logger.warn("Failed to read initial Apple Push status", + error: e, trace: s); + } + } try { await restoreRelayHealthState(); } catch (e, s) { - Logger.warn("Failed to restore iPhone relay health", - error: e, trace: s); + Logger.warn("Failed to restore iPhone relay health", error: e, trace: s); await clearRelayHealthState(); } if (state != null) { try { - final registrationState = - await api.getRegstate(state: state!.client); + final registrationState = await api.getRegstate(state: state!.client); if (registrationState is api.RegisterState_Registered) { await scheduleRelayHealthReminder(registrationState.nextS); } @@ -5337,16 +6798,17 @@ class RustPushService extends GetxService { // pre-cache next FT link if (pushService.state != null) { api - .getFtLink( - facetime: pushService.state!.ftClient, - usage: "next") + .getFtLink(facetime: pushService.state!.ftClient, usage: "next") .then((_) {}, onError: (Object error, StackTrace stackTrace) { Logger.warn("Failed to pre-cache FaceTime link", error: error, trace: stackTrace); }); } Logger.info("initDone"); - final sendingProgress = Database.messages.query(Message_.sendingServiceId.notNull()).build().find(); + final sendingProgress = Database.messages + .query(Message_.sendingServiceId.notNull()) + .build() + .find(); for (var item in sendingProgress) { // we are still sending if (item.sendingServiceId == serviceId) continue; @@ -5368,40 +6830,519 @@ class RustPushService extends GetxService { style: context.theme.textTheme.titleLarge, ), backgroundColor: context.theme.colorScheme.properSurface, - content: Text("There's an issue with a recent update. A software bug corrupted part of the app's internal state and needs to be fixed before messaging can continue. You won't be able to send messages until you take action.\n\nYour data was not compromised, and this was not a security issue.\nWe recommend backing up any important messages before proceeding. Have your apple device and account authentication credentials ready.", style: context.theme.textTheme.bodyLarge), + content: Text( + "There's an issue with a recent update. A software bug corrupted part of the app's internal state and needs to be fixed before messaging can continue. You won't be able to send messages until you take action.\n\nYour data was not compromised, and this was not a security issue.\nWe recommend backing up any important messages before proceeding. Have your apple device and account authentication credentials ready.", + style: context.theme.textTheme.bodyLarge), actions: [ TextButton( - child: Text( - "Dismiss for now", - style: context.theme.textTheme.bodyLarge!.copyWith(color: context.theme.colorScheme.primary) - ), + child: Text("Dismiss for now", + style: context.theme.textTheme.bodyLarge! + .copyWith(color: context.theme.colorScheme.primary)), onPressed: () => Navigator.of(context).pop(), ), TextButton( - child: Text( - "Fix", - style: context.theme.textTheme.bodyLarge!.copyWith(color: context.theme.colorScheme.primary) - ), - onPressed: () async { - Navigator.of(context).pop(); - pushService.markFailedToLogin(hw: true, logout: true, ui: true); - File("$statePath/incident_affected").deleteSync(); - } - ), + child: Text("Fix", + style: context.theme.textTheme.bodyLarge! + .copyWith(color: context.theme.colorScheme.primary)), + onPressed: () async { + Navigator.of(context).pop(); + pushService.markFailedToLogin(hw: true, logout: true, ui: true); + File("$statePath/incident_affected").deleteSync(); + }), ], ), ); } void initMixPanel() async { - if (ss.settings.finishedSetup.value && !ss.settings.deviceIsHosted.value) return; - mixpanel = await Mixpanel.init("d66dc2d8f2ad649fac2640ff059dc9f4", trackAutomaticEvents: false); + if (ss.settings.finishedSetup.value && !ss.settings.deviceIsHosted.value) { + return; + } + mixpanel = await Mixpanel.init("d66dc2d8f2ad649fac2640ff059dc9f4", + trackAutomaticEvents: false); } String statePath = ""; + CloudSyncManualShadowOwner? _cloudSyncV2ShadowOwner; + Future? _cloudSyncV2SemanticPullInFlight; + bool _cloudSyncV2SemanticPullQuiescing = false; + CloudSyncProductionOutboundCanaryAdapter? _cloudSyncV2OutboundAdapter; + CloudSyncOutboundCanaryConfirmation? _cloudSyncV2OutboundConfirmation; + Future? _cloudSyncV2OutboundInFlight; + bool _cloudSyncV2OutboundQuiescing = false; + static const _cloudSyncV2SemanticPullQuiescenceTimeout = + Duration(seconds: 50); + static const _cloudSyncV2OutboundQuiescenceTimeout = Duration(seconds: 90); + + bool get cloudSyncV2ManualShadowAvailable { + if (!CloudSyncDevGate.manualShadowSamplerEnabled || + !_cloudSyncV2DeveloperRuntimeAllowed || + !ls.isUiThread || + loggingOut || + statePath.isEmpty || + state?.icloudServices?.cloudMessagesClient == null) { + return false; + } + final abi = ffi.Abi.current(); + return abi == ffi.Abi.androidArm64 || + abi == ffi.Abi.windowsArm64 || + abi == ffi.Abi.windowsX64; + } + + /// Runs one explicitly confirmed, read-only Cloud Sync V2 sample. + /// + /// This entry point exists only in builds with the compile-time sampler gate + /// and only while Developer Mode is enabled. It never schedules background + /// work or enables semantic apply, CloudKit saves, or CloudKit deletions. + Future runCloudSyncV2ManualShadowConfirmed() { + if (!CloudSyncDevGate.manualShadowSamplerEnabled) { + throw StateError('cloud_sync_sampler_disabled'); + } + if (!_cloudSyncV2DeveloperRuntimeAllowed) { + throw StateError('cloud_sync_developer_mode_required'); + } + return _cloudSyncV2Owner().runConfirmedAndPersist(); + } + + bool get cloudSyncV2ManualSemanticPullAvailable { + if (!CloudSyncDevGate.manualSemanticPullEnabled || + !_cloudSyncV2DeveloperRuntimeAllowed || + !ls.isUiThread || + loggingOut || + _cloudSyncV2SemanticPullQuiescing || + _cloudSyncV2SemanticPullInFlight != null || + statePath.isEmpty || + state?.icloudServices?.cloudMessagesClient == null) { + return false; + } + final abi = ffi.Abi.current(); + return abi == ffi.Abi.androidArm64 || + abi == ffi.Abi.windowsArm64 || + abi == ffi.Abi.windowsX64; + } + + /// Runs one explicitly confirmed, bounded CloudKit read whose supported + /// records may be projected into canonical local ObjectBox entities. + /// CloudKit saves, CloudKit deletes, and local tombstones remain disabled. + Future + runCloudSyncV2ManualSemanticPullConfirmed() { + if (!CloudSyncDevGate.manualSemanticPullEnabled) { + throw StateError('cloud_sync_semantic_pull_disabled'); + } + if (!_cloudSyncV2DeveloperRuntimeAllowed) { + throw StateError('cloud_sync_developer_mode_required'); + } + if (_cloudSyncV2SemanticPullQuiescing) { + throw StateError('cloud_sync_semantic_pull_quiescing'); + } + if (_cloudSyncV2SemanticPullInFlight != null) { + throw StateError('cloud_sync_semantic_pull_active'); + } + + final future = _runCloudSyncV2ManualSemanticPull(); + _cloudSyncV2SemanticPullInFlight = future; + return future.whenComplete(() { + if (identical(_cloudSyncV2SemanticPullInFlight, future)) { + _cloudSyncV2SemanticPullInFlight = null; + } + }); + } + + Future + _runCloudSyncV2ManualSemanticPull() async { + if (statePath.isEmpty || !Directory(statePath).existsSync()) { + throw StateError('cloud_sync_private_storage_unavailable'); + } + + final protector = RustCloudSyncProtector(storageDirectory: statePath); + final preflight = CloudSyncProductionPreflightProbe( + platformSupported: () { + final abi = ffi.Abi.current(); + return abi == ffi.Abi.androidArm64 || + abi == ffi.Abi.windowsArm64 || + abi == ffi.Abi.windowsX64; + }, + uiIsolate: () => ls.isUiThread, + rustPushReady: () => + state?.icloudServices?.cloudMessagesClient != null, + localState: ObjectBoxCloudSyncPreflightReader.fromDatabase().read, + privateStorageExists: () => + statePath.isNotEmpty && Directory(statePath).existsSync(), + logoutActive: () => + loggingOut || _cloudSyncV2SemanticPullQuiescing, + legacySyncEnabled: () => ss.settings.cloudSyncingEnabled.value, + legacySyncActive: () => isSyncing.value != null, + protectorSentinelValid: + CloudSyncProtectorHealthProbe(protector: protector).read, + ); + final adapter = CloudSyncProductionSemanticPullAdapter( + readActiveClient: () => + state?.icloudServices?.cloudMessagesClient, + readPreflight: preflight.read, + privateStorageDirectory: statePath, + platform: Platform.operatingSystem, + architecture: ffi.Abi.current().toString(), + buildCommit: _cloudSyncV2BuildIdentifier(), + observerFactory: _cloudSyncV2EvidenceObserverFactory(), + ); + final report = await adapter.sampler.runConfirmed(); + Logger.info( + "Cloud Sync V2 semantic canary report=${jsonEncode(report.toJson())}"); + return report; + } + + bool get cloudSyncV2ManualOutboundAvailable { + if (!CloudSyncDevGate.manualOutboundCanaryEnabled || + !CloudKitWriterOwnership.v2MutationsEnabled || + !_cloudSyncV2DeveloperRuntimeAllowed || + !ls.isUiThread || + loggingOut || + _cloudSyncV2OutboundQuiescing || + _cloudSyncV2OutboundInFlight != null || + statePath.isEmpty || + state?.icloudServices?.cloudMessagesClient == null) { + return false; + } + return ffi.Abi.current() == ffi.Abi.androidArm64; + } + + /// Selects, without mutation, the newest existing local message that is safe + /// for the one-text outbound canary. Content and destination are never + /// exposed through the returned diagnostics. + CloudSyncOutboundCanaryCandidate? + selectCloudSyncV2OutboundCanaryCandidate() { + if (!cloudSyncV2ManualOutboundAvailable) { + throw StateError('cloud_sync_outbound_canary_unavailable'); + } + try { + return CloudSyncOutboundCanaryCandidateSelector().selectNewest(); + } catch (_) { + throw StateError('cloud_sync_outbound_candidate_selection_failed'); + } + } + + /// Establishes V2 writer ownership from direct, fail-closed local probes. + /// This never contacts CloudKit and does not admit an outbound operation. + Future + prepareCloudSyncV2OutboundWriter() async { + if (!cloudSyncV2ManualOutboundAvailable) { + throw StateError('cloud_sync_outbound_canary_unavailable'); + } + return _cloudSyncV2Outbound().ensureWriterOwned(); + } + + Future + armCloudSyncV2OutboundConfirmed({ + required api.CloudMessage message, + required DateTime createdAt, + }) async { + if (!cloudSyncV2ManualOutboundAvailable) { + throw StateError('cloud_sync_outbound_canary_unavailable'); + } + if (_cloudSyncV2OutboundConfirmation != null) { + throw StateError('cloud_sync_outbound_canary_already_armed'); + } + final confirmation = await _cloudSyncV2Outbound().canary.armConfirmed( + message: message, + createdAt: createdAt, + ); + _cloudSyncV2OutboundConfirmation = confirmation; + return confirmation; + } + + Future + armCloudSyncV2OutboundRecoveryConfirmed() async { + if (!cloudSyncV2ManualOutboundAvailable) { + throw StateError('cloud_sync_outbound_canary_unavailable'); + } + if (_cloudSyncV2OutboundConfirmation != null) { + throw StateError('cloud_sync_outbound_canary_already_armed'); + } + final confirmation = + await _cloudSyncV2Outbound().canary.armRecoveryConfirmed(); + _cloudSyncV2OutboundConfirmation = confirmation; + return confirmation; + } + + Future + runCloudSyncV2OutboundDoubleConfirmed( + CloudSyncOutboundCanaryConfirmation confirmation, + ) { + if (!identical(_cloudSyncV2OutboundConfirmation, confirmation)) { + throw StateError('cloud_sync_outbound_canary_confirmation_invalid'); + } + if (!cloudSyncV2ManualOutboundAvailable) { + throw StateError('cloud_sync_outbound_canary_unavailable'); + } + if (_cloudSyncV2OutboundQuiescing) { + throw StateError('cloud_sync_outbound_canary_quiescing'); + } + if (_cloudSyncV2OutboundInFlight != null) { + throw StateError('cloud_sync_outbound_canary_active'); + } + _cloudSyncV2OutboundConfirmation = null; + final future = + _cloudSyncV2Outbound().canary.runDoubleConfirmed(confirmation); + _cloudSyncV2OutboundInFlight = future; + return future.whenComplete(() { + if (identical(_cloudSyncV2OutboundInFlight, future)) { + _cloudSyncV2OutboundInFlight = null; + } + }); + } + + void disarmCloudSyncV2Outbound( + CloudSyncOutboundCanaryConfirmation confirmation, + ) { + _cloudSyncV2Outbound().canary.disarm(confirmation); + if (identical(_cloudSyncV2OutboundConfirmation, confirmation)) { + _cloudSyncV2OutboundConfirmation = null; + } + } + + CloudSyncProductionOutboundCanaryAdapter _cloudSyncV2Outbound() { + return _cloudSyncV2OutboundAdapter ??= + CloudSyncProductionOutboundCanaryAdapter( + readActiveClient: () => state?.icloudServices?.cloudMessagesClient, + readPreflight: _buildCloudSyncV2OutboundPreflight().read, + privateStorageDirectory: statePath, + quarantineLegacyDeletionQueues: () async { + await LegacyCloudKitDeletionIntentStore(store: Database.store) + .quarantineLegacySharedPreferenceQueues( + ss.prefs, + now: DateTime.now(), + ); + }, + readWriterMeasurements: _readCloudSyncV2WriterMeasurements, + ); + } + + CloudSyncProductionPreflightProbe _buildCloudSyncV2OutboundPreflight() { + final protector = RustCloudSyncProtector(storageDirectory: statePath); + return CloudSyncProductionPreflightProbe( + platformSupported: () => ffi.Abi.current() == ffi.Abi.androidArm64, + uiIsolate: () => ls.isUiThread, + rustPushReady: () => + state?.icloudServices?.cloudMessagesClient != null, + localState: ObjectBoxCloudSyncPreflightReader.fromDatabase().read, + privateStorageExists: () => + statePath.isNotEmpty && Directory(statePath).existsSync(), + logoutActive: () => loggingOut || _cloudSyncV2OutboundQuiescing, + legacySyncEnabled: () => ss.settings.cloudSyncingEnabled.value, + legacySyncActive: () => + isSyncing.value != null || + ui.IsolateNameServer.lookupPortByName('bg_sync') != null, + protectorSentinelValid: + CloudSyncProtectorHealthProbe(protector: protector).read, + ); + } + + Future + _readCloudSyncV2WriterMeasurements( + CloudKitWriterScope writerScope, + ) async { + final local = ObjectBoxCloudSyncPreflightReader.fromDatabase().read(); + final deletionStore = + LegacyCloudKitDeletionIntentStore(store: Database.store); + final messageQuery = Database.messages + .query(Message_.itemType.equals(0).and(Message_.ckSyncState + .equals(false) + .or(Message_.ckSyncState.isNull()))) + .build(); + final chatQuery = + Database.chats.query(Chat_.ckSyncState.equals(false)).build(); + final syncScope = CloudSyncScope( + accountFingerprint: writerScope.accountFingerprint, + container: writerScope.container, + database: writerScope.database, + zone: CloudSyncManualOutboundCanary.zone, + streamKind: CloudSyncStreamKind.messages, + schemaVersion: 2, + ); + final outboxQuery = Database.cloudSyncOutbox + .query(CloudOutboxOperationEntity_.scopeKey.equals(syncScope.storageKey)) + .build(); + try { + return CloudKitWriterProvisioningMeasurements( + objectBoxReady: !Database.store.isClosed(), + legacySyncEnabled: ss.settings.cloudSyncingEnabled.value, + legacySyncActive: isSyncing.value != null, + backgroundSyncActive: + ui.IsolateNameServer.lookupPortByName('bg_sync') != null, + coordinatorLeaseActive: local.coordinatorLeaseActive, + pendingLegacyDeletionIntents: + deletionStore.pendingCountForScope(writerScope), + legacyPreferenceQueueEntries: + deletionStore.legacySharedPreferenceQueueEntryCount(ss.prefs), + unsyncedLegacyMessages: messageQuery.count(), + unsyncedLegacyChats: chatQuery.count(), + existingV2OutboxOperations: outboxQuery.count(), + ); + } finally { + messageQuery.close(); + chatQuery.close(); + outboxQuery.close(); + } + } + + bool get _cloudSyncV2DeveloperRuntimeAllowed => + ss.settings.developerEnabled.value; + + CloudSyncManualShadowOwner _cloudSyncV2Owner() { + return _cloudSyncV2ShadowOwner ??= CloudSyncManualShadowOwner( + buildController: _buildCloudSyncV2ShadowController, + ); + } + + Future + _buildCloudSyncV2ShadowController() async { + if (!CloudSyncDevGate.manualShadowSamplerEnabled) { + throw StateError('cloud_sync_sampler_disabled'); + } + if (statePath.isEmpty || !Directory(statePath).existsSync()) { + throw StateError('cloud_sync_private_storage_unavailable'); + } + + final protector = RustCloudSyncProtector(storageDirectory: statePath); + final preflight = CloudSyncProductionPreflightProbe( + platformSupported: () { + final abi = ffi.Abi.current(); + return abi == ffi.Abi.androidArm64 || + abi == ffi.Abi.windowsArm64 || + abi == ffi.Abi.windowsX64; + }, + uiIsolate: () => ls.isUiThread, + rustPushReady: () => + state?.icloudServices?.cloudMessagesClient != null, + localState: ObjectBoxCloudSyncPreflightReader.fromDatabase().read, + privateStorageExists: () => + statePath.isNotEmpty && Directory(statePath).existsSync(), + logoutActive: () => + loggingOut || (_cloudSyncV2ShadowOwner?.isQuiescing ?? false), + legacySyncEnabled: () => ss.settings.cloudSyncingEnabled.value, + legacySyncActive: () => isSyncing.value != null, + protectorSentinelValid: + CloudSyncProtectorHealthProbe(protector: protector).read, + ); + final adapter = CloudSyncProductionSamplerAdapter( + readActiveClient: () => + state?.icloudServices?.cloudMessagesClient, + readPreflight: preflight.read, + privateStorageDirectory: statePath, + platform: Platform.operatingSystem, + architecture: ffi.Abi.current().toString(), + buildCommit: _cloudSyncV2BuildIdentifier(), + observerFactory: _cloudSyncV2EvidenceObserverFactory(), + ); + return CloudSyncManualShadowController.production( + sampler: adapter.sampler, + reportWriter: CloudSyncShadowReportFileWriter( + privateReportDirectory: join( + statePath, + 'cloud-sync-v2', + 'reports', + ), + trustedStorageRoot: statePath, + ), + ); + } + + CloudSyncObserverFactory _cloudSyncV2EvidenceObserverFactory() { + CloudSyncProtocolEvidenceWriter? writer; + return (scope) async { + if (!CloudSyncDevGate.protocolEvidenceAvailable || + !_cloudSyncV2DeveloperRuntimeAllowed || + !ss.settings.cloudSyncV2EvidenceEnabled.value) { + return const NoopCloudSyncObserver(); + } + writer ??= await CloudSyncProtocolEvidenceWriter.open( + privateDirectory: join(statePath, 'cloud-sync-v2', 'evidence'), + trustedRoot: statePath, + ); + return CloudSyncProtocolEvidenceObserver( + writer: writer!, + zoneLabel: scope.zone, + streamKindLabel: scope.streamKind.name, + platform: Platform.operatingSystem, + architecture: ffi.Abi.current().toString(), + buildCommit: _cloudSyncV2BuildIdentifier(), + ); + }; + } + + String _cloudSyncV2BuildIdentifier() { + const supplied = String.fromEnvironment( + 'OPENBUBBLES_BUILD_COMMIT', + defaultValue: '', + ); + if (RegExp(r'^[0-9a-fA-F]{7,64}$').hasMatch(supplied)) { + return supplied; + } + final packageBuild = + '${fs.packageInfo.version}+${fs.packageInfo.buildNumber}'; + return RegExp(r'^[A-Za-z0-9._+-]{1,80}$').hasMatch(packageBuild) + ? packageBuild + : 'local-build'; + } + + Future _runLegacyCloudKitOperation( + Future Function() action, + ) => + _runCloudKitOperation( + kind: CloudKitOperationKind.legacyReadWrite, + action: () { + if (CloudKitWriterOwnership.decision.owner == + CloudKitWriterOwner.v2) { + throw StateError('legacy_cloudkit_blocked_by_v2_writer'); + } + if (!CloudKitWriterOwnership.legacyMutationsEnabled) { + return action(); + } + return CloudKitWriterMutationGuard( + store: Database.store, + readActiveClient: () => + state?.icloudServices?.cloudMessagesClient, + privateStorageDirectory: statePath, + ).run( + owner: CloudKitWriterOwner.legacy, + action: action, + ); + }, + ); + + Future _runCloudKitDestructiveReset( + Future Function() action, + ) => + _runCloudKitOperation( + kind: CloudKitOperationKind.destructiveReset, + action: action, + ); + + Future _runCloudKitOperation({ + required CloudKitOperationKind kind, + required Future Function() action, + }) { + if (statePath.isEmpty) { + throw StateError('cloudkit_interlock_storage_unavailable'); + } + final protector = RustCloudSyncProtector( + storageDirectory: statePath, + ); + final fenceStore = ObjectBoxCloudSyncStore.fromDatabase( + protector: protector, + ); + return CloudKitOperationInterlock( + privateStorageDirectory: statePath, + fenceStore: fenceStore, + ).runExclusive( + kind: kind, + action: action, + ); + } bool loggingOut = false; - Future markFailedToLogin({bool hw = false, bool logout = false, bool ui = false}) async { + Future markFailedToLogin( + {bool hw = false, bool logout = false, bool ui = false}) async { Logger.error("markingfailed"); if (loggingOut) return; try { @@ -5417,39 +7358,80 @@ class RustPushService extends GetxService { } Future reset(bool hw, bool logout, bool setup) async { - var thisState = state; - state = null; + final shadowOwner = _cloudSyncV2ShadowOwner; + _cloudSyncV2SemanticPullQuiescing = true; + _cloudSyncV2OutboundQuiescing = true; + try { + await shadowOwner?.quiesceForAccountTransition(); + final semanticPull = _cloudSyncV2SemanticPullInFlight; + if (semanticPull != null) { + try { + await semanticPull.timeout( + _cloudSyncV2SemanticPullQuiescenceTimeout, + ); + } on TimeoutException { + // Leave the account and native client attached. Disposing them while + // a native CloudKit operation is still running risks use-after-free. + throw StateError('cloud_sync_semantic_pull_quiescence_timeout'); + } catch (_) { + // Account teardown must continue after a safely failed read-only run. + Logger.warn( + "Cloud Sync V2 semantic pull stopped during account transition"); + } + } + final outboundConfirmation = _cloudSyncV2OutboundConfirmation; + if (outboundConfirmation != null) { + _cloudSyncV2OutboundAdapter?.canary.disarm(outboundConfirmation); + _cloudSyncV2OutboundConfirmation = null; + } + final outbound = _cloudSyncV2OutboundInFlight; + if (outbound != null) { + try { + await outbound.timeout(_cloudSyncV2OutboundQuiescenceTimeout); + } on TimeoutException { + // Keep native account handles attached if a protected write has not + // reached its terminal or durably recoverable boundary. + throw StateError('cloud_sync_outbound_quiescence_timeout'); + } catch (_) { + Logger.warn( + "Cloud Sync V2 outbound canary stopped during account transition"); + } + } + _cloudSyncV2OutboundAdapter = null; + var thisState = state; + state = null; - final relayHealthCheck = _relayHealthInFlight; - if (relayHealthCheck != null) { - await relayHealthCheck; - } - await cancelRelayHealthReminder(); - if (hw || logout) { - await clearRelayHealthState(); - } - if (thisState == null) return; + final relayHealthCheck = _relayHealthInFlight; + if (relayHealthCheck != null) { + await relayHealthCheck; + } + await cancelRelayHealthReminder(); + if (hw || logout) { + await clearRelayHealthState(); + } + if (thisState == null) return; - if (logout) { - ss.settings.cloudSyncingEnabled.value = false; - ss.settings.keychainDefaultPassword.value = null; - ss.saveSettings(); + if (logout) { + ss.settings.cloudSyncingEnabled.value = false; + ss.settings.keychainDefaultPassword.value = null; + ss.saveSettings(); + } + await api.resetState( + cancel: thisState.cancelPoll, + path: statePath, + config: thisState.osConfig, + aps: thisState.conn, + account: thisState.icloudServices?.account, + resetHw: hw, + logout: logout); + disposeState(thisState, hw, setup); + } finally { + await shadowOwner?.resumeAfterAccountTransition(); + _cloudSyncV2SemanticPullQuiescing = false; + _cloudSyncV2OutboundQuiescing = false; } - await api.resetState( - cancel: thisState.cancelPoll, - path: statePath, - config: thisState.osConfig, - aps: thisState.conn, - account: thisState.icloudServices?.account, - - resetHw: hw, - logout: logout - ); - disposeState(thisState, hw, setup); } - - void disposeState(api.SharedPushState state, bool hw, bool setup) { state.cancelPoll.dispose(); state.localBroadcast.dispose(); @@ -5473,8 +7455,13 @@ class RustPushService extends GetxService { api.closeClient(client: state.client); state.client.dispose(); - - (lib.ApsConnection, lib.ApsState, api.JoinedOsConfig, api.IdsngmIdentity, lib.ArcAnisetteClientDefaultAnisetteProvider)? prefix; + ( + lib.ApsConnection, + lib.ApsState, + api.JoinedOsConfig, + api.IdsngmIdentity, + lib.ArcAnisetteClientDefaultAnisetteProvider + )? prefix; if (hw || !setup) { api.closeAps(aps: state.conn); state.conn.dispose(); @@ -5482,7 +7469,13 @@ class RustPushService extends GetxService { state.anisette.dispose(); } else { var restored = api.readHardware(path: pushService.statePath)!; - prefix = (state.conn, restored.push, state.osConfig, api.decodeIdentity(identity: restored.identity), state.anisette); + prefix = ( + state.conn, + restored.push, + state.osConfig, + api.decodeIdentity(identity: restored.identity), + state.anisette + ); } if (setup) { @@ -5490,11 +7483,19 @@ class RustPushService extends GetxService { ss.saveSettings(); if (ls.isUiThread) { try { - Get.offAll(() => PopScope( - canPop: false, - child: TitleBarWrapper(child: SetupView(prefix: prefix)), - ), duration: Duration.zero, transition: Transition.noTransition); - } catch (e) { } + Get.offAll( + () => PopScope( + canPop: false, + child: TitleBarWrapper(child: SetupView(prefix: prefix)), + ), + duration: Duration.zero, + transition: Transition.noTransition); + } catch (e, s) { + Logger.warn( + "Failed to show setup for the requested registration route", + error: e, + trace: s); + } } } } @@ -5509,13 +7510,28 @@ class RustPushService extends GetxService { @override void onClose() { + _networkRefreshTimer?.cancel(); + _networkSubscription?.cancel(); for (final timer in _profileRetryTimers.values) { timer.cancel(); } _profileRetryTimers.clear(); _profileRetryAttempts.clear(); unawaited(cancelRelayHealthReminder()); - if (state != null) disposeState(state!, true, false); + _cloudSyncV2OutboundQuiescing = true; + final outboundConfirmation = _cloudSyncV2OutboundConfirmation; + if (outboundConfirmation != null) { + _cloudSyncV2OutboundAdapter?.canary.disarm(outboundConfirmation); + _cloudSyncV2OutboundConfirmation = null; + } + if (_cloudSyncV2OutboundInFlight == null) { + if (state != null) disposeState(state!, true, false); + } else { + // onClose is synchronous. Do not dispose native handles underneath a + // protected CloudKit write; process teardown will reclaim them. + Logger.warn( + "Skipping explicit RustPush disposal while Cloud Sync V2 write is active"); + } super.onClose(); } } diff --git a/lib/services/services.dart b/lib/services/services.dart index fecc83fab2..dc5cf36d5b 100644 --- a/lib/services/services.dart +++ b/lib/services/services.dart @@ -30,6 +30,7 @@ export 'ui/chat/conversation_view_controller.dart'; export 'ui/chat/global_chat_service.dart'; export 'ui/message/message_widget_controller.dart'; export 'ui/message/messages_service.dart'; +export 'ui/media/conversation_media_pager.dart'; export 'ui/navigator/navigator_service.dart'; export 'ui/theme/themes_service.dart'; export 'ui/attachments_service.dart'; diff --git a/lib/services/ui/attachments_service.dart b/lib/services/ui/attachments_service.dart index da6619aa7a..ad0623dbfb 100644 --- a/lib/services/ui/attachments_service.dart +++ b/lib/services/ui/attachments_service.dart @@ -25,19 +25,14 @@ import 'package:url_launcher/url_launcher.dart'; import 'package:vcf_dart/vcf_dart.dart'; import 'package:video_thumbnail/video_thumbnail.dart'; -AttachmentsService as = Get.isRegistered() - ? Get.find() - : Get.put(AttachmentsService()); +AttachmentsService as = + Get.isRegistered() ? Get.find() : Get.put(AttachmentsService()); class AttachmentsService extends GetxService { dynamic getContent(Attachment attachment, - {String? path, - bool? autoDownload, - Function(PlatformFile)? onComplete, - bool forExtension = false}) { + {String? path, bool? autoDownload, Function(PlatformFile)? onComplete, bool forExtension = false}) { if ((attachment.guid?.startsWith("temp") ?? false) && !forExtension) { - final sendProgress = ah.attachmentProgress - .firstWhereOrNull((e) => e.item1 == attachment.guid); + final sendProgress = ah.attachmentProgress.firstWhereOrNull((e) => e.item1 == attachment.guid); if (sendProgress != null) { return sendProgress; } else { @@ -53,10 +48,8 @@ class AttachmentsService extends GetxService { ); } if (kIsWeb || (attachment.guid == null && attachment.bytes != null)) { - if (attachment.bytes == null && - (autoDownload ?? ss.settings.autoDownload.value)) { - return attachmentDownloader.startDownload(attachment, - onComplete: onComplete); + if (attachment.bytes == null && (autoDownload ?? ss.settings.autoDownload.value)) { + return attachmentDownloader.startDownload(attachment, onComplete: onComplete); } else { return PlatformFile( name: attachment.transferName!, @@ -79,8 +72,7 @@ class AttachmentsService extends GetxService { size: attachment.totalBytes ?? 0, ); } else if (autoDownload ?? ss.settings.autoDownload.value) { - return attachmentDownloader.startDownload(attachment, - onComplete: onComplete); + return attachmentDownloader.startDownload(attachment, onComplete: onComplete); } else { return attachment; } @@ -114,59 +106,30 @@ class AttachmentsService extends GetxService { final contact = VCardStack.fromData(appleContact).items.first; final c = Contact( id: randomString(8), - displayName: contact - .findFirstProperty(VConstants.formattedName) - ?.values - .firstOrNull ?? - "Unknown", + displayName: contact.findFirstProperty(VConstants.formattedName)?.values.firstOrNull ?? "Unknown", phones: contact.findFirstProperty(VConstants.phone)?.values ?? [], emails: contact.findFirstProperty(VConstants.email)?.values ?? [], structuredName: StructuredName( - namePrefix: contact - .findFirstProperty(VConstants.name) - ?.values - .elementAtOrNull(3) ?? - "", - familyName: contact - .findFirstProperty(VConstants.name) - ?.values - .elementAtOrNull(0) ?? - "", - givenName: contact - .findFirstProperty(VConstants.name) - ?.values - .elementAtOrNull(1) ?? - "", - middleName: contact - .findFirstProperty(VConstants.name) - ?.values - .elementAtOrNull(2) ?? - "", - nameSuffix: contact - .findFirstProperty(VConstants.name) - ?.values - .elementAtOrNull(4) ?? - "", + namePrefix: contact.findFirstProperty(VConstants.name)?.values.elementAtOrNull(3) ?? "", + familyName: contact.findFirstProperty(VConstants.name)?.values.elementAtOrNull(0) ?? "", + givenName: contact.findFirstProperty(VConstants.name)?.values.elementAtOrNull(1) ?? "", + middleName: contact.findFirstProperty(VConstants.name)?.values.elementAtOrNull(2) ?? "", + nameSuffix: contact.findFirstProperty(VConstants.name)?.values.elementAtOrNull(4) ?? "", ), ); try { // contact_card.dart does real avatar parsing since no plugins can parse the photo correctly when the base64 is multiline - c.avatar = (isNullOrEmpty( - contact.findFirstProperty(VConstants.photo)?.values.firstOrNull) - ? null - : [0]) as Uint8List?; + c.avatar = + (isNullOrEmpty(contact.findFirstProperty(VConstants.photo)?.values.firstOrNull) ? null : [0]) as Uint8List?; } catch (_) {} return c; } - Future saveToDisk(PlatformFile file, - {bool isAutoDownload = false, bool isDocument = false}) async { + Future saveToDisk(PlatformFile file, {bool isAutoDownload = false, bool isDocument = false}) async { if (kIsWeb) { final content = base64.encode(file.bytes!); // create a fake download element and "click" it - html.AnchorElement( - href: - "data:application/octet-stream;charset=utf-16le;base64,$content") + html.AnchorElement(href: "data:application/octet-stream;charset=utf-16le;base64,$content") ..setAttribute("download", file.name) ..click(); } else if (kIsDesktop) { @@ -191,23 +154,20 @@ class AttachmentsService extends GetxService { "Confirm save", style: context.theme.textTheme.titleLarge, ), - content: Text( - "This file already exists.\nAre you sure you want to overwrite it?", + content: Text("This file already exists.\nAre you sure you want to overwrite it?", style: context.theme.textTheme.bodyLarge), backgroundColor: context.theme.colorScheme.properSurface, actions: [ TextButton( child: Text("No", - style: context.theme.textTheme.bodyLarge! - .copyWith(color: context.theme.colorScheme.primary)), + style: context.theme.textTheme.bodyLarge!.copyWith(color: context.theme.colorScheme.primary)), onPressed: () { Navigator.of(context).pop(); }, ), TextButton( child: Text("Yes", - style: context.theme.textTheme.bodyLarge! - .copyWith(color: context.theme.colorScheme.primary)), + style: context.theme.textTheme.bodyLarge!.copyWith(color: context.theme.colorScheme.primary)), onPressed: () async { if (file.path != null) { await File(file.path!).copy(savePath); @@ -226,9 +186,7 @@ class AttachmentsService extends GetxService { onPressed: () { launchUrl(Uri.file(savePath)); }, - child: Text("OPEN FILE", - style: TextStyle( - color: Get.theme.colorScheme.onSurfaceVariant)), + child: Text("OPEN FILE", style: TextStyle(color: Get.theme.colorScheme.onSurfaceVariant)), ), ); }, @@ -254,9 +212,7 @@ class AttachmentsService extends GetxService { onPressed: () { launchUrl(Uri.file(savePath)); }, - child: Text("OPEN FILE", - style: - TextStyle(color: Get.theme.colorScheme.onSurfaceVariant)), + child: Text("OPEN FILE", style: TextStyle(color: Get.theme.colorScheme.onSurfaceVariant)), ), ); } @@ -271,9 +227,8 @@ class AttachmentsService extends GetxService { "name": file.name, }); } else { - final bytes = file.bytes != null && file.bytes!.isNotEmpty - ? file.bytes! - : await File(file.path!).readAsBytes(); + final bytes = + file.bytes != null && file.bytes!.isNotEmpty ? file.bytes! : await File(file.path!).readAsBytes(); await FilePicker.platform.saveFile( initialDirectory: ss.settings.autoSaveDocsLocation.value, dialogTitle: 'Choose a location to save this file', @@ -285,8 +240,7 @@ class AttachmentsService extends GetxService { } else { try { if (file.name.toLowerCase().endsWith(".mov")) { - savePath = join( - "/storage/emulated/0/", ss.settings.autoSavePicsLocation.value); + savePath = join("/storage/emulated/0/", ss.settings.autoSavePicsLocation.value); } else { if (!isDocument) { try { @@ -294,15 +248,13 @@ class AttachmentsService extends GetxService { await SaverGallery.saveImage(file.bytes!, quality: 100, name: file.name, - androidRelativePath: - ss.settings.autoSavePicsLocation.value, + androidRelativePath: ss.settings.autoSavePicsLocation.value, androidExistNotSave: false); } else { await SaverGallery.saveFile( file: file.path!, name: file.name, - androidRelativePath: - ss.settings.autoSavePicsLocation.value, + androidRelativePath: ss.settings.autoSavePicsLocation.value, androidExistNotSave: false); } return showSnackbar('Success', 'Saved attachment to gallery!'); @@ -315,8 +267,7 @@ class AttachmentsService extends GetxService { } else { await File(file.path!).copy(join(savePath, file.name)); } - showSnackbar('Success', - 'Saved attachment to ${savePath.replaceAll("/storage/emulated/0/", "")} folder!'); + showSnackbar('Success', 'Saved attachment to ${savePath.replaceAll("/storage/emulated/0/", "")} folder!'); } catch (e) { if (Platform.isAndroid && file.path != null) { await mcs.invokeMethod("create-document", { @@ -339,8 +290,7 @@ class AttachmentsService extends GetxService { if (!ss.settings.onlyWifiDownload.value) { return true; } else { - List status = - await (Connectivity().checkConnectivity()); + List status = await (Connectivity().checkConnectivity()); return status.contains(ConnectivityResult.wifi); } } @@ -353,38 +303,35 @@ class AttachmentsService extends GetxService { final pngFile = File(attachment.convertedPath); final thumbnail = File("${attachment.path}.thumbnail"); final pngThumbnail = File("${attachment.convertedPath}.thumbnail"); + final galleryThumbnail = File("${attachment.path}.gallery-thumbnail.jpg"); try { await file.delete(); await pngFile.delete(); await thumbnail.delete(); await pngThumbnail.delete(); + await galleryThumbnail.delete(); } catch (_) {} } Get.put( AttachmentDownloadController( - attachment: attachment, - onComplete: (file) => onComplete?.call(file), - onError: onError), + attachment: attachment, onComplete: (file) => onComplete?.call(file), onError: onError), tag: attachment.guid); } Future getImageSizing(String filePath, Attachment attachment) async { try { dynamic file = File(filePath); - isg.Size size = - await isg.ImageSizeGetter.getSizeAsync(AsyncInput(FileInput(file))); - return Size( - size.needRotate ? size.height.toDouble() : size.width.toDouble(), + isg.Size size = await isg.ImageSizeGetter.getSizeAsync(AsyncInput(FileInput(file))); + return Size(size.needRotate ? size.height.toDouble() : size.width.toDouble(), size.needRotate ? size.width.toDouble() : size.height.toDouble()); } catch (ex) { return const Size(0, 0); } } - Future getVideoThumbnail(String filePath, - {bool useCachedFile = true}) async { + Future getVideoThumbnail(String filePath, {bool useCachedFile = true}) async { final cachedFile = File("$filePath.thumbnail"); if (useCachedFile) { try { @@ -395,8 +342,7 @@ class AttachmentsService extends GetxService { final thumbnail = await VideoThumbnail.thumbnailData( video: filePath, imageFormat: ImageFormat.PNG, - maxWidth: - 128, // specify the width of the thumbnail, let the height auto-scaled to keep the source aspect ratio + maxWidth: 128, // specify the width of the thumbnail, let the height auto-scaled to keep the source aspect ratio quality: 25, ); @@ -407,18 +353,46 @@ class AttachmentsService extends GetxService { return thumbnail; } + Future getImageGalleryThumbnail(String filePath) async { + final thumbnail = File("$filePath.gallery-thumbnail.jpg"); + try { + if (await thumbnail.exists() && await thumbnail.length() > 0) { + return thumbnail.path; + } + final result = await FlutterImageCompress.compressAndGetFile( + filePath, + thumbnail.path, + minWidth: 640, + minHeight: 640, + quality: 70, + format: CompressFormat.jpeg, + keepExif: false, + ); + return result?.path; + } catch (error, trace) { + Logger.warn( + "Failed to create gallery thumbnail", + error: error, + trace: trace, + ); + try { + if (await thumbnail.exists()) await thumbnail.delete(); + } catch (_) {} + return null; + } + } + Future loadAndGetProperties(Attachment attachment, - {bool onlyFetchData = false, - String? actualPath, - bool isPreview = false}) async { - if (kIsWeb || - attachment.mimeType == null || - !["image", "video"].contains(attachment.mimeStart)) return null; + {bool onlyFetchData = false, String? actualPath, bool isPreview = false}) async { + if (kIsWeb || attachment.mimeType == null || !["image", "video"].contains(attachment.mimeStart)) return null; final filePath = actualPath ?? attachment.path; File originalFile = File(filePath); - if (kIsDesktop) { - await originalFile.create(recursive: true); + if (!await originalFile.exists() || await originalFile.length() == 0) { + throw FileSystemException( + "Attachment file is missing or empty", + filePath, + ); } // Handle getting heic and tiff images @@ -493,8 +467,7 @@ class AttachmentsService extends GetxService { } attachment.save(null); } catch (ex, stack) { - Logger.error('Failed to get GIF dimensions!', - error: ex, trace: stack); + Logger.error('Failed to get GIF dimensions!', error: ex, trace: stack); } } else if (attachment.mimeStart == "image") { try { @@ -505,8 +478,7 @@ class AttachmentsService extends GetxService { } attachment.save(null); } catch (ex, stack) { - Logger.error('Failed to get Image Properties!', - error: ex, trace: stack); + Logger.error('Failed to get Image Properties!', error: ex, trace: stack); } } } diff --git a/lib/services/ui/chat/conversation_view_controller.dart b/lib/services/ui/chat/conversation_view_controller.dart index ae92b6839a..bf7f23b660 100644 --- a/lib/services/ui/chat/conversation_view_controller.dart +++ b/lib/services/ui/chat/conversation_view_controller.dart @@ -186,6 +186,10 @@ class ConversationViewController extends StatefulController } if (sharedContact != null && !sharedContact.isDismissed) { suggestedContact.value = sharedContact; + Logger.info( + "Shared profile prompt available hasImage=${sharedContact.avatar?.isNotEmpty ?? false}"); + } else if (sharedContact?.isDismissed ?? false) { + Logger.info("Shared profile prompt suppressed reason=dismissed"); } // (not in our contacts or contact sharing disabled) and not shared @@ -336,10 +340,20 @@ class ConversationViewController extends StatefulController headerBackFocusNode.dispose(); shareSubscription?.cancel(); keyboardVisibilitySubscription?.cancel(); + for (final entry in editing) { + final editController = entry.item3; + editController.focusNode?.dispose(); + editController.focusNode = null; + editController.dispose(); + } + editing.clear(); super.onClose(); } void dismissKeyboard() { + for (final entry in editing) { + entry.item3.focusNode?.unfocus(); + } focusNode.unfocus(); subjectFocusNode.unfocus(); SystemChannels.textInput.invokeMethod('TextInput.hide'); @@ -385,7 +399,11 @@ class ConversationViewController extends StatefulController PayloadData? payload, bool isAudioMessage, DateTime? scheduledDate) async { - sendFunc?.call( + final callback = sendFunc; + if (callback == null) { + throw StateError("Conversation send handler is not ready"); + } + await callback( Tuple7(attachments, text, subject, replyGuid, replyPart, effectId, payload), isAudioMessage, @@ -481,7 +499,61 @@ class ConversationViewController extends StatefulController null; } + MentionTextEditingController startEditing(Message message, MessagePart part) { + final existing = editing.firstWhereOrNull((entry) => + entry.item1.guid == message.guid && entry.item2.part == part.part); + if (existing != null) { + existing.item3.focusNode?.requestFocus(); + return existing.item3; + } + + final focusNode = + FocusNode(debugLabel: "message-edit-${message.guid}-${part.part}"); + final controller = + MentionTextEditingController(text: "", focusNode: focusNode) + ..importMessagePart(part); + editing.add(Tuple3(message, part, controller)); + WidgetsBinding.instance.addPostFrameCallback((_) { + final isStillEditing = editing.any((entry) => + identical(entry.item3, controller) && + entry.item1.guid == message.guid && + entry.item2.part == part.part); + if (isStillEditing && focusNode.canRequestFocus) { + focusNode.requestFocus(); + } + }); + return controller; + } + + void stopEditing(String guid, int part, {bool restoreInputFocus = false}) { + final removed = editing + .where((entry) => entry.item1.guid == guid && entry.item2.part == part) + .toList(growable: false); + if (removed.isEmpty) return; + + editing.removeWhere( + (entry) => entry.item1.guid == guid && entry.item2.part == part); + + if (restoreInputFocus) { + if (editing.isEmpty) { + lastFocusedNode.requestFocus(); + } else { + editing.last.item3.focusNode?.requestFocus(); + } + } + + WidgetsBinding.instance.addPostFrameCallback((_) { + for (final entry in removed) { + final editController = entry.item3; + editController.focusNode?.dispose(); + editController.focusNode = null; + editController.dispose(); + } + }); + } + void close() { + if (_isClosed) return; eventDispatcher.emit("update-highlight", null); cm.setAllInactiveSync(); Get.delete(tag: tag); diff --git a/lib/services/ui/media/conversation_media_pager.dart b/lib/services/ui/media/conversation_media_pager.dart new file mode 100644 index 0000000000..af75a698a2 --- /dev/null +++ b/lib/services/ui/media/conversation_media_pager.dart @@ -0,0 +1,258 @@ +import 'package:bluebubbles/database/models.dart'; +import 'package:flutter/foundation.dart'; + +typedef ChatMediaPageLoader = Future Function({ + required ChatMediaDirection direction, + ChatMediaCursor? cursor, + required int limit, +}); + +class ConversationMediaPager extends ChangeNotifier { + ConversationMediaPager({ + required this.chat, + this.pageSize = 24, + ChatMediaPageLoader? loader, + }) : _loader = loader; + + final Chat chat; + final int pageSize; + final ChatMediaPageLoader? _loader; + + final List _items = []; + bool _loadingOlder = false; + bool _loadingNewer = false; + bool _hasOlder = true; + bool _hasNewer = true; + bool _disposed = false; + int _generation = 0; + ChatMediaCursor? _olderCursor; + ChatMediaCursor? _newerCursor; + + List get items => List.unmodifiable(_items); + bool get loadingOlder => _loadingOlder; + bool get loadingNewer => _loadingNewer; + bool get hasOlder => _hasOlder; + bool get hasNewer => _hasNewer; + Object? lastError; + + void seed( + Iterable attachments, { + Attachment? selected, + bool hasNewer = true, + bool hasOlder = true, + }) { + _generation++; + final normalized = _normalized(attachments)..sort(_newestFirst); + _items + ..clear() + ..addAll(normalized); + if (selected != null && !_contains(selected)) { + _items.add(selected); + _items.sort(_newestFirst); + } + _newerCursor = _items.isEmpty ? null : _cursorFor(_items.first); + _olderCursor = _items.isEmpty ? null : _cursorFor(_items.last); + _hasNewer = hasNewer && _newerCursor != null; + _hasOlder = hasOlder && _olderCursor != null; + _notify(); + } + + Future loadInitial() async { + final generation = ++_generation; + _items.clear(); + _newerCursor = null; + _olderCursor = null; + _hasNewer = false; + _hasOlder = true; + _notify(); + + ChatMediaPage page; + try { + page = await _loadUntilMedia( + direction: ChatMediaDirection.older, + cursor: null, + ); + lastError = null; + } catch (error) { + lastError = error; + debugPrint('Failed to load initial conversation media: $error'); + if (!_disposed && generation == _generation) { + _hasOlder = false; + _notify(); + } + return; + } + if (_disposed || generation != _generation) return; + + _items.addAll(_normalized(page.items)); + _olderCursor = page.nextCursor; + _newerCursor = _items.isEmpty ? null : _cursorFor(_items.first); + _hasOlder = page.hasMore; + _notify(); + } + + Future primeAroundSelection() async { + if (_items.isEmpty) return; + await Future.wait([ + loadNewer(), + loadOlder(), + ]); + } + + Future refreshNewer() async { + if (_items.isEmpty || _newerCursor == null) { + await loadInitial(); + return; + } + _hasNewer = true; + await loadNewer(); + } + + Future loadOlder() async { + if (_disposed || _loadingOlder || !_hasOlder) return; + _loadingOlder = true; + final generation = _generation; + _notify(); + try { + final page = await _loadUntilMedia( + direction: ChatMediaDirection.older, + cursor: _olderCursor, + ); + if (_disposed || generation != _generation) return; + lastError = null; + _appendUnique(page.items); + _olderCursor = page.nextCursor ?? _olderCursor; + _hasOlder = page.hasMore; + } catch (error) { + lastError = error; + debugPrint('Failed to load older conversation media: $error'); + } finally { + if (!_disposed && generation == _generation) { + _loadingOlder = false; + _notify(); + } + } + } + + Future loadNewer() async { + if (_disposed || _loadingNewer || !_hasNewer) return; + _loadingNewer = true; + final generation = _generation; + _notify(); + try { + final page = await _loadUntilMedia( + direction: ChatMediaDirection.newer, + cursor: _newerCursor, + ); + if (_disposed || generation != _generation) return; + lastError = null; + _prependUnique(page.items); + _newerCursor = page.nextCursor ?? _newerCursor; + _hasNewer = page.hasMore; + } catch (error) { + lastError = error; + debugPrint('Failed to load newer conversation media: $error'); + } finally { + if (!_disposed && generation == _generation) { + _loadingNewer = false; + _notify(); + } + } + } + + Future _load({ + required ChatMediaDirection direction, + required ChatMediaCursor? cursor, + }) { + final loader = _loader; + if (loader != null) { + return loader(direction: direction, cursor: cursor, limit: pageSize); + } + return chat.getMediaPageAsync( + direction: direction, + cursor: cursor, + limit: pageSize, + ); + } + + /// Text-heavy stretches can produce an empty bounded database scan even + /// though older media still exists. Advance through a few empty scans in + /// one request so the gallery and fullscreen edge do not appear stuck. + Future _loadUntilMedia({ + required ChatMediaDirection direction, + required ChatMediaCursor? cursor, + }) async { + var nextCursor = cursor; + var page = ChatMediaPage.empty; + for (var scan = 0; scan < 4; scan++) { + page = await _load(direction: direction, cursor: nextCursor); + if (page.items.isNotEmpty || !page.hasMore || page.nextCursor == null) { + return page; + } + nextCursor = page.nextCursor; + } + return page; + } + + List _normalized(Iterable attachments) { + final result = []; + final guids = {}; + for (final attachment in attachments) { + if (attachment.mimeStart != 'image' && attachment.mimeStart != 'video') { + continue; + } + if (result.contains(attachment)) continue; + final guid = attachment.guid; + if (guid != null && !guids.add(guid)) continue; + result.add(attachment); + } + return result; + } + + bool _contains(Attachment attachment) { + return _items.contains(attachment) || + (attachment.guid != null && _items.any((item) => item.guid == attachment.guid)); + } + + void _appendUnique(Iterable attachments) { + for (final attachment in _normalized(attachments)) { + if (!_contains(attachment)) _items.add(attachment); + } + } + + void _prependUnique(Iterable attachments) { + final additions = _normalized(attachments).where((attachment) => !_contains(attachment)).toList(); + _items.insertAll(0, additions); + } + + ChatMediaCursor? _cursorFor(Attachment attachment) { + final message = attachment.message.target; + final date = message?.dateCreated; + final id = message?.id; + if (date == null || id == null) return null; + return ChatMediaCursor( + dateMilliseconds: date.millisecondsSinceEpoch, + messageId: id, + ); + } + + int _newestFirst(Attachment left, Attachment right) { + final leftMessage = left.message.target; + final rightMessage = right.message.target; + final dateComparison = (rightMessage?.dateCreated?.millisecondsSinceEpoch ?? -1) + .compareTo(leftMessage?.dateCreated?.millisecondsSinceEpoch ?? -1); + if (dateComparison != 0) return dateComparison; + return (rightMessage?.id ?? -1).compareTo(leftMessage?.id ?? -1); + } + + void _notify() { + if (!_disposed) notifyListeners(); + } + + @override + void dispose() { + _disposed = true; + _generation++; + super.dispose(); + } +} diff --git a/lib/services/ui/message/messages_service.dart b/lib/services/ui/message/messages_service.dart index 5be3c400a1..dc6f46f412 100644 --- a/lib/services/ui/message/messages_service.dart +++ b/lib/services/ui/message/messages_service.dart @@ -152,6 +152,9 @@ class MessagesService extends GetxController { struct.removeMessage(oldGuid ?? updated.guid!); struct.removeAttachments(toUpdate.attachments.map((e) => e!.guid!)); struct.addMessages([updated]); + if (updated.associatedMessageGuid != null) { + getActiveMwc(updated.associatedMessageGuid!)?.updateAssociatedMessage(updated); + } updateFunc.call(updated, oldGuid: oldGuid); } diff --git a/lib/src/rust/api/api.dart b/lib/src/rust/api/api.dart index d84c60dd14..aa897deea3 100644 --- a/lib/src/rust/api/api.dart +++ b/lib/src/rust/api/api.dart @@ -9,10 +9,10 @@ import 'package:flutter_rust_bridge/flutter_rust_bridge_for_generated.dart'; import 'package:freezed_annotation/freezed_annotation.dart' hide protected; part 'api.freezed.dart'; -// These functions are ignored because they are not marked as `pub`: `bin_deserialize_16`, `config`, `encrypt`, `get_login_config`, `get_password`, `handle_2fa`, `handle_circle`, `handle_photostream`, `migrate`, `plist_to_bin`, `plist_to_buf`, `plist_to_string`, `reset_user`, `shared_items`, `subscribe_streams`, `wrap_sink` +// These functions are ignored because they are not marked as `pub`: `bin_deserialize_16`, `classify_cloud_sync_reconcile_observation`, `cloud_sync_failure_category`, `cloud_sync_outbound_failure_result`, `cloud_sync_prepare_failure`, `cloud_sync_reconcile_failure`, `cloud_sync_retry_after_seconds`, `cloud_sync_transient_empty_result`, `config`, `encrypt`, `get_login_config`, `get_password`, `handle_2fa`, `handle_circle`, `handle_photostream`, `is_cloud_sync_hex_digest`, `is_cloud_sync_keyed_hash`, `is_cloud_sync_lease_reference`, `is_cloud_sync_operation_id`, `is_cloud_sync_protected_reference`, `is_cloud_sync_protected_source_reference`, `is_valid_cloud_sync_reconcile_message_create_input`, `local_cloud_sync_protected_failure`, `map_cloud_sync_outbound_failure_class`, `map_cloud_sync_outbound_failure`, `map_cloud_sync_protected_category`, `map_cloud_sync_protected_change`, `map_cloud_sync_protected_failure`, `map_cloud_sync_protected_page`, `map_cloud_sync_protected_safe_code`, `map_cloud_sync_raw_page`, `map_cloud_sync_transient_attributed_body`, `map_cloud_sync_transient_chat_style`, `map_cloud_sync_transient_deferred`, `map_cloud_sync_transient_entity_kind`, `map_cloud_sync_transient_failure`, `map_cloud_sync_transient_field_state`, `map_cloud_sync_transient_known_flags`, `map_cloud_sync_transient_message_edit`, `map_cloud_sync_transient_payload`, `map_cloud_sync_transient_quarantine`, `map_cloud_sync_transient_reaction_kind`, `map_cloud_sync_transient_service`, `map_cloud_sync_transient_snapshot`, `map_cloud_sync_transient_text_run`, `migrate`, `plist_to_bin`, `plist_to_buf`, `plist_to_string`, `reset_user`, `shared_items`, `subscribe_streams`, `unmap_cloud_sync_transient_entity_kind`, `wrap_sink` // These functions are ignored because they have generic arguments: `bin_deserialize`, `bin_serialize` -// These types are ignored because they are not used by any `pub` functions: `AnisetteState`, `DaemonData`, `FLUTTER_RUST_BRIDGE_HANDLER`, `GSAConfig`, `NSArrayClass`, `NSArrayIconArray`, `NSArrayImageArray`, `ProvisionedAnisette` -// These function are ignored because they are on traits that is not defined in current crate (put an empty `#[frb]` on it to unignore): `clone`, `clone`, `clone`, `clone`, `clone`, `clone`, `clone`, `clone`, `clone`, `clone`, `clone`, `clone`, `deref`, `deref`, `eq`, `fmt`, `get_files`, `initialize`, `spawn` +// These types are ignored because they are not used by any `pub` functions: `AnisetteState`, `CloudSyncReconcileObservation`, `DaemonData`, `FLUTTER_RUST_BRIDGE_HANDLER`, `GSAConfig`, `NSArrayClass`, `NSArrayIconArray`, `NSArrayImageArray`, `ProvisionedAnisette` +// These function are ignored because they are on traits that is not defined in current crate (put an empty `#[frb]` on it to unignore): `assert_fields_are_eq`, `assert_fields_are_eq`, `assert_fields_are_eq`, `assert_fields_are_eq`, `assert_fields_are_eq`, `assert_fields_are_eq`, `assert_fields_are_eq`, `assert_fields_are_eq`, `assert_fields_are_eq`, `assert_fields_are_eq`, `assert_fields_are_eq`, `assert_fields_are_eq`, `assert_fields_are_eq`, `assert_fields_are_eq`, `assert_fields_are_eq`, `assert_fields_are_eq`, `assert_fields_are_eq`, `assert_fields_are_eq`, `assert_fields_are_eq`, `assert_fields_are_eq`, `clone`, `clone`, `clone`, `clone`, `clone`, `clone`, `clone`, `clone`, `clone`, `clone`, `clone`, `clone`, `clone`, `clone`, `clone`, `clone`, `clone`, `clone`, `clone`, `clone`, `clone`, `clone`, `clone`, `clone`, `clone`, `clone`, `clone`, `clone`, `clone`, `clone`, `clone`, `clone`, `clone`, `clone`, `clone`, `clone`, `clone`, `clone`, `clone`, `clone`, `clone`, `clone`, `clone`, `clone`, `clone`, `clone`, `clone`, `clone`, `clone`, `clone`, `clone`, `clone`, `clone`, `clone`, `clone`, `clone`, `clone`, `clone`, `clone`, `clone`, `clone`, `clone`, `clone`, `clone`, `clone`, `clone`, `deref`, `deref`, `eq`, `eq`, `eq`, `eq`, `eq`, `eq`, `eq`, `eq`, `eq`, `eq`, `eq`, `eq`, `eq`, `eq`, `eq`, `eq`, `eq`, `eq`, `eq`, `eq`, `eq`, `fmt`, `fmt`, `fmt`, `fmt`, `fmt`, `fmt`, `fmt`, `fmt`, `fmt`, `fmt`, `fmt`, `fmt`, `fmt`, `fmt`, `fmt`, `fmt`, `fmt`, `fmt`, `fmt`, `fmt`, `fmt`, `fmt`, `fmt`, `fmt`, `fmt`, `fmt`, `fmt`, `fmt`, `fmt`, `fmt`, `fmt`, `fmt`, `fmt`, `fmt`, `fmt`, `fmt`, `fmt`, `fmt`, `fmt`, `fmt`, `fmt`, `fmt`, `fmt`, `fmt`, `fmt`, `get_files`, `initialize`, `spawn` ChatProto decodeChatproto({required GZipWrapperChatProto wrapped}) => RustLib.instance.api.crateApiApiDecodeChatproto(wrapped: wrapped); @@ -23,50 +23,314 @@ GZipWrapperChatProto encodeChatproto({required ChatProto chat}) => MessageProto decodeMessageproto({required GZipWrapperMessageProto wrapped}) => RustLib.instance.api.crateApiApiDecodeMessageproto(wrapped: wrapped); -GZipWrapperMessageProto encodeMessageproto( - {required MessageProto messageproto}) => - RustLib.instance.api - .crateApiApiEncodeMessageproto(messageproto: messageproto); - -MessageProto2 decodeMessageproto2( - {required GZipWrapperMessageProto2 wrapped}) => - RustLib.instance.api.crateApiApiDecodeMessageproto2(wrapped: wrapped); - -GZipWrapperMessageProto2 encodeMessageproto2( - {required MessageProto2 messageproto2}) => - RustLib.instance.api - .crateApiApiEncodeMessageproto2(messageproto2: messageproto2); - -MessageProto3 decodeMessageproto3( - {required GZipWrapperMessageProto3 wrapped}) => - RustLib.instance.api.crateApiApiDecodeMessageproto3(wrapped: wrapped); - -GZipWrapperMessageProto3 encodeMessageproto3( - {required MessageProto3 messageproto3}) => - RustLib.instance.api - .crateApiApiEncodeMessageproto3(messageproto3: messageproto3); - -MessageProto4 decodeMessageproto4( - {required GZipWrapperMessageProto4 wrapped}) => - RustLib.instance.api.crateApiApiDecodeMessageproto4(wrapped: wrapped); - -GZipWrapperMessageProto4 encodeMessageproto4( - {required MessageProto4 messageproto4}) => - RustLib.instance.api - .crateApiApiEncodeMessageproto4(messageproto4: messageproto4); - -AttachmentMeta decodeAttachmentmeta( - {required GZipWrapperAttachmentMeta wrapped}) => - RustLib.instance.api.crateApiApiDecodeAttachmentmeta(wrapped: wrapped); - -GZipWrapperAttachmentMeta encodeAttachmentmeta( - {required AttachmentMeta attachmentmeta}) => - RustLib.instance.api - .crateApiApiEncodeAttachmentmeta(attachmentmeta: attachmentmeta); +GZipWrapperMessageProto encodeMessageproto({ + required MessageProto messageproto, +}) => RustLib.instance.api.crateApiApiEncodeMessageproto( + messageproto: messageproto, +); + +MessageProto2 decodeMessageproto2({ + required GZipWrapperMessageProto2 wrapped, +}) => RustLib.instance.api.crateApiApiDecodeMessageproto2(wrapped: wrapped); + +GZipWrapperMessageProto2 encodeMessageproto2({ + required MessageProto2 messageproto2, +}) => RustLib.instance.api.crateApiApiEncodeMessageproto2( + messageproto2: messageproto2, +); + +MessageProto3 decodeMessageproto3({ + required GZipWrapperMessageProto3 wrapped, +}) => RustLib.instance.api.crateApiApiDecodeMessageproto3(wrapped: wrapped); + +GZipWrapperMessageProto3 encodeMessageproto3({ + required MessageProto3 messageproto3, +}) => RustLib.instance.api.crateApiApiEncodeMessageproto3( + messageproto3: messageproto3, +); + +MessageProto4 decodeMessageproto4({ + required GZipWrapperMessageProto4 wrapped, +}) => RustLib.instance.api.crateApiApiDecodeMessageproto4(wrapped: wrapped); + +GZipWrapperMessageProto4 encodeMessageproto4({ + required MessageProto4 messageproto4, +}) => RustLib.instance.api.crateApiApiEncodeMessageproto4( + messageproto4: messageproto4, +); + +AttachmentMeta decodeAttachmentmeta({ + required GZipWrapperAttachmentMeta wrapped, +}) => RustLib.instance.api.crateApiApiDecodeAttachmentmeta(wrapped: wrapped); + +GZipWrapperAttachmentMeta encodeAttachmentmeta({ + required AttachmentMeta attachmentmeta, +}) => RustLib.instance.api.crateApiApiEncodeAttachmentmeta( + attachmentmeta: attachmentmeta, +); Future doFirstTimeInit({required String path}) => RustLib.instance.api.crateApiApiDoFirstTimeInit(path: path); +/// Protects one Cloud Sync V2 value at rest. +/// +/// The complete scope and purpose are authenticated by the platform bridge. +/// This function does not perform CloudKit I/O or enable sync writes. +String cloudSyncProtect({ + required String storageDirectory, + required String accountFingerprint, + required String container, + required String database, + required String zone, + required String streamKind, + required int schemaVersion, + required String purpose, + required String plaintext, +}) => RustLib.instance.api.crateApiApiCloudSyncProtect( + storageDirectory: storageDirectory, + accountFingerprint: accountFingerprint, + container: container, + database: database, + zone: zone, + streamKind: streamKind, + schemaVersion: schemaVersion, + purpose: purpose, + plaintext: plaintext, +); + +/// Opens one Cloud Sync V2 value only in its original scope and purpose. +String cloudSyncUnprotect({ + required String storageDirectory, + required String accountFingerprint, + required String container, + required String database, + required String zone, + required String streamKind, + required int schemaVersion, + required String purpose, + required String ciphertext, +}) => RustLib.instance.api.crateApiApiCloudSyncUnprotect( + storageDirectory: storageDirectory, + accountFingerprint: accountFingerprint, + container: container, + database: database, + zone: zone, + streamKind: streamKind, + schemaVersion: schemaVersion, + purpose: purpose, + ciphertext: ciphertext, +); + +/// Returns a per-install HMAC-SHA256 account fingerprint. +String cloudSyncFingerprintAccount({ + required String storageDirectory, + required String rawAccountIdentifier, +}) => RustLib.instance.api.crateApiApiCloudSyncFingerprintAccount( + storageDirectory: storageDirectory, + rawAccountIdentifier: rawAccountIdentifier, +); + +Future cloudSyncCaptureAuthSnapshot({ + required ArcCloudMessagesClientDefaultAnisetteProvider cloudMessagesClient, + required String storageDirectory, +}) => RustLib.instance.api.crateApiApiCloudSyncCaptureAuthSnapshot( + cloudMessagesClient: cloudMessagesClient, + storageDirectory: storageDirectory, +); + +/// Converts one transient outgoing iMessage into a protected, crash-recoverable +/// outbox payload and stable server-record mapping. Message content and the raw +/// server record name remain native-only. +Future cloudSyncStageOutboundMessage({ + required ArcCloudMessagesClientDefaultAnisetteProvider cloudMessagesClient, + required String storageDirectory, + required String expectedAccountFingerprint, + required String expectedProtectedStoreIdentity, + required CloudMessage message, +}) => RustLib.instance.api.crateApiApiCloudSyncStageOutboundMessage( + cloudMessagesClient: cloudMessagesClient, + storageDirectory: storageDirectory, + expectedAccountFingerprint: expectedAccountFingerprint, + expectedProtectedStoreIdentity: expectedProtectedStoreIdentity, + message: message, +); + +/// Prepares a create-only CloudKit request without performing remote I/O. The +/// returned opaque handle owns PCS material, prepared authentication, exact +/// request identity, and all operations. It can be consumed only once. +Future cloudSyncPrepareMessageCreate({ + required ArcCloudMessagesClientDefaultAnisetteProvider cloudMessagesClient, + required String storageDirectory, + required String expectedAccountFingerprint, + required String expectedProtectedStoreIdentity, + required String requestUuid, + required BigInt requestTimeoutSeconds, + required List inputs, +}) => RustLib.instance.api.crateApiApiCloudSyncPrepareMessageCreate( + cloudMessagesClient: cloudMessagesClient, + storageDirectory: storageDirectory, + expectedAccountFingerprint: expectedAccountFingerprint, + expectedProtectedStoreIdentity: expectedProtectedStoreIdentity, + requestUuid: requestUuid, + requestTimeoutSeconds: requestTimeoutSeconds, + inputs: inputs, +); + +Future cloudSyncConsumePreparedMessageCreate({ + required CloudSyncPreparedMessageCreateHandle handle, +}) => RustLib.instance.api.crateApiApiCloudSyncConsumePreparedMessageCreate( + handle: handle, +); + +/// Reconciles one ambiguous create by fetching its stable CloudKit record name +/// and comparing the decrypted server message with the exact protected payload +/// staged before submission. Only explicit record absence permits replay. +Future cloudSyncReconcileMessageCreate({ + required ArcCloudMessagesClientDefaultAnisetteProvider cloudMessagesClient, + required String storageDirectory, + required String expectedAccountFingerprint, + required String expectedProtectedStoreIdentity, + required String requestUuid, + required CloudSyncPreparedMessageCreateInput input, +}) => RustLib.instance.api.crateApiApiCloudSyncReconcileMessageCreate( + cloudMessagesClient: cloudMessagesClient, + storageDirectory: storageDirectory, + expectedAccountFingerprint: expectedAccountFingerprint, + expectedProtectedStoreIdentity: expectedProtectedStoreIdentity, + requestUuid: requestUuid, + input: input, +); + +/// Fetches and protects one bounded CloudKit page without allowing raw record +/// material, Apple identifiers, etags, continuation tokens, or paths to cross +/// Flutter Rust Bridge. +Future cloudSyncFetchProtectedPage({ + required ArcCloudMessagesClientDefaultAnisetteProvider cloudMessagesClient, + required String storageDirectory, + required String expectedAccountFingerprint, + required String stream, + required BigInt generation, + String? previousCheckpointReference, + required int maximumChanges, +}) => RustLib.instance.api.crateApiApiCloudSyncFetchProtectedPage( + cloudMessagesClient: cloudMessagesClient, + storageDirectory: storageDirectory, + expectedAccountFingerprint: expectedAccountFingerprint, + stream: stream, + generation: generation, + previousCheckpointReference: previousCheckpointReference, + maximumChanges: maximumChanges, +); + +CloudSyncProtectedLeaseResult cloudSyncCommitProtectedPageLease({ + required String storageDirectory, + required String pageLeaseReference, + required List retainedReferences, +}) => RustLib.instance.api.crateApiApiCloudSyncCommitProtectedPageLease( + storageDirectory: storageDirectory, + pageLeaseReference: pageLeaseReference, + retainedReferences: retainedReferences, +); + +CloudSyncProtectedLeaseResult cloudSyncAcknowledgeCommittedPageLease({ + required String storageDirectory, + required String pageLeaseReference, +}) => RustLib.instance.api.crateApiApiCloudSyncAcknowledgeCommittedPageLease( + storageDirectory: storageDirectory, + pageLeaseReference: pageLeaseReference, +); + +CloudSyncProtectedLeaseResult cloudSyncRollbackProtectedPageLease({ + required String storageDirectory, + required String pageLeaseReference, +}) => RustLib.instance.api.crateApiApiCloudSyncRollbackProtectedPageLease( + storageDirectory: storageDirectory, + pageLeaseReference: pageLeaseReference, +); + +CloudSyncProtectedRecoveryResult cloudSyncRecoverAbandonedPageLeases({ + required String storageDirectory, + required List adoptedLeaseReferences, + required List liveReferences, + required bool liveReferenceEnumerationComplete, +}) => RustLib.instance.api.crateApiApiCloudSyncRecoverAbandonedPageLeases( + storageDirectory: storageDirectory, + adoptedLeaseReferences: adoptedLeaseReferences, + liveReferences: liveReferences, + liveReferenceEnumerationComplete: liveReferenceEnumerationComplete, +); + +CloudSyncProtectedRetirementResult cloudSyncRetireProtectedReferences({ + required String storageDirectory, + required List references, +}) => RustLib.instance.api.crateApiApiCloudSyncRetireProtectedReferences( + storageDirectory: storageDirectory, + references: references, +); + +CloudSyncProtectedGarbageCollectionResult cloudSyncCollectProtectedGarbage({ + required String storageDirectory, + required List liveReferences, + required bool liveReferenceEnumerationComplete, +}) => RustLib.instance.api.crateApiApiCloudSyncCollectProtectedGarbage( + storageDirectory: storageDirectory, + liveReferences: liveReferences, + liveReferenceEnumerationComplete: liveReferenceEnumerationComplete, +); + +/// Reads, unprotects, decrypts, and canonically converts one D0 protected +/// change. No raw Apple/CloudKit identifier, credential, key, or record body +/// crosses FRB. This entry point is intentionally not wired into production +/// composition. `expected_payload_length` is optional for legacy D0 rows that +/// retained the exact SHA-256 but not the redundant byte count; the protected +/// capability, digest, change ID, record hash, etag hash, and server timestamp +/// fences remain mandatory. +Future cloudSyncDecodeProtectedChange({ + required ArcCloudMessagesClientDefaultAnisetteProvider cloudMessagesClient, + required String storageDirectory, + required String expectedAccountFingerprint, + required String expectedProtectedStoreIdentity, + required String container, + required String database, + required String zone, + required String streamKind, + required int schemaVersion, + required String nativeStream, + required BigInt generation, + required CloudSyncProtectedChangeKind expectedChangeKind, + required String expectedChangeId, + required String expectedRecordIdHash, + String? expectedEtagHash, + required String expectedPayloadSha256, + BigInt? expectedPayloadLength, + PlatformInt64? expectedServerModifiedAtMillis, + required String protectedRawEnvelopeReference, + CloudSyncTransientEntityKind? tombstoneEntityKind, + String? tombstoneLogicalEntityKeyHash, +}) => RustLib.instance.api.crateApiApiCloudSyncDecodeProtectedChange( + cloudMessagesClient: cloudMessagesClient, + storageDirectory: storageDirectory, + expectedAccountFingerprint: expectedAccountFingerprint, + expectedProtectedStoreIdentity: expectedProtectedStoreIdentity, + container: container, + database: database, + zone: zone, + streamKind: streamKind, + schemaVersion: schemaVersion, + nativeStream: nativeStream, + generation: generation, + expectedChangeKind: expectedChangeKind, + expectedChangeId: expectedChangeId, + expectedRecordIdHash: expectedRecordIdHash, + expectedEtagHash: expectedEtagHash, + expectedPayloadSha256: expectedPayloadSha256, + expectedPayloadLength: expectedPayloadLength, + expectedServerModifiedAtMillis: expectedServerModifiedAtMillis, + protectedRawEnvelopeReference: protectedRawEnvelopeReference, + tombstoneEntityKind: tombstoneEntityKind, + tombstoneLogicalEntityKeyHash: tombstoneLogicalEntityKeyHash, +); + IdsngmIdentity decodeIdentity({required List identity}) => RustLib.instance.api.crateApiApiDecodeIdentity(identity: identity); @@ -88,12 +352,15 @@ SavedHardwareState? readHardware({required String path}) => void resetAnisette({required String path}) => RustLib.instance.api.crateApiApiResetAnisette(path: path); -Future makeAnisette( - {required String path, - required JoinedOsConfig config, - required ApsConnection conn}) => - RustLib.instance.api - .crateApiApiMakeAnisette(path: path, config: config, conn: conn); +Future makeAnisette({ + required String path, + required JoinedOsConfig config, + required ApsConnection conn, +}) => RustLib.instance.api.crateApiApiMakeAnisette( + path: path, + config: config, + conn: conn, +); List? restoreUsers({required String path}) => RustLib.instance.api.crateApiApiRestoreUsers(path: path); @@ -101,188 +368,235 @@ List? restoreUsers({required String path}) => void saveUsers({required List users, required String path}) => RustLib.instance.api.crateApiApiSaveUsers(users: users, path: path); -Future makeImclient( - {required String path, - required ApsConnection conn, - required List users, - required IdsngmIdentity identity}) => - RustLib.instance.api.crateApiApiMakeImclient( - path: path, conn: conn, users: users, identity: identity); - -(Sender, ArcSenderPushMessage, ApsWatcher) buildWatcher( - {required ApsConnection conn, required ArcImClient client}) => - RustLib.instance.api.crateApiApiBuildWatcher(conn: conn, client: client); - -(Sender, ArcSenderPushMessage, ApsWatcher) importWatcher( - {required ReceiverApsMessage queue, required ArcImClient client}) => +Future makeImclient({ + required String path, + required ApsConnection conn, + required List users, + required IdsngmIdentity identity, +}) => RustLib.instance.api.crateApiApiMakeImclient( + path: path, + conn: conn, + users: users, + identity: identity, +); + +(Sender, ArcSenderPushMessage, ApsWatcher) buildWatcher({ + required ApsConnection conn, + required ArcImClient client, +}) => RustLib.instance.api.crateApiApiBuildWatcher(conn: conn, client: client); + +(Sender, ArcSenderPushMessage, ApsWatcher) importWatcher({ + required ReceiverApsMessage queue, + required ArcImClient client, +}) => RustLib.instance.api.crateApiApiImportWatcher(queue: queue, client: client); ReceiverApsMessage subscribeConn({required ApsConnection conn}) => RustLib.instance.api.crateApiApiSubscribeConn(conn: conn); -(String, SharedPushState) sendDaemon( - {required SharedPushState state, required ApsWatcher watcher}) => +(String, SharedPushState) sendDaemon({ + required SharedPushState state, + required ApsWatcher watcher, +}) => RustLib.instance.api.crateApiApiSendDaemon(state: state, watcher: watcher); -(ArcSharedPushState, SharedPushState) dupDaemonDesk( - {required SharedPushState state}) => - RustLib.instance.api.crateApiApiDupDaemonDesk(state: state); +(ArcSharedPushState, SharedPushState) dupDaemonDesk({ + required SharedPushState state, +}) => RustLib.instance.api.crateApiApiDupDaemonDesk(state: state); Future makeIdms({required ApsConnection conn}) => RustLib.instance.api.crateApiApiMakeIdms(conn: conn); -ArcMutexOptionCircleClientSessionDefaultAnisetteProvider makeClientSession( - {CircleClientSessionDefaultAnisetteProvider? circle}) => - RustLib.instance.api.crateApiApiMakeClientSession(circle: circle); +ArcMutexOptionCircleClientSessionDefaultAnisetteProvider makeClientSession({ + CircleClientSessionDefaultAnisetteProvider? circle, +}) => RustLib.instance.api.crateApiApiMakeClientSession(circle: circle); ArcMutexVecActiveCircleSession makeCircleSessions() => RustLib.instance.api.crateApiApiMakeCircleSessions(); -Future restoreAccount( - {required String path, - required ArcAnisetteClientDefaultAnisetteProvider anisette, - required JoinedOsConfig config, - required ApsConnection conn}) => - RustLib.instance.api.crateApiApiRestoreAccount( - path: path, anisette: anisette, config: config, conn: conn); - -ArcTokenProviderDefaultAnisetteProvider makeTokenProvider( - {required ArcMutexAppleAccountDefaultAnisetteProvider account, - required JoinedOsConfig config}) => - RustLib.instance.api - .crateApiApiMakeTokenProvider(account: account, config: config); - -Future makeSharedStreams( - {required String path, - required ApsConnection conn, - required ArcAnisetteClientDefaultAnisetteProvider anisette, - required JoinedOsConfig config, - required ArcTokenProviderDefaultAnisetteProvider token}) => - RustLib.instance.api.crateApiApiMakeSharedStreams( - path: path, - conn: conn, - anisette: anisette, - config: config, - token: token); - -Future makeCloudkit( - {required String path, - required ArcAnisetteClientDefaultAnisetteProvider anisette, - required JoinedOsConfig config, - required ArcTokenProviderDefaultAnisetteProvider tokenProvider}) => - RustLib.instance.api.crateApiApiMakeCloudkit( - path: path, - anisette: anisette, - config: config, - tokenProvider: tokenProvider); - -Future makeProfiles( - {required ArcCloudKitClientDefaultAnisetteProvider cloudkit}) => - RustLib.instance.api.crateApiApiMakeProfiles(cloudkit: cloudkit); - -Future makePasswords( - {required String path, - required ArcKeychainClientDefaultAnisetteProvider keychain, - required ArcCloudKitClientDefaultAnisetteProvider cloudkit, - required ArcImClient client, - required ApsConnection conn}) => - RustLib.instance.api.crateApiApiMakePasswords( - path: path, - keychain: keychain, - cloudkit: cloudkit, - client: client, - conn: conn); - -Future syncWifiPasswords( - {required ArcPasswordManagerDefaultAnisetteProvider manager, - required bool userApprove}) => - RustLib.instance.api.crateApiApiSyncWifiPasswords( - manager: manager, userApprove: userApprove); - -Future makeFacetime( - {required String path, - required ApsConnection conn, - required ArcImClient client}) => - RustLib.instance.api - .crateApiApiMakeFacetime(path: path, conn: conn, client: client); - -Future makeStatuskit( - {required String path, - required ArcTokenProviderDefaultAnisetteProvider provider, - required ApsConnection conn, - required JoinedOsConfig config, - required ArcImClient client}) => - RustLib.instance.api.crateApiApiMakeStatuskit( - path: path, - provider: provider, - conn: conn, - config: config, - client: client); - -ArcKeychainClientDefaultAnisetteProvider? makeKeychain( - {required String path, - required ArcCloudKitClientDefaultAnisetteProvider cloudkit, - required ArcAnisetteClientDefaultAnisetteProvider anisette, - required JoinedOsConfig config, - required ArcTokenProviderDefaultAnisetteProvider tokenProvider}) => - RustLib.instance.api.crateApiApiMakeKeychain( - path: path, - cloudkit: cloudkit, - anisette: anisette, - config: config, - tokenProvider: tokenProvider); - -ArcCloudMessagesClientDefaultAnisetteProvider makeCloudMessagesClient( - {required ArcCloudKitClientDefaultAnisetteProvider cloudkit, - required ArcKeychainClientDefaultAnisetteProvider keychain}) => - RustLib.instance.api.crateApiApiMakeCloudMessagesClient( - cloudkit: cloudkit, keychain: keychain); - -Future makeFindmy( - {required String path, - required ArcTokenProviderDefaultAnisetteProvider tokenProvider, - required ApsConnection conn, - required ArcCloudKitClientDefaultAnisetteProvider cloudkit, - required ArcKeychainClientDefaultAnisetteProvider keychain, - required ArcAnisetteClientDefaultAnisetteProvider anisette, - required JoinedOsConfig config, - required ArcImClient client}) => - RustLib.instance.api.crateApiApiMakeFindmy( - path: path, - tokenProvider: tokenProvider, - conn: conn, - cloudkit: cloudkit, - keychain: keychain, - anisette: anisette, - config: config, - client: client); +Future restoreAccount({ + required String path, + required ArcAnisetteClientDefaultAnisetteProvider anisette, + required JoinedOsConfig config, + required ApsConnection conn, +}) => RustLib.instance.api.crateApiApiRestoreAccount( + path: path, + anisette: anisette, + config: config, + conn: conn, +); + +ArcTokenProviderDefaultAnisetteProvider makeTokenProvider({ + required ArcMutexAppleAccountDefaultAnisetteProvider account, + required JoinedOsConfig config, +}) => RustLib.instance.api.crateApiApiMakeTokenProvider( + account: account, + config: config, +); + +Future makeSharedStreams({ + required String path, + required ApsConnection conn, + required ArcAnisetteClientDefaultAnisetteProvider anisette, + required JoinedOsConfig config, + required ArcTokenProviderDefaultAnisetteProvider token, +}) => RustLib.instance.api.crateApiApiMakeSharedStreams( + path: path, + conn: conn, + anisette: anisette, + config: config, + token: token, +); + +Future makeCloudkit({ + required String path, + required ArcAnisetteClientDefaultAnisetteProvider anisette, + required JoinedOsConfig config, + required ArcTokenProviderDefaultAnisetteProvider tokenProvider, +}) => RustLib.instance.api.crateApiApiMakeCloudkit( + path: path, + anisette: anisette, + config: config, + tokenProvider: tokenProvider, +); + +Future makeProfiles({ + required ArcCloudKitClientDefaultAnisetteProvider cloudkit, +}) => RustLib.instance.api.crateApiApiMakeProfiles(cloudkit: cloudkit); + +Future makePasswords({ + required String path, + required ArcKeychainClientDefaultAnisetteProvider keychain, + required ArcCloudKitClientDefaultAnisetteProvider cloudkit, + required ArcImClient client, + required ApsConnection conn, +}) => RustLib.instance.api.crateApiApiMakePasswords( + path: path, + keychain: keychain, + cloudkit: cloudkit, + client: client, + conn: conn, +); + +Future syncWifiPasswords({ + required ArcPasswordManagerDefaultAnisetteProvider manager, + required bool userApprove, +}) => RustLib.instance.api.crateApiApiSyncWifiPasswords( + manager: manager, + userApprove: userApprove, +); + +Future makeFacetime({ + required String path, + required ApsConnection conn, + required ArcImClient client, +}) => RustLib.instance.api.crateApiApiMakeFacetime( + path: path, + conn: conn, + client: client, +); + +Future makeStatuskit({ + required String path, + required ArcTokenProviderDefaultAnisetteProvider provider, + required ApsConnection conn, + required JoinedOsConfig config, + required ArcImClient client, +}) => RustLib.instance.api.crateApiApiMakeStatuskit( + path: path, + provider: provider, + conn: conn, + config: config, + client: client, +); + +ArcKeychainClientDefaultAnisetteProvider? makeKeychain({ + required String path, + required ArcCloudKitClientDefaultAnisetteProvider cloudkit, + required ArcAnisetteClientDefaultAnisetteProvider anisette, + required JoinedOsConfig config, + required ArcTokenProviderDefaultAnisetteProvider tokenProvider, +}) => RustLib.instance.api.crateApiApiMakeKeychain( + path: path, + cloudkit: cloudkit, + anisette: anisette, + config: config, + tokenProvider: tokenProvider, +); + +ArcCloudMessagesClientDefaultAnisetteProvider makeCloudMessagesClient({ + required ArcCloudKitClientDefaultAnisetteProvider cloudkit, + required ArcKeychainClientDefaultAnisetteProvider keychain, +}) => RustLib.instance.api.crateApiApiMakeCloudMessagesClient( + cloudkit: cloudkit, + keychain: keychain, +); + +Future makeFindmy({ + required String path, + required ArcTokenProviderDefaultAnisetteProvider tokenProvider, + required ApsConnection conn, + required ArcCloudKitClientDefaultAnisetteProvider cloudkit, + required ArcKeychainClientDefaultAnisetteProvider keychain, + required ArcAnisetteClientDefaultAnisetteProvider anisette, + required JoinedOsConfig config, + required ArcImClient client, +}) => RustLib.instance.api.crateApiApiMakeFindmy( + path: path, + tokenProvider: tokenProvider, + conn: conn, + cloudkit: cloudkit, + keychain: keychain, + anisette: anisette, + config: config, + client: client, +); IdsUser duplicateUser({required IdsUser user}) => RustLib.instance.api.crateApiApiDuplicateUser(user: user); -Future<(List?, SupportAlert?)> registerIds( - {required String path, - required JoinedOsConfig config, - required ApsConnection aps, - required IdsngmIdentity identity, - required List users}) => - RustLib.instance.api.crateApiApiRegisterIds( - path: path, config: config, aps: aps, identity: identity, users: users); - -Future setIdentity( - {required String statePath, - required JoinedOsConfig config, - required IdsngmIdentity identity}) => - RustLib.instance.api.crateApiApiSetIdentity( - statePath: statePath, config: config, identity: identity); - -Future<(ApsConnection, PushError?)> setupPush( - {required JoinedOsConfig config, - required IdsngmIdentity identity, - ApsState? state, - required String statePath}) => - RustLib.instance.api.crateApiApiSetupPush( - config: config, identity: identity, state: state, statePath: statePath); +Future<(List?, SupportAlert?)> registerIds({ + required String path, + required JoinedOsConfig config, + required ApsConnection aps, + required IdsngmIdentity identity, + required List users, +}) => RustLib.instance.api.crateApiApiRegisterIds( + path: path, + config: config, + aps: aps, + identity: identity, + users: users, +); + +Future setIdentity({ + required String statePath, + required JoinedOsConfig config, + required IdsngmIdentity identity, +}) => RustLib.instance.api.crateApiApiSetIdentity( + statePath: statePath, + config: config, + identity: identity, +); + +Future<(ApsConnection, PushError?)> setupPush({ + required JoinedOsConfig config, + required IdsngmIdentity identity, + ApsState? state, + required String statePath, +}) => RustLib.instance.api.crateApiApiSetupPush( + config: config, + identity: identity, + state: state, + statePath: statePath, +); + +Future getApsConnectionStatus({ + required ApsConnection aps, +}) => RustLib.instance.api.crateApiApiGetApsConnectionStatus(aps: aps); + +Future refreshApsConnection({required ApsConnection aps}) => + RustLib.instance.api.crateApiApiRefreshApsConnection(aps: aps); Future configureAppReview({required String path}) => RustLib.instance.api.crateApiApiConfigureAppReview(path: path); @@ -292,58 +606,66 @@ Future encodeHex({required List bytes}) => Future generateUdid() => RustLib.instance.api.crateApiApiGenerateUdid(); -Future configFromValidationData( - {required List data, required HwExtra extra}) => - RustLib.instance.api - .crateApiApiConfigFromValidationData(data: data, extra: extra); - -Future configFromRelay( - {required String code, required String host, String? token}) => - RustLib.instance.api - .crateApiApiConfigFromRelay(code: code, host: host, token: token); +Future configFromValidationData({ + required List data, + required HwExtra extra, +}) => RustLib.instance.api.crateApiApiConfigFromValidationData( + data: data, + extra: extra, +); + +Future configFromRelay({ + required String code, + required String host, + String? token, +}) => RustLib.instance.api.crateApiApiConfigFromRelay( + code: code, + host: host, + token: token, +); Future validateRelay({required JoinedOsConfig configRef}) => RustLib.instance.api.crateApiApiValidateRelay(configRef: configRef); -Future parseTranscriptPoster( - {required List payload}) => - RustLib.instance.api.crateApiApiParseTranscriptPoster(payload: payload); +Future parseTranscriptPoster({ + required List payload, +}) => RustLib.instance.api.crateApiApiParseTranscriptPoster(payload: payload); -Future packTranscriptPoster( - {required SimplifiedTranscriptPoster payload}) => - RustLib.instance.api.crateApiApiPackTranscriptPoster(payload: payload); +Future packTranscriptPoster({ + required SimplifiedTranscriptPoster payload, +}) => RustLib.instance.api.crateApiApiPackTranscriptPoster(payload: payload); -Future parsePoster( - {required IMessagePosterRecord poster}) => - RustLib.instance.api.crateApiApiParsePoster(poster: poster); +Future parsePoster({ + required IMessagePosterRecord poster, +}) => RustLib.instance.api.crateApiApiParsePoster(poster: poster); -Future fromPoster( - {required SimplifiedIncomingCallPoster poster}) => - RustLib.instance.api.crateApiApiFromPoster(poster: poster); +Future fromPoster({ + required SimplifiedIncomingCallPoster poster, +}) => RustLib.instance.api.crateApiApiFromPoster(poster: poster); -SimplifiedIncomingCallPoster clonePoster( - {required SimplifiedIncomingCallPoster poster}) => - RustLib.instance.api.crateApiApiClonePoster(poster: poster); +SimplifiedIncomingCallPoster clonePoster({ + required SimplifiedIncomingCallPoster poster, +}) => RustLib.instance.api.crateApiApiClonePoster(poster: poster); -SimplifiedTranscriptPoster cloneTranscriptPoster( - {required SimplifiedTranscriptPoster poster}) => - RustLib.instance.api.crateApiApiCloneTranscriptPoster(poster: poster); +SimplifiedTranscriptPoster cloneTranscriptPoster({ + required SimplifiedTranscriptPoster poster, +}) => RustLib.instance.api.crateApiApiCloneTranscriptPoster(poster: poster); -Future transcriptPosterSave( - {required SimplifiedTranscriptPoster poster}) => - RustLib.instance.api.crateApiApiTranscriptPosterSave(poster: poster); +Future transcriptPosterSave({ + required SimplifiedTranscriptPoster poster, +}) => RustLib.instance.api.crateApiApiTranscriptPosterSave(poster: poster); -Future fromTranscriptPosterSave( - {required List poster}) => - RustLib.instance.api.crateApiApiFromTranscriptPosterSave(poster: poster); +Future fromTranscriptPosterSave({ + required List poster, +}) => RustLib.instance.api.crateApiApiFromTranscriptPosterSave(poster: poster); -Future parsePosterSave( - {required SimplifiedIncomingCallPoster poster}) => - RustLib.instance.api.crateApiApiParsePosterSave(poster: poster); +Future parsePosterSave({ + required SimplifiedIncomingCallPoster poster, +}) => RustLib.instance.api.crateApiApiParsePosterSave(poster: poster); -Future fromPosterSave( - {required List poster}) => - RustLib.instance.api.crateApiApiFromPosterSave(poster: poster); +Future fromPosterSave({ + required List poster, +}) => RustLib.instance.api.crateApiApiFromPosterSave(poster: poster); Future getDeviceInfo({required JoinedOsConfig config}) => RustLib.instance.api.crateApiApiGetDeviceInfo(config: config); @@ -363,302 +685,389 @@ Attachment restoreAttachment({required String data}) => Future saveAttachment({required Attachment att}) => RustLib.instance.api.crateApiApiSaveAttachment(att: att); -Future createImageArray( - {required LPImageMetadata img}) => - RustLib.instance.api.crateApiApiCreateImageArray(img: img); +Future createImageArray({ + required LPImageMetadata img, +}) => RustLib.instance.api.crateApiApiCreateImageArray(img: img); Future createIconArray({required LPIconMetadata img}) => RustLib.instance.api.crateApiApiCreateIconArray(img: img); Uint8List nsNull() => RustLib.instance.api.crateApiApiNsNull(); -Future syncPasswords( - {required ArcPasswordManagerDefaultAnisetteProvider passwords, - required ApsConnection conn}) => - RustLib.instance.api - .crateApiApiSyncPasswords(passwords: passwords, conn: conn); - -Future> getPasswords( - {required ArcPasswordManagerDefaultAnisetteProvider passwords}) => - RustLib.instance.api.crateApiApiGetPasswords(passwords: passwords); - -Future> getPasswordsMeta( - {required ArcPasswordManagerDefaultAnisetteProvider passwords}) => - RustLib.instance.api.crateApiApiGetPasswordsMeta(passwords: passwords); - -Future> getPasskeys( - {required ArcPasswordManagerDefaultAnisetteProvider passwords}) => - RustLib.instance.api.crateApiApiGetPasskeys(passwords: passwords); - -Future> getWifiPasswords( - {required ArcPasswordManagerDefaultAnisetteProvider passwords}) => - RustLib.instance.api.crateApiApiGetWifiPasswords(passwords: passwords); - -Future savePassword( - {required ArcPasswordManagerDefaultAnisetteProvider passwords, - required String id, - required PasswordRawEntry entry, - String? group}) => - RustLib.instance.api.crateApiApiSavePassword( - passwords: passwords, id: id, entry: entry, group: group); - -Future savePasswordMeta( - {required ArcPasswordManagerDefaultAnisetteProvider passwords, - required String id, - required PasswordManagerMeta entry, - String? group}) => - RustLib.instance.api.crateApiApiSavePasswordMeta( - passwords: passwords, id: id, entry: entry, group: group); - -Future savePasskey( - {required ArcPasswordManagerDefaultAnisetteProvider passwords, - required String id, - required Passkey entry, - String? group}) => - RustLib.instance.api.crateApiApiSavePasskey( - passwords: passwords, id: id, entry: entry, group: group); - -Future saveWifiPassword( - {required ArcPasswordManagerDefaultAnisetteProvider passwords, - required String id, - required WifiPassword entry, - String? group}) => - RustLib.instance.api.crateApiApiSaveWifiPassword( - passwords: passwords, id: id, entry: entry, group: group); - -Future deletePassword( - {required ArcPasswordManagerDefaultAnisetteProvider passwords, - required String id, - String? group}) => - RustLib.instance.api - .crateApiApiDeletePassword(passwords: passwords, id: id, group: group); - -Future deletePasswordMeta( - {required ArcPasswordManagerDefaultAnisetteProvider passwords, - required String id, - String? group}) => - RustLib.instance.api.crateApiApiDeletePasswordMeta( - passwords: passwords, id: id, group: group); - -Future deletePasskey( - {required ArcPasswordManagerDefaultAnisetteProvider passwords, - required String id, - String? group}) => - RustLib.instance.api - .crateApiApiDeletePasskey(passwords: passwords, id: id, group: group); - -Future deleteWifiPassword( - {required ArcPasswordManagerDefaultAnisetteProvider passwords, - required String id, - String? group}) => - RustLib.instance.api.crateApiApiDeleteWifiPassword( - passwords: passwords, id: id, group: group); +Future syncPasswords({ + required ArcPasswordManagerDefaultAnisetteProvider passwords, + required ApsConnection conn, +}) => RustLib.instance.api.crateApiApiSyncPasswords( + passwords: passwords, + conn: conn, +); + +Future> getPasswords({ + required ArcPasswordManagerDefaultAnisetteProvider passwords, +}) => RustLib.instance.api.crateApiApiGetPasswords(passwords: passwords); + +Future> getPasswordsMeta({ + required ArcPasswordManagerDefaultAnisetteProvider passwords, +}) => RustLib.instance.api.crateApiApiGetPasswordsMeta(passwords: passwords); + +Future> getPasskeys({ + required ArcPasswordManagerDefaultAnisetteProvider passwords, +}) => RustLib.instance.api.crateApiApiGetPasskeys(passwords: passwords); + +Future> getWifiPasswords({ + required ArcPasswordManagerDefaultAnisetteProvider passwords, +}) => RustLib.instance.api.crateApiApiGetWifiPasswords(passwords: passwords); + +Future savePassword({ + required ArcPasswordManagerDefaultAnisetteProvider passwords, + required String id, + required PasswordRawEntry entry, + String? group, +}) => RustLib.instance.api.crateApiApiSavePassword( + passwords: passwords, + id: id, + entry: entry, + group: group, +); + +Future savePasswordMeta({ + required ArcPasswordManagerDefaultAnisetteProvider passwords, + required String id, + required PasswordManagerMeta entry, + String? group, +}) => RustLib.instance.api.crateApiApiSavePasswordMeta( + passwords: passwords, + id: id, + entry: entry, + group: group, +); + +Future savePasskey({ + required ArcPasswordManagerDefaultAnisetteProvider passwords, + required String id, + required Passkey entry, + String? group, +}) => RustLib.instance.api.crateApiApiSavePasskey( + passwords: passwords, + id: id, + entry: entry, + group: group, +); + +Future saveWifiPassword({ + required ArcPasswordManagerDefaultAnisetteProvider passwords, + required String id, + required WifiPassword entry, + String? group, +}) => RustLib.instance.api.crateApiApiSaveWifiPassword( + passwords: passwords, + id: id, + entry: entry, + group: group, +); + +Future deletePassword({ + required ArcPasswordManagerDefaultAnisetteProvider passwords, + required String id, + String? group, +}) => RustLib.instance.api.crateApiApiDeletePassword( + passwords: passwords, + id: id, + group: group, +); + +Future deletePasswordMeta({ + required ArcPasswordManagerDefaultAnisetteProvider passwords, + required String id, + String? group, +}) => RustLib.instance.api.crateApiApiDeletePasswordMeta( + passwords: passwords, + id: id, + group: group, +); + +Future deletePasskey({ + required ArcPasswordManagerDefaultAnisetteProvider passwords, + required String id, + String? group, +}) => RustLib.instance.api.crateApiApiDeletePasskey( + passwords: passwords, + id: id, + group: group, +); + +Future deleteWifiPassword({ + required ArcPasswordManagerDefaultAnisetteProvider passwords, + required String id, + String? group, +}) => RustLib.instance.api.crateApiApiDeleteWifiPassword( + passwords: passwords, + id: id, + group: group, +); Future<(String, Map, Map)> - getGroups({required ArcPasswordManagerDefaultAnisetteProvider passwords}) => - RustLib.instance.api.crateApiApiGetGroups(passwords: passwords); - -Future createGroup( - {required ArcPasswordManagerDefaultAnisetteProvider passwords, - required String name}) => - RustLib.instance.api - .crateApiApiCreateGroup(passwords: passwords, name: name); - -Future deleteGroup( - {required ArcPasswordManagerDefaultAnisetteProvider passwords, - required String gid}) => +getGroups({required ArcPasswordManagerDefaultAnisetteProvider passwords}) => + RustLib.instance.api.crateApiApiGetGroups(passwords: passwords); + +Future createGroup({ + required ArcPasswordManagerDefaultAnisetteProvider passwords, + required String name, +}) => RustLib.instance.api.crateApiApiCreateGroup( + passwords: passwords, + name: name, +); + +Future deleteGroup({ + required ArcPasswordManagerDefaultAnisetteProvider passwords, + required String gid, +}) => RustLib.instance.api.crateApiApiDeleteGroup(passwords: passwords, gid: gid); -Future inviteUser( - {required ArcPasswordManagerDefaultAnisetteProvider passwords, - required String gid, - required String handle}) => - RustLib.instance.api - .crateApiApiInviteUser(passwords: passwords, gid: gid, handle: handle); - -Future removeUser( - {required ArcPasswordManagerDefaultAnisetteProvider passwords, - required String gid, - required String handle}) => - RustLib.instance.api - .crateApiApiRemoveUser(passwords: passwords, gid: gid, handle: handle); - -Future renameGroup( - {required ArcPasswordManagerDefaultAnisetteProvider passwords, - required String gid, - required String newname}) => - RustLib.instance.api.crateApiApiRenameGroup( - passwords: passwords, gid: gid, newname: newname); - -Future acceptInvite( - {required ArcPasswordManagerDefaultAnisetteProvider passwords, - required String inviteId}) => - RustLib.instance.api - .crateApiApiAcceptInvite(passwords: passwords, inviteId: inviteId); - -Future declineInvite( - {required ArcPasswordManagerDefaultAnisetteProvider passwords, - required String inviteId}) => - RustLib.instance.api - .crateApiApiDeclineInvite(passwords: passwords, inviteId: inviteId); - -Future queryHandle( - {required ArcPasswordManagerDefaultAnisetteProvider passwords, - required String handle}) => - RustLib.instance.api - .crateApiApiQueryHandle(passwords: passwords, handle: handle); - -Future<(String, UpdateAccountFinish)> updateAccountHeaders( - {required ArcMutexAppleAccountDefaultAnisetteProvider account, - required JoinedOsConfig config}) => - RustLib.instance.api - .crateApiApiUpdateAccountHeaders(account: account, config: config); - -Future> getAnisetteHeaders( - {required ArcAnisetteClientDefaultAnisetteProvider state, - required JoinedOsConfig config}) => - RustLib.instance.api - .crateApiApiGetAnisetteHeaders(state: state, config: config); - -Future> getContactsHeaders( - {required String path, - required ArcAnisetteClientDefaultAnisetteProvider state, - required ArcTokenProviderDefaultAnisetteProvider tokenProvider, - required JoinedOsConfig config}) => - RustLib.instance.api.crateApiApiGetContactsHeaders( - path: path, state: state, tokenProvider: tokenProvider, config: config); - -Future getEntitlements( - {required JoinedOsConfig config, - required ApsConnection conn, - required String mccmnc, - required String subscriber, - required String imei, - required FutureOr Function(String) processChallenge}) => - RustLib.instance.api.crateApiApiGetEntitlements( - config: config, - conn: conn, - mccmnc: mccmnc, - subscriber: subscriber, - imei: imei, - processChallenge: processChallenge); - -Future<(List, List)> getAlbums( - {required SyncManagerDefaultAnisetteProviderMyFilePackager lock, - required bool refresh}) => - RustLib.instance.api.crateApiApiGetAlbums(lock: lock, refresh: refresh); - -Future> subscribe( - {required SyncManagerDefaultAnisetteProviderMyFilePackager lock, - required String guid}) => - RustLib.instance.api.crateApiApiSubscribe(lock: lock, guid: guid); - -Future> unsubscribe( - {required SyncManagerDefaultAnisetteProviderMyFilePackager lock, - required String guid}) => - RustLib.instance.api.crateApiApiUnsubscribe(lock: lock, guid: guid); - -Future> subscribeToken( - {required SyncManagerDefaultAnisetteProviderMyFilePackager lock, - required String token}) => - RustLib.instance.api.crateApiApiSubscribeToken(lock: lock, token: token); - -Future> addAlbum( - {required SyncManagerDefaultAnisetteProviderMyFilePackager lock, - required String guid, - required String folder}) => - RustLib.instance.api - .crateApiApiAddAlbum(lock: lock, guid: guid, folder: folder); - -Future> removeAlbum( - {required SyncManagerDefaultAnisetteProviderMyFilePackager lock, - required String guid}) => - RustLib.instance.api.crateApiApiRemoveAlbum(lock: lock, guid: guid); - -Future<(Map, (String, BigInt)?)> getSyncstatus( - {required SyncManagerDefaultAnisetteProviderMyFilePackager lock}) => - RustLib.instance.api.crateApiApiGetSyncstatus(lock: lock); - -Future syncNow( - {required SyncManagerDefaultAnisetteProviderMyFilePackager lock}) => - RustLib.instance.api.crateApiApiSyncNow(lock: lock); +Future inviteUser({ + required ArcPasswordManagerDefaultAnisetteProvider passwords, + required String gid, + required String handle, +}) => RustLib.instance.api.crateApiApiInviteUser( + passwords: passwords, + gid: gid, + handle: handle, +); + +Future removeUser({ + required ArcPasswordManagerDefaultAnisetteProvider passwords, + required String gid, + required String handle, +}) => RustLib.instance.api.crateApiApiRemoveUser( + passwords: passwords, + gid: gid, + handle: handle, +); + +Future renameGroup({ + required ArcPasswordManagerDefaultAnisetteProvider passwords, + required String gid, + required String newname, +}) => RustLib.instance.api.crateApiApiRenameGroup( + passwords: passwords, + gid: gid, + newname: newname, +); + +Future acceptInvite({ + required ArcPasswordManagerDefaultAnisetteProvider passwords, + required String inviteId, +}) => RustLib.instance.api.crateApiApiAcceptInvite( + passwords: passwords, + inviteId: inviteId, +); + +Future declineInvite({ + required ArcPasswordManagerDefaultAnisetteProvider passwords, + required String inviteId, +}) => RustLib.instance.api.crateApiApiDeclineInvite( + passwords: passwords, + inviteId: inviteId, +); + +Future queryHandle({ + required ArcPasswordManagerDefaultAnisetteProvider passwords, + required String handle, +}) => RustLib.instance.api.crateApiApiQueryHandle( + passwords: passwords, + handle: handle, +); + +Future<(String, UpdateAccountFinish)> updateAccountHeaders({ + required ArcMutexAppleAccountDefaultAnisetteProvider account, + required JoinedOsConfig config, +}) => RustLib.instance.api.crateApiApiUpdateAccountHeaders( + account: account, + config: config, +); + +Future> getAnisetteHeaders({ + required ArcAnisetteClientDefaultAnisetteProvider state, + required JoinedOsConfig config, +}) => RustLib.instance.api.crateApiApiGetAnisetteHeaders( + state: state, + config: config, +); + +Future> getContactsHeaders({ + required String path, + required ArcAnisetteClientDefaultAnisetteProvider state, + required ArcTokenProviderDefaultAnisetteProvider tokenProvider, + required JoinedOsConfig config, +}) => RustLib.instance.api.crateApiApiGetContactsHeaders( + path: path, + state: state, + tokenProvider: tokenProvider, + config: config, +); + +Future getEntitlements({ + required JoinedOsConfig config, + required ApsConnection conn, + required String mccmnc, + required String subscriber, + required String imei, + required FutureOr Function(String) processChallenge, +}) => RustLib.instance.api.crateApiApiGetEntitlements( + config: config, + conn: conn, + mccmnc: mccmnc, + subscriber: subscriber, + imei: imei, + processChallenge: processChallenge, +); + +Future<(List, List)> getAlbums({ + required SyncManagerDefaultAnisetteProviderMyFilePackager lock, + required bool refresh, +}) => RustLib.instance.api.crateApiApiGetAlbums(lock: lock, refresh: refresh); + +Future> subscribe({ + required SyncManagerDefaultAnisetteProviderMyFilePackager lock, + required String guid, +}) => RustLib.instance.api.crateApiApiSubscribe(lock: lock, guid: guid); + +Future> unsubscribe({ + required SyncManagerDefaultAnisetteProviderMyFilePackager lock, + required String guid, +}) => RustLib.instance.api.crateApiApiUnsubscribe(lock: lock, guid: guid); + +Future> subscribeToken({ + required SyncManagerDefaultAnisetteProviderMyFilePackager lock, + required String token, +}) => RustLib.instance.api.crateApiApiSubscribeToken(lock: lock, token: token); + +Future> addAlbum({ + required SyncManagerDefaultAnisetteProviderMyFilePackager lock, + required String guid, + required String folder, +}) => RustLib.instance.api.crateApiApiAddAlbum( + lock: lock, + guid: guid, + folder: folder, +); + +Future> removeAlbum({ + required SyncManagerDefaultAnisetteProviderMyFilePackager lock, + required String guid, +}) => RustLib.instance.api.crateApiApiRemoveAlbum(lock: lock, guid: guid); + +Future<(Map, (String, BigInt)?)> getSyncstatus({ + required SyncManagerDefaultAnisetteProviderMyFilePackager lock, +}) => RustLib.instance.api.crateApiApiGetSyncstatus(lock: lock); + +Future syncNow({ + required SyncManagerDefaultAnisetteProviderMyFilePackager lock, +}) => RustLib.instance.api.crateApiApiSyncNow(lock: lock); Future> ftSessions({required ArcFtClient facetime}) => RustLib.instance.api.crateApiApiFtSessions(facetime: facetime); -Future getFtLink( - {required ArcFtClient facetime, required String usage}) => +Future getFtLink({ + required ArcFtClient facetime, + required String usage, +}) => RustLib.instance.api.crateApiApiGetFtLink(facetime: facetime, usage: usage); -Future useLinkFor( - {required ArcFtClient facetime, - required String oldUsage, - required String usage}) => - RustLib.instance.api.crateApiApiUseLinkFor( - facetime: facetime, oldUsage: oldUsage, usage: usage); +Future useLinkFor({ + required ArcFtClient facetime, + required String oldUsage, + required String usage, +}) => RustLib.instance.api.crateApiApiUseLinkFor( + facetime: facetime, + oldUsage: oldUsage, + usage: usage, +); Future clearLinks({required ArcFtClient facetime}) => RustLib.instance.api.crateApiApiClearLinks(facetime: facetime); -Future get2FaCode( - {required ArcAnisetteClientDefaultAnisetteProvider anisette}) => - RustLib.instance.api.crateApiApiGet2FaCode(anisette: anisette); - -Future teardown2Fa( - {required ArcMutexAppleAccountDefaultAnisetteProvider account, - required String action, - required String txnid}) => - RustLib.instance.api - .crateApiApiTeardown2Fa(account: account, action: action, txnid: txnid); - -Future answerFtRequest( - {required ArcFtClient facetime, - required LetMeInRequest request, - String? approvedGroup}) => - RustLib.instance.api.crateApiApiAnswerFtRequest( - facetime: facetime, request: request, approvedGroup: approvedGroup); - -Future declineFacetime( - {required ArcFtClient facetime, required String guid}) => - RustLib.instance.api - .crateApiApiDeclineFacetime(facetime: facetime, guid: guid); - -Future createFacetime( - {required ArcFtClient facetime, - required String uuid, - required String handle, - required List participants}) => - RustLib.instance.api.crateApiApiCreateFacetime( - facetime: facetime, - uuid: uuid, - handle: handle, - participants: participants); - -Future cancelFacetime( - {required ArcFtClient facetime, required String guid}) => - RustLib.instance.api - .crateApiApiCancelFacetime(facetime: facetime, guid: guid); - -Future> validateTargetsFacetime( - {required ArcImClient state, - required List targets, - required String sender}) => - RustLib.instance.api.crateApiApiValidateTargetsFacetime( - state: state, targets: targets, sender: sender); - -Future certifyDelivery( - {required ArcImClient state, - required CertifiedContext context, - required bool notify}) => - RustLib.instance.api.crateApiApiCertifyDelivery( - state: state, context: context, notify: notify); - -Future reportMessages( - {required ArcImClient state, - required String handle, - required List messages}) => - RustLib.instance.api.crateApiApiReportMessages( - state: state, handle: handle, messages: messages); +Future get2FaCode({ + required ArcAnisetteClientDefaultAnisetteProvider anisette, +}) => RustLib.instance.api.crateApiApiGet2FaCode(anisette: anisette); + +Future teardown2Fa({ + required ArcMutexAppleAccountDefaultAnisetteProvider account, + required String action, + required String txnid, +}) => RustLib.instance.api.crateApiApiTeardown2Fa( + account: account, + action: action, + txnid: txnid, +); + +Future answerFtRequest({ + required ArcFtClient facetime, + required LetMeInRequest request, + String? approvedGroup, +}) => RustLib.instance.api.crateApiApiAnswerFtRequest( + facetime: facetime, + request: request, + approvedGroup: approvedGroup, +); + +Future declineFacetime({ + required ArcFtClient facetime, + required String guid, +}) => RustLib.instance.api.crateApiApiDeclineFacetime( + facetime: facetime, + guid: guid, +); + +Future createFacetime({ + required ArcFtClient facetime, + required String uuid, + required String handle, + required List participants, +}) => RustLib.instance.api.crateApiApiCreateFacetime( + facetime: facetime, + uuid: uuid, + handle: handle, + participants: participants, +); + +Future cancelFacetime({ + required ArcFtClient facetime, + required String guid, +}) => RustLib.instance.api.crateApiApiCancelFacetime( + facetime: facetime, + guid: guid, +); + +Future> validateTargetsFacetime({ + required ArcImClient state, + required List targets, + required String sender, +}) => RustLib.instance.api.crateApiApiValidateTargetsFacetime( + state: state, + targets: targets, + sender: sender, +); + +Future certifyDelivery({ + required ArcImClient state, + required CertifiedContext context, + required bool notify, +}) => RustLib.instance.api.crateApiApiCertifyDelivery( + state: state, + context: context, + notify: notify, +); + +Future reportMessages({ + required ArcImClient state, + required String handle, + required List messages, +}) => RustLib.instance.api.crateApiApiReportMessages( + state: state, + handle: handle, + messages: messages, +); Future encodeProfileMessage({required ShareProfileMessage p}) => RustLib.instance.api.crateApiApiEncodeProfileMessage(p: p); @@ -666,56 +1075,71 @@ Future encodeProfileMessage({required ShareProfileMessage p}) => Future decodeProfileMessage({required String s}) => RustLib.instance.api.crateApiApiDecodeProfileMessage(s: s); -Future fetchProfile( - {required ArcProfilesClientDefaultAnisetteProvider profiles, - required ShareProfileMessage message}) => - RustLib.instance.api - .crateApiApiFetchProfile(profiles: profiles, message: message); - -Future setProfile( - {required ArcProfilesClientDefaultAnisetteProvider profiles, - required IMessageNicknameRecord record, - ShareProfileMessage? existing}) => - RustLib.instance.api.crateApiApiSetProfile( - profiles: profiles, record: record, existing: existing); - -Future inviteToChannel( - {required ArcStatusKitClientDefaultAnisetteProvider status, - required String handle, - required Map to}) => - RustLib.instance.api - .crateApiApiInviteToChannel(status: status, handle: handle, to: to); - -Future resetChannelKeys( - {required ArcStatusKitClientDefaultAnisetteProvider status}) => - RustLib.instance.api.crateApiApiResetChannelKeys(status: status); - -Future requestHandles( - {required ArcStatusKitClientDefaultAnisetteProvider status, - required List to}) => - RustLib.instance.api.crateApiApiRequestHandles(status: status, to: to); - -Future setStatus( - {required ArcStatusKitClientDefaultAnisetteProvider status, - String? newStatus}) => - RustLib.instance.api - .crateApiApiSetStatus(status: status, newStatus: newStatus); - -Future approveCircle( - {required ArcMutexVecActiveCircleSession state, - required ArcMutexAppleAccountDefaultAnisetteProvider account, - required String txnid}) => - RustLib.instance.api - .crateApiApiApproveCircle(state: state, account: account, txnid: txnid); - -Future recvWait( - {required ApsWatcher watcher, required ArcSharedPushState state}) => - RustLib.instance.api.crateApiApiRecvWait(watcher: watcher, state: state); - -Future send( - {required ArcImClient state, - required ArcSenderPushMessage local, - required MessageInst msg}) => +Future fetchProfile({ + required ArcProfilesClientDefaultAnisetteProvider profiles, + required ShareProfileMessage message, +}) => RustLib.instance.api.crateApiApiFetchProfile( + profiles: profiles, + message: message, +); + +Future setProfile({ + required ArcProfilesClientDefaultAnisetteProvider profiles, + required IMessageNicknameRecord record, + ShareProfileMessage? existing, +}) => RustLib.instance.api.crateApiApiSetProfile( + profiles: profiles, + record: record, + existing: existing, +); + +Future inviteToChannel({ + required ArcStatusKitClientDefaultAnisetteProvider status, + required String handle, + required Map to, +}) => RustLib.instance.api.crateApiApiInviteToChannel( + status: status, + handle: handle, + to: to, +); + +Future resetChannelKeys({ + required ArcStatusKitClientDefaultAnisetteProvider status, +}) => RustLib.instance.api.crateApiApiResetChannelKeys(status: status); + +Future requestHandles({ + required ArcStatusKitClientDefaultAnisetteProvider status, + required List to, +}) => RustLib.instance.api.crateApiApiRequestHandles(status: status, to: to); + +Future setStatus({ + required ArcStatusKitClientDefaultAnisetteProvider status, + String? newStatus, +}) => RustLib.instance.api.crateApiApiSetStatus( + status: status, + newStatus: newStatus, +); + +Future approveCircle({ + required ArcMutexVecActiveCircleSession state, + required ArcMutexAppleAccountDefaultAnisetteProvider account, + required String txnid, +}) => RustLib.instance.api.crateApiApiApproveCircle( + state: state, + account: account, + txnid: txnid, +); + +Future recvWait({ + required ApsWatcher watcher, + required ArcSharedPushState state, +}) => RustLib.instance.api.crateApiApiRecvWait(watcher: watcher, state: state); + +Future send({ + required ArcImClient state, + required ArcSenderPushMessage local, + required MessageInst msg, +}) => RustLib.instance.api.crateApiApiSend(state: state, local: local, msg: msg); Future> getHandles({required ArcImClient state}) => @@ -727,46 +1151,64 @@ Future> getMyPhoneHandles({required ArcImClient state}) => Future doReregister({required ArcImClient state}) => RustLib.instance.api.crateApiApiDoReregister(state: state); -Future newMsg( - {required ConversationData conversation, - required String sender, - required Message message}) => - RustLib.instance.api.crateApiApiNewMsg( - conversation: conversation, sender: sender, message: message); - -Future> validateTargets( - {required ArcImClient state, - required List targets, - required String sender}) => - RustLib.instance.api.crateApiApiValidateTargets( - state: state, targets: targets, sender: sender); - -Stream downloadAttachment( - {required ApsConnection aps, - required Attachment attachment, - required String path}) => - RustLib.instance.api.crateApiApiDownloadAttachment( - aps: aps, attachment: attachment, path: path); - -Stream downloadMmcs( - {required ApsConnection aps, - required MMCSFile attachment, - required String path}) => - RustLib.instance.api - .crateApiApiDownloadMmcs(aps: aps, attachment: attachment, path: path); - -Stream uploadMmcs( - {required ApsConnection aps, required String path}) => - RustLib.instance.api.crateApiApiUploadMmcs(aps: aps, path: path); - -Stream uploadAttachment( - {required ApsConnection aps, - required String path, - required String mime, - required String uti, - required String name}) => - RustLib.instance.api.crateApiApiUploadAttachment( - aps: aps, path: path, mime: mime, uti: uti, name: name); +Future newMsg({ + required ConversationData conversation, + required String sender, + required Message message, +}) => RustLib.instance.api.crateApiApiNewMsg( + conversation: conversation, + sender: sender, + message: message, +); + +Future> validateTargets({ + required ArcImClient state, + required List targets, + required String sender, +}) => RustLib.instance.api.crateApiApiValidateTargets( + state: state, + targets: targets, + sender: sender, +); + +Stream downloadAttachment({ + required ApsConnection aps, + required Attachment attachment, + required String path, +}) => RustLib.instance.api.crateApiApiDownloadAttachment( + aps: aps, + attachment: attachment, + path: path, +); + +Stream downloadMmcs({ + required ApsConnection aps, + required MMCSFile attachment, + required String path, +}) => RustLib.instance.api.crateApiApiDownloadMmcs( + aps: aps, + attachment: attachment, + path: path, +); + +Stream uploadMmcs({ + required ApsConnection aps, + required String path, +}) => RustLib.instance.api.crateApiApiUploadMmcs(aps: aps, path: path); + +Stream uploadAttachment({ + required ApsConnection aps, + required String path, + required String mime, + required String uti, + required String name, +}) => RustLib.instance.api.crateApiApiUploadAttachment( + aps: aps, + path: path, + mime: mime, + uti: uti, + name: name, +); Future getToken({required ApsConnection state}) => RustLib.instance.api.crateApiApiGetToken(state: state); @@ -777,170 +1219,217 @@ Future saveUser({required IdsUser user}) => Future restoreUser({required String user}) => RustLib.instance.api.crateApiApiRestoreUser(user: user); -Future makeFindMyPhone( - {required String path, - required JoinedOsConfig config, - required ApsConnection aps, - required ArcAnisetteClientDefaultAnisetteProvider anisette, - required ArcTokenProviderDefaultAnisetteProvider provider}) => - RustLib.instance.api.crateApiApiMakeFindMyPhone( - path: path, - config: config, - aps: aps, - anisette: anisette, - provider: provider); - -Future> getDevices( - {required FindMyPhoneClientDefaultAnisetteProvider client}) => - RustLib.instance.api.crateApiApiGetDevices(client: client); - -Future> refreshDevices( - {required JoinedOsConfig config, - required FindMyPhoneClientDefaultAnisetteProvider client}) => - RustLib.instance.api - .crateApiApiRefreshDevices(config: config, client: client); - -Future makeFindMyFriends( - {required String path, - required JoinedOsConfig config, - required ApsConnection aps, - required ArcAnisetteClientDefaultAnisetteProvider anisette, - required ArcTokenProviderDefaultAnisetteProvider provider}) => - RustLib.instance.api.crateApiApiMakeFindMyFriends( - path: path, - config: config, - aps: aps, - anisette: anisette, - provider: provider); - -Future acceptBeaconShare( - {required ArcFindMyClientDefaultAnisetteProvider items, - required String share}) => - RustLib.instance.api - .crateApiApiAcceptBeaconShare(items: items, share: share); - -Future deleteBeaconShare( - {required ArcFindMyClientDefaultAnisetteProvider items, - required String share}) => - RustLib.instance.api - .crateApiApiDeleteBeaconShare(items: items, share: share); - -Future> getBeaconItems( - {required ArcFindMyClientDefaultAnisetteProvider items}) => - RustLib.instance.api.crateApiApiGetBeaconItems(items: items); - -Future updateBeaconName( - {required ArcFindMyClientDefaultAnisetteProvider items, - required BeaconNamingRecord namingRecord}) => - RustLib.instance.api - .crateApiApiUpdateBeaconName(items: items, namingRecord: namingRecord); - -Future> getFollowing( - {required FindMyFriendsClientDefaultAnisetteProvider client}) => - RustLib.instance.api.crateApiApiGetFollowing(client: client); - -Future> refreshFollowing( - {required JoinedOsConfig config, - required FindMyFriendsClientDefaultAnisetteProvider client}) => - RustLib.instance.api - .crateApiApiRefreshFollowing(config: config, client: client); - -Future> selectFriend( - {required JoinedOsConfig config, - required FindMyFriendsClientDefaultAnisetteProvider client, - String? friend}) => - RustLib.instance.api.crateApiApiSelectFriend( - config: config, client: client, friend: friend); - -Future> selectBackgroundFriend( - {required ArcFindMyClientDefaultAnisetteProvider fmfd, - String? friend}) => - RustLib.instance.api - .crateApiApiSelectBackgroundFriend(fmfd: fmfd, friend: friend); - -Future> getBackgroundFollowing( - {required ArcFindMyClientDefaultAnisetteProvider fmfd}) => - RustLib.instance.api.crateApiApiGetBackgroundFollowing(fmfd: fmfd); - -Future> refreshBackgroundFollowing( - {required ArcFindMyClientDefaultAnisetteProvider state, - required JoinedOsConfig config}) => - RustLib.instance.api - .crateApiApiRefreshBackgroundFollowing(state: state, config: config); - -Future getQuotaInfo( - {required ArcTokenProviderDefaultAnisetteProvider info}) => - RustLib.instance.api.crateApiApiGetQuotaInfo(info: info); - -Future doLogin( - {required String path, - required ArcMutexAppleAccountDefaultAnisetteProvider account, - UpdateAccountFinish? finish, - required JoinedOsConfig osConfig}) => - RustLib.instance.api.crateApiApiDoLogin( - path: path, account: account, finish: finish, osConfig: osConfig); +Future makeFindMyPhone({ + required String path, + required JoinedOsConfig config, + required ApsConnection aps, + required ArcAnisetteClientDefaultAnisetteProvider anisette, + required ArcTokenProviderDefaultAnisetteProvider provider, +}) => RustLib.instance.api.crateApiApiMakeFindMyPhone( + path: path, + config: config, + aps: aps, + anisette: anisette, + provider: provider, +); + +Future> getDevices({ + required FindMyPhoneClientDefaultAnisetteProvider client, +}) => RustLib.instance.api.crateApiApiGetDevices(client: client); + +Future> refreshDevices({ + required JoinedOsConfig config, + required FindMyPhoneClientDefaultAnisetteProvider client, +}) => RustLib.instance.api.crateApiApiRefreshDevices( + config: config, + client: client, +); + +Future playFindMySound({ + required JoinedOsConfig config, + required FindMyPhoneClientDefaultAnisetteProvider client, + required String deviceId, +}) => RustLib.instance.api.crateApiApiPlayFindMySound( + config: config, + client: client, + deviceId: deviceId, +); + +Future makeFindMyFriends({ + required String path, + required JoinedOsConfig config, + required ApsConnection aps, + required ArcAnisetteClientDefaultAnisetteProvider anisette, + required ArcTokenProviderDefaultAnisetteProvider provider, +}) => RustLib.instance.api.crateApiApiMakeFindMyFriends( + path: path, + config: config, + aps: aps, + anisette: anisette, + provider: provider, +); + +Future acceptBeaconShare({ + required ArcFindMyClientDefaultAnisetteProvider items, + required String share, +}) => RustLib.instance.api.crateApiApiAcceptBeaconShare( + items: items, + share: share, +); + +Future deleteBeaconShare({ + required ArcFindMyClientDefaultAnisetteProvider items, + required String share, +}) => RustLib.instance.api.crateApiApiDeleteBeaconShare( + items: items, + share: share, +); + +Future> getBeaconItems({ + required ArcFindMyClientDefaultAnisetteProvider items, +}) => RustLib.instance.api.crateApiApiGetBeaconItems(items: items); + +Future updateBeaconName({ + required ArcFindMyClientDefaultAnisetteProvider items, + required BeaconNamingRecord namingRecord, +}) => RustLib.instance.api.crateApiApiUpdateBeaconName( + items: items, + namingRecord: namingRecord, +); + +Future> getFollowing({ + required FindMyFriendsClientDefaultAnisetteProvider client, +}) => RustLib.instance.api.crateApiApiGetFollowing(client: client); + +Future> refreshFollowing({ + required JoinedOsConfig config, + required FindMyFriendsClientDefaultAnisetteProvider client, +}) => RustLib.instance.api.crateApiApiRefreshFollowing( + config: config, + client: client, +); + +Future> selectFriend({ + required JoinedOsConfig config, + required FindMyFriendsClientDefaultAnisetteProvider client, + String? friend, +}) => RustLib.instance.api.crateApiApiSelectFriend( + config: config, + client: client, + friend: friend, +); + +Future> selectBackgroundFriend({ + required ArcFindMyClientDefaultAnisetteProvider fmfd, + String? friend, +}) => RustLib.instance.api.crateApiApiSelectBackgroundFriend( + fmfd: fmfd, + friend: friend, +); + +Future> getBackgroundFollowing({ + required ArcFindMyClientDefaultAnisetteProvider fmfd, +}) => RustLib.instance.api.crateApiApiGetBackgroundFollowing(fmfd: fmfd); + +Future> refreshBackgroundFollowing({ + required ArcFindMyClientDefaultAnisetteProvider state, + required JoinedOsConfig config, +}) => RustLib.instance.api.crateApiApiRefreshBackgroundFollowing( + state: state, + config: config, +); + +Future getQuotaInfo({ + required ArcTokenProviderDefaultAnisetteProvider info, +}) => RustLib.instance.api.crateApiApiGetQuotaInfo(info: info); + +Future doLogin({ + required String path, + required ArcMutexAppleAccountDefaultAnisetteProvider account, + UpdateAccountFinish? finish, + required JoinedOsConfig osConfig, +}) => RustLib.instance.api.crateApiApiDoLogin( + path: path, + account: account, + finish: finish, + osConfig: osConfig, +); String? getAvailableUser({required String path}) => RustLib.instance.api.crateApiApiGetAvailableUser(path: path); -Future<(ArcMutexAppleAccountDefaultAnisetteProvider, LoginState)> tryAuth( - {required String path, - required JoinedOsConfig conf, - required ApsConnection conn, - required ArcAnisetteClientDefaultAnisetteProvider anisette, - (String, String)? creds}) => - RustLib.instance.api.crateApiApiTryAuth( - path: path, conf: conf, conn: conn, anisette: anisette, creds: creds); - -Future tryIcloudLogin( - {required String path, - required JoinedOsConfig conf, - required ArcMutexAppleAccountDefaultAnisetteProvider account}) => - RustLib.instance.api - .crateApiApiTryIcloudLogin(path: path, conf: conf, account: account); - -Future authPhone( - {required ApsConnection conn, - required JoinedOsConfig config, - required String number, - required List sig}) => - RustLib.instance.api.crateApiApiAuthPhone( - conn: conn, config: config, number: number, sig: sig); +Future<(ArcMutexAppleAccountDefaultAnisetteProvider, LoginState)> tryAuth({ + required String path, + required JoinedOsConfig conf, + required ApsConnection conn, + required ArcAnisetteClientDefaultAnisetteProvider anisette, + (String, String)? creds, +}) => RustLib.instance.api.crateApiApiTryAuth( + path: path, + conf: conf, + conn: conn, + anisette: anisette, + creds: creds, +); + +Future tryIcloudLogin({ + required String path, + required JoinedOsConfig conf, + required ArcMutexAppleAccountDefaultAnisetteProvider account, +}) => RustLib.instance.api.crateApiApiTryIcloudLogin( + path: path, + conf: conf, + account: account, +); + +Future authPhone({ + required ApsConnection conn, + required JoinedOsConfig config, + required String number, + required List sig, +}) => RustLib.instance.api.crateApiApiAuthPhone( + conn: conn, + config: config, + number: number, + sig: sig, +); Future<(CircleClientSessionDefaultAnisetteProvider, LoginState, String?)> - send2FaToDevices( - {required ArcMutexAppleAccountDefaultAnisetteProvider state, - required ApsConnection conn}) => - RustLib.instance.api - .crateApiApiSend2FaToDevices(state: state, conn: conn); - -Future isInClique( - {required ArcKeychainClientDefaultAnisetteProvider keychain}) => - RustLib.instance.api.crateApiApiIsInClique(keychain: keychain); - -Future joinCliqueWithBottle( - {required ArcKeychainClientDefaultAnisetteProvider keychain, - required EscrowData bottle, - required String password, - required String devicePassword}) => - RustLib.instance.api.crateApiApiJoinCliqueWithBottle( - keychain: keychain, - bottle: bottle, - password: password, - devicePassword: devicePassword); - -Future resetClique( - {required ArcKeychainClientDefaultAnisetteProvider keychain, - required ArcCloudMessagesClientDefaultAnisetteProvider cloudMessages, - required String devicePassword}) => - RustLib.instance.api.crateApiApiResetClique( - keychain: keychain, - cloudMessages: cloudMessages, - devicePassword: devicePassword); - -Future> getBottles( - {required ArcKeychainClientDefaultAnisetteProvider keychain}) => - RustLib.instance.api.crateApiApiGetBottles(keychain: keychain); +send2FaToDevices({ + required ArcMutexAppleAccountDefaultAnisetteProvider state, + required ApsConnection conn, +}) => + RustLib.instance.api.crateApiApiSend2FaToDevices(state: state, conn: conn); + +Future isInClique({ + required ArcKeychainClientDefaultAnisetteProvider keychain, +}) => RustLib.instance.api.crateApiApiIsInClique(keychain: keychain); + +Future joinCliqueWithBottle({ + required ArcKeychainClientDefaultAnisetteProvider keychain, + required EscrowData bottle, + required String password, + required String devicePassword, +}) => RustLib.instance.api.crateApiApiJoinCliqueWithBottle( + keychain: keychain, + bottle: bottle, + password: password, + devicePassword: devicePassword, +); + +Future resetClique({ + required ArcKeychainClientDefaultAnisetteProvider keychain, + required ArcCloudMessagesClientDefaultAnisetteProvider cloudMessages, + required String devicePassword, +}) => RustLib.instance.api.crateApiApiResetClique( + keychain: keychain, + cloudMessages: cloudMessages, + devicePassword: devicePassword, +); + +Future> getBottles({ + required ArcKeychainClientDefaultAnisetteProvider keychain, +}) => RustLib.instance.api.crateApiApiGetBottles(keychain: keychain); Future encodeSummaryInfo({required MessageSummaryInfo info}) => RustLib.instance.api.crateApiApiEncodeSummaryInfo(info: info); @@ -963,49 +1452,65 @@ Uint8List saveCloudChat({required CloudChat value}) => CloudChat restoreCloudChat({required List data}) => RustLib.instance.api.crateApiApiRestoreCloudChat(data: data); -Future<(Uint8List, Map, int)> syncChats( - {required ArcCloudMessagesClientDefaultAnisetteProvider - cloudMessagesClient, - Uint8List? continuationToken}) => - RustLib.instance.api.crateApiApiSyncChats( - cloudMessagesClient: cloudMessagesClient, - continuationToken: continuationToken); - -Future> saveChats( - {required ArcCloudMessagesClientDefaultAnisetteProvider - cloudMessagesClient, - required Map chats}) => - RustLib.instance.api.crateApiApiSaveChats( - cloudMessagesClient: cloudMessagesClient, chats: chats); - -Future deleteChats( - {required ArcCloudMessagesClientDefaultAnisetteProvider - cloudMessagesClient, - required List chats}) => - RustLib.instance.api.crateApiApiDeleteChats( - cloudMessagesClient: cloudMessagesClient, chats: chats); - -Future<(Uint8List, Map, int)> syncMessages( - {required ArcCloudMessagesClientDefaultAnisetteProvider - cloudMessagesClient, - Uint8List? continuationToken}) => - RustLib.instance.api.crateApiApiSyncMessages( - cloudMessagesClient: cloudMessagesClient, - continuationToken: continuationToken); - -Future> saveMessages( - {required ArcCloudMessagesClientDefaultAnisetteProvider - cloudMessagesClient, - required Map messages}) => - RustLib.instance.api.crateApiApiSaveMessages( - cloudMessagesClient: cloudMessagesClient, messages: messages); - -Future deleteMessages( - {required ArcCloudMessagesClientDefaultAnisetteProvider - cloudMessagesClient, - required List messages}) => - RustLib.instance.api.crateApiApiDeleteMessages( - cloudMessagesClient: cloudMessagesClient, messages: messages); +Future cloudSyncFetchRawPage({ + required ArcCloudMessagesClientDefaultAnisetteProvider cloudMessagesClient, + required String stream, + Uint8List? continuationToken, + required int maxChanges, +}) => RustLib.instance.api.crateApiApiCloudSyncFetchRawPage( + cloudMessagesClient: cloudMessagesClient, + stream: stream, + continuationToken: continuationToken, + maxChanges: maxChanges, +); + +Future<(Uint8List, Map, int)> syncChats({ + required ArcCloudMessagesClientDefaultAnisetteProvider cloudMessagesClient, + Uint8List? continuationToken, +}) => RustLib.instance.api.crateApiApiSyncChats( + cloudMessagesClient: cloudMessagesClient, + continuationToken: continuationToken, +); + +Future> saveChats({ + required ArcCloudMessagesClientDefaultAnisetteProvider cloudMessagesClient, + required Map chats, +}) => RustLib.instance.api.crateApiApiSaveChats( + cloudMessagesClient: cloudMessagesClient, + chats: chats, +); + +Future deleteChats({ + required ArcCloudMessagesClientDefaultAnisetteProvider cloudMessagesClient, + required List chats, +}) => RustLib.instance.api.crateApiApiDeleteChats( + cloudMessagesClient: cloudMessagesClient, + chats: chats, +); + +Future<(Uint8List, Map, int)> syncMessages({ + required ArcCloudMessagesClientDefaultAnisetteProvider cloudMessagesClient, + Uint8List? continuationToken, +}) => RustLib.instance.api.crateApiApiSyncMessages( + cloudMessagesClient: cloudMessagesClient, + continuationToken: continuationToken, +); + +Future> saveMessages({ + required ArcCloudMessagesClientDefaultAnisetteProvider cloudMessagesClient, + required Map messages, +}) => RustLib.instance.api.crateApiApiSaveMessages( + cloudMessagesClient: cloudMessagesClient, + messages: messages, +); + +Future deleteMessages({ + required ArcCloudMessagesClientDefaultAnisetteProvider cloudMessagesClient, + required List messages, +}) => RustLib.instance.api.crateApiApiDeleteMessages( + cloudMessagesClient: cloudMessagesClient, + messages: messages, +); MessageSummaryInfo decodeMessageInfo({required List data}) => RustLib.instance.api.crateApiApiDecodeMessageInfo(data: data); @@ -1013,40 +1518,43 @@ MessageSummaryInfo decodeMessageInfo({required List data}) => Uint8List encodeMessageInfo({required MessageSummaryInfo info}) => RustLib.instance.api.crateApiApiEncodeMessageInfo(info: info); -Future<(Uint8List, Map, int)> syncAttachments( - {required ArcCloudMessagesClientDefaultAnisetteProvider - cloudMessagesClient, - Uint8List? continuationToken}) => - RustLib.instance.api.crateApiApiSyncAttachments( - cloudMessagesClient: cloudMessagesClient, - continuationToken: continuationToken); - -Future> saveAttachments( - {required ArcCloudMessagesClientDefaultAnisetteProvider - cloudMessagesClient, - required Map attachments}) => - RustLib.instance.api.crateApiApiSaveAttachments( - cloudMessagesClient: cloudMessagesClient, attachments: attachments); - -Future deleteAttachments( - {required ArcCloudMessagesClientDefaultAnisetteProvider - cloudMessagesClient, - required List attachments}) => - RustLib.instance.api.crateApiApiDeleteAttachments( - cloudMessagesClient: cloudMessagesClient, attachments: attachments); - -Future countRecords( - {required ArcCloudMessagesClientDefaultAnisetteProvider - cloudMessagesClient}) => - RustLib.instance.api - .crateApiApiCountRecords(cloudMessagesClient: cloudMessagesClient); - -Future downloadCloudAttachments( - {required ArcCloudMessagesClientDefaultAnisetteProvider - cloudMessagesClient, - required List<(String, String)> files}) => - RustLib.instance.api.crateApiApiDownloadCloudAttachments( - cloudMessagesClient: cloudMessagesClient, files: files); +Future<(Uint8List, Map, int)> syncAttachments({ + required ArcCloudMessagesClientDefaultAnisetteProvider cloudMessagesClient, + Uint8List? continuationToken, +}) => RustLib.instance.api.crateApiApiSyncAttachments( + cloudMessagesClient: cloudMessagesClient, + continuationToken: continuationToken, +); + +Future> saveAttachments({ + required ArcCloudMessagesClientDefaultAnisetteProvider cloudMessagesClient, + required Map attachments, +}) => RustLib.instance.api.crateApiApiSaveAttachments( + cloudMessagesClient: cloudMessagesClient, + attachments: attachments, +); + +Future deleteAttachments({ + required ArcCloudMessagesClientDefaultAnisetteProvider cloudMessagesClient, + required List attachments, +}) => RustLib.instance.api.crateApiApiDeleteAttachments( + cloudMessagesClient: cloudMessagesClient, + attachments: attachments, +); + +Future countRecords({ + required ArcCloudMessagesClientDefaultAnisetteProvider cloudMessagesClient, +}) => RustLib.instance.api.crateApiApiCountRecords( + cloudMessagesClient: cloudMessagesClient, +); + +Future downloadCloudAttachments({ + required ArcCloudMessagesClientDefaultAnisetteProvider cloudMessagesClient, + required List<(String, String)> files, +}) => RustLib.instance.api.crateApiApiDownloadCloudAttachments( + cloudMessagesClient: cloudMessagesClient, + files: files, +); int systemtimeToMillis({required SystemTime time}) => RustLib.instance.api.crateApiApiSystemtimeToMillis(time: time); @@ -1061,109 +1569,123 @@ int dateToMs({required Date date}) => Date msToDate({required int ms}) => RustLib.instance.api.crateApiApiMsToDate(ms: ms); -Future downloadCloudGroupPhotos( - {required ArcCloudMessagesClientDefaultAnisetteProvider - cloudMessagesClient, - required List<(String, String)> files}) => - RustLib.instance.api.crateApiApiDownloadCloudGroupPhotos( - cloudMessagesClient: cloudMessagesClient, files: files); - -Future> uploadCloudAttachments( - {required ArcCloudMessagesClientDefaultAnisetteProvider - cloudMessagesClient, - required List<(String, String)> files}) => - RustLib.instance.api.crateApiApiUploadCloudAttachments( - cloudMessagesClient: cloudMessagesClient, files: files); - -Future> uploadGroupPhoto( - {required ArcCloudMessagesClientDefaultAnisetteProvider - cloudMessagesClient, - required List<(String, String)> files}) => - RustLib.instance.api.crateApiApiUploadGroupPhoto( - cloudMessagesClient: cloudMessagesClient, files: files); - -Future changeEscrowPassword( - {required ArcKeychainClientDefaultAnisetteProvider keychain, - required String devicePassword}) => - RustLib.instance.api.crateApiApiChangeEscrowPassword( - keychain: keychain, devicePassword: devicePassword); - -Future circleSetupClique( - {required ArcMutexOptionCircleClientSessionDefaultAnisetteProvider - client, - required ArcKeychainClientDefaultAnisetteProvider keychain, - required String devicePassword}) => - RustLib.instance.api.crateApiApiCircleSetupClique( - client: client, keychain: keychain, devicePassword: devicePassword); - -Future<(LoginState, IdsUser?)> verify2Fa( - {required String path, - required CircleClientSessionDefaultAnisetteProvider client, - required ArcAnisetteClientDefaultAnisetteProvider anisette, - required JoinedOsConfig osConfig, - required ArcMutexAppleAccountDefaultAnisetteProvider account, - required ReceiverApsMessage watcher, - required ArcIdmsAuthListener idms, - required String code}) => - RustLib.instance.api.crateApiApiVerify2Fa( - path: path, - client: client, - anisette: anisette, - osConfig: osConfig, - account: account, - watcher: watcher, - idms: idms, - code: code); - -Future<(List, LoginState?)> get2FaSmsOpts( - {required ArcMutexAppleAccountDefaultAnisetteProvider state}) => - RustLib.instance.api.crateApiApiGet2FaSmsOpts(state: state); - -Future send2FaSms( - {CircleClientSessionDefaultAnisetteProvider? locked, - required ArcMutexAppleAccountDefaultAnisetteProvider account, - required int phoneId}) => - RustLib.instance.api.crateApiApiSend2FaSms( - locked: locked, account: account, phoneId: phoneId); - -Future<(LoginState, IdsUser?)> verify2FaSms( - {required String path, - required ArcMutexAppleAccountDefaultAnisetteProvider accountMut, - required ArcAnisetteClientDefaultAnisetteProvider anisette, - required JoinedOsConfig config, - required VerifyBody body, - required String code}) => - RustLib.instance.api.crateApiApiVerify2FaSms( - path: path, - accountMut: accountMut, - anisette: anisette, - config: config, - body: body, - code: code); - -Future> validateCert( - {required ApsConnection conn, required IdsUser user}) => - RustLib.instance.api.crateApiApiValidateCert(conn: conn, user: user); +Future downloadCloudGroupPhotos({ + required ArcCloudMessagesClientDefaultAnisetteProvider cloudMessagesClient, + required List<(String, String)> files, +}) => RustLib.instance.api.crateApiApiDownloadCloudGroupPhotos( + cloudMessagesClient: cloudMessagesClient, + files: files, +); + +Future> uploadCloudAttachments({ + required ArcCloudMessagesClientDefaultAnisetteProvider cloudMessagesClient, + required List<(String, String)> files, +}) => RustLib.instance.api.crateApiApiUploadCloudAttachments( + cloudMessagesClient: cloudMessagesClient, + files: files, +); + +Future> uploadGroupPhoto({ + required ArcCloudMessagesClientDefaultAnisetteProvider cloudMessagesClient, + required List<(String, String)> files, +}) => RustLib.instance.api.crateApiApiUploadGroupPhoto( + cloudMessagesClient: cloudMessagesClient, + files: files, +); + +Future changeEscrowPassword({ + required ArcKeychainClientDefaultAnisetteProvider keychain, + required String devicePassword, +}) => RustLib.instance.api.crateApiApiChangeEscrowPassword( + keychain: keychain, + devicePassword: devicePassword, +); + +Future circleSetupClique({ + required ArcMutexOptionCircleClientSessionDefaultAnisetteProvider client, + required ArcKeychainClientDefaultAnisetteProvider keychain, + required String devicePassword, +}) => RustLib.instance.api.crateApiApiCircleSetupClique( + client: client, + keychain: keychain, + devicePassword: devicePassword, +); + +Future<(LoginState, IdsUser?)> verify2Fa({ + required String path, + required CircleClientSessionDefaultAnisetteProvider client, + required ArcAnisetteClientDefaultAnisetteProvider anisette, + required JoinedOsConfig osConfig, + required ArcMutexAppleAccountDefaultAnisetteProvider account, + required ReceiverApsMessage watcher, + required ArcIdmsAuthListener idms, + required String code, +}) => RustLib.instance.api.crateApiApiVerify2Fa( + path: path, + client: client, + anisette: anisette, + osConfig: osConfig, + account: account, + watcher: watcher, + idms: idms, + code: code, +); + +Future<(List, LoginState?)> get2FaSmsOpts({ + required ArcMutexAppleAccountDefaultAnisetteProvider state, +}) => RustLib.instance.api.crateApiApiGet2FaSmsOpts(state: state); + +Future send2FaSms({ + CircleClientSessionDefaultAnisetteProvider? locked, + required ArcMutexAppleAccountDefaultAnisetteProvider account, + required int phoneId, +}) => RustLib.instance.api.crateApiApiSend2FaSms( + locked: locked, + account: account, + phoneId: phoneId, +); + +Future<(LoginState, IdsUser?)> verify2FaSms({ + required String path, + required ArcMutexAppleAccountDefaultAnisetteProvider accountMut, + required ArcAnisetteClientDefaultAnisetteProvider anisette, + required JoinedOsConfig config, + required VerifyBody body, + required String code, +}) => RustLib.instance.api.crateApiApiVerify2FaSms( + path: path, + accountMut: accountMut, + anisette: anisette, + config: config, + body: body, + code: code, +); + +Future> validateCert({ + required ApsConnection conn, + required IdsUser user, +}) => RustLib.instance.api.crateApiApiValidateCert(conn: conn, user: user); void cancelPoll({required Sender cancel}) => RustLib.instance.api.crateApiApiCancelPoll(cancel: cancel); -Future resetState( - {required Sender cancel, - required String path, - required JoinedOsConfig config, - required ApsConnection aps, - ArcMutexAppleAccountDefaultAnisetteProvider? account, - required bool resetHw, - required bool logout}) => - RustLib.instance.api.crateApiApiResetState( - cancel: cancel, - path: path, - config: config, - aps: aps, - account: account, - resetHw: resetHw, - logout: logout); +Future resetState({ + required Sender cancel, + required String path, + required JoinedOsConfig config, + required ApsConnection aps, + ArcMutexAppleAccountDefaultAnisetteProvider? account, + required bool resetHw, + required bool logout, +}) => RustLib.instance.api.crateApiApiResetState( + cancel: cancel, + path: path, + config: config, + aps: aps, + account: account, + resetHw: resetHw, + logout: logout, +); Future invalidateIdCache({required ArcImClient client}) => RustLib.instance.api.crateApiApiInvalidateIdCache(client: client); @@ -1174,30 +1696,36 @@ void closeClient({required ArcImClient client}) => void closeAps({required ApsConnection aps}) => RustLib.instance.api.crateApiApiCloseAps(aps: aps); -void closeSyncmanager( - {required SyncManagerDefaultAnisetteProviderMyFilePackager shared}) => - RustLib.instance.api.crateApiApiCloseSyncmanager(shared: shared); +void closeSyncmanager({ + required SyncManagerDefaultAnisetteProviderMyFilePackager shared, +}) => RustLib.instance.api.crateApiApiCloseSyncmanager(shared: shared); -Future getUserName( - {required ArcMutexAppleAccountDefaultAnisetteProvider state}) => - RustLib.instance.api.crateApiApiGetUserName(state: state); +Future getUserName({ + required ArcMutexAppleAccountDefaultAnisetteProvider state, +}) => RustLib.instance.api.crateApiApiGetUserName(state: state); Future getRegstate({required ArcImClient state}) => RustLib.instance.api.crateApiApiGetRegstate(state: state); -Future convertTokenToUuid( - {required ArcImClient state, - required String handle, - required List token}) => - RustLib.instance.api.crateApiApiConvertTokenToUuid( - state: state, handle: handle, token: token); - -Future> getSmsTargets( - {required ArcImClient state, - required String handle, - required bool refresh}) => - RustLib.instance.api.crateApiApiGetSmsTargets( - state: state, handle: handle, refresh: refresh); +Future convertTokenToUuid({ + required ArcImClient state, + required String handle, + required List token, +}) => RustLib.instance.api.crateApiApiConvertTokenToUuid( + state: state, + handle: handle, + token: token, +); + +Future> getSmsTargets({ + required ArcImClient state, + required String handle, + required bool refresh, +}) => RustLib.instance.api.crateApiApiGetSmsTargets( + state: state, + handle: handle, + refresh: refresh, +); // Rust type: RustOpaqueMoi> abstract class ApsWatcher implements RustOpaqueInterface {} @@ -1212,6 +1740,10 @@ abstract class ChannelInterestToken implements RustOpaqueInterface {} abstract class CircleClientSessionDefaultAnisetteProvider implements RustOpaqueInterface {} +// Rust type: RustOpaqueMoi> +abstract class CloudSyncPreparedMessageCreateHandle + implements RustOpaqueInterface {} + // Rust type: RustOpaqueMoi> abstract class ConversationLink implements RustOpaqueInterface {} @@ -1398,10 +1930,7 @@ class AkData { final double lat; final double lng; - const AkData({ - required this.lat, - required this.lng, - }); + const AkData({required this.lat, required this.lng}); @override int get hashCode => lat.hashCode ^ lng.hashCode; @@ -1450,12 +1979,41 @@ class ApsAlert { albtn == other.albtn; } +class ApsConnectionStatus { + final String state; + final int? activePort; + final String? error; + final BigInt? retryWaitSeconds; + + const ApsConnectionStatus({ + required this.state, + this.activePort, + this.error, + this.retryWaitSeconds, + }); + + @override + int get hashCode => + state.hashCode ^ + activePort.hashCode ^ + error.hashCode ^ + retryWaitSeconds.hashCode; + + @override + bool operator ==(Object other) => + identical(this, other) || + other is ApsConnectionStatus && + runtimeType == other.runtimeType && + state == other.state && + activePort == other.activePort && + error == other.error && + retryWaitSeconds == other.retryWaitSeconds; +} + class ApsData { final ApsAlert alert; - const ApsData({ - required this.alert, - }); + const ApsData({required this.alert}); @override int get hashCode => alert.hashCode; @@ -1485,9 +2043,8 @@ class Attachment { required this.iris, }); - Future getSize() => RustLib.instance.api.crateApiApiAttachmentGetSize( - that: this, - ); + Future getSize() => + RustLib.instance.api.crateApiApiAttachmentGetSize(that: this); @override int get hashCode => @@ -1597,9 +2154,7 @@ class AttachmentMeta { class AttachmentMetaExtra { final NumOrString? previewGenerationState; - const AttachmentMetaExtra({ - this.previewGenerationState, - }); + const AttachmentMetaExtra({this.previewGenerationState}); @override int get hashCode => previewGenerationState.hashCode; @@ -1616,12 +2171,8 @@ class AttachmentMetaExtra { sealed class AttachmentType with _$AttachmentType { const AttachmentType._(); - const factory AttachmentType.inline( - Uint8List field0, - ) = AttachmentType_Inline; - const factory AttachmentType.mmcs( - MMCSFile field0, - ) = AttachmentType_MMCS; + const factory AttachmentType.inline(Uint8List field0) = AttachmentType_Inline; + const factory AttachmentType.mmcs(MMCSFile field0) = AttachmentType_MMCS; } class Balloon { @@ -1807,9 +2358,7 @@ class ChangeParticipantMessage { class ChatProto { final int? unk1; - const ChatProto({ - this.unk1, - }); + const ChatProto({this.unk1}); @override int get hashCode => unk1.hashCode; @@ -1826,10 +2375,7 @@ class CloudAttachment { final GZipWrapperAttachmentMeta cm; final Asset lqa; - const CloudAttachment({ - required this.cm, - required this.lqa, - }); + const CloudAttachment({required this.cm, required this.lqa}); @override int get hashCode => cm.hashCode ^ lqa.hashCode; @@ -1908,212 +2454,1876 @@ class CloudChat { @override bool operator ==(Object other) => identical(this, other) || - other is CloudChat && + other is CloudChat && + runtimeType == other.runtimeType && + style == other.style && + isFiltered == other.isFiltered && + successfulQuery == other.successfulQuery && + state == other.state && + chatIdentifier == other.chatIdentifier && + groupId == other.groupId && + serviceName == other.serviceName && + originalGroupId == other.originalGroupId && + properties == other.properties && + participants == other.participants && + prop001 == other.prop001 && + lastReadMessageTimestamp == other.lastReadMessageTimestamp && + lastAddressedHandle == other.lastAddressedHandle && + guid == other.guid && + displayName == other.displayName && + proto001 == other.proto001 && + groupPhotoGuid == other.groupPhotoGuid && + groupPhoto == other.groupPhoto; +} + +class CloudMessage { + final SystemTime? utm; + final PlatformInt64 type; + final PlatformInt64 error; + final String chatId; + final String sender; + final PlatformInt64 time; + final GZipWrapperMessageProto2? msgProto2; + final String destinationCallerId; + final GZipWrapperMessageProto msgProto; + final MessageFlags flags; + final String guid; + final GZipWrapperMessageProto3? msgProto3; + final String service; + final GZipWrapperMessageProto4? msgProto4; + + const CloudMessage({ + this.utm, + required this.type, + required this.error, + required this.chatId, + required this.sender, + required this.time, + this.msgProto2, + required this.destinationCallerId, + required this.msgProto, + required this.flags, + required this.guid, + this.msgProto3, + required this.service, + this.msgProto4, + }); + + @override + int get hashCode => + utm.hashCode ^ + type.hashCode ^ + error.hashCode ^ + chatId.hashCode ^ + sender.hashCode ^ + time.hashCode ^ + msgProto2.hashCode ^ + destinationCallerId.hashCode ^ + msgProto.hashCode ^ + flags.hashCode ^ + guid.hashCode ^ + msgProto3.hashCode ^ + service.hashCode ^ + msgProto4.hashCode; + + @override + bool operator ==(Object other) => + identical(this, other) || + other is CloudMessage && + runtimeType == other.runtimeType && + utm == other.utm && + type == other.type && + error == other.error && + chatId == other.chatId && + sender == other.sender && + time == other.time && + msgProto2 == other.msgProto2 && + destinationCallerId == other.destinationCallerId && + msgProto == other.msgProto && + flags == other.flags && + guid == other.guid && + msgProto3 == other.msgProto3 && + service == other.service && + msgProto4 == other.msgProto4; +} + +class CloudMessageSummary { + final Int64List messagesSummary; + final Int64List chatSummary; + final Int64List attachmentSummary; + + const CloudMessageSummary({ + required this.messagesSummary, + required this.chatSummary, + required this.attachmentSummary, + }); + + @override + int get hashCode => + messagesSummary.hashCode ^ + chatSummary.hashCode ^ + attachmentSummary.hashCode; + + @override + bool operator ==(Object other) => + identical(this, other) || + other is CloudMessageSummary && + runtimeType == other.runtimeType && + messagesSummary == other.messagesSummary && + chatSummary == other.chatSummary && + attachmentSummary == other.attachmentSummary; +} + +class CloudParticipant { + final String uri; + + const CloudParticipant({required this.uri}); + + @override + int get hashCode => uri.hashCode; + + @override + bool operator ==(Object other) => + identical(this, other) || + other is CloudParticipant && + runtimeType == other.runtimeType && + uri == other.uri; +} + +class CloudProp { + int? gpufc; + int? pv; + int? numberOfTimesRespondedtoThread; + bool? shouldForceToSms; + String? lastSeenMessageGuid; + int? messageHandshakeState; + List legacyGroupIdentifiers; + String? groupPhotoGuid; + Date? lastModificationDate; + + CloudProp({ + this.gpufc, + this.pv, + this.numberOfTimesRespondedtoThread, + this.shouldForceToSms, + this.lastSeenMessageGuid, + this.messageHandshakeState, + required this.legacyGroupIdentifiers, + this.groupPhotoGuid, + this.lastModificationDate, + }); + + @override + int get hashCode => + gpufc.hashCode ^ + pv.hashCode ^ + numberOfTimesRespondedtoThread.hashCode ^ + shouldForceToSms.hashCode ^ + lastSeenMessageGuid.hashCode ^ + messageHandshakeState.hashCode ^ + legacyGroupIdentifiers.hashCode ^ + groupPhotoGuid.hashCode ^ + lastModificationDate.hashCode; + + @override + bool operator ==(Object other) => + identical(this, other) || + other is CloudProp && + runtimeType == other.runtimeType && + gpufc == other.gpufc && + pv == other.pv && + numberOfTimesRespondedtoThread == + other.numberOfTimesRespondedtoThread && + shouldForceToSms == other.shouldForceToSms && + lastSeenMessageGuid == other.lastSeenMessageGuid && + messageHandshakeState == other.messageHandshakeState && + legacyGroupIdentifiers == other.legacyGroupIdentifiers && + groupPhotoGuid == other.groupPhotoGuid && + lastModificationDate == other.lastModificationDate; +} + +class CloudProp001 { + final int syndicationType; + + const CloudProp001({required this.syndicationType}); + + @override + int get hashCode => syndicationType.hashCode; + + @override + bool operator ==(Object other) => + identical(this, other) || + other is CloudProp001 && + runtimeType == other.runtimeType && + syndicationType == other.syndicationType; +} + +/// Redacted identity binding for one active Cloud Messages client. +/// +/// The raw DSID is read and transformed entirely in Rust. Only two +/// per-install HMAC values cross FRB: an account fingerprint and a +/// process-local client-generation tag. Neither value is an Apple credential. +class CloudSyncNativeAuthMetadata { + final String nativeSessionId; + final String accountFingerprint; + final String protectedStoreIdentity; + + const CloudSyncNativeAuthMetadata({ + required this.nativeSessionId, + required this.accountFingerprint, + required this.protectedStoreIdentity, + }); + + @override + int get hashCode => + nativeSessionId.hashCode ^ + accountFingerprint.hashCode ^ + protectedStoreIdentity.hashCode; + + @override + bool operator ==(Object other) => + identical(this, other) || + other is CloudSyncNativeAuthMetadata && + runtimeType == other.runtimeType && + nativeSessionId == other.nativeSessionId && + accountFingerprint == other.accountFingerprint && + protectedStoreIdentity == other.protectedStoreIdentity; +} + +class CloudSyncOutboundConsumeResult { + final List outcomes; + final CloudSyncOutboundSafeCode? failure; + + const CloudSyncOutboundConsumeResult({required this.outcomes, this.failure}); + + @override + int get hashCode => outcomes.hashCode ^ failure.hashCode; + + @override + bool operator ==(Object other) => + identical(this, other) || + other is CloudSyncOutboundConsumeResult && + runtimeType == other.runtimeType && + outcomes == other.outcomes && + failure == other.failure; +} + +enum CloudSyncOutboundFailureClass { + throttled, + transientServer, + authentication, + conflict, + resetRequired, + permanent, + unknown, +} + +enum CloudSyncOutboundReconcileDisposition { + committed, + notApplied, + diverged, + unresolved, +} + +class CloudSyncOutboundReconcileResult { + final CloudSyncOutboundReconcileDisposition? disposition; + final String? protectedProofReference; + final CloudSyncOutboundFailureClass? failureClass; + final BigInt? retryAfterSeconds; + final CloudSyncOutboundSafeCode? failure; + + const CloudSyncOutboundReconcileResult({ + this.disposition, + this.protectedProofReference, + this.failureClass, + this.retryAfterSeconds, + this.failure, + }); + + @override + int get hashCode => + disposition.hashCode ^ + protectedProofReference.hashCode ^ + failureClass.hashCode ^ + retryAfterSeconds.hashCode ^ + failure.hashCode; + + @override + bool operator ==(Object other) => + identical(this, other) || + other is CloudSyncOutboundReconcileResult && + runtimeType == other.runtimeType && + disposition == other.disposition && + protectedProofReference == other.protectedProofReference && + failureClass == other.failureClass && + retryAfterSeconds == other.retryAfterSeconds && + failure == other.failure; +} + +enum CloudSyncOutboundSafeCode { + invalidScope, + invalidRequest, + unsupportedMessage, + malformedMessage, + oversizedMessage, + protectedStorage, + bindingMismatch, + nativeAuthUnavailable, + nativePrepareFailed, + alreadyConsumed, + correlationMismatch, +} + +enum CloudSyncOutboundSaveDisposition { succeeded, unknownOutcome, failed } + +class CloudSyncOutboundSaveOutcome { + final String localOperationId; + final String appleOperationUuid; + final CloudSyncOutboundSaveDisposition disposition; + final CloudSyncOutboundFailureClass? failureClass; + final BigInt? retryAfterSeconds; + + const CloudSyncOutboundSaveOutcome({ + required this.localOperationId, + required this.appleOperationUuid, + required this.disposition, + this.failureClass, + this.retryAfterSeconds, + }); + + @override + int get hashCode => + localOperationId.hashCode ^ + appleOperationUuid.hashCode ^ + disposition.hashCode ^ + failureClass.hashCode ^ + retryAfterSeconds.hashCode; + + @override + bool operator ==(Object other) => + identical(this, other) || + other is CloudSyncOutboundSaveOutcome && + runtimeType == other.runtimeType && + localOperationId == other.localOperationId && + appleOperationUuid == other.appleOperationUuid && + disposition == other.disposition && + failureClass == other.failureClass && + retryAfterSeconds == other.retryAfterSeconds; +} + +class CloudSyncPreparedMessageCreateInput { + final String localOperationId; + final String logicalEntityKeyHash; + final String protectedLeaseReference; + final String protectedPayloadReference; + final String payloadSha256; + final String protectedServerRecordReference; + final String serverRecordIdHash; + final String appleOperationUuid; + + const CloudSyncPreparedMessageCreateInput({ + required this.localOperationId, + required this.logicalEntityKeyHash, + required this.protectedLeaseReference, + required this.protectedPayloadReference, + required this.payloadSha256, + required this.protectedServerRecordReference, + required this.serverRecordIdHash, + required this.appleOperationUuid, + }); + + @override + int get hashCode => + localOperationId.hashCode ^ + logicalEntityKeyHash.hashCode ^ + protectedLeaseReference.hashCode ^ + protectedPayloadReference.hashCode ^ + payloadSha256.hashCode ^ + protectedServerRecordReference.hashCode ^ + serverRecordIdHash.hashCode ^ + appleOperationUuid.hashCode; + + @override + bool operator ==(Object other) => + identical(this, other) || + other is CloudSyncPreparedMessageCreateInput && + runtimeType == other.runtimeType && + localOperationId == other.localOperationId && + logicalEntityKeyHash == other.logicalEntityKeyHash && + protectedLeaseReference == other.protectedLeaseReference && + protectedPayloadReference == other.protectedPayloadReference && + payloadSha256 == other.payloadSha256 && + protectedServerRecordReference == + other.protectedServerRecordReference && + serverRecordIdHash == other.serverRecordIdHash && + appleOperationUuid == other.appleOperationUuid; +} + +class CloudSyncPreparedMessageCreateResult { + final CloudSyncPreparedMessageCreateHandle? handle; + final CloudSyncOutboundSafeCode? failure; + + const CloudSyncPreparedMessageCreateResult({this.handle, this.failure}); + + @override + int get hashCode => handle.hashCode ^ failure.hashCode; + + @override + bool operator ==(Object other) => + identical(this, other) || + other is CloudSyncPreparedMessageCreateResult && + runtimeType == other.runtimeType && + handle == other.handle && + failure == other.failure; +} + +/// One protected CloudKit change. Every string is either a fixed-format digest +/// or an opaque `obcs2.ref.*` capability. No Apple identifier or record body is +/// present. +class CloudSyncProtectedChange { + final String changeId; + final String recordIdHash; + final String? etagHash; + final CloudSyncProtectedChangeKind kind; + final String payloadSha256; + final BigInt payloadLength; + final String protectedRecordIdentityReference; + final String protectedRawEnvelopeReference; + final PlatformInt64? serverModifiedAtMillis; + final CloudSyncProtectedPreflightCode? preflightCode; + final bool isTombstone; + + const CloudSyncProtectedChange({ + required this.changeId, + required this.recordIdHash, + this.etagHash, + required this.kind, + required this.payloadSha256, + required this.payloadLength, + required this.protectedRecordIdentityReference, + required this.protectedRawEnvelopeReference, + this.serverModifiedAtMillis, + this.preflightCode, + required this.isTombstone, + }); + + @override + int get hashCode => + changeId.hashCode ^ + recordIdHash.hashCode ^ + etagHash.hashCode ^ + kind.hashCode ^ + payloadSha256.hashCode ^ + payloadLength.hashCode ^ + protectedRecordIdentityReference.hashCode ^ + protectedRawEnvelopeReference.hashCode ^ + serverModifiedAtMillis.hashCode ^ + preflightCode.hashCode ^ + isTombstone.hashCode; + + @override + bool operator ==(Object other) => + identical(this, other) || + other is CloudSyncProtectedChange && + runtimeType == other.runtimeType && + changeId == other.changeId && + recordIdHash == other.recordIdHash && + etagHash == other.etagHash && + kind == other.kind && + payloadSha256 == other.payloadSha256 && + payloadLength == other.payloadLength && + protectedRecordIdentityReference == + other.protectedRecordIdentityReference && + protectedRawEnvelopeReference == + other.protectedRawEnvelopeReference && + serverModifiedAtMillis == other.serverModifiedAtMillis && + preflightCode == other.preflightCode && + isTombstone == other.isTombstone; +} + +/// D0-safe change disposition emitted by the native protected fetch boundary. +enum CloudSyncProtectedChangeKind { save, delete, quarantined } + +class CloudSyncProtectedFailure { + final CloudSyncProtectedFailureCategory category; + final CloudSyncProtectedSafeCode safeCode; + final BigInt? retryAfterSeconds; + + const CloudSyncProtectedFailure({ + required this.category, + required this.safeCode, + this.retryAfterSeconds, + }); + + @override + int get hashCode => + category.hashCode ^ safeCode.hashCode ^ retryAfterSeconds.hashCode; + + @override + bool operator ==(Object other) => + identical(this, other) || + other is CloudSyncProtectedFailure && + runtimeType == other.runtimeType && + category == other.category && + safeCode == other.safeCode && + retryAfterSeconds == other.retryAfterSeconds; +} + +enum CloudSyncProtectedFailureCategory { + network, + throttled, + server, + authorization, + pcsUnavailable, + malformedRecord, + conflict, + localStorage, + unknown, +} + +/// Exactly one of `page` and `failure` is populated. +class CloudSyncProtectedFetchResult { + final CloudSyncProtectedPage? page; + final CloudSyncProtectedFailure? failure; + + const CloudSyncProtectedFetchResult({this.page, this.failure}); + + @override + int get hashCode => page.hashCode ^ failure.hashCode; + + @override + bool operator ==(Object other) => + identical(this, other) || + other is CloudSyncProtectedFetchResult && + runtimeType == other.runtimeType && + page == other.page && + failure == other.failure; +} + +class CloudSyncProtectedGarbageCollection { + final int scannedCount; + final int firstObservedCount; + final int deletedCount; + final int preservedLiveCount; + final int preservedActiveLeaseCount; + final bool hasMore; + + const CloudSyncProtectedGarbageCollection({ + required this.scannedCount, + required this.firstObservedCount, + required this.deletedCount, + required this.preservedLiveCount, + required this.preservedActiveLeaseCount, + required this.hasMore, + }); + + @override + int get hashCode => + scannedCount.hashCode ^ + firstObservedCount.hashCode ^ + deletedCount.hashCode ^ + preservedLiveCount.hashCode ^ + preservedActiveLeaseCount.hashCode ^ + hasMore.hashCode; + + @override + bool operator ==(Object other) => + identical(this, other) || + other is CloudSyncProtectedGarbageCollection && + runtimeType == other.runtimeType && + scannedCount == other.scannedCount && + firstObservedCount == other.firstObservedCount && + deletedCount == other.deletedCount && + preservedLiveCount == other.preservedLiveCount && + preservedActiveLeaseCount == other.preservedActiveLeaseCount && + hasMore == other.hasMore; +} + +class CloudSyncProtectedGarbageCollectionResult { + final CloudSyncProtectedGarbageCollection? collection; + final CloudSyncProtectedFailure? failure; + + const CloudSyncProtectedGarbageCollectionResult({ + this.collection, + this.failure, + }); + + @override + int get hashCode => collection.hashCode ^ failure.hashCode; + + @override + bool operator ==(Object other) => + identical(this, other) || + other is CloudSyncProtectedGarbageCollectionResult && + runtimeType == other.runtimeType && + collection == other.collection && + failure == other.failure; +} + +/// A lease mutation succeeds only when `failure` is absent. +class CloudSyncProtectedLeaseResult { + final CloudSyncProtectedFailure? failure; + + const CloudSyncProtectedLeaseResult({this.failure}); + + @override + int get hashCode => failure.hashCode; + + @override + bool operator ==(Object other) => + identical(this, other) || + other is CloudSyncProtectedLeaseResult && + runtimeType == other.runtimeType && + failure == other.failure; +} + +class CloudSyncProtectedOutboundStage { + final String logicalEntityKeyHash; + final String protectedPayloadReference; + final String payloadSha256; + final BigInt payloadLength; + final String protectedServerRecordReference; + final String serverRecordIdHash; + final String leaseReference; + + const CloudSyncProtectedOutboundStage({ + required this.logicalEntityKeyHash, + required this.protectedPayloadReference, + required this.payloadSha256, + required this.payloadLength, + required this.protectedServerRecordReference, + required this.serverRecordIdHash, + required this.leaseReference, + }); + + @override + int get hashCode => + logicalEntityKeyHash.hashCode ^ + protectedPayloadReference.hashCode ^ + payloadSha256.hashCode ^ + payloadLength.hashCode ^ + protectedServerRecordReference.hashCode ^ + serverRecordIdHash.hashCode ^ + leaseReference.hashCode; + + @override + bool operator ==(Object other) => + identical(this, other) || + other is CloudSyncProtectedOutboundStage && + runtimeType == other.runtimeType && + logicalEntityKeyHash == other.logicalEntityKeyHash && + protectedPayloadReference == other.protectedPayloadReference && + payloadSha256 == other.payloadSha256 && + payloadLength == other.payloadLength && + protectedServerRecordReference == + other.protectedServerRecordReference && + serverRecordIdHash == other.serverRecordIdHash && + leaseReference == other.leaseReference; +} + +class CloudSyncProtectedOutboundStageResult { + final CloudSyncProtectedOutboundStage? stage; + final CloudSyncOutboundSafeCode? failure; + + const CloudSyncProtectedOutboundStageResult({this.stage, this.failure}); + + @override + int get hashCode => stage.hashCode ^ failure.hashCode; + + @override + bool operator ==(Object other) => + identical(this, other) || + other is CloudSyncProtectedOutboundStageResult && + runtimeType == other.runtimeType && + stage == other.stage && + failure == other.failure; +} + +/// One bounded protected page. Checkpoints and page leases remain opaque +/// native-store references. +class CloudSyncProtectedPage { + final List changes; + final String batchId; + final BigInt generation; + final String pageLeaseReference; + final String? protectedNextCheckpointReference; + final bool complete; + final BigInt admittedRawBytes; + + const CloudSyncProtectedPage({ + required this.changes, + required this.batchId, + required this.generation, + required this.pageLeaseReference, + this.protectedNextCheckpointReference, + required this.complete, + required this.admittedRawBytes, + }); + + @override + int get hashCode => + changes.hashCode ^ + batchId.hashCode ^ + generation.hashCode ^ + pageLeaseReference.hashCode ^ + protectedNextCheckpointReference.hashCode ^ + complete.hashCode ^ + admittedRawBytes.hashCode; + + @override + bool operator ==(Object other) => + identical(this, other) || + other is CloudSyncProtectedPage && + runtimeType == other.runtimeType && + changes == other.changes && + batchId == other.batchId && + generation == other.generation && + pageLeaseReference == other.pageLeaseReference && + protectedNextCheckpointReference == + other.protectedNextCheckpointReference && + complete == other.complete && + admittedRawBytes == other.admittedRawBytes; +} + +/// Fixed, content-free preflight classification. +enum CloudSyncProtectedPreflightCode { + unsupportedRecordType, + malformedMetadata, + oversizedRecord, + invalidChangeShape, +} + +class CloudSyncProtectedRecovery { + final List finalizedAdoptedLeaseReferences; + final List absentAdoptedLeaseReferences; + final int rolledBackCount; + final int removedTemporaryFilesCount; + final bool hasMore; + + const CloudSyncProtectedRecovery({ + required this.finalizedAdoptedLeaseReferences, + required this.absentAdoptedLeaseReferences, + required this.rolledBackCount, + required this.removedTemporaryFilesCount, + required this.hasMore, + }); + + @override + int get hashCode => + finalizedAdoptedLeaseReferences.hashCode ^ + absentAdoptedLeaseReferences.hashCode ^ + rolledBackCount.hashCode ^ + removedTemporaryFilesCount.hashCode ^ + hasMore.hashCode; + + @override + bool operator ==(Object other) => + identical(this, other) || + other is CloudSyncProtectedRecovery && + runtimeType == other.runtimeType && + finalizedAdoptedLeaseReferences == + other.finalizedAdoptedLeaseReferences && + absentAdoptedLeaseReferences == other.absentAdoptedLeaseReferences && + rolledBackCount == other.rolledBackCount && + removedTemporaryFilesCount == other.removedTemporaryFilesCount && + hasMore == other.hasMore; +} + +/// Exactly one of `recovery` and `failure` is populated. +class CloudSyncProtectedRecoveryResult { + final CloudSyncProtectedRecovery? recovery; + final CloudSyncProtectedFailure? failure; + + const CloudSyncProtectedRecoveryResult({this.recovery, this.failure}); + + @override + int get hashCode => recovery.hashCode ^ failure.hashCode; + + @override + bool operator ==(Object other) => + identical(this, other) || + other is CloudSyncProtectedRecoveryResult && + runtimeType == other.runtimeType && + recovery == other.recovery && + failure == other.failure; +} + +class CloudSyncProtectedRetirementResult { + final int retiredCount; + final CloudSyncProtectedFailure? failure; + + const CloudSyncProtectedRetirementResult({ + required this.retiredCount, + this.failure, + }); + + @override + int get hashCode => retiredCount.hashCode ^ failure.hashCode; + + @override + bool operator ==(Object other) => + identical(this, other) || + other is CloudSyncProtectedRetirementResult && + runtimeType == other.runtimeType && + retiredCount == other.retiredCount && + failure == other.failure; +} + +/// Fixed safe-code vocabulary for the protected bridge. These variants carry +/// no server body, path, token, identifier, or record content. +enum CloudSyncProtectedSafeCode { + invalidScope, + invalidRequest, + invalidCheckpoint, + checkpointContextMismatch, + oversizedPage, + oversizedRecord, + protectionFailed, + localStoreFailed, + fetchDeadline, + network, + cloudKitThrottled, + cloudKitServer, + cloudKitAuthorization, + cloudKitConflict, + cloudKitResetRequired, + cloudKitPermanent, + cloudKitUnknown, + httpAuthorization, + httpTimeout, + httpThrottled, + httpServer, + httpUnknown, + pcsUnavailable, + malformedResponse, + continuationNoProgress, + nativeAuthUnavailable, + unknown, +} + +class CloudSyncRawChange { + final String? recordName; + final String? recordType; + final int? changeType; + final CloudSyncRawSystemFields? systemFields; + final Uint8List? encryptedRecord; + final Uint8List? tombstonePayload; + final CloudSyncRawRecordKind kind; + + const CloudSyncRawChange({ + this.recordName, + this.recordType, + this.changeType, + this.systemFields, + this.encryptedRecord, + this.tombstonePayload, + required this.kind, + }); + + @override + int get hashCode => + recordName.hashCode ^ + recordType.hashCode ^ + changeType.hashCode ^ + systemFields.hashCode ^ + encryptedRecord.hashCode ^ + tombstonePayload.hashCode ^ + kind.hashCode; + + @override + bool operator ==(Object other) => + identical(this, other) || + other is CloudSyncRawChange && + runtimeType == other.runtimeType && + recordName == other.recordName && + recordType == other.recordType && + changeType == other.changeType && + systemFields == other.systemFields && + encryptedRecord == other.encryptedRecord && + tombstonePayload == other.tombstonePayload && + kind == other.kind; +} + +/// Redacted failure information for the durable Dart scheduler. This contains +/// no server body, record identifier, token, account identifier, or message +/// content. +class CloudSyncRawFailure { + final CloudSyncRawFailureCategory category; + final BigInt? retryAfterSeconds; + final String safeCode; + + const CloudSyncRawFailure({ + required this.category, + this.retryAfterSeconds, + required this.safeCode, + }); + + @override + int get hashCode => + category.hashCode ^ retryAfterSeconds.hashCode ^ safeCode.hashCode; + + @override + bool operator ==(Object other) => + identical(this, other) || + other is CloudSyncRawFailure && + runtimeType == other.runtimeType && + category == other.category && + retryAfterSeconds == other.retryAfterSeconds && + safeCode == other.safeCode; +} + +enum CloudSyncRawFailureCategory { + network, + throttled, + server, + authorization, + pcsUnavailable, + malformedRecord, + conflict, + localStorage, + unknown, +} + +/// Exactly one of [page] and [failure] is populated. +class CloudSyncRawFetchResult { + final CloudSyncRawPage? page; + final CloudSyncRawFailure? failure; + + const CloudSyncRawFetchResult({this.page, this.failure}); + + @override + int get hashCode => page.hashCode ^ failure.hashCode; + + @override + bool operator ==(Object other) => + identical(this, other) || + other is CloudSyncRawFetchResult && + runtimeType == other.runtimeType && + page == other.page && + failure == other.failure; +} + +class CloudSyncRawPage { + final List changes; + final Uint8List? nextToken; + final int status; + final bool complete; + + const CloudSyncRawPage({ + required this.changes, + this.nextToken, + required this.status, + required this.complete, + }); + + @override + int get hashCode => + changes.hashCode ^ + nextToken.hashCode ^ + status.hashCode ^ + complete.hashCode; + + @override + bool operator ==(Object other) => + identical(this, other) || + other is CloudSyncRawPage && + runtimeType == other.runtimeType && + changes == other.changes && + nextToken == other.nextToken && + status == other.status && + complete == other.complete; +} + +enum CloudSyncRawRecordKind { + encryptedUpsert, + tombstone, + unsupportedRecordType, + malformedMetadata, +} + +class CloudSyncRawSystemFields { + final String? etag; + final double? createdAt; + final double? modifiedAt; + final int? permission; + + const CloudSyncRawSystemFields({ + this.etag, + this.createdAt, + this.modifiedAt, + this.permission, + }); + + @override + int get hashCode => + etag.hashCode ^ + createdAt.hashCode ^ + modifiedAt.hashCode ^ + permission.hashCode; + + @override + bool operator ==(Object other) => + identical(this, other) || + other is CloudSyncRawSystemFields && + runtimeType == other.runtimeType && + etag == other.etag && + createdAt == other.createdAt && + modifiedAt == other.modifiedAt && + permission == other.permission; +} + +enum CloudSyncTransientAssociationKind { + none, + sticker, + reactionAdd, + reactionRemove, +} + +class CloudSyncTransientAttachmentPayload { + final String logicalEntityKeyHash; + final String canonicalGuid; + final String? ownerLogicalKeyHash; + final String? ownerCanonicalGuid; + final int? ownerPart; + final CloudSyncTransientFieldState utiState; + final String? uti; + final CloudSyncTransientFieldState fileNameState; + final String? fileName; + final CloudSyncTransientFieldState mimeTypeState; + final String? mimeType; + final CloudSyncTransientFieldState totalBytesState; + final BigInt? totalBytes; + final CloudSyncTransientFieldState isOutgoingState; + final bool? isOutgoing; + final CloudSyncTransientFieldState protectedLocalReferenceState; + final String? protectedLocalReference; + + const CloudSyncTransientAttachmentPayload({ + required this.logicalEntityKeyHash, + required this.canonicalGuid, + this.ownerLogicalKeyHash, + this.ownerCanonicalGuid, + this.ownerPart, + required this.utiState, + this.uti, + required this.fileNameState, + this.fileName, + required this.mimeTypeState, + this.mimeType, + required this.totalBytesState, + this.totalBytes, + required this.isOutgoingState, + this.isOutgoing, + required this.protectedLocalReferenceState, + this.protectedLocalReference, + }); + + @override + int get hashCode => + logicalEntityKeyHash.hashCode ^ + canonicalGuid.hashCode ^ + ownerLogicalKeyHash.hashCode ^ + ownerCanonicalGuid.hashCode ^ + ownerPart.hashCode ^ + utiState.hashCode ^ + uti.hashCode ^ + fileNameState.hashCode ^ + fileName.hashCode ^ + mimeTypeState.hashCode ^ + mimeType.hashCode ^ + totalBytesState.hashCode ^ + totalBytes.hashCode ^ + isOutgoingState.hashCode ^ + isOutgoing.hashCode ^ + protectedLocalReferenceState.hashCode ^ + protectedLocalReference.hashCode; + + @override + bool operator ==(Object other) => + identical(this, other) || + other is CloudSyncTransientAttachmentPayload && + runtimeType == other.runtimeType && + logicalEntityKeyHash == other.logicalEntityKeyHash && + canonicalGuid == other.canonicalGuid && + ownerLogicalKeyHash == other.ownerLogicalKeyHash && + ownerCanonicalGuid == other.ownerCanonicalGuid && + ownerPart == other.ownerPart && + utiState == other.utiState && + uti == other.uti && + fileNameState == other.fileNameState && + fileName == other.fileName && + mimeTypeState == other.mimeTypeState && + mimeType == other.mimeType && + totalBytesState == other.totalBytesState && + totalBytes == other.totalBytes && + isOutgoingState == other.isOutgoingState && + isOutgoing == other.isOutgoing && + protectedLocalReferenceState == other.protectedLocalReferenceState && + protectedLocalReference == other.protectedLocalReference; +} + +class CloudSyncTransientAttributedBody { + final String text; + final List runs; + + const CloudSyncTransientAttributedBody({ + required this.text, + required this.runs, + }); + + @override + int get hashCode => text.hashCode ^ runs.hashCode; + + @override + bool operator ==(Object other) => + identical(this, other) || + other is CloudSyncTransientAttributedBody && + runtimeType == other.runtimeType && + text == other.text && + runs == other.runs; +} + +/// Transient chat content. This type has no Debug, Display, serde, or durable +/// representation and must flow directly into the canonical applier. +class CloudSyncTransientChatPayload { + final String logicalEntityKeyHash; + + /// Validated application-level chat GUID. Transient typed memory only. + final String canonicalGuid; + + /// Validated iMessage chat identifier used to bind message records. + final String chatIdentifier; + final String groupId; + final String originalGroupId; + final CloudSyncTransientService service; + final CloudSyncTransientChatStyle style; + final List participantHandles; + final CloudSyncTransientFieldState displayNameState; + final String? displayName; + final CloudSyncTransientFieldState lastAddressedHandleState; + final String? lastAddressedHandle; + final CloudSyncTransientFieldState groupVersionState; + final int? groupVersion; + final CloudSyncTransientFieldState lastSeenMessageGuidState; + final String? lastSeenMessageGuid; + final CloudSyncTransientFieldState groupPhotoGuidState; + final String? groupPhotoGuid; + + const CloudSyncTransientChatPayload({ + required this.logicalEntityKeyHash, + required this.canonicalGuid, + required this.chatIdentifier, + required this.groupId, + required this.originalGroupId, + required this.service, + required this.style, + required this.participantHandles, + required this.displayNameState, + this.displayName, + required this.lastAddressedHandleState, + this.lastAddressedHandle, + required this.groupVersionState, + this.groupVersion, + required this.lastSeenMessageGuidState, + this.lastSeenMessageGuid, + required this.groupPhotoGuidState, + this.groupPhotoGuid, + }); + + @override + int get hashCode => + logicalEntityKeyHash.hashCode ^ + canonicalGuid.hashCode ^ + chatIdentifier.hashCode ^ + groupId.hashCode ^ + originalGroupId.hashCode ^ + service.hashCode ^ + style.hashCode ^ + participantHandles.hashCode ^ + displayNameState.hashCode ^ + displayName.hashCode ^ + lastAddressedHandleState.hashCode ^ + lastAddressedHandle.hashCode ^ + groupVersionState.hashCode ^ + groupVersion.hashCode ^ + lastSeenMessageGuidState.hashCode ^ + lastSeenMessageGuid.hashCode ^ + groupPhotoGuidState.hashCode ^ + groupPhotoGuid.hashCode; + + @override + bool operator ==(Object other) => + identical(this, other) || + other is CloudSyncTransientChatPayload && + runtimeType == other.runtimeType && + logicalEntityKeyHash == other.logicalEntityKeyHash && + canonicalGuid == other.canonicalGuid && + chatIdentifier == other.chatIdentifier && + groupId == other.groupId && + originalGroupId == other.originalGroupId && + service == other.service && + style == other.style && + participantHandles == other.participantHandles && + displayNameState == other.displayNameState && + displayName == other.displayName && + lastAddressedHandleState == other.lastAddressedHandleState && + lastAddressedHandle == other.lastAddressedHandle && + groupVersionState == other.groupVersionState && + groupVersion == other.groupVersion && + lastSeenMessageGuidState == other.lastSeenMessageGuidState && + lastSeenMessageGuid == other.lastSeenMessageGuid && + groupPhotoGuidState == other.groupPhotoGuidState && + groupPhotoGuid == other.groupPhotoGuid; +} + +enum CloudSyncTransientChatStyle { direct, group } + +/// A bounded, single-record D1 result. Exactly one of `mutation`, +/// `deferred_reason`, `quarantine_reason`, and `failure_code` is populated. +/// The optional source capability is echoed only after it passes the native +/// protected-reference grammar. +class CloudSyncTransientDecodeResult { + final String? protectedSourceReference; + final BigInt generation; + final String? changeId; + final CloudSyncTransientEntityKind? entityKind; + final CloudSyncTransientMutationKind? mutationKind; + final CloudSyncTransientSnapshot? snapshot; + final CloudSyncTransientPayload? payload; + final CloudSyncTransientTombstone? tombstone; + final CloudSyncTransientDeferredReason? deferredReason; + final CloudSyncTransientQuarantineReason? quarantineReason; + final CloudSyncTransientFailureCode? failureCode; + + const CloudSyncTransientDecodeResult({ + this.protectedSourceReference, + required this.generation, + this.changeId, + this.entityKind, + this.mutationKind, + this.snapshot, + this.payload, + this.tombstone, + this.deferredReason, + this.quarantineReason, + this.failureCode, + }); + + @override + int get hashCode => + protectedSourceReference.hashCode ^ + generation.hashCode ^ + changeId.hashCode ^ + entityKind.hashCode ^ + mutationKind.hashCode ^ + snapshot.hashCode ^ + payload.hashCode ^ + tombstone.hashCode ^ + deferredReason.hashCode ^ + quarantineReason.hashCode ^ + failureCode.hashCode; + + @override + bool operator ==(Object other) => + identical(this, other) || + other is CloudSyncTransientDecodeResult && + runtimeType == other.runtimeType && + protectedSourceReference == other.protectedSourceReference && + generation == other.generation && + changeId == other.changeId && + entityKind == other.entityKind && + mutationKind == other.mutationKind && + snapshot == other.snapshot && + payload == other.payload && + tombstone == other.tombstone && + deferredReason == other.deferredReason && + quarantineReason == other.quarantineReason && + failureCode == other.failureCode; +} + +enum CloudSyncTransientDeferredReason { + nestedPresenceUnavailable, + unprovenEditTimestamp, + unsupportedExtensionPayload, + unsupportedMediaCredentials, + unsupportedGroupPhoto, + unsupportedSticker, + unsupportedScheduling, + unsupportedOffGridMetadata, + unsupportedNegativeAttachmentSize, +} + +/// Content-free edit metadata used by the merge policy. +class CloudSyncTransientEditPart { + final String partKeyHash; + final int revision; + final String contentDigest; + final PlatformInt64 modifiedAtMillis; + + const CloudSyncTransientEditPart({ + required this.partKeyHash, + required this.revision, + required this.contentDigest, + required this.modifiedAtMillis, + }); + + @override + int get hashCode => + partKeyHash.hashCode ^ + revision.hashCode ^ + contentDigest.hashCode ^ + modifiedAtMillis.hashCode; + + @override + bool operator ==(Object other) => + identical(this, other) || + other is CloudSyncTransientEditPart && + runtimeType == other.runtimeType && + partKeyHash == other.partKeyHash && + revision == other.revision && + contentDigest == other.contentDigest && + modifiedAtMillis == other.modifiedAtMillis; +} + +/// D1-only entity vocabulary. These values are safe fixed discriminants. +enum CloudSyncTransientEntityKind { + chat, + message, + reaction, + attachment, + groupPhoto, +} + +enum CloudSyncTransientFailureCode { + invalidRequest, + activeAccountMismatch, + scopeMismatch, + generationMismatch, + storeIdentityMismatch, + protectedReferenceMismatch, + malformedRecord, + oversizedRecord, + pcsUnavailable, + retryableUpstream, + decoderFailure, +} + +enum CloudSyncTransientFieldState { absent, value, explicitClear } + +class CloudSyncTransientGroupPhotoPayload { + final String logicalEntityKeyHash; + final String ownerLogicalKeyHash; + final String photoGuid; + final String protectedLocalReference; + + const CloudSyncTransientGroupPhotoPayload({ + required this.logicalEntityKeyHash, + required this.ownerLogicalKeyHash, + required this.photoGuid, + required this.protectedLocalReference, + }); + + @override + int get hashCode => + logicalEntityKeyHash.hashCode ^ + ownerLogicalKeyHash.hashCode ^ + photoGuid.hashCode ^ + protectedLocalReference.hashCode; + + @override + bool operator ==(Object other) => + identical(this, other) || + other is CloudSyncTransientGroupPhotoPayload && + runtimeType == other.runtimeType && + logicalEntityKeyHash == other.logicalEntityKeyHash && + ownerLogicalKeyHash == other.ownerLogicalKeyHash && + photoGuid == other.photoGuid && + protectedLocalReference == other.protectedLocalReference; +} + +class CloudSyncTransientKnownMessageFlags { + final bool fromMe; + final bool delivered; + final bool read; + final bool hasDataDetectorResults; + final bool deliveredQuietly; + final bool didNotifyRecipient; + + const CloudSyncTransientKnownMessageFlags({ + required this.fromMe, + required this.delivered, + required this.read, + required this.hasDataDetectorResults, + required this.deliveredQuietly, + required this.didNotifyRecipient, + }); + + @override + int get hashCode => + fromMe.hashCode ^ + delivered.hashCode ^ + read.hashCode ^ + hasDataDetectorResults.hashCode ^ + deliveredQuietly.hashCode ^ + didNotifyRecipient.hashCode; + + @override + bool operator ==(Object other) => + identical(this, other) || + other is CloudSyncTransientKnownMessageFlags && runtimeType == other.runtimeType && - style == other.style && - isFiltered == other.isFiltered && - successfulQuery == other.successfulQuery && - state == other.state && - chatIdentifier == other.chatIdentifier && - groupId == other.groupId && - serviceName == other.serviceName && - originalGroupId == other.originalGroupId && - properties == other.properties && - participants == other.participants && - prop001 == other.prop001 && - lastReadMessageTimestamp == other.lastReadMessageTimestamp && - lastAddressedHandle == other.lastAddressedHandle && - guid == other.guid && - displayName == other.displayName && - proto001 == other.proto001 && - groupPhotoGuid == other.groupPhotoGuid && - groupPhoto == other.groupPhoto; + fromMe == other.fromMe && + delivered == other.delivered && + read == other.read && + hasDataDetectorResults == other.hasDataDetectorResults && + deliveredQuietly == other.deliveredQuietly && + didNotifyRecipient == other.didNotifyRecipient; } -class CloudMessage { - final SystemTime? utm; - final PlatformInt64 type; - final PlatformInt64 error; - final String chatId; - final String sender; - final PlatformInt64 time; - final GZipWrapperMessageProto2? msgProto2; - final String destinationCallerId; - final GZipWrapperMessageProto msgProto; - final MessageFlags flags; - final String guid; - final GZipWrapperMessageProto3? msgProto3; - final String service; - final GZipWrapperMessageProto4? msgProto4; +class CloudSyncTransientMessageEdit { + final int part_; + final int revision; + final List bodies; + final PlatformInt64 modifiedAtMillis; + final int? originalRangeLocation; + final int? originalRangeLength; - const CloudMessage({ - this.utm, - required this.type, + const CloudSyncTransientMessageEdit({ + required this.part_, + required this.revision, + required this.bodies, + required this.modifiedAtMillis, + this.originalRangeLocation, + this.originalRangeLength, + }); + + @override + int get hashCode => + part_.hashCode ^ + revision.hashCode ^ + bodies.hashCode ^ + modifiedAtMillis.hashCode ^ + originalRangeLocation.hashCode ^ + originalRangeLength.hashCode; + + @override + bool operator ==(Object other) => + identical(this, other) || + other is CloudSyncTransientMessageEdit && + runtimeType == other.runtimeType && + part_ == other.part_ && + revision == other.revision && + bodies == other.bodies && + modifiedAtMillis == other.modifiedAtMillis && + originalRangeLocation == other.originalRangeLocation && + originalRangeLength == other.originalRangeLength; +} + +/// Transient message/reaction content. Raw CloudKit record names and Apple +/// private identifiers are deliberately absent; validated app canonical +/// identities may cross this typed in-memory boundary. +class CloudSyncTransientMessagePayload { + final String logicalEntityKeyHash; + + /// Validated application-level message/reaction GUID. Transient only. + final String canonicalGuid; + final String chatAliasKeyHash; + final String chatIdentifier; + final String senderHandle; + final PlatformInt64 createdAtMillis; + final PlatformInt64 error; + final CloudSyncTransientService service; + final CloudSyncTransientFieldState subjectState; + final String? subject; + final CloudSyncTransientFieldState bodyState; + final String? body; + final CloudSyncTransientFieldState attributedBodiesState; + final List attributedBodies; + final CloudSyncTransientFieldState balloonBundleIdState; + final String? balloonBundleId; + final CloudSyncTransientFieldState effectState; + final String? effect; + final CloudSyncTransientFieldState readAtMillisState; + final PlatformInt64? readAtMillis; + final CloudSyncTransientFieldState deliveredAtMillisState; + final PlatformInt64? deliveredAtMillis; + final CloudSyncTransientKnownMessageFlags knownFlags; + final CloudSyncTransientAssociationKind associationKind; + final CloudSyncTransientReactionKind? reactionKind; + final bool reactionRemoved; + final String? reactionParentLogicalKeyHash; + final String? reactionParentCanonicalGuid; + final int? reactionParentPart; + final int? associatedRangeLocation; + final int? associatedRangeLength; + final String? replyParentLogicalKeyHash; + final String? replyParentCanonicalGuid; + final String? replyParentPart; + final CloudSyncTransientFieldState editsState; + final List edits; + final CloudSyncTransientFieldState retractedPartsState; + final Uint32List retractedParts; + final CloudSyncTransientFieldState associatedEmojiState; + final String? associatedEmoji; + + const CloudSyncTransientMessagePayload({ + required this.logicalEntityKeyHash, + required this.canonicalGuid, + required this.chatAliasKeyHash, + required this.chatIdentifier, + required this.senderHandle, + required this.createdAtMillis, required this.error, - required this.chatId, - required this.sender, - required this.time, - this.msgProto2, - required this.destinationCallerId, - required this.msgProto, - required this.flags, - required this.guid, - this.msgProto3, required this.service, - this.msgProto4, + required this.subjectState, + this.subject, + required this.bodyState, + this.body, + required this.attributedBodiesState, + required this.attributedBodies, + required this.balloonBundleIdState, + this.balloonBundleId, + required this.effectState, + this.effect, + required this.readAtMillisState, + this.readAtMillis, + required this.deliveredAtMillisState, + this.deliveredAtMillis, + required this.knownFlags, + required this.associationKind, + this.reactionKind, + required this.reactionRemoved, + this.reactionParentLogicalKeyHash, + this.reactionParentCanonicalGuid, + this.reactionParentPart, + this.associatedRangeLocation, + this.associatedRangeLength, + this.replyParentLogicalKeyHash, + this.replyParentCanonicalGuid, + this.replyParentPart, + required this.editsState, + required this.edits, + required this.retractedPartsState, + required this.retractedParts, + required this.associatedEmojiState, + this.associatedEmoji, }); @override int get hashCode => - utm.hashCode ^ - type.hashCode ^ + logicalEntityKeyHash.hashCode ^ + canonicalGuid.hashCode ^ + chatAliasKeyHash.hashCode ^ + chatIdentifier.hashCode ^ + senderHandle.hashCode ^ + createdAtMillis.hashCode ^ error.hashCode ^ - chatId.hashCode ^ - sender.hashCode ^ - time.hashCode ^ - msgProto2.hashCode ^ - destinationCallerId.hashCode ^ - msgProto.hashCode ^ - flags.hashCode ^ - guid.hashCode ^ - msgProto3.hashCode ^ service.hashCode ^ - msgProto4.hashCode; + subjectState.hashCode ^ + subject.hashCode ^ + bodyState.hashCode ^ + body.hashCode ^ + attributedBodiesState.hashCode ^ + attributedBodies.hashCode ^ + balloonBundleIdState.hashCode ^ + balloonBundleId.hashCode ^ + effectState.hashCode ^ + effect.hashCode ^ + readAtMillisState.hashCode ^ + readAtMillis.hashCode ^ + deliveredAtMillisState.hashCode ^ + deliveredAtMillis.hashCode ^ + knownFlags.hashCode ^ + associationKind.hashCode ^ + reactionKind.hashCode ^ + reactionRemoved.hashCode ^ + reactionParentLogicalKeyHash.hashCode ^ + reactionParentCanonicalGuid.hashCode ^ + reactionParentPart.hashCode ^ + associatedRangeLocation.hashCode ^ + associatedRangeLength.hashCode ^ + replyParentLogicalKeyHash.hashCode ^ + replyParentCanonicalGuid.hashCode ^ + replyParentPart.hashCode ^ + editsState.hashCode ^ + edits.hashCode ^ + retractedPartsState.hashCode ^ + retractedParts.hashCode ^ + associatedEmojiState.hashCode ^ + associatedEmoji.hashCode; @override bool operator ==(Object other) => identical(this, other) || - other is CloudMessage && + other is CloudSyncTransientMessagePayload && runtimeType == other.runtimeType && - utm == other.utm && - type == other.type && + logicalEntityKeyHash == other.logicalEntityKeyHash && + canonicalGuid == other.canonicalGuid && + chatAliasKeyHash == other.chatAliasKeyHash && + chatIdentifier == other.chatIdentifier && + senderHandle == other.senderHandle && + createdAtMillis == other.createdAtMillis && error == other.error && - chatId == other.chatId && - sender == other.sender && - time == other.time && - msgProto2 == other.msgProto2 && - destinationCallerId == other.destinationCallerId && - msgProto == other.msgProto && - flags == other.flags && - guid == other.guid && - msgProto3 == other.msgProto3 && service == other.service && - msgProto4 == other.msgProto4; -} - -class CloudMessageSummary { - final Int64List messagesSummary; - final Int64List chatSummary; - final Int64List attachmentSummary; - - const CloudMessageSummary({ - required this.messagesSummary, - required this.chatSummary, - required this.attachmentSummary, + subjectState == other.subjectState && + subject == other.subject && + bodyState == other.bodyState && + body == other.body && + attributedBodiesState == other.attributedBodiesState && + attributedBodies == other.attributedBodies && + balloonBundleIdState == other.balloonBundleIdState && + balloonBundleId == other.balloonBundleId && + effectState == other.effectState && + effect == other.effect && + readAtMillisState == other.readAtMillisState && + readAtMillis == other.readAtMillis && + deliveredAtMillisState == other.deliveredAtMillisState && + deliveredAtMillis == other.deliveredAtMillis && + knownFlags == other.knownFlags && + associationKind == other.associationKind && + reactionKind == other.reactionKind && + reactionRemoved == other.reactionRemoved && + reactionParentLogicalKeyHash == other.reactionParentLogicalKeyHash && + reactionParentCanonicalGuid == other.reactionParentCanonicalGuid && + reactionParentPart == other.reactionParentPart && + associatedRangeLocation == other.associatedRangeLocation && + associatedRangeLength == other.associatedRangeLength && + replyParentLogicalKeyHash == other.replyParentLogicalKeyHash && + replyParentCanonicalGuid == other.replyParentCanonicalGuid && + replyParentPart == other.replyParentPart && + editsState == other.editsState && + edits == other.edits && + retractedPartsState == other.retractedPartsState && + retractedParts == other.retractedParts && + associatedEmojiState == other.associatedEmojiState && + associatedEmoji == other.associatedEmoji; +} + +enum CloudSyncTransientMutationKind { upsert, tombstone } + +/// Exactly one payload member is populated for an upsert. +class CloudSyncTransientPayload { + final CloudSyncTransientChatPayload? chat; + final CloudSyncTransientMessagePayload? message; + final CloudSyncTransientAttachmentPayload? attachment; + final CloudSyncTransientGroupPhotoPayload? groupPhoto; + + const CloudSyncTransientPayload({ + this.chat, + this.message, + this.attachment, + this.groupPhoto, }); @override int get hashCode => - messagesSummary.hashCode ^ - chatSummary.hashCode ^ - attachmentSummary.hashCode; + chat.hashCode ^ + message.hashCode ^ + attachment.hashCode ^ + groupPhoto.hashCode; @override bool operator ==(Object other) => identical(this, other) || - other is CloudMessageSummary && + other is CloudSyncTransientPayload && runtimeType == other.runtimeType && - messagesSummary == other.messagesSummary && - chatSummary == other.chatSummary && - attachmentSummary == other.attachmentSummary; + chat == other.chat && + message == other.message && + attachment == other.attachment && + groupPhoto == other.groupPhoto; } -class CloudParticipant { - final String uri; - - const CloudParticipant({ - required this.uri, +enum CloudSyncTransientQuarantineReason { + malformedRequiredIdentity, + fieldPresenceMismatch, + unsupportedService, + unsupportedChatStyle, + unsupportedMessageType, + unsupportedAssociationType, + malformedParent, + ambiguousReply, + malformedAttributedBody, + malformedMessageSummary, + conflictingEditAndRetraction, + oversizedContent, + invalidCanonicalPayload, + malformedRecord, +} + +enum CloudSyncTransientReactionKind { + heart, + like, + dislike, + laugh, + emphasize, + question, + emoji, + stickerBack, +} + +enum CloudSyncTransientService { iMessage } + +/// Content-free canonical snapshot. The opaque protected source reference is +/// retained so unknown semantics can be retried by a later decoder. +class CloudSyncTransientSnapshot { + final CloudSyncTransientEntityKind entityKind; + final String logicalEntityKeyHash; + final String? parentLogicalKeyHash; + final String? immutableContentDigest; + final PlatformInt64? createdAtMillis; + final PlatformInt64? readAtMillis; + final PlatformInt64? deliveredAtMillis; + final List editParts; + final PlatformInt64? retractedAtMillis; + final int? groupVersion; + final String? groupMetadataDigest; + final String? etagHash; + final String protectedSourceReference; + + const CloudSyncTransientSnapshot({ + required this.entityKind, + required this.logicalEntityKeyHash, + this.parentLogicalKeyHash, + this.immutableContentDigest, + this.createdAtMillis, + this.readAtMillis, + this.deliveredAtMillis, + required this.editParts, + this.retractedAtMillis, + this.groupVersion, + this.groupMetadataDigest, + this.etagHash, + required this.protectedSourceReference, }); @override - int get hashCode => uri.hashCode; + int get hashCode => + entityKind.hashCode ^ + logicalEntityKeyHash.hashCode ^ + parentLogicalKeyHash.hashCode ^ + immutableContentDigest.hashCode ^ + createdAtMillis.hashCode ^ + readAtMillis.hashCode ^ + deliveredAtMillis.hashCode ^ + editParts.hashCode ^ + retractedAtMillis.hashCode ^ + groupVersion.hashCode ^ + groupMetadataDigest.hashCode ^ + etagHash.hashCode ^ + protectedSourceReference.hashCode; @override bool operator ==(Object other) => identical(this, other) || - other is CloudParticipant && + other is CloudSyncTransientSnapshot && runtimeType == other.runtimeType && - uri == other.uri; -} - -class CloudProp { - int? gpufc; - int? pv; - int? numberOfTimesRespondedtoThread; - bool? shouldForceToSms; - String? lastSeenMessageGuid; - int? messageHandshakeState; - List legacyGroupIdentifiers; - String? groupPhotoGuid; - Date? lastModificationDate; - - CloudProp({ - this.gpufc, - this.pv, - this.numberOfTimesRespondedtoThread, - this.shouldForceToSms, - this.lastSeenMessageGuid, - this.messageHandshakeState, - required this.legacyGroupIdentifiers, - this.groupPhotoGuid, - this.lastModificationDate, + entityKind == other.entityKind && + logicalEntityKeyHash == other.logicalEntityKeyHash && + parentLogicalKeyHash == other.parentLogicalKeyHash && + immutableContentDigest == other.immutableContentDigest && + createdAtMillis == other.createdAtMillis && + readAtMillis == other.readAtMillis && + deliveredAtMillis == other.deliveredAtMillis && + editParts == other.editParts && + retractedAtMillis == other.retractedAtMillis && + groupVersion == other.groupVersion && + groupMetadataDigest == other.groupMetadataDigest && + etagHash == other.etagHash && + protectedSourceReference == other.protectedSourceReference; +} + +class CloudSyncTransientTextRun { + final int startUtf16; + final int lengthUtf16; + final int? messagePart; + final String? attachmentCanonicalGuid; + final String? attachmentLogicalKeyHash; + final String? mentionHandle; + final String? audioTranscript; + final PlatformInt64? textEffect; + final bool? bold; + final bool? italic; + final bool? strikethrough; + final bool? underline; + + const CloudSyncTransientTextRun({ + required this.startUtf16, + required this.lengthUtf16, + this.messagePart, + this.attachmentCanonicalGuid, + this.attachmentLogicalKeyHash, + this.mentionHandle, + this.audioTranscript, + this.textEffect, + this.bold, + this.italic, + this.strikethrough, + this.underline, }); @override int get hashCode => - gpufc.hashCode ^ - pv.hashCode ^ - numberOfTimesRespondedtoThread.hashCode ^ - shouldForceToSms.hashCode ^ - lastSeenMessageGuid.hashCode ^ - messageHandshakeState.hashCode ^ - legacyGroupIdentifiers.hashCode ^ - groupPhotoGuid.hashCode ^ - lastModificationDate.hashCode; + startUtf16.hashCode ^ + lengthUtf16.hashCode ^ + messagePart.hashCode ^ + attachmentCanonicalGuid.hashCode ^ + attachmentLogicalKeyHash.hashCode ^ + mentionHandle.hashCode ^ + audioTranscript.hashCode ^ + textEffect.hashCode ^ + bold.hashCode ^ + italic.hashCode ^ + strikethrough.hashCode ^ + underline.hashCode; @override bool operator ==(Object other) => identical(this, other) || - other is CloudProp && + other is CloudSyncTransientTextRun && runtimeType == other.runtimeType && - gpufc == other.gpufc && - pv == other.pv && - numberOfTimesRespondedtoThread == - other.numberOfTimesRespondedtoThread && - shouldForceToSms == other.shouldForceToSms && - lastSeenMessageGuid == other.lastSeenMessageGuid && - messageHandshakeState == other.messageHandshakeState && - legacyGroupIdentifiers == other.legacyGroupIdentifiers && - groupPhotoGuid == other.groupPhotoGuid && - lastModificationDate == other.lastModificationDate; + startUtf16 == other.startUtf16 && + lengthUtf16 == other.lengthUtf16 && + messagePart == other.messagePart && + attachmentCanonicalGuid == other.attachmentCanonicalGuid && + attachmentLogicalKeyHash == other.attachmentLogicalKeyHash && + mentionHandle == other.mentionHandle && + audioTranscript == other.audioTranscript && + textEffect == other.textEffect && + bold == other.bold && + italic == other.italic && + strikethrough == other.strikethrough && + underline == other.underline; } -class CloudProp001 { - final int syndicationType; +class CloudSyncTransientTombstone { + final CloudSyncTransientEntityKind entityKind; + final String logicalEntityKeyHash; + final PlatformInt64? deletedAtMillis; + final bool serverConfirmed; - const CloudProp001({ - required this.syndicationType, + const CloudSyncTransientTombstone({ + required this.entityKind, + required this.logicalEntityKeyHash, + this.deletedAtMillis, + required this.serverConfirmed, }); @override - int get hashCode => syndicationType.hashCode; + int get hashCode => + entityKind.hashCode ^ + logicalEntityKeyHash.hashCode ^ + deletedAtMillis.hashCode ^ + serverConfirmed.hashCode; @override bool operator ==(Object other) => identical(this, other) || - other is CloudProp001 && + other is CloudSyncTransientTombstone && runtimeType == other.runtimeType && - syndicationType == other.syndicationType; + entityKind == other.entityKind && + logicalEntityKeyHash == other.logicalEntityKeyHash && + deletedAtMillis == other.deletedAtMillis && + serverConfirmed == other.serverConfirmed; } class ConversationData { @@ -2227,12 +4437,9 @@ class DartBeaconShareInfo { sealed class DeleteTarget with _$DeleteTarget { const DeleteTarget._(); - const factory DeleteTarget.chat( - OperatedChat field0, - ) = DeleteTarget_Chat; - const factory DeleteTarget.messages( - List field0, - ) = DeleteTarget_Messages; + const factory DeleteTarget.chat(OperatedChat field0) = DeleteTarget_Chat; + const factory DeleteTarget.messages(List field0) = + DeleteTarget_Messages; } class DeviceInfo { @@ -2604,10 +4811,7 @@ class FTMember { final String? nickname; final String handle; - const FTMember({ - this.nickname, - required this.handle, - }); + const FTMember({this.nickname, required this.handle}); @override int get hashCode => nickname.hashCode ^ handle.hashCode; @@ -2625,12 +4829,10 @@ class FTMember { sealed class FTMessage with _$FTMessage { const FTMessage._(); - const factory FTMessage.letMeInRequest( - LetMeInRequest field0, - ) = FTMessage_LetMeInRequest; - const factory FTMessage.linkChanged({ - required String guid, - }) = FTMessage_LinkChanged; + const factory FTMessage.letMeInRequest(LetMeInRequest field0) = + FTMessage_LetMeInRequest; + const factory FTMessage.linkChanged({required String guid}) = + FTMessage_LinkChanged; const factory FTMessage.joinEvent({ required String guid, required BigInt participant, @@ -2651,24 +4853,13 @@ sealed class FTMessage with _$FTMessage { required BigInt participant, required String handle, }) = FTMessage_LeaveEvent; - const factory FTMessage.ring({ - required String guid, - }) = FTMessage_Ring; - const factory FTMessage.decline({ - required String guid, - }) = FTMessage_Decline; - const factory FTMessage.respondedElsewhere({ - required String guid, - }) = FTMessage_RespondedElsewhere; + const factory FTMessage.ring({required String guid}) = FTMessage_Ring; + const factory FTMessage.decline({required String guid}) = FTMessage_Decline; + const factory FTMessage.respondedElsewhere({required String guid}) = + FTMessage_RespondedElsewhere; } -enum FTMode { - outgoing, - incoming, - missed, - missedOutgoing, - ; -} +enum FTMode { outgoing, incoming, missed, missedOutgoing } class FTParticipant { final String? token; @@ -2885,11 +5076,7 @@ class IMessageNicknameRecord { final Uint8List? image; final IMessagePosterRecord? poster; - const IMessageNicknameRecord({ - required this.name, - this.image, - this.poster, - }); + const IMessageNicknameRecord({required this.name, this.image, this.poster}); @override int get hashCode => name.hashCode ^ image.hashCode ^ poster.hashCode; @@ -2932,10 +5119,7 @@ class IconChangeMessage { final MMCSFile? file; final int groupVersion; - const IconChangeMessage({ - this.file, - required this.groupVersion, - }); + const IconChangeMessage({this.file, required this.groupVersion}); @override int get hashCode => file.hashCode ^ groupVersion.hashCode; @@ -2988,12 +5172,10 @@ class IdmsCircleMessage { sealed class IdmsMessage with _$IdmsMessage { const IdmsMessage._(); - const factory IdmsMessage.requestedSignIn( - IdmsRequestedSignIn field0, - ) = IdmsMessage_RequestedSignIn; - const factory IdmsMessage.teardownSignIn( - TeardownSignIn field0, - ) = IdmsMessage_TeardownSignIn; + const factory IdmsMessage.requestedSignIn(IdmsRequestedSignIn field0) = + IdmsMessage_RequestedSignIn; + const factory IdmsMessage.teardownSignIn(TeardownSignIn field0) = + IdmsMessage_TeardownSignIn; const factory IdmsMessage.circleRequest( IdmsCircleMessage field0, [ IdmsRequestedSignIn? field1, @@ -3033,11 +5215,7 @@ class IndexedMessagePart { final int? idx; final PartExtension? ext; - const IndexedMessagePart({ - required this.part_, - this.idx, - this.ext, - }); + const IndexedMessagePart({required this.part_, this.idx, this.ext}); @override int get hashCode => part_.hashCode ^ idx.hashCode ^ ext.hashCode; @@ -3099,10 +5277,7 @@ class LinkMeta { final LPLinkMetadata data; final List attachments; - const LinkMeta({ - required this.data, - required this.attachments, - }); + const LinkMeta({required this.data, required this.attachments}); @override int get hashCode => data.hashCode ^ attachments.hashCode; @@ -3200,12 +5375,10 @@ sealed class LoginState with _$LoginState { const factory LoginState.needs2FaVerification() = LoginState_Needs2FAVerification; const factory LoginState.needsSms2Fa() = LoginState_NeedsSMS2FA; - const factory LoginState.needsSms2FaVerification( - VerifyBody field0, - ) = LoginState_NeedsSMS2FAVerification; - const factory LoginState.needsExtraStep( - String field0, - ) = LoginState_NeedsExtraStep; + const factory LoginState.needsSms2FaVerification(VerifyBody field0) = + LoginState_NeedsSMS2FAVerification; + const factory LoginState.needsExtraStep(String field0) = + LoginState_NeedsExtraStep; const factory LoginState.needsLogin() = LoginState_NeedsLogin; } @@ -3213,10 +5386,7 @@ class LPIconMetadata { final NSURL url; final int version; - const LPIconMetadata({ - required this.url, - required this.version, - }); + const LPIconMetadata({required this.url, required this.version}); @override int get hashCode => url.hashCode ^ version.hashCode; @@ -3382,67 +5552,42 @@ class MemojiData { sealed class Message with _$Message { const Message._(); - const factory Message.message( - NormalMessage field0, - ) = Message_Message; - const factory Message.renameMessage( - RenameMessage field0, - ) = Message_RenameMessage; - const factory Message.changeParticipants( - ChangeParticipantMessage field0, - ) = Message_ChangeParticipants; - const factory Message.react( - ReactMessage field0, - ) = Message_React; + const factory Message.message(NormalMessage field0) = Message_Message; + const factory Message.renameMessage(RenameMessage field0) = + Message_RenameMessage; + const factory Message.changeParticipants(ChangeParticipantMessage field0) = + Message_ChangeParticipants; + const factory Message.react(ReactMessage field0) = Message_React; const factory Message.delivered() = Message_Delivered; const factory Message.read() = Message_Read; - const factory Message.typing( - bool field0, [ - TypingApp? field1, - ]) = Message_Typing; - const factory Message.unsend( - UnsendMessage field0, - ) = Message_Unsend; - const factory Message.edit( - EditMessage field0, - ) = Message_Edit; - const factory Message.iconChange( - IconChangeMessage field0, - ) = Message_IconChange; - const factory Message.enableSmsActivation( - bool field0, - ) = Message_EnableSmsActivation; + const factory Message.typing(bool field0, [TypingApp? field1]) = + Message_Typing; + const factory Message.unsend(UnsendMessage field0) = Message_Unsend; + const factory Message.edit(EditMessage field0) = Message_Edit; + const factory Message.iconChange(IconChangeMessage field0) = + Message_IconChange; + const factory Message.enableSmsActivation(bool field0) = + Message_EnableSmsActivation; const factory Message.messageReadOnDevice() = Message_MessageReadOnDevice; - const factory Message.smsConfirmSent( - bool field0, - ) = Message_SmsConfirmSent; + const factory Message.smsConfirmSent(bool field0) = Message_SmsConfirmSent; const factory Message.markUnread() = Message_MarkUnread; const factory Message.peerCacheInvalidate() = Message_PeerCacheInvalidate; - const factory Message.updateExtension( - UpdateExtensionMessage field0, - ) = Message_UpdateExtension; - const factory Message.error( - ErrorMessage field0, - ) = Message_Error; - const factory Message.moveToRecycleBin( - MoveToRecycleBinMessage field0, - ) = Message_MoveToRecycleBin; - const factory Message.recoverChat( - OperatedChat field0, - ) = Message_RecoverChat; - const factory Message.permanentDelete( - PermanentDeleteMessage field0, - ) = Message_PermanentDelete; + const factory Message.updateExtension(UpdateExtensionMessage field0) = + Message_UpdateExtension; + const factory Message.error(ErrorMessage field0) = Message_Error; + const factory Message.moveToRecycleBin(MoveToRecycleBinMessage field0) = + Message_MoveToRecycleBin; + const factory Message.recoverChat(OperatedChat field0) = Message_RecoverChat; + const factory Message.permanentDelete(PermanentDeleteMessage field0) = + Message_PermanentDelete; const factory Message.unschedule() = Message_Unschedule; - const factory Message.updateProfile( - UpdateProfileMessage field0, - ) = Message_UpdateProfile; + const factory Message.updateProfile(UpdateProfileMessage field0) = + Message_UpdateProfile; const factory Message.updateProfileSharing( UpdateProfileSharingMessage field0, ) = Message_UpdateProfileSharing; - const factory Message.shareProfile( - ShareProfileMessage field0, - ) = Message_ShareProfile; + const factory Message.shareProfile(ShareProfileMessage field0) = + Message_ShareProfile; const factory Message.notifyAnyways() = Message_NotifyAnyways; const factory Message.setTranscriptBackground( SetTranscriptBackgroundMessage field0, @@ -3454,11 +5599,7 @@ class MessageEdit { final double d; final String? bcg; - const MessageEdit({ - required this.t, - required this.d, - this.bcg, - }); + const MessageEdit({required this.t, required this.d, this.bcg}); @override int get hashCode => t.hashCode ^ d.hashCode ^ bcg.hashCode; @@ -3477,10 +5618,7 @@ class MessageEditRange { final int lo; final int le; - const MessageEditRange({ - required this.lo, - required this.le, - }); + const MessageEditRange({required this.lo, required this.le}); @override int get hashCode => lo.hashCode ^ le.hashCode; @@ -3549,33 +5687,22 @@ class MessageInst { sealed class MessagePart with _$MessagePart { const MessagePart._(); - const factory MessagePart.text( - String field0, - TextFormat field1, - ) = MessagePart_Text; - const factory MessagePart.attachment( - Attachment field0, - ) = MessagePart_Attachment; - const factory MessagePart.mention( - String field0, - String field1, - ) = MessagePart_Mention; - const factory MessagePart.object( - String field0, - ) = MessagePart_Object; + const factory MessagePart.text(String field0, TextFormat field1) = + MessagePart_Text; + const factory MessagePart.attachment(Attachment field0) = + MessagePart_Attachment; + const factory MessagePart.mention(String field0, String field1) = + MessagePart_Mention; + const factory MessagePart.object(String field0) = MessagePart_Object; } class MessageParts { final List field0; - const MessageParts({ - required this.field0, - }); + const MessageParts({required this.field0}); Future rawText() => - RustLib.instance.api.crateApiApiMessagePartsRawText( - that: this, - ); + RustLib.instance.api.crateApiApiMessagePartsRawText(that: this); @override int get hashCode => field0.hashCode; @@ -3676,9 +5803,7 @@ class MessageProto { class MessageProto2 { final String? reply; - const MessageProto2({ - this.reply, - }); + const MessageProto2({this.reply}); @override int get hashCode => reply.hashCode; @@ -3698,10 +5823,7 @@ class MessageProto3 { /// always 0 final int? unk3; - const MessageProto3({ - this.unk2, - this.unk3, - }); + const MessageProto3({this.unk2, this.unk3}); @override int get hashCode => unk2.hashCode ^ unk3.hashCode; @@ -3833,12 +5955,8 @@ class MessageSummaryInfo { sealed class MessageTarget with _$MessageTarget { const MessageTarget._(); - const factory MessageTarget.token( - Uint8List field0, - ) = MessageTarget_Token; - const factory MessageTarget.uuid( - String field0, - ) = MessageTarget_Uuid; + const factory MessageTarget.token(Uint8List field0) = MessageTarget_Token; + const factory MessageTarget.uuid(String field0) = MessageTarget_Uuid; } @freezed @@ -4098,18 +6216,13 @@ class NSAttributedString { final String text; final List<(int, NSDictionaryTypedCoder)> ranges; - const NSAttributedString({ - required this.text, - required this.ranges, - }); + const NSAttributedString({required this.text, required this.ranges}); static NSAttributedString decode({required StCollapsedValue val}) => RustLib.instance.api.crateApiApiNsAttributedStringDecode(val: val); StCollapsedValue encode() => - RustLib.instance.api.crateApiApiNsAttributedStringEncode( - that: this, - ); + RustLib.instance.api.crateApiApiNsAttributedStringEncode(that: this); @override int get hashCode => text.hashCode ^ ranges.hashCode; @@ -4123,18 +6236,12 @@ class NSAttributedString { ranges == other.ranges; } -enum NSDictionaryClass { - nsDictionary, - nsMutableDictionary, - ; -} +enum NSDictionaryClass { nsDictionary, nsMutableDictionary } class NSDictionaryTypedCoder { final Map field0; - const NSDictionaryTypedCoder({ - required this.field0, - }); + const NSDictionaryTypedCoder({required this.field0}); @override int get hashCode => field0.hashCode; @@ -4150,16 +6257,13 @@ class NSDictionaryTypedCoder { class NSNumber { final int field0; - const NSNumber({ - required this.field0, - }); + const NSNumber({required this.field0}); static NSNumber decode({required StCollapsedValue val}) => RustLib.instance.api.crateApiApiNsNumberDecode(val: val); - StCollapsedValue encode() => RustLib.instance.api.crateApiApiNsNumberEncode( - that: this, - ); + StCollapsedValue encode() => + RustLib.instance.api.crateApiApiNsNumberEncode(that: this); @override int get hashCode => field0.hashCode; @@ -4175,16 +6279,13 @@ class NSNumber { class NSString { final String field0; - const NSString({ - required this.field0, - }); + const NSString({required this.field0}); static NSString decode({required StCollapsedValue val}) => RustLib.instance.api.crateApiApiNsStringDecode(val: val); - StCollapsedValue encode() => RustLib.instance.api.crateApiApiNsStringEncode( - that: this, - ); + StCollapsedValue encode() => + RustLib.instance.api.crateApiApiNsStringEncode(that: this); @override int get hashCode => field0.hashCode; @@ -4201,10 +6302,7 @@ class NSURL { final String base; final String relative; - const NSURL({ - required this.base, - required this.relative, - }); + const NSURL({required this.base, required this.relative}); @override int get hashCode => base.hashCode ^ relative.hashCode; @@ -4222,15 +6320,9 @@ class NSURL { sealed class NumOrString with _$NumOrString { const NumOrString._(); - const factory NumOrString.num( - int field0, - ) = NumOrString_Num; - const factory NumOrString.string( - String field0, - ) = NumOrString_String; - const factory NumOrString.bool( - bool field0, - ) = NumOrString_Bool; + const factory NumOrString.num(int field0) = NumOrString_Num; + const factory NumOrString.string(String field0) = NumOrString_String; + const factory NumOrString.bool(bool field0) = NumOrString_Bool; } class OperatedChat { @@ -4335,9 +6427,7 @@ class Passkey { class PasswordManagerAltDomain { final String domain; - const PasswordManagerAltDomain({ - required this.domain, - }); + const PasswordManagerAltDomain({required this.domain}); @override int get hashCode => domain.hashCode; @@ -4370,10 +6460,8 @@ class PasswordManagerMeta { static Uint8List getData({required PasswordManagerMetaData data}) => RustLib.instance.api.crateApiApiPasswordManagerMetaGetData(data: data); - PasswordManagerMetaData getPasswordData() => - RustLib.instance.api.crateApiApiPasswordManagerMetaGetPasswordData( - that: this, - ); + PasswordManagerMetaData getPasswordData() => RustLib.instance.api + .crateApiApiPasswordManagerMetaGetPasswordData(that: this); @override int get hashCode => @@ -4494,9 +6582,7 @@ class PasswordManagerMetaData { class PasswordManagerMetaDataCtx { final double lastUsed; - const PasswordManagerMetaDataCtx({ - required this.lastUsed, - }); + const PasswordManagerMetaDataCtx({required this.lastUsed}); @override int get hashCode => lastUsed.hashCode; @@ -4553,10 +6639,8 @@ class PasswordManagerTotp { this.originalUrl, }); - (int, BigInt) generateOtp() => - RustLib.instance.api.crateApiApiPasswordManagerTotpGenerateOtp( - that: this, - ); + (int, BigInt) generateOtp() => RustLib.instance.api + .crateApiApiPasswordManagerTotpGenerateOtp(that: this); @override int get hashCode => @@ -4700,10 +6784,7 @@ class PhotoPosterContentsSize { final double width; final double height; - const PhotoPosterContentsSize({ - required this.width, - required this.height, - }); + const PhotoPosterContentsSize({required this.width, required this.height}); @override int get hashCode => width.hashCode ^ height.hashCode; @@ -4839,9 +6920,7 @@ sealed class PollResult with _$PollResult { const PollResult._(); const factory PollResult.stop() = PollResult_Stop; - const factory PollResult.cont([ - PushMessage? field0, - ]) = PollResult_Cont; + const factory PollResult.cont([PushMessage? field0]) = PollResult_Cont; } class PosterAsset { @@ -4896,19 +6975,14 @@ class PosterColor { red == other.red; } -enum PosterRole { - prPosterRoleBackdrop, - prPosterRoleIncomingCall, - ; -} +enum PosterRole { prPosterRoleBackdrop, prPosterRoleIncomingCall } @freezed sealed class PosterType with _$PosterType { const PosterType._(); - const factory PosterType.photo({ - required List assets, - }) = PosterType_Photo; + const factory PosterType.photo({required List assets}) = + PosterType_Photo; const factory PosterType.monogram({ required MonogramData data, required PosterColor background, @@ -5103,8 +7177,7 @@ class PrivateDeviceInfo { enum ProvisionedFlavor { mac, - ios, - ; + ios; static Future default_() => RustLib.instance.api.crateApiApiProvisionedFlavorDefault(); @@ -5114,31 +7187,19 @@ enum ProvisionedFlavor { sealed class PushMessage with _$PushMessage { const PushMessage._(); - const factory PushMessage.iMessage( - MessageInst field0, - ) = PushMessage_IMessage; - const factory PushMessage.sendConfirm({ - required String uuid, - String? error, - }) = PushMessage_SendConfirm; - const factory PushMessage.registrationState( - RegisterState field0, - ) = PushMessage_RegistrationState; - const factory PushMessage.newPhotostream( - SharedAlbum field0, - ) = PushMessage_NewPhotostream; - const factory PushMessage.faceTime( - FTMessage field0, - ) = PushMessage_FaceTime; - const factory PushMessage.statusUpdate( - StatusKitMessage field0, - ) = PushMessage_StatusUpdate; - const factory PushMessage.idms( - IdmsMessage field0, - ) = PushMessage_Idms; - const factory PushMessage.twoFaAuthEvent( - bool field0, - ) = PushMessage_TwoFaAuthEvent; + const factory PushMessage.iMessage(MessageInst field0) = PushMessage_IMessage; + const factory PushMessage.sendConfirm({required String uuid, String? error}) = + PushMessage_SendConfirm; + const factory PushMessage.registrationState(RegisterState field0) = + PushMessage_RegistrationState; + const factory PushMessage.newPhotostream(SharedAlbum field0) = + PushMessage_NewPhotostream; + const factory PushMessage.faceTime(FTMessage field0) = PushMessage_FaceTime; + const factory PushMessage.statusUpdate(StatusKitMessage field0) = + PushMessage_StatusUpdate; + const factory PushMessage.idms(IdmsMessage field0) = PushMessage_Idms; + const factory PushMessage.twoFaAuthEvent(bool field0) = + PushMessage_TwoFaAuthEvent; const factory PushMessage.circleFinishEvent() = PushMessage_CircleFinishEvent; const factory PushMessage.beaconShared({ required String sender, @@ -5232,9 +7293,7 @@ sealed class Reaction with _$Reaction { const factory Reaction.laugh() = Reaction_Laugh; const factory Reaction.emphasize() = Reaction_Emphasize; const factory Reaction.question() = Reaction_Question; - const factory Reaction.emoji( - String field0, - ) = Reaction_Emoji; + const factory Reaction.emoji(String field0) = Reaction_Emoji; const factory Reaction.sticker({ ExtensionApp? spec, required MessageParts body, @@ -5245,9 +7304,8 @@ sealed class Reaction with _$Reaction { sealed class RegisterState with _$RegisterState { const RegisterState._(); - const factory RegisterState.registered({ - required PlatformInt64 nextS, - }) = RegisterState_Registered; + const factory RegisterState.registered({required PlatformInt64 nextS}) = + RegisterState_Registered; const factory RegisterState.registering() = RegisterState_Registering; const factory RegisterState.failed({ BigInt? retryWait, @@ -5258,9 +7316,7 @@ sealed class RegisterState with _$RegisterState { class RenameMessage { final String newName; - const RenameMessage({ - required this.newName, - }); + const RenameMessage({required this.newName}); @override int get hashCode => newName.hashCode; @@ -5335,10 +7391,7 @@ class ScheduleMode { final int ms; final bool schedule; - const ScheduleMode({ - required this.ms, - required this.schedule, - }); + const ScheduleMode({required this.ms, required this.schedule}); @override int get hashCode => ms.hashCode ^ schedule.hashCode; @@ -5603,9 +7656,9 @@ class SharedPushState { required this.clientSession, }); - static Future<(SharedPushState, ApsWatcher)?> restore( - {required String path}) => - RustLib.instance.api.crateApiApiSharedPushStateRestore(path: path); + static Future<(SharedPushState, ApsWatcher)?> restore({ + required String path, + }) => RustLib.instance.api.crateApiApiSharedPushStateRestore(path: path); @override int get hashCode => @@ -5694,10 +7747,7 @@ class SimplifiedTranscriptPoster { WatchBackground watch; final SimplifiedPoster poster; - SimplifiedTranscriptPoster({ - required this.watch, - required this.poster, - }); + SimplifiedTranscriptPoster({required this.watch, required this.poster}); @override int get hashCode => watch.hashCode ^ poster.hashCode; @@ -5725,9 +7775,7 @@ sealed class StatusKitMessage with _$StatusKitMessage { class StatusKitPersonalConfig { final List allowedModes; - const StatusKitPersonalConfig({ - required this.allowedModes, - }); + const StatusKitPersonalConfig({required this.allowedModes}); @override int get hashCode => allowedModes.hashCode; @@ -5744,10 +7792,7 @@ class SupportAction { final String url; final String button; - const SupportAction({ - required this.url, - required this.button, - }); + const SupportAction({required this.url, required this.button}); @override int get hashCode => url.hashCode ^ button.hashCode; @@ -5766,11 +7811,7 @@ class SupportAlert { final String body; final SupportAction? action; - const SupportAlert({ - required this.title, - required this.body, - this.action, - }); + const SupportAlert({required this.title, required this.body, this.action}); @override int get hashCode => title.hashCode ^ body.hashCode ^ action.hashCode; @@ -5804,9 +7845,7 @@ sealed class SyncStatus with _$SyncStatus { class TeardownSignIn { final String prevtxnid; - const TeardownSignIn({ - required this.prevtxnid, - }); + const TeardownSignIn({required this.prevtxnid}); @override int get hashCode => prevtxnid.hashCode; @@ -5819,17 +7858,7 @@ class TeardownSignIn { prevtxnid == other.prevtxnid; } -enum TextEffect { - big, - small, - shake, - nod, - explode, - ripple, - bloom, - jitter, - ; -} +enum TextEffect { big, small, shake, nod, explode, ripple, bloom, jitter } class TextFlags { final bool bold; @@ -5866,20 +7895,14 @@ class TextFlags { sealed class TextFormat with _$TextFormat { const TextFormat._(); - const factory TextFormat.flags( - TextFlags field0, - ) = TextFormat_Flags; - const factory TextFormat.effect( - TextEffect field0, - ) = TextFormat_Effect; + const factory TextFormat.flags(TextFlags field0) = TextFormat_Flags; + const factory TextFormat.effect(TextEffect field0) = TextFormat_Effect; } class TranscriptDynamicUserData { final String identifier; - const TranscriptDynamicUserData({ - required this.identifier, - }); + const TranscriptDynamicUserData({required this.identifier}); @override int get hashCode => identifier.hashCode; @@ -5951,10 +7974,7 @@ class TypingApp { final String bundleId; final Uint8List icon; - const TypingApp({ - required this.bundleId, - required this.icon, - }); + const TypingApp({required this.bundleId, required this.icon}); @override int get hashCode => bundleId.hashCode ^ icon.hashCode; @@ -6000,10 +8020,7 @@ class UnsendMessage { final String tuuid; final int editPart; - const UnsendMessage({ - required this.tuuid, - required this.editPart, - }); + const UnsendMessage({required this.tuuid, required this.editPart}); @override int get hashCode => tuuid.hashCode ^ editPart.hashCode; @@ -6022,19 +8039,15 @@ sealed class UpdateAccountFinish with _$UpdateAccountFinish { const UpdateAccountFinish._(); const factory UpdateAccountFinish.macOs() = UpdateAccountFinish_MacOS; - const factory UpdateAccountFinish.ios({ - required String url, - }) = UpdateAccountFinish_IOS; + const factory UpdateAccountFinish.ios({required String url}) = + UpdateAccountFinish_IOS; } class UpdateExtensionMessage { final String forUuid; final PartExtension ext; - const UpdateExtensionMessage({ - required this.forUuid, - required this.ext, - }); + const UpdateExtensionMessage({required this.forUuid, required this.ext}); @override int get hashCode => forUuid.hashCode ^ ext.hashCode; @@ -6052,10 +8065,7 @@ class UpdateProfileMessage { final ShareProfileMessage? profile; final bool shareContacts; - const UpdateProfileMessage({ - this.profile, - required this.shareContacts, - }); + const UpdateProfileMessage({this.profile, required this.shareContacts}); @override int get hashCode => profile.hashCode ^ shareContacts.hashCode; diff --git a/lib/src/rust/api/api.freezed.dart b/lib/src/rust/api/api.freezed.dart index 89ea06f302..1e8cb4b87e 100644 --- a/lib/src/rust/api/api.freezed.dart +++ b/lib/src/rust/api/api.freezed.dart @@ -1,5 +1,5 @@ -// coverage:ignore-file // GENERATED CODE - DO NOT MODIFY BY HAND +// coverage:ignore-file // ignore_for_file: type=lint // ignore_for_file: unused_element, deprecated_member_use, deprecated_member_use_from_same_package, use_function_type_syntax_for_parameters, unnecessary_const, avoid_init_to_null, invalid_override_different_default_values_named, prefer_expression_function_bodies, annotate_overrides, invalid_annotation_target, unnecessary_question_mark @@ -9,25020 +9,11313 @@ part of 'api.dart'; // FreezedGenerator // ************************************************************************** +// dart format off T _$identity(T value) => value; - -final _privateConstructorUsedError = UnsupportedError( - 'It seems like you constructed your class using `MyClass._()`. This constructor is only meant to be used by freezed and you are not supposed to need it nor use it.\nPlease check the documentation here for more information: https://github.com/rrousselGit/freezed#adding-getters-and-methods-to-our-models'); - /// @nodoc mixin _$AttachmentType { - Object get field0 => throw _privateConstructorUsedError; - @optionalTypeArgs - TResult when({ - required TResult Function(Uint8List field0) inline, - required TResult Function(MMCSFile field0) mmcs, - }) => - throw _privateConstructorUsedError; - @optionalTypeArgs - TResult? whenOrNull({ - TResult? Function(Uint8List field0)? inline, - TResult? Function(MMCSFile field0)? mmcs, - }) => - throw _privateConstructorUsedError; - @optionalTypeArgs - TResult maybeWhen({ - TResult Function(Uint8List field0)? inline, - TResult Function(MMCSFile field0)? mmcs, - required TResult orElse(), - }) => - throw _privateConstructorUsedError; - @optionalTypeArgs - TResult map({ - required TResult Function(AttachmentType_Inline value) inline, - required TResult Function(AttachmentType_MMCS value) mmcs, - }) => - throw _privateConstructorUsedError; - @optionalTypeArgs - TResult? mapOrNull({ - TResult? Function(AttachmentType_Inline value)? inline, - TResult? Function(AttachmentType_MMCS value)? mmcs, - }) => - throw _privateConstructorUsedError; - @optionalTypeArgs - TResult maybeMap({ - TResult Function(AttachmentType_Inline value)? inline, - TResult Function(AttachmentType_MMCS value)? mmcs, - required TResult orElse(), - }) => - throw _privateConstructorUsedError; -} - -/// @nodoc -abstract class $AttachmentTypeCopyWith<$Res> { - factory $AttachmentTypeCopyWith( - AttachmentType value, $Res Function(AttachmentType) then) = - _$AttachmentTypeCopyWithImpl<$Res, AttachmentType>; -} - -/// @nodoc -class _$AttachmentTypeCopyWithImpl<$Res, $Val extends AttachmentType> - implements $AttachmentTypeCopyWith<$Res> { - _$AttachmentTypeCopyWithImpl(this._value, this._then); - - // ignore: unused_field - final $Val _value; - // ignore: unused_field - final $Res Function($Val) _then; - - /// Create a copy of AttachmentType - /// with the given fields replaced by the non-null parameter values. -} - -/// @nodoc -abstract class _$$AttachmentType_InlineImplCopyWith<$Res> { - factory _$$AttachmentType_InlineImplCopyWith( - _$AttachmentType_InlineImpl value, - $Res Function(_$AttachmentType_InlineImpl) then) = - __$$AttachmentType_InlineImplCopyWithImpl<$Res>; - @useResult - $Res call({Uint8List field0}); -} - -/// @nodoc -class __$$AttachmentType_InlineImplCopyWithImpl<$Res> - extends _$AttachmentTypeCopyWithImpl<$Res, _$AttachmentType_InlineImpl> - implements _$$AttachmentType_InlineImplCopyWith<$Res> { - __$$AttachmentType_InlineImplCopyWithImpl(_$AttachmentType_InlineImpl _value, - $Res Function(_$AttachmentType_InlineImpl) _then) - : super(_value, _then); - - /// Create a copy of AttachmentType - /// with the given fields replaced by the non-null parameter values. - @pragma('vm:prefer-inline') - @override - $Res call({ - Object? field0 = null, - }) { - return _then(_$AttachmentType_InlineImpl( - null == field0 - ? _value.field0 - : field0 // ignore: cast_nullable_to_non_nullable - as Uint8List, - )); - } -} - -/// @nodoc -class _$AttachmentType_InlineImpl extends AttachmentType_Inline { - const _$AttachmentType_InlineImpl(this.field0) : super._(); + Object get field0; - @override - final Uint8List field0; - @override - String toString() { - return 'AttachmentType.inline(field0: $field0)'; - } - @override - bool operator ==(Object other) { - return identical(this, other) || - (other.runtimeType == runtimeType && - other is _$AttachmentType_InlineImpl && - const DeepCollectionEquality().equals(other.field0, field0)); - } +@override +bool operator ==(Object other) { + return identical(this, other) || (other.runtimeType == runtimeType&&other is AttachmentType&&const DeepCollectionEquality().equals(other.field0, field0)); +} - @override - int get hashCode => - Object.hash(runtimeType, const DeepCollectionEquality().hash(field0)); - - /// Create a copy of AttachmentType - /// with the given fields replaced by the non-null parameter values. - @JsonKey(includeFromJson: false, includeToJson: false) - @override - @pragma('vm:prefer-inline') - _$$AttachmentType_InlineImplCopyWith<_$AttachmentType_InlineImpl> - get copyWith => __$$AttachmentType_InlineImplCopyWithImpl< - _$AttachmentType_InlineImpl>(this, _$identity); - - @override - @optionalTypeArgs - TResult when({ - required TResult Function(Uint8List field0) inline, - required TResult Function(MMCSFile field0) mmcs, - }) { - return inline(field0); - } - @override - @optionalTypeArgs - TResult? whenOrNull({ - TResult? Function(Uint8List field0)? inline, - TResult? Function(MMCSFile field0)? mmcs, - }) { - return inline?.call(field0); - } +@override +int get hashCode => Object.hash(runtimeType,const DeepCollectionEquality().hash(field0)); - @override - @optionalTypeArgs - TResult maybeWhen({ - TResult Function(Uint8List field0)? inline, - TResult Function(MMCSFile field0)? mmcs, - required TResult orElse(), - }) { - if (inline != null) { - return inline(field0); - } - return orElse(); - } +@override +String toString() { + return 'AttachmentType(field0: $field0)'; +} - @override - @optionalTypeArgs - TResult map({ - required TResult Function(AttachmentType_Inline value) inline, - required TResult Function(AttachmentType_MMCS value) mmcs, - }) { - return inline(this); - } - @override - @optionalTypeArgs - TResult? mapOrNull({ - TResult? Function(AttachmentType_Inline value)? inline, - TResult? Function(AttachmentType_MMCS value)? mmcs, - }) { - return inline?.call(this); - } +} - @override - @optionalTypeArgs - TResult maybeMap({ - TResult Function(AttachmentType_Inline value)? inline, - TResult Function(AttachmentType_MMCS value)? mmcs, - required TResult orElse(), - }) { - if (inline != null) { - return inline(this); - } - return orElse(); - } +/// @nodoc +class $AttachmentTypeCopyWith<$Res> { +$AttachmentTypeCopyWith(AttachmentType _, $Res Function(AttachmentType) __); } -abstract class AttachmentType_Inline extends AttachmentType { - const factory AttachmentType_Inline(final Uint8List field0) = - _$AttachmentType_InlineImpl; - const AttachmentType_Inline._() : super._(); - @override - Uint8List get field0; +/// Adds pattern-matching-related methods to [AttachmentType]. +extension AttachmentTypePatterns on AttachmentType { +/// A variant of `map` that fallback to returning `orElse`. +/// +/// It is equivalent to doing: +/// ```dart +/// switch (sealedClass) { +/// case final Subclass value: +/// return ...; +/// case _: +/// return orElse(); +/// } +/// ``` + +@optionalTypeArgs TResult maybeMap({TResult Function( AttachmentType_Inline value)? inline,TResult Function( AttachmentType_MMCS value)? mmcs,required TResult orElse(),}){ +final _that = this; +switch (_that) { +case AttachmentType_Inline() when inline != null: +return inline(_that);case AttachmentType_MMCS() when mmcs != null: +return mmcs(_that);case _: + return orElse(); + +} +} +/// A `switch`-like method, using callbacks. +/// +/// Callbacks receives the raw object, upcasted. +/// It is equivalent to doing: +/// ```dart +/// switch (sealedClass) { +/// case final Subclass value: +/// return ...; +/// case final Subclass2 value: +/// return ...; +/// } +/// ``` - /// Create a copy of AttachmentType - /// with the given fields replaced by the non-null parameter values. - @JsonKey(includeFromJson: false, includeToJson: false) - _$$AttachmentType_InlineImplCopyWith<_$AttachmentType_InlineImpl> - get copyWith => throw _privateConstructorUsedError; +@optionalTypeArgs TResult map({required TResult Function( AttachmentType_Inline value) inline,required TResult Function( AttachmentType_MMCS value) mmcs,}){ +final _that = this; +switch (_that) { +case AttachmentType_Inline(): +return inline(_that);case AttachmentType_MMCS(): +return mmcs(_that);} } +/// A variant of `map` that fallback to returning `null`. +/// +/// It is equivalent to doing: +/// ```dart +/// switch (sealedClass) { +/// case final Subclass value: +/// return ...; +/// case _: +/// return null; +/// } +/// ``` + +@optionalTypeArgs TResult? mapOrNull({TResult? Function( AttachmentType_Inline value)? inline,TResult? Function( AttachmentType_MMCS value)? mmcs,}){ +final _that = this; +switch (_that) { +case AttachmentType_Inline() when inline != null: +return inline(_that);case AttachmentType_MMCS() when mmcs != null: +return mmcs(_that);case _: + return null; -/// @nodoc -abstract class _$$AttachmentType_MMCSImplCopyWith<$Res> { - factory _$$AttachmentType_MMCSImplCopyWith(_$AttachmentType_MMCSImpl value, - $Res Function(_$AttachmentType_MMCSImpl) then) = - __$$AttachmentType_MMCSImplCopyWithImpl<$Res>; - @useResult - $Res call({MMCSFile field0}); } +} +/// A variant of `when` that fallback to an `orElse` callback. +/// +/// It is equivalent to doing: +/// ```dart +/// switch (sealedClass) { +/// case Subclass(:final field): +/// return ...; +/// case _: +/// return orElse(); +/// } +/// ``` -/// @nodoc -class __$$AttachmentType_MMCSImplCopyWithImpl<$Res> - extends _$AttachmentTypeCopyWithImpl<$Res, _$AttachmentType_MMCSImpl> - implements _$$AttachmentType_MMCSImplCopyWith<$Res> { - __$$AttachmentType_MMCSImplCopyWithImpl(_$AttachmentType_MMCSImpl _value, - $Res Function(_$AttachmentType_MMCSImpl) _then) - : super(_value, _then); +@optionalTypeArgs TResult maybeWhen({TResult Function( Uint8List field0)? inline,TResult Function( MMCSFile field0)? mmcs,required TResult orElse(),}) {final _that = this; +switch (_that) { +case AttachmentType_Inline() when inline != null: +return inline(_that.field0);case AttachmentType_MMCS() when mmcs != null: +return mmcs(_that.field0);case _: + return orElse(); - /// Create a copy of AttachmentType - /// with the given fields replaced by the non-null parameter values. - @pragma('vm:prefer-inline') - @override - $Res call({ - Object? field0 = null, - }) { - return _then(_$AttachmentType_MMCSImpl( - null == field0 - ? _value.field0 - : field0 // ignore: cast_nullable_to_non_nullable - as MMCSFile, - )); - } } +} +/// A `switch`-like method, using callbacks. +/// +/// As opposed to `map`, this offers destructuring. +/// It is equivalent to doing: +/// ```dart +/// switch (sealedClass) { +/// case Subclass(:final field): +/// return ...; +/// case Subclass2(:final field2): +/// return ...; +/// } +/// ``` -/// @nodoc +@optionalTypeArgs TResult when({required TResult Function( Uint8List field0) inline,required TResult Function( MMCSFile field0) mmcs,}) {final _that = this; +switch (_that) { +case AttachmentType_Inline(): +return inline(_that.field0);case AttachmentType_MMCS(): +return mmcs(_that.field0);} +} +/// A variant of `when` that fallback to returning `null` +/// +/// It is equivalent to doing: +/// ```dart +/// switch (sealedClass) { +/// case Subclass(:final field): +/// return ...; +/// case _: +/// return null; +/// } +/// ``` -class _$AttachmentType_MMCSImpl extends AttachmentType_MMCS { - const _$AttachmentType_MMCSImpl(this.field0) : super._(); +@optionalTypeArgs TResult? whenOrNull({TResult? Function( Uint8List field0)? inline,TResult? Function( MMCSFile field0)? mmcs,}) {final _that = this; +switch (_that) { +case AttachmentType_Inline() when inline != null: +return inline(_that.field0);case AttachmentType_MMCS() when mmcs != null: +return mmcs(_that.field0);case _: + return null; - @override - final MMCSFile field0; +} +} - @override - String toString() { - return 'AttachmentType.mmcs(field0: $field0)'; - } +} - @override - bool operator ==(Object other) { - return identical(this, other) || - (other.runtimeType == runtimeType && - other is _$AttachmentType_MMCSImpl && - (identical(other.field0, field0) || other.field0 == field0)); - } +/// @nodoc - @override - int get hashCode => Object.hash(runtimeType, field0); - - /// Create a copy of AttachmentType - /// with the given fields replaced by the non-null parameter values. - @JsonKey(includeFromJson: false, includeToJson: false) - @override - @pragma('vm:prefer-inline') - _$$AttachmentType_MMCSImplCopyWith<_$AttachmentType_MMCSImpl> get copyWith => - __$$AttachmentType_MMCSImplCopyWithImpl<_$AttachmentType_MMCSImpl>( - this, _$identity); - - @override - @optionalTypeArgs - TResult when({ - required TResult Function(Uint8List field0) inline, - required TResult Function(MMCSFile field0) mmcs, - }) { - return mmcs(field0); - } - @override - @optionalTypeArgs - TResult? whenOrNull({ - TResult? Function(Uint8List field0)? inline, - TResult? Function(MMCSFile field0)? mmcs, - }) { - return mmcs?.call(field0); - } +class AttachmentType_Inline extends AttachmentType { + const AttachmentType_Inline(this.field0): super._(); - @override - @optionalTypeArgs - TResult maybeWhen({ - TResult Function(Uint8List field0)? inline, - TResult Function(MMCSFile field0)? mmcs, - required TResult orElse(), - }) { - if (mmcs != null) { - return mmcs(field0); - } - return orElse(); - } - @override - @optionalTypeArgs - TResult map({ - required TResult Function(AttachmentType_Inline value) inline, - required TResult Function(AttachmentType_MMCS value) mmcs, - }) { - return mmcs(this); - } +@override final Uint8List field0; - @override - @optionalTypeArgs - TResult? mapOrNull({ - TResult? Function(AttachmentType_Inline value)? inline, - TResult? Function(AttachmentType_MMCS value)? mmcs, - }) { - return mmcs?.call(this); - } +/// Create a copy of AttachmentType +/// with the given fields replaced by the non-null parameter values. +@JsonKey(includeFromJson: false, includeToJson: false) +@pragma('vm:prefer-inline') +$AttachmentType_InlineCopyWith get copyWith => _$AttachmentType_InlineCopyWithImpl(this, _$identity); - @override - @optionalTypeArgs - TResult maybeMap({ - TResult Function(AttachmentType_Inline value)? inline, - TResult Function(AttachmentType_MMCS value)? mmcs, - required TResult orElse(), - }) { - if (mmcs != null) { - return mmcs(this); - } - return orElse(); - } + + +@override +bool operator ==(Object other) { + return identical(this, other) || (other.runtimeType == runtimeType&&other is AttachmentType_Inline&&const DeepCollectionEquality().equals(other.field0, field0)); } -abstract class AttachmentType_MMCS extends AttachmentType { - const factory AttachmentType_MMCS(final MMCSFile field0) = - _$AttachmentType_MMCSImpl; - const AttachmentType_MMCS._() : super._(); - @override - MMCSFile get field0; +@override +int get hashCode => Object.hash(runtimeType,const DeepCollectionEquality().hash(field0)); - /// Create a copy of AttachmentType - /// with the given fields replaced by the non-null parameter values. - @JsonKey(includeFromJson: false, includeToJson: false) - _$$AttachmentType_MMCSImplCopyWith<_$AttachmentType_MMCSImpl> get copyWith => - throw _privateConstructorUsedError; +@override +String toString() { + return 'AttachmentType.inline(field0: $field0)'; } -/// @nodoc -mixin _$BalloonLayout { - String get imageSubtitle => throw _privateConstructorUsedError; - String get imageTitle => throw _privateConstructorUsedError; - String get caption => throw _privateConstructorUsedError; - String get secondarySubcaption => throw _privateConstructorUsedError; - String get tertiarySubcaption => throw _privateConstructorUsedError; - String get subcaption => throw _privateConstructorUsedError; - NSDictionaryClass get class_ => throw _privateConstructorUsedError; - @optionalTypeArgs - TResult when({ - required TResult Function( - String imageSubtitle, - String imageTitle, - String caption, - String secondarySubcaption, - String tertiarySubcaption, - String subcaption, - NSDictionaryClass class_) - templateLayout, - }) => - throw _privateConstructorUsedError; - @optionalTypeArgs - TResult? whenOrNull({ - TResult? Function( - String imageSubtitle, - String imageTitle, - String caption, - String secondarySubcaption, - String tertiarySubcaption, - String subcaption, - NSDictionaryClass class_)? - templateLayout, - }) => - throw _privateConstructorUsedError; - @optionalTypeArgs - TResult maybeWhen({ - TResult Function( - String imageSubtitle, - String imageTitle, - String caption, - String secondarySubcaption, - String tertiarySubcaption, - String subcaption, - NSDictionaryClass class_)? - templateLayout, - required TResult orElse(), - }) => - throw _privateConstructorUsedError; - @optionalTypeArgs - TResult map({ - required TResult Function(BalloonLayout_TemplateLayout value) - templateLayout, - }) => - throw _privateConstructorUsedError; - @optionalTypeArgs - TResult? mapOrNull({ - TResult? Function(BalloonLayout_TemplateLayout value)? templateLayout, - }) => - throw _privateConstructorUsedError; - @optionalTypeArgs - TResult maybeMap({ - TResult Function(BalloonLayout_TemplateLayout value)? templateLayout, - required TResult orElse(), - }) => - throw _privateConstructorUsedError; - - /// Create a copy of BalloonLayout - /// with the given fields replaced by the non-null parameter values. - @JsonKey(includeFromJson: false, includeToJson: false) - $BalloonLayoutCopyWith get copyWith => - throw _privateConstructorUsedError; -} - -/// @nodoc -abstract class $BalloonLayoutCopyWith<$Res> { - factory $BalloonLayoutCopyWith( - BalloonLayout value, $Res Function(BalloonLayout) then) = - _$BalloonLayoutCopyWithImpl<$Res, BalloonLayout>; - @useResult - $Res call( - {String imageSubtitle, - String imageTitle, - String caption, - String secondarySubcaption, - String tertiarySubcaption, - String subcaption, - NSDictionaryClass class_}); -} - -/// @nodoc -class _$BalloonLayoutCopyWithImpl<$Res, $Val extends BalloonLayout> - implements $BalloonLayoutCopyWith<$Res> { - _$BalloonLayoutCopyWithImpl(this._value, this._then); - - // ignore: unused_field - final $Val _value; - // ignore: unused_field - final $Res Function($Val) _then; - - /// Create a copy of BalloonLayout - /// with the given fields replaced by the non-null parameter values. - @pragma('vm:prefer-inline') - @override - $Res call({ - Object? imageSubtitle = null, - Object? imageTitle = null, - Object? caption = null, - Object? secondarySubcaption = null, - Object? tertiarySubcaption = null, - Object? subcaption = null, - Object? class_ = null, - }) { - return _then(_value.copyWith( - imageSubtitle: null == imageSubtitle - ? _value.imageSubtitle - : imageSubtitle // ignore: cast_nullable_to_non_nullable - as String, - imageTitle: null == imageTitle - ? _value.imageTitle - : imageTitle // ignore: cast_nullable_to_non_nullable - as String, - caption: null == caption - ? _value.caption - : caption // ignore: cast_nullable_to_non_nullable - as String, - secondarySubcaption: null == secondarySubcaption - ? _value.secondarySubcaption - : secondarySubcaption // ignore: cast_nullable_to_non_nullable - as String, - tertiarySubcaption: null == tertiarySubcaption - ? _value.tertiarySubcaption - : tertiarySubcaption // ignore: cast_nullable_to_non_nullable - as String, - subcaption: null == subcaption - ? _value.subcaption - : subcaption // ignore: cast_nullable_to_non_nullable - as String, - class_: null == class_ - ? _value.class_ - : class_ // ignore: cast_nullable_to_non_nullable - as NSDictionaryClass, - ) as $Val); - } -} -/// @nodoc -abstract class _$$BalloonLayout_TemplateLayoutImplCopyWith<$Res> - implements $BalloonLayoutCopyWith<$Res> { - factory _$$BalloonLayout_TemplateLayoutImplCopyWith( - _$BalloonLayout_TemplateLayoutImpl value, - $Res Function(_$BalloonLayout_TemplateLayoutImpl) then) = - __$$BalloonLayout_TemplateLayoutImplCopyWithImpl<$Res>; - @override - @useResult - $Res call( - {String imageSubtitle, - String imageTitle, - String caption, - String secondarySubcaption, - String tertiarySubcaption, - String subcaption, - NSDictionaryClass class_}); -} - -/// @nodoc -class __$$BalloonLayout_TemplateLayoutImplCopyWithImpl<$Res> - extends _$BalloonLayoutCopyWithImpl<$Res, - _$BalloonLayout_TemplateLayoutImpl> - implements _$$BalloonLayout_TemplateLayoutImplCopyWith<$Res> { - __$$BalloonLayout_TemplateLayoutImplCopyWithImpl( - _$BalloonLayout_TemplateLayoutImpl _value, - $Res Function(_$BalloonLayout_TemplateLayoutImpl) _then) - : super(_value, _then); - - /// Create a copy of BalloonLayout - /// with the given fields replaced by the non-null parameter values. - @pragma('vm:prefer-inline') - @override - $Res call({ - Object? imageSubtitle = null, - Object? imageTitle = null, - Object? caption = null, - Object? secondarySubcaption = null, - Object? tertiarySubcaption = null, - Object? subcaption = null, - Object? class_ = null, - }) { - return _then(_$BalloonLayout_TemplateLayoutImpl( - imageSubtitle: null == imageSubtitle - ? _value.imageSubtitle - : imageSubtitle // ignore: cast_nullable_to_non_nullable - as String, - imageTitle: null == imageTitle - ? _value.imageTitle - : imageTitle // ignore: cast_nullable_to_non_nullable - as String, - caption: null == caption - ? _value.caption - : caption // ignore: cast_nullable_to_non_nullable - as String, - secondarySubcaption: null == secondarySubcaption - ? _value.secondarySubcaption - : secondarySubcaption // ignore: cast_nullable_to_non_nullable - as String, - tertiarySubcaption: null == tertiarySubcaption - ? _value.tertiarySubcaption - : tertiarySubcaption // ignore: cast_nullable_to_non_nullable - as String, - subcaption: null == subcaption - ? _value.subcaption - : subcaption // ignore: cast_nullable_to_non_nullable - as String, - class_: null == class_ - ? _value.class_ - : class_ // ignore: cast_nullable_to_non_nullable - as NSDictionaryClass, - )); - } } /// @nodoc +abstract mixin class $AttachmentType_InlineCopyWith<$Res> implements $AttachmentTypeCopyWith<$Res> { + factory $AttachmentType_InlineCopyWith(AttachmentType_Inline value, $Res Function(AttachmentType_Inline) _then) = _$AttachmentType_InlineCopyWithImpl; +@useResult +$Res call({ + Uint8List field0 +}); -class _$BalloonLayout_TemplateLayoutImpl extends BalloonLayout_TemplateLayout { - const _$BalloonLayout_TemplateLayoutImpl( - {required this.imageSubtitle, - required this.imageTitle, - required this.caption, - required this.secondarySubcaption, - required this.tertiarySubcaption, - required this.subcaption, - required this.class_}) - : super._(); - - @override - final String imageSubtitle; - @override - final String imageTitle; - @override - final String caption; - @override - final String secondarySubcaption; - @override - final String tertiarySubcaption; - @override - final String subcaption; - @override - final NSDictionaryClass class_; - - @override - String toString() { - return 'BalloonLayout.templateLayout(imageSubtitle: $imageSubtitle, imageTitle: $imageTitle, caption: $caption, secondarySubcaption: $secondarySubcaption, tertiarySubcaption: $tertiarySubcaption, subcaption: $subcaption, class_: $class_)'; - } - - @override - bool operator ==(Object other) { - return identical(this, other) || - (other.runtimeType == runtimeType && - other is _$BalloonLayout_TemplateLayoutImpl && - (identical(other.imageSubtitle, imageSubtitle) || - other.imageSubtitle == imageSubtitle) && - (identical(other.imageTitle, imageTitle) || - other.imageTitle == imageTitle) && - (identical(other.caption, caption) || other.caption == caption) && - (identical(other.secondarySubcaption, secondarySubcaption) || - other.secondarySubcaption == secondarySubcaption) && - (identical(other.tertiarySubcaption, tertiarySubcaption) || - other.tertiarySubcaption == tertiarySubcaption) && - (identical(other.subcaption, subcaption) || - other.subcaption == subcaption) && - (identical(other.class_, class_) || other.class_ == class_)); - } - - @override - int get hashCode => Object.hash(runtimeType, imageSubtitle, imageTitle, - caption, secondarySubcaption, tertiarySubcaption, subcaption, class_); - - /// Create a copy of BalloonLayout - /// with the given fields replaced by the non-null parameter values. - @JsonKey(includeFromJson: false, includeToJson: false) - @override - @pragma('vm:prefer-inline') - _$$BalloonLayout_TemplateLayoutImplCopyWith< - _$BalloonLayout_TemplateLayoutImpl> - get copyWith => __$$BalloonLayout_TemplateLayoutImplCopyWithImpl< - _$BalloonLayout_TemplateLayoutImpl>(this, _$identity); - - @override - @optionalTypeArgs - TResult when({ - required TResult Function( - String imageSubtitle, - String imageTitle, - String caption, - String secondarySubcaption, - String tertiarySubcaption, - String subcaption, - NSDictionaryClass class_) - templateLayout, - }) { - return templateLayout(imageSubtitle, imageTitle, caption, - secondarySubcaption, tertiarySubcaption, subcaption, class_); - } - @override - @optionalTypeArgs - TResult? whenOrNull({ - TResult? Function( - String imageSubtitle, - String imageTitle, - String caption, - String secondarySubcaption, - String tertiarySubcaption, - String subcaption, - NSDictionaryClass class_)? - templateLayout, - }) { - return templateLayout?.call(imageSubtitle, imageTitle, caption, - secondarySubcaption, tertiarySubcaption, subcaption, class_); - } - @override - @optionalTypeArgs - TResult maybeWhen({ - TResult Function( - String imageSubtitle, - String imageTitle, - String caption, - String secondarySubcaption, - String tertiarySubcaption, - String subcaption, - NSDictionaryClass class_)? - templateLayout, - required TResult orElse(), - }) { - if (templateLayout != null) { - return templateLayout(imageSubtitle, imageTitle, caption, - secondarySubcaption, tertiarySubcaption, subcaption, class_); - } - return orElse(); - } - @override - @optionalTypeArgs - TResult map({ - required TResult Function(BalloonLayout_TemplateLayout value) - templateLayout, - }) { - return templateLayout(this); - } +} +/// @nodoc +class _$AttachmentType_InlineCopyWithImpl<$Res> + implements $AttachmentType_InlineCopyWith<$Res> { + _$AttachmentType_InlineCopyWithImpl(this._self, this._then); - @override - @optionalTypeArgs - TResult? mapOrNull({ - TResult? Function(BalloonLayout_TemplateLayout value)? templateLayout, - }) { - return templateLayout?.call(this); - } + final AttachmentType_Inline _self; + final $Res Function(AttachmentType_Inline) _then; - @override - @optionalTypeArgs - TResult maybeMap({ - TResult Function(BalloonLayout_TemplateLayout value)? templateLayout, - required TResult orElse(), - }) { - if (templateLayout != null) { - return templateLayout(this); - } - return orElse(); - } +/// Create a copy of AttachmentType +/// with the given fields replaced by the non-null parameter values. +@pragma('vm:prefer-inline') $Res call({Object? field0 = null,}) { + return _then(AttachmentType_Inline( +null == field0 ? _self.field0 : field0 // ignore: cast_nullable_to_non_nullable +as Uint8List, + )); } -abstract class BalloonLayout_TemplateLayout extends BalloonLayout { - const factory BalloonLayout_TemplateLayout( - {required final String imageSubtitle, - required final String imageTitle, - required final String caption, - required final String secondarySubcaption, - required final String tertiarySubcaption, - required final String subcaption, - required final NSDictionaryClass class_}) = - _$BalloonLayout_TemplateLayoutImpl; - const BalloonLayout_TemplateLayout._() : super._(); - - @override - String get imageSubtitle; - @override - String get imageTitle; - @override - String get caption; - @override - String get secondarySubcaption; - @override - String get tertiarySubcaption; - @override - String get subcaption; - @override - NSDictionaryClass get class_; - - /// Create a copy of BalloonLayout - /// with the given fields replaced by the non-null parameter values. - @override - @JsonKey(includeFromJson: false, includeToJson: false) - _$$BalloonLayout_TemplateLayoutImplCopyWith< - _$BalloonLayout_TemplateLayoutImpl> - get copyWith => throw _privateConstructorUsedError; -} -/// @nodoc -mixin _$DeleteTarget { - Object get field0 => throw _privateConstructorUsedError; - @optionalTypeArgs - TResult when({ - required TResult Function(OperatedChat field0) chat, - required TResult Function(List field0) messages, - }) => - throw _privateConstructorUsedError; - @optionalTypeArgs - TResult? whenOrNull({ - TResult? Function(OperatedChat field0)? chat, - TResult? Function(List field0)? messages, - }) => - throw _privateConstructorUsedError; - @optionalTypeArgs - TResult maybeWhen({ - TResult Function(OperatedChat field0)? chat, - TResult Function(List field0)? messages, - required TResult orElse(), - }) => - throw _privateConstructorUsedError; - @optionalTypeArgs - TResult map({ - required TResult Function(DeleteTarget_Chat value) chat, - required TResult Function(DeleteTarget_Messages value) messages, - }) => - throw _privateConstructorUsedError; - @optionalTypeArgs - TResult? mapOrNull({ - TResult? Function(DeleteTarget_Chat value)? chat, - TResult? Function(DeleteTarget_Messages value)? messages, - }) => - throw _privateConstructorUsedError; - @optionalTypeArgs - TResult maybeMap({ - TResult Function(DeleteTarget_Chat value)? chat, - TResult Function(DeleteTarget_Messages value)? messages, - required TResult orElse(), - }) => - throw _privateConstructorUsedError; -} - -/// @nodoc -abstract class $DeleteTargetCopyWith<$Res> { - factory $DeleteTargetCopyWith( - DeleteTarget value, $Res Function(DeleteTarget) then) = - _$DeleteTargetCopyWithImpl<$Res, DeleteTarget>; -} - -/// @nodoc -class _$DeleteTargetCopyWithImpl<$Res, $Val extends DeleteTarget> - implements $DeleteTargetCopyWith<$Res> { - _$DeleteTargetCopyWithImpl(this._value, this._then); - - // ignore: unused_field - final $Val _value; - // ignore: unused_field - final $Res Function($Val) _then; - - /// Create a copy of DeleteTarget - /// with the given fields replaced by the non-null parameter values. -} - -/// @nodoc -abstract class _$$DeleteTarget_ChatImplCopyWith<$Res> { - factory _$$DeleteTarget_ChatImplCopyWith(_$DeleteTarget_ChatImpl value, - $Res Function(_$DeleteTarget_ChatImpl) then) = - __$$DeleteTarget_ChatImplCopyWithImpl<$Res>; - @useResult - $Res call({OperatedChat field0}); -} - -/// @nodoc -class __$$DeleteTarget_ChatImplCopyWithImpl<$Res> - extends _$DeleteTargetCopyWithImpl<$Res, _$DeleteTarget_ChatImpl> - implements _$$DeleteTarget_ChatImplCopyWith<$Res> { - __$$DeleteTarget_ChatImplCopyWithImpl(_$DeleteTarget_ChatImpl _value, - $Res Function(_$DeleteTarget_ChatImpl) _then) - : super(_value, _then); - - /// Create a copy of DeleteTarget - /// with the given fields replaced by the non-null parameter values. - @pragma('vm:prefer-inline') - @override - $Res call({ - Object? field0 = null, - }) { - return _then(_$DeleteTarget_ChatImpl( - null == field0 - ? _value.field0 - : field0 // ignore: cast_nullable_to_non_nullable - as OperatedChat, - )); - } } /// @nodoc -class _$DeleteTarget_ChatImpl extends DeleteTarget_Chat { - const _$DeleteTarget_ChatImpl(this.field0) : super._(); - @override - final OperatedChat field0; +class AttachmentType_MMCS extends AttachmentType { + const AttachmentType_MMCS(this.field0): super._(); - @override - String toString() { - return 'DeleteTarget.chat(field0: $field0)'; - } - @override - bool operator ==(Object other) { - return identical(this, other) || - (other.runtimeType == runtimeType && - other is _$DeleteTarget_ChatImpl && - (identical(other.field0, field0) || other.field0 == field0)); - } +@override final MMCSFile field0; - @override - int get hashCode => Object.hash(runtimeType, field0); - - /// Create a copy of DeleteTarget - /// with the given fields replaced by the non-null parameter values. - @JsonKey(includeFromJson: false, includeToJson: false) - @override - @pragma('vm:prefer-inline') - _$$DeleteTarget_ChatImplCopyWith<_$DeleteTarget_ChatImpl> get copyWith => - __$$DeleteTarget_ChatImplCopyWithImpl<_$DeleteTarget_ChatImpl>( - this, _$identity); - - @override - @optionalTypeArgs - TResult when({ - required TResult Function(OperatedChat field0) chat, - required TResult Function(List field0) messages, - }) { - return chat(field0); - } +/// Create a copy of AttachmentType +/// with the given fields replaced by the non-null parameter values. +@JsonKey(includeFromJson: false, includeToJson: false) +@pragma('vm:prefer-inline') +$AttachmentType_MMCSCopyWith get copyWith => _$AttachmentType_MMCSCopyWithImpl(this, _$identity); - @override - @optionalTypeArgs - TResult? whenOrNull({ - TResult? Function(OperatedChat field0)? chat, - TResult? Function(List field0)? messages, - }) { - return chat?.call(field0); - } - @override - @optionalTypeArgs - TResult maybeWhen({ - TResult Function(OperatedChat field0)? chat, - TResult Function(List field0)? messages, - required TResult orElse(), - }) { - if (chat != null) { - return chat(field0); - } - return orElse(); - } - @override - @optionalTypeArgs - TResult map({ - required TResult Function(DeleteTarget_Chat value) chat, - required TResult Function(DeleteTarget_Messages value) messages, - }) { - return chat(this); - } +@override +bool operator ==(Object other) { + return identical(this, other) || (other.runtimeType == runtimeType&&other is AttachmentType_MMCS&&(identical(other.field0, field0) || other.field0 == field0)); +} - @override - @optionalTypeArgs - TResult? mapOrNull({ - TResult? Function(DeleteTarget_Chat value)? chat, - TResult? Function(DeleteTarget_Messages value)? messages, - }) { - return chat?.call(this); - } - @override - @optionalTypeArgs - TResult maybeMap({ - TResult Function(DeleteTarget_Chat value)? chat, - TResult Function(DeleteTarget_Messages value)? messages, - required TResult orElse(), - }) { - if (chat != null) { - return chat(this); - } - return orElse(); - } +@override +int get hashCode => Object.hash(runtimeType,field0); + +@override +String toString() { + return 'AttachmentType.mmcs(field0: $field0)'; } -abstract class DeleteTarget_Chat extends DeleteTarget { - const factory DeleteTarget_Chat(final OperatedChat field0) = - _$DeleteTarget_ChatImpl; - const DeleteTarget_Chat._() : super._(); - - @override - OperatedChat get field0; - - /// Create a copy of DeleteTarget - /// with the given fields replaced by the non-null parameter values. - @JsonKey(includeFromJson: false, includeToJson: false) - _$$DeleteTarget_ChatImplCopyWith<_$DeleteTarget_ChatImpl> get copyWith => - throw _privateConstructorUsedError; -} - -/// @nodoc -abstract class _$$DeleteTarget_MessagesImplCopyWith<$Res> { - factory _$$DeleteTarget_MessagesImplCopyWith( - _$DeleteTarget_MessagesImpl value, - $Res Function(_$DeleteTarget_MessagesImpl) then) = - __$$DeleteTarget_MessagesImplCopyWithImpl<$Res>; - @useResult - $Res call({List field0}); -} - -/// @nodoc -class __$$DeleteTarget_MessagesImplCopyWithImpl<$Res> - extends _$DeleteTargetCopyWithImpl<$Res, _$DeleteTarget_MessagesImpl> - implements _$$DeleteTarget_MessagesImplCopyWith<$Res> { - __$$DeleteTarget_MessagesImplCopyWithImpl(_$DeleteTarget_MessagesImpl _value, - $Res Function(_$DeleteTarget_MessagesImpl) _then) - : super(_value, _then); - - /// Create a copy of DeleteTarget - /// with the given fields replaced by the non-null parameter values. - @pragma('vm:prefer-inline') - @override - $Res call({ - Object? field0 = null, - }) { - return _then(_$DeleteTarget_MessagesImpl( - null == field0 - ? _value._field0 - : field0 // ignore: cast_nullable_to_non_nullable - as List, - )); - } + } /// @nodoc +abstract mixin class $AttachmentType_MMCSCopyWith<$Res> implements $AttachmentTypeCopyWith<$Res> { + factory $AttachmentType_MMCSCopyWith(AttachmentType_MMCS value, $Res Function(AttachmentType_MMCS) _then) = _$AttachmentType_MMCSCopyWithImpl; +@useResult +$Res call({ + MMCSFile field0 +}); -class _$DeleteTarget_MessagesImpl extends DeleteTarget_Messages { - const _$DeleteTarget_MessagesImpl(final List field0) - : _field0 = field0, - super._(); - final List _field0; - @override - List get field0 { - if (_field0 is EqualUnmodifiableListView) return _field0; - // ignore: implicit_dynamic_type - return EqualUnmodifiableListView(_field0); - } - @override - String toString() { - return 'DeleteTarget.messages(field0: $field0)'; - } - @override - bool operator ==(Object other) { - return identical(this, other) || - (other.runtimeType == runtimeType && - other is _$DeleteTarget_MessagesImpl && - const DeepCollectionEquality().equals(other._field0, _field0)); - } +} +/// @nodoc +class _$AttachmentType_MMCSCopyWithImpl<$Res> + implements $AttachmentType_MMCSCopyWith<$Res> { + _$AttachmentType_MMCSCopyWithImpl(this._self, this._then); - @override - int get hashCode => - Object.hash(runtimeType, const DeepCollectionEquality().hash(_field0)); - - /// Create a copy of DeleteTarget - /// with the given fields replaced by the non-null parameter values. - @JsonKey(includeFromJson: false, includeToJson: false) - @override - @pragma('vm:prefer-inline') - _$$DeleteTarget_MessagesImplCopyWith<_$DeleteTarget_MessagesImpl> - get copyWith => __$$DeleteTarget_MessagesImplCopyWithImpl< - _$DeleteTarget_MessagesImpl>(this, _$identity); - - @override - @optionalTypeArgs - TResult when({ - required TResult Function(OperatedChat field0) chat, - required TResult Function(List field0) messages, - }) { - return messages(field0); - } + final AttachmentType_MMCS _self; + final $Res Function(AttachmentType_MMCS) _then; - @override - @optionalTypeArgs - TResult? whenOrNull({ - TResult? Function(OperatedChat field0)? chat, - TResult? Function(List field0)? messages, - }) { - return messages?.call(field0); - } +/// Create a copy of AttachmentType +/// with the given fields replaced by the non-null parameter values. +@pragma('vm:prefer-inline') $Res call({Object? field0 = null,}) { + return _then(AttachmentType_MMCS( +null == field0 ? _self.field0 : field0 // ignore: cast_nullable_to_non_nullable +as MMCSFile, + )); +} - @override - @optionalTypeArgs - TResult maybeWhen({ - TResult Function(OperatedChat field0)? chat, - TResult Function(List field0)? messages, - required TResult orElse(), - }) { - if (messages != null) { - return messages(field0); - } - return orElse(); - } - @override - @optionalTypeArgs - TResult map({ - required TResult Function(DeleteTarget_Chat value) chat, - required TResult Function(DeleteTarget_Messages value) messages, - }) { - return messages(this); - } +} - @override - @optionalTypeArgs - TResult? mapOrNull({ - TResult? Function(DeleteTarget_Chat value)? chat, - TResult? Function(DeleteTarget_Messages value)? messages, - }) { - return messages?.call(this); - } +/// @nodoc +mixin _$BalloonLayout { - @override - @optionalTypeArgs - TResult maybeMap({ - TResult Function(DeleteTarget_Chat value)? chat, - TResult Function(DeleteTarget_Messages value)? messages, - required TResult orElse(), - }) { - if (messages != null) { - return messages(this); - } - return orElse(); - } -} + String get imageSubtitle; String get imageTitle; String get caption; String get secondarySubcaption; String get tertiarySubcaption; String get subcaption; NSDictionaryClass get class_; +/// Create a copy of BalloonLayout +/// with the given fields replaced by the non-null parameter values. +@JsonKey(includeFromJson: false, includeToJson: false) +@pragma('vm:prefer-inline') +$BalloonLayoutCopyWith get copyWith => _$BalloonLayoutCopyWithImpl(this as BalloonLayout, _$identity); -abstract class DeleteTarget_Messages extends DeleteTarget { - const factory DeleteTarget_Messages(final List field0) = - _$DeleteTarget_MessagesImpl; - const DeleteTarget_Messages._() : super._(); - @override - List get field0; - /// Create a copy of DeleteTarget - /// with the given fields replaced by the non-null parameter values. - @JsonKey(includeFromJson: false, includeToJson: false) - _$$DeleteTarget_MessagesImplCopyWith<_$DeleteTarget_MessagesImpl> - get copyWith => throw _privateConstructorUsedError; +@override +bool operator ==(Object other) { + return identical(this, other) || (other.runtimeType == runtimeType&&other is BalloonLayout&&(identical(other.imageSubtitle, imageSubtitle) || other.imageSubtitle == imageSubtitle)&&(identical(other.imageTitle, imageTitle) || other.imageTitle == imageTitle)&&(identical(other.caption, caption) || other.caption == caption)&&(identical(other.secondarySubcaption, secondarySubcaption) || other.secondarySubcaption == secondarySubcaption)&&(identical(other.tertiarySubcaption, tertiarySubcaption) || other.tertiarySubcaption == tertiarySubcaption)&&(identical(other.subcaption, subcaption) || other.subcaption == subcaption)&&(identical(other.class_, class_) || other.class_ == class_)); } -/// @nodoc -mixin _$FTMessage { - @optionalTypeArgs - TResult when({ - required TResult Function(LetMeInRequest field0) letMeInRequest, - required TResult Function(String guid) linkChanged, - required TResult Function( - String guid, BigInt participant, String handle, bool ring) - joinEvent, - required TResult Function(String guid, Set members, bool ring) - addMembers, - required TResult Function(String guid, Set members) removeMembers, - required TResult Function(String guid, BigInt participant, String handle) - leaveEvent, - required TResult Function(String guid) ring, - required TResult Function(String guid) decline, - required TResult Function(String guid) respondedElsewhere, - }) => - throw _privateConstructorUsedError; - @optionalTypeArgs - TResult? whenOrNull({ - TResult? Function(LetMeInRequest field0)? letMeInRequest, - TResult? Function(String guid)? linkChanged, - TResult? Function( - String guid, BigInt participant, String handle, bool ring)? - joinEvent, - TResult? Function(String guid, Set members, bool ring)? - addMembers, - TResult? Function(String guid, Set members)? removeMembers, - TResult? Function(String guid, BigInt participant, String handle)? - leaveEvent, - TResult? Function(String guid)? ring, - TResult? Function(String guid)? decline, - TResult? Function(String guid)? respondedElsewhere, - }) => - throw _privateConstructorUsedError; - @optionalTypeArgs - TResult maybeWhen({ - TResult Function(LetMeInRequest field0)? letMeInRequest, - TResult Function(String guid)? linkChanged, - TResult Function(String guid, BigInt participant, String handle, bool ring)? - joinEvent, - TResult Function(String guid, Set members, bool ring)? addMembers, - TResult Function(String guid, Set members)? removeMembers, - TResult Function(String guid, BigInt participant, String handle)? - leaveEvent, - TResult Function(String guid)? ring, - TResult Function(String guid)? decline, - TResult Function(String guid)? respondedElsewhere, - required TResult orElse(), - }) => - throw _privateConstructorUsedError; - @optionalTypeArgs - TResult map({ - required TResult Function(FTMessage_LetMeInRequest value) letMeInRequest, - required TResult Function(FTMessage_LinkChanged value) linkChanged, - required TResult Function(FTMessage_JoinEvent value) joinEvent, - required TResult Function(FTMessage_AddMembers value) addMembers, - required TResult Function(FTMessage_RemoveMembers value) removeMembers, - required TResult Function(FTMessage_LeaveEvent value) leaveEvent, - required TResult Function(FTMessage_Ring value) ring, - required TResult Function(FTMessage_Decline value) decline, - required TResult Function(FTMessage_RespondedElsewhere value) - respondedElsewhere, - }) => - throw _privateConstructorUsedError; - @optionalTypeArgs - TResult? mapOrNull({ - TResult? Function(FTMessage_LetMeInRequest value)? letMeInRequest, - TResult? Function(FTMessage_LinkChanged value)? linkChanged, - TResult? Function(FTMessage_JoinEvent value)? joinEvent, - TResult? Function(FTMessage_AddMembers value)? addMembers, - TResult? Function(FTMessage_RemoveMembers value)? removeMembers, - TResult? Function(FTMessage_LeaveEvent value)? leaveEvent, - TResult? Function(FTMessage_Ring value)? ring, - TResult? Function(FTMessage_Decline value)? decline, - TResult? Function(FTMessage_RespondedElsewhere value)? respondedElsewhere, - }) => - throw _privateConstructorUsedError; - @optionalTypeArgs - TResult maybeMap({ - TResult Function(FTMessage_LetMeInRequest value)? letMeInRequest, - TResult Function(FTMessage_LinkChanged value)? linkChanged, - TResult Function(FTMessage_JoinEvent value)? joinEvent, - TResult Function(FTMessage_AddMembers value)? addMembers, - TResult Function(FTMessage_RemoveMembers value)? removeMembers, - TResult Function(FTMessage_LeaveEvent value)? leaveEvent, - TResult Function(FTMessage_Ring value)? ring, - TResult Function(FTMessage_Decline value)? decline, - TResult Function(FTMessage_RespondedElsewhere value)? respondedElsewhere, - required TResult orElse(), - }) => - throw _privateConstructorUsedError; -} - -/// @nodoc -abstract class $FTMessageCopyWith<$Res> { - factory $FTMessageCopyWith(FTMessage value, $Res Function(FTMessage) then) = - _$FTMessageCopyWithImpl<$Res, FTMessage>; -} - -/// @nodoc -class _$FTMessageCopyWithImpl<$Res, $Val extends FTMessage> - implements $FTMessageCopyWith<$Res> { - _$FTMessageCopyWithImpl(this._value, this._then); - - // ignore: unused_field - final $Val _value; - // ignore: unused_field - final $Res Function($Val) _then; - - /// Create a copy of FTMessage - /// with the given fields replaced by the non-null parameter values. -} - -/// @nodoc -abstract class _$$FTMessage_LetMeInRequestImplCopyWith<$Res> { - factory _$$FTMessage_LetMeInRequestImplCopyWith( - _$FTMessage_LetMeInRequestImpl value, - $Res Function(_$FTMessage_LetMeInRequestImpl) then) = - __$$FTMessage_LetMeInRequestImplCopyWithImpl<$Res>; - @useResult - $Res call({LetMeInRequest field0}); -} - -/// @nodoc -class __$$FTMessage_LetMeInRequestImplCopyWithImpl<$Res> - extends _$FTMessageCopyWithImpl<$Res, _$FTMessage_LetMeInRequestImpl> - implements _$$FTMessage_LetMeInRequestImplCopyWith<$Res> { - __$$FTMessage_LetMeInRequestImplCopyWithImpl( - _$FTMessage_LetMeInRequestImpl _value, - $Res Function(_$FTMessage_LetMeInRequestImpl) _then) - : super(_value, _then); - - /// Create a copy of FTMessage - /// with the given fields replaced by the non-null parameter values. - @pragma('vm:prefer-inline') - @override - $Res call({ - Object? field0 = null, - }) { - return _then(_$FTMessage_LetMeInRequestImpl( - null == field0 - ? _value.field0 - : field0 // ignore: cast_nullable_to_non_nullable - as LetMeInRequest, - )); - } -} -/// @nodoc +@override +int get hashCode => Object.hash(runtimeType,imageSubtitle,imageTitle,caption,secondarySubcaption,tertiarySubcaption,subcaption,class_); -class _$FTMessage_LetMeInRequestImpl extends FTMessage_LetMeInRequest { - const _$FTMessage_LetMeInRequestImpl(this.field0) : super._(); +@override +String toString() { + return 'BalloonLayout(imageSubtitle: $imageSubtitle, imageTitle: $imageTitle, caption: $caption, secondarySubcaption: $secondarySubcaption, tertiarySubcaption: $tertiarySubcaption, subcaption: $subcaption, class_: $class_)'; +} - @override - final LetMeInRequest field0; - @override - String toString() { - return 'FTMessage.letMeInRequest(field0: $field0)'; - } +} - @override - bool operator ==(Object other) { - return identical(this, other) || - (other.runtimeType == runtimeType && - other is _$FTMessage_LetMeInRequestImpl && - (identical(other.field0, field0) || other.field0 == field0)); - } +/// @nodoc +abstract mixin class $BalloonLayoutCopyWith<$Res> { + factory $BalloonLayoutCopyWith(BalloonLayout value, $Res Function(BalloonLayout) _then) = _$BalloonLayoutCopyWithImpl; +@useResult +$Res call({ + String imageSubtitle, String imageTitle, String caption, String secondarySubcaption, String tertiarySubcaption, String subcaption, NSDictionaryClass class_ +}); - @override - int get hashCode => Object.hash(runtimeType, field0); - - /// Create a copy of FTMessage - /// with the given fields replaced by the non-null parameter values. - @JsonKey(includeFromJson: false, includeToJson: false) - @override - @pragma('vm:prefer-inline') - _$$FTMessage_LetMeInRequestImplCopyWith<_$FTMessage_LetMeInRequestImpl> - get copyWith => __$$FTMessage_LetMeInRequestImplCopyWithImpl< - _$FTMessage_LetMeInRequestImpl>(this, _$identity); - - @override - @optionalTypeArgs - TResult when({ - required TResult Function(LetMeInRequest field0) letMeInRequest, - required TResult Function(String guid) linkChanged, - required TResult Function( - String guid, BigInt participant, String handle, bool ring) - joinEvent, - required TResult Function(String guid, Set members, bool ring) - addMembers, - required TResult Function(String guid, Set members) removeMembers, - required TResult Function(String guid, BigInt participant, String handle) - leaveEvent, - required TResult Function(String guid) ring, - required TResult Function(String guid) decline, - required TResult Function(String guid) respondedElsewhere, - }) { - return letMeInRequest(field0); - } - @override - @optionalTypeArgs - TResult? whenOrNull({ - TResult? Function(LetMeInRequest field0)? letMeInRequest, - TResult? Function(String guid)? linkChanged, - TResult? Function( - String guid, BigInt participant, String handle, bool ring)? - joinEvent, - TResult? Function(String guid, Set members, bool ring)? - addMembers, - TResult? Function(String guid, Set members)? removeMembers, - TResult? Function(String guid, BigInt participant, String handle)? - leaveEvent, - TResult? Function(String guid)? ring, - TResult? Function(String guid)? decline, - TResult? Function(String guid)? respondedElsewhere, - }) { - return letMeInRequest?.call(field0); - } - @override - @optionalTypeArgs - TResult maybeWhen({ - TResult Function(LetMeInRequest field0)? letMeInRequest, - TResult Function(String guid)? linkChanged, - TResult Function(String guid, BigInt participant, String handle, bool ring)? - joinEvent, - TResult Function(String guid, Set members, bool ring)? addMembers, - TResult Function(String guid, Set members)? removeMembers, - TResult Function(String guid, BigInt participant, String handle)? - leaveEvent, - TResult Function(String guid)? ring, - TResult Function(String guid)? decline, - TResult Function(String guid)? respondedElsewhere, - required TResult orElse(), - }) { - if (letMeInRequest != null) { - return letMeInRequest(field0); - } - return orElse(); - } - @override - @optionalTypeArgs - TResult map({ - required TResult Function(FTMessage_LetMeInRequest value) letMeInRequest, - required TResult Function(FTMessage_LinkChanged value) linkChanged, - required TResult Function(FTMessage_JoinEvent value) joinEvent, - required TResult Function(FTMessage_AddMembers value) addMembers, - required TResult Function(FTMessage_RemoveMembers value) removeMembers, - required TResult Function(FTMessage_LeaveEvent value) leaveEvent, - required TResult Function(FTMessage_Ring value) ring, - required TResult Function(FTMessage_Decline value) decline, - required TResult Function(FTMessage_RespondedElsewhere value) - respondedElsewhere, - }) { - return letMeInRequest(this); - } +} +/// @nodoc +class _$BalloonLayoutCopyWithImpl<$Res> + implements $BalloonLayoutCopyWith<$Res> { + _$BalloonLayoutCopyWithImpl(this._self, this._then); + + final BalloonLayout _self; + final $Res Function(BalloonLayout) _then; + +/// Create a copy of BalloonLayout +/// with the given fields replaced by the non-null parameter values. +@pragma('vm:prefer-inline') @override $Res call({Object? imageSubtitle = null,Object? imageTitle = null,Object? caption = null,Object? secondarySubcaption = null,Object? tertiarySubcaption = null,Object? subcaption = null,Object? class_ = null,}) { + return _then(_self.copyWith( +imageSubtitle: null == imageSubtitle ? _self.imageSubtitle : imageSubtitle // ignore: cast_nullable_to_non_nullable +as String,imageTitle: null == imageTitle ? _self.imageTitle : imageTitle // ignore: cast_nullable_to_non_nullable +as String,caption: null == caption ? _self.caption : caption // ignore: cast_nullable_to_non_nullable +as String,secondarySubcaption: null == secondarySubcaption ? _self.secondarySubcaption : secondarySubcaption // ignore: cast_nullable_to_non_nullable +as String,tertiarySubcaption: null == tertiarySubcaption ? _self.tertiarySubcaption : tertiarySubcaption // ignore: cast_nullable_to_non_nullable +as String,subcaption: null == subcaption ? _self.subcaption : subcaption // ignore: cast_nullable_to_non_nullable +as String,class_: null == class_ ? _self.class_ : class_ // ignore: cast_nullable_to_non_nullable +as NSDictionaryClass, + )); +} + +} + + +/// Adds pattern-matching-related methods to [BalloonLayout]. +extension BalloonLayoutPatterns on BalloonLayout { +/// A variant of `map` that fallback to returning `orElse`. +/// +/// It is equivalent to doing: +/// ```dart +/// switch (sealedClass) { +/// case final Subclass value: +/// return ...; +/// case _: +/// return orElse(); +/// } +/// ``` + +@optionalTypeArgs TResult maybeMap({TResult Function( BalloonLayout_TemplateLayout value)? templateLayout,required TResult orElse(),}){ +final _that = this; +switch (_that) { +case BalloonLayout_TemplateLayout() when templateLayout != null: +return templateLayout(_that);case _: + return orElse(); + +} +} +/// A `switch`-like method, using callbacks. +/// +/// Callbacks receives the raw object, upcasted. +/// It is equivalent to doing: +/// ```dart +/// switch (sealedClass) { +/// case final Subclass value: +/// return ...; +/// case final Subclass2 value: +/// return ...; +/// } +/// ``` + +@optionalTypeArgs TResult map({required TResult Function( BalloonLayout_TemplateLayout value) templateLayout,}){ +final _that = this; +switch (_that) { +case BalloonLayout_TemplateLayout(): +return templateLayout(_that);} +} +/// A variant of `map` that fallback to returning `null`. +/// +/// It is equivalent to doing: +/// ```dart +/// switch (sealedClass) { +/// case final Subclass value: +/// return ...; +/// case _: +/// return null; +/// } +/// ``` + +@optionalTypeArgs TResult? mapOrNull({TResult? Function( BalloonLayout_TemplateLayout value)? templateLayout,}){ +final _that = this; +switch (_that) { +case BalloonLayout_TemplateLayout() when templateLayout != null: +return templateLayout(_that);case _: + return null; + +} +} +/// A variant of `when` that fallback to an `orElse` callback. +/// +/// It is equivalent to doing: +/// ```dart +/// switch (sealedClass) { +/// case Subclass(:final field): +/// return ...; +/// case _: +/// return orElse(); +/// } +/// ``` - @override - @optionalTypeArgs - TResult? mapOrNull({ - TResult? Function(FTMessage_LetMeInRequest value)? letMeInRequest, - TResult? Function(FTMessage_LinkChanged value)? linkChanged, - TResult? Function(FTMessage_JoinEvent value)? joinEvent, - TResult? Function(FTMessage_AddMembers value)? addMembers, - TResult? Function(FTMessage_RemoveMembers value)? removeMembers, - TResult? Function(FTMessage_LeaveEvent value)? leaveEvent, - TResult? Function(FTMessage_Ring value)? ring, - TResult? Function(FTMessage_Decline value)? decline, - TResult? Function(FTMessage_RespondedElsewhere value)? respondedElsewhere, - }) { - return letMeInRequest?.call(this); - } +@optionalTypeArgs TResult maybeWhen({TResult Function( String imageSubtitle, String imageTitle, String caption, String secondarySubcaption, String tertiarySubcaption, String subcaption, NSDictionaryClass class_)? templateLayout,required TResult orElse(),}) {final _that = this; +switch (_that) { +case BalloonLayout_TemplateLayout() when templateLayout != null: +return templateLayout(_that.imageSubtitle,_that.imageTitle,_that.caption,_that.secondarySubcaption,_that.tertiarySubcaption,_that.subcaption,_that.class_);case _: + return orElse(); - @override - @optionalTypeArgs - TResult maybeMap({ - TResult Function(FTMessage_LetMeInRequest value)? letMeInRequest, - TResult Function(FTMessage_LinkChanged value)? linkChanged, - TResult Function(FTMessage_JoinEvent value)? joinEvent, - TResult Function(FTMessage_AddMembers value)? addMembers, - TResult Function(FTMessage_RemoveMembers value)? removeMembers, - TResult Function(FTMessage_LeaveEvent value)? leaveEvent, - TResult Function(FTMessage_Ring value)? ring, - TResult Function(FTMessage_Decline value)? decline, - TResult Function(FTMessage_RespondedElsewhere value)? respondedElsewhere, - required TResult orElse(), - }) { - if (letMeInRequest != null) { - return letMeInRequest(this); - } - return orElse(); - } } +} +/// A `switch`-like method, using callbacks. +/// +/// As opposed to `map`, this offers destructuring. +/// It is equivalent to doing: +/// ```dart +/// switch (sealedClass) { +/// case Subclass(:final field): +/// return ...; +/// case Subclass2(:final field2): +/// return ...; +/// } +/// ``` -abstract class FTMessage_LetMeInRequest extends FTMessage { - const factory FTMessage_LetMeInRequest(final LetMeInRequest field0) = - _$FTMessage_LetMeInRequestImpl; - const FTMessage_LetMeInRequest._() : super._(); +@optionalTypeArgs TResult when({required TResult Function( String imageSubtitle, String imageTitle, String caption, String secondarySubcaption, String tertiarySubcaption, String subcaption, NSDictionaryClass class_) templateLayout,}) {final _that = this; +switch (_that) { +case BalloonLayout_TemplateLayout(): +return templateLayout(_that.imageSubtitle,_that.imageTitle,_that.caption,_that.secondarySubcaption,_that.tertiarySubcaption,_that.subcaption,_that.class_);} +} +/// A variant of `when` that fallback to returning `null` +/// +/// It is equivalent to doing: +/// ```dart +/// switch (sealedClass) { +/// case Subclass(:final field): +/// return ...; +/// case _: +/// return null; +/// } +/// ``` - LetMeInRequest get field0; +@optionalTypeArgs TResult? whenOrNull({TResult? Function( String imageSubtitle, String imageTitle, String caption, String secondarySubcaption, String tertiarySubcaption, String subcaption, NSDictionaryClass class_)? templateLayout,}) {final _that = this; +switch (_that) { +case BalloonLayout_TemplateLayout() when templateLayout != null: +return templateLayout(_that.imageSubtitle,_that.imageTitle,_that.caption,_that.secondarySubcaption,_that.tertiarySubcaption,_that.subcaption,_that.class_);case _: + return null; - /// Create a copy of FTMessage - /// with the given fields replaced by the non-null parameter values. - @JsonKey(includeFromJson: false, includeToJson: false) - _$$FTMessage_LetMeInRequestImplCopyWith<_$FTMessage_LetMeInRequestImpl> - get copyWith => throw _privateConstructorUsedError; } - -/// @nodoc -abstract class _$$FTMessage_LinkChangedImplCopyWith<$Res> { - factory _$$FTMessage_LinkChangedImplCopyWith( - _$FTMessage_LinkChangedImpl value, - $Res Function(_$FTMessage_LinkChangedImpl) then) = - __$$FTMessage_LinkChangedImplCopyWithImpl<$Res>; - @useResult - $Res call({String guid}); } -/// @nodoc -class __$$FTMessage_LinkChangedImplCopyWithImpl<$Res> - extends _$FTMessageCopyWithImpl<$Res, _$FTMessage_LinkChangedImpl> - implements _$$FTMessage_LinkChangedImplCopyWith<$Res> { - __$$FTMessage_LinkChangedImplCopyWithImpl(_$FTMessage_LinkChangedImpl _value, - $Res Function(_$FTMessage_LinkChangedImpl) _then) - : super(_value, _then); - - /// Create a copy of FTMessage - /// with the given fields replaced by the non-null parameter values. - @pragma('vm:prefer-inline') - @override - $Res call({ - Object? guid = null, - }) { - return _then(_$FTMessage_LinkChangedImpl( - guid: null == guid - ? _value.guid - : guid // ignore: cast_nullable_to_non_nullable - as String, - )); - } } /// @nodoc -class _$FTMessage_LinkChangedImpl extends FTMessage_LinkChanged { - const _$FTMessage_LinkChangedImpl({required this.guid}) : super._(); - @override - final String guid; +class BalloonLayout_TemplateLayout extends BalloonLayout { + const BalloonLayout_TemplateLayout({required this.imageSubtitle, required this.imageTitle, required this.caption, required this.secondarySubcaption, required this.tertiarySubcaption, required this.subcaption, required this.class_}): super._(); - @override - String toString() { - return 'FTMessage.linkChanged(guid: $guid)'; - } - @override - bool operator ==(Object other) { - return identical(this, other) || - (other.runtimeType == runtimeType && - other is _$FTMessage_LinkChangedImpl && - (identical(other.guid, guid) || other.guid == guid)); - } +@override final String imageSubtitle; +@override final String imageTitle; +@override final String caption; +@override final String secondarySubcaption; +@override final String tertiarySubcaption; +@override final String subcaption; +@override final NSDictionaryClass class_; - @override - int get hashCode => Object.hash(runtimeType, guid); - - /// Create a copy of FTMessage - /// with the given fields replaced by the non-null parameter values. - @JsonKey(includeFromJson: false, includeToJson: false) - @override - @pragma('vm:prefer-inline') - _$$FTMessage_LinkChangedImplCopyWith<_$FTMessage_LinkChangedImpl> - get copyWith => __$$FTMessage_LinkChangedImplCopyWithImpl< - _$FTMessage_LinkChangedImpl>(this, _$identity); - - @override - @optionalTypeArgs - TResult when({ - required TResult Function(LetMeInRequest field0) letMeInRequest, - required TResult Function(String guid) linkChanged, - required TResult Function( - String guid, BigInt participant, String handle, bool ring) - joinEvent, - required TResult Function(String guid, Set members, bool ring) - addMembers, - required TResult Function(String guid, Set members) removeMembers, - required TResult Function(String guid, BigInt participant, String handle) - leaveEvent, - required TResult Function(String guid) ring, - required TResult Function(String guid) decline, - required TResult Function(String guid) respondedElsewhere, - }) { - return linkChanged(guid); - } +/// Create a copy of BalloonLayout +/// with the given fields replaced by the non-null parameter values. +@override @JsonKey(includeFromJson: false, includeToJson: false) +@pragma('vm:prefer-inline') +$BalloonLayout_TemplateLayoutCopyWith get copyWith => _$BalloonLayout_TemplateLayoutCopyWithImpl(this, _$identity); - @override - @optionalTypeArgs - TResult? whenOrNull({ - TResult? Function(LetMeInRequest field0)? letMeInRequest, - TResult? Function(String guid)? linkChanged, - TResult? Function( - String guid, BigInt participant, String handle, bool ring)? - joinEvent, - TResult? Function(String guid, Set members, bool ring)? - addMembers, - TResult? Function(String guid, Set members)? removeMembers, - TResult? Function(String guid, BigInt participant, String handle)? - leaveEvent, - TResult? Function(String guid)? ring, - TResult? Function(String guid)? decline, - TResult? Function(String guid)? respondedElsewhere, - }) { - return linkChanged?.call(guid); - } - @override - @optionalTypeArgs - TResult maybeWhen({ - TResult Function(LetMeInRequest field0)? letMeInRequest, - TResult Function(String guid)? linkChanged, - TResult Function(String guid, BigInt participant, String handle, bool ring)? - joinEvent, - TResult Function(String guid, Set members, bool ring)? addMembers, - TResult Function(String guid, Set members)? removeMembers, - TResult Function(String guid, BigInt participant, String handle)? - leaveEvent, - TResult Function(String guid)? ring, - TResult Function(String guid)? decline, - TResult Function(String guid)? respondedElsewhere, - required TResult orElse(), - }) { - if (linkChanged != null) { - return linkChanged(guid); - } - return orElse(); - } - @override - @optionalTypeArgs - TResult map({ - required TResult Function(FTMessage_LetMeInRequest value) letMeInRequest, - required TResult Function(FTMessage_LinkChanged value) linkChanged, - required TResult Function(FTMessage_JoinEvent value) joinEvent, - required TResult Function(FTMessage_AddMembers value) addMembers, - required TResult Function(FTMessage_RemoveMembers value) removeMembers, - required TResult Function(FTMessage_LeaveEvent value) leaveEvent, - required TResult Function(FTMessage_Ring value) ring, - required TResult Function(FTMessage_Decline value) decline, - required TResult Function(FTMessage_RespondedElsewhere value) - respondedElsewhere, - }) { - return linkChanged(this); - } +@override +bool operator ==(Object other) { + return identical(this, other) || (other.runtimeType == runtimeType&&other is BalloonLayout_TemplateLayout&&(identical(other.imageSubtitle, imageSubtitle) || other.imageSubtitle == imageSubtitle)&&(identical(other.imageTitle, imageTitle) || other.imageTitle == imageTitle)&&(identical(other.caption, caption) || other.caption == caption)&&(identical(other.secondarySubcaption, secondarySubcaption) || other.secondarySubcaption == secondarySubcaption)&&(identical(other.tertiarySubcaption, tertiarySubcaption) || other.tertiarySubcaption == tertiarySubcaption)&&(identical(other.subcaption, subcaption) || other.subcaption == subcaption)&&(identical(other.class_, class_) || other.class_ == class_)); +} - @override - @optionalTypeArgs - TResult? mapOrNull({ - TResult? Function(FTMessage_LetMeInRequest value)? letMeInRequest, - TResult? Function(FTMessage_LinkChanged value)? linkChanged, - TResult? Function(FTMessage_JoinEvent value)? joinEvent, - TResult? Function(FTMessage_AddMembers value)? addMembers, - TResult? Function(FTMessage_RemoveMembers value)? removeMembers, - TResult? Function(FTMessage_LeaveEvent value)? leaveEvent, - TResult? Function(FTMessage_Ring value)? ring, - TResult? Function(FTMessage_Decline value)? decline, - TResult? Function(FTMessage_RespondedElsewhere value)? respondedElsewhere, - }) { - return linkChanged?.call(this); - } - @override - @optionalTypeArgs - TResult maybeMap({ - TResult Function(FTMessage_LetMeInRequest value)? letMeInRequest, - TResult Function(FTMessage_LinkChanged value)? linkChanged, - TResult Function(FTMessage_JoinEvent value)? joinEvent, - TResult Function(FTMessage_AddMembers value)? addMembers, - TResult Function(FTMessage_RemoveMembers value)? removeMembers, - TResult Function(FTMessage_LeaveEvent value)? leaveEvent, - TResult Function(FTMessage_Ring value)? ring, - TResult Function(FTMessage_Decline value)? decline, - TResult Function(FTMessage_RespondedElsewhere value)? respondedElsewhere, - required TResult orElse(), - }) { - if (linkChanged != null) { - return linkChanged(this); - } - return orElse(); - } +@override +int get hashCode => Object.hash(runtimeType,imageSubtitle,imageTitle,caption,secondarySubcaption,tertiarySubcaption,subcaption,class_); + +@override +String toString() { + return 'BalloonLayout.templateLayout(imageSubtitle: $imageSubtitle, imageTitle: $imageTitle, caption: $caption, secondarySubcaption: $secondarySubcaption, tertiarySubcaption: $tertiarySubcaption, subcaption: $subcaption, class_: $class_)'; } -abstract class FTMessage_LinkChanged extends FTMessage { - const factory FTMessage_LinkChanged({required final String guid}) = - _$FTMessage_LinkChangedImpl; - const FTMessage_LinkChanged._() : super._(); - - String get guid; - - /// Create a copy of FTMessage - /// with the given fields replaced by the non-null parameter values. - @JsonKey(includeFromJson: false, includeToJson: false) - _$$FTMessage_LinkChangedImplCopyWith<_$FTMessage_LinkChangedImpl> - get copyWith => throw _privateConstructorUsedError; -} - -/// @nodoc -abstract class _$$FTMessage_JoinEventImplCopyWith<$Res> { - factory _$$FTMessage_JoinEventImplCopyWith(_$FTMessage_JoinEventImpl value, - $Res Function(_$FTMessage_JoinEventImpl) then) = - __$$FTMessage_JoinEventImplCopyWithImpl<$Res>; - @useResult - $Res call({String guid, BigInt participant, String handle, bool ring}); -} - -/// @nodoc -class __$$FTMessage_JoinEventImplCopyWithImpl<$Res> - extends _$FTMessageCopyWithImpl<$Res, _$FTMessage_JoinEventImpl> - implements _$$FTMessage_JoinEventImplCopyWith<$Res> { - __$$FTMessage_JoinEventImplCopyWithImpl(_$FTMessage_JoinEventImpl _value, - $Res Function(_$FTMessage_JoinEventImpl) _then) - : super(_value, _then); - - /// Create a copy of FTMessage - /// with the given fields replaced by the non-null parameter values. - @pragma('vm:prefer-inline') - @override - $Res call({ - Object? guid = null, - Object? participant = null, - Object? handle = null, - Object? ring = null, - }) { - return _then(_$FTMessage_JoinEventImpl( - guid: null == guid - ? _value.guid - : guid // ignore: cast_nullable_to_non_nullable - as String, - participant: null == participant - ? _value.participant - : participant // ignore: cast_nullable_to_non_nullable - as BigInt, - handle: null == handle - ? _value.handle - : handle // ignore: cast_nullable_to_non_nullable - as String, - ring: null == ring - ? _value.ring - : ring // ignore: cast_nullable_to_non_nullable - as bool, - )); - } + } /// @nodoc +abstract mixin class $BalloonLayout_TemplateLayoutCopyWith<$Res> implements $BalloonLayoutCopyWith<$Res> { + factory $BalloonLayout_TemplateLayoutCopyWith(BalloonLayout_TemplateLayout value, $Res Function(BalloonLayout_TemplateLayout) _then) = _$BalloonLayout_TemplateLayoutCopyWithImpl; +@override @useResult +$Res call({ + String imageSubtitle, String imageTitle, String caption, String secondarySubcaption, String tertiarySubcaption, String subcaption, NSDictionaryClass class_ +}); -class _$FTMessage_JoinEventImpl extends FTMessage_JoinEvent { - const _$FTMessage_JoinEventImpl( - {required this.guid, - required this.participant, - required this.handle, - required this.ring}) - : super._(); - @override - final String guid; - @override - final BigInt participant; - @override - final String handle; - @override - final bool ring; - @override - String toString() { - return 'FTMessage.joinEvent(guid: $guid, participant: $participant, handle: $handle, ring: $ring)'; - } - @override - bool operator ==(Object other) { - return identical(this, other) || - (other.runtimeType == runtimeType && - other is _$FTMessage_JoinEventImpl && - (identical(other.guid, guid) || other.guid == guid) && - (identical(other.participant, participant) || - other.participant == participant) && - (identical(other.handle, handle) || other.handle == handle) && - (identical(other.ring, ring) || other.ring == ring)); - } +} +/// @nodoc +class _$BalloonLayout_TemplateLayoutCopyWithImpl<$Res> + implements $BalloonLayout_TemplateLayoutCopyWith<$Res> { + _$BalloonLayout_TemplateLayoutCopyWithImpl(this._self, this._then); - @override - int get hashCode => Object.hash(runtimeType, guid, participant, handle, ring); - - /// Create a copy of FTMessage - /// with the given fields replaced by the non-null parameter values. - @JsonKey(includeFromJson: false, includeToJson: false) - @override - @pragma('vm:prefer-inline') - _$$FTMessage_JoinEventImplCopyWith<_$FTMessage_JoinEventImpl> get copyWith => - __$$FTMessage_JoinEventImplCopyWithImpl<_$FTMessage_JoinEventImpl>( - this, _$identity); - - @override - @optionalTypeArgs - TResult when({ - required TResult Function(LetMeInRequest field0) letMeInRequest, - required TResult Function(String guid) linkChanged, - required TResult Function( - String guid, BigInt participant, String handle, bool ring) - joinEvent, - required TResult Function(String guid, Set members, bool ring) - addMembers, - required TResult Function(String guid, Set members) removeMembers, - required TResult Function(String guid, BigInt participant, String handle) - leaveEvent, - required TResult Function(String guid) ring, - required TResult Function(String guid) decline, - required TResult Function(String guid) respondedElsewhere, - }) { - return joinEvent(guid, participant, handle, this.ring); - } + final BalloonLayout_TemplateLayout _self; + final $Res Function(BalloonLayout_TemplateLayout) _then; - @override - @optionalTypeArgs - TResult? whenOrNull({ - TResult? Function(LetMeInRequest field0)? letMeInRequest, - TResult? Function(String guid)? linkChanged, - TResult? Function( - String guid, BigInt participant, String handle, bool ring)? - joinEvent, - TResult? Function(String guid, Set members, bool ring)? - addMembers, - TResult? Function(String guid, Set members)? removeMembers, - TResult? Function(String guid, BigInt participant, String handle)? - leaveEvent, - TResult? Function(String guid)? ring, - TResult? Function(String guid)? decline, - TResult? Function(String guid)? respondedElsewhere, - }) { - return joinEvent?.call(guid, participant, handle, this.ring); - } +/// Create a copy of BalloonLayout +/// with the given fields replaced by the non-null parameter values. +@override @pragma('vm:prefer-inline') $Res call({Object? imageSubtitle = null,Object? imageTitle = null,Object? caption = null,Object? secondarySubcaption = null,Object? tertiarySubcaption = null,Object? subcaption = null,Object? class_ = null,}) { + return _then(BalloonLayout_TemplateLayout( +imageSubtitle: null == imageSubtitle ? _self.imageSubtitle : imageSubtitle // ignore: cast_nullable_to_non_nullable +as String,imageTitle: null == imageTitle ? _self.imageTitle : imageTitle // ignore: cast_nullable_to_non_nullable +as String,caption: null == caption ? _self.caption : caption // ignore: cast_nullable_to_non_nullable +as String,secondarySubcaption: null == secondarySubcaption ? _self.secondarySubcaption : secondarySubcaption // ignore: cast_nullable_to_non_nullable +as String,tertiarySubcaption: null == tertiarySubcaption ? _self.tertiarySubcaption : tertiarySubcaption // ignore: cast_nullable_to_non_nullable +as String,subcaption: null == subcaption ? _self.subcaption : subcaption // ignore: cast_nullable_to_non_nullable +as String,class_: null == class_ ? _self.class_ : class_ // ignore: cast_nullable_to_non_nullable +as NSDictionaryClass, + )); +} - @override - @optionalTypeArgs - TResult maybeWhen({ - TResult Function(LetMeInRequest field0)? letMeInRequest, - TResult Function(String guid)? linkChanged, - TResult Function(String guid, BigInt participant, String handle, bool ring)? - joinEvent, - TResult Function(String guid, Set members, bool ring)? addMembers, - TResult Function(String guid, Set members)? removeMembers, - TResult Function(String guid, BigInt participant, String handle)? - leaveEvent, - TResult Function(String guid)? ring, - TResult Function(String guid)? decline, - TResult Function(String guid)? respondedElsewhere, - required TResult orElse(), - }) { - if (joinEvent != null) { - return joinEvent(guid, participant, handle, this.ring); - } - return orElse(); - } - @override - @optionalTypeArgs - TResult map({ - required TResult Function(FTMessage_LetMeInRequest value) letMeInRequest, - required TResult Function(FTMessage_LinkChanged value) linkChanged, - required TResult Function(FTMessage_JoinEvent value) joinEvent, - required TResult Function(FTMessage_AddMembers value) addMembers, - required TResult Function(FTMessage_RemoveMembers value) removeMembers, - required TResult Function(FTMessage_LeaveEvent value) leaveEvent, - required TResult Function(FTMessage_Ring value) ring, - required TResult Function(FTMessage_Decline value) decline, - required TResult Function(FTMessage_RespondedElsewhere value) - respondedElsewhere, - }) { - return joinEvent(this); - } +} - @override - @optionalTypeArgs - TResult? mapOrNull({ - TResult? Function(FTMessage_LetMeInRequest value)? letMeInRequest, - TResult? Function(FTMessage_LinkChanged value)? linkChanged, - TResult? Function(FTMessage_JoinEvent value)? joinEvent, - TResult? Function(FTMessage_AddMembers value)? addMembers, - TResult? Function(FTMessage_RemoveMembers value)? removeMembers, - TResult? Function(FTMessage_LeaveEvent value)? leaveEvent, - TResult? Function(FTMessage_Ring value)? ring, - TResult? Function(FTMessage_Decline value)? decline, - TResult? Function(FTMessage_RespondedElsewhere value)? respondedElsewhere, - }) { - return joinEvent?.call(this); - } +/// @nodoc +mixin _$DeleteTarget { - @override - @optionalTypeArgs - TResult maybeMap({ - TResult Function(FTMessage_LetMeInRequest value)? letMeInRequest, - TResult Function(FTMessage_LinkChanged value)? linkChanged, - TResult Function(FTMessage_JoinEvent value)? joinEvent, - TResult Function(FTMessage_AddMembers value)? addMembers, - TResult Function(FTMessage_RemoveMembers value)? removeMembers, - TResult Function(FTMessage_LeaveEvent value)? leaveEvent, - TResult Function(FTMessage_Ring value)? ring, - TResult Function(FTMessage_Decline value)? decline, - TResult Function(FTMessage_RespondedElsewhere value)? respondedElsewhere, - required TResult orElse(), - }) { - if (joinEvent != null) { - return joinEvent(this); - } - return orElse(); - } -} + Object get field0; -abstract class FTMessage_JoinEvent extends FTMessage { - const factory FTMessage_JoinEvent( - {required final String guid, - required final BigInt participant, - required final String handle, - required final bool ring}) = _$FTMessage_JoinEventImpl; - const FTMessage_JoinEvent._() : super._(); - - String get guid; - BigInt get participant; - String get handle; - bool get ring; - - /// Create a copy of FTMessage - /// with the given fields replaced by the non-null parameter values. - @JsonKey(includeFromJson: false, includeToJson: false) - _$$FTMessage_JoinEventImplCopyWith<_$FTMessage_JoinEventImpl> get copyWith => - throw _privateConstructorUsedError; -} - -/// @nodoc -abstract class _$$FTMessage_AddMembersImplCopyWith<$Res> { - factory _$$FTMessage_AddMembersImplCopyWith(_$FTMessage_AddMembersImpl value, - $Res Function(_$FTMessage_AddMembersImpl) then) = - __$$FTMessage_AddMembersImplCopyWithImpl<$Res>; - @useResult - $Res call({String guid, Set members, bool ring}); -} - -/// @nodoc -class __$$FTMessage_AddMembersImplCopyWithImpl<$Res> - extends _$FTMessageCopyWithImpl<$Res, _$FTMessage_AddMembersImpl> - implements _$$FTMessage_AddMembersImplCopyWith<$Res> { - __$$FTMessage_AddMembersImplCopyWithImpl(_$FTMessage_AddMembersImpl _value, - $Res Function(_$FTMessage_AddMembersImpl) _then) - : super(_value, _then); - - /// Create a copy of FTMessage - /// with the given fields replaced by the non-null parameter values. - @pragma('vm:prefer-inline') - @override - $Res call({ - Object? guid = null, - Object? members = null, - Object? ring = null, - }) { - return _then(_$FTMessage_AddMembersImpl( - guid: null == guid - ? _value.guid - : guid // ignore: cast_nullable_to_non_nullable - as String, - members: null == members - ? _value._members - : members // ignore: cast_nullable_to_non_nullable - as Set, - ring: null == ring - ? _value.ring - : ring // ignore: cast_nullable_to_non_nullable - as bool, - )); - } + + +@override +bool operator ==(Object other) { + return identical(this, other) || (other.runtimeType == runtimeType&&other is DeleteTarget&&const DeepCollectionEquality().equals(other.field0, field0)); } -/// @nodoc -class _$FTMessage_AddMembersImpl extends FTMessage_AddMembers { - const _$FTMessage_AddMembersImpl( - {required this.guid, - required final Set members, - required this.ring}) - : _members = members, - super._(); +@override +int get hashCode => Object.hash(runtimeType,const DeepCollectionEquality().hash(field0)); - @override - final String guid; - final Set _members; - @override - Set get members { - if (_members is EqualUnmodifiableSetView) return _members; - // ignore: implicit_dynamic_type - return EqualUnmodifiableSetView(_members); - } +@override +String toString() { + return 'DeleteTarget(field0: $field0)'; +} - @override - final bool ring; - @override - String toString() { - return 'FTMessage.addMembers(guid: $guid, members: $members, ring: $ring)'; - } +} - @override - bool operator ==(Object other) { - return identical(this, other) || - (other.runtimeType == runtimeType && - other is _$FTMessage_AddMembersImpl && - (identical(other.guid, guid) || other.guid == guid) && - const DeepCollectionEquality().equals(other._members, _members) && - (identical(other.ring, ring) || other.ring == ring)); - } +/// @nodoc +class $DeleteTargetCopyWith<$Res> { +$DeleteTargetCopyWith(DeleteTarget _, $Res Function(DeleteTarget) __); +} - @override - int get hashCode => Object.hash( - runtimeType, guid, const DeepCollectionEquality().hash(_members), ring); - - /// Create a copy of FTMessage - /// with the given fields replaced by the non-null parameter values. - @JsonKey(includeFromJson: false, includeToJson: false) - @override - @pragma('vm:prefer-inline') - _$$FTMessage_AddMembersImplCopyWith<_$FTMessage_AddMembersImpl> - get copyWith => - __$$FTMessage_AddMembersImplCopyWithImpl<_$FTMessage_AddMembersImpl>( - this, _$identity); - - @override - @optionalTypeArgs - TResult when({ - required TResult Function(LetMeInRequest field0) letMeInRequest, - required TResult Function(String guid) linkChanged, - required TResult Function( - String guid, BigInt participant, String handle, bool ring) - joinEvent, - required TResult Function(String guid, Set members, bool ring) - addMembers, - required TResult Function(String guid, Set members) removeMembers, - required TResult Function(String guid, BigInt participant, String handle) - leaveEvent, - required TResult Function(String guid) ring, - required TResult Function(String guid) decline, - required TResult Function(String guid) respondedElsewhere, - }) { - return addMembers(guid, members, this.ring); - } - @override - @optionalTypeArgs - TResult? whenOrNull({ - TResult? Function(LetMeInRequest field0)? letMeInRequest, - TResult? Function(String guid)? linkChanged, - TResult? Function( - String guid, BigInt participant, String handle, bool ring)? - joinEvent, - TResult? Function(String guid, Set members, bool ring)? - addMembers, - TResult? Function(String guid, Set members)? removeMembers, - TResult? Function(String guid, BigInt participant, String handle)? - leaveEvent, - TResult? Function(String guid)? ring, - TResult? Function(String guid)? decline, - TResult? Function(String guid)? respondedElsewhere, - }) { - return addMembers?.call(guid, members, this.ring); - } +/// Adds pattern-matching-related methods to [DeleteTarget]. +extension DeleteTargetPatterns on DeleteTarget { +/// A variant of `map` that fallback to returning `orElse`. +/// +/// It is equivalent to doing: +/// ```dart +/// switch (sealedClass) { +/// case final Subclass value: +/// return ...; +/// case _: +/// return orElse(); +/// } +/// ``` + +@optionalTypeArgs TResult maybeMap({TResult Function( DeleteTarget_Chat value)? chat,TResult Function( DeleteTarget_Messages value)? messages,required TResult orElse(),}){ +final _that = this; +switch (_that) { +case DeleteTarget_Chat() when chat != null: +return chat(_that);case DeleteTarget_Messages() when messages != null: +return messages(_that);case _: + return orElse(); + +} +} +/// A `switch`-like method, using callbacks. +/// +/// Callbacks receives the raw object, upcasted. +/// It is equivalent to doing: +/// ```dart +/// switch (sealedClass) { +/// case final Subclass value: +/// return ...; +/// case final Subclass2 value: +/// return ...; +/// } +/// ``` - @override - @optionalTypeArgs - TResult maybeWhen({ - TResult Function(LetMeInRequest field0)? letMeInRequest, - TResult Function(String guid)? linkChanged, - TResult Function(String guid, BigInt participant, String handle, bool ring)? - joinEvent, - TResult Function(String guid, Set members, bool ring)? addMembers, - TResult Function(String guid, Set members)? removeMembers, - TResult Function(String guid, BigInt participant, String handle)? - leaveEvent, - TResult Function(String guid)? ring, - TResult Function(String guid)? decline, - TResult Function(String guid)? respondedElsewhere, - required TResult orElse(), - }) { - if (addMembers != null) { - return addMembers(guid, members, this.ring); - } - return orElse(); - } +@optionalTypeArgs TResult map({required TResult Function( DeleteTarget_Chat value) chat,required TResult Function( DeleteTarget_Messages value) messages,}){ +final _that = this; +switch (_that) { +case DeleteTarget_Chat(): +return chat(_that);case DeleteTarget_Messages(): +return messages(_that);} +} +/// A variant of `map` that fallback to returning `null`. +/// +/// It is equivalent to doing: +/// ```dart +/// switch (sealedClass) { +/// case final Subclass value: +/// return ...; +/// case _: +/// return null; +/// } +/// ``` - @override - @optionalTypeArgs - TResult map({ - required TResult Function(FTMessage_LetMeInRequest value) letMeInRequest, - required TResult Function(FTMessage_LinkChanged value) linkChanged, - required TResult Function(FTMessage_JoinEvent value) joinEvent, - required TResult Function(FTMessage_AddMembers value) addMembers, - required TResult Function(FTMessage_RemoveMembers value) removeMembers, - required TResult Function(FTMessage_LeaveEvent value) leaveEvent, - required TResult Function(FTMessage_Ring value) ring, - required TResult Function(FTMessage_Decline value) decline, - required TResult Function(FTMessage_RespondedElsewhere value) - respondedElsewhere, - }) { - return addMembers(this); - } +@optionalTypeArgs TResult? mapOrNull({TResult? Function( DeleteTarget_Chat value)? chat,TResult? Function( DeleteTarget_Messages value)? messages,}){ +final _that = this; +switch (_that) { +case DeleteTarget_Chat() when chat != null: +return chat(_that);case DeleteTarget_Messages() when messages != null: +return messages(_that);case _: + return null; - @override - @optionalTypeArgs - TResult? mapOrNull({ - TResult? Function(FTMessage_LetMeInRequest value)? letMeInRequest, - TResult? Function(FTMessage_LinkChanged value)? linkChanged, - TResult? Function(FTMessage_JoinEvent value)? joinEvent, - TResult? Function(FTMessage_AddMembers value)? addMembers, - TResult? Function(FTMessage_RemoveMembers value)? removeMembers, - TResult? Function(FTMessage_LeaveEvent value)? leaveEvent, - TResult? Function(FTMessage_Ring value)? ring, - TResult? Function(FTMessage_Decline value)? decline, - TResult? Function(FTMessage_RespondedElsewhere value)? respondedElsewhere, - }) { - return addMembers?.call(this); - } +} +} +/// A variant of `when` that fallback to an `orElse` callback. +/// +/// It is equivalent to doing: +/// ```dart +/// switch (sealedClass) { +/// case Subclass(:final field): +/// return ...; +/// case _: +/// return orElse(); +/// } +/// ``` + +@optionalTypeArgs TResult maybeWhen({TResult Function( OperatedChat field0)? chat,TResult Function( List field0)? messages,required TResult orElse(),}) {final _that = this; +switch (_that) { +case DeleteTarget_Chat() when chat != null: +return chat(_that.field0);case DeleteTarget_Messages() when messages != null: +return messages(_that.field0);case _: + return orElse(); - @override - @optionalTypeArgs - TResult maybeMap({ - TResult Function(FTMessage_LetMeInRequest value)? letMeInRequest, - TResult Function(FTMessage_LinkChanged value)? linkChanged, - TResult Function(FTMessage_JoinEvent value)? joinEvent, - TResult Function(FTMessage_AddMembers value)? addMembers, - TResult Function(FTMessage_RemoveMembers value)? removeMembers, - TResult Function(FTMessage_LeaveEvent value)? leaveEvent, - TResult Function(FTMessage_Ring value)? ring, - TResult Function(FTMessage_Decline value)? decline, - TResult Function(FTMessage_RespondedElsewhere value)? respondedElsewhere, - required TResult orElse(), - }) { - if (addMembers != null) { - return addMembers(this); - } - return orElse(); - } } +} +/// A `switch`-like method, using callbacks. +/// +/// As opposed to `map`, this offers destructuring. +/// It is equivalent to doing: +/// ```dart +/// switch (sealedClass) { +/// case Subclass(:final field): +/// return ...; +/// case Subclass2(:final field2): +/// return ...; +/// } +/// ``` -abstract class FTMessage_AddMembers extends FTMessage { - const factory FTMessage_AddMembers( - {required final String guid, - required final Set members, - required final bool ring}) = _$FTMessage_AddMembersImpl; - const FTMessage_AddMembers._() : super._(); - - String get guid; - Set get members; - bool get ring; - - /// Create a copy of FTMessage - /// with the given fields replaced by the non-null parameter values. - @JsonKey(includeFromJson: false, includeToJson: false) - _$$FTMessage_AddMembersImplCopyWith<_$FTMessage_AddMembersImpl> - get copyWith => throw _privateConstructorUsedError; -} - -/// @nodoc -abstract class _$$FTMessage_RemoveMembersImplCopyWith<$Res> { - factory _$$FTMessage_RemoveMembersImplCopyWith( - _$FTMessage_RemoveMembersImpl value, - $Res Function(_$FTMessage_RemoveMembersImpl) then) = - __$$FTMessage_RemoveMembersImplCopyWithImpl<$Res>; - @useResult - $Res call({String guid, Set members}); -} - -/// @nodoc -class __$$FTMessage_RemoveMembersImplCopyWithImpl<$Res> - extends _$FTMessageCopyWithImpl<$Res, _$FTMessage_RemoveMembersImpl> - implements _$$FTMessage_RemoveMembersImplCopyWith<$Res> { - __$$FTMessage_RemoveMembersImplCopyWithImpl( - _$FTMessage_RemoveMembersImpl _value, - $Res Function(_$FTMessage_RemoveMembersImpl) _then) - : super(_value, _then); - - /// Create a copy of FTMessage - /// with the given fields replaced by the non-null parameter values. - @pragma('vm:prefer-inline') - @override - $Res call({ - Object? guid = null, - Object? members = null, - }) { - return _then(_$FTMessage_RemoveMembersImpl( - guid: null == guid - ? _value.guid - : guid // ignore: cast_nullable_to_non_nullable - as String, - members: null == members - ? _value._members - : members // ignore: cast_nullable_to_non_nullable - as Set, - )); - } +@optionalTypeArgs TResult when({required TResult Function( OperatedChat field0) chat,required TResult Function( List field0) messages,}) {final _that = this; +switch (_that) { +case DeleteTarget_Chat(): +return chat(_that.field0);case DeleteTarget_Messages(): +return messages(_that.field0);} } +/// A variant of `when` that fallback to returning `null` +/// +/// It is equivalent to doing: +/// ```dart +/// switch (sealedClass) { +/// case Subclass(:final field): +/// return ...; +/// case _: +/// return null; +/// } +/// ``` -/// @nodoc +@optionalTypeArgs TResult? whenOrNull({TResult? Function( OperatedChat field0)? chat,TResult? Function( List field0)? messages,}) {final _that = this; +switch (_that) { +case DeleteTarget_Chat() when chat != null: +return chat(_that.field0);case DeleteTarget_Messages() when messages != null: +return messages(_that.field0);case _: + return null; -class _$FTMessage_RemoveMembersImpl extends FTMessage_RemoveMembers { - const _$FTMessage_RemoveMembersImpl( - {required this.guid, required final Set members}) - : _members = members, - super._(); +} +} - @override - final String guid; - final Set _members; - @override - Set get members { - if (_members is EqualUnmodifiableSetView) return _members; - // ignore: implicit_dynamic_type - return EqualUnmodifiableSetView(_members); - } +} - @override - String toString() { - return 'FTMessage.removeMembers(guid: $guid, members: $members)'; - } +/// @nodoc - @override - bool operator ==(Object other) { - return identical(this, other) || - (other.runtimeType == runtimeType && - other is _$FTMessage_RemoveMembersImpl && - (identical(other.guid, guid) || other.guid == guid) && - const DeepCollectionEquality().equals(other._members, _members)); - } - @override - int get hashCode => Object.hash( - runtimeType, guid, const DeepCollectionEquality().hash(_members)); - - /// Create a copy of FTMessage - /// with the given fields replaced by the non-null parameter values. - @JsonKey(includeFromJson: false, includeToJson: false) - @override - @pragma('vm:prefer-inline') - _$$FTMessage_RemoveMembersImplCopyWith<_$FTMessage_RemoveMembersImpl> - get copyWith => __$$FTMessage_RemoveMembersImplCopyWithImpl< - _$FTMessage_RemoveMembersImpl>(this, _$identity); - - @override - @optionalTypeArgs - TResult when({ - required TResult Function(LetMeInRequest field0) letMeInRequest, - required TResult Function(String guid) linkChanged, - required TResult Function( - String guid, BigInt participant, String handle, bool ring) - joinEvent, - required TResult Function(String guid, Set members, bool ring) - addMembers, - required TResult Function(String guid, Set members) removeMembers, - required TResult Function(String guid, BigInt participant, String handle) - leaveEvent, - required TResult Function(String guid) ring, - required TResult Function(String guid) decline, - required TResult Function(String guid) respondedElsewhere, - }) { - return removeMembers(guid, members); - } +class DeleteTarget_Chat extends DeleteTarget { + const DeleteTarget_Chat(this.field0): super._(); - @override - @optionalTypeArgs - TResult? whenOrNull({ - TResult? Function(LetMeInRequest field0)? letMeInRequest, - TResult? Function(String guid)? linkChanged, - TResult? Function( - String guid, BigInt participant, String handle, bool ring)? - joinEvent, - TResult? Function(String guid, Set members, bool ring)? - addMembers, - TResult? Function(String guid, Set members)? removeMembers, - TResult? Function(String guid, BigInt participant, String handle)? - leaveEvent, - TResult? Function(String guid)? ring, - TResult? Function(String guid)? decline, - TResult? Function(String guid)? respondedElsewhere, - }) { - return removeMembers?.call(guid, members); - } - @override - @optionalTypeArgs - TResult maybeWhen({ - TResult Function(LetMeInRequest field0)? letMeInRequest, - TResult Function(String guid)? linkChanged, - TResult Function(String guid, BigInt participant, String handle, bool ring)? - joinEvent, - TResult Function(String guid, Set members, bool ring)? addMembers, - TResult Function(String guid, Set members)? removeMembers, - TResult Function(String guid, BigInt participant, String handle)? - leaveEvent, - TResult Function(String guid)? ring, - TResult Function(String guid)? decline, - TResult Function(String guid)? respondedElsewhere, - required TResult orElse(), - }) { - if (removeMembers != null) { - return removeMembers(guid, members); - } - return orElse(); - } +@override final OperatedChat field0; - @override - @optionalTypeArgs - TResult map({ - required TResult Function(FTMessage_LetMeInRequest value) letMeInRequest, - required TResult Function(FTMessage_LinkChanged value) linkChanged, - required TResult Function(FTMessage_JoinEvent value) joinEvent, - required TResult Function(FTMessage_AddMembers value) addMembers, - required TResult Function(FTMessage_RemoveMembers value) removeMembers, - required TResult Function(FTMessage_LeaveEvent value) leaveEvent, - required TResult Function(FTMessage_Ring value) ring, - required TResult Function(FTMessage_Decline value) decline, - required TResult Function(FTMessage_RespondedElsewhere value) - respondedElsewhere, - }) { - return removeMembers(this); - } +/// Create a copy of DeleteTarget +/// with the given fields replaced by the non-null parameter values. +@JsonKey(includeFromJson: false, includeToJson: false) +@pragma('vm:prefer-inline') +$DeleteTarget_ChatCopyWith get copyWith => _$DeleteTarget_ChatCopyWithImpl(this, _$identity); - @override - @optionalTypeArgs - TResult? mapOrNull({ - TResult? Function(FTMessage_LetMeInRequest value)? letMeInRequest, - TResult? Function(FTMessage_LinkChanged value)? linkChanged, - TResult? Function(FTMessage_JoinEvent value)? joinEvent, - TResult? Function(FTMessage_AddMembers value)? addMembers, - TResult? Function(FTMessage_RemoveMembers value)? removeMembers, - TResult? Function(FTMessage_LeaveEvent value)? leaveEvent, - TResult? Function(FTMessage_Ring value)? ring, - TResult? Function(FTMessage_Decline value)? decline, - TResult? Function(FTMessage_RespondedElsewhere value)? respondedElsewhere, - }) { - return removeMembers?.call(this); - } - @override - @optionalTypeArgs - TResult maybeMap({ - TResult Function(FTMessage_LetMeInRequest value)? letMeInRequest, - TResult Function(FTMessage_LinkChanged value)? linkChanged, - TResult Function(FTMessage_JoinEvent value)? joinEvent, - TResult Function(FTMessage_AddMembers value)? addMembers, - TResult Function(FTMessage_RemoveMembers value)? removeMembers, - TResult Function(FTMessage_LeaveEvent value)? leaveEvent, - TResult Function(FTMessage_Ring value)? ring, - TResult Function(FTMessage_Decline value)? decline, - TResult Function(FTMessage_RespondedElsewhere value)? respondedElsewhere, - required TResult orElse(), - }) { - if (removeMembers != null) { - return removeMembers(this); - } - return orElse(); - } -} -abstract class FTMessage_RemoveMembers extends FTMessage { - const factory FTMessage_RemoveMembers( - {required final String guid, - required final Set members}) = _$FTMessage_RemoveMembersImpl; - const FTMessage_RemoveMembers._() : super._(); - - String get guid; - Set get members; - - /// Create a copy of FTMessage - /// with the given fields replaced by the non-null parameter values. - @JsonKey(includeFromJson: false, includeToJson: false) - _$$FTMessage_RemoveMembersImplCopyWith<_$FTMessage_RemoveMembersImpl> - get copyWith => throw _privateConstructorUsedError; -} - -/// @nodoc -abstract class _$$FTMessage_LeaveEventImplCopyWith<$Res> { - factory _$$FTMessage_LeaveEventImplCopyWith(_$FTMessage_LeaveEventImpl value, - $Res Function(_$FTMessage_LeaveEventImpl) then) = - __$$FTMessage_LeaveEventImplCopyWithImpl<$Res>; - @useResult - $Res call({String guid, BigInt participant, String handle}); -} - -/// @nodoc -class __$$FTMessage_LeaveEventImplCopyWithImpl<$Res> - extends _$FTMessageCopyWithImpl<$Res, _$FTMessage_LeaveEventImpl> - implements _$$FTMessage_LeaveEventImplCopyWith<$Res> { - __$$FTMessage_LeaveEventImplCopyWithImpl(_$FTMessage_LeaveEventImpl _value, - $Res Function(_$FTMessage_LeaveEventImpl) _then) - : super(_value, _then); - - /// Create a copy of FTMessage - /// with the given fields replaced by the non-null parameter values. - @pragma('vm:prefer-inline') - @override - $Res call({ - Object? guid = null, - Object? participant = null, - Object? handle = null, - }) { - return _then(_$FTMessage_LeaveEventImpl( - guid: null == guid - ? _value.guid - : guid // ignore: cast_nullable_to_non_nullable - as String, - participant: null == participant - ? _value.participant - : participant // ignore: cast_nullable_to_non_nullable - as BigInt, - handle: null == handle - ? _value.handle - : handle // ignore: cast_nullable_to_non_nullable - as String, - )); - } +@override +bool operator ==(Object other) { + return identical(this, other) || (other.runtimeType == runtimeType&&other is DeleteTarget_Chat&&(identical(other.field0, field0) || other.field0 == field0)); } -/// @nodoc -class _$FTMessage_LeaveEventImpl extends FTMessage_LeaveEvent { - const _$FTMessage_LeaveEventImpl( - {required this.guid, required this.participant, required this.handle}) - : super._(); +@override +int get hashCode => Object.hash(runtimeType,field0); - @override - final String guid; - @override - final BigInt participant; - @override - final String handle; +@override +String toString() { + return 'DeleteTarget.chat(field0: $field0)'; +} - @override - String toString() { - return 'FTMessage.leaveEvent(guid: $guid, participant: $participant, handle: $handle)'; - } - @override - bool operator ==(Object other) { - return identical(this, other) || - (other.runtimeType == runtimeType && - other is _$FTMessage_LeaveEventImpl && - (identical(other.guid, guid) || other.guid == guid) && - (identical(other.participant, participant) || - other.participant == participant) && - (identical(other.handle, handle) || other.handle == handle)); - } +} - @override - int get hashCode => Object.hash(runtimeType, guid, participant, handle); - - /// Create a copy of FTMessage - /// with the given fields replaced by the non-null parameter values. - @JsonKey(includeFromJson: false, includeToJson: false) - @override - @pragma('vm:prefer-inline') - _$$FTMessage_LeaveEventImplCopyWith<_$FTMessage_LeaveEventImpl> - get copyWith => - __$$FTMessage_LeaveEventImplCopyWithImpl<_$FTMessage_LeaveEventImpl>( - this, _$identity); - - @override - @optionalTypeArgs - TResult when({ - required TResult Function(LetMeInRequest field0) letMeInRequest, - required TResult Function(String guid) linkChanged, - required TResult Function( - String guid, BigInt participant, String handle, bool ring) - joinEvent, - required TResult Function(String guid, Set members, bool ring) - addMembers, - required TResult Function(String guid, Set members) removeMembers, - required TResult Function(String guid, BigInt participant, String handle) - leaveEvent, - required TResult Function(String guid) ring, - required TResult Function(String guid) decline, - required TResult Function(String guid) respondedElsewhere, - }) { - return leaveEvent(guid, participant, handle); - } +/// @nodoc +abstract mixin class $DeleteTarget_ChatCopyWith<$Res> implements $DeleteTargetCopyWith<$Res> { + factory $DeleteTarget_ChatCopyWith(DeleteTarget_Chat value, $Res Function(DeleteTarget_Chat) _then) = _$DeleteTarget_ChatCopyWithImpl; +@useResult +$Res call({ + OperatedChat field0 +}); - @override - @optionalTypeArgs - TResult? whenOrNull({ - TResult? Function(LetMeInRequest field0)? letMeInRequest, - TResult? Function(String guid)? linkChanged, - TResult? Function( - String guid, BigInt participant, String handle, bool ring)? - joinEvent, - TResult? Function(String guid, Set members, bool ring)? - addMembers, - TResult? Function(String guid, Set members)? removeMembers, - TResult? Function(String guid, BigInt participant, String handle)? - leaveEvent, - TResult? Function(String guid)? ring, - TResult? Function(String guid)? decline, - TResult? Function(String guid)? respondedElsewhere, - }) { - return leaveEvent?.call(guid, participant, handle); - } - @override - @optionalTypeArgs - TResult maybeWhen({ - TResult Function(LetMeInRequest field0)? letMeInRequest, - TResult Function(String guid)? linkChanged, - TResult Function(String guid, BigInt participant, String handle, bool ring)? - joinEvent, - TResult Function(String guid, Set members, bool ring)? addMembers, - TResult Function(String guid, Set members)? removeMembers, - TResult Function(String guid, BigInt participant, String handle)? - leaveEvent, - TResult Function(String guid)? ring, - TResult Function(String guid)? decline, - TResult Function(String guid)? respondedElsewhere, - required TResult orElse(), - }) { - if (leaveEvent != null) { - return leaveEvent(guid, participant, handle); - } - return orElse(); - } - @override - @optionalTypeArgs - TResult map({ - required TResult Function(FTMessage_LetMeInRequest value) letMeInRequest, - required TResult Function(FTMessage_LinkChanged value) linkChanged, - required TResult Function(FTMessage_JoinEvent value) joinEvent, - required TResult Function(FTMessage_AddMembers value) addMembers, - required TResult Function(FTMessage_RemoveMembers value) removeMembers, - required TResult Function(FTMessage_LeaveEvent value) leaveEvent, - required TResult Function(FTMessage_Ring value) ring, - required TResult Function(FTMessage_Decline value) decline, - required TResult Function(FTMessage_RespondedElsewhere value) - respondedElsewhere, - }) { - return leaveEvent(this); - } - @override - @optionalTypeArgs - TResult? mapOrNull({ - TResult? Function(FTMessage_LetMeInRequest value)? letMeInRequest, - TResult? Function(FTMessage_LinkChanged value)? linkChanged, - TResult? Function(FTMessage_JoinEvent value)? joinEvent, - TResult? Function(FTMessage_AddMembers value)? addMembers, - TResult? Function(FTMessage_RemoveMembers value)? removeMembers, - TResult? Function(FTMessage_LeaveEvent value)? leaveEvent, - TResult? Function(FTMessage_Ring value)? ring, - TResult? Function(FTMessage_Decline value)? decline, - TResult? Function(FTMessage_RespondedElsewhere value)? respondedElsewhere, - }) { - return leaveEvent?.call(this); - } +} +/// @nodoc +class _$DeleteTarget_ChatCopyWithImpl<$Res> + implements $DeleteTarget_ChatCopyWith<$Res> { + _$DeleteTarget_ChatCopyWithImpl(this._self, this._then); - @override - @optionalTypeArgs - TResult maybeMap({ - TResult Function(FTMessage_LetMeInRequest value)? letMeInRequest, - TResult Function(FTMessage_LinkChanged value)? linkChanged, - TResult Function(FTMessage_JoinEvent value)? joinEvent, - TResult Function(FTMessage_AddMembers value)? addMembers, - TResult Function(FTMessage_RemoveMembers value)? removeMembers, - TResult Function(FTMessage_LeaveEvent value)? leaveEvent, - TResult Function(FTMessage_Ring value)? ring, - TResult Function(FTMessage_Decline value)? decline, - TResult Function(FTMessage_RespondedElsewhere value)? respondedElsewhere, - required TResult orElse(), - }) { - if (leaveEvent != null) { - return leaveEvent(this); - } - return orElse(); - } + final DeleteTarget_Chat _self; + final $Res Function(DeleteTarget_Chat) _then; + +/// Create a copy of DeleteTarget +/// with the given fields replaced by the non-null parameter values. +@pragma('vm:prefer-inline') $Res call({Object? field0 = null,}) { + return _then(DeleteTarget_Chat( +null == field0 ? _self.field0 : field0 // ignore: cast_nullable_to_non_nullable +as OperatedChat, + )); } -abstract class FTMessage_LeaveEvent extends FTMessage { - const factory FTMessage_LeaveEvent( - {required final String guid, - required final BigInt participant, - required final String handle}) = _$FTMessage_LeaveEventImpl; - const FTMessage_LeaveEvent._() : super._(); - - String get guid; - BigInt get participant; - String get handle; - - /// Create a copy of FTMessage - /// with the given fields replaced by the non-null parameter values. - @JsonKey(includeFromJson: false, includeToJson: false) - _$$FTMessage_LeaveEventImplCopyWith<_$FTMessage_LeaveEventImpl> - get copyWith => throw _privateConstructorUsedError; -} - -/// @nodoc -abstract class _$$FTMessage_RingImplCopyWith<$Res> { - factory _$$FTMessage_RingImplCopyWith(_$FTMessage_RingImpl value, - $Res Function(_$FTMessage_RingImpl) then) = - __$$FTMessage_RingImplCopyWithImpl<$Res>; - @useResult - $Res call({String guid}); -} - -/// @nodoc -class __$$FTMessage_RingImplCopyWithImpl<$Res> - extends _$FTMessageCopyWithImpl<$Res, _$FTMessage_RingImpl> - implements _$$FTMessage_RingImplCopyWith<$Res> { - __$$FTMessage_RingImplCopyWithImpl( - _$FTMessage_RingImpl _value, $Res Function(_$FTMessage_RingImpl) _then) - : super(_value, _then); - - /// Create a copy of FTMessage - /// with the given fields replaced by the non-null parameter values. - @pragma('vm:prefer-inline') - @override - $Res call({ - Object? guid = null, - }) { - return _then(_$FTMessage_RingImpl( - guid: null == guid - ? _value.guid - : guid // ignore: cast_nullable_to_non_nullable - as String, - )); - } + } /// @nodoc -class _$FTMessage_RingImpl extends FTMessage_Ring { - const _$FTMessage_RingImpl({required this.guid}) : super._(); - - @override - final String guid; - @override - String toString() { - return 'FTMessage.ring(guid: $guid)'; - } +class DeleteTarget_Messages extends DeleteTarget { + const DeleteTarget_Messages(final List field0): _field0 = field0,super._(); - @override - bool operator ==(Object other) { - return identical(this, other) || - (other.runtimeType == runtimeType && - other is _$FTMessage_RingImpl && - (identical(other.guid, guid) || other.guid == guid)); - } - @override - int get hashCode => Object.hash(runtimeType, guid); - - /// Create a copy of FTMessage - /// with the given fields replaced by the non-null parameter values. - @JsonKey(includeFromJson: false, includeToJson: false) - @override - @pragma('vm:prefer-inline') - _$$FTMessage_RingImplCopyWith<_$FTMessage_RingImpl> get copyWith => - __$$FTMessage_RingImplCopyWithImpl<_$FTMessage_RingImpl>( - this, _$identity); - - @override - @optionalTypeArgs - TResult when({ - required TResult Function(LetMeInRequest field0) letMeInRequest, - required TResult Function(String guid) linkChanged, - required TResult Function( - String guid, BigInt participant, String handle, bool ring) - joinEvent, - required TResult Function(String guid, Set members, bool ring) - addMembers, - required TResult Function(String guid, Set members) removeMembers, - required TResult Function(String guid, BigInt participant, String handle) - leaveEvent, - required TResult Function(String guid) ring, - required TResult Function(String guid) decline, - required TResult Function(String guid) respondedElsewhere, - }) { - return ring(guid); - } + final List _field0; +@override List get field0 { + if (_field0 is EqualUnmodifiableListView) return _field0; + // ignore: implicit_dynamic_type + return EqualUnmodifiableListView(_field0); +} - @override - @optionalTypeArgs - TResult? whenOrNull({ - TResult? Function(LetMeInRequest field0)? letMeInRequest, - TResult? Function(String guid)? linkChanged, - TResult? Function( - String guid, BigInt participant, String handle, bool ring)? - joinEvent, - TResult? Function(String guid, Set members, bool ring)? - addMembers, - TResult? Function(String guid, Set members)? removeMembers, - TResult? Function(String guid, BigInt participant, String handle)? - leaveEvent, - TResult? Function(String guid)? ring, - TResult? Function(String guid)? decline, - TResult? Function(String guid)? respondedElsewhere, - }) { - return ring?.call(guid); - } - @override - @optionalTypeArgs - TResult maybeWhen({ - TResult Function(LetMeInRequest field0)? letMeInRequest, - TResult Function(String guid)? linkChanged, - TResult Function(String guid, BigInt participant, String handle, bool ring)? - joinEvent, - TResult Function(String guid, Set members, bool ring)? addMembers, - TResult Function(String guid, Set members)? removeMembers, - TResult Function(String guid, BigInt participant, String handle)? - leaveEvent, - TResult Function(String guid)? ring, - TResult Function(String guid)? decline, - TResult Function(String guid)? respondedElsewhere, - required TResult orElse(), - }) { - if (ring != null) { - return ring(guid); - } - return orElse(); - } +/// Create a copy of DeleteTarget +/// with the given fields replaced by the non-null parameter values. +@JsonKey(includeFromJson: false, includeToJson: false) +@pragma('vm:prefer-inline') +$DeleteTarget_MessagesCopyWith get copyWith => _$DeleteTarget_MessagesCopyWithImpl(this, _$identity); - @override - @optionalTypeArgs - TResult map({ - required TResult Function(FTMessage_LetMeInRequest value) letMeInRequest, - required TResult Function(FTMessage_LinkChanged value) linkChanged, - required TResult Function(FTMessage_JoinEvent value) joinEvent, - required TResult Function(FTMessage_AddMembers value) addMembers, - required TResult Function(FTMessage_RemoveMembers value) removeMembers, - required TResult Function(FTMessage_LeaveEvent value) leaveEvent, - required TResult Function(FTMessage_Ring value) ring, - required TResult Function(FTMessage_Decline value) decline, - required TResult Function(FTMessage_RespondedElsewhere value) - respondedElsewhere, - }) { - return ring(this); - } - @override - @optionalTypeArgs - TResult? mapOrNull({ - TResult? Function(FTMessage_LetMeInRequest value)? letMeInRequest, - TResult? Function(FTMessage_LinkChanged value)? linkChanged, - TResult? Function(FTMessage_JoinEvent value)? joinEvent, - TResult? Function(FTMessage_AddMembers value)? addMembers, - TResult? Function(FTMessage_RemoveMembers value)? removeMembers, - TResult? Function(FTMessage_LeaveEvent value)? leaveEvent, - TResult? Function(FTMessage_Ring value)? ring, - TResult? Function(FTMessage_Decline value)? decline, - TResult? Function(FTMessage_RespondedElsewhere value)? respondedElsewhere, - }) { - return ring?.call(this); - } - @override - @optionalTypeArgs - TResult maybeMap({ - TResult Function(FTMessage_LetMeInRequest value)? letMeInRequest, - TResult Function(FTMessage_LinkChanged value)? linkChanged, - TResult Function(FTMessage_JoinEvent value)? joinEvent, - TResult Function(FTMessage_AddMembers value)? addMembers, - TResult Function(FTMessage_RemoveMembers value)? removeMembers, - TResult Function(FTMessage_LeaveEvent value)? leaveEvent, - TResult Function(FTMessage_Ring value)? ring, - TResult Function(FTMessage_Decline value)? decline, - TResult Function(FTMessage_RespondedElsewhere value)? respondedElsewhere, - required TResult orElse(), - }) { - if (ring != null) { - return ring(this); - } - return orElse(); - } +@override +bool operator ==(Object other) { + return identical(this, other) || (other.runtimeType == runtimeType&&other is DeleteTarget_Messages&&const DeepCollectionEquality().equals(other._field0, _field0)); } -abstract class FTMessage_Ring extends FTMessage { - const factory FTMessage_Ring({required final String guid}) = - _$FTMessage_RingImpl; - const FTMessage_Ring._() : super._(); - String get guid; +@override +int get hashCode => Object.hash(runtimeType,const DeepCollectionEquality().hash(_field0)); - /// Create a copy of FTMessage - /// with the given fields replaced by the non-null parameter values. - @JsonKey(includeFromJson: false, includeToJson: false) - _$$FTMessage_RingImplCopyWith<_$FTMessage_RingImpl> get copyWith => - throw _privateConstructorUsedError; +@override +String toString() { + return 'DeleteTarget.messages(field0: $field0)'; } -/// @nodoc -abstract class _$$FTMessage_DeclineImplCopyWith<$Res> { - factory _$$FTMessage_DeclineImplCopyWith(_$FTMessage_DeclineImpl value, - $Res Function(_$FTMessage_DeclineImpl) then) = - __$$FTMessage_DeclineImplCopyWithImpl<$Res>; - @useResult - $Res call({String guid}); + } /// @nodoc -class __$$FTMessage_DeclineImplCopyWithImpl<$Res> - extends _$FTMessageCopyWithImpl<$Res, _$FTMessage_DeclineImpl> - implements _$$FTMessage_DeclineImplCopyWith<$Res> { - __$$FTMessage_DeclineImplCopyWithImpl(_$FTMessage_DeclineImpl _value, - $Res Function(_$FTMessage_DeclineImpl) _then) - : super(_value, _then); +abstract mixin class $DeleteTarget_MessagesCopyWith<$Res> implements $DeleteTargetCopyWith<$Res> { + factory $DeleteTarget_MessagesCopyWith(DeleteTarget_Messages value, $Res Function(DeleteTarget_Messages) _then) = _$DeleteTarget_MessagesCopyWithImpl; +@useResult +$Res call({ + List field0 +}); + - /// Create a copy of FTMessage - /// with the given fields replaced by the non-null parameter values. - @pragma('vm:prefer-inline') - @override - $Res call({ - Object? guid = null, - }) { - return _then(_$FTMessage_DeclineImpl( - guid: null == guid - ? _value.guid - : guid // ignore: cast_nullable_to_non_nullable - as String, - )); - } -} + +} /// @nodoc +class _$DeleteTarget_MessagesCopyWithImpl<$Res> + implements $DeleteTarget_MessagesCopyWith<$Res> { + _$DeleteTarget_MessagesCopyWithImpl(this._self, this._then); -class _$FTMessage_DeclineImpl extends FTMessage_Decline { - const _$FTMessage_DeclineImpl({required this.guid}) : super._(); + final DeleteTarget_Messages _self; + final $Res Function(DeleteTarget_Messages) _then; - @override - final String guid; +/// Create a copy of DeleteTarget +/// with the given fields replaced by the non-null parameter values. +@pragma('vm:prefer-inline') $Res call({Object? field0 = null,}) { + return _then(DeleteTarget_Messages( +null == field0 ? _self._field0 : field0 // ignore: cast_nullable_to_non_nullable +as List, + )); +} - @override - String toString() { - return 'FTMessage.decline(guid: $guid)'; - } - @override - bool operator ==(Object other) { - return identical(this, other) || - (other.runtimeType == runtimeType && - other is _$FTMessage_DeclineImpl && - (identical(other.guid, guid) || other.guid == guid)); - } +} - @override - int get hashCode => Object.hash(runtimeType, guid); - - /// Create a copy of FTMessage - /// with the given fields replaced by the non-null parameter values. - @JsonKey(includeFromJson: false, includeToJson: false) - @override - @pragma('vm:prefer-inline') - _$$FTMessage_DeclineImplCopyWith<_$FTMessage_DeclineImpl> get copyWith => - __$$FTMessage_DeclineImplCopyWithImpl<_$FTMessage_DeclineImpl>( - this, _$identity); - - @override - @optionalTypeArgs - TResult when({ - required TResult Function(LetMeInRequest field0) letMeInRequest, - required TResult Function(String guid) linkChanged, - required TResult Function( - String guid, BigInt participant, String handle, bool ring) - joinEvent, - required TResult Function(String guid, Set members, bool ring) - addMembers, - required TResult Function(String guid, Set members) removeMembers, - required TResult Function(String guid, BigInt participant, String handle) - leaveEvent, - required TResult Function(String guid) ring, - required TResult Function(String guid) decline, - required TResult Function(String guid) respondedElsewhere, - }) { - return decline(guid); - } +/// @nodoc +mixin _$FTMessage { - @override - @optionalTypeArgs - TResult? whenOrNull({ - TResult? Function(LetMeInRequest field0)? letMeInRequest, - TResult? Function(String guid)? linkChanged, - TResult? Function( - String guid, BigInt participant, String handle, bool ring)? - joinEvent, - TResult? Function(String guid, Set members, bool ring)? - addMembers, - TResult? Function(String guid, Set members)? removeMembers, - TResult? Function(String guid, BigInt participant, String handle)? - leaveEvent, - TResult? Function(String guid)? ring, - TResult? Function(String guid)? decline, - TResult? Function(String guid)? respondedElsewhere, - }) { - return decline?.call(guid); - } - @override - @optionalTypeArgs - TResult maybeWhen({ - TResult Function(LetMeInRequest field0)? letMeInRequest, - TResult Function(String guid)? linkChanged, - TResult Function(String guid, BigInt participant, String handle, bool ring)? - joinEvent, - TResult Function(String guid, Set members, bool ring)? addMembers, - TResult Function(String guid, Set members)? removeMembers, - TResult Function(String guid, BigInt participant, String handle)? - leaveEvent, - TResult Function(String guid)? ring, - TResult Function(String guid)? decline, - TResult Function(String guid)? respondedElsewhere, - required TResult orElse(), - }) { - if (decline != null) { - return decline(guid); - } - return orElse(); - } - @override - @optionalTypeArgs - TResult map({ - required TResult Function(FTMessage_LetMeInRequest value) letMeInRequest, - required TResult Function(FTMessage_LinkChanged value) linkChanged, - required TResult Function(FTMessage_JoinEvent value) joinEvent, - required TResult Function(FTMessage_AddMembers value) addMembers, - required TResult Function(FTMessage_RemoveMembers value) removeMembers, - required TResult Function(FTMessage_LeaveEvent value) leaveEvent, - required TResult Function(FTMessage_Ring value) ring, - required TResult Function(FTMessage_Decline value) decline, - required TResult Function(FTMessage_RespondedElsewhere value) - respondedElsewhere, - }) { - return decline(this); - } - @override - @optionalTypeArgs - TResult? mapOrNull({ - TResult? Function(FTMessage_LetMeInRequest value)? letMeInRequest, - TResult? Function(FTMessage_LinkChanged value)? linkChanged, - TResult? Function(FTMessage_JoinEvent value)? joinEvent, - TResult? Function(FTMessage_AddMembers value)? addMembers, - TResult? Function(FTMessage_RemoveMembers value)? removeMembers, - TResult? Function(FTMessage_LeaveEvent value)? leaveEvent, - TResult? Function(FTMessage_Ring value)? ring, - TResult? Function(FTMessage_Decline value)? decline, - TResult? Function(FTMessage_RespondedElsewhere value)? respondedElsewhere, - }) { - return decline?.call(this); - } - @override - @optionalTypeArgs - TResult maybeMap({ - TResult Function(FTMessage_LetMeInRequest value)? letMeInRequest, - TResult Function(FTMessage_LinkChanged value)? linkChanged, - TResult Function(FTMessage_JoinEvent value)? joinEvent, - TResult Function(FTMessage_AddMembers value)? addMembers, - TResult Function(FTMessage_RemoveMembers value)? removeMembers, - TResult Function(FTMessage_LeaveEvent value)? leaveEvent, - TResult Function(FTMessage_Ring value)? ring, - TResult Function(FTMessage_Decline value)? decline, - TResult Function(FTMessage_RespondedElsewhere value)? respondedElsewhere, - required TResult orElse(), - }) { - if (decline != null) { - return decline(this); - } - return orElse(); - } +@override +bool operator ==(Object other) { + return identical(this, other) || (other.runtimeType == runtimeType&&other is FTMessage); +} + + +@override +int get hashCode => runtimeType.hashCode; + +@override +String toString() { + return 'FTMessage()'; +} + + +} + +/// @nodoc +class $FTMessageCopyWith<$Res> { +$FTMessageCopyWith(FTMessage _, $Res Function(FTMessage) __); +} + + +/// Adds pattern-matching-related methods to [FTMessage]. +extension FTMessagePatterns on FTMessage { +/// A variant of `map` that fallback to returning `orElse`. +/// +/// It is equivalent to doing: +/// ```dart +/// switch (sealedClass) { +/// case final Subclass value: +/// return ...; +/// case _: +/// return orElse(); +/// } +/// ``` + +@optionalTypeArgs TResult maybeMap({TResult Function( FTMessage_LetMeInRequest value)? letMeInRequest,TResult Function( FTMessage_LinkChanged value)? linkChanged,TResult Function( FTMessage_JoinEvent value)? joinEvent,TResult Function( FTMessage_AddMembers value)? addMembers,TResult Function( FTMessage_RemoveMembers value)? removeMembers,TResult Function( FTMessage_LeaveEvent value)? leaveEvent,TResult Function( FTMessage_Ring value)? ring,TResult Function( FTMessage_Decline value)? decline,TResult Function( FTMessage_RespondedElsewhere value)? respondedElsewhere,required TResult orElse(),}){ +final _that = this; +switch (_that) { +case FTMessage_LetMeInRequest() when letMeInRequest != null: +return letMeInRequest(_that);case FTMessage_LinkChanged() when linkChanged != null: +return linkChanged(_that);case FTMessage_JoinEvent() when joinEvent != null: +return joinEvent(_that);case FTMessage_AddMembers() when addMembers != null: +return addMembers(_that);case FTMessage_RemoveMembers() when removeMembers != null: +return removeMembers(_that);case FTMessage_LeaveEvent() when leaveEvent != null: +return leaveEvent(_that);case FTMessage_Ring() when ring != null: +return ring(_that);case FTMessage_Decline() when decline != null: +return decline(_that);case FTMessage_RespondedElsewhere() when respondedElsewhere != null: +return respondedElsewhere(_that);case _: + return orElse(); + +} +} +/// A `switch`-like method, using callbacks. +/// +/// Callbacks receives the raw object, upcasted. +/// It is equivalent to doing: +/// ```dart +/// switch (sealedClass) { +/// case final Subclass value: +/// return ...; +/// case final Subclass2 value: +/// return ...; +/// } +/// ``` + +@optionalTypeArgs TResult map({required TResult Function( FTMessage_LetMeInRequest value) letMeInRequest,required TResult Function( FTMessage_LinkChanged value) linkChanged,required TResult Function( FTMessage_JoinEvent value) joinEvent,required TResult Function( FTMessage_AddMembers value) addMembers,required TResult Function( FTMessage_RemoveMembers value) removeMembers,required TResult Function( FTMessage_LeaveEvent value) leaveEvent,required TResult Function( FTMessage_Ring value) ring,required TResult Function( FTMessage_Decline value) decline,required TResult Function( FTMessage_RespondedElsewhere value) respondedElsewhere,}){ +final _that = this; +switch (_that) { +case FTMessage_LetMeInRequest(): +return letMeInRequest(_that);case FTMessage_LinkChanged(): +return linkChanged(_that);case FTMessage_JoinEvent(): +return joinEvent(_that);case FTMessage_AddMembers(): +return addMembers(_that);case FTMessage_RemoveMembers(): +return removeMembers(_that);case FTMessage_LeaveEvent(): +return leaveEvent(_that);case FTMessage_Ring(): +return ring(_that);case FTMessage_Decline(): +return decline(_that);case FTMessage_RespondedElsewhere(): +return respondedElsewhere(_that);} +} +/// A variant of `map` that fallback to returning `null`. +/// +/// It is equivalent to doing: +/// ```dart +/// switch (sealedClass) { +/// case final Subclass value: +/// return ...; +/// case _: +/// return null; +/// } +/// ``` + +@optionalTypeArgs TResult? mapOrNull({TResult? Function( FTMessage_LetMeInRequest value)? letMeInRequest,TResult? Function( FTMessage_LinkChanged value)? linkChanged,TResult? Function( FTMessage_JoinEvent value)? joinEvent,TResult? Function( FTMessage_AddMembers value)? addMembers,TResult? Function( FTMessage_RemoveMembers value)? removeMembers,TResult? Function( FTMessage_LeaveEvent value)? leaveEvent,TResult? Function( FTMessage_Ring value)? ring,TResult? Function( FTMessage_Decline value)? decline,TResult? Function( FTMessage_RespondedElsewhere value)? respondedElsewhere,}){ +final _that = this; +switch (_that) { +case FTMessage_LetMeInRequest() when letMeInRequest != null: +return letMeInRequest(_that);case FTMessage_LinkChanged() when linkChanged != null: +return linkChanged(_that);case FTMessage_JoinEvent() when joinEvent != null: +return joinEvent(_that);case FTMessage_AddMembers() when addMembers != null: +return addMembers(_that);case FTMessage_RemoveMembers() when removeMembers != null: +return removeMembers(_that);case FTMessage_LeaveEvent() when leaveEvent != null: +return leaveEvent(_that);case FTMessage_Ring() when ring != null: +return ring(_that);case FTMessage_Decline() when decline != null: +return decline(_that);case FTMessage_RespondedElsewhere() when respondedElsewhere != null: +return respondedElsewhere(_that);case _: + return null; + +} +} +/// A variant of `when` that fallback to an `orElse` callback. +/// +/// It is equivalent to doing: +/// ```dart +/// switch (sealedClass) { +/// case Subclass(:final field): +/// return ...; +/// case _: +/// return orElse(); +/// } +/// ``` + +@optionalTypeArgs TResult maybeWhen({TResult Function( LetMeInRequest field0)? letMeInRequest,TResult Function( String guid)? linkChanged,TResult Function( String guid, BigInt participant, String handle, bool ring)? joinEvent,TResult Function( String guid, Set members, bool ring)? addMembers,TResult Function( String guid, Set members)? removeMembers,TResult Function( String guid, BigInt participant, String handle)? leaveEvent,TResult Function( String guid)? ring,TResult Function( String guid)? decline,TResult Function( String guid)? respondedElsewhere,required TResult orElse(),}) {final _that = this; +switch (_that) { +case FTMessage_LetMeInRequest() when letMeInRequest != null: +return letMeInRequest(_that.field0);case FTMessage_LinkChanged() when linkChanged != null: +return linkChanged(_that.guid);case FTMessage_JoinEvent() when joinEvent != null: +return joinEvent(_that.guid,_that.participant,_that.handle,_that.ring);case FTMessage_AddMembers() when addMembers != null: +return addMembers(_that.guid,_that.members,_that.ring);case FTMessage_RemoveMembers() when removeMembers != null: +return removeMembers(_that.guid,_that.members);case FTMessage_LeaveEvent() when leaveEvent != null: +return leaveEvent(_that.guid,_that.participant,_that.handle);case FTMessage_Ring() when ring != null: +return ring(_that.guid);case FTMessage_Decline() when decline != null: +return decline(_that.guid);case FTMessage_RespondedElsewhere() when respondedElsewhere != null: +return respondedElsewhere(_that.guid);case _: + return orElse(); + +} +} +/// A `switch`-like method, using callbacks. +/// +/// As opposed to `map`, this offers destructuring. +/// It is equivalent to doing: +/// ```dart +/// switch (sealedClass) { +/// case Subclass(:final field): +/// return ...; +/// case Subclass2(:final field2): +/// return ...; +/// } +/// ``` + +@optionalTypeArgs TResult when({required TResult Function( LetMeInRequest field0) letMeInRequest,required TResult Function( String guid) linkChanged,required TResult Function( String guid, BigInt participant, String handle, bool ring) joinEvent,required TResult Function( String guid, Set members, bool ring) addMembers,required TResult Function( String guid, Set members) removeMembers,required TResult Function( String guid, BigInt participant, String handle) leaveEvent,required TResult Function( String guid) ring,required TResult Function( String guid) decline,required TResult Function( String guid) respondedElsewhere,}) {final _that = this; +switch (_that) { +case FTMessage_LetMeInRequest(): +return letMeInRequest(_that.field0);case FTMessage_LinkChanged(): +return linkChanged(_that.guid);case FTMessage_JoinEvent(): +return joinEvent(_that.guid,_that.participant,_that.handle,_that.ring);case FTMessage_AddMembers(): +return addMembers(_that.guid,_that.members,_that.ring);case FTMessage_RemoveMembers(): +return removeMembers(_that.guid,_that.members);case FTMessage_LeaveEvent(): +return leaveEvent(_that.guid,_that.participant,_that.handle);case FTMessage_Ring(): +return ring(_that.guid);case FTMessage_Decline(): +return decline(_that.guid);case FTMessage_RespondedElsewhere(): +return respondedElsewhere(_that.guid);} } +/// A variant of `when` that fallback to returning `null` +/// +/// It is equivalent to doing: +/// ```dart +/// switch (sealedClass) { +/// case Subclass(:final field): +/// return ...; +/// case _: +/// return null; +/// } +/// ``` -abstract class FTMessage_Decline extends FTMessage { - const factory FTMessage_Decline({required final String guid}) = - _$FTMessage_DeclineImpl; - const FTMessage_Decline._() : super._(); - - String get guid; - - /// Create a copy of FTMessage - /// with the given fields replaced by the non-null parameter values. - @JsonKey(includeFromJson: false, includeToJson: false) - _$$FTMessage_DeclineImplCopyWith<_$FTMessage_DeclineImpl> get copyWith => - throw _privateConstructorUsedError; -} - -/// @nodoc -abstract class _$$FTMessage_RespondedElsewhereImplCopyWith<$Res> { - factory _$$FTMessage_RespondedElsewhereImplCopyWith( - _$FTMessage_RespondedElsewhereImpl value, - $Res Function(_$FTMessage_RespondedElsewhereImpl) then) = - __$$FTMessage_RespondedElsewhereImplCopyWithImpl<$Res>; - @useResult - $Res call({String guid}); -} - -/// @nodoc -class __$$FTMessage_RespondedElsewhereImplCopyWithImpl<$Res> - extends _$FTMessageCopyWithImpl<$Res, _$FTMessage_RespondedElsewhereImpl> - implements _$$FTMessage_RespondedElsewhereImplCopyWith<$Res> { - __$$FTMessage_RespondedElsewhereImplCopyWithImpl( - _$FTMessage_RespondedElsewhereImpl _value, - $Res Function(_$FTMessage_RespondedElsewhereImpl) _then) - : super(_value, _then); - - /// Create a copy of FTMessage - /// with the given fields replaced by the non-null parameter values. - @pragma('vm:prefer-inline') - @override - $Res call({ - Object? guid = null, - }) { - return _then(_$FTMessage_RespondedElsewhereImpl( - guid: null == guid - ? _value.guid - : guid // ignore: cast_nullable_to_non_nullable - as String, - )); - } -} +@optionalTypeArgs TResult? whenOrNull({TResult? Function( LetMeInRequest field0)? letMeInRequest,TResult? Function( String guid)? linkChanged,TResult? Function( String guid, BigInt participant, String handle, bool ring)? joinEvent,TResult? Function( String guid, Set members, bool ring)? addMembers,TResult? Function( String guid, Set members)? removeMembers,TResult? Function( String guid, BigInt participant, String handle)? leaveEvent,TResult? Function( String guid)? ring,TResult? Function( String guid)? decline,TResult? Function( String guid)? respondedElsewhere,}) {final _that = this; +switch (_that) { +case FTMessage_LetMeInRequest() when letMeInRequest != null: +return letMeInRequest(_that.field0);case FTMessage_LinkChanged() when linkChanged != null: +return linkChanged(_that.guid);case FTMessage_JoinEvent() when joinEvent != null: +return joinEvent(_that.guid,_that.participant,_that.handle,_that.ring);case FTMessage_AddMembers() when addMembers != null: +return addMembers(_that.guid,_that.members,_that.ring);case FTMessage_RemoveMembers() when removeMembers != null: +return removeMembers(_that.guid,_that.members);case FTMessage_LeaveEvent() when leaveEvent != null: +return leaveEvent(_that.guid,_that.participant,_that.handle);case FTMessage_Ring() when ring != null: +return ring(_that.guid);case FTMessage_Decline() when decline != null: +return decline(_that.guid);case FTMessage_RespondedElsewhere() when respondedElsewhere != null: +return respondedElsewhere(_that.guid);case _: + return null; -/// @nodoc +} +} -class _$FTMessage_RespondedElsewhereImpl extends FTMessage_RespondedElsewhere { - const _$FTMessage_RespondedElsewhereImpl({required this.guid}) : super._(); +} - @override - final String guid; +/// @nodoc - @override - String toString() { - return 'FTMessage.respondedElsewhere(guid: $guid)'; - } - @override - bool operator ==(Object other) { - return identical(this, other) || - (other.runtimeType == runtimeType && - other is _$FTMessage_RespondedElsewhereImpl && - (identical(other.guid, guid) || other.guid == guid)); - } +class FTMessage_LetMeInRequest extends FTMessage { + const FTMessage_LetMeInRequest(this.field0): super._(); - @override - int get hashCode => Object.hash(runtimeType, guid); - - /// Create a copy of FTMessage - /// with the given fields replaced by the non-null parameter values. - @JsonKey(includeFromJson: false, includeToJson: false) - @override - @pragma('vm:prefer-inline') - _$$FTMessage_RespondedElsewhereImplCopyWith< - _$FTMessage_RespondedElsewhereImpl> - get copyWith => __$$FTMessage_RespondedElsewhereImplCopyWithImpl< - _$FTMessage_RespondedElsewhereImpl>(this, _$identity); - - @override - @optionalTypeArgs - TResult when({ - required TResult Function(LetMeInRequest field0) letMeInRequest, - required TResult Function(String guid) linkChanged, - required TResult Function( - String guid, BigInt participant, String handle, bool ring) - joinEvent, - required TResult Function(String guid, Set members, bool ring) - addMembers, - required TResult Function(String guid, Set members) removeMembers, - required TResult Function(String guid, BigInt participant, String handle) - leaveEvent, - required TResult Function(String guid) ring, - required TResult Function(String guid) decline, - required TResult Function(String guid) respondedElsewhere, - }) { - return respondedElsewhere(guid); - } - @override - @optionalTypeArgs - TResult? whenOrNull({ - TResult? Function(LetMeInRequest field0)? letMeInRequest, - TResult? Function(String guid)? linkChanged, - TResult? Function( - String guid, BigInt participant, String handle, bool ring)? - joinEvent, - TResult? Function(String guid, Set members, bool ring)? - addMembers, - TResult? Function(String guid, Set members)? removeMembers, - TResult? Function(String guid, BigInt participant, String handle)? - leaveEvent, - TResult? Function(String guid)? ring, - TResult? Function(String guid)? decline, - TResult? Function(String guid)? respondedElsewhere, - }) { - return respondedElsewhere?.call(guid); - } + final LetMeInRequest field0; - @override - @optionalTypeArgs - TResult maybeWhen({ - TResult Function(LetMeInRequest field0)? letMeInRequest, - TResult Function(String guid)? linkChanged, - TResult Function(String guid, BigInt participant, String handle, bool ring)? - joinEvent, - TResult Function(String guid, Set members, bool ring)? addMembers, - TResult Function(String guid, Set members)? removeMembers, - TResult Function(String guid, BigInt participant, String handle)? - leaveEvent, - TResult Function(String guid)? ring, - TResult Function(String guid)? decline, - TResult Function(String guid)? respondedElsewhere, - required TResult orElse(), - }) { - if (respondedElsewhere != null) { - return respondedElsewhere(guid); - } - return orElse(); - } +/// Create a copy of FTMessage +/// with the given fields replaced by the non-null parameter values. +@JsonKey(includeFromJson: false, includeToJson: false) +@pragma('vm:prefer-inline') +$FTMessage_LetMeInRequestCopyWith get copyWith => _$FTMessage_LetMeInRequestCopyWithImpl(this, _$identity); - @override - @optionalTypeArgs - TResult map({ - required TResult Function(FTMessage_LetMeInRequest value) letMeInRequest, - required TResult Function(FTMessage_LinkChanged value) linkChanged, - required TResult Function(FTMessage_JoinEvent value) joinEvent, - required TResult Function(FTMessage_AddMembers value) addMembers, - required TResult Function(FTMessage_RemoveMembers value) removeMembers, - required TResult Function(FTMessage_LeaveEvent value) leaveEvent, - required TResult Function(FTMessage_Ring value) ring, - required TResult Function(FTMessage_Decline value) decline, - required TResult Function(FTMessage_RespondedElsewhere value) - respondedElsewhere, - }) { - return respondedElsewhere(this); - } - @override - @optionalTypeArgs - TResult? mapOrNull({ - TResult? Function(FTMessage_LetMeInRequest value)? letMeInRequest, - TResult? Function(FTMessage_LinkChanged value)? linkChanged, - TResult? Function(FTMessage_JoinEvent value)? joinEvent, - TResult? Function(FTMessage_AddMembers value)? addMembers, - TResult? Function(FTMessage_RemoveMembers value)? removeMembers, - TResult? Function(FTMessage_LeaveEvent value)? leaveEvent, - TResult? Function(FTMessage_Ring value)? ring, - TResult? Function(FTMessage_Decline value)? decline, - TResult? Function(FTMessage_RespondedElsewhere value)? respondedElsewhere, - }) { - return respondedElsewhere?.call(this); - } - @override - @optionalTypeArgs - TResult maybeMap({ - TResult Function(FTMessage_LetMeInRequest value)? letMeInRequest, - TResult Function(FTMessage_LinkChanged value)? linkChanged, - TResult Function(FTMessage_JoinEvent value)? joinEvent, - TResult Function(FTMessage_AddMembers value)? addMembers, - TResult Function(FTMessage_RemoveMembers value)? removeMembers, - TResult Function(FTMessage_LeaveEvent value)? leaveEvent, - TResult Function(FTMessage_Ring value)? ring, - TResult Function(FTMessage_Decline value)? decline, - TResult Function(FTMessage_RespondedElsewhere value)? respondedElsewhere, - required TResult orElse(), - }) { - if (respondedElsewhere != null) { - return respondedElsewhere(this); - } - return orElse(); - } +@override +bool operator ==(Object other) { + return identical(this, other) || (other.runtimeType == runtimeType&&other is FTMessage_LetMeInRequest&&(identical(other.field0, field0) || other.field0 == field0)); } -abstract class FTMessage_RespondedElsewhere extends FTMessage { - const factory FTMessage_RespondedElsewhere({required final String guid}) = - _$FTMessage_RespondedElsewhereImpl; - const FTMessage_RespondedElsewhere._() : super._(); - String get guid; +@override +int get hashCode => Object.hash(runtimeType,field0); - /// Create a copy of FTMessage - /// with the given fields replaced by the non-null parameter values. - @JsonKey(includeFromJson: false, includeToJson: false) - _$$FTMessage_RespondedElsewhereImplCopyWith< - _$FTMessage_RespondedElsewhereImpl> - get copyWith => throw _privateConstructorUsedError; +@override +String toString() { + return 'FTMessage.letMeInRequest(field0: $field0)'; } -/// @nodoc -mixin _$IdmsMessage { - Object get field0 => throw _privateConstructorUsedError; - @optionalTypeArgs - TResult when({ - required TResult Function(IdmsRequestedSignIn field0) requestedSignIn, - required TResult Function(TeardownSignIn field0) teardownSignIn, - required TResult Function( - IdmsCircleMessage field0, IdmsRequestedSignIn? field1) - circleRequest, - }) => - throw _privateConstructorUsedError; - @optionalTypeArgs - TResult? whenOrNull({ - TResult? Function(IdmsRequestedSignIn field0)? requestedSignIn, - TResult? Function(TeardownSignIn field0)? teardownSignIn, - TResult? Function(IdmsCircleMessage field0, IdmsRequestedSignIn? field1)? - circleRequest, - }) => - throw _privateConstructorUsedError; - @optionalTypeArgs - TResult maybeWhen({ - TResult Function(IdmsRequestedSignIn field0)? requestedSignIn, - TResult Function(TeardownSignIn field0)? teardownSignIn, - TResult Function(IdmsCircleMessage field0, IdmsRequestedSignIn? field1)? - circleRequest, - required TResult orElse(), - }) => - throw _privateConstructorUsedError; - @optionalTypeArgs - TResult map({ - required TResult Function(IdmsMessage_RequestedSignIn value) - requestedSignIn, - required TResult Function(IdmsMessage_TeardownSignIn value) teardownSignIn, - required TResult Function(IdmsMessage_CircleRequest value) circleRequest, - }) => - throw _privateConstructorUsedError; - @optionalTypeArgs - TResult? mapOrNull({ - TResult? Function(IdmsMessage_RequestedSignIn value)? requestedSignIn, - TResult? Function(IdmsMessage_TeardownSignIn value)? teardownSignIn, - TResult? Function(IdmsMessage_CircleRequest value)? circleRequest, - }) => - throw _privateConstructorUsedError; - @optionalTypeArgs - TResult maybeMap({ - TResult Function(IdmsMessage_RequestedSignIn value)? requestedSignIn, - TResult Function(IdmsMessage_TeardownSignIn value)? teardownSignIn, - TResult Function(IdmsMessage_CircleRequest value)? circleRequest, - required TResult orElse(), - }) => - throw _privateConstructorUsedError; -} - -/// @nodoc -abstract class $IdmsMessageCopyWith<$Res> { - factory $IdmsMessageCopyWith( - IdmsMessage value, $Res Function(IdmsMessage) then) = - _$IdmsMessageCopyWithImpl<$Res, IdmsMessage>; -} - -/// @nodoc -class _$IdmsMessageCopyWithImpl<$Res, $Val extends IdmsMessage> - implements $IdmsMessageCopyWith<$Res> { - _$IdmsMessageCopyWithImpl(this._value, this._then); - - // ignore: unused_field - final $Val _value; - // ignore: unused_field - final $Res Function($Val) _then; - - /// Create a copy of IdmsMessage - /// with the given fields replaced by the non-null parameter values. -} - -/// @nodoc -abstract class _$$IdmsMessage_RequestedSignInImplCopyWith<$Res> { - factory _$$IdmsMessage_RequestedSignInImplCopyWith( - _$IdmsMessage_RequestedSignInImpl value, - $Res Function(_$IdmsMessage_RequestedSignInImpl) then) = - __$$IdmsMessage_RequestedSignInImplCopyWithImpl<$Res>; - @useResult - $Res call({IdmsRequestedSignIn field0}); -} - -/// @nodoc -class __$$IdmsMessage_RequestedSignInImplCopyWithImpl<$Res> - extends _$IdmsMessageCopyWithImpl<$Res, _$IdmsMessage_RequestedSignInImpl> - implements _$$IdmsMessage_RequestedSignInImplCopyWith<$Res> { - __$$IdmsMessage_RequestedSignInImplCopyWithImpl( - _$IdmsMessage_RequestedSignInImpl _value, - $Res Function(_$IdmsMessage_RequestedSignInImpl) _then) - : super(_value, _then); - - /// Create a copy of IdmsMessage - /// with the given fields replaced by the non-null parameter values. - @pragma('vm:prefer-inline') - @override - $Res call({ - Object? field0 = null, - }) { - return _then(_$IdmsMessage_RequestedSignInImpl( - null == field0 - ? _value.field0 - : field0 // ignore: cast_nullable_to_non_nullable - as IdmsRequestedSignIn, - )); - } + } /// @nodoc +abstract mixin class $FTMessage_LetMeInRequestCopyWith<$Res> implements $FTMessageCopyWith<$Res> { + factory $FTMessage_LetMeInRequestCopyWith(FTMessage_LetMeInRequest value, $Res Function(FTMessage_LetMeInRequest) _then) = _$FTMessage_LetMeInRequestCopyWithImpl; +@useResult +$Res call({ + LetMeInRequest field0 +}); -class _$IdmsMessage_RequestedSignInImpl extends IdmsMessage_RequestedSignIn { - const _$IdmsMessage_RequestedSignInImpl(this.field0) : super._(); - - @override - final IdmsRequestedSignIn field0; - @override - String toString() { - return 'IdmsMessage.requestedSignIn(field0: $field0)'; - } - @override - bool operator ==(Object other) { - return identical(this, other) || - (other.runtimeType == runtimeType && - other is _$IdmsMessage_RequestedSignInImpl && - (identical(other.field0, field0) || other.field0 == field0)); - } - @override - int get hashCode => Object.hash(runtimeType, field0); - - /// Create a copy of IdmsMessage - /// with the given fields replaced by the non-null parameter values. - @JsonKey(includeFromJson: false, includeToJson: false) - @override - @pragma('vm:prefer-inline') - _$$IdmsMessage_RequestedSignInImplCopyWith<_$IdmsMessage_RequestedSignInImpl> - get copyWith => __$$IdmsMessage_RequestedSignInImplCopyWithImpl< - _$IdmsMessage_RequestedSignInImpl>(this, _$identity); - - @override - @optionalTypeArgs - TResult when({ - required TResult Function(IdmsRequestedSignIn field0) requestedSignIn, - required TResult Function(TeardownSignIn field0) teardownSignIn, - required TResult Function( - IdmsCircleMessage field0, IdmsRequestedSignIn? field1) - circleRequest, - }) { - return requestedSignIn(field0); - } - - @override - @optionalTypeArgs - TResult? whenOrNull({ - TResult? Function(IdmsRequestedSignIn field0)? requestedSignIn, - TResult? Function(TeardownSignIn field0)? teardownSignIn, - TResult? Function(IdmsCircleMessage field0, IdmsRequestedSignIn? field1)? - circleRequest, - }) { - return requestedSignIn?.call(field0); - } - - @override - @optionalTypeArgs - TResult maybeWhen({ - TResult Function(IdmsRequestedSignIn field0)? requestedSignIn, - TResult Function(TeardownSignIn field0)? teardownSignIn, - TResult Function(IdmsCircleMessage field0, IdmsRequestedSignIn? field1)? - circleRequest, - required TResult orElse(), - }) { - if (requestedSignIn != null) { - return requestedSignIn(field0); - } - return orElse(); - } - - @override - @optionalTypeArgs - TResult map({ - required TResult Function(IdmsMessage_RequestedSignIn value) - requestedSignIn, - required TResult Function(IdmsMessage_TeardownSignIn value) teardownSignIn, - required TResult Function(IdmsMessage_CircleRequest value) circleRequest, - }) { - return requestedSignIn(this); - } +} +/// @nodoc +class _$FTMessage_LetMeInRequestCopyWithImpl<$Res> + implements $FTMessage_LetMeInRequestCopyWith<$Res> { + _$FTMessage_LetMeInRequestCopyWithImpl(this._self, this._then); - @override - @optionalTypeArgs - TResult? mapOrNull({ - TResult? Function(IdmsMessage_RequestedSignIn value)? requestedSignIn, - TResult? Function(IdmsMessage_TeardownSignIn value)? teardownSignIn, - TResult? Function(IdmsMessage_CircleRequest value)? circleRequest, - }) { - return requestedSignIn?.call(this); - } + final FTMessage_LetMeInRequest _self; + final $Res Function(FTMessage_LetMeInRequest) _then; - @override - @optionalTypeArgs - TResult maybeMap({ - TResult Function(IdmsMessage_RequestedSignIn value)? requestedSignIn, - TResult Function(IdmsMessage_TeardownSignIn value)? teardownSignIn, - TResult Function(IdmsMessage_CircleRequest value)? circleRequest, - required TResult orElse(), - }) { - if (requestedSignIn != null) { - return requestedSignIn(this); - } - return orElse(); - } +/// Create a copy of FTMessage +/// with the given fields replaced by the non-null parameter values. +@pragma('vm:prefer-inline') $Res call({Object? field0 = null,}) { + return _then(FTMessage_LetMeInRequest( +null == field0 ? _self.field0 : field0 // ignore: cast_nullable_to_non_nullable +as LetMeInRequest, + )); } -abstract class IdmsMessage_RequestedSignIn extends IdmsMessage { - const factory IdmsMessage_RequestedSignIn(final IdmsRequestedSignIn field0) = - _$IdmsMessage_RequestedSignInImpl; - const IdmsMessage_RequestedSignIn._() : super._(); - - @override - IdmsRequestedSignIn get field0; - - /// Create a copy of IdmsMessage - /// with the given fields replaced by the non-null parameter values. - @JsonKey(includeFromJson: false, includeToJson: false) - _$$IdmsMessage_RequestedSignInImplCopyWith<_$IdmsMessage_RequestedSignInImpl> - get copyWith => throw _privateConstructorUsedError; -} - -/// @nodoc -abstract class _$$IdmsMessage_TeardownSignInImplCopyWith<$Res> { - factory _$$IdmsMessage_TeardownSignInImplCopyWith( - _$IdmsMessage_TeardownSignInImpl value, - $Res Function(_$IdmsMessage_TeardownSignInImpl) then) = - __$$IdmsMessage_TeardownSignInImplCopyWithImpl<$Res>; - @useResult - $Res call({TeardownSignIn field0}); -} - -/// @nodoc -class __$$IdmsMessage_TeardownSignInImplCopyWithImpl<$Res> - extends _$IdmsMessageCopyWithImpl<$Res, _$IdmsMessage_TeardownSignInImpl> - implements _$$IdmsMessage_TeardownSignInImplCopyWith<$Res> { - __$$IdmsMessage_TeardownSignInImplCopyWithImpl( - _$IdmsMessage_TeardownSignInImpl _value, - $Res Function(_$IdmsMessage_TeardownSignInImpl) _then) - : super(_value, _then); - - /// Create a copy of IdmsMessage - /// with the given fields replaced by the non-null parameter values. - @pragma('vm:prefer-inline') - @override - $Res call({ - Object? field0 = null, - }) { - return _then(_$IdmsMessage_TeardownSignInImpl( - null == field0 - ? _value.field0 - : field0 // ignore: cast_nullable_to_non_nullable - as TeardownSignIn, - )); - } + } /// @nodoc -class _$IdmsMessage_TeardownSignInImpl extends IdmsMessage_TeardownSignIn { - const _$IdmsMessage_TeardownSignInImpl(this.field0) : super._(); - - @override - final TeardownSignIn field0; - - @override - String toString() { - return 'IdmsMessage.teardownSignIn(field0: $field0)'; - } - @override - bool operator ==(Object other) { - return identical(this, other) || - (other.runtimeType == runtimeType && - other is _$IdmsMessage_TeardownSignInImpl && - (identical(other.field0, field0) || other.field0 == field0)); - } +class FTMessage_LinkChanged extends FTMessage { + const FTMessage_LinkChanged({required this.guid}): super._(); - @override - int get hashCode => Object.hash(runtimeType, field0); - - /// Create a copy of IdmsMessage - /// with the given fields replaced by the non-null parameter values. - @JsonKey(includeFromJson: false, includeToJson: false) - @override - @pragma('vm:prefer-inline') - _$$IdmsMessage_TeardownSignInImplCopyWith<_$IdmsMessage_TeardownSignInImpl> - get copyWith => __$$IdmsMessage_TeardownSignInImplCopyWithImpl< - _$IdmsMessage_TeardownSignInImpl>(this, _$identity); - - @override - @optionalTypeArgs - TResult when({ - required TResult Function(IdmsRequestedSignIn field0) requestedSignIn, - required TResult Function(TeardownSignIn field0) teardownSignIn, - required TResult Function( - IdmsCircleMessage field0, IdmsRequestedSignIn? field1) - circleRequest, - }) { - return teardownSignIn(field0); - } - @override - @optionalTypeArgs - TResult? whenOrNull({ - TResult? Function(IdmsRequestedSignIn field0)? requestedSignIn, - TResult? Function(TeardownSignIn field0)? teardownSignIn, - TResult? Function(IdmsCircleMessage field0, IdmsRequestedSignIn? field1)? - circleRequest, - }) { - return teardownSignIn?.call(field0); - } + final String guid; - @override - @optionalTypeArgs - TResult maybeWhen({ - TResult Function(IdmsRequestedSignIn field0)? requestedSignIn, - TResult Function(TeardownSignIn field0)? teardownSignIn, - TResult Function(IdmsCircleMessage field0, IdmsRequestedSignIn? field1)? - circleRequest, - required TResult orElse(), - }) { - if (teardownSignIn != null) { - return teardownSignIn(field0); - } - return orElse(); - } +/// Create a copy of FTMessage +/// with the given fields replaced by the non-null parameter values. +@JsonKey(includeFromJson: false, includeToJson: false) +@pragma('vm:prefer-inline') +$FTMessage_LinkChangedCopyWith get copyWith => _$FTMessage_LinkChangedCopyWithImpl(this, _$identity); - @override - @optionalTypeArgs - TResult map({ - required TResult Function(IdmsMessage_RequestedSignIn value) - requestedSignIn, - required TResult Function(IdmsMessage_TeardownSignIn value) teardownSignIn, - required TResult Function(IdmsMessage_CircleRequest value) circleRequest, - }) { - return teardownSignIn(this); - } - @override - @optionalTypeArgs - TResult? mapOrNull({ - TResult? Function(IdmsMessage_RequestedSignIn value)? requestedSignIn, - TResult? Function(IdmsMessage_TeardownSignIn value)? teardownSignIn, - TResult? Function(IdmsMessage_CircleRequest value)? circleRequest, - }) { - return teardownSignIn?.call(this); - } - @override - @optionalTypeArgs - TResult maybeMap({ - TResult Function(IdmsMessage_RequestedSignIn value)? requestedSignIn, - TResult Function(IdmsMessage_TeardownSignIn value)? teardownSignIn, - TResult Function(IdmsMessage_CircleRequest value)? circleRequest, - required TResult orElse(), - }) { - if (teardownSignIn != null) { - return teardownSignIn(this); - } - return orElse(); - } +@override +bool operator ==(Object other) { + return identical(this, other) || (other.runtimeType == runtimeType&&other is FTMessage_LinkChanged&&(identical(other.guid, guid) || other.guid == guid)); } -abstract class IdmsMessage_TeardownSignIn extends IdmsMessage { - const factory IdmsMessage_TeardownSignIn(final TeardownSignIn field0) = - _$IdmsMessage_TeardownSignInImpl; - const IdmsMessage_TeardownSignIn._() : super._(); - - @override - TeardownSignIn get field0; - - /// Create a copy of IdmsMessage - /// with the given fields replaced by the non-null parameter values. - @JsonKey(includeFromJson: false, includeToJson: false) - _$$IdmsMessage_TeardownSignInImplCopyWith<_$IdmsMessage_TeardownSignInImpl> - get copyWith => throw _privateConstructorUsedError; -} - -/// @nodoc -abstract class _$$IdmsMessage_CircleRequestImplCopyWith<$Res> { - factory _$$IdmsMessage_CircleRequestImplCopyWith( - _$IdmsMessage_CircleRequestImpl value, - $Res Function(_$IdmsMessage_CircleRequestImpl) then) = - __$$IdmsMessage_CircleRequestImplCopyWithImpl<$Res>; - @useResult - $Res call({IdmsCircleMessage field0, IdmsRequestedSignIn? field1}); -} - -/// @nodoc -class __$$IdmsMessage_CircleRequestImplCopyWithImpl<$Res> - extends _$IdmsMessageCopyWithImpl<$Res, _$IdmsMessage_CircleRequestImpl> - implements _$$IdmsMessage_CircleRequestImplCopyWith<$Res> { - __$$IdmsMessage_CircleRequestImplCopyWithImpl( - _$IdmsMessage_CircleRequestImpl _value, - $Res Function(_$IdmsMessage_CircleRequestImpl) _then) - : super(_value, _then); - - /// Create a copy of IdmsMessage - /// with the given fields replaced by the non-null parameter values. - @pragma('vm:prefer-inline') - @override - $Res call({ - Object? field0 = null, - Object? field1 = freezed, - }) { - return _then(_$IdmsMessage_CircleRequestImpl( - null == field0 - ? _value.field0 - : field0 // ignore: cast_nullable_to_non_nullable - as IdmsCircleMessage, - freezed == field1 - ? _value.field1 - : field1 // ignore: cast_nullable_to_non_nullable - as IdmsRequestedSignIn?, - )); - } -} -/// @nodoc +@override +int get hashCode => Object.hash(runtimeType,guid); -class _$IdmsMessage_CircleRequestImpl extends IdmsMessage_CircleRequest { - const _$IdmsMessage_CircleRequestImpl(this.field0, [this.field1]) : super._(); +@override +String toString() { + return 'FTMessage.linkChanged(guid: $guid)'; +} - @override - final IdmsCircleMessage field0; - @override - final IdmsRequestedSignIn? field1; - @override - String toString() { - return 'IdmsMessage.circleRequest(field0: $field0, field1: $field1)'; - } +} - @override - bool operator ==(Object other) { - return identical(this, other) || - (other.runtimeType == runtimeType && - other is _$IdmsMessage_CircleRequestImpl && - (identical(other.field0, field0) || other.field0 == field0) && - (identical(other.field1, field1) || other.field1 == field1)); - } +/// @nodoc +abstract mixin class $FTMessage_LinkChangedCopyWith<$Res> implements $FTMessageCopyWith<$Res> { + factory $FTMessage_LinkChangedCopyWith(FTMessage_LinkChanged value, $Res Function(FTMessage_LinkChanged) _then) = _$FTMessage_LinkChangedCopyWithImpl; +@useResult +$Res call({ + String guid +}); - @override - int get hashCode => Object.hash(runtimeType, field0, field1); - - /// Create a copy of IdmsMessage - /// with the given fields replaced by the non-null parameter values. - @JsonKey(includeFromJson: false, includeToJson: false) - @override - @pragma('vm:prefer-inline') - _$$IdmsMessage_CircleRequestImplCopyWith<_$IdmsMessage_CircleRequestImpl> - get copyWith => __$$IdmsMessage_CircleRequestImplCopyWithImpl< - _$IdmsMessage_CircleRequestImpl>(this, _$identity); - - @override - @optionalTypeArgs - TResult when({ - required TResult Function(IdmsRequestedSignIn field0) requestedSignIn, - required TResult Function(TeardownSignIn field0) teardownSignIn, - required TResult Function( - IdmsCircleMessage field0, IdmsRequestedSignIn? field1) - circleRequest, - }) { - return circleRequest(field0, field1); - } - @override - @optionalTypeArgs - TResult? whenOrNull({ - TResult? Function(IdmsRequestedSignIn field0)? requestedSignIn, - TResult? Function(TeardownSignIn field0)? teardownSignIn, - TResult? Function(IdmsCircleMessage field0, IdmsRequestedSignIn? field1)? - circleRequest, - }) { - return circleRequest?.call(field0, field1); - } - @override - @optionalTypeArgs - TResult maybeWhen({ - TResult Function(IdmsRequestedSignIn field0)? requestedSignIn, - TResult Function(TeardownSignIn field0)? teardownSignIn, - TResult Function(IdmsCircleMessage field0, IdmsRequestedSignIn? field1)? - circleRequest, - required TResult orElse(), - }) { - if (circleRequest != null) { - return circleRequest(field0, field1); - } - return orElse(); - } - @override - @optionalTypeArgs - TResult map({ - required TResult Function(IdmsMessage_RequestedSignIn value) - requestedSignIn, - required TResult Function(IdmsMessage_TeardownSignIn value) teardownSignIn, - required TResult Function(IdmsMessage_CircleRequest value) circleRequest, - }) { - return circleRequest(this); - } +} +/// @nodoc +class _$FTMessage_LinkChangedCopyWithImpl<$Res> + implements $FTMessage_LinkChangedCopyWith<$Res> { + _$FTMessage_LinkChangedCopyWithImpl(this._self, this._then); - @override - @optionalTypeArgs - TResult? mapOrNull({ - TResult? Function(IdmsMessage_RequestedSignIn value)? requestedSignIn, - TResult? Function(IdmsMessage_TeardownSignIn value)? teardownSignIn, - TResult? Function(IdmsMessage_CircleRequest value)? circleRequest, - }) { - return circleRequest?.call(this); - } + final FTMessage_LinkChanged _self; + final $Res Function(FTMessage_LinkChanged) _then; - @override - @optionalTypeArgs - TResult maybeMap({ - TResult Function(IdmsMessage_RequestedSignIn value)? requestedSignIn, - TResult Function(IdmsMessage_TeardownSignIn value)? teardownSignIn, - TResult Function(IdmsMessage_CircleRequest value)? circleRequest, - required TResult orElse(), - }) { - if (circleRequest != null) { - return circleRequest(this); - } - return orElse(); - } +/// Create a copy of FTMessage +/// with the given fields replaced by the non-null parameter values. +@pragma('vm:prefer-inline') $Res call({Object? guid = null,}) { + return _then(FTMessage_LinkChanged( +guid: null == guid ? _self.guid : guid // ignore: cast_nullable_to_non_nullable +as String, + )); } -abstract class IdmsMessage_CircleRequest extends IdmsMessage { - const factory IdmsMessage_CircleRequest(final IdmsCircleMessage field0, - [final IdmsRequestedSignIn? field1]) = _$IdmsMessage_CircleRequestImpl; - const IdmsMessage_CircleRequest._() : super._(); - - @override - IdmsCircleMessage get field0; - IdmsRequestedSignIn? get field1; - /// Create a copy of IdmsMessage - /// with the given fields replaced by the non-null parameter values. - @JsonKey(includeFromJson: false, includeToJson: false) - _$$IdmsMessage_CircleRequestImplCopyWith<_$IdmsMessage_CircleRequestImpl> - get copyWith => throw _privateConstructorUsedError; } /// @nodoc -mixin _$LoginState { - @optionalTypeArgs - TResult when({ - required TResult Function() loggedIn, - required TResult Function() needsDevice2Fa, - required TResult Function() needs2FaVerification, - required TResult Function() needsSms2Fa, - required TResult Function(VerifyBody field0) needsSms2FaVerification, - required TResult Function(String field0) needsExtraStep, - required TResult Function() needsLogin, - }) => - throw _privateConstructorUsedError; - @optionalTypeArgs - TResult? whenOrNull({ - TResult? Function()? loggedIn, - TResult? Function()? needsDevice2Fa, - TResult? Function()? needs2FaVerification, - TResult? Function()? needsSms2Fa, - TResult? Function(VerifyBody field0)? needsSms2FaVerification, - TResult? Function(String field0)? needsExtraStep, - TResult? Function()? needsLogin, - }) => - throw _privateConstructorUsedError; - @optionalTypeArgs - TResult maybeWhen({ - TResult Function()? loggedIn, - TResult Function()? needsDevice2Fa, - TResult Function()? needs2FaVerification, - TResult Function()? needsSms2Fa, - TResult Function(VerifyBody field0)? needsSms2FaVerification, - TResult Function(String field0)? needsExtraStep, - TResult Function()? needsLogin, - required TResult orElse(), - }) => - throw _privateConstructorUsedError; - @optionalTypeArgs - TResult map({ - required TResult Function(LoginState_LoggedIn value) loggedIn, - required TResult Function(LoginState_NeedsDevice2FA value) needsDevice2Fa, - required TResult Function(LoginState_Needs2FAVerification value) - needs2FaVerification, - required TResult Function(LoginState_NeedsSMS2FA value) needsSms2Fa, - required TResult Function(LoginState_NeedsSMS2FAVerification value) - needsSms2FaVerification, - required TResult Function(LoginState_NeedsExtraStep value) needsExtraStep, - required TResult Function(LoginState_NeedsLogin value) needsLogin, - }) => - throw _privateConstructorUsedError; - @optionalTypeArgs - TResult? mapOrNull({ - TResult? Function(LoginState_LoggedIn value)? loggedIn, - TResult? Function(LoginState_NeedsDevice2FA value)? needsDevice2Fa, - TResult? Function(LoginState_Needs2FAVerification value)? - needs2FaVerification, - TResult? Function(LoginState_NeedsSMS2FA value)? needsSms2Fa, - TResult? Function(LoginState_NeedsSMS2FAVerification value)? - needsSms2FaVerification, - TResult? Function(LoginState_NeedsExtraStep value)? needsExtraStep, - TResult? Function(LoginState_NeedsLogin value)? needsLogin, - }) => - throw _privateConstructorUsedError; - @optionalTypeArgs - TResult maybeMap({ - TResult Function(LoginState_LoggedIn value)? loggedIn, - TResult Function(LoginState_NeedsDevice2FA value)? needsDevice2Fa, - TResult Function(LoginState_Needs2FAVerification value)? - needs2FaVerification, - TResult Function(LoginState_NeedsSMS2FA value)? needsSms2Fa, - TResult Function(LoginState_NeedsSMS2FAVerification value)? - needsSms2FaVerification, - TResult Function(LoginState_NeedsExtraStep value)? needsExtraStep, - TResult Function(LoginState_NeedsLogin value)? needsLogin, - required TResult orElse(), - }) => - throw _privateConstructorUsedError; -} - -/// @nodoc -abstract class $LoginStateCopyWith<$Res> { - factory $LoginStateCopyWith( - LoginState value, $Res Function(LoginState) then) = - _$LoginStateCopyWithImpl<$Res, LoginState>; -} - -/// @nodoc -class _$LoginStateCopyWithImpl<$Res, $Val extends LoginState> - implements $LoginStateCopyWith<$Res> { - _$LoginStateCopyWithImpl(this._value, this._then); - - // ignore: unused_field - final $Val _value; - // ignore: unused_field - final $Res Function($Val) _then; - - /// Create a copy of LoginState - /// with the given fields replaced by the non-null parameter values. -} - -/// @nodoc -abstract class _$$LoginState_LoggedInImplCopyWith<$Res> { - factory _$$LoginState_LoggedInImplCopyWith(_$LoginState_LoggedInImpl value, - $Res Function(_$LoginState_LoggedInImpl) then) = - __$$LoginState_LoggedInImplCopyWithImpl<$Res>; -} - -/// @nodoc -class __$$LoginState_LoggedInImplCopyWithImpl<$Res> - extends _$LoginStateCopyWithImpl<$Res, _$LoginState_LoggedInImpl> - implements _$$LoginState_LoggedInImplCopyWith<$Res> { - __$$LoginState_LoggedInImplCopyWithImpl(_$LoginState_LoggedInImpl _value, - $Res Function(_$LoginState_LoggedInImpl) _then) - : super(_value, _then); - - /// Create a copy of LoginState - /// with the given fields replaced by the non-null parameter values. -} - -/// @nodoc - -class _$LoginState_LoggedInImpl extends LoginState_LoggedIn { - const _$LoginState_LoggedInImpl() : super._(); - - @override - String toString() { - return 'LoginState.loggedIn()'; - } - @override - bool operator ==(Object other) { - return identical(this, other) || - (other.runtimeType == runtimeType && - other is _$LoginState_LoggedInImpl); - } - @override - int get hashCode => runtimeType.hashCode; - - @override - @optionalTypeArgs - TResult when({ - required TResult Function() loggedIn, - required TResult Function() needsDevice2Fa, - required TResult Function() needs2FaVerification, - required TResult Function() needsSms2Fa, - required TResult Function(VerifyBody field0) needsSms2FaVerification, - required TResult Function(String field0) needsExtraStep, - required TResult Function() needsLogin, - }) { - return loggedIn(); - } +class FTMessage_JoinEvent extends FTMessage { + const FTMessage_JoinEvent({required this.guid, required this.participant, required this.handle, required this.ring}): super._(); - @override - @optionalTypeArgs - TResult? whenOrNull({ - TResult? Function()? loggedIn, - TResult? Function()? needsDevice2Fa, - TResult? Function()? needs2FaVerification, - TResult? Function()? needsSms2Fa, - TResult? Function(VerifyBody field0)? needsSms2FaVerification, - TResult? Function(String field0)? needsExtraStep, - TResult? Function()? needsLogin, - }) { - return loggedIn?.call(); - } - @override - @optionalTypeArgs - TResult maybeWhen({ - TResult Function()? loggedIn, - TResult Function()? needsDevice2Fa, - TResult Function()? needs2FaVerification, - TResult Function()? needsSms2Fa, - TResult Function(VerifyBody field0)? needsSms2FaVerification, - TResult Function(String field0)? needsExtraStep, - TResult Function()? needsLogin, - required TResult orElse(), - }) { - if (loggedIn != null) { - return loggedIn(); - } - return orElse(); - } + final String guid; + final BigInt participant; + final String handle; + final bool ring; - @override - @optionalTypeArgs - TResult map({ - required TResult Function(LoginState_LoggedIn value) loggedIn, - required TResult Function(LoginState_NeedsDevice2FA value) needsDevice2Fa, - required TResult Function(LoginState_Needs2FAVerification value) - needs2FaVerification, - required TResult Function(LoginState_NeedsSMS2FA value) needsSms2Fa, - required TResult Function(LoginState_NeedsSMS2FAVerification value) - needsSms2FaVerification, - required TResult Function(LoginState_NeedsExtraStep value) needsExtraStep, - required TResult Function(LoginState_NeedsLogin value) needsLogin, - }) { - return loggedIn(this); - } +/// Create a copy of FTMessage +/// with the given fields replaced by the non-null parameter values. +@JsonKey(includeFromJson: false, includeToJson: false) +@pragma('vm:prefer-inline') +$FTMessage_JoinEventCopyWith get copyWith => _$FTMessage_JoinEventCopyWithImpl(this, _$identity); - @override - @optionalTypeArgs - TResult? mapOrNull({ - TResult? Function(LoginState_LoggedIn value)? loggedIn, - TResult? Function(LoginState_NeedsDevice2FA value)? needsDevice2Fa, - TResult? Function(LoginState_Needs2FAVerification value)? - needs2FaVerification, - TResult? Function(LoginState_NeedsSMS2FA value)? needsSms2Fa, - TResult? Function(LoginState_NeedsSMS2FAVerification value)? - needsSms2FaVerification, - TResult? Function(LoginState_NeedsExtraStep value)? needsExtraStep, - TResult? Function(LoginState_NeedsLogin value)? needsLogin, - }) { - return loggedIn?.call(this); - } - @override - @optionalTypeArgs - TResult maybeMap({ - TResult Function(LoginState_LoggedIn value)? loggedIn, - TResult Function(LoginState_NeedsDevice2FA value)? needsDevice2Fa, - TResult Function(LoginState_Needs2FAVerification value)? - needs2FaVerification, - TResult Function(LoginState_NeedsSMS2FA value)? needsSms2Fa, - TResult Function(LoginState_NeedsSMS2FAVerification value)? - needsSms2FaVerification, - TResult Function(LoginState_NeedsExtraStep value)? needsExtraStep, - TResult Function(LoginState_NeedsLogin value)? needsLogin, - required TResult orElse(), - }) { - if (loggedIn != null) { - return loggedIn(this); - } - return orElse(); - } + +@override +bool operator ==(Object other) { + return identical(this, other) || (other.runtimeType == runtimeType&&other is FTMessage_JoinEvent&&(identical(other.guid, guid) || other.guid == guid)&&(identical(other.participant, participant) || other.participant == participant)&&(identical(other.handle, handle) || other.handle == handle)&&(identical(other.ring, ring) || other.ring == ring)); } -abstract class LoginState_LoggedIn extends LoginState { - const factory LoginState_LoggedIn() = _$LoginState_LoggedInImpl; - const LoginState_LoggedIn._() : super._(); + +@override +int get hashCode => Object.hash(runtimeType,guid,participant,handle,ring); + +@override +String toString() { + return 'FTMessage.joinEvent(guid: $guid, participant: $participant, handle: $handle, ring: $ring)'; } -/// @nodoc -abstract class _$$LoginState_NeedsDevice2FAImplCopyWith<$Res> { - factory _$$LoginState_NeedsDevice2FAImplCopyWith( - _$LoginState_NeedsDevice2FAImpl value, - $Res Function(_$LoginState_NeedsDevice2FAImpl) then) = - __$$LoginState_NeedsDevice2FAImplCopyWithImpl<$Res>; + } /// @nodoc -class __$$LoginState_NeedsDevice2FAImplCopyWithImpl<$Res> - extends _$LoginStateCopyWithImpl<$Res, _$LoginState_NeedsDevice2FAImpl> - implements _$$LoginState_NeedsDevice2FAImplCopyWith<$Res> { - __$$LoginState_NeedsDevice2FAImplCopyWithImpl( - _$LoginState_NeedsDevice2FAImpl _value, - $Res Function(_$LoginState_NeedsDevice2FAImpl) _then) - : super(_value, _then); +abstract mixin class $FTMessage_JoinEventCopyWith<$Res> implements $FTMessageCopyWith<$Res> { + factory $FTMessage_JoinEventCopyWith(FTMessage_JoinEvent value, $Res Function(FTMessage_JoinEvent) _then) = _$FTMessage_JoinEventCopyWithImpl; +@useResult +$Res call({ + String guid, BigInt participant, String handle, bool ring +}); + - /// Create a copy of LoginState - /// with the given fields replaced by the non-null parameter values. -} + +} /// @nodoc +class _$FTMessage_JoinEventCopyWithImpl<$Res> + implements $FTMessage_JoinEventCopyWith<$Res> { + _$FTMessage_JoinEventCopyWithImpl(this._self, this._then); -class _$LoginState_NeedsDevice2FAImpl extends LoginState_NeedsDevice2FA { - const _$LoginState_NeedsDevice2FAImpl() : super._(); + final FTMessage_JoinEvent _self; + final $Res Function(FTMessage_JoinEvent) _then; - @override - String toString() { - return 'LoginState.needsDevice2Fa()'; - } +/// Create a copy of FTMessage +/// with the given fields replaced by the non-null parameter values. +@pragma('vm:prefer-inline') $Res call({Object? guid = null,Object? participant = null,Object? handle = null,Object? ring = null,}) { + return _then(FTMessage_JoinEvent( +guid: null == guid ? _self.guid : guid // ignore: cast_nullable_to_non_nullable +as String,participant: null == participant ? _self.participant : participant // ignore: cast_nullable_to_non_nullable +as BigInt,handle: null == handle ? _self.handle : handle // ignore: cast_nullable_to_non_nullable +as String,ring: null == ring ? _self.ring : ring // ignore: cast_nullable_to_non_nullable +as bool, + )); +} - @override - bool operator ==(Object other) { - return identical(this, other) || - (other.runtimeType == runtimeType && - other is _$LoginState_NeedsDevice2FAImpl); - } - @override - int get hashCode => runtimeType.hashCode; - - @override - @optionalTypeArgs - TResult when({ - required TResult Function() loggedIn, - required TResult Function() needsDevice2Fa, - required TResult Function() needs2FaVerification, - required TResult Function() needsSms2Fa, - required TResult Function(VerifyBody field0) needsSms2FaVerification, - required TResult Function(String field0) needsExtraStep, - required TResult Function() needsLogin, - }) { - return needsDevice2Fa(); - } +} - @override - @optionalTypeArgs - TResult? whenOrNull({ - TResult? Function()? loggedIn, - TResult? Function()? needsDevice2Fa, - TResult? Function()? needs2FaVerification, - TResult? Function()? needsSms2Fa, - TResult? Function(VerifyBody field0)? needsSms2FaVerification, - TResult? Function(String field0)? needsExtraStep, - TResult? Function()? needsLogin, - }) { - return needsDevice2Fa?.call(); - } +/// @nodoc - @override - @optionalTypeArgs - TResult maybeWhen({ - TResult Function()? loggedIn, - TResult Function()? needsDevice2Fa, - TResult Function()? needs2FaVerification, - TResult Function()? needsSms2Fa, - TResult Function(VerifyBody field0)? needsSms2FaVerification, - TResult Function(String field0)? needsExtraStep, - TResult Function()? needsLogin, - required TResult orElse(), - }) { - if (needsDevice2Fa != null) { - return needsDevice2Fa(); - } - return orElse(); - } - @override - @optionalTypeArgs - TResult map({ - required TResult Function(LoginState_LoggedIn value) loggedIn, - required TResult Function(LoginState_NeedsDevice2FA value) needsDevice2Fa, - required TResult Function(LoginState_Needs2FAVerification value) - needs2FaVerification, - required TResult Function(LoginState_NeedsSMS2FA value) needsSms2Fa, - required TResult Function(LoginState_NeedsSMS2FAVerification value) - needsSms2FaVerification, - required TResult Function(LoginState_NeedsExtraStep value) needsExtraStep, - required TResult Function(LoginState_NeedsLogin value) needsLogin, - }) { - return needsDevice2Fa(this); - } +class FTMessage_AddMembers extends FTMessage { + const FTMessage_AddMembers({required this.guid, required final Set members, required this.ring}): _members = members,super._(); - @override - @optionalTypeArgs - TResult? mapOrNull({ - TResult? Function(LoginState_LoggedIn value)? loggedIn, - TResult? Function(LoginState_NeedsDevice2FA value)? needsDevice2Fa, - TResult? Function(LoginState_Needs2FAVerification value)? - needs2FaVerification, - TResult? Function(LoginState_NeedsSMS2FA value)? needsSms2Fa, - TResult? Function(LoginState_NeedsSMS2FAVerification value)? - needsSms2FaVerification, - TResult? Function(LoginState_NeedsExtraStep value)? needsExtraStep, - TResult? Function(LoginState_NeedsLogin value)? needsLogin, - }) { - return needsDevice2Fa?.call(this); - } - @override - @optionalTypeArgs - TResult maybeMap({ - TResult Function(LoginState_LoggedIn value)? loggedIn, - TResult Function(LoginState_NeedsDevice2FA value)? needsDevice2Fa, - TResult Function(LoginState_Needs2FAVerification value)? - needs2FaVerification, - TResult Function(LoginState_NeedsSMS2FA value)? needsSms2Fa, - TResult Function(LoginState_NeedsSMS2FAVerification value)? - needsSms2FaVerification, - TResult Function(LoginState_NeedsExtraStep value)? needsExtraStep, - TResult Function(LoginState_NeedsLogin value)? needsLogin, - required TResult orElse(), - }) { - if (needsDevice2Fa != null) { - return needsDevice2Fa(this); - } - return orElse(); - } + final String guid; + final Set _members; + Set get members { + if (_members is EqualUnmodifiableSetView) return _members; + // ignore: implicit_dynamic_type + return EqualUnmodifiableSetView(_members); } -abstract class LoginState_NeedsDevice2FA extends LoginState { - const factory LoginState_NeedsDevice2FA() = _$LoginState_NeedsDevice2FAImpl; - const LoginState_NeedsDevice2FA._() : super._(); -} + final bool ring; + +/// Create a copy of FTMessage +/// with the given fields replaced by the non-null parameter values. +@JsonKey(includeFromJson: false, includeToJson: false) +@pragma('vm:prefer-inline') +$FTMessage_AddMembersCopyWith get copyWith => _$FTMessage_AddMembersCopyWithImpl(this, _$identity); -/// @nodoc -abstract class _$$LoginState_Needs2FAVerificationImplCopyWith<$Res> { - factory _$$LoginState_Needs2FAVerificationImplCopyWith( - _$LoginState_Needs2FAVerificationImpl value, - $Res Function(_$LoginState_Needs2FAVerificationImpl) then) = - __$$LoginState_Needs2FAVerificationImplCopyWithImpl<$Res>; -} -/// @nodoc -class __$$LoginState_Needs2FAVerificationImplCopyWithImpl<$Res> - extends _$LoginStateCopyWithImpl<$Res, - _$LoginState_Needs2FAVerificationImpl> - implements _$$LoginState_Needs2FAVerificationImplCopyWith<$Res> { - __$$LoginState_Needs2FAVerificationImplCopyWithImpl( - _$LoginState_Needs2FAVerificationImpl _value, - $Res Function(_$LoginState_Needs2FAVerificationImpl) _then) - : super(_value, _then); - /// Create a copy of LoginState - /// with the given fields replaced by the non-null parameter values. +@override +bool operator ==(Object other) { + return identical(this, other) || (other.runtimeType == runtimeType&&other is FTMessage_AddMembers&&(identical(other.guid, guid) || other.guid == guid)&&const DeepCollectionEquality().equals(other._members, _members)&&(identical(other.ring, ring) || other.ring == ring)); } -/// @nodoc -class _$LoginState_Needs2FAVerificationImpl - extends LoginState_Needs2FAVerification { - const _$LoginState_Needs2FAVerificationImpl() : super._(); +@override +int get hashCode => Object.hash(runtimeType,guid,const DeepCollectionEquality().hash(_members),ring); - @override - String toString() { - return 'LoginState.needs2FaVerification()'; - } +@override +String toString() { + return 'FTMessage.addMembers(guid: $guid, members: $members, ring: $ring)'; +} - @override - bool operator ==(Object other) { - return identical(this, other) || - (other.runtimeType == runtimeType && - other is _$LoginState_Needs2FAVerificationImpl); - } - @override - int get hashCode => runtimeType.hashCode; - - @override - @optionalTypeArgs - TResult when({ - required TResult Function() loggedIn, - required TResult Function() needsDevice2Fa, - required TResult Function() needs2FaVerification, - required TResult Function() needsSms2Fa, - required TResult Function(VerifyBody field0) needsSms2FaVerification, - required TResult Function(String field0) needsExtraStep, - required TResult Function() needsLogin, - }) { - return needs2FaVerification(); - } +} - @override - @optionalTypeArgs - TResult? whenOrNull({ - TResult? Function()? loggedIn, - TResult? Function()? needsDevice2Fa, - TResult? Function()? needs2FaVerification, - TResult? Function()? needsSms2Fa, - TResult? Function(VerifyBody field0)? needsSms2FaVerification, - TResult? Function(String field0)? needsExtraStep, - TResult? Function()? needsLogin, - }) { - return needs2FaVerification?.call(); - } +/// @nodoc +abstract mixin class $FTMessage_AddMembersCopyWith<$Res> implements $FTMessageCopyWith<$Res> { + factory $FTMessage_AddMembersCopyWith(FTMessage_AddMembers value, $Res Function(FTMessage_AddMembers) _then) = _$FTMessage_AddMembersCopyWithImpl; +@useResult +$Res call({ + String guid, Set members, bool ring +}); - @override - @optionalTypeArgs - TResult maybeWhen({ - TResult Function()? loggedIn, - TResult Function()? needsDevice2Fa, - TResult Function()? needs2FaVerification, - TResult Function()? needsSms2Fa, - TResult Function(VerifyBody field0)? needsSms2FaVerification, - TResult Function(String field0)? needsExtraStep, - TResult Function()? needsLogin, - required TResult orElse(), - }) { - if (needs2FaVerification != null) { - return needs2FaVerification(); - } - return orElse(); - } - @override - @optionalTypeArgs - TResult map({ - required TResult Function(LoginState_LoggedIn value) loggedIn, - required TResult Function(LoginState_NeedsDevice2FA value) needsDevice2Fa, - required TResult Function(LoginState_Needs2FAVerification value) - needs2FaVerification, - required TResult Function(LoginState_NeedsSMS2FA value) needsSms2Fa, - required TResult Function(LoginState_NeedsSMS2FAVerification value) - needsSms2FaVerification, - required TResult Function(LoginState_NeedsExtraStep value) needsExtraStep, - required TResult Function(LoginState_NeedsLogin value) needsLogin, - }) { - return needs2FaVerification(this); - } - @override - @optionalTypeArgs - TResult? mapOrNull({ - TResult? Function(LoginState_LoggedIn value)? loggedIn, - TResult? Function(LoginState_NeedsDevice2FA value)? needsDevice2Fa, - TResult? Function(LoginState_Needs2FAVerification value)? - needs2FaVerification, - TResult? Function(LoginState_NeedsSMS2FA value)? needsSms2Fa, - TResult? Function(LoginState_NeedsSMS2FAVerification value)? - needsSms2FaVerification, - TResult? Function(LoginState_NeedsExtraStep value)? needsExtraStep, - TResult? Function(LoginState_NeedsLogin value)? needsLogin, - }) { - return needs2FaVerification?.call(this); - } - @override - @optionalTypeArgs - TResult maybeMap({ - TResult Function(LoginState_LoggedIn value)? loggedIn, - TResult Function(LoginState_NeedsDevice2FA value)? needsDevice2Fa, - TResult Function(LoginState_Needs2FAVerification value)? - needs2FaVerification, - TResult Function(LoginState_NeedsSMS2FA value)? needsSms2Fa, - TResult Function(LoginState_NeedsSMS2FAVerification value)? - needsSms2FaVerification, - TResult Function(LoginState_NeedsExtraStep value)? needsExtraStep, - TResult Function(LoginState_NeedsLogin value)? needsLogin, - required TResult orElse(), - }) { - if (needs2FaVerification != null) { - return needs2FaVerification(this); - } - return orElse(); - } } +/// @nodoc +class _$FTMessage_AddMembersCopyWithImpl<$Res> + implements $FTMessage_AddMembersCopyWith<$Res> { + _$FTMessage_AddMembersCopyWithImpl(this._self, this._then); -abstract class LoginState_Needs2FAVerification extends LoginState { - const factory LoginState_Needs2FAVerification() = - _$LoginState_Needs2FAVerificationImpl; - const LoginState_Needs2FAVerification._() : super._(); -} + final FTMessage_AddMembers _self; + final $Res Function(FTMessage_AddMembers) _then; -/// @nodoc -abstract class _$$LoginState_NeedsSMS2FAImplCopyWith<$Res> { - factory _$$LoginState_NeedsSMS2FAImplCopyWith( - _$LoginState_NeedsSMS2FAImpl value, - $Res Function(_$LoginState_NeedsSMS2FAImpl) then) = - __$$LoginState_NeedsSMS2FAImplCopyWithImpl<$Res>; +/// Create a copy of FTMessage +/// with the given fields replaced by the non-null parameter values. +@pragma('vm:prefer-inline') $Res call({Object? guid = null,Object? members = null,Object? ring = null,}) { + return _then(FTMessage_AddMembers( +guid: null == guid ? _self.guid : guid // ignore: cast_nullable_to_non_nullable +as String,members: null == members ? _self._members : members // ignore: cast_nullable_to_non_nullable +as Set,ring: null == ring ? _self.ring : ring // ignore: cast_nullable_to_non_nullable +as bool, + )); } -/// @nodoc -class __$$LoginState_NeedsSMS2FAImplCopyWithImpl<$Res> - extends _$LoginStateCopyWithImpl<$Res, _$LoginState_NeedsSMS2FAImpl> - implements _$$LoginState_NeedsSMS2FAImplCopyWith<$Res> { - __$$LoginState_NeedsSMS2FAImplCopyWithImpl( - _$LoginState_NeedsSMS2FAImpl _value, - $Res Function(_$LoginState_NeedsSMS2FAImpl) _then) - : super(_value, _then); - /// Create a copy of LoginState - /// with the given fields replaced by the non-null parameter values. } /// @nodoc -class _$LoginState_NeedsSMS2FAImpl extends LoginState_NeedsSMS2FA { - const _$LoginState_NeedsSMS2FAImpl() : super._(); - @override - String toString() { - return 'LoginState.needsSms2Fa()'; - } +class FTMessage_RemoveMembers extends FTMessage { + const FTMessage_RemoveMembers({required this.guid, required final Set members}): _members = members,super._(); - @override - bool operator ==(Object other) { - return identical(this, other) || - (other.runtimeType == runtimeType && - other is _$LoginState_NeedsSMS2FAImpl); - } - @override - int get hashCode => runtimeType.hashCode; - - @override - @optionalTypeArgs - TResult when({ - required TResult Function() loggedIn, - required TResult Function() needsDevice2Fa, - required TResult Function() needs2FaVerification, - required TResult Function() needsSms2Fa, - required TResult Function(VerifyBody field0) needsSms2FaVerification, - required TResult Function(String field0) needsExtraStep, - required TResult Function() needsLogin, - }) { - return needsSms2Fa(); - } + final String guid; + final Set _members; + Set get members { + if (_members is EqualUnmodifiableSetView) return _members; + // ignore: implicit_dynamic_type + return EqualUnmodifiableSetView(_members); +} - @override - @optionalTypeArgs - TResult? whenOrNull({ - TResult? Function()? loggedIn, - TResult? Function()? needsDevice2Fa, - TResult? Function()? needs2FaVerification, - TResult? Function()? needsSms2Fa, - TResult? Function(VerifyBody field0)? needsSms2FaVerification, - TResult? Function(String field0)? needsExtraStep, - TResult? Function()? needsLogin, - }) { - return needsSms2Fa?.call(); - } - @override - @optionalTypeArgs - TResult maybeWhen({ - TResult Function()? loggedIn, - TResult Function()? needsDevice2Fa, - TResult Function()? needs2FaVerification, - TResult Function()? needsSms2Fa, - TResult Function(VerifyBody field0)? needsSms2FaVerification, - TResult Function(String field0)? needsExtraStep, - TResult Function()? needsLogin, - required TResult orElse(), - }) { - if (needsSms2Fa != null) { - return needsSms2Fa(); - } - return orElse(); - } +/// Create a copy of FTMessage +/// with the given fields replaced by the non-null parameter values. +@JsonKey(includeFromJson: false, includeToJson: false) +@pragma('vm:prefer-inline') +$FTMessage_RemoveMembersCopyWith get copyWith => _$FTMessage_RemoveMembersCopyWithImpl(this, _$identity); - @override - @optionalTypeArgs - TResult map({ - required TResult Function(LoginState_LoggedIn value) loggedIn, - required TResult Function(LoginState_NeedsDevice2FA value) needsDevice2Fa, - required TResult Function(LoginState_Needs2FAVerification value) - needs2FaVerification, - required TResult Function(LoginState_NeedsSMS2FA value) needsSms2Fa, - required TResult Function(LoginState_NeedsSMS2FAVerification value) - needsSms2FaVerification, - required TResult Function(LoginState_NeedsExtraStep value) needsExtraStep, - required TResult Function(LoginState_NeedsLogin value) needsLogin, - }) { - return needsSms2Fa(this); - } - @override - @optionalTypeArgs - TResult? mapOrNull({ - TResult? Function(LoginState_LoggedIn value)? loggedIn, - TResult? Function(LoginState_NeedsDevice2FA value)? needsDevice2Fa, - TResult? Function(LoginState_Needs2FAVerification value)? - needs2FaVerification, - TResult? Function(LoginState_NeedsSMS2FA value)? needsSms2Fa, - TResult? Function(LoginState_NeedsSMS2FAVerification value)? - needsSms2FaVerification, - TResult? Function(LoginState_NeedsExtraStep value)? needsExtraStep, - TResult? Function(LoginState_NeedsLogin value)? needsLogin, - }) { - return needsSms2Fa?.call(this); - } - @override - @optionalTypeArgs - TResult maybeMap({ - TResult Function(LoginState_LoggedIn value)? loggedIn, - TResult Function(LoginState_NeedsDevice2FA value)? needsDevice2Fa, - TResult Function(LoginState_Needs2FAVerification value)? - needs2FaVerification, - TResult Function(LoginState_NeedsSMS2FA value)? needsSms2Fa, - TResult Function(LoginState_NeedsSMS2FAVerification value)? - needsSms2FaVerification, - TResult Function(LoginState_NeedsExtraStep value)? needsExtraStep, - TResult Function(LoginState_NeedsLogin value)? needsLogin, - required TResult orElse(), - }) { - if (needsSms2Fa != null) { - return needsSms2Fa(this); - } - return orElse(); - } +@override +bool operator ==(Object other) { + return identical(this, other) || (other.runtimeType == runtimeType&&other is FTMessage_RemoveMembers&&(identical(other.guid, guid) || other.guid == guid)&&const DeepCollectionEquality().equals(other._members, _members)); } -abstract class LoginState_NeedsSMS2FA extends LoginState { - const factory LoginState_NeedsSMS2FA() = _$LoginState_NeedsSMS2FAImpl; - const LoginState_NeedsSMS2FA._() : super._(); -} - -/// @nodoc -abstract class _$$LoginState_NeedsSMS2FAVerificationImplCopyWith<$Res> { - factory _$$LoginState_NeedsSMS2FAVerificationImplCopyWith( - _$LoginState_NeedsSMS2FAVerificationImpl value, - $Res Function(_$LoginState_NeedsSMS2FAVerificationImpl) then) = - __$$LoginState_NeedsSMS2FAVerificationImplCopyWithImpl<$Res>; - @useResult - $Res call({VerifyBody field0}); -} - -/// @nodoc -class __$$LoginState_NeedsSMS2FAVerificationImplCopyWithImpl<$Res> - extends _$LoginStateCopyWithImpl<$Res, - _$LoginState_NeedsSMS2FAVerificationImpl> - implements _$$LoginState_NeedsSMS2FAVerificationImplCopyWith<$Res> { - __$$LoginState_NeedsSMS2FAVerificationImplCopyWithImpl( - _$LoginState_NeedsSMS2FAVerificationImpl _value, - $Res Function(_$LoginState_NeedsSMS2FAVerificationImpl) _then) - : super(_value, _then); - - /// Create a copy of LoginState - /// with the given fields replaced by the non-null parameter values. - @pragma('vm:prefer-inline') - @override - $Res call({ - Object? field0 = null, - }) { - return _then(_$LoginState_NeedsSMS2FAVerificationImpl( - null == field0 - ? _value.field0 - : field0 // ignore: cast_nullable_to_non_nullable - as VerifyBody, - )); - } -} -/// @nodoc +@override +int get hashCode => Object.hash(runtimeType,guid,const DeepCollectionEquality().hash(_members)); -class _$LoginState_NeedsSMS2FAVerificationImpl - extends LoginState_NeedsSMS2FAVerification { - const _$LoginState_NeedsSMS2FAVerificationImpl(this.field0) : super._(); +@override +String toString() { + return 'FTMessage.removeMembers(guid: $guid, members: $members)'; +} - @override - final VerifyBody field0; - @override - String toString() { - return 'LoginState.needsSms2FaVerification(field0: $field0)'; - } +} - @override - bool operator ==(Object other) { - return identical(this, other) || - (other.runtimeType == runtimeType && - other is _$LoginState_NeedsSMS2FAVerificationImpl && - (identical(other.field0, field0) || other.field0 == field0)); - } +/// @nodoc +abstract mixin class $FTMessage_RemoveMembersCopyWith<$Res> implements $FTMessageCopyWith<$Res> { + factory $FTMessage_RemoveMembersCopyWith(FTMessage_RemoveMembers value, $Res Function(FTMessage_RemoveMembers) _then) = _$FTMessage_RemoveMembersCopyWithImpl; +@useResult +$Res call({ + String guid, Set members +}); - @override - int get hashCode => Object.hash(runtimeType, field0); - - /// Create a copy of LoginState - /// with the given fields replaced by the non-null parameter values. - @JsonKey(includeFromJson: false, includeToJson: false) - @override - @pragma('vm:prefer-inline') - _$$LoginState_NeedsSMS2FAVerificationImplCopyWith< - _$LoginState_NeedsSMS2FAVerificationImpl> - get copyWith => __$$LoginState_NeedsSMS2FAVerificationImplCopyWithImpl< - _$LoginState_NeedsSMS2FAVerificationImpl>(this, _$identity); - - @override - @optionalTypeArgs - TResult when({ - required TResult Function() loggedIn, - required TResult Function() needsDevice2Fa, - required TResult Function() needs2FaVerification, - required TResult Function() needsSms2Fa, - required TResult Function(VerifyBody field0) needsSms2FaVerification, - required TResult Function(String field0) needsExtraStep, - required TResult Function() needsLogin, - }) { - return needsSms2FaVerification(field0); - } - @override - @optionalTypeArgs - TResult? whenOrNull({ - TResult? Function()? loggedIn, - TResult? Function()? needsDevice2Fa, - TResult? Function()? needs2FaVerification, - TResult? Function()? needsSms2Fa, - TResult? Function(VerifyBody field0)? needsSms2FaVerification, - TResult? Function(String field0)? needsExtraStep, - TResult? Function()? needsLogin, - }) { - return needsSms2FaVerification?.call(field0); - } - @override - @optionalTypeArgs - TResult maybeWhen({ - TResult Function()? loggedIn, - TResult Function()? needsDevice2Fa, - TResult Function()? needs2FaVerification, - TResult Function()? needsSms2Fa, - TResult Function(VerifyBody field0)? needsSms2FaVerification, - TResult Function(String field0)? needsExtraStep, - TResult Function()? needsLogin, - required TResult orElse(), - }) { - if (needsSms2FaVerification != null) { - return needsSms2FaVerification(field0); - } - return orElse(); - } - @override - @optionalTypeArgs - TResult map({ - required TResult Function(LoginState_LoggedIn value) loggedIn, - required TResult Function(LoginState_NeedsDevice2FA value) needsDevice2Fa, - required TResult Function(LoginState_Needs2FAVerification value) - needs2FaVerification, - required TResult Function(LoginState_NeedsSMS2FA value) needsSms2Fa, - required TResult Function(LoginState_NeedsSMS2FAVerification value) - needsSms2FaVerification, - required TResult Function(LoginState_NeedsExtraStep value) needsExtraStep, - required TResult Function(LoginState_NeedsLogin value) needsLogin, - }) { - return needsSms2FaVerification(this); - } +} +/// @nodoc +class _$FTMessage_RemoveMembersCopyWithImpl<$Res> + implements $FTMessage_RemoveMembersCopyWith<$Res> { + _$FTMessage_RemoveMembersCopyWithImpl(this._self, this._then); - @override - @optionalTypeArgs - TResult? mapOrNull({ - TResult? Function(LoginState_LoggedIn value)? loggedIn, - TResult? Function(LoginState_NeedsDevice2FA value)? needsDevice2Fa, - TResult? Function(LoginState_Needs2FAVerification value)? - needs2FaVerification, - TResult? Function(LoginState_NeedsSMS2FA value)? needsSms2Fa, - TResult? Function(LoginState_NeedsSMS2FAVerification value)? - needsSms2FaVerification, - TResult? Function(LoginState_NeedsExtraStep value)? needsExtraStep, - TResult? Function(LoginState_NeedsLogin value)? needsLogin, - }) { - return needsSms2FaVerification?.call(this); - } + final FTMessage_RemoveMembers _self; + final $Res Function(FTMessage_RemoveMembers) _then; - @override - @optionalTypeArgs - TResult maybeMap({ - TResult Function(LoginState_LoggedIn value)? loggedIn, - TResult Function(LoginState_NeedsDevice2FA value)? needsDevice2Fa, - TResult Function(LoginState_Needs2FAVerification value)? - needs2FaVerification, - TResult Function(LoginState_NeedsSMS2FA value)? needsSms2Fa, - TResult Function(LoginState_NeedsSMS2FAVerification value)? - needsSms2FaVerification, - TResult Function(LoginState_NeedsExtraStep value)? needsExtraStep, - TResult Function(LoginState_NeedsLogin value)? needsLogin, - required TResult orElse(), - }) { - if (needsSms2FaVerification != null) { - return needsSms2FaVerification(this); - } - return orElse(); - } +/// Create a copy of FTMessage +/// with the given fields replaced by the non-null parameter values. +@pragma('vm:prefer-inline') $Res call({Object? guid = null,Object? members = null,}) { + return _then(FTMessage_RemoveMembers( +guid: null == guid ? _self.guid : guid // ignore: cast_nullable_to_non_nullable +as String,members: null == members ? _self._members : members // ignore: cast_nullable_to_non_nullable +as Set, + )); } -abstract class LoginState_NeedsSMS2FAVerification extends LoginState { - const factory LoginState_NeedsSMS2FAVerification(final VerifyBody field0) = - _$LoginState_NeedsSMS2FAVerificationImpl; - const LoginState_NeedsSMS2FAVerification._() : super._(); - - VerifyBody get field0; - - /// Create a copy of LoginState - /// with the given fields replaced by the non-null parameter values. - @JsonKey(includeFromJson: false, includeToJson: false) - _$$LoginState_NeedsSMS2FAVerificationImplCopyWith< - _$LoginState_NeedsSMS2FAVerificationImpl> - get copyWith => throw _privateConstructorUsedError; -} - -/// @nodoc -abstract class _$$LoginState_NeedsExtraStepImplCopyWith<$Res> { - factory _$$LoginState_NeedsExtraStepImplCopyWith( - _$LoginState_NeedsExtraStepImpl value, - $Res Function(_$LoginState_NeedsExtraStepImpl) then) = - __$$LoginState_NeedsExtraStepImplCopyWithImpl<$Res>; - @useResult - $Res call({String field0}); -} - -/// @nodoc -class __$$LoginState_NeedsExtraStepImplCopyWithImpl<$Res> - extends _$LoginStateCopyWithImpl<$Res, _$LoginState_NeedsExtraStepImpl> - implements _$$LoginState_NeedsExtraStepImplCopyWith<$Res> { - __$$LoginState_NeedsExtraStepImplCopyWithImpl( - _$LoginState_NeedsExtraStepImpl _value, - $Res Function(_$LoginState_NeedsExtraStepImpl) _then) - : super(_value, _then); - - /// Create a copy of LoginState - /// with the given fields replaced by the non-null parameter values. - @pragma('vm:prefer-inline') - @override - $Res call({ - Object? field0 = null, - }) { - return _then(_$LoginState_NeedsExtraStepImpl( - null == field0 - ? _value.field0 - : field0 // ignore: cast_nullable_to_non_nullable - as String, - )); - } + } /// @nodoc -class _$LoginState_NeedsExtraStepImpl extends LoginState_NeedsExtraStep { - const _$LoginState_NeedsExtraStepImpl(this.field0) : super._(); - - @override - final String field0; - - @override - String toString() { - return 'LoginState.needsExtraStep(field0: $field0)'; - } - @override - bool operator ==(Object other) { - return identical(this, other) || - (other.runtimeType == runtimeType && - other is _$LoginState_NeedsExtraStepImpl && - (identical(other.field0, field0) || other.field0 == field0)); - } +class FTMessage_LeaveEvent extends FTMessage { + const FTMessage_LeaveEvent({required this.guid, required this.participant, required this.handle}): super._(); - @override - int get hashCode => Object.hash(runtimeType, field0); - - /// Create a copy of LoginState - /// with the given fields replaced by the non-null parameter values. - @JsonKey(includeFromJson: false, includeToJson: false) - @override - @pragma('vm:prefer-inline') - _$$LoginState_NeedsExtraStepImplCopyWith<_$LoginState_NeedsExtraStepImpl> - get copyWith => __$$LoginState_NeedsExtraStepImplCopyWithImpl< - _$LoginState_NeedsExtraStepImpl>(this, _$identity); - - @override - @optionalTypeArgs - TResult when({ - required TResult Function() loggedIn, - required TResult Function() needsDevice2Fa, - required TResult Function() needs2FaVerification, - required TResult Function() needsSms2Fa, - required TResult Function(VerifyBody field0) needsSms2FaVerification, - required TResult Function(String field0) needsExtraStep, - required TResult Function() needsLogin, - }) { - return needsExtraStep(field0); - } - @override - @optionalTypeArgs - TResult? whenOrNull({ - TResult? Function()? loggedIn, - TResult? Function()? needsDevice2Fa, - TResult? Function()? needs2FaVerification, - TResult? Function()? needsSms2Fa, - TResult? Function(VerifyBody field0)? needsSms2FaVerification, - TResult? Function(String field0)? needsExtraStep, - TResult? Function()? needsLogin, - }) { - return needsExtraStep?.call(field0); - } + final String guid; + final BigInt participant; + final String handle; - @override - @optionalTypeArgs - TResult maybeWhen({ - TResult Function()? loggedIn, - TResult Function()? needsDevice2Fa, - TResult Function()? needs2FaVerification, - TResult Function()? needsSms2Fa, - TResult Function(VerifyBody field0)? needsSms2FaVerification, - TResult Function(String field0)? needsExtraStep, - TResult Function()? needsLogin, - required TResult orElse(), - }) { - if (needsExtraStep != null) { - return needsExtraStep(field0); - } - return orElse(); - } +/// Create a copy of FTMessage +/// with the given fields replaced by the non-null parameter values. +@JsonKey(includeFromJson: false, includeToJson: false) +@pragma('vm:prefer-inline') +$FTMessage_LeaveEventCopyWith get copyWith => _$FTMessage_LeaveEventCopyWithImpl(this, _$identity); - @override - @optionalTypeArgs - TResult map({ - required TResult Function(LoginState_LoggedIn value) loggedIn, - required TResult Function(LoginState_NeedsDevice2FA value) needsDevice2Fa, - required TResult Function(LoginState_Needs2FAVerification value) - needs2FaVerification, - required TResult Function(LoginState_NeedsSMS2FA value) needsSms2Fa, - required TResult Function(LoginState_NeedsSMS2FAVerification value) - needsSms2FaVerification, - required TResult Function(LoginState_NeedsExtraStep value) needsExtraStep, - required TResult Function(LoginState_NeedsLogin value) needsLogin, - }) { - return needsExtraStep(this); - } - @override - @optionalTypeArgs - TResult? mapOrNull({ - TResult? Function(LoginState_LoggedIn value)? loggedIn, - TResult? Function(LoginState_NeedsDevice2FA value)? needsDevice2Fa, - TResult? Function(LoginState_Needs2FAVerification value)? - needs2FaVerification, - TResult? Function(LoginState_NeedsSMS2FA value)? needsSms2Fa, - TResult? Function(LoginState_NeedsSMS2FAVerification value)? - needsSms2FaVerification, - TResult? Function(LoginState_NeedsExtraStep value)? needsExtraStep, - TResult? Function(LoginState_NeedsLogin value)? needsLogin, - }) { - return needsExtraStep?.call(this); - } - @override - @optionalTypeArgs - TResult maybeMap({ - TResult Function(LoginState_LoggedIn value)? loggedIn, - TResult Function(LoginState_NeedsDevice2FA value)? needsDevice2Fa, - TResult Function(LoginState_Needs2FAVerification value)? - needs2FaVerification, - TResult Function(LoginState_NeedsSMS2FA value)? needsSms2Fa, - TResult Function(LoginState_NeedsSMS2FAVerification value)? - needsSms2FaVerification, - TResult Function(LoginState_NeedsExtraStep value)? needsExtraStep, - TResult Function(LoginState_NeedsLogin value)? needsLogin, - required TResult orElse(), - }) { - if (needsExtraStep != null) { - return needsExtraStep(this); - } - return orElse(); - } +@override +bool operator ==(Object other) { + return identical(this, other) || (other.runtimeType == runtimeType&&other is FTMessage_LeaveEvent&&(identical(other.guid, guid) || other.guid == guid)&&(identical(other.participant, participant) || other.participant == participant)&&(identical(other.handle, handle) || other.handle == handle)); } -abstract class LoginState_NeedsExtraStep extends LoginState { - const factory LoginState_NeedsExtraStep(final String field0) = - _$LoginState_NeedsExtraStepImpl; - const LoginState_NeedsExtraStep._() : super._(); - - String get field0; - /// Create a copy of LoginState - /// with the given fields replaced by the non-null parameter values. - @JsonKey(includeFromJson: false, includeToJson: false) - _$$LoginState_NeedsExtraStepImplCopyWith<_$LoginState_NeedsExtraStepImpl> - get copyWith => throw _privateConstructorUsedError; -} +@override +int get hashCode => Object.hash(runtimeType,guid,participant,handle); -/// @nodoc -abstract class _$$LoginState_NeedsLoginImplCopyWith<$Res> { - factory _$$LoginState_NeedsLoginImplCopyWith( - _$LoginState_NeedsLoginImpl value, - $Res Function(_$LoginState_NeedsLoginImpl) then) = - __$$LoginState_NeedsLoginImplCopyWithImpl<$Res>; +@override +String toString() { + return 'FTMessage.leaveEvent(guid: $guid, participant: $participant, handle: $handle)'; } -/// @nodoc -class __$$LoginState_NeedsLoginImplCopyWithImpl<$Res> - extends _$LoginStateCopyWithImpl<$Res, _$LoginState_NeedsLoginImpl> - implements _$$LoginState_NeedsLoginImplCopyWith<$Res> { - __$$LoginState_NeedsLoginImplCopyWithImpl(_$LoginState_NeedsLoginImpl _value, - $Res Function(_$LoginState_NeedsLoginImpl) _then) - : super(_value, _then); - /// Create a copy of LoginState - /// with the given fields replaced by the non-null parameter values. } /// @nodoc +abstract mixin class $FTMessage_LeaveEventCopyWith<$Res> implements $FTMessageCopyWith<$Res> { + factory $FTMessage_LeaveEventCopyWith(FTMessage_LeaveEvent value, $Res Function(FTMessage_LeaveEvent) _then) = _$FTMessage_LeaveEventCopyWithImpl; +@useResult +$Res call({ + String guid, BigInt participant, String handle +}); -class _$LoginState_NeedsLoginImpl extends LoginState_NeedsLogin { - const _$LoginState_NeedsLoginImpl() : super._(); - - @override - String toString() { - return 'LoginState.needsLogin()'; - } - - @override - bool operator ==(Object other) { - return identical(this, other) || - (other.runtimeType == runtimeType && - other is _$LoginState_NeedsLoginImpl); - } - - @override - int get hashCode => runtimeType.hashCode; - - @override - @optionalTypeArgs - TResult when({ - required TResult Function() loggedIn, - required TResult Function() needsDevice2Fa, - required TResult Function() needs2FaVerification, - required TResult Function() needsSms2Fa, - required TResult Function(VerifyBody field0) needsSms2FaVerification, - required TResult Function(String field0) needsExtraStep, - required TResult Function() needsLogin, - }) { - return needsLogin(); - } - @override - @optionalTypeArgs - TResult? whenOrNull({ - TResult? Function()? loggedIn, - TResult? Function()? needsDevice2Fa, - TResult? Function()? needs2FaVerification, - TResult? Function()? needsSms2Fa, - TResult? Function(VerifyBody field0)? needsSms2FaVerification, - TResult? Function(String field0)? needsExtraStep, - TResult? Function()? needsLogin, - }) { - return needsLogin?.call(); - } - @override - @optionalTypeArgs - TResult maybeWhen({ - TResult Function()? loggedIn, - TResult Function()? needsDevice2Fa, - TResult Function()? needs2FaVerification, - TResult Function()? needsSms2Fa, - TResult Function(VerifyBody field0)? needsSms2FaVerification, - TResult Function(String field0)? needsExtraStep, - TResult Function()? needsLogin, - required TResult orElse(), - }) { - if (needsLogin != null) { - return needsLogin(); - } - return orElse(); - } - @override - @optionalTypeArgs - TResult map({ - required TResult Function(LoginState_LoggedIn value) loggedIn, - required TResult Function(LoginState_NeedsDevice2FA value) needsDevice2Fa, - required TResult Function(LoginState_Needs2FAVerification value) - needs2FaVerification, - required TResult Function(LoginState_NeedsSMS2FA value) needsSms2Fa, - required TResult Function(LoginState_NeedsSMS2FAVerification value) - needsSms2FaVerification, - required TResult Function(LoginState_NeedsExtraStep value) needsExtraStep, - required TResult Function(LoginState_NeedsLogin value) needsLogin, - }) { - return needsLogin(this); - } +} +/// @nodoc +class _$FTMessage_LeaveEventCopyWithImpl<$Res> + implements $FTMessage_LeaveEventCopyWith<$Res> { + _$FTMessage_LeaveEventCopyWithImpl(this._self, this._then); - @override - @optionalTypeArgs - TResult? mapOrNull({ - TResult? Function(LoginState_LoggedIn value)? loggedIn, - TResult? Function(LoginState_NeedsDevice2FA value)? needsDevice2Fa, - TResult? Function(LoginState_Needs2FAVerification value)? - needs2FaVerification, - TResult? Function(LoginState_NeedsSMS2FA value)? needsSms2Fa, - TResult? Function(LoginState_NeedsSMS2FAVerification value)? - needsSms2FaVerification, - TResult? Function(LoginState_NeedsExtraStep value)? needsExtraStep, - TResult? Function(LoginState_NeedsLogin value)? needsLogin, - }) { - return needsLogin?.call(this); - } + final FTMessage_LeaveEvent _self; + final $Res Function(FTMessage_LeaveEvent) _then; - @override - @optionalTypeArgs - TResult maybeMap({ - TResult Function(LoginState_LoggedIn value)? loggedIn, - TResult Function(LoginState_NeedsDevice2FA value)? needsDevice2Fa, - TResult Function(LoginState_Needs2FAVerification value)? - needs2FaVerification, - TResult Function(LoginState_NeedsSMS2FA value)? needsSms2Fa, - TResult Function(LoginState_NeedsSMS2FAVerification value)? - needsSms2FaVerification, - TResult Function(LoginState_NeedsExtraStep value)? needsExtraStep, - TResult Function(LoginState_NeedsLogin value)? needsLogin, - required TResult orElse(), - }) { - if (needsLogin != null) { - return needsLogin(this); - } - return orElse(); - } +/// Create a copy of FTMessage +/// with the given fields replaced by the non-null parameter values. +@pragma('vm:prefer-inline') $Res call({Object? guid = null,Object? participant = null,Object? handle = null,}) { + return _then(FTMessage_LeaveEvent( +guid: null == guid ? _self.guid : guid // ignore: cast_nullable_to_non_nullable +as String,participant: null == participant ? _self.participant : participant // ignore: cast_nullable_to_non_nullable +as BigInt,handle: null == handle ? _self.handle : handle // ignore: cast_nullable_to_non_nullable +as String, + )); } -abstract class LoginState_NeedsLogin extends LoginState { - const factory LoginState_NeedsLogin() = _$LoginState_NeedsLoginImpl; - const LoginState_NeedsLogin._() : super._(); -} -/// @nodoc -mixin _$LPSpecializationMetadata { - String get groupName => throw _privateConstructorUsedError; - String get urlParameters => throw _privateConstructorUsedError; - @optionalTypeArgs - TResult when({ - required TResult Function(String groupName, String urlParameters) - lpPasswordsInviteMetadata, - }) => - throw _privateConstructorUsedError; - @optionalTypeArgs - TResult? whenOrNull({ - TResult? Function(String groupName, String urlParameters)? - lpPasswordsInviteMetadata, - }) => - throw _privateConstructorUsedError; - @optionalTypeArgs - TResult maybeWhen({ - TResult Function(String groupName, String urlParameters)? - lpPasswordsInviteMetadata, - required TResult orElse(), - }) => - throw _privateConstructorUsedError; - @optionalTypeArgs - TResult map({ - required TResult Function( - LPSpecializationMetadata_LPPasswordsInviteMetadata value) - lpPasswordsInviteMetadata, - }) => - throw _privateConstructorUsedError; - @optionalTypeArgs - TResult? mapOrNull({ - TResult? Function(LPSpecializationMetadata_LPPasswordsInviteMetadata value)? - lpPasswordsInviteMetadata, - }) => - throw _privateConstructorUsedError; - @optionalTypeArgs - TResult maybeMap({ - TResult Function(LPSpecializationMetadata_LPPasswordsInviteMetadata value)? - lpPasswordsInviteMetadata, - required TResult orElse(), - }) => - throw _privateConstructorUsedError; - - /// Create a copy of LPSpecializationMetadata - /// with the given fields replaced by the non-null parameter values. - @JsonKey(includeFromJson: false, includeToJson: false) - $LPSpecializationMetadataCopyWith get copyWith => - throw _privateConstructorUsedError; -} - -/// @nodoc -abstract class $LPSpecializationMetadataCopyWith<$Res> { - factory $LPSpecializationMetadataCopyWith(LPSpecializationMetadata value, - $Res Function(LPSpecializationMetadata) then) = - _$LPSpecializationMetadataCopyWithImpl<$Res, LPSpecializationMetadata>; - @useResult - $Res call({String groupName, String urlParameters}); -} - -/// @nodoc -class _$LPSpecializationMetadataCopyWithImpl<$Res, - $Val extends LPSpecializationMetadata> - implements $LPSpecializationMetadataCopyWith<$Res> { - _$LPSpecializationMetadataCopyWithImpl(this._value, this._then); - - // ignore: unused_field - final $Val _value; - // ignore: unused_field - final $Res Function($Val) _then; - - /// Create a copy of LPSpecializationMetadata - /// with the given fields replaced by the non-null parameter values. - @pragma('vm:prefer-inline') - @override - $Res call({ - Object? groupName = null, - Object? urlParameters = null, - }) { - return _then(_value.copyWith( - groupName: null == groupName - ? _value.groupName - : groupName // ignore: cast_nullable_to_non_nullable - as String, - urlParameters: null == urlParameters - ? _value.urlParameters - : urlParameters // ignore: cast_nullable_to_non_nullable - as String, - ) as $Val); - } } /// @nodoc -abstract class _$$LPSpecializationMetadata_LPPasswordsInviteMetadataImplCopyWith< - $Res> implements $LPSpecializationMetadataCopyWith<$Res> { - factory _$$LPSpecializationMetadata_LPPasswordsInviteMetadataImplCopyWith( - _$LPSpecializationMetadata_LPPasswordsInviteMetadataImpl value, - $Res Function( - _$LPSpecializationMetadata_LPPasswordsInviteMetadataImpl) - then) = - __$$LPSpecializationMetadata_LPPasswordsInviteMetadataImplCopyWithImpl< - $Res>; - @override - @useResult - $Res call({String groupName, String urlParameters}); -} - -/// @nodoc -class __$$LPSpecializationMetadata_LPPasswordsInviteMetadataImplCopyWithImpl< - $Res> - extends _$LPSpecializationMetadataCopyWithImpl<$Res, - _$LPSpecializationMetadata_LPPasswordsInviteMetadataImpl> - implements - _$$LPSpecializationMetadata_LPPasswordsInviteMetadataImplCopyWith< - $Res> { - __$$LPSpecializationMetadata_LPPasswordsInviteMetadataImplCopyWithImpl( - _$LPSpecializationMetadata_LPPasswordsInviteMetadataImpl _value, - $Res Function(_$LPSpecializationMetadata_LPPasswordsInviteMetadataImpl) - _then) - : super(_value, _then); - - /// Create a copy of LPSpecializationMetadata - /// with the given fields replaced by the non-null parameter values. - @pragma('vm:prefer-inline') - @override - $Res call({ - Object? groupName = null, - Object? urlParameters = null, - }) { - return _then(_$LPSpecializationMetadata_LPPasswordsInviteMetadataImpl( - groupName: null == groupName - ? _value.groupName - : groupName // ignore: cast_nullable_to_non_nullable - as String, - urlParameters: null == urlParameters - ? _value.urlParameters - : urlParameters // ignore: cast_nullable_to_non_nullable - as String, - )); - } -} -/// @nodoc -class _$LPSpecializationMetadata_LPPasswordsInviteMetadataImpl - extends LPSpecializationMetadata_LPPasswordsInviteMetadata { - const _$LPSpecializationMetadata_LPPasswordsInviteMetadataImpl( - {required this.groupName, required this.urlParameters}) - : super._(); +class FTMessage_Ring extends FTMessage { + const FTMessage_Ring({required this.guid}): super._(); - @override - final String groupName; - @override - final String urlParameters; - @override - String toString() { - return 'LPSpecializationMetadata.lpPasswordsInviteMetadata(groupName: $groupName, urlParameters: $urlParameters)'; - } + final String guid; - @override - bool operator ==(Object other) { - return identical(this, other) || - (other.runtimeType == runtimeType && - other is _$LPSpecializationMetadata_LPPasswordsInviteMetadataImpl && - (identical(other.groupName, groupName) || - other.groupName == groupName) && - (identical(other.urlParameters, urlParameters) || - other.urlParameters == urlParameters)); - } +/// Create a copy of FTMessage +/// with the given fields replaced by the non-null parameter values. +@JsonKey(includeFromJson: false, includeToJson: false) +@pragma('vm:prefer-inline') +$FTMessage_RingCopyWith get copyWith => _$FTMessage_RingCopyWithImpl(this, _$identity); - @override - int get hashCode => Object.hash(runtimeType, groupName, urlParameters); - - /// Create a copy of LPSpecializationMetadata - /// with the given fields replaced by the non-null parameter values. - @JsonKey(includeFromJson: false, includeToJson: false) - @override - @pragma('vm:prefer-inline') - _$$LPSpecializationMetadata_LPPasswordsInviteMetadataImplCopyWith< - _$LPSpecializationMetadata_LPPasswordsInviteMetadataImpl> - get copyWith => - __$$LPSpecializationMetadata_LPPasswordsInviteMetadataImplCopyWithImpl< - _$LPSpecializationMetadata_LPPasswordsInviteMetadataImpl>( - this, _$identity); - - @override - @optionalTypeArgs - TResult when({ - required TResult Function(String groupName, String urlParameters) - lpPasswordsInviteMetadata, - }) { - return lpPasswordsInviteMetadata(groupName, urlParameters); - } - @override - @optionalTypeArgs - TResult? whenOrNull({ - TResult? Function(String groupName, String urlParameters)? - lpPasswordsInviteMetadata, - }) { - return lpPasswordsInviteMetadata?.call(groupName, urlParameters); - } - @override - @optionalTypeArgs - TResult maybeWhen({ - TResult Function(String groupName, String urlParameters)? - lpPasswordsInviteMetadata, - required TResult orElse(), - }) { - if (lpPasswordsInviteMetadata != null) { - return lpPasswordsInviteMetadata(groupName, urlParameters); - } - return orElse(); - } +@override +bool operator ==(Object other) { + return identical(this, other) || (other.runtimeType == runtimeType&&other is FTMessage_Ring&&(identical(other.guid, guid) || other.guid == guid)); +} - @override - @optionalTypeArgs - TResult map({ - required TResult Function( - LPSpecializationMetadata_LPPasswordsInviteMetadata value) - lpPasswordsInviteMetadata, - }) { - return lpPasswordsInviteMetadata(this); - } - @override - @optionalTypeArgs - TResult? mapOrNull({ - TResult? Function(LPSpecializationMetadata_LPPasswordsInviteMetadata value)? - lpPasswordsInviteMetadata, - }) { - return lpPasswordsInviteMetadata?.call(this); - } +@override +int get hashCode => Object.hash(runtimeType,guid); - @override - @optionalTypeArgs - TResult maybeMap({ - TResult Function(LPSpecializationMetadata_LPPasswordsInviteMetadata value)? - lpPasswordsInviteMetadata, - required TResult orElse(), - }) { - if (lpPasswordsInviteMetadata != null) { - return lpPasswordsInviteMetadata(this); - } - return orElse(); - } +@override +String toString() { + return 'FTMessage.ring(guid: $guid)'; } -abstract class LPSpecializationMetadata_LPPasswordsInviteMetadata - extends LPSpecializationMetadata { - const factory LPSpecializationMetadata_LPPasswordsInviteMetadata( - {required final String groupName, - required final String urlParameters}) = - _$LPSpecializationMetadata_LPPasswordsInviteMetadataImpl; - const LPSpecializationMetadata_LPPasswordsInviteMetadata._() : super._(); - - @override - String get groupName; - @override - String get urlParameters; - /// Create a copy of LPSpecializationMetadata - /// with the given fields replaced by the non-null parameter values. - @override - @JsonKey(includeFromJson: false, includeToJson: false) - _$$LPSpecializationMetadata_LPPasswordsInviteMetadataImplCopyWith< - _$LPSpecializationMetadata_LPPasswordsInviteMetadataImpl> - get copyWith => throw _privateConstructorUsedError; } /// @nodoc -mixin _$Message { - @optionalTypeArgs - TResult when({ - required TResult Function(NormalMessage field0) message, - required TResult Function(RenameMessage field0) renameMessage, - required TResult Function(ChangeParticipantMessage field0) - changeParticipants, - required TResult Function(ReactMessage field0) react, - required TResult Function() delivered, - required TResult Function() read, - required TResult Function(bool field0, TypingApp? field1) typing, - required TResult Function(UnsendMessage field0) unsend, - required TResult Function(EditMessage field0) edit, - required TResult Function(IconChangeMessage field0) iconChange, - required TResult Function(bool field0) enableSmsActivation, - required TResult Function() messageReadOnDevice, - required TResult Function(bool field0) smsConfirmSent, - required TResult Function() markUnread, - required TResult Function() peerCacheInvalidate, - required TResult Function(UpdateExtensionMessage field0) updateExtension, - required TResult Function(ErrorMessage field0) error, - required TResult Function(MoveToRecycleBinMessage field0) moveToRecycleBin, - required TResult Function(OperatedChat field0) recoverChat, - required TResult Function(PermanentDeleteMessage field0) permanentDelete, - required TResult Function() unschedule, - required TResult Function(UpdateProfileMessage field0) updateProfile, - required TResult Function(UpdateProfileSharingMessage field0) - updateProfileSharing, - required TResult Function(ShareProfileMessage field0) shareProfile, - required TResult Function() notifyAnyways, - required TResult Function(SetTranscriptBackgroundMessage field0) - setTranscriptBackground, - }) => - throw _privateConstructorUsedError; - @optionalTypeArgs - TResult? whenOrNull({ - TResult? Function(NormalMessage field0)? message, - TResult? Function(RenameMessage field0)? renameMessage, - TResult? Function(ChangeParticipantMessage field0)? changeParticipants, - TResult? Function(ReactMessage field0)? react, - TResult? Function()? delivered, - TResult? Function()? read, - TResult? Function(bool field0, TypingApp? field1)? typing, - TResult? Function(UnsendMessage field0)? unsend, - TResult? Function(EditMessage field0)? edit, - TResult? Function(IconChangeMessage field0)? iconChange, - TResult? Function(bool field0)? enableSmsActivation, - TResult? Function()? messageReadOnDevice, - TResult? Function(bool field0)? smsConfirmSent, - TResult? Function()? markUnread, - TResult? Function()? peerCacheInvalidate, - TResult? Function(UpdateExtensionMessage field0)? updateExtension, - TResult? Function(ErrorMessage field0)? error, - TResult? Function(MoveToRecycleBinMessage field0)? moveToRecycleBin, - TResult? Function(OperatedChat field0)? recoverChat, - TResult? Function(PermanentDeleteMessage field0)? permanentDelete, - TResult? Function()? unschedule, - TResult? Function(UpdateProfileMessage field0)? updateProfile, - TResult? Function(UpdateProfileSharingMessage field0)? updateProfileSharing, - TResult? Function(ShareProfileMessage field0)? shareProfile, - TResult? Function()? notifyAnyways, - TResult? Function(SetTranscriptBackgroundMessage field0)? - setTranscriptBackground, - }) => - throw _privateConstructorUsedError; - @optionalTypeArgs - TResult maybeWhen({ - TResult Function(NormalMessage field0)? message, - TResult Function(RenameMessage field0)? renameMessage, - TResult Function(ChangeParticipantMessage field0)? changeParticipants, - TResult Function(ReactMessage field0)? react, - TResult Function()? delivered, - TResult Function()? read, - TResult Function(bool field0, TypingApp? field1)? typing, - TResult Function(UnsendMessage field0)? unsend, - TResult Function(EditMessage field0)? edit, - TResult Function(IconChangeMessage field0)? iconChange, - TResult Function(bool field0)? enableSmsActivation, - TResult Function()? messageReadOnDevice, - TResult Function(bool field0)? smsConfirmSent, - TResult Function()? markUnread, - TResult Function()? peerCacheInvalidate, - TResult Function(UpdateExtensionMessage field0)? updateExtension, - TResult Function(ErrorMessage field0)? error, - TResult Function(MoveToRecycleBinMessage field0)? moveToRecycleBin, - TResult Function(OperatedChat field0)? recoverChat, - TResult Function(PermanentDeleteMessage field0)? permanentDelete, - TResult Function()? unschedule, - TResult Function(UpdateProfileMessage field0)? updateProfile, - TResult Function(UpdateProfileSharingMessage field0)? updateProfileSharing, - TResult Function(ShareProfileMessage field0)? shareProfile, - TResult Function()? notifyAnyways, - TResult Function(SetTranscriptBackgroundMessage field0)? - setTranscriptBackground, - required TResult orElse(), - }) => - throw _privateConstructorUsedError; - @optionalTypeArgs - TResult map({ - required TResult Function(Message_Message value) message, - required TResult Function(Message_RenameMessage value) renameMessage, - required TResult Function(Message_ChangeParticipants value) - changeParticipants, - required TResult Function(Message_React value) react, - required TResult Function(Message_Delivered value) delivered, - required TResult Function(Message_Read value) read, - required TResult Function(Message_Typing value) typing, - required TResult Function(Message_Unsend value) unsend, - required TResult Function(Message_Edit value) edit, - required TResult Function(Message_IconChange value) iconChange, - required TResult Function(Message_EnableSmsActivation value) - enableSmsActivation, - required TResult Function(Message_MessageReadOnDevice value) - messageReadOnDevice, - required TResult Function(Message_SmsConfirmSent value) smsConfirmSent, - required TResult Function(Message_MarkUnread value) markUnread, - required TResult Function(Message_PeerCacheInvalidate value) - peerCacheInvalidate, - required TResult Function(Message_UpdateExtension value) updateExtension, - required TResult Function(Message_Error value) error, - required TResult Function(Message_MoveToRecycleBin value) moveToRecycleBin, - required TResult Function(Message_RecoverChat value) recoverChat, - required TResult Function(Message_PermanentDelete value) permanentDelete, - required TResult Function(Message_Unschedule value) unschedule, - required TResult Function(Message_UpdateProfile value) updateProfile, - required TResult Function(Message_UpdateProfileSharing value) - updateProfileSharing, - required TResult Function(Message_ShareProfile value) shareProfile, - required TResult Function(Message_NotifyAnyways value) notifyAnyways, - required TResult Function(Message_SetTranscriptBackground value) - setTranscriptBackground, - }) => - throw _privateConstructorUsedError; - @optionalTypeArgs - TResult? mapOrNull({ - TResult? Function(Message_Message value)? message, - TResult? Function(Message_RenameMessage value)? renameMessage, - TResult? Function(Message_ChangeParticipants value)? changeParticipants, - TResult? Function(Message_React value)? react, - TResult? Function(Message_Delivered value)? delivered, - TResult? Function(Message_Read value)? read, - TResult? Function(Message_Typing value)? typing, - TResult? Function(Message_Unsend value)? unsend, - TResult? Function(Message_Edit value)? edit, - TResult? Function(Message_IconChange value)? iconChange, - TResult? Function(Message_EnableSmsActivation value)? enableSmsActivation, - TResult? Function(Message_MessageReadOnDevice value)? messageReadOnDevice, - TResult? Function(Message_SmsConfirmSent value)? smsConfirmSent, - TResult? Function(Message_MarkUnread value)? markUnread, - TResult? Function(Message_PeerCacheInvalidate value)? peerCacheInvalidate, - TResult? Function(Message_UpdateExtension value)? updateExtension, - TResult? Function(Message_Error value)? error, - TResult? Function(Message_MoveToRecycleBin value)? moveToRecycleBin, - TResult? Function(Message_RecoverChat value)? recoverChat, - TResult? Function(Message_PermanentDelete value)? permanentDelete, - TResult? Function(Message_Unschedule value)? unschedule, - TResult? Function(Message_UpdateProfile value)? updateProfile, - TResult? Function(Message_UpdateProfileSharing value)? updateProfileSharing, - TResult? Function(Message_ShareProfile value)? shareProfile, - TResult? Function(Message_NotifyAnyways value)? notifyAnyways, - TResult? Function(Message_SetTranscriptBackground value)? - setTranscriptBackground, - }) => - throw _privateConstructorUsedError; - @optionalTypeArgs - TResult maybeMap({ - TResult Function(Message_Message value)? message, - TResult Function(Message_RenameMessage value)? renameMessage, - TResult Function(Message_ChangeParticipants value)? changeParticipants, - TResult Function(Message_React value)? react, - TResult Function(Message_Delivered value)? delivered, - TResult Function(Message_Read value)? read, - TResult Function(Message_Typing value)? typing, - TResult Function(Message_Unsend value)? unsend, - TResult Function(Message_Edit value)? edit, - TResult Function(Message_IconChange value)? iconChange, - TResult Function(Message_EnableSmsActivation value)? enableSmsActivation, - TResult Function(Message_MessageReadOnDevice value)? messageReadOnDevice, - TResult Function(Message_SmsConfirmSent value)? smsConfirmSent, - TResult Function(Message_MarkUnread value)? markUnread, - TResult Function(Message_PeerCacheInvalidate value)? peerCacheInvalidate, - TResult Function(Message_UpdateExtension value)? updateExtension, - TResult Function(Message_Error value)? error, - TResult Function(Message_MoveToRecycleBin value)? moveToRecycleBin, - TResult Function(Message_RecoverChat value)? recoverChat, - TResult Function(Message_PermanentDelete value)? permanentDelete, - TResult Function(Message_Unschedule value)? unschedule, - TResult Function(Message_UpdateProfile value)? updateProfile, - TResult Function(Message_UpdateProfileSharing value)? updateProfileSharing, - TResult Function(Message_ShareProfile value)? shareProfile, - TResult Function(Message_NotifyAnyways value)? notifyAnyways, - TResult Function(Message_SetTranscriptBackground value)? - setTranscriptBackground, - required TResult orElse(), - }) => - throw _privateConstructorUsedError; -} - -/// @nodoc -abstract class $MessageCopyWith<$Res> { - factory $MessageCopyWith(Message value, $Res Function(Message) then) = - _$MessageCopyWithImpl<$Res, Message>; -} - -/// @nodoc -class _$MessageCopyWithImpl<$Res, $Val extends Message> - implements $MessageCopyWith<$Res> { - _$MessageCopyWithImpl(this._value, this._then); - - // ignore: unused_field - final $Val _value; - // ignore: unused_field - final $Res Function($Val) _then; - - /// Create a copy of Message - /// with the given fields replaced by the non-null parameter values. -} - -/// @nodoc -abstract class _$$Message_MessageImplCopyWith<$Res> { - factory _$$Message_MessageImplCopyWith(_$Message_MessageImpl value, - $Res Function(_$Message_MessageImpl) then) = - __$$Message_MessageImplCopyWithImpl<$Res>; - @useResult - $Res call({NormalMessage field0}); -} - -/// @nodoc -class __$$Message_MessageImplCopyWithImpl<$Res> - extends _$MessageCopyWithImpl<$Res, _$Message_MessageImpl> - implements _$$Message_MessageImplCopyWith<$Res> { - __$$Message_MessageImplCopyWithImpl( - _$Message_MessageImpl _value, $Res Function(_$Message_MessageImpl) _then) - : super(_value, _then); - - /// Create a copy of Message - /// with the given fields replaced by the non-null parameter values. - @pragma('vm:prefer-inline') - @override - $Res call({ - Object? field0 = null, - }) { - return _then(_$Message_MessageImpl( - null == field0 - ? _value.field0 - : field0 // ignore: cast_nullable_to_non_nullable - as NormalMessage, - )); - } -} +abstract mixin class $FTMessage_RingCopyWith<$Res> implements $FTMessageCopyWith<$Res> { + factory $FTMessage_RingCopyWith(FTMessage_Ring value, $Res Function(FTMessage_Ring) _then) = _$FTMessage_RingCopyWithImpl; +@useResult +$Res call({ + String guid +}); -/// @nodoc -class _$Message_MessageImpl extends Message_Message { - const _$Message_MessageImpl(this.field0) : super._(); - @override - final NormalMessage field0; - @override - String toString() { - return 'Message.message(field0: $field0)'; - } +} +/// @nodoc +class _$FTMessage_RingCopyWithImpl<$Res> + implements $FTMessage_RingCopyWith<$Res> { + _$FTMessage_RingCopyWithImpl(this._self, this._then); - @override - bool operator ==(Object other) { - return identical(this, other) || - (other.runtimeType == runtimeType && - other is _$Message_MessageImpl && - (identical(other.field0, field0) || other.field0 == field0)); - } + final FTMessage_Ring _self; + final $Res Function(FTMessage_Ring) _then; - @override - int get hashCode => Object.hash(runtimeType, field0); - - /// Create a copy of Message - /// with the given fields replaced by the non-null parameter values. - @JsonKey(includeFromJson: false, includeToJson: false) - @override - @pragma('vm:prefer-inline') - _$$Message_MessageImplCopyWith<_$Message_MessageImpl> get copyWith => - __$$Message_MessageImplCopyWithImpl<_$Message_MessageImpl>( - this, _$identity); - - @override - @optionalTypeArgs - TResult when({ - required TResult Function(NormalMessage field0) message, - required TResult Function(RenameMessage field0) renameMessage, - required TResult Function(ChangeParticipantMessage field0) - changeParticipants, - required TResult Function(ReactMessage field0) react, - required TResult Function() delivered, - required TResult Function() read, - required TResult Function(bool field0, TypingApp? field1) typing, - required TResult Function(UnsendMessage field0) unsend, - required TResult Function(EditMessage field0) edit, - required TResult Function(IconChangeMessage field0) iconChange, - required TResult Function(bool field0) enableSmsActivation, - required TResult Function() messageReadOnDevice, - required TResult Function(bool field0) smsConfirmSent, - required TResult Function() markUnread, - required TResult Function() peerCacheInvalidate, - required TResult Function(UpdateExtensionMessage field0) updateExtension, - required TResult Function(ErrorMessage field0) error, - required TResult Function(MoveToRecycleBinMessage field0) moveToRecycleBin, - required TResult Function(OperatedChat field0) recoverChat, - required TResult Function(PermanentDeleteMessage field0) permanentDelete, - required TResult Function() unschedule, - required TResult Function(UpdateProfileMessage field0) updateProfile, - required TResult Function(UpdateProfileSharingMessage field0) - updateProfileSharing, - required TResult Function(ShareProfileMessage field0) shareProfile, - required TResult Function() notifyAnyways, - required TResult Function(SetTranscriptBackgroundMessage field0) - setTranscriptBackground, - }) { - return message(field0); - } +/// Create a copy of FTMessage +/// with the given fields replaced by the non-null parameter values. +@pragma('vm:prefer-inline') $Res call({Object? guid = null,}) { + return _then(FTMessage_Ring( +guid: null == guid ? _self.guid : guid // ignore: cast_nullable_to_non_nullable +as String, + )); +} - @override - @optionalTypeArgs - TResult? whenOrNull({ - TResult? Function(NormalMessage field0)? message, - TResult? Function(RenameMessage field0)? renameMessage, - TResult? Function(ChangeParticipantMessage field0)? changeParticipants, - TResult? Function(ReactMessage field0)? react, - TResult? Function()? delivered, - TResult? Function()? read, - TResult? Function(bool field0, TypingApp? field1)? typing, - TResult? Function(UnsendMessage field0)? unsend, - TResult? Function(EditMessage field0)? edit, - TResult? Function(IconChangeMessage field0)? iconChange, - TResult? Function(bool field0)? enableSmsActivation, - TResult? Function()? messageReadOnDevice, - TResult? Function(bool field0)? smsConfirmSent, - TResult? Function()? markUnread, - TResult? Function()? peerCacheInvalidate, - TResult? Function(UpdateExtensionMessage field0)? updateExtension, - TResult? Function(ErrorMessage field0)? error, - TResult? Function(MoveToRecycleBinMessage field0)? moveToRecycleBin, - TResult? Function(OperatedChat field0)? recoverChat, - TResult? Function(PermanentDeleteMessage field0)? permanentDelete, - TResult? Function()? unschedule, - TResult? Function(UpdateProfileMessage field0)? updateProfile, - TResult? Function(UpdateProfileSharingMessage field0)? updateProfileSharing, - TResult? Function(ShareProfileMessage field0)? shareProfile, - TResult? Function()? notifyAnyways, - TResult? Function(SetTranscriptBackgroundMessage field0)? - setTranscriptBackground, - }) { - return message?.call(field0); - } - @override - @optionalTypeArgs - TResult maybeWhen({ - TResult Function(NormalMessage field0)? message, - TResult Function(RenameMessage field0)? renameMessage, - TResult Function(ChangeParticipantMessage field0)? changeParticipants, - TResult Function(ReactMessage field0)? react, - TResult Function()? delivered, - TResult Function()? read, - TResult Function(bool field0, TypingApp? field1)? typing, - TResult Function(UnsendMessage field0)? unsend, - TResult Function(EditMessage field0)? edit, - TResult Function(IconChangeMessage field0)? iconChange, - TResult Function(bool field0)? enableSmsActivation, - TResult Function()? messageReadOnDevice, - TResult Function(bool field0)? smsConfirmSent, - TResult Function()? markUnread, - TResult Function()? peerCacheInvalidate, - TResult Function(UpdateExtensionMessage field0)? updateExtension, - TResult Function(ErrorMessage field0)? error, - TResult Function(MoveToRecycleBinMessage field0)? moveToRecycleBin, - TResult Function(OperatedChat field0)? recoverChat, - TResult Function(PermanentDeleteMessage field0)? permanentDelete, - TResult Function()? unschedule, - TResult Function(UpdateProfileMessage field0)? updateProfile, - TResult Function(UpdateProfileSharingMessage field0)? updateProfileSharing, - TResult Function(ShareProfileMessage field0)? shareProfile, - TResult Function()? notifyAnyways, - TResult Function(SetTranscriptBackgroundMessage field0)? - setTranscriptBackground, - required TResult orElse(), - }) { - if (message != null) { - return message(field0); - } - return orElse(); - } +} - @override - @optionalTypeArgs - TResult map({ - required TResult Function(Message_Message value) message, - required TResult Function(Message_RenameMessage value) renameMessage, - required TResult Function(Message_ChangeParticipants value) - changeParticipants, - required TResult Function(Message_React value) react, - required TResult Function(Message_Delivered value) delivered, - required TResult Function(Message_Read value) read, - required TResult Function(Message_Typing value) typing, - required TResult Function(Message_Unsend value) unsend, - required TResult Function(Message_Edit value) edit, - required TResult Function(Message_IconChange value) iconChange, - required TResult Function(Message_EnableSmsActivation value) - enableSmsActivation, - required TResult Function(Message_MessageReadOnDevice value) - messageReadOnDevice, - required TResult Function(Message_SmsConfirmSent value) smsConfirmSent, - required TResult Function(Message_MarkUnread value) markUnread, - required TResult Function(Message_PeerCacheInvalidate value) - peerCacheInvalidate, - required TResult Function(Message_UpdateExtension value) updateExtension, - required TResult Function(Message_Error value) error, - required TResult Function(Message_MoveToRecycleBin value) moveToRecycleBin, - required TResult Function(Message_RecoverChat value) recoverChat, - required TResult Function(Message_PermanentDelete value) permanentDelete, - required TResult Function(Message_Unschedule value) unschedule, - required TResult Function(Message_UpdateProfile value) updateProfile, - required TResult Function(Message_UpdateProfileSharing value) - updateProfileSharing, - required TResult Function(Message_ShareProfile value) shareProfile, - required TResult Function(Message_NotifyAnyways value) notifyAnyways, - required TResult Function(Message_SetTranscriptBackground value) - setTranscriptBackground, - }) { - return message(this); - } +/// @nodoc - @override - @optionalTypeArgs - TResult? mapOrNull({ - TResult? Function(Message_Message value)? message, - TResult? Function(Message_RenameMessage value)? renameMessage, - TResult? Function(Message_ChangeParticipants value)? changeParticipants, - TResult? Function(Message_React value)? react, - TResult? Function(Message_Delivered value)? delivered, - TResult? Function(Message_Read value)? read, - TResult? Function(Message_Typing value)? typing, - TResult? Function(Message_Unsend value)? unsend, - TResult? Function(Message_Edit value)? edit, - TResult? Function(Message_IconChange value)? iconChange, - TResult? Function(Message_EnableSmsActivation value)? enableSmsActivation, - TResult? Function(Message_MessageReadOnDevice value)? messageReadOnDevice, - TResult? Function(Message_SmsConfirmSent value)? smsConfirmSent, - TResult? Function(Message_MarkUnread value)? markUnread, - TResult? Function(Message_PeerCacheInvalidate value)? peerCacheInvalidate, - TResult? Function(Message_UpdateExtension value)? updateExtension, - TResult? Function(Message_Error value)? error, - TResult? Function(Message_MoveToRecycleBin value)? moveToRecycleBin, - TResult? Function(Message_RecoverChat value)? recoverChat, - TResult? Function(Message_PermanentDelete value)? permanentDelete, - TResult? Function(Message_Unschedule value)? unschedule, - TResult? Function(Message_UpdateProfile value)? updateProfile, - TResult? Function(Message_UpdateProfileSharing value)? updateProfileSharing, - TResult? Function(Message_ShareProfile value)? shareProfile, - TResult? Function(Message_NotifyAnyways value)? notifyAnyways, - TResult? Function(Message_SetTranscriptBackground value)? - setTranscriptBackground, - }) { - return message?.call(this); - } - @override - @optionalTypeArgs - TResult maybeMap({ - TResult Function(Message_Message value)? message, - TResult Function(Message_RenameMessage value)? renameMessage, - TResult Function(Message_ChangeParticipants value)? changeParticipants, - TResult Function(Message_React value)? react, - TResult Function(Message_Delivered value)? delivered, - TResult Function(Message_Read value)? read, - TResult Function(Message_Typing value)? typing, - TResult Function(Message_Unsend value)? unsend, - TResult Function(Message_Edit value)? edit, - TResult Function(Message_IconChange value)? iconChange, - TResult Function(Message_EnableSmsActivation value)? enableSmsActivation, - TResult Function(Message_MessageReadOnDevice value)? messageReadOnDevice, - TResult Function(Message_SmsConfirmSent value)? smsConfirmSent, - TResult Function(Message_MarkUnread value)? markUnread, - TResult Function(Message_PeerCacheInvalidate value)? peerCacheInvalidate, - TResult Function(Message_UpdateExtension value)? updateExtension, - TResult Function(Message_Error value)? error, - TResult Function(Message_MoveToRecycleBin value)? moveToRecycleBin, - TResult Function(Message_RecoverChat value)? recoverChat, - TResult Function(Message_PermanentDelete value)? permanentDelete, - TResult Function(Message_Unschedule value)? unschedule, - TResult Function(Message_UpdateProfile value)? updateProfile, - TResult Function(Message_UpdateProfileSharing value)? updateProfileSharing, - TResult Function(Message_ShareProfile value)? shareProfile, - TResult Function(Message_NotifyAnyways value)? notifyAnyways, - TResult Function(Message_SetTranscriptBackground value)? - setTranscriptBackground, - required TResult orElse(), - }) { - if (message != null) { - return message(this); - } - return orElse(); - } -} +class FTMessage_Decline extends FTMessage { + const FTMessage_Decline({required this.guid}): super._(); -abstract class Message_Message extends Message { - const factory Message_Message(final NormalMessage field0) = - _$Message_MessageImpl; - const Message_Message._() : super._(); - NormalMessage get field0; + final String guid; - /// Create a copy of Message - /// with the given fields replaced by the non-null parameter values. - @JsonKey(includeFromJson: false, includeToJson: false) - _$$Message_MessageImplCopyWith<_$Message_MessageImpl> get copyWith => - throw _privateConstructorUsedError; -} +/// Create a copy of FTMessage +/// with the given fields replaced by the non-null parameter values. +@JsonKey(includeFromJson: false, includeToJson: false) +@pragma('vm:prefer-inline') +$FTMessage_DeclineCopyWith get copyWith => _$FTMessage_DeclineCopyWithImpl(this, _$identity); -/// @nodoc -abstract class _$$Message_RenameMessageImplCopyWith<$Res> { - factory _$$Message_RenameMessageImplCopyWith( - _$Message_RenameMessageImpl value, - $Res Function(_$Message_RenameMessageImpl) then) = - __$$Message_RenameMessageImplCopyWithImpl<$Res>; - @useResult - $Res call({RenameMessage field0}); -} -/// @nodoc -class __$$Message_RenameMessageImplCopyWithImpl<$Res> - extends _$MessageCopyWithImpl<$Res, _$Message_RenameMessageImpl> - implements _$$Message_RenameMessageImplCopyWith<$Res> { - __$$Message_RenameMessageImplCopyWithImpl(_$Message_RenameMessageImpl _value, - $Res Function(_$Message_RenameMessageImpl) _then) - : super(_value, _then); - /// Create a copy of Message - /// with the given fields replaced by the non-null parameter values. - @pragma('vm:prefer-inline') - @override - $Res call({ - Object? field0 = null, - }) { - return _then(_$Message_RenameMessageImpl( - null == field0 - ? _value.field0 - : field0 // ignore: cast_nullable_to_non_nullable - as RenameMessage, - )); - } +@override +bool operator ==(Object other) { + return identical(this, other) || (other.runtimeType == runtimeType&&other is FTMessage_Decline&&(identical(other.guid, guid) || other.guid == guid)); } -/// @nodoc - -class _$Message_RenameMessageImpl extends Message_RenameMessage { - const _$Message_RenameMessageImpl(this.field0) : super._(); - @override - final RenameMessage field0; +@override +int get hashCode => Object.hash(runtimeType,guid); - @override - String toString() { - return 'Message.renameMessage(field0: $field0)'; - } +@override +String toString() { + return 'FTMessage.decline(guid: $guid)'; +} - @override - bool operator ==(Object other) { - return identical(this, other) || - (other.runtimeType == runtimeType && - other is _$Message_RenameMessageImpl && - (identical(other.field0, field0) || other.field0 == field0)); - } - @override - int get hashCode => Object.hash(runtimeType, field0); - - /// Create a copy of Message - /// with the given fields replaced by the non-null parameter values. - @JsonKey(includeFromJson: false, includeToJson: false) - @override - @pragma('vm:prefer-inline') - _$$Message_RenameMessageImplCopyWith<_$Message_RenameMessageImpl> - get copyWith => __$$Message_RenameMessageImplCopyWithImpl< - _$Message_RenameMessageImpl>(this, _$identity); - - @override - @optionalTypeArgs - TResult when({ - required TResult Function(NormalMessage field0) message, - required TResult Function(RenameMessage field0) renameMessage, - required TResult Function(ChangeParticipantMessage field0) - changeParticipants, - required TResult Function(ReactMessage field0) react, - required TResult Function() delivered, - required TResult Function() read, - required TResult Function(bool field0, TypingApp? field1) typing, - required TResult Function(UnsendMessage field0) unsend, - required TResult Function(EditMessage field0) edit, - required TResult Function(IconChangeMessage field0) iconChange, - required TResult Function(bool field0) enableSmsActivation, - required TResult Function() messageReadOnDevice, - required TResult Function(bool field0) smsConfirmSent, - required TResult Function() markUnread, - required TResult Function() peerCacheInvalidate, - required TResult Function(UpdateExtensionMessage field0) updateExtension, - required TResult Function(ErrorMessage field0) error, - required TResult Function(MoveToRecycleBinMessage field0) moveToRecycleBin, - required TResult Function(OperatedChat field0) recoverChat, - required TResult Function(PermanentDeleteMessage field0) permanentDelete, - required TResult Function() unschedule, - required TResult Function(UpdateProfileMessage field0) updateProfile, - required TResult Function(UpdateProfileSharingMessage field0) - updateProfileSharing, - required TResult Function(ShareProfileMessage field0) shareProfile, - required TResult Function() notifyAnyways, - required TResult Function(SetTranscriptBackgroundMessage field0) - setTranscriptBackground, - }) { - return renameMessage(field0); - } +} - @override - @optionalTypeArgs - TResult? whenOrNull({ - TResult? Function(NormalMessage field0)? message, - TResult? Function(RenameMessage field0)? renameMessage, - TResult? Function(ChangeParticipantMessage field0)? changeParticipants, - TResult? Function(ReactMessage field0)? react, - TResult? Function()? delivered, - TResult? Function()? read, - TResult? Function(bool field0, TypingApp? field1)? typing, - TResult? Function(UnsendMessage field0)? unsend, - TResult? Function(EditMessage field0)? edit, - TResult? Function(IconChangeMessage field0)? iconChange, - TResult? Function(bool field0)? enableSmsActivation, - TResult? Function()? messageReadOnDevice, - TResult? Function(bool field0)? smsConfirmSent, - TResult? Function()? markUnread, - TResult? Function()? peerCacheInvalidate, - TResult? Function(UpdateExtensionMessage field0)? updateExtension, - TResult? Function(ErrorMessage field0)? error, - TResult? Function(MoveToRecycleBinMessage field0)? moveToRecycleBin, - TResult? Function(OperatedChat field0)? recoverChat, - TResult? Function(PermanentDeleteMessage field0)? permanentDelete, - TResult? Function()? unschedule, - TResult? Function(UpdateProfileMessage field0)? updateProfile, - TResult? Function(UpdateProfileSharingMessage field0)? updateProfileSharing, - TResult? Function(ShareProfileMessage field0)? shareProfile, - TResult? Function()? notifyAnyways, - TResult? Function(SetTranscriptBackgroundMessage field0)? - setTranscriptBackground, - }) { - return renameMessage?.call(field0); - } +/// @nodoc +abstract mixin class $FTMessage_DeclineCopyWith<$Res> implements $FTMessageCopyWith<$Res> { + factory $FTMessage_DeclineCopyWith(FTMessage_Decline value, $Res Function(FTMessage_Decline) _then) = _$FTMessage_DeclineCopyWithImpl; +@useResult +$Res call({ + String guid +}); - @override - @optionalTypeArgs - TResult maybeWhen({ - TResult Function(NormalMessage field0)? message, - TResult Function(RenameMessage field0)? renameMessage, - TResult Function(ChangeParticipantMessage field0)? changeParticipants, - TResult Function(ReactMessage field0)? react, - TResult Function()? delivered, - TResult Function()? read, - TResult Function(bool field0, TypingApp? field1)? typing, - TResult Function(UnsendMessage field0)? unsend, - TResult Function(EditMessage field0)? edit, - TResult Function(IconChangeMessage field0)? iconChange, - TResult Function(bool field0)? enableSmsActivation, - TResult Function()? messageReadOnDevice, - TResult Function(bool field0)? smsConfirmSent, - TResult Function()? markUnread, - TResult Function()? peerCacheInvalidate, - TResult Function(UpdateExtensionMessage field0)? updateExtension, - TResult Function(ErrorMessage field0)? error, - TResult Function(MoveToRecycleBinMessage field0)? moveToRecycleBin, - TResult Function(OperatedChat field0)? recoverChat, - TResult Function(PermanentDeleteMessage field0)? permanentDelete, - TResult Function()? unschedule, - TResult Function(UpdateProfileMessage field0)? updateProfile, - TResult Function(UpdateProfileSharingMessage field0)? updateProfileSharing, - TResult Function(ShareProfileMessage field0)? shareProfile, - TResult Function()? notifyAnyways, - TResult Function(SetTranscriptBackgroundMessage field0)? - setTranscriptBackground, - required TResult orElse(), - }) { - if (renameMessage != null) { - return renameMessage(field0); - } - return orElse(); - } - @override - @optionalTypeArgs - TResult map({ - required TResult Function(Message_Message value) message, - required TResult Function(Message_RenameMessage value) renameMessage, - required TResult Function(Message_ChangeParticipants value) - changeParticipants, - required TResult Function(Message_React value) react, - required TResult Function(Message_Delivered value) delivered, - required TResult Function(Message_Read value) read, - required TResult Function(Message_Typing value) typing, - required TResult Function(Message_Unsend value) unsend, - required TResult Function(Message_Edit value) edit, - required TResult Function(Message_IconChange value) iconChange, - required TResult Function(Message_EnableSmsActivation value) - enableSmsActivation, - required TResult Function(Message_MessageReadOnDevice value) - messageReadOnDevice, - required TResult Function(Message_SmsConfirmSent value) smsConfirmSent, - required TResult Function(Message_MarkUnread value) markUnread, - required TResult Function(Message_PeerCacheInvalidate value) - peerCacheInvalidate, - required TResult Function(Message_UpdateExtension value) updateExtension, - required TResult Function(Message_Error value) error, - required TResult Function(Message_MoveToRecycleBin value) moveToRecycleBin, - required TResult Function(Message_RecoverChat value) recoverChat, - required TResult Function(Message_PermanentDelete value) permanentDelete, - required TResult Function(Message_Unschedule value) unschedule, - required TResult Function(Message_UpdateProfile value) updateProfile, - required TResult Function(Message_UpdateProfileSharing value) - updateProfileSharing, - required TResult Function(Message_ShareProfile value) shareProfile, - required TResult Function(Message_NotifyAnyways value) notifyAnyways, - required TResult Function(Message_SetTranscriptBackground value) - setTranscriptBackground, - }) { - return renameMessage(this); - } - @override - @optionalTypeArgs - TResult? mapOrNull({ - TResult? Function(Message_Message value)? message, - TResult? Function(Message_RenameMessage value)? renameMessage, - TResult? Function(Message_ChangeParticipants value)? changeParticipants, - TResult? Function(Message_React value)? react, - TResult? Function(Message_Delivered value)? delivered, - TResult? Function(Message_Read value)? read, - TResult? Function(Message_Typing value)? typing, - TResult? Function(Message_Unsend value)? unsend, - TResult? Function(Message_Edit value)? edit, - TResult? Function(Message_IconChange value)? iconChange, - TResult? Function(Message_EnableSmsActivation value)? enableSmsActivation, - TResult? Function(Message_MessageReadOnDevice value)? messageReadOnDevice, - TResult? Function(Message_SmsConfirmSent value)? smsConfirmSent, - TResult? Function(Message_MarkUnread value)? markUnread, - TResult? Function(Message_PeerCacheInvalidate value)? peerCacheInvalidate, - TResult? Function(Message_UpdateExtension value)? updateExtension, - TResult? Function(Message_Error value)? error, - TResult? Function(Message_MoveToRecycleBin value)? moveToRecycleBin, - TResult? Function(Message_RecoverChat value)? recoverChat, - TResult? Function(Message_PermanentDelete value)? permanentDelete, - TResult? Function(Message_Unschedule value)? unschedule, - TResult? Function(Message_UpdateProfile value)? updateProfile, - TResult? Function(Message_UpdateProfileSharing value)? updateProfileSharing, - TResult? Function(Message_ShareProfile value)? shareProfile, - TResult? Function(Message_NotifyAnyways value)? notifyAnyways, - TResult? Function(Message_SetTranscriptBackground value)? - setTranscriptBackground, - }) { - return renameMessage?.call(this); - } - @override - @optionalTypeArgs - TResult maybeMap({ - TResult Function(Message_Message value)? message, - TResult Function(Message_RenameMessage value)? renameMessage, - TResult Function(Message_ChangeParticipants value)? changeParticipants, - TResult Function(Message_React value)? react, - TResult Function(Message_Delivered value)? delivered, - TResult Function(Message_Read value)? read, - TResult Function(Message_Typing value)? typing, - TResult Function(Message_Unsend value)? unsend, - TResult Function(Message_Edit value)? edit, - TResult Function(Message_IconChange value)? iconChange, - TResult Function(Message_EnableSmsActivation value)? enableSmsActivation, - TResult Function(Message_MessageReadOnDevice value)? messageReadOnDevice, - TResult Function(Message_SmsConfirmSent value)? smsConfirmSent, - TResult Function(Message_MarkUnread value)? markUnread, - TResult Function(Message_PeerCacheInvalidate value)? peerCacheInvalidate, - TResult Function(Message_UpdateExtension value)? updateExtension, - TResult Function(Message_Error value)? error, - TResult Function(Message_MoveToRecycleBin value)? moveToRecycleBin, - TResult Function(Message_RecoverChat value)? recoverChat, - TResult Function(Message_PermanentDelete value)? permanentDelete, - TResult Function(Message_Unschedule value)? unschedule, - TResult Function(Message_UpdateProfile value)? updateProfile, - TResult Function(Message_UpdateProfileSharing value)? updateProfileSharing, - TResult Function(Message_ShareProfile value)? shareProfile, - TResult Function(Message_NotifyAnyways value)? notifyAnyways, - TResult Function(Message_SetTranscriptBackground value)? - setTranscriptBackground, - required TResult orElse(), - }) { - if (renameMessage != null) { - return renameMessage(this); - } - return orElse(); - } } +/// @nodoc +class _$FTMessage_DeclineCopyWithImpl<$Res> + implements $FTMessage_DeclineCopyWith<$Res> { + _$FTMessage_DeclineCopyWithImpl(this._self, this._then); -abstract class Message_RenameMessage extends Message { - const factory Message_RenameMessage(final RenameMessage field0) = - _$Message_RenameMessageImpl; - const Message_RenameMessage._() : super._(); - - RenameMessage get field0; - - /// Create a copy of Message - /// with the given fields replaced by the non-null parameter values. - @JsonKey(includeFromJson: false, includeToJson: false) - _$$Message_RenameMessageImplCopyWith<_$Message_RenameMessageImpl> - get copyWith => throw _privateConstructorUsedError; -} - -/// @nodoc -abstract class _$$Message_ChangeParticipantsImplCopyWith<$Res> { - factory _$$Message_ChangeParticipantsImplCopyWith( - _$Message_ChangeParticipantsImpl value, - $Res Function(_$Message_ChangeParticipantsImpl) then) = - __$$Message_ChangeParticipantsImplCopyWithImpl<$Res>; - @useResult - $Res call({ChangeParticipantMessage field0}); -} - -/// @nodoc -class __$$Message_ChangeParticipantsImplCopyWithImpl<$Res> - extends _$MessageCopyWithImpl<$Res, _$Message_ChangeParticipantsImpl> - implements _$$Message_ChangeParticipantsImplCopyWith<$Res> { - __$$Message_ChangeParticipantsImplCopyWithImpl( - _$Message_ChangeParticipantsImpl _value, - $Res Function(_$Message_ChangeParticipantsImpl) _then) - : super(_value, _then); - - /// Create a copy of Message - /// with the given fields replaced by the non-null parameter values. - @pragma('vm:prefer-inline') - @override - $Res call({ - Object? field0 = null, - }) { - return _then(_$Message_ChangeParticipantsImpl( - null == field0 - ? _value.field0 - : field0 // ignore: cast_nullable_to_non_nullable - as ChangeParticipantMessage, - )); - } + final FTMessage_Decline _self; + final $Res Function(FTMessage_Decline) _then; + +/// Create a copy of FTMessage +/// with the given fields replaced by the non-null parameter values. +@pragma('vm:prefer-inline') $Res call({Object? guid = null,}) { + return _then(FTMessage_Decline( +guid: null == guid ? _self.guid : guid // ignore: cast_nullable_to_non_nullable +as String, + )); } -/// @nodoc -class _$Message_ChangeParticipantsImpl extends Message_ChangeParticipants { - const _$Message_ChangeParticipantsImpl(this.field0) : super._(); +} - @override - final ChangeParticipantMessage field0; +/// @nodoc - @override - String toString() { - return 'Message.changeParticipants(field0: $field0)'; - } - @override - bool operator ==(Object other) { - return identical(this, other) || - (other.runtimeType == runtimeType && - other is _$Message_ChangeParticipantsImpl && - (identical(other.field0, field0) || other.field0 == field0)); - } +class FTMessage_RespondedElsewhere extends FTMessage { + const FTMessage_RespondedElsewhere({required this.guid}): super._(); - @override - int get hashCode => Object.hash(runtimeType, field0); - - /// Create a copy of Message - /// with the given fields replaced by the non-null parameter values. - @JsonKey(includeFromJson: false, includeToJson: false) - @override - @pragma('vm:prefer-inline') - _$$Message_ChangeParticipantsImplCopyWith<_$Message_ChangeParticipantsImpl> - get copyWith => __$$Message_ChangeParticipantsImplCopyWithImpl< - _$Message_ChangeParticipantsImpl>(this, _$identity); - - @override - @optionalTypeArgs - TResult when({ - required TResult Function(NormalMessage field0) message, - required TResult Function(RenameMessage field0) renameMessage, - required TResult Function(ChangeParticipantMessage field0) - changeParticipants, - required TResult Function(ReactMessage field0) react, - required TResult Function() delivered, - required TResult Function() read, - required TResult Function(bool field0, TypingApp? field1) typing, - required TResult Function(UnsendMessage field0) unsend, - required TResult Function(EditMessage field0) edit, - required TResult Function(IconChangeMessage field0) iconChange, - required TResult Function(bool field0) enableSmsActivation, - required TResult Function() messageReadOnDevice, - required TResult Function(bool field0) smsConfirmSent, - required TResult Function() markUnread, - required TResult Function() peerCacheInvalidate, - required TResult Function(UpdateExtensionMessage field0) updateExtension, - required TResult Function(ErrorMessage field0) error, - required TResult Function(MoveToRecycleBinMessage field0) moveToRecycleBin, - required TResult Function(OperatedChat field0) recoverChat, - required TResult Function(PermanentDeleteMessage field0) permanentDelete, - required TResult Function() unschedule, - required TResult Function(UpdateProfileMessage field0) updateProfile, - required TResult Function(UpdateProfileSharingMessage field0) - updateProfileSharing, - required TResult Function(ShareProfileMessage field0) shareProfile, - required TResult Function() notifyAnyways, - required TResult Function(SetTranscriptBackgroundMessage field0) - setTranscriptBackground, - }) { - return changeParticipants(field0); - } - @override - @optionalTypeArgs - TResult? whenOrNull({ - TResult? Function(NormalMessage field0)? message, - TResult? Function(RenameMessage field0)? renameMessage, - TResult? Function(ChangeParticipantMessage field0)? changeParticipants, - TResult? Function(ReactMessage field0)? react, - TResult? Function()? delivered, - TResult? Function()? read, - TResult? Function(bool field0, TypingApp? field1)? typing, - TResult? Function(UnsendMessage field0)? unsend, - TResult? Function(EditMessage field0)? edit, - TResult? Function(IconChangeMessage field0)? iconChange, - TResult? Function(bool field0)? enableSmsActivation, - TResult? Function()? messageReadOnDevice, - TResult? Function(bool field0)? smsConfirmSent, - TResult? Function()? markUnread, - TResult? Function()? peerCacheInvalidate, - TResult? Function(UpdateExtensionMessage field0)? updateExtension, - TResult? Function(ErrorMessage field0)? error, - TResult? Function(MoveToRecycleBinMessage field0)? moveToRecycleBin, - TResult? Function(OperatedChat field0)? recoverChat, - TResult? Function(PermanentDeleteMessage field0)? permanentDelete, - TResult? Function()? unschedule, - TResult? Function(UpdateProfileMessage field0)? updateProfile, - TResult? Function(UpdateProfileSharingMessage field0)? updateProfileSharing, - TResult? Function(ShareProfileMessage field0)? shareProfile, - TResult? Function()? notifyAnyways, - TResult? Function(SetTranscriptBackgroundMessage field0)? - setTranscriptBackground, - }) { - return changeParticipants?.call(field0); - } + final String guid; - @override - @optionalTypeArgs - TResult maybeWhen({ - TResult Function(NormalMessage field0)? message, - TResult Function(RenameMessage field0)? renameMessage, - TResult Function(ChangeParticipantMessage field0)? changeParticipants, - TResult Function(ReactMessage field0)? react, - TResult Function()? delivered, - TResult Function()? read, - TResult Function(bool field0, TypingApp? field1)? typing, - TResult Function(UnsendMessage field0)? unsend, - TResult Function(EditMessage field0)? edit, - TResult Function(IconChangeMessage field0)? iconChange, - TResult Function(bool field0)? enableSmsActivation, - TResult Function()? messageReadOnDevice, - TResult Function(bool field0)? smsConfirmSent, - TResult Function()? markUnread, - TResult Function()? peerCacheInvalidate, - TResult Function(UpdateExtensionMessage field0)? updateExtension, - TResult Function(ErrorMessage field0)? error, - TResult Function(MoveToRecycleBinMessage field0)? moveToRecycleBin, - TResult Function(OperatedChat field0)? recoverChat, - TResult Function(PermanentDeleteMessage field0)? permanentDelete, - TResult Function()? unschedule, - TResult Function(UpdateProfileMessage field0)? updateProfile, - TResult Function(UpdateProfileSharingMessage field0)? updateProfileSharing, - TResult Function(ShareProfileMessage field0)? shareProfile, - TResult Function()? notifyAnyways, - TResult Function(SetTranscriptBackgroundMessage field0)? - setTranscriptBackground, - required TResult orElse(), - }) { - if (changeParticipants != null) { - return changeParticipants(field0); - } - return orElse(); - } +/// Create a copy of FTMessage +/// with the given fields replaced by the non-null parameter values. +@JsonKey(includeFromJson: false, includeToJson: false) +@pragma('vm:prefer-inline') +$FTMessage_RespondedElsewhereCopyWith get copyWith => _$FTMessage_RespondedElsewhereCopyWithImpl(this, _$identity); - @override - @optionalTypeArgs - TResult map({ - required TResult Function(Message_Message value) message, - required TResult Function(Message_RenameMessage value) renameMessage, - required TResult Function(Message_ChangeParticipants value) - changeParticipants, - required TResult Function(Message_React value) react, - required TResult Function(Message_Delivered value) delivered, - required TResult Function(Message_Read value) read, - required TResult Function(Message_Typing value) typing, - required TResult Function(Message_Unsend value) unsend, - required TResult Function(Message_Edit value) edit, - required TResult Function(Message_IconChange value) iconChange, - required TResult Function(Message_EnableSmsActivation value) - enableSmsActivation, - required TResult Function(Message_MessageReadOnDevice value) - messageReadOnDevice, - required TResult Function(Message_SmsConfirmSent value) smsConfirmSent, - required TResult Function(Message_MarkUnread value) markUnread, - required TResult Function(Message_PeerCacheInvalidate value) - peerCacheInvalidate, - required TResult Function(Message_UpdateExtension value) updateExtension, - required TResult Function(Message_Error value) error, - required TResult Function(Message_MoveToRecycleBin value) moveToRecycleBin, - required TResult Function(Message_RecoverChat value) recoverChat, - required TResult Function(Message_PermanentDelete value) permanentDelete, - required TResult Function(Message_Unschedule value) unschedule, - required TResult Function(Message_UpdateProfile value) updateProfile, - required TResult Function(Message_UpdateProfileSharing value) - updateProfileSharing, - required TResult Function(Message_ShareProfile value) shareProfile, - required TResult Function(Message_NotifyAnyways value) notifyAnyways, - required TResult Function(Message_SetTranscriptBackground value) - setTranscriptBackground, - }) { - return changeParticipants(this); - } - @override - @optionalTypeArgs - TResult? mapOrNull({ - TResult? Function(Message_Message value)? message, - TResult? Function(Message_RenameMessage value)? renameMessage, - TResult? Function(Message_ChangeParticipants value)? changeParticipants, - TResult? Function(Message_React value)? react, - TResult? Function(Message_Delivered value)? delivered, - TResult? Function(Message_Read value)? read, - TResult? Function(Message_Typing value)? typing, - TResult? Function(Message_Unsend value)? unsend, - TResult? Function(Message_Edit value)? edit, - TResult? Function(Message_IconChange value)? iconChange, - TResult? Function(Message_EnableSmsActivation value)? enableSmsActivation, - TResult? Function(Message_MessageReadOnDevice value)? messageReadOnDevice, - TResult? Function(Message_SmsConfirmSent value)? smsConfirmSent, - TResult? Function(Message_MarkUnread value)? markUnread, - TResult? Function(Message_PeerCacheInvalidate value)? peerCacheInvalidate, - TResult? Function(Message_UpdateExtension value)? updateExtension, - TResult? Function(Message_Error value)? error, - TResult? Function(Message_MoveToRecycleBin value)? moveToRecycleBin, - TResult? Function(Message_RecoverChat value)? recoverChat, - TResult? Function(Message_PermanentDelete value)? permanentDelete, - TResult? Function(Message_Unschedule value)? unschedule, - TResult? Function(Message_UpdateProfile value)? updateProfile, - TResult? Function(Message_UpdateProfileSharing value)? updateProfileSharing, - TResult? Function(Message_ShareProfile value)? shareProfile, - TResult? Function(Message_NotifyAnyways value)? notifyAnyways, - TResult? Function(Message_SetTranscriptBackground value)? - setTranscriptBackground, - }) { - return changeParticipants?.call(this); - } - @override - @optionalTypeArgs - TResult maybeMap({ - TResult Function(Message_Message value)? message, - TResult Function(Message_RenameMessage value)? renameMessage, - TResult Function(Message_ChangeParticipants value)? changeParticipants, - TResult Function(Message_React value)? react, - TResult Function(Message_Delivered value)? delivered, - TResult Function(Message_Read value)? read, - TResult Function(Message_Typing value)? typing, - TResult Function(Message_Unsend value)? unsend, - TResult Function(Message_Edit value)? edit, - TResult Function(Message_IconChange value)? iconChange, - TResult Function(Message_EnableSmsActivation value)? enableSmsActivation, - TResult Function(Message_MessageReadOnDevice value)? messageReadOnDevice, - TResult Function(Message_SmsConfirmSent value)? smsConfirmSent, - TResult Function(Message_MarkUnread value)? markUnread, - TResult Function(Message_PeerCacheInvalidate value)? peerCacheInvalidate, - TResult Function(Message_UpdateExtension value)? updateExtension, - TResult Function(Message_Error value)? error, - TResult Function(Message_MoveToRecycleBin value)? moveToRecycleBin, - TResult Function(Message_RecoverChat value)? recoverChat, - TResult Function(Message_PermanentDelete value)? permanentDelete, - TResult Function(Message_Unschedule value)? unschedule, - TResult Function(Message_UpdateProfile value)? updateProfile, - TResult Function(Message_UpdateProfileSharing value)? updateProfileSharing, - TResult Function(Message_ShareProfile value)? shareProfile, - TResult Function(Message_NotifyAnyways value)? notifyAnyways, - TResult Function(Message_SetTranscriptBackground value)? - setTranscriptBackground, - required TResult orElse(), - }) { - if (changeParticipants != null) { - return changeParticipants(this); - } - return orElse(); - } +@override +bool operator ==(Object other) { + return identical(this, other) || (other.runtimeType == runtimeType&&other is FTMessage_RespondedElsewhere&&(identical(other.guid, guid) || other.guid == guid)); } -abstract class Message_ChangeParticipants extends Message { - const factory Message_ChangeParticipants( - final ChangeParticipantMessage field0) = _$Message_ChangeParticipantsImpl; - const Message_ChangeParticipants._() : super._(); - ChangeParticipantMessage get field0; +@override +int get hashCode => Object.hash(runtimeType,guid); - /// Create a copy of Message - /// with the given fields replaced by the non-null parameter values. - @JsonKey(includeFromJson: false, includeToJson: false) - _$$Message_ChangeParticipantsImplCopyWith<_$Message_ChangeParticipantsImpl> - get copyWith => throw _privateConstructorUsedError; +@override +String toString() { + return 'FTMessage.respondedElsewhere(guid: $guid)'; } -/// @nodoc -abstract class _$$Message_ReactImplCopyWith<$Res> { - factory _$$Message_ReactImplCopyWith( - _$Message_ReactImpl value, $Res Function(_$Message_ReactImpl) then) = - __$$Message_ReactImplCopyWithImpl<$Res>; - @useResult - $Res call({ReactMessage field0}); -} - -/// @nodoc -class __$$Message_ReactImplCopyWithImpl<$Res> - extends _$MessageCopyWithImpl<$Res, _$Message_ReactImpl> - implements _$$Message_ReactImplCopyWith<$Res> { - __$$Message_ReactImplCopyWithImpl( - _$Message_ReactImpl _value, $Res Function(_$Message_ReactImpl) _then) - : super(_value, _then); - /// Create a copy of Message - /// with the given fields replaced by the non-null parameter values. - @pragma('vm:prefer-inline') - @override - $Res call({ - Object? field0 = null, - }) { - return _then(_$Message_ReactImpl( - null == field0 - ? _value.field0 - : field0 // ignore: cast_nullable_to_non_nullable - as ReactMessage, - )); - } } /// @nodoc +abstract mixin class $FTMessage_RespondedElsewhereCopyWith<$Res> implements $FTMessageCopyWith<$Res> { + factory $FTMessage_RespondedElsewhereCopyWith(FTMessage_RespondedElsewhere value, $Res Function(FTMessage_RespondedElsewhere) _then) = _$FTMessage_RespondedElsewhereCopyWithImpl; +@useResult +$Res call({ + String guid +}); -class _$Message_ReactImpl extends Message_React { - const _$Message_ReactImpl(this.field0) : super._(); - @override - final ReactMessage field0; - @override - String toString() { - return 'Message.react(field0: $field0)'; - } - @override - bool operator ==(Object other) { - return identical(this, other) || - (other.runtimeType == runtimeType && - other is _$Message_ReactImpl && - (identical(other.field0, field0) || other.field0 == field0)); - } +} +/// @nodoc +class _$FTMessage_RespondedElsewhereCopyWithImpl<$Res> + implements $FTMessage_RespondedElsewhereCopyWith<$Res> { + _$FTMessage_RespondedElsewhereCopyWithImpl(this._self, this._then); - @override - int get hashCode => Object.hash(runtimeType, field0); - - /// Create a copy of Message - /// with the given fields replaced by the non-null parameter values. - @JsonKey(includeFromJson: false, includeToJson: false) - @override - @pragma('vm:prefer-inline') - _$$Message_ReactImplCopyWith<_$Message_ReactImpl> get copyWith => - __$$Message_ReactImplCopyWithImpl<_$Message_ReactImpl>(this, _$identity); - - @override - @optionalTypeArgs - TResult when({ - required TResult Function(NormalMessage field0) message, - required TResult Function(RenameMessage field0) renameMessage, - required TResult Function(ChangeParticipantMessage field0) - changeParticipants, - required TResult Function(ReactMessage field0) react, - required TResult Function() delivered, - required TResult Function() read, - required TResult Function(bool field0, TypingApp? field1) typing, - required TResult Function(UnsendMessage field0) unsend, - required TResult Function(EditMessage field0) edit, - required TResult Function(IconChangeMessage field0) iconChange, - required TResult Function(bool field0) enableSmsActivation, - required TResult Function() messageReadOnDevice, - required TResult Function(bool field0) smsConfirmSent, - required TResult Function() markUnread, - required TResult Function() peerCacheInvalidate, - required TResult Function(UpdateExtensionMessage field0) updateExtension, - required TResult Function(ErrorMessage field0) error, - required TResult Function(MoveToRecycleBinMessage field0) moveToRecycleBin, - required TResult Function(OperatedChat field0) recoverChat, - required TResult Function(PermanentDeleteMessage field0) permanentDelete, - required TResult Function() unschedule, - required TResult Function(UpdateProfileMessage field0) updateProfile, - required TResult Function(UpdateProfileSharingMessage field0) - updateProfileSharing, - required TResult Function(ShareProfileMessage field0) shareProfile, - required TResult Function() notifyAnyways, - required TResult Function(SetTranscriptBackgroundMessage field0) - setTranscriptBackground, - }) { - return react(field0); - } + final FTMessage_RespondedElsewhere _self; + final $Res Function(FTMessage_RespondedElsewhere) _then; - @override - @optionalTypeArgs - TResult? whenOrNull({ - TResult? Function(NormalMessage field0)? message, - TResult? Function(RenameMessage field0)? renameMessage, - TResult? Function(ChangeParticipantMessage field0)? changeParticipants, - TResult? Function(ReactMessage field0)? react, - TResult? Function()? delivered, - TResult? Function()? read, - TResult? Function(bool field0, TypingApp? field1)? typing, - TResult? Function(UnsendMessage field0)? unsend, - TResult? Function(EditMessage field0)? edit, - TResult? Function(IconChangeMessage field0)? iconChange, - TResult? Function(bool field0)? enableSmsActivation, - TResult? Function()? messageReadOnDevice, - TResult? Function(bool field0)? smsConfirmSent, - TResult? Function()? markUnread, - TResult? Function()? peerCacheInvalidate, - TResult? Function(UpdateExtensionMessage field0)? updateExtension, - TResult? Function(ErrorMessage field0)? error, - TResult? Function(MoveToRecycleBinMessage field0)? moveToRecycleBin, - TResult? Function(OperatedChat field0)? recoverChat, - TResult? Function(PermanentDeleteMessage field0)? permanentDelete, - TResult? Function()? unschedule, - TResult? Function(UpdateProfileMessage field0)? updateProfile, - TResult? Function(UpdateProfileSharingMessage field0)? updateProfileSharing, - TResult? Function(ShareProfileMessage field0)? shareProfile, - TResult? Function()? notifyAnyways, - TResult? Function(SetTranscriptBackgroundMessage field0)? - setTranscriptBackground, - }) { - return react?.call(field0); - } +/// Create a copy of FTMessage +/// with the given fields replaced by the non-null parameter values. +@pragma('vm:prefer-inline') $Res call({Object? guid = null,}) { + return _then(FTMessage_RespondedElsewhere( +guid: null == guid ? _self.guid : guid // ignore: cast_nullable_to_non_nullable +as String, + )); +} - @override - @optionalTypeArgs - TResult maybeWhen({ - TResult Function(NormalMessage field0)? message, - TResult Function(RenameMessage field0)? renameMessage, - TResult Function(ChangeParticipantMessage field0)? changeParticipants, - TResult Function(ReactMessage field0)? react, - TResult Function()? delivered, - TResult Function()? read, - TResult Function(bool field0, TypingApp? field1)? typing, - TResult Function(UnsendMessage field0)? unsend, - TResult Function(EditMessage field0)? edit, - TResult Function(IconChangeMessage field0)? iconChange, - TResult Function(bool field0)? enableSmsActivation, - TResult Function()? messageReadOnDevice, - TResult Function(bool field0)? smsConfirmSent, - TResult Function()? markUnread, - TResult Function()? peerCacheInvalidate, - TResult Function(UpdateExtensionMessage field0)? updateExtension, - TResult Function(ErrorMessage field0)? error, - TResult Function(MoveToRecycleBinMessage field0)? moveToRecycleBin, - TResult Function(OperatedChat field0)? recoverChat, - TResult Function(PermanentDeleteMessage field0)? permanentDelete, - TResult Function()? unschedule, - TResult Function(UpdateProfileMessage field0)? updateProfile, - TResult Function(UpdateProfileSharingMessage field0)? updateProfileSharing, - TResult Function(ShareProfileMessage field0)? shareProfile, - TResult Function()? notifyAnyways, - TResult Function(SetTranscriptBackgroundMessage field0)? - setTranscriptBackground, - required TResult orElse(), - }) { - if (react != null) { - return react(field0); - } - return orElse(); - } - @override - @optionalTypeArgs - TResult map({ - required TResult Function(Message_Message value) message, - required TResult Function(Message_RenameMessage value) renameMessage, - required TResult Function(Message_ChangeParticipants value) - changeParticipants, - required TResult Function(Message_React value) react, - required TResult Function(Message_Delivered value) delivered, - required TResult Function(Message_Read value) read, - required TResult Function(Message_Typing value) typing, - required TResult Function(Message_Unsend value) unsend, - required TResult Function(Message_Edit value) edit, - required TResult Function(Message_IconChange value) iconChange, - required TResult Function(Message_EnableSmsActivation value) - enableSmsActivation, - required TResult Function(Message_MessageReadOnDevice value) - messageReadOnDevice, - required TResult Function(Message_SmsConfirmSent value) smsConfirmSent, - required TResult Function(Message_MarkUnread value) markUnread, - required TResult Function(Message_PeerCacheInvalidate value) - peerCacheInvalidate, - required TResult Function(Message_UpdateExtension value) updateExtension, - required TResult Function(Message_Error value) error, - required TResult Function(Message_MoveToRecycleBin value) moveToRecycleBin, - required TResult Function(Message_RecoverChat value) recoverChat, - required TResult Function(Message_PermanentDelete value) permanentDelete, - required TResult Function(Message_Unschedule value) unschedule, - required TResult Function(Message_UpdateProfile value) updateProfile, - required TResult Function(Message_UpdateProfileSharing value) - updateProfileSharing, - required TResult Function(Message_ShareProfile value) shareProfile, - required TResult Function(Message_NotifyAnyways value) notifyAnyways, - required TResult Function(Message_SetTranscriptBackground value) - setTranscriptBackground, - }) { - return react(this); - } +} - @override - @optionalTypeArgs - TResult? mapOrNull({ - TResult? Function(Message_Message value)? message, - TResult? Function(Message_RenameMessage value)? renameMessage, - TResult? Function(Message_ChangeParticipants value)? changeParticipants, - TResult? Function(Message_React value)? react, - TResult? Function(Message_Delivered value)? delivered, - TResult? Function(Message_Read value)? read, - TResult? Function(Message_Typing value)? typing, - TResult? Function(Message_Unsend value)? unsend, - TResult? Function(Message_Edit value)? edit, - TResult? Function(Message_IconChange value)? iconChange, - TResult? Function(Message_EnableSmsActivation value)? enableSmsActivation, - TResult? Function(Message_MessageReadOnDevice value)? messageReadOnDevice, - TResult? Function(Message_SmsConfirmSent value)? smsConfirmSent, - TResult? Function(Message_MarkUnread value)? markUnread, - TResult? Function(Message_PeerCacheInvalidate value)? peerCacheInvalidate, - TResult? Function(Message_UpdateExtension value)? updateExtension, - TResult? Function(Message_Error value)? error, - TResult? Function(Message_MoveToRecycleBin value)? moveToRecycleBin, - TResult? Function(Message_RecoverChat value)? recoverChat, - TResult? Function(Message_PermanentDelete value)? permanentDelete, - TResult? Function(Message_Unschedule value)? unschedule, - TResult? Function(Message_UpdateProfile value)? updateProfile, - TResult? Function(Message_UpdateProfileSharing value)? updateProfileSharing, - TResult? Function(Message_ShareProfile value)? shareProfile, - TResult? Function(Message_NotifyAnyways value)? notifyAnyways, - TResult? Function(Message_SetTranscriptBackground value)? - setTranscriptBackground, - }) { - return react?.call(this); - } +/// @nodoc +mixin _$IdmsMessage { - @override - @optionalTypeArgs - TResult maybeMap({ - TResult Function(Message_Message value)? message, - TResult Function(Message_RenameMessage value)? renameMessage, - TResult Function(Message_ChangeParticipants value)? changeParticipants, - TResult Function(Message_React value)? react, - TResult Function(Message_Delivered value)? delivered, - TResult Function(Message_Read value)? read, - TResult Function(Message_Typing value)? typing, - TResult Function(Message_Unsend value)? unsend, - TResult Function(Message_Edit value)? edit, - TResult Function(Message_IconChange value)? iconChange, - TResult Function(Message_EnableSmsActivation value)? enableSmsActivation, - TResult Function(Message_MessageReadOnDevice value)? messageReadOnDevice, - TResult Function(Message_SmsConfirmSent value)? smsConfirmSent, - TResult Function(Message_MarkUnread value)? markUnread, - TResult Function(Message_PeerCacheInvalidate value)? peerCacheInvalidate, - TResult Function(Message_UpdateExtension value)? updateExtension, - TResult Function(Message_Error value)? error, - TResult Function(Message_MoveToRecycleBin value)? moveToRecycleBin, - TResult Function(Message_RecoverChat value)? recoverChat, - TResult Function(Message_PermanentDelete value)? permanentDelete, - TResult Function(Message_Unschedule value)? unschedule, - TResult Function(Message_UpdateProfile value)? updateProfile, - TResult Function(Message_UpdateProfileSharing value)? updateProfileSharing, - TResult Function(Message_ShareProfile value)? shareProfile, - TResult Function(Message_NotifyAnyways value)? notifyAnyways, - TResult Function(Message_SetTranscriptBackground value)? - setTranscriptBackground, - required TResult orElse(), - }) { - if (react != null) { - return react(this); - } - return orElse(); - } -} + Object get field0; -abstract class Message_React extends Message { - const factory Message_React(final ReactMessage field0) = _$Message_ReactImpl; - const Message_React._() : super._(); - ReactMessage get field0; - /// Create a copy of Message - /// with the given fields replaced by the non-null parameter values. - @JsonKey(includeFromJson: false, includeToJson: false) - _$$Message_ReactImplCopyWith<_$Message_ReactImpl> get copyWith => - throw _privateConstructorUsedError; +@override +bool operator ==(Object other) { + return identical(this, other) || (other.runtimeType == runtimeType&&other is IdmsMessage&&const DeepCollectionEquality().equals(other.field0, field0)); } -/// @nodoc -abstract class _$$Message_DeliveredImplCopyWith<$Res> { - factory _$$Message_DeliveredImplCopyWith(_$Message_DeliveredImpl value, - $Res Function(_$Message_DeliveredImpl) then) = - __$$Message_DeliveredImplCopyWithImpl<$Res>; + +@override +int get hashCode => Object.hash(runtimeType,const DeepCollectionEquality().hash(field0)); + +@override +String toString() { + return 'IdmsMessage(field0: $field0)'; } -/// @nodoc -class __$$Message_DeliveredImplCopyWithImpl<$Res> - extends _$MessageCopyWithImpl<$Res, _$Message_DeliveredImpl> - implements _$$Message_DeliveredImplCopyWith<$Res> { - __$$Message_DeliveredImplCopyWithImpl(_$Message_DeliveredImpl _value, - $Res Function(_$Message_DeliveredImpl) _then) - : super(_value, _then); - /// Create a copy of Message - /// with the given fields replaced by the non-null parameter values. } /// @nodoc +class $IdmsMessageCopyWith<$Res> { +$IdmsMessageCopyWith(IdmsMessage _, $Res Function(IdmsMessage) __); +} -class _$Message_DeliveredImpl extends Message_Delivered { - const _$Message_DeliveredImpl() : super._(); - @override - String toString() { - return 'Message.delivered()'; - } +/// Adds pattern-matching-related methods to [IdmsMessage]. +extension IdmsMessagePatterns on IdmsMessage { +/// A variant of `map` that fallback to returning `orElse`. +/// +/// It is equivalent to doing: +/// ```dart +/// switch (sealedClass) { +/// case final Subclass value: +/// return ...; +/// case _: +/// return orElse(); +/// } +/// ``` + +@optionalTypeArgs TResult maybeMap({TResult Function( IdmsMessage_RequestedSignIn value)? requestedSignIn,TResult Function( IdmsMessage_TeardownSignIn value)? teardownSignIn,TResult Function( IdmsMessage_CircleRequest value)? circleRequest,required TResult orElse(),}){ +final _that = this; +switch (_that) { +case IdmsMessage_RequestedSignIn() when requestedSignIn != null: +return requestedSignIn(_that);case IdmsMessage_TeardownSignIn() when teardownSignIn != null: +return teardownSignIn(_that);case IdmsMessage_CircleRequest() when circleRequest != null: +return circleRequest(_that);case _: + return orElse(); + +} +} +/// A `switch`-like method, using callbacks. +/// +/// Callbacks receives the raw object, upcasted. +/// It is equivalent to doing: +/// ```dart +/// switch (sealedClass) { +/// case final Subclass value: +/// return ...; +/// case final Subclass2 value: +/// return ...; +/// } +/// ``` + +@optionalTypeArgs TResult map({required TResult Function( IdmsMessage_RequestedSignIn value) requestedSignIn,required TResult Function( IdmsMessage_TeardownSignIn value) teardownSignIn,required TResult Function( IdmsMessage_CircleRequest value) circleRequest,}){ +final _that = this; +switch (_that) { +case IdmsMessage_RequestedSignIn(): +return requestedSignIn(_that);case IdmsMessage_TeardownSignIn(): +return teardownSignIn(_that);case IdmsMessage_CircleRequest(): +return circleRequest(_that);} +} +/// A variant of `map` that fallback to returning `null`. +/// +/// It is equivalent to doing: +/// ```dart +/// switch (sealedClass) { +/// case final Subclass value: +/// return ...; +/// case _: +/// return null; +/// } +/// ``` - @override - bool operator ==(Object other) { - return identical(this, other) || - (other.runtimeType == runtimeType && other is _$Message_DeliveredImpl); - } +@optionalTypeArgs TResult? mapOrNull({TResult? Function( IdmsMessage_RequestedSignIn value)? requestedSignIn,TResult? Function( IdmsMessage_TeardownSignIn value)? teardownSignIn,TResult? Function( IdmsMessage_CircleRequest value)? circleRequest,}){ +final _that = this; +switch (_that) { +case IdmsMessage_RequestedSignIn() when requestedSignIn != null: +return requestedSignIn(_that);case IdmsMessage_TeardownSignIn() when teardownSignIn != null: +return teardownSignIn(_that);case IdmsMessage_CircleRequest() when circleRequest != null: +return circleRequest(_that);case _: + return null; - @override - int get hashCode => runtimeType.hashCode; - - @override - @optionalTypeArgs - TResult when({ - required TResult Function(NormalMessage field0) message, - required TResult Function(RenameMessage field0) renameMessage, - required TResult Function(ChangeParticipantMessage field0) - changeParticipants, - required TResult Function(ReactMessage field0) react, - required TResult Function() delivered, - required TResult Function() read, - required TResult Function(bool field0, TypingApp? field1) typing, - required TResult Function(UnsendMessage field0) unsend, - required TResult Function(EditMessage field0) edit, - required TResult Function(IconChangeMessage field0) iconChange, - required TResult Function(bool field0) enableSmsActivation, - required TResult Function() messageReadOnDevice, - required TResult Function(bool field0) smsConfirmSent, - required TResult Function() markUnread, - required TResult Function() peerCacheInvalidate, - required TResult Function(UpdateExtensionMessage field0) updateExtension, - required TResult Function(ErrorMessage field0) error, - required TResult Function(MoveToRecycleBinMessage field0) moveToRecycleBin, - required TResult Function(OperatedChat field0) recoverChat, - required TResult Function(PermanentDeleteMessage field0) permanentDelete, - required TResult Function() unschedule, - required TResult Function(UpdateProfileMessage field0) updateProfile, - required TResult Function(UpdateProfileSharingMessage field0) - updateProfileSharing, - required TResult Function(ShareProfileMessage field0) shareProfile, - required TResult Function() notifyAnyways, - required TResult Function(SetTranscriptBackgroundMessage field0) - setTranscriptBackground, - }) { - return delivered(); - } +} +} +/// A variant of `when` that fallback to an `orElse` callback. +/// +/// It is equivalent to doing: +/// ```dart +/// switch (sealedClass) { +/// case Subclass(:final field): +/// return ...; +/// case _: +/// return orElse(); +/// } +/// ``` - @override - @optionalTypeArgs - TResult? whenOrNull({ - TResult? Function(NormalMessage field0)? message, - TResult? Function(RenameMessage field0)? renameMessage, - TResult? Function(ChangeParticipantMessage field0)? changeParticipants, - TResult? Function(ReactMessage field0)? react, - TResult? Function()? delivered, - TResult? Function()? read, - TResult? Function(bool field0, TypingApp? field1)? typing, - TResult? Function(UnsendMessage field0)? unsend, - TResult? Function(EditMessage field0)? edit, - TResult? Function(IconChangeMessage field0)? iconChange, - TResult? Function(bool field0)? enableSmsActivation, - TResult? Function()? messageReadOnDevice, - TResult? Function(bool field0)? smsConfirmSent, - TResult? Function()? markUnread, - TResult? Function()? peerCacheInvalidate, - TResult? Function(UpdateExtensionMessage field0)? updateExtension, - TResult? Function(ErrorMessage field0)? error, - TResult? Function(MoveToRecycleBinMessage field0)? moveToRecycleBin, - TResult? Function(OperatedChat field0)? recoverChat, - TResult? Function(PermanentDeleteMessage field0)? permanentDelete, - TResult? Function()? unschedule, - TResult? Function(UpdateProfileMessage field0)? updateProfile, - TResult? Function(UpdateProfileSharingMessage field0)? updateProfileSharing, - TResult? Function(ShareProfileMessage field0)? shareProfile, - TResult? Function()? notifyAnyways, - TResult? Function(SetTranscriptBackgroundMessage field0)? - setTranscriptBackground, - }) { - return delivered?.call(); - } +@optionalTypeArgs TResult maybeWhen({TResult Function( IdmsRequestedSignIn field0)? requestedSignIn,TResult Function( TeardownSignIn field0)? teardownSignIn,TResult Function( IdmsCircleMessage field0, IdmsRequestedSignIn? field1)? circleRequest,required TResult orElse(),}) {final _that = this; +switch (_that) { +case IdmsMessage_RequestedSignIn() when requestedSignIn != null: +return requestedSignIn(_that.field0);case IdmsMessage_TeardownSignIn() when teardownSignIn != null: +return teardownSignIn(_that.field0);case IdmsMessage_CircleRequest() when circleRequest != null: +return circleRequest(_that.field0,_that.field1);case _: + return orElse(); - @override - @optionalTypeArgs - TResult maybeWhen({ - TResult Function(NormalMessage field0)? message, - TResult Function(RenameMessage field0)? renameMessage, - TResult Function(ChangeParticipantMessage field0)? changeParticipants, - TResult Function(ReactMessage field0)? react, - TResult Function()? delivered, - TResult Function()? read, - TResult Function(bool field0, TypingApp? field1)? typing, - TResult Function(UnsendMessage field0)? unsend, - TResult Function(EditMessage field0)? edit, - TResult Function(IconChangeMessage field0)? iconChange, - TResult Function(bool field0)? enableSmsActivation, - TResult Function()? messageReadOnDevice, - TResult Function(bool field0)? smsConfirmSent, - TResult Function()? markUnread, - TResult Function()? peerCacheInvalidate, - TResult Function(UpdateExtensionMessage field0)? updateExtension, - TResult Function(ErrorMessage field0)? error, - TResult Function(MoveToRecycleBinMessage field0)? moveToRecycleBin, - TResult Function(OperatedChat field0)? recoverChat, - TResult Function(PermanentDeleteMessage field0)? permanentDelete, - TResult Function()? unschedule, - TResult Function(UpdateProfileMessage field0)? updateProfile, - TResult Function(UpdateProfileSharingMessage field0)? updateProfileSharing, - TResult Function(ShareProfileMessage field0)? shareProfile, - TResult Function()? notifyAnyways, - TResult Function(SetTranscriptBackgroundMessage field0)? - setTranscriptBackground, - required TResult orElse(), - }) { - if (delivered != null) { - return delivered(); - } - return orElse(); - } +} +} +/// A `switch`-like method, using callbacks. +/// +/// As opposed to `map`, this offers destructuring. +/// It is equivalent to doing: +/// ```dart +/// switch (sealedClass) { +/// case Subclass(:final field): +/// return ...; +/// case Subclass2(:final field2): +/// return ...; +/// } +/// ``` - @override - @optionalTypeArgs - TResult map({ - required TResult Function(Message_Message value) message, - required TResult Function(Message_RenameMessage value) renameMessage, - required TResult Function(Message_ChangeParticipants value) - changeParticipants, - required TResult Function(Message_React value) react, - required TResult Function(Message_Delivered value) delivered, - required TResult Function(Message_Read value) read, - required TResult Function(Message_Typing value) typing, - required TResult Function(Message_Unsend value) unsend, - required TResult Function(Message_Edit value) edit, - required TResult Function(Message_IconChange value) iconChange, - required TResult Function(Message_EnableSmsActivation value) - enableSmsActivation, - required TResult Function(Message_MessageReadOnDevice value) - messageReadOnDevice, - required TResult Function(Message_SmsConfirmSent value) smsConfirmSent, - required TResult Function(Message_MarkUnread value) markUnread, - required TResult Function(Message_PeerCacheInvalidate value) - peerCacheInvalidate, - required TResult Function(Message_UpdateExtension value) updateExtension, - required TResult Function(Message_Error value) error, - required TResult Function(Message_MoveToRecycleBin value) moveToRecycleBin, - required TResult Function(Message_RecoverChat value) recoverChat, - required TResult Function(Message_PermanentDelete value) permanentDelete, - required TResult Function(Message_Unschedule value) unschedule, - required TResult Function(Message_UpdateProfile value) updateProfile, - required TResult Function(Message_UpdateProfileSharing value) - updateProfileSharing, - required TResult Function(Message_ShareProfile value) shareProfile, - required TResult Function(Message_NotifyAnyways value) notifyAnyways, - required TResult Function(Message_SetTranscriptBackground value) - setTranscriptBackground, - }) { - return delivered(this); - } +@optionalTypeArgs TResult when({required TResult Function( IdmsRequestedSignIn field0) requestedSignIn,required TResult Function( TeardownSignIn field0) teardownSignIn,required TResult Function( IdmsCircleMessage field0, IdmsRequestedSignIn? field1) circleRequest,}) {final _that = this; +switch (_that) { +case IdmsMessage_RequestedSignIn(): +return requestedSignIn(_that.field0);case IdmsMessage_TeardownSignIn(): +return teardownSignIn(_that.field0);case IdmsMessage_CircleRequest(): +return circleRequest(_that.field0,_that.field1);} +} +/// A variant of `when` that fallback to returning `null` +/// +/// It is equivalent to doing: +/// ```dart +/// switch (sealedClass) { +/// case Subclass(:final field): +/// return ...; +/// case _: +/// return null; +/// } +/// ``` - @override - @optionalTypeArgs - TResult? mapOrNull({ - TResult? Function(Message_Message value)? message, - TResult? Function(Message_RenameMessage value)? renameMessage, - TResult? Function(Message_ChangeParticipants value)? changeParticipants, - TResult? Function(Message_React value)? react, - TResult? Function(Message_Delivered value)? delivered, - TResult? Function(Message_Read value)? read, - TResult? Function(Message_Typing value)? typing, - TResult? Function(Message_Unsend value)? unsend, - TResult? Function(Message_Edit value)? edit, - TResult? Function(Message_IconChange value)? iconChange, - TResult? Function(Message_EnableSmsActivation value)? enableSmsActivation, - TResult? Function(Message_MessageReadOnDevice value)? messageReadOnDevice, - TResult? Function(Message_SmsConfirmSent value)? smsConfirmSent, - TResult? Function(Message_MarkUnread value)? markUnread, - TResult? Function(Message_PeerCacheInvalidate value)? peerCacheInvalidate, - TResult? Function(Message_UpdateExtension value)? updateExtension, - TResult? Function(Message_Error value)? error, - TResult? Function(Message_MoveToRecycleBin value)? moveToRecycleBin, - TResult? Function(Message_RecoverChat value)? recoverChat, - TResult? Function(Message_PermanentDelete value)? permanentDelete, - TResult? Function(Message_Unschedule value)? unschedule, - TResult? Function(Message_UpdateProfile value)? updateProfile, - TResult? Function(Message_UpdateProfileSharing value)? updateProfileSharing, - TResult? Function(Message_ShareProfile value)? shareProfile, - TResult? Function(Message_NotifyAnyways value)? notifyAnyways, - TResult? Function(Message_SetTranscriptBackground value)? - setTranscriptBackground, - }) { - return delivered?.call(this); - } +@optionalTypeArgs TResult? whenOrNull({TResult? Function( IdmsRequestedSignIn field0)? requestedSignIn,TResult? Function( TeardownSignIn field0)? teardownSignIn,TResult? Function( IdmsCircleMessage field0, IdmsRequestedSignIn? field1)? circleRequest,}) {final _that = this; +switch (_that) { +case IdmsMessage_RequestedSignIn() when requestedSignIn != null: +return requestedSignIn(_that.field0);case IdmsMessage_TeardownSignIn() when teardownSignIn != null: +return teardownSignIn(_that.field0);case IdmsMessage_CircleRequest() when circleRequest != null: +return circleRequest(_that.field0,_that.field1);case _: + return null; - @override - @optionalTypeArgs - TResult maybeMap({ - TResult Function(Message_Message value)? message, - TResult Function(Message_RenameMessage value)? renameMessage, - TResult Function(Message_ChangeParticipants value)? changeParticipants, - TResult Function(Message_React value)? react, - TResult Function(Message_Delivered value)? delivered, - TResult Function(Message_Read value)? read, - TResult Function(Message_Typing value)? typing, - TResult Function(Message_Unsend value)? unsend, - TResult Function(Message_Edit value)? edit, - TResult Function(Message_IconChange value)? iconChange, - TResult Function(Message_EnableSmsActivation value)? enableSmsActivation, - TResult Function(Message_MessageReadOnDevice value)? messageReadOnDevice, - TResult Function(Message_SmsConfirmSent value)? smsConfirmSent, - TResult Function(Message_MarkUnread value)? markUnread, - TResult Function(Message_PeerCacheInvalidate value)? peerCacheInvalidate, - TResult Function(Message_UpdateExtension value)? updateExtension, - TResult Function(Message_Error value)? error, - TResult Function(Message_MoveToRecycleBin value)? moveToRecycleBin, - TResult Function(Message_RecoverChat value)? recoverChat, - TResult Function(Message_PermanentDelete value)? permanentDelete, - TResult Function(Message_Unschedule value)? unschedule, - TResult Function(Message_UpdateProfile value)? updateProfile, - TResult Function(Message_UpdateProfileSharing value)? updateProfileSharing, - TResult Function(Message_ShareProfile value)? shareProfile, - TResult Function(Message_NotifyAnyways value)? notifyAnyways, - TResult Function(Message_SetTranscriptBackground value)? - setTranscriptBackground, - required TResult orElse(), - }) { - if (delivered != null) { - return delivered(this); - } - return orElse(); - } } - -abstract class Message_Delivered extends Message { - const factory Message_Delivered() = _$Message_DeliveredImpl; - const Message_Delivered._() : super._(); } -/// @nodoc -abstract class _$$Message_ReadImplCopyWith<$Res> { - factory _$$Message_ReadImplCopyWith( - _$Message_ReadImpl value, $Res Function(_$Message_ReadImpl) then) = - __$$Message_ReadImplCopyWithImpl<$Res>; } /// @nodoc -class __$$Message_ReadImplCopyWithImpl<$Res> - extends _$MessageCopyWithImpl<$Res, _$Message_ReadImpl> - implements _$$Message_ReadImplCopyWith<$Res> { - __$$Message_ReadImplCopyWithImpl( - _$Message_ReadImpl _value, $Res Function(_$Message_ReadImpl) _then) - : super(_value, _then); - /// Create a copy of Message - /// with the given fields replaced by the non-null parameter values. -} -/// @nodoc +class IdmsMessage_RequestedSignIn extends IdmsMessage { + const IdmsMessage_RequestedSignIn(this.field0): super._(); -class _$Message_ReadImpl extends Message_Read { - const _$Message_ReadImpl() : super._(); - @override - String toString() { - return 'Message.read()'; - } +@override final IdmsRequestedSignIn field0; - @override - bool operator ==(Object other) { - return identical(this, other) || - (other.runtimeType == runtimeType && other is _$Message_ReadImpl); - } +/// Create a copy of IdmsMessage +/// with the given fields replaced by the non-null parameter values. +@JsonKey(includeFromJson: false, includeToJson: false) +@pragma('vm:prefer-inline') +$IdmsMessage_RequestedSignInCopyWith get copyWith => _$IdmsMessage_RequestedSignInCopyWithImpl(this, _$identity); - @override - int get hashCode => runtimeType.hashCode; - - @override - @optionalTypeArgs - TResult when({ - required TResult Function(NormalMessage field0) message, - required TResult Function(RenameMessage field0) renameMessage, - required TResult Function(ChangeParticipantMessage field0) - changeParticipants, - required TResult Function(ReactMessage field0) react, - required TResult Function() delivered, - required TResult Function() read, - required TResult Function(bool field0, TypingApp? field1) typing, - required TResult Function(UnsendMessage field0) unsend, - required TResult Function(EditMessage field0) edit, - required TResult Function(IconChangeMessage field0) iconChange, - required TResult Function(bool field0) enableSmsActivation, - required TResult Function() messageReadOnDevice, - required TResult Function(bool field0) smsConfirmSent, - required TResult Function() markUnread, - required TResult Function() peerCacheInvalidate, - required TResult Function(UpdateExtensionMessage field0) updateExtension, - required TResult Function(ErrorMessage field0) error, - required TResult Function(MoveToRecycleBinMessage field0) moveToRecycleBin, - required TResult Function(OperatedChat field0) recoverChat, - required TResult Function(PermanentDeleteMessage field0) permanentDelete, - required TResult Function() unschedule, - required TResult Function(UpdateProfileMessage field0) updateProfile, - required TResult Function(UpdateProfileSharingMessage field0) - updateProfileSharing, - required TResult Function(ShareProfileMessage field0) shareProfile, - required TResult Function() notifyAnyways, - required TResult Function(SetTranscriptBackgroundMessage field0) - setTranscriptBackground, - }) { - return read(); - } - @override - @optionalTypeArgs - TResult? whenOrNull({ - TResult? Function(NormalMessage field0)? message, - TResult? Function(RenameMessage field0)? renameMessage, - TResult? Function(ChangeParticipantMessage field0)? changeParticipants, - TResult? Function(ReactMessage field0)? react, - TResult? Function()? delivered, - TResult? Function()? read, - TResult? Function(bool field0, TypingApp? field1)? typing, - TResult? Function(UnsendMessage field0)? unsend, - TResult? Function(EditMessage field0)? edit, - TResult? Function(IconChangeMessage field0)? iconChange, - TResult? Function(bool field0)? enableSmsActivation, - TResult? Function()? messageReadOnDevice, - TResult? Function(bool field0)? smsConfirmSent, - TResult? Function()? markUnread, - TResult? Function()? peerCacheInvalidate, - TResult? Function(UpdateExtensionMessage field0)? updateExtension, - TResult? Function(ErrorMessage field0)? error, - TResult? Function(MoveToRecycleBinMessage field0)? moveToRecycleBin, - TResult? Function(OperatedChat field0)? recoverChat, - TResult? Function(PermanentDeleteMessage field0)? permanentDelete, - TResult? Function()? unschedule, - TResult? Function(UpdateProfileMessage field0)? updateProfile, - TResult? Function(UpdateProfileSharingMessage field0)? updateProfileSharing, - TResult? Function(ShareProfileMessage field0)? shareProfile, - TResult? Function()? notifyAnyways, - TResult? Function(SetTranscriptBackgroundMessage field0)? - setTranscriptBackground, - }) { - return read?.call(); - } - @override - @optionalTypeArgs - TResult maybeWhen({ - TResult Function(NormalMessage field0)? message, - TResult Function(RenameMessage field0)? renameMessage, - TResult Function(ChangeParticipantMessage field0)? changeParticipants, - TResult Function(ReactMessage field0)? react, - TResult Function()? delivered, - TResult Function()? read, - TResult Function(bool field0, TypingApp? field1)? typing, - TResult Function(UnsendMessage field0)? unsend, - TResult Function(EditMessage field0)? edit, - TResult Function(IconChangeMessage field0)? iconChange, - TResult Function(bool field0)? enableSmsActivation, - TResult Function()? messageReadOnDevice, - TResult Function(bool field0)? smsConfirmSent, - TResult Function()? markUnread, - TResult Function()? peerCacheInvalidate, - TResult Function(UpdateExtensionMessage field0)? updateExtension, - TResult Function(ErrorMessage field0)? error, - TResult Function(MoveToRecycleBinMessage field0)? moveToRecycleBin, - TResult Function(OperatedChat field0)? recoverChat, - TResult Function(PermanentDeleteMessage field0)? permanentDelete, - TResult Function()? unschedule, - TResult Function(UpdateProfileMessage field0)? updateProfile, - TResult Function(UpdateProfileSharingMessage field0)? updateProfileSharing, - TResult Function(ShareProfileMessage field0)? shareProfile, - TResult Function()? notifyAnyways, - TResult Function(SetTranscriptBackgroundMessage field0)? - setTranscriptBackground, - required TResult orElse(), - }) { - if (read != null) { - return read(); - } - return orElse(); - } +@override +bool operator ==(Object other) { + return identical(this, other) || (other.runtimeType == runtimeType&&other is IdmsMessage_RequestedSignIn&&(identical(other.field0, field0) || other.field0 == field0)); +} - @override - @optionalTypeArgs - TResult map({ - required TResult Function(Message_Message value) message, - required TResult Function(Message_RenameMessage value) renameMessage, - required TResult Function(Message_ChangeParticipants value) - changeParticipants, - required TResult Function(Message_React value) react, - required TResult Function(Message_Delivered value) delivered, - required TResult Function(Message_Read value) read, - required TResult Function(Message_Typing value) typing, - required TResult Function(Message_Unsend value) unsend, - required TResult Function(Message_Edit value) edit, - required TResult Function(Message_IconChange value) iconChange, - required TResult Function(Message_EnableSmsActivation value) - enableSmsActivation, - required TResult Function(Message_MessageReadOnDevice value) - messageReadOnDevice, - required TResult Function(Message_SmsConfirmSent value) smsConfirmSent, - required TResult Function(Message_MarkUnread value) markUnread, - required TResult Function(Message_PeerCacheInvalidate value) - peerCacheInvalidate, - required TResult Function(Message_UpdateExtension value) updateExtension, - required TResult Function(Message_Error value) error, - required TResult Function(Message_MoveToRecycleBin value) moveToRecycleBin, - required TResult Function(Message_RecoverChat value) recoverChat, - required TResult Function(Message_PermanentDelete value) permanentDelete, - required TResult Function(Message_Unschedule value) unschedule, - required TResult Function(Message_UpdateProfile value) updateProfile, - required TResult Function(Message_UpdateProfileSharing value) - updateProfileSharing, - required TResult Function(Message_ShareProfile value) shareProfile, - required TResult Function(Message_NotifyAnyways value) notifyAnyways, - required TResult Function(Message_SetTranscriptBackground value) - setTranscriptBackground, - }) { - return read(this); - } - @override - @optionalTypeArgs - TResult? mapOrNull({ - TResult? Function(Message_Message value)? message, - TResult? Function(Message_RenameMessage value)? renameMessage, - TResult? Function(Message_ChangeParticipants value)? changeParticipants, - TResult? Function(Message_React value)? react, - TResult? Function(Message_Delivered value)? delivered, - TResult? Function(Message_Read value)? read, - TResult? Function(Message_Typing value)? typing, - TResult? Function(Message_Unsend value)? unsend, - TResult? Function(Message_Edit value)? edit, - TResult? Function(Message_IconChange value)? iconChange, - TResult? Function(Message_EnableSmsActivation value)? enableSmsActivation, - TResult? Function(Message_MessageReadOnDevice value)? messageReadOnDevice, - TResult? Function(Message_SmsConfirmSent value)? smsConfirmSent, - TResult? Function(Message_MarkUnread value)? markUnread, - TResult? Function(Message_PeerCacheInvalidate value)? peerCacheInvalidate, - TResult? Function(Message_UpdateExtension value)? updateExtension, - TResult? Function(Message_Error value)? error, - TResult? Function(Message_MoveToRecycleBin value)? moveToRecycleBin, - TResult? Function(Message_RecoverChat value)? recoverChat, - TResult? Function(Message_PermanentDelete value)? permanentDelete, - TResult? Function(Message_Unschedule value)? unschedule, - TResult? Function(Message_UpdateProfile value)? updateProfile, - TResult? Function(Message_UpdateProfileSharing value)? updateProfileSharing, - TResult? Function(Message_ShareProfile value)? shareProfile, - TResult? Function(Message_NotifyAnyways value)? notifyAnyways, - TResult? Function(Message_SetTranscriptBackground value)? - setTranscriptBackground, - }) { - return read?.call(this); - } +@override +int get hashCode => Object.hash(runtimeType,field0); - @override - @optionalTypeArgs - TResult maybeMap({ - TResult Function(Message_Message value)? message, - TResult Function(Message_RenameMessage value)? renameMessage, - TResult Function(Message_ChangeParticipants value)? changeParticipants, - TResult Function(Message_React value)? react, - TResult Function(Message_Delivered value)? delivered, - TResult Function(Message_Read value)? read, - TResult Function(Message_Typing value)? typing, - TResult Function(Message_Unsend value)? unsend, - TResult Function(Message_Edit value)? edit, - TResult Function(Message_IconChange value)? iconChange, - TResult Function(Message_EnableSmsActivation value)? enableSmsActivation, - TResult Function(Message_MessageReadOnDevice value)? messageReadOnDevice, - TResult Function(Message_SmsConfirmSent value)? smsConfirmSent, - TResult Function(Message_MarkUnread value)? markUnread, - TResult Function(Message_PeerCacheInvalidate value)? peerCacheInvalidate, - TResult Function(Message_UpdateExtension value)? updateExtension, - TResult Function(Message_Error value)? error, - TResult Function(Message_MoveToRecycleBin value)? moveToRecycleBin, - TResult Function(Message_RecoverChat value)? recoverChat, - TResult Function(Message_PermanentDelete value)? permanentDelete, - TResult Function(Message_Unschedule value)? unschedule, - TResult Function(Message_UpdateProfile value)? updateProfile, - TResult Function(Message_UpdateProfileSharing value)? updateProfileSharing, - TResult Function(Message_ShareProfile value)? shareProfile, - TResult Function(Message_NotifyAnyways value)? notifyAnyways, - TResult Function(Message_SetTranscriptBackground value)? - setTranscriptBackground, - required TResult orElse(), - }) { - if (read != null) { - return read(this); - } - return orElse(); - } +@override +String toString() { + return 'IdmsMessage.requestedSignIn(field0: $field0)'; } -abstract class Message_Read extends Message { - const factory Message_Read() = _$Message_ReadImpl; - const Message_Read._() : super._(); -} - -/// @nodoc -abstract class _$$Message_TypingImplCopyWith<$Res> { - factory _$$Message_TypingImplCopyWith(_$Message_TypingImpl value, - $Res Function(_$Message_TypingImpl) then) = - __$$Message_TypingImplCopyWithImpl<$Res>; - @useResult - $Res call({bool field0, TypingApp? field1}); -} - -/// @nodoc -class __$$Message_TypingImplCopyWithImpl<$Res> - extends _$MessageCopyWithImpl<$Res, _$Message_TypingImpl> - implements _$$Message_TypingImplCopyWith<$Res> { - __$$Message_TypingImplCopyWithImpl( - _$Message_TypingImpl _value, $Res Function(_$Message_TypingImpl) _then) - : super(_value, _then); - - /// Create a copy of Message - /// with the given fields replaced by the non-null parameter values. - @pragma('vm:prefer-inline') - @override - $Res call({ - Object? field0 = null, - Object? field1 = freezed, - }) { - return _then(_$Message_TypingImpl( - null == field0 - ? _value.field0 - : field0 // ignore: cast_nullable_to_non_nullable - as bool, - freezed == field1 - ? _value.field1 - : field1 // ignore: cast_nullable_to_non_nullable - as TypingApp?, - )); - } + } /// @nodoc +abstract mixin class $IdmsMessage_RequestedSignInCopyWith<$Res> implements $IdmsMessageCopyWith<$Res> { + factory $IdmsMessage_RequestedSignInCopyWith(IdmsMessage_RequestedSignIn value, $Res Function(IdmsMessage_RequestedSignIn) _then) = _$IdmsMessage_RequestedSignInCopyWithImpl; +@useResult +$Res call({ + IdmsRequestedSignIn field0 +}); -class _$Message_TypingImpl extends Message_Typing { - const _$Message_TypingImpl(this.field0, [this.field1]) : super._(); - - @override - final bool field0; - @override - final TypingApp? field1; - - @override - String toString() { - return 'Message.typing(field0: $field0, field1: $field1)'; - } - - @override - bool operator ==(Object other) { - return identical(this, other) || - (other.runtimeType == runtimeType && - other is _$Message_TypingImpl && - (identical(other.field0, field0) || other.field0 == field0) && - (identical(other.field1, field1) || other.field1 == field1)); - } - - @override - int get hashCode => Object.hash(runtimeType, field0, field1); - - /// Create a copy of Message - /// with the given fields replaced by the non-null parameter values. - @JsonKey(includeFromJson: false, includeToJson: false) - @override - @pragma('vm:prefer-inline') - _$$Message_TypingImplCopyWith<_$Message_TypingImpl> get copyWith => - __$$Message_TypingImplCopyWithImpl<_$Message_TypingImpl>( - this, _$identity); - - @override - @optionalTypeArgs - TResult when({ - required TResult Function(NormalMessage field0) message, - required TResult Function(RenameMessage field0) renameMessage, - required TResult Function(ChangeParticipantMessage field0) - changeParticipants, - required TResult Function(ReactMessage field0) react, - required TResult Function() delivered, - required TResult Function() read, - required TResult Function(bool field0, TypingApp? field1) typing, - required TResult Function(UnsendMessage field0) unsend, - required TResult Function(EditMessage field0) edit, - required TResult Function(IconChangeMessage field0) iconChange, - required TResult Function(bool field0) enableSmsActivation, - required TResult Function() messageReadOnDevice, - required TResult Function(bool field0) smsConfirmSent, - required TResult Function() markUnread, - required TResult Function() peerCacheInvalidate, - required TResult Function(UpdateExtensionMessage field0) updateExtension, - required TResult Function(ErrorMessage field0) error, - required TResult Function(MoveToRecycleBinMessage field0) moveToRecycleBin, - required TResult Function(OperatedChat field0) recoverChat, - required TResult Function(PermanentDeleteMessage field0) permanentDelete, - required TResult Function() unschedule, - required TResult Function(UpdateProfileMessage field0) updateProfile, - required TResult Function(UpdateProfileSharingMessage field0) - updateProfileSharing, - required TResult Function(ShareProfileMessage field0) shareProfile, - required TResult Function() notifyAnyways, - required TResult Function(SetTranscriptBackgroundMessage field0) - setTranscriptBackground, - }) { - return typing(field0, field1); - } - @override - @optionalTypeArgs - TResult? whenOrNull({ - TResult? Function(NormalMessage field0)? message, - TResult? Function(RenameMessage field0)? renameMessage, - TResult? Function(ChangeParticipantMessage field0)? changeParticipants, - TResult? Function(ReactMessage field0)? react, - TResult? Function()? delivered, - TResult? Function()? read, - TResult? Function(bool field0, TypingApp? field1)? typing, - TResult? Function(UnsendMessage field0)? unsend, - TResult? Function(EditMessage field0)? edit, - TResult? Function(IconChangeMessage field0)? iconChange, - TResult? Function(bool field0)? enableSmsActivation, - TResult? Function()? messageReadOnDevice, - TResult? Function(bool field0)? smsConfirmSent, - TResult? Function()? markUnread, - TResult? Function()? peerCacheInvalidate, - TResult? Function(UpdateExtensionMessage field0)? updateExtension, - TResult? Function(ErrorMessage field0)? error, - TResult? Function(MoveToRecycleBinMessage field0)? moveToRecycleBin, - TResult? Function(OperatedChat field0)? recoverChat, - TResult? Function(PermanentDeleteMessage field0)? permanentDelete, - TResult? Function()? unschedule, - TResult? Function(UpdateProfileMessage field0)? updateProfile, - TResult? Function(UpdateProfileSharingMessage field0)? updateProfileSharing, - TResult? Function(ShareProfileMessage field0)? shareProfile, - TResult? Function()? notifyAnyways, - TResult? Function(SetTranscriptBackgroundMessage field0)? - setTranscriptBackground, - }) { - return typing?.call(field0, field1); - } - @override - @optionalTypeArgs - TResult maybeWhen({ - TResult Function(NormalMessage field0)? message, - TResult Function(RenameMessage field0)? renameMessage, - TResult Function(ChangeParticipantMessage field0)? changeParticipants, - TResult Function(ReactMessage field0)? react, - TResult Function()? delivered, - TResult Function()? read, - TResult Function(bool field0, TypingApp? field1)? typing, - TResult Function(UnsendMessage field0)? unsend, - TResult Function(EditMessage field0)? edit, - TResult Function(IconChangeMessage field0)? iconChange, - TResult Function(bool field0)? enableSmsActivation, - TResult Function()? messageReadOnDevice, - TResult Function(bool field0)? smsConfirmSent, - TResult Function()? markUnread, - TResult Function()? peerCacheInvalidate, - TResult Function(UpdateExtensionMessage field0)? updateExtension, - TResult Function(ErrorMessage field0)? error, - TResult Function(MoveToRecycleBinMessage field0)? moveToRecycleBin, - TResult Function(OperatedChat field0)? recoverChat, - TResult Function(PermanentDeleteMessage field0)? permanentDelete, - TResult Function()? unschedule, - TResult Function(UpdateProfileMessage field0)? updateProfile, - TResult Function(UpdateProfileSharingMessage field0)? updateProfileSharing, - TResult Function(ShareProfileMessage field0)? shareProfile, - TResult Function()? notifyAnyways, - TResult Function(SetTranscriptBackgroundMessage field0)? - setTranscriptBackground, - required TResult orElse(), - }) { - if (typing != null) { - return typing(field0, field1); - } - return orElse(); - } - @override - @optionalTypeArgs - TResult map({ - required TResult Function(Message_Message value) message, - required TResult Function(Message_RenameMessage value) renameMessage, - required TResult Function(Message_ChangeParticipants value) - changeParticipants, - required TResult Function(Message_React value) react, - required TResult Function(Message_Delivered value) delivered, - required TResult Function(Message_Read value) read, - required TResult Function(Message_Typing value) typing, - required TResult Function(Message_Unsend value) unsend, - required TResult Function(Message_Edit value) edit, - required TResult Function(Message_IconChange value) iconChange, - required TResult Function(Message_EnableSmsActivation value) - enableSmsActivation, - required TResult Function(Message_MessageReadOnDevice value) - messageReadOnDevice, - required TResult Function(Message_SmsConfirmSent value) smsConfirmSent, - required TResult Function(Message_MarkUnread value) markUnread, - required TResult Function(Message_PeerCacheInvalidate value) - peerCacheInvalidate, - required TResult Function(Message_UpdateExtension value) updateExtension, - required TResult Function(Message_Error value) error, - required TResult Function(Message_MoveToRecycleBin value) moveToRecycleBin, - required TResult Function(Message_RecoverChat value) recoverChat, - required TResult Function(Message_PermanentDelete value) permanentDelete, - required TResult Function(Message_Unschedule value) unschedule, - required TResult Function(Message_UpdateProfile value) updateProfile, - required TResult Function(Message_UpdateProfileSharing value) - updateProfileSharing, - required TResult Function(Message_ShareProfile value) shareProfile, - required TResult Function(Message_NotifyAnyways value) notifyAnyways, - required TResult Function(Message_SetTranscriptBackground value) - setTranscriptBackground, - }) { - return typing(this); - } +} +/// @nodoc +class _$IdmsMessage_RequestedSignInCopyWithImpl<$Res> + implements $IdmsMessage_RequestedSignInCopyWith<$Res> { + _$IdmsMessage_RequestedSignInCopyWithImpl(this._self, this._then); - @override - @optionalTypeArgs - TResult? mapOrNull({ - TResult? Function(Message_Message value)? message, - TResult? Function(Message_RenameMessage value)? renameMessage, - TResult? Function(Message_ChangeParticipants value)? changeParticipants, - TResult? Function(Message_React value)? react, - TResult? Function(Message_Delivered value)? delivered, - TResult? Function(Message_Read value)? read, - TResult? Function(Message_Typing value)? typing, - TResult? Function(Message_Unsend value)? unsend, - TResult? Function(Message_Edit value)? edit, - TResult? Function(Message_IconChange value)? iconChange, - TResult? Function(Message_EnableSmsActivation value)? enableSmsActivation, - TResult? Function(Message_MessageReadOnDevice value)? messageReadOnDevice, - TResult? Function(Message_SmsConfirmSent value)? smsConfirmSent, - TResult? Function(Message_MarkUnread value)? markUnread, - TResult? Function(Message_PeerCacheInvalidate value)? peerCacheInvalidate, - TResult? Function(Message_UpdateExtension value)? updateExtension, - TResult? Function(Message_Error value)? error, - TResult? Function(Message_MoveToRecycleBin value)? moveToRecycleBin, - TResult? Function(Message_RecoverChat value)? recoverChat, - TResult? Function(Message_PermanentDelete value)? permanentDelete, - TResult? Function(Message_Unschedule value)? unschedule, - TResult? Function(Message_UpdateProfile value)? updateProfile, - TResult? Function(Message_UpdateProfileSharing value)? updateProfileSharing, - TResult? Function(Message_ShareProfile value)? shareProfile, - TResult? Function(Message_NotifyAnyways value)? notifyAnyways, - TResult? Function(Message_SetTranscriptBackground value)? - setTranscriptBackground, - }) { - return typing?.call(this); - } + final IdmsMessage_RequestedSignIn _self; + final $Res Function(IdmsMessage_RequestedSignIn) _then; - @override - @optionalTypeArgs - TResult maybeMap({ - TResult Function(Message_Message value)? message, - TResult Function(Message_RenameMessage value)? renameMessage, - TResult Function(Message_ChangeParticipants value)? changeParticipants, - TResult Function(Message_React value)? react, - TResult Function(Message_Delivered value)? delivered, - TResult Function(Message_Read value)? read, - TResult Function(Message_Typing value)? typing, - TResult Function(Message_Unsend value)? unsend, - TResult Function(Message_Edit value)? edit, - TResult Function(Message_IconChange value)? iconChange, - TResult Function(Message_EnableSmsActivation value)? enableSmsActivation, - TResult Function(Message_MessageReadOnDevice value)? messageReadOnDevice, - TResult Function(Message_SmsConfirmSent value)? smsConfirmSent, - TResult Function(Message_MarkUnread value)? markUnread, - TResult Function(Message_PeerCacheInvalidate value)? peerCacheInvalidate, - TResult Function(Message_UpdateExtension value)? updateExtension, - TResult Function(Message_Error value)? error, - TResult Function(Message_MoveToRecycleBin value)? moveToRecycleBin, - TResult Function(Message_RecoverChat value)? recoverChat, - TResult Function(Message_PermanentDelete value)? permanentDelete, - TResult Function(Message_Unschedule value)? unschedule, - TResult Function(Message_UpdateProfile value)? updateProfile, - TResult Function(Message_UpdateProfileSharing value)? updateProfileSharing, - TResult Function(Message_ShareProfile value)? shareProfile, - TResult Function(Message_NotifyAnyways value)? notifyAnyways, - TResult Function(Message_SetTranscriptBackground value)? - setTranscriptBackground, - required TResult orElse(), - }) { - if (typing != null) { - return typing(this); - } - return orElse(); - } +/// Create a copy of IdmsMessage +/// with the given fields replaced by the non-null parameter values. +@pragma('vm:prefer-inline') $Res call({Object? field0 = null,}) { + return _then(IdmsMessage_RequestedSignIn( +null == field0 ? _self.field0 : field0 // ignore: cast_nullable_to_non_nullable +as IdmsRequestedSignIn, + )); } -abstract class Message_Typing extends Message { - const factory Message_Typing(final bool field0, [final TypingApp? field1]) = - _$Message_TypingImpl; - const Message_Typing._() : super._(); - bool get field0; - TypingApp? get field1; - - /// Create a copy of Message - /// with the given fields replaced by the non-null parameter values. - @JsonKey(includeFromJson: false, includeToJson: false) - _$$Message_TypingImplCopyWith<_$Message_TypingImpl> get copyWith => - throw _privateConstructorUsedError; } /// @nodoc -abstract class _$$Message_UnsendImplCopyWith<$Res> { - factory _$$Message_UnsendImplCopyWith(_$Message_UnsendImpl value, - $Res Function(_$Message_UnsendImpl) then) = - __$$Message_UnsendImplCopyWithImpl<$Res>; - @useResult - $Res call({UnsendMessage field0}); -} -/// @nodoc -class __$$Message_UnsendImplCopyWithImpl<$Res> - extends _$MessageCopyWithImpl<$Res, _$Message_UnsendImpl> - implements _$$Message_UnsendImplCopyWith<$Res> { - __$$Message_UnsendImplCopyWithImpl( - _$Message_UnsendImpl _value, $Res Function(_$Message_UnsendImpl) _then) - : super(_value, _then); - /// Create a copy of Message - /// with the given fields replaced by the non-null parameter values. - @pragma('vm:prefer-inline') - @override - $Res call({ - Object? field0 = null, - }) { - return _then(_$Message_UnsendImpl( - null == field0 - ? _value.field0 - : field0 // ignore: cast_nullable_to_non_nullable - as UnsendMessage, - )); - } -} +class IdmsMessage_TeardownSignIn extends IdmsMessage { + const IdmsMessage_TeardownSignIn(this.field0): super._(); -/// @nodoc -class _$Message_UnsendImpl extends Message_Unsend { - const _$Message_UnsendImpl(this.field0) : super._(); +@override final TeardownSignIn field0; - @override - final UnsendMessage field0; +/// Create a copy of IdmsMessage +/// with the given fields replaced by the non-null parameter values. +@JsonKey(includeFromJson: false, includeToJson: false) +@pragma('vm:prefer-inline') +$IdmsMessage_TeardownSignInCopyWith get copyWith => _$IdmsMessage_TeardownSignInCopyWithImpl(this, _$identity); - @override - String toString() { - return 'Message.unsend(field0: $field0)'; - } - @override - bool operator ==(Object other) { - return identical(this, other) || - (other.runtimeType == runtimeType && - other is _$Message_UnsendImpl && - (identical(other.field0, field0) || other.field0 == field0)); - } - @override - int get hashCode => Object.hash(runtimeType, field0); - - /// Create a copy of Message - /// with the given fields replaced by the non-null parameter values. - @JsonKey(includeFromJson: false, includeToJson: false) - @override - @pragma('vm:prefer-inline') - _$$Message_UnsendImplCopyWith<_$Message_UnsendImpl> get copyWith => - __$$Message_UnsendImplCopyWithImpl<_$Message_UnsendImpl>( - this, _$identity); - - @override - @optionalTypeArgs - TResult when({ - required TResult Function(NormalMessage field0) message, - required TResult Function(RenameMessage field0) renameMessage, - required TResult Function(ChangeParticipantMessage field0) - changeParticipants, - required TResult Function(ReactMessage field0) react, - required TResult Function() delivered, - required TResult Function() read, - required TResult Function(bool field0, TypingApp? field1) typing, - required TResult Function(UnsendMessage field0) unsend, - required TResult Function(EditMessage field0) edit, - required TResult Function(IconChangeMessage field0) iconChange, - required TResult Function(bool field0) enableSmsActivation, - required TResult Function() messageReadOnDevice, - required TResult Function(bool field0) smsConfirmSent, - required TResult Function() markUnread, - required TResult Function() peerCacheInvalidate, - required TResult Function(UpdateExtensionMessage field0) updateExtension, - required TResult Function(ErrorMessage field0) error, - required TResult Function(MoveToRecycleBinMessage field0) moveToRecycleBin, - required TResult Function(OperatedChat field0) recoverChat, - required TResult Function(PermanentDeleteMessage field0) permanentDelete, - required TResult Function() unschedule, - required TResult Function(UpdateProfileMessage field0) updateProfile, - required TResult Function(UpdateProfileSharingMessage field0) - updateProfileSharing, - required TResult Function(ShareProfileMessage field0) shareProfile, - required TResult Function() notifyAnyways, - required TResult Function(SetTranscriptBackgroundMessage field0) - setTranscriptBackground, - }) { - return unsend(field0); - } +@override +bool operator ==(Object other) { + return identical(this, other) || (other.runtimeType == runtimeType&&other is IdmsMessage_TeardownSignIn&&(identical(other.field0, field0) || other.field0 == field0)); +} - @override - @optionalTypeArgs - TResult? whenOrNull({ - TResult? Function(NormalMessage field0)? message, - TResult? Function(RenameMessage field0)? renameMessage, - TResult? Function(ChangeParticipantMessage field0)? changeParticipants, - TResult? Function(ReactMessage field0)? react, - TResult? Function()? delivered, - TResult? Function()? read, - TResult? Function(bool field0, TypingApp? field1)? typing, - TResult? Function(UnsendMessage field0)? unsend, - TResult? Function(EditMessage field0)? edit, - TResult? Function(IconChangeMessage field0)? iconChange, - TResult? Function(bool field0)? enableSmsActivation, - TResult? Function()? messageReadOnDevice, - TResult? Function(bool field0)? smsConfirmSent, - TResult? Function()? markUnread, - TResult? Function()? peerCacheInvalidate, - TResult? Function(UpdateExtensionMessage field0)? updateExtension, - TResult? Function(ErrorMessage field0)? error, - TResult? Function(MoveToRecycleBinMessage field0)? moveToRecycleBin, - TResult? Function(OperatedChat field0)? recoverChat, - TResult? Function(PermanentDeleteMessage field0)? permanentDelete, - TResult? Function()? unschedule, - TResult? Function(UpdateProfileMessage field0)? updateProfile, - TResult? Function(UpdateProfileSharingMessage field0)? updateProfileSharing, - TResult? Function(ShareProfileMessage field0)? shareProfile, - TResult? Function()? notifyAnyways, - TResult? Function(SetTranscriptBackgroundMessage field0)? - setTranscriptBackground, - }) { - return unsend?.call(field0); - } - @override - @optionalTypeArgs - TResult maybeWhen({ - TResult Function(NormalMessage field0)? message, - TResult Function(RenameMessage field0)? renameMessage, - TResult Function(ChangeParticipantMessage field0)? changeParticipants, - TResult Function(ReactMessage field0)? react, - TResult Function()? delivered, - TResult Function()? read, - TResult Function(bool field0, TypingApp? field1)? typing, - TResult Function(UnsendMessage field0)? unsend, - TResult Function(EditMessage field0)? edit, - TResult Function(IconChangeMessage field0)? iconChange, - TResult Function(bool field0)? enableSmsActivation, - TResult Function()? messageReadOnDevice, - TResult Function(bool field0)? smsConfirmSent, - TResult Function()? markUnread, - TResult Function()? peerCacheInvalidate, - TResult Function(UpdateExtensionMessage field0)? updateExtension, - TResult Function(ErrorMessage field0)? error, - TResult Function(MoveToRecycleBinMessage field0)? moveToRecycleBin, - TResult Function(OperatedChat field0)? recoverChat, - TResult Function(PermanentDeleteMessage field0)? permanentDelete, - TResult Function()? unschedule, - TResult Function(UpdateProfileMessage field0)? updateProfile, - TResult Function(UpdateProfileSharingMessage field0)? updateProfileSharing, - TResult Function(ShareProfileMessage field0)? shareProfile, - TResult Function()? notifyAnyways, - TResult Function(SetTranscriptBackgroundMessage field0)? - setTranscriptBackground, - required TResult orElse(), - }) { - if (unsend != null) { - return unsend(field0); - } - return orElse(); - } +@override +int get hashCode => Object.hash(runtimeType,field0); - @override - @optionalTypeArgs - TResult map({ - required TResult Function(Message_Message value) message, - required TResult Function(Message_RenameMessage value) renameMessage, - required TResult Function(Message_ChangeParticipants value) - changeParticipants, - required TResult Function(Message_React value) react, - required TResult Function(Message_Delivered value) delivered, - required TResult Function(Message_Read value) read, - required TResult Function(Message_Typing value) typing, - required TResult Function(Message_Unsend value) unsend, - required TResult Function(Message_Edit value) edit, - required TResult Function(Message_IconChange value) iconChange, - required TResult Function(Message_EnableSmsActivation value) - enableSmsActivation, - required TResult Function(Message_MessageReadOnDevice value) - messageReadOnDevice, - required TResult Function(Message_SmsConfirmSent value) smsConfirmSent, - required TResult Function(Message_MarkUnread value) markUnread, - required TResult Function(Message_PeerCacheInvalidate value) - peerCacheInvalidate, - required TResult Function(Message_UpdateExtension value) updateExtension, - required TResult Function(Message_Error value) error, - required TResult Function(Message_MoveToRecycleBin value) moveToRecycleBin, - required TResult Function(Message_RecoverChat value) recoverChat, - required TResult Function(Message_PermanentDelete value) permanentDelete, - required TResult Function(Message_Unschedule value) unschedule, - required TResult Function(Message_UpdateProfile value) updateProfile, - required TResult Function(Message_UpdateProfileSharing value) - updateProfileSharing, - required TResult Function(Message_ShareProfile value) shareProfile, - required TResult Function(Message_NotifyAnyways value) notifyAnyways, - required TResult Function(Message_SetTranscriptBackground value) - setTranscriptBackground, - }) { - return unsend(this); - } +@override +String toString() { + return 'IdmsMessage.teardownSignIn(field0: $field0)'; +} - @override - @optionalTypeArgs - TResult? mapOrNull({ - TResult? Function(Message_Message value)? message, - TResult? Function(Message_RenameMessage value)? renameMessage, - TResult? Function(Message_ChangeParticipants value)? changeParticipants, - TResult? Function(Message_React value)? react, - TResult? Function(Message_Delivered value)? delivered, - TResult? Function(Message_Read value)? read, - TResult? Function(Message_Typing value)? typing, - TResult? Function(Message_Unsend value)? unsend, - TResult? Function(Message_Edit value)? edit, - TResult? Function(Message_IconChange value)? iconChange, - TResult? Function(Message_EnableSmsActivation value)? enableSmsActivation, - TResult? Function(Message_MessageReadOnDevice value)? messageReadOnDevice, - TResult? Function(Message_SmsConfirmSent value)? smsConfirmSent, - TResult? Function(Message_MarkUnread value)? markUnread, - TResult? Function(Message_PeerCacheInvalidate value)? peerCacheInvalidate, - TResult? Function(Message_UpdateExtension value)? updateExtension, - TResult? Function(Message_Error value)? error, - TResult? Function(Message_MoveToRecycleBin value)? moveToRecycleBin, - TResult? Function(Message_RecoverChat value)? recoverChat, - TResult? Function(Message_PermanentDelete value)? permanentDelete, - TResult? Function(Message_Unschedule value)? unschedule, - TResult? Function(Message_UpdateProfile value)? updateProfile, - TResult? Function(Message_UpdateProfileSharing value)? updateProfileSharing, - TResult? Function(Message_ShareProfile value)? shareProfile, - TResult? Function(Message_NotifyAnyways value)? notifyAnyways, - TResult? Function(Message_SetTranscriptBackground value)? - setTranscriptBackground, - }) { - return unsend?.call(this); - } - @override - @optionalTypeArgs - TResult maybeMap({ - TResult Function(Message_Message value)? message, - TResult Function(Message_RenameMessage value)? renameMessage, - TResult Function(Message_ChangeParticipants value)? changeParticipants, - TResult Function(Message_React value)? react, - TResult Function(Message_Delivered value)? delivered, - TResult Function(Message_Read value)? read, - TResult Function(Message_Typing value)? typing, - TResult Function(Message_Unsend value)? unsend, - TResult Function(Message_Edit value)? edit, - TResult Function(Message_IconChange value)? iconChange, - TResult Function(Message_EnableSmsActivation value)? enableSmsActivation, - TResult Function(Message_MessageReadOnDevice value)? messageReadOnDevice, - TResult Function(Message_SmsConfirmSent value)? smsConfirmSent, - TResult Function(Message_MarkUnread value)? markUnread, - TResult Function(Message_PeerCacheInvalidate value)? peerCacheInvalidate, - TResult Function(Message_UpdateExtension value)? updateExtension, - TResult Function(Message_Error value)? error, - TResult Function(Message_MoveToRecycleBin value)? moveToRecycleBin, - TResult Function(Message_RecoverChat value)? recoverChat, - TResult Function(Message_PermanentDelete value)? permanentDelete, - TResult Function(Message_Unschedule value)? unschedule, - TResult Function(Message_UpdateProfile value)? updateProfile, - TResult Function(Message_UpdateProfileSharing value)? updateProfileSharing, - TResult Function(Message_ShareProfile value)? shareProfile, - TResult Function(Message_NotifyAnyways value)? notifyAnyways, - TResult Function(Message_SetTranscriptBackground value)? - setTranscriptBackground, - required TResult orElse(), - }) { - if (unsend != null) { - return unsend(this); - } - return orElse(); - } } -abstract class Message_Unsend extends Message { - const factory Message_Unsend(final UnsendMessage field0) = - _$Message_UnsendImpl; - const Message_Unsend._() : super._(); +/// @nodoc +abstract mixin class $IdmsMessage_TeardownSignInCopyWith<$Res> implements $IdmsMessageCopyWith<$Res> { + factory $IdmsMessage_TeardownSignInCopyWith(IdmsMessage_TeardownSignIn value, $Res Function(IdmsMessage_TeardownSignIn) _then) = _$IdmsMessage_TeardownSignInCopyWithImpl; +@useResult +$Res call({ + TeardownSignIn field0 +}); - UnsendMessage get field0; - /// Create a copy of Message - /// with the given fields replaced by the non-null parameter values. - @JsonKey(includeFromJson: false, includeToJson: false) - _$$Message_UnsendImplCopyWith<_$Message_UnsendImpl> get copyWith => - throw _privateConstructorUsedError; -} -/// @nodoc -abstract class _$$Message_EditImplCopyWith<$Res> { - factory _$$Message_EditImplCopyWith( - _$Message_EditImpl value, $Res Function(_$Message_EditImpl) then) = - __$$Message_EditImplCopyWithImpl<$Res>; - @useResult - $Res call({EditMessage field0}); -} +} /// @nodoc -class __$$Message_EditImplCopyWithImpl<$Res> - extends _$MessageCopyWithImpl<$Res, _$Message_EditImpl> - implements _$$Message_EditImplCopyWith<$Res> { - __$$Message_EditImplCopyWithImpl( - _$Message_EditImpl _value, $Res Function(_$Message_EditImpl) _then) - : super(_value, _then); +class _$IdmsMessage_TeardownSignInCopyWithImpl<$Res> + implements $IdmsMessage_TeardownSignInCopyWith<$Res> { + _$IdmsMessage_TeardownSignInCopyWithImpl(this._self, this._then); - /// Create a copy of Message - /// with the given fields replaced by the non-null parameter values. - @pragma('vm:prefer-inline') - @override - $Res call({ - Object? field0 = null, - }) { - return _then(_$Message_EditImpl( - null == field0 - ? _value.field0 - : field0 // ignore: cast_nullable_to_non_nullable - as EditMessage, - )); - } + final IdmsMessage_TeardownSignIn _self; + final $Res Function(IdmsMessage_TeardownSignIn) _then; + +/// Create a copy of IdmsMessage +/// with the given fields replaced by the non-null parameter values. +@pragma('vm:prefer-inline') $Res call({Object? field0 = null,}) { + return _then(IdmsMessage_TeardownSignIn( +null == field0 ? _self.field0 : field0 // ignore: cast_nullable_to_non_nullable +as TeardownSignIn, + )); } -/// @nodoc -class _$Message_EditImpl extends Message_Edit { - const _$Message_EditImpl(this.field0) : super._(); +} - @override - final EditMessage field0; +/// @nodoc - @override - String toString() { - return 'Message.edit(field0: $field0)'; - } - @override - bool operator ==(Object other) { - return identical(this, other) || - (other.runtimeType == runtimeType && - other is _$Message_EditImpl && - (identical(other.field0, field0) || other.field0 == field0)); - } +class IdmsMessage_CircleRequest extends IdmsMessage { + const IdmsMessage_CircleRequest(this.field0, [this.field1]): super._(); - @override - int get hashCode => Object.hash(runtimeType, field0); - - /// Create a copy of Message - /// with the given fields replaced by the non-null parameter values. - @JsonKey(includeFromJson: false, includeToJson: false) - @override - @pragma('vm:prefer-inline') - _$$Message_EditImplCopyWith<_$Message_EditImpl> get copyWith => - __$$Message_EditImplCopyWithImpl<_$Message_EditImpl>(this, _$identity); - - @override - @optionalTypeArgs - TResult when({ - required TResult Function(NormalMessage field0) message, - required TResult Function(RenameMessage field0) renameMessage, - required TResult Function(ChangeParticipantMessage field0) - changeParticipants, - required TResult Function(ReactMessage field0) react, - required TResult Function() delivered, - required TResult Function() read, - required TResult Function(bool field0, TypingApp? field1) typing, - required TResult Function(UnsendMessage field0) unsend, - required TResult Function(EditMessage field0) edit, - required TResult Function(IconChangeMessage field0) iconChange, - required TResult Function(bool field0) enableSmsActivation, - required TResult Function() messageReadOnDevice, - required TResult Function(bool field0) smsConfirmSent, - required TResult Function() markUnread, - required TResult Function() peerCacheInvalidate, - required TResult Function(UpdateExtensionMessage field0) updateExtension, - required TResult Function(ErrorMessage field0) error, - required TResult Function(MoveToRecycleBinMessage field0) moveToRecycleBin, - required TResult Function(OperatedChat field0) recoverChat, - required TResult Function(PermanentDeleteMessage field0) permanentDelete, - required TResult Function() unschedule, - required TResult Function(UpdateProfileMessage field0) updateProfile, - required TResult Function(UpdateProfileSharingMessage field0) - updateProfileSharing, - required TResult Function(ShareProfileMessage field0) shareProfile, - required TResult Function() notifyAnyways, - required TResult Function(SetTranscriptBackgroundMessage field0) - setTranscriptBackground, - }) { - return edit(field0); - } - @override - @optionalTypeArgs - TResult? whenOrNull({ - TResult? Function(NormalMessage field0)? message, - TResult? Function(RenameMessage field0)? renameMessage, - TResult? Function(ChangeParticipantMessage field0)? changeParticipants, - TResult? Function(ReactMessage field0)? react, - TResult? Function()? delivered, - TResult? Function()? read, - TResult? Function(bool field0, TypingApp? field1)? typing, - TResult? Function(UnsendMessage field0)? unsend, - TResult? Function(EditMessage field0)? edit, - TResult? Function(IconChangeMessage field0)? iconChange, - TResult? Function(bool field0)? enableSmsActivation, - TResult? Function()? messageReadOnDevice, - TResult? Function(bool field0)? smsConfirmSent, - TResult? Function()? markUnread, - TResult? Function()? peerCacheInvalidate, - TResult? Function(UpdateExtensionMessage field0)? updateExtension, - TResult? Function(ErrorMessage field0)? error, - TResult? Function(MoveToRecycleBinMessage field0)? moveToRecycleBin, - TResult? Function(OperatedChat field0)? recoverChat, - TResult? Function(PermanentDeleteMessage field0)? permanentDelete, - TResult? Function()? unschedule, - TResult? Function(UpdateProfileMessage field0)? updateProfile, - TResult? Function(UpdateProfileSharingMessage field0)? updateProfileSharing, - TResult? Function(ShareProfileMessage field0)? shareProfile, - TResult? Function()? notifyAnyways, - TResult? Function(SetTranscriptBackgroundMessage field0)? - setTranscriptBackground, - }) { - return edit?.call(field0); - } +@override final IdmsCircleMessage field0; + final IdmsRequestedSignIn? field1; - @override - @optionalTypeArgs - TResult maybeWhen({ - TResult Function(NormalMessage field0)? message, - TResult Function(RenameMessage field0)? renameMessage, - TResult Function(ChangeParticipantMessage field0)? changeParticipants, - TResult Function(ReactMessage field0)? react, - TResult Function()? delivered, - TResult Function()? read, - TResult Function(bool field0, TypingApp? field1)? typing, - TResult Function(UnsendMessage field0)? unsend, - TResult Function(EditMessage field0)? edit, - TResult Function(IconChangeMessage field0)? iconChange, - TResult Function(bool field0)? enableSmsActivation, - TResult Function()? messageReadOnDevice, - TResult Function(bool field0)? smsConfirmSent, - TResult Function()? markUnread, - TResult Function()? peerCacheInvalidate, - TResult Function(UpdateExtensionMessage field0)? updateExtension, - TResult Function(ErrorMessage field0)? error, - TResult Function(MoveToRecycleBinMessage field0)? moveToRecycleBin, - TResult Function(OperatedChat field0)? recoverChat, - TResult Function(PermanentDeleteMessage field0)? permanentDelete, - TResult Function()? unschedule, - TResult Function(UpdateProfileMessage field0)? updateProfile, - TResult Function(UpdateProfileSharingMessage field0)? updateProfileSharing, - TResult Function(ShareProfileMessage field0)? shareProfile, - TResult Function()? notifyAnyways, - TResult Function(SetTranscriptBackgroundMessage field0)? - setTranscriptBackground, - required TResult orElse(), - }) { - if (edit != null) { - return edit(field0); - } - return orElse(); - } +/// Create a copy of IdmsMessage +/// with the given fields replaced by the non-null parameter values. +@JsonKey(includeFromJson: false, includeToJson: false) +@pragma('vm:prefer-inline') +$IdmsMessage_CircleRequestCopyWith get copyWith => _$IdmsMessage_CircleRequestCopyWithImpl(this, _$identity); - @override - @optionalTypeArgs - TResult map({ - required TResult Function(Message_Message value) message, - required TResult Function(Message_RenameMessage value) renameMessage, - required TResult Function(Message_ChangeParticipants value) - changeParticipants, - required TResult Function(Message_React value) react, - required TResult Function(Message_Delivered value) delivered, - required TResult Function(Message_Read value) read, - required TResult Function(Message_Typing value) typing, - required TResult Function(Message_Unsend value) unsend, - required TResult Function(Message_Edit value) edit, - required TResult Function(Message_IconChange value) iconChange, - required TResult Function(Message_EnableSmsActivation value) - enableSmsActivation, - required TResult Function(Message_MessageReadOnDevice value) - messageReadOnDevice, - required TResult Function(Message_SmsConfirmSent value) smsConfirmSent, - required TResult Function(Message_MarkUnread value) markUnread, - required TResult Function(Message_PeerCacheInvalidate value) - peerCacheInvalidate, - required TResult Function(Message_UpdateExtension value) updateExtension, - required TResult Function(Message_Error value) error, - required TResult Function(Message_MoveToRecycleBin value) moveToRecycleBin, - required TResult Function(Message_RecoverChat value) recoverChat, - required TResult Function(Message_PermanentDelete value) permanentDelete, - required TResult Function(Message_Unschedule value) unschedule, - required TResult Function(Message_UpdateProfile value) updateProfile, - required TResult Function(Message_UpdateProfileSharing value) - updateProfileSharing, - required TResult Function(Message_ShareProfile value) shareProfile, - required TResult Function(Message_NotifyAnyways value) notifyAnyways, - required TResult Function(Message_SetTranscriptBackground value) - setTranscriptBackground, - }) { - return edit(this); - } - @override - @optionalTypeArgs - TResult? mapOrNull({ - TResult? Function(Message_Message value)? message, - TResult? Function(Message_RenameMessage value)? renameMessage, - TResult? Function(Message_ChangeParticipants value)? changeParticipants, - TResult? Function(Message_React value)? react, - TResult? Function(Message_Delivered value)? delivered, - TResult? Function(Message_Read value)? read, - TResult? Function(Message_Typing value)? typing, - TResult? Function(Message_Unsend value)? unsend, - TResult? Function(Message_Edit value)? edit, - TResult? Function(Message_IconChange value)? iconChange, - TResult? Function(Message_EnableSmsActivation value)? enableSmsActivation, - TResult? Function(Message_MessageReadOnDevice value)? messageReadOnDevice, - TResult? Function(Message_SmsConfirmSent value)? smsConfirmSent, - TResult? Function(Message_MarkUnread value)? markUnread, - TResult? Function(Message_PeerCacheInvalidate value)? peerCacheInvalidate, - TResult? Function(Message_UpdateExtension value)? updateExtension, - TResult? Function(Message_Error value)? error, - TResult? Function(Message_MoveToRecycleBin value)? moveToRecycleBin, - TResult? Function(Message_RecoverChat value)? recoverChat, - TResult? Function(Message_PermanentDelete value)? permanentDelete, - TResult? Function(Message_Unschedule value)? unschedule, - TResult? Function(Message_UpdateProfile value)? updateProfile, - TResult? Function(Message_UpdateProfileSharing value)? updateProfileSharing, - TResult? Function(Message_ShareProfile value)? shareProfile, - TResult? Function(Message_NotifyAnyways value)? notifyAnyways, - TResult? Function(Message_SetTranscriptBackground value)? - setTranscriptBackground, - }) { - return edit?.call(this); - } - @override - @optionalTypeArgs - TResult maybeMap({ - TResult Function(Message_Message value)? message, - TResult Function(Message_RenameMessage value)? renameMessage, - TResult Function(Message_ChangeParticipants value)? changeParticipants, - TResult Function(Message_React value)? react, - TResult Function(Message_Delivered value)? delivered, - TResult Function(Message_Read value)? read, - TResult Function(Message_Typing value)? typing, - TResult Function(Message_Unsend value)? unsend, - TResult Function(Message_Edit value)? edit, - TResult Function(Message_IconChange value)? iconChange, - TResult Function(Message_EnableSmsActivation value)? enableSmsActivation, - TResult Function(Message_MessageReadOnDevice value)? messageReadOnDevice, - TResult Function(Message_SmsConfirmSent value)? smsConfirmSent, - TResult Function(Message_MarkUnread value)? markUnread, - TResult Function(Message_PeerCacheInvalidate value)? peerCacheInvalidate, - TResult Function(Message_UpdateExtension value)? updateExtension, - TResult Function(Message_Error value)? error, - TResult Function(Message_MoveToRecycleBin value)? moveToRecycleBin, - TResult Function(Message_RecoverChat value)? recoverChat, - TResult Function(Message_PermanentDelete value)? permanentDelete, - TResult Function(Message_Unschedule value)? unschedule, - TResult Function(Message_UpdateProfile value)? updateProfile, - TResult Function(Message_UpdateProfileSharing value)? updateProfileSharing, - TResult Function(Message_ShareProfile value)? shareProfile, - TResult Function(Message_NotifyAnyways value)? notifyAnyways, - TResult Function(Message_SetTranscriptBackground value)? - setTranscriptBackground, - required TResult orElse(), - }) { - if (edit != null) { - return edit(this); - } - return orElse(); - } +@override +bool operator ==(Object other) { + return identical(this, other) || (other.runtimeType == runtimeType&&other is IdmsMessage_CircleRequest&&(identical(other.field0, field0) || other.field0 == field0)&&(identical(other.field1, field1) || other.field1 == field1)); } -abstract class Message_Edit extends Message { - const factory Message_Edit(final EditMessage field0) = _$Message_EditImpl; - const Message_Edit._() : super._(); - EditMessage get field0; - - /// Create a copy of Message - /// with the given fields replaced by the non-null parameter values. - @JsonKey(includeFromJson: false, includeToJson: false) - _$$Message_EditImplCopyWith<_$Message_EditImpl> get copyWith => - throw _privateConstructorUsedError; -} +@override +int get hashCode => Object.hash(runtimeType,field0,field1); -/// @nodoc -abstract class _$$Message_IconChangeImplCopyWith<$Res> { - factory _$$Message_IconChangeImplCopyWith(_$Message_IconChangeImpl value, - $Res Function(_$Message_IconChangeImpl) then) = - __$$Message_IconChangeImplCopyWithImpl<$Res>; - @useResult - $Res call({IconChangeMessage field0}); +@override +String toString() { + return 'IdmsMessage.circleRequest(field0: $field0, field1: $field1)'; } -/// @nodoc -class __$$Message_IconChangeImplCopyWithImpl<$Res> - extends _$MessageCopyWithImpl<$Res, _$Message_IconChangeImpl> - implements _$$Message_IconChangeImplCopyWith<$Res> { - __$$Message_IconChangeImplCopyWithImpl(_$Message_IconChangeImpl _value, - $Res Function(_$Message_IconChangeImpl) _then) - : super(_value, _then); - /// Create a copy of Message - /// with the given fields replaced by the non-null parameter values. - @pragma('vm:prefer-inline') - @override - $Res call({ - Object? field0 = null, - }) { - return _then(_$Message_IconChangeImpl( - null == field0 - ? _value.field0 - : field0 // ignore: cast_nullable_to_non_nullable - as IconChangeMessage, - )); - } } /// @nodoc +abstract mixin class $IdmsMessage_CircleRequestCopyWith<$Res> implements $IdmsMessageCopyWith<$Res> { + factory $IdmsMessage_CircleRequestCopyWith(IdmsMessage_CircleRequest value, $Res Function(IdmsMessage_CircleRequest) _then) = _$IdmsMessage_CircleRequestCopyWithImpl; +@useResult +$Res call({ + IdmsCircleMessage field0, IdmsRequestedSignIn? field1 +}); -class _$Message_IconChangeImpl extends Message_IconChange { - const _$Message_IconChangeImpl(this.field0) : super._(); - - @override - final IconChangeMessage field0; - @override - String toString() { - return 'Message.iconChange(field0: $field0)'; - } - - @override - bool operator ==(Object other) { - return identical(this, other) || - (other.runtimeType == runtimeType && - other is _$Message_IconChangeImpl && - (identical(other.field0, field0) || other.field0 == field0)); - } - - @override - int get hashCode => Object.hash(runtimeType, field0); - - /// Create a copy of Message - /// with the given fields replaced by the non-null parameter values. - @JsonKey(includeFromJson: false, includeToJson: false) - @override - @pragma('vm:prefer-inline') - _$$Message_IconChangeImplCopyWith<_$Message_IconChangeImpl> get copyWith => - __$$Message_IconChangeImplCopyWithImpl<_$Message_IconChangeImpl>( - this, _$identity); - - @override - @optionalTypeArgs - TResult when({ - required TResult Function(NormalMessage field0) message, - required TResult Function(RenameMessage field0) renameMessage, - required TResult Function(ChangeParticipantMessage field0) - changeParticipants, - required TResult Function(ReactMessage field0) react, - required TResult Function() delivered, - required TResult Function() read, - required TResult Function(bool field0, TypingApp? field1) typing, - required TResult Function(UnsendMessage field0) unsend, - required TResult Function(EditMessage field0) edit, - required TResult Function(IconChangeMessage field0) iconChange, - required TResult Function(bool field0) enableSmsActivation, - required TResult Function() messageReadOnDevice, - required TResult Function(bool field0) smsConfirmSent, - required TResult Function() markUnread, - required TResult Function() peerCacheInvalidate, - required TResult Function(UpdateExtensionMessage field0) updateExtension, - required TResult Function(ErrorMessage field0) error, - required TResult Function(MoveToRecycleBinMessage field0) moveToRecycleBin, - required TResult Function(OperatedChat field0) recoverChat, - required TResult Function(PermanentDeleteMessage field0) permanentDelete, - required TResult Function() unschedule, - required TResult Function(UpdateProfileMessage field0) updateProfile, - required TResult Function(UpdateProfileSharingMessage field0) - updateProfileSharing, - required TResult Function(ShareProfileMessage field0) shareProfile, - required TResult Function() notifyAnyways, - required TResult Function(SetTranscriptBackgroundMessage field0) - setTranscriptBackground, - }) { - return iconChange(field0); - } - - @override - @optionalTypeArgs - TResult? whenOrNull({ - TResult? Function(NormalMessage field0)? message, - TResult? Function(RenameMessage field0)? renameMessage, - TResult? Function(ChangeParticipantMessage field0)? changeParticipants, - TResult? Function(ReactMessage field0)? react, - TResult? Function()? delivered, - TResult? Function()? read, - TResult? Function(bool field0, TypingApp? field1)? typing, - TResult? Function(UnsendMessage field0)? unsend, - TResult? Function(EditMessage field0)? edit, - TResult? Function(IconChangeMessage field0)? iconChange, - TResult? Function(bool field0)? enableSmsActivation, - TResult? Function()? messageReadOnDevice, - TResult? Function(bool field0)? smsConfirmSent, - TResult? Function()? markUnread, - TResult? Function()? peerCacheInvalidate, - TResult? Function(UpdateExtensionMessage field0)? updateExtension, - TResult? Function(ErrorMessage field0)? error, - TResult? Function(MoveToRecycleBinMessage field0)? moveToRecycleBin, - TResult? Function(OperatedChat field0)? recoverChat, - TResult? Function(PermanentDeleteMessage field0)? permanentDelete, - TResult? Function()? unschedule, - TResult? Function(UpdateProfileMessage field0)? updateProfile, - TResult? Function(UpdateProfileSharingMessage field0)? updateProfileSharing, - TResult? Function(ShareProfileMessage field0)? shareProfile, - TResult? Function()? notifyAnyways, - TResult? Function(SetTranscriptBackgroundMessage field0)? - setTranscriptBackground, - }) { - return iconChange?.call(field0); - } - @override - @optionalTypeArgs - TResult maybeWhen({ - TResult Function(NormalMessage field0)? message, - TResult Function(RenameMessage field0)? renameMessage, - TResult Function(ChangeParticipantMessage field0)? changeParticipants, - TResult Function(ReactMessage field0)? react, - TResult Function()? delivered, - TResult Function()? read, - TResult Function(bool field0, TypingApp? field1)? typing, - TResult Function(UnsendMessage field0)? unsend, - TResult Function(EditMessage field0)? edit, - TResult Function(IconChangeMessage field0)? iconChange, - TResult Function(bool field0)? enableSmsActivation, - TResult Function()? messageReadOnDevice, - TResult Function(bool field0)? smsConfirmSent, - TResult Function()? markUnread, - TResult Function()? peerCacheInvalidate, - TResult Function(UpdateExtensionMessage field0)? updateExtension, - TResult Function(ErrorMessage field0)? error, - TResult Function(MoveToRecycleBinMessage field0)? moveToRecycleBin, - TResult Function(OperatedChat field0)? recoverChat, - TResult Function(PermanentDeleteMessage field0)? permanentDelete, - TResult Function()? unschedule, - TResult Function(UpdateProfileMessage field0)? updateProfile, - TResult Function(UpdateProfileSharingMessage field0)? updateProfileSharing, - TResult Function(ShareProfileMessage field0)? shareProfile, - TResult Function()? notifyAnyways, - TResult Function(SetTranscriptBackgroundMessage field0)? - setTranscriptBackground, - required TResult orElse(), - }) { - if (iconChange != null) { - return iconChange(field0); - } - return orElse(); - } - @override - @optionalTypeArgs - TResult map({ - required TResult Function(Message_Message value) message, - required TResult Function(Message_RenameMessage value) renameMessage, - required TResult Function(Message_ChangeParticipants value) - changeParticipants, - required TResult Function(Message_React value) react, - required TResult Function(Message_Delivered value) delivered, - required TResult Function(Message_Read value) read, - required TResult Function(Message_Typing value) typing, - required TResult Function(Message_Unsend value) unsend, - required TResult Function(Message_Edit value) edit, - required TResult Function(Message_IconChange value) iconChange, - required TResult Function(Message_EnableSmsActivation value) - enableSmsActivation, - required TResult Function(Message_MessageReadOnDevice value) - messageReadOnDevice, - required TResult Function(Message_SmsConfirmSent value) smsConfirmSent, - required TResult Function(Message_MarkUnread value) markUnread, - required TResult Function(Message_PeerCacheInvalidate value) - peerCacheInvalidate, - required TResult Function(Message_UpdateExtension value) updateExtension, - required TResult Function(Message_Error value) error, - required TResult Function(Message_MoveToRecycleBin value) moveToRecycleBin, - required TResult Function(Message_RecoverChat value) recoverChat, - required TResult Function(Message_PermanentDelete value) permanentDelete, - required TResult Function(Message_Unschedule value) unschedule, - required TResult Function(Message_UpdateProfile value) updateProfile, - required TResult Function(Message_UpdateProfileSharing value) - updateProfileSharing, - required TResult Function(Message_ShareProfile value) shareProfile, - required TResult Function(Message_NotifyAnyways value) notifyAnyways, - required TResult Function(Message_SetTranscriptBackground value) - setTranscriptBackground, - }) { - return iconChange(this); - } +} +/// @nodoc +class _$IdmsMessage_CircleRequestCopyWithImpl<$Res> + implements $IdmsMessage_CircleRequestCopyWith<$Res> { + _$IdmsMessage_CircleRequestCopyWithImpl(this._self, this._then); - @override - @optionalTypeArgs - TResult? mapOrNull({ - TResult? Function(Message_Message value)? message, - TResult? Function(Message_RenameMessage value)? renameMessage, - TResult? Function(Message_ChangeParticipants value)? changeParticipants, - TResult? Function(Message_React value)? react, - TResult? Function(Message_Delivered value)? delivered, - TResult? Function(Message_Read value)? read, - TResult? Function(Message_Typing value)? typing, - TResult? Function(Message_Unsend value)? unsend, - TResult? Function(Message_Edit value)? edit, - TResult? Function(Message_IconChange value)? iconChange, - TResult? Function(Message_EnableSmsActivation value)? enableSmsActivation, - TResult? Function(Message_MessageReadOnDevice value)? messageReadOnDevice, - TResult? Function(Message_SmsConfirmSent value)? smsConfirmSent, - TResult? Function(Message_MarkUnread value)? markUnread, - TResult? Function(Message_PeerCacheInvalidate value)? peerCacheInvalidate, - TResult? Function(Message_UpdateExtension value)? updateExtension, - TResult? Function(Message_Error value)? error, - TResult? Function(Message_MoveToRecycleBin value)? moveToRecycleBin, - TResult? Function(Message_RecoverChat value)? recoverChat, - TResult? Function(Message_PermanentDelete value)? permanentDelete, - TResult? Function(Message_Unschedule value)? unschedule, - TResult? Function(Message_UpdateProfile value)? updateProfile, - TResult? Function(Message_UpdateProfileSharing value)? updateProfileSharing, - TResult? Function(Message_ShareProfile value)? shareProfile, - TResult? Function(Message_NotifyAnyways value)? notifyAnyways, - TResult? Function(Message_SetTranscriptBackground value)? - setTranscriptBackground, - }) { - return iconChange?.call(this); - } + final IdmsMessage_CircleRequest _self; + final $Res Function(IdmsMessage_CircleRequest) _then; - @override - @optionalTypeArgs - TResult maybeMap({ - TResult Function(Message_Message value)? message, - TResult Function(Message_RenameMessage value)? renameMessage, - TResult Function(Message_ChangeParticipants value)? changeParticipants, - TResult Function(Message_React value)? react, - TResult Function(Message_Delivered value)? delivered, - TResult Function(Message_Read value)? read, - TResult Function(Message_Typing value)? typing, - TResult Function(Message_Unsend value)? unsend, - TResult Function(Message_Edit value)? edit, - TResult Function(Message_IconChange value)? iconChange, - TResult Function(Message_EnableSmsActivation value)? enableSmsActivation, - TResult Function(Message_MessageReadOnDevice value)? messageReadOnDevice, - TResult Function(Message_SmsConfirmSent value)? smsConfirmSent, - TResult Function(Message_MarkUnread value)? markUnread, - TResult Function(Message_PeerCacheInvalidate value)? peerCacheInvalidate, - TResult Function(Message_UpdateExtension value)? updateExtension, - TResult Function(Message_Error value)? error, - TResult Function(Message_MoveToRecycleBin value)? moveToRecycleBin, - TResult Function(Message_RecoverChat value)? recoverChat, - TResult Function(Message_PermanentDelete value)? permanentDelete, - TResult Function(Message_Unschedule value)? unschedule, - TResult Function(Message_UpdateProfile value)? updateProfile, - TResult Function(Message_UpdateProfileSharing value)? updateProfileSharing, - TResult Function(Message_ShareProfile value)? shareProfile, - TResult Function(Message_NotifyAnyways value)? notifyAnyways, - TResult Function(Message_SetTranscriptBackground value)? - setTranscriptBackground, - required TResult orElse(), - }) { - if (iconChange != null) { - return iconChange(this); - } - return orElse(); - } +/// Create a copy of IdmsMessage +/// with the given fields replaced by the non-null parameter values. +@pragma('vm:prefer-inline') $Res call({Object? field0 = null,Object? field1 = freezed,}) { + return _then(IdmsMessage_CircleRequest( +null == field0 ? _self.field0 : field0 // ignore: cast_nullable_to_non_nullable +as IdmsCircleMessage,freezed == field1 ? _self.field1 : field1 // ignore: cast_nullable_to_non_nullable +as IdmsRequestedSignIn?, + )); } -abstract class Message_IconChange extends Message { - const factory Message_IconChange(final IconChangeMessage field0) = - _$Message_IconChangeImpl; - const Message_IconChange._() : super._(); - - IconChangeMessage get field0; - - /// Create a copy of Message - /// with the given fields replaced by the non-null parameter values. - @JsonKey(includeFromJson: false, includeToJson: false) - _$$Message_IconChangeImplCopyWith<_$Message_IconChangeImpl> get copyWith => - throw _privateConstructorUsedError; -} - -/// @nodoc -abstract class _$$Message_EnableSmsActivationImplCopyWith<$Res> { - factory _$$Message_EnableSmsActivationImplCopyWith( - _$Message_EnableSmsActivationImpl value, - $Res Function(_$Message_EnableSmsActivationImpl) then) = - __$$Message_EnableSmsActivationImplCopyWithImpl<$Res>; - @useResult - $Res call({bool field0}); -} - -/// @nodoc -class __$$Message_EnableSmsActivationImplCopyWithImpl<$Res> - extends _$MessageCopyWithImpl<$Res, _$Message_EnableSmsActivationImpl> - implements _$$Message_EnableSmsActivationImplCopyWith<$Res> { - __$$Message_EnableSmsActivationImplCopyWithImpl( - _$Message_EnableSmsActivationImpl _value, - $Res Function(_$Message_EnableSmsActivationImpl) _then) - : super(_value, _then); - - /// Create a copy of Message - /// with the given fields replaced by the non-null parameter values. - @pragma('vm:prefer-inline') - @override - $Res call({ - Object? field0 = null, - }) { - return _then(_$Message_EnableSmsActivationImpl( - null == field0 - ? _value.field0 - : field0 // ignore: cast_nullable_to_non_nullable - as bool, - )); - } + } /// @nodoc +mixin _$LoginState { -class _$Message_EnableSmsActivationImpl extends Message_EnableSmsActivation { - const _$Message_EnableSmsActivationImpl(this.field0) : super._(); - @override - final bool field0; - @override - String toString() { - return 'Message.enableSmsActivation(field0: $field0)'; - } - @override - bool operator ==(Object other) { - return identical(this, other) || - (other.runtimeType == runtimeType && - other is _$Message_EnableSmsActivationImpl && - (identical(other.field0, field0) || other.field0 == field0)); - } - @override - int get hashCode => Object.hash(runtimeType, field0); - - /// Create a copy of Message - /// with the given fields replaced by the non-null parameter values. - @JsonKey(includeFromJson: false, includeToJson: false) - @override - @pragma('vm:prefer-inline') - _$$Message_EnableSmsActivationImplCopyWith<_$Message_EnableSmsActivationImpl> - get copyWith => __$$Message_EnableSmsActivationImplCopyWithImpl< - _$Message_EnableSmsActivationImpl>(this, _$identity); - - @override - @optionalTypeArgs - TResult when({ - required TResult Function(NormalMessage field0) message, - required TResult Function(RenameMessage field0) renameMessage, - required TResult Function(ChangeParticipantMessage field0) - changeParticipants, - required TResult Function(ReactMessage field0) react, - required TResult Function() delivered, - required TResult Function() read, - required TResult Function(bool field0, TypingApp? field1) typing, - required TResult Function(UnsendMessage field0) unsend, - required TResult Function(EditMessage field0) edit, - required TResult Function(IconChangeMessage field0) iconChange, - required TResult Function(bool field0) enableSmsActivation, - required TResult Function() messageReadOnDevice, - required TResult Function(bool field0) smsConfirmSent, - required TResult Function() markUnread, - required TResult Function() peerCacheInvalidate, - required TResult Function(UpdateExtensionMessage field0) updateExtension, - required TResult Function(ErrorMessage field0) error, - required TResult Function(MoveToRecycleBinMessage field0) moveToRecycleBin, - required TResult Function(OperatedChat field0) recoverChat, - required TResult Function(PermanentDeleteMessage field0) permanentDelete, - required TResult Function() unschedule, - required TResult Function(UpdateProfileMessage field0) updateProfile, - required TResult Function(UpdateProfileSharingMessage field0) - updateProfileSharing, - required TResult Function(ShareProfileMessage field0) shareProfile, - required TResult Function() notifyAnyways, - required TResult Function(SetTranscriptBackgroundMessage field0) - setTranscriptBackground, - }) { - return enableSmsActivation(field0); - } +@override +bool operator ==(Object other) { + return identical(this, other) || (other.runtimeType == runtimeType&&other is LoginState); +} - @override - @optionalTypeArgs - TResult? whenOrNull({ - TResult? Function(NormalMessage field0)? message, - TResult? Function(RenameMessage field0)? renameMessage, - TResult? Function(ChangeParticipantMessage field0)? changeParticipants, - TResult? Function(ReactMessage field0)? react, - TResult? Function()? delivered, - TResult? Function()? read, - TResult? Function(bool field0, TypingApp? field1)? typing, - TResult? Function(UnsendMessage field0)? unsend, - TResult? Function(EditMessage field0)? edit, - TResult? Function(IconChangeMessage field0)? iconChange, - TResult? Function(bool field0)? enableSmsActivation, - TResult? Function()? messageReadOnDevice, - TResult? Function(bool field0)? smsConfirmSent, - TResult? Function()? markUnread, - TResult? Function()? peerCacheInvalidate, - TResult? Function(UpdateExtensionMessage field0)? updateExtension, - TResult? Function(ErrorMessage field0)? error, - TResult? Function(MoveToRecycleBinMessage field0)? moveToRecycleBin, - TResult? Function(OperatedChat field0)? recoverChat, - TResult? Function(PermanentDeleteMessage field0)? permanentDelete, - TResult? Function()? unschedule, - TResult? Function(UpdateProfileMessage field0)? updateProfile, - TResult? Function(UpdateProfileSharingMessage field0)? updateProfileSharing, - TResult? Function(ShareProfileMessage field0)? shareProfile, - TResult? Function()? notifyAnyways, - TResult? Function(SetTranscriptBackgroundMessage field0)? - setTranscriptBackground, - }) { - return enableSmsActivation?.call(field0); - } - @override - @optionalTypeArgs - TResult maybeWhen({ - TResult Function(NormalMessage field0)? message, - TResult Function(RenameMessage field0)? renameMessage, - TResult Function(ChangeParticipantMessage field0)? changeParticipants, - TResult Function(ReactMessage field0)? react, - TResult Function()? delivered, - TResult Function()? read, - TResult Function(bool field0, TypingApp? field1)? typing, - TResult Function(UnsendMessage field0)? unsend, - TResult Function(EditMessage field0)? edit, - TResult Function(IconChangeMessage field0)? iconChange, - TResult Function(bool field0)? enableSmsActivation, - TResult Function()? messageReadOnDevice, - TResult Function(bool field0)? smsConfirmSent, - TResult Function()? markUnread, - TResult Function()? peerCacheInvalidate, - TResult Function(UpdateExtensionMessage field0)? updateExtension, - TResult Function(ErrorMessage field0)? error, - TResult Function(MoveToRecycleBinMessage field0)? moveToRecycleBin, - TResult Function(OperatedChat field0)? recoverChat, - TResult Function(PermanentDeleteMessage field0)? permanentDelete, - TResult Function()? unschedule, - TResult Function(UpdateProfileMessage field0)? updateProfile, - TResult Function(UpdateProfileSharingMessage field0)? updateProfileSharing, - TResult Function(ShareProfileMessage field0)? shareProfile, - TResult Function()? notifyAnyways, - TResult Function(SetTranscriptBackgroundMessage field0)? - setTranscriptBackground, - required TResult orElse(), - }) { - if (enableSmsActivation != null) { - return enableSmsActivation(field0); - } - return orElse(); - } +@override +int get hashCode => runtimeType.hashCode; - @override - @optionalTypeArgs - TResult map({ - required TResult Function(Message_Message value) message, - required TResult Function(Message_RenameMessage value) renameMessage, - required TResult Function(Message_ChangeParticipants value) - changeParticipants, - required TResult Function(Message_React value) react, - required TResult Function(Message_Delivered value) delivered, - required TResult Function(Message_Read value) read, - required TResult Function(Message_Typing value) typing, - required TResult Function(Message_Unsend value) unsend, - required TResult Function(Message_Edit value) edit, - required TResult Function(Message_IconChange value) iconChange, - required TResult Function(Message_EnableSmsActivation value) - enableSmsActivation, - required TResult Function(Message_MessageReadOnDevice value) - messageReadOnDevice, - required TResult Function(Message_SmsConfirmSent value) smsConfirmSent, - required TResult Function(Message_MarkUnread value) markUnread, - required TResult Function(Message_PeerCacheInvalidate value) - peerCacheInvalidate, - required TResult Function(Message_UpdateExtension value) updateExtension, - required TResult Function(Message_Error value) error, - required TResult Function(Message_MoveToRecycleBin value) moveToRecycleBin, - required TResult Function(Message_RecoverChat value) recoverChat, - required TResult Function(Message_PermanentDelete value) permanentDelete, - required TResult Function(Message_Unschedule value) unschedule, - required TResult Function(Message_UpdateProfile value) updateProfile, - required TResult Function(Message_UpdateProfileSharing value) - updateProfileSharing, - required TResult Function(Message_ShareProfile value) shareProfile, - required TResult Function(Message_NotifyAnyways value) notifyAnyways, - required TResult Function(Message_SetTranscriptBackground value) - setTranscriptBackground, - }) { - return enableSmsActivation(this); - } +@override +String toString() { + return 'LoginState()'; +} + + +} + +/// @nodoc +class $LoginStateCopyWith<$Res> { +$LoginStateCopyWith(LoginState _, $Res Function(LoginState) __); +} + + +/// Adds pattern-matching-related methods to [LoginState]. +extension LoginStatePatterns on LoginState { +/// A variant of `map` that fallback to returning `orElse`. +/// +/// It is equivalent to doing: +/// ```dart +/// switch (sealedClass) { +/// case final Subclass value: +/// return ...; +/// case _: +/// return orElse(); +/// } +/// ``` + +@optionalTypeArgs TResult maybeMap({TResult Function( LoginState_LoggedIn value)? loggedIn,TResult Function( LoginState_NeedsDevice2FA value)? needsDevice2Fa,TResult Function( LoginState_Needs2FAVerification value)? needs2FaVerification,TResult Function( LoginState_NeedsSMS2FA value)? needsSms2Fa,TResult Function( LoginState_NeedsSMS2FAVerification value)? needsSms2FaVerification,TResult Function( LoginState_NeedsExtraStep value)? needsExtraStep,TResult Function( LoginState_NeedsLogin value)? needsLogin,required TResult orElse(),}){ +final _that = this; +switch (_that) { +case LoginState_LoggedIn() when loggedIn != null: +return loggedIn(_that);case LoginState_NeedsDevice2FA() when needsDevice2Fa != null: +return needsDevice2Fa(_that);case LoginState_Needs2FAVerification() when needs2FaVerification != null: +return needs2FaVerification(_that);case LoginState_NeedsSMS2FA() when needsSms2Fa != null: +return needsSms2Fa(_that);case LoginState_NeedsSMS2FAVerification() when needsSms2FaVerification != null: +return needsSms2FaVerification(_that);case LoginState_NeedsExtraStep() when needsExtraStep != null: +return needsExtraStep(_that);case LoginState_NeedsLogin() when needsLogin != null: +return needsLogin(_that);case _: + return orElse(); + +} +} +/// A `switch`-like method, using callbacks. +/// +/// Callbacks receives the raw object, upcasted. +/// It is equivalent to doing: +/// ```dart +/// switch (sealedClass) { +/// case final Subclass value: +/// return ...; +/// case final Subclass2 value: +/// return ...; +/// } +/// ``` + +@optionalTypeArgs TResult map({required TResult Function( LoginState_LoggedIn value) loggedIn,required TResult Function( LoginState_NeedsDevice2FA value) needsDevice2Fa,required TResult Function( LoginState_Needs2FAVerification value) needs2FaVerification,required TResult Function( LoginState_NeedsSMS2FA value) needsSms2Fa,required TResult Function( LoginState_NeedsSMS2FAVerification value) needsSms2FaVerification,required TResult Function( LoginState_NeedsExtraStep value) needsExtraStep,required TResult Function( LoginState_NeedsLogin value) needsLogin,}){ +final _that = this; +switch (_that) { +case LoginState_LoggedIn(): +return loggedIn(_that);case LoginState_NeedsDevice2FA(): +return needsDevice2Fa(_that);case LoginState_Needs2FAVerification(): +return needs2FaVerification(_that);case LoginState_NeedsSMS2FA(): +return needsSms2Fa(_that);case LoginState_NeedsSMS2FAVerification(): +return needsSms2FaVerification(_that);case LoginState_NeedsExtraStep(): +return needsExtraStep(_that);case LoginState_NeedsLogin(): +return needsLogin(_that);} +} +/// A variant of `map` that fallback to returning `null`. +/// +/// It is equivalent to doing: +/// ```dart +/// switch (sealedClass) { +/// case final Subclass value: +/// return ...; +/// case _: +/// return null; +/// } +/// ``` + +@optionalTypeArgs TResult? mapOrNull({TResult? Function( LoginState_LoggedIn value)? loggedIn,TResult? Function( LoginState_NeedsDevice2FA value)? needsDevice2Fa,TResult? Function( LoginState_Needs2FAVerification value)? needs2FaVerification,TResult? Function( LoginState_NeedsSMS2FA value)? needsSms2Fa,TResult? Function( LoginState_NeedsSMS2FAVerification value)? needsSms2FaVerification,TResult? Function( LoginState_NeedsExtraStep value)? needsExtraStep,TResult? Function( LoginState_NeedsLogin value)? needsLogin,}){ +final _that = this; +switch (_that) { +case LoginState_LoggedIn() when loggedIn != null: +return loggedIn(_that);case LoginState_NeedsDevice2FA() when needsDevice2Fa != null: +return needsDevice2Fa(_that);case LoginState_Needs2FAVerification() when needs2FaVerification != null: +return needs2FaVerification(_that);case LoginState_NeedsSMS2FA() when needsSms2Fa != null: +return needsSms2Fa(_that);case LoginState_NeedsSMS2FAVerification() when needsSms2FaVerification != null: +return needsSms2FaVerification(_that);case LoginState_NeedsExtraStep() when needsExtraStep != null: +return needsExtraStep(_that);case LoginState_NeedsLogin() when needsLogin != null: +return needsLogin(_that);case _: + return null; + +} +} +/// A variant of `when` that fallback to an `orElse` callback. +/// +/// It is equivalent to doing: +/// ```dart +/// switch (sealedClass) { +/// case Subclass(:final field): +/// return ...; +/// case _: +/// return orElse(); +/// } +/// ``` - @override - @optionalTypeArgs - TResult? mapOrNull({ - TResult? Function(Message_Message value)? message, - TResult? Function(Message_RenameMessage value)? renameMessage, - TResult? Function(Message_ChangeParticipants value)? changeParticipants, - TResult? Function(Message_React value)? react, - TResult? Function(Message_Delivered value)? delivered, - TResult? Function(Message_Read value)? read, - TResult? Function(Message_Typing value)? typing, - TResult? Function(Message_Unsend value)? unsend, - TResult? Function(Message_Edit value)? edit, - TResult? Function(Message_IconChange value)? iconChange, - TResult? Function(Message_EnableSmsActivation value)? enableSmsActivation, - TResult? Function(Message_MessageReadOnDevice value)? messageReadOnDevice, - TResult? Function(Message_SmsConfirmSent value)? smsConfirmSent, - TResult? Function(Message_MarkUnread value)? markUnread, - TResult? Function(Message_PeerCacheInvalidate value)? peerCacheInvalidate, - TResult? Function(Message_UpdateExtension value)? updateExtension, - TResult? Function(Message_Error value)? error, - TResult? Function(Message_MoveToRecycleBin value)? moveToRecycleBin, - TResult? Function(Message_RecoverChat value)? recoverChat, - TResult? Function(Message_PermanentDelete value)? permanentDelete, - TResult? Function(Message_Unschedule value)? unschedule, - TResult? Function(Message_UpdateProfile value)? updateProfile, - TResult? Function(Message_UpdateProfileSharing value)? updateProfileSharing, - TResult? Function(Message_ShareProfile value)? shareProfile, - TResult? Function(Message_NotifyAnyways value)? notifyAnyways, - TResult? Function(Message_SetTranscriptBackground value)? - setTranscriptBackground, - }) { - return enableSmsActivation?.call(this); - } +@optionalTypeArgs TResult maybeWhen({TResult Function()? loggedIn,TResult Function()? needsDevice2Fa,TResult Function()? needs2FaVerification,TResult Function()? needsSms2Fa,TResult Function( VerifyBody field0)? needsSms2FaVerification,TResult Function( String field0)? needsExtraStep,TResult Function()? needsLogin,required TResult orElse(),}) {final _that = this; +switch (_that) { +case LoginState_LoggedIn() when loggedIn != null: +return loggedIn();case LoginState_NeedsDevice2FA() when needsDevice2Fa != null: +return needsDevice2Fa();case LoginState_Needs2FAVerification() when needs2FaVerification != null: +return needs2FaVerification();case LoginState_NeedsSMS2FA() when needsSms2Fa != null: +return needsSms2Fa();case LoginState_NeedsSMS2FAVerification() when needsSms2FaVerification != null: +return needsSms2FaVerification(_that.field0);case LoginState_NeedsExtraStep() when needsExtraStep != null: +return needsExtraStep(_that.field0);case LoginState_NeedsLogin() when needsLogin != null: +return needsLogin();case _: + return orElse(); - @override - @optionalTypeArgs - TResult maybeMap({ - TResult Function(Message_Message value)? message, - TResult Function(Message_RenameMessage value)? renameMessage, - TResult Function(Message_ChangeParticipants value)? changeParticipants, - TResult Function(Message_React value)? react, - TResult Function(Message_Delivered value)? delivered, - TResult Function(Message_Read value)? read, - TResult Function(Message_Typing value)? typing, - TResult Function(Message_Unsend value)? unsend, - TResult Function(Message_Edit value)? edit, - TResult Function(Message_IconChange value)? iconChange, - TResult Function(Message_EnableSmsActivation value)? enableSmsActivation, - TResult Function(Message_MessageReadOnDevice value)? messageReadOnDevice, - TResult Function(Message_SmsConfirmSent value)? smsConfirmSent, - TResult Function(Message_MarkUnread value)? markUnread, - TResult Function(Message_PeerCacheInvalidate value)? peerCacheInvalidate, - TResult Function(Message_UpdateExtension value)? updateExtension, - TResult Function(Message_Error value)? error, - TResult Function(Message_MoveToRecycleBin value)? moveToRecycleBin, - TResult Function(Message_RecoverChat value)? recoverChat, - TResult Function(Message_PermanentDelete value)? permanentDelete, - TResult Function(Message_Unschedule value)? unschedule, - TResult Function(Message_UpdateProfile value)? updateProfile, - TResult Function(Message_UpdateProfileSharing value)? updateProfileSharing, - TResult Function(Message_ShareProfile value)? shareProfile, - TResult Function(Message_NotifyAnyways value)? notifyAnyways, - TResult Function(Message_SetTranscriptBackground value)? - setTranscriptBackground, - required TResult orElse(), - }) { - if (enableSmsActivation != null) { - return enableSmsActivation(this); - } - return orElse(); - } } +} +/// A `switch`-like method, using callbacks. +/// +/// As opposed to `map`, this offers destructuring. +/// It is equivalent to doing: +/// ```dart +/// switch (sealedClass) { +/// case Subclass(:final field): +/// return ...; +/// case Subclass2(:final field2): +/// return ...; +/// } +/// ``` -abstract class Message_EnableSmsActivation extends Message { - const factory Message_EnableSmsActivation(final bool field0) = - _$Message_EnableSmsActivationImpl; - const Message_EnableSmsActivation._() : super._(); +@optionalTypeArgs TResult when({required TResult Function() loggedIn,required TResult Function() needsDevice2Fa,required TResult Function() needs2FaVerification,required TResult Function() needsSms2Fa,required TResult Function( VerifyBody field0) needsSms2FaVerification,required TResult Function( String field0) needsExtraStep,required TResult Function() needsLogin,}) {final _that = this; +switch (_that) { +case LoginState_LoggedIn(): +return loggedIn();case LoginState_NeedsDevice2FA(): +return needsDevice2Fa();case LoginState_Needs2FAVerification(): +return needs2FaVerification();case LoginState_NeedsSMS2FA(): +return needsSms2Fa();case LoginState_NeedsSMS2FAVerification(): +return needsSms2FaVerification(_that.field0);case LoginState_NeedsExtraStep(): +return needsExtraStep(_that.field0);case LoginState_NeedsLogin(): +return needsLogin();} +} +/// A variant of `when` that fallback to returning `null` +/// +/// It is equivalent to doing: +/// ```dart +/// switch (sealedClass) { +/// case Subclass(:final field): +/// return ...; +/// case _: +/// return null; +/// } +/// ``` - bool get field0; +@optionalTypeArgs TResult? whenOrNull({TResult? Function()? loggedIn,TResult? Function()? needsDevice2Fa,TResult? Function()? needs2FaVerification,TResult? Function()? needsSms2Fa,TResult? Function( VerifyBody field0)? needsSms2FaVerification,TResult? Function( String field0)? needsExtraStep,TResult? Function()? needsLogin,}) {final _that = this; +switch (_that) { +case LoginState_LoggedIn() when loggedIn != null: +return loggedIn();case LoginState_NeedsDevice2FA() when needsDevice2Fa != null: +return needsDevice2Fa();case LoginState_Needs2FAVerification() when needs2FaVerification != null: +return needs2FaVerification();case LoginState_NeedsSMS2FA() when needsSms2Fa != null: +return needsSms2Fa();case LoginState_NeedsSMS2FAVerification() when needsSms2FaVerification != null: +return needsSms2FaVerification(_that.field0);case LoginState_NeedsExtraStep() when needsExtraStep != null: +return needsExtraStep(_that.field0);case LoginState_NeedsLogin() when needsLogin != null: +return needsLogin();case _: + return null; - /// Create a copy of Message - /// with the given fields replaced by the non-null parameter values. - @JsonKey(includeFromJson: false, includeToJson: false) - _$$Message_EnableSmsActivationImplCopyWith<_$Message_EnableSmsActivationImpl> - get copyWith => throw _privateConstructorUsedError; +} } -/// @nodoc -abstract class _$$Message_MessageReadOnDeviceImplCopyWith<$Res> { - factory _$$Message_MessageReadOnDeviceImplCopyWith( - _$Message_MessageReadOnDeviceImpl value, - $Res Function(_$Message_MessageReadOnDeviceImpl) then) = - __$$Message_MessageReadOnDeviceImplCopyWithImpl<$Res>; } /// @nodoc -class __$$Message_MessageReadOnDeviceImplCopyWithImpl<$Res> - extends _$MessageCopyWithImpl<$Res, _$Message_MessageReadOnDeviceImpl> - implements _$$Message_MessageReadOnDeviceImplCopyWith<$Res> { - __$$Message_MessageReadOnDeviceImplCopyWithImpl( - _$Message_MessageReadOnDeviceImpl _value, - $Res Function(_$Message_MessageReadOnDeviceImpl) _then) - : super(_value, _then); - /// Create a copy of Message - /// with the given fields replaced by the non-null parameter values. -} -/// @nodoc +class LoginState_LoggedIn extends LoginState { + const LoginState_LoggedIn(): super._(); -class _$Message_MessageReadOnDeviceImpl extends Message_MessageReadOnDevice { - const _$Message_MessageReadOnDeviceImpl() : super._(); - @override - String toString() { - return 'Message.messageReadOnDevice()'; - } - @override - bool operator ==(Object other) { - return identical(this, other) || - (other.runtimeType == runtimeType && - other is _$Message_MessageReadOnDeviceImpl); - } - @override - int get hashCode => runtimeType.hashCode; - - @override - @optionalTypeArgs - TResult when({ - required TResult Function(NormalMessage field0) message, - required TResult Function(RenameMessage field0) renameMessage, - required TResult Function(ChangeParticipantMessage field0) - changeParticipants, - required TResult Function(ReactMessage field0) react, - required TResult Function() delivered, - required TResult Function() read, - required TResult Function(bool field0, TypingApp? field1) typing, - required TResult Function(UnsendMessage field0) unsend, - required TResult Function(EditMessage field0) edit, - required TResult Function(IconChangeMessage field0) iconChange, - required TResult Function(bool field0) enableSmsActivation, - required TResult Function() messageReadOnDevice, - required TResult Function(bool field0) smsConfirmSent, - required TResult Function() markUnread, - required TResult Function() peerCacheInvalidate, - required TResult Function(UpdateExtensionMessage field0) updateExtension, - required TResult Function(ErrorMessage field0) error, - required TResult Function(MoveToRecycleBinMessage field0) moveToRecycleBin, - required TResult Function(OperatedChat field0) recoverChat, - required TResult Function(PermanentDeleteMessage field0) permanentDelete, - required TResult Function() unschedule, - required TResult Function(UpdateProfileMessage field0) updateProfile, - required TResult Function(UpdateProfileSharingMessage field0) - updateProfileSharing, - required TResult Function(ShareProfileMessage field0) shareProfile, - required TResult Function() notifyAnyways, - required TResult Function(SetTranscriptBackgroundMessage field0) - setTranscriptBackground, - }) { - return messageReadOnDevice(); - } - @override - @optionalTypeArgs - TResult? whenOrNull({ - TResult? Function(NormalMessage field0)? message, - TResult? Function(RenameMessage field0)? renameMessage, - TResult? Function(ChangeParticipantMessage field0)? changeParticipants, - TResult? Function(ReactMessage field0)? react, - TResult? Function()? delivered, - TResult? Function()? read, - TResult? Function(bool field0, TypingApp? field1)? typing, - TResult? Function(UnsendMessage field0)? unsend, - TResult? Function(EditMessage field0)? edit, - TResult? Function(IconChangeMessage field0)? iconChange, - TResult? Function(bool field0)? enableSmsActivation, - TResult? Function()? messageReadOnDevice, - TResult? Function(bool field0)? smsConfirmSent, - TResult? Function()? markUnread, - TResult? Function()? peerCacheInvalidate, - TResult? Function(UpdateExtensionMessage field0)? updateExtension, - TResult? Function(ErrorMessage field0)? error, - TResult? Function(MoveToRecycleBinMessage field0)? moveToRecycleBin, - TResult? Function(OperatedChat field0)? recoverChat, - TResult? Function(PermanentDeleteMessage field0)? permanentDelete, - TResult? Function()? unschedule, - TResult? Function(UpdateProfileMessage field0)? updateProfile, - TResult? Function(UpdateProfileSharingMessage field0)? updateProfileSharing, - TResult? Function(ShareProfileMessage field0)? shareProfile, - TResult? Function()? notifyAnyways, - TResult? Function(SetTranscriptBackgroundMessage field0)? - setTranscriptBackground, - }) { - return messageReadOnDevice?.call(); - } - @override - @optionalTypeArgs - TResult maybeWhen({ - TResult Function(NormalMessage field0)? message, - TResult Function(RenameMessage field0)? renameMessage, - TResult Function(ChangeParticipantMessage field0)? changeParticipants, - TResult Function(ReactMessage field0)? react, - TResult Function()? delivered, - TResult Function()? read, - TResult Function(bool field0, TypingApp? field1)? typing, - TResult Function(UnsendMessage field0)? unsend, - TResult Function(EditMessage field0)? edit, - TResult Function(IconChangeMessage field0)? iconChange, - TResult Function(bool field0)? enableSmsActivation, - TResult Function()? messageReadOnDevice, - TResult Function(bool field0)? smsConfirmSent, - TResult Function()? markUnread, - TResult Function()? peerCacheInvalidate, - TResult Function(UpdateExtensionMessage field0)? updateExtension, - TResult Function(ErrorMessage field0)? error, - TResult Function(MoveToRecycleBinMessage field0)? moveToRecycleBin, - TResult Function(OperatedChat field0)? recoverChat, - TResult Function(PermanentDeleteMessage field0)? permanentDelete, - TResult Function()? unschedule, - TResult Function(UpdateProfileMessage field0)? updateProfile, - TResult Function(UpdateProfileSharingMessage field0)? updateProfileSharing, - TResult Function(ShareProfileMessage field0)? shareProfile, - TResult Function()? notifyAnyways, - TResult Function(SetTranscriptBackgroundMessage field0)? - setTranscriptBackground, - required TResult orElse(), - }) { - if (messageReadOnDevice != null) { - return messageReadOnDevice(); - } - return orElse(); - } - @override - @optionalTypeArgs - TResult map({ - required TResult Function(Message_Message value) message, - required TResult Function(Message_RenameMessage value) renameMessage, - required TResult Function(Message_ChangeParticipants value) - changeParticipants, - required TResult Function(Message_React value) react, - required TResult Function(Message_Delivered value) delivered, - required TResult Function(Message_Read value) read, - required TResult Function(Message_Typing value) typing, - required TResult Function(Message_Unsend value) unsend, - required TResult Function(Message_Edit value) edit, - required TResult Function(Message_IconChange value) iconChange, - required TResult Function(Message_EnableSmsActivation value) - enableSmsActivation, - required TResult Function(Message_MessageReadOnDevice value) - messageReadOnDevice, - required TResult Function(Message_SmsConfirmSent value) smsConfirmSent, - required TResult Function(Message_MarkUnread value) markUnread, - required TResult Function(Message_PeerCacheInvalidate value) - peerCacheInvalidate, - required TResult Function(Message_UpdateExtension value) updateExtension, - required TResult Function(Message_Error value) error, - required TResult Function(Message_MoveToRecycleBin value) moveToRecycleBin, - required TResult Function(Message_RecoverChat value) recoverChat, - required TResult Function(Message_PermanentDelete value) permanentDelete, - required TResult Function(Message_Unschedule value) unschedule, - required TResult Function(Message_UpdateProfile value) updateProfile, - required TResult Function(Message_UpdateProfileSharing value) - updateProfileSharing, - required TResult Function(Message_ShareProfile value) shareProfile, - required TResult Function(Message_NotifyAnyways value) notifyAnyways, - required TResult Function(Message_SetTranscriptBackground value) - setTranscriptBackground, - }) { - return messageReadOnDevice(this); - } +@override +bool operator ==(Object other) { + return identical(this, other) || (other.runtimeType == runtimeType&&other is LoginState_LoggedIn); +} - @override - @optionalTypeArgs - TResult? mapOrNull({ - TResult? Function(Message_Message value)? message, - TResult? Function(Message_RenameMessage value)? renameMessage, - TResult? Function(Message_ChangeParticipants value)? changeParticipants, - TResult? Function(Message_React value)? react, - TResult? Function(Message_Delivered value)? delivered, - TResult? Function(Message_Read value)? read, - TResult? Function(Message_Typing value)? typing, - TResult? Function(Message_Unsend value)? unsend, - TResult? Function(Message_Edit value)? edit, - TResult? Function(Message_IconChange value)? iconChange, - TResult? Function(Message_EnableSmsActivation value)? enableSmsActivation, - TResult? Function(Message_MessageReadOnDevice value)? messageReadOnDevice, - TResult? Function(Message_SmsConfirmSent value)? smsConfirmSent, - TResult? Function(Message_MarkUnread value)? markUnread, - TResult? Function(Message_PeerCacheInvalidate value)? peerCacheInvalidate, - TResult? Function(Message_UpdateExtension value)? updateExtension, - TResult? Function(Message_Error value)? error, - TResult? Function(Message_MoveToRecycleBin value)? moveToRecycleBin, - TResult? Function(Message_RecoverChat value)? recoverChat, - TResult? Function(Message_PermanentDelete value)? permanentDelete, - TResult? Function(Message_Unschedule value)? unschedule, - TResult? Function(Message_UpdateProfile value)? updateProfile, - TResult? Function(Message_UpdateProfileSharing value)? updateProfileSharing, - TResult? Function(Message_ShareProfile value)? shareProfile, - TResult? Function(Message_NotifyAnyways value)? notifyAnyways, - TResult? Function(Message_SetTranscriptBackground value)? - setTranscriptBackground, - }) { - return messageReadOnDevice?.call(this); - } - @override - @optionalTypeArgs - TResult maybeMap({ - TResult Function(Message_Message value)? message, - TResult Function(Message_RenameMessage value)? renameMessage, - TResult Function(Message_ChangeParticipants value)? changeParticipants, - TResult Function(Message_React value)? react, - TResult Function(Message_Delivered value)? delivered, - TResult Function(Message_Read value)? read, - TResult Function(Message_Typing value)? typing, - TResult Function(Message_Unsend value)? unsend, - TResult Function(Message_Edit value)? edit, - TResult Function(Message_IconChange value)? iconChange, - TResult Function(Message_EnableSmsActivation value)? enableSmsActivation, - TResult Function(Message_MessageReadOnDevice value)? messageReadOnDevice, - TResult Function(Message_SmsConfirmSent value)? smsConfirmSent, - TResult Function(Message_MarkUnread value)? markUnread, - TResult Function(Message_PeerCacheInvalidate value)? peerCacheInvalidate, - TResult Function(Message_UpdateExtension value)? updateExtension, - TResult Function(Message_Error value)? error, - TResult Function(Message_MoveToRecycleBin value)? moveToRecycleBin, - TResult Function(Message_RecoverChat value)? recoverChat, - TResult Function(Message_PermanentDelete value)? permanentDelete, - TResult Function(Message_Unschedule value)? unschedule, - TResult Function(Message_UpdateProfile value)? updateProfile, - TResult Function(Message_UpdateProfileSharing value)? updateProfileSharing, - TResult Function(Message_ShareProfile value)? shareProfile, - TResult Function(Message_NotifyAnyways value)? notifyAnyways, - TResult Function(Message_SetTranscriptBackground value)? - setTranscriptBackground, - required TResult orElse(), - }) { - if (messageReadOnDevice != null) { - return messageReadOnDevice(this); - } - return orElse(); - } +@override +int get hashCode => runtimeType.hashCode; + +@override +String toString() { + return 'LoginState.loggedIn()'; } -abstract class Message_MessageReadOnDevice extends Message { - const factory Message_MessageReadOnDevice() = - _$Message_MessageReadOnDeviceImpl; - const Message_MessageReadOnDevice._() : super._(); -} - -/// @nodoc -abstract class _$$Message_SmsConfirmSentImplCopyWith<$Res> { - factory _$$Message_SmsConfirmSentImplCopyWith( - _$Message_SmsConfirmSentImpl value, - $Res Function(_$Message_SmsConfirmSentImpl) then) = - __$$Message_SmsConfirmSentImplCopyWithImpl<$Res>; - @useResult - $Res call({bool field0}); -} - -/// @nodoc -class __$$Message_SmsConfirmSentImplCopyWithImpl<$Res> - extends _$MessageCopyWithImpl<$Res, _$Message_SmsConfirmSentImpl> - implements _$$Message_SmsConfirmSentImplCopyWith<$Res> { - __$$Message_SmsConfirmSentImplCopyWithImpl( - _$Message_SmsConfirmSentImpl _value, - $Res Function(_$Message_SmsConfirmSentImpl) _then) - : super(_value, _then); - - /// Create a copy of Message - /// with the given fields replaced by the non-null parameter values. - @pragma('vm:prefer-inline') - @override - $Res call({ - Object? field0 = null, - }) { - return _then(_$Message_SmsConfirmSentImpl( - null == field0 - ? _value.field0 - : field0 // ignore: cast_nullable_to_non_nullable - as bool, - )); - } + } -/// @nodoc -class _$Message_SmsConfirmSentImpl extends Message_SmsConfirmSent { - const _$Message_SmsConfirmSentImpl(this.field0) : super._(); - @override - final bool field0; - @override - String toString() { - return 'Message.smsConfirmSent(field0: $field0)'; - } +/// @nodoc - @override - bool operator ==(Object other) { - return identical(this, other) || - (other.runtimeType == runtimeType && - other is _$Message_SmsConfirmSentImpl && - (identical(other.field0, field0) || other.field0 == field0)); - } - @override - int get hashCode => Object.hash(runtimeType, field0); - - /// Create a copy of Message - /// with the given fields replaced by the non-null parameter values. - @JsonKey(includeFromJson: false, includeToJson: false) - @override - @pragma('vm:prefer-inline') - _$$Message_SmsConfirmSentImplCopyWith<_$Message_SmsConfirmSentImpl> - get copyWith => __$$Message_SmsConfirmSentImplCopyWithImpl< - _$Message_SmsConfirmSentImpl>(this, _$identity); - - @override - @optionalTypeArgs - TResult when({ - required TResult Function(NormalMessage field0) message, - required TResult Function(RenameMessage field0) renameMessage, - required TResult Function(ChangeParticipantMessage field0) - changeParticipants, - required TResult Function(ReactMessage field0) react, - required TResult Function() delivered, - required TResult Function() read, - required TResult Function(bool field0, TypingApp? field1) typing, - required TResult Function(UnsendMessage field0) unsend, - required TResult Function(EditMessage field0) edit, - required TResult Function(IconChangeMessage field0) iconChange, - required TResult Function(bool field0) enableSmsActivation, - required TResult Function() messageReadOnDevice, - required TResult Function(bool field0) smsConfirmSent, - required TResult Function() markUnread, - required TResult Function() peerCacheInvalidate, - required TResult Function(UpdateExtensionMessage field0) updateExtension, - required TResult Function(ErrorMessage field0) error, - required TResult Function(MoveToRecycleBinMessage field0) moveToRecycleBin, - required TResult Function(OperatedChat field0) recoverChat, - required TResult Function(PermanentDeleteMessage field0) permanentDelete, - required TResult Function() unschedule, - required TResult Function(UpdateProfileMessage field0) updateProfile, - required TResult Function(UpdateProfileSharingMessage field0) - updateProfileSharing, - required TResult Function(ShareProfileMessage field0) shareProfile, - required TResult Function() notifyAnyways, - required TResult Function(SetTranscriptBackgroundMessage field0) - setTranscriptBackground, - }) { - return smsConfirmSent(field0); - } +class LoginState_NeedsDevice2FA extends LoginState { + const LoginState_NeedsDevice2FA(): super._(); - @override - @optionalTypeArgs - TResult? whenOrNull({ - TResult? Function(NormalMessage field0)? message, - TResult? Function(RenameMessage field0)? renameMessage, - TResult? Function(ChangeParticipantMessage field0)? changeParticipants, - TResult? Function(ReactMessage field0)? react, - TResult? Function()? delivered, - TResult? Function()? read, - TResult? Function(bool field0, TypingApp? field1)? typing, - TResult? Function(UnsendMessage field0)? unsend, - TResult? Function(EditMessage field0)? edit, - TResult? Function(IconChangeMessage field0)? iconChange, - TResult? Function(bool field0)? enableSmsActivation, - TResult? Function()? messageReadOnDevice, - TResult? Function(bool field0)? smsConfirmSent, - TResult? Function()? markUnread, - TResult? Function()? peerCacheInvalidate, - TResult? Function(UpdateExtensionMessage field0)? updateExtension, - TResult? Function(ErrorMessage field0)? error, - TResult? Function(MoveToRecycleBinMessage field0)? moveToRecycleBin, - TResult? Function(OperatedChat field0)? recoverChat, - TResult? Function(PermanentDeleteMessage field0)? permanentDelete, - TResult? Function()? unschedule, - TResult? Function(UpdateProfileMessage field0)? updateProfile, - TResult? Function(UpdateProfileSharingMessage field0)? updateProfileSharing, - TResult? Function(ShareProfileMessage field0)? shareProfile, - TResult? Function()? notifyAnyways, - TResult? Function(SetTranscriptBackgroundMessage field0)? - setTranscriptBackground, - }) { - return smsConfirmSent?.call(field0); - } - @override - @optionalTypeArgs - TResult maybeWhen({ - TResult Function(NormalMessage field0)? message, - TResult Function(RenameMessage field0)? renameMessage, - TResult Function(ChangeParticipantMessage field0)? changeParticipants, - TResult Function(ReactMessage field0)? react, - TResult Function()? delivered, - TResult Function()? read, - TResult Function(bool field0, TypingApp? field1)? typing, - TResult Function(UnsendMessage field0)? unsend, - TResult Function(EditMessage field0)? edit, - TResult Function(IconChangeMessage field0)? iconChange, - TResult Function(bool field0)? enableSmsActivation, - TResult Function()? messageReadOnDevice, - TResult Function(bool field0)? smsConfirmSent, - TResult Function()? markUnread, - TResult Function()? peerCacheInvalidate, - TResult Function(UpdateExtensionMessage field0)? updateExtension, - TResult Function(ErrorMessage field0)? error, - TResult Function(MoveToRecycleBinMessage field0)? moveToRecycleBin, - TResult Function(OperatedChat field0)? recoverChat, - TResult Function(PermanentDeleteMessage field0)? permanentDelete, - TResult Function()? unschedule, - TResult Function(UpdateProfileMessage field0)? updateProfile, - TResult Function(UpdateProfileSharingMessage field0)? updateProfileSharing, - TResult Function(ShareProfileMessage field0)? shareProfile, - TResult Function()? notifyAnyways, - TResult Function(SetTranscriptBackgroundMessage field0)? - setTranscriptBackground, - required TResult orElse(), - }) { - if (smsConfirmSent != null) { - return smsConfirmSent(field0); - } - return orElse(); - } - @override - @optionalTypeArgs - TResult map({ - required TResult Function(Message_Message value) message, - required TResult Function(Message_RenameMessage value) renameMessage, - required TResult Function(Message_ChangeParticipants value) - changeParticipants, - required TResult Function(Message_React value) react, - required TResult Function(Message_Delivered value) delivered, - required TResult Function(Message_Read value) read, - required TResult Function(Message_Typing value) typing, - required TResult Function(Message_Unsend value) unsend, - required TResult Function(Message_Edit value) edit, - required TResult Function(Message_IconChange value) iconChange, - required TResult Function(Message_EnableSmsActivation value) - enableSmsActivation, - required TResult Function(Message_MessageReadOnDevice value) - messageReadOnDevice, - required TResult Function(Message_SmsConfirmSent value) smsConfirmSent, - required TResult Function(Message_MarkUnread value) markUnread, - required TResult Function(Message_PeerCacheInvalidate value) - peerCacheInvalidate, - required TResult Function(Message_UpdateExtension value) updateExtension, - required TResult Function(Message_Error value) error, - required TResult Function(Message_MoveToRecycleBin value) moveToRecycleBin, - required TResult Function(Message_RecoverChat value) recoverChat, - required TResult Function(Message_PermanentDelete value) permanentDelete, - required TResult Function(Message_Unschedule value) unschedule, - required TResult Function(Message_UpdateProfile value) updateProfile, - required TResult Function(Message_UpdateProfileSharing value) - updateProfileSharing, - required TResult Function(Message_ShareProfile value) shareProfile, - required TResult Function(Message_NotifyAnyways value) notifyAnyways, - required TResult Function(Message_SetTranscriptBackground value) - setTranscriptBackground, - }) { - return smsConfirmSent(this); - } - @override - @optionalTypeArgs - TResult? mapOrNull({ - TResult? Function(Message_Message value)? message, - TResult? Function(Message_RenameMessage value)? renameMessage, - TResult? Function(Message_ChangeParticipants value)? changeParticipants, - TResult? Function(Message_React value)? react, - TResult? Function(Message_Delivered value)? delivered, - TResult? Function(Message_Read value)? read, - TResult? Function(Message_Typing value)? typing, - TResult? Function(Message_Unsend value)? unsend, - TResult? Function(Message_Edit value)? edit, - TResult? Function(Message_IconChange value)? iconChange, - TResult? Function(Message_EnableSmsActivation value)? enableSmsActivation, - TResult? Function(Message_MessageReadOnDevice value)? messageReadOnDevice, - TResult? Function(Message_SmsConfirmSent value)? smsConfirmSent, - TResult? Function(Message_MarkUnread value)? markUnread, - TResult? Function(Message_PeerCacheInvalidate value)? peerCacheInvalidate, - TResult? Function(Message_UpdateExtension value)? updateExtension, - TResult? Function(Message_Error value)? error, - TResult? Function(Message_MoveToRecycleBin value)? moveToRecycleBin, - TResult? Function(Message_RecoverChat value)? recoverChat, - TResult? Function(Message_PermanentDelete value)? permanentDelete, - TResult? Function(Message_Unschedule value)? unschedule, - TResult? Function(Message_UpdateProfile value)? updateProfile, - TResult? Function(Message_UpdateProfileSharing value)? updateProfileSharing, - TResult? Function(Message_ShareProfile value)? shareProfile, - TResult? Function(Message_NotifyAnyways value)? notifyAnyways, - TResult? Function(Message_SetTranscriptBackground value)? - setTranscriptBackground, - }) { - return smsConfirmSent?.call(this); - } - @override - @optionalTypeArgs - TResult maybeMap({ - TResult Function(Message_Message value)? message, - TResult Function(Message_RenameMessage value)? renameMessage, - TResult Function(Message_ChangeParticipants value)? changeParticipants, - TResult Function(Message_React value)? react, - TResult Function(Message_Delivered value)? delivered, - TResult Function(Message_Read value)? read, - TResult Function(Message_Typing value)? typing, - TResult Function(Message_Unsend value)? unsend, - TResult Function(Message_Edit value)? edit, - TResult Function(Message_IconChange value)? iconChange, - TResult Function(Message_EnableSmsActivation value)? enableSmsActivation, - TResult Function(Message_MessageReadOnDevice value)? messageReadOnDevice, - TResult Function(Message_SmsConfirmSent value)? smsConfirmSent, - TResult Function(Message_MarkUnread value)? markUnread, - TResult Function(Message_PeerCacheInvalidate value)? peerCacheInvalidate, - TResult Function(Message_UpdateExtension value)? updateExtension, - TResult Function(Message_Error value)? error, - TResult Function(Message_MoveToRecycleBin value)? moveToRecycleBin, - TResult Function(Message_RecoverChat value)? recoverChat, - TResult Function(Message_PermanentDelete value)? permanentDelete, - TResult Function(Message_Unschedule value)? unschedule, - TResult Function(Message_UpdateProfile value)? updateProfile, - TResult Function(Message_UpdateProfileSharing value)? updateProfileSharing, - TResult Function(Message_ShareProfile value)? shareProfile, - TResult Function(Message_NotifyAnyways value)? notifyAnyways, - TResult Function(Message_SetTranscriptBackground value)? - setTranscriptBackground, - required TResult orElse(), - }) { - if (smsConfirmSent != null) { - return smsConfirmSent(this); - } - return orElse(); - } + + +@override +bool operator ==(Object other) { + return identical(this, other) || (other.runtimeType == runtimeType&&other is LoginState_NeedsDevice2FA); } -abstract class Message_SmsConfirmSent extends Message { - const factory Message_SmsConfirmSent(final bool field0) = - _$Message_SmsConfirmSentImpl; - const Message_SmsConfirmSent._() : super._(); - bool get field0; +@override +int get hashCode => runtimeType.hashCode; - /// Create a copy of Message - /// with the given fields replaced by the non-null parameter values. - @JsonKey(includeFromJson: false, includeToJson: false) - _$$Message_SmsConfirmSentImplCopyWith<_$Message_SmsConfirmSentImpl> - get copyWith => throw _privateConstructorUsedError; +@override +String toString() { + return 'LoginState.needsDevice2Fa()'; } -/// @nodoc -abstract class _$$Message_MarkUnreadImplCopyWith<$Res> { - factory _$$Message_MarkUnreadImplCopyWith(_$Message_MarkUnreadImpl value, - $Res Function(_$Message_MarkUnreadImpl) then) = - __$$Message_MarkUnreadImplCopyWithImpl<$Res>; + } -/// @nodoc -class __$$Message_MarkUnreadImplCopyWithImpl<$Res> - extends _$MessageCopyWithImpl<$Res, _$Message_MarkUnreadImpl> - implements _$$Message_MarkUnreadImplCopyWith<$Res> { - __$$Message_MarkUnreadImplCopyWithImpl(_$Message_MarkUnreadImpl _value, - $Res Function(_$Message_MarkUnreadImpl) _then) - : super(_value, _then); - /// Create a copy of Message - /// with the given fields replaced by the non-null parameter values. -} + /// @nodoc -class _$Message_MarkUnreadImpl extends Message_MarkUnread { - const _$Message_MarkUnreadImpl() : super._(); - @override - String toString() { - return 'Message.markUnread()'; - } +class LoginState_Needs2FAVerification extends LoginState { + const LoginState_Needs2FAVerification(): super._(); - @override - bool operator ==(Object other) { - return identical(this, other) || - (other.runtimeType == runtimeType && other is _$Message_MarkUnreadImpl); - } - @override - int get hashCode => runtimeType.hashCode; - - @override - @optionalTypeArgs - TResult when({ - required TResult Function(NormalMessage field0) message, - required TResult Function(RenameMessage field0) renameMessage, - required TResult Function(ChangeParticipantMessage field0) - changeParticipants, - required TResult Function(ReactMessage field0) react, - required TResult Function() delivered, - required TResult Function() read, - required TResult Function(bool field0, TypingApp? field1) typing, - required TResult Function(UnsendMessage field0) unsend, - required TResult Function(EditMessage field0) edit, - required TResult Function(IconChangeMessage field0) iconChange, - required TResult Function(bool field0) enableSmsActivation, - required TResult Function() messageReadOnDevice, - required TResult Function(bool field0) smsConfirmSent, - required TResult Function() markUnread, - required TResult Function() peerCacheInvalidate, - required TResult Function(UpdateExtensionMessage field0) updateExtension, - required TResult Function(ErrorMessage field0) error, - required TResult Function(MoveToRecycleBinMessage field0) moveToRecycleBin, - required TResult Function(OperatedChat field0) recoverChat, - required TResult Function(PermanentDeleteMessage field0) permanentDelete, - required TResult Function() unschedule, - required TResult Function(UpdateProfileMessage field0) updateProfile, - required TResult Function(UpdateProfileSharingMessage field0) - updateProfileSharing, - required TResult Function(ShareProfileMessage field0) shareProfile, - required TResult Function() notifyAnyways, - required TResult Function(SetTranscriptBackgroundMessage field0) - setTranscriptBackground, - }) { - return markUnread(); - } - @override - @optionalTypeArgs - TResult? whenOrNull({ - TResult? Function(NormalMessage field0)? message, - TResult? Function(RenameMessage field0)? renameMessage, - TResult? Function(ChangeParticipantMessage field0)? changeParticipants, - TResult? Function(ReactMessage field0)? react, - TResult? Function()? delivered, - TResult? Function()? read, - TResult? Function(bool field0, TypingApp? field1)? typing, - TResult? Function(UnsendMessage field0)? unsend, - TResult? Function(EditMessage field0)? edit, - TResult? Function(IconChangeMessage field0)? iconChange, - TResult? Function(bool field0)? enableSmsActivation, - TResult? Function()? messageReadOnDevice, - TResult? Function(bool field0)? smsConfirmSent, - TResult? Function()? markUnread, - TResult? Function()? peerCacheInvalidate, - TResult? Function(UpdateExtensionMessage field0)? updateExtension, - TResult? Function(ErrorMessage field0)? error, - TResult? Function(MoveToRecycleBinMessage field0)? moveToRecycleBin, - TResult? Function(OperatedChat field0)? recoverChat, - TResult? Function(PermanentDeleteMessage field0)? permanentDelete, - TResult? Function()? unschedule, - TResult? Function(UpdateProfileMessage field0)? updateProfile, - TResult? Function(UpdateProfileSharingMessage field0)? updateProfileSharing, - TResult? Function(ShareProfileMessage field0)? shareProfile, - TResult? Function()? notifyAnyways, - TResult? Function(SetTranscriptBackgroundMessage field0)? - setTranscriptBackground, - }) { - return markUnread?.call(); - } - @override - @optionalTypeArgs - TResult maybeWhen({ - TResult Function(NormalMessage field0)? message, - TResult Function(RenameMessage field0)? renameMessage, - TResult Function(ChangeParticipantMessage field0)? changeParticipants, - TResult Function(ReactMessage field0)? react, - TResult Function()? delivered, - TResult Function()? read, - TResult Function(bool field0, TypingApp? field1)? typing, - TResult Function(UnsendMessage field0)? unsend, - TResult Function(EditMessage field0)? edit, - TResult Function(IconChangeMessage field0)? iconChange, - TResult Function(bool field0)? enableSmsActivation, - TResult Function()? messageReadOnDevice, - TResult Function(bool field0)? smsConfirmSent, - TResult Function()? markUnread, - TResult Function()? peerCacheInvalidate, - TResult Function(UpdateExtensionMessage field0)? updateExtension, - TResult Function(ErrorMessage field0)? error, - TResult Function(MoveToRecycleBinMessage field0)? moveToRecycleBin, - TResult Function(OperatedChat field0)? recoverChat, - TResult Function(PermanentDeleteMessage field0)? permanentDelete, - TResult Function()? unschedule, - TResult Function(UpdateProfileMessage field0)? updateProfile, - TResult Function(UpdateProfileSharingMessage field0)? updateProfileSharing, - TResult Function(ShareProfileMessage field0)? shareProfile, - TResult Function()? notifyAnyways, - TResult Function(SetTranscriptBackgroundMessage field0)? - setTranscriptBackground, - required TResult orElse(), - }) { - if (markUnread != null) { - return markUnread(); - } - return orElse(); - } - @override - @optionalTypeArgs - TResult map({ - required TResult Function(Message_Message value) message, - required TResult Function(Message_RenameMessage value) renameMessage, - required TResult Function(Message_ChangeParticipants value) - changeParticipants, - required TResult Function(Message_React value) react, - required TResult Function(Message_Delivered value) delivered, - required TResult Function(Message_Read value) read, - required TResult Function(Message_Typing value) typing, - required TResult Function(Message_Unsend value) unsend, - required TResult Function(Message_Edit value) edit, - required TResult Function(Message_IconChange value) iconChange, - required TResult Function(Message_EnableSmsActivation value) - enableSmsActivation, - required TResult Function(Message_MessageReadOnDevice value) - messageReadOnDevice, - required TResult Function(Message_SmsConfirmSent value) smsConfirmSent, - required TResult Function(Message_MarkUnread value) markUnread, - required TResult Function(Message_PeerCacheInvalidate value) - peerCacheInvalidate, - required TResult Function(Message_UpdateExtension value) updateExtension, - required TResult Function(Message_Error value) error, - required TResult Function(Message_MoveToRecycleBin value) moveToRecycleBin, - required TResult Function(Message_RecoverChat value) recoverChat, - required TResult Function(Message_PermanentDelete value) permanentDelete, - required TResult Function(Message_Unschedule value) unschedule, - required TResult Function(Message_UpdateProfile value) updateProfile, - required TResult Function(Message_UpdateProfileSharing value) - updateProfileSharing, - required TResult Function(Message_ShareProfile value) shareProfile, - required TResult Function(Message_NotifyAnyways value) notifyAnyways, - required TResult Function(Message_SetTranscriptBackground value) - setTranscriptBackground, - }) { - return markUnread(this); - } - @override - @optionalTypeArgs - TResult? mapOrNull({ - TResult? Function(Message_Message value)? message, - TResult? Function(Message_RenameMessage value)? renameMessage, - TResult? Function(Message_ChangeParticipants value)? changeParticipants, - TResult? Function(Message_React value)? react, - TResult? Function(Message_Delivered value)? delivered, - TResult? Function(Message_Read value)? read, - TResult? Function(Message_Typing value)? typing, - TResult? Function(Message_Unsend value)? unsend, - TResult? Function(Message_Edit value)? edit, - TResult? Function(Message_IconChange value)? iconChange, - TResult? Function(Message_EnableSmsActivation value)? enableSmsActivation, - TResult? Function(Message_MessageReadOnDevice value)? messageReadOnDevice, - TResult? Function(Message_SmsConfirmSent value)? smsConfirmSent, - TResult? Function(Message_MarkUnread value)? markUnread, - TResult? Function(Message_PeerCacheInvalidate value)? peerCacheInvalidate, - TResult? Function(Message_UpdateExtension value)? updateExtension, - TResult? Function(Message_Error value)? error, - TResult? Function(Message_MoveToRecycleBin value)? moveToRecycleBin, - TResult? Function(Message_RecoverChat value)? recoverChat, - TResult? Function(Message_PermanentDelete value)? permanentDelete, - TResult? Function(Message_Unschedule value)? unschedule, - TResult? Function(Message_UpdateProfile value)? updateProfile, - TResult? Function(Message_UpdateProfileSharing value)? updateProfileSharing, - TResult? Function(Message_ShareProfile value)? shareProfile, - TResult? Function(Message_NotifyAnyways value)? notifyAnyways, - TResult? Function(Message_SetTranscriptBackground value)? - setTranscriptBackground, - }) { - return markUnread?.call(this); - } - @override - @optionalTypeArgs - TResult maybeMap({ - TResult Function(Message_Message value)? message, - TResult Function(Message_RenameMessage value)? renameMessage, - TResult Function(Message_ChangeParticipants value)? changeParticipants, - TResult Function(Message_React value)? react, - TResult Function(Message_Delivered value)? delivered, - TResult Function(Message_Read value)? read, - TResult Function(Message_Typing value)? typing, - TResult Function(Message_Unsend value)? unsend, - TResult Function(Message_Edit value)? edit, - TResult Function(Message_IconChange value)? iconChange, - TResult Function(Message_EnableSmsActivation value)? enableSmsActivation, - TResult Function(Message_MessageReadOnDevice value)? messageReadOnDevice, - TResult Function(Message_SmsConfirmSent value)? smsConfirmSent, - TResult Function(Message_MarkUnread value)? markUnread, - TResult Function(Message_PeerCacheInvalidate value)? peerCacheInvalidate, - TResult Function(Message_UpdateExtension value)? updateExtension, - TResult Function(Message_Error value)? error, - TResult Function(Message_MoveToRecycleBin value)? moveToRecycleBin, - TResult Function(Message_RecoverChat value)? recoverChat, - TResult Function(Message_PermanentDelete value)? permanentDelete, - TResult Function(Message_Unschedule value)? unschedule, - TResult Function(Message_UpdateProfile value)? updateProfile, - TResult Function(Message_UpdateProfileSharing value)? updateProfileSharing, - TResult Function(Message_ShareProfile value)? shareProfile, - TResult Function(Message_NotifyAnyways value)? notifyAnyways, - TResult Function(Message_SetTranscriptBackground value)? - setTranscriptBackground, - required TResult orElse(), - }) { - if (markUnread != null) { - return markUnread(this); - } - return orElse(); - } +@override +bool operator ==(Object other) { + return identical(this, other) || (other.runtimeType == runtimeType&&other is LoginState_Needs2FAVerification); } -abstract class Message_MarkUnread extends Message { - const factory Message_MarkUnread() = _$Message_MarkUnreadImpl; - const Message_MarkUnread._() : super._(); -} -/// @nodoc -abstract class _$$Message_PeerCacheInvalidateImplCopyWith<$Res> { - factory _$$Message_PeerCacheInvalidateImplCopyWith( - _$Message_PeerCacheInvalidateImpl value, - $Res Function(_$Message_PeerCacheInvalidateImpl) then) = - __$$Message_PeerCacheInvalidateImplCopyWithImpl<$Res>; +@override +int get hashCode => runtimeType.hashCode; + +@override +String toString() { + return 'LoginState.needs2FaVerification()'; } -/// @nodoc -class __$$Message_PeerCacheInvalidateImplCopyWithImpl<$Res> - extends _$MessageCopyWithImpl<$Res, _$Message_PeerCacheInvalidateImpl> - implements _$$Message_PeerCacheInvalidateImplCopyWith<$Res> { - __$$Message_PeerCacheInvalidateImplCopyWithImpl( - _$Message_PeerCacheInvalidateImpl _value, - $Res Function(_$Message_PeerCacheInvalidateImpl) _then) - : super(_value, _then); - /// Create a copy of Message - /// with the given fields replaced by the non-null parameter values. } + + + /// @nodoc -class _$Message_PeerCacheInvalidateImpl extends Message_PeerCacheInvalidate { - const _$Message_PeerCacheInvalidateImpl() : super._(); - @override - String toString() { - return 'Message.peerCacheInvalidate()'; - } +class LoginState_NeedsSMS2FA extends LoginState { + const LoginState_NeedsSMS2FA(): super._(); - @override - bool operator ==(Object other) { - return identical(this, other) || - (other.runtimeType == runtimeType && - other is _$Message_PeerCacheInvalidateImpl); - } - @override - int get hashCode => runtimeType.hashCode; - - @override - @optionalTypeArgs - TResult when({ - required TResult Function(NormalMessage field0) message, - required TResult Function(RenameMessage field0) renameMessage, - required TResult Function(ChangeParticipantMessage field0) - changeParticipants, - required TResult Function(ReactMessage field0) react, - required TResult Function() delivered, - required TResult Function() read, - required TResult Function(bool field0, TypingApp? field1) typing, - required TResult Function(UnsendMessage field0) unsend, - required TResult Function(EditMessage field0) edit, - required TResult Function(IconChangeMessage field0) iconChange, - required TResult Function(bool field0) enableSmsActivation, - required TResult Function() messageReadOnDevice, - required TResult Function(bool field0) smsConfirmSent, - required TResult Function() markUnread, - required TResult Function() peerCacheInvalidate, - required TResult Function(UpdateExtensionMessage field0) updateExtension, - required TResult Function(ErrorMessage field0) error, - required TResult Function(MoveToRecycleBinMessage field0) moveToRecycleBin, - required TResult Function(OperatedChat field0) recoverChat, - required TResult Function(PermanentDeleteMessage field0) permanentDelete, - required TResult Function() unschedule, - required TResult Function(UpdateProfileMessage field0) updateProfile, - required TResult Function(UpdateProfileSharingMessage field0) - updateProfileSharing, - required TResult Function(ShareProfileMessage field0) shareProfile, - required TResult Function() notifyAnyways, - required TResult Function(SetTranscriptBackgroundMessage field0) - setTranscriptBackground, - }) { - return peerCacheInvalidate(); - } - @override - @optionalTypeArgs - TResult? whenOrNull({ - TResult? Function(NormalMessage field0)? message, - TResult? Function(RenameMessage field0)? renameMessage, - TResult? Function(ChangeParticipantMessage field0)? changeParticipants, - TResult? Function(ReactMessage field0)? react, - TResult? Function()? delivered, - TResult? Function()? read, - TResult? Function(bool field0, TypingApp? field1)? typing, - TResult? Function(UnsendMessage field0)? unsend, - TResult? Function(EditMessage field0)? edit, - TResult? Function(IconChangeMessage field0)? iconChange, - TResult? Function(bool field0)? enableSmsActivation, - TResult? Function()? messageReadOnDevice, - TResult? Function(bool field0)? smsConfirmSent, - TResult? Function()? markUnread, - TResult? Function()? peerCacheInvalidate, - TResult? Function(UpdateExtensionMessage field0)? updateExtension, - TResult? Function(ErrorMessage field0)? error, - TResult? Function(MoveToRecycleBinMessage field0)? moveToRecycleBin, - TResult? Function(OperatedChat field0)? recoverChat, - TResult? Function(PermanentDeleteMessage field0)? permanentDelete, - TResult? Function()? unschedule, - TResult? Function(UpdateProfileMessage field0)? updateProfile, - TResult? Function(UpdateProfileSharingMessage field0)? updateProfileSharing, - TResult? Function(ShareProfileMessage field0)? shareProfile, - TResult? Function()? notifyAnyways, - TResult? Function(SetTranscriptBackgroundMessage field0)? - setTranscriptBackground, - }) { - return peerCacheInvalidate?.call(); - } - @override - @optionalTypeArgs - TResult maybeWhen({ - TResult Function(NormalMessage field0)? message, - TResult Function(RenameMessage field0)? renameMessage, - TResult Function(ChangeParticipantMessage field0)? changeParticipants, - TResult Function(ReactMessage field0)? react, - TResult Function()? delivered, - TResult Function()? read, - TResult Function(bool field0, TypingApp? field1)? typing, - TResult Function(UnsendMessage field0)? unsend, - TResult Function(EditMessage field0)? edit, - TResult Function(IconChangeMessage field0)? iconChange, - TResult Function(bool field0)? enableSmsActivation, - TResult Function()? messageReadOnDevice, - TResult Function(bool field0)? smsConfirmSent, - TResult Function()? markUnread, - TResult Function()? peerCacheInvalidate, - TResult Function(UpdateExtensionMessage field0)? updateExtension, - TResult Function(ErrorMessage field0)? error, - TResult Function(MoveToRecycleBinMessage field0)? moveToRecycleBin, - TResult Function(OperatedChat field0)? recoverChat, - TResult Function(PermanentDeleteMessage field0)? permanentDelete, - TResult Function()? unschedule, - TResult Function(UpdateProfileMessage field0)? updateProfile, - TResult Function(UpdateProfileSharingMessage field0)? updateProfileSharing, - TResult Function(ShareProfileMessage field0)? shareProfile, - TResult Function()? notifyAnyways, - TResult Function(SetTranscriptBackgroundMessage field0)? - setTranscriptBackground, - required TResult orElse(), - }) { - if (peerCacheInvalidate != null) { - return peerCacheInvalidate(); - } - return orElse(); - } - @override - @optionalTypeArgs - TResult map({ - required TResult Function(Message_Message value) message, - required TResult Function(Message_RenameMessage value) renameMessage, - required TResult Function(Message_ChangeParticipants value) - changeParticipants, - required TResult Function(Message_React value) react, - required TResult Function(Message_Delivered value) delivered, - required TResult Function(Message_Read value) read, - required TResult Function(Message_Typing value) typing, - required TResult Function(Message_Unsend value) unsend, - required TResult Function(Message_Edit value) edit, - required TResult Function(Message_IconChange value) iconChange, - required TResult Function(Message_EnableSmsActivation value) - enableSmsActivation, - required TResult Function(Message_MessageReadOnDevice value) - messageReadOnDevice, - required TResult Function(Message_SmsConfirmSent value) smsConfirmSent, - required TResult Function(Message_MarkUnread value) markUnread, - required TResult Function(Message_PeerCacheInvalidate value) - peerCacheInvalidate, - required TResult Function(Message_UpdateExtension value) updateExtension, - required TResult Function(Message_Error value) error, - required TResult Function(Message_MoveToRecycleBin value) moveToRecycleBin, - required TResult Function(Message_RecoverChat value) recoverChat, - required TResult Function(Message_PermanentDelete value) permanentDelete, - required TResult Function(Message_Unschedule value) unschedule, - required TResult Function(Message_UpdateProfile value) updateProfile, - required TResult Function(Message_UpdateProfileSharing value) - updateProfileSharing, - required TResult Function(Message_ShareProfile value) shareProfile, - required TResult Function(Message_NotifyAnyways value) notifyAnyways, - required TResult Function(Message_SetTranscriptBackground value) - setTranscriptBackground, - }) { - return peerCacheInvalidate(this); - } - @override - @optionalTypeArgs - TResult? mapOrNull({ - TResult? Function(Message_Message value)? message, - TResult? Function(Message_RenameMessage value)? renameMessage, - TResult? Function(Message_ChangeParticipants value)? changeParticipants, - TResult? Function(Message_React value)? react, - TResult? Function(Message_Delivered value)? delivered, - TResult? Function(Message_Read value)? read, - TResult? Function(Message_Typing value)? typing, - TResult? Function(Message_Unsend value)? unsend, - TResult? Function(Message_Edit value)? edit, - TResult? Function(Message_IconChange value)? iconChange, - TResult? Function(Message_EnableSmsActivation value)? enableSmsActivation, - TResult? Function(Message_MessageReadOnDevice value)? messageReadOnDevice, - TResult? Function(Message_SmsConfirmSent value)? smsConfirmSent, - TResult? Function(Message_MarkUnread value)? markUnread, - TResult? Function(Message_PeerCacheInvalidate value)? peerCacheInvalidate, - TResult? Function(Message_UpdateExtension value)? updateExtension, - TResult? Function(Message_Error value)? error, - TResult? Function(Message_MoveToRecycleBin value)? moveToRecycleBin, - TResult? Function(Message_RecoverChat value)? recoverChat, - TResult? Function(Message_PermanentDelete value)? permanentDelete, - TResult? Function(Message_Unschedule value)? unschedule, - TResult? Function(Message_UpdateProfile value)? updateProfile, - TResult? Function(Message_UpdateProfileSharing value)? updateProfileSharing, - TResult? Function(Message_ShareProfile value)? shareProfile, - TResult? Function(Message_NotifyAnyways value)? notifyAnyways, - TResult? Function(Message_SetTranscriptBackground value)? - setTranscriptBackground, - }) { - return peerCacheInvalidate?.call(this); - } - @override - @optionalTypeArgs - TResult maybeMap({ - TResult Function(Message_Message value)? message, - TResult Function(Message_RenameMessage value)? renameMessage, - TResult Function(Message_ChangeParticipants value)? changeParticipants, - TResult Function(Message_React value)? react, - TResult Function(Message_Delivered value)? delivered, - TResult Function(Message_Read value)? read, - TResult Function(Message_Typing value)? typing, - TResult Function(Message_Unsend value)? unsend, - TResult Function(Message_Edit value)? edit, - TResult Function(Message_IconChange value)? iconChange, - TResult Function(Message_EnableSmsActivation value)? enableSmsActivation, - TResult Function(Message_MessageReadOnDevice value)? messageReadOnDevice, - TResult Function(Message_SmsConfirmSent value)? smsConfirmSent, - TResult Function(Message_MarkUnread value)? markUnread, - TResult Function(Message_PeerCacheInvalidate value)? peerCacheInvalidate, - TResult Function(Message_UpdateExtension value)? updateExtension, - TResult Function(Message_Error value)? error, - TResult Function(Message_MoveToRecycleBin value)? moveToRecycleBin, - TResult Function(Message_RecoverChat value)? recoverChat, - TResult Function(Message_PermanentDelete value)? permanentDelete, - TResult Function(Message_Unschedule value)? unschedule, - TResult Function(Message_UpdateProfile value)? updateProfile, - TResult Function(Message_UpdateProfileSharing value)? updateProfileSharing, - TResult Function(Message_ShareProfile value)? shareProfile, - TResult Function(Message_NotifyAnyways value)? notifyAnyways, - TResult Function(Message_SetTranscriptBackground value)? - setTranscriptBackground, - required TResult orElse(), - }) { - if (peerCacheInvalidate != null) { - return peerCacheInvalidate(this); - } - return orElse(); - } +@override +bool operator ==(Object other) { + return identical(this, other) || (other.runtimeType == runtimeType&&other is LoginState_NeedsSMS2FA); } -abstract class Message_PeerCacheInvalidate extends Message { - const factory Message_PeerCacheInvalidate() = - _$Message_PeerCacheInvalidateImpl; - const Message_PeerCacheInvalidate._() : super._(); -} - -/// @nodoc -abstract class _$$Message_UpdateExtensionImplCopyWith<$Res> { - factory _$$Message_UpdateExtensionImplCopyWith( - _$Message_UpdateExtensionImpl value, - $Res Function(_$Message_UpdateExtensionImpl) then) = - __$$Message_UpdateExtensionImplCopyWithImpl<$Res>; - @useResult - $Res call({UpdateExtensionMessage field0}); -} - -/// @nodoc -class __$$Message_UpdateExtensionImplCopyWithImpl<$Res> - extends _$MessageCopyWithImpl<$Res, _$Message_UpdateExtensionImpl> - implements _$$Message_UpdateExtensionImplCopyWith<$Res> { - __$$Message_UpdateExtensionImplCopyWithImpl( - _$Message_UpdateExtensionImpl _value, - $Res Function(_$Message_UpdateExtensionImpl) _then) - : super(_value, _then); - - /// Create a copy of Message - /// with the given fields replaced by the non-null parameter values. - @pragma('vm:prefer-inline') - @override - $Res call({ - Object? field0 = null, - }) { - return _then(_$Message_UpdateExtensionImpl( - null == field0 - ? _value.field0 - : field0 // ignore: cast_nullable_to_non_nullable - as UpdateExtensionMessage, - )); - } + +@override +int get hashCode => runtimeType.hashCode; + +@override +String toString() { + return 'LoginState.needsSms2Fa()'; } -/// @nodoc -class _$Message_UpdateExtensionImpl extends Message_UpdateExtension { - const _$Message_UpdateExtensionImpl(this.field0) : super._(); +} - @override - final UpdateExtensionMessage field0; - @override - String toString() { - return 'Message.updateExtension(field0: $field0)'; - } - @override - bool operator ==(Object other) { - return identical(this, other) || - (other.runtimeType == runtimeType && - other is _$Message_UpdateExtensionImpl && - (identical(other.field0, field0) || other.field0 == field0)); - } - @override - int get hashCode => Object.hash(runtimeType, field0); - - /// Create a copy of Message - /// with the given fields replaced by the non-null parameter values. - @JsonKey(includeFromJson: false, includeToJson: false) - @override - @pragma('vm:prefer-inline') - _$$Message_UpdateExtensionImplCopyWith<_$Message_UpdateExtensionImpl> - get copyWith => __$$Message_UpdateExtensionImplCopyWithImpl< - _$Message_UpdateExtensionImpl>(this, _$identity); - - @override - @optionalTypeArgs - TResult when({ - required TResult Function(NormalMessage field0) message, - required TResult Function(RenameMessage field0) renameMessage, - required TResult Function(ChangeParticipantMessage field0) - changeParticipants, - required TResult Function(ReactMessage field0) react, - required TResult Function() delivered, - required TResult Function() read, - required TResult Function(bool field0, TypingApp? field1) typing, - required TResult Function(UnsendMessage field0) unsend, - required TResult Function(EditMessage field0) edit, - required TResult Function(IconChangeMessage field0) iconChange, - required TResult Function(bool field0) enableSmsActivation, - required TResult Function() messageReadOnDevice, - required TResult Function(bool field0) smsConfirmSent, - required TResult Function() markUnread, - required TResult Function() peerCacheInvalidate, - required TResult Function(UpdateExtensionMessage field0) updateExtension, - required TResult Function(ErrorMessage field0) error, - required TResult Function(MoveToRecycleBinMessage field0) moveToRecycleBin, - required TResult Function(OperatedChat field0) recoverChat, - required TResult Function(PermanentDeleteMessage field0) permanentDelete, - required TResult Function() unschedule, - required TResult Function(UpdateProfileMessage field0) updateProfile, - required TResult Function(UpdateProfileSharingMessage field0) - updateProfileSharing, - required TResult Function(ShareProfileMessage field0) shareProfile, - required TResult Function() notifyAnyways, - required TResult Function(SetTranscriptBackgroundMessage field0) - setTranscriptBackground, - }) { - return updateExtension(field0); - } +/// @nodoc - @override - @optionalTypeArgs - TResult? whenOrNull({ - TResult? Function(NormalMessage field0)? message, - TResult? Function(RenameMessage field0)? renameMessage, - TResult? Function(ChangeParticipantMessage field0)? changeParticipants, - TResult? Function(ReactMessage field0)? react, - TResult? Function()? delivered, - TResult? Function()? read, - TResult? Function(bool field0, TypingApp? field1)? typing, - TResult? Function(UnsendMessage field0)? unsend, - TResult? Function(EditMessage field0)? edit, - TResult? Function(IconChangeMessage field0)? iconChange, - TResult? Function(bool field0)? enableSmsActivation, - TResult? Function()? messageReadOnDevice, - TResult? Function(bool field0)? smsConfirmSent, - TResult? Function()? markUnread, - TResult? Function()? peerCacheInvalidate, - TResult? Function(UpdateExtensionMessage field0)? updateExtension, - TResult? Function(ErrorMessage field0)? error, - TResult? Function(MoveToRecycleBinMessage field0)? moveToRecycleBin, - TResult? Function(OperatedChat field0)? recoverChat, - TResult? Function(PermanentDeleteMessage field0)? permanentDelete, - TResult? Function()? unschedule, - TResult? Function(UpdateProfileMessage field0)? updateProfile, - TResult? Function(UpdateProfileSharingMessage field0)? updateProfileSharing, - TResult? Function(ShareProfileMessage field0)? shareProfile, - TResult? Function()? notifyAnyways, - TResult? Function(SetTranscriptBackgroundMessage field0)? - setTranscriptBackground, - }) { - return updateExtension?.call(field0); - } - @override - @optionalTypeArgs - TResult maybeWhen({ - TResult Function(NormalMessage field0)? message, - TResult Function(RenameMessage field0)? renameMessage, - TResult Function(ChangeParticipantMessage field0)? changeParticipants, - TResult Function(ReactMessage field0)? react, - TResult Function()? delivered, - TResult Function()? read, - TResult Function(bool field0, TypingApp? field1)? typing, - TResult Function(UnsendMessage field0)? unsend, - TResult Function(EditMessage field0)? edit, - TResult Function(IconChangeMessage field0)? iconChange, - TResult Function(bool field0)? enableSmsActivation, - TResult Function()? messageReadOnDevice, - TResult Function(bool field0)? smsConfirmSent, - TResult Function()? markUnread, - TResult Function()? peerCacheInvalidate, - TResult Function(UpdateExtensionMessage field0)? updateExtension, - TResult Function(ErrorMessage field0)? error, - TResult Function(MoveToRecycleBinMessage field0)? moveToRecycleBin, - TResult Function(OperatedChat field0)? recoverChat, - TResult Function(PermanentDeleteMessage field0)? permanentDelete, - TResult Function()? unschedule, - TResult Function(UpdateProfileMessage field0)? updateProfile, - TResult Function(UpdateProfileSharingMessage field0)? updateProfileSharing, - TResult Function(ShareProfileMessage field0)? shareProfile, - TResult Function()? notifyAnyways, - TResult Function(SetTranscriptBackgroundMessage field0)? - setTranscriptBackground, - required TResult orElse(), - }) { - if (updateExtension != null) { - return updateExtension(field0); - } - return orElse(); - } +class LoginState_NeedsSMS2FAVerification extends LoginState { + const LoginState_NeedsSMS2FAVerification(this.field0): super._(); - @override - @optionalTypeArgs - TResult map({ - required TResult Function(Message_Message value) message, - required TResult Function(Message_RenameMessage value) renameMessage, - required TResult Function(Message_ChangeParticipants value) - changeParticipants, - required TResult Function(Message_React value) react, - required TResult Function(Message_Delivered value) delivered, - required TResult Function(Message_Read value) read, - required TResult Function(Message_Typing value) typing, - required TResult Function(Message_Unsend value) unsend, - required TResult Function(Message_Edit value) edit, - required TResult Function(Message_IconChange value) iconChange, - required TResult Function(Message_EnableSmsActivation value) - enableSmsActivation, - required TResult Function(Message_MessageReadOnDevice value) - messageReadOnDevice, - required TResult Function(Message_SmsConfirmSent value) smsConfirmSent, - required TResult Function(Message_MarkUnread value) markUnread, - required TResult Function(Message_PeerCacheInvalidate value) - peerCacheInvalidate, - required TResult Function(Message_UpdateExtension value) updateExtension, - required TResult Function(Message_Error value) error, - required TResult Function(Message_MoveToRecycleBin value) moveToRecycleBin, - required TResult Function(Message_RecoverChat value) recoverChat, - required TResult Function(Message_PermanentDelete value) permanentDelete, - required TResult Function(Message_Unschedule value) unschedule, - required TResult Function(Message_UpdateProfile value) updateProfile, - required TResult Function(Message_UpdateProfileSharing value) - updateProfileSharing, - required TResult Function(Message_ShareProfile value) shareProfile, - required TResult Function(Message_NotifyAnyways value) notifyAnyways, - required TResult Function(Message_SetTranscriptBackground value) - setTranscriptBackground, - }) { - return updateExtension(this); - } - @override - @optionalTypeArgs - TResult? mapOrNull({ - TResult? Function(Message_Message value)? message, - TResult? Function(Message_RenameMessage value)? renameMessage, - TResult? Function(Message_ChangeParticipants value)? changeParticipants, - TResult? Function(Message_React value)? react, - TResult? Function(Message_Delivered value)? delivered, - TResult? Function(Message_Read value)? read, - TResult? Function(Message_Typing value)? typing, - TResult? Function(Message_Unsend value)? unsend, - TResult? Function(Message_Edit value)? edit, - TResult? Function(Message_IconChange value)? iconChange, - TResult? Function(Message_EnableSmsActivation value)? enableSmsActivation, - TResult? Function(Message_MessageReadOnDevice value)? messageReadOnDevice, - TResult? Function(Message_SmsConfirmSent value)? smsConfirmSent, - TResult? Function(Message_MarkUnread value)? markUnread, - TResult? Function(Message_PeerCacheInvalidate value)? peerCacheInvalidate, - TResult? Function(Message_UpdateExtension value)? updateExtension, - TResult? Function(Message_Error value)? error, - TResult? Function(Message_MoveToRecycleBin value)? moveToRecycleBin, - TResult? Function(Message_RecoverChat value)? recoverChat, - TResult? Function(Message_PermanentDelete value)? permanentDelete, - TResult? Function(Message_Unschedule value)? unschedule, - TResult? Function(Message_UpdateProfile value)? updateProfile, - TResult? Function(Message_UpdateProfileSharing value)? updateProfileSharing, - TResult? Function(Message_ShareProfile value)? shareProfile, - TResult? Function(Message_NotifyAnyways value)? notifyAnyways, - TResult? Function(Message_SetTranscriptBackground value)? - setTranscriptBackground, - }) { - return updateExtension?.call(this); - } + final VerifyBody field0; - @override - @optionalTypeArgs - TResult maybeMap({ - TResult Function(Message_Message value)? message, - TResult Function(Message_RenameMessage value)? renameMessage, - TResult Function(Message_ChangeParticipants value)? changeParticipants, - TResult Function(Message_React value)? react, - TResult Function(Message_Delivered value)? delivered, - TResult Function(Message_Read value)? read, - TResult Function(Message_Typing value)? typing, - TResult Function(Message_Unsend value)? unsend, - TResult Function(Message_Edit value)? edit, - TResult Function(Message_IconChange value)? iconChange, - TResult Function(Message_EnableSmsActivation value)? enableSmsActivation, - TResult Function(Message_MessageReadOnDevice value)? messageReadOnDevice, - TResult Function(Message_SmsConfirmSent value)? smsConfirmSent, - TResult Function(Message_MarkUnread value)? markUnread, - TResult Function(Message_PeerCacheInvalidate value)? peerCacheInvalidate, - TResult Function(Message_UpdateExtension value)? updateExtension, - TResult Function(Message_Error value)? error, - TResult Function(Message_MoveToRecycleBin value)? moveToRecycleBin, - TResult Function(Message_RecoverChat value)? recoverChat, - TResult Function(Message_PermanentDelete value)? permanentDelete, - TResult Function(Message_Unschedule value)? unschedule, - TResult Function(Message_UpdateProfile value)? updateProfile, - TResult Function(Message_UpdateProfileSharing value)? updateProfileSharing, - TResult Function(Message_ShareProfile value)? shareProfile, - TResult Function(Message_NotifyAnyways value)? notifyAnyways, - TResult Function(Message_SetTranscriptBackground value)? - setTranscriptBackground, - required TResult orElse(), - }) { - if (updateExtension != null) { - return updateExtension(this); - } - return orElse(); - } +/// Create a copy of LoginState +/// with the given fields replaced by the non-null parameter values. +@JsonKey(includeFromJson: false, includeToJson: false) +@pragma('vm:prefer-inline') +$LoginState_NeedsSMS2FAVerificationCopyWith get copyWith => _$LoginState_NeedsSMS2FAVerificationCopyWithImpl(this, _$identity); + + + +@override +bool operator ==(Object other) { + return identical(this, other) || (other.runtimeType == runtimeType&&other is LoginState_NeedsSMS2FAVerification&&(identical(other.field0, field0) || other.field0 == field0)); } -abstract class Message_UpdateExtension extends Message { - const factory Message_UpdateExtension(final UpdateExtensionMessage field0) = - _$Message_UpdateExtensionImpl; - const Message_UpdateExtension._() : super._(); - UpdateExtensionMessage get field0; +@override +int get hashCode => Object.hash(runtimeType,field0); - /// Create a copy of Message - /// with the given fields replaced by the non-null parameter values. - @JsonKey(includeFromJson: false, includeToJson: false) - _$$Message_UpdateExtensionImplCopyWith<_$Message_UpdateExtensionImpl> - get copyWith => throw _privateConstructorUsedError; +@override +String toString() { + return 'LoginState.needsSms2FaVerification(field0: $field0)'; } -/// @nodoc -abstract class _$$Message_ErrorImplCopyWith<$Res> { - factory _$$Message_ErrorImplCopyWith( - _$Message_ErrorImpl value, $Res Function(_$Message_ErrorImpl) then) = - __$$Message_ErrorImplCopyWithImpl<$Res>; - @useResult - $Res call({ErrorMessage field0}); + } /// @nodoc -class __$$Message_ErrorImplCopyWithImpl<$Res> - extends _$MessageCopyWithImpl<$Res, _$Message_ErrorImpl> - implements _$$Message_ErrorImplCopyWith<$Res> { - __$$Message_ErrorImplCopyWithImpl( - _$Message_ErrorImpl _value, $Res Function(_$Message_ErrorImpl) _then) - : super(_value, _then); +abstract mixin class $LoginState_NeedsSMS2FAVerificationCopyWith<$Res> implements $LoginStateCopyWith<$Res> { + factory $LoginState_NeedsSMS2FAVerificationCopyWith(LoginState_NeedsSMS2FAVerification value, $Res Function(LoginState_NeedsSMS2FAVerification) _then) = _$LoginState_NeedsSMS2FAVerificationCopyWithImpl; +@useResult +$Res call({ + VerifyBody field0 +}); + - /// Create a copy of Message - /// with the given fields replaced by the non-null parameter values. - @pragma('vm:prefer-inline') - @override - $Res call({ - Object? field0 = null, - }) { - return _then(_$Message_ErrorImpl( - null == field0 - ? _value.field0 - : field0 // ignore: cast_nullable_to_non_nullable - as ErrorMessage, - )); - } -} + +} /// @nodoc +class _$LoginState_NeedsSMS2FAVerificationCopyWithImpl<$Res> + implements $LoginState_NeedsSMS2FAVerificationCopyWith<$Res> { + _$LoginState_NeedsSMS2FAVerificationCopyWithImpl(this._self, this._then); -class _$Message_ErrorImpl extends Message_Error { - const _$Message_ErrorImpl(this.field0) : super._(); + final LoginState_NeedsSMS2FAVerification _self; + final $Res Function(LoginState_NeedsSMS2FAVerification) _then; - @override - final ErrorMessage field0; +/// Create a copy of LoginState +/// with the given fields replaced by the non-null parameter values. +@pragma('vm:prefer-inline') $Res call({Object? field0 = null,}) { + return _then(LoginState_NeedsSMS2FAVerification( +null == field0 ? _self.field0 : field0 // ignore: cast_nullable_to_non_nullable +as VerifyBody, + )); +} - @override - String toString() { - return 'Message.error(field0: $field0)'; - } - @override - bool operator ==(Object other) { - return identical(this, other) || - (other.runtimeType == runtimeType && - other is _$Message_ErrorImpl && - (identical(other.field0, field0) || other.field0 == field0)); - } +} - @override - int get hashCode => Object.hash(runtimeType, field0); - - /// Create a copy of Message - /// with the given fields replaced by the non-null parameter values. - @JsonKey(includeFromJson: false, includeToJson: false) - @override - @pragma('vm:prefer-inline') - _$$Message_ErrorImplCopyWith<_$Message_ErrorImpl> get copyWith => - __$$Message_ErrorImplCopyWithImpl<_$Message_ErrorImpl>(this, _$identity); - - @override - @optionalTypeArgs - TResult when({ - required TResult Function(NormalMessage field0) message, - required TResult Function(RenameMessage field0) renameMessage, - required TResult Function(ChangeParticipantMessage field0) - changeParticipants, - required TResult Function(ReactMessage field0) react, - required TResult Function() delivered, - required TResult Function() read, - required TResult Function(bool field0, TypingApp? field1) typing, - required TResult Function(UnsendMessage field0) unsend, - required TResult Function(EditMessage field0) edit, - required TResult Function(IconChangeMessage field0) iconChange, - required TResult Function(bool field0) enableSmsActivation, - required TResult Function() messageReadOnDevice, - required TResult Function(bool field0) smsConfirmSent, - required TResult Function() markUnread, - required TResult Function() peerCacheInvalidate, - required TResult Function(UpdateExtensionMessage field0) updateExtension, - required TResult Function(ErrorMessage field0) error, - required TResult Function(MoveToRecycleBinMessage field0) moveToRecycleBin, - required TResult Function(OperatedChat field0) recoverChat, - required TResult Function(PermanentDeleteMessage field0) permanentDelete, - required TResult Function() unschedule, - required TResult Function(UpdateProfileMessage field0) updateProfile, - required TResult Function(UpdateProfileSharingMessage field0) - updateProfileSharing, - required TResult Function(ShareProfileMessage field0) shareProfile, - required TResult Function() notifyAnyways, - required TResult Function(SetTranscriptBackgroundMessage field0) - setTranscriptBackground, - }) { - return error(field0); - } +/// @nodoc - @override - @optionalTypeArgs - TResult? whenOrNull({ - TResult? Function(NormalMessage field0)? message, - TResult? Function(RenameMessage field0)? renameMessage, - TResult? Function(ChangeParticipantMessage field0)? changeParticipants, - TResult? Function(ReactMessage field0)? react, - TResult? Function()? delivered, - TResult? Function()? read, - TResult? Function(bool field0, TypingApp? field1)? typing, - TResult? Function(UnsendMessage field0)? unsend, - TResult? Function(EditMessage field0)? edit, - TResult? Function(IconChangeMessage field0)? iconChange, - TResult? Function(bool field0)? enableSmsActivation, - TResult? Function()? messageReadOnDevice, - TResult? Function(bool field0)? smsConfirmSent, - TResult? Function()? markUnread, - TResult? Function()? peerCacheInvalidate, - TResult? Function(UpdateExtensionMessage field0)? updateExtension, - TResult? Function(ErrorMessage field0)? error, - TResult? Function(MoveToRecycleBinMessage field0)? moveToRecycleBin, - TResult? Function(OperatedChat field0)? recoverChat, - TResult? Function(PermanentDeleteMessage field0)? permanentDelete, - TResult? Function()? unschedule, - TResult? Function(UpdateProfileMessage field0)? updateProfile, - TResult? Function(UpdateProfileSharingMessage field0)? updateProfileSharing, - TResult? Function(ShareProfileMessage field0)? shareProfile, - TResult? Function()? notifyAnyways, - TResult? Function(SetTranscriptBackgroundMessage field0)? - setTranscriptBackground, - }) { - return error?.call(field0); - } - @override - @optionalTypeArgs - TResult maybeWhen({ - TResult Function(NormalMessage field0)? message, - TResult Function(RenameMessage field0)? renameMessage, - TResult Function(ChangeParticipantMessage field0)? changeParticipants, - TResult Function(ReactMessage field0)? react, - TResult Function()? delivered, - TResult Function()? read, - TResult Function(bool field0, TypingApp? field1)? typing, - TResult Function(UnsendMessage field0)? unsend, - TResult Function(EditMessage field0)? edit, - TResult Function(IconChangeMessage field0)? iconChange, - TResult Function(bool field0)? enableSmsActivation, - TResult Function()? messageReadOnDevice, - TResult Function(bool field0)? smsConfirmSent, - TResult Function()? markUnread, - TResult Function()? peerCacheInvalidate, - TResult Function(UpdateExtensionMessage field0)? updateExtension, - TResult Function(ErrorMessage field0)? error, - TResult Function(MoveToRecycleBinMessage field0)? moveToRecycleBin, - TResult Function(OperatedChat field0)? recoverChat, - TResult Function(PermanentDeleteMessage field0)? permanentDelete, - TResult Function()? unschedule, - TResult Function(UpdateProfileMessage field0)? updateProfile, - TResult Function(UpdateProfileSharingMessage field0)? updateProfileSharing, - TResult Function(ShareProfileMessage field0)? shareProfile, - TResult Function()? notifyAnyways, - TResult Function(SetTranscriptBackgroundMessage field0)? - setTranscriptBackground, - required TResult orElse(), - }) { - if (error != null) { - return error(field0); - } - return orElse(); - } +class LoginState_NeedsExtraStep extends LoginState { + const LoginState_NeedsExtraStep(this.field0): super._(); - @override - @optionalTypeArgs - TResult map({ - required TResult Function(Message_Message value) message, - required TResult Function(Message_RenameMessage value) renameMessage, - required TResult Function(Message_ChangeParticipants value) - changeParticipants, - required TResult Function(Message_React value) react, - required TResult Function(Message_Delivered value) delivered, - required TResult Function(Message_Read value) read, - required TResult Function(Message_Typing value) typing, - required TResult Function(Message_Unsend value) unsend, - required TResult Function(Message_Edit value) edit, - required TResult Function(Message_IconChange value) iconChange, - required TResult Function(Message_EnableSmsActivation value) - enableSmsActivation, - required TResult Function(Message_MessageReadOnDevice value) - messageReadOnDevice, - required TResult Function(Message_SmsConfirmSent value) smsConfirmSent, - required TResult Function(Message_MarkUnread value) markUnread, - required TResult Function(Message_PeerCacheInvalidate value) - peerCacheInvalidate, - required TResult Function(Message_UpdateExtension value) updateExtension, - required TResult Function(Message_Error value) error, - required TResult Function(Message_MoveToRecycleBin value) moveToRecycleBin, - required TResult Function(Message_RecoverChat value) recoverChat, - required TResult Function(Message_PermanentDelete value) permanentDelete, - required TResult Function(Message_Unschedule value) unschedule, - required TResult Function(Message_UpdateProfile value) updateProfile, - required TResult Function(Message_UpdateProfileSharing value) - updateProfileSharing, - required TResult Function(Message_ShareProfile value) shareProfile, - required TResult Function(Message_NotifyAnyways value) notifyAnyways, - required TResult Function(Message_SetTranscriptBackground value) - setTranscriptBackground, - }) { - return error(this); - } - @override - @optionalTypeArgs - TResult? mapOrNull({ - TResult? Function(Message_Message value)? message, - TResult? Function(Message_RenameMessage value)? renameMessage, - TResult? Function(Message_ChangeParticipants value)? changeParticipants, - TResult? Function(Message_React value)? react, - TResult? Function(Message_Delivered value)? delivered, - TResult? Function(Message_Read value)? read, - TResult? Function(Message_Typing value)? typing, - TResult? Function(Message_Unsend value)? unsend, - TResult? Function(Message_Edit value)? edit, - TResult? Function(Message_IconChange value)? iconChange, - TResult? Function(Message_EnableSmsActivation value)? enableSmsActivation, - TResult? Function(Message_MessageReadOnDevice value)? messageReadOnDevice, - TResult? Function(Message_SmsConfirmSent value)? smsConfirmSent, - TResult? Function(Message_MarkUnread value)? markUnread, - TResult? Function(Message_PeerCacheInvalidate value)? peerCacheInvalidate, - TResult? Function(Message_UpdateExtension value)? updateExtension, - TResult? Function(Message_Error value)? error, - TResult? Function(Message_MoveToRecycleBin value)? moveToRecycleBin, - TResult? Function(Message_RecoverChat value)? recoverChat, - TResult? Function(Message_PermanentDelete value)? permanentDelete, - TResult? Function(Message_Unschedule value)? unschedule, - TResult? Function(Message_UpdateProfile value)? updateProfile, - TResult? Function(Message_UpdateProfileSharing value)? updateProfileSharing, - TResult? Function(Message_ShareProfile value)? shareProfile, - TResult? Function(Message_NotifyAnyways value)? notifyAnyways, - TResult? Function(Message_SetTranscriptBackground value)? - setTranscriptBackground, - }) { - return error?.call(this); - } + final String field0; - @override - @optionalTypeArgs - TResult maybeMap({ - TResult Function(Message_Message value)? message, - TResult Function(Message_RenameMessage value)? renameMessage, - TResult Function(Message_ChangeParticipants value)? changeParticipants, - TResult Function(Message_React value)? react, - TResult Function(Message_Delivered value)? delivered, - TResult Function(Message_Read value)? read, - TResult Function(Message_Typing value)? typing, - TResult Function(Message_Unsend value)? unsend, - TResult Function(Message_Edit value)? edit, - TResult Function(Message_IconChange value)? iconChange, - TResult Function(Message_EnableSmsActivation value)? enableSmsActivation, - TResult Function(Message_MessageReadOnDevice value)? messageReadOnDevice, - TResult Function(Message_SmsConfirmSent value)? smsConfirmSent, - TResult Function(Message_MarkUnread value)? markUnread, - TResult Function(Message_PeerCacheInvalidate value)? peerCacheInvalidate, - TResult Function(Message_UpdateExtension value)? updateExtension, - TResult Function(Message_Error value)? error, - TResult Function(Message_MoveToRecycleBin value)? moveToRecycleBin, - TResult Function(Message_RecoverChat value)? recoverChat, - TResult Function(Message_PermanentDelete value)? permanentDelete, - TResult Function(Message_Unschedule value)? unschedule, - TResult Function(Message_UpdateProfile value)? updateProfile, - TResult Function(Message_UpdateProfileSharing value)? updateProfileSharing, - TResult Function(Message_ShareProfile value)? shareProfile, - TResult Function(Message_NotifyAnyways value)? notifyAnyways, - TResult Function(Message_SetTranscriptBackground value)? - setTranscriptBackground, - required TResult orElse(), - }) { - if (error != null) { - return error(this); - } - return orElse(); - } +/// Create a copy of LoginState +/// with the given fields replaced by the non-null parameter values. +@JsonKey(includeFromJson: false, includeToJson: false) +@pragma('vm:prefer-inline') +$LoginState_NeedsExtraStepCopyWith get copyWith => _$LoginState_NeedsExtraStepCopyWithImpl(this, _$identity); + + + +@override +bool operator ==(Object other) { + return identical(this, other) || (other.runtimeType == runtimeType&&other is LoginState_NeedsExtraStep&&(identical(other.field0, field0) || other.field0 == field0)); } -abstract class Message_Error extends Message { - const factory Message_Error(final ErrorMessage field0) = _$Message_ErrorImpl; - const Message_Error._() : super._(); - ErrorMessage get field0; +@override +int get hashCode => Object.hash(runtimeType,field0); - /// Create a copy of Message - /// with the given fields replaced by the non-null parameter values. - @JsonKey(includeFromJson: false, includeToJson: false) - _$$Message_ErrorImplCopyWith<_$Message_ErrorImpl> get copyWith => - throw _privateConstructorUsedError; +@override +String toString() { + return 'LoginState.needsExtraStep(field0: $field0)'; } -/// @nodoc -abstract class _$$Message_MoveToRecycleBinImplCopyWith<$Res> { - factory _$$Message_MoveToRecycleBinImplCopyWith( - _$Message_MoveToRecycleBinImpl value, - $Res Function(_$Message_MoveToRecycleBinImpl) then) = - __$$Message_MoveToRecycleBinImplCopyWithImpl<$Res>; - @useResult - $Res call({MoveToRecycleBinMessage field0}); + } /// @nodoc -class __$$Message_MoveToRecycleBinImplCopyWithImpl<$Res> - extends _$MessageCopyWithImpl<$Res, _$Message_MoveToRecycleBinImpl> - implements _$$Message_MoveToRecycleBinImplCopyWith<$Res> { - __$$Message_MoveToRecycleBinImplCopyWithImpl( - _$Message_MoveToRecycleBinImpl _value, - $Res Function(_$Message_MoveToRecycleBinImpl) _then) - : super(_value, _then); +abstract mixin class $LoginState_NeedsExtraStepCopyWith<$Res> implements $LoginStateCopyWith<$Res> { + factory $LoginState_NeedsExtraStepCopyWith(LoginState_NeedsExtraStep value, $Res Function(LoginState_NeedsExtraStep) _then) = _$LoginState_NeedsExtraStepCopyWithImpl; +@useResult +$Res call({ + String field0 +}); + + - /// Create a copy of Message - /// with the given fields replaced by the non-null parameter values. - @pragma('vm:prefer-inline') - @override - $Res call({ - Object? field0 = null, - }) { - return _then(_$Message_MoveToRecycleBinImpl( - null == field0 - ? _value.field0 - : field0 // ignore: cast_nullable_to_non_nullable - as MoveToRecycleBinMessage, - )); - } -} +} /// @nodoc +class _$LoginState_NeedsExtraStepCopyWithImpl<$Res> + implements $LoginState_NeedsExtraStepCopyWith<$Res> { + _$LoginState_NeedsExtraStepCopyWithImpl(this._self, this._then); -class _$Message_MoveToRecycleBinImpl extends Message_MoveToRecycleBin { - const _$Message_MoveToRecycleBinImpl(this.field0) : super._(); + final LoginState_NeedsExtraStep _self; + final $Res Function(LoginState_NeedsExtraStep) _then; - @override - final MoveToRecycleBinMessage field0; +/// Create a copy of LoginState +/// with the given fields replaced by the non-null parameter values. +@pragma('vm:prefer-inline') $Res call({Object? field0 = null,}) { + return _then(LoginState_NeedsExtraStep( +null == field0 ? _self.field0 : field0 // ignore: cast_nullable_to_non_nullable +as String, + )); +} - @override - String toString() { - return 'Message.moveToRecycleBin(field0: $field0)'; - } - @override - bool operator ==(Object other) { - return identical(this, other) || - (other.runtimeType == runtimeType && - other is _$Message_MoveToRecycleBinImpl && - (identical(other.field0, field0) || other.field0 == field0)); - } +} - @override - int get hashCode => Object.hash(runtimeType, field0); - - /// Create a copy of Message - /// with the given fields replaced by the non-null parameter values. - @JsonKey(includeFromJson: false, includeToJson: false) - @override - @pragma('vm:prefer-inline') - _$$Message_MoveToRecycleBinImplCopyWith<_$Message_MoveToRecycleBinImpl> - get copyWith => __$$Message_MoveToRecycleBinImplCopyWithImpl< - _$Message_MoveToRecycleBinImpl>(this, _$identity); - - @override - @optionalTypeArgs - TResult when({ - required TResult Function(NormalMessage field0) message, - required TResult Function(RenameMessage field0) renameMessage, - required TResult Function(ChangeParticipantMessage field0) - changeParticipants, - required TResult Function(ReactMessage field0) react, - required TResult Function() delivered, - required TResult Function() read, - required TResult Function(bool field0, TypingApp? field1) typing, - required TResult Function(UnsendMessage field0) unsend, - required TResult Function(EditMessage field0) edit, - required TResult Function(IconChangeMessage field0) iconChange, - required TResult Function(bool field0) enableSmsActivation, - required TResult Function() messageReadOnDevice, - required TResult Function(bool field0) smsConfirmSent, - required TResult Function() markUnread, - required TResult Function() peerCacheInvalidate, - required TResult Function(UpdateExtensionMessage field0) updateExtension, - required TResult Function(ErrorMessage field0) error, - required TResult Function(MoveToRecycleBinMessage field0) moveToRecycleBin, - required TResult Function(OperatedChat field0) recoverChat, - required TResult Function(PermanentDeleteMessage field0) permanentDelete, - required TResult Function() unschedule, - required TResult Function(UpdateProfileMessage field0) updateProfile, - required TResult Function(UpdateProfileSharingMessage field0) - updateProfileSharing, - required TResult Function(ShareProfileMessage field0) shareProfile, - required TResult Function() notifyAnyways, - required TResult Function(SetTranscriptBackgroundMessage field0) - setTranscriptBackground, - }) { - return moveToRecycleBin(field0); - } +/// @nodoc - @override - @optionalTypeArgs - TResult? whenOrNull({ - TResult? Function(NormalMessage field0)? message, - TResult? Function(RenameMessage field0)? renameMessage, - TResult? Function(ChangeParticipantMessage field0)? changeParticipants, - TResult? Function(ReactMessage field0)? react, - TResult? Function()? delivered, - TResult? Function()? read, - TResult? Function(bool field0, TypingApp? field1)? typing, - TResult? Function(UnsendMessage field0)? unsend, - TResult? Function(EditMessage field0)? edit, - TResult? Function(IconChangeMessage field0)? iconChange, - TResult? Function(bool field0)? enableSmsActivation, - TResult? Function()? messageReadOnDevice, - TResult? Function(bool field0)? smsConfirmSent, - TResult? Function()? markUnread, - TResult? Function()? peerCacheInvalidate, - TResult? Function(UpdateExtensionMessage field0)? updateExtension, - TResult? Function(ErrorMessage field0)? error, - TResult? Function(MoveToRecycleBinMessage field0)? moveToRecycleBin, - TResult? Function(OperatedChat field0)? recoverChat, - TResult? Function(PermanentDeleteMessage field0)? permanentDelete, - TResult? Function()? unschedule, - TResult? Function(UpdateProfileMessage field0)? updateProfile, - TResult? Function(UpdateProfileSharingMessage field0)? updateProfileSharing, - TResult? Function(ShareProfileMessage field0)? shareProfile, - TResult? Function()? notifyAnyways, - TResult? Function(SetTranscriptBackgroundMessage field0)? - setTranscriptBackground, - }) { - return moveToRecycleBin?.call(field0); - } - @override - @optionalTypeArgs - TResult maybeWhen({ - TResult Function(NormalMessage field0)? message, - TResult Function(RenameMessage field0)? renameMessage, - TResult Function(ChangeParticipantMessage field0)? changeParticipants, - TResult Function(ReactMessage field0)? react, - TResult Function()? delivered, - TResult Function()? read, - TResult Function(bool field0, TypingApp? field1)? typing, - TResult Function(UnsendMessage field0)? unsend, - TResult Function(EditMessage field0)? edit, - TResult Function(IconChangeMessage field0)? iconChange, - TResult Function(bool field0)? enableSmsActivation, - TResult Function()? messageReadOnDevice, - TResult Function(bool field0)? smsConfirmSent, - TResult Function()? markUnread, - TResult Function()? peerCacheInvalidate, - TResult Function(UpdateExtensionMessage field0)? updateExtension, - TResult Function(ErrorMessage field0)? error, - TResult Function(MoveToRecycleBinMessage field0)? moveToRecycleBin, - TResult Function(OperatedChat field0)? recoverChat, - TResult Function(PermanentDeleteMessage field0)? permanentDelete, - TResult Function()? unschedule, - TResult Function(UpdateProfileMessage field0)? updateProfile, - TResult Function(UpdateProfileSharingMessage field0)? updateProfileSharing, - TResult Function(ShareProfileMessage field0)? shareProfile, - TResult Function()? notifyAnyways, - TResult Function(SetTranscriptBackgroundMessage field0)? - setTranscriptBackground, - required TResult orElse(), - }) { - if (moveToRecycleBin != null) { - return moveToRecycleBin(field0); - } - return orElse(); - } +class LoginState_NeedsLogin extends LoginState { + const LoginState_NeedsLogin(): super._(); + - @override - @optionalTypeArgs - TResult map({ - required TResult Function(Message_Message value) message, - required TResult Function(Message_RenameMessage value) renameMessage, - required TResult Function(Message_ChangeParticipants value) - changeParticipants, - required TResult Function(Message_React value) react, - required TResult Function(Message_Delivered value) delivered, - required TResult Function(Message_Read value) read, - required TResult Function(Message_Typing value) typing, - required TResult Function(Message_Unsend value) unsend, - required TResult Function(Message_Edit value) edit, - required TResult Function(Message_IconChange value) iconChange, - required TResult Function(Message_EnableSmsActivation value) - enableSmsActivation, - required TResult Function(Message_MessageReadOnDevice value) - messageReadOnDevice, - required TResult Function(Message_SmsConfirmSent value) smsConfirmSent, - required TResult Function(Message_MarkUnread value) markUnread, - required TResult Function(Message_PeerCacheInvalidate value) - peerCacheInvalidate, - required TResult Function(Message_UpdateExtension value) updateExtension, - required TResult Function(Message_Error value) error, - required TResult Function(Message_MoveToRecycleBin value) moveToRecycleBin, - required TResult Function(Message_RecoverChat value) recoverChat, - required TResult Function(Message_PermanentDelete value) permanentDelete, - required TResult Function(Message_Unschedule value) unschedule, - required TResult Function(Message_UpdateProfile value) updateProfile, - required TResult Function(Message_UpdateProfileSharing value) - updateProfileSharing, - required TResult Function(Message_ShareProfile value) shareProfile, - required TResult Function(Message_NotifyAnyways value) notifyAnyways, - required TResult Function(Message_SetTranscriptBackground value) - setTranscriptBackground, - }) { - return moveToRecycleBin(this); - } - @override - @optionalTypeArgs - TResult? mapOrNull({ - TResult? Function(Message_Message value)? message, - TResult? Function(Message_RenameMessage value)? renameMessage, - TResult? Function(Message_ChangeParticipants value)? changeParticipants, - TResult? Function(Message_React value)? react, - TResult? Function(Message_Delivered value)? delivered, - TResult? Function(Message_Read value)? read, - TResult? Function(Message_Typing value)? typing, - TResult? Function(Message_Unsend value)? unsend, - TResult? Function(Message_Edit value)? edit, - TResult? Function(Message_IconChange value)? iconChange, - TResult? Function(Message_EnableSmsActivation value)? enableSmsActivation, - TResult? Function(Message_MessageReadOnDevice value)? messageReadOnDevice, - TResult? Function(Message_SmsConfirmSent value)? smsConfirmSent, - TResult? Function(Message_MarkUnread value)? markUnread, - TResult? Function(Message_PeerCacheInvalidate value)? peerCacheInvalidate, - TResult? Function(Message_UpdateExtension value)? updateExtension, - TResult? Function(Message_Error value)? error, - TResult? Function(Message_MoveToRecycleBin value)? moveToRecycleBin, - TResult? Function(Message_RecoverChat value)? recoverChat, - TResult? Function(Message_PermanentDelete value)? permanentDelete, - TResult? Function(Message_Unschedule value)? unschedule, - TResult? Function(Message_UpdateProfile value)? updateProfile, - TResult? Function(Message_UpdateProfileSharing value)? updateProfileSharing, - TResult? Function(Message_ShareProfile value)? shareProfile, - TResult? Function(Message_NotifyAnyways value)? notifyAnyways, - TResult? Function(Message_SetTranscriptBackground value)? - setTranscriptBackground, - }) { - return moveToRecycleBin?.call(this); - } - @override - @optionalTypeArgs - TResult maybeMap({ - TResult Function(Message_Message value)? message, - TResult Function(Message_RenameMessage value)? renameMessage, - TResult Function(Message_ChangeParticipants value)? changeParticipants, - TResult Function(Message_React value)? react, - TResult Function(Message_Delivered value)? delivered, - TResult Function(Message_Read value)? read, - TResult Function(Message_Typing value)? typing, - TResult Function(Message_Unsend value)? unsend, - TResult Function(Message_Edit value)? edit, - TResult Function(Message_IconChange value)? iconChange, - TResult Function(Message_EnableSmsActivation value)? enableSmsActivation, - TResult Function(Message_MessageReadOnDevice value)? messageReadOnDevice, - TResult Function(Message_SmsConfirmSent value)? smsConfirmSent, - TResult Function(Message_MarkUnread value)? markUnread, - TResult Function(Message_PeerCacheInvalidate value)? peerCacheInvalidate, - TResult Function(Message_UpdateExtension value)? updateExtension, - TResult Function(Message_Error value)? error, - TResult Function(Message_MoveToRecycleBin value)? moveToRecycleBin, - TResult Function(Message_RecoverChat value)? recoverChat, - TResult Function(Message_PermanentDelete value)? permanentDelete, - TResult Function(Message_Unschedule value)? unschedule, - TResult Function(Message_UpdateProfile value)? updateProfile, - TResult Function(Message_UpdateProfileSharing value)? updateProfileSharing, - TResult Function(Message_ShareProfile value)? shareProfile, - TResult Function(Message_NotifyAnyways value)? notifyAnyways, - TResult Function(Message_SetTranscriptBackground value)? - setTranscriptBackground, - required TResult orElse(), - }) { - if (moveToRecycleBin != null) { - return moveToRecycleBin(this); - } - return orElse(); - } -} -abstract class Message_MoveToRecycleBin extends Message { - const factory Message_MoveToRecycleBin(final MoveToRecycleBinMessage field0) = - _$Message_MoveToRecycleBinImpl; - const Message_MoveToRecycleBin._() : super._(); - MoveToRecycleBinMessage get field0; - /// Create a copy of Message - /// with the given fields replaced by the non-null parameter values. - @JsonKey(includeFromJson: false, includeToJson: false) - _$$Message_MoveToRecycleBinImplCopyWith<_$Message_MoveToRecycleBinImpl> - get copyWith => throw _privateConstructorUsedError; +@override +bool operator ==(Object other) { + return identical(this, other) || (other.runtimeType == runtimeType&&other is LoginState_NeedsLogin); } -/// @nodoc -abstract class _$$Message_RecoverChatImplCopyWith<$Res> { - factory _$$Message_RecoverChatImplCopyWith(_$Message_RecoverChatImpl value, - $Res Function(_$Message_RecoverChatImpl) then) = - __$$Message_RecoverChatImplCopyWithImpl<$Res>; - @useResult - $Res call({OperatedChat field0}); + +@override +int get hashCode => runtimeType.hashCode; + +@override +String toString() { + return 'LoginState.needsLogin()'; } -/// @nodoc -class __$$Message_RecoverChatImplCopyWithImpl<$Res> - extends _$MessageCopyWithImpl<$Res, _$Message_RecoverChatImpl> - implements _$$Message_RecoverChatImplCopyWith<$Res> { - __$$Message_RecoverChatImplCopyWithImpl(_$Message_RecoverChatImpl _value, - $Res Function(_$Message_RecoverChatImpl) _then) - : super(_value, _then); - /// Create a copy of Message - /// with the given fields replaced by the non-null parameter values. - @pragma('vm:prefer-inline') - @override - $Res call({ - Object? field0 = null, - }) { - return _then(_$Message_RecoverChatImpl( - null == field0 - ? _value.field0 - : field0 // ignore: cast_nullable_to_non_nullable - as OperatedChat, - )); - } } -/// @nodoc -class _$Message_RecoverChatImpl extends Message_RecoverChat { - const _$Message_RecoverChatImpl(this.field0) : super._(); - @override - final OperatedChat field0; - @override - String toString() { - return 'Message.recoverChat(field0: $field0)'; - } +/// @nodoc +mixin _$LPSpecializationMetadata { - @override - bool operator ==(Object other) { - return identical(this, other) || - (other.runtimeType == runtimeType && - other is _$Message_RecoverChatImpl && - (identical(other.field0, field0) || other.field0 == field0)); - } + String get groupName; String get urlParameters; +/// Create a copy of LPSpecializationMetadata +/// with the given fields replaced by the non-null parameter values. +@JsonKey(includeFromJson: false, includeToJson: false) +@pragma('vm:prefer-inline') +$LPSpecializationMetadataCopyWith get copyWith => _$LPSpecializationMetadataCopyWithImpl(this as LPSpecializationMetadata, _$identity); - @override - int get hashCode => Object.hash(runtimeType, field0); - - /// Create a copy of Message - /// with the given fields replaced by the non-null parameter values. - @JsonKey(includeFromJson: false, includeToJson: false) - @override - @pragma('vm:prefer-inline') - _$$Message_RecoverChatImplCopyWith<_$Message_RecoverChatImpl> get copyWith => - __$$Message_RecoverChatImplCopyWithImpl<_$Message_RecoverChatImpl>( - this, _$identity); - - @override - @optionalTypeArgs - TResult when({ - required TResult Function(NormalMessage field0) message, - required TResult Function(RenameMessage field0) renameMessage, - required TResult Function(ChangeParticipantMessage field0) - changeParticipants, - required TResult Function(ReactMessage field0) react, - required TResult Function() delivered, - required TResult Function() read, - required TResult Function(bool field0, TypingApp? field1) typing, - required TResult Function(UnsendMessage field0) unsend, - required TResult Function(EditMessage field0) edit, - required TResult Function(IconChangeMessage field0) iconChange, - required TResult Function(bool field0) enableSmsActivation, - required TResult Function() messageReadOnDevice, - required TResult Function(bool field0) smsConfirmSent, - required TResult Function() markUnread, - required TResult Function() peerCacheInvalidate, - required TResult Function(UpdateExtensionMessage field0) updateExtension, - required TResult Function(ErrorMessage field0) error, - required TResult Function(MoveToRecycleBinMessage field0) moveToRecycleBin, - required TResult Function(OperatedChat field0) recoverChat, - required TResult Function(PermanentDeleteMessage field0) permanentDelete, - required TResult Function() unschedule, - required TResult Function(UpdateProfileMessage field0) updateProfile, - required TResult Function(UpdateProfileSharingMessage field0) - updateProfileSharing, - required TResult Function(ShareProfileMessage field0) shareProfile, - required TResult Function() notifyAnyways, - required TResult Function(SetTranscriptBackgroundMessage field0) - setTranscriptBackground, - }) { - return recoverChat(field0); - } - @override - @optionalTypeArgs - TResult? whenOrNull({ - TResult? Function(NormalMessage field0)? message, - TResult? Function(RenameMessage field0)? renameMessage, - TResult? Function(ChangeParticipantMessage field0)? changeParticipants, - TResult? Function(ReactMessage field0)? react, - TResult? Function()? delivered, - TResult? Function()? read, - TResult? Function(bool field0, TypingApp? field1)? typing, - TResult? Function(UnsendMessage field0)? unsend, - TResult? Function(EditMessage field0)? edit, - TResult? Function(IconChangeMessage field0)? iconChange, - TResult? Function(bool field0)? enableSmsActivation, - TResult? Function()? messageReadOnDevice, - TResult? Function(bool field0)? smsConfirmSent, - TResult? Function()? markUnread, - TResult? Function()? peerCacheInvalidate, - TResult? Function(UpdateExtensionMessage field0)? updateExtension, - TResult? Function(ErrorMessage field0)? error, - TResult? Function(MoveToRecycleBinMessage field0)? moveToRecycleBin, - TResult? Function(OperatedChat field0)? recoverChat, - TResult? Function(PermanentDeleteMessage field0)? permanentDelete, - TResult? Function()? unschedule, - TResult? Function(UpdateProfileMessage field0)? updateProfile, - TResult? Function(UpdateProfileSharingMessage field0)? updateProfileSharing, - TResult? Function(ShareProfileMessage field0)? shareProfile, - TResult? Function()? notifyAnyways, - TResult? Function(SetTranscriptBackgroundMessage field0)? - setTranscriptBackground, - }) { - return recoverChat?.call(field0); - } - @override - @optionalTypeArgs - TResult maybeWhen({ - TResult Function(NormalMessage field0)? message, - TResult Function(RenameMessage field0)? renameMessage, - TResult Function(ChangeParticipantMessage field0)? changeParticipants, - TResult Function(ReactMessage field0)? react, - TResult Function()? delivered, - TResult Function()? read, - TResult Function(bool field0, TypingApp? field1)? typing, - TResult Function(UnsendMessage field0)? unsend, - TResult Function(EditMessage field0)? edit, - TResult Function(IconChangeMessage field0)? iconChange, - TResult Function(bool field0)? enableSmsActivation, - TResult Function()? messageReadOnDevice, - TResult Function(bool field0)? smsConfirmSent, - TResult Function()? markUnread, - TResult Function()? peerCacheInvalidate, - TResult Function(UpdateExtensionMessage field0)? updateExtension, - TResult Function(ErrorMessage field0)? error, - TResult Function(MoveToRecycleBinMessage field0)? moveToRecycleBin, - TResult Function(OperatedChat field0)? recoverChat, - TResult Function(PermanentDeleteMessage field0)? permanentDelete, - TResult Function()? unschedule, - TResult Function(UpdateProfileMessage field0)? updateProfile, - TResult Function(UpdateProfileSharingMessage field0)? updateProfileSharing, - TResult Function(ShareProfileMessage field0)? shareProfile, - TResult Function()? notifyAnyways, - TResult Function(SetTranscriptBackgroundMessage field0)? - setTranscriptBackground, - required TResult orElse(), - }) { - if (recoverChat != null) { - return recoverChat(field0); - } - return orElse(); - } +@override +bool operator ==(Object other) { + return identical(this, other) || (other.runtimeType == runtimeType&&other is LPSpecializationMetadata&&(identical(other.groupName, groupName) || other.groupName == groupName)&&(identical(other.urlParameters, urlParameters) || other.urlParameters == urlParameters)); +} - @override - @optionalTypeArgs - TResult map({ - required TResult Function(Message_Message value) message, - required TResult Function(Message_RenameMessage value) renameMessage, - required TResult Function(Message_ChangeParticipants value) - changeParticipants, - required TResult Function(Message_React value) react, - required TResult Function(Message_Delivered value) delivered, - required TResult Function(Message_Read value) read, - required TResult Function(Message_Typing value) typing, - required TResult Function(Message_Unsend value) unsend, - required TResult Function(Message_Edit value) edit, - required TResult Function(Message_IconChange value) iconChange, - required TResult Function(Message_EnableSmsActivation value) - enableSmsActivation, - required TResult Function(Message_MessageReadOnDevice value) - messageReadOnDevice, - required TResult Function(Message_SmsConfirmSent value) smsConfirmSent, - required TResult Function(Message_MarkUnread value) markUnread, - required TResult Function(Message_PeerCacheInvalidate value) - peerCacheInvalidate, - required TResult Function(Message_UpdateExtension value) updateExtension, - required TResult Function(Message_Error value) error, - required TResult Function(Message_MoveToRecycleBin value) moveToRecycleBin, - required TResult Function(Message_RecoverChat value) recoverChat, - required TResult Function(Message_PermanentDelete value) permanentDelete, - required TResult Function(Message_Unschedule value) unschedule, - required TResult Function(Message_UpdateProfile value) updateProfile, - required TResult Function(Message_UpdateProfileSharing value) - updateProfileSharing, - required TResult Function(Message_ShareProfile value) shareProfile, - required TResult Function(Message_NotifyAnyways value) notifyAnyways, - required TResult Function(Message_SetTranscriptBackground value) - setTranscriptBackground, - }) { - return recoverChat(this); - } - @override - @optionalTypeArgs - TResult? mapOrNull({ - TResult? Function(Message_Message value)? message, - TResult? Function(Message_RenameMessage value)? renameMessage, - TResult? Function(Message_ChangeParticipants value)? changeParticipants, - TResult? Function(Message_React value)? react, - TResult? Function(Message_Delivered value)? delivered, - TResult? Function(Message_Read value)? read, - TResult? Function(Message_Typing value)? typing, - TResult? Function(Message_Unsend value)? unsend, - TResult? Function(Message_Edit value)? edit, - TResult? Function(Message_IconChange value)? iconChange, - TResult? Function(Message_EnableSmsActivation value)? enableSmsActivation, - TResult? Function(Message_MessageReadOnDevice value)? messageReadOnDevice, - TResult? Function(Message_SmsConfirmSent value)? smsConfirmSent, - TResult? Function(Message_MarkUnread value)? markUnread, - TResult? Function(Message_PeerCacheInvalidate value)? peerCacheInvalidate, - TResult? Function(Message_UpdateExtension value)? updateExtension, - TResult? Function(Message_Error value)? error, - TResult? Function(Message_MoveToRecycleBin value)? moveToRecycleBin, - TResult? Function(Message_RecoverChat value)? recoverChat, - TResult? Function(Message_PermanentDelete value)? permanentDelete, - TResult? Function(Message_Unschedule value)? unschedule, - TResult? Function(Message_UpdateProfile value)? updateProfile, - TResult? Function(Message_UpdateProfileSharing value)? updateProfileSharing, - TResult? Function(Message_ShareProfile value)? shareProfile, - TResult? Function(Message_NotifyAnyways value)? notifyAnyways, - TResult? Function(Message_SetTranscriptBackground value)? - setTranscriptBackground, - }) { - return recoverChat?.call(this); - } +@override +int get hashCode => Object.hash(runtimeType,groupName,urlParameters); - @override - @optionalTypeArgs - TResult maybeMap({ - TResult Function(Message_Message value)? message, - TResult Function(Message_RenameMessage value)? renameMessage, - TResult Function(Message_ChangeParticipants value)? changeParticipants, - TResult Function(Message_React value)? react, - TResult Function(Message_Delivered value)? delivered, - TResult Function(Message_Read value)? read, - TResult Function(Message_Typing value)? typing, - TResult Function(Message_Unsend value)? unsend, - TResult Function(Message_Edit value)? edit, - TResult Function(Message_IconChange value)? iconChange, - TResult Function(Message_EnableSmsActivation value)? enableSmsActivation, - TResult Function(Message_MessageReadOnDevice value)? messageReadOnDevice, - TResult Function(Message_SmsConfirmSent value)? smsConfirmSent, - TResult Function(Message_MarkUnread value)? markUnread, - TResult Function(Message_PeerCacheInvalidate value)? peerCacheInvalidate, - TResult Function(Message_UpdateExtension value)? updateExtension, - TResult Function(Message_Error value)? error, - TResult Function(Message_MoveToRecycleBin value)? moveToRecycleBin, - TResult Function(Message_RecoverChat value)? recoverChat, - TResult Function(Message_PermanentDelete value)? permanentDelete, - TResult Function(Message_Unschedule value)? unschedule, - TResult Function(Message_UpdateProfile value)? updateProfile, - TResult Function(Message_UpdateProfileSharing value)? updateProfileSharing, - TResult Function(Message_ShareProfile value)? shareProfile, - TResult Function(Message_NotifyAnyways value)? notifyAnyways, - TResult Function(Message_SetTranscriptBackground value)? - setTranscriptBackground, - required TResult orElse(), - }) { - if (recoverChat != null) { - return recoverChat(this); - } - return orElse(); - } +@override +String toString() { + return 'LPSpecializationMetadata(groupName: $groupName, urlParameters: $urlParameters)'; } -abstract class Message_RecoverChat extends Message { - const factory Message_RecoverChat(final OperatedChat field0) = - _$Message_RecoverChatImpl; - const Message_RecoverChat._() : super._(); - - OperatedChat get field0; - - /// Create a copy of Message - /// with the given fields replaced by the non-null parameter values. - @JsonKey(includeFromJson: false, includeToJson: false) - _$$Message_RecoverChatImplCopyWith<_$Message_RecoverChatImpl> get copyWith => - throw _privateConstructorUsedError; -} - -/// @nodoc -abstract class _$$Message_PermanentDeleteImplCopyWith<$Res> { - factory _$$Message_PermanentDeleteImplCopyWith( - _$Message_PermanentDeleteImpl value, - $Res Function(_$Message_PermanentDeleteImpl) then) = - __$$Message_PermanentDeleteImplCopyWithImpl<$Res>; - @useResult - $Res call({PermanentDeleteMessage field0}); -} - -/// @nodoc -class __$$Message_PermanentDeleteImplCopyWithImpl<$Res> - extends _$MessageCopyWithImpl<$Res, _$Message_PermanentDeleteImpl> - implements _$$Message_PermanentDeleteImplCopyWith<$Res> { - __$$Message_PermanentDeleteImplCopyWithImpl( - _$Message_PermanentDeleteImpl _value, - $Res Function(_$Message_PermanentDeleteImpl) _then) - : super(_value, _then); - - /// Create a copy of Message - /// with the given fields replaced by the non-null parameter values. - @pragma('vm:prefer-inline') - @override - $Res call({ - Object? field0 = null, - }) { - return _then(_$Message_PermanentDeleteImpl( - null == field0 - ? _value.field0 - : field0 // ignore: cast_nullable_to_non_nullable - as PermanentDeleteMessage, - )); - } + } /// @nodoc +abstract mixin class $LPSpecializationMetadataCopyWith<$Res> { + factory $LPSpecializationMetadataCopyWith(LPSpecializationMetadata value, $Res Function(LPSpecializationMetadata) _then) = _$LPSpecializationMetadataCopyWithImpl; +@useResult +$Res call({ + String groupName, String urlParameters +}); -class _$Message_PermanentDeleteImpl extends Message_PermanentDelete { - const _$Message_PermanentDeleteImpl(this.field0) : super._(); - - @override - final PermanentDeleteMessage field0; - - @override - String toString() { - return 'Message.permanentDelete(field0: $field0)'; - } - @override - bool operator ==(Object other) { - return identical(this, other) || - (other.runtimeType == runtimeType && - other is _$Message_PermanentDeleteImpl && - (identical(other.field0, field0) || other.field0 == field0)); - } - @override - int get hashCode => Object.hash(runtimeType, field0); - - /// Create a copy of Message - /// with the given fields replaced by the non-null parameter values. - @JsonKey(includeFromJson: false, includeToJson: false) - @override - @pragma('vm:prefer-inline') - _$$Message_PermanentDeleteImplCopyWith<_$Message_PermanentDeleteImpl> - get copyWith => __$$Message_PermanentDeleteImplCopyWithImpl< - _$Message_PermanentDeleteImpl>(this, _$identity); - - @override - @optionalTypeArgs - TResult when({ - required TResult Function(NormalMessage field0) message, - required TResult Function(RenameMessage field0) renameMessage, - required TResult Function(ChangeParticipantMessage field0) - changeParticipants, - required TResult Function(ReactMessage field0) react, - required TResult Function() delivered, - required TResult Function() read, - required TResult Function(bool field0, TypingApp? field1) typing, - required TResult Function(UnsendMessage field0) unsend, - required TResult Function(EditMessage field0) edit, - required TResult Function(IconChangeMessage field0) iconChange, - required TResult Function(bool field0) enableSmsActivation, - required TResult Function() messageReadOnDevice, - required TResult Function(bool field0) smsConfirmSent, - required TResult Function() markUnread, - required TResult Function() peerCacheInvalidate, - required TResult Function(UpdateExtensionMessage field0) updateExtension, - required TResult Function(ErrorMessage field0) error, - required TResult Function(MoveToRecycleBinMessage field0) moveToRecycleBin, - required TResult Function(OperatedChat field0) recoverChat, - required TResult Function(PermanentDeleteMessage field0) permanentDelete, - required TResult Function() unschedule, - required TResult Function(UpdateProfileMessage field0) updateProfile, - required TResult Function(UpdateProfileSharingMessage field0) - updateProfileSharing, - required TResult Function(ShareProfileMessage field0) shareProfile, - required TResult Function() notifyAnyways, - required TResult Function(SetTranscriptBackgroundMessage field0) - setTranscriptBackground, - }) { - return permanentDelete(field0); - } - @override - @optionalTypeArgs - TResult? whenOrNull({ - TResult? Function(NormalMessage field0)? message, - TResult? Function(RenameMessage field0)? renameMessage, - TResult? Function(ChangeParticipantMessage field0)? changeParticipants, - TResult? Function(ReactMessage field0)? react, - TResult? Function()? delivered, - TResult? Function()? read, - TResult? Function(bool field0, TypingApp? field1)? typing, - TResult? Function(UnsendMessage field0)? unsend, - TResult? Function(EditMessage field0)? edit, - TResult? Function(IconChangeMessage field0)? iconChange, - TResult? Function(bool field0)? enableSmsActivation, - TResult? Function()? messageReadOnDevice, - TResult? Function(bool field0)? smsConfirmSent, - TResult? Function()? markUnread, - TResult? Function()? peerCacheInvalidate, - TResult? Function(UpdateExtensionMessage field0)? updateExtension, - TResult? Function(ErrorMessage field0)? error, - TResult? Function(MoveToRecycleBinMessage field0)? moveToRecycleBin, - TResult? Function(OperatedChat field0)? recoverChat, - TResult? Function(PermanentDeleteMessage field0)? permanentDelete, - TResult? Function()? unschedule, - TResult? Function(UpdateProfileMessage field0)? updateProfile, - TResult? Function(UpdateProfileSharingMessage field0)? updateProfileSharing, - TResult? Function(ShareProfileMessage field0)? shareProfile, - TResult? Function()? notifyAnyways, - TResult? Function(SetTranscriptBackgroundMessage field0)? - setTranscriptBackground, - }) { - return permanentDelete?.call(field0); - } +} +/// @nodoc +class _$LPSpecializationMetadataCopyWithImpl<$Res> + implements $LPSpecializationMetadataCopyWith<$Res> { + _$LPSpecializationMetadataCopyWithImpl(this._self, this._then); + + final LPSpecializationMetadata _self; + final $Res Function(LPSpecializationMetadata) _then; + +/// Create a copy of LPSpecializationMetadata +/// with the given fields replaced by the non-null parameter values. +@pragma('vm:prefer-inline') @override $Res call({Object? groupName = null,Object? urlParameters = null,}) { + return _then(_self.copyWith( +groupName: null == groupName ? _self.groupName : groupName // ignore: cast_nullable_to_non_nullable +as String,urlParameters: null == urlParameters ? _self.urlParameters : urlParameters // ignore: cast_nullable_to_non_nullable +as String, + )); +} + +} + + +/// Adds pattern-matching-related methods to [LPSpecializationMetadata]. +extension LPSpecializationMetadataPatterns on LPSpecializationMetadata { +/// A variant of `map` that fallback to returning `orElse`. +/// +/// It is equivalent to doing: +/// ```dart +/// switch (sealedClass) { +/// case final Subclass value: +/// return ...; +/// case _: +/// return orElse(); +/// } +/// ``` + +@optionalTypeArgs TResult maybeMap({TResult Function( LPSpecializationMetadata_LPPasswordsInviteMetadata value)? lpPasswordsInviteMetadata,required TResult orElse(),}){ +final _that = this; +switch (_that) { +case LPSpecializationMetadata_LPPasswordsInviteMetadata() when lpPasswordsInviteMetadata != null: +return lpPasswordsInviteMetadata(_that);case _: + return orElse(); + +} +} +/// A `switch`-like method, using callbacks. +/// +/// Callbacks receives the raw object, upcasted. +/// It is equivalent to doing: +/// ```dart +/// switch (sealedClass) { +/// case final Subclass value: +/// return ...; +/// case final Subclass2 value: +/// return ...; +/// } +/// ``` + +@optionalTypeArgs TResult map({required TResult Function( LPSpecializationMetadata_LPPasswordsInviteMetadata value) lpPasswordsInviteMetadata,}){ +final _that = this; +switch (_that) { +case LPSpecializationMetadata_LPPasswordsInviteMetadata(): +return lpPasswordsInviteMetadata(_that);} +} +/// A variant of `map` that fallback to returning `null`. +/// +/// It is equivalent to doing: +/// ```dart +/// switch (sealedClass) { +/// case final Subclass value: +/// return ...; +/// case _: +/// return null; +/// } +/// ``` - @override - @optionalTypeArgs - TResult maybeWhen({ - TResult Function(NormalMessage field0)? message, - TResult Function(RenameMessage field0)? renameMessage, - TResult Function(ChangeParticipantMessage field0)? changeParticipants, - TResult Function(ReactMessage field0)? react, - TResult Function()? delivered, - TResult Function()? read, - TResult Function(bool field0, TypingApp? field1)? typing, - TResult Function(UnsendMessage field0)? unsend, - TResult Function(EditMessage field0)? edit, - TResult Function(IconChangeMessage field0)? iconChange, - TResult Function(bool field0)? enableSmsActivation, - TResult Function()? messageReadOnDevice, - TResult Function(bool field0)? smsConfirmSent, - TResult Function()? markUnread, - TResult Function()? peerCacheInvalidate, - TResult Function(UpdateExtensionMessage field0)? updateExtension, - TResult Function(ErrorMessage field0)? error, - TResult Function(MoveToRecycleBinMessage field0)? moveToRecycleBin, - TResult Function(OperatedChat field0)? recoverChat, - TResult Function(PermanentDeleteMessage field0)? permanentDelete, - TResult Function()? unschedule, - TResult Function(UpdateProfileMessage field0)? updateProfile, - TResult Function(UpdateProfileSharingMessage field0)? updateProfileSharing, - TResult Function(ShareProfileMessage field0)? shareProfile, - TResult Function()? notifyAnyways, - TResult Function(SetTranscriptBackgroundMessage field0)? - setTranscriptBackground, - required TResult orElse(), - }) { - if (permanentDelete != null) { - return permanentDelete(field0); - } - return orElse(); - } +@optionalTypeArgs TResult? mapOrNull({TResult? Function( LPSpecializationMetadata_LPPasswordsInviteMetadata value)? lpPasswordsInviteMetadata,}){ +final _that = this; +switch (_that) { +case LPSpecializationMetadata_LPPasswordsInviteMetadata() when lpPasswordsInviteMetadata != null: +return lpPasswordsInviteMetadata(_that);case _: + return null; - @override - @optionalTypeArgs - TResult map({ - required TResult Function(Message_Message value) message, - required TResult Function(Message_RenameMessage value) renameMessage, - required TResult Function(Message_ChangeParticipants value) - changeParticipants, - required TResult Function(Message_React value) react, - required TResult Function(Message_Delivered value) delivered, - required TResult Function(Message_Read value) read, - required TResult Function(Message_Typing value) typing, - required TResult Function(Message_Unsend value) unsend, - required TResult Function(Message_Edit value) edit, - required TResult Function(Message_IconChange value) iconChange, - required TResult Function(Message_EnableSmsActivation value) - enableSmsActivation, - required TResult Function(Message_MessageReadOnDevice value) - messageReadOnDevice, - required TResult Function(Message_SmsConfirmSent value) smsConfirmSent, - required TResult Function(Message_MarkUnread value) markUnread, - required TResult Function(Message_PeerCacheInvalidate value) - peerCacheInvalidate, - required TResult Function(Message_UpdateExtension value) updateExtension, - required TResult Function(Message_Error value) error, - required TResult Function(Message_MoveToRecycleBin value) moveToRecycleBin, - required TResult Function(Message_RecoverChat value) recoverChat, - required TResult Function(Message_PermanentDelete value) permanentDelete, - required TResult Function(Message_Unschedule value) unschedule, - required TResult Function(Message_UpdateProfile value) updateProfile, - required TResult Function(Message_UpdateProfileSharing value) - updateProfileSharing, - required TResult Function(Message_ShareProfile value) shareProfile, - required TResult Function(Message_NotifyAnyways value) notifyAnyways, - required TResult Function(Message_SetTranscriptBackground value) - setTranscriptBackground, - }) { - return permanentDelete(this); - } +} +} +/// A variant of `when` that fallback to an `orElse` callback. +/// +/// It is equivalent to doing: +/// ```dart +/// switch (sealedClass) { +/// case Subclass(:final field): +/// return ...; +/// case _: +/// return orElse(); +/// } +/// ``` - @override - @optionalTypeArgs - TResult? mapOrNull({ - TResult? Function(Message_Message value)? message, - TResult? Function(Message_RenameMessage value)? renameMessage, - TResult? Function(Message_ChangeParticipants value)? changeParticipants, - TResult? Function(Message_React value)? react, - TResult? Function(Message_Delivered value)? delivered, - TResult? Function(Message_Read value)? read, - TResult? Function(Message_Typing value)? typing, - TResult? Function(Message_Unsend value)? unsend, - TResult? Function(Message_Edit value)? edit, - TResult? Function(Message_IconChange value)? iconChange, - TResult? Function(Message_EnableSmsActivation value)? enableSmsActivation, - TResult? Function(Message_MessageReadOnDevice value)? messageReadOnDevice, - TResult? Function(Message_SmsConfirmSent value)? smsConfirmSent, - TResult? Function(Message_MarkUnread value)? markUnread, - TResult? Function(Message_PeerCacheInvalidate value)? peerCacheInvalidate, - TResult? Function(Message_UpdateExtension value)? updateExtension, - TResult? Function(Message_Error value)? error, - TResult? Function(Message_MoveToRecycleBin value)? moveToRecycleBin, - TResult? Function(Message_RecoverChat value)? recoverChat, - TResult? Function(Message_PermanentDelete value)? permanentDelete, - TResult? Function(Message_Unschedule value)? unschedule, - TResult? Function(Message_UpdateProfile value)? updateProfile, - TResult? Function(Message_UpdateProfileSharing value)? updateProfileSharing, - TResult? Function(Message_ShareProfile value)? shareProfile, - TResult? Function(Message_NotifyAnyways value)? notifyAnyways, - TResult? Function(Message_SetTranscriptBackground value)? - setTranscriptBackground, - }) { - return permanentDelete?.call(this); - } +@optionalTypeArgs TResult maybeWhen({TResult Function( String groupName, String urlParameters)? lpPasswordsInviteMetadata,required TResult orElse(),}) {final _that = this; +switch (_that) { +case LPSpecializationMetadata_LPPasswordsInviteMetadata() when lpPasswordsInviteMetadata != null: +return lpPasswordsInviteMetadata(_that.groupName,_that.urlParameters);case _: + return orElse(); - @override - @optionalTypeArgs - TResult maybeMap({ - TResult Function(Message_Message value)? message, - TResult Function(Message_RenameMessage value)? renameMessage, - TResult Function(Message_ChangeParticipants value)? changeParticipants, - TResult Function(Message_React value)? react, - TResult Function(Message_Delivered value)? delivered, - TResult Function(Message_Read value)? read, - TResult Function(Message_Typing value)? typing, - TResult Function(Message_Unsend value)? unsend, - TResult Function(Message_Edit value)? edit, - TResult Function(Message_IconChange value)? iconChange, - TResult Function(Message_EnableSmsActivation value)? enableSmsActivation, - TResult Function(Message_MessageReadOnDevice value)? messageReadOnDevice, - TResult Function(Message_SmsConfirmSent value)? smsConfirmSent, - TResult Function(Message_MarkUnread value)? markUnread, - TResult Function(Message_PeerCacheInvalidate value)? peerCacheInvalidate, - TResult Function(Message_UpdateExtension value)? updateExtension, - TResult Function(Message_Error value)? error, - TResult Function(Message_MoveToRecycleBin value)? moveToRecycleBin, - TResult Function(Message_RecoverChat value)? recoverChat, - TResult Function(Message_PermanentDelete value)? permanentDelete, - TResult Function(Message_Unschedule value)? unschedule, - TResult Function(Message_UpdateProfile value)? updateProfile, - TResult Function(Message_UpdateProfileSharing value)? updateProfileSharing, - TResult Function(Message_ShareProfile value)? shareProfile, - TResult Function(Message_NotifyAnyways value)? notifyAnyways, - TResult Function(Message_SetTranscriptBackground value)? - setTranscriptBackground, - required TResult orElse(), - }) { - if (permanentDelete != null) { - return permanentDelete(this); - } - return orElse(); - } } +} +/// A `switch`-like method, using callbacks. +/// +/// As opposed to `map`, this offers destructuring. +/// It is equivalent to doing: +/// ```dart +/// switch (sealedClass) { +/// case Subclass(:final field): +/// return ...; +/// case Subclass2(:final field2): +/// return ...; +/// } +/// ``` -abstract class Message_PermanentDelete extends Message { - const factory Message_PermanentDelete(final PermanentDeleteMessage field0) = - _$Message_PermanentDeleteImpl; - const Message_PermanentDelete._() : super._(); +@optionalTypeArgs TResult when({required TResult Function( String groupName, String urlParameters) lpPasswordsInviteMetadata,}) {final _that = this; +switch (_that) { +case LPSpecializationMetadata_LPPasswordsInviteMetadata(): +return lpPasswordsInviteMetadata(_that.groupName,_that.urlParameters);} +} +/// A variant of `when` that fallback to returning `null` +/// +/// It is equivalent to doing: +/// ```dart +/// switch (sealedClass) { +/// case Subclass(:final field): +/// return ...; +/// case _: +/// return null; +/// } +/// ``` - PermanentDeleteMessage get field0; +@optionalTypeArgs TResult? whenOrNull({TResult? Function( String groupName, String urlParameters)? lpPasswordsInviteMetadata,}) {final _that = this; +switch (_that) { +case LPSpecializationMetadata_LPPasswordsInviteMetadata() when lpPasswordsInviteMetadata != null: +return lpPasswordsInviteMetadata(_that.groupName,_that.urlParameters);case _: + return null; - /// Create a copy of Message - /// with the given fields replaced by the non-null parameter values. - @JsonKey(includeFromJson: false, includeToJson: false) - _$$Message_PermanentDeleteImplCopyWith<_$Message_PermanentDeleteImpl> - get copyWith => throw _privateConstructorUsedError; +} } -/// @nodoc -abstract class _$$Message_UnscheduleImplCopyWith<$Res> { - factory _$$Message_UnscheduleImplCopyWith(_$Message_UnscheduleImpl value, - $Res Function(_$Message_UnscheduleImpl) then) = - __$$Message_UnscheduleImplCopyWithImpl<$Res>; } /// @nodoc -class __$$Message_UnscheduleImplCopyWithImpl<$Res> - extends _$MessageCopyWithImpl<$Res, _$Message_UnscheduleImpl> - implements _$$Message_UnscheduleImplCopyWith<$Res> { - __$$Message_UnscheduleImplCopyWithImpl(_$Message_UnscheduleImpl _value, - $Res Function(_$Message_UnscheduleImpl) _then) - : super(_value, _then); - /// Create a copy of Message - /// with the given fields replaced by the non-null parameter values. -} -/// @nodoc +class LPSpecializationMetadata_LPPasswordsInviteMetadata extends LPSpecializationMetadata { + const LPSpecializationMetadata_LPPasswordsInviteMetadata({required this.groupName, required this.urlParameters}): super._(); -class _$Message_UnscheduleImpl extends Message_Unschedule { - const _$Message_UnscheduleImpl() : super._(); - @override - String toString() { - return 'Message.unschedule()'; - } +@override final String groupName; +@override final String urlParameters; - @override - bool operator ==(Object other) { - return identical(this, other) || - (other.runtimeType == runtimeType && other is _$Message_UnscheduleImpl); - } +/// Create a copy of LPSpecializationMetadata +/// with the given fields replaced by the non-null parameter values. +@override @JsonKey(includeFromJson: false, includeToJson: false) +@pragma('vm:prefer-inline') +$LPSpecializationMetadata_LPPasswordsInviteMetadataCopyWith get copyWith => _$LPSpecializationMetadata_LPPasswordsInviteMetadataCopyWithImpl(this, _$identity); - @override - int get hashCode => runtimeType.hashCode; - - @override - @optionalTypeArgs - TResult when({ - required TResult Function(NormalMessage field0) message, - required TResult Function(RenameMessage field0) renameMessage, - required TResult Function(ChangeParticipantMessage field0) - changeParticipants, - required TResult Function(ReactMessage field0) react, - required TResult Function() delivered, - required TResult Function() read, - required TResult Function(bool field0, TypingApp? field1) typing, - required TResult Function(UnsendMessage field0) unsend, - required TResult Function(EditMessage field0) edit, - required TResult Function(IconChangeMessage field0) iconChange, - required TResult Function(bool field0) enableSmsActivation, - required TResult Function() messageReadOnDevice, - required TResult Function(bool field0) smsConfirmSent, - required TResult Function() markUnread, - required TResult Function() peerCacheInvalidate, - required TResult Function(UpdateExtensionMessage field0) updateExtension, - required TResult Function(ErrorMessage field0) error, - required TResult Function(MoveToRecycleBinMessage field0) moveToRecycleBin, - required TResult Function(OperatedChat field0) recoverChat, - required TResult Function(PermanentDeleteMessage field0) permanentDelete, - required TResult Function() unschedule, - required TResult Function(UpdateProfileMessage field0) updateProfile, - required TResult Function(UpdateProfileSharingMessage field0) - updateProfileSharing, - required TResult Function(ShareProfileMessage field0) shareProfile, - required TResult Function() notifyAnyways, - required TResult Function(SetTranscriptBackgroundMessage field0) - setTranscriptBackground, - }) { - return unschedule(); - } - @override - @optionalTypeArgs - TResult? whenOrNull({ - TResult? Function(NormalMessage field0)? message, - TResult? Function(RenameMessage field0)? renameMessage, - TResult? Function(ChangeParticipantMessage field0)? changeParticipants, - TResult? Function(ReactMessage field0)? react, - TResult? Function()? delivered, - TResult? Function()? read, - TResult? Function(bool field0, TypingApp? field1)? typing, - TResult? Function(UnsendMessage field0)? unsend, - TResult? Function(EditMessage field0)? edit, - TResult? Function(IconChangeMessage field0)? iconChange, - TResult? Function(bool field0)? enableSmsActivation, - TResult? Function()? messageReadOnDevice, - TResult? Function(bool field0)? smsConfirmSent, - TResult? Function()? markUnread, - TResult? Function()? peerCacheInvalidate, - TResult? Function(UpdateExtensionMessage field0)? updateExtension, - TResult? Function(ErrorMessage field0)? error, - TResult? Function(MoveToRecycleBinMessage field0)? moveToRecycleBin, - TResult? Function(OperatedChat field0)? recoverChat, - TResult? Function(PermanentDeleteMessage field0)? permanentDelete, - TResult? Function()? unschedule, - TResult? Function(UpdateProfileMessage field0)? updateProfile, - TResult? Function(UpdateProfileSharingMessage field0)? updateProfileSharing, - TResult? Function(ShareProfileMessage field0)? shareProfile, - TResult? Function()? notifyAnyways, - TResult? Function(SetTranscriptBackgroundMessage field0)? - setTranscriptBackground, - }) { - return unschedule?.call(); - } - @override - @optionalTypeArgs - TResult maybeWhen({ - TResult Function(NormalMessage field0)? message, - TResult Function(RenameMessage field0)? renameMessage, - TResult Function(ChangeParticipantMessage field0)? changeParticipants, - TResult Function(ReactMessage field0)? react, - TResult Function()? delivered, - TResult Function()? read, - TResult Function(bool field0, TypingApp? field1)? typing, - TResult Function(UnsendMessage field0)? unsend, - TResult Function(EditMessage field0)? edit, - TResult Function(IconChangeMessage field0)? iconChange, - TResult Function(bool field0)? enableSmsActivation, - TResult Function()? messageReadOnDevice, - TResult Function(bool field0)? smsConfirmSent, - TResult Function()? markUnread, - TResult Function()? peerCacheInvalidate, - TResult Function(UpdateExtensionMessage field0)? updateExtension, - TResult Function(ErrorMessage field0)? error, - TResult Function(MoveToRecycleBinMessage field0)? moveToRecycleBin, - TResult Function(OperatedChat field0)? recoverChat, - TResult Function(PermanentDeleteMessage field0)? permanentDelete, - TResult Function()? unschedule, - TResult Function(UpdateProfileMessage field0)? updateProfile, - TResult Function(UpdateProfileSharingMessage field0)? updateProfileSharing, - TResult Function(ShareProfileMessage field0)? shareProfile, - TResult Function()? notifyAnyways, - TResult Function(SetTranscriptBackgroundMessage field0)? - setTranscriptBackground, - required TResult orElse(), - }) { - if (unschedule != null) { - return unschedule(); - } - return orElse(); - } +@override +bool operator ==(Object other) { + return identical(this, other) || (other.runtimeType == runtimeType&&other is LPSpecializationMetadata_LPPasswordsInviteMetadata&&(identical(other.groupName, groupName) || other.groupName == groupName)&&(identical(other.urlParameters, urlParameters) || other.urlParameters == urlParameters)); +} - @override - @optionalTypeArgs - TResult map({ - required TResult Function(Message_Message value) message, - required TResult Function(Message_RenameMessage value) renameMessage, - required TResult Function(Message_ChangeParticipants value) - changeParticipants, - required TResult Function(Message_React value) react, - required TResult Function(Message_Delivered value) delivered, - required TResult Function(Message_Read value) read, - required TResult Function(Message_Typing value) typing, - required TResult Function(Message_Unsend value) unsend, - required TResult Function(Message_Edit value) edit, - required TResult Function(Message_IconChange value) iconChange, - required TResult Function(Message_EnableSmsActivation value) - enableSmsActivation, - required TResult Function(Message_MessageReadOnDevice value) - messageReadOnDevice, - required TResult Function(Message_SmsConfirmSent value) smsConfirmSent, - required TResult Function(Message_MarkUnread value) markUnread, - required TResult Function(Message_PeerCacheInvalidate value) - peerCacheInvalidate, - required TResult Function(Message_UpdateExtension value) updateExtension, - required TResult Function(Message_Error value) error, - required TResult Function(Message_MoveToRecycleBin value) moveToRecycleBin, - required TResult Function(Message_RecoverChat value) recoverChat, - required TResult Function(Message_PermanentDelete value) permanentDelete, - required TResult Function(Message_Unschedule value) unschedule, - required TResult Function(Message_UpdateProfile value) updateProfile, - required TResult Function(Message_UpdateProfileSharing value) - updateProfileSharing, - required TResult Function(Message_ShareProfile value) shareProfile, - required TResult Function(Message_NotifyAnyways value) notifyAnyways, - required TResult Function(Message_SetTranscriptBackground value) - setTranscriptBackground, - }) { - return unschedule(this); - } - @override - @optionalTypeArgs - TResult? mapOrNull({ - TResult? Function(Message_Message value)? message, - TResult? Function(Message_RenameMessage value)? renameMessage, - TResult? Function(Message_ChangeParticipants value)? changeParticipants, - TResult? Function(Message_React value)? react, - TResult? Function(Message_Delivered value)? delivered, - TResult? Function(Message_Read value)? read, - TResult? Function(Message_Typing value)? typing, - TResult? Function(Message_Unsend value)? unsend, - TResult? Function(Message_Edit value)? edit, - TResult? Function(Message_IconChange value)? iconChange, - TResult? Function(Message_EnableSmsActivation value)? enableSmsActivation, - TResult? Function(Message_MessageReadOnDevice value)? messageReadOnDevice, - TResult? Function(Message_SmsConfirmSent value)? smsConfirmSent, - TResult? Function(Message_MarkUnread value)? markUnread, - TResult? Function(Message_PeerCacheInvalidate value)? peerCacheInvalidate, - TResult? Function(Message_UpdateExtension value)? updateExtension, - TResult? Function(Message_Error value)? error, - TResult? Function(Message_MoveToRecycleBin value)? moveToRecycleBin, - TResult? Function(Message_RecoverChat value)? recoverChat, - TResult? Function(Message_PermanentDelete value)? permanentDelete, - TResult? Function(Message_Unschedule value)? unschedule, - TResult? Function(Message_UpdateProfile value)? updateProfile, - TResult? Function(Message_UpdateProfileSharing value)? updateProfileSharing, - TResult? Function(Message_ShareProfile value)? shareProfile, - TResult? Function(Message_NotifyAnyways value)? notifyAnyways, - TResult? Function(Message_SetTranscriptBackground value)? - setTranscriptBackground, - }) { - return unschedule?.call(this); - } +@override +int get hashCode => Object.hash(runtimeType,groupName,urlParameters); - @override - @optionalTypeArgs - TResult maybeMap({ - TResult Function(Message_Message value)? message, - TResult Function(Message_RenameMessage value)? renameMessage, - TResult Function(Message_ChangeParticipants value)? changeParticipants, - TResult Function(Message_React value)? react, - TResult Function(Message_Delivered value)? delivered, - TResult Function(Message_Read value)? read, - TResult Function(Message_Typing value)? typing, - TResult Function(Message_Unsend value)? unsend, - TResult Function(Message_Edit value)? edit, - TResult Function(Message_IconChange value)? iconChange, - TResult Function(Message_EnableSmsActivation value)? enableSmsActivation, - TResult Function(Message_MessageReadOnDevice value)? messageReadOnDevice, - TResult Function(Message_SmsConfirmSent value)? smsConfirmSent, - TResult Function(Message_MarkUnread value)? markUnread, - TResult Function(Message_PeerCacheInvalidate value)? peerCacheInvalidate, - TResult Function(Message_UpdateExtension value)? updateExtension, - TResult Function(Message_Error value)? error, - TResult Function(Message_MoveToRecycleBin value)? moveToRecycleBin, - TResult Function(Message_RecoverChat value)? recoverChat, - TResult Function(Message_PermanentDelete value)? permanentDelete, - TResult Function(Message_Unschedule value)? unschedule, - TResult Function(Message_UpdateProfile value)? updateProfile, - TResult Function(Message_UpdateProfileSharing value)? updateProfileSharing, - TResult Function(Message_ShareProfile value)? shareProfile, - TResult Function(Message_NotifyAnyways value)? notifyAnyways, - TResult Function(Message_SetTranscriptBackground value)? - setTranscriptBackground, - required TResult orElse(), - }) { - if (unschedule != null) { - return unschedule(this); - } - return orElse(); - } +@override +String toString() { + return 'LPSpecializationMetadata.lpPasswordsInviteMetadata(groupName: $groupName, urlParameters: $urlParameters)'; } -abstract class Message_Unschedule extends Message { - const factory Message_Unschedule() = _$Message_UnscheduleImpl; - const Message_Unschedule._() : super._(); + } /// @nodoc -abstract class _$$Message_UpdateProfileImplCopyWith<$Res> { - factory _$$Message_UpdateProfileImplCopyWith( - _$Message_UpdateProfileImpl value, - $Res Function(_$Message_UpdateProfileImpl) then) = - __$$Message_UpdateProfileImplCopyWithImpl<$Res>; - @useResult - $Res call({UpdateProfileMessage field0}); -} +abstract mixin class $LPSpecializationMetadata_LPPasswordsInviteMetadataCopyWith<$Res> implements $LPSpecializationMetadataCopyWith<$Res> { + factory $LPSpecializationMetadata_LPPasswordsInviteMetadataCopyWith(LPSpecializationMetadata_LPPasswordsInviteMetadata value, $Res Function(LPSpecializationMetadata_LPPasswordsInviteMetadata) _then) = _$LPSpecializationMetadata_LPPasswordsInviteMetadataCopyWithImpl; +@override @useResult +$Res call({ + String groupName, String urlParameters +}); -/// @nodoc -class __$$Message_UpdateProfileImplCopyWithImpl<$Res> - extends _$MessageCopyWithImpl<$Res, _$Message_UpdateProfileImpl> - implements _$$Message_UpdateProfileImplCopyWith<$Res> { - __$$Message_UpdateProfileImplCopyWithImpl(_$Message_UpdateProfileImpl _value, - $Res Function(_$Message_UpdateProfileImpl) _then) - : super(_value, _then); - /// Create a copy of Message - /// with the given fields replaced by the non-null parameter values. - @pragma('vm:prefer-inline') - @override - $Res call({ - Object? field0 = null, - }) { - return _then(_$Message_UpdateProfileImpl( - null == field0 - ? _value.field0 - : field0 // ignore: cast_nullable_to_non_nullable - as UpdateProfileMessage, - )); - } -} + +} /// @nodoc +class _$LPSpecializationMetadata_LPPasswordsInviteMetadataCopyWithImpl<$Res> + implements $LPSpecializationMetadata_LPPasswordsInviteMetadataCopyWith<$Res> { + _$LPSpecializationMetadata_LPPasswordsInviteMetadataCopyWithImpl(this._self, this._then); -class _$Message_UpdateProfileImpl extends Message_UpdateProfile { - const _$Message_UpdateProfileImpl(this.field0) : super._(); + final LPSpecializationMetadata_LPPasswordsInviteMetadata _self; + final $Res Function(LPSpecializationMetadata_LPPasswordsInviteMetadata) _then; - @override - final UpdateProfileMessage field0; +/// Create a copy of LPSpecializationMetadata +/// with the given fields replaced by the non-null parameter values. +@override @pragma('vm:prefer-inline') $Res call({Object? groupName = null,Object? urlParameters = null,}) { + return _then(LPSpecializationMetadata_LPPasswordsInviteMetadata( +groupName: null == groupName ? _self.groupName : groupName // ignore: cast_nullable_to_non_nullable +as String,urlParameters: null == urlParameters ? _self.urlParameters : urlParameters // ignore: cast_nullable_to_non_nullable +as String, + )); +} - @override - String toString() { - return 'Message.updateProfile(field0: $field0)'; - } - @override - bool operator ==(Object other) { - return identical(this, other) || - (other.runtimeType == runtimeType && - other is _$Message_UpdateProfileImpl && - (identical(other.field0, field0) || other.field0 == field0)); - } +} - @override - int get hashCode => Object.hash(runtimeType, field0); - - /// Create a copy of Message - /// with the given fields replaced by the non-null parameter values. - @JsonKey(includeFromJson: false, includeToJson: false) - @override - @pragma('vm:prefer-inline') - _$$Message_UpdateProfileImplCopyWith<_$Message_UpdateProfileImpl> - get copyWith => __$$Message_UpdateProfileImplCopyWithImpl< - _$Message_UpdateProfileImpl>(this, _$identity); - - @override - @optionalTypeArgs - TResult when({ - required TResult Function(NormalMessage field0) message, - required TResult Function(RenameMessage field0) renameMessage, - required TResult Function(ChangeParticipantMessage field0) - changeParticipants, - required TResult Function(ReactMessage field0) react, - required TResult Function() delivered, - required TResult Function() read, - required TResult Function(bool field0, TypingApp? field1) typing, - required TResult Function(UnsendMessage field0) unsend, - required TResult Function(EditMessage field0) edit, - required TResult Function(IconChangeMessage field0) iconChange, - required TResult Function(bool field0) enableSmsActivation, - required TResult Function() messageReadOnDevice, - required TResult Function(bool field0) smsConfirmSent, - required TResult Function() markUnread, - required TResult Function() peerCacheInvalidate, - required TResult Function(UpdateExtensionMessage field0) updateExtension, - required TResult Function(ErrorMessage field0) error, - required TResult Function(MoveToRecycleBinMessage field0) moveToRecycleBin, - required TResult Function(OperatedChat field0) recoverChat, - required TResult Function(PermanentDeleteMessage field0) permanentDelete, - required TResult Function() unschedule, - required TResult Function(UpdateProfileMessage field0) updateProfile, - required TResult Function(UpdateProfileSharingMessage field0) - updateProfileSharing, - required TResult Function(ShareProfileMessage field0) shareProfile, - required TResult Function() notifyAnyways, - required TResult Function(SetTranscriptBackgroundMessage field0) - setTranscriptBackground, - }) { - return updateProfile(field0); - } +/// @nodoc +mixin _$Message { - @override - @optionalTypeArgs - TResult? whenOrNull({ - TResult? Function(NormalMessage field0)? message, - TResult? Function(RenameMessage field0)? renameMessage, - TResult? Function(ChangeParticipantMessage field0)? changeParticipants, - TResult? Function(ReactMessage field0)? react, - TResult? Function()? delivered, - TResult? Function()? read, - TResult? Function(bool field0, TypingApp? field1)? typing, - TResult? Function(UnsendMessage field0)? unsend, - TResult? Function(EditMessage field0)? edit, - TResult? Function(IconChangeMessage field0)? iconChange, - TResult? Function(bool field0)? enableSmsActivation, - TResult? Function()? messageReadOnDevice, - TResult? Function(bool field0)? smsConfirmSent, - TResult? Function()? markUnread, - TResult? Function()? peerCacheInvalidate, - TResult? Function(UpdateExtensionMessage field0)? updateExtension, - TResult? Function(ErrorMessage field0)? error, - TResult? Function(MoveToRecycleBinMessage field0)? moveToRecycleBin, - TResult? Function(OperatedChat field0)? recoverChat, - TResult? Function(PermanentDeleteMessage field0)? permanentDelete, - TResult? Function()? unschedule, - TResult? Function(UpdateProfileMessage field0)? updateProfile, - TResult? Function(UpdateProfileSharingMessage field0)? updateProfileSharing, - TResult? Function(ShareProfileMessage field0)? shareProfile, - TResult? Function()? notifyAnyways, - TResult? Function(SetTranscriptBackgroundMessage field0)? - setTranscriptBackground, - }) { - return updateProfile?.call(field0); - } - @override - @optionalTypeArgs - TResult maybeWhen({ - TResult Function(NormalMessage field0)? message, - TResult Function(RenameMessage field0)? renameMessage, - TResult Function(ChangeParticipantMessage field0)? changeParticipants, - TResult Function(ReactMessage field0)? react, - TResult Function()? delivered, - TResult Function()? read, - TResult Function(bool field0, TypingApp? field1)? typing, - TResult Function(UnsendMessage field0)? unsend, - TResult Function(EditMessage field0)? edit, - TResult Function(IconChangeMessage field0)? iconChange, - TResult Function(bool field0)? enableSmsActivation, - TResult Function()? messageReadOnDevice, - TResult Function(bool field0)? smsConfirmSent, - TResult Function()? markUnread, - TResult Function()? peerCacheInvalidate, - TResult Function(UpdateExtensionMessage field0)? updateExtension, - TResult Function(ErrorMessage field0)? error, - TResult Function(MoveToRecycleBinMessage field0)? moveToRecycleBin, - TResult Function(OperatedChat field0)? recoverChat, - TResult Function(PermanentDeleteMessage field0)? permanentDelete, - TResult Function()? unschedule, - TResult Function(UpdateProfileMessage field0)? updateProfile, - TResult Function(UpdateProfileSharingMessage field0)? updateProfileSharing, - TResult Function(ShareProfileMessage field0)? shareProfile, - TResult Function()? notifyAnyways, - TResult Function(SetTranscriptBackgroundMessage field0)? - setTranscriptBackground, - required TResult orElse(), - }) { - if (updateProfile != null) { - return updateProfile(field0); - } - return orElse(); - } - @override - @optionalTypeArgs - TResult map({ - required TResult Function(Message_Message value) message, - required TResult Function(Message_RenameMessage value) renameMessage, - required TResult Function(Message_ChangeParticipants value) - changeParticipants, - required TResult Function(Message_React value) react, - required TResult Function(Message_Delivered value) delivered, - required TResult Function(Message_Read value) read, - required TResult Function(Message_Typing value) typing, - required TResult Function(Message_Unsend value) unsend, - required TResult Function(Message_Edit value) edit, - required TResult Function(Message_IconChange value) iconChange, - required TResult Function(Message_EnableSmsActivation value) - enableSmsActivation, - required TResult Function(Message_MessageReadOnDevice value) - messageReadOnDevice, - required TResult Function(Message_SmsConfirmSent value) smsConfirmSent, - required TResult Function(Message_MarkUnread value) markUnread, - required TResult Function(Message_PeerCacheInvalidate value) - peerCacheInvalidate, - required TResult Function(Message_UpdateExtension value) updateExtension, - required TResult Function(Message_Error value) error, - required TResult Function(Message_MoveToRecycleBin value) moveToRecycleBin, - required TResult Function(Message_RecoverChat value) recoverChat, - required TResult Function(Message_PermanentDelete value) permanentDelete, - required TResult Function(Message_Unschedule value) unschedule, - required TResult Function(Message_UpdateProfile value) updateProfile, - required TResult Function(Message_UpdateProfileSharing value) - updateProfileSharing, - required TResult Function(Message_ShareProfile value) shareProfile, - required TResult Function(Message_NotifyAnyways value) notifyAnyways, - required TResult Function(Message_SetTranscriptBackground value) - setTranscriptBackground, - }) { - return updateProfile(this); - } - @override - @optionalTypeArgs - TResult? mapOrNull({ - TResult? Function(Message_Message value)? message, - TResult? Function(Message_RenameMessage value)? renameMessage, - TResult? Function(Message_ChangeParticipants value)? changeParticipants, - TResult? Function(Message_React value)? react, - TResult? Function(Message_Delivered value)? delivered, - TResult? Function(Message_Read value)? read, - TResult? Function(Message_Typing value)? typing, - TResult? Function(Message_Unsend value)? unsend, - TResult? Function(Message_Edit value)? edit, - TResult? Function(Message_IconChange value)? iconChange, - TResult? Function(Message_EnableSmsActivation value)? enableSmsActivation, - TResult? Function(Message_MessageReadOnDevice value)? messageReadOnDevice, - TResult? Function(Message_SmsConfirmSent value)? smsConfirmSent, - TResult? Function(Message_MarkUnread value)? markUnread, - TResult? Function(Message_PeerCacheInvalidate value)? peerCacheInvalidate, - TResult? Function(Message_UpdateExtension value)? updateExtension, - TResult? Function(Message_Error value)? error, - TResult? Function(Message_MoveToRecycleBin value)? moveToRecycleBin, - TResult? Function(Message_RecoverChat value)? recoverChat, - TResult? Function(Message_PermanentDelete value)? permanentDelete, - TResult? Function(Message_Unschedule value)? unschedule, - TResult? Function(Message_UpdateProfile value)? updateProfile, - TResult? Function(Message_UpdateProfileSharing value)? updateProfileSharing, - TResult? Function(Message_ShareProfile value)? shareProfile, - TResult? Function(Message_NotifyAnyways value)? notifyAnyways, - TResult? Function(Message_SetTranscriptBackground value)? - setTranscriptBackground, - }) { - return updateProfile?.call(this); - } - @override - @optionalTypeArgs - TResult maybeMap({ - TResult Function(Message_Message value)? message, - TResult Function(Message_RenameMessage value)? renameMessage, - TResult Function(Message_ChangeParticipants value)? changeParticipants, - TResult Function(Message_React value)? react, - TResult Function(Message_Delivered value)? delivered, - TResult Function(Message_Read value)? read, - TResult Function(Message_Typing value)? typing, - TResult Function(Message_Unsend value)? unsend, - TResult Function(Message_Edit value)? edit, - TResult Function(Message_IconChange value)? iconChange, - TResult Function(Message_EnableSmsActivation value)? enableSmsActivation, - TResult Function(Message_MessageReadOnDevice value)? messageReadOnDevice, - TResult Function(Message_SmsConfirmSent value)? smsConfirmSent, - TResult Function(Message_MarkUnread value)? markUnread, - TResult Function(Message_PeerCacheInvalidate value)? peerCacheInvalidate, - TResult Function(Message_UpdateExtension value)? updateExtension, - TResult Function(Message_Error value)? error, - TResult Function(Message_MoveToRecycleBin value)? moveToRecycleBin, - TResult Function(Message_RecoverChat value)? recoverChat, - TResult Function(Message_PermanentDelete value)? permanentDelete, - TResult Function(Message_Unschedule value)? unschedule, - TResult Function(Message_UpdateProfile value)? updateProfile, - TResult Function(Message_UpdateProfileSharing value)? updateProfileSharing, - TResult Function(Message_ShareProfile value)? shareProfile, - TResult Function(Message_NotifyAnyways value)? notifyAnyways, - TResult Function(Message_SetTranscriptBackground value)? - setTranscriptBackground, - required TResult orElse(), - }) { - if (updateProfile != null) { - return updateProfile(this); - } - return orElse(); - } +@override +bool operator ==(Object other) { + return identical(this, other) || (other.runtimeType == runtimeType&&other is Message); +} + + +@override +int get hashCode => runtimeType.hashCode; + +@override +String toString() { + return 'Message()'; +} + + +} + +/// @nodoc +class $MessageCopyWith<$Res> { +$MessageCopyWith(Message _, $Res Function(Message) __); +} + + +/// Adds pattern-matching-related methods to [Message]. +extension MessagePatterns on Message { +/// A variant of `map` that fallback to returning `orElse`. +/// +/// It is equivalent to doing: +/// ```dart +/// switch (sealedClass) { +/// case final Subclass value: +/// return ...; +/// case _: +/// return orElse(); +/// } +/// ``` + +@optionalTypeArgs TResult maybeMap({TResult Function( Message_Message value)? message,TResult Function( Message_RenameMessage value)? renameMessage,TResult Function( Message_ChangeParticipants value)? changeParticipants,TResult Function( Message_React value)? react,TResult Function( Message_Delivered value)? delivered,TResult Function( Message_Read value)? read,TResult Function( Message_Typing value)? typing,TResult Function( Message_Unsend value)? unsend,TResult Function( Message_Edit value)? edit,TResult Function( Message_IconChange value)? iconChange,TResult Function( Message_EnableSmsActivation value)? enableSmsActivation,TResult Function( Message_MessageReadOnDevice value)? messageReadOnDevice,TResult Function( Message_SmsConfirmSent value)? smsConfirmSent,TResult Function( Message_MarkUnread value)? markUnread,TResult Function( Message_PeerCacheInvalidate value)? peerCacheInvalidate,TResult Function( Message_UpdateExtension value)? updateExtension,TResult Function( Message_Error value)? error,TResult Function( Message_MoveToRecycleBin value)? moveToRecycleBin,TResult Function( Message_RecoverChat value)? recoverChat,TResult Function( Message_PermanentDelete value)? permanentDelete,TResult Function( Message_Unschedule value)? unschedule,TResult Function( Message_UpdateProfile value)? updateProfile,TResult Function( Message_UpdateProfileSharing value)? updateProfileSharing,TResult Function( Message_ShareProfile value)? shareProfile,TResult Function( Message_NotifyAnyways value)? notifyAnyways,TResult Function( Message_SetTranscriptBackground value)? setTranscriptBackground,required TResult orElse(),}){ +final _that = this; +switch (_that) { +case Message_Message() when message != null: +return message(_that);case Message_RenameMessage() when renameMessage != null: +return renameMessage(_that);case Message_ChangeParticipants() when changeParticipants != null: +return changeParticipants(_that);case Message_React() when react != null: +return react(_that);case Message_Delivered() when delivered != null: +return delivered(_that);case Message_Read() when read != null: +return read(_that);case Message_Typing() when typing != null: +return typing(_that);case Message_Unsend() when unsend != null: +return unsend(_that);case Message_Edit() when edit != null: +return edit(_that);case Message_IconChange() when iconChange != null: +return iconChange(_that);case Message_EnableSmsActivation() when enableSmsActivation != null: +return enableSmsActivation(_that);case Message_MessageReadOnDevice() when messageReadOnDevice != null: +return messageReadOnDevice(_that);case Message_SmsConfirmSent() when smsConfirmSent != null: +return smsConfirmSent(_that);case Message_MarkUnread() when markUnread != null: +return markUnread(_that);case Message_PeerCacheInvalidate() when peerCacheInvalidate != null: +return peerCacheInvalidate(_that);case Message_UpdateExtension() when updateExtension != null: +return updateExtension(_that);case Message_Error() when error != null: +return error(_that);case Message_MoveToRecycleBin() when moveToRecycleBin != null: +return moveToRecycleBin(_that);case Message_RecoverChat() when recoverChat != null: +return recoverChat(_that);case Message_PermanentDelete() when permanentDelete != null: +return permanentDelete(_that);case Message_Unschedule() when unschedule != null: +return unschedule(_that);case Message_UpdateProfile() when updateProfile != null: +return updateProfile(_that);case Message_UpdateProfileSharing() when updateProfileSharing != null: +return updateProfileSharing(_that);case Message_ShareProfile() when shareProfile != null: +return shareProfile(_that);case Message_NotifyAnyways() when notifyAnyways != null: +return notifyAnyways(_that);case Message_SetTranscriptBackground() when setTranscriptBackground != null: +return setTranscriptBackground(_that);case _: + return orElse(); + +} +} +/// A `switch`-like method, using callbacks. +/// +/// Callbacks receives the raw object, upcasted. +/// It is equivalent to doing: +/// ```dart +/// switch (sealedClass) { +/// case final Subclass value: +/// return ...; +/// case final Subclass2 value: +/// return ...; +/// } +/// ``` + +@optionalTypeArgs TResult map({required TResult Function( Message_Message value) message,required TResult Function( Message_RenameMessage value) renameMessage,required TResult Function( Message_ChangeParticipants value) changeParticipants,required TResult Function( Message_React value) react,required TResult Function( Message_Delivered value) delivered,required TResult Function( Message_Read value) read,required TResult Function( Message_Typing value) typing,required TResult Function( Message_Unsend value) unsend,required TResult Function( Message_Edit value) edit,required TResult Function( Message_IconChange value) iconChange,required TResult Function( Message_EnableSmsActivation value) enableSmsActivation,required TResult Function( Message_MessageReadOnDevice value) messageReadOnDevice,required TResult Function( Message_SmsConfirmSent value) smsConfirmSent,required TResult Function( Message_MarkUnread value) markUnread,required TResult Function( Message_PeerCacheInvalidate value) peerCacheInvalidate,required TResult Function( Message_UpdateExtension value) updateExtension,required TResult Function( Message_Error value) error,required TResult Function( Message_MoveToRecycleBin value) moveToRecycleBin,required TResult Function( Message_RecoverChat value) recoverChat,required TResult Function( Message_PermanentDelete value) permanentDelete,required TResult Function( Message_Unschedule value) unschedule,required TResult Function( Message_UpdateProfile value) updateProfile,required TResult Function( Message_UpdateProfileSharing value) updateProfileSharing,required TResult Function( Message_ShareProfile value) shareProfile,required TResult Function( Message_NotifyAnyways value) notifyAnyways,required TResult Function( Message_SetTranscriptBackground value) setTranscriptBackground,}){ +final _that = this; +switch (_that) { +case Message_Message(): +return message(_that);case Message_RenameMessage(): +return renameMessage(_that);case Message_ChangeParticipants(): +return changeParticipants(_that);case Message_React(): +return react(_that);case Message_Delivered(): +return delivered(_that);case Message_Read(): +return read(_that);case Message_Typing(): +return typing(_that);case Message_Unsend(): +return unsend(_that);case Message_Edit(): +return edit(_that);case Message_IconChange(): +return iconChange(_that);case Message_EnableSmsActivation(): +return enableSmsActivation(_that);case Message_MessageReadOnDevice(): +return messageReadOnDevice(_that);case Message_SmsConfirmSent(): +return smsConfirmSent(_that);case Message_MarkUnread(): +return markUnread(_that);case Message_PeerCacheInvalidate(): +return peerCacheInvalidate(_that);case Message_UpdateExtension(): +return updateExtension(_that);case Message_Error(): +return error(_that);case Message_MoveToRecycleBin(): +return moveToRecycleBin(_that);case Message_RecoverChat(): +return recoverChat(_that);case Message_PermanentDelete(): +return permanentDelete(_that);case Message_Unschedule(): +return unschedule(_that);case Message_UpdateProfile(): +return updateProfile(_that);case Message_UpdateProfileSharing(): +return updateProfileSharing(_that);case Message_ShareProfile(): +return shareProfile(_that);case Message_NotifyAnyways(): +return notifyAnyways(_that);case Message_SetTranscriptBackground(): +return setTranscriptBackground(_that);} +} +/// A variant of `map` that fallback to returning `null`. +/// +/// It is equivalent to doing: +/// ```dart +/// switch (sealedClass) { +/// case final Subclass value: +/// return ...; +/// case _: +/// return null; +/// } +/// ``` + +@optionalTypeArgs TResult? mapOrNull({TResult? Function( Message_Message value)? message,TResult? Function( Message_RenameMessage value)? renameMessage,TResult? Function( Message_ChangeParticipants value)? changeParticipants,TResult? Function( Message_React value)? react,TResult? Function( Message_Delivered value)? delivered,TResult? Function( Message_Read value)? read,TResult? Function( Message_Typing value)? typing,TResult? Function( Message_Unsend value)? unsend,TResult? Function( Message_Edit value)? edit,TResult? Function( Message_IconChange value)? iconChange,TResult? Function( Message_EnableSmsActivation value)? enableSmsActivation,TResult? Function( Message_MessageReadOnDevice value)? messageReadOnDevice,TResult? Function( Message_SmsConfirmSent value)? smsConfirmSent,TResult? Function( Message_MarkUnread value)? markUnread,TResult? Function( Message_PeerCacheInvalidate value)? peerCacheInvalidate,TResult? Function( Message_UpdateExtension value)? updateExtension,TResult? Function( Message_Error value)? error,TResult? Function( Message_MoveToRecycleBin value)? moveToRecycleBin,TResult? Function( Message_RecoverChat value)? recoverChat,TResult? Function( Message_PermanentDelete value)? permanentDelete,TResult? Function( Message_Unschedule value)? unschedule,TResult? Function( Message_UpdateProfile value)? updateProfile,TResult? Function( Message_UpdateProfileSharing value)? updateProfileSharing,TResult? Function( Message_ShareProfile value)? shareProfile,TResult? Function( Message_NotifyAnyways value)? notifyAnyways,TResult? Function( Message_SetTranscriptBackground value)? setTranscriptBackground,}){ +final _that = this; +switch (_that) { +case Message_Message() when message != null: +return message(_that);case Message_RenameMessage() when renameMessage != null: +return renameMessage(_that);case Message_ChangeParticipants() when changeParticipants != null: +return changeParticipants(_that);case Message_React() when react != null: +return react(_that);case Message_Delivered() when delivered != null: +return delivered(_that);case Message_Read() when read != null: +return read(_that);case Message_Typing() when typing != null: +return typing(_that);case Message_Unsend() when unsend != null: +return unsend(_that);case Message_Edit() when edit != null: +return edit(_that);case Message_IconChange() when iconChange != null: +return iconChange(_that);case Message_EnableSmsActivation() when enableSmsActivation != null: +return enableSmsActivation(_that);case Message_MessageReadOnDevice() when messageReadOnDevice != null: +return messageReadOnDevice(_that);case Message_SmsConfirmSent() when smsConfirmSent != null: +return smsConfirmSent(_that);case Message_MarkUnread() when markUnread != null: +return markUnread(_that);case Message_PeerCacheInvalidate() when peerCacheInvalidate != null: +return peerCacheInvalidate(_that);case Message_UpdateExtension() when updateExtension != null: +return updateExtension(_that);case Message_Error() when error != null: +return error(_that);case Message_MoveToRecycleBin() when moveToRecycleBin != null: +return moveToRecycleBin(_that);case Message_RecoverChat() when recoverChat != null: +return recoverChat(_that);case Message_PermanentDelete() when permanentDelete != null: +return permanentDelete(_that);case Message_Unschedule() when unschedule != null: +return unschedule(_that);case Message_UpdateProfile() when updateProfile != null: +return updateProfile(_that);case Message_UpdateProfileSharing() when updateProfileSharing != null: +return updateProfileSharing(_that);case Message_ShareProfile() when shareProfile != null: +return shareProfile(_that);case Message_NotifyAnyways() when notifyAnyways != null: +return notifyAnyways(_that);case Message_SetTranscriptBackground() when setTranscriptBackground != null: +return setTranscriptBackground(_that);case _: + return null; + +} +} +/// A variant of `when` that fallback to an `orElse` callback. +/// +/// It is equivalent to doing: +/// ```dart +/// switch (sealedClass) { +/// case Subclass(:final field): +/// return ...; +/// case _: +/// return orElse(); +/// } +/// ``` + +@optionalTypeArgs TResult maybeWhen({TResult Function( NormalMessage field0)? message,TResult Function( RenameMessage field0)? renameMessage,TResult Function( ChangeParticipantMessage field0)? changeParticipants,TResult Function( ReactMessage field0)? react,TResult Function()? delivered,TResult Function()? read,TResult Function( bool field0, TypingApp? field1)? typing,TResult Function( UnsendMessage field0)? unsend,TResult Function( EditMessage field0)? edit,TResult Function( IconChangeMessage field0)? iconChange,TResult Function( bool field0)? enableSmsActivation,TResult Function()? messageReadOnDevice,TResult Function( bool field0)? smsConfirmSent,TResult Function()? markUnread,TResult Function()? peerCacheInvalidate,TResult Function( UpdateExtensionMessage field0)? updateExtension,TResult Function( ErrorMessage field0)? error,TResult Function( MoveToRecycleBinMessage field0)? moveToRecycleBin,TResult Function( OperatedChat field0)? recoverChat,TResult Function( PermanentDeleteMessage field0)? permanentDelete,TResult Function()? unschedule,TResult Function( UpdateProfileMessage field0)? updateProfile,TResult Function( UpdateProfileSharingMessage field0)? updateProfileSharing,TResult Function( ShareProfileMessage field0)? shareProfile,TResult Function()? notifyAnyways,TResult Function( SetTranscriptBackgroundMessage field0)? setTranscriptBackground,required TResult orElse(),}) {final _that = this; +switch (_that) { +case Message_Message() when message != null: +return message(_that.field0);case Message_RenameMessage() when renameMessage != null: +return renameMessage(_that.field0);case Message_ChangeParticipants() when changeParticipants != null: +return changeParticipants(_that.field0);case Message_React() when react != null: +return react(_that.field0);case Message_Delivered() when delivered != null: +return delivered();case Message_Read() when read != null: +return read();case Message_Typing() when typing != null: +return typing(_that.field0,_that.field1);case Message_Unsend() when unsend != null: +return unsend(_that.field0);case Message_Edit() when edit != null: +return edit(_that.field0);case Message_IconChange() when iconChange != null: +return iconChange(_that.field0);case Message_EnableSmsActivation() when enableSmsActivation != null: +return enableSmsActivation(_that.field0);case Message_MessageReadOnDevice() when messageReadOnDevice != null: +return messageReadOnDevice();case Message_SmsConfirmSent() when smsConfirmSent != null: +return smsConfirmSent(_that.field0);case Message_MarkUnread() when markUnread != null: +return markUnread();case Message_PeerCacheInvalidate() when peerCacheInvalidate != null: +return peerCacheInvalidate();case Message_UpdateExtension() when updateExtension != null: +return updateExtension(_that.field0);case Message_Error() when error != null: +return error(_that.field0);case Message_MoveToRecycleBin() when moveToRecycleBin != null: +return moveToRecycleBin(_that.field0);case Message_RecoverChat() when recoverChat != null: +return recoverChat(_that.field0);case Message_PermanentDelete() when permanentDelete != null: +return permanentDelete(_that.field0);case Message_Unschedule() when unschedule != null: +return unschedule();case Message_UpdateProfile() when updateProfile != null: +return updateProfile(_that.field0);case Message_UpdateProfileSharing() when updateProfileSharing != null: +return updateProfileSharing(_that.field0);case Message_ShareProfile() when shareProfile != null: +return shareProfile(_that.field0);case Message_NotifyAnyways() when notifyAnyways != null: +return notifyAnyways();case Message_SetTranscriptBackground() when setTranscriptBackground != null: +return setTranscriptBackground(_that.field0);case _: + return orElse(); + +} +} +/// A `switch`-like method, using callbacks. +/// +/// As opposed to `map`, this offers destructuring. +/// It is equivalent to doing: +/// ```dart +/// switch (sealedClass) { +/// case Subclass(:final field): +/// return ...; +/// case Subclass2(:final field2): +/// return ...; +/// } +/// ``` + +@optionalTypeArgs TResult when({required TResult Function( NormalMessage field0) message,required TResult Function( RenameMessage field0) renameMessage,required TResult Function( ChangeParticipantMessage field0) changeParticipants,required TResult Function( ReactMessage field0) react,required TResult Function() delivered,required TResult Function() read,required TResult Function( bool field0, TypingApp? field1) typing,required TResult Function( UnsendMessage field0) unsend,required TResult Function( EditMessage field0) edit,required TResult Function( IconChangeMessage field0) iconChange,required TResult Function( bool field0) enableSmsActivation,required TResult Function() messageReadOnDevice,required TResult Function( bool field0) smsConfirmSent,required TResult Function() markUnread,required TResult Function() peerCacheInvalidate,required TResult Function( UpdateExtensionMessage field0) updateExtension,required TResult Function( ErrorMessage field0) error,required TResult Function( MoveToRecycleBinMessage field0) moveToRecycleBin,required TResult Function( OperatedChat field0) recoverChat,required TResult Function( PermanentDeleteMessage field0) permanentDelete,required TResult Function() unschedule,required TResult Function( UpdateProfileMessage field0) updateProfile,required TResult Function( UpdateProfileSharingMessage field0) updateProfileSharing,required TResult Function( ShareProfileMessage field0) shareProfile,required TResult Function() notifyAnyways,required TResult Function( SetTranscriptBackgroundMessage field0) setTranscriptBackground,}) {final _that = this; +switch (_that) { +case Message_Message(): +return message(_that.field0);case Message_RenameMessage(): +return renameMessage(_that.field0);case Message_ChangeParticipants(): +return changeParticipants(_that.field0);case Message_React(): +return react(_that.field0);case Message_Delivered(): +return delivered();case Message_Read(): +return read();case Message_Typing(): +return typing(_that.field0,_that.field1);case Message_Unsend(): +return unsend(_that.field0);case Message_Edit(): +return edit(_that.field0);case Message_IconChange(): +return iconChange(_that.field0);case Message_EnableSmsActivation(): +return enableSmsActivation(_that.field0);case Message_MessageReadOnDevice(): +return messageReadOnDevice();case Message_SmsConfirmSent(): +return smsConfirmSent(_that.field0);case Message_MarkUnread(): +return markUnread();case Message_PeerCacheInvalidate(): +return peerCacheInvalidate();case Message_UpdateExtension(): +return updateExtension(_that.field0);case Message_Error(): +return error(_that.field0);case Message_MoveToRecycleBin(): +return moveToRecycleBin(_that.field0);case Message_RecoverChat(): +return recoverChat(_that.field0);case Message_PermanentDelete(): +return permanentDelete(_that.field0);case Message_Unschedule(): +return unschedule();case Message_UpdateProfile(): +return updateProfile(_that.field0);case Message_UpdateProfileSharing(): +return updateProfileSharing(_that.field0);case Message_ShareProfile(): +return shareProfile(_that.field0);case Message_NotifyAnyways(): +return notifyAnyways();case Message_SetTranscriptBackground(): +return setTranscriptBackground(_that.field0);} +} +/// A variant of `when` that fallback to returning `null` +/// +/// It is equivalent to doing: +/// ```dart +/// switch (sealedClass) { +/// case Subclass(:final field): +/// return ...; +/// case _: +/// return null; +/// } +/// ``` + +@optionalTypeArgs TResult? whenOrNull({TResult? Function( NormalMessage field0)? message,TResult? Function( RenameMessage field0)? renameMessage,TResult? Function( ChangeParticipantMessage field0)? changeParticipants,TResult? Function( ReactMessage field0)? react,TResult? Function()? delivered,TResult? Function()? read,TResult? Function( bool field0, TypingApp? field1)? typing,TResult? Function( UnsendMessage field0)? unsend,TResult? Function( EditMessage field0)? edit,TResult? Function( IconChangeMessage field0)? iconChange,TResult? Function( bool field0)? enableSmsActivation,TResult? Function()? messageReadOnDevice,TResult? Function( bool field0)? smsConfirmSent,TResult? Function()? markUnread,TResult? Function()? peerCacheInvalidate,TResult? Function( UpdateExtensionMessage field0)? updateExtension,TResult? Function( ErrorMessage field0)? error,TResult? Function( MoveToRecycleBinMessage field0)? moveToRecycleBin,TResult? Function( OperatedChat field0)? recoverChat,TResult? Function( PermanentDeleteMessage field0)? permanentDelete,TResult? Function()? unschedule,TResult? Function( UpdateProfileMessage field0)? updateProfile,TResult? Function( UpdateProfileSharingMessage field0)? updateProfileSharing,TResult? Function( ShareProfileMessage field0)? shareProfile,TResult? Function()? notifyAnyways,TResult? Function( SetTranscriptBackgroundMessage field0)? setTranscriptBackground,}) {final _that = this; +switch (_that) { +case Message_Message() when message != null: +return message(_that.field0);case Message_RenameMessage() when renameMessage != null: +return renameMessage(_that.field0);case Message_ChangeParticipants() when changeParticipants != null: +return changeParticipants(_that.field0);case Message_React() when react != null: +return react(_that.field0);case Message_Delivered() when delivered != null: +return delivered();case Message_Read() when read != null: +return read();case Message_Typing() when typing != null: +return typing(_that.field0,_that.field1);case Message_Unsend() when unsend != null: +return unsend(_that.field0);case Message_Edit() when edit != null: +return edit(_that.field0);case Message_IconChange() when iconChange != null: +return iconChange(_that.field0);case Message_EnableSmsActivation() when enableSmsActivation != null: +return enableSmsActivation(_that.field0);case Message_MessageReadOnDevice() when messageReadOnDevice != null: +return messageReadOnDevice();case Message_SmsConfirmSent() when smsConfirmSent != null: +return smsConfirmSent(_that.field0);case Message_MarkUnread() when markUnread != null: +return markUnread();case Message_PeerCacheInvalidate() when peerCacheInvalidate != null: +return peerCacheInvalidate();case Message_UpdateExtension() when updateExtension != null: +return updateExtension(_that.field0);case Message_Error() when error != null: +return error(_that.field0);case Message_MoveToRecycleBin() when moveToRecycleBin != null: +return moveToRecycleBin(_that.field0);case Message_RecoverChat() when recoverChat != null: +return recoverChat(_that.field0);case Message_PermanentDelete() when permanentDelete != null: +return permanentDelete(_that.field0);case Message_Unschedule() when unschedule != null: +return unschedule();case Message_UpdateProfile() when updateProfile != null: +return updateProfile(_that.field0);case Message_UpdateProfileSharing() when updateProfileSharing != null: +return updateProfileSharing(_that.field0);case Message_ShareProfile() when shareProfile != null: +return shareProfile(_that.field0);case Message_NotifyAnyways() when notifyAnyways != null: +return notifyAnyways();case Message_SetTranscriptBackground() when setTranscriptBackground != null: +return setTranscriptBackground(_that.field0);case _: + return null; + +} } -abstract class Message_UpdateProfile extends Message { - const factory Message_UpdateProfile(final UpdateProfileMessage field0) = - _$Message_UpdateProfileImpl; - const Message_UpdateProfile._() : super._(); - - UpdateProfileMessage get field0; - - /// Create a copy of Message - /// with the given fields replaced by the non-null parameter values. - @JsonKey(includeFromJson: false, includeToJson: false) - _$$Message_UpdateProfileImplCopyWith<_$Message_UpdateProfileImpl> - get copyWith => throw _privateConstructorUsedError; -} - -/// @nodoc -abstract class _$$Message_UpdateProfileSharingImplCopyWith<$Res> { - factory _$$Message_UpdateProfileSharingImplCopyWith( - _$Message_UpdateProfileSharingImpl value, - $Res Function(_$Message_UpdateProfileSharingImpl) then) = - __$$Message_UpdateProfileSharingImplCopyWithImpl<$Res>; - @useResult - $Res call({UpdateProfileSharingMessage field0}); -} - -/// @nodoc -class __$$Message_UpdateProfileSharingImplCopyWithImpl<$Res> - extends _$MessageCopyWithImpl<$Res, _$Message_UpdateProfileSharingImpl> - implements _$$Message_UpdateProfileSharingImplCopyWith<$Res> { - __$$Message_UpdateProfileSharingImplCopyWithImpl( - _$Message_UpdateProfileSharingImpl _value, - $Res Function(_$Message_UpdateProfileSharingImpl) _then) - : super(_value, _then); - - /// Create a copy of Message - /// with the given fields replaced by the non-null parameter values. - @pragma('vm:prefer-inline') - @override - $Res call({ - Object? field0 = null, - }) { - return _then(_$Message_UpdateProfileSharingImpl( - null == field0 - ? _value.field0 - : field0 // ignore: cast_nullable_to_non_nullable - as UpdateProfileSharingMessage, - )); - } } /// @nodoc -class _$Message_UpdateProfileSharingImpl extends Message_UpdateProfileSharing { - const _$Message_UpdateProfileSharingImpl(this.field0) : super._(); - - @override - final UpdateProfileSharingMessage field0; - - @override - String toString() { - return 'Message.updateProfileSharing(field0: $field0)'; - } - - @override - bool operator ==(Object other) { - return identical(this, other) || - (other.runtimeType == runtimeType && - other is _$Message_UpdateProfileSharingImpl && - (identical(other.field0, field0) || other.field0 == field0)); - } - @override - int get hashCode => Object.hash(runtimeType, field0); - - /// Create a copy of Message - /// with the given fields replaced by the non-null parameter values. - @JsonKey(includeFromJson: false, includeToJson: false) - @override - @pragma('vm:prefer-inline') - _$$Message_UpdateProfileSharingImplCopyWith< - _$Message_UpdateProfileSharingImpl> - get copyWith => __$$Message_UpdateProfileSharingImplCopyWithImpl< - _$Message_UpdateProfileSharingImpl>(this, _$identity); - - @override - @optionalTypeArgs - TResult when({ - required TResult Function(NormalMessage field0) message, - required TResult Function(RenameMessage field0) renameMessage, - required TResult Function(ChangeParticipantMessage field0) - changeParticipants, - required TResult Function(ReactMessage field0) react, - required TResult Function() delivered, - required TResult Function() read, - required TResult Function(bool field0, TypingApp? field1) typing, - required TResult Function(UnsendMessage field0) unsend, - required TResult Function(EditMessage field0) edit, - required TResult Function(IconChangeMessage field0) iconChange, - required TResult Function(bool field0) enableSmsActivation, - required TResult Function() messageReadOnDevice, - required TResult Function(bool field0) smsConfirmSent, - required TResult Function() markUnread, - required TResult Function() peerCacheInvalidate, - required TResult Function(UpdateExtensionMessage field0) updateExtension, - required TResult Function(ErrorMessage field0) error, - required TResult Function(MoveToRecycleBinMessage field0) moveToRecycleBin, - required TResult Function(OperatedChat field0) recoverChat, - required TResult Function(PermanentDeleteMessage field0) permanentDelete, - required TResult Function() unschedule, - required TResult Function(UpdateProfileMessage field0) updateProfile, - required TResult Function(UpdateProfileSharingMessage field0) - updateProfileSharing, - required TResult Function(ShareProfileMessage field0) shareProfile, - required TResult Function() notifyAnyways, - required TResult Function(SetTranscriptBackgroundMessage field0) - setTranscriptBackground, - }) { - return updateProfileSharing(field0); - } +class Message_Message extends Message { + const Message_Message(this.field0): super._(); - @override - @optionalTypeArgs - TResult? whenOrNull({ - TResult? Function(NormalMessage field0)? message, - TResult? Function(RenameMessage field0)? renameMessage, - TResult? Function(ChangeParticipantMessage field0)? changeParticipants, - TResult? Function(ReactMessage field0)? react, - TResult? Function()? delivered, - TResult? Function()? read, - TResult? Function(bool field0, TypingApp? field1)? typing, - TResult? Function(UnsendMessage field0)? unsend, - TResult? Function(EditMessage field0)? edit, - TResult? Function(IconChangeMessage field0)? iconChange, - TResult? Function(bool field0)? enableSmsActivation, - TResult? Function()? messageReadOnDevice, - TResult? Function(bool field0)? smsConfirmSent, - TResult? Function()? markUnread, - TResult? Function()? peerCacheInvalidate, - TResult? Function(UpdateExtensionMessage field0)? updateExtension, - TResult? Function(ErrorMessage field0)? error, - TResult? Function(MoveToRecycleBinMessage field0)? moveToRecycleBin, - TResult? Function(OperatedChat field0)? recoverChat, - TResult? Function(PermanentDeleteMessage field0)? permanentDelete, - TResult? Function()? unschedule, - TResult? Function(UpdateProfileMessage field0)? updateProfile, - TResult? Function(UpdateProfileSharingMessage field0)? updateProfileSharing, - TResult? Function(ShareProfileMessage field0)? shareProfile, - TResult? Function()? notifyAnyways, - TResult? Function(SetTranscriptBackgroundMessage field0)? - setTranscriptBackground, - }) { - return updateProfileSharing?.call(field0); - } - @override - @optionalTypeArgs - TResult maybeWhen({ - TResult Function(NormalMessage field0)? message, - TResult Function(RenameMessage field0)? renameMessage, - TResult Function(ChangeParticipantMessage field0)? changeParticipants, - TResult Function(ReactMessage field0)? react, - TResult Function()? delivered, - TResult Function()? read, - TResult Function(bool field0, TypingApp? field1)? typing, - TResult Function(UnsendMessage field0)? unsend, - TResult Function(EditMessage field0)? edit, - TResult Function(IconChangeMessage field0)? iconChange, - TResult Function(bool field0)? enableSmsActivation, - TResult Function()? messageReadOnDevice, - TResult Function(bool field0)? smsConfirmSent, - TResult Function()? markUnread, - TResult Function()? peerCacheInvalidate, - TResult Function(UpdateExtensionMessage field0)? updateExtension, - TResult Function(ErrorMessage field0)? error, - TResult Function(MoveToRecycleBinMessage field0)? moveToRecycleBin, - TResult Function(OperatedChat field0)? recoverChat, - TResult Function(PermanentDeleteMessage field0)? permanentDelete, - TResult Function()? unschedule, - TResult Function(UpdateProfileMessage field0)? updateProfile, - TResult Function(UpdateProfileSharingMessage field0)? updateProfileSharing, - TResult Function(ShareProfileMessage field0)? shareProfile, - TResult Function()? notifyAnyways, - TResult Function(SetTranscriptBackgroundMessage field0)? - setTranscriptBackground, - required TResult orElse(), - }) { - if (updateProfileSharing != null) { - return updateProfileSharing(field0); - } - return orElse(); - } + final NormalMessage field0; - @override - @optionalTypeArgs - TResult map({ - required TResult Function(Message_Message value) message, - required TResult Function(Message_RenameMessage value) renameMessage, - required TResult Function(Message_ChangeParticipants value) - changeParticipants, - required TResult Function(Message_React value) react, - required TResult Function(Message_Delivered value) delivered, - required TResult Function(Message_Read value) read, - required TResult Function(Message_Typing value) typing, - required TResult Function(Message_Unsend value) unsend, - required TResult Function(Message_Edit value) edit, - required TResult Function(Message_IconChange value) iconChange, - required TResult Function(Message_EnableSmsActivation value) - enableSmsActivation, - required TResult Function(Message_MessageReadOnDevice value) - messageReadOnDevice, - required TResult Function(Message_SmsConfirmSent value) smsConfirmSent, - required TResult Function(Message_MarkUnread value) markUnread, - required TResult Function(Message_PeerCacheInvalidate value) - peerCacheInvalidate, - required TResult Function(Message_UpdateExtension value) updateExtension, - required TResult Function(Message_Error value) error, - required TResult Function(Message_MoveToRecycleBin value) moveToRecycleBin, - required TResult Function(Message_RecoverChat value) recoverChat, - required TResult Function(Message_PermanentDelete value) permanentDelete, - required TResult Function(Message_Unschedule value) unschedule, - required TResult Function(Message_UpdateProfile value) updateProfile, - required TResult Function(Message_UpdateProfileSharing value) - updateProfileSharing, - required TResult Function(Message_ShareProfile value) shareProfile, - required TResult Function(Message_NotifyAnyways value) notifyAnyways, - required TResult Function(Message_SetTranscriptBackground value) - setTranscriptBackground, - }) { - return updateProfileSharing(this); - } +/// Create a copy of Message +/// with the given fields replaced by the non-null parameter values. +@JsonKey(includeFromJson: false, includeToJson: false) +@pragma('vm:prefer-inline') +$Message_MessageCopyWith get copyWith => _$Message_MessageCopyWithImpl(this, _$identity); - @override - @optionalTypeArgs - TResult? mapOrNull({ - TResult? Function(Message_Message value)? message, - TResult? Function(Message_RenameMessage value)? renameMessage, - TResult? Function(Message_ChangeParticipants value)? changeParticipants, - TResult? Function(Message_React value)? react, - TResult? Function(Message_Delivered value)? delivered, - TResult? Function(Message_Read value)? read, - TResult? Function(Message_Typing value)? typing, - TResult? Function(Message_Unsend value)? unsend, - TResult? Function(Message_Edit value)? edit, - TResult? Function(Message_IconChange value)? iconChange, - TResult? Function(Message_EnableSmsActivation value)? enableSmsActivation, - TResult? Function(Message_MessageReadOnDevice value)? messageReadOnDevice, - TResult? Function(Message_SmsConfirmSent value)? smsConfirmSent, - TResult? Function(Message_MarkUnread value)? markUnread, - TResult? Function(Message_PeerCacheInvalidate value)? peerCacheInvalidate, - TResult? Function(Message_UpdateExtension value)? updateExtension, - TResult? Function(Message_Error value)? error, - TResult? Function(Message_MoveToRecycleBin value)? moveToRecycleBin, - TResult? Function(Message_RecoverChat value)? recoverChat, - TResult? Function(Message_PermanentDelete value)? permanentDelete, - TResult? Function(Message_Unschedule value)? unschedule, - TResult? Function(Message_UpdateProfile value)? updateProfile, - TResult? Function(Message_UpdateProfileSharing value)? updateProfileSharing, - TResult? Function(Message_ShareProfile value)? shareProfile, - TResult? Function(Message_NotifyAnyways value)? notifyAnyways, - TResult? Function(Message_SetTranscriptBackground value)? - setTranscriptBackground, - }) { - return updateProfileSharing?.call(this); - } - @override - @optionalTypeArgs - TResult maybeMap({ - TResult Function(Message_Message value)? message, - TResult Function(Message_RenameMessage value)? renameMessage, - TResult Function(Message_ChangeParticipants value)? changeParticipants, - TResult Function(Message_React value)? react, - TResult Function(Message_Delivered value)? delivered, - TResult Function(Message_Read value)? read, - TResult Function(Message_Typing value)? typing, - TResult Function(Message_Unsend value)? unsend, - TResult Function(Message_Edit value)? edit, - TResult Function(Message_IconChange value)? iconChange, - TResult Function(Message_EnableSmsActivation value)? enableSmsActivation, - TResult Function(Message_MessageReadOnDevice value)? messageReadOnDevice, - TResult Function(Message_SmsConfirmSent value)? smsConfirmSent, - TResult Function(Message_MarkUnread value)? markUnread, - TResult Function(Message_PeerCacheInvalidate value)? peerCacheInvalidate, - TResult Function(Message_UpdateExtension value)? updateExtension, - TResult Function(Message_Error value)? error, - TResult Function(Message_MoveToRecycleBin value)? moveToRecycleBin, - TResult Function(Message_RecoverChat value)? recoverChat, - TResult Function(Message_PermanentDelete value)? permanentDelete, - TResult Function(Message_Unschedule value)? unschedule, - TResult Function(Message_UpdateProfile value)? updateProfile, - TResult Function(Message_UpdateProfileSharing value)? updateProfileSharing, - TResult Function(Message_ShareProfile value)? shareProfile, - TResult Function(Message_NotifyAnyways value)? notifyAnyways, - TResult Function(Message_SetTranscriptBackground value)? - setTranscriptBackground, - required TResult orElse(), - }) { - if (updateProfileSharing != null) { - return updateProfileSharing(this); - } - return orElse(); - } -} -abstract class Message_UpdateProfileSharing extends Message { - const factory Message_UpdateProfileSharing( - final UpdateProfileSharingMessage field0) = - _$Message_UpdateProfileSharingImpl; - const Message_UpdateProfileSharing._() : super._(); - - UpdateProfileSharingMessage get field0; - - /// Create a copy of Message - /// with the given fields replaced by the non-null parameter values. - @JsonKey(includeFromJson: false, includeToJson: false) - _$$Message_UpdateProfileSharingImplCopyWith< - _$Message_UpdateProfileSharingImpl> - get copyWith => throw _privateConstructorUsedError; -} - -/// @nodoc -abstract class _$$Message_ShareProfileImplCopyWith<$Res> { - factory _$$Message_ShareProfileImplCopyWith(_$Message_ShareProfileImpl value, - $Res Function(_$Message_ShareProfileImpl) then) = - __$$Message_ShareProfileImplCopyWithImpl<$Res>; - @useResult - $Res call({ShareProfileMessage field0}); -} - -/// @nodoc -class __$$Message_ShareProfileImplCopyWithImpl<$Res> - extends _$MessageCopyWithImpl<$Res, _$Message_ShareProfileImpl> - implements _$$Message_ShareProfileImplCopyWith<$Res> { - __$$Message_ShareProfileImplCopyWithImpl(_$Message_ShareProfileImpl _value, - $Res Function(_$Message_ShareProfileImpl) _then) - : super(_value, _then); - - /// Create a copy of Message - /// with the given fields replaced by the non-null parameter values. - @pragma('vm:prefer-inline') - @override - $Res call({ - Object? field0 = null, - }) { - return _then(_$Message_ShareProfileImpl( - null == field0 - ? _value.field0 - : field0 // ignore: cast_nullable_to_non_nullable - as ShareProfileMessage, - )); - } +@override +bool operator ==(Object other) { + return identical(this, other) || (other.runtimeType == runtimeType&&other is Message_Message&&(identical(other.field0, field0) || other.field0 == field0)); } -/// @nodoc - -class _$Message_ShareProfileImpl extends Message_ShareProfile { - const _$Message_ShareProfileImpl(this.field0) : super._(); - @override - final ShareProfileMessage field0; +@override +int get hashCode => Object.hash(runtimeType,field0); - @override - String toString() { - return 'Message.shareProfile(field0: $field0)'; - } +@override +String toString() { + return 'Message.message(field0: $field0)'; +} - @override - bool operator ==(Object other) { - return identical(this, other) || - (other.runtimeType == runtimeType && - other is _$Message_ShareProfileImpl && - (identical(other.field0, field0) || other.field0 == field0)); - } - @override - int get hashCode => Object.hash(runtimeType, field0); - - /// Create a copy of Message - /// with the given fields replaced by the non-null parameter values. - @JsonKey(includeFromJson: false, includeToJson: false) - @override - @pragma('vm:prefer-inline') - _$$Message_ShareProfileImplCopyWith<_$Message_ShareProfileImpl> - get copyWith => - __$$Message_ShareProfileImplCopyWithImpl<_$Message_ShareProfileImpl>( - this, _$identity); - - @override - @optionalTypeArgs - TResult when({ - required TResult Function(NormalMessage field0) message, - required TResult Function(RenameMessage field0) renameMessage, - required TResult Function(ChangeParticipantMessage field0) - changeParticipants, - required TResult Function(ReactMessage field0) react, - required TResult Function() delivered, - required TResult Function() read, - required TResult Function(bool field0, TypingApp? field1) typing, - required TResult Function(UnsendMessage field0) unsend, - required TResult Function(EditMessage field0) edit, - required TResult Function(IconChangeMessage field0) iconChange, - required TResult Function(bool field0) enableSmsActivation, - required TResult Function() messageReadOnDevice, - required TResult Function(bool field0) smsConfirmSent, - required TResult Function() markUnread, - required TResult Function() peerCacheInvalidate, - required TResult Function(UpdateExtensionMessage field0) updateExtension, - required TResult Function(ErrorMessage field0) error, - required TResult Function(MoveToRecycleBinMessage field0) moveToRecycleBin, - required TResult Function(OperatedChat field0) recoverChat, - required TResult Function(PermanentDeleteMessage field0) permanentDelete, - required TResult Function() unschedule, - required TResult Function(UpdateProfileMessage field0) updateProfile, - required TResult Function(UpdateProfileSharingMessage field0) - updateProfileSharing, - required TResult Function(ShareProfileMessage field0) shareProfile, - required TResult Function() notifyAnyways, - required TResult Function(SetTranscriptBackgroundMessage field0) - setTranscriptBackground, - }) { - return shareProfile(field0); - } +} - @override - @optionalTypeArgs - TResult? whenOrNull({ - TResult? Function(NormalMessage field0)? message, - TResult? Function(RenameMessage field0)? renameMessage, - TResult? Function(ChangeParticipantMessage field0)? changeParticipants, - TResult? Function(ReactMessage field0)? react, - TResult? Function()? delivered, - TResult? Function()? read, - TResult? Function(bool field0, TypingApp? field1)? typing, - TResult? Function(UnsendMessage field0)? unsend, - TResult? Function(EditMessage field0)? edit, - TResult? Function(IconChangeMessage field0)? iconChange, - TResult? Function(bool field0)? enableSmsActivation, - TResult? Function()? messageReadOnDevice, - TResult? Function(bool field0)? smsConfirmSent, - TResult? Function()? markUnread, - TResult? Function()? peerCacheInvalidate, - TResult? Function(UpdateExtensionMessage field0)? updateExtension, - TResult? Function(ErrorMessage field0)? error, - TResult? Function(MoveToRecycleBinMessage field0)? moveToRecycleBin, - TResult? Function(OperatedChat field0)? recoverChat, - TResult? Function(PermanentDeleteMessage field0)? permanentDelete, - TResult? Function()? unschedule, - TResult? Function(UpdateProfileMessage field0)? updateProfile, - TResult? Function(UpdateProfileSharingMessage field0)? updateProfileSharing, - TResult? Function(ShareProfileMessage field0)? shareProfile, - TResult? Function()? notifyAnyways, - TResult? Function(SetTranscriptBackgroundMessage field0)? - setTranscriptBackground, - }) { - return shareProfile?.call(field0); - } +/// @nodoc +abstract mixin class $Message_MessageCopyWith<$Res> implements $MessageCopyWith<$Res> { + factory $Message_MessageCopyWith(Message_Message value, $Res Function(Message_Message) _then) = _$Message_MessageCopyWithImpl; +@useResult +$Res call({ + NormalMessage field0 +}); - @override - @optionalTypeArgs - TResult maybeWhen({ - TResult Function(NormalMessage field0)? message, - TResult Function(RenameMessage field0)? renameMessage, - TResult Function(ChangeParticipantMessage field0)? changeParticipants, - TResult Function(ReactMessage field0)? react, - TResult Function()? delivered, - TResult Function()? read, - TResult Function(bool field0, TypingApp? field1)? typing, - TResult Function(UnsendMessage field0)? unsend, - TResult Function(EditMessage field0)? edit, - TResult Function(IconChangeMessage field0)? iconChange, - TResult Function(bool field0)? enableSmsActivation, - TResult Function()? messageReadOnDevice, - TResult Function(bool field0)? smsConfirmSent, - TResult Function()? markUnread, - TResult Function()? peerCacheInvalidate, - TResult Function(UpdateExtensionMessage field0)? updateExtension, - TResult Function(ErrorMessage field0)? error, - TResult Function(MoveToRecycleBinMessage field0)? moveToRecycleBin, - TResult Function(OperatedChat field0)? recoverChat, - TResult Function(PermanentDeleteMessage field0)? permanentDelete, - TResult Function()? unschedule, - TResult Function(UpdateProfileMessage field0)? updateProfile, - TResult Function(UpdateProfileSharingMessage field0)? updateProfileSharing, - TResult Function(ShareProfileMessage field0)? shareProfile, - TResult Function()? notifyAnyways, - TResult Function(SetTranscriptBackgroundMessage field0)? - setTranscriptBackground, - required TResult orElse(), - }) { - if (shareProfile != null) { - return shareProfile(field0); - } - return orElse(); - } - @override - @optionalTypeArgs - TResult map({ - required TResult Function(Message_Message value) message, - required TResult Function(Message_RenameMessage value) renameMessage, - required TResult Function(Message_ChangeParticipants value) - changeParticipants, - required TResult Function(Message_React value) react, - required TResult Function(Message_Delivered value) delivered, - required TResult Function(Message_Read value) read, - required TResult Function(Message_Typing value) typing, - required TResult Function(Message_Unsend value) unsend, - required TResult Function(Message_Edit value) edit, - required TResult Function(Message_IconChange value) iconChange, - required TResult Function(Message_EnableSmsActivation value) - enableSmsActivation, - required TResult Function(Message_MessageReadOnDevice value) - messageReadOnDevice, - required TResult Function(Message_SmsConfirmSent value) smsConfirmSent, - required TResult Function(Message_MarkUnread value) markUnread, - required TResult Function(Message_PeerCacheInvalidate value) - peerCacheInvalidate, - required TResult Function(Message_UpdateExtension value) updateExtension, - required TResult Function(Message_Error value) error, - required TResult Function(Message_MoveToRecycleBin value) moveToRecycleBin, - required TResult Function(Message_RecoverChat value) recoverChat, - required TResult Function(Message_PermanentDelete value) permanentDelete, - required TResult Function(Message_Unschedule value) unschedule, - required TResult Function(Message_UpdateProfile value) updateProfile, - required TResult Function(Message_UpdateProfileSharing value) - updateProfileSharing, - required TResult Function(Message_ShareProfile value) shareProfile, - required TResult Function(Message_NotifyAnyways value) notifyAnyways, - required TResult Function(Message_SetTranscriptBackground value) - setTranscriptBackground, - }) { - return shareProfile(this); - } - @override - @optionalTypeArgs - TResult? mapOrNull({ - TResult? Function(Message_Message value)? message, - TResult? Function(Message_RenameMessage value)? renameMessage, - TResult? Function(Message_ChangeParticipants value)? changeParticipants, - TResult? Function(Message_React value)? react, - TResult? Function(Message_Delivered value)? delivered, - TResult? Function(Message_Read value)? read, - TResult? Function(Message_Typing value)? typing, - TResult? Function(Message_Unsend value)? unsend, - TResult? Function(Message_Edit value)? edit, - TResult? Function(Message_IconChange value)? iconChange, - TResult? Function(Message_EnableSmsActivation value)? enableSmsActivation, - TResult? Function(Message_MessageReadOnDevice value)? messageReadOnDevice, - TResult? Function(Message_SmsConfirmSent value)? smsConfirmSent, - TResult? Function(Message_MarkUnread value)? markUnread, - TResult? Function(Message_PeerCacheInvalidate value)? peerCacheInvalidate, - TResult? Function(Message_UpdateExtension value)? updateExtension, - TResult? Function(Message_Error value)? error, - TResult? Function(Message_MoveToRecycleBin value)? moveToRecycleBin, - TResult? Function(Message_RecoverChat value)? recoverChat, - TResult? Function(Message_PermanentDelete value)? permanentDelete, - TResult? Function(Message_Unschedule value)? unschedule, - TResult? Function(Message_UpdateProfile value)? updateProfile, - TResult? Function(Message_UpdateProfileSharing value)? updateProfileSharing, - TResult? Function(Message_ShareProfile value)? shareProfile, - TResult? Function(Message_NotifyAnyways value)? notifyAnyways, - TResult? Function(Message_SetTranscriptBackground value)? - setTranscriptBackground, - }) { - return shareProfile?.call(this); - } - @override - @optionalTypeArgs - TResult maybeMap({ - TResult Function(Message_Message value)? message, - TResult Function(Message_RenameMessage value)? renameMessage, - TResult Function(Message_ChangeParticipants value)? changeParticipants, - TResult Function(Message_React value)? react, - TResult Function(Message_Delivered value)? delivered, - TResult Function(Message_Read value)? read, - TResult Function(Message_Typing value)? typing, - TResult Function(Message_Unsend value)? unsend, - TResult Function(Message_Edit value)? edit, - TResult Function(Message_IconChange value)? iconChange, - TResult Function(Message_EnableSmsActivation value)? enableSmsActivation, - TResult Function(Message_MessageReadOnDevice value)? messageReadOnDevice, - TResult Function(Message_SmsConfirmSent value)? smsConfirmSent, - TResult Function(Message_MarkUnread value)? markUnread, - TResult Function(Message_PeerCacheInvalidate value)? peerCacheInvalidate, - TResult Function(Message_UpdateExtension value)? updateExtension, - TResult Function(Message_Error value)? error, - TResult Function(Message_MoveToRecycleBin value)? moveToRecycleBin, - TResult Function(Message_RecoverChat value)? recoverChat, - TResult Function(Message_PermanentDelete value)? permanentDelete, - TResult Function(Message_Unschedule value)? unschedule, - TResult Function(Message_UpdateProfile value)? updateProfile, - TResult Function(Message_UpdateProfileSharing value)? updateProfileSharing, - TResult Function(Message_ShareProfile value)? shareProfile, - TResult Function(Message_NotifyAnyways value)? notifyAnyways, - TResult Function(Message_SetTranscriptBackground value)? - setTranscriptBackground, - required TResult orElse(), - }) { - if (shareProfile != null) { - return shareProfile(this); - } - return orElse(); - } } +/// @nodoc +class _$Message_MessageCopyWithImpl<$Res> + implements $Message_MessageCopyWith<$Res> { + _$Message_MessageCopyWithImpl(this._self, this._then); -abstract class Message_ShareProfile extends Message { - const factory Message_ShareProfile(final ShareProfileMessage field0) = - _$Message_ShareProfileImpl; - const Message_ShareProfile._() : super._(); - - ShareProfileMessage get field0; + final Message_Message _self; + final $Res Function(Message_Message) _then; - /// Create a copy of Message - /// with the given fields replaced by the non-null parameter values. - @JsonKey(includeFromJson: false, includeToJson: false) - _$$Message_ShareProfileImplCopyWith<_$Message_ShareProfileImpl> - get copyWith => throw _privateConstructorUsedError; +/// Create a copy of Message +/// with the given fields replaced by the non-null parameter values. +@pragma('vm:prefer-inline') $Res call({Object? field0 = null,}) { + return _then(Message_Message( +null == field0 ? _self.field0 : field0 // ignore: cast_nullable_to_non_nullable +as NormalMessage, + )); } -/// @nodoc -abstract class _$$Message_NotifyAnywaysImplCopyWith<$Res> { - factory _$$Message_NotifyAnywaysImplCopyWith( - _$Message_NotifyAnywaysImpl value, - $Res Function(_$Message_NotifyAnywaysImpl) then) = - __$$Message_NotifyAnywaysImplCopyWithImpl<$Res>; + } /// @nodoc -class __$$Message_NotifyAnywaysImplCopyWithImpl<$Res> - extends _$MessageCopyWithImpl<$Res, _$Message_NotifyAnywaysImpl> - implements _$$Message_NotifyAnywaysImplCopyWith<$Res> { - __$$Message_NotifyAnywaysImplCopyWithImpl(_$Message_NotifyAnywaysImpl _value, - $Res Function(_$Message_NotifyAnywaysImpl) _then) - : super(_value, _then); - /// Create a copy of Message - /// with the given fields replaced by the non-null parameter values. -} -/// @nodoc +class Message_RenameMessage extends Message { + const Message_RenameMessage(this.field0): super._(); -class _$Message_NotifyAnywaysImpl extends Message_NotifyAnyways { - const _$Message_NotifyAnywaysImpl() : super._(); - @override - String toString() { - return 'Message.notifyAnyways()'; - } + final RenameMessage field0; - @override - bool operator ==(Object other) { - return identical(this, other) || - (other.runtimeType == runtimeType && - other is _$Message_NotifyAnywaysImpl); - } +/// Create a copy of Message +/// with the given fields replaced by the non-null parameter values. +@JsonKey(includeFromJson: false, includeToJson: false) +@pragma('vm:prefer-inline') +$Message_RenameMessageCopyWith get copyWith => _$Message_RenameMessageCopyWithImpl(this, _$identity); - @override - int get hashCode => runtimeType.hashCode; - - @override - @optionalTypeArgs - TResult when({ - required TResult Function(NormalMessage field0) message, - required TResult Function(RenameMessage field0) renameMessage, - required TResult Function(ChangeParticipantMessage field0) - changeParticipants, - required TResult Function(ReactMessage field0) react, - required TResult Function() delivered, - required TResult Function() read, - required TResult Function(bool field0, TypingApp? field1) typing, - required TResult Function(UnsendMessage field0) unsend, - required TResult Function(EditMessage field0) edit, - required TResult Function(IconChangeMessage field0) iconChange, - required TResult Function(bool field0) enableSmsActivation, - required TResult Function() messageReadOnDevice, - required TResult Function(bool field0) smsConfirmSent, - required TResult Function() markUnread, - required TResult Function() peerCacheInvalidate, - required TResult Function(UpdateExtensionMessage field0) updateExtension, - required TResult Function(ErrorMessage field0) error, - required TResult Function(MoveToRecycleBinMessage field0) moveToRecycleBin, - required TResult Function(OperatedChat field0) recoverChat, - required TResult Function(PermanentDeleteMessage field0) permanentDelete, - required TResult Function() unschedule, - required TResult Function(UpdateProfileMessage field0) updateProfile, - required TResult Function(UpdateProfileSharingMessage field0) - updateProfileSharing, - required TResult Function(ShareProfileMessage field0) shareProfile, - required TResult Function() notifyAnyways, - required TResult Function(SetTranscriptBackgroundMessage field0) - setTranscriptBackground, - }) { - return notifyAnyways(); - } - @override - @optionalTypeArgs - TResult? whenOrNull({ - TResult? Function(NormalMessage field0)? message, - TResult? Function(RenameMessage field0)? renameMessage, - TResult? Function(ChangeParticipantMessage field0)? changeParticipants, - TResult? Function(ReactMessage field0)? react, - TResult? Function()? delivered, - TResult? Function()? read, - TResult? Function(bool field0, TypingApp? field1)? typing, - TResult? Function(UnsendMessage field0)? unsend, - TResult? Function(EditMessage field0)? edit, - TResult? Function(IconChangeMessage field0)? iconChange, - TResult? Function(bool field0)? enableSmsActivation, - TResult? Function()? messageReadOnDevice, - TResult? Function(bool field0)? smsConfirmSent, - TResult? Function()? markUnread, - TResult? Function()? peerCacheInvalidate, - TResult? Function(UpdateExtensionMessage field0)? updateExtension, - TResult? Function(ErrorMessage field0)? error, - TResult? Function(MoveToRecycleBinMessage field0)? moveToRecycleBin, - TResult? Function(OperatedChat field0)? recoverChat, - TResult? Function(PermanentDeleteMessage field0)? permanentDelete, - TResult? Function()? unschedule, - TResult? Function(UpdateProfileMessage field0)? updateProfile, - TResult? Function(UpdateProfileSharingMessage field0)? updateProfileSharing, - TResult? Function(ShareProfileMessage field0)? shareProfile, - TResult? Function()? notifyAnyways, - TResult? Function(SetTranscriptBackgroundMessage field0)? - setTranscriptBackground, - }) { - return notifyAnyways?.call(); - } - @override - @optionalTypeArgs - TResult maybeWhen({ - TResult Function(NormalMessage field0)? message, - TResult Function(RenameMessage field0)? renameMessage, - TResult Function(ChangeParticipantMessage field0)? changeParticipants, - TResult Function(ReactMessage field0)? react, - TResult Function()? delivered, - TResult Function()? read, - TResult Function(bool field0, TypingApp? field1)? typing, - TResult Function(UnsendMessage field0)? unsend, - TResult Function(EditMessage field0)? edit, - TResult Function(IconChangeMessage field0)? iconChange, - TResult Function(bool field0)? enableSmsActivation, - TResult Function()? messageReadOnDevice, - TResult Function(bool field0)? smsConfirmSent, - TResult Function()? markUnread, - TResult Function()? peerCacheInvalidate, - TResult Function(UpdateExtensionMessage field0)? updateExtension, - TResult Function(ErrorMessage field0)? error, - TResult Function(MoveToRecycleBinMessage field0)? moveToRecycleBin, - TResult Function(OperatedChat field0)? recoverChat, - TResult Function(PermanentDeleteMessage field0)? permanentDelete, - TResult Function()? unschedule, - TResult Function(UpdateProfileMessage field0)? updateProfile, - TResult Function(UpdateProfileSharingMessage field0)? updateProfileSharing, - TResult Function(ShareProfileMessage field0)? shareProfile, - TResult Function()? notifyAnyways, - TResult Function(SetTranscriptBackgroundMessage field0)? - setTranscriptBackground, - required TResult orElse(), - }) { - if (notifyAnyways != null) { - return notifyAnyways(); - } - return orElse(); - } +@override +bool operator ==(Object other) { + return identical(this, other) || (other.runtimeType == runtimeType&&other is Message_RenameMessage&&(identical(other.field0, field0) || other.field0 == field0)); +} - @override - @optionalTypeArgs - TResult map({ - required TResult Function(Message_Message value) message, - required TResult Function(Message_RenameMessage value) renameMessage, - required TResult Function(Message_ChangeParticipants value) - changeParticipants, - required TResult Function(Message_React value) react, - required TResult Function(Message_Delivered value) delivered, - required TResult Function(Message_Read value) read, - required TResult Function(Message_Typing value) typing, - required TResult Function(Message_Unsend value) unsend, - required TResult Function(Message_Edit value) edit, - required TResult Function(Message_IconChange value) iconChange, - required TResult Function(Message_EnableSmsActivation value) - enableSmsActivation, - required TResult Function(Message_MessageReadOnDevice value) - messageReadOnDevice, - required TResult Function(Message_SmsConfirmSent value) smsConfirmSent, - required TResult Function(Message_MarkUnread value) markUnread, - required TResult Function(Message_PeerCacheInvalidate value) - peerCacheInvalidate, - required TResult Function(Message_UpdateExtension value) updateExtension, - required TResult Function(Message_Error value) error, - required TResult Function(Message_MoveToRecycleBin value) moveToRecycleBin, - required TResult Function(Message_RecoverChat value) recoverChat, - required TResult Function(Message_PermanentDelete value) permanentDelete, - required TResult Function(Message_Unschedule value) unschedule, - required TResult Function(Message_UpdateProfile value) updateProfile, - required TResult Function(Message_UpdateProfileSharing value) - updateProfileSharing, - required TResult Function(Message_ShareProfile value) shareProfile, - required TResult Function(Message_NotifyAnyways value) notifyAnyways, - required TResult Function(Message_SetTranscriptBackground value) - setTranscriptBackground, - }) { - return notifyAnyways(this); - } - @override - @optionalTypeArgs - TResult? mapOrNull({ - TResult? Function(Message_Message value)? message, - TResult? Function(Message_RenameMessage value)? renameMessage, - TResult? Function(Message_ChangeParticipants value)? changeParticipants, - TResult? Function(Message_React value)? react, - TResult? Function(Message_Delivered value)? delivered, - TResult? Function(Message_Read value)? read, - TResult? Function(Message_Typing value)? typing, - TResult? Function(Message_Unsend value)? unsend, - TResult? Function(Message_Edit value)? edit, - TResult? Function(Message_IconChange value)? iconChange, - TResult? Function(Message_EnableSmsActivation value)? enableSmsActivation, - TResult? Function(Message_MessageReadOnDevice value)? messageReadOnDevice, - TResult? Function(Message_SmsConfirmSent value)? smsConfirmSent, - TResult? Function(Message_MarkUnread value)? markUnread, - TResult? Function(Message_PeerCacheInvalidate value)? peerCacheInvalidate, - TResult? Function(Message_UpdateExtension value)? updateExtension, - TResult? Function(Message_Error value)? error, - TResult? Function(Message_MoveToRecycleBin value)? moveToRecycleBin, - TResult? Function(Message_RecoverChat value)? recoverChat, - TResult? Function(Message_PermanentDelete value)? permanentDelete, - TResult? Function(Message_Unschedule value)? unschedule, - TResult? Function(Message_UpdateProfile value)? updateProfile, - TResult? Function(Message_UpdateProfileSharing value)? updateProfileSharing, - TResult? Function(Message_ShareProfile value)? shareProfile, - TResult? Function(Message_NotifyAnyways value)? notifyAnyways, - TResult? Function(Message_SetTranscriptBackground value)? - setTranscriptBackground, - }) { - return notifyAnyways?.call(this); - } +@override +int get hashCode => Object.hash(runtimeType,field0); - @override - @optionalTypeArgs - TResult maybeMap({ - TResult Function(Message_Message value)? message, - TResult Function(Message_RenameMessage value)? renameMessage, - TResult Function(Message_ChangeParticipants value)? changeParticipants, - TResult Function(Message_React value)? react, - TResult Function(Message_Delivered value)? delivered, - TResult Function(Message_Read value)? read, - TResult Function(Message_Typing value)? typing, - TResult Function(Message_Unsend value)? unsend, - TResult Function(Message_Edit value)? edit, - TResult Function(Message_IconChange value)? iconChange, - TResult Function(Message_EnableSmsActivation value)? enableSmsActivation, - TResult Function(Message_MessageReadOnDevice value)? messageReadOnDevice, - TResult Function(Message_SmsConfirmSent value)? smsConfirmSent, - TResult Function(Message_MarkUnread value)? markUnread, - TResult Function(Message_PeerCacheInvalidate value)? peerCacheInvalidate, - TResult Function(Message_UpdateExtension value)? updateExtension, - TResult Function(Message_Error value)? error, - TResult Function(Message_MoveToRecycleBin value)? moveToRecycleBin, - TResult Function(Message_RecoverChat value)? recoverChat, - TResult Function(Message_PermanentDelete value)? permanentDelete, - TResult Function(Message_Unschedule value)? unschedule, - TResult Function(Message_UpdateProfile value)? updateProfile, - TResult Function(Message_UpdateProfileSharing value)? updateProfileSharing, - TResult Function(Message_ShareProfile value)? shareProfile, - TResult Function(Message_NotifyAnyways value)? notifyAnyways, - TResult Function(Message_SetTranscriptBackground value)? - setTranscriptBackground, - required TResult orElse(), - }) { - if (notifyAnyways != null) { - return notifyAnyways(this); - } - return orElse(); - } +@override +String toString() { + return 'Message.renameMessage(field0: $field0)'; } -abstract class Message_NotifyAnyways extends Message { - const factory Message_NotifyAnyways() = _$Message_NotifyAnywaysImpl; - const Message_NotifyAnyways._() : super._(); + } /// @nodoc -abstract class _$$Message_SetTranscriptBackgroundImplCopyWith<$Res> { - factory _$$Message_SetTranscriptBackgroundImplCopyWith( - _$Message_SetTranscriptBackgroundImpl value, - $Res Function(_$Message_SetTranscriptBackgroundImpl) then) = - __$$Message_SetTranscriptBackgroundImplCopyWithImpl<$Res>; - @useResult - $Res call({SetTranscriptBackgroundMessage field0}); +abstract mixin class $Message_RenameMessageCopyWith<$Res> implements $MessageCopyWith<$Res> { + factory $Message_RenameMessageCopyWith(Message_RenameMessage value, $Res Function(Message_RenameMessage) _then) = _$Message_RenameMessageCopyWithImpl; +@useResult +$Res call({ + RenameMessage field0 +}); - $SetTranscriptBackgroundMessageCopyWith<$Res> get field0; -} + + +} /// @nodoc -class __$$Message_SetTranscriptBackgroundImplCopyWithImpl<$Res> - extends _$MessageCopyWithImpl<$Res, _$Message_SetTranscriptBackgroundImpl> - implements _$$Message_SetTranscriptBackgroundImplCopyWith<$Res> { - __$$Message_SetTranscriptBackgroundImplCopyWithImpl( - _$Message_SetTranscriptBackgroundImpl _value, - $Res Function(_$Message_SetTranscriptBackgroundImpl) _then) - : super(_value, _then); +class _$Message_RenameMessageCopyWithImpl<$Res> + implements $Message_RenameMessageCopyWith<$Res> { + _$Message_RenameMessageCopyWithImpl(this._self, this._then); - /// Create a copy of Message - /// with the given fields replaced by the non-null parameter values. - @pragma('vm:prefer-inline') - @override - $Res call({ - Object? field0 = null, - }) { - return _then(_$Message_SetTranscriptBackgroundImpl( - null == field0 - ? _value.field0 - : field0 // ignore: cast_nullable_to_non_nullable - as SetTranscriptBackgroundMessage, - )); - } + final Message_RenameMessage _self; + final $Res Function(Message_RenameMessage) _then; - /// Create a copy of Message - /// with the given fields replaced by the non-null parameter values. - @override - @pragma('vm:prefer-inline') - $SetTranscriptBackgroundMessageCopyWith<$Res> get field0 { - return $SetTranscriptBackgroundMessageCopyWith<$Res>(_value.field0, - (value) { - return _then(_value.copyWith(field0: value)); - }); - } +/// Create a copy of Message +/// with the given fields replaced by the non-null parameter values. +@pragma('vm:prefer-inline') $Res call({Object? field0 = null,}) { + return _then(Message_RenameMessage( +null == field0 ? _self.field0 : field0 // ignore: cast_nullable_to_non_nullable +as RenameMessage, + )); } -/// @nodoc -class _$Message_SetTranscriptBackgroundImpl - extends Message_SetTranscriptBackground { - const _$Message_SetTranscriptBackgroundImpl(this.field0) : super._(); +} - @override - final SetTranscriptBackgroundMessage field0; +/// @nodoc - @override - String toString() { - return 'Message.setTranscriptBackground(field0: $field0)'; - } - @override - bool operator ==(Object other) { - return identical(this, other) || - (other.runtimeType == runtimeType && - other is _$Message_SetTranscriptBackgroundImpl && - (identical(other.field0, field0) || other.field0 == field0)); - } +class Message_ChangeParticipants extends Message { + const Message_ChangeParticipants(this.field0): super._(); - @override - int get hashCode => Object.hash(runtimeType, field0); - - /// Create a copy of Message - /// with the given fields replaced by the non-null parameter values. - @JsonKey(includeFromJson: false, includeToJson: false) - @override - @pragma('vm:prefer-inline') - _$$Message_SetTranscriptBackgroundImplCopyWith< - _$Message_SetTranscriptBackgroundImpl> - get copyWith => __$$Message_SetTranscriptBackgroundImplCopyWithImpl< - _$Message_SetTranscriptBackgroundImpl>(this, _$identity); - - @override - @optionalTypeArgs - TResult when({ - required TResult Function(NormalMessage field0) message, - required TResult Function(RenameMessage field0) renameMessage, - required TResult Function(ChangeParticipantMessage field0) - changeParticipants, - required TResult Function(ReactMessage field0) react, - required TResult Function() delivered, - required TResult Function() read, - required TResult Function(bool field0, TypingApp? field1) typing, - required TResult Function(UnsendMessage field0) unsend, - required TResult Function(EditMessage field0) edit, - required TResult Function(IconChangeMessage field0) iconChange, - required TResult Function(bool field0) enableSmsActivation, - required TResult Function() messageReadOnDevice, - required TResult Function(bool field0) smsConfirmSent, - required TResult Function() markUnread, - required TResult Function() peerCacheInvalidate, - required TResult Function(UpdateExtensionMessage field0) updateExtension, - required TResult Function(ErrorMessage field0) error, - required TResult Function(MoveToRecycleBinMessage field0) moveToRecycleBin, - required TResult Function(OperatedChat field0) recoverChat, - required TResult Function(PermanentDeleteMessage field0) permanentDelete, - required TResult Function() unschedule, - required TResult Function(UpdateProfileMessage field0) updateProfile, - required TResult Function(UpdateProfileSharingMessage field0) - updateProfileSharing, - required TResult Function(ShareProfileMessage field0) shareProfile, - required TResult Function() notifyAnyways, - required TResult Function(SetTranscriptBackgroundMessage field0) - setTranscriptBackground, - }) { - return setTranscriptBackground(field0); - } - @override - @optionalTypeArgs - TResult? whenOrNull({ - TResult? Function(NormalMessage field0)? message, - TResult? Function(RenameMessage field0)? renameMessage, - TResult? Function(ChangeParticipantMessage field0)? changeParticipants, - TResult? Function(ReactMessage field0)? react, - TResult? Function()? delivered, - TResult? Function()? read, - TResult? Function(bool field0, TypingApp? field1)? typing, - TResult? Function(UnsendMessage field0)? unsend, - TResult? Function(EditMessage field0)? edit, - TResult? Function(IconChangeMessage field0)? iconChange, - TResult? Function(bool field0)? enableSmsActivation, - TResult? Function()? messageReadOnDevice, - TResult? Function(bool field0)? smsConfirmSent, - TResult? Function()? markUnread, - TResult? Function()? peerCacheInvalidate, - TResult? Function(UpdateExtensionMessage field0)? updateExtension, - TResult? Function(ErrorMessage field0)? error, - TResult? Function(MoveToRecycleBinMessage field0)? moveToRecycleBin, - TResult? Function(OperatedChat field0)? recoverChat, - TResult? Function(PermanentDeleteMessage field0)? permanentDelete, - TResult? Function()? unschedule, - TResult? Function(UpdateProfileMessage field0)? updateProfile, - TResult? Function(UpdateProfileSharingMessage field0)? updateProfileSharing, - TResult? Function(ShareProfileMessage field0)? shareProfile, - TResult? Function()? notifyAnyways, - TResult? Function(SetTranscriptBackgroundMessage field0)? - setTranscriptBackground, - }) { - return setTranscriptBackground?.call(field0); - } + final ChangeParticipantMessage field0; - @override - @optionalTypeArgs - TResult maybeWhen({ - TResult Function(NormalMessage field0)? message, - TResult Function(RenameMessage field0)? renameMessage, - TResult Function(ChangeParticipantMessage field0)? changeParticipants, - TResult Function(ReactMessage field0)? react, - TResult Function()? delivered, - TResult Function()? read, - TResult Function(bool field0, TypingApp? field1)? typing, - TResult Function(UnsendMessage field0)? unsend, - TResult Function(EditMessage field0)? edit, - TResult Function(IconChangeMessage field0)? iconChange, - TResult Function(bool field0)? enableSmsActivation, - TResult Function()? messageReadOnDevice, - TResult Function(bool field0)? smsConfirmSent, - TResult Function()? markUnread, - TResult Function()? peerCacheInvalidate, - TResult Function(UpdateExtensionMessage field0)? updateExtension, - TResult Function(ErrorMessage field0)? error, - TResult Function(MoveToRecycleBinMessage field0)? moveToRecycleBin, - TResult Function(OperatedChat field0)? recoverChat, - TResult Function(PermanentDeleteMessage field0)? permanentDelete, - TResult Function()? unschedule, - TResult Function(UpdateProfileMessage field0)? updateProfile, - TResult Function(UpdateProfileSharingMessage field0)? updateProfileSharing, - TResult Function(ShareProfileMessage field0)? shareProfile, - TResult Function()? notifyAnyways, - TResult Function(SetTranscriptBackgroundMessage field0)? - setTranscriptBackground, - required TResult orElse(), - }) { - if (setTranscriptBackground != null) { - return setTranscriptBackground(field0); - } - return orElse(); - } +/// Create a copy of Message +/// with the given fields replaced by the non-null parameter values. +@JsonKey(includeFromJson: false, includeToJson: false) +@pragma('vm:prefer-inline') +$Message_ChangeParticipantsCopyWith get copyWith => _$Message_ChangeParticipantsCopyWithImpl(this, _$identity); - @override - @optionalTypeArgs - TResult map({ - required TResult Function(Message_Message value) message, - required TResult Function(Message_RenameMessage value) renameMessage, - required TResult Function(Message_ChangeParticipants value) - changeParticipants, - required TResult Function(Message_React value) react, - required TResult Function(Message_Delivered value) delivered, - required TResult Function(Message_Read value) read, - required TResult Function(Message_Typing value) typing, - required TResult Function(Message_Unsend value) unsend, - required TResult Function(Message_Edit value) edit, - required TResult Function(Message_IconChange value) iconChange, - required TResult Function(Message_EnableSmsActivation value) - enableSmsActivation, - required TResult Function(Message_MessageReadOnDevice value) - messageReadOnDevice, - required TResult Function(Message_SmsConfirmSent value) smsConfirmSent, - required TResult Function(Message_MarkUnread value) markUnread, - required TResult Function(Message_PeerCacheInvalidate value) - peerCacheInvalidate, - required TResult Function(Message_UpdateExtension value) updateExtension, - required TResult Function(Message_Error value) error, - required TResult Function(Message_MoveToRecycleBin value) moveToRecycleBin, - required TResult Function(Message_RecoverChat value) recoverChat, - required TResult Function(Message_PermanentDelete value) permanentDelete, - required TResult Function(Message_Unschedule value) unschedule, - required TResult Function(Message_UpdateProfile value) updateProfile, - required TResult Function(Message_UpdateProfileSharing value) - updateProfileSharing, - required TResult Function(Message_ShareProfile value) shareProfile, - required TResult Function(Message_NotifyAnyways value) notifyAnyways, - required TResult Function(Message_SetTranscriptBackground value) - setTranscriptBackground, - }) { - return setTranscriptBackground(this); - } - @override - @optionalTypeArgs - TResult? mapOrNull({ - TResult? Function(Message_Message value)? message, - TResult? Function(Message_RenameMessage value)? renameMessage, - TResult? Function(Message_ChangeParticipants value)? changeParticipants, - TResult? Function(Message_React value)? react, - TResult? Function(Message_Delivered value)? delivered, - TResult? Function(Message_Read value)? read, - TResult? Function(Message_Typing value)? typing, - TResult? Function(Message_Unsend value)? unsend, - TResult? Function(Message_Edit value)? edit, - TResult? Function(Message_IconChange value)? iconChange, - TResult? Function(Message_EnableSmsActivation value)? enableSmsActivation, - TResult? Function(Message_MessageReadOnDevice value)? messageReadOnDevice, - TResult? Function(Message_SmsConfirmSent value)? smsConfirmSent, - TResult? Function(Message_MarkUnread value)? markUnread, - TResult? Function(Message_PeerCacheInvalidate value)? peerCacheInvalidate, - TResult? Function(Message_UpdateExtension value)? updateExtension, - TResult? Function(Message_Error value)? error, - TResult? Function(Message_MoveToRecycleBin value)? moveToRecycleBin, - TResult? Function(Message_RecoverChat value)? recoverChat, - TResult? Function(Message_PermanentDelete value)? permanentDelete, - TResult? Function(Message_Unschedule value)? unschedule, - TResult? Function(Message_UpdateProfile value)? updateProfile, - TResult? Function(Message_UpdateProfileSharing value)? updateProfileSharing, - TResult? Function(Message_ShareProfile value)? shareProfile, - TResult? Function(Message_NotifyAnyways value)? notifyAnyways, - TResult? Function(Message_SetTranscriptBackground value)? - setTranscriptBackground, - }) { - return setTranscriptBackground?.call(this); - } - @override - @optionalTypeArgs - TResult maybeMap({ - TResult Function(Message_Message value)? message, - TResult Function(Message_RenameMessage value)? renameMessage, - TResult Function(Message_ChangeParticipants value)? changeParticipants, - TResult Function(Message_React value)? react, - TResult Function(Message_Delivered value)? delivered, - TResult Function(Message_Read value)? read, - TResult Function(Message_Typing value)? typing, - TResult Function(Message_Unsend value)? unsend, - TResult Function(Message_Edit value)? edit, - TResult Function(Message_IconChange value)? iconChange, - TResult Function(Message_EnableSmsActivation value)? enableSmsActivation, - TResult Function(Message_MessageReadOnDevice value)? messageReadOnDevice, - TResult Function(Message_SmsConfirmSent value)? smsConfirmSent, - TResult Function(Message_MarkUnread value)? markUnread, - TResult Function(Message_PeerCacheInvalidate value)? peerCacheInvalidate, - TResult Function(Message_UpdateExtension value)? updateExtension, - TResult Function(Message_Error value)? error, - TResult Function(Message_MoveToRecycleBin value)? moveToRecycleBin, - TResult Function(Message_RecoverChat value)? recoverChat, - TResult Function(Message_PermanentDelete value)? permanentDelete, - TResult Function(Message_Unschedule value)? unschedule, - TResult Function(Message_UpdateProfile value)? updateProfile, - TResult Function(Message_UpdateProfileSharing value)? updateProfileSharing, - TResult Function(Message_ShareProfile value)? shareProfile, - TResult Function(Message_NotifyAnyways value)? notifyAnyways, - TResult Function(Message_SetTranscriptBackground value)? - setTranscriptBackground, - required TResult orElse(), - }) { - if (setTranscriptBackground != null) { - return setTranscriptBackground(this); - } - return orElse(); - } +@override +bool operator ==(Object other) { + return identical(this, other) || (other.runtimeType == runtimeType&&other is Message_ChangeParticipants&&(identical(other.field0, field0) || other.field0 == field0)); } -abstract class Message_SetTranscriptBackground extends Message { - const factory Message_SetTranscriptBackground( - final SetTranscriptBackgroundMessage field0) = - _$Message_SetTranscriptBackgroundImpl; - const Message_SetTranscriptBackground._() : super._(); - SetTranscriptBackgroundMessage get field0; +@override +int get hashCode => Object.hash(runtimeType,field0); - /// Create a copy of Message - /// with the given fields replaced by the non-null parameter values. - @JsonKey(includeFromJson: false, includeToJson: false) - _$$Message_SetTranscriptBackgroundImplCopyWith< - _$Message_SetTranscriptBackgroundImpl> - get copyWith => throw _privateConstructorUsedError; +@override +String toString() { + return 'Message.changeParticipants(field0: $field0)'; } -/// @nodoc -mixin _$MessagePart { - Object get field0 => throw _privateConstructorUsedError; - @optionalTypeArgs - TResult when({ - required TResult Function(String field0, TextFormat field1) text, - required TResult Function(Attachment field0) attachment, - required TResult Function(String field0, String field1) mention, - required TResult Function(String field0) object, - }) => - throw _privateConstructorUsedError; - @optionalTypeArgs - TResult? whenOrNull({ - TResult? Function(String field0, TextFormat field1)? text, - TResult? Function(Attachment field0)? attachment, - TResult? Function(String field0, String field1)? mention, - TResult? Function(String field0)? object, - }) => - throw _privateConstructorUsedError; - @optionalTypeArgs - TResult maybeWhen({ - TResult Function(String field0, TextFormat field1)? text, - TResult Function(Attachment field0)? attachment, - TResult Function(String field0, String field1)? mention, - TResult Function(String field0)? object, - required TResult orElse(), - }) => - throw _privateConstructorUsedError; - @optionalTypeArgs - TResult map({ - required TResult Function(MessagePart_Text value) text, - required TResult Function(MessagePart_Attachment value) attachment, - required TResult Function(MessagePart_Mention value) mention, - required TResult Function(MessagePart_Object value) object, - }) => - throw _privateConstructorUsedError; - @optionalTypeArgs - TResult? mapOrNull({ - TResult? Function(MessagePart_Text value)? text, - TResult? Function(MessagePart_Attachment value)? attachment, - TResult? Function(MessagePart_Mention value)? mention, - TResult? Function(MessagePart_Object value)? object, - }) => - throw _privateConstructorUsedError; - @optionalTypeArgs - TResult maybeMap({ - TResult Function(MessagePart_Text value)? text, - TResult Function(MessagePart_Attachment value)? attachment, - TResult Function(MessagePart_Mention value)? mention, - TResult Function(MessagePart_Object value)? object, - required TResult orElse(), - }) => - throw _privateConstructorUsedError; -} - -/// @nodoc -abstract class $MessagePartCopyWith<$Res> { - factory $MessagePartCopyWith( - MessagePart value, $Res Function(MessagePart) then) = - _$MessagePartCopyWithImpl<$Res, MessagePart>; -} - -/// @nodoc -class _$MessagePartCopyWithImpl<$Res, $Val extends MessagePart> - implements $MessagePartCopyWith<$Res> { - _$MessagePartCopyWithImpl(this._value, this._then); - - // ignore: unused_field - final $Val _value; - // ignore: unused_field - final $Res Function($Val) _then; - - /// Create a copy of MessagePart - /// with the given fields replaced by the non-null parameter values. -} - -/// @nodoc -abstract class _$$MessagePart_TextImplCopyWith<$Res> { - factory _$$MessagePart_TextImplCopyWith(_$MessagePart_TextImpl value, - $Res Function(_$MessagePart_TextImpl) then) = - __$$MessagePart_TextImplCopyWithImpl<$Res>; - @useResult - $Res call({String field0, TextFormat field1}); - - $TextFormatCopyWith<$Res> get field1; -} - -/// @nodoc -class __$$MessagePart_TextImplCopyWithImpl<$Res> - extends _$MessagePartCopyWithImpl<$Res, _$MessagePart_TextImpl> - implements _$$MessagePart_TextImplCopyWith<$Res> { - __$$MessagePart_TextImplCopyWithImpl(_$MessagePart_TextImpl _value, - $Res Function(_$MessagePart_TextImpl) _then) - : super(_value, _then); - - /// Create a copy of MessagePart - /// with the given fields replaced by the non-null parameter values. - @pragma('vm:prefer-inline') - @override - $Res call({ - Object? field0 = null, - Object? field1 = null, - }) { - return _then(_$MessagePart_TextImpl( - null == field0 - ? _value.field0 - : field0 // ignore: cast_nullable_to_non_nullable - as String, - null == field1 - ? _value.field1 - : field1 // ignore: cast_nullable_to_non_nullable - as TextFormat, - )); - } - /// Create a copy of MessagePart - /// with the given fields replaced by the non-null parameter values. - @override - @pragma('vm:prefer-inline') - $TextFormatCopyWith<$Res> get field1 { - return $TextFormatCopyWith<$Res>(_value.field1, (value) { - return _then(_value.copyWith(field1: value)); - }); - } } /// @nodoc +abstract mixin class $Message_ChangeParticipantsCopyWith<$Res> implements $MessageCopyWith<$Res> { + factory $Message_ChangeParticipantsCopyWith(Message_ChangeParticipants value, $Res Function(Message_ChangeParticipants) _then) = _$Message_ChangeParticipantsCopyWithImpl; +@useResult +$Res call({ + ChangeParticipantMessage field0 +}); -class _$MessagePart_TextImpl extends MessagePart_Text { - const _$MessagePart_TextImpl(this.field0, this.field1) : super._(); - - @override - final String field0; - @override - final TextFormat field1; - - @override - String toString() { - return 'MessagePart.text(field0: $field0, field1: $field1)'; - } - - @override - bool operator ==(Object other) { - return identical(this, other) || - (other.runtimeType == runtimeType && - other is _$MessagePart_TextImpl && - (identical(other.field0, field0) || other.field0 == field0) && - (identical(other.field1, field1) || other.field1 == field1)); - } - - @override - int get hashCode => Object.hash(runtimeType, field0, field1); - - /// Create a copy of MessagePart - /// with the given fields replaced by the non-null parameter values. - @JsonKey(includeFromJson: false, includeToJson: false) - @override - @pragma('vm:prefer-inline') - _$$MessagePart_TextImplCopyWith<_$MessagePart_TextImpl> get copyWith => - __$$MessagePart_TextImplCopyWithImpl<_$MessagePart_TextImpl>( - this, _$identity); - - @override - @optionalTypeArgs - TResult when({ - required TResult Function(String field0, TextFormat field1) text, - required TResult Function(Attachment field0) attachment, - required TResult Function(String field0, String field1) mention, - required TResult Function(String field0) object, - }) { - return text(field0, field1); - } - @override - @optionalTypeArgs - TResult? whenOrNull({ - TResult? Function(String field0, TextFormat field1)? text, - TResult? Function(Attachment field0)? attachment, - TResult? Function(String field0, String field1)? mention, - TResult? Function(String field0)? object, - }) { - return text?.call(field0, field1); - } - @override - @optionalTypeArgs - TResult maybeWhen({ - TResult Function(String field0, TextFormat field1)? text, - TResult Function(Attachment field0)? attachment, - TResult Function(String field0, String field1)? mention, - TResult Function(String field0)? object, - required TResult orElse(), - }) { - if (text != null) { - return text(field0, field1); - } - return orElse(); - } - @override - @optionalTypeArgs - TResult map({ - required TResult Function(MessagePart_Text value) text, - required TResult Function(MessagePart_Attachment value) attachment, - required TResult Function(MessagePart_Mention value) mention, - required TResult Function(MessagePart_Object value) object, - }) { - return text(this); - } +} +/// @nodoc +class _$Message_ChangeParticipantsCopyWithImpl<$Res> + implements $Message_ChangeParticipantsCopyWith<$Res> { + _$Message_ChangeParticipantsCopyWithImpl(this._self, this._then); - @override - @optionalTypeArgs - TResult? mapOrNull({ - TResult? Function(MessagePart_Text value)? text, - TResult? Function(MessagePart_Attachment value)? attachment, - TResult? Function(MessagePart_Mention value)? mention, - TResult? Function(MessagePart_Object value)? object, - }) { - return text?.call(this); - } + final Message_ChangeParticipants _self; + final $Res Function(Message_ChangeParticipants) _then; - @override - @optionalTypeArgs - TResult maybeMap({ - TResult Function(MessagePart_Text value)? text, - TResult Function(MessagePart_Attachment value)? attachment, - TResult Function(MessagePart_Mention value)? mention, - TResult Function(MessagePart_Object value)? object, - required TResult orElse(), - }) { - if (text != null) { - return text(this); - } - return orElse(); - } +/// Create a copy of Message +/// with the given fields replaced by the non-null parameter values. +@pragma('vm:prefer-inline') $Res call({Object? field0 = null,}) { + return _then(Message_ChangeParticipants( +null == field0 ? _self.field0 : field0 // ignore: cast_nullable_to_non_nullable +as ChangeParticipantMessage, + )); } -abstract class MessagePart_Text extends MessagePart { - const factory MessagePart_Text(final String field0, final TextFormat field1) = - _$MessagePart_TextImpl; - const MessagePart_Text._() : super._(); - - @override - String get field0; - TextFormat get field1; - - /// Create a copy of MessagePart - /// with the given fields replaced by the non-null parameter values. - @JsonKey(includeFromJson: false, includeToJson: false) - _$$MessagePart_TextImplCopyWith<_$MessagePart_TextImpl> get copyWith => - throw _privateConstructorUsedError; -} - -/// @nodoc -abstract class _$$MessagePart_AttachmentImplCopyWith<$Res> { - factory _$$MessagePart_AttachmentImplCopyWith( - _$MessagePart_AttachmentImpl value, - $Res Function(_$MessagePart_AttachmentImpl) then) = - __$$MessagePart_AttachmentImplCopyWithImpl<$Res>; - @useResult - $Res call({Attachment field0}); -} - -/// @nodoc -class __$$MessagePart_AttachmentImplCopyWithImpl<$Res> - extends _$MessagePartCopyWithImpl<$Res, _$MessagePart_AttachmentImpl> - implements _$$MessagePart_AttachmentImplCopyWith<$Res> { - __$$MessagePart_AttachmentImplCopyWithImpl( - _$MessagePart_AttachmentImpl _value, - $Res Function(_$MessagePart_AttachmentImpl) _then) - : super(_value, _then); - - /// Create a copy of MessagePart - /// with the given fields replaced by the non-null parameter values. - @pragma('vm:prefer-inline') - @override - $Res call({ - Object? field0 = null, - }) { - return _then(_$MessagePart_AttachmentImpl( - null == field0 - ? _value.field0 - : field0 // ignore: cast_nullable_to_non_nullable - as Attachment, - )); - } + } /// @nodoc -class _$MessagePart_AttachmentImpl extends MessagePart_Attachment { - const _$MessagePart_AttachmentImpl(this.field0) : super._(); - @override - final Attachment field0; - - @override - String toString() { - return 'MessagePart.attachment(field0: $field0)'; - } - - @override - bool operator ==(Object other) { - return identical(this, other) || - (other.runtimeType == runtimeType && - other is _$MessagePart_AttachmentImpl && - (identical(other.field0, field0) || other.field0 == field0)); - } +class Message_React extends Message { + const Message_React(this.field0): super._(); - @override - int get hashCode => Object.hash(runtimeType, field0); - - /// Create a copy of MessagePart - /// with the given fields replaced by the non-null parameter values. - @JsonKey(includeFromJson: false, includeToJson: false) - @override - @pragma('vm:prefer-inline') - _$$MessagePart_AttachmentImplCopyWith<_$MessagePart_AttachmentImpl> - get copyWith => __$$MessagePart_AttachmentImplCopyWithImpl< - _$MessagePart_AttachmentImpl>(this, _$identity); - - @override - @optionalTypeArgs - TResult when({ - required TResult Function(String field0, TextFormat field1) text, - required TResult Function(Attachment field0) attachment, - required TResult Function(String field0, String field1) mention, - required TResult Function(String field0) object, - }) { - return attachment(field0); - } - @override - @optionalTypeArgs - TResult? whenOrNull({ - TResult? Function(String field0, TextFormat field1)? text, - TResult? Function(Attachment field0)? attachment, - TResult? Function(String field0, String field1)? mention, - TResult? Function(String field0)? object, - }) { - return attachment?.call(field0); - } + final ReactMessage field0; - @override - @optionalTypeArgs - TResult maybeWhen({ - TResult Function(String field0, TextFormat field1)? text, - TResult Function(Attachment field0)? attachment, - TResult Function(String field0, String field1)? mention, - TResult Function(String field0)? object, - required TResult orElse(), - }) { - if (attachment != null) { - return attachment(field0); - } - return orElse(); - } +/// Create a copy of Message +/// with the given fields replaced by the non-null parameter values. +@JsonKey(includeFromJson: false, includeToJson: false) +@pragma('vm:prefer-inline') +$Message_ReactCopyWith get copyWith => _$Message_ReactCopyWithImpl(this, _$identity); - @override - @optionalTypeArgs - TResult map({ - required TResult Function(MessagePart_Text value) text, - required TResult Function(MessagePart_Attachment value) attachment, - required TResult Function(MessagePart_Mention value) mention, - required TResult Function(MessagePart_Object value) object, - }) { - return attachment(this); - } - @override - @optionalTypeArgs - TResult? mapOrNull({ - TResult? Function(MessagePart_Text value)? text, - TResult? Function(MessagePart_Attachment value)? attachment, - TResult? Function(MessagePart_Mention value)? mention, - TResult? Function(MessagePart_Object value)? object, - }) { - return attachment?.call(this); - } - @override - @optionalTypeArgs - TResult maybeMap({ - TResult Function(MessagePart_Text value)? text, - TResult Function(MessagePart_Attachment value)? attachment, - TResult Function(MessagePart_Mention value)? mention, - TResult Function(MessagePart_Object value)? object, - required TResult orElse(), - }) { - if (attachment != null) { - return attachment(this); - } - return orElse(); - } +@override +bool operator ==(Object other) { + return identical(this, other) || (other.runtimeType == runtimeType&&other is Message_React&&(identical(other.field0, field0) || other.field0 == field0)); } -abstract class MessagePart_Attachment extends MessagePart { - const factory MessagePart_Attachment(final Attachment field0) = - _$MessagePart_AttachmentImpl; - const MessagePart_Attachment._() : super._(); - - @override - Attachment get field0; - - /// Create a copy of MessagePart - /// with the given fields replaced by the non-null parameter values. - @JsonKey(includeFromJson: false, includeToJson: false) - _$$MessagePart_AttachmentImplCopyWith<_$MessagePart_AttachmentImpl> - get copyWith => throw _privateConstructorUsedError; -} - -/// @nodoc -abstract class _$$MessagePart_MentionImplCopyWith<$Res> { - factory _$$MessagePart_MentionImplCopyWith(_$MessagePart_MentionImpl value, - $Res Function(_$MessagePart_MentionImpl) then) = - __$$MessagePart_MentionImplCopyWithImpl<$Res>; - @useResult - $Res call({String field0, String field1}); -} - -/// @nodoc -class __$$MessagePart_MentionImplCopyWithImpl<$Res> - extends _$MessagePartCopyWithImpl<$Res, _$MessagePart_MentionImpl> - implements _$$MessagePart_MentionImplCopyWith<$Res> { - __$$MessagePart_MentionImplCopyWithImpl(_$MessagePart_MentionImpl _value, - $Res Function(_$MessagePart_MentionImpl) _then) - : super(_value, _then); - - /// Create a copy of MessagePart - /// with the given fields replaced by the non-null parameter values. - @pragma('vm:prefer-inline') - @override - $Res call({ - Object? field0 = null, - Object? field1 = null, - }) { - return _then(_$MessagePart_MentionImpl( - null == field0 - ? _value.field0 - : field0 // ignore: cast_nullable_to_non_nullable - as String, - null == field1 - ? _value.field1 - : field1 // ignore: cast_nullable_to_non_nullable - as String, - )); - } -} -/// @nodoc +@override +int get hashCode => Object.hash(runtimeType,field0); -class _$MessagePart_MentionImpl extends MessagePart_Mention { - const _$MessagePart_MentionImpl(this.field0, this.field1) : super._(); +@override +String toString() { + return 'Message.react(field0: $field0)'; +} - @override - final String field0; - @override - final String field1; - @override - String toString() { - return 'MessagePart.mention(field0: $field0, field1: $field1)'; - } +} - @override - bool operator ==(Object other) { - return identical(this, other) || - (other.runtimeType == runtimeType && - other is _$MessagePart_MentionImpl && - (identical(other.field0, field0) || other.field0 == field0) && - (identical(other.field1, field1) || other.field1 == field1)); - } +/// @nodoc +abstract mixin class $Message_ReactCopyWith<$Res> implements $MessageCopyWith<$Res> { + factory $Message_ReactCopyWith(Message_React value, $Res Function(Message_React) _then) = _$Message_ReactCopyWithImpl; +@useResult +$Res call({ + ReactMessage field0 +}); - @override - int get hashCode => Object.hash(runtimeType, field0, field1); - - /// Create a copy of MessagePart - /// with the given fields replaced by the non-null parameter values. - @JsonKey(includeFromJson: false, includeToJson: false) - @override - @pragma('vm:prefer-inline') - _$$MessagePart_MentionImplCopyWith<_$MessagePart_MentionImpl> get copyWith => - __$$MessagePart_MentionImplCopyWithImpl<_$MessagePart_MentionImpl>( - this, _$identity); - - @override - @optionalTypeArgs - TResult when({ - required TResult Function(String field0, TextFormat field1) text, - required TResult Function(Attachment field0) attachment, - required TResult Function(String field0, String field1) mention, - required TResult Function(String field0) object, - }) { - return mention(field0, field1); - } - @override - @optionalTypeArgs - TResult? whenOrNull({ - TResult? Function(String field0, TextFormat field1)? text, - TResult? Function(Attachment field0)? attachment, - TResult? Function(String field0, String field1)? mention, - TResult? Function(String field0)? object, - }) { - return mention?.call(field0, field1); - } - @override - @optionalTypeArgs - TResult maybeWhen({ - TResult Function(String field0, TextFormat field1)? text, - TResult Function(Attachment field0)? attachment, - TResult Function(String field0, String field1)? mention, - TResult Function(String field0)? object, - required TResult orElse(), - }) { - if (mention != null) { - return mention(field0, field1); - } - return orElse(); - } - @override - @optionalTypeArgs - TResult map({ - required TResult Function(MessagePart_Text value) text, - required TResult Function(MessagePart_Attachment value) attachment, - required TResult Function(MessagePart_Mention value) mention, - required TResult Function(MessagePart_Object value) object, - }) { - return mention(this); - } +} +/// @nodoc +class _$Message_ReactCopyWithImpl<$Res> + implements $Message_ReactCopyWith<$Res> { + _$Message_ReactCopyWithImpl(this._self, this._then); - @override - @optionalTypeArgs - TResult? mapOrNull({ - TResult? Function(MessagePart_Text value)? text, - TResult? Function(MessagePart_Attachment value)? attachment, - TResult? Function(MessagePart_Mention value)? mention, - TResult? Function(MessagePart_Object value)? object, - }) { - return mention?.call(this); - } + final Message_React _self; + final $Res Function(Message_React) _then; - @override - @optionalTypeArgs - TResult maybeMap({ - TResult Function(MessagePart_Text value)? text, - TResult Function(MessagePart_Attachment value)? attachment, - TResult Function(MessagePart_Mention value)? mention, - TResult Function(MessagePart_Object value)? object, - required TResult orElse(), - }) { - if (mention != null) { - return mention(this); - } - return orElse(); - } +/// Create a copy of Message +/// with the given fields replaced by the non-null parameter values. +@pragma('vm:prefer-inline') $Res call({Object? field0 = null,}) { + return _then(Message_React( +null == field0 ? _self.field0 : field0 // ignore: cast_nullable_to_non_nullable +as ReactMessage, + )); } -abstract class MessagePart_Mention extends MessagePart { - const factory MessagePart_Mention(final String field0, final String field1) = - _$MessagePart_MentionImpl; - const MessagePart_Mention._() : super._(); - - @override - String get field0; - String get field1; - - /// Create a copy of MessagePart - /// with the given fields replaced by the non-null parameter values. - @JsonKey(includeFromJson: false, includeToJson: false) - _$$MessagePart_MentionImplCopyWith<_$MessagePart_MentionImpl> get copyWith => - throw _privateConstructorUsedError; -} - -/// @nodoc -abstract class _$$MessagePart_ObjectImplCopyWith<$Res> { - factory _$$MessagePart_ObjectImplCopyWith(_$MessagePart_ObjectImpl value, - $Res Function(_$MessagePart_ObjectImpl) then) = - __$$MessagePart_ObjectImplCopyWithImpl<$Res>; - @useResult - $Res call({String field0}); -} - -/// @nodoc -class __$$MessagePart_ObjectImplCopyWithImpl<$Res> - extends _$MessagePartCopyWithImpl<$Res, _$MessagePart_ObjectImpl> - implements _$$MessagePart_ObjectImplCopyWith<$Res> { - __$$MessagePart_ObjectImplCopyWithImpl(_$MessagePart_ObjectImpl _value, - $Res Function(_$MessagePart_ObjectImpl) _then) - : super(_value, _then); - - /// Create a copy of MessagePart - /// with the given fields replaced by the non-null parameter values. - @pragma('vm:prefer-inline') - @override - $Res call({ - Object? field0 = null, - }) { - return _then(_$MessagePart_ObjectImpl( - null == field0 - ? _value.field0 - : field0 // ignore: cast_nullable_to_non_nullable - as String, - )); - } + } /// @nodoc -class _$MessagePart_ObjectImpl extends MessagePart_Object { - const _$MessagePart_ObjectImpl(this.field0) : super._(); - @override - final String field0; +class Message_Delivered extends Message { + const Message_Delivered(): super._(); - @override - String toString() { - return 'MessagePart.object(field0: $field0)'; - } - - @override - bool operator ==(Object other) { - return identical(this, other) || - (other.runtimeType == runtimeType && - other is _$MessagePart_ObjectImpl && - (identical(other.field0, field0) || other.field0 == field0)); - } - @override - int get hashCode => Object.hash(runtimeType, field0); - - /// Create a copy of MessagePart - /// with the given fields replaced by the non-null parameter values. - @JsonKey(includeFromJson: false, includeToJson: false) - @override - @pragma('vm:prefer-inline') - _$$MessagePart_ObjectImplCopyWith<_$MessagePart_ObjectImpl> get copyWith => - __$$MessagePart_ObjectImplCopyWithImpl<_$MessagePart_ObjectImpl>( - this, _$identity); - - @override - @optionalTypeArgs - TResult when({ - required TResult Function(String field0, TextFormat field1) text, - required TResult Function(Attachment field0) attachment, - required TResult Function(String field0, String field1) mention, - required TResult Function(String field0) object, - }) { - return object(field0); - } - @override - @optionalTypeArgs - TResult? whenOrNull({ - TResult? Function(String field0, TextFormat field1)? text, - TResult? Function(Attachment field0)? attachment, - TResult? Function(String field0, String field1)? mention, - TResult? Function(String field0)? object, - }) { - return object?.call(field0); - } - @override - @optionalTypeArgs - TResult maybeWhen({ - TResult Function(String field0, TextFormat field1)? text, - TResult Function(Attachment field0)? attachment, - TResult Function(String field0, String field1)? mention, - TResult Function(String field0)? object, - required TResult orElse(), - }) { - if (object != null) { - return object(field0); - } - return orElse(); - } - @override - @optionalTypeArgs - TResult map({ - required TResult Function(MessagePart_Text value) text, - required TResult Function(MessagePart_Attachment value) attachment, - required TResult Function(MessagePart_Mention value) mention, - required TResult Function(MessagePart_Object value) object, - }) { - return object(this); - } - @override - @optionalTypeArgs - TResult? mapOrNull({ - TResult? Function(MessagePart_Text value)? text, - TResult? Function(MessagePart_Attachment value)? attachment, - TResult? Function(MessagePart_Mention value)? mention, - TResult? Function(MessagePart_Object value)? object, - }) { - return object?.call(this); - } - @override - @optionalTypeArgs - TResult maybeMap({ - TResult Function(MessagePart_Text value)? text, - TResult Function(MessagePart_Attachment value)? attachment, - TResult Function(MessagePart_Mention value)? mention, - TResult Function(MessagePart_Object value)? object, - required TResult orElse(), - }) { - if (object != null) { - return object(this); - } - return orElse(); - } +@override +bool operator ==(Object other) { + return identical(this, other) || (other.runtimeType == runtimeType&&other is Message_Delivered); } -abstract class MessagePart_Object extends MessagePart { - const factory MessagePart_Object(final String field0) = - _$MessagePart_ObjectImpl; - const MessagePart_Object._() : super._(); - @override - String get field0; +@override +int get hashCode => runtimeType.hashCode; - /// Create a copy of MessagePart - /// with the given fields replaced by the non-null parameter values. - @JsonKey(includeFromJson: false, includeToJson: false) - _$$MessagePart_ObjectImplCopyWith<_$MessagePart_ObjectImpl> get copyWith => - throw _privateConstructorUsedError; +@override +String toString() { + return 'Message.delivered()'; } -/// @nodoc -mixin _$MessageTarget { - Object get field0 => throw _privateConstructorUsedError; - @optionalTypeArgs - TResult when({ - required TResult Function(Uint8List field0) token, - required TResult Function(String field0) uuid, - }) => - throw _privateConstructorUsedError; - @optionalTypeArgs - TResult? whenOrNull({ - TResult? Function(Uint8List field0)? token, - TResult? Function(String field0)? uuid, - }) => - throw _privateConstructorUsedError; - @optionalTypeArgs - TResult maybeWhen({ - TResult Function(Uint8List field0)? token, - TResult Function(String field0)? uuid, - required TResult orElse(), - }) => - throw _privateConstructorUsedError; - @optionalTypeArgs - TResult map({ - required TResult Function(MessageTarget_Token value) token, - required TResult Function(MessageTarget_Uuid value) uuid, - }) => - throw _privateConstructorUsedError; - @optionalTypeArgs - TResult? mapOrNull({ - TResult? Function(MessageTarget_Token value)? token, - TResult? Function(MessageTarget_Uuid value)? uuid, - }) => - throw _privateConstructorUsedError; - @optionalTypeArgs - TResult maybeMap({ - TResult Function(MessageTarget_Token value)? token, - TResult Function(MessageTarget_Uuid value)? uuid, - required TResult orElse(), - }) => - throw _privateConstructorUsedError; -} - -/// @nodoc -abstract class $MessageTargetCopyWith<$Res> { - factory $MessageTargetCopyWith( - MessageTarget value, $Res Function(MessageTarget) then) = - _$MessageTargetCopyWithImpl<$Res, MessageTarget>; -} - -/// @nodoc -class _$MessageTargetCopyWithImpl<$Res, $Val extends MessageTarget> - implements $MessageTargetCopyWith<$Res> { - _$MessageTargetCopyWithImpl(this._value, this._then); - - // ignore: unused_field - final $Val _value; - // ignore: unused_field - final $Res Function($Val) _then; - - /// Create a copy of MessageTarget - /// with the given fields replaced by the non-null parameter values. -} - -/// @nodoc -abstract class _$$MessageTarget_TokenImplCopyWith<$Res> { - factory _$$MessageTarget_TokenImplCopyWith(_$MessageTarget_TokenImpl value, - $Res Function(_$MessageTarget_TokenImpl) then) = - __$$MessageTarget_TokenImplCopyWithImpl<$Res>; - @useResult - $Res call({Uint8List field0}); -} - -/// @nodoc -class __$$MessageTarget_TokenImplCopyWithImpl<$Res> - extends _$MessageTargetCopyWithImpl<$Res, _$MessageTarget_TokenImpl> - implements _$$MessageTarget_TokenImplCopyWith<$Res> { - __$$MessageTarget_TokenImplCopyWithImpl(_$MessageTarget_TokenImpl _value, - $Res Function(_$MessageTarget_TokenImpl) _then) - : super(_value, _then); - - /// Create a copy of MessageTarget - /// with the given fields replaced by the non-null parameter values. - @pragma('vm:prefer-inline') - @override - $Res call({ - Object? field0 = null, - }) { - return _then(_$MessageTarget_TokenImpl( - null == field0 - ? _value.field0 - : field0 // ignore: cast_nullable_to_non_nullable - as Uint8List, - )); - } + } -/// @nodoc -class _$MessageTarget_TokenImpl extends MessageTarget_Token { - const _$MessageTarget_TokenImpl(this.field0) : super._(); - @override - final Uint8List field0; - @override - String toString() { - return 'MessageTarget.token(field0: $field0)'; - } +/// @nodoc - @override - bool operator ==(Object other) { - return identical(this, other) || - (other.runtimeType == runtimeType && - other is _$MessageTarget_TokenImpl && - const DeepCollectionEquality().equals(other.field0, field0)); - } - @override - int get hashCode => - Object.hash(runtimeType, const DeepCollectionEquality().hash(field0)); - - /// Create a copy of MessageTarget - /// with the given fields replaced by the non-null parameter values. - @JsonKey(includeFromJson: false, includeToJson: false) - @override - @pragma('vm:prefer-inline') - _$$MessageTarget_TokenImplCopyWith<_$MessageTarget_TokenImpl> get copyWith => - __$$MessageTarget_TokenImplCopyWithImpl<_$MessageTarget_TokenImpl>( - this, _$identity); - - @override - @optionalTypeArgs - TResult when({ - required TResult Function(Uint8List field0) token, - required TResult Function(String field0) uuid, - }) { - return token(field0); - } +class Message_Read extends Message { + const Message_Read(): super._(); - @override - @optionalTypeArgs - TResult? whenOrNull({ - TResult? Function(Uint8List field0)? token, - TResult? Function(String field0)? uuid, - }) { - return token?.call(field0); - } - @override - @optionalTypeArgs - TResult maybeWhen({ - TResult Function(Uint8List field0)? token, - TResult Function(String field0)? uuid, - required TResult orElse(), - }) { - if (token != null) { - return token(field0); - } - return orElse(); - } - @override - @optionalTypeArgs - TResult map({ - required TResult Function(MessageTarget_Token value) token, - required TResult Function(MessageTarget_Uuid value) uuid, - }) { - return token(this); - } - @override - @optionalTypeArgs - TResult? mapOrNull({ - TResult? Function(MessageTarget_Token value)? token, - TResult? Function(MessageTarget_Uuid value)? uuid, - }) { - return token?.call(this); - } - @override - @optionalTypeArgs - TResult maybeMap({ - TResult Function(MessageTarget_Token value)? token, - TResult Function(MessageTarget_Uuid value)? uuid, - required TResult orElse(), - }) { - if (token != null) { - return token(this); - } - return orElse(); - } + + +@override +bool operator ==(Object other) { + return identical(this, other) || (other.runtimeType == runtimeType&&other is Message_Read); } -abstract class MessageTarget_Token extends MessageTarget { - const factory MessageTarget_Token(final Uint8List field0) = - _$MessageTarget_TokenImpl; - const MessageTarget_Token._() : super._(); - @override - Uint8List get field0; +@override +int get hashCode => runtimeType.hashCode; - /// Create a copy of MessageTarget - /// with the given fields replaced by the non-null parameter values. - @JsonKey(includeFromJson: false, includeToJson: false) - _$$MessageTarget_TokenImplCopyWith<_$MessageTarget_TokenImpl> get copyWith => - throw _privateConstructorUsedError; +@override +String toString() { + return 'Message.read()'; } -/// @nodoc -abstract class _$$MessageTarget_UuidImplCopyWith<$Res> { - factory _$$MessageTarget_UuidImplCopyWith(_$MessageTarget_UuidImpl value, - $Res Function(_$MessageTarget_UuidImpl) then) = - __$$MessageTarget_UuidImplCopyWithImpl<$Res>; - @useResult - $Res call({String field0}); + } -/// @nodoc -class __$$MessageTarget_UuidImplCopyWithImpl<$Res> - extends _$MessageTargetCopyWithImpl<$Res, _$MessageTarget_UuidImpl> - implements _$$MessageTarget_UuidImplCopyWith<$Res> { - __$$MessageTarget_UuidImplCopyWithImpl(_$MessageTarget_UuidImpl _value, - $Res Function(_$MessageTarget_UuidImpl) _then) - : super(_value, _then); - /// Create a copy of MessageTarget - /// with the given fields replaced by the non-null parameter values. - @pragma('vm:prefer-inline') - @override - $Res call({ - Object? field0 = null, - }) { - return _then(_$MessageTarget_UuidImpl( - null == field0 - ? _value.field0 - : field0 // ignore: cast_nullable_to_non_nullable - as String, - )); - } -} + /// @nodoc -class _$MessageTarget_UuidImpl extends MessageTarget_Uuid { - const _$MessageTarget_UuidImpl(this.field0) : super._(); - @override - final String field0; +class Message_Typing extends Message { + const Message_Typing(this.field0, [this.field1]): super._(); - @override - String toString() { - return 'MessageTarget.uuid(field0: $field0)'; - } - @override - bool operator ==(Object other) { - return identical(this, other) || - (other.runtimeType == runtimeType && - other is _$MessageTarget_UuidImpl && - (identical(other.field0, field0) || other.field0 == field0)); - } + final bool field0; + final TypingApp? field1; - @override - int get hashCode => Object.hash(runtimeType, field0); - - /// Create a copy of MessageTarget - /// with the given fields replaced by the non-null parameter values. - @JsonKey(includeFromJson: false, includeToJson: false) - @override - @pragma('vm:prefer-inline') - _$$MessageTarget_UuidImplCopyWith<_$MessageTarget_UuidImpl> get copyWith => - __$$MessageTarget_UuidImplCopyWithImpl<_$MessageTarget_UuidImpl>( - this, _$identity); - - @override - @optionalTypeArgs - TResult when({ - required TResult Function(Uint8List field0) token, - required TResult Function(String field0) uuid, - }) { - return uuid(field0); - } +/// Create a copy of Message +/// with the given fields replaced by the non-null parameter values. +@JsonKey(includeFromJson: false, includeToJson: false) +@pragma('vm:prefer-inline') +$Message_TypingCopyWith get copyWith => _$Message_TypingCopyWithImpl(this, _$identity); - @override - @optionalTypeArgs - TResult? whenOrNull({ - TResult? Function(Uint8List field0)? token, - TResult? Function(String field0)? uuid, - }) { - return uuid?.call(field0); - } - @override - @optionalTypeArgs - TResult maybeWhen({ - TResult Function(Uint8List field0)? token, - TResult Function(String field0)? uuid, - required TResult orElse(), - }) { - if (uuid != null) { - return uuid(field0); - } - return orElse(); - } - @override - @optionalTypeArgs - TResult map({ - required TResult Function(MessageTarget_Token value) token, - required TResult Function(MessageTarget_Uuid value) uuid, - }) { - return uuid(this); - } +@override +bool operator ==(Object other) { + return identical(this, other) || (other.runtimeType == runtimeType&&other is Message_Typing&&(identical(other.field0, field0) || other.field0 == field0)&&(identical(other.field1, field1) || other.field1 == field1)); +} - @override - @optionalTypeArgs - TResult? mapOrNull({ - TResult? Function(MessageTarget_Token value)? token, - TResult? Function(MessageTarget_Uuid value)? uuid, - }) { - return uuid?.call(this); - } - @override - @optionalTypeArgs - TResult maybeMap({ - TResult Function(MessageTarget_Token value)? token, - TResult Function(MessageTarget_Uuid value)? uuid, - required TResult orElse(), - }) { - if (uuid != null) { - return uuid(this); - } - return orElse(); - } -} +@override +int get hashCode => Object.hash(runtimeType,field0,field1); -abstract class MessageTarget_Uuid extends MessageTarget { - const factory MessageTarget_Uuid(final String field0) = - _$MessageTarget_UuidImpl; - const MessageTarget_Uuid._() : super._(); +@override +String toString() { + return 'Message.typing(field0: $field0, field1: $field1)'; +} - @override - String get field0; - /// Create a copy of MessageTarget - /// with the given fields replaced by the non-null parameter values. - @JsonKey(includeFromJson: false, includeToJson: false) - _$$MessageTarget_UuidImplCopyWith<_$MessageTarget_UuidImpl> get copyWith => - throw _privateConstructorUsedError; } /// @nodoc -mixin _$MessageType { - @optionalTypeArgs - TResult when({ - required TResult Function() iMessage, - required TResult Function( - bool isPhone, String usingNumber, String? fromHandle) - sms, - }) => - throw _privateConstructorUsedError; - @optionalTypeArgs - TResult? whenOrNull({ - TResult? Function()? iMessage, - TResult? Function(bool isPhone, String usingNumber, String? fromHandle)? - sms, - }) => - throw _privateConstructorUsedError; - @optionalTypeArgs - TResult maybeWhen({ - TResult Function()? iMessage, - TResult Function(bool isPhone, String usingNumber, String? fromHandle)? sms, - required TResult orElse(), - }) => - throw _privateConstructorUsedError; - @optionalTypeArgs - TResult map({ - required TResult Function(MessageType_IMessage value) iMessage, - required TResult Function(MessageType_SMS value) sms, - }) => - throw _privateConstructorUsedError; - @optionalTypeArgs - TResult? mapOrNull({ - TResult? Function(MessageType_IMessage value)? iMessage, - TResult? Function(MessageType_SMS value)? sms, - }) => - throw _privateConstructorUsedError; - @optionalTypeArgs - TResult maybeMap({ - TResult Function(MessageType_IMessage value)? iMessage, - TResult Function(MessageType_SMS value)? sms, - required TResult orElse(), - }) => - throw _privateConstructorUsedError; -} - -/// @nodoc -abstract class $MessageTypeCopyWith<$Res> { - factory $MessageTypeCopyWith( - MessageType value, $Res Function(MessageType) then) = - _$MessageTypeCopyWithImpl<$Res, MessageType>; -} - -/// @nodoc -class _$MessageTypeCopyWithImpl<$Res, $Val extends MessageType> - implements $MessageTypeCopyWith<$Res> { - _$MessageTypeCopyWithImpl(this._value, this._then); - - // ignore: unused_field - final $Val _value; - // ignore: unused_field - final $Res Function($Val) _then; - - /// Create a copy of MessageType - /// with the given fields replaced by the non-null parameter values. -} - -/// @nodoc -abstract class _$$MessageType_IMessageImplCopyWith<$Res> { - factory _$$MessageType_IMessageImplCopyWith(_$MessageType_IMessageImpl value, - $Res Function(_$MessageType_IMessageImpl) then) = - __$$MessageType_IMessageImplCopyWithImpl<$Res>; -} - -/// @nodoc -class __$$MessageType_IMessageImplCopyWithImpl<$Res> - extends _$MessageTypeCopyWithImpl<$Res, _$MessageType_IMessageImpl> - implements _$$MessageType_IMessageImplCopyWith<$Res> { - __$$MessageType_IMessageImplCopyWithImpl(_$MessageType_IMessageImpl _value, - $Res Function(_$MessageType_IMessageImpl) _then) - : super(_value, _then); - - /// Create a copy of MessageType - /// with the given fields replaced by the non-null parameter values. -} - -/// @nodoc - -class _$MessageType_IMessageImpl extends MessageType_IMessage { - const _$MessageType_IMessageImpl() : super._(); - - @override - String toString() { - return 'MessageType.iMessage()'; - } +abstract mixin class $Message_TypingCopyWith<$Res> implements $MessageCopyWith<$Res> { + factory $Message_TypingCopyWith(Message_Typing value, $Res Function(Message_Typing) _then) = _$Message_TypingCopyWithImpl; +@useResult +$Res call({ + bool field0, TypingApp? field1 +}); - @override - bool operator ==(Object other) { - return identical(this, other) || - (other.runtimeType == runtimeType && - other is _$MessageType_IMessageImpl); - } - - @override - int get hashCode => runtimeType.hashCode; - - @override - @optionalTypeArgs - TResult when({ - required TResult Function() iMessage, - required TResult Function( - bool isPhone, String usingNumber, String? fromHandle) - sms, - }) { - return iMessage(); - } - @override - @optionalTypeArgs - TResult? whenOrNull({ - TResult? Function()? iMessage, - TResult? Function(bool isPhone, String usingNumber, String? fromHandle)? - sms, - }) { - return iMessage?.call(); - } - @override - @optionalTypeArgs - TResult maybeWhen({ - TResult Function()? iMessage, - TResult Function(bool isPhone, String usingNumber, String? fromHandle)? sms, - required TResult orElse(), - }) { - if (iMessage != null) { - return iMessage(); - } - return orElse(); - } - @override - @optionalTypeArgs - TResult map({ - required TResult Function(MessageType_IMessage value) iMessage, - required TResult Function(MessageType_SMS value) sms, - }) { - return iMessage(this); - } +} +/// @nodoc +class _$Message_TypingCopyWithImpl<$Res> + implements $Message_TypingCopyWith<$Res> { + _$Message_TypingCopyWithImpl(this._self, this._then); - @override - @optionalTypeArgs - TResult? mapOrNull({ - TResult? Function(MessageType_IMessage value)? iMessage, - TResult? Function(MessageType_SMS value)? sms, - }) { - return iMessage?.call(this); - } + final Message_Typing _self; + final $Res Function(Message_Typing) _then; - @override - @optionalTypeArgs - TResult maybeMap({ - TResult Function(MessageType_IMessage value)? iMessage, - TResult Function(MessageType_SMS value)? sms, - required TResult orElse(), - }) { - if (iMessage != null) { - return iMessage(this); - } - return orElse(); - } +/// Create a copy of Message +/// with the given fields replaced by the non-null parameter values. +@pragma('vm:prefer-inline') $Res call({Object? field0 = null,Object? field1 = freezed,}) { + return _then(Message_Typing( +null == field0 ? _self.field0 : field0 // ignore: cast_nullable_to_non_nullable +as bool,freezed == field1 ? _self.field1 : field1 // ignore: cast_nullable_to_non_nullable +as TypingApp?, + )); } -abstract class MessageType_IMessage extends MessageType { - const factory MessageType_IMessage() = _$MessageType_IMessageImpl; - const MessageType_IMessage._() : super._(); -} - -/// @nodoc -abstract class _$$MessageType_SMSImplCopyWith<$Res> { - factory _$$MessageType_SMSImplCopyWith(_$MessageType_SMSImpl value, - $Res Function(_$MessageType_SMSImpl) then) = - __$$MessageType_SMSImplCopyWithImpl<$Res>; - @useResult - $Res call({bool isPhone, String usingNumber, String? fromHandle}); -} - -/// @nodoc -class __$$MessageType_SMSImplCopyWithImpl<$Res> - extends _$MessageTypeCopyWithImpl<$Res, _$MessageType_SMSImpl> - implements _$$MessageType_SMSImplCopyWith<$Res> { - __$$MessageType_SMSImplCopyWithImpl( - _$MessageType_SMSImpl _value, $Res Function(_$MessageType_SMSImpl) _then) - : super(_value, _then); - - /// Create a copy of MessageType - /// with the given fields replaced by the non-null parameter values. - @pragma('vm:prefer-inline') - @override - $Res call({ - Object? isPhone = null, - Object? usingNumber = null, - Object? fromHandle = freezed, - }) { - return _then(_$MessageType_SMSImpl( - isPhone: null == isPhone - ? _value.isPhone - : isPhone // ignore: cast_nullable_to_non_nullable - as bool, - usingNumber: null == usingNumber - ? _value.usingNumber - : usingNumber // ignore: cast_nullable_to_non_nullable - as String, - fromHandle: freezed == fromHandle - ? _value.fromHandle - : fromHandle // ignore: cast_nullable_to_non_nullable - as String?, - )); - } + } /// @nodoc -class _$MessageType_SMSImpl extends MessageType_SMS { - const _$MessageType_SMSImpl( - {required this.isPhone, required this.usingNumber, this.fromHandle}) - : super._(); - @override - final bool isPhone; - @override - final String usingNumber; - @override - final String? fromHandle; +class Message_Unsend extends Message { + const Message_Unsend(this.field0): super._(); - @override - String toString() { - return 'MessageType.sms(isPhone: $isPhone, usingNumber: $usingNumber, fromHandle: $fromHandle)'; - } - @override - bool operator ==(Object other) { - return identical(this, other) || - (other.runtimeType == runtimeType && - other is _$MessageType_SMSImpl && - (identical(other.isPhone, isPhone) || other.isPhone == isPhone) && - (identical(other.usingNumber, usingNumber) || - other.usingNumber == usingNumber) && - (identical(other.fromHandle, fromHandle) || - other.fromHandle == fromHandle)); - } + final UnsendMessage field0; - @override - int get hashCode => - Object.hash(runtimeType, isPhone, usingNumber, fromHandle); - - /// Create a copy of MessageType - /// with the given fields replaced by the non-null parameter values. - @JsonKey(includeFromJson: false, includeToJson: false) - @override - @pragma('vm:prefer-inline') - _$$MessageType_SMSImplCopyWith<_$MessageType_SMSImpl> get copyWith => - __$$MessageType_SMSImplCopyWithImpl<_$MessageType_SMSImpl>( - this, _$identity); - - @override - @optionalTypeArgs - TResult when({ - required TResult Function() iMessage, - required TResult Function( - bool isPhone, String usingNumber, String? fromHandle) - sms, - }) { - return sms(isPhone, usingNumber, fromHandle); - } +/// Create a copy of Message +/// with the given fields replaced by the non-null parameter values. +@JsonKey(includeFromJson: false, includeToJson: false) +@pragma('vm:prefer-inline') +$Message_UnsendCopyWith get copyWith => _$Message_UnsendCopyWithImpl(this, _$identity); - @override - @optionalTypeArgs - TResult? whenOrNull({ - TResult? Function()? iMessage, - TResult? Function(bool isPhone, String usingNumber, String? fromHandle)? - sms, - }) { - return sms?.call(isPhone, usingNumber, fromHandle); - } - @override - @optionalTypeArgs - TResult maybeWhen({ - TResult Function()? iMessage, - TResult Function(bool isPhone, String usingNumber, String? fromHandle)? sms, - required TResult orElse(), - }) { - if (sms != null) { - return sms(isPhone, usingNumber, fromHandle); - } - return orElse(); - } - @override - @optionalTypeArgs - TResult map({ - required TResult Function(MessageType_IMessage value) iMessage, - required TResult Function(MessageType_SMS value) sms, - }) { - return sms(this); - } +@override +bool operator ==(Object other) { + return identical(this, other) || (other.runtimeType == runtimeType&&other is Message_Unsend&&(identical(other.field0, field0) || other.field0 == field0)); +} - @override - @optionalTypeArgs - TResult? mapOrNull({ - TResult? Function(MessageType_IMessage value)? iMessage, - TResult? Function(MessageType_SMS value)? sms, - }) { - return sms?.call(this); - } - @override - @optionalTypeArgs - TResult maybeMap({ - TResult Function(MessageType_IMessage value)? iMessage, - TResult Function(MessageType_SMS value)? sms, - required TResult orElse(), - }) { - if (sms != null) { - return sms(this); - } - return orElse(); - } -} +@override +int get hashCode => Object.hash(runtimeType,field0); -abstract class MessageType_SMS extends MessageType { - const factory MessageType_SMS( - {required final bool isPhone, - required final String usingNumber, - final String? fromHandle}) = _$MessageType_SMSImpl; - const MessageType_SMS._() : super._(); +@override +String toString() { + return 'Message.unsend(field0: $field0)'; +} - bool get isPhone; - String get usingNumber; - String? get fromHandle; - /// Create a copy of MessageType - /// with the given fields replaced by the non-null parameter values. - @JsonKey(includeFromJson: false, includeToJson: false) - _$$MessageType_SMSImplCopyWith<_$MessageType_SMSImpl> get copyWith => - throw _privateConstructorUsedError; } /// @nodoc -mixin _$NumOrString { - Object get field0 => throw _privateConstructorUsedError; - @optionalTypeArgs - TResult when({ - required TResult Function(int field0) num, - required TResult Function(String field0) string, - required TResult Function(bool field0) bool, - }) => - throw _privateConstructorUsedError; - @optionalTypeArgs - TResult? whenOrNull({ - TResult? Function(int field0)? num, - TResult? Function(String field0)? string, - TResult? Function(bool field0)? bool, - }) => - throw _privateConstructorUsedError; - @optionalTypeArgs - TResult maybeWhen({ - TResult Function(int field0)? num, - TResult Function(String field0)? string, - TResult Function(bool field0)? bool, - required TResult orElse(), - }) => - throw _privateConstructorUsedError; - @optionalTypeArgs - TResult map({ - required TResult Function(NumOrString_Num value) num, - required TResult Function(NumOrString_String value) string, - required TResult Function(NumOrString_Bool value) bool, - }) => - throw _privateConstructorUsedError; - @optionalTypeArgs - TResult? mapOrNull({ - TResult? Function(NumOrString_Num value)? num, - TResult? Function(NumOrString_String value)? string, - TResult? Function(NumOrString_Bool value)? bool, - }) => - throw _privateConstructorUsedError; - @optionalTypeArgs - TResult maybeMap({ - TResult Function(NumOrString_Num value)? num, - TResult Function(NumOrString_String value)? string, - TResult Function(NumOrString_Bool value)? bool, - required TResult orElse(), - }) => - throw _privateConstructorUsedError; -} - -/// @nodoc -abstract class $NumOrStringCopyWith<$Res> { - factory $NumOrStringCopyWith( - NumOrString value, $Res Function(NumOrString) then) = - _$NumOrStringCopyWithImpl<$Res, NumOrString>; -} - -/// @nodoc -class _$NumOrStringCopyWithImpl<$Res, $Val extends NumOrString> - implements $NumOrStringCopyWith<$Res> { - _$NumOrStringCopyWithImpl(this._value, this._then); - - // ignore: unused_field - final $Val _value; - // ignore: unused_field - final $Res Function($Val) _then; - - /// Create a copy of NumOrString - /// with the given fields replaced by the non-null parameter values. -} - -/// @nodoc -abstract class _$$NumOrString_NumImplCopyWith<$Res> { - factory _$$NumOrString_NumImplCopyWith(_$NumOrString_NumImpl value, - $Res Function(_$NumOrString_NumImpl) then) = - __$$NumOrString_NumImplCopyWithImpl<$Res>; - @useResult - $Res call({int field0}); -} - -/// @nodoc -class __$$NumOrString_NumImplCopyWithImpl<$Res> - extends _$NumOrStringCopyWithImpl<$Res, _$NumOrString_NumImpl> - implements _$$NumOrString_NumImplCopyWith<$Res> { - __$$NumOrString_NumImplCopyWithImpl( - _$NumOrString_NumImpl _value, $Res Function(_$NumOrString_NumImpl) _then) - : super(_value, _then); - - /// Create a copy of NumOrString - /// with the given fields replaced by the non-null parameter values. - @pragma('vm:prefer-inline') - @override - $Res call({ - Object? field0 = null, - }) { - return _then(_$NumOrString_NumImpl( - null == field0 - ? _value.field0 - : field0 // ignore: cast_nullable_to_non_nullable - as int, - )); - } -} +abstract mixin class $Message_UnsendCopyWith<$Res> implements $MessageCopyWith<$Res> { + factory $Message_UnsendCopyWith(Message_Unsend value, $Res Function(Message_Unsend) _then) = _$Message_UnsendCopyWithImpl; +@useResult +$Res call({ + UnsendMessage field0 +}); + + + +} /// @nodoc +class _$Message_UnsendCopyWithImpl<$Res> + implements $Message_UnsendCopyWith<$Res> { + _$Message_UnsendCopyWithImpl(this._self, this._then); -class _$NumOrString_NumImpl extends NumOrString_Num { - const _$NumOrString_NumImpl(this.field0) : super._(); + final Message_Unsend _self; + final $Res Function(Message_Unsend) _then; - @override - final int field0; +/// Create a copy of Message +/// with the given fields replaced by the non-null parameter values. +@pragma('vm:prefer-inline') $Res call({Object? field0 = null,}) { + return _then(Message_Unsend( +null == field0 ? _self.field0 : field0 // ignore: cast_nullable_to_non_nullable +as UnsendMessage, + )); +} - @override - String toString() { - return 'NumOrString.num(field0: $field0)'; - } - @override - bool operator ==(Object other) { - return identical(this, other) || - (other.runtimeType == runtimeType && - other is _$NumOrString_NumImpl && - (identical(other.field0, field0) || other.field0 == field0)); - } +} - @override - int get hashCode => Object.hash(runtimeType, field0); - - /// Create a copy of NumOrString - /// with the given fields replaced by the non-null parameter values. - @JsonKey(includeFromJson: false, includeToJson: false) - @override - @pragma('vm:prefer-inline') - _$$NumOrString_NumImplCopyWith<_$NumOrString_NumImpl> get copyWith => - __$$NumOrString_NumImplCopyWithImpl<_$NumOrString_NumImpl>( - this, _$identity); - - @override - @optionalTypeArgs - TResult when({ - required TResult Function(int field0) num, - required TResult Function(String field0) string, - required TResult Function(bool field0) bool, - }) { - return num(field0); - } +/// @nodoc - @override - @optionalTypeArgs - TResult? whenOrNull({ - TResult? Function(int field0)? num, - TResult? Function(String field0)? string, - TResult? Function(bool field0)? bool, - }) { - return num?.call(field0); - } - @override - @optionalTypeArgs - TResult maybeWhen({ - TResult Function(int field0)? num, - TResult Function(String field0)? string, - TResult Function(bool field0)? bool, - required TResult orElse(), - }) { - if (num != null) { - return num(field0); - } - return orElse(); - } +class Message_Edit extends Message { + const Message_Edit(this.field0): super._(); - @override - @optionalTypeArgs - TResult map({ - required TResult Function(NumOrString_Num value) num, - required TResult Function(NumOrString_String value) string, - required TResult Function(NumOrString_Bool value) bool, - }) { - return num(this); - } - @override - @optionalTypeArgs - TResult? mapOrNull({ - TResult? Function(NumOrString_Num value)? num, - TResult? Function(NumOrString_String value)? string, - TResult? Function(NumOrString_Bool value)? bool, - }) { - return num?.call(this); - } + final EditMessage field0; - @override - @optionalTypeArgs - TResult maybeMap({ - TResult Function(NumOrString_Num value)? num, - TResult Function(NumOrString_String value)? string, - TResult Function(NumOrString_Bool value)? bool, - required TResult orElse(), - }) { - if (num != null) { - return num(this); - } - return orElse(); - } +/// Create a copy of Message +/// with the given fields replaced by the non-null parameter values. +@JsonKey(includeFromJson: false, includeToJson: false) +@pragma('vm:prefer-inline') +$Message_EditCopyWith get copyWith => _$Message_EditCopyWithImpl(this, _$identity); + + + +@override +bool operator ==(Object other) { + return identical(this, other) || (other.runtimeType == runtimeType&&other is Message_Edit&&(identical(other.field0, field0) || other.field0 == field0)); } -abstract class NumOrString_Num extends NumOrString { - const factory NumOrString_Num(final int field0) = _$NumOrString_NumImpl; - const NumOrString_Num._() : super._(); - @override - int get field0; +@override +int get hashCode => Object.hash(runtimeType,field0); - /// Create a copy of NumOrString - /// with the given fields replaced by the non-null parameter values. - @JsonKey(includeFromJson: false, includeToJson: false) - _$$NumOrString_NumImplCopyWith<_$NumOrString_NumImpl> get copyWith => - throw _privateConstructorUsedError; +@override +String toString() { + return 'Message.edit(field0: $field0)'; } -/// @nodoc -abstract class _$$NumOrString_StringImplCopyWith<$Res> { - factory _$$NumOrString_StringImplCopyWith(_$NumOrString_StringImpl value, - $Res Function(_$NumOrString_StringImpl) then) = - __$$NumOrString_StringImplCopyWithImpl<$Res>; - @useResult - $Res call({String field0}); + } /// @nodoc -class __$$NumOrString_StringImplCopyWithImpl<$Res> - extends _$NumOrStringCopyWithImpl<$Res, _$NumOrString_StringImpl> - implements _$$NumOrString_StringImplCopyWith<$Res> { - __$$NumOrString_StringImplCopyWithImpl(_$NumOrString_StringImpl _value, - $Res Function(_$NumOrString_StringImpl) _then) - : super(_value, _then); +abstract mixin class $Message_EditCopyWith<$Res> implements $MessageCopyWith<$Res> { + factory $Message_EditCopyWith(Message_Edit value, $Res Function(Message_Edit) _then) = _$Message_EditCopyWithImpl; +@useResult +$Res call({ + EditMessage field0 +}); - /// Create a copy of NumOrString - /// with the given fields replaced by the non-null parameter values. - @pragma('vm:prefer-inline') - @override - $Res call({ - Object? field0 = null, - }) { - return _then(_$NumOrString_StringImpl( - null == field0 - ? _value.field0 - : field0 // ignore: cast_nullable_to_non_nullable - as String, - )); - } -} + + +} /// @nodoc +class _$Message_EditCopyWithImpl<$Res> + implements $Message_EditCopyWith<$Res> { + _$Message_EditCopyWithImpl(this._self, this._then); + + final Message_Edit _self; + final $Res Function(Message_Edit) _then; -class _$NumOrString_StringImpl extends NumOrString_String { - const _$NumOrString_StringImpl(this.field0) : super._(); +/// Create a copy of Message +/// with the given fields replaced by the non-null parameter values. +@pragma('vm:prefer-inline') $Res call({Object? field0 = null,}) { + return _then(Message_Edit( +null == field0 ? _self.field0 : field0 // ignore: cast_nullable_to_non_nullable +as EditMessage, + )); +} - @override - final String field0; - @override - String toString() { - return 'NumOrString.string(field0: $field0)'; - } +} - @override - bool operator ==(Object other) { - return identical(this, other) || - (other.runtimeType == runtimeType && - other is _$NumOrString_StringImpl && - (identical(other.field0, field0) || other.field0 == field0)); - } +/// @nodoc - @override - int get hashCode => Object.hash(runtimeType, field0); - - /// Create a copy of NumOrString - /// with the given fields replaced by the non-null parameter values. - @JsonKey(includeFromJson: false, includeToJson: false) - @override - @pragma('vm:prefer-inline') - _$$NumOrString_StringImplCopyWith<_$NumOrString_StringImpl> get copyWith => - __$$NumOrString_StringImplCopyWithImpl<_$NumOrString_StringImpl>( - this, _$identity); - - @override - @optionalTypeArgs - TResult when({ - required TResult Function(int field0) num, - required TResult Function(String field0) string, - required TResult Function(bool field0) bool, - }) { - return string(field0); - } - @override - @optionalTypeArgs - TResult? whenOrNull({ - TResult? Function(int field0)? num, - TResult? Function(String field0)? string, - TResult? Function(bool field0)? bool, - }) { - return string?.call(field0); - } +class Message_IconChange extends Message { + const Message_IconChange(this.field0): super._(); - @override - @optionalTypeArgs - TResult maybeWhen({ - TResult Function(int field0)? num, - TResult Function(String field0)? string, - TResult Function(bool field0)? bool, - required TResult orElse(), - }) { - if (string != null) { - return string(field0); - } - return orElse(); - } - @override - @optionalTypeArgs - TResult map({ - required TResult Function(NumOrString_Num value) num, - required TResult Function(NumOrString_String value) string, - required TResult Function(NumOrString_Bool value) bool, - }) { - return string(this); - } + final IconChangeMessage field0; - @override - @optionalTypeArgs - TResult? mapOrNull({ - TResult? Function(NumOrString_Num value)? num, - TResult? Function(NumOrString_String value)? string, - TResult? Function(NumOrString_Bool value)? bool, - }) { - return string?.call(this); - } +/// Create a copy of Message +/// with the given fields replaced by the non-null parameter values. +@JsonKey(includeFromJson: false, includeToJson: false) +@pragma('vm:prefer-inline') +$Message_IconChangeCopyWith get copyWith => _$Message_IconChangeCopyWithImpl(this, _$identity); - @override - @optionalTypeArgs - TResult maybeMap({ - TResult Function(NumOrString_Num value)? num, - TResult Function(NumOrString_String value)? string, - TResult Function(NumOrString_Bool value)? bool, - required TResult orElse(), - }) { - if (string != null) { - return string(this); - } - return orElse(); - } + + +@override +bool operator ==(Object other) { + return identical(this, other) || (other.runtimeType == runtimeType&&other is Message_IconChange&&(identical(other.field0, field0) || other.field0 == field0)); } -abstract class NumOrString_String extends NumOrString { - const factory NumOrString_String(final String field0) = - _$NumOrString_StringImpl; - const NumOrString_String._() : super._(); - @override - String get field0; +@override +int get hashCode => Object.hash(runtimeType,field0); - /// Create a copy of NumOrString - /// with the given fields replaced by the non-null parameter values. - @JsonKey(includeFromJson: false, includeToJson: false) - _$$NumOrString_StringImplCopyWith<_$NumOrString_StringImpl> get copyWith => - throw _privateConstructorUsedError; +@override +String toString() { + return 'Message.iconChange(field0: $field0)'; } -/// @nodoc -abstract class _$$NumOrString_BoolImplCopyWith<$Res> { - factory _$$NumOrString_BoolImplCopyWith(_$NumOrString_BoolImpl value, - $Res Function(_$NumOrString_BoolImpl) then) = - __$$NumOrString_BoolImplCopyWithImpl<$Res>; - @useResult - $Res call({bool field0}); + } /// @nodoc -class __$$NumOrString_BoolImplCopyWithImpl<$Res> - extends _$NumOrStringCopyWithImpl<$Res, _$NumOrString_BoolImpl> - implements _$$NumOrString_BoolImplCopyWith<$Res> { - __$$NumOrString_BoolImplCopyWithImpl(_$NumOrString_BoolImpl _value, - $Res Function(_$NumOrString_BoolImpl) _then) - : super(_value, _then); +abstract mixin class $Message_IconChangeCopyWith<$Res> implements $MessageCopyWith<$Res> { + factory $Message_IconChangeCopyWith(Message_IconChange value, $Res Function(Message_IconChange) _then) = _$Message_IconChangeCopyWithImpl; +@useResult +$Res call({ + IconChangeMessage field0 +}); + - /// Create a copy of NumOrString - /// with the given fields replaced by the non-null parameter values. - @pragma('vm:prefer-inline') - @override - $Res call({ - Object? field0 = null, - }) { - return _then(_$NumOrString_BoolImpl( - null == field0 - ? _value.field0 - : field0 // ignore: cast_nullable_to_non_nullable - as bool, - )); - } -} + +} /// @nodoc +class _$Message_IconChangeCopyWithImpl<$Res> + implements $Message_IconChangeCopyWith<$Res> { + _$Message_IconChangeCopyWithImpl(this._self, this._then); -class _$NumOrString_BoolImpl extends NumOrString_Bool { - const _$NumOrString_BoolImpl(this.field0) : super._(); + final Message_IconChange _self; + final $Res Function(Message_IconChange) _then; - @override - final bool field0; +/// Create a copy of Message +/// with the given fields replaced by the non-null parameter values. +@pragma('vm:prefer-inline') $Res call({Object? field0 = null,}) { + return _then(Message_IconChange( +null == field0 ? _self.field0 : field0 // ignore: cast_nullable_to_non_nullable +as IconChangeMessage, + )); +} - @override - String toString() { - return 'NumOrString.bool(field0: $field0)'; - } - @override - bool operator ==(Object other) { - return identical(this, other) || - (other.runtimeType == runtimeType && - other is _$NumOrString_BoolImpl && - (identical(other.field0, field0) || other.field0 == field0)); - } +} - @override - int get hashCode => Object.hash(runtimeType, field0); - - /// Create a copy of NumOrString - /// with the given fields replaced by the non-null parameter values. - @JsonKey(includeFromJson: false, includeToJson: false) - @override - @pragma('vm:prefer-inline') - _$$NumOrString_BoolImplCopyWith<_$NumOrString_BoolImpl> get copyWith => - __$$NumOrString_BoolImplCopyWithImpl<_$NumOrString_BoolImpl>( - this, _$identity); - - @override - @optionalTypeArgs - TResult when({ - required TResult Function(int field0) num, - required TResult Function(String field0) string, - required TResult Function(bool field0) bool, - }) { - return bool(field0); - } +/// @nodoc - @override - @optionalTypeArgs - TResult? whenOrNull({ - TResult? Function(int field0)? num, - TResult? Function(String field0)? string, - TResult? Function(bool field0)? bool, - }) { - return bool?.call(field0); - } - @override - @optionalTypeArgs - TResult maybeWhen({ - TResult Function(int field0)? num, - TResult Function(String field0)? string, - TResult Function(bool field0)? bool, - required TResult orElse(), - }) { - if (bool != null) { - return bool(field0); - } - return orElse(); - } +class Message_EnableSmsActivation extends Message { + const Message_EnableSmsActivation(this.field0): super._(); - @override - @optionalTypeArgs - TResult map({ - required TResult Function(NumOrString_Num value) num, - required TResult Function(NumOrString_String value) string, - required TResult Function(NumOrString_Bool value) bool, - }) { - return bool(this); - } - @override - @optionalTypeArgs - TResult? mapOrNull({ - TResult? Function(NumOrString_Num value)? num, - TResult? Function(NumOrString_String value)? string, - TResult? Function(NumOrString_Bool value)? bool, - }) { - return bool?.call(this); - } + final bool field0; - @override - @optionalTypeArgs - TResult maybeMap({ - TResult Function(NumOrString_Num value)? num, - TResult Function(NumOrString_String value)? string, - TResult Function(NumOrString_Bool value)? bool, - required TResult orElse(), - }) { - if (bool != null) { - return bool(this); - } - return orElse(); - } -} +/// Create a copy of Message +/// with the given fields replaced by the non-null parameter values. +@JsonKey(includeFromJson: false, includeToJson: false) +@pragma('vm:prefer-inline') +$Message_EnableSmsActivationCopyWith get copyWith => _$Message_EnableSmsActivationCopyWithImpl(this, _$identity); -abstract class NumOrString_Bool extends NumOrString { - const factory NumOrString_Bool(final bool field0) = _$NumOrString_BoolImpl; - const NumOrString_Bool._() : super._(); - @override - bool get field0; - /// Create a copy of NumOrString - /// with the given fields replaced by the non-null parameter values. - @JsonKey(includeFromJson: false, includeToJson: false) - _$$NumOrString_BoolImplCopyWith<_$NumOrString_BoolImpl> get copyWith => - throw _privateConstructorUsedError; +@override +bool operator ==(Object other) { + return identical(this, other) || (other.runtimeType == runtimeType&&other is Message_EnableSmsActivation&&(identical(other.field0, field0) || other.field0 == field0)); } -/// @nodoc -mixin _$PartExtension { - double get msgWidth => throw _privateConstructorUsedError; - double get rotation => throw _privateConstructorUsedError; - BigInt get sai => throw _privateConstructorUsedError; - double get scale => throw _privateConstructorUsedError; - bool? get update => throw _privateConstructorUsedError; - BigInt get sli => throw _privateConstructorUsedError; - double get normalizedX => throw _privateConstructorUsedError; - double get normalizedY => throw _privateConstructorUsedError; - BigInt get version => throw _privateConstructorUsedError; - String get hash => throw _privateConstructorUsedError; - BigInt get safi => throw _privateConstructorUsedError; - int get effectType => throw _privateConstructorUsedError; - String get stickerId => throw _privateConstructorUsedError; - @optionalTypeArgs - TResult when({ - required TResult Function( - double msgWidth, - double rotation, - BigInt sai, - double scale, - bool? update, - BigInt sli, - double normalizedX, - double normalizedY, - BigInt version, - String hash, - BigInt safi, - int effectType, - String stickerId) - sticker, - }) => - throw _privateConstructorUsedError; - @optionalTypeArgs - TResult? whenOrNull({ - TResult? Function( - double msgWidth, - double rotation, - BigInt sai, - double scale, - bool? update, - BigInt sli, - double normalizedX, - double normalizedY, - BigInt version, - String hash, - BigInt safi, - int effectType, - String stickerId)? - sticker, - }) => - throw _privateConstructorUsedError; - @optionalTypeArgs - TResult maybeWhen({ - TResult Function( - double msgWidth, - double rotation, - BigInt sai, - double scale, - bool? update, - BigInt sli, - double normalizedX, - double normalizedY, - BigInt version, - String hash, - BigInt safi, - int effectType, - String stickerId)? - sticker, - required TResult orElse(), - }) => - throw _privateConstructorUsedError; - @optionalTypeArgs - TResult map({ - required TResult Function(PartExtension_Sticker value) sticker, - }) => - throw _privateConstructorUsedError; - @optionalTypeArgs - TResult? mapOrNull({ - TResult? Function(PartExtension_Sticker value)? sticker, - }) => - throw _privateConstructorUsedError; - @optionalTypeArgs - TResult maybeMap({ - TResult Function(PartExtension_Sticker value)? sticker, - required TResult orElse(), - }) => - throw _privateConstructorUsedError; - - /// Create a copy of PartExtension - /// with the given fields replaced by the non-null parameter values. - @JsonKey(includeFromJson: false, includeToJson: false) - $PartExtensionCopyWith get copyWith => - throw _privateConstructorUsedError; -} - -/// @nodoc -abstract class $PartExtensionCopyWith<$Res> { - factory $PartExtensionCopyWith( - PartExtension value, $Res Function(PartExtension) then) = - _$PartExtensionCopyWithImpl<$Res, PartExtension>; - @useResult - $Res call( - {double msgWidth, - double rotation, - BigInt sai, - double scale, - bool? update, - BigInt sli, - double normalizedX, - double normalizedY, - BigInt version, - String hash, - BigInt safi, - int effectType, - String stickerId}); -} - -/// @nodoc -class _$PartExtensionCopyWithImpl<$Res, $Val extends PartExtension> - implements $PartExtensionCopyWith<$Res> { - _$PartExtensionCopyWithImpl(this._value, this._then); - - // ignore: unused_field - final $Val _value; - // ignore: unused_field - final $Res Function($Val) _then; - - /// Create a copy of PartExtension - /// with the given fields replaced by the non-null parameter values. - @pragma('vm:prefer-inline') - @override - $Res call({ - Object? msgWidth = null, - Object? rotation = null, - Object? sai = null, - Object? scale = null, - Object? update = freezed, - Object? sli = null, - Object? normalizedX = null, - Object? normalizedY = null, - Object? version = null, - Object? hash = null, - Object? safi = null, - Object? effectType = null, - Object? stickerId = null, - }) { - return _then(_value.copyWith( - msgWidth: null == msgWidth - ? _value.msgWidth - : msgWidth // ignore: cast_nullable_to_non_nullable - as double, - rotation: null == rotation - ? _value.rotation - : rotation // ignore: cast_nullable_to_non_nullable - as double, - sai: null == sai - ? _value.sai - : sai // ignore: cast_nullable_to_non_nullable - as BigInt, - scale: null == scale - ? _value.scale - : scale // ignore: cast_nullable_to_non_nullable - as double, - update: freezed == update - ? _value.update - : update // ignore: cast_nullable_to_non_nullable - as bool?, - sli: null == sli - ? _value.sli - : sli // ignore: cast_nullable_to_non_nullable - as BigInt, - normalizedX: null == normalizedX - ? _value.normalizedX - : normalizedX // ignore: cast_nullable_to_non_nullable - as double, - normalizedY: null == normalizedY - ? _value.normalizedY - : normalizedY // ignore: cast_nullable_to_non_nullable - as double, - version: null == version - ? _value.version - : version // ignore: cast_nullable_to_non_nullable - as BigInt, - hash: null == hash - ? _value.hash - : hash // ignore: cast_nullable_to_non_nullable - as String, - safi: null == safi - ? _value.safi - : safi // ignore: cast_nullable_to_non_nullable - as BigInt, - effectType: null == effectType - ? _value.effectType - : effectType // ignore: cast_nullable_to_non_nullable - as int, - stickerId: null == stickerId - ? _value.stickerId - : stickerId // ignore: cast_nullable_to_non_nullable - as String, - ) as $Val); - } -} -/// @nodoc -abstract class _$$PartExtension_StickerImplCopyWith<$Res> - implements $PartExtensionCopyWith<$Res> { - factory _$$PartExtension_StickerImplCopyWith( - _$PartExtension_StickerImpl value, - $Res Function(_$PartExtension_StickerImpl) then) = - __$$PartExtension_StickerImplCopyWithImpl<$Res>; - @override - @useResult - $Res call( - {double msgWidth, - double rotation, - BigInt sai, - double scale, - bool? update, - BigInt sli, - double normalizedX, - double normalizedY, - BigInt version, - String hash, - BigInt safi, - int effectType, - String stickerId}); -} - -/// @nodoc -class __$$PartExtension_StickerImplCopyWithImpl<$Res> - extends _$PartExtensionCopyWithImpl<$Res, _$PartExtension_StickerImpl> - implements _$$PartExtension_StickerImplCopyWith<$Res> { - __$$PartExtension_StickerImplCopyWithImpl(_$PartExtension_StickerImpl _value, - $Res Function(_$PartExtension_StickerImpl) _then) - : super(_value, _then); - - /// Create a copy of PartExtension - /// with the given fields replaced by the non-null parameter values. - @pragma('vm:prefer-inline') - @override - $Res call({ - Object? msgWidth = null, - Object? rotation = null, - Object? sai = null, - Object? scale = null, - Object? update = freezed, - Object? sli = null, - Object? normalizedX = null, - Object? normalizedY = null, - Object? version = null, - Object? hash = null, - Object? safi = null, - Object? effectType = null, - Object? stickerId = null, - }) { - return _then(_$PartExtension_StickerImpl( - msgWidth: null == msgWidth - ? _value.msgWidth - : msgWidth // ignore: cast_nullable_to_non_nullable - as double, - rotation: null == rotation - ? _value.rotation - : rotation // ignore: cast_nullable_to_non_nullable - as double, - sai: null == sai - ? _value.sai - : sai // ignore: cast_nullable_to_non_nullable - as BigInt, - scale: null == scale - ? _value.scale - : scale // ignore: cast_nullable_to_non_nullable - as double, - update: freezed == update - ? _value.update - : update // ignore: cast_nullable_to_non_nullable - as bool?, - sli: null == sli - ? _value.sli - : sli // ignore: cast_nullable_to_non_nullable - as BigInt, - normalizedX: null == normalizedX - ? _value.normalizedX - : normalizedX // ignore: cast_nullable_to_non_nullable - as double, - normalizedY: null == normalizedY - ? _value.normalizedY - : normalizedY // ignore: cast_nullable_to_non_nullable - as double, - version: null == version - ? _value.version - : version // ignore: cast_nullable_to_non_nullable - as BigInt, - hash: null == hash - ? _value.hash - : hash // ignore: cast_nullable_to_non_nullable - as String, - safi: null == safi - ? _value.safi - : safi // ignore: cast_nullable_to_non_nullable - as BigInt, - effectType: null == effectType - ? _value.effectType - : effectType // ignore: cast_nullable_to_non_nullable - as int, - stickerId: null == stickerId - ? _value.stickerId - : stickerId // ignore: cast_nullable_to_non_nullable - as String, - )); - } +@override +int get hashCode => Object.hash(runtimeType,field0); + +@override +String toString() { + return 'Message.enableSmsActivation(field0: $field0)'; } -/// @nodoc -class _$PartExtension_StickerImpl extends PartExtension_Sticker { - const _$PartExtension_StickerImpl( - {required this.msgWidth, - required this.rotation, - required this.sai, - required this.scale, - this.update, - required this.sli, - required this.normalizedX, - required this.normalizedY, - required this.version, - required this.hash, - required this.safi, - required this.effectType, - required this.stickerId}) - : super._(); - - @override - final double msgWidth; - @override - final double rotation; - @override - final BigInt sai; - @override - final double scale; - @override - final bool? update; - @override - final BigInt sli; - @override - final double normalizedX; - @override - final double normalizedY; - @override - final BigInt version; - @override - final String hash; - @override - final BigInt safi; - @override - final int effectType; - @override - final String stickerId; - - @override - String toString() { - return 'PartExtension.sticker(msgWidth: $msgWidth, rotation: $rotation, sai: $sai, scale: $scale, update: $update, sli: $sli, normalizedX: $normalizedX, normalizedY: $normalizedY, version: $version, hash: $hash, safi: $safi, effectType: $effectType, stickerId: $stickerId)'; - } +} - @override - bool operator ==(Object other) { - return identical(this, other) || - (other.runtimeType == runtimeType && - other is _$PartExtension_StickerImpl && - (identical(other.msgWidth, msgWidth) || - other.msgWidth == msgWidth) && - (identical(other.rotation, rotation) || - other.rotation == rotation) && - (identical(other.sai, sai) || other.sai == sai) && - (identical(other.scale, scale) || other.scale == scale) && - (identical(other.update, update) || other.update == update) && - (identical(other.sli, sli) || other.sli == sli) && - (identical(other.normalizedX, normalizedX) || - other.normalizedX == normalizedX) && - (identical(other.normalizedY, normalizedY) || - other.normalizedY == normalizedY) && - (identical(other.version, version) || other.version == version) && - (identical(other.hash, hash) || other.hash == hash) && - (identical(other.safi, safi) || other.safi == safi) && - (identical(other.effectType, effectType) || - other.effectType == effectType) && - (identical(other.stickerId, stickerId) || - other.stickerId == stickerId)); - } +/// @nodoc +abstract mixin class $Message_EnableSmsActivationCopyWith<$Res> implements $MessageCopyWith<$Res> { + factory $Message_EnableSmsActivationCopyWith(Message_EnableSmsActivation value, $Res Function(Message_EnableSmsActivation) _then) = _$Message_EnableSmsActivationCopyWithImpl; +@useResult +$Res call({ + bool field0 +}); - @override - int get hashCode => Object.hash( - runtimeType, - msgWidth, - rotation, - sai, - scale, - update, - sli, - normalizedX, - normalizedY, - version, - hash, - safi, - effectType, - stickerId); - - /// Create a copy of PartExtension - /// with the given fields replaced by the non-null parameter values. - @JsonKey(includeFromJson: false, includeToJson: false) - @override - @pragma('vm:prefer-inline') - _$$PartExtension_StickerImplCopyWith<_$PartExtension_StickerImpl> - get copyWith => __$$PartExtension_StickerImplCopyWithImpl< - _$PartExtension_StickerImpl>(this, _$identity); - - @override - @optionalTypeArgs - TResult when({ - required TResult Function( - double msgWidth, - double rotation, - BigInt sai, - double scale, - bool? update, - BigInt sli, - double normalizedX, - double normalizedY, - BigInt version, - String hash, - BigInt safi, - int effectType, - String stickerId) - sticker, - }) { - return sticker(msgWidth, rotation, sai, scale, update, sli, normalizedX, - normalizedY, version, hash, safi, effectType, stickerId); - } - @override - @optionalTypeArgs - TResult? whenOrNull({ - TResult? Function( - double msgWidth, - double rotation, - BigInt sai, - double scale, - bool? update, - BigInt sli, - double normalizedX, - double normalizedY, - BigInt version, - String hash, - BigInt safi, - int effectType, - String stickerId)? - sticker, - }) { - return sticker?.call(msgWidth, rotation, sai, scale, update, sli, - normalizedX, normalizedY, version, hash, safi, effectType, stickerId); - } - @override - @optionalTypeArgs - TResult maybeWhen({ - TResult Function( - double msgWidth, - double rotation, - BigInt sai, - double scale, - bool? update, - BigInt sli, - double normalizedX, - double normalizedY, - BigInt version, - String hash, - BigInt safi, - int effectType, - String stickerId)? - sticker, - required TResult orElse(), - }) { - if (sticker != null) { - return sticker(msgWidth, rotation, sai, scale, update, sli, normalizedX, - normalizedY, version, hash, safi, effectType, stickerId); - } - return orElse(); - } - @override - @optionalTypeArgs - TResult map({ - required TResult Function(PartExtension_Sticker value) sticker, - }) { - return sticker(this); - } +} +/// @nodoc +class _$Message_EnableSmsActivationCopyWithImpl<$Res> + implements $Message_EnableSmsActivationCopyWith<$Res> { + _$Message_EnableSmsActivationCopyWithImpl(this._self, this._then); - @override - @optionalTypeArgs - TResult? mapOrNull({ - TResult? Function(PartExtension_Sticker value)? sticker, - }) { - return sticker?.call(this); - } + final Message_EnableSmsActivation _self; + final $Res Function(Message_EnableSmsActivation) _then; - @override - @optionalTypeArgs - TResult maybeMap({ - TResult Function(PartExtension_Sticker value)? sticker, - required TResult orElse(), - }) { - if (sticker != null) { - return sticker(this); - } - return orElse(); - } +/// Create a copy of Message +/// with the given fields replaced by the non-null parameter values. +@pragma('vm:prefer-inline') $Res call({Object? field0 = null,}) { + return _then(Message_EnableSmsActivation( +null == field0 ? _self.field0 : field0 // ignore: cast_nullable_to_non_nullable +as bool, + )); } -abstract class PartExtension_Sticker extends PartExtension { - const factory PartExtension_Sticker( - {required final double msgWidth, - required final double rotation, - required final BigInt sai, - required final double scale, - final bool? update, - required final BigInt sli, - required final double normalizedX, - required final double normalizedY, - required final BigInt version, - required final String hash, - required final BigInt safi, - required final int effectType, - required final String stickerId}) = _$PartExtension_StickerImpl; - const PartExtension_Sticker._() : super._(); - - @override - double get msgWidth; - @override - double get rotation; - @override - BigInt get sai; - @override - double get scale; - @override - bool? get update; - @override - BigInt get sli; - @override - double get normalizedX; - @override - double get normalizedY; - @override - BigInt get version; - @override - String get hash; - @override - BigInt get safi; - @override - int get effectType; - @override - String get stickerId; - - /// Create a copy of PartExtension - /// with the given fields replaced by the non-null parameter values. - @override - @JsonKey(includeFromJson: false, includeToJson: false) - _$$PartExtension_StickerImplCopyWith<_$PartExtension_StickerImpl> - get copyWith => throw _privateConstructorUsedError; + } /// @nodoc -mixin _$PollResult { - @optionalTypeArgs - TResult when({ - required TResult Function() stop, - required TResult Function(PushMessage? field0) cont, - }) => - throw _privateConstructorUsedError; - @optionalTypeArgs - TResult? whenOrNull({ - TResult? Function()? stop, - TResult? Function(PushMessage? field0)? cont, - }) => - throw _privateConstructorUsedError; - @optionalTypeArgs - TResult maybeWhen({ - TResult Function()? stop, - TResult Function(PushMessage? field0)? cont, - required TResult orElse(), - }) => - throw _privateConstructorUsedError; - @optionalTypeArgs - TResult map({ - required TResult Function(PollResult_Stop value) stop, - required TResult Function(PollResult_Cont value) cont, - }) => - throw _privateConstructorUsedError; - @optionalTypeArgs - TResult? mapOrNull({ - TResult? Function(PollResult_Stop value)? stop, - TResult? Function(PollResult_Cont value)? cont, - }) => - throw _privateConstructorUsedError; - @optionalTypeArgs - TResult maybeMap({ - TResult Function(PollResult_Stop value)? stop, - TResult Function(PollResult_Cont value)? cont, - required TResult orElse(), - }) => - throw _privateConstructorUsedError; -} - -/// @nodoc -abstract class $PollResultCopyWith<$Res> { - factory $PollResultCopyWith( - PollResult value, $Res Function(PollResult) then) = - _$PollResultCopyWithImpl<$Res, PollResult>; -} - -/// @nodoc -class _$PollResultCopyWithImpl<$Res, $Val extends PollResult> - implements $PollResultCopyWith<$Res> { - _$PollResultCopyWithImpl(this._value, this._then); - - // ignore: unused_field - final $Val _value; - // ignore: unused_field - final $Res Function($Val) _then; - - /// Create a copy of PollResult - /// with the given fields replaced by the non-null parameter values. -} - -/// @nodoc -abstract class _$$PollResult_StopImplCopyWith<$Res> { - factory _$$PollResult_StopImplCopyWith(_$PollResult_StopImpl value, - $Res Function(_$PollResult_StopImpl) then) = - __$$PollResult_StopImplCopyWithImpl<$Res>; -} - -/// @nodoc -class __$$PollResult_StopImplCopyWithImpl<$Res> - extends _$PollResultCopyWithImpl<$Res, _$PollResult_StopImpl> - implements _$$PollResult_StopImplCopyWith<$Res> { - __$$PollResult_StopImplCopyWithImpl( - _$PollResult_StopImpl _value, $Res Function(_$PollResult_StopImpl) _then) - : super(_value, _then); - - /// Create a copy of PollResult - /// with the given fields replaced by the non-null parameter values. -} - -/// @nodoc - -class _$PollResult_StopImpl extends PollResult_Stop { - const _$PollResult_StopImpl() : super._(); - - @override - String toString() { - return 'PollResult.stop()'; - } - @override - bool operator ==(Object other) { - return identical(this, other) || - (other.runtimeType == runtimeType && other is _$PollResult_StopImpl); - } - @override - int get hashCode => runtimeType.hashCode; +class Message_MessageReadOnDevice extends Message { + const Message_MessageReadOnDevice(): super._(); - @override - @optionalTypeArgs - TResult when({ - required TResult Function() stop, - required TResult Function(PushMessage? field0) cont, - }) { - return stop(); - } - @override - @optionalTypeArgs - TResult? whenOrNull({ - TResult? Function()? stop, - TResult? Function(PushMessage? field0)? cont, - }) { - return stop?.call(); - } - @override - @optionalTypeArgs - TResult maybeWhen({ - TResult Function()? stop, - TResult Function(PushMessage? field0)? cont, - required TResult orElse(), - }) { - if (stop != null) { - return stop(); - } - return orElse(); - } - @override - @optionalTypeArgs - TResult map({ - required TResult Function(PollResult_Stop value) stop, - required TResult Function(PollResult_Cont value) cont, - }) { - return stop(this); - } - @override - @optionalTypeArgs - TResult? mapOrNull({ - TResult? Function(PollResult_Stop value)? stop, - TResult? Function(PollResult_Cont value)? cont, - }) { - return stop?.call(this); - } - @override - @optionalTypeArgs - TResult maybeMap({ - TResult Function(PollResult_Stop value)? stop, - TResult Function(PollResult_Cont value)? cont, - required TResult orElse(), - }) { - if (stop != null) { - return stop(this); - } - return orElse(); - } -} -abstract class PollResult_Stop extends PollResult { - const factory PollResult_Stop() = _$PollResult_StopImpl; - const PollResult_Stop._() : super._(); +@override +bool operator ==(Object other) { + return identical(this, other) || (other.runtimeType == runtimeType&&other is Message_MessageReadOnDevice); } -/// @nodoc -abstract class _$$PollResult_ContImplCopyWith<$Res> { - factory _$$PollResult_ContImplCopyWith(_$PollResult_ContImpl value, - $Res Function(_$PollResult_ContImpl) then) = - __$$PollResult_ContImplCopyWithImpl<$Res>; - @useResult - $Res call({PushMessage? field0}); - $PushMessageCopyWith<$Res>? get field0; -} +@override +int get hashCode => runtimeType.hashCode; -/// @nodoc -class __$$PollResult_ContImplCopyWithImpl<$Res> - extends _$PollResultCopyWithImpl<$Res, _$PollResult_ContImpl> - implements _$$PollResult_ContImplCopyWith<$Res> { - __$$PollResult_ContImplCopyWithImpl( - _$PollResult_ContImpl _value, $Res Function(_$PollResult_ContImpl) _then) - : super(_value, _then); +@override +String toString() { + return 'Message.messageReadOnDevice()'; +} - /// Create a copy of PollResult - /// with the given fields replaced by the non-null parameter values. - @pragma('vm:prefer-inline') - @override - $Res call({ - Object? field0 = freezed, - }) { - return _then(_$PollResult_ContImpl( - freezed == field0 - ? _value.field0 - : field0 // ignore: cast_nullable_to_non_nullable - as PushMessage?, - )); - } - /// Create a copy of PollResult - /// with the given fields replaced by the non-null parameter values. - @override - @pragma('vm:prefer-inline') - $PushMessageCopyWith<$Res>? get field0 { - if (_value.field0 == null) { - return null; - } - - return $PushMessageCopyWith<$Res>(_value.field0!, (value) { - return _then(_value.copyWith(field0: value)); - }); - } } -/// @nodoc -class _$PollResult_ContImpl extends PollResult_Cont { - const _$PollResult_ContImpl([this.field0]) : super._(); - @override - final PushMessage? field0; - @override - String toString() { - return 'PollResult.cont(field0: $field0)'; - } +/// @nodoc - @override - bool operator ==(Object other) { - return identical(this, other) || - (other.runtimeType == runtimeType && - other is _$PollResult_ContImpl && - (identical(other.field0, field0) || other.field0 == field0)); - } - @override - int get hashCode => Object.hash(runtimeType, field0); - - /// Create a copy of PollResult - /// with the given fields replaced by the non-null parameter values. - @JsonKey(includeFromJson: false, includeToJson: false) - @override - @pragma('vm:prefer-inline') - _$$PollResult_ContImplCopyWith<_$PollResult_ContImpl> get copyWith => - __$$PollResult_ContImplCopyWithImpl<_$PollResult_ContImpl>( - this, _$identity); - - @override - @optionalTypeArgs - TResult when({ - required TResult Function() stop, - required TResult Function(PushMessage? field0) cont, - }) { - return cont(field0); - } +class Message_SmsConfirmSent extends Message { + const Message_SmsConfirmSent(this.field0): super._(); - @override - @optionalTypeArgs - TResult? whenOrNull({ - TResult? Function()? stop, - TResult? Function(PushMessage? field0)? cont, - }) { - return cont?.call(field0); - } - @override - @optionalTypeArgs - TResult maybeWhen({ - TResult Function()? stop, - TResult Function(PushMessage? field0)? cont, - required TResult orElse(), - }) { - if (cont != null) { - return cont(field0); - } - return orElse(); - } + final bool field0; - @override - @optionalTypeArgs - TResult map({ - required TResult Function(PollResult_Stop value) stop, - required TResult Function(PollResult_Cont value) cont, - }) { - return cont(this); - } +/// Create a copy of Message +/// with the given fields replaced by the non-null parameter values. +@JsonKey(includeFromJson: false, includeToJson: false) +@pragma('vm:prefer-inline') +$Message_SmsConfirmSentCopyWith get copyWith => _$Message_SmsConfirmSentCopyWithImpl(this, _$identity); - @override - @optionalTypeArgs - TResult? mapOrNull({ - TResult? Function(PollResult_Stop value)? stop, - TResult? Function(PollResult_Cont value)? cont, - }) { - return cont?.call(this); - } - @override - @optionalTypeArgs - TResult maybeMap({ - TResult Function(PollResult_Stop value)? stop, - TResult Function(PollResult_Cont value)? cont, - required TResult orElse(), - }) { - if (cont != null) { - return cont(this); - } - return orElse(); - } + +@override +bool operator ==(Object other) { + return identical(this, other) || (other.runtimeType == runtimeType&&other is Message_SmsConfirmSent&&(identical(other.field0, field0) || other.field0 == field0)); } -abstract class PollResult_Cont extends PollResult { - const factory PollResult_Cont([final PushMessage? field0]) = - _$PollResult_ContImpl; - const PollResult_Cont._() : super._(); - PushMessage? get field0; +@override +int get hashCode => Object.hash(runtimeType,field0); - /// Create a copy of PollResult - /// with the given fields replaced by the non-null parameter values. - @JsonKey(includeFromJson: false, includeToJson: false) - _$$PollResult_ContImplCopyWith<_$PollResult_ContImpl> get copyWith => - throw _privateConstructorUsedError; +@override +String toString() { + return 'Message.smsConfirmSent(field0: $field0)'; } -/// @nodoc -mixin _$PosterType { - @optionalTypeArgs - TResult when({ - required TResult Function(List assets) photo, - required TResult Function(MonogramData data, PosterColor background) - monogram, - required TResult Function(MemojiData data, PosterColor background) memoji, - required TResult Function(TranscriptDynamicUserData data) transcriptDynamic, - required TResult Function(List colors) transcriptGradient, - }) => - throw _privateConstructorUsedError; - @optionalTypeArgs - TResult? whenOrNull({ - TResult? Function(List assets)? photo, - TResult? Function(MonogramData data, PosterColor background)? monogram, - TResult? Function(MemojiData data, PosterColor background)? memoji, - TResult? Function(TranscriptDynamicUserData data)? transcriptDynamic, - TResult? Function(List colors)? transcriptGradient, - }) => - throw _privateConstructorUsedError; - @optionalTypeArgs - TResult maybeWhen({ - TResult Function(List assets)? photo, - TResult Function(MonogramData data, PosterColor background)? monogram, - TResult Function(MemojiData data, PosterColor background)? memoji, - TResult Function(TranscriptDynamicUserData data)? transcriptDynamic, - TResult Function(List colors)? transcriptGradient, - required TResult orElse(), - }) => - throw _privateConstructorUsedError; - @optionalTypeArgs - TResult map({ - required TResult Function(PosterType_Photo value) photo, - required TResult Function(PosterType_Monogram value) monogram, - required TResult Function(PosterType_Memoji value) memoji, - required TResult Function(PosterType_TranscriptDynamic value) - transcriptDynamic, - required TResult Function(PosterType_TranscriptGradient value) - transcriptGradient, - }) => - throw _privateConstructorUsedError; - @optionalTypeArgs - TResult? mapOrNull({ - TResult? Function(PosterType_Photo value)? photo, - TResult? Function(PosterType_Monogram value)? monogram, - TResult? Function(PosterType_Memoji value)? memoji, - TResult? Function(PosterType_TranscriptDynamic value)? transcriptDynamic, - TResult? Function(PosterType_TranscriptGradient value)? transcriptGradient, - }) => - throw _privateConstructorUsedError; - @optionalTypeArgs - TResult maybeMap({ - TResult Function(PosterType_Photo value)? photo, - TResult Function(PosterType_Monogram value)? monogram, - TResult Function(PosterType_Memoji value)? memoji, - TResult Function(PosterType_TranscriptDynamic value)? transcriptDynamic, - TResult Function(PosterType_TranscriptGradient value)? transcriptGradient, - required TResult orElse(), - }) => - throw _privateConstructorUsedError; -} - -/// @nodoc -abstract class $PosterTypeCopyWith<$Res> { - factory $PosterTypeCopyWith( - PosterType value, $Res Function(PosterType) then) = - _$PosterTypeCopyWithImpl<$Res, PosterType>; -} - -/// @nodoc -class _$PosterTypeCopyWithImpl<$Res, $Val extends PosterType> - implements $PosterTypeCopyWith<$Res> { - _$PosterTypeCopyWithImpl(this._value, this._then); - - // ignore: unused_field - final $Val _value; - // ignore: unused_field - final $Res Function($Val) _then; - - /// Create a copy of PosterType - /// with the given fields replaced by the non-null parameter values. -} - -/// @nodoc -abstract class _$$PosterType_PhotoImplCopyWith<$Res> { - factory _$$PosterType_PhotoImplCopyWith(_$PosterType_PhotoImpl value, - $Res Function(_$PosterType_PhotoImpl) then) = - __$$PosterType_PhotoImplCopyWithImpl<$Res>; - @useResult - $Res call({List assets}); -} - -/// @nodoc -class __$$PosterType_PhotoImplCopyWithImpl<$Res> - extends _$PosterTypeCopyWithImpl<$Res, _$PosterType_PhotoImpl> - implements _$$PosterType_PhotoImplCopyWith<$Res> { - __$$PosterType_PhotoImplCopyWithImpl(_$PosterType_PhotoImpl _value, - $Res Function(_$PosterType_PhotoImpl) _then) - : super(_value, _then); - - /// Create a copy of PosterType - /// with the given fields replaced by the non-null parameter values. - @pragma('vm:prefer-inline') - @override - $Res call({ - Object? assets = null, - }) { - return _then(_$PosterType_PhotoImpl( - assets: null == assets - ? _value._assets - : assets // ignore: cast_nullable_to_non_nullable - as List, - )); - } + } /// @nodoc +abstract mixin class $Message_SmsConfirmSentCopyWith<$Res> implements $MessageCopyWith<$Res> { + factory $Message_SmsConfirmSentCopyWith(Message_SmsConfirmSent value, $Res Function(Message_SmsConfirmSent) _then) = _$Message_SmsConfirmSentCopyWithImpl; +@useResult +$Res call({ + bool field0 +}); -class _$PosterType_PhotoImpl extends PosterType_Photo { - const _$PosterType_PhotoImpl({required final List assets}) - : _assets = assets, - super._(); - - final List _assets; - @override - List get assets { - if (_assets is EqualUnmodifiableListView) return _assets; - // ignore: implicit_dynamic_type - return EqualUnmodifiableListView(_assets); - } - - @override - String toString() { - return 'PosterType.photo(assets: $assets)'; - } - - @override - bool operator ==(Object other) { - return identical(this, other) || - (other.runtimeType == runtimeType && - other is _$PosterType_PhotoImpl && - const DeepCollectionEquality().equals(other._assets, _assets)); - } - - @override - int get hashCode => - Object.hash(runtimeType, const DeepCollectionEquality().hash(_assets)); - - /// Create a copy of PosterType - /// with the given fields replaced by the non-null parameter values. - @JsonKey(includeFromJson: false, includeToJson: false) - @override - @pragma('vm:prefer-inline') - _$$PosterType_PhotoImplCopyWith<_$PosterType_PhotoImpl> get copyWith => - __$$PosterType_PhotoImplCopyWithImpl<_$PosterType_PhotoImpl>( - this, _$identity); - - @override - @optionalTypeArgs - TResult when({ - required TResult Function(List assets) photo, - required TResult Function(MonogramData data, PosterColor background) - monogram, - required TResult Function(MemojiData data, PosterColor background) memoji, - required TResult Function(TranscriptDynamicUserData data) transcriptDynamic, - required TResult Function(List colors) transcriptGradient, - }) { - return photo(assets); - } - @override - @optionalTypeArgs - TResult? whenOrNull({ - TResult? Function(List assets)? photo, - TResult? Function(MonogramData data, PosterColor background)? monogram, - TResult? Function(MemojiData data, PosterColor background)? memoji, - TResult? Function(TranscriptDynamicUserData data)? transcriptDynamic, - TResult? Function(List colors)? transcriptGradient, - }) { - return photo?.call(assets); - } - @override - @optionalTypeArgs - TResult maybeWhen({ - TResult Function(List assets)? photo, - TResult Function(MonogramData data, PosterColor background)? monogram, - TResult Function(MemojiData data, PosterColor background)? memoji, - TResult Function(TranscriptDynamicUserData data)? transcriptDynamic, - TResult Function(List colors)? transcriptGradient, - required TResult orElse(), - }) { - if (photo != null) { - return photo(assets); - } - return orElse(); - } - @override - @optionalTypeArgs - TResult map({ - required TResult Function(PosterType_Photo value) photo, - required TResult Function(PosterType_Monogram value) monogram, - required TResult Function(PosterType_Memoji value) memoji, - required TResult Function(PosterType_TranscriptDynamic value) - transcriptDynamic, - required TResult Function(PosterType_TranscriptGradient value) - transcriptGradient, - }) { - return photo(this); - } +} +/// @nodoc +class _$Message_SmsConfirmSentCopyWithImpl<$Res> + implements $Message_SmsConfirmSentCopyWith<$Res> { + _$Message_SmsConfirmSentCopyWithImpl(this._self, this._then); - @override - @optionalTypeArgs - TResult? mapOrNull({ - TResult? Function(PosterType_Photo value)? photo, - TResult? Function(PosterType_Monogram value)? monogram, - TResult? Function(PosterType_Memoji value)? memoji, - TResult? Function(PosterType_TranscriptDynamic value)? transcriptDynamic, - TResult? Function(PosterType_TranscriptGradient value)? transcriptGradient, - }) { - return photo?.call(this); - } + final Message_SmsConfirmSent _self; + final $Res Function(Message_SmsConfirmSent) _then; - @override - @optionalTypeArgs - TResult maybeMap({ - TResult Function(PosterType_Photo value)? photo, - TResult Function(PosterType_Monogram value)? monogram, - TResult Function(PosterType_Memoji value)? memoji, - TResult Function(PosterType_TranscriptDynamic value)? transcriptDynamic, - TResult Function(PosterType_TranscriptGradient value)? transcriptGradient, - required TResult orElse(), - }) { - if (photo != null) { - return photo(this); - } - return orElse(); - } +/// Create a copy of Message +/// with the given fields replaced by the non-null parameter values. +@pragma('vm:prefer-inline') $Res call({Object? field0 = null,}) { + return _then(Message_SmsConfirmSent( +null == field0 ? _self.field0 : field0 // ignore: cast_nullable_to_non_nullable +as bool, + )); } -abstract class PosterType_Photo extends PosterType { - const factory PosterType_Photo({required final List assets}) = - _$PosterType_PhotoImpl; - const PosterType_Photo._() : super._(); - - List get assets; - - /// Create a copy of PosterType - /// with the given fields replaced by the non-null parameter values. - @JsonKey(includeFromJson: false, includeToJson: false) - _$$PosterType_PhotoImplCopyWith<_$PosterType_PhotoImpl> get copyWith => - throw _privateConstructorUsedError; -} - -/// @nodoc -abstract class _$$PosterType_MonogramImplCopyWith<$Res> { - factory _$$PosterType_MonogramImplCopyWith(_$PosterType_MonogramImpl value, - $Res Function(_$PosterType_MonogramImpl) then) = - __$$PosterType_MonogramImplCopyWithImpl<$Res>; - @useResult - $Res call({MonogramData data, PosterColor background}); -} - -/// @nodoc -class __$$PosterType_MonogramImplCopyWithImpl<$Res> - extends _$PosterTypeCopyWithImpl<$Res, _$PosterType_MonogramImpl> - implements _$$PosterType_MonogramImplCopyWith<$Res> { - __$$PosterType_MonogramImplCopyWithImpl(_$PosterType_MonogramImpl _value, - $Res Function(_$PosterType_MonogramImpl) _then) - : super(_value, _then); - - /// Create a copy of PosterType - /// with the given fields replaced by the non-null parameter values. - @pragma('vm:prefer-inline') - @override - $Res call({ - Object? data = null, - Object? background = null, - }) { - return _then(_$PosterType_MonogramImpl( - data: null == data - ? _value.data - : data // ignore: cast_nullable_to_non_nullable - as MonogramData, - background: null == background - ? _value.background - : background // ignore: cast_nullable_to_non_nullable - as PosterColor, - )); - } + } /// @nodoc -class _$PosterType_MonogramImpl extends PosterType_Monogram { - const _$PosterType_MonogramImpl( - {required this.data, required this.background}) - : super._(); - @override - final MonogramData data; - @override - final PosterColor background; +class Message_MarkUnread extends Message { + const Message_MarkUnread(): super._(); - @override - String toString() { - return 'PosterType.monogram(data: $data, background: $background)'; - } - @override - bool operator ==(Object other) { - return identical(this, other) || - (other.runtimeType == runtimeType && - other is _$PosterType_MonogramImpl && - (identical(other.data, data) || other.data == data) && - (identical(other.background, background) || - other.background == background)); - } - @override - int get hashCode => Object.hash(runtimeType, data, background); - - /// Create a copy of PosterType - /// with the given fields replaced by the non-null parameter values. - @JsonKey(includeFromJson: false, includeToJson: false) - @override - @pragma('vm:prefer-inline') - _$$PosterType_MonogramImplCopyWith<_$PosterType_MonogramImpl> get copyWith => - __$$PosterType_MonogramImplCopyWithImpl<_$PosterType_MonogramImpl>( - this, _$identity); - - @override - @optionalTypeArgs - TResult when({ - required TResult Function(List assets) photo, - required TResult Function(MonogramData data, PosterColor background) - monogram, - required TResult Function(MemojiData data, PosterColor background) memoji, - required TResult Function(TranscriptDynamicUserData data) transcriptDynamic, - required TResult Function(List colors) transcriptGradient, - }) { - return monogram(data, background); - } - @override - @optionalTypeArgs - TResult? whenOrNull({ - TResult? Function(List assets)? photo, - TResult? Function(MonogramData data, PosterColor background)? monogram, - TResult? Function(MemojiData data, PosterColor background)? memoji, - TResult? Function(TranscriptDynamicUserData data)? transcriptDynamic, - TResult? Function(List colors)? transcriptGradient, - }) { - return monogram?.call(data, background); - } - @override - @optionalTypeArgs - TResult maybeWhen({ - TResult Function(List assets)? photo, - TResult Function(MonogramData data, PosterColor background)? monogram, - TResult Function(MemojiData data, PosterColor background)? memoji, - TResult Function(TranscriptDynamicUserData data)? transcriptDynamic, - TResult Function(List colors)? transcriptGradient, - required TResult orElse(), - }) { - if (monogram != null) { - return monogram(data, background); - } - return orElse(); - } - @override - @optionalTypeArgs - TResult map({ - required TResult Function(PosterType_Photo value) photo, - required TResult Function(PosterType_Monogram value) monogram, - required TResult Function(PosterType_Memoji value) memoji, - required TResult Function(PosterType_TranscriptDynamic value) - transcriptDynamic, - required TResult Function(PosterType_TranscriptGradient value) - transcriptGradient, - }) { - return monogram(this); - } - @override - @optionalTypeArgs - TResult? mapOrNull({ - TResult? Function(PosterType_Photo value)? photo, - TResult? Function(PosterType_Monogram value)? monogram, - TResult? Function(PosterType_Memoji value)? memoji, - TResult? Function(PosterType_TranscriptDynamic value)? transcriptDynamic, - TResult? Function(PosterType_TranscriptGradient value)? transcriptGradient, - }) { - return monogram?.call(this); - } +@override +bool operator ==(Object other) { + return identical(this, other) || (other.runtimeType == runtimeType&&other is Message_MarkUnread); +} - @override - @optionalTypeArgs - TResult maybeMap({ - TResult Function(PosterType_Photo value)? photo, - TResult Function(PosterType_Monogram value)? monogram, - TResult Function(PosterType_Memoji value)? memoji, - TResult Function(PosterType_TranscriptDynamic value)? transcriptDynamic, - TResult Function(PosterType_TranscriptGradient value)? transcriptGradient, - required TResult orElse(), - }) { - if (monogram != null) { - return monogram(this); - } - return orElse(); - } + +@override +int get hashCode => runtimeType.hashCode; + +@override +String toString() { + return 'Message.markUnread()'; } -abstract class PosterType_Monogram extends PosterType { - const factory PosterType_Monogram( - {required final MonogramData data, - required final PosterColor background}) = _$PosterType_MonogramImpl; - const PosterType_Monogram._() : super._(); - - MonogramData get data; - PosterColor get background; - - /// Create a copy of PosterType - /// with the given fields replaced by the non-null parameter values. - @JsonKey(includeFromJson: false, includeToJson: false) - _$$PosterType_MonogramImplCopyWith<_$PosterType_MonogramImpl> get copyWith => - throw _privateConstructorUsedError; -} - -/// @nodoc -abstract class _$$PosterType_MemojiImplCopyWith<$Res> { - factory _$$PosterType_MemojiImplCopyWith(_$PosterType_MemojiImpl value, - $Res Function(_$PosterType_MemojiImpl) then) = - __$$PosterType_MemojiImplCopyWithImpl<$Res>; - @useResult - $Res call({MemojiData data, PosterColor background}); -} - -/// @nodoc -class __$$PosterType_MemojiImplCopyWithImpl<$Res> - extends _$PosterTypeCopyWithImpl<$Res, _$PosterType_MemojiImpl> - implements _$$PosterType_MemojiImplCopyWith<$Res> { - __$$PosterType_MemojiImplCopyWithImpl(_$PosterType_MemojiImpl _value, - $Res Function(_$PosterType_MemojiImpl) _then) - : super(_value, _then); - - /// Create a copy of PosterType - /// with the given fields replaced by the non-null parameter values. - @pragma('vm:prefer-inline') - @override - $Res call({ - Object? data = null, - Object? background = null, - }) { - return _then(_$PosterType_MemojiImpl( - data: null == data - ? _value.data - : data // ignore: cast_nullable_to_non_nullable - as MemojiData, - background: null == background - ? _value.background - : background // ignore: cast_nullable_to_non_nullable - as PosterColor, - )); - } + } + + + /// @nodoc -class _$PosterType_MemojiImpl extends PosterType_Memoji { - const _$PosterType_MemojiImpl({required this.data, required this.background}) - : super._(); - @override - final MemojiData data; - @override - final PosterColor background; +class Message_PeerCacheInvalidate extends Message { + const Message_PeerCacheInvalidate(): super._(); - @override - String toString() { - return 'PosterType.memoji(data: $data, background: $background)'; - } - @override - bool operator ==(Object other) { - return identical(this, other) || - (other.runtimeType == runtimeType && - other is _$PosterType_MemojiImpl && - (identical(other.data, data) || other.data == data) && - (identical(other.background, background) || - other.background == background)); - } - @override - int get hashCode => Object.hash(runtimeType, data, background); - - /// Create a copy of PosterType - /// with the given fields replaced by the non-null parameter values. - @JsonKey(includeFromJson: false, includeToJson: false) - @override - @pragma('vm:prefer-inline') - _$$PosterType_MemojiImplCopyWith<_$PosterType_MemojiImpl> get copyWith => - __$$PosterType_MemojiImplCopyWithImpl<_$PosterType_MemojiImpl>( - this, _$identity); - - @override - @optionalTypeArgs - TResult when({ - required TResult Function(List assets) photo, - required TResult Function(MonogramData data, PosterColor background) - monogram, - required TResult Function(MemojiData data, PosterColor background) memoji, - required TResult Function(TranscriptDynamicUserData data) transcriptDynamic, - required TResult Function(List colors) transcriptGradient, - }) { - return memoji(data, background); - } - @override - @optionalTypeArgs - TResult? whenOrNull({ - TResult? Function(List assets)? photo, - TResult? Function(MonogramData data, PosterColor background)? monogram, - TResult? Function(MemojiData data, PosterColor background)? memoji, - TResult? Function(TranscriptDynamicUserData data)? transcriptDynamic, - TResult? Function(List colors)? transcriptGradient, - }) { - return memoji?.call(data, background); - } - @override - @optionalTypeArgs - TResult maybeWhen({ - TResult Function(List assets)? photo, - TResult Function(MonogramData data, PosterColor background)? monogram, - TResult Function(MemojiData data, PosterColor background)? memoji, - TResult Function(TranscriptDynamicUserData data)? transcriptDynamic, - TResult Function(List colors)? transcriptGradient, - required TResult orElse(), - }) { - if (memoji != null) { - return memoji(data, background); - } - return orElse(); - } - @override - @optionalTypeArgs - TResult map({ - required TResult Function(PosterType_Photo value) photo, - required TResult Function(PosterType_Monogram value) monogram, - required TResult Function(PosterType_Memoji value) memoji, - required TResult Function(PosterType_TranscriptDynamic value) - transcriptDynamic, - required TResult Function(PosterType_TranscriptGradient value) - transcriptGradient, - }) { - return memoji(this); - } - @override - @optionalTypeArgs - TResult? mapOrNull({ - TResult? Function(PosterType_Photo value)? photo, - TResult? Function(PosterType_Monogram value)? monogram, - TResult? Function(PosterType_Memoji value)? memoji, - TResult? Function(PosterType_TranscriptDynamic value)? transcriptDynamic, - TResult? Function(PosterType_TranscriptGradient value)? transcriptGradient, - }) { - return memoji?.call(this); - } +@override +bool operator ==(Object other) { + return identical(this, other) || (other.runtimeType == runtimeType&&other is Message_PeerCacheInvalidate); +} - @override - @optionalTypeArgs - TResult maybeMap({ - TResult Function(PosterType_Photo value)? photo, - TResult Function(PosterType_Monogram value)? monogram, - TResult Function(PosterType_Memoji value)? memoji, - TResult Function(PosterType_TranscriptDynamic value)? transcriptDynamic, - TResult Function(PosterType_TranscriptGradient value)? transcriptGradient, - required TResult orElse(), - }) { - if (memoji != null) { - return memoji(this); - } - return orElse(); - } + +@override +int get hashCode => runtimeType.hashCode; + +@override +String toString() { + return 'Message.peerCacheInvalidate()'; } -abstract class PosterType_Memoji extends PosterType { - const factory PosterType_Memoji( - {required final MemojiData data, - required final PosterColor background}) = _$PosterType_MemojiImpl; - const PosterType_Memoji._() : super._(); - - MemojiData get data; - PosterColor get background; - - /// Create a copy of PosterType - /// with the given fields replaced by the non-null parameter values. - @JsonKey(includeFromJson: false, includeToJson: false) - _$$PosterType_MemojiImplCopyWith<_$PosterType_MemojiImpl> get copyWith => - throw _privateConstructorUsedError; -} - -/// @nodoc -abstract class _$$PosterType_TranscriptDynamicImplCopyWith<$Res> { - factory _$$PosterType_TranscriptDynamicImplCopyWith( - _$PosterType_TranscriptDynamicImpl value, - $Res Function(_$PosterType_TranscriptDynamicImpl) then) = - __$$PosterType_TranscriptDynamicImplCopyWithImpl<$Res>; - @useResult - $Res call({TranscriptDynamicUserData data}); -} - -/// @nodoc -class __$$PosterType_TranscriptDynamicImplCopyWithImpl<$Res> - extends _$PosterTypeCopyWithImpl<$Res, _$PosterType_TranscriptDynamicImpl> - implements _$$PosterType_TranscriptDynamicImplCopyWith<$Res> { - __$$PosterType_TranscriptDynamicImplCopyWithImpl( - _$PosterType_TranscriptDynamicImpl _value, - $Res Function(_$PosterType_TranscriptDynamicImpl) _then) - : super(_value, _then); - - /// Create a copy of PosterType - /// with the given fields replaced by the non-null parameter values. - @pragma('vm:prefer-inline') - @override - $Res call({ - Object? data = null, - }) { - return _then(_$PosterType_TranscriptDynamicImpl( - data: null == data - ? _value.data - : data // ignore: cast_nullable_to_non_nullable - as TranscriptDynamicUserData, - )); - } + } -/// @nodoc -class _$PosterType_TranscriptDynamicImpl extends PosterType_TranscriptDynamic { - const _$PosterType_TranscriptDynamicImpl({required this.data}) : super._(); - @override - final TranscriptDynamicUserData data; - @override - String toString() { - return 'PosterType.transcriptDynamic(data: $data)'; - } +/// @nodoc - @override - bool operator ==(Object other) { - return identical(this, other) || - (other.runtimeType == runtimeType && - other is _$PosterType_TranscriptDynamicImpl && - (identical(other.data, data) || other.data == data)); - } - @override - int get hashCode => Object.hash(runtimeType, data); - - /// Create a copy of PosterType - /// with the given fields replaced by the non-null parameter values. - @JsonKey(includeFromJson: false, includeToJson: false) - @override - @pragma('vm:prefer-inline') - _$$PosterType_TranscriptDynamicImplCopyWith< - _$PosterType_TranscriptDynamicImpl> - get copyWith => __$$PosterType_TranscriptDynamicImplCopyWithImpl< - _$PosterType_TranscriptDynamicImpl>(this, _$identity); - - @override - @optionalTypeArgs - TResult when({ - required TResult Function(List assets) photo, - required TResult Function(MonogramData data, PosterColor background) - monogram, - required TResult Function(MemojiData data, PosterColor background) memoji, - required TResult Function(TranscriptDynamicUserData data) transcriptDynamic, - required TResult Function(List colors) transcriptGradient, - }) { - return transcriptDynamic(data); - } +class Message_UpdateExtension extends Message { + const Message_UpdateExtension(this.field0): super._(); - @override - @optionalTypeArgs - TResult? whenOrNull({ - TResult? Function(List assets)? photo, - TResult? Function(MonogramData data, PosterColor background)? monogram, - TResult? Function(MemojiData data, PosterColor background)? memoji, - TResult? Function(TranscriptDynamicUserData data)? transcriptDynamic, - TResult? Function(List colors)? transcriptGradient, - }) { - return transcriptDynamic?.call(data); - } - @override - @optionalTypeArgs - TResult maybeWhen({ - TResult Function(List assets)? photo, - TResult Function(MonogramData data, PosterColor background)? monogram, - TResult Function(MemojiData data, PosterColor background)? memoji, - TResult Function(TranscriptDynamicUserData data)? transcriptDynamic, - TResult Function(List colors)? transcriptGradient, - required TResult orElse(), - }) { - if (transcriptDynamic != null) { - return transcriptDynamic(data); - } - return orElse(); - } + final UpdateExtensionMessage field0; - @override - @optionalTypeArgs - TResult map({ - required TResult Function(PosterType_Photo value) photo, - required TResult Function(PosterType_Monogram value) monogram, - required TResult Function(PosterType_Memoji value) memoji, - required TResult Function(PosterType_TranscriptDynamic value) - transcriptDynamic, - required TResult Function(PosterType_TranscriptGradient value) - transcriptGradient, - }) { - return transcriptDynamic(this); - } +/// Create a copy of Message +/// with the given fields replaced by the non-null parameter values. +@JsonKey(includeFromJson: false, includeToJson: false) +@pragma('vm:prefer-inline') +$Message_UpdateExtensionCopyWith get copyWith => _$Message_UpdateExtensionCopyWithImpl(this, _$identity); - @override - @optionalTypeArgs - TResult? mapOrNull({ - TResult? Function(PosterType_Photo value)? photo, - TResult? Function(PosterType_Monogram value)? monogram, - TResult? Function(PosterType_Memoji value)? memoji, - TResult? Function(PosterType_TranscriptDynamic value)? transcriptDynamic, - TResult? Function(PosterType_TranscriptGradient value)? transcriptGradient, - }) { - return transcriptDynamic?.call(this); - } - @override - @optionalTypeArgs - TResult maybeMap({ - TResult Function(PosterType_Photo value)? photo, - TResult Function(PosterType_Monogram value)? monogram, - TResult Function(PosterType_Memoji value)? memoji, - TResult Function(PosterType_TranscriptDynamic value)? transcriptDynamic, - TResult Function(PosterType_TranscriptGradient value)? transcriptGradient, - required TResult orElse(), - }) { - if (transcriptDynamic != null) { - return transcriptDynamic(this); - } - return orElse(); - } -} -abstract class PosterType_TranscriptDynamic extends PosterType { - const factory PosterType_TranscriptDynamic( - {required final TranscriptDynamicUserData data}) = - _$PosterType_TranscriptDynamicImpl; - const PosterType_TranscriptDynamic._() : super._(); - - TranscriptDynamicUserData get data; - - /// Create a copy of PosterType - /// with the given fields replaced by the non-null parameter values. - @JsonKey(includeFromJson: false, includeToJson: false) - _$$PosterType_TranscriptDynamicImplCopyWith< - _$PosterType_TranscriptDynamicImpl> - get copyWith => throw _privateConstructorUsedError; -} - -/// @nodoc -abstract class _$$PosterType_TranscriptGradientImplCopyWith<$Res> { - factory _$$PosterType_TranscriptGradientImplCopyWith( - _$PosterType_TranscriptGradientImpl value, - $Res Function(_$PosterType_TranscriptGradientImpl) then) = - __$$PosterType_TranscriptGradientImplCopyWithImpl<$Res>; - @useResult - $Res call({List colors}); -} - -/// @nodoc -class __$$PosterType_TranscriptGradientImplCopyWithImpl<$Res> - extends _$PosterTypeCopyWithImpl<$Res, _$PosterType_TranscriptGradientImpl> - implements _$$PosterType_TranscriptGradientImplCopyWith<$Res> { - __$$PosterType_TranscriptGradientImplCopyWithImpl( - _$PosterType_TranscriptGradientImpl _value, - $Res Function(_$PosterType_TranscriptGradientImpl) _then) - : super(_value, _then); - - /// Create a copy of PosterType - /// with the given fields replaced by the non-null parameter values. - @pragma('vm:prefer-inline') - @override - $Res call({ - Object? colors = null, - }) { - return _then(_$PosterType_TranscriptGradientImpl( - colors: null == colors - ? _value._colors - : colors // ignore: cast_nullable_to_non_nullable - as List, - )); - } +@override +bool operator ==(Object other) { + return identical(this, other) || (other.runtimeType == runtimeType&&other is Message_UpdateExtension&&(identical(other.field0, field0) || other.field0 == field0)); } -/// @nodoc - -class _$PosterType_TranscriptGradientImpl - extends PosterType_TranscriptGradient { - const _$PosterType_TranscriptGradientImpl( - {required final List colors}) - : _colors = colors, - super._(); - final List _colors; - @override - List get colors { - if (_colors is EqualUnmodifiableListView) return _colors; - // ignore: implicit_dynamic_type - return EqualUnmodifiableListView(_colors); - } +@override +int get hashCode => Object.hash(runtimeType,field0); - @override - String toString() { - return 'PosterType.transcriptGradient(colors: $colors)'; - } +@override +String toString() { + return 'Message.updateExtension(field0: $field0)'; +} - @override - bool operator ==(Object other) { - return identical(this, other) || - (other.runtimeType == runtimeType && - other is _$PosterType_TranscriptGradientImpl && - const DeepCollectionEquality().equals(other._colors, _colors)); - } - @override - int get hashCode => - Object.hash(runtimeType, const DeepCollectionEquality().hash(_colors)); - - /// Create a copy of PosterType - /// with the given fields replaced by the non-null parameter values. - @JsonKey(includeFromJson: false, includeToJson: false) - @override - @pragma('vm:prefer-inline') - _$$PosterType_TranscriptGradientImplCopyWith< - _$PosterType_TranscriptGradientImpl> - get copyWith => __$$PosterType_TranscriptGradientImplCopyWithImpl< - _$PosterType_TranscriptGradientImpl>(this, _$identity); - - @override - @optionalTypeArgs - TResult when({ - required TResult Function(List assets) photo, - required TResult Function(MonogramData data, PosterColor background) - monogram, - required TResult Function(MemojiData data, PosterColor background) memoji, - required TResult Function(TranscriptDynamicUserData data) transcriptDynamic, - required TResult Function(List colors) transcriptGradient, - }) { - return transcriptGradient(colors); - } +} - @override - @optionalTypeArgs - TResult? whenOrNull({ - TResult? Function(List assets)? photo, - TResult? Function(MonogramData data, PosterColor background)? monogram, - TResult? Function(MemojiData data, PosterColor background)? memoji, - TResult? Function(TranscriptDynamicUserData data)? transcriptDynamic, - TResult? Function(List colors)? transcriptGradient, - }) { - return transcriptGradient?.call(colors); - } +/// @nodoc +abstract mixin class $Message_UpdateExtensionCopyWith<$Res> implements $MessageCopyWith<$Res> { + factory $Message_UpdateExtensionCopyWith(Message_UpdateExtension value, $Res Function(Message_UpdateExtension) _then) = _$Message_UpdateExtensionCopyWithImpl; +@useResult +$Res call({ + UpdateExtensionMessage field0 +}); - @override - @optionalTypeArgs - TResult maybeWhen({ - TResult Function(List assets)? photo, - TResult Function(MonogramData data, PosterColor background)? monogram, - TResult Function(MemojiData data, PosterColor background)? memoji, - TResult Function(TranscriptDynamicUserData data)? transcriptDynamic, - TResult Function(List colors)? transcriptGradient, - required TResult orElse(), - }) { - if (transcriptGradient != null) { - return transcriptGradient(colors); - } - return orElse(); - } - @override - @optionalTypeArgs - TResult map({ - required TResult Function(PosterType_Photo value) photo, - required TResult Function(PosterType_Monogram value) monogram, - required TResult Function(PosterType_Memoji value) memoji, - required TResult Function(PosterType_TranscriptDynamic value) - transcriptDynamic, - required TResult Function(PosterType_TranscriptGradient value) - transcriptGradient, - }) { - return transcriptGradient(this); - } - @override - @optionalTypeArgs - TResult? mapOrNull({ - TResult? Function(PosterType_Photo value)? photo, - TResult? Function(PosterType_Monogram value)? monogram, - TResult? Function(PosterType_Memoji value)? memoji, - TResult? Function(PosterType_TranscriptDynamic value)? transcriptDynamic, - TResult? Function(PosterType_TranscriptGradient value)? transcriptGradient, - }) { - return transcriptGradient?.call(this); - } - @override - @optionalTypeArgs - TResult maybeMap({ - TResult Function(PosterType_Photo value)? photo, - TResult Function(PosterType_Monogram value)? monogram, - TResult Function(PosterType_Memoji value)? memoji, - TResult Function(PosterType_TranscriptDynamic value)? transcriptDynamic, - TResult Function(PosterType_TranscriptGradient value)? transcriptGradient, - required TResult orElse(), - }) { - if (transcriptGradient != null) { - return transcriptGradient(this); - } - return orElse(); - } } +/// @nodoc +class _$Message_UpdateExtensionCopyWithImpl<$Res> + implements $Message_UpdateExtensionCopyWith<$Res> { + _$Message_UpdateExtensionCopyWithImpl(this._self, this._then); -abstract class PosterType_TranscriptGradient extends PosterType { - const factory PosterType_TranscriptGradient( - {required final List colors}) = - _$PosterType_TranscriptGradientImpl; - const PosterType_TranscriptGradient._() : super._(); - - List get colors; + final Message_UpdateExtension _self; + final $Res Function(Message_UpdateExtension) _then; - /// Create a copy of PosterType - /// with the given fields replaced by the non-null parameter values. - @JsonKey(includeFromJson: false, includeToJson: false) - _$$PosterType_TranscriptGradientImplCopyWith< - _$PosterType_TranscriptGradientImpl> - get copyWith => throw _privateConstructorUsedError; +/// Create a copy of Message +/// with the given fields replaced by the non-null parameter values. +@pragma('vm:prefer-inline') $Res call({Object? field0 = null,}) { + return _then(Message_UpdateExtension( +null == field0 ? _self.field0 : field0 // ignore: cast_nullable_to_non_nullable +as UpdateExtensionMessage, + )); } -/// @nodoc -mixin _$PRPosterContentMaterialStyle { - @optionalTypeArgs - TResult when({ - required TResult Function(double variation, List colors, - bool vibrant, bool supportsVariation, bool needsToResolveVariation) - prPosterContentDiscreteColorsStyle, - required TResult Function() prPosterContentVibrantMaterialStyle, - required TResult Function(int gradientType, List colors, - String startPoint, Float64List locations, String endPoint) - prPosterContentGradientStyle, - }) => - throw _privateConstructorUsedError; - @optionalTypeArgs - TResult? whenOrNull({ - TResult? Function(double variation, List colors, bool vibrant, - bool supportsVariation, bool needsToResolveVariation)? - prPosterContentDiscreteColorsStyle, - TResult? Function()? prPosterContentVibrantMaterialStyle, - TResult? Function(int gradientType, List colors, String startPoint, - Float64List locations, String endPoint)? - prPosterContentGradientStyle, - }) => - throw _privateConstructorUsedError; - @optionalTypeArgs - TResult maybeWhen({ - TResult Function(double variation, List colors, bool vibrant, - bool supportsVariation, bool needsToResolveVariation)? - prPosterContentDiscreteColorsStyle, - TResult Function()? prPosterContentVibrantMaterialStyle, - TResult Function(int gradientType, List colors, String startPoint, - Float64List locations, String endPoint)? - prPosterContentGradientStyle, - required TResult orElse(), - }) => - throw _privateConstructorUsedError; - @optionalTypeArgs - TResult map({ - required TResult Function( - PRPosterContentMaterialStyle_PRPosterContentDiscreteColorsStyle - value) - prPosterContentDiscreteColorsStyle, - required TResult Function( - PRPosterContentMaterialStyle_PRPosterContentVibrantMaterialStyle - value) - prPosterContentVibrantMaterialStyle, - required TResult Function( - PRPosterContentMaterialStyle_PRPosterContentGradientStyle value) - prPosterContentGradientStyle, - }) => - throw _privateConstructorUsedError; - @optionalTypeArgs - TResult? mapOrNull({ - TResult? Function( - PRPosterContentMaterialStyle_PRPosterContentDiscreteColorsStyle - value)? - prPosterContentDiscreteColorsStyle, - TResult? Function( - PRPosterContentMaterialStyle_PRPosterContentVibrantMaterialStyle - value)? - prPosterContentVibrantMaterialStyle, - TResult? Function( - PRPosterContentMaterialStyle_PRPosterContentGradientStyle value)? - prPosterContentGradientStyle, - }) => - throw _privateConstructorUsedError; - @optionalTypeArgs - TResult maybeMap({ - TResult Function( - PRPosterContentMaterialStyle_PRPosterContentDiscreteColorsStyle - value)? - prPosterContentDiscreteColorsStyle, - TResult Function( - PRPosterContentMaterialStyle_PRPosterContentVibrantMaterialStyle - value)? - prPosterContentVibrantMaterialStyle, - TResult Function( - PRPosterContentMaterialStyle_PRPosterContentGradientStyle value)? - prPosterContentGradientStyle, - required TResult orElse(), - }) => - throw _privateConstructorUsedError; -} - -/// @nodoc -abstract class $PRPosterContentMaterialStyleCopyWith<$Res> { - factory $PRPosterContentMaterialStyleCopyWith( - PRPosterContentMaterialStyle value, - $Res Function(PRPosterContentMaterialStyle) then) = - _$PRPosterContentMaterialStyleCopyWithImpl<$Res, - PRPosterContentMaterialStyle>; -} - -/// @nodoc -class _$PRPosterContentMaterialStyleCopyWithImpl<$Res, - $Val extends PRPosterContentMaterialStyle> - implements $PRPosterContentMaterialStyleCopyWith<$Res> { - _$PRPosterContentMaterialStyleCopyWithImpl(this._value, this._then); - - // ignore: unused_field - final $Val _value; - // ignore: unused_field - final $Res Function($Val) _then; - - /// Create a copy of PRPosterContentMaterialStyle - /// with the given fields replaced by the non-null parameter values. -} - -/// @nodoc -abstract class _$$PRPosterContentMaterialStyle_PRPosterContentDiscreteColorsStyleImplCopyWith< - $Res> { - factory _$$PRPosterContentMaterialStyle_PRPosterContentDiscreteColorsStyleImplCopyWith( - _$PRPosterContentMaterialStyle_PRPosterContentDiscreteColorsStyleImpl - value, - $Res Function( - _$PRPosterContentMaterialStyle_PRPosterContentDiscreteColorsStyleImpl) - then) = - __$$PRPosterContentMaterialStyle_PRPosterContentDiscreteColorsStyleImplCopyWithImpl< - $Res>; - @useResult - $Res call( - {double variation, - List colors, - bool vibrant, - bool supportsVariation, - bool needsToResolveVariation}); -} - -/// @nodoc -class __$$PRPosterContentMaterialStyle_PRPosterContentDiscreteColorsStyleImplCopyWithImpl< - $Res> - extends _$PRPosterContentMaterialStyleCopyWithImpl<$Res, - _$PRPosterContentMaterialStyle_PRPosterContentDiscreteColorsStyleImpl> - implements - _$$PRPosterContentMaterialStyle_PRPosterContentDiscreteColorsStyleImplCopyWith< - $Res> { - __$$PRPosterContentMaterialStyle_PRPosterContentDiscreteColorsStyleImplCopyWithImpl( - _$PRPosterContentMaterialStyle_PRPosterContentDiscreteColorsStyleImpl - _value, - $Res Function( - _$PRPosterContentMaterialStyle_PRPosterContentDiscreteColorsStyleImpl) - _then) - : super(_value, _then); - - /// Create a copy of PRPosterContentMaterialStyle - /// with the given fields replaced by the non-null parameter values. - @pragma('vm:prefer-inline') - @override - $Res call({ - Object? variation = null, - Object? colors = null, - Object? vibrant = null, - Object? supportsVariation = null, - Object? needsToResolveVariation = null, - }) { - return _then( - _$PRPosterContentMaterialStyle_PRPosterContentDiscreteColorsStyleImpl( - variation: null == variation - ? _value.variation - : variation // ignore: cast_nullable_to_non_nullable - as double, - colors: null == colors - ? _value._colors - : colors // ignore: cast_nullable_to_non_nullable - as List, - vibrant: null == vibrant - ? _value.vibrant - : vibrant // ignore: cast_nullable_to_non_nullable - as bool, - supportsVariation: null == supportsVariation - ? _value.supportsVariation - : supportsVariation // ignore: cast_nullable_to_non_nullable - as bool, - needsToResolveVariation: null == needsToResolveVariation - ? _value.needsToResolveVariation - : needsToResolveVariation // ignore: cast_nullable_to_non_nullable - as bool, - )); - } + } /// @nodoc -class _$PRPosterContentMaterialStyle_PRPosterContentDiscreteColorsStyleImpl - extends PRPosterContentMaterialStyle_PRPosterContentDiscreteColorsStyle { - const _$PRPosterContentMaterialStyle_PRPosterContentDiscreteColorsStyleImpl( - {required this.variation, - required final List colors, - required this.vibrant, - required this.supportsVariation, - required this.needsToResolveVariation}) - : _colors = colors, - super._(); - @override - final double variation; - final List _colors; - @override - List get colors { - if (_colors is EqualUnmodifiableListView) return _colors; - // ignore: implicit_dynamic_type - return EqualUnmodifiableListView(_colors); - } +class Message_Error extends Message { + const Message_Error(this.field0): super._(); - @override - final bool vibrant; - @override - final bool supportsVariation; - @override - final bool needsToResolveVariation; - @override - String toString() { - return 'PRPosterContentMaterialStyle.prPosterContentDiscreteColorsStyle(variation: $variation, colors: $colors, vibrant: $vibrant, supportsVariation: $supportsVariation, needsToResolveVariation: $needsToResolveVariation)'; - } + final ErrorMessage field0; - @override - bool operator ==(Object other) { - return identical(this, other) || - (other.runtimeType == runtimeType && - other - is _$PRPosterContentMaterialStyle_PRPosterContentDiscreteColorsStyleImpl && - (identical(other.variation, variation) || - other.variation == variation) && - const DeepCollectionEquality().equals(other._colors, _colors) && - (identical(other.vibrant, vibrant) || other.vibrant == vibrant) && - (identical(other.supportsVariation, supportsVariation) || - other.supportsVariation == supportsVariation) && - (identical( - other.needsToResolveVariation, needsToResolveVariation) || - other.needsToResolveVariation == needsToResolveVariation)); - } +/// Create a copy of Message +/// with the given fields replaced by the non-null parameter values. +@JsonKey(includeFromJson: false, includeToJson: false) +@pragma('vm:prefer-inline') +$Message_ErrorCopyWith get copyWith => _$Message_ErrorCopyWithImpl(this, _$identity); - @override - int get hashCode => Object.hash( - runtimeType, - variation, - const DeepCollectionEquality().hash(_colors), - vibrant, - supportsVariation, - needsToResolveVariation); - - /// Create a copy of PRPosterContentMaterialStyle - /// with the given fields replaced by the non-null parameter values. - @JsonKey(includeFromJson: false, includeToJson: false) - @override - @pragma('vm:prefer-inline') - _$$PRPosterContentMaterialStyle_PRPosterContentDiscreteColorsStyleImplCopyWith< - _$PRPosterContentMaterialStyle_PRPosterContentDiscreteColorsStyleImpl> - get copyWith => - __$$PRPosterContentMaterialStyle_PRPosterContentDiscreteColorsStyleImplCopyWithImpl< - _$PRPosterContentMaterialStyle_PRPosterContentDiscreteColorsStyleImpl>( - this, _$identity); - - @override - @optionalTypeArgs - TResult when({ - required TResult Function(double variation, List colors, - bool vibrant, bool supportsVariation, bool needsToResolveVariation) - prPosterContentDiscreteColorsStyle, - required TResult Function() prPosterContentVibrantMaterialStyle, - required TResult Function(int gradientType, List colors, - String startPoint, Float64List locations, String endPoint) - prPosterContentGradientStyle, - }) { - return prPosterContentDiscreteColorsStyle( - variation, colors, vibrant, supportsVariation, needsToResolveVariation); - } - @override - @optionalTypeArgs - TResult? whenOrNull({ - TResult? Function(double variation, List colors, bool vibrant, - bool supportsVariation, bool needsToResolveVariation)? - prPosterContentDiscreteColorsStyle, - TResult? Function()? prPosterContentVibrantMaterialStyle, - TResult? Function(int gradientType, List colors, String startPoint, - Float64List locations, String endPoint)? - prPosterContentGradientStyle, - }) { - return prPosterContentDiscreteColorsStyle?.call( - variation, colors, vibrant, supportsVariation, needsToResolveVariation); - } - @override - @optionalTypeArgs - TResult maybeWhen({ - TResult Function(double variation, List colors, bool vibrant, - bool supportsVariation, bool needsToResolveVariation)? - prPosterContentDiscreteColorsStyle, - TResult Function()? prPosterContentVibrantMaterialStyle, - TResult Function(int gradientType, List colors, String startPoint, - Float64List locations, String endPoint)? - prPosterContentGradientStyle, - required TResult orElse(), - }) { - if (prPosterContentDiscreteColorsStyle != null) { - return prPosterContentDiscreteColorsStyle(variation, colors, vibrant, - supportsVariation, needsToResolveVariation); - } - return orElse(); - } +@override +bool operator ==(Object other) { + return identical(this, other) || (other.runtimeType == runtimeType&&other is Message_Error&&(identical(other.field0, field0) || other.field0 == field0)); +} - @override - @optionalTypeArgs - TResult map({ - required TResult Function( - PRPosterContentMaterialStyle_PRPosterContentDiscreteColorsStyle - value) - prPosterContentDiscreteColorsStyle, - required TResult Function( - PRPosterContentMaterialStyle_PRPosterContentVibrantMaterialStyle - value) - prPosterContentVibrantMaterialStyle, - required TResult Function( - PRPosterContentMaterialStyle_PRPosterContentGradientStyle value) - prPosterContentGradientStyle, - }) { - return prPosterContentDiscreteColorsStyle(this); - } - @override - @optionalTypeArgs - TResult? mapOrNull({ - TResult? Function( - PRPosterContentMaterialStyle_PRPosterContentDiscreteColorsStyle - value)? - prPosterContentDiscreteColorsStyle, - TResult? Function( - PRPosterContentMaterialStyle_PRPosterContentVibrantMaterialStyle - value)? - prPosterContentVibrantMaterialStyle, - TResult? Function( - PRPosterContentMaterialStyle_PRPosterContentGradientStyle value)? - prPosterContentGradientStyle, - }) { - return prPosterContentDiscreteColorsStyle?.call(this); - } +@override +int get hashCode => Object.hash(runtimeType,field0); - @override - @optionalTypeArgs - TResult maybeMap({ - TResult Function( - PRPosterContentMaterialStyle_PRPosterContentDiscreteColorsStyle - value)? - prPosterContentDiscreteColorsStyle, - TResult Function( - PRPosterContentMaterialStyle_PRPosterContentVibrantMaterialStyle - value)? - prPosterContentVibrantMaterialStyle, - TResult Function( - PRPosterContentMaterialStyle_PRPosterContentGradientStyle value)? - prPosterContentGradientStyle, - required TResult orElse(), - }) { - if (prPosterContentDiscreteColorsStyle != null) { - return prPosterContentDiscreteColorsStyle(this); - } - return orElse(); - } +@override +String toString() { + return 'Message.error(field0: $field0)'; } -abstract class PRPosterContentMaterialStyle_PRPosterContentDiscreteColorsStyle - extends PRPosterContentMaterialStyle { - const factory PRPosterContentMaterialStyle_PRPosterContentDiscreteColorsStyle( - {required final double variation, - required final List colors, - required final bool vibrant, - required final bool supportsVariation, - required final bool needsToResolveVariation}) = - _$PRPosterContentMaterialStyle_PRPosterContentDiscreteColorsStyleImpl; - const PRPosterContentMaterialStyle_PRPosterContentDiscreteColorsStyle._() - : super._(); - - double get variation; - List get colors; - bool get vibrant; - bool get supportsVariation; - bool get needsToResolveVariation; - - /// Create a copy of PRPosterContentMaterialStyle - /// with the given fields replaced by the non-null parameter values. - @JsonKey(includeFromJson: false, includeToJson: false) - _$$PRPosterContentMaterialStyle_PRPosterContentDiscreteColorsStyleImplCopyWith< - _$PRPosterContentMaterialStyle_PRPosterContentDiscreteColorsStyleImpl> - get copyWith => throw _privateConstructorUsedError; -} - -/// @nodoc -abstract class _$$PRPosterContentMaterialStyle_PRPosterContentVibrantMaterialStyleImplCopyWith< - $Res> { - factory _$$PRPosterContentMaterialStyle_PRPosterContentVibrantMaterialStyleImplCopyWith( - _$PRPosterContentMaterialStyle_PRPosterContentVibrantMaterialStyleImpl - value, - $Res Function( - _$PRPosterContentMaterialStyle_PRPosterContentVibrantMaterialStyleImpl) - then) = - __$$PRPosterContentMaterialStyle_PRPosterContentVibrantMaterialStyleImplCopyWithImpl< - $Res>; -} - -/// @nodoc -class __$$PRPosterContentMaterialStyle_PRPosterContentVibrantMaterialStyleImplCopyWithImpl< - $Res> - extends _$PRPosterContentMaterialStyleCopyWithImpl<$Res, - _$PRPosterContentMaterialStyle_PRPosterContentVibrantMaterialStyleImpl> - implements - _$$PRPosterContentMaterialStyle_PRPosterContentVibrantMaterialStyleImplCopyWith< - $Res> { - __$$PRPosterContentMaterialStyle_PRPosterContentVibrantMaterialStyleImplCopyWithImpl( - _$PRPosterContentMaterialStyle_PRPosterContentVibrantMaterialStyleImpl - _value, - $Res Function( - _$PRPosterContentMaterialStyle_PRPosterContentVibrantMaterialStyleImpl) - _then) - : super(_value, _then); - - /// Create a copy of PRPosterContentMaterialStyle - /// with the given fields replaced by the non-null parameter values. -} - -/// @nodoc - -class _$PRPosterContentMaterialStyle_PRPosterContentVibrantMaterialStyleImpl - extends PRPosterContentMaterialStyle_PRPosterContentVibrantMaterialStyle { - const _$PRPosterContentMaterialStyle_PRPosterContentVibrantMaterialStyleImpl() - : super._(); - - @override - String toString() { - return 'PRPosterContentMaterialStyle.prPosterContentVibrantMaterialStyle()'; - } - - @override - bool operator ==(Object other) { - return identical(this, other) || - (other.runtimeType == runtimeType && - other - is _$PRPosterContentMaterialStyle_PRPosterContentVibrantMaterialStyleImpl); - } - @override - int get hashCode => runtimeType.hashCode; - - @override - @optionalTypeArgs - TResult when({ - required TResult Function(double variation, List colors, - bool vibrant, bool supportsVariation, bool needsToResolveVariation) - prPosterContentDiscreteColorsStyle, - required TResult Function() prPosterContentVibrantMaterialStyle, - required TResult Function(int gradientType, List colors, - String startPoint, Float64List locations, String endPoint) - prPosterContentGradientStyle, - }) { - return prPosterContentVibrantMaterialStyle(); - } +} - @override - @optionalTypeArgs - TResult? whenOrNull({ - TResult? Function(double variation, List colors, bool vibrant, - bool supportsVariation, bool needsToResolveVariation)? - prPosterContentDiscreteColorsStyle, - TResult? Function()? prPosterContentVibrantMaterialStyle, - TResult? Function(int gradientType, List colors, String startPoint, - Float64List locations, String endPoint)? - prPosterContentGradientStyle, - }) { - return prPosterContentVibrantMaterialStyle?.call(); - } +/// @nodoc +abstract mixin class $Message_ErrorCopyWith<$Res> implements $MessageCopyWith<$Res> { + factory $Message_ErrorCopyWith(Message_Error value, $Res Function(Message_Error) _then) = _$Message_ErrorCopyWithImpl; +@useResult +$Res call({ + ErrorMessage field0 +}); - @override - @optionalTypeArgs - TResult maybeWhen({ - TResult Function(double variation, List colors, bool vibrant, - bool supportsVariation, bool needsToResolveVariation)? - prPosterContentDiscreteColorsStyle, - TResult Function()? prPosterContentVibrantMaterialStyle, - TResult Function(int gradientType, List colors, String startPoint, - Float64List locations, String endPoint)? - prPosterContentGradientStyle, - required TResult orElse(), - }) { - if (prPosterContentVibrantMaterialStyle != null) { - return prPosterContentVibrantMaterialStyle(); - } - return orElse(); - } - @override - @optionalTypeArgs - TResult map({ - required TResult Function( - PRPosterContentMaterialStyle_PRPosterContentDiscreteColorsStyle - value) - prPosterContentDiscreteColorsStyle, - required TResult Function( - PRPosterContentMaterialStyle_PRPosterContentVibrantMaterialStyle - value) - prPosterContentVibrantMaterialStyle, - required TResult Function( - PRPosterContentMaterialStyle_PRPosterContentGradientStyle value) - prPosterContentGradientStyle, - }) { - return prPosterContentVibrantMaterialStyle(this); - } - @override - @optionalTypeArgs - TResult? mapOrNull({ - TResult? Function( - PRPosterContentMaterialStyle_PRPosterContentDiscreteColorsStyle - value)? - prPosterContentDiscreteColorsStyle, - TResult? Function( - PRPosterContentMaterialStyle_PRPosterContentVibrantMaterialStyle - value)? - prPosterContentVibrantMaterialStyle, - TResult? Function( - PRPosterContentMaterialStyle_PRPosterContentGradientStyle value)? - prPosterContentGradientStyle, - }) { - return prPosterContentVibrantMaterialStyle?.call(this); - } - @override - @optionalTypeArgs - TResult maybeMap({ - TResult Function( - PRPosterContentMaterialStyle_PRPosterContentDiscreteColorsStyle - value)? - prPosterContentDiscreteColorsStyle, - TResult Function( - PRPosterContentMaterialStyle_PRPosterContentVibrantMaterialStyle - value)? - prPosterContentVibrantMaterialStyle, - TResult Function( - PRPosterContentMaterialStyle_PRPosterContentGradientStyle value)? - prPosterContentGradientStyle, - required TResult orElse(), - }) { - if (prPosterContentVibrantMaterialStyle != null) { - return prPosterContentVibrantMaterialStyle(this); - } - return orElse(); - } } +/// @nodoc +class _$Message_ErrorCopyWithImpl<$Res> + implements $Message_ErrorCopyWith<$Res> { + _$Message_ErrorCopyWithImpl(this._self, this._then); -abstract class PRPosterContentMaterialStyle_PRPosterContentVibrantMaterialStyle - extends PRPosterContentMaterialStyle { - const factory PRPosterContentMaterialStyle_PRPosterContentVibrantMaterialStyle() = - _$PRPosterContentMaterialStyle_PRPosterContentVibrantMaterialStyleImpl; - const PRPosterContentMaterialStyle_PRPosterContentVibrantMaterialStyle._() - : super._(); -} - -/// @nodoc -abstract class _$$PRPosterContentMaterialStyle_PRPosterContentGradientStyleImplCopyWith< - $Res> { - factory _$$PRPosterContentMaterialStyle_PRPosterContentGradientStyleImplCopyWith( - _$PRPosterContentMaterialStyle_PRPosterContentGradientStyleImpl value, - $Res Function( - _$PRPosterContentMaterialStyle_PRPosterContentGradientStyleImpl) - then) = - __$$PRPosterContentMaterialStyle_PRPosterContentGradientStyleImplCopyWithImpl< - $Res>; - @useResult - $Res call( - {int gradientType, - List colors, - String startPoint, - Float64List locations, - String endPoint}); -} - -/// @nodoc -class __$$PRPosterContentMaterialStyle_PRPosterContentGradientStyleImplCopyWithImpl< - $Res> - extends _$PRPosterContentMaterialStyleCopyWithImpl<$Res, - _$PRPosterContentMaterialStyle_PRPosterContentGradientStyleImpl> - implements - _$$PRPosterContentMaterialStyle_PRPosterContentGradientStyleImplCopyWith< - $Res> { - __$$PRPosterContentMaterialStyle_PRPosterContentGradientStyleImplCopyWithImpl( - _$PRPosterContentMaterialStyle_PRPosterContentGradientStyleImpl _value, - $Res Function( - _$PRPosterContentMaterialStyle_PRPosterContentGradientStyleImpl) - _then) - : super(_value, _then); - - /// Create a copy of PRPosterContentMaterialStyle - /// with the given fields replaced by the non-null parameter values. - @pragma('vm:prefer-inline') - @override - $Res call({ - Object? gradientType = null, - Object? colors = null, - Object? startPoint = null, - Object? locations = null, - Object? endPoint = null, - }) { - return _then( - _$PRPosterContentMaterialStyle_PRPosterContentGradientStyleImpl( - gradientType: null == gradientType - ? _value.gradientType - : gradientType // ignore: cast_nullable_to_non_nullable - as int, - colors: null == colors - ? _value._colors - : colors // ignore: cast_nullable_to_non_nullable - as List, - startPoint: null == startPoint - ? _value.startPoint - : startPoint // ignore: cast_nullable_to_non_nullable - as String, - locations: null == locations - ? _value.locations - : locations // ignore: cast_nullable_to_non_nullable - as Float64List, - endPoint: null == endPoint - ? _value.endPoint - : endPoint // ignore: cast_nullable_to_non_nullable - as String, - )); - } -} + final Message_Error _self; + final $Res Function(Message_Error) _then; -/// @nodoc +/// Create a copy of Message +/// with the given fields replaced by the non-null parameter values. +@pragma('vm:prefer-inline') $Res call({Object? field0 = null,}) { + return _then(Message_Error( +null == field0 ? _self.field0 : field0 // ignore: cast_nullable_to_non_nullable +as ErrorMessage, + )); +} -class _$PRPosterContentMaterialStyle_PRPosterContentGradientStyleImpl - extends PRPosterContentMaterialStyle_PRPosterContentGradientStyle { - const _$PRPosterContentMaterialStyle_PRPosterContentGradientStyleImpl( - {required this.gradientType, - required final List colors, - required this.startPoint, - required this.locations, - required this.endPoint}) - : _colors = colors, - super._(); - @override - final int gradientType; - final List _colors; - @override - List get colors { - if (_colors is EqualUnmodifiableListView) return _colors; - // ignore: implicit_dynamic_type - return EqualUnmodifiableListView(_colors); - } +} - @override - final String startPoint; - @override - final Float64List locations; - @override - final String endPoint; +/// @nodoc - @override - String toString() { - return 'PRPosterContentMaterialStyle.prPosterContentGradientStyle(gradientType: $gradientType, colors: $colors, startPoint: $startPoint, locations: $locations, endPoint: $endPoint)'; - } - @override - bool operator ==(Object other) { - return identical(this, other) || - (other.runtimeType == runtimeType && - other - is _$PRPosterContentMaterialStyle_PRPosterContentGradientStyleImpl && - (identical(other.gradientType, gradientType) || - other.gradientType == gradientType) && - const DeepCollectionEquality().equals(other._colors, _colors) && - (identical(other.startPoint, startPoint) || - other.startPoint == startPoint) && - const DeepCollectionEquality().equals(other.locations, locations) && - (identical(other.endPoint, endPoint) || - other.endPoint == endPoint)); - } +class Message_MoveToRecycleBin extends Message { + const Message_MoveToRecycleBin(this.field0): super._(); - @override - int get hashCode => Object.hash( - runtimeType, - gradientType, - const DeepCollectionEquality().hash(_colors), - startPoint, - const DeepCollectionEquality().hash(locations), - endPoint); - - /// Create a copy of PRPosterContentMaterialStyle - /// with the given fields replaced by the non-null parameter values. - @JsonKey(includeFromJson: false, includeToJson: false) - @override - @pragma('vm:prefer-inline') - _$$PRPosterContentMaterialStyle_PRPosterContentGradientStyleImplCopyWith< - _$PRPosterContentMaterialStyle_PRPosterContentGradientStyleImpl> - get copyWith => - __$$PRPosterContentMaterialStyle_PRPosterContentGradientStyleImplCopyWithImpl< - _$PRPosterContentMaterialStyle_PRPosterContentGradientStyleImpl>( - this, _$identity); - - @override - @optionalTypeArgs - TResult when({ - required TResult Function(double variation, List colors, - bool vibrant, bool supportsVariation, bool needsToResolveVariation) - prPosterContentDiscreteColorsStyle, - required TResult Function() prPosterContentVibrantMaterialStyle, - required TResult Function(int gradientType, List colors, - String startPoint, Float64List locations, String endPoint) - prPosterContentGradientStyle, - }) { - return prPosterContentGradientStyle( - gradientType, colors, startPoint, locations, endPoint); - } - @override - @optionalTypeArgs - TResult? whenOrNull({ - TResult? Function(double variation, List colors, bool vibrant, - bool supportsVariation, bool needsToResolveVariation)? - prPosterContentDiscreteColorsStyle, - TResult? Function()? prPosterContentVibrantMaterialStyle, - TResult? Function(int gradientType, List colors, String startPoint, - Float64List locations, String endPoint)? - prPosterContentGradientStyle, - }) { - return prPosterContentGradientStyle?.call( - gradientType, colors, startPoint, locations, endPoint); - } + final MoveToRecycleBinMessage field0; - @override - @optionalTypeArgs - TResult maybeWhen({ - TResult Function(double variation, List colors, bool vibrant, - bool supportsVariation, bool needsToResolveVariation)? - prPosterContentDiscreteColorsStyle, - TResult Function()? prPosterContentVibrantMaterialStyle, - TResult Function(int gradientType, List colors, String startPoint, - Float64List locations, String endPoint)? - prPosterContentGradientStyle, - required TResult orElse(), - }) { - if (prPosterContentGradientStyle != null) { - return prPosterContentGradientStyle( - gradientType, colors, startPoint, locations, endPoint); - } - return orElse(); - } +/// Create a copy of Message +/// with the given fields replaced by the non-null parameter values. +@JsonKey(includeFromJson: false, includeToJson: false) +@pragma('vm:prefer-inline') +$Message_MoveToRecycleBinCopyWith get copyWith => _$Message_MoveToRecycleBinCopyWithImpl(this, _$identity); - @override - @optionalTypeArgs - TResult map({ - required TResult Function( - PRPosterContentMaterialStyle_PRPosterContentDiscreteColorsStyle - value) - prPosterContentDiscreteColorsStyle, - required TResult Function( - PRPosterContentMaterialStyle_PRPosterContentVibrantMaterialStyle - value) - prPosterContentVibrantMaterialStyle, - required TResult Function( - PRPosterContentMaterialStyle_PRPosterContentGradientStyle value) - prPosterContentGradientStyle, - }) { - return prPosterContentGradientStyle(this); - } - @override - @optionalTypeArgs - TResult? mapOrNull({ - TResult? Function( - PRPosterContentMaterialStyle_PRPosterContentDiscreteColorsStyle - value)? - prPosterContentDiscreteColorsStyle, - TResult? Function( - PRPosterContentMaterialStyle_PRPosterContentVibrantMaterialStyle - value)? - prPosterContentVibrantMaterialStyle, - TResult? Function( - PRPosterContentMaterialStyle_PRPosterContentGradientStyle value)? - prPosterContentGradientStyle, - }) { - return prPosterContentGradientStyle?.call(this); - } - @override - @optionalTypeArgs - TResult maybeMap({ - TResult Function( - PRPosterContentMaterialStyle_PRPosterContentDiscreteColorsStyle - value)? - prPosterContentDiscreteColorsStyle, - TResult Function( - PRPosterContentMaterialStyle_PRPosterContentVibrantMaterialStyle - value)? - prPosterContentVibrantMaterialStyle, - TResult Function( - PRPosterContentMaterialStyle_PRPosterContentGradientStyle value)? - prPosterContentGradientStyle, - required TResult orElse(), - }) { - if (prPosterContentGradientStyle != null) { - return prPosterContentGradientStyle(this); - } - return orElse(); - } +@override +bool operator ==(Object other) { + return identical(this, other) || (other.runtimeType == runtimeType&&other is Message_MoveToRecycleBin&&(identical(other.field0, field0) || other.field0 == field0)); } -abstract class PRPosterContentMaterialStyle_PRPosterContentGradientStyle - extends PRPosterContentMaterialStyle { - const factory PRPosterContentMaterialStyle_PRPosterContentGradientStyle( - {required final int gradientType, - required final List colors, - required final String startPoint, - required final Float64List locations, - required final String endPoint}) = - _$PRPosterContentMaterialStyle_PRPosterContentGradientStyleImpl; - const PRPosterContentMaterialStyle_PRPosterContentGradientStyle._() - : super._(); - int get gradientType; - List get colors; - String get startPoint; - Float64List get locations; - String get endPoint; +@override +int get hashCode => Object.hash(runtimeType,field0); - /// Create a copy of PRPosterContentMaterialStyle - /// with the given fields replaced by the non-null parameter values. - @JsonKey(includeFromJson: false, includeToJson: false) - _$$PRPosterContentMaterialStyle_PRPosterContentGradientStyleImplCopyWith< - _$PRPosterContentMaterialStyle_PRPosterContentGradientStyleImpl> - get copyWith => throw _privateConstructorUsedError; +@override +String toString() { + return 'Message.moveToRecycleBin(field0: $field0)'; } -/// @nodoc -mixin _$PushMessage { - @optionalTypeArgs - TResult when({ - required TResult Function(MessageInst field0) iMessage, - required TResult Function(String uuid, String? error) sendConfirm, - required TResult Function(RegisterState field0) registrationState, - required TResult Function(SharedAlbum field0) newPhotostream, - required TResult Function(FTMessage field0) faceTime, - required TResult Function(StatusKitMessage field0) statusUpdate, - required TResult Function(IdmsMessage field0) idms, - required TResult Function(bool field0) twoFaAuthEvent, - required TResult Function() circleFinishEvent, - required TResult Function( - String sender, String beacon, BeaconAttributes attributes) - beaconShared, - }) => - throw _privateConstructorUsedError; - @optionalTypeArgs - TResult? whenOrNull({ - TResult? Function(MessageInst field0)? iMessage, - TResult? Function(String uuid, String? error)? sendConfirm, - TResult? Function(RegisterState field0)? registrationState, - TResult? Function(SharedAlbum field0)? newPhotostream, - TResult? Function(FTMessage field0)? faceTime, - TResult? Function(StatusKitMessage field0)? statusUpdate, - TResult? Function(IdmsMessage field0)? idms, - TResult? Function(bool field0)? twoFaAuthEvent, - TResult? Function()? circleFinishEvent, - TResult? Function( - String sender, String beacon, BeaconAttributes attributes)? - beaconShared, - }) => - throw _privateConstructorUsedError; - @optionalTypeArgs - TResult maybeWhen({ - TResult Function(MessageInst field0)? iMessage, - TResult Function(String uuid, String? error)? sendConfirm, - TResult Function(RegisterState field0)? registrationState, - TResult Function(SharedAlbum field0)? newPhotostream, - TResult Function(FTMessage field0)? faceTime, - TResult Function(StatusKitMessage field0)? statusUpdate, - TResult Function(IdmsMessage field0)? idms, - TResult Function(bool field0)? twoFaAuthEvent, - TResult Function()? circleFinishEvent, - TResult Function(String sender, String beacon, BeaconAttributes attributes)? - beaconShared, - required TResult orElse(), - }) => - throw _privateConstructorUsedError; - @optionalTypeArgs - TResult map({ - required TResult Function(PushMessage_IMessage value) iMessage, - required TResult Function(PushMessage_SendConfirm value) sendConfirm, - required TResult Function(PushMessage_RegistrationState value) - registrationState, - required TResult Function(PushMessage_NewPhotostream value) newPhotostream, - required TResult Function(PushMessage_FaceTime value) faceTime, - required TResult Function(PushMessage_StatusUpdate value) statusUpdate, - required TResult Function(PushMessage_Idms value) idms, - required TResult Function(PushMessage_TwoFaAuthEvent value) twoFaAuthEvent, - required TResult Function(PushMessage_CircleFinishEvent value) - circleFinishEvent, - required TResult Function(PushMessage_BeaconShared value) beaconShared, - }) => - throw _privateConstructorUsedError; - @optionalTypeArgs - TResult? mapOrNull({ - TResult? Function(PushMessage_IMessage value)? iMessage, - TResult? Function(PushMessage_SendConfirm value)? sendConfirm, - TResult? Function(PushMessage_RegistrationState value)? registrationState, - TResult? Function(PushMessage_NewPhotostream value)? newPhotostream, - TResult? Function(PushMessage_FaceTime value)? faceTime, - TResult? Function(PushMessage_StatusUpdate value)? statusUpdate, - TResult? Function(PushMessage_Idms value)? idms, - TResult? Function(PushMessage_TwoFaAuthEvent value)? twoFaAuthEvent, - TResult? Function(PushMessage_CircleFinishEvent value)? circleFinishEvent, - TResult? Function(PushMessage_BeaconShared value)? beaconShared, - }) => - throw _privateConstructorUsedError; - @optionalTypeArgs - TResult maybeMap({ - TResult Function(PushMessage_IMessage value)? iMessage, - TResult Function(PushMessage_SendConfirm value)? sendConfirm, - TResult Function(PushMessage_RegistrationState value)? registrationState, - TResult Function(PushMessage_NewPhotostream value)? newPhotostream, - TResult Function(PushMessage_FaceTime value)? faceTime, - TResult Function(PushMessage_StatusUpdate value)? statusUpdate, - TResult Function(PushMessage_Idms value)? idms, - TResult Function(PushMessage_TwoFaAuthEvent value)? twoFaAuthEvent, - TResult Function(PushMessage_CircleFinishEvent value)? circleFinishEvent, - TResult Function(PushMessage_BeaconShared value)? beaconShared, - required TResult orElse(), - }) => - throw _privateConstructorUsedError; -} - -/// @nodoc -abstract class $PushMessageCopyWith<$Res> { - factory $PushMessageCopyWith( - PushMessage value, $Res Function(PushMessage) then) = - _$PushMessageCopyWithImpl<$Res, PushMessage>; -} - -/// @nodoc -class _$PushMessageCopyWithImpl<$Res, $Val extends PushMessage> - implements $PushMessageCopyWith<$Res> { - _$PushMessageCopyWithImpl(this._value, this._then); - - // ignore: unused_field - final $Val _value; - // ignore: unused_field - final $Res Function($Val) _then; - - /// Create a copy of PushMessage - /// with the given fields replaced by the non-null parameter values. -} - -/// @nodoc -abstract class _$$PushMessage_IMessageImplCopyWith<$Res> { - factory _$$PushMessage_IMessageImplCopyWith(_$PushMessage_IMessageImpl value, - $Res Function(_$PushMessage_IMessageImpl) then) = - __$$PushMessage_IMessageImplCopyWithImpl<$Res>; - @useResult - $Res call({MessageInst field0}); -} - -/// @nodoc -class __$$PushMessage_IMessageImplCopyWithImpl<$Res> - extends _$PushMessageCopyWithImpl<$Res, _$PushMessage_IMessageImpl> - implements _$$PushMessage_IMessageImplCopyWith<$Res> { - __$$PushMessage_IMessageImplCopyWithImpl(_$PushMessage_IMessageImpl _value, - $Res Function(_$PushMessage_IMessageImpl) _then) - : super(_value, _then); - - /// Create a copy of PushMessage - /// with the given fields replaced by the non-null parameter values. - @pragma('vm:prefer-inline') - @override - $Res call({ - Object? field0 = null, - }) { - return _then(_$PushMessage_IMessageImpl( - null == field0 - ? _value.field0 - : field0 // ignore: cast_nullable_to_non_nullable - as MessageInst, - )); - } + } /// @nodoc +abstract mixin class $Message_MoveToRecycleBinCopyWith<$Res> implements $MessageCopyWith<$Res> { + factory $Message_MoveToRecycleBinCopyWith(Message_MoveToRecycleBin value, $Res Function(Message_MoveToRecycleBin) _then) = _$Message_MoveToRecycleBinCopyWithImpl; +@useResult +$Res call({ + MoveToRecycleBinMessage field0 +}); -class _$PushMessage_IMessageImpl extends PushMessage_IMessage { - const _$PushMessage_IMessageImpl(this.field0) : super._(); - - @override - final MessageInst field0; - - @override - String toString() { - return 'PushMessage.iMessage(field0: $field0)'; - } - - @override - bool operator ==(Object other) { - return identical(this, other) || - (other.runtimeType == runtimeType && - other is _$PushMessage_IMessageImpl && - (identical(other.field0, field0) || other.field0 == field0)); - } - - @override - int get hashCode => Object.hash(runtimeType, field0); - - /// Create a copy of PushMessage - /// with the given fields replaced by the non-null parameter values. - @JsonKey(includeFromJson: false, includeToJson: false) - @override - @pragma('vm:prefer-inline') - _$$PushMessage_IMessageImplCopyWith<_$PushMessage_IMessageImpl> - get copyWith => - __$$PushMessage_IMessageImplCopyWithImpl<_$PushMessage_IMessageImpl>( - this, _$identity); - - @override - @optionalTypeArgs - TResult when({ - required TResult Function(MessageInst field0) iMessage, - required TResult Function(String uuid, String? error) sendConfirm, - required TResult Function(RegisterState field0) registrationState, - required TResult Function(SharedAlbum field0) newPhotostream, - required TResult Function(FTMessage field0) faceTime, - required TResult Function(StatusKitMessage field0) statusUpdate, - required TResult Function(IdmsMessage field0) idms, - required TResult Function(bool field0) twoFaAuthEvent, - required TResult Function() circleFinishEvent, - required TResult Function( - String sender, String beacon, BeaconAttributes attributes) - beaconShared, - }) { - return iMessage(field0); - } - @override - @optionalTypeArgs - TResult? whenOrNull({ - TResult? Function(MessageInst field0)? iMessage, - TResult? Function(String uuid, String? error)? sendConfirm, - TResult? Function(RegisterState field0)? registrationState, - TResult? Function(SharedAlbum field0)? newPhotostream, - TResult? Function(FTMessage field0)? faceTime, - TResult? Function(StatusKitMessage field0)? statusUpdate, - TResult? Function(IdmsMessage field0)? idms, - TResult? Function(bool field0)? twoFaAuthEvent, - TResult? Function()? circleFinishEvent, - TResult? Function( - String sender, String beacon, BeaconAttributes attributes)? - beaconShared, - }) { - return iMessage?.call(field0); - } - @override - @optionalTypeArgs - TResult maybeWhen({ - TResult Function(MessageInst field0)? iMessage, - TResult Function(String uuid, String? error)? sendConfirm, - TResult Function(RegisterState field0)? registrationState, - TResult Function(SharedAlbum field0)? newPhotostream, - TResult Function(FTMessage field0)? faceTime, - TResult Function(StatusKitMessage field0)? statusUpdate, - TResult Function(IdmsMessage field0)? idms, - TResult Function(bool field0)? twoFaAuthEvent, - TResult Function()? circleFinishEvent, - TResult Function(String sender, String beacon, BeaconAttributes attributes)? - beaconShared, - required TResult orElse(), - }) { - if (iMessage != null) { - return iMessage(field0); - } - return orElse(); - } - @override - @optionalTypeArgs - TResult map({ - required TResult Function(PushMessage_IMessage value) iMessage, - required TResult Function(PushMessage_SendConfirm value) sendConfirm, - required TResult Function(PushMessage_RegistrationState value) - registrationState, - required TResult Function(PushMessage_NewPhotostream value) newPhotostream, - required TResult Function(PushMessage_FaceTime value) faceTime, - required TResult Function(PushMessage_StatusUpdate value) statusUpdate, - required TResult Function(PushMessage_Idms value) idms, - required TResult Function(PushMessage_TwoFaAuthEvent value) twoFaAuthEvent, - required TResult Function(PushMessage_CircleFinishEvent value) - circleFinishEvent, - required TResult Function(PushMessage_BeaconShared value) beaconShared, - }) { - return iMessage(this); - } +} +/// @nodoc +class _$Message_MoveToRecycleBinCopyWithImpl<$Res> + implements $Message_MoveToRecycleBinCopyWith<$Res> { + _$Message_MoveToRecycleBinCopyWithImpl(this._self, this._then); - @override - @optionalTypeArgs - TResult? mapOrNull({ - TResult? Function(PushMessage_IMessage value)? iMessage, - TResult? Function(PushMessage_SendConfirm value)? sendConfirm, - TResult? Function(PushMessage_RegistrationState value)? registrationState, - TResult? Function(PushMessage_NewPhotostream value)? newPhotostream, - TResult? Function(PushMessage_FaceTime value)? faceTime, - TResult? Function(PushMessage_StatusUpdate value)? statusUpdate, - TResult? Function(PushMessage_Idms value)? idms, - TResult? Function(PushMessage_TwoFaAuthEvent value)? twoFaAuthEvent, - TResult? Function(PushMessage_CircleFinishEvent value)? circleFinishEvent, - TResult? Function(PushMessage_BeaconShared value)? beaconShared, - }) { - return iMessage?.call(this); - } + final Message_MoveToRecycleBin _self; + final $Res Function(Message_MoveToRecycleBin) _then; - @override - @optionalTypeArgs - TResult maybeMap({ - TResult Function(PushMessage_IMessage value)? iMessage, - TResult Function(PushMessage_SendConfirm value)? sendConfirm, - TResult Function(PushMessage_RegistrationState value)? registrationState, - TResult Function(PushMessage_NewPhotostream value)? newPhotostream, - TResult Function(PushMessage_FaceTime value)? faceTime, - TResult Function(PushMessage_StatusUpdate value)? statusUpdate, - TResult Function(PushMessage_Idms value)? idms, - TResult Function(PushMessage_TwoFaAuthEvent value)? twoFaAuthEvent, - TResult Function(PushMessage_CircleFinishEvent value)? circleFinishEvent, - TResult Function(PushMessage_BeaconShared value)? beaconShared, - required TResult orElse(), - }) { - if (iMessage != null) { - return iMessage(this); - } - return orElse(); - } +/// Create a copy of Message +/// with the given fields replaced by the non-null parameter values. +@pragma('vm:prefer-inline') $Res call({Object? field0 = null,}) { + return _then(Message_MoveToRecycleBin( +null == field0 ? _self.field0 : field0 // ignore: cast_nullable_to_non_nullable +as MoveToRecycleBinMessage, + )); } -abstract class PushMessage_IMessage extends PushMessage { - const factory PushMessage_IMessage(final MessageInst field0) = - _$PushMessage_IMessageImpl; - const PushMessage_IMessage._() : super._(); - - MessageInst get field0; - - /// Create a copy of PushMessage - /// with the given fields replaced by the non-null parameter values. - @JsonKey(includeFromJson: false, includeToJson: false) - _$$PushMessage_IMessageImplCopyWith<_$PushMessage_IMessageImpl> - get copyWith => throw _privateConstructorUsedError; -} - -/// @nodoc -abstract class _$$PushMessage_SendConfirmImplCopyWith<$Res> { - factory _$$PushMessage_SendConfirmImplCopyWith( - _$PushMessage_SendConfirmImpl value, - $Res Function(_$PushMessage_SendConfirmImpl) then) = - __$$PushMessage_SendConfirmImplCopyWithImpl<$Res>; - @useResult - $Res call({String uuid, String? error}); -} - -/// @nodoc -class __$$PushMessage_SendConfirmImplCopyWithImpl<$Res> - extends _$PushMessageCopyWithImpl<$Res, _$PushMessage_SendConfirmImpl> - implements _$$PushMessage_SendConfirmImplCopyWith<$Res> { - __$$PushMessage_SendConfirmImplCopyWithImpl( - _$PushMessage_SendConfirmImpl _value, - $Res Function(_$PushMessage_SendConfirmImpl) _then) - : super(_value, _then); - - /// Create a copy of PushMessage - /// with the given fields replaced by the non-null parameter values. - @pragma('vm:prefer-inline') - @override - $Res call({ - Object? uuid = null, - Object? error = freezed, - }) { - return _then(_$PushMessage_SendConfirmImpl( - uuid: null == uuid - ? _value.uuid - : uuid // ignore: cast_nullable_to_non_nullable - as String, - error: freezed == error - ? _value.error - : error // ignore: cast_nullable_to_non_nullable - as String?, - )); - } + } /// @nodoc -class _$PushMessage_SendConfirmImpl extends PushMessage_SendConfirm { - const _$PushMessage_SendConfirmImpl({required this.uuid, this.error}) - : super._(); - @override - final String uuid; - @override - final String? error; +class Message_RecoverChat extends Message { + const Message_RecoverChat(this.field0): super._(); - @override - String toString() { - return 'PushMessage.sendConfirm(uuid: $uuid, error: $error)'; - } - @override - bool operator ==(Object other) { - return identical(this, other) || - (other.runtimeType == runtimeType && - other is _$PushMessage_SendConfirmImpl && - (identical(other.uuid, uuid) || other.uuid == uuid) && - (identical(other.error, error) || other.error == error)); - } + final OperatedChat field0; - @override - int get hashCode => Object.hash(runtimeType, uuid, error); - - /// Create a copy of PushMessage - /// with the given fields replaced by the non-null parameter values. - @JsonKey(includeFromJson: false, includeToJson: false) - @override - @pragma('vm:prefer-inline') - _$$PushMessage_SendConfirmImplCopyWith<_$PushMessage_SendConfirmImpl> - get copyWith => __$$PushMessage_SendConfirmImplCopyWithImpl< - _$PushMessage_SendConfirmImpl>(this, _$identity); - - @override - @optionalTypeArgs - TResult when({ - required TResult Function(MessageInst field0) iMessage, - required TResult Function(String uuid, String? error) sendConfirm, - required TResult Function(RegisterState field0) registrationState, - required TResult Function(SharedAlbum field0) newPhotostream, - required TResult Function(FTMessage field0) faceTime, - required TResult Function(StatusKitMessage field0) statusUpdate, - required TResult Function(IdmsMessage field0) idms, - required TResult Function(bool field0) twoFaAuthEvent, - required TResult Function() circleFinishEvent, - required TResult Function( - String sender, String beacon, BeaconAttributes attributes) - beaconShared, - }) { - return sendConfirm(uuid, error); - } +/// Create a copy of Message +/// with the given fields replaced by the non-null parameter values. +@JsonKey(includeFromJson: false, includeToJson: false) +@pragma('vm:prefer-inline') +$Message_RecoverChatCopyWith get copyWith => _$Message_RecoverChatCopyWithImpl(this, _$identity); - @override - @optionalTypeArgs - TResult? whenOrNull({ - TResult? Function(MessageInst field0)? iMessage, - TResult? Function(String uuid, String? error)? sendConfirm, - TResult? Function(RegisterState field0)? registrationState, - TResult? Function(SharedAlbum field0)? newPhotostream, - TResult? Function(FTMessage field0)? faceTime, - TResult? Function(StatusKitMessage field0)? statusUpdate, - TResult? Function(IdmsMessage field0)? idms, - TResult? Function(bool field0)? twoFaAuthEvent, - TResult? Function()? circleFinishEvent, - TResult? Function( - String sender, String beacon, BeaconAttributes attributes)? - beaconShared, - }) { - return sendConfirm?.call(uuid, error); - } - @override - @optionalTypeArgs - TResult maybeWhen({ - TResult Function(MessageInst field0)? iMessage, - TResult Function(String uuid, String? error)? sendConfirm, - TResult Function(RegisterState field0)? registrationState, - TResult Function(SharedAlbum field0)? newPhotostream, - TResult Function(FTMessage field0)? faceTime, - TResult Function(StatusKitMessage field0)? statusUpdate, - TResult Function(IdmsMessage field0)? idms, - TResult Function(bool field0)? twoFaAuthEvent, - TResult Function()? circleFinishEvent, - TResult Function(String sender, String beacon, BeaconAttributes attributes)? - beaconShared, - required TResult orElse(), - }) { - if (sendConfirm != null) { - return sendConfirm(uuid, error); - } - return orElse(); - } - @override - @optionalTypeArgs - TResult map({ - required TResult Function(PushMessage_IMessage value) iMessage, - required TResult Function(PushMessage_SendConfirm value) sendConfirm, - required TResult Function(PushMessage_RegistrationState value) - registrationState, - required TResult Function(PushMessage_NewPhotostream value) newPhotostream, - required TResult Function(PushMessage_FaceTime value) faceTime, - required TResult Function(PushMessage_StatusUpdate value) statusUpdate, - required TResult Function(PushMessage_Idms value) idms, - required TResult Function(PushMessage_TwoFaAuthEvent value) twoFaAuthEvent, - required TResult Function(PushMessage_CircleFinishEvent value) - circleFinishEvent, - required TResult Function(PushMessage_BeaconShared value) beaconShared, - }) { - return sendConfirm(this); - } +@override +bool operator ==(Object other) { + return identical(this, other) || (other.runtimeType == runtimeType&&other is Message_RecoverChat&&(identical(other.field0, field0) || other.field0 == field0)); +} - @override - @optionalTypeArgs - TResult? mapOrNull({ - TResult? Function(PushMessage_IMessage value)? iMessage, - TResult? Function(PushMessage_SendConfirm value)? sendConfirm, - TResult? Function(PushMessage_RegistrationState value)? registrationState, - TResult? Function(PushMessage_NewPhotostream value)? newPhotostream, - TResult? Function(PushMessage_FaceTime value)? faceTime, - TResult? Function(PushMessage_StatusUpdate value)? statusUpdate, - TResult? Function(PushMessage_Idms value)? idms, - TResult? Function(PushMessage_TwoFaAuthEvent value)? twoFaAuthEvent, - TResult? Function(PushMessage_CircleFinishEvent value)? circleFinishEvent, - TResult? Function(PushMessage_BeaconShared value)? beaconShared, - }) { - return sendConfirm?.call(this); - } - @override - @optionalTypeArgs - TResult maybeMap({ - TResult Function(PushMessage_IMessage value)? iMessage, - TResult Function(PushMessage_SendConfirm value)? sendConfirm, - TResult Function(PushMessage_RegistrationState value)? registrationState, - TResult Function(PushMessage_NewPhotostream value)? newPhotostream, - TResult Function(PushMessage_FaceTime value)? faceTime, - TResult Function(PushMessage_StatusUpdate value)? statusUpdate, - TResult Function(PushMessage_Idms value)? idms, - TResult Function(PushMessage_TwoFaAuthEvent value)? twoFaAuthEvent, - TResult Function(PushMessage_CircleFinishEvent value)? circleFinishEvent, - TResult Function(PushMessage_BeaconShared value)? beaconShared, - required TResult orElse(), - }) { - if (sendConfirm != null) { - return sendConfirm(this); - } - return orElse(); - } +@override +int get hashCode => Object.hash(runtimeType,field0); + +@override +String toString() { + return 'Message.recoverChat(field0: $field0)'; } -abstract class PushMessage_SendConfirm extends PushMessage { - const factory PushMessage_SendConfirm( - {required final String uuid, - final String? error}) = _$PushMessage_SendConfirmImpl; - const PushMessage_SendConfirm._() : super._(); - - String get uuid; - String? get error; - - /// Create a copy of PushMessage - /// with the given fields replaced by the non-null parameter values. - @JsonKey(includeFromJson: false, includeToJson: false) - _$$PushMessage_SendConfirmImplCopyWith<_$PushMessage_SendConfirmImpl> - get copyWith => throw _privateConstructorUsedError; -} - -/// @nodoc -abstract class _$$PushMessage_RegistrationStateImplCopyWith<$Res> { - factory _$$PushMessage_RegistrationStateImplCopyWith( - _$PushMessage_RegistrationStateImpl value, - $Res Function(_$PushMessage_RegistrationStateImpl) then) = - __$$PushMessage_RegistrationStateImplCopyWithImpl<$Res>; - @useResult - $Res call({RegisterState field0}); - - $RegisterStateCopyWith<$Res> get field0; -} - -/// @nodoc -class __$$PushMessage_RegistrationStateImplCopyWithImpl<$Res> - extends _$PushMessageCopyWithImpl<$Res, _$PushMessage_RegistrationStateImpl> - implements _$$PushMessage_RegistrationStateImplCopyWith<$Res> { - __$$PushMessage_RegistrationStateImplCopyWithImpl( - _$PushMessage_RegistrationStateImpl _value, - $Res Function(_$PushMessage_RegistrationStateImpl) _then) - : super(_value, _then); - - /// Create a copy of PushMessage - /// with the given fields replaced by the non-null parameter values. - @pragma('vm:prefer-inline') - @override - $Res call({ - Object? field0 = null, - }) { - return _then(_$PushMessage_RegistrationStateImpl( - null == field0 - ? _value.field0 - : field0 // ignore: cast_nullable_to_non_nullable - as RegisterState, - )); - } - /// Create a copy of PushMessage - /// with the given fields replaced by the non-null parameter values. - @override - @pragma('vm:prefer-inline') - $RegisterStateCopyWith<$Res> get field0 { - return $RegisterStateCopyWith<$Res>(_value.field0, (value) { - return _then(_value.copyWith(field0: value)); - }); - } } /// @nodoc +abstract mixin class $Message_RecoverChatCopyWith<$Res> implements $MessageCopyWith<$Res> { + factory $Message_RecoverChatCopyWith(Message_RecoverChat value, $Res Function(Message_RecoverChat) _then) = _$Message_RecoverChatCopyWithImpl; +@useResult +$Res call({ + OperatedChat field0 +}); -class _$PushMessage_RegistrationStateImpl - extends PushMessage_RegistrationState { - const _$PushMessage_RegistrationStateImpl(this.field0) : super._(); - - @override - final RegisterState field0; - - @override - String toString() { - return 'PushMessage.registrationState(field0: $field0)'; - } - - @override - bool operator ==(Object other) { - return identical(this, other) || - (other.runtimeType == runtimeType && - other is _$PushMessage_RegistrationStateImpl && - (identical(other.field0, field0) || other.field0 == field0)); - } - - @override - int get hashCode => Object.hash(runtimeType, field0); - - /// Create a copy of PushMessage - /// with the given fields replaced by the non-null parameter values. - @JsonKey(includeFromJson: false, includeToJson: false) - @override - @pragma('vm:prefer-inline') - _$$PushMessage_RegistrationStateImplCopyWith< - _$PushMessage_RegistrationStateImpl> - get copyWith => __$$PushMessage_RegistrationStateImplCopyWithImpl< - _$PushMessage_RegistrationStateImpl>(this, _$identity); - - @override - @optionalTypeArgs - TResult when({ - required TResult Function(MessageInst field0) iMessage, - required TResult Function(String uuid, String? error) sendConfirm, - required TResult Function(RegisterState field0) registrationState, - required TResult Function(SharedAlbum field0) newPhotostream, - required TResult Function(FTMessage field0) faceTime, - required TResult Function(StatusKitMessage field0) statusUpdate, - required TResult Function(IdmsMessage field0) idms, - required TResult Function(bool field0) twoFaAuthEvent, - required TResult Function() circleFinishEvent, - required TResult Function( - String sender, String beacon, BeaconAttributes attributes) - beaconShared, - }) { - return registrationState(field0); - } - @override - @optionalTypeArgs - TResult? whenOrNull({ - TResult? Function(MessageInst field0)? iMessage, - TResult? Function(String uuid, String? error)? sendConfirm, - TResult? Function(RegisterState field0)? registrationState, - TResult? Function(SharedAlbum field0)? newPhotostream, - TResult? Function(FTMessage field0)? faceTime, - TResult? Function(StatusKitMessage field0)? statusUpdate, - TResult? Function(IdmsMessage field0)? idms, - TResult? Function(bool field0)? twoFaAuthEvent, - TResult? Function()? circleFinishEvent, - TResult? Function( - String sender, String beacon, BeaconAttributes attributes)? - beaconShared, - }) { - return registrationState?.call(field0); - } - @override - @optionalTypeArgs - TResult maybeWhen({ - TResult Function(MessageInst field0)? iMessage, - TResult Function(String uuid, String? error)? sendConfirm, - TResult Function(RegisterState field0)? registrationState, - TResult Function(SharedAlbum field0)? newPhotostream, - TResult Function(FTMessage field0)? faceTime, - TResult Function(StatusKitMessage field0)? statusUpdate, - TResult Function(IdmsMessage field0)? idms, - TResult Function(bool field0)? twoFaAuthEvent, - TResult Function()? circleFinishEvent, - TResult Function(String sender, String beacon, BeaconAttributes attributes)? - beaconShared, - required TResult orElse(), - }) { - if (registrationState != null) { - return registrationState(field0); - } - return orElse(); - } - @override - @optionalTypeArgs - TResult map({ - required TResult Function(PushMessage_IMessage value) iMessage, - required TResult Function(PushMessage_SendConfirm value) sendConfirm, - required TResult Function(PushMessage_RegistrationState value) - registrationState, - required TResult Function(PushMessage_NewPhotostream value) newPhotostream, - required TResult Function(PushMessage_FaceTime value) faceTime, - required TResult Function(PushMessage_StatusUpdate value) statusUpdate, - required TResult Function(PushMessage_Idms value) idms, - required TResult Function(PushMessage_TwoFaAuthEvent value) twoFaAuthEvent, - required TResult Function(PushMessage_CircleFinishEvent value) - circleFinishEvent, - required TResult Function(PushMessage_BeaconShared value) beaconShared, - }) { - return registrationState(this); - } +} +/// @nodoc +class _$Message_RecoverChatCopyWithImpl<$Res> + implements $Message_RecoverChatCopyWith<$Res> { + _$Message_RecoverChatCopyWithImpl(this._self, this._then); - @override - @optionalTypeArgs - TResult? mapOrNull({ - TResult? Function(PushMessage_IMessage value)? iMessage, - TResult? Function(PushMessage_SendConfirm value)? sendConfirm, - TResult? Function(PushMessage_RegistrationState value)? registrationState, - TResult? Function(PushMessage_NewPhotostream value)? newPhotostream, - TResult? Function(PushMessage_FaceTime value)? faceTime, - TResult? Function(PushMessage_StatusUpdate value)? statusUpdate, - TResult? Function(PushMessage_Idms value)? idms, - TResult? Function(PushMessage_TwoFaAuthEvent value)? twoFaAuthEvent, - TResult? Function(PushMessage_CircleFinishEvent value)? circleFinishEvent, - TResult? Function(PushMessage_BeaconShared value)? beaconShared, - }) { - return registrationState?.call(this); - } + final Message_RecoverChat _self; + final $Res Function(Message_RecoverChat) _then; - @override - @optionalTypeArgs - TResult maybeMap({ - TResult Function(PushMessage_IMessage value)? iMessage, - TResult Function(PushMessage_SendConfirm value)? sendConfirm, - TResult Function(PushMessage_RegistrationState value)? registrationState, - TResult Function(PushMessage_NewPhotostream value)? newPhotostream, - TResult Function(PushMessage_FaceTime value)? faceTime, - TResult Function(PushMessage_StatusUpdate value)? statusUpdate, - TResult Function(PushMessage_Idms value)? idms, - TResult Function(PushMessage_TwoFaAuthEvent value)? twoFaAuthEvent, - TResult Function(PushMessage_CircleFinishEvent value)? circleFinishEvent, - TResult Function(PushMessage_BeaconShared value)? beaconShared, - required TResult orElse(), - }) { - if (registrationState != null) { - return registrationState(this); - } - return orElse(); - } +/// Create a copy of Message +/// with the given fields replaced by the non-null parameter values. +@pragma('vm:prefer-inline') $Res call({Object? field0 = null,}) { + return _then(Message_RecoverChat( +null == field0 ? _self.field0 : field0 // ignore: cast_nullable_to_non_nullable +as OperatedChat, + )); } -abstract class PushMessage_RegistrationState extends PushMessage { - const factory PushMessage_RegistrationState(final RegisterState field0) = - _$PushMessage_RegistrationStateImpl; - const PushMessage_RegistrationState._() : super._(); - - RegisterState get field0; - - /// Create a copy of PushMessage - /// with the given fields replaced by the non-null parameter values. - @JsonKey(includeFromJson: false, includeToJson: false) - _$$PushMessage_RegistrationStateImplCopyWith< - _$PushMessage_RegistrationStateImpl> - get copyWith => throw _privateConstructorUsedError; -} - -/// @nodoc -abstract class _$$PushMessage_NewPhotostreamImplCopyWith<$Res> { - factory _$$PushMessage_NewPhotostreamImplCopyWith( - _$PushMessage_NewPhotostreamImpl value, - $Res Function(_$PushMessage_NewPhotostreamImpl) then) = - __$$PushMessage_NewPhotostreamImplCopyWithImpl<$Res>; - @useResult - $Res call({SharedAlbum field0}); -} - -/// @nodoc -class __$$PushMessage_NewPhotostreamImplCopyWithImpl<$Res> - extends _$PushMessageCopyWithImpl<$Res, _$PushMessage_NewPhotostreamImpl> - implements _$$PushMessage_NewPhotostreamImplCopyWith<$Res> { - __$$PushMessage_NewPhotostreamImplCopyWithImpl( - _$PushMessage_NewPhotostreamImpl _value, - $Res Function(_$PushMessage_NewPhotostreamImpl) _then) - : super(_value, _then); - - /// Create a copy of PushMessage - /// with the given fields replaced by the non-null parameter values. - @pragma('vm:prefer-inline') - @override - $Res call({ - Object? field0 = null, - }) { - return _then(_$PushMessage_NewPhotostreamImpl( - null == field0 - ? _value.field0 - : field0 // ignore: cast_nullable_to_non_nullable - as SharedAlbum, - )); - } + } /// @nodoc -class _$PushMessage_NewPhotostreamImpl extends PushMessage_NewPhotostream { - const _$PushMessage_NewPhotostreamImpl(this.field0) : super._(); - @override - final SharedAlbum field0; +class Message_PermanentDelete extends Message { + const Message_PermanentDelete(this.field0): super._(); - @override - String toString() { - return 'PushMessage.newPhotostream(field0: $field0)'; - } - @override - bool operator ==(Object other) { - return identical(this, other) || - (other.runtimeType == runtimeType && - other is _$PushMessage_NewPhotostreamImpl && - (identical(other.field0, field0) || other.field0 == field0)); - } + final PermanentDeleteMessage field0; - @override - int get hashCode => Object.hash(runtimeType, field0); - - /// Create a copy of PushMessage - /// with the given fields replaced by the non-null parameter values. - @JsonKey(includeFromJson: false, includeToJson: false) - @override - @pragma('vm:prefer-inline') - _$$PushMessage_NewPhotostreamImplCopyWith<_$PushMessage_NewPhotostreamImpl> - get copyWith => __$$PushMessage_NewPhotostreamImplCopyWithImpl< - _$PushMessage_NewPhotostreamImpl>(this, _$identity); - - @override - @optionalTypeArgs - TResult when({ - required TResult Function(MessageInst field0) iMessage, - required TResult Function(String uuid, String? error) sendConfirm, - required TResult Function(RegisterState field0) registrationState, - required TResult Function(SharedAlbum field0) newPhotostream, - required TResult Function(FTMessage field0) faceTime, - required TResult Function(StatusKitMessage field0) statusUpdate, - required TResult Function(IdmsMessage field0) idms, - required TResult Function(bool field0) twoFaAuthEvent, - required TResult Function() circleFinishEvent, - required TResult Function( - String sender, String beacon, BeaconAttributes attributes) - beaconShared, - }) { - return newPhotostream(field0); - } +/// Create a copy of Message +/// with the given fields replaced by the non-null parameter values. +@JsonKey(includeFromJson: false, includeToJson: false) +@pragma('vm:prefer-inline') +$Message_PermanentDeleteCopyWith get copyWith => _$Message_PermanentDeleteCopyWithImpl(this, _$identity); - @override - @optionalTypeArgs - TResult? whenOrNull({ - TResult? Function(MessageInst field0)? iMessage, - TResult? Function(String uuid, String? error)? sendConfirm, - TResult? Function(RegisterState field0)? registrationState, - TResult? Function(SharedAlbum field0)? newPhotostream, - TResult? Function(FTMessage field0)? faceTime, - TResult? Function(StatusKitMessage field0)? statusUpdate, - TResult? Function(IdmsMessage field0)? idms, - TResult? Function(bool field0)? twoFaAuthEvent, - TResult? Function()? circleFinishEvent, - TResult? Function( - String sender, String beacon, BeaconAttributes attributes)? - beaconShared, - }) { - return newPhotostream?.call(field0); - } - @override - @optionalTypeArgs - TResult maybeWhen({ - TResult Function(MessageInst field0)? iMessage, - TResult Function(String uuid, String? error)? sendConfirm, - TResult Function(RegisterState field0)? registrationState, - TResult Function(SharedAlbum field0)? newPhotostream, - TResult Function(FTMessage field0)? faceTime, - TResult Function(StatusKitMessage field0)? statusUpdate, - TResult Function(IdmsMessage field0)? idms, - TResult Function(bool field0)? twoFaAuthEvent, - TResult Function()? circleFinishEvent, - TResult Function(String sender, String beacon, BeaconAttributes attributes)? - beaconShared, - required TResult orElse(), - }) { - if (newPhotostream != null) { - return newPhotostream(field0); - } - return orElse(); - } - @override - @optionalTypeArgs - TResult map({ - required TResult Function(PushMessage_IMessage value) iMessage, - required TResult Function(PushMessage_SendConfirm value) sendConfirm, - required TResult Function(PushMessage_RegistrationState value) - registrationState, - required TResult Function(PushMessage_NewPhotostream value) newPhotostream, - required TResult Function(PushMessage_FaceTime value) faceTime, - required TResult Function(PushMessage_StatusUpdate value) statusUpdate, - required TResult Function(PushMessage_Idms value) idms, - required TResult Function(PushMessage_TwoFaAuthEvent value) twoFaAuthEvent, - required TResult Function(PushMessage_CircleFinishEvent value) - circleFinishEvent, - required TResult Function(PushMessage_BeaconShared value) beaconShared, - }) { - return newPhotostream(this); - } +@override +bool operator ==(Object other) { + return identical(this, other) || (other.runtimeType == runtimeType&&other is Message_PermanentDelete&&(identical(other.field0, field0) || other.field0 == field0)); +} - @override - @optionalTypeArgs - TResult? mapOrNull({ - TResult? Function(PushMessage_IMessage value)? iMessage, - TResult? Function(PushMessage_SendConfirm value)? sendConfirm, - TResult? Function(PushMessage_RegistrationState value)? registrationState, - TResult? Function(PushMessage_NewPhotostream value)? newPhotostream, - TResult? Function(PushMessage_FaceTime value)? faceTime, - TResult? Function(PushMessage_StatusUpdate value)? statusUpdate, - TResult? Function(PushMessage_Idms value)? idms, - TResult? Function(PushMessage_TwoFaAuthEvent value)? twoFaAuthEvent, - TResult? Function(PushMessage_CircleFinishEvent value)? circleFinishEvent, - TResult? Function(PushMessage_BeaconShared value)? beaconShared, - }) { - return newPhotostream?.call(this); - } - @override - @optionalTypeArgs - TResult maybeMap({ - TResult Function(PushMessage_IMessage value)? iMessage, - TResult Function(PushMessage_SendConfirm value)? sendConfirm, - TResult Function(PushMessage_RegistrationState value)? registrationState, - TResult Function(PushMessage_NewPhotostream value)? newPhotostream, - TResult Function(PushMessage_FaceTime value)? faceTime, - TResult Function(PushMessage_StatusUpdate value)? statusUpdate, - TResult Function(PushMessage_Idms value)? idms, - TResult Function(PushMessage_TwoFaAuthEvent value)? twoFaAuthEvent, - TResult Function(PushMessage_CircleFinishEvent value)? circleFinishEvent, - TResult Function(PushMessage_BeaconShared value)? beaconShared, - required TResult orElse(), - }) { - if (newPhotostream != null) { - return newPhotostream(this); - } - return orElse(); - } -} +@override +int get hashCode => Object.hash(runtimeType,field0); -abstract class PushMessage_NewPhotostream extends PushMessage { - const factory PushMessage_NewPhotostream(final SharedAlbum field0) = - _$PushMessage_NewPhotostreamImpl; - const PushMessage_NewPhotostream._() : super._(); +@override +String toString() { + return 'Message.permanentDelete(field0: $field0)'; +} - SharedAlbum get field0; - /// Create a copy of PushMessage - /// with the given fields replaced by the non-null parameter values. - @JsonKey(includeFromJson: false, includeToJson: false) - _$$PushMessage_NewPhotostreamImplCopyWith<_$PushMessage_NewPhotostreamImpl> - get copyWith => throw _privateConstructorUsedError; } /// @nodoc -abstract class _$$PushMessage_FaceTimeImplCopyWith<$Res> { - factory _$$PushMessage_FaceTimeImplCopyWith(_$PushMessage_FaceTimeImpl value, - $Res Function(_$PushMessage_FaceTimeImpl) then) = - __$$PushMessage_FaceTimeImplCopyWithImpl<$Res>; - @useResult - $Res call({FTMessage field0}); +abstract mixin class $Message_PermanentDeleteCopyWith<$Res> implements $MessageCopyWith<$Res> { + factory $Message_PermanentDeleteCopyWith(Message_PermanentDelete value, $Res Function(Message_PermanentDelete) _then) = _$Message_PermanentDeleteCopyWithImpl; +@useResult +$Res call({ + PermanentDeleteMessage field0 +}); + - $FTMessageCopyWith<$Res> get field0; -} + +} /// @nodoc -class __$$PushMessage_FaceTimeImplCopyWithImpl<$Res> - extends _$PushMessageCopyWithImpl<$Res, _$PushMessage_FaceTimeImpl> - implements _$$PushMessage_FaceTimeImplCopyWith<$Res> { - __$$PushMessage_FaceTimeImplCopyWithImpl(_$PushMessage_FaceTimeImpl _value, - $Res Function(_$PushMessage_FaceTimeImpl) _then) - : super(_value, _then); +class _$Message_PermanentDeleteCopyWithImpl<$Res> + implements $Message_PermanentDeleteCopyWith<$Res> { + _$Message_PermanentDeleteCopyWithImpl(this._self, this._then); - /// Create a copy of PushMessage - /// with the given fields replaced by the non-null parameter values. - @pragma('vm:prefer-inline') - @override - $Res call({ - Object? field0 = null, - }) { - return _then(_$PushMessage_FaceTimeImpl( - null == field0 - ? _value.field0 - : field0 // ignore: cast_nullable_to_non_nullable - as FTMessage, - )); - } + final Message_PermanentDelete _self; + final $Res Function(Message_PermanentDelete) _then; - /// Create a copy of PushMessage - /// with the given fields replaced by the non-null parameter values. - @override - @pragma('vm:prefer-inline') - $FTMessageCopyWith<$Res> get field0 { - return $FTMessageCopyWith<$Res>(_value.field0, (value) { - return _then(_value.copyWith(field0: value)); - }); - } +/// Create a copy of Message +/// with the given fields replaced by the non-null parameter values. +@pragma('vm:prefer-inline') $Res call({Object? field0 = null,}) { + return _then(Message_PermanentDelete( +null == field0 ? _self.field0 : field0 // ignore: cast_nullable_to_non_nullable +as PermanentDeleteMessage, + )); } -/// @nodoc -class _$PushMessage_FaceTimeImpl extends PushMessage_FaceTime { - const _$PushMessage_FaceTimeImpl(this.field0) : super._(); +} - @override - final FTMessage field0; +/// @nodoc - @override - String toString() { - return 'PushMessage.faceTime(field0: $field0)'; - } - @override - bool operator ==(Object other) { - return identical(this, other) || - (other.runtimeType == runtimeType && - other is _$PushMessage_FaceTimeImpl && - (identical(other.field0, field0) || other.field0 == field0)); - } +class Message_Unschedule extends Message { + const Message_Unschedule(): super._(); - @override - int get hashCode => Object.hash(runtimeType, field0); - - /// Create a copy of PushMessage - /// with the given fields replaced by the non-null parameter values. - @JsonKey(includeFromJson: false, includeToJson: false) - @override - @pragma('vm:prefer-inline') - _$$PushMessage_FaceTimeImplCopyWith<_$PushMessage_FaceTimeImpl> - get copyWith => - __$$PushMessage_FaceTimeImplCopyWithImpl<_$PushMessage_FaceTimeImpl>( - this, _$identity); - - @override - @optionalTypeArgs - TResult when({ - required TResult Function(MessageInst field0) iMessage, - required TResult Function(String uuid, String? error) sendConfirm, - required TResult Function(RegisterState field0) registrationState, - required TResult Function(SharedAlbum field0) newPhotostream, - required TResult Function(FTMessage field0) faceTime, - required TResult Function(StatusKitMessage field0) statusUpdate, - required TResult Function(IdmsMessage field0) idms, - required TResult Function(bool field0) twoFaAuthEvent, - required TResult Function() circleFinishEvent, - required TResult Function( - String sender, String beacon, BeaconAttributes attributes) - beaconShared, - }) { - return faceTime(field0); - } - @override - @optionalTypeArgs - TResult? whenOrNull({ - TResult? Function(MessageInst field0)? iMessage, - TResult? Function(String uuid, String? error)? sendConfirm, - TResult? Function(RegisterState field0)? registrationState, - TResult? Function(SharedAlbum field0)? newPhotostream, - TResult? Function(FTMessage field0)? faceTime, - TResult? Function(StatusKitMessage field0)? statusUpdate, - TResult? Function(IdmsMessage field0)? idms, - TResult? Function(bool field0)? twoFaAuthEvent, - TResult? Function()? circleFinishEvent, - TResult? Function( - String sender, String beacon, BeaconAttributes attributes)? - beaconShared, - }) { - return faceTime?.call(field0); - } - @override - @optionalTypeArgs - TResult maybeWhen({ - TResult Function(MessageInst field0)? iMessage, - TResult Function(String uuid, String? error)? sendConfirm, - TResult Function(RegisterState field0)? registrationState, - TResult Function(SharedAlbum field0)? newPhotostream, - TResult Function(FTMessage field0)? faceTime, - TResult Function(StatusKitMessage field0)? statusUpdate, - TResult Function(IdmsMessage field0)? idms, - TResult Function(bool field0)? twoFaAuthEvent, - TResult Function()? circleFinishEvent, - TResult Function(String sender, String beacon, BeaconAttributes attributes)? - beaconShared, - required TResult orElse(), - }) { - if (faceTime != null) { - return faceTime(field0); - } - return orElse(); - } - @override - @optionalTypeArgs - TResult map({ - required TResult Function(PushMessage_IMessage value) iMessage, - required TResult Function(PushMessage_SendConfirm value) sendConfirm, - required TResult Function(PushMessage_RegistrationState value) - registrationState, - required TResult Function(PushMessage_NewPhotostream value) newPhotostream, - required TResult Function(PushMessage_FaceTime value) faceTime, - required TResult Function(PushMessage_StatusUpdate value) statusUpdate, - required TResult Function(PushMessage_Idms value) idms, - required TResult Function(PushMessage_TwoFaAuthEvent value) twoFaAuthEvent, - required TResult Function(PushMessage_CircleFinishEvent value) - circleFinishEvent, - required TResult Function(PushMessage_BeaconShared value) beaconShared, - }) { - return faceTime(this); - } - @override - @optionalTypeArgs - TResult? mapOrNull({ - TResult? Function(PushMessage_IMessage value)? iMessage, - TResult? Function(PushMessage_SendConfirm value)? sendConfirm, - TResult? Function(PushMessage_RegistrationState value)? registrationState, - TResult? Function(PushMessage_NewPhotostream value)? newPhotostream, - TResult? Function(PushMessage_FaceTime value)? faceTime, - TResult? Function(PushMessage_StatusUpdate value)? statusUpdate, - TResult? Function(PushMessage_Idms value)? idms, - TResult? Function(PushMessage_TwoFaAuthEvent value)? twoFaAuthEvent, - TResult? Function(PushMessage_CircleFinishEvent value)? circleFinishEvent, - TResult? Function(PushMessage_BeaconShared value)? beaconShared, - }) { - return faceTime?.call(this); - } - @override - @optionalTypeArgs - TResult maybeMap({ - TResult Function(PushMessage_IMessage value)? iMessage, - TResult Function(PushMessage_SendConfirm value)? sendConfirm, - TResult Function(PushMessage_RegistrationState value)? registrationState, - TResult Function(PushMessage_NewPhotostream value)? newPhotostream, - TResult Function(PushMessage_FaceTime value)? faceTime, - TResult Function(PushMessage_StatusUpdate value)? statusUpdate, - TResult Function(PushMessage_Idms value)? idms, - TResult Function(PushMessage_TwoFaAuthEvent value)? twoFaAuthEvent, - TResult Function(PushMessage_CircleFinishEvent value)? circleFinishEvent, - TResult Function(PushMessage_BeaconShared value)? beaconShared, - required TResult orElse(), - }) { - if (faceTime != null) { - return faceTime(this); - } - return orElse(); - } + +@override +bool operator ==(Object other) { + return identical(this, other) || (other.runtimeType == runtimeType&&other is Message_Unschedule); } -abstract class PushMessage_FaceTime extends PushMessage { - const factory PushMessage_FaceTime(final FTMessage field0) = - _$PushMessage_FaceTimeImpl; - const PushMessage_FaceTime._() : super._(); - FTMessage get field0; +@override +int get hashCode => runtimeType.hashCode; - /// Create a copy of PushMessage - /// with the given fields replaced by the non-null parameter values. - @JsonKey(includeFromJson: false, includeToJson: false) - _$$PushMessage_FaceTimeImplCopyWith<_$PushMessage_FaceTimeImpl> - get copyWith => throw _privateConstructorUsedError; +@override +String toString() { + return 'Message.unschedule()'; } -/// @nodoc -abstract class _$$PushMessage_StatusUpdateImplCopyWith<$Res> { - factory _$$PushMessage_StatusUpdateImplCopyWith( - _$PushMessage_StatusUpdateImpl value, - $Res Function(_$PushMessage_StatusUpdateImpl) then) = - __$$PushMessage_StatusUpdateImplCopyWithImpl<$Res>; - @useResult - $Res call({StatusKitMessage field0}); - $StatusKitMessageCopyWith<$Res> get field0; } -/// @nodoc -class __$$PushMessage_StatusUpdateImplCopyWithImpl<$Res> - extends _$PushMessageCopyWithImpl<$Res, _$PushMessage_StatusUpdateImpl> - implements _$$PushMessage_StatusUpdateImplCopyWith<$Res> { - __$$PushMessage_StatusUpdateImplCopyWithImpl( - _$PushMessage_StatusUpdateImpl _value, - $Res Function(_$PushMessage_StatusUpdateImpl) _then) - : super(_value, _then); - /// Create a copy of PushMessage - /// with the given fields replaced by the non-null parameter values. - @pragma('vm:prefer-inline') - @override - $Res call({ - Object? field0 = null, - }) { - return _then(_$PushMessage_StatusUpdateImpl( - null == field0 - ? _value.field0 - : field0 // ignore: cast_nullable_to_non_nullable - as StatusKitMessage, - )); - } - /// Create a copy of PushMessage - /// with the given fields replaced by the non-null parameter values. - @override - @pragma('vm:prefer-inline') - $StatusKitMessageCopyWith<$Res> get field0 { - return $StatusKitMessageCopyWith<$Res>(_value.field0, (value) { - return _then(_value.copyWith(field0: value)); - }); - } -} /// @nodoc -class _$PushMessage_StatusUpdateImpl extends PushMessage_StatusUpdate { - const _$PushMessage_StatusUpdateImpl(this.field0) : super._(); - @override - final StatusKitMessage field0; +class Message_UpdateProfile extends Message { + const Message_UpdateProfile(this.field0): super._(); - @override - String toString() { - return 'PushMessage.statusUpdate(field0: $field0)'; - } - @override - bool operator ==(Object other) { - return identical(this, other) || - (other.runtimeType == runtimeType && - other is _$PushMessage_StatusUpdateImpl && - (identical(other.field0, field0) || other.field0 == field0)); - } + final UpdateProfileMessage field0; - @override - int get hashCode => Object.hash(runtimeType, field0); - - /// Create a copy of PushMessage - /// with the given fields replaced by the non-null parameter values. - @JsonKey(includeFromJson: false, includeToJson: false) - @override - @pragma('vm:prefer-inline') - _$$PushMessage_StatusUpdateImplCopyWith<_$PushMessage_StatusUpdateImpl> - get copyWith => __$$PushMessage_StatusUpdateImplCopyWithImpl< - _$PushMessage_StatusUpdateImpl>(this, _$identity); - - @override - @optionalTypeArgs - TResult when({ - required TResult Function(MessageInst field0) iMessage, - required TResult Function(String uuid, String? error) sendConfirm, - required TResult Function(RegisterState field0) registrationState, - required TResult Function(SharedAlbum field0) newPhotostream, - required TResult Function(FTMessage field0) faceTime, - required TResult Function(StatusKitMessage field0) statusUpdate, - required TResult Function(IdmsMessage field0) idms, - required TResult Function(bool field0) twoFaAuthEvent, - required TResult Function() circleFinishEvent, - required TResult Function( - String sender, String beacon, BeaconAttributes attributes) - beaconShared, - }) { - return statusUpdate(field0); - } +/// Create a copy of Message +/// with the given fields replaced by the non-null parameter values. +@JsonKey(includeFromJson: false, includeToJson: false) +@pragma('vm:prefer-inline') +$Message_UpdateProfileCopyWith get copyWith => _$Message_UpdateProfileCopyWithImpl(this, _$identity); - @override - @optionalTypeArgs - TResult? whenOrNull({ - TResult? Function(MessageInst field0)? iMessage, - TResult? Function(String uuid, String? error)? sendConfirm, - TResult? Function(RegisterState field0)? registrationState, - TResult? Function(SharedAlbum field0)? newPhotostream, - TResult? Function(FTMessage field0)? faceTime, - TResult? Function(StatusKitMessage field0)? statusUpdate, - TResult? Function(IdmsMessage field0)? idms, - TResult? Function(bool field0)? twoFaAuthEvent, - TResult? Function()? circleFinishEvent, - TResult? Function( - String sender, String beacon, BeaconAttributes attributes)? - beaconShared, - }) { - return statusUpdate?.call(field0); - } - @override - @optionalTypeArgs - TResult maybeWhen({ - TResult Function(MessageInst field0)? iMessage, - TResult Function(String uuid, String? error)? sendConfirm, - TResult Function(RegisterState field0)? registrationState, - TResult Function(SharedAlbum field0)? newPhotostream, - TResult Function(FTMessage field0)? faceTime, - TResult Function(StatusKitMessage field0)? statusUpdate, - TResult Function(IdmsMessage field0)? idms, - TResult Function(bool field0)? twoFaAuthEvent, - TResult Function()? circleFinishEvent, - TResult Function(String sender, String beacon, BeaconAttributes attributes)? - beaconShared, - required TResult orElse(), - }) { - if (statusUpdate != null) { - return statusUpdate(field0); - } - return orElse(); - } - @override - @optionalTypeArgs - TResult map({ - required TResult Function(PushMessage_IMessage value) iMessage, - required TResult Function(PushMessage_SendConfirm value) sendConfirm, - required TResult Function(PushMessage_RegistrationState value) - registrationState, - required TResult Function(PushMessage_NewPhotostream value) newPhotostream, - required TResult Function(PushMessage_FaceTime value) faceTime, - required TResult Function(PushMessage_StatusUpdate value) statusUpdate, - required TResult Function(PushMessage_Idms value) idms, - required TResult Function(PushMessage_TwoFaAuthEvent value) twoFaAuthEvent, - required TResult Function(PushMessage_CircleFinishEvent value) - circleFinishEvent, - required TResult Function(PushMessage_BeaconShared value) beaconShared, - }) { - return statusUpdate(this); - } - - @override - @optionalTypeArgs - TResult? mapOrNull({ - TResult? Function(PushMessage_IMessage value)? iMessage, - TResult? Function(PushMessage_SendConfirm value)? sendConfirm, - TResult? Function(PushMessage_RegistrationState value)? registrationState, - TResult? Function(PushMessage_NewPhotostream value)? newPhotostream, - TResult? Function(PushMessage_FaceTime value)? faceTime, - TResult? Function(PushMessage_StatusUpdate value)? statusUpdate, - TResult? Function(PushMessage_Idms value)? idms, - TResult? Function(PushMessage_TwoFaAuthEvent value)? twoFaAuthEvent, - TResult? Function(PushMessage_CircleFinishEvent value)? circleFinishEvent, - TResult? Function(PushMessage_BeaconShared value)? beaconShared, - }) { - return statusUpdate?.call(this); - } - - @override - @optionalTypeArgs - TResult maybeMap({ - TResult Function(PushMessage_IMessage value)? iMessage, - TResult Function(PushMessage_SendConfirm value)? sendConfirm, - TResult Function(PushMessage_RegistrationState value)? registrationState, - TResult Function(PushMessage_NewPhotostream value)? newPhotostream, - TResult Function(PushMessage_FaceTime value)? faceTime, - TResult Function(PushMessage_StatusUpdate value)? statusUpdate, - TResult Function(PushMessage_Idms value)? idms, - TResult Function(PushMessage_TwoFaAuthEvent value)? twoFaAuthEvent, - TResult Function(PushMessage_CircleFinishEvent value)? circleFinishEvent, - TResult Function(PushMessage_BeaconShared value)? beaconShared, - required TResult orElse(), - }) { - if (statusUpdate != null) { - return statusUpdate(this); - } - return orElse(); - } +@override +bool operator ==(Object other) { + return identical(this, other) || (other.runtimeType == runtimeType&&other is Message_UpdateProfile&&(identical(other.field0, field0) || other.field0 == field0)); } -abstract class PushMessage_StatusUpdate extends PushMessage { - const factory PushMessage_StatusUpdate(final StatusKitMessage field0) = - _$PushMessage_StatusUpdateImpl; - const PushMessage_StatusUpdate._() : super._(); - StatusKitMessage get field0; +@override +int get hashCode => Object.hash(runtimeType,field0); - /// Create a copy of PushMessage - /// with the given fields replaced by the non-null parameter values. - @JsonKey(includeFromJson: false, includeToJson: false) - _$$PushMessage_StatusUpdateImplCopyWith<_$PushMessage_StatusUpdateImpl> - get copyWith => throw _privateConstructorUsedError; +@override +String toString() { + return 'Message.updateProfile(field0: $field0)'; } -/// @nodoc -abstract class _$$PushMessage_IdmsImplCopyWith<$Res> { - factory _$$PushMessage_IdmsImplCopyWith(_$PushMessage_IdmsImpl value, - $Res Function(_$PushMessage_IdmsImpl) then) = - __$$PushMessage_IdmsImplCopyWithImpl<$Res>; - @useResult - $Res call({IdmsMessage field0}); - $IdmsMessageCopyWith<$Res> get field0; } /// @nodoc -class __$$PushMessage_IdmsImplCopyWithImpl<$Res> - extends _$PushMessageCopyWithImpl<$Res, _$PushMessage_IdmsImpl> - implements _$$PushMessage_IdmsImplCopyWith<$Res> { - __$$PushMessage_IdmsImplCopyWithImpl(_$PushMessage_IdmsImpl _value, - $Res Function(_$PushMessage_IdmsImpl) _then) - : super(_value, _then); - - /// Create a copy of PushMessage - /// with the given fields replaced by the non-null parameter values. - @pragma('vm:prefer-inline') - @override - $Res call({ - Object? field0 = null, - }) { - return _then(_$PushMessage_IdmsImpl( - null == field0 - ? _value.field0 - : field0 // ignore: cast_nullable_to_non_nullable - as IdmsMessage, - )); - } +abstract mixin class $Message_UpdateProfileCopyWith<$Res> implements $MessageCopyWith<$Res> { + factory $Message_UpdateProfileCopyWith(Message_UpdateProfile value, $Res Function(Message_UpdateProfile) _then) = _$Message_UpdateProfileCopyWithImpl; +@useResult +$Res call({ + UpdateProfileMessage field0 +}); - /// Create a copy of PushMessage - /// with the given fields replaced by the non-null parameter values. - @override - @pragma('vm:prefer-inline') - $IdmsMessageCopyWith<$Res> get field0 { - return $IdmsMessageCopyWith<$Res>(_value.field0, (value) { - return _then(_value.copyWith(field0: value)); - }); - } -} -/// @nodoc -class _$PushMessage_IdmsImpl extends PushMessage_Idms { - const _$PushMessage_IdmsImpl(this.field0) : super._(); - @override - final IdmsMessage field0; +} +/// @nodoc +class _$Message_UpdateProfileCopyWithImpl<$Res> + implements $Message_UpdateProfileCopyWith<$Res> { + _$Message_UpdateProfileCopyWithImpl(this._self, this._then); - @override - String toString() { - return 'PushMessage.idms(field0: $field0)'; - } + final Message_UpdateProfile _self; + final $Res Function(Message_UpdateProfile) _then; - @override - bool operator ==(Object other) { - return identical(this, other) || - (other.runtimeType == runtimeType && - other is _$PushMessage_IdmsImpl && - (identical(other.field0, field0) || other.field0 == field0)); - } +/// Create a copy of Message +/// with the given fields replaced by the non-null parameter values. +@pragma('vm:prefer-inline') $Res call({Object? field0 = null,}) { + return _then(Message_UpdateProfile( +null == field0 ? _self.field0 : field0 // ignore: cast_nullable_to_non_nullable +as UpdateProfileMessage, + )); +} - @override - int get hashCode => Object.hash(runtimeType, field0); - - /// Create a copy of PushMessage - /// with the given fields replaced by the non-null parameter values. - @JsonKey(includeFromJson: false, includeToJson: false) - @override - @pragma('vm:prefer-inline') - _$$PushMessage_IdmsImplCopyWith<_$PushMessage_IdmsImpl> get copyWith => - __$$PushMessage_IdmsImplCopyWithImpl<_$PushMessage_IdmsImpl>( - this, _$identity); - - @override - @optionalTypeArgs - TResult when({ - required TResult Function(MessageInst field0) iMessage, - required TResult Function(String uuid, String? error) sendConfirm, - required TResult Function(RegisterState field0) registrationState, - required TResult Function(SharedAlbum field0) newPhotostream, - required TResult Function(FTMessage field0) faceTime, - required TResult Function(StatusKitMessage field0) statusUpdate, - required TResult Function(IdmsMessage field0) idms, - required TResult Function(bool field0) twoFaAuthEvent, - required TResult Function() circleFinishEvent, - required TResult Function( - String sender, String beacon, BeaconAttributes attributes) - beaconShared, - }) { - return idms(field0); - } - @override - @optionalTypeArgs - TResult? whenOrNull({ - TResult? Function(MessageInst field0)? iMessage, - TResult? Function(String uuid, String? error)? sendConfirm, - TResult? Function(RegisterState field0)? registrationState, - TResult? Function(SharedAlbum field0)? newPhotostream, - TResult? Function(FTMessage field0)? faceTime, - TResult? Function(StatusKitMessage field0)? statusUpdate, - TResult? Function(IdmsMessage field0)? idms, - TResult? Function(bool field0)? twoFaAuthEvent, - TResult? Function()? circleFinishEvent, - TResult? Function( - String sender, String beacon, BeaconAttributes attributes)? - beaconShared, - }) { - return idms?.call(field0); - } +} - @override - @optionalTypeArgs - TResult maybeWhen({ - TResult Function(MessageInst field0)? iMessage, - TResult Function(String uuid, String? error)? sendConfirm, - TResult Function(RegisterState field0)? registrationState, - TResult Function(SharedAlbum field0)? newPhotostream, - TResult Function(FTMessage field0)? faceTime, - TResult Function(StatusKitMessage field0)? statusUpdate, - TResult Function(IdmsMessage field0)? idms, - TResult Function(bool field0)? twoFaAuthEvent, - TResult Function()? circleFinishEvent, - TResult Function(String sender, String beacon, BeaconAttributes attributes)? - beaconShared, - required TResult orElse(), - }) { - if (idms != null) { - return idms(field0); - } - return orElse(); - } +/// @nodoc - @override - @optionalTypeArgs - TResult map({ - required TResult Function(PushMessage_IMessage value) iMessage, - required TResult Function(PushMessage_SendConfirm value) sendConfirm, - required TResult Function(PushMessage_RegistrationState value) - registrationState, - required TResult Function(PushMessage_NewPhotostream value) newPhotostream, - required TResult Function(PushMessage_FaceTime value) faceTime, - required TResult Function(PushMessage_StatusUpdate value) statusUpdate, - required TResult Function(PushMessage_Idms value) idms, - required TResult Function(PushMessage_TwoFaAuthEvent value) twoFaAuthEvent, - required TResult Function(PushMessage_CircleFinishEvent value) - circleFinishEvent, - required TResult Function(PushMessage_BeaconShared value) beaconShared, - }) { - return idms(this); - } - @override - @optionalTypeArgs - TResult? mapOrNull({ - TResult? Function(PushMessage_IMessage value)? iMessage, - TResult? Function(PushMessage_SendConfirm value)? sendConfirm, - TResult? Function(PushMessage_RegistrationState value)? registrationState, - TResult? Function(PushMessage_NewPhotostream value)? newPhotostream, - TResult? Function(PushMessage_FaceTime value)? faceTime, - TResult? Function(PushMessage_StatusUpdate value)? statusUpdate, - TResult? Function(PushMessage_Idms value)? idms, - TResult? Function(PushMessage_TwoFaAuthEvent value)? twoFaAuthEvent, - TResult? Function(PushMessage_CircleFinishEvent value)? circleFinishEvent, - TResult? Function(PushMessage_BeaconShared value)? beaconShared, - }) { - return idms?.call(this); - } +class Message_UpdateProfileSharing extends Message { + const Message_UpdateProfileSharing(this.field0): super._(); - @override - @optionalTypeArgs - TResult maybeMap({ - TResult Function(PushMessage_IMessage value)? iMessage, - TResult Function(PushMessage_SendConfirm value)? sendConfirm, - TResult Function(PushMessage_RegistrationState value)? registrationState, - TResult Function(PushMessage_NewPhotostream value)? newPhotostream, - TResult Function(PushMessage_FaceTime value)? faceTime, - TResult Function(PushMessage_StatusUpdate value)? statusUpdate, - TResult Function(PushMessage_Idms value)? idms, - TResult Function(PushMessage_TwoFaAuthEvent value)? twoFaAuthEvent, - TResult Function(PushMessage_CircleFinishEvent value)? circleFinishEvent, - TResult Function(PushMessage_BeaconShared value)? beaconShared, - required TResult orElse(), - }) { - if (idms != null) { - return idms(this); - } - return orElse(); - } -} -abstract class PushMessage_Idms extends PushMessage { - const factory PushMessage_Idms(final IdmsMessage field0) = - _$PushMessage_IdmsImpl; - const PushMessage_Idms._() : super._(); - - IdmsMessage get field0; - - /// Create a copy of PushMessage - /// with the given fields replaced by the non-null parameter values. - @JsonKey(includeFromJson: false, includeToJson: false) - _$$PushMessage_IdmsImplCopyWith<_$PushMessage_IdmsImpl> get copyWith => - throw _privateConstructorUsedError; -} - -/// @nodoc -abstract class _$$PushMessage_TwoFaAuthEventImplCopyWith<$Res> { - factory _$$PushMessage_TwoFaAuthEventImplCopyWith( - _$PushMessage_TwoFaAuthEventImpl value, - $Res Function(_$PushMessage_TwoFaAuthEventImpl) then) = - __$$PushMessage_TwoFaAuthEventImplCopyWithImpl<$Res>; - @useResult - $Res call({bool field0}); -} - -/// @nodoc -class __$$PushMessage_TwoFaAuthEventImplCopyWithImpl<$Res> - extends _$PushMessageCopyWithImpl<$Res, _$PushMessage_TwoFaAuthEventImpl> - implements _$$PushMessage_TwoFaAuthEventImplCopyWith<$Res> { - __$$PushMessage_TwoFaAuthEventImplCopyWithImpl( - _$PushMessage_TwoFaAuthEventImpl _value, - $Res Function(_$PushMessage_TwoFaAuthEventImpl) _then) - : super(_value, _then); - - /// Create a copy of PushMessage - /// with the given fields replaced by the non-null parameter values. - @pragma('vm:prefer-inline') - @override - $Res call({ - Object? field0 = null, - }) { - return _then(_$PushMessage_TwoFaAuthEventImpl( - null == field0 - ? _value.field0 - : field0 // ignore: cast_nullable_to_non_nullable - as bool, - )); - } -} + final UpdateProfileSharingMessage field0; -/// @nodoc +/// Create a copy of Message +/// with the given fields replaced by the non-null parameter values. +@JsonKey(includeFromJson: false, includeToJson: false) +@pragma('vm:prefer-inline') +$Message_UpdateProfileSharingCopyWith get copyWith => _$Message_UpdateProfileSharingCopyWithImpl(this, _$identity); -class _$PushMessage_TwoFaAuthEventImpl extends PushMessage_TwoFaAuthEvent { - const _$PushMessage_TwoFaAuthEventImpl(this.field0) : super._(); - @override - final bool field0; - @override - String toString() { - return 'PushMessage.twoFaAuthEvent(field0: $field0)'; - } +@override +bool operator ==(Object other) { + return identical(this, other) || (other.runtimeType == runtimeType&&other is Message_UpdateProfileSharing&&(identical(other.field0, field0) || other.field0 == field0)); +} - @override - bool operator ==(Object other) { - return identical(this, other) || - (other.runtimeType == runtimeType && - other is _$PushMessage_TwoFaAuthEventImpl && - (identical(other.field0, field0) || other.field0 == field0)); - } - @override - int get hashCode => Object.hash(runtimeType, field0); - - /// Create a copy of PushMessage - /// with the given fields replaced by the non-null parameter values. - @JsonKey(includeFromJson: false, includeToJson: false) - @override - @pragma('vm:prefer-inline') - _$$PushMessage_TwoFaAuthEventImplCopyWith<_$PushMessage_TwoFaAuthEventImpl> - get copyWith => __$$PushMessage_TwoFaAuthEventImplCopyWithImpl< - _$PushMessage_TwoFaAuthEventImpl>(this, _$identity); - - @override - @optionalTypeArgs - TResult when({ - required TResult Function(MessageInst field0) iMessage, - required TResult Function(String uuid, String? error) sendConfirm, - required TResult Function(RegisterState field0) registrationState, - required TResult Function(SharedAlbum field0) newPhotostream, - required TResult Function(FTMessage field0) faceTime, - required TResult Function(StatusKitMessage field0) statusUpdate, - required TResult Function(IdmsMessage field0) idms, - required TResult Function(bool field0) twoFaAuthEvent, - required TResult Function() circleFinishEvent, - required TResult Function( - String sender, String beacon, BeaconAttributes attributes) - beaconShared, - }) { - return twoFaAuthEvent(field0); - } +@override +int get hashCode => Object.hash(runtimeType,field0); - @override - @optionalTypeArgs - TResult? whenOrNull({ - TResult? Function(MessageInst field0)? iMessage, - TResult? Function(String uuid, String? error)? sendConfirm, - TResult? Function(RegisterState field0)? registrationState, - TResult? Function(SharedAlbum field0)? newPhotostream, - TResult? Function(FTMessage field0)? faceTime, - TResult? Function(StatusKitMessage field0)? statusUpdate, - TResult? Function(IdmsMessage field0)? idms, - TResult? Function(bool field0)? twoFaAuthEvent, - TResult? Function()? circleFinishEvent, - TResult? Function( - String sender, String beacon, BeaconAttributes attributes)? - beaconShared, - }) { - return twoFaAuthEvent?.call(field0); - } +@override +String toString() { + return 'Message.updateProfileSharing(field0: $field0)'; +} - @override - @optionalTypeArgs - TResult maybeWhen({ - TResult Function(MessageInst field0)? iMessage, - TResult Function(String uuid, String? error)? sendConfirm, - TResult Function(RegisterState field0)? registrationState, - TResult Function(SharedAlbum field0)? newPhotostream, - TResult Function(FTMessage field0)? faceTime, - TResult Function(StatusKitMessage field0)? statusUpdate, - TResult Function(IdmsMessage field0)? idms, - TResult Function(bool field0)? twoFaAuthEvent, - TResult Function()? circleFinishEvent, - TResult Function(String sender, String beacon, BeaconAttributes attributes)? - beaconShared, - required TResult orElse(), - }) { - if (twoFaAuthEvent != null) { - return twoFaAuthEvent(field0); - } - return orElse(); - } - @override - @optionalTypeArgs - TResult map({ - required TResult Function(PushMessage_IMessage value) iMessage, - required TResult Function(PushMessage_SendConfirm value) sendConfirm, - required TResult Function(PushMessage_RegistrationState value) - registrationState, - required TResult Function(PushMessage_NewPhotostream value) newPhotostream, - required TResult Function(PushMessage_FaceTime value) faceTime, - required TResult Function(PushMessage_StatusUpdate value) statusUpdate, - required TResult Function(PushMessage_Idms value) idms, - required TResult Function(PushMessage_TwoFaAuthEvent value) twoFaAuthEvent, - required TResult Function(PushMessage_CircleFinishEvent value) - circleFinishEvent, - required TResult Function(PushMessage_BeaconShared value) beaconShared, - }) { - return twoFaAuthEvent(this); - } +} - @override - @optionalTypeArgs - TResult? mapOrNull({ - TResult? Function(PushMessage_IMessage value)? iMessage, - TResult? Function(PushMessage_SendConfirm value)? sendConfirm, - TResult? Function(PushMessage_RegistrationState value)? registrationState, - TResult? Function(PushMessage_NewPhotostream value)? newPhotostream, - TResult? Function(PushMessage_FaceTime value)? faceTime, - TResult? Function(PushMessage_StatusUpdate value)? statusUpdate, - TResult? Function(PushMessage_Idms value)? idms, - TResult? Function(PushMessage_TwoFaAuthEvent value)? twoFaAuthEvent, - TResult? Function(PushMessage_CircleFinishEvent value)? circleFinishEvent, - TResult? Function(PushMessage_BeaconShared value)? beaconShared, - }) { - return twoFaAuthEvent?.call(this); - } +/// @nodoc +abstract mixin class $Message_UpdateProfileSharingCopyWith<$Res> implements $MessageCopyWith<$Res> { + factory $Message_UpdateProfileSharingCopyWith(Message_UpdateProfileSharing value, $Res Function(Message_UpdateProfileSharing) _then) = _$Message_UpdateProfileSharingCopyWithImpl; +@useResult +$Res call({ + UpdateProfileSharingMessage field0 +}); - @override - @optionalTypeArgs - TResult maybeMap({ - TResult Function(PushMessage_IMessage value)? iMessage, - TResult Function(PushMessage_SendConfirm value)? sendConfirm, - TResult Function(PushMessage_RegistrationState value)? registrationState, - TResult Function(PushMessage_NewPhotostream value)? newPhotostream, - TResult Function(PushMessage_FaceTime value)? faceTime, - TResult Function(PushMessage_StatusUpdate value)? statusUpdate, - TResult Function(PushMessage_Idms value)? idms, - TResult Function(PushMessage_TwoFaAuthEvent value)? twoFaAuthEvent, - TResult Function(PushMessage_CircleFinishEvent value)? circleFinishEvent, - TResult Function(PushMessage_BeaconShared value)? beaconShared, - required TResult orElse(), - }) { - if (twoFaAuthEvent != null) { - return twoFaAuthEvent(this); - } - return orElse(); - } -} -abstract class PushMessage_TwoFaAuthEvent extends PushMessage { - const factory PushMessage_TwoFaAuthEvent(final bool field0) = - _$PushMessage_TwoFaAuthEventImpl; - const PushMessage_TwoFaAuthEvent._() : super._(); - bool get field0; - /// Create a copy of PushMessage - /// with the given fields replaced by the non-null parameter values. - @JsonKey(includeFromJson: false, includeToJson: false) - _$$PushMessage_TwoFaAuthEventImplCopyWith<_$PushMessage_TwoFaAuthEventImpl> - get copyWith => throw _privateConstructorUsedError; } - /// @nodoc -abstract class _$$PushMessage_CircleFinishEventImplCopyWith<$Res> { - factory _$$PushMessage_CircleFinishEventImplCopyWith( - _$PushMessage_CircleFinishEventImpl value, - $Res Function(_$PushMessage_CircleFinishEventImpl) then) = - __$$PushMessage_CircleFinishEventImplCopyWithImpl<$Res>; +class _$Message_UpdateProfileSharingCopyWithImpl<$Res> + implements $Message_UpdateProfileSharingCopyWith<$Res> { + _$Message_UpdateProfileSharingCopyWithImpl(this._self, this._then); + + final Message_UpdateProfileSharing _self; + final $Res Function(Message_UpdateProfileSharing) _then; + +/// Create a copy of Message +/// with the given fields replaced by the non-null parameter values. +@pragma('vm:prefer-inline') $Res call({Object? field0 = null,}) { + return _then(Message_UpdateProfileSharing( +null == field0 ? _self.field0 : field0 // ignore: cast_nullable_to_non_nullable +as UpdateProfileSharingMessage, + )); } -/// @nodoc -class __$$PushMessage_CircleFinishEventImplCopyWithImpl<$Res> - extends _$PushMessageCopyWithImpl<$Res, _$PushMessage_CircleFinishEventImpl> - implements _$$PushMessage_CircleFinishEventImplCopyWith<$Res> { - __$$PushMessage_CircleFinishEventImplCopyWithImpl( - _$PushMessage_CircleFinishEventImpl _value, - $Res Function(_$PushMessage_CircleFinishEventImpl) _then) - : super(_value, _then); - /// Create a copy of PushMessage - /// with the given fields replaced by the non-null parameter values. } /// @nodoc -class _$PushMessage_CircleFinishEventImpl - extends PushMessage_CircleFinishEvent { - const _$PushMessage_CircleFinishEventImpl() : super._(); - - @override - String toString() { - return 'PushMessage.circleFinishEvent()'; - } - @override - bool operator ==(Object other) { - return identical(this, other) || - (other.runtimeType == runtimeType && - other is _$PushMessage_CircleFinishEventImpl); - } +class Message_ShareProfile extends Message { + const Message_ShareProfile(this.field0): super._(); - @override - int get hashCode => runtimeType.hashCode; - - @override - @optionalTypeArgs - TResult when({ - required TResult Function(MessageInst field0) iMessage, - required TResult Function(String uuid, String? error) sendConfirm, - required TResult Function(RegisterState field0) registrationState, - required TResult Function(SharedAlbum field0) newPhotostream, - required TResult Function(FTMessage field0) faceTime, - required TResult Function(StatusKitMessage field0) statusUpdate, - required TResult Function(IdmsMessage field0) idms, - required TResult Function(bool field0) twoFaAuthEvent, - required TResult Function() circleFinishEvent, - required TResult Function( - String sender, String beacon, BeaconAttributes attributes) - beaconShared, - }) { - return circleFinishEvent(); - } - @override - @optionalTypeArgs - TResult? whenOrNull({ - TResult? Function(MessageInst field0)? iMessage, - TResult? Function(String uuid, String? error)? sendConfirm, - TResult? Function(RegisterState field0)? registrationState, - TResult? Function(SharedAlbum field0)? newPhotostream, - TResult? Function(FTMessage field0)? faceTime, - TResult? Function(StatusKitMessage field0)? statusUpdate, - TResult? Function(IdmsMessage field0)? idms, - TResult? Function(bool field0)? twoFaAuthEvent, - TResult? Function()? circleFinishEvent, - TResult? Function( - String sender, String beacon, BeaconAttributes attributes)? - beaconShared, - }) { - return circleFinishEvent?.call(); - } + final ShareProfileMessage field0; - @override - @optionalTypeArgs - TResult maybeWhen({ - TResult Function(MessageInst field0)? iMessage, - TResult Function(String uuid, String? error)? sendConfirm, - TResult Function(RegisterState field0)? registrationState, - TResult Function(SharedAlbum field0)? newPhotostream, - TResult Function(FTMessage field0)? faceTime, - TResult Function(StatusKitMessage field0)? statusUpdate, - TResult Function(IdmsMessage field0)? idms, - TResult Function(bool field0)? twoFaAuthEvent, - TResult Function()? circleFinishEvent, - TResult Function(String sender, String beacon, BeaconAttributes attributes)? - beaconShared, - required TResult orElse(), - }) { - if (circleFinishEvent != null) { - return circleFinishEvent(); - } - return orElse(); - } +/// Create a copy of Message +/// with the given fields replaced by the non-null parameter values. +@JsonKey(includeFromJson: false, includeToJson: false) +@pragma('vm:prefer-inline') +$Message_ShareProfileCopyWith get copyWith => _$Message_ShareProfileCopyWithImpl(this, _$identity); - @override - @optionalTypeArgs - TResult map({ - required TResult Function(PushMessage_IMessage value) iMessage, - required TResult Function(PushMessage_SendConfirm value) sendConfirm, - required TResult Function(PushMessage_RegistrationState value) - registrationState, - required TResult Function(PushMessage_NewPhotostream value) newPhotostream, - required TResult Function(PushMessage_FaceTime value) faceTime, - required TResult Function(PushMessage_StatusUpdate value) statusUpdate, - required TResult Function(PushMessage_Idms value) idms, - required TResult Function(PushMessage_TwoFaAuthEvent value) twoFaAuthEvent, - required TResult Function(PushMessage_CircleFinishEvent value) - circleFinishEvent, - required TResult Function(PushMessage_BeaconShared value) beaconShared, - }) { - return circleFinishEvent(this); - } - @override - @optionalTypeArgs - TResult? mapOrNull({ - TResult? Function(PushMessage_IMessage value)? iMessage, - TResult? Function(PushMessage_SendConfirm value)? sendConfirm, - TResult? Function(PushMessage_RegistrationState value)? registrationState, - TResult? Function(PushMessage_NewPhotostream value)? newPhotostream, - TResult? Function(PushMessage_FaceTime value)? faceTime, - TResult? Function(PushMessage_StatusUpdate value)? statusUpdate, - TResult? Function(PushMessage_Idms value)? idms, - TResult? Function(PushMessage_TwoFaAuthEvent value)? twoFaAuthEvent, - TResult? Function(PushMessage_CircleFinishEvent value)? circleFinishEvent, - TResult? Function(PushMessage_BeaconShared value)? beaconShared, - }) { - return circleFinishEvent?.call(this); - } - @override - @optionalTypeArgs - TResult maybeMap({ - TResult Function(PushMessage_IMessage value)? iMessage, - TResult Function(PushMessage_SendConfirm value)? sendConfirm, - TResult Function(PushMessage_RegistrationState value)? registrationState, - TResult Function(PushMessage_NewPhotostream value)? newPhotostream, - TResult Function(PushMessage_FaceTime value)? faceTime, - TResult Function(PushMessage_StatusUpdate value)? statusUpdate, - TResult Function(PushMessage_Idms value)? idms, - TResult Function(PushMessage_TwoFaAuthEvent value)? twoFaAuthEvent, - TResult Function(PushMessage_CircleFinishEvent value)? circleFinishEvent, - TResult Function(PushMessage_BeaconShared value)? beaconShared, - required TResult orElse(), - }) { - if (circleFinishEvent != null) { - return circleFinishEvent(this); - } - return orElse(); - } +@override +bool operator ==(Object other) { + return identical(this, other) || (other.runtimeType == runtimeType&&other is Message_ShareProfile&&(identical(other.field0, field0) || other.field0 == field0)); } -abstract class PushMessage_CircleFinishEvent extends PushMessage { - const factory PushMessage_CircleFinishEvent() = - _$PushMessage_CircleFinishEventImpl; - const PushMessage_CircleFinishEvent._() : super._(); -} - -/// @nodoc -abstract class _$$PushMessage_BeaconSharedImplCopyWith<$Res> { - factory _$$PushMessage_BeaconSharedImplCopyWith( - _$PushMessage_BeaconSharedImpl value, - $Res Function(_$PushMessage_BeaconSharedImpl) then) = - __$$PushMessage_BeaconSharedImplCopyWithImpl<$Res>; - @useResult - $Res call({String sender, String beacon, BeaconAttributes attributes}); -} - -/// @nodoc -class __$$PushMessage_BeaconSharedImplCopyWithImpl<$Res> - extends _$PushMessageCopyWithImpl<$Res, _$PushMessage_BeaconSharedImpl> - implements _$$PushMessage_BeaconSharedImplCopyWith<$Res> { - __$$PushMessage_BeaconSharedImplCopyWithImpl( - _$PushMessage_BeaconSharedImpl _value, - $Res Function(_$PushMessage_BeaconSharedImpl) _then) - : super(_value, _then); - - /// Create a copy of PushMessage - /// with the given fields replaced by the non-null parameter values. - @pragma('vm:prefer-inline') - @override - $Res call({ - Object? sender = null, - Object? beacon = null, - Object? attributes = null, - }) { - return _then(_$PushMessage_BeaconSharedImpl( - sender: null == sender - ? _value.sender - : sender // ignore: cast_nullable_to_non_nullable - as String, - beacon: null == beacon - ? _value.beacon - : beacon // ignore: cast_nullable_to_non_nullable - as String, - attributes: null == attributes - ? _value.attributes - : attributes // ignore: cast_nullable_to_non_nullable - as BeaconAttributes, - )); - } -} -/// @nodoc +@override +int get hashCode => Object.hash(runtimeType,field0); -class _$PushMessage_BeaconSharedImpl extends PushMessage_BeaconShared { - const _$PushMessage_BeaconSharedImpl( - {required this.sender, required this.beacon, required this.attributes}) - : super._(); +@override +String toString() { + return 'Message.shareProfile(field0: $field0)'; +} - @override - final String sender; - @override - final String beacon; - @override - final BeaconAttributes attributes; - @override - String toString() { - return 'PushMessage.beaconShared(sender: $sender, beacon: $beacon, attributes: $attributes)'; - } +} - @override - bool operator ==(Object other) { - return identical(this, other) || - (other.runtimeType == runtimeType && - other is _$PushMessage_BeaconSharedImpl && - (identical(other.sender, sender) || other.sender == sender) && - (identical(other.beacon, beacon) || other.beacon == beacon) && - (identical(other.attributes, attributes) || - other.attributes == attributes)); - } +/// @nodoc +abstract mixin class $Message_ShareProfileCopyWith<$Res> implements $MessageCopyWith<$Res> { + factory $Message_ShareProfileCopyWith(Message_ShareProfile value, $Res Function(Message_ShareProfile) _then) = _$Message_ShareProfileCopyWithImpl; +@useResult +$Res call({ + ShareProfileMessage field0 +}); - @override - int get hashCode => Object.hash(runtimeType, sender, beacon, attributes); - - /// Create a copy of PushMessage - /// with the given fields replaced by the non-null parameter values. - @JsonKey(includeFromJson: false, includeToJson: false) - @override - @pragma('vm:prefer-inline') - _$$PushMessage_BeaconSharedImplCopyWith<_$PushMessage_BeaconSharedImpl> - get copyWith => __$$PushMessage_BeaconSharedImplCopyWithImpl< - _$PushMessage_BeaconSharedImpl>(this, _$identity); - - @override - @optionalTypeArgs - TResult when({ - required TResult Function(MessageInst field0) iMessage, - required TResult Function(String uuid, String? error) sendConfirm, - required TResult Function(RegisterState field0) registrationState, - required TResult Function(SharedAlbum field0) newPhotostream, - required TResult Function(FTMessage field0) faceTime, - required TResult Function(StatusKitMessage field0) statusUpdate, - required TResult Function(IdmsMessage field0) idms, - required TResult Function(bool field0) twoFaAuthEvent, - required TResult Function() circleFinishEvent, - required TResult Function( - String sender, String beacon, BeaconAttributes attributes) - beaconShared, - }) { - return beaconShared(sender, beacon, attributes); - } - @override - @optionalTypeArgs - TResult? whenOrNull({ - TResult? Function(MessageInst field0)? iMessage, - TResult? Function(String uuid, String? error)? sendConfirm, - TResult? Function(RegisterState field0)? registrationState, - TResult? Function(SharedAlbum field0)? newPhotostream, - TResult? Function(FTMessage field0)? faceTime, - TResult? Function(StatusKitMessage field0)? statusUpdate, - TResult? Function(IdmsMessage field0)? idms, - TResult? Function(bool field0)? twoFaAuthEvent, - TResult? Function()? circleFinishEvent, - TResult? Function( - String sender, String beacon, BeaconAttributes attributes)? - beaconShared, - }) { - return beaconShared?.call(sender, beacon, attributes); - } - @override - @optionalTypeArgs - TResult maybeWhen({ - TResult Function(MessageInst field0)? iMessage, - TResult Function(String uuid, String? error)? sendConfirm, - TResult Function(RegisterState field0)? registrationState, - TResult Function(SharedAlbum field0)? newPhotostream, - TResult Function(FTMessage field0)? faceTime, - TResult Function(StatusKitMessage field0)? statusUpdate, - TResult Function(IdmsMessage field0)? idms, - TResult Function(bool field0)? twoFaAuthEvent, - TResult Function()? circleFinishEvent, - TResult Function(String sender, String beacon, BeaconAttributes attributes)? - beaconShared, - required TResult orElse(), - }) { - if (beaconShared != null) { - return beaconShared(sender, beacon, attributes); - } - return orElse(); - } - @override - @optionalTypeArgs - TResult map({ - required TResult Function(PushMessage_IMessage value) iMessage, - required TResult Function(PushMessage_SendConfirm value) sendConfirm, - required TResult Function(PushMessage_RegistrationState value) - registrationState, - required TResult Function(PushMessage_NewPhotostream value) newPhotostream, - required TResult Function(PushMessage_FaceTime value) faceTime, - required TResult Function(PushMessage_StatusUpdate value) statusUpdate, - required TResult Function(PushMessage_Idms value) idms, - required TResult Function(PushMessage_TwoFaAuthEvent value) twoFaAuthEvent, - required TResult Function(PushMessage_CircleFinishEvent value) - circleFinishEvent, - required TResult Function(PushMessage_BeaconShared value) beaconShared, - }) { - return beaconShared(this); - } +} +/// @nodoc +class _$Message_ShareProfileCopyWithImpl<$Res> + implements $Message_ShareProfileCopyWith<$Res> { + _$Message_ShareProfileCopyWithImpl(this._self, this._then); - @override - @optionalTypeArgs - TResult? mapOrNull({ - TResult? Function(PushMessage_IMessage value)? iMessage, - TResult? Function(PushMessage_SendConfirm value)? sendConfirm, - TResult? Function(PushMessage_RegistrationState value)? registrationState, - TResult? Function(PushMessage_NewPhotostream value)? newPhotostream, - TResult? Function(PushMessage_FaceTime value)? faceTime, - TResult? Function(PushMessage_StatusUpdate value)? statusUpdate, - TResult? Function(PushMessage_Idms value)? idms, - TResult? Function(PushMessage_TwoFaAuthEvent value)? twoFaAuthEvent, - TResult? Function(PushMessage_CircleFinishEvent value)? circleFinishEvent, - TResult? Function(PushMessage_BeaconShared value)? beaconShared, - }) { - return beaconShared?.call(this); - } + final Message_ShareProfile _self; + final $Res Function(Message_ShareProfile) _then; - @override - @optionalTypeArgs - TResult maybeMap({ - TResult Function(PushMessage_IMessage value)? iMessage, - TResult Function(PushMessage_SendConfirm value)? sendConfirm, - TResult Function(PushMessage_RegistrationState value)? registrationState, - TResult Function(PushMessage_NewPhotostream value)? newPhotostream, - TResult Function(PushMessage_FaceTime value)? faceTime, - TResult Function(PushMessage_StatusUpdate value)? statusUpdate, - TResult Function(PushMessage_Idms value)? idms, - TResult Function(PushMessage_TwoFaAuthEvent value)? twoFaAuthEvent, - TResult Function(PushMessage_CircleFinishEvent value)? circleFinishEvent, - TResult Function(PushMessage_BeaconShared value)? beaconShared, - required TResult orElse(), - }) { - if (beaconShared != null) { - return beaconShared(this); - } - return orElse(); - } +/// Create a copy of Message +/// with the given fields replaced by the non-null parameter values. +@pragma('vm:prefer-inline') $Res call({Object? field0 = null,}) { + return _then(Message_ShareProfile( +null == field0 ? _self.field0 : field0 // ignore: cast_nullable_to_non_nullable +as ShareProfileMessage, + )); } -abstract class PushMessage_BeaconShared extends PushMessage { - const factory PushMessage_BeaconShared( - {required final String sender, - required final String beacon, - required final BeaconAttributes attributes}) = - _$PushMessage_BeaconSharedImpl; - const PushMessage_BeaconShared._() : super._(); - String get sender; - String get beacon; - BeaconAttributes get attributes; - - /// Create a copy of PushMessage - /// with the given fields replaced by the non-null parameter values. - @JsonKey(includeFromJson: false, includeToJson: false) - _$$PushMessage_BeaconSharedImplCopyWith<_$PushMessage_BeaconSharedImpl> - get copyWith => throw _privateConstructorUsedError; } /// @nodoc -mixin _$ReactMessageType { - @optionalTypeArgs - TResult when({ - required TResult Function(Reaction reaction, bool enable) react, - required TResult Function(ExtensionApp spec, MessageParts body, bool isMeta) - extension_, - }) => - throw _privateConstructorUsedError; - @optionalTypeArgs - TResult? whenOrNull({ - TResult? Function(Reaction reaction, bool enable)? react, - TResult? Function(ExtensionApp spec, MessageParts body, bool isMeta)? - extension_, - }) => - throw _privateConstructorUsedError; - @optionalTypeArgs - TResult maybeWhen({ - TResult Function(Reaction reaction, bool enable)? react, - TResult Function(ExtensionApp spec, MessageParts body, bool isMeta)? - extension_, - required TResult orElse(), - }) => - throw _privateConstructorUsedError; - @optionalTypeArgs - TResult map({ - required TResult Function(ReactMessageType_React value) react, - required TResult Function(ReactMessageType_Extension value) extension_, - }) => - throw _privateConstructorUsedError; - @optionalTypeArgs - TResult? mapOrNull({ - TResult? Function(ReactMessageType_React value)? react, - TResult? Function(ReactMessageType_Extension value)? extension_, - }) => - throw _privateConstructorUsedError; - @optionalTypeArgs - TResult maybeMap({ - TResult Function(ReactMessageType_React value)? react, - TResult Function(ReactMessageType_Extension value)? extension_, - required TResult orElse(), - }) => - throw _privateConstructorUsedError; -} - -/// @nodoc -abstract class $ReactMessageTypeCopyWith<$Res> { - factory $ReactMessageTypeCopyWith( - ReactMessageType value, $Res Function(ReactMessageType) then) = - _$ReactMessageTypeCopyWithImpl<$Res, ReactMessageType>; -} - -/// @nodoc -class _$ReactMessageTypeCopyWithImpl<$Res, $Val extends ReactMessageType> - implements $ReactMessageTypeCopyWith<$Res> { - _$ReactMessageTypeCopyWithImpl(this._value, this._then); - - // ignore: unused_field - final $Val _value; - // ignore: unused_field - final $Res Function($Val) _then; - - /// Create a copy of ReactMessageType - /// with the given fields replaced by the non-null parameter values. -} - -/// @nodoc -abstract class _$$ReactMessageType_ReactImplCopyWith<$Res> { - factory _$$ReactMessageType_ReactImplCopyWith( - _$ReactMessageType_ReactImpl value, - $Res Function(_$ReactMessageType_ReactImpl) then) = - __$$ReactMessageType_ReactImplCopyWithImpl<$Res>; - @useResult - $Res call({Reaction reaction, bool enable}); - - $ReactionCopyWith<$Res> get reaction; -} - -/// @nodoc -class __$$ReactMessageType_ReactImplCopyWithImpl<$Res> - extends _$ReactMessageTypeCopyWithImpl<$Res, _$ReactMessageType_ReactImpl> - implements _$$ReactMessageType_ReactImplCopyWith<$Res> { - __$$ReactMessageType_ReactImplCopyWithImpl( - _$ReactMessageType_ReactImpl _value, - $Res Function(_$ReactMessageType_ReactImpl) _then) - : super(_value, _then); - - /// Create a copy of ReactMessageType - /// with the given fields replaced by the non-null parameter values. - @pragma('vm:prefer-inline') - @override - $Res call({ - Object? reaction = null, - Object? enable = null, - }) { - return _then(_$ReactMessageType_ReactImpl( - reaction: null == reaction - ? _value.reaction - : reaction // ignore: cast_nullable_to_non_nullable - as Reaction, - enable: null == enable - ? _value.enable - : enable // ignore: cast_nullable_to_non_nullable - as bool, - )); - } - /// Create a copy of ReactMessageType - /// with the given fields replaced by the non-null parameter values. - @override - @pragma('vm:prefer-inline') - $ReactionCopyWith<$Res> get reaction { - return $ReactionCopyWith<$Res>(_value.reaction, (value) { - return _then(_value.copyWith(reaction: value)); - }); - } -} -/// @nodoc +class Message_NotifyAnyways extends Message { + const Message_NotifyAnyways(): super._(); -class _$ReactMessageType_ReactImpl extends ReactMessageType_React { - const _$ReactMessageType_ReactImpl( - {required this.reaction, required this.enable}) - : super._(); - @override - final Reaction reaction; - @override - final bool enable; - @override - String toString() { - return 'ReactMessageType.react(reaction: $reaction, enable: $enable)'; - } - @override - bool operator ==(Object other) { - return identical(this, other) || - (other.runtimeType == runtimeType && - other is _$ReactMessageType_ReactImpl && - (identical(other.reaction, reaction) || - other.reaction == reaction) && - (identical(other.enable, enable) || other.enable == enable)); - } - @override - int get hashCode => Object.hash(runtimeType, reaction, enable); - - /// Create a copy of ReactMessageType - /// with the given fields replaced by the non-null parameter values. - @JsonKey(includeFromJson: false, includeToJson: false) - @override - @pragma('vm:prefer-inline') - _$$ReactMessageType_ReactImplCopyWith<_$ReactMessageType_ReactImpl> - get copyWith => __$$ReactMessageType_ReactImplCopyWithImpl< - _$ReactMessageType_ReactImpl>(this, _$identity); - - @override - @optionalTypeArgs - TResult when({ - required TResult Function(Reaction reaction, bool enable) react, - required TResult Function(ExtensionApp spec, MessageParts body, bool isMeta) - extension_, - }) { - return react(reaction, enable); - } - @override - @optionalTypeArgs - TResult? whenOrNull({ - TResult? Function(Reaction reaction, bool enable)? react, - TResult? Function(ExtensionApp spec, MessageParts body, bool isMeta)? - extension_, - }) { - return react?.call(reaction, enable); - } - @override - @optionalTypeArgs - TResult maybeWhen({ - TResult Function(Reaction reaction, bool enable)? react, - TResult Function(ExtensionApp spec, MessageParts body, bool isMeta)? - extension_, - required TResult orElse(), - }) { - if (react != null) { - return react(reaction, enable); - } - return orElse(); - } +@override +bool operator ==(Object other) { + return identical(this, other) || (other.runtimeType == runtimeType&&other is Message_NotifyAnyways); +} - @override - @optionalTypeArgs - TResult map({ - required TResult Function(ReactMessageType_React value) react, - required TResult Function(ReactMessageType_Extension value) extension_, - }) { - return react(this); - } - @override - @optionalTypeArgs - TResult? mapOrNull({ - TResult? Function(ReactMessageType_React value)? react, - TResult? Function(ReactMessageType_Extension value)? extension_, - }) { - return react?.call(this); - } +@override +int get hashCode => runtimeType.hashCode; - @override - @optionalTypeArgs - TResult maybeMap({ - TResult Function(ReactMessageType_React value)? react, - TResult Function(ReactMessageType_Extension value)? extension_, - required TResult orElse(), - }) { - if (react != null) { - return react(this); - } - return orElse(); - } +@override +String toString() { + return 'Message.notifyAnyways()'; } -abstract class ReactMessageType_React extends ReactMessageType { - const factory ReactMessageType_React( - {required final Reaction reaction, - required final bool enable}) = _$ReactMessageType_ReactImpl; - const ReactMessageType_React._() : super._(); - - Reaction get reaction; - bool get enable; - - /// Create a copy of ReactMessageType - /// with the given fields replaced by the non-null parameter values. - @JsonKey(includeFromJson: false, includeToJson: false) - _$$ReactMessageType_ReactImplCopyWith<_$ReactMessageType_ReactImpl> - get copyWith => throw _privateConstructorUsedError; -} - -/// @nodoc -abstract class _$$ReactMessageType_ExtensionImplCopyWith<$Res> { - factory _$$ReactMessageType_ExtensionImplCopyWith( - _$ReactMessageType_ExtensionImpl value, - $Res Function(_$ReactMessageType_ExtensionImpl) then) = - __$$ReactMessageType_ExtensionImplCopyWithImpl<$Res>; - @useResult - $Res call({ExtensionApp spec, MessageParts body, bool isMeta}); -} - -/// @nodoc -class __$$ReactMessageType_ExtensionImplCopyWithImpl<$Res> - extends _$ReactMessageTypeCopyWithImpl<$Res, - _$ReactMessageType_ExtensionImpl> - implements _$$ReactMessageType_ExtensionImplCopyWith<$Res> { - __$$ReactMessageType_ExtensionImplCopyWithImpl( - _$ReactMessageType_ExtensionImpl _value, - $Res Function(_$ReactMessageType_ExtensionImpl) _then) - : super(_value, _then); - - /// Create a copy of ReactMessageType - /// with the given fields replaced by the non-null parameter values. - @pragma('vm:prefer-inline') - @override - $Res call({ - Object? spec = null, - Object? body = null, - Object? isMeta = null, - }) { - return _then(_$ReactMessageType_ExtensionImpl( - spec: null == spec - ? _value.spec - : spec // ignore: cast_nullable_to_non_nullable - as ExtensionApp, - body: null == body - ? _value.body - : body // ignore: cast_nullable_to_non_nullable - as MessageParts, - isMeta: null == isMeta - ? _value.isMeta - : isMeta // ignore: cast_nullable_to_non_nullable - as bool, - )); - } + } -/// @nodoc -class _$ReactMessageType_ExtensionImpl extends ReactMessageType_Extension { - const _$ReactMessageType_ExtensionImpl( - {required this.spec, required this.body, required this.isMeta}) - : super._(); - @override - final ExtensionApp spec; - @override - final MessageParts body; - @override - final bool isMeta; - @override - String toString() { - return 'ReactMessageType.extension_(spec: $spec, body: $body, isMeta: $isMeta)'; - } +/// @nodoc - @override - bool operator ==(Object other) { - return identical(this, other) || - (other.runtimeType == runtimeType && - other is _$ReactMessageType_ExtensionImpl && - (identical(other.spec, spec) || other.spec == spec) && - (identical(other.body, body) || other.body == body) && - (identical(other.isMeta, isMeta) || other.isMeta == isMeta)); - } - @override - int get hashCode => Object.hash(runtimeType, spec, body, isMeta); - - /// Create a copy of ReactMessageType - /// with the given fields replaced by the non-null parameter values. - @JsonKey(includeFromJson: false, includeToJson: false) - @override - @pragma('vm:prefer-inline') - _$$ReactMessageType_ExtensionImplCopyWith<_$ReactMessageType_ExtensionImpl> - get copyWith => __$$ReactMessageType_ExtensionImplCopyWithImpl< - _$ReactMessageType_ExtensionImpl>(this, _$identity); - - @override - @optionalTypeArgs - TResult when({ - required TResult Function(Reaction reaction, bool enable) react, - required TResult Function(ExtensionApp spec, MessageParts body, bool isMeta) - extension_, - }) { - return extension_(spec, body, isMeta); - } +class Message_SetTranscriptBackground extends Message { + const Message_SetTranscriptBackground(this.field0): super._(); - @override - @optionalTypeArgs - TResult? whenOrNull({ - TResult? Function(Reaction reaction, bool enable)? react, - TResult? Function(ExtensionApp spec, MessageParts body, bool isMeta)? - extension_, - }) { - return extension_?.call(spec, body, isMeta); - } - @override - @optionalTypeArgs - TResult maybeWhen({ - TResult Function(Reaction reaction, bool enable)? react, - TResult Function(ExtensionApp spec, MessageParts body, bool isMeta)? - extension_, - required TResult orElse(), - }) { - if (extension_ != null) { - return extension_(spec, body, isMeta); - } - return orElse(); - } + final SetTranscriptBackgroundMessage field0; - @override - @optionalTypeArgs - TResult map({ - required TResult Function(ReactMessageType_React value) react, - required TResult Function(ReactMessageType_Extension value) extension_, - }) { - return extension_(this); - } +/// Create a copy of Message +/// with the given fields replaced by the non-null parameter values. +@JsonKey(includeFromJson: false, includeToJson: false) +@pragma('vm:prefer-inline') +$Message_SetTranscriptBackgroundCopyWith get copyWith => _$Message_SetTranscriptBackgroundCopyWithImpl(this, _$identity); - @override - @optionalTypeArgs - TResult? mapOrNull({ - TResult? Function(ReactMessageType_React value)? react, - TResult? Function(ReactMessageType_Extension value)? extension_, - }) { - return extension_?.call(this); - } - @override - @optionalTypeArgs - TResult maybeMap({ - TResult Function(ReactMessageType_React value)? react, - TResult Function(ReactMessageType_Extension value)? extension_, - required TResult orElse(), - }) { - if (extension_ != null) { - return extension_(this); - } - return orElse(); - } + +@override +bool operator ==(Object other) { + return identical(this, other) || (other.runtimeType == runtimeType&&other is Message_SetTranscriptBackground&&(identical(other.field0, field0) || other.field0 == field0)); } -abstract class ReactMessageType_Extension extends ReactMessageType { - const factory ReactMessageType_Extension( - {required final ExtensionApp spec, - required final MessageParts body, - required final bool isMeta}) = _$ReactMessageType_ExtensionImpl; - const ReactMessageType_Extension._() : super._(); - ExtensionApp get spec; - MessageParts get body; - bool get isMeta; +@override +int get hashCode => Object.hash(runtimeType,field0); - /// Create a copy of ReactMessageType - /// with the given fields replaced by the non-null parameter values. - @JsonKey(includeFromJson: false, includeToJson: false) - _$$ReactMessageType_ExtensionImplCopyWith<_$ReactMessageType_ExtensionImpl> - get copyWith => throw _privateConstructorUsedError; +@override +String toString() { + return 'Message.setTranscriptBackground(field0: $field0)'; } -/// @nodoc -mixin _$Reaction { - @optionalTypeArgs - TResult when({ - required TResult Function() heart, - required TResult Function() like, - required TResult Function() dislike, - required TResult Function() laugh, - required TResult Function() emphasize, - required TResult Function() question, - required TResult Function(String field0) emoji, - required TResult Function(ExtensionApp? spec, MessageParts body) sticker, - }) => - throw _privateConstructorUsedError; - @optionalTypeArgs - TResult? whenOrNull({ - TResult? Function()? heart, - TResult? Function()? like, - TResult? Function()? dislike, - TResult? Function()? laugh, - TResult? Function()? emphasize, - TResult? Function()? question, - TResult? Function(String field0)? emoji, - TResult? Function(ExtensionApp? spec, MessageParts body)? sticker, - }) => - throw _privateConstructorUsedError; - @optionalTypeArgs - TResult maybeWhen({ - TResult Function()? heart, - TResult Function()? like, - TResult Function()? dislike, - TResult Function()? laugh, - TResult Function()? emphasize, - TResult Function()? question, - TResult Function(String field0)? emoji, - TResult Function(ExtensionApp? spec, MessageParts body)? sticker, - required TResult orElse(), - }) => - throw _privateConstructorUsedError; - @optionalTypeArgs - TResult map({ - required TResult Function(Reaction_Heart value) heart, - required TResult Function(Reaction_Like value) like, - required TResult Function(Reaction_Dislike value) dislike, - required TResult Function(Reaction_Laugh value) laugh, - required TResult Function(Reaction_Emphasize value) emphasize, - required TResult Function(Reaction_Question value) question, - required TResult Function(Reaction_Emoji value) emoji, - required TResult Function(Reaction_Sticker value) sticker, - }) => - throw _privateConstructorUsedError; - @optionalTypeArgs - TResult? mapOrNull({ - TResult? Function(Reaction_Heart value)? heart, - TResult? Function(Reaction_Like value)? like, - TResult? Function(Reaction_Dislike value)? dislike, - TResult? Function(Reaction_Laugh value)? laugh, - TResult? Function(Reaction_Emphasize value)? emphasize, - TResult? Function(Reaction_Question value)? question, - TResult? Function(Reaction_Emoji value)? emoji, - TResult? Function(Reaction_Sticker value)? sticker, - }) => - throw _privateConstructorUsedError; - @optionalTypeArgs - TResult maybeMap({ - TResult Function(Reaction_Heart value)? heart, - TResult Function(Reaction_Like value)? like, - TResult Function(Reaction_Dislike value)? dislike, - TResult Function(Reaction_Laugh value)? laugh, - TResult Function(Reaction_Emphasize value)? emphasize, - TResult Function(Reaction_Question value)? question, - TResult Function(Reaction_Emoji value)? emoji, - TResult Function(Reaction_Sticker value)? sticker, - required TResult orElse(), - }) => - throw _privateConstructorUsedError; -} - -/// @nodoc -abstract class $ReactionCopyWith<$Res> { - factory $ReactionCopyWith(Reaction value, $Res Function(Reaction) then) = - _$ReactionCopyWithImpl<$Res, Reaction>; -} - -/// @nodoc -class _$ReactionCopyWithImpl<$Res, $Val extends Reaction> - implements $ReactionCopyWith<$Res> { - _$ReactionCopyWithImpl(this._value, this._then); - - // ignore: unused_field - final $Val _value; - // ignore: unused_field - final $Res Function($Val) _then; - - /// Create a copy of Reaction - /// with the given fields replaced by the non-null parameter values. -} - -/// @nodoc -abstract class _$$Reaction_HeartImplCopyWith<$Res> { - factory _$$Reaction_HeartImplCopyWith(_$Reaction_HeartImpl value, - $Res Function(_$Reaction_HeartImpl) then) = - __$$Reaction_HeartImplCopyWithImpl<$Res>; -} - -/// @nodoc -class __$$Reaction_HeartImplCopyWithImpl<$Res> - extends _$ReactionCopyWithImpl<$Res, _$Reaction_HeartImpl> - implements _$$Reaction_HeartImplCopyWith<$Res> { - __$$Reaction_HeartImplCopyWithImpl( - _$Reaction_HeartImpl _value, $Res Function(_$Reaction_HeartImpl) _then) - : super(_value, _then); - - /// Create a copy of Reaction - /// with the given fields replaced by the non-null parameter values. -} - -/// @nodoc - -class _$Reaction_HeartImpl extends Reaction_Heart { - const _$Reaction_HeartImpl() : super._(); - - @override - String toString() { - return 'Reaction.heart()'; - } - @override - bool operator ==(Object other) { - return identical(this, other) || - (other.runtimeType == runtimeType && other is _$Reaction_HeartImpl); - } +} - @override - int get hashCode => runtimeType.hashCode; - - @override - @optionalTypeArgs - TResult when({ - required TResult Function() heart, - required TResult Function() like, - required TResult Function() dislike, - required TResult Function() laugh, - required TResult Function() emphasize, - required TResult Function() question, - required TResult Function(String field0) emoji, - required TResult Function(ExtensionApp? spec, MessageParts body) sticker, - }) { - return heart(); - } +/// @nodoc +abstract mixin class $Message_SetTranscriptBackgroundCopyWith<$Res> implements $MessageCopyWith<$Res> { + factory $Message_SetTranscriptBackgroundCopyWith(Message_SetTranscriptBackground value, $Res Function(Message_SetTranscriptBackground) _then) = _$Message_SetTranscriptBackgroundCopyWithImpl; +@useResult +$Res call({ + SetTranscriptBackgroundMessage field0 +}); - @override - @optionalTypeArgs - TResult? whenOrNull({ - TResult? Function()? heart, - TResult? Function()? like, - TResult? Function()? dislike, - TResult? Function()? laugh, - TResult? Function()? emphasize, - TResult? Function()? question, - TResult? Function(String field0)? emoji, - TResult? Function(ExtensionApp? spec, MessageParts body)? sticker, - }) { - return heart?.call(); - } - @override - @optionalTypeArgs - TResult maybeWhen({ - TResult Function()? heart, - TResult Function()? like, - TResult Function()? dislike, - TResult Function()? laugh, - TResult Function()? emphasize, - TResult Function()? question, - TResult Function(String field0)? emoji, - TResult Function(ExtensionApp? spec, MessageParts body)? sticker, - required TResult orElse(), - }) { - if (heart != null) { - return heart(); - } - return orElse(); - } +$SetTranscriptBackgroundMessageCopyWith<$Res> get field0; - @override - @optionalTypeArgs - TResult map({ - required TResult Function(Reaction_Heart value) heart, - required TResult Function(Reaction_Like value) like, - required TResult Function(Reaction_Dislike value) dislike, - required TResult Function(Reaction_Laugh value) laugh, - required TResult Function(Reaction_Emphasize value) emphasize, - required TResult Function(Reaction_Question value) question, - required TResult Function(Reaction_Emoji value) emoji, - required TResult Function(Reaction_Sticker value) sticker, - }) { - return heart(this); - } +} +/// @nodoc +class _$Message_SetTranscriptBackgroundCopyWithImpl<$Res> + implements $Message_SetTranscriptBackgroundCopyWith<$Res> { + _$Message_SetTranscriptBackgroundCopyWithImpl(this._self, this._then); - @override - @optionalTypeArgs - TResult? mapOrNull({ - TResult? Function(Reaction_Heart value)? heart, - TResult? Function(Reaction_Like value)? like, - TResult? Function(Reaction_Dislike value)? dislike, - TResult? Function(Reaction_Laugh value)? laugh, - TResult? Function(Reaction_Emphasize value)? emphasize, - TResult? Function(Reaction_Question value)? question, - TResult? Function(Reaction_Emoji value)? emoji, - TResult? Function(Reaction_Sticker value)? sticker, - }) { - return heart?.call(this); - } + final Message_SetTranscriptBackground _self; + final $Res Function(Message_SetTranscriptBackground) _then; - @override - @optionalTypeArgs - TResult maybeMap({ - TResult Function(Reaction_Heart value)? heart, - TResult Function(Reaction_Like value)? like, - TResult Function(Reaction_Dislike value)? dislike, - TResult Function(Reaction_Laugh value)? laugh, - TResult Function(Reaction_Emphasize value)? emphasize, - TResult Function(Reaction_Question value)? question, - TResult Function(Reaction_Emoji value)? emoji, - TResult Function(Reaction_Sticker value)? sticker, - required TResult orElse(), - }) { - if (heart != null) { - return heart(this); - } - return orElse(); - } +/// Create a copy of Message +/// with the given fields replaced by the non-null parameter values. +@pragma('vm:prefer-inline') $Res call({Object? field0 = null,}) { + return _then(Message_SetTranscriptBackground( +null == field0 ? _self.field0 : field0 // ignore: cast_nullable_to_non_nullable +as SetTranscriptBackgroundMessage, + )); } -abstract class Reaction_Heart extends Reaction { - const factory Reaction_Heart() = _$Reaction_HeartImpl; - const Reaction_Heart._() : super._(); -} +/// Create a copy of Message +/// with the given fields replaced by the non-null parameter values. +@override +@pragma('vm:prefer-inline') +$SetTranscriptBackgroundMessageCopyWith<$Res> get field0 { -/// @nodoc -abstract class _$$Reaction_LikeImplCopyWith<$Res> { - factory _$$Reaction_LikeImplCopyWith( - _$Reaction_LikeImpl value, $Res Function(_$Reaction_LikeImpl) then) = - __$$Reaction_LikeImplCopyWithImpl<$Res>; + return $SetTranscriptBackgroundMessageCopyWith<$Res>(_self.field0, (value) { + return _then(_self.copyWith(field0: value)); + }); +} } /// @nodoc -class __$$Reaction_LikeImplCopyWithImpl<$Res> - extends _$ReactionCopyWithImpl<$Res, _$Reaction_LikeImpl> - implements _$$Reaction_LikeImplCopyWith<$Res> { - __$$Reaction_LikeImplCopyWithImpl( - _$Reaction_LikeImpl _value, $Res Function(_$Reaction_LikeImpl) _then) - : super(_value, _then); +mixin _$MessagePart { - /// Create a copy of Reaction - /// with the given fields replaced by the non-null parameter values. -} + Object get field0; -/// @nodoc -class _$Reaction_LikeImpl extends Reaction_Like { - const _$Reaction_LikeImpl() : super._(); - @override - String toString() { - return 'Reaction.like()'; - } +@override +bool operator ==(Object other) { + return identical(this, other) || (other.runtimeType == runtimeType&&other is MessagePart&&const DeepCollectionEquality().equals(other.field0, field0)); +} - @override - bool operator ==(Object other) { - return identical(this, other) || - (other.runtimeType == runtimeType && other is _$Reaction_LikeImpl); - } - @override - int get hashCode => runtimeType.hashCode; - - @override - @optionalTypeArgs - TResult when({ - required TResult Function() heart, - required TResult Function() like, - required TResult Function() dislike, - required TResult Function() laugh, - required TResult Function() emphasize, - required TResult Function() question, - required TResult Function(String field0) emoji, - required TResult Function(ExtensionApp? spec, MessageParts body) sticker, - }) { - return like(); - } +@override +int get hashCode => Object.hash(runtimeType,const DeepCollectionEquality().hash(field0)); - @override - @optionalTypeArgs - TResult? whenOrNull({ - TResult? Function()? heart, - TResult? Function()? like, - TResult? Function()? dislike, - TResult? Function()? laugh, - TResult? Function()? emphasize, - TResult? Function()? question, - TResult? Function(String field0)? emoji, - TResult? Function(ExtensionApp? spec, MessageParts body)? sticker, - }) { - return like?.call(); - } +@override +String toString() { + return 'MessagePart(field0: $field0)'; +} + + +} - @override - @optionalTypeArgs - TResult maybeWhen({ - TResult Function()? heart, - TResult Function()? like, - TResult Function()? dislike, - TResult Function()? laugh, - TResult Function()? emphasize, - TResult Function()? question, - TResult Function(String field0)? emoji, - TResult Function(ExtensionApp? spec, MessageParts body)? sticker, - required TResult orElse(), - }) { - if (like != null) { - return like(); - } - return orElse(); - } +/// @nodoc +class $MessagePartCopyWith<$Res> { +$MessagePartCopyWith(MessagePart _, $Res Function(MessagePart) __); +} - @override - @optionalTypeArgs - TResult map({ - required TResult Function(Reaction_Heart value) heart, - required TResult Function(Reaction_Like value) like, - required TResult Function(Reaction_Dislike value) dislike, - required TResult Function(Reaction_Laugh value) laugh, - required TResult Function(Reaction_Emphasize value) emphasize, - required TResult Function(Reaction_Question value) question, - required TResult Function(Reaction_Emoji value) emoji, - required TResult Function(Reaction_Sticker value) sticker, - }) { - return like(this); - } - @override - @optionalTypeArgs - TResult? mapOrNull({ - TResult? Function(Reaction_Heart value)? heart, - TResult? Function(Reaction_Like value)? like, - TResult? Function(Reaction_Dislike value)? dislike, - TResult? Function(Reaction_Laugh value)? laugh, - TResult? Function(Reaction_Emphasize value)? emphasize, - TResult? Function(Reaction_Question value)? question, - TResult? Function(Reaction_Emoji value)? emoji, - TResult? Function(Reaction_Sticker value)? sticker, - }) { - return like?.call(this); - } +/// Adds pattern-matching-related methods to [MessagePart]. +extension MessagePartPatterns on MessagePart { +/// A variant of `map` that fallback to returning `orElse`. +/// +/// It is equivalent to doing: +/// ```dart +/// switch (sealedClass) { +/// case final Subclass value: +/// return ...; +/// case _: +/// return orElse(); +/// } +/// ``` + +@optionalTypeArgs TResult maybeMap({TResult Function( MessagePart_Text value)? text,TResult Function( MessagePart_Attachment value)? attachment,TResult Function( MessagePart_Mention value)? mention,TResult Function( MessagePart_Object value)? object,required TResult orElse(),}){ +final _that = this; +switch (_that) { +case MessagePart_Text() when text != null: +return text(_that);case MessagePart_Attachment() when attachment != null: +return attachment(_that);case MessagePart_Mention() when mention != null: +return mention(_that);case MessagePart_Object() when object != null: +return object(_that);case _: + return orElse(); + +} +} +/// A `switch`-like method, using callbacks. +/// +/// Callbacks receives the raw object, upcasted. +/// It is equivalent to doing: +/// ```dart +/// switch (sealedClass) { +/// case final Subclass value: +/// return ...; +/// case final Subclass2 value: +/// return ...; +/// } +/// ``` + +@optionalTypeArgs TResult map({required TResult Function( MessagePart_Text value) text,required TResult Function( MessagePart_Attachment value) attachment,required TResult Function( MessagePart_Mention value) mention,required TResult Function( MessagePart_Object value) object,}){ +final _that = this; +switch (_that) { +case MessagePart_Text(): +return text(_that);case MessagePart_Attachment(): +return attachment(_that);case MessagePart_Mention(): +return mention(_that);case MessagePart_Object(): +return object(_that);} +} +/// A variant of `map` that fallback to returning `null`. +/// +/// It is equivalent to doing: +/// ```dart +/// switch (sealedClass) { +/// case final Subclass value: +/// return ...; +/// case _: +/// return null; +/// } +/// ``` + +@optionalTypeArgs TResult? mapOrNull({TResult? Function( MessagePart_Text value)? text,TResult? Function( MessagePart_Attachment value)? attachment,TResult? Function( MessagePart_Mention value)? mention,TResult? Function( MessagePart_Object value)? object,}){ +final _that = this; +switch (_that) { +case MessagePart_Text() when text != null: +return text(_that);case MessagePart_Attachment() when attachment != null: +return attachment(_that);case MessagePart_Mention() when mention != null: +return mention(_that);case MessagePart_Object() when object != null: +return object(_that);case _: + return null; - @override - @optionalTypeArgs - TResult maybeMap({ - TResult Function(Reaction_Heart value)? heart, - TResult Function(Reaction_Like value)? like, - TResult Function(Reaction_Dislike value)? dislike, - TResult Function(Reaction_Laugh value)? laugh, - TResult Function(Reaction_Emphasize value)? emphasize, - TResult Function(Reaction_Question value)? question, - TResult Function(Reaction_Emoji value)? emoji, - TResult Function(Reaction_Sticker value)? sticker, - required TResult orElse(), - }) { - if (like != null) { - return like(this); - } - return orElse(); - } } +} +/// A variant of `when` that fallback to an `orElse` callback. +/// +/// It is equivalent to doing: +/// ```dart +/// switch (sealedClass) { +/// case Subclass(:final field): +/// return ...; +/// case _: +/// return orElse(); +/// } +/// ``` + +@optionalTypeArgs TResult maybeWhen({TResult Function( String field0, TextFormat field1)? text,TResult Function( Attachment field0)? attachment,TResult Function( String field0, String field1)? mention,TResult Function( String field0)? object,required TResult orElse(),}) {final _that = this; +switch (_that) { +case MessagePart_Text() when text != null: +return text(_that.field0,_that.field1);case MessagePart_Attachment() when attachment != null: +return attachment(_that.field0);case MessagePart_Mention() when mention != null: +return mention(_that.field0,_that.field1);case MessagePart_Object() when object != null: +return object(_that.field0);case _: + return orElse(); -abstract class Reaction_Like extends Reaction { - const factory Reaction_Like() = _$Reaction_LikeImpl; - const Reaction_Like._() : super._(); } +} +/// A `switch`-like method, using callbacks. +/// +/// As opposed to `map`, this offers destructuring. +/// It is equivalent to doing: +/// ```dart +/// switch (sealedClass) { +/// case Subclass(:final field): +/// return ...; +/// case Subclass2(:final field2): +/// return ...; +/// } +/// ``` -/// @nodoc -abstract class _$$Reaction_DislikeImplCopyWith<$Res> { - factory _$$Reaction_DislikeImplCopyWith(_$Reaction_DislikeImpl value, - $Res Function(_$Reaction_DislikeImpl) then) = - __$$Reaction_DislikeImplCopyWithImpl<$Res>; +@optionalTypeArgs TResult when({required TResult Function( String field0, TextFormat field1) text,required TResult Function( Attachment field0) attachment,required TResult Function( String field0, String field1) mention,required TResult Function( String field0) object,}) {final _that = this; +switch (_that) { +case MessagePart_Text(): +return text(_that.field0,_that.field1);case MessagePart_Attachment(): +return attachment(_that.field0);case MessagePart_Mention(): +return mention(_that.field0,_that.field1);case MessagePart_Object(): +return object(_that.field0);} } +/// A variant of `when` that fallback to returning `null` +/// +/// It is equivalent to doing: +/// ```dart +/// switch (sealedClass) { +/// case Subclass(:final field): +/// return ...; +/// case _: +/// return null; +/// } +/// ``` -/// @nodoc -class __$$Reaction_DislikeImplCopyWithImpl<$Res> - extends _$ReactionCopyWithImpl<$Res, _$Reaction_DislikeImpl> - implements _$$Reaction_DislikeImplCopyWith<$Res> { - __$$Reaction_DislikeImplCopyWithImpl(_$Reaction_DislikeImpl _value, - $Res Function(_$Reaction_DislikeImpl) _then) - : super(_value, _then); +@optionalTypeArgs TResult? whenOrNull({TResult? Function( String field0, TextFormat field1)? text,TResult? Function( Attachment field0)? attachment,TResult? Function( String field0, String field1)? mention,TResult? Function( String field0)? object,}) {final _that = this; +switch (_that) { +case MessagePart_Text() when text != null: +return text(_that.field0,_that.field1);case MessagePart_Attachment() when attachment != null: +return attachment(_that.field0);case MessagePart_Mention() when mention != null: +return mention(_that.field0,_that.field1);case MessagePart_Object() when object != null: +return object(_that.field0);case _: + return null; + +} +} - /// Create a copy of Reaction - /// with the given fields replaced by the non-null parameter values. } /// @nodoc -class _$Reaction_DislikeImpl extends Reaction_Dislike { - const _$Reaction_DislikeImpl() : super._(); - - @override - String toString() { - return 'Reaction.dislike()'; - } - @override - bool operator ==(Object other) { - return identical(this, other) || - (other.runtimeType == runtimeType && other is _$Reaction_DislikeImpl); - } +class MessagePart_Text extends MessagePart { + const MessagePart_Text(this.field0, this.field1): super._(); - @override - int get hashCode => runtimeType.hashCode; - - @override - @optionalTypeArgs - TResult when({ - required TResult Function() heart, - required TResult Function() like, - required TResult Function() dislike, - required TResult Function() laugh, - required TResult Function() emphasize, - required TResult Function() question, - required TResult Function(String field0) emoji, - required TResult Function(ExtensionApp? spec, MessageParts body) sticker, - }) { - return dislike(); - } - @override - @optionalTypeArgs - TResult? whenOrNull({ - TResult? Function()? heart, - TResult? Function()? like, - TResult? Function()? dislike, - TResult? Function()? laugh, - TResult? Function()? emphasize, - TResult? Function()? question, - TResult? Function(String field0)? emoji, - TResult? Function(ExtensionApp? spec, MessageParts body)? sticker, - }) { - return dislike?.call(); - } +@override final String field0; + final TextFormat field1; - @override - @optionalTypeArgs - TResult maybeWhen({ - TResult Function()? heart, - TResult Function()? like, - TResult Function()? dislike, - TResult Function()? laugh, - TResult Function()? emphasize, - TResult Function()? question, - TResult Function(String field0)? emoji, - TResult Function(ExtensionApp? spec, MessageParts body)? sticker, - required TResult orElse(), - }) { - if (dislike != null) { - return dislike(); - } - return orElse(); - } +/// Create a copy of MessagePart +/// with the given fields replaced by the non-null parameter values. +@JsonKey(includeFromJson: false, includeToJson: false) +@pragma('vm:prefer-inline') +$MessagePart_TextCopyWith get copyWith => _$MessagePart_TextCopyWithImpl(this, _$identity); - @override - @optionalTypeArgs - TResult map({ - required TResult Function(Reaction_Heart value) heart, - required TResult Function(Reaction_Like value) like, - required TResult Function(Reaction_Dislike value) dislike, - required TResult Function(Reaction_Laugh value) laugh, - required TResult Function(Reaction_Emphasize value) emphasize, - required TResult Function(Reaction_Question value) question, - required TResult Function(Reaction_Emoji value) emoji, - required TResult Function(Reaction_Sticker value) sticker, - }) { - return dislike(this); - } - @override - @optionalTypeArgs - TResult? mapOrNull({ - TResult? Function(Reaction_Heart value)? heart, - TResult? Function(Reaction_Like value)? like, - TResult? Function(Reaction_Dislike value)? dislike, - TResult? Function(Reaction_Laugh value)? laugh, - TResult? Function(Reaction_Emphasize value)? emphasize, - TResult? Function(Reaction_Question value)? question, - TResult? Function(Reaction_Emoji value)? emoji, - TResult? Function(Reaction_Sticker value)? sticker, - }) { - return dislike?.call(this); - } - @override - @optionalTypeArgs - TResult maybeMap({ - TResult Function(Reaction_Heart value)? heart, - TResult Function(Reaction_Like value)? like, - TResult Function(Reaction_Dislike value)? dislike, - TResult Function(Reaction_Laugh value)? laugh, - TResult Function(Reaction_Emphasize value)? emphasize, - TResult Function(Reaction_Question value)? question, - TResult Function(Reaction_Emoji value)? emoji, - TResult Function(Reaction_Sticker value)? sticker, - required TResult orElse(), - }) { - if (dislike != null) { - return dislike(this); - } - return orElse(); - } +@override +bool operator ==(Object other) { + return identical(this, other) || (other.runtimeType == runtimeType&&other is MessagePart_Text&&(identical(other.field0, field0) || other.field0 == field0)&&(identical(other.field1, field1) || other.field1 == field1)); } -abstract class Reaction_Dislike extends Reaction { - const factory Reaction_Dislike() = _$Reaction_DislikeImpl; - const Reaction_Dislike._() : super._(); + +@override +int get hashCode => Object.hash(runtimeType,field0,field1); + +@override +String toString() { + return 'MessagePart.text(field0: $field0, field1: $field1)'; } -/// @nodoc -abstract class _$$Reaction_LaughImplCopyWith<$Res> { - factory _$$Reaction_LaughImplCopyWith(_$Reaction_LaughImpl value, - $Res Function(_$Reaction_LaughImpl) then) = - __$$Reaction_LaughImplCopyWithImpl<$Res>; + } /// @nodoc -class __$$Reaction_LaughImplCopyWithImpl<$Res> - extends _$ReactionCopyWithImpl<$Res, _$Reaction_LaughImpl> - implements _$$Reaction_LaughImplCopyWith<$Res> { - __$$Reaction_LaughImplCopyWithImpl( - _$Reaction_LaughImpl _value, $Res Function(_$Reaction_LaughImpl) _then) - : super(_value, _then); +abstract mixin class $MessagePart_TextCopyWith<$Res> implements $MessagePartCopyWith<$Res> { + factory $MessagePart_TextCopyWith(MessagePart_Text value, $Res Function(MessagePart_Text) _then) = _$MessagePart_TextCopyWithImpl; +@useResult +$Res call({ + String field0, TextFormat field1 +}); - /// Create a copy of Reaction - /// with the given fields replaced by the non-null parameter values. -} +$TextFormatCopyWith<$Res> get field1; + +} /// @nodoc +class _$MessagePart_TextCopyWithImpl<$Res> + implements $MessagePart_TextCopyWith<$Res> { + _$MessagePart_TextCopyWithImpl(this._self, this._then); -class _$Reaction_LaughImpl extends Reaction_Laugh { - const _$Reaction_LaughImpl() : super._(); + final MessagePart_Text _self; + final $Res Function(MessagePart_Text) _then; - @override - String toString() { - return 'Reaction.laugh()'; - } +/// Create a copy of MessagePart +/// with the given fields replaced by the non-null parameter values. +@pragma('vm:prefer-inline') $Res call({Object? field0 = null,Object? field1 = null,}) { + return _then(MessagePart_Text( +null == field0 ? _self.field0 : field0 // ignore: cast_nullable_to_non_nullable +as String,null == field1 ? _self.field1 : field1 // ignore: cast_nullable_to_non_nullable +as TextFormat, + )); +} - @override - bool operator ==(Object other) { - return identical(this, other) || - (other.runtimeType == runtimeType && other is _$Reaction_LaughImpl); - } +/// Create a copy of MessagePart +/// with the given fields replaced by the non-null parameter values. +@override +@pragma('vm:prefer-inline') +$TextFormatCopyWith<$Res> get field1 { - @override - int get hashCode => runtimeType.hashCode; - - @override - @optionalTypeArgs - TResult when({ - required TResult Function() heart, - required TResult Function() like, - required TResult Function() dislike, - required TResult Function() laugh, - required TResult Function() emphasize, - required TResult Function() question, - required TResult Function(String field0) emoji, - required TResult Function(ExtensionApp? spec, MessageParts body) sticker, - }) { - return laugh(); - } + return $TextFormatCopyWith<$Res>(_self.field1, (value) { + return _then(_self.copyWith(field1: value)); + }); +} +} - @override - @optionalTypeArgs - TResult? whenOrNull({ - TResult? Function()? heart, - TResult? Function()? like, - TResult? Function()? dislike, - TResult? Function()? laugh, - TResult? Function()? emphasize, - TResult? Function()? question, - TResult? Function(String field0)? emoji, - TResult? Function(ExtensionApp? spec, MessageParts body)? sticker, - }) { - return laugh?.call(); - } +/// @nodoc - @override - @optionalTypeArgs - TResult maybeWhen({ - TResult Function()? heart, - TResult Function()? like, - TResult Function()? dislike, - TResult Function()? laugh, - TResult Function()? emphasize, - TResult Function()? question, - TResult Function(String field0)? emoji, - TResult Function(ExtensionApp? spec, MessageParts body)? sticker, - required TResult orElse(), - }) { - if (laugh != null) { - return laugh(); - } - return orElse(); - } - @override - @optionalTypeArgs - TResult map({ - required TResult Function(Reaction_Heart value) heart, - required TResult Function(Reaction_Like value) like, - required TResult Function(Reaction_Dislike value) dislike, - required TResult Function(Reaction_Laugh value) laugh, - required TResult Function(Reaction_Emphasize value) emphasize, - required TResult Function(Reaction_Question value) question, - required TResult Function(Reaction_Emoji value) emoji, - required TResult Function(Reaction_Sticker value) sticker, - }) { - return laugh(this); - } +class MessagePart_Attachment extends MessagePart { + const MessagePart_Attachment(this.field0): super._(); - @override - @optionalTypeArgs - TResult? mapOrNull({ - TResult? Function(Reaction_Heart value)? heart, - TResult? Function(Reaction_Like value)? like, - TResult? Function(Reaction_Dislike value)? dislike, - TResult? Function(Reaction_Laugh value)? laugh, - TResult? Function(Reaction_Emphasize value)? emphasize, - TResult? Function(Reaction_Question value)? question, - TResult? Function(Reaction_Emoji value)? emoji, - TResult? Function(Reaction_Sticker value)? sticker, - }) { - return laugh?.call(this); - } - @override - @optionalTypeArgs - TResult maybeMap({ - TResult Function(Reaction_Heart value)? heart, - TResult Function(Reaction_Like value)? like, - TResult Function(Reaction_Dislike value)? dislike, - TResult Function(Reaction_Laugh value)? laugh, - TResult Function(Reaction_Emphasize value)? emphasize, - TResult Function(Reaction_Question value)? question, - TResult Function(Reaction_Emoji value)? emoji, - TResult Function(Reaction_Sticker value)? sticker, - required TResult orElse(), - }) { - if (laugh != null) { - return laugh(this); - } - return orElse(); - } -} +@override final Attachment field0; -abstract class Reaction_Laugh extends Reaction { - const factory Reaction_Laugh() = _$Reaction_LaughImpl; - const Reaction_Laugh._() : super._(); -} +/// Create a copy of MessagePart +/// with the given fields replaced by the non-null parameter values. +@JsonKey(includeFromJson: false, includeToJson: false) +@pragma('vm:prefer-inline') +$MessagePart_AttachmentCopyWith get copyWith => _$MessagePart_AttachmentCopyWithImpl(this, _$identity); -/// @nodoc -abstract class _$$Reaction_EmphasizeImplCopyWith<$Res> { - factory _$$Reaction_EmphasizeImplCopyWith(_$Reaction_EmphasizeImpl value, - $Res Function(_$Reaction_EmphasizeImpl) then) = - __$$Reaction_EmphasizeImplCopyWithImpl<$Res>; -} -/// @nodoc -class __$$Reaction_EmphasizeImplCopyWithImpl<$Res> - extends _$ReactionCopyWithImpl<$Res, _$Reaction_EmphasizeImpl> - implements _$$Reaction_EmphasizeImplCopyWith<$Res> { - __$$Reaction_EmphasizeImplCopyWithImpl(_$Reaction_EmphasizeImpl _value, - $Res Function(_$Reaction_EmphasizeImpl) _then) - : super(_value, _then); - /// Create a copy of Reaction - /// with the given fields replaced by the non-null parameter values. +@override +bool operator ==(Object other) { + return identical(this, other) || (other.runtimeType == runtimeType&&other is MessagePart_Attachment&&(identical(other.field0, field0) || other.field0 == field0)); } -/// @nodoc -class _$Reaction_EmphasizeImpl extends Reaction_Emphasize { - const _$Reaction_EmphasizeImpl() : super._(); +@override +int get hashCode => Object.hash(runtimeType,field0); - @override - String toString() { - return 'Reaction.emphasize()'; - } +@override +String toString() { + return 'MessagePart.attachment(field0: $field0)'; +} - @override - bool operator ==(Object other) { - return identical(this, other) || - (other.runtimeType == runtimeType && other is _$Reaction_EmphasizeImpl); - } - @override - int get hashCode => runtimeType.hashCode; - - @override - @optionalTypeArgs - TResult when({ - required TResult Function() heart, - required TResult Function() like, - required TResult Function() dislike, - required TResult Function() laugh, - required TResult Function() emphasize, - required TResult Function() question, - required TResult Function(String field0) emoji, - required TResult Function(ExtensionApp? spec, MessageParts body) sticker, - }) { - return emphasize(); - } +} - @override - @optionalTypeArgs - TResult? whenOrNull({ - TResult? Function()? heart, - TResult? Function()? like, - TResult? Function()? dislike, - TResult? Function()? laugh, - TResult? Function()? emphasize, - TResult? Function()? question, - TResult? Function(String field0)? emoji, - TResult? Function(ExtensionApp? spec, MessageParts body)? sticker, - }) { - return emphasize?.call(); - } +/// @nodoc +abstract mixin class $MessagePart_AttachmentCopyWith<$Res> implements $MessagePartCopyWith<$Res> { + factory $MessagePart_AttachmentCopyWith(MessagePart_Attachment value, $Res Function(MessagePart_Attachment) _then) = _$MessagePart_AttachmentCopyWithImpl; +@useResult +$Res call({ + Attachment field0 +}); - @override - @optionalTypeArgs - TResult maybeWhen({ - TResult Function()? heart, - TResult Function()? like, - TResult Function()? dislike, - TResult Function()? laugh, - TResult Function()? emphasize, - TResult Function()? question, - TResult Function(String field0)? emoji, - TResult Function(ExtensionApp? spec, MessageParts body)? sticker, - required TResult orElse(), - }) { - if (emphasize != null) { - return emphasize(); - } - return orElse(); - } - @override - @optionalTypeArgs - TResult map({ - required TResult Function(Reaction_Heart value) heart, - required TResult Function(Reaction_Like value) like, - required TResult Function(Reaction_Dislike value) dislike, - required TResult Function(Reaction_Laugh value) laugh, - required TResult Function(Reaction_Emphasize value) emphasize, - required TResult Function(Reaction_Question value) question, - required TResult Function(Reaction_Emoji value) emoji, - required TResult Function(Reaction_Sticker value) sticker, - }) { - return emphasize(this); - } - @override - @optionalTypeArgs - TResult? mapOrNull({ - TResult? Function(Reaction_Heart value)? heart, - TResult? Function(Reaction_Like value)? like, - TResult? Function(Reaction_Dislike value)? dislike, - TResult? Function(Reaction_Laugh value)? laugh, - TResult? Function(Reaction_Emphasize value)? emphasize, - TResult? Function(Reaction_Question value)? question, - TResult? Function(Reaction_Emoji value)? emoji, - TResult? Function(Reaction_Sticker value)? sticker, - }) { - return emphasize?.call(this); - } - @override - @optionalTypeArgs - TResult maybeMap({ - TResult Function(Reaction_Heart value)? heart, - TResult Function(Reaction_Like value)? like, - TResult Function(Reaction_Dislike value)? dislike, - TResult Function(Reaction_Laugh value)? laugh, - TResult Function(Reaction_Emphasize value)? emphasize, - TResult Function(Reaction_Question value)? question, - TResult Function(Reaction_Emoji value)? emoji, - TResult Function(Reaction_Sticker value)? sticker, - required TResult orElse(), - }) { - if (emphasize != null) { - return emphasize(this); - } - return orElse(); - } } +/// @nodoc +class _$MessagePart_AttachmentCopyWithImpl<$Res> + implements $MessagePart_AttachmentCopyWith<$Res> { + _$MessagePart_AttachmentCopyWithImpl(this._self, this._then); -abstract class Reaction_Emphasize extends Reaction { - const factory Reaction_Emphasize() = _$Reaction_EmphasizeImpl; - const Reaction_Emphasize._() : super._(); -} + final MessagePart_Attachment _self; + final $Res Function(MessagePart_Attachment) _then; -/// @nodoc -abstract class _$$Reaction_QuestionImplCopyWith<$Res> { - factory _$$Reaction_QuestionImplCopyWith(_$Reaction_QuestionImpl value, - $Res Function(_$Reaction_QuestionImpl) then) = - __$$Reaction_QuestionImplCopyWithImpl<$Res>; +/// Create a copy of MessagePart +/// with the given fields replaced by the non-null parameter values. +@pragma('vm:prefer-inline') $Res call({Object? field0 = null,}) { + return _then(MessagePart_Attachment( +null == field0 ? _self.field0 : field0 // ignore: cast_nullable_to_non_nullable +as Attachment, + )); } -/// @nodoc -class __$$Reaction_QuestionImplCopyWithImpl<$Res> - extends _$ReactionCopyWithImpl<$Res, _$Reaction_QuestionImpl> - implements _$$Reaction_QuestionImplCopyWith<$Res> { - __$$Reaction_QuestionImplCopyWithImpl(_$Reaction_QuestionImpl _value, - $Res Function(_$Reaction_QuestionImpl) _then) - : super(_value, _then); - /// Create a copy of Reaction - /// with the given fields replaced by the non-null parameter values. } /// @nodoc -class _$Reaction_QuestionImpl extends Reaction_Question { - const _$Reaction_QuestionImpl() : super._(); - - @override - String toString() { - return 'Reaction.question()'; - } - @override - bool operator ==(Object other) { - return identical(this, other) || - (other.runtimeType == runtimeType && other is _$Reaction_QuestionImpl); - } +class MessagePart_Mention extends MessagePart { + const MessagePart_Mention(this.field0, this.field1): super._(); - @override - int get hashCode => runtimeType.hashCode; - - @override - @optionalTypeArgs - TResult when({ - required TResult Function() heart, - required TResult Function() like, - required TResult Function() dislike, - required TResult Function() laugh, - required TResult Function() emphasize, - required TResult Function() question, - required TResult Function(String field0) emoji, - required TResult Function(ExtensionApp? spec, MessageParts body) sticker, - }) { - return question(); - } - @override - @optionalTypeArgs - TResult? whenOrNull({ - TResult? Function()? heart, - TResult? Function()? like, - TResult? Function()? dislike, - TResult? Function()? laugh, - TResult? Function()? emphasize, - TResult? Function()? question, - TResult? Function(String field0)? emoji, - TResult? Function(ExtensionApp? spec, MessageParts body)? sticker, - }) { - return question?.call(); - } +@override final String field0; + final String field1; - @override - @optionalTypeArgs - TResult maybeWhen({ - TResult Function()? heart, - TResult Function()? like, - TResult Function()? dislike, - TResult Function()? laugh, - TResult Function()? emphasize, - TResult Function()? question, - TResult Function(String field0)? emoji, - TResult Function(ExtensionApp? spec, MessageParts body)? sticker, - required TResult orElse(), - }) { - if (question != null) { - return question(); - } - return orElse(); - } +/// Create a copy of MessagePart +/// with the given fields replaced by the non-null parameter values. +@JsonKey(includeFromJson: false, includeToJson: false) +@pragma('vm:prefer-inline') +$MessagePart_MentionCopyWith get copyWith => _$MessagePart_MentionCopyWithImpl(this, _$identity); - @override - @optionalTypeArgs - TResult map({ - required TResult Function(Reaction_Heart value) heart, - required TResult Function(Reaction_Like value) like, - required TResult Function(Reaction_Dislike value) dislike, - required TResult Function(Reaction_Laugh value) laugh, - required TResult Function(Reaction_Emphasize value) emphasize, - required TResult Function(Reaction_Question value) question, - required TResult Function(Reaction_Emoji value) emoji, - required TResult Function(Reaction_Sticker value) sticker, - }) { - return question(this); - } - @override - @optionalTypeArgs - TResult? mapOrNull({ - TResult? Function(Reaction_Heart value)? heart, - TResult? Function(Reaction_Like value)? like, - TResult? Function(Reaction_Dislike value)? dislike, - TResult? Function(Reaction_Laugh value)? laugh, - TResult? Function(Reaction_Emphasize value)? emphasize, - TResult? Function(Reaction_Question value)? question, - TResult? Function(Reaction_Emoji value)? emoji, - TResult? Function(Reaction_Sticker value)? sticker, - }) { - return question?.call(this); - } - @override - @optionalTypeArgs - TResult maybeMap({ - TResult Function(Reaction_Heart value)? heart, - TResult Function(Reaction_Like value)? like, - TResult Function(Reaction_Dislike value)? dislike, - TResult Function(Reaction_Laugh value)? laugh, - TResult Function(Reaction_Emphasize value)? emphasize, - TResult Function(Reaction_Question value)? question, - TResult Function(Reaction_Emoji value)? emoji, - TResult Function(Reaction_Sticker value)? sticker, - required TResult orElse(), - }) { - if (question != null) { - return question(this); - } - return orElse(); - } +@override +bool operator ==(Object other) { + return identical(this, other) || (other.runtimeType == runtimeType&&other is MessagePart_Mention&&(identical(other.field0, field0) || other.field0 == field0)&&(identical(other.field1, field1) || other.field1 == field1)); } -abstract class Reaction_Question extends Reaction { - const factory Reaction_Question() = _$Reaction_QuestionImpl; - const Reaction_Question._() : super._(); -} -/// @nodoc -abstract class _$$Reaction_EmojiImplCopyWith<$Res> { - factory _$$Reaction_EmojiImplCopyWith(_$Reaction_EmojiImpl value, - $Res Function(_$Reaction_EmojiImpl) then) = - __$$Reaction_EmojiImplCopyWithImpl<$Res>; - @useResult - $Res call({String field0}); +@override +int get hashCode => Object.hash(runtimeType,field0,field1); + +@override +String toString() { + return 'MessagePart.mention(field0: $field0, field1: $field1)'; } -/// @nodoc -class __$$Reaction_EmojiImplCopyWithImpl<$Res> - extends _$ReactionCopyWithImpl<$Res, _$Reaction_EmojiImpl> - implements _$$Reaction_EmojiImplCopyWith<$Res> { - __$$Reaction_EmojiImplCopyWithImpl( - _$Reaction_EmojiImpl _value, $Res Function(_$Reaction_EmojiImpl) _then) - : super(_value, _then); - /// Create a copy of Reaction - /// with the given fields replaced by the non-null parameter values. - @pragma('vm:prefer-inline') - @override - $Res call({ - Object? field0 = null, - }) { - return _then(_$Reaction_EmojiImpl( - null == field0 - ? _value.field0 - : field0 // ignore: cast_nullable_to_non_nullable - as String, - )); - } } /// @nodoc +abstract mixin class $MessagePart_MentionCopyWith<$Res> implements $MessagePartCopyWith<$Res> { + factory $MessagePart_MentionCopyWith(MessagePart_Mention value, $Res Function(MessagePart_Mention) _then) = _$MessagePart_MentionCopyWithImpl; +@useResult +$Res call({ + String field0, String field1 +}); -class _$Reaction_EmojiImpl extends Reaction_Emoji { - const _$Reaction_EmojiImpl(this.field0) : super._(); - - @override - final String field0; - - @override - String toString() { - return 'Reaction.emoji(field0: $field0)'; - } - - @override - bool operator ==(Object other) { - return identical(this, other) || - (other.runtimeType == runtimeType && - other is _$Reaction_EmojiImpl && - (identical(other.field0, field0) || other.field0 == field0)); - } - - @override - int get hashCode => Object.hash(runtimeType, field0); - - /// Create a copy of Reaction - /// with the given fields replaced by the non-null parameter values. - @JsonKey(includeFromJson: false, includeToJson: false) - @override - @pragma('vm:prefer-inline') - _$$Reaction_EmojiImplCopyWith<_$Reaction_EmojiImpl> get copyWith => - __$$Reaction_EmojiImplCopyWithImpl<_$Reaction_EmojiImpl>( - this, _$identity); - - @override - @optionalTypeArgs - TResult when({ - required TResult Function() heart, - required TResult Function() like, - required TResult Function() dislike, - required TResult Function() laugh, - required TResult Function() emphasize, - required TResult Function() question, - required TResult Function(String field0) emoji, - required TResult Function(ExtensionApp? spec, MessageParts body) sticker, - }) { - return emoji(field0); - } - @override - @optionalTypeArgs - TResult? whenOrNull({ - TResult? Function()? heart, - TResult? Function()? like, - TResult? Function()? dislike, - TResult? Function()? laugh, - TResult? Function()? emphasize, - TResult? Function()? question, - TResult? Function(String field0)? emoji, - TResult? Function(ExtensionApp? spec, MessageParts body)? sticker, - }) { - return emoji?.call(field0); - } - @override - @optionalTypeArgs - TResult maybeWhen({ - TResult Function()? heart, - TResult Function()? like, - TResult Function()? dislike, - TResult Function()? laugh, - TResult Function()? emphasize, - TResult Function()? question, - TResult Function(String field0)? emoji, - TResult Function(ExtensionApp? spec, MessageParts body)? sticker, - required TResult orElse(), - }) { - if (emoji != null) { - return emoji(field0); - } - return orElse(); - } - @override - @optionalTypeArgs - TResult map({ - required TResult Function(Reaction_Heart value) heart, - required TResult Function(Reaction_Like value) like, - required TResult Function(Reaction_Dislike value) dislike, - required TResult Function(Reaction_Laugh value) laugh, - required TResult Function(Reaction_Emphasize value) emphasize, - required TResult Function(Reaction_Question value) question, - required TResult Function(Reaction_Emoji value) emoji, - required TResult Function(Reaction_Sticker value) sticker, - }) { - return emoji(this); - } +} +/// @nodoc +class _$MessagePart_MentionCopyWithImpl<$Res> + implements $MessagePart_MentionCopyWith<$Res> { + _$MessagePart_MentionCopyWithImpl(this._self, this._then); - @override - @optionalTypeArgs - TResult? mapOrNull({ - TResult? Function(Reaction_Heart value)? heart, - TResult? Function(Reaction_Like value)? like, - TResult? Function(Reaction_Dislike value)? dislike, - TResult? Function(Reaction_Laugh value)? laugh, - TResult? Function(Reaction_Emphasize value)? emphasize, - TResult? Function(Reaction_Question value)? question, - TResult? Function(Reaction_Emoji value)? emoji, - TResult? Function(Reaction_Sticker value)? sticker, - }) { - return emoji?.call(this); - } + final MessagePart_Mention _self; + final $Res Function(MessagePart_Mention) _then; - @override - @optionalTypeArgs - TResult maybeMap({ - TResult Function(Reaction_Heart value)? heart, - TResult Function(Reaction_Like value)? like, - TResult Function(Reaction_Dislike value)? dislike, - TResult Function(Reaction_Laugh value)? laugh, - TResult Function(Reaction_Emphasize value)? emphasize, - TResult Function(Reaction_Question value)? question, - TResult Function(Reaction_Emoji value)? emoji, - TResult Function(Reaction_Sticker value)? sticker, - required TResult orElse(), - }) { - if (emoji != null) { - return emoji(this); - } - return orElse(); - } +/// Create a copy of MessagePart +/// with the given fields replaced by the non-null parameter values. +@pragma('vm:prefer-inline') $Res call({Object? field0 = null,Object? field1 = null,}) { + return _then(MessagePart_Mention( +null == field0 ? _self.field0 : field0 // ignore: cast_nullable_to_non_nullable +as String,null == field1 ? _self.field1 : field1 // ignore: cast_nullable_to_non_nullable +as String, + )); } -abstract class Reaction_Emoji extends Reaction { - const factory Reaction_Emoji(final String field0) = _$Reaction_EmojiImpl; - const Reaction_Emoji._() : super._(); - - String get field0; - - /// Create a copy of Reaction - /// with the given fields replaced by the non-null parameter values. - @JsonKey(includeFromJson: false, includeToJson: false) - _$$Reaction_EmojiImplCopyWith<_$Reaction_EmojiImpl> get copyWith => - throw _privateConstructorUsedError; -} - -/// @nodoc -abstract class _$$Reaction_StickerImplCopyWith<$Res> { - factory _$$Reaction_StickerImplCopyWith(_$Reaction_StickerImpl value, - $Res Function(_$Reaction_StickerImpl) then) = - __$$Reaction_StickerImplCopyWithImpl<$Res>; - @useResult - $Res call({ExtensionApp? spec, MessageParts body}); -} - -/// @nodoc -class __$$Reaction_StickerImplCopyWithImpl<$Res> - extends _$ReactionCopyWithImpl<$Res, _$Reaction_StickerImpl> - implements _$$Reaction_StickerImplCopyWith<$Res> { - __$$Reaction_StickerImplCopyWithImpl(_$Reaction_StickerImpl _value, - $Res Function(_$Reaction_StickerImpl) _then) - : super(_value, _then); - - /// Create a copy of Reaction - /// with the given fields replaced by the non-null parameter values. - @pragma('vm:prefer-inline') - @override - $Res call({ - Object? spec = freezed, - Object? body = null, - }) { - return _then(_$Reaction_StickerImpl( - spec: freezed == spec - ? _value.spec - : spec // ignore: cast_nullable_to_non_nullable - as ExtensionApp?, - body: null == body - ? _value.body - : body // ignore: cast_nullable_to_non_nullable - as MessageParts, - )); - } + } /// @nodoc -class _$Reaction_StickerImpl extends Reaction_Sticker { - const _$Reaction_StickerImpl({this.spec, required this.body}) : super._(); - - @override - final ExtensionApp? spec; - @override - final MessageParts body; - - @override - String toString() { - return 'Reaction.sticker(spec: $spec, body: $body)'; - } - @override - bool operator ==(Object other) { - return identical(this, other) || - (other.runtimeType == runtimeType && - other is _$Reaction_StickerImpl && - (identical(other.spec, spec) || other.spec == spec) && - (identical(other.body, body) || other.body == body)); - } +class MessagePart_Object extends MessagePart { + const MessagePart_Object(this.field0): super._(); - @override - int get hashCode => Object.hash(runtimeType, spec, body); - - /// Create a copy of Reaction - /// with the given fields replaced by the non-null parameter values. - @JsonKey(includeFromJson: false, includeToJson: false) - @override - @pragma('vm:prefer-inline') - _$$Reaction_StickerImplCopyWith<_$Reaction_StickerImpl> get copyWith => - __$$Reaction_StickerImplCopyWithImpl<_$Reaction_StickerImpl>( - this, _$identity); - - @override - @optionalTypeArgs - TResult when({ - required TResult Function() heart, - required TResult Function() like, - required TResult Function() dislike, - required TResult Function() laugh, - required TResult Function() emphasize, - required TResult Function() question, - required TResult Function(String field0) emoji, - required TResult Function(ExtensionApp? spec, MessageParts body) sticker, - }) { - return sticker(spec, body); - } - @override - @optionalTypeArgs - TResult? whenOrNull({ - TResult? Function()? heart, - TResult? Function()? like, - TResult? Function()? dislike, - TResult? Function()? laugh, - TResult? Function()? emphasize, - TResult? Function()? question, - TResult? Function(String field0)? emoji, - TResult? Function(ExtensionApp? spec, MessageParts body)? sticker, - }) { - return sticker?.call(spec, body); - } +@override final String field0; - @override - @optionalTypeArgs - TResult maybeWhen({ - TResult Function()? heart, - TResult Function()? like, - TResult Function()? dislike, - TResult Function()? laugh, - TResult Function()? emphasize, - TResult Function()? question, - TResult Function(String field0)? emoji, - TResult Function(ExtensionApp? spec, MessageParts body)? sticker, - required TResult orElse(), - }) { - if (sticker != null) { - return sticker(spec, body); - } - return orElse(); - } +/// Create a copy of MessagePart +/// with the given fields replaced by the non-null parameter values. +@JsonKey(includeFromJson: false, includeToJson: false) +@pragma('vm:prefer-inline') +$MessagePart_ObjectCopyWith get copyWith => _$MessagePart_ObjectCopyWithImpl(this, _$identity); - @override - @optionalTypeArgs - TResult map({ - required TResult Function(Reaction_Heart value) heart, - required TResult Function(Reaction_Like value) like, - required TResult Function(Reaction_Dislike value) dislike, - required TResult Function(Reaction_Laugh value) laugh, - required TResult Function(Reaction_Emphasize value) emphasize, - required TResult Function(Reaction_Question value) question, - required TResult Function(Reaction_Emoji value) emoji, - required TResult Function(Reaction_Sticker value) sticker, - }) { - return sticker(this); - } - @override - @optionalTypeArgs - TResult? mapOrNull({ - TResult? Function(Reaction_Heart value)? heart, - TResult? Function(Reaction_Like value)? like, - TResult? Function(Reaction_Dislike value)? dislike, - TResult? Function(Reaction_Laugh value)? laugh, - TResult? Function(Reaction_Emphasize value)? emphasize, - TResult? Function(Reaction_Question value)? question, - TResult? Function(Reaction_Emoji value)? emoji, - TResult? Function(Reaction_Sticker value)? sticker, - }) { - return sticker?.call(this); - } - @override - @optionalTypeArgs - TResult maybeMap({ - TResult Function(Reaction_Heart value)? heart, - TResult Function(Reaction_Like value)? like, - TResult Function(Reaction_Dislike value)? dislike, - TResult Function(Reaction_Laugh value)? laugh, - TResult Function(Reaction_Emphasize value)? emphasize, - TResult Function(Reaction_Question value)? question, - TResult Function(Reaction_Emoji value)? emoji, - TResult Function(Reaction_Sticker value)? sticker, - required TResult orElse(), - }) { - if (sticker != null) { - return sticker(this); - } - return orElse(); - } +@override +bool operator ==(Object other) { + return identical(this, other) || (other.runtimeType == runtimeType&&other is MessagePart_Object&&(identical(other.field0, field0) || other.field0 == field0)); } -abstract class Reaction_Sticker extends Reaction { - const factory Reaction_Sticker( - {final ExtensionApp? spec, - required final MessageParts body}) = _$Reaction_StickerImpl; - const Reaction_Sticker._() : super._(); - ExtensionApp? get spec; - MessageParts get body; +@override +int get hashCode => Object.hash(runtimeType,field0); - /// Create a copy of Reaction - /// with the given fields replaced by the non-null parameter values. - @JsonKey(includeFromJson: false, includeToJson: false) - _$$Reaction_StickerImplCopyWith<_$Reaction_StickerImpl> get copyWith => - throw _privateConstructorUsedError; +@override +String toString() { + return 'MessagePart.object(field0: $field0)'; } -/// @nodoc -mixin _$RegisterState { - @optionalTypeArgs - TResult when({ - required TResult Function(int nextS) registered, - required TResult Function() registering, - required TResult Function(BigInt? retryWait, String error) failed, - }) => - throw _privateConstructorUsedError; - @optionalTypeArgs - TResult? whenOrNull({ - TResult? Function(int nextS)? registered, - TResult? Function()? registering, - TResult? Function(BigInt? retryWait, String error)? failed, - }) => - throw _privateConstructorUsedError; - @optionalTypeArgs - TResult maybeWhen({ - TResult Function(int nextS)? registered, - TResult Function()? registering, - TResult Function(BigInt? retryWait, String error)? failed, - required TResult orElse(), - }) => - throw _privateConstructorUsedError; - @optionalTypeArgs - TResult map({ - required TResult Function(RegisterState_Registered value) registered, - required TResult Function(RegisterState_Registering value) registering, - required TResult Function(RegisterState_Failed value) failed, - }) => - throw _privateConstructorUsedError; - @optionalTypeArgs - TResult? mapOrNull({ - TResult? Function(RegisterState_Registered value)? registered, - TResult? Function(RegisterState_Registering value)? registering, - TResult? Function(RegisterState_Failed value)? failed, - }) => - throw _privateConstructorUsedError; - @optionalTypeArgs - TResult maybeMap({ - TResult Function(RegisterState_Registered value)? registered, - TResult Function(RegisterState_Registering value)? registering, - TResult Function(RegisterState_Failed value)? failed, - required TResult orElse(), - }) => - throw _privateConstructorUsedError; -} - -/// @nodoc -abstract class $RegisterStateCopyWith<$Res> { - factory $RegisterStateCopyWith( - RegisterState value, $Res Function(RegisterState) then) = - _$RegisterStateCopyWithImpl<$Res, RegisterState>; -} - -/// @nodoc -class _$RegisterStateCopyWithImpl<$Res, $Val extends RegisterState> - implements $RegisterStateCopyWith<$Res> { - _$RegisterStateCopyWithImpl(this._value, this._then); - - // ignore: unused_field - final $Val _value; - // ignore: unused_field - final $Res Function($Val) _then; - - /// Create a copy of RegisterState - /// with the given fields replaced by the non-null parameter values. -} - -/// @nodoc -abstract class _$$RegisterState_RegisteredImplCopyWith<$Res> { - factory _$$RegisterState_RegisteredImplCopyWith( - _$RegisterState_RegisteredImpl value, - $Res Function(_$RegisterState_RegisteredImpl) then) = - __$$RegisterState_RegisteredImplCopyWithImpl<$Res>; - @useResult - $Res call({int nextS}); -} - -/// @nodoc -class __$$RegisterState_RegisteredImplCopyWithImpl<$Res> - extends _$RegisterStateCopyWithImpl<$Res, _$RegisterState_RegisteredImpl> - implements _$$RegisterState_RegisteredImplCopyWith<$Res> { - __$$RegisterState_RegisteredImplCopyWithImpl( - _$RegisterState_RegisteredImpl _value, - $Res Function(_$RegisterState_RegisteredImpl) _then) - : super(_value, _then); - - /// Create a copy of RegisterState - /// with the given fields replaced by the non-null parameter values. - @pragma('vm:prefer-inline') - @override - $Res call({ - Object? nextS = null, - }) { - return _then(_$RegisterState_RegisteredImpl( - nextS: null == nextS - ? _value.nextS - : nextS // ignore: cast_nullable_to_non_nullable - as int, - )); - } + } /// @nodoc +abstract mixin class $MessagePart_ObjectCopyWith<$Res> implements $MessagePartCopyWith<$Res> { + factory $MessagePart_ObjectCopyWith(MessagePart_Object value, $Res Function(MessagePart_Object) _then) = _$MessagePart_ObjectCopyWithImpl; +@useResult +$Res call({ + String field0 +}); -class _$RegisterState_RegisteredImpl extends RegisterState_Registered { - const _$RegisterState_RegisteredImpl({required this.nextS}) : super._(); - @override - final int nextS; - @override - String toString() { - return 'RegisterState.registered(nextS: $nextS)'; - } - @override - bool operator ==(Object other) { - return identical(this, other) || - (other.runtimeType == runtimeType && - other is _$RegisterState_RegisteredImpl && - (identical(other.nextS, nextS) || other.nextS == nextS)); - } +} +/// @nodoc +class _$MessagePart_ObjectCopyWithImpl<$Res> + implements $MessagePart_ObjectCopyWith<$Res> { + _$MessagePart_ObjectCopyWithImpl(this._self, this._then); - @override - int get hashCode => Object.hash(runtimeType, nextS); - - /// Create a copy of RegisterState - /// with the given fields replaced by the non-null parameter values. - @JsonKey(includeFromJson: false, includeToJson: false) - @override - @pragma('vm:prefer-inline') - _$$RegisterState_RegisteredImplCopyWith<_$RegisterState_RegisteredImpl> - get copyWith => __$$RegisterState_RegisteredImplCopyWithImpl< - _$RegisterState_RegisteredImpl>(this, _$identity); - - @override - @optionalTypeArgs - TResult when({ - required TResult Function(int nextS) registered, - required TResult Function() registering, - required TResult Function(BigInt? retryWait, String error) failed, - }) { - return registered(nextS); - } + final MessagePart_Object _self; + final $Res Function(MessagePart_Object) _then; - @override - @optionalTypeArgs - TResult? whenOrNull({ - TResult? Function(int nextS)? registered, - TResult? Function()? registering, - TResult? Function(BigInt? retryWait, String error)? failed, - }) { - return registered?.call(nextS); - } +/// Create a copy of MessagePart +/// with the given fields replaced by the non-null parameter values. +@pragma('vm:prefer-inline') $Res call({Object? field0 = null,}) { + return _then(MessagePart_Object( +null == field0 ? _self.field0 : field0 // ignore: cast_nullable_to_non_nullable +as String, + )); +} - @override - @optionalTypeArgs - TResult maybeWhen({ - TResult Function(int nextS)? registered, - TResult Function()? registering, - TResult Function(BigInt? retryWait, String error)? failed, - required TResult orElse(), - }) { - if (registered != null) { - return registered(nextS); - } - return orElse(); - } - @override - @optionalTypeArgs - TResult map({ - required TResult Function(RegisterState_Registered value) registered, - required TResult Function(RegisterState_Registering value) registering, - required TResult Function(RegisterState_Failed value) failed, - }) { - return registered(this); - } +} - @override - @optionalTypeArgs - TResult? mapOrNull({ - TResult? Function(RegisterState_Registered value)? registered, - TResult? Function(RegisterState_Registering value)? registering, - TResult? Function(RegisterState_Failed value)? failed, - }) { - return registered?.call(this); - } +/// @nodoc +mixin _$MessageTarget { - @override - @optionalTypeArgs - TResult maybeMap({ - TResult Function(RegisterState_Registered value)? registered, - TResult Function(RegisterState_Registering value)? registering, - TResult Function(RegisterState_Failed value)? failed, - required TResult orElse(), - }) { - if (registered != null) { - return registered(this); - } - return orElse(); - } -} + Object get field0; -abstract class RegisterState_Registered extends RegisterState { - const factory RegisterState_Registered({required final int nextS}) = - _$RegisterState_RegisteredImpl; - const RegisterState_Registered._() : super._(); - int get nextS; - /// Create a copy of RegisterState - /// with the given fields replaced by the non-null parameter values. - @JsonKey(includeFromJson: false, includeToJson: false) - _$$RegisterState_RegisteredImplCopyWith<_$RegisterState_RegisteredImpl> - get copyWith => throw _privateConstructorUsedError; +@override +bool operator ==(Object other) { + return identical(this, other) || (other.runtimeType == runtimeType&&other is MessageTarget&&const DeepCollectionEquality().equals(other.field0, field0)); } -/// @nodoc -abstract class _$$RegisterState_RegisteringImplCopyWith<$Res> { - factory _$$RegisterState_RegisteringImplCopyWith( - _$RegisterState_RegisteringImpl value, - $Res Function(_$RegisterState_RegisteringImpl) then) = - __$$RegisterState_RegisteringImplCopyWithImpl<$Res>; + +@override +int get hashCode => Object.hash(runtimeType,const DeepCollectionEquality().hash(field0)); + +@override +String toString() { + return 'MessageTarget(field0: $field0)'; } -/// @nodoc -class __$$RegisterState_RegisteringImplCopyWithImpl<$Res> - extends _$RegisterStateCopyWithImpl<$Res, _$RegisterState_RegisteringImpl> - implements _$$RegisterState_RegisteringImplCopyWith<$Res> { - __$$RegisterState_RegisteringImplCopyWithImpl( - _$RegisterState_RegisteringImpl _value, - $Res Function(_$RegisterState_RegisteringImpl) _then) - : super(_value, _then); - /// Create a copy of RegisterState - /// with the given fields replaced by the non-null parameter values. } /// @nodoc +class $MessageTargetCopyWith<$Res> { +$MessageTargetCopyWith(MessageTarget _, $Res Function(MessageTarget) __); +} -class _$RegisterState_RegisteringImpl extends RegisterState_Registering { - const _$RegisterState_RegisteringImpl() : super._(); - @override - String toString() { - return 'RegisterState.registering()'; - } +/// Adds pattern-matching-related methods to [MessageTarget]. +extension MessageTargetPatterns on MessageTarget { +/// A variant of `map` that fallback to returning `orElse`. +/// +/// It is equivalent to doing: +/// ```dart +/// switch (sealedClass) { +/// case final Subclass value: +/// return ...; +/// case _: +/// return orElse(); +/// } +/// ``` + +@optionalTypeArgs TResult maybeMap({TResult Function( MessageTarget_Token value)? token,TResult Function( MessageTarget_Uuid value)? uuid,required TResult orElse(),}){ +final _that = this; +switch (_that) { +case MessageTarget_Token() when token != null: +return token(_that);case MessageTarget_Uuid() when uuid != null: +return uuid(_that);case _: + return orElse(); + +} +} +/// A `switch`-like method, using callbacks. +/// +/// Callbacks receives the raw object, upcasted. +/// It is equivalent to doing: +/// ```dart +/// switch (sealedClass) { +/// case final Subclass value: +/// return ...; +/// case final Subclass2 value: +/// return ...; +/// } +/// ``` - @override - bool operator ==(Object other) { - return identical(this, other) || - (other.runtimeType == runtimeType && - other is _$RegisterState_RegisteringImpl); - } +@optionalTypeArgs TResult map({required TResult Function( MessageTarget_Token value) token,required TResult Function( MessageTarget_Uuid value) uuid,}){ +final _that = this; +switch (_that) { +case MessageTarget_Token(): +return token(_that);case MessageTarget_Uuid(): +return uuid(_that);} +} +/// A variant of `map` that fallback to returning `null`. +/// +/// It is equivalent to doing: +/// ```dart +/// switch (sealedClass) { +/// case final Subclass value: +/// return ...; +/// case _: +/// return null; +/// } +/// ``` - @override - int get hashCode => runtimeType.hashCode; - - @override - @optionalTypeArgs - TResult when({ - required TResult Function(int nextS) registered, - required TResult Function() registering, - required TResult Function(BigInt? retryWait, String error) failed, - }) { - return registering(); - } +@optionalTypeArgs TResult? mapOrNull({TResult? Function( MessageTarget_Token value)? token,TResult? Function( MessageTarget_Uuid value)? uuid,}){ +final _that = this; +switch (_that) { +case MessageTarget_Token() when token != null: +return token(_that);case MessageTarget_Uuid() when uuid != null: +return uuid(_that);case _: + return null; - @override - @optionalTypeArgs - TResult? whenOrNull({ - TResult? Function(int nextS)? registered, - TResult? Function()? registering, - TResult? Function(BigInt? retryWait, String error)? failed, - }) { - return registering?.call(); - } +} +} +/// A variant of `when` that fallback to an `orElse` callback. +/// +/// It is equivalent to doing: +/// ```dart +/// switch (sealedClass) { +/// case Subclass(:final field): +/// return ...; +/// case _: +/// return orElse(); +/// } +/// ``` + +@optionalTypeArgs TResult maybeWhen({TResult Function( Uint8List field0)? token,TResult Function( String field0)? uuid,required TResult orElse(),}) {final _that = this; +switch (_that) { +case MessageTarget_Token() when token != null: +return token(_that.field0);case MessageTarget_Uuid() when uuid != null: +return uuid(_that.field0);case _: + return orElse(); + +} +} +/// A `switch`-like method, using callbacks. +/// +/// As opposed to `map`, this offers destructuring. +/// It is equivalent to doing: +/// ```dart +/// switch (sealedClass) { +/// case Subclass(:final field): +/// return ...; +/// case Subclass2(:final field2): +/// return ...; +/// } +/// ``` + +@optionalTypeArgs TResult when({required TResult Function( Uint8List field0) token,required TResult Function( String field0) uuid,}) {final _that = this; +switch (_that) { +case MessageTarget_Token(): +return token(_that.field0);case MessageTarget_Uuid(): +return uuid(_that.field0);} +} +/// A variant of `when` that fallback to returning `null` +/// +/// It is equivalent to doing: +/// ```dart +/// switch (sealedClass) { +/// case Subclass(:final field): +/// return ...; +/// case _: +/// return null; +/// } +/// ``` + +@optionalTypeArgs TResult? whenOrNull({TResult? Function( Uint8List field0)? token,TResult? Function( String field0)? uuid,}) {final _that = this; +switch (_that) { +case MessageTarget_Token() when token != null: +return token(_that.field0);case MessageTarget_Uuid() when uuid != null: +return uuid(_that.field0);case _: + return null; + +} +} + +} + +/// @nodoc + + +class MessageTarget_Token extends MessageTarget { + const MessageTarget_Token(this.field0): super._(); + + +@override final Uint8List field0; + +/// Create a copy of MessageTarget +/// with the given fields replaced by the non-null parameter values. +@JsonKey(includeFromJson: false, includeToJson: false) +@pragma('vm:prefer-inline') +$MessageTarget_TokenCopyWith get copyWith => _$MessageTarget_TokenCopyWithImpl(this, _$identity); + + + +@override +bool operator ==(Object other) { + return identical(this, other) || (other.runtimeType == runtimeType&&other is MessageTarget_Token&&const DeepCollectionEquality().equals(other.field0, field0)); +} + + +@override +int get hashCode => Object.hash(runtimeType,const DeepCollectionEquality().hash(field0)); + +@override +String toString() { + return 'MessageTarget.token(field0: $field0)'; +} + + +} + +/// @nodoc +abstract mixin class $MessageTarget_TokenCopyWith<$Res> implements $MessageTargetCopyWith<$Res> { + factory $MessageTarget_TokenCopyWith(MessageTarget_Token value, $Res Function(MessageTarget_Token) _then) = _$MessageTarget_TokenCopyWithImpl; +@useResult +$Res call({ + Uint8List field0 +}); + + + + +} +/// @nodoc +class _$MessageTarget_TokenCopyWithImpl<$Res> + implements $MessageTarget_TokenCopyWith<$Res> { + _$MessageTarget_TokenCopyWithImpl(this._self, this._then); + + final MessageTarget_Token _self; + final $Res Function(MessageTarget_Token) _then; + +/// Create a copy of MessageTarget +/// with the given fields replaced by the non-null parameter values. +@pragma('vm:prefer-inline') $Res call({Object? field0 = null,}) { + return _then(MessageTarget_Token( +null == field0 ? _self.field0 : field0 // ignore: cast_nullable_to_non_nullable +as Uint8List, + )); +} + + +} + +/// @nodoc + + +class MessageTarget_Uuid extends MessageTarget { + const MessageTarget_Uuid(this.field0): super._(); + + +@override final String field0; + +/// Create a copy of MessageTarget +/// with the given fields replaced by the non-null parameter values. +@JsonKey(includeFromJson: false, includeToJson: false) +@pragma('vm:prefer-inline') +$MessageTarget_UuidCopyWith get copyWith => _$MessageTarget_UuidCopyWithImpl(this, _$identity); + + + +@override +bool operator ==(Object other) { + return identical(this, other) || (other.runtimeType == runtimeType&&other is MessageTarget_Uuid&&(identical(other.field0, field0) || other.field0 == field0)); +} + + +@override +int get hashCode => Object.hash(runtimeType,field0); + +@override +String toString() { + return 'MessageTarget.uuid(field0: $field0)'; +} + + +} + +/// @nodoc +abstract mixin class $MessageTarget_UuidCopyWith<$Res> implements $MessageTargetCopyWith<$Res> { + factory $MessageTarget_UuidCopyWith(MessageTarget_Uuid value, $Res Function(MessageTarget_Uuid) _then) = _$MessageTarget_UuidCopyWithImpl; +@useResult +$Res call({ + String field0 +}); + + + + +} +/// @nodoc +class _$MessageTarget_UuidCopyWithImpl<$Res> + implements $MessageTarget_UuidCopyWith<$Res> { + _$MessageTarget_UuidCopyWithImpl(this._self, this._then); + + final MessageTarget_Uuid _self; + final $Res Function(MessageTarget_Uuid) _then; + +/// Create a copy of MessageTarget +/// with the given fields replaced by the non-null parameter values. +@pragma('vm:prefer-inline') $Res call({Object? field0 = null,}) { + return _then(MessageTarget_Uuid( +null == field0 ? _self.field0 : field0 // ignore: cast_nullable_to_non_nullable +as String, + )); +} + + +} + +/// @nodoc +mixin _$MessageType { + + + + + +@override +bool operator ==(Object other) { + return identical(this, other) || (other.runtimeType == runtimeType&&other is MessageType); +} + + +@override +int get hashCode => runtimeType.hashCode; + +@override +String toString() { + return 'MessageType()'; +} + + +} + +/// @nodoc +class $MessageTypeCopyWith<$Res> { +$MessageTypeCopyWith(MessageType _, $Res Function(MessageType) __); +} + + +/// Adds pattern-matching-related methods to [MessageType]. +extension MessageTypePatterns on MessageType { +/// A variant of `map` that fallback to returning `orElse`. +/// +/// It is equivalent to doing: +/// ```dart +/// switch (sealedClass) { +/// case final Subclass value: +/// return ...; +/// case _: +/// return orElse(); +/// } +/// ``` + +@optionalTypeArgs TResult maybeMap({TResult Function( MessageType_IMessage value)? iMessage,TResult Function( MessageType_SMS value)? sms,required TResult orElse(),}){ +final _that = this; +switch (_that) { +case MessageType_IMessage() when iMessage != null: +return iMessage(_that);case MessageType_SMS() when sms != null: +return sms(_that);case _: + return orElse(); + +} +} +/// A `switch`-like method, using callbacks. +/// +/// Callbacks receives the raw object, upcasted. +/// It is equivalent to doing: +/// ```dart +/// switch (sealedClass) { +/// case final Subclass value: +/// return ...; +/// case final Subclass2 value: +/// return ...; +/// } +/// ``` + +@optionalTypeArgs TResult map({required TResult Function( MessageType_IMessage value) iMessage,required TResult Function( MessageType_SMS value) sms,}){ +final _that = this; +switch (_that) { +case MessageType_IMessage(): +return iMessage(_that);case MessageType_SMS(): +return sms(_that);} +} +/// A variant of `map` that fallback to returning `null`. +/// +/// It is equivalent to doing: +/// ```dart +/// switch (sealedClass) { +/// case final Subclass value: +/// return ...; +/// case _: +/// return null; +/// } +/// ``` + +@optionalTypeArgs TResult? mapOrNull({TResult? Function( MessageType_IMessage value)? iMessage,TResult? Function( MessageType_SMS value)? sms,}){ +final _that = this; +switch (_that) { +case MessageType_IMessage() when iMessage != null: +return iMessage(_that);case MessageType_SMS() when sms != null: +return sms(_that);case _: + return null; + +} +} +/// A variant of `when` that fallback to an `orElse` callback. +/// +/// It is equivalent to doing: +/// ```dart +/// switch (sealedClass) { +/// case Subclass(:final field): +/// return ...; +/// case _: +/// return orElse(); +/// } +/// ``` + +@optionalTypeArgs TResult maybeWhen({TResult Function()? iMessage,TResult Function( bool isPhone, String usingNumber, String? fromHandle)? sms,required TResult orElse(),}) {final _that = this; +switch (_that) { +case MessageType_IMessage() when iMessage != null: +return iMessage();case MessageType_SMS() when sms != null: +return sms(_that.isPhone,_that.usingNumber,_that.fromHandle);case _: + return orElse(); + +} +} +/// A `switch`-like method, using callbacks. +/// +/// As opposed to `map`, this offers destructuring. +/// It is equivalent to doing: +/// ```dart +/// switch (sealedClass) { +/// case Subclass(:final field): +/// return ...; +/// case Subclass2(:final field2): +/// return ...; +/// } +/// ``` + +@optionalTypeArgs TResult when({required TResult Function() iMessage,required TResult Function( bool isPhone, String usingNumber, String? fromHandle) sms,}) {final _that = this; +switch (_that) { +case MessageType_IMessage(): +return iMessage();case MessageType_SMS(): +return sms(_that.isPhone,_that.usingNumber,_that.fromHandle);} +} +/// A variant of `when` that fallback to returning `null` +/// +/// It is equivalent to doing: +/// ```dart +/// switch (sealedClass) { +/// case Subclass(:final field): +/// return ...; +/// case _: +/// return null; +/// } +/// ``` + +@optionalTypeArgs TResult? whenOrNull({TResult? Function()? iMessage,TResult? Function( bool isPhone, String usingNumber, String? fromHandle)? sms,}) {final _that = this; +switch (_that) { +case MessageType_IMessage() when iMessage != null: +return iMessage();case MessageType_SMS() when sms != null: +return sms(_that.isPhone,_that.usingNumber,_that.fromHandle);case _: + return null; + +} +} + +} + +/// @nodoc + + +class MessageType_IMessage extends MessageType { + const MessageType_IMessage(): super._(); + + + + + + + +@override +bool operator ==(Object other) { + return identical(this, other) || (other.runtimeType == runtimeType&&other is MessageType_IMessage); +} + + +@override +int get hashCode => runtimeType.hashCode; + +@override +String toString() { + return 'MessageType.iMessage()'; +} + + +} + + + + +/// @nodoc + + +class MessageType_SMS extends MessageType { + const MessageType_SMS({required this.isPhone, required this.usingNumber, this.fromHandle}): super._(); + + + final bool isPhone; + final String usingNumber; + final String? fromHandle; + +/// Create a copy of MessageType +/// with the given fields replaced by the non-null parameter values. +@JsonKey(includeFromJson: false, includeToJson: false) +@pragma('vm:prefer-inline') +$MessageType_SMSCopyWith get copyWith => _$MessageType_SMSCopyWithImpl(this, _$identity); + + + +@override +bool operator ==(Object other) { + return identical(this, other) || (other.runtimeType == runtimeType&&other is MessageType_SMS&&(identical(other.isPhone, isPhone) || other.isPhone == isPhone)&&(identical(other.usingNumber, usingNumber) || other.usingNumber == usingNumber)&&(identical(other.fromHandle, fromHandle) || other.fromHandle == fromHandle)); +} + + +@override +int get hashCode => Object.hash(runtimeType,isPhone,usingNumber,fromHandle); + +@override +String toString() { + return 'MessageType.sms(isPhone: $isPhone, usingNumber: $usingNumber, fromHandle: $fromHandle)'; +} + + +} + +/// @nodoc +abstract mixin class $MessageType_SMSCopyWith<$Res> implements $MessageTypeCopyWith<$Res> { + factory $MessageType_SMSCopyWith(MessageType_SMS value, $Res Function(MessageType_SMS) _then) = _$MessageType_SMSCopyWithImpl; +@useResult +$Res call({ + bool isPhone, String usingNumber, String? fromHandle +}); + + + + +} +/// @nodoc +class _$MessageType_SMSCopyWithImpl<$Res> + implements $MessageType_SMSCopyWith<$Res> { + _$MessageType_SMSCopyWithImpl(this._self, this._then); + + final MessageType_SMS _self; + final $Res Function(MessageType_SMS) _then; + +/// Create a copy of MessageType +/// with the given fields replaced by the non-null parameter values. +@pragma('vm:prefer-inline') $Res call({Object? isPhone = null,Object? usingNumber = null,Object? fromHandle = freezed,}) { + return _then(MessageType_SMS( +isPhone: null == isPhone ? _self.isPhone : isPhone // ignore: cast_nullable_to_non_nullable +as bool,usingNumber: null == usingNumber ? _self.usingNumber : usingNumber // ignore: cast_nullable_to_non_nullable +as String,fromHandle: freezed == fromHandle ? _self.fromHandle : fromHandle // ignore: cast_nullable_to_non_nullable +as String?, + )); +} + + +} + +/// @nodoc +mixin _$NumOrString { + + Object get field0; + + + +@override +bool operator ==(Object other) { + return identical(this, other) || (other.runtimeType == runtimeType&&other is NumOrString&&const DeepCollectionEquality().equals(other.field0, field0)); +} + + +@override +int get hashCode => Object.hash(runtimeType,const DeepCollectionEquality().hash(field0)); + +@override +String toString() { + return 'NumOrString(field0: $field0)'; +} + + +} + +/// @nodoc +class $NumOrStringCopyWith<$Res> { +$NumOrStringCopyWith(NumOrString _, $Res Function(NumOrString) __); +} + + +/// Adds pattern-matching-related methods to [NumOrString]. +extension NumOrStringPatterns on NumOrString { +/// A variant of `map` that fallback to returning `orElse`. +/// +/// It is equivalent to doing: +/// ```dart +/// switch (sealedClass) { +/// case final Subclass value: +/// return ...; +/// case _: +/// return orElse(); +/// } +/// ``` + +@optionalTypeArgs TResult maybeMap({TResult Function( NumOrString_Num value)? num,TResult Function( NumOrString_String value)? string,TResult Function( NumOrString_Bool value)? bool,required TResult orElse(),}){ +final _that = this; +switch (_that) { +case NumOrString_Num() when num != null: +return num(_that);case NumOrString_String() when string != null: +return string(_that);case NumOrString_Bool() when bool != null: +return bool(_that);case _: + return orElse(); + +} +} +/// A `switch`-like method, using callbacks. +/// +/// Callbacks receives the raw object, upcasted. +/// It is equivalent to doing: +/// ```dart +/// switch (sealedClass) { +/// case final Subclass value: +/// return ...; +/// case final Subclass2 value: +/// return ...; +/// } +/// ``` + +@optionalTypeArgs TResult map({required TResult Function( NumOrString_Num value) num,required TResult Function( NumOrString_String value) string,required TResult Function( NumOrString_Bool value) bool,}){ +final _that = this; +switch (_that) { +case NumOrString_Num(): +return num(_that);case NumOrString_String(): +return string(_that);case NumOrString_Bool(): +return bool(_that);} +} +/// A variant of `map` that fallback to returning `null`. +/// +/// It is equivalent to doing: +/// ```dart +/// switch (sealedClass) { +/// case final Subclass value: +/// return ...; +/// case _: +/// return null; +/// } +/// ``` + +@optionalTypeArgs TResult? mapOrNull({TResult? Function( NumOrString_Num value)? num,TResult? Function( NumOrString_String value)? string,TResult? Function( NumOrString_Bool value)? bool,}){ +final _that = this; +switch (_that) { +case NumOrString_Num() when num != null: +return num(_that);case NumOrString_String() when string != null: +return string(_that);case NumOrString_Bool() when bool != null: +return bool(_that);case _: + return null; + +} +} +/// A variant of `when` that fallback to an `orElse` callback. +/// +/// It is equivalent to doing: +/// ```dart +/// switch (sealedClass) { +/// case Subclass(:final field): +/// return ...; +/// case _: +/// return orElse(); +/// } +/// ``` + +@optionalTypeArgs TResult maybeWhen({TResult Function( int field0)? num,TResult Function( String field0)? string,TResult Function( bool field0)? bool,required TResult orElse(),}) {final _that = this; +switch (_that) { +case NumOrString_Num() when num != null: +return num(_that.field0);case NumOrString_String() when string != null: +return string(_that.field0);case NumOrString_Bool() when bool != null: +return bool(_that.field0);case _: + return orElse(); + +} +} +/// A `switch`-like method, using callbacks. +/// +/// As opposed to `map`, this offers destructuring. +/// It is equivalent to doing: +/// ```dart +/// switch (sealedClass) { +/// case Subclass(:final field): +/// return ...; +/// case Subclass2(:final field2): +/// return ...; +/// } +/// ``` + +@optionalTypeArgs TResult when({required TResult Function( int field0) num,required TResult Function( String field0) string,required TResult Function( bool field0) bool,}) {final _that = this; +switch (_that) { +case NumOrString_Num(): +return num(_that.field0);case NumOrString_String(): +return string(_that.field0);case NumOrString_Bool(): +return bool(_that.field0);} +} +/// A variant of `when` that fallback to returning `null` +/// +/// It is equivalent to doing: +/// ```dart +/// switch (sealedClass) { +/// case Subclass(:final field): +/// return ...; +/// case _: +/// return null; +/// } +/// ``` + +@optionalTypeArgs TResult? whenOrNull({TResult? Function( int field0)? num,TResult? Function( String field0)? string,TResult? Function( bool field0)? bool,}) {final _that = this; +switch (_that) { +case NumOrString_Num() when num != null: +return num(_that.field0);case NumOrString_String() when string != null: +return string(_that.field0);case NumOrString_Bool() when bool != null: +return bool(_that.field0);case _: + return null; + +} +} + +} + +/// @nodoc + + +class NumOrString_Num extends NumOrString { + const NumOrString_Num(this.field0): super._(); + + +@override final int field0; + +/// Create a copy of NumOrString +/// with the given fields replaced by the non-null parameter values. +@JsonKey(includeFromJson: false, includeToJson: false) +@pragma('vm:prefer-inline') +$NumOrString_NumCopyWith get copyWith => _$NumOrString_NumCopyWithImpl(this, _$identity); + + + +@override +bool operator ==(Object other) { + return identical(this, other) || (other.runtimeType == runtimeType&&other is NumOrString_Num&&(identical(other.field0, field0) || other.field0 == field0)); +} + + +@override +int get hashCode => Object.hash(runtimeType,field0); + +@override +String toString() { + return 'NumOrString.num(field0: $field0)'; +} + + +} + +/// @nodoc +abstract mixin class $NumOrString_NumCopyWith<$Res> implements $NumOrStringCopyWith<$Res> { + factory $NumOrString_NumCopyWith(NumOrString_Num value, $Res Function(NumOrString_Num) _then) = _$NumOrString_NumCopyWithImpl; +@useResult +$Res call({ + int field0 +}); + + + + +} +/// @nodoc +class _$NumOrString_NumCopyWithImpl<$Res> + implements $NumOrString_NumCopyWith<$Res> { + _$NumOrString_NumCopyWithImpl(this._self, this._then); + + final NumOrString_Num _self; + final $Res Function(NumOrString_Num) _then; + +/// Create a copy of NumOrString +/// with the given fields replaced by the non-null parameter values. +@pragma('vm:prefer-inline') $Res call({Object? field0 = null,}) { + return _then(NumOrString_Num( +null == field0 ? _self.field0 : field0 // ignore: cast_nullable_to_non_nullable +as int, + )); +} + + +} + +/// @nodoc + + +class NumOrString_String extends NumOrString { + const NumOrString_String(this.field0): super._(); + + +@override final String field0; + +/// Create a copy of NumOrString +/// with the given fields replaced by the non-null parameter values. +@JsonKey(includeFromJson: false, includeToJson: false) +@pragma('vm:prefer-inline') +$NumOrString_StringCopyWith get copyWith => _$NumOrString_StringCopyWithImpl(this, _$identity); + + + +@override +bool operator ==(Object other) { + return identical(this, other) || (other.runtimeType == runtimeType&&other is NumOrString_String&&(identical(other.field0, field0) || other.field0 == field0)); +} + + +@override +int get hashCode => Object.hash(runtimeType,field0); + +@override +String toString() { + return 'NumOrString.string(field0: $field0)'; +} + + +} + +/// @nodoc +abstract mixin class $NumOrString_StringCopyWith<$Res> implements $NumOrStringCopyWith<$Res> { + factory $NumOrString_StringCopyWith(NumOrString_String value, $Res Function(NumOrString_String) _then) = _$NumOrString_StringCopyWithImpl; +@useResult +$Res call({ + String field0 +}); + + + + +} +/// @nodoc +class _$NumOrString_StringCopyWithImpl<$Res> + implements $NumOrString_StringCopyWith<$Res> { + _$NumOrString_StringCopyWithImpl(this._self, this._then); + + final NumOrString_String _self; + final $Res Function(NumOrString_String) _then; + +/// Create a copy of NumOrString +/// with the given fields replaced by the non-null parameter values. +@pragma('vm:prefer-inline') $Res call({Object? field0 = null,}) { + return _then(NumOrString_String( +null == field0 ? _self.field0 : field0 // ignore: cast_nullable_to_non_nullable +as String, + )); +} + + +} + +/// @nodoc + + +class NumOrString_Bool extends NumOrString { + const NumOrString_Bool(this.field0): super._(); + + +@override final bool field0; + +/// Create a copy of NumOrString +/// with the given fields replaced by the non-null parameter values. +@JsonKey(includeFromJson: false, includeToJson: false) +@pragma('vm:prefer-inline') +$NumOrString_BoolCopyWith get copyWith => _$NumOrString_BoolCopyWithImpl(this, _$identity); + + + +@override +bool operator ==(Object other) { + return identical(this, other) || (other.runtimeType == runtimeType&&other is NumOrString_Bool&&(identical(other.field0, field0) || other.field0 == field0)); +} + + +@override +int get hashCode => Object.hash(runtimeType,field0); + +@override +String toString() { + return 'NumOrString.bool(field0: $field0)'; +} + + +} + +/// @nodoc +abstract mixin class $NumOrString_BoolCopyWith<$Res> implements $NumOrStringCopyWith<$Res> { + factory $NumOrString_BoolCopyWith(NumOrString_Bool value, $Res Function(NumOrString_Bool) _then) = _$NumOrString_BoolCopyWithImpl; +@useResult +$Res call({ + bool field0 +}); + + + + +} +/// @nodoc +class _$NumOrString_BoolCopyWithImpl<$Res> + implements $NumOrString_BoolCopyWith<$Res> { + _$NumOrString_BoolCopyWithImpl(this._self, this._then); + + final NumOrString_Bool _self; + final $Res Function(NumOrString_Bool) _then; + +/// Create a copy of NumOrString +/// with the given fields replaced by the non-null parameter values. +@pragma('vm:prefer-inline') $Res call({Object? field0 = null,}) { + return _then(NumOrString_Bool( +null == field0 ? _self.field0 : field0 // ignore: cast_nullable_to_non_nullable +as bool, + )); +} + + +} + +/// @nodoc +mixin _$PartExtension { + + double get msgWidth; double get rotation; BigInt get sai; double get scale; bool? get update; BigInt get sli; double get normalizedX; double get normalizedY; BigInt get version; String get hash; BigInt get safi; PlatformInt64 get effectType; String get stickerId; +/// Create a copy of PartExtension +/// with the given fields replaced by the non-null parameter values. +@JsonKey(includeFromJson: false, includeToJson: false) +@pragma('vm:prefer-inline') +$PartExtensionCopyWith get copyWith => _$PartExtensionCopyWithImpl(this as PartExtension, _$identity); + + + +@override +bool operator ==(Object other) { + return identical(this, other) || (other.runtimeType == runtimeType&&other is PartExtension&&(identical(other.msgWidth, msgWidth) || other.msgWidth == msgWidth)&&(identical(other.rotation, rotation) || other.rotation == rotation)&&(identical(other.sai, sai) || other.sai == sai)&&(identical(other.scale, scale) || other.scale == scale)&&(identical(other.update, update) || other.update == update)&&(identical(other.sli, sli) || other.sli == sli)&&(identical(other.normalizedX, normalizedX) || other.normalizedX == normalizedX)&&(identical(other.normalizedY, normalizedY) || other.normalizedY == normalizedY)&&(identical(other.version, version) || other.version == version)&&(identical(other.hash, hash) || other.hash == hash)&&(identical(other.safi, safi) || other.safi == safi)&&(identical(other.effectType, effectType) || other.effectType == effectType)&&(identical(other.stickerId, stickerId) || other.stickerId == stickerId)); +} + + +@override +int get hashCode => Object.hash(runtimeType,msgWidth,rotation,sai,scale,update,sli,normalizedX,normalizedY,version,hash,safi,effectType,stickerId); + +@override +String toString() { + return 'PartExtension(msgWidth: $msgWidth, rotation: $rotation, sai: $sai, scale: $scale, update: $update, sli: $sli, normalizedX: $normalizedX, normalizedY: $normalizedY, version: $version, hash: $hash, safi: $safi, effectType: $effectType, stickerId: $stickerId)'; +} + + +} + +/// @nodoc +abstract mixin class $PartExtensionCopyWith<$Res> { + factory $PartExtensionCopyWith(PartExtension value, $Res Function(PartExtension) _then) = _$PartExtensionCopyWithImpl; +@useResult +$Res call({ + double msgWidth, double rotation, BigInt sai, double scale, bool? update, BigInt sli, double normalizedX, double normalizedY, BigInt version, String hash, BigInt safi, PlatformInt64 effectType, String stickerId +}); + + + + +} +/// @nodoc +class _$PartExtensionCopyWithImpl<$Res> + implements $PartExtensionCopyWith<$Res> { + _$PartExtensionCopyWithImpl(this._self, this._then); + + final PartExtension _self; + final $Res Function(PartExtension) _then; + +/// Create a copy of PartExtension +/// with the given fields replaced by the non-null parameter values. +@pragma('vm:prefer-inline') @override $Res call({Object? msgWidth = null,Object? rotation = null,Object? sai = null,Object? scale = null,Object? update = freezed,Object? sli = null,Object? normalizedX = null,Object? normalizedY = null,Object? version = null,Object? hash = null,Object? safi = null,Object? effectType = null,Object? stickerId = null,}) { + return _then(_self.copyWith( +msgWidth: null == msgWidth ? _self.msgWidth : msgWidth // ignore: cast_nullable_to_non_nullable +as double,rotation: null == rotation ? _self.rotation : rotation // ignore: cast_nullable_to_non_nullable +as double,sai: null == sai ? _self.sai : sai // ignore: cast_nullable_to_non_nullable +as BigInt,scale: null == scale ? _self.scale : scale // ignore: cast_nullable_to_non_nullable +as double,update: freezed == update ? _self.update : update // ignore: cast_nullable_to_non_nullable +as bool?,sli: null == sli ? _self.sli : sli // ignore: cast_nullable_to_non_nullable +as BigInt,normalizedX: null == normalizedX ? _self.normalizedX : normalizedX // ignore: cast_nullable_to_non_nullable +as double,normalizedY: null == normalizedY ? _self.normalizedY : normalizedY // ignore: cast_nullable_to_non_nullable +as double,version: null == version ? _self.version : version // ignore: cast_nullable_to_non_nullable +as BigInt,hash: null == hash ? _self.hash : hash // ignore: cast_nullable_to_non_nullable +as String,safi: null == safi ? _self.safi : safi // ignore: cast_nullable_to_non_nullable +as BigInt,effectType: null == effectType ? _self.effectType : effectType // ignore: cast_nullable_to_non_nullable +as PlatformInt64,stickerId: null == stickerId ? _self.stickerId : stickerId // ignore: cast_nullable_to_non_nullable +as String, + )); +} + +} + + +/// Adds pattern-matching-related methods to [PartExtension]. +extension PartExtensionPatterns on PartExtension { +/// A variant of `map` that fallback to returning `orElse`. +/// +/// It is equivalent to doing: +/// ```dart +/// switch (sealedClass) { +/// case final Subclass value: +/// return ...; +/// case _: +/// return orElse(); +/// } +/// ``` + +@optionalTypeArgs TResult maybeMap({TResult Function( PartExtension_Sticker value)? sticker,required TResult orElse(),}){ +final _that = this; +switch (_that) { +case PartExtension_Sticker() when sticker != null: +return sticker(_that);case _: + return orElse(); + +} +} +/// A `switch`-like method, using callbacks. +/// +/// Callbacks receives the raw object, upcasted. +/// It is equivalent to doing: +/// ```dart +/// switch (sealedClass) { +/// case final Subclass value: +/// return ...; +/// case final Subclass2 value: +/// return ...; +/// } +/// ``` + +@optionalTypeArgs TResult map({required TResult Function( PartExtension_Sticker value) sticker,}){ +final _that = this; +switch (_that) { +case PartExtension_Sticker(): +return sticker(_that);} +} +/// A variant of `map` that fallback to returning `null`. +/// +/// It is equivalent to doing: +/// ```dart +/// switch (sealedClass) { +/// case final Subclass value: +/// return ...; +/// case _: +/// return null; +/// } +/// ``` + +@optionalTypeArgs TResult? mapOrNull({TResult? Function( PartExtension_Sticker value)? sticker,}){ +final _that = this; +switch (_that) { +case PartExtension_Sticker() when sticker != null: +return sticker(_that);case _: + return null; + +} +} +/// A variant of `when` that fallback to an `orElse` callback. +/// +/// It is equivalent to doing: +/// ```dart +/// switch (sealedClass) { +/// case Subclass(:final field): +/// return ...; +/// case _: +/// return orElse(); +/// } +/// ``` + +@optionalTypeArgs TResult maybeWhen({TResult Function( double msgWidth, double rotation, BigInt sai, double scale, bool? update, BigInt sli, double normalizedX, double normalizedY, BigInt version, String hash, BigInt safi, PlatformInt64 effectType, String stickerId)? sticker,required TResult orElse(),}) {final _that = this; +switch (_that) { +case PartExtension_Sticker() when sticker != null: +return sticker(_that.msgWidth,_that.rotation,_that.sai,_that.scale,_that.update,_that.sli,_that.normalizedX,_that.normalizedY,_that.version,_that.hash,_that.safi,_that.effectType,_that.stickerId);case _: + return orElse(); + +} +} +/// A `switch`-like method, using callbacks. +/// +/// As opposed to `map`, this offers destructuring. +/// It is equivalent to doing: +/// ```dart +/// switch (sealedClass) { +/// case Subclass(:final field): +/// return ...; +/// case Subclass2(:final field2): +/// return ...; +/// } +/// ``` + +@optionalTypeArgs TResult when({required TResult Function( double msgWidth, double rotation, BigInt sai, double scale, bool? update, BigInt sli, double normalizedX, double normalizedY, BigInt version, String hash, BigInt safi, PlatformInt64 effectType, String stickerId) sticker,}) {final _that = this; +switch (_that) { +case PartExtension_Sticker(): +return sticker(_that.msgWidth,_that.rotation,_that.sai,_that.scale,_that.update,_that.sli,_that.normalizedX,_that.normalizedY,_that.version,_that.hash,_that.safi,_that.effectType,_that.stickerId);} +} +/// A variant of `when` that fallback to returning `null` +/// +/// It is equivalent to doing: +/// ```dart +/// switch (sealedClass) { +/// case Subclass(:final field): +/// return ...; +/// case _: +/// return null; +/// } +/// ``` + +@optionalTypeArgs TResult? whenOrNull({TResult? Function( double msgWidth, double rotation, BigInt sai, double scale, bool? update, BigInt sli, double normalizedX, double normalizedY, BigInt version, String hash, BigInt safi, PlatformInt64 effectType, String stickerId)? sticker,}) {final _that = this; +switch (_that) { +case PartExtension_Sticker() when sticker != null: +return sticker(_that.msgWidth,_that.rotation,_that.sai,_that.scale,_that.update,_that.sli,_that.normalizedX,_that.normalizedY,_that.version,_that.hash,_that.safi,_that.effectType,_that.stickerId);case _: + return null; + +} +} + +} + +/// @nodoc + + +class PartExtension_Sticker extends PartExtension { + const PartExtension_Sticker({required this.msgWidth, required this.rotation, required this.sai, required this.scale, this.update, required this.sli, required this.normalizedX, required this.normalizedY, required this.version, required this.hash, required this.safi, required this.effectType, required this.stickerId}): super._(); + + +@override final double msgWidth; +@override final double rotation; +@override final BigInt sai; +@override final double scale; +@override final bool? update; +@override final BigInt sli; +@override final double normalizedX; +@override final double normalizedY; +@override final BigInt version; +@override final String hash; +@override final BigInt safi; +@override final PlatformInt64 effectType; +@override final String stickerId; + +/// Create a copy of PartExtension +/// with the given fields replaced by the non-null parameter values. +@override @JsonKey(includeFromJson: false, includeToJson: false) +@pragma('vm:prefer-inline') +$PartExtension_StickerCopyWith get copyWith => _$PartExtension_StickerCopyWithImpl(this, _$identity); + + + +@override +bool operator ==(Object other) { + return identical(this, other) || (other.runtimeType == runtimeType&&other is PartExtension_Sticker&&(identical(other.msgWidth, msgWidth) || other.msgWidth == msgWidth)&&(identical(other.rotation, rotation) || other.rotation == rotation)&&(identical(other.sai, sai) || other.sai == sai)&&(identical(other.scale, scale) || other.scale == scale)&&(identical(other.update, update) || other.update == update)&&(identical(other.sli, sli) || other.sli == sli)&&(identical(other.normalizedX, normalizedX) || other.normalizedX == normalizedX)&&(identical(other.normalizedY, normalizedY) || other.normalizedY == normalizedY)&&(identical(other.version, version) || other.version == version)&&(identical(other.hash, hash) || other.hash == hash)&&(identical(other.safi, safi) || other.safi == safi)&&(identical(other.effectType, effectType) || other.effectType == effectType)&&(identical(other.stickerId, stickerId) || other.stickerId == stickerId)); +} + + +@override +int get hashCode => Object.hash(runtimeType,msgWidth,rotation,sai,scale,update,sli,normalizedX,normalizedY,version,hash,safi,effectType,stickerId); + +@override +String toString() { + return 'PartExtension.sticker(msgWidth: $msgWidth, rotation: $rotation, sai: $sai, scale: $scale, update: $update, sli: $sli, normalizedX: $normalizedX, normalizedY: $normalizedY, version: $version, hash: $hash, safi: $safi, effectType: $effectType, stickerId: $stickerId)'; +} + + +} + +/// @nodoc +abstract mixin class $PartExtension_StickerCopyWith<$Res> implements $PartExtensionCopyWith<$Res> { + factory $PartExtension_StickerCopyWith(PartExtension_Sticker value, $Res Function(PartExtension_Sticker) _then) = _$PartExtension_StickerCopyWithImpl; +@override @useResult +$Res call({ + double msgWidth, double rotation, BigInt sai, double scale, bool? update, BigInt sli, double normalizedX, double normalizedY, BigInt version, String hash, BigInt safi, PlatformInt64 effectType, String stickerId +}); + + + + +} +/// @nodoc +class _$PartExtension_StickerCopyWithImpl<$Res> + implements $PartExtension_StickerCopyWith<$Res> { + _$PartExtension_StickerCopyWithImpl(this._self, this._then); + + final PartExtension_Sticker _self; + final $Res Function(PartExtension_Sticker) _then; + +/// Create a copy of PartExtension +/// with the given fields replaced by the non-null parameter values. +@override @pragma('vm:prefer-inline') $Res call({Object? msgWidth = null,Object? rotation = null,Object? sai = null,Object? scale = null,Object? update = freezed,Object? sli = null,Object? normalizedX = null,Object? normalizedY = null,Object? version = null,Object? hash = null,Object? safi = null,Object? effectType = null,Object? stickerId = null,}) { + return _then(PartExtension_Sticker( +msgWidth: null == msgWidth ? _self.msgWidth : msgWidth // ignore: cast_nullable_to_non_nullable +as double,rotation: null == rotation ? _self.rotation : rotation // ignore: cast_nullable_to_non_nullable +as double,sai: null == sai ? _self.sai : sai // ignore: cast_nullable_to_non_nullable +as BigInt,scale: null == scale ? _self.scale : scale // ignore: cast_nullable_to_non_nullable +as double,update: freezed == update ? _self.update : update // ignore: cast_nullable_to_non_nullable +as bool?,sli: null == sli ? _self.sli : sli // ignore: cast_nullable_to_non_nullable +as BigInt,normalizedX: null == normalizedX ? _self.normalizedX : normalizedX // ignore: cast_nullable_to_non_nullable +as double,normalizedY: null == normalizedY ? _self.normalizedY : normalizedY // ignore: cast_nullable_to_non_nullable +as double,version: null == version ? _self.version : version // ignore: cast_nullable_to_non_nullable +as BigInt,hash: null == hash ? _self.hash : hash // ignore: cast_nullable_to_non_nullable +as String,safi: null == safi ? _self.safi : safi // ignore: cast_nullable_to_non_nullable +as BigInt,effectType: null == effectType ? _self.effectType : effectType // ignore: cast_nullable_to_non_nullable +as PlatformInt64,stickerId: null == stickerId ? _self.stickerId : stickerId // ignore: cast_nullable_to_non_nullable +as String, + )); +} + + +} + +/// @nodoc +mixin _$PollResult { + + + + + +@override +bool operator ==(Object other) { + return identical(this, other) || (other.runtimeType == runtimeType&&other is PollResult); +} + + +@override +int get hashCode => runtimeType.hashCode; + +@override +String toString() { + return 'PollResult()'; +} + + +} + +/// @nodoc +class $PollResultCopyWith<$Res> { +$PollResultCopyWith(PollResult _, $Res Function(PollResult) __); +} + + +/// Adds pattern-matching-related methods to [PollResult]. +extension PollResultPatterns on PollResult { +/// A variant of `map` that fallback to returning `orElse`. +/// +/// It is equivalent to doing: +/// ```dart +/// switch (sealedClass) { +/// case final Subclass value: +/// return ...; +/// case _: +/// return orElse(); +/// } +/// ``` + +@optionalTypeArgs TResult maybeMap({TResult Function( PollResult_Stop value)? stop,TResult Function( PollResult_Cont value)? cont,required TResult orElse(),}){ +final _that = this; +switch (_that) { +case PollResult_Stop() when stop != null: +return stop(_that);case PollResult_Cont() when cont != null: +return cont(_that);case _: + return orElse(); + +} +} +/// A `switch`-like method, using callbacks. +/// +/// Callbacks receives the raw object, upcasted. +/// It is equivalent to doing: +/// ```dart +/// switch (sealedClass) { +/// case final Subclass value: +/// return ...; +/// case final Subclass2 value: +/// return ...; +/// } +/// ``` + +@optionalTypeArgs TResult map({required TResult Function( PollResult_Stop value) stop,required TResult Function( PollResult_Cont value) cont,}){ +final _that = this; +switch (_that) { +case PollResult_Stop(): +return stop(_that);case PollResult_Cont(): +return cont(_that);} +} +/// A variant of `map` that fallback to returning `null`. +/// +/// It is equivalent to doing: +/// ```dart +/// switch (sealedClass) { +/// case final Subclass value: +/// return ...; +/// case _: +/// return null; +/// } +/// ``` + +@optionalTypeArgs TResult? mapOrNull({TResult? Function( PollResult_Stop value)? stop,TResult? Function( PollResult_Cont value)? cont,}){ +final _that = this; +switch (_that) { +case PollResult_Stop() when stop != null: +return stop(_that);case PollResult_Cont() when cont != null: +return cont(_that);case _: + return null; + +} +} +/// A variant of `when` that fallback to an `orElse` callback. +/// +/// It is equivalent to doing: +/// ```dart +/// switch (sealedClass) { +/// case Subclass(:final field): +/// return ...; +/// case _: +/// return orElse(); +/// } +/// ``` + +@optionalTypeArgs TResult maybeWhen({TResult Function()? stop,TResult Function( PushMessage? field0)? cont,required TResult orElse(),}) {final _that = this; +switch (_that) { +case PollResult_Stop() when stop != null: +return stop();case PollResult_Cont() when cont != null: +return cont(_that.field0);case _: + return orElse(); + +} +} +/// A `switch`-like method, using callbacks. +/// +/// As opposed to `map`, this offers destructuring. +/// It is equivalent to doing: +/// ```dart +/// switch (sealedClass) { +/// case Subclass(:final field): +/// return ...; +/// case Subclass2(:final field2): +/// return ...; +/// } +/// ``` + +@optionalTypeArgs TResult when({required TResult Function() stop,required TResult Function( PushMessage? field0) cont,}) {final _that = this; +switch (_that) { +case PollResult_Stop(): +return stop();case PollResult_Cont(): +return cont(_that.field0);} +} +/// A variant of `when` that fallback to returning `null` +/// +/// It is equivalent to doing: +/// ```dart +/// switch (sealedClass) { +/// case Subclass(:final field): +/// return ...; +/// case _: +/// return null; +/// } +/// ``` + +@optionalTypeArgs TResult? whenOrNull({TResult? Function()? stop,TResult? Function( PushMessage? field0)? cont,}) {final _that = this; +switch (_that) { +case PollResult_Stop() when stop != null: +return stop();case PollResult_Cont() when cont != null: +return cont(_that.field0);case _: + return null; + +} +} + +} + +/// @nodoc + + +class PollResult_Stop extends PollResult { + const PollResult_Stop(): super._(); + + + + + + + +@override +bool operator ==(Object other) { + return identical(this, other) || (other.runtimeType == runtimeType&&other is PollResult_Stop); +} + + +@override +int get hashCode => runtimeType.hashCode; + +@override +String toString() { + return 'PollResult.stop()'; +} + + +} + + + + +/// @nodoc + + +class PollResult_Cont extends PollResult { + const PollResult_Cont([this.field0]): super._(); + + + final PushMessage? field0; + +/// Create a copy of PollResult +/// with the given fields replaced by the non-null parameter values. +@JsonKey(includeFromJson: false, includeToJson: false) +@pragma('vm:prefer-inline') +$PollResult_ContCopyWith get copyWith => _$PollResult_ContCopyWithImpl(this, _$identity); + + + +@override +bool operator ==(Object other) { + return identical(this, other) || (other.runtimeType == runtimeType&&other is PollResult_Cont&&(identical(other.field0, field0) || other.field0 == field0)); +} + + +@override +int get hashCode => Object.hash(runtimeType,field0); + +@override +String toString() { + return 'PollResult.cont(field0: $field0)'; +} + + +} + +/// @nodoc +abstract mixin class $PollResult_ContCopyWith<$Res> implements $PollResultCopyWith<$Res> { + factory $PollResult_ContCopyWith(PollResult_Cont value, $Res Function(PollResult_Cont) _then) = _$PollResult_ContCopyWithImpl; +@useResult +$Res call({ + PushMessage? field0 +}); + + +$PushMessageCopyWith<$Res>? get field0; + +} +/// @nodoc +class _$PollResult_ContCopyWithImpl<$Res> + implements $PollResult_ContCopyWith<$Res> { + _$PollResult_ContCopyWithImpl(this._self, this._then); + + final PollResult_Cont _self; + final $Res Function(PollResult_Cont) _then; + +/// Create a copy of PollResult +/// with the given fields replaced by the non-null parameter values. +@pragma('vm:prefer-inline') $Res call({Object? field0 = freezed,}) { + return _then(PollResult_Cont( +freezed == field0 ? _self.field0 : field0 // ignore: cast_nullable_to_non_nullable +as PushMessage?, + )); +} + +/// Create a copy of PollResult +/// with the given fields replaced by the non-null parameter values. +@override +@pragma('vm:prefer-inline') +$PushMessageCopyWith<$Res>? get field0 { + if (_self.field0 == null) { + return null; + } + + return $PushMessageCopyWith<$Res>(_self.field0!, (value) { + return _then(_self.copyWith(field0: value)); + }); +} +} + +/// @nodoc +mixin _$PosterType { + + + + + +@override +bool operator ==(Object other) { + return identical(this, other) || (other.runtimeType == runtimeType&&other is PosterType); +} + + +@override +int get hashCode => runtimeType.hashCode; + +@override +String toString() { + return 'PosterType()'; +} + + +} + +/// @nodoc +class $PosterTypeCopyWith<$Res> { +$PosterTypeCopyWith(PosterType _, $Res Function(PosterType) __); +} + + +/// Adds pattern-matching-related methods to [PosterType]. +extension PosterTypePatterns on PosterType { +/// A variant of `map` that fallback to returning `orElse`. +/// +/// It is equivalent to doing: +/// ```dart +/// switch (sealedClass) { +/// case final Subclass value: +/// return ...; +/// case _: +/// return orElse(); +/// } +/// ``` + +@optionalTypeArgs TResult maybeMap({TResult Function( PosterType_Photo value)? photo,TResult Function( PosterType_Monogram value)? monogram,TResult Function( PosterType_Memoji value)? memoji,TResult Function( PosterType_TranscriptDynamic value)? transcriptDynamic,TResult Function( PosterType_TranscriptGradient value)? transcriptGradient,required TResult orElse(),}){ +final _that = this; +switch (_that) { +case PosterType_Photo() when photo != null: +return photo(_that);case PosterType_Monogram() when monogram != null: +return monogram(_that);case PosterType_Memoji() when memoji != null: +return memoji(_that);case PosterType_TranscriptDynamic() when transcriptDynamic != null: +return transcriptDynamic(_that);case PosterType_TranscriptGradient() when transcriptGradient != null: +return transcriptGradient(_that);case _: + return orElse(); + +} +} +/// A `switch`-like method, using callbacks. +/// +/// Callbacks receives the raw object, upcasted. +/// It is equivalent to doing: +/// ```dart +/// switch (sealedClass) { +/// case final Subclass value: +/// return ...; +/// case final Subclass2 value: +/// return ...; +/// } +/// ``` + +@optionalTypeArgs TResult map({required TResult Function( PosterType_Photo value) photo,required TResult Function( PosterType_Monogram value) monogram,required TResult Function( PosterType_Memoji value) memoji,required TResult Function( PosterType_TranscriptDynamic value) transcriptDynamic,required TResult Function( PosterType_TranscriptGradient value) transcriptGradient,}){ +final _that = this; +switch (_that) { +case PosterType_Photo(): +return photo(_that);case PosterType_Monogram(): +return monogram(_that);case PosterType_Memoji(): +return memoji(_that);case PosterType_TranscriptDynamic(): +return transcriptDynamic(_that);case PosterType_TranscriptGradient(): +return transcriptGradient(_that);} +} +/// A variant of `map` that fallback to returning `null`. +/// +/// It is equivalent to doing: +/// ```dart +/// switch (sealedClass) { +/// case final Subclass value: +/// return ...; +/// case _: +/// return null; +/// } +/// ``` + +@optionalTypeArgs TResult? mapOrNull({TResult? Function( PosterType_Photo value)? photo,TResult? Function( PosterType_Monogram value)? monogram,TResult? Function( PosterType_Memoji value)? memoji,TResult? Function( PosterType_TranscriptDynamic value)? transcriptDynamic,TResult? Function( PosterType_TranscriptGradient value)? transcriptGradient,}){ +final _that = this; +switch (_that) { +case PosterType_Photo() when photo != null: +return photo(_that);case PosterType_Monogram() when monogram != null: +return monogram(_that);case PosterType_Memoji() when memoji != null: +return memoji(_that);case PosterType_TranscriptDynamic() when transcriptDynamic != null: +return transcriptDynamic(_that);case PosterType_TranscriptGradient() when transcriptGradient != null: +return transcriptGradient(_that);case _: + return null; + +} +} +/// A variant of `when` that fallback to an `orElse` callback. +/// +/// It is equivalent to doing: +/// ```dart +/// switch (sealedClass) { +/// case Subclass(:final field): +/// return ...; +/// case _: +/// return orElse(); +/// } +/// ``` + +@optionalTypeArgs TResult maybeWhen({TResult Function( List assets)? photo,TResult Function( MonogramData data, PosterColor background)? monogram,TResult Function( MemojiData data, PosterColor background)? memoji,TResult Function( TranscriptDynamicUserData data)? transcriptDynamic,TResult Function( List colors)? transcriptGradient,required TResult orElse(),}) {final _that = this; +switch (_that) { +case PosterType_Photo() when photo != null: +return photo(_that.assets);case PosterType_Monogram() when monogram != null: +return monogram(_that.data,_that.background);case PosterType_Memoji() when memoji != null: +return memoji(_that.data,_that.background);case PosterType_TranscriptDynamic() when transcriptDynamic != null: +return transcriptDynamic(_that.data);case PosterType_TranscriptGradient() when transcriptGradient != null: +return transcriptGradient(_that.colors);case _: + return orElse(); + +} +} +/// A `switch`-like method, using callbacks. +/// +/// As opposed to `map`, this offers destructuring. +/// It is equivalent to doing: +/// ```dart +/// switch (sealedClass) { +/// case Subclass(:final field): +/// return ...; +/// case Subclass2(:final field2): +/// return ...; +/// } +/// ``` + +@optionalTypeArgs TResult when({required TResult Function( List assets) photo,required TResult Function( MonogramData data, PosterColor background) monogram,required TResult Function( MemojiData data, PosterColor background) memoji,required TResult Function( TranscriptDynamicUserData data) transcriptDynamic,required TResult Function( List colors) transcriptGradient,}) {final _that = this; +switch (_that) { +case PosterType_Photo(): +return photo(_that.assets);case PosterType_Monogram(): +return monogram(_that.data,_that.background);case PosterType_Memoji(): +return memoji(_that.data,_that.background);case PosterType_TranscriptDynamic(): +return transcriptDynamic(_that.data);case PosterType_TranscriptGradient(): +return transcriptGradient(_that.colors);} +} +/// A variant of `when` that fallback to returning `null` +/// +/// It is equivalent to doing: +/// ```dart +/// switch (sealedClass) { +/// case Subclass(:final field): +/// return ...; +/// case _: +/// return null; +/// } +/// ``` + +@optionalTypeArgs TResult? whenOrNull({TResult? Function( List assets)? photo,TResult? Function( MonogramData data, PosterColor background)? monogram,TResult? Function( MemojiData data, PosterColor background)? memoji,TResult? Function( TranscriptDynamicUserData data)? transcriptDynamic,TResult? Function( List colors)? transcriptGradient,}) {final _that = this; +switch (_that) { +case PosterType_Photo() when photo != null: +return photo(_that.assets);case PosterType_Monogram() when monogram != null: +return monogram(_that.data,_that.background);case PosterType_Memoji() when memoji != null: +return memoji(_that.data,_that.background);case PosterType_TranscriptDynamic() when transcriptDynamic != null: +return transcriptDynamic(_that.data);case PosterType_TranscriptGradient() when transcriptGradient != null: +return transcriptGradient(_that.colors);case _: + return null; + +} +} + +} + +/// @nodoc + + +class PosterType_Photo extends PosterType { + const PosterType_Photo({required final List assets}): _assets = assets,super._(); + + + final List _assets; + List get assets { + if (_assets is EqualUnmodifiableListView) return _assets; + // ignore: implicit_dynamic_type + return EqualUnmodifiableListView(_assets); +} + + +/// Create a copy of PosterType +/// with the given fields replaced by the non-null parameter values. +@JsonKey(includeFromJson: false, includeToJson: false) +@pragma('vm:prefer-inline') +$PosterType_PhotoCopyWith get copyWith => _$PosterType_PhotoCopyWithImpl(this, _$identity); + + + +@override +bool operator ==(Object other) { + return identical(this, other) || (other.runtimeType == runtimeType&&other is PosterType_Photo&&const DeepCollectionEquality().equals(other._assets, _assets)); +} + + +@override +int get hashCode => Object.hash(runtimeType,const DeepCollectionEquality().hash(_assets)); + +@override +String toString() { + return 'PosterType.photo(assets: $assets)'; +} + + +} + +/// @nodoc +abstract mixin class $PosterType_PhotoCopyWith<$Res> implements $PosterTypeCopyWith<$Res> { + factory $PosterType_PhotoCopyWith(PosterType_Photo value, $Res Function(PosterType_Photo) _then) = _$PosterType_PhotoCopyWithImpl; +@useResult +$Res call({ + List assets +}); + + + + +} +/// @nodoc +class _$PosterType_PhotoCopyWithImpl<$Res> + implements $PosterType_PhotoCopyWith<$Res> { + _$PosterType_PhotoCopyWithImpl(this._self, this._then); + + final PosterType_Photo _self; + final $Res Function(PosterType_Photo) _then; + +/// Create a copy of PosterType +/// with the given fields replaced by the non-null parameter values. +@pragma('vm:prefer-inline') $Res call({Object? assets = null,}) { + return _then(PosterType_Photo( +assets: null == assets ? _self._assets : assets // ignore: cast_nullable_to_non_nullable +as List, + )); +} + + +} + +/// @nodoc + + +class PosterType_Monogram extends PosterType { + const PosterType_Monogram({required this.data, required this.background}): super._(); + + + final MonogramData data; + final PosterColor background; + +/// Create a copy of PosterType +/// with the given fields replaced by the non-null parameter values. +@JsonKey(includeFromJson: false, includeToJson: false) +@pragma('vm:prefer-inline') +$PosterType_MonogramCopyWith get copyWith => _$PosterType_MonogramCopyWithImpl(this, _$identity); + + + +@override +bool operator ==(Object other) { + return identical(this, other) || (other.runtimeType == runtimeType&&other is PosterType_Monogram&&(identical(other.data, data) || other.data == data)&&(identical(other.background, background) || other.background == background)); +} + + +@override +int get hashCode => Object.hash(runtimeType,data,background); + +@override +String toString() { + return 'PosterType.monogram(data: $data, background: $background)'; +} + + +} + +/// @nodoc +abstract mixin class $PosterType_MonogramCopyWith<$Res> implements $PosterTypeCopyWith<$Res> { + factory $PosterType_MonogramCopyWith(PosterType_Monogram value, $Res Function(PosterType_Monogram) _then) = _$PosterType_MonogramCopyWithImpl; +@useResult +$Res call({ + MonogramData data, PosterColor background +}); + + + + +} +/// @nodoc +class _$PosterType_MonogramCopyWithImpl<$Res> + implements $PosterType_MonogramCopyWith<$Res> { + _$PosterType_MonogramCopyWithImpl(this._self, this._then); + + final PosterType_Monogram _self; + final $Res Function(PosterType_Monogram) _then; + +/// Create a copy of PosterType +/// with the given fields replaced by the non-null parameter values. +@pragma('vm:prefer-inline') $Res call({Object? data = null,Object? background = null,}) { + return _then(PosterType_Monogram( +data: null == data ? _self.data : data // ignore: cast_nullable_to_non_nullable +as MonogramData,background: null == background ? _self.background : background // ignore: cast_nullable_to_non_nullable +as PosterColor, + )); +} + + +} + +/// @nodoc + + +class PosterType_Memoji extends PosterType { + const PosterType_Memoji({required this.data, required this.background}): super._(); + + + final MemojiData data; + final PosterColor background; + +/// Create a copy of PosterType +/// with the given fields replaced by the non-null parameter values. +@JsonKey(includeFromJson: false, includeToJson: false) +@pragma('vm:prefer-inline') +$PosterType_MemojiCopyWith get copyWith => _$PosterType_MemojiCopyWithImpl(this, _$identity); + + + +@override +bool operator ==(Object other) { + return identical(this, other) || (other.runtimeType == runtimeType&&other is PosterType_Memoji&&(identical(other.data, data) || other.data == data)&&(identical(other.background, background) || other.background == background)); +} + + +@override +int get hashCode => Object.hash(runtimeType,data,background); + +@override +String toString() { + return 'PosterType.memoji(data: $data, background: $background)'; +} + + +} + +/// @nodoc +abstract mixin class $PosterType_MemojiCopyWith<$Res> implements $PosterTypeCopyWith<$Res> { + factory $PosterType_MemojiCopyWith(PosterType_Memoji value, $Res Function(PosterType_Memoji) _then) = _$PosterType_MemojiCopyWithImpl; +@useResult +$Res call({ + MemojiData data, PosterColor background +}); + + + + +} +/// @nodoc +class _$PosterType_MemojiCopyWithImpl<$Res> + implements $PosterType_MemojiCopyWith<$Res> { + _$PosterType_MemojiCopyWithImpl(this._self, this._then); + + final PosterType_Memoji _self; + final $Res Function(PosterType_Memoji) _then; + +/// Create a copy of PosterType +/// with the given fields replaced by the non-null parameter values. +@pragma('vm:prefer-inline') $Res call({Object? data = null,Object? background = null,}) { + return _then(PosterType_Memoji( +data: null == data ? _self.data : data // ignore: cast_nullable_to_non_nullable +as MemojiData,background: null == background ? _self.background : background // ignore: cast_nullable_to_non_nullable +as PosterColor, + )); +} + + +} + +/// @nodoc + + +class PosterType_TranscriptDynamic extends PosterType { + const PosterType_TranscriptDynamic({required this.data}): super._(); + + + final TranscriptDynamicUserData data; + +/// Create a copy of PosterType +/// with the given fields replaced by the non-null parameter values. +@JsonKey(includeFromJson: false, includeToJson: false) +@pragma('vm:prefer-inline') +$PosterType_TranscriptDynamicCopyWith get copyWith => _$PosterType_TranscriptDynamicCopyWithImpl(this, _$identity); + + + +@override +bool operator ==(Object other) { + return identical(this, other) || (other.runtimeType == runtimeType&&other is PosterType_TranscriptDynamic&&(identical(other.data, data) || other.data == data)); +} + + +@override +int get hashCode => Object.hash(runtimeType,data); + +@override +String toString() { + return 'PosterType.transcriptDynamic(data: $data)'; +} + + +} + +/// @nodoc +abstract mixin class $PosterType_TranscriptDynamicCopyWith<$Res> implements $PosterTypeCopyWith<$Res> { + factory $PosterType_TranscriptDynamicCopyWith(PosterType_TranscriptDynamic value, $Res Function(PosterType_TranscriptDynamic) _then) = _$PosterType_TranscriptDynamicCopyWithImpl; +@useResult +$Res call({ + TranscriptDynamicUserData data +}); + + + + +} +/// @nodoc +class _$PosterType_TranscriptDynamicCopyWithImpl<$Res> + implements $PosterType_TranscriptDynamicCopyWith<$Res> { + _$PosterType_TranscriptDynamicCopyWithImpl(this._self, this._then); + + final PosterType_TranscriptDynamic _self; + final $Res Function(PosterType_TranscriptDynamic) _then; + +/// Create a copy of PosterType +/// with the given fields replaced by the non-null parameter values. +@pragma('vm:prefer-inline') $Res call({Object? data = null,}) { + return _then(PosterType_TranscriptDynamic( +data: null == data ? _self.data : data // ignore: cast_nullable_to_non_nullable +as TranscriptDynamicUserData, + )); +} + + +} + +/// @nodoc + + +class PosterType_TranscriptGradient extends PosterType { + const PosterType_TranscriptGradient({required final List colors}): _colors = colors,super._(); + + + final List _colors; + List get colors { + if (_colors is EqualUnmodifiableListView) return _colors; + // ignore: implicit_dynamic_type + return EqualUnmodifiableListView(_colors); +} + + +/// Create a copy of PosterType +/// with the given fields replaced by the non-null parameter values. +@JsonKey(includeFromJson: false, includeToJson: false) +@pragma('vm:prefer-inline') +$PosterType_TranscriptGradientCopyWith get copyWith => _$PosterType_TranscriptGradientCopyWithImpl(this, _$identity); + + + +@override +bool operator ==(Object other) { + return identical(this, other) || (other.runtimeType == runtimeType&&other is PosterType_TranscriptGradient&&const DeepCollectionEquality().equals(other._colors, _colors)); +} + + +@override +int get hashCode => Object.hash(runtimeType,const DeepCollectionEquality().hash(_colors)); + +@override +String toString() { + return 'PosterType.transcriptGradient(colors: $colors)'; +} + + +} + +/// @nodoc +abstract mixin class $PosterType_TranscriptGradientCopyWith<$Res> implements $PosterTypeCopyWith<$Res> { + factory $PosterType_TranscriptGradientCopyWith(PosterType_TranscriptGradient value, $Res Function(PosterType_TranscriptGradient) _then) = _$PosterType_TranscriptGradientCopyWithImpl; +@useResult +$Res call({ + List colors +}); + + + + +} +/// @nodoc +class _$PosterType_TranscriptGradientCopyWithImpl<$Res> + implements $PosterType_TranscriptGradientCopyWith<$Res> { + _$PosterType_TranscriptGradientCopyWithImpl(this._self, this._then); + + final PosterType_TranscriptGradient _self; + final $Res Function(PosterType_TranscriptGradient) _then; + +/// Create a copy of PosterType +/// with the given fields replaced by the non-null parameter values. +@pragma('vm:prefer-inline') $Res call({Object? colors = null,}) { + return _then(PosterType_TranscriptGradient( +colors: null == colors ? _self._colors : colors // ignore: cast_nullable_to_non_nullable +as List, + )); +} + + +} + +/// @nodoc +mixin _$PRPosterContentMaterialStyle { + + + + + +@override +bool operator ==(Object other) { + return identical(this, other) || (other.runtimeType == runtimeType&&other is PRPosterContentMaterialStyle); +} + + +@override +int get hashCode => runtimeType.hashCode; + +@override +String toString() { + return 'PRPosterContentMaterialStyle()'; +} + + +} + +/// @nodoc +class $PRPosterContentMaterialStyleCopyWith<$Res> { +$PRPosterContentMaterialStyleCopyWith(PRPosterContentMaterialStyle _, $Res Function(PRPosterContentMaterialStyle) __); +} + + +/// Adds pattern-matching-related methods to [PRPosterContentMaterialStyle]. +extension PRPosterContentMaterialStylePatterns on PRPosterContentMaterialStyle { +/// A variant of `map` that fallback to returning `orElse`. +/// +/// It is equivalent to doing: +/// ```dart +/// switch (sealedClass) { +/// case final Subclass value: +/// return ...; +/// case _: +/// return orElse(); +/// } +/// ``` + +@optionalTypeArgs TResult maybeMap({TResult Function( PRPosterContentMaterialStyle_PRPosterContentDiscreteColorsStyle value)? prPosterContentDiscreteColorsStyle,TResult Function( PRPosterContentMaterialStyle_PRPosterContentVibrantMaterialStyle value)? prPosterContentVibrantMaterialStyle,TResult Function( PRPosterContentMaterialStyle_PRPosterContentGradientStyle value)? prPosterContentGradientStyle,required TResult orElse(),}){ +final _that = this; +switch (_that) { +case PRPosterContentMaterialStyle_PRPosterContentDiscreteColorsStyle() when prPosterContentDiscreteColorsStyle != null: +return prPosterContentDiscreteColorsStyle(_that);case PRPosterContentMaterialStyle_PRPosterContentVibrantMaterialStyle() when prPosterContentVibrantMaterialStyle != null: +return prPosterContentVibrantMaterialStyle(_that);case PRPosterContentMaterialStyle_PRPosterContentGradientStyle() when prPosterContentGradientStyle != null: +return prPosterContentGradientStyle(_that);case _: + return orElse(); + +} +} +/// A `switch`-like method, using callbacks. +/// +/// Callbacks receives the raw object, upcasted. +/// It is equivalent to doing: +/// ```dart +/// switch (sealedClass) { +/// case final Subclass value: +/// return ...; +/// case final Subclass2 value: +/// return ...; +/// } +/// ``` + +@optionalTypeArgs TResult map({required TResult Function( PRPosterContentMaterialStyle_PRPosterContentDiscreteColorsStyle value) prPosterContentDiscreteColorsStyle,required TResult Function( PRPosterContentMaterialStyle_PRPosterContentVibrantMaterialStyle value) prPosterContentVibrantMaterialStyle,required TResult Function( PRPosterContentMaterialStyle_PRPosterContentGradientStyle value) prPosterContentGradientStyle,}){ +final _that = this; +switch (_that) { +case PRPosterContentMaterialStyle_PRPosterContentDiscreteColorsStyle(): +return prPosterContentDiscreteColorsStyle(_that);case PRPosterContentMaterialStyle_PRPosterContentVibrantMaterialStyle(): +return prPosterContentVibrantMaterialStyle(_that);case PRPosterContentMaterialStyle_PRPosterContentGradientStyle(): +return prPosterContentGradientStyle(_that);} +} +/// A variant of `map` that fallback to returning `null`. +/// +/// It is equivalent to doing: +/// ```dart +/// switch (sealedClass) { +/// case final Subclass value: +/// return ...; +/// case _: +/// return null; +/// } +/// ``` + +@optionalTypeArgs TResult? mapOrNull({TResult? Function( PRPosterContentMaterialStyle_PRPosterContentDiscreteColorsStyle value)? prPosterContentDiscreteColorsStyle,TResult? Function( PRPosterContentMaterialStyle_PRPosterContentVibrantMaterialStyle value)? prPosterContentVibrantMaterialStyle,TResult? Function( PRPosterContentMaterialStyle_PRPosterContentGradientStyle value)? prPosterContentGradientStyle,}){ +final _that = this; +switch (_that) { +case PRPosterContentMaterialStyle_PRPosterContentDiscreteColorsStyle() when prPosterContentDiscreteColorsStyle != null: +return prPosterContentDiscreteColorsStyle(_that);case PRPosterContentMaterialStyle_PRPosterContentVibrantMaterialStyle() when prPosterContentVibrantMaterialStyle != null: +return prPosterContentVibrantMaterialStyle(_that);case PRPosterContentMaterialStyle_PRPosterContentGradientStyle() when prPosterContentGradientStyle != null: +return prPosterContentGradientStyle(_that);case _: + return null; + +} +} +/// A variant of `when` that fallback to an `orElse` callback. +/// +/// It is equivalent to doing: +/// ```dart +/// switch (sealedClass) { +/// case Subclass(:final field): +/// return ...; +/// case _: +/// return orElse(); +/// } +/// ``` + +@optionalTypeArgs TResult maybeWhen({TResult Function( double variation, List colors, bool vibrant, bool supportsVariation, bool needsToResolveVariation)? prPosterContentDiscreteColorsStyle,TResult Function()? prPosterContentVibrantMaterialStyle,TResult Function( int gradientType, List colors, String startPoint, Float64List locations, String endPoint)? prPosterContentGradientStyle,required TResult orElse(),}) {final _that = this; +switch (_that) { +case PRPosterContentMaterialStyle_PRPosterContentDiscreteColorsStyle() when prPosterContentDiscreteColorsStyle != null: +return prPosterContentDiscreteColorsStyle(_that.variation,_that.colors,_that.vibrant,_that.supportsVariation,_that.needsToResolveVariation);case PRPosterContentMaterialStyle_PRPosterContentVibrantMaterialStyle() when prPosterContentVibrantMaterialStyle != null: +return prPosterContentVibrantMaterialStyle();case PRPosterContentMaterialStyle_PRPosterContentGradientStyle() when prPosterContentGradientStyle != null: +return prPosterContentGradientStyle(_that.gradientType,_that.colors,_that.startPoint,_that.locations,_that.endPoint);case _: + return orElse(); + +} +} +/// A `switch`-like method, using callbacks. +/// +/// As opposed to `map`, this offers destructuring. +/// It is equivalent to doing: +/// ```dart +/// switch (sealedClass) { +/// case Subclass(:final field): +/// return ...; +/// case Subclass2(:final field2): +/// return ...; +/// } +/// ``` + +@optionalTypeArgs TResult when({required TResult Function( double variation, List colors, bool vibrant, bool supportsVariation, bool needsToResolveVariation) prPosterContentDiscreteColorsStyle,required TResult Function() prPosterContentVibrantMaterialStyle,required TResult Function( int gradientType, List colors, String startPoint, Float64List locations, String endPoint) prPosterContentGradientStyle,}) {final _that = this; +switch (_that) { +case PRPosterContentMaterialStyle_PRPosterContentDiscreteColorsStyle(): +return prPosterContentDiscreteColorsStyle(_that.variation,_that.colors,_that.vibrant,_that.supportsVariation,_that.needsToResolveVariation);case PRPosterContentMaterialStyle_PRPosterContentVibrantMaterialStyle(): +return prPosterContentVibrantMaterialStyle();case PRPosterContentMaterialStyle_PRPosterContentGradientStyle(): +return prPosterContentGradientStyle(_that.gradientType,_that.colors,_that.startPoint,_that.locations,_that.endPoint);} +} +/// A variant of `when` that fallback to returning `null` +/// +/// It is equivalent to doing: +/// ```dart +/// switch (sealedClass) { +/// case Subclass(:final field): +/// return ...; +/// case _: +/// return null; +/// } +/// ``` + +@optionalTypeArgs TResult? whenOrNull({TResult? Function( double variation, List colors, bool vibrant, bool supportsVariation, bool needsToResolveVariation)? prPosterContentDiscreteColorsStyle,TResult? Function()? prPosterContentVibrantMaterialStyle,TResult? Function( int gradientType, List colors, String startPoint, Float64List locations, String endPoint)? prPosterContentGradientStyle,}) {final _that = this; +switch (_that) { +case PRPosterContentMaterialStyle_PRPosterContentDiscreteColorsStyle() when prPosterContentDiscreteColorsStyle != null: +return prPosterContentDiscreteColorsStyle(_that.variation,_that.colors,_that.vibrant,_that.supportsVariation,_that.needsToResolveVariation);case PRPosterContentMaterialStyle_PRPosterContentVibrantMaterialStyle() when prPosterContentVibrantMaterialStyle != null: +return prPosterContentVibrantMaterialStyle();case PRPosterContentMaterialStyle_PRPosterContentGradientStyle() when prPosterContentGradientStyle != null: +return prPosterContentGradientStyle(_that.gradientType,_that.colors,_that.startPoint,_that.locations,_that.endPoint);case _: + return null; + +} +} + +} + +/// @nodoc + + +class PRPosterContentMaterialStyle_PRPosterContentDiscreteColorsStyle extends PRPosterContentMaterialStyle { + const PRPosterContentMaterialStyle_PRPosterContentDiscreteColorsStyle({required this.variation, required final List colors, required this.vibrant, required this.supportsVariation, required this.needsToResolveVariation}): _colors = colors,super._(); + + + final double variation; + final List _colors; + List get colors { + if (_colors is EqualUnmodifiableListView) return _colors; + // ignore: implicit_dynamic_type + return EqualUnmodifiableListView(_colors); +} + + final bool vibrant; + final bool supportsVariation; + final bool needsToResolveVariation; + +/// Create a copy of PRPosterContentMaterialStyle +/// with the given fields replaced by the non-null parameter values. +@JsonKey(includeFromJson: false, includeToJson: false) +@pragma('vm:prefer-inline') +$PRPosterContentMaterialStyle_PRPosterContentDiscreteColorsStyleCopyWith get copyWith => _$PRPosterContentMaterialStyle_PRPosterContentDiscreteColorsStyleCopyWithImpl(this, _$identity); + + + +@override +bool operator ==(Object other) { + return identical(this, other) || (other.runtimeType == runtimeType&&other is PRPosterContentMaterialStyle_PRPosterContentDiscreteColorsStyle&&(identical(other.variation, variation) || other.variation == variation)&&const DeepCollectionEquality().equals(other._colors, _colors)&&(identical(other.vibrant, vibrant) || other.vibrant == vibrant)&&(identical(other.supportsVariation, supportsVariation) || other.supportsVariation == supportsVariation)&&(identical(other.needsToResolveVariation, needsToResolveVariation) || other.needsToResolveVariation == needsToResolveVariation)); +} + + +@override +int get hashCode => Object.hash(runtimeType,variation,const DeepCollectionEquality().hash(_colors),vibrant,supportsVariation,needsToResolveVariation); + +@override +String toString() { + return 'PRPosterContentMaterialStyle.prPosterContentDiscreteColorsStyle(variation: $variation, colors: $colors, vibrant: $vibrant, supportsVariation: $supportsVariation, needsToResolveVariation: $needsToResolveVariation)'; +} + + +} + +/// @nodoc +abstract mixin class $PRPosterContentMaterialStyle_PRPosterContentDiscreteColorsStyleCopyWith<$Res> implements $PRPosterContentMaterialStyleCopyWith<$Res> { + factory $PRPosterContentMaterialStyle_PRPosterContentDiscreteColorsStyleCopyWith(PRPosterContentMaterialStyle_PRPosterContentDiscreteColorsStyle value, $Res Function(PRPosterContentMaterialStyle_PRPosterContentDiscreteColorsStyle) _then) = _$PRPosterContentMaterialStyle_PRPosterContentDiscreteColorsStyleCopyWithImpl; +@useResult +$Res call({ + double variation, List colors, bool vibrant, bool supportsVariation, bool needsToResolveVariation +}); + + + + +} +/// @nodoc +class _$PRPosterContentMaterialStyle_PRPosterContentDiscreteColorsStyleCopyWithImpl<$Res> + implements $PRPosterContentMaterialStyle_PRPosterContentDiscreteColorsStyleCopyWith<$Res> { + _$PRPosterContentMaterialStyle_PRPosterContentDiscreteColorsStyleCopyWithImpl(this._self, this._then); + + final PRPosterContentMaterialStyle_PRPosterContentDiscreteColorsStyle _self; + final $Res Function(PRPosterContentMaterialStyle_PRPosterContentDiscreteColorsStyle) _then; + +/// Create a copy of PRPosterContentMaterialStyle +/// with the given fields replaced by the non-null parameter values. +@pragma('vm:prefer-inline') $Res call({Object? variation = null,Object? colors = null,Object? vibrant = null,Object? supportsVariation = null,Object? needsToResolveVariation = null,}) { + return _then(PRPosterContentMaterialStyle_PRPosterContentDiscreteColorsStyle( +variation: null == variation ? _self.variation : variation // ignore: cast_nullable_to_non_nullable +as double,colors: null == colors ? _self._colors : colors // ignore: cast_nullable_to_non_nullable +as List,vibrant: null == vibrant ? _self.vibrant : vibrant // ignore: cast_nullable_to_non_nullable +as bool,supportsVariation: null == supportsVariation ? _self.supportsVariation : supportsVariation // ignore: cast_nullable_to_non_nullable +as bool,needsToResolveVariation: null == needsToResolveVariation ? _self.needsToResolveVariation : needsToResolveVariation // ignore: cast_nullable_to_non_nullable +as bool, + )); +} + + +} + +/// @nodoc + + +class PRPosterContentMaterialStyle_PRPosterContentVibrantMaterialStyle extends PRPosterContentMaterialStyle { + const PRPosterContentMaterialStyle_PRPosterContentVibrantMaterialStyle(): super._(); + + + + + + + +@override +bool operator ==(Object other) { + return identical(this, other) || (other.runtimeType == runtimeType&&other is PRPosterContentMaterialStyle_PRPosterContentVibrantMaterialStyle); +} + + +@override +int get hashCode => runtimeType.hashCode; + +@override +String toString() { + return 'PRPosterContentMaterialStyle.prPosterContentVibrantMaterialStyle()'; +} + + +} + + + + +/// @nodoc + + +class PRPosterContentMaterialStyle_PRPosterContentGradientStyle extends PRPosterContentMaterialStyle { + const PRPosterContentMaterialStyle_PRPosterContentGradientStyle({required this.gradientType, required final List colors, required this.startPoint, required this.locations, required this.endPoint}): _colors = colors,super._(); + + + final int gradientType; + final List _colors; + List get colors { + if (_colors is EqualUnmodifiableListView) return _colors; + // ignore: implicit_dynamic_type + return EqualUnmodifiableListView(_colors); +} + + final String startPoint; + final Float64List locations; + final String endPoint; + +/// Create a copy of PRPosterContentMaterialStyle +/// with the given fields replaced by the non-null parameter values. +@JsonKey(includeFromJson: false, includeToJson: false) +@pragma('vm:prefer-inline') +$PRPosterContentMaterialStyle_PRPosterContentGradientStyleCopyWith get copyWith => _$PRPosterContentMaterialStyle_PRPosterContentGradientStyleCopyWithImpl(this, _$identity); + + + +@override +bool operator ==(Object other) { + return identical(this, other) || (other.runtimeType == runtimeType&&other is PRPosterContentMaterialStyle_PRPosterContentGradientStyle&&(identical(other.gradientType, gradientType) || other.gradientType == gradientType)&&const DeepCollectionEquality().equals(other._colors, _colors)&&(identical(other.startPoint, startPoint) || other.startPoint == startPoint)&&const DeepCollectionEquality().equals(other.locations, locations)&&(identical(other.endPoint, endPoint) || other.endPoint == endPoint)); +} + + +@override +int get hashCode => Object.hash(runtimeType,gradientType,const DeepCollectionEquality().hash(_colors),startPoint,const DeepCollectionEquality().hash(locations),endPoint); + +@override +String toString() { + return 'PRPosterContentMaterialStyle.prPosterContentGradientStyle(gradientType: $gradientType, colors: $colors, startPoint: $startPoint, locations: $locations, endPoint: $endPoint)'; +} + + +} + +/// @nodoc +abstract mixin class $PRPosterContentMaterialStyle_PRPosterContentGradientStyleCopyWith<$Res> implements $PRPosterContentMaterialStyleCopyWith<$Res> { + factory $PRPosterContentMaterialStyle_PRPosterContentGradientStyleCopyWith(PRPosterContentMaterialStyle_PRPosterContentGradientStyle value, $Res Function(PRPosterContentMaterialStyle_PRPosterContentGradientStyle) _then) = _$PRPosterContentMaterialStyle_PRPosterContentGradientStyleCopyWithImpl; +@useResult +$Res call({ + int gradientType, List colors, String startPoint, Float64List locations, String endPoint +}); + + + + +} +/// @nodoc +class _$PRPosterContentMaterialStyle_PRPosterContentGradientStyleCopyWithImpl<$Res> + implements $PRPosterContentMaterialStyle_PRPosterContentGradientStyleCopyWith<$Res> { + _$PRPosterContentMaterialStyle_PRPosterContentGradientStyleCopyWithImpl(this._self, this._then); + + final PRPosterContentMaterialStyle_PRPosterContentGradientStyle _self; + final $Res Function(PRPosterContentMaterialStyle_PRPosterContentGradientStyle) _then; + +/// Create a copy of PRPosterContentMaterialStyle +/// with the given fields replaced by the non-null parameter values. +@pragma('vm:prefer-inline') $Res call({Object? gradientType = null,Object? colors = null,Object? startPoint = null,Object? locations = null,Object? endPoint = null,}) { + return _then(PRPosterContentMaterialStyle_PRPosterContentGradientStyle( +gradientType: null == gradientType ? _self.gradientType : gradientType // ignore: cast_nullable_to_non_nullable +as int,colors: null == colors ? _self._colors : colors // ignore: cast_nullable_to_non_nullable +as List,startPoint: null == startPoint ? _self.startPoint : startPoint // ignore: cast_nullable_to_non_nullable +as String,locations: null == locations ? _self.locations : locations // ignore: cast_nullable_to_non_nullable +as Float64List,endPoint: null == endPoint ? _self.endPoint : endPoint // ignore: cast_nullable_to_non_nullable +as String, + )); +} + + +} + +/// @nodoc +mixin _$PushMessage { + + + + + +@override +bool operator ==(Object other) { + return identical(this, other) || (other.runtimeType == runtimeType&&other is PushMessage); +} + + +@override +int get hashCode => runtimeType.hashCode; + +@override +String toString() { + return 'PushMessage()'; +} + + +} + +/// @nodoc +class $PushMessageCopyWith<$Res> { +$PushMessageCopyWith(PushMessage _, $Res Function(PushMessage) __); +} + + +/// Adds pattern-matching-related methods to [PushMessage]. +extension PushMessagePatterns on PushMessage { +/// A variant of `map` that fallback to returning `orElse`. +/// +/// It is equivalent to doing: +/// ```dart +/// switch (sealedClass) { +/// case final Subclass value: +/// return ...; +/// case _: +/// return orElse(); +/// } +/// ``` + +@optionalTypeArgs TResult maybeMap({TResult Function( PushMessage_IMessage value)? iMessage,TResult Function( PushMessage_SendConfirm value)? sendConfirm,TResult Function( PushMessage_RegistrationState value)? registrationState,TResult Function( PushMessage_NewPhotostream value)? newPhotostream,TResult Function( PushMessage_FaceTime value)? faceTime,TResult Function( PushMessage_StatusUpdate value)? statusUpdate,TResult Function( PushMessage_Idms value)? idms,TResult Function( PushMessage_TwoFaAuthEvent value)? twoFaAuthEvent,TResult Function( PushMessage_CircleFinishEvent value)? circleFinishEvent,TResult Function( PushMessage_BeaconShared value)? beaconShared,required TResult orElse(),}){ +final _that = this; +switch (_that) { +case PushMessage_IMessage() when iMessage != null: +return iMessage(_that);case PushMessage_SendConfirm() when sendConfirm != null: +return sendConfirm(_that);case PushMessage_RegistrationState() when registrationState != null: +return registrationState(_that);case PushMessage_NewPhotostream() when newPhotostream != null: +return newPhotostream(_that);case PushMessage_FaceTime() when faceTime != null: +return faceTime(_that);case PushMessage_StatusUpdate() when statusUpdate != null: +return statusUpdate(_that);case PushMessage_Idms() when idms != null: +return idms(_that);case PushMessage_TwoFaAuthEvent() when twoFaAuthEvent != null: +return twoFaAuthEvent(_that);case PushMessage_CircleFinishEvent() when circleFinishEvent != null: +return circleFinishEvent(_that);case PushMessage_BeaconShared() when beaconShared != null: +return beaconShared(_that);case _: + return orElse(); + +} +} +/// A `switch`-like method, using callbacks. +/// +/// Callbacks receives the raw object, upcasted. +/// It is equivalent to doing: +/// ```dart +/// switch (sealedClass) { +/// case final Subclass value: +/// return ...; +/// case final Subclass2 value: +/// return ...; +/// } +/// ``` + +@optionalTypeArgs TResult map({required TResult Function( PushMessage_IMessage value) iMessage,required TResult Function( PushMessage_SendConfirm value) sendConfirm,required TResult Function( PushMessage_RegistrationState value) registrationState,required TResult Function( PushMessage_NewPhotostream value) newPhotostream,required TResult Function( PushMessage_FaceTime value) faceTime,required TResult Function( PushMessage_StatusUpdate value) statusUpdate,required TResult Function( PushMessage_Idms value) idms,required TResult Function( PushMessage_TwoFaAuthEvent value) twoFaAuthEvent,required TResult Function( PushMessage_CircleFinishEvent value) circleFinishEvent,required TResult Function( PushMessage_BeaconShared value) beaconShared,}){ +final _that = this; +switch (_that) { +case PushMessage_IMessage(): +return iMessage(_that);case PushMessage_SendConfirm(): +return sendConfirm(_that);case PushMessage_RegistrationState(): +return registrationState(_that);case PushMessage_NewPhotostream(): +return newPhotostream(_that);case PushMessage_FaceTime(): +return faceTime(_that);case PushMessage_StatusUpdate(): +return statusUpdate(_that);case PushMessage_Idms(): +return idms(_that);case PushMessage_TwoFaAuthEvent(): +return twoFaAuthEvent(_that);case PushMessage_CircleFinishEvent(): +return circleFinishEvent(_that);case PushMessage_BeaconShared(): +return beaconShared(_that);} +} +/// A variant of `map` that fallback to returning `null`. +/// +/// It is equivalent to doing: +/// ```dart +/// switch (sealedClass) { +/// case final Subclass value: +/// return ...; +/// case _: +/// return null; +/// } +/// ``` + +@optionalTypeArgs TResult? mapOrNull({TResult? Function( PushMessage_IMessage value)? iMessage,TResult? Function( PushMessage_SendConfirm value)? sendConfirm,TResult? Function( PushMessage_RegistrationState value)? registrationState,TResult? Function( PushMessage_NewPhotostream value)? newPhotostream,TResult? Function( PushMessage_FaceTime value)? faceTime,TResult? Function( PushMessage_StatusUpdate value)? statusUpdate,TResult? Function( PushMessage_Idms value)? idms,TResult? Function( PushMessage_TwoFaAuthEvent value)? twoFaAuthEvent,TResult? Function( PushMessage_CircleFinishEvent value)? circleFinishEvent,TResult? Function( PushMessage_BeaconShared value)? beaconShared,}){ +final _that = this; +switch (_that) { +case PushMessage_IMessage() when iMessage != null: +return iMessage(_that);case PushMessage_SendConfirm() when sendConfirm != null: +return sendConfirm(_that);case PushMessage_RegistrationState() when registrationState != null: +return registrationState(_that);case PushMessage_NewPhotostream() when newPhotostream != null: +return newPhotostream(_that);case PushMessage_FaceTime() when faceTime != null: +return faceTime(_that);case PushMessage_StatusUpdate() when statusUpdate != null: +return statusUpdate(_that);case PushMessage_Idms() when idms != null: +return idms(_that);case PushMessage_TwoFaAuthEvent() when twoFaAuthEvent != null: +return twoFaAuthEvent(_that);case PushMessage_CircleFinishEvent() when circleFinishEvent != null: +return circleFinishEvent(_that);case PushMessage_BeaconShared() when beaconShared != null: +return beaconShared(_that);case _: + return null; + +} +} +/// A variant of `when` that fallback to an `orElse` callback. +/// +/// It is equivalent to doing: +/// ```dart +/// switch (sealedClass) { +/// case Subclass(:final field): +/// return ...; +/// case _: +/// return orElse(); +/// } +/// ``` + +@optionalTypeArgs TResult maybeWhen({TResult Function( MessageInst field0)? iMessage,TResult Function( String uuid, String? error)? sendConfirm,TResult Function( RegisterState field0)? registrationState,TResult Function( SharedAlbum field0)? newPhotostream,TResult Function( FTMessage field0)? faceTime,TResult Function( StatusKitMessage field0)? statusUpdate,TResult Function( IdmsMessage field0)? idms,TResult Function( bool field0)? twoFaAuthEvent,TResult Function()? circleFinishEvent,TResult Function( String sender, String beacon, BeaconAttributes attributes)? beaconShared,required TResult orElse(),}) {final _that = this; +switch (_that) { +case PushMessage_IMessage() when iMessage != null: +return iMessage(_that.field0);case PushMessage_SendConfirm() when sendConfirm != null: +return sendConfirm(_that.uuid,_that.error);case PushMessage_RegistrationState() when registrationState != null: +return registrationState(_that.field0);case PushMessage_NewPhotostream() when newPhotostream != null: +return newPhotostream(_that.field0);case PushMessage_FaceTime() when faceTime != null: +return faceTime(_that.field0);case PushMessage_StatusUpdate() when statusUpdate != null: +return statusUpdate(_that.field0);case PushMessage_Idms() when idms != null: +return idms(_that.field0);case PushMessage_TwoFaAuthEvent() when twoFaAuthEvent != null: +return twoFaAuthEvent(_that.field0);case PushMessage_CircleFinishEvent() when circleFinishEvent != null: +return circleFinishEvent();case PushMessage_BeaconShared() when beaconShared != null: +return beaconShared(_that.sender,_that.beacon,_that.attributes);case _: + return orElse(); + +} +} +/// A `switch`-like method, using callbacks. +/// +/// As opposed to `map`, this offers destructuring. +/// It is equivalent to doing: +/// ```dart +/// switch (sealedClass) { +/// case Subclass(:final field): +/// return ...; +/// case Subclass2(:final field2): +/// return ...; +/// } +/// ``` + +@optionalTypeArgs TResult when({required TResult Function( MessageInst field0) iMessage,required TResult Function( String uuid, String? error) sendConfirm,required TResult Function( RegisterState field0) registrationState,required TResult Function( SharedAlbum field0) newPhotostream,required TResult Function( FTMessage field0) faceTime,required TResult Function( StatusKitMessage field0) statusUpdate,required TResult Function( IdmsMessage field0) idms,required TResult Function( bool field0) twoFaAuthEvent,required TResult Function() circleFinishEvent,required TResult Function( String sender, String beacon, BeaconAttributes attributes) beaconShared,}) {final _that = this; +switch (_that) { +case PushMessage_IMessage(): +return iMessage(_that.field0);case PushMessage_SendConfirm(): +return sendConfirm(_that.uuid,_that.error);case PushMessage_RegistrationState(): +return registrationState(_that.field0);case PushMessage_NewPhotostream(): +return newPhotostream(_that.field0);case PushMessage_FaceTime(): +return faceTime(_that.field0);case PushMessage_StatusUpdate(): +return statusUpdate(_that.field0);case PushMessage_Idms(): +return idms(_that.field0);case PushMessage_TwoFaAuthEvent(): +return twoFaAuthEvent(_that.field0);case PushMessage_CircleFinishEvent(): +return circleFinishEvent();case PushMessage_BeaconShared(): +return beaconShared(_that.sender,_that.beacon,_that.attributes);} +} +/// A variant of `when` that fallback to returning `null` +/// +/// It is equivalent to doing: +/// ```dart +/// switch (sealedClass) { +/// case Subclass(:final field): +/// return ...; +/// case _: +/// return null; +/// } +/// ``` + +@optionalTypeArgs TResult? whenOrNull({TResult? Function( MessageInst field0)? iMessage,TResult? Function( String uuid, String? error)? sendConfirm,TResult? Function( RegisterState field0)? registrationState,TResult? Function( SharedAlbum field0)? newPhotostream,TResult? Function( FTMessage field0)? faceTime,TResult? Function( StatusKitMessage field0)? statusUpdate,TResult? Function( IdmsMessage field0)? idms,TResult? Function( bool field0)? twoFaAuthEvent,TResult? Function()? circleFinishEvent,TResult? Function( String sender, String beacon, BeaconAttributes attributes)? beaconShared,}) {final _that = this; +switch (_that) { +case PushMessage_IMessage() when iMessage != null: +return iMessage(_that.field0);case PushMessage_SendConfirm() when sendConfirm != null: +return sendConfirm(_that.uuid,_that.error);case PushMessage_RegistrationState() when registrationState != null: +return registrationState(_that.field0);case PushMessage_NewPhotostream() when newPhotostream != null: +return newPhotostream(_that.field0);case PushMessage_FaceTime() when faceTime != null: +return faceTime(_that.field0);case PushMessage_StatusUpdate() when statusUpdate != null: +return statusUpdate(_that.field0);case PushMessage_Idms() when idms != null: +return idms(_that.field0);case PushMessage_TwoFaAuthEvent() when twoFaAuthEvent != null: +return twoFaAuthEvent(_that.field0);case PushMessage_CircleFinishEvent() when circleFinishEvent != null: +return circleFinishEvent();case PushMessage_BeaconShared() when beaconShared != null: +return beaconShared(_that.sender,_that.beacon,_that.attributes);case _: + return null; + +} +} + +} + +/// @nodoc + + +class PushMessage_IMessage extends PushMessage { + const PushMessage_IMessage(this.field0): super._(); + + + final MessageInst field0; + +/// Create a copy of PushMessage +/// with the given fields replaced by the non-null parameter values. +@JsonKey(includeFromJson: false, includeToJson: false) +@pragma('vm:prefer-inline') +$PushMessage_IMessageCopyWith get copyWith => _$PushMessage_IMessageCopyWithImpl(this, _$identity); + + + +@override +bool operator ==(Object other) { + return identical(this, other) || (other.runtimeType == runtimeType&&other is PushMessage_IMessage&&(identical(other.field0, field0) || other.field0 == field0)); +} + + +@override +int get hashCode => Object.hash(runtimeType,field0); + +@override +String toString() { + return 'PushMessage.iMessage(field0: $field0)'; +} + + +} + +/// @nodoc +abstract mixin class $PushMessage_IMessageCopyWith<$Res> implements $PushMessageCopyWith<$Res> { + factory $PushMessage_IMessageCopyWith(PushMessage_IMessage value, $Res Function(PushMessage_IMessage) _then) = _$PushMessage_IMessageCopyWithImpl; +@useResult +$Res call({ + MessageInst field0 +}); + + + + +} +/// @nodoc +class _$PushMessage_IMessageCopyWithImpl<$Res> + implements $PushMessage_IMessageCopyWith<$Res> { + _$PushMessage_IMessageCopyWithImpl(this._self, this._then); + + final PushMessage_IMessage _self; + final $Res Function(PushMessage_IMessage) _then; + +/// Create a copy of PushMessage +/// with the given fields replaced by the non-null parameter values. +@pragma('vm:prefer-inline') $Res call({Object? field0 = null,}) { + return _then(PushMessage_IMessage( +null == field0 ? _self.field0 : field0 // ignore: cast_nullable_to_non_nullable +as MessageInst, + )); +} + + +} + +/// @nodoc + + +class PushMessage_SendConfirm extends PushMessage { + const PushMessage_SendConfirm({required this.uuid, this.error}): super._(); + + + final String uuid; + final String? error; + +/// Create a copy of PushMessage +/// with the given fields replaced by the non-null parameter values. +@JsonKey(includeFromJson: false, includeToJson: false) +@pragma('vm:prefer-inline') +$PushMessage_SendConfirmCopyWith get copyWith => _$PushMessage_SendConfirmCopyWithImpl(this, _$identity); + + + +@override +bool operator ==(Object other) { + return identical(this, other) || (other.runtimeType == runtimeType&&other is PushMessage_SendConfirm&&(identical(other.uuid, uuid) || other.uuid == uuid)&&(identical(other.error, error) || other.error == error)); +} + + +@override +int get hashCode => Object.hash(runtimeType,uuid,error); + +@override +String toString() { + return 'PushMessage.sendConfirm(uuid: $uuid, error: $error)'; +} + + +} + +/// @nodoc +abstract mixin class $PushMessage_SendConfirmCopyWith<$Res> implements $PushMessageCopyWith<$Res> { + factory $PushMessage_SendConfirmCopyWith(PushMessage_SendConfirm value, $Res Function(PushMessage_SendConfirm) _then) = _$PushMessage_SendConfirmCopyWithImpl; +@useResult +$Res call({ + String uuid, String? error +}); + + + + +} +/// @nodoc +class _$PushMessage_SendConfirmCopyWithImpl<$Res> + implements $PushMessage_SendConfirmCopyWith<$Res> { + _$PushMessage_SendConfirmCopyWithImpl(this._self, this._then); + + final PushMessage_SendConfirm _self; + final $Res Function(PushMessage_SendConfirm) _then; + +/// Create a copy of PushMessage +/// with the given fields replaced by the non-null parameter values. +@pragma('vm:prefer-inline') $Res call({Object? uuid = null,Object? error = freezed,}) { + return _then(PushMessage_SendConfirm( +uuid: null == uuid ? _self.uuid : uuid // ignore: cast_nullable_to_non_nullable +as String,error: freezed == error ? _self.error : error // ignore: cast_nullable_to_non_nullable +as String?, + )); +} + + +} + +/// @nodoc + + +class PushMessage_RegistrationState extends PushMessage { + const PushMessage_RegistrationState(this.field0): super._(); + + + final RegisterState field0; + +/// Create a copy of PushMessage +/// with the given fields replaced by the non-null parameter values. +@JsonKey(includeFromJson: false, includeToJson: false) +@pragma('vm:prefer-inline') +$PushMessage_RegistrationStateCopyWith get copyWith => _$PushMessage_RegistrationStateCopyWithImpl(this, _$identity); + + + +@override +bool operator ==(Object other) { + return identical(this, other) || (other.runtimeType == runtimeType&&other is PushMessage_RegistrationState&&(identical(other.field0, field0) || other.field0 == field0)); +} + + +@override +int get hashCode => Object.hash(runtimeType,field0); + +@override +String toString() { + return 'PushMessage.registrationState(field0: $field0)'; +} + + +} + +/// @nodoc +abstract mixin class $PushMessage_RegistrationStateCopyWith<$Res> implements $PushMessageCopyWith<$Res> { + factory $PushMessage_RegistrationStateCopyWith(PushMessage_RegistrationState value, $Res Function(PushMessage_RegistrationState) _then) = _$PushMessage_RegistrationStateCopyWithImpl; +@useResult +$Res call({ + RegisterState field0 +}); + + +$RegisterStateCopyWith<$Res> get field0; + +} +/// @nodoc +class _$PushMessage_RegistrationStateCopyWithImpl<$Res> + implements $PushMessage_RegistrationStateCopyWith<$Res> { + _$PushMessage_RegistrationStateCopyWithImpl(this._self, this._then); + + final PushMessage_RegistrationState _self; + final $Res Function(PushMessage_RegistrationState) _then; + +/// Create a copy of PushMessage +/// with the given fields replaced by the non-null parameter values. +@pragma('vm:prefer-inline') $Res call({Object? field0 = null,}) { + return _then(PushMessage_RegistrationState( +null == field0 ? _self.field0 : field0 // ignore: cast_nullable_to_non_nullable +as RegisterState, + )); +} + +/// Create a copy of PushMessage +/// with the given fields replaced by the non-null parameter values. +@override +@pragma('vm:prefer-inline') +$RegisterStateCopyWith<$Res> get field0 { + + return $RegisterStateCopyWith<$Res>(_self.field0, (value) { + return _then(_self.copyWith(field0: value)); + }); +} +} + +/// @nodoc + + +class PushMessage_NewPhotostream extends PushMessage { + const PushMessage_NewPhotostream(this.field0): super._(); + + + final SharedAlbum field0; + +/// Create a copy of PushMessage +/// with the given fields replaced by the non-null parameter values. +@JsonKey(includeFromJson: false, includeToJson: false) +@pragma('vm:prefer-inline') +$PushMessage_NewPhotostreamCopyWith get copyWith => _$PushMessage_NewPhotostreamCopyWithImpl(this, _$identity); + + + +@override +bool operator ==(Object other) { + return identical(this, other) || (other.runtimeType == runtimeType&&other is PushMessage_NewPhotostream&&(identical(other.field0, field0) || other.field0 == field0)); +} + + +@override +int get hashCode => Object.hash(runtimeType,field0); + +@override +String toString() { + return 'PushMessage.newPhotostream(field0: $field0)'; +} + + +} + +/// @nodoc +abstract mixin class $PushMessage_NewPhotostreamCopyWith<$Res> implements $PushMessageCopyWith<$Res> { + factory $PushMessage_NewPhotostreamCopyWith(PushMessage_NewPhotostream value, $Res Function(PushMessage_NewPhotostream) _then) = _$PushMessage_NewPhotostreamCopyWithImpl; +@useResult +$Res call({ + SharedAlbum field0 +}); + + + + +} +/// @nodoc +class _$PushMessage_NewPhotostreamCopyWithImpl<$Res> + implements $PushMessage_NewPhotostreamCopyWith<$Res> { + _$PushMessage_NewPhotostreamCopyWithImpl(this._self, this._then); + + final PushMessage_NewPhotostream _self; + final $Res Function(PushMessage_NewPhotostream) _then; + +/// Create a copy of PushMessage +/// with the given fields replaced by the non-null parameter values. +@pragma('vm:prefer-inline') $Res call({Object? field0 = null,}) { + return _then(PushMessage_NewPhotostream( +null == field0 ? _self.field0 : field0 // ignore: cast_nullable_to_non_nullable +as SharedAlbum, + )); +} + + +} + +/// @nodoc + + +class PushMessage_FaceTime extends PushMessage { + const PushMessage_FaceTime(this.field0): super._(); + + + final FTMessage field0; + +/// Create a copy of PushMessage +/// with the given fields replaced by the non-null parameter values. +@JsonKey(includeFromJson: false, includeToJson: false) +@pragma('vm:prefer-inline') +$PushMessage_FaceTimeCopyWith get copyWith => _$PushMessage_FaceTimeCopyWithImpl(this, _$identity); + + + +@override +bool operator ==(Object other) { + return identical(this, other) || (other.runtimeType == runtimeType&&other is PushMessage_FaceTime&&(identical(other.field0, field0) || other.field0 == field0)); +} + + +@override +int get hashCode => Object.hash(runtimeType,field0); + +@override +String toString() { + return 'PushMessage.faceTime(field0: $field0)'; +} + + +} + +/// @nodoc +abstract mixin class $PushMessage_FaceTimeCopyWith<$Res> implements $PushMessageCopyWith<$Res> { + factory $PushMessage_FaceTimeCopyWith(PushMessage_FaceTime value, $Res Function(PushMessage_FaceTime) _then) = _$PushMessage_FaceTimeCopyWithImpl; +@useResult +$Res call({ + FTMessage field0 +}); + + +$FTMessageCopyWith<$Res> get field0; + +} +/// @nodoc +class _$PushMessage_FaceTimeCopyWithImpl<$Res> + implements $PushMessage_FaceTimeCopyWith<$Res> { + _$PushMessage_FaceTimeCopyWithImpl(this._self, this._then); + + final PushMessage_FaceTime _self; + final $Res Function(PushMessage_FaceTime) _then; + +/// Create a copy of PushMessage +/// with the given fields replaced by the non-null parameter values. +@pragma('vm:prefer-inline') $Res call({Object? field0 = null,}) { + return _then(PushMessage_FaceTime( +null == field0 ? _self.field0 : field0 // ignore: cast_nullable_to_non_nullable +as FTMessage, + )); +} + +/// Create a copy of PushMessage +/// with the given fields replaced by the non-null parameter values. +@override +@pragma('vm:prefer-inline') +$FTMessageCopyWith<$Res> get field0 { + + return $FTMessageCopyWith<$Res>(_self.field0, (value) { + return _then(_self.copyWith(field0: value)); + }); +} +} + +/// @nodoc + + +class PushMessage_StatusUpdate extends PushMessage { + const PushMessage_StatusUpdate(this.field0): super._(); + + + final StatusKitMessage field0; + +/// Create a copy of PushMessage +/// with the given fields replaced by the non-null parameter values. +@JsonKey(includeFromJson: false, includeToJson: false) +@pragma('vm:prefer-inline') +$PushMessage_StatusUpdateCopyWith get copyWith => _$PushMessage_StatusUpdateCopyWithImpl(this, _$identity); + + + +@override +bool operator ==(Object other) { + return identical(this, other) || (other.runtimeType == runtimeType&&other is PushMessage_StatusUpdate&&(identical(other.field0, field0) || other.field0 == field0)); +} + + +@override +int get hashCode => Object.hash(runtimeType,field0); + +@override +String toString() { + return 'PushMessage.statusUpdate(field0: $field0)'; +} + + +} + +/// @nodoc +abstract mixin class $PushMessage_StatusUpdateCopyWith<$Res> implements $PushMessageCopyWith<$Res> { + factory $PushMessage_StatusUpdateCopyWith(PushMessage_StatusUpdate value, $Res Function(PushMessage_StatusUpdate) _then) = _$PushMessage_StatusUpdateCopyWithImpl; +@useResult +$Res call({ + StatusKitMessage field0 +}); + + +$StatusKitMessageCopyWith<$Res> get field0; + +} +/// @nodoc +class _$PushMessage_StatusUpdateCopyWithImpl<$Res> + implements $PushMessage_StatusUpdateCopyWith<$Res> { + _$PushMessage_StatusUpdateCopyWithImpl(this._self, this._then); + + final PushMessage_StatusUpdate _self; + final $Res Function(PushMessage_StatusUpdate) _then; + +/// Create a copy of PushMessage +/// with the given fields replaced by the non-null parameter values. +@pragma('vm:prefer-inline') $Res call({Object? field0 = null,}) { + return _then(PushMessage_StatusUpdate( +null == field0 ? _self.field0 : field0 // ignore: cast_nullable_to_non_nullable +as StatusKitMessage, + )); +} + +/// Create a copy of PushMessage +/// with the given fields replaced by the non-null parameter values. +@override +@pragma('vm:prefer-inline') +$StatusKitMessageCopyWith<$Res> get field0 { + + return $StatusKitMessageCopyWith<$Res>(_self.field0, (value) { + return _then(_self.copyWith(field0: value)); + }); +} +} + +/// @nodoc + + +class PushMessage_Idms extends PushMessage { + const PushMessage_Idms(this.field0): super._(); + + + final IdmsMessage field0; + +/// Create a copy of PushMessage +/// with the given fields replaced by the non-null parameter values. +@JsonKey(includeFromJson: false, includeToJson: false) +@pragma('vm:prefer-inline') +$PushMessage_IdmsCopyWith get copyWith => _$PushMessage_IdmsCopyWithImpl(this, _$identity); + + + +@override +bool operator ==(Object other) { + return identical(this, other) || (other.runtimeType == runtimeType&&other is PushMessage_Idms&&(identical(other.field0, field0) || other.field0 == field0)); +} + + +@override +int get hashCode => Object.hash(runtimeType,field0); + +@override +String toString() { + return 'PushMessage.idms(field0: $field0)'; +} + + +} + +/// @nodoc +abstract mixin class $PushMessage_IdmsCopyWith<$Res> implements $PushMessageCopyWith<$Res> { + factory $PushMessage_IdmsCopyWith(PushMessage_Idms value, $Res Function(PushMessage_Idms) _then) = _$PushMessage_IdmsCopyWithImpl; +@useResult +$Res call({ + IdmsMessage field0 +}); + + +$IdmsMessageCopyWith<$Res> get field0; + +} +/// @nodoc +class _$PushMessage_IdmsCopyWithImpl<$Res> + implements $PushMessage_IdmsCopyWith<$Res> { + _$PushMessage_IdmsCopyWithImpl(this._self, this._then); + + final PushMessage_Idms _self; + final $Res Function(PushMessage_Idms) _then; + +/// Create a copy of PushMessage +/// with the given fields replaced by the non-null parameter values. +@pragma('vm:prefer-inline') $Res call({Object? field0 = null,}) { + return _then(PushMessage_Idms( +null == field0 ? _self.field0 : field0 // ignore: cast_nullable_to_non_nullable +as IdmsMessage, + )); +} + +/// Create a copy of PushMessage +/// with the given fields replaced by the non-null parameter values. +@override +@pragma('vm:prefer-inline') +$IdmsMessageCopyWith<$Res> get field0 { + + return $IdmsMessageCopyWith<$Res>(_self.field0, (value) { + return _then(_self.copyWith(field0: value)); + }); +} +} + +/// @nodoc + + +class PushMessage_TwoFaAuthEvent extends PushMessage { + const PushMessage_TwoFaAuthEvent(this.field0): super._(); + + + final bool field0; + +/// Create a copy of PushMessage +/// with the given fields replaced by the non-null parameter values. +@JsonKey(includeFromJson: false, includeToJson: false) +@pragma('vm:prefer-inline') +$PushMessage_TwoFaAuthEventCopyWith get copyWith => _$PushMessage_TwoFaAuthEventCopyWithImpl(this, _$identity); + + + +@override +bool operator ==(Object other) { + return identical(this, other) || (other.runtimeType == runtimeType&&other is PushMessage_TwoFaAuthEvent&&(identical(other.field0, field0) || other.field0 == field0)); +} + + +@override +int get hashCode => Object.hash(runtimeType,field0); + +@override +String toString() { + return 'PushMessage.twoFaAuthEvent(field0: $field0)'; +} + + +} + +/// @nodoc +abstract mixin class $PushMessage_TwoFaAuthEventCopyWith<$Res> implements $PushMessageCopyWith<$Res> { + factory $PushMessage_TwoFaAuthEventCopyWith(PushMessage_TwoFaAuthEvent value, $Res Function(PushMessage_TwoFaAuthEvent) _then) = _$PushMessage_TwoFaAuthEventCopyWithImpl; +@useResult +$Res call({ + bool field0 +}); + + + + +} +/// @nodoc +class _$PushMessage_TwoFaAuthEventCopyWithImpl<$Res> + implements $PushMessage_TwoFaAuthEventCopyWith<$Res> { + _$PushMessage_TwoFaAuthEventCopyWithImpl(this._self, this._then); + + final PushMessage_TwoFaAuthEvent _self; + final $Res Function(PushMessage_TwoFaAuthEvent) _then; + +/// Create a copy of PushMessage +/// with the given fields replaced by the non-null parameter values. +@pragma('vm:prefer-inline') $Res call({Object? field0 = null,}) { + return _then(PushMessage_TwoFaAuthEvent( +null == field0 ? _self.field0 : field0 // ignore: cast_nullable_to_non_nullable +as bool, + )); +} + + +} + +/// @nodoc + + +class PushMessage_CircleFinishEvent extends PushMessage { + const PushMessage_CircleFinishEvent(): super._(); + + + + + + + +@override +bool operator ==(Object other) { + return identical(this, other) || (other.runtimeType == runtimeType&&other is PushMessage_CircleFinishEvent); +} + + +@override +int get hashCode => runtimeType.hashCode; + +@override +String toString() { + return 'PushMessage.circleFinishEvent()'; +} + + +} + + + + +/// @nodoc + + +class PushMessage_BeaconShared extends PushMessage { + const PushMessage_BeaconShared({required this.sender, required this.beacon, required this.attributes}): super._(); + + + final String sender; + final String beacon; + final BeaconAttributes attributes; + +/// Create a copy of PushMessage +/// with the given fields replaced by the non-null parameter values. +@JsonKey(includeFromJson: false, includeToJson: false) +@pragma('vm:prefer-inline') +$PushMessage_BeaconSharedCopyWith get copyWith => _$PushMessage_BeaconSharedCopyWithImpl(this, _$identity); + + + +@override +bool operator ==(Object other) { + return identical(this, other) || (other.runtimeType == runtimeType&&other is PushMessage_BeaconShared&&(identical(other.sender, sender) || other.sender == sender)&&(identical(other.beacon, beacon) || other.beacon == beacon)&&(identical(other.attributes, attributes) || other.attributes == attributes)); +} + + +@override +int get hashCode => Object.hash(runtimeType,sender,beacon,attributes); + +@override +String toString() { + return 'PushMessage.beaconShared(sender: $sender, beacon: $beacon, attributes: $attributes)'; +} + + +} + +/// @nodoc +abstract mixin class $PushMessage_BeaconSharedCopyWith<$Res> implements $PushMessageCopyWith<$Res> { + factory $PushMessage_BeaconSharedCopyWith(PushMessage_BeaconShared value, $Res Function(PushMessage_BeaconShared) _then) = _$PushMessage_BeaconSharedCopyWithImpl; +@useResult +$Res call({ + String sender, String beacon, BeaconAttributes attributes +}); + + + + +} +/// @nodoc +class _$PushMessage_BeaconSharedCopyWithImpl<$Res> + implements $PushMessage_BeaconSharedCopyWith<$Res> { + _$PushMessage_BeaconSharedCopyWithImpl(this._self, this._then); + + final PushMessage_BeaconShared _self; + final $Res Function(PushMessage_BeaconShared) _then; + +/// Create a copy of PushMessage +/// with the given fields replaced by the non-null parameter values. +@pragma('vm:prefer-inline') $Res call({Object? sender = null,Object? beacon = null,Object? attributes = null,}) { + return _then(PushMessage_BeaconShared( +sender: null == sender ? _self.sender : sender // ignore: cast_nullable_to_non_nullable +as String,beacon: null == beacon ? _self.beacon : beacon // ignore: cast_nullable_to_non_nullable +as String,attributes: null == attributes ? _self.attributes : attributes // ignore: cast_nullable_to_non_nullable +as BeaconAttributes, + )); +} + + +} + +/// @nodoc +mixin _$ReactMessageType { + + + + + +@override +bool operator ==(Object other) { + return identical(this, other) || (other.runtimeType == runtimeType&&other is ReactMessageType); +} + + +@override +int get hashCode => runtimeType.hashCode; + +@override +String toString() { + return 'ReactMessageType()'; +} + + +} + +/// @nodoc +class $ReactMessageTypeCopyWith<$Res> { +$ReactMessageTypeCopyWith(ReactMessageType _, $Res Function(ReactMessageType) __); +} + + +/// Adds pattern-matching-related methods to [ReactMessageType]. +extension ReactMessageTypePatterns on ReactMessageType { +/// A variant of `map` that fallback to returning `orElse`. +/// +/// It is equivalent to doing: +/// ```dart +/// switch (sealedClass) { +/// case final Subclass value: +/// return ...; +/// case _: +/// return orElse(); +/// } +/// ``` + +@optionalTypeArgs TResult maybeMap({TResult Function( ReactMessageType_React value)? react,TResult Function( ReactMessageType_Extension value)? extension_,required TResult orElse(),}){ +final _that = this; +switch (_that) { +case ReactMessageType_React() when react != null: +return react(_that);case ReactMessageType_Extension() when extension_ != null: +return extension_(_that);case _: + return orElse(); + +} +} +/// A `switch`-like method, using callbacks. +/// +/// Callbacks receives the raw object, upcasted. +/// It is equivalent to doing: +/// ```dart +/// switch (sealedClass) { +/// case final Subclass value: +/// return ...; +/// case final Subclass2 value: +/// return ...; +/// } +/// ``` + +@optionalTypeArgs TResult map({required TResult Function( ReactMessageType_React value) react,required TResult Function( ReactMessageType_Extension value) extension_,}){ +final _that = this; +switch (_that) { +case ReactMessageType_React(): +return react(_that);case ReactMessageType_Extension(): +return extension_(_that);} +} +/// A variant of `map` that fallback to returning `null`. +/// +/// It is equivalent to doing: +/// ```dart +/// switch (sealedClass) { +/// case final Subclass value: +/// return ...; +/// case _: +/// return null; +/// } +/// ``` + +@optionalTypeArgs TResult? mapOrNull({TResult? Function( ReactMessageType_React value)? react,TResult? Function( ReactMessageType_Extension value)? extension_,}){ +final _that = this; +switch (_that) { +case ReactMessageType_React() when react != null: +return react(_that);case ReactMessageType_Extension() when extension_ != null: +return extension_(_that);case _: + return null; + +} +} +/// A variant of `when` that fallback to an `orElse` callback. +/// +/// It is equivalent to doing: +/// ```dart +/// switch (sealedClass) { +/// case Subclass(:final field): +/// return ...; +/// case _: +/// return orElse(); +/// } +/// ``` + +@optionalTypeArgs TResult maybeWhen({TResult Function( Reaction reaction, bool enable)? react,TResult Function( ExtensionApp spec, MessageParts body, bool isMeta)? extension_,required TResult orElse(),}) {final _that = this; +switch (_that) { +case ReactMessageType_React() when react != null: +return react(_that.reaction,_that.enable);case ReactMessageType_Extension() when extension_ != null: +return extension_(_that.spec,_that.body,_that.isMeta);case _: + return orElse(); + +} +} +/// A `switch`-like method, using callbacks. +/// +/// As opposed to `map`, this offers destructuring. +/// It is equivalent to doing: +/// ```dart +/// switch (sealedClass) { +/// case Subclass(:final field): +/// return ...; +/// case Subclass2(:final field2): +/// return ...; +/// } +/// ``` + +@optionalTypeArgs TResult when({required TResult Function( Reaction reaction, bool enable) react,required TResult Function( ExtensionApp spec, MessageParts body, bool isMeta) extension_,}) {final _that = this; +switch (_that) { +case ReactMessageType_React(): +return react(_that.reaction,_that.enable);case ReactMessageType_Extension(): +return extension_(_that.spec,_that.body,_that.isMeta);} +} +/// A variant of `when` that fallback to returning `null` +/// +/// It is equivalent to doing: +/// ```dart +/// switch (sealedClass) { +/// case Subclass(:final field): +/// return ...; +/// case _: +/// return null; +/// } +/// ``` + +@optionalTypeArgs TResult? whenOrNull({TResult? Function( Reaction reaction, bool enable)? react,TResult? Function( ExtensionApp spec, MessageParts body, bool isMeta)? extension_,}) {final _that = this; +switch (_that) { +case ReactMessageType_React() when react != null: +return react(_that.reaction,_that.enable);case ReactMessageType_Extension() when extension_ != null: +return extension_(_that.spec,_that.body,_that.isMeta);case _: + return null; + +} +} + +} + +/// @nodoc + + +class ReactMessageType_React extends ReactMessageType { + const ReactMessageType_React({required this.reaction, required this.enable}): super._(); + + + final Reaction reaction; + final bool enable; + +/// Create a copy of ReactMessageType +/// with the given fields replaced by the non-null parameter values. +@JsonKey(includeFromJson: false, includeToJson: false) +@pragma('vm:prefer-inline') +$ReactMessageType_ReactCopyWith get copyWith => _$ReactMessageType_ReactCopyWithImpl(this, _$identity); + + + +@override +bool operator ==(Object other) { + return identical(this, other) || (other.runtimeType == runtimeType&&other is ReactMessageType_React&&(identical(other.reaction, reaction) || other.reaction == reaction)&&(identical(other.enable, enable) || other.enable == enable)); +} + + +@override +int get hashCode => Object.hash(runtimeType,reaction,enable); + +@override +String toString() { + return 'ReactMessageType.react(reaction: $reaction, enable: $enable)'; +} + + +} + +/// @nodoc +abstract mixin class $ReactMessageType_ReactCopyWith<$Res> implements $ReactMessageTypeCopyWith<$Res> { + factory $ReactMessageType_ReactCopyWith(ReactMessageType_React value, $Res Function(ReactMessageType_React) _then) = _$ReactMessageType_ReactCopyWithImpl; +@useResult +$Res call({ + Reaction reaction, bool enable +}); + + +$ReactionCopyWith<$Res> get reaction; + +} +/// @nodoc +class _$ReactMessageType_ReactCopyWithImpl<$Res> + implements $ReactMessageType_ReactCopyWith<$Res> { + _$ReactMessageType_ReactCopyWithImpl(this._self, this._then); + + final ReactMessageType_React _self; + final $Res Function(ReactMessageType_React) _then; + +/// Create a copy of ReactMessageType +/// with the given fields replaced by the non-null parameter values. +@pragma('vm:prefer-inline') $Res call({Object? reaction = null,Object? enable = null,}) { + return _then(ReactMessageType_React( +reaction: null == reaction ? _self.reaction : reaction // ignore: cast_nullable_to_non_nullable +as Reaction,enable: null == enable ? _self.enable : enable // ignore: cast_nullable_to_non_nullable +as bool, + )); +} + +/// Create a copy of ReactMessageType +/// with the given fields replaced by the non-null parameter values. +@override +@pragma('vm:prefer-inline') +$ReactionCopyWith<$Res> get reaction { + + return $ReactionCopyWith<$Res>(_self.reaction, (value) { + return _then(_self.copyWith(reaction: value)); + }); +} +} + +/// @nodoc + + +class ReactMessageType_Extension extends ReactMessageType { + const ReactMessageType_Extension({required this.spec, required this.body, required this.isMeta}): super._(); + + + final ExtensionApp spec; + final MessageParts body; + final bool isMeta; + +/// Create a copy of ReactMessageType +/// with the given fields replaced by the non-null parameter values. +@JsonKey(includeFromJson: false, includeToJson: false) +@pragma('vm:prefer-inline') +$ReactMessageType_ExtensionCopyWith get copyWith => _$ReactMessageType_ExtensionCopyWithImpl(this, _$identity); + + + +@override +bool operator ==(Object other) { + return identical(this, other) || (other.runtimeType == runtimeType&&other is ReactMessageType_Extension&&(identical(other.spec, spec) || other.spec == spec)&&(identical(other.body, body) || other.body == body)&&(identical(other.isMeta, isMeta) || other.isMeta == isMeta)); +} + + +@override +int get hashCode => Object.hash(runtimeType,spec,body,isMeta); + +@override +String toString() { + return 'ReactMessageType.extension_(spec: $spec, body: $body, isMeta: $isMeta)'; +} + + +} + +/// @nodoc +abstract mixin class $ReactMessageType_ExtensionCopyWith<$Res> implements $ReactMessageTypeCopyWith<$Res> { + factory $ReactMessageType_ExtensionCopyWith(ReactMessageType_Extension value, $Res Function(ReactMessageType_Extension) _then) = _$ReactMessageType_ExtensionCopyWithImpl; +@useResult +$Res call({ + ExtensionApp spec, MessageParts body, bool isMeta +}); + + + + +} +/// @nodoc +class _$ReactMessageType_ExtensionCopyWithImpl<$Res> + implements $ReactMessageType_ExtensionCopyWith<$Res> { + _$ReactMessageType_ExtensionCopyWithImpl(this._self, this._then); + + final ReactMessageType_Extension _self; + final $Res Function(ReactMessageType_Extension) _then; + +/// Create a copy of ReactMessageType +/// with the given fields replaced by the non-null parameter values. +@pragma('vm:prefer-inline') $Res call({Object? spec = null,Object? body = null,Object? isMeta = null,}) { + return _then(ReactMessageType_Extension( +spec: null == spec ? _self.spec : spec // ignore: cast_nullable_to_non_nullable +as ExtensionApp,body: null == body ? _self.body : body // ignore: cast_nullable_to_non_nullable +as MessageParts,isMeta: null == isMeta ? _self.isMeta : isMeta // ignore: cast_nullable_to_non_nullable +as bool, + )); +} + + +} + +/// @nodoc +mixin _$Reaction { + + + + + +@override +bool operator ==(Object other) { + return identical(this, other) || (other.runtimeType == runtimeType&&other is Reaction); +} + + +@override +int get hashCode => runtimeType.hashCode; + +@override +String toString() { + return 'Reaction()'; +} + + +} + +/// @nodoc +class $ReactionCopyWith<$Res> { +$ReactionCopyWith(Reaction _, $Res Function(Reaction) __); +} + + +/// Adds pattern-matching-related methods to [Reaction]. +extension ReactionPatterns on Reaction { +/// A variant of `map` that fallback to returning `orElse`. +/// +/// It is equivalent to doing: +/// ```dart +/// switch (sealedClass) { +/// case final Subclass value: +/// return ...; +/// case _: +/// return orElse(); +/// } +/// ``` + +@optionalTypeArgs TResult maybeMap({TResult Function( Reaction_Heart value)? heart,TResult Function( Reaction_Like value)? like,TResult Function( Reaction_Dislike value)? dislike,TResult Function( Reaction_Laugh value)? laugh,TResult Function( Reaction_Emphasize value)? emphasize,TResult Function( Reaction_Question value)? question,TResult Function( Reaction_Emoji value)? emoji,TResult Function( Reaction_Sticker value)? sticker,required TResult orElse(),}){ +final _that = this; +switch (_that) { +case Reaction_Heart() when heart != null: +return heart(_that);case Reaction_Like() when like != null: +return like(_that);case Reaction_Dislike() when dislike != null: +return dislike(_that);case Reaction_Laugh() when laugh != null: +return laugh(_that);case Reaction_Emphasize() when emphasize != null: +return emphasize(_that);case Reaction_Question() when question != null: +return question(_that);case Reaction_Emoji() when emoji != null: +return emoji(_that);case Reaction_Sticker() when sticker != null: +return sticker(_that);case _: + return orElse(); + +} +} +/// A `switch`-like method, using callbacks. +/// +/// Callbacks receives the raw object, upcasted. +/// It is equivalent to doing: +/// ```dart +/// switch (sealedClass) { +/// case final Subclass value: +/// return ...; +/// case final Subclass2 value: +/// return ...; +/// } +/// ``` + +@optionalTypeArgs TResult map({required TResult Function( Reaction_Heart value) heart,required TResult Function( Reaction_Like value) like,required TResult Function( Reaction_Dislike value) dislike,required TResult Function( Reaction_Laugh value) laugh,required TResult Function( Reaction_Emphasize value) emphasize,required TResult Function( Reaction_Question value) question,required TResult Function( Reaction_Emoji value) emoji,required TResult Function( Reaction_Sticker value) sticker,}){ +final _that = this; +switch (_that) { +case Reaction_Heart(): +return heart(_that);case Reaction_Like(): +return like(_that);case Reaction_Dislike(): +return dislike(_that);case Reaction_Laugh(): +return laugh(_that);case Reaction_Emphasize(): +return emphasize(_that);case Reaction_Question(): +return question(_that);case Reaction_Emoji(): +return emoji(_that);case Reaction_Sticker(): +return sticker(_that);} +} +/// A variant of `map` that fallback to returning `null`. +/// +/// It is equivalent to doing: +/// ```dart +/// switch (sealedClass) { +/// case final Subclass value: +/// return ...; +/// case _: +/// return null; +/// } +/// ``` + +@optionalTypeArgs TResult? mapOrNull({TResult? Function( Reaction_Heart value)? heart,TResult? Function( Reaction_Like value)? like,TResult? Function( Reaction_Dislike value)? dislike,TResult? Function( Reaction_Laugh value)? laugh,TResult? Function( Reaction_Emphasize value)? emphasize,TResult? Function( Reaction_Question value)? question,TResult? Function( Reaction_Emoji value)? emoji,TResult? Function( Reaction_Sticker value)? sticker,}){ +final _that = this; +switch (_that) { +case Reaction_Heart() when heart != null: +return heart(_that);case Reaction_Like() when like != null: +return like(_that);case Reaction_Dislike() when dislike != null: +return dislike(_that);case Reaction_Laugh() when laugh != null: +return laugh(_that);case Reaction_Emphasize() when emphasize != null: +return emphasize(_that);case Reaction_Question() when question != null: +return question(_that);case Reaction_Emoji() when emoji != null: +return emoji(_that);case Reaction_Sticker() when sticker != null: +return sticker(_that);case _: + return null; + +} +} +/// A variant of `when` that fallback to an `orElse` callback. +/// +/// It is equivalent to doing: +/// ```dart +/// switch (sealedClass) { +/// case Subclass(:final field): +/// return ...; +/// case _: +/// return orElse(); +/// } +/// ``` + +@optionalTypeArgs TResult maybeWhen({TResult Function()? heart,TResult Function()? like,TResult Function()? dislike,TResult Function()? laugh,TResult Function()? emphasize,TResult Function()? question,TResult Function( String field0)? emoji,TResult Function( ExtensionApp? spec, MessageParts body)? sticker,required TResult orElse(),}) {final _that = this; +switch (_that) { +case Reaction_Heart() when heart != null: +return heart();case Reaction_Like() when like != null: +return like();case Reaction_Dislike() when dislike != null: +return dislike();case Reaction_Laugh() when laugh != null: +return laugh();case Reaction_Emphasize() when emphasize != null: +return emphasize();case Reaction_Question() when question != null: +return question();case Reaction_Emoji() when emoji != null: +return emoji(_that.field0);case Reaction_Sticker() when sticker != null: +return sticker(_that.spec,_that.body);case _: + return orElse(); + +} +} +/// A `switch`-like method, using callbacks. +/// +/// As opposed to `map`, this offers destructuring. +/// It is equivalent to doing: +/// ```dart +/// switch (sealedClass) { +/// case Subclass(:final field): +/// return ...; +/// case Subclass2(:final field2): +/// return ...; +/// } +/// ``` + +@optionalTypeArgs TResult when({required TResult Function() heart,required TResult Function() like,required TResult Function() dislike,required TResult Function() laugh,required TResult Function() emphasize,required TResult Function() question,required TResult Function( String field0) emoji,required TResult Function( ExtensionApp? spec, MessageParts body) sticker,}) {final _that = this; +switch (_that) { +case Reaction_Heart(): +return heart();case Reaction_Like(): +return like();case Reaction_Dislike(): +return dislike();case Reaction_Laugh(): +return laugh();case Reaction_Emphasize(): +return emphasize();case Reaction_Question(): +return question();case Reaction_Emoji(): +return emoji(_that.field0);case Reaction_Sticker(): +return sticker(_that.spec,_that.body);} +} +/// A variant of `when` that fallback to returning `null` +/// +/// It is equivalent to doing: +/// ```dart +/// switch (sealedClass) { +/// case Subclass(:final field): +/// return ...; +/// case _: +/// return null; +/// } +/// ``` + +@optionalTypeArgs TResult? whenOrNull({TResult? Function()? heart,TResult? Function()? like,TResult? Function()? dislike,TResult? Function()? laugh,TResult? Function()? emphasize,TResult? Function()? question,TResult? Function( String field0)? emoji,TResult? Function( ExtensionApp? spec, MessageParts body)? sticker,}) {final _that = this; +switch (_that) { +case Reaction_Heart() when heart != null: +return heart();case Reaction_Like() when like != null: +return like();case Reaction_Dislike() when dislike != null: +return dislike();case Reaction_Laugh() when laugh != null: +return laugh();case Reaction_Emphasize() when emphasize != null: +return emphasize();case Reaction_Question() when question != null: +return question();case Reaction_Emoji() when emoji != null: +return emoji(_that.field0);case Reaction_Sticker() when sticker != null: +return sticker(_that.spec,_that.body);case _: + return null; + +} +} + +} + +/// @nodoc + + +class Reaction_Heart extends Reaction { + const Reaction_Heart(): super._(); + + + + + + + +@override +bool operator ==(Object other) { + return identical(this, other) || (other.runtimeType == runtimeType&&other is Reaction_Heart); +} + + +@override +int get hashCode => runtimeType.hashCode; + +@override +String toString() { + return 'Reaction.heart()'; +} + + +} + + + + +/// @nodoc + + +class Reaction_Like extends Reaction { + const Reaction_Like(): super._(); + + + + + + + +@override +bool operator ==(Object other) { + return identical(this, other) || (other.runtimeType == runtimeType&&other is Reaction_Like); +} + + +@override +int get hashCode => runtimeType.hashCode; + +@override +String toString() { + return 'Reaction.like()'; +} + + +} + + + + +/// @nodoc + + +class Reaction_Dislike extends Reaction { + const Reaction_Dislike(): super._(); + + + + + + + +@override +bool operator ==(Object other) { + return identical(this, other) || (other.runtimeType == runtimeType&&other is Reaction_Dislike); +} + + +@override +int get hashCode => runtimeType.hashCode; + +@override +String toString() { + return 'Reaction.dislike()'; +} + + +} + + + + +/// @nodoc + + +class Reaction_Laugh extends Reaction { + const Reaction_Laugh(): super._(); + + + + + + + +@override +bool operator ==(Object other) { + return identical(this, other) || (other.runtimeType == runtimeType&&other is Reaction_Laugh); +} + + +@override +int get hashCode => runtimeType.hashCode; + +@override +String toString() { + return 'Reaction.laugh()'; +} + + +} + + + + +/// @nodoc + + +class Reaction_Emphasize extends Reaction { + const Reaction_Emphasize(): super._(); + + + + + + + +@override +bool operator ==(Object other) { + return identical(this, other) || (other.runtimeType == runtimeType&&other is Reaction_Emphasize); +} + + +@override +int get hashCode => runtimeType.hashCode; + +@override +String toString() { + return 'Reaction.emphasize()'; +} + + +} + + + + +/// @nodoc + + +class Reaction_Question extends Reaction { + const Reaction_Question(): super._(); + + + + + + + +@override +bool operator ==(Object other) { + return identical(this, other) || (other.runtimeType == runtimeType&&other is Reaction_Question); +} + + +@override +int get hashCode => runtimeType.hashCode; + +@override +String toString() { + return 'Reaction.question()'; +} + + +} + + + + +/// @nodoc + + +class Reaction_Emoji extends Reaction { + const Reaction_Emoji(this.field0): super._(); + + + final String field0; + +/// Create a copy of Reaction +/// with the given fields replaced by the non-null parameter values. +@JsonKey(includeFromJson: false, includeToJson: false) +@pragma('vm:prefer-inline') +$Reaction_EmojiCopyWith get copyWith => _$Reaction_EmojiCopyWithImpl(this, _$identity); + + + +@override +bool operator ==(Object other) { + return identical(this, other) || (other.runtimeType == runtimeType&&other is Reaction_Emoji&&(identical(other.field0, field0) || other.field0 == field0)); +} + + +@override +int get hashCode => Object.hash(runtimeType,field0); + +@override +String toString() { + return 'Reaction.emoji(field0: $field0)'; +} + + +} + +/// @nodoc +abstract mixin class $Reaction_EmojiCopyWith<$Res> implements $ReactionCopyWith<$Res> { + factory $Reaction_EmojiCopyWith(Reaction_Emoji value, $Res Function(Reaction_Emoji) _then) = _$Reaction_EmojiCopyWithImpl; +@useResult +$Res call({ + String field0 +}); + + + + +} +/// @nodoc +class _$Reaction_EmojiCopyWithImpl<$Res> + implements $Reaction_EmojiCopyWith<$Res> { + _$Reaction_EmojiCopyWithImpl(this._self, this._then); + + final Reaction_Emoji _self; + final $Res Function(Reaction_Emoji) _then; + +/// Create a copy of Reaction +/// with the given fields replaced by the non-null parameter values. +@pragma('vm:prefer-inline') $Res call({Object? field0 = null,}) { + return _then(Reaction_Emoji( +null == field0 ? _self.field0 : field0 // ignore: cast_nullable_to_non_nullable +as String, + )); +} + + +} + +/// @nodoc + + +class Reaction_Sticker extends Reaction { + const Reaction_Sticker({this.spec, required this.body}): super._(); + + + final ExtensionApp? spec; + final MessageParts body; + +/// Create a copy of Reaction +/// with the given fields replaced by the non-null parameter values. +@JsonKey(includeFromJson: false, includeToJson: false) +@pragma('vm:prefer-inline') +$Reaction_StickerCopyWith get copyWith => _$Reaction_StickerCopyWithImpl(this, _$identity); + + + +@override +bool operator ==(Object other) { + return identical(this, other) || (other.runtimeType == runtimeType&&other is Reaction_Sticker&&(identical(other.spec, spec) || other.spec == spec)&&(identical(other.body, body) || other.body == body)); +} + + +@override +int get hashCode => Object.hash(runtimeType,spec,body); + +@override +String toString() { + return 'Reaction.sticker(spec: $spec, body: $body)'; +} + + +} + +/// @nodoc +abstract mixin class $Reaction_StickerCopyWith<$Res> implements $ReactionCopyWith<$Res> { + factory $Reaction_StickerCopyWith(Reaction_Sticker value, $Res Function(Reaction_Sticker) _then) = _$Reaction_StickerCopyWithImpl; +@useResult +$Res call({ + ExtensionApp? spec, MessageParts body +}); + + + + +} +/// @nodoc +class _$Reaction_StickerCopyWithImpl<$Res> + implements $Reaction_StickerCopyWith<$Res> { + _$Reaction_StickerCopyWithImpl(this._self, this._then); + + final Reaction_Sticker _self; + final $Res Function(Reaction_Sticker) _then; + +/// Create a copy of Reaction +/// with the given fields replaced by the non-null parameter values. +@pragma('vm:prefer-inline') $Res call({Object? spec = freezed,Object? body = null,}) { + return _then(Reaction_Sticker( +spec: freezed == spec ? _self.spec : spec // ignore: cast_nullable_to_non_nullable +as ExtensionApp?,body: null == body ? _self.body : body // ignore: cast_nullable_to_non_nullable +as MessageParts, + )); +} + + +} + +/// @nodoc +mixin _$RegisterState { + + + + + +@override +bool operator ==(Object other) { + return identical(this, other) || (other.runtimeType == runtimeType&&other is RegisterState); +} + + +@override +int get hashCode => runtimeType.hashCode; + +@override +String toString() { + return 'RegisterState()'; +} + + +} + +/// @nodoc +class $RegisterStateCopyWith<$Res> { +$RegisterStateCopyWith(RegisterState _, $Res Function(RegisterState) __); +} + + +/// Adds pattern-matching-related methods to [RegisterState]. +extension RegisterStatePatterns on RegisterState { +/// A variant of `map` that fallback to returning `orElse`. +/// +/// It is equivalent to doing: +/// ```dart +/// switch (sealedClass) { +/// case final Subclass value: +/// return ...; +/// case _: +/// return orElse(); +/// } +/// ``` + +@optionalTypeArgs TResult maybeMap({TResult Function( RegisterState_Registered value)? registered,TResult Function( RegisterState_Registering value)? registering,TResult Function( RegisterState_Failed value)? failed,required TResult orElse(),}){ +final _that = this; +switch (_that) { +case RegisterState_Registered() when registered != null: +return registered(_that);case RegisterState_Registering() when registering != null: +return registering(_that);case RegisterState_Failed() when failed != null: +return failed(_that);case _: + return orElse(); + +} +} +/// A `switch`-like method, using callbacks. +/// +/// Callbacks receives the raw object, upcasted. +/// It is equivalent to doing: +/// ```dart +/// switch (sealedClass) { +/// case final Subclass value: +/// return ...; +/// case final Subclass2 value: +/// return ...; +/// } +/// ``` + +@optionalTypeArgs TResult map({required TResult Function( RegisterState_Registered value) registered,required TResult Function( RegisterState_Registering value) registering,required TResult Function( RegisterState_Failed value) failed,}){ +final _that = this; +switch (_that) { +case RegisterState_Registered(): +return registered(_that);case RegisterState_Registering(): +return registering(_that);case RegisterState_Failed(): +return failed(_that);} +} +/// A variant of `map` that fallback to returning `null`. +/// +/// It is equivalent to doing: +/// ```dart +/// switch (sealedClass) { +/// case final Subclass value: +/// return ...; +/// case _: +/// return null; +/// } +/// ``` + +@optionalTypeArgs TResult? mapOrNull({TResult? Function( RegisterState_Registered value)? registered,TResult? Function( RegisterState_Registering value)? registering,TResult? Function( RegisterState_Failed value)? failed,}){ +final _that = this; +switch (_that) { +case RegisterState_Registered() when registered != null: +return registered(_that);case RegisterState_Registering() when registering != null: +return registering(_that);case RegisterState_Failed() when failed != null: +return failed(_that);case _: + return null; + +} +} +/// A variant of `when` that fallback to an `orElse` callback. +/// +/// It is equivalent to doing: +/// ```dart +/// switch (sealedClass) { +/// case Subclass(:final field): +/// return ...; +/// case _: +/// return orElse(); +/// } +/// ``` + +@optionalTypeArgs TResult maybeWhen({TResult Function( PlatformInt64 nextS)? registered,TResult Function()? registering,TResult Function( BigInt? retryWait, String error)? failed,required TResult orElse(),}) {final _that = this; +switch (_that) { +case RegisterState_Registered() when registered != null: +return registered(_that.nextS);case RegisterState_Registering() when registering != null: +return registering();case RegisterState_Failed() when failed != null: +return failed(_that.retryWait,_that.error);case _: + return orElse(); + +} +} +/// A `switch`-like method, using callbacks. +/// +/// As opposed to `map`, this offers destructuring. +/// It is equivalent to doing: +/// ```dart +/// switch (sealedClass) { +/// case Subclass(:final field): +/// return ...; +/// case Subclass2(:final field2): +/// return ...; +/// } +/// ``` + +@optionalTypeArgs TResult when({required TResult Function( PlatformInt64 nextS) registered,required TResult Function() registering,required TResult Function( BigInt? retryWait, String error) failed,}) {final _that = this; +switch (_that) { +case RegisterState_Registered(): +return registered(_that.nextS);case RegisterState_Registering(): +return registering();case RegisterState_Failed(): +return failed(_that.retryWait,_that.error);} +} +/// A variant of `when` that fallback to returning `null` +/// +/// It is equivalent to doing: +/// ```dart +/// switch (sealedClass) { +/// case Subclass(:final field): +/// return ...; +/// case _: +/// return null; +/// } +/// ``` + +@optionalTypeArgs TResult? whenOrNull({TResult? Function( PlatformInt64 nextS)? registered,TResult? Function()? registering,TResult? Function( BigInt? retryWait, String error)? failed,}) {final _that = this; +switch (_that) { +case RegisterState_Registered() when registered != null: +return registered(_that.nextS);case RegisterState_Registering() when registering != null: +return registering();case RegisterState_Failed() when failed != null: +return failed(_that.retryWait,_that.error);case _: + return null; + +} +} + +} + +/// @nodoc + + +class RegisterState_Registered extends RegisterState { + const RegisterState_Registered({required this.nextS}): super._(); + + + final PlatformInt64 nextS; + +/// Create a copy of RegisterState +/// with the given fields replaced by the non-null parameter values. +@JsonKey(includeFromJson: false, includeToJson: false) +@pragma('vm:prefer-inline') +$RegisterState_RegisteredCopyWith get copyWith => _$RegisterState_RegisteredCopyWithImpl(this, _$identity); + + + +@override +bool operator ==(Object other) { + return identical(this, other) || (other.runtimeType == runtimeType&&other is RegisterState_Registered&&(identical(other.nextS, nextS) || other.nextS == nextS)); +} + + +@override +int get hashCode => Object.hash(runtimeType,nextS); + +@override +String toString() { + return 'RegisterState.registered(nextS: $nextS)'; +} + + +} + +/// @nodoc +abstract mixin class $RegisterState_RegisteredCopyWith<$Res> implements $RegisterStateCopyWith<$Res> { + factory $RegisterState_RegisteredCopyWith(RegisterState_Registered value, $Res Function(RegisterState_Registered) _then) = _$RegisterState_RegisteredCopyWithImpl; +@useResult +$Res call({ + PlatformInt64 nextS +}); + + + + +} +/// @nodoc +class _$RegisterState_RegisteredCopyWithImpl<$Res> + implements $RegisterState_RegisteredCopyWith<$Res> { + _$RegisterState_RegisteredCopyWithImpl(this._self, this._then); + + final RegisterState_Registered _self; + final $Res Function(RegisterState_Registered) _then; + +/// Create a copy of RegisterState +/// with the given fields replaced by the non-null parameter values. +@pragma('vm:prefer-inline') $Res call({Object? nextS = null,}) { + return _then(RegisterState_Registered( +nextS: null == nextS ? _self.nextS : nextS // ignore: cast_nullable_to_non_nullable +as PlatformInt64, + )); +} + + +} + +/// @nodoc + + +class RegisterState_Registering extends RegisterState { + const RegisterState_Registering(): super._(); + + + + + + + +@override +bool operator ==(Object other) { + return identical(this, other) || (other.runtimeType == runtimeType&&other is RegisterState_Registering); +} + + +@override +int get hashCode => runtimeType.hashCode; + +@override +String toString() { + return 'RegisterState.registering()'; +} + + +} + + + + +/// @nodoc + + +class RegisterState_Failed extends RegisterState { + const RegisterState_Failed({this.retryWait, required this.error}): super._(); + + + final BigInt? retryWait; + final String error; + +/// Create a copy of RegisterState +/// with the given fields replaced by the non-null parameter values. +@JsonKey(includeFromJson: false, includeToJson: false) +@pragma('vm:prefer-inline') +$RegisterState_FailedCopyWith get copyWith => _$RegisterState_FailedCopyWithImpl(this, _$identity); + + + +@override +bool operator ==(Object other) { + return identical(this, other) || (other.runtimeType == runtimeType&&other is RegisterState_Failed&&(identical(other.retryWait, retryWait) || other.retryWait == retryWait)&&(identical(other.error, error) || other.error == error)); +} + + +@override +int get hashCode => Object.hash(runtimeType,retryWait,error); + +@override +String toString() { + return 'RegisterState.failed(retryWait: $retryWait, error: $error)'; +} + + +} + +/// @nodoc +abstract mixin class $RegisterState_FailedCopyWith<$Res> implements $RegisterStateCopyWith<$Res> { + factory $RegisterState_FailedCopyWith(RegisterState_Failed value, $Res Function(RegisterState_Failed) _then) = _$RegisterState_FailedCopyWithImpl; +@useResult +$Res call({ + BigInt? retryWait, String error +}); + + + + +} +/// @nodoc +class _$RegisterState_FailedCopyWithImpl<$Res> + implements $RegisterState_FailedCopyWith<$Res> { + _$RegisterState_FailedCopyWithImpl(this._self, this._then); + + final RegisterState_Failed _self; + final $Res Function(RegisterState_Failed) _then; + +/// Create a copy of RegisterState +/// with the given fields replaced by the non-null parameter values. +@pragma('vm:prefer-inline') $Res call({Object? retryWait = freezed,Object? error = null,}) { + return _then(RegisterState_Failed( +retryWait: freezed == retryWait ? _self.retryWait : retryWait // ignore: cast_nullable_to_non_nullable +as BigInt?,error: null == error ? _self.error : error // ignore: cast_nullable_to_non_nullable +as String, + )); +} + + +} + +/// @nodoc +mixin _$SetTranscriptBackgroundMessage { + + int get aid; BigInt get bid; String? get chatId; +/// Create a copy of SetTranscriptBackgroundMessage +/// with the given fields replaced by the non-null parameter values. +@JsonKey(includeFromJson: false, includeToJson: false) +@pragma('vm:prefer-inline') +$SetTranscriptBackgroundMessageCopyWith get copyWith => _$SetTranscriptBackgroundMessageCopyWithImpl(this as SetTranscriptBackgroundMessage, _$identity); + + + +@override +bool operator ==(Object other) { + return identical(this, other) || (other.runtimeType == runtimeType&&other is SetTranscriptBackgroundMessage&&(identical(other.aid, aid) || other.aid == aid)&&(identical(other.bid, bid) || other.bid == bid)&&(identical(other.chatId, chatId) || other.chatId == chatId)); +} + + +@override +int get hashCode => Object.hash(runtimeType,aid,bid,chatId); + +@override +String toString() { + return 'SetTranscriptBackgroundMessage(aid: $aid, bid: $bid, chatId: $chatId)'; +} + + +} + +/// @nodoc +abstract mixin class $SetTranscriptBackgroundMessageCopyWith<$Res> { + factory $SetTranscriptBackgroundMessageCopyWith(SetTranscriptBackgroundMessage value, $Res Function(SetTranscriptBackgroundMessage) _then) = _$SetTranscriptBackgroundMessageCopyWithImpl; +@useResult +$Res call({ + int aid, BigInt bid, String? chatId +}); + + + + +} +/// @nodoc +class _$SetTranscriptBackgroundMessageCopyWithImpl<$Res> + implements $SetTranscriptBackgroundMessageCopyWith<$Res> { + _$SetTranscriptBackgroundMessageCopyWithImpl(this._self, this._then); + + final SetTranscriptBackgroundMessage _self; + final $Res Function(SetTranscriptBackgroundMessage) _then; + +/// Create a copy of SetTranscriptBackgroundMessage +/// with the given fields replaced by the non-null parameter values. +@pragma('vm:prefer-inline') @override $Res call({Object? aid = null,Object? bid = null,Object? chatId = freezed,}) { + return _then(_self.copyWith( +aid: null == aid ? _self.aid : aid // ignore: cast_nullable_to_non_nullable +as int,bid: null == bid ? _self.bid : bid // ignore: cast_nullable_to_non_nullable +as BigInt,chatId: freezed == chatId ? _self.chatId : chatId // ignore: cast_nullable_to_non_nullable +as String?, + )); +} + +} + + +/// Adds pattern-matching-related methods to [SetTranscriptBackgroundMessage]. +extension SetTranscriptBackgroundMessagePatterns on SetTranscriptBackgroundMessage { +/// A variant of `map` that fallback to returning `orElse`. +/// +/// It is equivalent to doing: +/// ```dart +/// switch (sealedClass) { +/// case final Subclass value: +/// return ...; +/// case _: +/// return orElse(); +/// } +/// ``` + +@optionalTypeArgs TResult maybeMap({TResult Function( SetTranscriptBackgroundMessage_Remove value)? remove,TResult Function( SetTranscriptBackgroundMessage_Set value)? set_,required TResult orElse(),}){ +final _that = this; +switch (_that) { +case SetTranscriptBackgroundMessage_Remove() when remove != null: +return remove(_that);case SetTranscriptBackgroundMessage_Set() when set_ != null: +return set_(_that);case _: + return orElse(); + +} +} +/// A `switch`-like method, using callbacks. +/// +/// Callbacks receives the raw object, upcasted. +/// It is equivalent to doing: +/// ```dart +/// switch (sealedClass) { +/// case final Subclass value: +/// return ...; +/// case final Subclass2 value: +/// return ...; +/// } +/// ``` + +@optionalTypeArgs TResult map({required TResult Function( SetTranscriptBackgroundMessage_Remove value) remove,required TResult Function( SetTranscriptBackgroundMessage_Set value) set_,}){ +final _that = this; +switch (_that) { +case SetTranscriptBackgroundMessage_Remove(): +return remove(_that);case SetTranscriptBackgroundMessage_Set(): +return set_(_that);} +} +/// A variant of `map` that fallback to returning `null`. +/// +/// It is equivalent to doing: +/// ```dart +/// switch (sealedClass) { +/// case final Subclass value: +/// return ...; +/// case _: +/// return null; +/// } +/// ``` + +@optionalTypeArgs TResult? mapOrNull({TResult? Function( SetTranscriptBackgroundMessage_Remove value)? remove,TResult? Function( SetTranscriptBackgroundMessage_Set value)? set_,}){ +final _that = this; +switch (_that) { +case SetTranscriptBackgroundMessage_Remove() when remove != null: +return remove(_that);case SetTranscriptBackgroundMessage_Set() when set_ != null: +return set_(_that);case _: + return null; + +} +} +/// A variant of `when` that fallback to an `orElse` callback. +/// +/// It is equivalent to doing: +/// ```dart +/// switch (sealedClass) { +/// case Subclass(:final field): +/// return ...; +/// case _: +/// return orElse(); +/// } +/// ``` + +@optionalTypeArgs TResult maybeWhen({TResult Function( int aid, BigInt bid, String? chatId, bool remove)? remove,TResult Function( int aid, BigInt bid, String? chatId, String objectId, int payloadVersion, String backgroundId, String url, String signature, String key, BigInt fileSize)? set_,required TResult orElse(),}) {final _that = this; +switch (_that) { +case SetTranscriptBackgroundMessage_Remove() when remove != null: +return remove(_that.aid,_that.bid,_that.chatId,_that.remove);case SetTranscriptBackgroundMessage_Set() when set_ != null: +return set_(_that.aid,_that.bid,_that.chatId,_that.objectId,_that.payloadVersion,_that.backgroundId,_that.url,_that.signature,_that.key,_that.fileSize);case _: + return orElse(); + +} +} +/// A `switch`-like method, using callbacks. +/// +/// As opposed to `map`, this offers destructuring. +/// It is equivalent to doing: +/// ```dart +/// switch (sealedClass) { +/// case Subclass(:final field): +/// return ...; +/// case Subclass2(:final field2): +/// return ...; +/// } +/// ``` + +@optionalTypeArgs TResult when({required TResult Function( int aid, BigInt bid, String? chatId, bool remove) remove,required TResult Function( int aid, BigInt bid, String? chatId, String objectId, int payloadVersion, String backgroundId, String url, String signature, String key, BigInt fileSize) set_,}) {final _that = this; +switch (_that) { +case SetTranscriptBackgroundMessage_Remove(): +return remove(_that.aid,_that.bid,_that.chatId,_that.remove);case SetTranscriptBackgroundMessage_Set(): +return set_(_that.aid,_that.bid,_that.chatId,_that.objectId,_that.payloadVersion,_that.backgroundId,_that.url,_that.signature,_that.key,_that.fileSize);} +} +/// A variant of `when` that fallback to returning `null` +/// +/// It is equivalent to doing: +/// ```dart +/// switch (sealedClass) { +/// case Subclass(:final field): +/// return ...; +/// case _: +/// return null; +/// } +/// ``` + +@optionalTypeArgs TResult? whenOrNull({TResult? Function( int aid, BigInt bid, String? chatId, bool remove)? remove,TResult? Function( int aid, BigInt bid, String? chatId, String objectId, int payloadVersion, String backgroundId, String url, String signature, String key, BigInt fileSize)? set_,}) {final _that = this; +switch (_that) { +case SetTranscriptBackgroundMessage_Remove() when remove != null: +return remove(_that.aid,_that.bid,_that.chatId,_that.remove);case SetTranscriptBackgroundMessage_Set() when set_ != null: +return set_(_that.aid,_that.bid,_that.chatId,_that.objectId,_that.payloadVersion,_that.backgroundId,_that.url,_that.signature,_that.key,_that.fileSize);case _: + return null; + +} +} - @override - @optionalTypeArgs - TResult maybeWhen({ - TResult Function(int nextS)? registered, - TResult Function()? registering, - TResult Function(BigInt? retryWait, String error)? failed, - required TResult orElse(), - }) { - if (registering != null) { - return registering(); - } - return orElse(); - } +} - @override - @optionalTypeArgs - TResult map({ - required TResult Function(RegisterState_Registered value) registered, - required TResult Function(RegisterState_Registering value) registering, - required TResult Function(RegisterState_Failed value) failed, - }) { - return registering(this); - } +/// @nodoc + + +class SetTranscriptBackgroundMessage_Remove extends SetTranscriptBackgroundMessage { + const SetTranscriptBackgroundMessage_Remove({required this.aid, required this.bid, this.chatId, required this.remove}): super._(); + + +@override final int aid; +@override final BigInt bid; +@override final String? chatId; + final bool remove; + +/// Create a copy of SetTranscriptBackgroundMessage +/// with the given fields replaced by the non-null parameter values. +@override @JsonKey(includeFromJson: false, includeToJson: false) +@pragma('vm:prefer-inline') +$SetTranscriptBackgroundMessage_RemoveCopyWith get copyWith => _$SetTranscriptBackgroundMessage_RemoveCopyWithImpl(this, _$identity); + + + +@override +bool operator ==(Object other) { + return identical(this, other) || (other.runtimeType == runtimeType&&other is SetTranscriptBackgroundMessage_Remove&&(identical(other.aid, aid) || other.aid == aid)&&(identical(other.bid, bid) || other.bid == bid)&&(identical(other.chatId, chatId) || other.chatId == chatId)&&(identical(other.remove, remove) || other.remove == remove)); +} + + +@override +int get hashCode => Object.hash(runtimeType,aid,bid,chatId,remove); + +@override +String toString() { + return 'SetTranscriptBackgroundMessage.remove(aid: $aid, bid: $bid, chatId: $chatId, remove: $remove)'; +} + + +} + +/// @nodoc +abstract mixin class $SetTranscriptBackgroundMessage_RemoveCopyWith<$Res> implements $SetTranscriptBackgroundMessageCopyWith<$Res> { + factory $SetTranscriptBackgroundMessage_RemoveCopyWith(SetTranscriptBackgroundMessage_Remove value, $Res Function(SetTranscriptBackgroundMessage_Remove) _then) = _$SetTranscriptBackgroundMessage_RemoveCopyWithImpl; +@override @useResult +$Res call({ + int aid, BigInt bid, String? chatId, bool remove +}); + + + + +} +/// @nodoc +class _$SetTranscriptBackgroundMessage_RemoveCopyWithImpl<$Res> + implements $SetTranscriptBackgroundMessage_RemoveCopyWith<$Res> { + _$SetTranscriptBackgroundMessage_RemoveCopyWithImpl(this._self, this._then); + + final SetTranscriptBackgroundMessage_Remove _self; + final $Res Function(SetTranscriptBackgroundMessage_Remove) _then; + +/// Create a copy of SetTranscriptBackgroundMessage +/// with the given fields replaced by the non-null parameter values. +@override @pragma('vm:prefer-inline') $Res call({Object? aid = null,Object? bid = null,Object? chatId = freezed,Object? remove = null,}) { + return _then(SetTranscriptBackgroundMessage_Remove( +aid: null == aid ? _self.aid : aid // ignore: cast_nullable_to_non_nullable +as int,bid: null == bid ? _self.bid : bid // ignore: cast_nullable_to_non_nullable +as BigInt,chatId: freezed == chatId ? _self.chatId : chatId // ignore: cast_nullable_to_non_nullable +as String?,remove: null == remove ? _self.remove : remove // ignore: cast_nullable_to_non_nullable +as bool, + )); +} + + +} + +/// @nodoc + + +class SetTranscriptBackgroundMessage_Set extends SetTranscriptBackgroundMessage { + const SetTranscriptBackgroundMessage_Set({required this.aid, required this.bid, this.chatId, required this.objectId, required this.payloadVersion, required this.backgroundId, required this.url, required this.signature, required this.key, required this.fileSize}): super._(); + + +@override final int aid; +@override final BigInt bid; +@override final String? chatId; + final String objectId; + final int payloadVersion; + final String backgroundId; + final String url; + final String signature; + final String key; + final BigInt fileSize; + +/// Create a copy of SetTranscriptBackgroundMessage +/// with the given fields replaced by the non-null parameter values. +@override @JsonKey(includeFromJson: false, includeToJson: false) +@pragma('vm:prefer-inline') +$SetTranscriptBackgroundMessage_SetCopyWith get copyWith => _$SetTranscriptBackgroundMessage_SetCopyWithImpl(this, _$identity); + + + +@override +bool operator ==(Object other) { + return identical(this, other) || (other.runtimeType == runtimeType&&other is SetTranscriptBackgroundMessage_Set&&(identical(other.aid, aid) || other.aid == aid)&&(identical(other.bid, bid) || other.bid == bid)&&(identical(other.chatId, chatId) || other.chatId == chatId)&&(identical(other.objectId, objectId) || other.objectId == objectId)&&(identical(other.payloadVersion, payloadVersion) || other.payloadVersion == payloadVersion)&&(identical(other.backgroundId, backgroundId) || other.backgroundId == backgroundId)&&(identical(other.url, url) || other.url == url)&&(identical(other.signature, signature) || other.signature == signature)&&(identical(other.key, key) || other.key == key)&&(identical(other.fileSize, fileSize) || other.fileSize == fileSize)); +} + + +@override +int get hashCode => Object.hash(runtimeType,aid,bid,chatId,objectId,payloadVersion,backgroundId,url,signature,key,fileSize); + +@override +String toString() { + return 'SetTranscriptBackgroundMessage.set_(aid: $aid, bid: $bid, chatId: $chatId, objectId: $objectId, payloadVersion: $payloadVersion, backgroundId: $backgroundId, url: $url, signature: $signature, key: $key, fileSize: $fileSize)'; +} + + +} + +/// @nodoc +abstract mixin class $SetTranscriptBackgroundMessage_SetCopyWith<$Res> implements $SetTranscriptBackgroundMessageCopyWith<$Res> { + factory $SetTranscriptBackgroundMessage_SetCopyWith(SetTranscriptBackgroundMessage_Set value, $Res Function(SetTranscriptBackgroundMessage_Set) _then) = _$SetTranscriptBackgroundMessage_SetCopyWithImpl; +@override @useResult +$Res call({ + int aid, BigInt bid, String? chatId, String objectId, int payloadVersion, String backgroundId, String url, String signature, String key, BigInt fileSize +}); + + + + +} +/// @nodoc +class _$SetTranscriptBackgroundMessage_SetCopyWithImpl<$Res> + implements $SetTranscriptBackgroundMessage_SetCopyWith<$Res> { + _$SetTranscriptBackgroundMessage_SetCopyWithImpl(this._self, this._then); + + final SetTranscriptBackgroundMessage_Set _self; + final $Res Function(SetTranscriptBackgroundMessage_Set) _then; + +/// Create a copy of SetTranscriptBackgroundMessage +/// with the given fields replaced by the non-null parameter values. +@override @pragma('vm:prefer-inline') $Res call({Object? aid = null,Object? bid = null,Object? chatId = freezed,Object? objectId = null,Object? payloadVersion = null,Object? backgroundId = null,Object? url = null,Object? signature = null,Object? key = null,Object? fileSize = null,}) { + return _then(SetTranscriptBackgroundMessage_Set( +aid: null == aid ? _self.aid : aid // ignore: cast_nullable_to_non_nullable +as int,bid: null == bid ? _self.bid : bid // ignore: cast_nullable_to_non_nullable +as BigInt,chatId: freezed == chatId ? _self.chatId : chatId // ignore: cast_nullable_to_non_nullable +as String?,objectId: null == objectId ? _self.objectId : objectId // ignore: cast_nullable_to_non_nullable +as String,payloadVersion: null == payloadVersion ? _self.payloadVersion : payloadVersion // ignore: cast_nullable_to_non_nullable +as int,backgroundId: null == backgroundId ? _self.backgroundId : backgroundId // ignore: cast_nullable_to_non_nullable +as String,url: null == url ? _self.url : url // ignore: cast_nullable_to_non_nullable +as String,signature: null == signature ? _self.signature : signature // ignore: cast_nullable_to_non_nullable +as String,key: null == key ? _self.key : key // ignore: cast_nullable_to_non_nullable +as String,fileSize: null == fileSize ? _self.fileSize : fileSize // ignore: cast_nullable_to_non_nullable +as BigInt, + )); +} + + +} + +/// @nodoc +mixin _$StatusKitMessage { + + String get user; String? get mode; bool get allowed; +/// Create a copy of StatusKitMessage +/// with the given fields replaced by the non-null parameter values. +@JsonKey(includeFromJson: false, includeToJson: false) +@pragma('vm:prefer-inline') +$StatusKitMessageCopyWith get copyWith => _$StatusKitMessageCopyWithImpl(this as StatusKitMessage, _$identity); + + + +@override +bool operator ==(Object other) { + return identical(this, other) || (other.runtimeType == runtimeType&&other is StatusKitMessage&&(identical(other.user, user) || other.user == user)&&(identical(other.mode, mode) || other.mode == mode)&&(identical(other.allowed, allowed) || other.allowed == allowed)); +} + + +@override +int get hashCode => Object.hash(runtimeType,user,mode,allowed); + +@override +String toString() { + return 'StatusKitMessage(user: $user, mode: $mode, allowed: $allowed)'; +} + + +} + +/// @nodoc +abstract mixin class $StatusKitMessageCopyWith<$Res> { + factory $StatusKitMessageCopyWith(StatusKitMessage value, $Res Function(StatusKitMessage) _then) = _$StatusKitMessageCopyWithImpl; +@useResult +$Res call({ + String user, String? mode, bool allowed +}); + + + + +} +/// @nodoc +class _$StatusKitMessageCopyWithImpl<$Res> + implements $StatusKitMessageCopyWith<$Res> { + _$StatusKitMessageCopyWithImpl(this._self, this._then); + + final StatusKitMessage _self; + final $Res Function(StatusKitMessage) _then; + +/// Create a copy of StatusKitMessage +/// with the given fields replaced by the non-null parameter values. +@pragma('vm:prefer-inline') @override $Res call({Object? user = null,Object? mode = freezed,Object? allowed = null,}) { + return _then(_self.copyWith( +user: null == user ? _self.user : user // ignore: cast_nullable_to_non_nullable +as String,mode: freezed == mode ? _self.mode : mode // ignore: cast_nullable_to_non_nullable +as String?,allowed: null == allowed ? _self.allowed : allowed // ignore: cast_nullable_to_non_nullable +as bool, + )); +} + +} + + +/// Adds pattern-matching-related methods to [StatusKitMessage]. +extension StatusKitMessagePatterns on StatusKitMessage { +/// A variant of `map` that fallback to returning `orElse`. +/// +/// It is equivalent to doing: +/// ```dart +/// switch (sealedClass) { +/// case final Subclass value: +/// return ...; +/// case _: +/// return orElse(); +/// } +/// ``` + +@optionalTypeArgs TResult maybeMap({TResult Function( StatusKitMessage_StatusChanged value)? statusChanged,required TResult orElse(),}){ +final _that = this; +switch (_that) { +case StatusKitMessage_StatusChanged() when statusChanged != null: +return statusChanged(_that);case _: + return orElse(); + +} +} +/// A `switch`-like method, using callbacks. +/// +/// Callbacks receives the raw object, upcasted. +/// It is equivalent to doing: +/// ```dart +/// switch (sealedClass) { +/// case final Subclass value: +/// return ...; +/// case final Subclass2 value: +/// return ...; +/// } +/// ``` + +@optionalTypeArgs TResult map({required TResult Function( StatusKitMessage_StatusChanged value) statusChanged,}){ +final _that = this; +switch (_that) { +case StatusKitMessage_StatusChanged(): +return statusChanged(_that);} +} +/// A variant of `map` that fallback to returning `null`. +/// +/// It is equivalent to doing: +/// ```dart +/// switch (sealedClass) { +/// case final Subclass value: +/// return ...; +/// case _: +/// return null; +/// } +/// ``` + +@optionalTypeArgs TResult? mapOrNull({TResult? Function( StatusKitMessage_StatusChanged value)? statusChanged,}){ +final _that = this; +switch (_that) { +case StatusKitMessage_StatusChanged() when statusChanged != null: +return statusChanged(_that);case _: + return null; + +} +} +/// A variant of `when` that fallback to an `orElse` callback. +/// +/// It is equivalent to doing: +/// ```dart +/// switch (sealedClass) { +/// case Subclass(:final field): +/// return ...; +/// case _: +/// return orElse(); +/// } +/// ``` + +@optionalTypeArgs TResult maybeWhen({TResult Function( String user, String? mode, bool allowed)? statusChanged,required TResult orElse(),}) {final _that = this; +switch (_that) { +case StatusKitMessage_StatusChanged() when statusChanged != null: +return statusChanged(_that.user,_that.mode,_that.allowed);case _: + return orElse(); + +} +} +/// A `switch`-like method, using callbacks. +/// +/// As opposed to `map`, this offers destructuring. +/// It is equivalent to doing: +/// ```dart +/// switch (sealedClass) { +/// case Subclass(:final field): +/// return ...; +/// case Subclass2(:final field2): +/// return ...; +/// } +/// ``` + +@optionalTypeArgs TResult when({required TResult Function( String user, String? mode, bool allowed) statusChanged,}) {final _that = this; +switch (_that) { +case StatusKitMessage_StatusChanged(): +return statusChanged(_that.user,_that.mode,_that.allowed);} +} +/// A variant of `when` that fallback to returning `null` +/// +/// It is equivalent to doing: +/// ```dart +/// switch (sealedClass) { +/// case Subclass(:final field): +/// return ...; +/// case _: +/// return null; +/// } +/// ``` + +@optionalTypeArgs TResult? whenOrNull({TResult? Function( String user, String? mode, bool allowed)? statusChanged,}) {final _that = this; +switch (_that) { +case StatusKitMessage_StatusChanged() when statusChanged != null: +return statusChanged(_that.user,_that.mode,_that.allowed);case _: + return null; + +} +} + +} + +/// @nodoc + + +class StatusKitMessage_StatusChanged extends StatusKitMessage { + const StatusKitMessage_StatusChanged({required this.user, this.mode, required this.allowed}): super._(); + + +@override final String user; +@override final String? mode; +@override final bool allowed; + +/// Create a copy of StatusKitMessage +/// with the given fields replaced by the non-null parameter values. +@override @JsonKey(includeFromJson: false, includeToJson: false) +@pragma('vm:prefer-inline') +$StatusKitMessage_StatusChangedCopyWith get copyWith => _$StatusKitMessage_StatusChangedCopyWithImpl(this, _$identity); + + + +@override +bool operator ==(Object other) { + return identical(this, other) || (other.runtimeType == runtimeType&&other is StatusKitMessage_StatusChanged&&(identical(other.user, user) || other.user == user)&&(identical(other.mode, mode) || other.mode == mode)&&(identical(other.allowed, allowed) || other.allowed == allowed)); +} + + +@override +int get hashCode => Object.hash(runtimeType,user,mode,allowed); + +@override +String toString() { + return 'StatusKitMessage.statusChanged(user: $user, mode: $mode, allowed: $allowed)'; +} + + +} + +/// @nodoc +abstract mixin class $StatusKitMessage_StatusChangedCopyWith<$Res> implements $StatusKitMessageCopyWith<$Res> { + factory $StatusKitMessage_StatusChangedCopyWith(StatusKitMessage_StatusChanged value, $Res Function(StatusKitMessage_StatusChanged) _then) = _$StatusKitMessage_StatusChangedCopyWithImpl; +@override @useResult +$Res call({ + String user, String? mode, bool allowed +}); + + + + +} +/// @nodoc +class _$StatusKitMessage_StatusChangedCopyWithImpl<$Res> + implements $StatusKitMessage_StatusChangedCopyWith<$Res> { + _$StatusKitMessage_StatusChangedCopyWithImpl(this._self, this._then); + + final StatusKitMessage_StatusChanged _self; + final $Res Function(StatusKitMessage_StatusChanged) _then; + +/// Create a copy of StatusKitMessage +/// with the given fields replaced by the non-null parameter values. +@override @pragma('vm:prefer-inline') $Res call({Object? user = null,Object? mode = freezed,Object? allowed = null,}) { + return _then(StatusKitMessage_StatusChanged( +user: null == user ? _self.user : user // ignore: cast_nullable_to_non_nullable +as String,mode: freezed == mode ? _self.mode : mode // ignore: cast_nullable_to_non_nullable +as String?,allowed: null == allowed ? _self.allowed : allowed // ignore: cast_nullable_to_non_nullable +as bool, + )); +} + + +} + +/// @nodoc +mixin _$SyncStatus { + + + + + +@override +bool operator ==(Object other) { + return identical(this, other) || (other.runtimeType == runtimeType&&other is SyncStatus); +} + + +@override +int get hashCode => runtimeType.hashCode; + +@override +String toString() { + return 'SyncStatus()'; +} + + +} + +/// @nodoc +class $SyncStatusCopyWith<$Res> { +$SyncStatusCopyWith(SyncStatus _, $Res Function(SyncStatus) __); +} + + +/// Adds pattern-matching-related methods to [SyncStatus]. +extension SyncStatusPatterns on SyncStatus { +/// A variant of `map` that fallback to returning `orElse`. +/// +/// It is equivalent to doing: +/// ```dart +/// switch (sealedClass) { +/// case final Subclass value: +/// return ...; +/// case _: +/// return orElse(); +/// } +/// ``` + +@optionalTypeArgs TResult maybeMap({TResult Function( SyncStatus_Synced value)? synced,TResult Function( SyncStatus_Downloading value)? downloading,TResult Function( SyncStatus_Uploading value)? uploading,TResult Function( SyncStatus_Syncing value)? syncing,required TResult orElse(),}){ +final _that = this; +switch (_that) { +case SyncStatus_Synced() when synced != null: +return synced(_that);case SyncStatus_Downloading() when downloading != null: +return downloading(_that);case SyncStatus_Uploading() when uploading != null: +return uploading(_that);case SyncStatus_Syncing() when syncing != null: +return syncing(_that);case _: + return orElse(); + +} +} +/// A `switch`-like method, using callbacks. +/// +/// Callbacks receives the raw object, upcasted. +/// It is equivalent to doing: +/// ```dart +/// switch (sealedClass) { +/// case final Subclass value: +/// return ...; +/// case final Subclass2 value: +/// return ...; +/// } +/// ``` + +@optionalTypeArgs TResult map({required TResult Function( SyncStatus_Synced value) synced,required TResult Function( SyncStatus_Downloading value) downloading,required TResult Function( SyncStatus_Uploading value) uploading,required TResult Function( SyncStatus_Syncing value) syncing,}){ +final _that = this; +switch (_that) { +case SyncStatus_Synced(): +return synced(_that);case SyncStatus_Downloading(): +return downloading(_that);case SyncStatus_Uploading(): +return uploading(_that);case SyncStatus_Syncing(): +return syncing(_that);} +} +/// A variant of `map` that fallback to returning `null`. +/// +/// It is equivalent to doing: +/// ```dart +/// switch (sealedClass) { +/// case final Subclass value: +/// return ...; +/// case _: +/// return null; +/// } +/// ``` + +@optionalTypeArgs TResult? mapOrNull({TResult? Function( SyncStatus_Synced value)? synced,TResult? Function( SyncStatus_Downloading value)? downloading,TResult? Function( SyncStatus_Uploading value)? uploading,TResult? Function( SyncStatus_Syncing value)? syncing,}){ +final _that = this; +switch (_that) { +case SyncStatus_Synced() when synced != null: +return synced(_that);case SyncStatus_Downloading() when downloading != null: +return downloading(_that);case SyncStatus_Uploading() when uploading != null: +return uploading(_that);case SyncStatus_Syncing() when syncing != null: +return syncing(_that);case _: + return null; + +} +} +/// A variant of `when` that fallback to an `orElse` callback. +/// +/// It is equivalent to doing: +/// ```dart +/// switch (sealedClass) { +/// case Subclass(:final field): +/// return ...; +/// case _: +/// return orElse(); +/// } +/// ``` + +@optionalTypeArgs TResult maybeWhen({TResult Function()? synced,TResult Function( BigInt progress, BigInt total)? downloading,TResult Function( BigInt progress, BigInt total)? uploading,TResult Function()? syncing,required TResult orElse(),}) {final _that = this; +switch (_that) { +case SyncStatus_Synced() when synced != null: +return synced();case SyncStatus_Downloading() when downloading != null: +return downloading(_that.progress,_that.total);case SyncStatus_Uploading() when uploading != null: +return uploading(_that.progress,_that.total);case SyncStatus_Syncing() when syncing != null: +return syncing();case _: + return orElse(); + +} +} +/// A `switch`-like method, using callbacks. +/// +/// As opposed to `map`, this offers destructuring. +/// It is equivalent to doing: +/// ```dart +/// switch (sealedClass) { +/// case Subclass(:final field): +/// return ...; +/// case Subclass2(:final field2): +/// return ...; +/// } +/// ``` + +@optionalTypeArgs TResult when({required TResult Function() synced,required TResult Function( BigInt progress, BigInt total) downloading,required TResult Function( BigInt progress, BigInt total) uploading,required TResult Function() syncing,}) {final _that = this; +switch (_that) { +case SyncStatus_Synced(): +return synced();case SyncStatus_Downloading(): +return downloading(_that.progress,_that.total);case SyncStatus_Uploading(): +return uploading(_that.progress,_that.total);case SyncStatus_Syncing(): +return syncing();} +} +/// A variant of `when` that fallback to returning `null` +/// +/// It is equivalent to doing: +/// ```dart +/// switch (sealedClass) { +/// case Subclass(:final field): +/// return ...; +/// case _: +/// return null; +/// } +/// ``` + +@optionalTypeArgs TResult? whenOrNull({TResult? Function()? synced,TResult? Function( BigInt progress, BigInt total)? downloading,TResult? Function( BigInt progress, BigInt total)? uploading,TResult? Function()? syncing,}) {final _that = this; +switch (_that) { +case SyncStatus_Synced() when synced != null: +return synced();case SyncStatus_Downloading() when downloading != null: +return downloading(_that.progress,_that.total);case SyncStatus_Uploading() when uploading != null: +return uploading(_that.progress,_that.total);case SyncStatus_Syncing() when syncing != null: +return syncing();case _: + return null; + +} +} + +} + +/// @nodoc + + +class SyncStatus_Synced extends SyncStatus { + const SyncStatus_Synced(): super._(); + + + + + + + +@override +bool operator ==(Object other) { + return identical(this, other) || (other.runtimeType == runtimeType&&other is SyncStatus_Synced); +} + + +@override +int get hashCode => runtimeType.hashCode; + +@override +String toString() { + return 'SyncStatus.synced()'; +} + + +} + + + + +/// @nodoc + + +class SyncStatus_Downloading extends SyncStatus { + const SyncStatus_Downloading({required this.progress, required this.total}): super._(); + + + final BigInt progress; + final BigInt total; + +/// Create a copy of SyncStatus +/// with the given fields replaced by the non-null parameter values. +@JsonKey(includeFromJson: false, includeToJson: false) +@pragma('vm:prefer-inline') +$SyncStatus_DownloadingCopyWith get copyWith => _$SyncStatus_DownloadingCopyWithImpl(this, _$identity); + + + +@override +bool operator ==(Object other) { + return identical(this, other) || (other.runtimeType == runtimeType&&other is SyncStatus_Downloading&&(identical(other.progress, progress) || other.progress == progress)&&(identical(other.total, total) || other.total == total)); +} + + +@override +int get hashCode => Object.hash(runtimeType,progress,total); + +@override +String toString() { + return 'SyncStatus.downloading(progress: $progress, total: $total)'; +} + + +} + +/// @nodoc +abstract mixin class $SyncStatus_DownloadingCopyWith<$Res> implements $SyncStatusCopyWith<$Res> { + factory $SyncStatus_DownloadingCopyWith(SyncStatus_Downloading value, $Res Function(SyncStatus_Downloading) _then) = _$SyncStatus_DownloadingCopyWithImpl; +@useResult +$Res call({ + BigInt progress, BigInt total +}); + + + + +} +/// @nodoc +class _$SyncStatus_DownloadingCopyWithImpl<$Res> + implements $SyncStatus_DownloadingCopyWith<$Res> { + _$SyncStatus_DownloadingCopyWithImpl(this._self, this._then); + + final SyncStatus_Downloading _self; + final $Res Function(SyncStatus_Downloading) _then; + +/// Create a copy of SyncStatus +/// with the given fields replaced by the non-null parameter values. +@pragma('vm:prefer-inline') $Res call({Object? progress = null,Object? total = null,}) { + return _then(SyncStatus_Downloading( +progress: null == progress ? _self.progress : progress // ignore: cast_nullable_to_non_nullable +as BigInt,total: null == total ? _self.total : total // ignore: cast_nullable_to_non_nullable +as BigInt, + )); +} + + +} + +/// @nodoc + + +class SyncStatus_Uploading extends SyncStatus { + const SyncStatus_Uploading({required this.progress, required this.total}): super._(); + + + final BigInt progress; + final BigInt total; + +/// Create a copy of SyncStatus +/// with the given fields replaced by the non-null parameter values. +@JsonKey(includeFromJson: false, includeToJson: false) +@pragma('vm:prefer-inline') +$SyncStatus_UploadingCopyWith get copyWith => _$SyncStatus_UploadingCopyWithImpl(this, _$identity); + + + +@override +bool operator ==(Object other) { + return identical(this, other) || (other.runtimeType == runtimeType&&other is SyncStatus_Uploading&&(identical(other.progress, progress) || other.progress == progress)&&(identical(other.total, total) || other.total == total)); +} + + +@override +int get hashCode => Object.hash(runtimeType,progress,total); + +@override +String toString() { + return 'SyncStatus.uploading(progress: $progress, total: $total)'; +} + + +} + +/// @nodoc +abstract mixin class $SyncStatus_UploadingCopyWith<$Res> implements $SyncStatusCopyWith<$Res> { + factory $SyncStatus_UploadingCopyWith(SyncStatus_Uploading value, $Res Function(SyncStatus_Uploading) _then) = _$SyncStatus_UploadingCopyWithImpl; +@useResult +$Res call({ + BigInt progress, BigInt total +}); + + + + +} +/// @nodoc +class _$SyncStatus_UploadingCopyWithImpl<$Res> + implements $SyncStatus_UploadingCopyWith<$Res> { + _$SyncStatus_UploadingCopyWithImpl(this._self, this._then); - @override - @optionalTypeArgs - TResult? mapOrNull({ - TResult? Function(RegisterState_Registered value)? registered, - TResult? Function(RegisterState_Registering value)? registering, - TResult? Function(RegisterState_Failed value)? failed, - }) { - return registering?.call(this); - } + final SyncStatus_Uploading _self; + final $Res Function(SyncStatus_Uploading) _then; - @override - @optionalTypeArgs - TResult maybeMap({ - TResult Function(RegisterState_Registered value)? registered, - TResult Function(RegisterState_Registering value)? registering, - TResult Function(RegisterState_Failed value)? failed, - required TResult orElse(), - }) { - if (registering != null) { - return registering(this); - } - return orElse(); - } +/// Create a copy of SyncStatus +/// with the given fields replaced by the non-null parameter values. +@pragma('vm:prefer-inline') $Res call({Object? progress = null,Object? total = null,}) { + return _then(SyncStatus_Uploading( +progress: null == progress ? _self.progress : progress // ignore: cast_nullable_to_non_nullable +as BigInt,total: null == total ? _self.total : total // ignore: cast_nullable_to_non_nullable +as BigInt, + )); } -abstract class RegisterState_Registering extends RegisterState { - const factory RegisterState_Registering() = _$RegisterState_RegisteringImpl; - const RegisterState_Registering._() : super._(); -} - -/// @nodoc -abstract class _$$RegisterState_FailedImplCopyWith<$Res> { - factory _$$RegisterState_FailedImplCopyWith(_$RegisterState_FailedImpl value, - $Res Function(_$RegisterState_FailedImpl) then) = - __$$RegisterState_FailedImplCopyWithImpl<$Res>; - @useResult - $Res call({BigInt? retryWait, String error}); -} - -/// @nodoc -class __$$RegisterState_FailedImplCopyWithImpl<$Res> - extends _$RegisterStateCopyWithImpl<$Res, _$RegisterState_FailedImpl> - implements _$$RegisterState_FailedImplCopyWith<$Res> { - __$$RegisterState_FailedImplCopyWithImpl(_$RegisterState_FailedImpl _value, - $Res Function(_$RegisterState_FailedImpl) _then) - : super(_value, _then); - - /// Create a copy of RegisterState - /// with the given fields replaced by the non-null parameter values. - @pragma('vm:prefer-inline') - @override - $Res call({ - Object? retryWait = freezed, - Object? error = null, - }) { - return _then(_$RegisterState_FailedImpl( - retryWait: freezed == retryWait - ? _value.retryWait - : retryWait // ignore: cast_nullable_to_non_nullable - as BigInt?, - error: null == error - ? _value.error - : error // ignore: cast_nullable_to_non_nullable - as String, - )); - } + } /// @nodoc -class _$RegisterState_FailedImpl extends RegisterState_Failed { - const _$RegisterState_FailedImpl({this.retryWait, required this.error}) - : super._(); - - @override - final BigInt? retryWait; - @override - final String error; - @override - String toString() { - return 'RegisterState.failed(retryWait: $retryWait, error: $error)'; - } +class SyncStatus_Syncing extends SyncStatus { + const SyncStatus_Syncing(): super._(); - @override - bool operator ==(Object other) { - return identical(this, other) || - (other.runtimeType == runtimeType && - other is _$RegisterState_FailedImpl && - (identical(other.retryWait, retryWait) || - other.retryWait == retryWait) && - (identical(other.error, error) || other.error == error)); - } - @override - int get hashCode => Object.hash(runtimeType, retryWait, error); - - /// Create a copy of RegisterState - /// with the given fields replaced by the non-null parameter values. - @JsonKey(includeFromJson: false, includeToJson: false) - @override - @pragma('vm:prefer-inline') - _$$RegisterState_FailedImplCopyWith<_$RegisterState_FailedImpl> - get copyWith => - __$$RegisterState_FailedImplCopyWithImpl<_$RegisterState_FailedImpl>( - this, _$identity); - - @override - @optionalTypeArgs - TResult when({ - required TResult Function(int nextS) registered, - required TResult Function() registering, - required TResult Function(BigInt? retryWait, String error) failed, - }) { - return failed(retryWait, error); - } - @override - @optionalTypeArgs - TResult? whenOrNull({ - TResult? Function(int nextS)? registered, - TResult? Function()? registering, - TResult? Function(BigInt? retryWait, String error)? failed, - }) { - return failed?.call(retryWait, error); - } - @override - @optionalTypeArgs - TResult maybeWhen({ - TResult Function(int nextS)? registered, - TResult Function()? registering, - TResult Function(BigInt? retryWait, String error)? failed, - required TResult orElse(), - }) { - if (failed != null) { - return failed(retryWait, error); - } - return orElse(); - } - @override - @optionalTypeArgs - TResult map({ - required TResult Function(RegisterState_Registered value) registered, - required TResult Function(RegisterState_Registering value) registering, - required TResult Function(RegisterState_Failed value) failed, - }) { - return failed(this); - } - @override - @optionalTypeArgs - TResult? mapOrNull({ - TResult? Function(RegisterState_Registered value)? registered, - TResult? Function(RegisterState_Registering value)? registering, - TResult? Function(RegisterState_Failed value)? failed, - }) { - return failed?.call(this); - } - @override - @optionalTypeArgs - TResult maybeMap({ - TResult Function(RegisterState_Registered value)? registered, - TResult Function(RegisterState_Registering value)? registering, - TResult Function(RegisterState_Failed value)? failed, - required TResult orElse(), - }) { - if (failed != null) { - return failed(this); - } - return orElse(); - } +@override +bool operator ==(Object other) { + return identical(this, other) || (other.runtimeType == runtimeType&&other is SyncStatus_Syncing); } -abstract class RegisterState_Failed extends RegisterState { - const factory RegisterState_Failed( - {final BigInt? retryWait, - required final String error}) = _$RegisterState_FailedImpl; - const RegisterState_Failed._() : super._(); - BigInt? get retryWait; - String get error; +@override +int get hashCode => runtimeType.hashCode; - /// Create a copy of RegisterState - /// with the given fields replaced by the non-null parameter values. - @JsonKey(includeFromJson: false, includeToJson: false) - _$$RegisterState_FailedImplCopyWith<_$RegisterState_FailedImpl> - get copyWith => throw _privateConstructorUsedError; +@override +String toString() { + return 'SyncStatus.syncing()'; } -/// @nodoc -mixin _$SetTranscriptBackgroundMessage { - int get aid => throw _privateConstructorUsedError; - BigInt get bid => throw _privateConstructorUsedError; - String? get chatId => throw _privateConstructorUsedError; - @optionalTypeArgs - TResult when({ - required TResult Function(int aid, BigInt bid, String? chatId, bool remove) - remove, - required TResult Function( - int aid, - BigInt bid, - String? chatId, - String objectId, - int payloadVersion, - String backgroundId, - String url, - String signature, - String key, - BigInt fileSize) - set_, - }) => - throw _privateConstructorUsedError; - @optionalTypeArgs - TResult? whenOrNull({ - TResult? Function(int aid, BigInt bid, String? chatId, bool remove)? remove, - TResult? Function( - int aid, - BigInt bid, - String? chatId, - String objectId, - int payloadVersion, - String backgroundId, - String url, - String signature, - String key, - BigInt fileSize)? - set_, - }) => - throw _privateConstructorUsedError; - @optionalTypeArgs - TResult maybeWhen({ - TResult Function(int aid, BigInt bid, String? chatId, bool remove)? remove, - TResult Function( - int aid, - BigInt bid, - String? chatId, - String objectId, - int payloadVersion, - String backgroundId, - String url, - String signature, - String key, - BigInt fileSize)? - set_, - required TResult orElse(), - }) => - throw _privateConstructorUsedError; - @optionalTypeArgs - TResult map({ - required TResult Function(SetTranscriptBackgroundMessage_Remove value) - remove, - required TResult Function(SetTranscriptBackgroundMessage_Set value) set_, - }) => - throw _privateConstructorUsedError; - @optionalTypeArgs - TResult? mapOrNull({ - TResult? Function(SetTranscriptBackgroundMessage_Remove value)? remove, - TResult? Function(SetTranscriptBackgroundMessage_Set value)? set_, - }) => - throw _privateConstructorUsedError; - @optionalTypeArgs - TResult maybeMap({ - TResult Function(SetTranscriptBackgroundMessage_Remove value)? remove, - TResult Function(SetTranscriptBackgroundMessage_Set value)? set_, - required TResult orElse(), - }) => - throw _privateConstructorUsedError; - - /// Create a copy of SetTranscriptBackgroundMessage - /// with the given fields replaced by the non-null parameter values. - @JsonKey(includeFromJson: false, includeToJson: false) - $SetTranscriptBackgroundMessageCopyWith - get copyWith => throw _privateConstructorUsedError; -} - -/// @nodoc -abstract class $SetTranscriptBackgroundMessageCopyWith<$Res> { - factory $SetTranscriptBackgroundMessageCopyWith( - SetTranscriptBackgroundMessage value, - $Res Function(SetTranscriptBackgroundMessage) then) = - _$SetTranscriptBackgroundMessageCopyWithImpl<$Res, - SetTranscriptBackgroundMessage>; - @useResult - $Res call({int aid, BigInt bid, String? chatId}); -} - -/// @nodoc -class _$SetTranscriptBackgroundMessageCopyWithImpl<$Res, - $Val extends SetTranscriptBackgroundMessage> - implements $SetTranscriptBackgroundMessageCopyWith<$Res> { - _$SetTranscriptBackgroundMessageCopyWithImpl(this._value, this._then); - - // ignore: unused_field - final $Val _value; - // ignore: unused_field - final $Res Function($Val) _then; - - /// Create a copy of SetTranscriptBackgroundMessage - /// with the given fields replaced by the non-null parameter values. - @pragma('vm:prefer-inline') - @override - $Res call({ - Object? aid = null, - Object? bid = null, - Object? chatId = freezed, - }) { - return _then(_value.copyWith( - aid: null == aid - ? _value.aid - : aid // ignore: cast_nullable_to_non_nullable - as int, - bid: null == bid - ? _value.bid - : bid // ignore: cast_nullable_to_non_nullable - as BigInt, - chatId: freezed == chatId - ? _value.chatId - : chatId // ignore: cast_nullable_to_non_nullable - as String?, - ) as $Val); - } -} -/// @nodoc -abstract class _$$SetTranscriptBackgroundMessage_RemoveImplCopyWith<$Res> - implements $SetTranscriptBackgroundMessageCopyWith<$Res> { - factory _$$SetTranscriptBackgroundMessage_RemoveImplCopyWith( - _$SetTranscriptBackgroundMessage_RemoveImpl value, - $Res Function(_$SetTranscriptBackgroundMessage_RemoveImpl) then) = - __$$SetTranscriptBackgroundMessage_RemoveImplCopyWithImpl<$Res>; - @override - @useResult - $Res call({int aid, BigInt bid, String? chatId, bool remove}); -} - -/// @nodoc -class __$$SetTranscriptBackgroundMessage_RemoveImplCopyWithImpl<$Res> - extends _$SetTranscriptBackgroundMessageCopyWithImpl<$Res, - _$SetTranscriptBackgroundMessage_RemoveImpl> - implements _$$SetTranscriptBackgroundMessage_RemoveImplCopyWith<$Res> { - __$$SetTranscriptBackgroundMessage_RemoveImplCopyWithImpl( - _$SetTranscriptBackgroundMessage_RemoveImpl _value, - $Res Function(_$SetTranscriptBackgroundMessage_RemoveImpl) _then) - : super(_value, _then); - - /// Create a copy of SetTranscriptBackgroundMessage - /// with the given fields replaced by the non-null parameter values. - @pragma('vm:prefer-inline') - @override - $Res call({ - Object? aid = null, - Object? bid = null, - Object? chatId = freezed, - Object? remove = null, - }) { - return _then(_$SetTranscriptBackgroundMessage_RemoveImpl( - aid: null == aid - ? _value.aid - : aid // ignore: cast_nullable_to_non_nullable - as int, - bid: null == bid - ? _value.bid - : bid // ignore: cast_nullable_to_non_nullable - as BigInt, - chatId: freezed == chatId - ? _value.chatId - : chatId // ignore: cast_nullable_to_non_nullable - as String?, - remove: null == remove - ? _value.remove - : remove // ignore: cast_nullable_to_non_nullable - as bool, - )); - } } -/// @nodoc -class _$SetTranscriptBackgroundMessage_RemoveImpl - extends SetTranscriptBackgroundMessage_Remove { - const _$SetTranscriptBackgroundMessage_RemoveImpl( - {required this.aid, required this.bid, this.chatId, required this.remove}) - : super._(); - @override - final int aid; - @override - final BigInt bid; - @override - final String? chatId; - @override - final bool remove; - @override - String toString() { - return 'SetTranscriptBackgroundMessage.remove(aid: $aid, bid: $bid, chatId: $chatId, remove: $remove)'; - } +/// @nodoc +mixin _$TextFormat { - @override - bool operator ==(Object other) { - return identical(this, other) || - (other.runtimeType == runtimeType && - other is _$SetTranscriptBackgroundMessage_RemoveImpl && - (identical(other.aid, aid) || other.aid == aid) && - (identical(other.bid, bid) || other.bid == bid) && - (identical(other.chatId, chatId) || other.chatId == chatId) && - (identical(other.remove, remove) || other.remove == remove)); - } + Object get field0; - @override - int get hashCode => Object.hash(runtimeType, aid, bid, chatId, remove); - - /// Create a copy of SetTranscriptBackgroundMessage - /// with the given fields replaced by the non-null parameter values. - @JsonKey(includeFromJson: false, includeToJson: false) - @override - @pragma('vm:prefer-inline') - _$$SetTranscriptBackgroundMessage_RemoveImplCopyWith< - _$SetTranscriptBackgroundMessage_RemoveImpl> - get copyWith => __$$SetTranscriptBackgroundMessage_RemoveImplCopyWithImpl< - _$SetTranscriptBackgroundMessage_RemoveImpl>(this, _$identity); - - @override - @optionalTypeArgs - TResult when({ - required TResult Function(int aid, BigInt bid, String? chatId, bool remove) - remove, - required TResult Function( - int aid, - BigInt bid, - String? chatId, - String objectId, - int payloadVersion, - String backgroundId, - String url, - String signature, - String key, - BigInt fileSize) - set_, - }) { - return remove(aid, bid, chatId, this.remove); - } - @override - @optionalTypeArgs - TResult? whenOrNull({ - TResult? Function(int aid, BigInt bid, String? chatId, bool remove)? remove, - TResult? Function( - int aid, - BigInt bid, - String? chatId, - String objectId, - int payloadVersion, - String backgroundId, - String url, - String signature, - String key, - BigInt fileSize)? - set_, - }) { - return remove?.call(aid, bid, chatId, this.remove); - } - @override - @optionalTypeArgs - TResult maybeWhen({ - TResult Function(int aid, BigInt bid, String? chatId, bool remove)? remove, - TResult Function( - int aid, - BigInt bid, - String? chatId, - String objectId, - int payloadVersion, - String backgroundId, - String url, - String signature, - String key, - BigInt fileSize)? - set_, - required TResult orElse(), - }) { - if (remove != null) { - return remove(aid, bid, chatId, this.remove); - } - return orElse(); - } +@override +bool operator ==(Object other) { + return identical(this, other) || (other.runtimeType == runtimeType&&other is TextFormat&&const DeepCollectionEquality().equals(other.field0, field0)); +} - @override - @optionalTypeArgs - TResult map({ - required TResult Function(SetTranscriptBackgroundMessage_Remove value) - remove, - required TResult Function(SetTranscriptBackgroundMessage_Set value) set_, - }) { - return remove(this); - } - @override - @optionalTypeArgs - TResult? mapOrNull({ - TResult? Function(SetTranscriptBackgroundMessage_Remove value)? remove, - TResult? Function(SetTranscriptBackgroundMessage_Set value)? set_, - }) { - return remove?.call(this); - } +@override +int get hashCode => Object.hash(runtimeType,const DeepCollectionEquality().hash(field0)); - @override - @optionalTypeArgs - TResult maybeMap({ - TResult Function(SetTranscriptBackgroundMessage_Remove value)? remove, - TResult Function(SetTranscriptBackgroundMessage_Set value)? set_, - required TResult orElse(), - }) { - if (remove != null) { - return remove(this); - } - return orElse(); - } +@override +String toString() { + return 'TextFormat(field0: $field0)'; } -abstract class SetTranscriptBackgroundMessage_Remove - extends SetTranscriptBackgroundMessage { - const factory SetTranscriptBackgroundMessage_Remove( - {required final int aid, - required final BigInt bid, - final String? chatId, - required final bool remove}) = - _$SetTranscriptBackgroundMessage_RemoveImpl; - const SetTranscriptBackgroundMessage_Remove._() : super._(); - @override - int get aid; - @override - BigInt get bid; - @override - String? get chatId; - bool get remove; - - /// Create a copy of SetTranscriptBackgroundMessage - /// with the given fields replaced by the non-null parameter values. - @override - @JsonKey(includeFromJson: false, includeToJson: false) - _$$SetTranscriptBackgroundMessage_RemoveImplCopyWith< - _$SetTranscriptBackgroundMessage_RemoveImpl> - get copyWith => throw _privateConstructorUsedError; } /// @nodoc -abstract class _$$SetTranscriptBackgroundMessage_SetImplCopyWith<$Res> - implements $SetTranscriptBackgroundMessageCopyWith<$Res> { - factory _$$SetTranscriptBackgroundMessage_SetImplCopyWith( - _$SetTranscriptBackgroundMessage_SetImpl value, - $Res Function(_$SetTranscriptBackgroundMessage_SetImpl) then) = - __$$SetTranscriptBackgroundMessage_SetImplCopyWithImpl<$Res>; - @override - @useResult - $Res call( - {int aid, - BigInt bid, - String? chatId, - String objectId, - int payloadVersion, - String backgroundId, - String url, - String signature, - String key, - BigInt fileSize}); -} - -/// @nodoc -class __$$SetTranscriptBackgroundMessage_SetImplCopyWithImpl<$Res> - extends _$SetTranscriptBackgroundMessageCopyWithImpl<$Res, - _$SetTranscriptBackgroundMessage_SetImpl> - implements _$$SetTranscriptBackgroundMessage_SetImplCopyWith<$Res> { - __$$SetTranscriptBackgroundMessage_SetImplCopyWithImpl( - _$SetTranscriptBackgroundMessage_SetImpl _value, - $Res Function(_$SetTranscriptBackgroundMessage_SetImpl) _then) - : super(_value, _then); - - /// Create a copy of SetTranscriptBackgroundMessage - /// with the given fields replaced by the non-null parameter values. - @pragma('vm:prefer-inline') - @override - $Res call({ - Object? aid = null, - Object? bid = null, - Object? chatId = freezed, - Object? objectId = null, - Object? payloadVersion = null, - Object? backgroundId = null, - Object? url = null, - Object? signature = null, - Object? key = null, - Object? fileSize = null, - }) { - return _then(_$SetTranscriptBackgroundMessage_SetImpl( - aid: null == aid - ? _value.aid - : aid // ignore: cast_nullable_to_non_nullable - as int, - bid: null == bid - ? _value.bid - : bid // ignore: cast_nullable_to_non_nullable - as BigInt, - chatId: freezed == chatId - ? _value.chatId - : chatId // ignore: cast_nullable_to_non_nullable - as String?, - objectId: null == objectId - ? _value.objectId - : objectId // ignore: cast_nullable_to_non_nullable - as String, - payloadVersion: null == payloadVersion - ? _value.payloadVersion - : payloadVersion // ignore: cast_nullable_to_non_nullable - as int, - backgroundId: null == backgroundId - ? _value.backgroundId - : backgroundId // ignore: cast_nullable_to_non_nullable - as String, - url: null == url - ? _value.url - : url // ignore: cast_nullable_to_non_nullable - as String, - signature: null == signature - ? _value.signature - : signature // ignore: cast_nullable_to_non_nullable - as String, - key: null == key - ? _value.key - : key // ignore: cast_nullable_to_non_nullable - as String, - fileSize: null == fileSize - ? _value.fileSize - : fileSize // ignore: cast_nullable_to_non_nullable - as BigInt, - )); - } +class $TextFormatCopyWith<$Res> { +$TextFormatCopyWith(TextFormat _, $Res Function(TextFormat) __); } -/// @nodoc - -class _$SetTranscriptBackgroundMessage_SetImpl - extends SetTranscriptBackgroundMessage_Set { - const _$SetTranscriptBackgroundMessage_SetImpl( - {required this.aid, - required this.bid, - this.chatId, - required this.objectId, - required this.payloadVersion, - required this.backgroundId, - required this.url, - required this.signature, - required this.key, - required this.fileSize}) - : super._(); - - @override - final int aid; - @override - final BigInt bid; - @override - final String? chatId; - @override - final String objectId; - @override - final int payloadVersion; - @override - final String backgroundId; - @override - final String url; - @override - final String signature; - @override - final String key; - @override - final BigInt fileSize; - - @override - String toString() { - return 'SetTranscriptBackgroundMessage.set_(aid: $aid, bid: $bid, chatId: $chatId, objectId: $objectId, payloadVersion: $payloadVersion, backgroundId: $backgroundId, url: $url, signature: $signature, key: $key, fileSize: $fileSize)'; - } - - @override - bool operator ==(Object other) { - return identical(this, other) || - (other.runtimeType == runtimeType && - other is _$SetTranscriptBackgroundMessage_SetImpl && - (identical(other.aid, aid) || other.aid == aid) && - (identical(other.bid, bid) || other.bid == bid) && - (identical(other.chatId, chatId) || other.chatId == chatId) && - (identical(other.objectId, objectId) || - other.objectId == objectId) && - (identical(other.payloadVersion, payloadVersion) || - other.payloadVersion == payloadVersion) && - (identical(other.backgroundId, backgroundId) || - other.backgroundId == backgroundId) && - (identical(other.url, url) || other.url == url) && - (identical(other.signature, signature) || - other.signature == signature) && - (identical(other.key, key) || other.key == key) && - (identical(other.fileSize, fileSize) || - other.fileSize == fileSize)); - } - @override - int get hashCode => Object.hash(runtimeType, aid, bid, chatId, objectId, - payloadVersion, backgroundId, url, signature, key, fileSize); - - /// Create a copy of SetTranscriptBackgroundMessage - /// with the given fields replaced by the non-null parameter values. - @JsonKey(includeFromJson: false, includeToJson: false) - @override - @pragma('vm:prefer-inline') - _$$SetTranscriptBackgroundMessage_SetImplCopyWith< - _$SetTranscriptBackgroundMessage_SetImpl> - get copyWith => __$$SetTranscriptBackgroundMessage_SetImplCopyWithImpl< - _$SetTranscriptBackgroundMessage_SetImpl>(this, _$identity); - - @override - @optionalTypeArgs - TResult when({ - required TResult Function(int aid, BigInt bid, String? chatId, bool remove) - remove, - required TResult Function( - int aid, - BigInt bid, - String? chatId, - String objectId, - int payloadVersion, - String backgroundId, - String url, - String signature, - String key, - BigInt fileSize) - set_, - }) { - return set_(aid, bid, chatId, objectId, payloadVersion, backgroundId, url, - signature, key, fileSize); - } +/// Adds pattern-matching-related methods to [TextFormat]. +extension TextFormatPatterns on TextFormat { +/// A variant of `map` that fallback to returning `orElse`. +/// +/// It is equivalent to doing: +/// ```dart +/// switch (sealedClass) { +/// case final Subclass value: +/// return ...; +/// case _: +/// return orElse(); +/// } +/// ``` + +@optionalTypeArgs TResult maybeMap({TResult Function( TextFormat_Flags value)? flags,TResult Function( TextFormat_Effect value)? effect,required TResult orElse(),}){ +final _that = this; +switch (_that) { +case TextFormat_Flags() when flags != null: +return flags(_that);case TextFormat_Effect() when effect != null: +return effect(_that);case _: + return orElse(); + +} +} +/// A `switch`-like method, using callbacks. +/// +/// Callbacks receives the raw object, upcasted. +/// It is equivalent to doing: +/// ```dart +/// switch (sealedClass) { +/// case final Subclass value: +/// return ...; +/// case final Subclass2 value: +/// return ...; +/// } +/// ``` - @override - @optionalTypeArgs - TResult? whenOrNull({ - TResult? Function(int aid, BigInt bid, String? chatId, bool remove)? remove, - TResult? Function( - int aid, - BigInt bid, - String? chatId, - String objectId, - int payloadVersion, - String backgroundId, - String url, - String signature, - String key, - BigInt fileSize)? - set_, - }) { - return set_?.call(aid, bid, chatId, objectId, payloadVersion, backgroundId, - url, signature, key, fileSize); - } +@optionalTypeArgs TResult map({required TResult Function( TextFormat_Flags value) flags,required TResult Function( TextFormat_Effect value) effect,}){ +final _that = this; +switch (_that) { +case TextFormat_Flags(): +return flags(_that);case TextFormat_Effect(): +return effect(_that);} +} +/// A variant of `map` that fallback to returning `null`. +/// +/// It is equivalent to doing: +/// ```dart +/// switch (sealedClass) { +/// case final Subclass value: +/// return ...; +/// case _: +/// return null; +/// } +/// ``` - @override - @optionalTypeArgs - TResult maybeWhen({ - TResult Function(int aid, BigInt bid, String? chatId, bool remove)? remove, - TResult Function( - int aid, - BigInt bid, - String? chatId, - String objectId, - int payloadVersion, - String backgroundId, - String url, - String signature, - String key, - BigInt fileSize)? - set_, - required TResult orElse(), - }) { - if (set_ != null) { - return set_(aid, bid, chatId, objectId, payloadVersion, backgroundId, url, - signature, key, fileSize); - } - return orElse(); - } +@optionalTypeArgs TResult? mapOrNull({TResult? Function( TextFormat_Flags value)? flags,TResult? Function( TextFormat_Effect value)? effect,}){ +final _that = this; +switch (_that) { +case TextFormat_Flags() when flags != null: +return flags(_that);case TextFormat_Effect() when effect != null: +return effect(_that);case _: + return null; - @override - @optionalTypeArgs - TResult map({ - required TResult Function(SetTranscriptBackgroundMessage_Remove value) - remove, - required TResult Function(SetTranscriptBackgroundMessage_Set value) set_, - }) { - return set_(this); - } +} +} +/// A variant of `when` that fallback to an `orElse` callback. +/// +/// It is equivalent to doing: +/// ```dart +/// switch (sealedClass) { +/// case Subclass(:final field): +/// return ...; +/// case _: +/// return orElse(); +/// } +/// ``` - @override - @optionalTypeArgs - TResult? mapOrNull({ - TResult? Function(SetTranscriptBackgroundMessage_Remove value)? remove, - TResult? Function(SetTranscriptBackgroundMessage_Set value)? set_, - }) { - return set_?.call(this); - } +@optionalTypeArgs TResult maybeWhen({TResult Function( TextFlags field0)? flags,TResult Function( TextEffect field0)? effect,required TResult orElse(),}) {final _that = this; +switch (_that) { +case TextFormat_Flags() when flags != null: +return flags(_that.field0);case TextFormat_Effect() when effect != null: +return effect(_that.field0);case _: + return orElse(); - @override - @optionalTypeArgs - TResult maybeMap({ - TResult Function(SetTranscriptBackgroundMessage_Remove value)? remove, - TResult Function(SetTranscriptBackgroundMessage_Set value)? set_, - required TResult orElse(), - }) { - if (set_ != null) { - return set_(this); - } - return orElse(); - } } +} +/// A `switch`-like method, using callbacks. +/// +/// As opposed to `map`, this offers destructuring. +/// It is equivalent to doing: +/// ```dart +/// switch (sealedClass) { +/// case Subclass(:final field): +/// return ...; +/// case Subclass2(:final field2): +/// return ...; +/// } +/// ``` -abstract class SetTranscriptBackgroundMessage_Set - extends SetTranscriptBackgroundMessage { - const factory SetTranscriptBackgroundMessage_Set( - {required final int aid, - required final BigInt bid, - final String? chatId, - required final String objectId, - required final int payloadVersion, - required final String backgroundId, - required final String url, - required final String signature, - required final String key, - required final BigInt fileSize}) = - _$SetTranscriptBackgroundMessage_SetImpl; - const SetTranscriptBackgroundMessage_Set._() : super._(); - - @override - int get aid; - @override - BigInt get bid; - @override - String? get chatId; - String get objectId; - int get payloadVersion; - String get backgroundId; - String get url; - String get signature; - String get key; - BigInt get fileSize; - - /// Create a copy of SetTranscriptBackgroundMessage - /// with the given fields replaced by the non-null parameter values. - @override - @JsonKey(includeFromJson: false, includeToJson: false) - _$$SetTranscriptBackgroundMessage_SetImplCopyWith< - _$SetTranscriptBackgroundMessage_SetImpl> - get copyWith => throw _privateConstructorUsedError; +@optionalTypeArgs TResult when({required TResult Function( TextFlags field0) flags,required TResult Function( TextEffect field0) effect,}) {final _that = this; +switch (_that) { +case TextFormat_Flags(): +return flags(_that.field0);case TextFormat_Effect(): +return effect(_that.field0);} } +/// A variant of `when` that fallback to returning `null` +/// +/// It is equivalent to doing: +/// ```dart +/// switch (sealedClass) { +/// case Subclass(:final field): +/// return ...; +/// case _: +/// return null; +/// } +/// ``` -/// @nodoc -mixin _$StatusKitMessage { - String get user => throw _privateConstructorUsedError; - String? get mode => throw _privateConstructorUsedError; - bool get allowed => throw _privateConstructorUsedError; - @optionalTypeArgs - TResult when({ - required TResult Function(String user, String? mode, bool allowed) - statusChanged, - }) => - throw _privateConstructorUsedError; - @optionalTypeArgs - TResult? whenOrNull({ - TResult? Function(String user, String? mode, bool allowed)? statusChanged, - }) => - throw _privateConstructorUsedError; - @optionalTypeArgs - TResult maybeWhen({ - TResult Function(String user, String? mode, bool allowed)? statusChanged, - required TResult orElse(), - }) => - throw _privateConstructorUsedError; - @optionalTypeArgs - TResult map({ - required TResult Function(StatusKitMessage_StatusChanged value) - statusChanged, - }) => - throw _privateConstructorUsedError; - @optionalTypeArgs - TResult? mapOrNull({ - TResult? Function(StatusKitMessage_StatusChanged value)? statusChanged, - }) => - throw _privateConstructorUsedError; - @optionalTypeArgs - TResult maybeMap({ - TResult Function(StatusKitMessage_StatusChanged value)? statusChanged, - required TResult orElse(), - }) => - throw _privateConstructorUsedError; - - /// Create a copy of StatusKitMessage - /// with the given fields replaced by the non-null parameter values. - @JsonKey(includeFromJson: false, includeToJson: false) - $StatusKitMessageCopyWith get copyWith => - throw _privateConstructorUsedError; -} - -/// @nodoc -abstract class $StatusKitMessageCopyWith<$Res> { - factory $StatusKitMessageCopyWith( - StatusKitMessage value, $Res Function(StatusKitMessage) then) = - _$StatusKitMessageCopyWithImpl<$Res, StatusKitMessage>; - @useResult - $Res call({String user, String? mode, bool allowed}); -} - -/// @nodoc -class _$StatusKitMessageCopyWithImpl<$Res, $Val extends StatusKitMessage> - implements $StatusKitMessageCopyWith<$Res> { - _$StatusKitMessageCopyWithImpl(this._value, this._then); - - // ignore: unused_field - final $Val _value; - // ignore: unused_field - final $Res Function($Val) _then; - - /// Create a copy of StatusKitMessage - /// with the given fields replaced by the non-null parameter values. - @pragma('vm:prefer-inline') - @override - $Res call({ - Object? user = null, - Object? mode = freezed, - Object? allowed = null, - }) { - return _then(_value.copyWith( - user: null == user - ? _value.user - : user // ignore: cast_nullable_to_non_nullable - as String, - mode: freezed == mode - ? _value.mode - : mode // ignore: cast_nullable_to_non_nullable - as String?, - allowed: null == allowed - ? _value.allowed - : allowed // ignore: cast_nullable_to_non_nullable - as bool, - ) as $Val); - } +@optionalTypeArgs TResult? whenOrNull({TResult? Function( TextFlags field0)? flags,TResult? Function( TextEffect field0)? effect,}) {final _that = this; +switch (_that) { +case TextFormat_Flags() when flags != null: +return flags(_that.field0);case TextFormat_Effect() when effect != null: +return effect(_that.field0);case _: + return null; + +} } -/// @nodoc -abstract class _$$StatusKitMessage_StatusChangedImplCopyWith<$Res> - implements $StatusKitMessageCopyWith<$Res> { - factory _$$StatusKitMessage_StatusChangedImplCopyWith( - _$StatusKitMessage_StatusChangedImpl value, - $Res Function(_$StatusKitMessage_StatusChangedImpl) then) = - __$$StatusKitMessage_StatusChangedImplCopyWithImpl<$Res>; - @override - @useResult - $Res call({String user, String? mode, bool allowed}); -} - -/// @nodoc -class __$$StatusKitMessage_StatusChangedImplCopyWithImpl<$Res> - extends _$StatusKitMessageCopyWithImpl<$Res, - _$StatusKitMessage_StatusChangedImpl> - implements _$$StatusKitMessage_StatusChangedImplCopyWith<$Res> { - __$$StatusKitMessage_StatusChangedImplCopyWithImpl( - _$StatusKitMessage_StatusChangedImpl _value, - $Res Function(_$StatusKitMessage_StatusChangedImpl) _then) - : super(_value, _then); - - /// Create a copy of StatusKitMessage - /// with the given fields replaced by the non-null parameter values. - @pragma('vm:prefer-inline') - @override - $Res call({ - Object? user = null, - Object? mode = freezed, - Object? allowed = null, - }) { - return _then(_$StatusKitMessage_StatusChangedImpl( - user: null == user - ? _value.user - : user // ignore: cast_nullable_to_non_nullable - as String, - mode: freezed == mode - ? _value.mode - : mode // ignore: cast_nullable_to_non_nullable - as String?, - allowed: null == allowed - ? _value.allowed - : allowed // ignore: cast_nullable_to_non_nullable - as bool, - )); - } } /// @nodoc -class _$StatusKitMessage_StatusChangedImpl - extends StatusKitMessage_StatusChanged { - const _$StatusKitMessage_StatusChangedImpl( - {required this.user, this.mode, required this.allowed}) - : super._(); - @override - final String user; - @override - final String? mode; - @override - final bool allowed; +class TextFormat_Flags extends TextFormat { + const TextFormat_Flags(this.field0): super._(); - @override - String toString() { - return 'StatusKitMessage.statusChanged(user: $user, mode: $mode, allowed: $allowed)'; - } - @override - bool operator ==(Object other) { - return identical(this, other) || - (other.runtimeType == runtimeType && - other is _$StatusKitMessage_StatusChangedImpl && - (identical(other.user, user) || other.user == user) && - (identical(other.mode, mode) || other.mode == mode) && - (identical(other.allowed, allowed) || other.allowed == allowed)); - } +@override final TextFlags field0; - @override - int get hashCode => Object.hash(runtimeType, user, mode, allowed); - - /// Create a copy of StatusKitMessage - /// with the given fields replaced by the non-null parameter values. - @JsonKey(includeFromJson: false, includeToJson: false) - @override - @pragma('vm:prefer-inline') - _$$StatusKitMessage_StatusChangedImplCopyWith< - _$StatusKitMessage_StatusChangedImpl> - get copyWith => __$$StatusKitMessage_StatusChangedImplCopyWithImpl< - _$StatusKitMessage_StatusChangedImpl>(this, _$identity); - - @override - @optionalTypeArgs - TResult when({ - required TResult Function(String user, String? mode, bool allowed) - statusChanged, - }) { - return statusChanged(user, mode, allowed); - } +/// Create a copy of TextFormat +/// with the given fields replaced by the non-null parameter values. +@JsonKey(includeFromJson: false, includeToJson: false) +@pragma('vm:prefer-inline') +$TextFormat_FlagsCopyWith get copyWith => _$TextFormat_FlagsCopyWithImpl(this, _$identity); - @override - @optionalTypeArgs - TResult? whenOrNull({ - TResult? Function(String user, String? mode, bool allowed)? statusChanged, - }) { - return statusChanged?.call(user, mode, allowed); - } - @override - @optionalTypeArgs - TResult maybeWhen({ - TResult Function(String user, String? mode, bool allowed)? statusChanged, - required TResult orElse(), - }) { - if (statusChanged != null) { - return statusChanged(user, mode, allowed); - } - return orElse(); - } - @override - @optionalTypeArgs - TResult map({ - required TResult Function(StatusKitMessage_StatusChanged value) - statusChanged, - }) { - return statusChanged(this); - } +@override +bool operator ==(Object other) { + return identical(this, other) || (other.runtimeType == runtimeType&&other is TextFormat_Flags&&(identical(other.field0, field0) || other.field0 == field0)); +} - @override - @optionalTypeArgs - TResult? mapOrNull({ - TResult? Function(StatusKitMessage_StatusChanged value)? statusChanged, - }) { - return statusChanged?.call(this); - } - @override - @optionalTypeArgs - TResult maybeMap({ - TResult Function(StatusKitMessage_StatusChanged value)? statusChanged, - required TResult orElse(), - }) { - if (statusChanged != null) { - return statusChanged(this); - } - return orElse(); - } -} +@override +int get hashCode => Object.hash(runtimeType,field0); -abstract class StatusKitMessage_StatusChanged extends StatusKitMessage { - const factory StatusKitMessage_StatusChanged( - {required final String user, - final String? mode, - required final bool allowed}) = _$StatusKitMessage_StatusChangedImpl; - const StatusKitMessage_StatusChanged._() : super._(); +@override +String toString() { + return 'TextFormat.flags(field0: $field0)'; +} - @override - String get user; - @override - String? get mode; - @override - bool get allowed; - /// Create a copy of StatusKitMessage - /// with the given fields replaced by the non-null parameter values. - @override - @JsonKey(includeFromJson: false, includeToJson: false) - _$$StatusKitMessage_StatusChangedImplCopyWith< - _$StatusKitMessage_StatusChangedImpl> - get copyWith => throw _privateConstructorUsedError; } /// @nodoc -mixin _$SyncStatus { - @optionalTypeArgs - TResult when({ - required TResult Function() synced, - required TResult Function(BigInt progress, BigInt total) downloading, - required TResult Function(BigInt progress, BigInt total) uploading, - required TResult Function() syncing, - }) => - throw _privateConstructorUsedError; - @optionalTypeArgs - TResult? whenOrNull({ - TResult? Function()? synced, - TResult? Function(BigInt progress, BigInt total)? downloading, - TResult? Function(BigInt progress, BigInt total)? uploading, - TResult? Function()? syncing, - }) => - throw _privateConstructorUsedError; - @optionalTypeArgs - TResult maybeWhen({ - TResult Function()? synced, - TResult Function(BigInt progress, BigInt total)? downloading, - TResult Function(BigInt progress, BigInt total)? uploading, - TResult Function()? syncing, - required TResult orElse(), - }) => - throw _privateConstructorUsedError; - @optionalTypeArgs - TResult map({ - required TResult Function(SyncStatus_Synced value) synced, - required TResult Function(SyncStatus_Downloading value) downloading, - required TResult Function(SyncStatus_Uploading value) uploading, - required TResult Function(SyncStatus_Syncing value) syncing, - }) => - throw _privateConstructorUsedError; - @optionalTypeArgs - TResult? mapOrNull({ - TResult? Function(SyncStatus_Synced value)? synced, - TResult? Function(SyncStatus_Downloading value)? downloading, - TResult? Function(SyncStatus_Uploading value)? uploading, - TResult? Function(SyncStatus_Syncing value)? syncing, - }) => - throw _privateConstructorUsedError; - @optionalTypeArgs - TResult maybeMap({ - TResult Function(SyncStatus_Synced value)? synced, - TResult Function(SyncStatus_Downloading value)? downloading, - TResult Function(SyncStatus_Uploading value)? uploading, - TResult Function(SyncStatus_Syncing value)? syncing, - required TResult orElse(), - }) => - throw _privateConstructorUsedError; -} - -/// @nodoc -abstract class $SyncStatusCopyWith<$Res> { - factory $SyncStatusCopyWith( - SyncStatus value, $Res Function(SyncStatus) then) = - _$SyncStatusCopyWithImpl<$Res, SyncStatus>; -} - -/// @nodoc -class _$SyncStatusCopyWithImpl<$Res, $Val extends SyncStatus> - implements $SyncStatusCopyWith<$Res> { - _$SyncStatusCopyWithImpl(this._value, this._then); - - // ignore: unused_field - final $Val _value; - // ignore: unused_field - final $Res Function($Val) _then; - - /// Create a copy of SyncStatus - /// with the given fields replaced by the non-null parameter values. -} - -/// @nodoc -abstract class _$$SyncStatus_SyncedImplCopyWith<$Res> { - factory _$$SyncStatus_SyncedImplCopyWith(_$SyncStatus_SyncedImpl value, - $Res Function(_$SyncStatus_SyncedImpl) then) = - __$$SyncStatus_SyncedImplCopyWithImpl<$Res>; -} - -/// @nodoc -class __$$SyncStatus_SyncedImplCopyWithImpl<$Res> - extends _$SyncStatusCopyWithImpl<$Res, _$SyncStatus_SyncedImpl> - implements _$$SyncStatus_SyncedImplCopyWith<$Res> { - __$$SyncStatus_SyncedImplCopyWithImpl(_$SyncStatus_SyncedImpl _value, - $Res Function(_$SyncStatus_SyncedImpl) _then) - : super(_value, _then); - - /// Create a copy of SyncStatus - /// with the given fields replaced by the non-null parameter values. -} - -/// @nodoc - -class _$SyncStatus_SyncedImpl extends SyncStatus_Synced { - const _$SyncStatus_SyncedImpl() : super._(); - - @override - String toString() { - return 'SyncStatus.synced()'; - } - - @override - bool operator ==(Object other) { - return identical(this, other) || - (other.runtimeType == runtimeType && other is _$SyncStatus_SyncedImpl); - } +abstract mixin class $TextFormat_FlagsCopyWith<$Res> implements $TextFormatCopyWith<$Res> { + factory $TextFormat_FlagsCopyWith(TextFormat_Flags value, $Res Function(TextFormat_Flags) _then) = _$TextFormat_FlagsCopyWithImpl; +@useResult +$Res call({ + TextFlags field0 +}); - @override - int get hashCode => runtimeType.hashCode; - - @override - @optionalTypeArgs - TResult when({ - required TResult Function() synced, - required TResult Function(BigInt progress, BigInt total) downloading, - required TResult Function(BigInt progress, BigInt total) uploading, - required TResult Function() syncing, - }) { - return synced(); - } - @override - @optionalTypeArgs - TResult? whenOrNull({ - TResult? Function()? synced, - TResult? Function(BigInt progress, BigInt total)? downloading, - TResult? Function(BigInt progress, BigInt total)? uploading, - TResult? Function()? syncing, - }) { - return synced?.call(); - } - @override - @optionalTypeArgs - TResult maybeWhen({ - TResult Function()? synced, - TResult Function(BigInt progress, BigInt total)? downloading, - TResult Function(BigInt progress, BigInt total)? uploading, - TResult Function()? syncing, - required TResult orElse(), - }) { - if (synced != null) { - return synced(); - } - return orElse(); - } - @override - @optionalTypeArgs - TResult map({ - required TResult Function(SyncStatus_Synced value) synced, - required TResult Function(SyncStatus_Downloading value) downloading, - required TResult Function(SyncStatus_Uploading value) uploading, - required TResult Function(SyncStatus_Syncing value) syncing, - }) { - return synced(this); - } +} +/// @nodoc +class _$TextFormat_FlagsCopyWithImpl<$Res> + implements $TextFormat_FlagsCopyWith<$Res> { + _$TextFormat_FlagsCopyWithImpl(this._self, this._then); - @override - @optionalTypeArgs - TResult? mapOrNull({ - TResult? Function(SyncStatus_Synced value)? synced, - TResult? Function(SyncStatus_Downloading value)? downloading, - TResult? Function(SyncStatus_Uploading value)? uploading, - TResult? Function(SyncStatus_Syncing value)? syncing, - }) { - return synced?.call(this); - } + final TextFormat_Flags _self; + final $Res Function(TextFormat_Flags) _then; - @override - @optionalTypeArgs - TResult maybeMap({ - TResult Function(SyncStatus_Synced value)? synced, - TResult Function(SyncStatus_Downloading value)? downloading, - TResult Function(SyncStatus_Uploading value)? uploading, - TResult Function(SyncStatus_Syncing value)? syncing, - required TResult orElse(), - }) { - if (synced != null) { - return synced(this); - } - return orElse(); - } +/// Create a copy of TextFormat +/// with the given fields replaced by the non-null parameter values. +@pragma('vm:prefer-inline') $Res call({Object? field0 = null,}) { + return _then(TextFormat_Flags( +null == field0 ? _self.field0 : field0 // ignore: cast_nullable_to_non_nullable +as TextFlags, + )); } -abstract class SyncStatus_Synced extends SyncStatus { - const factory SyncStatus_Synced() = _$SyncStatus_SyncedImpl; - const SyncStatus_Synced._() : super._(); -} - -/// @nodoc -abstract class _$$SyncStatus_DownloadingImplCopyWith<$Res> { - factory _$$SyncStatus_DownloadingImplCopyWith( - _$SyncStatus_DownloadingImpl value, - $Res Function(_$SyncStatus_DownloadingImpl) then) = - __$$SyncStatus_DownloadingImplCopyWithImpl<$Res>; - @useResult - $Res call({BigInt progress, BigInt total}); -} - -/// @nodoc -class __$$SyncStatus_DownloadingImplCopyWithImpl<$Res> - extends _$SyncStatusCopyWithImpl<$Res, _$SyncStatus_DownloadingImpl> - implements _$$SyncStatus_DownloadingImplCopyWith<$Res> { - __$$SyncStatus_DownloadingImplCopyWithImpl( - _$SyncStatus_DownloadingImpl _value, - $Res Function(_$SyncStatus_DownloadingImpl) _then) - : super(_value, _then); - - /// Create a copy of SyncStatus - /// with the given fields replaced by the non-null parameter values. - @pragma('vm:prefer-inline') - @override - $Res call({ - Object? progress = null, - Object? total = null, - }) { - return _then(_$SyncStatus_DownloadingImpl( - progress: null == progress - ? _value.progress - : progress // ignore: cast_nullable_to_non_nullable - as BigInt, - total: null == total - ? _value.total - : total // ignore: cast_nullable_to_non_nullable - as BigInt, - )); - } + } /// @nodoc -class _$SyncStatus_DownloadingImpl extends SyncStatus_Downloading { - const _$SyncStatus_DownloadingImpl( - {required this.progress, required this.total}) - : super._(); - @override - final BigInt progress; - @override - final BigInt total; +class TextFormat_Effect extends TextFormat { + const TextFormat_Effect(this.field0): super._(); - @override - String toString() { - return 'SyncStatus.downloading(progress: $progress, total: $total)'; - } - @override - bool operator ==(Object other) { - return identical(this, other) || - (other.runtimeType == runtimeType && - other is _$SyncStatus_DownloadingImpl && - (identical(other.progress, progress) || - other.progress == progress) && - (identical(other.total, total) || other.total == total)); - } +@override final TextEffect field0; - @override - int get hashCode => Object.hash(runtimeType, progress, total); - - /// Create a copy of SyncStatus - /// with the given fields replaced by the non-null parameter values. - @JsonKey(includeFromJson: false, includeToJson: false) - @override - @pragma('vm:prefer-inline') - _$$SyncStatus_DownloadingImplCopyWith<_$SyncStatus_DownloadingImpl> - get copyWith => __$$SyncStatus_DownloadingImplCopyWithImpl< - _$SyncStatus_DownloadingImpl>(this, _$identity); - - @override - @optionalTypeArgs - TResult when({ - required TResult Function() synced, - required TResult Function(BigInt progress, BigInt total) downloading, - required TResult Function(BigInt progress, BigInt total) uploading, - required TResult Function() syncing, - }) { - return downloading(progress, total); - } +/// Create a copy of TextFormat +/// with the given fields replaced by the non-null parameter values. +@JsonKey(includeFromJson: false, includeToJson: false) +@pragma('vm:prefer-inline') +$TextFormat_EffectCopyWith get copyWith => _$TextFormat_EffectCopyWithImpl(this, _$identity); - @override - @optionalTypeArgs - TResult? whenOrNull({ - TResult? Function()? synced, - TResult? Function(BigInt progress, BigInt total)? downloading, - TResult? Function(BigInt progress, BigInt total)? uploading, - TResult? Function()? syncing, - }) { - return downloading?.call(progress, total); - } - @override - @optionalTypeArgs - TResult maybeWhen({ - TResult Function()? synced, - TResult Function(BigInt progress, BigInt total)? downloading, - TResult Function(BigInt progress, BigInt total)? uploading, - TResult Function()? syncing, - required TResult orElse(), - }) { - if (downloading != null) { - return downloading(progress, total); - } - return orElse(); - } - @override - @optionalTypeArgs - TResult map({ - required TResult Function(SyncStatus_Synced value) synced, - required TResult Function(SyncStatus_Downloading value) downloading, - required TResult Function(SyncStatus_Uploading value) uploading, - required TResult Function(SyncStatus_Syncing value) syncing, - }) { - return downloading(this); - } +@override +bool operator ==(Object other) { + return identical(this, other) || (other.runtimeType == runtimeType&&other is TextFormat_Effect&&(identical(other.field0, field0) || other.field0 == field0)); +} - @override - @optionalTypeArgs - TResult? mapOrNull({ - TResult? Function(SyncStatus_Synced value)? synced, - TResult? Function(SyncStatus_Downloading value)? downloading, - TResult? Function(SyncStatus_Uploading value)? uploading, - TResult? Function(SyncStatus_Syncing value)? syncing, - }) { - return downloading?.call(this); - } - @override - @optionalTypeArgs - TResult maybeMap({ - TResult Function(SyncStatus_Synced value)? synced, - TResult Function(SyncStatus_Downloading value)? downloading, - TResult Function(SyncStatus_Uploading value)? uploading, - TResult Function(SyncStatus_Syncing value)? syncing, - required TResult orElse(), - }) { - if (downloading != null) { - return downloading(this); - } - return orElse(); - } +@override +int get hashCode => Object.hash(runtimeType,field0); + +@override +String toString() { + return 'TextFormat.effect(field0: $field0)'; } -abstract class SyncStatus_Downloading extends SyncStatus { - const factory SyncStatus_Downloading( - {required final BigInt progress, - required final BigInt total}) = _$SyncStatus_DownloadingImpl; - const SyncStatus_Downloading._() : super._(); - - BigInt get progress; - BigInt get total; - - /// Create a copy of SyncStatus - /// with the given fields replaced by the non-null parameter values. - @JsonKey(includeFromJson: false, includeToJson: false) - _$$SyncStatus_DownloadingImplCopyWith<_$SyncStatus_DownloadingImpl> - get copyWith => throw _privateConstructorUsedError; -} - -/// @nodoc -abstract class _$$SyncStatus_UploadingImplCopyWith<$Res> { - factory _$$SyncStatus_UploadingImplCopyWith(_$SyncStatus_UploadingImpl value, - $Res Function(_$SyncStatus_UploadingImpl) then) = - __$$SyncStatus_UploadingImplCopyWithImpl<$Res>; - @useResult - $Res call({BigInt progress, BigInt total}); -} - -/// @nodoc -class __$$SyncStatus_UploadingImplCopyWithImpl<$Res> - extends _$SyncStatusCopyWithImpl<$Res, _$SyncStatus_UploadingImpl> - implements _$$SyncStatus_UploadingImplCopyWith<$Res> { - __$$SyncStatus_UploadingImplCopyWithImpl(_$SyncStatus_UploadingImpl _value, - $Res Function(_$SyncStatus_UploadingImpl) _then) - : super(_value, _then); - - /// Create a copy of SyncStatus - /// with the given fields replaced by the non-null parameter values. - @pragma('vm:prefer-inline') - @override - $Res call({ - Object? progress = null, - Object? total = null, - }) { - return _then(_$SyncStatus_UploadingImpl( - progress: null == progress - ? _value.progress - : progress // ignore: cast_nullable_to_non_nullable - as BigInt, - total: null == total - ? _value.total - : total // ignore: cast_nullable_to_non_nullable - as BigInt, - )); - } + } /// @nodoc +abstract mixin class $TextFormat_EffectCopyWith<$Res> implements $TextFormatCopyWith<$Res> { + factory $TextFormat_EffectCopyWith(TextFormat_Effect value, $Res Function(TextFormat_Effect) _then) = _$TextFormat_EffectCopyWithImpl; +@useResult +$Res call({ + TextEffect field0 +}); -class _$SyncStatus_UploadingImpl extends SyncStatus_Uploading { - const _$SyncStatus_UploadingImpl( - {required this.progress, required this.total}) - : super._(); - @override - final BigInt progress; - @override - final BigInt total; - @override - String toString() { - return 'SyncStatus.uploading(progress: $progress, total: $total)'; - } - @override - bool operator ==(Object other) { - return identical(this, other) || - (other.runtimeType == runtimeType && - other is _$SyncStatus_UploadingImpl && - (identical(other.progress, progress) || - other.progress == progress) && - (identical(other.total, total) || other.total == total)); - } +} +/// @nodoc +class _$TextFormat_EffectCopyWithImpl<$Res> + implements $TextFormat_EffectCopyWith<$Res> { + _$TextFormat_EffectCopyWithImpl(this._self, this._then); - @override - int get hashCode => Object.hash(runtimeType, progress, total); - - /// Create a copy of SyncStatus - /// with the given fields replaced by the non-null parameter values. - @JsonKey(includeFromJson: false, includeToJson: false) - @override - @pragma('vm:prefer-inline') - _$$SyncStatus_UploadingImplCopyWith<_$SyncStatus_UploadingImpl> - get copyWith => - __$$SyncStatus_UploadingImplCopyWithImpl<_$SyncStatus_UploadingImpl>( - this, _$identity); - - @override - @optionalTypeArgs - TResult when({ - required TResult Function() synced, - required TResult Function(BigInt progress, BigInt total) downloading, - required TResult Function(BigInt progress, BigInt total) uploading, - required TResult Function() syncing, - }) { - return uploading(progress, total); - } + final TextFormat_Effect _self; + final $Res Function(TextFormat_Effect) _then; - @override - @optionalTypeArgs - TResult? whenOrNull({ - TResult? Function()? synced, - TResult? Function(BigInt progress, BigInt total)? downloading, - TResult? Function(BigInt progress, BigInt total)? uploading, - TResult? Function()? syncing, - }) { - return uploading?.call(progress, total); - } +/// Create a copy of TextFormat +/// with the given fields replaced by the non-null parameter values. +@pragma('vm:prefer-inline') $Res call({Object? field0 = null,}) { + return _then(TextFormat_Effect( +null == field0 ? _self.field0 : field0 // ignore: cast_nullable_to_non_nullable +as TextEffect, + )); +} - @override - @optionalTypeArgs - TResult maybeWhen({ - TResult Function()? synced, - TResult Function(BigInt progress, BigInt total)? downloading, - TResult Function(BigInt progress, BigInt total)? uploading, - TResult Function()? syncing, - required TResult orElse(), - }) { - if (uploading != null) { - return uploading(progress, total); - } - return orElse(); - } - @override - @optionalTypeArgs - TResult map({ - required TResult Function(SyncStatus_Synced value) synced, - required TResult Function(SyncStatus_Downloading value) downloading, - required TResult Function(SyncStatus_Uploading value) uploading, - required TResult Function(SyncStatus_Syncing value) syncing, - }) { - return uploading(this); - } +} - @override - @optionalTypeArgs - TResult? mapOrNull({ - TResult? Function(SyncStatus_Synced value)? synced, - TResult? Function(SyncStatus_Downloading value)? downloading, - TResult? Function(SyncStatus_Uploading value)? uploading, - TResult? Function(SyncStatus_Syncing value)? syncing, - }) { - return uploading?.call(this); - } +/// @nodoc +mixin _$UIColor { - @override - @optionalTypeArgs - TResult maybeMap({ - TResult Function(SyncStatus_Synced value)? synced, - TResult Function(SyncStatus_Downloading value)? downloading, - TResult Function(SyncStatus_Uploading value)? uploading, - TResult Function(SyncStatus_Syncing value)? syncing, - required TResult orElse(), - }) { - if (uploading != null) { - return uploading(this); - } - return orElse(); - } -} + int get colorComponents; double get alpha; int get colorSpace; String get class_; +/// Create a copy of UIColor +/// with the given fields replaced by the non-null parameter values. +@JsonKey(includeFromJson: false, includeToJson: false) +@pragma('vm:prefer-inline') +$UIColorCopyWith get copyWith => _$UIColorCopyWithImpl(this as UIColor, _$identity); -abstract class SyncStatus_Uploading extends SyncStatus { - const factory SyncStatus_Uploading( - {required final BigInt progress, - required final BigInt total}) = _$SyncStatus_UploadingImpl; - const SyncStatus_Uploading._() : super._(); - BigInt get progress; - BigInt get total; - /// Create a copy of SyncStatus - /// with the given fields replaced by the non-null parameter values. - @JsonKey(includeFromJson: false, includeToJson: false) - _$$SyncStatus_UploadingImplCopyWith<_$SyncStatus_UploadingImpl> - get copyWith => throw _privateConstructorUsedError; +@override +bool operator ==(Object other) { + return identical(this, other) || (other.runtimeType == runtimeType&&other is UIColor&&(identical(other.colorComponents, colorComponents) || other.colorComponents == colorComponents)&&(identical(other.alpha, alpha) || other.alpha == alpha)&&(identical(other.colorSpace, colorSpace) || other.colorSpace == colorSpace)&&(identical(other.class_, class_) || other.class_ == class_)); } -/// @nodoc -abstract class _$$SyncStatus_SyncingImplCopyWith<$Res> { - factory _$$SyncStatus_SyncingImplCopyWith(_$SyncStatus_SyncingImpl value, - $Res Function(_$SyncStatus_SyncingImpl) then) = - __$$SyncStatus_SyncingImplCopyWithImpl<$Res>; + +@override +int get hashCode => Object.hash(runtimeType,colorComponents,alpha,colorSpace,class_); + +@override +String toString() { + return 'UIColor(colorComponents: $colorComponents, alpha: $alpha, colorSpace: $colorSpace, class_: $class_)'; } -/// @nodoc -class __$$SyncStatus_SyncingImplCopyWithImpl<$Res> - extends _$SyncStatusCopyWithImpl<$Res, _$SyncStatus_SyncingImpl> - implements _$$SyncStatus_SyncingImplCopyWith<$Res> { - __$$SyncStatus_SyncingImplCopyWithImpl(_$SyncStatus_SyncingImpl _value, - $Res Function(_$SyncStatus_SyncingImpl) _then) - : super(_value, _then); - /// Create a copy of SyncStatus - /// with the given fields replaced by the non-null parameter values. } /// @nodoc +abstract mixin class $UIColorCopyWith<$Res> { + factory $UIColorCopyWith(UIColor value, $Res Function(UIColor) _then) = _$UIColorCopyWithImpl; +@useResult +$Res call({ + int colorComponents, double alpha, int colorSpace, String class_ +}); -class _$SyncStatus_SyncingImpl extends SyncStatus_Syncing { - const _$SyncStatus_SyncingImpl() : super._(); - @override - String toString() { - return 'SyncStatus.syncing()'; - } - @override - bool operator ==(Object other) { - return identical(this, other) || - (other.runtimeType == runtimeType && other is _$SyncStatus_SyncingImpl); - } - @override - int get hashCode => runtimeType.hashCode; - - @override - @optionalTypeArgs - TResult when({ - required TResult Function() synced, - required TResult Function(BigInt progress, BigInt total) downloading, - required TResult Function(BigInt progress, BigInt total) uploading, - required TResult Function() syncing, - }) { - return syncing(); - } +} +/// @nodoc +class _$UIColorCopyWithImpl<$Res> + implements $UIColorCopyWith<$Res> { + _$UIColorCopyWithImpl(this._self, this._then); + + final UIColor _self; + final $Res Function(UIColor) _then; + +/// Create a copy of UIColor +/// with the given fields replaced by the non-null parameter values. +@pragma('vm:prefer-inline') @override $Res call({Object? colorComponents = null,Object? alpha = null,Object? colorSpace = null,Object? class_ = null,}) { + return _then(_self.copyWith( +colorComponents: null == colorComponents ? _self.colorComponents : colorComponents // ignore: cast_nullable_to_non_nullable +as int,alpha: null == alpha ? _self.alpha : alpha // ignore: cast_nullable_to_non_nullable +as double,colorSpace: null == colorSpace ? _self.colorSpace : colorSpace // ignore: cast_nullable_to_non_nullable +as int,class_: null == class_ ? _self.class_ : class_ // ignore: cast_nullable_to_non_nullable +as String, + )); +} + +} + + +/// Adds pattern-matching-related methods to [UIColor]. +extension UIColorPatterns on UIColor { +/// A variant of `map` that fallback to returning `orElse`. +/// +/// It is equivalent to doing: +/// ```dart +/// switch (sealedClass) { +/// case final Subclass value: +/// return ...; +/// case _: +/// return orElse(); +/// } +/// ``` + +@optionalTypeArgs TResult maybeMap({TResult Function( UIColor_RGBAColorSpace value)? rgbaColorSpace,TResult Function( UIColor_GrayscaleAlphaColorSpace value)? grayscaleAlphaColorSpace,required TResult orElse(),}){ +final _that = this; +switch (_that) { +case UIColor_RGBAColorSpace() when rgbaColorSpace != null: +return rgbaColorSpace(_that);case UIColor_GrayscaleAlphaColorSpace() when grayscaleAlphaColorSpace != null: +return grayscaleAlphaColorSpace(_that);case _: + return orElse(); + +} +} +/// A `switch`-like method, using callbacks. +/// +/// Callbacks receives the raw object, upcasted. +/// It is equivalent to doing: +/// ```dart +/// switch (sealedClass) { +/// case final Subclass value: +/// return ...; +/// case final Subclass2 value: +/// return ...; +/// } +/// ``` + +@optionalTypeArgs TResult map({required TResult Function( UIColor_RGBAColorSpace value) rgbaColorSpace,required TResult Function( UIColor_GrayscaleAlphaColorSpace value) grayscaleAlphaColorSpace,}){ +final _that = this; +switch (_that) { +case UIColor_RGBAColorSpace(): +return rgbaColorSpace(_that);case UIColor_GrayscaleAlphaColorSpace(): +return grayscaleAlphaColorSpace(_that);} +} +/// A variant of `map` that fallback to returning `null`. +/// +/// It is equivalent to doing: +/// ```dart +/// switch (sealedClass) { +/// case final Subclass value: +/// return ...; +/// case _: +/// return null; +/// } +/// ``` + +@optionalTypeArgs TResult? mapOrNull({TResult? Function( UIColor_RGBAColorSpace value)? rgbaColorSpace,TResult? Function( UIColor_GrayscaleAlphaColorSpace value)? grayscaleAlphaColorSpace,}){ +final _that = this; +switch (_that) { +case UIColor_RGBAColorSpace() when rgbaColorSpace != null: +return rgbaColorSpace(_that);case UIColor_GrayscaleAlphaColorSpace() when grayscaleAlphaColorSpace != null: +return grayscaleAlphaColorSpace(_that);case _: + return null; + +} +} +/// A variant of `when` that fallback to an `orElse` callback. +/// +/// It is equivalent to doing: +/// ```dart +/// switch (sealedClass) { +/// case Subclass(:final field): +/// return ...; +/// case _: +/// return orElse(); +/// } +/// ``` - @override - @optionalTypeArgs - TResult? whenOrNull({ - TResult? Function()? synced, - TResult? Function(BigInt progress, BigInt total)? downloading, - TResult? Function(BigInt progress, BigInt total)? uploading, - TResult? Function()? syncing, - }) { - return syncing?.call(); - } +@optionalTypeArgs TResult maybeWhen({TResult Function( int colorComponents, double green, double blue, double red, double? greenDbl, double? blueDbl, double? redDbl, double? alphaDbl, double alpha, Uint8List rgb, int colorSpace, String class_)? rgbaColorSpace,TResult Function( int colorComponents, double white, double alpha, Uint8List bin, int colorSpace, String class_)? grayscaleAlphaColorSpace,required TResult orElse(),}) {final _that = this; +switch (_that) { +case UIColor_RGBAColorSpace() when rgbaColorSpace != null: +return rgbaColorSpace(_that.colorComponents,_that.green,_that.blue,_that.red,_that.greenDbl,_that.blueDbl,_that.redDbl,_that.alphaDbl,_that.alpha,_that.rgb,_that.colorSpace,_that.class_);case UIColor_GrayscaleAlphaColorSpace() when grayscaleAlphaColorSpace != null: +return grayscaleAlphaColorSpace(_that.colorComponents,_that.white,_that.alpha,_that.bin,_that.colorSpace,_that.class_);case _: + return orElse(); - @override - @optionalTypeArgs - TResult maybeWhen({ - TResult Function()? synced, - TResult Function(BigInt progress, BigInt total)? downloading, - TResult Function(BigInt progress, BigInt total)? uploading, - TResult Function()? syncing, - required TResult orElse(), - }) { - if (syncing != null) { - return syncing(); - } - return orElse(); - } +} +} +/// A `switch`-like method, using callbacks. +/// +/// As opposed to `map`, this offers destructuring. +/// It is equivalent to doing: +/// ```dart +/// switch (sealedClass) { +/// case Subclass(:final field): +/// return ...; +/// case Subclass2(:final field2): +/// return ...; +/// } +/// ``` - @override - @optionalTypeArgs - TResult map({ - required TResult Function(SyncStatus_Synced value) synced, - required TResult Function(SyncStatus_Downloading value) downloading, - required TResult Function(SyncStatus_Uploading value) uploading, - required TResult Function(SyncStatus_Syncing value) syncing, - }) { - return syncing(this); - } +@optionalTypeArgs TResult when({required TResult Function( int colorComponents, double green, double blue, double red, double? greenDbl, double? blueDbl, double? redDbl, double? alphaDbl, double alpha, Uint8List rgb, int colorSpace, String class_) rgbaColorSpace,required TResult Function( int colorComponents, double white, double alpha, Uint8List bin, int colorSpace, String class_) grayscaleAlphaColorSpace,}) {final _that = this; +switch (_that) { +case UIColor_RGBAColorSpace(): +return rgbaColorSpace(_that.colorComponents,_that.green,_that.blue,_that.red,_that.greenDbl,_that.blueDbl,_that.redDbl,_that.alphaDbl,_that.alpha,_that.rgb,_that.colorSpace,_that.class_);case UIColor_GrayscaleAlphaColorSpace(): +return grayscaleAlphaColorSpace(_that.colorComponents,_that.white,_that.alpha,_that.bin,_that.colorSpace,_that.class_);} +} +/// A variant of `when` that fallback to returning `null` +/// +/// It is equivalent to doing: +/// ```dart +/// switch (sealedClass) { +/// case Subclass(:final field): +/// return ...; +/// case _: +/// return null; +/// } +/// ``` - @override - @optionalTypeArgs - TResult? mapOrNull({ - TResult? Function(SyncStatus_Synced value)? synced, - TResult? Function(SyncStatus_Downloading value)? downloading, - TResult? Function(SyncStatus_Uploading value)? uploading, - TResult? Function(SyncStatus_Syncing value)? syncing, - }) { - return syncing?.call(this); - } +@optionalTypeArgs TResult? whenOrNull({TResult? Function( int colorComponents, double green, double blue, double red, double? greenDbl, double? blueDbl, double? redDbl, double? alphaDbl, double alpha, Uint8List rgb, int colorSpace, String class_)? rgbaColorSpace,TResult? Function( int colorComponents, double white, double alpha, Uint8List bin, int colorSpace, String class_)? grayscaleAlphaColorSpace,}) {final _that = this; +switch (_that) { +case UIColor_RGBAColorSpace() when rgbaColorSpace != null: +return rgbaColorSpace(_that.colorComponents,_that.green,_that.blue,_that.red,_that.greenDbl,_that.blueDbl,_that.redDbl,_that.alphaDbl,_that.alpha,_that.rgb,_that.colorSpace,_that.class_);case UIColor_GrayscaleAlphaColorSpace() when grayscaleAlphaColorSpace != null: +return grayscaleAlphaColorSpace(_that.colorComponents,_that.white,_that.alpha,_that.bin,_that.colorSpace,_that.class_);case _: + return null; - @override - @optionalTypeArgs - TResult maybeMap({ - TResult Function(SyncStatus_Synced value)? synced, - TResult Function(SyncStatus_Downloading value)? downloading, - TResult Function(SyncStatus_Uploading value)? uploading, - TResult Function(SyncStatus_Syncing value)? syncing, - required TResult orElse(), - }) { - if (syncing != null) { - return syncing(this); - } - return orElse(); - } } - -abstract class SyncStatus_Syncing extends SyncStatus { - const factory SyncStatus_Syncing() = _$SyncStatus_SyncingImpl; - const SyncStatus_Syncing._() : super._(); } -/// @nodoc -mixin _$TextFormat { - Object get field0 => throw _privateConstructorUsedError; - @optionalTypeArgs - TResult when({ - required TResult Function(TextFlags field0) flags, - required TResult Function(TextEffect field0) effect, - }) => - throw _privateConstructorUsedError; - @optionalTypeArgs - TResult? whenOrNull({ - TResult? Function(TextFlags field0)? flags, - TResult? Function(TextEffect field0)? effect, - }) => - throw _privateConstructorUsedError; - @optionalTypeArgs - TResult maybeWhen({ - TResult Function(TextFlags field0)? flags, - TResult Function(TextEffect field0)? effect, - required TResult orElse(), - }) => - throw _privateConstructorUsedError; - @optionalTypeArgs - TResult map({ - required TResult Function(TextFormat_Flags value) flags, - required TResult Function(TextFormat_Effect value) effect, - }) => - throw _privateConstructorUsedError; - @optionalTypeArgs - TResult? mapOrNull({ - TResult? Function(TextFormat_Flags value)? flags, - TResult? Function(TextFormat_Effect value)? effect, - }) => - throw _privateConstructorUsedError; - @optionalTypeArgs - TResult maybeMap({ - TResult Function(TextFormat_Flags value)? flags, - TResult Function(TextFormat_Effect value)? effect, - required TResult orElse(), - }) => - throw _privateConstructorUsedError; -} - -/// @nodoc -abstract class $TextFormatCopyWith<$Res> { - factory $TextFormatCopyWith( - TextFormat value, $Res Function(TextFormat) then) = - _$TextFormatCopyWithImpl<$Res, TextFormat>; -} - -/// @nodoc -class _$TextFormatCopyWithImpl<$Res, $Val extends TextFormat> - implements $TextFormatCopyWith<$Res> { - _$TextFormatCopyWithImpl(this._value, this._then); - - // ignore: unused_field - final $Val _value; - // ignore: unused_field - final $Res Function($Val) _then; - - /// Create a copy of TextFormat - /// with the given fields replaced by the non-null parameter values. -} - -/// @nodoc -abstract class _$$TextFormat_FlagsImplCopyWith<$Res> { - factory _$$TextFormat_FlagsImplCopyWith(_$TextFormat_FlagsImpl value, - $Res Function(_$TextFormat_FlagsImpl) then) = - __$$TextFormat_FlagsImplCopyWithImpl<$Res>; - @useResult - $Res call({TextFlags field0}); -} - -/// @nodoc -class __$$TextFormat_FlagsImplCopyWithImpl<$Res> - extends _$TextFormatCopyWithImpl<$Res, _$TextFormat_FlagsImpl> - implements _$$TextFormat_FlagsImplCopyWith<$Res> { - __$$TextFormat_FlagsImplCopyWithImpl(_$TextFormat_FlagsImpl _value, - $Res Function(_$TextFormat_FlagsImpl) _then) - : super(_value, _then); - - /// Create a copy of TextFormat - /// with the given fields replaced by the non-null parameter values. - @pragma('vm:prefer-inline') - @override - $Res call({ - Object? field0 = null, - }) { - return _then(_$TextFormat_FlagsImpl( - null == field0 - ? _value.field0 - : field0 // ignore: cast_nullable_to_non_nullable - as TextFlags, - )); - } } /// @nodoc -class _$TextFormat_FlagsImpl extends TextFormat_Flags { - const _$TextFormat_FlagsImpl(this.field0) : super._(); - @override - final TextFlags field0; +class UIColor_RGBAColorSpace extends UIColor { + const UIColor_RGBAColorSpace({required this.colorComponents, required this.green, required this.blue, required this.red, this.greenDbl, this.blueDbl, this.redDbl, this.alphaDbl, required this.alpha, required this.rgb, required this.colorSpace, required this.class_}): super._(); - @override - String toString() { - return 'TextFormat.flags(field0: $field0)'; - } - @override - bool operator ==(Object other) { - return identical(this, other) || - (other.runtimeType == runtimeType && - other is _$TextFormat_FlagsImpl && - (identical(other.field0, field0) || other.field0 == field0)); - } +@override final int colorComponents; + final double green; + final double blue; + final double red; + final double? greenDbl; + final double? blueDbl; + final double? redDbl; + final double? alphaDbl; +@override final double alpha; + final Uint8List rgb; +@override final int colorSpace; +@override final String class_; - @override - int get hashCode => Object.hash(runtimeType, field0); - - /// Create a copy of TextFormat - /// with the given fields replaced by the non-null parameter values. - @JsonKey(includeFromJson: false, includeToJson: false) - @override - @pragma('vm:prefer-inline') - _$$TextFormat_FlagsImplCopyWith<_$TextFormat_FlagsImpl> get copyWith => - __$$TextFormat_FlagsImplCopyWithImpl<_$TextFormat_FlagsImpl>( - this, _$identity); - - @override - @optionalTypeArgs - TResult when({ - required TResult Function(TextFlags field0) flags, - required TResult Function(TextEffect field0) effect, - }) { - return flags(field0); - } +/// Create a copy of UIColor +/// with the given fields replaced by the non-null parameter values. +@override @JsonKey(includeFromJson: false, includeToJson: false) +@pragma('vm:prefer-inline') +$UIColor_RGBAColorSpaceCopyWith get copyWith => _$UIColor_RGBAColorSpaceCopyWithImpl(this, _$identity); - @override - @optionalTypeArgs - TResult? whenOrNull({ - TResult? Function(TextFlags field0)? flags, - TResult? Function(TextEffect field0)? effect, - }) { - return flags?.call(field0); - } - @override - @optionalTypeArgs - TResult maybeWhen({ - TResult Function(TextFlags field0)? flags, - TResult Function(TextEffect field0)? effect, - required TResult orElse(), - }) { - if (flags != null) { - return flags(field0); - } - return orElse(); - } - @override - @optionalTypeArgs - TResult map({ - required TResult Function(TextFormat_Flags value) flags, - required TResult Function(TextFormat_Effect value) effect, - }) { - return flags(this); - } +@override +bool operator ==(Object other) { + return identical(this, other) || (other.runtimeType == runtimeType&&other is UIColor_RGBAColorSpace&&(identical(other.colorComponents, colorComponents) || other.colorComponents == colorComponents)&&(identical(other.green, green) || other.green == green)&&(identical(other.blue, blue) || other.blue == blue)&&(identical(other.red, red) || other.red == red)&&(identical(other.greenDbl, greenDbl) || other.greenDbl == greenDbl)&&(identical(other.blueDbl, blueDbl) || other.blueDbl == blueDbl)&&(identical(other.redDbl, redDbl) || other.redDbl == redDbl)&&(identical(other.alphaDbl, alphaDbl) || other.alphaDbl == alphaDbl)&&(identical(other.alpha, alpha) || other.alpha == alpha)&&const DeepCollectionEquality().equals(other.rgb, rgb)&&(identical(other.colorSpace, colorSpace) || other.colorSpace == colorSpace)&&(identical(other.class_, class_) || other.class_ == class_)); +} - @override - @optionalTypeArgs - TResult? mapOrNull({ - TResult? Function(TextFormat_Flags value)? flags, - TResult? Function(TextFormat_Effect value)? effect, - }) { - return flags?.call(this); - } - @override - @optionalTypeArgs - TResult maybeMap({ - TResult Function(TextFormat_Flags value)? flags, - TResult Function(TextFormat_Effect value)? effect, - required TResult orElse(), - }) { - if (flags != null) { - return flags(this); - } - return orElse(); - } -} +@override +int get hashCode => Object.hash(runtimeType,colorComponents,green,blue,red,greenDbl,blueDbl,redDbl,alphaDbl,alpha,const DeepCollectionEquality().hash(rgb),colorSpace,class_); -abstract class TextFormat_Flags extends TextFormat { - const factory TextFormat_Flags(final TextFlags field0) = - _$TextFormat_FlagsImpl; - const TextFormat_Flags._() : super._(); +@override +String toString() { + return 'UIColor.rgbaColorSpace(colorComponents: $colorComponents, green: $green, blue: $blue, red: $red, greenDbl: $greenDbl, blueDbl: $blueDbl, redDbl: $redDbl, alphaDbl: $alphaDbl, alpha: $alpha, rgb: $rgb, colorSpace: $colorSpace, class_: $class_)'; +} - @override - TextFlags get field0; - /// Create a copy of TextFormat - /// with the given fields replaced by the non-null parameter values. - @JsonKey(includeFromJson: false, includeToJson: false) - _$$TextFormat_FlagsImplCopyWith<_$TextFormat_FlagsImpl> get copyWith => - throw _privateConstructorUsedError; } /// @nodoc -abstract class _$$TextFormat_EffectImplCopyWith<$Res> { - factory _$$TextFormat_EffectImplCopyWith(_$TextFormat_EffectImpl value, - $Res Function(_$TextFormat_EffectImpl) then) = - __$$TextFormat_EffectImplCopyWithImpl<$Res>; - @useResult - $Res call({TextEffect field0}); -} +abstract mixin class $UIColor_RGBAColorSpaceCopyWith<$Res> implements $UIColorCopyWith<$Res> { + factory $UIColor_RGBAColorSpaceCopyWith(UIColor_RGBAColorSpace value, $Res Function(UIColor_RGBAColorSpace) _then) = _$UIColor_RGBAColorSpaceCopyWithImpl; +@override @useResult +$Res call({ + int colorComponents, double green, double blue, double red, double? greenDbl, double? blueDbl, double? redDbl, double? alphaDbl, double alpha, Uint8List rgb, int colorSpace, String class_ +}); + + + +} /// @nodoc -class __$$TextFormat_EffectImplCopyWithImpl<$Res> - extends _$TextFormatCopyWithImpl<$Res, _$TextFormat_EffectImpl> - implements _$$TextFormat_EffectImplCopyWith<$Res> { - __$$TextFormat_EffectImplCopyWithImpl(_$TextFormat_EffectImpl _value, - $Res Function(_$TextFormat_EffectImpl) _then) - : super(_value, _then); +class _$UIColor_RGBAColorSpaceCopyWithImpl<$Res> + implements $UIColor_RGBAColorSpaceCopyWith<$Res> { + _$UIColor_RGBAColorSpaceCopyWithImpl(this._self, this._then); - /// Create a copy of TextFormat - /// with the given fields replaced by the non-null parameter values. - @pragma('vm:prefer-inline') - @override - $Res call({ - Object? field0 = null, - }) { - return _then(_$TextFormat_EffectImpl( - null == field0 - ? _value.field0 - : field0 // ignore: cast_nullable_to_non_nullable - as TextEffect, - )); - } + final UIColor_RGBAColorSpace _self; + final $Res Function(UIColor_RGBAColorSpace) _then; + +/// Create a copy of UIColor +/// with the given fields replaced by the non-null parameter values. +@override @pragma('vm:prefer-inline') $Res call({Object? colorComponents = null,Object? green = null,Object? blue = null,Object? red = null,Object? greenDbl = freezed,Object? blueDbl = freezed,Object? redDbl = freezed,Object? alphaDbl = freezed,Object? alpha = null,Object? rgb = null,Object? colorSpace = null,Object? class_ = null,}) { + return _then(UIColor_RGBAColorSpace( +colorComponents: null == colorComponents ? _self.colorComponents : colorComponents // ignore: cast_nullable_to_non_nullable +as int,green: null == green ? _self.green : green // ignore: cast_nullable_to_non_nullable +as double,blue: null == blue ? _self.blue : blue // ignore: cast_nullable_to_non_nullable +as double,red: null == red ? _self.red : red // ignore: cast_nullable_to_non_nullable +as double,greenDbl: freezed == greenDbl ? _self.greenDbl : greenDbl // ignore: cast_nullable_to_non_nullable +as double?,blueDbl: freezed == blueDbl ? _self.blueDbl : blueDbl // ignore: cast_nullable_to_non_nullable +as double?,redDbl: freezed == redDbl ? _self.redDbl : redDbl // ignore: cast_nullable_to_non_nullable +as double?,alphaDbl: freezed == alphaDbl ? _self.alphaDbl : alphaDbl // ignore: cast_nullable_to_non_nullable +as double?,alpha: null == alpha ? _self.alpha : alpha // ignore: cast_nullable_to_non_nullable +as double,rgb: null == rgb ? _self.rgb : rgb // ignore: cast_nullable_to_non_nullable +as Uint8List,colorSpace: null == colorSpace ? _self.colorSpace : colorSpace // ignore: cast_nullable_to_non_nullable +as int,class_: null == class_ ? _self.class_ : class_ // ignore: cast_nullable_to_non_nullable +as String, + )); } -/// @nodoc -class _$TextFormat_EffectImpl extends TextFormat_Effect { - const _$TextFormat_EffectImpl(this.field0) : super._(); +} - @override - final TextEffect field0; +/// @nodoc - @override - String toString() { - return 'TextFormat.effect(field0: $field0)'; - } - @override - bool operator ==(Object other) { - return identical(this, other) || - (other.runtimeType == runtimeType && - other is _$TextFormat_EffectImpl && - (identical(other.field0, field0) || other.field0 == field0)); - } +class UIColor_GrayscaleAlphaColorSpace extends UIColor { + const UIColor_GrayscaleAlphaColorSpace({required this.colorComponents, required this.white, required this.alpha, required this.bin, required this.colorSpace, required this.class_}): super._(); - @override - int get hashCode => Object.hash(runtimeType, field0); - - /// Create a copy of TextFormat - /// with the given fields replaced by the non-null parameter values. - @JsonKey(includeFromJson: false, includeToJson: false) - @override - @pragma('vm:prefer-inline') - _$$TextFormat_EffectImplCopyWith<_$TextFormat_EffectImpl> get copyWith => - __$$TextFormat_EffectImplCopyWithImpl<_$TextFormat_EffectImpl>( - this, _$identity); - - @override - @optionalTypeArgs - TResult when({ - required TResult Function(TextFlags field0) flags, - required TResult Function(TextEffect field0) effect, - }) { - return effect(field0); - } - @override - @optionalTypeArgs - TResult? whenOrNull({ - TResult? Function(TextFlags field0)? flags, - TResult? Function(TextEffect field0)? effect, - }) { - return effect?.call(field0); - } +@override final int colorComponents; + final double white; +@override final double alpha; + final Uint8List bin; +@override final int colorSpace; +@override final String class_; - @override - @optionalTypeArgs - TResult maybeWhen({ - TResult Function(TextFlags field0)? flags, - TResult Function(TextEffect field0)? effect, - required TResult orElse(), - }) { - if (effect != null) { - return effect(field0); - } - return orElse(); - } +/// Create a copy of UIColor +/// with the given fields replaced by the non-null parameter values. +@override @JsonKey(includeFromJson: false, includeToJson: false) +@pragma('vm:prefer-inline') +$UIColor_GrayscaleAlphaColorSpaceCopyWith get copyWith => _$UIColor_GrayscaleAlphaColorSpaceCopyWithImpl(this, _$identity); - @override - @optionalTypeArgs - TResult map({ - required TResult Function(TextFormat_Flags value) flags, - required TResult Function(TextFormat_Effect value) effect, - }) { - return effect(this); - } - @override - @optionalTypeArgs - TResult? mapOrNull({ - TResult? Function(TextFormat_Flags value)? flags, - TResult? Function(TextFormat_Effect value)? effect, - }) { - return effect?.call(this); - } - @override - @optionalTypeArgs - TResult maybeMap({ - TResult Function(TextFormat_Flags value)? flags, - TResult Function(TextFormat_Effect value)? effect, - required TResult orElse(), - }) { - if (effect != null) { - return effect(this); - } - return orElse(); - } +@override +bool operator ==(Object other) { + return identical(this, other) || (other.runtimeType == runtimeType&&other is UIColor_GrayscaleAlphaColorSpace&&(identical(other.colorComponents, colorComponents) || other.colorComponents == colorComponents)&&(identical(other.white, white) || other.white == white)&&(identical(other.alpha, alpha) || other.alpha == alpha)&&const DeepCollectionEquality().equals(other.bin, bin)&&(identical(other.colorSpace, colorSpace) || other.colorSpace == colorSpace)&&(identical(other.class_, class_) || other.class_ == class_)); } -abstract class TextFormat_Effect extends TextFormat { - const factory TextFormat_Effect(final TextEffect field0) = - _$TextFormat_EffectImpl; - const TextFormat_Effect._() : super._(); - @override - TextEffect get field0; +@override +int get hashCode => Object.hash(runtimeType,colorComponents,white,alpha,const DeepCollectionEquality().hash(bin),colorSpace,class_); - /// Create a copy of TextFormat - /// with the given fields replaced by the non-null parameter values. - @JsonKey(includeFromJson: false, includeToJson: false) - _$$TextFormat_EffectImplCopyWith<_$TextFormat_EffectImpl> get copyWith => - throw _privateConstructorUsedError; +@override +String toString() { + return 'UIColor.grayscaleAlphaColorSpace(colorComponents: $colorComponents, white: $white, alpha: $alpha, bin: $bin, colorSpace: $colorSpace, class_: $class_)'; } -/// @nodoc -mixin _$UIColor { - int get colorComponents => throw _privateConstructorUsedError; - double get alpha => throw _privateConstructorUsedError; - int get colorSpace => throw _privateConstructorUsedError; - String get class_ => throw _privateConstructorUsedError; - @optionalTypeArgs - TResult when({ - required TResult Function( - int colorComponents, - double green, - double blue, - double red, - double? greenDbl, - double? blueDbl, - double? redDbl, - double? alphaDbl, - double alpha, - Uint8List rgb, - int colorSpace, - String class_) - rgbaColorSpace, - required TResult Function(int colorComponents, double white, double alpha, - Uint8List bin, int colorSpace, String class_) - grayscaleAlphaColorSpace, - }) => - throw _privateConstructorUsedError; - @optionalTypeArgs - TResult? whenOrNull({ - TResult? Function( - int colorComponents, - double green, - double blue, - double red, - double? greenDbl, - double? blueDbl, - double? redDbl, - double? alphaDbl, - double alpha, - Uint8List rgb, - int colorSpace, - String class_)? - rgbaColorSpace, - TResult? Function(int colorComponents, double white, double alpha, - Uint8List bin, int colorSpace, String class_)? - grayscaleAlphaColorSpace, - }) => - throw _privateConstructorUsedError; - @optionalTypeArgs - TResult maybeWhen({ - TResult Function( - int colorComponents, - double green, - double blue, - double red, - double? greenDbl, - double? blueDbl, - double? redDbl, - double? alphaDbl, - double alpha, - Uint8List rgb, - int colorSpace, - String class_)? - rgbaColorSpace, - TResult Function(int colorComponents, double white, double alpha, - Uint8List bin, int colorSpace, String class_)? - grayscaleAlphaColorSpace, - required TResult orElse(), - }) => - throw _privateConstructorUsedError; - @optionalTypeArgs - TResult map({ - required TResult Function(UIColor_RGBAColorSpace value) rgbaColorSpace, - required TResult Function(UIColor_GrayscaleAlphaColorSpace value) - grayscaleAlphaColorSpace, - }) => - throw _privateConstructorUsedError; - @optionalTypeArgs - TResult? mapOrNull({ - TResult? Function(UIColor_RGBAColorSpace value)? rgbaColorSpace, - TResult? Function(UIColor_GrayscaleAlphaColorSpace value)? - grayscaleAlphaColorSpace, - }) => - throw _privateConstructorUsedError; - @optionalTypeArgs - TResult maybeMap({ - TResult Function(UIColor_RGBAColorSpace value)? rgbaColorSpace, - TResult Function(UIColor_GrayscaleAlphaColorSpace value)? - grayscaleAlphaColorSpace, - required TResult orElse(), - }) => - throw _privateConstructorUsedError; - - /// Create a copy of UIColor - /// with the given fields replaced by the non-null parameter values. - @JsonKey(includeFromJson: false, includeToJson: false) - $UIColorCopyWith get copyWith => throw _privateConstructorUsedError; -} - -/// @nodoc -abstract class $UIColorCopyWith<$Res> { - factory $UIColorCopyWith(UIColor value, $Res Function(UIColor) then) = - _$UIColorCopyWithImpl<$Res, UIColor>; - @useResult - $Res call({int colorComponents, double alpha, int colorSpace, String class_}); -} - -/// @nodoc -class _$UIColorCopyWithImpl<$Res, $Val extends UIColor> - implements $UIColorCopyWith<$Res> { - _$UIColorCopyWithImpl(this._value, this._then); - - // ignore: unused_field - final $Val _value; - // ignore: unused_field - final $Res Function($Val) _then; - - /// Create a copy of UIColor - /// with the given fields replaced by the non-null parameter values. - @pragma('vm:prefer-inline') - @override - $Res call({ - Object? colorComponents = null, - Object? alpha = null, - Object? colorSpace = null, - Object? class_ = null, - }) { - return _then(_value.copyWith( - colorComponents: null == colorComponents - ? _value.colorComponents - : colorComponents // ignore: cast_nullable_to_non_nullable - as int, - alpha: null == alpha - ? _value.alpha - : alpha // ignore: cast_nullable_to_non_nullable - as double, - colorSpace: null == colorSpace - ? _value.colorSpace - : colorSpace // ignore: cast_nullable_to_non_nullable - as int, - class_: null == class_ - ? _value.class_ - : class_ // ignore: cast_nullable_to_non_nullable - as String, - ) as $Val); - } + } /// @nodoc -abstract class _$$UIColor_RGBAColorSpaceImplCopyWith<$Res> - implements $UIColorCopyWith<$Res> { - factory _$$UIColor_RGBAColorSpaceImplCopyWith( - _$UIColor_RGBAColorSpaceImpl value, - $Res Function(_$UIColor_RGBAColorSpaceImpl) then) = - __$$UIColor_RGBAColorSpaceImplCopyWithImpl<$Res>; - @override - @useResult - $Res call( - {int colorComponents, - double green, - double blue, - double red, - double? greenDbl, - double? blueDbl, - double? redDbl, - double? alphaDbl, - double alpha, - Uint8List rgb, - int colorSpace, - String class_}); -} - -/// @nodoc -class __$$UIColor_RGBAColorSpaceImplCopyWithImpl<$Res> - extends _$UIColorCopyWithImpl<$Res, _$UIColor_RGBAColorSpaceImpl> - implements _$$UIColor_RGBAColorSpaceImplCopyWith<$Res> { - __$$UIColor_RGBAColorSpaceImplCopyWithImpl( - _$UIColor_RGBAColorSpaceImpl _value, - $Res Function(_$UIColor_RGBAColorSpaceImpl) _then) - : super(_value, _then); - - /// Create a copy of UIColor - /// with the given fields replaced by the non-null parameter values. - @pragma('vm:prefer-inline') - @override - $Res call({ - Object? colorComponents = null, - Object? green = null, - Object? blue = null, - Object? red = null, - Object? greenDbl = freezed, - Object? blueDbl = freezed, - Object? redDbl = freezed, - Object? alphaDbl = freezed, - Object? alpha = null, - Object? rgb = null, - Object? colorSpace = null, - Object? class_ = null, - }) { - return _then(_$UIColor_RGBAColorSpaceImpl( - colorComponents: null == colorComponents - ? _value.colorComponents - : colorComponents // ignore: cast_nullable_to_non_nullable - as int, - green: null == green - ? _value.green - : green // ignore: cast_nullable_to_non_nullable - as double, - blue: null == blue - ? _value.blue - : blue // ignore: cast_nullable_to_non_nullable - as double, - red: null == red - ? _value.red - : red // ignore: cast_nullable_to_non_nullable - as double, - greenDbl: freezed == greenDbl - ? _value.greenDbl - : greenDbl // ignore: cast_nullable_to_non_nullable - as double?, - blueDbl: freezed == blueDbl - ? _value.blueDbl - : blueDbl // ignore: cast_nullable_to_non_nullable - as double?, - redDbl: freezed == redDbl - ? _value.redDbl - : redDbl // ignore: cast_nullable_to_non_nullable - as double?, - alphaDbl: freezed == alphaDbl - ? _value.alphaDbl - : alphaDbl // ignore: cast_nullable_to_non_nullable - as double?, - alpha: null == alpha - ? _value.alpha - : alpha // ignore: cast_nullable_to_non_nullable - as double, - rgb: null == rgb - ? _value.rgb - : rgb // ignore: cast_nullable_to_non_nullable - as Uint8List, - colorSpace: null == colorSpace - ? _value.colorSpace - : colorSpace // ignore: cast_nullable_to_non_nullable - as int, - class_: null == class_ - ? _value.class_ - : class_ // ignore: cast_nullable_to_non_nullable - as String, - )); - } +abstract mixin class $UIColor_GrayscaleAlphaColorSpaceCopyWith<$Res> implements $UIColorCopyWith<$Res> { + factory $UIColor_GrayscaleAlphaColorSpaceCopyWith(UIColor_GrayscaleAlphaColorSpace value, $Res Function(UIColor_GrayscaleAlphaColorSpace) _then) = _$UIColor_GrayscaleAlphaColorSpaceCopyWithImpl; +@override @useResult +$Res call({ + int colorComponents, double white, double alpha, Uint8List bin, int colorSpace, String class_ +}); + + + + +} +/// @nodoc +class _$UIColor_GrayscaleAlphaColorSpaceCopyWithImpl<$Res> + implements $UIColor_GrayscaleAlphaColorSpaceCopyWith<$Res> { + _$UIColor_GrayscaleAlphaColorSpaceCopyWithImpl(this._self, this._then); + + final UIColor_GrayscaleAlphaColorSpace _self; + final $Res Function(UIColor_GrayscaleAlphaColorSpace) _then; + +/// Create a copy of UIColor +/// with the given fields replaced by the non-null parameter values. +@override @pragma('vm:prefer-inline') $Res call({Object? colorComponents = null,Object? white = null,Object? alpha = null,Object? bin = null,Object? colorSpace = null,Object? class_ = null,}) { + return _then(UIColor_GrayscaleAlphaColorSpace( +colorComponents: null == colorComponents ? _self.colorComponents : colorComponents // ignore: cast_nullable_to_non_nullable +as int,white: null == white ? _self.white : white // ignore: cast_nullable_to_non_nullable +as double,alpha: null == alpha ? _self.alpha : alpha // ignore: cast_nullable_to_non_nullable +as double,bin: null == bin ? _self.bin : bin // ignore: cast_nullable_to_non_nullable +as Uint8List,colorSpace: null == colorSpace ? _self.colorSpace : colorSpace // ignore: cast_nullable_to_non_nullable +as int,class_: null == class_ ? _self.class_ : class_ // ignore: cast_nullable_to_non_nullable +as String, + )); +} + + } /// @nodoc +mixin _$UpdateAccountFinish { -class _$UIColor_RGBAColorSpaceImpl extends UIColor_RGBAColorSpace { - const _$UIColor_RGBAColorSpaceImpl( - {required this.colorComponents, - required this.green, - required this.blue, - required this.red, - this.greenDbl, - this.blueDbl, - this.redDbl, - this.alphaDbl, - required this.alpha, - required this.rgb, - required this.colorSpace, - required this.class_}) - : super._(); - - @override - final int colorComponents; - @override - final double green; - @override - final double blue; - @override - final double red; - @override - final double? greenDbl; - @override - final double? blueDbl; - @override - final double? redDbl; - @override - final double? alphaDbl; - @override - final double alpha; - @override - final Uint8List rgb; - @override - final int colorSpace; - @override - final String class_; - - @override - String toString() { - return 'UIColor.rgbaColorSpace(colorComponents: $colorComponents, green: $green, blue: $blue, red: $red, greenDbl: $greenDbl, blueDbl: $blueDbl, redDbl: $redDbl, alphaDbl: $alphaDbl, alpha: $alpha, rgb: $rgb, colorSpace: $colorSpace, class_: $class_)'; - } - @override - bool operator ==(Object other) { - return identical(this, other) || - (other.runtimeType == runtimeType && - other is _$UIColor_RGBAColorSpaceImpl && - (identical(other.colorComponents, colorComponents) || - other.colorComponents == colorComponents) && - (identical(other.green, green) || other.green == green) && - (identical(other.blue, blue) || other.blue == blue) && - (identical(other.red, red) || other.red == red) && - (identical(other.greenDbl, greenDbl) || - other.greenDbl == greenDbl) && - (identical(other.blueDbl, blueDbl) || other.blueDbl == blueDbl) && - (identical(other.redDbl, redDbl) || other.redDbl == redDbl) && - (identical(other.alphaDbl, alphaDbl) || - other.alphaDbl == alphaDbl) && - (identical(other.alpha, alpha) || other.alpha == alpha) && - const DeepCollectionEquality().equals(other.rgb, rgb) && - (identical(other.colorSpace, colorSpace) || - other.colorSpace == colorSpace) && - (identical(other.class_, class_) || other.class_ == class_)); - } - @override - int get hashCode => Object.hash( - runtimeType, - colorComponents, - green, - blue, - red, - greenDbl, - blueDbl, - redDbl, - alphaDbl, - alpha, - const DeepCollectionEquality().hash(rgb), - colorSpace, - class_); - - /// Create a copy of UIColor - /// with the given fields replaced by the non-null parameter values. - @JsonKey(includeFromJson: false, includeToJson: false) - @override - @pragma('vm:prefer-inline') - _$$UIColor_RGBAColorSpaceImplCopyWith<_$UIColor_RGBAColorSpaceImpl> - get copyWith => __$$UIColor_RGBAColorSpaceImplCopyWithImpl< - _$UIColor_RGBAColorSpaceImpl>(this, _$identity); - - @override - @optionalTypeArgs - TResult when({ - required TResult Function( - int colorComponents, - double green, - double blue, - double red, - double? greenDbl, - double? blueDbl, - double? redDbl, - double? alphaDbl, - double alpha, - Uint8List rgb, - int colorSpace, - String class_) - rgbaColorSpace, - required TResult Function(int colorComponents, double white, double alpha, - Uint8List bin, int colorSpace, String class_) - grayscaleAlphaColorSpace, - }) { - return rgbaColorSpace(colorComponents, green, blue, red, greenDbl, blueDbl, - redDbl, alphaDbl, alpha, rgb, colorSpace, class_); - } - @override - @optionalTypeArgs - TResult? whenOrNull({ - TResult? Function( - int colorComponents, - double green, - double blue, - double red, - double? greenDbl, - double? blueDbl, - double? redDbl, - double? alphaDbl, - double alpha, - Uint8List rgb, - int colorSpace, - String class_)? - rgbaColorSpace, - TResult? Function(int colorComponents, double white, double alpha, - Uint8List bin, int colorSpace, String class_)? - grayscaleAlphaColorSpace, - }) { - return rgbaColorSpace?.call(colorComponents, green, blue, red, greenDbl, - blueDbl, redDbl, alphaDbl, alpha, rgb, colorSpace, class_); - } - @override - @optionalTypeArgs - TResult maybeWhen({ - TResult Function( - int colorComponents, - double green, - double blue, - double red, - double? greenDbl, - double? blueDbl, - double? redDbl, - double? alphaDbl, - double alpha, - Uint8List rgb, - int colorSpace, - String class_)? - rgbaColorSpace, - TResult Function(int colorComponents, double white, double alpha, - Uint8List bin, int colorSpace, String class_)? - grayscaleAlphaColorSpace, - required TResult orElse(), - }) { - if (rgbaColorSpace != null) { - return rgbaColorSpace(colorComponents, green, blue, red, greenDbl, - blueDbl, redDbl, alphaDbl, alpha, rgb, colorSpace, class_); - } - return orElse(); - } +@override +bool operator ==(Object other) { + return identical(this, other) || (other.runtimeType == runtimeType&&other is UpdateAccountFinish); +} - @override - @optionalTypeArgs - TResult map({ - required TResult Function(UIColor_RGBAColorSpace value) rgbaColorSpace, - required TResult Function(UIColor_GrayscaleAlphaColorSpace value) - grayscaleAlphaColorSpace, - }) { - return rgbaColorSpace(this); - } - @override - @optionalTypeArgs - TResult? mapOrNull({ - TResult? Function(UIColor_RGBAColorSpace value)? rgbaColorSpace, - TResult? Function(UIColor_GrayscaleAlphaColorSpace value)? - grayscaleAlphaColorSpace, - }) { - return rgbaColorSpace?.call(this); - } +@override +int get hashCode => runtimeType.hashCode; - @override - @optionalTypeArgs - TResult maybeMap({ - TResult Function(UIColor_RGBAColorSpace value)? rgbaColorSpace, - TResult Function(UIColor_GrayscaleAlphaColorSpace value)? - grayscaleAlphaColorSpace, - required TResult orElse(), - }) { - if (rgbaColorSpace != null) { - return rgbaColorSpace(this); - } - return orElse(); - } +@override +String toString() { + return 'UpdateAccountFinish()'; } -abstract class UIColor_RGBAColorSpace extends UIColor { - const factory UIColor_RGBAColorSpace( - {required final int colorComponents, - required final double green, - required final double blue, - required final double red, - final double? greenDbl, - final double? blueDbl, - final double? redDbl, - final double? alphaDbl, - required final double alpha, - required final Uint8List rgb, - required final int colorSpace, - required final String class_}) = _$UIColor_RGBAColorSpaceImpl; - const UIColor_RGBAColorSpace._() : super._(); - - @override - int get colorComponents; - double get green; - double get blue; - double get red; - double? get greenDbl; - double? get blueDbl; - double? get redDbl; - double? get alphaDbl; - @override - double get alpha; - Uint8List get rgb; - @override - int get colorSpace; - @override - String get class_; - - /// Create a copy of UIColor - /// with the given fields replaced by the non-null parameter values. - @override - @JsonKey(includeFromJson: false, includeToJson: false) - _$$UIColor_RGBAColorSpaceImplCopyWith<_$UIColor_RGBAColorSpaceImpl> - get copyWith => throw _privateConstructorUsedError; -} - -/// @nodoc -abstract class _$$UIColor_GrayscaleAlphaColorSpaceImplCopyWith<$Res> - implements $UIColorCopyWith<$Res> { - factory _$$UIColor_GrayscaleAlphaColorSpaceImplCopyWith( - _$UIColor_GrayscaleAlphaColorSpaceImpl value, - $Res Function(_$UIColor_GrayscaleAlphaColorSpaceImpl) then) = - __$$UIColor_GrayscaleAlphaColorSpaceImplCopyWithImpl<$Res>; - @override - @useResult - $Res call( - {int colorComponents, - double white, - double alpha, - Uint8List bin, - int colorSpace, - String class_}); -} - -/// @nodoc -class __$$UIColor_GrayscaleAlphaColorSpaceImplCopyWithImpl<$Res> - extends _$UIColorCopyWithImpl<$Res, _$UIColor_GrayscaleAlphaColorSpaceImpl> - implements _$$UIColor_GrayscaleAlphaColorSpaceImplCopyWith<$Res> { - __$$UIColor_GrayscaleAlphaColorSpaceImplCopyWithImpl( - _$UIColor_GrayscaleAlphaColorSpaceImpl _value, - $Res Function(_$UIColor_GrayscaleAlphaColorSpaceImpl) _then) - : super(_value, _then); - - /// Create a copy of UIColor - /// with the given fields replaced by the non-null parameter values. - @pragma('vm:prefer-inline') - @override - $Res call({ - Object? colorComponents = null, - Object? white = null, - Object? alpha = null, - Object? bin = null, - Object? colorSpace = null, - Object? class_ = null, - }) { - return _then(_$UIColor_GrayscaleAlphaColorSpaceImpl( - colorComponents: null == colorComponents - ? _value.colorComponents - : colorComponents // ignore: cast_nullable_to_non_nullable - as int, - white: null == white - ? _value.white - : white // ignore: cast_nullable_to_non_nullable - as double, - alpha: null == alpha - ? _value.alpha - : alpha // ignore: cast_nullable_to_non_nullable - as double, - bin: null == bin - ? _value.bin - : bin // ignore: cast_nullable_to_non_nullable - as Uint8List, - colorSpace: null == colorSpace - ? _value.colorSpace - : colorSpace // ignore: cast_nullable_to_non_nullable - as int, - class_: null == class_ - ? _value.class_ - : class_ // ignore: cast_nullable_to_non_nullable - as String, - )); - } + } /// @nodoc +class $UpdateAccountFinishCopyWith<$Res> { +$UpdateAccountFinishCopyWith(UpdateAccountFinish _, $Res Function(UpdateAccountFinish) __); +} -class _$UIColor_GrayscaleAlphaColorSpaceImpl - extends UIColor_GrayscaleAlphaColorSpace { - const _$UIColor_GrayscaleAlphaColorSpaceImpl( - {required this.colorComponents, - required this.white, - required this.alpha, - required this.bin, - required this.colorSpace, - required this.class_}) - : super._(); - - @override - final int colorComponents; - @override - final double white; - @override - final double alpha; - @override - final Uint8List bin; - @override - final int colorSpace; - @override - final String class_; - - @override - String toString() { - return 'UIColor.grayscaleAlphaColorSpace(colorComponents: $colorComponents, white: $white, alpha: $alpha, bin: $bin, colorSpace: $colorSpace, class_: $class_)'; - } - @override - bool operator ==(Object other) { - return identical(this, other) || - (other.runtimeType == runtimeType && - other is _$UIColor_GrayscaleAlphaColorSpaceImpl && - (identical(other.colorComponents, colorComponents) || - other.colorComponents == colorComponents) && - (identical(other.white, white) || other.white == white) && - (identical(other.alpha, alpha) || other.alpha == alpha) && - const DeepCollectionEquality().equals(other.bin, bin) && - (identical(other.colorSpace, colorSpace) || - other.colorSpace == colorSpace) && - (identical(other.class_, class_) || other.class_ == class_)); - } +/// Adds pattern-matching-related methods to [UpdateAccountFinish]. +extension UpdateAccountFinishPatterns on UpdateAccountFinish { +/// A variant of `map` that fallback to returning `orElse`. +/// +/// It is equivalent to doing: +/// ```dart +/// switch (sealedClass) { +/// case final Subclass value: +/// return ...; +/// case _: +/// return orElse(); +/// } +/// ``` + +@optionalTypeArgs TResult maybeMap({TResult Function( UpdateAccountFinish_MacOS value)? macOs,TResult Function( UpdateAccountFinish_IOS value)? ios,required TResult orElse(),}){ +final _that = this; +switch (_that) { +case UpdateAccountFinish_MacOS() when macOs != null: +return macOs(_that);case UpdateAccountFinish_IOS() when ios != null: +return ios(_that);case _: + return orElse(); + +} +} +/// A `switch`-like method, using callbacks. +/// +/// Callbacks receives the raw object, upcasted. +/// It is equivalent to doing: +/// ```dart +/// switch (sealedClass) { +/// case final Subclass value: +/// return ...; +/// case final Subclass2 value: +/// return ...; +/// } +/// ``` - @override - int get hashCode => Object.hash(runtimeType, colorComponents, white, alpha, - const DeepCollectionEquality().hash(bin), colorSpace, class_); - - /// Create a copy of UIColor - /// with the given fields replaced by the non-null parameter values. - @JsonKey(includeFromJson: false, includeToJson: false) - @override - @pragma('vm:prefer-inline') - _$$UIColor_GrayscaleAlphaColorSpaceImplCopyWith< - _$UIColor_GrayscaleAlphaColorSpaceImpl> - get copyWith => __$$UIColor_GrayscaleAlphaColorSpaceImplCopyWithImpl< - _$UIColor_GrayscaleAlphaColorSpaceImpl>(this, _$identity); - - @override - @optionalTypeArgs - TResult when({ - required TResult Function( - int colorComponents, - double green, - double blue, - double red, - double? greenDbl, - double? blueDbl, - double? redDbl, - double? alphaDbl, - double alpha, - Uint8List rgb, - int colorSpace, - String class_) - rgbaColorSpace, - required TResult Function(int colorComponents, double white, double alpha, - Uint8List bin, int colorSpace, String class_) - grayscaleAlphaColorSpace, - }) { - return grayscaleAlphaColorSpace( - colorComponents, white, alpha, bin, colorSpace, class_); - } +@optionalTypeArgs TResult map({required TResult Function( UpdateAccountFinish_MacOS value) macOs,required TResult Function( UpdateAccountFinish_IOS value) ios,}){ +final _that = this; +switch (_that) { +case UpdateAccountFinish_MacOS(): +return macOs(_that);case UpdateAccountFinish_IOS(): +return ios(_that);} +} +/// A variant of `map` that fallback to returning `null`. +/// +/// It is equivalent to doing: +/// ```dart +/// switch (sealedClass) { +/// case final Subclass value: +/// return ...; +/// case _: +/// return null; +/// } +/// ``` - @override - @optionalTypeArgs - TResult? whenOrNull({ - TResult? Function( - int colorComponents, - double green, - double blue, - double red, - double? greenDbl, - double? blueDbl, - double? redDbl, - double? alphaDbl, - double alpha, - Uint8List rgb, - int colorSpace, - String class_)? - rgbaColorSpace, - TResult? Function(int colorComponents, double white, double alpha, - Uint8List bin, int colorSpace, String class_)? - grayscaleAlphaColorSpace, - }) { - return grayscaleAlphaColorSpace?.call( - colorComponents, white, alpha, bin, colorSpace, class_); - } +@optionalTypeArgs TResult? mapOrNull({TResult? Function( UpdateAccountFinish_MacOS value)? macOs,TResult? Function( UpdateAccountFinish_IOS value)? ios,}){ +final _that = this; +switch (_that) { +case UpdateAccountFinish_MacOS() when macOs != null: +return macOs(_that);case UpdateAccountFinish_IOS() when ios != null: +return ios(_that);case _: + return null; - @override - @optionalTypeArgs - TResult maybeWhen({ - TResult Function( - int colorComponents, - double green, - double blue, - double red, - double? greenDbl, - double? blueDbl, - double? redDbl, - double? alphaDbl, - double alpha, - Uint8List rgb, - int colorSpace, - String class_)? - rgbaColorSpace, - TResult Function(int colorComponents, double white, double alpha, - Uint8List bin, int colorSpace, String class_)? - grayscaleAlphaColorSpace, - required TResult orElse(), - }) { - if (grayscaleAlphaColorSpace != null) { - return grayscaleAlphaColorSpace( - colorComponents, white, alpha, bin, colorSpace, class_); - } - return orElse(); - } +} +} +/// A variant of `when` that fallback to an `orElse` callback. +/// +/// It is equivalent to doing: +/// ```dart +/// switch (sealedClass) { +/// case Subclass(:final field): +/// return ...; +/// case _: +/// return orElse(); +/// } +/// ``` - @override - @optionalTypeArgs - TResult map({ - required TResult Function(UIColor_RGBAColorSpace value) rgbaColorSpace, - required TResult Function(UIColor_GrayscaleAlphaColorSpace value) - grayscaleAlphaColorSpace, - }) { - return grayscaleAlphaColorSpace(this); - } +@optionalTypeArgs TResult maybeWhen({TResult Function()? macOs,TResult Function( String url)? ios,required TResult orElse(),}) {final _that = this; +switch (_that) { +case UpdateAccountFinish_MacOS() when macOs != null: +return macOs();case UpdateAccountFinish_IOS() when ios != null: +return ios(_that.url);case _: + return orElse(); - @override - @optionalTypeArgs - TResult? mapOrNull({ - TResult? Function(UIColor_RGBAColorSpace value)? rgbaColorSpace, - TResult? Function(UIColor_GrayscaleAlphaColorSpace value)? - grayscaleAlphaColorSpace, - }) { - return grayscaleAlphaColorSpace?.call(this); - } +} +} +/// A `switch`-like method, using callbacks. +/// +/// As opposed to `map`, this offers destructuring. +/// It is equivalent to doing: +/// ```dart +/// switch (sealedClass) { +/// case Subclass(:final field): +/// return ...; +/// case Subclass2(:final field2): +/// return ...; +/// } +/// ``` + +@optionalTypeArgs TResult when({required TResult Function() macOs,required TResult Function( String url) ios,}) {final _that = this; +switch (_that) { +case UpdateAccountFinish_MacOS(): +return macOs();case UpdateAccountFinish_IOS(): +return ios(_that.url);} +} +/// A variant of `when` that fallback to returning `null` +/// +/// It is equivalent to doing: +/// ```dart +/// switch (sealedClass) { +/// case Subclass(:final field): +/// return ...; +/// case _: +/// return null; +/// } +/// ``` + +@optionalTypeArgs TResult? whenOrNull({TResult? Function()? macOs,TResult? Function( String url)? ios,}) {final _that = this; +switch (_that) { +case UpdateAccountFinish_MacOS() when macOs != null: +return macOs();case UpdateAccountFinish_IOS() when ios != null: +return ios(_that.url);case _: + return null; - @override - @optionalTypeArgs - TResult maybeMap({ - TResult Function(UIColor_RGBAColorSpace value)? rgbaColorSpace, - TResult Function(UIColor_GrayscaleAlphaColorSpace value)? - grayscaleAlphaColorSpace, - required TResult orElse(), - }) { - if (grayscaleAlphaColorSpace != null) { - return grayscaleAlphaColorSpace(this); - } - return orElse(); - } +} } -abstract class UIColor_GrayscaleAlphaColorSpace extends UIColor { - const factory UIColor_GrayscaleAlphaColorSpace( - {required final int colorComponents, - required final double white, - required final double alpha, - required final Uint8List bin, - required final int colorSpace, - required final String class_}) = _$UIColor_GrayscaleAlphaColorSpaceImpl; - const UIColor_GrayscaleAlphaColorSpace._() : super._(); - - @override - int get colorComponents; - double get white; - @override - double get alpha; - Uint8List get bin; - @override - int get colorSpace; - @override - String get class_; - - /// Create a copy of UIColor - /// with the given fields replaced by the non-null parameter values. - @override - @JsonKey(includeFromJson: false, includeToJson: false) - _$$UIColor_GrayscaleAlphaColorSpaceImplCopyWith< - _$UIColor_GrayscaleAlphaColorSpaceImpl> - get copyWith => throw _privateConstructorUsedError; } /// @nodoc -mixin _$UpdateAccountFinish { - @optionalTypeArgs - TResult when({ - required TResult Function() macOs, - required TResult Function(String url) ios, - }) => - throw _privateConstructorUsedError; - @optionalTypeArgs - TResult? whenOrNull({ - TResult? Function()? macOs, - TResult? Function(String url)? ios, - }) => - throw _privateConstructorUsedError; - @optionalTypeArgs - TResult maybeWhen({ - TResult Function()? macOs, - TResult Function(String url)? ios, - required TResult orElse(), - }) => - throw _privateConstructorUsedError; - @optionalTypeArgs - TResult map({ - required TResult Function(UpdateAccountFinish_MacOS value) macOs, - required TResult Function(UpdateAccountFinish_IOS value) ios, - }) => - throw _privateConstructorUsedError; - @optionalTypeArgs - TResult? mapOrNull({ - TResult? Function(UpdateAccountFinish_MacOS value)? macOs, - TResult? Function(UpdateAccountFinish_IOS value)? ios, - }) => - throw _privateConstructorUsedError; - @optionalTypeArgs - TResult maybeMap({ - TResult Function(UpdateAccountFinish_MacOS value)? macOs, - TResult Function(UpdateAccountFinish_IOS value)? ios, - required TResult orElse(), - }) => - throw _privateConstructorUsedError; -} - -/// @nodoc -abstract class $UpdateAccountFinishCopyWith<$Res> { - factory $UpdateAccountFinishCopyWith( - UpdateAccountFinish value, $Res Function(UpdateAccountFinish) then) = - _$UpdateAccountFinishCopyWithImpl<$Res, UpdateAccountFinish>; -} - -/// @nodoc -class _$UpdateAccountFinishCopyWithImpl<$Res, $Val extends UpdateAccountFinish> - implements $UpdateAccountFinishCopyWith<$Res> { - _$UpdateAccountFinishCopyWithImpl(this._value, this._then); - - // ignore: unused_field - final $Val _value; - // ignore: unused_field - final $Res Function($Val) _then; - - /// Create a copy of UpdateAccountFinish - /// with the given fields replaced by the non-null parameter values. -} - -/// @nodoc -abstract class _$$UpdateAccountFinish_MacOSImplCopyWith<$Res> { - factory _$$UpdateAccountFinish_MacOSImplCopyWith( - _$UpdateAccountFinish_MacOSImpl value, - $Res Function(_$UpdateAccountFinish_MacOSImpl) then) = - __$$UpdateAccountFinish_MacOSImplCopyWithImpl<$Res>; -} - -/// @nodoc -class __$$UpdateAccountFinish_MacOSImplCopyWithImpl<$Res> - extends _$UpdateAccountFinishCopyWithImpl<$Res, - _$UpdateAccountFinish_MacOSImpl> - implements _$$UpdateAccountFinish_MacOSImplCopyWith<$Res> { - __$$UpdateAccountFinish_MacOSImplCopyWithImpl( - _$UpdateAccountFinish_MacOSImpl _value, - $Res Function(_$UpdateAccountFinish_MacOSImpl) _then) - : super(_value, _then); - - /// Create a copy of UpdateAccountFinish - /// with the given fields replaced by the non-null parameter values. -} - -/// @nodoc - -class _$UpdateAccountFinish_MacOSImpl extends UpdateAccountFinish_MacOS { - const _$UpdateAccountFinish_MacOSImpl() : super._(); - - @override - String toString() { - return 'UpdateAccountFinish.macOs()'; - } - @override - bool operator ==(Object other) { - return identical(this, other) || - (other.runtimeType == runtimeType && - other is _$UpdateAccountFinish_MacOSImpl); - } - @override - int get hashCode => runtimeType.hashCode; +class UpdateAccountFinish_MacOS extends UpdateAccountFinish { + const UpdateAccountFinish_MacOS(): super._(); - @override - @optionalTypeArgs - TResult when({ - required TResult Function() macOs, - required TResult Function(String url) ios, - }) { - return macOs(); - } - @override - @optionalTypeArgs - TResult? whenOrNull({ - TResult? Function()? macOs, - TResult? Function(String url)? ios, - }) { - return macOs?.call(); - } - @override - @optionalTypeArgs - TResult maybeWhen({ - TResult Function()? macOs, - TResult Function(String url)? ios, - required TResult orElse(), - }) { - if (macOs != null) { - return macOs(); - } - return orElse(); - } - @override - @optionalTypeArgs - TResult map({ - required TResult Function(UpdateAccountFinish_MacOS value) macOs, - required TResult Function(UpdateAccountFinish_IOS value) ios, - }) { - return macOs(this); - } - @override - @optionalTypeArgs - TResult? mapOrNull({ - TResult? Function(UpdateAccountFinish_MacOS value)? macOs, - TResult? Function(UpdateAccountFinish_IOS value)? ios, - }) { - return macOs?.call(this); - } - @override - @optionalTypeArgs - TResult maybeMap({ - TResult Function(UpdateAccountFinish_MacOS value)? macOs, - TResult Function(UpdateAccountFinish_IOS value)? ios, - required TResult orElse(), - }) { - if (macOs != null) { - return macOs(this); - } - return orElse(); - } + +@override +bool operator ==(Object other) { + return identical(this, other) || (other.runtimeType == runtimeType&&other is UpdateAccountFinish_MacOS); } -abstract class UpdateAccountFinish_MacOS extends UpdateAccountFinish { - const factory UpdateAccountFinish_MacOS() = _$UpdateAccountFinish_MacOSImpl; - const UpdateAccountFinish_MacOS._() : super._(); -} - -/// @nodoc -abstract class _$$UpdateAccountFinish_IOSImplCopyWith<$Res> { - factory _$$UpdateAccountFinish_IOSImplCopyWith( - _$UpdateAccountFinish_IOSImpl value, - $Res Function(_$UpdateAccountFinish_IOSImpl) then) = - __$$UpdateAccountFinish_IOSImplCopyWithImpl<$Res>; - @useResult - $Res call({String url}); -} - -/// @nodoc -class __$$UpdateAccountFinish_IOSImplCopyWithImpl<$Res> - extends _$UpdateAccountFinishCopyWithImpl<$Res, - _$UpdateAccountFinish_IOSImpl> - implements _$$UpdateAccountFinish_IOSImplCopyWith<$Res> { - __$$UpdateAccountFinish_IOSImplCopyWithImpl( - _$UpdateAccountFinish_IOSImpl _value, - $Res Function(_$UpdateAccountFinish_IOSImpl) _then) - : super(_value, _then); - - /// Create a copy of UpdateAccountFinish - /// with the given fields replaced by the non-null parameter values. - @pragma('vm:prefer-inline') - @override - $Res call({ - Object? url = null, - }) { - return _then(_$UpdateAccountFinish_IOSImpl( - url: null == url - ? _value.url - : url // ignore: cast_nullable_to_non_nullable - as String, - )); - } + +@override +int get hashCode => runtimeType.hashCode; + +@override +String toString() { + return 'UpdateAccountFinish.macOs()'; +} + + } + + + /// @nodoc -class _$UpdateAccountFinish_IOSImpl extends UpdateAccountFinish_IOS { - const _$UpdateAccountFinish_IOSImpl({required this.url}) : super._(); - @override - final String url; +class UpdateAccountFinish_IOS extends UpdateAccountFinish { + const UpdateAccountFinish_IOS({required this.url}): super._(); - @override - String toString() { - return 'UpdateAccountFinish.ios(url: $url)'; - } - @override - bool operator ==(Object other) { - return identical(this, other) || - (other.runtimeType == runtimeType && - other is _$UpdateAccountFinish_IOSImpl && - (identical(other.url, url) || other.url == url)); - } + final String url; - @override - int get hashCode => Object.hash(runtimeType, url); - - /// Create a copy of UpdateAccountFinish - /// with the given fields replaced by the non-null parameter values. - @JsonKey(includeFromJson: false, includeToJson: false) - @override - @pragma('vm:prefer-inline') - _$$UpdateAccountFinish_IOSImplCopyWith<_$UpdateAccountFinish_IOSImpl> - get copyWith => __$$UpdateAccountFinish_IOSImplCopyWithImpl< - _$UpdateAccountFinish_IOSImpl>(this, _$identity); - - @override - @optionalTypeArgs - TResult when({ - required TResult Function() macOs, - required TResult Function(String url) ios, - }) { - return ios(url); - } +/// Create a copy of UpdateAccountFinish +/// with the given fields replaced by the non-null parameter values. +@JsonKey(includeFromJson: false, includeToJson: false) +@pragma('vm:prefer-inline') +$UpdateAccountFinish_IOSCopyWith get copyWith => _$UpdateAccountFinish_IOSCopyWithImpl(this, _$identity); - @override - @optionalTypeArgs - TResult? whenOrNull({ - TResult? Function()? macOs, - TResult? Function(String url)? ios, - }) { - return ios?.call(url); - } - @override - @optionalTypeArgs - TResult maybeWhen({ - TResult Function()? macOs, - TResult Function(String url)? ios, - required TResult orElse(), - }) { - if (ios != null) { - return ios(url); - } - return orElse(); - } - @override - @optionalTypeArgs - TResult map({ - required TResult Function(UpdateAccountFinish_MacOS value) macOs, - required TResult Function(UpdateAccountFinish_IOS value) ios, - }) { - return ios(this); - } +@override +bool operator ==(Object other) { + return identical(this, other) || (other.runtimeType == runtimeType&&other is UpdateAccountFinish_IOS&&(identical(other.url, url) || other.url == url)); +} + + +@override +int get hashCode => Object.hash(runtimeType,url); + +@override +String toString() { + return 'UpdateAccountFinish.ios(url: $url)'; +} + + +} + +/// @nodoc +abstract mixin class $UpdateAccountFinish_IOSCopyWith<$Res> implements $UpdateAccountFinishCopyWith<$Res> { + factory $UpdateAccountFinish_IOSCopyWith(UpdateAccountFinish_IOS value, $Res Function(UpdateAccountFinish_IOS) _then) = _$UpdateAccountFinish_IOSCopyWithImpl; +@useResult +$Res call({ + String url +}); + + - @override - @optionalTypeArgs - TResult? mapOrNull({ - TResult? Function(UpdateAccountFinish_MacOS value)? macOs, - TResult? Function(UpdateAccountFinish_IOS value)? ios, - }) { - return ios?.call(this); - } - @override - @optionalTypeArgs - TResult maybeMap({ - TResult Function(UpdateAccountFinish_MacOS value)? macOs, - TResult Function(UpdateAccountFinish_IOS value)? ios, - required TResult orElse(), - }) { - if (ios != null) { - return ios(this); - } - return orElse(); - } } +/// @nodoc +class _$UpdateAccountFinish_IOSCopyWithImpl<$Res> + implements $UpdateAccountFinish_IOSCopyWith<$Res> { + _$UpdateAccountFinish_IOSCopyWithImpl(this._self, this._then); + + final UpdateAccountFinish_IOS _self; + final $Res Function(UpdateAccountFinish_IOS) _then; -abstract class UpdateAccountFinish_IOS extends UpdateAccountFinish { - const factory UpdateAccountFinish_IOS({required final String url}) = - _$UpdateAccountFinish_IOSImpl; - const UpdateAccountFinish_IOS._() : super._(); +/// Create a copy of UpdateAccountFinish +/// with the given fields replaced by the non-null parameter values. +@pragma('vm:prefer-inline') $Res call({Object? url = null,}) { + return _then(UpdateAccountFinish_IOS( +url: null == url ? _self.url : url // ignore: cast_nullable_to_non_nullable +as String, + )); +} - String get url; - /// Create a copy of UpdateAccountFinish - /// with the given fields replaced by the non-null parameter values. - @JsonKey(includeFromJson: false, includeToJson: false) - _$$UpdateAccountFinish_IOSImplCopyWith<_$UpdateAccountFinish_IOSImpl> - get copyWith => throw _privateConstructorUsedError; } + +// dart format on diff --git a/lib/src/rust/frb_generated.dart b/lib/src/rust/frb_generated.dart index e556cbc6e1..e71c1c828f 100644 --- a/lib/src/rust/frb_generated.dart +++ b/lib/src/rust/frb_generated.dart @@ -34,12 +34,8 @@ class RustLib extends BaseEntrypoint { /// Initialize flutter_rust_bridge in mock mode. /// No libraries for FFI are loaded. - static void initMock({ - required RustLibApi api, - }) { - instance.initMockImpl( - api: api, - ); + static void initMock({required RustLibApi api}) { + instance.initMockImpl(api: api); } /// Dispose flutter_rust_bridge @@ -67,598 +63,899 @@ class RustLib extends BaseEntrypoint { String get codegenVersion => '2.3.0'; @override - int get rustContentHash => -1267927268; + int get rustContentHash => -2124671630; static const kDefaultExternalLibraryLoaderConfig = ExternalLibraryLoaderConfig( - stem: 'rust_lib_bluebubbles', - ioDirectory: 'rust/target/release/', - webPrefix: 'pkg/', - ); + stem: 'rust_lib_bluebubbles', + ioDirectory: 'rust/target/release/', + webPrefix: 'pkg/', + ); } abstract class RustLibApi extends BaseApi { - int crateApiApiLocationReportAutoAccessorGetConfidence( - {required LocationReport that}); + int crateApiApiLocationReportAutoAccessorGetConfidence({ + required LocationReport that, + }); - int crateApiApiLocationReportAutoAccessorGetHorizontalAccuracy( - {required LocationReport that}); + int crateApiApiLocationReportAutoAccessorGetHorizontalAccuracy({ + required LocationReport that, + }); - int crateApiApiLocationReportAutoAccessorGetKeyIndex( - {required LocationReport that}); + int crateApiApiLocationReportAutoAccessorGetKeyIndex({ + required LocationReport that, + }); - double crateApiApiLocationReportAutoAccessorGetLat( - {required LocationReport that}); + double crateApiApiLocationReportAutoAccessorGetLat({ + required LocationReport that, + }); - double crateApiApiLocationReportAutoAccessorGetLong( - {required LocationReport that}); + double crateApiApiLocationReportAutoAccessorGetLong({ + required LocationReport that, + }); - int crateApiApiLocationReportAutoAccessorGetStatus( - {required LocationReport that}); + int crateApiApiLocationReportAutoAccessorGetStatus({ + required LocationReport that, + }); - SystemTime crateApiApiLocationReportAutoAccessorGetTimestamp( - {required LocationReport that}); + SystemTime crateApiApiLocationReportAutoAccessorGetTimestamp({ + required LocationReport that, + }); - void crateApiApiLocationReportAutoAccessorSetConfidence( - {required LocationReport that, required int confidence}); + void crateApiApiLocationReportAutoAccessorSetConfidence({ + required LocationReport that, + required int confidence, + }); - void crateApiApiLocationReportAutoAccessorSetHorizontalAccuracy( - {required LocationReport that, required int horizontalAccuracy}); + void crateApiApiLocationReportAutoAccessorSetHorizontalAccuracy({ + required LocationReport that, + required int horizontalAccuracy, + }); - void crateApiApiLocationReportAutoAccessorSetKeyIndex( - {required LocationReport that, required int keyIndex}); + void crateApiApiLocationReportAutoAccessorSetKeyIndex({ + required LocationReport that, + required int keyIndex, + }); - void crateApiApiLocationReportAutoAccessorSetLat( - {required LocationReport that, required double lat}); + void crateApiApiLocationReportAutoAccessorSetLat({ + required LocationReport that, + required double lat, + }); - void crateApiApiLocationReportAutoAccessorSetLong( - {required LocationReport that, required double long}); + void crateApiApiLocationReportAutoAccessorSetLong({ + required LocationReport that, + required double long, + }); - void crateApiApiLocationReportAutoAccessorSetStatus( - {required LocationReport that, required int status}); + void crateApiApiLocationReportAutoAccessorSetStatus({ + required LocationReport that, + required int status, + }); - void crateApiApiLocationReportAutoAccessorSetTimestamp( - {required LocationReport that, required SystemTime timestamp}); + void crateApiApiLocationReportAutoAccessorSetTimestamp({ + required LocationReport that, + required SystemTime timestamp, + }); PlatformInt64 crateApiApiMessageFlagsBits({required MessageFlags that}); - MessageFlags crateApiApiMessageFlagsFromBitsTruncate( - {required PlatformInt64 val}); + MessageFlags crateApiApiMessageFlagsFromBitsTruncate({ + required PlatformInt64 val, + }); - Uint8List crateApiApiSavedHardwareStateAutoAccessorGetIdentity( - {required SavedHardwareState that}); + Uint8List crateApiApiSavedHardwareStateAutoAccessorGetIdentity({ + required SavedHardwareState that, + }); - JoinedOsConfig crateApiApiSavedHardwareStateAutoAccessorGetOsConfig( - {required SavedHardwareState that}); + JoinedOsConfig crateApiApiSavedHardwareStateAutoAccessorGetOsConfig({ + required SavedHardwareState that, + }); - ApsState crateApiApiSavedHardwareStateAutoAccessorGetPush( - {required SavedHardwareState that}); + ApsState crateApiApiSavedHardwareStateAutoAccessorGetPush({ + required SavedHardwareState that, + }); - void crateApiApiSavedHardwareStateAutoAccessorSetIdentity( - {required SavedHardwareState that, required Uint8List identity}); + void crateApiApiSavedHardwareStateAutoAccessorSetIdentity({ + required SavedHardwareState that, + required Uint8List identity, + }); - void crateApiApiSavedHardwareStateAutoAccessorSetOsConfig( - {required SavedHardwareState that, required JoinedOsConfig osConfig}); + void crateApiApiSavedHardwareStateAutoAccessorSetOsConfig({ + required SavedHardwareState that, + required JoinedOsConfig osConfig, + }); - void crateApiApiSavedHardwareStateAutoAccessorSetPush( - {required SavedHardwareState that, required ApsState push}); + void crateApiApiSavedHardwareStateAutoAccessorSetPush({ + required SavedHardwareState that, + required ApsState push, + }); - String crateApiApiViableBottleAutoAccessorGetDeviceName( - {required ViableBottle that}); + String crateApiApiViableBottleAutoAccessorGetDeviceName({ + required ViableBottle that, + }); - EscrowData crateApiApiViableBottleAutoAccessorGetEscrow( - {required ViableBottle that}); + EscrowData crateApiApiViableBottleAutoAccessorGetEscrow({ + required ViableBottle that, + }); - String crateApiApiViableBottleAutoAccessorGetModelClass( - {required ViableBottle that}); + String crateApiApiViableBottleAutoAccessorGetModelClass({ + required ViableBottle that, + }); - int crateApiApiViableBottleAutoAccessorGetNumericLength( - {required ViableBottle that}); + int crateApiApiViableBottleAutoAccessorGetNumericLength({ + required ViableBottle that, + }); - void crateApiApiViableBottleAutoAccessorSetDeviceName( - {required ViableBottle that, required String deviceName}); + void crateApiApiViableBottleAutoAccessorSetDeviceName({ + required ViableBottle that, + required String deviceName, + }); - void crateApiApiViableBottleAutoAccessorSetEscrow( - {required ViableBottle that, required EscrowData escrow}); + void crateApiApiViableBottleAutoAccessorSetEscrow({ + required ViableBottle that, + required EscrowData escrow, + }); - void crateApiApiViableBottleAutoAccessorSetModelClass( - {required ViableBottle that, required String modelClass}); + void crateApiApiViableBottleAutoAccessorSetModelClass({ + required ViableBottle that, + required String modelClass, + }); - void crateApiApiViableBottleAutoAccessorSetNumericLength( - {required ViableBottle that, required int numericLength}); + void crateApiApiViableBottleAutoAccessorSetNumericLength({ + required ViableBottle that, + required int numericLength, + }); - Future crateApiApiAcceptBeaconShare( - {required ArcFindMyClientDefaultAnisetteProvider items, - required String share}); + Future crateApiApiAcceptBeaconShare({ + required ArcFindMyClientDefaultAnisetteProvider items, + required String share, + }); - Future crateApiApiAcceptInvite( - {required ArcPasswordManagerDefaultAnisetteProvider passwords, - required String inviteId}); + Future crateApiApiAcceptInvite({ + required ArcPasswordManagerDefaultAnisetteProvider passwords, + required String inviteId, + }); - Future> crateApiApiAddAlbum( - {required SyncManagerDefaultAnisetteProviderMyFilePackager lock, - required String guid, - required String folder}); + Future> crateApiApiAddAlbum({ + required SyncManagerDefaultAnisetteProviderMyFilePackager lock, + required String guid, + required String folder, + }); - Future crateApiApiAnswerFtRequest( - {required ArcFtClient facetime, - required LetMeInRequest request, - String? approvedGroup}); + Future crateApiApiAnswerFtRequest({ + required ArcFtClient facetime, + required LetMeInRequest request, + String? approvedGroup, + }); - Future crateApiApiApproveCircle( - {required ArcMutexVecActiveCircleSession state, - required ArcMutexAppleAccountDefaultAnisetteProvider account, - required String txnid}); + Future crateApiApiApproveCircle({ + required ArcMutexVecActiveCircleSession state, + required ArcMutexAppleAccountDefaultAnisetteProvider account, + required String txnid, + }); Future crateApiApiAttachmentGetSize({required Attachment that}); MMCSAttachmentMeta? crateApiApiAttachmentToCloud({required Attachment att}); - Future crateApiApiAuthPhone( - {required ApsConnection conn, - required JoinedOsConfig config, - required String number, - required List sig}); + Future crateApiApiAuthPhone({ + required ApsConnection conn, + required JoinedOsConfig config, + required String number, + required List sig, + }); - (Sender, ArcSenderPushMessage, ApsWatcher) crateApiApiBuildWatcher( - {required ApsConnection conn, required ArcImClient client}); + (Sender, ArcSenderPushMessage, ApsWatcher) crateApiApiBuildWatcher({ + required ApsConnection conn, + required ArcImClient client, + }); - Future crateApiApiCancelFacetime( - {required ArcFtClient facetime, required String guid}); + Future crateApiApiCancelFacetime({ + required ArcFtClient facetime, + required String guid, + }); void crateApiApiCancelPoll({required Sender cancel}); - Future crateApiApiCertifyDelivery( - {required ArcImClient state, - required CertifiedContext context, - required bool notify}); + Future crateApiApiCertifyDelivery({ + required ArcImClient state, + required CertifiedContext context, + required bool notify, + }); - Future crateApiApiChangeEscrowPassword( - {required ArcKeychainClientDefaultAnisetteProvider keychain, - required String devicePassword}); + Future crateApiApiChangeEscrowPassword({ + required ArcKeychainClientDefaultAnisetteProvider keychain, + required String devicePassword, + }); - Future crateApiApiCircleSetupClique( - {required ArcMutexOptionCircleClientSessionDefaultAnisetteProvider client, - required ArcKeychainClientDefaultAnisetteProvider keychain, - required String devicePassword}); + Future crateApiApiCircleSetupClique({ + required ArcMutexOptionCircleClientSessionDefaultAnisetteProvider client, + required ArcKeychainClientDefaultAnisetteProvider keychain, + required String devicePassword, + }); Future crateApiApiClearLinks({required ArcFtClient facetime}); - SimplifiedIncomingCallPoster crateApiApiClonePoster( - {required SimplifiedIncomingCallPoster poster}); + SimplifiedIncomingCallPoster crateApiApiClonePoster({ + required SimplifiedIncomingCallPoster poster, + }); - SimplifiedTranscriptPoster crateApiApiCloneTranscriptPoster( - {required SimplifiedTranscriptPoster poster}); + SimplifiedTranscriptPoster crateApiApiCloneTranscriptPoster({ + required SimplifiedTranscriptPoster poster, + }); void crateApiApiCloseAps({required ApsConnection aps}); void crateApiApiCloseClient({required ArcImClient client}); - void crateApiApiCloseSyncmanager( - {required SyncManagerDefaultAnisetteProviderMyFilePackager shared}); + void crateApiApiCloseSyncmanager({ + required SyncManagerDefaultAnisetteProviderMyFilePackager shared, + }); + + CloudSyncProtectedLeaseResult + crateApiApiCloudSyncAcknowledgeCommittedPageLease({ + required String storageDirectory, + required String pageLeaseReference, + }); + + Future crateApiApiCloudSyncCaptureAuthSnapshot({ + required ArcCloudMessagesClientDefaultAnisetteProvider cloudMessagesClient, + required String storageDirectory, + }); + + CloudSyncProtectedGarbageCollectionResult + crateApiApiCloudSyncCollectProtectedGarbage({ + required String storageDirectory, + required List liveReferences, + required bool liveReferenceEnumerationComplete, + }); + + CloudSyncProtectedLeaseResult crateApiApiCloudSyncCommitProtectedPageLease({ + required String storageDirectory, + required String pageLeaseReference, + required List retainedReferences, + }); + + Future + crateApiApiCloudSyncConsumePreparedMessageCreate({ + required CloudSyncPreparedMessageCreateHandle handle, + }); + + Future + crateApiApiCloudSyncDecodeProtectedChange({ + required ArcCloudMessagesClientDefaultAnisetteProvider cloudMessagesClient, + required String storageDirectory, + required String expectedAccountFingerprint, + required String expectedProtectedStoreIdentity, + required String container, + required String database, + required String zone, + required String streamKind, + required int schemaVersion, + required String nativeStream, + required BigInt generation, + required CloudSyncProtectedChangeKind expectedChangeKind, + required String expectedChangeId, + required String expectedRecordIdHash, + String? expectedEtagHash, + required String expectedPayloadSha256, + BigInt? expectedPayloadLength, + PlatformInt64? expectedServerModifiedAtMillis, + required String protectedRawEnvelopeReference, + CloudSyncTransientEntityKind? tombstoneEntityKind, + String? tombstoneLogicalEntityKeyHash, + }); + + Future crateApiApiCloudSyncFetchProtectedPage({ + required ArcCloudMessagesClientDefaultAnisetteProvider cloudMessagesClient, + required String storageDirectory, + required String expectedAccountFingerprint, + required String stream, + required BigInt generation, + String? previousCheckpointReference, + required int maximumChanges, + }); + + Future crateApiApiCloudSyncFetchRawPage({ + required ArcCloudMessagesClientDefaultAnisetteProvider cloudMessagesClient, + required String stream, + Uint8List? continuationToken, + required int maxChanges, + }); + + String crateApiApiCloudSyncFingerprintAccount({ + required String storageDirectory, + required String rawAccountIdentifier, + }); + + Future + crateApiApiCloudSyncPrepareMessageCreate({ + required ArcCloudMessagesClientDefaultAnisetteProvider cloudMessagesClient, + required String storageDirectory, + required String expectedAccountFingerprint, + required String expectedProtectedStoreIdentity, + required String requestUuid, + required BigInt requestTimeoutSeconds, + required List inputs, + }); + + String crateApiApiCloudSyncProtect({ + required String storageDirectory, + required String accountFingerprint, + required String container, + required String database, + required String zone, + required String streamKind, + required int schemaVersion, + required String purpose, + required String plaintext, + }); + + Future + crateApiApiCloudSyncReconcileMessageCreate({ + required ArcCloudMessagesClientDefaultAnisetteProvider cloudMessagesClient, + required String storageDirectory, + required String expectedAccountFingerprint, + required String expectedProtectedStoreIdentity, + required String requestUuid, + required CloudSyncPreparedMessageCreateInput input, + }); + + CloudSyncProtectedRecoveryResult + crateApiApiCloudSyncRecoverAbandonedPageLeases({ + required String storageDirectory, + required List adoptedLeaseReferences, + required List liveReferences, + required bool liveReferenceEnumerationComplete, + }); + + CloudSyncProtectedRetirementResult + crateApiApiCloudSyncRetireProtectedReferences({ + required String storageDirectory, + required List references, + }); + + CloudSyncProtectedLeaseResult crateApiApiCloudSyncRollbackProtectedPageLease({ + required String storageDirectory, + required String pageLeaseReference, + }); + + Future + crateApiApiCloudSyncStageOutboundMessage({ + required ArcCloudMessagesClientDefaultAnisetteProvider cloudMessagesClient, + required String storageDirectory, + required String expectedAccountFingerprint, + required String expectedProtectedStoreIdentity, + required CloudMessage message, + }); + + String crateApiApiCloudSyncUnprotect({ + required String storageDirectory, + required String accountFingerprint, + required String container, + required String database, + required String zone, + required String streamKind, + required int schemaVersion, + required String purpose, + required String ciphertext, + }); Future crateApiApiCompleteMsg({required String ptr}); - Future crateApiApiConfigFromEncoded( - {required List encoded}); + Future crateApiApiConfigFromEncoded({ + required List encoded, + }); - Future crateApiApiConfigFromRelay( - {required String code, required String host, String? token}); + Future crateApiApiConfigFromRelay({ + required String code, + required String host, + String? token, + }); - Future crateApiApiConfigFromValidationData( - {required List data, required HwExtra extra}); + Future crateApiApiConfigFromValidationData({ + required List data, + required HwExtra extra, + }); Future crateApiApiConfigureAppReview({required String path}); - Future crateApiApiConvertTokenToUuid( - {required ArcImClient state, - required String handle, - required List token}); + Future crateApiApiConvertTokenToUuid({ + required ArcImClient state, + required String handle, + required List token, + }); - Future crateApiApiCountRecords( - {required ArcCloudMessagesClientDefaultAnisetteProvider - cloudMessagesClient}); + Future crateApiApiCountRecords({ + required ArcCloudMessagesClientDefaultAnisetteProvider cloudMessagesClient, + }); - Future crateApiApiCreateFacetime( - {required ArcFtClient facetime, - required String uuid, - required String handle, - required List participants}); + Future crateApiApiCreateFacetime({ + required ArcFtClient facetime, + required String uuid, + required String handle, + required List participants, + }); - Future crateApiApiCreateGroup( - {required ArcPasswordManagerDefaultAnisetteProvider passwords, - required String name}); + Future crateApiApiCreateGroup({ + required ArcPasswordManagerDefaultAnisetteProvider passwords, + required String name, + }); - Future crateApiApiCreateIconArray( - {required LPIconMetadata img}); + Future crateApiApiCreateIconArray({ + required LPIconMetadata img, + }); - Future crateApiApiCreateImageArray( - {required LPImageMetadata img}); + Future crateApiApiCreateImageArray({ + required LPImageMetadata img, + }); Date crateApiApiDateNow(); int crateApiApiDateToMs({required Date date}); - Future crateApiApiDeclineFacetime( - {required ArcFtClient facetime, required String guid}); + Future crateApiApiDeclineFacetime({ + required ArcFtClient facetime, + required String guid, + }); - Future crateApiApiDeclineInvite( - {required ArcPasswordManagerDefaultAnisetteProvider passwords, - required String inviteId}); + Future crateApiApiDeclineInvite({ + required ArcPasswordManagerDefaultAnisetteProvider passwords, + required String inviteId, + }); - AttachmentMeta crateApiApiDecodeAttachmentmeta( - {required GZipWrapperAttachmentMeta wrapped}); + AttachmentMeta crateApiApiDecodeAttachmentmeta({ + required GZipWrapperAttachmentMeta wrapped, + }); ChatProto crateApiApiDecodeChatproto({required GZipWrapperChatProto wrapped}); - ExtensionApp crateApiApiDecodeExtensionApp( - {required List bp, required String bid}); + ExtensionApp crateApiApiDecodeExtensionApp({ + required List bp, + required String bid, + }); IdsngmIdentity crateApiApiDecodeIdentity({required List identity}); MessageSummaryInfo crateApiApiDecodeMessageInfo({required List data}); - MessageProto crateApiApiDecodeMessageproto( - {required GZipWrapperMessageProto wrapped}); + MessageProto crateApiApiDecodeMessageproto({ + required GZipWrapperMessageProto wrapped, + }); - MessageProto2 crateApiApiDecodeMessageproto2( - {required GZipWrapperMessageProto2 wrapped}); + MessageProto2 crateApiApiDecodeMessageproto2({ + required GZipWrapperMessageProto2 wrapped, + }); - MessageProto3 crateApiApiDecodeMessageproto3( - {required GZipWrapperMessageProto3 wrapped}); + MessageProto3 crateApiApiDecodeMessageproto3({ + required GZipWrapperMessageProto3 wrapped, + }); - MessageProto4 crateApiApiDecodeMessageproto4( - {required GZipWrapperMessageProto4 wrapped}); + MessageProto4 crateApiApiDecodeMessageproto4({ + required GZipWrapperMessageProto4 wrapped, + }); - Future crateApiApiDecodeProfileMessage( - {required String s}); + Future crateApiApiDecodeProfileMessage({ + required String s, + }); - Future crateApiApiDecodeSummaryInfo( - {required List info}); + Future crateApiApiDecodeSummaryInfo({ + required List info, + }); - Future crateApiApiDeleteAttachments( - {required ArcCloudMessagesClientDefaultAnisetteProvider - cloudMessagesClient, - required List attachments}); + Future crateApiApiDeleteAttachments({ + required ArcCloudMessagesClientDefaultAnisetteProvider cloudMessagesClient, + required List attachments, + }); - Future crateApiApiDeleteBeaconShare( - {required ArcFindMyClientDefaultAnisetteProvider items, - required String share}); + Future crateApiApiDeleteBeaconShare({ + required ArcFindMyClientDefaultAnisetteProvider items, + required String share, + }); - Future crateApiApiDeleteChats( - {required ArcCloudMessagesClientDefaultAnisetteProvider - cloudMessagesClient, - required List chats}); + Future crateApiApiDeleteChats({ + required ArcCloudMessagesClientDefaultAnisetteProvider cloudMessagesClient, + required List chats, + }); - Future crateApiApiDeleteGroup( - {required ArcPasswordManagerDefaultAnisetteProvider passwords, - required String gid}); + Future crateApiApiDeleteGroup({ + required ArcPasswordManagerDefaultAnisetteProvider passwords, + required String gid, + }); - Future crateApiApiDeleteMessages( - {required ArcCloudMessagesClientDefaultAnisetteProvider - cloudMessagesClient, - required List messages}); + Future crateApiApiDeleteMessages({ + required ArcCloudMessagesClientDefaultAnisetteProvider cloudMessagesClient, + required List messages, + }); - Future crateApiApiDeletePasskey( - {required ArcPasswordManagerDefaultAnisetteProvider passwords, - required String id, - String? group}); + Future crateApiApiDeletePasskey({ + required ArcPasswordManagerDefaultAnisetteProvider passwords, + required String id, + String? group, + }); - Future crateApiApiDeletePassword( - {required ArcPasswordManagerDefaultAnisetteProvider passwords, - required String id, - String? group}); + Future crateApiApiDeletePassword({ + required ArcPasswordManagerDefaultAnisetteProvider passwords, + required String id, + String? group, + }); - Future crateApiApiDeletePasswordMeta( - {required ArcPasswordManagerDefaultAnisetteProvider passwords, - required String id, - String? group}); + Future crateApiApiDeletePasswordMeta({ + required ArcPasswordManagerDefaultAnisetteProvider passwords, + required String id, + String? group, + }); - Future crateApiApiDeleteWifiPassword( - {required ArcPasswordManagerDefaultAnisetteProvider passwords, - required String id, - String? group}); + Future crateApiApiDeleteWifiPassword({ + required ArcPasswordManagerDefaultAnisetteProvider passwords, + required String id, + String? group, + }); Future crateApiApiDoFirstTimeInit({required String path}); - Future crateApiApiDoLogin( - {required String path, - required ArcMutexAppleAccountDefaultAnisetteProvider account, - UpdateAccountFinish? finish, - required JoinedOsConfig osConfig}); + Future crateApiApiDoLogin({ + required String path, + required ArcMutexAppleAccountDefaultAnisetteProvider account, + UpdateAccountFinish? finish, + required JoinedOsConfig osConfig, + }); Future crateApiApiDoReregister({required ArcImClient state}); - Stream crateApiApiDownloadAttachment( - {required ApsConnection aps, - required Attachment attachment, - required String path}); + Stream crateApiApiDownloadAttachment({ + required ApsConnection aps, + required Attachment attachment, + required String path, + }); - Future crateApiApiDownloadCloudAttachments( - {required ArcCloudMessagesClientDefaultAnisetteProvider - cloudMessagesClient, - required List<(String, String)> files}); + Future crateApiApiDownloadCloudAttachments({ + required ArcCloudMessagesClientDefaultAnisetteProvider cloudMessagesClient, + required List<(String, String)> files, + }); - Future crateApiApiDownloadCloudGroupPhotos( - {required ArcCloudMessagesClientDefaultAnisetteProvider - cloudMessagesClient, - required List<(String, String)> files}); + Future crateApiApiDownloadCloudGroupPhotos({ + required ArcCloudMessagesClientDefaultAnisetteProvider cloudMessagesClient, + required List<(String, String)> files, + }); - Stream crateApiApiDownloadMmcs( - {required ApsConnection aps, - required MMCSFile attachment, - required String path}); + Stream crateApiApiDownloadMmcs({ + required ApsConnection aps, + required MMCSFile attachment, + required String path, + }); - (ArcSharedPushState, SharedPushState) crateApiApiDupDaemonDesk( - {required SharedPushState state}); + (ArcSharedPushState, SharedPushState) crateApiApiDupDaemonDesk({ + required SharedPushState state, + }); IdsUser crateApiApiDuplicateUser({required IdsUser user}); - GZipWrapperAttachmentMeta crateApiApiEncodeAttachmentmeta( - {required AttachmentMeta attachmentmeta}); + GZipWrapperAttachmentMeta crateApiApiEncodeAttachmentmeta({ + required AttachmentMeta attachmentmeta, + }); GZipWrapperChatProto crateApiApiEncodeChatproto({required ChatProto chat}); - (Uint8List, Uint8List?) crateApiApiEncodeExtensionApp( - {required ExtensionApp app}); + (Uint8List, Uint8List?) crateApiApiEncodeExtensionApp({ + required ExtensionApp app, + }); Future crateApiApiEncodeHex({required List bytes}); Uint8List crateApiApiEncodeMessageInfo({required MessageSummaryInfo info}); - GZipWrapperMessageProto crateApiApiEncodeMessageproto( - {required MessageProto messageproto}); + GZipWrapperMessageProto crateApiApiEncodeMessageproto({ + required MessageProto messageproto, + }); - GZipWrapperMessageProto2 crateApiApiEncodeMessageproto2( - {required MessageProto2 messageproto2}); + GZipWrapperMessageProto2 crateApiApiEncodeMessageproto2({ + required MessageProto2 messageproto2, + }); - GZipWrapperMessageProto3 crateApiApiEncodeMessageproto3( - {required MessageProto3 messageproto3}); + GZipWrapperMessageProto3 crateApiApiEncodeMessageproto3({ + required MessageProto3 messageproto3, + }); - GZipWrapperMessageProto4 crateApiApiEncodeMessageproto4( - {required MessageProto4 messageproto4}); + GZipWrapperMessageProto4 crateApiApiEncodeMessageproto4({ + required MessageProto4 messageproto4, + }); - Future crateApiApiEncodeProfileMessage( - {required ShareProfileMessage p}); + Future crateApiApiEncodeProfileMessage({ + required ShareProfileMessage p, + }); - Future crateApiApiEncodeSummaryInfo( - {required MessageSummaryInfo info}); + Future crateApiApiEncodeSummaryInfo({ + required MessageSummaryInfo info, + }); - Future crateApiApiFetchProfile( - {required ArcProfilesClientDefaultAnisetteProvider profiles, - required ShareProfileMessage message}); + Future crateApiApiFetchProfile({ + required ArcProfilesClientDefaultAnisetteProvider profiles, + required ShareProfileMessage message, + }); Future crateApiApiFfiFilePackagerDefault(); - Future crateApiApiFromPoster( - {required SimplifiedIncomingCallPoster poster}); + Future crateApiApiFromPoster({ + required SimplifiedIncomingCallPoster poster, + }); - Future crateApiApiFromPosterSave( - {required List poster}); + Future crateApiApiFromPosterSave({ + required List poster, + }); - Future crateApiApiFromTranscriptPosterSave( - {required List poster}); + Future crateApiApiFromTranscriptPosterSave({ + required List poster, + }); - Future> crateApiApiFtSessions( - {required ArcFtClient facetime}); + Future> crateApiApiFtSessions({ + required ArcFtClient facetime, + }); Future crateApiApiGenerateUdid(); - Future crateApiApiGet2FaCode( - {required ArcAnisetteClientDefaultAnisetteProvider anisette}); + Future crateApiApiGet2FaCode({ + required ArcAnisetteClientDefaultAnisetteProvider anisette, + }); + + Future<(List, LoginState?)> crateApiApiGet2FaSmsOpts({ + required ArcMutexAppleAccountDefaultAnisetteProvider state, + }); - Future<(List, LoginState?)> crateApiApiGet2FaSmsOpts( - {required ArcMutexAppleAccountDefaultAnisetteProvider state}); + Future<(List, List)> crateApiApiGetAlbums({ + required SyncManagerDefaultAnisetteProviderMyFilePackager lock, + required bool refresh, + }); - Future<(List, List)> crateApiApiGetAlbums( - {required SyncManagerDefaultAnisetteProviderMyFilePackager lock, - required bool refresh}); + Future> crateApiApiGetAnisetteHeaders({ + required ArcAnisetteClientDefaultAnisetteProvider state, + required JoinedOsConfig config, + }); - Future> crateApiApiGetAnisetteHeaders( - {required ArcAnisetteClientDefaultAnisetteProvider state, - required JoinedOsConfig config}); + Future crateApiApiGetApsConnectionStatus({ + required ApsConnection aps, + }); String? crateApiApiGetAvailableUser({required String path}); - Future> crateApiApiGetBackgroundFollowing( - {required ArcFindMyClientDefaultAnisetteProvider fmfd}); + Future> crateApiApiGetBackgroundFollowing({ + required ArcFindMyClientDefaultAnisetteProvider fmfd, + }); - Future> crateApiApiGetBeaconItems( - {required ArcFindMyClientDefaultAnisetteProvider items}); + Future> crateApiApiGetBeaconItems({ + required ArcFindMyClientDefaultAnisetteProvider items, + }); - Future> crateApiApiGetBottles( - {required ArcKeychainClientDefaultAnisetteProvider keychain}); + Future> crateApiApiGetBottles({ + required ArcKeychainClientDefaultAnisetteProvider keychain, + }); - Future> crateApiApiGetContactsHeaders( - {required String path, - required ArcAnisetteClientDefaultAnisetteProvider state, - required ArcTokenProviderDefaultAnisetteProvider tokenProvider, - required JoinedOsConfig config}); + Future> crateApiApiGetContactsHeaders({ + required String path, + required ArcAnisetteClientDefaultAnisetteProvider state, + required ArcTokenProviderDefaultAnisetteProvider tokenProvider, + required JoinedOsConfig config, + }); Future crateApiApiGetDeviceInfo({required JoinedOsConfig config}); - Future> crateApiApiGetDevices( - {required FindMyPhoneClientDefaultAnisetteProvider client}); + Future> crateApiApiGetDevices({ + required FindMyPhoneClientDefaultAnisetteProvider client, + }); - Future crateApiApiGetEntitlements( - {required JoinedOsConfig config, - required ApsConnection conn, - required String mccmnc, - required String subscriber, - required String imei, - required FutureOr Function(String) processChallenge}); + Future crateApiApiGetEntitlements({ + required JoinedOsConfig config, + required ApsConnection conn, + required String mccmnc, + required String subscriber, + required String imei, + required FutureOr Function(String) processChallenge, + }); - Future> crateApiApiGetFollowing( - {required FindMyFriendsClientDefaultAnisetteProvider client}); + Future> crateApiApiGetFollowing({ + required FindMyFriendsClientDefaultAnisetteProvider client, + }); - Future crateApiApiGetFtLink( - {required ArcFtClient facetime, required String usage}); + Future crateApiApiGetFtLink({ + required ArcFtClient facetime, + required String usage, + }); Future< - ( - String, - Map, - Map - )> - crateApiApiGetGroups( - {required ArcPasswordManagerDefaultAnisetteProvider passwords}); + (String, Map, Map) + > + crateApiApiGetGroups({ + required ArcPasswordManagerDefaultAnisetteProvider passwords, + }); Future> crateApiApiGetHandles({required ArcImClient state}); - Future> crateApiApiGetMyPhoneHandles( - {required ArcImClient state}); + Future> crateApiApiGetMyPhoneHandles({ + required ArcImClient state, + }); - Future> crateApiApiGetPasskeys( - {required ArcPasswordManagerDefaultAnisetteProvider passwords}); + Future> crateApiApiGetPasskeys({ + required ArcPasswordManagerDefaultAnisetteProvider passwords, + }); - Future> crateApiApiGetPasswords( - {required ArcPasswordManagerDefaultAnisetteProvider passwords}); + Future> crateApiApiGetPasswords({ + required ArcPasswordManagerDefaultAnisetteProvider passwords, + }); Future> - crateApiApiGetPasswordsMeta( - {required ArcPasswordManagerDefaultAnisetteProvider passwords}); + crateApiApiGetPasswordsMeta({ + required ArcPasswordManagerDefaultAnisetteProvider passwords, + }); - Future crateApiApiGetQuotaInfo( - {required ArcTokenProviderDefaultAnisetteProvider info}); + Future crateApiApiGetQuotaInfo({ + required ArcTokenProviderDefaultAnisetteProvider info, + }); Future crateApiApiGetRegstate({required ArcImClient state}); - Future> crateApiApiGetSmsTargets( - {required ArcImClient state, - required String handle, - required bool refresh}); + Future> crateApiApiGetSmsTargets({ + required ArcImClient state, + required String handle, + required bool refresh, + }); - Future<(Map, (String, BigInt)?)> crateApiApiGetSyncstatus( - {required SyncManagerDefaultAnisetteProviderMyFilePackager lock}); + Future<(Map, (String, BigInt)?)> + crateApiApiGetSyncstatus({ + required SyncManagerDefaultAnisetteProviderMyFilePackager lock, + }); Future crateApiApiGetToken({required ApsConnection state}); - Future crateApiApiGetUserName( - {required ArcMutexAppleAccountDefaultAnisetteProvider state}); + Future crateApiApiGetUserName({ + required ArcMutexAppleAccountDefaultAnisetteProvider state, + }); - Future> crateApiApiGetWifiPasswords( - {required ArcPasswordManagerDefaultAnisetteProvider passwords}); + Future> crateApiApiGetWifiPasswords({ + required ArcPasswordManagerDefaultAnisetteProvider passwords, + }); - (Sender, ArcSenderPushMessage, ApsWatcher) crateApiApiImportWatcher( - {required ReceiverApsMessage queue, required ArcImClient client}); + (Sender, ArcSenderPushMessage, ApsWatcher) crateApiApiImportWatcher({ + required ReceiverApsMessage queue, + required ArcImClient client, + }); Future crateApiApiInvalidateIdCache({required ArcImClient client}); - Future crateApiApiInviteToChannel( - {required ArcStatusKitClientDefaultAnisetteProvider status, - required String handle, - required Map to}); + Future crateApiApiInviteToChannel({ + required ArcStatusKitClientDefaultAnisetteProvider status, + required String handle, + required Map to, + }); - Future crateApiApiInviteUser( - {required ArcPasswordManagerDefaultAnisetteProvider passwords, - required String gid, - required String handle}); + Future crateApiApiInviteUser({ + required ArcPasswordManagerDefaultAnisetteProvider passwords, + required String gid, + required String handle, + }); - Future crateApiApiIsInClique( - {required ArcKeychainClientDefaultAnisetteProvider keychain}); + Future crateApiApiIsInClique({ + required ArcKeychainClientDefaultAnisetteProvider keychain, + }); - Future crateApiApiJoinCliqueWithBottle( - {required ArcKeychainClientDefaultAnisetteProvider keychain, - required EscrowData bottle, - required String password, - required String devicePassword}); + Future crateApiApiJoinCliqueWithBottle({ + required ArcKeychainClientDefaultAnisetteProvider keychain, + required EscrowData bottle, + required String password, + required String devicePassword, + }); - Future crateApiApiMakeAnisette( - {required String path, - required JoinedOsConfig config, - required ApsConnection conn}); + Future crateApiApiMakeAnisette({ + required String path, + required JoinedOsConfig config, + required ApsConnection conn, + }); ArcMutexVecActiveCircleSession crateApiApiMakeCircleSessions(); ArcMutexOptionCircleClientSessionDefaultAnisetteProvider - crateApiApiMakeClientSession( - {CircleClientSessionDefaultAnisetteProvider? circle}); + crateApiApiMakeClientSession({ + CircleClientSessionDefaultAnisetteProvider? circle, + }); ArcCloudMessagesClientDefaultAnisetteProvider - crateApiApiMakeCloudMessagesClient( - {required ArcCloudKitClientDefaultAnisetteProvider cloudkit, - required ArcKeychainClientDefaultAnisetteProvider keychain}); + crateApiApiMakeCloudMessagesClient({ + required ArcCloudKitClientDefaultAnisetteProvider cloudkit, + required ArcKeychainClientDefaultAnisetteProvider keychain, + }); - Future crateApiApiMakeCloudkit( - {required String path, - required ArcAnisetteClientDefaultAnisetteProvider anisette, - required JoinedOsConfig config, - required ArcTokenProviderDefaultAnisetteProvider tokenProvider}); + Future crateApiApiMakeCloudkit({ + required String path, + required ArcAnisetteClientDefaultAnisetteProvider anisette, + required JoinedOsConfig config, + required ArcTokenProviderDefaultAnisetteProvider tokenProvider, + }); - Future crateApiApiMakeFacetime( - {required String path, - required ApsConnection conn, - required ArcImClient client}); + Future crateApiApiMakeFacetime({ + required String path, + required ApsConnection conn, + required ArcImClient client, + }); Future - crateApiApiMakeFindMyFriends( - {required String path, - required JoinedOsConfig config, - required ApsConnection aps, - required ArcAnisetteClientDefaultAnisetteProvider anisette, - required ArcTokenProviderDefaultAnisetteProvider provider}); - - Future crateApiApiMakeFindMyPhone( - {required String path, - required JoinedOsConfig config, - required ApsConnection aps, - required ArcAnisetteClientDefaultAnisetteProvider anisette, - required ArcTokenProviderDefaultAnisetteProvider provider}); - - Future crateApiApiMakeFindmy( - {required String path, - required ArcTokenProviderDefaultAnisetteProvider tokenProvider, - required ApsConnection conn, - required ArcCloudKitClientDefaultAnisetteProvider cloudkit, - required ArcKeychainClientDefaultAnisetteProvider keychain, - required ArcAnisetteClientDefaultAnisetteProvider anisette, - required JoinedOsConfig config, - required ArcImClient client}); - - Future crateApiApiMakeIdms( - {required ApsConnection conn}); - - Future crateApiApiMakeImclient( - {required String path, - required ApsConnection conn, - required List users, - required IdsngmIdentity identity}); - - ArcKeychainClientDefaultAnisetteProvider? crateApiApiMakeKeychain( - {required String path, - required ArcCloudKitClientDefaultAnisetteProvider cloudkit, - required ArcAnisetteClientDefaultAnisetteProvider anisette, - required JoinedOsConfig config, - required ArcTokenProviderDefaultAnisetteProvider tokenProvider}); - - Future crateApiApiMakePasswords( - {required String path, - required ArcKeychainClientDefaultAnisetteProvider keychain, - required ArcCloudKitClientDefaultAnisetteProvider cloudkit, - required ArcImClient client, - required ApsConnection conn}); - - Future crateApiApiMakeProfiles( - {required ArcCloudKitClientDefaultAnisetteProvider cloudkit}); + crateApiApiMakeFindMyFriends({ + required String path, + required JoinedOsConfig config, + required ApsConnection aps, + required ArcAnisetteClientDefaultAnisetteProvider anisette, + required ArcTokenProviderDefaultAnisetteProvider provider, + }); + + Future crateApiApiMakeFindMyPhone({ + required String path, + required JoinedOsConfig config, + required ApsConnection aps, + required ArcAnisetteClientDefaultAnisetteProvider anisette, + required ArcTokenProviderDefaultAnisetteProvider provider, + }); + + Future crateApiApiMakeFindmy({ + required String path, + required ArcTokenProviderDefaultAnisetteProvider tokenProvider, + required ApsConnection conn, + required ArcCloudKitClientDefaultAnisetteProvider cloudkit, + required ArcKeychainClientDefaultAnisetteProvider keychain, + required ArcAnisetteClientDefaultAnisetteProvider anisette, + required JoinedOsConfig config, + required ArcImClient client, + }); + + Future crateApiApiMakeIdms({ + required ApsConnection conn, + }); + + Future crateApiApiMakeImclient({ + required String path, + required ApsConnection conn, + required List users, + required IdsngmIdentity identity, + }); + + ArcKeychainClientDefaultAnisetteProvider? crateApiApiMakeKeychain({ + required String path, + required ArcCloudKitClientDefaultAnisetteProvider cloudkit, + required ArcAnisetteClientDefaultAnisetteProvider anisette, + required JoinedOsConfig config, + required ArcTokenProviderDefaultAnisetteProvider tokenProvider, + }); + + Future crateApiApiMakePasswords({ + required String path, + required ArcKeychainClientDefaultAnisetteProvider keychain, + required ArcCloudKitClientDefaultAnisetteProvider cloudkit, + required ArcImClient client, + required ApsConnection conn, + }); + + Future crateApiApiMakeProfiles({ + required ArcCloudKitClientDefaultAnisetteProvider cloudkit, + }); Future - crateApiApiMakeSharedStreams( - {required String path, - required ApsConnection conn, - required ArcAnisetteClientDefaultAnisetteProvider anisette, - required JoinedOsConfig config, - required ArcTokenProviderDefaultAnisetteProvider token}); - - Future crateApiApiMakeStatuskit( - {required String path, - required ArcTokenProviderDefaultAnisetteProvider provider, - required ApsConnection conn, - required JoinedOsConfig config, - required ArcImClient client}); - - ArcTokenProviderDefaultAnisetteProvider crateApiApiMakeTokenProvider( - {required ArcMutexAppleAccountDefaultAnisetteProvider account, - required JoinedOsConfig config}); + crateApiApiMakeSharedStreams({ + required String path, + required ApsConnection conn, + required ArcAnisetteClientDefaultAnisetteProvider anisette, + required JoinedOsConfig config, + required ArcTokenProviderDefaultAnisetteProvider token, + }); + + Future crateApiApiMakeStatuskit({ + required String path, + required ArcTokenProviderDefaultAnisetteProvider provider, + required ApsConnection conn, + required JoinedOsConfig config, + required ArcImClient client, + }); + + ArcTokenProviderDefaultAnisetteProvider crateApiApiMakeTokenProvider({ + required ArcMutexAppleAccountDefaultAnisetteProvider account, + required JoinedOsConfig config, + }); Future crateApiApiMessagePartsRawText({required MessageParts that}); @@ -666,18 +963,21 @@ abstract class RustLibApi extends BaseApi { Future crateApiApiMyAsyncRuntimeDefault(); - Future crateApiApiNewMsg( - {required ConversationData conversation, - required String sender, - required Message message}); + Future crateApiApiNewMsg({ + required ConversationData conversation, + required String sender, + required Message message, + }); IdsngmIdentity crateApiApiNewNgmIdentity(); - NSAttributedString crateApiApiNsAttributedStringDecode( - {required StCollapsedValue val}); + NSAttributedString crateApiApiNsAttributedStringDecode({ + required StCollapsedValue val, + }); - StCollapsedValue crateApiApiNsAttributedStringEncode( - {required NSAttributedString that}); + StCollapsedValue crateApiApiNsAttributedStringEncode({ + required NSAttributedString that, + }); Uint8List crateApiApiNsNull(); @@ -693,107 +993,138 @@ abstract class RustLibApi extends BaseApi { Uint8List crateApiApiNscoderEncode({required List value}); - Future crateApiApiPackTranscriptPoster( - {required SimplifiedTranscriptPoster payload}); + Future crateApiApiPackTranscriptPoster({ + required SimplifiedTranscriptPoster payload, + }); + + Future crateApiApiParsePoster({ + required IMessagePosterRecord poster, + }); - Future crateApiApiParsePoster( - {required IMessagePosterRecord poster}); + Future crateApiApiParsePosterSave({ + required SimplifiedIncomingCallPoster poster, + }); - Future crateApiApiParsePosterSave( - {required SimplifiedIncomingCallPoster poster}); + Future crateApiApiParseTranscriptPoster({ + required List payload, + }); - Future crateApiApiParseTranscriptPoster( - {required List payload}); + Uint8List crateApiApiPasswordManagerMetaGetData({ + required PasswordManagerMetaData data, + }); - Uint8List crateApiApiPasswordManagerMetaGetData( - {required PasswordManagerMetaData data}); + PasswordManagerMetaData crateApiApiPasswordManagerMetaGetPasswordData({ + required PasswordManagerMeta that, + }); - PasswordManagerMetaData crateApiApiPasswordManagerMetaGetPasswordData( - {required PasswordManagerMeta that}); + (int, BigInt) crateApiApiPasswordManagerTotpGenerateOtp({ + required PasswordManagerTotp that, + }); - (int, BigInt) crateApiApiPasswordManagerTotpGenerateOtp( - {required PasswordManagerTotp that}); + Future crateApiApiPlayFindMySound({ + required JoinedOsConfig config, + required FindMyPhoneClientDefaultAnisetteProvider client, + required String deviceId, + }); Future crateApiApiProvisionedFlavorDefault(); Future crateApiApiPtrToDart({required String ptr}); - Future crateApiApiQueryHandle( - {required ArcPasswordManagerDefaultAnisetteProvider passwords, - required String handle}); + Future crateApiApiQueryHandle({ + required ArcPasswordManagerDefaultAnisetteProvider passwords, + required String handle, + }); SavedHardwareState? crateApiApiReadHardware({required String path}); - Future crateApiApiRecvWait( - {required ApsWatcher watcher, required ArcSharedPushState state}); + Future crateApiApiRecvWait({ + required ApsWatcher watcher, + required ArcSharedPushState state, + }); + + Future crateApiApiRefreshApsConnection({required ApsConnection aps}); - Future> crateApiApiRefreshBackgroundFollowing( - {required ArcFindMyClientDefaultAnisetteProvider state, - required JoinedOsConfig config}); + Future> crateApiApiRefreshBackgroundFollowing({ + required ArcFindMyClientDefaultAnisetteProvider state, + required JoinedOsConfig config, + }); - Future> crateApiApiRefreshDevices( - {required JoinedOsConfig config, - required FindMyPhoneClientDefaultAnisetteProvider client}); + Future> crateApiApiRefreshDevices({ + required JoinedOsConfig config, + required FindMyPhoneClientDefaultAnisetteProvider client, + }); - Future> crateApiApiRefreshFollowing( - {required JoinedOsConfig config, - required FindMyFriendsClientDefaultAnisetteProvider client}); + Future> crateApiApiRefreshFollowing({ + required JoinedOsConfig config, + required FindMyFriendsClientDefaultAnisetteProvider client, + }); - Future<(List?, SupportAlert?)> crateApiApiRegisterIds( - {required String path, - required JoinedOsConfig config, - required ApsConnection aps, - required IdsngmIdentity identity, - required List users}); + Future<(List?, SupportAlert?)> crateApiApiRegisterIds({ + required String path, + required JoinedOsConfig config, + required ApsConnection aps, + required IdsngmIdentity identity, + required List users, + }); - Future> crateApiApiRemoveAlbum( - {required SyncManagerDefaultAnisetteProviderMyFilePackager lock, - required String guid}); + Future> crateApiApiRemoveAlbum({ + required SyncManagerDefaultAnisetteProviderMyFilePackager lock, + required String guid, + }); - Future crateApiApiRemoveUser( - {required ArcPasswordManagerDefaultAnisetteProvider passwords, - required String gid, - required String handle}); + Future crateApiApiRemoveUser({ + required ArcPasswordManagerDefaultAnisetteProvider passwords, + required String gid, + required String handle, + }); - Future crateApiApiRenameGroup( - {required ArcPasswordManagerDefaultAnisetteProvider passwords, - required String gid, - required String newname}); + Future crateApiApiRenameGroup({ + required ArcPasswordManagerDefaultAnisetteProvider passwords, + required String gid, + required String newname, + }); - Future crateApiApiReportMessages( - {required ArcImClient state, - required String handle, - required List messages}); + Future crateApiApiReportMessages({ + required ArcImClient state, + required String handle, + required List messages, + }); - Future crateApiApiRequestHandles( - {required ArcStatusKitClientDefaultAnisetteProvider status, - required List to}); + Future crateApiApiRequestHandles({ + required ArcStatusKitClientDefaultAnisetteProvider status, + required List to, + }); void crateApiApiResetAnisette({required String path}); - Future crateApiApiResetChannelKeys( - {required ArcStatusKitClientDefaultAnisetteProvider status}); + Future crateApiApiResetChannelKeys({ + required ArcStatusKitClientDefaultAnisetteProvider status, + }); - Future crateApiApiResetClique( - {required ArcKeychainClientDefaultAnisetteProvider keychain, - required ArcCloudMessagesClientDefaultAnisetteProvider cloudMessages, - required String devicePassword}); + Future crateApiApiResetClique({ + required ArcKeychainClientDefaultAnisetteProvider keychain, + required ArcCloudMessagesClientDefaultAnisetteProvider cloudMessages, + required String devicePassword, + }); - Future crateApiApiResetState( - {required Sender cancel, - required String path, - required JoinedOsConfig config, - required ApsConnection aps, - ArcMutexAppleAccountDefaultAnisetteProvider? account, - required bool resetHw, - required bool logout}); + Future crateApiApiResetState({ + required Sender cancel, + required String path, + required JoinedOsConfig config, + required ApsConnection aps, + ArcMutexAppleAccountDefaultAnisetteProvider? account, + required bool resetHw, + required bool logout, + }); Future - crateApiApiRestoreAccount( - {required String path, - required ArcAnisetteClientDefaultAnisetteProvider anisette, - required JoinedOsConfig config, - required ApsConnection conn}); + crateApiApiRestoreAccount({ + required String path, + required ArcAnisetteClientDefaultAnisetteProvider anisette, + required JoinedOsConfig config, + required ApsConnection conn, + }); Attachment crateApiApiRestoreAttachment({required String data}); @@ -805,410 +1136,451 @@ abstract class RustLibApi extends BaseApi { Future crateApiApiSaveAttachment({required Attachment att}); - Future> crateApiApiSaveAttachments( - {required ArcCloudMessagesClientDefaultAnisetteProvider - cloudMessagesClient, - required Map attachments}); + Future> crateApiApiSaveAttachments({ + required ArcCloudMessagesClientDefaultAnisetteProvider cloudMessagesClient, + required Map attachments, + }); - Future> crateApiApiSaveChats( - {required ArcCloudMessagesClientDefaultAnisetteProvider - cloudMessagesClient, - required Map chats}); + Future> crateApiApiSaveChats({ + required ArcCloudMessagesClientDefaultAnisetteProvider cloudMessagesClient, + required Map chats, + }); Uint8List crateApiApiSaveCloudChat({required CloudChat value}); - Future> crateApiApiSaveMessages( - {required ArcCloudMessagesClientDefaultAnisetteProvider - cloudMessagesClient, - required Map messages}); - - Future crateApiApiSavePasskey( - {required ArcPasswordManagerDefaultAnisetteProvider passwords, - required String id, - required Passkey entry, - String? group}); - - Future crateApiApiSavePassword( - {required ArcPasswordManagerDefaultAnisetteProvider passwords, - required String id, - required PasswordRawEntry entry, - String? group}); - - Future crateApiApiSavePasswordMeta( - {required ArcPasswordManagerDefaultAnisetteProvider passwords, - required String id, - required PasswordManagerMeta entry, - String? group}); + Future> crateApiApiSaveMessages({ + required ArcCloudMessagesClientDefaultAnisetteProvider cloudMessagesClient, + required Map messages, + }); + + Future crateApiApiSavePasskey({ + required ArcPasswordManagerDefaultAnisetteProvider passwords, + required String id, + required Passkey entry, + String? group, + }); + + Future crateApiApiSavePassword({ + required ArcPasswordManagerDefaultAnisetteProvider passwords, + required String id, + required PasswordRawEntry entry, + String? group, + }); + + Future crateApiApiSavePasswordMeta({ + required ArcPasswordManagerDefaultAnisetteProvider passwords, + required String id, + required PasswordManagerMeta entry, + String? group, + }); Future crateApiApiSaveUser({required IdsUser user}); - void crateApiApiSaveUsers( - {required List users, required String path}); + void crateApiApiSaveUsers({ + required List users, + required String path, + }); - Future crateApiApiSaveWifiPassword( - {required ArcPasswordManagerDefaultAnisetteProvider passwords, - required String id, - required WifiPassword entry, - String? group}); + Future crateApiApiSaveWifiPassword({ + required ArcPasswordManagerDefaultAnisetteProvider passwords, + required String id, + required WifiPassword entry, + String? group, + }); - Future> crateApiApiSelectBackgroundFriend( - {required ArcFindMyClientDefaultAnisetteProvider fmfd, String? friend}); + Future> crateApiApiSelectBackgroundFriend({ + required ArcFindMyClientDefaultAnisetteProvider fmfd, + String? friend, + }); - Future> crateApiApiSelectFriend( - {required JoinedOsConfig config, - required FindMyFriendsClientDefaultAnisetteProvider client, - String? friend}); + Future> crateApiApiSelectFriend({ + required JoinedOsConfig config, + required FindMyFriendsClientDefaultAnisetteProvider client, + String? friend, + }); - Future crateApiApiSend( - {required ArcImClient state, - required ArcSenderPushMessage local, - required MessageInst msg}); + Future crateApiApiSend({ + required ArcImClient state, + required ArcSenderPushMessage local, + required MessageInst msg, + }); - Future crateApiApiSend2FaSms( - {CircleClientSessionDefaultAnisetteProvider? locked, - required ArcMutexAppleAccountDefaultAnisetteProvider account, - required int phoneId}); + Future crateApiApiSend2FaSms({ + CircleClientSessionDefaultAnisetteProvider? locked, + required ArcMutexAppleAccountDefaultAnisetteProvider account, + required int phoneId, + }); Future<(CircleClientSessionDefaultAnisetteProvider, LoginState, String?)> - crateApiApiSend2FaToDevices( - {required ArcMutexAppleAccountDefaultAnisetteProvider state, - required ApsConnection conn}); + crateApiApiSend2FaToDevices({ + required ArcMutexAppleAccountDefaultAnisetteProvider state, + required ApsConnection conn, + }); - (String, SharedPushState) crateApiApiSendDaemon( - {required SharedPushState state, required ApsWatcher watcher}); + (String, SharedPushState) crateApiApiSendDaemon({ + required SharedPushState state, + required ApsWatcher watcher, + }); Future crateApiApiServiceFromPtr({required String ptr}); - Future crateApiApiSetIdentity( - {required String statePath, - required JoinedOsConfig config, - required IdsngmIdentity identity}); + Future crateApiApiSetIdentity({ + required String statePath, + required JoinedOsConfig config, + required IdsngmIdentity identity, + }); - Future crateApiApiSetProfile( - {required ArcProfilesClientDefaultAnisetteProvider profiles, - required IMessageNicknameRecord record, - ShareProfileMessage? existing}); + Future crateApiApiSetProfile({ + required ArcProfilesClientDefaultAnisetteProvider profiles, + required IMessageNicknameRecord record, + ShareProfileMessage? existing, + }); - Future crateApiApiSetStatus( - {required ArcStatusKitClientDefaultAnisetteProvider status, - String? newStatus}); + Future crateApiApiSetStatus({ + required ArcStatusKitClientDefaultAnisetteProvider status, + String? newStatus, + }); - Future<(ApsConnection, PushError?)> crateApiApiSetupPush( - {required JoinedOsConfig config, - required IdsngmIdentity identity, - ApsState? state, - required String statePath}); + Future<(ApsConnection, PushError?)> crateApiApiSetupPush({ + required JoinedOsConfig config, + required IdsngmIdentity identity, + ApsState? state, + required String statePath, + }); - Future<(SharedPushState, ApsWatcher)?> crateApiApiSharedPushStateRestore( - {required String path}); + Future<(SharedPushState, ApsWatcher)?> crateApiApiSharedPushStateRestore({ + required String path, + }); - Future> crateApiApiSubscribe( - {required SyncManagerDefaultAnisetteProviderMyFilePackager lock, - required String guid}); + Future> crateApiApiSubscribe({ + required SyncManagerDefaultAnisetteProviderMyFilePackager lock, + required String guid, + }); ReceiverApsMessage crateApiApiSubscribeConn({required ApsConnection conn}); - Future> crateApiApiSubscribeToken( - {required SyncManagerDefaultAnisetteProviderMyFilePackager lock, - required String token}); + Future> crateApiApiSubscribeToken({ + required SyncManagerDefaultAnisetteProviderMyFilePackager lock, + required String token, + }); Future<(Uint8List, Map, int)> - crateApiApiSyncAttachments( - {required ArcCloudMessagesClientDefaultAnisetteProvider - cloudMessagesClient, - Uint8List? continuationToken}); + crateApiApiSyncAttachments({ + required ArcCloudMessagesClientDefaultAnisetteProvider cloudMessagesClient, + Uint8List? continuationToken, + }); - Future<(Uint8List, Map, int)> crateApiApiSyncChats( - {required ArcCloudMessagesClientDefaultAnisetteProvider - cloudMessagesClient, - Uint8List? continuationToken}); + Future<(Uint8List, Map, int)> crateApiApiSyncChats({ + required ArcCloudMessagesClientDefaultAnisetteProvider cloudMessagesClient, + Uint8List? continuationToken, + }); - Future<(Uint8List, Map, int)> crateApiApiSyncMessages( - {required ArcCloudMessagesClientDefaultAnisetteProvider - cloudMessagesClient, - Uint8List? continuationToken}); + Future<(Uint8List, Map, int)> crateApiApiSyncMessages({ + required ArcCloudMessagesClientDefaultAnisetteProvider cloudMessagesClient, + Uint8List? continuationToken, + }); - Future crateApiApiSyncNow( - {required SyncManagerDefaultAnisetteProviderMyFilePackager lock}); + Future crateApiApiSyncNow({ + required SyncManagerDefaultAnisetteProviderMyFilePackager lock, + }); - Future crateApiApiSyncPasswords( - {required ArcPasswordManagerDefaultAnisetteProvider passwords, - required ApsConnection conn}); + Future crateApiApiSyncPasswords({ + required ArcPasswordManagerDefaultAnisetteProvider passwords, + required ApsConnection conn, + }); - Future crateApiApiSyncWifiPasswords( - {required ArcPasswordManagerDefaultAnisetteProvider manager, - required bool userApprove}); + Future crateApiApiSyncWifiPasswords({ + required ArcPasswordManagerDefaultAnisetteProvider manager, + required bool userApprove, + }); int crateApiApiSystemtimeToMillis({required SystemTime time}); - Future crateApiApiTeardown2Fa( - {required ArcMutexAppleAccountDefaultAnisetteProvider account, - required String action, - required String txnid}); + Future crateApiApiTeardown2Fa({ + required ArcMutexAppleAccountDefaultAnisetteProvider account, + required String action, + required String txnid, + }); - Future crateApiApiTranscriptPosterSave( - {required SimplifiedTranscriptPoster poster}); + Future crateApiApiTranscriptPosterSave({ + required SimplifiedTranscriptPoster poster, + }); Future<(ArcMutexAppleAccountDefaultAnisetteProvider, LoginState)> - crateApiApiTryAuth( - {required String path, - required JoinedOsConfig conf, - required ApsConnection conn, - required ArcAnisetteClientDefaultAnisetteProvider anisette, - (String, String)? creds}); - - Future crateApiApiTryIcloudLogin( - {required String path, - required JoinedOsConfig conf, - required ArcMutexAppleAccountDefaultAnisetteProvider account}); - - Future> crateApiApiUnsubscribe( - {required SyncManagerDefaultAnisetteProviderMyFilePackager lock, - required String guid}); - - Future<(String, UpdateAccountFinish)> crateApiApiUpdateAccountHeaders( - {required ArcMutexAppleAccountDefaultAnisetteProvider account, - required JoinedOsConfig config}); - - Future crateApiApiUpdateBeaconName( - {required ArcFindMyClientDefaultAnisetteProvider items, - required BeaconNamingRecord namingRecord}); - - Stream crateApiApiUploadAttachment( - {required ApsConnection aps, - required String path, - required String mime, - required String uti, - required String name}); - - Future> crateApiApiUploadCloudAttachments( - {required ArcCloudMessagesClientDefaultAnisetteProvider - cloudMessagesClient, - required List<(String, String)> files}); + crateApiApiTryAuth({ + required String path, + required JoinedOsConfig conf, + required ApsConnection conn, + required ArcAnisetteClientDefaultAnisetteProvider anisette, + (String, String)? creds, + }); - Future> crateApiApiUploadGroupPhoto( - {required ArcCloudMessagesClientDefaultAnisetteProvider - cloudMessagesClient, - required List<(String, String)> files}); + Future crateApiApiTryIcloudLogin({ + required String path, + required JoinedOsConfig conf, + required ArcMutexAppleAccountDefaultAnisetteProvider account, + }); + + Future> crateApiApiUnsubscribe({ + required SyncManagerDefaultAnisetteProviderMyFilePackager lock, + required String guid, + }); + + Future<(String, UpdateAccountFinish)> crateApiApiUpdateAccountHeaders({ + required ArcMutexAppleAccountDefaultAnisetteProvider account, + required JoinedOsConfig config, + }); + + Future crateApiApiUpdateBeaconName({ + required ArcFindMyClientDefaultAnisetteProvider items, + required BeaconNamingRecord namingRecord, + }); + + Stream crateApiApiUploadAttachment({ + required ApsConnection aps, + required String path, + required String mime, + required String uti, + required String name, + }); + + Future> crateApiApiUploadCloudAttachments({ + required ArcCloudMessagesClientDefaultAnisetteProvider cloudMessagesClient, + required List<(String, String)> files, + }); + + Future> crateApiApiUploadGroupPhoto({ + required ArcCloudMessagesClientDefaultAnisetteProvider cloudMessagesClient, + required List<(String, String)> files, + }); - Stream crateApiApiUploadMmcs( - {required ApsConnection aps, required String path}); + Stream crateApiApiUploadMmcs({ + required ApsConnection aps, + required String path, + }); - Future crateApiApiUseLinkFor( - {required ArcFtClient facetime, - required String oldUsage, - required String usage}); + Future crateApiApiUseLinkFor({ + required ArcFtClient facetime, + required String oldUsage, + required String usage, + }); SystemTime crateApiApiUtmNow(); - Future> crateApiApiValidateCert( - {required ApsConnection conn, required IdsUser user}); + Future> crateApiApiValidateCert({ + required ApsConnection conn, + required IdsUser user, + }); Future crateApiApiValidateRelay({required JoinedOsConfig configRef}); - Future> crateApiApiValidateTargets( - {required ArcImClient state, - required List targets, - required String sender}); - - Future> crateApiApiValidateTargetsFacetime( - {required ArcImClient state, - required List targets, - required String sender}); - - Future<(LoginState, IdsUser?)> crateApiApiVerify2Fa( - {required String path, - required CircleClientSessionDefaultAnisetteProvider client, - required ArcAnisetteClientDefaultAnisetteProvider anisette, - required JoinedOsConfig osConfig, - required ArcMutexAppleAccountDefaultAnisetteProvider account, - required ReceiverApsMessage watcher, - required ArcIdmsAuthListener idms, - required String code}); - - Future<(LoginState, IdsUser?)> crateApiApiVerify2FaSms( - {required String path, - required ArcMutexAppleAccountDefaultAnisetteProvider accountMut, - required ArcAnisetteClientDefaultAnisetteProvider anisette, - required JoinedOsConfig config, - required VerifyBody body, - required String code}); + Future> crateApiApiValidateTargets({ + required ArcImClient state, + required List targets, + required String sender, + }); + + Future> crateApiApiValidateTargetsFacetime({ + required ArcImClient state, + required List targets, + required String sender, + }); + + Future<(LoginState, IdsUser?)> crateApiApiVerify2Fa({ + required String path, + required CircleClientSessionDefaultAnisetteProvider client, + required ArcAnisetteClientDefaultAnisetteProvider anisette, + required JoinedOsConfig osConfig, + required ArcMutexAppleAccountDefaultAnisetteProvider account, + required ReceiverApsMessage watcher, + required ArcIdmsAuthListener idms, + required String code, + }); + + Future<(LoginState, IdsUser?)> crateApiApiVerify2FaSms({ + required String path, + required ArcMutexAppleAccountDefaultAnisetteProvider accountMut, + required ArcAnisetteClientDefaultAnisetteProvider anisette, + required JoinedOsConfig config, + required VerifyBody body, + required String code, + }); RustArcIncrementStrongCountFnType - get rust_arc_increment_strong_count_ApsConnection; + get rust_arc_increment_strong_count_ApsConnection; RustArcDecrementStrongCountFnType - get rust_arc_decrement_strong_count_ApsConnection; + get rust_arc_decrement_strong_count_ApsConnection; CrossPlatformFinalizerArg - get rust_arc_decrement_strong_count_ApsConnectionPtr; + get rust_arc_decrement_strong_count_ApsConnectionPtr; RustArcIncrementStrongCountFnType - get rust_arc_increment_strong_count_ApsState; + get rust_arc_increment_strong_count_ApsState; RustArcDecrementStrongCountFnType - get rust_arc_decrement_strong_count_ApsState; + get rust_arc_decrement_strong_count_ApsState; CrossPlatformFinalizerArg get rust_arc_decrement_strong_count_ApsStatePtr; RustArcIncrementStrongCountFnType - get rust_arc_increment_strong_count_ApsWatcher; + get rust_arc_increment_strong_count_ApsWatcher; RustArcDecrementStrongCountFnType - get rust_arc_decrement_strong_count_ApsWatcher; + get rust_arc_decrement_strong_count_ApsWatcher; CrossPlatformFinalizerArg get rust_arc_decrement_strong_count_ApsWatcherPtr; RustArcIncrementStrongCountFnType - get rust_arc_increment_strong_count_ArcAnisetteClientDefaultAnisetteProvider; + get rust_arc_increment_strong_count_ArcAnisetteClientDefaultAnisetteProvider; RustArcDecrementStrongCountFnType - get rust_arc_decrement_strong_count_ArcAnisetteClientDefaultAnisetteProvider; + get rust_arc_decrement_strong_count_ArcAnisetteClientDefaultAnisetteProvider; CrossPlatformFinalizerArg - get rust_arc_decrement_strong_count_ArcAnisetteClientDefaultAnisetteProviderPtr; + get rust_arc_decrement_strong_count_ArcAnisetteClientDefaultAnisetteProviderPtr; RustArcIncrementStrongCountFnType - get rust_arc_increment_strong_count_ArcCloudKitClientDefaultAnisetteProvider; + get rust_arc_increment_strong_count_ArcCloudKitClientDefaultAnisetteProvider; RustArcDecrementStrongCountFnType - get rust_arc_decrement_strong_count_ArcCloudKitClientDefaultAnisetteProvider; + get rust_arc_decrement_strong_count_ArcCloudKitClientDefaultAnisetteProvider; CrossPlatformFinalizerArg - get rust_arc_decrement_strong_count_ArcCloudKitClientDefaultAnisetteProviderPtr; + get rust_arc_decrement_strong_count_ArcCloudKitClientDefaultAnisetteProviderPtr; RustArcIncrementStrongCountFnType - get rust_arc_increment_strong_count_ArcCloudMessagesClientDefaultAnisetteProvider; + get rust_arc_increment_strong_count_ArcCloudMessagesClientDefaultAnisetteProvider; RustArcDecrementStrongCountFnType - get rust_arc_decrement_strong_count_ArcCloudMessagesClientDefaultAnisetteProvider; + get rust_arc_decrement_strong_count_ArcCloudMessagesClientDefaultAnisetteProvider; CrossPlatformFinalizerArg - get rust_arc_decrement_strong_count_ArcCloudMessagesClientDefaultAnisetteProviderPtr; + get rust_arc_decrement_strong_count_ArcCloudMessagesClientDefaultAnisetteProviderPtr; RustArcIncrementStrongCountFnType - get rust_arc_increment_strong_count_ArcFtClient; + get rust_arc_increment_strong_count_ArcFtClient; RustArcDecrementStrongCountFnType - get rust_arc_decrement_strong_count_ArcFtClient; + get rust_arc_decrement_strong_count_ArcFtClient; CrossPlatformFinalizerArg get rust_arc_decrement_strong_count_ArcFtClientPtr; RustArcIncrementStrongCountFnType - get rust_arc_increment_strong_count_ArcFindMyClientDefaultAnisetteProvider; + get rust_arc_increment_strong_count_ArcFindMyClientDefaultAnisetteProvider; RustArcDecrementStrongCountFnType - get rust_arc_decrement_strong_count_ArcFindMyClientDefaultAnisetteProvider; + get rust_arc_decrement_strong_count_ArcFindMyClientDefaultAnisetteProvider; CrossPlatformFinalizerArg - get rust_arc_decrement_strong_count_ArcFindMyClientDefaultAnisetteProviderPtr; + get rust_arc_decrement_strong_count_ArcFindMyClientDefaultAnisetteProviderPtr; RustArcIncrementStrongCountFnType - get rust_arc_increment_strong_count_ArcImClient; + get rust_arc_increment_strong_count_ArcImClient; RustArcDecrementStrongCountFnType - get rust_arc_decrement_strong_count_ArcImClient; + get rust_arc_decrement_strong_count_ArcImClient; CrossPlatformFinalizerArg get rust_arc_decrement_strong_count_ArcImClientPtr; RustArcIncrementStrongCountFnType - get rust_arc_increment_strong_count_ArcIdmsAuthListener; + get rust_arc_increment_strong_count_ArcIdmsAuthListener; RustArcDecrementStrongCountFnType - get rust_arc_decrement_strong_count_ArcIdmsAuthListener; + get rust_arc_decrement_strong_count_ArcIdmsAuthListener; CrossPlatformFinalizerArg - get rust_arc_decrement_strong_count_ArcIdmsAuthListenerPtr; + get rust_arc_decrement_strong_count_ArcIdmsAuthListenerPtr; RustArcIncrementStrongCountFnType - get rust_arc_increment_strong_count_ArcKeychainClientDefaultAnisetteProvider; + get rust_arc_increment_strong_count_ArcKeychainClientDefaultAnisetteProvider; RustArcDecrementStrongCountFnType - get rust_arc_decrement_strong_count_ArcKeychainClientDefaultAnisetteProvider; + get rust_arc_decrement_strong_count_ArcKeychainClientDefaultAnisetteProvider; CrossPlatformFinalizerArg - get rust_arc_decrement_strong_count_ArcKeychainClientDefaultAnisetteProviderPtr; + get rust_arc_decrement_strong_count_ArcKeychainClientDefaultAnisetteProviderPtr; RustArcIncrementStrongCountFnType - get rust_arc_increment_strong_count_ArcMutexAppleAccountDefaultAnisetteProvider; + get rust_arc_increment_strong_count_ArcMutexAppleAccountDefaultAnisetteProvider; RustArcDecrementStrongCountFnType - get rust_arc_decrement_strong_count_ArcMutexAppleAccountDefaultAnisetteProvider; + get rust_arc_decrement_strong_count_ArcMutexAppleAccountDefaultAnisetteProvider; CrossPlatformFinalizerArg - get rust_arc_decrement_strong_count_ArcMutexAppleAccountDefaultAnisetteProviderPtr; + get rust_arc_decrement_strong_count_ArcMutexAppleAccountDefaultAnisetteProviderPtr; RustArcIncrementStrongCountFnType - get rust_arc_increment_strong_count_ArcMutexOptionCircleClientSessionDefaultAnisetteProvider; + get rust_arc_increment_strong_count_ArcMutexOptionCircleClientSessionDefaultAnisetteProvider; RustArcDecrementStrongCountFnType - get rust_arc_decrement_strong_count_ArcMutexOptionCircleClientSessionDefaultAnisetteProvider; + get rust_arc_decrement_strong_count_ArcMutexOptionCircleClientSessionDefaultAnisetteProvider; CrossPlatformFinalizerArg - get rust_arc_decrement_strong_count_ArcMutexOptionCircleClientSessionDefaultAnisetteProviderPtr; + get rust_arc_decrement_strong_count_ArcMutexOptionCircleClientSessionDefaultAnisetteProviderPtr; RustArcIncrementStrongCountFnType - get rust_arc_increment_strong_count_ArcMutexVecActiveCircleSession; + get rust_arc_increment_strong_count_ArcMutexVecActiveCircleSession; RustArcDecrementStrongCountFnType - get rust_arc_decrement_strong_count_ArcMutexVecActiveCircleSession; + get rust_arc_decrement_strong_count_ArcMutexVecActiveCircleSession; CrossPlatformFinalizerArg - get rust_arc_decrement_strong_count_ArcMutexVecActiveCircleSessionPtr; + get rust_arc_decrement_strong_count_ArcMutexVecActiveCircleSessionPtr; RustArcIncrementStrongCountFnType - get rust_arc_increment_strong_count_ArcPasswordManagerDefaultAnisetteProvider; + get rust_arc_increment_strong_count_ArcPasswordManagerDefaultAnisetteProvider; RustArcDecrementStrongCountFnType - get rust_arc_decrement_strong_count_ArcPasswordManagerDefaultAnisetteProvider; + get rust_arc_decrement_strong_count_ArcPasswordManagerDefaultAnisetteProvider; CrossPlatformFinalizerArg - get rust_arc_decrement_strong_count_ArcPasswordManagerDefaultAnisetteProviderPtr; + get rust_arc_decrement_strong_count_ArcPasswordManagerDefaultAnisetteProviderPtr; RustArcIncrementStrongCountFnType - get rust_arc_increment_strong_count_ArcProfilesClientDefaultAnisetteProvider; + get rust_arc_increment_strong_count_ArcProfilesClientDefaultAnisetteProvider; RustArcDecrementStrongCountFnType - get rust_arc_decrement_strong_count_ArcProfilesClientDefaultAnisetteProvider; + get rust_arc_decrement_strong_count_ArcProfilesClientDefaultAnisetteProvider; CrossPlatformFinalizerArg - get rust_arc_decrement_strong_count_ArcProfilesClientDefaultAnisetteProviderPtr; + get rust_arc_decrement_strong_count_ArcProfilesClientDefaultAnisetteProviderPtr; RustArcIncrementStrongCountFnType - get rust_arc_increment_strong_count_ArcSenderPushMessage; + get rust_arc_increment_strong_count_ArcSenderPushMessage; RustArcDecrementStrongCountFnType - get rust_arc_decrement_strong_count_ArcSenderPushMessage; + get rust_arc_decrement_strong_count_ArcSenderPushMessage; CrossPlatformFinalizerArg - get rust_arc_decrement_strong_count_ArcSenderPushMessagePtr; + get rust_arc_decrement_strong_count_ArcSenderPushMessagePtr; RustArcIncrementStrongCountFnType - get rust_arc_increment_strong_count_ArcSharedPushState; + get rust_arc_increment_strong_count_ArcSharedPushState; RustArcDecrementStrongCountFnType - get rust_arc_decrement_strong_count_ArcSharedPushState; + get rust_arc_decrement_strong_count_ArcSharedPushState; CrossPlatformFinalizerArg - get rust_arc_decrement_strong_count_ArcSharedPushStatePtr; + get rust_arc_decrement_strong_count_ArcSharedPushStatePtr; RustArcIncrementStrongCountFnType - get rust_arc_increment_strong_count_ArcStatusKitClientDefaultAnisetteProvider; + get rust_arc_increment_strong_count_ArcStatusKitClientDefaultAnisetteProvider; RustArcDecrementStrongCountFnType - get rust_arc_decrement_strong_count_ArcStatusKitClientDefaultAnisetteProvider; + get rust_arc_decrement_strong_count_ArcStatusKitClientDefaultAnisetteProvider; CrossPlatformFinalizerArg - get rust_arc_decrement_strong_count_ArcStatusKitClientDefaultAnisetteProviderPtr; + get rust_arc_decrement_strong_count_ArcStatusKitClientDefaultAnisetteProviderPtr; RustArcIncrementStrongCountFnType - get rust_arc_increment_strong_count_ArcTokenProviderDefaultAnisetteProvider; + get rust_arc_increment_strong_count_ArcTokenProviderDefaultAnisetteProvider; RustArcDecrementStrongCountFnType - get rust_arc_decrement_strong_count_ArcTokenProviderDefaultAnisetteProvider; + get rust_arc_decrement_strong_count_ArcTokenProviderDefaultAnisetteProvider; CrossPlatformFinalizerArg - get rust_arc_decrement_strong_count_ArcTokenProviderDefaultAnisetteProviderPtr; + get rust_arc_decrement_strong_count_ArcTokenProviderDefaultAnisetteProviderPtr; RustArcIncrementStrongCountFnType get rust_arc_increment_strong_count_Asset; @@ -1217,40 +1589,49 @@ abstract class RustLibApi extends BaseApi { CrossPlatformFinalizerArg get rust_arc_decrement_strong_count_AssetPtr; RustArcIncrementStrongCountFnType - get rust_arc_increment_strong_count_ChannelInterestToken; + get rust_arc_increment_strong_count_ChannelInterestToken; + + RustArcDecrementStrongCountFnType + get rust_arc_decrement_strong_count_ChannelInterestToken; + + CrossPlatformFinalizerArg + get rust_arc_decrement_strong_count_ChannelInterestTokenPtr; + + RustArcIncrementStrongCountFnType + get rust_arc_increment_strong_count_CircleClientSessionDefaultAnisetteProvider; RustArcDecrementStrongCountFnType - get rust_arc_decrement_strong_count_ChannelInterestToken; + get rust_arc_decrement_strong_count_CircleClientSessionDefaultAnisetteProvider; CrossPlatformFinalizerArg - get rust_arc_decrement_strong_count_ChannelInterestTokenPtr; + get rust_arc_decrement_strong_count_CircleClientSessionDefaultAnisetteProviderPtr; RustArcIncrementStrongCountFnType - get rust_arc_increment_strong_count_CircleClientSessionDefaultAnisetteProvider; + get rust_arc_increment_strong_count_CloudSyncPreparedMessageCreateHandle; RustArcDecrementStrongCountFnType - get rust_arc_decrement_strong_count_CircleClientSessionDefaultAnisetteProvider; + get rust_arc_decrement_strong_count_CloudSyncPreparedMessageCreateHandle; CrossPlatformFinalizerArg - get rust_arc_decrement_strong_count_CircleClientSessionDefaultAnisetteProviderPtr; + get rust_arc_decrement_strong_count_CloudSyncPreparedMessageCreateHandlePtr; RustArcIncrementStrongCountFnType - get rust_arc_increment_strong_count_ConversationLink; + get rust_arc_increment_strong_count_ConversationLink; RustArcDecrementStrongCountFnType - get rust_arc_decrement_strong_count_ConversationLink; + get rust_arc_decrement_strong_count_ConversationLink; CrossPlatformFinalizerArg - get rust_arc_decrement_strong_count_ConversationLinkPtr; + get rust_arc_decrement_strong_count_ConversationLinkPtr; RustArcIncrementStrongCountFnType - get rust_arc_increment_strong_count_ConversationParticipant; + get rust_arc_increment_strong_count_ConversationParticipant; RustArcDecrementStrongCountFnType - get rust_arc_decrement_strong_count_ConversationParticipant; + get rust_arc_decrement_strong_count_ConversationParticipant; CrossPlatformFinalizerArg - get rust_arc_decrement_strong_count_ConversationParticipantPtr; + get rust_arc_decrement_strong_count_ConversationParticipantPtr; RustArcIncrementStrongCountFnType get rust_arc_increment_strong_count_Date; @@ -1259,93 +1640,93 @@ abstract class RustLibApi extends BaseApi { CrossPlatformFinalizerArg get rust_arc_decrement_strong_count_DatePtr; RustArcIncrementStrongCountFnType - get rust_arc_increment_strong_count_EscrowData; + get rust_arc_increment_strong_count_EscrowData; RustArcDecrementStrongCountFnType - get rust_arc_decrement_strong_count_EscrowData; + get rust_arc_decrement_strong_count_EscrowData; CrossPlatformFinalizerArg get rust_arc_decrement_strong_count_EscrowDataPtr; RustArcIncrementStrongCountFnType - get rust_arc_increment_strong_count_FindMyFriendsClientDefaultAnisetteProvider; + get rust_arc_increment_strong_count_FindMyFriendsClientDefaultAnisetteProvider; RustArcDecrementStrongCountFnType - get rust_arc_decrement_strong_count_FindMyFriendsClientDefaultAnisetteProvider; + get rust_arc_decrement_strong_count_FindMyFriendsClientDefaultAnisetteProvider; CrossPlatformFinalizerArg - get rust_arc_decrement_strong_count_FindMyFriendsClientDefaultAnisetteProviderPtr; + get rust_arc_decrement_strong_count_FindMyFriendsClientDefaultAnisetteProviderPtr; RustArcIncrementStrongCountFnType - get rust_arc_increment_strong_count_FindMyPhoneClientDefaultAnisetteProvider; + get rust_arc_increment_strong_count_FindMyPhoneClientDefaultAnisetteProvider; RustArcDecrementStrongCountFnType - get rust_arc_decrement_strong_count_FindMyPhoneClientDefaultAnisetteProvider; + get rust_arc_decrement_strong_count_FindMyPhoneClientDefaultAnisetteProvider; CrossPlatformFinalizerArg - get rust_arc_decrement_strong_count_FindMyPhoneClientDefaultAnisetteProviderPtr; + get rust_arc_decrement_strong_count_FindMyPhoneClientDefaultAnisetteProviderPtr; RustArcIncrementStrongCountFnType - get rust_arc_increment_strong_count_GZipWrapperAttachmentMeta; + get rust_arc_increment_strong_count_GZipWrapperAttachmentMeta; RustArcDecrementStrongCountFnType - get rust_arc_decrement_strong_count_GZipWrapperAttachmentMeta; + get rust_arc_decrement_strong_count_GZipWrapperAttachmentMeta; CrossPlatformFinalizerArg - get rust_arc_decrement_strong_count_GZipWrapperAttachmentMetaPtr; + get rust_arc_decrement_strong_count_GZipWrapperAttachmentMetaPtr; RustArcIncrementStrongCountFnType - get rust_arc_increment_strong_count_GZipWrapperChatProto; + get rust_arc_increment_strong_count_GZipWrapperChatProto; RustArcDecrementStrongCountFnType - get rust_arc_decrement_strong_count_GZipWrapperChatProto; + get rust_arc_decrement_strong_count_GZipWrapperChatProto; CrossPlatformFinalizerArg - get rust_arc_decrement_strong_count_GZipWrapperChatProtoPtr; + get rust_arc_decrement_strong_count_GZipWrapperChatProtoPtr; RustArcIncrementStrongCountFnType - get rust_arc_increment_strong_count_GZipWrapperMessageProto; + get rust_arc_increment_strong_count_GZipWrapperMessageProto; RustArcDecrementStrongCountFnType - get rust_arc_decrement_strong_count_GZipWrapperMessageProto; + get rust_arc_decrement_strong_count_GZipWrapperMessageProto; CrossPlatformFinalizerArg - get rust_arc_decrement_strong_count_GZipWrapperMessageProtoPtr; + get rust_arc_decrement_strong_count_GZipWrapperMessageProtoPtr; RustArcIncrementStrongCountFnType - get rust_arc_increment_strong_count_GZipWrapperMessageProto2; + get rust_arc_increment_strong_count_GZipWrapperMessageProto2; RustArcDecrementStrongCountFnType - get rust_arc_decrement_strong_count_GZipWrapperMessageProto2; + get rust_arc_decrement_strong_count_GZipWrapperMessageProto2; CrossPlatformFinalizerArg - get rust_arc_decrement_strong_count_GZipWrapperMessageProto2Ptr; + get rust_arc_decrement_strong_count_GZipWrapperMessageProto2Ptr; RustArcIncrementStrongCountFnType - get rust_arc_increment_strong_count_GZipWrapperMessageProto3; + get rust_arc_increment_strong_count_GZipWrapperMessageProto3; RustArcDecrementStrongCountFnType - get rust_arc_decrement_strong_count_GZipWrapperMessageProto3; + get rust_arc_decrement_strong_count_GZipWrapperMessageProto3; CrossPlatformFinalizerArg - get rust_arc_decrement_strong_count_GZipWrapperMessageProto3Ptr; + get rust_arc_decrement_strong_count_GZipWrapperMessageProto3Ptr; RustArcIncrementStrongCountFnType - get rust_arc_increment_strong_count_GZipWrapperMessageProto4; + get rust_arc_increment_strong_count_GZipWrapperMessageProto4; RustArcDecrementStrongCountFnType - get rust_arc_decrement_strong_count_GZipWrapperMessageProto4; + get rust_arc_decrement_strong_count_GZipWrapperMessageProto4; CrossPlatformFinalizerArg - get rust_arc_decrement_strong_count_GZipWrapperMessageProto4Ptr; + get rust_arc_decrement_strong_count_GZipWrapperMessageProto4Ptr; RustArcIncrementStrongCountFnType - get rust_arc_increment_strong_count_IdsngmIdentity; + get rust_arc_increment_strong_count_IdsngmIdentity; RustArcDecrementStrongCountFnType - get rust_arc_decrement_strong_count_IdsngmIdentity; + get rust_arc_decrement_strong_count_IdsngmIdentity; CrossPlatformFinalizerArg - get rust_arc_decrement_strong_count_IdsngmIdentityPtr; + get rust_arc_decrement_strong_count_IdsngmIdentityPtr; RustArcIncrementStrongCountFnType get rust_arc_increment_strong_count_IdsUser; @@ -1354,74 +1735,74 @@ abstract class RustLibApi extends BaseApi { CrossPlatformFinalizerArg get rust_arc_decrement_strong_count_IdsUserPtr; RustArcIncrementStrongCountFnType - get rust_arc_increment_strong_count_JoinedOsConfig; + get rust_arc_increment_strong_count_JoinedOsConfig; RustArcDecrementStrongCountFnType - get rust_arc_decrement_strong_count_JoinedOsConfig; + get rust_arc_decrement_strong_count_JoinedOsConfig; CrossPlatformFinalizerArg - get rust_arc_decrement_strong_count_JoinedOsConfigPtr; + get rust_arc_decrement_strong_count_JoinedOsConfigPtr; RustArcIncrementStrongCountFnType - get rust_arc_increment_strong_count_LocationReport; + get rust_arc_increment_strong_count_LocationReport; RustArcDecrementStrongCountFnType - get rust_arc_decrement_strong_count_LocationReport; + get rust_arc_decrement_strong_count_LocationReport; CrossPlatformFinalizerArg - get rust_arc_decrement_strong_count_LocationReportPtr; + get rust_arc_decrement_strong_count_LocationReportPtr; RustArcIncrementStrongCountFnType - get rust_arc_increment_strong_count_MessageFlags; + get rust_arc_increment_strong_count_MessageFlags; RustArcDecrementStrongCountFnType - get rust_arc_decrement_strong_count_MessageFlags; + get rust_arc_decrement_strong_count_MessageFlags; CrossPlatformFinalizerArg get rust_arc_decrement_strong_count_MessageFlagsPtr; RustArcIncrementStrongCountFnType - get rust_arc_increment_strong_count_NsArrayLpIconMetadata; + get rust_arc_increment_strong_count_NsArrayLpIconMetadata; RustArcDecrementStrongCountFnType - get rust_arc_decrement_strong_count_NsArrayLpIconMetadata; + get rust_arc_decrement_strong_count_NsArrayLpIconMetadata; CrossPlatformFinalizerArg - get rust_arc_decrement_strong_count_NsArrayLpIconMetadataPtr; + get rust_arc_decrement_strong_count_NsArrayLpIconMetadataPtr; RustArcIncrementStrongCountFnType - get rust_arc_increment_strong_count_NsArrayLpImageMetadata; + get rust_arc_increment_strong_count_NsArrayLpImageMetadata; RustArcDecrementStrongCountFnType - get rust_arc_decrement_strong_count_NsArrayLpImageMetadata; + get rust_arc_decrement_strong_count_NsArrayLpImageMetadata; CrossPlatformFinalizerArg - get rust_arc_decrement_strong_count_NsArrayLpImageMetadataPtr; + get rust_arc_decrement_strong_count_NsArrayLpImageMetadataPtr; RustArcIncrementStrongCountFnType - get rust_arc_increment_strong_count_PushError; + get rust_arc_increment_strong_count_PushError; RustArcDecrementStrongCountFnType - get rust_arc_decrement_strong_count_PushError; + get rust_arc_decrement_strong_count_PushError; CrossPlatformFinalizerArg get rust_arc_decrement_strong_count_PushErrorPtr; RustArcIncrementStrongCountFnType - get rust_arc_increment_strong_count_ReceiverApsMessage; + get rust_arc_increment_strong_count_ReceiverApsMessage; RustArcDecrementStrongCountFnType - get rust_arc_decrement_strong_count_ReceiverApsMessage; + get rust_arc_decrement_strong_count_ReceiverApsMessage; CrossPlatformFinalizerArg - get rust_arc_decrement_strong_count_ReceiverApsMessagePtr; + get rust_arc_decrement_strong_count_ReceiverApsMessagePtr; RustArcIncrementStrongCountFnType - get rust_arc_increment_strong_count_SavedHardwareState; + get rust_arc_increment_strong_count_SavedHardwareState; RustArcDecrementStrongCountFnType - get rust_arc_decrement_strong_count_SavedHardwareState; + get rust_arc_decrement_strong_count_SavedHardwareState; CrossPlatformFinalizerArg - get rust_arc_decrement_strong_count_SavedHardwareStatePtr; + get rust_arc_decrement_strong_count_SavedHardwareStatePtr; RustArcIncrementStrongCountFnType get rust_arc_increment_strong_count_Sender; @@ -1430,44 +1811,44 @@ abstract class RustLibApi extends BaseApi { CrossPlatformFinalizerArg get rust_arc_decrement_strong_count_SenderPtr; RustArcIncrementStrongCountFnType - get rust_arc_increment_strong_count_StCollapsedValue; + get rust_arc_increment_strong_count_StCollapsedValue; RustArcDecrementStrongCountFnType - get rust_arc_decrement_strong_count_StCollapsedValue; + get rust_arc_decrement_strong_count_StCollapsedValue; CrossPlatformFinalizerArg - get rust_arc_decrement_strong_count_StCollapsedValuePtr; + get rust_arc_decrement_strong_count_StCollapsedValuePtr; RustArcIncrementStrongCountFnType - get rust_arc_increment_strong_count_SyncManagerDefaultAnisetteProviderMyFilePackager; + get rust_arc_increment_strong_count_SyncManagerDefaultAnisetteProviderMyFilePackager; RustArcDecrementStrongCountFnType - get rust_arc_decrement_strong_count_SyncManagerDefaultAnisetteProviderMyFilePackager; + get rust_arc_decrement_strong_count_SyncManagerDefaultAnisetteProviderMyFilePackager; CrossPlatformFinalizerArg - get rust_arc_decrement_strong_count_SyncManagerDefaultAnisetteProviderMyFilePackagerPtr; + get rust_arc_decrement_strong_count_SyncManagerDefaultAnisetteProviderMyFilePackagerPtr; RustArcIncrementStrongCountFnType - get rust_arc_increment_strong_count_SystemTime; + get rust_arc_increment_strong_count_SystemTime; RustArcDecrementStrongCountFnType - get rust_arc_decrement_strong_count_SystemTime; + get rust_arc_decrement_strong_count_SystemTime; CrossPlatformFinalizerArg get rust_arc_decrement_strong_count_SystemTimePtr; RustArcIncrementStrongCountFnType - get rust_arc_increment_strong_count_VerifyBody; + get rust_arc_increment_strong_count_VerifyBody; RustArcDecrementStrongCountFnType - get rust_arc_decrement_strong_count_VerifyBody; + get rust_arc_decrement_strong_count_VerifyBody; CrossPlatformFinalizerArg get rust_arc_decrement_strong_count_VerifyBodyPtr; RustArcIncrementStrongCountFnType - get rust_arc_increment_strong_count_ViableBottle; + get rust_arc_increment_strong_count_ViableBottle; RustArcDecrementStrongCountFnType - get rust_arc_decrement_strong_count_ViableBottle; + get rust_arc_decrement_strong_count_ViableBottle; CrossPlatformFinalizerArg get rust_arc_decrement_strong_count_ViableBottlePtr; } @@ -1481,105 +1862,125 @@ class RustLibApiImpl extends RustLibApiImplPlatform implements RustLibApi { }); @override - int crateApiApiLocationReportAutoAccessorGetConfidence( - {required LocationReport that}) { - return handler.executeSync(SyncTask( - callFfi: () { - final serializer = SseSerializer(generalizedFrbRustBinding); - sse_encode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerLocationReport( - that, serializer); - return pdeCallFfi(generalizedFrbRustBinding, serializer, funcId: 1)!; - }, - codec: SseCodec( - decodeSuccessData: sse_decode_u_8, - decodeErrorData: null, - ), - constMeta: kCrateApiApiLocationReportAutoAccessorGetConfidenceConstMeta, - argValues: [that], - apiImpl: this, - )); + int crateApiApiLocationReportAutoAccessorGetConfidence({ + required LocationReport that, + }) { + return handler.executeSync( + SyncTask( + callFfi: () { + final serializer = SseSerializer(generalizedFrbRustBinding); + sse_encode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerLocationReport( + that, + serializer, + ); + return pdeCallFfi(generalizedFrbRustBinding, serializer, funcId: 1)!; + }, + codec: SseCodec( + decodeSuccessData: sse_decode_u_8, + decodeErrorData: null, + ), + constMeta: kCrateApiApiLocationReportAutoAccessorGetConfidenceConstMeta, + argValues: [that], + apiImpl: this, + ), + ); } TaskConstMeta - get kCrateApiApiLocationReportAutoAccessorGetConfidenceConstMeta => - const TaskConstMeta( - debugName: "LocationReport_auto_accessor_get_confidence", - argNames: ["that"], - ); - - @override - int crateApiApiLocationReportAutoAccessorGetHorizontalAccuracy( - {required LocationReport that}) { - return handler.executeSync(SyncTask( - callFfi: () { - final serializer = SseSerializer(generalizedFrbRustBinding); - sse_encode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerLocationReport( - that, serializer); - return pdeCallFfi(generalizedFrbRustBinding, serializer, funcId: 2)!; - }, - codec: SseCodec( - decodeSuccessData: sse_decode_u_8, - decodeErrorData: null, - ), - constMeta: - kCrateApiApiLocationReportAutoAccessorGetHorizontalAccuracyConstMeta, - argValues: [that], - apiImpl: this, - )); + get kCrateApiApiLocationReportAutoAccessorGetConfidenceConstMeta => + const TaskConstMeta( + debugName: "LocationReport_auto_accessor_get_confidence", + argNames: ["that"], + ); + + @override + int crateApiApiLocationReportAutoAccessorGetHorizontalAccuracy({ + required LocationReport that, + }) { + return handler.executeSync( + SyncTask( + callFfi: () { + final serializer = SseSerializer(generalizedFrbRustBinding); + sse_encode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerLocationReport( + that, + serializer, + ); + return pdeCallFfi(generalizedFrbRustBinding, serializer, funcId: 2)!; + }, + codec: SseCodec( + decodeSuccessData: sse_decode_u_8, + decodeErrorData: null, + ), + constMeta: + kCrateApiApiLocationReportAutoAccessorGetHorizontalAccuracyConstMeta, + argValues: [that], + apiImpl: this, + ), + ); } TaskConstMeta - get kCrateApiApiLocationReportAutoAccessorGetHorizontalAccuracyConstMeta => - const TaskConstMeta( - debugName: "LocationReport_auto_accessor_get_horizontal_accuracy", - argNames: ["that"], - ); - - @override - int crateApiApiLocationReportAutoAccessorGetKeyIndex( - {required LocationReport that}) { - return handler.executeSync(SyncTask( - callFfi: () { - final serializer = SseSerializer(generalizedFrbRustBinding); - sse_encode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerLocationReport( - that, serializer); - return pdeCallFfi(generalizedFrbRustBinding, serializer, funcId: 3)!; - }, - codec: SseCodec( - decodeSuccessData: sse_decode_CastedPrimitive_usize, - decodeErrorData: null, - ), - constMeta: kCrateApiApiLocationReportAutoAccessorGetKeyIndexConstMeta, - argValues: [that], - apiImpl: this, - )); + get kCrateApiApiLocationReportAutoAccessorGetHorizontalAccuracyConstMeta => + const TaskConstMeta( + debugName: "LocationReport_auto_accessor_get_horizontal_accuracy", + argNames: ["that"], + ); + + @override + int crateApiApiLocationReportAutoAccessorGetKeyIndex({ + required LocationReport that, + }) { + return handler.executeSync( + SyncTask( + callFfi: () { + final serializer = SseSerializer(generalizedFrbRustBinding); + sse_encode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerLocationReport( + that, + serializer, + ); + return pdeCallFfi(generalizedFrbRustBinding, serializer, funcId: 3)!; + }, + codec: SseCodec( + decodeSuccessData: sse_decode_CastedPrimitive_usize, + decodeErrorData: null, + ), + constMeta: kCrateApiApiLocationReportAutoAccessorGetKeyIndexConstMeta, + argValues: [that], + apiImpl: this, + ), + ); } TaskConstMeta - get kCrateApiApiLocationReportAutoAccessorGetKeyIndexConstMeta => - const TaskConstMeta( - debugName: "LocationReport_auto_accessor_get_key_index", - argNames: ["that"], - ); - - @override - double crateApiApiLocationReportAutoAccessorGetLat( - {required LocationReport that}) { - return handler.executeSync(SyncTask( - callFfi: () { - final serializer = SseSerializer(generalizedFrbRustBinding); - sse_encode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerLocationReport( - that, serializer); - return pdeCallFfi(generalizedFrbRustBinding, serializer, funcId: 4)!; - }, - codec: SseCodec( - decodeSuccessData: sse_decode_f_32, - decodeErrorData: null, - ), - constMeta: kCrateApiApiLocationReportAutoAccessorGetLatConstMeta, - argValues: [that], - apiImpl: this, - )); + get kCrateApiApiLocationReportAutoAccessorGetKeyIndexConstMeta => + const TaskConstMeta( + debugName: "LocationReport_auto_accessor_get_key_index", + argNames: ["that"], + ); + + @override + double crateApiApiLocationReportAutoAccessorGetLat({ + required LocationReport that, + }) { + return handler.executeSync( + SyncTask( + callFfi: () { + final serializer = SseSerializer(generalizedFrbRustBinding); + sse_encode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerLocationReport( + that, + serializer, + ); + return pdeCallFfi(generalizedFrbRustBinding, serializer, funcId: 4)!; + }, + codec: SseCodec( + decodeSuccessData: sse_decode_f_32, + decodeErrorData: null, + ), + constMeta: kCrateApiApiLocationReportAutoAccessorGetLatConstMeta, + argValues: [that], + apiImpl: this, + ), + ); } TaskConstMeta get kCrateApiApiLocationReportAutoAccessorGetLatConstMeta => @@ -1589,23 +1990,28 @@ class RustLibApiImpl extends RustLibApiImplPlatform implements RustLibApi { ); @override - double crateApiApiLocationReportAutoAccessorGetLong( - {required LocationReport that}) { - return handler.executeSync(SyncTask( - callFfi: () { - final serializer = SseSerializer(generalizedFrbRustBinding); - sse_encode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerLocationReport( - that, serializer); - return pdeCallFfi(generalizedFrbRustBinding, serializer, funcId: 5)!; - }, - codec: SseCodec( - decodeSuccessData: sse_decode_f_32, - decodeErrorData: null, - ), - constMeta: kCrateApiApiLocationReportAutoAccessorGetLongConstMeta, - argValues: [that], - apiImpl: this, - )); + double crateApiApiLocationReportAutoAccessorGetLong({ + required LocationReport that, + }) { + return handler.executeSync( + SyncTask( + callFfi: () { + final serializer = SseSerializer(generalizedFrbRustBinding); + sse_encode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerLocationReport( + that, + serializer, + ); + return pdeCallFfi(generalizedFrbRustBinding, serializer, funcId: 5)!; + }, + codec: SseCodec( + decodeSuccessData: sse_decode_f_32, + decodeErrorData: null, + ), + constMeta: kCrateApiApiLocationReportAutoAccessorGetLongConstMeta, + argValues: [that], + apiImpl: this, + ), + ); } TaskConstMeta get kCrateApiApiLocationReportAutoAccessorGetLongConstMeta => @@ -1615,23 +2021,28 @@ class RustLibApiImpl extends RustLibApiImplPlatform implements RustLibApi { ); @override - int crateApiApiLocationReportAutoAccessorGetStatus( - {required LocationReport that}) { - return handler.executeSync(SyncTask( - callFfi: () { - final serializer = SseSerializer(generalizedFrbRustBinding); - sse_encode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerLocationReport( - that, serializer); - return pdeCallFfi(generalizedFrbRustBinding, serializer, funcId: 6)!; - }, - codec: SseCodec( - decodeSuccessData: sse_decode_u_8, - decodeErrorData: null, - ), - constMeta: kCrateApiApiLocationReportAutoAccessorGetStatusConstMeta, - argValues: [that], - apiImpl: this, - )); + int crateApiApiLocationReportAutoAccessorGetStatus({ + required LocationReport that, + }) { + return handler.executeSync( + SyncTask( + callFfi: () { + final serializer = SseSerializer(generalizedFrbRustBinding); + sse_encode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerLocationReport( + that, + serializer, + ); + return pdeCallFfi(generalizedFrbRustBinding, serializer, funcId: 6)!; + }, + codec: SseCodec( + decodeSuccessData: sse_decode_u_8, + decodeErrorData: null, + ), + constMeta: kCrateApiApiLocationReportAutoAccessorGetStatusConstMeta, + argValues: [that], + apiImpl: this, + ), + ); } TaskConstMeta get kCrateApiApiLocationReportAutoAccessorGetStatusConstMeta => @@ -1641,137 +2052,166 @@ class RustLibApiImpl extends RustLibApiImplPlatform implements RustLibApi { ); @override - SystemTime crateApiApiLocationReportAutoAccessorGetTimestamp( - {required LocationReport that}) { - return handler.executeSync(SyncTask( - callFfi: () { - final serializer = SseSerializer(generalizedFrbRustBinding); - sse_encode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerLocationReport( - that, serializer); - return pdeCallFfi(generalizedFrbRustBinding, serializer, funcId: 7)!; - }, - codec: SseCodec( - decodeSuccessData: - sse_decode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerSystemTime, - decodeErrorData: null, - ), - constMeta: kCrateApiApiLocationReportAutoAccessorGetTimestampConstMeta, - argValues: [that], - apiImpl: this, - )); + SystemTime crateApiApiLocationReportAutoAccessorGetTimestamp({ + required LocationReport that, + }) { + return handler.executeSync( + SyncTask( + callFfi: () { + final serializer = SseSerializer(generalizedFrbRustBinding); + sse_encode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerLocationReport( + that, + serializer, + ); + return pdeCallFfi(generalizedFrbRustBinding, serializer, funcId: 7)!; + }, + codec: SseCodec( + decodeSuccessData: + sse_decode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerSystemTime, + decodeErrorData: null, + ), + constMeta: kCrateApiApiLocationReportAutoAccessorGetTimestampConstMeta, + argValues: [that], + apiImpl: this, + ), + ); } TaskConstMeta - get kCrateApiApiLocationReportAutoAccessorGetTimestampConstMeta => - const TaskConstMeta( - debugName: "LocationReport_auto_accessor_get_timestamp", - argNames: ["that"], - ); - - @override - void crateApiApiLocationReportAutoAccessorSetConfidence( - {required LocationReport that, required int confidence}) { - return handler.executeSync(SyncTask( - callFfi: () { - final serializer = SseSerializer(generalizedFrbRustBinding); - sse_encode_Auto_RefMut_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerLocationReport( - that, serializer); - sse_encode_u_8(confidence, serializer); - return pdeCallFfi(generalizedFrbRustBinding, serializer, funcId: 8)!; - }, - codec: SseCodec( - decodeSuccessData: sse_decode_unit, - decodeErrorData: null, - ), - constMeta: kCrateApiApiLocationReportAutoAccessorSetConfidenceConstMeta, - argValues: [that, confidence], - apiImpl: this, - )); + get kCrateApiApiLocationReportAutoAccessorGetTimestampConstMeta => + const TaskConstMeta( + debugName: "LocationReport_auto_accessor_get_timestamp", + argNames: ["that"], + ); + + @override + void crateApiApiLocationReportAutoAccessorSetConfidence({ + required LocationReport that, + required int confidence, + }) { + return handler.executeSync( + SyncTask( + callFfi: () { + final serializer = SseSerializer(generalizedFrbRustBinding); + sse_encode_Auto_RefMut_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerLocationReport( + that, + serializer, + ); + sse_encode_u_8(confidence, serializer); + return pdeCallFfi(generalizedFrbRustBinding, serializer, funcId: 8)!; + }, + codec: SseCodec( + decodeSuccessData: sse_decode_unit, + decodeErrorData: null, + ), + constMeta: kCrateApiApiLocationReportAutoAccessorSetConfidenceConstMeta, + argValues: [that, confidence], + apiImpl: this, + ), + ); } TaskConstMeta - get kCrateApiApiLocationReportAutoAccessorSetConfidenceConstMeta => - const TaskConstMeta( - debugName: "LocationReport_auto_accessor_set_confidence", - argNames: ["that", "confidence"], - ); - - @override - void crateApiApiLocationReportAutoAccessorSetHorizontalAccuracy( - {required LocationReport that, required int horizontalAccuracy}) { - return handler.executeSync(SyncTask( - callFfi: () { - final serializer = SseSerializer(generalizedFrbRustBinding); - sse_encode_Auto_RefMut_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerLocationReport( - that, serializer); - sse_encode_u_8(horizontalAccuracy, serializer); - return pdeCallFfi(generalizedFrbRustBinding, serializer, funcId: 9)!; - }, - codec: SseCodec( - decodeSuccessData: sse_decode_unit, - decodeErrorData: null, - ), - constMeta: - kCrateApiApiLocationReportAutoAccessorSetHorizontalAccuracyConstMeta, - argValues: [that, horizontalAccuracy], - apiImpl: this, - )); + get kCrateApiApiLocationReportAutoAccessorSetConfidenceConstMeta => + const TaskConstMeta( + debugName: "LocationReport_auto_accessor_set_confidence", + argNames: ["that", "confidence"], + ); + + @override + void crateApiApiLocationReportAutoAccessorSetHorizontalAccuracy({ + required LocationReport that, + required int horizontalAccuracy, + }) { + return handler.executeSync( + SyncTask( + callFfi: () { + final serializer = SseSerializer(generalizedFrbRustBinding); + sse_encode_Auto_RefMut_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerLocationReport( + that, + serializer, + ); + sse_encode_u_8(horizontalAccuracy, serializer); + return pdeCallFfi(generalizedFrbRustBinding, serializer, funcId: 9)!; + }, + codec: SseCodec( + decodeSuccessData: sse_decode_unit, + decodeErrorData: null, + ), + constMeta: + kCrateApiApiLocationReportAutoAccessorSetHorizontalAccuracyConstMeta, + argValues: [that, horizontalAccuracy], + apiImpl: this, + ), + ); } TaskConstMeta - get kCrateApiApiLocationReportAutoAccessorSetHorizontalAccuracyConstMeta => - const TaskConstMeta( - debugName: "LocationReport_auto_accessor_set_horizontal_accuracy", - argNames: ["that", "horizontalAccuracy"], - ); - - @override - void crateApiApiLocationReportAutoAccessorSetKeyIndex( - {required LocationReport that, required int keyIndex}) { - return handler.executeSync(SyncTask( - callFfi: () { - final serializer = SseSerializer(generalizedFrbRustBinding); - sse_encode_Auto_RefMut_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerLocationReport( - that, serializer); - sse_encode_CastedPrimitive_usize(keyIndex, serializer); - return pdeCallFfi(generalizedFrbRustBinding, serializer, funcId: 10)!; - }, - codec: SseCodec( - decodeSuccessData: sse_decode_unit, - decodeErrorData: null, - ), - constMeta: kCrateApiApiLocationReportAutoAccessorSetKeyIndexConstMeta, - argValues: [that, keyIndex], - apiImpl: this, - )); + get kCrateApiApiLocationReportAutoAccessorSetHorizontalAccuracyConstMeta => + const TaskConstMeta( + debugName: "LocationReport_auto_accessor_set_horizontal_accuracy", + argNames: ["that", "horizontalAccuracy"], + ); + + @override + void crateApiApiLocationReportAutoAccessorSetKeyIndex({ + required LocationReport that, + required int keyIndex, + }) { + return handler.executeSync( + SyncTask( + callFfi: () { + final serializer = SseSerializer(generalizedFrbRustBinding); + sse_encode_Auto_RefMut_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerLocationReport( + that, + serializer, + ); + sse_encode_CastedPrimitive_usize(keyIndex, serializer); + return pdeCallFfi(generalizedFrbRustBinding, serializer, funcId: 10)!; + }, + codec: SseCodec( + decodeSuccessData: sse_decode_unit, + decodeErrorData: null, + ), + constMeta: kCrateApiApiLocationReportAutoAccessorSetKeyIndexConstMeta, + argValues: [that, keyIndex], + apiImpl: this, + ), + ); } TaskConstMeta - get kCrateApiApiLocationReportAutoAccessorSetKeyIndexConstMeta => - const TaskConstMeta( - debugName: "LocationReport_auto_accessor_set_key_index", - argNames: ["that", "keyIndex"], - ); - - @override - void crateApiApiLocationReportAutoAccessorSetLat( - {required LocationReport that, required double lat}) { - return handler.executeSync(SyncTask( - callFfi: () { - final serializer = SseSerializer(generalizedFrbRustBinding); - sse_encode_Auto_RefMut_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerLocationReport( - that, serializer); - sse_encode_f_32(lat, serializer); - return pdeCallFfi(generalizedFrbRustBinding, serializer, funcId: 11)!; - }, - codec: SseCodec( - decodeSuccessData: sse_decode_unit, - decodeErrorData: null, - ), - constMeta: kCrateApiApiLocationReportAutoAccessorSetLatConstMeta, - argValues: [that, lat], - apiImpl: this, - )); + get kCrateApiApiLocationReportAutoAccessorSetKeyIndexConstMeta => + const TaskConstMeta( + debugName: "LocationReport_auto_accessor_set_key_index", + argNames: ["that", "keyIndex"], + ); + + @override + void crateApiApiLocationReportAutoAccessorSetLat({ + required LocationReport that, + required double lat, + }) { + return handler.executeSync( + SyncTask( + callFfi: () { + final serializer = SseSerializer(generalizedFrbRustBinding); + sse_encode_Auto_RefMut_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerLocationReport( + that, + serializer, + ); + sse_encode_f_32(lat, serializer); + return pdeCallFfi(generalizedFrbRustBinding, serializer, funcId: 11)!; + }, + codec: SseCodec( + decodeSuccessData: sse_decode_unit, + decodeErrorData: null, + ), + constMeta: kCrateApiApiLocationReportAutoAccessorSetLatConstMeta, + argValues: [that, lat], + apiImpl: this, + ), + ); } TaskConstMeta get kCrateApiApiLocationReportAutoAccessorSetLatConstMeta => @@ -1781,24 +2221,30 @@ class RustLibApiImpl extends RustLibApiImplPlatform implements RustLibApi { ); @override - void crateApiApiLocationReportAutoAccessorSetLong( - {required LocationReport that, required double long}) { - return handler.executeSync(SyncTask( - callFfi: () { - final serializer = SseSerializer(generalizedFrbRustBinding); - sse_encode_Auto_RefMut_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerLocationReport( - that, serializer); - sse_encode_f_32(long, serializer); - return pdeCallFfi(generalizedFrbRustBinding, serializer, funcId: 12)!; - }, - codec: SseCodec( - decodeSuccessData: sse_decode_unit, - decodeErrorData: null, - ), - constMeta: kCrateApiApiLocationReportAutoAccessorSetLongConstMeta, - argValues: [that, long], - apiImpl: this, - )); + void crateApiApiLocationReportAutoAccessorSetLong({ + required LocationReport that, + required double long, + }) { + return handler.executeSync( + SyncTask( + callFfi: () { + final serializer = SseSerializer(generalizedFrbRustBinding); + sse_encode_Auto_RefMut_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerLocationReport( + that, + serializer, + ); + sse_encode_f_32(long, serializer); + return pdeCallFfi(generalizedFrbRustBinding, serializer, funcId: 12)!; + }, + codec: SseCodec( + decodeSuccessData: sse_decode_unit, + decodeErrorData: null, + ), + constMeta: kCrateApiApiLocationReportAutoAccessorSetLongConstMeta, + argValues: [that, long], + apiImpl: this, + ), + ); } TaskConstMeta get kCrateApiApiLocationReportAutoAccessorSetLongConstMeta => @@ -1808,24 +2254,30 @@ class RustLibApiImpl extends RustLibApiImplPlatform implements RustLibApi { ); @override - void crateApiApiLocationReportAutoAccessorSetStatus( - {required LocationReport that, required int status}) { - return handler.executeSync(SyncTask( - callFfi: () { - final serializer = SseSerializer(generalizedFrbRustBinding); - sse_encode_Auto_RefMut_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerLocationReport( - that, serializer); - sse_encode_u_8(status, serializer); - return pdeCallFfi(generalizedFrbRustBinding, serializer, funcId: 13)!; - }, - codec: SseCodec( - decodeSuccessData: sse_decode_unit, - decodeErrorData: null, - ), - constMeta: kCrateApiApiLocationReportAutoAccessorSetStatusConstMeta, - argValues: [that, status], - apiImpl: this, - )); + void crateApiApiLocationReportAutoAccessorSetStatus({ + required LocationReport that, + required int status, + }) { + return handler.executeSync( + SyncTask( + callFfi: () { + final serializer = SseSerializer(generalizedFrbRustBinding); + sse_encode_Auto_RefMut_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerLocationReport( + that, + serializer, + ); + sse_encode_u_8(status, serializer); + return pdeCallFfi(generalizedFrbRustBinding, serializer, funcId: 13)!; + }, + codec: SseCodec( + decodeSuccessData: sse_decode_unit, + decodeErrorData: null, + ), + constMeta: kCrateApiApiLocationReportAutoAccessorSetStatusConstMeta, + argValues: [that, status], + apiImpl: this, + ), + ); } TaskConstMeta get kCrateApiApiLocationReportAutoAccessorSetStatusConstMeta => @@ -1835,77 +2287,89 @@ class RustLibApiImpl extends RustLibApiImplPlatform implements RustLibApi { ); @override - void crateApiApiLocationReportAutoAccessorSetTimestamp( - {required LocationReport that, required SystemTime timestamp}) { - return handler.executeSync(SyncTask( - callFfi: () { - final serializer = SseSerializer(generalizedFrbRustBinding); - sse_encode_Auto_RefMut_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerLocationReport( - that, serializer); - sse_encode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerSystemTime( - timestamp, serializer); - return pdeCallFfi(generalizedFrbRustBinding, serializer, funcId: 14)!; - }, - codec: SseCodec( - decodeSuccessData: sse_decode_unit, - decodeErrorData: null, - ), - constMeta: kCrateApiApiLocationReportAutoAccessorSetTimestampConstMeta, - argValues: [that, timestamp], - apiImpl: this, - )); + void crateApiApiLocationReportAutoAccessorSetTimestamp({ + required LocationReport that, + required SystemTime timestamp, + }) { + return handler.executeSync( + SyncTask( + callFfi: () { + final serializer = SseSerializer(generalizedFrbRustBinding); + sse_encode_Auto_RefMut_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerLocationReport( + that, + serializer, + ); + sse_encode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerSystemTime( + timestamp, + serializer, + ); + return pdeCallFfi(generalizedFrbRustBinding, serializer, funcId: 14)!; + }, + codec: SseCodec( + decodeSuccessData: sse_decode_unit, + decodeErrorData: null, + ), + constMeta: kCrateApiApiLocationReportAutoAccessorSetTimestampConstMeta, + argValues: [that, timestamp], + apiImpl: this, + ), + ); } TaskConstMeta - get kCrateApiApiLocationReportAutoAccessorSetTimestampConstMeta => - const TaskConstMeta( - debugName: "LocationReport_auto_accessor_set_timestamp", - argNames: ["that", "timestamp"], - ); + get kCrateApiApiLocationReportAutoAccessorSetTimestampConstMeta => + const TaskConstMeta( + debugName: "LocationReport_auto_accessor_set_timestamp", + argNames: ["that", "timestamp"], + ); @override PlatformInt64 crateApiApiMessageFlagsBits({required MessageFlags that}) { - return handler.executeSync(SyncTask( - callFfi: () { - final serializer = SseSerializer(generalizedFrbRustBinding); - sse_encode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerMessageFlags( - that, serializer); - return pdeCallFfi(generalizedFrbRustBinding, serializer, funcId: 15)!; - }, - codec: SseCodec( - decodeSuccessData: sse_decode_i_64, - decodeErrorData: null, - ), - constMeta: kCrateApiApiMessageFlagsBitsConstMeta, - argValues: [that], - apiImpl: this, - )); + return handler.executeSync( + SyncTask( + callFfi: () { + final serializer = SseSerializer(generalizedFrbRustBinding); + sse_encode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerMessageFlags( + that, + serializer, + ); + return pdeCallFfi(generalizedFrbRustBinding, serializer, funcId: 15)!; + }, + codec: SseCodec( + decodeSuccessData: sse_decode_i_64, + decodeErrorData: null, + ), + constMeta: kCrateApiApiMessageFlagsBitsConstMeta, + argValues: [that], + apiImpl: this, + ), + ); } TaskConstMeta get kCrateApiApiMessageFlagsBitsConstMeta => - const TaskConstMeta( - debugName: "MessageFlags_bits", - argNames: ["that"], - ); + const TaskConstMeta(debugName: "MessageFlags_bits", argNames: ["that"]); @override - MessageFlags crateApiApiMessageFlagsFromBitsTruncate( - {required PlatformInt64 val}) { - return handler.executeSync(SyncTask( - callFfi: () { - final serializer = SseSerializer(generalizedFrbRustBinding); - sse_encode_i_64(val, serializer); - return pdeCallFfi(generalizedFrbRustBinding, serializer, funcId: 16)!; - }, - codec: SseCodec( - decodeSuccessData: - sse_decode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerMessageFlags, - decodeErrorData: null, - ), - constMeta: kCrateApiApiMessageFlagsFromBitsTruncateConstMeta, - argValues: [val], - apiImpl: this, - )); + MessageFlags crateApiApiMessageFlagsFromBitsTruncate({ + required PlatformInt64 val, + }) { + return handler.executeSync( + SyncTask( + callFfi: () { + final serializer = SseSerializer(generalizedFrbRustBinding); + sse_encode_i_64(val, serializer); + return pdeCallFfi(generalizedFrbRustBinding, serializer, funcId: 16)!; + }, + codec: SseCodec( + decodeSuccessData: + sse_decode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerMessageFlags, + decodeErrorData: null, + ), + constMeta: kCrateApiApiMessageFlagsFromBitsTruncateConstMeta, + argValues: [val], + apiImpl: this, + ), + ); } TaskConstMeta get kCrateApiApiMessageFlagsFromBitsTruncateConstMeta => @@ -1915,755 +2379,942 @@ class RustLibApiImpl extends RustLibApiImplPlatform implements RustLibApi { ); @override - Uint8List crateApiApiSavedHardwareStateAutoAccessorGetIdentity( - {required SavedHardwareState that}) { - return handler.executeSync(SyncTask( - callFfi: () { - final serializer = SseSerializer(generalizedFrbRustBinding); - sse_encode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerSavedHardwareState( - that, serializer); - return pdeCallFfi(generalizedFrbRustBinding, serializer, funcId: 17)!; - }, - codec: SseCodec( - decodeSuccessData: sse_decode_list_prim_u_8_strict, - decodeErrorData: null, - ), - constMeta: kCrateApiApiSavedHardwareStateAutoAccessorGetIdentityConstMeta, - argValues: [that], - apiImpl: this, - )); - } - - TaskConstMeta - get kCrateApiApiSavedHardwareStateAutoAccessorGetIdentityConstMeta => - const TaskConstMeta( - debugName: "SavedHardwareState_auto_accessor_get_identity", - argNames: ["that"], - ); - - @override - JoinedOsConfig crateApiApiSavedHardwareStateAutoAccessorGetOsConfig( - {required SavedHardwareState that}) { - return handler.executeSync(SyncTask( - callFfi: () { - final serializer = SseSerializer(generalizedFrbRustBinding); - sse_encode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerSavedHardwareState( - that, serializer); - return pdeCallFfi(generalizedFrbRustBinding, serializer, funcId: 18)!; - }, - codec: SseCodec( - decodeSuccessData: - sse_decode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerJoinedOSConfig, - decodeErrorData: null, - ), - constMeta: kCrateApiApiSavedHardwareStateAutoAccessorGetOsConfigConstMeta, - argValues: [that], - apiImpl: this, - )); - } - - TaskConstMeta - get kCrateApiApiSavedHardwareStateAutoAccessorGetOsConfigConstMeta => - const TaskConstMeta( - debugName: "SavedHardwareState_auto_accessor_get_os_config", - argNames: ["that"], - ); - - @override - ApsState crateApiApiSavedHardwareStateAutoAccessorGetPush( - {required SavedHardwareState that}) { - return handler.executeSync(SyncTask( - callFfi: () { - final serializer = SseSerializer(generalizedFrbRustBinding); - sse_encode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerSavedHardwareState( - that, serializer); - return pdeCallFfi(generalizedFrbRustBinding, serializer, funcId: 19)!; - }, - codec: SseCodec( - decodeSuccessData: - sse_decode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerAPSState, - decodeErrorData: null, - ), - constMeta: kCrateApiApiSavedHardwareStateAutoAccessorGetPushConstMeta, - argValues: [that], - apiImpl: this, - )); + Uint8List crateApiApiSavedHardwareStateAutoAccessorGetIdentity({ + required SavedHardwareState that, + }) { + return handler.executeSync( + SyncTask( + callFfi: () { + final serializer = SseSerializer(generalizedFrbRustBinding); + sse_encode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerSavedHardwareState( + that, + serializer, + ); + return pdeCallFfi(generalizedFrbRustBinding, serializer, funcId: 17)!; + }, + codec: SseCodec( + decodeSuccessData: sse_decode_list_prim_u_8_strict, + decodeErrorData: null, + ), + constMeta: + kCrateApiApiSavedHardwareStateAutoAccessorGetIdentityConstMeta, + argValues: [that], + apiImpl: this, + ), + ); } TaskConstMeta - get kCrateApiApiSavedHardwareStateAutoAccessorGetPushConstMeta => - const TaskConstMeta( - debugName: "SavedHardwareState_auto_accessor_get_push", - argNames: ["that"], - ); - - @override - void crateApiApiSavedHardwareStateAutoAccessorSetIdentity( - {required SavedHardwareState that, required Uint8List identity}) { - return handler.executeSync(SyncTask( - callFfi: () { - final serializer = SseSerializer(generalizedFrbRustBinding); - sse_encode_Auto_RefMut_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerSavedHardwareState( - that, serializer); - sse_encode_list_prim_u_8_strict(identity, serializer); - return pdeCallFfi(generalizedFrbRustBinding, serializer, funcId: 20)!; - }, - codec: SseCodec( - decodeSuccessData: sse_decode_unit, - decodeErrorData: null, - ), - constMeta: kCrateApiApiSavedHardwareStateAutoAccessorSetIdentityConstMeta, - argValues: [that, identity], - apiImpl: this, - )); - } + get kCrateApiApiSavedHardwareStateAutoAccessorGetIdentityConstMeta => + const TaskConstMeta( + debugName: "SavedHardwareState_auto_accessor_get_identity", + argNames: ["that"], + ); - TaskConstMeta - get kCrateApiApiSavedHardwareStateAutoAccessorSetIdentityConstMeta => - const TaskConstMeta( - debugName: "SavedHardwareState_auto_accessor_set_identity", - argNames: ["that", "identity"], - ); - - @override - void crateApiApiSavedHardwareStateAutoAccessorSetOsConfig( - {required SavedHardwareState that, required JoinedOsConfig osConfig}) { - return handler.executeSync(SyncTask( - callFfi: () { - final serializer = SseSerializer(generalizedFrbRustBinding); - sse_encode_Auto_RefMut_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerSavedHardwareState( - that, serializer); - sse_encode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerJoinedOSConfig( - osConfig, serializer); - return pdeCallFfi(generalizedFrbRustBinding, serializer, funcId: 21)!; - }, - codec: SseCodec( - decodeSuccessData: sse_decode_unit, - decodeErrorData: null, - ), - constMeta: kCrateApiApiSavedHardwareStateAutoAccessorSetOsConfigConstMeta, - argValues: [that, osConfig], - apiImpl: this, - )); + @override + JoinedOsConfig crateApiApiSavedHardwareStateAutoAccessorGetOsConfig({ + required SavedHardwareState that, + }) { + return handler.executeSync( + SyncTask( + callFfi: () { + final serializer = SseSerializer(generalizedFrbRustBinding); + sse_encode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerSavedHardwareState( + that, + serializer, + ); + return pdeCallFfi(generalizedFrbRustBinding, serializer, funcId: 18)!; + }, + codec: SseCodec( + decodeSuccessData: + sse_decode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerJoinedOSConfig, + decodeErrorData: null, + ), + constMeta: + kCrateApiApiSavedHardwareStateAutoAccessorGetOsConfigConstMeta, + argValues: [that], + apiImpl: this, + ), + ); } TaskConstMeta - get kCrateApiApiSavedHardwareStateAutoAccessorSetOsConfigConstMeta => - const TaskConstMeta( - debugName: "SavedHardwareState_auto_accessor_set_os_config", - argNames: ["that", "osConfig"], - ); - - @override - void crateApiApiSavedHardwareStateAutoAccessorSetPush( - {required SavedHardwareState that, required ApsState push}) { - return handler.executeSync(SyncTask( - callFfi: () { - final serializer = SseSerializer(generalizedFrbRustBinding); - sse_encode_Auto_RefMut_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerSavedHardwareState( - that, serializer); - sse_encode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerAPSState( - push, serializer); - return pdeCallFfi(generalizedFrbRustBinding, serializer, funcId: 22)!; - }, - codec: SseCodec( - decodeSuccessData: sse_decode_unit, - decodeErrorData: null, - ), - constMeta: kCrateApiApiSavedHardwareStateAutoAccessorSetPushConstMeta, - argValues: [that, push], - apiImpl: this, - )); - } + get kCrateApiApiSavedHardwareStateAutoAccessorGetOsConfigConstMeta => + const TaskConstMeta( + debugName: "SavedHardwareState_auto_accessor_get_os_config", + argNames: ["that"], + ); - TaskConstMeta - get kCrateApiApiSavedHardwareStateAutoAccessorSetPushConstMeta => - const TaskConstMeta( - debugName: "SavedHardwareState_auto_accessor_set_push", - argNames: ["that", "push"], - ); - - @override - String crateApiApiViableBottleAutoAccessorGetDeviceName( - {required ViableBottle that}) { - return handler.executeSync(SyncTask( - callFfi: () { - final serializer = SseSerializer(generalizedFrbRustBinding); - sse_encode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerViableBottle( - that, serializer); - return pdeCallFfi(generalizedFrbRustBinding, serializer, funcId: 23)!; - }, - codec: SseCodec( - decodeSuccessData: sse_decode_String, - decodeErrorData: null, - ), - constMeta: kCrateApiApiViableBottleAutoAccessorGetDeviceNameConstMeta, - argValues: [that], - apiImpl: this, - )); + @override + ApsState crateApiApiSavedHardwareStateAutoAccessorGetPush({ + required SavedHardwareState that, + }) { + return handler.executeSync( + SyncTask( + callFfi: () { + final serializer = SseSerializer(generalizedFrbRustBinding); + sse_encode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerSavedHardwareState( + that, + serializer, + ); + return pdeCallFfi(generalizedFrbRustBinding, serializer, funcId: 19)!; + }, + codec: SseCodec( + decodeSuccessData: + sse_decode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerAPSState, + decodeErrorData: null, + ), + constMeta: kCrateApiApiSavedHardwareStateAutoAccessorGetPushConstMeta, + argValues: [that], + apiImpl: this, + ), + ); } TaskConstMeta - get kCrateApiApiViableBottleAutoAccessorGetDeviceNameConstMeta => - const TaskConstMeta( - debugName: "ViableBottle_auto_accessor_get_device_name", - argNames: ["that"], - ); - - @override - EscrowData crateApiApiViableBottleAutoAccessorGetEscrow( - {required ViableBottle that}) { - return handler.executeSync(SyncTask( - callFfi: () { - final serializer = SseSerializer(generalizedFrbRustBinding); - sse_encode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerViableBottle( - that, serializer); - return pdeCallFfi(generalizedFrbRustBinding, serializer, funcId: 24)!; - }, - codec: SseCodec( - decodeSuccessData: - sse_decode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerEscrowData, - decodeErrorData: null, - ), - constMeta: kCrateApiApiViableBottleAutoAccessorGetEscrowConstMeta, - argValues: [that], - apiImpl: this, - )); - } - - TaskConstMeta get kCrateApiApiViableBottleAutoAccessorGetEscrowConstMeta => + get kCrateApiApiSavedHardwareStateAutoAccessorGetPushConstMeta => const TaskConstMeta( - debugName: "ViableBottle_auto_accessor_get_escrow", + debugName: "SavedHardwareState_auto_accessor_get_push", argNames: ["that"], ); @override - String crateApiApiViableBottleAutoAccessorGetModelClass( - {required ViableBottle that}) { - return handler.executeSync(SyncTask( - callFfi: () { - final serializer = SseSerializer(generalizedFrbRustBinding); - sse_encode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerViableBottle( - that, serializer); - return pdeCallFfi(generalizedFrbRustBinding, serializer, funcId: 25)!; - }, - codec: SseCodec( - decodeSuccessData: sse_decode_String, - decodeErrorData: null, - ), - constMeta: kCrateApiApiViableBottleAutoAccessorGetModelClassConstMeta, - argValues: [that], - apiImpl: this, - )); + void crateApiApiSavedHardwareStateAutoAccessorSetIdentity({ + required SavedHardwareState that, + required Uint8List identity, + }) { + return handler.executeSync( + SyncTask( + callFfi: () { + final serializer = SseSerializer(generalizedFrbRustBinding); + sse_encode_Auto_RefMut_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerSavedHardwareState( + that, + serializer, + ); + sse_encode_list_prim_u_8_strict(identity, serializer); + return pdeCallFfi(generalizedFrbRustBinding, serializer, funcId: 20)!; + }, + codec: SseCodec( + decodeSuccessData: sse_decode_unit, + decodeErrorData: null, + ), + constMeta: + kCrateApiApiSavedHardwareStateAutoAccessorSetIdentityConstMeta, + argValues: [that, identity], + apiImpl: this, + ), + ); } TaskConstMeta - get kCrateApiApiViableBottleAutoAccessorGetModelClassConstMeta => - const TaskConstMeta( - debugName: "ViableBottle_auto_accessor_get_model_class", - argNames: ["that"], - ); - - @override - int crateApiApiViableBottleAutoAccessorGetNumericLength( - {required ViableBottle that}) { - return handler.executeSync(SyncTask( - callFfi: () { - final serializer = SseSerializer(generalizedFrbRustBinding); - sse_encode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerViableBottle( - that, serializer); - return pdeCallFfi(generalizedFrbRustBinding, serializer, funcId: 26)!; - }, - codec: SseCodec( - decodeSuccessData: sse_decode_CastedPrimitive_u_64, - decodeErrorData: null, - ), - constMeta: kCrateApiApiViableBottleAutoAccessorGetNumericLengthConstMeta, - argValues: [that], - apiImpl: this, - )); - } + get kCrateApiApiSavedHardwareStateAutoAccessorSetIdentityConstMeta => + const TaskConstMeta( + debugName: "SavedHardwareState_auto_accessor_set_identity", + argNames: ["that", "identity"], + ); - TaskConstMeta - get kCrateApiApiViableBottleAutoAccessorGetNumericLengthConstMeta => - const TaskConstMeta( - debugName: "ViableBottle_auto_accessor_get_numeric_length", - argNames: ["that"], - ); - - @override - void crateApiApiViableBottleAutoAccessorSetDeviceName( - {required ViableBottle that, required String deviceName}) { - return handler.executeSync(SyncTask( - callFfi: () { - final serializer = SseSerializer(generalizedFrbRustBinding); - sse_encode_Auto_RefMut_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerViableBottle( - that, serializer); - sse_encode_String(deviceName, serializer); - return pdeCallFfi(generalizedFrbRustBinding, serializer, funcId: 27)!; - }, - codec: SseCodec( - decodeSuccessData: sse_decode_unit, - decodeErrorData: null, - ), - constMeta: kCrateApiApiViableBottleAutoAccessorSetDeviceNameConstMeta, - argValues: [that, deviceName], - apiImpl: this, - )); + @override + void crateApiApiSavedHardwareStateAutoAccessorSetOsConfig({ + required SavedHardwareState that, + required JoinedOsConfig osConfig, + }) { + return handler.executeSync( + SyncTask( + callFfi: () { + final serializer = SseSerializer(generalizedFrbRustBinding); + sse_encode_Auto_RefMut_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerSavedHardwareState( + that, + serializer, + ); + sse_encode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerJoinedOSConfig( + osConfig, + serializer, + ); + return pdeCallFfi(generalizedFrbRustBinding, serializer, funcId: 21)!; + }, + codec: SseCodec( + decodeSuccessData: sse_decode_unit, + decodeErrorData: null, + ), + constMeta: + kCrateApiApiSavedHardwareStateAutoAccessorSetOsConfigConstMeta, + argValues: [that, osConfig], + apiImpl: this, + ), + ); } TaskConstMeta - get kCrateApiApiViableBottleAutoAccessorSetDeviceNameConstMeta => - const TaskConstMeta( - debugName: "ViableBottle_auto_accessor_set_device_name", - argNames: ["that", "deviceName"], - ); - - @override - void crateApiApiViableBottleAutoAccessorSetEscrow( - {required ViableBottle that, required EscrowData escrow}) { - return handler.executeSync(SyncTask( - callFfi: () { - final serializer = SseSerializer(generalizedFrbRustBinding); - sse_encode_Auto_RefMut_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerViableBottle( - that, serializer); - sse_encode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerEscrowData( - escrow, serializer); - return pdeCallFfi(generalizedFrbRustBinding, serializer, funcId: 28)!; - }, - codec: SseCodec( - decodeSuccessData: sse_decode_unit, - decodeErrorData: null, - ), - constMeta: kCrateApiApiViableBottleAutoAccessorSetEscrowConstMeta, - argValues: [that, escrow], - apiImpl: this, - )); - } - - TaskConstMeta get kCrateApiApiViableBottleAutoAccessorSetEscrowConstMeta => + get kCrateApiApiSavedHardwareStateAutoAccessorSetOsConfigConstMeta => const TaskConstMeta( - debugName: "ViableBottle_auto_accessor_set_escrow", - argNames: ["that", "escrow"], + debugName: "SavedHardwareState_auto_accessor_set_os_config", + argNames: ["that", "osConfig"], ); @override - void crateApiApiViableBottleAutoAccessorSetModelClass( - {required ViableBottle that, required String modelClass}) { - return handler.executeSync(SyncTask( - callFfi: () { - final serializer = SseSerializer(generalizedFrbRustBinding); - sse_encode_Auto_RefMut_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerViableBottle( - that, serializer); - sse_encode_String(modelClass, serializer); - return pdeCallFfi(generalizedFrbRustBinding, serializer, funcId: 29)!; - }, - codec: SseCodec( - decodeSuccessData: sse_decode_unit, - decodeErrorData: null, - ), - constMeta: kCrateApiApiViableBottleAutoAccessorSetModelClassConstMeta, - argValues: [that, modelClass], - apiImpl: this, - )); - } - - TaskConstMeta - get kCrateApiApiViableBottleAutoAccessorSetModelClassConstMeta => - const TaskConstMeta( - debugName: "ViableBottle_auto_accessor_set_model_class", - argNames: ["that", "modelClass"], - ); - - @override - void crateApiApiViableBottleAutoAccessorSetNumericLength( - {required ViableBottle that, required int numericLength}) { - return handler.executeSync(SyncTask( - callFfi: () { - final serializer = SseSerializer(generalizedFrbRustBinding); - sse_encode_Auto_RefMut_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerViableBottle( - that, serializer); - sse_encode_CastedPrimitive_u_64(numericLength, serializer); - return pdeCallFfi(generalizedFrbRustBinding, serializer, funcId: 30)!; - }, - codec: SseCodec( - decodeSuccessData: sse_decode_unit, - decodeErrorData: null, - ), - constMeta: kCrateApiApiViableBottleAutoAccessorSetNumericLengthConstMeta, - argValues: [that, numericLength], - apiImpl: this, - )); + void crateApiApiSavedHardwareStateAutoAccessorSetPush({ + required SavedHardwareState that, + required ApsState push, + }) { + return handler.executeSync( + SyncTask( + callFfi: () { + final serializer = SseSerializer(generalizedFrbRustBinding); + sse_encode_Auto_RefMut_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerSavedHardwareState( + that, + serializer, + ); + sse_encode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerAPSState( + push, + serializer, + ); + return pdeCallFfi(generalizedFrbRustBinding, serializer, funcId: 22)!; + }, + codec: SseCodec( + decodeSuccessData: sse_decode_unit, + decodeErrorData: null, + ), + constMeta: kCrateApiApiSavedHardwareStateAutoAccessorSetPushConstMeta, + argValues: [that, push], + apiImpl: this, + ), + ); } TaskConstMeta - get kCrateApiApiViableBottleAutoAccessorSetNumericLengthConstMeta => - const TaskConstMeta( - debugName: "ViableBottle_auto_accessor_set_numeric_length", - argNames: ["that", "numericLength"], - ); - - @override - Future crateApiApiAcceptBeaconShare( - {required ArcFindMyClientDefaultAnisetteProvider items, - required String share}) { - return handler.executeNormal(NormalTask( - callFfi: (port_) { - final serializer = SseSerializer(generalizedFrbRustBinding); - sse_encode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcFindMyClientDefaultAnisetteProvider( - items, serializer); - sse_encode_String(share, serializer); - pdeCallFfi(generalizedFrbRustBinding, serializer, - funcId: 31, port: port_); - }, - codec: SseCodec( - decodeSuccessData: sse_decode_unit, - decodeErrorData: sse_decode_AnyhowException, - ), - constMeta: kCrateApiApiAcceptBeaconShareConstMeta, - argValues: [items, share], - apiImpl: this, - )); - } - - TaskConstMeta get kCrateApiApiAcceptBeaconShareConstMeta => + get kCrateApiApiSavedHardwareStateAutoAccessorSetPushConstMeta => const TaskConstMeta( - debugName: "accept_beacon_share", - argNames: ["items", "share"], + debugName: "SavedHardwareState_auto_accessor_set_push", + argNames: ["that", "push"], ); @override - Future crateApiApiAcceptInvite( - {required ArcPasswordManagerDefaultAnisetteProvider passwords, - required String inviteId}) { - return handler.executeNormal(NormalTask( - callFfi: (port_) { - final serializer = SseSerializer(generalizedFrbRustBinding); - sse_encode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcPasswordManagerDefaultAnisetteProvider( - passwords, serializer); - sse_encode_String(inviteId, serializer); - pdeCallFfi(generalizedFrbRustBinding, serializer, - funcId: 32, port: port_); - }, - codec: SseCodec( - decodeSuccessData: sse_decode_unit, - decodeErrorData: sse_decode_AnyhowException, - ), - constMeta: kCrateApiApiAcceptInviteConstMeta, - argValues: [passwords, inviteId], - apiImpl: this, - )); + String crateApiApiViableBottleAutoAccessorGetDeviceName({ + required ViableBottle that, + }) { + return handler.executeSync( + SyncTask( + callFfi: () { + final serializer = SseSerializer(generalizedFrbRustBinding); + sse_encode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerViableBottle( + that, + serializer, + ); + return pdeCallFfi(generalizedFrbRustBinding, serializer, funcId: 23)!; + }, + codec: SseCodec( + decodeSuccessData: sse_decode_String, + decodeErrorData: null, + ), + constMeta: kCrateApiApiViableBottleAutoAccessorGetDeviceNameConstMeta, + argValues: [that], + apiImpl: this, + ), + ); } - TaskConstMeta get kCrateApiApiAcceptInviteConstMeta => const TaskConstMeta( - debugName: "accept_invite", - argNames: ["passwords", "inviteId"], + TaskConstMeta + get kCrateApiApiViableBottleAutoAccessorGetDeviceNameConstMeta => + const TaskConstMeta( + debugName: "ViableBottle_auto_accessor_get_device_name", + argNames: ["that"], ); @override - Future> crateApiApiAddAlbum( - {required SyncManagerDefaultAnisetteProviderMyFilePackager lock, - required String guid, - required String folder}) { - return handler.executeNormal(NormalTask( - callFfi: (port_) { - final serializer = SseSerializer(generalizedFrbRustBinding); - sse_encode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerSyncManagerDefaultAnisetteProviderMyFilePackager( - lock, serializer); - sse_encode_String(guid, serializer); - sse_encode_String(folder, serializer); - pdeCallFfi(generalizedFrbRustBinding, serializer, - funcId: 33, port: port_); - }, - codec: SseCodec( - decodeSuccessData: sse_decode_list_shared_album, - decodeErrorData: sse_decode_AnyhowException, - ), - constMeta: kCrateApiApiAddAlbumConstMeta, - argValues: [lock, guid, folder], - apiImpl: this, - )); + EscrowData crateApiApiViableBottleAutoAccessorGetEscrow({ + required ViableBottle that, + }) { + return handler.executeSync( + SyncTask( + callFfi: () { + final serializer = SseSerializer(generalizedFrbRustBinding); + sse_encode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerViableBottle( + that, + serializer, + ); + return pdeCallFfi(generalizedFrbRustBinding, serializer, funcId: 24)!; + }, + codec: SseCodec( + decodeSuccessData: + sse_decode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerEscrowData, + decodeErrorData: null, + ), + constMeta: kCrateApiApiViableBottleAutoAccessorGetEscrowConstMeta, + argValues: [that], + apiImpl: this, + ), + ); } - TaskConstMeta get kCrateApiApiAddAlbumConstMeta => const TaskConstMeta( - debugName: "add_album", - argNames: ["lock", "guid", "folder"], + TaskConstMeta get kCrateApiApiViableBottleAutoAccessorGetEscrowConstMeta => + const TaskConstMeta( + debugName: "ViableBottle_auto_accessor_get_escrow", + argNames: ["that"], ); @override - Future crateApiApiAnswerFtRequest( - {required ArcFtClient facetime, - required LetMeInRequest request, - String? approvedGroup}) { - return handler.executeNormal(NormalTask( - callFfi: (port_) { - final serializer = SseSerializer(generalizedFrbRustBinding); - sse_encode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcFTClient( - facetime, serializer); - sse_encode_box_autoadd_let_me_in_request(request, serializer); - sse_encode_opt_String(approvedGroup, serializer); - pdeCallFfi(generalizedFrbRustBinding, serializer, - funcId: 34, port: port_); - }, - codec: SseCodec( - decodeSuccessData: sse_decode_unit, - decodeErrorData: sse_decode_AnyhowException, - ), - constMeta: kCrateApiApiAnswerFtRequestConstMeta, - argValues: [facetime, request, approvedGroup], - apiImpl: this, - )); + String crateApiApiViableBottleAutoAccessorGetModelClass({ + required ViableBottle that, + }) { + return handler.executeSync( + SyncTask( + callFfi: () { + final serializer = SseSerializer(generalizedFrbRustBinding); + sse_encode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerViableBottle( + that, + serializer, + ); + return pdeCallFfi(generalizedFrbRustBinding, serializer, funcId: 25)!; + }, + codec: SseCodec( + decodeSuccessData: sse_decode_String, + decodeErrorData: null, + ), + constMeta: kCrateApiApiViableBottleAutoAccessorGetModelClassConstMeta, + argValues: [that], + apiImpl: this, + ), + ); } - TaskConstMeta get kCrateApiApiAnswerFtRequestConstMeta => const TaskConstMeta( - debugName: "answer_ft_request", - argNames: ["facetime", "request", "approvedGroup"], + TaskConstMeta + get kCrateApiApiViableBottleAutoAccessorGetModelClassConstMeta => + const TaskConstMeta( + debugName: "ViableBottle_auto_accessor_get_model_class", + argNames: ["that"], ); @override - Future crateApiApiApproveCircle( - {required ArcMutexVecActiveCircleSession state, - required ArcMutexAppleAccountDefaultAnisetteProvider account, - required String txnid}) { - return handler.executeNormal(NormalTask( - callFfi: (port_) { - final serializer = SseSerializer(generalizedFrbRustBinding); - sse_encode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcMutexVecActiveCircleSession( - state, serializer); - sse_encode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcMutexAppleAccountDefaultAnisetteProvider( - account, serializer); - sse_encode_String(txnid, serializer); - pdeCallFfi(generalizedFrbRustBinding, serializer, - funcId: 35, port: port_); - }, - codec: SseCodec( - decodeSuccessData: sse_decode_u_32, - decodeErrorData: sse_decode_AnyhowException, - ), - constMeta: kCrateApiApiApproveCircleConstMeta, - argValues: [state, account, txnid], - apiImpl: this, - )); + int crateApiApiViableBottleAutoAccessorGetNumericLength({ + required ViableBottle that, + }) { + return handler.executeSync( + SyncTask( + callFfi: () { + final serializer = SseSerializer(generalizedFrbRustBinding); + sse_encode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerViableBottle( + that, + serializer, + ); + return pdeCallFfi(generalizedFrbRustBinding, serializer, funcId: 26)!; + }, + codec: SseCodec( + decodeSuccessData: sse_decode_CastedPrimitive_u_64, + decodeErrorData: null, + ), + constMeta: + kCrateApiApiViableBottleAutoAccessorGetNumericLengthConstMeta, + argValues: [that], + apiImpl: this, + ), + ); } - TaskConstMeta get kCrateApiApiApproveCircleConstMeta => const TaskConstMeta( - debugName: "approve_circle", - argNames: ["state", "account", "txnid"], + TaskConstMeta + get kCrateApiApiViableBottleAutoAccessorGetNumericLengthConstMeta => + const TaskConstMeta( + debugName: "ViableBottle_auto_accessor_get_numeric_length", + argNames: ["that"], ); @override - Future crateApiApiAttachmentGetSize({required Attachment that}) { - return handler.executeNormal(NormalTask( - callFfi: (port_) { - final serializer = SseSerializer(generalizedFrbRustBinding); - sse_encode_box_autoadd_attachment(that, serializer); - pdeCallFfi(generalizedFrbRustBinding, serializer, - funcId: 36, port: port_); - }, - codec: SseCodec( - decodeSuccessData: sse_decode_CastedPrimitive_usize, - decodeErrorData: null, - ), - constMeta: kCrateApiApiAttachmentGetSizeConstMeta, - argValues: [that], - apiImpl: this, - )); + void crateApiApiViableBottleAutoAccessorSetDeviceName({ + required ViableBottle that, + required String deviceName, + }) { + return handler.executeSync( + SyncTask( + callFfi: () { + final serializer = SseSerializer(generalizedFrbRustBinding); + sse_encode_Auto_RefMut_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerViableBottle( + that, + serializer, + ); + sse_encode_String(deviceName, serializer); + return pdeCallFfi(generalizedFrbRustBinding, serializer, funcId: 27)!; + }, + codec: SseCodec( + decodeSuccessData: sse_decode_unit, + decodeErrorData: null, + ), + constMeta: kCrateApiApiViableBottleAutoAccessorSetDeviceNameConstMeta, + argValues: [that, deviceName], + apiImpl: this, + ), + ); } - TaskConstMeta get kCrateApiApiAttachmentGetSizeConstMeta => + TaskConstMeta + get kCrateApiApiViableBottleAutoAccessorSetDeviceNameConstMeta => const TaskConstMeta( - debugName: "attachment_get_size", - argNames: ["that"], + debugName: "ViableBottle_auto_accessor_set_device_name", + argNames: ["that", "deviceName"], ); @override - MMCSAttachmentMeta? crateApiApiAttachmentToCloud({required Attachment att}) { - return handler.executeSync(SyncTask( - callFfi: () { - final serializer = SseSerializer(generalizedFrbRustBinding); - sse_encode_box_autoadd_attachment(att, serializer); - return pdeCallFfi(generalizedFrbRustBinding, serializer, funcId: 37)!; - }, - codec: SseCodec( - decodeSuccessData: sse_decode_opt_box_autoadd_mmcs_attachment_meta, - decodeErrorData: null, - ), - constMeta: kCrateApiApiAttachmentToCloudConstMeta, - argValues: [att], - apiImpl: this, - )); + void crateApiApiViableBottleAutoAccessorSetEscrow({ + required ViableBottle that, + required EscrowData escrow, + }) { + return handler.executeSync( + SyncTask( + callFfi: () { + final serializer = SseSerializer(generalizedFrbRustBinding); + sse_encode_Auto_RefMut_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerViableBottle( + that, + serializer, + ); + sse_encode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerEscrowData( + escrow, + serializer, + ); + return pdeCallFfi(generalizedFrbRustBinding, serializer, funcId: 28)!; + }, + codec: SseCodec( + decodeSuccessData: sse_decode_unit, + decodeErrorData: null, + ), + constMeta: kCrateApiApiViableBottleAutoAccessorSetEscrowConstMeta, + argValues: [that, escrow], + apiImpl: this, + ), + ); } - TaskConstMeta get kCrateApiApiAttachmentToCloudConstMeta => + TaskConstMeta get kCrateApiApiViableBottleAutoAccessorSetEscrowConstMeta => const TaskConstMeta( - debugName: "attachment_to_cloud", - argNames: ["att"], + debugName: "ViableBottle_auto_accessor_set_escrow", + argNames: ["that", "escrow"], ); @override - Future crateApiApiAuthPhone( - {required ApsConnection conn, - required JoinedOsConfig config, - required String number, - required List sig}) { - return handler.executeNormal(NormalTask( - callFfi: (port_) { - final serializer = SseSerializer(generalizedFrbRustBinding); - sse_encode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerAPSConnection( - conn, serializer); - sse_encode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerJoinedOSConfig( - config, serializer); - sse_encode_String(number, serializer); - sse_encode_list_prim_u_8_loose(sig, serializer); - pdeCallFfi(generalizedFrbRustBinding, serializer, - funcId: 38, port: port_); - }, - codec: SseCodec( - decodeSuccessData: - sse_decode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerIDSUser, - decodeErrorData: sse_decode_AnyhowException, - ), - constMeta: kCrateApiApiAuthPhoneConstMeta, - argValues: [conn, config, number, sig], - apiImpl: this, - )); + void crateApiApiViableBottleAutoAccessorSetModelClass({ + required ViableBottle that, + required String modelClass, + }) { + return handler.executeSync( + SyncTask( + callFfi: () { + final serializer = SseSerializer(generalizedFrbRustBinding); + sse_encode_Auto_RefMut_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerViableBottle( + that, + serializer, + ); + sse_encode_String(modelClass, serializer); + return pdeCallFfi(generalizedFrbRustBinding, serializer, funcId: 29)!; + }, + codec: SseCodec( + decodeSuccessData: sse_decode_unit, + decodeErrorData: null, + ), + constMeta: kCrateApiApiViableBottleAutoAccessorSetModelClassConstMeta, + argValues: [that, modelClass], + apiImpl: this, + ), + ); } - TaskConstMeta get kCrateApiApiAuthPhoneConstMeta => const TaskConstMeta( - debugName: "auth_phone", - argNames: ["conn", "config", "number", "sig"], + TaskConstMeta + get kCrateApiApiViableBottleAutoAccessorSetModelClassConstMeta => + const TaskConstMeta( + debugName: "ViableBottle_auto_accessor_set_model_class", + argNames: ["that", "modelClass"], ); @override - (Sender, ArcSenderPushMessage, ApsWatcher) crateApiApiBuildWatcher( - {required ApsConnection conn, required ArcImClient client}) { - return handler.executeSync(SyncTask( - callFfi: () { - final serializer = SseSerializer(generalizedFrbRustBinding); - sse_encode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerAPSConnection( - conn, serializer); - sse_encode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcIMClient( - client, serializer); - return pdeCallFfi(generalizedFrbRustBinding, serializer, funcId: 39)!; - }, - codec: SseCodec( - decodeSuccessData: - sse_decode_record_auto_owned_rust_opaque_flutter_rust_bridgefor_generated_rust_auto_opaque_inner_sender_auto_owned_rust_opaque_flutter_rust_bridgefor_generated_rust_auto_opaque_inner_arc_sender_push_message_auto_owned_rust_opaque_flutter_rust_bridgefor_generated_rust_auto_opaque_inner_aps_watcher, - decodeErrorData: null, - ), - constMeta: kCrateApiApiBuildWatcherConstMeta, - argValues: [conn, client], - apiImpl: this, - )); + void crateApiApiViableBottleAutoAccessorSetNumericLength({ + required ViableBottle that, + required int numericLength, + }) { + return handler.executeSync( + SyncTask( + callFfi: () { + final serializer = SseSerializer(generalizedFrbRustBinding); + sse_encode_Auto_RefMut_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerViableBottle( + that, + serializer, + ); + sse_encode_CastedPrimitive_u_64(numericLength, serializer); + return pdeCallFfi(generalizedFrbRustBinding, serializer, funcId: 30)!; + }, + codec: SseCodec( + decodeSuccessData: sse_decode_unit, + decodeErrorData: null, + ), + constMeta: + kCrateApiApiViableBottleAutoAccessorSetNumericLengthConstMeta, + argValues: [that, numericLength], + apiImpl: this, + ), + ); } - TaskConstMeta get kCrateApiApiBuildWatcherConstMeta => const TaskConstMeta( - debugName: "build_watcher", - argNames: ["conn", "client"], + TaskConstMeta + get kCrateApiApiViableBottleAutoAccessorSetNumericLengthConstMeta => + const TaskConstMeta( + debugName: "ViableBottle_auto_accessor_set_numeric_length", + argNames: ["that", "numericLength"], ); @override - Future crateApiApiCancelFacetime( - {required ArcFtClient facetime, required String guid}) { - return handler.executeNormal(NormalTask( - callFfi: (port_) { - final serializer = SseSerializer(generalizedFrbRustBinding); - sse_encode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcFTClient( - facetime, serializer); - sse_encode_String(guid, serializer); - pdeCallFfi(generalizedFrbRustBinding, serializer, - funcId: 40, port: port_); - }, - codec: SseCodec( - decodeSuccessData: sse_decode_unit, - decodeErrorData: sse_decode_AnyhowException, - ), - constMeta: kCrateApiApiCancelFacetimeConstMeta, - argValues: [facetime, guid], - apiImpl: this, - )); + Future crateApiApiAcceptBeaconShare({ + required ArcFindMyClientDefaultAnisetteProvider items, + required String share, + }) { + return handler.executeNormal( + NormalTask( + callFfi: (port_) { + final serializer = SseSerializer(generalizedFrbRustBinding); + sse_encode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcFindMyClientDefaultAnisetteProvider( + items, + serializer, + ); + sse_encode_String(share, serializer); + pdeCallFfi( + generalizedFrbRustBinding, + serializer, + funcId: 31, + port: port_, + ); + }, + codec: SseCodec( + decodeSuccessData: sse_decode_unit, + decodeErrorData: sse_decode_AnyhowException, + ), + constMeta: kCrateApiApiAcceptBeaconShareConstMeta, + argValues: [items, share], + apiImpl: this, + ), + ); } - TaskConstMeta get kCrateApiApiCancelFacetimeConstMeta => const TaskConstMeta( - debugName: "cancel_facetime", - argNames: ["facetime", "guid"], + TaskConstMeta get kCrateApiApiAcceptBeaconShareConstMeta => + const TaskConstMeta( + debugName: "accept_beacon_share", + argNames: ["items", "share"], ); + @override + Future crateApiApiAcceptInvite({ + required ArcPasswordManagerDefaultAnisetteProvider passwords, + required String inviteId, + }) { + return handler.executeNormal( + NormalTask( + callFfi: (port_) { + final serializer = SseSerializer(generalizedFrbRustBinding); + sse_encode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcPasswordManagerDefaultAnisetteProvider( + passwords, + serializer, + ); + sse_encode_String(inviteId, serializer); + pdeCallFfi( + generalizedFrbRustBinding, + serializer, + funcId: 32, + port: port_, + ); + }, + codec: SseCodec( + decodeSuccessData: sse_decode_unit, + decodeErrorData: sse_decode_AnyhowException, + ), + constMeta: kCrateApiApiAcceptInviteConstMeta, + argValues: [passwords, inviteId], + apiImpl: this, + ), + ); + } + + TaskConstMeta get kCrateApiApiAcceptInviteConstMeta => const TaskConstMeta( + debugName: "accept_invite", + argNames: ["passwords", "inviteId"], + ); + + @override + Future> crateApiApiAddAlbum({ + required SyncManagerDefaultAnisetteProviderMyFilePackager lock, + required String guid, + required String folder, + }) { + return handler.executeNormal( + NormalTask( + callFfi: (port_) { + final serializer = SseSerializer(generalizedFrbRustBinding); + sse_encode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerSyncManagerDefaultAnisetteProviderMyFilePackager( + lock, + serializer, + ); + sse_encode_String(guid, serializer); + sse_encode_String(folder, serializer); + pdeCallFfi( + generalizedFrbRustBinding, + serializer, + funcId: 33, + port: port_, + ); + }, + codec: SseCodec( + decodeSuccessData: sse_decode_list_shared_album, + decodeErrorData: sse_decode_AnyhowException, + ), + constMeta: kCrateApiApiAddAlbumConstMeta, + argValues: [lock, guid, folder], + apiImpl: this, + ), + ); + } + + TaskConstMeta get kCrateApiApiAddAlbumConstMeta => const TaskConstMeta( + debugName: "add_album", + argNames: ["lock", "guid", "folder"], + ); + + @override + Future crateApiApiAnswerFtRequest({ + required ArcFtClient facetime, + required LetMeInRequest request, + String? approvedGroup, + }) { + return handler.executeNormal( + NormalTask( + callFfi: (port_) { + final serializer = SseSerializer(generalizedFrbRustBinding); + sse_encode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcFTClient( + facetime, + serializer, + ); + sse_encode_box_autoadd_let_me_in_request(request, serializer); + sse_encode_opt_String(approvedGroup, serializer); + pdeCallFfi( + generalizedFrbRustBinding, + serializer, + funcId: 34, + port: port_, + ); + }, + codec: SseCodec( + decodeSuccessData: sse_decode_unit, + decodeErrorData: sse_decode_AnyhowException, + ), + constMeta: kCrateApiApiAnswerFtRequestConstMeta, + argValues: [facetime, request, approvedGroup], + apiImpl: this, + ), + ); + } + + TaskConstMeta get kCrateApiApiAnswerFtRequestConstMeta => const TaskConstMeta( + debugName: "answer_ft_request", + argNames: ["facetime", "request", "approvedGroup"], + ); + + @override + Future crateApiApiApproveCircle({ + required ArcMutexVecActiveCircleSession state, + required ArcMutexAppleAccountDefaultAnisetteProvider account, + required String txnid, + }) { + return handler.executeNormal( + NormalTask( + callFfi: (port_) { + final serializer = SseSerializer(generalizedFrbRustBinding); + sse_encode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcMutexVecActiveCircleSession( + state, + serializer, + ); + sse_encode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcMutexAppleAccountDefaultAnisetteProvider( + account, + serializer, + ); + sse_encode_String(txnid, serializer); + pdeCallFfi( + generalizedFrbRustBinding, + serializer, + funcId: 35, + port: port_, + ); + }, + codec: SseCodec( + decodeSuccessData: sse_decode_u_32, + decodeErrorData: sse_decode_AnyhowException, + ), + constMeta: kCrateApiApiApproveCircleConstMeta, + argValues: [state, account, txnid], + apiImpl: this, + ), + ); + } + + TaskConstMeta get kCrateApiApiApproveCircleConstMeta => const TaskConstMeta( + debugName: "approve_circle", + argNames: ["state", "account", "txnid"], + ); + + @override + Future crateApiApiAttachmentGetSize({required Attachment that}) { + return handler.executeNormal( + NormalTask( + callFfi: (port_) { + final serializer = SseSerializer(generalizedFrbRustBinding); + sse_encode_box_autoadd_attachment(that, serializer); + pdeCallFfi( + generalizedFrbRustBinding, + serializer, + funcId: 36, + port: port_, + ); + }, + codec: SseCodec( + decodeSuccessData: sse_decode_CastedPrimitive_usize, + decodeErrorData: null, + ), + constMeta: kCrateApiApiAttachmentGetSizeConstMeta, + argValues: [that], + apiImpl: this, + ), + ); + } + + TaskConstMeta get kCrateApiApiAttachmentGetSizeConstMeta => + const TaskConstMeta(debugName: "attachment_get_size", argNames: ["that"]); + + @override + MMCSAttachmentMeta? crateApiApiAttachmentToCloud({required Attachment att}) { + return handler.executeSync( + SyncTask( + callFfi: () { + final serializer = SseSerializer(generalizedFrbRustBinding); + sse_encode_box_autoadd_attachment(att, serializer); + return pdeCallFfi(generalizedFrbRustBinding, serializer, funcId: 37)!; + }, + codec: SseCodec( + decodeSuccessData: sse_decode_opt_box_autoadd_mmcs_attachment_meta, + decodeErrorData: null, + ), + constMeta: kCrateApiApiAttachmentToCloudConstMeta, + argValues: [att], + apiImpl: this, + ), + ); + } + + TaskConstMeta get kCrateApiApiAttachmentToCloudConstMeta => + const TaskConstMeta(debugName: "attachment_to_cloud", argNames: ["att"]); + + @override + Future crateApiApiAuthPhone({ + required ApsConnection conn, + required JoinedOsConfig config, + required String number, + required List sig, + }) { + return handler.executeNormal( + NormalTask( + callFfi: (port_) { + final serializer = SseSerializer(generalizedFrbRustBinding); + sse_encode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerAPSConnection( + conn, + serializer, + ); + sse_encode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerJoinedOSConfig( + config, + serializer, + ); + sse_encode_String(number, serializer); + sse_encode_list_prim_u_8_loose(sig, serializer); + pdeCallFfi( + generalizedFrbRustBinding, + serializer, + funcId: 38, + port: port_, + ); + }, + codec: SseCodec( + decodeSuccessData: + sse_decode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerIDSUser, + decodeErrorData: sse_decode_AnyhowException, + ), + constMeta: kCrateApiApiAuthPhoneConstMeta, + argValues: [conn, config, number, sig], + apiImpl: this, + ), + ); + } + + TaskConstMeta get kCrateApiApiAuthPhoneConstMeta => const TaskConstMeta( + debugName: "auth_phone", + argNames: ["conn", "config", "number", "sig"], + ); + + @override + (Sender, ArcSenderPushMessage, ApsWatcher) crateApiApiBuildWatcher({ + required ApsConnection conn, + required ArcImClient client, + }) { + return handler.executeSync( + SyncTask( + callFfi: () { + final serializer = SseSerializer(generalizedFrbRustBinding); + sse_encode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerAPSConnection( + conn, + serializer, + ); + sse_encode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcIMClient( + client, + serializer, + ); + return pdeCallFfi(generalizedFrbRustBinding, serializer, funcId: 39)!; + }, + codec: SseCodec( + decodeSuccessData: + sse_decode_record_auto_owned_rust_opaque_flutter_rust_bridgefor_generated_rust_auto_opaque_inner_sender_auto_owned_rust_opaque_flutter_rust_bridgefor_generated_rust_auto_opaque_inner_arc_sender_push_message_auto_owned_rust_opaque_flutter_rust_bridgefor_generated_rust_auto_opaque_inner_aps_watcher, + decodeErrorData: null, + ), + constMeta: kCrateApiApiBuildWatcherConstMeta, + argValues: [conn, client], + apiImpl: this, + ), + ); + } + + TaskConstMeta get kCrateApiApiBuildWatcherConstMeta => const TaskConstMeta( + debugName: "build_watcher", + argNames: ["conn", "client"], + ); + + @override + Future crateApiApiCancelFacetime({ + required ArcFtClient facetime, + required String guid, + }) { + return handler.executeNormal( + NormalTask( + callFfi: (port_) { + final serializer = SseSerializer(generalizedFrbRustBinding); + sse_encode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcFTClient( + facetime, + serializer, + ); + sse_encode_String(guid, serializer); + pdeCallFfi( + generalizedFrbRustBinding, + serializer, + funcId: 40, + port: port_, + ); + }, + codec: SseCodec( + decodeSuccessData: sse_decode_unit, + decodeErrorData: sse_decode_AnyhowException, + ), + constMeta: kCrateApiApiCancelFacetimeConstMeta, + argValues: [facetime, guid], + apiImpl: this, + ), + ); + } + + TaskConstMeta get kCrateApiApiCancelFacetimeConstMeta => const TaskConstMeta( + debugName: "cancel_facetime", + argNames: ["facetime", "guid"], + ); + @override void crateApiApiCancelPoll({required Sender cancel}) { - return handler.executeSync(SyncTask( - callFfi: () { - final serializer = SseSerializer(generalizedFrbRustBinding); - sse_encode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerSender( - cancel, serializer); - return pdeCallFfi(generalizedFrbRustBinding, serializer, funcId: 41)!; - }, - codec: SseCodec( - decodeSuccessData: sse_decode_unit, - decodeErrorData: null, - ), - constMeta: kCrateApiApiCancelPollConstMeta, - argValues: [cancel], - apiImpl: this, - )); + return handler.executeSync( + SyncTask( + callFfi: () { + final serializer = SseSerializer(generalizedFrbRustBinding); + sse_encode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerSender( + cancel, + serializer, + ); + return pdeCallFfi(generalizedFrbRustBinding, serializer, funcId: 41)!; + }, + codec: SseCodec( + decodeSuccessData: sse_decode_unit, + decodeErrorData: null, + ), + constMeta: kCrateApiApiCancelPollConstMeta, + argValues: [cancel], + apiImpl: this, + ), + ); } - TaskConstMeta get kCrateApiApiCancelPollConstMeta => const TaskConstMeta( - debugName: "cancel_poll", - argNames: ["cancel"], - ); + TaskConstMeta get kCrateApiApiCancelPollConstMeta => + const TaskConstMeta(debugName: "cancel_poll", argNames: ["cancel"]); @override - Future crateApiApiCertifyDelivery( - {required ArcImClient state, - required CertifiedContext context, - required bool notify}) { - return handler.executeNormal(NormalTask( - callFfi: (port_) { - final serializer = SseSerializer(generalizedFrbRustBinding); - sse_encode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcIMClient( - state, serializer); - sse_encode_box_autoadd_certified_context(context, serializer); - sse_encode_bool(notify, serializer); - pdeCallFfi(generalizedFrbRustBinding, serializer, - funcId: 42, port: port_); - }, - codec: SseCodec( - decodeSuccessData: sse_decode_unit, - decodeErrorData: sse_decode_AnyhowException, - ), - constMeta: kCrateApiApiCertifyDeliveryConstMeta, - argValues: [state, context, notify], - apiImpl: this, - )); + Future crateApiApiCertifyDelivery({ + required ArcImClient state, + required CertifiedContext context, + required bool notify, + }) { + return handler.executeNormal( + NormalTask( + callFfi: (port_) { + final serializer = SseSerializer(generalizedFrbRustBinding); + sse_encode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcIMClient( + state, + serializer, + ); + sse_encode_box_autoadd_certified_context(context, serializer); + sse_encode_bool(notify, serializer); + pdeCallFfi( + generalizedFrbRustBinding, + serializer, + funcId: 42, + port: port_, + ); + }, + codec: SseCodec( + decodeSuccessData: sse_decode_unit, + decodeErrorData: sse_decode_AnyhowException, + ), + constMeta: kCrateApiApiCertifyDeliveryConstMeta, + argValues: [state, context, notify], + apiImpl: this, + ), + ); } TaskConstMeta get kCrateApiApiCertifyDeliveryConstMeta => const TaskConstMeta( - debugName: "certify_delivery", - argNames: ["state", "context", "notify"], - ); + debugName: "certify_delivery", + argNames: ["state", "context", "notify"], + ); @override - Future crateApiApiChangeEscrowPassword( - {required ArcKeychainClientDefaultAnisetteProvider keychain, - required String devicePassword}) { - return handler.executeNormal(NormalTask( - callFfi: (port_) { - final serializer = SseSerializer(generalizedFrbRustBinding); - sse_encode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcKeychainClientDefaultAnisetteProvider( - keychain, serializer); - sse_encode_String(devicePassword, serializer); - pdeCallFfi(generalizedFrbRustBinding, serializer, - funcId: 43, port: port_); - }, - codec: SseCodec( - decodeSuccessData: sse_decode_unit, - decodeErrorData: sse_decode_AnyhowException, - ), - constMeta: kCrateApiApiChangeEscrowPasswordConstMeta, - argValues: [keychain, devicePassword], - apiImpl: this, - )); + Future crateApiApiChangeEscrowPassword({ + required ArcKeychainClientDefaultAnisetteProvider keychain, + required String devicePassword, + }) { + return handler.executeNormal( + NormalTask( + callFfi: (port_) { + final serializer = SseSerializer(generalizedFrbRustBinding); + sse_encode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcKeychainClientDefaultAnisetteProvider( + keychain, + serializer, + ); + sse_encode_String(devicePassword, serializer); + pdeCallFfi( + generalizedFrbRustBinding, + serializer, + funcId: 43, + port: port_, + ); + }, + codec: SseCodec( + decodeSuccessData: sse_decode_unit, + decodeErrorData: sse_decode_AnyhowException, + ), + constMeta: kCrateApiApiChangeEscrowPasswordConstMeta, + argValues: [keychain, devicePassword], + apiImpl: this, + ), + ); } TaskConstMeta get kCrateApiApiChangeEscrowPasswordConstMeta => @@ -2673,29 +3324,40 @@ class RustLibApiImpl extends RustLibApiImplPlatform implements RustLibApi { ); @override - Future crateApiApiCircleSetupClique( - {required ArcMutexOptionCircleClientSessionDefaultAnisetteProvider client, - required ArcKeychainClientDefaultAnisetteProvider keychain, - required String devicePassword}) { - return handler.executeNormal(NormalTask( - callFfi: (port_) { - final serializer = SseSerializer(generalizedFrbRustBinding); - sse_encode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcMutexOptionCircleClientSessionDefaultAnisetteProvider( - client, serializer); - sse_encode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcKeychainClientDefaultAnisetteProvider( - keychain, serializer); - sse_encode_String(devicePassword, serializer); - pdeCallFfi(generalizedFrbRustBinding, serializer, - funcId: 44, port: port_); - }, - codec: SseCodec( - decodeSuccessData: sse_decode_bool, - decodeErrorData: sse_decode_AnyhowException, - ), - constMeta: kCrateApiApiCircleSetupCliqueConstMeta, - argValues: [client, keychain, devicePassword], - apiImpl: this, - )); + Future crateApiApiCircleSetupClique({ + required ArcMutexOptionCircleClientSessionDefaultAnisetteProvider client, + required ArcKeychainClientDefaultAnisetteProvider keychain, + required String devicePassword, + }) { + return handler.executeNormal( + NormalTask( + callFfi: (port_) { + final serializer = SseSerializer(generalizedFrbRustBinding); + sse_encode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcMutexOptionCircleClientSessionDefaultAnisetteProvider( + client, + serializer, + ); + sse_encode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcKeychainClientDefaultAnisetteProvider( + keychain, + serializer, + ); + sse_encode_String(devicePassword, serializer); + pdeCallFfi( + generalizedFrbRustBinding, + serializer, + funcId: 44, + port: port_, + ); + }, + codec: SseCodec( + decodeSuccessData: sse_decode_bool, + decodeErrorData: sse_decode_AnyhowException, + ), + constMeta: kCrateApiApiCircleSetupCliqueConstMeta, + argValues: [client, keychain, devicePassword], + apiImpl: this, + ), + ); } TaskConstMeta get kCrateApiApiCircleSetupCliqueConstMeta => @@ -2706,71 +3368,86 @@ class RustLibApiImpl extends RustLibApiImplPlatform implements RustLibApi { @override Future crateApiApiClearLinks({required ArcFtClient facetime}) { - return handler.executeNormal(NormalTask( - callFfi: (port_) { - final serializer = SseSerializer(generalizedFrbRustBinding); - sse_encode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcFTClient( - facetime, serializer); - pdeCallFfi(generalizedFrbRustBinding, serializer, - funcId: 45, port: port_); - }, - codec: SseCodec( - decodeSuccessData: sse_decode_unit, - decodeErrorData: sse_decode_AnyhowException, - ), - constMeta: kCrateApiApiClearLinksConstMeta, - argValues: [facetime], - apiImpl: this, - )); + return handler.executeNormal( + NormalTask( + callFfi: (port_) { + final serializer = SseSerializer(generalizedFrbRustBinding); + sse_encode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcFTClient( + facetime, + serializer, + ); + pdeCallFfi( + generalizedFrbRustBinding, + serializer, + funcId: 45, + port: port_, + ); + }, + codec: SseCodec( + decodeSuccessData: sse_decode_unit, + decodeErrorData: sse_decode_AnyhowException, + ), + constMeta: kCrateApiApiClearLinksConstMeta, + argValues: [facetime], + apiImpl: this, + ), + ); } - TaskConstMeta get kCrateApiApiClearLinksConstMeta => const TaskConstMeta( - debugName: "clear_links", - argNames: ["facetime"], - ); + TaskConstMeta get kCrateApiApiClearLinksConstMeta => + const TaskConstMeta(debugName: "clear_links", argNames: ["facetime"]); @override - SimplifiedIncomingCallPoster crateApiApiClonePoster( - {required SimplifiedIncomingCallPoster poster}) { - return handler.executeSync(SyncTask( - callFfi: () { - final serializer = SseSerializer(generalizedFrbRustBinding); - sse_encode_box_autoadd_simplified_incoming_call_poster( - poster, serializer); - return pdeCallFfi(generalizedFrbRustBinding, serializer, funcId: 46)!; - }, - codec: SseCodec( - decodeSuccessData: sse_decode_simplified_incoming_call_poster, - decodeErrorData: sse_decode_AnyhowException, - ), - constMeta: kCrateApiApiClonePosterConstMeta, - argValues: [poster], - apiImpl: this, - )); + SimplifiedIncomingCallPoster crateApiApiClonePoster({ + required SimplifiedIncomingCallPoster poster, + }) { + return handler.executeSync( + SyncTask( + callFfi: () { + final serializer = SseSerializer(generalizedFrbRustBinding); + sse_encode_box_autoadd_simplified_incoming_call_poster( + poster, + serializer, + ); + return pdeCallFfi(generalizedFrbRustBinding, serializer, funcId: 46)!; + }, + codec: SseCodec( + decodeSuccessData: sse_decode_simplified_incoming_call_poster, + decodeErrorData: sse_decode_AnyhowException, + ), + constMeta: kCrateApiApiClonePosterConstMeta, + argValues: [poster], + apiImpl: this, + ), + ); } - TaskConstMeta get kCrateApiApiClonePosterConstMeta => const TaskConstMeta( - debugName: "clone_poster", - argNames: ["poster"], - ); + TaskConstMeta get kCrateApiApiClonePosterConstMeta => + const TaskConstMeta(debugName: "clone_poster", argNames: ["poster"]); @override - SimplifiedTranscriptPoster crateApiApiCloneTranscriptPoster( - {required SimplifiedTranscriptPoster poster}) { - return handler.executeSync(SyncTask( - callFfi: () { - final serializer = SseSerializer(generalizedFrbRustBinding); - sse_encode_box_autoadd_simplified_transcript_poster(poster, serializer); - return pdeCallFfi(generalizedFrbRustBinding, serializer, funcId: 47)!; - }, - codec: SseCodec( - decodeSuccessData: sse_decode_simplified_transcript_poster, - decodeErrorData: sse_decode_AnyhowException, - ), - constMeta: kCrateApiApiCloneTranscriptPosterConstMeta, - argValues: [poster], - apiImpl: this, - )); + SimplifiedTranscriptPoster crateApiApiCloneTranscriptPoster({ + required SimplifiedTranscriptPoster poster, + }) { + return handler.executeSync( + SyncTask( + callFfi: () { + final serializer = SseSerializer(generalizedFrbRustBinding); + sse_encode_box_autoadd_simplified_transcript_poster( + poster, + serializer, + ); + return pdeCallFfi(generalizedFrbRustBinding, serializer, funcId: 47)!; + }, + codec: SseCodec( + decodeSuccessData: sse_decode_simplified_transcript_poster, + decodeErrorData: sse_decode_AnyhowException, + ), + constMeta: kCrateApiApiCloneTranscriptPosterConstMeta, + argValues: [poster], + apiImpl: this, + ), + ); } TaskConstMeta get kCrateApiApiCloneTranscriptPosterConstMeta => @@ -2781,6466 +3458,9133 @@ class RustLibApiImpl extends RustLibApiImplPlatform implements RustLibApi { @override void crateApiApiCloseAps({required ApsConnection aps}) { - return handler.executeSync(SyncTask( - callFfi: () { - final serializer = SseSerializer(generalizedFrbRustBinding); - sse_encode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerAPSConnection( - aps, serializer); - return pdeCallFfi(generalizedFrbRustBinding, serializer, funcId: 48)!; - }, - codec: SseCodec( - decodeSuccessData: sse_decode_unit, - decodeErrorData: null, - ), - constMeta: kCrateApiApiCloseApsConstMeta, - argValues: [aps], - apiImpl: this, - )); + return handler.executeSync( + SyncTask( + callFfi: () { + final serializer = SseSerializer(generalizedFrbRustBinding); + sse_encode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerAPSConnection( + aps, + serializer, + ); + return pdeCallFfi(generalizedFrbRustBinding, serializer, funcId: 48)!; + }, + codec: SseCodec( + decodeSuccessData: sse_decode_unit, + decodeErrorData: null, + ), + constMeta: kCrateApiApiCloseApsConstMeta, + argValues: [aps], + apiImpl: this, + ), + ); } - TaskConstMeta get kCrateApiApiCloseApsConstMeta => const TaskConstMeta( - debugName: "close_aps", - argNames: ["aps"], - ); + TaskConstMeta get kCrateApiApiCloseApsConstMeta => + const TaskConstMeta(debugName: "close_aps", argNames: ["aps"]); @override void crateApiApiCloseClient({required ArcImClient client}) { - return handler.executeSync(SyncTask( - callFfi: () { - final serializer = SseSerializer(generalizedFrbRustBinding); - sse_encode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcIMClient( - client, serializer); - return pdeCallFfi(generalizedFrbRustBinding, serializer, funcId: 49)!; - }, - codec: SseCodec( - decodeSuccessData: sse_decode_unit, - decodeErrorData: null, - ), - constMeta: kCrateApiApiCloseClientConstMeta, - argValues: [client], - apiImpl: this, - )); + return handler.executeSync( + SyncTask( + callFfi: () { + final serializer = SseSerializer(generalizedFrbRustBinding); + sse_encode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcIMClient( + client, + serializer, + ); + return pdeCallFfi(generalizedFrbRustBinding, serializer, funcId: 49)!; + }, + codec: SseCodec( + decodeSuccessData: sse_decode_unit, + decodeErrorData: null, + ), + constMeta: kCrateApiApiCloseClientConstMeta, + argValues: [client], + apiImpl: this, + ), + ); } - TaskConstMeta get kCrateApiApiCloseClientConstMeta => const TaskConstMeta( - debugName: "close_client", - argNames: ["client"], - ); + TaskConstMeta get kCrateApiApiCloseClientConstMeta => + const TaskConstMeta(debugName: "close_client", argNames: ["client"]); @override - void crateApiApiCloseSyncmanager( - {required SyncManagerDefaultAnisetteProviderMyFilePackager shared}) { - return handler.executeSync(SyncTask( - callFfi: () { - final serializer = SseSerializer(generalizedFrbRustBinding); - sse_encode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerSyncManagerDefaultAnisetteProviderMyFilePackager( - shared, serializer); - return pdeCallFfi(generalizedFrbRustBinding, serializer, funcId: 50)!; - }, - codec: SseCodec( - decodeSuccessData: sse_decode_unit, - decodeErrorData: null, - ), - constMeta: kCrateApiApiCloseSyncmanagerConstMeta, - argValues: [shared], - apiImpl: this, - )); + void crateApiApiCloseSyncmanager({ + required SyncManagerDefaultAnisetteProviderMyFilePackager shared, + }) { + return handler.executeSync( + SyncTask( + callFfi: () { + final serializer = SseSerializer(generalizedFrbRustBinding); + sse_encode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerSyncManagerDefaultAnisetteProviderMyFilePackager( + shared, + serializer, + ); + return pdeCallFfi(generalizedFrbRustBinding, serializer, funcId: 50)!; + }, + codec: SseCodec( + decodeSuccessData: sse_decode_unit, + decodeErrorData: null, + ), + constMeta: kCrateApiApiCloseSyncmanagerConstMeta, + argValues: [shared], + apiImpl: this, + ), + ); } TaskConstMeta get kCrateApiApiCloseSyncmanagerConstMeta => - const TaskConstMeta( - debugName: "close_syncmanager", - argNames: ["shared"], - ); + const TaskConstMeta(debugName: "close_syncmanager", argNames: ["shared"]); @override - Future crateApiApiCompleteMsg({required String ptr}) { - return handler.executeNormal(NormalTask( - callFfi: (port_) { - final serializer = SseSerializer(generalizedFrbRustBinding); - sse_encode_String(ptr, serializer); - pdeCallFfi(generalizedFrbRustBinding, serializer, - funcId: 51, port: port_); - }, - codec: SseCodec( - decodeSuccessData: sse_decode_unit, - decodeErrorData: null, - ), - constMeta: kCrateApiApiCompleteMsgConstMeta, - argValues: [ptr], - apiImpl: this, - )); + CloudSyncProtectedLeaseResult + crateApiApiCloudSyncAcknowledgeCommittedPageLease({ + required String storageDirectory, + required String pageLeaseReference, + }) { + return handler.executeSync( + SyncTask( + callFfi: () { + final serializer = SseSerializer(generalizedFrbRustBinding); + sse_encode_String(storageDirectory, serializer); + sse_encode_String(pageLeaseReference, serializer); + return pdeCallFfi(generalizedFrbRustBinding, serializer, funcId: 51)!; + }, + codec: SseCodec( + decodeSuccessData: sse_decode_cloud_sync_protected_lease_result, + decodeErrorData: null, + ), + constMeta: kCrateApiApiCloudSyncAcknowledgeCommittedPageLeaseConstMeta, + argValues: [storageDirectory, pageLeaseReference], + apiImpl: this, + ), + ); } - TaskConstMeta get kCrateApiApiCompleteMsgConstMeta => const TaskConstMeta( - debugName: "complete_msg", - argNames: ["ptr"], + TaskConstMeta + get kCrateApiApiCloudSyncAcknowledgeCommittedPageLeaseConstMeta => + const TaskConstMeta( + debugName: "cloud_sync_acknowledge_committed_page_lease", + argNames: ["storageDirectory", "pageLeaseReference"], ); @override - Future crateApiApiConfigFromEncoded( - {required List encoded}) { - return handler.executeNormal(NormalTask( - callFfi: (port_) { - final serializer = SseSerializer(generalizedFrbRustBinding); - sse_encode_list_prim_u_8_loose(encoded, serializer); - pdeCallFfi(generalizedFrbRustBinding, serializer, - funcId: 52, port: port_); - }, - codec: SseCodec( - decodeSuccessData: - sse_decode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerJoinedOSConfig, - decodeErrorData: sse_decode_AnyhowException, - ), - constMeta: kCrateApiApiConfigFromEncodedConstMeta, - argValues: [encoded], - apiImpl: this, - )); + Future crateApiApiCloudSyncCaptureAuthSnapshot({ + required ArcCloudMessagesClientDefaultAnisetteProvider cloudMessagesClient, + required String storageDirectory, + }) { + return handler.executeNormal( + NormalTask( + callFfi: (port_) { + final serializer = SseSerializer(generalizedFrbRustBinding); + sse_encode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcCloudMessagesClientDefaultAnisetteProvider( + cloudMessagesClient, + serializer, + ); + sse_encode_String(storageDirectory, serializer); + pdeCallFfi( + generalizedFrbRustBinding, + serializer, + funcId: 52, + port: port_, + ); + }, + codec: SseCodec( + decodeSuccessData: sse_decode_cloud_sync_native_auth_metadata, + decodeErrorData: sse_decode_AnyhowException, + ), + constMeta: kCrateApiApiCloudSyncCaptureAuthSnapshotConstMeta, + argValues: [cloudMessagesClient, storageDirectory], + apiImpl: this, + ), + ); } - TaskConstMeta get kCrateApiApiConfigFromEncodedConstMeta => + TaskConstMeta get kCrateApiApiCloudSyncCaptureAuthSnapshotConstMeta => const TaskConstMeta( - debugName: "config_from_encoded", - argNames: ["encoded"], + debugName: "cloud_sync_capture_auth_snapshot", + argNames: ["cloudMessagesClient", "storageDirectory"], ); @override - Future crateApiApiConfigFromRelay( - {required String code, required String host, String? token}) { - return handler.executeNormal(NormalTask( - callFfi: (port_) { - final serializer = SseSerializer(generalizedFrbRustBinding); - sse_encode_String(code, serializer); - sse_encode_String(host, serializer); - sse_encode_opt_String(token, serializer); - pdeCallFfi(generalizedFrbRustBinding, serializer, - funcId: 53, port: port_); - }, - codec: SseCodec( - decodeSuccessData: - sse_decode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerJoinedOSConfig, - decodeErrorData: sse_decode_AnyhowException, - ), - constMeta: kCrateApiApiConfigFromRelayConstMeta, - argValues: [code, host, token], - apiImpl: this, - )); + CloudSyncProtectedGarbageCollectionResult + crateApiApiCloudSyncCollectProtectedGarbage({ + required String storageDirectory, + required List liveReferences, + required bool liveReferenceEnumerationComplete, + }) { + return handler.executeSync( + SyncTask( + callFfi: () { + final serializer = SseSerializer(generalizedFrbRustBinding); + sse_encode_String(storageDirectory, serializer); + sse_encode_list_String(liveReferences, serializer); + sse_encode_bool(liveReferenceEnumerationComplete, serializer); + return pdeCallFfi(generalizedFrbRustBinding, serializer, funcId: 53)!; + }, + codec: SseCodec( + decodeSuccessData: + sse_decode_cloud_sync_protected_garbage_collection_result, + decodeErrorData: null, + ), + constMeta: kCrateApiApiCloudSyncCollectProtectedGarbageConstMeta, + argValues: [ + storageDirectory, + liveReferences, + liveReferenceEnumerationComplete, + ], + apiImpl: this, + ), + ); } - TaskConstMeta get kCrateApiApiConfigFromRelayConstMeta => const TaskConstMeta( - debugName: "config_from_relay", - argNames: ["code", "host", "token"], + TaskConstMeta get kCrateApiApiCloudSyncCollectProtectedGarbageConstMeta => + const TaskConstMeta( + debugName: "cloud_sync_collect_protected_garbage", + argNames: [ + "storageDirectory", + "liveReferences", + "liveReferenceEnumerationComplete", + ], ); @override - Future crateApiApiConfigFromValidationData( - {required List data, required HwExtra extra}) { - return handler.executeNormal(NormalTask( - callFfi: (port_) { - final serializer = SseSerializer(generalizedFrbRustBinding); - sse_encode_list_prim_u_8_loose(data, serializer); - sse_encode_box_autoadd_hw_extra(extra, serializer); - pdeCallFfi(generalizedFrbRustBinding, serializer, - funcId: 54, port: port_); - }, - codec: SseCodec( - decodeSuccessData: - sse_decode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerJoinedOSConfig, - decodeErrorData: sse_decode_AnyhowException, - ), - constMeta: kCrateApiApiConfigFromValidationDataConstMeta, - argValues: [data, extra], - apiImpl: this, - )); + CloudSyncProtectedLeaseResult crateApiApiCloudSyncCommitProtectedPageLease({ + required String storageDirectory, + required String pageLeaseReference, + required List retainedReferences, + }) { + return handler.executeSync( + SyncTask( + callFfi: () { + final serializer = SseSerializer(generalizedFrbRustBinding); + sse_encode_String(storageDirectory, serializer); + sse_encode_String(pageLeaseReference, serializer); + sse_encode_list_String(retainedReferences, serializer); + return pdeCallFfi(generalizedFrbRustBinding, serializer, funcId: 54)!; + }, + codec: SseCodec( + decodeSuccessData: sse_decode_cloud_sync_protected_lease_result, + decodeErrorData: null, + ), + constMeta: kCrateApiApiCloudSyncCommitProtectedPageLeaseConstMeta, + argValues: [storageDirectory, pageLeaseReference, retainedReferences], + apiImpl: this, + ), + ); } - TaskConstMeta get kCrateApiApiConfigFromValidationDataConstMeta => + TaskConstMeta get kCrateApiApiCloudSyncCommitProtectedPageLeaseConstMeta => const TaskConstMeta( - debugName: "config_from_validation_data", - argNames: ["data", "extra"], + debugName: "cloud_sync_commit_protected_page_lease", + argNames: [ + "storageDirectory", + "pageLeaseReference", + "retainedReferences", + ], ); @override - Future crateApiApiConfigureAppReview({required String path}) { - return handler.executeNormal(NormalTask( - callFfi: (port_) { - final serializer = SseSerializer(generalizedFrbRustBinding); - sse_encode_String(path, serializer); - pdeCallFfi(generalizedFrbRustBinding, serializer, - funcId: 55, port: port_); - }, - codec: SseCodec( - decodeSuccessData: sse_decode_unit, - decodeErrorData: sse_decode_AnyhowException, - ), - constMeta: kCrateApiApiConfigureAppReviewConstMeta, - argValues: [path], - apiImpl: this, - )); + Future + crateApiApiCloudSyncConsumePreparedMessageCreate({ + required CloudSyncPreparedMessageCreateHandle handle, + }) { + return handler.executeNormal( + NormalTask( + callFfi: (port_) { + final serializer = SseSerializer(generalizedFrbRustBinding); + sse_encode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerCloudSyncPreparedMessageCreateHandle( + handle, + serializer, + ); + pdeCallFfi( + generalizedFrbRustBinding, + serializer, + funcId: 55, + port: port_, + ); + }, + codec: SseCodec( + decodeSuccessData: sse_decode_cloud_sync_outbound_consume_result, + decodeErrorData: null, + ), + constMeta: kCrateApiApiCloudSyncConsumePreparedMessageCreateConstMeta, + argValues: [handle], + apiImpl: this, + ), + ); } - TaskConstMeta get kCrateApiApiConfigureAppReviewConstMeta => + TaskConstMeta + get kCrateApiApiCloudSyncConsumePreparedMessageCreateConstMeta => const TaskConstMeta( - debugName: "configure_app_review", - argNames: ["path"], + debugName: "cloud_sync_consume_prepared_message_create", + argNames: ["handle"], ); @override - Future crateApiApiConvertTokenToUuid( - {required ArcImClient state, - required String handle, - required List token}) { - return handler.executeNormal(NormalTask( - callFfi: (port_) { - final serializer = SseSerializer(generalizedFrbRustBinding); - sse_encode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcIMClient( - state, serializer); - sse_encode_String(handle, serializer); - sse_encode_list_prim_u_8_loose(token, serializer); - pdeCallFfi(generalizedFrbRustBinding, serializer, - funcId: 56, port: port_); - }, - codec: SseCodec( - decodeSuccessData: sse_decode_String, - decodeErrorData: sse_decode_AnyhowException, - ), - constMeta: kCrateApiApiConvertTokenToUuidConstMeta, - argValues: [state, handle, token], - apiImpl: this, - )); + Future + crateApiApiCloudSyncDecodeProtectedChange({ + required ArcCloudMessagesClientDefaultAnisetteProvider cloudMessagesClient, + required String storageDirectory, + required String expectedAccountFingerprint, + required String expectedProtectedStoreIdentity, + required String container, + required String database, + required String zone, + required String streamKind, + required int schemaVersion, + required String nativeStream, + required BigInt generation, + required CloudSyncProtectedChangeKind expectedChangeKind, + required String expectedChangeId, + required String expectedRecordIdHash, + String? expectedEtagHash, + required String expectedPayloadSha256, + BigInt? expectedPayloadLength, + PlatformInt64? expectedServerModifiedAtMillis, + required String protectedRawEnvelopeReference, + CloudSyncTransientEntityKind? tombstoneEntityKind, + String? tombstoneLogicalEntityKeyHash, + }) { + return handler.executeNormal( + NormalTask( + callFfi: (port_) { + final serializer = SseSerializer(generalizedFrbRustBinding); + sse_encode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcCloudMessagesClientDefaultAnisetteProvider( + cloudMessagesClient, + serializer, + ); + sse_encode_String(storageDirectory, serializer); + sse_encode_String(expectedAccountFingerprint, serializer); + sse_encode_String(expectedProtectedStoreIdentity, serializer); + sse_encode_String(container, serializer); + sse_encode_String(database, serializer); + sse_encode_String(zone, serializer); + sse_encode_String(streamKind, serializer); + sse_encode_u_32(schemaVersion, serializer); + sse_encode_String(nativeStream, serializer); + sse_encode_u_64(generation, serializer); + sse_encode_cloud_sync_protected_change_kind( + expectedChangeKind, + serializer, + ); + sse_encode_String(expectedChangeId, serializer); + sse_encode_String(expectedRecordIdHash, serializer); + sse_encode_opt_String(expectedEtagHash, serializer); + sse_encode_String(expectedPayloadSha256, serializer); + sse_encode_opt_box_autoadd_u_64(expectedPayloadLength, serializer); + sse_encode_opt_box_autoadd_i_64( + expectedServerModifiedAtMillis, + serializer, + ); + sse_encode_String(protectedRawEnvelopeReference, serializer); + sse_encode_opt_box_autoadd_cloud_sync_transient_entity_kind( + tombstoneEntityKind, + serializer, + ); + sse_encode_opt_String(tombstoneLogicalEntityKeyHash, serializer); + pdeCallFfi( + generalizedFrbRustBinding, + serializer, + funcId: 56, + port: port_, + ); + }, + codec: SseCodec( + decodeSuccessData: sse_decode_cloud_sync_transient_decode_result, + decodeErrorData: null, + ), + constMeta: kCrateApiApiCloudSyncDecodeProtectedChangeConstMeta, + argValues: [ + cloudMessagesClient, + storageDirectory, + expectedAccountFingerprint, + expectedProtectedStoreIdentity, + container, + database, + zone, + streamKind, + schemaVersion, + nativeStream, + generation, + expectedChangeKind, + expectedChangeId, + expectedRecordIdHash, + expectedEtagHash, + expectedPayloadSha256, + expectedPayloadLength, + expectedServerModifiedAtMillis, + protectedRawEnvelopeReference, + tombstoneEntityKind, + tombstoneLogicalEntityKeyHash, + ], + apiImpl: this, + ), + ); } - TaskConstMeta get kCrateApiApiConvertTokenToUuidConstMeta => + TaskConstMeta get kCrateApiApiCloudSyncDecodeProtectedChangeConstMeta => const TaskConstMeta( - debugName: "convert_token_to_uuid", - argNames: ["state", "handle", "token"], - ); - - @override - Future crateApiApiCountRecords( - {required ArcCloudMessagesClientDefaultAnisetteProvider - cloudMessagesClient}) { - return handler.executeNormal(NormalTask( - callFfi: (port_) { - final serializer = SseSerializer(generalizedFrbRustBinding); - sse_encode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcCloudMessagesClientDefaultAnisetteProvider( - cloudMessagesClient, serializer); - pdeCallFfi(generalizedFrbRustBinding, serializer, - funcId: 57, port: port_); - }, - codec: SseCodec( - decodeSuccessData: sse_decode_cloud_message_summary, - decodeErrorData: sse_decode_AnyhowException, - ), - constMeta: kCrateApiApiCountRecordsConstMeta, - argValues: [cloudMessagesClient], - apiImpl: this, - )); - } - - TaskConstMeta get kCrateApiApiCountRecordsConstMeta => const TaskConstMeta( - debugName: "count_records", - argNames: ["cloudMessagesClient"], + debugName: "cloud_sync_decode_protected_change", + argNames: [ + "cloudMessagesClient", + "storageDirectory", + "expectedAccountFingerprint", + "expectedProtectedStoreIdentity", + "container", + "database", + "zone", + "streamKind", + "schemaVersion", + "nativeStream", + "generation", + "expectedChangeKind", + "expectedChangeId", + "expectedRecordIdHash", + "expectedEtagHash", + "expectedPayloadSha256", + "expectedPayloadLength", + "expectedServerModifiedAtMillis", + "protectedRawEnvelopeReference", + "tombstoneEntityKind", + "tombstoneLogicalEntityKeyHash", + ], ); @override - Future crateApiApiCreateFacetime( - {required ArcFtClient facetime, - required String uuid, - required String handle, - required List participants}) { - return handler.executeNormal(NormalTask( - callFfi: (port_) { - final serializer = SseSerializer(generalizedFrbRustBinding); - sse_encode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcFTClient( - facetime, serializer); - sse_encode_String(uuid, serializer); - sse_encode_String(handle, serializer); - sse_encode_list_String(participants, serializer); - pdeCallFfi(generalizedFrbRustBinding, serializer, - funcId: 58, port: port_); - }, - codec: SseCodec( - decodeSuccessData: sse_decode_unit, - decodeErrorData: sse_decode_AnyhowException, - ), - constMeta: kCrateApiApiCreateFacetimeConstMeta, - argValues: [facetime, uuid, handle, participants], - apiImpl: this, - )); + Future crateApiApiCloudSyncFetchProtectedPage({ + required ArcCloudMessagesClientDefaultAnisetteProvider cloudMessagesClient, + required String storageDirectory, + required String expectedAccountFingerprint, + required String stream, + required BigInt generation, + String? previousCheckpointReference, + required int maximumChanges, + }) { + return handler.executeNormal( + NormalTask( + callFfi: (port_) { + final serializer = SseSerializer(generalizedFrbRustBinding); + sse_encode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcCloudMessagesClientDefaultAnisetteProvider( + cloudMessagesClient, + serializer, + ); + sse_encode_String(storageDirectory, serializer); + sse_encode_String(expectedAccountFingerprint, serializer); + sse_encode_String(stream, serializer); + sse_encode_u_64(generation, serializer); + sse_encode_opt_String(previousCheckpointReference, serializer); + sse_encode_u_32(maximumChanges, serializer); + pdeCallFfi( + generalizedFrbRustBinding, + serializer, + funcId: 57, + port: port_, + ); + }, + codec: SseCodec( + decodeSuccessData: sse_decode_cloud_sync_protected_fetch_result, + decodeErrorData: null, + ), + constMeta: kCrateApiApiCloudSyncFetchProtectedPageConstMeta, + argValues: [ + cloudMessagesClient, + storageDirectory, + expectedAccountFingerprint, + stream, + generation, + previousCheckpointReference, + maximumChanges, + ], + apiImpl: this, + ), + ); } - TaskConstMeta get kCrateApiApiCreateFacetimeConstMeta => const TaskConstMeta( - debugName: "create_facetime", - argNames: ["facetime", "uuid", "handle", "participants"], + TaskConstMeta get kCrateApiApiCloudSyncFetchProtectedPageConstMeta => + const TaskConstMeta( + debugName: "cloud_sync_fetch_protected_page", + argNames: [ + "cloudMessagesClient", + "storageDirectory", + "expectedAccountFingerprint", + "stream", + "generation", + "previousCheckpointReference", + "maximumChanges", + ], ); @override - Future crateApiApiCreateGroup( - {required ArcPasswordManagerDefaultAnisetteProvider passwords, - required String name}) { - return handler.executeNormal(NormalTask( - callFfi: (port_) { - final serializer = SseSerializer(generalizedFrbRustBinding); - sse_encode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcPasswordManagerDefaultAnisetteProvider( - passwords, serializer); - sse_encode_String(name, serializer); - pdeCallFfi(generalizedFrbRustBinding, serializer, - funcId: 59, port: port_); - }, - codec: SseCodec( - decodeSuccessData: sse_decode_String, - decodeErrorData: sse_decode_AnyhowException, - ), - constMeta: kCrateApiApiCreateGroupConstMeta, - argValues: [passwords, name], - apiImpl: this, - )); + Future crateApiApiCloudSyncFetchRawPage({ + required ArcCloudMessagesClientDefaultAnisetteProvider cloudMessagesClient, + required String stream, + Uint8List? continuationToken, + required int maxChanges, + }) { + return handler.executeNormal( + NormalTask( + callFfi: (port_) { + final serializer = SseSerializer(generalizedFrbRustBinding); + sse_encode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcCloudMessagesClientDefaultAnisetteProvider( + cloudMessagesClient, + serializer, + ); + sse_encode_String(stream, serializer); + sse_encode_opt_list_prim_u_8_strict(continuationToken, serializer); + sse_encode_u_32(maxChanges, serializer); + pdeCallFfi( + generalizedFrbRustBinding, + serializer, + funcId: 58, + port: port_, + ); + }, + codec: SseCodec( + decodeSuccessData: sse_decode_cloud_sync_raw_fetch_result, + decodeErrorData: null, + ), + constMeta: kCrateApiApiCloudSyncFetchRawPageConstMeta, + argValues: [cloudMessagesClient, stream, continuationToken, maxChanges], + apiImpl: this, + ), + ); } - TaskConstMeta get kCrateApiApiCreateGroupConstMeta => const TaskConstMeta( - debugName: "create_group", - argNames: ["passwords", "name"], + TaskConstMeta get kCrateApiApiCloudSyncFetchRawPageConstMeta => + const TaskConstMeta( + debugName: "cloud_sync_fetch_raw_page", + argNames: [ + "cloudMessagesClient", + "stream", + "continuationToken", + "maxChanges", + ], ); @override - Future crateApiApiCreateIconArray( - {required LPIconMetadata img}) { - return handler.executeNormal(NormalTask( - callFfi: (port_) { - final serializer = SseSerializer(generalizedFrbRustBinding); - sse_encode_box_autoadd_lp_icon_metadata(img, serializer); - pdeCallFfi(generalizedFrbRustBinding, serializer, - funcId: 60, port: port_); - }, - codec: SseCodec( - decodeSuccessData: - sse_decode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerNSArrayLPIconMetadata, - decodeErrorData: null, - ), - constMeta: kCrateApiApiCreateIconArrayConstMeta, - argValues: [img], - apiImpl: this, - )); + String crateApiApiCloudSyncFingerprintAccount({ + required String storageDirectory, + required String rawAccountIdentifier, + }) { + return handler.executeSync( + SyncTask( + callFfi: () { + final serializer = SseSerializer(generalizedFrbRustBinding); + sse_encode_String(storageDirectory, serializer); + sse_encode_String(rawAccountIdentifier, serializer); + return pdeCallFfi(generalizedFrbRustBinding, serializer, funcId: 59)!; + }, + codec: SseCodec( + decodeSuccessData: sse_decode_String, + decodeErrorData: sse_decode_AnyhowException, + ), + constMeta: kCrateApiApiCloudSyncFingerprintAccountConstMeta, + argValues: [storageDirectory, rawAccountIdentifier], + apiImpl: this, + ), + ); } - TaskConstMeta get kCrateApiApiCreateIconArrayConstMeta => const TaskConstMeta( - debugName: "create_icon_array", - argNames: ["img"], + TaskConstMeta get kCrateApiApiCloudSyncFingerprintAccountConstMeta => + const TaskConstMeta( + debugName: "cloud_sync_fingerprint_account", + argNames: ["storageDirectory", "rawAccountIdentifier"], ); @override - Future crateApiApiCreateImageArray( - {required LPImageMetadata img}) { - return handler.executeNormal(NormalTask( - callFfi: (port_) { - final serializer = SseSerializer(generalizedFrbRustBinding); - sse_encode_box_autoadd_lp_image_metadata(img, serializer); - pdeCallFfi(generalizedFrbRustBinding, serializer, - funcId: 61, port: port_); - }, - codec: SseCodec( - decodeSuccessData: - sse_decode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerNSArrayLPImageMetadata, - decodeErrorData: null, - ), - constMeta: kCrateApiApiCreateImageArrayConstMeta, - argValues: [img], - apiImpl: this, - )); + Future + crateApiApiCloudSyncPrepareMessageCreate({ + required ArcCloudMessagesClientDefaultAnisetteProvider cloudMessagesClient, + required String storageDirectory, + required String expectedAccountFingerprint, + required String expectedProtectedStoreIdentity, + required String requestUuid, + required BigInt requestTimeoutSeconds, + required List inputs, + }) { + return handler.executeNormal( + NormalTask( + callFfi: (port_) { + final serializer = SseSerializer(generalizedFrbRustBinding); + sse_encode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcCloudMessagesClientDefaultAnisetteProvider( + cloudMessagesClient, + serializer, + ); + sse_encode_String(storageDirectory, serializer); + sse_encode_String(expectedAccountFingerprint, serializer); + sse_encode_String(expectedProtectedStoreIdentity, serializer); + sse_encode_String(requestUuid, serializer); + sse_encode_u_64(requestTimeoutSeconds, serializer); + sse_encode_list_cloud_sync_prepared_message_create_input( + inputs, + serializer, + ); + pdeCallFfi( + generalizedFrbRustBinding, + serializer, + funcId: 60, + port: port_, + ); + }, + codec: SseCodec( + decodeSuccessData: + sse_decode_cloud_sync_prepared_message_create_result, + decodeErrorData: null, + ), + constMeta: kCrateApiApiCloudSyncPrepareMessageCreateConstMeta, + argValues: [ + cloudMessagesClient, + storageDirectory, + expectedAccountFingerprint, + expectedProtectedStoreIdentity, + requestUuid, + requestTimeoutSeconds, + inputs, + ], + apiImpl: this, + ), + ); } - TaskConstMeta get kCrateApiApiCreateImageArrayConstMeta => + TaskConstMeta get kCrateApiApiCloudSyncPrepareMessageCreateConstMeta => const TaskConstMeta( - debugName: "create_image_array", - argNames: ["img"], + debugName: "cloud_sync_prepare_message_create", + argNames: [ + "cloudMessagesClient", + "storageDirectory", + "expectedAccountFingerprint", + "expectedProtectedStoreIdentity", + "requestUuid", + "requestTimeoutSeconds", + "inputs", + ], ); @override - Date crateApiApiDateNow() { - return handler.executeSync(SyncTask( - callFfi: () { - final serializer = SseSerializer(generalizedFrbRustBinding); - return pdeCallFfi(generalizedFrbRustBinding, serializer, funcId: 62)!; - }, - codec: SseCodec( - decodeSuccessData: - sse_decode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerDate, - decodeErrorData: null, - ), - constMeta: kCrateApiApiDateNowConstMeta, - argValues: [], - apiImpl: this, - )); + String crateApiApiCloudSyncProtect({ + required String storageDirectory, + required String accountFingerprint, + required String container, + required String database, + required String zone, + required String streamKind, + required int schemaVersion, + required String purpose, + required String plaintext, + }) { + return handler.executeSync( + SyncTask( + callFfi: () { + final serializer = SseSerializer(generalizedFrbRustBinding); + sse_encode_String(storageDirectory, serializer); + sse_encode_String(accountFingerprint, serializer); + sse_encode_String(container, serializer); + sse_encode_String(database, serializer); + sse_encode_String(zone, serializer); + sse_encode_String(streamKind, serializer); + sse_encode_u_32(schemaVersion, serializer); + sse_encode_String(purpose, serializer); + sse_encode_String(plaintext, serializer); + return pdeCallFfi(generalizedFrbRustBinding, serializer, funcId: 61)!; + }, + codec: SseCodec( + decodeSuccessData: sse_decode_String, + decodeErrorData: sse_decode_AnyhowException, + ), + constMeta: kCrateApiApiCloudSyncProtectConstMeta, + argValues: [ + storageDirectory, + accountFingerprint, + container, + database, + zone, + streamKind, + schemaVersion, + purpose, + plaintext, + ], + apiImpl: this, + ), + ); } - TaskConstMeta get kCrateApiApiDateNowConstMeta => const TaskConstMeta( - debugName: "date_now", - argNames: [], + TaskConstMeta get kCrateApiApiCloudSyncProtectConstMeta => + const TaskConstMeta( + debugName: "cloud_sync_protect", + argNames: [ + "storageDirectory", + "accountFingerprint", + "container", + "database", + "zone", + "streamKind", + "schemaVersion", + "purpose", + "plaintext", + ], ); @override - int crateApiApiDateToMs({required Date date}) { - return handler.executeSync(SyncTask( - callFfi: () { - final serializer = SseSerializer(generalizedFrbRustBinding); - sse_encode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerDate( - date, serializer); - return pdeCallFfi(generalizedFrbRustBinding, serializer, funcId: 63)!; - }, - codec: SseCodec( - decodeSuccessData: sse_decode_CastedPrimitive_u_64, - decodeErrorData: null, - ), - constMeta: kCrateApiApiDateToMsConstMeta, - argValues: [date], - apiImpl: this, - )); + Future + crateApiApiCloudSyncReconcileMessageCreate({ + required ArcCloudMessagesClientDefaultAnisetteProvider cloudMessagesClient, + required String storageDirectory, + required String expectedAccountFingerprint, + required String expectedProtectedStoreIdentity, + required String requestUuid, + required CloudSyncPreparedMessageCreateInput input, + }) { + return handler.executeNormal( + NormalTask( + callFfi: (port_) { + final serializer = SseSerializer(generalizedFrbRustBinding); + sse_encode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcCloudMessagesClientDefaultAnisetteProvider( + cloudMessagesClient, + serializer, + ); + sse_encode_String(storageDirectory, serializer); + sse_encode_String(expectedAccountFingerprint, serializer); + sse_encode_String(expectedProtectedStoreIdentity, serializer); + sse_encode_String(requestUuid, serializer); + sse_encode_box_autoadd_cloud_sync_prepared_message_create_input( + input, + serializer, + ); + pdeCallFfi( + generalizedFrbRustBinding, + serializer, + funcId: 62, + port: port_, + ); + }, + codec: SseCodec( + decodeSuccessData: sse_decode_cloud_sync_outbound_reconcile_result, + decodeErrorData: null, + ), + constMeta: kCrateApiApiCloudSyncReconcileMessageCreateConstMeta, + argValues: [ + cloudMessagesClient, + storageDirectory, + expectedAccountFingerprint, + expectedProtectedStoreIdentity, + requestUuid, + input, + ], + apiImpl: this, + ), + ); } - TaskConstMeta get kCrateApiApiDateToMsConstMeta => const TaskConstMeta( - debugName: "date_to_ms", - argNames: ["date"], + TaskConstMeta get kCrateApiApiCloudSyncReconcileMessageCreateConstMeta => + const TaskConstMeta( + debugName: "cloud_sync_reconcile_message_create", + argNames: [ + "cloudMessagesClient", + "storageDirectory", + "expectedAccountFingerprint", + "expectedProtectedStoreIdentity", + "requestUuid", + "input", + ], ); @override - Future crateApiApiDeclineFacetime( - {required ArcFtClient facetime, required String guid}) { - return handler.executeNormal(NormalTask( - callFfi: (port_) { - final serializer = SseSerializer(generalizedFrbRustBinding); - sse_encode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcFTClient( - facetime, serializer); - sse_encode_String(guid, serializer); - pdeCallFfi(generalizedFrbRustBinding, serializer, - funcId: 64, port: port_); - }, - codec: SseCodec( - decodeSuccessData: sse_decode_unit, - decodeErrorData: sse_decode_AnyhowException, - ), - constMeta: kCrateApiApiDeclineFacetimeConstMeta, - argValues: [facetime, guid], - apiImpl: this, - )); + CloudSyncProtectedRecoveryResult + crateApiApiCloudSyncRecoverAbandonedPageLeases({ + required String storageDirectory, + required List adoptedLeaseReferences, + required List liveReferences, + required bool liveReferenceEnumerationComplete, + }) { + return handler.executeSync( + SyncTask( + callFfi: () { + final serializer = SseSerializer(generalizedFrbRustBinding); + sse_encode_String(storageDirectory, serializer); + sse_encode_list_String(adoptedLeaseReferences, serializer); + sse_encode_list_String(liveReferences, serializer); + sse_encode_bool(liveReferenceEnumerationComplete, serializer); + return pdeCallFfi(generalizedFrbRustBinding, serializer, funcId: 63)!; + }, + codec: SseCodec( + decodeSuccessData: sse_decode_cloud_sync_protected_recovery_result, + decodeErrorData: null, + ), + constMeta: kCrateApiApiCloudSyncRecoverAbandonedPageLeasesConstMeta, + argValues: [ + storageDirectory, + adoptedLeaseReferences, + liveReferences, + liveReferenceEnumerationComplete, + ], + apiImpl: this, + ), + ); } - TaskConstMeta get kCrateApiApiDeclineFacetimeConstMeta => const TaskConstMeta( - debugName: "decline_facetime", - argNames: ["facetime", "guid"], + TaskConstMeta get kCrateApiApiCloudSyncRecoverAbandonedPageLeasesConstMeta => + const TaskConstMeta( + debugName: "cloud_sync_recover_abandoned_page_leases", + argNames: [ + "storageDirectory", + "adoptedLeaseReferences", + "liveReferences", + "liveReferenceEnumerationComplete", + ], ); @override - Future crateApiApiDeclineInvite( - {required ArcPasswordManagerDefaultAnisetteProvider passwords, - required String inviteId}) { - return handler.executeNormal(NormalTask( - callFfi: (port_) { - final serializer = SseSerializer(generalizedFrbRustBinding); - sse_encode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcPasswordManagerDefaultAnisetteProvider( - passwords, serializer); - sse_encode_String(inviteId, serializer); - pdeCallFfi(generalizedFrbRustBinding, serializer, - funcId: 65, port: port_); - }, - codec: SseCodec( - decodeSuccessData: sse_decode_unit, - decodeErrorData: sse_decode_AnyhowException, - ), - constMeta: kCrateApiApiDeclineInviteConstMeta, - argValues: [passwords, inviteId], - apiImpl: this, - )); + CloudSyncProtectedRetirementResult + crateApiApiCloudSyncRetireProtectedReferences({ + required String storageDirectory, + required List references, + }) { + return handler.executeSync( + SyncTask( + callFfi: () { + final serializer = SseSerializer(generalizedFrbRustBinding); + sse_encode_String(storageDirectory, serializer); + sse_encode_list_String(references, serializer); + return pdeCallFfi(generalizedFrbRustBinding, serializer, funcId: 64)!; + }, + codec: SseCodec( + decodeSuccessData: sse_decode_cloud_sync_protected_retirement_result, + decodeErrorData: null, + ), + constMeta: kCrateApiApiCloudSyncRetireProtectedReferencesConstMeta, + argValues: [storageDirectory, references], + apiImpl: this, + ), + ); } - TaskConstMeta get kCrateApiApiDeclineInviteConstMeta => const TaskConstMeta( - debugName: "decline_invite", - argNames: ["passwords", "inviteId"], + TaskConstMeta get kCrateApiApiCloudSyncRetireProtectedReferencesConstMeta => + const TaskConstMeta( + debugName: "cloud_sync_retire_protected_references", + argNames: ["storageDirectory", "references"], ); @override - AttachmentMeta crateApiApiDecodeAttachmentmeta( - {required GZipWrapperAttachmentMeta wrapped}) { - return handler.executeSync(SyncTask( - callFfi: () { - final serializer = SseSerializer(generalizedFrbRustBinding); - sse_encode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerGZipWrapperAttachmentMeta( - wrapped, serializer); - return pdeCallFfi(generalizedFrbRustBinding, serializer, funcId: 66)!; - }, - codec: SseCodec( - decodeSuccessData: sse_decode_attachment_meta, - decodeErrorData: null, - ), - constMeta: kCrateApiApiDecodeAttachmentmetaConstMeta, - argValues: [wrapped], - apiImpl: this, - )); + CloudSyncProtectedLeaseResult crateApiApiCloudSyncRollbackProtectedPageLease({ + required String storageDirectory, + required String pageLeaseReference, + }) { + return handler.executeSync( + SyncTask( + callFfi: () { + final serializer = SseSerializer(generalizedFrbRustBinding); + sse_encode_String(storageDirectory, serializer); + sse_encode_String(pageLeaseReference, serializer); + return pdeCallFfi(generalizedFrbRustBinding, serializer, funcId: 65)!; + }, + codec: SseCodec( + decodeSuccessData: sse_decode_cloud_sync_protected_lease_result, + decodeErrorData: null, + ), + constMeta: kCrateApiApiCloudSyncRollbackProtectedPageLeaseConstMeta, + argValues: [storageDirectory, pageLeaseReference], + apiImpl: this, + ), + ); } - TaskConstMeta get kCrateApiApiDecodeAttachmentmetaConstMeta => + TaskConstMeta get kCrateApiApiCloudSyncRollbackProtectedPageLeaseConstMeta => const TaskConstMeta( - debugName: "decode_attachmentmeta", - argNames: ["wrapped"], + debugName: "cloud_sync_rollback_protected_page_lease", + argNames: ["storageDirectory", "pageLeaseReference"], ); @override - ChatProto crateApiApiDecodeChatproto( - {required GZipWrapperChatProto wrapped}) { - return handler.executeSync(SyncTask( - callFfi: () { - final serializer = SseSerializer(generalizedFrbRustBinding); - sse_encode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerGZipWrapperChatProto( - wrapped, serializer); - return pdeCallFfi(generalizedFrbRustBinding, serializer, funcId: 67)!; - }, - codec: SseCodec( - decodeSuccessData: sse_decode_chat_proto, - decodeErrorData: null, - ), - constMeta: kCrateApiApiDecodeChatprotoConstMeta, - argValues: [wrapped], - apiImpl: this, - )); + Future + crateApiApiCloudSyncStageOutboundMessage({ + required ArcCloudMessagesClientDefaultAnisetteProvider cloudMessagesClient, + required String storageDirectory, + required String expectedAccountFingerprint, + required String expectedProtectedStoreIdentity, + required CloudMessage message, + }) { + return handler.executeNormal( + NormalTask( + callFfi: (port_) { + final serializer = SseSerializer(generalizedFrbRustBinding); + sse_encode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcCloudMessagesClientDefaultAnisetteProvider( + cloudMessagesClient, + serializer, + ); + sse_encode_String(storageDirectory, serializer); + sse_encode_String(expectedAccountFingerprint, serializer); + sse_encode_String(expectedProtectedStoreIdentity, serializer); + sse_encode_box_autoadd_cloud_message(message, serializer); + pdeCallFfi( + generalizedFrbRustBinding, + serializer, + funcId: 66, + port: port_, + ); + }, + codec: SseCodec( + decodeSuccessData: + sse_decode_cloud_sync_protected_outbound_stage_result, + decodeErrorData: null, + ), + constMeta: kCrateApiApiCloudSyncStageOutboundMessageConstMeta, + argValues: [ + cloudMessagesClient, + storageDirectory, + expectedAccountFingerprint, + expectedProtectedStoreIdentity, + message, + ], + apiImpl: this, + ), + ); } - TaskConstMeta get kCrateApiApiDecodeChatprotoConstMeta => const TaskConstMeta( - debugName: "decode_chatproto", - argNames: ["wrapped"], + TaskConstMeta get kCrateApiApiCloudSyncStageOutboundMessageConstMeta => + const TaskConstMeta( + debugName: "cloud_sync_stage_outbound_message", + argNames: [ + "cloudMessagesClient", + "storageDirectory", + "expectedAccountFingerprint", + "expectedProtectedStoreIdentity", + "message", + ], ); @override - ExtensionApp crateApiApiDecodeExtensionApp( - {required List bp, required String bid}) { - return handler.executeSync(SyncTask( - callFfi: () { - final serializer = SseSerializer(generalizedFrbRustBinding); - sse_encode_list_prim_u_8_loose(bp, serializer); - sse_encode_String(bid, serializer); - return pdeCallFfi(generalizedFrbRustBinding, serializer, funcId: 68)!; - }, - codec: SseCodec( - decodeSuccessData: sse_decode_extension_app, - decodeErrorData: sse_decode_AnyhowException, - ), - constMeta: kCrateApiApiDecodeExtensionAppConstMeta, - argValues: [bp, bid], - apiImpl: this, - )); + String crateApiApiCloudSyncUnprotect({ + required String storageDirectory, + required String accountFingerprint, + required String container, + required String database, + required String zone, + required String streamKind, + required int schemaVersion, + required String purpose, + required String ciphertext, + }) { + return handler.executeSync( + SyncTask( + callFfi: () { + final serializer = SseSerializer(generalizedFrbRustBinding); + sse_encode_String(storageDirectory, serializer); + sse_encode_String(accountFingerprint, serializer); + sse_encode_String(container, serializer); + sse_encode_String(database, serializer); + sse_encode_String(zone, serializer); + sse_encode_String(streamKind, serializer); + sse_encode_u_32(schemaVersion, serializer); + sse_encode_String(purpose, serializer); + sse_encode_String(ciphertext, serializer); + return pdeCallFfi(generalizedFrbRustBinding, serializer, funcId: 67)!; + }, + codec: SseCodec( + decodeSuccessData: sse_decode_String, + decodeErrorData: sse_decode_AnyhowException, + ), + constMeta: kCrateApiApiCloudSyncUnprotectConstMeta, + argValues: [ + storageDirectory, + accountFingerprint, + container, + database, + zone, + streamKind, + schemaVersion, + purpose, + ciphertext, + ], + apiImpl: this, + ), + ); } - TaskConstMeta get kCrateApiApiDecodeExtensionAppConstMeta => + TaskConstMeta get kCrateApiApiCloudSyncUnprotectConstMeta => const TaskConstMeta( - debugName: "decode_extension_app", - argNames: ["bp", "bid"], + debugName: "cloud_sync_unprotect", + argNames: [ + "storageDirectory", + "accountFingerprint", + "container", + "database", + "zone", + "streamKind", + "schemaVersion", + "purpose", + "ciphertext", + ], ); @override - IdsngmIdentity crateApiApiDecodeIdentity({required List identity}) { - return handler.executeSync(SyncTask( - callFfi: () { - final serializer = SseSerializer(generalizedFrbRustBinding); - sse_encode_list_prim_u_8_loose(identity, serializer); - return pdeCallFfi(generalizedFrbRustBinding, serializer, funcId: 69)!; - }, - codec: SseCodec( - decodeSuccessData: - sse_decode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerIDSNGMIdentity, - decodeErrorData: sse_decode_AnyhowException, - ), - constMeta: kCrateApiApiDecodeIdentityConstMeta, - argValues: [identity], - apiImpl: this, - )); + Future crateApiApiCompleteMsg({required String ptr}) { + return handler.executeNormal( + NormalTask( + callFfi: (port_) { + final serializer = SseSerializer(generalizedFrbRustBinding); + sse_encode_String(ptr, serializer); + pdeCallFfi( + generalizedFrbRustBinding, + serializer, + funcId: 68, + port: port_, + ); + }, + codec: SseCodec( + decodeSuccessData: sse_decode_unit, + decodeErrorData: null, + ), + constMeta: kCrateApiApiCompleteMsgConstMeta, + argValues: [ptr], + apiImpl: this, + ), + ); } - TaskConstMeta get kCrateApiApiDecodeIdentityConstMeta => const TaskConstMeta( - debugName: "decode_identity", - argNames: ["identity"], - ); + TaskConstMeta get kCrateApiApiCompleteMsgConstMeta => + const TaskConstMeta(debugName: "complete_msg", argNames: ["ptr"]); @override - MessageSummaryInfo crateApiApiDecodeMessageInfo({required List data}) { - return handler.executeSync(SyncTask( - callFfi: () { - final serializer = SseSerializer(generalizedFrbRustBinding); - sse_encode_list_prim_u_8_loose(data, serializer); - return pdeCallFfi(generalizedFrbRustBinding, serializer, funcId: 70)!; - }, - codec: SseCodec( - decodeSuccessData: sse_decode_message_summary_info, - decodeErrorData: sse_decode_AnyhowException, - ), - constMeta: kCrateApiApiDecodeMessageInfoConstMeta, - argValues: [data], - apiImpl: this, - )); + Future crateApiApiConfigFromEncoded({ + required List encoded, + }) { + return handler.executeNormal( + NormalTask( + callFfi: (port_) { + final serializer = SseSerializer(generalizedFrbRustBinding); + sse_encode_list_prim_u_8_loose(encoded, serializer); + pdeCallFfi( + generalizedFrbRustBinding, + serializer, + funcId: 69, + port: port_, + ); + }, + codec: SseCodec( + decodeSuccessData: + sse_decode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerJoinedOSConfig, + decodeErrorData: sse_decode_AnyhowException, + ), + constMeta: kCrateApiApiConfigFromEncodedConstMeta, + argValues: [encoded], + apiImpl: this, + ), + ); } - TaskConstMeta get kCrateApiApiDecodeMessageInfoConstMeta => + TaskConstMeta get kCrateApiApiConfigFromEncodedConstMeta => const TaskConstMeta( - debugName: "decode_message_info", - argNames: ["data"], + debugName: "config_from_encoded", + argNames: ["encoded"], ); @override - MessageProto crateApiApiDecodeMessageproto( - {required GZipWrapperMessageProto wrapped}) { - return handler.executeSync(SyncTask( - callFfi: () { - final serializer = SseSerializer(generalizedFrbRustBinding); - sse_encode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerGZipWrapperMessageProto( - wrapped, serializer); - return pdeCallFfi(generalizedFrbRustBinding, serializer, funcId: 71)!; - }, - codec: SseCodec( - decodeSuccessData: sse_decode_message_proto, - decodeErrorData: null, - ), - constMeta: kCrateApiApiDecodeMessageprotoConstMeta, - argValues: [wrapped], - apiImpl: this, - )); + Future crateApiApiConfigFromRelay({ + required String code, + required String host, + String? token, + }) { + return handler.executeNormal( + NormalTask( + callFfi: (port_) { + final serializer = SseSerializer(generalizedFrbRustBinding); + sse_encode_String(code, serializer); + sse_encode_String(host, serializer); + sse_encode_opt_String(token, serializer); + pdeCallFfi( + generalizedFrbRustBinding, + serializer, + funcId: 70, + port: port_, + ); + }, + codec: SseCodec( + decodeSuccessData: + sse_decode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerJoinedOSConfig, + decodeErrorData: sse_decode_AnyhowException, + ), + constMeta: kCrateApiApiConfigFromRelayConstMeta, + argValues: [code, host, token], + apiImpl: this, + ), + ); } - TaskConstMeta get kCrateApiApiDecodeMessageprotoConstMeta => - const TaskConstMeta( - debugName: "decode_messageproto", - argNames: ["wrapped"], - ); + TaskConstMeta get kCrateApiApiConfigFromRelayConstMeta => const TaskConstMeta( + debugName: "config_from_relay", + argNames: ["code", "host", "token"], + ); @override - MessageProto2 crateApiApiDecodeMessageproto2( - {required GZipWrapperMessageProto2 wrapped}) { - return handler.executeSync(SyncTask( - callFfi: () { - final serializer = SseSerializer(generalizedFrbRustBinding); - sse_encode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerGZipWrapperMessageProto2( - wrapped, serializer); - return pdeCallFfi(generalizedFrbRustBinding, serializer, funcId: 72)!; - }, - codec: SseCodec( - decodeSuccessData: sse_decode_message_proto_2, - decodeErrorData: null, - ), - constMeta: kCrateApiApiDecodeMessageproto2ConstMeta, - argValues: [wrapped], - apiImpl: this, - )); + Future crateApiApiConfigFromValidationData({ + required List data, + required HwExtra extra, + }) { + return handler.executeNormal( + NormalTask( + callFfi: (port_) { + final serializer = SseSerializer(generalizedFrbRustBinding); + sse_encode_list_prim_u_8_loose(data, serializer); + sse_encode_box_autoadd_hw_extra(extra, serializer); + pdeCallFfi( + generalizedFrbRustBinding, + serializer, + funcId: 71, + port: port_, + ); + }, + codec: SseCodec( + decodeSuccessData: + sse_decode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerJoinedOSConfig, + decodeErrorData: sse_decode_AnyhowException, + ), + constMeta: kCrateApiApiConfigFromValidationDataConstMeta, + argValues: [data, extra], + apiImpl: this, + ), + ); } - TaskConstMeta get kCrateApiApiDecodeMessageproto2ConstMeta => + TaskConstMeta get kCrateApiApiConfigFromValidationDataConstMeta => const TaskConstMeta( - debugName: "decode_messageproto2", - argNames: ["wrapped"], + debugName: "config_from_validation_data", + argNames: ["data", "extra"], ); @override - MessageProto3 crateApiApiDecodeMessageproto3( - {required GZipWrapperMessageProto3 wrapped}) { - return handler.executeSync(SyncTask( - callFfi: () { - final serializer = SseSerializer(generalizedFrbRustBinding); - sse_encode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerGZipWrapperMessageProto3( - wrapped, serializer); - return pdeCallFfi(generalizedFrbRustBinding, serializer, funcId: 73)!; - }, - codec: SseCodec( - decodeSuccessData: sse_decode_message_proto_3, - decodeErrorData: null, - ), - constMeta: kCrateApiApiDecodeMessageproto3ConstMeta, - argValues: [wrapped], - apiImpl: this, - )); + Future crateApiApiConfigureAppReview({required String path}) { + return handler.executeNormal( + NormalTask( + callFfi: (port_) { + final serializer = SseSerializer(generalizedFrbRustBinding); + sse_encode_String(path, serializer); + pdeCallFfi( + generalizedFrbRustBinding, + serializer, + funcId: 72, + port: port_, + ); + }, + codec: SseCodec( + decodeSuccessData: sse_decode_unit, + decodeErrorData: sse_decode_AnyhowException, + ), + constMeta: kCrateApiApiConfigureAppReviewConstMeta, + argValues: [path], + apiImpl: this, + ), + ); } - TaskConstMeta get kCrateApiApiDecodeMessageproto3ConstMeta => + TaskConstMeta get kCrateApiApiConfigureAppReviewConstMeta => const TaskConstMeta( - debugName: "decode_messageproto3", - argNames: ["wrapped"], + debugName: "configure_app_review", + argNames: ["path"], ); @override - MessageProto4 crateApiApiDecodeMessageproto4( - {required GZipWrapperMessageProto4 wrapped}) { - return handler.executeSync(SyncTask( - callFfi: () { - final serializer = SseSerializer(generalizedFrbRustBinding); - sse_encode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerGZipWrapperMessageProto4( - wrapped, serializer); - return pdeCallFfi(generalizedFrbRustBinding, serializer, funcId: 74)!; - }, - codec: SseCodec( - decodeSuccessData: sse_decode_message_proto_4, - decodeErrorData: null, - ), - constMeta: kCrateApiApiDecodeMessageproto4ConstMeta, - argValues: [wrapped], - apiImpl: this, - )); + Future crateApiApiConvertTokenToUuid({ + required ArcImClient state, + required String handle, + required List token, + }) { + return handler.executeNormal( + NormalTask( + callFfi: (port_) { + final serializer = SseSerializer(generalizedFrbRustBinding); + sse_encode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcIMClient( + state, + serializer, + ); + sse_encode_String(handle, serializer); + sse_encode_list_prim_u_8_loose(token, serializer); + pdeCallFfi( + generalizedFrbRustBinding, + serializer, + funcId: 73, + port: port_, + ); + }, + codec: SseCodec( + decodeSuccessData: sse_decode_String, + decodeErrorData: sse_decode_AnyhowException, + ), + constMeta: kCrateApiApiConvertTokenToUuidConstMeta, + argValues: [state, handle, token], + apiImpl: this, + ), + ); } - TaskConstMeta get kCrateApiApiDecodeMessageproto4ConstMeta => + TaskConstMeta get kCrateApiApiConvertTokenToUuidConstMeta => const TaskConstMeta( - debugName: "decode_messageproto4", - argNames: ["wrapped"], + debugName: "convert_token_to_uuid", + argNames: ["state", "handle", "token"], ); @override - Future crateApiApiDecodeProfileMessage( - {required String s}) { - return handler.executeNormal(NormalTask( - callFfi: (port_) { - final serializer = SseSerializer(generalizedFrbRustBinding); - sse_encode_String(s, serializer); - pdeCallFfi(generalizedFrbRustBinding, serializer, - funcId: 75, port: port_); - }, - codec: SseCodec( - decodeSuccessData: sse_decode_share_profile_message, - decodeErrorData: sse_decode_AnyhowException, - ), - constMeta: kCrateApiApiDecodeProfileMessageConstMeta, - argValues: [s], - apiImpl: this, - )); + Future crateApiApiCountRecords({ + required ArcCloudMessagesClientDefaultAnisetteProvider cloudMessagesClient, + }) { + return handler.executeNormal( + NormalTask( + callFfi: (port_) { + final serializer = SseSerializer(generalizedFrbRustBinding); + sse_encode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcCloudMessagesClientDefaultAnisetteProvider( + cloudMessagesClient, + serializer, + ); + pdeCallFfi( + generalizedFrbRustBinding, + serializer, + funcId: 74, + port: port_, + ); + }, + codec: SseCodec( + decodeSuccessData: sse_decode_cloud_message_summary, + decodeErrorData: sse_decode_AnyhowException, + ), + constMeta: kCrateApiApiCountRecordsConstMeta, + argValues: [cloudMessagesClient], + apiImpl: this, + ), + ); } - TaskConstMeta get kCrateApiApiDecodeProfileMessageConstMeta => - const TaskConstMeta( - debugName: "decode_profile_message", - argNames: ["s"], - ); + TaskConstMeta get kCrateApiApiCountRecordsConstMeta => const TaskConstMeta( + debugName: "count_records", + argNames: ["cloudMessagesClient"], + ); @override - Future crateApiApiDecodeSummaryInfo( - {required List info}) { - return handler.executeNormal(NormalTask( - callFfi: (port_) { - final serializer = SseSerializer(generalizedFrbRustBinding); - sse_encode_list_prim_u_8_loose(info, serializer); - pdeCallFfi(generalizedFrbRustBinding, serializer, - funcId: 76, port: port_); - }, - codec: SseCodec( - decodeSuccessData: sse_decode_message_summary_info, - decodeErrorData: null, - ), - constMeta: kCrateApiApiDecodeSummaryInfoConstMeta, - argValues: [info], - apiImpl: this, - )); + Future crateApiApiCreateFacetime({ + required ArcFtClient facetime, + required String uuid, + required String handle, + required List participants, + }) { + return handler.executeNormal( + NormalTask( + callFfi: (port_) { + final serializer = SseSerializer(generalizedFrbRustBinding); + sse_encode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcFTClient( + facetime, + serializer, + ); + sse_encode_String(uuid, serializer); + sse_encode_String(handle, serializer); + sse_encode_list_String(participants, serializer); + pdeCallFfi( + generalizedFrbRustBinding, + serializer, + funcId: 75, + port: port_, + ); + }, + codec: SseCodec( + decodeSuccessData: sse_decode_unit, + decodeErrorData: sse_decode_AnyhowException, + ), + constMeta: kCrateApiApiCreateFacetimeConstMeta, + argValues: [facetime, uuid, handle, participants], + apiImpl: this, + ), + ); } - TaskConstMeta get kCrateApiApiDecodeSummaryInfoConstMeta => - const TaskConstMeta( - debugName: "decode_summary_info", - argNames: ["info"], - ); + TaskConstMeta get kCrateApiApiCreateFacetimeConstMeta => const TaskConstMeta( + debugName: "create_facetime", + argNames: ["facetime", "uuid", "handle", "participants"], + ); @override - Future crateApiApiDeleteAttachments( - {required ArcCloudMessagesClientDefaultAnisetteProvider - cloudMessagesClient, - required List attachments}) { - return handler.executeNormal(NormalTask( - callFfi: (port_) { - final serializer = SseSerializer(generalizedFrbRustBinding); - sse_encode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcCloudMessagesClientDefaultAnisetteProvider( - cloudMessagesClient, serializer); - sse_encode_list_String(attachments, serializer); - pdeCallFfi(generalizedFrbRustBinding, serializer, - funcId: 77, port: port_); - }, - codec: SseCodec( - decodeSuccessData: sse_decode_unit, - decodeErrorData: sse_decode_AnyhowException, - ), - constMeta: kCrateApiApiDeleteAttachmentsConstMeta, - argValues: [cloudMessagesClient, attachments], - apiImpl: this, - )); + Future crateApiApiCreateGroup({ + required ArcPasswordManagerDefaultAnisetteProvider passwords, + required String name, + }) { + return handler.executeNormal( + NormalTask( + callFfi: (port_) { + final serializer = SseSerializer(generalizedFrbRustBinding); + sse_encode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcPasswordManagerDefaultAnisetteProvider( + passwords, + serializer, + ); + sse_encode_String(name, serializer); + pdeCallFfi( + generalizedFrbRustBinding, + serializer, + funcId: 76, + port: port_, + ); + }, + codec: SseCodec( + decodeSuccessData: sse_decode_String, + decodeErrorData: sse_decode_AnyhowException, + ), + constMeta: kCrateApiApiCreateGroupConstMeta, + argValues: [passwords, name], + apiImpl: this, + ), + ); } - TaskConstMeta get kCrateApiApiDeleteAttachmentsConstMeta => - const TaskConstMeta( - debugName: "delete_attachments", - argNames: ["cloudMessagesClient", "attachments"], - ); + TaskConstMeta get kCrateApiApiCreateGroupConstMeta => const TaskConstMeta( + debugName: "create_group", + argNames: ["passwords", "name"], + ); @override - Future crateApiApiDeleteBeaconShare( - {required ArcFindMyClientDefaultAnisetteProvider items, - required String share}) { - return handler.executeNormal(NormalTask( - callFfi: (port_) { - final serializer = SseSerializer(generalizedFrbRustBinding); - sse_encode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcFindMyClientDefaultAnisetteProvider( - items, serializer); - sse_encode_String(share, serializer); - pdeCallFfi(generalizedFrbRustBinding, serializer, - funcId: 78, port: port_); - }, - codec: SseCodec( - decodeSuccessData: sse_decode_unit, - decodeErrorData: sse_decode_AnyhowException, - ), - constMeta: kCrateApiApiDeleteBeaconShareConstMeta, - argValues: [items, share], - apiImpl: this, - )); + Future crateApiApiCreateIconArray({ + required LPIconMetadata img, + }) { + return handler.executeNormal( + NormalTask( + callFfi: (port_) { + final serializer = SseSerializer(generalizedFrbRustBinding); + sse_encode_box_autoadd_lp_icon_metadata(img, serializer); + pdeCallFfi( + generalizedFrbRustBinding, + serializer, + funcId: 77, + port: port_, + ); + }, + codec: SseCodec( + decodeSuccessData: + sse_decode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerNSArrayLPIconMetadata, + decodeErrorData: null, + ), + constMeta: kCrateApiApiCreateIconArrayConstMeta, + argValues: [img], + apiImpl: this, + ), + ); } - TaskConstMeta get kCrateApiApiDeleteBeaconShareConstMeta => - const TaskConstMeta( - debugName: "delete_beacon_share", - argNames: ["items", "share"], - ); + TaskConstMeta get kCrateApiApiCreateIconArrayConstMeta => + const TaskConstMeta(debugName: "create_icon_array", argNames: ["img"]); @override - Future crateApiApiDeleteChats( - {required ArcCloudMessagesClientDefaultAnisetteProvider - cloudMessagesClient, - required List chats}) { - return handler.executeNormal(NormalTask( - callFfi: (port_) { - final serializer = SseSerializer(generalizedFrbRustBinding); - sse_encode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcCloudMessagesClientDefaultAnisetteProvider( - cloudMessagesClient, serializer); - sse_encode_list_String(chats, serializer); - pdeCallFfi(generalizedFrbRustBinding, serializer, - funcId: 79, port: port_); - }, - codec: SseCodec( - decodeSuccessData: sse_decode_unit, - decodeErrorData: sse_decode_AnyhowException, - ), - constMeta: kCrateApiApiDeleteChatsConstMeta, - argValues: [cloudMessagesClient, chats], - apiImpl: this, - )); + Future crateApiApiCreateImageArray({ + required LPImageMetadata img, + }) { + return handler.executeNormal( + NormalTask( + callFfi: (port_) { + final serializer = SseSerializer(generalizedFrbRustBinding); + sse_encode_box_autoadd_lp_image_metadata(img, serializer); + pdeCallFfi( + generalizedFrbRustBinding, + serializer, + funcId: 78, + port: port_, + ); + }, + codec: SseCodec( + decodeSuccessData: + sse_decode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerNSArrayLPImageMetadata, + decodeErrorData: null, + ), + constMeta: kCrateApiApiCreateImageArrayConstMeta, + argValues: [img], + apiImpl: this, + ), + ); } - TaskConstMeta get kCrateApiApiDeleteChatsConstMeta => const TaskConstMeta( - debugName: "delete_chats", - argNames: ["cloudMessagesClient", "chats"], - ); + TaskConstMeta get kCrateApiApiCreateImageArrayConstMeta => + const TaskConstMeta(debugName: "create_image_array", argNames: ["img"]); @override - Future crateApiApiDeleteGroup( - {required ArcPasswordManagerDefaultAnisetteProvider passwords, - required String gid}) { - return handler.executeNormal(NormalTask( - callFfi: (port_) { - final serializer = SseSerializer(generalizedFrbRustBinding); - sse_encode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcPasswordManagerDefaultAnisetteProvider( - passwords, serializer); - sse_encode_String(gid, serializer); - pdeCallFfi(generalizedFrbRustBinding, serializer, - funcId: 80, port: port_); - }, - codec: SseCodec( - decodeSuccessData: sse_decode_unit, - decodeErrorData: sse_decode_AnyhowException, - ), - constMeta: kCrateApiApiDeleteGroupConstMeta, - argValues: [passwords, gid], - apiImpl: this, - )); + Date crateApiApiDateNow() { + return handler.executeSync( + SyncTask( + callFfi: () { + final serializer = SseSerializer(generalizedFrbRustBinding); + return pdeCallFfi(generalizedFrbRustBinding, serializer, funcId: 79)!; + }, + codec: SseCodec( + decodeSuccessData: + sse_decode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerDate, + decodeErrorData: null, + ), + constMeta: kCrateApiApiDateNowConstMeta, + argValues: [], + apiImpl: this, + ), + ); } - TaskConstMeta get kCrateApiApiDeleteGroupConstMeta => const TaskConstMeta( - debugName: "delete_group", - argNames: ["passwords", "gid"], - ); + TaskConstMeta get kCrateApiApiDateNowConstMeta => + const TaskConstMeta(debugName: "date_now", argNames: []); @override - Future crateApiApiDeleteMessages( - {required ArcCloudMessagesClientDefaultAnisetteProvider - cloudMessagesClient, - required List messages}) { - return handler.executeNormal(NormalTask( - callFfi: (port_) { - final serializer = SseSerializer(generalizedFrbRustBinding); - sse_encode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcCloudMessagesClientDefaultAnisetteProvider( - cloudMessagesClient, serializer); - sse_encode_list_String(messages, serializer); - pdeCallFfi(generalizedFrbRustBinding, serializer, - funcId: 81, port: port_); - }, - codec: SseCodec( - decodeSuccessData: sse_decode_unit, - decodeErrorData: sse_decode_AnyhowException, - ), - constMeta: kCrateApiApiDeleteMessagesConstMeta, - argValues: [cloudMessagesClient, messages], - apiImpl: this, - )); + int crateApiApiDateToMs({required Date date}) { + return handler.executeSync( + SyncTask( + callFfi: () { + final serializer = SseSerializer(generalizedFrbRustBinding); + sse_encode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerDate( + date, + serializer, + ); + return pdeCallFfi(generalizedFrbRustBinding, serializer, funcId: 80)!; + }, + codec: SseCodec( + decodeSuccessData: sse_decode_CastedPrimitive_u_64, + decodeErrorData: null, + ), + constMeta: kCrateApiApiDateToMsConstMeta, + argValues: [date], + apiImpl: this, + ), + ); } - TaskConstMeta get kCrateApiApiDeleteMessagesConstMeta => const TaskConstMeta( - debugName: "delete_messages", - argNames: ["cloudMessagesClient", "messages"], - ); + TaskConstMeta get kCrateApiApiDateToMsConstMeta => + const TaskConstMeta(debugName: "date_to_ms", argNames: ["date"]); @override - Future crateApiApiDeletePasskey( - {required ArcPasswordManagerDefaultAnisetteProvider passwords, - required String id, - String? group}) { - return handler.executeNormal(NormalTask( - callFfi: (port_) { - final serializer = SseSerializer(generalizedFrbRustBinding); - sse_encode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcPasswordManagerDefaultAnisetteProvider( - passwords, serializer); - sse_encode_String(id, serializer); - sse_encode_opt_String(group, serializer); - pdeCallFfi(generalizedFrbRustBinding, serializer, - funcId: 82, port: port_); - }, - codec: SseCodec( - decodeSuccessData: sse_decode_unit, - decodeErrorData: sse_decode_AnyhowException, - ), - constMeta: kCrateApiApiDeletePasskeyConstMeta, - argValues: [passwords, id, group], - apiImpl: this, - )); + Future crateApiApiDeclineFacetime({ + required ArcFtClient facetime, + required String guid, + }) { + return handler.executeNormal( + NormalTask( + callFfi: (port_) { + final serializer = SseSerializer(generalizedFrbRustBinding); + sse_encode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcFTClient( + facetime, + serializer, + ); + sse_encode_String(guid, serializer); + pdeCallFfi( + generalizedFrbRustBinding, + serializer, + funcId: 81, + port: port_, + ); + }, + codec: SseCodec( + decodeSuccessData: sse_decode_unit, + decodeErrorData: sse_decode_AnyhowException, + ), + constMeta: kCrateApiApiDeclineFacetimeConstMeta, + argValues: [facetime, guid], + apiImpl: this, + ), + ); } - TaskConstMeta get kCrateApiApiDeletePasskeyConstMeta => const TaskConstMeta( - debugName: "delete_passkey", - argNames: ["passwords", "id", "group"], - ); + TaskConstMeta get kCrateApiApiDeclineFacetimeConstMeta => const TaskConstMeta( + debugName: "decline_facetime", + argNames: ["facetime", "guid"], + ); @override - Future crateApiApiDeletePassword( - {required ArcPasswordManagerDefaultAnisetteProvider passwords, - required String id, - String? group}) { - return handler.executeNormal(NormalTask( - callFfi: (port_) { - final serializer = SseSerializer(generalizedFrbRustBinding); - sse_encode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcPasswordManagerDefaultAnisetteProvider( - passwords, serializer); - sse_encode_String(id, serializer); - sse_encode_opt_String(group, serializer); - pdeCallFfi(generalizedFrbRustBinding, serializer, - funcId: 83, port: port_); - }, - codec: SseCodec( - decodeSuccessData: sse_decode_unit, - decodeErrorData: sse_decode_AnyhowException, - ), - constMeta: kCrateApiApiDeletePasswordConstMeta, - argValues: [passwords, id, group], - apiImpl: this, - )); + Future crateApiApiDeclineInvite({ + required ArcPasswordManagerDefaultAnisetteProvider passwords, + required String inviteId, + }) { + return handler.executeNormal( + NormalTask( + callFfi: (port_) { + final serializer = SseSerializer(generalizedFrbRustBinding); + sse_encode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcPasswordManagerDefaultAnisetteProvider( + passwords, + serializer, + ); + sse_encode_String(inviteId, serializer); + pdeCallFfi( + generalizedFrbRustBinding, + serializer, + funcId: 82, + port: port_, + ); + }, + codec: SseCodec( + decodeSuccessData: sse_decode_unit, + decodeErrorData: sse_decode_AnyhowException, + ), + constMeta: kCrateApiApiDeclineInviteConstMeta, + argValues: [passwords, inviteId], + apiImpl: this, + ), + ); } - TaskConstMeta get kCrateApiApiDeletePasswordConstMeta => const TaskConstMeta( - debugName: "delete_password", - argNames: ["passwords", "id", "group"], - ); + TaskConstMeta get kCrateApiApiDeclineInviteConstMeta => const TaskConstMeta( + debugName: "decline_invite", + argNames: ["passwords", "inviteId"], + ); @override - Future crateApiApiDeletePasswordMeta( - {required ArcPasswordManagerDefaultAnisetteProvider passwords, - required String id, - String? group}) { - return handler.executeNormal(NormalTask( - callFfi: (port_) { - final serializer = SseSerializer(generalizedFrbRustBinding); - sse_encode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcPasswordManagerDefaultAnisetteProvider( - passwords, serializer); - sse_encode_String(id, serializer); - sse_encode_opt_String(group, serializer); - pdeCallFfi(generalizedFrbRustBinding, serializer, - funcId: 84, port: port_); - }, - codec: SseCodec( - decodeSuccessData: sse_decode_unit, - decodeErrorData: sse_decode_AnyhowException, - ), - constMeta: kCrateApiApiDeletePasswordMetaConstMeta, - argValues: [passwords, id, group], - apiImpl: this, - )); + AttachmentMeta crateApiApiDecodeAttachmentmeta({ + required GZipWrapperAttachmentMeta wrapped, + }) { + return handler.executeSync( + SyncTask( + callFfi: () { + final serializer = SseSerializer(generalizedFrbRustBinding); + sse_encode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerGZipWrapperAttachmentMeta( + wrapped, + serializer, + ); + return pdeCallFfi(generalizedFrbRustBinding, serializer, funcId: 83)!; + }, + codec: SseCodec( + decodeSuccessData: sse_decode_attachment_meta, + decodeErrorData: null, + ), + constMeta: kCrateApiApiDecodeAttachmentmetaConstMeta, + argValues: [wrapped], + apiImpl: this, + ), + ); } - TaskConstMeta get kCrateApiApiDeletePasswordMetaConstMeta => + TaskConstMeta get kCrateApiApiDecodeAttachmentmetaConstMeta => const TaskConstMeta( - debugName: "delete_password_meta", - argNames: ["passwords", "id", "group"], + debugName: "decode_attachmentmeta", + argNames: ["wrapped"], ); @override - Future crateApiApiDeleteWifiPassword( - {required ArcPasswordManagerDefaultAnisetteProvider passwords, - required String id, - String? group}) { - return handler.executeNormal(NormalTask( - callFfi: (port_) { - final serializer = SseSerializer(generalizedFrbRustBinding); - sse_encode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcPasswordManagerDefaultAnisetteProvider( - passwords, serializer); - sse_encode_String(id, serializer); - sse_encode_opt_String(group, serializer); - pdeCallFfi(generalizedFrbRustBinding, serializer, - funcId: 85, port: port_); - }, - codec: SseCodec( - decodeSuccessData: sse_decode_unit, - decodeErrorData: sse_decode_AnyhowException, - ), - constMeta: kCrateApiApiDeleteWifiPasswordConstMeta, - argValues: [passwords, id, group], - apiImpl: this, - )); + ChatProto crateApiApiDecodeChatproto({ + required GZipWrapperChatProto wrapped, + }) { + return handler.executeSync( + SyncTask( + callFfi: () { + final serializer = SseSerializer(generalizedFrbRustBinding); + sse_encode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerGZipWrapperChatProto( + wrapped, + serializer, + ); + return pdeCallFfi(generalizedFrbRustBinding, serializer, funcId: 84)!; + }, + codec: SseCodec( + decodeSuccessData: sse_decode_chat_proto, + decodeErrorData: null, + ), + constMeta: kCrateApiApiDecodeChatprotoConstMeta, + argValues: [wrapped], + apiImpl: this, + ), + ); } - TaskConstMeta get kCrateApiApiDeleteWifiPasswordConstMeta => - const TaskConstMeta( - debugName: "delete_wifi_password", - argNames: ["passwords", "id", "group"], - ); + TaskConstMeta get kCrateApiApiDecodeChatprotoConstMeta => + const TaskConstMeta(debugName: "decode_chatproto", argNames: ["wrapped"]); @override - Future crateApiApiDoFirstTimeInit({required String path}) { - return handler.executeNormal(NormalTask( - callFfi: (port_) { - final serializer = SseSerializer(generalizedFrbRustBinding); - sse_encode_String(path, serializer); - pdeCallFfi(generalizedFrbRustBinding, serializer, - funcId: 86, port: port_); - }, - codec: SseCodec( - decodeSuccessData: sse_decode_unit, - decodeErrorData: null, - ), - constMeta: kCrateApiApiDoFirstTimeInitConstMeta, - argValues: [path], - apiImpl: this, - )); + ExtensionApp crateApiApiDecodeExtensionApp({ + required List bp, + required String bid, + }) { + return handler.executeSync( + SyncTask( + callFfi: () { + final serializer = SseSerializer(generalizedFrbRustBinding); + sse_encode_list_prim_u_8_loose(bp, serializer); + sse_encode_String(bid, serializer); + return pdeCallFfi(generalizedFrbRustBinding, serializer, funcId: 85)!; + }, + codec: SseCodec( + decodeSuccessData: sse_decode_extension_app, + decodeErrorData: sse_decode_AnyhowException, + ), + constMeta: kCrateApiApiDecodeExtensionAppConstMeta, + argValues: [bp, bid], + apiImpl: this, + ), + ); } - TaskConstMeta get kCrateApiApiDoFirstTimeInitConstMeta => const TaskConstMeta( - debugName: "do_first_time_init", - argNames: ["path"], + TaskConstMeta get kCrateApiApiDecodeExtensionAppConstMeta => + const TaskConstMeta( + debugName: "decode_extension_app", + argNames: ["bp", "bid"], ); @override - Future crateApiApiDoLogin( - {required String path, - required ArcMutexAppleAccountDefaultAnisetteProvider account, - UpdateAccountFinish? finish, - required JoinedOsConfig osConfig}) { - return handler.executeNormal(NormalTask( - callFfi: (port_) { - final serializer = SseSerializer(generalizedFrbRustBinding); - sse_encode_String(path, serializer); - sse_encode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcMutexAppleAccountDefaultAnisetteProvider( - account, serializer); - sse_encode_opt_box_autoadd_update_account_finish(finish, serializer); - sse_encode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerJoinedOSConfig( - osConfig, serializer); - pdeCallFfi(generalizedFrbRustBinding, serializer, - funcId: 87, port: port_); - }, - codec: SseCodec( - decodeSuccessData: - sse_decode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerIDSUser, - decodeErrorData: sse_decode_AnyhowException, - ), - constMeta: kCrateApiApiDoLoginConstMeta, - argValues: [path, account, finish, osConfig], - apiImpl: this, - )); + IdsngmIdentity crateApiApiDecodeIdentity({required List identity}) { + return handler.executeSync( + SyncTask( + callFfi: () { + final serializer = SseSerializer(generalizedFrbRustBinding); + sse_encode_list_prim_u_8_loose(identity, serializer); + return pdeCallFfi(generalizedFrbRustBinding, serializer, funcId: 86)!; + }, + codec: SseCodec( + decodeSuccessData: + sse_decode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerIDSNGMIdentity, + decodeErrorData: sse_decode_AnyhowException, + ), + constMeta: kCrateApiApiDecodeIdentityConstMeta, + argValues: [identity], + apiImpl: this, + ), + ); } - TaskConstMeta get kCrateApiApiDoLoginConstMeta => const TaskConstMeta( - debugName: "do_login", - argNames: ["path", "account", "finish", "osConfig"], - ); + TaskConstMeta get kCrateApiApiDecodeIdentityConstMeta => + const TaskConstMeta(debugName: "decode_identity", argNames: ["identity"]); @override - Future crateApiApiDoReregister({required ArcImClient state}) { - return handler.executeNormal(NormalTask( - callFfi: (port_) { - final serializer = SseSerializer(generalizedFrbRustBinding); - sse_encode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcIMClient( - state, serializer); - pdeCallFfi(generalizedFrbRustBinding, serializer, - funcId: 88, port: port_); - }, - codec: SseCodec( - decodeSuccessData: sse_decode_unit, - decodeErrorData: sse_decode_AnyhowException, - ), - constMeta: kCrateApiApiDoReregisterConstMeta, - argValues: [state], - apiImpl: this, - )); + MessageSummaryInfo crateApiApiDecodeMessageInfo({required List data}) { + return handler.executeSync( + SyncTask( + callFfi: () { + final serializer = SseSerializer(generalizedFrbRustBinding); + sse_encode_list_prim_u_8_loose(data, serializer); + return pdeCallFfi(generalizedFrbRustBinding, serializer, funcId: 87)!; + }, + codec: SseCodec( + decodeSuccessData: sse_decode_message_summary_info, + decodeErrorData: sse_decode_AnyhowException, + ), + constMeta: kCrateApiApiDecodeMessageInfoConstMeta, + argValues: [data], + apiImpl: this, + ), + ); } - TaskConstMeta get kCrateApiApiDoReregisterConstMeta => const TaskConstMeta( - debugName: "do_reregister", - argNames: ["state"], - ); + TaskConstMeta get kCrateApiApiDecodeMessageInfoConstMeta => + const TaskConstMeta(debugName: "decode_message_info", argNames: ["data"]); @override - Stream crateApiApiDownloadAttachment( - {required ApsConnection aps, - required Attachment attachment, - required String path}) { - final sink = RustStreamSink(); - unawaited(handler.executeNormal(NormalTask( - callFfi: (port_) { - final serializer = SseSerializer(generalizedFrbRustBinding); - sse_encode_StreamSink_transfer_progress_Sse(sink, serializer); - sse_encode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerAPSConnection( - aps, serializer); - sse_encode_box_autoadd_attachment(attachment, serializer); - sse_encode_String(path, serializer); - pdeCallFfi(generalizedFrbRustBinding, serializer, - funcId: 89, port: port_); - }, - codec: SseCodec( - decodeSuccessData: sse_decode_unit, - decodeErrorData: null, - ), - constMeta: kCrateApiApiDownloadAttachmentConstMeta, - argValues: [sink, aps, attachment, path], - apiImpl: this, - ))); - return sink.stream; + MessageProto crateApiApiDecodeMessageproto({ + required GZipWrapperMessageProto wrapped, + }) { + return handler.executeSync( + SyncTask( + callFfi: () { + final serializer = SseSerializer(generalizedFrbRustBinding); + sse_encode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerGZipWrapperMessageProto( + wrapped, + serializer, + ); + return pdeCallFfi(generalizedFrbRustBinding, serializer, funcId: 88)!; + }, + codec: SseCodec( + decodeSuccessData: sse_decode_message_proto, + decodeErrorData: null, + ), + constMeta: kCrateApiApiDecodeMessageprotoConstMeta, + argValues: [wrapped], + apiImpl: this, + ), + ); } - TaskConstMeta get kCrateApiApiDownloadAttachmentConstMeta => + TaskConstMeta get kCrateApiApiDecodeMessageprotoConstMeta => const TaskConstMeta( - debugName: "download_attachment", - argNames: ["sink", "aps", "attachment", "path"], + debugName: "decode_messageproto", + argNames: ["wrapped"], ); @override - Future crateApiApiDownloadCloudAttachments( - {required ArcCloudMessagesClientDefaultAnisetteProvider - cloudMessagesClient, - required List<(String, String)> files}) { - return handler.executeNormal(NormalTask( - callFfi: (port_) { - final serializer = SseSerializer(generalizedFrbRustBinding); - sse_encode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcCloudMessagesClientDefaultAnisetteProvider( - cloudMessagesClient, serializer); - sse_encode_list_record_string_string(files, serializer); - pdeCallFfi(generalizedFrbRustBinding, serializer, - funcId: 90, port: port_); - }, - codec: SseCodec( - decodeSuccessData: sse_decode_unit, - decodeErrorData: sse_decode_AnyhowException, - ), - constMeta: kCrateApiApiDownloadCloudAttachmentsConstMeta, - argValues: [cloudMessagesClient, files], - apiImpl: this, - )); + MessageProto2 crateApiApiDecodeMessageproto2({ + required GZipWrapperMessageProto2 wrapped, + }) { + return handler.executeSync( + SyncTask( + callFfi: () { + final serializer = SseSerializer(generalizedFrbRustBinding); + sse_encode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerGZipWrapperMessageProto2( + wrapped, + serializer, + ); + return pdeCallFfi(generalizedFrbRustBinding, serializer, funcId: 89)!; + }, + codec: SseCodec( + decodeSuccessData: sse_decode_message_proto_2, + decodeErrorData: null, + ), + constMeta: kCrateApiApiDecodeMessageproto2ConstMeta, + argValues: [wrapped], + apiImpl: this, + ), + ); } - TaskConstMeta get kCrateApiApiDownloadCloudAttachmentsConstMeta => + TaskConstMeta get kCrateApiApiDecodeMessageproto2ConstMeta => const TaskConstMeta( - debugName: "download_cloud_attachments", - argNames: ["cloudMessagesClient", "files"], + debugName: "decode_messageproto2", + argNames: ["wrapped"], ); @override - Future crateApiApiDownloadCloudGroupPhotos( - {required ArcCloudMessagesClientDefaultAnisetteProvider - cloudMessagesClient, - required List<(String, String)> files}) { - return handler.executeNormal(NormalTask( - callFfi: (port_) { - final serializer = SseSerializer(generalizedFrbRustBinding); - sse_encode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcCloudMessagesClientDefaultAnisetteProvider( - cloudMessagesClient, serializer); - sse_encode_list_record_string_string(files, serializer); - pdeCallFfi(generalizedFrbRustBinding, serializer, - funcId: 91, port: port_); - }, - codec: SseCodec( - decodeSuccessData: sse_decode_unit, - decodeErrorData: sse_decode_AnyhowException, - ), - constMeta: kCrateApiApiDownloadCloudGroupPhotosConstMeta, - argValues: [cloudMessagesClient, files], - apiImpl: this, - )); + MessageProto3 crateApiApiDecodeMessageproto3({ + required GZipWrapperMessageProto3 wrapped, + }) { + return handler.executeSync( + SyncTask( + callFfi: () { + final serializer = SseSerializer(generalizedFrbRustBinding); + sse_encode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerGZipWrapperMessageProto3( + wrapped, + serializer, + ); + return pdeCallFfi(generalizedFrbRustBinding, serializer, funcId: 90)!; + }, + codec: SseCodec( + decodeSuccessData: sse_decode_message_proto_3, + decodeErrorData: null, + ), + constMeta: kCrateApiApiDecodeMessageproto3ConstMeta, + argValues: [wrapped], + apiImpl: this, + ), + ); } - TaskConstMeta get kCrateApiApiDownloadCloudGroupPhotosConstMeta => + TaskConstMeta get kCrateApiApiDecodeMessageproto3ConstMeta => const TaskConstMeta( - debugName: "download_cloud_group_photos", - argNames: ["cloudMessagesClient", "files"], + debugName: "decode_messageproto3", + argNames: ["wrapped"], ); @override - Stream crateApiApiDownloadMmcs( - {required ApsConnection aps, - required MMCSFile attachment, - required String path}) { - final sink = RustStreamSink(); - unawaited(handler.executeNormal(NormalTask( - callFfi: (port_) { - final serializer = SseSerializer(generalizedFrbRustBinding); - sse_encode_StreamSink_transfer_progress_Sse(sink, serializer); - sse_encode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerAPSConnection( - aps, serializer); - sse_encode_box_autoadd_mmcs_file(attachment, serializer); - sse_encode_String(path, serializer); - pdeCallFfi(generalizedFrbRustBinding, serializer, - funcId: 92, port: port_); - }, - codec: SseCodec( - decodeSuccessData: sse_decode_unit, - decodeErrorData: null, - ), - constMeta: kCrateApiApiDownloadMmcsConstMeta, - argValues: [sink, aps, attachment, path], - apiImpl: this, - ))); - return sink.stream; + MessageProto4 crateApiApiDecodeMessageproto4({ + required GZipWrapperMessageProto4 wrapped, + }) { + return handler.executeSync( + SyncTask( + callFfi: () { + final serializer = SseSerializer(generalizedFrbRustBinding); + sse_encode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerGZipWrapperMessageProto4( + wrapped, + serializer, + ); + return pdeCallFfi(generalizedFrbRustBinding, serializer, funcId: 91)!; + }, + codec: SseCodec( + decodeSuccessData: sse_decode_message_proto_4, + decodeErrorData: null, + ), + constMeta: kCrateApiApiDecodeMessageproto4ConstMeta, + argValues: [wrapped], + apiImpl: this, + ), + ); } - TaskConstMeta get kCrateApiApiDownloadMmcsConstMeta => const TaskConstMeta( - debugName: "download_mmcs", - argNames: ["sink", "aps", "attachment", "path"], + TaskConstMeta get kCrateApiApiDecodeMessageproto4ConstMeta => + const TaskConstMeta( + debugName: "decode_messageproto4", + argNames: ["wrapped"], ); @override - (ArcSharedPushState, SharedPushState) crateApiApiDupDaemonDesk( - {required SharedPushState state}) { - return handler.executeSync(SyncTask( - callFfi: () { - final serializer = SseSerializer(generalizedFrbRustBinding); - sse_encode_box_autoadd_shared_push_state(state, serializer); - return pdeCallFfi(generalizedFrbRustBinding, serializer, funcId: 93)!; - }, - codec: SseCodec( - decodeSuccessData: - sse_decode_record_auto_owned_rust_opaque_flutter_rust_bridgefor_generated_rust_auto_opaque_inner_arc_shared_push_state_shared_push_state, - decodeErrorData: null, - ), - constMeta: kCrateApiApiDupDaemonDeskConstMeta, - argValues: [state], - apiImpl: this, - )); + Future crateApiApiDecodeProfileMessage({ + required String s, + }) { + return handler.executeNormal( + NormalTask( + callFfi: (port_) { + final serializer = SseSerializer(generalizedFrbRustBinding); + sse_encode_String(s, serializer); + pdeCallFfi( + generalizedFrbRustBinding, + serializer, + funcId: 92, + port: port_, + ); + }, + codec: SseCodec( + decodeSuccessData: sse_decode_share_profile_message, + decodeErrorData: sse_decode_AnyhowException, + ), + constMeta: kCrateApiApiDecodeProfileMessageConstMeta, + argValues: [s], + apiImpl: this, + ), + ); } - TaskConstMeta get kCrateApiApiDupDaemonDeskConstMeta => const TaskConstMeta( - debugName: "dup_daemon_desk", - argNames: ["state"], - ); + TaskConstMeta get kCrateApiApiDecodeProfileMessageConstMeta => + const TaskConstMeta(debugName: "decode_profile_message", argNames: ["s"]); @override - IdsUser crateApiApiDuplicateUser({required IdsUser user}) { - return handler.executeSync(SyncTask( - callFfi: () { - final serializer = SseSerializer(generalizedFrbRustBinding); - sse_encode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerIDSUser( - user, serializer); - return pdeCallFfi(generalizedFrbRustBinding, serializer, funcId: 94)!; - }, - codec: SseCodec( - decodeSuccessData: - sse_decode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerIDSUser, - decodeErrorData: null, - ), - constMeta: kCrateApiApiDuplicateUserConstMeta, - argValues: [user], - apiImpl: this, - )); + Future crateApiApiDecodeSummaryInfo({ + required List info, + }) { + return handler.executeNormal( + NormalTask( + callFfi: (port_) { + final serializer = SseSerializer(generalizedFrbRustBinding); + sse_encode_list_prim_u_8_loose(info, serializer); + pdeCallFfi( + generalizedFrbRustBinding, + serializer, + funcId: 93, + port: port_, + ); + }, + codec: SseCodec( + decodeSuccessData: sse_decode_message_summary_info, + decodeErrorData: null, + ), + constMeta: kCrateApiApiDecodeSummaryInfoConstMeta, + argValues: [info], + apiImpl: this, + ), + ); } - TaskConstMeta get kCrateApiApiDuplicateUserConstMeta => const TaskConstMeta( - debugName: "duplicate_user", - argNames: ["user"], - ); + TaskConstMeta get kCrateApiApiDecodeSummaryInfoConstMeta => + const TaskConstMeta(debugName: "decode_summary_info", argNames: ["info"]); @override - GZipWrapperAttachmentMeta crateApiApiEncodeAttachmentmeta( - {required AttachmentMeta attachmentmeta}) { - return handler.executeSync(SyncTask( - callFfi: () { - final serializer = SseSerializer(generalizedFrbRustBinding); - sse_encode_box_autoadd_attachment_meta(attachmentmeta, serializer); - return pdeCallFfi(generalizedFrbRustBinding, serializer, funcId: 95)!; - }, - codec: SseCodec( - decodeSuccessData: - sse_decode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerGZipWrapperAttachmentMeta, - decodeErrorData: null, - ), - constMeta: kCrateApiApiEncodeAttachmentmetaConstMeta, - argValues: [attachmentmeta], - apiImpl: this, - )); + Future crateApiApiDeleteAttachments({ + required ArcCloudMessagesClientDefaultAnisetteProvider cloudMessagesClient, + required List attachments, + }) { + return handler.executeNormal( + NormalTask( + callFfi: (port_) { + final serializer = SseSerializer(generalizedFrbRustBinding); + sse_encode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcCloudMessagesClientDefaultAnisetteProvider( + cloudMessagesClient, + serializer, + ); + sse_encode_list_String(attachments, serializer); + pdeCallFfi( + generalizedFrbRustBinding, + serializer, + funcId: 94, + port: port_, + ); + }, + codec: SseCodec( + decodeSuccessData: sse_decode_unit, + decodeErrorData: sse_decode_AnyhowException, + ), + constMeta: kCrateApiApiDeleteAttachmentsConstMeta, + argValues: [cloudMessagesClient, attachments], + apiImpl: this, + ), + ); } - TaskConstMeta get kCrateApiApiEncodeAttachmentmetaConstMeta => + TaskConstMeta get kCrateApiApiDeleteAttachmentsConstMeta => const TaskConstMeta( - debugName: "encode_attachmentmeta", - argNames: ["attachmentmeta"], + debugName: "delete_attachments", + argNames: ["cloudMessagesClient", "attachments"], ); @override - GZipWrapperChatProto crateApiApiEncodeChatproto({required ChatProto chat}) { - return handler.executeSync(SyncTask( - callFfi: () { - final serializer = SseSerializer(generalizedFrbRustBinding); - sse_encode_box_autoadd_chat_proto(chat, serializer); - return pdeCallFfi(generalizedFrbRustBinding, serializer, funcId: 96)!; - }, - codec: SseCodec( - decodeSuccessData: - sse_decode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerGZipWrapperChatProto, - decodeErrorData: null, - ), - constMeta: kCrateApiApiEncodeChatprotoConstMeta, - argValues: [chat], - apiImpl: this, - )); + Future crateApiApiDeleteBeaconShare({ + required ArcFindMyClientDefaultAnisetteProvider items, + required String share, + }) { + return handler.executeNormal( + NormalTask( + callFfi: (port_) { + final serializer = SseSerializer(generalizedFrbRustBinding); + sse_encode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcFindMyClientDefaultAnisetteProvider( + items, + serializer, + ); + sse_encode_String(share, serializer); + pdeCallFfi( + generalizedFrbRustBinding, + serializer, + funcId: 95, + port: port_, + ); + }, + codec: SseCodec( + decodeSuccessData: sse_decode_unit, + decodeErrorData: sse_decode_AnyhowException, + ), + constMeta: kCrateApiApiDeleteBeaconShareConstMeta, + argValues: [items, share], + apiImpl: this, + ), + ); } - TaskConstMeta get kCrateApiApiEncodeChatprotoConstMeta => const TaskConstMeta( - debugName: "encode_chatproto", - argNames: ["chat"], + TaskConstMeta get kCrateApiApiDeleteBeaconShareConstMeta => + const TaskConstMeta( + debugName: "delete_beacon_share", + argNames: ["items", "share"], ); @override - (Uint8List, Uint8List?) crateApiApiEncodeExtensionApp( - {required ExtensionApp app}) { - return handler.executeSync(SyncTask( - callFfi: () { - final serializer = SseSerializer(generalizedFrbRustBinding); - sse_encode_box_autoadd_extension_app(app, serializer); - return pdeCallFfi(generalizedFrbRustBinding, serializer, funcId: 97)!; - }, - codec: SseCodec( - decodeSuccessData: - sse_decode_record_list_prim_u_8_strict_opt_list_prim_u_8_strict, - decodeErrorData: sse_decode_AnyhowException, - ), - constMeta: kCrateApiApiEncodeExtensionAppConstMeta, - argValues: [app], - apiImpl: this, - )); + Future crateApiApiDeleteChats({ + required ArcCloudMessagesClientDefaultAnisetteProvider cloudMessagesClient, + required List chats, + }) { + return handler.executeNormal( + NormalTask( + callFfi: (port_) { + final serializer = SseSerializer(generalizedFrbRustBinding); + sse_encode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcCloudMessagesClientDefaultAnisetteProvider( + cloudMessagesClient, + serializer, + ); + sse_encode_list_String(chats, serializer); + pdeCallFfi( + generalizedFrbRustBinding, + serializer, + funcId: 96, + port: port_, + ); + }, + codec: SseCodec( + decodeSuccessData: sse_decode_unit, + decodeErrorData: sse_decode_AnyhowException, + ), + constMeta: kCrateApiApiDeleteChatsConstMeta, + argValues: [cloudMessagesClient, chats], + apiImpl: this, + ), + ); } - TaskConstMeta get kCrateApiApiEncodeExtensionAppConstMeta => - const TaskConstMeta( - debugName: "encode_extension_app", - argNames: ["app"], - ); + TaskConstMeta get kCrateApiApiDeleteChatsConstMeta => const TaskConstMeta( + debugName: "delete_chats", + argNames: ["cloudMessagesClient", "chats"], + ); @override - Future crateApiApiEncodeHex({required List bytes}) { - return handler.executeNormal(NormalTask( - callFfi: (port_) { - final serializer = SseSerializer(generalizedFrbRustBinding); - sse_encode_list_prim_u_8_loose(bytes, serializer); - pdeCallFfi(generalizedFrbRustBinding, serializer, - funcId: 98, port: port_); - }, - codec: SseCodec( - decodeSuccessData: sse_decode_String, - decodeErrorData: null, - ), - constMeta: kCrateApiApiEncodeHexConstMeta, - argValues: [bytes], - apiImpl: this, - )); + Future crateApiApiDeleteGroup({ + required ArcPasswordManagerDefaultAnisetteProvider passwords, + required String gid, + }) { + return handler.executeNormal( + NormalTask( + callFfi: (port_) { + final serializer = SseSerializer(generalizedFrbRustBinding); + sse_encode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcPasswordManagerDefaultAnisetteProvider( + passwords, + serializer, + ); + sse_encode_String(gid, serializer); + pdeCallFfi( + generalizedFrbRustBinding, + serializer, + funcId: 97, + port: port_, + ); + }, + codec: SseCodec( + decodeSuccessData: sse_decode_unit, + decodeErrorData: sse_decode_AnyhowException, + ), + constMeta: kCrateApiApiDeleteGroupConstMeta, + argValues: [passwords, gid], + apiImpl: this, + ), + ); } - TaskConstMeta get kCrateApiApiEncodeHexConstMeta => const TaskConstMeta( - debugName: "encode_hex", - argNames: ["bytes"], - ); + TaskConstMeta get kCrateApiApiDeleteGroupConstMeta => const TaskConstMeta( + debugName: "delete_group", + argNames: ["passwords", "gid"], + ); @override - Uint8List crateApiApiEncodeMessageInfo({required MessageSummaryInfo info}) { - return handler.executeSync(SyncTask( - callFfi: () { - final serializer = SseSerializer(generalizedFrbRustBinding); - sse_encode_box_autoadd_message_summary_info(info, serializer); - return pdeCallFfi(generalizedFrbRustBinding, serializer, funcId: 99)!; - }, - codec: SseCodec( - decodeSuccessData: sse_decode_list_prim_u_8_strict, - decodeErrorData: null, - ), - constMeta: kCrateApiApiEncodeMessageInfoConstMeta, - argValues: [info], - apiImpl: this, - )); + Future crateApiApiDeleteMessages({ + required ArcCloudMessagesClientDefaultAnisetteProvider cloudMessagesClient, + required List messages, + }) { + return handler.executeNormal( + NormalTask( + callFfi: (port_) { + final serializer = SseSerializer(generalizedFrbRustBinding); + sse_encode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcCloudMessagesClientDefaultAnisetteProvider( + cloudMessagesClient, + serializer, + ); + sse_encode_list_String(messages, serializer); + pdeCallFfi( + generalizedFrbRustBinding, + serializer, + funcId: 98, + port: port_, + ); + }, + codec: SseCodec( + decodeSuccessData: sse_decode_unit, + decodeErrorData: sse_decode_AnyhowException, + ), + constMeta: kCrateApiApiDeleteMessagesConstMeta, + argValues: [cloudMessagesClient, messages], + apiImpl: this, + ), + ); } - TaskConstMeta get kCrateApiApiEncodeMessageInfoConstMeta => - const TaskConstMeta( - debugName: "encode_message_info", - argNames: ["info"], - ); + TaskConstMeta get kCrateApiApiDeleteMessagesConstMeta => const TaskConstMeta( + debugName: "delete_messages", + argNames: ["cloudMessagesClient", "messages"], + ); @override - GZipWrapperMessageProto crateApiApiEncodeMessageproto( - {required MessageProto messageproto}) { - return handler.executeSync(SyncTask( - callFfi: () { - final serializer = SseSerializer(generalizedFrbRustBinding); - sse_encode_box_autoadd_message_proto(messageproto, serializer); - return pdeCallFfi(generalizedFrbRustBinding, serializer, funcId: 100)!; - }, - codec: SseCodec( - decodeSuccessData: - sse_decode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerGZipWrapperMessageProto, - decodeErrorData: null, - ), - constMeta: kCrateApiApiEncodeMessageprotoConstMeta, - argValues: [messageproto], - apiImpl: this, - )); + Future crateApiApiDeletePasskey({ + required ArcPasswordManagerDefaultAnisetteProvider passwords, + required String id, + String? group, + }) { + return handler.executeNormal( + NormalTask( + callFfi: (port_) { + final serializer = SseSerializer(generalizedFrbRustBinding); + sse_encode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcPasswordManagerDefaultAnisetteProvider( + passwords, + serializer, + ); + sse_encode_String(id, serializer); + sse_encode_opt_String(group, serializer); + pdeCallFfi( + generalizedFrbRustBinding, + serializer, + funcId: 99, + port: port_, + ); + }, + codec: SseCodec( + decodeSuccessData: sse_decode_unit, + decodeErrorData: sse_decode_AnyhowException, + ), + constMeta: kCrateApiApiDeletePasskeyConstMeta, + argValues: [passwords, id, group], + apiImpl: this, + ), + ); } - TaskConstMeta get kCrateApiApiEncodeMessageprotoConstMeta => - const TaskConstMeta( - debugName: "encode_messageproto", - argNames: ["messageproto"], - ); + TaskConstMeta get kCrateApiApiDeletePasskeyConstMeta => const TaskConstMeta( + debugName: "delete_passkey", + argNames: ["passwords", "id", "group"], + ); @override - GZipWrapperMessageProto2 crateApiApiEncodeMessageproto2( - {required MessageProto2 messageproto2}) { - return handler.executeSync(SyncTask( - callFfi: () { - final serializer = SseSerializer(generalizedFrbRustBinding); - sse_encode_box_autoadd_message_proto_2(messageproto2, serializer); - return pdeCallFfi(generalizedFrbRustBinding, serializer, funcId: 101)!; - }, - codec: SseCodec( - decodeSuccessData: - sse_decode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerGZipWrapperMessageProto2, - decodeErrorData: null, - ), - constMeta: kCrateApiApiEncodeMessageproto2ConstMeta, - argValues: [messageproto2], - apiImpl: this, - )); - } - - TaskConstMeta get kCrateApiApiEncodeMessageproto2ConstMeta => - const TaskConstMeta( - debugName: "encode_messageproto2", - argNames: ["messageproto2"], - ); + Future crateApiApiDeletePassword({ + required ArcPasswordManagerDefaultAnisetteProvider passwords, + required String id, + String? group, + }) { + return handler.executeNormal( + NormalTask( + callFfi: (port_) { + final serializer = SseSerializer(generalizedFrbRustBinding); + sse_encode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcPasswordManagerDefaultAnisetteProvider( + passwords, + serializer, + ); + sse_encode_String(id, serializer); + sse_encode_opt_String(group, serializer); + pdeCallFfi( + generalizedFrbRustBinding, + serializer, + funcId: 100, + port: port_, + ); + }, + codec: SseCodec( + decodeSuccessData: sse_decode_unit, + decodeErrorData: sse_decode_AnyhowException, + ), + constMeta: kCrateApiApiDeletePasswordConstMeta, + argValues: [passwords, id, group], + apiImpl: this, + ), + ); + } + + TaskConstMeta get kCrateApiApiDeletePasswordConstMeta => const TaskConstMeta( + debugName: "delete_password", + argNames: ["passwords", "id", "group"], + ); @override - GZipWrapperMessageProto3 crateApiApiEncodeMessageproto3( - {required MessageProto3 messageproto3}) { - return handler.executeSync(SyncTask( - callFfi: () { - final serializer = SseSerializer(generalizedFrbRustBinding); - sse_encode_box_autoadd_message_proto_3(messageproto3, serializer); - return pdeCallFfi(generalizedFrbRustBinding, serializer, funcId: 102)!; - }, - codec: SseCodec( - decodeSuccessData: - sse_decode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerGZipWrapperMessageProto3, - decodeErrorData: null, - ), - constMeta: kCrateApiApiEncodeMessageproto3ConstMeta, - argValues: [messageproto3], - apiImpl: this, - )); + Future crateApiApiDeletePasswordMeta({ + required ArcPasswordManagerDefaultAnisetteProvider passwords, + required String id, + String? group, + }) { + return handler.executeNormal( + NormalTask( + callFfi: (port_) { + final serializer = SseSerializer(generalizedFrbRustBinding); + sse_encode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcPasswordManagerDefaultAnisetteProvider( + passwords, + serializer, + ); + sse_encode_String(id, serializer); + sse_encode_opt_String(group, serializer); + pdeCallFfi( + generalizedFrbRustBinding, + serializer, + funcId: 101, + port: port_, + ); + }, + codec: SseCodec( + decodeSuccessData: sse_decode_unit, + decodeErrorData: sse_decode_AnyhowException, + ), + constMeta: kCrateApiApiDeletePasswordMetaConstMeta, + argValues: [passwords, id, group], + apiImpl: this, + ), + ); } - TaskConstMeta get kCrateApiApiEncodeMessageproto3ConstMeta => + TaskConstMeta get kCrateApiApiDeletePasswordMetaConstMeta => const TaskConstMeta( - debugName: "encode_messageproto3", - argNames: ["messageproto3"], + debugName: "delete_password_meta", + argNames: ["passwords", "id", "group"], ); @override - GZipWrapperMessageProto4 crateApiApiEncodeMessageproto4( - {required MessageProto4 messageproto4}) { - return handler.executeSync(SyncTask( - callFfi: () { - final serializer = SseSerializer(generalizedFrbRustBinding); - sse_encode_box_autoadd_message_proto_4(messageproto4, serializer); - return pdeCallFfi(generalizedFrbRustBinding, serializer, funcId: 103)!; - }, - codec: SseCodec( - decodeSuccessData: - sse_decode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerGZipWrapperMessageProto4, - decodeErrorData: null, - ), - constMeta: kCrateApiApiEncodeMessageproto4ConstMeta, - argValues: [messageproto4], - apiImpl: this, - )); + Future crateApiApiDeleteWifiPassword({ + required ArcPasswordManagerDefaultAnisetteProvider passwords, + required String id, + String? group, + }) { + return handler.executeNormal( + NormalTask( + callFfi: (port_) { + final serializer = SseSerializer(generalizedFrbRustBinding); + sse_encode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcPasswordManagerDefaultAnisetteProvider( + passwords, + serializer, + ); + sse_encode_String(id, serializer); + sse_encode_opt_String(group, serializer); + pdeCallFfi( + generalizedFrbRustBinding, + serializer, + funcId: 102, + port: port_, + ); + }, + codec: SseCodec( + decodeSuccessData: sse_decode_unit, + decodeErrorData: sse_decode_AnyhowException, + ), + constMeta: kCrateApiApiDeleteWifiPasswordConstMeta, + argValues: [passwords, id, group], + apiImpl: this, + ), + ); } - TaskConstMeta get kCrateApiApiEncodeMessageproto4ConstMeta => + TaskConstMeta get kCrateApiApiDeleteWifiPasswordConstMeta => const TaskConstMeta( - debugName: "encode_messageproto4", - argNames: ["messageproto4"], + debugName: "delete_wifi_password", + argNames: ["passwords", "id", "group"], ); @override - Future crateApiApiEncodeProfileMessage( - {required ShareProfileMessage p}) { - return handler.executeNormal(NormalTask( - callFfi: (port_) { - final serializer = SseSerializer(generalizedFrbRustBinding); - sse_encode_box_autoadd_share_profile_message(p, serializer); - pdeCallFfi(generalizedFrbRustBinding, serializer, - funcId: 104, port: port_); - }, - codec: SseCodec( - decodeSuccessData: sse_decode_String, - decodeErrorData: null, - ), - constMeta: kCrateApiApiEncodeProfileMessageConstMeta, - argValues: [p], - apiImpl: this, - )); + Future crateApiApiDoFirstTimeInit({required String path}) { + return handler.executeNormal( + NormalTask( + callFfi: (port_) { + final serializer = SseSerializer(generalizedFrbRustBinding); + sse_encode_String(path, serializer); + pdeCallFfi( + generalizedFrbRustBinding, + serializer, + funcId: 103, + port: port_, + ); + }, + codec: SseCodec( + decodeSuccessData: sse_decode_unit, + decodeErrorData: null, + ), + constMeta: kCrateApiApiDoFirstTimeInitConstMeta, + argValues: [path], + apiImpl: this, + ), + ); } - TaskConstMeta get kCrateApiApiEncodeProfileMessageConstMeta => - const TaskConstMeta( - debugName: "encode_profile_message", - argNames: ["p"], - ); + TaskConstMeta get kCrateApiApiDoFirstTimeInitConstMeta => + const TaskConstMeta(debugName: "do_first_time_init", argNames: ["path"]); @override - Future crateApiApiEncodeSummaryInfo( - {required MessageSummaryInfo info}) { - return handler.executeNormal(NormalTask( - callFfi: (port_) { - final serializer = SseSerializer(generalizedFrbRustBinding); - sse_encode_box_autoadd_message_summary_info(info, serializer); - pdeCallFfi(generalizedFrbRustBinding, serializer, - funcId: 105, port: port_); - }, - codec: SseCodec( - decodeSuccessData: sse_decode_list_prim_u_8_strict, - decodeErrorData: null, - ), - constMeta: kCrateApiApiEncodeSummaryInfoConstMeta, - argValues: [info], - apiImpl: this, - )); + Future crateApiApiDoLogin({ + required String path, + required ArcMutexAppleAccountDefaultAnisetteProvider account, + UpdateAccountFinish? finish, + required JoinedOsConfig osConfig, + }) { + return handler.executeNormal( + NormalTask( + callFfi: (port_) { + final serializer = SseSerializer(generalizedFrbRustBinding); + sse_encode_String(path, serializer); + sse_encode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcMutexAppleAccountDefaultAnisetteProvider( + account, + serializer, + ); + sse_encode_opt_box_autoadd_update_account_finish(finish, serializer); + sse_encode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerJoinedOSConfig( + osConfig, + serializer, + ); + pdeCallFfi( + generalizedFrbRustBinding, + serializer, + funcId: 104, + port: port_, + ); + }, + codec: SseCodec( + decodeSuccessData: + sse_decode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerIDSUser, + decodeErrorData: sse_decode_AnyhowException, + ), + constMeta: kCrateApiApiDoLoginConstMeta, + argValues: [path, account, finish, osConfig], + apiImpl: this, + ), + ); } - TaskConstMeta get kCrateApiApiEncodeSummaryInfoConstMeta => - const TaskConstMeta( - debugName: "encode_summary_info", - argNames: ["info"], - ); + TaskConstMeta get kCrateApiApiDoLoginConstMeta => const TaskConstMeta( + debugName: "do_login", + argNames: ["path", "account", "finish", "osConfig"], + ); @override - Future crateApiApiFetchProfile( - {required ArcProfilesClientDefaultAnisetteProvider profiles, - required ShareProfileMessage message}) { - return handler.executeNormal(NormalTask( - callFfi: (port_) { - final serializer = SseSerializer(generalizedFrbRustBinding); - sse_encode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcProfilesClientDefaultAnisetteProvider( - profiles, serializer); - sse_encode_box_autoadd_share_profile_message(message, serializer); - pdeCallFfi(generalizedFrbRustBinding, serializer, - funcId: 106, port: port_); - }, - codec: SseCodec( - decodeSuccessData: sse_decode_i_message_nickname_record, - decodeErrorData: sse_decode_AnyhowException, - ), - constMeta: kCrateApiApiFetchProfileConstMeta, - argValues: [profiles, message], - apiImpl: this, - )); + Future crateApiApiDoReregister({required ArcImClient state}) { + return handler.executeNormal( + NormalTask( + callFfi: (port_) { + final serializer = SseSerializer(generalizedFrbRustBinding); + sse_encode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcIMClient( + state, + serializer, + ); + pdeCallFfi( + generalizedFrbRustBinding, + serializer, + funcId: 105, + port: port_, + ); + }, + codec: SseCodec( + decodeSuccessData: sse_decode_unit, + decodeErrorData: sse_decode_AnyhowException, + ), + constMeta: kCrateApiApiDoReregisterConstMeta, + argValues: [state], + apiImpl: this, + ), + ); } - TaskConstMeta get kCrateApiApiFetchProfileConstMeta => const TaskConstMeta( - debugName: "fetch_profile", - argNames: ["profiles", "message"], - ); + TaskConstMeta get kCrateApiApiDoReregisterConstMeta => + const TaskConstMeta(debugName: "do_reregister", argNames: ["state"]); @override - Future crateApiApiFfiFilePackagerDefault() { - return handler.executeNormal(NormalTask( - callFfi: (port_) { - final serializer = SseSerializer(generalizedFrbRustBinding); - pdeCallFfi(generalizedFrbRustBinding, serializer, - funcId: 107, port: port_); - }, - codec: SseCodec( - decodeSuccessData: sse_decode_ffi_file_packager, - decodeErrorData: null, - ), - constMeta: kCrateApiApiFfiFilePackagerDefaultConstMeta, - argValues: [], - apiImpl: this, - )); + Stream crateApiApiDownloadAttachment({ + required ApsConnection aps, + required Attachment attachment, + required String path, + }) { + final sink = RustStreamSink(); + unawaited( + handler.executeNormal( + NormalTask( + callFfi: (port_) { + final serializer = SseSerializer(generalizedFrbRustBinding); + sse_encode_StreamSink_transfer_progress_Sse(sink, serializer); + sse_encode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerAPSConnection( + aps, + serializer, + ); + sse_encode_box_autoadd_attachment(attachment, serializer); + sse_encode_String(path, serializer); + pdeCallFfi( + generalizedFrbRustBinding, + serializer, + funcId: 106, + port: port_, + ); + }, + codec: SseCodec( + decodeSuccessData: sse_decode_unit, + decodeErrorData: null, + ), + constMeta: kCrateApiApiDownloadAttachmentConstMeta, + argValues: [sink, aps, attachment, path], + apiImpl: this, + ), + ), + ); + return sink.stream; } - TaskConstMeta get kCrateApiApiFfiFilePackagerDefaultConstMeta => + TaskConstMeta get kCrateApiApiDownloadAttachmentConstMeta => const TaskConstMeta( - debugName: "ffi_file_packager_default", - argNames: [], + debugName: "download_attachment", + argNames: ["sink", "aps", "attachment", "path"], ); @override - Future crateApiApiFromPoster( - {required SimplifiedIncomingCallPoster poster}) { - return handler.executeNormal(NormalTask( - callFfi: (port_) { - final serializer = SseSerializer(generalizedFrbRustBinding); - sse_encode_box_autoadd_simplified_incoming_call_poster( - poster, serializer); - pdeCallFfi(generalizedFrbRustBinding, serializer, - funcId: 108, port: port_); - }, - codec: SseCodec( - decodeSuccessData: sse_decode_i_message_poster_record, - decodeErrorData: sse_decode_AnyhowException, - ), - constMeta: kCrateApiApiFromPosterConstMeta, - argValues: [poster], - apiImpl: this, - )); + Future crateApiApiDownloadCloudAttachments({ + required ArcCloudMessagesClientDefaultAnisetteProvider cloudMessagesClient, + required List<(String, String)> files, + }) { + return handler.executeNormal( + NormalTask( + callFfi: (port_) { + final serializer = SseSerializer(generalizedFrbRustBinding); + sse_encode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcCloudMessagesClientDefaultAnisetteProvider( + cloudMessagesClient, + serializer, + ); + sse_encode_list_record_string_string(files, serializer); + pdeCallFfi( + generalizedFrbRustBinding, + serializer, + funcId: 107, + port: port_, + ); + }, + codec: SseCodec( + decodeSuccessData: sse_decode_unit, + decodeErrorData: sse_decode_AnyhowException, + ), + constMeta: kCrateApiApiDownloadCloudAttachmentsConstMeta, + argValues: [cloudMessagesClient, files], + apiImpl: this, + ), + ); } - TaskConstMeta get kCrateApiApiFromPosterConstMeta => const TaskConstMeta( - debugName: "from_poster", - argNames: ["poster"], + TaskConstMeta get kCrateApiApiDownloadCloudAttachmentsConstMeta => + const TaskConstMeta( + debugName: "download_cloud_attachments", + argNames: ["cloudMessagesClient", "files"], ); @override - Future crateApiApiFromPosterSave( - {required List poster}) { - return handler.executeNormal(NormalTask( - callFfi: (port_) { - final serializer = SseSerializer(generalizedFrbRustBinding); - sse_encode_list_prim_u_8_loose(poster, serializer); - pdeCallFfi(generalizedFrbRustBinding, serializer, - funcId: 109, port: port_); - }, - codec: SseCodec( - decodeSuccessData: sse_decode_simplified_incoming_call_poster, - decodeErrorData: sse_decode_AnyhowException, - ), - constMeta: kCrateApiApiFromPosterSaveConstMeta, - argValues: [poster], - apiImpl: this, - )); + Future crateApiApiDownloadCloudGroupPhotos({ + required ArcCloudMessagesClientDefaultAnisetteProvider cloudMessagesClient, + required List<(String, String)> files, + }) { + return handler.executeNormal( + NormalTask( + callFfi: (port_) { + final serializer = SseSerializer(generalizedFrbRustBinding); + sse_encode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcCloudMessagesClientDefaultAnisetteProvider( + cloudMessagesClient, + serializer, + ); + sse_encode_list_record_string_string(files, serializer); + pdeCallFfi( + generalizedFrbRustBinding, + serializer, + funcId: 108, + port: port_, + ); + }, + codec: SseCodec( + decodeSuccessData: sse_decode_unit, + decodeErrorData: sse_decode_AnyhowException, + ), + constMeta: kCrateApiApiDownloadCloudGroupPhotosConstMeta, + argValues: [cloudMessagesClient, files], + apiImpl: this, + ), + ); } - TaskConstMeta get kCrateApiApiFromPosterSaveConstMeta => const TaskConstMeta( - debugName: "from_poster_save", - argNames: ["poster"], + TaskConstMeta get kCrateApiApiDownloadCloudGroupPhotosConstMeta => + const TaskConstMeta( + debugName: "download_cloud_group_photos", + argNames: ["cloudMessagesClient", "files"], ); @override - Future crateApiApiFromTranscriptPosterSave( - {required List poster}) { - return handler.executeNormal(NormalTask( - callFfi: (port_) { - final serializer = SseSerializer(generalizedFrbRustBinding); - sse_encode_list_prim_u_8_loose(poster, serializer); - pdeCallFfi(generalizedFrbRustBinding, serializer, - funcId: 110, port: port_); - }, - codec: SseCodec( - decodeSuccessData: sse_decode_simplified_transcript_poster, - decodeErrorData: sse_decode_AnyhowException, - ), - constMeta: kCrateApiApiFromTranscriptPosterSaveConstMeta, - argValues: [poster], - apiImpl: this, - )); + Stream crateApiApiDownloadMmcs({ + required ApsConnection aps, + required MMCSFile attachment, + required String path, + }) { + final sink = RustStreamSink(); + unawaited( + handler.executeNormal( + NormalTask( + callFfi: (port_) { + final serializer = SseSerializer(generalizedFrbRustBinding); + sse_encode_StreamSink_transfer_progress_Sse(sink, serializer); + sse_encode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerAPSConnection( + aps, + serializer, + ); + sse_encode_box_autoadd_mmcs_file(attachment, serializer); + sse_encode_String(path, serializer); + pdeCallFfi( + generalizedFrbRustBinding, + serializer, + funcId: 109, + port: port_, + ); + }, + codec: SseCodec( + decodeSuccessData: sse_decode_unit, + decodeErrorData: null, + ), + constMeta: kCrateApiApiDownloadMmcsConstMeta, + argValues: [sink, aps, attachment, path], + apiImpl: this, + ), + ), + ); + return sink.stream; } - TaskConstMeta get kCrateApiApiFromTranscriptPosterSaveConstMeta => - const TaskConstMeta( - debugName: "from_transcript_poster_save", - argNames: ["poster"], - ); + TaskConstMeta get kCrateApiApiDownloadMmcsConstMeta => const TaskConstMeta( + debugName: "download_mmcs", + argNames: ["sink", "aps", "attachment", "path"], + ); @override - Future> crateApiApiFtSessions( - {required ArcFtClient facetime}) { - return handler.executeNormal(NormalTask( - callFfi: (port_) { - final serializer = SseSerializer(generalizedFrbRustBinding); - sse_encode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcFTClient( - facetime, serializer); - pdeCallFfi(generalizedFrbRustBinding, serializer, - funcId: 111, port: port_); - }, - codec: SseCodec( - decodeSuccessData: sse_decode_list_ft_session, - decodeErrorData: sse_decode_AnyhowException, - ), - constMeta: kCrateApiApiFtSessionsConstMeta, - argValues: [facetime], - apiImpl: this, - )); + (ArcSharedPushState, SharedPushState) crateApiApiDupDaemonDesk({ + required SharedPushState state, + }) { + return handler.executeSync( + SyncTask( + callFfi: () { + final serializer = SseSerializer(generalizedFrbRustBinding); + sse_encode_box_autoadd_shared_push_state(state, serializer); + return pdeCallFfi( + generalizedFrbRustBinding, + serializer, + funcId: 110, + )!; + }, + codec: SseCodec( + decodeSuccessData: + sse_decode_record_auto_owned_rust_opaque_flutter_rust_bridgefor_generated_rust_auto_opaque_inner_arc_shared_push_state_shared_push_state, + decodeErrorData: null, + ), + constMeta: kCrateApiApiDupDaemonDeskConstMeta, + argValues: [state], + apiImpl: this, + ), + ); } - TaskConstMeta get kCrateApiApiFtSessionsConstMeta => const TaskConstMeta( - debugName: "ft_sessions", - argNames: ["facetime"], - ); + TaskConstMeta get kCrateApiApiDupDaemonDeskConstMeta => + const TaskConstMeta(debugName: "dup_daemon_desk", argNames: ["state"]); @override - Future crateApiApiGenerateUdid() { - return handler.executeNormal(NormalTask( - callFfi: (port_) { - final serializer = SseSerializer(generalizedFrbRustBinding); - pdeCallFfi(generalizedFrbRustBinding, serializer, - funcId: 112, port: port_); - }, - codec: SseCodec( - decodeSuccessData: sse_decode_String, - decodeErrorData: null, - ), - constMeta: kCrateApiApiGenerateUdidConstMeta, - argValues: [], - apiImpl: this, - )); + IdsUser crateApiApiDuplicateUser({required IdsUser user}) { + return handler.executeSync( + SyncTask( + callFfi: () { + final serializer = SseSerializer(generalizedFrbRustBinding); + sse_encode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerIDSUser( + user, + serializer, + ); + return pdeCallFfi( + generalizedFrbRustBinding, + serializer, + funcId: 111, + )!; + }, + codec: SseCodec( + decodeSuccessData: + sse_decode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerIDSUser, + decodeErrorData: null, + ), + constMeta: kCrateApiApiDuplicateUserConstMeta, + argValues: [user], + apiImpl: this, + ), + ); } - TaskConstMeta get kCrateApiApiGenerateUdidConstMeta => const TaskConstMeta( - debugName: "generate_udid", - argNames: [], - ); + TaskConstMeta get kCrateApiApiDuplicateUserConstMeta => + const TaskConstMeta(debugName: "duplicate_user", argNames: ["user"]); @override - Future crateApiApiGet2FaCode( - {required ArcAnisetteClientDefaultAnisetteProvider anisette}) { - return handler.executeNormal(NormalTask( - callFfi: (port_) { - final serializer = SseSerializer(generalizedFrbRustBinding); - sse_encode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcAnisetteClientDefaultAnisetteProvider( - anisette, serializer); - pdeCallFfi(generalizedFrbRustBinding, serializer, - funcId: 113, port: port_); - }, - codec: SseCodec( - decodeSuccessData: sse_decode_u_32, - decodeErrorData: sse_decode_AnyhowException, - ), - constMeta: kCrateApiApiGet2FaCodeConstMeta, - argValues: [anisette], - apiImpl: this, - )); + GZipWrapperAttachmentMeta crateApiApiEncodeAttachmentmeta({ + required AttachmentMeta attachmentmeta, + }) { + return handler.executeSync( + SyncTask( + callFfi: () { + final serializer = SseSerializer(generalizedFrbRustBinding); + sse_encode_box_autoadd_attachment_meta(attachmentmeta, serializer); + return pdeCallFfi( + generalizedFrbRustBinding, + serializer, + funcId: 112, + )!; + }, + codec: SseCodec( + decodeSuccessData: + sse_decode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerGZipWrapperAttachmentMeta, + decodeErrorData: null, + ), + constMeta: kCrateApiApiEncodeAttachmentmetaConstMeta, + argValues: [attachmentmeta], + apiImpl: this, + ), + ); } - TaskConstMeta get kCrateApiApiGet2FaCodeConstMeta => const TaskConstMeta( - debugName: "get_2fa_code", - argNames: ["anisette"], + TaskConstMeta get kCrateApiApiEncodeAttachmentmetaConstMeta => + const TaskConstMeta( + debugName: "encode_attachmentmeta", + argNames: ["attachmentmeta"], ); @override - Future<(List, LoginState?)> crateApiApiGet2FaSmsOpts( - {required ArcMutexAppleAccountDefaultAnisetteProvider state}) { - return handler.executeNormal(NormalTask( - callFfi: (port_) { - final serializer = SseSerializer(generalizedFrbRustBinding); - sse_encode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcMutexAppleAccountDefaultAnisetteProvider( - state, serializer); - pdeCallFfi(generalizedFrbRustBinding, serializer, - funcId: 114, port: port_); - }, - codec: SseCodec( - decodeSuccessData: - sse_decode_record_list_trusted_phone_number_opt_box_autoadd_login_state, - decodeErrorData: sse_decode_AnyhowException, - ), - constMeta: kCrateApiApiGet2FaSmsOptsConstMeta, - argValues: [state], - apiImpl: this, - )); + GZipWrapperChatProto crateApiApiEncodeChatproto({required ChatProto chat}) { + return handler.executeSync( + SyncTask( + callFfi: () { + final serializer = SseSerializer(generalizedFrbRustBinding); + sse_encode_box_autoadd_chat_proto(chat, serializer); + return pdeCallFfi( + generalizedFrbRustBinding, + serializer, + funcId: 113, + )!; + }, + codec: SseCodec( + decodeSuccessData: + sse_decode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerGZipWrapperChatProto, + decodeErrorData: null, + ), + constMeta: kCrateApiApiEncodeChatprotoConstMeta, + argValues: [chat], + apiImpl: this, + ), + ); } - TaskConstMeta get kCrateApiApiGet2FaSmsOptsConstMeta => const TaskConstMeta( - debugName: "get_2fa_sms_opts", - argNames: ["state"], - ); + TaskConstMeta get kCrateApiApiEncodeChatprotoConstMeta => + const TaskConstMeta(debugName: "encode_chatproto", argNames: ["chat"]); @override - Future<(List, List)> crateApiApiGetAlbums( - {required SyncManagerDefaultAnisetteProviderMyFilePackager lock, - required bool refresh}) { - return handler.executeNormal(NormalTask( - callFfi: (port_) { - final serializer = SseSerializer(generalizedFrbRustBinding); - sse_encode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerSyncManagerDefaultAnisetteProviderMyFilePackager( - lock, serializer); - sse_encode_bool(refresh, serializer); - pdeCallFfi(generalizedFrbRustBinding, serializer, - funcId: 115, port: port_); - }, - codec: SseCodec( - decodeSuccessData: sse_decode_record_list_shared_album_list_string, - decodeErrorData: sse_decode_AnyhowException, - ), - constMeta: kCrateApiApiGetAlbumsConstMeta, - argValues: [lock, refresh], - apiImpl: this, - )); + (Uint8List, Uint8List?) crateApiApiEncodeExtensionApp({ + required ExtensionApp app, + }) { + return handler.executeSync( + SyncTask( + callFfi: () { + final serializer = SseSerializer(generalizedFrbRustBinding); + sse_encode_box_autoadd_extension_app(app, serializer); + return pdeCallFfi( + generalizedFrbRustBinding, + serializer, + funcId: 114, + )!; + }, + codec: SseCodec( + decodeSuccessData: + sse_decode_record_list_prim_u_8_strict_opt_list_prim_u_8_strict, + decodeErrorData: sse_decode_AnyhowException, + ), + constMeta: kCrateApiApiEncodeExtensionAppConstMeta, + argValues: [app], + apiImpl: this, + ), + ); } - TaskConstMeta get kCrateApiApiGetAlbumsConstMeta => const TaskConstMeta( - debugName: "get_albums", - argNames: ["lock", "refresh"], - ); + TaskConstMeta get kCrateApiApiEncodeExtensionAppConstMeta => + const TaskConstMeta(debugName: "encode_extension_app", argNames: ["app"]); @override - Future> crateApiApiGetAnisetteHeaders( - {required ArcAnisetteClientDefaultAnisetteProvider state, - required JoinedOsConfig config}) { - return handler.executeNormal(NormalTask( - callFfi: (port_) { - final serializer = SseSerializer(generalizedFrbRustBinding); - sse_encode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcAnisetteClientDefaultAnisetteProvider( - state, serializer); - sse_encode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerJoinedOSConfig( - config, serializer); - pdeCallFfi(generalizedFrbRustBinding, serializer, - funcId: 116, port: port_); - }, - codec: SseCodec( - decodeSuccessData: sse_decode_Map_String_String, - decodeErrorData: sse_decode_AnyhowException, - ), - constMeta: kCrateApiApiGetAnisetteHeadersConstMeta, - argValues: [state, config], - apiImpl: this, - )); + Future crateApiApiEncodeHex({required List bytes}) { + return handler.executeNormal( + NormalTask( + callFfi: (port_) { + final serializer = SseSerializer(generalizedFrbRustBinding); + sse_encode_list_prim_u_8_loose(bytes, serializer); + pdeCallFfi( + generalizedFrbRustBinding, + serializer, + funcId: 115, + port: port_, + ); + }, + codec: SseCodec( + decodeSuccessData: sse_decode_String, + decodeErrorData: null, + ), + constMeta: kCrateApiApiEncodeHexConstMeta, + argValues: [bytes], + apiImpl: this, + ), + ); } - TaskConstMeta get kCrateApiApiGetAnisetteHeadersConstMeta => - const TaskConstMeta( - debugName: "get_anisette_headers", - argNames: ["state", "config"], - ); + TaskConstMeta get kCrateApiApiEncodeHexConstMeta => + const TaskConstMeta(debugName: "encode_hex", argNames: ["bytes"]); @override - String? crateApiApiGetAvailableUser({required String path}) { - return handler.executeSync(SyncTask( - callFfi: () { - final serializer = SseSerializer(generalizedFrbRustBinding); - sse_encode_String(path, serializer); - return pdeCallFfi(generalizedFrbRustBinding, serializer, funcId: 117)!; - }, - codec: SseCodec( - decodeSuccessData: sse_decode_opt_String, - decodeErrorData: null, - ), - constMeta: kCrateApiApiGetAvailableUserConstMeta, - argValues: [path], - apiImpl: this, - )); + Uint8List crateApiApiEncodeMessageInfo({required MessageSummaryInfo info}) { + return handler.executeSync( + SyncTask( + callFfi: () { + final serializer = SseSerializer(generalizedFrbRustBinding); + sse_encode_box_autoadd_message_summary_info(info, serializer); + return pdeCallFfi( + generalizedFrbRustBinding, + serializer, + funcId: 116, + )!; + }, + codec: SseCodec( + decodeSuccessData: sse_decode_list_prim_u_8_strict, + decodeErrorData: null, + ), + constMeta: kCrateApiApiEncodeMessageInfoConstMeta, + argValues: [info], + apiImpl: this, + ), + ); } - TaskConstMeta get kCrateApiApiGetAvailableUserConstMeta => - const TaskConstMeta( - debugName: "get_available_user", - argNames: ["path"], - ); + TaskConstMeta get kCrateApiApiEncodeMessageInfoConstMeta => + const TaskConstMeta(debugName: "encode_message_info", argNames: ["info"]); @override - Future> crateApiApiGetBackgroundFollowing( - {required ArcFindMyClientDefaultAnisetteProvider fmfd}) { - return handler.executeNormal(NormalTask( - callFfi: (port_) { - final serializer = SseSerializer(generalizedFrbRustBinding); - sse_encode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcFindMyClientDefaultAnisetteProvider( - fmfd, serializer); - pdeCallFfi(generalizedFrbRustBinding, serializer, - funcId: 118, port: port_); - }, - codec: SseCodec( - decodeSuccessData: sse_decode_list_follow, - decodeErrorData: null, - ), - constMeta: kCrateApiApiGetBackgroundFollowingConstMeta, - argValues: [fmfd], - apiImpl: this, - )); + GZipWrapperMessageProto crateApiApiEncodeMessageproto({ + required MessageProto messageproto, + }) { + return handler.executeSync( + SyncTask( + callFfi: () { + final serializer = SseSerializer(generalizedFrbRustBinding); + sse_encode_box_autoadd_message_proto(messageproto, serializer); + return pdeCallFfi( + generalizedFrbRustBinding, + serializer, + funcId: 117, + )!; + }, + codec: SseCodec( + decodeSuccessData: + sse_decode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerGZipWrapperMessageProto, + decodeErrorData: null, + ), + constMeta: kCrateApiApiEncodeMessageprotoConstMeta, + argValues: [messageproto], + apiImpl: this, + ), + ); } - TaskConstMeta get kCrateApiApiGetBackgroundFollowingConstMeta => + TaskConstMeta get kCrateApiApiEncodeMessageprotoConstMeta => const TaskConstMeta( - debugName: "get_background_following", - argNames: ["fmfd"], + debugName: "encode_messageproto", + argNames: ["messageproto"], ); @override - Future> crateApiApiGetBeaconItems( - {required ArcFindMyClientDefaultAnisetteProvider items}) { - return handler.executeNormal(NormalTask( - callFfi: (port_) { - final serializer = SseSerializer(generalizedFrbRustBinding); - sse_encode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcFindMyClientDefaultAnisetteProvider( - items, serializer); - pdeCallFfi(generalizedFrbRustBinding, serializer, - funcId: 119, port: port_); - }, - codec: SseCodec( - decodeSuccessData: sse_decode_list_dart_beacon, - decodeErrorData: sse_decode_AnyhowException, - ), - constMeta: kCrateApiApiGetBeaconItemsConstMeta, - argValues: [items], - apiImpl: this, - )); + GZipWrapperMessageProto2 crateApiApiEncodeMessageproto2({ + required MessageProto2 messageproto2, + }) { + return handler.executeSync( + SyncTask( + callFfi: () { + final serializer = SseSerializer(generalizedFrbRustBinding); + sse_encode_box_autoadd_message_proto_2(messageproto2, serializer); + return pdeCallFfi( + generalizedFrbRustBinding, + serializer, + funcId: 118, + )!; + }, + codec: SseCodec( + decodeSuccessData: + sse_decode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerGZipWrapperMessageProto2, + decodeErrorData: null, + ), + constMeta: kCrateApiApiEncodeMessageproto2ConstMeta, + argValues: [messageproto2], + apiImpl: this, + ), + ); } - TaskConstMeta get kCrateApiApiGetBeaconItemsConstMeta => const TaskConstMeta( - debugName: "get_beacon_items", - argNames: ["items"], + TaskConstMeta get kCrateApiApiEncodeMessageproto2ConstMeta => + const TaskConstMeta( + debugName: "encode_messageproto2", + argNames: ["messageproto2"], ); @override - Future> crateApiApiGetBottles( - {required ArcKeychainClientDefaultAnisetteProvider keychain}) { - return handler.executeNormal(NormalTask( - callFfi: (port_) { - final serializer = SseSerializer(generalizedFrbRustBinding); - sse_encode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcKeychainClientDefaultAnisetteProvider( - keychain, serializer); - pdeCallFfi(generalizedFrbRustBinding, serializer, - funcId: 120, port: port_); - }, - codec: SseCodec( - decodeSuccessData: - sse_decode_list_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerViableBottle, - decodeErrorData: sse_decode_AnyhowException, - ), - constMeta: kCrateApiApiGetBottlesConstMeta, - argValues: [keychain], - apiImpl: this, - )); + GZipWrapperMessageProto3 crateApiApiEncodeMessageproto3({ + required MessageProto3 messageproto3, + }) { + return handler.executeSync( + SyncTask( + callFfi: () { + final serializer = SseSerializer(generalizedFrbRustBinding); + sse_encode_box_autoadd_message_proto_3(messageproto3, serializer); + return pdeCallFfi( + generalizedFrbRustBinding, + serializer, + funcId: 119, + )!; + }, + codec: SseCodec( + decodeSuccessData: + sse_decode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerGZipWrapperMessageProto3, + decodeErrorData: null, + ), + constMeta: kCrateApiApiEncodeMessageproto3ConstMeta, + argValues: [messageproto3], + apiImpl: this, + ), + ); } - TaskConstMeta get kCrateApiApiGetBottlesConstMeta => const TaskConstMeta( - debugName: "get_bottles", - argNames: ["keychain"], + TaskConstMeta get kCrateApiApiEncodeMessageproto3ConstMeta => + const TaskConstMeta( + debugName: "encode_messageproto3", + argNames: ["messageproto3"], ); @override - Future> crateApiApiGetContactsHeaders( - {required String path, - required ArcAnisetteClientDefaultAnisetteProvider state, - required ArcTokenProviderDefaultAnisetteProvider tokenProvider, - required JoinedOsConfig config}) { - return handler.executeNormal(NormalTask( - callFfi: (port_) { - final serializer = SseSerializer(generalizedFrbRustBinding); - sse_encode_String(path, serializer); - sse_encode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcAnisetteClientDefaultAnisetteProvider( - state, serializer); - sse_encode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcTokenProviderDefaultAnisetteProvider( - tokenProvider, serializer); - sse_encode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerJoinedOSConfig( - config, serializer); - pdeCallFfi(generalizedFrbRustBinding, serializer, - funcId: 121, port: port_); - }, - codec: SseCodec( - decodeSuccessData: sse_decode_Map_String_String, - decodeErrorData: sse_decode_AnyhowException, - ), - constMeta: kCrateApiApiGetContactsHeadersConstMeta, - argValues: [path, state, tokenProvider, config], - apiImpl: this, - )); + GZipWrapperMessageProto4 crateApiApiEncodeMessageproto4({ + required MessageProto4 messageproto4, + }) { + return handler.executeSync( + SyncTask( + callFfi: () { + final serializer = SseSerializer(generalizedFrbRustBinding); + sse_encode_box_autoadd_message_proto_4(messageproto4, serializer); + return pdeCallFfi( + generalizedFrbRustBinding, + serializer, + funcId: 120, + )!; + }, + codec: SseCodec( + decodeSuccessData: + sse_decode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerGZipWrapperMessageProto4, + decodeErrorData: null, + ), + constMeta: kCrateApiApiEncodeMessageproto4ConstMeta, + argValues: [messageproto4], + apiImpl: this, + ), + ); } - TaskConstMeta get kCrateApiApiGetContactsHeadersConstMeta => + TaskConstMeta get kCrateApiApiEncodeMessageproto4ConstMeta => const TaskConstMeta( - debugName: "get_contacts_headers", - argNames: ["path", "state", "tokenProvider", "config"], + debugName: "encode_messageproto4", + argNames: ["messageproto4"], ); @override - Future crateApiApiGetDeviceInfo( - {required JoinedOsConfig config}) { - return handler.executeNormal(NormalTask( - callFfi: (port_) { - final serializer = SseSerializer(generalizedFrbRustBinding); - sse_encode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerJoinedOSConfig( - config, serializer); - pdeCallFfi(generalizedFrbRustBinding, serializer, - funcId: 122, port: port_); - }, - codec: SseCodec( - decodeSuccessData: sse_decode_device_info, - decodeErrorData: sse_decode_AnyhowException, - ), - constMeta: kCrateApiApiGetDeviceInfoConstMeta, - argValues: [config], - apiImpl: this, - )); + Future crateApiApiEncodeProfileMessage({ + required ShareProfileMessage p, + }) { + return handler.executeNormal( + NormalTask( + callFfi: (port_) { + final serializer = SseSerializer(generalizedFrbRustBinding); + sse_encode_box_autoadd_share_profile_message(p, serializer); + pdeCallFfi( + generalizedFrbRustBinding, + serializer, + funcId: 121, + port: port_, + ); + }, + codec: SseCodec( + decodeSuccessData: sse_decode_String, + decodeErrorData: null, + ), + constMeta: kCrateApiApiEncodeProfileMessageConstMeta, + argValues: [p], + apiImpl: this, + ), + ); } - TaskConstMeta get kCrateApiApiGetDeviceInfoConstMeta => const TaskConstMeta( - debugName: "get_device_info", - argNames: ["config"], - ); + TaskConstMeta get kCrateApiApiEncodeProfileMessageConstMeta => + const TaskConstMeta(debugName: "encode_profile_message", argNames: ["p"]); @override - Future> crateApiApiGetDevices( - {required FindMyPhoneClientDefaultAnisetteProvider client}) { - return handler.executeNormal(NormalTask( - callFfi: (port_) { - final serializer = SseSerializer(generalizedFrbRustBinding); - sse_encode_Auto_RefMut_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerFindMyPhoneClientDefaultAnisetteProvider( - client, serializer); - pdeCallFfi(generalizedFrbRustBinding, serializer, - funcId: 123, port: port_); - }, - codec: SseCodec( - decodeSuccessData: sse_decode_list_found_device, - decodeErrorData: null, - ), - constMeta: kCrateApiApiGetDevicesConstMeta, - argValues: [client], - apiImpl: this, - )); + Future crateApiApiEncodeSummaryInfo({ + required MessageSummaryInfo info, + }) { + return handler.executeNormal( + NormalTask( + callFfi: (port_) { + final serializer = SseSerializer(generalizedFrbRustBinding); + sse_encode_box_autoadd_message_summary_info(info, serializer); + pdeCallFfi( + generalizedFrbRustBinding, + serializer, + funcId: 122, + port: port_, + ); + }, + codec: SseCodec( + decodeSuccessData: sse_decode_list_prim_u_8_strict, + decodeErrorData: null, + ), + constMeta: kCrateApiApiEncodeSummaryInfoConstMeta, + argValues: [info], + apiImpl: this, + ), + ); } - TaskConstMeta get kCrateApiApiGetDevicesConstMeta => const TaskConstMeta( - debugName: "get_devices", - argNames: ["client"], - ); + TaskConstMeta get kCrateApiApiEncodeSummaryInfoConstMeta => + const TaskConstMeta(debugName: "encode_summary_info", argNames: ["info"]); @override - Future crateApiApiGetEntitlements( - {required JoinedOsConfig config, - required ApsConnection conn, - required String mccmnc, - required String subscriber, - required String imei, - required FutureOr Function(String) processChallenge}) { - return handler.executeNormal(NormalTask( - callFfi: (port_) { - final serializer = SseSerializer(generalizedFrbRustBinding); - sse_encode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerJoinedOSConfig( - config, serializer); - sse_encode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerAPSConnection( - conn, serializer); - sse_encode_String(mccmnc, serializer); - sse_encode_String(subscriber, serializer); - sse_encode_String(imei, serializer); - sse_encode_DartFn_Inputs_String_Output_String_AnyhowException( - processChallenge, serializer); - pdeCallFfi(generalizedFrbRustBinding, serializer, - funcId: 124, port: port_); - }, - codec: SseCodec( - decodeSuccessData: - sse_decode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerIDSUser, - decodeErrorData: sse_decode_AnyhowException, - ), - constMeta: kCrateApiApiGetEntitlementsConstMeta, - argValues: [config, conn, mccmnc, subscriber, imei, processChallenge], - apiImpl: this, - )); + Future crateApiApiFetchProfile({ + required ArcProfilesClientDefaultAnisetteProvider profiles, + required ShareProfileMessage message, + }) { + return handler.executeNormal( + NormalTask( + callFfi: (port_) { + final serializer = SseSerializer(generalizedFrbRustBinding); + sse_encode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcProfilesClientDefaultAnisetteProvider( + profiles, + serializer, + ); + sse_encode_box_autoadd_share_profile_message(message, serializer); + pdeCallFfi( + generalizedFrbRustBinding, + serializer, + funcId: 123, + port: port_, + ); + }, + codec: SseCodec( + decodeSuccessData: sse_decode_i_message_nickname_record, + decodeErrorData: sse_decode_AnyhowException, + ), + constMeta: kCrateApiApiFetchProfileConstMeta, + argValues: [profiles, message], + apiImpl: this, + ), + ); } - TaskConstMeta get kCrateApiApiGetEntitlementsConstMeta => const TaskConstMeta( - debugName: "get_entitlements", - argNames: [ - "config", - "conn", - "mccmnc", - "subscriber", - "imei", - "processChallenge" - ], - ); + TaskConstMeta get kCrateApiApiFetchProfileConstMeta => const TaskConstMeta( + debugName: "fetch_profile", + argNames: ["profiles", "message"], + ); @override - Future> crateApiApiGetFollowing( - {required FindMyFriendsClientDefaultAnisetteProvider client}) { - return handler.executeNormal(NormalTask( - callFfi: (port_) { - final serializer = SseSerializer(generalizedFrbRustBinding); - sse_encode_Auto_RefMut_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerFindMyFriendsClientDefaultAnisetteProvider( - client, serializer); - pdeCallFfi(generalizedFrbRustBinding, serializer, - funcId: 125, port: port_); - }, - codec: SseCodec( - decodeSuccessData: sse_decode_list_follow, - decodeErrorData: null, - ), - constMeta: kCrateApiApiGetFollowingConstMeta, - argValues: [client], - apiImpl: this, - )); + Future crateApiApiFfiFilePackagerDefault() { + return handler.executeNormal( + NormalTask( + callFfi: (port_) { + final serializer = SseSerializer(generalizedFrbRustBinding); + pdeCallFfi( + generalizedFrbRustBinding, + serializer, + funcId: 124, + port: port_, + ); + }, + codec: SseCodec( + decodeSuccessData: sse_decode_ffi_file_packager, + decodeErrorData: null, + ), + constMeta: kCrateApiApiFfiFilePackagerDefaultConstMeta, + argValues: [], + apiImpl: this, + ), + ); } - TaskConstMeta get kCrateApiApiGetFollowingConstMeta => const TaskConstMeta( - debugName: "get_following", - argNames: ["client"], - ); + TaskConstMeta get kCrateApiApiFfiFilePackagerDefaultConstMeta => + const TaskConstMeta(debugName: "ffi_file_packager_default", argNames: []); @override - Future crateApiApiGetFtLink( - {required ArcFtClient facetime, required String usage}) { - return handler.executeNormal(NormalTask( - callFfi: (port_) { - final serializer = SseSerializer(generalizedFrbRustBinding); - sse_encode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcFTClient( - facetime, serializer); - sse_encode_String(usage, serializer); - pdeCallFfi(generalizedFrbRustBinding, serializer, - funcId: 126, port: port_); - }, - codec: SseCodec( - decodeSuccessData: sse_decode_String, - decodeErrorData: sse_decode_AnyhowException, - ), - constMeta: kCrateApiApiGetFtLinkConstMeta, - argValues: [facetime, usage], - apiImpl: this, - )); + Future crateApiApiFromPoster({ + required SimplifiedIncomingCallPoster poster, + }) { + return handler.executeNormal( + NormalTask( + callFfi: (port_) { + final serializer = SseSerializer(generalizedFrbRustBinding); + sse_encode_box_autoadd_simplified_incoming_call_poster( + poster, + serializer, + ); + pdeCallFfi( + generalizedFrbRustBinding, + serializer, + funcId: 125, + port: port_, + ); + }, + codec: SseCodec( + decodeSuccessData: sse_decode_i_message_poster_record, + decodeErrorData: sse_decode_AnyhowException, + ), + constMeta: kCrateApiApiFromPosterConstMeta, + argValues: [poster], + apiImpl: this, + ), + ); } - TaskConstMeta get kCrateApiApiGetFtLinkConstMeta => const TaskConstMeta( - debugName: "get_ft_link", - argNames: ["facetime", "usage"], - ); + TaskConstMeta get kCrateApiApiFromPosterConstMeta => + const TaskConstMeta(debugName: "from_poster", argNames: ["poster"]); @override - Future< - ( - String, - Map, - Map - )> - crateApiApiGetGroups( - {required ArcPasswordManagerDefaultAnisetteProvider passwords}) { - return handler.executeNormal(NormalTask( - callFfi: (port_) { - final serializer = SseSerializer(generalizedFrbRustBinding); - sse_encode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcPasswordManagerDefaultAnisetteProvider( - passwords, serializer); - pdeCallFfi(generalizedFrbRustBinding, serializer, - funcId: 127, port: port_); - }, - codec: SseCodec( - decodeSuccessData: - sse_decode_record_string_map_string_group_summary_map_string_share_invite_content_data, - decodeErrorData: sse_decode_AnyhowException, - ), - constMeta: kCrateApiApiGetGroupsConstMeta, - argValues: [passwords], - apiImpl: this, - )); - } - - TaskConstMeta get kCrateApiApiGetGroupsConstMeta => const TaskConstMeta( - debugName: "get_groups", - argNames: ["passwords"], - ); - - @override - Future> crateApiApiGetHandles({required ArcImClient state}) { - return handler.executeNormal(NormalTask( - callFfi: (port_) { - final serializer = SseSerializer(generalizedFrbRustBinding); - sse_encode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcIMClient( - state, serializer); - pdeCallFfi(generalizedFrbRustBinding, serializer, - funcId: 128, port: port_); - }, - codec: SseCodec( - decodeSuccessData: sse_decode_list_String, - decodeErrorData: sse_decode_AnyhowException, - ), - constMeta: kCrateApiApiGetHandlesConstMeta, - argValues: [state], - apiImpl: this, - )); + Future crateApiApiFromPosterSave({ + required List poster, + }) { + return handler.executeNormal( + NormalTask( + callFfi: (port_) { + final serializer = SseSerializer(generalizedFrbRustBinding); + sse_encode_list_prim_u_8_loose(poster, serializer); + pdeCallFfi( + generalizedFrbRustBinding, + serializer, + funcId: 126, + port: port_, + ); + }, + codec: SseCodec( + decodeSuccessData: sse_decode_simplified_incoming_call_poster, + decodeErrorData: sse_decode_AnyhowException, + ), + constMeta: kCrateApiApiFromPosterSaveConstMeta, + argValues: [poster], + apiImpl: this, + ), + ); } - TaskConstMeta get kCrateApiApiGetHandlesConstMeta => const TaskConstMeta( - debugName: "get_handles", - argNames: ["state"], - ); + TaskConstMeta get kCrateApiApiFromPosterSaveConstMeta => + const TaskConstMeta(debugName: "from_poster_save", argNames: ["poster"]); @override - Future> crateApiApiGetMyPhoneHandles( - {required ArcImClient state}) { - return handler.executeNormal(NormalTask( - callFfi: (port_) { - final serializer = SseSerializer(generalizedFrbRustBinding); - sse_encode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcIMClient( - state, serializer); - pdeCallFfi(generalizedFrbRustBinding, serializer, - funcId: 129, port: port_); - }, - codec: SseCodec( - decodeSuccessData: sse_decode_list_String, - decodeErrorData: sse_decode_AnyhowException, - ), - constMeta: kCrateApiApiGetMyPhoneHandlesConstMeta, - argValues: [state], - apiImpl: this, - )); + Future crateApiApiFromTranscriptPosterSave({ + required List poster, + }) { + return handler.executeNormal( + NormalTask( + callFfi: (port_) { + final serializer = SseSerializer(generalizedFrbRustBinding); + sse_encode_list_prim_u_8_loose(poster, serializer); + pdeCallFfi( + generalizedFrbRustBinding, + serializer, + funcId: 127, + port: port_, + ); + }, + codec: SseCodec( + decodeSuccessData: sse_decode_simplified_transcript_poster, + decodeErrorData: sse_decode_AnyhowException, + ), + constMeta: kCrateApiApiFromTranscriptPosterSaveConstMeta, + argValues: [poster], + apiImpl: this, + ), + ); } - TaskConstMeta get kCrateApiApiGetMyPhoneHandlesConstMeta => + TaskConstMeta get kCrateApiApiFromTranscriptPosterSaveConstMeta => const TaskConstMeta( - debugName: "get_my_phone_handles", - argNames: ["state"], + debugName: "from_transcript_poster_save", + argNames: ["poster"], ); @override - Future> crateApiApiGetPasskeys( - {required ArcPasswordManagerDefaultAnisetteProvider passwords}) { - return handler.executeNormal(NormalTask( - callFfi: (port_) { - final serializer = SseSerializer(generalizedFrbRustBinding); - sse_encode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcPasswordManagerDefaultAnisetteProvider( - passwords, serializer); - pdeCallFfi(generalizedFrbRustBinding, serializer, - funcId: 130, port: port_); - }, - codec: SseCodec( - decodeSuccessData: sse_decode_Map_String_record_opt_string_passkey, - decodeErrorData: null, - ), - constMeta: kCrateApiApiGetPasskeysConstMeta, - argValues: [passwords], - apiImpl: this, - )); + Future> crateApiApiFtSessions({ + required ArcFtClient facetime, + }) { + return handler.executeNormal( + NormalTask( + callFfi: (port_) { + final serializer = SseSerializer(generalizedFrbRustBinding); + sse_encode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcFTClient( + facetime, + serializer, + ); + pdeCallFfi( + generalizedFrbRustBinding, + serializer, + funcId: 128, + port: port_, + ); + }, + codec: SseCodec( + decodeSuccessData: sse_decode_list_ft_session, + decodeErrorData: sse_decode_AnyhowException, + ), + constMeta: kCrateApiApiFtSessionsConstMeta, + argValues: [facetime], + apiImpl: this, + ), + ); } - TaskConstMeta get kCrateApiApiGetPasskeysConstMeta => const TaskConstMeta( - debugName: "get_passkeys", - argNames: ["passwords"], - ); + TaskConstMeta get kCrateApiApiFtSessionsConstMeta => + const TaskConstMeta(debugName: "ft_sessions", argNames: ["facetime"]); @override - Future> crateApiApiGetPasswords( - {required ArcPasswordManagerDefaultAnisetteProvider passwords}) { - return handler.executeNormal(NormalTask( - callFfi: (port_) { - final serializer = SseSerializer(generalizedFrbRustBinding); - sse_encode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcPasswordManagerDefaultAnisetteProvider( - passwords, serializer); - pdeCallFfi(generalizedFrbRustBinding, serializer, - funcId: 131, port: port_); - }, - codec: SseCodec( - decodeSuccessData: - sse_decode_Map_String_record_opt_string_password_raw_entry, - decodeErrorData: null, - ), - constMeta: kCrateApiApiGetPasswordsConstMeta, - argValues: [passwords], - apiImpl: this, - )); + Future crateApiApiGenerateUdid() { + return handler.executeNormal( + NormalTask( + callFfi: (port_) { + final serializer = SseSerializer(generalizedFrbRustBinding); + pdeCallFfi( + generalizedFrbRustBinding, + serializer, + funcId: 129, + port: port_, + ); + }, + codec: SseCodec( + decodeSuccessData: sse_decode_String, + decodeErrorData: null, + ), + constMeta: kCrateApiApiGenerateUdidConstMeta, + argValues: [], + apiImpl: this, + ), + ); } - TaskConstMeta get kCrateApiApiGetPasswordsConstMeta => const TaskConstMeta( - debugName: "get_passwords", - argNames: ["passwords"], - ); + TaskConstMeta get kCrateApiApiGenerateUdidConstMeta => + const TaskConstMeta(debugName: "generate_udid", argNames: []); @override - Future> - crateApiApiGetPasswordsMeta( - {required ArcPasswordManagerDefaultAnisetteProvider passwords}) { - return handler.executeNormal(NormalTask( - callFfi: (port_) { - final serializer = SseSerializer(generalizedFrbRustBinding); - sse_encode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcPasswordManagerDefaultAnisetteProvider( - passwords, serializer); - pdeCallFfi(generalizedFrbRustBinding, serializer, - funcId: 132, port: port_); - }, - codec: SseCodec( - decodeSuccessData: - sse_decode_Map_String_record_opt_string_password_manager_meta, - decodeErrorData: null, - ), - constMeta: kCrateApiApiGetPasswordsMetaConstMeta, - argValues: [passwords], - apiImpl: this, - )); + Future crateApiApiGet2FaCode({ + required ArcAnisetteClientDefaultAnisetteProvider anisette, + }) { + return handler.executeNormal( + NormalTask( + callFfi: (port_) { + final serializer = SseSerializer(generalizedFrbRustBinding); + sse_encode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcAnisetteClientDefaultAnisetteProvider( + anisette, + serializer, + ); + pdeCallFfi( + generalizedFrbRustBinding, + serializer, + funcId: 130, + port: port_, + ); + }, + codec: SseCodec( + decodeSuccessData: sse_decode_u_32, + decodeErrorData: sse_decode_AnyhowException, + ), + constMeta: kCrateApiApiGet2FaCodeConstMeta, + argValues: [anisette], + apiImpl: this, + ), + ); } - TaskConstMeta get kCrateApiApiGetPasswordsMetaConstMeta => - const TaskConstMeta( - debugName: "get_passwords_meta", - argNames: ["passwords"], - ); + TaskConstMeta get kCrateApiApiGet2FaCodeConstMeta => + const TaskConstMeta(debugName: "get_2fa_code", argNames: ["anisette"]); @override - Future crateApiApiGetQuotaInfo( - {required ArcTokenProviderDefaultAnisetteProvider info}) { - return handler.executeNormal(NormalTask( - callFfi: (port_) { - final serializer = SseSerializer(generalizedFrbRustBinding); - sse_encode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcTokenProviderDefaultAnisetteProvider( - info, serializer); - pdeCallFfi(generalizedFrbRustBinding, serializer, - funcId: 133, port: port_); - }, - codec: SseCodec( - decodeSuccessData: sse_decode_quota_info, - decodeErrorData: sse_decode_AnyhowException, - ), - constMeta: kCrateApiApiGetQuotaInfoConstMeta, - argValues: [info], - apiImpl: this, - )); + Future<(List, LoginState?)> crateApiApiGet2FaSmsOpts({ + required ArcMutexAppleAccountDefaultAnisetteProvider state, + }) { + return handler.executeNormal( + NormalTask( + callFfi: (port_) { + final serializer = SseSerializer(generalizedFrbRustBinding); + sse_encode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcMutexAppleAccountDefaultAnisetteProvider( + state, + serializer, + ); + pdeCallFfi( + generalizedFrbRustBinding, + serializer, + funcId: 131, + port: port_, + ); + }, + codec: SseCodec( + decodeSuccessData: + sse_decode_record_list_trusted_phone_number_opt_box_autoadd_login_state, + decodeErrorData: sse_decode_AnyhowException, + ), + constMeta: kCrateApiApiGet2FaSmsOptsConstMeta, + argValues: [state], + apiImpl: this, + ), + ); } - TaskConstMeta get kCrateApiApiGetQuotaInfoConstMeta => const TaskConstMeta( - debugName: "get_quota_info", - argNames: ["info"], - ); + TaskConstMeta get kCrateApiApiGet2FaSmsOptsConstMeta => + const TaskConstMeta(debugName: "get_2fa_sms_opts", argNames: ["state"]); @override - Future crateApiApiGetRegstate({required ArcImClient state}) { - return handler.executeNormal(NormalTask( - callFfi: (port_) { - final serializer = SseSerializer(generalizedFrbRustBinding); - sse_encode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcIMClient( - state, serializer); - pdeCallFfi(generalizedFrbRustBinding, serializer, - funcId: 134, port: port_); - }, - codec: SseCodec( - decodeSuccessData: sse_decode_register_state, - decodeErrorData: sse_decode_AnyhowException, - ), - constMeta: kCrateApiApiGetRegstateConstMeta, - argValues: [state], - apiImpl: this, - )); + Future<(List, List)> crateApiApiGetAlbums({ + required SyncManagerDefaultAnisetteProviderMyFilePackager lock, + required bool refresh, + }) { + return handler.executeNormal( + NormalTask( + callFfi: (port_) { + final serializer = SseSerializer(generalizedFrbRustBinding); + sse_encode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerSyncManagerDefaultAnisetteProviderMyFilePackager( + lock, + serializer, + ); + sse_encode_bool(refresh, serializer); + pdeCallFfi( + generalizedFrbRustBinding, + serializer, + funcId: 132, + port: port_, + ); + }, + codec: SseCodec( + decodeSuccessData: sse_decode_record_list_shared_album_list_string, + decodeErrorData: sse_decode_AnyhowException, + ), + constMeta: kCrateApiApiGetAlbumsConstMeta, + argValues: [lock, refresh], + apiImpl: this, + ), + ); } - TaskConstMeta get kCrateApiApiGetRegstateConstMeta => const TaskConstMeta( - debugName: "get_regstate", - argNames: ["state"], - ); + TaskConstMeta get kCrateApiApiGetAlbumsConstMeta => const TaskConstMeta( + debugName: "get_albums", + argNames: ["lock", "refresh"], + ); @override - Future> crateApiApiGetSmsTargets( - {required ArcImClient state, - required String handle, - required bool refresh}) { - return handler.executeNormal(NormalTask( - callFfi: (port_) { - final serializer = SseSerializer(generalizedFrbRustBinding); - sse_encode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcIMClient( - state, serializer); - sse_encode_String(handle, serializer); - sse_encode_bool(refresh, serializer); - pdeCallFfi(generalizedFrbRustBinding, serializer, - funcId: 135, port: port_); - }, - codec: SseCodec( - decodeSuccessData: sse_decode_list_private_device_info, - decodeErrorData: sse_decode_AnyhowException, - ), - constMeta: kCrateApiApiGetSmsTargetsConstMeta, - argValues: [state, handle, refresh], - apiImpl: this, - )); + Future> crateApiApiGetAnisetteHeaders({ + required ArcAnisetteClientDefaultAnisetteProvider state, + required JoinedOsConfig config, + }) { + return handler.executeNormal( + NormalTask( + callFfi: (port_) { + final serializer = SseSerializer(generalizedFrbRustBinding); + sse_encode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcAnisetteClientDefaultAnisetteProvider( + state, + serializer, + ); + sse_encode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerJoinedOSConfig( + config, + serializer, + ); + pdeCallFfi( + generalizedFrbRustBinding, + serializer, + funcId: 133, + port: port_, + ); + }, + codec: SseCodec( + decodeSuccessData: sse_decode_Map_String_String, + decodeErrorData: sse_decode_AnyhowException, + ), + constMeta: kCrateApiApiGetAnisetteHeadersConstMeta, + argValues: [state, config], + apiImpl: this, + ), + ); } - TaskConstMeta get kCrateApiApiGetSmsTargetsConstMeta => const TaskConstMeta( - debugName: "get_sms_targets", - argNames: ["state", "handle", "refresh"], + TaskConstMeta get kCrateApiApiGetAnisetteHeadersConstMeta => + const TaskConstMeta( + debugName: "get_anisette_headers", + argNames: ["state", "config"], ); @override - Future<(Map, (String, BigInt)?)> crateApiApiGetSyncstatus( - {required SyncManagerDefaultAnisetteProviderMyFilePackager lock}) { - return handler.executeNormal(NormalTask( - callFfi: (port_) { - final serializer = SseSerializer(generalizedFrbRustBinding); - sse_encode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerSyncManagerDefaultAnisetteProviderMyFilePackager( - lock, serializer); - pdeCallFfi(generalizedFrbRustBinding, serializer, - funcId: 136, port: port_); - }, - codec: SseCodec( - decodeSuccessData: - sse_decode_record_map_string_sync_status_opt_box_autoadd_record_string_u_64, - decodeErrorData: sse_decode_AnyhowException, - ), - constMeta: kCrateApiApiGetSyncstatusConstMeta, - argValues: [lock], - apiImpl: this, - )); + Future crateApiApiGetApsConnectionStatus({ + required ApsConnection aps, + }) { + return handler.executeNormal( + NormalTask( + callFfi: (port_) { + final serializer = SseSerializer(generalizedFrbRustBinding); + sse_encode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerAPSConnection( + aps, + serializer, + ); + pdeCallFfi( + generalizedFrbRustBinding, + serializer, + funcId: 134, + port: port_, + ); + }, + codec: SseCodec( + decodeSuccessData: sse_decode_aps_connection_status, + decodeErrorData: null, + ), + constMeta: kCrateApiApiGetApsConnectionStatusConstMeta, + argValues: [aps], + apiImpl: this, + ), + ); } - TaskConstMeta get kCrateApiApiGetSyncstatusConstMeta => const TaskConstMeta( - debugName: "get_syncstatus", - argNames: ["lock"], + TaskConstMeta get kCrateApiApiGetApsConnectionStatusConstMeta => + const TaskConstMeta( + debugName: "get_aps_connection_status", + argNames: ["aps"], ); @override - Future crateApiApiGetToken({required ApsConnection state}) { - return handler.executeNormal(NormalTask( - callFfi: (port_) { - final serializer = SseSerializer(generalizedFrbRustBinding); - sse_encode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerAPSConnection( - state, serializer); - pdeCallFfi(generalizedFrbRustBinding, serializer, - funcId: 137, port: port_); - }, - codec: SseCodec( - decodeSuccessData: sse_decode_list_prim_u_8_strict, - decodeErrorData: null, - ), - constMeta: kCrateApiApiGetTokenConstMeta, - argValues: [state], - apiImpl: this, - )); + String? crateApiApiGetAvailableUser({required String path}) { + return handler.executeSync( + SyncTask( + callFfi: () { + final serializer = SseSerializer(generalizedFrbRustBinding); + sse_encode_String(path, serializer); + return pdeCallFfi( + generalizedFrbRustBinding, + serializer, + funcId: 135, + )!; + }, + codec: SseCodec( + decodeSuccessData: sse_decode_opt_String, + decodeErrorData: null, + ), + constMeta: kCrateApiApiGetAvailableUserConstMeta, + argValues: [path], + apiImpl: this, + ), + ); } - TaskConstMeta get kCrateApiApiGetTokenConstMeta => const TaskConstMeta( - debugName: "get_token", - argNames: ["state"], - ); + TaskConstMeta get kCrateApiApiGetAvailableUserConstMeta => + const TaskConstMeta(debugName: "get_available_user", argNames: ["path"]); @override - Future crateApiApiGetUserName( - {required ArcMutexAppleAccountDefaultAnisetteProvider state}) { - return handler.executeNormal(NormalTask( - callFfi: (port_) { - final serializer = SseSerializer(generalizedFrbRustBinding); - sse_encode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcMutexAppleAccountDefaultAnisetteProvider( - state, serializer); - pdeCallFfi(generalizedFrbRustBinding, serializer, - funcId: 138, port: port_); - }, - codec: SseCodec( - decodeSuccessData: sse_decode_String, - decodeErrorData: sse_decode_AnyhowException, - ), - constMeta: kCrateApiApiGetUserNameConstMeta, - argValues: [state], - apiImpl: this, - )); + Future> crateApiApiGetBackgroundFollowing({ + required ArcFindMyClientDefaultAnisetteProvider fmfd, + }) { + return handler.executeNormal( + NormalTask( + callFfi: (port_) { + final serializer = SseSerializer(generalizedFrbRustBinding); + sse_encode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcFindMyClientDefaultAnisetteProvider( + fmfd, + serializer, + ); + pdeCallFfi( + generalizedFrbRustBinding, + serializer, + funcId: 136, + port: port_, + ); + }, + codec: SseCodec( + decodeSuccessData: sse_decode_list_follow, + decodeErrorData: null, + ), + constMeta: kCrateApiApiGetBackgroundFollowingConstMeta, + argValues: [fmfd], + apiImpl: this, + ), + ); } - TaskConstMeta get kCrateApiApiGetUserNameConstMeta => const TaskConstMeta( - debugName: "get_user_name", - argNames: ["state"], + TaskConstMeta get kCrateApiApiGetBackgroundFollowingConstMeta => + const TaskConstMeta( + debugName: "get_background_following", + argNames: ["fmfd"], ); @override - Future> crateApiApiGetWifiPasswords( - {required ArcPasswordManagerDefaultAnisetteProvider passwords}) { - return handler.executeNormal(NormalTask( - callFfi: (port_) { - final serializer = SseSerializer(generalizedFrbRustBinding); - sse_encode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcPasswordManagerDefaultAnisetteProvider( - passwords, serializer); - pdeCallFfi(generalizedFrbRustBinding, serializer, - funcId: 139, port: port_); - }, - codec: SseCodec( - decodeSuccessData: - sse_decode_Map_String_record_opt_string_wifi_password, - decodeErrorData: null, - ), - constMeta: kCrateApiApiGetWifiPasswordsConstMeta, - argValues: [passwords], - apiImpl: this, - )); + Future> crateApiApiGetBeaconItems({ + required ArcFindMyClientDefaultAnisetteProvider items, + }) { + return handler.executeNormal( + NormalTask( + callFfi: (port_) { + final serializer = SseSerializer(generalizedFrbRustBinding); + sse_encode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcFindMyClientDefaultAnisetteProvider( + items, + serializer, + ); + pdeCallFfi( + generalizedFrbRustBinding, + serializer, + funcId: 137, + port: port_, + ); + }, + codec: SseCodec( + decodeSuccessData: sse_decode_list_dart_beacon, + decodeErrorData: sse_decode_AnyhowException, + ), + constMeta: kCrateApiApiGetBeaconItemsConstMeta, + argValues: [items], + apiImpl: this, + ), + ); } - TaskConstMeta get kCrateApiApiGetWifiPasswordsConstMeta => - const TaskConstMeta( - debugName: "get_wifi_passwords", - argNames: ["passwords"], - ); + TaskConstMeta get kCrateApiApiGetBeaconItemsConstMeta => + const TaskConstMeta(debugName: "get_beacon_items", argNames: ["items"]); @override - (Sender, ArcSenderPushMessage, ApsWatcher) crateApiApiImportWatcher( - {required ReceiverApsMessage queue, required ArcImClient client}) { - return handler.executeSync(SyncTask( - callFfi: () { - final serializer = SseSerializer(generalizedFrbRustBinding); - sse_encode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerReceiverAPSMessage( - queue, serializer); - sse_encode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcIMClient( - client, serializer); - return pdeCallFfi(generalizedFrbRustBinding, serializer, funcId: 140)!; - }, - codec: SseCodec( - decodeSuccessData: - sse_decode_record_auto_owned_rust_opaque_flutter_rust_bridgefor_generated_rust_auto_opaque_inner_sender_auto_owned_rust_opaque_flutter_rust_bridgefor_generated_rust_auto_opaque_inner_arc_sender_push_message_auto_owned_rust_opaque_flutter_rust_bridgefor_generated_rust_auto_opaque_inner_aps_watcher, - decodeErrorData: null, - ), - constMeta: kCrateApiApiImportWatcherConstMeta, - argValues: [queue, client], - apiImpl: this, - )); + Future> crateApiApiGetBottles({ + required ArcKeychainClientDefaultAnisetteProvider keychain, + }) { + return handler.executeNormal( + NormalTask( + callFfi: (port_) { + final serializer = SseSerializer(generalizedFrbRustBinding); + sse_encode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcKeychainClientDefaultAnisetteProvider( + keychain, + serializer, + ); + pdeCallFfi( + generalizedFrbRustBinding, + serializer, + funcId: 138, + port: port_, + ); + }, + codec: SseCodec( + decodeSuccessData: + sse_decode_list_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerViableBottle, + decodeErrorData: sse_decode_AnyhowException, + ), + constMeta: kCrateApiApiGetBottlesConstMeta, + argValues: [keychain], + apiImpl: this, + ), + ); } - TaskConstMeta get kCrateApiApiImportWatcherConstMeta => const TaskConstMeta( - debugName: "import_watcher", - argNames: ["queue", "client"], - ); + TaskConstMeta get kCrateApiApiGetBottlesConstMeta => + const TaskConstMeta(debugName: "get_bottles", argNames: ["keychain"]); @override - Future crateApiApiInvalidateIdCache({required ArcImClient client}) { - return handler.executeNormal(NormalTask( - callFfi: (port_) { - final serializer = SseSerializer(generalizedFrbRustBinding); - sse_encode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcIMClient( - client, serializer); - pdeCallFfi(generalizedFrbRustBinding, serializer, - funcId: 141, port: port_); - }, - codec: SseCodec( - decodeSuccessData: sse_decode_unit, - decodeErrorData: sse_decode_AnyhowException, - ), - constMeta: kCrateApiApiInvalidateIdCacheConstMeta, - argValues: [client], - apiImpl: this, - )); + Future> crateApiApiGetContactsHeaders({ + required String path, + required ArcAnisetteClientDefaultAnisetteProvider state, + required ArcTokenProviderDefaultAnisetteProvider tokenProvider, + required JoinedOsConfig config, + }) { + return handler.executeNormal( + NormalTask( + callFfi: (port_) { + final serializer = SseSerializer(generalizedFrbRustBinding); + sse_encode_String(path, serializer); + sse_encode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcAnisetteClientDefaultAnisetteProvider( + state, + serializer, + ); + sse_encode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcTokenProviderDefaultAnisetteProvider( + tokenProvider, + serializer, + ); + sse_encode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerJoinedOSConfig( + config, + serializer, + ); + pdeCallFfi( + generalizedFrbRustBinding, + serializer, + funcId: 139, + port: port_, + ); + }, + codec: SseCodec( + decodeSuccessData: sse_decode_Map_String_String, + decodeErrorData: sse_decode_AnyhowException, + ), + constMeta: kCrateApiApiGetContactsHeadersConstMeta, + argValues: [path, state, tokenProvider, config], + apiImpl: this, + ), + ); } - TaskConstMeta get kCrateApiApiInvalidateIdCacheConstMeta => + TaskConstMeta get kCrateApiApiGetContactsHeadersConstMeta => const TaskConstMeta( - debugName: "invalidate_id_cache", - argNames: ["client"], + debugName: "get_contacts_headers", + argNames: ["path", "state", "tokenProvider", "config"], ); @override - Future crateApiApiInviteToChannel( - {required ArcStatusKitClientDefaultAnisetteProvider status, - required String handle, - required Map to}) { - return handler.executeNormal(NormalTask( - callFfi: (port_) { - final serializer = SseSerializer(generalizedFrbRustBinding); - sse_encode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcStatusKitClientDefaultAnisetteProvider( - status, serializer); - sse_encode_String(handle, serializer); - sse_encode_Map_String_status_kit_personal_config(to, serializer); - pdeCallFfi(generalizedFrbRustBinding, serializer, - funcId: 142, port: port_); - }, - codec: SseCodec( - decodeSuccessData: sse_decode_unit, - decodeErrorData: sse_decode_AnyhowException, - ), - constMeta: kCrateApiApiInviteToChannelConstMeta, - argValues: [status, handle, to], - apiImpl: this, - )); + Future crateApiApiGetDeviceInfo({ + required JoinedOsConfig config, + }) { + return handler.executeNormal( + NormalTask( + callFfi: (port_) { + final serializer = SseSerializer(generalizedFrbRustBinding); + sse_encode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerJoinedOSConfig( + config, + serializer, + ); + pdeCallFfi( + generalizedFrbRustBinding, + serializer, + funcId: 140, + port: port_, + ); + }, + codec: SseCodec( + decodeSuccessData: sse_decode_device_info, + decodeErrorData: sse_decode_AnyhowException, + ), + constMeta: kCrateApiApiGetDeviceInfoConstMeta, + argValues: [config], + apiImpl: this, + ), + ); } - TaskConstMeta get kCrateApiApiInviteToChannelConstMeta => const TaskConstMeta( - debugName: "invite_to_channel", - argNames: ["status", "handle", "to"], - ); + TaskConstMeta get kCrateApiApiGetDeviceInfoConstMeta => + const TaskConstMeta(debugName: "get_device_info", argNames: ["config"]); @override - Future crateApiApiInviteUser( - {required ArcPasswordManagerDefaultAnisetteProvider passwords, - required String gid, - required String handle}) { - return handler.executeNormal(NormalTask( - callFfi: (port_) { - final serializer = SseSerializer(generalizedFrbRustBinding); - sse_encode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcPasswordManagerDefaultAnisetteProvider( - passwords, serializer); - sse_encode_String(gid, serializer); - sse_encode_String(handle, serializer); - pdeCallFfi(generalizedFrbRustBinding, serializer, - funcId: 143, port: port_); - }, - codec: SseCodec( - decodeSuccessData: sse_decode_unit, - decodeErrorData: sse_decode_AnyhowException, - ), - constMeta: kCrateApiApiInviteUserConstMeta, - argValues: [passwords, gid, handle], - apiImpl: this, - )); + Future> crateApiApiGetDevices({ + required FindMyPhoneClientDefaultAnisetteProvider client, + }) { + return handler.executeNormal( + NormalTask( + callFfi: (port_) { + final serializer = SseSerializer(generalizedFrbRustBinding); + sse_encode_Auto_RefMut_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerFindMyPhoneClientDefaultAnisetteProvider( + client, + serializer, + ); + pdeCallFfi( + generalizedFrbRustBinding, + serializer, + funcId: 141, + port: port_, + ); + }, + codec: SseCodec( + decodeSuccessData: sse_decode_list_found_device, + decodeErrorData: null, + ), + constMeta: kCrateApiApiGetDevicesConstMeta, + argValues: [client], + apiImpl: this, + ), + ); } - TaskConstMeta get kCrateApiApiInviteUserConstMeta => const TaskConstMeta( - debugName: "invite_user", - argNames: ["passwords", "gid", "handle"], - ); + TaskConstMeta get kCrateApiApiGetDevicesConstMeta => + const TaskConstMeta(debugName: "get_devices", argNames: ["client"]); @override - Future crateApiApiIsInClique( - {required ArcKeychainClientDefaultAnisetteProvider keychain}) { - return handler.executeNormal(NormalTask( - callFfi: (port_) { - final serializer = SseSerializer(generalizedFrbRustBinding); - sse_encode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcKeychainClientDefaultAnisetteProvider( - keychain, serializer); - pdeCallFfi(generalizedFrbRustBinding, serializer, - funcId: 144, port: port_); - }, - codec: SseCodec( - decodeSuccessData: sse_decode_bool, - decodeErrorData: null, - ), - constMeta: kCrateApiApiIsInCliqueConstMeta, - argValues: [keychain], - apiImpl: this, - )); + Future crateApiApiGetEntitlements({ + required JoinedOsConfig config, + required ApsConnection conn, + required String mccmnc, + required String subscriber, + required String imei, + required FutureOr Function(String) processChallenge, + }) { + return handler.executeNormal( + NormalTask( + callFfi: (port_) { + final serializer = SseSerializer(generalizedFrbRustBinding); + sse_encode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerJoinedOSConfig( + config, + serializer, + ); + sse_encode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerAPSConnection( + conn, + serializer, + ); + sse_encode_String(mccmnc, serializer); + sse_encode_String(subscriber, serializer); + sse_encode_String(imei, serializer); + sse_encode_DartFn_Inputs_String_Output_String_AnyhowException( + processChallenge, + serializer, + ); + pdeCallFfi( + generalizedFrbRustBinding, + serializer, + funcId: 142, + port: port_, + ); + }, + codec: SseCodec( + decodeSuccessData: + sse_decode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerIDSUser, + decodeErrorData: sse_decode_AnyhowException, + ), + constMeta: kCrateApiApiGetEntitlementsConstMeta, + argValues: [config, conn, mccmnc, subscriber, imei, processChallenge], + apiImpl: this, + ), + ); } - TaskConstMeta get kCrateApiApiIsInCliqueConstMeta => const TaskConstMeta( - debugName: "is_in_clique", - argNames: ["keychain"], - ); + TaskConstMeta get kCrateApiApiGetEntitlementsConstMeta => const TaskConstMeta( + debugName: "get_entitlements", + argNames: [ + "config", + "conn", + "mccmnc", + "subscriber", + "imei", + "processChallenge", + ], + ); @override - Future crateApiApiJoinCliqueWithBottle( - {required ArcKeychainClientDefaultAnisetteProvider keychain, - required EscrowData bottle, - required String password, - required String devicePassword}) { - return handler.executeNormal(NormalTask( - callFfi: (port_) { - final serializer = SseSerializer(generalizedFrbRustBinding); - sse_encode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcKeychainClientDefaultAnisetteProvider( - keychain, serializer); - sse_encode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerEscrowData( - bottle, serializer); - sse_encode_String(password, serializer); - sse_encode_String(devicePassword, serializer); - pdeCallFfi(generalizedFrbRustBinding, serializer, - funcId: 145, port: port_); - }, - codec: SseCodec( - decodeSuccessData: sse_decode_unit, - decodeErrorData: sse_decode_AnyhowException, - ), - constMeta: kCrateApiApiJoinCliqueWithBottleConstMeta, - argValues: [keychain, bottle, password, devicePassword], - apiImpl: this, - )); + Future> crateApiApiGetFollowing({ + required FindMyFriendsClientDefaultAnisetteProvider client, + }) { + return handler.executeNormal( + NormalTask( + callFfi: (port_) { + final serializer = SseSerializer(generalizedFrbRustBinding); + sse_encode_Auto_RefMut_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerFindMyFriendsClientDefaultAnisetteProvider( + client, + serializer, + ); + pdeCallFfi( + generalizedFrbRustBinding, + serializer, + funcId: 143, + port: port_, + ); + }, + codec: SseCodec( + decodeSuccessData: sse_decode_list_follow, + decodeErrorData: null, + ), + constMeta: kCrateApiApiGetFollowingConstMeta, + argValues: [client], + apiImpl: this, + ), + ); } - TaskConstMeta get kCrateApiApiJoinCliqueWithBottleConstMeta => - const TaskConstMeta( - debugName: "join_clique_with_bottle", - argNames: ["keychain", "bottle", "password", "devicePassword"], - ); + TaskConstMeta get kCrateApiApiGetFollowingConstMeta => + const TaskConstMeta(debugName: "get_following", argNames: ["client"]); @override - Future crateApiApiMakeAnisette( - {required String path, - required JoinedOsConfig config, - required ApsConnection conn}) { - return handler.executeNormal(NormalTask( - callFfi: (port_) { - final serializer = SseSerializer(generalizedFrbRustBinding); - sse_encode_String(path, serializer); - sse_encode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerJoinedOSConfig( - config, serializer); - sse_encode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerAPSConnection( - conn, serializer); - pdeCallFfi(generalizedFrbRustBinding, serializer, - funcId: 146, port: port_); - }, - codec: SseCodec( - decodeSuccessData: - sse_decode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcAnisetteClientDefaultAnisetteProvider, - decodeErrorData: null, - ), - constMeta: kCrateApiApiMakeAnisetteConstMeta, - argValues: [path, config, conn], - apiImpl: this, - )); + Future crateApiApiGetFtLink({ + required ArcFtClient facetime, + required String usage, + }) { + return handler.executeNormal( + NormalTask( + callFfi: (port_) { + final serializer = SseSerializer(generalizedFrbRustBinding); + sse_encode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcFTClient( + facetime, + serializer, + ); + sse_encode_String(usage, serializer); + pdeCallFfi( + generalizedFrbRustBinding, + serializer, + funcId: 144, + port: port_, + ); + }, + codec: SseCodec( + decodeSuccessData: sse_decode_String, + decodeErrorData: sse_decode_AnyhowException, + ), + constMeta: kCrateApiApiGetFtLinkConstMeta, + argValues: [facetime, usage], + apiImpl: this, + ), + ); } - TaskConstMeta get kCrateApiApiMakeAnisetteConstMeta => const TaskConstMeta( - debugName: "make_anisette", - argNames: ["path", "config", "conn"], - ); + TaskConstMeta get kCrateApiApiGetFtLinkConstMeta => const TaskConstMeta( + debugName: "get_ft_link", + argNames: ["facetime", "usage"], + ); @override - ArcMutexVecActiveCircleSession crateApiApiMakeCircleSessions() { - return handler.executeSync(SyncTask( - callFfi: () { - final serializer = SseSerializer(generalizedFrbRustBinding); - return pdeCallFfi(generalizedFrbRustBinding, serializer, funcId: 147)!; - }, - codec: SseCodec( - decodeSuccessData: - sse_decode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcMutexVecActiveCircleSession, - decodeErrorData: null, - ), - constMeta: kCrateApiApiMakeCircleSessionsConstMeta, - argValues: [], - apiImpl: this, - )); + Future< + (String, Map, Map) + > + crateApiApiGetGroups({ + required ArcPasswordManagerDefaultAnisetteProvider passwords, + }) { + return handler.executeNormal( + NormalTask( + callFfi: (port_) { + final serializer = SseSerializer(generalizedFrbRustBinding); + sse_encode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcPasswordManagerDefaultAnisetteProvider( + passwords, + serializer, + ); + pdeCallFfi( + generalizedFrbRustBinding, + serializer, + funcId: 145, + port: port_, + ); + }, + codec: SseCodec( + decodeSuccessData: + sse_decode_record_string_map_string_group_summary_map_string_share_invite_content_data, + decodeErrorData: sse_decode_AnyhowException, + ), + constMeta: kCrateApiApiGetGroupsConstMeta, + argValues: [passwords], + apiImpl: this, + ), + ); } - TaskConstMeta get kCrateApiApiMakeCircleSessionsConstMeta => - const TaskConstMeta( - debugName: "make_circle_sessions", - argNames: [], - ); + TaskConstMeta get kCrateApiApiGetGroupsConstMeta => + const TaskConstMeta(debugName: "get_groups", argNames: ["passwords"]); @override - ArcMutexOptionCircleClientSessionDefaultAnisetteProvider - crateApiApiMakeClientSession( - {CircleClientSessionDefaultAnisetteProvider? circle}) { - return handler.executeSync(SyncTask( - callFfi: () { - final serializer = SseSerializer(generalizedFrbRustBinding); - sse_encode_opt_box_autoadd_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerCircleClientSessionDefaultAnisetteProvider( - circle, serializer); - return pdeCallFfi(generalizedFrbRustBinding, serializer, funcId: 148)!; - }, - codec: SseCodec( - decodeSuccessData: - sse_decode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcMutexOptionCircleClientSessionDefaultAnisetteProvider, - decodeErrorData: null, - ), - constMeta: kCrateApiApiMakeClientSessionConstMeta, - argValues: [circle], - apiImpl: this, - )); + Future> crateApiApiGetHandles({required ArcImClient state}) { + return handler.executeNormal( + NormalTask( + callFfi: (port_) { + final serializer = SseSerializer(generalizedFrbRustBinding); + sse_encode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcIMClient( + state, + serializer, + ); + pdeCallFfi( + generalizedFrbRustBinding, + serializer, + funcId: 146, + port: port_, + ); + }, + codec: SseCodec( + decodeSuccessData: sse_decode_list_String, + decodeErrorData: sse_decode_AnyhowException, + ), + constMeta: kCrateApiApiGetHandlesConstMeta, + argValues: [state], + apiImpl: this, + ), + ); } - TaskConstMeta get kCrateApiApiMakeClientSessionConstMeta => - const TaskConstMeta( - debugName: "make_client_session", - argNames: ["circle"], - ); + TaskConstMeta get kCrateApiApiGetHandlesConstMeta => + const TaskConstMeta(debugName: "get_handles", argNames: ["state"]); @override - ArcCloudMessagesClientDefaultAnisetteProvider - crateApiApiMakeCloudMessagesClient( - {required ArcCloudKitClientDefaultAnisetteProvider cloudkit, - required ArcKeychainClientDefaultAnisetteProvider keychain}) { - return handler.executeSync(SyncTask( - callFfi: () { - final serializer = SseSerializer(generalizedFrbRustBinding); - sse_encode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcCloudKitClientDefaultAnisetteProvider( - cloudkit, serializer); - sse_encode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcKeychainClientDefaultAnisetteProvider( - keychain, serializer); - return pdeCallFfi(generalizedFrbRustBinding, serializer, funcId: 149)!; - }, - codec: SseCodec( - decodeSuccessData: - sse_decode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcCloudMessagesClientDefaultAnisetteProvider, - decodeErrorData: null, - ), - constMeta: kCrateApiApiMakeCloudMessagesClientConstMeta, - argValues: [cloudkit, keychain], - apiImpl: this, - )); + Future> crateApiApiGetMyPhoneHandles({ + required ArcImClient state, + }) { + return handler.executeNormal( + NormalTask( + callFfi: (port_) { + final serializer = SseSerializer(generalizedFrbRustBinding); + sse_encode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcIMClient( + state, + serializer, + ); + pdeCallFfi( + generalizedFrbRustBinding, + serializer, + funcId: 147, + port: port_, + ); + }, + codec: SseCodec( + decodeSuccessData: sse_decode_list_String, + decodeErrorData: sse_decode_AnyhowException, + ), + constMeta: kCrateApiApiGetMyPhoneHandlesConstMeta, + argValues: [state], + apiImpl: this, + ), + ); } - TaskConstMeta get kCrateApiApiMakeCloudMessagesClientConstMeta => + TaskConstMeta get kCrateApiApiGetMyPhoneHandlesConstMeta => const TaskConstMeta( - debugName: "make_cloud_messages_client", - argNames: ["cloudkit", "keychain"], + debugName: "get_my_phone_handles", + argNames: ["state"], ); @override - Future crateApiApiMakeCloudkit( - {required String path, - required ArcAnisetteClientDefaultAnisetteProvider anisette, - required JoinedOsConfig config, - required ArcTokenProviderDefaultAnisetteProvider tokenProvider}) { - return handler.executeNormal(NormalTask( - callFfi: (port_) { - final serializer = SseSerializer(generalizedFrbRustBinding); - sse_encode_String(path, serializer); - sse_encode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcAnisetteClientDefaultAnisetteProvider( - anisette, serializer); - sse_encode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerJoinedOSConfig( - config, serializer); - sse_encode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcTokenProviderDefaultAnisetteProvider( - tokenProvider, serializer); - pdeCallFfi(generalizedFrbRustBinding, serializer, - funcId: 150, port: port_); - }, - codec: SseCodec( - decodeSuccessData: - sse_decode_opt_box_autoadd_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcCloudKitClientDefaultAnisetteProvider, - decodeErrorData: null, - ), - constMeta: kCrateApiApiMakeCloudkitConstMeta, - argValues: [path, anisette, config, tokenProvider], - apiImpl: this, - )); + Future> crateApiApiGetPasskeys({ + required ArcPasswordManagerDefaultAnisetteProvider passwords, + }) { + return handler.executeNormal( + NormalTask( + callFfi: (port_) { + final serializer = SseSerializer(generalizedFrbRustBinding); + sse_encode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcPasswordManagerDefaultAnisetteProvider( + passwords, + serializer, + ); + pdeCallFfi( + generalizedFrbRustBinding, + serializer, + funcId: 148, + port: port_, + ); + }, + codec: SseCodec( + decodeSuccessData: sse_decode_Map_String_record_opt_string_passkey, + decodeErrorData: null, + ), + constMeta: kCrateApiApiGetPasskeysConstMeta, + argValues: [passwords], + apiImpl: this, + ), + ); } - TaskConstMeta get kCrateApiApiMakeCloudkitConstMeta => const TaskConstMeta( - debugName: "make_cloudkit", - argNames: ["path", "anisette", "config", "tokenProvider"], - ); + TaskConstMeta get kCrateApiApiGetPasskeysConstMeta => + const TaskConstMeta(debugName: "get_passkeys", argNames: ["passwords"]); @override - Future crateApiApiMakeFacetime( - {required String path, - required ApsConnection conn, - required ArcImClient client}) { - return handler.executeNormal(NormalTask( - callFfi: (port_) { - final serializer = SseSerializer(generalizedFrbRustBinding); - sse_encode_String(path, serializer); - sse_encode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerAPSConnection( - conn, serializer); - sse_encode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcIMClient( - client, serializer); - pdeCallFfi(generalizedFrbRustBinding, serializer, - funcId: 151, port: port_); - }, - codec: SseCodec( - decodeSuccessData: - sse_decode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcFTClient, - decodeErrorData: null, - ), - constMeta: kCrateApiApiMakeFacetimeConstMeta, - argValues: [path, conn, client], - apiImpl: this, - )); + Future> crateApiApiGetPasswords({ + required ArcPasswordManagerDefaultAnisetteProvider passwords, + }) { + return handler.executeNormal( + NormalTask( + callFfi: (port_) { + final serializer = SseSerializer(generalizedFrbRustBinding); + sse_encode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcPasswordManagerDefaultAnisetteProvider( + passwords, + serializer, + ); + pdeCallFfi( + generalizedFrbRustBinding, + serializer, + funcId: 149, + port: port_, + ); + }, + codec: SseCodec( + decodeSuccessData: + sse_decode_Map_String_record_opt_string_password_raw_entry, + decodeErrorData: null, + ), + constMeta: kCrateApiApiGetPasswordsConstMeta, + argValues: [passwords], + apiImpl: this, + ), + ); } - TaskConstMeta get kCrateApiApiMakeFacetimeConstMeta => const TaskConstMeta( - debugName: "make_facetime", - argNames: ["path", "conn", "client"], - ); + TaskConstMeta get kCrateApiApiGetPasswordsConstMeta => + const TaskConstMeta(debugName: "get_passwords", argNames: ["passwords"]); @override - Future - crateApiApiMakeFindMyFriends( - {required String path, - required JoinedOsConfig config, - required ApsConnection aps, - required ArcAnisetteClientDefaultAnisetteProvider anisette, - required ArcTokenProviderDefaultAnisetteProvider provider}) { - return handler.executeNormal(NormalTask( - callFfi: (port_) { - final serializer = SseSerializer(generalizedFrbRustBinding); - sse_encode_String(path, serializer); - sse_encode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerJoinedOSConfig( - config, serializer); - sse_encode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerAPSConnection( - aps, serializer); - sse_encode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcAnisetteClientDefaultAnisetteProvider( - anisette, serializer); - sse_encode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcTokenProviderDefaultAnisetteProvider( - provider, serializer); - pdeCallFfi(generalizedFrbRustBinding, serializer, - funcId: 152, port: port_); - }, - codec: SseCodec( - decodeSuccessData: - sse_decode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerFindMyFriendsClientDefaultAnisetteProvider, - decodeErrorData: sse_decode_AnyhowException, - ), - constMeta: kCrateApiApiMakeFindMyFriendsConstMeta, - argValues: [path, config, aps, anisette, provider], - apiImpl: this, - )); + Future> + crateApiApiGetPasswordsMeta({ + required ArcPasswordManagerDefaultAnisetteProvider passwords, + }) { + return handler.executeNormal( + NormalTask( + callFfi: (port_) { + final serializer = SseSerializer(generalizedFrbRustBinding); + sse_encode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcPasswordManagerDefaultAnisetteProvider( + passwords, + serializer, + ); + pdeCallFfi( + generalizedFrbRustBinding, + serializer, + funcId: 150, + port: port_, + ); + }, + codec: SseCodec( + decodeSuccessData: + sse_decode_Map_String_record_opt_string_password_manager_meta, + decodeErrorData: null, + ), + constMeta: kCrateApiApiGetPasswordsMetaConstMeta, + argValues: [passwords], + apiImpl: this, + ), + ); } - TaskConstMeta get kCrateApiApiMakeFindMyFriendsConstMeta => + TaskConstMeta get kCrateApiApiGetPasswordsMetaConstMeta => const TaskConstMeta( - debugName: "make_find_my_friends", - argNames: ["path", "config", "aps", "anisette", "provider"], + debugName: "get_passwords_meta", + argNames: ["passwords"], ); @override - Future crateApiApiMakeFindMyPhone( - {required String path, - required JoinedOsConfig config, - required ApsConnection aps, - required ArcAnisetteClientDefaultAnisetteProvider anisette, - required ArcTokenProviderDefaultAnisetteProvider provider}) { - return handler.executeNormal(NormalTask( - callFfi: (port_) { - final serializer = SseSerializer(generalizedFrbRustBinding); - sse_encode_String(path, serializer); - sse_encode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerJoinedOSConfig( - config, serializer); - sse_encode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerAPSConnection( - aps, serializer); - sse_encode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcAnisetteClientDefaultAnisetteProvider( - anisette, serializer); - sse_encode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcTokenProviderDefaultAnisetteProvider( - provider, serializer); - pdeCallFfi(generalizedFrbRustBinding, serializer, - funcId: 153, port: port_); - }, - codec: SseCodec( - decodeSuccessData: - sse_decode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerFindMyPhoneClientDefaultAnisetteProvider, - decodeErrorData: sse_decode_AnyhowException, - ), - constMeta: kCrateApiApiMakeFindMyPhoneConstMeta, - argValues: [path, config, aps, anisette, provider], - apiImpl: this, - )); + Future crateApiApiGetQuotaInfo({ + required ArcTokenProviderDefaultAnisetteProvider info, + }) { + return handler.executeNormal( + NormalTask( + callFfi: (port_) { + final serializer = SseSerializer(generalizedFrbRustBinding); + sse_encode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcTokenProviderDefaultAnisetteProvider( + info, + serializer, + ); + pdeCallFfi( + generalizedFrbRustBinding, + serializer, + funcId: 151, + port: port_, + ); + }, + codec: SseCodec( + decodeSuccessData: sse_decode_quota_info, + decodeErrorData: sse_decode_AnyhowException, + ), + constMeta: kCrateApiApiGetQuotaInfoConstMeta, + argValues: [info], + apiImpl: this, + ), + ); } - TaskConstMeta get kCrateApiApiMakeFindMyPhoneConstMeta => const TaskConstMeta( - debugName: "make_find_my_phone", - argNames: ["path", "config", "aps", "anisette", "provider"], - ); + TaskConstMeta get kCrateApiApiGetQuotaInfoConstMeta => + const TaskConstMeta(debugName: "get_quota_info", argNames: ["info"]); @override - Future crateApiApiMakeFindmy( - {required String path, - required ArcTokenProviderDefaultAnisetteProvider tokenProvider, - required ApsConnection conn, - required ArcCloudKitClientDefaultAnisetteProvider cloudkit, - required ArcKeychainClientDefaultAnisetteProvider keychain, - required ArcAnisetteClientDefaultAnisetteProvider anisette, - required JoinedOsConfig config, - required ArcImClient client}) { - return handler.executeNormal(NormalTask( - callFfi: (port_) { - final serializer = SseSerializer(generalizedFrbRustBinding); - sse_encode_String(path, serializer); - sse_encode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcTokenProviderDefaultAnisetteProvider( - tokenProvider, serializer); - sse_encode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerAPSConnection( - conn, serializer); - sse_encode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcCloudKitClientDefaultAnisetteProvider( - cloudkit, serializer); - sse_encode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcKeychainClientDefaultAnisetteProvider( - keychain, serializer); - sse_encode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcAnisetteClientDefaultAnisetteProvider( - anisette, serializer); - sse_encode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerJoinedOSConfig( - config, serializer); - sse_encode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcIMClient( - client, serializer); - pdeCallFfi(generalizedFrbRustBinding, serializer, - funcId: 154, port: port_); - }, - codec: SseCodec( - decodeSuccessData: - sse_decode_opt_box_autoadd_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcFindMyClientDefaultAnisetteProvider, - decodeErrorData: null, - ), - constMeta: kCrateApiApiMakeFindmyConstMeta, - argValues: [ - path, - tokenProvider, - conn, - cloudkit, - keychain, - anisette, - config, - client - ], - apiImpl: this, - )); + Future crateApiApiGetRegstate({required ArcImClient state}) { + return handler.executeNormal( + NormalTask( + callFfi: (port_) { + final serializer = SseSerializer(generalizedFrbRustBinding); + sse_encode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcIMClient( + state, + serializer, + ); + pdeCallFfi( + generalizedFrbRustBinding, + serializer, + funcId: 152, + port: port_, + ); + }, + codec: SseCodec( + decodeSuccessData: sse_decode_register_state, + decodeErrorData: sse_decode_AnyhowException, + ), + constMeta: kCrateApiApiGetRegstateConstMeta, + argValues: [state], + apiImpl: this, + ), + ); } - TaskConstMeta get kCrateApiApiMakeFindmyConstMeta => const TaskConstMeta( - debugName: "make_findmy", - argNames: [ - "path", - "tokenProvider", - "conn", - "cloudkit", - "keychain", - "anisette", - "config", - "client" - ], - ); + TaskConstMeta get kCrateApiApiGetRegstateConstMeta => + const TaskConstMeta(debugName: "get_regstate", argNames: ["state"]); @override - Future crateApiApiMakeIdms( - {required ApsConnection conn}) { - return handler.executeNormal(NormalTask( - callFfi: (port_) { - final serializer = SseSerializer(generalizedFrbRustBinding); - sse_encode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerAPSConnection( - conn, serializer); - pdeCallFfi(generalizedFrbRustBinding, serializer, - funcId: 155, port: port_); - }, - codec: SseCodec( - decodeSuccessData: - sse_decode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcIdmsAuthListener, - decodeErrorData: null, - ), - constMeta: kCrateApiApiMakeIdmsConstMeta, - argValues: [conn], - apiImpl: this, - )); + Future> crateApiApiGetSmsTargets({ + required ArcImClient state, + required String handle, + required bool refresh, + }) { + return handler.executeNormal( + NormalTask( + callFfi: (port_) { + final serializer = SseSerializer(generalizedFrbRustBinding); + sse_encode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcIMClient( + state, + serializer, + ); + sse_encode_String(handle, serializer); + sse_encode_bool(refresh, serializer); + pdeCallFfi( + generalizedFrbRustBinding, + serializer, + funcId: 153, + port: port_, + ); + }, + codec: SseCodec( + decodeSuccessData: sse_decode_list_private_device_info, + decodeErrorData: sse_decode_AnyhowException, + ), + constMeta: kCrateApiApiGetSmsTargetsConstMeta, + argValues: [state, handle, refresh], + apiImpl: this, + ), + ); } - TaskConstMeta get kCrateApiApiMakeIdmsConstMeta => const TaskConstMeta( - debugName: "make_idms", - argNames: ["conn"], - ); + TaskConstMeta get kCrateApiApiGetSmsTargetsConstMeta => const TaskConstMeta( + debugName: "get_sms_targets", + argNames: ["state", "handle", "refresh"], + ); @override - Future crateApiApiMakeImclient( - {required String path, - required ApsConnection conn, - required List users, - required IdsngmIdentity identity}) { - return handler.executeNormal(NormalTask( - callFfi: (port_) { - final serializer = SseSerializer(generalizedFrbRustBinding); - sse_encode_String(path, serializer); - sse_encode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerAPSConnection( - conn, serializer); - sse_encode_list_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerIDSUser( - users, serializer); - sse_encode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerIDSNGMIdentity( - identity, serializer); - pdeCallFfi(generalizedFrbRustBinding, serializer, - funcId: 156, port: port_); - }, - codec: SseCodec( - decodeSuccessData: - sse_decode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcIMClient, - decodeErrorData: null, - ), - constMeta: kCrateApiApiMakeImclientConstMeta, - argValues: [path, conn, users, identity], - apiImpl: this, - )); + Future<(Map, (String, BigInt)?)> + crateApiApiGetSyncstatus({ + required SyncManagerDefaultAnisetteProviderMyFilePackager lock, + }) { + return handler.executeNormal( + NormalTask( + callFfi: (port_) { + final serializer = SseSerializer(generalizedFrbRustBinding); + sse_encode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerSyncManagerDefaultAnisetteProviderMyFilePackager( + lock, + serializer, + ); + pdeCallFfi( + generalizedFrbRustBinding, + serializer, + funcId: 154, + port: port_, + ); + }, + codec: SseCodec( + decodeSuccessData: + sse_decode_record_map_string_sync_status_opt_box_autoadd_record_string_u_64, + decodeErrorData: sse_decode_AnyhowException, + ), + constMeta: kCrateApiApiGetSyncstatusConstMeta, + argValues: [lock], + apiImpl: this, + ), + ); } - TaskConstMeta get kCrateApiApiMakeImclientConstMeta => const TaskConstMeta( - debugName: "make_imclient", - argNames: ["path", "conn", "users", "identity"], - ); + TaskConstMeta get kCrateApiApiGetSyncstatusConstMeta => + const TaskConstMeta(debugName: "get_syncstatus", argNames: ["lock"]); @override - ArcKeychainClientDefaultAnisetteProvider? crateApiApiMakeKeychain( - {required String path, - required ArcCloudKitClientDefaultAnisetteProvider cloudkit, - required ArcAnisetteClientDefaultAnisetteProvider anisette, - required JoinedOsConfig config, - required ArcTokenProviderDefaultAnisetteProvider tokenProvider}) { - return handler.executeSync(SyncTask( - callFfi: () { - final serializer = SseSerializer(generalizedFrbRustBinding); - sse_encode_String(path, serializer); - sse_encode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcCloudKitClientDefaultAnisetteProvider( - cloudkit, serializer); - sse_encode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcAnisetteClientDefaultAnisetteProvider( - anisette, serializer); - sse_encode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerJoinedOSConfig( - config, serializer); - sse_encode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcTokenProviderDefaultAnisetteProvider( - tokenProvider, serializer); - return pdeCallFfi(generalizedFrbRustBinding, serializer, funcId: 157)!; - }, - codec: SseCodec( - decodeSuccessData: - sse_decode_opt_box_autoadd_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcKeychainClientDefaultAnisetteProvider, - decodeErrorData: null, - ), - constMeta: kCrateApiApiMakeKeychainConstMeta, - argValues: [path, cloudkit, anisette, config, tokenProvider], - apiImpl: this, - )); + Future crateApiApiGetToken({required ApsConnection state}) { + return handler.executeNormal( + NormalTask( + callFfi: (port_) { + final serializer = SseSerializer(generalizedFrbRustBinding); + sse_encode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerAPSConnection( + state, + serializer, + ); + pdeCallFfi( + generalizedFrbRustBinding, + serializer, + funcId: 155, + port: port_, + ); + }, + codec: SseCodec( + decodeSuccessData: sse_decode_list_prim_u_8_strict, + decodeErrorData: null, + ), + constMeta: kCrateApiApiGetTokenConstMeta, + argValues: [state], + apiImpl: this, + ), + ); } - TaskConstMeta get kCrateApiApiMakeKeychainConstMeta => const TaskConstMeta( - debugName: "make_keychain", - argNames: ["path", "cloudkit", "anisette", "config", "tokenProvider"], - ); + TaskConstMeta get kCrateApiApiGetTokenConstMeta => + const TaskConstMeta(debugName: "get_token", argNames: ["state"]); @override - Future crateApiApiMakePasswords( - {required String path, - required ArcKeychainClientDefaultAnisetteProvider keychain, - required ArcCloudKitClientDefaultAnisetteProvider cloudkit, - required ArcImClient client, - required ApsConnection conn}) { - return handler.executeNormal(NormalTask( - callFfi: (port_) { - final serializer = SseSerializer(generalizedFrbRustBinding); - sse_encode_String(path, serializer); - sse_encode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcKeychainClientDefaultAnisetteProvider( - keychain, serializer); - sse_encode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcCloudKitClientDefaultAnisetteProvider( - cloudkit, serializer); - sse_encode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcIMClient( - client, serializer); - sse_encode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerAPSConnection( - conn, serializer); - pdeCallFfi(generalizedFrbRustBinding, serializer, - funcId: 158, port: port_); - }, - codec: SseCodec( - decodeSuccessData: - sse_decode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcPasswordManagerDefaultAnisetteProvider, - decodeErrorData: null, - ), - constMeta: kCrateApiApiMakePasswordsConstMeta, - argValues: [path, keychain, cloudkit, client, conn], - apiImpl: this, - )); + Future crateApiApiGetUserName({ + required ArcMutexAppleAccountDefaultAnisetteProvider state, + }) { + return handler.executeNormal( + NormalTask( + callFfi: (port_) { + final serializer = SseSerializer(generalizedFrbRustBinding); + sse_encode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcMutexAppleAccountDefaultAnisetteProvider( + state, + serializer, + ); + pdeCallFfi( + generalizedFrbRustBinding, + serializer, + funcId: 156, + port: port_, + ); + }, + codec: SseCodec( + decodeSuccessData: sse_decode_String, + decodeErrorData: sse_decode_AnyhowException, + ), + constMeta: kCrateApiApiGetUserNameConstMeta, + argValues: [state], + apiImpl: this, + ), + ); } - TaskConstMeta get kCrateApiApiMakePasswordsConstMeta => const TaskConstMeta( - debugName: "make_passwords", - argNames: ["path", "keychain", "cloudkit", "client", "conn"], - ); + TaskConstMeta get kCrateApiApiGetUserNameConstMeta => + const TaskConstMeta(debugName: "get_user_name", argNames: ["state"]); @override - Future crateApiApiMakeProfiles( - {required ArcCloudKitClientDefaultAnisetteProvider cloudkit}) { - return handler.executeNormal(NormalTask( - callFfi: (port_) { - final serializer = SseSerializer(generalizedFrbRustBinding); - sse_encode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcCloudKitClientDefaultAnisetteProvider( - cloudkit, serializer); - pdeCallFfi(generalizedFrbRustBinding, serializer, - funcId: 159, port: port_); - }, - codec: SseCodec( - decodeSuccessData: - sse_decode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcProfilesClientDefaultAnisetteProvider, - decodeErrorData: null, - ), - constMeta: kCrateApiApiMakeProfilesConstMeta, - argValues: [cloudkit], - apiImpl: this, - )); + Future> crateApiApiGetWifiPasswords({ + required ArcPasswordManagerDefaultAnisetteProvider passwords, + }) { + return handler.executeNormal( + NormalTask( + callFfi: (port_) { + final serializer = SseSerializer(generalizedFrbRustBinding); + sse_encode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcPasswordManagerDefaultAnisetteProvider( + passwords, + serializer, + ); + pdeCallFfi( + generalizedFrbRustBinding, + serializer, + funcId: 157, + port: port_, + ); + }, + codec: SseCodec( + decodeSuccessData: + sse_decode_Map_String_record_opt_string_wifi_password, + decodeErrorData: null, + ), + constMeta: kCrateApiApiGetWifiPasswordsConstMeta, + argValues: [passwords], + apiImpl: this, + ), + ); } - TaskConstMeta get kCrateApiApiMakeProfilesConstMeta => const TaskConstMeta( - debugName: "make_profiles", - argNames: ["cloudkit"], + TaskConstMeta get kCrateApiApiGetWifiPasswordsConstMeta => + const TaskConstMeta( + debugName: "get_wifi_passwords", + argNames: ["passwords"], ); @override - Future - crateApiApiMakeSharedStreams( - {required String path, - required ApsConnection conn, - required ArcAnisetteClientDefaultAnisetteProvider anisette, - required JoinedOsConfig config, - required ArcTokenProviderDefaultAnisetteProvider token}) { - return handler.executeNormal(NormalTask( - callFfi: (port_) { - final serializer = SseSerializer(generalizedFrbRustBinding); - sse_encode_String(path, serializer); - sse_encode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerAPSConnection( - conn, serializer); - sse_encode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcAnisetteClientDefaultAnisetteProvider( - anisette, serializer); - sse_encode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerJoinedOSConfig( - config, serializer); - sse_encode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcTokenProviderDefaultAnisetteProvider( - token, serializer); - pdeCallFfi(generalizedFrbRustBinding, serializer, - funcId: 160, port: port_); - }, - codec: SseCodec( - decodeSuccessData: - sse_decode_opt_box_autoadd_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerSyncManagerDefaultAnisetteProviderMyFilePackager, - decodeErrorData: null, - ), - constMeta: kCrateApiApiMakeSharedStreamsConstMeta, - argValues: [path, conn, anisette, config, token], - apiImpl: this, - )); + (Sender, ArcSenderPushMessage, ApsWatcher) crateApiApiImportWatcher({ + required ReceiverApsMessage queue, + required ArcImClient client, + }) { + return handler.executeSync( + SyncTask( + callFfi: () { + final serializer = SseSerializer(generalizedFrbRustBinding); + sse_encode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerReceiverAPSMessage( + queue, + serializer, + ); + sse_encode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcIMClient( + client, + serializer, + ); + return pdeCallFfi( + generalizedFrbRustBinding, + serializer, + funcId: 158, + )!; + }, + codec: SseCodec( + decodeSuccessData: + sse_decode_record_auto_owned_rust_opaque_flutter_rust_bridgefor_generated_rust_auto_opaque_inner_sender_auto_owned_rust_opaque_flutter_rust_bridgefor_generated_rust_auto_opaque_inner_arc_sender_push_message_auto_owned_rust_opaque_flutter_rust_bridgefor_generated_rust_auto_opaque_inner_aps_watcher, + decodeErrorData: null, + ), + constMeta: kCrateApiApiImportWatcherConstMeta, + argValues: [queue, client], + apiImpl: this, + ), + ); } - TaskConstMeta get kCrateApiApiMakeSharedStreamsConstMeta => - const TaskConstMeta( - debugName: "make_shared_streams", - argNames: ["path", "conn", "anisette", "config", "token"], - ); + TaskConstMeta get kCrateApiApiImportWatcherConstMeta => const TaskConstMeta( + debugName: "import_watcher", + argNames: ["queue", "client"], + ); @override - Future crateApiApiMakeStatuskit( - {required String path, - required ArcTokenProviderDefaultAnisetteProvider provider, - required ApsConnection conn, - required JoinedOsConfig config, - required ArcImClient client}) { - return handler.executeNormal(NormalTask( - callFfi: (port_) { - final serializer = SseSerializer(generalizedFrbRustBinding); - sse_encode_String(path, serializer); - sse_encode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcTokenProviderDefaultAnisetteProvider( - provider, serializer); - sse_encode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerAPSConnection( - conn, serializer); - sse_encode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerJoinedOSConfig( - config, serializer); - sse_encode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcIMClient( - client, serializer); - pdeCallFfi(generalizedFrbRustBinding, serializer, - funcId: 161, port: port_); - }, - codec: SseCodec( - decodeSuccessData: - sse_decode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcStatusKitClientDefaultAnisetteProvider, - decodeErrorData: null, - ), - constMeta: kCrateApiApiMakeStatuskitConstMeta, - argValues: [path, provider, conn, config, client], - apiImpl: this, - )); + Future crateApiApiInvalidateIdCache({required ArcImClient client}) { + return handler.executeNormal( + NormalTask( + callFfi: (port_) { + final serializer = SseSerializer(generalizedFrbRustBinding); + sse_encode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcIMClient( + client, + serializer, + ); + pdeCallFfi( + generalizedFrbRustBinding, + serializer, + funcId: 159, + port: port_, + ); + }, + codec: SseCodec( + decodeSuccessData: sse_decode_unit, + decodeErrorData: sse_decode_AnyhowException, + ), + constMeta: kCrateApiApiInvalidateIdCacheConstMeta, + argValues: [client], + apiImpl: this, + ), + ); } - TaskConstMeta get kCrateApiApiMakeStatuskitConstMeta => const TaskConstMeta( - debugName: "make_statuskit", - argNames: ["path", "provider", "conn", "config", "client"], + TaskConstMeta get kCrateApiApiInvalidateIdCacheConstMeta => + const TaskConstMeta( + debugName: "invalidate_id_cache", + argNames: ["client"], ); @override - ArcTokenProviderDefaultAnisetteProvider crateApiApiMakeTokenProvider( - {required ArcMutexAppleAccountDefaultAnisetteProvider account, - required JoinedOsConfig config}) { - return handler.executeSync(SyncTask( - callFfi: () { - final serializer = SseSerializer(generalizedFrbRustBinding); - sse_encode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcMutexAppleAccountDefaultAnisetteProvider( - account, serializer); - sse_encode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerJoinedOSConfig( - config, serializer); - return pdeCallFfi(generalizedFrbRustBinding, serializer, funcId: 162)!; - }, - codec: SseCodec( - decodeSuccessData: - sse_decode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcTokenProviderDefaultAnisetteProvider, - decodeErrorData: null, - ), - constMeta: kCrateApiApiMakeTokenProviderConstMeta, - argValues: [account, config], - apiImpl: this, - )); + Future crateApiApiInviteToChannel({ + required ArcStatusKitClientDefaultAnisetteProvider status, + required String handle, + required Map to, + }) { + return handler.executeNormal( + NormalTask( + callFfi: (port_) { + final serializer = SseSerializer(generalizedFrbRustBinding); + sse_encode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcStatusKitClientDefaultAnisetteProvider( + status, + serializer, + ); + sse_encode_String(handle, serializer); + sse_encode_Map_String_status_kit_personal_config(to, serializer); + pdeCallFfi( + generalizedFrbRustBinding, + serializer, + funcId: 160, + port: port_, + ); + }, + codec: SseCodec( + decodeSuccessData: sse_decode_unit, + decodeErrorData: sse_decode_AnyhowException, + ), + constMeta: kCrateApiApiInviteToChannelConstMeta, + argValues: [status, handle, to], + apiImpl: this, + ), + ); } - TaskConstMeta get kCrateApiApiMakeTokenProviderConstMeta => - const TaskConstMeta( - debugName: "make_token_provider", - argNames: ["account", "config"], - ); + TaskConstMeta get kCrateApiApiInviteToChannelConstMeta => const TaskConstMeta( + debugName: "invite_to_channel", + argNames: ["status", "handle", "to"], + ); @override - Future crateApiApiMessagePartsRawText({required MessageParts that}) { - return handler.executeNormal(NormalTask( - callFfi: (port_) { - final serializer = SseSerializer(generalizedFrbRustBinding); - sse_encode_box_autoadd_message_parts(that, serializer); - pdeCallFfi(generalizedFrbRustBinding, serializer, - funcId: 163, port: port_); - }, - codec: SseCodec( - decodeSuccessData: sse_decode_String, - decodeErrorData: null, - ), - constMeta: kCrateApiApiMessagePartsRawTextConstMeta, - argValues: [that], - apiImpl: this, - )); + Future crateApiApiInviteUser({ + required ArcPasswordManagerDefaultAnisetteProvider passwords, + required String gid, + required String handle, + }) { + return handler.executeNormal( + NormalTask( + callFfi: (port_) { + final serializer = SseSerializer(generalizedFrbRustBinding); + sse_encode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcPasswordManagerDefaultAnisetteProvider( + passwords, + serializer, + ); + sse_encode_String(gid, serializer); + sse_encode_String(handle, serializer); + pdeCallFfi( + generalizedFrbRustBinding, + serializer, + funcId: 161, + port: port_, + ); + }, + codec: SseCodec( + decodeSuccessData: sse_decode_unit, + decodeErrorData: sse_decode_AnyhowException, + ), + constMeta: kCrateApiApiInviteUserConstMeta, + argValues: [passwords, gid, handle], + apiImpl: this, + ), + ); } - TaskConstMeta get kCrateApiApiMessagePartsRawTextConstMeta => - const TaskConstMeta( - debugName: "message_parts_raw_text", - argNames: ["that"], - ); + TaskConstMeta get kCrateApiApiInviteUserConstMeta => const TaskConstMeta( + debugName: "invite_user", + argNames: ["passwords", "gid", "handle"], + ); @override - Date crateApiApiMsToDate({required int ms}) { - return handler.executeSync(SyncTask( - callFfi: () { - final serializer = SseSerializer(generalizedFrbRustBinding); - sse_encode_CastedPrimitive_u_64(ms, serializer); - return pdeCallFfi(generalizedFrbRustBinding, serializer, funcId: 164)!; - }, - codec: SseCodec( - decodeSuccessData: - sse_decode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerDate, - decodeErrorData: null, - ), - constMeta: kCrateApiApiMsToDateConstMeta, - argValues: [ms], - apiImpl: this, - )); + Future crateApiApiIsInClique({ + required ArcKeychainClientDefaultAnisetteProvider keychain, + }) { + return handler.executeNormal( + NormalTask( + callFfi: (port_) { + final serializer = SseSerializer(generalizedFrbRustBinding); + sse_encode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcKeychainClientDefaultAnisetteProvider( + keychain, + serializer, + ); + pdeCallFfi( + generalizedFrbRustBinding, + serializer, + funcId: 162, + port: port_, + ); + }, + codec: SseCodec( + decodeSuccessData: sse_decode_bool, + decodeErrorData: null, + ), + constMeta: kCrateApiApiIsInCliqueConstMeta, + argValues: [keychain], + apiImpl: this, + ), + ); } - TaskConstMeta get kCrateApiApiMsToDateConstMeta => const TaskConstMeta( - debugName: "ms_to_date", - argNames: ["ms"], - ); + TaskConstMeta get kCrateApiApiIsInCliqueConstMeta => + const TaskConstMeta(debugName: "is_in_clique", argNames: ["keychain"]); @override - Future crateApiApiMyAsyncRuntimeDefault() { - return handler.executeNormal(NormalTask( - callFfi: (port_) { - final serializer = SseSerializer(generalizedFrbRustBinding); - pdeCallFfi(generalizedFrbRustBinding, serializer, - funcId: 165, port: port_); - }, - codec: SseCodec( - decodeSuccessData: sse_decode_my_async_runtime, - decodeErrorData: null, - ), - constMeta: kCrateApiApiMyAsyncRuntimeDefaultConstMeta, - argValues: [], - apiImpl: this, - )); + Future crateApiApiJoinCliqueWithBottle({ + required ArcKeychainClientDefaultAnisetteProvider keychain, + required EscrowData bottle, + required String password, + required String devicePassword, + }) { + return handler.executeNormal( + NormalTask( + callFfi: (port_) { + final serializer = SseSerializer(generalizedFrbRustBinding); + sse_encode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcKeychainClientDefaultAnisetteProvider( + keychain, + serializer, + ); + sse_encode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerEscrowData( + bottle, + serializer, + ); + sse_encode_String(password, serializer); + sse_encode_String(devicePassword, serializer); + pdeCallFfi( + generalizedFrbRustBinding, + serializer, + funcId: 163, + port: port_, + ); + }, + codec: SseCodec( + decodeSuccessData: sse_decode_unit, + decodeErrorData: sse_decode_AnyhowException, + ), + constMeta: kCrateApiApiJoinCliqueWithBottleConstMeta, + argValues: [keychain, bottle, password, devicePassword], + apiImpl: this, + ), + ); } - TaskConstMeta get kCrateApiApiMyAsyncRuntimeDefaultConstMeta => + TaskConstMeta get kCrateApiApiJoinCliqueWithBottleConstMeta => const TaskConstMeta( - debugName: "my_async_runtime_default", - argNames: [], + debugName: "join_clique_with_bottle", + argNames: ["keychain", "bottle", "password", "devicePassword"], ); @override - Future crateApiApiNewMsg( - {required ConversationData conversation, - required String sender, - required Message message}) { - return handler.executeNormal(NormalTask( - callFfi: (port_) { - final serializer = SseSerializer(generalizedFrbRustBinding); - sse_encode_box_autoadd_conversation_data(conversation, serializer); - sse_encode_String(sender, serializer); - sse_encode_box_autoadd_message(message, serializer); - pdeCallFfi(generalizedFrbRustBinding, serializer, - funcId: 166, port: port_); - }, - codec: SseCodec( - decodeSuccessData: sse_decode_message_inst, - decodeErrorData: null, - ), - constMeta: kCrateApiApiNewMsgConstMeta, - argValues: [conversation, sender, message], - apiImpl: this, - )); + Future crateApiApiMakeAnisette({ + required String path, + required JoinedOsConfig config, + required ApsConnection conn, + }) { + return handler.executeNormal( + NormalTask( + callFfi: (port_) { + final serializer = SseSerializer(generalizedFrbRustBinding); + sse_encode_String(path, serializer); + sse_encode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerJoinedOSConfig( + config, + serializer, + ); + sse_encode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerAPSConnection( + conn, + serializer, + ); + pdeCallFfi( + generalizedFrbRustBinding, + serializer, + funcId: 164, + port: port_, + ); + }, + codec: SseCodec( + decodeSuccessData: + sse_decode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcAnisetteClientDefaultAnisetteProvider, + decodeErrorData: null, + ), + constMeta: kCrateApiApiMakeAnisetteConstMeta, + argValues: [path, config, conn], + apiImpl: this, + ), + ); } - TaskConstMeta get kCrateApiApiNewMsgConstMeta => const TaskConstMeta( - debugName: "new_msg", - argNames: ["conversation", "sender", "message"], - ); + TaskConstMeta get kCrateApiApiMakeAnisetteConstMeta => const TaskConstMeta( + debugName: "make_anisette", + argNames: ["path", "config", "conn"], + ); @override - IdsngmIdentity crateApiApiNewNgmIdentity() { - return handler.executeSync(SyncTask( - callFfi: () { - final serializer = SseSerializer(generalizedFrbRustBinding); - return pdeCallFfi(generalizedFrbRustBinding, serializer, funcId: 167)!; - }, - codec: SseCodec( - decodeSuccessData: - sse_decode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerIDSNGMIdentity, - decodeErrorData: sse_decode_AnyhowException, - ), - constMeta: kCrateApiApiNewNgmIdentityConstMeta, - argValues: [], - apiImpl: this, - )); + ArcMutexVecActiveCircleSession crateApiApiMakeCircleSessions() { + return handler.executeSync( + SyncTask( + callFfi: () { + final serializer = SseSerializer(generalizedFrbRustBinding); + return pdeCallFfi( + generalizedFrbRustBinding, + serializer, + funcId: 165, + )!; + }, + codec: SseCodec( + decodeSuccessData: + sse_decode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcMutexVecActiveCircleSession, + decodeErrorData: null, + ), + constMeta: kCrateApiApiMakeCircleSessionsConstMeta, + argValues: [], + apiImpl: this, + ), + ); } - TaskConstMeta get kCrateApiApiNewNgmIdentityConstMeta => const TaskConstMeta( - debugName: "new_ngm_identity", - argNames: [], - ); + TaskConstMeta get kCrateApiApiMakeCircleSessionsConstMeta => + const TaskConstMeta(debugName: "make_circle_sessions", argNames: []); @override - NSAttributedString crateApiApiNsAttributedStringDecode( - {required StCollapsedValue val}) { - return handler.executeSync(SyncTask( - callFfi: () { - final serializer = SseSerializer(generalizedFrbRustBinding); - sse_encode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerStCollapsedValue( - val, serializer); - return pdeCallFfi(generalizedFrbRustBinding, serializer, funcId: 168)!; - }, - codec: SseCodec( - decodeSuccessData: sse_decode_ns_attributed_string, - decodeErrorData: null, - ), - constMeta: kCrateApiApiNsAttributedStringDecodeConstMeta, - argValues: [val], - apiImpl: this, - )); + ArcMutexOptionCircleClientSessionDefaultAnisetteProvider + crateApiApiMakeClientSession({ + CircleClientSessionDefaultAnisetteProvider? circle, + }) { + return handler.executeSync( + SyncTask( + callFfi: () { + final serializer = SseSerializer(generalizedFrbRustBinding); + sse_encode_opt_box_autoadd_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerCircleClientSessionDefaultAnisetteProvider( + circle, + serializer, + ); + return pdeCallFfi( + generalizedFrbRustBinding, + serializer, + funcId: 166, + )!; + }, + codec: SseCodec( + decodeSuccessData: + sse_decode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcMutexOptionCircleClientSessionDefaultAnisetteProvider, + decodeErrorData: null, + ), + constMeta: kCrateApiApiMakeClientSessionConstMeta, + argValues: [circle], + apiImpl: this, + ), + ); } - TaskConstMeta get kCrateApiApiNsAttributedStringDecodeConstMeta => + TaskConstMeta get kCrateApiApiMakeClientSessionConstMeta => const TaskConstMeta( - debugName: "ns_attributed_string_decode", - argNames: ["val"], + debugName: "make_client_session", + argNames: ["circle"], ); @override - StCollapsedValue crateApiApiNsAttributedStringEncode( - {required NSAttributedString that}) { - return handler.executeSync(SyncTask( - callFfi: () { - final serializer = SseSerializer(generalizedFrbRustBinding); - sse_encode_box_autoadd_ns_attributed_string(that, serializer); - return pdeCallFfi(generalizedFrbRustBinding, serializer, funcId: 169)!; - }, - codec: SseCodec( - decodeSuccessData: - sse_decode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerStCollapsedValue, - decodeErrorData: null, - ), - constMeta: kCrateApiApiNsAttributedStringEncodeConstMeta, - argValues: [that], - apiImpl: this, - )); + ArcCloudMessagesClientDefaultAnisetteProvider + crateApiApiMakeCloudMessagesClient({ + required ArcCloudKitClientDefaultAnisetteProvider cloudkit, + required ArcKeychainClientDefaultAnisetteProvider keychain, + }) { + return handler.executeSync( + SyncTask( + callFfi: () { + final serializer = SseSerializer(generalizedFrbRustBinding); + sse_encode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcCloudKitClientDefaultAnisetteProvider( + cloudkit, + serializer, + ); + sse_encode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcKeychainClientDefaultAnisetteProvider( + keychain, + serializer, + ); + return pdeCallFfi( + generalizedFrbRustBinding, + serializer, + funcId: 167, + )!; + }, + codec: SseCodec( + decodeSuccessData: + sse_decode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcCloudMessagesClientDefaultAnisetteProvider, + decodeErrorData: null, + ), + constMeta: kCrateApiApiMakeCloudMessagesClientConstMeta, + argValues: [cloudkit, keychain], + apiImpl: this, + ), + ); } - TaskConstMeta get kCrateApiApiNsAttributedStringEncodeConstMeta => + TaskConstMeta get kCrateApiApiMakeCloudMessagesClientConstMeta => const TaskConstMeta( - debugName: "ns_attributed_string_encode", - argNames: ["that"], + debugName: "make_cloud_messages_client", + argNames: ["cloudkit", "keychain"], ); @override - Uint8List crateApiApiNsNull() { - return handler.executeSync(SyncTask( - callFfi: () { - final serializer = SseSerializer(generalizedFrbRustBinding); - return pdeCallFfi(generalizedFrbRustBinding, serializer, funcId: 170)!; - }, - codec: SseCodec( - decodeSuccessData: sse_decode_list_prim_u_8_strict, - decodeErrorData: null, - ), - constMeta: kCrateApiApiNsNullConstMeta, - argValues: [], - apiImpl: this, - )); + Future crateApiApiMakeCloudkit({ + required String path, + required ArcAnisetteClientDefaultAnisetteProvider anisette, + required JoinedOsConfig config, + required ArcTokenProviderDefaultAnisetteProvider tokenProvider, + }) { + return handler.executeNormal( + NormalTask( + callFfi: (port_) { + final serializer = SseSerializer(generalizedFrbRustBinding); + sse_encode_String(path, serializer); + sse_encode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcAnisetteClientDefaultAnisetteProvider( + anisette, + serializer, + ); + sse_encode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerJoinedOSConfig( + config, + serializer, + ); + sse_encode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcTokenProviderDefaultAnisetteProvider( + tokenProvider, + serializer, + ); + pdeCallFfi( + generalizedFrbRustBinding, + serializer, + funcId: 168, + port: port_, + ); + }, + codec: SseCodec( + decodeSuccessData: + sse_decode_opt_box_autoadd_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcCloudKitClientDefaultAnisetteProvider, + decodeErrorData: null, + ), + constMeta: kCrateApiApiMakeCloudkitConstMeta, + argValues: [path, anisette, config, tokenProvider], + apiImpl: this, + ), + ); } - TaskConstMeta get kCrateApiApiNsNullConstMeta => const TaskConstMeta( - debugName: "ns_null", - argNames: [], - ); + TaskConstMeta get kCrateApiApiMakeCloudkitConstMeta => const TaskConstMeta( + debugName: "make_cloudkit", + argNames: ["path", "anisette", "config", "tokenProvider"], + ); @override - NSNumber crateApiApiNsNumberDecode({required StCollapsedValue val}) { - return handler.executeSync(SyncTask( - callFfi: () { - final serializer = SseSerializer(generalizedFrbRustBinding); - sse_encode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerStCollapsedValue( - val, serializer); - return pdeCallFfi(generalizedFrbRustBinding, serializer, funcId: 171)!; - }, - codec: SseCodec( - decodeSuccessData: sse_decode_ns_number, - decodeErrorData: null, - ), - constMeta: kCrateApiApiNsNumberDecodeConstMeta, - argValues: [val], - apiImpl: this, - )); + Future crateApiApiMakeFacetime({ + required String path, + required ApsConnection conn, + required ArcImClient client, + }) { + return handler.executeNormal( + NormalTask( + callFfi: (port_) { + final serializer = SseSerializer(generalizedFrbRustBinding); + sse_encode_String(path, serializer); + sse_encode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerAPSConnection( + conn, + serializer, + ); + sse_encode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcIMClient( + client, + serializer, + ); + pdeCallFfi( + generalizedFrbRustBinding, + serializer, + funcId: 169, + port: port_, + ); + }, + codec: SseCodec( + decodeSuccessData: + sse_decode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcFTClient, + decodeErrorData: null, + ), + constMeta: kCrateApiApiMakeFacetimeConstMeta, + argValues: [path, conn, client], + apiImpl: this, + ), + ); } - TaskConstMeta get kCrateApiApiNsNumberDecodeConstMeta => const TaskConstMeta( - debugName: "ns_number_decode", - argNames: ["val"], - ); + TaskConstMeta get kCrateApiApiMakeFacetimeConstMeta => const TaskConstMeta( + debugName: "make_facetime", + argNames: ["path", "conn", "client"], + ); @override - StCollapsedValue crateApiApiNsNumberEncode({required NSNumber that}) { - return handler.executeSync(SyncTask( - callFfi: () { - final serializer = SseSerializer(generalizedFrbRustBinding); - sse_encode_box_autoadd_ns_number(that, serializer); - return pdeCallFfi(generalizedFrbRustBinding, serializer, funcId: 172)!; - }, - codec: SseCodec( - decodeSuccessData: - sse_decode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerStCollapsedValue, - decodeErrorData: null, - ), - constMeta: kCrateApiApiNsNumberEncodeConstMeta, - argValues: [that], - apiImpl: this, - )); + Future + crateApiApiMakeFindMyFriends({ + required String path, + required JoinedOsConfig config, + required ApsConnection aps, + required ArcAnisetteClientDefaultAnisetteProvider anisette, + required ArcTokenProviderDefaultAnisetteProvider provider, + }) { + return handler.executeNormal( + NormalTask( + callFfi: (port_) { + final serializer = SseSerializer(generalizedFrbRustBinding); + sse_encode_String(path, serializer); + sse_encode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerJoinedOSConfig( + config, + serializer, + ); + sse_encode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerAPSConnection( + aps, + serializer, + ); + sse_encode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcAnisetteClientDefaultAnisetteProvider( + anisette, + serializer, + ); + sse_encode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcTokenProviderDefaultAnisetteProvider( + provider, + serializer, + ); + pdeCallFfi( + generalizedFrbRustBinding, + serializer, + funcId: 170, + port: port_, + ); + }, + codec: SseCodec( + decodeSuccessData: + sse_decode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerFindMyFriendsClientDefaultAnisetteProvider, + decodeErrorData: sse_decode_AnyhowException, + ), + constMeta: kCrateApiApiMakeFindMyFriendsConstMeta, + argValues: [path, config, aps, anisette, provider], + apiImpl: this, + ), + ); } - TaskConstMeta get kCrateApiApiNsNumberEncodeConstMeta => const TaskConstMeta( - debugName: "ns_number_encode", - argNames: ["that"], + TaskConstMeta get kCrateApiApiMakeFindMyFriendsConstMeta => + const TaskConstMeta( + debugName: "make_find_my_friends", + argNames: ["path", "config", "aps", "anisette", "provider"], ); @override - NSString crateApiApiNsStringDecode({required StCollapsedValue val}) { - return handler.executeSync(SyncTask( - callFfi: () { - final serializer = SseSerializer(generalizedFrbRustBinding); - sse_encode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerStCollapsedValue( - val, serializer); - return pdeCallFfi(generalizedFrbRustBinding, serializer, funcId: 173)!; - }, - codec: SseCodec( - decodeSuccessData: sse_decode_ns_string, - decodeErrorData: null, - ), - constMeta: kCrateApiApiNsStringDecodeConstMeta, - argValues: [val], - apiImpl: this, - )); - } + Future crateApiApiMakeFindMyPhone({ + required String path, + required JoinedOsConfig config, + required ApsConnection aps, + required ArcAnisetteClientDefaultAnisetteProvider anisette, + required ArcTokenProviderDefaultAnisetteProvider provider, + }) { + return handler.executeNormal( + NormalTask( + callFfi: (port_) { + final serializer = SseSerializer(generalizedFrbRustBinding); + sse_encode_String(path, serializer); + sse_encode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerJoinedOSConfig( + config, + serializer, + ); + sse_encode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerAPSConnection( + aps, + serializer, + ); + sse_encode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcAnisetteClientDefaultAnisetteProvider( + anisette, + serializer, + ); + sse_encode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcTokenProviderDefaultAnisetteProvider( + provider, + serializer, + ); + pdeCallFfi( + generalizedFrbRustBinding, + serializer, + funcId: 171, + port: port_, + ); + }, + codec: SseCodec( + decodeSuccessData: + sse_decode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerFindMyPhoneClientDefaultAnisetteProvider, + decodeErrorData: sse_decode_AnyhowException, + ), + constMeta: kCrateApiApiMakeFindMyPhoneConstMeta, + argValues: [path, config, aps, anisette, provider], + apiImpl: this, + ), + ); + } - TaskConstMeta get kCrateApiApiNsStringDecodeConstMeta => const TaskConstMeta( - debugName: "ns_string_decode", - argNames: ["val"], - ); + TaskConstMeta get kCrateApiApiMakeFindMyPhoneConstMeta => const TaskConstMeta( + debugName: "make_find_my_phone", + argNames: ["path", "config", "aps", "anisette", "provider"], + ); @override - StCollapsedValue crateApiApiNsStringEncode({required NSString that}) { - return handler.executeSync(SyncTask( - callFfi: () { - final serializer = SseSerializer(generalizedFrbRustBinding); - sse_encode_box_autoadd_ns_string(that, serializer); - return pdeCallFfi(generalizedFrbRustBinding, serializer, funcId: 174)!; - }, - codec: SseCodec( - decodeSuccessData: - sse_decode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerStCollapsedValue, - decodeErrorData: null, - ), - constMeta: kCrateApiApiNsStringEncodeConstMeta, - argValues: [that], - apiImpl: this, - )); + Future crateApiApiMakeFindmy({ + required String path, + required ArcTokenProviderDefaultAnisetteProvider tokenProvider, + required ApsConnection conn, + required ArcCloudKitClientDefaultAnisetteProvider cloudkit, + required ArcKeychainClientDefaultAnisetteProvider keychain, + required ArcAnisetteClientDefaultAnisetteProvider anisette, + required JoinedOsConfig config, + required ArcImClient client, + }) { + return handler.executeNormal( + NormalTask( + callFfi: (port_) { + final serializer = SseSerializer(generalizedFrbRustBinding); + sse_encode_String(path, serializer); + sse_encode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcTokenProviderDefaultAnisetteProvider( + tokenProvider, + serializer, + ); + sse_encode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerAPSConnection( + conn, + serializer, + ); + sse_encode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcCloudKitClientDefaultAnisetteProvider( + cloudkit, + serializer, + ); + sse_encode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcKeychainClientDefaultAnisetteProvider( + keychain, + serializer, + ); + sse_encode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcAnisetteClientDefaultAnisetteProvider( + anisette, + serializer, + ); + sse_encode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerJoinedOSConfig( + config, + serializer, + ); + sse_encode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcIMClient( + client, + serializer, + ); + pdeCallFfi( + generalizedFrbRustBinding, + serializer, + funcId: 172, + port: port_, + ); + }, + codec: SseCodec( + decodeSuccessData: + sse_decode_opt_box_autoadd_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcFindMyClientDefaultAnisetteProvider, + decodeErrorData: null, + ), + constMeta: kCrateApiApiMakeFindmyConstMeta, + argValues: [ + path, + tokenProvider, + conn, + cloudkit, + keychain, + anisette, + config, + client, + ], + apiImpl: this, + ), + ); } - TaskConstMeta get kCrateApiApiNsStringEncodeConstMeta => const TaskConstMeta( - debugName: "ns_string_encode", - argNames: ["that"], - ); + TaskConstMeta get kCrateApiApiMakeFindmyConstMeta => const TaskConstMeta( + debugName: "make_findmy", + argNames: [ + "path", + "tokenProvider", + "conn", + "cloudkit", + "keychain", + "anisette", + "config", + "client", + ], + ); @override - List crateApiApiNscoderDecode({required List data}) { - return handler.executeSync(SyncTask( - callFfi: () { - final serializer = SseSerializer(generalizedFrbRustBinding); - sse_encode_list_prim_u_8_loose(data, serializer); - return pdeCallFfi(generalizedFrbRustBinding, serializer, funcId: 175)!; - }, - codec: SseCodec( - decodeSuccessData: - sse_decode_list_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerStCollapsedValue, - decodeErrorData: null, - ), - constMeta: kCrateApiApiNscoderDecodeConstMeta, - argValues: [data], - apiImpl: this, - )); + Future crateApiApiMakeIdms({ + required ApsConnection conn, + }) { + return handler.executeNormal( + NormalTask( + callFfi: (port_) { + final serializer = SseSerializer(generalizedFrbRustBinding); + sse_encode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerAPSConnection( + conn, + serializer, + ); + pdeCallFfi( + generalizedFrbRustBinding, + serializer, + funcId: 173, + port: port_, + ); + }, + codec: SseCodec( + decodeSuccessData: + sse_decode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcIdmsAuthListener, + decodeErrorData: null, + ), + constMeta: kCrateApiApiMakeIdmsConstMeta, + argValues: [conn], + apiImpl: this, + ), + ); } - TaskConstMeta get kCrateApiApiNscoderDecodeConstMeta => const TaskConstMeta( - debugName: "nscoder_decode", - argNames: ["data"], - ); + TaskConstMeta get kCrateApiApiMakeIdmsConstMeta => + const TaskConstMeta(debugName: "make_idms", argNames: ["conn"]); @override - Uint8List crateApiApiNscoderEncode({required List value}) { - return handler.executeSync(SyncTask( - callFfi: () { - final serializer = SseSerializer(generalizedFrbRustBinding); - sse_encode_list_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerStCollapsedValue( - value, serializer); - return pdeCallFfi(generalizedFrbRustBinding, serializer, funcId: 176)!; - }, - codec: SseCodec( - decodeSuccessData: sse_decode_list_prim_u_8_strict, - decodeErrorData: null, - ), - constMeta: kCrateApiApiNscoderEncodeConstMeta, - argValues: [value], - apiImpl: this, - )); + Future crateApiApiMakeImclient({ + required String path, + required ApsConnection conn, + required List users, + required IdsngmIdentity identity, + }) { + return handler.executeNormal( + NormalTask( + callFfi: (port_) { + final serializer = SseSerializer(generalizedFrbRustBinding); + sse_encode_String(path, serializer); + sse_encode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerAPSConnection( + conn, + serializer, + ); + sse_encode_list_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerIDSUser( + users, + serializer, + ); + sse_encode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerIDSNGMIdentity( + identity, + serializer, + ); + pdeCallFfi( + generalizedFrbRustBinding, + serializer, + funcId: 174, + port: port_, + ); + }, + codec: SseCodec( + decodeSuccessData: + sse_decode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcIMClient, + decodeErrorData: null, + ), + constMeta: kCrateApiApiMakeImclientConstMeta, + argValues: [path, conn, users, identity], + apiImpl: this, + ), + ); } - TaskConstMeta get kCrateApiApiNscoderEncodeConstMeta => const TaskConstMeta( - debugName: "nscoder_encode", - argNames: ["value"], - ); + TaskConstMeta get kCrateApiApiMakeImclientConstMeta => const TaskConstMeta( + debugName: "make_imclient", + argNames: ["path", "conn", "users", "identity"], + ); @override - Future crateApiApiPackTranscriptPoster( - {required SimplifiedTranscriptPoster payload}) { - return handler.executeNormal(NormalTask( - callFfi: (port_) { - final serializer = SseSerializer(generalizedFrbRustBinding); - sse_encode_box_autoadd_simplified_transcript_poster( - payload, serializer); - pdeCallFfi(generalizedFrbRustBinding, serializer, - funcId: 177, port: port_); - }, - codec: SseCodec( - decodeSuccessData: sse_decode_list_prim_u_8_strict, - decodeErrorData: sse_decode_AnyhowException, - ), - constMeta: kCrateApiApiPackTranscriptPosterConstMeta, - argValues: [payload], - apiImpl: this, - )); + ArcKeychainClientDefaultAnisetteProvider? crateApiApiMakeKeychain({ + required String path, + required ArcCloudKitClientDefaultAnisetteProvider cloudkit, + required ArcAnisetteClientDefaultAnisetteProvider anisette, + required JoinedOsConfig config, + required ArcTokenProviderDefaultAnisetteProvider tokenProvider, + }) { + return handler.executeSync( + SyncTask( + callFfi: () { + final serializer = SseSerializer(generalizedFrbRustBinding); + sse_encode_String(path, serializer); + sse_encode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcCloudKitClientDefaultAnisetteProvider( + cloudkit, + serializer, + ); + sse_encode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcAnisetteClientDefaultAnisetteProvider( + anisette, + serializer, + ); + sse_encode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerJoinedOSConfig( + config, + serializer, + ); + sse_encode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcTokenProviderDefaultAnisetteProvider( + tokenProvider, + serializer, + ); + return pdeCallFfi( + generalizedFrbRustBinding, + serializer, + funcId: 175, + )!; + }, + codec: SseCodec( + decodeSuccessData: + sse_decode_opt_box_autoadd_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcKeychainClientDefaultAnisetteProvider, + decodeErrorData: null, + ), + constMeta: kCrateApiApiMakeKeychainConstMeta, + argValues: [path, cloudkit, anisette, config, tokenProvider], + apiImpl: this, + ), + ); } - TaskConstMeta get kCrateApiApiPackTranscriptPosterConstMeta => - const TaskConstMeta( - debugName: "pack_transcript_poster", - argNames: ["payload"], - ); + TaskConstMeta get kCrateApiApiMakeKeychainConstMeta => const TaskConstMeta( + debugName: "make_keychain", + argNames: ["path", "cloudkit", "anisette", "config", "tokenProvider"], + ); @override - Future crateApiApiParsePoster( - {required IMessagePosterRecord poster}) { - return handler.executeNormal(NormalTask( - callFfi: (port_) { - final serializer = SseSerializer(generalizedFrbRustBinding); - sse_encode_box_autoadd_i_message_poster_record(poster, serializer); - pdeCallFfi(generalizedFrbRustBinding, serializer, - funcId: 178, port: port_); - }, - codec: SseCodec( - decodeSuccessData: sse_decode_simplified_incoming_call_poster, - decodeErrorData: sse_decode_AnyhowException, - ), - constMeta: kCrateApiApiParsePosterConstMeta, - argValues: [poster], - apiImpl: this, - )); + Future crateApiApiMakePasswords({ + required String path, + required ArcKeychainClientDefaultAnisetteProvider keychain, + required ArcCloudKitClientDefaultAnisetteProvider cloudkit, + required ArcImClient client, + required ApsConnection conn, + }) { + return handler.executeNormal( + NormalTask( + callFfi: (port_) { + final serializer = SseSerializer(generalizedFrbRustBinding); + sse_encode_String(path, serializer); + sse_encode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcKeychainClientDefaultAnisetteProvider( + keychain, + serializer, + ); + sse_encode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcCloudKitClientDefaultAnisetteProvider( + cloudkit, + serializer, + ); + sse_encode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcIMClient( + client, + serializer, + ); + sse_encode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerAPSConnection( + conn, + serializer, + ); + pdeCallFfi( + generalizedFrbRustBinding, + serializer, + funcId: 176, + port: port_, + ); + }, + codec: SseCodec( + decodeSuccessData: + sse_decode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcPasswordManagerDefaultAnisetteProvider, + decodeErrorData: null, + ), + constMeta: kCrateApiApiMakePasswordsConstMeta, + argValues: [path, keychain, cloudkit, client, conn], + apiImpl: this, + ), + ); } - TaskConstMeta get kCrateApiApiParsePosterConstMeta => const TaskConstMeta( - debugName: "parse_poster", - argNames: ["poster"], - ); + TaskConstMeta get kCrateApiApiMakePasswordsConstMeta => const TaskConstMeta( + debugName: "make_passwords", + argNames: ["path", "keychain", "cloudkit", "client", "conn"], + ); @override - Future crateApiApiParsePosterSave( - {required SimplifiedIncomingCallPoster poster}) { - return handler.executeNormal(NormalTask( - callFfi: (port_) { - final serializer = SseSerializer(generalizedFrbRustBinding); - sse_encode_box_autoadd_simplified_incoming_call_poster( - poster, serializer); - pdeCallFfi(generalizedFrbRustBinding, serializer, - funcId: 179, port: port_); - }, - codec: SseCodec( - decodeSuccessData: sse_decode_list_prim_u_8_strict, - decodeErrorData: sse_decode_AnyhowException, - ), - constMeta: kCrateApiApiParsePosterSaveConstMeta, - argValues: [poster], - apiImpl: this, - )); + Future crateApiApiMakeProfiles({ + required ArcCloudKitClientDefaultAnisetteProvider cloudkit, + }) { + return handler.executeNormal( + NormalTask( + callFfi: (port_) { + final serializer = SseSerializer(generalizedFrbRustBinding); + sse_encode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcCloudKitClientDefaultAnisetteProvider( + cloudkit, + serializer, + ); + pdeCallFfi( + generalizedFrbRustBinding, + serializer, + funcId: 177, + port: port_, + ); + }, + codec: SseCodec( + decodeSuccessData: + sse_decode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcProfilesClientDefaultAnisetteProvider, + decodeErrorData: null, + ), + constMeta: kCrateApiApiMakeProfilesConstMeta, + argValues: [cloudkit], + apiImpl: this, + ), + ); } - TaskConstMeta get kCrateApiApiParsePosterSaveConstMeta => const TaskConstMeta( - debugName: "parse_poster_save", - argNames: ["poster"], - ); + TaskConstMeta get kCrateApiApiMakeProfilesConstMeta => + const TaskConstMeta(debugName: "make_profiles", argNames: ["cloudkit"]); @override - Future crateApiApiParseTranscriptPoster( - {required List payload}) { - return handler.executeNormal(NormalTask( - callFfi: (port_) { - final serializer = SseSerializer(generalizedFrbRustBinding); - sse_encode_list_prim_u_8_loose(payload, serializer); - pdeCallFfi(generalizedFrbRustBinding, serializer, - funcId: 180, port: port_); - }, - codec: SseCodec( - decodeSuccessData: sse_decode_simplified_transcript_poster, - decodeErrorData: sse_decode_AnyhowException, - ), - constMeta: kCrateApiApiParseTranscriptPosterConstMeta, - argValues: [payload], - apiImpl: this, - )); + Future + crateApiApiMakeSharedStreams({ + required String path, + required ApsConnection conn, + required ArcAnisetteClientDefaultAnisetteProvider anisette, + required JoinedOsConfig config, + required ArcTokenProviderDefaultAnisetteProvider token, + }) { + return handler.executeNormal( + NormalTask( + callFfi: (port_) { + final serializer = SseSerializer(generalizedFrbRustBinding); + sse_encode_String(path, serializer); + sse_encode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerAPSConnection( + conn, + serializer, + ); + sse_encode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcAnisetteClientDefaultAnisetteProvider( + anisette, + serializer, + ); + sse_encode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerJoinedOSConfig( + config, + serializer, + ); + sse_encode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcTokenProviderDefaultAnisetteProvider( + token, + serializer, + ); + pdeCallFfi( + generalizedFrbRustBinding, + serializer, + funcId: 178, + port: port_, + ); + }, + codec: SseCodec( + decodeSuccessData: + sse_decode_opt_box_autoadd_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerSyncManagerDefaultAnisetteProviderMyFilePackager, + decodeErrorData: null, + ), + constMeta: kCrateApiApiMakeSharedStreamsConstMeta, + argValues: [path, conn, anisette, config, token], + apiImpl: this, + ), + ); } - TaskConstMeta get kCrateApiApiParseTranscriptPosterConstMeta => + TaskConstMeta get kCrateApiApiMakeSharedStreamsConstMeta => const TaskConstMeta( - debugName: "parse_transcript_poster", - argNames: ["payload"], + debugName: "make_shared_streams", + argNames: ["path", "conn", "anisette", "config", "token"], ); @override - Uint8List crateApiApiPasswordManagerMetaGetData( - {required PasswordManagerMetaData data}) { - return handler.executeSync(SyncTask( - callFfi: () { - final serializer = SseSerializer(generalizedFrbRustBinding); - sse_encode_box_autoadd_password_manager_meta_data(data, serializer); - return pdeCallFfi(generalizedFrbRustBinding, serializer, funcId: 181)!; - }, - codec: SseCodec( - decodeSuccessData: sse_decode_list_prim_u_8_strict, - decodeErrorData: - sse_decode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerPushError, - ), - constMeta: kCrateApiApiPasswordManagerMetaGetDataConstMeta, - argValues: [data], - apiImpl: this, - )); + Future crateApiApiMakeStatuskit({ + required String path, + required ArcTokenProviderDefaultAnisetteProvider provider, + required ApsConnection conn, + required JoinedOsConfig config, + required ArcImClient client, + }) { + return handler.executeNormal( + NormalTask( + callFfi: (port_) { + final serializer = SseSerializer(generalizedFrbRustBinding); + sse_encode_String(path, serializer); + sse_encode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcTokenProviderDefaultAnisetteProvider( + provider, + serializer, + ); + sse_encode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerAPSConnection( + conn, + serializer, + ); + sse_encode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerJoinedOSConfig( + config, + serializer, + ); + sse_encode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcIMClient( + client, + serializer, + ); + pdeCallFfi( + generalizedFrbRustBinding, + serializer, + funcId: 179, + port: port_, + ); + }, + codec: SseCodec( + decodeSuccessData: + sse_decode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcStatusKitClientDefaultAnisetteProvider, + decodeErrorData: null, + ), + constMeta: kCrateApiApiMakeStatuskitConstMeta, + argValues: [path, provider, conn, config, client], + apiImpl: this, + ), + ); } - TaskConstMeta get kCrateApiApiPasswordManagerMetaGetDataConstMeta => - const TaskConstMeta( - debugName: "password_manager_meta_get_data", - argNames: ["data"], - ); + TaskConstMeta get kCrateApiApiMakeStatuskitConstMeta => const TaskConstMeta( + debugName: "make_statuskit", + argNames: ["path", "provider", "conn", "config", "client"], + ); @override - PasswordManagerMetaData crateApiApiPasswordManagerMetaGetPasswordData( - {required PasswordManagerMeta that}) { - return handler.executeSync(SyncTask( - callFfi: () { - final serializer = SseSerializer(generalizedFrbRustBinding); - sse_encode_box_autoadd_password_manager_meta(that, serializer); - return pdeCallFfi(generalizedFrbRustBinding, serializer, funcId: 182)!; - }, - codec: SseCodec( - decodeSuccessData: sse_decode_password_manager_meta_data, - decodeErrorData: - sse_decode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerPushError, - ), - constMeta: kCrateApiApiPasswordManagerMetaGetPasswordDataConstMeta, - argValues: [that], - apiImpl: this, - )); + ArcTokenProviderDefaultAnisetteProvider crateApiApiMakeTokenProvider({ + required ArcMutexAppleAccountDefaultAnisetteProvider account, + required JoinedOsConfig config, + }) { + return handler.executeSync( + SyncTask( + callFfi: () { + final serializer = SseSerializer(generalizedFrbRustBinding); + sse_encode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcMutexAppleAccountDefaultAnisetteProvider( + account, + serializer, + ); + sse_encode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerJoinedOSConfig( + config, + serializer, + ); + return pdeCallFfi( + generalizedFrbRustBinding, + serializer, + funcId: 180, + )!; + }, + codec: SseCodec( + decodeSuccessData: + sse_decode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcTokenProviderDefaultAnisetteProvider, + decodeErrorData: null, + ), + constMeta: kCrateApiApiMakeTokenProviderConstMeta, + argValues: [account, config], + apiImpl: this, + ), + ); } - TaskConstMeta get kCrateApiApiPasswordManagerMetaGetPasswordDataConstMeta => + TaskConstMeta get kCrateApiApiMakeTokenProviderConstMeta => const TaskConstMeta( - debugName: "password_manager_meta_get_password_data", - argNames: ["that"], + debugName: "make_token_provider", + argNames: ["account", "config"], ); @override - (int, BigInt) crateApiApiPasswordManagerTotpGenerateOtp( - {required PasswordManagerTotp that}) { - return handler.executeSync(SyncTask( - callFfi: () { - final serializer = SseSerializer(generalizedFrbRustBinding); - sse_encode_box_autoadd_password_manager_totp(that, serializer); - return pdeCallFfi(generalizedFrbRustBinding, serializer, funcId: 183)!; - }, - codec: SseCodec( - decodeSuccessData: sse_decode_record_u_32_u_64, - decodeErrorData: - sse_decode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerPushError, - ), - constMeta: kCrateApiApiPasswordManagerTotpGenerateOtpConstMeta, - argValues: [that], - apiImpl: this, - )); + Future crateApiApiMessagePartsRawText({required MessageParts that}) { + return handler.executeNormal( + NormalTask( + callFfi: (port_) { + final serializer = SseSerializer(generalizedFrbRustBinding); + sse_encode_box_autoadd_message_parts(that, serializer); + pdeCallFfi( + generalizedFrbRustBinding, + serializer, + funcId: 181, + port: port_, + ); + }, + codec: SseCodec( + decodeSuccessData: sse_decode_String, + decodeErrorData: null, + ), + constMeta: kCrateApiApiMessagePartsRawTextConstMeta, + argValues: [that], + apiImpl: this, + ), + ); } - TaskConstMeta get kCrateApiApiPasswordManagerTotpGenerateOtpConstMeta => + TaskConstMeta get kCrateApiApiMessagePartsRawTextConstMeta => const TaskConstMeta( - debugName: "password_manager_totp_generate_otp", + debugName: "message_parts_raw_text", argNames: ["that"], ); @override - Future crateApiApiProvisionedFlavorDefault() { - return handler.executeNormal(NormalTask( - callFfi: (port_) { - final serializer = SseSerializer(generalizedFrbRustBinding); - pdeCallFfi(generalizedFrbRustBinding, serializer, - funcId: 184, port: port_); - }, - codec: SseCodec( - decodeSuccessData: sse_decode_provisioned_flavor, - decodeErrorData: null, - ), - constMeta: kCrateApiApiProvisionedFlavorDefaultConstMeta, - argValues: [], - apiImpl: this, - )); + Date crateApiApiMsToDate({required int ms}) { + return handler.executeSync( + SyncTask( + callFfi: () { + final serializer = SseSerializer(generalizedFrbRustBinding); + sse_encode_CastedPrimitive_u_64(ms, serializer); + return pdeCallFfi( + generalizedFrbRustBinding, + serializer, + funcId: 182, + )!; + }, + codec: SseCodec( + decodeSuccessData: + sse_decode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerDate, + decodeErrorData: null, + ), + constMeta: kCrateApiApiMsToDateConstMeta, + argValues: [ms], + apiImpl: this, + ), + ); } - TaskConstMeta get kCrateApiApiProvisionedFlavorDefaultConstMeta => - const TaskConstMeta( - debugName: "provisioned_flavor_default", - argNames: [], - ); + TaskConstMeta get kCrateApiApiMsToDateConstMeta => + const TaskConstMeta(debugName: "ms_to_date", argNames: ["ms"]); @override - Future crateApiApiPtrToDart({required String ptr}) { - return handler.executeNormal(NormalTask( - callFfi: (port_) { - final serializer = SseSerializer(generalizedFrbRustBinding); - sse_encode_String(ptr, serializer); - pdeCallFfi(generalizedFrbRustBinding, serializer, - funcId: 185, port: port_); - }, - codec: SseCodec( - decodeSuccessData: sse_decode_opt_box_autoadd_push_message, - decodeErrorData: null, - ), - constMeta: kCrateApiApiPtrToDartConstMeta, - argValues: [ptr], - apiImpl: this, - )); + Future crateApiApiMyAsyncRuntimeDefault() { + return handler.executeNormal( + NormalTask( + callFfi: (port_) { + final serializer = SseSerializer(generalizedFrbRustBinding); + pdeCallFfi( + generalizedFrbRustBinding, + serializer, + funcId: 183, + port: port_, + ); + }, + codec: SseCodec( + decodeSuccessData: sse_decode_my_async_runtime, + decodeErrorData: null, + ), + constMeta: kCrateApiApiMyAsyncRuntimeDefaultConstMeta, + argValues: [], + apiImpl: this, + ), + ); } - TaskConstMeta get kCrateApiApiPtrToDartConstMeta => const TaskConstMeta( - debugName: "ptr_to_dart", - argNames: ["ptr"], - ); + TaskConstMeta get kCrateApiApiMyAsyncRuntimeDefaultConstMeta => + const TaskConstMeta(debugName: "my_async_runtime_default", argNames: []); @override - Future crateApiApiQueryHandle( - {required ArcPasswordManagerDefaultAnisetteProvider passwords, - required String handle}) { - return handler.executeNormal(NormalTask( - callFfi: (port_) { - final serializer = SseSerializer(generalizedFrbRustBinding); - sse_encode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcPasswordManagerDefaultAnisetteProvider( - passwords, serializer); - sse_encode_String(handle, serializer); - pdeCallFfi(generalizedFrbRustBinding, serializer, - funcId: 186, port: port_); - }, - codec: SseCodec( - decodeSuccessData: sse_decode_bool, - decodeErrorData: sse_decode_AnyhowException, - ), - constMeta: kCrateApiApiQueryHandleConstMeta, - argValues: [passwords, handle], - apiImpl: this, - )); + Future crateApiApiNewMsg({ + required ConversationData conversation, + required String sender, + required Message message, + }) { + return handler.executeNormal( + NormalTask( + callFfi: (port_) { + final serializer = SseSerializer(generalizedFrbRustBinding); + sse_encode_box_autoadd_conversation_data(conversation, serializer); + sse_encode_String(sender, serializer); + sse_encode_box_autoadd_message(message, serializer); + pdeCallFfi( + generalizedFrbRustBinding, + serializer, + funcId: 184, + port: port_, + ); + }, + codec: SseCodec( + decodeSuccessData: sse_decode_message_inst, + decodeErrorData: null, + ), + constMeta: kCrateApiApiNewMsgConstMeta, + argValues: [conversation, sender, message], + apiImpl: this, + ), + ); } - TaskConstMeta get kCrateApiApiQueryHandleConstMeta => const TaskConstMeta( - debugName: "query_handle", - argNames: ["passwords", "handle"], - ); + TaskConstMeta get kCrateApiApiNewMsgConstMeta => const TaskConstMeta( + debugName: "new_msg", + argNames: ["conversation", "sender", "message"], + ); @override - SavedHardwareState? crateApiApiReadHardware({required String path}) { - return handler.executeSync(SyncTask( - callFfi: () { - final serializer = SseSerializer(generalizedFrbRustBinding); - sse_encode_String(path, serializer); - return pdeCallFfi(generalizedFrbRustBinding, serializer, funcId: 187)!; - }, - codec: SseCodec( - decodeSuccessData: - sse_decode_opt_box_autoadd_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerSavedHardwareState, - decodeErrorData: null, - ), - constMeta: kCrateApiApiReadHardwareConstMeta, - argValues: [path], - apiImpl: this, - )); + IdsngmIdentity crateApiApiNewNgmIdentity() { + return handler.executeSync( + SyncTask( + callFfi: () { + final serializer = SseSerializer(generalizedFrbRustBinding); + return pdeCallFfi( + generalizedFrbRustBinding, + serializer, + funcId: 185, + )!; + }, + codec: SseCodec( + decodeSuccessData: + sse_decode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerIDSNGMIdentity, + decodeErrorData: sse_decode_AnyhowException, + ), + constMeta: kCrateApiApiNewNgmIdentityConstMeta, + argValues: [], + apiImpl: this, + ), + ); } - TaskConstMeta get kCrateApiApiReadHardwareConstMeta => const TaskConstMeta( - debugName: "read_hardware", - argNames: ["path"], - ); + TaskConstMeta get kCrateApiApiNewNgmIdentityConstMeta => + const TaskConstMeta(debugName: "new_ngm_identity", argNames: []); @override - Future crateApiApiRecvWait( - {required ApsWatcher watcher, required ArcSharedPushState state}) { - return handler.executeNormal(NormalTask( - callFfi: (port_) { - final serializer = SseSerializer(generalizedFrbRustBinding); - sse_encode_Auto_RefMut_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerAPSWatcher( - watcher, serializer); - sse_encode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcSharedPushState( - state, serializer); - pdeCallFfi(generalizedFrbRustBinding, serializer, - funcId: 188, port: port_); - }, - codec: SseCodec( - decodeSuccessData: sse_decode_poll_result, - decodeErrorData: null, - ), - constMeta: kCrateApiApiRecvWaitConstMeta, - argValues: [watcher, state], - apiImpl: this, - )); + NSAttributedString crateApiApiNsAttributedStringDecode({ + required StCollapsedValue val, + }) { + return handler.executeSync( + SyncTask( + callFfi: () { + final serializer = SseSerializer(generalizedFrbRustBinding); + sse_encode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerStCollapsedValue( + val, + serializer, + ); + return pdeCallFfi( + generalizedFrbRustBinding, + serializer, + funcId: 186, + )!; + }, + codec: SseCodec( + decodeSuccessData: sse_decode_ns_attributed_string, + decodeErrorData: null, + ), + constMeta: kCrateApiApiNsAttributedStringDecodeConstMeta, + argValues: [val], + apiImpl: this, + ), + ); } - TaskConstMeta get kCrateApiApiRecvWaitConstMeta => const TaskConstMeta( - debugName: "recv_wait", - argNames: ["watcher", "state"], + TaskConstMeta get kCrateApiApiNsAttributedStringDecodeConstMeta => + const TaskConstMeta( + debugName: "ns_attributed_string_decode", + argNames: ["val"], ); @override - Future> crateApiApiRefreshBackgroundFollowing( - {required ArcFindMyClientDefaultAnisetteProvider state, - required JoinedOsConfig config}) { - return handler.executeNormal(NormalTask( - callFfi: (port_) { - final serializer = SseSerializer(generalizedFrbRustBinding); - sse_encode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcFindMyClientDefaultAnisetteProvider( - state, serializer); - sse_encode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerJoinedOSConfig( - config, serializer); - pdeCallFfi(generalizedFrbRustBinding, serializer, - funcId: 189, port: port_); - }, - codec: SseCodec( - decodeSuccessData: sse_decode_list_follow, - decodeErrorData: sse_decode_AnyhowException, - ), - constMeta: kCrateApiApiRefreshBackgroundFollowingConstMeta, - argValues: [state, config], - apiImpl: this, - )); + StCollapsedValue crateApiApiNsAttributedStringEncode({ + required NSAttributedString that, + }) { + return handler.executeSync( + SyncTask( + callFfi: () { + final serializer = SseSerializer(generalizedFrbRustBinding); + sse_encode_box_autoadd_ns_attributed_string(that, serializer); + return pdeCallFfi( + generalizedFrbRustBinding, + serializer, + funcId: 187, + )!; + }, + codec: SseCodec( + decodeSuccessData: + sse_decode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerStCollapsedValue, + decodeErrorData: null, + ), + constMeta: kCrateApiApiNsAttributedStringEncodeConstMeta, + argValues: [that], + apiImpl: this, + ), + ); } - TaskConstMeta get kCrateApiApiRefreshBackgroundFollowingConstMeta => + TaskConstMeta get kCrateApiApiNsAttributedStringEncodeConstMeta => const TaskConstMeta( - debugName: "refresh_background_following", - argNames: ["state", "config"], + debugName: "ns_attributed_string_encode", + argNames: ["that"], ); @override - Future> crateApiApiRefreshDevices( - {required JoinedOsConfig config, - required FindMyPhoneClientDefaultAnisetteProvider client}) { - return handler.executeNormal(NormalTask( - callFfi: (port_) { - final serializer = SseSerializer(generalizedFrbRustBinding); - sse_encode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerJoinedOSConfig( - config, serializer); - sse_encode_Auto_RefMut_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerFindMyPhoneClientDefaultAnisetteProvider( - client, serializer); - pdeCallFfi(generalizedFrbRustBinding, serializer, - funcId: 190, port: port_); - }, - codec: SseCodec( - decodeSuccessData: sse_decode_list_found_device, - decodeErrorData: sse_decode_AnyhowException, - ), - constMeta: kCrateApiApiRefreshDevicesConstMeta, - argValues: [config, client], - apiImpl: this, - )); + Uint8List crateApiApiNsNull() { + return handler.executeSync( + SyncTask( + callFfi: () { + final serializer = SseSerializer(generalizedFrbRustBinding); + return pdeCallFfi( + generalizedFrbRustBinding, + serializer, + funcId: 188, + )!; + }, + codec: SseCodec( + decodeSuccessData: sse_decode_list_prim_u_8_strict, + decodeErrorData: null, + ), + constMeta: kCrateApiApiNsNullConstMeta, + argValues: [], + apiImpl: this, + ), + ); } - TaskConstMeta get kCrateApiApiRefreshDevicesConstMeta => const TaskConstMeta( - debugName: "refresh_devices", - argNames: ["config", "client"], - ); + TaskConstMeta get kCrateApiApiNsNullConstMeta => + const TaskConstMeta(debugName: "ns_null", argNames: []); @override - Future> crateApiApiRefreshFollowing( - {required JoinedOsConfig config, - required FindMyFriendsClientDefaultAnisetteProvider client}) { - return handler.executeNormal(NormalTask( - callFfi: (port_) { - final serializer = SseSerializer(generalizedFrbRustBinding); - sse_encode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerJoinedOSConfig( - config, serializer); - sse_encode_Auto_RefMut_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerFindMyFriendsClientDefaultAnisetteProvider( - client, serializer); - pdeCallFfi(generalizedFrbRustBinding, serializer, - funcId: 191, port: port_); - }, - codec: SseCodec( - decodeSuccessData: sse_decode_list_follow, - decodeErrorData: sse_decode_AnyhowException, - ), - constMeta: kCrateApiApiRefreshFollowingConstMeta, - argValues: [config, client], - apiImpl: this, - )); + NSNumber crateApiApiNsNumberDecode({required StCollapsedValue val}) { + return handler.executeSync( + SyncTask( + callFfi: () { + final serializer = SseSerializer(generalizedFrbRustBinding); + sse_encode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerStCollapsedValue( + val, + serializer, + ); + return pdeCallFfi( + generalizedFrbRustBinding, + serializer, + funcId: 189, + )!; + }, + codec: SseCodec( + decodeSuccessData: sse_decode_ns_number, + decodeErrorData: null, + ), + constMeta: kCrateApiApiNsNumberDecodeConstMeta, + argValues: [val], + apiImpl: this, + ), + ); } - TaskConstMeta get kCrateApiApiRefreshFollowingConstMeta => - const TaskConstMeta( - debugName: "refresh_following", - argNames: ["config", "client"], - ); + TaskConstMeta get kCrateApiApiNsNumberDecodeConstMeta => + const TaskConstMeta(debugName: "ns_number_decode", argNames: ["val"]); @override - Future<(List?, SupportAlert?)> crateApiApiRegisterIds( - {required String path, - required JoinedOsConfig config, - required ApsConnection aps, - required IdsngmIdentity identity, - required List users}) { - return handler.executeNormal(NormalTask( - callFfi: (port_) { - final serializer = SseSerializer(generalizedFrbRustBinding); - sse_encode_String(path, serializer); - sse_encode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerJoinedOSConfig( - config, serializer); - sse_encode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerAPSConnection( - aps, serializer); - sse_encode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerIDSNGMIdentity( - identity, serializer); - sse_encode_list_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerIDSUser( - users, serializer); - pdeCallFfi(generalizedFrbRustBinding, serializer, - funcId: 192, port: port_); - }, - codec: SseCodec( - decodeSuccessData: - sse_decode_record_opt_list_auto_owned_rust_opaque_flutter_rust_bridgefor_generated_rust_auto_opaque_inner_ids_user_opt_box_autoadd_support_alert, - decodeErrorData: sse_decode_AnyhowException, - ), - constMeta: kCrateApiApiRegisterIdsConstMeta, - argValues: [path, config, aps, identity, users], - apiImpl: this, - )); + StCollapsedValue crateApiApiNsNumberEncode({required NSNumber that}) { + return handler.executeSync( + SyncTask( + callFfi: () { + final serializer = SseSerializer(generalizedFrbRustBinding); + sse_encode_box_autoadd_ns_number(that, serializer); + return pdeCallFfi( + generalizedFrbRustBinding, + serializer, + funcId: 190, + )!; + }, + codec: SseCodec( + decodeSuccessData: + sse_decode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerStCollapsedValue, + decodeErrorData: null, + ), + constMeta: kCrateApiApiNsNumberEncodeConstMeta, + argValues: [that], + apiImpl: this, + ), + ); } - TaskConstMeta get kCrateApiApiRegisterIdsConstMeta => const TaskConstMeta( - debugName: "register_ids", - argNames: ["path", "config", "aps", "identity", "users"], - ); + TaskConstMeta get kCrateApiApiNsNumberEncodeConstMeta => + const TaskConstMeta(debugName: "ns_number_encode", argNames: ["that"]); @override - Future> crateApiApiRemoveAlbum( - {required SyncManagerDefaultAnisetteProviderMyFilePackager lock, - required String guid}) { - return handler.executeNormal(NormalTask( - callFfi: (port_) { - final serializer = SseSerializer(generalizedFrbRustBinding); - sse_encode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerSyncManagerDefaultAnisetteProviderMyFilePackager( - lock, serializer); - sse_encode_String(guid, serializer); - pdeCallFfi(generalizedFrbRustBinding, serializer, - funcId: 193, port: port_); - }, - codec: SseCodec( - decodeSuccessData: sse_decode_list_shared_album, - decodeErrorData: sse_decode_AnyhowException, - ), - constMeta: kCrateApiApiRemoveAlbumConstMeta, - argValues: [lock, guid], - apiImpl: this, - )); + NSString crateApiApiNsStringDecode({required StCollapsedValue val}) { + return handler.executeSync( + SyncTask( + callFfi: () { + final serializer = SseSerializer(generalizedFrbRustBinding); + sse_encode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerStCollapsedValue( + val, + serializer, + ); + return pdeCallFfi( + generalizedFrbRustBinding, + serializer, + funcId: 191, + )!; + }, + codec: SseCodec( + decodeSuccessData: sse_decode_ns_string, + decodeErrorData: null, + ), + constMeta: kCrateApiApiNsStringDecodeConstMeta, + argValues: [val], + apiImpl: this, + ), + ); } - TaskConstMeta get kCrateApiApiRemoveAlbumConstMeta => const TaskConstMeta( - debugName: "remove_album", - argNames: ["lock", "guid"], - ); + TaskConstMeta get kCrateApiApiNsStringDecodeConstMeta => + const TaskConstMeta(debugName: "ns_string_decode", argNames: ["val"]); @override - Future crateApiApiRemoveUser( - {required ArcPasswordManagerDefaultAnisetteProvider passwords, - required String gid, - required String handle}) { - return handler.executeNormal(NormalTask( - callFfi: (port_) { - final serializer = SseSerializer(generalizedFrbRustBinding); - sse_encode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcPasswordManagerDefaultAnisetteProvider( - passwords, serializer); - sse_encode_String(gid, serializer); - sse_encode_String(handle, serializer); - pdeCallFfi(generalizedFrbRustBinding, serializer, - funcId: 194, port: port_); - }, - codec: SseCodec( - decodeSuccessData: sse_decode_unit, - decodeErrorData: sse_decode_AnyhowException, - ), - constMeta: kCrateApiApiRemoveUserConstMeta, - argValues: [passwords, gid, handle], - apiImpl: this, - )); + StCollapsedValue crateApiApiNsStringEncode({required NSString that}) { + return handler.executeSync( + SyncTask( + callFfi: () { + final serializer = SseSerializer(generalizedFrbRustBinding); + sse_encode_box_autoadd_ns_string(that, serializer); + return pdeCallFfi( + generalizedFrbRustBinding, + serializer, + funcId: 192, + )!; + }, + codec: SseCodec( + decodeSuccessData: + sse_decode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerStCollapsedValue, + decodeErrorData: null, + ), + constMeta: kCrateApiApiNsStringEncodeConstMeta, + argValues: [that], + apiImpl: this, + ), + ); } - TaskConstMeta get kCrateApiApiRemoveUserConstMeta => const TaskConstMeta( - debugName: "remove_user", - argNames: ["passwords", "gid", "handle"], - ); + TaskConstMeta get kCrateApiApiNsStringEncodeConstMeta => + const TaskConstMeta(debugName: "ns_string_encode", argNames: ["that"]); @override - Future crateApiApiRenameGroup( - {required ArcPasswordManagerDefaultAnisetteProvider passwords, - required String gid, - required String newname}) { - return handler.executeNormal(NormalTask( - callFfi: (port_) { - final serializer = SseSerializer(generalizedFrbRustBinding); - sse_encode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcPasswordManagerDefaultAnisetteProvider( - passwords, serializer); - sse_encode_String(gid, serializer); - sse_encode_String(newname, serializer); - pdeCallFfi(generalizedFrbRustBinding, serializer, - funcId: 195, port: port_); - }, - codec: SseCodec( - decodeSuccessData: sse_decode_unit, - decodeErrorData: sse_decode_AnyhowException, - ), - constMeta: kCrateApiApiRenameGroupConstMeta, - argValues: [passwords, gid, newname], - apiImpl: this, - )); + List crateApiApiNscoderDecode({required List data}) { + return handler.executeSync( + SyncTask( + callFfi: () { + final serializer = SseSerializer(generalizedFrbRustBinding); + sse_encode_list_prim_u_8_loose(data, serializer); + return pdeCallFfi( + generalizedFrbRustBinding, + serializer, + funcId: 193, + )!; + }, + codec: SseCodec( + decodeSuccessData: + sse_decode_list_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerStCollapsedValue, + decodeErrorData: null, + ), + constMeta: kCrateApiApiNscoderDecodeConstMeta, + argValues: [data], + apiImpl: this, + ), + ); } - TaskConstMeta get kCrateApiApiRenameGroupConstMeta => const TaskConstMeta( - debugName: "rename_group", - argNames: ["passwords", "gid", "newname"], - ); + TaskConstMeta get kCrateApiApiNscoderDecodeConstMeta => + const TaskConstMeta(debugName: "nscoder_decode", argNames: ["data"]); @override - Future crateApiApiReportMessages( - {required ArcImClient state, - required String handle, - required List messages}) { - return handler.executeNormal(NormalTask( - callFfi: (port_) { - final serializer = SseSerializer(generalizedFrbRustBinding); - sse_encode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcIMClient( - state, serializer); - sse_encode_String(handle, serializer); - sse_encode_list_report_message(messages, serializer); - pdeCallFfi(generalizedFrbRustBinding, serializer, - funcId: 196, port: port_); - }, - codec: SseCodec( - decodeSuccessData: sse_decode_unit, - decodeErrorData: sse_decode_AnyhowException, - ), - constMeta: kCrateApiApiReportMessagesConstMeta, - argValues: [state, handle, messages], - apiImpl: this, - )); + Uint8List crateApiApiNscoderEncode({required List value}) { + return handler.executeSync( + SyncTask( + callFfi: () { + final serializer = SseSerializer(generalizedFrbRustBinding); + sse_encode_list_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerStCollapsedValue( + value, + serializer, + ); + return pdeCallFfi( + generalizedFrbRustBinding, + serializer, + funcId: 194, + )!; + }, + codec: SseCodec( + decodeSuccessData: sse_decode_list_prim_u_8_strict, + decodeErrorData: null, + ), + constMeta: kCrateApiApiNscoderEncodeConstMeta, + argValues: [value], + apiImpl: this, + ), + ); } - TaskConstMeta get kCrateApiApiReportMessagesConstMeta => const TaskConstMeta( - debugName: "report_messages", - argNames: ["state", "handle", "messages"], - ); + TaskConstMeta get kCrateApiApiNscoderEncodeConstMeta => + const TaskConstMeta(debugName: "nscoder_encode", argNames: ["value"]); @override - Future crateApiApiRequestHandles( - {required ArcStatusKitClientDefaultAnisetteProvider status, - required List to}) { - return handler.executeNormal(NormalTask( - callFfi: (port_) { - final serializer = SseSerializer(generalizedFrbRustBinding); - sse_encode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcStatusKitClientDefaultAnisetteProvider( - status, serializer); - sse_encode_list_String(to, serializer); - pdeCallFfi(generalizedFrbRustBinding, serializer, - funcId: 197, port: port_); - }, - codec: SseCodec( - decodeSuccessData: - sse_decode_opt_box_autoadd_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerChannelInterestToken, - decodeErrorData: sse_decode_AnyhowException, - ), - constMeta: kCrateApiApiRequestHandlesConstMeta, - argValues: [status, to], - apiImpl: this, - )); - } - - TaskConstMeta get kCrateApiApiRequestHandlesConstMeta => const TaskConstMeta( - debugName: "request_handles", - argNames: ["status", "to"], - ); - - @override - void crateApiApiResetAnisette({required String path}) { - return handler.executeSync(SyncTask( - callFfi: () { - final serializer = SseSerializer(generalizedFrbRustBinding); - sse_encode_String(path, serializer); - return pdeCallFfi(generalizedFrbRustBinding, serializer, funcId: 198)!; - }, - codec: SseCodec( - decodeSuccessData: sse_decode_unit, - decodeErrorData: null, - ), - constMeta: kCrateApiApiResetAnisetteConstMeta, - argValues: [path], - apiImpl: this, - )); + Future crateApiApiPackTranscriptPoster({ + required SimplifiedTranscriptPoster payload, + }) { + return handler.executeNormal( + NormalTask( + callFfi: (port_) { + final serializer = SseSerializer(generalizedFrbRustBinding); + sse_encode_box_autoadd_simplified_transcript_poster( + payload, + serializer, + ); + pdeCallFfi( + generalizedFrbRustBinding, + serializer, + funcId: 195, + port: port_, + ); + }, + codec: SseCodec( + decodeSuccessData: sse_decode_list_prim_u_8_strict, + decodeErrorData: sse_decode_AnyhowException, + ), + constMeta: kCrateApiApiPackTranscriptPosterConstMeta, + argValues: [payload], + apiImpl: this, + ), + ); } - TaskConstMeta get kCrateApiApiResetAnisetteConstMeta => const TaskConstMeta( - debugName: "reset_anisette", - argNames: ["path"], + TaskConstMeta get kCrateApiApiPackTranscriptPosterConstMeta => + const TaskConstMeta( + debugName: "pack_transcript_poster", + argNames: ["payload"], ); @override - Future crateApiApiResetChannelKeys( - {required ArcStatusKitClientDefaultAnisetteProvider status}) { - return handler.executeNormal(NormalTask( - callFfi: (port_) { - final serializer = SseSerializer(generalizedFrbRustBinding); - sse_encode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcStatusKitClientDefaultAnisetteProvider( - status, serializer); - pdeCallFfi(generalizedFrbRustBinding, serializer, - funcId: 199, port: port_); - }, - codec: SseCodec( - decodeSuccessData: sse_decode_unit, - decodeErrorData: sse_decode_AnyhowException, - ), - constMeta: kCrateApiApiResetChannelKeysConstMeta, - argValues: [status], - apiImpl: this, - )); + Future crateApiApiParsePoster({ + required IMessagePosterRecord poster, + }) { + return handler.executeNormal( + NormalTask( + callFfi: (port_) { + final serializer = SseSerializer(generalizedFrbRustBinding); + sse_encode_box_autoadd_i_message_poster_record(poster, serializer); + pdeCallFfi( + generalizedFrbRustBinding, + serializer, + funcId: 196, + port: port_, + ); + }, + codec: SseCodec( + decodeSuccessData: sse_decode_simplified_incoming_call_poster, + decodeErrorData: sse_decode_AnyhowException, + ), + constMeta: kCrateApiApiParsePosterConstMeta, + argValues: [poster], + apiImpl: this, + ), + ); } - TaskConstMeta get kCrateApiApiResetChannelKeysConstMeta => - const TaskConstMeta( - debugName: "reset_channel_keys", - argNames: ["status"], - ); + TaskConstMeta get kCrateApiApiParsePosterConstMeta => + const TaskConstMeta(debugName: "parse_poster", argNames: ["poster"]); @override - Future crateApiApiResetClique( - {required ArcKeychainClientDefaultAnisetteProvider keychain, - required ArcCloudMessagesClientDefaultAnisetteProvider cloudMessages, - required String devicePassword}) { - return handler.executeNormal(NormalTask( - callFfi: (port_) { - final serializer = SseSerializer(generalizedFrbRustBinding); - sse_encode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcKeychainClientDefaultAnisetteProvider( - keychain, serializer); - sse_encode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcCloudMessagesClientDefaultAnisetteProvider( - cloudMessages, serializer); - sse_encode_String(devicePassword, serializer); - pdeCallFfi(generalizedFrbRustBinding, serializer, - funcId: 200, port: port_); - }, - codec: SseCodec( - decodeSuccessData: sse_decode_unit, - decodeErrorData: sse_decode_AnyhowException, - ), - constMeta: kCrateApiApiResetCliqueConstMeta, - argValues: [keychain, cloudMessages, devicePassword], - apiImpl: this, - )); + Future crateApiApiParsePosterSave({ + required SimplifiedIncomingCallPoster poster, + }) { + return handler.executeNormal( + NormalTask( + callFfi: (port_) { + final serializer = SseSerializer(generalizedFrbRustBinding); + sse_encode_box_autoadd_simplified_incoming_call_poster( + poster, + serializer, + ); + pdeCallFfi( + generalizedFrbRustBinding, + serializer, + funcId: 197, + port: port_, + ); + }, + codec: SseCodec( + decodeSuccessData: sse_decode_list_prim_u_8_strict, + decodeErrorData: sse_decode_AnyhowException, + ), + constMeta: kCrateApiApiParsePosterSaveConstMeta, + argValues: [poster], + apiImpl: this, + ), + ); } - TaskConstMeta get kCrateApiApiResetCliqueConstMeta => const TaskConstMeta( - debugName: "reset_clique", - argNames: ["keychain", "cloudMessages", "devicePassword"], - ); + TaskConstMeta get kCrateApiApiParsePosterSaveConstMeta => + const TaskConstMeta(debugName: "parse_poster_save", argNames: ["poster"]); @override - Future crateApiApiResetState( - {required Sender cancel, - required String path, - required JoinedOsConfig config, - required ApsConnection aps, - ArcMutexAppleAccountDefaultAnisetteProvider? account, - required bool resetHw, - required bool logout}) { - return handler.executeNormal(NormalTask( - callFfi: (port_) { - final serializer = SseSerializer(generalizedFrbRustBinding); - sse_encode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerSender( - cancel, serializer); - sse_encode_String(path, serializer); - sse_encode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerJoinedOSConfig( - config, serializer); - sse_encode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerAPSConnection( - aps, serializer); - sse_encode_opt_box_autoadd_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcMutexAppleAccountDefaultAnisetteProvider( - account, serializer); - sse_encode_bool(resetHw, serializer); - sse_encode_bool(logout, serializer); - pdeCallFfi(generalizedFrbRustBinding, serializer, - funcId: 201, port: port_); - }, - codec: SseCodec( - decodeSuccessData: sse_decode_unit, - decodeErrorData: sse_decode_AnyhowException, - ), - constMeta: kCrateApiApiResetStateConstMeta, - argValues: [cancel, path, config, aps, account, resetHw, logout], - apiImpl: this, - )); + Future crateApiApiParseTranscriptPoster({ + required List payload, + }) { + return handler.executeNormal( + NormalTask( + callFfi: (port_) { + final serializer = SseSerializer(generalizedFrbRustBinding); + sse_encode_list_prim_u_8_loose(payload, serializer); + pdeCallFfi( + generalizedFrbRustBinding, + serializer, + funcId: 198, + port: port_, + ); + }, + codec: SseCodec( + decodeSuccessData: sse_decode_simplified_transcript_poster, + decodeErrorData: sse_decode_AnyhowException, + ), + constMeta: kCrateApiApiParseTranscriptPosterConstMeta, + argValues: [payload], + apiImpl: this, + ), + ); } - TaskConstMeta get kCrateApiApiResetStateConstMeta => const TaskConstMeta( - debugName: "reset_state", - argNames: [ - "cancel", - "path", - "config", - "aps", - "account", - "resetHw", - "logout" - ], + TaskConstMeta get kCrateApiApiParseTranscriptPosterConstMeta => + const TaskConstMeta( + debugName: "parse_transcript_poster", + argNames: ["payload"], ); @override - Future - crateApiApiRestoreAccount( - {required String path, - required ArcAnisetteClientDefaultAnisetteProvider anisette, - required JoinedOsConfig config, - required ApsConnection conn}) { - return handler.executeNormal(NormalTask( - callFfi: (port_) { - final serializer = SseSerializer(generalizedFrbRustBinding); - sse_encode_String(path, serializer); - sse_encode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcAnisetteClientDefaultAnisetteProvider( - anisette, serializer); - sse_encode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerJoinedOSConfig( - config, serializer); - sse_encode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerAPSConnection( - conn, serializer); - pdeCallFfi(generalizedFrbRustBinding, serializer, - funcId: 202, port: port_); - }, - codec: SseCodec( - decodeSuccessData: - sse_decode_opt_box_autoadd_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcMutexAppleAccountDefaultAnisetteProvider, - decodeErrorData: null, - ), - constMeta: kCrateApiApiRestoreAccountConstMeta, - argValues: [path, anisette, config, conn], - apiImpl: this, - )); + Uint8List crateApiApiPasswordManagerMetaGetData({ + required PasswordManagerMetaData data, + }) { + return handler.executeSync( + SyncTask( + callFfi: () { + final serializer = SseSerializer(generalizedFrbRustBinding); + sse_encode_box_autoadd_password_manager_meta_data(data, serializer); + return pdeCallFfi( + generalizedFrbRustBinding, + serializer, + funcId: 199, + )!; + }, + codec: SseCodec( + decodeSuccessData: sse_decode_list_prim_u_8_strict, + decodeErrorData: + sse_decode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerPushError, + ), + constMeta: kCrateApiApiPasswordManagerMetaGetDataConstMeta, + argValues: [data], + apiImpl: this, + ), + ); } - TaskConstMeta get kCrateApiApiRestoreAccountConstMeta => const TaskConstMeta( - debugName: "restore_account", - argNames: ["path", "anisette", "config", "conn"], + TaskConstMeta get kCrateApiApiPasswordManagerMetaGetDataConstMeta => + const TaskConstMeta( + debugName: "password_manager_meta_get_data", + argNames: ["data"], ); @override - Attachment crateApiApiRestoreAttachment({required String data}) { - return handler.executeSync(SyncTask( - callFfi: () { - final serializer = SseSerializer(generalizedFrbRustBinding); - sse_encode_String(data, serializer); - return pdeCallFfi(generalizedFrbRustBinding, serializer, funcId: 203)!; - }, - codec: SseCodec( - decodeSuccessData: sse_decode_attachment, - decodeErrorData: null, - ), - constMeta: kCrateApiApiRestoreAttachmentConstMeta, - argValues: [data], - apiImpl: this, - )); + PasswordManagerMetaData crateApiApiPasswordManagerMetaGetPasswordData({ + required PasswordManagerMeta that, + }) { + return handler.executeSync( + SyncTask( + callFfi: () { + final serializer = SseSerializer(generalizedFrbRustBinding); + sse_encode_box_autoadd_password_manager_meta(that, serializer); + return pdeCallFfi( + generalizedFrbRustBinding, + serializer, + funcId: 200, + )!; + }, + codec: SseCodec( + decodeSuccessData: sse_decode_password_manager_meta_data, + decodeErrorData: + sse_decode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerPushError, + ), + constMeta: kCrateApiApiPasswordManagerMetaGetPasswordDataConstMeta, + argValues: [that], + apiImpl: this, + ), + ); } - TaskConstMeta get kCrateApiApiRestoreAttachmentConstMeta => + TaskConstMeta get kCrateApiApiPasswordManagerMetaGetPasswordDataConstMeta => const TaskConstMeta( - debugName: "restore_attachment", - argNames: ["data"], + debugName: "password_manager_meta_get_password_data", + argNames: ["that"], ); @override - CloudChat crateApiApiRestoreCloudChat({required List data}) { - return handler.executeSync(SyncTask( - callFfi: () { - final serializer = SseSerializer(generalizedFrbRustBinding); - sse_encode_list_prim_u_8_loose(data, serializer); - return pdeCallFfi(generalizedFrbRustBinding, serializer, funcId: 204)!; - }, - codec: SseCodec( - decodeSuccessData: sse_decode_cloud_chat, - decodeErrorData: null, - ), - constMeta: kCrateApiApiRestoreCloudChatConstMeta, - argValues: [data], - apiImpl: this, - )); + (int, BigInt) crateApiApiPasswordManagerTotpGenerateOtp({ + required PasswordManagerTotp that, + }) { + return handler.executeSync( + SyncTask( + callFfi: () { + final serializer = SseSerializer(generalizedFrbRustBinding); + sse_encode_box_autoadd_password_manager_totp(that, serializer); + return pdeCallFfi( + generalizedFrbRustBinding, + serializer, + funcId: 201, + )!; + }, + codec: SseCodec( + decodeSuccessData: sse_decode_record_u_32_u_64, + decodeErrorData: + sse_decode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerPushError, + ), + constMeta: kCrateApiApiPasswordManagerTotpGenerateOtpConstMeta, + argValues: [that], + apiImpl: this, + ), + ); } - TaskConstMeta get kCrateApiApiRestoreCloudChatConstMeta => + TaskConstMeta get kCrateApiApiPasswordManagerTotpGenerateOtpConstMeta => const TaskConstMeta( - debugName: "restore_cloud_chat", - argNames: ["data"], + debugName: "password_manager_totp_generate_otp", + argNames: ["that"], ); @override - Future crateApiApiRestoreUser({required String user}) { - return handler.executeNormal(NormalTask( - callFfi: (port_) { - final serializer = SseSerializer(generalizedFrbRustBinding); - sse_encode_String(user, serializer); - pdeCallFfi(generalizedFrbRustBinding, serializer, - funcId: 205, port: port_); - }, - codec: SseCodec( - decodeSuccessData: - sse_decode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerIDSUser, - decodeErrorData: sse_decode_AnyhowException, - ), - constMeta: kCrateApiApiRestoreUserConstMeta, - argValues: [user], - apiImpl: this, - )); + Future crateApiApiPlayFindMySound({ + required JoinedOsConfig config, + required FindMyPhoneClientDefaultAnisetteProvider client, + required String deviceId, + }) { + return handler.executeNormal( + NormalTask( + callFfi: (port_) { + final serializer = SseSerializer(generalizedFrbRustBinding); + sse_encode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerJoinedOSConfig( + config, + serializer, + ); + sse_encode_Auto_RefMut_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerFindMyPhoneClientDefaultAnisetteProvider( + client, + serializer, + ); + sse_encode_String(deviceId, serializer); + pdeCallFfi( + generalizedFrbRustBinding, + serializer, + funcId: 202, + port: port_, + ); + }, + codec: SseCodec( + decodeSuccessData: sse_decode_unit, + decodeErrorData: sse_decode_AnyhowException, + ), + constMeta: kCrateApiApiPlayFindMySoundConstMeta, + argValues: [config, client, deviceId], + apiImpl: this, + ), + ); } - TaskConstMeta get kCrateApiApiRestoreUserConstMeta => const TaskConstMeta( - debugName: "restore_user", - argNames: ["user"], - ); + TaskConstMeta get kCrateApiApiPlayFindMySoundConstMeta => const TaskConstMeta( + debugName: "play_find_my_sound", + argNames: ["config", "client", "deviceId"], + ); @override - List? crateApiApiRestoreUsers({required String path}) { - return handler.executeSync(SyncTask( - callFfi: () { - final serializer = SseSerializer(generalizedFrbRustBinding); - sse_encode_String(path, serializer); - return pdeCallFfi(generalizedFrbRustBinding, serializer, funcId: 206)!; - }, - codec: SseCodec( - decodeSuccessData: - sse_decode_opt_list_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerIDSUser, - decodeErrorData: null, - ), - constMeta: kCrateApiApiRestoreUsersConstMeta, - argValues: [path], - apiImpl: this, - )); + Future crateApiApiProvisionedFlavorDefault() { + return handler.executeNormal( + NormalTask( + callFfi: (port_) { + final serializer = SseSerializer(generalizedFrbRustBinding); + pdeCallFfi( + generalizedFrbRustBinding, + serializer, + funcId: 203, + port: port_, + ); + }, + codec: SseCodec( + decodeSuccessData: sse_decode_provisioned_flavor, + decodeErrorData: null, + ), + constMeta: kCrateApiApiProvisionedFlavorDefaultConstMeta, + argValues: [], + apiImpl: this, + ), + ); } - TaskConstMeta get kCrateApiApiRestoreUsersConstMeta => const TaskConstMeta( - debugName: "restore_users", - argNames: ["path"], + TaskConstMeta get kCrateApiApiProvisionedFlavorDefaultConstMeta => + const TaskConstMeta( + debugName: "provisioned_flavor_default", + argNames: [], ); @override - Future crateApiApiSaveAttachment({required Attachment att}) { - return handler.executeNormal(NormalTask( - callFfi: (port_) { - final serializer = SseSerializer(generalizedFrbRustBinding); - sse_encode_box_autoadd_attachment(att, serializer); - pdeCallFfi(generalizedFrbRustBinding, serializer, - funcId: 207, port: port_); - }, - codec: SseCodec( - decodeSuccessData: sse_decode_String, - decodeErrorData: null, - ), - constMeta: kCrateApiApiSaveAttachmentConstMeta, - argValues: [att], - apiImpl: this, - )); + Future crateApiApiPtrToDart({required String ptr}) { + return handler.executeNormal( + NormalTask( + callFfi: (port_) { + final serializer = SseSerializer(generalizedFrbRustBinding); + sse_encode_String(ptr, serializer); + pdeCallFfi( + generalizedFrbRustBinding, + serializer, + funcId: 204, + port: port_, + ); + }, + codec: SseCodec( + decodeSuccessData: sse_decode_opt_box_autoadd_push_message, + decodeErrorData: null, + ), + constMeta: kCrateApiApiPtrToDartConstMeta, + argValues: [ptr], + apiImpl: this, + ), + ); } - TaskConstMeta get kCrateApiApiSaveAttachmentConstMeta => const TaskConstMeta( - debugName: "save_attachment", - argNames: ["att"], - ); + TaskConstMeta get kCrateApiApiPtrToDartConstMeta => + const TaskConstMeta(debugName: "ptr_to_dart", argNames: ["ptr"]); @override - Future> crateApiApiSaveAttachments( - {required ArcCloudMessagesClientDefaultAnisetteProvider - cloudMessagesClient, - required Map attachments}) { - return handler.executeNormal(NormalTask( - callFfi: (port_) { - final serializer = SseSerializer(generalizedFrbRustBinding); - sse_encode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcCloudMessagesClientDefaultAnisetteProvider( - cloudMessagesClient, serializer); - sse_encode_Map_String_cloud_attachment(attachments, serializer); - pdeCallFfi(generalizedFrbRustBinding, serializer, - funcId: 208, port: port_); - }, - codec: SseCodec( - decodeSuccessData: sse_decode_Map_String_bool, - decodeErrorData: sse_decode_AnyhowException, - ), - constMeta: kCrateApiApiSaveAttachmentsConstMeta, - argValues: [cloudMessagesClient, attachments], - apiImpl: this, - )); + Future crateApiApiQueryHandle({ + required ArcPasswordManagerDefaultAnisetteProvider passwords, + required String handle, + }) { + return handler.executeNormal( + NormalTask( + callFfi: (port_) { + final serializer = SseSerializer(generalizedFrbRustBinding); + sse_encode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcPasswordManagerDefaultAnisetteProvider( + passwords, + serializer, + ); + sse_encode_String(handle, serializer); + pdeCallFfi( + generalizedFrbRustBinding, + serializer, + funcId: 205, + port: port_, + ); + }, + codec: SseCodec( + decodeSuccessData: sse_decode_bool, + decodeErrorData: sse_decode_AnyhowException, + ), + constMeta: kCrateApiApiQueryHandleConstMeta, + argValues: [passwords, handle], + apiImpl: this, + ), + ); } - TaskConstMeta get kCrateApiApiSaveAttachmentsConstMeta => const TaskConstMeta( - debugName: "save_attachments", - argNames: ["cloudMessagesClient", "attachments"], - ); + TaskConstMeta get kCrateApiApiQueryHandleConstMeta => const TaskConstMeta( + debugName: "query_handle", + argNames: ["passwords", "handle"], + ); @override - Future> crateApiApiSaveChats( - {required ArcCloudMessagesClientDefaultAnisetteProvider - cloudMessagesClient, - required Map chats}) { - return handler.executeNormal(NormalTask( - callFfi: (port_) { - final serializer = SseSerializer(generalizedFrbRustBinding); - sse_encode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcCloudMessagesClientDefaultAnisetteProvider( - cloudMessagesClient, serializer); - sse_encode_Map_String_cloud_chat(chats, serializer); - pdeCallFfi(generalizedFrbRustBinding, serializer, - funcId: 209, port: port_); - }, - codec: SseCodec( - decodeSuccessData: sse_decode_Map_String_bool, - decodeErrorData: sse_decode_AnyhowException, - ), - constMeta: kCrateApiApiSaveChatsConstMeta, - argValues: [cloudMessagesClient, chats], - apiImpl: this, - )); + SavedHardwareState? crateApiApiReadHardware({required String path}) { + return handler.executeSync( + SyncTask( + callFfi: () { + final serializer = SseSerializer(generalizedFrbRustBinding); + sse_encode_String(path, serializer); + return pdeCallFfi( + generalizedFrbRustBinding, + serializer, + funcId: 206, + )!; + }, + codec: SseCodec( + decodeSuccessData: + sse_decode_opt_box_autoadd_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerSavedHardwareState, + decodeErrorData: null, + ), + constMeta: kCrateApiApiReadHardwareConstMeta, + argValues: [path], + apiImpl: this, + ), + ); } - TaskConstMeta get kCrateApiApiSaveChatsConstMeta => const TaskConstMeta( - debugName: "save_chats", - argNames: ["cloudMessagesClient", "chats"], - ); + TaskConstMeta get kCrateApiApiReadHardwareConstMeta => + const TaskConstMeta(debugName: "read_hardware", argNames: ["path"]); @override - Uint8List crateApiApiSaveCloudChat({required CloudChat value}) { - return handler.executeSync(SyncTask( - callFfi: () { - final serializer = SseSerializer(generalizedFrbRustBinding); - sse_encode_box_autoadd_cloud_chat(value, serializer); - return pdeCallFfi(generalizedFrbRustBinding, serializer, funcId: 210)!; - }, - codec: SseCodec( - decodeSuccessData: sse_decode_list_prim_u_8_strict, - decodeErrorData: null, - ), - constMeta: kCrateApiApiSaveCloudChatConstMeta, - argValues: [value], - apiImpl: this, - )); + Future crateApiApiRecvWait({ + required ApsWatcher watcher, + required ArcSharedPushState state, + }) { + return handler.executeNormal( + NormalTask( + callFfi: (port_) { + final serializer = SseSerializer(generalizedFrbRustBinding); + sse_encode_Auto_RefMut_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerAPSWatcher( + watcher, + serializer, + ); + sse_encode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcSharedPushState( + state, + serializer, + ); + pdeCallFfi( + generalizedFrbRustBinding, + serializer, + funcId: 207, + port: port_, + ); + }, + codec: SseCodec( + decodeSuccessData: sse_decode_poll_result, + decodeErrorData: null, + ), + constMeta: kCrateApiApiRecvWaitConstMeta, + argValues: [watcher, state], + apiImpl: this, + ), + ); } - TaskConstMeta get kCrateApiApiSaveCloudChatConstMeta => const TaskConstMeta( - debugName: "save_cloud_chat", - argNames: ["value"], - ); + TaskConstMeta get kCrateApiApiRecvWaitConstMeta => const TaskConstMeta( + debugName: "recv_wait", + argNames: ["watcher", "state"], + ); @override - Future> crateApiApiSaveMessages( - {required ArcCloudMessagesClientDefaultAnisetteProvider - cloudMessagesClient, - required Map messages}) { - return handler.executeNormal(NormalTask( - callFfi: (port_) { - final serializer = SseSerializer(generalizedFrbRustBinding); - sse_encode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcCloudMessagesClientDefaultAnisetteProvider( - cloudMessagesClient, serializer); - sse_encode_Map_String_cloud_message(messages, serializer); - pdeCallFfi(generalizedFrbRustBinding, serializer, - funcId: 211, port: port_); - }, - codec: SseCodec( - decodeSuccessData: sse_decode_Map_String_bool, - decodeErrorData: sse_decode_AnyhowException, - ), - constMeta: kCrateApiApiSaveMessagesConstMeta, - argValues: [cloudMessagesClient, messages], - apiImpl: this, - )); + Future crateApiApiRefreshApsConnection({required ApsConnection aps}) { + return handler.executeNormal( + NormalTask( + callFfi: (port_) { + final serializer = SseSerializer(generalizedFrbRustBinding); + sse_encode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerAPSConnection( + aps, + serializer, + ); + pdeCallFfi( + generalizedFrbRustBinding, + serializer, + funcId: 208, + port: port_, + ); + }, + codec: SseCodec( + decodeSuccessData: sse_decode_unit, + decodeErrorData: sse_decode_AnyhowException, + ), + constMeta: kCrateApiApiRefreshApsConnectionConstMeta, + argValues: [aps], + apiImpl: this, + ), + ); } - TaskConstMeta get kCrateApiApiSaveMessagesConstMeta => const TaskConstMeta( - debugName: "save_messages", - argNames: ["cloudMessagesClient", "messages"], + TaskConstMeta get kCrateApiApiRefreshApsConnectionConstMeta => + const TaskConstMeta( + debugName: "refresh_aps_connection", + argNames: ["aps"], ); @override - Future crateApiApiSavePasskey( - {required ArcPasswordManagerDefaultAnisetteProvider passwords, - required String id, - required Passkey entry, - String? group}) { - return handler.executeNormal(NormalTask( - callFfi: (port_) { - final serializer = SseSerializer(generalizedFrbRustBinding); - sse_encode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcPasswordManagerDefaultAnisetteProvider( - passwords, serializer); - sse_encode_String(id, serializer); - sse_encode_box_autoadd_passkey(entry, serializer); - sse_encode_opt_String(group, serializer); - pdeCallFfi(generalizedFrbRustBinding, serializer, - funcId: 212, port: port_); - }, - codec: SseCodec( - decodeSuccessData: sse_decode_unit, - decodeErrorData: sse_decode_AnyhowException, - ), - constMeta: kCrateApiApiSavePasskeyConstMeta, - argValues: [passwords, id, entry, group], - apiImpl: this, - )); + Future> crateApiApiRefreshBackgroundFollowing({ + required ArcFindMyClientDefaultAnisetteProvider state, + required JoinedOsConfig config, + }) { + return handler.executeNormal( + NormalTask( + callFfi: (port_) { + final serializer = SseSerializer(generalizedFrbRustBinding); + sse_encode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcFindMyClientDefaultAnisetteProvider( + state, + serializer, + ); + sse_encode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerJoinedOSConfig( + config, + serializer, + ); + pdeCallFfi( + generalizedFrbRustBinding, + serializer, + funcId: 209, + port: port_, + ); + }, + codec: SseCodec( + decodeSuccessData: sse_decode_list_follow, + decodeErrorData: sse_decode_AnyhowException, + ), + constMeta: kCrateApiApiRefreshBackgroundFollowingConstMeta, + argValues: [state, config], + apiImpl: this, + ), + ); } - TaskConstMeta get kCrateApiApiSavePasskeyConstMeta => const TaskConstMeta( - debugName: "save_passkey", - argNames: ["passwords", "id", "entry", "group"], + TaskConstMeta get kCrateApiApiRefreshBackgroundFollowingConstMeta => + const TaskConstMeta( + debugName: "refresh_background_following", + argNames: ["state", "config"], ); @override - Future crateApiApiSavePassword( - {required ArcPasswordManagerDefaultAnisetteProvider passwords, - required String id, - required PasswordRawEntry entry, - String? group}) { - return handler.executeNormal(NormalTask( - callFfi: (port_) { - final serializer = SseSerializer(generalizedFrbRustBinding); - sse_encode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcPasswordManagerDefaultAnisetteProvider( - passwords, serializer); - sse_encode_String(id, serializer); - sse_encode_box_autoadd_password_raw_entry(entry, serializer); - sse_encode_opt_String(group, serializer); - pdeCallFfi(generalizedFrbRustBinding, serializer, - funcId: 213, port: port_); - }, - codec: SseCodec( - decodeSuccessData: sse_decode_unit, - decodeErrorData: sse_decode_AnyhowException, - ), - constMeta: kCrateApiApiSavePasswordConstMeta, - argValues: [passwords, id, entry, group], - apiImpl: this, - )); + Future> crateApiApiRefreshDevices({ + required JoinedOsConfig config, + required FindMyPhoneClientDefaultAnisetteProvider client, + }) { + return handler.executeNormal( + NormalTask( + callFfi: (port_) { + final serializer = SseSerializer(generalizedFrbRustBinding); + sse_encode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerJoinedOSConfig( + config, + serializer, + ); + sse_encode_Auto_RefMut_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerFindMyPhoneClientDefaultAnisetteProvider( + client, + serializer, + ); + pdeCallFfi( + generalizedFrbRustBinding, + serializer, + funcId: 210, + port: port_, + ); + }, + codec: SseCodec( + decodeSuccessData: sse_decode_list_found_device, + decodeErrorData: sse_decode_AnyhowException, + ), + constMeta: kCrateApiApiRefreshDevicesConstMeta, + argValues: [config, client], + apiImpl: this, + ), + ); } - TaskConstMeta get kCrateApiApiSavePasswordConstMeta => const TaskConstMeta( - debugName: "save_password", - argNames: ["passwords", "id", "entry", "group"], - ); + TaskConstMeta get kCrateApiApiRefreshDevicesConstMeta => const TaskConstMeta( + debugName: "refresh_devices", + argNames: ["config", "client"], + ); @override - Future crateApiApiSavePasswordMeta( - {required ArcPasswordManagerDefaultAnisetteProvider passwords, - required String id, - required PasswordManagerMeta entry, - String? group}) { - return handler.executeNormal(NormalTask( - callFfi: (port_) { - final serializer = SseSerializer(generalizedFrbRustBinding); - sse_encode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcPasswordManagerDefaultAnisetteProvider( - passwords, serializer); - sse_encode_String(id, serializer); - sse_encode_box_autoadd_password_manager_meta(entry, serializer); - sse_encode_opt_String(group, serializer); - pdeCallFfi(generalizedFrbRustBinding, serializer, - funcId: 214, port: port_); - }, - codec: SseCodec( - decodeSuccessData: sse_decode_unit, - decodeErrorData: sse_decode_AnyhowException, - ), - constMeta: kCrateApiApiSavePasswordMetaConstMeta, - argValues: [passwords, id, entry, group], - apiImpl: this, - )); + Future> crateApiApiRefreshFollowing({ + required JoinedOsConfig config, + required FindMyFriendsClientDefaultAnisetteProvider client, + }) { + return handler.executeNormal( + NormalTask( + callFfi: (port_) { + final serializer = SseSerializer(generalizedFrbRustBinding); + sse_encode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerJoinedOSConfig( + config, + serializer, + ); + sse_encode_Auto_RefMut_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerFindMyFriendsClientDefaultAnisetteProvider( + client, + serializer, + ); + pdeCallFfi( + generalizedFrbRustBinding, + serializer, + funcId: 211, + port: port_, + ); + }, + codec: SseCodec( + decodeSuccessData: sse_decode_list_follow, + decodeErrorData: sse_decode_AnyhowException, + ), + constMeta: kCrateApiApiRefreshFollowingConstMeta, + argValues: [config, client], + apiImpl: this, + ), + ); } - TaskConstMeta get kCrateApiApiSavePasswordMetaConstMeta => + TaskConstMeta get kCrateApiApiRefreshFollowingConstMeta => const TaskConstMeta( - debugName: "save_password_meta", - argNames: ["passwords", "id", "entry", "group"], + debugName: "refresh_following", + argNames: ["config", "client"], ); @override - Future crateApiApiSaveUser({required IdsUser user}) { - return handler.executeNormal(NormalTask( - callFfi: (port_) { - final serializer = SseSerializer(generalizedFrbRustBinding); - sse_encode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerIDSUser( - user, serializer); - pdeCallFfi(generalizedFrbRustBinding, serializer, - funcId: 215, port: port_); - }, - codec: SseCodec( - decodeSuccessData: sse_decode_String, - decodeErrorData: sse_decode_AnyhowException, - ), - constMeta: kCrateApiApiSaveUserConstMeta, - argValues: [user], - apiImpl: this, - )); + Future<(List?, SupportAlert?)> crateApiApiRegisterIds({ + required String path, + required JoinedOsConfig config, + required ApsConnection aps, + required IdsngmIdentity identity, + required List users, + }) { + return handler.executeNormal( + NormalTask( + callFfi: (port_) { + final serializer = SseSerializer(generalizedFrbRustBinding); + sse_encode_String(path, serializer); + sse_encode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerJoinedOSConfig( + config, + serializer, + ); + sse_encode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerAPSConnection( + aps, + serializer, + ); + sse_encode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerIDSNGMIdentity( + identity, + serializer, + ); + sse_encode_list_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerIDSUser( + users, + serializer, + ); + pdeCallFfi( + generalizedFrbRustBinding, + serializer, + funcId: 212, + port: port_, + ); + }, + codec: SseCodec( + decodeSuccessData: + sse_decode_record_opt_list_auto_owned_rust_opaque_flutter_rust_bridgefor_generated_rust_auto_opaque_inner_ids_user_opt_box_autoadd_support_alert, + decodeErrorData: sse_decode_AnyhowException, + ), + constMeta: kCrateApiApiRegisterIdsConstMeta, + argValues: [path, config, aps, identity, users], + apiImpl: this, + ), + ); } - TaskConstMeta get kCrateApiApiSaveUserConstMeta => const TaskConstMeta( - debugName: "save_user", - argNames: ["user"], - ); + TaskConstMeta get kCrateApiApiRegisterIdsConstMeta => const TaskConstMeta( + debugName: "register_ids", + argNames: ["path", "config", "aps", "identity", "users"], + ); @override - void crateApiApiSaveUsers( - {required List users, required String path}) { - return handler.executeSync(SyncTask( - callFfi: () { - final serializer = SseSerializer(generalizedFrbRustBinding); - sse_encode_list_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerIDSUser( - users, serializer); - sse_encode_String(path, serializer); - return pdeCallFfi(generalizedFrbRustBinding, serializer, funcId: 216)!; - }, - codec: SseCodec( - decodeSuccessData: sse_decode_unit, - decodeErrorData: null, - ), - constMeta: kCrateApiApiSaveUsersConstMeta, - argValues: [users, path], - apiImpl: this, - )); + Future> crateApiApiRemoveAlbum({ + required SyncManagerDefaultAnisetteProviderMyFilePackager lock, + required String guid, + }) { + return handler.executeNormal( + NormalTask( + callFfi: (port_) { + final serializer = SseSerializer(generalizedFrbRustBinding); + sse_encode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerSyncManagerDefaultAnisetteProviderMyFilePackager( + lock, + serializer, + ); + sse_encode_String(guid, serializer); + pdeCallFfi( + generalizedFrbRustBinding, + serializer, + funcId: 213, + port: port_, + ); + }, + codec: SseCodec( + decodeSuccessData: sse_decode_list_shared_album, + decodeErrorData: sse_decode_AnyhowException, + ), + constMeta: kCrateApiApiRemoveAlbumConstMeta, + argValues: [lock, guid], + apiImpl: this, + ), + ); } - TaskConstMeta get kCrateApiApiSaveUsersConstMeta => const TaskConstMeta( - debugName: "save_users", - argNames: ["users", "path"], - ); + TaskConstMeta get kCrateApiApiRemoveAlbumConstMeta => const TaskConstMeta( + debugName: "remove_album", + argNames: ["lock", "guid"], + ); @override - Future crateApiApiSaveWifiPassword( - {required ArcPasswordManagerDefaultAnisetteProvider passwords, - required String id, - required WifiPassword entry, - String? group}) { - return handler.executeNormal(NormalTask( - callFfi: (port_) { - final serializer = SseSerializer(generalizedFrbRustBinding); - sse_encode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcPasswordManagerDefaultAnisetteProvider( - passwords, serializer); - sse_encode_String(id, serializer); - sse_encode_box_autoadd_wifi_password(entry, serializer); - sse_encode_opt_String(group, serializer); - pdeCallFfi(generalizedFrbRustBinding, serializer, - funcId: 217, port: port_); - }, - codec: SseCodec( - decodeSuccessData: sse_decode_unit, - decodeErrorData: sse_decode_AnyhowException, - ), - constMeta: kCrateApiApiSaveWifiPasswordConstMeta, - argValues: [passwords, id, entry, group], - apiImpl: this, - )); + Future crateApiApiRemoveUser({ + required ArcPasswordManagerDefaultAnisetteProvider passwords, + required String gid, + required String handle, + }) { + return handler.executeNormal( + NormalTask( + callFfi: (port_) { + final serializer = SseSerializer(generalizedFrbRustBinding); + sse_encode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcPasswordManagerDefaultAnisetteProvider( + passwords, + serializer, + ); + sse_encode_String(gid, serializer); + sse_encode_String(handle, serializer); + pdeCallFfi( + generalizedFrbRustBinding, + serializer, + funcId: 214, + port: port_, + ); + }, + codec: SseCodec( + decodeSuccessData: sse_decode_unit, + decodeErrorData: sse_decode_AnyhowException, + ), + constMeta: kCrateApiApiRemoveUserConstMeta, + argValues: [passwords, gid, handle], + apiImpl: this, + ), + ); } - TaskConstMeta get kCrateApiApiSaveWifiPasswordConstMeta => - const TaskConstMeta( - debugName: "save_wifi_password", - argNames: ["passwords", "id", "entry", "group"], - ); + TaskConstMeta get kCrateApiApiRemoveUserConstMeta => const TaskConstMeta( + debugName: "remove_user", + argNames: ["passwords", "gid", "handle"], + ); @override - Future> crateApiApiSelectBackgroundFriend( - {required ArcFindMyClientDefaultAnisetteProvider fmfd, String? friend}) { - return handler.executeNormal(NormalTask( - callFfi: (port_) { - final serializer = SseSerializer(generalizedFrbRustBinding); - sse_encode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcFindMyClientDefaultAnisetteProvider( - fmfd, serializer); - sse_encode_opt_String(friend, serializer); - pdeCallFfi(generalizedFrbRustBinding, serializer, - funcId: 218, port: port_); - }, - codec: SseCodec( - decodeSuccessData: sse_decode_list_follow, - decodeErrorData: sse_decode_AnyhowException, - ), - constMeta: kCrateApiApiSelectBackgroundFriendConstMeta, - argValues: [fmfd, friend], - apiImpl: this, - )); + Future crateApiApiRenameGroup({ + required ArcPasswordManagerDefaultAnisetteProvider passwords, + required String gid, + required String newname, + }) { + return handler.executeNormal( + NormalTask( + callFfi: (port_) { + final serializer = SseSerializer(generalizedFrbRustBinding); + sse_encode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcPasswordManagerDefaultAnisetteProvider( + passwords, + serializer, + ); + sse_encode_String(gid, serializer); + sse_encode_String(newname, serializer); + pdeCallFfi( + generalizedFrbRustBinding, + serializer, + funcId: 215, + port: port_, + ); + }, + codec: SseCodec( + decodeSuccessData: sse_decode_unit, + decodeErrorData: sse_decode_AnyhowException, + ), + constMeta: kCrateApiApiRenameGroupConstMeta, + argValues: [passwords, gid, newname], + apiImpl: this, + ), + ); } - TaskConstMeta get kCrateApiApiSelectBackgroundFriendConstMeta => - const TaskConstMeta( - debugName: "select_background_friend", - argNames: ["fmfd", "friend"], - ); + TaskConstMeta get kCrateApiApiRenameGroupConstMeta => const TaskConstMeta( + debugName: "rename_group", + argNames: ["passwords", "gid", "newname"], + ); @override - Future> crateApiApiSelectFriend( - {required JoinedOsConfig config, - required FindMyFriendsClientDefaultAnisetteProvider client, - String? friend}) { - return handler.executeNormal(NormalTask( - callFfi: (port_) { - final serializer = SseSerializer(generalizedFrbRustBinding); - sse_encode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerJoinedOSConfig( - config, serializer); - sse_encode_Auto_RefMut_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerFindMyFriendsClientDefaultAnisetteProvider( - client, serializer); - sse_encode_opt_String(friend, serializer); - pdeCallFfi(generalizedFrbRustBinding, serializer, - funcId: 219, port: port_); - }, - codec: SseCodec( - decodeSuccessData: sse_decode_list_follow, - decodeErrorData: sse_decode_AnyhowException, - ), - constMeta: kCrateApiApiSelectFriendConstMeta, - argValues: [config, client, friend], - apiImpl: this, - )); + Future crateApiApiReportMessages({ + required ArcImClient state, + required String handle, + required List messages, + }) { + return handler.executeNormal( + NormalTask( + callFfi: (port_) { + final serializer = SseSerializer(generalizedFrbRustBinding); + sse_encode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcIMClient( + state, + serializer, + ); + sse_encode_String(handle, serializer); + sse_encode_list_report_message(messages, serializer); + pdeCallFfi( + generalizedFrbRustBinding, + serializer, + funcId: 216, + port: port_, + ); + }, + codec: SseCodec( + decodeSuccessData: sse_decode_unit, + decodeErrorData: sse_decode_AnyhowException, + ), + constMeta: kCrateApiApiReportMessagesConstMeta, + argValues: [state, handle, messages], + apiImpl: this, + ), + ); } - TaskConstMeta get kCrateApiApiSelectFriendConstMeta => const TaskConstMeta( - debugName: "select_friend", - argNames: ["config", "client", "friend"], - ); + TaskConstMeta get kCrateApiApiReportMessagesConstMeta => const TaskConstMeta( + debugName: "report_messages", + argNames: ["state", "handle", "messages"], + ); @override - Future crateApiApiSend( - {required ArcImClient state, - required ArcSenderPushMessage local, - required MessageInst msg}) { - return handler.executeNormal(NormalTask( - callFfi: (port_) { - final serializer = SseSerializer(generalizedFrbRustBinding); - sse_encode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcIMClient( - state, serializer); - sse_encode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcSenderPushMessage( - local, serializer); - sse_encode_box_autoadd_message_inst(msg, serializer); - pdeCallFfi(generalizedFrbRustBinding, serializer, - funcId: 220, port: port_); - }, - codec: SseCodec( - decodeSuccessData: sse_decode_bool, - decodeErrorData: sse_decode_AnyhowException, - ), - constMeta: kCrateApiApiSendConstMeta, - argValues: [state, local, msg], - apiImpl: this, - )); - } - - TaskConstMeta get kCrateApiApiSendConstMeta => const TaskConstMeta( - debugName: "send", - argNames: ["state", "local", "msg"], - ); - - @override - Future crateApiApiSend2FaSms( - {CircleClientSessionDefaultAnisetteProvider? locked, - required ArcMutexAppleAccountDefaultAnisetteProvider account, - required int phoneId}) { - return handler.executeNormal(NormalTask( - callFfi: (port_) { - final serializer = SseSerializer(generalizedFrbRustBinding); - sse_encode_opt_box_autoadd_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerCircleClientSessionDefaultAnisetteProvider( - locked, serializer); - sse_encode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcMutexAppleAccountDefaultAnisetteProvider( - account, serializer); - sse_encode_u_32(phoneId, serializer); - pdeCallFfi(generalizedFrbRustBinding, serializer, - funcId: 221, port: port_); - }, - codec: SseCodec( - decodeSuccessData: sse_decode_login_state, - decodeErrorData: sse_decode_AnyhowException, - ), - constMeta: kCrateApiApiSend2FaSmsConstMeta, - argValues: [locked, account, phoneId], - apiImpl: this, - )); + Future crateApiApiRequestHandles({ + required ArcStatusKitClientDefaultAnisetteProvider status, + required List to, + }) { + return handler.executeNormal( + NormalTask( + callFfi: (port_) { + final serializer = SseSerializer(generalizedFrbRustBinding); + sse_encode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcStatusKitClientDefaultAnisetteProvider( + status, + serializer, + ); + sse_encode_list_String(to, serializer); + pdeCallFfi( + generalizedFrbRustBinding, + serializer, + funcId: 217, + port: port_, + ); + }, + codec: SseCodec( + decodeSuccessData: + sse_decode_opt_box_autoadd_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerChannelInterestToken, + decodeErrorData: sse_decode_AnyhowException, + ), + constMeta: kCrateApiApiRequestHandlesConstMeta, + argValues: [status, to], + apiImpl: this, + ), + ); } - TaskConstMeta get kCrateApiApiSend2FaSmsConstMeta => const TaskConstMeta( - debugName: "send_2fa_sms", - argNames: ["locked", "account", "phoneId"], - ); + TaskConstMeta get kCrateApiApiRequestHandlesConstMeta => const TaskConstMeta( + debugName: "request_handles", + argNames: ["status", "to"], + ); @override - Future<(CircleClientSessionDefaultAnisetteProvider, LoginState, String?)> - crateApiApiSend2FaToDevices( - {required ArcMutexAppleAccountDefaultAnisetteProvider state, - required ApsConnection conn}) { - return handler.executeNormal(NormalTask( - callFfi: (port_) { - final serializer = SseSerializer(generalizedFrbRustBinding); - sse_encode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcMutexAppleAccountDefaultAnisetteProvider( - state, serializer); - sse_encode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerAPSConnection( - conn, serializer); - pdeCallFfi(generalizedFrbRustBinding, serializer, - funcId: 222, port: port_); - }, - codec: SseCodec( - decodeSuccessData: - sse_decode_record_auto_owned_rust_opaque_flutter_rust_bridgefor_generated_rust_auto_opaque_inner_circle_client_session_default_anisette_provider_login_state_opt_string, - decodeErrorData: sse_decode_AnyhowException, - ), - constMeta: kCrateApiApiSend2FaToDevicesConstMeta, - argValues: [state, conn], - apiImpl: this, - )); + void crateApiApiResetAnisette({required String path}) { + return handler.executeSync( + SyncTask( + callFfi: () { + final serializer = SseSerializer(generalizedFrbRustBinding); + sse_encode_String(path, serializer); + return pdeCallFfi( + generalizedFrbRustBinding, + serializer, + funcId: 218, + )!; + }, + codec: SseCodec( + decodeSuccessData: sse_decode_unit, + decodeErrorData: null, + ), + constMeta: kCrateApiApiResetAnisetteConstMeta, + argValues: [path], + apiImpl: this, + ), + ); } - TaskConstMeta get kCrateApiApiSend2FaToDevicesConstMeta => - const TaskConstMeta( - debugName: "send_2fa_to_devices", - argNames: ["state", "conn"], - ); + TaskConstMeta get kCrateApiApiResetAnisetteConstMeta => + const TaskConstMeta(debugName: "reset_anisette", argNames: ["path"]); @override - (String, SharedPushState) crateApiApiSendDaemon( - {required SharedPushState state, required ApsWatcher watcher}) { - return handler.executeSync(SyncTask( - callFfi: () { - final serializer = SseSerializer(generalizedFrbRustBinding); - sse_encode_box_autoadd_shared_push_state(state, serializer); - sse_encode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerAPSWatcher( - watcher, serializer); - return pdeCallFfi(generalizedFrbRustBinding, serializer, funcId: 223)!; - }, - codec: SseCodec( - decodeSuccessData: sse_decode_record_string_shared_push_state, - decodeErrorData: null, - ), - constMeta: kCrateApiApiSendDaemonConstMeta, - argValues: [state, watcher], - apiImpl: this, - )); + Future crateApiApiResetChannelKeys({ + required ArcStatusKitClientDefaultAnisetteProvider status, + }) { + return handler.executeNormal( + NormalTask( + callFfi: (port_) { + final serializer = SseSerializer(generalizedFrbRustBinding); + sse_encode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcStatusKitClientDefaultAnisetteProvider( + status, + serializer, + ); + pdeCallFfi( + generalizedFrbRustBinding, + serializer, + funcId: 219, + port: port_, + ); + }, + codec: SseCodec( + decodeSuccessData: sse_decode_unit, + decodeErrorData: sse_decode_AnyhowException, + ), + constMeta: kCrateApiApiResetChannelKeysConstMeta, + argValues: [status], + apiImpl: this, + ), + ); } - TaskConstMeta get kCrateApiApiSendDaemonConstMeta => const TaskConstMeta( - debugName: "send_daemon", - argNames: ["state", "watcher"], + TaskConstMeta get kCrateApiApiResetChannelKeysConstMeta => + const TaskConstMeta( + debugName: "reset_channel_keys", + argNames: ["status"], ); @override - Future crateApiApiServiceFromPtr({required String ptr}) { - return handler.executeNormal(NormalTask( - callFfi: (port_) { - final serializer = SseSerializer(generalizedFrbRustBinding); - sse_encode_String(ptr, serializer); - pdeCallFfi(generalizedFrbRustBinding, serializer, - funcId: 224, port: port_); - }, - codec: SseCodec( - decodeSuccessData: sse_decode_opt_box_autoadd_shared_push_state, - decodeErrorData: null, - ), - constMeta: kCrateApiApiServiceFromPtrConstMeta, - argValues: [ptr], - apiImpl: this, - )); + Future crateApiApiResetClique({ + required ArcKeychainClientDefaultAnisetteProvider keychain, + required ArcCloudMessagesClientDefaultAnisetteProvider cloudMessages, + required String devicePassword, + }) { + return handler.executeNormal( + NormalTask( + callFfi: (port_) { + final serializer = SseSerializer(generalizedFrbRustBinding); + sse_encode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcKeychainClientDefaultAnisetteProvider( + keychain, + serializer, + ); + sse_encode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcCloudMessagesClientDefaultAnisetteProvider( + cloudMessages, + serializer, + ); + sse_encode_String(devicePassword, serializer); + pdeCallFfi( + generalizedFrbRustBinding, + serializer, + funcId: 220, + port: port_, + ); + }, + codec: SseCodec( + decodeSuccessData: sse_decode_unit, + decodeErrorData: sse_decode_AnyhowException, + ), + constMeta: kCrateApiApiResetCliqueConstMeta, + argValues: [keychain, cloudMessages, devicePassword], + apiImpl: this, + ), + ); } - TaskConstMeta get kCrateApiApiServiceFromPtrConstMeta => const TaskConstMeta( - debugName: "service_from_ptr", - argNames: ["ptr"], - ); + TaskConstMeta get kCrateApiApiResetCliqueConstMeta => const TaskConstMeta( + debugName: "reset_clique", + argNames: ["keychain", "cloudMessages", "devicePassword"], + ); @override - Future crateApiApiSetIdentity( - {required String statePath, - required JoinedOsConfig config, - required IdsngmIdentity identity}) { - return handler.executeNormal(NormalTask( - callFfi: (port_) { - final serializer = SseSerializer(generalizedFrbRustBinding); - sse_encode_String(statePath, serializer); - sse_encode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerJoinedOSConfig( - config, serializer); - sse_encode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerIDSNGMIdentity( - identity, serializer); - pdeCallFfi(generalizedFrbRustBinding, serializer, - funcId: 225, port: port_); - }, - codec: SseCodec( - decodeSuccessData: sse_decode_unit, - decodeErrorData: null, - ), - constMeta: kCrateApiApiSetIdentityConstMeta, - argValues: [statePath, config, identity], - apiImpl: this, - )); + Future crateApiApiResetState({ + required Sender cancel, + required String path, + required JoinedOsConfig config, + required ApsConnection aps, + ArcMutexAppleAccountDefaultAnisetteProvider? account, + required bool resetHw, + required bool logout, + }) { + return handler.executeNormal( + NormalTask( + callFfi: (port_) { + final serializer = SseSerializer(generalizedFrbRustBinding); + sse_encode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerSender( + cancel, + serializer, + ); + sse_encode_String(path, serializer); + sse_encode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerJoinedOSConfig( + config, + serializer, + ); + sse_encode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerAPSConnection( + aps, + serializer, + ); + sse_encode_opt_box_autoadd_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcMutexAppleAccountDefaultAnisetteProvider( + account, + serializer, + ); + sse_encode_bool(resetHw, serializer); + sse_encode_bool(logout, serializer); + pdeCallFfi( + generalizedFrbRustBinding, + serializer, + funcId: 221, + port: port_, + ); + }, + codec: SseCodec( + decodeSuccessData: sse_decode_unit, + decodeErrorData: sse_decode_AnyhowException, + ), + constMeta: kCrateApiApiResetStateConstMeta, + argValues: [cancel, path, config, aps, account, resetHw, logout], + apiImpl: this, + ), + ); } - TaskConstMeta get kCrateApiApiSetIdentityConstMeta => const TaskConstMeta( - debugName: "set_identity", - argNames: ["statePath", "config", "identity"], - ); + TaskConstMeta get kCrateApiApiResetStateConstMeta => const TaskConstMeta( + debugName: "reset_state", + argNames: [ + "cancel", + "path", + "config", + "aps", + "account", + "resetHw", + "logout", + ], + ); @override - Future crateApiApiSetProfile( - {required ArcProfilesClientDefaultAnisetteProvider profiles, - required IMessageNicknameRecord record, - ShareProfileMessage? existing}) { - return handler.executeNormal(NormalTask( - callFfi: (port_) { - final serializer = SseSerializer(generalizedFrbRustBinding); - sse_encode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcProfilesClientDefaultAnisetteProvider( - profiles, serializer); - sse_encode_box_autoadd_i_message_nickname_record(record, serializer); - sse_encode_opt_box_autoadd_share_profile_message(existing, serializer); - pdeCallFfi(generalizedFrbRustBinding, serializer, - funcId: 226, port: port_); - }, - codec: SseCodec( - decodeSuccessData: sse_decode_share_profile_message, - decodeErrorData: sse_decode_AnyhowException, - ), - constMeta: kCrateApiApiSetProfileConstMeta, - argValues: [profiles, record, existing], - apiImpl: this, - )); + Future + crateApiApiRestoreAccount({ + required String path, + required ArcAnisetteClientDefaultAnisetteProvider anisette, + required JoinedOsConfig config, + required ApsConnection conn, + }) { + return handler.executeNormal( + NormalTask( + callFfi: (port_) { + final serializer = SseSerializer(generalizedFrbRustBinding); + sse_encode_String(path, serializer); + sse_encode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcAnisetteClientDefaultAnisetteProvider( + anisette, + serializer, + ); + sse_encode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerJoinedOSConfig( + config, + serializer, + ); + sse_encode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerAPSConnection( + conn, + serializer, + ); + pdeCallFfi( + generalizedFrbRustBinding, + serializer, + funcId: 222, + port: port_, + ); + }, + codec: SseCodec( + decodeSuccessData: + sse_decode_opt_box_autoadd_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcMutexAppleAccountDefaultAnisetteProvider, + decodeErrorData: null, + ), + constMeta: kCrateApiApiRestoreAccountConstMeta, + argValues: [path, anisette, config, conn], + apiImpl: this, + ), + ); } - TaskConstMeta get kCrateApiApiSetProfileConstMeta => const TaskConstMeta( - debugName: "set_profile", - argNames: ["profiles", "record", "existing"], - ); + TaskConstMeta get kCrateApiApiRestoreAccountConstMeta => const TaskConstMeta( + debugName: "restore_account", + argNames: ["path", "anisette", "config", "conn"], + ); @override - Future crateApiApiSetStatus( - {required ArcStatusKitClientDefaultAnisetteProvider status, - String? newStatus}) { - return handler.executeNormal(NormalTask( - callFfi: (port_) { - final serializer = SseSerializer(generalizedFrbRustBinding); - sse_encode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcStatusKitClientDefaultAnisetteProvider( - status, serializer); - sse_encode_opt_String(newStatus, serializer); - pdeCallFfi(generalizedFrbRustBinding, serializer, - funcId: 227, port: port_); - }, - codec: SseCodec( - decodeSuccessData: sse_decode_unit, - decodeErrorData: sse_decode_AnyhowException, - ), - constMeta: kCrateApiApiSetStatusConstMeta, - argValues: [status, newStatus], - apiImpl: this, - )); + Attachment crateApiApiRestoreAttachment({required String data}) { + return handler.executeSync( + SyncTask( + callFfi: () { + final serializer = SseSerializer(generalizedFrbRustBinding); + sse_encode_String(data, serializer); + return pdeCallFfi( + generalizedFrbRustBinding, + serializer, + funcId: 223, + )!; + }, + codec: SseCodec( + decodeSuccessData: sse_decode_attachment, + decodeErrorData: null, + ), + constMeta: kCrateApiApiRestoreAttachmentConstMeta, + argValues: [data], + apiImpl: this, + ), + ); } - TaskConstMeta get kCrateApiApiSetStatusConstMeta => const TaskConstMeta( - debugName: "set_status", - argNames: ["status", "newStatus"], - ); + TaskConstMeta get kCrateApiApiRestoreAttachmentConstMeta => + const TaskConstMeta(debugName: "restore_attachment", argNames: ["data"]); @override - Future<(ApsConnection, PushError?)> crateApiApiSetupPush( - {required JoinedOsConfig config, - required IdsngmIdentity identity, - ApsState? state, - required String statePath}) { - return handler.executeNormal(NormalTask( - callFfi: (port_) { - final serializer = SseSerializer(generalizedFrbRustBinding); - sse_encode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerJoinedOSConfig( - config, serializer); - sse_encode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerIDSNGMIdentity( - identity, serializer); - sse_encode_opt_box_autoadd_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerAPSState( - state, serializer); - sse_encode_String(statePath, serializer); - pdeCallFfi(generalizedFrbRustBinding, serializer, - funcId: 228, port: port_); - }, - codec: SseCodec( - decodeSuccessData: - sse_decode_record_auto_owned_rust_opaque_flutter_rust_bridgefor_generated_rust_auto_opaque_inner_aps_connection_opt_box_autoadd_auto_owned_rust_opaque_flutter_rust_bridgefor_generated_rust_auto_opaque_inner_push_error, - decodeErrorData: null, - ), - constMeta: kCrateApiApiSetupPushConstMeta, - argValues: [config, identity, state, statePath], - apiImpl: this, - )); + CloudChat crateApiApiRestoreCloudChat({required List data}) { + return handler.executeSync( + SyncTask( + callFfi: () { + final serializer = SseSerializer(generalizedFrbRustBinding); + sse_encode_list_prim_u_8_loose(data, serializer); + return pdeCallFfi( + generalizedFrbRustBinding, + serializer, + funcId: 224, + )!; + }, + codec: SseCodec( + decodeSuccessData: sse_decode_cloud_chat, + decodeErrorData: null, + ), + constMeta: kCrateApiApiRestoreCloudChatConstMeta, + argValues: [data], + apiImpl: this, + ), + ); } - TaskConstMeta get kCrateApiApiSetupPushConstMeta => const TaskConstMeta( - debugName: "setup_push", - argNames: ["config", "identity", "state", "statePath"], - ); + TaskConstMeta get kCrateApiApiRestoreCloudChatConstMeta => + const TaskConstMeta(debugName: "restore_cloud_chat", argNames: ["data"]); @override - Future<(SharedPushState, ApsWatcher)?> crateApiApiSharedPushStateRestore( - {required String path}) { - return handler.executeNormal(NormalTask( - callFfi: (port_) { - final serializer = SseSerializer(generalizedFrbRustBinding); - sse_encode_String(path, serializer); - pdeCallFfi(generalizedFrbRustBinding, serializer, - funcId: 229, port: port_); - }, - codec: SseCodec( - decodeSuccessData: - sse_decode_opt_box_autoadd_record_shared_push_state_auto_owned_rust_opaque_flutter_rust_bridgefor_generated_rust_auto_opaque_inner_aps_watcher, - decodeErrorData: null, - ), - constMeta: kCrateApiApiSharedPushStateRestoreConstMeta, - argValues: [path], - apiImpl: this, - )); + Future crateApiApiRestoreUser({required String user}) { + return handler.executeNormal( + NormalTask( + callFfi: (port_) { + final serializer = SseSerializer(generalizedFrbRustBinding); + sse_encode_String(user, serializer); + pdeCallFfi( + generalizedFrbRustBinding, + serializer, + funcId: 225, + port: port_, + ); + }, + codec: SseCodec( + decodeSuccessData: + sse_decode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerIDSUser, + decodeErrorData: sse_decode_AnyhowException, + ), + constMeta: kCrateApiApiRestoreUserConstMeta, + argValues: [user], + apiImpl: this, + ), + ); } - TaskConstMeta get kCrateApiApiSharedPushStateRestoreConstMeta => - const TaskConstMeta( - debugName: "shared_push_state_restore", - argNames: ["path"], - ); + TaskConstMeta get kCrateApiApiRestoreUserConstMeta => + const TaskConstMeta(debugName: "restore_user", argNames: ["user"]); @override - Future> crateApiApiSubscribe( - {required SyncManagerDefaultAnisetteProviderMyFilePackager lock, - required String guid}) { - return handler.executeNormal(NormalTask( - callFfi: (port_) { - final serializer = SseSerializer(generalizedFrbRustBinding); - sse_encode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerSyncManagerDefaultAnisetteProviderMyFilePackager( - lock, serializer); - sse_encode_String(guid, serializer); - pdeCallFfi(generalizedFrbRustBinding, serializer, - funcId: 230, port: port_); - }, - codec: SseCodec( - decodeSuccessData: sse_decode_list_shared_album, - decodeErrorData: sse_decode_AnyhowException, - ), - constMeta: kCrateApiApiSubscribeConstMeta, - argValues: [lock, guid], - apiImpl: this, - )); + List? crateApiApiRestoreUsers({required String path}) { + return handler.executeSync( + SyncTask( + callFfi: () { + final serializer = SseSerializer(generalizedFrbRustBinding); + sse_encode_String(path, serializer); + return pdeCallFfi( + generalizedFrbRustBinding, + serializer, + funcId: 226, + )!; + }, + codec: SseCodec( + decodeSuccessData: + sse_decode_opt_list_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerIDSUser, + decodeErrorData: null, + ), + constMeta: kCrateApiApiRestoreUsersConstMeta, + argValues: [path], + apiImpl: this, + ), + ); } - TaskConstMeta get kCrateApiApiSubscribeConstMeta => const TaskConstMeta( - debugName: "subscribe", - argNames: ["lock", "guid"], - ); + TaskConstMeta get kCrateApiApiRestoreUsersConstMeta => + const TaskConstMeta(debugName: "restore_users", argNames: ["path"]); @override - ReceiverApsMessage crateApiApiSubscribeConn({required ApsConnection conn}) { - return handler.executeSync(SyncTask( - callFfi: () { - final serializer = SseSerializer(generalizedFrbRustBinding); - sse_encode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerAPSConnection( - conn, serializer); - return pdeCallFfi(generalizedFrbRustBinding, serializer, funcId: 231)!; - }, - codec: SseCodec( - decodeSuccessData: - sse_decode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerReceiverAPSMessage, - decodeErrorData: null, - ), - constMeta: kCrateApiApiSubscribeConnConstMeta, - argValues: [conn], - apiImpl: this, - )); + Future crateApiApiSaveAttachment({required Attachment att}) { + return handler.executeNormal( + NormalTask( + callFfi: (port_) { + final serializer = SseSerializer(generalizedFrbRustBinding); + sse_encode_box_autoadd_attachment(att, serializer); + pdeCallFfi( + generalizedFrbRustBinding, + serializer, + funcId: 227, + port: port_, + ); + }, + codec: SseCodec( + decodeSuccessData: sse_decode_String, + decodeErrorData: null, + ), + constMeta: kCrateApiApiSaveAttachmentConstMeta, + argValues: [att], + apiImpl: this, + ), + ); } - TaskConstMeta get kCrateApiApiSubscribeConnConstMeta => const TaskConstMeta( - debugName: "subscribe_conn", - argNames: ["conn"], - ); + TaskConstMeta get kCrateApiApiSaveAttachmentConstMeta => + const TaskConstMeta(debugName: "save_attachment", argNames: ["att"]); @override - Future> crateApiApiSubscribeToken( - {required SyncManagerDefaultAnisetteProviderMyFilePackager lock, - required String token}) { - return handler.executeNormal(NormalTask( - callFfi: (port_) { - final serializer = SseSerializer(generalizedFrbRustBinding); - sse_encode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerSyncManagerDefaultAnisetteProviderMyFilePackager( - lock, serializer); - sse_encode_String(token, serializer); - pdeCallFfi(generalizedFrbRustBinding, serializer, - funcId: 232, port: port_); - }, - codec: SseCodec( - decodeSuccessData: sse_decode_list_shared_album, - decodeErrorData: sse_decode_AnyhowException, - ), - constMeta: kCrateApiApiSubscribeTokenConstMeta, - argValues: [lock, token], - apiImpl: this, - )); + Future> crateApiApiSaveAttachments({ + required ArcCloudMessagesClientDefaultAnisetteProvider cloudMessagesClient, + required Map attachments, + }) { + return handler.executeNormal( + NormalTask( + callFfi: (port_) { + final serializer = SseSerializer(generalizedFrbRustBinding); + sse_encode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcCloudMessagesClientDefaultAnisetteProvider( + cloudMessagesClient, + serializer, + ); + sse_encode_Map_String_cloud_attachment(attachments, serializer); + pdeCallFfi( + generalizedFrbRustBinding, + serializer, + funcId: 228, + port: port_, + ); + }, + codec: SseCodec( + decodeSuccessData: sse_decode_Map_String_bool, + decodeErrorData: sse_decode_AnyhowException, + ), + constMeta: kCrateApiApiSaveAttachmentsConstMeta, + argValues: [cloudMessagesClient, attachments], + apiImpl: this, + ), + ); } - TaskConstMeta get kCrateApiApiSubscribeTokenConstMeta => const TaskConstMeta( - debugName: "subscribe_token", - argNames: ["lock", "token"], - ); + TaskConstMeta get kCrateApiApiSaveAttachmentsConstMeta => const TaskConstMeta( + debugName: "save_attachments", + argNames: ["cloudMessagesClient", "attachments"], + ); @override - Future<(Uint8List, Map, int)> - crateApiApiSyncAttachments( - {required ArcCloudMessagesClientDefaultAnisetteProvider - cloudMessagesClient, - Uint8List? continuationToken}) { - return handler.executeNormal(NormalTask( - callFfi: (port_) { - final serializer = SseSerializer(generalizedFrbRustBinding); - sse_encode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcCloudMessagesClientDefaultAnisetteProvider( - cloudMessagesClient, serializer); - sse_encode_opt_list_prim_u_8_strict(continuationToken, serializer); - pdeCallFfi(generalizedFrbRustBinding, serializer, - funcId: 233, port: port_); - }, - codec: SseCodec( - decodeSuccessData: - sse_decode_record_list_prim_u_8_strict_map_string_opt_box_autoadd_cloud_attachment_i_32, - decodeErrorData: sse_decode_AnyhowException, - ), - constMeta: kCrateApiApiSyncAttachmentsConstMeta, - argValues: [cloudMessagesClient, continuationToken], - apiImpl: this, - )); + Future> crateApiApiSaveChats({ + required ArcCloudMessagesClientDefaultAnisetteProvider cloudMessagesClient, + required Map chats, + }) { + return handler.executeNormal( + NormalTask( + callFfi: (port_) { + final serializer = SseSerializer(generalizedFrbRustBinding); + sse_encode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcCloudMessagesClientDefaultAnisetteProvider( + cloudMessagesClient, + serializer, + ); + sse_encode_Map_String_cloud_chat(chats, serializer); + pdeCallFfi( + generalizedFrbRustBinding, + serializer, + funcId: 229, + port: port_, + ); + }, + codec: SseCodec( + decodeSuccessData: sse_decode_Map_String_bool, + decodeErrorData: sse_decode_AnyhowException, + ), + constMeta: kCrateApiApiSaveChatsConstMeta, + argValues: [cloudMessagesClient, chats], + apiImpl: this, + ), + ); } - TaskConstMeta get kCrateApiApiSyncAttachmentsConstMeta => const TaskConstMeta( - debugName: "sync_attachments", - argNames: ["cloudMessagesClient", "continuationToken"], - ); + TaskConstMeta get kCrateApiApiSaveChatsConstMeta => const TaskConstMeta( + debugName: "save_chats", + argNames: ["cloudMessagesClient", "chats"], + ); @override - Future<(Uint8List, Map, int)> crateApiApiSyncChats( - {required ArcCloudMessagesClientDefaultAnisetteProvider - cloudMessagesClient, - Uint8List? continuationToken}) { - return handler.executeNormal(NormalTask( - callFfi: (port_) { - final serializer = SseSerializer(generalizedFrbRustBinding); - sse_encode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcCloudMessagesClientDefaultAnisetteProvider( - cloudMessagesClient, serializer); - sse_encode_opt_list_prim_u_8_strict(continuationToken, serializer); - pdeCallFfi(generalizedFrbRustBinding, serializer, - funcId: 234, port: port_); - }, - codec: SseCodec( - decodeSuccessData: - sse_decode_record_list_prim_u_8_strict_map_string_opt_box_autoadd_cloud_chat_i_32, - decodeErrorData: sse_decode_AnyhowException, - ), - constMeta: kCrateApiApiSyncChatsConstMeta, - argValues: [cloudMessagesClient, continuationToken], - apiImpl: this, - )); + Uint8List crateApiApiSaveCloudChat({required CloudChat value}) { + return handler.executeSync( + SyncTask( + callFfi: () { + final serializer = SseSerializer(generalizedFrbRustBinding); + sse_encode_box_autoadd_cloud_chat(value, serializer); + return pdeCallFfi( + generalizedFrbRustBinding, + serializer, + funcId: 230, + )!; + }, + codec: SseCodec( + decodeSuccessData: sse_decode_list_prim_u_8_strict, + decodeErrorData: null, + ), + constMeta: kCrateApiApiSaveCloudChatConstMeta, + argValues: [value], + apiImpl: this, + ), + ); } - TaskConstMeta get kCrateApiApiSyncChatsConstMeta => const TaskConstMeta( - debugName: "sync_chats", - argNames: ["cloudMessagesClient", "continuationToken"], - ); + TaskConstMeta get kCrateApiApiSaveCloudChatConstMeta => + const TaskConstMeta(debugName: "save_cloud_chat", argNames: ["value"]); @override - Future<(Uint8List, Map, int)> crateApiApiSyncMessages( - {required ArcCloudMessagesClientDefaultAnisetteProvider - cloudMessagesClient, - Uint8List? continuationToken}) { - return handler.executeNormal(NormalTask( - callFfi: (port_) { - final serializer = SseSerializer(generalizedFrbRustBinding); - sse_encode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcCloudMessagesClientDefaultAnisetteProvider( - cloudMessagesClient, serializer); - sse_encode_opt_list_prim_u_8_strict(continuationToken, serializer); - pdeCallFfi(generalizedFrbRustBinding, serializer, - funcId: 235, port: port_); - }, - codec: SseCodec( - decodeSuccessData: - sse_decode_record_list_prim_u_8_strict_map_string_opt_box_autoadd_cloud_message_i_32, - decodeErrorData: sse_decode_AnyhowException, - ), - constMeta: kCrateApiApiSyncMessagesConstMeta, - argValues: [cloudMessagesClient, continuationToken], - apiImpl: this, - )); + Future> crateApiApiSaveMessages({ + required ArcCloudMessagesClientDefaultAnisetteProvider cloudMessagesClient, + required Map messages, + }) { + return handler.executeNormal( + NormalTask( + callFfi: (port_) { + final serializer = SseSerializer(generalizedFrbRustBinding); + sse_encode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcCloudMessagesClientDefaultAnisetteProvider( + cloudMessagesClient, + serializer, + ); + sse_encode_Map_String_cloud_message(messages, serializer); + pdeCallFfi( + generalizedFrbRustBinding, + serializer, + funcId: 231, + port: port_, + ); + }, + codec: SseCodec( + decodeSuccessData: sse_decode_Map_String_bool, + decodeErrorData: sse_decode_AnyhowException, + ), + constMeta: kCrateApiApiSaveMessagesConstMeta, + argValues: [cloudMessagesClient, messages], + apiImpl: this, + ), + ); } - TaskConstMeta get kCrateApiApiSyncMessagesConstMeta => const TaskConstMeta( - debugName: "sync_messages", - argNames: ["cloudMessagesClient", "continuationToken"], - ); + TaskConstMeta get kCrateApiApiSaveMessagesConstMeta => const TaskConstMeta( + debugName: "save_messages", + argNames: ["cloudMessagesClient", "messages"], + ); @override - Future crateApiApiSyncNow( - {required SyncManagerDefaultAnisetteProviderMyFilePackager lock}) { - return handler.executeNormal(NormalTask( - callFfi: (port_) { - final serializer = SseSerializer(generalizedFrbRustBinding); - sse_encode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerSyncManagerDefaultAnisetteProviderMyFilePackager( - lock, serializer); - pdeCallFfi(generalizedFrbRustBinding, serializer, - funcId: 236, port: port_); - }, - codec: SseCodec( - decodeSuccessData: sse_decode_unit, - decodeErrorData: sse_decode_AnyhowException, - ), - constMeta: kCrateApiApiSyncNowConstMeta, - argValues: [lock], - apiImpl: this, - )); + Future crateApiApiSavePasskey({ + required ArcPasswordManagerDefaultAnisetteProvider passwords, + required String id, + required Passkey entry, + String? group, + }) { + return handler.executeNormal( + NormalTask( + callFfi: (port_) { + final serializer = SseSerializer(generalizedFrbRustBinding); + sse_encode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcPasswordManagerDefaultAnisetteProvider( + passwords, + serializer, + ); + sse_encode_String(id, serializer); + sse_encode_box_autoadd_passkey(entry, serializer); + sse_encode_opt_String(group, serializer); + pdeCallFfi( + generalizedFrbRustBinding, + serializer, + funcId: 232, + port: port_, + ); + }, + codec: SseCodec( + decodeSuccessData: sse_decode_unit, + decodeErrorData: sse_decode_AnyhowException, + ), + constMeta: kCrateApiApiSavePasskeyConstMeta, + argValues: [passwords, id, entry, group], + apiImpl: this, + ), + ); } - TaskConstMeta get kCrateApiApiSyncNowConstMeta => const TaskConstMeta( - debugName: "sync_now", - argNames: ["lock"], - ); + TaskConstMeta get kCrateApiApiSavePasskeyConstMeta => const TaskConstMeta( + debugName: "save_passkey", + argNames: ["passwords", "id", "entry", "group"], + ); @override - Future crateApiApiSyncPasswords( - {required ArcPasswordManagerDefaultAnisetteProvider passwords, - required ApsConnection conn}) { - return handler.executeNormal(NormalTask( - callFfi: (port_) { - final serializer = SseSerializer(generalizedFrbRustBinding); - sse_encode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcPasswordManagerDefaultAnisetteProvider( - passwords, serializer); - sse_encode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerAPSConnection( - conn, serializer); - pdeCallFfi(generalizedFrbRustBinding, serializer, - funcId: 237, port: port_); - }, - codec: SseCodec( - decodeSuccessData: sse_decode_unit, - decodeErrorData: sse_decode_AnyhowException, - ), - constMeta: kCrateApiApiSyncPasswordsConstMeta, - argValues: [passwords, conn], - apiImpl: this, - )); + Future crateApiApiSavePassword({ + required ArcPasswordManagerDefaultAnisetteProvider passwords, + required String id, + required PasswordRawEntry entry, + String? group, + }) { + return handler.executeNormal( + NormalTask( + callFfi: (port_) { + final serializer = SseSerializer(generalizedFrbRustBinding); + sse_encode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcPasswordManagerDefaultAnisetteProvider( + passwords, + serializer, + ); + sse_encode_String(id, serializer); + sse_encode_box_autoadd_password_raw_entry(entry, serializer); + sse_encode_opt_String(group, serializer); + pdeCallFfi( + generalizedFrbRustBinding, + serializer, + funcId: 233, + port: port_, + ); + }, + codec: SseCodec( + decodeSuccessData: sse_decode_unit, + decodeErrorData: sse_decode_AnyhowException, + ), + constMeta: kCrateApiApiSavePasswordConstMeta, + argValues: [passwords, id, entry, group], + apiImpl: this, + ), + ); } - TaskConstMeta get kCrateApiApiSyncPasswordsConstMeta => const TaskConstMeta( - debugName: "sync_passwords", - argNames: ["passwords", "conn"], - ); + TaskConstMeta get kCrateApiApiSavePasswordConstMeta => const TaskConstMeta( + debugName: "save_password", + argNames: ["passwords", "id", "entry", "group"], + ); @override - Future crateApiApiSyncWifiPasswords( - {required ArcPasswordManagerDefaultAnisetteProvider manager, - required bool userApprove}) { - return handler.executeNormal(NormalTask( - callFfi: (port_) { - final serializer = SseSerializer(generalizedFrbRustBinding); - sse_encode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcPasswordManagerDefaultAnisetteProvider( - manager, serializer); - sse_encode_bool(userApprove, serializer); - pdeCallFfi(generalizedFrbRustBinding, serializer, - funcId: 238, port: port_); - }, - codec: SseCodec( - decodeSuccessData: sse_decode_unit, - decodeErrorData: null, - ), - constMeta: kCrateApiApiSyncWifiPasswordsConstMeta, - argValues: [manager, userApprove], - apiImpl: this, - )); + Future crateApiApiSavePasswordMeta({ + required ArcPasswordManagerDefaultAnisetteProvider passwords, + required String id, + required PasswordManagerMeta entry, + String? group, + }) { + return handler.executeNormal( + NormalTask( + callFfi: (port_) { + final serializer = SseSerializer(generalizedFrbRustBinding); + sse_encode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcPasswordManagerDefaultAnisetteProvider( + passwords, + serializer, + ); + sse_encode_String(id, serializer); + sse_encode_box_autoadd_password_manager_meta(entry, serializer); + sse_encode_opt_String(group, serializer); + pdeCallFfi( + generalizedFrbRustBinding, + serializer, + funcId: 234, + port: port_, + ); + }, + codec: SseCodec( + decodeSuccessData: sse_decode_unit, + decodeErrorData: sse_decode_AnyhowException, + ), + constMeta: kCrateApiApiSavePasswordMetaConstMeta, + argValues: [passwords, id, entry, group], + apiImpl: this, + ), + ); } - TaskConstMeta get kCrateApiApiSyncWifiPasswordsConstMeta => + TaskConstMeta get kCrateApiApiSavePasswordMetaConstMeta => const TaskConstMeta( - debugName: "sync_wifi_passwords", - argNames: ["manager", "userApprove"], + debugName: "save_password_meta", + argNames: ["passwords", "id", "entry", "group"], ); @override - int crateApiApiSystemtimeToMillis({required SystemTime time}) { - return handler.executeSync(SyncTask( - callFfi: () { - final serializer = SseSerializer(generalizedFrbRustBinding); - sse_encode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerSystemTime( - time, serializer); - return pdeCallFfi(generalizedFrbRustBinding, serializer, funcId: 239)!; - }, - codec: SseCodec( - decodeSuccessData: sse_decode_CastedPrimitive_u_64, - decodeErrorData: null, - ), - constMeta: kCrateApiApiSystemtimeToMillisConstMeta, - argValues: [time], - apiImpl: this, - )); + Future crateApiApiSaveUser({required IdsUser user}) { + return handler.executeNormal( + NormalTask( + callFfi: (port_) { + final serializer = SseSerializer(generalizedFrbRustBinding); + sse_encode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerIDSUser( + user, + serializer, + ); + pdeCallFfi( + generalizedFrbRustBinding, + serializer, + funcId: 235, + port: port_, + ); + }, + codec: SseCodec( + decodeSuccessData: sse_decode_String, + decodeErrorData: sse_decode_AnyhowException, + ), + constMeta: kCrateApiApiSaveUserConstMeta, + argValues: [user], + apiImpl: this, + ), + ); } - TaskConstMeta get kCrateApiApiSystemtimeToMillisConstMeta => - const TaskConstMeta( - debugName: "systemtime_to_millis", - argNames: ["time"], - ); + TaskConstMeta get kCrateApiApiSaveUserConstMeta => + const TaskConstMeta(debugName: "save_user", argNames: ["user"]); @override - Future crateApiApiTeardown2Fa( - {required ArcMutexAppleAccountDefaultAnisetteProvider account, - required String action, - required String txnid}) { - return handler.executeNormal(NormalTask( - callFfi: (port_) { - final serializer = SseSerializer(generalizedFrbRustBinding); - sse_encode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcMutexAppleAccountDefaultAnisetteProvider( - account, serializer); - sse_encode_String(action, serializer); - sse_encode_String(txnid, serializer); - pdeCallFfi(generalizedFrbRustBinding, serializer, - funcId: 240, port: port_); - }, - codec: SseCodec( - decodeSuccessData: sse_decode_unit, - decodeErrorData: sse_decode_AnyhowException, - ), - constMeta: kCrateApiApiTeardown2FaConstMeta, - argValues: [account, action, txnid], - apiImpl: this, - )); + void crateApiApiSaveUsers({ + required List users, + required String path, + }) { + return handler.executeSync( + SyncTask( + callFfi: () { + final serializer = SseSerializer(generalizedFrbRustBinding); + sse_encode_list_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerIDSUser( + users, + serializer, + ); + sse_encode_String(path, serializer); + return pdeCallFfi( + generalizedFrbRustBinding, + serializer, + funcId: 236, + )!; + }, + codec: SseCodec( + decodeSuccessData: sse_decode_unit, + decodeErrorData: null, + ), + constMeta: kCrateApiApiSaveUsersConstMeta, + argValues: [users, path], + apiImpl: this, + ), + ); } - TaskConstMeta get kCrateApiApiTeardown2FaConstMeta => const TaskConstMeta( - debugName: "teardown_2fa", - argNames: ["account", "action", "txnid"], - ); + TaskConstMeta get kCrateApiApiSaveUsersConstMeta => + const TaskConstMeta(debugName: "save_users", argNames: ["users", "path"]); @override - Future crateApiApiTranscriptPosterSave( - {required SimplifiedTranscriptPoster poster}) { - return handler.executeNormal(NormalTask( - callFfi: (port_) { - final serializer = SseSerializer(generalizedFrbRustBinding); - sse_encode_box_autoadd_simplified_transcript_poster(poster, serializer); - pdeCallFfi(generalizedFrbRustBinding, serializer, - funcId: 241, port: port_); - }, - codec: SseCodec( - decodeSuccessData: sse_decode_list_prim_u_8_strict, - decodeErrorData: sse_decode_AnyhowException, - ), - constMeta: kCrateApiApiTranscriptPosterSaveConstMeta, - argValues: [poster], - apiImpl: this, - )); + Future crateApiApiSaveWifiPassword({ + required ArcPasswordManagerDefaultAnisetteProvider passwords, + required String id, + required WifiPassword entry, + String? group, + }) { + return handler.executeNormal( + NormalTask( + callFfi: (port_) { + final serializer = SseSerializer(generalizedFrbRustBinding); + sse_encode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcPasswordManagerDefaultAnisetteProvider( + passwords, + serializer, + ); + sse_encode_String(id, serializer); + sse_encode_box_autoadd_wifi_password(entry, serializer); + sse_encode_opt_String(group, serializer); + pdeCallFfi( + generalizedFrbRustBinding, + serializer, + funcId: 237, + port: port_, + ); + }, + codec: SseCodec( + decodeSuccessData: sse_decode_unit, + decodeErrorData: sse_decode_AnyhowException, + ), + constMeta: kCrateApiApiSaveWifiPasswordConstMeta, + argValues: [passwords, id, entry, group], + apiImpl: this, + ), + ); } - TaskConstMeta get kCrateApiApiTranscriptPosterSaveConstMeta => + TaskConstMeta get kCrateApiApiSaveWifiPasswordConstMeta => const TaskConstMeta( - debugName: "transcript_poster_save", - argNames: ["poster"], + debugName: "save_wifi_password", + argNames: ["passwords", "id", "entry", "group"], ); @override - Future<(ArcMutexAppleAccountDefaultAnisetteProvider, LoginState)> - crateApiApiTryAuth( - {required String path, - required JoinedOsConfig conf, - required ApsConnection conn, - required ArcAnisetteClientDefaultAnisetteProvider anisette, - (String, String)? creds}) { - return handler.executeNormal(NormalTask( - callFfi: (port_) { - final serializer = SseSerializer(generalizedFrbRustBinding); - sse_encode_String(path, serializer); - sse_encode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerJoinedOSConfig( - conf, serializer); - sse_encode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerAPSConnection( - conn, serializer); - sse_encode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcAnisetteClientDefaultAnisetteProvider( - anisette, serializer); - sse_encode_opt_box_autoadd_record_string_string(creds, serializer); - pdeCallFfi(generalizedFrbRustBinding, serializer, - funcId: 242, port: port_); - }, - codec: SseCodec( - decodeSuccessData: - sse_decode_record_auto_owned_rust_opaque_flutter_rust_bridgefor_generated_rust_auto_opaque_inner_arc_mutex_apple_account_default_anisette_provider_login_state, - decodeErrorData: sse_decode_AnyhowException, - ), - constMeta: kCrateApiApiTryAuthConstMeta, - argValues: [path, conf, conn, anisette, creds], - apiImpl: this, - )); + Future> crateApiApiSelectBackgroundFriend({ + required ArcFindMyClientDefaultAnisetteProvider fmfd, + String? friend, + }) { + return handler.executeNormal( + NormalTask( + callFfi: (port_) { + final serializer = SseSerializer(generalizedFrbRustBinding); + sse_encode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcFindMyClientDefaultAnisetteProvider( + fmfd, + serializer, + ); + sse_encode_opt_String(friend, serializer); + pdeCallFfi( + generalizedFrbRustBinding, + serializer, + funcId: 238, + port: port_, + ); + }, + codec: SseCodec( + decodeSuccessData: sse_decode_list_follow, + decodeErrorData: sse_decode_AnyhowException, + ), + constMeta: kCrateApiApiSelectBackgroundFriendConstMeta, + argValues: [fmfd, friend], + apiImpl: this, + ), + ); } - TaskConstMeta get kCrateApiApiTryAuthConstMeta => const TaskConstMeta( - debugName: "try_auth", - argNames: ["path", "conf", "conn", "anisette", "creds"], + TaskConstMeta get kCrateApiApiSelectBackgroundFriendConstMeta => + const TaskConstMeta( + debugName: "select_background_friend", + argNames: ["fmfd", "friend"], ); @override - Future crateApiApiTryIcloudLogin( - {required String path, - required JoinedOsConfig conf, - required ArcMutexAppleAccountDefaultAnisetteProvider account}) { - return handler.executeNormal(NormalTask( - callFfi: (port_) { - final serializer = SseSerializer(generalizedFrbRustBinding); - sse_encode_String(path, serializer); - sse_encode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerJoinedOSConfig( - conf, serializer); - sse_encode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcMutexAppleAccountDefaultAnisetteProvider( - account, serializer); - pdeCallFfi(generalizedFrbRustBinding, serializer, - funcId: 243, port: port_); - }, - codec: SseCodec( - decodeSuccessData: - sse_decode_opt_box_autoadd_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerIDSUser, - decodeErrorData: sse_decode_AnyhowException, - ), - constMeta: kCrateApiApiTryIcloudLoginConstMeta, - argValues: [path, conf, account], - apiImpl: this, - )); + Future> crateApiApiSelectFriend({ + required JoinedOsConfig config, + required FindMyFriendsClientDefaultAnisetteProvider client, + String? friend, + }) { + return handler.executeNormal( + NormalTask( + callFfi: (port_) { + final serializer = SseSerializer(generalizedFrbRustBinding); + sse_encode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerJoinedOSConfig( + config, + serializer, + ); + sse_encode_Auto_RefMut_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerFindMyFriendsClientDefaultAnisetteProvider( + client, + serializer, + ); + sse_encode_opt_String(friend, serializer); + pdeCallFfi( + generalizedFrbRustBinding, + serializer, + funcId: 239, + port: port_, + ); + }, + codec: SseCodec( + decodeSuccessData: sse_decode_list_follow, + decodeErrorData: sse_decode_AnyhowException, + ), + constMeta: kCrateApiApiSelectFriendConstMeta, + argValues: [config, client, friend], + apiImpl: this, + ), + ); } - TaskConstMeta get kCrateApiApiTryIcloudLoginConstMeta => const TaskConstMeta( - debugName: "try_icloud_login", - argNames: ["path", "conf", "account"], - ); + TaskConstMeta get kCrateApiApiSelectFriendConstMeta => const TaskConstMeta( + debugName: "select_friend", + argNames: ["config", "client", "friend"], + ); @override - Future> crateApiApiUnsubscribe( - {required SyncManagerDefaultAnisetteProviderMyFilePackager lock, - required String guid}) { - return handler.executeNormal(NormalTask( - callFfi: (port_) { - final serializer = SseSerializer(generalizedFrbRustBinding); - sse_encode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerSyncManagerDefaultAnisetteProviderMyFilePackager( - lock, serializer); - sse_encode_String(guid, serializer); - pdeCallFfi(generalizedFrbRustBinding, serializer, - funcId: 244, port: port_); - }, - codec: SseCodec( - decodeSuccessData: sse_decode_list_shared_album, - decodeErrorData: sse_decode_AnyhowException, - ), - constMeta: kCrateApiApiUnsubscribeConstMeta, - argValues: [lock, guid], - apiImpl: this, - )); + Future crateApiApiSend({ + required ArcImClient state, + required ArcSenderPushMessage local, + required MessageInst msg, + }) { + return handler.executeNormal( + NormalTask( + callFfi: (port_) { + final serializer = SseSerializer(generalizedFrbRustBinding); + sse_encode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcIMClient( + state, + serializer, + ); + sse_encode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcSenderPushMessage( + local, + serializer, + ); + sse_encode_box_autoadd_message_inst(msg, serializer); + pdeCallFfi( + generalizedFrbRustBinding, + serializer, + funcId: 240, + port: port_, + ); + }, + codec: SseCodec( + decodeSuccessData: sse_decode_bool, + decodeErrorData: sse_decode_AnyhowException, + ), + constMeta: kCrateApiApiSendConstMeta, + argValues: [state, local, msg], + apiImpl: this, + ), + ); } - TaskConstMeta get kCrateApiApiUnsubscribeConstMeta => const TaskConstMeta( - debugName: "unsubscribe", - argNames: ["lock", "guid"], - ); + TaskConstMeta get kCrateApiApiSendConstMeta => const TaskConstMeta( + debugName: "send", + argNames: ["state", "local", "msg"], + ); @override - Future<(String, UpdateAccountFinish)> crateApiApiUpdateAccountHeaders( - {required ArcMutexAppleAccountDefaultAnisetteProvider account, - required JoinedOsConfig config}) { - return handler.executeNormal(NormalTask( - callFfi: (port_) { - final serializer = SseSerializer(generalizedFrbRustBinding); - sse_encode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcMutexAppleAccountDefaultAnisetteProvider( - account, serializer); - sse_encode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerJoinedOSConfig( - config, serializer); - pdeCallFfi(generalizedFrbRustBinding, serializer, - funcId: 245, port: port_); - }, - codec: SseCodec( - decodeSuccessData: sse_decode_record_string_update_account_finish, - decodeErrorData: sse_decode_AnyhowException, - ), - constMeta: kCrateApiApiUpdateAccountHeadersConstMeta, - argValues: [account, config], - apiImpl: this, - )); + Future crateApiApiSend2FaSms({ + CircleClientSessionDefaultAnisetteProvider? locked, + required ArcMutexAppleAccountDefaultAnisetteProvider account, + required int phoneId, + }) { + return handler.executeNormal( + NormalTask( + callFfi: (port_) { + final serializer = SseSerializer(generalizedFrbRustBinding); + sse_encode_opt_box_autoadd_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerCircleClientSessionDefaultAnisetteProvider( + locked, + serializer, + ); + sse_encode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcMutexAppleAccountDefaultAnisetteProvider( + account, + serializer, + ); + sse_encode_u_32(phoneId, serializer); + pdeCallFfi( + generalizedFrbRustBinding, + serializer, + funcId: 241, + port: port_, + ); + }, + codec: SseCodec( + decodeSuccessData: sse_decode_login_state, + decodeErrorData: sse_decode_AnyhowException, + ), + constMeta: kCrateApiApiSend2FaSmsConstMeta, + argValues: [locked, account, phoneId], + apiImpl: this, + ), + ); } - TaskConstMeta get kCrateApiApiUpdateAccountHeadersConstMeta => - const TaskConstMeta( - debugName: "update_account_headers", - argNames: ["account", "config"], - ); + TaskConstMeta get kCrateApiApiSend2FaSmsConstMeta => const TaskConstMeta( + debugName: "send_2fa_sms", + argNames: ["locked", "account", "phoneId"], + ); @override - Future crateApiApiUpdateBeaconName( - {required ArcFindMyClientDefaultAnisetteProvider items, - required BeaconNamingRecord namingRecord}) { - return handler.executeNormal(NormalTask( - callFfi: (port_) { - final serializer = SseSerializer(generalizedFrbRustBinding); - sse_encode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcFindMyClientDefaultAnisetteProvider( - items, serializer); - sse_encode_box_autoadd_beacon_naming_record(namingRecord, serializer); - pdeCallFfi(generalizedFrbRustBinding, serializer, - funcId: 246, port: port_); - }, - codec: SseCodec( - decodeSuccessData: sse_decode_unit, - decodeErrorData: sse_decode_AnyhowException, - ), - constMeta: kCrateApiApiUpdateBeaconNameConstMeta, - argValues: [items, namingRecord], - apiImpl: this, - )); + Future<(CircleClientSessionDefaultAnisetteProvider, LoginState, String?)> + crateApiApiSend2FaToDevices({ + required ArcMutexAppleAccountDefaultAnisetteProvider state, + required ApsConnection conn, + }) { + return handler.executeNormal( + NormalTask( + callFfi: (port_) { + final serializer = SseSerializer(generalizedFrbRustBinding); + sse_encode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcMutexAppleAccountDefaultAnisetteProvider( + state, + serializer, + ); + sse_encode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerAPSConnection( + conn, + serializer, + ); + pdeCallFfi( + generalizedFrbRustBinding, + serializer, + funcId: 242, + port: port_, + ); + }, + codec: SseCodec( + decodeSuccessData: + sse_decode_record_auto_owned_rust_opaque_flutter_rust_bridgefor_generated_rust_auto_opaque_inner_circle_client_session_default_anisette_provider_login_state_opt_string, + decodeErrorData: sse_decode_AnyhowException, + ), + constMeta: kCrateApiApiSend2FaToDevicesConstMeta, + argValues: [state, conn], + apiImpl: this, + ), + ); } - TaskConstMeta get kCrateApiApiUpdateBeaconNameConstMeta => + TaskConstMeta get kCrateApiApiSend2FaToDevicesConstMeta => const TaskConstMeta( - debugName: "update_beacon_name", - argNames: ["items", "namingRecord"], + debugName: "send_2fa_to_devices", + argNames: ["state", "conn"], ); @override - Stream crateApiApiUploadAttachment( - {required ApsConnection aps, - required String path, - required String mime, - required String uti, - required String name}) { - final sink = RustStreamSink(); - unawaited(handler.executeNormal(NormalTask( - callFfi: (port_) { - final serializer = SseSerializer(generalizedFrbRustBinding); - sse_encode_StreamSink_transfer_progress_Sse(sink, serializer); - sse_encode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerAPSConnection( - aps, serializer); - sse_encode_String(path, serializer); - sse_encode_String(mime, serializer); - sse_encode_String(uti, serializer); - sse_encode_String(name, serializer); - pdeCallFfi(generalizedFrbRustBinding, serializer, - funcId: 247, port: port_); - }, - codec: SseCodec( - decodeSuccessData: sse_decode_unit, - decodeErrorData: null, - ), - constMeta: kCrateApiApiUploadAttachmentConstMeta, - argValues: [sink, aps, path, mime, uti, name], - apiImpl: this, - ))); - return sink.stream; + (String, SharedPushState) crateApiApiSendDaemon({ + required SharedPushState state, + required ApsWatcher watcher, + }) { + return handler.executeSync( + SyncTask( + callFfi: () { + final serializer = SseSerializer(generalizedFrbRustBinding); + sse_encode_box_autoadd_shared_push_state(state, serializer); + sse_encode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerAPSWatcher( + watcher, + serializer, + ); + return pdeCallFfi( + generalizedFrbRustBinding, + serializer, + funcId: 243, + )!; + }, + codec: SseCodec( + decodeSuccessData: sse_decode_record_string_shared_push_state, + decodeErrorData: null, + ), + constMeta: kCrateApiApiSendDaemonConstMeta, + argValues: [state, watcher], + apiImpl: this, + ), + ); } - TaskConstMeta get kCrateApiApiUploadAttachmentConstMeta => - const TaskConstMeta( - debugName: "upload_attachment", - argNames: ["sink", "aps", "path", "mime", "uti", "name"], - ); + TaskConstMeta get kCrateApiApiSendDaemonConstMeta => const TaskConstMeta( + debugName: "send_daemon", + argNames: ["state", "watcher"], + ); @override - Future> crateApiApiUploadCloudAttachments( - {required ArcCloudMessagesClientDefaultAnisetteProvider - cloudMessagesClient, - required List<(String, String)> files}) { - return handler.executeNormal(NormalTask( - callFfi: (port_) { - final serializer = SseSerializer(generalizedFrbRustBinding); - sse_encode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcCloudMessagesClientDefaultAnisetteProvider( - cloudMessagesClient, serializer); - sse_encode_list_record_string_string(files, serializer); - pdeCallFfi(generalizedFrbRustBinding, serializer, - funcId: 248, port: port_); - }, - codec: SseCodec( - decodeSuccessData: - sse_decode_Map_String_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerAsset, - decodeErrorData: sse_decode_AnyhowException, - ), - constMeta: kCrateApiApiUploadCloudAttachmentsConstMeta, - argValues: [cloudMessagesClient, files], - apiImpl: this, - )); + Future crateApiApiServiceFromPtr({required String ptr}) { + return handler.executeNormal( + NormalTask( + callFfi: (port_) { + final serializer = SseSerializer(generalizedFrbRustBinding); + sse_encode_String(ptr, serializer); + pdeCallFfi( + generalizedFrbRustBinding, + serializer, + funcId: 244, + port: port_, + ); + }, + codec: SseCodec( + decodeSuccessData: sse_decode_opt_box_autoadd_shared_push_state, + decodeErrorData: null, + ), + constMeta: kCrateApiApiServiceFromPtrConstMeta, + argValues: [ptr], + apiImpl: this, + ), + ); } - TaskConstMeta get kCrateApiApiUploadCloudAttachmentsConstMeta => - const TaskConstMeta( - debugName: "upload_cloud_attachments", - argNames: ["cloudMessagesClient", "files"], - ); + TaskConstMeta get kCrateApiApiServiceFromPtrConstMeta => + const TaskConstMeta(debugName: "service_from_ptr", argNames: ["ptr"]); @override - Future> crateApiApiUploadGroupPhoto( - {required ArcCloudMessagesClientDefaultAnisetteProvider - cloudMessagesClient, - required List<(String, String)> files}) { - return handler.executeNormal(NormalTask( - callFfi: (port_) { - final serializer = SseSerializer(generalizedFrbRustBinding); - sse_encode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcCloudMessagesClientDefaultAnisetteProvider( - cloudMessagesClient, serializer); - sse_encode_list_record_string_string(files, serializer); - pdeCallFfi(generalizedFrbRustBinding, serializer, - funcId: 249, port: port_); - }, - codec: SseCodec( - decodeSuccessData: - sse_decode_Map_String_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerAsset, - decodeErrorData: sse_decode_AnyhowException, - ), - constMeta: kCrateApiApiUploadGroupPhotoConstMeta, - argValues: [cloudMessagesClient, files], - apiImpl: this, - )); + Future crateApiApiSetIdentity({ + required String statePath, + required JoinedOsConfig config, + required IdsngmIdentity identity, + }) { + return handler.executeNormal( + NormalTask( + callFfi: (port_) { + final serializer = SseSerializer(generalizedFrbRustBinding); + sse_encode_String(statePath, serializer); + sse_encode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerJoinedOSConfig( + config, + serializer, + ); + sse_encode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerIDSNGMIdentity( + identity, + serializer, + ); + pdeCallFfi( + generalizedFrbRustBinding, + serializer, + funcId: 245, + port: port_, + ); + }, + codec: SseCodec( + decodeSuccessData: sse_decode_unit, + decodeErrorData: null, + ), + constMeta: kCrateApiApiSetIdentityConstMeta, + argValues: [statePath, config, identity], + apiImpl: this, + ), + ); } - TaskConstMeta get kCrateApiApiUploadGroupPhotoConstMeta => - const TaskConstMeta( - debugName: "upload_group_photo", - argNames: ["cloudMessagesClient", "files"], - ); + TaskConstMeta get kCrateApiApiSetIdentityConstMeta => const TaskConstMeta( + debugName: "set_identity", + argNames: ["statePath", "config", "identity"], + ); @override - Stream crateApiApiUploadMmcs( - {required ApsConnection aps, required String path}) { - final sink = RustStreamSink(); - unawaited(handler.executeNormal(NormalTask( - callFfi: (port_) { - final serializer = SseSerializer(generalizedFrbRustBinding); - sse_encode_StreamSink_mmcs_transfer_progress_Sse(sink, serializer); - sse_encode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerAPSConnection( - aps, serializer); - sse_encode_String(path, serializer); - pdeCallFfi(generalizedFrbRustBinding, serializer, - funcId: 250, port: port_); - }, - codec: SseCodec( - decodeSuccessData: sse_decode_unit, - decodeErrorData: null, - ), - constMeta: kCrateApiApiUploadMmcsConstMeta, - argValues: [sink, aps, path], - apiImpl: this, - ))); - return sink.stream; + Future crateApiApiSetProfile({ + required ArcProfilesClientDefaultAnisetteProvider profiles, + required IMessageNicknameRecord record, + ShareProfileMessage? existing, + }) { + return handler.executeNormal( + NormalTask( + callFfi: (port_) { + final serializer = SseSerializer(generalizedFrbRustBinding); + sse_encode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcProfilesClientDefaultAnisetteProvider( + profiles, + serializer, + ); + sse_encode_box_autoadd_i_message_nickname_record(record, serializer); + sse_encode_opt_box_autoadd_share_profile_message( + existing, + serializer, + ); + pdeCallFfi( + generalizedFrbRustBinding, + serializer, + funcId: 246, + port: port_, + ); + }, + codec: SseCodec( + decodeSuccessData: sse_decode_share_profile_message, + decodeErrorData: sse_decode_AnyhowException, + ), + constMeta: kCrateApiApiSetProfileConstMeta, + argValues: [profiles, record, existing], + apiImpl: this, + ), + ); } - TaskConstMeta get kCrateApiApiUploadMmcsConstMeta => const TaskConstMeta( - debugName: "upload_mmcs", - argNames: ["sink", "aps", "path"], - ); + TaskConstMeta get kCrateApiApiSetProfileConstMeta => const TaskConstMeta( + debugName: "set_profile", + argNames: ["profiles", "record", "existing"], + ); @override - Future crateApiApiUseLinkFor( - {required ArcFtClient facetime, - required String oldUsage, - required String usage}) { - return handler.executeNormal(NormalTask( - callFfi: (port_) { - final serializer = SseSerializer(generalizedFrbRustBinding); - sse_encode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcFTClient( - facetime, serializer); - sse_encode_String(oldUsage, serializer); - sse_encode_String(usage, serializer); - pdeCallFfi(generalizedFrbRustBinding, serializer, - funcId: 251, port: port_); - }, - codec: SseCodec( - decodeSuccessData: sse_decode_unit, - decodeErrorData: sse_decode_AnyhowException, - ), - constMeta: kCrateApiApiUseLinkForConstMeta, - argValues: [facetime, oldUsage, usage], - apiImpl: this, - )); + Future crateApiApiSetStatus({ + required ArcStatusKitClientDefaultAnisetteProvider status, + String? newStatus, + }) { + return handler.executeNormal( + NormalTask( + callFfi: (port_) { + final serializer = SseSerializer(generalizedFrbRustBinding); + sse_encode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcStatusKitClientDefaultAnisetteProvider( + status, + serializer, + ); + sse_encode_opt_String(newStatus, serializer); + pdeCallFfi( + generalizedFrbRustBinding, + serializer, + funcId: 247, + port: port_, + ); + }, + codec: SseCodec( + decodeSuccessData: sse_decode_unit, + decodeErrorData: sse_decode_AnyhowException, + ), + constMeta: kCrateApiApiSetStatusConstMeta, + argValues: [status, newStatus], + apiImpl: this, + ), + ); } - TaskConstMeta get kCrateApiApiUseLinkForConstMeta => const TaskConstMeta( - debugName: "use_link_for", - argNames: ["facetime", "oldUsage", "usage"], - ); + TaskConstMeta get kCrateApiApiSetStatusConstMeta => const TaskConstMeta( + debugName: "set_status", + argNames: ["status", "newStatus"], + ); @override - SystemTime crateApiApiUtmNow() { - return handler.executeSync(SyncTask( - callFfi: () { - final serializer = SseSerializer(generalizedFrbRustBinding); - return pdeCallFfi(generalizedFrbRustBinding, serializer, funcId: 252)!; - }, - codec: SseCodec( - decodeSuccessData: - sse_decode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerSystemTime, - decodeErrorData: null, - ), - constMeta: kCrateApiApiUtmNowConstMeta, - argValues: [], - apiImpl: this, - )); + Future<(ApsConnection, PushError?)> crateApiApiSetupPush({ + required JoinedOsConfig config, + required IdsngmIdentity identity, + ApsState? state, + required String statePath, + }) { + return handler.executeNormal( + NormalTask( + callFfi: (port_) { + final serializer = SseSerializer(generalizedFrbRustBinding); + sse_encode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerJoinedOSConfig( + config, + serializer, + ); + sse_encode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerIDSNGMIdentity( + identity, + serializer, + ); + sse_encode_opt_box_autoadd_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerAPSState( + state, + serializer, + ); + sse_encode_String(statePath, serializer); + pdeCallFfi( + generalizedFrbRustBinding, + serializer, + funcId: 248, + port: port_, + ); + }, + codec: SseCodec( + decodeSuccessData: + sse_decode_record_auto_owned_rust_opaque_flutter_rust_bridgefor_generated_rust_auto_opaque_inner_aps_connection_opt_box_autoadd_auto_owned_rust_opaque_flutter_rust_bridgefor_generated_rust_auto_opaque_inner_push_error, + decodeErrorData: null, + ), + constMeta: kCrateApiApiSetupPushConstMeta, + argValues: [config, identity, state, statePath], + apiImpl: this, + ), + ); } - TaskConstMeta get kCrateApiApiUtmNowConstMeta => const TaskConstMeta( - debugName: "utm_now", - argNames: [], - ); + TaskConstMeta get kCrateApiApiSetupPushConstMeta => const TaskConstMeta( + debugName: "setup_push", + argNames: ["config", "identity", "state", "statePath"], + ); @override - Future> crateApiApiValidateCert( - {required ApsConnection conn, required IdsUser user}) { - return handler.executeNormal(NormalTask( - callFfi: (port_) { - final serializer = SseSerializer(generalizedFrbRustBinding); - sse_encode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerAPSConnection( - conn, serializer); - sse_encode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerIDSUser( - user, serializer); - pdeCallFfi(generalizedFrbRustBinding, serializer, - funcId: 253, port: port_); - }, - codec: SseCodec( - decodeSuccessData: sse_decode_list_String, - decodeErrorData: sse_decode_AnyhowException, - ), - constMeta: kCrateApiApiValidateCertConstMeta, - argValues: [conn, user], - apiImpl: this, - )); + Future<(SharedPushState, ApsWatcher)?> crateApiApiSharedPushStateRestore({ + required String path, + }) { + return handler.executeNormal( + NormalTask( + callFfi: (port_) { + final serializer = SseSerializer(generalizedFrbRustBinding); + sse_encode_String(path, serializer); + pdeCallFfi( + generalizedFrbRustBinding, + serializer, + funcId: 249, + port: port_, + ); + }, + codec: SseCodec( + decodeSuccessData: + sse_decode_opt_box_autoadd_record_shared_push_state_auto_owned_rust_opaque_flutter_rust_bridgefor_generated_rust_auto_opaque_inner_aps_watcher, + decodeErrorData: null, + ), + constMeta: kCrateApiApiSharedPushStateRestoreConstMeta, + argValues: [path], + apiImpl: this, + ), + ); } - TaskConstMeta get kCrateApiApiValidateCertConstMeta => const TaskConstMeta( - debugName: "validate_cert", - argNames: ["conn", "user"], + TaskConstMeta get kCrateApiApiSharedPushStateRestoreConstMeta => + const TaskConstMeta( + debugName: "shared_push_state_restore", + argNames: ["path"], ); @override - Future crateApiApiValidateRelay( - {required JoinedOsConfig configRef}) { - return handler.executeNormal(NormalTask( - callFfi: (port_) { - final serializer = SseSerializer(generalizedFrbRustBinding); - sse_encode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerJoinedOSConfig( - configRef, serializer); - pdeCallFfi(generalizedFrbRustBinding, serializer, - funcId: 254, port: port_); - }, - codec: SseCodec( - decodeSuccessData: sse_decode_opt_String, - decodeErrorData: sse_decode_AnyhowException, - ), - constMeta: kCrateApiApiValidateRelayConstMeta, - argValues: [configRef], - apiImpl: this, - )); + Future> crateApiApiSubscribe({ + required SyncManagerDefaultAnisetteProviderMyFilePackager lock, + required String guid, + }) { + return handler.executeNormal( + NormalTask( + callFfi: (port_) { + final serializer = SseSerializer(generalizedFrbRustBinding); + sse_encode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerSyncManagerDefaultAnisetteProviderMyFilePackager( + lock, + serializer, + ); + sse_encode_String(guid, serializer); + pdeCallFfi( + generalizedFrbRustBinding, + serializer, + funcId: 250, + port: port_, + ); + }, + codec: SseCodec( + decodeSuccessData: sse_decode_list_shared_album, + decodeErrorData: sse_decode_AnyhowException, + ), + constMeta: kCrateApiApiSubscribeConstMeta, + argValues: [lock, guid], + apiImpl: this, + ), + ); } - TaskConstMeta get kCrateApiApiValidateRelayConstMeta => const TaskConstMeta( - debugName: "validate_relay", - argNames: ["configRef"], - ); + TaskConstMeta get kCrateApiApiSubscribeConstMeta => + const TaskConstMeta(debugName: "subscribe", argNames: ["lock", "guid"]); @override - Future> crateApiApiValidateTargets( - {required ArcImClient state, - required List targets, - required String sender}) { - return handler.executeNormal(NormalTask( - callFfi: (port_) { - final serializer = SseSerializer(generalizedFrbRustBinding); - sse_encode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcIMClient( - state, serializer); - sse_encode_list_String(targets, serializer); - sse_encode_String(sender, serializer); - pdeCallFfi(generalizedFrbRustBinding, serializer, - funcId: 255, port: port_); - }, - codec: SseCodec( - decodeSuccessData: sse_decode_list_String, - decodeErrorData: sse_decode_AnyhowException, - ), - constMeta: kCrateApiApiValidateTargetsConstMeta, - argValues: [state, targets, sender], - apiImpl: this, - )); + ReceiverApsMessage crateApiApiSubscribeConn({required ApsConnection conn}) { + return handler.executeSync( + SyncTask( + callFfi: () { + final serializer = SseSerializer(generalizedFrbRustBinding); + sse_encode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerAPSConnection( + conn, + serializer, + ); + return pdeCallFfi( + generalizedFrbRustBinding, + serializer, + funcId: 251, + )!; + }, + codec: SseCodec( + decodeSuccessData: + sse_decode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerReceiverAPSMessage, + decodeErrorData: null, + ), + constMeta: kCrateApiApiSubscribeConnConstMeta, + argValues: [conn], + apiImpl: this, + ), + ); } - TaskConstMeta get kCrateApiApiValidateTargetsConstMeta => const TaskConstMeta( - debugName: "validate_targets", - argNames: ["state", "targets", "sender"], - ); + TaskConstMeta get kCrateApiApiSubscribeConnConstMeta => + const TaskConstMeta(debugName: "subscribe_conn", argNames: ["conn"]); @override - Future> crateApiApiValidateTargetsFacetime( - {required ArcImClient state, - required List targets, - required String sender}) { - return handler.executeNormal(NormalTask( - callFfi: (port_) { - final serializer = SseSerializer(generalizedFrbRustBinding); - sse_encode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcIMClient( - state, serializer); - sse_encode_list_String(targets, serializer); - sse_encode_String(sender, serializer); - pdeCallFfi(generalizedFrbRustBinding, serializer, - funcId: 256, port: port_); - }, - codec: SseCodec( - decodeSuccessData: sse_decode_list_String, - decodeErrorData: sse_decode_AnyhowException, - ), - constMeta: kCrateApiApiValidateTargetsFacetimeConstMeta, - argValues: [state, targets, sender], - apiImpl: this, - )); + Future> crateApiApiSubscribeToken({ + required SyncManagerDefaultAnisetteProviderMyFilePackager lock, + required String token, + }) { + return handler.executeNormal( + NormalTask( + callFfi: (port_) { + final serializer = SseSerializer(generalizedFrbRustBinding); + sse_encode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerSyncManagerDefaultAnisetteProviderMyFilePackager( + lock, + serializer, + ); + sse_encode_String(token, serializer); + pdeCallFfi( + generalizedFrbRustBinding, + serializer, + funcId: 252, + port: port_, + ); + }, + codec: SseCodec( + decodeSuccessData: sse_decode_list_shared_album, + decodeErrorData: sse_decode_AnyhowException, + ), + constMeta: kCrateApiApiSubscribeTokenConstMeta, + argValues: [lock, token], + apiImpl: this, + ), + ); } - TaskConstMeta get kCrateApiApiValidateTargetsFacetimeConstMeta => - const TaskConstMeta( - debugName: "validate_targets_facetime", - argNames: ["state", "targets", "sender"], - ); + TaskConstMeta get kCrateApiApiSubscribeTokenConstMeta => const TaskConstMeta( + debugName: "subscribe_token", + argNames: ["lock", "token"], + ); @override - Future<(LoginState, IdsUser?)> crateApiApiVerify2Fa( - {required String path, - required CircleClientSessionDefaultAnisetteProvider client, - required ArcAnisetteClientDefaultAnisetteProvider anisette, - required JoinedOsConfig osConfig, - required ArcMutexAppleAccountDefaultAnisetteProvider account, - required ReceiverApsMessage watcher, - required ArcIdmsAuthListener idms, - required String code}) { - return handler.executeNormal(NormalTask( - callFfi: (port_) { - final serializer = SseSerializer(generalizedFrbRustBinding); - sse_encode_String(path, serializer); - sse_encode_Auto_RefMut_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerCircleClientSessionDefaultAnisetteProvider( - client, serializer); - sse_encode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcAnisetteClientDefaultAnisetteProvider( - anisette, serializer); - sse_encode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerJoinedOSConfig( - osConfig, serializer); - sse_encode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcMutexAppleAccountDefaultAnisetteProvider( - account, serializer); - sse_encode_Auto_RefMut_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerReceiverAPSMessage( - watcher, serializer); - sse_encode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcIdmsAuthListener( - idms, serializer); - sse_encode_String(code, serializer); - pdeCallFfi(generalizedFrbRustBinding, serializer, - funcId: 257, port: port_); - }, - codec: SseCodec( - decodeSuccessData: - sse_decode_record_login_state_opt_box_autoadd_auto_owned_rust_opaque_flutter_rust_bridgefor_generated_rust_auto_opaque_inner_ids_user, - decodeErrorData: sse_decode_AnyhowException, - ), - constMeta: kCrateApiApiVerify2FaConstMeta, - argValues: [ - path, - client, - anisette, - osConfig, - account, - watcher, - idms, - code - ], - apiImpl: this, - )); + Future<(Uint8List, Map, int)> + crateApiApiSyncAttachments({ + required ArcCloudMessagesClientDefaultAnisetteProvider cloudMessagesClient, + Uint8List? continuationToken, + }) { + return handler.executeNormal( + NormalTask( + callFfi: (port_) { + final serializer = SseSerializer(generalizedFrbRustBinding); + sse_encode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcCloudMessagesClientDefaultAnisetteProvider( + cloudMessagesClient, + serializer, + ); + sse_encode_opt_list_prim_u_8_strict(continuationToken, serializer); + pdeCallFfi( + generalizedFrbRustBinding, + serializer, + funcId: 253, + port: port_, + ); + }, + codec: SseCodec( + decodeSuccessData: + sse_decode_record_list_prim_u_8_strict_map_string_opt_box_autoadd_cloud_attachment_i_32, + decodeErrorData: sse_decode_AnyhowException, + ), + constMeta: kCrateApiApiSyncAttachmentsConstMeta, + argValues: [cloudMessagesClient, continuationToken], + apiImpl: this, + ), + ); } - TaskConstMeta get kCrateApiApiVerify2FaConstMeta => const TaskConstMeta( - debugName: "verify_2fa", - argNames: [ - "path", - "client", - "anisette", - "osConfig", - "account", - "watcher", - "idms", - "code" - ], - ); + TaskConstMeta get kCrateApiApiSyncAttachmentsConstMeta => const TaskConstMeta( + debugName: "sync_attachments", + argNames: ["cloudMessagesClient", "continuationToken"], + ); @override - Future<(LoginState, IdsUser?)> crateApiApiVerify2FaSms( - {required String path, - required ArcMutexAppleAccountDefaultAnisetteProvider accountMut, - required ArcAnisetteClientDefaultAnisetteProvider anisette, - required JoinedOsConfig config, - required VerifyBody body, - required String code}) { - return handler.executeNormal(NormalTask( - callFfi: (port_) { - final serializer = SseSerializer(generalizedFrbRustBinding); - sse_encode_String(path, serializer); - sse_encode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcMutexAppleAccountDefaultAnisetteProvider( - accountMut, serializer); - sse_encode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcAnisetteClientDefaultAnisetteProvider( - anisette, serializer); - sse_encode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerJoinedOSConfig( - config, serializer); - sse_encode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerVerifyBody( - body, serializer); - sse_encode_String(code, serializer); - pdeCallFfi(generalizedFrbRustBinding, serializer, - funcId: 258, port: port_); - }, - codec: SseCodec( - decodeSuccessData: - sse_decode_record_login_state_opt_box_autoadd_auto_owned_rust_opaque_flutter_rust_bridgefor_generated_rust_auto_opaque_inner_ids_user, - decodeErrorData: sse_decode_AnyhowException, - ), - constMeta: kCrateApiApiVerify2FaSmsConstMeta, - argValues: [path, accountMut, anisette, config, body, code], - apiImpl: this, - )); + Future<(Uint8List, Map, int)> crateApiApiSyncChats({ + required ArcCloudMessagesClientDefaultAnisetteProvider cloudMessagesClient, + Uint8List? continuationToken, + }) { + return handler.executeNormal( + NormalTask( + callFfi: (port_) { + final serializer = SseSerializer(generalizedFrbRustBinding); + sse_encode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcCloudMessagesClientDefaultAnisetteProvider( + cloudMessagesClient, + serializer, + ); + sse_encode_opt_list_prim_u_8_strict(continuationToken, serializer); + pdeCallFfi( + generalizedFrbRustBinding, + serializer, + funcId: 254, + port: port_, + ); + }, + codec: SseCodec( + decodeSuccessData: + sse_decode_record_list_prim_u_8_strict_map_string_opt_box_autoadd_cloud_chat_i_32, + decodeErrorData: sse_decode_AnyhowException, + ), + constMeta: kCrateApiApiSyncChatsConstMeta, + argValues: [cloudMessagesClient, continuationToken], + apiImpl: this, + ), + ); } - TaskConstMeta get kCrateApiApiVerify2FaSmsConstMeta => const TaskConstMeta( - debugName: "verify_2fa_sms", - argNames: ["path", "accountMut", "anisette", "config", "body", "code"], - ); - - Future Function(int, dynamic) - encode_DartFn_Inputs_String_Output_String_AnyhowException( - FutureOr Function(String) raw) { - return (callId, rawArg0) async { - final arg0 = dco_decode_String(rawArg0); - - Box? rawOutput; - Box? rawError; - try { - rawOutput = Box(await raw(arg0)); - } catch (e, s) { - rawError = Box(AnyhowException("$e\n\n$s")); - } - - final serializer = SseSerializer(generalizedFrbRustBinding); - assert((rawOutput != null) ^ (rawError != null)); - if (rawOutput != null) { - serializer.buffer.putUint8(0); - sse_encode_String(rawOutput.value, serializer); - } else { - serializer.buffer.putUint8(1); - sse_encode_AnyhowException(rawError!.value, serializer); - } - final output = serializer.intoRaw(); + TaskConstMeta get kCrateApiApiSyncChatsConstMeta => const TaskConstMeta( + debugName: "sync_chats", + argNames: ["cloudMessagesClient", "continuationToken"], + ); - generalizedFrbRustBinding.dartFnDeliverOutput( - callId: callId, - ptr: output.ptr, - rustVecLen: output.rustVecLen, - dataLen: output.dataLen); - }; + @override + Future<(Uint8List, Map, int)> crateApiApiSyncMessages({ + required ArcCloudMessagesClientDefaultAnisetteProvider cloudMessagesClient, + Uint8List? continuationToken, + }) { + return handler.executeNormal( + NormalTask( + callFfi: (port_) { + final serializer = SseSerializer(generalizedFrbRustBinding); + sse_encode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcCloudMessagesClientDefaultAnisetteProvider( + cloudMessagesClient, + serializer, + ); + sse_encode_opt_list_prim_u_8_strict(continuationToken, serializer); + pdeCallFfi( + generalizedFrbRustBinding, + serializer, + funcId: 255, + port: port_, + ); + }, + codec: SseCodec( + decodeSuccessData: + sse_decode_record_list_prim_u_8_strict_map_string_opt_box_autoadd_cloud_message_i_32, + decodeErrorData: sse_decode_AnyhowException, + ), + constMeta: kCrateApiApiSyncMessagesConstMeta, + argValues: [cloudMessagesClient, continuationToken], + apiImpl: this, + ), + ); } - RustArcIncrementStrongCountFnType - get rust_arc_increment_strong_count_ApsConnection => wire - .rust_arc_increment_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerAPSConnection; + TaskConstMeta get kCrateApiApiSyncMessagesConstMeta => const TaskConstMeta( + debugName: "sync_messages", + argNames: ["cloudMessagesClient", "continuationToken"], + ); - RustArcDecrementStrongCountFnType - get rust_arc_decrement_strong_count_ApsConnection => wire - .rust_arc_decrement_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerAPSConnection; + @override + Future crateApiApiSyncNow({ + required SyncManagerDefaultAnisetteProviderMyFilePackager lock, + }) { + return handler.executeNormal( + NormalTask( + callFfi: (port_) { + final serializer = SseSerializer(generalizedFrbRustBinding); + sse_encode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerSyncManagerDefaultAnisetteProviderMyFilePackager( + lock, + serializer, + ); + pdeCallFfi( + generalizedFrbRustBinding, + serializer, + funcId: 256, + port: port_, + ); + }, + codec: SseCodec( + decodeSuccessData: sse_decode_unit, + decodeErrorData: sse_decode_AnyhowException, + ), + constMeta: kCrateApiApiSyncNowConstMeta, + argValues: [lock], + apiImpl: this, + ), + ); + } - RustArcIncrementStrongCountFnType - get rust_arc_increment_strong_count_ApsState => wire - .rust_arc_increment_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerAPSState; + TaskConstMeta get kCrateApiApiSyncNowConstMeta => + const TaskConstMeta(debugName: "sync_now", argNames: ["lock"]); - RustArcDecrementStrongCountFnType - get rust_arc_decrement_strong_count_ApsState => wire - .rust_arc_decrement_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerAPSState; + @override + Future crateApiApiSyncPasswords({ + required ArcPasswordManagerDefaultAnisetteProvider passwords, + required ApsConnection conn, + }) { + return handler.executeNormal( + NormalTask( + callFfi: (port_) { + final serializer = SseSerializer(generalizedFrbRustBinding); + sse_encode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcPasswordManagerDefaultAnisetteProvider( + passwords, + serializer, + ); + sse_encode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerAPSConnection( + conn, + serializer, + ); + pdeCallFfi( + generalizedFrbRustBinding, + serializer, + funcId: 257, + port: port_, + ); + }, + codec: SseCodec( + decodeSuccessData: sse_decode_unit, + decodeErrorData: sse_decode_AnyhowException, + ), + constMeta: kCrateApiApiSyncPasswordsConstMeta, + argValues: [passwords, conn], + apiImpl: this, + ), + ); + } - RustArcIncrementStrongCountFnType - get rust_arc_increment_strong_count_ApsWatcher => wire - .rust_arc_increment_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerAPSWatcher; + TaskConstMeta get kCrateApiApiSyncPasswordsConstMeta => const TaskConstMeta( + debugName: "sync_passwords", + argNames: ["passwords", "conn"], + ); - RustArcDecrementStrongCountFnType - get rust_arc_decrement_strong_count_ApsWatcher => wire - .rust_arc_decrement_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerAPSWatcher; + @override + Future crateApiApiSyncWifiPasswords({ + required ArcPasswordManagerDefaultAnisetteProvider manager, + required bool userApprove, + }) { + return handler.executeNormal( + NormalTask( + callFfi: (port_) { + final serializer = SseSerializer(generalizedFrbRustBinding); + sse_encode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcPasswordManagerDefaultAnisetteProvider( + manager, + serializer, + ); + sse_encode_bool(userApprove, serializer); + pdeCallFfi( + generalizedFrbRustBinding, + serializer, + funcId: 258, + port: port_, + ); + }, + codec: SseCodec( + decodeSuccessData: sse_decode_unit, + decodeErrorData: null, + ), + constMeta: kCrateApiApiSyncWifiPasswordsConstMeta, + argValues: [manager, userApprove], + apiImpl: this, + ), + ); + } - RustArcIncrementStrongCountFnType - get rust_arc_increment_strong_count_ArcAnisetteClientDefaultAnisetteProvider => - wire.rust_arc_increment_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcAnisetteClientDefaultAnisetteProvider; + TaskConstMeta get kCrateApiApiSyncWifiPasswordsConstMeta => + const TaskConstMeta( + debugName: "sync_wifi_passwords", + argNames: ["manager", "userApprove"], + ); - RustArcDecrementStrongCountFnType - get rust_arc_decrement_strong_count_ArcAnisetteClientDefaultAnisetteProvider => - wire.rust_arc_decrement_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcAnisetteClientDefaultAnisetteProvider; + @override + int crateApiApiSystemtimeToMillis({required SystemTime time}) { + return handler.executeSync( + SyncTask( + callFfi: () { + final serializer = SseSerializer(generalizedFrbRustBinding); + sse_encode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerSystemTime( + time, + serializer, + ); + return pdeCallFfi( + generalizedFrbRustBinding, + serializer, + funcId: 259, + )!; + }, + codec: SseCodec( + decodeSuccessData: sse_decode_CastedPrimitive_u_64, + decodeErrorData: null, + ), + constMeta: kCrateApiApiSystemtimeToMillisConstMeta, + argValues: [time], + apiImpl: this, + ), + ); + } - RustArcIncrementStrongCountFnType - get rust_arc_increment_strong_count_ArcCloudKitClientDefaultAnisetteProvider => - wire.rust_arc_increment_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcCloudKitClientDefaultAnisetteProvider; + TaskConstMeta get kCrateApiApiSystemtimeToMillisConstMeta => + const TaskConstMeta( + debugName: "systemtime_to_millis", + argNames: ["time"], + ); - RustArcDecrementStrongCountFnType - get rust_arc_decrement_strong_count_ArcCloudKitClientDefaultAnisetteProvider => - wire.rust_arc_decrement_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcCloudKitClientDefaultAnisetteProvider; + @override + Future crateApiApiTeardown2Fa({ + required ArcMutexAppleAccountDefaultAnisetteProvider account, + required String action, + required String txnid, + }) { + return handler.executeNormal( + NormalTask( + callFfi: (port_) { + final serializer = SseSerializer(generalizedFrbRustBinding); + sse_encode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcMutexAppleAccountDefaultAnisetteProvider( + account, + serializer, + ); + sse_encode_String(action, serializer); + sse_encode_String(txnid, serializer); + pdeCallFfi( + generalizedFrbRustBinding, + serializer, + funcId: 260, + port: port_, + ); + }, + codec: SseCodec( + decodeSuccessData: sse_decode_unit, + decodeErrorData: sse_decode_AnyhowException, + ), + constMeta: kCrateApiApiTeardown2FaConstMeta, + argValues: [account, action, txnid], + apiImpl: this, + ), + ); + } - RustArcIncrementStrongCountFnType - get rust_arc_increment_strong_count_ArcCloudMessagesClientDefaultAnisetteProvider => - wire.rust_arc_increment_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcCloudMessagesClientDefaultAnisetteProvider; + TaskConstMeta get kCrateApiApiTeardown2FaConstMeta => const TaskConstMeta( + debugName: "teardown_2fa", + argNames: ["account", "action", "txnid"], + ); - RustArcDecrementStrongCountFnType - get rust_arc_decrement_strong_count_ArcCloudMessagesClientDefaultAnisetteProvider => - wire.rust_arc_decrement_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcCloudMessagesClientDefaultAnisetteProvider; + @override + Future crateApiApiTranscriptPosterSave({ + required SimplifiedTranscriptPoster poster, + }) { + return handler.executeNormal( + NormalTask( + callFfi: (port_) { + final serializer = SseSerializer(generalizedFrbRustBinding); + sse_encode_box_autoadd_simplified_transcript_poster( + poster, + serializer, + ); + pdeCallFfi( + generalizedFrbRustBinding, + serializer, + funcId: 261, + port: port_, + ); + }, + codec: SseCodec( + decodeSuccessData: sse_decode_list_prim_u_8_strict, + decodeErrorData: sse_decode_AnyhowException, + ), + constMeta: kCrateApiApiTranscriptPosterSaveConstMeta, + argValues: [poster], + apiImpl: this, + ), + ); + } - RustArcIncrementStrongCountFnType - get rust_arc_increment_strong_count_ArcFtClient => wire - .rust_arc_increment_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcFTClient; + TaskConstMeta get kCrateApiApiTranscriptPosterSaveConstMeta => + const TaskConstMeta( + debugName: "transcript_poster_save", + argNames: ["poster"], + ); - RustArcDecrementStrongCountFnType - get rust_arc_decrement_strong_count_ArcFtClient => wire - .rust_arc_decrement_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcFTClient; + @override + Future<(ArcMutexAppleAccountDefaultAnisetteProvider, LoginState)> + crateApiApiTryAuth({ + required String path, + required JoinedOsConfig conf, + required ApsConnection conn, + required ArcAnisetteClientDefaultAnisetteProvider anisette, + (String, String)? creds, + }) { + return handler.executeNormal( + NormalTask( + callFfi: (port_) { + final serializer = SseSerializer(generalizedFrbRustBinding); + sse_encode_String(path, serializer); + sse_encode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerJoinedOSConfig( + conf, + serializer, + ); + sse_encode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerAPSConnection( + conn, + serializer, + ); + sse_encode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcAnisetteClientDefaultAnisetteProvider( + anisette, + serializer, + ); + sse_encode_opt_box_autoadd_record_string_string(creds, serializer); + pdeCallFfi( + generalizedFrbRustBinding, + serializer, + funcId: 262, + port: port_, + ); + }, + codec: SseCodec( + decodeSuccessData: + sse_decode_record_auto_owned_rust_opaque_flutter_rust_bridgefor_generated_rust_auto_opaque_inner_arc_mutex_apple_account_default_anisette_provider_login_state, + decodeErrorData: sse_decode_AnyhowException, + ), + constMeta: kCrateApiApiTryAuthConstMeta, + argValues: [path, conf, conn, anisette, creds], + apiImpl: this, + ), + ); + } - RustArcIncrementStrongCountFnType - get rust_arc_increment_strong_count_ArcFindMyClientDefaultAnisetteProvider => - wire.rust_arc_increment_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcFindMyClientDefaultAnisetteProvider; + TaskConstMeta get kCrateApiApiTryAuthConstMeta => const TaskConstMeta( + debugName: "try_auth", + argNames: ["path", "conf", "conn", "anisette", "creds"], + ); - RustArcDecrementStrongCountFnType - get rust_arc_decrement_strong_count_ArcFindMyClientDefaultAnisetteProvider => - wire.rust_arc_decrement_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcFindMyClientDefaultAnisetteProvider; + @override + Future crateApiApiTryIcloudLogin({ + required String path, + required JoinedOsConfig conf, + required ArcMutexAppleAccountDefaultAnisetteProvider account, + }) { + return handler.executeNormal( + NormalTask( + callFfi: (port_) { + final serializer = SseSerializer(generalizedFrbRustBinding); + sse_encode_String(path, serializer); + sse_encode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerJoinedOSConfig( + conf, + serializer, + ); + sse_encode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcMutexAppleAccountDefaultAnisetteProvider( + account, + serializer, + ); + pdeCallFfi( + generalizedFrbRustBinding, + serializer, + funcId: 263, + port: port_, + ); + }, + codec: SseCodec( + decodeSuccessData: + sse_decode_opt_box_autoadd_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerIDSUser, + decodeErrorData: sse_decode_AnyhowException, + ), + constMeta: kCrateApiApiTryIcloudLoginConstMeta, + argValues: [path, conf, account], + apiImpl: this, + ), + ); + } - RustArcIncrementStrongCountFnType - get rust_arc_increment_strong_count_ArcImClient => wire - .rust_arc_increment_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcIMClient; + TaskConstMeta get kCrateApiApiTryIcloudLoginConstMeta => const TaskConstMeta( + debugName: "try_icloud_login", + argNames: ["path", "conf", "account"], + ); - RustArcDecrementStrongCountFnType - get rust_arc_decrement_strong_count_ArcImClient => wire - .rust_arc_decrement_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcIMClient; + @override + Future> crateApiApiUnsubscribe({ + required SyncManagerDefaultAnisetteProviderMyFilePackager lock, + required String guid, + }) { + return handler.executeNormal( + NormalTask( + callFfi: (port_) { + final serializer = SseSerializer(generalizedFrbRustBinding); + sse_encode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerSyncManagerDefaultAnisetteProviderMyFilePackager( + lock, + serializer, + ); + sse_encode_String(guid, serializer); + pdeCallFfi( + generalizedFrbRustBinding, + serializer, + funcId: 264, + port: port_, + ); + }, + codec: SseCodec( + decodeSuccessData: sse_decode_list_shared_album, + decodeErrorData: sse_decode_AnyhowException, + ), + constMeta: kCrateApiApiUnsubscribeConstMeta, + argValues: [lock, guid], + apiImpl: this, + ), + ); + } - RustArcIncrementStrongCountFnType - get rust_arc_increment_strong_count_ArcIdmsAuthListener => wire - .rust_arc_increment_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcIdmsAuthListener; + TaskConstMeta get kCrateApiApiUnsubscribeConstMeta => + const TaskConstMeta(debugName: "unsubscribe", argNames: ["lock", "guid"]); - RustArcDecrementStrongCountFnType - get rust_arc_decrement_strong_count_ArcIdmsAuthListener => wire - .rust_arc_decrement_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcIdmsAuthListener; + @override + Future<(String, UpdateAccountFinish)> crateApiApiUpdateAccountHeaders({ + required ArcMutexAppleAccountDefaultAnisetteProvider account, + required JoinedOsConfig config, + }) { + return handler.executeNormal( + NormalTask( + callFfi: (port_) { + final serializer = SseSerializer(generalizedFrbRustBinding); + sse_encode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcMutexAppleAccountDefaultAnisetteProvider( + account, + serializer, + ); + sse_encode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerJoinedOSConfig( + config, + serializer, + ); + pdeCallFfi( + generalizedFrbRustBinding, + serializer, + funcId: 265, + port: port_, + ); + }, + codec: SseCodec( + decodeSuccessData: sse_decode_record_string_update_account_finish, + decodeErrorData: sse_decode_AnyhowException, + ), + constMeta: kCrateApiApiUpdateAccountHeadersConstMeta, + argValues: [account, config], + apiImpl: this, + ), + ); + } - RustArcIncrementStrongCountFnType - get rust_arc_increment_strong_count_ArcKeychainClientDefaultAnisetteProvider => - wire.rust_arc_increment_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcKeychainClientDefaultAnisetteProvider; + TaskConstMeta get kCrateApiApiUpdateAccountHeadersConstMeta => + const TaskConstMeta( + debugName: "update_account_headers", + argNames: ["account", "config"], + ); - RustArcDecrementStrongCountFnType - get rust_arc_decrement_strong_count_ArcKeychainClientDefaultAnisetteProvider => - wire.rust_arc_decrement_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcKeychainClientDefaultAnisetteProvider; + @override + Future crateApiApiUpdateBeaconName({ + required ArcFindMyClientDefaultAnisetteProvider items, + required BeaconNamingRecord namingRecord, + }) { + return handler.executeNormal( + NormalTask( + callFfi: (port_) { + final serializer = SseSerializer(generalizedFrbRustBinding); + sse_encode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcFindMyClientDefaultAnisetteProvider( + items, + serializer, + ); + sse_encode_box_autoadd_beacon_naming_record(namingRecord, serializer); + pdeCallFfi( + generalizedFrbRustBinding, + serializer, + funcId: 266, + port: port_, + ); + }, + codec: SseCodec( + decodeSuccessData: sse_decode_unit, + decodeErrorData: sse_decode_AnyhowException, + ), + constMeta: kCrateApiApiUpdateBeaconNameConstMeta, + argValues: [items, namingRecord], + apiImpl: this, + ), + ); + } - RustArcIncrementStrongCountFnType - get rust_arc_increment_strong_count_ArcMutexAppleAccountDefaultAnisetteProvider => - wire.rust_arc_increment_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcMutexAppleAccountDefaultAnisetteProvider; + TaskConstMeta get kCrateApiApiUpdateBeaconNameConstMeta => + const TaskConstMeta( + debugName: "update_beacon_name", + argNames: ["items", "namingRecord"], + ); - RustArcDecrementStrongCountFnType - get rust_arc_decrement_strong_count_ArcMutexAppleAccountDefaultAnisetteProvider => - wire.rust_arc_decrement_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcMutexAppleAccountDefaultAnisetteProvider; + @override + Stream crateApiApiUploadAttachment({ + required ApsConnection aps, + required String path, + required String mime, + required String uti, + required String name, + }) { + final sink = RustStreamSink(); + unawaited( + handler.executeNormal( + NormalTask( + callFfi: (port_) { + final serializer = SseSerializer(generalizedFrbRustBinding); + sse_encode_StreamSink_transfer_progress_Sse(sink, serializer); + sse_encode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerAPSConnection( + aps, + serializer, + ); + sse_encode_String(path, serializer); + sse_encode_String(mime, serializer); + sse_encode_String(uti, serializer); + sse_encode_String(name, serializer); + pdeCallFfi( + generalizedFrbRustBinding, + serializer, + funcId: 267, + port: port_, + ); + }, + codec: SseCodec( + decodeSuccessData: sse_decode_unit, + decodeErrorData: null, + ), + constMeta: kCrateApiApiUploadAttachmentConstMeta, + argValues: [sink, aps, path, mime, uti, name], + apiImpl: this, + ), + ), + ); + return sink.stream; + } - RustArcIncrementStrongCountFnType - get rust_arc_increment_strong_count_ArcMutexOptionCircleClientSessionDefaultAnisetteProvider => - wire.rust_arc_increment_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcMutexOptionCircleClientSessionDefaultAnisetteProvider; + TaskConstMeta get kCrateApiApiUploadAttachmentConstMeta => + const TaskConstMeta( + debugName: "upload_attachment", + argNames: ["sink", "aps", "path", "mime", "uti", "name"], + ); - RustArcDecrementStrongCountFnType - get rust_arc_decrement_strong_count_ArcMutexOptionCircleClientSessionDefaultAnisetteProvider => - wire.rust_arc_decrement_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcMutexOptionCircleClientSessionDefaultAnisetteProvider; + @override + Future> crateApiApiUploadCloudAttachments({ + required ArcCloudMessagesClientDefaultAnisetteProvider cloudMessagesClient, + required List<(String, String)> files, + }) { + return handler.executeNormal( + NormalTask( + callFfi: (port_) { + final serializer = SseSerializer(generalizedFrbRustBinding); + sse_encode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcCloudMessagesClientDefaultAnisetteProvider( + cloudMessagesClient, + serializer, + ); + sse_encode_list_record_string_string(files, serializer); + pdeCallFfi( + generalizedFrbRustBinding, + serializer, + funcId: 268, + port: port_, + ); + }, + codec: SseCodec( + decodeSuccessData: + sse_decode_Map_String_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerAsset, + decodeErrorData: sse_decode_AnyhowException, + ), + constMeta: kCrateApiApiUploadCloudAttachmentsConstMeta, + argValues: [cloudMessagesClient, files], + apiImpl: this, + ), + ); + } - RustArcIncrementStrongCountFnType - get rust_arc_increment_strong_count_ArcMutexVecActiveCircleSession => wire - .rust_arc_increment_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcMutexVecActiveCircleSession; + TaskConstMeta get kCrateApiApiUploadCloudAttachmentsConstMeta => + const TaskConstMeta( + debugName: "upload_cloud_attachments", + argNames: ["cloudMessagesClient", "files"], + ); - RustArcDecrementStrongCountFnType - get rust_arc_decrement_strong_count_ArcMutexVecActiveCircleSession => wire - .rust_arc_decrement_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcMutexVecActiveCircleSession; + @override + Future> crateApiApiUploadGroupPhoto({ + required ArcCloudMessagesClientDefaultAnisetteProvider cloudMessagesClient, + required List<(String, String)> files, + }) { + return handler.executeNormal( + NormalTask( + callFfi: (port_) { + final serializer = SseSerializer(generalizedFrbRustBinding); + sse_encode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcCloudMessagesClientDefaultAnisetteProvider( + cloudMessagesClient, + serializer, + ); + sse_encode_list_record_string_string(files, serializer); + pdeCallFfi( + generalizedFrbRustBinding, + serializer, + funcId: 269, + port: port_, + ); + }, + codec: SseCodec( + decodeSuccessData: + sse_decode_Map_String_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerAsset, + decodeErrorData: sse_decode_AnyhowException, + ), + constMeta: kCrateApiApiUploadGroupPhotoConstMeta, + argValues: [cloudMessagesClient, files], + apiImpl: this, + ), + ); + } - RustArcIncrementStrongCountFnType - get rust_arc_increment_strong_count_ArcPasswordManagerDefaultAnisetteProvider => - wire.rust_arc_increment_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcPasswordManagerDefaultAnisetteProvider; + TaskConstMeta get kCrateApiApiUploadGroupPhotoConstMeta => + const TaskConstMeta( + debugName: "upload_group_photo", + argNames: ["cloudMessagesClient", "files"], + ); - RustArcDecrementStrongCountFnType - get rust_arc_decrement_strong_count_ArcPasswordManagerDefaultAnisetteProvider => - wire.rust_arc_decrement_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcPasswordManagerDefaultAnisetteProvider; + @override + Stream crateApiApiUploadMmcs({ + required ApsConnection aps, + required String path, + }) { + final sink = RustStreamSink(); + unawaited( + handler.executeNormal( + NormalTask( + callFfi: (port_) { + final serializer = SseSerializer(generalizedFrbRustBinding); + sse_encode_StreamSink_mmcs_transfer_progress_Sse(sink, serializer); + sse_encode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerAPSConnection( + aps, + serializer, + ); + sse_encode_String(path, serializer); + pdeCallFfi( + generalizedFrbRustBinding, + serializer, + funcId: 270, + port: port_, + ); + }, + codec: SseCodec( + decodeSuccessData: sse_decode_unit, + decodeErrorData: null, + ), + constMeta: kCrateApiApiUploadMmcsConstMeta, + argValues: [sink, aps, path], + apiImpl: this, + ), + ), + ); + return sink.stream; + } - RustArcIncrementStrongCountFnType - get rust_arc_increment_strong_count_ArcProfilesClientDefaultAnisetteProvider => - wire.rust_arc_increment_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcProfilesClientDefaultAnisetteProvider; + TaskConstMeta get kCrateApiApiUploadMmcsConstMeta => const TaskConstMeta( + debugName: "upload_mmcs", + argNames: ["sink", "aps", "path"], + ); - RustArcDecrementStrongCountFnType - get rust_arc_decrement_strong_count_ArcProfilesClientDefaultAnisetteProvider => - wire.rust_arc_decrement_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcProfilesClientDefaultAnisetteProvider; + @override + Future crateApiApiUseLinkFor({ + required ArcFtClient facetime, + required String oldUsage, + required String usage, + }) { + return handler.executeNormal( + NormalTask( + callFfi: (port_) { + final serializer = SseSerializer(generalizedFrbRustBinding); + sse_encode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcFTClient( + facetime, + serializer, + ); + sse_encode_String(oldUsage, serializer); + sse_encode_String(usage, serializer); + pdeCallFfi( + generalizedFrbRustBinding, + serializer, + funcId: 271, + port: port_, + ); + }, + codec: SseCodec( + decodeSuccessData: sse_decode_unit, + decodeErrorData: sse_decode_AnyhowException, + ), + constMeta: kCrateApiApiUseLinkForConstMeta, + argValues: [facetime, oldUsage, usage], + apiImpl: this, + ), + ); + } - RustArcIncrementStrongCountFnType - get rust_arc_increment_strong_count_ArcSenderPushMessage => wire - .rust_arc_increment_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcSenderPushMessage; + TaskConstMeta get kCrateApiApiUseLinkForConstMeta => const TaskConstMeta( + debugName: "use_link_for", + argNames: ["facetime", "oldUsage", "usage"], + ); - RustArcDecrementStrongCountFnType - get rust_arc_decrement_strong_count_ArcSenderPushMessage => wire - .rust_arc_decrement_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcSenderPushMessage; + @override + SystemTime crateApiApiUtmNow() { + return handler.executeSync( + SyncTask( + callFfi: () { + final serializer = SseSerializer(generalizedFrbRustBinding); + return pdeCallFfi( + generalizedFrbRustBinding, + serializer, + funcId: 272, + )!; + }, + codec: SseCodec( + decodeSuccessData: + sse_decode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerSystemTime, + decodeErrorData: null, + ), + constMeta: kCrateApiApiUtmNowConstMeta, + argValues: [], + apiImpl: this, + ), + ); + } - RustArcIncrementStrongCountFnType - get rust_arc_increment_strong_count_ArcSharedPushState => wire - .rust_arc_increment_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcSharedPushState; + TaskConstMeta get kCrateApiApiUtmNowConstMeta => + const TaskConstMeta(debugName: "utm_now", argNames: []); - RustArcDecrementStrongCountFnType - get rust_arc_decrement_strong_count_ArcSharedPushState => wire - .rust_arc_decrement_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcSharedPushState; + @override + Future> crateApiApiValidateCert({ + required ApsConnection conn, + required IdsUser user, + }) { + return handler.executeNormal( + NormalTask( + callFfi: (port_) { + final serializer = SseSerializer(generalizedFrbRustBinding); + sse_encode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerAPSConnection( + conn, + serializer, + ); + sse_encode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerIDSUser( + user, + serializer, + ); + pdeCallFfi( + generalizedFrbRustBinding, + serializer, + funcId: 273, + port: port_, + ); + }, + codec: SseCodec( + decodeSuccessData: sse_decode_list_String, + decodeErrorData: sse_decode_AnyhowException, + ), + constMeta: kCrateApiApiValidateCertConstMeta, + argValues: [conn, user], + apiImpl: this, + ), + ); + } - RustArcIncrementStrongCountFnType - get rust_arc_increment_strong_count_ArcStatusKitClientDefaultAnisetteProvider => - wire.rust_arc_increment_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcStatusKitClientDefaultAnisetteProvider; + TaskConstMeta get kCrateApiApiValidateCertConstMeta => const TaskConstMeta( + debugName: "validate_cert", + argNames: ["conn", "user"], + ); - RustArcDecrementStrongCountFnType - get rust_arc_decrement_strong_count_ArcStatusKitClientDefaultAnisetteProvider => - wire.rust_arc_decrement_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcStatusKitClientDefaultAnisetteProvider; + @override + Future crateApiApiValidateRelay({ + required JoinedOsConfig configRef, + }) { + return handler.executeNormal( + NormalTask( + callFfi: (port_) { + final serializer = SseSerializer(generalizedFrbRustBinding); + sse_encode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerJoinedOSConfig( + configRef, + serializer, + ); + pdeCallFfi( + generalizedFrbRustBinding, + serializer, + funcId: 274, + port: port_, + ); + }, + codec: SseCodec( + decodeSuccessData: sse_decode_opt_String, + decodeErrorData: sse_decode_AnyhowException, + ), + constMeta: kCrateApiApiValidateRelayConstMeta, + argValues: [configRef], + apiImpl: this, + ), + ); + } - RustArcIncrementStrongCountFnType - get rust_arc_increment_strong_count_ArcTokenProviderDefaultAnisetteProvider => - wire.rust_arc_increment_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcTokenProviderDefaultAnisetteProvider; + TaskConstMeta get kCrateApiApiValidateRelayConstMeta => + const TaskConstMeta(debugName: "validate_relay", argNames: ["configRef"]); - RustArcDecrementStrongCountFnType - get rust_arc_decrement_strong_count_ArcTokenProviderDefaultAnisetteProvider => - wire.rust_arc_decrement_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcTokenProviderDefaultAnisetteProvider; + @override + Future> crateApiApiValidateTargets({ + required ArcImClient state, + required List targets, + required String sender, + }) { + return handler.executeNormal( + NormalTask( + callFfi: (port_) { + final serializer = SseSerializer(generalizedFrbRustBinding); + sse_encode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcIMClient( + state, + serializer, + ); + sse_encode_list_String(targets, serializer); + sse_encode_String(sender, serializer); + pdeCallFfi( + generalizedFrbRustBinding, + serializer, + funcId: 275, + port: port_, + ); + }, + codec: SseCodec( + decodeSuccessData: sse_decode_list_String, + decodeErrorData: sse_decode_AnyhowException, + ), + constMeta: kCrateApiApiValidateTargetsConstMeta, + argValues: [state, targets, sender], + apiImpl: this, + ), + ); + } - RustArcIncrementStrongCountFnType get rust_arc_increment_strong_count_Asset => - wire.rust_arc_increment_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerAsset; + TaskConstMeta get kCrateApiApiValidateTargetsConstMeta => const TaskConstMeta( + debugName: "validate_targets", + argNames: ["state", "targets", "sender"], + ); - RustArcDecrementStrongCountFnType get rust_arc_decrement_strong_count_Asset => - wire.rust_arc_decrement_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerAsset; + @override + Future> crateApiApiValidateTargetsFacetime({ + required ArcImClient state, + required List targets, + required String sender, + }) { + return handler.executeNormal( + NormalTask( + callFfi: (port_) { + final serializer = SseSerializer(generalizedFrbRustBinding); + sse_encode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcIMClient( + state, + serializer, + ); + sse_encode_list_String(targets, serializer); + sse_encode_String(sender, serializer); + pdeCallFfi( + generalizedFrbRustBinding, + serializer, + funcId: 276, + port: port_, + ); + }, + codec: SseCodec( + decodeSuccessData: sse_decode_list_String, + decodeErrorData: sse_decode_AnyhowException, + ), + constMeta: kCrateApiApiValidateTargetsFacetimeConstMeta, + argValues: [state, targets, sender], + apiImpl: this, + ), + ); + } - RustArcIncrementStrongCountFnType - get rust_arc_increment_strong_count_ChannelInterestToken => wire - .rust_arc_increment_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerChannelInterestToken; + TaskConstMeta get kCrateApiApiValidateTargetsFacetimeConstMeta => + const TaskConstMeta( + debugName: "validate_targets_facetime", + argNames: ["state", "targets", "sender"], + ); - RustArcDecrementStrongCountFnType - get rust_arc_decrement_strong_count_ChannelInterestToken => wire - .rust_arc_decrement_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerChannelInterestToken; + @override + Future<(LoginState, IdsUser?)> crateApiApiVerify2Fa({ + required String path, + required CircleClientSessionDefaultAnisetteProvider client, + required ArcAnisetteClientDefaultAnisetteProvider anisette, + required JoinedOsConfig osConfig, + required ArcMutexAppleAccountDefaultAnisetteProvider account, + required ReceiverApsMessage watcher, + required ArcIdmsAuthListener idms, + required String code, + }) { + return handler.executeNormal( + NormalTask( + callFfi: (port_) { + final serializer = SseSerializer(generalizedFrbRustBinding); + sse_encode_String(path, serializer); + sse_encode_Auto_RefMut_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerCircleClientSessionDefaultAnisetteProvider( + client, + serializer, + ); + sse_encode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcAnisetteClientDefaultAnisetteProvider( + anisette, + serializer, + ); + sse_encode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerJoinedOSConfig( + osConfig, + serializer, + ); + sse_encode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcMutexAppleAccountDefaultAnisetteProvider( + account, + serializer, + ); + sse_encode_Auto_RefMut_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerReceiverAPSMessage( + watcher, + serializer, + ); + sse_encode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcIdmsAuthListener( + idms, + serializer, + ); + sse_encode_String(code, serializer); + pdeCallFfi( + generalizedFrbRustBinding, + serializer, + funcId: 277, + port: port_, + ); + }, + codec: SseCodec( + decodeSuccessData: + sse_decode_record_login_state_opt_box_autoadd_auto_owned_rust_opaque_flutter_rust_bridgefor_generated_rust_auto_opaque_inner_ids_user, + decodeErrorData: sse_decode_AnyhowException, + ), + constMeta: kCrateApiApiVerify2FaConstMeta, + argValues: [ + path, + client, + anisette, + osConfig, + account, + watcher, + idms, + code, + ], + apiImpl: this, + ), + ); + } - RustArcIncrementStrongCountFnType - get rust_arc_increment_strong_count_CircleClientSessionDefaultAnisetteProvider => - wire.rust_arc_increment_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerCircleClientSessionDefaultAnisetteProvider; + TaskConstMeta get kCrateApiApiVerify2FaConstMeta => const TaskConstMeta( + debugName: "verify_2fa", + argNames: [ + "path", + "client", + "anisette", + "osConfig", + "account", + "watcher", + "idms", + "code", + ], + ); - RustArcDecrementStrongCountFnType - get rust_arc_decrement_strong_count_CircleClientSessionDefaultAnisetteProvider => - wire.rust_arc_decrement_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerCircleClientSessionDefaultAnisetteProvider; + @override + Future<(LoginState, IdsUser?)> crateApiApiVerify2FaSms({ + required String path, + required ArcMutexAppleAccountDefaultAnisetteProvider accountMut, + required ArcAnisetteClientDefaultAnisetteProvider anisette, + required JoinedOsConfig config, + required VerifyBody body, + required String code, + }) { + return handler.executeNormal( + NormalTask( + callFfi: (port_) { + final serializer = SseSerializer(generalizedFrbRustBinding); + sse_encode_String(path, serializer); + sse_encode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcMutexAppleAccountDefaultAnisetteProvider( + accountMut, + serializer, + ); + sse_encode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcAnisetteClientDefaultAnisetteProvider( + anisette, + serializer, + ); + sse_encode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerJoinedOSConfig( + config, + serializer, + ); + sse_encode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerVerifyBody( + body, + serializer, + ); + sse_encode_String(code, serializer); + pdeCallFfi( + generalizedFrbRustBinding, + serializer, + funcId: 278, + port: port_, + ); + }, + codec: SseCodec( + decodeSuccessData: + sse_decode_record_login_state_opt_box_autoadd_auto_owned_rust_opaque_flutter_rust_bridgefor_generated_rust_auto_opaque_inner_ids_user, + decodeErrorData: sse_decode_AnyhowException, + ), + constMeta: kCrateApiApiVerify2FaSmsConstMeta, + argValues: [path, accountMut, anisette, config, body, code], + apiImpl: this, + ), + ); + } - RustArcIncrementStrongCountFnType - get rust_arc_increment_strong_count_ConversationLink => wire - .rust_arc_increment_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerConversationLink; + TaskConstMeta get kCrateApiApiVerify2FaSmsConstMeta => const TaskConstMeta( + debugName: "verify_2fa_sms", + argNames: ["path", "accountMut", "anisette", "config", "body", "code"], + ); + + Future Function(int, dynamic) + encode_DartFn_Inputs_String_Output_String_AnyhowException( + FutureOr Function(String) raw, + ) { + return (callId, rawArg0) async { + final arg0 = dco_decode_String(rawArg0); + + Box? rawOutput; + Box? rawError; + try { + rawOutput = Box(await raw(arg0)); + } catch (e, s) { + rawError = Box(AnyhowException("$e\n\n$s")); + } + + final serializer = SseSerializer(generalizedFrbRustBinding); + assert((rawOutput != null) ^ (rawError != null)); + if (rawOutput != null) { + serializer.buffer.putUint8(0); + sse_encode_String(rawOutput.value, serializer); + } else { + serializer.buffer.putUint8(1); + sse_encode_AnyhowException(rawError!.value, serializer); + } + final output = serializer.intoRaw(); + + generalizedFrbRustBinding.dartFnDeliverOutput( + callId: callId, + ptr: output.ptr, + rustVecLen: output.rustVecLen, + dataLen: output.dataLen, + ); + }; + } + + RustArcIncrementStrongCountFnType + get rust_arc_increment_strong_count_ApsConnection => wire + .rust_arc_increment_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerAPSConnection; + + RustArcDecrementStrongCountFnType + get rust_arc_decrement_strong_count_ApsConnection => wire + .rust_arc_decrement_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerAPSConnection; + + RustArcIncrementStrongCountFnType + get rust_arc_increment_strong_count_ApsState => wire + .rust_arc_increment_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerAPSState; + + RustArcDecrementStrongCountFnType + get rust_arc_decrement_strong_count_ApsState => wire + .rust_arc_decrement_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerAPSState; + + RustArcIncrementStrongCountFnType + get rust_arc_increment_strong_count_ApsWatcher => wire + .rust_arc_increment_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerAPSWatcher; + + RustArcDecrementStrongCountFnType + get rust_arc_decrement_strong_count_ApsWatcher => wire + .rust_arc_decrement_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerAPSWatcher; + + RustArcIncrementStrongCountFnType + get rust_arc_increment_strong_count_ArcAnisetteClientDefaultAnisetteProvider => + wire.rust_arc_increment_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcAnisetteClientDefaultAnisetteProvider; + + RustArcDecrementStrongCountFnType + get rust_arc_decrement_strong_count_ArcAnisetteClientDefaultAnisetteProvider => + wire.rust_arc_decrement_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcAnisetteClientDefaultAnisetteProvider; + + RustArcIncrementStrongCountFnType + get rust_arc_increment_strong_count_ArcCloudKitClientDefaultAnisetteProvider => + wire.rust_arc_increment_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcCloudKitClientDefaultAnisetteProvider; + + RustArcDecrementStrongCountFnType + get rust_arc_decrement_strong_count_ArcCloudKitClientDefaultAnisetteProvider => + wire.rust_arc_decrement_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcCloudKitClientDefaultAnisetteProvider; + + RustArcIncrementStrongCountFnType + get rust_arc_increment_strong_count_ArcCloudMessagesClientDefaultAnisetteProvider => + wire.rust_arc_increment_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcCloudMessagesClientDefaultAnisetteProvider; + + RustArcDecrementStrongCountFnType + get rust_arc_decrement_strong_count_ArcCloudMessagesClientDefaultAnisetteProvider => + wire.rust_arc_decrement_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcCloudMessagesClientDefaultAnisetteProvider; + + RustArcIncrementStrongCountFnType + get rust_arc_increment_strong_count_ArcFtClient => wire + .rust_arc_increment_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcFTClient; + + RustArcDecrementStrongCountFnType + get rust_arc_decrement_strong_count_ArcFtClient => wire + .rust_arc_decrement_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcFTClient; + + RustArcIncrementStrongCountFnType + get rust_arc_increment_strong_count_ArcFindMyClientDefaultAnisetteProvider => + wire.rust_arc_increment_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcFindMyClientDefaultAnisetteProvider; + + RustArcDecrementStrongCountFnType + get rust_arc_decrement_strong_count_ArcFindMyClientDefaultAnisetteProvider => + wire.rust_arc_decrement_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcFindMyClientDefaultAnisetteProvider; + + RustArcIncrementStrongCountFnType + get rust_arc_increment_strong_count_ArcImClient => wire + .rust_arc_increment_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcIMClient; + + RustArcDecrementStrongCountFnType + get rust_arc_decrement_strong_count_ArcImClient => wire + .rust_arc_decrement_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcIMClient; + + RustArcIncrementStrongCountFnType + get rust_arc_increment_strong_count_ArcIdmsAuthListener => wire + .rust_arc_increment_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcIdmsAuthListener; + + RustArcDecrementStrongCountFnType + get rust_arc_decrement_strong_count_ArcIdmsAuthListener => wire + .rust_arc_decrement_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcIdmsAuthListener; + + RustArcIncrementStrongCountFnType + get rust_arc_increment_strong_count_ArcKeychainClientDefaultAnisetteProvider => + wire.rust_arc_increment_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcKeychainClientDefaultAnisetteProvider; + + RustArcDecrementStrongCountFnType + get rust_arc_decrement_strong_count_ArcKeychainClientDefaultAnisetteProvider => + wire.rust_arc_decrement_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcKeychainClientDefaultAnisetteProvider; + + RustArcIncrementStrongCountFnType + get rust_arc_increment_strong_count_ArcMutexAppleAccountDefaultAnisetteProvider => + wire.rust_arc_increment_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcMutexAppleAccountDefaultAnisetteProvider; + + RustArcDecrementStrongCountFnType + get rust_arc_decrement_strong_count_ArcMutexAppleAccountDefaultAnisetteProvider => + wire.rust_arc_decrement_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcMutexAppleAccountDefaultAnisetteProvider; + + RustArcIncrementStrongCountFnType + get rust_arc_increment_strong_count_ArcMutexOptionCircleClientSessionDefaultAnisetteProvider => + wire.rust_arc_increment_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcMutexOptionCircleClientSessionDefaultAnisetteProvider; + + RustArcDecrementStrongCountFnType + get rust_arc_decrement_strong_count_ArcMutexOptionCircleClientSessionDefaultAnisetteProvider => + wire.rust_arc_decrement_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcMutexOptionCircleClientSessionDefaultAnisetteProvider; + + RustArcIncrementStrongCountFnType + get rust_arc_increment_strong_count_ArcMutexVecActiveCircleSession => wire + .rust_arc_increment_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcMutexVecActiveCircleSession; + + RustArcDecrementStrongCountFnType + get rust_arc_decrement_strong_count_ArcMutexVecActiveCircleSession => wire + .rust_arc_decrement_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcMutexVecActiveCircleSession; + + RustArcIncrementStrongCountFnType + get rust_arc_increment_strong_count_ArcPasswordManagerDefaultAnisetteProvider => + wire.rust_arc_increment_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcPasswordManagerDefaultAnisetteProvider; + + RustArcDecrementStrongCountFnType + get rust_arc_decrement_strong_count_ArcPasswordManagerDefaultAnisetteProvider => + wire.rust_arc_decrement_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcPasswordManagerDefaultAnisetteProvider; + + RustArcIncrementStrongCountFnType + get rust_arc_increment_strong_count_ArcProfilesClientDefaultAnisetteProvider => + wire.rust_arc_increment_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcProfilesClientDefaultAnisetteProvider; + + RustArcDecrementStrongCountFnType + get rust_arc_decrement_strong_count_ArcProfilesClientDefaultAnisetteProvider => + wire.rust_arc_decrement_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcProfilesClientDefaultAnisetteProvider; + + RustArcIncrementStrongCountFnType + get rust_arc_increment_strong_count_ArcSenderPushMessage => wire + .rust_arc_increment_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcSenderPushMessage; + + RustArcDecrementStrongCountFnType + get rust_arc_decrement_strong_count_ArcSenderPushMessage => wire + .rust_arc_decrement_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcSenderPushMessage; + + RustArcIncrementStrongCountFnType + get rust_arc_increment_strong_count_ArcSharedPushState => wire + .rust_arc_increment_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcSharedPushState; + + RustArcDecrementStrongCountFnType + get rust_arc_decrement_strong_count_ArcSharedPushState => wire + .rust_arc_decrement_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcSharedPushState; + + RustArcIncrementStrongCountFnType + get rust_arc_increment_strong_count_ArcStatusKitClientDefaultAnisetteProvider => + wire.rust_arc_increment_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcStatusKitClientDefaultAnisetteProvider; + + RustArcDecrementStrongCountFnType + get rust_arc_decrement_strong_count_ArcStatusKitClientDefaultAnisetteProvider => + wire.rust_arc_decrement_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcStatusKitClientDefaultAnisetteProvider; + + RustArcIncrementStrongCountFnType + get rust_arc_increment_strong_count_ArcTokenProviderDefaultAnisetteProvider => + wire.rust_arc_increment_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcTokenProviderDefaultAnisetteProvider; + + RustArcDecrementStrongCountFnType + get rust_arc_decrement_strong_count_ArcTokenProviderDefaultAnisetteProvider => + wire.rust_arc_decrement_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcTokenProviderDefaultAnisetteProvider; + + RustArcIncrementStrongCountFnType + get rust_arc_increment_strong_count_Asset => wire + .rust_arc_increment_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerAsset; + + RustArcDecrementStrongCountFnType + get rust_arc_decrement_strong_count_Asset => wire + .rust_arc_decrement_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerAsset; + + RustArcIncrementStrongCountFnType + get rust_arc_increment_strong_count_ChannelInterestToken => wire + .rust_arc_increment_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerChannelInterestToken; + + RustArcDecrementStrongCountFnType + get rust_arc_decrement_strong_count_ChannelInterestToken => wire + .rust_arc_decrement_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerChannelInterestToken; + + RustArcIncrementStrongCountFnType + get rust_arc_increment_strong_count_CircleClientSessionDefaultAnisetteProvider => + wire.rust_arc_increment_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerCircleClientSessionDefaultAnisetteProvider; + + RustArcDecrementStrongCountFnType + get rust_arc_decrement_strong_count_CircleClientSessionDefaultAnisetteProvider => + wire.rust_arc_decrement_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerCircleClientSessionDefaultAnisetteProvider; + + RustArcIncrementStrongCountFnType + get rust_arc_increment_strong_count_CloudSyncPreparedMessageCreateHandle => wire + .rust_arc_increment_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerCloudSyncPreparedMessageCreateHandle; + + RustArcDecrementStrongCountFnType + get rust_arc_decrement_strong_count_CloudSyncPreparedMessageCreateHandle => wire + .rust_arc_decrement_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerCloudSyncPreparedMessageCreateHandle; + + RustArcIncrementStrongCountFnType + get rust_arc_increment_strong_count_ConversationLink => wire + .rust_arc_increment_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerConversationLink; RustArcDecrementStrongCountFnType - get rust_arc_decrement_strong_count_ConversationLink => wire - .rust_arc_decrement_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerConversationLink; + get rust_arc_decrement_strong_count_ConversationLink => wire + .rust_arc_decrement_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerConversationLink; RustArcIncrementStrongCountFnType - get rust_arc_increment_strong_count_ConversationParticipant => wire - .rust_arc_increment_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerConversationParticipant; + get rust_arc_increment_strong_count_ConversationParticipant => wire + .rust_arc_increment_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerConversationParticipant; RustArcDecrementStrongCountFnType - get rust_arc_decrement_strong_count_ConversationParticipant => wire - .rust_arc_decrement_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerConversationParticipant; + get rust_arc_decrement_strong_count_ConversationParticipant => wire + .rust_arc_decrement_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerConversationParticipant; - RustArcIncrementStrongCountFnType get rust_arc_increment_strong_count_Date => - wire.rust_arc_increment_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerDate; + RustArcIncrementStrongCountFnType + get rust_arc_increment_strong_count_Date => wire + .rust_arc_increment_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerDate; - RustArcDecrementStrongCountFnType get rust_arc_decrement_strong_count_Date => - wire.rust_arc_decrement_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerDate; + RustArcDecrementStrongCountFnType + get rust_arc_decrement_strong_count_Date => wire + .rust_arc_decrement_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerDate; RustArcIncrementStrongCountFnType - get rust_arc_increment_strong_count_EscrowData => wire - .rust_arc_increment_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerEscrowData; + get rust_arc_increment_strong_count_EscrowData => wire + .rust_arc_increment_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerEscrowData; RustArcDecrementStrongCountFnType - get rust_arc_decrement_strong_count_EscrowData => wire - .rust_arc_decrement_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerEscrowData; + get rust_arc_decrement_strong_count_EscrowData => wire + .rust_arc_decrement_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerEscrowData; RustArcIncrementStrongCountFnType - get rust_arc_increment_strong_count_FindMyFriendsClientDefaultAnisetteProvider => - wire.rust_arc_increment_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerFindMyFriendsClientDefaultAnisetteProvider; + get rust_arc_increment_strong_count_FindMyFriendsClientDefaultAnisetteProvider => + wire.rust_arc_increment_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerFindMyFriendsClientDefaultAnisetteProvider; RustArcDecrementStrongCountFnType - get rust_arc_decrement_strong_count_FindMyFriendsClientDefaultAnisetteProvider => - wire.rust_arc_decrement_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerFindMyFriendsClientDefaultAnisetteProvider; + get rust_arc_decrement_strong_count_FindMyFriendsClientDefaultAnisetteProvider => + wire.rust_arc_decrement_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerFindMyFriendsClientDefaultAnisetteProvider; RustArcIncrementStrongCountFnType - get rust_arc_increment_strong_count_FindMyPhoneClientDefaultAnisetteProvider => - wire.rust_arc_increment_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerFindMyPhoneClientDefaultAnisetteProvider; + get rust_arc_increment_strong_count_FindMyPhoneClientDefaultAnisetteProvider => + wire.rust_arc_increment_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerFindMyPhoneClientDefaultAnisetteProvider; RustArcDecrementStrongCountFnType - get rust_arc_decrement_strong_count_FindMyPhoneClientDefaultAnisetteProvider => - wire.rust_arc_decrement_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerFindMyPhoneClientDefaultAnisetteProvider; + get rust_arc_decrement_strong_count_FindMyPhoneClientDefaultAnisetteProvider => + wire.rust_arc_decrement_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerFindMyPhoneClientDefaultAnisetteProvider; RustArcIncrementStrongCountFnType - get rust_arc_increment_strong_count_GZipWrapperAttachmentMeta => wire - .rust_arc_increment_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerGZipWrapperAttachmentMeta; + get rust_arc_increment_strong_count_GZipWrapperAttachmentMeta => wire + .rust_arc_increment_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerGZipWrapperAttachmentMeta; RustArcDecrementStrongCountFnType - get rust_arc_decrement_strong_count_GZipWrapperAttachmentMeta => wire - .rust_arc_decrement_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerGZipWrapperAttachmentMeta; + get rust_arc_decrement_strong_count_GZipWrapperAttachmentMeta => wire + .rust_arc_decrement_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerGZipWrapperAttachmentMeta; RustArcIncrementStrongCountFnType - get rust_arc_increment_strong_count_GZipWrapperChatProto => wire - .rust_arc_increment_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerGZipWrapperChatProto; + get rust_arc_increment_strong_count_GZipWrapperChatProto => wire + .rust_arc_increment_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerGZipWrapperChatProto; RustArcDecrementStrongCountFnType - get rust_arc_decrement_strong_count_GZipWrapperChatProto => wire - .rust_arc_decrement_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerGZipWrapperChatProto; + get rust_arc_decrement_strong_count_GZipWrapperChatProto => wire + .rust_arc_decrement_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerGZipWrapperChatProto; RustArcIncrementStrongCountFnType - get rust_arc_increment_strong_count_GZipWrapperMessageProto => wire - .rust_arc_increment_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerGZipWrapperMessageProto; + get rust_arc_increment_strong_count_GZipWrapperMessageProto => wire + .rust_arc_increment_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerGZipWrapperMessageProto; RustArcDecrementStrongCountFnType - get rust_arc_decrement_strong_count_GZipWrapperMessageProto => wire - .rust_arc_decrement_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerGZipWrapperMessageProto; + get rust_arc_decrement_strong_count_GZipWrapperMessageProto => wire + .rust_arc_decrement_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerGZipWrapperMessageProto; RustArcIncrementStrongCountFnType - get rust_arc_increment_strong_count_GZipWrapperMessageProto2 => wire - .rust_arc_increment_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerGZipWrapperMessageProto2; + get rust_arc_increment_strong_count_GZipWrapperMessageProto2 => wire + .rust_arc_increment_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerGZipWrapperMessageProto2; RustArcDecrementStrongCountFnType - get rust_arc_decrement_strong_count_GZipWrapperMessageProto2 => wire - .rust_arc_decrement_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerGZipWrapperMessageProto2; + get rust_arc_decrement_strong_count_GZipWrapperMessageProto2 => wire + .rust_arc_decrement_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerGZipWrapperMessageProto2; RustArcIncrementStrongCountFnType - get rust_arc_increment_strong_count_GZipWrapperMessageProto3 => wire - .rust_arc_increment_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerGZipWrapperMessageProto3; + get rust_arc_increment_strong_count_GZipWrapperMessageProto3 => wire + .rust_arc_increment_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerGZipWrapperMessageProto3; RustArcDecrementStrongCountFnType - get rust_arc_decrement_strong_count_GZipWrapperMessageProto3 => wire - .rust_arc_decrement_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerGZipWrapperMessageProto3; + get rust_arc_decrement_strong_count_GZipWrapperMessageProto3 => wire + .rust_arc_decrement_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerGZipWrapperMessageProto3; RustArcIncrementStrongCountFnType - get rust_arc_increment_strong_count_GZipWrapperMessageProto4 => wire - .rust_arc_increment_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerGZipWrapperMessageProto4; + get rust_arc_increment_strong_count_GZipWrapperMessageProto4 => wire + .rust_arc_increment_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerGZipWrapperMessageProto4; RustArcDecrementStrongCountFnType - get rust_arc_decrement_strong_count_GZipWrapperMessageProto4 => wire - .rust_arc_decrement_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerGZipWrapperMessageProto4; + get rust_arc_decrement_strong_count_GZipWrapperMessageProto4 => wire + .rust_arc_decrement_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerGZipWrapperMessageProto4; RustArcIncrementStrongCountFnType - get rust_arc_increment_strong_count_IdsngmIdentity => wire - .rust_arc_increment_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerIDSNGMIdentity; + get rust_arc_increment_strong_count_IdsngmIdentity => wire + .rust_arc_increment_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerIDSNGMIdentity; RustArcDecrementStrongCountFnType - get rust_arc_decrement_strong_count_IdsngmIdentity => wire - .rust_arc_decrement_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerIDSNGMIdentity; + get rust_arc_decrement_strong_count_IdsngmIdentity => wire + .rust_arc_decrement_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerIDSNGMIdentity; RustArcIncrementStrongCountFnType - get rust_arc_increment_strong_count_IdsUser => wire - .rust_arc_increment_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerIDSUser; + get rust_arc_increment_strong_count_IdsUser => wire + .rust_arc_increment_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerIDSUser; RustArcDecrementStrongCountFnType - get rust_arc_decrement_strong_count_IdsUser => wire - .rust_arc_decrement_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerIDSUser; + get rust_arc_decrement_strong_count_IdsUser => wire + .rust_arc_decrement_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerIDSUser; RustArcIncrementStrongCountFnType - get rust_arc_increment_strong_count_JoinedOsConfig => wire - .rust_arc_increment_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerJoinedOSConfig; + get rust_arc_increment_strong_count_JoinedOsConfig => wire + .rust_arc_increment_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerJoinedOSConfig; RustArcDecrementStrongCountFnType - get rust_arc_decrement_strong_count_JoinedOsConfig => wire - .rust_arc_decrement_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerJoinedOSConfig; + get rust_arc_decrement_strong_count_JoinedOsConfig => wire + .rust_arc_decrement_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerJoinedOSConfig; RustArcIncrementStrongCountFnType - get rust_arc_increment_strong_count_LocationReport => wire - .rust_arc_increment_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerLocationReport; + get rust_arc_increment_strong_count_LocationReport => wire + .rust_arc_increment_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerLocationReport; RustArcDecrementStrongCountFnType - get rust_arc_decrement_strong_count_LocationReport => wire - .rust_arc_decrement_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerLocationReport; + get rust_arc_decrement_strong_count_LocationReport => wire + .rust_arc_decrement_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerLocationReport; RustArcIncrementStrongCountFnType - get rust_arc_increment_strong_count_MessageFlags => wire - .rust_arc_increment_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerMessageFlags; + get rust_arc_increment_strong_count_MessageFlags => wire + .rust_arc_increment_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerMessageFlags; RustArcDecrementStrongCountFnType - get rust_arc_decrement_strong_count_MessageFlags => wire - .rust_arc_decrement_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerMessageFlags; + get rust_arc_decrement_strong_count_MessageFlags => wire + .rust_arc_decrement_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerMessageFlags; RustArcIncrementStrongCountFnType - get rust_arc_increment_strong_count_NsArrayLpIconMetadata => wire - .rust_arc_increment_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerNSArrayLPIconMetadata; + get rust_arc_increment_strong_count_NsArrayLpIconMetadata => wire + .rust_arc_increment_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerNSArrayLPIconMetadata; RustArcDecrementStrongCountFnType - get rust_arc_decrement_strong_count_NsArrayLpIconMetadata => wire - .rust_arc_decrement_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerNSArrayLPIconMetadata; + get rust_arc_decrement_strong_count_NsArrayLpIconMetadata => wire + .rust_arc_decrement_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerNSArrayLPIconMetadata; RustArcIncrementStrongCountFnType - get rust_arc_increment_strong_count_NsArrayLpImageMetadata => wire - .rust_arc_increment_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerNSArrayLPImageMetadata; + get rust_arc_increment_strong_count_NsArrayLpImageMetadata => wire + .rust_arc_increment_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerNSArrayLPImageMetadata; RustArcDecrementStrongCountFnType - get rust_arc_decrement_strong_count_NsArrayLpImageMetadata => wire - .rust_arc_decrement_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerNSArrayLPImageMetadata; + get rust_arc_decrement_strong_count_NsArrayLpImageMetadata => wire + .rust_arc_decrement_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerNSArrayLPImageMetadata; RustArcIncrementStrongCountFnType - get rust_arc_increment_strong_count_PushError => wire - .rust_arc_increment_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerPushError; + get rust_arc_increment_strong_count_PushError => wire + .rust_arc_increment_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerPushError; RustArcDecrementStrongCountFnType - get rust_arc_decrement_strong_count_PushError => wire - .rust_arc_decrement_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerPushError; + get rust_arc_decrement_strong_count_PushError => wire + .rust_arc_decrement_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerPushError; RustArcIncrementStrongCountFnType - get rust_arc_increment_strong_count_ReceiverApsMessage => wire - .rust_arc_increment_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerReceiverAPSMessage; + get rust_arc_increment_strong_count_ReceiverApsMessage => wire + .rust_arc_increment_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerReceiverAPSMessage; RustArcDecrementStrongCountFnType - get rust_arc_decrement_strong_count_ReceiverApsMessage => wire - .rust_arc_decrement_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerReceiverAPSMessage; + get rust_arc_decrement_strong_count_ReceiverApsMessage => wire + .rust_arc_decrement_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerReceiverAPSMessage; RustArcIncrementStrongCountFnType - get rust_arc_increment_strong_count_SavedHardwareState => wire - .rust_arc_increment_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerSavedHardwareState; + get rust_arc_increment_strong_count_SavedHardwareState => wire + .rust_arc_increment_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerSavedHardwareState; RustArcDecrementStrongCountFnType - get rust_arc_decrement_strong_count_SavedHardwareState => wire - .rust_arc_decrement_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerSavedHardwareState; + get rust_arc_decrement_strong_count_SavedHardwareState => wire + .rust_arc_decrement_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerSavedHardwareState; RustArcIncrementStrongCountFnType - get rust_arc_increment_strong_count_Sender => wire - .rust_arc_increment_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerSender; + get rust_arc_increment_strong_count_Sender => wire + .rust_arc_increment_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerSender; RustArcDecrementStrongCountFnType - get rust_arc_decrement_strong_count_Sender => wire - .rust_arc_decrement_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerSender; + get rust_arc_decrement_strong_count_Sender => wire + .rust_arc_decrement_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerSender; RustArcIncrementStrongCountFnType - get rust_arc_increment_strong_count_StCollapsedValue => wire - .rust_arc_increment_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerStCollapsedValue; + get rust_arc_increment_strong_count_StCollapsedValue => wire + .rust_arc_increment_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerStCollapsedValue; RustArcDecrementStrongCountFnType - get rust_arc_decrement_strong_count_StCollapsedValue => wire - .rust_arc_decrement_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerStCollapsedValue; + get rust_arc_decrement_strong_count_StCollapsedValue => wire + .rust_arc_decrement_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerStCollapsedValue; RustArcIncrementStrongCountFnType - get rust_arc_increment_strong_count_SyncManagerDefaultAnisetteProviderMyFilePackager => - wire.rust_arc_increment_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerSyncManagerDefaultAnisetteProviderMyFilePackager; + get rust_arc_increment_strong_count_SyncManagerDefaultAnisetteProviderMyFilePackager => + wire.rust_arc_increment_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerSyncManagerDefaultAnisetteProviderMyFilePackager; RustArcDecrementStrongCountFnType - get rust_arc_decrement_strong_count_SyncManagerDefaultAnisetteProviderMyFilePackager => - wire.rust_arc_decrement_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerSyncManagerDefaultAnisetteProviderMyFilePackager; + get rust_arc_decrement_strong_count_SyncManagerDefaultAnisetteProviderMyFilePackager => + wire.rust_arc_decrement_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerSyncManagerDefaultAnisetteProviderMyFilePackager; RustArcIncrementStrongCountFnType - get rust_arc_increment_strong_count_SystemTime => wire - .rust_arc_increment_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerSystemTime; + get rust_arc_increment_strong_count_SystemTime => wire + .rust_arc_increment_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerSystemTime; RustArcDecrementStrongCountFnType - get rust_arc_decrement_strong_count_SystemTime => wire - .rust_arc_decrement_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerSystemTime; + get rust_arc_decrement_strong_count_SystemTime => wire + .rust_arc_decrement_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerSystemTime; RustArcIncrementStrongCountFnType - get rust_arc_increment_strong_count_VerifyBody => wire - .rust_arc_increment_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerVerifyBody; + get rust_arc_increment_strong_count_VerifyBody => wire + .rust_arc_increment_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerVerifyBody; RustArcDecrementStrongCountFnType - get rust_arc_decrement_strong_count_VerifyBody => wire - .rust_arc_decrement_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerVerifyBody; + get rust_arc_decrement_strong_count_VerifyBody => wire + .rust_arc_decrement_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerVerifyBody; RustArcIncrementStrongCountFnType - get rust_arc_increment_strong_count_ViableBottle => wire - .rust_arc_increment_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerViableBottle; + get rust_arc_increment_strong_count_ViableBottle => wire + .rust_arc_increment_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerViableBottle; RustArcDecrementStrongCountFnType - get rust_arc_decrement_strong_count_ViableBottle => wire - .rust_arc_decrement_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerViableBottle; + get rust_arc_decrement_strong_count_ViableBottle => wire + .rust_arc_decrement_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerViableBottle; @protected AnyhowException dco_decode_AnyhowException(dynamic raw) { @@ -9250,812 +12594,974 @@ class RustLibApiImpl extends RustLibApiImplPlatform implements RustLibApi { @protected ApsConnection - dco_decode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerAPSConnection( - dynamic raw) { + dco_decode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerAPSConnection( + dynamic raw, + ) { // Codec=Dco (DartCObject based), see doc to use other codecs return ApsConnectionImpl.frbInternalDcoDecode(raw as List); } @protected ApsState - dco_decode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerAPSState( - dynamic raw) { + dco_decode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerAPSState( + dynamic raw, + ) { // Codec=Dco (DartCObject based), see doc to use other codecs return ApsStateImpl.frbInternalDcoDecode(raw as List); } @protected ApsWatcher - dco_decode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerAPSWatcher( - dynamic raw) { + dco_decode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerAPSWatcher( + dynamic raw, + ) { // Codec=Dco (DartCObject based), see doc to use other codecs return ApsWatcherImpl.frbInternalDcoDecode(raw as List); } @protected ArcAnisetteClientDefaultAnisetteProvider - dco_decode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcAnisetteClientDefaultAnisetteProvider( - dynamic raw) { + dco_decode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcAnisetteClientDefaultAnisetteProvider( + dynamic raw, + ) { // Codec=Dco (DartCObject based), see doc to use other codecs return ArcAnisetteClientDefaultAnisetteProviderImpl.frbInternalDcoDecode( - raw as List); + raw as List, + ); } @protected ArcCloudKitClientDefaultAnisetteProvider - dco_decode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcCloudKitClientDefaultAnisetteProvider( - dynamic raw) { + dco_decode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcCloudKitClientDefaultAnisetteProvider( + dynamic raw, + ) { // Codec=Dco (DartCObject based), see doc to use other codecs return ArcCloudKitClientDefaultAnisetteProviderImpl.frbInternalDcoDecode( - raw as List); + raw as List, + ); } @protected ArcCloudMessagesClientDefaultAnisetteProvider - dco_decode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcCloudMessagesClientDefaultAnisetteProvider( - dynamic raw) { + dco_decode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcCloudMessagesClientDefaultAnisetteProvider( + dynamic raw, + ) { // Codec=Dco (DartCObject based), see doc to use other codecs - return ArcCloudMessagesClientDefaultAnisetteProviderImpl - .frbInternalDcoDecode(raw as List); + return ArcCloudMessagesClientDefaultAnisetteProviderImpl.frbInternalDcoDecode( + raw as List, + ); } @protected ArcFtClient - dco_decode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcFTClient( - dynamic raw) { + dco_decode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcFTClient( + dynamic raw, + ) { // Codec=Dco (DartCObject based), see doc to use other codecs return ArcFtClientImpl.frbInternalDcoDecode(raw as List); } @protected ArcFindMyClientDefaultAnisetteProvider - dco_decode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcFindMyClientDefaultAnisetteProvider( - dynamic raw) { + dco_decode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcFindMyClientDefaultAnisetteProvider( + dynamic raw, + ) { // Codec=Dco (DartCObject based), see doc to use other codecs return ArcFindMyClientDefaultAnisetteProviderImpl.frbInternalDcoDecode( - raw as List); + raw as List, + ); } @protected ArcImClient - dco_decode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcIMClient( - dynamic raw) { + dco_decode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcIMClient( + dynamic raw, + ) { // Codec=Dco (DartCObject based), see doc to use other codecs return ArcImClientImpl.frbInternalDcoDecode(raw as List); } @protected ArcIdmsAuthListener - dco_decode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcIdmsAuthListener( - dynamic raw) { + dco_decode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcIdmsAuthListener( + dynamic raw, + ) { // Codec=Dco (DartCObject based), see doc to use other codecs return ArcIdmsAuthListenerImpl.frbInternalDcoDecode(raw as List); } @protected ArcKeychainClientDefaultAnisetteProvider - dco_decode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcKeychainClientDefaultAnisetteProvider( - dynamic raw) { + dco_decode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcKeychainClientDefaultAnisetteProvider( + dynamic raw, + ) { // Codec=Dco (DartCObject based), see doc to use other codecs return ArcKeychainClientDefaultAnisetteProviderImpl.frbInternalDcoDecode( - raw as List); + raw as List, + ); } @protected ArcMutexAppleAccountDefaultAnisetteProvider - dco_decode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcMutexAppleAccountDefaultAnisetteProvider( - dynamic raw) { + dco_decode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcMutexAppleAccountDefaultAnisetteProvider( + dynamic raw, + ) { // Codec=Dco (DartCObject based), see doc to use other codecs return ArcMutexAppleAccountDefaultAnisetteProviderImpl.frbInternalDcoDecode( - raw as List); + raw as List, + ); } @protected ArcMutexOptionCircleClientSessionDefaultAnisetteProvider - dco_decode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcMutexOptionCircleClientSessionDefaultAnisetteProvider( - dynamic raw) { + dco_decode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcMutexOptionCircleClientSessionDefaultAnisetteProvider( + dynamic raw, + ) { // Codec=Dco (DartCObject based), see doc to use other codecs - return ArcMutexOptionCircleClientSessionDefaultAnisetteProviderImpl - .frbInternalDcoDecode(raw as List); + return ArcMutexOptionCircleClientSessionDefaultAnisetteProviderImpl.frbInternalDcoDecode( + raw as List, + ); } @protected ArcMutexVecActiveCircleSession - dco_decode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcMutexVecActiveCircleSession( - dynamic raw) { + dco_decode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcMutexVecActiveCircleSession( + dynamic raw, + ) { // Codec=Dco (DartCObject based), see doc to use other codecs return ArcMutexVecActiveCircleSessionImpl.frbInternalDcoDecode( - raw as List); + raw as List, + ); } @protected ArcPasswordManagerDefaultAnisetteProvider - dco_decode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcPasswordManagerDefaultAnisetteProvider( - dynamic raw) { + dco_decode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcPasswordManagerDefaultAnisetteProvider( + dynamic raw, + ) { // Codec=Dco (DartCObject based), see doc to use other codecs return ArcPasswordManagerDefaultAnisetteProviderImpl.frbInternalDcoDecode( - raw as List); + raw as List, + ); } @protected ArcProfilesClientDefaultAnisetteProvider - dco_decode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcProfilesClientDefaultAnisetteProvider( - dynamic raw) { + dco_decode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcProfilesClientDefaultAnisetteProvider( + dynamic raw, + ) { // Codec=Dco (DartCObject based), see doc to use other codecs return ArcProfilesClientDefaultAnisetteProviderImpl.frbInternalDcoDecode( - raw as List); + raw as List, + ); } @protected ArcSenderPushMessage - dco_decode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcSenderPushMessage( - dynamic raw) { + dco_decode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcSenderPushMessage( + dynamic raw, + ) { // Codec=Dco (DartCObject based), see doc to use other codecs return ArcSenderPushMessageImpl.frbInternalDcoDecode(raw as List); } @protected ArcSharedPushState - dco_decode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcSharedPushState( - dynamic raw) { + dco_decode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcSharedPushState( + dynamic raw, + ) { // Codec=Dco (DartCObject based), see doc to use other codecs return ArcSharedPushStateImpl.frbInternalDcoDecode(raw as List); } @protected ArcStatusKitClientDefaultAnisetteProvider - dco_decode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcStatusKitClientDefaultAnisetteProvider( - dynamic raw) { + dco_decode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcStatusKitClientDefaultAnisetteProvider( + dynamic raw, + ) { // Codec=Dco (DartCObject based), see doc to use other codecs return ArcStatusKitClientDefaultAnisetteProviderImpl.frbInternalDcoDecode( - raw as List); + raw as List, + ); } @protected ArcTokenProviderDefaultAnisetteProvider - dco_decode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcTokenProviderDefaultAnisetteProvider( - dynamic raw) { + dco_decode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcTokenProviderDefaultAnisetteProvider( + dynamic raw, + ) { // Codec=Dco (DartCObject based), see doc to use other codecs return ArcTokenProviderDefaultAnisetteProviderImpl.frbInternalDcoDecode( - raw as List); + raw as List, + ); } @protected Asset - dco_decode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerAsset( - dynamic raw) { + dco_decode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerAsset( + dynamic raw, + ) { // Codec=Dco (DartCObject based), see doc to use other codecs return AssetImpl.frbInternalDcoDecode(raw as List); } @protected ChannelInterestToken - dco_decode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerChannelInterestToken( - dynamic raw) { + dco_decode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerChannelInterestToken( + dynamic raw, + ) { // Codec=Dco (DartCObject based), see doc to use other codecs return ChannelInterestTokenImpl.frbInternalDcoDecode(raw as List); } @protected CircleClientSessionDefaultAnisetteProvider - dco_decode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerCircleClientSessionDefaultAnisetteProvider( - dynamic raw) { + dco_decode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerCircleClientSessionDefaultAnisetteProvider( + dynamic raw, + ) { // Codec=Dco (DartCObject based), see doc to use other codecs return CircleClientSessionDefaultAnisetteProviderImpl.frbInternalDcoDecode( - raw as List); + raw as List, + ); + } + + @protected + CloudSyncPreparedMessageCreateHandle + dco_decode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerCloudSyncPreparedMessageCreateHandle( + dynamic raw, + ) { + // Codec=Dco (DartCObject based), see doc to use other codecs + return CloudSyncPreparedMessageCreateHandleImpl.frbInternalDcoDecode( + raw as List, + ); } @protected ConversationLink - dco_decode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerConversationLink( - dynamic raw) { + dco_decode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerConversationLink( + dynamic raw, + ) { // Codec=Dco (DartCObject based), see doc to use other codecs return ConversationLinkImpl.frbInternalDcoDecode(raw as List); } @protected ConversationParticipant - dco_decode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerConversationParticipant( - dynamic raw) { + dco_decode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerConversationParticipant( + dynamic raw, + ) { // Codec=Dco (DartCObject based), see doc to use other codecs return ConversationParticipantImpl.frbInternalDcoDecode( - raw as List); + raw as List, + ); } @protected Date - dco_decode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerDate( - dynamic raw) { + dco_decode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerDate( + dynamic raw, + ) { // Codec=Dco (DartCObject based), see doc to use other codecs return DateImpl.frbInternalDcoDecode(raw as List); } @protected EscrowData - dco_decode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerEscrowData( - dynamic raw) { + dco_decode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerEscrowData( + dynamic raw, + ) { // Codec=Dco (DartCObject based), see doc to use other codecs return EscrowDataImpl.frbInternalDcoDecode(raw as List); } @protected FindMyFriendsClientDefaultAnisetteProvider - dco_decode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerFindMyFriendsClientDefaultAnisetteProvider( - dynamic raw) { + dco_decode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerFindMyFriendsClientDefaultAnisetteProvider( + dynamic raw, + ) { // Codec=Dco (DartCObject based), see doc to use other codecs return FindMyFriendsClientDefaultAnisetteProviderImpl.frbInternalDcoDecode( - raw as List); + raw as List, + ); } @protected FindMyPhoneClientDefaultAnisetteProvider - dco_decode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerFindMyPhoneClientDefaultAnisetteProvider( - dynamic raw) { + dco_decode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerFindMyPhoneClientDefaultAnisetteProvider( + dynamic raw, + ) { // Codec=Dco (DartCObject based), see doc to use other codecs return FindMyPhoneClientDefaultAnisetteProviderImpl.frbInternalDcoDecode( - raw as List); + raw as List, + ); } @protected GZipWrapperAttachmentMeta - dco_decode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerGZipWrapperAttachmentMeta( - dynamic raw) { + dco_decode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerGZipWrapperAttachmentMeta( + dynamic raw, + ) { // Codec=Dco (DartCObject based), see doc to use other codecs return GZipWrapperAttachmentMetaImpl.frbInternalDcoDecode( - raw as List); + raw as List, + ); } @protected GZipWrapperChatProto - dco_decode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerGZipWrapperChatProto( - dynamic raw) { + dco_decode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerGZipWrapperChatProto( + dynamic raw, + ) { // Codec=Dco (DartCObject based), see doc to use other codecs return GZipWrapperChatProtoImpl.frbInternalDcoDecode(raw as List); } @protected GZipWrapperMessageProto - dco_decode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerGZipWrapperMessageProto( - dynamic raw) { + dco_decode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerGZipWrapperMessageProto( + dynamic raw, + ) { // Codec=Dco (DartCObject based), see doc to use other codecs return GZipWrapperMessageProtoImpl.frbInternalDcoDecode( - raw as List); + raw as List, + ); } @protected GZipWrapperMessageProto2 - dco_decode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerGZipWrapperMessageProto2( - dynamic raw) { + dco_decode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerGZipWrapperMessageProto2( + dynamic raw, + ) { // Codec=Dco (DartCObject based), see doc to use other codecs return GZipWrapperMessageProto2Impl.frbInternalDcoDecode( - raw as List); + raw as List, + ); } @protected GZipWrapperMessageProto3 - dco_decode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerGZipWrapperMessageProto3( - dynamic raw) { + dco_decode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerGZipWrapperMessageProto3( + dynamic raw, + ) { // Codec=Dco (DartCObject based), see doc to use other codecs return GZipWrapperMessageProto3Impl.frbInternalDcoDecode( - raw as List); + raw as List, + ); } @protected GZipWrapperMessageProto4 - dco_decode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerGZipWrapperMessageProto4( - dynamic raw) { + dco_decode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerGZipWrapperMessageProto4( + dynamic raw, + ) { // Codec=Dco (DartCObject based), see doc to use other codecs return GZipWrapperMessageProto4Impl.frbInternalDcoDecode( - raw as List); + raw as List, + ); } @protected IdsngmIdentity - dco_decode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerIDSNGMIdentity( - dynamic raw) { + dco_decode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerIDSNGMIdentity( + dynamic raw, + ) { // Codec=Dco (DartCObject based), see doc to use other codecs return IdsngmIdentityImpl.frbInternalDcoDecode(raw as List); } @protected IdsUser - dco_decode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerIDSUser( - dynamic raw) { + dco_decode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerIDSUser( + dynamic raw, + ) { // Codec=Dco (DartCObject based), see doc to use other codecs return IdsUserImpl.frbInternalDcoDecode(raw as List); } @protected JoinedOsConfig - dco_decode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerJoinedOSConfig( - dynamic raw) { + dco_decode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerJoinedOSConfig( + dynamic raw, + ) { // Codec=Dco (DartCObject based), see doc to use other codecs return JoinedOsConfigImpl.frbInternalDcoDecode(raw as List); } @protected LocationReport - dco_decode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerLocationReport( - dynamic raw) { + dco_decode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerLocationReport( + dynamic raw, + ) { // Codec=Dco (DartCObject based), see doc to use other codecs return LocationReportImpl.frbInternalDcoDecode(raw as List); } @protected MessageFlags - dco_decode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerMessageFlags( - dynamic raw) { + dco_decode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerMessageFlags( + dynamic raw, + ) { // Codec=Dco (DartCObject based), see doc to use other codecs return MessageFlagsImpl.frbInternalDcoDecode(raw as List); } @protected NsArrayLpIconMetadata - dco_decode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerNSArrayLPIconMetadata( - dynamic raw) { + dco_decode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerNSArrayLPIconMetadata( + dynamic raw, + ) { // Codec=Dco (DartCObject based), see doc to use other codecs return NsArrayLpIconMetadataImpl.frbInternalDcoDecode(raw as List); } @protected NsArrayLpImageMetadata - dco_decode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerNSArrayLPImageMetadata( - dynamic raw) { + dco_decode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerNSArrayLPImageMetadata( + dynamic raw, + ) { // Codec=Dco (DartCObject based), see doc to use other codecs return NsArrayLpImageMetadataImpl.frbInternalDcoDecode( - raw as List); + raw as List, + ); } @protected PushError - dco_decode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerPushError( - dynamic raw) { + dco_decode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerPushError( + dynamic raw, + ) { // Codec=Dco (DartCObject based), see doc to use other codecs return PushErrorImpl.frbInternalDcoDecode(raw as List); } @protected ReceiverApsMessage - dco_decode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerReceiverAPSMessage( - dynamic raw) { + dco_decode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerReceiverAPSMessage( + dynamic raw, + ) { // Codec=Dco (DartCObject based), see doc to use other codecs return ReceiverApsMessageImpl.frbInternalDcoDecode(raw as List); } @protected SavedHardwareState - dco_decode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerSavedHardwareState( - dynamic raw) { + dco_decode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerSavedHardwareState( + dynamic raw, + ) { // Codec=Dco (DartCObject based), see doc to use other codecs return SavedHardwareStateImpl.frbInternalDcoDecode(raw as List); } @protected Sender - dco_decode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerSender( - dynamic raw) { + dco_decode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerSender( + dynamic raw, + ) { // Codec=Dco (DartCObject based), see doc to use other codecs return SenderImpl.frbInternalDcoDecode(raw as List); } @protected StCollapsedValue - dco_decode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerStCollapsedValue( - dynamic raw) { + dco_decode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerStCollapsedValue( + dynamic raw, + ) { // Codec=Dco (DartCObject based), see doc to use other codecs return StCollapsedValueImpl.frbInternalDcoDecode(raw as List); } @protected SyncManagerDefaultAnisetteProviderMyFilePackager - dco_decode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerSyncManagerDefaultAnisetteProviderMyFilePackager( - dynamic raw) { + dco_decode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerSyncManagerDefaultAnisetteProviderMyFilePackager( + dynamic raw, + ) { // Codec=Dco (DartCObject based), see doc to use other codecs - return SyncManagerDefaultAnisetteProviderMyFilePackagerImpl - .frbInternalDcoDecode(raw as List); + return SyncManagerDefaultAnisetteProviderMyFilePackagerImpl.frbInternalDcoDecode( + raw as List, + ); } @protected SystemTime - dco_decode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerSystemTime( - dynamic raw) { + dco_decode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerSystemTime( + dynamic raw, + ) { // Codec=Dco (DartCObject based), see doc to use other codecs return SystemTimeImpl.frbInternalDcoDecode(raw as List); } @protected VerifyBody - dco_decode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerVerifyBody( - dynamic raw) { + dco_decode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerVerifyBody( + dynamic raw, + ) { // Codec=Dco (DartCObject based), see doc to use other codecs return VerifyBodyImpl.frbInternalDcoDecode(raw as List); } @protected ViableBottle - dco_decode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerViableBottle( - dynamic raw) { + dco_decode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerViableBottle( + dynamic raw, + ) { // Codec=Dco (DartCObject based), see doc to use other codecs return ViableBottleImpl.frbInternalDcoDecode(raw as List); } @protected ApsWatcher - dco_decode_Auto_RefMut_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerAPSWatcher( - dynamic raw) { + dco_decode_Auto_RefMut_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerAPSWatcher( + dynamic raw, + ) { // Codec=Dco (DartCObject based), see doc to use other codecs return ApsWatcherImpl.frbInternalDcoDecode(raw as List); } @protected CircleClientSessionDefaultAnisetteProvider - dco_decode_Auto_RefMut_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerCircleClientSessionDefaultAnisetteProvider( - dynamic raw) { + dco_decode_Auto_RefMut_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerCircleClientSessionDefaultAnisetteProvider( + dynamic raw, + ) { // Codec=Dco (DartCObject based), see doc to use other codecs return CircleClientSessionDefaultAnisetteProviderImpl.frbInternalDcoDecode( - raw as List); + raw as List, + ); } @protected FindMyFriendsClientDefaultAnisetteProvider - dco_decode_Auto_RefMut_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerFindMyFriendsClientDefaultAnisetteProvider( - dynamic raw) { + dco_decode_Auto_RefMut_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerFindMyFriendsClientDefaultAnisetteProvider( + dynamic raw, + ) { // Codec=Dco (DartCObject based), see doc to use other codecs return FindMyFriendsClientDefaultAnisetteProviderImpl.frbInternalDcoDecode( - raw as List); + raw as List, + ); } @protected FindMyPhoneClientDefaultAnisetteProvider - dco_decode_Auto_RefMut_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerFindMyPhoneClientDefaultAnisetteProvider( - dynamic raw) { + dco_decode_Auto_RefMut_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerFindMyPhoneClientDefaultAnisetteProvider( + dynamic raw, + ) { // Codec=Dco (DartCObject based), see doc to use other codecs return FindMyPhoneClientDefaultAnisetteProviderImpl.frbInternalDcoDecode( - raw as List); + raw as List, + ); } @protected LocationReport - dco_decode_Auto_RefMut_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerLocationReport( - dynamic raw) { + dco_decode_Auto_RefMut_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerLocationReport( + dynamic raw, + ) { // Codec=Dco (DartCObject based), see doc to use other codecs return LocationReportImpl.frbInternalDcoDecode(raw as List); } @protected ReceiverApsMessage - dco_decode_Auto_RefMut_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerReceiverAPSMessage( - dynamic raw) { + dco_decode_Auto_RefMut_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerReceiverAPSMessage( + dynamic raw, + ) { // Codec=Dco (DartCObject based), see doc to use other codecs return ReceiverApsMessageImpl.frbInternalDcoDecode(raw as List); } @protected SavedHardwareState - dco_decode_Auto_RefMut_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerSavedHardwareState( - dynamic raw) { + dco_decode_Auto_RefMut_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerSavedHardwareState( + dynamic raw, + ) { // Codec=Dco (DartCObject based), see doc to use other codecs return SavedHardwareStateImpl.frbInternalDcoDecode(raw as List); } @protected ViableBottle - dco_decode_Auto_RefMut_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerViableBottle( - dynamic raw) { + dco_decode_Auto_RefMut_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerViableBottle( + dynamic raw, + ) { // Codec=Dco (DartCObject based), see doc to use other codecs return ViableBottleImpl.frbInternalDcoDecode(raw as List); } @protected ApsConnection - dco_decode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerAPSConnection( - dynamic raw) { + dco_decode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerAPSConnection( + dynamic raw, + ) { // Codec=Dco (DartCObject based), see doc to use other codecs return ApsConnectionImpl.frbInternalDcoDecode(raw as List); } @protected ArcAnisetteClientDefaultAnisetteProvider - dco_decode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcAnisetteClientDefaultAnisetteProvider( - dynamic raw) { + dco_decode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcAnisetteClientDefaultAnisetteProvider( + dynamic raw, + ) { // Codec=Dco (DartCObject based), see doc to use other codecs return ArcAnisetteClientDefaultAnisetteProviderImpl.frbInternalDcoDecode( - raw as List); + raw as List, + ); } @protected ArcCloudKitClientDefaultAnisetteProvider - dco_decode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcCloudKitClientDefaultAnisetteProvider( - dynamic raw) { + dco_decode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcCloudKitClientDefaultAnisetteProvider( + dynamic raw, + ) { // Codec=Dco (DartCObject based), see doc to use other codecs return ArcCloudKitClientDefaultAnisetteProviderImpl.frbInternalDcoDecode( - raw as List); + raw as List, + ); } @protected ArcCloudMessagesClientDefaultAnisetteProvider - dco_decode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcCloudMessagesClientDefaultAnisetteProvider( - dynamic raw) { + dco_decode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcCloudMessagesClientDefaultAnisetteProvider( + dynamic raw, + ) { // Codec=Dco (DartCObject based), see doc to use other codecs - return ArcCloudMessagesClientDefaultAnisetteProviderImpl - .frbInternalDcoDecode(raw as List); + return ArcCloudMessagesClientDefaultAnisetteProviderImpl.frbInternalDcoDecode( + raw as List, + ); } @protected ArcFtClient - dco_decode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcFTClient( - dynamic raw) { + dco_decode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcFTClient( + dynamic raw, + ) { // Codec=Dco (DartCObject based), see doc to use other codecs return ArcFtClientImpl.frbInternalDcoDecode(raw as List); } @protected ArcFindMyClientDefaultAnisetteProvider - dco_decode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcFindMyClientDefaultAnisetteProvider( - dynamic raw) { + dco_decode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcFindMyClientDefaultAnisetteProvider( + dynamic raw, + ) { // Codec=Dco (DartCObject based), see doc to use other codecs return ArcFindMyClientDefaultAnisetteProviderImpl.frbInternalDcoDecode( - raw as List); + raw as List, + ); } @protected ArcImClient - dco_decode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcIMClient( - dynamic raw) { + dco_decode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcIMClient( + dynamic raw, + ) { // Codec=Dco (DartCObject based), see doc to use other codecs return ArcImClientImpl.frbInternalDcoDecode(raw as List); } @protected ArcIdmsAuthListener - dco_decode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcIdmsAuthListener( - dynamic raw) { + dco_decode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcIdmsAuthListener( + dynamic raw, + ) { // Codec=Dco (DartCObject based), see doc to use other codecs return ArcIdmsAuthListenerImpl.frbInternalDcoDecode(raw as List); } @protected ArcKeychainClientDefaultAnisetteProvider - dco_decode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcKeychainClientDefaultAnisetteProvider( - dynamic raw) { + dco_decode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcKeychainClientDefaultAnisetteProvider( + dynamic raw, + ) { // Codec=Dco (DartCObject based), see doc to use other codecs return ArcKeychainClientDefaultAnisetteProviderImpl.frbInternalDcoDecode( - raw as List); + raw as List, + ); } @protected ArcMutexAppleAccountDefaultAnisetteProvider - dco_decode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcMutexAppleAccountDefaultAnisetteProvider( - dynamic raw) { + dco_decode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcMutexAppleAccountDefaultAnisetteProvider( + dynamic raw, + ) { // Codec=Dco (DartCObject based), see doc to use other codecs return ArcMutexAppleAccountDefaultAnisetteProviderImpl.frbInternalDcoDecode( - raw as List); + raw as List, + ); } @protected ArcMutexOptionCircleClientSessionDefaultAnisetteProvider - dco_decode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcMutexOptionCircleClientSessionDefaultAnisetteProvider( - dynamic raw) { + dco_decode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcMutexOptionCircleClientSessionDefaultAnisetteProvider( + dynamic raw, + ) { // Codec=Dco (DartCObject based), see doc to use other codecs - return ArcMutexOptionCircleClientSessionDefaultAnisetteProviderImpl - .frbInternalDcoDecode(raw as List); + return ArcMutexOptionCircleClientSessionDefaultAnisetteProviderImpl.frbInternalDcoDecode( + raw as List, + ); } @protected ArcMutexVecActiveCircleSession - dco_decode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcMutexVecActiveCircleSession( - dynamic raw) { + dco_decode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcMutexVecActiveCircleSession( + dynamic raw, + ) { // Codec=Dco (DartCObject based), see doc to use other codecs return ArcMutexVecActiveCircleSessionImpl.frbInternalDcoDecode( - raw as List); + raw as List, + ); } @protected ArcPasswordManagerDefaultAnisetteProvider - dco_decode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcPasswordManagerDefaultAnisetteProvider( - dynamic raw) { + dco_decode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcPasswordManagerDefaultAnisetteProvider( + dynamic raw, + ) { // Codec=Dco (DartCObject based), see doc to use other codecs return ArcPasswordManagerDefaultAnisetteProviderImpl.frbInternalDcoDecode( - raw as List); + raw as List, + ); } @protected ArcProfilesClientDefaultAnisetteProvider - dco_decode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcProfilesClientDefaultAnisetteProvider( - dynamic raw) { + dco_decode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcProfilesClientDefaultAnisetteProvider( + dynamic raw, + ) { // Codec=Dco (DartCObject based), see doc to use other codecs return ArcProfilesClientDefaultAnisetteProviderImpl.frbInternalDcoDecode( - raw as List); + raw as List, + ); } @protected ArcSenderPushMessage - dco_decode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcSenderPushMessage( - dynamic raw) { + dco_decode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcSenderPushMessage( + dynamic raw, + ) { // Codec=Dco (DartCObject based), see doc to use other codecs return ArcSenderPushMessageImpl.frbInternalDcoDecode(raw as List); } @protected ArcSharedPushState - dco_decode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcSharedPushState( - dynamic raw) { + dco_decode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcSharedPushState( + dynamic raw, + ) { // Codec=Dco (DartCObject based), see doc to use other codecs return ArcSharedPushStateImpl.frbInternalDcoDecode(raw as List); } @protected ArcStatusKitClientDefaultAnisetteProvider - dco_decode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcStatusKitClientDefaultAnisetteProvider( - dynamic raw) { + dco_decode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcStatusKitClientDefaultAnisetteProvider( + dynamic raw, + ) { // Codec=Dco (DartCObject based), see doc to use other codecs return ArcStatusKitClientDefaultAnisetteProviderImpl.frbInternalDcoDecode( - raw as List); + raw as List, + ); } @protected ArcTokenProviderDefaultAnisetteProvider - dco_decode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcTokenProviderDefaultAnisetteProvider( - dynamic raw) { + dco_decode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcTokenProviderDefaultAnisetteProvider( + dynamic raw, + ) { // Codec=Dco (DartCObject based), see doc to use other codecs return ArcTokenProviderDefaultAnisetteProviderImpl.frbInternalDcoDecode( - raw as List); + raw as List, + ); + } + + @protected + CloudSyncPreparedMessageCreateHandle + dco_decode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerCloudSyncPreparedMessageCreateHandle( + dynamic raw, + ) { + // Codec=Dco (DartCObject based), see doc to use other codecs + return CloudSyncPreparedMessageCreateHandleImpl.frbInternalDcoDecode( + raw as List, + ); } @protected Date - dco_decode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerDate( - dynamic raw) { + dco_decode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerDate( + dynamic raw, + ) { // Codec=Dco (DartCObject based), see doc to use other codecs return DateImpl.frbInternalDcoDecode(raw as List); } @protected EscrowData - dco_decode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerEscrowData( - dynamic raw) { + dco_decode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerEscrowData( + dynamic raw, + ) { // Codec=Dco (DartCObject based), see doc to use other codecs return EscrowDataImpl.frbInternalDcoDecode(raw as List); } @protected GZipWrapperAttachmentMeta - dco_decode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerGZipWrapperAttachmentMeta( - dynamic raw) { + dco_decode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerGZipWrapperAttachmentMeta( + dynamic raw, + ) { // Codec=Dco (DartCObject based), see doc to use other codecs return GZipWrapperAttachmentMetaImpl.frbInternalDcoDecode( - raw as List); + raw as List, + ); } @protected GZipWrapperChatProto - dco_decode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerGZipWrapperChatProto( - dynamic raw) { + dco_decode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerGZipWrapperChatProto( + dynamic raw, + ) { // Codec=Dco (DartCObject based), see doc to use other codecs return GZipWrapperChatProtoImpl.frbInternalDcoDecode(raw as List); } @protected GZipWrapperMessageProto - dco_decode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerGZipWrapperMessageProto( - dynamic raw) { + dco_decode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerGZipWrapperMessageProto( + dynamic raw, + ) { // Codec=Dco (DartCObject based), see doc to use other codecs return GZipWrapperMessageProtoImpl.frbInternalDcoDecode( - raw as List); + raw as List, + ); } @protected GZipWrapperMessageProto2 - dco_decode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerGZipWrapperMessageProto2( - dynamic raw) { + dco_decode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerGZipWrapperMessageProto2( + dynamic raw, + ) { // Codec=Dco (DartCObject based), see doc to use other codecs return GZipWrapperMessageProto2Impl.frbInternalDcoDecode( - raw as List); + raw as List, + ); } @protected GZipWrapperMessageProto3 - dco_decode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerGZipWrapperMessageProto3( - dynamic raw) { + dco_decode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerGZipWrapperMessageProto3( + dynamic raw, + ) { // Codec=Dco (DartCObject based), see doc to use other codecs return GZipWrapperMessageProto3Impl.frbInternalDcoDecode( - raw as List); + raw as List, + ); } @protected GZipWrapperMessageProto4 - dco_decode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerGZipWrapperMessageProto4( - dynamic raw) { + dco_decode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerGZipWrapperMessageProto4( + dynamic raw, + ) { // Codec=Dco (DartCObject based), see doc to use other codecs return GZipWrapperMessageProto4Impl.frbInternalDcoDecode( - raw as List); + raw as List, + ); } @protected IdsngmIdentity - dco_decode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerIDSNGMIdentity( - dynamic raw) { + dco_decode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerIDSNGMIdentity( + dynamic raw, + ) { // Codec=Dco (DartCObject based), see doc to use other codecs return IdsngmIdentityImpl.frbInternalDcoDecode(raw as List); } @protected IdsUser - dco_decode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerIDSUser( - dynamic raw) { + dco_decode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerIDSUser( + dynamic raw, + ) { // Codec=Dco (DartCObject based), see doc to use other codecs return IdsUserImpl.frbInternalDcoDecode(raw as List); } @protected JoinedOsConfig - dco_decode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerJoinedOSConfig( - dynamic raw) { + dco_decode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerJoinedOSConfig( + dynamic raw, + ) { // Codec=Dco (DartCObject based), see doc to use other codecs return JoinedOsConfigImpl.frbInternalDcoDecode(raw as List); } @protected LocationReport - dco_decode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerLocationReport( - dynamic raw) { + dco_decode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerLocationReport( + dynamic raw, + ) { // Codec=Dco (DartCObject based), see doc to use other codecs return LocationReportImpl.frbInternalDcoDecode(raw as List); } @protected MessageFlags - dco_decode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerMessageFlags( - dynamic raw) { + dco_decode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerMessageFlags( + dynamic raw, + ) { // Codec=Dco (DartCObject based), see doc to use other codecs return MessageFlagsImpl.frbInternalDcoDecode(raw as List); } @protected SavedHardwareState - dco_decode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerSavedHardwareState( - dynamic raw) { + dco_decode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerSavedHardwareState( + dynamic raw, + ) { // Codec=Dco (DartCObject based), see doc to use other codecs return SavedHardwareStateImpl.frbInternalDcoDecode(raw as List); } @protected Sender - dco_decode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerSender( - dynamic raw) { + dco_decode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerSender( + dynamic raw, + ) { // Codec=Dco (DartCObject based), see doc to use other codecs return SenderImpl.frbInternalDcoDecode(raw as List); } @protected StCollapsedValue - dco_decode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerStCollapsedValue( - dynamic raw) { + dco_decode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerStCollapsedValue( + dynamic raw, + ) { // Codec=Dco (DartCObject based), see doc to use other codecs return StCollapsedValueImpl.frbInternalDcoDecode(raw as List); } @protected SyncManagerDefaultAnisetteProviderMyFilePackager - dco_decode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerSyncManagerDefaultAnisetteProviderMyFilePackager( - dynamic raw) { + dco_decode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerSyncManagerDefaultAnisetteProviderMyFilePackager( + dynamic raw, + ) { // Codec=Dco (DartCObject based), see doc to use other codecs - return SyncManagerDefaultAnisetteProviderMyFilePackagerImpl - .frbInternalDcoDecode(raw as List); + return SyncManagerDefaultAnisetteProviderMyFilePackagerImpl.frbInternalDcoDecode( + raw as List, + ); } @protected VerifyBody - dco_decode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerVerifyBody( - dynamic raw) { + dco_decode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerVerifyBody( + dynamic raw, + ) { // Codec=Dco (DartCObject based), see doc to use other codecs return VerifyBodyImpl.frbInternalDcoDecode(raw as List); } @protected ViableBottle - dco_decode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerViableBottle( - dynamic raw) { + dco_decode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerViableBottle( + dynamic raw, + ) { // Codec=Dco (DartCObject based), see doc to use other codecs return ViableBottleImpl.frbInternalDcoDecode(raw as List); } @@ -10064,27 +13570,29 @@ class RustLibApiImpl extends RustLibApiImplPlatform implements RustLibApi { int dco_decode_CastedPrimitive_i_64(dynamic raw) { // Codec=Dco (DartCObject based), see doc to use other codecs throw UnimplementedError( - 'Not implemented in this codec, please use the other one'); + 'Not implemented in this codec, please use the other one', + ); } @protected int dco_decode_CastedPrimitive_u_64(dynamic raw) { // Codec=Dco (DartCObject based), see doc to use other codecs throw UnimplementedError( - 'Not implemented in this codec, please use the other one'); + 'Not implemented in this codec, please use the other one', + ); } @protected int dco_decode_CastedPrimitive_usize(dynamic raw) { // Codec=Dco (DartCObject based), see doc to use other codecs throw UnimplementedError( - 'Not implemented in this codec, please use the other one'); + 'Not implemented in this codec, please use the other one', + ); } @protected FutureOr Function(String) - dco_decode_DartFn_Inputs_String_Output_String_AnyhowException( - dynamic raw) { + dco_decode_DartFn_Inputs_String_Output_String_AnyhowException(dynamic raw) { // Codec=Dco (DartCObject based), see doc to use other codecs throw UnimplementedError(''); } @@ -10097,635 +13605,779 @@ class RustLibApiImpl extends RustLibApiImplPlatform implements RustLibApi { @protected Map - dco_decode_Map_String_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerAsset( - dynamic raw) { + dco_decode_Map_String_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerAsset( + dynamic raw, + ) { // Codec=Dco (DartCObject based), see doc to use other codecs return Map.fromEntries( - dco_decode_list_record_string_auto_owned_rust_opaque_flutter_rust_bridgefor_generated_rust_auto_opaque_inner_asset( - raw) - .map((e) => MapEntry(e.$1, e.$2))); + dco_decode_list_record_string_auto_owned_rust_opaque_flutter_rust_bridgefor_generated_rust_auto_opaque_inner_asset( + raw, + ).map((e) => MapEntry(e.$1, e.$2)), + ); } @protected Map - dco_decode_Map_String_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerStCollapsedValue( - dynamic raw) { + dco_decode_Map_String_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerStCollapsedValue( + dynamic raw, + ) { // Codec=Dco (DartCObject based), see doc to use other codecs return Map.fromEntries( - dco_decode_list_record_string_auto_owned_rust_opaque_flutter_rust_bridgefor_generated_rust_auto_opaque_inner_st_collapsed_value( - raw) - .map((e) => MapEntry(e.$1, e.$2))); + dco_decode_list_record_string_auto_owned_rust_opaque_flutter_rust_bridgefor_generated_rust_auto_opaque_inner_st_collapsed_value( + raw, + ).map((e) => MapEntry(e.$1, e.$2)), + ); } @protected Map dco_decode_Map_String_CastedPrimitive_u_64(dynamic raw) { // Codec=Dco (DartCObject based), see doc to use other codecs return Map.fromEntries( - dco_decode_list_record_string_casted_primitive_u_64(raw) - .map((e) => MapEntry(e.$1, e.$2))); + dco_decode_list_record_string_casted_primitive_u_64( + raw, + ).map((e) => MapEntry(e.$1, e.$2)), + ); } @protected Map dco_decode_Map_String_String(dynamic raw) { // Codec=Dco (DartCObject based), see doc to use other codecs - return Map.fromEntries(dco_decode_list_record_string_string(raw) - .map((e) => MapEntry(e.$1, e.$2))); + return Map.fromEntries( + dco_decode_list_record_string_string( + raw, + ).map((e) => MapEntry(e.$1, e.$2)), + ); } @protected Map dco_decode_Map_String_bool(dynamic raw) { // Codec=Dco (DartCObject based), see doc to use other codecs - return Map.fromEntries(dco_decode_list_record_string_bool(raw) - .map((e) => MapEntry(e.$1, e.$2))); + return Map.fromEntries( + dco_decode_list_record_string_bool(raw).map((e) => MapEntry(e.$1, e.$2)), + ); } @protected Map dco_decode_Map_String_cloud_attachment( - dynamic raw) { + dynamic raw, + ) { // Codec=Dco (DartCObject based), see doc to use other codecs - return Map.fromEntries(dco_decode_list_record_string_cloud_attachment(raw) - .map((e) => MapEntry(e.$1, e.$2))); + return Map.fromEntries( + dco_decode_list_record_string_cloud_attachment( + raw, + ).map((e) => MapEntry(e.$1, e.$2)), + ); } @protected Map dco_decode_Map_String_cloud_chat(dynamic raw) { // Codec=Dco (DartCObject based), see doc to use other codecs - return Map.fromEntries(dco_decode_list_record_string_cloud_chat(raw) - .map((e) => MapEntry(e.$1, e.$2))); + return Map.fromEntries( + dco_decode_list_record_string_cloud_chat( + raw, + ).map((e) => MapEntry(e.$1, e.$2)), + ); } @protected Map dco_decode_Map_String_cloud_message(dynamic raw) { // Codec=Dco (DartCObject based), see doc to use other codecs - return Map.fromEntries(dco_decode_list_record_string_cloud_message(raw) - .map((e) => MapEntry(e.$1, e.$2))); + return Map.fromEntries( + dco_decode_list_record_string_cloud_message( + raw, + ).map((e) => MapEntry(e.$1, e.$2)), + ); } @protected Map dco_decode_Map_String_ft_participant(dynamic raw) { // Codec=Dco (DartCObject based), see doc to use other codecs - return Map.fromEntries(dco_decode_list_record_string_ft_participant(raw) - .map((e) => MapEntry(e.$1, e.$2))); + return Map.fromEntries( + dco_decode_list_record_string_ft_participant( + raw, + ).map((e) => MapEntry(e.$1, e.$2)), + ); } @protected Map dco_decode_Map_String_group_summary(dynamic raw) { // Codec=Dco (DartCObject based), see doc to use other codecs - return Map.fromEntries(dco_decode_list_record_string_group_summary(raw) - .map((e) => MapEntry(e.$1, e.$2))); + return Map.fromEntries( + dco_decode_list_record_string_group_summary( + raw, + ).map((e) => MapEntry(e.$1, e.$2)), + ); } @protected Map> dco_decode_Map_String_list_message_edit( - dynamic raw) { + dynamic raw, + ) { // Codec=Dco (DartCObject based), see doc to use other codecs - return Map.fromEntries(dco_decode_list_record_string_list_message_edit(raw) - .map((e) => MapEntry(e.$1, e.$2))); + return Map.fromEntries( + dco_decode_list_record_string_list_message_edit( + raw, + ).map((e) => MapEntry(e.$1, e.$2)), + ); } @protected Map dco_decode_Map_String_list_prim_u_8_strict( - dynamic raw) { + dynamic raw, + ) { // Codec=Dco (DartCObject based), see doc to use other codecs return Map.fromEntries( - dco_decode_list_record_string_list_prim_u_8_strict(raw) - .map((e) => MapEntry(e.$1, e.$2))); + dco_decode_list_record_string_list_prim_u_8_strict( + raw, + ).map((e) => MapEntry(e.$1, e.$2)), + ); } @protected Map dco_decode_Map_String_message_edit_range( - dynamic raw) { + dynamic raw, + ) { // Codec=Dco (DartCObject based), see doc to use other codecs - return Map.fromEntries(dco_decode_list_record_string_message_edit_range(raw) - .map((e) => MapEntry(e.$1, e.$2))); + return Map.fromEntries( + dco_decode_list_record_string_message_edit_range( + raw, + ).map((e) => MapEntry(e.$1, e.$2)), + ); } @protected Map - dco_decode_Map_String_opt_box_autoadd_cloud_attachment(dynamic raw) { + dco_decode_Map_String_opt_box_autoadd_cloud_attachment(dynamic raw) { // Codec=Dco (DartCObject based), see doc to use other codecs return Map.fromEntries( - dco_decode_list_record_string_opt_box_autoadd_cloud_attachment(raw) - .map((e) => MapEntry(e.$1, e.$2))); + dco_decode_list_record_string_opt_box_autoadd_cloud_attachment( + raw, + ).map((e) => MapEntry(e.$1, e.$2)), + ); } @protected Map dco_decode_Map_String_opt_box_autoadd_cloud_chat( - dynamic raw) { + dynamic raw, + ) { // Codec=Dco (DartCObject based), see doc to use other codecs return Map.fromEntries( - dco_decode_list_record_string_opt_box_autoadd_cloud_chat(raw) - .map((e) => MapEntry(e.$1, e.$2))); + dco_decode_list_record_string_opt_box_autoadd_cloud_chat( + raw, + ).map((e) => MapEntry(e.$1, e.$2)), + ); } @protected Map - dco_decode_Map_String_opt_box_autoadd_cloud_message(dynamic raw) { + dco_decode_Map_String_opt_box_autoadd_cloud_message(dynamic raw) { // Codec=Dco (DartCObject based), see doc to use other codecs return Map.fromEntries( - dco_decode_list_record_string_opt_box_autoadd_cloud_message(raw) - .map((e) => MapEntry(e.$1, e.$2))); + dco_decode_list_record_string_opt_box_autoadd_cloud_message( + raw, + ).map((e) => MapEntry(e.$1, e.$2)), + ); } @protected Map - dco_decode_Map_String_password_manager_meta_data_ctx(dynamic raw) { + dco_decode_Map_String_password_manager_meta_data_ctx(dynamic raw) { // Codec=Dco (DartCObject based), see doc to use other codecs return Map.fromEntries( - dco_decode_list_record_string_password_manager_meta_data_ctx(raw) - .map((e) => MapEntry(e.$1, e.$2))); + dco_decode_list_record_string_password_manager_meta_data_ctx( + raw, + ).map((e) => MapEntry(e.$1, e.$2)), + ); } @protected Map - dco_decode_Map_String_record_opt_string_passkey(dynamic raw) { + dco_decode_Map_String_record_opt_string_passkey(dynamic raw) { // Codec=Dco (DartCObject based), see doc to use other codecs return Map.fromEntries( - dco_decode_list_record_string_record_opt_string_passkey(raw) - .map((e) => MapEntry(e.$1, e.$2))); + dco_decode_list_record_string_record_opt_string_passkey( + raw, + ).map((e) => MapEntry(e.$1, e.$2)), + ); } @protected Map - dco_decode_Map_String_record_opt_string_password_manager_meta( - dynamic raw) { + dco_decode_Map_String_record_opt_string_password_manager_meta(dynamic raw) { // Codec=Dco (DartCObject based), see doc to use other codecs return Map.fromEntries( - dco_decode_list_record_string_record_opt_string_password_manager_meta( - raw) - .map((e) => MapEntry(e.$1, e.$2))); + dco_decode_list_record_string_record_opt_string_password_manager_meta( + raw, + ).map((e) => MapEntry(e.$1, e.$2)), + ); } @protected Map - dco_decode_Map_String_record_opt_string_password_raw_entry(dynamic raw) { + dco_decode_Map_String_record_opt_string_password_raw_entry(dynamic raw) { // Codec=Dco (DartCObject based), see doc to use other codecs return Map.fromEntries( - dco_decode_list_record_string_record_opt_string_password_raw_entry(raw) - .map((e) => MapEntry(e.$1, e.$2))); + dco_decode_list_record_string_record_opt_string_password_raw_entry( + raw, + ).map((e) => MapEntry(e.$1, e.$2)), + ); } @protected Map - dco_decode_Map_String_record_opt_string_wifi_password(dynamic raw) { + dco_decode_Map_String_record_opt_string_wifi_password(dynamic raw) { // Codec=Dco (DartCObject based), see doc to use other codecs return Map.fromEntries( - dco_decode_list_record_string_record_opt_string_wifi_password(raw) - .map((e) => MapEntry(e.$1, e.$2))); + dco_decode_list_record_string_record_opt_string_wifi_password( + raw, + ).map((e) => MapEntry(e.$1, e.$2)), + ); } @protected Map - dco_decode_Map_String_share_invite_content_data(dynamic raw) { + dco_decode_Map_String_share_invite_content_data(dynamic raw) { // Codec=Dco (DartCObject based), see doc to use other codecs return Map.fromEntries( - dco_decode_list_record_string_share_invite_content_data(raw) - .map((e) => MapEntry(e.$1, e.$2))); + dco_decode_list_record_string_share_invite_content_data( + raw, + ).map((e) => MapEntry(e.$1, e.$2)), + ); } @protected Map - dco_decode_Map_String_status_kit_personal_config(dynamic raw) { + dco_decode_Map_String_status_kit_personal_config(dynamic raw) { // Codec=Dco (DartCObject based), see doc to use other codecs return Map.fromEntries( - dco_decode_list_record_string_status_kit_personal_config(raw) - .map((e) => MapEntry(e.$1, e.$2))); + dco_decode_list_record_string_status_kit_personal_config( + raw, + ).map((e) => MapEntry(e.$1, e.$2)), + ); } @protected Map dco_decode_Map_String_sync_status(dynamic raw) { // Codec=Dco (DartCObject based), see doc to use other codecs - return Map.fromEntries(dco_decode_list_record_string_sync_status(raw) - .map((e) => MapEntry(e.$1, e.$2))); + return Map.fromEntries( + dco_decode_list_record_string_sync_status( + raw, + ).map((e) => MapEntry(e.$1, e.$2)), + ); } @protected ApsConnection - dco_decode_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerAPSConnection( - dynamic raw) { + dco_decode_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerAPSConnection( + dynamic raw, + ) { // Codec=Dco (DartCObject based), see doc to use other codecs return ApsConnectionImpl.frbInternalDcoDecode(raw as List); } @protected ApsState - dco_decode_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerAPSState( - dynamic raw) { + dco_decode_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerAPSState( + dynamic raw, + ) { // Codec=Dco (DartCObject based), see doc to use other codecs return ApsStateImpl.frbInternalDcoDecode(raw as List); } @protected ApsWatcher - dco_decode_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerAPSWatcher( - dynamic raw) { + dco_decode_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerAPSWatcher( + dynamic raw, + ) { // Codec=Dco (DartCObject based), see doc to use other codecs return ApsWatcherImpl.frbInternalDcoDecode(raw as List); } @protected ArcAnisetteClientDefaultAnisetteProvider - dco_decode_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcAnisetteClientDefaultAnisetteProvider( - dynamic raw) { + dco_decode_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcAnisetteClientDefaultAnisetteProvider( + dynamic raw, + ) { // Codec=Dco (DartCObject based), see doc to use other codecs return ArcAnisetteClientDefaultAnisetteProviderImpl.frbInternalDcoDecode( - raw as List); + raw as List, + ); } @protected ArcCloudKitClientDefaultAnisetteProvider - dco_decode_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcCloudKitClientDefaultAnisetteProvider( - dynamic raw) { + dco_decode_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcCloudKitClientDefaultAnisetteProvider( + dynamic raw, + ) { // Codec=Dco (DartCObject based), see doc to use other codecs return ArcCloudKitClientDefaultAnisetteProviderImpl.frbInternalDcoDecode( - raw as List); + raw as List, + ); } @protected ArcCloudMessagesClientDefaultAnisetteProvider - dco_decode_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcCloudMessagesClientDefaultAnisetteProvider( - dynamic raw) { + dco_decode_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcCloudMessagesClientDefaultAnisetteProvider( + dynamic raw, + ) { // Codec=Dco (DartCObject based), see doc to use other codecs - return ArcCloudMessagesClientDefaultAnisetteProviderImpl - .frbInternalDcoDecode(raw as List); + return ArcCloudMessagesClientDefaultAnisetteProviderImpl.frbInternalDcoDecode( + raw as List, + ); } @protected ArcFtClient - dco_decode_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcFTClient( - dynamic raw) { + dco_decode_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcFTClient( + dynamic raw, + ) { // Codec=Dco (DartCObject based), see doc to use other codecs return ArcFtClientImpl.frbInternalDcoDecode(raw as List); } @protected ArcFindMyClientDefaultAnisetteProvider - dco_decode_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcFindMyClientDefaultAnisetteProvider( - dynamic raw) { + dco_decode_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcFindMyClientDefaultAnisetteProvider( + dynamic raw, + ) { // Codec=Dco (DartCObject based), see doc to use other codecs return ArcFindMyClientDefaultAnisetteProviderImpl.frbInternalDcoDecode( - raw as List); + raw as List, + ); } @protected ArcImClient - dco_decode_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcIMClient( - dynamic raw) { + dco_decode_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcIMClient( + dynamic raw, + ) { // Codec=Dco (DartCObject based), see doc to use other codecs return ArcImClientImpl.frbInternalDcoDecode(raw as List); } @protected ArcIdmsAuthListener - dco_decode_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcIdmsAuthListener( - dynamic raw) { + dco_decode_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcIdmsAuthListener( + dynamic raw, + ) { // Codec=Dco (DartCObject based), see doc to use other codecs return ArcIdmsAuthListenerImpl.frbInternalDcoDecode(raw as List); } @protected ArcKeychainClientDefaultAnisetteProvider - dco_decode_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcKeychainClientDefaultAnisetteProvider( - dynamic raw) { + dco_decode_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcKeychainClientDefaultAnisetteProvider( + dynamic raw, + ) { // Codec=Dco (DartCObject based), see doc to use other codecs return ArcKeychainClientDefaultAnisetteProviderImpl.frbInternalDcoDecode( - raw as List); + raw as List, + ); } @protected ArcMutexAppleAccountDefaultAnisetteProvider - dco_decode_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcMutexAppleAccountDefaultAnisetteProvider( - dynamic raw) { + dco_decode_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcMutexAppleAccountDefaultAnisetteProvider( + dynamic raw, + ) { // Codec=Dco (DartCObject based), see doc to use other codecs return ArcMutexAppleAccountDefaultAnisetteProviderImpl.frbInternalDcoDecode( - raw as List); + raw as List, + ); } @protected ArcMutexOptionCircleClientSessionDefaultAnisetteProvider - dco_decode_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcMutexOptionCircleClientSessionDefaultAnisetteProvider( - dynamic raw) { + dco_decode_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcMutexOptionCircleClientSessionDefaultAnisetteProvider( + dynamic raw, + ) { // Codec=Dco (DartCObject based), see doc to use other codecs - return ArcMutexOptionCircleClientSessionDefaultAnisetteProviderImpl - .frbInternalDcoDecode(raw as List); + return ArcMutexOptionCircleClientSessionDefaultAnisetteProviderImpl.frbInternalDcoDecode( + raw as List, + ); } @protected ArcMutexVecActiveCircleSession - dco_decode_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcMutexVecActiveCircleSession( - dynamic raw) { + dco_decode_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcMutexVecActiveCircleSession( + dynamic raw, + ) { // Codec=Dco (DartCObject based), see doc to use other codecs return ArcMutexVecActiveCircleSessionImpl.frbInternalDcoDecode( - raw as List); + raw as List, + ); } @protected ArcPasswordManagerDefaultAnisetteProvider - dco_decode_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcPasswordManagerDefaultAnisetteProvider( - dynamic raw) { + dco_decode_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcPasswordManagerDefaultAnisetteProvider( + dynamic raw, + ) { // Codec=Dco (DartCObject based), see doc to use other codecs return ArcPasswordManagerDefaultAnisetteProviderImpl.frbInternalDcoDecode( - raw as List); + raw as List, + ); } @protected ArcProfilesClientDefaultAnisetteProvider - dco_decode_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcProfilesClientDefaultAnisetteProvider( - dynamic raw) { + dco_decode_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcProfilesClientDefaultAnisetteProvider( + dynamic raw, + ) { // Codec=Dco (DartCObject based), see doc to use other codecs return ArcProfilesClientDefaultAnisetteProviderImpl.frbInternalDcoDecode( - raw as List); + raw as List, + ); } @protected ArcSenderPushMessage - dco_decode_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcSenderPushMessage( - dynamic raw) { + dco_decode_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcSenderPushMessage( + dynamic raw, + ) { // Codec=Dco (DartCObject based), see doc to use other codecs return ArcSenderPushMessageImpl.frbInternalDcoDecode(raw as List); } @protected ArcSharedPushState - dco_decode_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcSharedPushState( - dynamic raw) { + dco_decode_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcSharedPushState( + dynamic raw, + ) { // Codec=Dco (DartCObject based), see doc to use other codecs return ArcSharedPushStateImpl.frbInternalDcoDecode(raw as List); } @protected ArcStatusKitClientDefaultAnisetteProvider - dco_decode_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcStatusKitClientDefaultAnisetteProvider( - dynamic raw) { + dco_decode_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcStatusKitClientDefaultAnisetteProvider( + dynamic raw, + ) { // Codec=Dco (DartCObject based), see doc to use other codecs return ArcStatusKitClientDefaultAnisetteProviderImpl.frbInternalDcoDecode( - raw as List); + raw as List, + ); } @protected ArcTokenProviderDefaultAnisetteProvider - dco_decode_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcTokenProviderDefaultAnisetteProvider( - dynamic raw) { + dco_decode_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcTokenProviderDefaultAnisetteProvider( + dynamic raw, + ) { // Codec=Dco (DartCObject based), see doc to use other codecs return ArcTokenProviderDefaultAnisetteProviderImpl.frbInternalDcoDecode( - raw as List); + raw as List, + ); } @protected Asset - dco_decode_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerAsset( - dynamic raw) { + dco_decode_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerAsset( + dynamic raw, + ) { // Codec=Dco (DartCObject based), see doc to use other codecs return AssetImpl.frbInternalDcoDecode(raw as List); } @protected ChannelInterestToken - dco_decode_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerChannelInterestToken( - dynamic raw) { + dco_decode_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerChannelInterestToken( + dynamic raw, + ) { // Codec=Dco (DartCObject based), see doc to use other codecs return ChannelInterestTokenImpl.frbInternalDcoDecode(raw as List); } @protected CircleClientSessionDefaultAnisetteProvider - dco_decode_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerCircleClientSessionDefaultAnisetteProvider( - dynamic raw) { + dco_decode_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerCircleClientSessionDefaultAnisetteProvider( + dynamic raw, + ) { // Codec=Dco (DartCObject based), see doc to use other codecs return CircleClientSessionDefaultAnisetteProviderImpl.frbInternalDcoDecode( - raw as List); + raw as List, + ); + } + + @protected + CloudSyncPreparedMessageCreateHandle + dco_decode_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerCloudSyncPreparedMessageCreateHandle( + dynamic raw, + ) { + // Codec=Dco (DartCObject based), see doc to use other codecs + return CloudSyncPreparedMessageCreateHandleImpl.frbInternalDcoDecode( + raw as List, + ); } @protected ConversationLink - dco_decode_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerConversationLink( - dynamic raw) { + dco_decode_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerConversationLink( + dynamic raw, + ) { // Codec=Dco (DartCObject based), see doc to use other codecs return ConversationLinkImpl.frbInternalDcoDecode(raw as List); } @protected ConversationParticipant - dco_decode_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerConversationParticipant( - dynamic raw) { + dco_decode_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerConversationParticipant( + dynamic raw, + ) { // Codec=Dco (DartCObject based), see doc to use other codecs return ConversationParticipantImpl.frbInternalDcoDecode( - raw as List); + raw as List, + ); } @protected Date - dco_decode_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerDate( - dynamic raw) { + dco_decode_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerDate( + dynamic raw, + ) { // Codec=Dco (DartCObject based), see doc to use other codecs return DateImpl.frbInternalDcoDecode(raw as List); } @protected EscrowData - dco_decode_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerEscrowData( - dynamic raw) { + dco_decode_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerEscrowData( + dynamic raw, + ) { // Codec=Dco (DartCObject based), see doc to use other codecs return EscrowDataImpl.frbInternalDcoDecode(raw as List); } @protected FindMyFriendsClientDefaultAnisetteProvider - dco_decode_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerFindMyFriendsClientDefaultAnisetteProvider( - dynamic raw) { + dco_decode_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerFindMyFriendsClientDefaultAnisetteProvider( + dynamic raw, + ) { // Codec=Dco (DartCObject based), see doc to use other codecs return FindMyFriendsClientDefaultAnisetteProviderImpl.frbInternalDcoDecode( - raw as List); + raw as List, + ); } @protected FindMyPhoneClientDefaultAnisetteProvider - dco_decode_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerFindMyPhoneClientDefaultAnisetteProvider( - dynamic raw) { + dco_decode_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerFindMyPhoneClientDefaultAnisetteProvider( + dynamic raw, + ) { // Codec=Dco (DartCObject based), see doc to use other codecs return FindMyPhoneClientDefaultAnisetteProviderImpl.frbInternalDcoDecode( - raw as List); + raw as List, + ); } @protected GZipWrapperAttachmentMeta - dco_decode_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerGZipWrapperAttachmentMeta( - dynamic raw) { + dco_decode_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerGZipWrapperAttachmentMeta( + dynamic raw, + ) { // Codec=Dco (DartCObject based), see doc to use other codecs return GZipWrapperAttachmentMetaImpl.frbInternalDcoDecode( - raw as List); + raw as List, + ); } @protected GZipWrapperChatProto - dco_decode_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerGZipWrapperChatProto( - dynamic raw) { + dco_decode_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerGZipWrapperChatProto( + dynamic raw, + ) { // Codec=Dco (DartCObject based), see doc to use other codecs return GZipWrapperChatProtoImpl.frbInternalDcoDecode(raw as List); } @protected GZipWrapperMessageProto - dco_decode_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerGZipWrapperMessageProto( - dynamic raw) { + dco_decode_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerGZipWrapperMessageProto( + dynamic raw, + ) { // Codec=Dco (DartCObject based), see doc to use other codecs return GZipWrapperMessageProtoImpl.frbInternalDcoDecode( - raw as List); + raw as List, + ); } @protected GZipWrapperMessageProto2 - dco_decode_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerGZipWrapperMessageProto2( - dynamic raw) { + dco_decode_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerGZipWrapperMessageProto2( + dynamic raw, + ) { // Codec=Dco (DartCObject based), see doc to use other codecs return GZipWrapperMessageProto2Impl.frbInternalDcoDecode( - raw as List); + raw as List, + ); } @protected GZipWrapperMessageProto3 - dco_decode_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerGZipWrapperMessageProto3( - dynamic raw) { + dco_decode_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerGZipWrapperMessageProto3( + dynamic raw, + ) { // Codec=Dco (DartCObject based), see doc to use other codecs return GZipWrapperMessageProto3Impl.frbInternalDcoDecode( - raw as List); + raw as List, + ); } @protected GZipWrapperMessageProto4 - dco_decode_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerGZipWrapperMessageProto4( - dynamic raw) { + dco_decode_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerGZipWrapperMessageProto4( + dynamic raw, + ) { // Codec=Dco (DartCObject based), see doc to use other codecs return GZipWrapperMessageProto4Impl.frbInternalDcoDecode( - raw as List); + raw as List, + ); } @protected IdsngmIdentity - dco_decode_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerIDSNGMIdentity( - dynamic raw) { + dco_decode_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerIDSNGMIdentity( + dynamic raw, + ) { // Codec=Dco (DartCObject based), see doc to use other codecs return IdsngmIdentityImpl.frbInternalDcoDecode(raw as List); } @protected IdsUser - dco_decode_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerIDSUser( - dynamic raw) { + dco_decode_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerIDSUser( + dynamic raw, + ) { // Codec=Dco (DartCObject based), see doc to use other codecs return IdsUserImpl.frbInternalDcoDecode(raw as List); } @protected JoinedOsConfig - dco_decode_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerJoinedOSConfig( - dynamic raw) { + dco_decode_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerJoinedOSConfig( + dynamic raw, + ) { // Codec=Dco (DartCObject based), see doc to use other codecs return JoinedOsConfigImpl.frbInternalDcoDecode(raw as List); } @protected LocationReport - dco_decode_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerLocationReport( - dynamic raw) { + dco_decode_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerLocationReport( + dynamic raw, + ) { // Codec=Dco (DartCObject based), see doc to use other codecs return LocationReportImpl.frbInternalDcoDecode(raw as List); } @protected MessageFlags - dco_decode_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerMessageFlags( - dynamic raw) { + dco_decode_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerMessageFlags( + dynamic raw, + ) { // Codec=Dco (DartCObject based), see doc to use other codecs return MessageFlagsImpl.frbInternalDcoDecode(raw as List); } @protected NsArrayLpIconMetadata - dco_decode_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerNSArrayLPIconMetadata( - dynamic raw) { + dco_decode_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerNSArrayLPIconMetadata( + dynamic raw, + ) { // Codec=Dco (DartCObject based), see doc to use other codecs return NsArrayLpIconMetadataImpl.frbInternalDcoDecode(raw as List); } @protected NsArrayLpImageMetadata - dco_decode_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerNSArrayLPImageMetadata( - dynamic raw) { + dco_decode_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerNSArrayLPImageMetadata( + dynamic raw, + ) { // Codec=Dco (DartCObject based), see doc to use other codecs return NsArrayLpImageMetadataImpl.frbInternalDcoDecode( - raw as List); + raw as List, + ); } @protected PushError - dco_decode_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerPushError( - dynamic raw) { + dco_decode_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerPushError( + dynamic raw, + ) { // Codec=Dco (DartCObject based), see doc to use other codecs return PushErrorImpl.frbInternalDcoDecode(raw as List); } @protected ReceiverApsMessage - dco_decode_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerReceiverAPSMessage( - dynamic raw) { + dco_decode_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerReceiverAPSMessage( + dynamic raw, + ) { // Codec=Dco (DartCObject based), see doc to use other codecs return ReceiverApsMessageImpl.frbInternalDcoDecode(raw as List); } @protected SavedHardwareState - dco_decode_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerSavedHardwareState( - dynamic raw) { + dco_decode_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerSavedHardwareState( + dynamic raw, + ) { // Codec=Dco (DartCObject based), see doc to use other codecs return SavedHardwareStateImpl.frbInternalDcoDecode(raw as List); } @protected Sender - dco_decode_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerSender( - dynamic raw) { + dco_decode_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerSender( + dynamic raw, + ) { // Codec=Dco (DartCObject based), see doc to use other codecs return SenderImpl.frbInternalDcoDecode(raw as List); } @protected StCollapsedValue - dco_decode_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerStCollapsedValue( - dynamic raw) { + dco_decode_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerStCollapsedValue( + dynamic raw, + ) { // Codec=Dco (DartCObject based), see doc to use other codecs return StCollapsedValueImpl.frbInternalDcoDecode(raw as List); } @protected SyncManagerDefaultAnisetteProviderMyFilePackager - dco_decode_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerSyncManagerDefaultAnisetteProviderMyFilePackager( - dynamic raw) { + dco_decode_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerSyncManagerDefaultAnisetteProviderMyFilePackager( + dynamic raw, + ) { // Codec=Dco (DartCObject based), see doc to use other codecs - return SyncManagerDefaultAnisetteProviderMyFilePackagerImpl - .frbInternalDcoDecode(raw as List); + return SyncManagerDefaultAnisetteProviderMyFilePackagerImpl.frbInternalDcoDecode( + raw as List, + ); } @protected SystemTime - dco_decode_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerSystemTime( - dynamic raw) { + dco_decode_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerSystemTime( + dynamic raw, + ) { // Codec=Dco (DartCObject based), see doc to use other codecs return SystemTimeImpl.frbInternalDcoDecode(raw as List); } @protected VerifyBody - dco_decode_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerVerifyBody( - dynamic raw) { + dco_decode_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerVerifyBody( + dynamic raw, + ) { // Codec=Dco (DartCObject based), see doc to use other codecs return VerifyBodyImpl.frbInternalDcoDecode(raw as List); } @protected ViableBottle - dco_decode_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerViableBottle( - dynamic raw) { + dco_decode_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerViableBottle( + dynamic raw, + ) { // Codec=Dco (DartCObject based), see doc to use other codecs return ViableBottleImpl.frbInternalDcoDecode(raw as List); } @@ -10738,14 +14390,15 @@ class RustLibApiImpl extends RustLibApiImplPlatform implements RustLibApi { @protected RustStreamSink - dco_decode_StreamSink_mmcs_transfer_progress_Sse(dynamic raw) { + dco_decode_StreamSink_mmcs_transfer_progress_Sse(dynamic raw) { // Codec=Dco (DartCObject based), see doc to use other codecs throw UnimplementedError(); } @protected RustStreamSink dco_decode_StreamSink_transfer_progress_Sse( - dynamic raw) { + dynamic raw, + ) { // Codec=Dco (DartCObject based), see doc to use other codecs throw UnimplementedError(); } @@ -10780,10 +14433,7 @@ class RustLibApiImpl extends RustLibApiImplPlatform implements RustLibApi { final arr = raw as List; if (arr.length != 2) throw Exception('unexpected arr length: expect 2 but see ${arr.length}'); - return AkData( - lat: dco_decode_f_32(arr[0]), - lng: dco_decode_f_32(arr[1]), - ); + return AkData(lat: dco_decode_f_32(arr[0]), lng: dco_decode_f_32(arr[1])); } @protected @@ -10801,15 +14451,27 @@ class RustLibApiImpl extends RustLibApiImplPlatform implements RustLibApi { ); } + @protected + ApsConnectionStatus dco_decode_aps_connection_status(dynamic raw) { + // Codec=Dco (DartCObject based), see doc to use other codecs + final arr = raw as List; + if (arr.length != 4) + throw Exception('unexpected arr length: expect 4 but see ${arr.length}'); + return ApsConnectionStatus( + state: dco_decode_String(arr[0]), + activePort: dco_decode_opt_box_autoadd_u_16(arr[1]), + error: dco_decode_opt_String(arr[2]), + retryWaitSeconds: dco_decode_opt_box_autoadd_u_64(arr[3]), + ); + } + @protected ApsData dco_decode_aps_data(dynamic raw) { // Codec=Dco (DartCObject based), see doc to use other codecs final arr = raw as List; if (arr.length != 1) throw Exception('unexpected arr length: expect 1 but see ${arr.length}'); - return ApsData( - alert: dco_decode_aps_alert(arr[0]), - ); + return ApsData(alert: dco_decode_aps_alert(arr[0])); } @protected @@ -10871,13 +14533,9 @@ class RustLibApiImpl extends RustLibApiImplPlatform implements RustLibApi { // Codec=Dco (DartCObject based), see doc to use other codecs switch (raw[0]) { case 0: - return AttachmentType_Inline( - dco_decode_list_prim_u_8_strict(raw[1]), - ); + return AttachmentType_Inline(dco_decode_list_prim_u_8_strict(raw[1])); case 1: - return AttachmentType_MMCS( - dco_decode_box_autoadd_mmcs_file(raw[1]), - ); + return AttachmentType_MMCS(dco_decode_box_autoadd_mmcs_file(raw[1])); default: throw Exception("unreachable"); } @@ -10955,227 +14613,288 @@ class RustLibApiImpl extends RustLibApiImplPlatform implements RustLibApi { @protected ApsState - dco_decode_box_autoadd_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerAPSState( - dynamic raw) { + dco_decode_box_autoadd_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerAPSState( + dynamic raw, + ) { // Codec=Dco (DartCObject based), see doc to use other codecs return dco_decode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerAPSState( - raw); + raw, + ); } @protected ArcCloudKitClientDefaultAnisetteProvider - dco_decode_box_autoadd_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcCloudKitClientDefaultAnisetteProvider( - dynamic raw) { + dco_decode_box_autoadd_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcCloudKitClientDefaultAnisetteProvider( + dynamic raw, + ) { // Codec=Dco (DartCObject based), see doc to use other codecs return dco_decode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcCloudKitClientDefaultAnisetteProvider( - raw); + raw, + ); } @protected ArcCloudMessagesClientDefaultAnisetteProvider - dco_decode_box_autoadd_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcCloudMessagesClientDefaultAnisetteProvider( - dynamic raw) { + dco_decode_box_autoadd_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcCloudMessagesClientDefaultAnisetteProvider( + dynamic raw, + ) { // Codec=Dco (DartCObject based), see doc to use other codecs return dco_decode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcCloudMessagesClientDefaultAnisetteProvider( - raw); + raw, + ); } @protected ArcFindMyClientDefaultAnisetteProvider - dco_decode_box_autoadd_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcFindMyClientDefaultAnisetteProvider( - dynamic raw) { + dco_decode_box_autoadd_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcFindMyClientDefaultAnisetteProvider( + dynamic raw, + ) { // Codec=Dco (DartCObject based), see doc to use other codecs return dco_decode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcFindMyClientDefaultAnisetteProvider( - raw); + raw, + ); } @protected ArcKeychainClientDefaultAnisetteProvider - dco_decode_box_autoadd_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcKeychainClientDefaultAnisetteProvider( - dynamic raw) { + dco_decode_box_autoadd_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcKeychainClientDefaultAnisetteProvider( + dynamic raw, + ) { // Codec=Dco (DartCObject based), see doc to use other codecs return dco_decode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcKeychainClientDefaultAnisetteProvider( - raw); + raw, + ); } @protected ArcMutexAppleAccountDefaultAnisetteProvider - dco_decode_box_autoadd_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcMutexAppleAccountDefaultAnisetteProvider( - dynamic raw) { + dco_decode_box_autoadd_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcMutexAppleAccountDefaultAnisetteProvider( + dynamic raw, + ) { // Codec=Dco (DartCObject based), see doc to use other codecs return dco_decode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcMutexAppleAccountDefaultAnisetteProvider( - raw); + raw, + ); } @protected ArcPasswordManagerDefaultAnisetteProvider - dco_decode_box_autoadd_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcPasswordManagerDefaultAnisetteProvider( - dynamic raw) { + dco_decode_box_autoadd_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcPasswordManagerDefaultAnisetteProvider( + dynamic raw, + ) { // Codec=Dco (DartCObject based), see doc to use other codecs return dco_decode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcPasswordManagerDefaultAnisetteProvider( - raw); + raw, + ); } @protected Asset - dco_decode_box_autoadd_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerAsset( - dynamic raw) { + dco_decode_box_autoadd_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerAsset( + dynamic raw, + ) { // Codec=Dco (DartCObject based), see doc to use other codecs return dco_decode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerAsset( - raw); + raw, + ); } @protected ChannelInterestToken - dco_decode_box_autoadd_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerChannelInterestToken( - dynamic raw) { + dco_decode_box_autoadd_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerChannelInterestToken( + dynamic raw, + ) { // Codec=Dco (DartCObject based), see doc to use other codecs return dco_decode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerChannelInterestToken( - raw); + raw, + ); } @protected CircleClientSessionDefaultAnisetteProvider - dco_decode_box_autoadd_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerCircleClientSessionDefaultAnisetteProvider( - dynamic raw) { + dco_decode_box_autoadd_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerCircleClientSessionDefaultAnisetteProvider( + dynamic raw, + ) { // Codec=Dco (DartCObject based), see doc to use other codecs return dco_decode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerCircleClientSessionDefaultAnisetteProvider( - raw); + raw, + ); + } + + @protected + CloudSyncPreparedMessageCreateHandle + dco_decode_box_autoadd_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerCloudSyncPreparedMessageCreateHandle( + dynamic raw, + ) { + // Codec=Dco (DartCObject based), see doc to use other codecs + return dco_decode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerCloudSyncPreparedMessageCreateHandle( + raw, + ); } @protected ConversationLink - dco_decode_box_autoadd_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerConversationLink( - dynamic raw) { + dco_decode_box_autoadd_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerConversationLink( + dynamic raw, + ) { // Codec=Dco (DartCObject based), see doc to use other codecs return dco_decode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerConversationLink( - raw); + raw, + ); } @protected ConversationParticipant - dco_decode_box_autoadd_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerConversationParticipant( - dynamic raw) { + dco_decode_box_autoadd_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerConversationParticipant( + dynamic raw, + ) { // Codec=Dco (DartCObject based), see doc to use other codecs return dco_decode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerConversationParticipant( - raw); + raw, + ); } @protected Date - dco_decode_box_autoadd_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerDate( - dynamic raw) { + dco_decode_box_autoadd_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerDate( + dynamic raw, + ) { // Codec=Dco (DartCObject based), see doc to use other codecs return dco_decode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerDate( - raw); + raw, + ); } @protected GZipWrapperChatProto - dco_decode_box_autoadd_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerGZipWrapperChatProto( - dynamic raw) { + dco_decode_box_autoadd_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerGZipWrapperChatProto( + dynamic raw, + ) { // Codec=Dco (DartCObject based), see doc to use other codecs return dco_decode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerGZipWrapperChatProto( - raw); + raw, + ); } @protected GZipWrapperMessageProto2 - dco_decode_box_autoadd_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerGZipWrapperMessageProto2( - dynamic raw) { + dco_decode_box_autoadd_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerGZipWrapperMessageProto2( + dynamic raw, + ) { // Codec=Dco (DartCObject based), see doc to use other codecs return dco_decode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerGZipWrapperMessageProto2( - raw); + raw, + ); } @protected GZipWrapperMessageProto3 - dco_decode_box_autoadd_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerGZipWrapperMessageProto3( - dynamic raw) { + dco_decode_box_autoadd_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerGZipWrapperMessageProto3( + dynamic raw, + ) { // Codec=Dco (DartCObject based), see doc to use other codecs return dco_decode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerGZipWrapperMessageProto3( - raw); + raw, + ); } @protected GZipWrapperMessageProto4 - dco_decode_box_autoadd_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerGZipWrapperMessageProto4( - dynamic raw) { + dco_decode_box_autoadd_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerGZipWrapperMessageProto4( + dynamic raw, + ) { // Codec=Dco (DartCObject based), see doc to use other codecs return dco_decode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerGZipWrapperMessageProto4( - raw); + raw, + ); } @protected IdsUser - dco_decode_box_autoadd_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerIDSUser( - dynamic raw) { + dco_decode_box_autoadd_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerIDSUser( + dynamic raw, + ) { // Codec=Dco (DartCObject based), see doc to use other codecs return dco_decode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerIDSUser( - raw); + raw, + ); } @protected LocationReport - dco_decode_box_autoadd_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerLocationReport( - dynamic raw) { + dco_decode_box_autoadd_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerLocationReport( + dynamic raw, + ) { // Codec=Dco (DartCObject based), see doc to use other codecs return dco_decode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerLocationReport( - raw); + raw, + ); } @protected NsArrayLpIconMetadata - dco_decode_box_autoadd_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerNSArrayLPIconMetadata( - dynamic raw) { + dco_decode_box_autoadd_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerNSArrayLPIconMetadata( + dynamic raw, + ) { // Codec=Dco (DartCObject based), see doc to use other codecs return dco_decode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerNSArrayLPIconMetadata( - raw); + raw, + ); } @protected NsArrayLpImageMetadata - dco_decode_box_autoadd_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerNSArrayLPImageMetadata( - dynamic raw) { + dco_decode_box_autoadd_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerNSArrayLPImageMetadata( + dynamic raw, + ) { // Codec=Dco (DartCObject based), see doc to use other codecs return dco_decode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerNSArrayLPImageMetadata( - raw); + raw, + ); } @protected PushError - dco_decode_box_autoadd_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerPushError( - dynamic raw) { + dco_decode_box_autoadd_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerPushError( + dynamic raw, + ) { // Codec=Dco (DartCObject based), see doc to use other codecs return dco_decode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerPushError( - raw); + raw, + ); } @protected SavedHardwareState - dco_decode_box_autoadd_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerSavedHardwareState( - dynamic raw) { + dco_decode_box_autoadd_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerSavedHardwareState( + dynamic raw, + ) { // Codec=Dco (DartCObject based), see doc to use other codecs return dco_decode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerSavedHardwareState( - raw); + raw, + ); } @protected SyncManagerDefaultAnisetteProviderMyFilePackager - dco_decode_box_autoadd_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerSyncManagerDefaultAnisetteProviderMyFilePackager( - dynamic raw) { + dco_decode_box_autoadd_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerSyncManagerDefaultAnisetteProviderMyFilePackager( + dynamic raw, + ) { // Codec=Dco (DartCObject based), see doc to use other codecs return dco_decode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerSyncManagerDefaultAnisetteProviderMyFilePackager( - raw); + raw, + ); } @protected SystemTime - dco_decode_box_autoadd_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerSystemTime( - dynamic raw) { + dco_decode_box_autoadd_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerSystemTime( + dynamic raw, + ) { // Codec=Dco (DartCObject based), see doc to use other codecs return dco_decode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerSystemTime( - raw); + raw, + ); } @protected @@ -11198,7 +14917,8 @@ class RustLibApiImpl extends RustLibApiImplPlatform implements RustLibApi { @protected AttachmentMetaExtra dco_decode_box_autoadd_attachment_meta_extra( - dynamic raw) { + dynamic raw, + ) { // Codec=Dco (DartCObject based), see doc to use other codecs return dco_decode_attachment_meta_extra(raw); } @@ -11241,7 +14961,8 @@ class RustLibApiImpl extends RustLibApiImplPlatform implements RustLibApi { @protected ChangeParticipantMessage dco_decode_box_autoadd_change_participant_message( - dynamic raw) { + dynamic raw, + ) { // Codec=Dco (DartCObject based), see doc to use other codecs return dco_decode_change_participant_message(raw); } @@ -11276,6 +14997,194 @@ class RustLibApiImpl extends RustLibApiImplPlatform implements RustLibApi { return dco_decode_cloud_prop(raw); } + @protected + CloudSyncOutboundFailureClass + dco_decode_box_autoadd_cloud_sync_outbound_failure_class(dynamic raw) { + // Codec=Dco (DartCObject based), see doc to use other codecs + return dco_decode_cloud_sync_outbound_failure_class(raw); + } + + @protected + CloudSyncOutboundReconcileDisposition + dco_decode_box_autoadd_cloud_sync_outbound_reconcile_disposition( + dynamic raw, + ) { + // Codec=Dco (DartCObject based), see doc to use other codecs + return dco_decode_cloud_sync_outbound_reconcile_disposition(raw); + } + + @protected + CloudSyncOutboundSafeCode + dco_decode_box_autoadd_cloud_sync_outbound_safe_code(dynamic raw) { + // Codec=Dco (DartCObject based), see doc to use other codecs + return dco_decode_cloud_sync_outbound_safe_code(raw); + } + + @protected + CloudSyncPreparedMessageCreateInput + dco_decode_box_autoadd_cloud_sync_prepared_message_create_input(dynamic raw) { + // Codec=Dco (DartCObject based), see doc to use other codecs + return dco_decode_cloud_sync_prepared_message_create_input(raw); + } + + @protected + CloudSyncProtectedFailure dco_decode_box_autoadd_cloud_sync_protected_failure( + dynamic raw, + ) { + // Codec=Dco (DartCObject based), see doc to use other codecs + return dco_decode_cloud_sync_protected_failure(raw); + } + + @protected + CloudSyncProtectedGarbageCollection + dco_decode_box_autoadd_cloud_sync_protected_garbage_collection(dynamic raw) { + // Codec=Dco (DartCObject based), see doc to use other codecs + return dco_decode_cloud_sync_protected_garbage_collection(raw); + } + + @protected + CloudSyncProtectedOutboundStage + dco_decode_box_autoadd_cloud_sync_protected_outbound_stage(dynamic raw) { + // Codec=Dco (DartCObject based), see doc to use other codecs + return dco_decode_cloud_sync_protected_outbound_stage(raw); + } + + @protected + CloudSyncProtectedPage dco_decode_box_autoadd_cloud_sync_protected_page( + dynamic raw, + ) { + // Codec=Dco (DartCObject based), see doc to use other codecs + return dco_decode_cloud_sync_protected_page(raw); + } + + @protected + CloudSyncProtectedPreflightCode + dco_decode_box_autoadd_cloud_sync_protected_preflight_code(dynamic raw) { + // Codec=Dco (DartCObject based), see doc to use other codecs + return dco_decode_cloud_sync_protected_preflight_code(raw); + } + + @protected + CloudSyncProtectedRecovery + dco_decode_box_autoadd_cloud_sync_protected_recovery(dynamic raw) { + // Codec=Dco (DartCObject based), see doc to use other codecs + return dco_decode_cloud_sync_protected_recovery(raw); + } + + @protected + CloudSyncRawFailure dco_decode_box_autoadd_cloud_sync_raw_failure( + dynamic raw, + ) { + // Codec=Dco (DartCObject based), see doc to use other codecs + return dco_decode_cloud_sync_raw_failure(raw); + } + + @protected + CloudSyncRawPage dco_decode_box_autoadd_cloud_sync_raw_page(dynamic raw) { + // Codec=Dco (DartCObject based), see doc to use other codecs + return dco_decode_cloud_sync_raw_page(raw); + } + + @protected + CloudSyncRawSystemFields dco_decode_box_autoadd_cloud_sync_raw_system_fields( + dynamic raw, + ) { + // Codec=Dco (DartCObject based), see doc to use other codecs + return dco_decode_cloud_sync_raw_system_fields(raw); + } + + @protected + CloudSyncTransientAttachmentPayload + dco_decode_box_autoadd_cloud_sync_transient_attachment_payload(dynamic raw) { + // Codec=Dco (DartCObject based), see doc to use other codecs + return dco_decode_cloud_sync_transient_attachment_payload(raw); + } + + @protected + CloudSyncTransientChatPayload + dco_decode_box_autoadd_cloud_sync_transient_chat_payload(dynamic raw) { + // Codec=Dco (DartCObject based), see doc to use other codecs + return dco_decode_cloud_sync_transient_chat_payload(raw); + } + + @protected + CloudSyncTransientDeferredReason + dco_decode_box_autoadd_cloud_sync_transient_deferred_reason(dynamic raw) { + // Codec=Dco (DartCObject based), see doc to use other codecs + return dco_decode_cloud_sync_transient_deferred_reason(raw); + } + + @protected + CloudSyncTransientEntityKind + dco_decode_box_autoadd_cloud_sync_transient_entity_kind(dynamic raw) { + // Codec=Dco (DartCObject based), see doc to use other codecs + return dco_decode_cloud_sync_transient_entity_kind(raw); + } + + @protected + CloudSyncTransientFailureCode + dco_decode_box_autoadd_cloud_sync_transient_failure_code(dynamic raw) { + // Codec=Dco (DartCObject based), see doc to use other codecs + return dco_decode_cloud_sync_transient_failure_code(raw); + } + + @protected + CloudSyncTransientGroupPhotoPayload + dco_decode_box_autoadd_cloud_sync_transient_group_photo_payload(dynamic raw) { + // Codec=Dco (DartCObject based), see doc to use other codecs + return dco_decode_cloud_sync_transient_group_photo_payload(raw); + } + + @protected + CloudSyncTransientMessagePayload + dco_decode_box_autoadd_cloud_sync_transient_message_payload(dynamic raw) { + // Codec=Dco (DartCObject based), see doc to use other codecs + return dco_decode_cloud_sync_transient_message_payload(raw); + } + + @protected + CloudSyncTransientMutationKind + dco_decode_box_autoadd_cloud_sync_transient_mutation_kind(dynamic raw) { + // Codec=Dco (DartCObject based), see doc to use other codecs + return dco_decode_cloud_sync_transient_mutation_kind(raw); + } + + @protected + CloudSyncTransientPayload dco_decode_box_autoadd_cloud_sync_transient_payload( + dynamic raw, + ) { + // Codec=Dco (DartCObject based), see doc to use other codecs + return dco_decode_cloud_sync_transient_payload(raw); + } + + @protected + CloudSyncTransientQuarantineReason + dco_decode_box_autoadd_cloud_sync_transient_quarantine_reason(dynamic raw) { + // Codec=Dco (DartCObject based), see doc to use other codecs + return dco_decode_cloud_sync_transient_quarantine_reason(raw); + } + + @protected + CloudSyncTransientReactionKind + dco_decode_box_autoadd_cloud_sync_transient_reaction_kind(dynamic raw) { + // Codec=Dco (DartCObject based), see doc to use other codecs + return dco_decode_cloud_sync_transient_reaction_kind(raw); + } + + @protected + CloudSyncTransientSnapshot + dco_decode_box_autoadd_cloud_sync_transient_snapshot(dynamic raw) { + // Codec=Dco (DartCObject based), see doc to use other codecs + return dco_decode_cloud_sync_transient_snapshot(raw); + } + + @protected + CloudSyncTransientTombstone + dco_decode_box_autoadd_cloud_sync_transient_tombstone(dynamic raw) { + // Codec=Dco (DartCObject based), see doc to use other codecs + return dco_decode_cloud_sync_transient_tombstone(raw); + } + @protected ConversationData dco_decode_box_autoadd_conversation_data(dynamic raw) { // Codec=Dco (DartCObject based), see doc to use other codecs @@ -11284,7 +15193,8 @@ class RustLibApiImpl extends RustLibApiImplPlatform implements RustLibApi { @protected DartBeaconShareInfo dco_decode_box_autoadd_dart_beacon_share_info( - dynamic raw) { + dynamic raw, + ) { // Codec=Dco (DartCObject based), see doc to use other codecs return dco_decode_dart_beacon_share_info(raw); } @@ -11345,14 +15255,16 @@ class RustLibApiImpl extends RustLibApiImplPlatform implements RustLibApi { @protected IMessageNicknameRecord dco_decode_box_autoadd_i_message_nickname_record( - dynamic raw) { + dynamic raw, + ) { // Codec=Dco (DartCObject based), see doc to use other codecs return dco_decode_i_message_nickname_record(raw); } @protected IMessagePosterRecord dco_decode_box_autoadd_i_message_poster_record( - dynamic raw) { + dynamic raw, + ) { // Codec=Dco (DartCObject based), see doc to use other codecs return dco_decode_i_message_poster_record(raw); } @@ -11377,7 +15289,8 @@ class RustLibApiImpl extends RustLibApiImplPlatform implements RustLibApi { @protected IdmsRequestedSignIn dco_decode_box_autoadd_idms_requested_sign_in( - dynamic raw) { + dynamic raw, + ) { // Codec=Dco (DartCObject based), see doc to use other codecs return dco_decode_idms_requested_sign_in(raw); } @@ -11420,7 +15333,8 @@ class RustLibApiImpl extends RustLibApiImplPlatform implements RustLibApi { @protected LPSpecializationMetadata dco_decode_box_autoadd_lp_specialization_metadata( - dynamic raw) { + dynamic raw, + ) { // Codec=Dco (DartCObject based), see doc to use other codecs return dco_decode_lp_specialization_metadata(raw); } @@ -11499,7 +15413,8 @@ class RustLibApiImpl extends RustLibApiImplPlatform implements RustLibApi { @protected MoveToRecycleBinMessage dco_decode_box_autoadd_move_to_recycle_bin_message( - dynamic raw) { + dynamic raw, + ) { // Codec=Dco (DartCObject based), see doc to use other codecs return dco_decode_move_to_recycle_bin_message(raw); } @@ -11560,29 +15475,33 @@ class RustLibApiImpl extends RustLibApiImplPlatform implements RustLibApi { @protected PasswordManagerMeta dco_decode_box_autoadd_password_manager_meta( - dynamic raw) { + dynamic raw, + ) { // Codec=Dco (DartCObject based), see doc to use other codecs return dco_decode_password_manager_meta(raw); } @protected PasswordManagerMetaData dco_decode_box_autoadd_password_manager_meta_data( - dynamic raw) { + dynamic raw, + ) { // Codec=Dco (DartCObject based), see doc to use other codecs return dco_decode_password_manager_meta_data(raw); } @protected PasswordManagerMetaDataFormerlyShared - dco_decode_box_autoadd_password_manager_meta_data_formerly_shared( - dynamic raw) { + dco_decode_box_autoadd_password_manager_meta_data_formerly_shared( + dynamic raw, + ) { // Codec=Dco (DartCObject based), see doc to use other codecs return dco_decode_password_manager_meta_data_formerly_shared(raw); } @protected PasswordManagerTotp dco_decode_box_autoadd_password_manager_totp( - dynamic raw) { + dynamic raw, + ) { // Codec=Dco (DartCObject based), see doc to use other codecs return dco_decode_password_manager_totp(raw); } @@ -11595,7 +15514,8 @@ class RustLibApiImpl extends RustLibApiImplPlatform implements RustLibApi { @protected PermanentDeleteMessage dco_decode_box_autoadd_permanent_delete_message( - dynamic raw) { + dynamic raw, + ) { // Codec=Dco (DartCObject based), see doc to use other codecs return dco_decode_permanent_delete_message(raw); } @@ -11608,7 +15528,7 @@ class RustLibApiImpl extends RustLibApiImplPlatform implements RustLibApi { @protected PRPosterContentMaterialStyle - dco_decode_box_autoadd_pr_poster_content_material_style(dynamic raw) { + dco_decode_box_autoadd_pr_poster_content_material_style(dynamic raw) { // Codec=Dco (DartCObject based), see doc to use other codecs return dco_decode_pr_poster_content_material_style(raw); } @@ -11632,11 +15552,10 @@ class RustLibApiImpl extends RustLibApiImplPlatform implements RustLibApi { } @protected - ( - SharedPushState, - ApsWatcher - ) dco_decode_box_autoadd_record_shared_push_state_auto_owned_rust_opaque_flutter_rust_bridgefor_generated_rust_auto_opaque_inner_aps_watcher( - dynamic raw) { + (SharedPushState, ApsWatcher) + dco_decode_box_autoadd_record_shared_push_state_auto_owned_rust_opaque_flutter_rust_bridgefor_generated_rust_auto_opaque_inner_aps_watcher( + dynamic raw, + ) { // Codec=Dco (DartCObject based), see doc to use other codecs return raw as (SharedPushState, ApsWatcher); } @@ -11667,8 +15586,7 @@ class RustLibApiImpl extends RustLibApiImplPlatform implements RustLibApi { @protected RichLinkImageAttachmentSubstitute - dco_decode_box_autoadd_rich_link_image_attachment_substitute( - dynamic raw) { + dco_decode_box_autoadd_rich_link_image_attachment_substitute(dynamic raw) { // Codec=Dco (DartCObject based), see doc to use other codecs return dco_decode_rich_link_image_attachment_substitute(raw); } @@ -11681,14 +15599,15 @@ class RustLibApiImpl extends RustLibApiImplPlatform implements RustLibApi { @protected SetTranscriptBackgroundMessage - dco_decode_box_autoadd_set_transcript_background_message(dynamic raw) { + dco_decode_box_autoadd_set_transcript_background_message(dynamic raw) { // Codec=Dco (DartCObject based), see doc to use other codecs return dco_decode_set_transcript_background_message(raw); } @protected ShareProfileMessage dco_decode_box_autoadd_share_profile_message( - dynamic raw) { + dynamic raw, + ) { // Codec=Dco (DartCObject based), see doc to use other codecs return dco_decode_share_profile_message(raw); } @@ -11701,7 +15620,8 @@ class RustLibApiImpl extends RustLibApiImplPlatform implements RustLibApi { @protected SharedICloudServices dco_decode_box_autoadd_shared_i_cloud_services( - dynamic raw) { + dynamic raw, + ) { // Codec=Dco (DartCObject based), see doc to use other codecs return dco_decode_shared_i_cloud_services(raw); } @@ -11720,14 +15640,14 @@ class RustLibApiImpl extends RustLibApiImplPlatform implements RustLibApi { @protected SimplifiedIncomingCallPoster - dco_decode_box_autoadd_simplified_incoming_call_poster(dynamic raw) { + dco_decode_box_autoadd_simplified_incoming_call_poster(dynamic raw) { // Codec=Dco (DartCObject based), see doc to use other codecs return dco_decode_simplified_incoming_call_poster(raw); } @protected SimplifiedTranscriptPoster - dco_decode_box_autoadd_simplified_transcript_poster(dynamic raw) { + dco_decode_box_autoadd_simplified_transcript_poster(dynamic raw) { // Codec=Dco (DartCObject based), see doc to use other codecs return dco_decode_simplified_transcript_poster(raw); } @@ -11770,7 +15690,8 @@ class RustLibApiImpl extends RustLibApiImplPlatform implements RustLibApi { @protected TranscriptDynamicUserData dco_decode_box_autoadd_transcript_dynamic_user_data( - dynamic raw) { + dynamic raw, + ) { // Codec=Dco (DartCObject based), see doc to use other codecs return dco_decode_transcript_dynamic_user_data(raw); } @@ -11781,6 +15702,12 @@ class RustLibApiImpl extends RustLibApiImplPlatform implements RustLibApi { return dco_decode_typing_app(raw); } + @protected + int dco_decode_box_autoadd_u_16(dynamic raw) { + // Codec=Dco (DartCObject based), see doc to use other codecs + return raw as int; + } + @protected int dco_decode_box_autoadd_u_32(dynamic raw) { // Codec=Dco (DartCObject based), see doc to use other codecs @@ -11801,28 +15728,31 @@ class RustLibApiImpl extends RustLibApiImplPlatform implements RustLibApi { @protected UpdateAccountFinish dco_decode_box_autoadd_update_account_finish( - dynamic raw) { + dynamic raw, + ) { // Codec=Dco (DartCObject based), see doc to use other codecs return dco_decode_update_account_finish(raw); } @protected UpdateExtensionMessage dco_decode_box_autoadd_update_extension_message( - dynamic raw) { + dynamic raw, + ) { // Codec=Dco (DartCObject based), see doc to use other codecs return dco_decode_update_extension_message(raw); } @protected UpdateProfileMessage dco_decode_box_autoadd_update_profile_message( - dynamic raw) { + dynamic raw, + ) { // Codec=Dco (DartCObject based), see doc to use other codecs return dco_decode_update_profile_message(raw); } @protected UpdateProfileSharingMessage - dco_decode_box_autoadd_update_profile_sharing_message(dynamic raw) { + dco_decode_box_autoadd_update_profile_sharing_message(dynamic raw) { // Codec=Dco (DartCObject based), see doc to use other codecs return dco_decode_update_profile_sharing_message(raw); } @@ -11867,9 +15797,7 @@ class RustLibApiImpl extends RustLibApiImplPlatform implements RustLibApi { final arr = raw as List; if (arr.length != 1) throw Exception('unexpected arr length: expect 1 but see ${arr.length}'); - return ChatProto( - unk1: dco_decode_opt_box_autoadd_u_32(arr[0]), - ); + return ChatProto(unk1: dco_decode_opt_box_autoadd_u_32(arr[0])); } @protected @@ -11880,10 +15808,12 @@ class RustLibApiImpl extends RustLibApiImplPlatform implements RustLibApi { throw Exception('unexpected arr length: expect 2 but see ${arr.length}'); return CloudAttachment( cm: dco_decode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerGZipWrapperAttachmentMeta( - arr[0]), + arr[0], + ), lqa: dco_decode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerAsset( - arr[1]), + arr[1], + ), ); } @@ -11911,11 +15841,13 @@ class RustLibApiImpl extends RustLibApiImplPlatform implements RustLibApi { displayName: dco_decode_opt_String(arr[14]), proto001: dco_decode_opt_box_autoadd_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerGZipWrapperChatProto( - arr[15]), + arr[15], + ), groupPhotoGuid: dco_decode_opt_String(arr[16]), groupPhoto: dco_decode_opt_box_autoadd_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerAsset( - arr[17]), + arr[17], + ), ); } @@ -11928,7 +15860,8 @@ class RustLibApiImpl extends RustLibApiImplPlatform implements RustLibApi { return CloudMessage( utm: dco_decode_opt_box_autoadd_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerSystemTime( - arr[0]), + arr[0], + ), type: dco_decode_i_64(arr[1]), error: dco_decode_i_64(arr[2]), chatId: dco_decode_String(arr[3]), @@ -11936,22 +15869,27 @@ class RustLibApiImpl extends RustLibApiImplPlatform implements RustLibApi { time: dco_decode_i_64(arr[5]), msgProto2: dco_decode_opt_box_autoadd_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerGZipWrapperMessageProto2( - arr[6]), + arr[6], + ), destinationCallerId: dco_decode_String(arr[7]), msgProto: dco_decode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerGZipWrapperMessageProto( - arr[8]), + arr[8], + ), flags: dco_decode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerMessageFlags( - arr[9]), + arr[9], + ), guid: dco_decode_String(arr[10]), msgProto3: dco_decode_opt_box_autoadd_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerGZipWrapperMessageProto3( - arr[11]), + arr[11], + ), service: dco_decode_String(arr[12]), msgProto4: dco_decode_opt_box_autoadd_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerGZipWrapperMessageProto4( - arr[13]), + arr[13], + ), ); } @@ -11974,9 +15912,7 @@ class RustLibApiImpl extends RustLibApiImplPlatform implements RustLibApi { final arr = raw as List; if (arr.length != 1) throw Exception('unexpected arr length: expect 1 but see ${arr.length}'); - return CloudParticipant( - uri: dco_decode_String(arr[0]), - ); + return CloudParticipant(uri: dco_decode_String(arr[0])); } @protected @@ -11996,7 +15932,8 @@ class RustLibApiImpl extends RustLibApiImplPlatform implements RustLibApi { groupPhotoGuid: dco_decode_opt_String(arr[7]), lastModificationDate: dco_decode_opt_box_autoadd_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerDate( - arr[8]), + arr[8], + ), ); } @@ -12006,3721 +15943,3551 @@ class RustLibApiImpl extends RustLibApiImplPlatform implements RustLibApi { final arr = raw as List; if (arr.length != 1) throw Exception('unexpected arr length: expect 1 but see ${arr.length}'); - return CloudProp001( - syndicationType: dco_decode_u_32(arr[0]), - ); + return CloudProp001(syndicationType: dco_decode_u_32(arr[0])); } @protected - ConversationData dco_decode_conversation_data(dynamic raw) { + CloudSyncNativeAuthMetadata dco_decode_cloud_sync_native_auth_metadata( + dynamic raw, + ) { // Codec=Dco (DartCObject based), see doc to use other codecs final arr = raw as List; - if (arr.length != 4) - throw Exception('unexpected arr length: expect 4 but see ${arr.length}'); - return ConversationData( - participants: dco_decode_list_String(arr[0]), - cvName: dco_decode_opt_String(arr[1]), - senderGuid: dco_decode_opt_String(arr[2]), - afterGuid: dco_decode_opt_String(arr[3]), + if (arr.length != 3) + throw Exception('unexpected arr length: expect 3 but see ${arr.length}'); + return CloudSyncNativeAuthMetadata( + nativeSessionId: dco_decode_String(arr[0]), + accountFingerprint: dco_decode_String(arr[1]), + protectedStoreIdentity: dco_decode_String(arr[2]), ); } @protected - DartBeacon dco_decode_dart_beacon(dynamic raw) { + CloudSyncOutboundConsumeResult dco_decode_cloud_sync_outbound_consume_result( + dynamic raw, + ) { // Codec=Dco (DartCObject based), see doc to use other codecs final arr = raw as List; - if (arr.length != 9) - throw Exception('unexpected arr length: expect 9 but see ${arr.length}'); - return DartBeacon( - naming: dco_decode_beacon_naming_record(arr[0]), - lastReport: - dco_decode_opt_box_autoadd_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerLocationReport( - arr[1]), - productId: dco_decode_CastedPrimitive_i_64(arr[2]), - batteryLevel: dco_decode_opt_CastedPrimitive_i_64(arr[3]), - vendorId: dco_decode_CastedPrimitive_i_64(arr[4]), - model: dco_decode_String(arr[5]), - systemVersion: dco_decode_String(arr[6]), - id: dco_decode_String(arr[7]), - shared: dco_decode_opt_box_autoadd_dart_beacon_share_info(arr[8]), + if (arr.length != 2) + throw Exception('unexpected arr length: expect 2 but see ${arr.length}'); + return CloudSyncOutboundConsumeResult( + outcomes: dco_decode_list_cloud_sync_outbound_save_outcome(arr[0]), + failure: dco_decode_opt_box_autoadd_cloud_sync_outbound_safe_code(arr[1]), ); } @protected - DartBeaconShareInfo dco_decode_dart_beacon_share_info(dynamic raw) { + CloudSyncOutboundFailureClass dco_decode_cloud_sync_outbound_failure_class( + dynamic raw, + ) { // Codec=Dco (DartCObject based), see doc to use other codecs - final arr = raw as List; - if (arr.length != 3) - throw Exception('unexpected arr length: expect 3 but see ${arr.length}'); - return DartBeaconShareInfo( - shareId: dco_decode_String(arr[0]), - acceptanceState: dco_decode_CastedPrimitive_i_64(arr[1]), - ownerHandle: dco_decode_String(arr[2]), - ); + return CloudSyncOutboundFailureClass.values[raw as int]; } @protected - DeleteTarget dco_decode_delete_target(dynamic raw) { + CloudSyncOutboundReconcileDisposition + dco_decode_cloud_sync_outbound_reconcile_disposition(dynamic raw) { // Codec=Dco (DartCObject based), see doc to use other codecs - switch (raw[0]) { - case 0: - return DeleteTarget_Chat( - dco_decode_box_autoadd_operated_chat(raw[1]), - ); - case 1: - return DeleteTarget_Messages( - dco_decode_list_String(raw[1]), - ); - default: - throw Exception("unreachable"); - } + return CloudSyncOutboundReconcileDisposition.values[raw as int]; } @protected - DeviceInfo dco_decode_device_info(dynamic raw) { + CloudSyncOutboundReconcileResult + dco_decode_cloud_sync_outbound_reconcile_result(dynamic raw) { // Codec=Dco (DartCObject based), see doc to use other codecs final arr = raw as List; - if (arr.length != 4) - throw Exception('unexpected arr length: expect 4 but see ${arr.length}'); - return DeviceInfo( - name: dco_decode_String(arr[0]), - serial: dco_decode_String(arr[1]), - osVersion: dco_decode_String(arr[2]), - encodedData: dco_decode_opt_list_prim_u_8_strict(arr[3]), + if (arr.length != 5) + throw Exception('unexpected arr length: expect 5 but see ${arr.length}'); + return CloudSyncOutboundReconcileResult( + disposition: + dco_decode_opt_box_autoadd_cloud_sync_outbound_reconcile_disposition( + arr[0], + ), + protectedProofReference: dco_decode_opt_String(arr[1]), + failureClass: + dco_decode_opt_box_autoadd_cloud_sync_outbound_failure_class(arr[2]), + retryAfterSeconds: dco_decode_opt_box_autoadd_u_64(arr[3]), + failure: dco_decode_opt_box_autoadd_cloud_sync_outbound_safe_code(arr[4]), ); } @protected - EditMessage dco_decode_edit_message(dynamic raw) { + CloudSyncOutboundSafeCode dco_decode_cloud_sync_outbound_safe_code( + dynamic raw, + ) { // Codec=Dco (DartCObject based), see doc to use other codecs - final arr = raw as List; - if (arr.length != 3) - throw Exception('unexpected arr length: expect 3 but see ${arr.length}'); - return EditMessage( - tuuid: dco_decode_String(arr[0]), - editPart: dco_decode_CastedPrimitive_u_64(arr[1]), - newParts: dco_decode_message_parts(arr[2]), - ); + return CloudSyncOutboundSafeCode.values[raw as int]; } @protected - ErrorMessage dco_decode_error_message(dynamic raw) { + CloudSyncOutboundSaveDisposition + dco_decode_cloud_sync_outbound_save_disposition(dynamic raw) { + // Codec=Dco (DartCObject based), see doc to use other codecs + return CloudSyncOutboundSaveDisposition.values[raw as int]; + } + + @protected + CloudSyncOutboundSaveOutcome dco_decode_cloud_sync_outbound_save_outcome( + dynamic raw, + ) { // Codec=Dco (DartCObject based), see doc to use other codecs final arr = raw as List; - if (arr.length != 3) - throw Exception('unexpected arr length: expect 3 but see ${arr.length}'); - return ErrorMessage( - forUuid: dco_decode_String(arr[0]), - status: dco_decode_u_64(arr[1]), - statusStr: dco_decode_String(arr[2]), + if (arr.length != 5) + throw Exception('unexpected arr length: expect 5 but see ${arr.length}'); + return CloudSyncOutboundSaveOutcome( + localOperationId: dco_decode_String(arr[0]), + appleOperationUuid: dco_decode_String(arr[1]), + disposition: dco_decode_cloud_sync_outbound_save_disposition(arr[2]), + failureClass: + dco_decode_opt_box_autoadd_cloud_sync_outbound_failure_class(arr[3]), + retryAfterSeconds: dco_decode_opt_box_autoadd_u_64(arr[4]), ); } @protected - ExtensionApp dco_decode_extension_app(dynamic raw) { + CloudSyncPreparedMessageCreateInput + dco_decode_cloud_sync_prepared_message_create_input(dynamic raw) { // Codec=Dco (DartCObject based), see doc to use other codecs final arr = raw as List; - if (arr.length != 4) - throw Exception('unexpected arr length: expect 4 but see ${arr.length}'); - return ExtensionApp( - name: dco_decode_String(arr[0]), - appId: dco_decode_opt_CastedPrimitive_u_64(arr[1]), - bundleId: dco_decode_String(arr[2]), - balloon: dco_decode_opt_box_autoadd_balloon(arr[3]), + if (arr.length != 8) + throw Exception('unexpected arr length: expect 8 but see ${arr.length}'); + return CloudSyncPreparedMessageCreateInput( + localOperationId: dco_decode_String(arr[0]), + logicalEntityKeyHash: dco_decode_String(arr[1]), + protectedLeaseReference: dco_decode_String(arr[2]), + protectedPayloadReference: dco_decode_String(arr[3]), + payloadSha256: dco_decode_String(arr[4]), + protectedServerRecordReference: dco_decode_String(arr[5]), + serverRecordIdHash: dco_decode_String(arr[6]), + appleOperationUuid: dco_decode_String(arr[7]), ); } @protected - double dco_decode_f_32(dynamic raw) { + CloudSyncPreparedMessageCreateResult + dco_decode_cloud_sync_prepared_message_create_result(dynamic raw) { // Codec=Dco (DartCObject based), see doc to use other codecs - return raw as double; + final arr = raw as List; + if (arr.length != 2) + throw Exception('unexpected arr length: expect 2 but see ${arr.length}'); + return CloudSyncPreparedMessageCreateResult( + handle: + dco_decode_opt_box_autoadd_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerCloudSyncPreparedMessageCreateHandle( + arr[0], + ), + failure: dco_decode_opt_box_autoadd_cloud_sync_outbound_safe_code(arr[1]), + ); } @protected - double dco_decode_f_64(dynamic raw) { + CloudSyncProtectedChange dco_decode_cloud_sync_protected_change(dynamic raw) { // Codec=Dco (DartCObject based), see doc to use other codecs - return raw as double; + final arr = raw as List; + if (arr.length != 11) + throw Exception('unexpected arr length: expect 11 but see ${arr.length}'); + return CloudSyncProtectedChange( + changeId: dco_decode_String(arr[0]), + recordIdHash: dco_decode_String(arr[1]), + etagHash: dco_decode_opt_String(arr[2]), + kind: dco_decode_cloud_sync_protected_change_kind(arr[3]), + payloadSha256: dco_decode_String(arr[4]), + payloadLength: dco_decode_u_64(arr[5]), + protectedRecordIdentityReference: dco_decode_String(arr[6]), + protectedRawEnvelopeReference: dco_decode_String(arr[7]), + serverModifiedAtMillis: dco_decode_opt_box_autoadd_i_64(arr[8]), + preflightCode: + dco_decode_opt_box_autoadd_cloud_sync_protected_preflight_code( + arr[9], + ), + isTombstone: dco_decode_bool(arr[10]), + ); } @protected - FFIFilePackager dco_decode_ffi_file_packager(dynamic raw) { + CloudSyncProtectedChangeKind dco_decode_cloud_sync_protected_change_kind( + dynamic raw, + ) { // Codec=Dco (DartCObject based), see doc to use other codecs - final arr = raw as List; - if (arr.length != 0) - throw Exception('unexpected arr length: expect 0 but see ${arr.length}'); - return FFIFilePackager(); + return CloudSyncProtectedChangeKind.values[raw as int]; } @protected - Follow dco_decode_follow(dynamic raw) { + CloudSyncProtectedFailure dco_decode_cloud_sync_protected_failure( + dynamic raw, + ) { // Codec=Dco (DartCObject based), see doc to use other codecs final arr = raw as List; - if (arr.length != 18) - throw Exception('unexpected arr length: expect 18 but see ${arr.length}'); - return Follow( - createTimestamp: dco_decode_i_64(arr[0]), - expires: dco_decode_i_64(arr[1]), - id: dco_decode_String(arr[2]), - invitationAcceptedHandles: dco_decode_list_String(arr[3]), - invitationFromHandles: dco_decode_list_String(arr[4]), - isFromMessages: dco_decode_bool(arr[5]), - offerId: dco_decode_opt_String(arr[6]), - onlyInEvent: dco_decode_bool(arr[7]), - personIdHash: dco_decode_String(arr[8]), - secureLocationsCapable: dco_decode_bool(arr[9]), - shallowOrLiveSecureLocationsCapable: dco_decode_bool(arr[10]), - source: dco_decode_String(arr[11]), - tkPermission: dco_decode_bool(arr[12]), - updateTimestamp: dco_decode_i_64(arr[13]), - fallbackToLegacyAllowed: dco_decode_opt_box_autoadd_bool(arr[14]), - optedNotToShare: dco_decode_opt_box_autoadd_bool(arr[15]), - lastLocation: dco_decode_opt_box_autoadd_location(arr[16]), - locateInProgress: dco_decode_bool(arr[17]), + if (arr.length != 3) + throw Exception('unexpected arr length: expect 3 but see ${arr.length}'); + return CloudSyncProtectedFailure( + category: dco_decode_cloud_sync_protected_failure_category(arr[0]), + safeCode: dco_decode_cloud_sync_protected_safe_code(arr[1]), + retryAfterSeconds: dco_decode_opt_box_autoadd_u_64(arr[2]), ); } @protected - FoundDevice dco_decode_found_device(dynamic raw) { + CloudSyncProtectedFailureCategory + dco_decode_cloud_sync_protected_failure_category(dynamic raw) { // Codec=Dco (DartCObject based), see doc to use other codecs - final arr = raw as List; - if (arr.length != 35) - throw Exception('unexpected arr length: expect 35 but see ${arr.length}'); - return FoundDevice( - deviceModel: dco_decode_opt_String(arr[0]), - lowPowerMode: dco_decode_opt_box_autoadd_bool(arr[1]), - passcodeLength: dco_decode_opt_box_autoadd_i_64(arr[2]), - id: dco_decode_opt_String(arr[3]), - batteryStatus: dco_decode_opt_String(arr[4]), - lostModeCapable: dco_decode_opt_box_autoadd_bool(arr[5]), - batteryLevel: dco_decode_opt_box_autoadd_f_64(arr[6]), - locationEnabled: dco_decode_opt_box_autoadd_bool(arr[7]), - isConsideredAccessory: dco_decode_opt_box_autoadd_bool(arr[8]), - location: dco_decode_opt_box_autoadd_location(arr[9]), - modelDisplayName: dco_decode_opt_String(arr[10]), - deviceColor: dco_decode_opt_String(arr[11]), - activationLocked: dco_decode_opt_box_autoadd_bool(arr[12]), - rm2State: dco_decode_opt_box_autoadd_i_64(arr[13]), - locFoundEnabled: dco_decode_opt_box_autoadd_bool(arr[14]), - nwd: dco_decode_opt_box_autoadd_bool(arr[15]), - deviceStatus: dco_decode_opt_String(arr[16]), - fmlyShare: dco_decode_opt_box_autoadd_bool(arr[17]), - features: dco_decode_Map_String_bool(arr[18]), - thisDevice: dco_decode_opt_box_autoadd_bool(arr[19]), - lostModeEnabled: dco_decode_opt_box_autoadd_bool(arr[20]), - deviceDisplayName: dco_decode_opt_String(arr[21]), - name: dco_decode_opt_String(arr[22]), - canWipeAfterLock: dco_decode_opt_box_autoadd_bool(arr[23]), - isMac: dco_decode_opt_box_autoadd_bool(arr[24]), - rawDeviceModel: dco_decode_opt_String(arr[25]), - baUuid: dco_decode_opt_String(arr[26]), - deviceDiscoveryId: dco_decode_opt_String(arr[27]), - scd: dco_decode_opt_box_autoadd_bool(arr[28]), - locationCapable: dco_decode_opt_box_autoadd_bool(arr[29]), - wipeInProgress: dco_decode_opt_box_autoadd_bool(arr[30]), - darkWake: dco_decode_opt_box_autoadd_bool(arr[31]), - deviceWithYou: dco_decode_opt_box_autoadd_bool(arr[32]), - maxMsgChar: dco_decode_opt_box_autoadd_i_64(arr[33]), - deviceClass: dco_decode_opt_String(arr[34]), - ); + return CloudSyncProtectedFailureCategory.values[raw as int]; } @protected - FTMember dco_decode_ft_member(dynamic raw) { + CloudSyncProtectedFetchResult dco_decode_cloud_sync_protected_fetch_result( + dynamic raw, + ) { // Codec=Dco (DartCObject based), see doc to use other codecs final arr = raw as List; if (arr.length != 2) throw Exception('unexpected arr length: expect 2 but see ${arr.length}'); - return FTMember( - nickname: dco_decode_opt_String(arr[0]), - handle: dco_decode_String(arr[1]), + return CloudSyncProtectedFetchResult( + page: dco_decode_opt_box_autoadd_cloud_sync_protected_page(arr[0]), + failure: dco_decode_opt_box_autoadd_cloud_sync_protected_failure(arr[1]), ); } @protected - FTMessage dco_decode_ft_message(dynamic raw) { + CloudSyncProtectedGarbageCollection + dco_decode_cloud_sync_protected_garbage_collection(dynamic raw) { // Codec=Dco (DartCObject based), see doc to use other codecs - switch (raw[0]) { - case 0: - return FTMessage_LetMeInRequest( - dco_decode_box_autoadd_let_me_in_request(raw[1]), - ); - case 1: - return FTMessage_LinkChanged( - guid: dco_decode_String(raw[1]), - ); - case 2: - return FTMessage_JoinEvent( - guid: dco_decode_String(raw[1]), - participant: dco_decode_u_64(raw[2]), - handle: dco_decode_String(raw[3]), - ring: dco_decode_bool(raw[4]), - ); - case 3: - return FTMessage_AddMembers( - guid: dco_decode_String(raw[1]), - members: dco_decode_Set_ft_member(raw[2]), - ring: dco_decode_bool(raw[3]), - ); - case 4: - return FTMessage_RemoveMembers( - guid: dco_decode_String(raw[1]), - members: dco_decode_Set_ft_member(raw[2]), - ); - case 5: - return FTMessage_LeaveEvent( - guid: dco_decode_String(raw[1]), - participant: dco_decode_u_64(raw[2]), - handle: dco_decode_String(raw[3]), - ); - case 6: - return FTMessage_Ring( - guid: dco_decode_String(raw[1]), - ); - case 7: - return FTMessage_Decline( - guid: dco_decode_String(raw[1]), - ); - case 8: - return FTMessage_RespondedElsewhere( - guid: dco_decode_String(raw[1]), - ); - default: - throw Exception("unreachable"); - } + final arr = raw as List; + if (arr.length != 6) + throw Exception('unexpected arr length: expect 6 but see ${arr.length}'); + return CloudSyncProtectedGarbageCollection( + scannedCount: dco_decode_u_32(arr[0]), + firstObservedCount: dco_decode_u_32(arr[1]), + deletedCount: dco_decode_u_32(arr[2]), + preservedLiveCount: dco_decode_u_32(arr[3]), + preservedActiveLeaseCount: dco_decode_u_32(arr[4]), + hasMore: dco_decode_bool(arr[5]), + ); } @protected - FTMode dco_decode_ft_mode(dynamic raw) { + CloudSyncProtectedGarbageCollectionResult + dco_decode_cloud_sync_protected_garbage_collection_result(dynamic raw) { // Codec=Dco (DartCObject based), see doc to use other codecs - return FTMode.values[raw as int]; + final arr = raw as List; + if (arr.length != 2) + throw Exception('unexpected arr length: expect 2 but see ${arr.length}'); + return CloudSyncProtectedGarbageCollectionResult( + collection: + dco_decode_opt_box_autoadd_cloud_sync_protected_garbage_collection( + arr[0], + ), + failure: dco_decode_opt_box_autoadd_cloud_sync_protected_failure(arr[1]), + ); } @protected - FTParticipant dco_decode_ft_participant(dynamic raw) { + CloudSyncProtectedLeaseResult dco_decode_cloud_sync_protected_lease_result( + dynamic raw, + ) { // Codec=Dco (DartCObject based), see doc to use other codecs final arr = raw as List; - if (arr.length != 5) - throw Exception('unexpected arr length: expect 5 but see ${arr.length}'); - return FTParticipant( - token: dco_decode_opt_String(arr[0]), - handle: dco_decode_String(arr[1]), - participantId: dco_decode_CastedPrimitive_u_64(arr[2]), - lastJoinDate: dco_decode_opt_CastedPrimitive_u_64(arr[3]), - active: - dco_decode_opt_box_autoadd_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerConversationParticipant( - arr[4]), + if (arr.length != 1) + throw Exception('unexpected arr length: expect 1 but see ${arr.length}'); + return CloudSyncProtectedLeaseResult( + failure: dco_decode_opt_box_autoadd_cloud_sync_protected_failure(arr[0]), ); } @protected - FTSession dco_decode_ft_session(dynamic raw) { + CloudSyncProtectedOutboundStage + dco_decode_cloud_sync_protected_outbound_stage(dynamic raw) { // Codec=Dco (DartCObject based), see doc to use other codecs final arr = raw as List; - if (arr.length != 12) - throw Exception('unexpected arr length: expect 12 but see ${arr.length}'); - return FTSession( - groupId: dco_decode_String(arr[0]), - myHandles: dco_decode_list_String(arr[1]), - participants: dco_decode_Map_String_ft_participant(arr[2]), - link: - dco_decode_opt_box_autoadd_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerConversationLink( - arr[3]), - members: dco_decode_Set_ft_member(arr[4]), - reportId: dco_decode_String(arr[5]), - startTime: dco_decode_opt_CastedPrimitive_u_64(arr[6]), - lastRekey: dco_decode_opt_CastedPrimitive_u_64(arr[7]), - isPropped: dco_decode_bool(arr[8]), - isRingingInaccurate: dco_decode_bool(arr[9]), - mode: dco_decode_opt_box_autoadd_ft_mode(arr[10]), - recentMemberAdds: dco_decode_Map_String_CastedPrimitive_u_64(arr[11]), + if (arr.length != 7) + throw Exception('unexpected arr length: expect 7 but see ${arr.length}'); + return CloudSyncProtectedOutboundStage( + logicalEntityKeyHash: dco_decode_String(arr[0]), + protectedPayloadReference: dco_decode_String(arr[1]), + payloadSha256: dco_decode_String(arr[2]), + payloadLength: dco_decode_u_64(arr[3]), + protectedServerRecordReference: dco_decode_String(arr[4]), + serverRecordIdHash: dco_decode_String(arr[5]), + leaseReference: dco_decode_String(arr[6]), ); } @protected - GroupSummary dco_decode_group_summary(dynamic raw) { + CloudSyncProtectedOutboundStageResult + dco_decode_cloud_sync_protected_outbound_stage_result(dynamic raw) { // Codec=Dco (DartCObject based), see doc to use other codecs final arr = raw as List; - if (arr.length != 3) - throw Exception('unexpected arr length: expect 3 but see ${arr.length}'); - return GroupSummary( - displayName: dco_decode_String(arr[0]), - isOwner: dco_decode_bool(arr[1]), - members: dco_decode_list_group_summary_member(arr[2]), + if (arr.length != 2) + throw Exception('unexpected arr length: expect 2 but see ${arr.length}'); + return CloudSyncProtectedOutboundStageResult( + stage: dco_decode_opt_box_autoadd_cloud_sync_protected_outbound_stage( + arr[0], + ), + failure: dco_decode_opt_box_autoadd_cloud_sync_outbound_safe_code(arr[1]), ); } @protected - GroupSummaryMember dco_decode_group_summary_member(dynamic raw) { + CloudSyncProtectedPage dco_decode_cloud_sync_protected_page(dynamic raw) { // Codec=Dco (DartCObject based), see doc to use other codecs final arr = raw as List; - if (arr.length != 4) - throw Exception('unexpected arr length: expect 4 but see ${arr.length}'); - return GroupSummaryMember( - name: dco_decode_opt_String(arr[0]), - handle: dco_decode_String(arr[1]), - userId: dco_decode_opt_String(arr[2]), - isJoined: dco_decode_bool(arr[3]), + if (arr.length != 7) + throw Exception('unexpected arr length: expect 7 but see ${arr.length}'); + return CloudSyncProtectedPage( + changes: dco_decode_list_cloud_sync_protected_change(arr[0]), + batchId: dco_decode_String(arr[1]), + generation: dco_decode_u_64(arr[2]), + pageLeaseReference: dco_decode_String(arr[3]), + protectedNextCheckpointReference: dco_decode_opt_String(arr[4]), + complete: dco_decode_bool(arr[5]), + admittedRawBytes: dco_decode_u_64(arr[6]), ); } @protected - HwExtra dco_decode_hw_extra(dynamic raw) { + CloudSyncProtectedPreflightCode + dco_decode_cloud_sync_protected_preflight_code(dynamic raw) { + // Codec=Dco (DartCObject based), see doc to use other codecs + return CloudSyncProtectedPreflightCode.values[raw as int]; + } + + @protected + CloudSyncProtectedRecovery dco_decode_cloud_sync_protected_recovery( + dynamic raw, + ) { // Codec=Dco (DartCObject based), see doc to use other codecs final arr = raw as List; if (arr.length != 5) throw Exception('unexpected arr length: expect 5 but see ${arr.length}'); - return HwExtra( - version: dco_decode_String(arr[0]), - protocolVersion: dco_decode_u_32(arr[1]), - deviceId: dco_decode_String(arr[2]), - icloudUa: dco_decode_String(arr[3]), - aoskitVersion: dco_decode_String(arr[4]), + return CloudSyncProtectedRecovery( + finalizedAdoptedLeaseReferences: dco_decode_list_String(arr[0]), + absentAdoptedLeaseReferences: dco_decode_list_String(arr[1]), + rolledBackCount: dco_decode_u_32(arr[2]), + removedTemporaryFilesCount: dco_decode_u_32(arr[3]), + hasMore: dco_decode_bool(arr[4]), ); } @protected - int dco_decode_i_32(dynamic raw) { + CloudSyncProtectedRecoveryResult + dco_decode_cloud_sync_protected_recovery_result(dynamic raw) { // Codec=Dco (DartCObject based), see doc to use other codecs - return raw as int; + final arr = raw as List; + if (arr.length != 2) + throw Exception('unexpected arr length: expect 2 but see ${arr.length}'); + return CloudSyncProtectedRecoveryResult( + recovery: dco_decode_opt_box_autoadd_cloud_sync_protected_recovery( + arr[0], + ), + failure: dco_decode_opt_box_autoadd_cloud_sync_protected_failure(arr[1]), + ); } @protected - PlatformInt64 dco_decode_i_64(dynamic raw) { + CloudSyncProtectedRetirementResult + dco_decode_cloud_sync_protected_retirement_result(dynamic raw) { // Codec=Dco (DartCObject based), see doc to use other codecs - return dcoDecodeI64(raw); + final arr = raw as List; + if (arr.length != 2) + throw Exception('unexpected arr length: expect 2 but see ${arr.length}'); + return CloudSyncProtectedRetirementResult( + retiredCount: dco_decode_u_32(arr[0]), + failure: dco_decode_opt_box_autoadd_cloud_sync_protected_failure(arr[1]), + ); } @protected - IMessageNameRecord dco_decode_i_message_name_record(dynamic raw) { + CloudSyncProtectedSafeCode dco_decode_cloud_sync_protected_safe_code( + dynamic raw, + ) { // Codec=Dco (DartCObject based), see doc to use other codecs - final arr = raw as List; - if (arr.length != 3) - throw Exception('unexpected arr length: expect 3 but see ${arr.length}'); - return IMessageNameRecord( - name: dco_decode_String(arr[0]), - first: dco_decode_String(arr[1]), - last: dco_decode_String(arr[2]), - ); + return CloudSyncProtectedSafeCode.values[raw as int]; } @protected - IMessageNicknameRecord dco_decode_i_message_nickname_record(dynamic raw) { + CloudSyncRawChange dco_decode_cloud_sync_raw_change(dynamic raw) { // Codec=Dco (DartCObject based), see doc to use other codecs final arr = raw as List; - if (arr.length != 3) - throw Exception('unexpected arr length: expect 3 but see ${arr.length}'); - return IMessageNicknameRecord( - name: dco_decode_i_message_name_record(arr[0]), - image: dco_decode_opt_list_prim_u_8_strict(arr[1]), - poster: dco_decode_opt_box_autoadd_i_message_poster_record(arr[2]), + if (arr.length != 7) + throw Exception('unexpected arr length: expect 7 but see ${arr.length}'); + return CloudSyncRawChange( + recordName: dco_decode_opt_String(arr[0]), + recordType: dco_decode_opt_String(arr[1]), + changeType: dco_decode_opt_box_autoadd_i_32(arr[2]), + systemFields: dco_decode_opt_box_autoadd_cloud_sync_raw_system_fields( + arr[3], + ), + encryptedRecord: dco_decode_opt_list_prim_u_8_strict(arr[4]), + tombstonePayload: dco_decode_opt_list_prim_u_8_strict(arr[5]), + kind: dco_decode_cloud_sync_raw_record_kind(arr[6]), ); } @protected - IMessagePosterRecord dco_decode_i_message_poster_record(dynamic raw) { + CloudSyncRawFailure dco_decode_cloud_sync_raw_failure(dynamic raw) { // Codec=Dco (DartCObject based), see doc to use other codecs final arr = raw as List; if (arr.length != 3) throw Exception('unexpected arr length: expect 3 but see ${arr.length}'); - return IMessagePosterRecord( - lowResPoster: dco_decode_list_prim_u_8_strict(arr[0]), - package: dco_decode_list_prim_u_8_strict(arr[1]), - meta: dco_decode_list_prim_u_8_strict(arr[2]), + return CloudSyncRawFailure( + category: dco_decode_cloud_sync_raw_failure_category(arr[0]), + retryAfterSeconds: dco_decode_opt_box_autoadd_u_64(arr[1]), + safeCode: dco_decode_String(arr[2]), ); } @protected - IconChangeMessage dco_decode_icon_change_message(dynamic raw) { + CloudSyncRawFailureCategory dco_decode_cloud_sync_raw_failure_category( + dynamic raw, + ) { + // Codec=Dco (DartCObject based), see doc to use other codecs + return CloudSyncRawFailureCategory.values[raw as int]; + } + + @protected + CloudSyncRawFetchResult dco_decode_cloud_sync_raw_fetch_result(dynamic raw) { // Codec=Dco (DartCObject based), see doc to use other codecs final arr = raw as List; if (arr.length != 2) throw Exception('unexpected arr length: expect 2 but see ${arr.length}'); - return IconChangeMessage( - file: dco_decode_opt_box_autoadd_mmcs_file(arr[0]), - groupVersion: dco_decode_CastedPrimitive_u_64(arr[1]), + return CloudSyncRawFetchResult( + page: dco_decode_opt_box_autoadd_cloud_sync_raw_page(arr[0]), + failure: dco_decode_opt_box_autoadd_cloud_sync_raw_failure(arr[1]), ); } @protected - IdmsCircleMessage dco_decode_idms_circle_message(dynamic raw) { + CloudSyncRawPage dco_decode_cloud_sync_raw_page(dynamic raw) { // Codec=Dco (DartCObject based), see doc to use other codecs final arr = raw as List; - if (arr.length != 5) - throw Exception('unexpected arr length: expect 5 but see ${arr.length}'); - return IdmsCircleMessage( - step: dco_decode_u_32(arr[0]), - atxnid: dco_decode_String(arr[1]), - pake: dco_decode_opt_String(arr[2]), - ec: dco_decode_opt_box_autoadd_i_32(arr[3]), - idmsdata: dco_decode_String(arr[4]), + if (arr.length != 4) + throw Exception('unexpected arr length: expect 4 but see ${arr.length}'); + return CloudSyncRawPage( + changes: dco_decode_list_cloud_sync_raw_change(arr[0]), + nextToken: dco_decode_opt_list_prim_u_8_strict(arr[1]), + status: dco_decode_i_32(arr[2]), + complete: dco_decode_bool(arr[3]), ); } @protected - IdmsMessage dco_decode_idms_message(dynamic raw) { + CloudSyncRawRecordKind dco_decode_cloud_sync_raw_record_kind(dynamic raw) { // Codec=Dco (DartCObject based), see doc to use other codecs - switch (raw[0]) { - case 0: - return IdmsMessage_RequestedSignIn( - dco_decode_box_autoadd_idms_requested_sign_in(raw[1]), - ); - case 1: - return IdmsMessage_TeardownSignIn( - dco_decode_box_autoadd_teardown_sign_in(raw[1]), - ); - case 2: - return IdmsMessage_CircleRequest( - dco_decode_box_autoadd_idms_circle_message(raw[1]), - dco_decode_opt_box_autoadd_idms_requested_sign_in(raw[2]), - ); - default: - throw Exception("unreachable"); - } + return CloudSyncRawRecordKind.values[raw as int]; } @protected - IdmsRequestedSignIn dco_decode_idms_requested_sign_in(dynamic raw) { + CloudSyncRawSystemFields dco_decode_cloud_sync_raw_system_fields( + dynamic raw, + ) { // Codec=Dco (DartCObject based), see doc to use other codecs final arr = raw as List; if (arr.length != 4) throw Exception('unexpected arr length: expect 4 but see ${arr.length}'); - return IdmsRequestedSignIn( - aps: dco_decode_aps_data(arr[0]), - txnid: dco_decode_String(arr[1]), - akdata: dco_decode_ak_data(arr[2]), - adsid: dco_decode_String(arr[3]), + return CloudSyncRawSystemFields( + etag: dco_decode_opt_String(arr[0]), + createdAt: dco_decode_opt_box_autoadd_f_64(arr[1]), + modifiedAt: dco_decode_opt_box_autoadd_f_64(arr[2]), + permission: dco_decode_opt_box_autoadd_u_32(arr[3]), ); } @protected - IndexedMessagePart dco_decode_indexed_message_part(dynamic raw) { + CloudSyncTransientAssociationKind + dco_decode_cloud_sync_transient_association_kind(dynamic raw) { // Codec=Dco (DartCObject based), see doc to use other codecs - final arr = raw as List; - if (arr.length != 3) - throw Exception('unexpected arr length: expect 3 but see ${arr.length}'); - return IndexedMessagePart( - part_: dco_decode_message_part(arr[0]), - idx: dco_decode_opt_CastedPrimitive_usize(arr[1]), - ext: dco_decode_opt_box_autoadd_part_extension(arr[2]), - ); + return CloudSyncTransientAssociationKind.values[raw as int]; } @protected - LetMeInRequest dco_decode_let_me_in_request(dynamic raw) { + CloudSyncTransientAttachmentPayload + dco_decode_cloud_sync_transient_attachment_payload(dynamic raw) { // Codec=Dco (DartCObject based), see doc to use other codecs final arr = raw as List; - if (arr.length != 7) - throw Exception('unexpected arr length: expect 7 but see ${arr.length}'); - return LetMeInRequest( - sharedSecret: dco_decode_list_prim_u_8_strict(arr[0]), - pseud: dco_decode_String(arr[1]), - requestor: dco_decode_String(arr[2]), - nickname: dco_decode_opt_String(arr[3]), - token: dco_decode_list_prim_u_8_strict(arr[4]), - delegationUuid: dco_decode_opt_String(arr[5]), - usage: dco_decode_opt_String(arr[6]), + if (arr.length != 17) + throw Exception('unexpected arr length: expect 17 but see ${arr.length}'); + return CloudSyncTransientAttachmentPayload( + logicalEntityKeyHash: dco_decode_String(arr[0]), + canonicalGuid: dco_decode_String(arr[1]), + ownerLogicalKeyHash: dco_decode_opt_String(arr[2]), + ownerCanonicalGuid: dco_decode_opt_String(arr[3]), + ownerPart: dco_decode_opt_box_autoadd_u_32(arr[4]), + utiState: dco_decode_cloud_sync_transient_field_state(arr[5]), + uti: dco_decode_opt_String(arr[6]), + fileNameState: dco_decode_cloud_sync_transient_field_state(arr[7]), + fileName: dco_decode_opt_String(arr[8]), + mimeTypeState: dco_decode_cloud_sync_transient_field_state(arr[9]), + mimeType: dco_decode_opt_String(arr[10]), + totalBytesState: dco_decode_cloud_sync_transient_field_state(arr[11]), + totalBytes: dco_decode_opt_box_autoadd_u_64(arr[12]), + isOutgoingState: dco_decode_cloud_sync_transient_field_state(arr[13]), + isOutgoing: dco_decode_opt_box_autoadd_bool(arr[14]), + protectedLocalReferenceState: dco_decode_cloud_sync_transient_field_state( + arr[15], + ), + protectedLocalReference: dco_decode_opt_String(arr[16]), ); } @protected - LinkMeta dco_decode_link_meta(dynamic raw) { + CloudSyncTransientAttributedBody + dco_decode_cloud_sync_transient_attributed_body(dynamic raw) { // Codec=Dco (DartCObject based), see doc to use other codecs final arr = raw as List; if (arr.length != 2) throw Exception('unexpected arr length: expect 2 but see ${arr.length}'); - return LinkMeta( - data: dco_decode_lp_link_metadata(arr[0]), - attachments: dco_decode_list_list_prim_u_8_strict(arr[1]), + return CloudSyncTransientAttributedBody( + text: dco_decode_String(arr[0]), + runs: dco_decode_list_cloud_sync_transient_text_run(arr[1]), ); } @protected - List - dco_decode_list_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerIDSUser( - dynamic raw) { + CloudSyncTransientChatPayload dco_decode_cloud_sync_transient_chat_payload( + dynamic raw, + ) { // Codec=Dco (DartCObject based), see doc to use other codecs - return (raw as List) - .map( - dco_decode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerIDSUser) - .toList(); + final arr = raw as List; + if (arr.length != 18) + throw Exception('unexpected arr length: expect 18 but see ${arr.length}'); + return CloudSyncTransientChatPayload( + logicalEntityKeyHash: dco_decode_String(arr[0]), + canonicalGuid: dco_decode_String(arr[1]), + chatIdentifier: dco_decode_String(arr[2]), + groupId: dco_decode_String(arr[3]), + originalGroupId: dco_decode_String(arr[4]), + service: dco_decode_cloud_sync_transient_service(arr[5]), + style: dco_decode_cloud_sync_transient_chat_style(arr[6]), + participantHandles: dco_decode_list_String(arr[7]), + displayNameState: dco_decode_cloud_sync_transient_field_state(arr[8]), + displayName: dco_decode_opt_String(arr[9]), + lastAddressedHandleState: dco_decode_cloud_sync_transient_field_state( + arr[10], + ), + lastAddressedHandle: dco_decode_opt_String(arr[11]), + groupVersionState: dco_decode_cloud_sync_transient_field_state(arr[12]), + groupVersion: dco_decode_opt_box_autoadd_u_32(arr[13]), + lastSeenMessageGuidState: dco_decode_cloud_sync_transient_field_state( + arr[14], + ), + lastSeenMessageGuid: dco_decode_opt_String(arr[15]), + groupPhotoGuidState: dco_decode_cloud_sync_transient_field_state(arr[16]), + groupPhotoGuid: dco_decode_opt_String(arr[17]), + ); } @protected - List - dco_decode_list_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerStCollapsedValue( - dynamic raw) { + CloudSyncTransientChatStyle dco_decode_cloud_sync_transient_chat_style( + dynamic raw, + ) { // Codec=Dco (DartCObject based), see doc to use other codecs - return (raw as List) - .map( - dco_decode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerStCollapsedValue) - .toList(); + return CloudSyncTransientChatStyle.values[raw as int]; } @protected - List - dco_decode_list_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerViableBottle( - dynamic raw) { + CloudSyncTransientDecodeResult dco_decode_cloud_sync_transient_decode_result( + dynamic raw, + ) { // Codec=Dco (DartCObject based), see doc to use other codecs - return (raw as List) - .map( - dco_decode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerViableBottle) - .toList(); + final arr = raw as List; + if (arr.length != 11) + throw Exception('unexpected arr length: expect 11 but see ${arr.length}'); + return CloudSyncTransientDecodeResult( + protectedSourceReference: dco_decode_opt_String(arr[0]), + generation: dco_decode_u_64(arr[1]), + changeId: dco_decode_opt_String(arr[2]), + entityKind: dco_decode_opt_box_autoadd_cloud_sync_transient_entity_kind( + arr[3], + ), + mutationKind: + dco_decode_opt_box_autoadd_cloud_sync_transient_mutation_kind(arr[4]), + snapshot: dco_decode_opt_box_autoadd_cloud_sync_transient_snapshot( + arr[5], + ), + payload: dco_decode_opt_box_autoadd_cloud_sync_transient_payload(arr[6]), + tombstone: dco_decode_opt_box_autoadd_cloud_sync_transient_tombstone( + arr[7], + ), + deferredReason: + dco_decode_opt_box_autoadd_cloud_sync_transient_deferred_reason( + arr[8], + ), + quarantineReason: + dco_decode_opt_box_autoadd_cloud_sync_transient_quarantine_reason( + arr[9], + ), + failureCode: dco_decode_opt_box_autoadd_cloud_sync_transient_failure_code( + arr[10], + ), + ); } @protected - List dco_decode_list_String(dynamic raw) { + CloudSyncTransientDeferredReason + dco_decode_cloud_sync_transient_deferred_reason(dynamic raw) { // Codec=Dco (DartCObject based), see doc to use other codecs - return (raw as List).map(dco_decode_String).toList(); + return CloudSyncTransientDeferredReason.values[raw as int]; } @protected - List dco_decode_list_cloud_participant(dynamic raw) { + CloudSyncTransientEditPart dco_decode_cloud_sync_transient_edit_part( + dynamic raw, + ) { // Codec=Dco (DartCObject based), see doc to use other codecs - return (raw as List).map(dco_decode_cloud_participant).toList(); + final arr = raw as List; + if (arr.length != 4) + throw Exception('unexpected arr length: expect 4 but see ${arr.length}'); + return CloudSyncTransientEditPart( + partKeyHash: dco_decode_String(arr[0]), + revision: dco_decode_u_32(arr[1]), + contentDigest: dco_decode_String(arr[2]), + modifiedAtMillis: dco_decode_i_64(arr[3]), + ); } @protected - List dco_decode_list_dart_beacon(dynamic raw) { + CloudSyncTransientEntityKind dco_decode_cloud_sync_transient_entity_kind( + dynamic raw, + ) { // Codec=Dco (DartCObject based), see doc to use other codecs - return (raw as List).map(dco_decode_dart_beacon).toList(); + return CloudSyncTransientEntityKind.values[raw as int]; } @protected - List dco_decode_list_follow(dynamic raw) { + CloudSyncTransientFailureCode dco_decode_cloud_sync_transient_failure_code( + dynamic raw, + ) { // Codec=Dco (DartCObject based), see doc to use other codecs - return (raw as List).map(dco_decode_follow).toList(); + return CloudSyncTransientFailureCode.values[raw as int]; } @protected - List dco_decode_list_found_device(dynamic raw) { + CloudSyncTransientFieldState dco_decode_cloud_sync_transient_field_state( + dynamic raw, + ) { // Codec=Dco (DartCObject based), see doc to use other codecs - return (raw as List).map(dco_decode_found_device).toList(); + return CloudSyncTransientFieldState.values[raw as int]; } @protected - List dco_decode_list_ft_member(dynamic raw) { + CloudSyncTransientGroupPhotoPayload + dco_decode_cloud_sync_transient_group_photo_payload(dynamic raw) { // Codec=Dco (DartCObject based), see doc to use other codecs - return (raw as List).map(dco_decode_ft_member).toList(); + final arr = raw as List; + if (arr.length != 4) + throw Exception('unexpected arr length: expect 4 but see ${arr.length}'); + return CloudSyncTransientGroupPhotoPayload( + logicalEntityKeyHash: dco_decode_String(arr[0]), + ownerLogicalKeyHash: dco_decode_String(arr[1]), + photoGuid: dco_decode_String(arr[2]), + protectedLocalReference: dco_decode_String(arr[3]), + ); } @protected - List dco_decode_list_ft_session(dynamic raw) { + CloudSyncTransientKnownMessageFlags + dco_decode_cloud_sync_transient_known_message_flags(dynamic raw) { // Codec=Dco (DartCObject based), see doc to use other codecs - return (raw as List).map(dco_decode_ft_session).toList(); + final arr = raw as List; + if (arr.length != 6) + throw Exception('unexpected arr length: expect 6 but see ${arr.length}'); + return CloudSyncTransientKnownMessageFlags( + fromMe: dco_decode_bool(arr[0]), + delivered: dco_decode_bool(arr[1]), + read: dco_decode_bool(arr[2]), + hasDataDetectorResults: dco_decode_bool(arr[3]), + deliveredQuietly: dco_decode_bool(arr[4]), + didNotifyRecipient: dco_decode_bool(arr[5]), + ); } @protected - List dco_decode_list_group_summary_member(dynamic raw) { + CloudSyncTransientMessageEdit dco_decode_cloud_sync_transient_message_edit( + dynamic raw, + ) { // Codec=Dco (DartCObject based), see doc to use other codecs - return (raw as List).map(dco_decode_group_summary_member).toList(); + final arr = raw as List; + if (arr.length != 6) + throw Exception('unexpected arr length: expect 6 but see ${arr.length}'); + return CloudSyncTransientMessageEdit( + part_: dco_decode_u_32(arr[0]), + revision: dco_decode_u_32(arr[1]), + bodies: dco_decode_list_cloud_sync_transient_attributed_body(arr[2]), + modifiedAtMillis: dco_decode_i_64(arr[3]), + originalRangeLocation: dco_decode_opt_box_autoadd_u_32(arr[4]), + originalRangeLength: dco_decode_opt_box_autoadd_u_32(arr[5]), + ); } @protected - List dco_decode_list_indexed_message_part(dynamic raw) { + CloudSyncTransientMessagePayload + dco_decode_cloud_sync_transient_message_payload(dynamic raw) { // Codec=Dco (DartCObject based), see doc to use other codecs - return (raw as List).map(dco_decode_indexed_message_part).toList(); + final arr = raw as List; + if (arr.length != 40) + throw Exception('unexpected arr length: expect 40 but see ${arr.length}'); + return CloudSyncTransientMessagePayload( + logicalEntityKeyHash: dco_decode_String(arr[0]), + canonicalGuid: dco_decode_String(arr[1]), + chatAliasKeyHash: dco_decode_String(arr[2]), + chatIdentifier: dco_decode_String(arr[3]), + senderHandle: dco_decode_String(arr[4]), + createdAtMillis: dco_decode_i_64(arr[5]), + error: dco_decode_i_64(arr[6]), + service: dco_decode_cloud_sync_transient_service(arr[7]), + subjectState: dco_decode_cloud_sync_transient_field_state(arr[8]), + subject: dco_decode_opt_String(arr[9]), + bodyState: dco_decode_cloud_sync_transient_field_state(arr[10]), + body: dco_decode_opt_String(arr[11]), + attributedBodiesState: dco_decode_cloud_sync_transient_field_state( + arr[12], + ), + attributedBodies: dco_decode_list_cloud_sync_transient_attributed_body( + arr[13], + ), + balloonBundleIdState: dco_decode_cloud_sync_transient_field_state( + arr[14], + ), + balloonBundleId: dco_decode_opt_String(arr[15]), + effectState: dco_decode_cloud_sync_transient_field_state(arr[16]), + effect: dco_decode_opt_String(arr[17]), + readAtMillisState: dco_decode_cloud_sync_transient_field_state(arr[18]), + readAtMillis: dco_decode_opt_box_autoadd_i_64(arr[19]), + deliveredAtMillisState: dco_decode_cloud_sync_transient_field_state( + arr[20], + ), + deliveredAtMillis: dco_decode_opt_box_autoadd_i_64(arr[21]), + knownFlags: dco_decode_cloud_sync_transient_known_message_flags(arr[22]), + associationKind: dco_decode_cloud_sync_transient_association_kind( + arr[23], + ), + reactionKind: + dco_decode_opt_box_autoadd_cloud_sync_transient_reaction_kind( + arr[24], + ), + reactionRemoved: dco_decode_bool(arr[25]), + reactionParentLogicalKeyHash: dco_decode_opt_String(arr[26]), + reactionParentCanonicalGuid: dco_decode_opt_String(arr[27]), + reactionParentPart: dco_decode_opt_box_autoadd_u_32(arr[28]), + associatedRangeLocation: dco_decode_opt_box_autoadd_u_32(arr[29]), + associatedRangeLength: dco_decode_opt_box_autoadd_u_32(arr[30]), + replyParentLogicalKeyHash: dco_decode_opt_String(arr[31]), + replyParentCanonicalGuid: dco_decode_opt_String(arr[32]), + replyParentPart: dco_decode_opt_String(arr[33]), + editsState: dco_decode_cloud_sync_transient_field_state(arr[34]), + edits: dco_decode_list_cloud_sync_transient_message_edit(arr[35]), + retractedPartsState: dco_decode_cloud_sync_transient_field_state(arr[36]), + retractedParts: dco_decode_list_prim_u_32_strict(arr[37]), + associatedEmojiState: dco_decode_cloud_sync_transient_field_state( + arr[38], + ), + associatedEmoji: dco_decode_opt_String(arr[39]), + ); } @protected - List dco_decode_list_list_prim_u_8_strict(dynamic raw) { + CloudSyncTransientMutationKind dco_decode_cloud_sync_transient_mutation_kind( + dynamic raw, + ) { // Codec=Dco (DartCObject based), see doc to use other codecs - return (raw as List).map(dco_decode_list_prim_u_8_strict).toList(); + return CloudSyncTransientMutationKind.values[raw as int]; } @protected - List dco_decode_list_message_edit(dynamic raw) { + CloudSyncTransientPayload dco_decode_cloud_sync_transient_payload( + dynamic raw, + ) { // Codec=Dco (DartCObject based), see doc to use other codecs - return (raw as List).map(dco_decode_message_edit).toList(); + final arr = raw as List; + if (arr.length != 4) + throw Exception('unexpected arr length: expect 4 but see ${arr.length}'); + return CloudSyncTransientPayload( + chat: dco_decode_opt_box_autoadd_cloud_sync_transient_chat_payload( + arr[0], + ), + message: dco_decode_opt_box_autoadd_cloud_sync_transient_message_payload( + arr[1], + ), + attachment: + dco_decode_opt_box_autoadd_cloud_sync_transient_attachment_payload( + arr[2], + ), + groupPhoto: + dco_decode_opt_box_autoadd_cloud_sync_transient_group_photo_payload( + arr[3], + ), + ); } @protected - List dco_decode_list_message_target(dynamic raw) { + CloudSyncTransientQuarantineReason + dco_decode_cloud_sync_transient_quarantine_reason(dynamic raw) { // Codec=Dco (DartCObject based), see doc to use other codecs - return (raw as List).map(dco_decode_message_target).toList(); + return CloudSyncTransientQuarantineReason.values[raw as int]; } @protected - List dco_decode_list_password_manager_alt_domain( - dynamic raw) { + CloudSyncTransientReactionKind dco_decode_cloud_sync_transient_reaction_kind( + dynamic raw, + ) { // Codec=Dco (DartCObject based), see doc to use other codecs - return (raw as List) - .map(dco_decode_password_manager_alt_domain) - .toList(); + return CloudSyncTransientReactionKind.values[raw as int]; } @protected - List dco_decode_list_password_manager_meta_change( - dynamic raw) { + CloudSyncTransientService dco_decode_cloud_sync_transient_service( + dynamic raw, + ) { // Codec=Dco (DartCObject based), see doc to use other codecs - return (raw as List) - .map(dco_decode_password_manager_meta_change) - .toList(); + return CloudSyncTransientService.values[raw as int]; } @protected - List dco_decode_list_photo_poster_layer(dynamic raw) { + CloudSyncTransientSnapshot dco_decode_cloud_sync_transient_snapshot( + dynamic raw, + ) { // Codec=Dco (DartCObject based), see doc to use other codecs - return (raw as List).map(dco_decode_photo_poster_layer).toList(); + final arr = raw as List; + if (arr.length != 13) + throw Exception('unexpected arr length: expect 13 but see ${arr.length}'); + return CloudSyncTransientSnapshot( + entityKind: dco_decode_cloud_sync_transient_entity_kind(arr[0]), + logicalEntityKeyHash: dco_decode_String(arr[1]), + parentLogicalKeyHash: dco_decode_opt_String(arr[2]), + immutableContentDigest: dco_decode_opt_String(arr[3]), + createdAtMillis: dco_decode_opt_box_autoadd_i_64(arr[4]), + readAtMillis: dco_decode_opt_box_autoadd_i_64(arr[5]), + deliveredAtMillis: dco_decode_opt_box_autoadd_i_64(arr[6]), + editParts: dco_decode_list_cloud_sync_transient_edit_part(arr[7]), + retractedAtMillis: dco_decode_opt_box_autoadd_i_64(arr[8]), + groupVersion: dco_decode_opt_box_autoadd_u_32(arr[9]), + groupMetadataDigest: dco_decode_opt_String(arr[10]), + etagHash: dco_decode_opt_String(arr[11]), + protectedSourceReference: dco_decode_String(arr[12]), + ); } @protected - List dco_decode_list_poster_asset(dynamic raw) { + CloudSyncTransientTextRun dco_decode_cloud_sync_transient_text_run( + dynamic raw, + ) { // Codec=Dco (DartCObject based), see doc to use other codecs - return (raw as List).map(dco_decode_poster_asset).toList(); + final arr = raw as List; + if (arr.length != 12) + throw Exception('unexpected arr length: expect 12 but see ${arr.length}'); + return CloudSyncTransientTextRun( + startUtf16: dco_decode_u_32(arr[0]), + lengthUtf16: dco_decode_u_32(arr[1]), + messagePart: dco_decode_opt_box_autoadd_u_32(arr[2]), + attachmentCanonicalGuid: dco_decode_opt_String(arr[3]), + attachmentLogicalKeyHash: dco_decode_opt_String(arr[4]), + mentionHandle: dco_decode_opt_String(arr[5]), + audioTranscript: dco_decode_opt_String(arr[6]), + textEffect: dco_decode_opt_box_autoadd_i_64(arr[7]), + bold: dco_decode_opt_box_autoadd_bool(arr[8]), + italic: dco_decode_opt_box_autoadd_bool(arr[9]), + strikethrough: dco_decode_opt_box_autoadd_bool(arr[10]), + underline: dco_decode_opt_box_autoadd_bool(arr[11]), + ); } @protected - List dco_decode_list_poster_color(dynamic raw) { + CloudSyncTransientTombstone dco_decode_cloud_sync_transient_tombstone( + dynamic raw, + ) { // Codec=Dco (DartCObject based), see doc to use other codecs - return (raw as List).map(dco_decode_poster_color).toList(); + final arr = raw as List; + if (arr.length != 4) + throw Exception('unexpected arr length: expect 4 but see ${arr.length}'); + return CloudSyncTransientTombstone( + entityKind: dco_decode_cloud_sync_transient_entity_kind(arr[0]), + logicalEntityKeyHash: dco_decode_String(arr[1]), + deletedAtMillis: dco_decode_opt_box_autoadd_i_64(arr[2]), + serverConfirmed: dco_decode_bool(arr[3]), + ); } @protected - Float64List dco_decode_list_prim_f_64_strict(dynamic raw) { + ConversationData dco_decode_conversation_data(dynamic raw) { // Codec=Dco (DartCObject based), see doc to use other codecs - return raw as Float64List; + final arr = raw as List; + if (arr.length != 4) + throw Exception('unexpected arr length: expect 4 but see ${arr.length}'); + return ConversationData( + participants: dco_decode_list_String(arr[0]), + cvName: dco_decode_opt_String(arr[1]), + senderGuid: dco_decode_opt_String(arr[2]), + afterGuid: dco_decode_opt_String(arr[3]), + ); } @protected - Int64List dco_decode_list_prim_i_64_strict(dynamic raw) { + DartBeacon dco_decode_dart_beacon(dynamic raw) { // Codec=Dco (DartCObject based), see doc to use other codecs - return dcoDecodeInt64List(raw); + final arr = raw as List; + if (arr.length != 9) + throw Exception('unexpected arr length: expect 9 but see ${arr.length}'); + return DartBeacon( + naming: dco_decode_beacon_naming_record(arr[0]), + lastReport: + dco_decode_opt_box_autoadd_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerLocationReport( + arr[1], + ), + productId: dco_decode_CastedPrimitive_i_64(arr[2]), + batteryLevel: dco_decode_opt_CastedPrimitive_i_64(arr[3]), + vendorId: dco_decode_CastedPrimitive_i_64(arr[4]), + model: dco_decode_String(arr[5]), + systemVersion: dco_decode_String(arr[6]), + id: dco_decode_String(arr[7]), + shared: dco_decode_opt_box_autoadd_dart_beacon_share_info(arr[8]), + ); } @protected - Uint32List dco_decode_list_prim_u_32_strict(dynamic raw) { + DartBeaconShareInfo dco_decode_dart_beacon_share_info(dynamic raw) { // Codec=Dco (DartCObject based), see doc to use other codecs - return raw as Uint32List; + final arr = raw as List; + if (arr.length != 3) + throw Exception('unexpected arr length: expect 3 but see ${arr.length}'); + return DartBeaconShareInfo( + shareId: dco_decode_String(arr[0]), + acceptanceState: dco_decode_CastedPrimitive_i_64(arr[1]), + ownerHandle: dco_decode_String(arr[2]), + ); } @protected - List dco_decode_list_prim_u_8_loose(dynamic raw) { + DeleteTarget dco_decode_delete_target(dynamic raw) { // Codec=Dco (DartCObject based), see doc to use other codecs - return raw as List; + switch (raw[0]) { + case 0: + return DeleteTarget_Chat(dco_decode_box_autoadd_operated_chat(raw[1])); + case 1: + return DeleteTarget_Messages(dco_decode_list_String(raw[1])); + default: + throw Exception("unreachable"); + } } @protected - Uint8List dco_decode_list_prim_u_8_strict(dynamic raw) { + DeviceInfo dco_decode_device_info(dynamic raw) { // Codec=Dco (DartCObject based), see doc to use other codecs - return raw as Uint8List; + final arr = raw as List; + if (arr.length != 4) + throw Exception('unexpected arr length: expect 4 but see ${arr.length}'); + return DeviceInfo( + name: dco_decode_String(arr[0]), + serial: dco_decode_String(arr[1]), + osVersion: dco_decode_String(arr[2]), + encodedData: dco_decode_opt_list_prim_u_8_strict(arr[3]), + ); } @protected - List dco_decode_list_private_device_info(dynamic raw) { + EditMessage dco_decode_edit_message(dynamic raw) { // Codec=Dco (DartCObject based), see doc to use other codecs - return (raw as List).map(dco_decode_private_device_info).toList(); + final arr = raw as List; + if (arr.length != 3) + throw Exception('unexpected arr length: expect 3 but see ${arr.length}'); + return EditMessage( + tuuid: dco_decode_String(arr[0]), + editPart: dco_decode_CastedPrimitive_u_64(arr[1]), + newParts: dco_decode_message_parts(arr[2]), + ); } @protected - List<(String, Asset)> - dco_decode_list_record_string_auto_owned_rust_opaque_flutter_rust_bridgefor_generated_rust_auto_opaque_inner_asset( - dynamic raw) { + ErrorMessage dco_decode_error_message(dynamic raw) { // Codec=Dco (DartCObject based), see doc to use other codecs - return (raw as List) - .map( - dco_decode_record_string_auto_owned_rust_opaque_flutter_rust_bridgefor_generated_rust_auto_opaque_inner_asset) - .toList(); + final arr = raw as List; + if (arr.length != 3) + throw Exception('unexpected arr length: expect 3 but see ${arr.length}'); + return ErrorMessage( + forUuid: dco_decode_String(arr[0]), + status: dco_decode_u_64(arr[1]), + statusStr: dco_decode_String(arr[2]), + ); } @protected - List<(String, StCollapsedValue)> - dco_decode_list_record_string_auto_owned_rust_opaque_flutter_rust_bridgefor_generated_rust_auto_opaque_inner_st_collapsed_value( - dynamic raw) { + ExtensionApp dco_decode_extension_app(dynamic raw) { // Codec=Dco (DartCObject based), see doc to use other codecs - return (raw as List) - .map( - dco_decode_record_string_auto_owned_rust_opaque_flutter_rust_bridgefor_generated_rust_auto_opaque_inner_st_collapsed_value) - .toList(); + final arr = raw as List; + if (arr.length != 4) + throw Exception('unexpected arr length: expect 4 but see ${arr.length}'); + return ExtensionApp( + name: dco_decode_String(arr[0]), + appId: dco_decode_opt_CastedPrimitive_u_64(arr[1]), + bundleId: dco_decode_String(arr[2]), + balloon: dco_decode_opt_box_autoadd_balloon(arr[3]), + ); } @protected - List<(String, bool)> dco_decode_list_record_string_bool(dynamic raw) { + double dco_decode_f_32(dynamic raw) { // Codec=Dco (DartCObject based), see doc to use other codecs - return (raw as List).map(dco_decode_record_string_bool).toList(); + return raw as double; } @protected - List<(String, int)> dco_decode_list_record_string_casted_primitive_u_64( - dynamic raw) { + double dco_decode_f_64(dynamic raw) { // Codec=Dco (DartCObject based), see doc to use other codecs - return (raw as List) - .map(dco_decode_record_string_casted_primitive_u_64) - .toList(); + return raw as double; } @protected - List<(String, CloudAttachment)> - dco_decode_list_record_string_cloud_attachment(dynamic raw) { + FFIFilePackager dco_decode_ffi_file_packager(dynamic raw) { // Codec=Dco (DartCObject based), see doc to use other codecs - return (raw as List) - .map(dco_decode_record_string_cloud_attachment) - .toList(); + final arr = raw as List; + if (arr.length != 0) + throw Exception('unexpected arr length: expect 0 but see ${arr.length}'); + return FFIFilePackager(); } @protected - List<(String, CloudChat)> dco_decode_list_record_string_cloud_chat( - dynamic raw) { + Follow dco_decode_follow(dynamic raw) { // Codec=Dco (DartCObject based), see doc to use other codecs - return (raw as List) - .map(dco_decode_record_string_cloud_chat) - .toList(); + final arr = raw as List; + if (arr.length != 18) + throw Exception('unexpected arr length: expect 18 but see ${arr.length}'); + return Follow( + createTimestamp: dco_decode_i_64(arr[0]), + expires: dco_decode_i_64(arr[1]), + id: dco_decode_String(arr[2]), + invitationAcceptedHandles: dco_decode_list_String(arr[3]), + invitationFromHandles: dco_decode_list_String(arr[4]), + isFromMessages: dco_decode_bool(arr[5]), + offerId: dco_decode_opt_String(arr[6]), + onlyInEvent: dco_decode_bool(arr[7]), + personIdHash: dco_decode_String(arr[8]), + secureLocationsCapable: dco_decode_bool(arr[9]), + shallowOrLiveSecureLocationsCapable: dco_decode_bool(arr[10]), + source: dco_decode_String(arr[11]), + tkPermission: dco_decode_bool(arr[12]), + updateTimestamp: dco_decode_i_64(arr[13]), + fallbackToLegacyAllowed: dco_decode_opt_box_autoadd_bool(arr[14]), + optedNotToShare: dco_decode_opt_box_autoadd_bool(arr[15]), + lastLocation: dco_decode_opt_box_autoadd_location(arr[16]), + locateInProgress: dco_decode_bool(arr[17]), + ); } @protected - List<(String, CloudMessage)> dco_decode_list_record_string_cloud_message( - dynamic raw) { + FoundDevice dco_decode_found_device(dynamic raw) { // Codec=Dco (DartCObject based), see doc to use other codecs - return (raw as List) - .map(dco_decode_record_string_cloud_message) - .toList(); + final arr = raw as List; + if (arr.length != 35) + throw Exception('unexpected arr length: expect 35 but see ${arr.length}'); + return FoundDevice( + deviceModel: dco_decode_opt_String(arr[0]), + lowPowerMode: dco_decode_opt_box_autoadd_bool(arr[1]), + passcodeLength: dco_decode_opt_box_autoadd_i_64(arr[2]), + id: dco_decode_opt_String(arr[3]), + batteryStatus: dco_decode_opt_String(arr[4]), + lostModeCapable: dco_decode_opt_box_autoadd_bool(arr[5]), + batteryLevel: dco_decode_opt_box_autoadd_f_64(arr[6]), + locationEnabled: dco_decode_opt_box_autoadd_bool(arr[7]), + isConsideredAccessory: dco_decode_opt_box_autoadd_bool(arr[8]), + location: dco_decode_opt_box_autoadd_location(arr[9]), + modelDisplayName: dco_decode_opt_String(arr[10]), + deviceColor: dco_decode_opt_String(arr[11]), + activationLocked: dco_decode_opt_box_autoadd_bool(arr[12]), + rm2State: dco_decode_opt_box_autoadd_i_64(arr[13]), + locFoundEnabled: dco_decode_opt_box_autoadd_bool(arr[14]), + nwd: dco_decode_opt_box_autoadd_bool(arr[15]), + deviceStatus: dco_decode_opt_String(arr[16]), + fmlyShare: dco_decode_opt_box_autoadd_bool(arr[17]), + features: dco_decode_Map_String_bool(arr[18]), + thisDevice: dco_decode_opt_box_autoadd_bool(arr[19]), + lostModeEnabled: dco_decode_opt_box_autoadd_bool(arr[20]), + deviceDisplayName: dco_decode_opt_String(arr[21]), + name: dco_decode_opt_String(arr[22]), + canWipeAfterLock: dco_decode_opt_box_autoadd_bool(arr[23]), + isMac: dco_decode_opt_box_autoadd_bool(arr[24]), + rawDeviceModel: dco_decode_opt_String(arr[25]), + baUuid: dco_decode_opt_String(arr[26]), + deviceDiscoveryId: dco_decode_opt_String(arr[27]), + scd: dco_decode_opt_box_autoadd_bool(arr[28]), + locationCapable: dco_decode_opt_box_autoadd_bool(arr[29]), + wipeInProgress: dco_decode_opt_box_autoadd_bool(arr[30]), + darkWake: dco_decode_opt_box_autoadd_bool(arr[31]), + deviceWithYou: dco_decode_opt_box_autoadd_bool(arr[32]), + maxMsgChar: dco_decode_opt_box_autoadd_i_64(arr[33]), + deviceClass: dco_decode_opt_String(arr[34]), + ); } @protected - List<(String, FTParticipant)> dco_decode_list_record_string_ft_participant( - dynamic raw) { + FTMember dco_decode_ft_member(dynamic raw) { // Codec=Dco (DartCObject based), see doc to use other codecs - return (raw as List) - .map(dco_decode_record_string_ft_participant) - .toList(); + final arr = raw as List; + if (arr.length != 2) + throw Exception('unexpected arr length: expect 2 but see ${arr.length}'); + return FTMember( + nickname: dco_decode_opt_String(arr[0]), + handle: dco_decode_String(arr[1]), + ); } @protected - List<(String, GroupSummary)> dco_decode_list_record_string_group_summary( - dynamic raw) { + FTMessage dco_decode_ft_message(dynamic raw) { // Codec=Dco (DartCObject based), see doc to use other codecs - return (raw as List) - .map(dco_decode_record_string_group_summary) - .toList(); + switch (raw[0]) { + case 0: + return FTMessage_LetMeInRequest( + dco_decode_box_autoadd_let_me_in_request(raw[1]), + ); + case 1: + return FTMessage_LinkChanged(guid: dco_decode_String(raw[1])); + case 2: + return FTMessage_JoinEvent( + guid: dco_decode_String(raw[1]), + participant: dco_decode_u_64(raw[2]), + handle: dco_decode_String(raw[3]), + ring: dco_decode_bool(raw[4]), + ); + case 3: + return FTMessage_AddMembers( + guid: dco_decode_String(raw[1]), + members: dco_decode_Set_ft_member(raw[2]), + ring: dco_decode_bool(raw[3]), + ); + case 4: + return FTMessage_RemoveMembers( + guid: dco_decode_String(raw[1]), + members: dco_decode_Set_ft_member(raw[2]), + ); + case 5: + return FTMessage_LeaveEvent( + guid: dco_decode_String(raw[1]), + participant: dco_decode_u_64(raw[2]), + handle: dco_decode_String(raw[3]), + ); + case 6: + return FTMessage_Ring(guid: dco_decode_String(raw[1])); + case 7: + return FTMessage_Decline(guid: dco_decode_String(raw[1])); + case 8: + return FTMessage_RespondedElsewhere(guid: dco_decode_String(raw[1])); + default: + throw Exception("unreachable"); + } } @protected - List<(String, List)> - dco_decode_list_record_string_list_message_edit(dynamic raw) { + FTMode dco_decode_ft_mode(dynamic raw) { // Codec=Dco (DartCObject based), see doc to use other codecs - return (raw as List) - .map(dco_decode_record_string_list_message_edit) - .toList(); + return FTMode.values[raw as int]; } @protected - List<(String, Uint8List)> dco_decode_list_record_string_list_prim_u_8_strict( - dynamic raw) { + FTParticipant dco_decode_ft_participant(dynamic raw) { // Codec=Dco (DartCObject based), see doc to use other codecs - return (raw as List) - .map(dco_decode_record_string_list_prim_u_8_strict) - .toList(); + final arr = raw as List; + if (arr.length != 5) + throw Exception('unexpected arr length: expect 5 but see ${arr.length}'); + return FTParticipant( + token: dco_decode_opt_String(arr[0]), + handle: dco_decode_String(arr[1]), + participantId: dco_decode_CastedPrimitive_u_64(arr[2]), + lastJoinDate: dco_decode_opt_CastedPrimitive_u_64(arr[3]), + active: + dco_decode_opt_box_autoadd_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerConversationParticipant( + arr[4], + ), + ); } @protected - List<(String, MessageEditRange)> - dco_decode_list_record_string_message_edit_range(dynamic raw) { + FTSession dco_decode_ft_session(dynamic raw) { // Codec=Dco (DartCObject based), see doc to use other codecs - return (raw as List) - .map(dco_decode_record_string_message_edit_range) - .toList(); + final arr = raw as List; + if (arr.length != 12) + throw Exception('unexpected arr length: expect 12 but see ${arr.length}'); + return FTSession( + groupId: dco_decode_String(arr[0]), + myHandles: dco_decode_list_String(arr[1]), + participants: dco_decode_Map_String_ft_participant(arr[2]), + link: + dco_decode_opt_box_autoadd_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerConversationLink( + arr[3], + ), + members: dco_decode_Set_ft_member(arr[4]), + reportId: dco_decode_String(arr[5]), + startTime: dco_decode_opt_CastedPrimitive_u_64(arr[6]), + lastRekey: dco_decode_opt_CastedPrimitive_u_64(arr[7]), + isPropped: dco_decode_bool(arr[8]), + isRingingInaccurate: dco_decode_bool(arr[9]), + mode: dco_decode_opt_box_autoadd_ft_mode(arr[10]), + recentMemberAdds: dco_decode_Map_String_CastedPrimitive_u_64(arr[11]), + ); } @protected - List<(String, CloudAttachment?)> - dco_decode_list_record_string_opt_box_autoadd_cloud_attachment( - dynamic raw) { + GroupSummary dco_decode_group_summary(dynamic raw) { // Codec=Dco (DartCObject based), see doc to use other codecs - return (raw as List) - .map(dco_decode_record_string_opt_box_autoadd_cloud_attachment) - .toList(); + final arr = raw as List; + if (arr.length != 3) + throw Exception('unexpected arr length: expect 3 but see ${arr.length}'); + return GroupSummary( + displayName: dco_decode_String(arr[0]), + isOwner: dco_decode_bool(arr[1]), + members: dco_decode_list_group_summary_member(arr[2]), + ); } @protected - List<(String, CloudChat?)> - dco_decode_list_record_string_opt_box_autoadd_cloud_chat(dynamic raw) { + GroupSummaryMember dco_decode_group_summary_member(dynamic raw) { // Codec=Dco (DartCObject based), see doc to use other codecs - return (raw as List) - .map(dco_decode_record_string_opt_box_autoadd_cloud_chat) - .toList(); + final arr = raw as List; + if (arr.length != 4) + throw Exception('unexpected arr length: expect 4 but see ${arr.length}'); + return GroupSummaryMember( + name: dco_decode_opt_String(arr[0]), + handle: dco_decode_String(arr[1]), + userId: dco_decode_opt_String(arr[2]), + isJoined: dco_decode_bool(arr[3]), + ); } @protected - List<(String, CloudMessage?)> - dco_decode_list_record_string_opt_box_autoadd_cloud_message(dynamic raw) { + HwExtra dco_decode_hw_extra(dynamic raw) { // Codec=Dco (DartCObject based), see doc to use other codecs - return (raw as List) - .map(dco_decode_record_string_opt_box_autoadd_cloud_message) - .toList(); + final arr = raw as List; + if (arr.length != 5) + throw Exception('unexpected arr length: expect 5 but see ${arr.length}'); + return HwExtra( + version: dco_decode_String(arr[0]), + protocolVersion: dco_decode_u_32(arr[1]), + deviceId: dco_decode_String(arr[2]), + icloudUa: dco_decode_String(arr[3]), + aoskitVersion: dco_decode_String(arr[4]), + ); } @protected - List<(String, PasswordManagerMetaDataCtx)> - dco_decode_list_record_string_password_manager_meta_data_ctx( - dynamic raw) { + int dco_decode_i_32(dynamic raw) { // Codec=Dco (DartCObject based), see doc to use other codecs - return (raw as List) - .map(dco_decode_record_string_password_manager_meta_data_ctx) - .toList(); + return raw as int; } @protected - List<(String, (String?, Passkey))> - dco_decode_list_record_string_record_opt_string_passkey(dynamic raw) { + PlatformInt64 dco_decode_i_64(dynamic raw) { // Codec=Dco (DartCObject based), see doc to use other codecs - return (raw as List) - .map(dco_decode_record_string_record_opt_string_passkey) - .toList(); + return dcoDecodeI64(raw); } @protected - List<(String, (String?, PasswordManagerMeta))> - dco_decode_list_record_string_record_opt_string_password_manager_meta( - dynamic raw) { + IMessageNameRecord dco_decode_i_message_name_record(dynamic raw) { // Codec=Dco (DartCObject based), see doc to use other codecs - return (raw as List) - .map(dco_decode_record_string_record_opt_string_password_manager_meta) - .toList(); + final arr = raw as List; + if (arr.length != 3) + throw Exception('unexpected arr length: expect 3 but see ${arr.length}'); + return IMessageNameRecord( + name: dco_decode_String(arr[0]), + first: dco_decode_String(arr[1]), + last: dco_decode_String(arr[2]), + ); } @protected - List<(String, (String?, PasswordRawEntry))> - dco_decode_list_record_string_record_opt_string_password_raw_entry( - dynamic raw) { + IMessageNicknameRecord dco_decode_i_message_nickname_record(dynamic raw) { // Codec=Dco (DartCObject based), see doc to use other codecs - return (raw as List) - .map(dco_decode_record_string_record_opt_string_password_raw_entry) - .toList(); - } - - @protected - List<(String, (String?, WifiPassword))> - dco_decode_list_record_string_record_opt_string_wifi_password( - dynamic raw) { + final arr = raw as List; + if (arr.length != 3) + throw Exception('unexpected arr length: expect 3 but see ${arr.length}'); + return IMessageNicknameRecord( + name: dco_decode_i_message_name_record(arr[0]), + image: dco_decode_opt_list_prim_u_8_strict(arr[1]), + poster: dco_decode_opt_box_autoadd_i_message_poster_record(arr[2]), + ); + } + + @protected + IMessagePosterRecord dco_decode_i_message_poster_record(dynamic raw) { // Codec=Dco (DartCObject based), see doc to use other codecs - return (raw as List) - .map(dco_decode_record_string_record_opt_string_wifi_password) - .toList(); + final arr = raw as List; + if (arr.length != 3) + throw Exception('unexpected arr length: expect 3 but see ${arr.length}'); + return IMessagePosterRecord( + lowResPoster: dco_decode_list_prim_u_8_strict(arr[0]), + package: dco_decode_list_prim_u_8_strict(arr[1]), + meta: dco_decode_list_prim_u_8_strict(arr[2]), + ); } @protected - List<(String, ShareInviteContentData)> - dco_decode_list_record_string_share_invite_content_data(dynamic raw) { + IconChangeMessage dco_decode_icon_change_message(dynamic raw) { // Codec=Dco (DartCObject based), see doc to use other codecs - return (raw as List) - .map(dco_decode_record_string_share_invite_content_data) - .toList(); + final arr = raw as List; + if (arr.length != 2) + throw Exception('unexpected arr length: expect 2 but see ${arr.length}'); + return IconChangeMessage( + file: dco_decode_opt_box_autoadd_mmcs_file(arr[0]), + groupVersion: dco_decode_CastedPrimitive_u_64(arr[1]), + ); } @protected - List<(String, StatusKitPersonalConfig)> - dco_decode_list_record_string_status_kit_personal_config(dynamic raw) { + IdmsCircleMessage dco_decode_idms_circle_message(dynamic raw) { // Codec=Dco (DartCObject based), see doc to use other codecs - return (raw as List) - .map(dco_decode_record_string_status_kit_personal_config) - .toList(); + final arr = raw as List; + if (arr.length != 5) + throw Exception('unexpected arr length: expect 5 but see ${arr.length}'); + return IdmsCircleMessage( + step: dco_decode_u_32(arr[0]), + atxnid: dco_decode_String(arr[1]), + pake: dco_decode_opt_String(arr[2]), + ec: dco_decode_opt_box_autoadd_i_32(arr[3]), + idmsdata: dco_decode_String(arr[4]), + ); } @protected - List<(String, String)> dco_decode_list_record_string_string(dynamic raw) { + IdmsMessage dco_decode_idms_message(dynamic raw) { // Codec=Dco (DartCObject based), see doc to use other codecs - return (raw as List).map(dco_decode_record_string_string).toList(); + switch (raw[0]) { + case 0: + return IdmsMessage_RequestedSignIn( + dco_decode_box_autoadd_idms_requested_sign_in(raw[1]), + ); + case 1: + return IdmsMessage_TeardownSignIn( + dco_decode_box_autoadd_teardown_sign_in(raw[1]), + ); + case 2: + return IdmsMessage_CircleRequest( + dco_decode_box_autoadd_idms_circle_message(raw[1]), + dco_decode_opt_box_autoadd_idms_requested_sign_in(raw[2]), + ); + default: + throw Exception("unreachable"); + } } @protected - List<(String, SyncStatus)> dco_decode_list_record_string_sync_status( - dynamic raw) { + IdmsRequestedSignIn dco_decode_idms_requested_sign_in(dynamic raw) { // Codec=Dco (DartCObject based), see doc to use other codecs - return (raw as List) - .map(dco_decode_record_string_sync_status) - .toList(); + final arr = raw as List; + if (arr.length != 4) + throw Exception('unexpected arr length: expect 4 but see ${arr.length}'); + return IdmsRequestedSignIn( + aps: dco_decode_aps_data(arr[0]), + txnid: dco_decode_String(arr[1]), + akdata: dco_decode_ak_data(arr[2]), + adsid: dco_decode_String(arr[3]), + ); } @protected - List<(int, NSDictionaryTypedCoder)> - dco_decode_list_record_u_32_ns_dictionary_typed_coder(dynamic raw) { + IndexedMessagePart dco_decode_indexed_message_part(dynamic raw) { // Codec=Dco (DartCObject based), see doc to use other codecs - return (raw as List) - .map(dco_decode_record_u_32_ns_dictionary_typed_coder) - .toList(); + final arr = raw as List; + if (arr.length != 3) + throw Exception('unexpected arr length: expect 3 but see ${arr.length}'); + return IndexedMessagePart( + part_: dco_decode_message_part(arr[0]), + idx: dco_decode_opt_CastedPrimitive_usize(arr[1]), + ext: dco_decode_opt_box_autoadd_part_extension(arr[2]), + ); } @protected - List dco_decode_list_report_message(dynamic raw) { + LetMeInRequest dco_decode_let_me_in_request(dynamic raw) { // Codec=Dco (DartCObject based), see doc to use other codecs - return (raw as List).map(dco_decode_report_message).toList(); + final arr = raw as List; + if (arr.length != 7) + throw Exception('unexpected arr length: expect 7 but see ${arr.length}'); + return LetMeInRequest( + sharedSecret: dco_decode_list_prim_u_8_strict(arr[0]), + pseud: dco_decode_String(arr[1]), + requestor: dco_decode_String(arr[2]), + nickname: dco_decode_opt_String(arr[3]), + token: dco_decode_list_prim_u_8_strict(arr[4]), + delegationUuid: dco_decode_opt_String(arr[5]), + usage: dco_decode_opt_String(arr[6]), + ); } @protected - List dco_decode_list_shared_album(dynamic raw) { + LinkMeta dco_decode_link_meta(dynamic raw) { // Codec=Dco (DartCObject based), see doc to use other codecs - return (raw as List).map(dco_decode_shared_album).toList(); + final arr = raw as List; + if (arr.length != 2) + throw Exception('unexpected arr length: expect 2 but see ${arr.length}'); + return LinkMeta( + data: dco_decode_lp_link_metadata(arr[0]), + attachments: dco_decode_list_list_prim_u_8_strict(arr[1]), + ); } @protected - List dco_decode_list_trusted_phone_number(dynamic raw) { + List + dco_decode_list_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerIDSUser( + dynamic raw, + ) { // Codec=Dco (DartCObject based), see doc to use other codecs - return (raw as List).map(dco_decode_trusted_phone_number).toList(); + return (raw as List) + .map( + dco_decode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerIDSUser, + ) + .toList(); } @protected - List dco_decode_list_ui_color(dynamic raw) { + List + dco_decode_list_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerStCollapsedValue( + dynamic raw, + ) { // Codec=Dco (DartCObject based), see doc to use other codecs - return (raw as List).map(dco_decode_ui_color).toList(); + return (raw as List) + .map( + dco_decode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerStCollapsedValue, + ) + .toList(); } @protected - Location dco_decode_location(dynamic raw) { + List + dco_decode_list_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerViableBottle( + dynamic raw, + ) { // Codec=Dco (DartCObject based), see doc to use other codecs - final arr = raw as List; - if (arr.length != 15) - throw Exception('unexpected arr length: expect 15 but see ${arr.length}'); - return Location( - address: dco_decode_opt_box_autoadd_address(arr[0]), - altitude: dco_decode_f_64(arr[1]), - floorLevel: dco_decode_i_64(arr[2]), - horizontalAccuracy: dco_decode_f_64(arr[3]), - isInaccurate: dco_decode_bool(arr[4]), - latitude: dco_decode_f_64(arr[5]), - locationId: dco_decode_opt_String(arr[6]), - locationTimestamp: dco_decode_opt_box_autoadd_i_64(arr[7]), - longitude: dco_decode_f_64(arr[8]), - secureLocationTs: dco_decode_i_64(arr[9]), - timestamp: dco_decode_i_64(arr[10]), - verticalAccuracy: dco_decode_f_64(arr[11]), - positionType: dco_decode_opt_String(arr[12]), - isOld: dco_decode_opt_box_autoadd_bool(arr[13]), - locationFinished: dco_decode_opt_box_autoadd_bool(arr[14]), - ); + return (raw as List) + .map( + dco_decode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerViableBottle, + ) + .toList(); } @protected - LoginState dco_decode_login_state(dynamic raw) { + List dco_decode_list_String(dynamic raw) { // Codec=Dco (DartCObject based), see doc to use other codecs - switch (raw[0]) { - case 0: - return LoginState_LoggedIn(); - case 1: - return LoginState_NeedsDevice2FA(); - case 2: - return LoginState_Needs2FAVerification(); - case 3: - return LoginState_NeedsSMS2FA(); - case 4: - return LoginState_NeedsSMS2FAVerification( - dco_decode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerVerifyBody( - raw[1]), - ); - case 5: - return LoginState_NeedsExtraStep( - dco_decode_String(raw[1]), - ); - case 6: - return LoginState_NeedsLogin(); - default: - throw Exception("unreachable"); - } + return (raw as List).map(dco_decode_String).toList(); } @protected - LPIconMetadata dco_decode_lp_icon_metadata(dynamic raw) { + List dco_decode_list_cloud_participant(dynamic raw) { // Codec=Dco (DartCObject based), see doc to use other codecs - final arr = raw as List; - if (arr.length != 2) - throw Exception('unexpected arr length: expect 2 but see ${arr.length}'); - return LPIconMetadata( - url: dco_decode_nsurl(arr[0]), - version: dco_decode_u_8(arr[1]), - ); + return (raw as List).map(dco_decode_cloud_participant).toList(); } @protected - LPImageMetadata dco_decode_lp_image_metadata(dynamic raw) { + List + dco_decode_list_cloud_sync_outbound_save_outcome(dynamic raw) { // Codec=Dco (DartCObject based), see doc to use other codecs - final arr = raw as List; - if (arr.length != 3) - throw Exception('unexpected arr length: expect 3 but see ${arr.length}'); - return LPImageMetadata( - size: dco_decode_String(arr[0]), - url: dco_decode_nsurl(arr[1]), - version: dco_decode_u_8(arr[2]), - ); + return (raw as List) + .map(dco_decode_cloud_sync_outbound_save_outcome) + .toList(); } @protected - LPLinkMetadata dco_decode_lp_link_metadata(dynamic raw) { + List + dco_decode_list_cloud_sync_prepared_message_create_input(dynamic raw) { // Codec=Dco (DartCObject based), see doc to use other codecs - final arr = raw as List; - if (arr.length != 16) - throw Exception('unexpected arr length: expect 16 but see ${arr.length}'); - return LPLinkMetadata( - imageMetadata: dco_decode_opt_box_autoadd_lp_image_metadata(arr[0]), - version: dco_decode_u_8(arr[1]), - iconMetadata: dco_decode_opt_box_autoadd_lp_icon_metadata(arr[2]), - originalUrl: dco_decode_opt_box_autoadd_nsurl(arr[3]), - url: dco_decode_opt_box_autoadd_nsurl(arr[4]), - title: dco_decode_opt_String(arr[5]), - summary: dco_decode_opt_String(arr[6]), - image: dco_decode_opt_box_autoadd_rich_link_image_attachment_substitute( - arr[7]), - icon: dco_decode_opt_box_autoadd_rich_link_image_attachment_substitute( - arr[8]), - images: - dco_decode_opt_box_autoadd_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerNSArrayLPImageMetadata( - arr[9]), - icons: - dco_decode_opt_box_autoadd_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerNSArrayLPIconMetadata( - arr[10]), - isIncomplete: dco_decode_opt_box_autoadd_bool(arr[11]), - usesActivityPub: dco_decode_opt_box_autoadd_bool(arr[12]), - isEncodedForLocalUse: dco_decode_opt_box_autoadd_bool(arr[13]), - collaborationType: dco_decode_opt_box_autoadd_u_32(arr[14]), - specialization2: - dco_decode_opt_box_autoadd_lp_specialization_metadata(arr[15]), - ); + return (raw as List) + .map(dco_decode_cloud_sync_prepared_message_create_input) + .toList(); } @protected - LPSpecializationMetadata dco_decode_lp_specialization_metadata(dynamic raw) { + List dco_decode_list_cloud_sync_protected_change( + dynamic raw, + ) { // Codec=Dco (DartCObject based), see doc to use other codecs - switch (raw[0]) { - case 0: - return LPSpecializationMetadata_LPPasswordsInviteMetadata( - groupName: dco_decode_String(raw[1]), - urlParameters: dco_decode_String(raw[2]), - ); - default: - throw Exception("unreachable"); - } + return (raw as List) + .map(dco_decode_cloud_sync_protected_change) + .toList(); } @protected - MemojiData dco_decode_memoji_data(dynamic raw) { + List dco_decode_list_cloud_sync_raw_change(dynamic raw) { // Codec=Dco (DartCObject based), see doc to use other codecs - final arr = raw as List; - if (arr.length != 5) - throw Exception('unexpected arr length: expect 5 but see ${arr.length}'); - return MemojiData( - backgroundColorDescription: dco_decode_poster_color(arr[0]), - avatarRecordData: dco_decode_list_prim_u_8_strict(arr[1]), - avatarPoseData: dco_decode_list_prim_u_8_strict(arr[2]), - hasBody: dco_decode_bool(arr[3]), - avatarImageData: dco_decode_list_prim_u_8_strict(arr[4]), - ); + return (raw as List) + .map(dco_decode_cloud_sync_raw_change) + .toList(); } @protected - Message dco_decode_message(dynamic raw) { + List + dco_decode_list_cloud_sync_transient_attributed_body(dynamic raw) { // Codec=Dco (DartCObject based), see doc to use other codecs - switch (raw[0]) { - case 0: - return Message_Message( - dco_decode_box_autoadd_normal_message(raw[1]), - ); - case 1: - return Message_RenameMessage( - dco_decode_box_autoadd_rename_message(raw[1]), - ); - case 2: - return Message_ChangeParticipants( - dco_decode_box_autoadd_change_participant_message(raw[1]), - ); - case 3: - return Message_React( - dco_decode_box_autoadd_react_message(raw[1]), - ); - case 4: - return Message_Delivered(); - case 5: - return Message_Read(); - case 6: - return Message_Typing( - dco_decode_bool(raw[1]), - dco_decode_opt_box_autoadd_typing_app(raw[2]), - ); - case 7: - return Message_Unsend( - dco_decode_box_autoadd_unsend_message(raw[1]), - ); - case 8: - return Message_Edit( - dco_decode_box_autoadd_edit_message(raw[1]), - ); - case 9: - return Message_IconChange( - dco_decode_box_autoadd_icon_change_message(raw[1]), - ); - case 10: - return Message_EnableSmsActivation( - dco_decode_bool(raw[1]), - ); - case 11: - return Message_MessageReadOnDevice(); - case 12: - return Message_SmsConfirmSent( - dco_decode_bool(raw[1]), - ); - case 13: - return Message_MarkUnread(); - case 14: - return Message_PeerCacheInvalidate(); - case 15: - return Message_UpdateExtension( - dco_decode_box_autoadd_update_extension_message(raw[1]), - ); - case 16: - return Message_Error( - dco_decode_box_autoadd_error_message(raw[1]), - ); - case 17: - return Message_MoveToRecycleBin( - dco_decode_box_autoadd_move_to_recycle_bin_message(raw[1]), - ); - case 18: - return Message_RecoverChat( - dco_decode_box_autoadd_operated_chat(raw[1]), - ); - case 19: - return Message_PermanentDelete( - dco_decode_box_autoadd_permanent_delete_message(raw[1]), - ); - case 20: - return Message_Unschedule(); - case 21: - return Message_UpdateProfile( - dco_decode_box_autoadd_update_profile_message(raw[1]), - ); - case 22: - return Message_UpdateProfileSharing( - dco_decode_box_autoadd_update_profile_sharing_message(raw[1]), - ); - case 23: - return Message_ShareProfile( - dco_decode_box_autoadd_share_profile_message(raw[1]), - ); - case 24: - return Message_NotifyAnyways(); - case 25: - return Message_SetTranscriptBackground( - dco_decode_box_autoadd_set_transcript_background_message(raw[1]), - ); - default: - throw Exception("unreachable"); - } + return (raw as List) + .map(dco_decode_cloud_sync_transient_attributed_body) + .toList(); } @protected - MessageEdit dco_decode_message_edit(dynamic raw) { + List + dco_decode_list_cloud_sync_transient_edit_part(dynamic raw) { // Codec=Dco (DartCObject based), see doc to use other codecs - final arr = raw as List; - if (arr.length != 3) - throw Exception('unexpected arr length: expect 3 but see ${arr.length}'); - return MessageEdit( - t: dco_decode_list_prim_u_8_strict(arr[0]), - d: dco_decode_f_64(arr[1]), - bcg: dco_decode_opt_String(arr[2]), - ); + return (raw as List) + .map(dco_decode_cloud_sync_transient_edit_part) + .toList(); } @protected - MessageEditRange dco_decode_message_edit_range(dynamic raw) { + List + dco_decode_list_cloud_sync_transient_message_edit(dynamic raw) { // Codec=Dco (DartCObject based), see doc to use other codecs - final arr = raw as List; - if (arr.length != 2) - throw Exception('unexpected arr length: expect 2 but see ${arr.length}'); - return MessageEditRange( - lo: dco_decode_u_32(arr[0]), - le: dco_decode_u_32(arr[1]), - ); + return (raw as List) + .map(dco_decode_cloud_sync_transient_message_edit) + .toList(); } @protected - MessageInst dco_decode_message_inst(dynamic raw) { + List dco_decode_list_cloud_sync_transient_text_run( + dynamic raw, + ) { // Codec=Dco (DartCObject based), see doc to use other codecs - final arr = raw as List; - if (arr.length != 9) - throw Exception('unexpected arr length: expect 9 but see ${arr.length}'); - return MessageInst( - id: dco_decode_String(arr[0]), - sender: dco_decode_opt_String(arr[1]), - conversation: dco_decode_opt_box_autoadd_conversation_data(arr[2]), - message: dco_decode_message(arr[3]), - sentTimestamp: dco_decode_CastedPrimitive_u_64(arr[4]), - target: dco_decode_opt_list_message_target(arr[5]), - sendDelivered: dco_decode_bool(arr[6]), - verificationFailed: dco_decode_bool(arr[7]), - certifiedContext: dco_decode_opt_box_autoadd_certified_context(arr[8]), - ); + return (raw as List) + .map(dco_decode_cloud_sync_transient_text_run) + .toList(); } @protected - MessagePart dco_decode_message_part(dynamic raw) { + List dco_decode_list_dart_beacon(dynamic raw) { // Codec=Dco (DartCObject based), see doc to use other codecs - switch (raw[0]) { - case 0: - return MessagePart_Text( - dco_decode_String(raw[1]), - dco_decode_box_autoadd_text_format(raw[2]), - ); - case 1: - return MessagePart_Attachment( - dco_decode_box_autoadd_attachment(raw[1]), - ); - case 2: - return MessagePart_Mention( - dco_decode_String(raw[1]), - dco_decode_String(raw[2]), - ); - case 3: - return MessagePart_Object( - dco_decode_String(raw[1]), - ); - default: - throw Exception("unreachable"); - } + return (raw as List).map(dco_decode_dart_beacon).toList(); } @protected - MessageParts dco_decode_message_parts(dynamic raw) { + List dco_decode_list_follow(dynamic raw) { // Codec=Dco (DartCObject based), see doc to use other codecs - final arr = raw as List; - if (arr.length != 1) - throw Exception('unexpected arr length: expect 1 but see ${arr.length}'); - return MessageParts( - field0: dco_decode_list_indexed_message_part(arr[0]), - ); + return (raw as List).map(dco_decode_follow).toList(); } @protected - MessageProto dco_decode_message_proto(dynamic raw) { + List dco_decode_list_found_device(dynamic raw) { // Codec=Dco (DartCObject based), see doc to use other codecs - final arr = raw as List; - if (arr.length != 17) - throw Exception('unexpected arr length: expect 17 but see ${arr.length}'); - return MessageProto( - unk1: dco_decode_u_32(arr[0]), - subject: dco_decode_opt_String(arr[1]), - text: dco_decode_opt_String(arr[2]), - attributedBody: dco_decode_opt_list_prim_u_8_strict(arr[3]), - balloonBundleId: dco_decode_opt_String(arr[4]), - payloadData: dco_decode_opt_list_prim_u_8_strict(arr[5]), - messageSummaryInfo: dco_decode_opt_list_prim_u_8_strict(arr[6]), - effect: dco_decode_opt_String(arr[7]), - dateRead: dco_decode_opt_CastedPrimitive_u_64(arr[8]), - unk10: dco_decode_opt_box_autoadd_u_32(arr[9]), - unk11: dco_decode_opt_box_autoadd_u_32(arr[10]), - dateDelivered: dco_decode_opt_CastedPrimitive_u_64(arr[11]), - unk14: dco_decode_opt_box_autoadd_u_32(arr[12]), - associatedMessageType: dco_decode_opt_box_autoadd_u_32(arr[13]), - associatedMessageGuid: dco_decode_opt_String(arr[14]), - associatedMessageRangeLocation: dco_decode_opt_box_autoadd_u_32(arr[15]), - associatedMessageRangeLength: dco_decode_opt_box_autoadd_u_32(arr[16]), - ); + return (raw as List).map(dco_decode_found_device).toList(); } @protected - MessageProto2 dco_decode_message_proto_2(dynamic raw) { + List dco_decode_list_ft_member(dynamic raw) { // Codec=Dco (DartCObject based), see doc to use other codecs - final arr = raw as List; - if (arr.length != 1) - throw Exception('unexpected arr length: expect 1 but see ${arr.length}'); - return MessageProto2( - reply: dco_decode_opt_String(arr[0]), - ); + return (raw as List).map(dco_decode_ft_member).toList(); } @protected - MessageProto3 dco_decode_message_proto_3(dynamic raw) { + List dco_decode_list_ft_session(dynamic raw) { // Codec=Dco (DartCObject based), see doc to use other codecs - final arr = raw as List; - if (arr.length != 2) - throw Exception('unexpected arr length: expect 2 but see ${arr.length}'); - return MessageProto3( - unk2: dco_decode_opt_box_autoadd_u_32(arr[0]), - unk3: dco_decode_opt_box_autoadd_u_32(arr[1]), - ); + return (raw as List).map(dco_decode_ft_session).toList(); } @protected - MessageProto4 dco_decode_message_proto_4(dynamic raw) { + List dco_decode_list_group_summary_member(dynamic raw) { // Codec=Dco (DartCObject based), see doc to use other codecs - final arr = raw as List; - if (arr.length != 6) - throw Exception('unexpected arr length: expect 6 but see ${arr.length}'); - return MessageProto4( - associatedMessageEmoji: dco_decode_opt_String(arr[0]), - service: dco_decode_opt_String(arr[1]), - scheduleType: dco_decode_opt_box_autoadd_u_32(arr[2]), - scheduleState: dco_decode_opt_box_autoadd_u_32(arr[3]), - groupId: dco_decode_opt_String(arr[4]), - sentOrReceivedOffGrid: dco_decode_opt_box_autoadd_u_32(arr[5]), - ); + return (raw as List).map(dco_decode_group_summary_member).toList(); } @protected - MessageSummaryInfo dco_decode_message_summary_info(dynamic raw) { + List dco_decode_list_indexed_message_part(dynamic raw) { // Codec=Dco (DartCObject based), see doc to use other codecs - final arr = raw as List; - if (arr.length != 14) - throw Exception('unexpected arr length: expect 14 but see ${arr.length}'); - return MessageSummaryInfo( - ams: dco_decode_opt_String(arr[0]), - ampt: dco_decode_opt_list_prim_u_8_strict(arr[1]), - amc: dco_decode_opt_box_autoadd_u_32(arr[2]), - amb: dco_decode_opt_String(arr[3]), - amd: dco_decode_opt_String(arr[4]), - ec: dco_decode_Map_String_list_message_edit(arr[5]), - ep: dco_decode_list_prim_u_32_strict(arr[6]), - otr: dco_decode_Map_String_message_edit_range(arr[7]), - ust: dco_decode_opt_box_autoadd_bool(arr[8]), - rp: dco_decode_list_prim_u_32_strict(arr[9]), - hbr: dco_decode_opt_box_autoadd_bool(arr[10]), - oui: dco_decode_opt_String(arr[11]), - osn: dco_decode_opt_String(arr[12]), - euh: dco_decode_list_String(arr[13]), - ); + return (raw as List).map(dco_decode_indexed_message_part).toList(); } @protected - MessageTarget dco_decode_message_target(dynamic raw) { + List dco_decode_list_list_prim_u_8_strict(dynamic raw) { // Codec=Dco (DartCObject based), see doc to use other codecs - switch (raw[0]) { - case 0: - return MessageTarget_Token( - dco_decode_list_prim_u_8_strict(raw[1]), - ); - case 1: - return MessageTarget_Uuid( - dco_decode_String(raw[1]), - ); - default: - throw Exception("unreachable"); - } + return (raw as List).map(dco_decode_list_prim_u_8_strict).toList(); } @protected - MessageType dco_decode_message_type(dynamic raw) { + List dco_decode_list_message_edit(dynamic raw) { // Codec=Dco (DartCObject based), see doc to use other codecs - switch (raw[0]) { - case 0: - return MessageType_IMessage(); - case 1: - return MessageType_SMS( - isPhone: dco_decode_bool(raw[1]), - usingNumber: dco_decode_String(raw[2]), - fromHandle: dco_decode_opt_String(raw[3]), - ); - default: - throw Exception("unreachable"); - } + return (raw as List).map(dco_decode_message_edit).toList(); } @protected - MMCSAttachmentMeta dco_decode_mmcs_attachment_meta(dynamic raw) { + List dco_decode_list_message_target(dynamic raw) { // Codec=Dco (DartCObject based), see doc to use other codecs - final arr = raw as List; - if (arr.length != 10) - throw Exception('unexpected arr length: expect 10 but see ${arr.length}'); - return MMCSAttachmentMeta( - mmcsSignatureHex: dco_decode_opt_String(arr[0]), - mmcsOwner: dco_decode_opt_String(arr[1]), - mmcsUrl: dco_decode_opt_String(arr[2]), - decryptionKey: dco_decode_opt_String(arr[3]), - inlineAttachment: dco_decode_opt_String(arr[4]), - messagePart: dco_decode_opt_String(arr[5]), - fileSize: dco_decode_opt_box_autoadd_num_or_string(arr[6]), - utiType: dco_decode_opt_String(arr[7]), - mimeType: dco_decode_opt_String(arr[8]), - name: dco_decode_opt_String(arr[9]), - ); + return (raw as List).map(dco_decode_message_target).toList(); } @protected - MMCSFile dco_decode_mmcs_file(dynamic raw) { + List dco_decode_list_password_manager_alt_domain( + dynamic raw, + ) { // Codec=Dco (DartCObject based), see doc to use other codecs - final arr = raw as List; - if (arr.length != 5) - throw Exception('unexpected arr length: expect 5 but see ${arr.length}'); - return MMCSFile( - signature: dco_decode_list_prim_u_8_strict(arr[0]), - object: dco_decode_String(arr[1]), - url: dco_decode_String(arr[2]), - key: dco_decode_list_prim_u_8_strict(arr[3]), - size: dco_decode_CastedPrimitive_usize(arr[4]), - ); + return (raw as List) + .map(dco_decode_password_manager_alt_domain) + .toList(); } @protected - MMCSTransferProgress dco_decode_mmcs_transfer_progress(dynamic raw) { + List dco_decode_list_password_manager_meta_change( + dynamic raw, + ) { // Codec=Dco (DartCObject based), see doc to use other codecs - final arr = raw as List; - if (arr.length != 3) - throw Exception('unexpected arr length: expect 3 but see ${arr.length}'); - return MMCSTransferProgress( - prog: dco_decode_CastedPrimitive_usize(arr[0]), - total: dco_decode_CastedPrimitive_usize(arr[1]), - file: dco_decode_opt_box_autoadd_mmcs_file(arr[2]), - ); + return (raw as List) + .map(dco_decode_password_manager_meta_change) + .toList(); } @protected - MonogramData dco_decode_monogram_data(dynamic raw) { + List dco_decode_list_photo_poster_layer(dynamic raw) { // Codec=Dco (DartCObject based), see doc to use other codecs - final arr = raw as List; - if (arr.length != 4) - throw Exception('unexpected arr length: expect 4 but see ${arr.length}'); - return MonogramData( - topBackgroundColorDescription: dco_decode_poster_color(arr[0]), - backgroundColorDescription: dco_decode_poster_color(arr[1]), - initials: dco_decode_String(arr[2]), - monogramSupportedForName: dco_decode_bool(arr[3]), - ); + return (raw as List).map(dco_decode_photo_poster_layer).toList(); } @protected - MoveToRecycleBinMessage dco_decode_move_to_recycle_bin_message(dynamic raw) { + List dco_decode_list_poster_asset(dynamic raw) { // Codec=Dco (DartCObject based), see doc to use other codecs - final arr = raw as List; - if (arr.length != 2) - throw Exception('unexpected arr length: expect 2 but see ${arr.length}'); - return MoveToRecycleBinMessage( - target: dco_decode_delete_target(arr[0]), - recoverableDeleteDate: dco_decode_CastedPrimitive_u_64(arr[1]), - ); + return (raw as List).map(dco_decode_poster_asset).toList(); } @protected - MyAsyncRuntime dco_decode_my_async_runtime(dynamic raw) { + List dco_decode_list_poster_color(dynamic raw) { // Codec=Dco (DartCObject based), see doc to use other codecs - final arr = raw as List; - if (arr.length != 0) - throw Exception('unexpected arr length: expect 0 but see ${arr.length}'); - return MyAsyncRuntime(); + return (raw as List).map(dco_decode_poster_color).toList(); } @protected - NormalMessage dco_decode_normal_message(dynamic raw) { + Float64List dco_decode_list_prim_f_64_strict(dynamic raw) { // Codec=Dco (DartCObject based), see doc to use other codecs - final arr = raw as List; - if (arr.length != 11) - throw Exception('unexpected arr length: expect 11 but see ${arr.length}'); - return NormalMessage( - parts: dco_decode_message_parts(arr[0]), - effect: dco_decode_opt_String(arr[1]), - replyGuid: dco_decode_opt_String(arr[2]), - replyPart: dco_decode_opt_String(arr[3]), - service: dco_decode_message_type(arr[4]), - subject: dco_decode_opt_String(arr[5]), - app: dco_decode_opt_box_autoadd_extension_app(arr[6]), - linkMeta: dco_decode_opt_box_autoadd_link_meta(arr[7]), - voice: dco_decode_bool(arr[8]), - scheduled: dco_decode_opt_box_autoadd_schedule_mode(arr[9]), - embeddedProfile: - dco_decode_opt_box_autoadd_share_profile_message(arr[10]), - ); + return raw as Float64List; } @protected - NSAttributedString dco_decode_ns_attributed_string(dynamic raw) { + Int64List dco_decode_list_prim_i_64_strict(dynamic raw) { // Codec=Dco (DartCObject based), see doc to use other codecs - final arr = raw as List; - if (arr.length != 2) - throw Exception('unexpected arr length: expect 2 but see ${arr.length}'); - return NSAttributedString( - text: dco_decode_String(arr[0]), - ranges: dco_decode_list_record_u_32_ns_dictionary_typed_coder(arr[1]), - ); + return dcoDecodeInt64List(raw); } @protected - NSDictionaryClass dco_decode_ns_dictionary_class(dynamic raw) { + Uint32List dco_decode_list_prim_u_32_strict(dynamic raw) { // Codec=Dco (DartCObject based), see doc to use other codecs - return NSDictionaryClass.values[raw as int]; + return raw as Uint32List; } @protected - NSDictionaryTypedCoder dco_decode_ns_dictionary_typed_coder(dynamic raw) { + List dco_decode_list_prim_u_8_loose(dynamic raw) { // Codec=Dco (DartCObject based), see doc to use other codecs - final arr = raw as List; - if (arr.length != 1) - throw Exception('unexpected arr length: expect 1 but see ${arr.length}'); - return NSDictionaryTypedCoder( - field0: - dco_decode_Map_String_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerStCollapsedValue( - arr[0]), - ); + return raw as List; } @protected - NSNumber dco_decode_ns_number(dynamic raw) { + Uint8List dco_decode_list_prim_u_8_strict(dynamic raw) { // Codec=Dco (DartCObject based), see doc to use other codecs - final arr = raw as List; - if (arr.length != 1) - throw Exception('unexpected arr length: expect 1 but see ${arr.length}'); - return NSNumber( - field0: dco_decode_u_32(arr[0]), - ); + return raw as Uint8List; } @protected - NSString dco_decode_ns_string(dynamic raw) { + List dco_decode_list_private_device_info(dynamic raw) { // Codec=Dco (DartCObject based), see doc to use other codecs - final arr = raw as List; - if (arr.length != 1) - throw Exception('unexpected arr length: expect 1 but see ${arr.length}'); - return NSString( - field0: dco_decode_String(arr[0]), - ); + return (raw as List).map(dco_decode_private_device_info).toList(); } @protected - NSURL dco_decode_nsurl(dynamic raw) { + List<(String, Asset)> + dco_decode_list_record_string_auto_owned_rust_opaque_flutter_rust_bridgefor_generated_rust_auto_opaque_inner_asset( + dynamic raw, + ) { // Codec=Dco (DartCObject based), see doc to use other codecs - final arr = raw as List; - if (arr.length != 2) - throw Exception('unexpected arr length: expect 2 but see ${arr.length}'); - return NSURL( - base: dco_decode_String(arr[0]), - relative: dco_decode_String(arr[1]), - ); + return (raw as List) + .map( + dco_decode_record_string_auto_owned_rust_opaque_flutter_rust_bridgefor_generated_rust_auto_opaque_inner_asset, + ) + .toList(); } @protected - NumOrString dco_decode_num_or_string(dynamic raw) { + List<(String, StCollapsedValue)> + dco_decode_list_record_string_auto_owned_rust_opaque_flutter_rust_bridgefor_generated_rust_auto_opaque_inner_st_collapsed_value( + dynamic raw, + ) { // Codec=Dco (DartCObject based), see doc to use other codecs - switch (raw[0]) { - case 0: - return NumOrString_Num( - dco_decode_u_32(raw[1]), - ); - case 1: - return NumOrString_String( - dco_decode_String(raw[1]), - ); - case 2: - return NumOrString_Bool( - dco_decode_bool(raw[1]), - ); - default: - throw Exception("unreachable"); - } + return (raw as List) + .map( + dco_decode_record_string_auto_owned_rust_opaque_flutter_rust_bridgefor_generated_rust_auto_opaque_inner_st_collapsed_value, + ) + .toList(); } @protected - OperatedChat dco_decode_operated_chat(dynamic raw) { + List<(String, bool)> dco_decode_list_record_string_bool(dynamic raw) { // Codec=Dco (DartCObject based), see doc to use other codecs - final arr = raw as List; - if (arr.length != 5) - throw Exception('unexpected arr length: expect 5 but see ${arr.length}'); - return OperatedChat( - participants: dco_decode_list_String(arr[0]), - groupId: dco_decode_String(arr[1]), - guid: dco_decode_String(arr[2]), - deleteIncomingMessages: dco_decode_opt_box_autoadd_bool(arr[3]), - wasReportedAsJunk: dco_decode_opt_box_autoadd_bool(arr[4]), - ); + return (raw as List).map(dco_decode_record_string_bool).toList(); } @protected - int? dco_decode_opt_CastedPrimitive_i_64(dynamic raw) { + List<(String, int)> dco_decode_list_record_string_casted_primitive_u_64( + dynamic raw, + ) { // Codec=Dco (DartCObject based), see doc to use other codecs - return raw == null ? null : dco_decode_CastedPrimitive_i_64(raw); + return (raw as List) + .map(dco_decode_record_string_casted_primitive_u_64) + .toList(); } @protected - int? dco_decode_opt_CastedPrimitive_u_64(dynamic raw) { + List<(String, CloudAttachment)> + dco_decode_list_record_string_cloud_attachment(dynamic raw) { // Codec=Dco (DartCObject based), see doc to use other codecs - return raw == null ? null : dco_decode_CastedPrimitive_u_64(raw); + return (raw as List) + .map(dco_decode_record_string_cloud_attachment) + .toList(); } @protected - int? dco_decode_opt_CastedPrimitive_usize(dynamic raw) { + List<(String, CloudChat)> dco_decode_list_record_string_cloud_chat( + dynamic raw, + ) { // Codec=Dco (DartCObject based), see doc to use other codecs - return raw == null ? null : dco_decode_CastedPrimitive_usize(raw); + return (raw as List) + .map(dco_decode_record_string_cloud_chat) + .toList(); } @protected - String? dco_decode_opt_String(dynamic raw) { + List<(String, CloudMessage)> dco_decode_list_record_string_cloud_message( + dynamic raw, + ) { // Codec=Dco (DartCObject based), see doc to use other codecs - return raw == null ? null : dco_decode_String(raw); + return (raw as List) + .map(dco_decode_record_string_cloud_message) + .toList(); } @protected - ApsState? - dco_decode_opt_box_autoadd_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerAPSState( - dynamic raw) { + List<(String, FTParticipant)> dco_decode_list_record_string_ft_participant( + dynamic raw, + ) { // Codec=Dco (DartCObject based), see doc to use other codecs - return raw == null - ? null - : dco_decode_box_autoadd_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerAPSState( - raw); + return (raw as List) + .map(dco_decode_record_string_ft_participant) + .toList(); } @protected - ArcCloudKitClientDefaultAnisetteProvider? - dco_decode_opt_box_autoadd_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcCloudKitClientDefaultAnisetteProvider( - dynamic raw) { + List<(String, GroupSummary)> dco_decode_list_record_string_group_summary( + dynamic raw, + ) { // Codec=Dco (DartCObject based), see doc to use other codecs - return raw == null - ? null - : dco_decode_box_autoadd_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcCloudKitClientDefaultAnisetteProvider( - raw); + return (raw as List) + .map(dco_decode_record_string_group_summary) + .toList(); } @protected - ArcCloudMessagesClientDefaultAnisetteProvider? - dco_decode_opt_box_autoadd_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcCloudMessagesClientDefaultAnisetteProvider( - dynamic raw) { + List<(String, List)> + dco_decode_list_record_string_list_message_edit(dynamic raw) { // Codec=Dco (DartCObject based), see doc to use other codecs - return raw == null - ? null - : dco_decode_box_autoadd_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcCloudMessagesClientDefaultAnisetteProvider( - raw); + return (raw as List) + .map(dco_decode_record_string_list_message_edit) + .toList(); } @protected - ArcFindMyClientDefaultAnisetteProvider? - dco_decode_opt_box_autoadd_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcFindMyClientDefaultAnisetteProvider( - dynamic raw) { + List<(String, Uint8List)> dco_decode_list_record_string_list_prim_u_8_strict( + dynamic raw, + ) { // Codec=Dco (DartCObject based), see doc to use other codecs - return raw == null - ? null - : dco_decode_box_autoadd_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcFindMyClientDefaultAnisetteProvider( - raw); + return (raw as List) + .map(dco_decode_record_string_list_prim_u_8_strict) + .toList(); } @protected - ArcKeychainClientDefaultAnisetteProvider? - dco_decode_opt_box_autoadd_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcKeychainClientDefaultAnisetteProvider( - dynamic raw) { + List<(String, MessageEditRange)> + dco_decode_list_record_string_message_edit_range(dynamic raw) { // Codec=Dco (DartCObject based), see doc to use other codecs - return raw == null - ? null - : dco_decode_box_autoadd_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcKeychainClientDefaultAnisetteProvider( - raw); + return (raw as List) + .map(dco_decode_record_string_message_edit_range) + .toList(); } @protected - ArcMutexAppleAccountDefaultAnisetteProvider? - dco_decode_opt_box_autoadd_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcMutexAppleAccountDefaultAnisetteProvider( - dynamic raw) { + List<(String, CloudAttachment?)> + dco_decode_list_record_string_opt_box_autoadd_cloud_attachment(dynamic raw) { // Codec=Dco (DartCObject based), see doc to use other codecs - return raw == null - ? null - : dco_decode_box_autoadd_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcMutexAppleAccountDefaultAnisetteProvider( - raw); + return (raw as List) + .map(dco_decode_record_string_opt_box_autoadd_cloud_attachment) + .toList(); } @protected - ArcPasswordManagerDefaultAnisetteProvider? - dco_decode_opt_box_autoadd_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcPasswordManagerDefaultAnisetteProvider( - dynamic raw) { + List<(String, CloudChat?)> + dco_decode_list_record_string_opt_box_autoadd_cloud_chat(dynamic raw) { // Codec=Dco (DartCObject based), see doc to use other codecs - return raw == null - ? null - : dco_decode_box_autoadd_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcPasswordManagerDefaultAnisetteProvider( - raw); + return (raw as List) + .map(dco_decode_record_string_opt_box_autoadd_cloud_chat) + .toList(); } @protected - Asset? - dco_decode_opt_box_autoadd_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerAsset( - dynamic raw) { - // Codec=Dco (DartCObject based), see doc to use other codecs - return raw == null - ? null - : dco_decode_box_autoadd_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerAsset( - raw); - } - - @protected - ChannelInterestToken? - dco_decode_opt_box_autoadd_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerChannelInterestToken( - dynamic raw) { - // Codec=Dco (DartCObject based), see doc to use other codecs - return raw == null - ? null - : dco_decode_box_autoadd_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerChannelInterestToken( - raw); - } - - @protected - CircleClientSessionDefaultAnisetteProvider? - dco_decode_opt_box_autoadd_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerCircleClientSessionDefaultAnisetteProvider( - dynamic raw) { + List<(String, CloudMessage?)> + dco_decode_list_record_string_opt_box_autoadd_cloud_message(dynamic raw) { // Codec=Dco (DartCObject based), see doc to use other codecs - return raw == null - ? null - : dco_decode_box_autoadd_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerCircleClientSessionDefaultAnisetteProvider( - raw); + return (raw as List) + .map(dco_decode_record_string_opt_box_autoadd_cloud_message) + .toList(); } @protected - ConversationLink? - dco_decode_opt_box_autoadd_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerConversationLink( - dynamic raw) { + List<(String, PasswordManagerMetaDataCtx)> + dco_decode_list_record_string_password_manager_meta_data_ctx(dynamic raw) { // Codec=Dco (DartCObject based), see doc to use other codecs - return raw == null - ? null - : dco_decode_box_autoadd_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerConversationLink( - raw); + return (raw as List) + .map(dco_decode_record_string_password_manager_meta_data_ctx) + .toList(); } @protected - ConversationParticipant? - dco_decode_opt_box_autoadd_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerConversationParticipant( - dynamic raw) { + List<(String, (String?, Passkey))> + dco_decode_list_record_string_record_opt_string_passkey(dynamic raw) { // Codec=Dco (DartCObject based), see doc to use other codecs - return raw == null - ? null - : dco_decode_box_autoadd_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerConversationParticipant( - raw); + return (raw as List) + .map(dco_decode_record_string_record_opt_string_passkey) + .toList(); } @protected - Date? - dco_decode_opt_box_autoadd_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerDate( - dynamic raw) { + List<(String, (String?, PasswordManagerMeta))> + dco_decode_list_record_string_record_opt_string_password_manager_meta( + dynamic raw, + ) { // Codec=Dco (DartCObject based), see doc to use other codecs - return raw == null - ? null - : dco_decode_box_autoadd_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerDate( - raw); + return (raw as List) + .map(dco_decode_record_string_record_opt_string_password_manager_meta) + .toList(); } @protected - GZipWrapperChatProto? - dco_decode_opt_box_autoadd_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerGZipWrapperChatProto( - dynamic raw) { + List<(String, (String?, PasswordRawEntry))> + dco_decode_list_record_string_record_opt_string_password_raw_entry( + dynamic raw, + ) { // Codec=Dco (DartCObject based), see doc to use other codecs - return raw == null - ? null - : dco_decode_box_autoadd_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerGZipWrapperChatProto( - raw); + return (raw as List) + .map(dco_decode_record_string_record_opt_string_password_raw_entry) + .toList(); } @protected - GZipWrapperMessageProto2? - dco_decode_opt_box_autoadd_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerGZipWrapperMessageProto2( - dynamic raw) { + List<(String, (String?, WifiPassword))> + dco_decode_list_record_string_record_opt_string_wifi_password(dynamic raw) { // Codec=Dco (DartCObject based), see doc to use other codecs - return raw == null - ? null - : dco_decode_box_autoadd_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerGZipWrapperMessageProto2( - raw); + return (raw as List) + .map(dco_decode_record_string_record_opt_string_wifi_password) + .toList(); } @protected - GZipWrapperMessageProto3? - dco_decode_opt_box_autoadd_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerGZipWrapperMessageProto3( - dynamic raw) { + List<(String, ShareInviteContentData)> + dco_decode_list_record_string_share_invite_content_data(dynamic raw) { // Codec=Dco (DartCObject based), see doc to use other codecs - return raw == null - ? null - : dco_decode_box_autoadd_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerGZipWrapperMessageProto3( - raw); + return (raw as List) + .map(dco_decode_record_string_share_invite_content_data) + .toList(); } @protected - GZipWrapperMessageProto4? - dco_decode_opt_box_autoadd_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerGZipWrapperMessageProto4( - dynamic raw) { + List<(String, StatusKitPersonalConfig)> + dco_decode_list_record_string_status_kit_personal_config(dynamic raw) { // Codec=Dco (DartCObject based), see doc to use other codecs - return raw == null - ? null - : dco_decode_box_autoadd_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerGZipWrapperMessageProto4( - raw); + return (raw as List) + .map(dco_decode_record_string_status_kit_personal_config) + .toList(); } @protected - IdsUser? - dco_decode_opt_box_autoadd_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerIDSUser( - dynamic raw) { + List<(String, String)> dco_decode_list_record_string_string(dynamic raw) { // Codec=Dco (DartCObject based), see doc to use other codecs - return raw == null - ? null - : dco_decode_box_autoadd_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerIDSUser( - raw); + return (raw as List).map(dco_decode_record_string_string).toList(); } @protected - LocationReport? - dco_decode_opt_box_autoadd_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerLocationReport( - dynamic raw) { + List<(String, SyncStatus)> dco_decode_list_record_string_sync_status( + dynamic raw, + ) { // Codec=Dco (DartCObject based), see doc to use other codecs - return raw == null - ? null - : dco_decode_box_autoadd_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerLocationReport( - raw); + return (raw as List) + .map(dco_decode_record_string_sync_status) + .toList(); } @protected - NsArrayLpIconMetadata? - dco_decode_opt_box_autoadd_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerNSArrayLPIconMetadata( - dynamic raw) { + List<(int, NSDictionaryTypedCoder)> + dco_decode_list_record_u_32_ns_dictionary_typed_coder(dynamic raw) { // Codec=Dco (DartCObject based), see doc to use other codecs - return raw == null - ? null - : dco_decode_box_autoadd_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerNSArrayLPIconMetadata( - raw); + return (raw as List) + .map(dco_decode_record_u_32_ns_dictionary_typed_coder) + .toList(); } @protected - NsArrayLpImageMetadata? - dco_decode_opt_box_autoadd_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerNSArrayLPImageMetadata( - dynamic raw) { + List dco_decode_list_report_message(dynamic raw) { // Codec=Dco (DartCObject based), see doc to use other codecs - return raw == null - ? null - : dco_decode_box_autoadd_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerNSArrayLPImageMetadata( - raw); + return (raw as List).map(dco_decode_report_message).toList(); } @protected - PushError? - dco_decode_opt_box_autoadd_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerPushError( - dynamic raw) { + List dco_decode_list_shared_album(dynamic raw) { // Codec=Dco (DartCObject based), see doc to use other codecs - return raw == null - ? null - : dco_decode_box_autoadd_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerPushError( - raw); + return (raw as List).map(dco_decode_shared_album).toList(); } @protected - SavedHardwareState? - dco_decode_opt_box_autoadd_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerSavedHardwareState( - dynamic raw) { + List dco_decode_list_trusted_phone_number(dynamic raw) { // Codec=Dco (DartCObject based), see doc to use other codecs - return raw == null - ? null - : dco_decode_box_autoadd_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerSavedHardwareState( - raw); + return (raw as List).map(dco_decode_trusted_phone_number).toList(); } @protected - SyncManagerDefaultAnisetteProviderMyFilePackager? - dco_decode_opt_box_autoadd_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerSyncManagerDefaultAnisetteProviderMyFilePackager( - dynamic raw) { + List dco_decode_list_ui_color(dynamic raw) { // Codec=Dco (DartCObject based), see doc to use other codecs - return raw == null - ? null - : dco_decode_box_autoadd_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerSyncManagerDefaultAnisetteProviderMyFilePackager( - raw); + return (raw as List).map(dco_decode_ui_color).toList(); } @protected - SystemTime? - dco_decode_opt_box_autoadd_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerSystemTime( - dynamic raw) { + Location dco_decode_location(dynamic raw) { // Codec=Dco (DartCObject based), see doc to use other codecs - return raw == null - ? null - : dco_decode_box_autoadd_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerSystemTime( - raw); + final arr = raw as List; + if (arr.length != 15) + throw Exception('unexpected arr length: expect 15 but see ${arr.length}'); + return Location( + address: dco_decode_opt_box_autoadd_address(arr[0]), + altitude: dco_decode_f_64(arr[1]), + floorLevel: dco_decode_i_64(arr[2]), + horizontalAccuracy: dco_decode_f_64(arr[3]), + isInaccurate: dco_decode_bool(arr[4]), + latitude: dco_decode_f_64(arr[5]), + locationId: dco_decode_opt_String(arr[6]), + locationTimestamp: dco_decode_opt_box_autoadd_i_64(arr[7]), + longitude: dco_decode_f_64(arr[8]), + secureLocationTs: dco_decode_i_64(arr[9]), + timestamp: dco_decode_i_64(arr[10]), + verticalAccuracy: dco_decode_f_64(arr[11]), + positionType: dco_decode_opt_String(arr[12]), + isOld: dco_decode_opt_box_autoadd_bool(arr[13]), + locationFinished: dco_decode_opt_box_autoadd_bool(arr[14]), + ); } @protected - Address? dco_decode_opt_box_autoadd_address(dynamic raw) { + LoginState dco_decode_login_state(dynamic raw) { // Codec=Dco (DartCObject based), see doc to use other codecs - return raw == null ? null : dco_decode_box_autoadd_address(raw); + switch (raw[0]) { + case 0: + return LoginState_LoggedIn(); + case 1: + return LoginState_NeedsDevice2FA(); + case 2: + return LoginState_Needs2FAVerification(); + case 3: + return LoginState_NeedsSMS2FA(); + case 4: + return LoginState_NeedsSMS2FAVerification( + dco_decode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerVerifyBody( + raw[1], + ), + ); + case 5: + return LoginState_NeedsExtraStep(dco_decode_String(raw[1])); + case 6: + return LoginState_NeedsLogin(); + default: + throw Exception("unreachable"); + } } @protected - Attachment? dco_decode_opt_box_autoadd_attachment(dynamic raw) { + LPIconMetadata dco_decode_lp_icon_metadata(dynamic raw) { // Codec=Dco (DartCObject based), see doc to use other codecs - return raw == null ? null : dco_decode_box_autoadd_attachment(raw); + final arr = raw as List; + if (arr.length != 2) + throw Exception('unexpected arr length: expect 2 but see ${arr.length}'); + return LPIconMetadata( + url: dco_decode_nsurl(arr[0]), + version: dco_decode_u_8(arr[1]), + ); } @protected - AttachmentMetaExtra? dco_decode_opt_box_autoadd_attachment_meta_extra( - dynamic raw) { + LPImageMetadata dco_decode_lp_image_metadata(dynamic raw) { // Codec=Dco (DartCObject based), see doc to use other codecs - return raw == null - ? null - : dco_decode_box_autoadd_attachment_meta_extra(raw); + final arr = raw as List; + if (arr.length != 3) + throw Exception('unexpected arr length: expect 3 but see ${arr.length}'); + return LPImageMetadata( + size: dco_decode_String(arr[0]), + url: dco_decode_nsurl(arr[1]), + version: dco_decode_u_8(arr[2]), + ); } @protected - Balloon? dco_decode_opt_box_autoadd_balloon(dynamic raw) { + LPLinkMetadata dco_decode_lp_link_metadata(dynamic raw) { // Codec=Dco (DartCObject based), see doc to use other codecs - return raw == null ? null : dco_decode_box_autoadd_balloon(raw); + final arr = raw as List; + if (arr.length != 16) + throw Exception('unexpected arr length: expect 16 but see ${arr.length}'); + return LPLinkMetadata( + imageMetadata: dco_decode_opt_box_autoadd_lp_image_metadata(arr[0]), + version: dco_decode_u_8(arr[1]), + iconMetadata: dco_decode_opt_box_autoadd_lp_icon_metadata(arr[2]), + originalUrl: dco_decode_opt_box_autoadd_nsurl(arr[3]), + url: dco_decode_opt_box_autoadd_nsurl(arr[4]), + title: dco_decode_opt_String(arr[5]), + summary: dco_decode_opt_String(arr[6]), + image: dco_decode_opt_box_autoadd_rich_link_image_attachment_substitute( + arr[7], + ), + icon: dco_decode_opt_box_autoadd_rich_link_image_attachment_substitute( + arr[8], + ), + images: + dco_decode_opt_box_autoadd_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerNSArrayLPImageMetadata( + arr[9], + ), + icons: + dco_decode_opt_box_autoadd_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerNSArrayLPIconMetadata( + arr[10], + ), + isIncomplete: dco_decode_opt_box_autoadd_bool(arr[11]), + usesActivityPub: dco_decode_opt_box_autoadd_bool(arr[12]), + isEncodedForLocalUse: dco_decode_opt_box_autoadd_bool(arr[13]), + collaborationType: dco_decode_opt_box_autoadd_u_32(arr[14]), + specialization2: dco_decode_opt_box_autoadd_lp_specialization_metadata( + arr[15], + ), + ); } @protected - BalloonLayout? dco_decode_opt_box_autoadd_balloon_layout(dynamic raw) { + LPSpecializationMetadata dco_decode_lp_specialization_metadata(dynamic raw) { // Codec=Dco (DartCObject based), see doc to use other codecs - return raw == null ? null : dco_decode_box_autoadd_balloon_layout(raw); + switch (raw[0]) { + case 0: + return LPSpecializationMetadata_LPPasswordsInviteMetadata( + groupName: dco_decode_String(raw[1]), + urlParameters: dco_decode_String(raw[2]), + ); + default: + throw Exception("unreachable"); + } } @protected - bool? dco_decode_opt_box_autoadd_bool(dynamic raw) { + MemojiData dco_decode_memoji_data(dynamic raw) { // Codec=Dco (DartCObject based), see doc to use other codecs - return raw == null ? null : dco_decode_box_autoadd_bool(raw); + final arr = raw as List; + if (arr.length != 5) + throw Exception('unexpected arr length: expect 5 but see ${arr.length}'); + return MemojiData( + backgroundColorDescription: dco_decode_poster_color(arr[0]), + avatarRecordData: dco_decode_list_prim_u_8_strict(arr[1]), + avatarPoseData: dco_decode_list_prim_u_8_strict(arr[2]), + hasBody: dco_decode_bool(arr[3]), + avatarImageData: dco_decode_list_prim_u_8_strict(arr[4]), + ); } @protected - CertifiedContext? dco_decode_opt_box_autoadd_certified_context(dynamic raw) { + Message dco_decode_message(dynamic raw) { // Codec=Dco (DartCObject based), see doc to use other codecs - return raw == null ? null : dco_decode_box_autoadd_certified_context(raw); - } - - @protected - CloudAttachment? dco_decode_opt_box_autoadd_cloud_attachment(dynamic raw) { - // Codec=Dco (DartCObject based), see doc to use other codecs - return raw == null ? null : dco_decode_box_autoadd_cloud_attachment(raw); + switch (raw[0]) { + case 0: + return Message_Message(dco_decode_box_autoadd_normal_message(raw[1])); + case 1: + return Message_RenameMessage( + dco_decode_box_autoadd_rename_message(raw[1]), + ); + case 2: + return Message_ChangeParticipants( + dco_decode_box_autoadd_change_participant_message(raw[1]), + ); + case 3: + return Message_React(dco_decode_box_autoadd_react_message(raw[1])); + case 4: + return Message_Delivered(); + case 5: + return Message_Read(); + case 6: + return Message_Typing( + dco_decode_bool(raw[1]), + dco_decode_opt_box_autoadd_typing_app(raw[2]), + ); + case 7: + return Message_Unsend(dco_decode_box_autoadd_unsend_message(raw[1])); + case 8: + return Message_Edit(dco_decode_box_autoadd_edit_message(raw[1])); + case 9: + return Message_IconChange( + dco_decode_box_autoadd_icon_change_message(raw[1]), + ); + case 10: + return Message_EnableSmsActivation(dco_decode_bool(raw[1])); + case 11: + return Message_MessageReadOnDevice(); + case 12: + return Message_SmsConfirmSent(dco_decode_bool(raw[1])); + case 13: + return Message_MarkUnread(); + case 14: + return Message_PeerCacheInvalidate(); + case 15: + return Message_UpdateExtension( + dco_decode_box_autoadd_update_extension_message(raw[1]), + ); + case 16: + return Message_Error(dco_decode_box_autoadd_error_message(raw[1])); + case 17: + return Message_MoveToRecycleBin( + dco_decode_box_autoadd_move_to_recycle_bin_message(raw[1]), + ); + case 18: + return Message_RecoverChat( + dco_decode_box_autoadd_operated_chat(raw[1]), + ); + case 19: + return Message_PermanentDelete( + dco_decode_box_autoadd_permanent_delete_message(raw[1]), + ); + case 20: + return Message_Unschedule(); + case 21: + return Message_UpdateProfile( + dco_decode_box_autoadd_update_profile_message(raw[1]), + ); + case 22: + return Message_UpdateProfileSharing( + dco_decode_box_autoadd_update_profile_sharing_message(raw[1]), + ); + case 23: + return Message_ShareProfile( + dco_decode_box_autoadd_share_profile_message(raw[1]), + ); + case 24: + return Message_NotifyAnyways(); + case 25: + return Message_SetTranscriptBackground( + dco_decode_box_autoadd_set_transcript_background_message(raw[1]), + ); + default: + throw Exception("unreachable"); + } } @protected - CloudChat? dco_decode_opt_box_autoadd_cloud_chat(dynamic raw) { + MessageEdit dco_decode_message_edit(dynamic raw) { // Codec=Dco (DartCObject based), see doc to use other codecs - return raw == null ? null : dco_decode_box_autoadd_cloud_chat(raw); + final arr = raw as List; + if (arr.length != 3) + throw Exception('unexpected arr length: expect 3 but see ${arr.length}'); + return MessageEdit( + t: dco_decode_list_prim_u_8_strict(arr[0]), + d: dco_decode_f_64(arr[1]), + bcg: dco_decode_opt_String(arr[2]), + ); } @protected - CloudMessage? dco_decode_opt_box_autoadd_cloud_message(dynamic raw) { + MessageEditRange dco_decode_message_edit_range(dynamic raw) { // Codec=Dco (DartCObject based), see doc to use other codecs - return raw == null ? null : dco_decode_box_autoadd_cloud_message(raw); + final arr = raw as List; + if (arr.length != 2) + throw Exception('unexpected arr length: expect 2 but see ${arr.length}'); + return MessageEditRange( + lo: dco_decode_u_32(arr[0]), + le: dco_decode_u_32(arr[1]), + ); } @protected - CloudProp? dco_decode_opt_box_autoadd_cloud_prop(dynamic raw) { + MessageInst dco_decode_message_inst(dynamic raw) { // Codec=Dco (DartCObject based), see doc to use other codecs - return raw == null ? null : dco_decode_box_autoadd_cloud_prop(raw); + final arr = raw as List; + if (arr.length != 9) + throw Exception('unexpected arr length: expect 9 but see ${arr.length}'); + return MessageInst( + id: dco_decode_String(arr[0]), + sender: dco_decode_opt_String(arr[1]), + conversation: dco_decode_opt_box_autoadd_conversation_data(arr[2]), + message: dco_decode_message(arr[3]), + sentTimestamp: dco_decode_CastedPrimitive_u_64(arr[4]), + target: dco_decode_opt_list_message_target(arr[5]), + sendDelivered: dco_decode_bool(arr[6]), + verificationFailed: dco_decode_bool(arr[7]), + certifiedContext: dco_decode_opt_box_autoadd_certified_context(arr[8]), + ); } @protected - ConversationData? dco_decode_opt_box_autoadd_conversation_data(dynamic raw) { + MessagePart dco_decode_message_part(dynamic raw) { // Codec=Dco (DartCObject based), see doc to use other codecs - return raw == null ? null : dco_decode_box_autoadd_conversation_data(raw); + switch (raw[0]) { + case 0: + return MessagePart_Text( + dco_decode_String(raw[1]), + dco_decode_box_autoadd_text_format(raw[2]), + ); + case 1: + return MessagePart_Attachment( + dco_decode_box_autoadd_attachment(raw[1]), + ); + case 2: + return MessagePart_Mention( + dco_decode_String(raw[1]), + dco_decode_String(raw[2]), + ); + case 3: + return MessagePart_Object(dco_decode_String(raw[1])); + default: + throw Exception("unreachable"); + } } @protected - DartBeaconShareInfo? dco_decode_opt_box_autoadd_dart_beacon_share_info( - dynamic raw) { + MessageParts dco_decode_message_parts(dynamic raw) { // Codec=Dco (DartCObject based), see doc to use other codecs - return raw == null - ? null - : dco_decode_box_autoadd_dart_beacon_share_info(raw); + final arr = raw as List; + if (arr.length != 1) + throw Exception('unexpected arr length: expect 1 but see ${arr.length}'); + return MessageParts(field0: dco_decode_list_indexed_message_part(arr[0])); } @protected - ExtensionApp? dco_decode_opt_box_autoadd_extension_app(dynamic raw) { + MessageProto dco_decode_message_proto(dynamic raw) { // Codec=Dco (DartCObject based), see doc to use other codecs - return raw == null ? null : dco_decode_box_autoadd_extension_app(raw); + final arr = raw as List; + if (arr.length != 17) + throw Exception('unexpected arr length: expect 17 but see ${arr.length}'); + return MessageProto( + unk1: dco_decode_u_32(arr[0]), + subject: dco_decode_opt_String(arr[1]), + text: dco_decode_opt_String(arr[2]), + attributedBody: dco_decode_opt_list_prim_u_8_strict(arr[3]), + balloonBundleId: dco_decode_opt_String(arr[4]), + payloadData: dco_decode_opt_list_prim_u_8_strict(arr[5]), + messageSummaryInfo: dco_decode_opt_list_prim_u_8_strict(arr[6]), + effect: dco_decode_opt_String(arr[7]), + dateRead: dco_decode_opt_CastedPrimitive_u_64(arr[8]), + unk10: dco_decode_opt_box_autoadd_u_32(arr[9]), + unk11: dco_decode_opt_box_autoadd_u_32(arr[10]), + dateDelivered: dco_decode_opt_CastedPrimitive_u_64(arr[11]), + unk14: dco_decode_opt_box_autoadd_u_32(arr[12]), + associatedMessageType: dco_decode_opt_box_autoadd_u_32(arr[13]), + associatedMessageGuid: dco_decode_opt_String(arr[14]), + associatedMessageRangeLocation: dco_decode_opt_box_autoadd_u_32(arr[15]), + associatedMessageRangeLength: dco_decode_opt_box_autoadd_u_32(arr[16]), + ); } @protected - double? dco_decode_opt_box_autoadd_f_64(dynamic raw) { + MessageProto2 dco_decode_message_proto_2(dynamic raw) { // Codec=Dco (DartCObject based), see doc to use other codecs - return raw == null ? null : dco_decode_box_autoadd_f_64(raw); + final arr = raw as List; + if (arr.length != 1) + throw Exception('unexpected arr length: expect 1 but see ${arr.length}'); + return MessageProto2(reply: dco_decode_opt_String(arr[0])); } @protected - FTMode? dco_decode_opt_box_autoadd_ft_mode(dynamic raw) { + MessageProto3 dco_decode_message_proto_3(dynamic raw) { // Codec=Dco (DartCObject based), see doc to use other codecs - return raw == null ? null : dco_decode_box_autoadd_ft_mode(raw); + final arr = raw as List; + if (arr.length != 2) + throw Exception('unexpected arr length: expect 2 but see ${arr.length}'); + return MessageProto3( + unk2: dco_decode_opt_box_autoadd_u_32(arr[0]), + unk3: dco_decode_opt_box_autoadd_u_32(arr[1]), + ); } @protected - int? dco_decode_opt_box_autoadd_i_32(dynamic raw) { + MessageProto4 dco_decode_message_proto_4(dynamic raw) { // Codec=Dco (DartCObject based), see doc to use other codecs - return raw == null ? null : dco_decode_box_autoadd_i_32(raw); + final arr = raw as List; + if (arr.length != 6) + throw Exception('unexpected arr length: expect 6 but see ${arr.length}'); + return MessageProto4( + associatedMessageEmoji: dco_decode_opt_String(arr[0]), + service: dco_decode_opt_String(arr[1]), + scheduleType: dco_decode_opt_box_autoadd_u_32(arr[2]), + scheduleState: dco_decode_opt_box_autoadd_u_32(arr[3]), + groupId: dco_decode_opt_String(arr[4]), + sentOrReceivedOffGrid: dco_decode_opt_box_autoadd_u_32(arr[5]), + ); } @protected - PlatformInt64? dco_decode_opt_box_autoadd_i_64(dynamic raw) { + MessageSummaryInfo dco_decode_message_summary_info(dynamic raw) { // Codec=Dco (DartCObject based), see doc to use other codecs - return raw == null ? null : dco_decode_box_autoadd_i_64(raw); + final arr = raw as List; + if (arr.length != 14) + throw Exception('unexpected arr length: expect 14 but see ${arr.length}'); + return MessageSummaryInfo( + ams: dco_decode_opt_String(arr[0]), + ampt: dco_decode_opt_list_prim_u_8_strict(arr[1]), + amc: dco_decode_opt_box_autoadd_u_32(arr[2]), + amb: dco_decode_opt_String(arr[3]), + amd: dco_decode_opt_String(arr[4]), + ec: dco_decode_Map_String_list_message_edit(arr[5]), + ep: dco_decode_list_prim_u_32_strict(arr[6]), + otr: dco_decode_Map_String_message_edit_range(arr[7]), + ust: dco_decode_opt_box_autoadd_bool(arr[8]), + rp: dco_decode_list_prim_u_32_strict(arr[9]), + hbr: dco_decode_opt_box_autoadd_bool(arr[10]), + oui: dco_decode_opt_String(arr[11]), + osn: dco_decode_opt_String(arr[12]), + euh: dco_decode_list_String(arr[13]), + ); } @protected - IMessagePosterRecord? dco_decode_opt_box_autoadd_i_message_poster_record( - dynamic raw) { + MessageTarget dco_decode_message_target(dynamic raw) { // Codec=Dco (DartCObject based), see doc to use other codecs - return raw == null - ? null - : dco_decode_box_autoadd_i_message_poster_record(raw); + switch (raw[0]) { + case 0: + return MessageTarget_Token(dco_decode_list_prim_u_8_strict(raw[1])); + case 1: + return MessageTarget_Uuid(dco_decode_String(raw[1])); + default: + throw Exception("unreachable"); + } } @protected - IdmsRequestedSignIn? dco_decode_opt_box_autoadd_idms_requested_sign_in( - dynamic raw) { + MessageType dco_decode_message_type(dynamic raw) { // Codec=Dco (DartCObject based), see doc to use other codecs - return raw == null - ? null - : dco_decode_box_autoadd_idms_requested_sign_in(raw); + switch (raw[0]) { + case 0: + return MessageType_IMessage(); + case 1: + return MessageType_SMS( + isPhone: dco_decode_bool(raw[1]), + usingNumber: dco_decode_String(raw[2]), + fromHandle: dco_decode_opt_String(raw[3]), + ); + default: + throw Exception("unreachable"); + } } @protected - LinkMeta? dco_decode_opt_box_autoadd_link_meta(dynamic raw) { + MMCSAttachmentMeta dco_decode_mmcs_attachment_meta(dynamic raw) { // Codec=Dco (DartCObject based), see doc to use other codecs - return raw == null ? null : dco_decode_box_autoadd_link_meta(raw); - } - + final arr = raw as List; + if (arr.length != 10) + throw Exception('unexpected arr length: expect 10 but see ${arr.length}'); + return MMCSAttachmentMeta( + mmcsSignatureHex: dco_decode_opt_String(arr[0]), + mmcsOwner: dco_decode_opt_String(arr[1]), + mmcsUrl: dco_decode_opt_String(arr[2]), + decryptionKey: dco_decode_opt_String(arr[3]), + inlineAttachment: dco_decode_opt_String(arr[4]), + messagePart: dco_decode_opt_String(arr[5]), + fileSize: dco_decode_opt_box_autoadd_num_or_string(arr[6]), + utiType: dco_decode_opt_String(arr[7]), + mimeType: dco_decode_opt_String(arr[8]), + name: dco_decode_opt_String(arr[9]), + ); + } + @protected - Location? dco_decode_opt_box_autoadd_location(dynamic raw) { + MMCSFile dco_decode_mmcs_file(dynamic raw) { // Codec=Dco (DartCObject based), see doc to use other codecs - return raw == null ? null : dco_decode_box_autoadd_location(raw); + final arr = raw as List; + if (arr.length != 5) + throw Exception('unexpected arr length: expect 5 but see ${arr.length}'); + return MMCSFile( + signature: dco_decode_list_prim_u_8_strict(arr[0]), + object: dco_decode_String(arr[1]), + url: dco_decode_String(arr[2]), + key: dco_decode_list_prim_u_8_strict(arr[3]), + size: dco_decode_CastedPrimitive_usize(arr[4]), + ); } @protected - LoginState? dco_decode_opt_box_autoadd_login_state(dynamic raw) { + MMCSTransferProgress dco_decode_mmcs_transfer_progress(dynamic raw) { // Codec=Dco (DartCObject based), see doc to use other codecs - return raw == null ? null : dco_decode_box_autoadd_login_state(raw); + final arr = raw as List; + if (arr.length != 3) + throw Exception('unexpected arr length: expect 3 but see ${arr.length}'); + return MMCSTransferProgress( + prog: dco_decode_CastedPrimitive_usize(arr[0]), + total: dco_decode_CastedPrimitive_usize(arr[1]), + file: dco_decode_opt_box_autoadd_mmcs_file(arr[2]), + ); } @protected - LPIconMetadata? dco_decode_opt_box_autoadd_lp_icon_metadata(dynamic raw) { + MonogramData dco_decode_monogram_data(dynamic raw) { // Codec=Dco (DartCObject based), see doc to use other codecs - return raw == null ? null : dco_decode_box_autoadd_lp_icon_metadata(raw); + final arr = raw as List; + if (arr.length != 4) + throw Exception('unexpected arr length: expect 4 but see ${arr.length}'); + return MonogramData( + topBackgroundColorDescription: dco_decode_poster_color(arr[0]), + backgroundColorDescription: dco_decode_poster_color(arr[1]), + initials: dco_decode_String(arr[2]), + monogramSupportedForName: dco_decode_bool(arr[3]), + ); } @protected - LPImageMetadata? dco_decode_opt_box_autoadd_lp_image_metadata(dynamic raw) { + MoveToRecycleBinMessage dco_decode_move_to_recycle_bin_message(dynamic raw) { // Codec=Dco (DartCObject based), see doc to use other codecs - return raw == null ? null : dco_decode_box_autoadd_lp_image_metadata(raw); + final arr = raw as List; + if (arr.length != 2) + throw Exception('unexpected arr length: expect 2 but see ${arr.length}'); + return MoveToRecycleBinMessage( + target: dco_decode_delete_target(arr[0]), + recoverableDeleteDate: dco_decode_CastedPrimitive_u_64(arr[1]), + ); } @protected - LPSpecializationMetadata? - dco_decode_opt_box_autoadd_lp_specialization_metadata(dynamic raw) { + MyAsyncRuntime dco_decode_my_async_runtime(dynamic raw) { // Codec=Dco (DartCObject based), see doc to use other codecs - return raw == null - ? null - : dco_decode_box_autoadd_lp_specialization_metadata(raw); + final arr = raw as List; + if (arr.length != 0) + throw Exception('unexpected arr length: expect 0 but see ${arr.length}'); + return MyAsyncRuntime(); } @protected - MMCSAttachmentMeta? dco_decode_opt_box_autoadd_mmcs_attachment_meta( - dynamic raw) { + NormalMessage dco_decode_normal_message(dynamic raw) { // Codec=Dco (DartCObject based), see doc to use other codecs - return raw == null - ? null - : dco_decode_box_autoadd_mmcs_attachment_meta(raw); + final arr = raw as List; + if (arr.length != 11) + throw Exception('unexpected arr length: expect 11 but see ${arr.length}'); + return NormalMessage( + parts: dco_decode_message_parts(arr[0]), + effect: dco_decode_opt_String(arr[1]), + replyGuid: dco_decode_opt_String(arr[2]), + replyPart: dco_decode_opt_String(arr[3]), + service: dco_decode_message_type(arr[4]), + subject: dco_decode_opt_String(arr[5]), + app: dco_decode_opt_box_autoadd_extension_app(arr[6]), + linkMeta: dco_decode_opt_box_autoadd_link_meta(arr[7]), + voice: dco_decode_bool(arr[8]), + scheduled: dco_decode_opt_box_autoadd_schedule_mode(arr[9]), + embeddedProfile: dco_decode_opt_box_autoadd_share_profile_message( + arr[10], + ), + ); } @protected - MMCSFile? dco_decode_opt_box_autoadd_mmcs_file(dynamic raw) { + NSAttributedString dco_decode_ns_attributed_string(dynamic raw) { // Codec=Dco (DartCObject based), see doc to use other codecs - return raw == null ? null : dco_decode_box_autoadd_mmcs_file(raw); + final arr = raw as List; + if (arr.length != 2) + throw Exception('unexpected arr length: expect 2 but see ${arr.length}'); + return NSAttributedString( + text: dco_decode_String(arr[0]), + ranges: dco_decode_list_record_u_32_ns_dictionary_typed_coder(arr[1]), + ); } @protected - NSURL? dco_decode_opt_box_autoadd_nsurl(dynamic raw) { + NSDictionaryClass dco_decode_ns_dictionary_class(dynamic raw) { // Codec=Dco (DartCObject based), see doc to use other codecs - return raw == null ? null : dco_decode_box_autoadd_nsurl(raw); + return NSDictionaryClass.values[raw as int]; } @protected - NumOrString? dco_decode_opt_box_autoadd_num_or_string(dynamic raw) { + NSDictionaryTypedCoder dco_decode_ns_dictionary_typed_coder(dynamic raw) { // Codec=Dco (DartCObject based), see doc to use other codecs - return raw == null ? null : dco_decode_box_autoadd_num_or_string(raw); + final arr = raw as List; + if (arr.length != 1) + throw Exception('unexpected arr length: expect 1 but see ${arr.length}'); + return NSDictionaryTypedCoder( + field0: + dco_decode_Map_String_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerStCollapsedValue( + arr[0], + ), + ); } @protected - PartExtension? dco_decode_opt_box_autoadd_part_extension(dynamic raw) { + NSNumber dco_decode_ns_number(dynamic raw) { // Codec=Dco (DartCObject based), see doc to use other codecs - return raw == null ? null : dco_decode_box_autoadd_part_extension(raw); + final arr = raw as List; + if (arr.length != 1) + throw Exception('unexpected arr length: expect 1 but see ${arr.length}'); + return NSNumber(field0: dco_decode_u_32(arr[0])); } @protected - PasswordManagerMetaDataFormerlyShared? - dco_decode_opt_box_autoadd_password_manager_meta_data_formerly_shared( - dynamic raw) { + NSString dco_decode_ns_string(dynamic raw) { // Codec=Dco (DartCObject based), see doc to use other codecs - return raw == null - ? null - : dco_decode_box_autoadd_password_manager_meta_data_formerly_shared( - raw); + final arr = raw as List; + if (arr.length != 1) + throw Exception('unexpected arr length: expect 1 but see ${arr.length}'); + return NSString(field0: dco_decode_String(arr[0])); } @protected - PasswordManagerTotp? dco_decode_opt_box_autoadd_password_manager_totp( - dynamic raw) { + NSURL dco_decode_nsurl(dynamic raw) { // Codec=Dco (DartCObject based), see doc to use other codecs - return raw == null - ? null - : dco_decode_box_autoadd_password_manager_totp(raw); + final arr = raw as List; + if (arr.length != 2) + throw Exception('unexpected arr length: expect 2 but see ${arr.length}'); + return NSURL( + base: dco_decode_String(arr[0]), + relative: dco_decode_String(arr[1]), + ); } @protected - PosterColor? dco_decode_opt_box_autoadd_poster_color(dynamic raw) { + NumOrString dco_decode_num_or_string(dynamic raw) { // Codec=Dco (DartCObject based), see doc to use other codecs - return raw == null ? null : dco_decode_box_autoadd_poster_color(raw); + switch (raw[0]) { + case 0: + return NumOrString_Num(dco_decode_u_32(raw[1])); + case 1: + return NumOrString_String(dco_decode_String(raw[1])); + case 2: + return NumOrString_Bool(dco_decode_bool(raw[1])); + default: + throw Exception("unreachable"); + } } @protected - PRPosterContentMaterialStyle? - dco_decode_opt_box_autoadd_pr_poster_content_material_style(dynamic raw) { + OperatedChat dco_decode_operated_chat(dynamic raw) { // Codec=Dco (DartCObject based), see doc to use other codecs - return raw == null - ? null - : dco_decode_box_autoadd_pr_poster_content_material_style(raw); + final arr = raw as List; + if (arr.length != 5) + throw Exception('unexpected arr length: expect 5 but see ${arr.length}'); + return OperatedChat( + participants: dco_decode_list_String(arr[0]), + groupId: dco_decode_String(arr[1]), + guid: dco_decode_String(arr[2]), + deleteIncomingMessages: dco_decode_opt_box_autoadd_bool(arr[3]), + wasReportedAsJunk: dco_decode_opt_box_autoadd_bool(arr[4]), + ); } @protected - PushMessage? dco_decode_opt_box_autoadd_push_message(dynamic raw) { + int? dco_decode_opt_CastedPrimitive_i_64(dynamic raw) { // Codec=Dco (DartCObject based), see doc to use other codecs - return raw == null ? null : dco_decode_box_autoadd_push_message(raw); + return raw == null ? null : dco_decode_CastedPrimitive_i_64(raw); } @protected - ( - SharedPushState, - ApsWatcher - )? dco_decode_opt_box_autoadd_record_shared_push_state_auto_owned_rust_opaque_flutter_rust_bridgefor_generated_rust_auto_opaque_inner_aps_watcher( - dynamic raw) { + int? dco_decode_opt_CastedPrimitive_u_64(dynamic raw) { // Codec=Dco (DartCObject based), see doc to use other codecs - return raw == null - ? null - : dco_decode_box_autoadd_record_shared_push_state_auto_owned_rust_opaque_flutter_rust_bridgefor_generated_rust_auto_opaque_inner_aps_watcher( - raw); + return raw == null ? null : dco_decode_CastedPrimitive_u_64(raw); } @protected - (String, String)? dco_decode_opt_box_autoadd_record_string_string( - dynamic raw) { + int? dco_decode_opt_CastedPrimitive_usize(dynamic raw) { // Codec=Dco (DartCObject based), see doc to use other codecs - return raw == null - ? null - : dco_decode_box_autoadd_record_string_string(raw); + return raw == null ? null : dco_decode_CastedPrimitive_usize(raw); } @protected - (String, BigInt)? dco_decode_opt_box_autoadd_record_string_u_64(dynamic raw) { + String? dco_decode_opt_String(dynamic raw) { // Codec=Dco (DartCObject based), see doc to use other codecs - return raw == null ? null : dco_decode_box_autoadd_record_string_u_64(raw); + return raw == null ? null : dco_decode_String(raw); } @protected - RichLinkImageAttachmentSubstitute? - dco_decode_opt_box_autoadd_rich_link_image_attachment_substitute( - dynamic raw) { + ApsState? + dco_decode_opt_box_autoadd_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerAPSState( + dynamic raw, + ) { // Codec=Dco (DartCObject based), see doc to use other codecs return raw == null ? null - : dco_decode_box_autoadd_rich_link_image_attachment_substitute(raw); + : dco_decode_box_autoadd_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerAPSState( + raw, + ); } @protected - ScheduleMode? dco_decode_opt_box_autoadd_schedule_mode(dynamic raw) { + ArcCloudKitClientDefaultAnisetteProvider? + dco_decode_opt_box_autoadd_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcCloudKitClientDefaultAnisetteProvider( + dynamic raw, + ) { // Codec=Dco (DartCObject based), see doc to use other codecs - return raw == null ? null : dco_decode_box_autoadd_schedule_mode(raw); + return raw == null + ? null + : dco_decode_box_autoadd_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcCloudKitClientDefaultAnisetteProvider( + raw, + ); } @protected - ShareProfileMessage? dco_decode_opt_box_autoadd_share_profile_message( - dynamic raw) { + ArcCloudMessagesClientDefaultAnisetteProvider? + dco_decode_opt_box_autoadd_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcCloudMessagesClientDefaultAnisetteProvider( + dynamic raw, + ) { // Codec=Dco (DartCObject based), see doc to use other codecs return raw == null ? null - : dco_decode_box_autoadd_share_profile_message(raw); + : dco_decode_box_autoadd_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcCloudMessagesClientDefaultAnisetteProvider( + raw, + ); } @protected - SharedICloudServices? dco_decode_opt_box_autoadd_shared_i_cloud_services( - dynamic raw) { + ArcFindMyClientDefaultAnisetteProvider? + dco_decode_opt_box_autoadd_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcFindMyClientDefaultAnisetteProvider( + dynamic raw, + ) { // Codec=Dco (DartCObject based), see doc to use other codecs return raw == null ? null - : dco_decode_box_autoadd_shared_i_cloud_services(raw); + : dco_decode_box_autoadd_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcFindMyClientDefaultAnisetteProvider( + raw, + ); } @protected - SharedPoster? dco_decode_opt_box_autoadd_shared_poster(dynamic raw) { + ArcKeychainClientDefaultAnisetteProvider? + dco_decode_opt_box_autoadd_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcKeychainClientDefaultAnisetteProvider( + dynamic raw, + ) { // Codec=Dco (DartCObject based), see doc to use other codecs - return raw == null ? null : dco_decode_box_autoadd_shared_poster(raw); + return raw == null + ? null + : dco_decode_box_autoadd_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcKeychainClientDefaultAnisetteProvider( + raw, + ); } @protected - SharedPushState? dco_decode_opt_box_autoadd_shared_push_state(dynamic raw) { + ArcMutexAppleAccountDefaultAnisetteProvider? + dco_decode_opt_box_autoadd_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcMutexAppleAccountDefaultAnisetteProvider( + dynamic raw, + ) { // Codec=Dco (DartCObject based), see doc to use other codecs - return raw == null ? null : dco_decode_box_autoadd_shared_push_state(raw); + return raw == null + ? null + : dco_decode_box_autoadd_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcMutexAppleAccountDefaultAnisetteProvider( + raw, + ); } @protected - SupportAction? dco_decode_opt_box_autoadd_support_action(dynamic raw) { + ArcPasswordManagerDefaultAnisetteProvider? + dco_decode_opt_box_autoadd_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcPasswordManagerDefaultAnisetteProvider( + dynamic raw, + ) { // Codec=Dco (DartCObject based), see doc to use other codecs - return raw == null ? null : dco_decode_box_autoadd_support_action(raw); + return raw == null + ? null + : dco_decode_box_autoadd_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcPasswordManagerDefaultAnisetteProvider( + raw, + ); } @protected - SupportAlert? dco_decode_opt_box_autoadd_support_alert(dynamic raw) { + Asset? + dco_decode_opt_box_autoadd_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerAsset( + dynamic raw, + ) { // Codec=Dco (DartCObject based), see doc to use other codecs - return raw == null ? null : dco_decode_box_autoadd_support_alert(raw); + return raw == null + ? null + : dco_decode_box_autoadd_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerAsset( + raw, + ); } @protected - TypingApp? dco_decode_opt_box_autoadd_typing_app(dynamic raw) { + ChannelInterestToken? + dco_decode_opt_box_autoadd_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerChannelInterestToken( + dynamic raw, + ) { // Codec=Dco (DartCObject based), see doc to use other codecs - return raw == null ? null : dco_decode_box_autoadd_typing_app(raw); + return raw == null + ? null + : dco_decode_box_autoadd_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerChannelInterestToken( + raw, + ); } @protected - int? dco_decode_opt_box_autoadd_u_32(dynamic raw) { + CircleClientSessionDefaultAnisetteProvider? + dco_decode_opt_box_autoadd_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerCircleClientSessionDefaultAnisetteProvider( + dynamic raw, + ) { // Codec=Dco (DartCObject based), see doc to use other codecs - return raw == null ? null : dco_decode_box_autoadd_u_32(raw); + return raw == null + ? null + : dco_decode_box_autoadd_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerCircleClientSessionDefaultAnisetteProvider( + raw, + ); } @protected - BigInt? dco_decode_opt_box_autoadd_u_64(dynamic raw) { + CloudSyncPreparedMessageCreateHandle? + dco_decode_opt_box_autoadd_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerCloudSyncPreparedMessageCreateHandle( + dynamic raw, + ) { // Codec=Dco (DartCObject based), see doc to use other codecs - return raw == null ? null : dco_decode_box_autoadd_u_64(raw); + return raw == null + ? null + : dco_decode_box_autoadd_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerCloudSyncPreparedMessageCreateHandle( + raw, + ); } @protected - UpdateAccountFinish? dco_decode_opt_box_autoadd_update_account_finish( - dynamic raw) { + ConversationLink? + dco_decode_opt_box_autoadd_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerConversationLink( + dynamic raw, + ) { // Codec=Dco (DartCObject based), see doc to use other codecs return raw == null ? null - : dco_decode_box_autoadd_update_account_finish(raw); + : dco_decode_box_autoadd_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerConversationLink( + raw, + ); } @protected - List? - dco_decode_opt_list_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerIDSUser( - dynamic raw) { + ConversationParticipant? + dco_decode_opt_box_autoadd_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerConversationParticipant( + dynamic raw, + ) { // Codec=Dco (DartCObject based), see doc to use other codecs return raw == null ? null - : dco_decode_list_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerIDSUser( - raw); + : dco_decode_box_autoadd_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerConversationParticipant( + raw, + ); } @protected - List? dco_decode_opt_list_String(dynamic raw) { + Date? + dco_decode_opt_box_autoadd_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerDate( + dynamic raw, + ) { // Codec=Dco (DartCObject based), see doc to use other codecs - return raw == null ? null : dco_decode_list_String(raw); + return raw == null + ? null + : dco_decode_box_autoadd_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerDate( + raw, + ); } @protected - List? dco_decode_opt_list_message_target(dynamic raw) { + GZipWrapperChatProto? + dco_decode_opt_box_autoadd_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerGZipWrapperChatProto( + dynamic raw, + ) { // Codec=Dco (DartCObject based), see doc to use other codecs - return raw == null ? null : dco_decode_list_message_target(raw); + return raw == null + ? null + : dco_decode_box_autoadd_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerGZipWrapperChatProto( + raw, + ); } @protected - Uint8List? dco_decode_opt_list_prim_u_8_strict(dynamic raw) { + GZipWrapperMessageProto2? + dco_decode_opt_box_autoadd_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerGZipWrapperMessageProto2( + dynamic raw, + ) { // Codec=Dco (DartCObject based), see doc to use other codecs - return raw == null ? null : dco_decode_list_prim_u_8_strict(raw); + return raw == null + ? null + : dco_decode_box_autoadd_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerGZipWrapperMessageProto2( + raw, + ); } @protected - PartExtension dco_decode_part_extension(dynamic raw) { + GZipWrapperMessageProto3? + dco_decode_opt_box_autoadd_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerGZipWrapperMessageProto3( + dynamic raw, + ) { // Codec=Dco (DartCObject based), see doc to use other codecs - switch (raw[0]) { - case 0: - return PartExtension_Sticker( - msgWidth: dco_decode_f_64(raw[1]), - rotation: dco_decode_f_64(raw[2]), - sai: dco_decode_u_64(raw[3]), - scale: dco_decode_f_64(raw[4]), - update: dco_decode_opt_box_autoadd_bool(raw[5]), - sli: dco_decode_u_64(raw[6]), - normalizedX: dco_decode_f_64(raw[7]), - normalizedY: dco_decode_f_64(raw[8]), - version: dco_decode_u_64(raw[9]), - hash: dco_decode_String(raw[10]), - safi: dco_decode_u_64(raw[11]), - effectType: dco_decode_i_64(raw[12]), - stickerId: dco_decode_String(raw[13]), - ); - default: - throw Exception("unreachable"); - } + return raw == null + ? null + : dco_decode_box_autoadd_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerGZipWrapperMessageProto3( + raw, + ); } @protected - Passkey dco_decode_passkey(dynamic raw) { + GZipWrapperMessageProto4? + dco_decode_opt_box_autoadd_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerGZipWrapperMessageProto4( + dynamic raw, + ) { // Codec=Dco (DartCObject based), see doc to use other codecs - final arr = raw as List; - if (arr.length != 7) - throw Exception('unexpected arr length: expect 7 but see ${arr.length}'); - return Passkey( - cdat: dco_decode_CastedPrimitive_u_64(arr[0]), - mdat: dco_decode_CastedPrimitive_u_64(arr[1]), - agrp: dco_decode_String(arr[2]), - labl: dco_decode_String(arr[3]), - data: dco_decode_list_prim_u_8_strict(arr[4]), - atag: dco_decode_list_prim_u_8_strict(arr[5]), - klbl: dco_decode_list_prim_u_8_strict(arr[6]), - ); + return raw == null + ? null + : dco_decode_box_autoadd_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerGZipWrapperMessageProto4( + raw, + ); } @protected - PasswordManagerAltDomain dco_decode_password_manager_alt_domain(dynamic raw) { + IdsUser? + dco_decode_opt_box_autoadd_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerIDSUser( + dynamic raw, + ) { // Codec=Dco (DartCObject based), see doc to use other codecs - final arr = raw as List; - if (arr.length != 1) - throw Exception('unexpected arr length: expect 1 but see ${arr.length}'); - return PasswordManagerAltDomain( - domain: dco_decode_String(arr[0]), - ); + return raw == null + ? null + : dco_decode_box_autoadd_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerIDSUser( + raw, + ); } @protected - PasswordManagerMeta dco_decode_password_manager_meta(dynamic raw) { + LocationReport? + dco_decode_opt_box_autoadd_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerLocationReport( + dynamic raw, + ) { // Codec=Dco (DartCObject based), see doc to use other codecs - final arr = raw as List; - if (arr.length != 6) - throw Exception('unexpected arr length: expect 6 but see ${arr.length}'); - return PasswordManagerMeta( - cdat: dco_decode_CastedPrimitive_u_64(arr[0]), - mdat: dco_decode_CastedPrimitive_u_64(arr[1]), - srvr: dco_decode_String(arr[2]), - acct: dco_decode_String(arr[3]), - agrp: dco_decode_String(arr[4]), - data: dco_decode_list_prim_u_8_strict(arr[5]), - ); + return raw == null + ? null + : dco_decode_box_autoadd_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerLocationReport( + raw, + ); } @protected - PasswordManagerMetaChange dco_decode_password_manager_meta_change( - dynamic raw) { + NsArrayLpIconMetadata? + dco_decode_opt_box_autoadd_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerNSArrayLPIconMetadata( + dynamic raw, + ) { // Codec=Dco (DartCObject based), see doc to use other codecs - final arr = raw as List; - if (arr.length != 8) - throw Exception('unexpected arr length: expect 8 but see ${arr.length}'); - return PasswordManagerMetaChange( - date: dco_decode_CastedPrimitive_u_64(arr[0]), - password: dco_decode_opt_String(arr[1]), - oldPassword: dco_decode_opt_String(arr[2]), - groupName: dco_decode_opt_String(arr[3]), - groupId: dco_decode_opt_String(arr[4]), - shareType: dco_decode_opt_String(arr[5]), - id: dco_decode_String(arr[6]), - typ: dco_decode_String(arr[7]), - ); + return raw == null + ? null + : dco_decode_box_autoadd_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerNSArrayLPIconMetadata( + raw, + ); } @protected - PasswordManagerMetaData dco_decode_password_manager_meta_data(dynamic raw) { + NsArrayLpImageMetadata? + dco_decode_opt_box_autoadd_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerNSArrayLPImageMetadata( + dynamic raw, + ) { // Codec=Dco (DartCObject based), see doc to use other codecs - final arr = raw as List; - if (arr.length != 8) - throw Exception('unexpected arr length: expect 8 but see ${arr.length}'); - return PasswordManagerMetaData( - history: dco_decode_list_password_manager_meta_change(arr[0]), - altDomains: dco_decode_list_password_manager_alt_domain(arr[1]), - totp: dco_decode_opt_box_autoadd_password_manager_totp(arr[2]), - ctxt: dco_decode_Map_String_password_manager_meta_data_ctx(arr[3]), - title: dco_decode_opt_list_prim_u_8_strict(arr[4]), - notes: dco_decode_opt_list_prim_u_8_strict(arr[5]), - formerlyShared: - dco_decode_opt_box_autoadd_password_manager_meta_data_formerly_shared( - arr[6]), - ocpid: dco_decode_opt_list_prim_u_8_strict(arr[7]), - ); + return raw == null + ? null + : dco_decode_box_autoadd_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerNSArrayLPImageMetadata( + raw, + ); } @protected - PasswordManagerMetaDataCtx dco_decode_password_manager_meta_data_ctx( - dynamic raw) { + PushError? + dco_decode_opt_box_autoadd_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerPushError( + dynamic raw, + ) { // Codec=Dco (DartCObject based), see doc to use other codecs - final arr = raw as List; - if (arr.length != 1) - throw Exception('unexpected arr length: expect 1 but see ${arr.length}'); - return PasswordManagerMetaDataCtx( - lastUsed: dco_decode_f_64(arr[0]), - ); + return raw == null + ? null + : dco_decode_box_autoadd_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerPushError( + raw, + ); } @protected - PasswordManagerMetaDataFormerlyShared - dco_decode_password_manager_meta_data_formerly_shared(dynamic raw) { + SavedHardwareState? + dco_decode_opt_box_autoadd_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerSavedHardwareState( + dynamic raw, + ) { // Codec=Dco (DartCObject based), see doc to use other codecs - final arr = raw as List; - if (arr.length != 2) - throw Exception('unexpected arr length: expect 2 but see ${arr.length}'); - return PasswordManagerMetaDataFormerlyShared( - groupName: dco_decode_opt_String(arr[0]), - passwordManagerCredentialIdentifier: dco_decode_opt_String(arr[1]), - ); + return raw == null + ? null + : dco_decode_box_autoadd_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerSavedHardwareState( + raw, + ); } @protected - PasswordManagerTotp dco_decode_password_manager_totp(dynamic raw) { + SyncManagerDefaultAnisetteProviderMyFilePackager? + dco_decode_opt_box_autoadd_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerSyncManagerDefaultAnisetteProviderMyFilePackager( + dynamic raw, + ) { // Codec=Dco (DartCObject based), see doc to use other codecs - final arr = raw as List; - if (arr.length != 8) - throw Exception('unexpected arr length: expect 8 but see ${arr.length}'); - return PasswordManagerTotp( - secret: dco_decode_list_prim_u_8_strict(arr[0]), - digits: dco_decode_u_32(arr[1]), - issuer: dco_decode_opt_String(arr[2]), - period: dco_decode_u_32(arr[3]), - initialDate: dco_decode_CastedPrimitive_u_64(arr[4]), - algorithm: dco_decode_u_32(arr[5]), - accountName: dco_decode_opt_String(arr[6]), - originalUrl: dco_decode_opt_String(arr[7]), - ); + return raw == null + ? null + : dco_decode_box_autoadd_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerSyncManagerDefaultAnisetteProviderMyFilePackager( + raw, + ); } @protected - PasswordRawEntry dco_decode_password_raw_entry(dynamic raw) { + SystemTime? + dco_decode_opt_box_autoadd_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerSystemTime( + dynamic raw, + ) { // Codec=Dco (DartCObject based), see doc to use other codecs - final arr = raw as List; - if (arr.length != 6) - throw Exception('unexpected arr length: expect 6 but see ${arr.length}'); - return PasswordRawEntry( - cdat: dco_decode_CastedPrimitive_u_64(arr[0]), - mdat: dco_decode_CastedPrimitive_u_64(arr[1]), - srvr: dco_decode_String(arr[2]), - acct: dco_decode_String(arr[3]), - agrp: dco_decode_String(arr[4]), - data: dco_decode_list_prim_u_8_strict(arr[5]), - ); + return raw == null + ? null + : dco_decode_box_autoadd_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerSystemTime( + raw, + ); } @protected - PermanentDeleteMessage dco_decode_permanent_delete_message(dynamic raw) { + Address? dco_decode_opt_box_autoadd_address(dynamic raw) { // Codec=Dco (DartCObject based), see doc to use other codecs - final arr = raw as List; - if (arr.length != 2) - throw Exception('unexpected arr length: expect 2 but see ${arr.length}'); - return PermanentDeleteMessage( - target: dco_decode_delete_target(arr[0]), - isScheduled: dco_decode_bool(arr[1]), - ); + return raw == null ? null : dco_decode_box_autoadd_address(raw); } @protected - PhotoPosterContents dco_decode_photo_poster_contents(dynamic raw) { + Attachment? dco_decode_opt_box_autoadd_attachment(dynamic raw) { // Codec=Dco (DartCObject based), see doc to use other codecs - final arr = raw as List; - if (arr.length != 3) - throw Exception('unexpected arr length: expect 3 but see ${arr.length}'); - return PhotoPosterContents( - version: dco_decode_u_32(arr[0]), - layers: dco_decode_list_photo_poster_layer(arr[1]), - properties: dco_decode_photo_poster_properties(arr[2]), - ); + return raw == null ? null : dco_decode_box_autoadd_attachment(raw); } @protected - PhotoPosterContentsFrame dco_decode_photo_poster_contents_frame(dynamic raw) { + AttachmentMetaExtra? dco_decode_opt_box_autoadd_attachment_meta_extra( + dynamic raw, + ) { // Codec=Dco (DartCObject based), see doc to use other codecs - final arr = raw as List; - if (arr.length != 4) - throw Exception('unexpected arr length: expect 4 but see ${arr.length}'); - return PhotoPosterContentsFrame( - width: dco_decode_f_64(arr[0]), - height: dco_decode_f_64(arr[1]), - x: dco_decode_f_64(arr[2]), - y: dco_decode_f_64(arr[3]), - ); + return raw == null + ? null + : dco_decode_box_autoadd_attachment_meta_extra(raw); } @protected - PhotoPosterContentsSize dco_decode_photo_poster_contents_size(dynamic raw) { + Balloon? dco_decode_opt_box_autoadd_balloon(dynamic raw) { // Codec=Dco (DartCObject based), see doc to use other codecs - final arr = raw as List; - if (arr.length != 2) - throw Exception('unexpected arr length: expect 2 but see ${arr.length}'); - return PhotoPosterContentsSize( - width: dco_decode_f_64(arr[0]), - height: dco_decode_f_64(arr[1]), - ); + return raw == null ? null : dco_decode_box_autoadd_balloon(raw); } @protected - PhotoPosterLayer dco_decode_photo_poster_layer(dynamic raw) { + BalloonLayout? dco_decode_opt_box_autoadd_balloon_layout(dynamic raw) { // Codec=Dco (DartCObject based), see doc to use other codecs - final arr = raw as List; - if (arr.length != 4) - throw Exception('unexpected arr length: expect 4 but see ${arr.length}'); - return PhotoPosterLayer( - frame: dco_decode_photo_poster_contents_frame(arr[0]), - filename: dco_decode_String(arr[1]), - zPosition: dco_decode_f_32(arr[2]), - identifier: dco_decode_String(arr[3]), - ); + return raw == null ? null : dco_decode_box_autoadd_balloon_layout(raw); } @protected - PhotoPosterLayout dco_decode_photo_poster_layout(dynamic raw) { + bool? dco_decode_opt_box_autoadd_bool(dynamic raw) { // Codec=Dco (DartCObject based), see doc to use other codecs - final arr = raw as List; - if (arr.length != 9) - throw Exception('unexpected arr length: expect 9 but see ${arr.length}'); - return PhotoPosterLayout( - clockIntersection: dco_decode_u_32(arr[0]), - deviceResolution: dco_decode_photo_poster_contents_size(arr[1]), - visibleFrame: dco_decode_photo_poster_contents_frame(arr[2]), - timeFrame: dco_decode_photo_poster_contents_frame(arr[3]), - clockLayerOrder: dco_decode_String(arr[4]), - hasTopEdgeContact: dco_decode_bool(arr[5]), - inactiveFrame: dco_decode_photo_poster_contents_frame(arr[6]), - imageSize: dco_decode_photo_poster_contents_size(arr[7]), - parallaxPadding: dco_decode_photo_poster_contents_size(arr[8]), - ); + return raw == null ? null : dco_decode_box_autoadd_bool(raw); } @protected - PhotoPosterProperties dco_decode_photo_poster_properties(dynamic raw) { + CertifiedContext? dco_decode_opt_box_autoadd_certified_context(dynamic raw) { // Codec=Dco (DartCObject based), see doc to use other codecs - final arr = raw as List; - if (arr.length != 5) - throw Exception('unexpected arr length: expect 5 but see ${arr.length}'); - return PhotoPosterProperties( - portraitLayout: dco_decode_photo_poster_layout(arr[0]), - settlingEffectEnabled: dco_decode_bool(arr[1]), - depthEnabled: dco_decode_bool(arr[2]), - clockAreaLuminance: dco_decode_f_64(arr[3]), - parallaxDisabled: dco_decode_bool(arr[4]), - ); + return raw == null ? null : dco_decode_box_autoadd_certified_context(raw); } @protected - PollResult dco_decode_poll_result(dynamic raw) { + CloudAttachment? dco_decode_opt_box_autoadd_cloud_attachment(dynamic raw) { // Codec=Dco (DartCObject based), see doc to use other codecs - switch (raw[0]) { - case 0: - return PollResult_Stop(); - case 1: - return PollResult_Cont( - dco_decode_opt_box_autoadd_push_message(raw[1]), - ); - default: - throw Exception("unreachable"); - } + return raw == null ? null : dco_decode_box_autoadd_cloud_attachment(raw); } @protected - PosterAsset dco_decode_poster_asset(dynamic raw) { + CloudChat? dco_decode_opt_box_autoadd_cloud_chat(dynamic raw) { // Codec=Dco (DartCObject based), see doc to use other codecs - final arr = raw as List; - if (arr.length != 3) - throw Exception('unexpected arr length: expect 3 but see ${arr.length}'); - return PosterAsset( - contents: dco_decode_photo_poster_contents(arr[0]), - files: dco_decode_Map_String_list_prim_u_8_strict(arr[1]), - uuid: dco_decode_String(arr[2]), - ); + return raw == null ? null : dco_decode_box_autoadd_cloud_chat(raw); } @protected - PosterColor dco_decode_poster_color(dynamic raw) { + CloudMessage? dco_decode_opt_box_autoadd_cloud_message(dynamic raw) { // Codec=Dco (DartCObject based), see doc to use other codecs - final arr = raw as List; - if (arr.length != 4) - throw Exception('unexpected arr length: expect 4 but see ${arr.length}'); - return PosterColor( - alpha: dco_decode_f_64(arr[0]), - blue: dco_decode_f_64(arr[1]), - green: dco_decode_f_64(arr[2]), - red: dco_decode_f_64(arr[3]), - ); + return raw == null ? null : dco_decode_box_autoadd_cloud_message(raw); } @protected - PosterRole dco_decode_poster_role(dynamic raw) { + CloudProp? dco_decode_opt_box_autoadd_cloud_prop(dynamic raw) { // Codec=Dco (DartCObject based), see doc to use other codecs - return PosterRole.values[raw as int]; + return raw == null ? null : dco_decode_box_autoadd_cloud_prop(raw); } @protected - PosterType dco_decode_poster_type(dynamic raw) { + CloudSyncOutboundFailureClass? + dco_decode_opt_box_autoadd_cloud_sync_outbound_failure_class(dynamic raw) { // Codec=Dco (DartCObject based), see doc to use other codecs - switch (raw[0]) { - case 0: - return PosterType_Photo( - assets: dco_decode_list_poster_asset(raw[1]), - ); - case 1: - return PosterType_Monogram( - data: dco_decode_box_autoadd_monogram_data(raw[1]), - background: dco_decode_box_autoadd_poster_color(raw[2]), - ); - case 2: - return PosterType_Memoji( - data: dco_decode_box_autoadd_memoji_data(raw[1]), - background: dco_decode_box_autoadd_poster_color(raw[2]), - ); - case 3: - return PosterType_TranscriptDynamic( - data: dco_decode_box_autoadd_transcript_dynamic_user_data(raw[1]), - ); - case 4: - return PosterType_TranscriptGradient( - colors: dco_decode_list_poster_color(raw[1]), - ); - default: - throw Exception("unreachable"); - } + return raw == null + ? null + : dco_decode_box_autoadd_cloud_sync_outbound_failure_class(raw); } @protected - PRPosterColor dco_decode_pr_poster_color(dynamic raw) { + CloudSyncOutboundReconcileDisposition? + dco_decode_opt_box_autoadd_cloud_sync_outbound_reconcile_disposition( + dynamic raw, + ) { // Codec=Dco (DartCObject based), see doc to use other codecs - final arr = raw as List; - if (arr.length != 4) - throw Exception('unexpected arr length: expect 4 but see ${arr.length}'); - return PRPosterColor( - preferredStyle: dco_decode_u_32(arr[0]), - identifier: dco_decode_String(arr[1]), - suggested: dco_decode_bool(arr[2]), - color: dco_decode_ui_color(arr[3]), - ); + return raw == null + ? null + : dco_decode_box_autoadd_cloud_sync_outbound_reconcile_disposition(raw); } @protected - PRPosterContentMaterialStyle dco_decode_pr_poster_content_material_style( - dynamic raw) { + CloudSyncOutboundSafeCode? + dco_decode_opt_box_autoadd_cloud_sync_outbound_safe_code(dynamic raw) { // Codec=Dco (DartCObject based), see doc to use other codecs - switch (raw[0]) { - case 0: - return PRPosterContentMaterialStyle_PRPosterContentDiscreteColorsStyle( - variation: dco_decode_f_32(raw[1]), - colors: dco_decode_list_ui_color(raw[2]), - vibrant: dco_decode_bool(raw[3]), - supportsVariation: dco_decode_bool(raw[4]), - needsToResolveVariation: dco_decode_bool(raw[5]), - ); - case 1: - return PRPosterContentMaterialStyle_PRPosterContentVibrantMaterialStyle(); - case 2: - return PRPosterContentMaterialStyle_PRPosterContentGradientStyle( - gradientType: dco_decode_u_32(raw[1]), - colors: dco_decode_list_ui_color(raw[2]), - startPoint: dco_decode_String(raw[3]), - locations: dco_decode_list_prim_f_64_strict(raw[4]), - endPoint: dco_decode_String(raw[5]), - ); - default: - throw Exception("unreachable"); - } + return raw == null + ? null + : dco_decode_box_autoadd_cloud_sync_outbound_safe_code(raw); } @protected - PRPosterSystemTimeFontConfiguration - dco_decode_pr_poster_system_time_font_configuration(dynamic raw) { + CloudSyncProtectedFailure? + dco_decode_opt_box_autoadd_cloud_sync_protected_failure(dynamic raw) { // Codec=Dco (DartCObject based), see doc to use other codecs - final arr = raw as List; - if (arr.length != 3) - throw Exception('unexpected arr length: expect 3 but see ${arr.length}'); - return PRPosterSystemTimeFontConfiguration( - isSystemItem: dco_decode_bool(arr[0]), - timeFontIdentifier: dco_decode_String(arr[1]), - weight: dco_decode_f_64(arr[2]), - ); + return raw == null + ? null + : dco_decode_box_autoadd_cloud_sync_protected_failure(raw); } @protected - PRPosterTitleStyleConfiguration - dco_decode_pr_poster_title_style_configuration(dynamic raw) { + CloudSyncProtectedGarbageCollection? + dco_decode_opt_box_autoadd_cloud_sync_protected_garbage_collection( + dynamic raw, + ) { // Codec=Dco (DartCObject based), see doc to use other codecs - final arr = raw as List; - if (arr.length != 11) - throw Exception('unexpected arr length: expect 11 but see ${arr.length}'); - return PRPosterTitleStyleConfiguration( - alternateDateEnabled: dco_decode_bool(arr[0]), - contentsLuminence: dco_decode_f_64(arr[1]), - groupName: dco_decode_String(arr[2]), - preferredTitleAlignment: dco_decode_u_32(arr[3]), - preferredTitleLayout: dco_decode_u_32(arr[4]), - timeFontConfiguration: - dco_decode_pr_poster_system_time_font_configuration(arr[5]), - timeNumberingSystem: dco_decode_opt_list_prim_u_8_strict(arr[6]), - titleColor: dco_decode_pr_poster_color(arr[7]), - titleContentStyle: dco_decode_list_prim_u_8_strict(arr[8]), - userConfigured: dco_decode_bool(arr[9]), - titleStyle: - dco_decode_opt_box_autoadd_pr_poster_content_material_style(arr[10]), - ); + return raw == null + ? null + : dco_decode_box_autoadd_cloud_sync_protected_garbage_collection(raw); } @protected - PrivateDeviceInfo dco_decode_private_device_info(dynamic raw) { + CloudSyncProtectedOutboundStage? + dco_decode_opt_box_autoadd_cloud_sync_protected_outbound_stage(dynamic raw) { // Codec=Dco (DartCObject based), see doc to use other codecs - final arr = raw as List; - if (arr.length != 6) - throw Exception('unexpected arr length: expect 6 but see ${arr.length}'); - return PrivateDeviceInfo( - uuid: dco_decode_opt_String(arr[0]), - deviceName: dco_decode_opt_String(arr[1]), - token: dco_decode_list_prim_u_8_strict(arr[2]), - isHsaTrusted: dco_decode_bool(arr[3]), - identites: dco_decode_list_String(arr[4]), - subServices: dco_decode_list_String(arr[5]), - ); + return raw == null + ? null + : dco_decode_box_autoadd_cloud_sync_protected_outbound_stage(raw); } @protected - ProvisionedFlavor dco_decode_provisioned_flavor(dynamic raw) { + CloudSyncProtectedPage? dco_decode_opt_box_autoadd_cloud_sync_protected_page( + dynamic raw, + ) { // Codec=Dco (DartCObject based), see doc to use other codecs - return ProvisionedFlavor.values[raw as int]; + return raw == null + ? null + : dco_decode_box_autoadd_cloud_sync_protected_page(raw); } @protected - PushMessage dco_decode_push_message(dynamic raw) { + CloudSyncProtectedPreflightCode? + dco_decode_opt_box_autoadd_cloud_sync_protected_preflight_code(dynamic raw) { // Codec=Dco (DartCObject based), see doc to use other codecs - switch (raw[0]) { - case 0: - return PushMessage_IMessage( - dco_decode_box_autoadd_message_inst(raw[1]), - ); - case 1: - return PushMessage_SendConfirm( - uuid: dco_decode_String(raw[1]), - error: dco_decode_opt_String(raw[2]), - ); - case 2: - return PushMessage_RegistrationState( - dco_decode_box_autoadd_register_state(raw[1]), - ); - case 3: - return PushMessage_NewPhotostream( - dco_decode_box_autoadd_shared_album(raw[1]), - ); - case 4: - return PushMessage_FaceTime( - dco_decode_box_autoadd_ft_message(raw[1]), - ); - case 5: - return PushMessage_StatusUpdate( - dco_decode_box_autoadd_status_kit_message(raw[1]), - ); - case 6: - return PushMessage_Idms( - dco_decode_box_autoadd_idms_message(raw[1]), - ); - case 7: - return PushMessage_TwoFaAuthEvent( - dco_decode_bool(raw[1]), - ); - case 8: - return PushMessage_CircleFinishEvent(); - case 9: - return PushMessage_BeaconShared( - sender: dco_decode_String(raw[1]), - beacon: dco_decode_String(raw[2]), - attributes: dco_decode_box_autoadd_beacon_attributes(raw[3]), - ); - default: - throw Exception("unreachable"); - } + return raw == null + ? null + : dco_decode_box_autoadd_cloud_sync_protected_preflight_code(raw); } @protected - QuotaInfo dco_decode_quota_info(dynamic raw) { + CloudSyncProtectedRecovery? + dco_decode_opt_box_autoadd_cloud_sync_protected_recovery(dynamic raw) { // Codec=Dco (DartCObject based), see doc to use other codecs - final arr = raw as List; - if (arr.length != 3) - throw Exception('unexpected arr length: expect 3 but see ${arr.length}'); - return QuotaInfo( - totalBytes: dco_decode_CastedPrimitive_u_64(arr[0]), - availableBytes: dco_decode_CastedPrimitive_u_64(arr[1]), - messagesBytes: dco_decode_CastedPrimitive_u_64(arr[2]), - ); + return raw == null + ? null + : dco_decode_box_autoadd_cloud_sync_protected_recovery(raw); } @protected - ReactMessage dco_decode_react_message(dynamic raw) { + CloudSyncRawFailure? dco_decode_opt_box_autoadd_cloud_sync_raw_failure( + dynamic raw, + ) { // Codec=Dco (DartCObject based), see doc to use other codecs - final arr = raw as List; - if (arr.length != 5) - throw Exception('unexpected arr length: expect 5 but see ${arr.length}'); - return ReactMessage( - toUuid: dco_decode_String(arr[0]), - toPart: dco_decode_opt_CastedPrimitive_u_64(arr[1]), - reaction: dco_decode_react_message_type(arr[2]), - toText: dco_decode_String(arr[3]), - embeddedProfile: dco_decode_opt_box_autoadd_share_profile_message(arr[4]), - ); + return raw == null + ? null + : dco_decode_box_autoadd_cloud_sync_raw_failure(raw); } @protected - ReactMessageType dco_decode_react_message_type(dynamic raw) { + CloudSyncRawPage? dco_decode_opt_box_autoadd_cloud_sync_raw_page( + dynamic raw, + ) { // Codec=Dco (DartCObject based), see doc to use other codecs - switch (raw[0]) { - case 0: - return ReactMessageType_React( - reaction: dco_decode_box_autoadd_reaction(raw[1]), - enable: dco_decode_bool(raw[2]), - ); - case 1: - return ReactMessageType_Extension( - spec: dco_decode_box_autoadd_extension_app(raw[1]), - body: dco_decode_box_autoadd_message_parts(raw[2]), - isMeta: dco_decode_bool(raw[3]), - ); - default: - throw Exception("unreachable"); - } + return raw == null ? null : dco_decode_box_autoadd_cloud_sync_raw_page(raw); } @protected - Reaction dco_decode_reaction(dynamic raw) { + CloudSyncRawSystemFields? + dco_decode_opt_box_autoadd_cloud_sync_raw_system_fields(dynamic raw) { // Codec=Dco (DartCObject based), see doc to use other codecs - switch (raw[0]) { - case 0: - return Reaction_Heart(); - case 1: - return Reaction_Like(); - case 2: - return Reaction_Dislike(); - case 3: - return Reaction_Laugh(); - case 4: - return Reaction_Emphasize(); - case 5: - return Reaction_Question(); - case 6: - return Reaction_Emoji( - dco_decode_String(raw[1]), - ); - case 7: - return Reaction_Sticker( - spec: dco_decode_opt_box_autoadd_extension_app(raw[1]), - body: dco_decode_box_autoadd_message_parts(raw[2]), - ); - default: - throw Exception("unreachable"); - } + return raw == null + ? null + : dco_decode_box_autoadd_cloud_sync_raw_system_fields(raw); } @protected - ( - ApsConnection, - PushError? - ) dco_decode_record_auto_owned_rust_opaque_flutter_rust_bridgefor_generated_rust_auto_opaque_inner_aps_connection_opt_box_autoadd_auto_owned_rust_opaque_flutter_rust_bridgefor_generated_rust_auto_opaque_inner_push_error( - dynamic raw) { + CloudSyncTransientAttachmentPayload? + dco_decode_opt_box_autoadd_cloud_sync_transient_attachment_payload( + dynamic raw, + ) { // Codec=Dco (DartCObject based), see doc to use other codecs - final arr = raw as List; - if (arr.length != 2) { - throw Exception('Expected 2 elements, got ${arr.length}'); - } - return ( - dco_decode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerAPSConnection( - arr[0]), - dco_decode_opt_box_autoadd_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerPushError( - arr[1]), - ); + return raw == null + ? null + : dco_decode_box_autoadd_cloud_sync_transient_attachment_payload(raw); } @protected - ( - ArcMutexAppleAccountDefaultAnisetteProvider, - LoginState - ) dco_decode_record_auto_owned_rust_opaque_flutter_rust_bridgefor_generated_rust_auto_opaque_inner_arc_mutex_apple_account_default_anisette_provider_login_state( - dynamic raw) { + CloudSyncTransientChatPayload? + dco_decode_opt_box_autoadd_cloud_sync_transient_chat_payload(dynamic raw) { // Codec=Dco (DartCObject based), see doc to use other codecs - final arr = raw as List; - if (arr.length != 2) { - throw Exception('Expected 2 elements, got ${arr.length}'); - } - return ( - dco_decode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcMutexAppleAccountDefaultAnisetteProvider( - arr[0]), - dco_decode_login_state(arr[1]), - ); + return raw == null + ? null + : dco_decode_box_autoadd_cloud_sync_transient_chat_payload(raw); } @protected - ( - ArcSharedPushState, - SharedPushState - ) dco_decode_record_auto_owned_rust_opaque_flutter_rust_bridgefor_generated_rust_auto_opaque_inner_arc_shared_push_state_shared_push_state( - dynamic raw) { + CloudSyncTransientDeferredReason? + dco_decode_opt_box_autoadd_cloud_sync_transient_deferred_reason(dynamic raw) { // Codec=Dco (DartCObject based), see doc to use other codecs - final arr = raw as List; - if (arr.length != 2) { - throw Exception('Expected 2 elements, got ${arr.length}'); - } - return ( - dco_decode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcSharedPushState( - arr[0]), - dco_decode_shared_push_state(arr[1]), - ); + return raw == null + ? null + : dco_decode_box_autoadd_cloud_sync_transient_deferred_reason(raw); } @protected - ( - CircleClientSessionDefaultAnisetteProvider, - LoginState, - String? - ) dco_decode_record_auto_owned_rust_opaque_flutter_rust_bridgefor_generated_rust_auto_opaque_inner_circle_client_session_default_anisette_provider_login_state_opt_string( - dynamic raw) { + CloudSyncTransientEntityKind? + dco_decode_opt_box_autoadd_cloud_sync_transient_entity_kind(dynamic raw) { // Codec=Dco (DartCObject based), see doc to use other codecs - final arr = raw as List; - if (arr.length != 3) { - throw Exception('Expected 3 elements, got ${arr.length}'); - } - return ( - dco_decode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerCircleClientSessionDefaultAnisetteProvider( - arr[0]), - dco_decode_login_state(arr[1]), - dco_decode_opt_String(arr[2]), - ); + return raw == null + ? null + : dco_decode_box_autoadd_cloud_sync_transient_entity_kind(raw); } @protected - ( - Sender, - ArcSenderPushMessage, - ApsWatcher - ) dco_decode_record_auto_owned_rust_opaque_flutter_rust_bridgefor_generated_rust_auto_opaque_inner_sender_auto_owned_rust_opaque_flutter_rust_bridgefor_generated_rust_auto_opaque_inner_arc_sender_push_message_auto_owned_rust_opaque_flutter_rust_bridgefor_generated_rust_auto_opaque_inner_aps_watcher( - dynamic raw) { + CloudSyncTransientFailureCode? + dco_decode_opt_box_autoadd_cloud_sync_transient_failure_code(dynamic raw) { // Codec=Dco (DartCObject based), see doc to use other codecs - final arr = raw as List; - if (arr.length != 3) { - throw Exception('Expected 3 elements, got ${arr.length}'); - } - return ( - dco_decode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerSender( - arr[0]), - dco_decode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcSenderPushMessage( - arr[1]), - dco_decode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerAPSWatcher( - arr[2]), - ); + return raw == null + ? null + : dco_decode_box_autoadd_cloud_sync_transient_failure_code(raw); } @protected - ( - Uint8List, - Map, - int - ) dco_decode_record_list_prim_u_8_strict_map_string_opt_box_autoadd_cloud_attachment_i_32( - dynamic raw) { + CloudSyncTransientGroupPhotoPayload? + dco_decode_opt_box_autoadd_cloud_sync_transient_group_photo_payload( + dynamic raw, + ) { // Codec=Dco (DartCObject based), see doc to use other codecs - final arr = raw as List; - if (arr.length != 3) { - throw Exception('Expected 3 elements, got ${arr.length}'); - } - return ( - dco_decode_list_prim_u_8_strict(arr[0]), - dco_decode_Map_String_opt_box_autoadd_cloud_attachment(arr[1]), - dco_decode_i_32(arr[2]), - ); + return raw == null + ? null + : dco_decode_box_autoadd_cloud_sync_transient_group_photo_payload(raw); } @protected - ( - Uint8List, - Map, - int - ) dco_decode_record_list_prim_u_8_strict_map_string_opt_box_autoadd_cloud_chat_i_32( - dynamic raw) { + CloudSyncTransientMessagePayload? + dco_decode_opt_box_autoadd_cloud_sync_transient_message_payload(dynamic raw) { // Codec=Dco (DartCObject based), see doc to use other codecs - final arr = raw as List; - if (arr.length != 3) { - throw Exception('Expected 3 elements, got ${arr.length}'); - } - return ( - dco_decode_list_prim_u_8_strict(arr[0]), - dco_decode_Map_String_opt_box_autoadd_cloud_chat(arr[1]), - dco_decode_i_32(arr[2]), - ); + return raw == null + ? null + : dco_decode_box_autoadd_cloud_sync_transient_message_payload(raw); } @protected - ( - Uint8List, - Map, - int - ) dco_decode_record_list_prim_u_8_strict_map_string_opt_box_autoadd_cloud_message_i_32( - dynamic raw) { + CloudSyncTransientMutationKind? + dco_decode_opt_box_autoadd_cloud_sync_transient_mutation_kind(dynamic raw) { // Codec=Dco (DartCObject based), see doc to use other codecs - final arr = raw as List; - if (arr.length != 3) { - throw Exception('Expected 3 elements, got ${arr.length}'); - } - return ( - dco_decode_list_prim_u_8_strict(arr[0]), - dco_decode_Map_String_opt_box_autoadd_cloud_message(arr[1]), - dco_decode_i_32(arr[2]), - ); + return raw == null + ? null + : dco_decode_box_autoadd_cloud_sync_transient_mutation_kind(raw); } @protected - (Uint8List, Uint8List?) - dco_decode_record_list_prim_u_8_strict_opt_list_prim_u_8_strict( - dynamic raw) { + CloudSyncTransientPayload? + dco_decode_opt_box_autoadd_cloud_sync_transient_payload(dynamic raw) { // Codec=Dco (DartCObject based), see doc to use other codecs - final arr = raw as List; - if (arr.length != 2) { - throw Exception('Expected 2 elements, got ${arr.length}'); - } - return ( - dco_decode_list_prim_u_8_strict(arr[0]), - dco_decode_opt_list_prim_u_8_strict(arr[1]), - ); + return raw == null + ? null + : dco_decode_box_autoadd_cloud_sync_transient_payload(raw); } @protected - (List, List) - dco_decode_record_list_shared_album_list_string(dynamic raw) { + CloudSyncTransientQuarantineReason? + dco_decode_opt_box_autoadd_cloud_sync_transient_quarantine_reason( + dynamic raw, + ) { // Codec=Dco (DartCObject based), see doc to use other codecs - final arr = raw as List; - if (arr.length != 2) { - throw Exception('Expected 2 elements, got ${arr.length}'); - } - return ( - dco_decode_list_shared_album(arr[0]), - dco_decode_list_String(arr[1]), - ); + return raw == null + ? null + : dco_decode_box_autoadd_cloud_sync_transient_quarantine_reason(raw); } @protected - (List, LoginState?) - dco_decode_record_list_trusted_phone_number_opt_box_autoadd_login_state( - dynamic raw) { + CloudSyncTransientReactionKind? + dco_decode_opt_box_autoadd_cloud_sync_transient_reaction_kind(dynamic raw) { // Codec=Dco (DartCObject based), see doc to use other codecs - final arr = raw as List; - if (arr.length != 2) { - throw Exception('Expected 2 elements, got ${arr.length}'); - } - return ( - dco_decode_list_trusted_phone_number(arr[0]), - dco_decode_opt_box_autoadd_login_state(arr[1]), - ); + return raw == null + ? null + : dco_decode_box_autoadd_cloud_sync_transient_reaction_kind(raw); } @protected - ( - LoginState, - IdsUser? - ) dco_decode_record_login_state_opt_box_autoadd_auto_owned_rust_opaque_flutter_rust_bridgefor_generated_rust_auto_opaque_inner_ids_user( - dynamic raw) { + CloudSyncTransientSnapshot? + dco_decode_opt_box_autoadd_cloud_sync_transient_snapshot(dynamic raw) { // Codec=Dco (DartCObject based), see doc to use other codecs - final arr = raw as List; - if (arr.length != 2) { - throw Exception('Expected 2 elements, got ${arr.length}'); - } - return ( - dco_decode_login_state(arr[0]), - dco_decode_opt_box_autoadd_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerIDSUser( - arr[1]), - ); + return raw == null + ? null + : dco_decode_box_autoadd_cloud_sync_transient_snapshot(raw); } @protected - ( - Map, - (String, BigInt)? - ) dco_decode_record_map_string_sync_status_opt_box_autoadd_record_string_u_64( - dynamic raw) { + CloudSyncTransientTombstone? + dco_decode_opt_box_autoadd_cloud_sync_transient_tombstone(dynamic raw) { // Codec=Dco (DartCObject based), see doc to use other codecs - final arr = raw as List; - if (arr.length != 2) { - throw Exception('Expected 2 elements, got ${arr.length}'); - } - return ( - dco_decode_Map_String_sync_status(arr[0]), - dco_decode_opt_box_autoadd_record_string_u_64(arr[1]), - ); + return raw == null + ? null + : dco_decode_box_autoadd_cloud_sync_transient_tombstone(raw); } @protected - ( - List?, - SupportAlert? - ) dco_decode_record_opt_list_auto_owned_rust_opaque_flutter_rust_bridgefor_generated_rust_auto_opaque_inner_ids_user_opt_box_autoadd_support_alert( - dynamic raw) { + ConversationData? dco_decode_opt_box_autoadd_conversation_data(dynamic raw) { // Codec=Dco (DartCObject based), see doc to use other codecs - final arr = raw as List; - if (arr.length != 2) { - throw Exception('Expected 2 elements, got ${arr.length}'); - } - return ( - dco_decode_opt_list_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerIDSUser( - arr[0]), - dco_decode_opt_box_autoadd_support_alert(arr[1]), - ); + return raw == null ? null : dco_decode_box_autoadd_conversation_data(raw); } @protected - (String?, Passkey) dco_decode_record_opt_string_passkey(dynamic raw) { + DartBeaconShareInfo? dco_decode_opt_box_autoadd_dart_beacon_share_info( + dynamic raw, + ) { // Codec=Dco (DartCObject based), see doc to use other codecs - final arr = raw as List; - if (arr.length != 2) { - throw Exception('Expected 2 elements, got ${arr.length}'); - } - return ( - dco_decode_opt_String(arr[0]), - dco_decode_passkey(arr[1]), - ); + return raw == null + ? null + : dco_decode_box_autoadd_dart_beacon_share_info(raw); } @protected - (String?, PasswordManagerMeta) - dco_decode_record_opt_string_password_manager_meta(dynamic raw) { + ExtensionApp? dco_decode_opt_box_autoadd_extension_app(dynamic raw) { // Codec=Dco (DartCObject based), see doc to use other codecs - final arr = raw as List; - if (arr.length != 2) { - throw Exception('Expected 2 elements, got ${arr.length}'); - } - return ( - dco_decode_opt_String(arr[0]), - dco_decode_password_manager_meta(arr[1]), - ); + return raw == null ? null : dco_decode_box_autoadd_extension_app(raw); } @protected - (String?, PasswordRawEntry) dco_decode_record_opt_string_password_raw_entry( - dynamic raw) { + double? dco_decode_opt_box_autoadd_f_64(dynamic raw) { // Codec=Dco (DartCObject based), see doc to use other codecs - final arr = raw as List; - if (arr.length != 2) { - throw Exception('Expected 2 elements, got ${arr.length}'); - } - return ( - dco_decode_opt_String(arr[0]), - dco_decode_password_raw_entry(arr[1]), - ); + return raw == null ? null : dco_decode_box_autoadd_f_64(raw); } @protected - (String?, WifiPassword) dco_decode_record_opt_string_wifi_password( - dynamic raw) { + FTMode? dco_decode_opt_box_autoadd_ft_mode(dynamic raw) { // Codec=Dco (DartCObject based), see doc to use other codecs - final arr = raw as List; - if (arr.length != 2) { - throw Exception('Expected 2 elements, got ${arr.length}'); - } - return ( - dco_decode_opt_String(arr[0]), - dco_decode_wifi_password(arr[1]), - ); + return raw == null ? null : dco_decode_box_autoadd_ft_mode(raw); } @protected - ( - SharedPushState, - ApsWatcher - ) dco_decode_record_shared_push_state_auto_owned_rust_opaque_flutter_rust_bridgefor_generated_rust_auto_opaque_inner_aps_watcher( - dynamic raw) { + int? dco_decode_opt_box_autoadd_i_32(dynamic raw) { // Codec=Dco (DartCObject based), see doc to use other codecs - final arr = raw as List; - if (arr.length != 2) { - throw Exception('Expected 2 elements, got ${arr.length}'); - } - return ( - dco_decode_shared_push_state(arr[0]), - dco_decode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerAPSWatcher( - arr[1]), - ); + return raw == null ? null : dco_decode_box_autoadd_i_32(raw); } @protected - ( - String, - Asset - ) dco_decode_record_string_auto_owned_rust_opaque_flutter_rust_bridgefor_generated_rust_auto_opaque_inner_asset( - dynamic raw) { + PlatformInt64? dco_decode_opt_box_autoadd_i_64(dynamic raw) { // Codec=Dco (DartCObject based), see doc to use other codecs - final arr = raw as List; - if (arr.length != 2) { - throw Exception('Expected 2 elements, got ${arr.length}'); - } - return ( - dco_decode_String(arr[0]), - dco_decode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerAsset( - arr[1]), - ); + return raw == null ? null : dco_decode_box_autoadd_i_64(raw); } @protected - ( - String, - StCollapsedValue - ) dco_decode_record_string_auto_owned_rust_opaque_flutter_rust_bridgefor_generated_rust_auto_opaque_inner_st_collapsed_value( - dynamic raw) { + IMessagePosterRecord? dco_decode_opt_box_autoadd_i_message_poster_record( + dynamic raw, + ) { // Codec=Dco (DartCObject based), see doc to use other codecs - final arr = raw as List; - if (arr.length != 2) { - throw Exception('Expected 2 elements, got ${arr.length}'); - } - return ( - dco_decode_String(arr[0]), - dco_decode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerStCollapsedValue( - arr[1]), - ); + return raw == null + ? null + : dco_decode_box_autoadd_i_message_poster_record(raw); } @protected - (String, bool) dco_decode_record_string_bool(dynamic raw) { + IdmsRequestedSignIn? dco_decode_opt_box_autoadd_idms_requested_sign_in( + dynamic raw, + ) { // Codec=Dco (DartCObject based), see doc to use other codecs - final arr = raw as List; - if (arr.length != 2) { - throw Exception('Expected 2 elements, got ${arr.length}'); - } - return ( - dco_decode_String(arr[0]), - dco_decode_bool(arr[1]), - ); + return raw == null + ? null + : dco_decode_box_autoadd_idms_requested_sign_in(raw); } @protected - (String, int) dco_decode_record_string_casted_primitive_u_64(dynamic raw) { + LinkMeta? dco_decode_opt_box_autoadd_link_meta(dynamic raw) { // Codec=Dco (DartCObject based), see doc to use other codecs - final arr = raw as List; - if (arr.length != 2) { - throw Exception('Expected 2 elements, got ${arr.length}'); - } - return ( - dco_decode_String(arr[0]), - dco_decode_CastedPrimitive_u_64(arr[1]), - ); + return raw == null ? null : dco_decode_box_autoadd_link_meta(raw); } @protected - (String, CloudAttachment) dco_decode_record_string_cloud_attachment( - dynamic raw) { + Location? dco_decode_opt_box_autoadd_location(dynamic raw) { // Codec=Dco (DartCObject based), see doc to use other codecs - final arr = raw as List; - if (arr.length != 2) { - throw Exception('Expected 2 elements, got ${arr.length}'); - } - return ( - dco_decode_String(arr[0]), - dco_decode_cloud_attachment(arr[1]), - ); + return raw == null ? null : dco_decode_box_autoadd_location(raw); } @protected - (String, CloudChat) dco_decode_record_string_cloud_chat(dynamic raw) { + LoginState? dco_decode_opt_box_autoadd_login_state(dynamic raw) { // Codec=Dco (DartCObject based), see doc to use other codecs - final arr = raw as List; - if (arr.length != 2) { - throw Exception('Expected 2 elements, got ${arr.length}'); - } - return ( - dco_decode_String(arr[0]), - dco_decode_cloud_chat(arr[1]), - ); + return raw == null ? null : dco_decode_box_autoadd_login_state(raw); } @protected - (String, CloudMessage) dco_decode_record_string_cloud_message(dynamic raw) { + LPIconMetadata? dco_decode_opt_box_autoadd_lp_icon_metadata(dynamic raw) { // Codec=Dco (DartCObject based), see doc to use other codecs - final arr = raw as List; - if (arr.length != 2) { - throw Exception('Expected 2 elements, got ${arr.length}'); - } - return ( - dco_decode_String(arr[0]), - dco_decode_cloud_message(arr[1]), - ); + return raw == null ? null : dco_decode_box_autoadd_lp_icon_metadata(raw); } @protected - (String, FTParticipant) dco_decode_record_string_ft_participant(dynamic raw) { + LPImageMetadata? dco_decode_opt_box_autoadd_lp_image_metadata(dynamic raw) { // Codec=Dco (DartCObject based), see doc to use other codecs - final arr = raw as List; - if (arr.length != 2) { - throw Exception('Expected 2 elements, got ${arr.length}'); - } - return ( - dco_decode_String(arr[0]), - dco_decode_ft_participant(arr[1]), - ); + return raw == null ? null : dco_decode_box_autoadd_lp_image_metadata(raw); } @protected - (String, GroupSummary) dco_decode_record_string_group_summary(dynamic raw) { + LPSpecializationMetadata? + dco_decode_opt_box_autoadd_lp_specialization_metadata(dynamic raw) { // Codec=Dco (DartCObject based), see doc to use other codecs - final arr = raw as List; - if (arr.length != 2) { - throw Exception('Expected 2 elements, got ${arr.length}'); - } - return ( - dco_decode_String(arr[0]), - dco_decode_group_summary(arr[1]), - ); + return raw == null + ? null + : dco_decode_box_autoadd_lp_specialization_metadata(raw); } @protected - (String, List) dco_decode_record_string_list_message_edit( - dynamic raw) { + MMCSAttachmentMeta? dco_decode_opt_box_autoadd_mmcs_attachment_meta( + dynamic raw, + ) { // Codec=Dco (DartCObject based), see doc to use other codecs - final arr = raw as List; - if (arr.length != 2) { - throw Exception('Expected 2 elements, got ${arr.length}'); - } - return ( - dco_decode_String(arr[0]), - dco_decode_list_message_edit(arr[1]), - ); + return raw == null + ? null + : dco_decode_box_autoadd_mmcs_attachment_meta(raw); } @protected - (String, Uint8List) dco_decode_record_string_list_prim_u_8_strict( - dynamic raw) { + MMCSFile? dco_decode_opt_box_autoadd_mmcs_file(dynamic raw) { // Codec=Dco (DartCObject based), see doc to use other codecs - final arr = raw as List; - if (arr.length != 2) { - throw Exception('Expected 2 elements, got ${arr.length}'); - } - return ( - dco_decode_String(arr[0]), - dco_decode_list_prim_u_8_strict(arr[1]), - ); + return raw == null ? null : dco_decode_box_autoadd_mmcs_file(raw); } @protected - ( - String, - Map, - Map - ) dco_decode_record_string_map_string_group_summary_map_string_share_invite_content_data( - dynamic raw) { + NSURL? dco_decode_opt_box_autoadd_nsurl(dynamic raw) { // Codec=Dco (DartCObject based), see doc to use other codecs - final arr = raw as List; - if (arr.length != 3) { - throw Exception('Expected 3 elements, got ${arr.length}'); - } - return ( - dco_decode_String(arr[0]), - dco_decode_Map_String_group_summary(arr[1]), - dco_decode_Map_String_share_invite_content_data(arr[2]), - ); + return raw == null ? null : dco_decode_box_autoadd_nsurl(raw); } @protected - (String, MessageEditRange) dco_decode_record_string_message_edit_range( - dynamic raw) { + NumOrString? dco_decode_opt_box_autoadd_num_or_string(dynamic raw) { // Codec=Dco (DartCObject based), see doc to use other codecs - final arr = raw as List; - if (arr.length != 2) { - throw Exception('Expected 2 elements, got ${arr.length}'); - } - return ( - dco_decode_String(arr[0]), - dco_decode_message_edit_range(arr[1]), - ); + return raw == null ? null : dco_decode_box_autoadd_num_or_string(raw); } @protected - (String, CloudAttachment?) - dco_decode_record_string_opt_box_autoadd_cloud_attachment(dynamic raw) { + PartExtension? dco_decode_opt_box_autoadd_part_extension(dynamic raw) { // Codec=Dco (DartCObject based), see doc to use other codecs - final arr = raw as List; - if (arr.length != 2) { - throw Exception('Expected 2 elements, got ${arr.length}'); - } - return ( - dco_decode_String(arr[0]), - dco_decode_opt_box_autoadd_cloud_attachment(arr[1]), - ); + return raw == null ? null : dco_decode_box_autoadd_part_extension(raw); } @protected - (String, CloudChat?) dco_decode_record_string_opt_box_autoadd_cloud_chat( - dynamic raw) { + PasswordManagerMetaDataFormerlyShared? + dco_decode_opt_box_autoadd_password_manager_meta_data_formerly_shared( + dynamic raw, + ) { // Codec=Dco (DartCObject based), see doc to use other codecs - final arr = raw as List; - if (arr.length != 2) { - throw Exception('Expected 2 elements, got ${arr.length}'); - } - return ( - dco_decode_String(arr[0]), - dco_decode_opt_box_autoadd_cloud_chat(arr[1]), - ); + return raw == null + ? null + : dco_decode_box_autoadd_password_manager_meta_data_formerly_shared( + raw, + ); } @protected - (String, CloudMessage?) - dco_decode_record_string_opt_box_autoadd_cloud_message(dynamic raw) { + PasswordManagerTotp? dco_decode_opt_box_autoadd_password_manager_totp( + dynamic raw, + ) { // Codec=Dco (DartCObject based), see doc to use other codecs - final arr = raw as List; - if (arr.length != 2) { - throw Exception('Expected 2 elements, got ${arr.length}'); - } - return ( - dco_decode_String(arr[0]), - dco_decode_opt_box_autoadd_cloud_message(arr[1]), - ); + return raw == null + ? null + : dco_decode_box_autoadd_password_manager_totp(raw); } @protected - (String, PasswordManagerMetaDataCtx) - dco_decode_record_string_password_manager_meta_data_ctx(dynamic raw) { + PosterColor? dco_decode_opt_box_autoadd_poster_color(dynamic raw) { // Codec=Dco (DartCObject based), see doc to use other codecs - final arr = raw as List; - if (arr.length != 2) { - throw Exception('Expected 2 elements, got ${arr.length}'); - } - return ( - dco_decode_String(arr[0]), - dco_decode_password_manager_meta_data_ctx(arr[1]), - ); + return raw == null ? null : dco_decode_box_autoadd_poster_color(raw); } @protected - (String, (String?, Passkey)) - dco_decode_record_string_record_opt_string_passkey(dynamic raw) { + PRPosterContentMaterialStyle? + dco_decode_opt_box_autoadd_pr_poster_content_material_style(dynamic raw) { // Codec=Dco (DartCObject based), see doc to use other codecs - final arr = raw as List; - if (arr.length != 2) { - throw Exception('Expected 2 elements, got ${arr.length}'); - } - return ( - dco_decode_String(arr[0]), - dco_decode_record_opt_string_passkey(arr[1]), - ); + return raw == null + ? null + : dco_decode_box_autoadd_pr_poster_content_material_style(raw); } @protected - (String, (String?, PasswordManagerMeta)) - dco_decode_record_string_record_opt_string_password_manager_meta( - dynamic raw) { + PushMessage? dco_decode_opt_box_autoadd_push_message(dynamic raw) { // Codec=Dco (DartCObject based), see doc to use other codecs - final arr = raw as List; - if (arr.length != 2) { - throw Exception('Expected 2 elements, got ${arr.length}'); - } - return ( - dco_decode_String(arr[0]), - dco_decode_record_opt_string_password_manager_meta(arr[1]), - ); + return raw == null ? null : dco_decode_box_autoadd_push_message(raw); } @protected - ( - String, - (String?, PasswordRawEntry) - ) dco_decode_record_string_record_opt_string_password_raw_entry(dynamic raw) { + (SharedPushState, ApsWatcher)? + dco_decode_opt_box_autoadd_record_shared_push_state_auto_owned_rust_opaque_flutter_rust_bridgefor_generated_rust_auto_opaque_inner_aps_watcher( + dynamic raw, + ) { // Codec=Dco (DartCObject based), see doc to use other codecs - final arr = raw as List; - if (arr.length != 2) { - throw Exception('Expected 2 elements, got ${arr.length}'); - } - return ( - dco_decode_String(arr[0]), - dco_decode_record_opt_string_password_raw_entry(arr[1]), - ); + return raw == null + ? null + : dco_decode_box_autoadd_record_shared_push_state_auto_owned_rust_opaque_flutter_rust_bridgefor_generated_rust_auto_opaque_inner_aps_watcher( + raw, + ); } @protected - (String, (String?, WifiPassword)) - dco_decode_record_string_record_opt_string_wifi_password(dynamic raw) { + (String, String)? dco_decode_opt_box_autoadd_record_string_string( + dynamic raw, + ) { // Codec=Dco (DartCObject based), see doc to use other codecs - final arr = raw as List; - if (arr.length != 2) { - throw Exception('Expected 2 elements, got ${arr.length}'); - } - return ( - dco_decode_String(arr[0]), - dco_decode_record_opt_string_wifi_password(arr[1]), - ); + return raw == null + ? null + : dco_decode_box_autoadd_record_string_string(raw); } @protected - (String, ShareInviteContentData) - dco_decode_record_string_share_invite_content_data(dynamic raw) { + (String, BigInt)? dco_decode_opt_box_autoadd_record_string_u_64(dynamic raw) { // Codec=Dco (DartCObject based), see doc to use other codecs - final arr = raw as List; - if (arr.length != 2) { - throw Exception('Expected 2 elements, got ${arr.length}'); - } - return ( - dco_decode_String(arr[0]), - dco_decode_share_invite_content_data(arr[1]), - ); + return raw == null ? null : dco_decode_box_autoadd_record_string_u_64(raw); } @protected - (String, SharedPushState) dco_decode_record_string_shared_push_state( - dynamic raw) { + RichLinkImageAttachmentSubstitute? + dco_decode_opt_box_autoadd_rich_link_image_attachment_substitute( + dynamic raw, + ) { // Codec=Dco (DartCObject based), see doc to use other codecs - final arr = raw as List; - if (arr.length != 2) { - throw Exception('Expected 2 elements, got ${arr.length}'); - } - return ( - dco_decode_String(arr[0]), - dco_decode_shared_push_state(arr[1]), - ); + return raw == null + ? null + : dco_decode_box_autoadd_rich_link_image_attachment_substitute(raw); } @protected - (String, StatusKitPersonalConfig) - dco_decode_record_string_status_kit_personal_config(dynamic raw) { + ScheduleMode? dco_decode_opt_box_autoadd_schedule_mode(dynamic raw) { // Codec=Dco (DartCObject based), see doc to use other codecs - final arr = raw as List; - if (arr.length != 2) { - throw Exception('Expected 2 elements, got ${arr.length}'); - } - return ( - dco_decode_String(arr[0]), - dco_decode_status_kit_personal_config(arr[1]), - ); + return raw == null ? null : dco_decode_box_autoadd_schedule_mode(raw); } @protected - (String, String) dco_decode_record_string_string(dynamic raw) { + ShareProfileMessage? dco_decode_opt_box_autoadd_share_profile_message( + dynamic raw, + ) { // Codec=Dco (DartCObject based), see doc to use other codecs - final arr = raw as List; - if (arr.length != 2) { - throw Exception('Expected 2 elements, got ${arr.length}'); - } - return ( - dco_decode_String(arr[0]), - dco_decode_String(arr[1]), - ); + return raw == null + ? null + : dco_decode_box_autoadd_share_profile_message(raw); } @protected - (String, SyncStatus) dco_decode_record_string_sync_status(dynamic raw) { + SharedICloudServices? dco_decode_opt_box_autoadd_shared_i_cloud_services( + dynamic raw, + ) { // Codec=Dco (DartCObject based), see doc to use other codecs - final arr = raw as List; - if (arr.length != 2) { - throw Exception('Expected 2 elements, got ${arr.length}'); - } - return ( - dco_decode_String(arr[0]), - dco_decode_sync_status(arr[1]), - ); + return raw == null + ? null + : dco_decode_box_autoadd_shared_i_cloud_services(raw); } @protected - (String, BigInt) dco_decode_record_string_u_64(dynamic raw) { + SharedPoster? dco_decode_opt_box_autoadd_shared_poster(dynamic raw) { // Codec=Dco (DartCObject based), see doc to use other codecs - final arr = raw as List; - if (arr.length != 2) { - throw Exception('Expected 2 elements, got ${arr.length}'); - } - return ( - dco_decode_String(arr[0]), - dco_decode_u_64(arr[1]), - ); + return raw == null ? null : dco_decode_box_autoadd_shared_poster(raw); } @protected - (String, UpdateAccountFinish) dco_decode_record_string_update_account_finish( - dynamic raw) { + SharedPushState? dco_decode_opt_box_autoadd_shared_push_state(dynamic raw) { // Codec=Dco (DartCObject based), see doc to use other codecs - final arr = raw as List; - if (arr.length != 2) { - throw Exception('Expected 2 elements, got ${arr.length}'); - } - return ( - dco_decode_String(arr[0]), - dco_decode_update_account_finish(arr[1]), - ); + return raw == null ? null : dco_decode_box_autoadd_shared_push_state(raw); } @protected - (int, NSDictionaryTypedCoder) - dco_decode_record_u_32_ns_dictionary_typed_coder(dynamic raw) { + SupportAction? dco_decode_opt_box_autoadd_support_action(dynamic raw) { // Codec=Dco (DartCObject based), see doc to use other codecs - final arr = raw as List; - if (arr.length != 2) { - throw Exception('Expected 2 elements, got ${arr.length}'); - } - return ( - dco_decode_u_32(arr[0]), - dco_decode_ns_dictionary_typed_coder(arr[1]), - ); + return raw == null ? null : dco_decode_box_autoadd_support_action(raw); } @protected - (int, BigInt) dco_decode_record_u_32_u_64(dynamic raw) { + SupportAlert? dco_decode_opt_box_autoadd_support_alert(dynamic raw) { // Codec=Dco (DartCObject based), see doc to use other codecs - final arr = raw as List; - if (arr.length != 2) { - throw Exception('Expected 2 elements, got ${arr.length}'); - } - return ( - dco_decode_u_32(arr[0]), - dco_decode_u_64(arr[1]), - ); + return raw == null ? null : dco_decode_box_autoadd_support_alert(raw); } @protected - RegisterState dco_decode_register_state(dynamic raw) { + TypingApp? dco_decode_opt_box_autoadd_typing_app(dynamic raw) { // Codec=Dco (DartCObject based), see doc to use other codecs - switch (raw[0]) { - case 0: - return RegisterState_Registered( - nextS: dco_decode_i_64(raw[1]), - ); - case 1: - return RegisterState_Registering(); - case 2: - return RegisterState_Failed( - retryWait: dco_decode_opt_box_autoadd_u_64(raw[1]), - error: dco_decode_String(raw[2]), - ); - default: - throw Exception("unreachable"); - } + return raw == null ? null : dco_decode_box_autoadd_typing_app(raw); } @protected - RenameMessage dco_decode_rename_message(dynamic raw) { + int? dco_decode_opt_box_autoadd_u_16(dynamic raw) { // Codec=Dco (DartCObject based), see doc to use other codecs - final arr = raw as List; - if (arr.length != 1) - throw Exception('unexpected arr length: expect 1 but see ${arr.length}'); - return RenameMessage( - newName: dco_decode_String(arr[0]), - ); + return raw == null ? null : dco_decode_box_autoadd_u_16(raw); } @protected - ReportMessage dco_decode_report_message(dynamic raw) { + int? dco_decode_opt_box_autoadd_u_32(dynamic raw) { // Codec=Dco (DartCObject based), see doc to use other codecs - final arr = raw as List; - if (arr.length != 5) - throw Exception('unexpected arr length: expect 5 but see ${arr.length}'); - return ReportMessage( - guid: dco_decode_String(arr[0]), - sender: dco_decode_String(arr[1]), - conversationSize: dco_decode_u_32(arr[2]), - parts: dco_decode_message_parts(arr[3]), - timeOfMessage: dco_decode_f_64(arr[4]), - ); + return raw == null ? null : dco_decode_box_autoadd_u_32(raw); } @protected - RichLinkImageAttachmentSubstitute - dco_decode_rich_link_image_attachment_substitute(dynamic raw) { + BigInt? dco_decode_opt_box_autoadd_u_64(dynamic raw) { // Codec=Dco (DartCObject based), see doc to use other codecs - final arr = raw as List; - if (arr.length != 2) - throw Exception('unexpected arr length: expect 2 but see ${arr.length}'); - return RichLinkImageAttachmentSubstitute( - mimeType: dco_decode_String(arr[0]), - richLinkImageAttachmentSubstituteIndex: dco_decode_u_64(arr[1]), - ); + return raw == null ? null : dco_decode_box_autoadd_u_64(raw); } @protected - ScheduleMode dco_decode_schedule_mode(dynamic raw) { + UpdateAccountFinish? dco_decode_opt_box_autoadd_update_account_finish( + dynamic raw, + ) { // Codec=Dco (DartCObject based), see doc to use other codecs - final arr = raw as List; - if (arr.length != 2) - throw Exception('unexpected arr length: expect 2 but see ${arr.length}'); - return ScheduleMode( - ms: dco_decode_CastedPrimitive_u_64(arr[0]), - schedule: dco_decode_bool(arr[1]), - ); + return raw == null + ? null + : dco_decode_box_autoadd_update_account_finish(raw); } @protected - SetTranscriptBackgroundMessage dco_decode_set_transcript_background_message( - dynamic raw) { + List? + dco_decode_opt_list_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerIDSUser( + dynamic raw, + ) { + // Codec=Dco (DartCObject based), see doc to use other codecs + return raw == null + ? null + : dco_decode_list_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerIDSUser( + raw, + ); + } + + @protected + List? dco_decode_opt_list_String(dynamic raw) { + // Codec=Dco (DartCObject based), see doc to use other codecs + return raw == null ? null : dco_decode_list_String(raw); + } + + @protected + List? dco_decode_opt_list_message_target(dynamic raw) { + // Codec=Dco (DartCObject based), see doc to use other codecs + return raw == null ? null : dco_decode_list_message_target(raw); + } + + @protected + Uint8List? dco_decode_opt_list_prim_u_8_strict(dynamic raw) { + // Codec=Dco (DartCObject based), see doc to use other codecs + return raw == null ? null : dco_decode_list_prim_u_8_strict(raw); + } + + @protected + PartExtension dco_decode_part_extension(dynamic raw) { // Codec=Dco (DartCObject based), see doc to use other codecs switch (raw[0]) { case 0: - return SetTranscriptBackgroundMessage_Remove( - aid: dco_decode_u_32(raw[1]), - bid: dco_decode_u_64(raw[2]), - chatId: dco_decode_opt_String(raw[3]), - remove: dco_decode_bool(raw[4]), - ); - case 1: - return SetTranscriptBackgroundMessage_Set( - aid: dco_decode_u_32(raw[1]), - bid: dco_decode_u_64(raw[2]), - chatId: dco_decode_opt_String(raw[3]), - objectId: dco_decode_String(raw[4]), - payloadVersion: dco_decode_u_32(raw[5]), - backgroundId: dco_decode_String(raw[6]), - url: dco_decode_String(raw[7]), - signature: dco_decode_String(raw[8]), - key: dco_decode_String(raw[9]), - fileSize: dco_decode_usize(raw[10]), + return PartExtension_Sticker( + msgWidth: dco_decode_f_64(raw[1]), + rotation: dco_decode_f_64(raw[2]), + sai: dco_decode_u_64(raw[3]), + scale: dco_decode_f_64(raw[4]), + update: dco_decode_opt_box_autoadd_bool(raw[5]), + sli: dco_decode_u_64(raw[6]), + normalizedX: dco_decode_f_64(raw[7]), + normalizedY: dco_decode_f_64(raw[8]), + version: dco_decode_u_64(raw[9]), + hash: dco_decode_String(raw[10]), + safi: dco_decode_u_64(raw[11]), + effectType: dco_decode_i_64(raw[12]), + stickerId: dco_decode_String(raw[13]), ); default: throw Exception("unreachable"); @@ -15728,410 +19495,314 @@ class RustLibApiImpl extends RustLibApiImplPlatform implements RustLibApi { } @protected - ShareInviteContentData dco_decode_share_invite_content_data(dynamic raw) { + Passkey dco_decode_passkey(dynamic raw) { // Codec=Dco (DartCObject based), see doc to use other codecs final arr = raw as List; - if (arr.length != 6) - throw Exception('unexpected arr length: expect 6 but see ${arr.length}'); - return ShareInviteContentData( - invitationToken: dco_decode_list_prim_u_8_strict(arr[0]), - groupId: dco_decode_String(arr[1]), - sentTime: - dco_decode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerDate( - arr[2]), - groupName: dco_decode_String(arr[3]), - shareUrl: dco_decode_String(arr[4]), - inviteeHandle: dco_decode_String(arr[5]), + if (arr.length != 7) + throw Exception('unexpected arr length: expect 7 but see ${arr.length}'); + return Passkey( + cdat: dco_decode_CastedPrimitive_u_64(arr[0]), + mdat: dco_decode_CastedPrimitive_u_64(arr[1]), + agrp: dco_decode_String(arr[2]), + labl: dco_decode_String(arr[3]), + data: dco_decode_list_prim_u_8_strict(arr[4]), + atag: dco_decode_list_prim_u_8_strict(arr[5]), + klbl: dco_decode_list_prim_u_8_strict(arr[6]), ); } @protected - ShareProfileMessage dco_decode_share_profile_message(dynamic raw) { + PasswordManagerAltDomain dco_decode_password_manager_alt_domain(dynamic raw) { // Codec=Dco (DartCObject based), see doc to use other codecs final arr = raw as List; - if (arr.length != 3) - throw Exception('unexpected arr length: expect 3 but see ${arr.length}'); - return ShareProfileMessage( - cloudKitDecryptionRecordKey: dco_decode_list_prim_u_8_strict(arr[0]), - cloudKitRecordKey: dco_decode_String(arr[1]), - poster: dco_decode_opt_box_autoadd_shared_poster(arr[2]), + if (arr.length != 1) + throw Exception('unexpected arr length: expect 1 but see ${arr.length}'); + return PasswordManagerAltDomain(domain: dco_decode_String(arr[0])); + } + + @protected + PasswordManagerMeta dco_decode_password_manager_meta(dynamic raw) { + // Codec=Dco (DartCObject based), see doc to use other codecs + final arr = raw as List; + if (arr.length != 6) + throw Exception('unexpected arr length: expect 6 but see ${arr.length}'); + return PasswordManagerMeta( + cdat: dco_decode_CastedPrimitive_u_64(arr[0]), + mdat: dco_decode_CastedPrimitive_u_64(arr[1]), + srvr: dco_decode_String(arr[2]), + acct: dco_decode_String(arr[3]), + agrp: dco_decode_String(arr[4]), + data: dco_decode_list_prim_u_8_strict(arr[5]), ); } @protected - SharedAlbum dco_decode_shared_album(dynamic raw) { + PasswordManagerMetaChange dco_decode_password_manager_meta_change( + dynamic raw, + ) { // Codec=Dco (DartCObject based), see doc to use other codecs final arr = raw as List; - if (arr.length != 9) - throw Exception('unexpected arr length: expect 9 but see ${arr.length}'); - return SharedAlbum( - name: dco_decode_opt_String(arr[0]), - fullname: dco_decode_opt_String(arr[1]), - email: dco_decode_opt_String(arr[2]), - albumguid: dco_decode_String(arr[3]), - sharingtype: dco_decode_String(arr[4]), - subscriptiondate: dco_decode_opt_String(arr[5]), - albumlocation: dco_decode_opt_String(arr[6]), - assets: dco_decode_list_String(arr[7]), - delete: dco_decode_opt_String(arr[8]), + if (arr.length != 8) + throw Exception('unexpected arr length: expect 8 but see ${arr.length}'); + return PasswordManagerMetaChange( + date: dco_decode_CastedPrimitive_u_64(arr[0]), + password: dco_decode_opt_String(arr[1]), + oldPassword: dco_decode_opt_String(arr[2]), + groupName: dco_decode_opt_String(arr[3]), + groupId: dco_decode_opt_String(arr[4]), + shareType: dco_decode_opt_String(arr[5]), + id: dco_decode_String(arr[6]), + typ: dco_decode_String(arr[7]), ); } @protected - SharedICloudServices dco_decode_shared_i_cloud_services(dynamic raw) { + PasswordManagerMetaData dco_decode_password_manager_meta_data(dynamic raw) { // Codec=Dco (DartCObject based), see doc to use other codecs final arr = raw as List; - if (arr.length != 10) - throw Exception('unexpected arr length: expect 10 but see ${arr.length}'); - return SharedICloudServices( - account: - dco_decode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcMutexAppleAccountDefaultAnisetteProvider( - arr[0]), - tokenProvider: - dco_decode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcTokenProviderDefaultAnisetteProvider( - arr[1]), - cloudkitClient: - dco_decode_opt_box_autoadd_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcCloudKitClientDefaultAnisetteProvider( - arr[2]), - keychain: - dco_decode_opt_box_autoadd_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcKeychainClientDefaultAnisetteProvider( - arr[3]), - passwords: - dco_decode_opt_box_autoadd_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcPasswordManagerDefaultAnisetteProvider( - arr[4]), - profilesClient: - dco_decode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcProfilesClientDefaultAnisetteProvider( - arr[5]), - fmfd: - dco_decode_opt_box_autoadd_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcFindMyClientDefaultAnisetteProvider( - arr[6]), - sharedstreams: - dco_decode_opt_box_autoadd_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerSyncManagerDefaultAnisetteProviderMyFilePackager( - arr[7]), - cloudMessagesClient: - dco_decode_opt_box_autoadd_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcCloudMessagesClientDefaultAnisetteProvider( - arr[8]), - statuskitClient: - dco_decode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcStatusKitClientDefaultAnisetteProvider( - arr[9]), + if (arr.length != 8) + throw Exception('unexpected arr length: expect 8 but see ${arr.length}'); + return PasswordManagerMetaData( + history: dco_decode_list_password_manager_meta_change(arr[0]), + altDomains: dco_decode_list_password_manager_alt_domain(arr[1]), + totp: dco_decode_opt_box_autoadd_password_manager_totp(arr[2]), + ctxt: dco_decode_Map_String_password_manager_meta_data_ctx(arr[3]), + title: dco_decode_opt_list_prim_u_8_strict(arr[4]), + notes: dco_decode_opt_list_prim_u_8_strict(arr[5]), + formerlyShared: + dco_decode_opt_box_autoadd_password_manager_meta_data_formerly_shared( + arr[6], + ), + ocpid: dco_decode_opt_list_prim_u_8_strict(arr[7]), ); } @protected - SharedPoster dco_decode_shared_poster(dynamic raw) { + PasswordManagerMetaDataCtx dco_decode_password_manager_meta_data_ctx( + dynamic raw, + ) { // Codec=Dco (DartCObject based), see doc to use other codecs final arr = raw as List; - if (arr.length != 3) - throw Exception('unexpected arr length: expect 3 but see ${arr.length}'); - return SharedPoster( - lowResWallpaperTag: dco_decode_list_prim_u_8_strict(arr[0]), - wallpaperTag: dco_decode_list_prim_u_8_strict(arr[1]), - messageTag: dco_decode_list_prim_u_8_strict(arr[2]), - ); + if (arr.length != 1) + throw Exception('unexpected arr length: expect 1 but see ${arr.length}'); + return PasswordManagerMetaDataCtx(lastUsed: dco_decode_f_64(arr[0])); } @protected - SharedPushState dco_decode_shared_push_state(dynamic raw) { + PasswordManagerMetaDataFormerlyShared + dco_decode_password_manager_meta_data_formerly_shared(dynamic raw) { // Codec=Dco (DartCObject based), see doc to use other codecs final arr = raw as List; - if (arr.length != 12) - throw Exception('unexpected arr length: expect 12 but see ${arr.length}'); - return SharedPushState( - osConfig: - dco_decode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerJoinedOSConfig( - arr[0]), - cancelPoll: - dco_decode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerSender( - arr[1]), - confDir: dco_decode_String(arr[2]), - localBroadcast: - dco_decode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcSenderPushMessage( - arr[3]), - anisette: - dco_decode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcAnisetteClientDefaultAnisetteProvider( - arr[4]), - conn: - dco_decode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerAPSConnection( - arr[5]), - icloudServices: - dco_decode_opt_box_autoadd_shared_i_cloud_services(arr[6]), - client: - dco_decode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcIMClient( - arr[7]), - ftClient: - dco_decode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcFTClient( - arr[8]), - idmsClient: - dco_decode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcIdmsAuthListener( - arr[9]), - activeCircleSessions: - dco_decode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcMutexVecActiveCircleSession( - arr[10]), - clientSession: - dco_decode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcMutexOptionCircleClientSessionDefaultAnisetteProvider( - arr[11]), + if (arr.length != 2) + throw Exception('unexpected arr length: expect 2 but see ${arr.length}'); + return PasswordManagerMetaDataFormerlyShared( + groupName: dco_decode_opt_String(arr[0]), + passwordManagerCredentialIdentifier: dco_decode_opt_String(arr[1]), ); } @protected - SimplifiedIncomingCallPoster dco_decode_simplified_incoming_call_poster( - dynamic raw) { + PasswordManagerTotp dco_decode_password_manager_totp(dynamic raw) { // Codec=Dco (DartCObject based), see doc to use other codecs final arr = raw as List; - if (arr.length != 3) - throw Exception('unexpected arr length: expect 3 but see ${arr.length}'); - return SimplifiedIncomingCallPoster( - poster: dco_decode_simplified_poster(arr[0]), - textMetadata: dco_decode_wallpaper_metadata(arr[1]), - lowRes: dco_decode_list_prim_u_8_strict(arr[2]), + if (arr.length != 8) + throw Exception('unexpected arr length: expect 8 but see ${arr.length}'); + return PasswordManagerTotp( + secret: dco_decode_list_prim_u_8_strict(arr[0]), + digits: dco_decode_u_32(arr[1]), + issuer: dco_decode_opt_String(arr[2]), + period: dco_decode_u_32(arr[3]), + initialDate: dco_decode_CastedPrimitive_u_64(arr[4]), + algorithm: dco_decode_u_32(arr[5]), + accountName: dco_decode_opt_String(arr[6]), + originalUrl: dco_decode_opt_String(arr[7]), ); } @protected - SimplifiedPoster dco_decode_simplified_poster(dynamic raw) { + PasswordRawEntry dco_decode_password_raw_entry(dynamic raw) { // Codec=Dco (DartCObject based), see doc to use other codecs final arr = raw as List; - if (arr.length != 3) - throw Exception('unexpected arr length: expect 3 but see ${arr.length}'); - return SimplifiedPoster( - titleConfiguration: - dco_decode_pr_poster_title_style_configuration(arr[0]), - type: dco_decode_poster_type(arr[1]), - role: dco_decode_poster_role(arr[2]), + if (arr.length != 6) + throw Exception('unexpected arr length: expect 6 but see ${arr.length}'); + return PasswordRawEntry( + cdat: dco_decode_CastedPrimitive_u_64(arr[0]), + mdat: dco_decode_CastedPrimitive_u_64(arr[1]), + srvr: dco_decode_String(arr[2]), + acct: dco_decode_String(arr[3]), + agrp: dco_decode_String(arr[4]), + data: dco_decode_list_prim_u_8_strict(arr[5]), ); } @protected - SimplifiedTranscriptPoster dco_decode_simplified_transcript_poster( - dynamic raw) { + PermanentDeleteMessage dco_decode_permanent_delete_message(dynamic raw) { // Codec=Dco (DartCObject based), see doc to use other codecs final arr = raw as List; if (arr.length != 2) throw Exception('unexpected arr length: expect 2 but see ${arr.length}'); - return SimplifiedTranscriptPoster( - watch: dco_decode_watch_background(arr[0]), - poster: dco_decode_simplified_poster(arr[1]), + return PermanentDeleteMessage( + target: dco_decode_delete_target(arr[0]), + isScheduled: dco_decode_bool(arr[1]), ); } @protected - StatusKitMessage dco_decode_status_kit_message(dynamic raw) { + PhotoPosterContents dco_decode_photo_poster_contents(dynamic raw) { // Codec=Dco (DartCObject based), see doc to use other codecs - switch (raw[0]) { - case 0: - return StatusKitMessage_StatusChanged( - user: dco_decode_String(raw[1]), - mode: dco_decode_opt_String(raw[2]), - allowed: dco_decode_bool(raw[3]), - ); - default: - throw Exception("unreachable"); - } + final arr = raw as List; + if (arr.length != 3) + throw Exception('unexpected arr length: expect 3 but see ${arr.length}'); + return PhotoPosterContents( + version: dco_decode_u_32(arr[0]), + layers: dco_decode_list_photo_poster_layer(arr[1]), + properties: dco_decode_photo_poster_properties(arr[2]), + ); } @protected - StatusKitPersonalConfig dco_decode_status_kit_personal_config(dynamic raw) { + PhotoPosterContentsFrame dco_decode_photo_poster_contents_frame(dynamic raw) { // Codec=Dco (DartCObject based), see doc to use other codecs final arr = raw as List; - if (arr.length != 1) - throw Exception('unexpected arr length: expect 1 but see ${arr.length}'); - return StatusKitPersonalConfig( - allowedModes: dco_decode_list_String(arr[0]), + if (arr.length != 4) + throw Exception('unexpected arr length: expect 4 but see ${arr.length}'); + return PhotoPosterContentsFrame( + width: dco_decode_f_64(arr[0]), + height: dco_decode_f_64(arr[1]), + x: dco_decode_f_64(arr[2]), + y: dco_decode_f_64(arr[3]), ); } @protected - SupportAction dco_decode_support_action(dynamic raw) { + PhotoPosterContentsSize dco_decode_photo_poster_contents_size(dynamic raw) { // Codec=Dco (DartCObject based), see doc to use other codecs final arr = raw as List; if (arr.length != 2) throw Exception('unexpected arr length: expect 2 but see ${arr.length}'); - return SupportAction( - url: dco_decode_String(arr[0]), - button: dco_decode_String(arr[1]), + return PhotoPosterContentsSize( + width: dco_decode_f_64(arr[0]), + height: dco_decode_f_64(arr[1]), ); } @protected - SupportAlert dco_decode_support_alert(dynamic raw) { + PhotoPosterLayer dco_decode_photo_poster_layer(dynamic raw) { // Codec=Dco (DartCObject based), see doc to use other codecs final arr = raw as List; - if (arr.length != 3) - throw Exception('unexpected arr length: expect 3 but see ${arr.length}'); - return SupportAlert( - title: dco_decode_String(arr[0]), - body: dco_decode_String(arr[1]), - action: dco_decode_opt_box_autoadd_support_action(arr[2]), + if (arr.length != 4) + throw Exception('unexpected arr length: expect 4 but see ${arr.length}'); + return PhotoPosterLayer( + frame: dco_decode_photo_poster_contents_frame(arr[0]), + filename: dco_decode_String(arr[1]), + zPosition: dco_decode_f_32(arr[2]), + identifier: dco_decode_String(arr[3]), ); } @protected - SyncStatus dco_decode_sync_status(dynamic raw) { - // Codec=Dco (DartCObject based), see doc to use other codecs - switch (raw[0]) { - case 0: - return SyncStatus_Synced(); - case 1: - return SyncStatus_Downloading( - progress: dco_decode_usize(raw[1]), - total: dco_decode_usize(raw[2]), - ); - case 2: - return SyncStatus_Uploading( - progress: dco_decode_usize(raw[1]), - total: dco_decode_usize(raw[2]), - ); - case 3: - return SyncStatus_Syncing(); - default: - throw Exception("unreachable"); - } - } - - @protected - TeardownSignIn dco_decode_teardown_sign_in(dynamic raw) { + PhotoPosterLayout dco_decode_photo_poster_layout(dynamic raw) { // Codec=Dco (DartCObject based), see doc to use other codecs final arr = raw as List; - if (arr.length != 1) - throw Exception('unexpected arr length: expect 1 but see ${arr.length}'); - return TeardownSignIn( - prevtxnid: dco_decode_String(arr[0]), + if (arr.length != 9) + throw Exception('unexpected arr length: expect 9 but see ${arr.length}'); + return PhotoPosterLayout( + clockIntersection: dco_decode_u_32(arr[0]), + deviceResolution: dco_decode_photo_poster_contents_size(arr[1]), + visibleFrame: dco_decode_photo_poster_contents_frame(arr[2]), + timeFrame: dco_decode_photo_poster_contents_frame(arr[3]), + clockLayerOrder: dco_decode_String(arr[4]), + hasTopEdgeContact: dco_decode_bool(arr[5]), + inactiveFrame: dco_decode_photo_poster_contents_frame(arr[6]), + imageSize: dco_decode_photo_poster_contents_size(arr[7]), + parallaxPadding: dco_decode_photo_poster_contents_size(arr[8]), ); } @protected - TextEffect dco_decode_text_effect(dynamic raw) { - // Codec=Dco (DartCObject based), see doc to use other codecs - return TextEffect.values[raw as int]; - } - - @protected - TextFlags dco_decode_text_flags(dynamic raw) { + PhotoPosterProperties dco_decode_photo_poster_properties(dynamic raw) { // Codec=Dco (DartCObject based), see doc to use other codecs final arr = raw as List; - if (arr.length != 4) - throw Exception('unexpected arr length: expect 4 but see ${arr.length}'); - return TextFlags( - bold: dco_decode_bool(arr[0]), - italic: dco_decode_bool(arr[1]), - underline: dco_decode_bool(arr[2]), - strikethrough: dco_decode_bool(arr[3]), + if (arr.length != 5) + throw Exception('unexpected arr length: expect 5 but see ${arr.length}'); + return PhotoPosterProperties( + portraitLayout: dco_decode_photo_poster_layout(arr[0]), + settlingEffectEnabled: dco_decode_bool(arr[1]), + depthEnabled: dco_decode_bool(arr[2]), + clockAreaLuminance: dco_decode_f_64(arr[3]), + parallaxDisabled: dco_decode_bool(arr[4]), ); } @protected - TextFormat dco_decode_text_format(dynamic raw) { + PollResult dco_decode_poll_result(dynamic raw) { // Codec=Dco (DartCObject based), see doc to use other codecs switch (raw[0]) { case 0: - return TextFormat_Flags( - dco_decode_box_autoadd_text_flags(raw[1]), - ); + return PollResult_Stop(); case 1: - return TextFormat_Effect( - dco_decode_text_effect(raw[1]), - ); + return PollResult_Cont(dco_decode_opt_box_autoadd_push_message(raw[1])); default: throw Exception("unreachable"); } } @protected - TranscriptDynamicUserData dco_decode_transcript_dynamic_user_data( - dynamic raw) { + PosterAsset dco_decode_poster_asset(dynamic raw) { // Codec=Dco (DartCObject based), see doc to use other codecs final arr = raw as List; - if (arr.length != 1) - throw Exception('unexpected arr length: expect 1 but see ${arr.length}'); - return TranscriptDynamicUserData( - identifier: dco_decode_String(arr[0]), + if (arr.length != 3) + throw Exception('unexpected arr length: expect 3 but see ${arr.length}'); + return PosterAsset( + contents: dco_decode_photo_poster_contents(arr[0]), + files: dco_decode_Map_String_list_prim_u_8_strict(arr[1]), + uuid: dco_decode_String(arr[2]), ); } @protected - TransferProgress dco_decode_transfer_progress(dynamic raw) { - // Codec=Dco (DartCObject based), see doc to use other codecs - final arr = raw as List; - if (arr.length != 3) - throw Exception('unexpected arr length: expect 3 but see ${arr.length}'); - return TransferProgress( - prog: dco_decode_CastedPrimitive_usize(arr[0]), - total: dco_decode_CastedPrimitive_usize(arr[1]), - attachment: dco_decode_opt_box_autoadd_attachment(arr[2]), - ); - } - - @protected - TrustedPhoneNumber dco_decode_trusted_phone_number(dynamic raw) { + PosterColor dco_decode_poster_color(dynamic raw) { // Codec=Dco (DartCObject based), see doc to use other codecs final arr = raw as List; if (arr.length != 4) throw Exception('unexpected arr length: expect 4 but see ${arr.length}'); - return TrustedPhoneNumber( - numberWithDialCode: dco_decode_String(arr[0]), - lastTwoDigits: dco_decode_String(arr[1]), - pushMode: dco_decode_String(arr[2]), - id: dco_decode_u_32(arr[3]), - ); - } - - @protected - TypingApp dco_decode_typing_app(dynamic raw) { - // Codec=Dco (DartCObject based), see doc to use other codecs - final arr = raw as List; - if (arr.length != 2) - throw Exception('unexpected arr length: expect 2 but see ${arr.length}'); - return TypingApp( - bundleId: dco_decode_String(arr[0]), - icon: dco_decode_list_prim_u_8_strict(arr[1]), + return PosterColor( + alpha: dco_decode_f_64(arr[0]), + blue: dco_decode_f_64(arr[1]), + green: dco_decode_f_64(arr[2]), + red: dco_decode_f_64(arr[3]), ); } @protected - int dco_decode_u_32(dynamic raw) { - // Codec=Dco (DartCObject based), see doc to use other codecs - return raw as int; - } - - @protected - BigInt dco_decode_u_64(dynamic raw) { - // Codec=Dco (DartCObject based), see doc to use other codecs - return dcoDecodeU64(raw); - } - - @protected - int dco_decode_u_8(dynamic raw) { + PosterRole dco_decode_poster_role(dynamic raw) { // Codec=Dco (DartCObject based), see doc to use other codecs - return raw as int; + return PosterRole.values[raw as int]; } @protected - UIColor dco_decode_ui_color(dynamic raw) { + PosterType dco_decode_poster_type(dynamic raw) { // Codec=Dco (DartCObject based), see doc to use other codecs switch (raw[0]) { case 0: - return UIColor_RGBAColorSpace( - colorComponents: dco_decode_u_32(raw[1]), - green: dco_decode_f_64(raw[2]), - blue: dco_decode_f_64(raw[3]), - red: dco_decode_f_64(raw[4]), - greenDbl: dco_decode_opt_box_autoadd_f_64(raw[5]), - blueDbl: dco_decode_opt_box_autoadd_f_64(raw[6]), - redDbl: dco_decode_opt_box_autoadd_f_64(raw[7]), - alphaDbl: dco_decode_opt_box_autoadd_f_64(raw[8]), - alpha: dco_decode_f_64(raw[9]), - rgb: dco_decode_list_prim_u_8_strict(raw[10]), - colorSpace: dco_decode_u_32(raw[11]), - class_: dco_decode_String(raw[12]), - ); + return PosterType_Photo(assets: dco_decode_list_poster_asset(raw[1])); case 1: - return UIColor_GrayscaleAlphaColorSpace( - colorComponents: dco_decode_u_32(raw[1]), - white: dco_decode_f_64(raw[2]), - alpha: dco_decode_f_64(raw[3]), - bin: dco_decode_list_prim_u_8_strict(raw[4]), - colorSpace: dco_decode_u_32(raw[5]), - class_: dco_decode_String(raw[6]), + return PosterType_Monogram( + data: dco_decode_box_autoadd_monogram_data(raw[1]), + background: dco_decode_box_autoadd_poster_color(raw[2]), + ); + case 2: + return PosterType_Memoji( + data: dco_decode_box_autoadd_memoji_data(raw[1]), + background: dco_decode_box_autoadd_poster_color(raw[2]), + ); + case 3: + return PosterType_TranscriptDynamic( + data: dco_decode_box_autoadd_transcript_dynamic_user_data(raw[1]), + ); + case 4: + return PosterType_TranscriptGradient( + colors: dco_decode_list_poster_color(raw[1]), ); default: throw Exception("unreachable"); @@ -16139,32 +19810,42 @@ class RustLibApiImpl extends RustLibApiImplPlatform implements RustLibApi { } @protected - void dco_decode_unit(dynamic raw) { - // Codec=Dco (DartCObject based), see doc to use other codecs - return; - } - - @protected - UnsendMessage dco_decode_unsend_message(dynamic raw) { + PRPosterColor dco_decode_pr_poster_color(dynamic raw) { // Codec=Dco (DartCObject based), see doc to use other codecs final arr = raw as List; - if (arr.length != 2) - throw Exception('unexpected arr length: expect 2 but see ${arr.length}'); - return UnsendMessage( - tuuid: dco_decode_String(arr[0]), - editPart: dco_decode_CastedPrimitive_u_64(arr[1]), + if (arr.length != 4) + throw Exception('unexpected arr length: expect 4 but see ${arr.length}'); + return PRPosterColor( + preferredStyle: dco_decode_u_32(arr[0]), + identifier: dco_decode_String(arr[1]), + suggested: dco_decode_bool(arr[2]), + color: dco_decode_ui_color(arr[3]), ); } @protected - UpdateAccountFinish dco_decode_update_account_finish(dynamic raw) { + PRPosterContentMaterialStyle dco_decode_pr_poster_content_material_style( + dynamic raw, + ) { // Codec=Dco (DartCObject based), see doc to use other codecs switch (raw[0]) { case 0: - return UpdateAccountFinish_MacOS(); + return PRPosterContentMaterialStyle_PRPosterContentDiscreteColorsStyle( + variation: dco_decode_f_32(raw[1]), + colors: dco_decode_list_ui_color(raw[2]), + vibrant: dco_decode_bool(raw[3]), + supportsVariation: dco_decode_bool(raw[4]), + needsToResolveVariation: dco_decode_bool(raw[5]), + ); case 1: - return UpdateAccountFinish_IOS( - url: dco_decode_String(raw[1]), + return PRPosterContentMaterialStyle_PRPosterContentVibrantMaterialStyle(); + case 2: + return PRPosterContentMaterialStyle_PRPosterContentGradientStyle( + gradientType: dco_decode_u_32(raw[1]), + colors: dco_decode_list_ui_color(raw[2]), + startPoint: dco_decode_String(raw[3]), + locations: dco_decode_list_prim_f_64_strict(raw[4]), + endPoint: dco_decode_String(raw[5]), ); default: throw Exception("unreachable"); @@ -16172,10950 +19853,17480 @@ class RustLibApiImpl extends RustLibApiImplPlatform implements RustLibApi { } @protected - UpdateExtensionMessage dco_decode_update_extension_message(dynamic raw) { + PRPosterSystemTimeFontConfiguration + dco_decode_pr_poster_system_time_font_configuration(dynamic raw) { // Codec=Dco (DartCObject based), see doc to use other codecs final arr = raw as List; - if (arr.length != 2) - throw Exception('unexpected arr length: expect 2 but see ${arr.length}'); - return UpdateExtensionMessage( - forUuid: dco_decode_String(arr[0]), - ext: dco_decode_part_extension(arr[1]), + if (arr.length != 3) + throw Exception('unexpected arr length: expect 3 but see ${arr.length}'); + return PRPosterSystemTimeFontConfiguration( + isSystemItem: dco_decode_bool(arr[0]), + timeFontIdentifier: dco_decode_String(arr[1]), + weight: dco_decode_f_64(arr[2]), ); } @protected - UpdateProfileMessage dco_decode_update_profile_message(dynamic raw) { + PRPosterTitleStyleConfiguration + dco_decode_pr_poster_title_style_configuration(dynamic raw) { // Codec=Dco (DartCObject based), see doc to use other codecs final arr = raw as List; - if (arr.length != 2) - throw Exception('unexpected arr length: expect 2 but see ${arr.length}'); - return UpdateProfileMessage( - profile: dco_decode_opt_box_autoadd_share_profile_message(arr[0]), - shareContacts: dco_decode_bool(arr[1]), + if (arr.length != 11) + throw Exception('unexpected arr length: expect 11 but see ${arr.length}'); + return PRPosterTitleStyleConfiguration( + alternateDateEnabled: dco_decode_bool(arr[0]), + contentsLuminence: dco_decode_f_64(arr[1]), + groupName: dco_decode_String(arr[2]), + preferredTitleAlignment: dco_decode_u_32(arr[3]), + preferredTitleLayout: dco_decode_u_32(arr[4]), + timeFontConfiguration: + dco_decode_pr_poster_system_time_font_configuration(arr[5]), + timeNumberingSystem: dco_decode_opt_list_prim_u_8_strict(arr[6]), + titleColor: dco_decode_pr_poster_color(arr[7]), + titleContentStyle: dco_decode_list_prim_u_8_strict(arr[8]), + userConfigured: dco_decode_bool(arr[9]), + titleStyle: dco_decode_opt_box_autoadd_pr_poster_content_material_style( + arr[10], + ), ); } @protected - UpdateProfileSharingMessage dco_decode_update_profile_sharing_message( - dynamic raw) { + PrivateDeviceInfo dco_decode_private_device_info(dynamic raw) { // Codec=Dco (DartCObject based), see doc to use other codecs final arr = raw as List; - if (arr.length != 3) - throw Exception('unexpected arr length: expect 3 but see ${arr.length}'); - return UpdateProfileSharingMessage( - sharedDismissed: dco_decode_list_String(arr[0]), - sharedAll: dco_decode_list_String(arr[1]), - version: dco_decode_CastedPrimitive_u_64(arr[2]), + if (arr.length != 6) + throw Exception('unexpected arr length: expect 6 but see ${arr.length}'); + return PrivateDeviceInfo( + uuid: dco_decode_opt_String(arr[0]), + deviceName: dco_decode_opt_String(arr[1]), + token: dco_decode_list_prim_u_8_strict(arr[2]), + isHsaTrusted: dco_decode_bool(arr[3]), + identites: dco_decode_list_String(arr[4]), + subServices: dco_decode_list_String(arr[5]), ); } @protected - BigInt dco_decode_usize(dynamic raw) { + ProvisionedFlavor dco_decode_provisioned_flavor(dynamic raw) { // Codec=Dco (DartCObject based), see doc to use other codecs - return dcoDecodeU64(raw); + return ProvisionedFlavor.values[raw as int]; } @protected - WallpaperMetadata dco_decode_wallpaper_metadata(dynamic raw) { + PushMessage dco_decode_push_message(dynamic raw) { // Codec=Dco (DartCObject based), see doc to use other codecs - final arr = raw as List; - if (arr.length != 7) - throw Exception('unexpected arr length: expect 7 but see ${arr.length}'); - return WallpaperMetadata( - backgroundColorKey: dco_decode_opt_box_autoadd_poster_color(arr[0]), - fontColorKey: dco_decode_poster_color(arr[1]), - fontNameKey: dco_decode_String(arr[2]), - fontSizeKey: dco_decode_f_32(arr[3]), - fontWeightKey: dco_decode_f_32(arr[4]), - isVerticalKey: dco_decode_bool(arr[5]), - typeKey: dco_decode_String(arr[6]), - ); + switch (raw[0]) { + case 0: + return PushMessage_IMessage( + dco_decode_box_autoadd_message_inst(raw[1]), + ); + case 1: + return PushMessage_SendConfirm( + uuid: dco_decode_String(raw[1]), + error: dco_decode_opt_String(raw[2]), + ); + case 2: + return PushMessage_RegistrationState( + dco_decode_box_autoadd_register_state(raw[1]), + ); + case 3: + return PushMessage_NewPhotostream( + dco_decode_box_autoadd_shared_album(raw[1]), + ); + case 4: + return PushMessage_FaceTime(dco_decode_box_autoadd_ft_message(raw[1])); + case 5: + return PushMessage_StatusUpdate( + dco_decode_box_autoadd_status_kit_message(raw[1]), + ); + case 6: + return PushMessage_Idms(dco_decode_box_autoadd_idms_message(raw[1])); + case 7: + return PushMessage_TwoFaAuthEvent(dco_decode_bool(raw[1])); + case 8: + return PushMessage_CircleFinishEvent(); + case 9: + return PushMessage_BeaconShared( + sender: dco_decode_String(raw[1]), + beacon: dco_decode_String(raw[2]), + attributes: dco_decode_box_autoadd_beacon_attributes(raw[3]), + ); + default: + throw Exception("unreachable"); + } } @protected - WatchBackground dco_decode_watch_background(dynamic raw) { + QuotaInfo dco_decode_quota_info(dynamic raw) { // Codec=Dco (DartCObject based), see doc to use other codecs final arr = raw as List; - if (arr.length != 4) - throw Exception('unexpected arr length: expect 4 but see ${arr.length}'); - return WatchBackground( - isHighKey: dco_decode_bool(arr[0]), - luminance: dco_decode_f_64(arr[1]), - backgroundImageData: dco_decode_list_prim_u_8_strict(arr[2]), - extensionIdentifier: dco_decode_String(arr[3]), + if (arr.length != 3) + throw Exception('unexpected arr length: expect 3 but see ${arr.length}'); + return QuotaInfo( + totalBytes: dco_decode_CastedPrimitive_u_64(arr[0]), + availableBytes: dco_decode_CastedPrimitive_u_64(arr[1]), + messagesBytes: dco_decode_CastedPrimitive_u_64(arr[2]), ); } @protected - WifiPassword dco_decode_wifi_password(dynamic raw) { + ReactMessage dco_decode_react_message(dynamic raw) { // Codec=Dco (DartCObject based), see doc to use other codecs final arr = raw as List; if (arr.length != 5) throw Exception('unexpected arr length: expect 5 but see ${arr.length}'); - return WifiPassword( - cdat: dco_decode_CastedPrimitive_u_64(arr[0]), - mdat: dco_decode_CastedPrimitive_u_64(arr[1]), - acct: dco_decode_String(arr[2]), - svce: dco_decode_String(arr[3]), - data: dco_decode_list_prim_u_8_strict(arr[4]), - ); - } - - @protected - AnyhowException sse_decode_AnyhowException(SseDeserializer deserializer) { - // Codec=Sse (Serialization based), see doc to use other codecs - var inner = sse_decode_String(deserializer); - return AnyhowException(inner); + return ReactMessage( + toUuid: dco_decode_String(arr[0]), + toPart: dco_decode_opt_CastedPrimitive_u_64(arr[1]), + reaction: dco_decode_react_message_type(arr[2]), + toText: dco_decode_String(arr[3]), + embeddedProfile: dco_decode_opt_box_autoadd_share_profile_message(arr[4]), + ); } @protected - ApsConnection - sse_decode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerAPSConnection( - SseDeserializer deserializer) { - // Codec=Sse (Serialization based), see doc to use other codecs - return ApsConnectionImpl.frbInternalSseDecode( - sse_decode_usize(deserializer), sse_decode_i_32(deserializer)); + ReactMessageType dco_decode_react_message_type(dynamic raw) { + // Codec=Dco (DartCObject based), see doc to use other codecs + switch (raw[0]) { + case 0: + return ReactMessageType_React( + reaction: dco_decode_box_autoadd_reaction(raw[1]), + enable: dco_decode_bool(raw[2]), + ); + case 1: + return ReactMessageType_Extension( + spec: dco_decode_box_autoadd_extension_app(raw[1]), + body: dco_decode_box_autoadd_message_parts(raw[2]), + isMeta: dco_decode_bool(raw[3]), + ); + default: + throw Exception("unreachable"); + } } @protected - ApsState - sse_decode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerAPSState( - SseDeserializer deserializer) { - // Codec=Sse (Serialization based), see doc to use other codecs - return ApsStateImpl.frbInternalSseDecode( - sse_decode_usize(deserializer), sse_decode_i_32(deserializer)); + Reaction dco_decode_reaction(dynamic raw) { + // Codec=Dco (DartCObject based), see doc to use other codecs + switch (raw[0]) { + case 0: + return Reaction_Heart(); + case 1: + return Reaction_Like(); + case 2: + return Reaction_Dislike(); + case 3: + return Reaction_Laugh(); + case 4: + return Reaction_Emphasize(); + case 5: + return Reaction_Question(); + case 6: + return Reaction_Emoji(dco_decode_String(raw[1])); + case 7: + return Reaction_Sticker( + spec: dco_decode_opt_box_autoadd_extension_app(raw[1]), + body: dco_decode_box_autoadd_message_parts(raw[2]), + ); + default: + throw Exception("unreachable"); + } } @protected - ApsWatcher - sse_decode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerAPSWatcher( - SseDeserializer deserializer) { - // Codec=Sse (Serialization based), see doc to use other codecs - return ApsWatcherImpl.frbInternalSseDecode( - sse_decode_usize(deserializer), sse_decode_i_32(deserializer)); + (ApsConnection, PushError?) + dco_decode_record_auto_owned_rust_opaque_flutter_rust_bridgefor_generated_rust_auto_opaque_inner_aps_connection_opt_box_autoadd_auto_owned_rust_opaque_flutter_rust_bridgefor_generated_rust_auto_opaque_inner_push_error( + dynamic raw, + ) { + // Codec=Dco (DartCObject based), see doc to use other codecs + final arr = raw as List; + if (arr.length != 2) { + throw Exception('Expected 2 elements, got ${arr.length}'); + } + return ( + dco_decode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerAPSConnection( + arr[0], + ), + dco_decode_opt_box_autoadd_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerPushError( + arr[1], + ), + ); } @protected - ArcAnisetteClientDefaultAnisetteProvider - sse_decode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcAnisetteClientDefaultAnisetteProvider( - SseDeserializer deserializer) { - // Codec=Sse (Serialization based), see doc to use other codecs - return ArcAnisetteClientDefaultAnisetteProviderImpl.frbInternalSseDecode( - sse_decode_usize(deserializer), sse_decode_i_32(deserializer)); + (ArcMutexAppleAccountDefaultAnisetteProvider, LoginState) + dco_decode_record_auto_owned_rust_opaque_flutter_rust_bridgefor_generated_rust_auto_opaque_inner_arc_mutex_apple_account_default_anisette_provider_login_state( + dynamic raw, + ) { + // Codec=Dco (DartCObject based), see doc to use other codecs + final arr = raw as List; + if (arr.length != 2) { + throw Exception('Expected 2 elements, got ${arr.length}'); + } + return ( + dco_decode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcMutexAppleAccountDefaultAnisetteProvider( + arr[0], + ), + dco_decode_login_state(arr[1]), + ); } @protected - ArcCloudKitClientDefaultAnisetteProvider - sse_decode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcCloudKitClientDefaultAnisetteProvider( - SseDeserializer deserializer) { - // Codec=Sse (Serialization based), see doc to use other codecs - return ArcCloudKitClientDefaultAnisetteProviderImpl.frbInternalSseDecode( - sse_decode_usize(deserializer), sse_decode_i_32(deserializer)); + (ArcSharedPushState, SharedPushState) + dco_decode_record_auto_owned_rust_opaque_flutter_rust_bridgefor_generated_rust_auto_opaque_inner_arc_shared_push_state_shared_push_state( + dynamic raw, + ) { + // Codec=Dco (DartCObject based), see doc to use other codecs + final arr = raw as List; + if (arr.length != 2) { + throw Exception('Expected 2 elements, got ${arr.length}'); + } + return ( + dco_decode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcSharedPushState( + arr[0], + ), + dco_decode_shared_push_state(arr[1]), + ); } @protected - ArcCloudMessagesClientDefaultAnisetteProvider - sse_decode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcCloudMessagesClientDefaultAnisetteProvider( - SseDeserializer deserializer) { - // Codec=Sse (Serialization based), see doc to use other codecs - return ArcCloudMessagesClientDefaultAnisetteProviderImpl - .frbInternalSseDecode( - sse_decode_usize(deserializer), sse_decode_i_32(deserializer)); + (CircleClientSessionDefaultAnisetteProvider, LoginState, String?) + dco_decode_record_auto_owned_rust_opaque_flutter_rust_bridgefor_generated_rust_auto_opaque_inner_circle_client_session_default_anisette_provider_login_state_opt_string( + dynamic raw, + ) { + // Codec=Dco (DartCObject based), see doc to use other codecs + final arr = raw as List; + if (arr.length != 3) { + throw Exception('Expected 3 elements, got ${arr.length}'); + } + return ( + dco_decode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerCircleClientSessionDefaultAnisetteProvider( + arr[0], + ), + dco_decode_login_state(arr[1]), + dco_decode_opt_String(arr[2]), + ); } @protected - ArcFtClient - sse_decode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcFTClient( - SseDeserializer deserializer) { - // Codec=Sse (Serialization based), see doc to use other codecs - return ArcFtClientImpl.frbInternalSseDecode( - sse_decode_usize(deserializer), sse_decode_i_32(deserializer)); + (Sender, ArcSenderPushMessage, ApsWatcher) + dco_decode_record_auto_owned_rust_opaque_flutter_rust_bridgefor_generated_rust_auto_opaque_inner_sender_auto_owned_rust_opaque_flutter_rust_bridgefor_generated_rust_auto_opaque_inner_arc_sender_push_message_auto_owned_rust_opaque_flutter_rust_bridgefor_generated_rust_auto_opaque_inner_aps_watcher( + dynamic raw, + ) { + // Codec=Dco (DartCObject based), see doc to use other codecs + final arr = raw as List; + if (arr.length != 3) { + throw Exception('Expected 3 elements, got ${arr.length}'); + } + return ( + dco_decode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerSender( + arr[0], + ), + dco_decode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcSenderPushMessage( + arr[1], + ), + dco_decode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerAPSWatcher( + arr[2], + ), + ); } @protected - ArcFindMyClientDefaultAnisetteProvider - sse_decode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcFindMyClientDefaultAnisetteProvider( - SseDeserializer deserializer) { - // Codec=Sse (Serialization based), see doc to use other codecs - return ArcFindMyClientDefaultAnisetteProviderImpl.frbInternalSseDecode( - sse_decode_usize(deserializer), sse_decode_i_32(deserializer)); + (Uint8List, Map, int) + dco_decode_record_list_prim_u_8_strict_map_string_opt_box_autoadd_cloud_attachment_i_32( + dynamic raw, + ) { + // Codec=Dco (DartCObject based), see doc to use other codecs + final arr = raw as List; + if (arr.length != 3) { + throw Exception('Expected 3 elements, got ${arr.length}'); + } + return ( + dco_decode_list_prim_u_8_strict(arr[0]), + dco_decode_Map_String_opt_box_autoadd_cloud_attachment(arr[1]), + dco_decode_i_32(arr[2]), + ); } @protected - ArcImClient - sse_decode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcIMClient( - SseDeserializer deserializer) { - // Codec=Sse (Serialization based), see doc to use other codecs - return ArcImClientImpl.frbInternalSseDecode( - sse_decode_usize(deserializer), sse_decode_i_32(deserializer)); + (Uint8List, Map, int) + dco_decode_record_list_prim_u_8_strict_map_string_opt_box_autoadd_cloud_chat_i_32( + dynamic raw, + ) { + // Codec=Dco (DartCObject based), see doc to use other codecs + final arr = raw as List; + if (arr.length != 3) { + throw Exception('Expected 3 elements, got ${arr.length}'); + } + return ( + dco_decode_list_prim_u_8_strict(arr[0]), + dco_decode_Map_String_opt_box_autoadd_cloud_chat(arr[1]), + dco_decode_i_32(arr[2]), + ); } @protected - ArcIdmsAuthListener - sse_decode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcIdmsAuthListener( - SseDeserializer deserializer) { - // Codec=Sse (Serialization based), see doc to use other codecs - return ArcIdmsAuthListenerImpl.frbInternalSseDecode( - sse_decode_usize(deserializer), sse_decode_i_32(deserializer)); + (Uint8List, Map, int) + dco_decode_record_list_prim_u_8_strict_map_string_opt_box_autoadd_cloud_message_i_32( + dynamic raw, + ) { + // Codec=Dco (DartCObject based), see doc to use other codecs + final arr = raw as List; + if (arr.length != 3) { + throw Exception('Expected 3 elements, got ${arr.length}'); + } + return ( + dco_decode_list_prim_u_8_strict(arr[0]), + dco_decode_Map_String_opt_box_autoadd_cloud_message(arr[1]), + dco_decode_i_32(arr[2]), + ); } @protected - ArcKeychainClientDefaultAnisetteProvider - sse_decode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcKeychainClientDefaultAnisetteProvider( - SseDeserializer deserializer) { - // Codec=Sse (Serialization based), see doc to use other codecs - return ArcKeychainClientDefaultAnisetteProviderImpl.frbInternalSseDecode( - sse_decode_usize(deserializer), sse_decode_i_32(deserializer)); + (Uint8List, Uint8List?) + dco_decode_record_list_prim_u_8_strict_opt_list_prim_u_8_strict(dynamic raw) { + // Codec=Dco (DartCObject based), see doc to use other codecs + final arr = raw as List; + if (arr.length != 2) { + throw Exception('Expected 2 elements, got ${arr.length}'); + } + return ( + dco_decode_list_prim_u_8_strict(arr[0]), + dco_decode_opt_list_prim_u_8_strict(arr[1]), + ); } @protected - ArcMutexAppleAccountDefaultAnisetteProvider - sse_decode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcMutexAppleAccountDefaultAnisetteProvider( - SseDeserializer deserializer) { - // Codec=Sse (Serialization based), see doc to use other codecs - return ArcMutexAppleAccountDefaultAnisetteProviderImpl.frbInternalSseDecode( - sse_decode_usize(deserializer), sse_decode_i_32(deserializer)); + (List, List) + dco_decode_record_list_shared_album_list_string(dynamic raw) { + // Codec=Dco (DartCObject based), see doc to use other codecs + final arr = raw as List; + if (arr.length != 2) { + throw Exception('Expected 2 elements, got ${arr.length}'); + } + return ( + dco_decode_list_shared_album(arr[0]), + dco_decode_list_String(arr[1]), + ); } @protected - ArcMutexOptionCircleClientSessionDefaultAnisetteProvider - sse_decode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcMutexOptionCircleClientSessionDefaultAnisetteProvider( - SseDeserializer deserializer) { - // Codec=Sse (Serialization based), see doc to use other codecs - return ArcMutexOptionCircleClientSessionDefaultAnisetteProviderImpl - .frbInternalSseDecode( - sse_decode_usize(deserializer), sse_decode_i_32(deserializer)); + (List, LoginState?) + dco_decode_record_list_trusted_phone_number_opt_box_autoadd_login_state( + dynamic raw, + ) { + // Codec=Dco (DartCObject based), see doc to use other codecs + final arr = raw as List; + if (arr.length != 2) { + throw Exception('Expected 2 elements, got ${arr.length}'); + } + return ( + dco_decode_list_trusted_phone_number(arr[0]), + dco_decode_opt_box_autoadd_login_state(arr[1]), + ); } @protected - ArcMutexVecActiveCircleSession - sse_decode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcMutexVecActiveCircleSession( - SseDeserializer deserializer) { - // Codec=Sse (Serialization based), see doc to use other codecs - return ArcMutexVecActiveCircleSessionImpl.frbInternalSseDecode( - sse_decode_usize(deserializer), sse_decode_i_32(deserializer)); + (LoginState, IdsUser?) + dco_decode_record_login_state_opt_box_autoadd_auto_owned_rust_opaque_flutter_rust_bridgefor_generated_rust_auto_opaque_inner_ids_user( + dynamic raw, + ) { + // Codec=Dco (DartCObject based), see doc to use other codecs + final arr = raw as List; + if (arr.length != 2) { + throw Exception('Expected 2 elements, got ${arr.length}'); + } + return ( + dco_decode_login_state(arr[0]), + dco_decode_opt_box_autoadd_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerIDSUser( + arr[1], + ), + ); } @protected - ArcPasswordManagerDefaultAnisetteProvider - sse_decode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcPasswordManagerDefaultAnisetteProvider( - SseDeserializer deserializer) { - // Codec=Sse (Serialization based), see doc to use other codecs - return ArcPasswordManagerDefaultAnisetteProviderImpl.frbInternalSseDecode( - sse_decode_usize(deserializer), sse_decode_i_32(deserializer)); + (Map, (String, BigInt)?) + dco_decode_record_map_string_sync_status_opt_box_autoadd_record_string_u_64( + dynamic raw, + ) { + // Codec=Dco (DartCObject based), see doc to use other codecs + final arr = raw as List; + if (arr.length != 2) { + throw Exception('Expected 2 elements, got ${arr.length}'); + } + return ( + dco_decode_Map_String_sync_status(arr[0]), + dco_decode_opt_box_autoadd_record_string_u_64(arr[1]), + ); } @protected - ArcProfilesClientDefaultAnisetteProvider - sse_decode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcProfilesClientDefaultAnisetteProvider( - SseDeserializer deserializer) { - // Codec=Sse (Serialization based), see doc to use other codecs - return ArcProfilesClientDefaultAnisetteProviderImpl.frbInternalSseDecode( - sse_decode_usize(deserializer), sse_decode_i_32(deserializer)); + (List?, SupportAlert?) + dco_decode_record_opt_list_auto_owned_rust_opaque_flutter_rust_bridgefor_generated_rust_auto_opaque_inner_ids_user_opt_box_autoadd_support_alert( + dynamic raw, + ) { + // Codec=Dco (DartCObject based), see doc to use other codecs + final arr = raw as List; + if (arr.length != 2) { + throw Exception('Expected 2 elements, got ${arr.length}'); + } + return ( + dco_decode_opt_list_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerIDSUser( + arr[0], + ), + dco_decode_opt_box_autoadd_support_alert(arr[1]), + ); } @protected - ArcSenderPushMessage - sse_decode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcSenderPushMessage( - SseDeserializer deserializer) { - // Codec=Sse (Serialization based), see doc to use other codecs - return ArcSenderPushMessageImpl.frbInternalSseDecode( - sse_decode_usize(deserializer), sse_decode_i_32(deserializer)); + (String?, Passkey) dco_decode_record_opt_string_passkey(dynamic raw) { + // Codec=Dco (DartCObject based), see doc to use other codecs + final arr = raw as List; + if (arr.length != 2) { + throw Exception('Expected 2 elements, got ${arr.length}'); + } + return (dco_decode_opt_String(arr[0]), dco_decode_passkey(arr[1])); } @protected - ArcSharedPushState - sse_decode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcSharedPushState( - SseDeserializer deserializer) { - // Codec=Sse (Serialization based), see doc to use other codecs - return ArcSharedPushStateImpl.frbInternalSseDecode( - sse_decode_usize(deserializer), sse_decode_i_32(deserializer)); + (String?, PasswordManagerMeta) + dco_decode_record_opt_string_password_manager_meta(dynamic raw) { + // Codec=Dco (DartCObject based), see doc to use other codecs + final arr = raw as List; + if (arr.length != 2) { + throw Exception('Expected 2 elements, got ${arr.length}'); + } + return ( + dco_decode_opt_String(arr[0]), + dco_decode_password_manager_meta(arr[1]), + ); } @protected - ArcStatusKitClientDefaultAnisetteProvider - sse_decode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcStatusKitClientDefaultAnisetteProvider( - SseDeserializer deserializer) { - // Codec=Sse (Serialization based), see doc to use other codecs - return ArcStatusKitClientDefaultAnisetteProviderImpl.frbInternalSseDecode( - sse_decode_usize(deserializer), sse_decode_i_32(deserializer)); + (String?, PasswordRawEntry) dco_decode_record_opt_string_password_raw_entry( + dynamic raw, + ) { + // Codec=Dco (DartCObject based), see doc to use other codecs + final arr = raw as List; + if (arr.length != 2) { + throw Exception('Expected 2 elements, got ${arr.length}'); + } + return ( + dco_decode_opt_String(arr[0]), + dco_decode_password_raw_entry(arr[1]), + ); } @protected - ArcTokenProviderDefaultAnisetteProvider - sse_decode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcTokenProviderDefaultAnisetteProvider( - SseDeserializer deserializer) { - // Codec=Sse (Serialization based), see doc to use other codecs - return ArcTokenProviderDefaultAnisetteProviderImpl.frbInternalSseDecode( - sse_decode_usize(deserializer), sse_decode_i_32(deserializer)); + (String?, WifiPassword) dco_decode_record_opt_string_wifi_password( + dynamic raw, + ) { + // Codec=Dco (DartCObject based), see doc to use other codecs + final arr = raw as List; + if (arr.length != 2) { + throw Exception('Expected 2 elements, got ${arr.length}'); + } + return (dco_decode_opt_String(arr[0]), dco_decode_wifi_password(arr[1])); } @protected - Asset - sse_decode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerAsset( - SseDeserializer deserializer) { - // Codec=Sse (Serialization based), see doc to use other codecs - return AssetImpl.frbInternalSseDecode( - sse_decode_usize(deserializer), sse_decode_i_32(deserializer)); + (SharedPushState, ApsWatcher) + dco_decode_record_shared_push_state_auto_owned_rust_opaque_flutter_rust_bridgefor_generated_rust_auto_opaque_inner_aps_watcher( + dynamic raw, + ) { + // Codec=Dco (DartCObject based), see doc to use other codecs + final arr = raw as List; + if (arr.length != 2) { + throw Exception('Expected 2 elements, got ${arr.length}'); + } + return ( + dco_decode_shared_push_state(arr[0]), + dco_decode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerAPSWatcher( + arr[1], + ), + ); } @protected - ChannelInterestToken - sse_decode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerChannelInterestToken( - SseDeserializer deserializer) { - // Codec=Sse (Serialization based), see doc to use other codecs - return ChannelInterestTokenImpl.frbInternalSseDecode( - sse_decode_usize(deserializer), sse_decode_i_32(deserializer)); + (String, Asset) + dco_decode_record_string_auto_owned_rust_opaque_flutter_rust_bridgefor_generated_rust_auto_opaque_inner_asset( + dynamic raw, + ) { + // Codec=Dco (DartCObject based), see doc to use other codecs + final arr = raw as List; + if (arr.length != 2) { + throw Exception('Expected 2 elements, got ${arr.length}'); + } + return ( + dco_decode_String(arr[0]), + dco_decode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerAsset( + arr[1], + ), + ); } @protected - CircleClientSessionDefaultAnisetteProvider - sse_decode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerCircleClientSessionDefaultAnisetteProvider( - SseDeserializer deserializer) { - // Codec=Sse (Serialization based), see doc to use other codecs - return CircleClientSessionDefaultAnisetteProviderImpl.frbInternalSseDecode( - sse_decode_usize(deserializer), sse_decode_i_32(deserializer)); + (String, StCollapsedValue) + dco_decode_record_string_auto_owned_rust_opaque_flutter_rust_bridgefor_generated_rust_auto_opaque_inner_st_collapsed_value( + dynamic raw, + ) { + // Codec=Dco (DartCObject based), see doc to use other codecs + final arr = raw as List; + if (arr.length != 2) { + throw Exception('Expected 2 elements, got ${arr.length}'); + } + return ( + dco_decode_String(arr[0]), + dco_decode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerStCollapsedValue( + arr[1], + ), + ); } @protected - ConversationLink - sse_decode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerConversationLink( - SseDeserializer deserializer) { - // Codec=Sse (Serialization based), see doc to use other codecs - return ConversationLinkImpl.frbInternalSseDecode( - sse_decode_usize(deserializer), sse_decode_i_32(deserializer)); + (String, bool) dco_decode_record_string_bool(dynamic raw) { + // Codec=Dco (DartCObject based), see doc to use other codecs + final arr = raw as List; + if (arr.length != 2) { + throw Exception('Expected 2 elements, got ${arr.length}'); + } + return (dco_decode_String(arr[0]), dco_decode_bool(arr[1])); } @protected - ConversationParticipant - sse_decode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerConversationParticipant( - SseDeserializer deserializer) { - // Codec=Sse (Serialization based), see doc to use other codecs - return ConversationParticipantImpl.frbInternalSseDecode( - sse_decode_usize(deserializer), sse_decode_i_32(deserializer)); + (String, int) dco_decode_record_string_casted_primitive_u_64(dynamic raw) { + // Codec=Dco (DartCObject based), see doc to use other codecs + final arr = raw as List; + if (arr.length != 2) { + throw Exception('Expected 2 elements, got ${arr.length}'); + } + return (dco_decode_String(arr[0]), dco_decode_CastedPrimitive_u_64(arr[1])); } @protected - Date - sse_decode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerDate( - SseDeserializer deserializer) { - // Codec=Sse (Serialization based), see doc to use other codecs - return DateImpl.frbInternalSseDecode( - sse_decode_usize(deserializer), sse_decode_i_32(deserializer)); + (String, CloudAttachment) dco_decode_record_string_cloud_attachment( + dynamic raw, + ) { + // Codec=Dco (DartCObject based), see doc to use other codecs + final arr = raw as List; + if (arr.length != 2) { + throw Exception('Expected 2 elements, got ${arr.length}'); + } + return (dco_decode_String(arr[0]), dco_decode_cloud_attachment(arr[1])); } @protected - EscrowData - sse_decode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerEscrowData( - SseDeserializer deserializer) { - // Codec=Sse (Serialization based), see doc to use other codecs - return EscrowDataImpl.frbInternalSseDecode( - sse_decode_usize(deserializer), sse_decode_i_32(deserializer)); + (String, CloudChat) dco_decode_record_string_cloud_chat(dynamic raw) { + // Codec=Dco (DartCObject based), see doc to use other codecs + final arr = raw as List; + if (arr.length != 2) { + throw Exception('Expected 2 elements, got ${arr.length}'); + } + return (dco_decode_String(arr[0]), dco_decode_cloud_chat(arr[1])); } @protected - FindMyFriendsClientDefaultAnisetteProvider - sse_decode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerFindMyFriendsClientDefaultAnisetteProvider( - SseDeserializer deserializer) { - // Codec=Sse (Serialization based), see doc to use other codecs - return FindMyFriendsClientDefaultAnisetteProviderImpl.frbInternalSseDecode( - sse_decode_usize(deserializer), sse_decode_i_32(deserializer)); + (String, CloudMessage) dco_decode_record_string_cloud_message(dynamic raw) { + // Codec=Dco (DartCObject based), see doc to use other codecs + final arr = raw as List; + if (arr.length != 2) { + throw Exception('Expected 2 elements, got ${arr.length}'); + } + return (dco_decode_String(arr[0]), dco_decode_cloud_message(arr[1])); } @protected - FindMyPhoneClientDefaultAnisetteProvider - sse_decode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerFindMyPhoneClientDefaultAnisetteProvider( - SseDeserializer deserializer) { - // Codec=Sse (Serialization based), see doc to use other codecs - return FindMyPhoneClientDefaultAnisetteProviderImpl.frbInternalSseDecode( - sse_decode_usize(deserializer), sse_decode_i_32(deserializer)); + (String, FTParticipant) dco_decode_record_string_ft_participant(dynamic raw) { + // Codec=Dco (DartCObject based), see doc to use other codecs + final arr = raw as List; + if (arr.length != 2) { + throw Exception('Expected 2 elements, got ${arr.length}'); + } + return (dco_decode_String(arr[0]), dco_decode_ft_participant(arr[1])); } @protected - GZipWrapperAttachmentMeta - sse_decode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerGZipWrapperAttachmentMeta( - SseDeserializer deserializer) { - // Codec=Sse (Serialization based), see doc to use other codecs - return GZipWrapperAttachmentMetaImpl.frbInternalSseDecode( - sse_decode_usize(deserializer), sse_decode_i_32(deserializer)); + (String, GroupSummary) dco_decode_record_string_group_summary(dynamic raw) { + // Codec=Dco (DartCObject based), see doc to use other codecs + final arr = raw as List; + if (arr.length != 2) { + throw Exception('Expected 2 elements, got ${arr.length}'); + } + return (dco_decode_String(arr[0]), dco_decode_group_summary(arr[1])); } @protected - GZipWrapperChatProto - sse_decode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerGZipWrapperChatProto( - SseDeserializer deserializer) { - // Codec=Sse (Serialization based), see doc to use other codecs - return GZipWrapperChatProtoImpl.frbInternalSseDecode( - sse_decode_usize(deserializer), sse_decode_i_32(deserializer)); + (String, List) dco_decode_record_string_list_message_edit( + dynamic raw, + ) { + // Codec=Dco (DartCObject based), see doc to use other codecs + final arr = raw as List; + if (arr.length != 2) { + throw Exception('Expected 2 elements, got ${arr.length}'); + } + return (dco_decode_String(arr[0]), dco_decode_list_message_edit(arr[1])); } @protected - GZipWrapperMessageProto - sse_decode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerGZipWrapperMessageProto( - SseDeserializer deserializer) { - // Codec=Sse (Serialization based), see doc to use other codecs - return GZipWrapperMessageProtoImpl.frbInternalSseDecode( - sse_decode_usize(deserializer), sse_decode_i_32(deserializer)); + (String, Uint8List) dco_decode_record_string_list_prim_u_8_strict( + dynamic raw, + ) { + // Codec=Dco (DartCObject based), see doc to use other codecs + final arr = raw as List; + if (arr.length != 2) { + throw Exception('Expected 2 elements, got ${arr.length}'); + } + return (dco_decode_String(arr[0]), dco_decode_list_prim_u_8_strict(arr[1])); } @protected - GZipWrapperMessageProto2 - sse_decode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerGZipWrapperMessageProto2( - SseDeserializer deserializer) { - // Codec=Sse (Serialization based), see doc to use other codecs - return GZipWrapperMessageProto2Impl.frbInternalSseDecode( - sse_decode_usize(deserializer), sse_decode_i_32(deserializer)); + (String, Map, Map) + dco_decode_record_string_map_string_group_summary_map_string_share_invite_content_data( + dynamic raw, + ) { + // Codec=Dco (DartCObject based), see doc to use other codecs + final arr = raw as List; + if (arr.length != 3) { + throw Exception('Expected 3 elements, got ${arr.length}'); + } + return ( + dco_decode_String(arr[0]), + dco_decode_Map_String_group_summary(arr[1]), + dco_decode_Map_String_share_invite_content_data(arr[2]), + ); } @protected - GZipWrapperMessageProto3 - sse_decode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerGZipWrapperMessageProto3( - SseDeserializer deserializer) { - // Codec=Sse (Serialization based), see doc to use other codecs - return GZipWrapperMessageProto3Impl.frbInternalSseDecode( - sse_decode_usize(deserializer), sse_decode_i_32(deserializer)); + (String, MessageEditRange) dco_decode_record_string_message_edit_range( + dynamic raw, + ) { + // Codec=Dco (DartCObject based), see doc to use other codecs + final arr = raw as List; + if (arr.length != 2) { + throw Exception('Expected 2 elements, got ${arr.length}'); + } + return (dco_decode_String(arr[0]), dco_decode_message_edit_range(arr[1])); } @protected - GZipWrapperMessageProto4 - sse_decode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerGZipWrapperMessageProto4( - SseDeserializer deserializer) { - // Codec=Sse (Serialization based), see doc to use other codecs - return GZipWrapperMessageProto4Impl.frbInternalSseDecode( - sse_decode_usize(deserializer), sse_decode_i_32(deserializer)); + (String, CloudAttachment?) + dco_decode_record_string_opt_box_autoadd_cloud_attachment(dynamic raw) { + // Codec=Dco (DartCObject based), see doc to use other codecs + final arr = raw as List; + if (arr.length != 2) { + throw Exception('Expected 2 elements, got ${arr.length}'); + } + return ( + dco_decode_String(arr[0]), + dco_decode_opt_box_autoadd_cloud_attachment(arr[1]), + ); } @protected - IdsngmIdentity - sse_decode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerIDSNGMIdentity( - SseDeserializer deserializer) { - // Codec=Sse (Serialization based), see doc to use other codecs - return IdsngmIdentityImpl.frbInternalSseDecode( - sse_decode_usize(deserializer), sse_decode_i_32(deserializer)); + (String, CloudChat?) dco_decode_record_string_opt_box_autoadd_cloud_chat( + dynamic raw, + ) { + // Codec=Dco (DartCObject based), see doc to use other codecs + final arr = raw as List; + if (arr.length != 2) { + throw Exception('Expected 2 elements, got ${arr.length}'); + } + return ( + dco_decode_String(arr[0]), + dco_decode_opt_box_autoadd_cloud_chat(arr[1]), + ); } @protected - IdsUser - sse_decode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerIDSUser( - SseDeserializer deserializer) { - // Codec=Sse (Serialization based), see doc to use other codecs - return IdsUserImpl.frbInternalSseDecode( - sse_decode_usize(deserializer), sse_decode_i_32(deserializer)); + (String, CloudMessage?) + dco_decode_record_string_opt_box_autoadd_cloud_message(dynamic raw) { + // Codec=Dco (DartCObject based), see doc to use other codecs + final arr = raw as List; + if (arr.length != 2) { + throw Exception('Expected 2 elements, got ${arr.length}'); + } + return ( + dco_decode_String(arr[0]), + dco_decode_opt_box_autoadd_cloud_message(arr[1]), + ); } @protected - JoinedOsConfig - sse_decode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerJoinedOSConfig( - SseDeserializer deserializer) { - // Codec=Sse (Serialization based), see doc to use other codecs - return JoinedOsConfigImpl.frbInternalSseDecode( - sse_decode_usize(deserializer), sse_decode_i_32(deserializer)); + (String, PasswordManagerMetaDataCtx) + dco_decode_record_string_password_manager_meta_data_ctx(dynamic raw) { + // Codec=Dco (DartCObject based), see doc to use other codecs + final arr = raw as List; + if (arr.length != 2) { + throw Exception('Expected 2 elements, got ${arr.length}'); + } + return ( + dco_decode_String(arr[0]), + dco_decode_password_manager_meta_data_ctx(arr[1]), + ); } @protected - LocationReport - sse_decode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerLocationReport( - SseDeserializer deserializer) { - // Codec=Sse (Serialization based), see doc to use other codecs - return LocationReportImpl.frbInternalSseDecode( - sse_decode_usize(deserializer), sse_decode_i_32(deserializer)); + (String, (String?, Passkey)) + dco_decode_record_string_record_opt_string_passkey(dynamic raw) { + // Codec=Dco (DartCObject based), see doc to use other codecs + final arr = raw as List; + if (arr.length != 2) { + throw Exception('Expected 2 elements, got ${arr.length}'); + } + return ( + dco_decode_String(arr[0]), + dco_decode_record_opt_string_passkey(arr[1]), + ); } @protected - MessageFlags - sse_decode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerMessageFlags( - SseDeserializer deserializer) { - // Codec=Sse (Serialization based), see doc to use other codecs - return MessageFlagsImpl.frbInternalSseDecode( - sse_decode_usize(deserializer), sse_decode_i_32(deserializer)); + (String, (String?, PasswordManagerMeta)) + dco_decode_record_string_record_opt_string_password_manager_meta( + dynamic raw, + ) { + // Codec=Dco (DartCObject based), see doc to use other codecs + final arr = raw as List; + if (arr.length != 2) { + throw Exception('Expected 2 elements, got ${arr.length}'); + } + return ( + dco_decode_String(arr[0]), + dco_decode_record_opt_string_password_manager_meta(arr[1]), + ); } @protected - NsArrayLpIconMetadata - sse_decode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerNSArrayLPIconMetadata( - SseDeserializer deserializer) { - // Codec=Sse (Serialization based), see doc to use other codecs - return NsArrayLpIconMetadataImpl.frbInternalSseDecode( - sse_decode_usize(deserializer), sse_decode_i_32(deserializer)); - } - - @protected - NsArrayLpImageMetadata - sse_decode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerNSArrayLPImageMetadata( - SseDeserializer deserializer) { - // Codec=Sse (Serialization based), see doc to use other codecs - return NsArrayLpImageMetadataImpl.frbInternalSseDecode( - sse_decode_usize(deserializer), sse_decode_i_32(deserializer)); - } - - @protected - PushError - sse_decode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerPushError( - SseDeserializer deserializer) { - // Codec=Sse (Serialization based), see doc to use other codecs - return PushErrorImpl.frbInternalSseDecode( - sse_decode_usize(deserializer), sse_decode_i_32(deserializer)); + (String, (String?, PasswordRawEntry)) + dco_decode_record_string_record_opt_string_password_raw_entry(dynamic raw) { + // Codec=Dco (DartCObject based), see doc to use other codecs + final arr = raw as List; + if (arr.length != 2) { + throw Exception('Expected 2 elements, got ${arr.length}'); + } + return ( + dco_decode_String(arr[0]), + dco_decode_record_opt_string_password_raw_entry(arr[1]), + ); } @protected - ReceiverApsMessage - sse_decode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerReceiverAPSMessage( - SseDeserializer deserializer) { - // Codec=Sse (Serialization based), see doc to use other codecs - return ReceiverApsMessageImpl.frbInternalSseDecode( - sse_decode_usize(deserializer), sse_decode_i_32(deserializer)); + (String, (String?, WifiPassword)) + dco_decode_record_string_record_opt_string_wifi_password(dynamic raw) { + // Codec=Dco (DartCObject based), see doc to use other codecs + final arr = raw as List; + if (arr.length != 2) { + throw Exception('Expected 2 elements, got ${arr.length}'); + } + return ( + dco_decode_String(arr[0]), + dco_decode_record_opt_string_wifi_password(arr[1]), + ); } @protected - SavedHardwareState - sse_decode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerSavedHardwareState( - SseDeserializer deserializer) { - // Codec=Sse (Serialization based), see doc to use other codecs - return SavedHardwareStateImpl.frbInternalSseDecode( - sse_decode_usize(deserializer), sse_decode_i_32(deserializer)); + (String, ShareInviteContentData) + dco_decode_record_string_share_invite_content_data(dynamic raw) { + // Codec=Dco (DartCObject based), see doc to use other codecs + final arr = raw as List; + if (arr.length != 2) { + throw Exception('Expected 2 elements, got ${arr.length}'); + } + return ( + dco_decode_String(arr[0]), + dco_decode_share_invite_content_data(arr[1]), + ); } @protected - Sender - sse_decode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerSender( - SseDeserializer deserializer) { - // Codec=Sse (Serialization based), see doc to use other codecs - return SenderImpl.frbInternalSseDecode( - sse_decode_usize(deserializer), sse_decode_i_32(deserializer)); + (String, SharedPushState) dco_decode_record_string_shared_push_state( + dynamic raw, + ) { + // Codec=Dco (DartCObject based), see doc to use other codecs + final arr = raw as List; + if (arr.length != 2) { + throw Exception('Expected 2 elements, got ${arr.length}'); + } + return (dco_decode_String(arr[0]), dco_decode_shared_push_state(arr[1])); } @protected - StCollapsedValue - sse_decode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerStCollapsedValue( - SseDeserializer deserializer) { - // Codec=Sse (Serialization based), see doc to use other codecs - return StCollapsedValueImpl.frbInternalSseDecode( - sse_decode_usize(deserializer), sse_decode_i_32(deserializer)); + (String, StatusKitPersonalConfig) + dco_decode_record_string_status_kit_personal_config(dynamic raw) { + // Codec=Dco (DartCObject based), see doc to use other codecs + final arr = raw as List; + if (arr.length != 2) { + throw Exception('Expected 2 elements, got ${arr.length}'); + } + return ( + dco_decode_String(arr[0]), + dco_decode_status_kit_personal_config(arr[1]), + ); } @protected - SyncManagerDefaultAnisetteProviderMyFilePackager - sse_decode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerSyncManagerDefaultAnisetteProviderMyFilePackager( - SseDeserializer deserializer) { - // Codec=Sse (Serialization based), see doc to use other codecs - return SyncManagerDefaultAnisetteProviderMyFilePackagerImpl - .frbInternalSseDecode( - sse_decode_usize(deserializer), sse_decode_i_32(deserializer)); + (String, String) dco_decode_record_string_string(dynamic raw) { + // Codec=Dco (DartCObject based), see doc to use other codecs + final arr = raw as List; + if (arr.length != 2) { + throw Exception('Expected 2 elements, got ${arr.length}'); + } + return (dco_decode_String(arr[0]), dco_decode_String(arr[1])); } @protected - SystemTime - sse_decode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerSystemTime( - SseDeserializer deserializer) { - // Codec=Sse (Serialization based), see doc to use other codecs - return SystemTimeImpl.frbInternalSseDecode( - sse_decode_usize(deserializer), sse_decode_i_32(deserializer)); + (String, SyncStatus) dco_decode_record_string_sync_status(dynamic raw) { + // Codec=Dco (DartCObject based), see doc to use other codecs + final arr = raw as List; + if (arr.length != 2) { + throw Exception('Expected 2 elements, got ${arr.length}'); + } + return (dco_decode_String(arr[0]), dco_decode_sync_status(arr[1])); } @protected - VerifyBody - sse_decode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerVerifyBody( - SseDeserializer deserializer) { - // Codec=Sse (Serialization based), see doc to use other codecs - return VerifyBodyImpl.frbInternalSseDecode( - sse_decode_usize(deserializer), sse_decode_i_32(deserializer)); + (String, BigInt) dco_decode_record_string_u_64(dynamic raw) { + // Codec=Dco (DartCObject based), see doc to use other codecs + final arr = raw as List; + if (arr.length != 2) { + throw Exception('Expected 2 elements, got ${arr.length}'); + } + return (dco_decode_String(arr[0]), dco_decode_u_64(arr[1])); } @protected - ViableBottle - sse_decode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerViableBottle( - SseDeserializer deserializer) { - // Codec=Sse (Serialization based), see doc to use other codecs - return ViableBottleImpl.frbInternalSseDecode( - sse_decode_usize(deserializer), sse_decode_i_32(deserializer)); + (String, UpdateAccountFinish) dco_decode_record_string_update_account_finish( + dynamic raw, + ) { + // Codec=Dco (DartCObject based), see doc to use other codecs + final arr = raw as List; + if (arr.length != 2) { + throw Exception('Expected 2 elements, got ${arr.length}'); + } + return ( + dco_decode_String(arr[0]), + dco_decode_update_account_finish(arr[1]), + ); } @protected - ApsWatcher - sse_decode_Auto_RefMut_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerAPSWatcher( - SseDeserializer deserializer) { - // Codec=Sse (Serialization based), see doc to use other codecs - return ApsWatcherImpl.frbInternalSseDecode( - sse_decode_usize(deserializer), sse_decode_i_32(deserializer)); + (int, NSDictionaryTypedCoder) + dco_decode_record_u_32_ns_dictionary_typed_coder(dynamic raw) { + // Codec=Dco (DartCObject based), see doc to use other codecs + final arr = raw as List; + if (arr.length != 2) { + throw Exception('Expected 2 elements, got ${arr.length}'); + } + return ( + dco_decode_u_32(arr[0]), + dco_decode_ns_dictionary_typed_coder(arr[1]), + ); } @protected - CircleClientSessionDefaultAnisetteProvider - sse_decode_Auto_RefMut_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerCircleClientSessionDefaultAnisetteProvider( - SseDeserializer deserializer) { - // Codec=Sse (Serialization based), see doc to use other codecs - return CircleClientSessionDefaultAnisetteProviderImpl.frbInternalSseDecode( - sse_decode_usize(deserializer), sse_decode_i_32(deserializer)); + (int, BigInt) dco_decode_record_u_32_u_64(dynamic raw) { + // Codec=Dco (DartCObject based), see doc to use other codecs + final arr = raw as List; + if (arr.length != 2) { + throw Exception('Expected 2 elements, got ${arr.length}'); + } + return (dco_decode_u_32(arr[0]), dco_decode_u_64(arr[1])); } @protected - FindMyFriendsClientDefaultAnisetteProvider - sse_decode_Auto_RefMut_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerFindMyFriendsClientDefaultAnisetteProvider( - SseDeserializer deserializer) { - // Codec=Sse (Serialization based), see doc to use other codecs - return FindMyFriendsClientDefaultAnisetteProviderImpl.frbInternalSseDecode( - sse_decode_usize(deserializer), sse_decode_i_32(deserializer)); + RegisterState dco_decode_register_state(dynamic raw) { + // Codec=Dco (DartCObject based), see doc to use other codecs + switch (raw[0]) { + case 0: + return RegisterState_Registered(nextS: dco_decode_i_64(raw[1])); + case 1: + return RegisterState_Registering(); + case 2: + return RegisterState_Failed( + retryWait: dco_decode_opt_box_autoadd_u_64(raw[1]), + error: dco_decode_String(raw[2]), + ); + default: + throw Exception("unreachable"); + } } @protected - FindMyPhoneClientDefaultAnisetteProvider - sse_decode_Auto_RefMut_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerFindMyPhoneClientDefaultAnisetteProvider( - SseDeserializer deserializer) { - // Codec=Sse (Serialization based), see doc to use other codecs - return FindMyPhoneClientDefaultAnisetteProviderImpl.frbInternalSseDecode( - sse_decode_usize(deserializer), sse_decode_i_32(deserializer)); + RenameMessage dco_decode_rename_message(dynamic raw) { + // Codec=Dco (DartCObject based), see doc to use other codecs + final arr = raw as List; + if (arr.length != 1) + throw Exception('unexpected arr length: expect 1 but see ${arr.length}'); + return RenameMessage(newName: dco_decode_String(arr[0])); } @protected - LocationReport - sse_decode_Auto_RefMut_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerLocationReport( - SseDeserializer deserializer) { - // Codec=Sse (Serialization based), see doc to use other codecs - return LocationReportImpl.frbInternalSseDecode( - sse_decode_usize(deserializer), sse_decode_i_32(deserializer)); + ReportMessage dco_decode_report_message(dynamic raw) { + // Codec=Dco (DartCObject based), see doc to use other codecs + final arr = raw as List; + if (arr.length != 5) + throw Exception('unexpected arr length: expect 5 but see ${arr.length}'); + return ReportMessage( + guid: dco_decode_String(arr[0]), + sender: dco_decode_String(arr[1]), + conversationSize: dco_decode_u_32(arr[2]), + parts: dco_decode_message_parts(arr[3]), + timeOfMessage: dco_decode_f_64(arr[4]), + ); } @protected - ReceiverApsMessage - sse_decode_Auto_RefMut_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerReceiverAPSMessage( - SseDeserializer deserializer) { - // Codec=Sse (Serialization based), see doc to use other codecs - return ReceiverApsMessageImpl.frbInternalSseDecode( - sse_decode_usize(deserializer), sse_decode_i_32(deserializer)); + RichLinkImageAttachmentSubstitute + dco_decode_rich_link_image_attachment_substitute(dynamic raw) { + // Codec=Dco (DartCObject based), see doc to use other codecs + final arr = raw as List; + if (arr.length != 2) + throw Exception('unexpected arr length: expect 2 but see ${arr.length}'); + return RichLinkImageAttachmentSubstitute( + mimeType: dco_decode_String(arr[0]), + richLinkImageAttachmentSubstituteIndex: dco_decode_u_64(arr[1]), + ); } @protected - SavedHardwareState - sse_decode_Auto_RefMut_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerSavedHardwareState( - SseDeserializer deserializer) { - // Codec=Sse (Serialization based), see doc to use other codecs - return SavedHardwareStateImpl.frbInternalSseDecode( - sse_decode_usize(deserializer), sse_decode_i_32(deserializer)); + ScheduleMode dco_decode_schedule_mode(dynamic raw) { + // Codec=Dco (DartCObject based), see doc to use other codecs + final arr = raw as List; + if (arr.length != 2) + throw Exception('unexpected arr length: expect 2 but see ${arr.length}'); + return ScheduleMode( + ms: dco_decode_CastedPrimitive_u_64(arr[0]), + schedule: dco_decode_bool(arr[1]), + ); } @protected - ViableBottle - sse_decode_Auto_RefMut_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerViableBottle( - SseDeserializer deserializer) { - // Codec=Sse (Serialization based), see doc to use other codecs - return ViableBottleImpl.frbInternalSseDecode( - sse_decode_usize(deserializer), sse_decode_i_32(deserializer)); + SetTranscriptBackgroundMessage dco_decode_set_transcript_background_message( + dynamic raw, + ) { + // Codec=Dco (DartCObject based), see doc to use other codecs + switch (raw[0]) { + case 0: + return SetTranscriptBackgroundMessage_Remove( + aid: dco_decode_u_32(raw[1]), + bid: dco_decode_u_64(raw[2]), + chatId: dco_decode_opt_String(raw[3]), + remove: dco_decode_bool(raw[4]), + ); + case 1: + return SetTranscriptBackgroundMessage_Set( + aid: dco_decode_u_32(raw[1]), + bid: dco_decode_u_64(raw[2]), + chatId: dco_decode_opt_String(raw[3]), + objectId: dco_decode_String(raw[4]), + payloadVersion: dco_decode_u_32(raw[5]), + backgroundId: dco_decode_String(raw[6]), + url: dco_decode_String(raw[7]), + signature: dco_decode_String(raw[8]), + key: dco_decode_String(raw[9]), + fileSize: dco_decode_usize(raw[10]), + ); + default: + throw Exception("unreachable"); + } } @protected - ApsConnection - sse_decode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerAPSConnection( - SseDeserializer deserializer) { - // Codec=Sse (Serialization based), see doc to use other codecs - return ApsConnectionImpl.frbInternalSseDecode( - sse_decode_usize(deserializer), sse_decode_i_32(deserializer)); + ShareInviteContentData dco_decode_share_invite_content_data(dynamic raw) { + // Codec=Dco (DartCObject based), see doc to use other codecs + final arr = raw as List; + if (arr.length != 6) + throw Exception('unexpected arr length: expect 6 but see ${arr.length}'); + return ShareInviteContentData( + invitationToken: dco_decode_list_prim_u_8_strict(arr[0]), + groupId: dco_decode_String(arr[1]), + sentTime: + dco_decode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerDate( + arr[2], + ), + groupName: dco_decode_String(arr[3]), + shareUrl: dco_decode_String(arr[4]), + inviteeHandle: dco_decode_String(arr[5]), + ); } @protected - ArcAnisetteClientDefaultAnisetteProvider - sse_decode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcAnisetteClientDefaultAnisetteProvider( - SseDeserializer deserializer) { - // Codec=Sse (Serialization based), see doc to use other codecs - return ArcAnisetteClientDefaultAnisetteProviderImpl.frbInternalSseDecode( - sse_decode_usize(deserializer), sse_decode_i_32(deserializer)); + ShareProfileMessage dco_decode_share_profile_message(dynamic raw) { + // Codec=Dco (DartCObject based), see doc to use other codecs + final arr = raw as List; + if (arr.length != 3) + throw Exception('unexpected arr length: expect 3 but see ${arr.length}'); + return ShareProfileMessage( + cloudKitDecryptionRecordKey: dco_decode_list_prim_u_8_strict(arr[0]), + cloudKitRecordKey: dco_decode_String(arr[1]), + poster: dco_decode_opt_box_autoadd_shared_poster(arr[2]), + ); } @protected - ArcCloudKitClientDefaultAnisetteProvider - sse_decode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcCloudKitClientDefaultAnisetteProvider( - SseDeserializer deserializer) { - // Codec=Sse (Serialization based), see doc to use other codecs - return ArcCloudKitClientDefaultAnisetteProviderImpl.frbInternalSseDecode( - sse_decode_usize(deserializer), sse_decode_i_32(deserializer)); - } - - @protected - ArcCloudMessagesClientDefaultAnisetteProvider - sse_decode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcCloudMessagesClientDefaultAnisetteProvider( - SseDeserializer deserializer) { - // Codec=Sse (Serialization based), see doc to use other codecs - return ArcCloudMessagesClientDefaultAnisetteProviderImpl - .frbInternalSseDecode( - sse_decode_usize(deserializer), sse_decode_i_32(deserializer)); + SharedAlbum dco_decode_shared_album(dynamic raw) { + // Codec=Dco (DartCObject based), see doc to use other codecs + final arr = raw as List; + if (arr.length != 9) + throw Exception('unexpected arr length: expect 9 but see ${arr.length}'); + return SharedAlbum( + name: dco_decode_opt_String(arr[0]), + fullname: dco_decode_opt_String(arr[1]), + email: dco_decode_opt_String(arr[2]), + albumguid: dco_decode_String(arr[3]), + sharingtype: dco_decode_String(arr[4]), + subscriptiondate: dco_decode_opt_String(arr[5]), + albumlocation: dco_decode_opt_String(arr[6]), + assets: dco_decode_list_String(arr[7]), + delete: dco_decode_opt_String(arr[8]), + ); } @protected - ArcFtClient - sse_decode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcFTClient( - SseDeserializer deserializer) { - // Codec=Sse (Serialization based), see doc to use other codecs - return ArcFtClientImpl.frbInternalSseDecode( - sse_decode_usize(deserializer), sse_decode_i_32(deserializer)); + SharedICloudServices dco_decode_shared_i_cloud_services(dynamic raw) { + // Codec=Dco (DartCObject based), see doc to use other codecs + final arr = raw as List; + if (arr.length != 10) + throw Exception('unexpected arr length: expect 10 but see ${arr.length}'); + return SharedICloudServices( + account: + dco_decode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcMutexAppleAccountDefaultAnisetteProvider( + arr[0], + ), + tokenProvider: + dco_decode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcTokenProviderDefaultAnisetteProvider( + arr[1], + ), + cloudkitClient: + dco_decode_opt_box_autoadd_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcCloudKitClientDefaultAnisetteProvider( + arr[2], + ), + keychain: + dco_decode_opt_box_autoadd_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcKeychainClientDefaultAnisetteProvider( + arr[3], + ), + passwords: + dco_decode_opt_box_autoadd_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcPasswordManagerDefaultAnisetteProvider( + arr[4], + ), + profilesClient: + dco_decode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcProfilesClientDefaultAnisetteProvider( + arr[5], + ), + fmfd: + dco_decode_opt_box_autoadd_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcFindMyClientDefaultAnisetteProvider( + arr[6], + ), + sharedstreams: + dco_decode_opt_box_autoadd_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerSyncManagerDefaultAnisetteProviderMyFilePackager( + arr[7], + ), + cloudMessagesClient: + dco_decode_opt_box_autoadd_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcCloudMessagesClientDefaultAnisetteProvider( + arr[8], + ), + statuskitClient: + dco_decode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcStatusKitClientDefaultAnisetteProvider( + arr[9], + ), + ); } @protected - ArcFindMyClientDefaultAnisetteProvider - sse_decode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcFindMyClientDefaultAnisetteProvider( - SseDeserializer deserializer) { - // Codec=Sse (Serialization based), see doc to use other codecs - return ArcFindMyClientDefaultAnisetteProviderImpl.frbInternalSseDecode( - sse_decode_usize(deserializer), sse_decode_i_32(deserializer)); + SharedPoster dco_decode_shared_poster(dynamic raw) { + // Codec=Dco (DartCObject based), see doc to use other codecs + final arr = raw as List; + if (arr.length != 3) + throw Exception('unexpected arr length: expect 3 but see ${arr.length}'); + return SharedPoster( + lowResWallpaperTag: dco_decode_list_prim_u_8_strict(arr[0]), + wallpaperTag: dco_decode_list_prim_u_8_strict(arr[1]), + messageTag: dco_decode_list_prim_u_8_strict(arr[2]), + ); } @protected - ArcImClient - sse_decode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcIMClient( - SseDeserializer deserializer) { - // Codec=Sse (Serialization based), see doc to use other codecs - return ArcImClientImpl.frbInternalSseDecode( - sse_decode_usize(deserializer), sse_decode_i_32(deserializer)); + SharedPushState dco_decode_shared_push_state(dynamic raw) { + // Codec=Dco (DartCObject based), see doc to use other codecs + final arr = raw as List; + if (arr.length != 12) + throw Exception('unexpected arr length: expect 12 but see ${arr.length}'); + return SharedPushState( + osConfig: + dco_decode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerJoinedOSConfig( + arr[0], + ), + cancelPoll: + dco_decode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerSender( + arr[1], + ), + confDir: dco_decode_String(arr[2]), + localBroadcast: + dco_decode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcSenderPushMessage( + arr[3], + ), + anisette: + dco_decode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcAnisetteClientDefaultAnisetteProvider( + arr[4], + ), + conn: + dco_decode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerAPSConnection( + arr[5], + ), + icloudServices: dco_decode_opt_box_autoadd_shared_i_cloud_services( + arr[6], + ), + client: + dco_decode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcIMClient( + arr[7], + ), + ftClient: + dco_decode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcFTClient( + arr[8], + ), + idmsClient: + dco_decode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcIdmsAuthListener( + arr[9], + ), + activeCircleSessions: + dco_decode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcMutexVecActiveCircleSession( + arr[10], + ), + clientSession: + dco_decode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcMutexOptionCircleClientSessionDefaultAnisetteProvider( + arr[11], + ), + ); } @protected - ArcIdmsAuthListener - sse_decode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcIdmsAuthListener( - SseDeserializer deserializer) { - // Codec=Sse (Serialization based), see doc to use other codecs - return ArcIdmsAuthListenerImpl.frbInternalSseDecode( - sse_decode_usize(deserializer), sse_decode_i_32(deserializer)); + SimplifiedIncomingCallPoster dco_decode_simplified_incoming_call_poster( + dynamic raw, + ) { + // Codec=Dco (DartCObject based), see doc to use other codecs + final arr = raw as List; + if (arr.length != 3) + throw Exception('unexpected arr length: expect 3 but see ${arr.length}'); + return SimplifiedIncomingCallPoster( + poster: dco_decode_simplified_poster(arr[0]), + textMetadata: dco_decode_wallpaper_metadata(arr[1]), + lowRes: dco_decode_list_prim_u_8_strict(arr[2]), + ); } @protected - ArcKeychainClientDefaultAnisetteProvider - sse_decode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcKeychainClientDefaultAnisetteProvider( - SseDeserializer deserializer) { - // Codec=Sse (Serialization based), see doc to use other codecs - return ArcKeychainClientDefaultAnisetteProviderImpl.frbInternalSseDecode( - sse_decode_usize(deserializer), sse_decode_i_32(deserializer)); + SimplifiedPoster dco_decode_simplified_poster(dynamic raw) { + // Codec=Dco (DartCObject based), see doc to use other codecs + final arr = raw as List; + if (arr.length != 3) + throw Exception('unexpected arr length: expect 3 but see ${arr.length}'); + return SimplifiedPoster( + titleConfiguration: dco_decode_pr_poster_title_style_configuration( + arr[0], + ), + type: dco_decode_poster_type(arr[1]), + role: dco_decode_poster_role(arr[2]), + ); } @protected - ArcMutexAppleAccountDefaultAnisetteProvider - sse_decode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcMutexAppleAccountDefaultAnisetteProvider( - SseDeserializer deserializer) { - // Codec=Sse (Serialization based), see doc to use other codecs - return ArcMutexAppleAccountDefaultAnisetteProviderImpl.frbInternalSseDecode( - sse_decode_usize(deserializer), sse_decode_i_32(deserializer)); + SimplifiedTranscriptPoster dco_decode_simplified_transcript_poster( + dynamic raw, + ) { + // Codec=Dco (DartCObject based), see doc to use other codecs + final arr = raw as List; + if (arr.length != 2) + throw Exception('unexpected arr length: expect 2 but see ${arr.length}'); + return SimplifiedTranscriptPoster( + watch: dco_decode_watch_background(arr[0]), + poster: dco_decode_simplified_poster(arr[1]), + ); } @protected - ArcMutexOptionCircleClientSessionDefaultAnisetteProvider - sse_decode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcMutexOptionCircleClientSessionDefaultAnisetteProvider( - SseDeserializer deserializer) { - // Codec=Sse (Serialization based), see doc to use other codecs - return ArcMutexOptionCircleClientSessionDefaultAnisetteProviderImpl - .frbInternalSseDecode( - sse_decode_usize(deserializer), sse_decode_i_32(deserializer)); + StatusKitMessage dco_decode_status_kit_message(dynamic raw) { + // Codec=Dco (DartCObject based), see doc to use other codecs + switch (raw[0]) { + case 0: + return StatusKitMessage_StatusChanged( + user: dco_decode_String(raw[1]), + mode: dco_decode_opt_String(raw[2]), + allowed: dco_decode_bool(raw[3]), + ); + default: + throw Exception("unreachable"); + } } @protected - ArcMutexVecActiveCircleSession - sse_decode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcMutexVecActiveCircleSession( - SseDeserializer deserializer) { - // Codec=Sse (Serialization based), see doc to use other codecs - return ArcMutexVecActiveCircleSessionImpl.frbInternalSseDecode( - sse_decode_usize(deserializer), sse_decode_i_32(deserializer)); + StatusKitPersonalConfig dco_decode_status_kit_personal_config(dynamic raw) { + // Codec=Dco (DartCObject based), see doc to use other codecs + final arr = raw as List; + if (arr.length != 1) + throw Exception('unexpected arr length: expect 1 but see ${arr.length}'); + return StatusKitPersonalConfig( + allowedModes: dco_decode_list_String(arr[0]), + ); } @protected - ArcPasswordManagerDefaultAnisetteProvider - sse_decode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcPasswordManagerDefaultAnisetteProvider( - SseDeserializer deserializer) { - // Codec=Sse (Serialization based), see doc to use other codecs - return ArcPasswordManagerDefaultAnisetteProviderImpl.frbInternalSseDecode( - sse_decode_usize(deserializer), sse_decode_i_32(deserializer)); + SupportAction dco_decode_support_action(dynamic raw) { + // Codec=Dco (DartCObject based), see doc to use other codecs + final arr = raw as List; + if (arr.length != 2) + throw Exception('unexpected arr length: expect 2 but see ${arr.length}'); + return SupportAction( + url: dco_decode_String(arr[0]), + button: dco_decode_String(arr[1]), + ); } @protected - ArcProfilesClientDefaultAnisetteProvider - sse_decode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcProfilesClientDefaultAnisetteProvider( - SseDeserializer deserializer) { - // Codec=Sse (Serialization based), see doc to use other codecs - return ArcProfilesClientDefaultAnisetteProviderImpl.frbInternalSseDecode( - sse_decode_usize(deserializer), sse_decode_i_32(deserializer)); + SupportAlert dco_decode_support_alert(dynamic raw) { + // Codec=Dco (DartCObject based), see doc to use other codecs + final arr = raw as List; + if (arr.length != 3) + throw Exception('unexpected arr length: expect 3 but see ${arr.length}'); + return SupportAlert( + title: dco_decode_String(arr[0]), + body: dco_decode_String(arr[1]), + action: dco_decode_opt_box_autoadd_support_action(arr[2]), + ); } @protected - ArcSenderPushMessage - sse_decode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcSenderPushMessage( - SseDeserializer deserializer) { - // Codec=Sse (Serialization based), see doc to use other codecs - return ArcSenderPushMessageImpl.frbInternalSseDecode( - sse_decode_usize(deserializer), sse_decode_i_32(deserializer)); + SyncStatus dco_decode_sync_status(dynamic raw) { + // Codec=Dco (DartCObject based), see doc to use other codecs + switch (raw[0]) { + case 0: + return SyncStatus_Synced(); + case 1: + return SyncStatus_Downloading( + progress: dco_decode_usize(raw[1]), + total: dco_decode_usize(raw[2]), + ); + case 2: + return SyncStatus_Uploading( + progress: dco_decode_usize(raw[1]), + total: dco_decode_usize(raw[2]), + ); + case 3: + return SyncStatus_Syncing(); + default: + throw Exception("unreachable"); + } } @protected - ArcSharedPushState - sse_decode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcSharedPushState( - SseDeserializer deserializer) { - // Codec=Sse (Serialization based), see doc to use other codecs - return ArcSharedPushStateImpl.frbInternalSseDecode( - sse_decode_usize(deserializer), sse_decode_i_32(deserializer)); + TeardownSignIn dco_decode_teardown_sign_in(dynamic raw) { + // Codec=Dco (DartCObject based), see doc to use other codecs + final arr = raw as List; + if (arr.length != 1) + throw Exception('unexpected arr length: expect 1 but see ${arr.length}'); + return TeardownSignIn(prevtxnid: dco_decode_String(arr[0])); } @protected - ArcStatusKitClientDefaultAnisetteProvider - sse_decode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcStatusKitClientDefaultAnisetteProvider( - SseDeserializer deserializer) { - // Codec=Sse (Serialization based), see doc to use other codecs - return ArcStatusKitClientDefaultAnisetteProviderImpl.frbInternalSseDecode( - sse_decode_usize(deserializer), sse_decode_i_32(deserializer)); + TextEffect dco_decode_text_effect(dynamic raw) { + // Codec=Dco (DartCObject based), see doc to use other codecs + return TextEffect.values[raw as int]; } @protected - ArcTokenProviderDefaultAnisetteProvider - sse_decode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcTokenProviderDefaultAnisetteProvider( - SseDeserializer deserializer) { - // Codec=Sse (Serialization based), see doc to use other codecs - return ArcTokenProviderDefaultAnisetteProviderImpl.frbInternalSseDecode( - sse_decode_usize(deserializer), sse_decode_i_32(deserializer)); + TextFlags dco_decode_text_flags(dynamic raw) { + // Codec=Dco (DartCObject based), see doc to use other codecs + final arr = raw as List; + if (arr.length != 4) + throw Exception('unexpected arr length: expect 4 but see ${arr.length}'); + return TextFlags( + bold: dco_decode_bool(arr[0]), + italic: dco_decode_bool(arr[1]), + underline: dco_decode_bool(arr[2]), + strikethrough: dco_decode_bool(arr[3]), + ); } @protected - Date - sse_decode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerDate( - SseDeserializer deserializer) { - // Codec=Sse (Serialization based), see doc to use other codecs - return DateImpl.frbInternalSseDecode( - sse_decode_usize(deserializer), sse_decode_i_32(deserializer)); + TextFormat dco_decode_text_format(dynamic raw) { + // Codec=Dco (DartCObject based), see doc to use other codecs + switch (raw[0]) { + case 0: + return TextFormat_Flags(dco_decode_box_autoadd_text_flags(raw[1])); + case 1: + return TextFormat_Effect(dco_decode_text_effect(raw[1])); + default: + throw Exception("unreachable"); + } } @protected - EscrowData - sse_decode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerEscrowData( - SseDeserializer deserializer) { - // Codec=Sse (Serialization based), see doc to use other codecs - return EscrowDataImpl.frbInternalSseDecode( - sse_decode_usize(deserializer), sse_decode_i_32(deserializer)); + TranscriptDynamicUserData dco_decode_transcript_dynamic_user_data( + dynamic raw, + ) { + // Codec=Dco (DartCObject based), see doc to use other codecs + final arr = raw as List; + if (arr.length != 1) + throw Exception('unexpected arr length: expect 1 but see ${arr.length}'); + return TranscriptDynamicUserData(identifier: dco_decode_String(arr[0])); } @protected - GZipWrapperAttachmentMeta - sse_decode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerGZipWrapperAttachmentMeta( - SseDeserializer deserializer) { - // Codec=Sse (Serialization based), see doc to use other codecs - return GZipWrapperAttachmentMetaImpl.frbInternalSseDecode( - sse_decode_usize(deserializer), sse_decode_i_32(deserializer)); + TransferProgress dco_decode_transfer_progress(dynamic raw) { + // Codec=Dco (DartCObject based), see doc to use other codecs + final arr = raw as List; + if (arr.length != 3) + throw Exception('unexpected arr length: expect 3 but see ${arr.length}'); + return TransferProgress( + prog: dco_decode_CastedPrimitive_usize(arr[0]), + total: dco_decode_CastedPrimitive_usize(arr[1]), + attachment: dco_decode_opt_box_autoadd_attachment(arr[2]), + ); } @protected - GZipWrapperChatProto - sse_decode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerGZipWrapperChatProto( - SseDeserializer deserializer) { - // Codec=Sse (Serialization based), see doc to use other codecs - return GZipWrapperChatProtoImpl.frbInternalSseDecode( - sse_decode_usize(deserializer), sse_decode_i_32(deserializer)); + TrustedPhoneNumber dco_decode_trusted_phone_number(dynamic raw) { + // Codec=Dco (DartCObject based), see doc to use other codecs + final arr = raw as List; + if (arr.length != 4) + throw Exception('unexpected arr length: expect 4 but see ${arr.length}'); + return TrustedPhoneNumber( + numberWithDialCode: dco_decode_String(arr[0]), + lastTwoDigits: dco_decode_String(arr[1]), + pushMode: dco_decode_String(arr[2]), + id: dco_decode_u_32(arr[3]), + ); } @protected - GZipWrapperMessageProto - sse_decode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerGZipWrapperMessageProto( - SseDeserializer deserializer) { - // Codec=Sse (Serialization based), see doc to use other codecs - return GZipWrapperMessageProtoImpl.frbInternalSseDecode( - sse_decode_usize(deserializer), sse_decode_i_32(deserializer)); + TypingApp dco_decode_typing_app(dynamic raw) { + // Codec=Dco (DartCObject based), see doc to use other codecs + final arr = raw as List; + if (arr.length != 2) + throw Exception('unexpected arr length: expect 2 but see ${arr.length}'); + return TypingApp( + bundleId: dco_decode_String(arr[0]), + icon: dco_decode_list_prim_u_8_strict(arr[1]), + ); } @protected - GZipWrapperMessageProto2 - sse_decode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerGZipWrapperMessageProto2( - SseDeserializer deserializer) { - // Codec=Sse (Serialization based), see doc to use other codecs - return GZipWrapperMessageProto2Impl.frbInternalSseDecode( - sse_decode_usize(deserializer), sse_decode_i_32(deserializer)); + int dco_decode_u_16(dynamic raw) { + // Codec=Dco (DartCObject based), see doc to use other codecs + return raw as int; } @protected - GZipWrapperMessageProto3 - sse_decode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerGZipWrapperMessageProto3( - SseDeserializer deserializer) { - // Codec=Sse (Serialization based), see doc to use other codecs - return GZipWrapperMessageProto3Impl.frbInternalSseDecode( - sse_decode_usize(deserializer), sse_decode_i_32(deserializer)); + int dco_decode_u_32(dynamic raw) { + // Codec=Dco (DartCObject based), see doc to use other codecs + return raw as int; } @protected - GZipWrapperMessageProto4 - sse_decode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerGZipWrapperMessageProto4( - SseDeserializer deserializer) { - // Codec=Sse (Serialization based), see doc to use other codecs - return GZipWrapperMessageProto4Impl.frbInternalSseDecode( - sse_decode_usize(deserializer), sse_decode_i_32(deserializer)); + BigInt dco_decode_u_64(dynamic raw) { + // Codec=Dco (DartCObject based), see doc to use other codecs + return dcoDecodeU64(raw); } @protected - IdsngmIdentity - sse_decode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerIDSNGMIdentity( - SseDeserializer deserializer) { - // Codec=Sse (Serialization based), see doc to use other codecs - return IdsngmIdentityImpl.frbInternalSseDecode( - sse_decode_usize(deserializer), sse_decode_i_32(deserializer)); + int dco_decode_u_8(dynamic raw) { + // Codec=Dco (DartCObject based), see doc to use other codecs + return raw as int; } @protected - IdsUser - sse_decode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerIDSUser( - SseDeserializer deserializer) { - // Codec=Sse (Serialization based), see doc to use other codecs - return IdsUserImpl.frbInternalSseDecode( - sse_decode_usize(deserializer), sse_decode_i_32(deserializer)); + UIColor dco_decode_ui_color(dynamic raw) { + // Codec=Dco (DartCObject based), see doc to use other codecs + switch (raw[0]) { + case 0: + return UIColor_RGBAColorSpace( + colorComponents: dco_decode_u_32(raw[1]), + green: dco_decode_f_64(raw[2]), + blue: dco_decode_f_64(raw[3]), + red: dco_decode_f_64(raw[4]), + greenDbl: dco_decode_opt_box_autoadd_f_64(raw[5]), + blueDbl: dco_decode_opt_box_autoadd_f_64(raw[6]), + redDbl: dco_decode_opt_box_autoadd_f_64(raw[7]), + alphaDbl: dco_decode_opt_box_autoadd_f_64(raw[8]), + alpha: dco_decode_f_64(raw[9]), + rgb: dco_decode_list_prim_u_8_strict(raw[10]), + colorSpace: dco_decode_u_32(raw[11]), + class_: dco_decode_String(raw[12]), + ); + case 1: + return UIColor_GrayscaleAlphaColorSpace( + colorComponents: dco_decode_u_32(raw[1]), + white: dco_decode_f_64(raw[2]), + alpha: dco_decode_f_64(raw[3]), + bin: dco_decode_list_prim_u_8_strict(raw[4]), + colorSpace: dco_decode_u_32(raw[5]), + class_: dco_decode_String(raw[6]), + ); + default: + throw Exception("unreachable"); + } } @protected - JoinedOsConfig - sse_decode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerJoinedOSConfig( - SseDeserializer deserializer) { - // Codec=Sse (Serialization based), see doc to use other codecs - return JoinedOsConfigImpl.frbInternalSseDecode( - sse_decode_usize(deserializer), sse_decode_i_32(deserializer)); + void dco_decode_unit(dynamic raw) { + // Codec=Dco (DartCObject based), see doc to use other codecs + return; } @protected - LocationReport - sse_decode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerLocationReport( - SseDeserializer deserializer) { - // Codec=Sse (Serialization based), see doc to use other codecs - return LocationReportImpl.frbInternalSseDecode( - sse_decode_usize(deserializer), sse_decode_i_32(deserializer)); + UnsendMessage dco_decode_unsend_message(dynamic raw) { + // Codec=Dco (DartCObject based), see doc to use other codecs + final arr = raw as List; + if (arr.length != 2) + throw Exception('unexpected arr length: expect 2 but see ${arr.length}'); + return UnsendMessage( + tuuid: dco_decode_String(arr[0]), + editPart: dco_decode_CastedPrimitive_u_64(arr[1]), + ); } @protected - MessageFlags - sse_decode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerMessageFlags( - SseDeserializer deserializer) { - // Codec=Sse (Serialization based), see doc to use other codecs - return MessageFlagsImpl.frbInternalSseDecode( - sse_decode_usize(deserializer), sse_decode_i_32(deserializer)); + UpdateAccountFinish dco_decode_update_account_finish(dynamic raw) { + // Codec=Dco (DartCObject based), see doc to use other codecs + switch (raw[0]) { + case 0: + return UpdateAccountFinish_MacOS(); + case 1: + return UpdateAccountFinish_IOS(url: dco_decode_String(raw[1])); + default: + throw Exception("unreachable"); + } } @protected - SavedHardwareState - sse_decode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerSavedHardwareState( - SseDeserializer deserializer) { - // Codec=Sse (Serialization based), see doc to use other codecs - return SavedHardwareStateImpl.frbInternalSseDecode( - sse_decode_usize(deserializer), sse_decode_i_32(deserializer)); + UpdateExtensionMessage dco_decode_update_extension_message(dynamic raw) { + // Codec=Dco (DartCObject based), see doc to use other codecs + final arr = raw as List; + if (arr.length != 2) + throw Exception('unexpected arr length: expect 2 but see ${arr.length}'); + return UpdateExtensionMessage( + forUuid: dco_decode_String(arr[0]), + ext: dco_decode_part_extension(arr[1]), + ); } @protected - Sender - sse_decode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerSender( - SseDeserializer deserializer) { - // Codec=Sse (Serialization based), see doc to use other codecs - return SenderImpl.frbInternalSseDecode( - sse_decode_usize(deserializer), sse_decode_i_32(deserializer)); + UpdateProfileMessage dco_decode_update_profile_message(dynamic raw) { + // Codec=Dco (DartCObject based), see doc to use other codecs + final arr = raw as List; + if (arr.length != 2) + throw Exception('unexpected arr length: expect 2 but see ${arr.length}'); + return UpdateProfileMessage( + profile: dco_decode_opt_box_autoadd_share_profile_message(arr[0]), + shareContacts: dco_decode_bool(arr[1]), + ); } @protected - StCollapsedValue - sse_decode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerStCollapsedValue( - SseDeserializer deserializer) { - // Codec=Sse (Serialization based), see doc to use other codecs - return StCollapsedValueImpl.frbInternalSseDecode( - sse_decode_usize(deserializer), sse_decode_i_32(deserializer)); + UpdateProfileSharingMessage dco_decode_update_profile_sharing_message( + dynamic raw, + ) { + // Codec=Dco (DartCObject based), see doc to use other codecs + final arr = raw as List; + if (arr.length != 3) + throw Exception('unexpected arr length: expect 3 but see ${arr.length}'); + return UpdateProfileSharingMessage( + sharedDismissed: dco_decode_list_String(arr[0]), + sharedAll: dco_decode_list_String(arr[1]), + version: dco_decode_CastedPrimitive_u_64(arr[2]), + ); } @protected - SyncManagerDefaultAnisetteProviderMyFilePackager - sse_decode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerSyncManagerDefaultAnisetteProviderMyFilePackager( - SseDeserializer deserializer) { - // Codec=Sse (Serialization based), see doc to use other codecs - return SyncManagerDefaultAnisetteProviderMyFilePackagerImpl - .frbInternalSseDecode( - sse_decode_usize(deserializer), sse_decode_i_32(deserializer)); + BigInt dco_decode_usize(dynamic raw) { + // Codec=Dco (DartCObject based), see doc to use other codecs + return dcoDecodeU64(raw); } @protected - VerifyBody - sse_decode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerVerifyBody( - SseDeserializer deserializer) { - // Codec=Sse (Serialization based), see doc to use other codecs - return VerifyBodyImpl.frbInternalSseDecode( - sse_decode_usize(deserializer), sse_decode_i_32(deserializer)); + WallpaperMetadata dco_decode_wallpaper_metadata(dynamic raw) { + // Codec=Dco (DartCObject based), see doc to use other codecs + final arr = raw as List; + if (arr.length != 7) + throw Exception('unexpected arr length: expect 7 but see ${arr.length}'); + return WallpaperMetadata( + backgroundColorKey: dco_decode_opt_box_autoadd_poster_color(arr[0]), + fontColorKey: dco_decode_poster_color(arr[1]), + fontNameKey: dco_decode_String(arr[2]), + fontSizeKey: dco_decode_f_32(arr[3]), + fontWeightKey: dco_decode_f_32(arr[4]), + isVerticalKey: dco_decode_bool(arr[5]), + typeKey: dco_decode_String(arr[6]), + ); } @protected - ViableBottle - sse_decode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerViableBottle( - SseDeserializer deserializer) { - // Codec=Sse (Serialization based), see doc to use other codecs - return ViableBottleImpl.frbInternalSseDecode( - sse_decode_usize(deserializer), sse_decode_i_32(deserializer)); + WatchBackground dco_decode_watch_background(dynamic raw) { + // Codec=Dco (DartCObject based), see doc to use other codecs + final arr = raw as List; + if (arr.length != 4) + throw Exception('unexpected arr length: expect 4 but see ${arr.length}'); + return WatchBackground( + isHighKey: dco_decode_bool(arr[0]), + luminance: dco_decode_f_64(arr[1]), + backgroundImageData: dco_decode_list_prim_u_8_strict(arr[2]), + extensionIdentifier: dco_decode_String(arr[3]), + ); } @protected - int sse_decode_CastedPrimitive_i_64(SseDeserializer deserializer) { - // Codec=Sse (Serialization based), see doc to use other codecs - var inner = sse_decode_i_64(deserializer); - return inner.toInt(); + WifiPassword dco_decode_wifi_password(dynamic raw) { + // Codec=Dco (DartCObject based), see doc to use other codecs + final arr = raw as List; + if (arr.length != 5) + throw Exception('unexpected arr length: expect 5 but see ${arr.length}'); + return WifiPassword( + cdat: dco_decode_CastedPrimitive_u_64(arr[0]), + mdat: dco_decode_CastedPrimitive_u_64(arr[1]), + acct: dco_decode_String(arr[2]), + svce: dco_decode_String(arr[3]), + data: dco_decode_list_prim_u_8_strict(arr[4]), + ); } @protected - int sse_decode_CastedPrimitive_u_64(SseDeserializer deserializer) { + AnyhowException sse_decode_AnyhowException(SseDeserializer deserializer) { // Codec=Sse (Serialization based), see doc to use other codecs - var inner = sse_decode_u_64(deserializer); - return inner.toInt(); + var inner = sse_decode_String(deserializer); + return AnyhowException(inner); } @protected - int sse_decode_CastedPrimitive_usize(SseDeserializer deserializer) { + ApsConnection + sse_decode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerAPSConnection( + SseDeserializer deserializer, + ) { // Codec=Sse (Serialization based), see doc to use other codecs - var inner = sse_decode_usize(deserializer); - return inner.toInt(); + return ApsConnectionImpl.frbInternalSseDecode( + sse_decode_usize(deserializer), + sse_decode_i_32(deserializer), + ); } @protected - Object sse_decode_DartOpaque(SseDeserializer deserializer) { + ApsState + sse_decode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerAPSState( + SseDeserializer deserializer, + ) { // Codec=Sse (Serialization based), see doc to use other codecs - var inner = sse_decode_usize(deserializer); - return decodeDartOpaque(inner, generalizedFrbRustBinding); + return ApsStateImpl.frbInternalSseDecode( + sse_decode_usize(deserializer), + sse_decode_i_32(deserializer), + ); } @protected - Map - sse_decode_Map_String_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerAsset( - SseDeserializer deserializer) { + ApsWatcher + sse_decode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerAPSWatcher( + SseDeserializer deserializer, + ) { // Codec=Sse (Serialization based), see doc to use other codecs - var inner = - sse_decode_list_record_string_auto_owned_rust_opaque_flutter_rust_bridgefor_generated_rust_auto_opaque_inner_asset( - deserializer); - return Map.fromEntries(inner.map((e) => MapEntry(e.$1, e.$2))); + return ApsWatcherImpl.frbInternalSseDecode( + sse_decode_usize(deserializer), + sse_decode_i_32(deserializer), + ); } @protected - Map - sse_decode_Map_String_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerStCollapsedValue( - SseDeserializer deserializer) { + ArcAnisetteClientDefaultAnisetteProvider + sse_decode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcAnisetteClientDefaultAnisetteProvider( + SseDeserializer deserializer, + ) { // Codec=Sse (Serialization based), see doc to use other codecs - var inner = - sse_decode_list_record_string_auto_owned_rust_opaque_flutter_rust_bridgefor_generated_rust_auto_opaque_inner_st_collapsed_value( - deserializer); - return Map.fromEntries(inner.map((e) => MapEntry(e.$1, e.$2))); + return ArcAnisetteClientDefaultAnisetteProviderImpl.frbInternalSseDecode( + sse_decode_usize(deserializer), + sse_decode_i_32(deserializer), + ); } @protected - Map sse_decode_Map_String_CastedPrimitive_u_64( - SseDeserializer deserializer) { + ArcCloudKitClientDefaultAnisetteProvider + sse_decode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcCloudKitClientDefaultAnisetteProvider( + SseDeserializer deserializer, + ) { // Codec=Sse (Serialization based), see doc to use other codecs - var inner = - sse_decode_list_record_string_casted_primitive_u_64(deserializer); - return Map.fromEntries(inner.map((e) => MapEntry(e.$1, e.$2))); + return ArcCloudKitClientDefaultAnisetteProviderImpl.frbInternalSseDecode( + sse_decode_usize(deserializer), + sse_decode_i_32(deserializer), + ); } @protected - Map sse_decode_Map_String_String( - SseDeserializer deserializer) { + ArcCloudMessagesClientDefaultAnisetteProvider + sse_decode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcCloudMessagesClientDefaultAnisetteProvider( + SseDeserializer deserializer, + ) { // Codec=Sse (Serialization based), see doc to use other codecs - var inner = sse_decode_list_record_string_string(deserializer); - return Map.fromEntries(inner.map((e) => MapEntry(e.$1, e.$2))); - } - - @protected - Map sse_decode_Map_String_bool(SseDeserializer deserializer) { - // Codec=Sse (Serialization based), see doc to use other codecs - var inner = sse_decode_list_record_string_bool(deserializer); - return Map.fromEntries(inner.map((e) => MapEntry(e.$1, e.$2))); - } - - @protected - Map sse_decode_Map_String_cloud_attachment( - SseDeserializer deserializer) { - // Codec=Sse (Serialization based), see doc to use other codecs - var inner = sse_decode_list_record_string_cloud_attachment(deserializer); - return Map.fromEntries(inner.map((e) => MapEntry(e.$1, e.$2))); - } - - @protected - Map sse_decode_Map_String_cloud_chat( - SseDeserializer deserializer) { - // Codec=Sse (Serialization based), see doc to use other codecs - var inner = sse_decode_list_record_string_cloud_chat(deserializer); - return Map.fromEntries(inner.map((e) => MapEntry(e.$1, e.$2))); - } - - @protected - Map sse_decode_Map_String_cloud_message( - SseDeserializer deserializer) { - // Codec=Sse (Serialization based), see doc to use other codecs - var inner = sse_decode_list_record_string_cloud_message(deserializer); - return Map.fromEntries(inner.map((e) => MapEntry(e.$1, e.$2))); - } - - @protected - Map sse_decode_Map_String_ft_participant( - SseDeserializer deserializer) { - // Codec=Sse (Serialization based), see doc to use other codecs - var inner = sse_decode_list_record_string_ft_participant(deserializer); - return Map.fromEntries(inner.map((e) => MapEntry(e.$1, e.$2))); - } - - @protected - Map sse_decode_Map_String_group_summary( - SseDeserializer deserializer) { - // Codec=Sse (Serialization based), see doc to use other codecs - var inner = sse_decode_list_record_string_group_summary(deserializer); - return Map.fromEntries(inner.map((e) => MapEntry(e.$1, e.$2))); - } - - @protected - Map> sse_decode_Map_String_list_message_edit( - SseDeserializer deserializer) { - // Codec=Sse (Serialization based), see doc to use other codecs - var inner = sse_decode_list_record_string_list_message_edit(deserializer); - return Map.fromEntries(inner.map((e) => MapEntry(e.$1, e.$2))); - } - - @protected - Map sse_decode_Map_String_list_prim_u_8_strict( - SseDeserializer deserializer) { - // Codec=Sse (Serialization based), see doc to use other codecs - var inner = - sse_decode_list_record_string_list_prim_u_8_strict(deserializer); - return Map.fromEntries(inner.map((e) => MapEntry(e.$1, e.$2))); - } - - @protected - Map sse_decode_Map_String_message_edit_range( - SseDeserializer deserializer) { - // Codec=Sse (Serialization based), see doc to use other codecs - var inner = sse_decode_list_record_string_message_edit_range(deserializer); - return Map.fromEntries(inner.map((e) => MapEntry(e.$1, e.$2))); - } - - @protected - Map - sse_decode_Map_String_opt_box_autoadd_cloud_attachment( - SseDeserializer deserializer) { - // Codec=Sse (Serialization based), see doc to use other codecs - var inner = sse_decode_list_record_string_opt_box_autoadd_cloud_attachment( - deserializer); - return Map.fromEntries(inner.map((e) => MapEntry(e.$1, e.$2))); - } - - @protected - Map sse_decode_Map_String_opt_box_autoadd_cloud_chat( - SseDeserializer deserializer) { - // Codec=Sse (Serialization based), see doc to use other codecs - var inner = - sse_decode_list_record_string_opt_box_autoadd_cloud_chat(deserializer); - return Map.fromEntries(inner.map((e) => MapEntry(e.$1, e.$2))); - } - - @protected - Map - sse_decode_Map_String_opt_box_autoadd_cloud_message( - SseDeserializer deserializer) { - // Codec=Sse (Serialization based), see doc to use other codecs - var inner = sse_decode_list_record_string_opt_box_autoadd_cloud_message( - deserializer); - return Map.fromEntries(inner.map((e) => MapEntry(e.$1, e.$2))); - } - - @protected - Map - sse_decode_Map_String_password_manager_meta_data_ctx( - SseDeserializer deserializer) { - // Codec=Sse (Serialization based), see doc to use other codecs - var inner = sse_decode_list_record_string_password_manager_meta_data_ctx( - deserializer); - return Map.fromEntries(inner.map((e) => MapEntry(e.$1, e.$2))); - } - - @protected - Map - sse_decode_Map_String_record_opt_string_passkey( - SseDeserializer deserializer) { - // Codec=Sse (Serialization based), see doc to use other codecs - var inner = - sse_decode_list_record_string_record_opt_string_passkey(deserializer); - return Map.fromEntries(inner.map((e) => MapEntry(e.$1, e.$2))); - } - - @protected - Map - sse_decode_Map_String_record_opt_string_password_manager_meta( - SseDeserializer deserializer) { - // Codec=Sse (Serialization based), see doc to use other codecs - var inner = - sse_decode_list_record_string_record_opt_string_password_manager_meta( - deserializer); - return Map.fromEntries(inner.map((e) => MapEntry(e.$1, e.$2))); - } - - @protected - Map - sse_decode_Map_String_record_opt_string_password_raw_entry( - SseDeserializer deserializer) { - // Codec=Sse (Serialization based), see doc to use other codecs - var inner = - sse_decode_list_record_string_record_opt_string_password_raw_entry( - deserializer); - return Map.fromEntries(inner.map((e) => MapEntry(e.$1, e.$2))); - } - - @protected - Map - sse_decode_Map_String_record_opt_string_wifi_password( - SseDeserializer deserializer) { - // Codec=Sse (Serialization based), see doc to use other codecs - var inner = sse_decode_list_record_string_record_opt_string_wifi_password( - deserializer); - return Map.fromEntries(inner.map((e) => MapEntry(e.$1, e.$2))); - } - - @protected - Map - sse_decode_Map_String_share_invite_content_data( - SseDeserializer deserializer) { - // Codec=Sse (Serialization based), see doc to use other codecs - var inner = - sse_decode_list_record_string_share_invite_content_data(deserializer); - return Map.fromEntries(inner.map((e) => MapEntry(e.$1, e.$2))); - } - - @protected - Map - sse_decode_Map_String_status_kit_personal_config( - SseDeserializer deserializer) { - // Codec=Sse (Serialization based), see doc to use other codecs - var inner = - sse_decode_list_record_string_status_kit_personal_config(deserializer); - return Map.fromEntries(inner.map((e) => MapEntry(e.$1, e.$2))); - } - - @protected - Map sse_decode_Map_String_sync_status( - SseDeserializer deserializer) { - // Codec=Sse (Serialization based), see doc to use other codecs - var inner = sse_decode_list_record_string_sync_status(deserializer); - return Map.fromEntries(inner.map((e) => MapEntry(e.$1, e.$2))); - } - - @protected - ApsConnection - sse_decode_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerAPSConnection( - SseDeserializer deserializer) { - // Codec=Sse (Serialization based), see doc to use other codecs - return ApsConnectionImpl.frbInternalSseDecode( - sse_decode_usize(deserializer), sse_decode_i_32(deserializer)); - } - - @protected - ApsState - sse_decode_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerAPSState( - SseDeserializer deserializer) { - // Codec=Sse (Serialization based), see doc to use other codecs - return ApsStateImpl.frbInternalSseDecode( - sse_decode_usize(deserializer), sse_decode_i_32(deserializer)); - } - - @protected - ApsWatcher - sse_decode_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerAPSWatcher( - SseDeserializer deserializer) { - // Codec=Sse (Serialization based), see doc to use other codecs - return ApsWatcherImpl.frbInternalSseDecode( - sse_decode_usize(deserializer), sse_decode_i_32(deserializer)); - } - - @protected - ArcAnisetteClientDefaultAnisetteProvider - sse_decode_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcAnisetteClientDefaultAnisetteProvider( - SseDeserializer deserializer) { - // Codec=Sse (Serialization based), see doc to use other codecs - return ArcAnisetteClientDefaultAnisetteProviderImpl.frbInternalSseDecode( - sse_decode_usize(deserializer), sse_decode_i_32(deserializer)); - } - - @protected - ArcCloudKitClientDefaultAnisetteProvider - sse_decode_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcCloudKitClientDefaultAnisetteProvider( - SseDeserializer deserializer) { - // Codec=Sse (Serialization based), see doc to use other codecs - return ArcCloudKitClientDefaultAnisetteProviderImpl.frbInternalSseDecode( - sse_decode_usize(deserializer), sse_decode_i_32(deserializer)); - } - - @protected - ArcCloudMessagesClientDefaultAnisetteProvider - sse_decode_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcCloudMessagesClientDefaultAnisetteProvider( - SseDeserializer deserializer) { - // Codec=Sse (Serialization based), see doc to use other codecs - return ArcCloudMessagesClientDefaultAnisetteProviderImpl - .frbInternalSseDecode( - sse_decode_usize(deserializer), sse_decode_i_32(deserializer)); + return ArcCloudMessagesClientDefaultAnisetteProviderImpl.frbInternalSseDecode( + sse_decode_usize(deserializer), + sse_decode_i_32(deserializer), + ); } @protected ArcFtClient - sse_decode_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcFTClient( - SseDeserializer deserializer) { + sse_decode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcFTClient( + SseDeserializer deserializer, + ) { // Codec=Sse (Serialization based), see doc to use other codecs return ArcFtClientImpl.frbInternalSseDecode( - sse_decode_usize(deserializer), sse_decode_i_32(deserializer)); + sse_decode_usize(deserializer), + sse_decode_i_32(deserializer), + ); } @protected ArcFindMyClientDefaultAnisetteProvider - sse_decode_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcFindMyClientDefaultAnisetteProvider( - SseDeserializer deserializer) { + sse_decode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcFindMyClientDefaultAnisetteProvider( + SseDeserializer deserializer, + ) { // Codec=Sse (Serialization based), see doc to use other codecs return ArcFindMyClientDefaultAnisetteProviderImpl.frbInternalSseDecode( - sse_decode_usize(deserializer), sse_decode_i_32(deserializer)); + sse_decode_usize(deserializer), + sse_decode_i_32(deserializer), + ); } @protected ArcImClient - sse_decode_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcIMClient( - SseDeserializer deserializer) { + sse_decode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcIMClient( + SseDeserializer deserializer, + ) { // Codec=Sse (Serialization based), see doc to use other codecs return ArcImClientImpl.frbInternalSseDecode( - sse_decode_usize(deserializer), sse_decode_i_32(deserializer)); + sse_decode_usize(deserializer), + sse_decode_i_32(deserializer), + ); } @protected ArcIdmsAuthListener - sse_decode_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcIdmsAuthListener( - SseDeserializer deserializer) { + sse_decode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcIdmsAuthListener( + SseDeserializer deserializer, + ) { // Codec=Sse (Serialization based), see doc to use other codecs return ArcIdmsAuthListenerImpl.frbInternalSseDecode( - sse_decode_usize(deserializer), sse_decode_i_32(deserializer)); + sse_decode_usize(deserializer), + sse_decode_i_32(deserializer), + ); } @protected ArcKeychainClientDefaultAnisetteProvider - sse_decode_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcKeychainClientDefaultAnisetteProvider( - SseDeserializer deserializer) { + sse_decode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcKeychainClientDefaultAnisetteProvider( + SseDeserializer deserializer, + ) { // Codec=Sse (Serialization based), see doc to use other codecs return ArcKeychainClientDefaultAnisetteProviderImpl.frbInternalSseDecode( - sse_decode_usize(deserializer), sse_decode_i_32(deserializer)); + sse_decode_usize(deserializer), + sse_decode_i_32(deserializer), + ); } @protected ArcMutexAppleAccountDefaultAnisetteProvider - sse_decode_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcMutexAppleAccountDefaultAnisetteProvider( - SseDeserializer deserializer) { + sse_decode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcMutexAppleAccountDefaultAnisetteProvider( + SseDeserializer deserializer, + ) { // Codec=Sse (Serialization based), see doc to use other codecs return ArcMutexAppleAccountDefaultAnisetteProviderImpl.frbInternalSseDecode( - sse_decode_usize(deserializer), sse_decode_i_32(deserializer)); + sse_decode_usize(deserializer), + sse_decode_i_32(deserializer), + ); } @protected ArcMutexOptionCircleClientSessionDefaultAnisetteProvider - sse_decode_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcMutexOptionCircleClientSessionDefaultAnisetteProvider( - SseDeserializer deserializer) { + sse_decode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcMutexOptionCircleClientSessionDefaultAnisetteProvider( + SseDeserializer deserializer, + ) { // Codec=Sse (Serialization based), see doc to use other codecs - return ArcMutexOptionCircleClientSessionDefaultAnisetteProviderImpl - .frbInternalSseDecode( - sse_decode_usize(deserializer), sse_decode_i_32(deserializer)); + return ArcMutexOptionCircleClientSessionDefaultAnisetteProviderImpl.frbInternalSseDecode( + sse_decode_usize(deserializer), + sse_decode_i_32(deserializer), + ); } @protected ArcMutexVecActiveCircleSession - sse_decode_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcMutexVecActiveCircleSession( - SseDeserializer deserializer) { + sse_decode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcMutexVecActiveCircleSession( + SseDeserializer deserializer, + ) { // Codec=Sse (Serialization based), see doc to use other codecs return ArcMutexVecActiveCircleSessionImpl.frbInternalSseDecode( - sse_decode_usize(deserializer), sse_decode_i_32(deserializer)); + sse_decode_usize(deserializer), + sse_decode_i_32(deserializer), + ); } @protected ArcPasswordManagerDefaultAnisetteProvider - sse_decode_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcPasswordManagerDefaultAnisetteProvider( - SseDeserializer deserializer) { + sse_decode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcPasswordManagerDefaultAnisetteProvider( + SseDeserializer deserializer, + ) { // Codec=Sse (Serialization based), see doc to use other codecs return ArcPasswordManagerDefaultAnisetteProviderImpl.frbInternalSseDecode( - sse_decode_usize(deserializer), sse_decode_i_32(deserializer)); + sse_decode_usize(deserializer), + sse_decode_i_32(deserializer), + ); } @protected ArcProfilesClientDefaultAnisetteProvider - sse_decode_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcProfilesClientDefaultAnisetteProvider( - SseDeserializer deserializer) { + sse_decode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcProfilesClientDefaultAnisetteProvider( + SseDeserializer deserializer, + ) { // Codec=Sse (Serialization based), see doc to use other codecs return ArcProfilesClientDefaultAnisetteProviderImpl.frbInternalSseDecode( - sse_decode_usize(deserializer), sse_decode_i_32(deserializer)); + sse_decode_usize(deserializer), + sse_decode_i_32(deserializer), + ); } @protected ArcSenderPushMessage - sse_decode_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcSenderPushMessage( - SseDeserializer deserializer) { + sse_decode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcSenderPushMessage( + SseDeserializer deserializer, + ) { // Codec=Sse (Serialization based), see doc to use other codecs return ArcSenderPushMessageImpl.frbInternalSseDecode( - sse_decode_usize(deserializer), sse_decode_i_32(deserializer)); + sse_decode_usize(deserializer), + sse_decode_i_32(deserializer), + ); } @protected ArcSharedPushState - sse_decode_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcSharedPushState( - SseDeserializer deserializer) { + sse_decode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcSharedPushState( + SseDeserializer deserializer, + ) { // Codec=Sse (Serialization based), see doc to use other codecs return ArcSharedPushStateImpl.frbInternalSseDecode( - sse_decode_usize(deserializer), sse_decode_i_32(deserializer)); + sse_decode_usize(deserializer), + sse_decode_i_32(deserializer), + ); } @protected ArcStatusKitClientDefaultAnisetteProvider - sse_decode_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcStatusKitClientDefaultAnisetteProvider( - SseDeserializer deserializer) { + sse_decode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcStatusKitClientDefaultAnisetteProvider( + SseDeserializer deserializer, + ) { // Codec=Sse (Serialization based), see doc to use other codecs return ArcStatusKitClientDefaultAnisetteProviderImpl.frbInternalSseDecode( - sse_decode_usize(deserializer), sse_decode_i_32(deserializer)); + sse_decode_usize(deserializer), + sse_decode_i_32(deserializer), + ); } @protected ArcTokenProviderDefaultAnisetteProvider - sse_decode_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcTokenProviderDefaultAnisetteProvider( - SseDeserializer deserializer) { + sse_decode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcTokenProviderDefaultAnisetteProvider( + SseDeserializer deserializer, + ) { // Codec=Sse (Serialization based), see doc to use other codecs return ArcTokenProviderDefaultAnisetteProviderImpl.frbInternalSseDecode( - sse_decode_usize(deserializer), sse_decode_i_32(deserializer)); + sse_decode_usize(deserializer), + sse_decode_i_32(deserializer), + ); } @protected Asset - sse_decode_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerAsset( - SseDeserializer deserializer) { + sse_decode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerAsset( + SseDeserializer deserializer, + ) { // Codec=Sse (Serialization based), see doc to use other codecs return AssetImpl.frbInternalSseDecode( - sse_decode_usize(deserializer), sse_decode_i_32(deserializer)); + sse_decode_usize(deserializer), + sse_decode_i_32(deserializer), + ); } @protected ChannelInterestToken - sse_decode_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerChannelInterestToken( - SseDeserializer deserializer) { + sse_decode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerChannelInterestToken( + SseDeserializer deserializer, + ) { // Codec=Sse (Serialization based), see doc to use other codecs return ChannelInterestTokenImpl.frbInternalSseDecode( - sse_decode_usize(deserializer), sse_decode_i_32(deserializer)); + sse_decode_usize(deserializer), + sse_decode_i_32(deserializer), + ); } @protected CircleClientSessionDefaultAnisetteProvider - sse_decode_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerCircleClientSessionDefaultAnisetteProvider( - SseDeserializer deserializer) { + sse_decode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerCircleClientSessionDefaultAnisetteProvider( + SseDeserializer deserializer, + ) { // Codec=Sse (Serialization based), see doc to use other codecs return CircleClientSessionDefaultAnisetteProviderImpl.frbInternalSseDecode( - sse_decode_usize(deserializer), sse_decode_i_32(deserializer)); + sse_decode_usize(deserializer), + sse_decode_i_32(deserializer), + ); + } + + @protected + CloudSyncPreparedMessageCreateHandle + sse_decode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerCloudSyncPreparedMessageCreateHandle( + SseDeserializer deserializer, + ) { + // Codec=Sse (Serialization based), see doc to use other codecs + return CloudSyncPreparedMessageCreateHandleImpl.frbInternalSseDecode( + sse_decode_usize(deserializer), + sse_decode_i_32(deserializer), + ); } @protected ConversationLink - sse_decode_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerConversationLink( - SseDeserializer deserializer) { + sse_decode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerConversationLink( + SseDeserializer deserializer, + ) { // Codec=Sse (Serialization based), see doc to use other codecs return ConversationLinkImpl.frbInternalSseDecode( - sse_decode_usize(deserializer), sse_decode_i_32(deserializer)); + sse_decode_usize(deserializer), + sse_decode_i_32(deserializer), + ); } @protected ConversationParticipant - sse_decode_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerConversationParticipant( - SseDeserializer deserializer) { + sse_decode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerConversationParticipant( + SseDeserializer deserializer, + ) { // Codec=Sse (Serialization based), see doc to use other codecs return ConversationParticipantImpl.frbInternalSseDecode( - sse_decode_usize(deserializer), sse_decode_i_32(deserializer)); + sse_decode_usize(deserializer), + sse_decode_i_32(deserializer), + ); } @protected Date - sse_decode_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerDate( - SseDeserializer deserializer) { + sse_decode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerDate( + SseDeserializer deserializer, + ) { // Codec=Sse (Serialization based), see doc to use other codecs return DateImpl.frbInternalSseDecode( - sse_decode_usize(deserializer), sse_decode_i_32(deserializer)); + sse_decode_usize(deserializer), + sse_decode_i_32(deserializer), + ); } @protected EscrowData - sse_decode_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerEscrowData( - SseDeserializer deserializer) { + sse_decode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerEscrowData( + SseDeserializer deserializer, + ) { // Codec=Sse (Serialization based), see doc to use other codecs return EscrowDataImpl.frbInternalSseDecode( - sse_decode_usize(deserializer), sse_decode_i_32(deserializer)); + sse_decode_usize(deserializer), + sse_decode_i_32(deserializer), + ); } @protected FindMyFriendsClientDefaultAnisetteProvider - sse_decode_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerFindMyFriendsClientDefaultAnisetteProvider( - SseDeserializer deserializer) { + sse_decode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerFindMyFriendsClientDefaultAnisetteProvider( + SseDeserializer deserializer, + ) { // Codec=Sse (Serialization based), see doc to use other codecs return FindMyFriendsClientDefaultAnisetteProviderImpl.frbInternalSseDecode( - sse_decode_usize(deserializer), sse_decode_i_32(deserializer)); + sse_decode_usize(deserializer), + sse_decode_i_32(deserializer), + ); } @protected FindMyPhoneClientDefaultAnisetteProvider - sse_decode_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerFindMyPhoneClientDefaultAnisetteProvider( - SseDeserializer deserializer) { + sse_decode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerFindMyPhoneClientDefaultAnisetteProvider( + SseDeserializer deserializer, + ) { // Codec=Sse (Serialization based), see doc to use other codecs return FindMyPhoneClientDefaultAnisetteProviderImpl.frbInternalSseDecode( - sse_decode_usize(deserializer), sse_decode_i_32(deserializer)); + sse_decode_usize(deserializer), + sse_decode_i_32(deserializer), + ); } @protected GZipWrapperAttachmentMeta - sse_decode_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerGZipWrapperAttachmentMeta( - SseDeserializer deserializer) { + sse_decode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerGZipWrapperAttachmentMeta( + SseDeserializer deserializer, + ) { // Codec=Sse (Serialization based), see doc to use other codecs return GZipWrapperAttachmentMetaImpl.frbInternalSseDecode( - sse_decode_usize(deserializer), sse_decode_i_32(deserializer)); + sse_decode_usize(deserializer), + sse_decode_i_32(deserializer), + ); } @protected GZipWrapperChatProto - sse_decode_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerGZipWrapperChatProto( - SseDeserializer deserializer) { + sse_decode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerGZipWrapperChatProto( + SseDeserializer deserializer, + ) { // Codec=Sse (Serialization based), see doc to use other codecs return GZipWrapperChatProtoImpl.frbInternalSseDecode( - sse_decode_usize(deserializer), sse_decode_i_32(deserializer)); + sse_decode_usize(deserializer), + sse_decode_i_32(deserializer), + ); } @protected GZipWrapperMessageProto - sse_decode_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerGZipWrapperMessageProto( - SseDeserializer deserializer) { + sse_decode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerGZipWrapperMessageProto( + SseDeserializer deserializer, + ) { // Codec=Sse (Serialization based), see doc to use other codecs return GZipWrapperMessageProtoImpl.frbInternalSseDecode( - sse_decode_usize(deserializer), sse_decode_i_32(deserializer)); + sse_decode_usize(deserializer), + sse_decode_i_32(deserializer), + ); } @protected GZipWrapperMessageProto2 - sse_decode_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerGZipWrapperMessageProto2( - SseDeserializer deserializer) { + sse_decode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerGZipWrapperMessageProto2( + SseDeserializer deserializer, + ) { // Codec=Sse (Serialization based), see doc to use other codecs return GZipWrapperMessageProto2Impl.frbInternalSseDecode( - sse_decode_usize(deserializer), sse_decode_i_32(deserializer)); + sse_decode_usize(deserializer), + sse_decode_i_32(deserializer), + ); } @protected GZipWrapperMessageProto3 - sse_decode_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerGZipWrapperMessageProto3( - SseDeserializer deserializer) { + sse_decode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerGZipWrapperMessageProto3( + SseDeserializer deserializer, + ) { // Codec=Sse (Serialization based), see doc to use other codecs return GZipWrapperMessageProto3Impl.frbInternalSseDecode( - sse_decode_usize(deserializer), sse_decode_i_32(deserializer)); + sse_decode_usize(deserializer), + sse_decode_i_32(deserializer), + ); } @protected GZipWrapperMessageProto4 - sse_decode_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerGZipWrapperMessageProto4( - SseDeserializer deserializer) { + sse_decode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerGZipWrapperMessageProto4( + SseDeserializer deserializer, + ) { // Codec=Sse (Serialization based), see doc to use other codecs return GZipWrapperMessageProto4Impl.frbInternalSseDecode( - sse_decode_usize(deserializer), sse_decode_i_32(deserializer)); + sse_decode_usize(deserializer), + sse_decode_i_32(deserializer), + ); } @protected IdsngmIdentity - sse_decode_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerIDSNGMIdentity( - SseDeserializer deserializer) { + sse_decode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerIDSNGMIdentity( + SseDeserializer deserializer, + ) { // Codec=Sse (Serialization based), see doc to use other codecs return IdsngmIdentityImpl.frbInternalSseDecode( - sse_decode_usize(deserializer), sse_decode_i_32(deserializer)); + sse_decode_usize(deserializer), + sse_decode_i_32(deserializer), + ); } @protected IdsUser - sse_decode_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerIDSUser( - SseDeserializer deserializer) { + sse_decode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerIDSUser( + SseDeserializer deserializer, + ) { // Codec=Sse (Serialization based), see doc to use other codecs return IdsUserImpl.frbInternalSseDecode( - sse_decode_usize(deserializer), sse_decode_i_32(deserializer)); + sse_decode_usize(deserializer), + sse_decode_i_32(deserializer), + ); } @protected JoinedOsConfig - sse_decode_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerJoinedOSConfig( - SseDeserializer deserializer) { + sse_decode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerJoinedOSConfig( + SseDeserializer deserializer, + ) { // Codec=Sse (Serialization based), see doc to use other codecs return JoinedOsConfigImpl.frbInternalSseDecode( - sse_decode_usize(deserializer), sse_decode_i_32(deserializer)); + sse_decode_usize(deserializer), + sse_decode_i_32(deserializer), + ); } @protected LocationReport - sse_decode_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerLocationReport( - SseDeserializer deserializer) { + sse_decode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerLocationReport( + SseDeserializer deserializer, + ) { // Codec=Sse (Serialization based), see doc to use other codecs return LocationReportImpl.frbInternalSseDecode( - sse_decode_usize(deserializer), sse_decode_i_32(deserializer)); + sse_decode_usize(deserializer), + sse_decode_i_32(deserializer), + ); } @protected MessageFlags - sse_decode_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerMessageFlags( - SseDeserializer deserializer) { + sse_decode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerMessageFlags( + SseDeserializer deserializer, + ) { // Codec=Sse (Serialization based), see doc to use other codecs return MessageFlagsImpl.frbInternalSseDecode( - sse_decode_usize(deserializer), sse_decode_i_32(deserializer)); + sse_decode_usize(deserializer), + sse_decode_i_32(deserializer), + ); } @protected NsArrayLpIconMetadata - sse_decode_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerNSArrayLPIconMetadata( - SseDeserializer deserializer) { + sse_decode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerNSArrayLPIconMetadata( + SseDeserializer deserializer, + ) { // Codec=Sse (Serialization based), see doc to use other codecs return NsArrayLpIconMetadataImpl.frbInternalSseDecode( - sse_decode_usize(deserializer), sse_decode_i_32(deserializer)); + sse_decode_usize(deserializer), + sse_decode_i_32(deserializer), + ); } @protected NsArrayLpImageMetadata - sse_decode_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerNSArrayLPImageMetadata( - SseDeserializer deserializer) { + sse_decode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerNSArrayLPImageMetadata( + SseDeserializer deserializer, + ) { // Codec=Sse (Serialization based), see doc to use other codecs return NsArrayLpImageMetadataImpl.frbInternalSseDecode( - sse_decode_usize(deserializer), sse_decode_i_32(deserializer)); + sse_decode_usize(deserializer), + sse_decode_i_32(deserializer), + ); } @protected PushError - sse_decode_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerPushError( - SseDeserializer deserializer) { + sse_decode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerPushError( + SseDeserializer deserializer, + ) { // Codec=Sse (Serialization based), see doc to use other codecs return PushErrorImpl.frbInternalSseDecode( - sse_decode_usize(deserializer), sse_decode_i_32(deserializer)); + sse_decode_usize(deserializer), + sse_decode_i_32(deserializer), + ); } @protected ReceiverApsMessage - sse_decode_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerReceiverAPSMessage( - SseDeserializer deserializer) { + sse_decode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerReceiverAPSMessage( + SseDeserializer deserializer, + ) { // Codec=Sse (Serialization based), see doc to use other codecs return ReceiverApsMessageImpl.frbInternalSseDecode( - sse_decode_usize(deserializer), sse_decode_i_32(deserializer)); + sse_decode_usize(deserializer), + sse_decode_i_32(deserializer), + ); } @protected SavedHardwareState - sse_decode_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerSavedHardwareState( - SseDeserializer deserializer) { + sse_decode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerSavedHardwareState( + SseDeserializer deserializer, + ) { // Codec=Sse (Serialization based), see doc to use other codecs return SavedHardwareStateImpl.frbInternalSseDecode( - sse_decode_usize(deserializer), sse_decode_i_32(deserializer)); + sse_decode_usize(deserializer), + sse_decode_i_32(deserializer), + ); } @protected Sender - sse_decode_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerSender( - SseDeserializer deserializer) { + sse_decode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerSender( + SseDeserializer deserializer, + ) { // Codec=Sse (Serialization based), see doc to use other codecs return SenderImpl.frbInternalSseDecode( - sse_decode_usize(deserializer), sse_decode_i_32(deserializer)); + sse_decode_usize(deserializer), + sse_decode_i_32(deserializer), + ); } @protected StCollapsedValue - sse_decode_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerStCollapsedValue( - SseDeserializer deserializer) { + sse_decode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerStCollapsedValue( + SseDeserializer deserializer, + ) { // Codec=Sse (Serialization based), see doc to use other codecs return StCollapsedValueImpl.frbInternalSseDecode( - sse_decode_usize(deserializer), sse_decode_i_32(deserializer)); + sse_decode_usize(deserializer), + sse_decode_i_32(deserializer), + ); } @protected SyncManagerDefaultAnisetteProviderMyFilePackager - sse_decode_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerSyncManagerDefaultAnisetteProviderMyFilePackager( - SseDeserializer deserializer) { + sse_decode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerSyncManagerDefaultAnisetteProviderMyFilePackager( + SseDeserializer deserializer, + ) { // Codec=Sse (Serialization based), see doc to use other codecs - return SyncManagerDefaultAnisetteProviderMyFilePackagerImpl - .frbInternalSseDecode( - sse_decode_usize(deserializer), sse_decode_i_32(deserializer)); + return SyncManagerDefaultAnisetteProviderMyFilePackagerImpl.frbInternalSseDecode( + sse_decode_usize(deserializer), + sse_decode_i_32(deserializer), + ); } @protected SystemTime - sse_decode_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerSystemTime( - SseDeserializer deserializer) { + sse_decode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerSystemTime( + SseDeserializer deserializer, + ) { // Codec=Sse (Serialization based), see doc to use other codecs return SystemTimeImpl.frbInternalSseDecode( - sse_decode_usize(deserializer), sse_decode_i_32(deserializer)); + sse_decode_usize(deserializer), + sse_decode_i_32(deserializer), + ); } @protected VerifyBody - sse_decode_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerVerifyBody( - SseDeserializer deserializer) { + sse_decode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerVerifyBody( + SseDeserializer deserializer, + ) { // Codec=Sse (Serialization based), see doc to use other codecs return VerifyBodyImpl.frbInternalSseDecode( - sse_decode_usize(deserializer), sse_decode_i_32(deserializer)); + sse_decode_usize(deserializer), + sse_decode_i_32(deserializer), + ); } @protected ViableBottle - sse_decode_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerViableBottle( - SseDeserializer deserializer) { + sse_decode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerViableBottle( + SseDeserializer deserializer, + ) { // Codec=Sse (Serialization based), see doc to use other codecs return ViableBottleImpl.frbInternalSseDecode( - sse_decode_usize(deserializer), sse_decode_i_32(deserializer)); + sse_decode_usize(deserializer), + sse_decode_i_32(deserializer), + ); } @protected - Set sse_decode_Set_ft_member(SseDeserializer deserializer) { + ApsWatcher + sse_decode_Auto_RefMut_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerAPSWatcher( + SseDeserializer deserializer, + ) { // Codec=Sse (Serialization based), see doc to use other codecs - var inner = sse_decode_list_ft_member(deserializer); - return Set.from(inner); + return ApsWatcherImpl.frbInternalSseDecode( + sse_decode_usize(deserializer), + sse_decode_i_32(deserializer), + ); } @protected - RustStreamSink - sse_decode_StreamSink_mmcs_transfer_progress_Sse( - SseDeserializer deserializer) { + CircleClientSessionDefaultAnisetteProvider + sse_decode_Auto_RefMut_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerCircleClientSessionDefaultAnisetteProvider( + SseDeserializer deserializer, + ) { // Codec=Sse (Serialization based), see doc to use other codecs - throw UnimplementedError('Unreachable ()'); + return CircleClientSessionDefaultAnisetteProviderImpl.frbInternalSseDecode( + sse_decode_usize(deserializer), + sse_decode_i_32(deserializer), + ); } @protected - RustStreamSink sse_decode_StreamSink_transfer_progress_Sse( - SseDeserializer deserializer) { + FindMyFriendsClientDefaultAnisetteProvider + sse_decode_Auto_RefMut_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerFindMyFriendsClientDefaultAnisetteProvider( + SseDeserializer deserializer, + ) { // Codec=Sse (Serialization based), see doc to use other codecs - throw UnimplementedError('Unreachable ()'); + return FindMyFriendsClientDefaultAnisetteProviderImpl.frbInternalSseDecode( + sse_decode_usize(deserializer), + sse_decode_i_32(deserializer), + ); } @protected - String sse_decode_String(SseDeserializer deserializer) { + FindMyPhoneClientDefaultAnisetteProvider + sse_decode_Auto_RefMut_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerFindMyPhoneClientDefaultAnisetteProvider( + SseDeserializer deserializer, + ) { // Codec=Sse (Serialization based), see doc to use other codecs - var inner = sse_decode_list_prim_u_8_strict(deserializer); - return utf8.decoder.convert(inner); + return FindMyPhoneClientDefaultAnisetteProviderImpl.frbInternalSseDecode( + sse_decode_usize(deserializer), + sse_decode_i_32(deserializer), + ); } @protected - Address sse_decode_address(SseDeserializer deserializer) { + LocationReport + sse_decode_Auto_RefMut_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerLocationReport( + SseDeserializer deserializer, + ) { // Codec=Sse (Serialization based), see doc to use other codecs - var var_administrativeArea = sse_decode_opt_String(deserializer); - var var_country = sse_decode_String(deserializer); - var var_countryCode = sse_decode_String(deserializer); - var var_formattedAddressLines = sse_decode_opt_list_String(deserializer); - var var_locality = sse_decode_opt_String(deserializer); - var var_stateCode = sse_decode_opt_String(deserializer); - var var_streetAddress = sse_decode_opt_String(deserializer); - var var_streetName = sse_decode_opt_String(deserializer); - return Address( - administrativeArea: var_administrativeArea, - country: var_country, - countryCode: var_countryCode, - formattedAddressLines: var_formattedAddressLines, - locality: var_locality, - stateCode: var_stateCode, - streetAddress: var_streetAddress, - streetName: var_streetName); + return LocationReportImpl.frbInternalSseDecode( + sse_decode_usize(deserializer), + sse_decode_i_32(deserializer), + ); } @protected - AkData sse_decode_ak_data(SseDeserializer deserializer) { + ReceiverApsMessage + sse_decode_Auto_RefMut_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerReceiverAPSMessage( + SseDeserializer deserializer, + ) { // Codec=Sse (Serialization based), see doc to use other codecs - var var_lat = sse_decode_f_32(deserializer); - var var_lng = sse_decode_f_32(deserializer); - return AkData(lat: var_lat, lng: var_lng); + return ReceiverApsMessageImpl.frbInternalSseDecode( + sse_decode_usize(deserializer), + sse_decode_i_32(deserializer), + ); } @protected - ApsAlert sse_decode_aps_alert(SseDeserializer deserializer) { + SavedHardwareState + sse_decode_Auto_RefMut_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerSavedHardwareState( + SseDeserializer deserializer, + ) { // Codec=Sse (Serialization based), see doc to use other codecs - var var_title = sse_decode_String(deserializer); - var var_body = sse_decode_String(deserializer); - var var_sbdy = sse_decode_String(deserializer); - var var_defbtn = sse_decode_String(deserializer); - var var_albtn = sse_decode_String(deserializer); - return ApsAlert( - title: var_title, - body: var_body, - sbdy: var_sbdy, - defbtn: var_defbtn, - albtn: var_albtn); + return SavedHardwareStateImpl.frbInternalSseDecode( + sse_decode_usize(deserializer), + sse_decode_i_32(deserializer), + ); } @protected - ApsData sse_decode_aps_data(SseDeserializer deserializer) { + ViableBottle + sse_decode_Auto_RefMut_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerViableBottle( + SseDeserializer deserializer, + ) { // Codec=Sse (Serialization based), see doc to use other codecs - var var_alert = sse_decode_aps_alert(deserializer); - return ApsData(alert: var_alert); + return ViableBottleImpl.frbInternalSseDecode( + sse_decode_usize(deserializer), + sse_decode_i_32(deserializer), + ); } @protected - Attachment sse_decode_attachment(SseDeserializer deserializer) { + ApsConnection + sse_decode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerAPSConnection( + SseDeserializer deserializer, + ) { // Codec=Sse (Serialization based), see doc to use other codecs - var var_aType = sse_decode_attachment_type(deserializer); - var var_part_ = sse_decode_CastedPrimitive_u_64(deserializer); - var var_utiType = sse_decode_String(deserializer); - var var_mime = sse_decode_String(deserializer); - var var_name = sse_decode_String(deserializer); - var var_iris = sse_decode_bool(deserializer); - return Attachment( - aType: var_aType, - part_: var_part_, - utiType: var_utiType, - mime: var_mime, - name: var_name, - iris: var_iris); + return ApsConnectionImpl.frbInternalSseDecode( + sse_decode_usize(deserializer), + sse_decode_i_32(deserializer), + ); } @protected - AttachmentMeta sse_decode_attachment_meta(SseDeserializer deserializer) { + ArcAnisetteClientDefaultAnisetteProvider + sse_decode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcAnisetteClientDefaultAnisetteProvider( + SseDeserializer deserializer, + ) { // Codec=Sse (Serialization based), see doc to use other codecs - var var_mimeType = sse_decode_opt_String(deserializer); - var var_startDate = sse_decode_CastedPrimitive_i_64(deserializer); - var var_totalBytes = sse_decode_CastedPrimitive_i_64(deserializer); - var var_transferState = sse_decode_i_32(deserializer); - var var_isSticker = sse_decode_bool(deserializer); - var var_guid = sse_decode_String(deserializer); - var var_hideAttachment = sse_decode_bool(deserializer); - var var_userInfo = - sse_decode_opt_box_autoadd_mmcs_attachment_meta(deserializer); - var var_filename = sse_decode_opt_String(deserializer); - var var_extras = - sse_decode_opt_box_autoadd_attachment_meta_extra(deserializer); - var var_isOutgoing = sse_decode_bool(deserializer); - var var_transferName = sse_decode_opt_String(deserializer); - var var_version = sse_decode_i_32(deserializer); - var var_uti = sse_decode_opt_String(deserializer); - var var_createdDate = sse_decode_CastedPrimitive_i_64(deserializer); - var var_pathc = sse_decode_opt_String(deserializer); - var var_md5 = sse_decode_opt_String(deserializer); - return AttachmentMeta( - mimeType: var_mimeType, - startDate: var_startDate, - totalBytes: var_totalBytes, - transferState: var_transferState, - isSticker: var_isSticker, - guid: var_guid, - hideAttachment: var_hideAttachment, - userInfo: var_userInfo, - filename: var_filename, - extras: var_extras, - isOutgoing: var_isOutgoing, - transferName: var_transferName, - version: var_version, - uti: var_uti, - createdDate: var_createdDate, - pathc: var_pathc, - md5: var_md5); + return ArcAnisetteClientDefaultAnisetteProviderImpl.frbInternalSseDecode( + sse_decode_usize(deserializer), + sse_decode_i_32(deserializer), + ); } @protected - AttachmentMetaExtra sse_decode_attachment_meta_extra( - SseDeserializer deserializer) { + ArcCloudKitClientDefaultAnisetteProvider + sse_decode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcCloudKitClientDefaultAnisetteProvider( + SseDeserializer deserializer, + ) { // Codec=Sse (Serialization based), see doc to use other codecs - var var_previewGenerationState = - sse_decode_opt_box_autoadd_num_or_string(deserializer); - return AttachmentMetaExtra( - previewGenerationState: var_previewGenerationState); + return ArcCloudKitClientDefaultAnisetteProviderImpl.frbInternalSseDecode( + sse_decode_usize(deserializer), + sse_decode_i_32(deserializer), + ); } @protected - AttachmentType sse_decode_attachment_type(SseDeserializer deserializer) { + ArcCloudMessagesClientDefaultAnisetteProvider + sse_decode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcCloudMessagesClientDefaultAnisetteProvider( + SseDeserializer deserializer, + ) { // Codec=Sse (Serialization based), see doc to use other codecs - - var tag_ = sse_decode_i_32(deserializer); - switch (tag_) { - case 0: - var var_field0 = sse_decode_list_prim_u_8_strict(deserializer); - return AttachmentType_Inline(var_field0); - case 1: - var var_field0 = sse_decode_box_autoadd_mmcs_file(deserializer); - return AttachmentType_MMCS(var_field0); - default: - throw UnimplementedError(''); - } + return ArcCloudMessagesClientDefaultAnisetteProviderImpl.frbInternalSseDecode( + sse_decode_usize(deserializer), + sse_decode_i_32(deserializer), + ); } @protected - Balloon sse_decode_balloon(SseDeserializer deserializer) { + ArcFtClient + sse_decode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcFTClient( + SseDeserializer deserializer, + ) { // Codec=Sse (Serialization based), see doc to use other codecs - var var_url = sse_decode_String(deserializer); - var var_session = sse_decode_opt_String(deserializer); - var var_layout = sse_decode_opt_box_autoadd_balloon_layout(deserializer); - var var_ldText = sse_decode_opt_String(deserializer); - var var_isLive = sse_decode_bool(deserializer); - var var_icon = sse_decode_opt_list_prim_u_8_strict(deserializer); - return Balloon( - url: var_url, - session: var_session, - layout: var_layout, - ldText: var_ldText, - isLive: var_isLive, - icon: var_icon); + return ArcFtClientImpl.frbInternalSseDecode( + sse_decode_usize(deserializer), + sse_decode_i_32(deserializer), + ); } @protected - BalloonLayout sse_decode_balloon_layout(SseDeserializer deserializer) { + ArcFindMyClientDefaultAnisetteProvider + sse_decode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcFindMyClientDefaultAnisetteProvider( + SseDeserializer deserializer, + ) { // Codec=Sse (Serialization based), see doc to use other codecs - - var tag_ = sse_decode_i_32(deserializer); - switch (tag_) { - case 0: - var var_imageSubtitle = sse_decode_String(deserializer); - var var_imageTitle = sse_decode_String(deserializer); - var var_caption = sse_decode_String(deserializer); - var var_secondarySubcaption = sse_decode_String(deserializer); - var var_tertiarySubcaption = sse_decode_String(deserializer); - var var_subcaption = sse_decode_String(deserializer); - var var_class_ = sse_decode_ns_dictionary_class(deserializer); - return BalloonLayout_TemplateLayout( - imageSubtitle: var_imageSubtitle, - imageTitle: var_imageTitle, - caption: var_caption, - secondarySubcaption: var_secondarySubcaption, - tertiarySubcaption: var_tertiarySubcaption, - subcaption: var_subcaption, - class_: var_class_); - default: - throw UnimplementedError(''); - } + return ArcFindMyClientDefaultAnisetteProviderImpl.frbInternalSseDecode( + sse_decode_usize(deserializer), + sse_decode_i_32(deserializer), + ); } @protected - BeaconAttributes sse_decode_beacon_attributes(SseDeserializer deserializer) { + ArcImClient + sse_decode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcIMClient( + SseDeserializer deserializer, + ) { // Codec=Sse (Serialization based), see doc to use other codecs - var var_name = sse_decode_String(deserializer); - var var_roleId = sse_decode_i_64(deserializer); - var var_emoji = sse_decode_String(deserializer); - var var_systemVersion = sse_decode_String(deserializer); - var var_serialNumber = sse_decode_String(deserializer); - return BeaconAttributes( - name: var_name, - roleId: var_roleId, - emoji: var_emoji, - systemVersion: var_systemVersion, - serialNumber: var_serialNumber); + return ArcImClientImpl.frbInternalSseDecode( + sse_decode_usize(deserializer), + sse_decode_i_32(deserializer), + ); } @protected - BeaconNamingRecord sse_decode_beacon_naming_record( - SseDeserializer deserializer) { + ArcIdmsAuthListener + sse_decode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcIdmsAuthListener( + SseDeserializer deserializer, + ) { // Codec=Sse (Serialization based), see doc to use other codecs - var var_emoji = sse_decode_String(deserializer); - var var_name = sse_decode_String(deserializer); - var var_associatedBeacon = sse_decode_String(deserializer); - var var_roleId = sse_decode_CastedPrimitive_i_64(deserializer); - return BeaconNamingRecord( - emoji: var_emoji, - name: var_name, - associatedBeacon: var_associatedBeacon, - roleId: var_roleId); + return ArcIdmsAuthListenerImpl.frbInternalSseDecode( + sse_decode_usize(deserializer), + sse_decode_i_32(deserializer), + ); } @protected - bool sse_decode_bool(SseDeserializer deserializer) { + ArcKeychainClientDefaultAnisetteProvider + sse_decode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcKeychainClientDefaultAnisetteProvider( + SseDeserializer deserializer, + ) { // Codec=Sse (Serialization based), see doc to use other codecs - return deserializer.buffer.getUint8() != 0; + return ArcKeychainClientDefaultAnisetteProviderImpl.frbInternalSseDecode( + sse_decode_usize(deserializer), + sse_decode_i_32(deserializer), + ); } @protected - ApsState - sse_decode_box_autoadd_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerAPSState( - SseDeserializer deserializer) { + ArcMutexAppleAccountDefaultAnisetteProvider + sse_decode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcMutexAppleAccountDefaultAnisetteProvider( + SseDeserializer deserializer, + ) { // Codec=Sse (Serialization based), see doc to use other codecs - return (sse_decode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerAPSState( - deserializer)); + return ArcMutexAppleAccountDefaultAnisetteProviderImpl.frbInternalSseDecode( + sse_decode_usize(deserializer), + sse_decode_i_32(deserializer), + ); } @protected - ArcCloudKitClientDefaultAnisetteProvider - sse_decode_box_autoadd_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcCloudKitClientDefaultAnisetteProvider( - SseDeserializer deserializer) { + ArcMutexOptionCircleClientSessionDefaultAnisetteProvider + sse_decode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcMutexOptionCircleClientSessionDefaultAnisetteProvider( + SseDeserializer deserializer, + ) { // Codec=Sse (Serialization based), see doc to use other codecs - return (sse_decode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcCloudKitClientDefaultAnisetteProvider( - deserializer)); + return ArcMutexOptionCircleClientSessionDefaultAnisetteProviderImpl.frbInternalSseDecode( + sse_decode_usize(deserializer), + sse_decode_i_32(deserializer), + ); } @protected - ArcCloudMessagesClientDefaultAnisetteProvider - sse_decode_box_autoadd_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcCloudMessagesClientDefaultAnisetteProvider( - SseDeserializer deserializer) { + ArcMutexVecActiveCircleSession + sse_decode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcMutexVecActiveCircleSession( + SseDeserializer deserializer, + ) { // Codec=Sse (Serialization based), see doc to use other codecs - return (sse_decode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcCloudMessagesClientDefaultAnisetteProvider( - deserializer)); + return ArcMutexVecActiveCircleSessionImpl.frbInternalSseDecode( + sse_decode_usize(deserializer), + sse_decode_i_32(deserializer), + ); } @protected - ArcFindMyClientDefaultAnisetteProvider - sse_decode_box_autoadd_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcFindMyClientDefaultAnisetteProvider( - SseDeserializer deserializer) { + ArcPasswordManagerDefaultAnisetteProvider + sse_decode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcPasswordManagerDefaultAnisetteProvider( + SseDeserializer deserializer, + ) { // Codec=Sse (Serialization based), see doc to use other codecs - return (sse_decode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcFindMyClientDefaultAnisetteProvider( - deserializer)); + return ArcPasswordManagerDefaultAnisetteProviderImpl.frbInternalSseDecode( + sse_decode_usize(deserializer), + sse_decode_i_32(deserializer), + ); } @protected - ArcKeychainClientDefaultAnisetteProvider - sse_decode_box_autoadd_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcKeychainClientDefaultAnisetteProvider( - SseDeserializer deserializer) { + ArcProfilesClientDefaultAnisetteProvider + sse_decode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcProfilesClientDefaultAnisetteProvider( + SseDeserializer deserializer, + ) { // Codec=Sse (Serialization based), see doc to use other codecs - return (sse_decode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcKeychainClientDefaultAnisetteProvider( - deserializer)); + return ArcProfilesClientDefaultAnisetteProviderImpl.frbInternalSseDecode( + sse_decode_usize(deserializer), + sse_decode_i_32(deserializer), + ); } @protected - ArcMutexAppleAccountDefaultAnisetteProvider - sse_decode_box_autoadd_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcMutexAppleAccountDefaultAnisetteProvider( - SseDeserializer deserializer) { + ArcSenderPushMessage + sse_decode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcSenderPushMessage( + SseDeserializer deserializer, + ) { // Codec=Sse (Serialization based), see doc to use other codecs - return (sse_decode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcMutexAppleAccountDefaultAnisetteProvider( - deserializer)); + return ArcSenderPushMessageImpl.frbInternalSseDecode( + sse_decode_usize(deserializer), + sse_decode_i_32(deserializer), + ); } @protected - ArcPasswordManagerDefaultAnisetteProvider - sse_decode_box_autoadd_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcPasswordManagerDefaultAnisetteProvider( - SseDeserializer deserializer) { + ArcSharedPushState + sse_decode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcSharedPushState( + SseDeserializer deserializer, + ) { // Codec=Sse (Serialization based), see doc to use other codecs - return (sse_decode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcPasswordManagerDefaultAnisetteProvider( - deserializer)); + return ArcSharedPushStateImpl.frbInternalSseDecode( + sse_decode_usize(deserializer), + sse_decode_i_32(deserializer), + ); } @protected - Asset - sse_decode_box_autoadd_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerAsset( - SseDeserializer deserializer) { + ArcStatusKitClientDefaultAnisetteProvider + sse_decode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcStatusKitClientDefaultAnisetteProvider( + SseDeserializer deserializer, + ) { // Codec=Sse (Serialization based), see doc to use other codecs - return (sse_decode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerAsset( - deserializer)); + return ArcStatusKitClientDefaultAnisetteProviderImpl.frbInternalSseDecode( + sse_decode_usize(deserializer), + sse_decode_i_32(deserializer), + ); } @protected - ChannelInterestToken - sse_decode_box_autoadd_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerChannelInterestToken( - SseDeserializer deserializer) { + ArcTokenProviderDefaultAnisetteProvider + sse_decode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcTokenProviderDefaultAnisetteProvider( + SseDeserializer deserializer, + ) { // Codec=Sse (Serialization based), see doc to use other codecs - return (sse_decode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerChannelInterestToken( - deserializer)); + return ArcTokenProviderDefaultAnisetteProviderImpl.frbInternalSseDecode( + sse_decode_usize(deserializer), + sse_decode_i_32(deserializer), + ); } @protected - CircleClientSessionDefaultAnisetteProvider - sse_decode_box_autoadd_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerCircleClientSessionDefaultAnisetteProvider( - SseDeserializer deserializer) { + CloudSyncPreparedMessageCreateHandle + sse_decode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerCloudSyncPreparedMessageCreateHandle( + SseDeserializer deserializer, + ) { // Codec=Sse (Serialization based), see doc to use other codecs - return (sse_decode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerCircleClientSessionDefaultAnisetteProvider( - deserializer)); + return CloudSyncPreparedMessageCreateHandleImpl.frbInternalSseDecode( + sse_decode_usize(deserializer), + sse_decode_i_32(deserializer), + ); } @protected - ConversationLink - sse_decode_box_autoadd_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerConversationLink( - SseDeserializer deserializer) { + Date + sse_decode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerDate( + SseDeserializer deserializer, + ) { // Codec=Sse (Serialization based), see doc to use other codecs - return (sse_decode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerConversationLink( - deserializer)); + return DateImpl.frbInternalSseDecode( + sse_decode_usize(deserializer), + sse_decode_i_32(deserializer), + ); } @protected - ConversationParticipant - sse_decode_box_autoadd_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerConversationParticipant( - SseDeserializer deserializer) { + EscrowData + sse_decode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerEscrowData( + SseDeserializer deserializer, + ) { // Codec=Sse (Serialization based), see doc to use other codecs - return (sse_decode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerConversationParticipant( - deserializer)); + return EscrowDataImpl.frbInternalSseDecode( + sse_decode_usize(deserializer), + sse_decode_i_32(deserializer), + ); } @protected - Date - sse_decode_box_autoadd_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerDate( - SseDeserializer deserializer) { + GZipWrapperAttachmentMeta + sse_decode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerGZipWrapperAttachmentMeta( + SseDeserializer deserializer, + ) { // Codec=Sse (Serialization based), see doc to use other codecs - return (sse_decode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerDate( - deserializer)); + return GZipWrapperAttachmentMetaImpl.frbInternalSseDecode( + sse_decode_usize(deserializer), + sse_decode_i_32(deserializer), + ); } @protected GZipWrapperChatProto - sse_decode_box_autoadd_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerGZipWrapperChatProto( - SseDeserializer deserializer) { + sse_decode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerGZipWrapperChatProto( + SseDeserializer deserializer, + ) { // Codec=Sse (Serialization based), see doc to use other codecs - return (sse_decode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerGZipWrapperChatProto( - deserializer)); + return GZipWrapperChatProtoImpl.frbInternalSseDecode( + sse_decode_usize(deserializer), + sse_decode_i_32(deserializer), + ); + } + + @protected + GZipWrapperMessageProto + sse_decode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerGZipWrapperMessageProto( + SseDeserializer deserializer, + ) { + // Codec=Sse (Serialization based), see doc to use other codecs + return GZipWrapperMessageProtoImpl.frbInternalSseDecode( + sse_decode_usize(deserializer), + sse_decode_i_32(deserializer), + ); } @protected GZipWrapperMessageProto2 - sse_decode_box_autoadd_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerGZipWrapperMessageProto2( - SseDeserializer deserializer) { + sse_decode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerGZipWrapperMessageProto2( + SseDeserializer deserializer, + ) { // Codec=Sse (Serialization based), see doc to use other codecs - return (sse_decode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerGZipWrapperMessageProto2( - deserializer)); + return GZipWrapperMessageProto2Impl.frbInternalSseDecode( + sse_decode_usize(deserializer), + sse_decode_i_32(deserializer), + ); } @protected GZipWrapperMessageProto3 - sse_decode_box_autoadd_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerGZipWrapperMessageProto3( - SseDeserializer deserializer) { + sse_decode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerGZipWrapperMessageProto3( + SseDeserializer deserializer, + ) { // Codec=Sse (Serialization based), see doc to use other codecs - return (sse_decode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerGZipWrapperMessageProto3( - deserializer)); + return GZipWrapperMessageProto3Impl.frbInternalSseDecode( + sse_decode_usize(deserializer), + sse_decode_i_32(deserializer), + ); } @protected GZipWrapperMessageProto4 - sse_decode_box_autoadd_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerGZipWrapperMessageProto4( - SseDeserializer deserializer) { + sse_decode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerGZipWrapperMessageProto4( + SseDeserializer deserializer, + ) { // Codec=Sse (Serialization based), see doc to use other codecs - return (sse_decode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerGZipWrapperMessageProto4( - deserializer)); + return GZipWrapperMessageProto4Impl.frbInternalSseDecode( + sse_decode_usize(deserializer), + sse_decode_i_32(deserializer), + ); } @protected - IdsUser - sse_decode_box_autoadd_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerIDSUser( - SseDeserializer deserializer) { + IdsngmIdentity + sse_decode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerIDSNGMIdentity( + SseDeserializer deserializer, + ) { // Codec=Sse (Serialization based), see doc to use other codecs - return (sse_decode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerIDSUser( - deserializer)); + return IdsngmIdentityImpl.frbInternalSseDecode( + sse_decode_usize(deserializer), + sse_decode_i_32(deserializer), + ); } @protected - LocationReport - sse_decode_box_autoadd_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerLocationReport( - SseDeserializer deserializer) { + IdsUser + sse_decode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerIDSUser( + SseDeserializer deserializer, + ) { // Codec=Sse (Serialization based), see doc to use other codecs - return (sse_decode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerLocationReport( - deserializer)); + return IdsUserImpl.frbInternalSseDecode( + sse_decode_usize(deserializer), + sse_decode_i_32(deserializer), + ); } @protected - NsArrayLpIconMetadata - sse_decode_box_autoadd_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerNSArrayLPIconMetadata( - SseDeserializer deserializer) { + JoinedOsConfig + sse_decode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerJoinedOSConfig( + SseDeserializer deserializer, + ) { // Codec=Sse (Serialization based), see doc to use other codecs - return (sse_decode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerNSArrayLPIconMetadata( - deserializer)); + return JoinedOsConfigImpl.frbInternalSseDecode( + sse_decode_usize(deserializer), + sse_decode_i_32(deserializer), + ); } @protected - NsArrayLpImageMetadata - sse_decode_box_autoadd_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerNSArrayLPImageMetadata( - SseDeserializer deserializer) { + LocationReport + sse_decode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerLocationReport( + SseDeserializer deserializer, + ) { // Codec=Sse (Serialization based), see doc to use other codecs - return (sse_decode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerNSArrayLPImageMetadata( - deserializer)); + return LocationReportImpl.frbInternalSseDecode( + sse_decode_usize(deserializer), + sse_decode_i_32(deserializer), + ); } @protected - PushError - sse_decode_box_autoadd_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerPushError( - SseDeserializer deserializer) { + MessageFlags + sse_decode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerMessageFlags( + SseDeserializer deserializer, + ) { // Codec=Sse (Serialization based), see doc to use other codecs - return (sse_decode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerPushError( - deserializer)); + return MessageFlagsImpl.frbInternalSseDecode( + sse_decode_usize(deserializer), + sse_decode_i_32(deserializer), + ); } @protected SavedHardwareState - sse_decode_box_autoadd_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerSavedHardwareState( - SseDeserializer deserializer) { + sse_decode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerSavedHardwareState( + SseDeserializer deserializer, + ) { // Codec=Sse (Serialization based), see doc to use other codecs - return (sse_decode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerSavedHardwareState( - deserializer)); + return SavedHardwareStateImpl.frbInternalSseDecode( + sse_decode_usize(deserializer), + sse_decode_i_32(deserializer), + ); } @protected - SyncManagerDefaultAnisetteProviderMyFilePackager - sse_decode_box_autoadd_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerSyncManagerDefaultAnisetteProviderMyFilePackager( - SseDeserializer deserializer) { + Sender + sse_decode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerSender( + SseDeserializer deserializer, + ) { // Codec=Sse (Serialization based), see doc to use other codecs - return (sse_decode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerSyncManagerDefaultAnisetteProviderMyFilePackager( - deserializer)); + return SenderImpl.frbInternalSseDecode( + sse_decode_usize(deserializer), + sse_decode_i_32(deserializer), + ); } @protected - SystemTime - sse_decode_box_autoadd_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerSystemTime( - SseDeserializer deserializer) { + StCollapsedValue + sse_decode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerStCollapsedValue( + SseDeserializer deserializer, + ) { // Codec=Sse (Serialization based), see doc to use other codecs - return (sse_decode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerSystemTime( - deserializer)); + return StCollapsedValueImpl.frbInternalSseDecode( + sse_decode_usize(deserializer), + sse_decode_i_32(deserializer), + ); } @protected - Address sse_decode_box_autoadd_address(SseDeserializer deserializer) { + SyncManagerDefaultAnisetteProviderMyFilePackager + sse_decode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerSyncManagerDefaultAnisetteProviderMyFilePackager( + SseDeserializer deserializer, + ) { // Codec=Sse (Serialization based), see doc to use other codecs - return (sse_decode_address(deserializer)); + return SyncManagerDefaultAnisetteProviderMyFilePackagerImpl.frbInternalSseDecode( + sse_decode_usize(deserializer), + sse_decode_i_32(deserializer), + ); } @protected - Attachment sse_decode_box_autoadd_attachment(SseDeserializer deserializer) { + VerifyBody + sse_decode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerVerifyBody( + SseDeserializer deserializer, + ) { // Codec=Sse (Serialization based), see doc to use other codecs - return (sse_decode_attachment(deserializer)); + return VerifyBodyImpl.frbInternalSseDecode( + sse_decode_usize(deserializer), + sse_decode_i_32(deserializer), + ); } @protected - AttachmentMeta sse_decode_box_autoadd_attachment_meta( - SseDeserializer deserializer) { + ViableBottle + sse_decode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerViableBottle( + SseDeserializer deserializer, + ) { // Codec=Sse (Serialization based), see doc to use other codecs - return (sse_decode_attachment_meta(deserializer)); + return ViableBottleImpl.frbInternalSseDecode( + sse_decode_usize(deserializer), + sse_decode_i_32(deserializer), + ); } @protected - AttachmentMetaExtra sse_decode_box_autoadd_attachment_meta_extra( - SseDeserializer deserializer) { + int sse_decode_CastedPrimitive_i_64(SseDeserializer deserializer) { // Codec=Sse (Serialization based), see doc to use other codecs - return (sse_decode_attachment_meta_extra(deserializer)); + var inner = sse_decode_i_64(deserializer); + return inner.toInt(); } @protected - Balloon sse_decode_box_autoadd_balloon(SseDeserializer deserializer) { + int sse_decode_CastedPrimitive_u_64(SseDeserializer deserializer) { // Codec=Sse (Serialization based), see doc to use other codecs - return (sse_decode_balloon(deserializer)); + var inner = sse_decode_u_64(deserializer); + return inner.toInt(); } @protected - BalloonLayout sse_decode_box_autoadd_balloon_layout( - SseDeserializer deserializer) { + int sse_decode_CastedPrimitive_usize(SseDeserializer deserializer) { // Codec=Sse (Serialization based), see doc to use other codecs - return (sse_decode_balloon_layout(deserializer)); + var inner = sse_decode_usize(deserializer); + return inner.toInt(); } @protected - BeaconAttributes sse_decode_box_autoadd_beacon_attributes( - SseDeserializer deserializer) { + Object sse_decode_DartOpaque(SseDeserializer deserializer) { // Codec=Sse (Serialization based), see doc to use other codecs - return (sse_decode_beacon_attributes(deserializer)); + var inner = sse_decode_usize(deserializer); + return decodeDartOpaque(inner, generalizedFrbRustBinding); } @protected - BeaconNamingRecord sse_decode_box_autoadd_beacon_naming_record( - SseDeserializer deserializer) { + Map + sse_decode_Map_String_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerAsset( + SseDeserializer deserializer, + ) { // Codec=Sse (Serialization based), see doc to use other codecs - return (sse_decode_beacon_naming_record(deserializer)); + var inner = + sse_decode_list_record_string_auto_owned_rust_opaque_flutter_rust_bridgefor_generated_rust_auto_opaque_inner_asset( + deserializer, + ); + return Map.fromEntries(inner.map((e) => MapEntry(e.$1, e.$2))); } @protected - bool sse_decode_box_autoadd_bool(SseDeserializer deserializer) { + Map + sse_decode_Map_String_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerStCollapsedValue( + SseDeserializer deserializer, + ) { // Codec=Sse (Serialization based), see doc to use other codecs - return (sse_decode_bool(deserializer)); + var inner = + sse_decode_list_record_string_auto_owned_rust_opaque_flutter_rust_bridgefor_generated_rust_auto_opaque_inner_st_collapsed_value( + deserializer, + ); + return Map.fromEntries(inner.map((e) => MapEntry(e.$1, e.$2))); } @protected - CertifiedContext sse_decode_box_autoadd_certified_context( - SseDeserializer deserializer) { + Map sse_decode_Map_String_CastedPrimitive_u_64( + SseDeserializer deserializer, + ) { // Codec=Sse (Serialization based), see doc to use other codecs - return (sse_decode_certified_context(deserializer)); + var inner = sse_decode_list_record_string_casted_primitive_u_64( + deserializer, + ); + return Map.fromEntries(inner.map((e) => MapEntry(e.$1, e.$2))); } @protected - ChangeParticipantMessage sse_decode_box_autoadd_change_participant_message( - SseDeserializer deserializer) { + Map sse_decode_Map_String_String( + SseDeserializer deserializer, + ) { // Codec=Sse (Serialization based), see doc to use other codecs - return (sse_decode_change_participant_message(deserializer)); + var inner = sse_decode_list_record_string_string(deserializer); + return Map.fromEntries(inner.map((e) => MapEntry(e.$1, e.$2))); } @protected - ChatProto sse_decode_box_autoadd_chat_proto(SseDeserializer deserializer) { + Map sse_decode_Map_String_bool(SseDeserializer deserializer) { // Codec=Sse (Serialization based), see doc to use other codecs - return (sse_decode_chat_proto(deserializer)); + var inner = sse_decode_list_record_string_bool(deserializer); + return Map.fromEntries(inner.map((e) => MapEntry(e.$1, e.$2))); } @protected - CloudAttachment sse_decode_box_autoadd_cloud_attachment( - SseDeserializer deserializer) { + Map sse_decode_Map_String_cloud_attachment( + SseDeserializer deserializer, + ) { // Codec=Sse (Serialization based), see doc to use other codecs - return (sse_decode_cloud_attachment(deserializer)); + var inner = sse_decode_list_record_string_cloud_attachment(deserializer); + return Map.fromEntries(inner.map((e) => MapEntry(e.$1, e.$2))); } @protected - CloudChat sse_decode_box_autoadd_cloud_chat(SseDeserializer deserializer) { + Map sse_decode_Map_String_cloud_chat( + SseDeserializer deserializer, + ) { // Codec=Sse (Serialization based), see doc to use other codecs - return (sse_decode_cloud_chat(deserializer)); + var inner = sse_decode_list_record_string_cloud_chat(deserializer); + return Map.fromEntries(inner.map((e) => MapEntry(e.$1, e.$2))); } @protected - CloudMessage sse_decode_box_autoadd_cloud_message( - SseDeserializer deserializer) { + Map sse_decode_Map_String_cloud_message( + SseDeserializer deserializer, + ) { // Codec=Sse (Serialization based), see doc to use other codecs - return (sse_decode_cloud_message(deserializer)); + var inner = sse_decode_list_record_string_cloud_message(deserializer); + return Map.fromEntries(inner.map((e) => MapEntry(e.$1, e.$2))); } @protected - CloudProp sse_decode_box_autoadd_cloud_prop(SseDeserializer deserializer) { + Map sse_decode_Map_String_ft_participant( + SseDeserializer deserializer, + ) { // Codec=Sse (Serialization based), see doc to use other codecs - return (sse_decode_cloud_prop(deserializer)); + var inner = sse_decode_list_record_string_ft_participant(deserializer); + return Map.fromEntries(inner.map((e) => MapEntry(e.$1, e.$2))); } @protected - ConversationData sse_decode_box_autoadd_conversation_data( - SseDeserializer deserializer) { + Map sse_decode_Map_String_group_summary( + SseDeserializer deserializer, + ) { // Codec=Sse (Serialization based), see doc to use other codecs - return (sse_decode_conversation_data(deserializer)); + var inner = sse_decode_list_record_string_group_summary(deserializer); + return Map.fromEntries(inner.map((e) => MapEntry(e.$1, e.$2))); } @protected - DartBeaconShareInfo sse_decode_box_autoadd_dart_beacon_share_info( - SseDeserializer deserializer) { + Map> sse_decode_Map_String_list_message_edit( + SseDeserializer deserializer, + ) { // Codec=Sse (Serialization based), see doc to use other codecs - return (sse_decode_dart_beacon_share_info(deserializer)); + var inner = sse_decode_list_record_string_list_message_edit(deserializer); + return Map.fromEntries(inner.map((e) => MapEntry(e.$1, e.$2))); } @protected - EditMessage sse_decode_box_autoadd_edit_message( - SseDeserializer deserializer) { + Map sse_decode_Map_String_list_prim_u_8_strict( + SseDeserializer deserializer, + ) { // Codec=Sse (Serialization based), see doc to use other codecs - return (sse_decode_edit_message(deserializer)); + var inner = sse_decode_list_record_string_list_prim_u_8_strict( + deserializer, + ); + return Map.fromEntries(inner.map((e) => MapEntry(e.$1, e.$2))); } @protected - ErrorMessage sse_decode_box_autoadd_error_message( - SseDeserializer deserializer) { + Map sse_decode_Map_String_message_edit_range( + SseDeserializer deserializer, + ) { // Codec=Sse (Serialization based), see doc to use other codecs - return (sse_decode_error_message(deserializer)); + var inner = sse_decode_list_record_string_message_edit_range(deserializer); + return Map.fromEntries(inner.map((e) => MapEntry(e.$1, e.$2))); } @protected - ExtensionApp sse_decode_box_autoadd_extension_app( - SseDeserializer deserializer) { + Map + sse_decode_Map_String_opt_box_autoadd_cloud_attachment( + SseDeserializer deserializer, + ) { // Codec=Sse (Serialization based), see doc to use other codecs - return (sse_decode_extension_app(deserializer)); + var inner = sse_decode_list_record_string_opt_box_autoadd_cloud_attachment( + deserializer, + ); + return Map.fromEntries(inner.map((e) => MapEntry(e.$1, e.$2))); } @protected - double sse_decode_box_autoadd_f_64(SseDeserializer deserializer) { + Map sse_decode_Map_String_opt_box_autoadd_cloud_chat( + SseDeserializer deserializer, + ) { // Codec=Sse (Serialization based), see doc to use other codecs - return (sse_decode_f_64(deserializer)); + var inner = sse_decode_list_record_string_opt_box_autoadd_cloud_chat( + deserializer, + ); + return Map.fromEntries(inner.map((e) => MapEntry(e.$1, e.$2))); } @protected - FTMessage sse_decode_box_autoadd_ft_message(SseDeserializer deserializer) { + Map + sse_decode_Map_String_opt_box_autoadd_cloud_message( + SseDeserializer deserializer, + ) { // Codec=Sse (Serialization based), see doc to use other codecs - return (sse_decode_ft_message(deserializer)); + var inner = sse_decode_list_record_string_opt_box_autoadd_cloud_message( + deserializer, + ); + return Map.fromEntries(inner.map((e) => MapEntry(e.$1, e.$2))); } @protected - FTMode sse_decode_box_autoadd_ft_mode(SseDeserializer deserializer) { + Map + sse_decode_Map_String_password_manager_meta_data_ctx( + SseDeserializer deserializer, + ) { // Codec=Sse (Serialization based), see doc to use other codecs - return (sse_decode_ft_mode(deserializer)); + var inner = sse_decode_list_record_string_password_manager_meta_data_ctx( + deserializer, + ); + return Map.fromEntries(inner.map((e) => MapEntry(e.$1, e.$2))); } @protected - HwExtra sse_decode_box_autoadd_hw_extra(SseDeserializer deserializer) { + Map + sse_decode_Map_String_record_opt_string_passkey( + SseDeserializer deserializer, + ) { // Codec=Sse (Serialization based), see doc to use other codecs - return (sse_decode_hw_extra(deserializer)); + var inner = sse_decode_list_record_string_record_opt_string_passkey( + deserializer, + ); + return Map.fromEntries(inner.map((e) => MapEntry(e.$1, e.$2))); } @protected - int sse_decode_box_autoadd_i_32(SseDeserializer deserializer) { + Map + sse_decode_Map_String_record_opt_string_password_manager_meta( + SseDeserializer deserializer, + ) { // Codec=Sse (Serialization based), see doc to use other codecs - return (sse_decode_i_32(deserializer)); + var inner = + sse_decode_list_record_string_record_opt_string_password_manager_meta( + deserializer, + ); + return Map.fromEntries(inner.map((e) => MapEntry(e.$1, e.$2))); } @protected - PlatformInt64 sse_decode_box_autoadd_i_64(SseDeserializer deserializer) { + Map + sse_decode_Map_String_record_opt_string_password_raw_entry( + SseDeserializer deserializer, + ) { // Codec=Sse (Serialization based), see doc to use other codecs - return (sse_decode_i_64(deserializer)); + var inner = + sse_decode_list_record_string_record_opt_string_password_raw_entry( + deserializer, + ); + return Map.fromEntries(inner.map((e) => MapEntry(e.$1, e.$2))); } @protected - IMessageNicknameRecord sse_decode_box_autoadd_i_message_nickname_record( - SseDeserializer deserializer) { + Map + sse_decode_Map_String_record_opt_string_wifi_password( + SseDeserializer deserializer, + ) { // Codec=Sse (Serialization based), see doc to use other codecs - return (sse_decode_i_message_nickname_record(deserializer)); + var inner = sse_decode_list_record_string_record_opt_string_wifi_password( + deserializer, + ); + return Map.fromEntries(inner.map((e) => MapEntry(e.$1, e.$2))); } @protected - IMessagePosterRecord sse_decode_box_autoadd_i_message_poster_record( - SseDeserializer deserializer) { + Map + sse_decode_Map_String_share_invite_content_data( + SseDeserializer deserializer, + ) { // Codec=Sse (Serialization based), see doc to use other codecs - return (sse_decode_i_message_poster_record(deserializer)); + var inner = sse_decode_list_record_string_share_invite_content_data( + deserializer, + ); + return Map.fromEntries(inner.map((e) => MapEntry(e.$1, e.$2))); } @protected - IconChangeMessage sse_decode_box_autoadd_icon_change_message( - SseDeserializer deserializer) { + Map + sse_decode_Map_String_status_kit_personal_config( + SseDeserializer deserializer, + ) { // Codec=Sse (Serialization based), see doc to use other codecs - return (sse_decode_icon_change_message(deserializer)); + var inner = sse_decode_list_record_string_status_kit_personal_config( + deserializer, + ); + return Map.fromEntries(inner.map((e) => MapEntry(e.$1, e.$2))); } @protected - IdmsCircleMessage sse_decode_box_autoadd_idms_circle_message( - SseDeserializer deserializer) { + Map sse_decode_Map_String_sync_status( + SseDeserializer deserializer, + ) { // Codec=Sse (Serialization based), see doc to use other codecs - return (sse_decode_idms_circle_message(deserializer)); + var inner = sse_decode_list_record_string_sync_status(deserializer); + return Map.fromEntries(inner.map((e) => MapEntry(e.$1, e.$2))); } @protected - IdmsMessage sse_decode_box_autoadd_idms_message( - SseDeserializer deserializer) { + ApsConnection + sse_decode_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerAPSConnection( + SseDeserializer deserializer, + ) { // Codec=Sse (Serialization based), see doc to use other codecs - return (sse_decode_idms_message(deserializer)); + return ApsConnectionImpl.frbInternalSseDecode( + sse_decode_usize(deserializer), + sse_decode_i_32(deserializer), + ); } @protected - IdmsRequestedSignIn sse_decode_box_autoadd_idms_requested_sign_in( - SseDeserializer deserializer) { + ApsState + sse_decode_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerAPSState( + SseDeserializer deserializer, + ) { // Codec=Sse (Serialization based), see doc to use other codecs - return (sse_decode_idms_requested_sign_in(deserializer)); + return ApsStateImpl.frbInternalSseDecode( + sse_decode_usize(deserializer), + sse_decode_i_32(deserializer), + ); } @protected - LetMeInRequest sse_decode_box_autoadd_let_me_in_request( - SseDeserializer deserializer) { + ApsWatcher + sse_decode_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerAPSWatcher( + SseDeserializer deserializer, + ) { // Codec=Sse (Serialization based), see doc to use other codecs - return (sse_decode_let_me_in_request(deserializer)); + return ApsWatcherImpl.frbInternalSseDecode( + sse_decode_usize(deserializer), + sse_decode_i_32(deserializer), + ); } @protected - LinkMeta sse_decode_box_autoadd_link_meta(SseDeserializer deserializer) { + ArcAnisetteClientDefaultAnisetteProvider + sse_decode_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcAnisetteClientDefaultAnisetteProvider( + SseDeserializer deserializer, + ) { // Codec=Sse (Serialization based), see doc to use other codecs - return (sse_decode_link_meta(deserializer)); + return ArcAnisetteClientDefaultAnisetteProviderImpl.frbInternalSseDecode( + sse_decode_usize(deserializer), + sse_decode_i_32(deserializer), + ); } @protected - Location sse_decode_box_autoadd_location(SseDeserializer deserializer) { + ArcCloudKitClientDefaultAnisetteProvider + sse_decode_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcCloudKitClientDefaultAnisetteProvider( + SseDeserializer deserializer, + ) { // Codec=Sse (Serialization based), see doc to use other codecs - return (sse_decode_location(deserializer)); + return ArcCloudKitClientDefaultAnisetteProviderImpl.frbInternalSseDecode( + sse_decode_usize(deserializer), + sse_decode_i_32(deserializer), + ); } @protected - LoginState sse_decode_box_autoadd_login_state(SseDeserializer deserializer) { + ArcCloudMessagesClientDefaultAnisetteProvider + sse_decode_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcCloudMessagesClientDefaultAnisetteProvider( + SseDeserializer deserializer, + ) { // Codec=Sse (Serialization based), see doc to use other codecs - return (sse_decode_login_state(deserializer)); + return ArcCloudMessagesClientDefaultAnisetteProviderImpl.frbInternalSseDecode( + sse_decode_usize(deserializer), + sse_decode_i_32(deserializer), + ); } @protected - LPIconMetadata sse_decode_box_autoadd_lp_icon_metadata( - SseDeserializer deserializer) { + ArcFtClient + sse_decode_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcFTClient( + SseDeserializer deserializer, + ) { // Codec=Sse (Serialization based), see doc to use other codecs - return (sse_decode_lp_icon_metadata(deserializer)); + return ArcFtClientImpl.frbInternalSseDecode( + sse_decode_usize(deserializer), + sse_decode_i_32(deserializer), + ); } @protected - LPImageMetadata sse_decode_box_autoadd_lp_image_metadata( - SseDeserializer deserializer) { + ArcFindMyClientDefaultAnisetteProvider + sse_decode_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcFindMyClientDefaultAnisetteProvider( + SseDeserializer deserializer, + ) { // Codec=Sse (Serialization based), see doc to use other codecs - return (sse_decode_lp_image_metadata(deserializer)); + return ArcFindMyClientDefaultAnisetteProviderImpl.frbInternalSseDecode( + sse_decode_usize(deserializer), + sse_decode_i_32(deserializer), + ); } @protected - LPSpecializationMetadata sse_decode_box_autoadd_lp_specialization_metadata( - SseDeserializer deserializer) { + ArcImClient + sse_decode_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcIMClient( + SseDeserializer deserializer, + ) { // Codec=Sse (Serialization based), see doc to use other codecs - return (sse_decode_lp_specialization_metadata(deserializer)); + return ArcImClientImpl.frbInternalSseDecode( + sse_decode_usize(deserializer), + sse_decode_i_32(deserializer), + ); } @protected - MemojiData sse_decode_box_autoadd_memoji_data(SseDeserializer deserializer) { + ArcIdmsAuthListener + sse_decode_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcIdmsAuthListener( + SseDeserializer deserializer, + ) { // Codec=Sse (Serialization based), see doc to use other codecs - return (sse_decode_memoji_data(deserializer)); + return ArcIdmsAuthListenerImpl.frbInternalSseDecode( + sse_decode_usize(deserializer), + sse_decode_i_32(deserializer), + ); } @protected - Message sse_decode_box_autoadd_message(SseDeserializer deserializer) { + ArcKeychainClientDefaultAnisetteProvider + sse_decode_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcKeychainClientDefaultAnisetteProvider( + SseDeserializer deserializer, + ) { // Codec=Sse (Serialization based), see doc to use other codecs - return (sse_decode_message(deserializer)); + return ArcKeychainClientDefaultAnisetteProviderImpl.frbInternalSseDecode( + sse_decode_usize(deserializer), + sse_decode_i_32(deserializer), + ); } @protected - MessageInst sse_decode_box_autoadd_message_inst( - SseDeserializer deserializer) { + ArcMutexAppleAccountDefaultAnisetteProvider + sse_decode_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcMutexAppleAccountDefaultAnisetteProvider( + SseDeserializer deserializer, + ) { // Codec=Sse (Serialization based), see doc to use other codecs - return (sse_decode_message_inst(deserializer)); + return ArcMutexAppleAccountDefaultAnisetteProviderImpl.frbInternalSseDecode( + sse_decode_usize(deserializer), + sse_decode_i_32(deserializer), + ); } @protected - MessageParts sse_decode_box_autoadd_message_parts( - SseDeserializer deserializer) { + ArcMutexOptionCircleClientSessionDefaultAnisetteProvider + sse_decode_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcMutexOptionCircleClientSessionDefaultAnisetteProvider( + SseDeserializer deserializer, + ) { // Codec=Sse (Serialization based), see doc to use other codecs - return (sse_decode_message_parts(deserializer)); + return ArcMutexOptionCircleClientSessionDefaultAnisetteProviderImpl.frbInternalSseDecode( + sse_decode_usize(deserializer), + sse_decode_i_32(deserializer), + ); } @protected - MessageProto sse_decode_box_autoadd_message_proto( - SseDeserializer deserializer) { + ArcMutexVecActiveCircleSession + sse_decode_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcMutexVecActiveCircleSession( + SseDeserializer deserializer, + ) { // Codec=Sse (Serialization based), see doc to use other codecs - return (sse_decode_message_proto(deserializer)); + return ArcMutexVecActiveCircleSessionImpl.frbInternalSseDecode( + sse_decode_usize(deserializer), + sse_decode_i_32(deserializer), + ); } @protected - MessageProto2 sse_decode_box_autoadd_message_proto_2( - SseDeserializer deserializer) { + ArcPasswordManagerDefaultAnisetteProvider + sse_decode_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcPasswordManagerDefaultAnisetteProvider( + SseDeserializer deserializer, + ) { // Codec=Sse (Serialization based), see doc to use other codecs - return (sse_decode_message_proto_2(deserializer)); + return ArcPasswordManagerDefaultAnisetteProviderImpl.frbInternalSseDecode( + sse_decode_usize(deserializer), + sse_decode_i_32(deserializer), + ); } @protected - MessageProto3 sse_decode_box_autoadd_message_proto_3( - SseDeserializer deserializer) { + ArcProfilesClientDefaultAnisetteProvider + sse_decode_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcProfilesClientDefaultAnisetteProvider( + SseDeserializer deserializer, + ) { // Codec=Sse (Serialization based), see doc to use other codecs - return (sse_decode_message_proto_3(deserializer)); + return ArcProfilesClientDefaultAnisetteProviderImpl.frbInternalSseDecode( + sse_decode_usize(deserializer), + sse_decode_i_32(deserializer), + ); } @protected - MessageProto4 sse_decode_box_autoadd_message_proto_4( - SseDeserializer deserializer) { + ArcSenderPushMessage + sse_decode_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcSenderPushMessage( + SseDeserializer deserializer, + ) { // Codec=Sse (Serialization based), see doc to use other codecs - return (sse_decode_message_proto_4(deserializer)); + return ArcSenderPushMessageImpl.frbInternalSseDecode( + sse_decode_usize(deserializer), + sse_decode_i_32(deserializer), + ); } @protected - MessageSummaryInfo sse_decode_box_autoadd_message_summary_info( - SseDeserializer deserializer) { + ArcSharedPushState + sse_decode_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcSharedPushState( + SseDeserializer deserializer, + ) { // Codec=Sse (Serialization based), see doc to use other codecs - return (sse_decode_message_summary_info(deserializer)); + return ArcSharedPushStateImpl.frbInternalSseDecode( + sse_decode_usize(deserializer), + sse_decode_i_32(deserializer), + ); } @protected - MMCSAttachmentMeta sse_decode_box_autoadd_mmcs_attachment_meta( - SseDeserializer deserializer) { + ArcStatusKitClientDefaultAnisetteProvider + sse_decode_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcStatusKitClientDefaultAnisetteProvider( + SseDeserializer deserializer, + ) { // Codec=Sse (Serialization based), see doc to use other codecs - return (sse_decode_mmcs_attachment_meta(deserializer)); + return ArcStatusKitClientDefaultAnisetteProviderImpl.frbInternalSseDecode( + sse_decode_usize(deserializer), + sse_decode_i_32(deserializer), + ); } @protected - MMCSFile sse_decode_box_autoadd_mmcs_file(SseDeserializer deserializer) { + ArcTokenProviderDefaultAnisetteProvider + sse_decode_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcTokenProviderDefaultAnisetteProvider( + SseDeserializer deserializer, + ) { // Codec=Sse (Serialization based), see doc to use other codecs - return (sse_decode_mmcs_file(deserializer)); + return ArcTokenProviderDefaultAnisetteProviderImpl.frbInternalSseDecode( + sse_decode_usize(deserializer), + sse_decode_i_32(deserializer), + ); } @protected - MonogramData sse_decode_box_autoadd_monogram_data( - SseDeserializer deserializer) { + Asset + sse_decode_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerAsset( + SseDeserializer deserializer, + ) { // Codec=Sse (Serialization based), see doc to use other codecs - return (sse_decode_monogram_data(deserializer)); + return AssetImpl.frbInternalSseDecode( + sse_decode_usize(deserializer), + sse_decode_i_32(deserializer), + ); } @protected - MoveToRecycleBinMessage sse_decode_box_autoadd_move_to_recycle_bin_message( - SseDeserializer deserializer) { + ChannelInterestToken + sse_decode_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerChannelInterestToken( + SseDeserializer deserializer, + ) { // Codec=Sse (Serialization based), see doc to use other codecs - return (sse_decode_move_to_recycle_bin_message(deserializer)); + return ChannelInterestTokenImpl.frbInternalSseDecode( + sse_decode_usize(deserializer), + sse_decode_i_32(deserializer), + ); } @protected - NormalMessage sse_decode_box_autoadd_normal_message( - SseDeserializer deserializer) { + CircleClientSessionDefaultAnisetteProvider + sse_decode_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerCircleClientSessionDefaultAnisetteProvider( + SseDeserializer deserializer, + ) { // Codec=Sse (Serialization based), see doc to use other codecs - return (sse_decode_normal_message(deserializer)); + return CircleClientSessionDefaultAnisetteProviderImpl.frbInternalSseDecode( + sse_decode_usize(deserializer), + sse_decode_i_32(deserializer), + ); } @protected - NSAttributedString sse_decode_box_autoadd_ns_attributed_string( - SseDeserializer deserializer) { + CloudSyncPreparedMessageCreateHandle + sse_decode_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerCloudSyncPreparedMessageCreateHandle( + SseDeserializer deserializer, + ) { // Codec=Sse (Serialization based), see doc to use other codecs - return (sse_decode_ns_attributed_string(deserializer)); + return CloudSyncPreparedMessageCreateHandleImpl.frbInternalSseDecode( + sse_decode_usize(deserializer), + sse_decode_i_32(deserializer), + ); } @protected - NSNumber sse_decode_box_autoadd_ns_number(SseDeserializer deserializer) { + ConversationLink + sse_decode_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerConversationLink( + SseDeserializer deserializer, + ) { // Codec=Sse (Serialization based), see doc to use other codecs - return (sse_decode_ns_number(deserializer)); + return ConversationLinkImpl.frbInternalSseDecode( + sse_decode_usize(deserializer), + sse_decode_i_32(deserializer), + ); } @protected - NSString sse_decode_box_autoadd_ns_string(SseDeserializer deserializer) { + ConversationParticipant + sse_decode_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerConversationParticipant( + SseDeserializer deserializer, + ) { // Codec=Sse (Serialization based), see doc to use other codecs - return (sse_decode_ns_string(deserializer)); + return ConversationParticipantImpl.frbInternalSseDecode( + sse_decode_usize(deserializer), + sse_decode_i_32(deserializer), + ); } @protected - NSURL sse_decode_box_autoadd_nsurl(SseDeserializer deserializer) { + Date + sse_decode_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerDate( + SseDeserializer deserializer, + ) { // Codec=Sse (Serialization based), see doc to use other codecs - return (sse_decode_nsurl(deserializer)); + return DateImpl.frbInternalSseDecode( + sse_decode_usize(deserializer), + sse_decode_i_32(deserializer), + ); } @protected - NumOrString sse_decode_box_autoadd_num_or_string( - SseDeserializer deserializer) { + EscrowData + sse_decode_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerEscrowData( + SseDeserializer deserializer, + ) { // Codec=Sse (Serialization based), see doc to use other codecs - return (sse_decode_num_or_string(deserializer)); + return EscrowDataImpl.frbInternalSseDecode( + sse_decode_usize(deserializer), + sse_decode_i_32(deserializer), + ); } @protected - OperatedChat sse_decode_box_autoadd_operated_chat( - SseDeserializer deserializer) { + FindMyFriendsClientDefaultAnisetteProvider + sse_decode_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerFindMyFriendsClientDefaultAnisetteProvider( + SseDeserializer deserializer, + ) { // Codec=Sse (Serialization based), see doc to use other codecs - return (sse_decode_operated_chat(deserializer)); + return FindMyFriendsClientDefaultAnisetteProviderImpl.frbInternalSseDecode( + sse_decode_usize(deserializer), + sse_decode_i_32(deserializer), + ); } @protected - PartExtension sse_decode_box_autoadd_part_extension( - SseDeserializer deserializer) { + FindMyPhoneClientDefaultAnisetteProvider + sse_decode_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerFindMyPhoneClientDefaultAnisetteProvider( + SseDeserializer deserializer, + ) { // Codec=Sse (Serialization based), see doc to use other codecs - return (sse_decode_part_extension(deserializer)); + return FindMyPhoneClientDefaultAnisetteProviderImpl.frbInternalSseDecode( + sse_decode_usize(deserializer), + sse_decode_i_32(deserializer), + ); } @protected - Passkey sse_decode_box_autoadd_passkey(SseDeserializer deserializer) { + GZipWrapperAttachmentMeta + sse_decode_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerGZipWrapperAttachmentMeta( + SseDeserializer deserializer, + ) { // Codec=Sse (Serialization based), see doc to use other codecs - return (sse_decode_passkey(deserializer)); + return GZipWrapperAttachmentMetaImpl.frbInternalSseDecode( + sse_decode_usize(deserializer), + sse_decode_i_32(deserializer), + ); } @protected - PasswordManagerMeta sse_decode_box_autoadd_password_manager_meta( - SseDeserializer deserializer) { + GZipWrapperChatProto + sse_decode_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerGZipWrapperChatProto( + SseDeserializer deserializer, + ) { // Codec=Sse (Serialization based), see doc to use other codecs - return (sse_decode_password_manager_meta(deserializer)); + return GZipWrapperChatProtoImpl.frbInternalSseDecode( + sse_decode_usize(deserializer), + sse_decode_i_32(deserializer), + ); } @protected - PasswordManagerMetaData sse_decode_box_autoadd_password_manager_meta_data( - SseDeserializer deserializer) { + GZipWrapperMessageProto + sse_decode_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerGZipWrapperMessageProto( + SseDeserializer deserializer, + ) { // Codec=Sse (Serialization based), see doc to use other codecs - return (sse_decode_password_manager_meta_data(deserializer)); + return GZipWrapperMessageProtoImpl.frbInternalSseDecode( + sse_decode_usize(deserializer), + sse_decode_i_32(deserializer), + ); } @protected - PasswordManagerMetaDataFormerlyShared - sse_decode_box_autoadd_password_manager_meta_data_formerly_shared( - SseDeserializer deserializer) { + GZipWrapperMessageProto2 + sse_decode_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerGZipWrapperMessageProto2( + SseDeserializer deserializer, + ) { // Codec=Sse (Serialization based), see doc to use other codecs - return (sse_decode_password_manager_meta_data_formerly_shared( - deserializer)); + return GZipWrapperMessageProto2Impl.frbInternalSseDecode( + sse_decode_usize(deserializer), + sse_decode_i_32(deserializer), + ); } @protected - PasswordManagerTotp sse_decode_box_autoadd_password_manager_totp( - SseDeserializer deserializer) { + GZipWrapperMessageProto3 + sse_decode_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerGZipWrapperMessageProto3( + SseDeserializer deserializer, + ) { // Codec=Sse (Serialization based), see doc to use other codecs - return (sse_decode_password_manager_totp(deserializer)); + return GZipWrapperMessageProto3Impl.frbInternalSseDecode( + sse_decode_usize(deserializer), + sse_decode_i_32(deserializer), + ); } @protected - PasswordRawEntry sse_decode_box_autoadd_password_raw_entry( - SseDeserializer deserializer) { + GZipWrapperMessageProto4 + sse_decode_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerGZipWrapperMessageProto4( + SseDeserializer deserializer, + ) { // Codec=Sse (Serialization based), see doc to use other codecs - return (sse_decode_password_raw_entry(deserializer)); + return GZipWrapperMessageProto4Impl.frbInternalSseDecode( + sse_decode_usize(deserializer), + sse_decode_i_32(deserializer), + ); } @protected - PermanentDeleteMessage sse_decode_box_autoadd_permanent_delete_message( - SseDeserializer deserializer) { + IdsngmIdentity + sse_decode_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerIDSNGMIdentity( + SseDeserializer deserializer, + ) { // Codec=Sse (Serialization based), see doc to use other codecs - return (sse_decode_permanent_delete_message(deserializer)); + return IdsngmIdentityImpl.frbInternalSseDecode( + sse_decode_usize(deserializer), + sse_decode_i_32(deserializer), + ); } @protected - PosterColor sse_decode_box_autoadd_poster_color( - SseDeserializer deserializer) { + IdsUser + sse_decode_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerIDSUser( + SseDeserializer deserializer, + ) { // Codec=Sse (Serialization based), see doc to use other codecs - return (sse_decode_poster_color(deserializer)); + return IdsUserImpl.frbInternalSseDecode( + sse_decode_usize(deserializer), + sse_decode_i_32(deserializer), + ); } @protected - PRPosterContentMaterialStyle - sse_decode_box_autoadd_pr_poster_content_material_style( - SseDeserializer deserializer) { + JoinedOsConfig + sse_decode_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerJoinedOSConfig( + SseDeserializer deserializer, + ) { // Codec=Sse (Serialization based), see doc to use other codecs - return (sse_decode_pr_poster_content_material_style(deserializer)); + return JoinedOsConfigImpl.frbInternalSseDecode( + sse_decode_usize(deserializer), + sse_decode_i_32(deserializer), + ); } @protected - PushMessage sse_decode_box_autoadd_push_message( - SseDeserializer deserializer) { + LocationReport + sse_decode_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerLocationReport( + SseDeserializer deserializer, + ) { // Codec=Sse (Serialization based), see doc to use other codecs - return (sse_decode_push_message(deserializer)); + return LocationReportImpl.frbInternalSseDecode( + sse_decode_usize(deserializer), + sse_decode_i_32(deserializer), + ); } @protected - ReactMessage sse_decode_box_autoadd_react_message( - SseDeserializer deserializer) { + MessageFlags + sse_decode_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerMessageFlags( + SseDeserializer deserializer, + ) { // Codec=Sse (Serialization based), see doc to use other codecs - return (sse_decode_react_message(deserializer)); + return MessageFlagsImpl.frbInternalSseDecode( + sse_decode_usize(deserializer), + sse_decode_i_32(deserializer), + ); } @protected - Reaction sse_decode_box_autoadd_reaction(SseDeserializer deserializer) { + NsArrayLpIconMetadata + sse_decode_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerNSArrayLPIconMetadata( + SseDeserializer deserializer, + ) { // Codec=Sse (Serialization based), see doc to use other codecs - return (sse_decode_reaction(deserializer)); + return NsArrayLpIconMetadataImpl.frbInternalSseDecode( + sse_decode_usize(deserializer), + sse_decode_i_32(deserializer), + ); } @protected - ( - SharedPushState, - ApsWatcher - ) sse_decode_box_autoadd_record_shared_push_state_auto_owned_rust_opaque_flutter_rust_bridgefor_generated_rust_auto_opaque_inner_aps_watcher( - SseDeserializer deserializer) { + NsArrayLpImageMetadata + sse_decode_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerNSArrayLPImageMetadata( + SseDeserializer deserializer, + ) { // Codec=Sse (Serialization based), see doc to use other codecs - return (sse_decode_record_shared_push_state_auto_owned_rust_opaque_flutter_rust_bridgefor_generated_rust_auto_opaque_inner_aps_watcher( - deserializer)); + return NsArrayLpImageMetadataImpl.frbInternalSseDecode( + sse_decode_usize(deserializer), + sse_decode_i_32(deserializer), + ); } @protected - (String, String) sse_decode_box_autoadd_record_string_string( - SseDeserializer deserializer) { + PushError + sse_decode_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerPushError( + SseDeserializer deserializer, + ) { // Codec=Sse (Serialization based), see doc to use other codecs - return (sse_decode_record_string_string(deserializer)); + return PushErrorImpl.frbInternalSseDecode( + sse_decode_usize(deserializer), + sse_decode_i_32(deserializer), + ); } @protected - (String, BigInt) sse_decode_box_autoadd_record_string_u_64( - SseDeserializer deserializer) { + ReceiverApsMessage + sse_decode_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerReceiverAPSMessage( + SseDeserializer deserializer, + ) { // Codec=Sse (Serialization based), see doc to use other codecs - return (sse_decode_record_string_u_64(deserializer)); + return ReceiverApsMessageImpl.frbInternalSseDecode( + sse_decode_usize(deserializer), + sse_decode_i_32(deserializer), + ); } @protected - RegisterState sse_decode_box_autoadd_register_state( - SseDeserializer deserializer) { + SavedHardwareState + sse_decode_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerSavedHardwareState( + SseDeserializer deserializer, + ) { // Codec=Sse (Serialization based), see doc to use other codecs - return (sse_decode_register_state(deserializer)); + return SavedHardwareStateImpl.frbInternalSseDecode( + sse_decode_usize(deserializer), + sse_decode_i_32(deserializer), + ); } @protected - RenameMessage sse_decode_box_autoadd_rename_message( - SseDeserializer deserializer) { + Sender + sse_decode_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerSender( + SseDeserializer deserializer, + ) { // Codec=Sse (Serialization based), see doc to use other codecs - return (sse_decode_rename_message(deserializer)); + return SenderImpl.frbInternalSseDecode( + sse_decode_usize(deserializer), + sse_decode_i_32(deserializer), + ); } @protected - RichLinkImageAttachmentSubstitute - sse_decode_box_autoadd_rich_link_image_attachment_substitute( - SseDeserializer deserializer) { + StCollapsedValue + sse_decode_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerStCollapsedValue( + SseDeserializer deserializer, + ) { // Codec=Sse (Serialization based), see doc to use other codecs - return (sse_decode_rich_link_image_attachment_substitute(deserializer)); + return StCollapsedValueImpl.frbInternalSseDecode( + sse_decode_usize(deserializer), + sse_decode_i_32(deserializer), + ); } @protected - ScheduleMode sse_decode_box_autoadd_schedule_mode( - SseDeserializer deserializer) { + SyncManagerDefaultAnisetteProviderMyFilePackager + sse_decode_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerSyncManagerDefaultAnisetteProviderMyFilePackager( + SseDeserializer deserializer, + ) { // Codec=Sse (Serialization based), see doc to use other codecs - return (sse_decode_schedule_mode(deserializer)); + return SyncManagerDefaultAnisetteProviderMyFilePackagerImpl.frbInternalSseDecode( + sse_decode_usize(deserializer), + sse_decode_i_32(deserializer), + ); } @protected - SetTranscriptBackgroundMessage - sse_decode_box_autoadd_set_transcript_background_message( - SseDeserializer deserializer) { + SystemTime + sse_decode_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerSystemTime( + SseDeserializer deserializer, + ) { // Codec=Sse (Serialization based), see doc to use other codecs - return (sse_decode_set_transcript_background_message(deserializer)); + return SystemTimeImpl.frbInternalSseDecode( + sse_decode_usize(deserializer), + sse_decode_i_32(deserializer), + ); } @protected - ShareProfileMessage sse_decode_box_autoadd_share_profile_message( - SseDeserializer deserializer) { + VerifyBody + sse_decode_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerVerifyBody( + SseDeserializer deserializer, + ) { // Codec=Sse (Serialization based), see doc to use other codecs - return (sse_decode_share_profile_message(deserializer)); + return VerifyBodyImpl.frbInternalSseDecode( + sse_decode_usize(deserializer), + sse_decode_i_32(deserializer), + ); } @protected - SharedAlbum sse_decode_box_autoadd_shared_album( - SseDeserializer deserializer) { + ViableBottle + sse_decode_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerViableBottle( + SseDeserializer deserializer, + ) { // Codec=Sse (Serialization based), see doc to use other codecs - return (sse_decode_shared_album(deserializer)); + return ViableBottleImpl.frbInternalSseDecode( + sse_decode_usize(deserializer), + sse_decode_i_32(deserializer), + ); } @protected - SharedICloudServices sse_decode_box_autoadd_shared_i_cloud_services( - SseDeserializer deserializer) { + Set sse_decode_Set_ft_member(SseDeserializer deserializer) { // Codec=Sse (Serialization based), see doc to use other codecs - return (sse_decode_shared_i_cloud_services(deserializer)); + var inner = sse_decode_list_ft_member(deserializer); + return Set.from(inner); } @protected - SharedPoster sse_decode_box_autoadd_shared_poster( - SseDeserializer deserializer) { + RustStreamSink + sse_decode_StreamSink_mmcs_transfer_progress_Sse( + SseDeserializer deserializer, + ) { // Codec=Sse (Serialization based), see doc to use other codecs - return (sse_decode_shared_poster(deserializer)); + throw UnimplementedError('Unreachable ()'); } @protected - SharedPushState sse_decode_box_autoadd_shared_push_state( - SseDeserializer deserializer) { + RustStreamSink sse_decode_StreamSink_transfer_progress_Sse( + SseDeserializer deserializer, + ) { // Codec=Sse (Serialization based), see doc to use other codecs - return (sse_decode_shared_push_state(deserializer)); + throw UnimplementedError('Unreachable ()'); } @protected - SimplifiedIncomingCallPoster - sse_decode_box_autoadd_simplified_incoming_call_poster( - SseDeserializer deserializer) { + String sse_decode_String(SseDeserializer deserializer) { // Codec=Sse (Serialization based), see doc to use other codecs - return (sse_decode_simplified_incoming_call_poster(deserializer)); + var inner = sse_decode_list_prim_u_8_strict(deserializer); + return utf8.decoder.convert(inner); } @protected - SimplifiedTranscriptPoster - sse_decode_box_autoadd_simplified_transcript_poster( - SseDeserializer deserializer) { + Address sse_decode_address(SseDeserializer deserializer) { // Codec=Sse (Serialization based), see doc to use other codecs - return (sse_decode_simplified_transcript_poster(deserializer)); + var var_administrativeArea = sse_decode_opt_String(deserializer); + var var_country = sse_decode_String(deserializer); + var var_countryCode = sse_decode_String(deserializer); + var var_formattedAddressLines = sse_decode_opt_list_String(deserializer); + var var_locality = sse_decode_opt_String(deserializer); + var var_stateCode = sse_decode_opt_String(deserializer); + var var_streetAddress = sse_decode_opt_String(deserializer); + var var_streetName = sse_decode_opt_String(deserializer); + return Address( + administrativeArea: var_administrativeArea, + country: var_country, + countryCode: var_countryCode, + formattedAddressLines: var_formattedAddressLines, + locality: var_locality, + stateCode: var_stateCode, + streetAddress: var_streetAddress, + streetName: var_streetName, + ); } @protected - StatusKitMessage sse_decode_box_autoadd_status_kit_message( - SseDeserializer deserializer) { + AkData sse_decode_ak_data(SseDeserializer deserializer) { // Codec=Sse (Serialization based), see doc to use other codecs - return (sse_decode_status_kit_message(deserializer)); + var var_lat = sse_decode_f_32(deserializer); + var var_lng = sse_decode_f_32(deserializer); + return AkData(lat: var_lat, lng: var_lng); } @protected - SupportAction sse_decode_box_autoadd_support_action( - SseDeserializer deserializer) { + ApsAlert sse_decode_aps_alert(SseDeserializer deserializer) { // Codec=Sse (Serialization based), see doc to use other codecs - return (sse_decode_support_action(deserializer)); + var var_title = sse_decode_String(deserializer); + var var_body = sse_decode_String(deserializer); + var var_sbdy = sse_decode_String(deserializer); + var var_defbtn = sse_decode_String(deserializer); + var var_albtn = sse_decode_String(deserializer); + return ApsAlert( + title: var_title, + body: var_body, + sbdy: var_sbdy, + defbtn: var_defbtn, + albtn: var_albtn, + ); } @protected - SupportAlert sse_decode_box_autoadd_support_alert( - SseDeserializer deserializer) { + ApsConnectionStatus sse_decode_aps_connection_status( + SseDeserializer deserializer, + ) { // Codec=Sse (Serialization based), see doc to use other codecs - return (sse_decode_support_alert(deserializer)); + var var_state = sse_decode_String(deserializer); + var var_activePort = sse_decode_opt_box_autoadd_u_16(deserializer); + var var_error = sse_decode_opt_String(deserializer); + var var_retryWaitSeconds = sse_decode_opt_box_autoadd_u_64(deserializer); + return ApsConnectionStatus( + state: var_state, + activePort: var_activePort, + error: var_error, + retryWaitSeconds: var_retryWaitSeconds, + ); } @protected - TeardownSignIn sse_decode_box_autoadd_teardown_sign_in( - SseDeserializer deserializer) { + ApsData sse_decode_aps_data(SseDeserializer deserializer) { // Codec=Sse (Serialization based), see doc to use other codecs - return (sse_decode_teardown_sign_in(deserializer)); + var var_alert = sse_decode_aps_alert(deserializer); + return ApsData(alert: var_alert); } @protected - TextFlags sse_decode_box_autoadd_text_flags(SseDeserializer deserializer) { + Attachment sse_decode_attachment(SseDeserializer deserializer) { // Codec=Sse (Serialization based), see doc to use other codecs - return (sse_decode_text_flags(deserializer)); + var var_aType = sse_decode_attachment_type(deserializer); + var var_part_ = sse_decode_CastedPrimitive_u_64(deserializer); + var var_utiType = sse_decode_String(deserializer); + var var_mime = sse_decode_String(deserializer); + var var_name = sse_decode_String(deserializer); + var var_iris = sse_decode_bool(deserializer); + return Attachment( + aType: var_aType, + part_: var_part_, + utiType: var_utiType, + mime: var_mime, + name: var_name, + iris: var_iris, + ); } @protected - TextFormat sse_decode_box_autoadd_text_format(SseDeserializer deserializer) { + AttachmentMeta sse_decode_attachment_meta(SseDeserializer deserializer) { // Codec=Sse (Serialization based), see doc to use other codecs - return (sse_decode_text_format(deserializer)); + var var_mimeType = sse_decode_opt_String(deserializer); + var var_startDate = sse_decode_CastedPrimitive_i_64(deserializer); + var var_totalBytes = sse_decode_CastedPrimitive_i_64(deserializer); + var var_transferState = sse_decode_i_32(deserializer); + var var_isSticker = sse_decode_bool(deserializer); + var var_guid = sse_decode_String(deserializer); + var var_hideAttachment = sse_decode_bool(deserializer); + var var_userInfo = sse_decode_opt_box_autoadd_mmcs_attachment_meta( + deserializer, + ); + var var_filename = sse_decode_opt_String(deserializer); + var var_extras = sse_decode_opt_box_autoadd_attachment_meta_extra( + deserializer, + ); + var var_isOutgoing = sse_decode_bool(deserializer); + var var_transferName = sse_decode_opt_String(deserializer); + var var_version = sse_decode_i_32(deserializer); + var var_uti = sse_decode_opt_String(deserializer); + var var_createdDate = sse_decode_CastedPrimitive_i_64(deserializer); + var var_pathc = sse_decode_opt_String(deserializer); + var var_md5 = sse_decode_opt_String(deserializer); + return AttachmentMeta( + mimeType: var_mimeType, + startDate: var_startDate, + totalBytes: var_totalBytes, + transferState: var_transferState, + isSticker: var_isSticker, + guid: var_guid, + hideAttachment: var_hideAttachment, + userInfo: var_userInfo, + filename: var_filename, + extras: var_extras, + isOutgoing: var_isOutgoing, + transferName: var_transferName, + version: var_version, + uti: var_uti, + createdDate: var_createdDate, + pathc: var_pathc, + md5: var_md5, + ); } @protected - TranscriptDynamicUserData sse_decode_box_autoadd_transcript_dynamic_user_data( - SseDeserializer deserializer) { + AttachmentMetaExtra sse_decode_attachment_meta_extra( + SseDeserializer deserializer, + ) { // Codec=Sse (Serialization based), see doc to use other codecs - return (sse_decode_transcript_dynamic_user_data(deserializer)); + var var_previewGenerationState = sse_decode_opt_box_autoadd_num_or_string( + deserializer, + ); + return AttachmentMetaExtra( + previewGenerationState: var_previewGenerationState, + ); } @protected - TypingApp sse_decode_box_autoadd_typing_app(SseDeserializer deserializer) { + AttachmentType sse_decode_attachment_type(SseDeserializer deserializer) { // Codec=Sse (Serialization based), see doc to use other codecs - return (sse_decode_typing_app(deserializer)); + + var tag_ = sse_decode_i_32(deserializer); + switch (tag_) { + case 0: + var var_field0 = sse_decode_list_prim_u_8_strict(deserializer); + return AttachmentType_Inline(var_field0); + case 1: + var var_field0 = sse_decode_box_autoadd_mmcs_file(deserializer); + return AttachmentType_MMCS(var_field0); + default: + throw UnimplementedError(''); + } } @protected - int sse_decode_box_autoadd_u_32(SseDeserializer deserializer) { + Balloon sse_decode_balloon(SseDeserializer deserializer) { // Codec=Sse (Serialization based), see doc to use other codecs - return (sse_decode_u_32(deserializer)); + var var_url = sse_decode_String(deserializer); + var var_session = sse_decode_opt_String(deserializer); + var var_layout = sse_decode_opt_box_autoadd_balloon_layout(deserializer); + var var_ldText = sse_decode_opt_String(deserializer); + var var_isLive = sse_decode_bool(deserializer); + var var_icon = sse_decode_opt_list_prim_u_8_strict(deserializer); + return Balloon( + url: var_url, + session: var_session, + layout: var_layout, + ldText: var_ldText, + isLive: var_isLive, + icon: var_icon, + ); } @protected - BigInt sse_decode_box_autoadd_u_64(SseDeserializer deserializer) { + BalloonLayout sse_decode_balloon_layout(SseDeserializer deserializer) { // Codec=Sse (Serialization based), see doc to use other codecs - return (sse_decode_u_64(deserializer)); + + var tag_ = sse_decode_i_32(deserializer); + switch (tag_) { + case 0: + var var_imageSubtitle = sse_decode_String(deserializer); + var var_imageTitle = sse_decode_String(deserializer); + var var_caption = sse_decode_String(deserializer); + var var_secondarySubcaption = sse_decode_String(deserializer); + var var_tertiarySubcaption = sse_decode_String(deserializer); + var var_subcaption = sse_decode_String(deserializer); + var var_class_ = sse_decode_ns_dictionary_class(deserializer); + return BalloonLayout_TemplateLayout( + imageSubtitle: var_imageSubtitle, + imageTitle: var_imageTitle, + caption: var_caption, + secondarySubcaption: var_secondarySubcaption, + tertiarySubcaption: var_tertiarySubcaption, + subcaption: var_subcaption, + class_: var_class_, + ); + default: + throw UnimplementedError(''); + } } @protected - UnsendMessage sse_decode_box_autoadd_unsend_message( - SseDeserializer deserializer) { + BeaconAttributes sse_decode_beacon_attributes(SseDeserializer deserializer) { // Codec=Sse (Serialization based), see doc to use other codecs - return (sse_decode_unsend_message(deserializer)); + var var_name = sse_decode_String(deserializer); + var var_roleId = sse_decode_i_64(deserializer); + var var_emoji = sse_decode_String(deserializer); + var var_systemVersion = sse_decode_String(deserializer); + var var_serialNumber = sse_decode_String(deserializer); + return BeaconAttributes( + name: var_name, + roleId: var_roleId, + emoji: var_emoji, + systemVersion: var_systemVersion, + serialNumber: var_serialNumber, + ); } @protected - UpdateAccountFinish sse_decode_box_autoadd_update_account_finish( - SseDeserializer deserializer) { + BeaconNamingRecord sse_decode_beacon_naming_record( + SseDeserializer deserializer, + ) { // Codec=Sse (Serialization based), see doc to use other codecs - return (sse_decode_update_account_finish(deserializer)); + var var_emoji = sse_decode_String(deserializer); + var var_name = sse_decode_String(deserializer); + var var_associatedBeacon = sse_decode_String(deserializer); + var var_roleId = sse_decode_CastedPrimitive_i_64(deserializer); + return BeaconNamingRecord( + emoji: var_emoji, + name: var_name, + associatedBeacon: var_associatedBeacon, + roleId: var_roleId, + ); } @protected - UpdateExtensionMessage sse_decode_box_autoadd_update_extension_message( - SseDeserializer deserializer) { + bool sse_decode_bool(SseDeserializer deserializer) { // Codec=Sse (Serialization based), see doc to use other codecs - return (sse_decode_update_extension_message(deserializer)); + return deserializer.buffer.getUint8() != 0; } @protected - UpdateProfileMessage sse_decode_box_autoadd_update_profile_message( - SseDeserializer deserializer) { + ApsState + sse_decode_box_autoadd_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerAPSState( + SseDeserializer deserializer, + ) { // Codec=Sse (Serialization based), see doc to use other codecs - return (sse_decode_update_profile_message(deserializer)); + return (sse_decode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerAPSState( + deserializer, + )); } @protected - UpdateProfileSharingMessage - sse_decode_box_autoadd_update_profile_sharing_message( - SseDeserializer deserializer) { + ArcCloudKitClientDefaultAnisetteProvider + sse_decode_box_autoadd_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcCloudKitClientDefaultAnisetteProvider( + SseDeserializer deserializer, + ) { // Codec=Sse (Serialization based), see doc to use other codecs - return (sse_decode_update_profile_sharing_message(deserializer)); + return (sse_decode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcCloudKitClientDefaultAnisetteProvider( + deserializer, + )); } @protected - WifiPassword sse_decode_box_autoadd_wifi_password( - SseDeserializer deserializer) { + ArcCloudMessagesClientDefaultAnisetteProvider + sse_decode_box_autoadd_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcCloudMessagesClientDefaultAnisetteProvider( + SseDeserializer deserializer, + ) { // Codec=Sse (Serialization based), see doc to use other codecs - return (sse_decode_wifi_password(deserializer)); + return (sse_decode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcCloudMessagesClientDefaultAnisetteProvider( + deserializer, + )); } @protected - CertifiedContext sse_decode_certified_context(SseDeserializer deserializer) { + ArcFindMyClientDefaultAnisetteProvider + sse_decode_box_autoadd_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcFindMyClientDefaultAnisetteProvider( + SseDeserializer deserializer, + ) { // Codec=Sse (Serialization based), see doc to use other codecs - var var_version = sse_decode_u_32(deserializer); - var var_receipt = sse_decode_list_prim_u_8_strict(deserializer); - var var_sender = sse_decode_String(deserializer); - var var_target = sse_decode_String(deserializer); - var var_uuid = sse_decode_list_prim_u_8_strict(deserializer); - var var_token = sse_decode_list_prim_u_8_strict(deserializer); - return CertifiedContext( - version: var_version, - receipt: var_receipt, - sender: var_sender, - target: var_target, - uuid: var_uuid, - token: var_token); + return (sse_decode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcFindMyClientDefaultAnisetteProvider( + deserializer, + )); } @protected - ChangeParticipantMessage sse_decode_change_participant_message( - SseDeserializer deserializer) { + ArcKeychainClientDefaultAnisetteProvider + sse_decode_box_autoadd_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcKeychainClientDefaultAnisetteProvider( + SseDeserializer deserializer, + ) { // Codec=Sse (Serialization based), see doc to use other codecs - var var_newParticipants = sse_decode_list_String(deserializer); - var var_groupVersion = sse_decode_CastedPrimitive_u_64(deserializer); - return ChangeParticipantMessage( - newParticipants: var_newParticipants, groupVersion: var_groupVersion); + return (sse_decode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcKeychainClientDefaultAnisetteProvider( + deserializer, + )); } @protected - ChatProto sse_decode_chat_proto(SseDeserializer deserializer) { + ArcMutexAppleAccountDefaultAnisetteProvider + sse_decode_box_autoadd_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcMutexAppleAccountDefaultAnisetteProvider( + SseDeserializer deserializer, + ) { // Codec=Sse (Serialization based), see doc to use other codecs - var var_unk1 = sse_decode_opt_box_autoadd_u_32(deserializer); - return ChatProto(unk1: var_unk1); + return (sse_decode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcMutexAppleAccountDefaultAnisetteProvider( + deserializer, + )); } @protected - CloudAttachment sse_decode_cloud_attachment(SseDeserializer deserializer) { + ArcPasswordManagerDefaultAnisetteProvider + sse_decode_box_autoadd_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcPasswordManagerDefaultAnisetteProvider( + SseDeserializer deserializer, + ) { // Codec=Sse (Serialization based), see doc to use other codecs - var var_cm = - sse_decode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerGZipWrapperAttachmentMeta( - deserializer); - var var_lqa = - sse_decode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerAsset( - deserializer); - return CloudAttachment(cm: var_cm, lqa: var_lqa); + return (sse_decode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcPasswordManagerDefaultAnisetteProvider( + deserializer, + )); } @protected - CloudChat sse_decode_cloud_chat(SseDeserializer deserializer) { + Asset + sse_decode_box_autoadd_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerAsset( + SseDeserializer deserializer, + ) { // Codec=Sse (Serialization based), see doc to use other codecs - var var_style = sse_decode_i_64(deserializer); - var var_isFiltered = sse_decode_i_64(deserializer); - var var_successfulQuery = sse_decode_i_64(deserializer); - var var_state = sse_decode_i_64(deserializer); - var var_chatIdentifier = sse_decode_String(deserializer); - var var_groupId = sse_decode_String(deserializer); - var var_serviceName = sse_decode_String(deserializer); - var var_originalGroupId = sse_decode_String(deserializer); - var var_properties = sse_decode_opt_box_autoadd_cloud_prop(deserializer); - var var_participants = sse_decode_list_cloud_participant(deserializer); - var var_prop001 = sse_decode_cloud_prop_001(deserializer); - var var_lastReadMessageTimestamp = sse_decode_i_64(deserializer); - var var_lastAddressedHandle = sse_decode_String(deserializer); - var var_guid = sse_decode_String(deserializer); - var var_displayName = sse_decode_opt_String(deserializer); - var var_proto001 = - sse_decode_opt_box_autoadd_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerGZipWrapperChatProto( - deserializer); - var var_groupPhotoGuid = sse_decode_opt_String(deserializer); - var var_groupPhoto = - sse_decode_opt_box_autoadd_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerAsset( - deserializer); - return CloudChat( - style: var_style, - isFiltered: var_isFiltered, - successfulQuery: var_successfulQuery, - state: var_state, - chatIdentifier: var_chatIdentifier, - groupId: var_groupId, - serviceName: var_serviceName, - originalGroupId: var_originalGroupId, - properties: var_properties, - participants: var_participants, - prop001: var_prop001, - lastReadMessageTimestamp: var_lastReadMessageTimestamp, - lastAddressedHandle: var_lastAddressedHandle, - guid: var_guid, - displayName: var_displayName, - proto001: var_proto001, - groupPhotoGuid: var_groupPhotoGuid, - groupPhoto: var_groupPhoto); + return (sse_decode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerAsset( + deserializer, + )); } @protected - CloudMessage sse_decode_cloud_message(SseDeserializer deserializer) { + ChannelInterestToken + sse_decode_box_autoadd_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerChannelInterestToken( + SseDeserializer deserializer, + ) { // Codec=Sse (Serialization based), see doc to use other codecs - var var_utm = - sse_decode_opt_box_autoadd_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerSystemTime( - deserializer); - var var_type = sse_decode_i_64(deserializer); - var var_error = sse_decode_i_64(deserializer); - var var_chatId = sse_decode_String(deserializer); - var var_sender = sse_decode_String(deserializer); - var var_time = sse_decode_i_64(deserializer); - var var_msgProto2 = - sse_decode_opt_box_autoadd_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerGZipWrapperMessageProto2( - deserializer); - var var_destinationCallerId = sse_decode_String(deserializer); - var var_msgProto = - sse_decode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerGZipWrapperMessageProto( - deserializer); - var var_flags = - sse_decode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerMessageFlags( - deserializer); - var var_guid = sse_decode_String(deserializer); - var var_msgProto3 = - sse_decode_opt_box_autoadd_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerGZipWrapperMessageProto3( - deserializer); - var var_service = sse_decode_String(deserializer); - var var_msgProto4 = - sse_decode_opt_box_autoadd_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerGZipWrapperMessageProto4( - deserializer); - return CloudMessage( - utm: var_utm, - type: var_type, - error: var_error, - chatId: var_chatId, - sender: var_sender, - time: var_time, - msgProto2: var_msgProto2, - destinationCallerId: var_destinationCallerId, - msgProto: var_msgProto, - flags: var_flags, - guid: var_guid, - msgProto3: var_msgProto3, - service: var_service, - msgProto4: var_msgProto4); + return (sse_decode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerChannelInterestToken( + deserializer, + )); } @protected - CloudMessageSummary sse_decode_cloud_message_summary( - SseDeserializer deserializer) { + CircleClientSessionDefaultAnisetteProvider + sse_decode_box_autoadd_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerCircleClientSessionDefaultAnisetteProvider( + SseDeserializer deserializer, + ) { // Codec=Sse (Serialization based), see doc to use other codecs - var var_messagesSummary = sse_decode_list_prim_i_64_strict(deserializer); - var var_chatSummary = sse_decode_list_prim_i_64_strict(deserializer); - var var_attachmentSummary = sse_decode_list_prim_i_64_strict(deserializer); - return CloudMessageSummary( - messagesSummary: var_messagesSummary, - chatSummary: var_chatSummary, - attachmentSummary: var_attachmentSummary); + return (sse_decode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerCircleClientSessionDefaultAnisetteProvider( + deserializer, + )); } @protected - CloudParticipant sse_decode_cloud_participant(SseDeserializer deserializer) { + CloudSyncPreparedMessageCreateHandle + sse_decode_box_autoadd_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerCloudSyncPreparedMessageCreateHandle( + SseDeserializer deserializer, + ) { // Codec=Sse (Serialization based), see doc to use other codecs - var var_uri = sse_decode_String(deserializer); - return CloudParticipant(uri: var_uri); + return (sse_decode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerCloudSyncPreparedMessageCreateHandle( + deserializer, + )); } @protected - CloudProp sse_decode_cloud_prop(SseDeserializer deserializer) { + ConversationLink + sse_decode_box_autoadd_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerConversationLink( + SseDeserializer deserializer, + ) { // Codec=Sse (Serialization based), see doc to use other codecs - var var_gpufc = sse_decode_opt_box_autoadd_u_32(deserializer); - var var_pv = sse_decode_opt_box_autoadd_u_32(deserializer); - var var_numberOfTimesRespondedtoThread = - sse_decode_opt_box_autoadd_u_32(deserializer); - var var_shouldForceToSms = sse_decode_opt_box_autoadd_bool(deserializer); - var var_lastSeenMessageGuid = sse_decode_opt_String(deserializer); - var var_messageHandshakeState = - sse_decode_opt_box_autoadd_u_32(deserializer); - var var_legacyGroupIdentifiers = sse_decode_list_String(deserializer); - var var_groupPhotoGuid = sse_decode_opt_String(deserializer); - var var_lastModificationDate = - sse_decode_opt_box_autoadd_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerDate( - deserializer); - return CloudProp( - gpufc: var_gpufc, - pv: var_pv, - numberOfTimesRespondedtoThread: var_numberOfTimesRespondedtoThread, - shouldForceToSms: var_shouldForceToSms, - lastSeenMessageGuid: var_lastSeenMessageGuid, - messageHandshakeState: var_messageHandshakeState, - legacyGroupIdentifiers: var_legacyGroupIdentifiers, - groupPhotoGuid: var_groupPhotoGuid, - lastModificationDate: var_lastModificationDate); + return (sse_decode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerConversationLink( + deserializer, + )); } @protected - CloudProp001 sse_decode_cloud_prop_001(SseDeserializer deserializer) { + ConversationParticipant + sse_decode_box_autoadd_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerConversationParticipant( + SseDeserializer deserializer, + ) { // Codec=Sse (Serialization based), see doc to use other codecs - var var_syndicationType = sse_decode_u_32(deserializer); - return CloudProp001(syndicationType: var_syndicationType); + return (sse_decode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerConversationParticipant( + deserializer, + )); } @protected - ConversationData sse_decode_conversation_data(SseDeserializer deserializer) { + Date + sse_decode_box_autoadd_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerDate( + SseDeserializer deserializer, + ) { // Codec=Sse (Serialization based), see doc to use other codecs - var var_participants = sse_decode_list_String(deserializer); - var var_cvName = sse_decode_opt_String(deserializer); - var var_senderGuid = sse_decode_opt_String(deserializer); - var var_afterGuid = sse_decode_opt_String(deserializer); - return ConversationData( - participants: var_participants, - cvName: var_cvName, - senderGuid: var_senderGuid, - afterGuid: var_afterGuid); + return (sse_decode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerDate( + deserializer, + )); } @protected - DartBeacon sse_decode_dart_beacon(SseDeserializer deserializer) { + GZipWrapperChatProto + sse_decode_box_autoadd_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerGZipWrapperChatProto( + SseDeserializer deserializer, + ) { // Codec=Sse (Serialization based), see doc to use other codecs - var var_naming = sse_decode_beacon_naming_record(deserializer); - var var_lastReport = - sse_decode_opt_box_autoadd_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerLocationReport( - deserializer); - var var_productId = sse_decode_CastedPrimitive_i_64(deserializer); - var var_batteryLevel = sse_decode_opt_CastedPrimitive_i_64(deserializer); - var var_vendorId = sse_decode_CastedPrimitive_i_64(deserializer); - var var_model = sse_decode_String(deserializer); - var var_systemVersion = sse_decode_String(deserializer); - var var_id = sse_decode_String(deserializer); - var var_shared = - sse_decode_opt_box_autoadd_dart_beacon_share_info(deserializer); - return DartBeacon( - naming: var_naming, - lastReport: var_lastReport, - productId: var_productId, - batteryLevel: var_batteryLevel, - vendorId: var_vendorId, - model: var_model, - systemVersion: var_systemVersion, - id: var_id, - shared: var_shared); + return (sse_decode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerGZipWrapperChatProto( + deserializer, + )); } @protected - DartBeaconShareInfo sse_decode_dart_beacon_share_info( - SseDeserializer deserializer) { + GZipWrapperMessageProto2 + sse_decode_box_autoadd_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerGZipWrapperMessageProto2( + SseDeserializer deserializer, + ) { // Codec=Sse (Serialization based), see doc to use other codecs - var var_shareId = sse_decode_String(deserializer); - var var_acceptanceState = sse_decode_CastedPrimitive_i_64(deserializer); - var var_ownerHandle = sse_decode_String(deserializer); - return DartBeaconShareInfo( - shareId: var_shareId, - acceptanceState: var_acceptanceState, - ownerHandle: var_ownerHandle); + return (sse_decode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerGZipWrapperMessageProto2( + deserializer, + )); } @protected - DeleteTarget sse_decode_delete_target(SseDeserializer deserializer) { + GZipWrapperMessageProto3 + sse_decode_box_autoadd_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerGZipWrapperMessageProto3( + SseDeserializer deserializer, + ) { // Codec=Sse (Serialization based), see doc to use other codecs - - var tag_ = sse_decode_i_32(deserializer); - switch (tag_) { - case 0: - var var_field0 = sse_decode_box_autoadd_operated_chat(deserializer); - return DeleteTarget_Chat(var_field0); - case 1: - var var_field0 = sse_decode_list_String(deserializer); - return DeleteTarget_Messages(var_field0); - default: - throw UnimplementedError(''); - } + return (sse_decode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerGZipWrapperMessageProto3( + deserializer, + )); } @protected - DeviceInfo sse_decode_device_info(SseDeserializer deserializer) { + GZipWrapperMessageProto4 + sse_decode_box_autoadd_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerGZipWrapperMessageProto4( + SseDeserializer deserializer, + ) { // Codec=Sse (Serialization based), see doc to use other codecs - var var_name = sse_decode_String(deserializer); - var var_serial = sse_decode_String(deserializer); - var var_osVersion = sse_decode_String(deserializer); - var var_encodedData = sse_decode_opt_list_prim_u_8_strict(deserializer); - return DeviceInfo( - name: var_name, - serial: var_serial, - osVersion: var_osVersion, - encodedData: var_encodedData); + return (sse_decode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerGZipWrapperMessageProto4( + deserializer, + )); } @protected - EditMessage sse_decode_edit_message(SseDeserializer deserializer) { + IdsUser + sse_decode_box_autoadd_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerIDSUser( + SseDeserializer deserializer, + ) { // Codec=Sse (Serialization based), see doc to use other codecs - var var_tuuid = sse_decode_String(deserializer); - var var_editPart = sse_decode_CastedPrimitive_u_64(deserializer); - var var_newParts = sse_decode_message_parts(deserializer); - return EditMessage( - tuuid: var_tuuid, editPart: var_editPart, newParts: var_newParts); + return (sse_decode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerIDSUser( + deserializer, + )); } @protected - ErrorMessage sse_decode_error_message(SseDeserializer deserializer) { + LocationReport + sse_decode_box_autoadd_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerLocationReport( + SseDeserializer deserializer, + ) { // Codec=Sse (Serialization based), see doc to use other codecs - var var_forUuid = sse_decode_String(deserializer); - var var_status = sse_decode_u_64(deserializer); - var var_statusStr = sse_decode_String(deserializer); - return ErrorMessage( - forUuid: var_forUuid, status: var_status, statusStr: var_statusStr); + return (sse_decode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerLocationReport( + deserializer, + )); } @protected - ExtensionApp sse_decode_extension_app(SseDeserializer deserializer) { + NsArrayLpIconMetadata + sse_decode_box_autoadd_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerNSArrayLPIconMetadata( + SseDeserializer deserializer, + ) { // Codec=Sse (Serialization based), see doc to use other codecs - var var_name = sse_decode_String(deserializer); - var var_appId = sse_decode_opt_CastedPrimitive_u_64(deserializer); - var var_bundleId = sse_decode_String(deserializer); - var var_balloon = sse_decode_opt_box_autoadd_balloon(deserializer); - return ExtensionApp( - name: var_name, - appId: var_appId, - bundleId: var_bundleId, - balloon: var_balloon); + return (sse_decode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerNSArrayLPIconMetadata( + deserializer, + )); } @protected - double sse_decode_f_32(SseDeserializer deserializer) { + NsArrayLpImageMetadata + sse_decode_box_autoadd_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerNSArrayLPImageMetadata( + SseDeserializer deserializer, + ) { // Codec=Sse (Serialization based), see doc to use other codecs - return deserializer.buffer.getFloat32(); + return (sse_decode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerNSArrayLPImageMetadata( + deserializer, + )); } @protected - double sse_decode_f_64(SseDeserializer deserializer) { + PushError + sse_decode_box_autoadd_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerPushError( + SseDeserializer deserializer, + ) { // Codec=Sse (Serialization based), see doc to use other codecs - return deserializer.buffer.getFloat64(); + return (sse_decode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerPushError( + deserializer, + )); } @protected - FFIFilePackager sse_decode_ffi_file_packager(SseDeserializer deserializer) { + SavedHardwareState + sse_decode_box_autoadd_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerSavedHardwareState( + SseDeserializer deserializer, + ) { // Codec=Sse (Serialization based), see doc to use other codecs - return FFIFilePackager(); + return (sse_decode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerSavedHardwareState( + deserializer, + )); } @protected - Follow sse_decode_follow(SseDeserializer deserializer) { + SyncManagerDefaultAnisetteProviderMyFilePackager + sse_decode_box_autoadd_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerSyncManagerDefaultAnisetteProviderMyFilePackager( + SseDeserializer deserializer, + ) { // Codec=Sse (Serialization based), see doc to use other codecs - var var_createTimestamp = sse_decode_i_64(deserializer); - var var_expires = sse_decode_i_64(deserializer); - var var_id = sse_decode_String(deserializer); - var var_invitationAcceptedHandles = sse_decode_list_String(deserializer); - var var_invitationFromHandles = sse_decode_list_String(deserializer); - var var_isFromMessages = sse_decode_bool(deserializer); - var var_offerId = sse_decode_opt_String(deserializer); - var var_onlyInEvent = sse_decode_bool(deserializer); - var var_personIdHash = sse_decode_String(deserializer); - var var_secureLocationsCapable = sse_decode_bool(deserializer); - var var_shallowOrLiveSecureLocationsCapable = sse_decode_bool(deserializer); - var var_source = sse_decode_String(deserializer); - var var_tkPermission = sse_decode_bool(deserializer); - var var_updateTimestamp = sse_decode_i_64(deserializer); - var var_fallbackToLegacyAllowed = - sse_decode_opt_box_autoadd_bool(deserializer); - var var_optedNotToShare = sse_decode_opt_box_autoadd_bool(deserializer); - var var_lastLocation = sse_decode_opt_box_autoadd_location(deserializer); - var var_locateInProgress = sse_decode_bool(deserializer); - return Follow( - createTimestamp: var_createTimestamp, - expires: var_expires, - id: var_id, - invitationAcceptedHandles: var_invitationAcceptedHandles, - invitationFromHandles: var_invitationFromHandles, - isFromMessages: var_isFromMessages, - offerId: var_offerId, - onlyInEvent: var_onlyInEvent, - personIdHash: var_personIdHash, - secureLocationsCapable: var_secureLocationsCapable, - shallowOrLiveSecureLocationsCapable: - var_shallowOrLiveSecureLocationsCapable, - source: var_source, - tkPermission: var_tkPermission, - updateTimestamp: var_updateTimestamp, - fallbackToLegacyAllowed: var_fallbackToLegacyAllowed, - optedNotToShare: var_optedNotToShare, - lastLocation: var_lastLocation, - locateInProgress: var_locateInProgress); + return (sse_decode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerSyncManagerDefaultAnisetteProviderMyFilePackager( + deserializer, + )); } @protected - FoundDevice sse_decode_found_device(SseDeserializer deserializer) { + SystemTime + sse_decode_box_autoadd_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerSystemTime( + SseDeserializer deserializer, + ) { // Codec=Sse (Serialization based), see doc to use other codecs - var var_deviceModel = sse_decode_opt_String(deserializer); - var var_lowPowerMode = sse_decode_opt_box_autoadd_bool(deserializer); - var var_passcodeLength = sse_decode_opt_box_autoadd_i_64(deserializer); - var var_id = sse_decode_opt_String(deserializer); - var var_batteryStatus = sse_decode_opt_String(deserializer); - var var_lostModeCapable = sse_decode_opt_box_autoadd_bool(deserializer); - var var_batteryLevel = sse_decode_opt_box_autoadd_f_64(deserializer); - var var_locationEnabled = sse_decode_opt_box_autoadd_bool(deserializer); - var var_isConsideredAccessory = - sse_decode_opt_box_autoadd_bool(deserializer); - var var_location = sse_decode_opt_box_autoadd_location(deserializer); - var var_modelDisplayName = sse_decode_opt_String(deserializer); - var var_deviceColor = sse_decode_opt_String(deserializer); - var var_activationLocked = sse_decode_opt_box_autoadd_bool(deserializer); - var var_rm2State = sse_decode_opt_box_autoadd_i_64(deserializer); - var var_locFoundEnabled = sse_decode_opt_box_autoadd_bool(deserializer); - var var_nwd = sse_decode_opt_box_autoadd_bool(deserializer); - var var_deviceStatus = sse_decode_opt_String(deserializer); - var var_fmlyShare = sse_decode_opt_box_autoadd_bool(deserializer); - var var_features = sse_decode_Map_String_bool(deserializer); - var var_thisDevice = sse_decode_opt_box_autoadd_bool(deserializer); - var var_lostModeEnabled = sse_decode_opt_box_autoadd_bool(deserializer); - var var_deviceDisplayName = sse_decode_opt_String(deserializer); - var var_name = sse_decode_opt_String(deserializer); - var var_canWipeAfterLock = sse_decode_opt_box_autoadd_bool(deserializer); - var var_isMac = sse_decode_opt_box_autoadd_bool(deserializer); - var var_rawDeviceModel = sse_decode_opt_String(deserializer); - var var_baUuid = sse_decode_opt_String(deserializer); - var var_deviceDiscoveryId = sse_decode_opt_String(deserializer); - var var_scd = sse_decode_opt_box_autoadd_bool(deserializer); - var var_locationCapable = sse_decode_opt_box_autoadd_bool(deserializer); - var var_wipeInProgress = sse_decode_opt_box_autoadd_bool(deserializer); - var var_darkWake = sse_decode_opt_box_autoadd_bool(deserializer); - var var_deviceWithYou = sse_decode_opt_box_autoadd_bool(deserializer); - var var_maxMsgChar = sse_decode_opt_box_autoadd_i_64(deserializer); - var var_deviceClass = sse_decode_opt_String(deserializer); - return FoundDevice( - deviceModel: var_deviceModel, - lowPowerMode: var_lowPowerMode, - passcodeLength: var_passcodeLength, - id: var_id, - batteryStatus: var_batteryStatus, - lostModeCapable: var_lostModeCapable, - batteryLevel: var_batteryLevel, - locationEnabled: var_locationEnabled, - isConsideredAccessory: var_isConsideredAccessory, - location: var_location, - modelDisplayName: var_modelDisplayName, - deviceColor: var_deviceColor, - activationLocked: var_activationLocked, - rm2State: var_rm2State, - locFoundEnabled: var_locFoundEnabled, - nwd: var_nwd, - deviceStatus: var_deviceStatus, - fmlyShare: var_fmlyShare, - features: var_features, - thisDevice: var_thisDevice, - lostModeEnabled: var_lostModeEnabled, - deviceDisplayName: var_deviceDisplayName, - name: var_name, - canWipeAfterLock: var_canWipeAfterLock, - isMac: var_isMac, - rawDeviceModel: var_rawDeviceModel, - baUuid: var_baUuid, - deviceDiscoveryId: var_deviceDiscoveryId, - scd: var_scd, - locationCapable: var_locationCapable, - wipeInProgress: var_wipeInProgress, - darkWake: var_darkWake, - deviceWithYou: var_deviceWithYou, - maxMsgChar: var_maxMsgChar, - deviceClass: var_deviceClass); + return (sse_decode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerSystemTime( + deserializer, + )); } @protected - FTMember sse_decode_ft_member(SseDeserializer deserializer) { + Address sse_decode_box_autoadd_address(SseDeserializer deserializer) { // Codec=Sse (Serialization based), see doc to use other codecs - var var_nickname = sse_decode_opt_String(deserializer); - var var_handle = sse_decode_String(deserializer); - return FTMember(nickname: var_nickname, handle: var_handle); + return (sse_decode_address(deserializer)); } @protected - FTMessage sse_decode_ft_message(SseDeserializer deserializer) { + Attachment sse_decode_box_autoadd_attachment(SseDeserializer deserializer) { // Codec=Sse (Serialization based), see doc to use other codecs + return (sse_decode_attachment(deserializer)); + } - var tag_ = sse_decode_i_32(deserializer); - switch (tag_) { - case 0: - var var_field0 = sse_decode_box_autoadd_let_me_in_request(deserializer); - return FTMessage_LetMeInRequest(var_field0); - case 1: - var var_guid = sse_decode_String(deserializer); - return FTMessage_LinkChanged(guid: var_guid); - case 2: - var var_guid = sse_decode_String(deserializer); - var var_participant = sse_decode_u_64(deserializer); - var var_handle = sse_decode_String(deserializer); - var var_ring = sse_decode_bool(deserializer); - return FTMessage_JoinEvent( - guid: var_guid, - participant: var_participant, - handle: var_handle, - ring: var_ring); - case 3: - var var_guid = sse_decode_String(deserializer); - var var_members = sse_decode_Set_ft_member(deserializer); - var var_ring = sse_decode_bool(deserializer); - return FTMessage_AddMembers( - guid: var_guid, members: var_members, ring: var_ring); - case 4: - var var_guid = sse_decode_String(deserializer); - var var_members = sse_decode_Set_ft_member(deserializer); - return FTMessage_RemoveMembers(guid: var_guid, members: var_members); - case 5: - var var_guid = sse_decode_String(deserializer); - var var_participant = sse_decode_u_64(deserializer); - var var_handle = sse_decode_String(deserializer); - return FTMessage_LeaveEvent( - guid: var_guid, participant: var_participant, handle: var_handle); - case 6: - var var_guid = sse_decode_String(deserializer); - return FTMessage_Ring(guid: var_guid); - case 7: - var var_guid = sse_decode_String(deserializer); - return FTMessage_Decline(guid: var_guid); - case 8: - var var_guid = sse_decode_String(deserializer); - return FTMessage_RespondedElsewhere(guid: var_guid); - default: - throw UnimplementedError(''); - } + @protected + AttachmentMeta sse_decode_box_autoadd_attachment_meta( + SseDeserializer deserializer, + ) { + // Codec=Sse (Serialization based), see doc to use other codecs + return (sse_decode_attachment_meta(deserializer)); + } + + @protected + AttachmentMetaExtra sse_decode_box_autoadd_attachment_meta_extra( + SseDeserializer deserializer, + ) { + // Codec=Sse (Serialization based), see doc to use other codecs + return (sse_decode_attachment_meta_extra(deserializer)); + } + + @protected + Balloon sse_decode_box_autoadd_balloon(SseDeserializer deserializer) { + // Codec=Sse (Serialization based), see doc to use other codecs + return (sse_decode_balloon(deserializer)); + } + + @protected + BalloonLayout sse_decode_box_autoadd_balloon_layout( + SseDeserializer deserializer, + ) { + // Codec=Sse (Serialization based), see doc to use other codecs + return (sse_decode_balloon_layout(deserializer)); + } + + @protected + BeaconAttributes sse_decode_box_autoadd_beacon_attributes( + SseDeserializer deserializer, + ) { + // Codec=Sse (Serialization based), see doc to use other codecs + return (sse_decode_beacon_attributes(deserializer)); + } + + @protected + BeaconNamingRecord sse_decode_box_autoadd_beacon_naming_record( + SseDeserializer deserializer, + ) { + // Codec=Sse (Serialization based), see doc to use other codecs + return (sse_decode_beacon_naming_record(deserializer)); + } + + @protected + bool sse_decode_box_autoadd_bool(SseDeserializer deserializer) { + // Codec=Sse (Serialization based), see doc to use other codecs + return (sse_decode_bool(deserializer)); + } + + @protected + CertifiedContext sse_decode_box_autoadd_certified_context( + SseDeserializer deserializer, + ) { + // Codec=Sse (Serialization based), see doc to use other codecs + return (sse_decode_certified_context(deserializer)); + } + + @protected + ChangeParticipantMessage sse_decode_box_autoadd_change_participant_message( + SseDeserializer deserializer, + ) { + // Codec=Sse (Serialization based), see doc to use other codecs + return (sse_decode_change_participant_message(deserializer)); + } + + @protected + ChatProto sse_decode_box_autoadd_chat_proto(SseDeserializer deserializer) { + // Codec=Sse (Serialization based), see doc to use other codecs + return (sse_decode_chat_proto(deserializer)); + } + + @protected + CloudAttachment sse_decode_box_autoadd_cloud_attachment( + SseDeserializer deserializer, + ) { + // Codec=Sse (Serialization based), see doc to use other codecs + return (sse_decode_cloud_attachment(deserializer)); + } + + @protected + CloudChat sse_decode_box_autoadd_cloud_chat(SseDeserializer deserializer) { + // Codec=Sse (Serialization based), see doc to use other codecs + return (sse_decode_cloud_chat(deserializer)); + } + + @protected + CloudMessage sse_decode_box_autoadd_cloud_message( + SseDeserializer deserializer, + ) { + // Codec=Sse (Serialization based), see doc to use other codecs + return (sse_decode_cloud_message(deserializer)); + } + + @protected + CloudProp sse_decode_box_autoadd_cloud_prop(SseDeserializer deserializer) { + // Codec=Sse (Serialization based), see doc to use other codecs + return (sse_decode_cloud_prop(deserializer)); + } + + @protected + CloudSyncOutboundFailureClass + sse_decode_box_autoadd_cloud_sync_outbound_failure_class( + SseDeserializer deserializer, + ) { + // Codec=Sse (Serialization based), see doc to use other codecs + return (sse_decode_cloud_sync_outbound_failure_class(deserializer)); + } + + @protected + CloudSyncOutboundReconcileDisposition + sse_decode_box_autoadd_cloud_sync_outbound_reconcile_disposition( + SseDeserializer deserializer, + ) { + // Codec=Sse (Serialization based), see doc to use other codecs + return (sse_decode_cloud_sync_outbound_reconcile_disposition(deserializer)); + } + + @protected + CloudSyncOutboundSafeCode + sse_decode_box_autoadd_cloud_sync_outbound_safe_code( + SseDeserializer deserializer, + ) { + // Codec=Sse (Serialization based), see doc to use other codecs + return (sse_decode_cloud_sync_outbound_safe_code(deserializer)); + } + + @protected + CloudSyncPreparedMessageCreateInput + sse_decode_box_autoadd_cloud_sync_prepared_message_create_input( + SseDeserializer deserializer, + ) { + // Codec=Sse (Serialization based), see doc to use other codecs + return (sse_decode_cloud_sync_prepared_message_create_input(deserializer)); + } + + @protected + CloudSyncProtectedFailure sse_decode_box_autoadd_cloud_sync_protected_failure( + SseDeserializer deserializer, + ) { + // Codec=Sse (Serialization based), see doc to use other codecs + return (sse_decode_cloud_sync_protected_failure(deserializer)); + } + + @protected + CloudSyncProtectedGarbageCollection + sse_decode_box_autoadd_cloud_sync_protected_garbage_collection( + SseDeserializer deserializer, + ) { + // Codec=Sse (Serialization based), see doc to use other codecs + return (sse_decode_cloud_sync_protected_garbage_collection(deserializer)); + } + + @protected + CloudSyncProtectedOutboundStage + sse_decode_box_autoadd_cloud_sync_protected_outbound_stage( + SseDeserializer deserializer, + ) { + // Codec=Sse (Serialization based), see doc to use other codecs + return (sse_decode_cloud_sync_protected_outbound_stage(deserializer)); + } + + @protected + CloudSyncProtectedPage sse_decode_box_autoadd_cloud_sync_protected_page( + SseDeserializer deserializer, + ) { + // Codec=Sse (Serialization based), see doc to use other codecs + return (sse_decode_cloud_sync_protected_page(deserializer)); + } + + @protected + CloudSyncProtectedPreflightCode + sse_decode_box_autoadd_cloud_sync_protected_preflight_code( + SseDeserializer deserializer, + ) { + // Codec=Sse (Serialization based), see doc to use other codecs + return (sse_decode_cloud_sync_protected_preflight_code(deserializer)); + } + + @protected + CloudSyncProtectedRecovery + sse_decode_box_autoadd_cloud_sync_protected_recovery( + SseDeserializer deserializer, + ) { + // Codec=Sse (Serialization based), see doc to use other codecs + return (sse_decode_cloud_sync_protected_recovery(deserializer)); + } + + @protected + CloudSyncRawFailure sse_decode_box_autoadd_cloud_sync_raw_failure( + SseDeserializer deserializer, + ) { + // Codec=Sse (Serialization based), see doc to use other codecs + return (sse_decode_cloud_sync_raw_failure(deserializer)); + } + + @protected + CloudSyncRawPage sse_decode_box_autoadd_cloud_sync_raw_page( + SseDeserializer deserializer, + ) { + // Codec=Sse (Serialization based), see doc to use other codecs + return (sse_decode_cloud_sync_raw_page(deserializer)); + } + + @protected + CloudSyncRawSystemFields sse_decode_box_autoadd_cloud_sync_raw_system_fields( + SseDeserializer deserializer, + ) { + // Codec=Sse (Serialization based), see doc to use other codecs + return (sse_decode_cloud_sync_raw_system_fields(deserializer)); + } + + @protected + CloudSyncTransientAttachmentPayload + sse_decode_box_autoadd_cloud_sync_transient_attachment_payload( + SseDeserializer deserializer, + ) { + // Codec=Sse (Serialization based), see doc to use other codecs + return (sse_decode_cloud_sync_transient_attachment_payload(deserializer)); + } + + @protected + CloudSyncTransientChatPayload + sse_decode_box_autoadd_cloud_sync_transient_chat_payload( + SseDeserializer deserializer, + ) { + // Codec=Sse (Serialization based), see doc to use other codecs + return (sse_decode_cloud_sync_transient_chat_payload(deserializer)); + } + + @protected + CloudSyncTransientDeferredReason + sse_decode_box_autoadd_cloud_sync_transient_deferred_reason( + SseDeserializer deserializer, + ) { + // Codec=Sse (Serialization based), see doc to use other codecs + return (sse_decode_cloud_sync_transient_deferred_reason(deserializer)); + } + + @protected + CloudSyncTransientEntityKind + sse_decode_box_autoadd_cloud_sync_transient_entity_kind( + SseDeserializer deserializer, + ) { + // Codec=Sse (Serialization based), see doc to use other codecs + return (sse_decode_cloud_sync_transient_entity_kind(deserializer)); + } + + @protected + CloudSyncTransientFailureCode + sse_decode_box_autoadd_cloud_sync_transient_failure_code( + SseDeserializer deserializer, + ) { + // Codec=Sse (Serialization based), see doc to use other codecs + return (sse_decode_cloud_sync_transient_failure_code(deserializer)); + } + + @protected + CloudSyncTransientGroupPhotoPayload + sse_decode_box_autoadd_cloud_sync_transient_group_photo_payload( + SseDeserializer deserializer, + ) { + // Codec=Sse (Serialization based), see doc to use other codecs + return (sse_decode_cloud_sync_transient_group_photo_payload(deserializer)); + } + + @protected + CloudSyncTransientMessagePayload + sse_decode_box_autoadd_cloud_sync_transient_message_payload( + SseDeserializer deserializer, + ) { + // Codec=Sse (Serialization based), see doc to use other codecs + return (sse_decode_cloud_sync_transient_message_payload(deserializer)); + } + + @protected + CloudSyncTransientMutationKind + sse_decode_box_autoadd_cloud_sync_transient_mutation_kind( + SseDeserializer deserializer, + ) { + // Codec=Sse (Serialization based), see doc to use other codecs + return (sse_decode_cloud_sync_transient_mutation_kind(deserializer)); + } + + @protected + CloudSyncTransientPayload sse_decode_box_autoadd_cloud_sync_transient_payload( + SseDeserializer deserializer, + ) { + // Codec=Sse (Serialization based), see doc to use other codecs + return (sse_decode_cloud_sync_transient_payload(deserializer)); + } + + @protected + CloudSyncTransientQuarantineReason + sse_decode_box_autoadd_cloud_sync_transient_quarantine_reason( + SseDeserializer deserializer, + ) { + // Codec=Sse (Serialization based), see doc to use other codecs + return (sse_decode_cloud_sync_transient_quarantine_reason(deserializer)); + } + + @protected + CloudSyncTransientReactionKind + sse_decode_box_autoadd_cloud_sync_transient_reaction_kind( + SseDeserializer deserializer, + ) { + // Codec=Sse (Serialization based), see doc to use other codecs + return (sse_decode_cloud_sync_transient_reaction_kind(deserializer)); + } + + @protected + CloudSyncTransientSnapshot + sse_decode_box_autoadd_cloud_sync_transient_snapshot( + SseDeserializer deserializer, + ) { + // Codec=Sse (Serialization based), see doc to use other codecs + return (sse_decode_cloud_sync_transient_snapshot(deserializer)); + } + + @protected + CloudSyncTransientTombstone + sse_decode_box_autoadd_cloud_sync_transient_tombstone( + SseDeserializer deserializer, + ) { + // Codec=Sse (Serialization based), see doc to use other codecs + return (sse_decode_cloud_sync_transient_tombstone(deserializer)); + } + + @protected + ConversationData sse_decode_box_autoadd_conversation_data( + SseDeserializer deserializer, + ) { + // Codec=Sse (Serialization based), see doc to use other codecs + return (sse_decode_conversation_data(deserializer)); + } + + @protected + DartBeaconShareInfo sse_decode_box_autoadd_dart_beacon_share_info( + SseDeserializer deserializer, + ) { + // Codec=Sse (Serialization based), see doc to use other codecs + return (sse_decode_dart_beacon_share_info(deserializer)); + } + + @protected + EditMessage sse_decode_box_autoadd_edit_message( + SseDeserializer deserializer, + ) { + // Codec=Sse (Serialization based), see doc to use other codecs + return (sse_decode_edit_message(deserializer)); + } + + @protected + ErrorMessage sse_decode_box_autoadd_error_message( + SseDeserializer deserializer, + ) { + // Codec=Sse (Serialization based), see doc to use other codecs + return (sse_decode_error_message(deserializer)); + } + + @protected + ExtensionApp sse_decode_box_autoadd_extension_app( + SseDeserializer deserializer, + ) { + // Codec=Sse (Serialization based), see doc to use other codecs + return (sse_decode_extension_app(deserializer)); + } + + @protected + double sse_decode_box_autoadd_f_64(SseDeserializer deserializer) { + // Codec=Sse (Serialization based), see doc to use other codecs + return (sse_decode_f_64(deserializer)); + } + + @protected + FTMessage sse_decode_box_autoadd_ft_message(SseDeserializer deserializer) { + // Codec=Sse (Serialization based), see doc to use other codecs + return (sse_decode_ft_message(deserializer)); + } + + @protected + FTMode sse_decode_box_autoadd_ft_mode(SseDeserializer deserializer) { + // Codec=Sse (Serialization based), see doc to use other codecs + return (sse_decode_ft_mode(deserializer)); + } + + @protected + HwExtra sse_decode_box_autoadd_hw_extra(SseDeserializer deserializer) { + // Codec=Sse (Serialization based), see doc to use other codecs + return (sse_decode_hw_extra(deserializer)); + } + + @protected + int sse_decode_box_autoadd_i_32(SseDeserializer deserializer) { + // Codec=Sse (Serialization based), see doc to use other codecs + return (sse_decode_i_32(deserializer)); + } + + @protected + PlatformInt64 sse_decode_box_autoadd_i_64(SseDeserializer deserializer) { + // Codec=Sse (Serialization based), see doc to use other codecs + return (sse_decode_i_64(deserializer)); + } + + @protected + IMessageNicknameRecord sse_decode_box_autoadd_i_message_nickname_record( + SseDeserializer deserializer, + ) { + // Codec=Sse (Serialization based), see doc to use other codecs + return (sse_decode_i_message_nickname_record(deserializer)); + } + + @protected + IMessagePosterRecord sse_decode_box_autoadd_i_message_poster_record( + SseDeserializer deserializer, + ) { + // Codec=Sse (Serialization based), see doc to use other codecs + return (sse_decode_i_message_poster_record(deserializer)); + } + + @protected + IconChangeMessage sse_decode_box_autoadd_icon_change_message( + SseDeserializer deserializer, + ) { + // Codec=Sse (Serialization based), see doc to use other codecs + return (sse_decode_icon_change_message(deserializer)); + } + + @protected + IdmsCircleMessage sse_decode_box_autoadd_idms_circle_message( + SseDeserializer deserializer, + ) { + // Codec=Sse (Serialization based), see doc to use other codecs + return (sse_decode_idms_circle_message(deserializer)); + } + + @protected + IdmsMessage sse_decode_box_autoadd_idms_message( + SseDeserializer deserializer, + ) { + // Codec=Sse (Serialization based), see doc to use other codecs + return (sse_decode_idms_message(deserializer)); + } + + @protected + IdmsRequestedSignIn sse_decode_box_autoadd_idms_requested_sign_in( + SseDeserializer deserializer, + ) { + // Codec=Sse (Serialization based), see doc to use other codecs + return (sse_decode_idms_requested_sign_in(deserializer)); + } + + @protected + LetMeInRequest sse_decode_box_autoadd_let_me_in_request( + SseDeserializer deserializer, + ) { + // Codec=Sse (Serialization based), see doc to use other codecs + return (sse_decode_let_me_in_request(deserializer)); + } + + @protected + LinkMeta sse_decode_box_autoadd_link_meta(SseDeserializer deserializer) { + // Codec=Sse (Serialization based), see doc to use other codecs + return (sse_decode_link_meta(deserializer)); + } + + @protected + Location sse_decode_box_autoadd_location(SseDeserializer deserializer) { + // Codec=Sse (Serialization based), see doc to use other codecs + return (sse_decode_location(deserializer)); + } + + @protected + LoginState sse_decode_box_autoadd_login_state(SseDeserializer deserializer) { + // Codec=Sse (Serialization based), see doc to use other codecs + return (sse_decode_login_state(deserializer)); + } + + @protected + LPIconMetadata sse_decode_box_autoadd_lp_icon_metadata( + SseDeserializer deserializer, + ) { + // Codec=Sse (Serialization based), see doc to use other codecs + return (sse_decode_lp_icon_metadata(deserializer)); + } + + @protected + LPImageMetadata sse_decode_box_autoadd_lp_image_metadata( + SseDeserializer deserializer, + ) { + // Codec=Sse (Serialization based), see doc to use other codecs + return (sse_decode_lp_image_metadata(deserializer)); + } + + @protected + LPSpecializationMetadata sse_decode_box_autoadd_lp_specialization_metadata( + SseDeserializer deserializer, + ) { + // Codec=Sse (Serialization based), see doc to use other codecs + return (sse_decode_lp_specialization_metadata(deserializer)); + } + + @protected + MemojiData sse_decode_box_autoadd_memoji_data(SseDeserializer deserializer) { + // Codec=Sse (Serialization based), see doc to use other codecs + return (sse_decode_memoji_data(deserializer)); + } + + @protected + Message sse_decode_box_autoadd_message(SseDeserializer deserializer) { + // Codec=Sse (Serialization based), see doc to use other codecs + return (sse_decode_message(deserializer)); + } + + @protected + MessageInst sse_decode_box_autoadd_message_inst( + SseDeserializer deserializer, + ) { + // Codec=Sse (Serialization based), see doc to use other codecs + return (sse_decode_message_inst(deserializer)); + } + + @protected + MessageParts sse_decode_box_autoadd_message_parts( + SseDeserializer deserializer, + ) { + // Codec=Sse (Serialization based), see doc to use other codecs + return (sse_decode_message_parts(deserializer)); + } + + @protected + MessageProto sse_decode_box_autoadd_message_proto( + SseDeserializer deserializer, + ) { + // Codec=Sse (Serialization based), see doc to use other codecs + return (sse_decode_message_proto(deserializer)); + } + + @protected + MessageProto2 sse_decode_box_autoadd_message_proto_2( + SseDeserializer deserializer, + ) { + // Codec=Sse (Serialization based), see doc to use other codecs + return (sse_decode_message_proto_2(deserializer)); + } + + @protected + MessageProto3 sse_decode_box_autoadd_message_proto_3( + SseDeserializer deserializer, + ) { + // Codec=Sse (Serialization based), see doc to use other codecs + return (sse_decode_message_proto_3(deserializer)); + } + + @protected + MessageProto4 sse_decode_box_autoadd_message_proto_4( + SseDeserializer deserializer, + ) { + // Codec=Sse (Serialization based), see doc to use other codecs + return (sse_decode_message_proto_4(deserializer)); + } + + @protected + MessageSummaryInfo sse_decode_box_autoadd_message_summary_info( + SseDeserializer deserializer, + ) { + // Codec=Sse (Serialization based), see doc to use other codecs + return (sse_decode_message_summary_info(deserializer)); + } + + @protected + MMCSAttachmentMeta sse_decode_box_autoadd_mmcs_attachment_meta( + SseDeserializer deserializer, + ) { + // Codec=Sse (Serialization based), see doc to use other codecs + return (sse_decode_mmcs_attachment_meta(deserializer)); + } + + @protected + MMCSFile sse_decode_box_autoadd_mmcs_file(SseDeserializer deserializer) { + // Codec=Sse (Serialization based), see doc to use other codecs + return (sse_decode_mmcs_file(deserializer)); + } + + @protected + MonogramData sse_decode_box_autoadd_monogram_data( + SseDeserializer deserializer, + ) { + // Codec=Sse (Serialization based), see doc to use other codecs + return (sse_decode_monogram_data(deserializer)); + } + + @protected + MoveToRecycleBinMessage sse_decode_box_autoadd_move_to_recycle_bin_message( + SseDeserializer deserializer, + ) { + // Codec=Sse (Serialization based), see doc to use other codecs + return (sse_decode_move_to_recycle_bin_message(deserializer)); + } + + @protected + NormalMessage sse_decode_box_autoadd_normal_message( + SseDeserializer deserializer, + ) { + // Codec=Sse (Serialization based), see doc to use other codecs + return (sse_decode_normal_message(deserializer)); + } + + @protected + NSAttributedString sse_decode_box_autoadd_ns_attributed_string( + SseDeserializer deserializer, + ) { + // Codec=Sse (Serialization based), see doc to use other codecs + return (sse_decode_ns_attributed_string(deserializer)); + } + + @protected + NSNumber sse_decode_box_autoadd_ns_number(SseDeserializer deserializer) { + // Codec=Sse (Serialization based), see doc to use other codecs + return (sse_decode_ns_number(deserializer)); + } + + @protected + NSString sse_decode_box_autoadd_ns_string(SseDeserializer deserializer) { + // Codec=Sse (Serialization based), see doc to use other codecs + return (sse_decode_ns_string(deserializer)); + } + + @protected + NSURL sse_decode_box_autoadd_nsurl(SseDeserializer deserializer) { + // Codec=Sse (Serialization based), see doc to use other codecs + return (sse_decode_nsurl(deserializer)); + } + + @protected + NumOrString sse_decode_box_autoadd_num_or_string( + SseDeserializer deserializer, + ) { + // Codec=Sse (Serialization based), see doc to use other codecs + return (sse_decode_num_or_string(deserializer)); + } + + @protected + OperatedChat sse_decode_box_autoadd_operated_chat( + SseDeserializer deserializer, + ) { + // Codec=Sse (Serialization based), see doc to use other codecs + return (sse_decode_operated_chat(deserializer)); + } + + @protected + PartExtension sse_decode_box_autoadd_part_extension( + SseDeserializer deserializer, + ) { + // Codec=Sse (Serialization based), see doc to use other codecs + return (sse_decode_part_extension(deserializer)); + } + + @protected + Passkey sse_decode_box_autoadd_passkey(SseDeserializer deserializer) { + // Codec=Sse (Serialization based), see doc to use other codecs + return (sse_decode_passkey(deserializer)); + } + + @protected + PasswordManagerMeta sse_decode_box_autoadd_password_manager_meta( + SseDeserializer deserializer, + ) { + // Codec=Sse (Serialization based), see doc to use other codecs + return (sse_decode_password_manager_meta(deserializer)); + } + + @protected + PasswordManagerMetaData sse_decode_box_autoadd_password_manager_meta_data( + SseDeserializer deserializer, + ) { + // Codec=Sse (Serialization based), see doc to use other codecs + return (sse_decode_password_manager_meta_data(deserializer)); + } + + @protected + PasswordManagerMetaDataFormerlyShared + sse_decode_box_autoadd_password_manager_meta_data_formerly_shared( + SseDeserializer deserializer, + ) { + // Codec=Sse (Serialization based), see doc to use other codecs + return (sse_decode_password_manager_meta_data_formerly_shared( + deserializer, + )); + } + + @protected + PasswordManagerTotp sse_decode_box_autoadd_password_manager_totp( + SseDeserializer deserializer, + ) { + // Codec=Sse (Serialization based), see doc to use other codecs + return (sse_decode_password_manager_totp(deserializer)); + } + + @protected + PasswordRawEntry sse_decode_box_autoadd_password_raw_entry( + SseDeserializer deserializer, + ) { + // Codec=Sse (Serialization based), see doc to use other codecs + return (sse_decode_password_raw_entry(deserializer)); + } + + @protected + PermanentDeleteMessage sse_decode_box_autoadd_permanent_delete_message( + SseDeserializer deserializer, + ) { + // Codec=Sse (Serialization based), see doc to use other codecs + return (sse_decode_permanent_delete_message(deserializer)); + } + + @protected + PosterColor sse_decode_box_autoadd_poster_color( + SseDeserializer deserializer, + ) { + // Codec=Sse (Serialization based), see doc to use other codecs + return (sse_decode_poster_color(deserializer)); + } + + @protected + PRPosterContentMaterialStyle + sse_decode_box_autoadd_pr_poster_content_material_style( + SseDeserializer deserializer, + ) { + // Codec=Sse (Serialization based), see doc to use other codecs + return (sse_decode_pr_poster_content_material_style(deserializer)); + } + + @protected + PushMessage sse_decode_box_autoadd_push_message( + SseDeserializer deserializer, + ) { + // Codec=Sse (Serialization based), see doc to use other codecs + return (sse_decode_push_message(deserializer)); + } + + @protected + ReactMessage sse_decode_box_autoadd_react_message( + SseDeserializer deserializer, + ) { + // Codec=Sse (Serialization based), see doc to use other codecs + return (sse_decode_react_message(deserializer)); + } + + @protected + Reaction sse_decode_box_autoadd_reaction(SseDeserializer deserializer) { + // Codec=Sse (Serialization based), see doc to use other codecs + return (sse_decode_reaction(deserializer)); + } + + @protected + (SharedPushState, ApsWatcher) + sse_decode_box_autoadd_record_shared_push_state_auto_owned_rust_opaque_flutter_rust_bridgefor_generated_rust_auto_opaque_inner_aps_watcher( + SseDeserializer deserializer, + ) { + // Codec=Sse (Serialization based), see doc to use other codecs + return (sse_decode_record_shared_push_state_auto_owned_rust_opaque_flutter_rust_bridgefor_generated_rust_auto_opaque_inner_aps_watcher( + deserializer, + )); + } + + @protected + (String, String) sse_decode_box_autoadd_record_string_string( + SseDeserializer deserializer, + ) { + // Codec=Sse (Serialization based), see doc to use other codecs + return (sse_decode_record_string_string(deserializer)); + } + + @protected + (String, BigInt) sse_decode_box_autoadd_record_string_u_64( + SseDeserializer deserializer, + ) { + // Codec=Sse (Serialization based), see doc to use other codecs + return (sse_decode_record_string_u_64(deserializer)); + } + + @protected + RegisterState sse_decode_box_autoadd_register_state( + SseDeserializer deserializer, + ) { + // Codec=Sse (Serialization based), see doc to use other codecs + return (sse_decode_register_state(deserializer)); + } + + @protected + RenameMessage sse_decode_box_autoadd_rename_message( + SseDeserializer deserializer, + ) { + // Codec=Sse (Serialization based), see doc to use other codecs + return (sse_decode_rename_message(deserializer)); + } + + @protected + RichLinkImageAttachmentSubstitute + sse_decode_box_autoadd_rich_link_image_attachment_substitute( + SseDeserializer deserializer, + ) { + // Codec=Sse (Serialization based), see doc to use other codecs + return (sse_decode_rich_link_image_attachment_substitute(deserializer)); + } + + @protected + ScheduleMode sse_decode_box_autoadd_schedule_mode( + SseDeserializer deserializer, + ) { + // Codec=Sse (Serialization based), see doc to use other codecs + return (sse_decode_schedule_mode(deserializer)); + } + + @protected + SetTranscriptBackgroundMessage + sse_decode_box_autoadd_set_transcript_background_message( + SseDeserializer deserializer, + ) { + // Codec=Sse (Serialization based), see doc to use other codecs + return (sse_decode_set_transcript_background_message(deserializer)); + } + + @protected + ShareProfileMessage sse_decode_box_autoadd_share_profile_message( + SseDeserializer deserializer, + ) { + // Codec=Sse (Serialization based), see doc to use other codecs + return (sse_decode_share_profile_message(deserializer)); + } + + @protected + SharedAlbum sse_decode_box_autoadd_shared_album( + SseDeserializer deserializer, + ) { + // Codec=Sse (Serialization based), see doc to use other codecs + return (sse_decode_shared_album(deserializer)); + } + + @protected + SharedICloudServices sse_decode_box_autoadd_shared_i_cloud_services( + SseDeserializer deserializer, + ) { + // Codec=Sse (Serialization based), see doc to use other codecs + return (sse_decode_shared_i_cloud_services(deserializer)); + } + + @protected + SharedPoster sse_decode_box_autoadd_shared_poster( + SseDeserializer deserializer, + ) { + // Codec=Sse (Serialization based), see doc to use other codecs + return (sse_decode_shared_poster(deserializer)); + } + + @protected + SharedPushState sse_decode_box_autoadd_shared_push_state( + SseDeserializer deserializer, + ) { + // Codec=Sse (Serialization based), see doc to use other codecs + return (sse_decode_shared_push_state(deserializer)); + } + + @protected + SimplifiedIncomingCallPoster + sse_decode_box_autoadd_simplified_incoming_call_poster( + SseDeserializer deserializer, + ) { + // Codec=Sse (Serialization based), see doc to use other codecs + return (sse_decode_simplified_incoming_call_poster(deserializer)); + } + + @protected + SimplifiedTranscriptPoster + sse_decode_box_autoadd_simplified_transcript_poster( + SseDeserializer deserializer, + ) { + // Codec=Sse (Serialization based), see doc to use other codecs + return (sse_decode_simplified_transcript_poster(deserializer)); + } + + @protected + StatusKitMessage sse_decode_box_autoadd_status_kit_message( + SseDeserializer deserializer, + ) { + // Codec=Sse (Serialization based), see doc to use other codecs + return (sse_decode_status_kit_message(deserializer)); + } + + @protected + SupportAction sse_decode_box_autoadd_support_action( + SseDeserializer deserializer, + ) { + // Codec=Sse (Serialization based), see doc to use other codecs + return (sse_decode_support_action(deserializer)); + } + + @protected + SupportAlert sse_decode_box_autoadd_support_alert( + SseDeserializer deserializer, + ) { + // Codec=Sse (Serialization based), see doc to use other codecs + return (sse_decode_support_alert(deserializer)); + } + + @protected + TeardownSignIn sse_decode_box_autoadd_teardown_sign_in( + SseDeserializer deserializer, + ) { + // Codec=Sse (Serialization based), see doc to use other codecs + return (sse_decode_teardown_sign_in(deserializer)); + } + + @protected + TextFlags sse_decode_box_autoadd_text_flags(SseDeserializer deserializer) { + // Codec=Sse (Serialization based), see doc to use other codecs + return (sse_decode_text_flags(deserializer)); + } + + @protected + TextFormat sse_decode_box_autoadd_text_format(SseDeserializer deserializer) { + // Codec=Sse (Serialization based), see doc to use other codecs + return (sse_decode_text_format(deserializer)); + } + + @protected + TranscriptDynamicUserData sse_decode_box_autoadd_transcript_dynamic_user_data( + SseDeserializer deserializer, + ) { + // Codec=Sse (Serialization based), see doc to use other codecs + return (sse_decode_transcript_dynamic_user_data(deserializer)); + } + + @protected + TypingApp sse_decode_box_autoadd_typing_app(SseDeserializer deserializer) { + // Codec=Sse (Serialization based), see doc to use other codecs + return (sse_decode_typing_app(deserializer)); + } + + @protected + int sse_decode_box_autoadd_u_16(SseDeserializer deserializer) { + // Codec=Sse (Serialization based), see doc to use other codecs + return (sse_decode_u_16(deserializer)); + } + + @protected + int sse_decode_box_autoadd_u_32(SseDeserializer deserializer) { + // Codec=Sse (Serialization based), see doc to use other codecs + return (sse_decode_u_32(deserializer)); + } + + @protected + BigInt sse_decode_box_autoadd_u_64(SseDeserializer deserializer) { + // Codec=Sse (Serialization based), see doc to use other codecs + return (sse_decode_u_64(deserializer)); + } + + @protected + UnsendMessage sse_decode_box_autoadd_unsend_message( + SseDeserializer deserializer, + ) { + // Codec=Sse (Serialization based), see doc to use other codecs + return (sse_decode_unsend_message(deserializer)); + } + + @protected + UpdateAccountFinish sse_decode_box_autoadd_update_account_finish( + SseDeserializer deserializer, + ) { + // Codec=Sse (Serialization based), see doc to use other codecs + return (sse_decode_update_account_finish(deserializer)); + } + + @protected + UpdateExtensionMessage sse_decode_box_autoadd_update_extension_message( + SseDeserializer deserializer, + ) { + // Codec=Sse (Serialization based), see doc to use other codecs + return (sse_decode_update_extension_message(deserializer)); + } + + @protected + UpdateProfileMessage sse_decode_box_autoadd_update_profile_message( + SseDeserializer deserializer, + ) { + // Codec=Sse (Serialization based), see doc to use other codecs + return (sse_decode_update_profile_message(deserializer)); + } + + @protected + UpdateProfileSharingMessage + sse_decode_box_autoadd_update_profile_sharing_message( + SseDeserializer deserializer, + ) { + // Codec=Sse (Serialization based), see doc to use other codecs + return (sse_decode_update_profile_sharing_message(deserializer)); + } + + @protected + WifiPassword sse_decode_box_autoadd_wifi_password( + SseDeserializer deserializer, + ) { + // Codec=Sse (Serialization based), see doc to use other codecs + return (sse_decode_wifi_password(deserializer)); + } + + @protected + CertifiedContext sse_decode_certified_context(SseDeserializer deserializer) { + // Codec=Sse (Serialization based), see doc to use other codecs + var var_version = sse_decode_u_32(deserializer); + var var_receipt = sse_decode_list_prim_u_8_strict(deserializer); + var var_sender = sse_decode_String(deserializer); + var var_target = sse_decode_String(deserializer); + var var_uuid = sse_decode_list_prim_u_8_strict(deserializer); + var var_token = sse_decode_list_prim_u_8_strict(deserializer); + return CertifiedContext( + version: var_version, + receipt: var_receipt, + sender: var_sender, + target: var_target, + uuid: var_uuid, + token: var_token, + ); + } + + @protected + ChangeParticipantMessage sse_decode_change_participant_message( + SseDeserializer deserializer, + ) { + // Codec=Sse (Serialization based), see doc to use other codecs + var var_newParticipants = sse_decode_list_String(deserializer); + var var_groupVersion = sse_decode_CastedPrimitive_u_64(deserializer); + return ChangeParticipantMessage( + newParticipants: var_newParticipants, + groupVersion: var_groupVersion, + ); + } + + @protected + ChatProto sse_decode_chat_proto(SseDeserializer deserializer) { + // Codec=Sse (Serialization based), see doc to use other codecs + var var_unk1 = sse_decode_opt_box_autoadd_u_32(deserializer); + return ChatProto(unk1: var_unk1); + } + + @protected + CloudAttachment sse_decode_cloud_attachment(SseDeserializer deserializer) { + // Codec=Sse (Serialization based), see doc to use other codecs + var var_cm = + sse_decode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerGZipWrapperAttachmentMeta( + deserializer, + ); + var var_lqa = + sse_decode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerAsset( + deserializer, + ); + return CloudAttachment(cm: var_cm, lqa: var_lqa); + } + + @protected + CloudChat sse_decode_cloud_chat(SseDeserializer deserializer) { + // Codec=Sse (Serialization based), see doc to use other codecs + var var_style = sse_decode_i_64(deserializer); + var var_isFiltered = sse_decode_i_64(deserializer); + var var_successfulQuery = sse_decode_i_64(deserializer); + var var_state = sse_decode_i_64(deserializer); + var var_chatIdentifier = sse_decode_String(deserializer); + var var_groupId = sse_decode_String(deserializer); + var var_serviceName = sse_decode_String(deserializer); + var var_originalGroupId = sse_decode_String(deserializer); + var var_properties = sse_decode_opt_box_autoadd_cloud_prop(deserializer); + var var_participants = sse_decode_list_cloud_participant(deserializer); + var var_prop001 = sse_decode_cloud_prop_001(deserializer); + var var_lastReadMessageTimestamp = sse_decode_i_64(deserializer); + var var_lastAddressedHandle = sse_decode_String(deserializer); + var var_guid = sse_decode_String(deserializer); + var var_displayName = sse_decode_opt_String(deserializer); + var var_proto001 = + sse_decode_opt_box_autoadd_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerGZipWrapperChatProto( + deserializer, + ); + var var_groupPhotoGuid = sse_decode_opt_String(deserializer); + var var_groupPhoto = + sse_decode_opt_box_autoadd_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerAsset( + deserializer, + ); + return CloudChat( + style: var_style, + isFiltered: var_isFiltered, + successfulQuery: var_successfulQuery, + state: var_state, + chatIdentifier: var_chatIdentifier, + groupId: var_groupId, + serviceName: var_serviceName, + originalGroupId: var_originalGroupId, + properties: var_properties, + participants: var_participants, + prop001: var_prop001, + lastReadMessageTimestamp: var_lastReadMessageTimestamp, + lastAddressedHandle: var_lastAddressedHandle, + guid: var_guid, + displayName: var_displayName, + proto001: var_proto001, + groupPhotoGuid: var_groupPhotoGuid, + groupPhoto: var_groupPhoto, + ); + } + + @protected + CloudMessage sse_decode_cloud_message(SseDeserializer deserializer) { + // Codec=Sse (Serialization based), see doc to use other codecs + var var_utm = + sse_decode_opt_box_autoadd_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerSystemTime( + deserializer, + ); + var var_type = sse_decode_i_64(deserializer); + var var_error = sse_decode_i_64(deserializer); + var var_chatId = sse_decode_String(deserializer); + var var_sender = sse_decode_String(deserializer); + var var_time = sse_decode_i_64(deserializer); + var var_msgProto2 = + sse_decode_opt_box_autoadd_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerGZipWrapperMessageProto2( + deserializer, + ); + var var_destinationCallerId = sse_decode_String(deserializer); + var var_msgProto = + sse_decode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerGZipWrapperMessageProto( + deserializer, + ); + var var_flags = + sse_decode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerMessageFlags( + deserializer, + ); + var var_guid = sse_decode_String(deserializer); + var var_msgProto3 = + sse_decode_opt_box_autoadd_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerGZipWrapperMessageProto3( + deserializer, + ); + var var_service = sse_decode_String(deserializer); + var var_msgProto4 = + sse_decode_opt_box_autoadd_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerGZipWrapperMessageProto4( + deserializer, + ); + return CloudMessage( + utm: var_utm, + type: var_type, + error: var_error, + chatId: var_chatId, + sender: var_sender, + time: var_time, + msgProto2: var_msgProto2, + destinationCallerId: var_destinationCallerId, + msgProto: var_msgProto, + flags: var_flags, + guid: var_guid, + msgProto3: var_msgProto3, + service: var_service, + msgProto4: var_msgProto4, + ); + } + + @protected + CloudMessageSummary sse_decode_cloud_message_summary( + SseDeserializer deserializer, + ) { + // Codec=Sse (Serialization based), see doc to use other codecs + var var_messagesSummary = sse_decode_list_prim_i_64_strict(deserializer); + var var_chatSummary = sse_decode_list_prim_i_64_strict(deserializer); + var var_attachmentSummary = sse_decode_list_prim_i_64_strict(deserializer); + return CloudMessageSummary( + messagesSummary: var_messagesSummary, + chatSummary: var_chatSummary, + attachmentSummary: var_attachmentSummary, + ); + } + + @protected + CloudParticipant sse_decode_cloud_participant(SseDeserializer deserializer) { + // Codec=Sse (Serialization based), see doc to use other codecs + var var_uri = sse_decode_String(deserializer); + return CloudParticipant(uri: var_uri); + } + + @protected + CloudProp sse_decode_cloud_prop(SseDeserializer deserializer) { + // Codec=Sse (Serialization based), see doc to use other codecs + var var_gpufc = sse_decode_opt_box_autoadd_u_32(deserializer); + var var_pv = sse_decode_opt_box_autoadd_u_32(deserializer); + var var_numberOfTimesRespondedtoThread = sse_decode_opt_box_autoadd_u_32( + deserializer, + ); + var var_shouldForceToSms = sse_decode_opt_box_autoadd_bool(deserializer); + var var_lastSeenMessageGuid = sse_decode_opt_String(deserializer); + var var_messageHandshakeState = sse_decode_opt_box_autoadd_u_32( + deserializer, + ); + var var_legacyGroupIdentifiers = sse_decode_list_String(deserializer); + var var_groupPhotoGuid = sse_decode_opt_String(deserializer); + var var_lastModificationDate = + sse_decode_opt_box_autoadd_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerDate( + deserializer, + ); + return CloudProp( + gpufc: var_gpufc, + pv: var_pv, + numberOfTimesRespondedtoThread: var_numberOfTimesRespondedtoThread, + shouldForceToSms: var_shouldForceToSms, + lastSeenMessageGuid: var_lastSeenMessageGuid, + messageHandshakeState: var_messageHandshakeState, + legacyGroupIdentifiers: var_legacyGroupIdentifiers, + groupPhotoGuid: var_groupPhotoGuid, + lastModificationDate: var_lastModificationDate, + ); + } + + @protected + CloudProp001 sse_decode_cloud_prop_001(SseDeserializer deserializer) { + // Codec=Sse (Serialization based), see doc to use other codecs + var var_syndicationType = sse_decode_u_32(deserializer); + return CloudProp001(syndicationType: var_syndicationType); + } + + @protected + CloudSyncNativeAuthMetadata sse_decode_cloud_sync_native_auth_metadata( + SseDeserializer deserializer, + ) { + // Codec=Sse (Serialization based), see doc to use other codecs + var var_nativeSessionId = sse_decode_String(deserializer); + var var_accountFingerprint = sse_decode_String(deserializer); + var var_protectedStoreIdentity = sse_decode_String(deserializer); + return CloudSyncNativeAuthMetadata( + nativeSessionId: var_nativeSessionId, + accountFingerprint: var_accountFingerprint, + protectedStoreIdentity: var_protectedStoreIdentity, + ); + } + + @protected + CloudSyncOutboundConsumeResult sse_decode_cloud_sync_outbound_consume_result( + SseDeserializer deserializer, + ) { + // Codec=Sse (Serialization based), see doc to use other codecs + var var_outcomes = sse_decode_list_cloud_sync_outbound_save_outcome( + deserializer, + ); + var var_failure = sse_decode_opt_box_autoadd_cloud_sync_outbound_safe_code( + deserializer, + ); + return CloudSyncOutboundConsumeResult( + outcomes: var_outcomes, + failure: var_failure, + ); + } + + @protected + CloudSyncOutboundFailureClass sse_decode_cloud_sync_outbound_failure_class( + SseDeserializer deserializer, + ) { + // Codec=Sse (Serialization based), see doc to use other codecs + var inner = sse_decode_i_32(deserializer); + return CloudSyncOutboundFailureClass.values[inner]; + } + + @protected + CloudSyncOutboundReconcileDisposition + sse_decode_cloud_sync_outbound_reconcile_disposition( + SseDeserializer deserializer, + ) { + // Codec=Sse (Serialization based), see doc to use other codecs + var inner = sse_decode_i_32(deserializer); + return CloudSyncOutboundReconcileDisposition.values[inner]; + } + + @protected + CloudSyncOutboundReconcileResult + sse_decode_cloud_sync_outbound_reconcile_result( + SseDeserializer deserializer, + ) { + // Codec=Sse (Serialization based), see doc to use other codecs + var var_disposition = + sse_decode_opt_box_autoadd_cloud_sync_outbound_reconcile_disposition( + deserializer, + ); + var var_protectedProofReference = sse_decode_opt_String(deserializer); + var var_failureClass = + sse_decode_opt_box_autoadd_cloud_sync_outbound_failure_class( + deserializer, + ); + var var_retryAfterSeconds = sse_decode_opt_box_autoadd_u_64(deserializer); + var var_failure = sse_decode_opt_box_autoadd_cloud_sync_outbound_safe_code( + deserializer, + ); + return CloudSyncOutboundReconcileResult( + disposition: var_disposition, + protectedProofReference: var_protectedProofReference, + failureClass: var_failureClass, + retryAfterSeconds: var_retryAfterSeconds, + failure: var_failure, + ); + } + + @protected + CloudSyncOutboundSafeCode sse_decode_cloud_sync_outbound_safe_code( + SseDeserializer deserializer, + ) { + // Codec=Sse (Serialization based), see doc to use other codecs + var inner = sse_decode_i_32(deserializer); + return CloudSyncOutboundSafeCode.values[inner]; + } + + @protected + CloudSyncOutboundSaveDisposition + sse_decode_cloud_sync_outbound_save_disposition( + SseDeserializer deserializer, + ) { + // Codec=Sse (Serialization based), see doc to use other codecs + var inner = sse_decode_i_32(deserializer); + return CloudSyncOutboundSaveDisposition.values[inner]; + } + + @protected + CloudSyncOutboundSaveOutcome sse_decode_cloud_sync_outbound_save_outcome( + SseDeserializer deserializer, + ) { + // Codec=Sse (Serialization based), see doc to use other codecs + var var_localOperationId = sse_decode_String(deserializer); + var var_appleOperationUuid = sse_decode_String(deserializer); + var var_disposition = sse_decode_cloud_sync_outbound_save_disposition( + deserializer, + ); + var var_failureClass = + sse_decode_opt_box_autoadd_cloud_sync_outbound_failure_class( + deserializer, + ); + var var_retryAfterSeconds = sse_decode_opt_box_autoadd_u_64(deserializer); + return CloudSyncOutboundSaveOutcome( + localOperationId: var_localOperationId, + appleOperationUuid: var_appleOperationUuid, + disposition: var_disposition, + failureClass: var_failureClass, + retryAfterSeconds: var_retryAfterSeconds, + ); + } + + @protected + CloudSyncPreparedMessageCreateInput + sse_decode_cloud_sync_prepared_message_create_input( + SseDeserializer deserializer, + ) { + // Codec=Sse (Serialization based), see doc to use other codecs + var var_localOperationId = sse_decode_String(deserializer); + var var_logicalEntityKeyHash = sse_decode_String(deserializer); + var var_protectedLeaseReference = sse_decode_String(deserializer); + var var_protectedPayloadReference = sse_decode_String(deserializer); + var var_payloadSha256 = sse_decode_String(deserializer); + var var_protectedServerRecordReference = sse_decode_String(deserializer); + var var_serverRecordIdHash = sse_decode_String(deserializer); + var var_appleOperationUuid = sse_decode_String(deserializer); + return CloudSyncPreparedMessageCreateInput( + localOperationId: var_localOperationId, + logicalEntityKeyHash: var_logicalEntityKeyHash, + protectedLeaseReference: var_protectedLeaseReference, + protectedPayloadReference: var_protectedPayloadReference, + payloadSha256: var_payloadSha256, + protectedServerRecordReference: var_protectedServerRecordReference, + serverRecordIdHash: var_serverRecordIdHash, + appleOperationUuid: var_appleOperationUuid, + ); + } + + @protected + CloudSyncPreparedMessageCreateResult + sse_decode_cloud_sync_prepared_message_create_result( + SseDeserializer deserializer, + ) { + // Codec=Sse (Serialization based), see doc to use other codecs + var var_handle = + sse_decode_opt_box_autoadd_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerCloudSyncPreparedMessageCreateHandle( + deserializer, + ); + var var_failure = sse_decode_opt_box_autoadd_cloud_sync_outbound_safe_code( + deserializer, + ); + return CloudSyncPreparedMessageCreateResult( + handle: var_handle, + failure: var_failure, + ); + } + + @protected + CloudSyncProtectedChange sse_decode_cloud_sync_protected_change( + SseDeserializer deserializer, + ) { + // Codec=Sse (Serialization based), see doc to use other codecs + var var_changeId = sse_decode_String(deserializer); + var var_recordIdHash = sse_decode_String(deserializer); + var var_etagHash = sse_decode_opt_String(deserializer); + var var_kind = sse_decode_cloud_sync_protected_change_kind(deserializer); + var var_payloadSha256 = sse_decode_String(deserializer); + var var_payloadLength = sse_decode_u_64(deserializer); + var var_protectedRecordIdentityReference = sse_decode_String(deserializer); + var var_protectedRawEnvelopeReference = sse_decode_String(deserializer); + var var_serverModifiedAtMillis = sse_decode_opt_box_autoadd_i_64( + deserializer, + ); + var var_preflightCode = + sse_decode_opt_box_autoadd_cloud_sync_protected_preflight_code( + deserializer, + ); + var var_isTombstone = sse_decode_bool(deserializer); + return CloudSyncProtectedChange( + changeId: var_changeId, + recordIdHash: var_recordIdHash, + etagHash: var_etagHash, + kind: var_kind, + payloadSha256: var_payloadSha256, + payloadLength: var_payloadLength, + protectedRecordIdentityReference: var_protectedRecordIdentityReference, + protectedRawEnvelopeReference: var_protectedRawEnvelopeReference, + serverModifiedAtMillis: var_serverModifiedAtMillis, + preflightCode: var_preflightCode, + isTombstone: var_isTombstone, + ); + } + + @protected + CloudSyncProtectedChangeKind sse_decode_cloud_sync_protected_change_kind( + SseDeserializer deserializer, + ) { + // Codec=Sse (Serialization based), see doc to use other codecs + var inner = sse_decode_i_32(deserializer); + return CloudSyncProtectedChangeKind.values[inner]; + } + + @protected + CloudSyncProtectedFailure sse_decode_cloud_sync_protected_failure( + SseDeserializer deserializer, + ) { + // Codec=Sse (Serialization based), see doc to use other codecs + var var_category = sse_decode_cloud_sync_protected_failure_category( + deserializer, + ); + var var_safeCode = sse_decode_cloud_sync_protected_safe_code(deserializer); + var var_retryAfterSeconds = sse_decode_opt_box_autoadd_u_64(deserializer); + return CloudSyncProtectedFailure( + category: var_category, + safeCode: var_safeCode, + retryAfterSeconds: var_retryAfterSeconds, + ); + } + + @protected + CloudSyncProtectedFailureCategory + sse_decode_cloud_sync_protected_failure_category( + SseDeserializer deserializer, + ) { + // Codec=Sse (Serialization based), see doc to use other codecs + var inner = sse_decode_i_32(deserializer); + return CloudSyncProtectedFailureCategory.values[inner]; + } + + @protected + CloudSyncProtectedFetchResult sse_decode_cloud_sync_protected_fetch_result( + SseDeserializer deserializer, + ) { + // Codec=Sse (Serialization based), see doc to use other codecs + var var_page = sse_decode_opt_box_autoadd_cloud_sync_protected_page( + deserializer, + ); + var var_failure = sse_decode_opt_box_autoadd_cloud_sync_protected_failure( + deserializer, + ); + return CloudSyncProtectedFetchResult(page: var_page, failure: var_failure); + } + + @protected + CloudSyncProtectedGarbageCollection + sse_decode_cloud_sync_protected_garbage_collection( + SseDeserializer deserializer, + ) { + // Codec=Sse (Serialization based), see doc to use other codecs + var var_scannedCount = sse_decode_u_32(deserializer); + var var_firstObservedCount = sse_decode_u_32(deserializer); + var var_deletedCount = sse_decode_u_32(deserializer); + var var_preservedLiveCount = sse_decode_u_32(deserializer); + var var_preservedActiveLeaseCount = sse_decode_u_32(deserializer); + var var_hasMore = sse_decode_bool(deserializer); + return CloudSyncProtectedGarbageCollection( + scannedCount: var_scannedCount, + firstObservedCount: var_firstObservedCount, + deletedCount: var_deletedCount, + preservedLiveCount: var_preservedLiveCount, + preservedActiveLeaseCount: var_preservedActiveLeaseCount, + hasMore: var_hasMore, + ); + } + + @protected + CloudSyncProtectedGarbageCollectionResult + sse_decode_cloud_sync_protected_garbage_collection_result( + SseDeserializer deserializer, + ) { + // Codec=Sse (Serialization based), see doc to use other codecs + var var_collection = + sse_decode_opt_box_autoadd_cloud_sync_protected_garbage_collection( + deserializer, + ); + var var_failure = sse_decode_opt_box_autoadd_cloud_sync_protected_failure( + deserializer, + ); + return CloudSyncProtectedGarbageCollectionResult( + collection: var_collection, + failure: var_failure, + ); + } + + @protected + CloudSyncProtectedLeaseResult sse_decode_cloud_sync_protected_lease_result( + SseDeserializer deserializer, + ) { + // Codec=Sse (Serialization based), see doc to use other codecs + var var_failure = sse_decode_opt_box_autoadd_cloud_sync_protected_failure( + deserializer, + ); + return CloudSyncProtectedLeaseResult(failure: var_failure); + } + + @protected + CloudSyncProtectedOutboundStage + sse_decode_cloud_sync_protected_outbound_stage(SseDeserializer deserializer) { + // Codec=Sse (Serialization based), see doc to use other codecs + var var_logicalEntityKeyHash = sse_decode_String(deserializer); + var var_protectedPayloadReference = sse_decode_String(deserializer); + var var_payloadSha256 = sse_decode_String(deserializer); + var var_payloadLength = sse_decode_u_64(deserializer); + var var_protectedServerRecordReference = sse_decode_String(deserializer); + var var_serverRecordIdHash = sse_decode_String(deserializer); + var var_leaseReference = sse_decode_String(deserializer); + return CloudSyncProtectedOutboundStage( + logicalEntityKeyHash: var_logicalEntityKeyHash, + protectedPayloadReference: var_protectedPayloadReference, + payloadSha256: var_payloadSha256, + payloadLength: var_payloadLength, + protectedServerRecordReference: var_protectedServerRecordReference, + serverRecordIdHash: var_serverRecordIdHash, + leaseReference: var_leaseReference, + ); + } + + @protected + CloudSyncProtectedOutboundStageResult + sse_decode_cloud_sync_protected_outbound_stage_result( + SseDeserializer deserializer, + ) { + // Codec=Sse (Serialization based), see doc to use other codecs + var var_stage = + sse_decode_opt_box_autoadd_cloud_sync_protected_outbound_stage( + deserializer, + ); + var var_failure = sse_decode_opt_box_autoadd_cloud_sync_outbound_safe_code( + deserializer, + ); + return CloudSyncProtectedOutboundStageResult( + stage: var_stage, + failure: var_failure, + ); + } + + @protected + CloudSyncProtectedPage sse_decode_cloud_sync_protected_page( + SseDeserializer deserializer, + ) { + // Codec=Sse (Serialization based), see doc to use other codecs + var var_changes = sse_decode_list_cloud_sync_protected_change(deserializer); + var var_batchId = sse_decode_String(deserializer); + var var_generation = sse_decode_u_64(deserializer); + var var_pageLeaseReference = sse_decode_String(deserializer); + var var_protectedNextCheckpointReference = sse_decode_opt_String( + deserializer, + ); + var var_complete = sse_decode_bool(deserializer); + var var_admittedRawBytes = sse_decode_u_64(deserializer); + return CloudSyncProtectedPage( + changes: var_changes, + batchId: var_batchId, + generation: var_generation, + pageLeaseReference: var_pageLeaseReference, + protectedNextCheckpointReference: var_protectedNextCheckpointReference, + complete: var_complete, + admittedRawBytes: var_admittedRawBytes, + ); + } + + @protected + CloudSyncProtectedPreflightCode + sse_decode_cloud_sync_protected_preflight_code(SseDeserializer deserializer) { + // Codec=Sse (Serialization based), see doc to use other codecs + var inner = sse_decode_i_32(deserializer); + return CloudSyncProtectedPreflightCode.values[inner]; + } + + @protected + CloudSyncProtectedRecovery sse_decode_cloud_sync_protected_recovery( + SseDeserializer deserializer, + ) { + // Codec=Sse (Serialization based), see doc to use other codecs + var var_finalizedAdoptedLeaseReferences = sse_decode_list_String( + deserializer, + ); + var var_absentAdoptedLeaseReferences = sse_decode_list_String(deserializer); + var var_rolledBackCount = sse_decode_u_32(deserializer); + var var_removedTemporaryFilesCount = sse_decode_u_32(deserializer); + var var_hasMore = sse_decode_bool(deserializer); + return CloudSyncProtectedRecovery( + finalizedAdoptedLeaseReferences: var_finalizedAdoptedLeaseReferences, + absentAdoptedLeaseReferences: var_absentAdoptedLeaseReferences, + rolledBackCount: var_rolledBackCount, + removedTemporaryFilesCount: var_removedTemporaryFilesCount, + hasMore: var_hasMore, + ); + } + + @protected + CloudSyncProtectedRecoveryResult + sse_decode_cloud_sync_protected_recovery_result( + SseDeserializer deserializer, + ) { + // Codec=Sse (Serialization based), see doc to use other codecs + var var_recovery = sse_decode_opt_box_autoadd_cloud_sync_protected_recovery( + deserializer, + ); + var var_failure = sse_decode_opt_box_autoadd_cloud_sync_protected_failure( + deserializer, + ); + return CloudSyncProtectedRecoveryResult( + recovery: var_recovery, + failure: var_failure, + ); + } + + @protected + CloudSyncProtectedRetirementResult + sse_decode_cloud_sync_protected_retirement_result( + SseDeserializer deserializer, + ) { + // Codec=Sse (Serialization based), see doc to use other codecs + var var_retiredCount = sse_decode_u_32(deserializer); + var var_failure = sse_decode_opt_box_autoadd_cloud_sync_protected_failure( + deserializer, + ); + return CloudSyncProtectedRetirementResult( + retiredCount: var_retiredCount, + failure: var_failure, + ); + } + + @protected + CloudSyncProtectedSafeCode sse_decode_cloud_sync_protected_safe_code( + SseDeserializer deserializer, + ) { + // Codec=Sse (Serialization based), see doc to use other codecs + var inner = sse_decode_i_32(deserializer); + return CloudSyncProtectedSafeCode.values[inner]; + } + + @protected + CloudSyncRawChange sse_decode_cloud_sync_raw_change( + SseDeserializer deserializer, + ) { + // Codec=Sse (Serialization based), see doc to use other codecs + var var_recordName = sse_decode_opt_String(deserializer); + var var_recordType = sse_decode_opt_String(deserializer); + var var_changeType = sse_decode_opt_box_autoadd_i_32(deserializer); + var var_systemFields = + sse_decode_opt_box_autoadd_cloud_sync_raw_system_fields(deserializer); + var var_encryptedRecord = sse_decode_opt_list_prim_u_8_strict(deserializer); + var var_tombstonePayload = sse_decode_opt_list_prim_u_8_strict( + deserializer, + ); + var var_kind = sse_decode_cloud_sync_raw_record_kind(deserializer); + return CloudSyncRawChange( + recordName: var_recordName, + recordType: var_recordType, + changeType: var_changeType, + systemFields: var_systemFields, + encryptedRecord: var_encryptedRecord, + tombstonePayload: var_tombstonePayload, + kind: var_kind, + ); + } + + @protected + CloudSyncRawFailure sse_decode_cloud_sync_raw_failure( + SseDeserializer deserializer, + ) { + // Codec=Sse (Serialization based), see doc to use other codecs + var var_category = sse_decode_cloud_sync_raw_failure_category(deserializer); + var var_retryAfterSeconds = sse_decode_opt_box_autoadd_u_64(deserializer); + var var_safeCode = sse_decode_String(deserializer); + return CloudSyncRawFailure( + category: var_category, + retryAfterSeconds: var_retryAfterSeconds, + safeCode: var_safeCode, + ); + } + + @protected + CloudSyncRawFailureCategory sse_decode_cloud_sync_raw_failure_category( + SseDeserializer deserializer, + ) { + // Codec=Sse (Serialization based), see doc to use other codecs + var inner = sse_decode_i_32(deserializer); + return CloudSyncRawFailureCategory.values[inner]; + } + + @protected + CloudSyncRawFetchResult sse_decode_cloud_sync_raw_fetch_result( + SseDeserializer deserializer, + ) { + // Codec=Sse (Serialization based), see doc to use other codecs + var var_page = sse_decode_opt_box_autoadd_cloud_sync_raw_page(deserializer); + var var_failure = sse_decode_opt_box_autoadd_cloud_sync_raw_failure( + deserializer, + ); + return CloudSyncRawFetchResult(page: var_page, failure: var_failure); + } + + @protected + CloudSyncRawPage sse_decode_cloud_sync_raw_page( + SseDeserializer deserializer, + ) { + // Codec=Sse (Serialization based), see doc to use other codecs + var var_changes = sse_decode_list_cloud_sync_raw_change(deserializer); + var var_nextToken = sse_decode_opt_list_prim_u_8_strict(deserializer); + var var_status = sse_decode_i_32(deserializer); + var var_complete = sse_decode_bool(deserializer); + return CloudSyncRawPage( + changes: var_changes, + nextToken: var_nextToken, + status: var_status, + complete: var_complete, + ); + } + + @protected + CloudSyncRawRecordKind sse_decode_cloud_sync_raw_record_kind( + SseDeserializer deserializer, + ) { + // Codec=Sse (Serialization based), see doc to use other codecs + var inner = sse_decode_i_32(deserializer); + return CloudSyncRawRecordKind.values[inner]; + } + + @protected + CloudSyncRawSystemFields sse_decode_cloud_sync_raw_system_fields( + SseDeserializer deserializer, + ) { + // Codec=Sse (Serialization based), see doc to use other codecs + var var_etag = sse_decode_opt_String(deserializer); + var var_createdAt = sse_decode_opt_box_autoadd_f_64(deserializer); + var var_modifiedAt = sse_decode_opt_box_autoadd_f_64(deserializer); + var var_permission = sse_decode_opt_box_autoadd_u_32(deserializer); + return CloudSyncRawSystemFields( + etag: var_etag, + createdAt: var_createdAt, + modifiedAt: var_modifiedAt, + permission: var_permission, + ); + } + + @protected + CloudSyncTransientAssociationKind + sse_decode_cloud_sync_transient_association_kind( + SseDeserializer deserializer, + ) { + // Codec=Sse (Serialization based), see doc to use other codecs + var inner = sse_decode_i_32(deserializer); + return CloudSyncTransientAssociationKind.values[inner]; + } + + @protected + CloudSyncTransientAttachmentPayload + sse_decode_cloud_sync_transient_attachment_payload( + SseDeserializer deserializer, + ) { + // Codec=Sse (Serialization based), see doc to use other codecs + var var_logicalEntityKeyHash = sse_decode_String(deserializer); + var var_canonicalGuid = sse_decode_String(deserializer); + var var_ownerLogicalKeyHash = sse_decode_opt_String(deserializer); + var var_ownerCanonicalGuid = sse_decode_opt_String(deserializer); + var var_ownerPart = sse_decode_opt_box_autoadd_u_32(deserializer); + var var_utiState = sse_decode_cloud_sync_transient_field_state( + deserializer, + ); + var var_uti = sse_decode_opt_String(deserializer); + var var_fileNameState = sse_decode_cloud_sync_transient_field_state( + deserializer, + ); + var var_fileName = sse_decode_opt_String(deserializer); + var var_mimeTypeState = sse_decode_cloud_sync_transient_field_state( + deserializer, + ); + var var_mimeType = sse_decode_opt_String(deserializer); + var var_totalBytesState = sse_decode_cloud_sync_transient_field_state( + deserializer, + ); + var var_totalBytes = sse_decode_opt_box_autoadd_u_64(deserializer); + var var_isOutgoingState = sse_decode_cloud_sync_transient_field_state( + deserializer, + ); + var var_isOutgoing = sse_decode_opt_box_autoadd_bool(deserializer); + var var_protectedLocalReferenceState = + sse_decode_cloud_sync_transient_field_state(deserializer); + var var_protectedLocalReference = sse_decode_opt_String(deserializer); + return CloudSyncTransientAttachmentPayload( + logicalEntityKeyHash: var_logicalEntityKeyHash, + canonicalGuid: var_canonicalGuid, + ownerLogicalKeyHash: var_ownerLogicalKeyHash, + ownerCanonicalGuid: var_ownerCanonicalGuid, + ownerPart: var_ownerPart, + utiState: var_utiState, + uti: var_uti, + fileNameState: var_fileNameState, + fileName: var_fileName, + mimeTypeState: var_mimeTypeState, + mimeType: var_mimeType, + totalBytesState: var_totalBytesState, + totalBytes: var_totalBytes, + isOutgoingState: var_isOutgoingState, + isOutgoing: var_isOutgoing, + protectedLocalReferenceState: var_protectedLocalReferenceState, + protectedLocalReference: var_protectedLocalReference, + ); + } + + @protected + CloudSyncTransientAttributedBody + sse_decode_cloud_sync_transient_attributed_body( + SseDeserializer deserializer, + ) { + // Codec=Sse (Serialization based), see doc to use other codecs + var var_text = sse_decode_String(deserializer); + var var_runs = sse_decode_list_cloud_sync_transient_text_run(deserializer); + return CloudSyncTransientAttributedBody(text: var_text, runs: var_runs); + } + + @protected + CloudSyncTransientChatPayload sse_decode_cloud_sync_transient_chat_payload( + SseDeserializer deserializer, + ) { + // Codec=Sse (Serialization based), see doc to use other codecs + var var_logicalEntityKeyHash = sse_decode_String(deserializer); + var var_canonicalGuid = sse_decode_String(deserializer); + var var_chatIdentifier = sse_decode_String(deserializer); + var var_groupId = sse_decode_String(deserializer); + var var_originalGroupId = sse_decode_String(deserializer); + var var_service = sse_decode_cloud_sync_transient_service(deserializer); + var var_style = sse_decode_cloud_sync_transient_chat_style(deserializer); + var var_participantHandles = sse_decode_list_String(deserializer); + var var_displayNameState = sse_decode_cloud_sync_transient_field_state( + deserializer, + ); + var var_displayName = sse_decode_opt_String(deserializer); + var var_lastAddressedHandleState = + sse_decode_cloud_sync_transient_field_state(deserializer); + var var_lastAddressedHandle = sse_decode_opt_String(deserializer); + var var_groupVersionState = sse_decode_cloud_sync_transient_field_state( + deserializer, + ); + var var_groupVersion = sse_decode_opt_box_autoadd_u_32(deserializer); + var var_lastSeenMessageGuidState = + sse_decode_cloud_sync_transient_field_state(deserializer); + var var_lastSeenMessageGuid = sse_decode_opt_String(deserializer); + var var_groupPhotoGuidState = sse_decode_cloud_sync_transient_field_state( + deserializer, + ); + var var_groupPhotoGuid = sse_decode_opt_String(deserializer); + return CloudSyncTransientChatPayload( + logicalEntityKeyHash: var_logicalEntityKeyHash, + canonicalGuid: var_canonicalGuid, + chatIdentifier: var_chatIdentifier, + groupId: var_groupId, + originalGroupId: var_originalGroupId, + service: var_service, + style: var_style, + participantHandles: var_participantHandles, + displayNameState: var_displayNameState, + displayName: var_displayName, + lastAddressedHandleState: var_lastAddressedHandleState, + lastAddressedHandle: var_lastAddressedHandle, + groupVersionState: var_groupVersionState, + groupVersion: var_groupVersion, + lastSeenMessageGuidState: var_lastSeenMessageGuidState, + lastSeenMessageGuid: var_lastSeenMessageGuid, + groupPhotoGuidState: var_groupPhotoGuidState, + groupPhotoGuid: var_groupPhotoGuid, + ); + } + + @protected + CloudSyncTransientChatStyle sse_decode_cloud_sync_transient_chat_style( + SseDeserializer deserializer, + ) { + // Codec=Sse (Serialization based), see doc to use other codecs + var inner = sse_decode_i_32(deserializer); + return CloudSyncTransientChatStyle.values[inner]; + } + + @protected + CloudSyncTransientDecodeResult sse_decode_cloud_sync_transient_decode_result( + SseDeserializer deserializer, + ) { + // Codec=Sse (Serialization based), see doc to use other codecs + var var_protectedSourceReference = sse_decode_opt_String(deserializer); + var var_generation = sse_decode_u_64(deserializer); + var var_changeId = sse_decode_opt_String(deserializer); + var var_entityKind = + sse_decode_opt_box_autoadd_cloud_sync_transient_entity_kind( + deserializer, + ); + var var_mutationKind = + sse_decode_opt_box_autoadd_cloud_sync_transient_mutation_kind( + deserializer, + ); + var var_snapshot = sse_decode_opt_box_autoadd_cloud_sync_transient_snapshot( + deserializer, + ); + var var_payload = sse_decode_opt_box_autoadd_cloud_sync_transient_payload( + deserializer, + ); + var var_tombstone = + sse_decode_opt_box_autoadd_cloud_sync_transient_tombstone(deserializer); + var var_deferredReason = + sse_decode_opt_box_autoadd_cloud_sync_transient_deferred_reason( + deserializer, + ); + var var_quarantineReason = + sse_decode_opt_box_autoadd_cloud_sync_transient_quarantine_reason( + deserializer, + ); + var var_failureCode = + sse_decode_opt_box_autoadd_cloud_sync_transient_failure_code( + deserializer, + ); + return CloudSyncTransientDecodeResult( + protectedSourceReference: var_protectedSourceReference, + generation: var_generation, + changeId: var_changeId, + entityKind: var_entityKind, + mutationKind: var_mutationKind, + snapshot: var_snapshot, + payload: var_payload, + tombstone: var_tombstone, + deferredReason: var_deferredReason, + quarantineReason: var_quarantineReason, + failureCode: var_failureCode, + ); + } + + @protected + CloudSyncTransientDeferredReason + sse_decode_cloud_sync_transient_deferred_reason( + SseDeserializer deserializer, + ) { + // Codec=Sse (Serialization based), see doc to use other codecs + var inner = sse_decode_i_32(deserializer); + return CloudSyncTransientDeferredReason.values[inner]; + } + + @protected + CloudSyncTransientEditPart sse_decode_cloud_sync_transient_edit_part( + SseDeserializer deserializer, + ) { + // Codec=Sse (Serialization based), see doc to use other codecs + var var_partKeyHash = sse_decode_String(deserializer); + var var_revision = sse_decode_u_32(deserializer); + var var_contentDigest = sse_decode_String(deserializer); + var var_modifiedAtMillis = sse_decode_i_64(deserializer); + return CloudSyncTransientEditPart( + partKeyHash: var_partKeyHash, + revision: var_revision, + contentDigest: var_contentDigest, + modifiedAtMillis: var_modifiedAtMillis, + ); + } + + @protected + CloudSyncTransientEntityKind sse_decode_cloud_sync_transient_entity_kind( + SseDeserializer deserializer, + ) { + // Codec=Sse (Serialization based), see doc to use other codecs + var inner = sse_decode_i_32(deserializer); + return CloudSyncTransientEntityKind.values[inner]; + } + + @protected + CloudSyncTransientFailureCode sse_decode_cloud_sync_transient_failure_code( + SseDeserializer deserializer, + ) { + // Codec=Sse (Serialization based), see doc to use other codecs + var inner = sse_decode_i_32(deserializer); + return CloudSyncTransientFailureCode.values[inner]; + } + + @protected + CloudSyncTransientFieldState sse_decode_cloud_sync_transient_field_state( + SseDeserializer deserializer, + ) { + // Codec=Sse (Serialization based), see doc to use other codecs + var inner = sse_decode_i_32(deserializer); + return CloudSyncTransientFieldState.values[inner]; + } + + @protected + CloudSyncTransientGroupPhotoPayload + sse_decode_cloud_sync_transient_group_photo_payload( + SseDeserializer deserializer, + ) { + // Codec=Sse (Serialization based), see doc to use other codecs + var var_logicalEntityKeyHash = sse_decode_String(deserializer); + var var_ownerLogicalKeyHash = sse_decode_String(deserializer); + var var_photoGuid = sse_decode_String(deserializer); + var var_protectedLocalReference = sse_decode_String(deserializer); + return CloudSyncTransientGroupPhotoPayload( + logicalEntityKeyHash: var_logicalEntityKeyHash, + ownerLogicalKeyHash: var_ownerLogicalKeyHash, + photoGuid: var_photoGuid, + protectedLocalReference: var_protectedLocalReference, + ); + } + + @protected + CloudSyncTransientKnownMessageFlags + sse_decode_cloud_sync_transient_known_message_flags( + SseDeserializer deserializer, + ) { + // Codec=Sse (Serialization based), see doc to use other codecs + var var_fromMe = sse_decode_bool(deserializer); + var var_delivered = sse_decode_bool(deserializer); + var var_read = sse_decode_bool(deserializer); + var var_hasDataDetectorResults = sse_decode_bool(deserializer); + var var_deliveredQuietly = sse_decode_bool(deserializer); + var var_didNotifyRecipient = sse_decode_bool(deserializer); + return CloudSyncTransientKnownMessageFlags( + fromMe: var_fromMe, + delivered: var_delivered, + read: var_read, + hasDataDetectorResults: var_hasDataDetectorResults, + deliveredQuietly: var_deliveredQuietly, + didNotifyRecipient: var_didNotifyRecipient, + ); + } + + @protected + CloudSyncTransientMessageEdit sse_decode_cloud_sync_transient_message_edit( + SseDeserializer deserializer, + ) { + // Codec=Sse (Serialization based), see doc to use other codecs + var var_part_ = sse_decode_u_32(deserializer); + var var_revision = sse_decode_u_32(deserializer); + var var_bodies = sse_decode_list_cloud_sync_transient_attributed_body( + deserializer, + ); + var var_modifiedAtMillis = sse_decode_i_64(deserializer); + var var_originalRangeLocation = sse_decode_opt_box_autoadd_u_32( + deserializer, + ); + var var_originalRangeLength = sse_decode_opt_box_autoadd_u_32(deserializer); + return CloudSyncTransientMessageEdit( + part_: var_part_, + revision: var_revision, + bodies: var_bodies, + modifiedAtMillis: var_modifiedAtMillis, + originalRangeLocation: var_originalRangeLocation, + originalRangeLength: var_originalRangeLength, + ); + } + + @protected + CloudSyncTransientMessagePayload + sse_decode_cloud_sync_transient_message_payload( + SseDeserializer deserializer, + ) { + // Codec=Sse (Serialization based), see doc to use other codecs + var var_logicalEntityKeyHash = sse_decode_String(deserializer); + var var_canonicalGuid = sse_decode_String(deserializer); + var var_chatAliasKeyHash = sse_decode_String(deserializer); + var var_chatIdentifier = sse_decode_String(deserializer); + var var_senderHandle = sse_decode_String(deserializer); + var var_createdAtMillis = sse_decode_i_64(deserializer); + var var_error = sse_decode_i_64(deserializer); + var var_service = sse_decode_cloud_sync_transient_service(deserializer); + var var_subjectState = sse_decode_cloud_sync_transient_field_state( + deserializer, + ); + var var_subject = sse_decode_opt_String(deserializer); + var var_bodyState = sse_decode_cloud_sync_transient_field_state( + deserializer, + ); + var var_body = sse_decode_opt_String(deserializer); + var var_attributedBodiesState = sse_decode_cloud_sync_transient_field_state( + deserializer, + ); + var var_attributedBodies = + sse_decode_list_cloud_sync_transient_attributed_body(deserializer); + var var_balloonBundleIdState = sse_decode_cloud_sync_transient_field_state( + deserializer, + ); + var var_balloonBundleId = sse_decode_opt_String(deserializer); + var var_effectState = sse_decode_cloud_sync_transient_field_state( + deserializer, + ); + var var_effect = sse_decode_opt_String(deserializer); + var var_readAtMillisState = sse_decode_cloud_sync_transient_field_state( + deserializer, + ); + var var_readAtMillis = sse_decode_opt_box_autoadd_i_64(deserializer); + var var_deliveredAtMillisState = + sse_decode_cloud_sync_transient_field_state(deserializer); + var var_deliveredAtMillis = sse_decode_opt_box_autoadd_i_64(deserializer); + var var_knownFlags = sse_decode_cloud_sync_transient_known_message_flags( + deserializer, + ); + var var_associationKind = sse_decode_cloud_sync_transient_association_kind( + deserializer, + ); + var var_reactionKind = + sse_decode_opt_box_autoadd_cloud_sync_transient_reaction_kind( + deserializer, + ); + var var_reactionRemoved = sse_decode_bool(deserializer); + var var_reactionParentLogicalKeyHash = sse_decode_opt_String(deserializer); + var var_reactionParentCanonicalGuid = sse_decode_opt_String(deserializer); + var var_reactionParentPart = sse_decode_opt_box_autoadd_u_32(deserializer); + var var_associatedRangeLocation = sse_decode_opt_box_autoadd_u_32( + deserializer, + ); + var var_associatedRangeLength = sse_decode_opt_box_autoadd_u_32( + deserializer, + ); + var var_replyParentLogicalKeyHash = sse_decode_opt_String(deserializer); + var var_replyParentCanonicalGuid = sse_decode_opt_String(deserializer); + var var_replyParentPart = sse_decode_opt_String(deserializer); + var var_editsState = sse_decode_cloud_sync_transient_field_state( + deserializer, + ); + var var_edits = sse_decode_list_cloud_sync_transient_message_edit( + deserializer, + ); + var var_retractedPartsState = sse_decode_cloud_sync_transient_field_state( + deserializer, + ); + var var_retractedParts = sse_decode_list_prim_u_32_strict(deserializer); + var var_associatedEmojiState = sse_decode_cloud_sync_transient_field_state( + deserializer, + ); + var var_associatedEmoji = sse_decode_opt_String(deserializer); + return CloudSyncTransientMessagePayload( + logicalEntityKeyHash: var_logicalEntityKeyHash, + canonicalGuid: var_canonicalGuid, + chatAliasKeyHash: var_chatAliasKeyHash, + chatIdentifier: var_chatIdentifier, + senderHandle: var_senderHandle, + createdAtMillis: var_createdAtMillis, + error: var_error, + service: var_service, + subjectState: var_subjectState, + subject: var_subject, + bodyState: var_bodyState, + body: var_body, + attributedBodiesState: var_attributedBodiesState, + attributedBodies: var_attributedBodies, + balloonBundleIdState: var_balloonBundleIdState, + balloonBundleId: var_balloonBundleId, + effectState: var_effectState, + effect: var_effect, + readAtMillisState: var_readAtMillisState, + readAtMillis: var_readAtMillis, + deliveredAtMillisState: var_deliveredAtMillisState, + deliveredAtMillis: var_deliveredAtMillis, + knownFlags: var_knownFlags, + associationKind: var_associationKind, + reactionKind: var_reactionKind, + reactionRemoved: var_reactionRemoved, + reactionParentLogicalKeyHash: var_reactionParentLogicalKeyHash, + reactionParentCanonicalGuid: var_reactionParentCanonicalGuid, + reactionParentPart: var_reactionParentPart, + associatedRangeLocation: var_associatedRangeLocation, + associatedRangeLength: var_associatedRangeLength, + replyParentLogicalKeyHash: var_replyParentLogicalKeyHash, + replyParentCanonicalGuid: var_replyParentCanonicalGuid, + replyParentPart: var_replyParentPart, + editsState: var_editsState, + edits: var_edits, + retractedPartsState: var_retractedPartsState, + retractedParts: var_retractedParts, + associatedEmojiState: var_associatedEmojiState, + associatedEmoji: var_associatedEmoji, + ); + } + + @protected + CloudSyncTransientMutationKind sse_decode_cloud_sync_transient_mutation_kind( + SseDeserializer deserializer, + ) { + // Codec=Sse (Serialization based), see doc to use other codecs + var inner = sse_decode_i_32(deserializer); + return CloudSyncTransientMutationKind.values[inner]; + } + + @protected + CloudSyncTransientPayload sse_decode_cloud_sync_transient_payload( + SseDeserializer deserializer, + ) { + // Codec=Sse (Serialization based), see doc to use other codecs + var var_chat = sse_decode_opt_box_autoadd_cloud_sync_transient_chat_payload( + deserializer, + ); + var var_message = + sse_decode_opt_box_autoadd_cloud_sync_transient_message_payload( + deserializer, + ); + var var_attachment = + sse_decode_opt_box_autoadd_cloud_sync_transient_attachment_payload( + deserializer, + ); + var var_groupPhoto = + sse_decode_opt_box_autoadd_cloud_sync_transient_group_photo_payload( + deserializer, + ); + return CloudSyncTransientPayload( + chat: var_chat, + message: var_message, + attachment: var_attachment, + groupPhoto: var_groupPhoto, + ); + } + + @protected + CloudSyncTransientQuarantineReason + sse_decode_cloud_sync_transient_quarantine_reason( + SseDeserializer deserializer, + ) { + // Codec=Sse (Serialization based), see doc to use other codecs + var inner = sse_decode_i_32(deserializer); + return CloudSyncTransientQuarantineReason.values[inner]; + } + + @protected + CloudSyncTransientReactionKind sse_decode_cloud_sync_transient_reaction_kind( + SseDeserializer deserializer, + ) { + // Codec=Sse (Serialization based), see doc to use other codecs + var inner = sse_decode_i_32(deserializer); + return CloudSyncTransientReactionKind.values[inner]; + } + + @protected + CloudSyncTransientService sse_decode_cloud_sync_transient_service( + SseDeserializer deserializer, + ) { + // Codec=Sse (Serialization based), see doc to use other codecs + var inner = sse_decode_i_32(deserializer); + return CloudSyncTransientService.values[inner]; + } + + @protected + CloudSyncTransientSnapshot sse_decode_cloud_sync_transient_snapshot( + SseDeserializer deserializer, + ) { + // Codec=Sse (Serialization based), see doc to use other codecs + var var_entityKind = sse_decode_cloud_sync_transient_entity_kind( + deserializer, + ); + var var_logicalEntityKeyHash = sse_decode_String(deserializer); + var var_parentLogicalKeyHash = sse_decode_opt_String(deserializer); + var var_immutableContentDigest = sse_decode_opt_String(deserializer); + var var_createdAtMillis = sse_decode_opt_box_autoadd_i_64(deserializer); + var var_readAtMillis = sse_decode_opt_box_autoadd_i_64(deserializer); + var var_deliveredAtMillis = sse_decode_opt_box_autoadd_i_64(deserializer); + var var_editParts = sse_decode_list_cloud_sync_transient_edit_part( + deserializer, + ); + var var_retractedAtMillis = sse_decode_opt_box_autoadd_i_64(deserializer); + var var_groupVersion = sse_decode_opt_box_autoadd_u_32(deserializer); + var var_groupMetadataDigest = sse_decode_opt_String(deserializer); + var var_etagHash = sse_decode_opt_String(deserializer); + var var_protectedSourceReference = sse_decode_String(deserializer); + return CloudSyncTransientSnapshot( + entityKind: var_entityKind, + logicalEntityKeyHash: var_logicalEntityKeyHash, + parentLogicalKeyHash: var_parentLogicalKeyHash, + immutableContentDigest: var_immutableContentDigest, + createdAtMillis: var_createdAtMillis, + readAtMillis: var_readAtMillis, + deliveredAtMillis: var_deliveredAtMillis, + editParts: var_editParts, + retractedAtMillis: var_retractedAtMillis, + groupVersion: var_groupVersion, + groupMetadataDigest: var_groupMetadataDigest, + etagHash: var_etagHash, + protectedSourceReference: var_protectedSourceReference, + ); + } + + @protected + CloudSyncTransientTextRun sse_decode_cloud_sync_transient_text_run( + SseDeserializer deserializer, + ) { + // Codec=Sse (Serialization based), see doc to use other codecs + var var_startUtf16 = sse_decode_u_32(deserializer); + var var_lengthUtf16 = sse_decode_u_32(deserializer); + var var_messagePart = sse_decode_opt_box_autoadd_u_32(deserializer); + var var_attachmentCanonicalGuid = sse_decode_opt_String(deserializer); + var var_attachmentLogicalKeyHash = sse_decode_opt_String(deserializer); + var var_mentionHandle = sse_decode_opt_String(deserializer); + var var_audioTranscript = sse_decode_opt_String(deserializer); + var var_textEffect = sse_decode_opt_box_autoadd_i_64(deserializer); + var var_bold = sse_decode_opt_box_autoadd_bool(deserializer); + var var_italic = sse_decode_opt_box_autoadd_bool(deserializer); + var var_strikethrough = sse_decode_opt_box_autoadd_bool(deserializer); + var var_underline = sse_decode_opt_box_autoadd_bool(deserializer); + return CloudSyncTransientTextRun( + startUtf16: var_startUtf16, + lengthUtf16: var_lengthUtf16, + messagePart: var_messagePart, + attachmentCanonicalGuid: var_attachmentCanonicalGuid, + attachmentLogicalKeyHash: var_attachmentLogicalKeyHash, + mentionHandle: var_mentionHandle, + audioTranscript: var_audioTranscript, + textEffect: var_textEffect, + bold: var_bold, + italic: var_italic, + strikethrough: var_strikethrough, + underline: var_underline, + ); + } + + @protected + CloudSyncTransientTombstone sse_decode_cloud_sync_transient_tombstone( + SseDeserializer deserializer, + ) { + // Codec=Sse (Serialization based), see doc to use other codecs + var var_entityKind = sse_decode_cloud_sync_transient_entity_kind( + deserializer, + ); + var var_logicalEntityKeyHash = sse_decode_String(deserializer); + var var_deletedAtMillis = sse_decode_opt_box_autoadd_i_64(deserializer); + var var_serverConfirmed = sse_decode_bool(deserializer); + return CloudSyncTransientTombstone( + entityKind: var_entityKind, + logicalEntityKeyHash: var_logicalEntityKeyHash, + deletedAtMillis: var_deletedAtMillis, + serverConfirmed: var_serverConfirmed, + ); + } + + @protected + ConversationData sse_decode_conversation_data(SseDeserializer deserializer) { + // Codec=Sse (Serialization based), see doc to use other codecs + var var_participants = sse_decode_list_String(deserializer); + var var_cvName = sse_decode_opt_String(deserializer); + var var_senderGuid = sse_decode_opt_String(deserializer); + var var_afterGuid = sse_decode_opt_String(deserializer); + return ConversationData( + participants: var_participants, + cvName: var_cvName, + senderGuid: var_senderGuid, + afterGuid: var_afterGuid, + ); + } + + @protected + DartBeacon sse_decode_dart_beacon(SseDeserializer deserializer) { + // Codec=Sse (Serialization based), see doc to use other codecs + var var_naming = sse_decode_beacon_naming_record(deserializer); + var var_lastReport = + sse_decode_opt_box_autoadd_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerLocationReport( + deserializer, + ); + var var_productId = sse_decode_CastedPrimitive_i_64(deserializer); + var var_batteryLevel = sse_decode_opt_CastedPrimitive_i_64(deserializer); + var var_vendorId = sse_decode_CastedPrimitive_i_64(deserializer); + var var_model = sse_decode_String(deserializer); + var var_systemVersion = sse_decode_String(deserializer); + var var_id = sse_decode_String(deserializer); + var var_shared = sse_decode_opt_box_autoadd_dart_beacon_share_info( + deserializer, + ); + return DartBeacon( + naming: var_naming, + lastReport: var_lastReport, + productId: var_productId, + batteryLevel: var_batteryLevel, + vendorId: var_vendorId, + model: var_model, + systemVersion: var_systemVersion, + id: var_id, + shared: var_shared, + ); + } + + @protected + DartBeaconShareInfo sse_decode_dart_beacon_share_info( + SseDeserializer deserializer, + ) { + // Codec=Sse (Serialization based), see doc to use other codecs + var var_shareId = sse_decode_String(deserializer); + var var_acceptanceState = sse_decode_CastedPrimitive_i_64(deserializer); + var var_ownerHandle = sse_decode_String(deserializer); + return DartBeaconShareInfo( + shareId: var_shareId, + acceptanceState: var_acceptanceState, + ownerHandle: var_ownerHandle, + ); + } + + @protected + DeleteTarget sse_decode_delete_target(SseDeserializer deserializer) { + // Codec=Sse (Serialization based), see doc to use other codecs + + var tag_ = sse_decode_i_32(deserializer); + switch (tag_) { + case 0: + var var_field0 = sse_decode_box_autoadd_operated_chat(deserializer); + return DeleteTarget_Chat(var_field0); + case 1: + var var_field0 = sse_decode_list_String(deserializer); + return DeleteTarget_Messages(var_field0); + default: + throw UnimplementedError(''); + } + } + + @protected + DeviceInfo sse_decode_device_info(SseDeserializer deserializer) { + // Codec=Sse (Serialization based), see doc to use other codecs + var var_name = sse_decode_String(deserializer); + var var_serial = sse_decode_String(deserializer); + var var_osVersion = sse_decode_String(deserializer); + var var_encodedData = sse_decode_opt_list_prim_u_8_strict(deserializer); + return DeviceInfo( + name: var_name, + serial: var_serial, + osVersion: var_osVersion, + encodedData: var_encodedData, + ); + } + + @protected + EditMessage sse_decode_edit_message(SseDeserializer deserializer) { + // Codec=Sse (Serialization based), see doc to use other codecs + var var_tuuid = sse_decode_String(deserializer); + var var_editPart = sse_decode_CastedPrimitive_u_64(deserializer); + var var_newParts = sse_decode_message_parts(deserializer); + return EditMessage( + tuuid: var_tuuid, + editPart: var_editPart, + newParts: var_newParts, + ); + } + + @protected + ErrorMessage sse_decode_error_message(SseDeserializer deserializer) { + // Codec=Sse (Serialization based), see doc to use other codecs + var var_forUuid = sse_decode_String(deserializer); + var var_status = sse_decode_u_64(deserializer); + var var_statusStr = sse_decode_String(deserializer); + return ErrorMessage( + forUuid: var_forUuid, + status: var_status, + statusStr: var_statusStr, + ); + } + + @protected + ExtensionApp sse_decode_extension_app(SseDeserializer deserializer) { + // Codec=Sse (Serialization based), see doc to use other codecs + var var_name = sse_decode_String(deserializer); + var var_appId = sse_decode_opt_CastedPrimitive_u_64(deserializer); + var var_bundleId = sse_decode_String(deserializer); + var var_balloon = sse_decode_opt_box_autoadd_balloon(deserializer); + return ExtensionApp( + name: var_name, + appId: var_appId, + bundleId: var_bundleId, + balloon: var_balloon, + ); + } + + @protected + double sse_decode_f_32(SseDeserializer deserializer) { + // Codec=Sse (Serialization based), see doc to use other codecs + return deserializer.buffer.getFloat32(); + } + + @protected + double sse_decode_f_64(SseDeserializer deserializer) { + // Codec=Sse (Serialization based), see doc to use other codecs + return deserializer.buffer.getFloat64(); + } + + @protected + FFIFilePackager sse_decode_ffi_file_packager(SseDeserializer deserializer) { + // Codec=Sse (Serialization based), see doc to use other codecs + return FFIFilePackager(); + } + + @protected + Follow sse_decode_follow(SseDeserializer deserializer) { + // Codec=Sse (Serialization based), see doc to use other codecs + var var_createTimestamp = sse_decode_i_64(deserializer); + var var_expires = sse_decode_i_64(deserializer); + var var_id = sse_decode_String(deserializer); + var var_invitationAcceptedHandles = sse_decode_list_String(deserializer); + var var_invitationFromHandles = sse_decode_list_String(deserializer); + var var_isFromMessages = sse_decode_bool(deserializer); + var var_offerId = sse_decode_opt_String(deserializer); + var var_onlyInEvent = sse_decode_bool(deserializer); + var var_personIdHash = sse_decode_String(deserializer); + var var_secureLocationsCapable = sse_decode_bool(deserializer); + var var_shallowOrLiveSecureLocationsCapable = sse_decode_bool(deserializer); + var var_source = sse_decode_String(deserializer); + var var_tkPermission = sse_decode_bool(deserializer); + var var_updateTimestamp = sse_decode_i_64(deserializer); + var var_fallbackToLegacyAllowed = sse_decode_opt_box_autoadd_bool( + deserializer, + ); + var var_optedNotToShare = sse_decode_opt_box_autoadd_bool(deserializer); + var var_lastLocation = sse_decode_opt_box_autoadd_location(deserializer); + var var_locateInProgress = sse_decode_bool(deserializer); + return Follow( + createTimestamp: var_createTimestamp, + expires: var_expires, + id: var_id, + invitationAcceptedHandles: var_invitationAcceptedHandles, + invitationFromHandles: var_invitationFromHandles, + isFromMessages: var_isFromMessages, + offerId: var_offerId, + onlyInEvent: var_onlyInEvent, + personIdHash: var_personIdHash, + secureLocationsCapable: var_secureLocationsCapable, + shallowOrLiveSecureLocationsCapable: + var_shallowOrLiveSecureLocationsCapable, + source: var_source, + tkPermission: var_tkPermission, + updateTimestamp: var_updateTimestamp, + fallbackToLegacyAllowed: var_fallbackToLegacyAllowed, + optedNotToShare: var_optedNotToShare, + lastLocation: var_lastLocation, + locateInProgress: var_locateInProgress, + ); + } + + @protected + FoundDevice sse_decode_found_device(SseDeserializer deserializer) { + // Codec=Sse (Serialization based), see doc to use other codecs + var var_deviceModel = sse_decode_opt_String(deserializer); + var var_lowPowerMode = sse_decode_opt_box_autoadd_bool(deserializer); + var var_passcodeLength = sse_decode_opt_box_autoadd_i_64(deserializer); + var var_id = sse_decode_opt_String(deserializer); + var var_batteryStatus = sse_decode_opt_String(deserializer); + var var_lostModeCapable = sse_decode_opt_box_autoadd_bool(deserializer); + var var_batteryLevel = sse_decode_opt_box_autoadd_f_64(deserializer); + var var_locationEnabled = sse_decode_opt_box_autoadd_bool(deserializer); + var var_isConsideredAccessory = sse_decode_opt_box_autoadd_bool( + deserializer, + ); + var var_location = sse_decode_opt_box_autoadd_location(deserializer); + var var_modelDisplayName = sse_decode_opt_String(deserializer); + var var_deviceColor = sse_decode_opt_String(deserializer); + var var_activationLocked = sse_decode_opt_box_autoadd_bool(deserializer); + var var_rm2State = sse_decode_opt_box_autoadd_i_64(deserializer); + var var_locFoundEnabled = sse_decode_opt_box_autoadd_bool(deserializer); + var var_nwd = sse_decode_opt_box_autoadd_bool(deserializer); + var var_deviceStatus = sse_decode_opt_String(deserializer); + var var_fmlyShare = sse_decode_opt_box_autoadd_bool(deserializer); + var var_features = sse_decode_Map_String_bool(deserializer); + var var_thisDevice = sse_decode_opt_box_autoadd_bool(deserializer); + var var_lostModeEnabled = sse_decode_opt_box_autoadd_bool(deserializer); + var var_deviceDisplayName = sse_decode_opt_String(deserializer); + var var_name = sse_decode_opt_String(deserializer); + var var_canWipeAfterLock = sse_decode_opt_box_autoadd_bool(deserializer); + var var_isMac = sse_decode_opt_box_autoadd_bool(deserializer); + var var_rawDeviceModel = sse_decode_opt_String(deserializer); + var var_baUuid = sse_decode_opt_String(deserializer); + var var_deviceDiscoveryId = sse_decode_opt_String(deserializer); + var var_scd = sse_decode_opt_box_autoadd_bool(deserializer); + var var_locationCapable = sse_decode_opt_box_autoadd_bool(deserializer); + var var_wipeInProgress = sse_decode_opt_box_autoadd_bool(deserializer); + var var_darkWake = sse_decode_opt_box_autoadd_bool(deserializer); + var var_deviceWithYou = sse_decode_opt_box_autoadd_bool(deserializer); + var var_maxMsgChar = sse_decode_opt_box_autoadd_i_64(deserializer); + var var_deviceClass = sse_decode_opt_String(deserializer); + return FoundDevice( + deviceModel: var_deviceModel, + lowPowerMode: var_lowPowerMode, + passcodeLength: var_passcodeLength, + id: var_id, + batteryStatus: var_batteryStatus, + lostModeCapable: var_lostModeCapable, + batteryLevel: var_batteryLevel, + locationEnabled: var_locationEnabled, + isConsideredAccessory: var_isConsideredAccessory, + location: var_location, + modelDisplayName: var_modelDisplayName, + deviceColor: var_deviceColor, + activationLocked: var_activationLocked, + rm2State: var_rm2State, + locFoundEnabled: var_locFoundEnabled, + nwd: var_nwd, + deviceStatus: var_deviceStatus, + fmlyShare: var_fmlyShare, + features: var_features, + thisDevice: var_thisDevice, + lostModeEnabled: var_lostModeEnabled, + deviceDisplayName: var_deviceDisplayName, + name: var_name, + canWipeAfterLock: var_canWipeAfterLock, + isMac: var_isMac, + rawDeviceModel: var_rawDeviceModel, + baUuid: var_baUuid, + deviceDiscoveryId: var_deviceDiscoveryId, + scd: var_scd, + locationCapable: var_locationCapable, + wipeInProgress: var_wipeInProgress, + darkWake: var_darkWake, + deviceWithYou: var_deviceWithYou, + maxMsgChar: var_maxMsgChar, + deviceClass: var_deviceClass, + ); + } + + @protected + FTMember sse_decode_ft_member(SseDeserializer deserializer) { + // Codec=Sse (Serialization based), see doc to use other codecs + var var_nickname = sse_decode_opt_String(deserializer); + var var_handle = sse_decode_String(deserializer); + return FTMember(nickname: var_nickname, handle: var_handle); + } + + @protected + FTMessage sse_decode_ft_message(SseDeserializer deserializer) { + // Codec=Sse (Serialization based), see doc to use other codecs + + var tag_ = sse_decode_i_32(deserializer); + switch (tag_) { + case 0: + var var_field0 = sse_decode_box_autoadd_let_me_in_request(deserializer); + return FTMessage_LetMeInRequest(var_field0); + case 1: + var var_guid = sse_decode_String(deserializer); + return FTMessage_LinkChanged(guid: var_guid); + case 2: + var var_guid = sse_decode_String(deserializer); + var var_participant = sse_decode_u_64(deserializer); + var var_handle = sse_decode_String(deserializer); + var var_ring = sse_decode_bool(deserializer); + return FTMessage_JoinEvent( + guid: var_guid, + participant: var_participant, + handle: var_handle, + ring: var_ring, + ); + case 3: + var var_guid = sse_decode_String(deserializer); + var var_members = sse_decode_Set_ft_member(deserializer); + var var_ring = sse_decode_bool(deserializer); + return FTMessage_AddMembers( + guid: var_guid, + members: var_members, + ring: var_ring, + ); + case 4: + var var_guid = sse_decode_String(deserializer); + var var_members = sse_decode_Set_ft_member(deserializer); + return FTMessage_RemoveMembers(guid: var_guid, members: var_members); + case 5: + var var_guid = sse_decode_String(deserializer); + var var_participant = sse_decode_u_64(deserializer); + var var_handle = sse_decode_String(deserializer); + return FTMessage_LeaveEvent( + guid: var_guid, + participant: var_participant, + handle: var_handle, + ); + case 6: + var var_guid = sse_decode_String(deserializer); + return FTMessage_Ring(guid: var_guid); + case 7: + var var_guid = sse_decode_String(deserializer); + return FTMessage_Decline(guid: var_guid); + case 8: + var var_guid = sse_decode_String(deserializer); + return FTMessage_RespondedElsewhere(guid: var_guid); + default: + throw UnimplementedError(''); + } + } + + @protected + FTMode sse_decode_ft_mode(SseDeserializer deserializer) { + // Codec=Sse (Serialization based), see doc to use other codecs + var inner = sse_decode_i_32(deserializer); + return FTMode.values[inner]; + } + + @protected + FTParticipant sse_decode_ft_participant(SseDeserializer deserializer) { + // Codec=Sse (Serialization based), see doc to use other codecs + var var_token = sse_decode_opt_String(deserializer); + var var_handle = sse_decode_String(deserializer); + var var_participantId = sse_decode_CastedPrimitive_u_64(deserializer); + var var_lastJoinDate = sse_decode_opt_CastedPrimitive_u_64(deserializer); + var var_active = + sse_decode_opt_box_autoadd_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerConversationParticipant( + deserializer, + ); + return FTParticipant( + token: var_token, + handle: var_handle, + participantId: var_participantId, + lastJoinDate: var_lastJoinDate, + active: var_active, + ); + } + + @protected + FTSession sse_decode_ft_session(SseDeserializer deserializer) { + // Codec=Sse (Serialization based), see doc to use other codecs + var var_groupId = sse_decode_String(deserializer); + var var_myHandles = sse_decode_list_String(deserializer); + var var_participants = sse_decode_Map_String_ft_participant(deserializer); + var var_link = + sse_decode_opt_box_autoadd_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerConversationLink( + deserializer, + ); + var var_members = sse_decode_Set_ft_member(deserializer); + var var_reportId = sse_decode_String(deserializer); + var var_startTime = sse_decode_opt_CastedPrimitive_u_64(deserializer); + var var_lastRekey = sse_decode_opt_CastedPrimitive_u_64(deserializer); + var var_isPropped = sse_decode_bool(deserializer); + var var_isRingingInaccurate = sse_decode_bool(deserializer); + var var_mode = sse_decode_opt_box_autoadd_ft_mode(deserializer); + var var_recentMemberAdds = sse_decode_Map_String_CastedPrimitive_u_64( + deserializer, + ); + return FTSession( + groupId: var_groupId, + myHandles: var_myHandles, + participants: var_participants, + link: var_link, + members: var_members, + reportId: var_reportId, + startTime: var_startTime, + lastRekey: var_lastRekey, + isPropped: var_isPropped, + isRingingInaccurate: var_isRingingInaccurate, + mode: var_mode, + recentMemberAdds: var_recentMemberAdds, + ); + } + + @protected + GroupSummary sse_decode_group_summary(SseDeserializer deserializer) { + // Codec=Sse (Serialization based), see doc to use other codecs + var var_displayName = sse_decode_String(deserializer); + var var_isOwner = sse_decode_bool(deserializer); + var var_members = sse_decode_list_group_summary_member(deserializer); + return GroupSummary( + displayName: var_displayName, + isOwner: var_isOwner, + members: var_members, + ); + } + + @protected + GroupSummaryMember sse_decode_group_summary_member( + SseDeserializer deserializer, + ) { + // Codec=Sse (Serialization based), see doc to use other codecs + var var_name = sse_decode_opt_String(deserializer); + var var_handle = sse_decode_String(deserializer); + var var_userId = sse_decode_opt_String(deserializer); + var var_isJoined = sse_decode_bool(deserializer); + return GroupSummaryMember( + name: var_name, + handle: var_handle, + userId: var_userId, + isJoined: var_isJoined, + ); + } + + @protected + HwExtra sse_decode_hw_extra(SseDeserializer deserializer) { + // Codec=Sse (Serialization based), see doc to use other codecs + var var_version = sse_decode_String(deserializer); + var var_protocolVersion = sse_decode_u_32(deserializer); + var var_deviceId = sse_decode_String(deserializer); + var var_icloudUa = sse_decode_String(deserializer); + var var_aoskitVersion = sse_decode_String(deserializer); + return HwExtra( + version: var_version, + protocolVersion: var_protocolVersion, + deviceId: var_deviceId, + icloudUa: var_icloudUa, + aoskitVersion: var_aoskitVersion, + ); + } + + @protected + int sse_decode_i_32(SseDeserializer deserializer) { + // Codec=Sse (Serialization based), see doc to use other codecs + return deserializer.buffer.getInt32(); + } + + @protected + PlatformInt64 sse_decode_i_64(SseDeserializer deserializer) { + // Codec=Sse (Serialization based), see doc to use other codecs + return deserializer.buffer.getPlatformInt64(); + } + + @protected + IMessageNameRecord sse_decode_i_message_name_record( + SseDeserializer deserializer, + ) { + // Codec=Sse (Serialization based), see doc to use other codecs + var var_name = sse_decode_String(deserializer); + var var_first = sse_decode_String(deserializer); + var var_last = sse_decode_String(deserializer); + return IMessageNameRecord(name: var_name, first: var_first, last: var_last); + } + + @protected + IMessageNicknameRecord sse_decode_i_message_nickname_record( + SseDeserializer deserializer, + ) { + // Codec=Sse (Serialization based), see doc to use other codecs + var var_name = sse_decode_i_message_name_record(deserializer); + var var_image = sse_decode_opt_list_prim_u_8_strict(deserializer); + var var_poster = sse_decode_opt_box_autoadd_i_message_poster_record( + deserializer, + ); + return IMessageNicknameRecord( + name: var_name, + image: var_image, + poster: var_poster, + ); + } + + @protected + IMessagePosterRecord sse_decode_i_message_poster_record( + SseDeserializer deserializer, + ) { + // Codec=Sse (Serialization based), see doc to use other codecs + var var_lowResPoster = sse_decode_list_prim_u_8_strict(deserializer); + var var_package = sse_decode_list_prim_u_8_strict(deserializer); + var var_meta = sse_decode_list_prim_u_8_strict(deserializer); + return IMessagePosterRecord( + lowResPoster: var_lowResPoster, + package: var_package, + meta: var_meta, + ); + } + + @protected + IconChangeMessage sse_decode_icon_change_message( + SseDeserializer deserializer, + ) { + // Codec=Sse (Serialization based), see doc to use other codecs + var var_file = sse_decode_opt_box_autoadd_mmcs_file(deserializer); + var var_groupVersion = sse_decode_CastedPrimitive_u_64(deserializer); + return IconChangeMessage(file: var_file, groupVersion: var_groupVersion); + } + + @protected + IdmsCircleMessage sse_decode_idms_circle_message( + SseDeserializer deserializer, + ) { + // Codec=Sse (Serialization based), see doc to use other codecs + var var_step = sse_decode_u_32(deserializer); + var var_atxnid = sse_decode_String(deserializer); + var var_pake = sse_decode_opt_String(deserializer); + var var_ec = sse_decode_opt_box_autoadd_i_32(deserializer); + var var_idmsdata = sse_decode_String(deserializer); + return IdmsCircleMessage( + step: var_step, + atxnid: var_atxnid, + pake: var_pake, + ec: var_ec, + idmsdata: var_idmsdata, + ); + } + + @protected + IdmsMessage sse_decode_idms_message(SseDeserializer deserializer) { + // Codec=Sse (Serialization based), see doc to use other codecs + + var tag_ = sse_decode_i_32(deserializer); + switch (tag_) { + case 0: + var var_field0 = sse_decode_box_autoadd_idms_requested_sign_in( + deserializer, + ); + return IdmsMessage_RequestedSignIn(var_field0); + case 1: + var var_field0 = sse_decode_box_autoadd_teardown_sign_in(deserializer); + return IdmsMessage_TeardownSignIn(var_field0); + case 2: + var var_field0 = sse_decode_box_autoadd_idms_circle_message( + deserializer, + ); + var var_field1 = sse_decode_opt_box_autoadd_idms_requested_sign_in( + deserializer, + ); + return IdmsMessage_CircleRequest(var_field0, var_field1); + default: + throw UnimplementedError(''); + } + } + + @protected + IdmsRequestedSignIn sse_decode_idms_requested_sign_in( + SseDeserializer deserializer, + ) { + // Codec=Sse (Serialization based), see doc to use other codecs + var var_aps = sse_decode_aps_data(deserializer); + var var_txnid = sse_decode_String(deserializer); + var var_akdata = sse_decode_ak_data(deserializer); + var var_adsid = sse_decode_String(deserializer); + return IdmsRequestedSignIn( + aps: var_aps, + txnid: var_txnid, + akdata: var_akdata, + adsid: var_adsid, + ); + } + + @protected + IndexedMessagePart sse_decode_indexed_message_part( + SseDeserializer deserializer, + ) { + // Codec=Sse (Serialization based), see doc to use other codecs + var var_part_ = sse_decode_message_part(deserializer); + var var_idx = sse_decode_opt_CastedPrimitive_usize(deserializer); + var var_ext = sse_decode_opt_box_autoadd_part_extension(deserializer); + return IndexedMessagePart(part_: var_part_, idx: var_idx, ext: var_ext); + } + + @protected + LetMeInRequest sse_decode_let_me_in_request(SseDeserializer deserializer) { + // Codec=Sse (Serialization based), see doc to use other codecs + var var_sharedSecret = sse_decode_list_prim_u_8_strict(deserializer); + var var_pseud = sse_decode_String(deserializer); + var var_requestor = sse_decode_String(deserializer); + var var_nickname = sse_decode_opt_String(deserializer); + var var_token = sse_decode_list_prim_u_8_strict(deserializer); + var var_delegationUuid = sse_decode_opt_String(deserializer); + var var_usage = sse_decode_opt_String(deserializer); + return LetMeInRequest( + sharedSecret: var_sharedSecret, + pseud: var_pseud, + requestor: var_requestor, + nickname: var_nickname, + token: var_token, + delegationUuid: var_delegationUuid, + usage: var_usage, + ); + } + + @protected + LinkMeta sse_decode_link_meta(SseDeserializer deserializer) { + // Codec=Sse (Serialization based), see doc to use other codecs + var var_data = sse_decode_lp_link_metadata(deserializer); + var var_attachments = sse_decode_list_list_prim_u_8_strict(deserializer); + return LinkMeta(data: var_data, attachments: var_attachments); + } + + @protected + List + sse_decode_list_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerIDSUser( + SseDeserializer deserializer, + ) { + // Codec=Sse (Serialization based), see doc to use other codecs + + var len_ = sse_decode_i_32(deserializer); + var ans_ = []; + for (var idx_ = 0; idx_ < len_; ++idx_) { + ans_.add( + sse_decode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerIDSUser( + deserializer, + ), + ); + } + return ans_; + } + + @protected + List + sse_decode_list_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerStCollapsedValue( + SseDeserializer deserializer, + ) { + // Codec=Sse (Serialization based), see doc to use other codecs + + var len_ = sse_decode_i_32(deserializer); + var ans_ = []; + for (var idx_ = 0; idx_ < len_; ++idx_) { + ans_.add( + sse_decode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerStCollapsedValue( + deserializer, + ), + ); + } + return ans_; + } + + @protected + List + sse_decode_list_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerViableBottle( + SseDeserializer deserializer, + ) { + // Codec=Sse (Serialization based), see doc to use other codecs + + var len_ = sse_decode_i_32(deserializer); + var ans_ = []; + for (var idx_ = 0; idx_ < len_; ++idx_) { + ans_.add( + sse_decode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerViableBottle( + deserializer, + ), + ); + } + return ans_; + } + + @protected + List sse_decode_list_String(SseDeserializer deserializer) { + // Codec=Sse (Serialization based), see doc to use other codecs + + var len_ = sse_decode_i_32(deserializer); + var ans_ = []; + for (var idx_ = 0; idx_ < len_; ++idx_) { + ans_.add(sse_decode_String(deserializer)); + } + return ans_; + } + + @protected + List sse_decode_list_cloud_participant( + SseDeserializer deserializer, + ) { + // Codec=Sse (Serialization based), see doc to use other codecs + + var len_ = sse_decode_i_32(deserializer); + var ans_ = []; + for (var idx_ = 0; idx_ < len_; ++idx_) { + ans_.add(sse_decode_cloud_participant(deserializer)); + } + return ans_; + } + + @protected + List + sse_decode_list_cloud_sync_outbound_save_outcome( + SseDeserializer deserializer, + ) { + // Codec=Sse (Serialization based), see doc to use other codecs + + var len_ = sse_decode_i_32(deserializer); + var ans_ = []; + for (var idx_ = 0; idx_ < len_; ++idx_) { + ans_.add(sse_decode_cloud_sync_outbound_save_outcome(deserializer)); + } + return ans_; + } + + @protected + List + sse_decode_list_cloud_sync_prepared_message_create_input( + SseDeserializer deserializer, + ) { + // Codec=Sse (Serialization based), see doc to use other codecs + + var len_ = sse_decode_i_32(deserializer); + var ans_ = []; + for (var idx_ = 0; idx_ < len_; ++idx_) { + ans_.add( + sse_decode_cloud_sync_prepared_message_create_input(deserializer), + ); + } + return ans_; + } + + @protected + List sse_decode_list_cloud_sync_protected_change( + SseDeserializer deserializer, + ) { + // Codec=Sse (Serialization based), see doc to use other codecs + + var len_ = sse_decode_i_32(deserializer); + var ans_ = []; + for (var idx_ = 0; idx_ < len_; ++idx_) { + ans_.add(sse_decode_cloud_sync_protected_change(deserializer)); + } + return ans_; + } + + @protected + List sse_decode_list_cloud_sync_raw_change( + SseDeserializer deserializer, + ) { + // Codec=Sse (Serialization based), see doc to use other codecs + + var len_ = sse_decode_i_32(deserializer); + var ans_ = []; + for (var idx_ = 0; idx_ < len_; ++idx_) { + ans_.add(sse_decode_cloud_sync_raw_change(deserializer)); + } + return ans_; + } + + @protected + List + sse_decode_list_cloud_sync_transient_attributed_body( + SseDeserializer deserializer, + ) { + // Codec=Sse (Serialization based), see doc to use other codecs + + var len_ = sse_decode_i_32(deserializer); + var ans_ = []; + for (var idx_ = 0; idx_ < len_; ++idx_) { + ans_.add(sse_decode_cloud_sync_transient_attributed_body(deserializer)); + } + return ans_; + } + + @protected + List + sse_decode_list_cloud_sync_transient_edit_part(SseDeserializer deserializer) { + // Codec=Sse (Serialization based), see doc to use other codecs + + var len_ = sse_decode_i_32(deserializer); + var ans_ = []; + for (var idx_ = 0; idx_ < len_; ++idx_) { + ans_.add(sse_decode_cloud_sync_transient_edit_part(deserializer)); + } + return ans_; + } + + @protected + List + sse_decode_list_cloud_sync_transient_message_edit( + SseDeserializer deserializer, + ) { + // Codec=Sse (Serialization based), see doc to use other codecs + + var len_ = sse_decode_i_32(deserializer); + var ans_ = []; + for (var idx_ = 0; idx_ < len_; ++idx_) { + ans_.add(sse_decode_cloud_sync_transient_message_edit(deserializer)); + } + return ans_; + } + + @protected + List sse_decode_list_cloud_sync_transient_text_run( + SseDeserializer deserializer, + ) { + // Codec=Sse (Serialization based), see doc to use other codecs + + var len_ = sse_decode_i_32(deserializer); + var ans_ = []; + for (var idx_ = 0; idx_ < len_; ++idx_) { + ans_.add(sse_decode_cloud_sync_transient_text_run(deserializer)); + } + return ans_; + } + + @protected + List sse_decode_list_dart_beacon(SseDeserializer deserializer) { + // Codec=Sse (Serialization based), see doc to use other codecs + + var len_ = sse_decode_i_32(deserializer); + var ans_ = []; + for (var idx_ = 0; idx_ < len_; ++idx_) { + ans_.add(sse_decode_dart_beacon(deserializer)); + } + return ans_; + } + + @protected + List sse_decode_list_follow(SseDeserializer deserializer) { + // Codec=Sse (Serialization based), see doc to use other codecs + + var len_ = sse_decode_i_32(deserializer); + var ans_ = []; + for (var idx_ = 0; idx_ < len_; ++idx_) { + ans_.add(sse_decode_follow(deserializer)); + } + return ans_; + } + + @protected + List sse_decode_list_found_device(SseDeserializer deserializer) { + // Codec=Sse (Serialization based), see doc to use other codecs + + var len_ = sse_decode_i_32(deserializer); + var ans_ = []; + for (var idx_ = 0; idx_ < len_; ++idx_) { + ans_.add(sse_decode_found_device(deserializer)); + } + return ans_; + } + + @protected + List sse_decode_list_ft_member(SseDeserializer deserializer) { + // Codec=Sse (Serialization based), see doc to use other codecs + + var len_ = sse_decode_i_32(deserializer); + var ans_ = []; + for (var idx_ = 0; idx_ < len_; ++idx_) { + ans_.add(sse_decode_ft_member(deserializer)); + } + return ans_; + } + + @protected + List sse_decode_list_ft_session(SseDeserializer deserializer) { + // Codec=Sse (Serialization based), see doc to use other codecs + + var len_ = sse_decode_i_32(deserializer); + var ans_ = []; + for (var idx_ = 0; idx_ < len_; ++idx_) { + ans_.add(sse_decode_ft_session(deserializer)); + } + return ans_; + } + + @protected + List sse_decode_list_group_summary_member( + SseDeserializer deserializer, + ) { + // Codec=Sse (Serialization based), see doc to use other codecs + + var len_ = sse_decode_i_32(deserializer); + var ans_ = []; + for (var idx_ = 0; idx_ < len_; ++idx_) { + ans_.add(sse_decode_group_summary_member(deserializer)); + } + return ans_; + } + + @protected + List sse_decode_list_indexed_message_part( + SseDeserializer deserializer, + ) { + // Codec=Sse (Serialization based), see doc to use other codecs + + var len_ = sse_decode_i_32(deserializer); + var ans_ = []; + for (var idx_ = 0; idx_ < len_; ++idx_) { + ans_.add(sse_decode_indexed_message_part(deserializer)); + } + return ans_; + } + + @protected + List sse_decode_list_list_prim_u_8_strict( + SseDeserializer deserializer, + ) { + // Codec=Sse (Serialization based), see doc to use other codecs + + var len_ = sse_decode_i_32(deserializer); + var ans_ = []; + for (var idx_ = 0; idx_ < len_; ++idx_) { + ans_.add(sse_decode_list_prim_u_8_strict(deserializer)); + } + return ans_; + } + + @protected + List sse_decode_list_message_edit(SseDeserializer deserializer) { + // Codec=Sse (Serialization based), see doc to use other codecs + + var len_ = sse_decode_i_32(deserializer); + var ans_ = []; + for (var idx_ = 0; idx_ < len_; ++idx_) { + ans_.add(sse_decode_message_edit(deserializer)); + } + return ans_; + } + + @protected + List sse_decode_list_message_target( + SseDeserializer deserializer, + ) { + // Codec=Sse (Serialization based), see doc to use other codecs + + var len_ = sse_decode_i_32(deserializer); + var ans_ = []; + for (var idx_ = 0; idx_ < len_; ++idx_) { + ans_.add(sse_decode_message_target(deserializer)); + } + return ans_; + } + + @protected + List sse_decode_list_password_manager_alt_domain( + SseDeserializer deserializer, + ) { + // Codec=Sse (Serialization based), see doc to use other codecs + + var len_ = sse_decode_i_32(deserializer); + var ans_ = []; + for (var idx_ = 0; idx_ < len_; ++idx_) { + ans_.add(sse_decode_password_manager_alt_domain(deserializer)); + } + return ans_; + } + + @protected + List sse_decode_list_password_manager_meta_change( + SseDeserializer deserializer, + ) { + // Codec=Sse (Serialization based), see doc to use other codecs + + var len_ = sse_decode_i_32(deserializer); + var ans_ = []; + for (var idx_ = 0; idx_ < len_; ++idx_) { + ans_.add(sse_decode_password_manager_meta_change(deserializer)); + } + return ans_; + } + + @protected + List sse_decode_list_photo_poster_layer( + SseDeserializer deserializer, + ) { + // Codec=Sse (Serialization based), see doc to use other codecs + + var len_ = sse_decode_i_32(deserializer); + var ans_ = []; + for (var idx_ = 0; idx_ < len_; ++idx_) { + ans_.add(sse_decode_photo_poster_layer(deserializer)); + } + return ans_; + } + + @protected + List sse_decode_list_poster_asset(SseDeserializer deserializer) { + // Codec=Sse (Serialization based), see doc to use other codecs + + var len_ = sse_decode_i_32(deserializer); + var ans_ = []; + for (var idx_ = 0; idx_ < len_; ++idx_) { + ans_.add(sse_decode_poster_asset(deserializer)); + } + return ans_; + } + + @protected + List sse_decode_list_poster_color(SseDeserializer deserializer) { + // Codec=Sse (Serialization based), see doc to use other codecs + + var len_ = sse_decode_i_32(deserializer); + var ans_ = []; + for (var idx_ = 0; idx_ < len_; ++idx_) { + ans_.add(sse_decode_poster_color(deserializer)); + } + return ans_; + } + + @protected + Float64List sse_decode_list_prim_f_64_strict(SseDeserializer deserializer) { + // Codec=Sse (Serialization based), see doc to use other codecs + var len_ = sse_decode_i_32(deserializer); + return deserializer.buffer.getFloat64List(len_); + } + + @protected + Int64List sse_decode_list_prim_i_64_strict(SseDeserializer deserializer) { + // Codec=Sse (Serialization based), see doc to use other codecs + var len_ = sse_decode_i_32(deserializer); + return deserializer.buffer.getInt64List(len_); + } + + @protected + Uint32List sse_decode_list_prim_u_32_strict(SseDeserializer deserializer) { + // Codec=Sse (Serialization based), see doc to use other codecs + var len_ = sse_decode_i_32(deserializer); + return deserializer.buffer.getUint32List(len_); + } + + @protected + List sse_decode_list_prim_u_8_loose(SseDeserializer deserializer) { + // Codec=Sse (Serialization based), see doc to use other codecs + var len_ = sse_decode_i_32(deserializer); + return deserializer.buffer.getUint8List(len_); + } + + @protected + Uint8List sse_decode_list_prim_u_8_strict(SseDeserializer deserializer) { + // Codec=Sse (Serialization based), see doc to use other codecs + var len_ = sse_decode_i_32(deserializer); + return deserializer.buffer.getUint8List(len_); + } + + @protected + List sse_decode_list_private_device_info( + SseDeserializer deserializer, + ) { + // Codec=Sse (Serialization based), see doc to use other codecs + + var len_ = sse_decode_i_32(deserializer); + var ans_ = []; + for (var idx_ = 0; idx_ < len_; ++idx_) { + ans_.add(sse_decode_private_device_info(deserializer)); + } + return ans_; + } + + @protected + List<(String, Asset)> + sse_decode_list_record_string_auto_owned_rust_opaque_flutter_rust_bridgefor_generated_rust_auto_opaque_inner_asset( + SseDeserializer deserializer, + ) { + // Codec=Sse (Serialization based), see doc to use other codecs + + var len_ = sse_decode_i_32(deserializer); + var ans_ = <(String, Asset)>[]; + for (var idx_ = 0; idx_ < len_; ++idx_) { + ans_.add( + sse_decode_record_string_auto_owned_rust_opaque_flutter_rust_bridgefor_generated_rust_auto_opaque_inner_asset( + deserializer, + ), + ); + } + return ans_; + } + + @protected + List<(String, StCollapsedValue)> + sse_decode_list_record_string_auto_owned_rust_opaque_flutter_rust_bridgefor_generated_rust_auto_opaque_inner_st_collapsed_value( + SseDeserializer deserializer, + ) { + // Codec=Sse (Serialization based), see doc to use other codecs + + var len_ = sse_decode_i_32(deserializer); + var ans_ = <(String, StCollapsedValue)>[]; + for (var idx_ = 0; idx_ < len_; ++idx_) { + ans_.add( + sse_decode_record_string_auto_owned_rust_opaque_flutter_rust_bridgefor_generated_rust_auto_opaque_inner_st_collapsed_value( + deserializer, + ), + ); + } + return ans_; + } + + @protected + List<(String, bool)> sse_decode_list_record_string_bool( + SseDeserializer deserializer, + ) { + // Codec=Sse (Serialization based), see doc to use other codecs + + var len_ = sse_decode_i_32(deserializer); + var ans_ = <(String, bool)>[]; + for (var idx_ = 0; idx_ < len_; ++idx_) { + ans_.add(sse_decode_record_string_bool(deserializer)); + } + return ans_; + } + + @protected + List<(String, int)> sse_decode_list_record_string_casted_primitive_u_64( + SseDeserializer deserializer, + ) { + // Codec=Sse (Serialization based), see doc to use other codecs + + var len_ = sse_decode_i_32(deserializer); + var ans_ = <(String, int)>[]; + for (var idx_ = 0; idx_ < len_; ++idx_) { + ans_.add(sse_decode_record_string_casted_primitive_u_64(deserializer)); + } + return ans_; + } + + @protected + List<(String, CloudAttachment)> + sse_decode_list_record_string_cloud_attachment(SseDeserializer deserializer) { + // Codec=Sse (Serialization based), see doc to use other codecs + + var len_ = sse_decode_i_32(deserializer); + var ans_ = <(String, CloudAttachment)>[]; + for (var idx_ = 0; idx_ < len_; ++idx_) { + ans_.add(sse_decode_record_string_cloud_attachment(deserializer)); + } + return ans_; + } + + @protected + List<(String, CloudChat)> sse_decode_list_record_string_cloud_chat( + SseDeserializer deserializer, + ) { + // Codec=Sse (Serialization based), see doc to use other codecs + + var len_ = sse_decode_i_32(deserializer); + var ans_ = <(String, CloudChat)>[]; + for (var idx_ = 0; idx_ < len_; ++idx_) { + ans_.add(sse_decode_record_string_cloud_chat(deserializer)); + } + return ans_; + } + + @protected + List<(String, CloudMessage)> sse_decode_list_record_string_cloud_message( + SseDeserializer deserializer, + ) { + // Codec=Sse (Serialization based), see doc to use other codecs + + var len_ = sse_decode_i_32(deserializer); + var ans_ = <(String, CloudMessage)>[]; + for (var idx_ = 0; idx_ < len_; ++idx_) { + ans_.add(sse_decode_record_string_cloud_message(deserializer)); + } + return ans_; + } + + @protected + List<(String, FTParticipant)> sse_decode_list_record_string_ft_participant( + SseDeserializer deserializer, + ) { + // Codec=Sse (Serialization based), see doc to use other codecs + + var len_ = sse_decode_i_32(deserializer); + var ans_ = <(String, FTParticipant)>[]; + for (var idx_ = 0; idx_ < len_; ++idx_) { + ans_.add(sse_decode_record_string_ft_participant(deserializer)); + } + return ans_; + } + + @protected + List<(String, GroupSummary)> sse_decode_list_record_string_group_summary( + SseDeserializer deserializer, + ) { + // Codec=Sse (Serialization based), see doc to use other codecs + + var len_ = sse_decode_i_32(deserializer); + var ans_ = <(String, GroupSummary)>[]; + for (var idx_ = 0; idx_ < len_; ++idx_) { + ans_.add(sse_decode_record_string_group_summary(deserializer)); + } + return ans_; + } + + @protected + List<(String, List)> + sse_decode_list_record_string_list_message_edit( + SseDeserializer deserializer, + ) { + // Codec=Sse (Serialization based), see doc to use other codecs + + var len_ = sse_decode_i_32(deserializer); + var ans_ = <(String, List)>[]; + for (var idx_ = 0; idx_ < len_; ++idx_) { + ans_.add(sse_decode_record_string_list_message_edit(deserializer)); + } + return ans_; + } + + @protected + List<(String, Uint8List)> sse_decode_list_record_string_list_prim_u_8_strict( + SseDeserializer deserializer, + ) { + // Codec=Sse (Serialization based), see doc to use other codecs + + var len_ = sse_decode_i_32(deserializer); + var ans_ = <(String, Uint8List)>[]; + for (var idx_ = 0; idx_ < len_; ++idx_) { + ans_.add(sse_decode_record_string_list_prim_u_8_strict(deserializer)); + } + return ans_; + } + + @protected + List<(String, MessageEditRange)> + sse_decode_list_record_string_message_edit_range( + SseDeserializer deserializer, + ) { + // Codec=Sse (Serialization based), see doc to use other codecs + + var len_ = sse_decode_i_32(deserializer); + var ans_ = <(String, MessageEditRange)>[]; + for (var idx_ = 0; idx_ < len_; ++idx_) { + ans_.add(sse_decode_record_string_message_edit_range(deserializer)); + } + return ans_; + } + + @protected + List<(String, CloudAttachment?)> + sse_decode_list_record_string_opt_box_autoadd_cloud_attachment( + SseDeserializer deserializer, + ) { + // Codec=Sse (Serialization based), see doc to use other codecs + + var len_ = sse_decode_i_32(deserializer); + var ans_ = <(String, CloudAttachment?)>[]; + for (var idx_ = 0; idx_ < len_; ++idx_) { + ans_.add( + sse_decode_record_string_opt_box_autoadd_cloud_attachment(deserializer), + ); + } + return ans_; + } + + @protected + List<(String, CloudChat?)> + sse_decode_list_record_string_opt_box_autoadd_cloud_chat( + SseDeserializer deserializer, + ) { + // Codec=Sse (Serialization based), see doc to use other codecs + + var len_ = sse_decode_i_32(deserializer); + var ans_ = <(String, CloudChat?)>[]; + for (var idx_ = 0; idx_ < len_; ++idx_) { + ans_.add( + sse_decode_record_string_opt_box_autoadd_cloud_chat(deserializer), + ); + } + return ans_; + } + + @protected + List<(String, CloudMessage?)> + sse_decode_list_record_string_opt_box_autoadd_cloud_message( + SseDeserializer deserializer, + ) { + // Codec=Sse (Serialization based), see doc to use other codecs + + var len_ = sse_decode_i_32(deserializer); + var ans_ = <(String, CloudMessage?)>[]; + for (var idx_ = 0; idx_ < len_; ++idx_) { + ans_.add( + sse_decode_record_string_opt_box_autoadd_cloud_message(deserializer), + ); + } + return ans_; + } + + @protected + List<(String, PasswordManagerMetaDataCtx)> + sse_decode_list_record_string_password_manager_meta_data_ctx( + SseDeserializer deserializer, + ) { + // Codec=Sse (Serialization based), see doc to use other codecs + + var len_ = sse_decode_i_32(deserializer); + var ans_ = <(String, PasswordManagerMetaDataCtx)>[]; + for (var idx_ = 0; idx_ < len_; ++idx_) { + ans_.add( + sse_decode_record_string_password_manager_meta_data_ctx(deserializer), + ); + } + return ans_; + } + + @protected + List<(String, (String?, Passkey))> + sse_decode_list_record_string_record_opt_string_passkey( + SseDeserializer deserializer, + ) { + // Codec=Sse (Serialization based), see doc to use other codecs + + var len_ = sse_decode_i_32(deserializer); + var ans_ = <(String, (String?, Passkey))>[]; + for (var idx_ = 0; idx_ < len_; ++idx_) { + ans_.add( + sse_decode_record_string_record_opt_string_passkey(deserializer), + ); + } + return ans_; + } + + @protected + List<(String, (String?, PasswordManagerMeta))> + sse_decode_list_record_string_record_opt_string_password_manager_meta( + SseDeserializer deserializer, + ) { + // Codec=Sse (Serialization based), see doc to use other codecs + + var len_ = sse_decode_i_32(deserializer); + var ans_ = <(String, (String?, PasswordManagerMeta))>[]; + for (var idx_ = 0; idx_ < len_; ++idx_) { + ans_.add( + sse_decode_record_string_record_opt_string_password_manager_meta( + deserializer, + ), + ); + } + return ans_; + } + + @protected + List<(String, (String?, PasswordRawEntry))> + sse_decode_list_record_string_record_opt_string_password_raw_entry( + SseDeserializer deserializer, + ) { + // Codec=Sse (Serialization based), see doc to use other codecs + + var len_ = sse_decode_i_32(deserializer); + var ans_ = <(String, (String?, PasswordRawEntry))>[]; + for (var idx_ = 0; idx_ < len_; ++idx_) { + ans_.add( + sse_decode_record_string_record_opt_string_password_raw_entry( + deserializer, + ), + ); + } + return ans_; + } + + @protected + List<(String, (String?, WifiPassword))> + sse_decode_list_record_string_record_opt_string_wifi_password( + SseDeserializer deserializer, + ) { + // Codec=Sse (Serialization based), see doc to use other codecs + + var len_ = sse_decode_i_32(deserializer); + var ans_ = <(String, (String?, WifiPassword))>[]; + for (var idx_ = 0; idx_ < len_; ++idx_) { + ans_.add( + sse_decode_record_string_record_opt_string_wifi_password(deserializer), + ); + } + return ans_; + } + + @protected + List<(String, ShareInviteContentData)> + sse_decode_list_record_string_share_invite_content_data( + SseDeserializer deserializer, + ) { + // Codec=Sse (Serialization based), see doc to use other codecs + + var len_ = sse_decode_i_32(deserializer); + var ans_ = <(String, ShareInviteContentData)>[]; + for (var idx_ = 0; idx_ < len_; ++idx_) { + ans_.add( + sse_decode_record_string_share_invite_content_data(deserializer), + ); + } + return ans_; + } + + @protected + List<(String, StatusKitPersonalConfig)> + sse_decode_list_record_string_status_kit_personal_config( + SseDeserializer deserializer, + ) { + // Codec=Sse (Serialization based), see doc to use other codecs + + var len_ = sse_decode_i_32(deserializer); + var ans_ = <(String, StatusKitPersonalConfig)>[]; + for (var idx_ = 0; idx_ < len_; ++idx_) { + ans_.add( + sse_decode_record_string_status_kit_personal_config(deserializer), + ); + } + return ans_; + } + + @protected + List<(String, String)> sse_decode_list_record_string_string( + SseDeserializer deserializer, + ) { + // Codec=Sse (Serialization based), see doc to use other codecs + + var len_ = sse_decode_i_32(deserializer); + var ans_ = <(String, String)>[]; + for (var idx_ = 0; idx_ < len_; ++idx_) { + ans_.add(sse_decode_record_string_string(deserializer)); + } + return ans_; + } + + @protected + List<(String, SyncStatus)> sse_decode_list_record_string_sync_status( + SseDeserializer deserializer, + ) { + // Codec=Sse (Serialization based), see doc to use other codecs + + var len_ = sse_decode_i_32(deserializer); + var ans_ = <(String, SyncStatus)>[]; + for (var idx_ = 0; idx_ < len_; ++idx_) { + ans_.add(sse_decode_record_string_sync_status(deserializer)); + } + return ans_; + } + + @protected + List<(int, NSDictionaryTypedCoder)> + sse_decode_list_record_u_32_ns_dictionary_typed_coder( + SseDeserializer deserializer, + ) { + // Codec=Sse (Serialization based), see doc to use other codecs + + var len_ = sse_decode_i_32(deserializer); + var ans_ = <(int, NSDictionaryTypedCoder)>[]; + for (var idx_ = 0; idx_ < len_; ++idx_) { + ans_.add(sse_decode_record_u_32_ns_dictionary_typed_coder(deserializer)); + } + return ans_; + } + + @protected + List sse_decode_list_report_message( + SseDeserializer deserializer, + ) { + // Codec=Sse (Serialization based), see doc to use other codecs + + var len_ = sse_decode_i_32(deserializer); + var ans_ = []; + for (var idx_ = 0; idx_ < len_; ++idx_) { + ans_.add(sse_decode_report_message(deserializer)); + } + return ans_; + } + + @protected + List sse_decode_list_shared_album(SseDeserializer deserializer) { + // Codec=Sse (Serialization based), see doc to use other codecs + + var len_ = sse_decode_i_32(deserializer); + var ans_ = []; + for (var idx_ = 0; idx_ < len_; ++idx_) { + ans_.add(sse_decode_shared_album(deserializer)); + } + return ans_; + } + + @protected + List sse_decode_list_trusted_phone_number( + SseDeserializer deserializer, + ) { + // Codec=Sse (Serialization based), see doc to use other codecs + + var len_ = sse_decode_i_32(deserializer); + var ans_ = []; + for (var idx_ = 0; idx_ < len_; ++idx_) { + ans_.add(sse_decode_trusted_phone_number(deserializer)); + } + return ans_; + } + + @protected + List sse_decode_list_ui_color(SseDeserializer deserializer) { + // Codec=Sse (Serialization based), see doc to use other codecs + + var len_ = sse_decode_i_32(deserializer); + var ans_ = []; + for (var idx_ = 0; idx_ < len_; ++idx_) { + ans_.add(sse_decode_ui_color(deserializer)); + } + return ans_; + } + + @protected + Location sse_decode_location(SseDeserializer deserializer) { + // Codec=Sse (Serialization based), see doc to use other codecs + var var_address = sse_decode_opt_box_autoadd_address(deserializer); + var var_altitude = sse_decode_f_64(deserializer); + var var_floorLevel = sse_decode_i_64(deserializer); + var var_horizontalAccuracy = sse_decode_f_64(deserializer); + var var_isInaccurate = sse_decode_bool(deserializer); + var var_latitude = sse_decode_f_64(deserializer); + var var_locationId = sse_decode_opt_String(deserializer); + var var_locationTimestamp = sse_decode_opt_box_autoadd_i_64(deserializer); + var var_longitude = sse_decode_f_64(deserializer); + var var_secureLocationTs = sse_decode_i_64(deserializer); + var var_timestamp = sse_decode_i_64(deserializer); + var var_verticalAccuracy = sse_decode_f_64(deserializer); + var var_positionType = sse_decode_opt_String(deserializer); + var var_isOld = sse_decode_opt_box_autoadd_bool(deserializer); + var var_locationFinished = sse_decode_opt_box_autoadd_bool(deserializer); + return Location( + address: var_address, + altitude: var_altitude, + floorLevel: var_floorLevel, + horizontalAccuracy: var_horizontalAccuracy, + isInaccurate: var_isInaccurate, + latitude: var_latitude, + locationId: var_locationId, + locationTimestamp: var_locationTimestamp, + longitude: var_longitude, + secureLocationTs: var_secureLocationTs, + timestamp: var_timestamp, + verticalAccuracy: var_verticalAccuracy, + positionType: var_positionType, + isOld: var_isOld, + locationFinished: var_locationFinished, + ); + } + + @protected + LoginState sse_decode_login_state(SseDeserializer deserializer) { + // Codec=Sse (Serialization based), see doc to use other codecs + + var tag_ = sse_decode_i_32(deserializer); + switch (tag_) { + case 0: + return LoginState_LoggedIn(); + case 1: + return LoginState_NeedsDevice2FA(); + case 2: + return LoginState_Needs2FAVerification(); + case 3: + return LoginState_NeedsSMS2FA(); + case 4: + var var_field0 = + sse_decode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerVerifyBody( + deserializer, + ); + return LoginState_NeedsSMS2FAVerification(var_field0); + case 5: + var var_field0 = sse_decode_String(deserializer); + return LoginState_NeedsExtraStep(var_field0); + case 6: + return LoginState_NeedsLogin(); + default: + throw UnimplementedError(''); + } + } + + @protected + LPIconMetadata sse_decode_lp_icon_metadata(SseDeserializer deserializer) { + // Codec=Sse (Serialization based), see doc to use other codecs + var var_url = sse_decode_nsurl(deserializer); + var var_version = sse_decode_u_8(deserializer); + return LPIconMetadata(url: var_url, version: var_version); + } + + @protected + LPImageMetadata sse_decode_lp_image_metadata(SseDeserializer deserializer) { + // Codec=Sse (Serialization based), see doc to use other codecs + var var_size = sse_decode_String(deserializer); + var var_url = sse_decode_nsurl(deserializer); + var var_version = sse_decode_u_8(deserializer); + return LPImageMetadata(size: var_size, url: var_url, version: var_version); + } + + @protected + LPLinkMetadata sse_decode_lp_link_metadata(SseDeserializer deserializer) { + // Codec=Sse (Serialization based), see doc to use other codecs + var var_imageMetadata = sse_decode_opt_box_autoadd_lp_image_metadata( + deserializer, + ); + var var_version = sse_decode_u_8(deserializer); + var var_iconMetadata = sse_decode_opt_box_autoadd_lp_icon_metadata( + deserializer, + ); + var var_originalUrl = sse_decode_opt_box_autoadd_nsurl(deserializer); + var var_url = sse_decode_opt_box_autoadd_nsurl(deserializer); + var var_title = sse_decode_opt_String(deserializer); + var var_summary = sse_decode_opt_String(deserializer); + var var_image = + sse_decode_opt_box_autoadd_rich_link_image_attachment_substitute( + deserializer, + ); + var var_icon = + sse_decode_opt_box_autoadd_rich_link_image_attachment_substitute( + deserializer, + ); + var var_images = + sse_decode_opt_box_autoadd_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerNSArrayLPImageMetadata( + deserializer, + ); + var var_icons = + sse_decode_opt_box_autoadd_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerNSArrayLPIconMetadata( + deserializer, + ); + var var_isIncomplete = sse_decode_opt_box_autoadd_bool(deserializer); + var var_usesActivityPub = sse_decode_opt_box_autoadd_bool(deserializer); + var var_isEncodedForLocalUse = sse_decode_opt_box_autoadd_bool( + deserializer, + ); + var var_collaborationType = sse_decode_opt_box_autoadd_u_32(deserializer); + var var_specialization2 = + sse_decode_opt_box_autoadd_lp_specialization_metadata(deserializer); + return LPLinkMetadata( + imageMetadata: var_imageMetadata, + version: var_version, + iconMetadata: var_iconMetadata, + originalUrl: var_originalUrl, + url: var_url, + title: var_title, + summary: var_summary, + image: var_image, + icon: var_icon, + images: var_images, + icons: var_icons, + isIncomplete: var_isIncomplete, + usesActivityPub: var_usesActivityPub, + isEncodedForLocalUse: var_isEncodedForLocalUse, + collaborationType: var_collaborationType, + specialization2: var_specialization2, + ); + } + + @protected + LPSpecializationMetadata sse_decode_lp_specialization_metadata( + SseDeserializer deserializer, + ) { + // Codec=Sse (Serialization based), see doc to use other codecs + + var tag_ = sse_decode_i_32(deserializer); + switch (tag_) { + case 0: + var var_groupName = sse_decode_String(deserializer); + var var_urlParameters = sse_decode_String(deserializer); + return LPSpecializationMetadata_LPPasswordsInviteMetadata( + groupName: var_groupName, + urlParameters: var_urlParameters, + ); + default: + throw UnimplementedError(''); + } + } + + @protected + MemojiData sse_decode_memoji_data(SseDeserializer deserializer) { + // Codec=Sse (Serialization based), see doc to use other codecs + var var_backgroundColorDescription = sse_decode_poster_color(deserializer); + var var_avatarRecordData = sse_decode_list_prim_u_8_strict(deserializer); + var var_avatarPoseData = sse_decode_list_prim_u_8_strict(deserializer); + var var_hasBody = sse_decode_bool(deserializer); + var var_avatarImageData = sse_decode_list_prim_u_8_strict(deserializer); + return MemojiData( + backgroundColorDescription: var_backgroundColorDescription, + avatarRecordData: var_avatarRecordData, + avatarPoseData: var_avatarPoseData, + hasBody: var_hasBody, + avatarImageData: var_avatarImageData, + ); + } + + @protected + Message sse_decode_message(SseDeserializer deserializer) { + // Codec=Sse (Serialization based), see doc to use other codecs + + var tag_ = sse_decode_i_32(deserializer); + switch (tag_) { + case 0: + var var_field0 = sse_decode_box_autoadd_normal_message(deserializer); + return Message_Message(var_field0); + case 1: + var var_field0 = sse_decode_box_autoadd_rename_message(deserializer); + return Message_RenameMessage(var_field0); + case 2: + var var_field0 = sse_decode_box_autoadd_change_participant_message( + deserializer, + ); + return Message_ChangeParticipants(var_field0); + case 3: + var var_field0 = sse_decode_box_autoadd_react_message(deserializer); + return Message_React(var_field0); + case 4: + return Message_Delivered(); + case 5: + return Message_Read(); + case 6: + var var_field0 = sse_decode_bool(deserializer); + var var_field1 = sse_decode_opt_box_autoadd_typing_app(deserializer); + return Message_Typing(var_field0, var_field1); + case 7: + var var_field0 = sse_decode_box_autoadd_unsend_message(deserializer); + return Message_Unsend(var_field0); + case 8: + var var_field0 = sse_decode_box_autoadd_edit_message(deserializer); + return Message_Edit(var_field0); + case 9: + var var_field0 = sse_decode_box_autoadd_icon_change_message( + deserializer, + ); + return Message_IconChange(var_field0); + case 10: + var var_field0 = sse_decode_bool(deserializer); + return Message_EnableSmsActivation(var_field0); + case 11: + return Message_MessageReadOnDevice(); + case 12: + var var_field0 = sse_decode_bool(deserializer); + return Message_SmsConfirmSent(var_field0); + case 13: + return Message_MarkUnread(); + case 14: + return Message_PeerCacheInvalidate(); + case 15: + var var_field0 = sse_decode_box_autoadd_update_extension_message( + deserializer, + ); + return Message_UpdateExtension(var_field0); + case 16: + var var_field0 = sse_decode_box_autoadd_error_message(deserializer); + return Message_Error(var_field0); + case 17: + var var_field0 = sse_decode_box_autoadd_move_to_recycle_bin_message( + deserializer, + ); + return Message_MoveToRecycleBin(var_field0); + case 18: + var var_field0 = sse_decode_box_autoadd_operated_chat(deserializer); + return Message_RecoverChat(var_field0); + case 19: + var var_field0 = sse_decode_box_autoadd_permanent_delete_message( + deserializer, + ); + return Message_PermanentDelete(var_field0); + case 20: + return Message_Unschedule(); + case 21: + var var_field0 = sse_decode_box_autoadd_update_profile_message( + deserializer, + ); + return Message_UpdateProfile(var_field0); + case 22: + var var_field0 = sse_decode_box_autoadd_update_profile_sharing_message( + deserializer, + ); + return Message_UpdateProfileSharing(var_field0); + case 23: + var var_field0 = sse_decode_box_autoadd_share_profile_message( + deserializer, + ); + return Message_ShareProfile(var_field0); + case 24: + return Message_NotifyAnyways(); + case 25: + var var_field0 = + sse_decode_box_autoadd_set_transcript_background_message( + deserializer, + ); + return Message_SetTranscriptBackground(var_field0); + default: + throw UnimplementedError(''); + } + } + + @protected + MessageEdit sse_decode_message_edit(SseDeserializer deserializer) { + // Codec=Sse (Serialization based), see doc to use other codecs + var var_t = sse_decode_list_prim_u_8_strict(deserializer); + var var_d = sse_decode_f_64(deserializer); + var var_bcg = sse_decode_opt_String(deserializer); + return MessageEdit(t: var_t, d: var_d, bcg: var_bcg); + } + + @protected + MessageEditRange sse_decode_message_edit_range(SseDeserializer deserializer) { + // Codec=Sse (Serialization based), see doc to use other codecs + var var_lo = sse_decode_u_32(deserializer); + var var_le = sse_decode_u_32(deserializer); + return MessageEditRange(lo: var_lo, le: var_le); + } + + @protected + MessageInst sse_decode_message_inst(SseDeserializer deserializer) { + // Codec=Sse (Serialization based), see doc to use other codecs + var var_id = sse_decode_String(deserializer); + var var_sender = sse_decode_opt_String(deserializer); + var var_conversation = sse_decode_opt_box_autoadd_conversation_data( + deserializer, + ); + var var_message = sse_decode_message(deserializer); + var var_sentTimestamp = sse_decode_CastedPrimitive_u_64(deserializer); + var var_target = sse_decode_opt_list_message_target(deserializer); + var var_sendDelivered = sse_decode_bool(deserializer); + var var_verificationFailed = sse_decode_bool(deserializer); + var var_certifiedContext = sse_decode_opt_box_autoadd_certified_context( + deserializer, + ); + return MessageInst( + id: var_id, + sender: var_sender, + conversation: var_conversation, + message: var_message, + sentTimestamp: var_sentTimestamp, + target: var_target, + sendDelivered: var_sendDelivered, + verificationFailed: var_verificationFailed, + certifiedContext: var_certifiedContext, + ); + } + + @protected + MessagePart sse_decode_message_part(SseDeserializer deserializer) { + // Codec=Sse (Serialization based), see doc to use other codecs + + var tag_ = sse_decode_i_32(deserializer); + switch (tag_) { + case 0: + var var_field0 = sse_decode_String(deserializer); + var var_field1 = sse_decode_box_autoadd_text_format(deserializer); + return MessagePart_Text(var_field0, var_field1); + case 1: + var var_field0 = sse_decode_box_autoadd_attachment(deserializer); + return MessagePart_Attachment(var_field0); + case 2: + var var_field0 = sse_decode_String(deserializer); + var var_field1 = sse_decode_String(deserializer); + return MessagePart_Mention(var_field0, var_field1); + case 3: + var var_field0 = sse_decode_String(deserializer); + return MessagePart_Object(var_field0); + default: + throw UnimplementedError(''); + } + } + + @protected + MessageParts sse_decode_message_parts(SseDeserializer deserializer) { + // Codec=Sse (Serialization based), see doc to use other codecs + var var_field0 = sse_decode_list_indexed_message_part(deserializer); + return MessageParts(field0: var_field0); + } + + @protected + MessageProto sse_decode_message_proto(SseDeserializer deserializer) { + // Codec=Sse (Serialization based), see doc to use other codecs + var var_unk1 = sse_decode_u_32(deserializer); + var var_subject = sse_decode_opt_String(deserializer); + var var_text = sse_decode_opt_String(deserializer); + var var_attributedBody = sse_decode_opt_list_prim_u_8_strict(deserializer); + var var_balloonBundleId = sse_decode_opt_String(deserializer); + var var_payloadData = sse_decode_opt_list_prim_u_8_strict(deserializer); + var var_messageSummaryInfo = sse_decode_opt_list_prim_u_8_strict( + deserializer, + ); + var var_effect = sse_decode_opt_String(deserializer); + var var_dateRead = sse_decode_opt_CastedPrimitive_u_64(deserializer); + var var_unk10 = sse_decode_opt_box_autoadd_u_32(deserializer); + var var_unk11 = sse_decode_opt_box_autoadd_u_32(deserializer); + var var_dateDelivered = sse_decode_opt_CastedPrimitive_u_64(deserializer); + var var_unk14 = sse_decode_opt_box_autoadd_u_32(deserializer); + var var_associatedMessageType = sse_decode_opt_box_autoadd_u_32( + deserializer, + ); + var var_associatedMessageGuid = sse_decode_opt_String(deserializer); + var var_associatedMessageRangeLocation = sse_decode_opt_box_autoadd_u_32( + deserializer, + ); + var var_associatedMessageRangeLength = sse_decode_opt_box_autoadd_u_32( + deserializer, + ); + return MessageProto( + unk1: var_unk1, + subject: var_subject, + text: var_text, + attributedBody: var_attributedBody, + balloonBundleId: var_balloonBundleId, + payloadData: var_payloadData, + messageSummaryInfo: var_messageSummaryInfo, + effect: var_effect, + dateRead: var_dateRead, + unk10: var_unk10, + unk11: var_unk11, + dateDelivered: var_dateDelivered, + unk14: var_unk14, + associatedMessageType: var_associatedMessageType, + associatedMessageGuid: var_associatedMessageGuid, + associatedMessageRangeLocation: var_associatedMessageRangeLocation, + associatedMessageRangeLength: var_associatedMessageRangeLength, + ); } @protected - FTMode sse_decode_ft_mode(SseDeserializer deserializer) { + MessageProto2 sse_decode_message_proto_2(SseDeserializer deserializer) { // Codec=Sse (Serialization based), see doc to use other codecs - var inner = sse_decode_i_32(deserializer); - return FTMode.values[inner]; + var var_reply = sse_decode_opt_String(deserializer); + return MessageProto2(reply: var_reply); } @protected - FTParticipant sse_decode_ft_participant(SseDeserializer deserializer) { + MessageProto3 sse_decode_message_proto_3(SseDeserializer deserializer) { // Codec=Sse (Serialization based), see doc to use other codecs - var var_token = sse_decode_opt_String(deserializer); - var var_handle = sse_decode_String(deserializer); - var var_participantId = sse_decode_CastedPrimitive_u_64(deserializer); - var var_lastJoinDate = sse_decode_opt_CastedPrimitive_u_64(deserializer); - var var_active = - sse_decode_opt_box_autoadd_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerConversationParticipant( - deserializer); - return FTParticipant( - token: var_token, - handle: var_handle, - participantId: var_participantId, - lastJoinDate: var_lastJoinDate, - active: var_active); + var var_unk2 = sse_decode_opt_box_autoadd_u_32(deserializer); + var var_unk3 = sse_decode_opt_box_autoadd_u_32(deserializer); + return MessageProto3(unk2: var_unk2, unk3: var_unk3); } @protected - FTSession sse_decode_ft_session(SseDeserializer deserializer) { + MessageProto4 sse_decode_message_proto_4(SseDeserializer deserializer) { // Codec=Sse (Serialization based), see doc to use other codecs - var var_groupId = sse_decode_String(deserializer); - var var_myHandles = sse_decode_list_String(deserializer); - var var_participants = sse_decode_Map_String_ft_participant(deserializer); - var var_link = - sse_decode_opt_box_autoadd_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerConversationLink( - deserializer); - var var_members = sse_decode_Set_ft_member(deserializer); - var var_reportId = sse_decode_String(deserializer); - var var_startTime = sse_decode_opt_CastedPrimitive_u_64(deserializer); - var var_lastRekey = sse_decode_opt_CastedPrimitive_u_64(deserializer); - var var_isPropped = sse_decode_bool(deserializer); - var var_isRingingInaccurate = sse_decode_bool(deserializer); - var var_mode = sse_decode_opt_box_autoadd_ft_mode(deserializer); - var var_recentMemberAdds = - sse_decode_Map_String_CastedPrimitive_u_64(deserializer); - return FTSession( - groupId: var_groupId, - myHandles: var_myHandles, - participants: var_participants, - link: var_link, - members: var_members, - reportId: var_reportId, - startTime: var_startTime, - lastRekey: var_lastRekey, - isPropped: var_isPropped, - isRingingInaccurate: var_isRingingInaccurate, - mode: var_mode, - recentMemberAdds: var_recentMemberAdds); + var var_associatedMessageEmoji = sse_decode_opt_String(deserializer); + var var_service = sse_decode_opt_String(deserializer); + var var_scheduleType = sse_decode_opt_box_autoadd_u_32(deserializer); + var var_scheduleState = sse_decode_opt_box_autoadd_u_32(deserializer); + var var_groupId = sse_decode_opt_String(deserializer); + var var_sentOrReceivedOffGrid = sse_decode_opt_box_autoadd_u_32( + deserializer, + ); + return MessageProto4( + associatedMessageEmoji: var_associatedMessageEmoji, + service: var_service, + scheduleType: var_scheduleType, + scheduleState: var_scheduleState, + groupId: var_groupId, + sentOrReceivedOffGrid: var_sentOrReceivedOffGrid, + ); } @protected - GroupSummary sse_decode_group_summary(SseDeserializer deserializer) { + MessageSummaryInfo sse_decode_message_summary_info( + SseDeserializer deserializer, + ) { // Codec=Sse (Serialization based), see doc to use other codecs - var var_displayName = sse_decode_String(deserializer); - var var_isOwner = sse_decode_bool(deserializer); - var var_members = sse_decode_list_group_summary_member(deserializer); - return GroupSummary( - displayName: var_displayName, - isOwner: var_isOwner, - members: var_members); + var var_ams = sse_decode_opt_String(deserializer); + var var_ampt = sse_decode_opt_list_prim_u_8_strict(deserializer); + var var_amc = sse_decode_opt_box_autoadd_u_32(deserializer); + var var_amb = sse_decode_opt_String(deserializer); + var var_amd = sse_decode_opt_String(deserializer); + var var_ec = sse_decode_Map_String_list_message_edit(deserializer); + var var_ep = sse_decode_list_prim_u_32_strict(deserializer); + var var_otr = sse_decode_Map_String_message_edit_range(deserializer); + var var_ust = sse_decode_opt_box_autoadd_bool(deserializer); + var var_rp = sse_decode_list_prim_u_32_strict(deserializer); + var var_hbr = sse_decode_opt_box_autoadd_bool(deserializer); + var var_oui = sse_decode_opt_String(deserializer); + var var_osn = sse_decode_opt_String(deserializer); + var var_euh = sse_decode_list_String(deserializer); + return MessageSummaryInfo( + ams: var_ams, + ampt: var_ampt, + amc: var_amc, + amb: var_amb, + amd: var_amd, + ec: var_ec, + ep: var_ep, + otr: var_otr, + ust: var_ust, + rp: var_rp, + hbr: var_hbr, + oui: var_oui, + osn: var_osn, + euh: var_euh, + ); } @protected - GroupSummaryMember sse_decode_group_summary_member( - SseDeserializer deserializer) { + MessageTarget sse_decode_message_target(SseDeserializer deserializer) { // Codec=Sse (Serialization based), see doc to use other codecs - var var_name = sse_decode_opt_String(deserializer); - var var_handle = sse_decode_String(deserializer); - var var_userId = sse_decode_opt_String(deserializer); - var var_isJoined = sse_decode_bool(deserializer); - return GroupSummaryMember( - name: var_name, - handle: var_handle, - userId: var_userId, - isJoined: var_isJoined); + + var tag_ = sse_decode_i_32(deserializer); + switch (tag_) { + case 0: + var var_field0 = sse_decode_list_prim_u_8_strict(deserializer); + return MessageTarget_Token(var_field0); + case 1: + var var_field0 = sse_decode_String(deserializer); + return MessageTarget_Uuid(var_field0); + default: + throw UnimplementedError(''); + } } @protected - HwExtra sse_decode_hw_extra(SseDeserializer deserializer) { + MessageType sse_decode_message_type(SseDeserializer deserializer) { // Codec=Sse (Serialization based), see doc to use other codecs - var var_version = sse_decode_String(deserializer); - var var_protocolVersion = sse_decode_u_32(deserializer); - var var_deviceId = sse_decode_String(deserializer); - var var_icloudUa = sse_decode_String(deserializer); - var var_aoskitVersion = sse_decode_String(deserializer); - return HwExtra( - version: var_version, - protocolVersion: var_protocolVersion, - deviceId: var_deviceId, - icloudUa: var_icloudUa, - aoskitVersion: var_aoskitVersion); + + var tag_ = sse_decode_i_32(deserializer); + switch (tag_) { + case 0: + return MessageType_IMessage(); + case 1: + var var_isPhone = sse_decode_bool(deserializer); + var var_usingNumber = sse_decode_String(deserializer); + var var_fromHandle = sse_decode_opt_String(deserializer); + return MessageType_SMS( + isPhone: var_isPhone, + usingNumber: var_usingNumber, + fromHandle: var_fromHandle, + ); + default: + throw UnimplementedError(''); + } } @protected - int sse_decode_i_32(SseDeserializer deserializer) { + MMCSAttachmentMeta sse_decode_mmcs_attachment_meta( + SseDeserializer deserializer, + ) { // Codec=Sse (Serialization based), see doc to use other codecs - return deserializer.buffer.getInt32(); + var var_mmcsSignatureHex = sse_decode_opt_String(deserializer); + var var_mmcsOwner = sse_decode_opt_String(deserializer); + var var_mmcsUrl = sse_decode_opt_String(deserializer); + var var_decryptionKey = sse_decode_opt_String(deserializer); + var var_inlineAttachment = sse_decode_opt_String(deserializer); + var var_messagePart = sse_decode_opt_String(deserializer); + var var_fileSize = sse_decode_opt_box_autoadd_num_or_string(deserializer); + var var_utiType = sse_decode_opt_String(deserializer); + var var_mimeType = sse_decode_opt_String(deserializer); + var var_name = sse_decode_opt_String(deserializer); + return MMCSAttachmentMeta( + mmcsSignatureHex: var_mmcsSignatureHex, + mmcsOwner: var_mmcsOwner, + mmcsUrl: var_mmcsUrl, + decryptionKey: var_decryptionKey, + inlineAttachment: var_inlineAttachment, + messagePart: var_messagePart, + fileSize: var_fileSize, + utiType: var_utiType, + mimeType: var_mimeType, + name: var_name, + ); } @protected - PlatformInt64 sse_decode_i_64(SseDeserializer deserializer) { + MMCSFile sse_decode_mmcs_file(SseDeserializer deserializer) { // Codec=Sse (Serialization based), see doc to use other codecs - return deserializer.buffer.getPlatformInt64(); + var var_signature = sse_decode_list_prim_u_8_strict(deserializer); + var var_object = sse_decode_String(deserializer); + var var_url = sse_decode_String(deserializer); + var var_key = sse_decode_list_prim_u_8_strict(deserializer); + var var_size = sse_decode_CastedPrimitive_usize(deserializer); + return MMCSFile( + signature: var_signature, + object: var_object, + url: var_url, + key: var_key, + size: var_size, + ); } @protected - IMessageNameRecord sse_decode_i_message_name_record( - SseDeserializer deserializer) { + MMCSTransferProgress sse_decode_mmcs_transfer_progress( + SseDeserializer deserializer, + ) { // Codec=Sse (Serialization based), see doc to use other codecs - var var_name = sse_decode_String(deserializer); - var var_first = sse_decode_String(deserializer); - var var_last = sse_decode_String(deserializer); - return IMessageNameRecord(name: var_name, first: var_first, last: var_last); + var var_prog = sse_decode_CastedPrimitive_usize(deserializer); + var var_total = sse_decode_CastedPrimitive_usize(deserializer); + var var_file = sse_decode_opt_box_autoadd_mmcs_file(deserializer); + return MMCSTransferProgress( + prog: var_prog, + total: var_total, + file: var_file, + ); } @protected - IMessageNicknameRecord sse_decode_i_message_nickname_record( - SseDeserializer deserializer) { + MonogramData sse_decode_monogram_data(SseDeserializer deserializer) { // Codec=Sse (Serialization based), see doc to use other codecs - var var_name = sse_decode_i_message_name_record(deserializer); - var var_image = sse_decode_opt_list_prim_u_8_strict(deserializer); - var var_poster = - sse_decode_opt_box_autoadd_i_message_poster_record(deserializer); - return IMessageNicknameRecord( - name: var_name, image: var_image, poster: var_poster); + var var_topBackgroundColorDescription = sse_decode_poster_color( + deserializer, + ); + var var_backgroundColorDescription = sse_decode_poster_color(deserializer); + var var_initials = sse_decode_String(deserializer); + var var_monogramSupportedForName = sse_decode_bool(deserializer); + return MonogramData( + topBackgroundColorDescription: var_topBackgroundColorDescription, + backgroundColorDescription: var_backgroundColorDescription, + initials: var_initials, + monogramSupportedForName: var_monogramSupportedForName, + ); } @protected - IMessagePosterRecord sse_decode_i_message_poster_record( - SseDeserializer deserializer) { + MoveToRecycleBinMessage sse_decode_move_to_recycle_bin_message( + SseDeserializer deserializer, + ) { // Codec=Sse (Serialization based), see doc to use other codecs - var var_lowResPoster = sse_decode_list_prim_u_8_strict(deserializer); - var var_package = sse_decode_list_prim_u_8_strict(deserializer); - var var_meta = sse_decode_list_prim_u_8_strict(deserializer); - return IMessagePosterRecord( - lowResPoster: var_lowResPoster, package: var_package, meta: var_meta); + var var_target = sse_decode_delete_target(deserializer); + var var_recoverableDeleteDate = sse_decode_CastedPrimitive_u_64( + deserializer, + ); + return MoveToRecycleBinMessage( + target: var_target, + recoverableDeleteDate: var_recoverableDeleteDate, + ); } @protected - IconChangeMessage sse_decode_icon_change_message( - SseDeserializer deserializer) { + MyAsyncRuntime sse_decode_my_async_runtime(SseDeserializer deserializer) { // Codec=Sse (Serialization based), see doc to use other codecs - var var_file = sse_decode_opt_box_autoadd_mmcs_file(deserializer); - var var_groupVersion = sse_decode_CastedPrimitive_u_64(deserializer); - return IconChangeMessage(file: var_file, groupVersion: var_groupVersion); + return MyAsyncRuntime(); } @protected - IdmsCircleMessage sse_decode_idms_circle_message( - SseDeserializer deserializer) { + NormalMessage sse_decode_normal_message(SseDeserializer deserializer) { // Codec=Sse (Serialization based), see doc to use other codecs - var var_step = sse_decode_u_32(deserializer); - var var_atxnid = sse_decode_String(deserializer); - var var_pake = sse_decode_opt_String(deserializer); - var var_ec = sse_decode_opt_box_autoadd_i_32(deserializer); - var var_idmsdata = sse_decode_String(deserializer); - return IdmsCircleMessage( - step: var_step, - atxnid: var_atxnid, - pake: var_pake, - ec: var_ec, - idmsdata: var_idmsdata); + var var_parts = sse_decode_message_parts(deserializer); + var var_effect = sse_decode_opt_String(deserializer); + var var_replyGuid = sse_decode_opt_String(deserializer); + var var_replyPart = sse_decode_opt_String(deserializer); + var var_service = sse_decode_message_type(deserializer); + var var_subject = sse_decode_opt_String(deserializer); + var var_app = sse_decode_opt_box_autoadd_extension_app(deserializer); + var var_linkMeta = sse_decode_opt_box_autoadd_link_meta(deserializer); + var var_voice = sse_decode_bool(deserializer); + var var_scheduled = sse_decode_opt_box_autoadd_schedule_mode(deserializer); + var var_embeddedProfile = sse_decode_opt_box_autoadd_share_profile_message( + deserializer, + ); + return NormalMessage( + parts: var_parts, + effect: var_effect, + replyGuid: var_replyGuid, + replyPart: var_replyPart, + service: var_service, + subject: var_subject, + app: var_app, + linkMeta: var_linkMeta, + voice: var_voice, + scheduled: var_scheduled, + embeddedProfile: var_embeddedProfile, + ); } @protected - IdmsMessage sse_decode_idms_message(SseDeserializer deserializer) { + NSAttributedString sse_decode_ns_attributed_string( + SseDeserializer deserializer, + ) { // Codec=Sse (Serialization based), see doc to use other codecs - - var tag_ = sse_decode_i_32(deserializer); - switch (tag_) { - case 0: - var var_field0 = - sse_decode_box_autoadd_idms_requested_sign_in(deserializer); - return IdmsMessage_RequestedSignIn(var_field0); - case 1: - var var_field0 = sse_decode_box_autoadd_teardown_sign_in(deserializer); - return IdmsMessage_TeardownSignIn(var_field0); - case 2: - var var_field0 = - sse_decode_box_autoadd_idms_circle_message(deserializer); - var var_field1 = - sse_decode_opt_box_autoadd_idms_requested_sign_in(deserializer); - return IdmsMessage_CircleRequest(var_field0, var_field1); - default: - throw UnimplementedError(''); - } + var var_text = sse_decode_String(deserializer); + var var_ranges = sse_decode_list_record_u_32_ns_dictionary_typed_coder( + deserializer, + ); + return NSAttributedString(text: var_text, ranges: var_ranges); } @protected - IdmsRequestedSignIn sse_decode_idms_requested_sign_in( - SseDeserializer deserializer) { + NSDictionaryClass sse_decode_ns_dictionary_class( + SseDeserializer deserializer, + ) { // Codec=Sse (Serialization based), see doc to use other codecs - var var_aps = sse_decode_aps_data(deserializer); - var var_txnid = sse_decode_String(deserializer); - var var_akdata = sse_decode_ak_data(deserializer); - var var_adsid = sse_decode_String(deserializer); - return IdmsRequestedSignIn( - aps: var_aps, txnid: var_txnid, akdata: var_akdata, adsid: var_adsid); + var inner = sse_decode_i_32(deserializer); + return NSDictionaryClass.values[inner]; } @protected - IndexedMessagePart sse_decode_indexed_message_part( - SseDeserializer deserializer) { + NSDictionaryTypedCoder sse_decode_ns_dictionary_typed_coder( + SseDeserializer deserializer, + ) { // Codec=Sse (Serialization based), see doc to use other codecs - var var_part_ = sse_decode_message_part(deserializer); - var var_idx = sse_decode_opt_CastedPrimitive_usize(deserializer); - var var_ext = sse_decode_opt_box_autoadd_part_extension(deserializer); - return IndexedMessagePart(part_: var_part_, idx: var_idx, ext: var_ext); + var var_field0 = + sse_decode_Map_String_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerStCollapsedValue( + deserializer, + ); + return NSDictionaryTypedCoder(field0: var_field0); } @protected - LetMeInRequest sse_decode_let_me_in_request(SseDeserializer deserializer) { + NSNumber sse_decode_ns_number(SseDeserializer deserializer) { // Codec=Sse (Serialization based), see doc to use other codecs - var var_sharedSecret = sse_decode_list_prim_u_8_strict(deserializer); - var var_pseud = sse_decode_String(deserializer); - var var_requestor = sse_decode_String(deserializer); - var var_nickname = sse_decode_opt_String(deserializer); - var var_token = sse_decode_list_prim_u_8_strict(deserializer); - var var_delegationUuid = sse_decode_opt_String(deserializer); - var var_usage = sse_decode_opt_String(deserializer); - return LetMeInRequest( - sharedSecret: var_sharedSecret, - pseud: var_pseud, - requestor: var_requestor, - nickname: var_nickname, - token: var_token, - delegationUuid: var_delegationUuid, - usage: var_usage); + var var_field0 = sse_decode_u_32(deserializer); + return NSNumber(field0: var_field0); } @protected - LinkMeta sse_decode_link_meta(SseDeserializer deserializer) { + NSString sse_decode_ns_string(SseDeserializer deserializer) { // Codec=Sse (Serialization based), see doc to use other codecs - var var_data = sse_decode_lp_link_metadata(deserializer); - var var_attachments = sse_decode_list_list_prim_u_8_strict(deserializer); - return LinkMeta(data: var_data, attachments: var_attachments); + var var_field0 = sse_decode_String(deserializer); + return NSString(field0: var_field0); } @protected - List - sse_decode_list_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerIDSUser( - SseDeserializer deserializer) { + NSURL sse_decode_nsurl(SseDeserializer deserializer) { // Codec=Sse (Serialization based), see doc to use other codecs - - var len_ = sse_decode_i_32(deserializer); - var ans_ = []; - for (var idx_ = 0; idx_ < len_; ++idx_) { - ans_.add( - sse_decode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerIDSUser( - deserializer)); - } - return ans_; + var var_base = sse_decode_String(deserializer); + var var_relative = sse_decode_String(deserializer); + return NSURL(base: var_base, relative: var_relative); } @protected - List - sse_decode_list_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerStCollapsedValue( - SseDeserializer deserializer) { + NumOrString sse_decode_num_or_string(SseDeserializer deserializer) { // Codec=Sse (Serialization based), see doc to use other codecs - var len_ = sse_decode_i_32(deserializer); - var ans_ = []; - for (var idx_ = 0; idx_ < len_; ++idx_) { - ans_.add( - sse_decode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerStCollapsedValue( - deserializer)); + var tag_ = sse_decode_i_32(deserializer); + switch (tag_) { + case 0: + var var_field0 = sse_decode_u_32(deserializer); + return NumOrString_Num(var_field0); + case 1: + var var_field0 = sse_decode_String(deserializer); + return NumOrString_String(var_field0); + case 2: + var var_field0 = sse_decode_bool(deserializer); + return NumOrString_Bool(var_field0); + default: + throw UnimplementedError(''); } - return ans_; } @protected - List - sse_decode_list_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerViableBottle( - SseDeserializer deserializer) { + OperatedChat sse_decode_operated_chat(SseDeserializer deserializer) { // Codec=Sse (Serialization based), see doc to use other codecs - - var len_ = sse_decode_i_32(deserializer); - var ans_ = []; - for (var idx_ = 0; idx_ < len_; ++idx_) { - ans_.add( - sse_decode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerViableBottle( - deserializer)); - } - return ans_; + var var_participants = sse_decode_list_String(deserializer); + var var_groupId = sse_decode_String(deserializer); + var var_guid = sse_decode_String(deserializer); + var var_deleteIncomingMessages = sse_decode_opt_box_autoadd_bool( + deserializer, + ); + var var_wasReportedAsJunk = sse_decode_opt_box_autoadd_bool(deserializer); + return OperatedChat( + participants: var_participants, + groupId: var_groupId, + guid: var_guid, + deleteIncomingMessages: var_deleteIncomingMessages, + wasReportedAsJunk: var_wasReportedAsJunk, + ); } @protected - List sse_decode_list_String(SseDeserializer deserializer) { + int? sse_decode_opt_CastedPrimitive_i_64(SseDeserializer deserializer) { // Codec=Sse (Serialization based), see doc to use other codecs - var len_ = sse_decode_i_32(deserializer); - var ans_ = []; - for (var idx_ = 0; idx_ < len_; ++idx_) { - ans_.add(sse_decode_String(deserializer)); + if (sse_decode_bool(deserializer)) { + return (sse_decode_CastedPrimitive_i_64(deserializer)); + } else { + return null; } - return ans_; } @protected - List sse_decode_list_cloud_participant( - SseDeserializer deserializer) { + int? sse_decode_opt_CastedPrimitive_u_64(SseDeserializer deserializer) { // Codec=Sse (Serialization based), see doc to use other codecs - var len_ = sse_decode_i_32(deserializer); - var ans_ = []; - for (var idx_ = 0; idx_ < len_; ++idx_) { - ans_.add(sse_decode_cloud_participant(deserializer)); + if (sse_decode_bool(deserializer)) { + return (sse_decode_CastedPrimitive_u_64(deserializer)); + } else { + return null; } - return ans_; } @protected - List sse_decode_list_dart_beacon(SseDeserializer deserializer) { + int? sse_decode_opt_CastedPrimitive_usize(SseDeserializer deserializer) { // Codec=Sse (Serialization based), see doc to use other codecs - var len_ = sse_decode_i_32(deserializer); - var ans_ = []; - for (var idx_ = 0; idx_ < len_; ++idx_) { - ans_.add(sse_decode_dart_beacon(deserializer)); + if (sse_decode_bool(deserializer)) { + return (sse_decode_CastedPrimitive_usize(deserializer)); + } else { + return null; } - return ans_; } @protected - List sse_decode_list_follow(SseDeserializer deserializer) { + String? sse_decode_opt_String(SseDeserializer deserializer) { // Codec=Sse (Serialization based), see doc to use other codecs - var len_ = sse_decode_i_32(deserializer); - var ans_ = []; - for (var idx_ = 0; idx_ < len_; ++idx_) { - ans_.add(sse_decode_follow(deserializer)); + if (sse_decode_bool(deserializer)) { + return (sse_decode_String(deserializer)); + } else { + return null; } - return ans_; } @protected - List sse_decode_list_found_device(SseDeserializer deserializer) { + ApsState? + sse_decode_opt_box_autoadd_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerAPSState( + SseDeserializer deserializer, + ) { // Codec=Sse (Serialization based), see doc to use other codecs - var len_ = sse_decode_i_32(deserializer); - var ans_ = []; - for (var idx_ = 0; idx_ < len_; ++idx_) { - ans_.add(sse_decode_found_device(deserializer)); + if (sse_decode_bool(deserializer)) { + return (sse_decode_box_autoadd_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerAPSState( + deserializer, + )); + } else { + return null; } - return ans_; } @protected - List sse_decode_list_ft_member(SseDeserializer deserializer) { + ArcCloudKitClientDefaultAnisetteProvider? + sse_decode_opt_box_autoadd_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcCloudKitClientDefaultAnisetteProvider( + SseDeserializer deserializer, + ) { // Codec=Sse (Serialization based), see doc to use other codecs - var len_ = sse_decode_i_32(deserializer); - var ans_ = []; - for (var idx_ = 0; idx_ < len_; ++idx_) { - ans_.add(sse_decode_ft_member(deserializer)); + if (sse_decode_bool(deserializer)) { + return (sse_decode_box_autoadd_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcCloudKitClientDefaultAnisetteProvider( + deserializer, + )); + } else { + return null; } - return ans_; } @protected - List sse_decode_list_ft_session(SseDeserializer deserializer) { + ArcCloudMessagesClientDefaultAnisetteProvider? + sse_decode_opt_box_autoadd_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcCloudMessagesClientDefaultAnisetteProvider( + SseDeserializer deserializer, + ) { // Codec=Sse (Serialization based), see doc to use other codecs - var len_ = sse_decode_i_32(deserializer); - var ans_ = []; - for (var idx_ = 0; idx_ < len_; ++idx_) { - ans_.add(sse_decode_ft_session(deserializer)); + if (sse_decode_bool(deserializer)) { + return (sse_decode_box_autoadd_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcCloudMessagesClientDefaultAnisetteProvider( + deserializer, + )); + } else { + return null; } - return ans_; } @protected - List sse_decode_list_group_summary_member( - SseDeserializer deserializer) { + ArcFindMyClientDefaultAnisetteProvider? + sse_decode_opt_box_autoadd_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcFindMyClientDefaultAnisetteProvider( + SseDeserializer deserializer, + ) { // Codec=Sse (Serialization based), see doc to use other codecs - var len_ = sse_decode_i_32(deserializer); - var ans_ = []; - for (var idx_ = 0; idx_ < len_; ++idx_) { - ans_.add(sse_decode_group_summary_member(deserializer)); + if (sse_decode_bool(deserializer)) { + return (sse_decode_box_autoadd_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcFindMyClientDefaultAnisetteProvider( + deserializer, + )); + } else { + return null; } - return ans_; } @protected - List sse_decode_list_indexed_message_part( - SseDeserializer deserializer) { + ArcKeychainClientDefaultAnisetteProvider? + sse_decode_opt_box_autoadd_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcKeychainClientDefaultAnisetteProvider( + SseDeserializer deserializer, + ) { // Codec=Sse (Serialization based), see doc to use other codecs - var len_ = sse_decode_i_32(deserializer); - var ans_ = []; - for (var idx_ = 0; idx_ < len_; ++idx_) { - ans_.add(sse_decode_indexed_message_part(deserializer)); + if (sse_decode_bool(deserializer)) { + return (sse_decode_box_autoadd_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcKeychainClientDefaultAnisetteProvider( + deserializer, + )); + } else { + return null; } - return ans_; } @protected - List sse_decode_list_list_prim_u_8_strict( - SseDeserializer deserializer) { + ArcMutexAppleAccountDefaultAnisetteProvider? + sse_decode_opt_box_autoadd_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcMutexAppleAccountDefaultAnisetteProvider( + SseDeserializer deserializer, + ) { // Codec=Sse (Serialization based), see doc to use other codecs - var len_ = sse_decode_i_32(deserializer); - var ans_ = []; - for (var idx_ = 0; idx_ < len_; ++idx_) { - ans_.add(sse_decode_list_prim_u_8_strict(deserializer)); + if (sse_decode_bool(deserializer)) { + return (sse_decode_box_autoadd_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcMutexAppleAccountDefaultAnisetteProvider( + deserializer, + )); + } else { + return null; } - return ans_; } @protected - List sse_decode_list_message_edit(SseDeserializer deserializer) { + ArcPasswordManagerDefaultAnisetteProvider? + sse_decode_opt_box_autoadd_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcPasswordManagerDefaultAnisetteProvider( + SseDeserializer deserializer, + ) { // Codec=Sse (Serialization based), see doc to use other codecs - var len_ = sse_decode_i_32(deserializer); - var ans_ = []; - for (var idx_ = 0; idx_ < len_; ++idx_) { - ans_.add(sse_decode_message_edit(deserializer)); + if (sse_decode_bool(deserializer)) { + return (sse_decode_box_autoadd_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcPasswordManagerDefaultAnisetteProvider( + deserializer, + )); + } else { + return null; } - return ans_; } @protected - List sse_decode_list_message_target( - SseDeserializer deserializer) { + Asset? + sse_decode_opt_box_autoadd_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerAsset( + SseDeserializer deserializer, + ) { // Codec=Sse (Serialization based), see doc to use other codecs - var len_ = sse_decode_i_32(deserializer); - var ans_ = []; - for (var idx_ = 0; idx_ < len_; ++idx_) { - ans_.add(sse_decode_message_target(deserializer)); + if (sse_decode_bool(deserializer)) { + return (sse_decode_box_autoadd_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerAsset( + deserializer, + )); + } else { + return null; } - return ans_; } @protected - List sse_decode_list_password_manager_alt_domain( - SseDeserializer deserializer) { + ChannelInterestToken? + sse_decode_opt_box_autoadd_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerChannelInterestToken( + SseDeserializer deserializer, + ) { // Codec=Sse (Serialization based), see doc to use other codecs - var len_ = sse_decode_i_32(deserializer); - var ans_ = []; - for (var idx_ = 0; idx_ < len_; ++idx_) { - ans_.add(sse_decode_password_manager_alt_domain(deserializer)); + if (sse_decode_bool(deserializer)) { + return (sse_decode_box_autoadd_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerChannelInterestToken( + deserializer, + )); + } else { + return null; } - return ans_; } @protected - List sse_decode_list_password_manager_meta_change( - SseDeserializer deserializer) { + CircleClientSessionDefaultAnisetteProvider? + sse_decode_opt_box_autoadd_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerCircleClientSessionDefaultAnisetteProvider( + SseDeserializer deserializer, + ) { // Codec=Sse (Serialization based), see doc to use other codecs - var len_ = sse_decode_i_32(deserializer); - var ans_ = []; - for (var idx_ = 0; idx_ < len_; ++idx_) { - ans_.add(sse_decode_password_manager_meta_change(deserializer)); + if (sse_decode_bool(deserializer)) { + return (sse_decode_box_autoadd_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerCircleClientSessionDefaultAnisetteProvider( + deserializer, + )); + } else { + return null; } - return ans_; } @protected - List sse_decode_list_photo_poster_layer( - SseDeserializer deserializer) { + CloudSyncPreparedMessageCreateHandle? + sse_decode_opt_box_autoadd_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerCloudSyncPreparedMessageCreateHandle( + SseDeserializer deserializer, + ) { // Codec=Sse (Serialization based), see doc to use other codecs - var len_ = sse_decode_i_32(deserializer); - var ans_ = []; - for (var idx_ = 0; idx_ < len_; ++idx_) { - ans_.add(sse_decode_photo_poster_layer(deserializer)); + if (sse_decode_bool(deserializer)) { + return (sse_decode_box_autoadd_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerCloudSyncPreparedMessageCreateHandle( + deserializer, + )); + } else { + return null; } - return ans_; } @protected - List sse_decode_list_poster_asset(SseDeserializer deserializer) { + ConversationLink? + sse_decode_opt_box_autoadd_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerConversationLink( + SseDeserializer deserializer, + ) { // Codec=Sse (Serialization based), see doc to use other codecs - var len_ = sse_decode_i_32(deserializer); - var ans_ = []; - for (var idx_ = 0; idx_ < len_; ++idx_) { - ans_.add(sse_decode_poster_asset(deserializer)); + if (sse_decode_bool(deserializer)) { + return (sse_decode_box_autoadd_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerConversationLink( + deserializer, + )); + } else { + return null; } - return ans_; } @protected - List sse_decode_list_poster_color(SseDeserializer deserializer) { + ConversationParticipant? + sse_decode_opt_box_autoadd_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerConversationParticipant( + SseDeserializer deserializer, + ) { // Codec=Sse (Serialization based), see doc to use other codecs - var len_ = sse_decode_i_32(deserializer); - var ans_ = []; - for (var idx_ = 0; idx_ < len_; ++idx_) { - ans_.add(sse_decode_poster_color(deserializer)); + if (sse_decode_bool(deserializer)) { + return (sse_decode_box_autoadd_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerConversationParticipant( + deserializer, + )); + } else { + return null; } - return ans_; - } - - @protected - Float64List sse_decode_list_prim_f_64_strict(SseDeserializer deserializer) { - // Codec=Sse (Serialization based), see doc to use other codecs - var len_ = sse_decode_i_32(deserializer); - return deserializer.buffer.getFloat64List(len_); } @protected - Int64List sse_decode_list_prim_i_64_strict(SseDeserializer deserializer) { + Date? + sse_decode_opt_box_autoadd_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerDate( + SseDeserializer deserializer, + ) { // Codec=Sse (Serialization based), see doc to use other codecs - var len_ = sse_decode_i_32(deserializer); - return deserializer.buffer.getInt64List(len_); - } - @protected - Uint32List sse_decode_list_prim_u_32_strict(SseDeserializer deserializer) { - // Codec=Sse (Serialization based), see doc to use other codecs - var len_ = sse_decode_i_32(deserializer); - return deserializer.buffer.getUint32List(len_); + if (sse_decode_bool(deserializer)) { + return (sse_decode_box_autoadd_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerDate( + deserializer, + )); + } else { + return null; + } } @protected - List sse_decode_list_prim_u_8_loose(SseDeserializer deserializer) { + GZipWrapperChatProto? + sse_decode_opt_box_autoadd_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerGZipWrapperChatProto( + SseDeserializer deserializer, + ) { // Codec=Sse (Serialization based), see doc to use other codecs - var len_ = sse_decode_i_32(deserializer); - return deserializer.buffer.getUint8List(len_); - } - @protected - Uint8List sse_decode_list_prim_u_8_strict(SseDeserializer deserializer) { - // Codec=Sse (Serialization based), see doc to use other codecs - var len_ = sse_decode_i_32(deserializer); - return deserializer.buffer.getUint8List(len_); + if (sse_decode_bool(deserializer)) { + return (sse_decode_box_autoadd_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerGZipWrapperChatProto( + deserializer, + )); + } else { + return null; + } } @protected - List sse_decode_list_private_device_info( - SseDeserializer deserializer) { + GZipWrapperMessageProto2? + sse_decode_opt_box_autoadd_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerGZipWrapperMessageProto2( + SseDeserializer deserializer, + ) { // Codec=Sse (Serialization based), see doc to use other codecs - var len_ = sse_decode_i_32(deserializer); - var ans_ = []; - for (var idx_ = 0; idx_ < len_; ++idx_) { - ans_.add(sse_decode_private_device_info(deserializer)); + if (sse_decode_bool(deserializer)) { + return (sse_decode_box_autoadd_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerGZipWrapperMessageProto2( + deserializer, + )); + } else { + return null; } - return ans_; } @protected - List<(String, Asset)> - sse_decode_list_record_string_auto_owned_rust_opaque_flutter_rust_bridgefor_generated_rust_auto_opaque_inner_asset( - SseDeserializer deserializer) { + GZipWrapperMessageProto3? + sse_decode_opt_box_autoadd_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerGZipWrapperMessageProto3( + SseDeserializer deserializer, + ) { // Codec=Sse (Serialization based), see doc to use other codecs - var len_ = sse_decode_i_32(deserializer); - var ans_ = <(String, Asset)>[]; - for (var idx_ = 0; idx_ < len_; ++idx_) { - ans_.add( - sse_decode_record_string_auto_owned_rust_opaque_flutter_rust_bridgefor_generated_rust_auto_opaque_inner_asset( - deserializer)); + if (sse_decode_bool(deserializer)) { + return (sse_decode_box_autoadd_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerGZipWrapperMessageProto3( + deserializer, + )); + } else { + return null; } - return ans_; } @protected - List<(String, StCollapsedValue)> - sse_decode_list_record_string_auto_owned_rust_opaque_flutter_rust_bridgefor_generated_rust_auto_opaque_inner_st_collapsed_value( - SseDeserializer deserializer) { + GZipWrapperMessageProto4? + sse_decode_opt_box_autoadd_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerGZipWrapperMessageProto4( + SseDeserializer deserializer, + ) { // Codec=Sse (Serialization based), see doc to use other codecs - var len_ = sse_decode_i_32(deserializer); - var ans_ = <(String, StCollapsedValue)>[]; - for (var idx_ = 0; idx_ < len_; ++idx_) { - ans_.add( - sse_decode_record_string_auto_owned_rust_opaque_flutter_rust_bridgefor_generated_rust_auto_opaque_inner_st_collapsed_value( - deserializer)); + if (sse_decode_bool(deserializer)) { + return (sse_decode_box_autoadd_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerGZipWrapperMessageProto4( + deserializer, + )); + } else { + return null; } - return ans_; } @protected - List<(String, bool)> sse_decode_list_record_string_bool( - SseDeserializer deserializer) { + IdsUser? + sse_decode_opt_box_autoadd_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerIDSUser( + SseDeserializer deserializer, + ) { // Codec=Sse (Serialization based), see doc to use other codecs - var len_ = sse_decode_i_32(deserializer); - var ans_ = <(String, bool)>[]; - for (var idx_ = 0; idx_ < len_; ++idx_) { - ans_.add(sse_decode_record_string_bool(deserializer)); + if (sse_decode_bool(deserializer)) { + return (sse_decode_box_autoadd_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerIDSUser( + deserializer, + )); + } else { + return null; } - return ans_; } @protected - List<(String, int)> sse_decode_list_record_string_casted_primitive_u_64( - SseDeserializer deserializer) { + LocationReport? + sse_decode_opt_box_autoadd_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerLocationReport( + SseDeserializer deserializer, + ) { // Codec=Sse (Serialization based), see doc to use other codecs - var len_ = sse_decode_i_32(deserializer); - var ans_ = <(String, int)>[]; - for (var idx_ = 0; idx_ < len_; ++idx_) { - ans_.add(sse_decode_record_string_casted_primitive_u_64(deserializer)); + if (sse_decode_bool(deserializer)) { + return (sse_decode_box_autoadd_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerLocationReport( + deserializer, + )); + } else { + return null; } - return ans_; } @protected - List<(String, CloudAttachment)> - sse_decode_list_record_string_cloud_attachment( - SseDeserializer deserializer) { + NsArrayLpIconMetadata? + sse_decode_opt_box_autoadd_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerNSArrayLPIconMetadata( + SseDeserializer deserializer, + ) { // Codec=Sse (Serialization based), see doc to use other codecs - var len_ = sse_decode_i_32(deserializer); - var ans_ = <(String, CloudAttachment)>[]; - for (var idx_ = 0; idx_ < len_; ++idx_) { - ans_.add(sse_decode_record_string_cloud_attachment(deserializer)); + if (sse_decode_bool(deserializer)) { + return (sse_decode_box_autoadd_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerNSArrayLPIconMetadata( + deserializer, + )); + } else { + return null; } - return ans_; } @protected - List<(String, CloudChat)> sse_decode_list_record_string_cloud_chat( - SseDeserializer deserializer) { + NsArrayLpImageMetadata? + sse_decode_opt_box_autoadd_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerNSArrayLPImageMetadata( + SseDeserializer deserializer, + ) { // Codec=Sse (Serialization based), see doc to use other codecs - var len_ = sse_decode_i_32(deserializer); - var ans_ = <(String, CloudChat)>[]; - for (var idx_ = 0; idx_ < len_; ++idx_) { - ans_.add(sse_decode_record_string_cloud_chat(deserializer)); + if (sse_decode_bool(deserializer)) { + return (sse_decode_box_autoadd_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerNSArrayLPImageMetadata( + deserializer, + )); + } else { + return null; } - return ans_; } @protected - List<(String, CloudMessage)> sse_decode_list_record_string_cloud_message( - SseDeserializer deserializer) { + PushError? + sse_decode_opt_box_autoadd_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerPushError( + SseDeserializer deserializer, + ) { // Codec=Sse (Serialization based), see doc to use other codecs - var len_ = sse_decode_i_32(deserializer); - var ans_ = <(String, CloudMessage)>[]; - for (var idx_ = 0; idx_ < len_; ++idx_) { - ans_.add(sse_decode_record_string_cloud_message(deserializer)); + if (sse_decode_bool(deserializer)) { + return (sse_decode_box_autoadd_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerPushError( + deserializer, + )); + } else { + return null; } - return ans_; } @protected - List<(String, FTParticipant)> sse_decode_list_record_string_ft_participant( - SseDeserializer deserializer) { + SavedHardwareState? + sse_decode_opt_box_autoadd_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerSavedHardwareState( + SseDeserializer deserializer, + ) { // Codec=Sse (Serialization based), see doc to use other codecs - var len_ = sse_decode_i_32(deserializer); - var ans_ = <(String, FTParticipant)>[]; - for (var idx_ = 0; idx_ < len_; ++idx_) { - ans_.add(sse_decode_record_string_ft_participant(deserializer)); + if (sse_decode_bool(deserializer)) { + return (sse_decode_box_autoadd_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerSavedHardwareState( + deserializer, + )); + } else { + return null; } - return ans_; } @protected - List<(String, GroupSummary)> sse_decode_list_record_string_group_summary( - SseDeserializer deserializer) { + SyncManagerDefaultAnisetteProviderMyFilePackager? + sse_decode_opt_box_autoadd_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerSyncManagerDefaultAnisetteProviderMyFilePackager( + SseDeserializer deserializer, + ) { // Codec=Sse (Serialization based), see doc to use other codecs - var len_ = sse_decode_i_32(deserializer); - var ans_ = <(String, GroupSummary)>[]; - for (var idx_ = 0; idx_ < len_; ++idx_) { - ans_.add(sse_decode_record_string_group_summary(deserializer)); + if (sse_decode_bool(deserializer)) { + return (sse_decode_box_autoadd_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerSyncManagerDefaultAnisetteProviderMyFilePackager( + deserializer, + )); + } else { + return null; } - return ans_; } @protected - List<(String, List)> - sse_decode_list_record_string_list_message_edit( - SseDeserializer deserializer) { + SystemTime? + sse_decode_opt_box_autoadd_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerSystemTime( + SseDeserializer deserializer, + ) { // Codec=Sse (Serialization based), see doc to use other codecs - var len_ = sse_decode_i_32(deserializer); - var ans_ = <(String, List)>[]; - for (var idx_ = 0; idx_ < len_; ++idx_) { - ans_.add(sse_decode_record_string_list_message_edit(deserializer)); + if (sse_decode_bool(deserializer)) { + return (sse_decode_box_autoadd_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerSystemTime( + deserializer, + )); + } else { + return null; } - return ans_; } @protected - List<(String, Uint8List)> sse_decode_list_record_string_list_prim_u_8_strict( - SseDeserializer deserializer) { + Address? sse_decode_opt_box_autoadd_address(SseDeserializer deserializer) { // Codec=Sse (Serialization based), see doc to use other codecs - var len_ = sse_decode_i_32(deserializer); - var ans_ = <(String, Uint8List)>[]; - for (var idx_ = 0; idx_ < len_; ++idx_) { - ans_.add(sse_decode_record_string_list_prim_u_8_strict(deserializer)); + if (sse_decode_bool(deserializer)) { + return (sse_decode_box_autoadd_address(deserializer)); + } else { + return null; } - return ans_; } @protected - List<(String, MessageEditRange)> - sse_decode_list_record_string_message_edit_range( - SseDeserializer deserializer) { + Attachment? sse_decode_opt_box_autoadd_attachment( + SseDeserializer deserializer, + ) { // Codec=Sse (Serialization based), see doc to use other codecs - var len_ = sse_decode_i_32(deserializer); - var ans_ = <(String, MessageEditRange)>[]; - for (var idx_ = 0; idx_ < len_; ++idx_) { - ans_.add(sse_decode_record_string_message_edit_range(deserializer)); + if (sse_decode_bool(deserializer)) { + return (sse_decode_box_autoadd_attachment(deserializer)); + } else { + return null; } - return ans_; } @protected - List<(String, CloudAttachment?)> - sse_decode_list_record_string_opt_box_autoadd_cloud_attachment( - SseDeserializer deserializer) { + AttachmentMetaExtra? sse_decode_opt_box_autoadd_attachment_meta_extra( + SseDeserializer deserializer, + ) { // Codec=Sse (Serialization based), see doc to use other codecs - var len_ = sse_decode_i_32(deserializer); - var ans_ = <(String, CloudAttachment?)>[]; - for (var idx_ = 0; idx_ < len_; ++idx_) { - ans_.add(sse_decode_record_string_opt_box_autoadd_cloud_attachment( - deserializer)); + if (sse_decode_bool(deserializer)) { + return (sse_decode_box_autoadd_attachment_meta_extra(deserializer)); + } else { + return null; } - return ans_; } @protected - List<(String, CloudChat?)> - sse_decode_list_record_string_opt_box_autoadd_cloud_chat( - SseDeserializer deserializer) { + Balloon? sse_decode_opt_box_autoadd_balloon(SseDeserializer deserializer) { // Codec=Sse (Serialization based), see doc to use other codecs - var len_ = sse_decode_i_32(deserializer); - var ans_ = <(String, CloudChat?)>[]; - for (var idx_ = 0; idx_ < len_; ++idx_) { - ans_.add( - sse_decode_record_string_opt_box_autoadd_cloud_chat(deserializer)); + if (sse_decode_bool(deserializer)) { + return (sse_decode_box_autoadd_balloon(deserializer)); + } else { + return null; } - return ans_; } @protected - List<(String, CloudMessage?)> - sse_decode_list_record_string_opt_box_autoadd_cloud_message( - SseDeserializer deserializer) { + BalloonLayout? sse_decode_opt_box_autoadd_balloon_layout( + SseDeserializer deserializer, + ) { // Codec=Sse (Serialization based), see doc to use other codecs - var len_ = sse_decode_i_32(deserializer); - var ans_ = <(String, CloudMessage?)>[]; - for (var idx_ = 0; idx_ < len_; ++idx_) { - ans_.add( - sse_decode_record_string_opt_box_autoadd_cloud_message(deserializer)); + if (sse_decode_bool(deserializer)) { + return (sse_decode_box_autoadd_balloon_layout(deserializer)); + } else { + return null; } - return ans_; } @protected - List<(String, PasswordManagerMetaDataCtx)> - sse_decode_list_record_string_password_manager_meta_data_ctx( - SseDeserializer deserializer) { + bool? sse_decode_opt_box_autoadd_bool(SseDeserializer deserializer) { // Codec=Sse (Serialization based), see doc to use other codecs - var len_ = sse_decode_i_32(deserializer); - var ans_ = <(String, PasswordManagerMetaDataCtx)>[]; - for (var idx_ = 0; idx_ < len_; ++idx_) { - ans_.add(sse_decode_record_string_password_manager_meta_data_ctx( - deserializer)); + if (sse_decode_bool(deserializer)) { + return (sse_decode_box_autoadd_bool(deserializer)); + } else { + return null; } - return ans_; } @protected - List<(String, (String?, Passkey))> - sse_decode_list_record_string_record_opt_string_passkey( - SseDeserializer deserializer) { + CertifiedContext? sse_decode_opt_box_autoadd_certified_context( + SseDeserializer deserializer, + ) { // Codec=Sse (Serialization based), see doc to use other codecs - var len_ = sse_decode_i_32(deserializer); - var ans_ = <(String, (String?, Passkey))>[]; - for (var idx_ = 0; idx_ < len_; ++idx_) { - ans_.add( - sse_decode_record_string_record_opt_string_passkey(deserializer)); + if (sse_decode_bool(deserializer)) { + return (sse_decode_box_autoadd_certified_context(deserializer)); + } else { + return null; } - return ans_; } @protected - List<(String, (String?, PasswordManagerMeta))> - sse_decode_list_record_string_record_opt_string_password_manager_meta( - SseDeserializer deserializer) { + CloudAttachment? sse_decode_opt_box_autoadd_cloud_attachment( + SseDeserializer deserializer, + ) { // Codec=Sse (Serialization based), see doc to use other codecs - var len_ = sse_decode_i_32(deserializer); - var ans_ = <(String, (String?, PasswordManagerMeta))>[]; - for (var idx_ = 0; idx_ < len_; ++idx_) { - ans_.add(sse_decode_record_string_record_opt_string_password_manager_meta( - deserializer)); + if (sse_decode_bool(deserializer)) { + return (sse_decode_box_autoadd_cloud_attachment(deserializer)); + } else { + return null; } - return ans_; } @protected - List<(String, (String?, PasswordRawEntry))> - sse_decode_list_record_string_record_opt_string_password_raw_entry( - SseDeserializer deserializer) { + CloudChat? sse_decode_opt_box_autoadd_cloud_chat( + SseDeserializer deserializer, + ) { // Codec=Sse (Serialization based), see doc to use other codecs - var len_ = sse_decode_i_32(deserializer); - var ans_ = <(String, (String?, PasswordRawEntry))>[]; - for (var idx_ = 0; idx_ < len_; ++idx_) { - ans_.add(sse_decode_record_string_record_opt_string_password_raw_entry( - deserializer)); + if (sse_decode_bool(deserializer)) { + return (sse_decode_box_autoadd_cloud_chat(deserializer)); + } else { + return null; } - return ans_; } @protected - List<(String, (String?, WifiPassword))> - sse_decode_list_record_string_record_opt_string_wifi_password( - SseDeserializer deserializer) { + CloudMessage? sse_decode_opt_box_autoadd_cloud_message( + SseDeserializer deserializer, + ) { // Codec=Sse (Serialization based), see doc to use other codecs - var len_ = sse_decode_i_32(deserializer); - var ans_ = <(String, (String?, WifiPassword))>[]; - for (var idx_ = 0; idx_ < len_; ++idx_) { - ans_.add(sse_decode_record_string_record_opt_string_wifi_password( - deserializer)); + if (sse_decode_bool(deserializer)) { + return (sse_decode_box_autoadd_cloud_message(deserializer)); + } else { + return null; } - return ans_; } @protected - List<(String, ShareInviteContentData)> - sse_decode_list_record_string_share_invite_content_data( - SseDeserializer deserializer) { + CloudProp? sse_decode_opt_box_autoadd_cloud_prop( + SseDeserializer deserializer, + ) { // Codec=Sse (Serialization based), see doc to use other codecs - var len_ = sse_decode_i_32(deserializer); - var ans_ = <(String, ShareInviteContentData)>[]; - for (var idx_ = 0; idx_ < len_; ++idx_) { - ans_.add( - sse_decode_record_string_share_invite_content_data(deserializer)); + if (sse_decode_bool(deserializer)) { + return (sse_decode_box_autoadd_cloud_prop(deserializer)); + } else { + return null; } - return ans_; } @protected - List<(String, StatusKitPersonalConfig)> - sse_decode_list_record_string_status_kit_personal_config( - SseDeserializer deserializer) { + CloudSyncOutboundFailureClass? + sse_decode_opt_box_autoadd_cloud_sync_outbound_failure_class( + SseDeserializer deserializer, + ) { // Codec=Sse (Serialization based), see doc to use other codecs - var len_ = sse_decode_i_32(deserializer); - var ans_ = <(String, StatusKitPersonalConfig)>[]; - for (var idx_ = 0; idx_ < len_; ++idx_) { - ans_.add( - sse_decode_record_string_status_kit_personal_config(deserializer)); + if (sse_decode_bool(deserializer)) { + return (sse_decode_box_autoadd_cloud_sync_outbound_failure_class( + deserializer, + )); + } else { + return null; } - return ans_; } @protected - List<(String, String)> sse_decode_list_record_string_string( - SseDeserializer deserializer) { + CloudSyncOutboundReconcileDisposition? + sse_decode_opt_box_autoadd_cloud_sync_outbound_reconcile_disposition( + SseDeserializer deserializer, + ) { // Codec=Sse (Serialization based), see doc to use other codecs - var len_ = sse_decode_i_32(deserializer); - var ans_ = <(String, String)>[]; - for (var idx_ = 0; idx_ < len_; ++idx_) { - ans_.add(sse_decode_record_string_string(deserializer)); + if (sse_decode_bool(deserializer)) { + return (sse_decode_box_autoadd_cloud_sync_outbound_reconcile_disposition( + deserializer, + )); + } else { + return null; } - return ans_; } @protected - List<(String, SyncStatus)> sse_decode_list_record_string_sync_status( - SseDeserializer deserializer) { + CloudSyncOutboundSafeCode? + sse_decode_opt_box_autoadd_cloud_sync_outbound_safe_code( + SseDeserializer deserializer, + ) { // Codec=Sse (Serialization based), see doc to use other codecs - var len_ = sse_decode_i_32(deserializer); - var ans_ = <(String, SyncStatus)>[]; - for (var idx_ = 0; idx_ < len_; ++idx_) { - ans_.add(sse_decode_record_string_sync_status(deserializer)); + if (sse_decode_bool(deserializer)) { + return (sse_decode_box_autoadd_cloud_sync_outbound_safe_code( + deserializer, + )); + } else { + return null; } - return ans_; } @protected - List<(int, NSDictionaryTypedCoder)> - sse_decode_list_record_u_32_ns_dictionary_typed_coder( - SseDeserializer deserializer) { + CloudSyncProtectedFailure? + sse_decode_opt_box_autoadd_cloud_sync_protected_failure( + SseDeserializer deserializer, + ) { // Codec=Sse (Serialization based), see doc to use other codecs - var len_ = sse_decode_i_32(deserializer); - var ans_ = <(int, NSDictionaryTypedCoder)>[]; - for (var idx_ = 0; idx_ < len_; ++idx_) { - ans_.add(sse_decode_record_u_32_ns_dictionary_typed_coder(deserializer)); + if (sse_decode_bool(deserializer)) { + return (sse_decode_box_autoadd_cloud_sync_protected_failure( + deserializer, + )); + } else { + return null; } - return ans_; } @protected - List sse_decode_list_report_message( - SseDeserializer deserializer) { + CloudSyncProtectedGarbageCollection? + sse_decode_opt_box_autoadd_cloud_sync_protected_garbage_collection( + SseDeserializer deserializer, + ) { // Codec=Sse (Serialization based), see doc to use other codecs - var len_ = sse_decode_i_32(deserializer); - var ans_ = []; - for (var idx_ = 0; idx_ < len_; ++idx_) { - ans_.add(sse_decode_report_message(deserializer)); + if (sse_decode_bool(deserializer)) { + return (sse_decode_box_autoadd_cloud_sync_protected_garbage_collection( + deserializer, + )); + } else { + return null; } - return ans_; } @protected - List sse_decode_list_shared_album(SseDeserializer deserializer) { + CloudSyncProtectedOutboundStage? + sse_decode_opt_box_autoadd_cloud_sync_protected_outbound_stage( + SseDeserializer deserializer, + ) { // Codec=Sse (Serialization based), see doc to use other codecs - var len_ = sse_decode_i_32(deserializer); - var ans_ = []; - for (var idx_ = 0; idx_ < len_; ++idx_) { - ans_.add(sse_decode_shared_album(deserializer)); + if (sse_decode_bool(deserializer)) { + return (sse_decode_box_autoadd_cloud_sync_protected_outbound_stage( + deserializer, + )); + } else { + return null; } - return ans_; } @protected - List sse_decode_list_trusted_phone_number( - SseDeserializer deserializer) { + CloudSyncProtectedPage? sse_decode_opt_box_autoadd_cloud_sync_protected_page( + SseDeserializer deserializer, + ) { // Codec=Sse (Serialization based), see doc to use other codecs - var len_ = sse_decode_i_32(deserializer); - var ans_ = []; - for (var idx_ = 0; idx_ < len_; ++idx_) { - ans_.add(sse_decode_trusted_phone_number(deserializer)); + if (sse_decode_bool(deserializer)) { + return (sse_decode_box_autoadd_cloud_sync_protected_page(deserializer)); + } else { + return null; } - return ans_; } @protected - List sse_decode_list_ui_color(SseDeserializer deserializer) { + CloudSyncProtectedPreflightCode? + sse_decode_opt_box_autoadd_cloud_sync_protected_preflight_code( + SseDeserializer deserializer, + ) { // Codec=Sse (Serialization based), see doc to use other codecs - var len_ = sse_decode_i_32(deserializer); - var ans_ = []; - for (var idx_ = 0; idx_ < len_; ++idx_) { - ans_.add(sse_decode_ui_color(deserializer)); + if (sse_decode_bool(deserializer)) { + return (sse_decode_box_autoadd_cloud_sync_protected_preflight_code( + deserializer, + )); + } else { + return null; } - return ans_; } @protected - Location sse_decode_location(SseDeserializer deserializer) { + CloudSyncProtectedRecovery? + sse_decode_opt_box_autoadd_cloud_sync_protected_recovery( + SseDeserializer deserializer, + ) { // Codec=Sse (Serialization based), see doc to use other codecs - var var_address = sse_decode_opt_box_autoadd_address(deserializer); - var var_altitude = sse_decode_f_64(deserializer); - var var_floorLevel = sse_decode_i_64(deserializer); - var var_horizontalAccuracy = sse_decode_f_64(deserializer); - var var_isInaccurate = sse_decode_bool(deserializer); - var var_latitude = sse_decode_f_64(deserializer); - var var_locationId = sse_decode_opt_String(deserializer); - var var_locationTimestamp = sse_decode_opt_box_autoadd_i_64(deserializer); - var var_longitude = sse_decode_f_64(deserializer); - var var_secureLocationTs = sse_decode_i_64(deserializer); - var var_timestamp = sse_decode_i_64(deserializer); - var var_verticalAccuracy = sse_decode_f_64(deserializer); - var var_positionType = sse_decode_opt_String(deserializer); - var var_isOld = sse_decode_opt_box_autoadd_bool(deserializer); - var var_locationFinished = sse_decode_opt_box_autoadd_bool(deserializer); - return Location( - address: var_address, - altitude: var_altitude, - floorLevel: var_floorLevel, - horizontalAccuracy: var_horizontalAccuracy, - isInaccurate: var_isInaccurate, - latitude: var_latitude, - locationId: var_locationId, - locationTimestamp: var_locationTimestamp, - longitude: var_longitude, - secureLocationTs: var_secureLocationTs, - timestamp: var_timestamp, - verticalAccuracy: var_verticalAccuracy, - positionType: var_positionType, - isOld: var_isOld, - locationFinished: var_locationFinished); + + if (sse_decode_bool(deserializer)) { + return (sse_decode_box_autoadd_cloud_sync_protected_recovery( + deserializer, + )); + } else { + return null; + } } @protected - LoginState sse_decode_login_state(SseDeserializer deserializer) { + CloudSyncRawFailure? sse_decode_opt_box_autoadd_cloud_sync_raw_failure( + SseDeserializer deserializer, + ) { // Codec=Sse (Serialization based), see doc to use other codecs - var tag_ = sse_decode_i_32(deserializer); - switch (tag_) { - case 0: - return LoginState_LoggedIn(); - case 1: - return LoginState_NeedsDevice2FA(); - case 2: - return LoginState_Needs2FAVerification(); - case 3: - return LoginState_NeedsSMS2FA(); - case 4: - var var_field0 = - sse_decode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerVerifyBody( - deserializer); - return LoginState_NeedsSMS2FAVerification(var_field0); - case 5: - var var_field0 = sse_decode_String(deserializer); - return LoginState_NeedsExtraStep(var_field0); - case 6: - return LoginState_NeedsLogin(); - default: - throw UnimplementedError(''); + if (sse_decode_bool(deserializer)) { + return (sse_decode_box_autoadd_cloud_sync_raw_failure(deserializer)); + } else { + return null; } } @protected - LPIconMetadata sse_decode_lp_icon_metadata(SseDeserializer deserializer) { + CloudSyncRawPage? sse_decode_opt_box_autoadd_cloud_sync_raw_page( + SseDeserializer deserializer, + ) { // Codec=Sse (Serialization based), see doc to use other codecs - var var_url = sse_decode_nsurl(deserializer); - var var_version = sse_decode_u_8(deserializer); - return LPIconMetadata(url: var_url, version: var_version); + + if (sse_decode_bool(deserializer)) { + return (sse_decode_box_autoadd_cloud_sync_raw_page(deserializer)); + } else { + return null; + } } @protected - LPImageMetadata sse_decode_lp_image_metadata(SseDeserializer deserializer) { + CloudSyncRawSystemFields? + sse_decode_opt_box_autoadd_cloud_sync_raw_system_fields( + SseDeserializer deserializer, + ) { // Codec=Sse (Serialization based), see doc to use other codecs - var var_size = sse_decode_String(deserializer); - var var_url = sse_decode_nsurl(deserializer); - var var_version = sse_decode_u_8(deserializer); - return LPImageMetadata(size: var_size, url: var_url, version: var_version); + + if (sse_decode_bool(deserializer)) { + return (sse_decode_box_autoadd_cloud_sync_raw_system_fields( + deserializer, + )); + } else { + return null; + } } @protected - LPLinkMetadata sse_decode_lp_link_metadata(SseDeserializer deserializer) { + CloudSyncTransientAttachmentPayload? + sse_decode_opt_box_autoadd_cloud_sync_transient_attachment_payload( + SseDeserializer deserializer, + ) { // Codec=Sse (Serialization based), see doc to use other codecs - var var_imageMetadata = - sse_decode_opt_box_autoadd_lp_image_metadata(deserializer); - var var_version = sse_decode_u_8(deserializer); - var var_iconMetadata = - sse_decode_opt_box_autoadd_lp_icon_metadata(deserializer); - var var_originalUrl = sse_decode_opt_box_autoadd_nsurl(deserializer); - var var_url = sse_decode_opt_box_autoadd_nsurl(deserializer); - var var_title = sse_decode_opt_String(deserializer); - var var_summary = sse_decode_opt_String(deserializer); - var var_image = - sse_decode_opt_box_autoadd_rich_link_image_attachment_substitute( - deserializer); - var var_icon = - sse_decode_opt_box_autoadd_rich_link_image_attachment_substitute( - deserializer); - var var_images = - sse_decode_opt_box_autoadd_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerNSArrayLPImageMetadata( - deserializer); - var var_icons = - sse_decode_opt_box_autoadd_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerNSArrayLPIconMetadata( - deserializer); - var var_isIncomplete = sse_decode_opt_box_autoadd_bool(deserializer); - var var_usesActivityPub = sse_decode_opt_box_autoadd_bool(deserializer); - var var_isEncodedForLocalUse = - sse_decode_opt_box_autoadd_bool(deserializer); - var var_collaborationType = sse_decode_opt_box_autoadd_u_32(deserializer); - var var_specialization2 = - sse_decode_opt_box_autoadd_lp_specialization_metadata(deserializer); - return LPLinkMetadata( - imageMetadata: var_imageMetadata, - version: var_version, - iconMetadata: var_iconMetadata, - originalUrl: var_originalUrl, - url: var_url, - title: var_title, - summary: var_summary, - image: var_image, - icon: var_icon, - images: var_images, - icons: var_icons, - isIncomplete: var_isIncomplete, - usesActivityPub: var_usesActivityPub, - isEncodedForLocalUse: var_isEncodedForLocalUse, - collaborationType: var_collaborationType, - specialization2: var_specialization2); + + if (sse_decode_bool(deserializer)) { + return (sse_decode_box_autoadd_cloud_sync_transient_attachment_payload( + deserializer, + )); + } else { + return null; + } } @protected - LPSpecializationMetadata sse_decode_lp_specialization_metadata( - SseDeserializer deserializer) { + CloudSyncTransientChatPayload? + sse_decode_opt_box_autoadd_cloud_sync_transient_chat_payload( + SseDeserializer deserializer, + ) { // Codec=Sse (Serialization based), see doc to use other codecs - var tag_ = sse_decode_i_32(deserializer); - switch (tag_) { - case 0: - var var_groupName = sse_decode_String(deserializer); - var var_urlParameters = sse_decode_String(deserializer); - return LPSpecializationMetadata_LPPasswordsInviteMetadata( - groupName: var_groupName, urlParameters: var_urlParameters); - default: - throw UnimplementedError(''); + if (sse_decode_bool(deserializer)) { + return (sse_decode_box_autoadd_cloud_sync_transient_chat_payload( + deserializer, + )); + } else { + return null; } } @protected - MemojiData sse_decode_memoji_data(SseDeserializer deserializer) { + CloudSyncTransientDeferredReason? + sse_decode_opt_box_autoadd_cloud_sync_transient_deferred_reason( + SseDeserializer deserializer, + ) { // Codec=Sse (Serialization based), see doc to use other codecs - var var_backgroundColorDescription = sse_decode_poster_color(deserializer); - var var_avatarRecordData = sse_decode_list_prim_u_8_strict(deserializer); - var var_avatarPoseData = sse_decode_list_prim_u_8_strict(deserializer); - var var_hasBody = sse_decode_bool(deserializer); - var var_avatarImageData = sse_decode_list_prim_u_8_strict(deserializer); - return MemojiData( - backgroundColorDescription: var_backgroundColorDescription, - avatarRecordData: var_avatarRecordData, - avatarPoseData: var_avatarPoseData, - hasBody: var_hasBody, - avatarImageData: var_avatarImageData); + + if (sse_decode_bool(deserializer)) { + return (sse_decode_box_autoadd_cloud_sync_transient_deferred_reason( + deserializer, + )); + } else { + return null; + } } @protected - Message sse_decode_message(SseDeserializer deserializer) { + CloudSyncTransientEntityKind? + sse_decode_opt_box_autoadd_cloud_sync_transient_entity_kind( + SseDeserializer deserializer, + ) { // Codec=Sse (Serialization based), see doc to use other codecs - var tag_ = sse_decode_i_32(deserializer); - switch (tag_) { - case 0: - var var_field0 = sse_decode_box_autoadd_normal_message(deserializer); - return Message_Message(var_field0); - case 1: - var var_field0 = sse_decode_box_autoadd_rename_message(deserializer); - return Message_RenameMessage(var_field0); - case 2: - var var_field0 = - sse_decode_box_autoadd_change_participant_message(deserializer); - return Message_ChangeParticipants(var_field0); - case 3: - var var_field0 = sse_decode_box_autoadd_react_message(deserializer); - return Message_React(var_field0); - case 4: - return Message_Delivered(); - case 5: - return Message_Read(); - case 6: - var var_field0 = sse_decode_bool(deserializer); - var var_field1 = sse_decode_opt_box_autoadd_typing_app(deserializer); - return Message_Typing(var_field0, var_field1); - case 7: - var var_field0 = sse_decode_box_autoadd_unsend_message(deserializer); - return Message_Unsend(var_field0); - case 8: - var var_field0 = sse_decode_box_autoadd_edit_message(deserializer); - return Message_Edit(var_field0); - case 9: - var var_field0 = - sse_decode_box_autoadd_icon_change_message(deserializer); - return Message_IconChange(var_field0); - case 10: - var var_field0 = sse_decode_bool(deserializer); - return Message_EnableSmsActivation(var_field0); - case 11: - return Message_MessageReadOnDevice(); - case 12: - var var_field0 = sse_decode_bool(deserializer); - return Message_SmsConfirmSent(var_field0); - case 13: - return Message_MarkUnread(); - case 14: - return Message_PeerCacheInvalidate(); - case 15: - var var_field0 = - sse_decode_box_autoadd_update_extension_message(deserializer); - return Message_UpdateExtension(var_field0); - case 16: - var var_field0 = sse_decode_box_autoadd_error_message(deserializer); - return Message_Error(var_field0); - case 17: - var var_field0 = - sse_decode_box_autoadd_move_to_recycle_bin_message(deserializer); - return Message_MoveToRecycleBin(var_field0); - case 18: - var var_field0 = sse_decode_box_autoadd_operated_chat(deserializer); - return Message_RecoverChat(var_field0); - case 19: - var var_field0 = - sse_decode_box_autoadd_permanent_delete_message(deserializer); - return Message_PermanentDelete(var_field0); - case 20: - return Message_Unschedule(); - case 21: - var var_field0 = - sse_decode_box_autoadd_update_profile_message(deserializer); - return Message_UpdateProfile(var_field0); - case 22: - var var_field0 = - sse_decode_box_autoadd_update_profile_sharing_message(deserializer); - return Message_UpdateProfileSharing(var_field0); - case 23: - var var_field0 = - sse_decode_box_autoadd_share_profile_message(deserializer); - return Message_ShareProfile(var_field0); - case 24: - return Message_NotifyAnyways(); - case 25: - var var_field0 = - sse_decode_box_autoadd_set_transcript_background_message( - deserializer); - return Message_SetTranscriptBackground(var_field0); - default: - throw UnimplementedError(''); + if (sse_decode_bool(deserializer)) { + return (sse_decode_box_autoadd_cloud_sync_transient_entity_kind( + deserializer, + )); + } else { + return null; + } + } + + @protected + CloudSyncTransientFailureCode? + sse_decode_opt_box_autoadd_cloud_sync_transient_failure_code( + SseDeserializer deserializer, + ) { + // Codec=Sse (Serialization based), see doc to use other codecs + + if (sse_decode_bool(deserializer)) { + return (sse_decode_box_autoadd_cloud_sync_transient_failure_code( + deserializer, + )); + } else { + return null; } } @protected - MessageEdit sse_decode_message_edit(SseDeserializer deserializer) { + CloudSyncTransientGroupPhotoPayload? + sse_decode_opt_box_autoadd_cloud_sync_transient_group_photo_payload( + SseDeserializer deserializer, + ) { // Codec=Sse (Serialization based), see doc to use other codecs - var var_t = sse_decode_list_prim_u_8_strict(deserializer); - var var_d = sse_decode_f_64(deserializer); - var var_bcg = sse_decode_opt_String(deserializer); - return MessageEdit(t: var_t, d: var_d, bcg: var_bcg); + + if (sse_decode_bool(deserializer)) { + return (sse_decode_box_autoadd_cloud_sync_transient_group_photo_payload( + deserializer, + )); + } else { + return null; + } } @protected - MessageEditRange sse_decode_message_edit_range(SseDeserializer deserializer) { + CloudSyncTransientMessagePayload? + sse_decode_opt_box_autoadd_cloud_sync_transient_message_payload( + SseDeserializer deserializer, + ) { // Codec=Sse (Serialization based), see doc to use other codecs - var var_lo = sse_decode_u_32(deserializer); - var var_le = sse_decode_u_32(deserializer); - return MessageEditRange(lo: var_lo, le: var_le); + + if (sse_decode_bool(deserializer)) { + return (sse_decode_box_autoadd_cloud_sync_transient_message_payload( + deserializer, + )); + } else { + return null; + } } @protected - MessageInst sse_decode_message_inst(SseDeserializer deserializer) { + CloudSyncTransientMutationKind? + sse_decode_opt_box_autoadd_cloud_sync_transient_mutation_kind( + SseDeserializer deserializer, + ) { // Codec=Sse (Serialization based), see doc to use other codecs - var var_id = sse_decode_String(deserializer); - var var_sender = sse_decode_opt_String(deserializer); - var var_conversation = - sse_decode_opt_box_autoadd_conversation_data(deserializer); - var var_message = sse_decode_message(deserializer); - var var_sentTimestamp = sse_decode_CastedPrimitive_u_64(deserializer); - var var_target = sse_decode_opt_list_message_target(deserializer); - var var_sendDelivered = sse_decode_bool(deserializer); - var var_verificationFailed = sse_decode_bool(deserializer); - var var_certifiedContext = - sse_decode_opt_box_autoadd_certified_context(deserializer); - return MessageInst( - id: var_id, - sender: var_sender, - conversation: var_conversation, - message: var_message, - sentTimestamp: var_sentTimestamp, - target: var_target, - sendDelivered: var_sendDelivered, - verificationFailed: var_verificationFailed, - certifiedContext: var_certifiedContext); + + if (sse_decode_bool(deserializer)) { + return (sse_decode_box_autoadd_cloud_sync_transient_mutation_kind( + deserializer, + )); + } else { + return null; + } } @protected - MessagePart sse_decode_message_part(SseDeserializer deserializer) { + CloudSyncTransientPayload? + sse_decode_opt_box_autoadd_cloud_sync_transient_payload( + SseDeserializer deserializer, + ) { // Codec=Sse (Serialization based), see doc to use other codecs - var tag_ = sse_decode_i_32(deserializer); - switch (tag_) { - case 0: - var var_field0 = sse_decode_String(deserializer); - var var_field1 = sse_decode_box_autoadd_text_format(deserializer); - return MessagePart_Text(var_field0, var_field1); - case 1: - var var_field0 = sse_decode_box_autoadd_attachment(deserializer); - return MessagePart_Attachment(var_field0); - case 2: - var var_field0 = sse_decode_String(deserializer); - var var_field1 = sse_decode_String(deserializer); - return MessagePart_Mention(var_field0, var_field1); - case 3: - var var_field0 = sse_decode_String(deserializer); - return MessagePart_Object(var_field0); - default: - throw UnimplementedError(''); + if (sse_decode_bool(deserializer)) { + return (sse_decode_box_autoadd_cloud_sync_transient_payload( + deserializer, + )); + } else { + return null; } } @protected - MessageParts sse_decode_message_parts(SseDeserializer deserializer) { + CloudSyncTransientQuarantineReason? + sse_decode_opt_box_autoadd_cloud_sync_transient_quarantine_reason( + SseDeserializer deserializer, + ) { // Codec=Sse (Serialization based), see doc to use other codecs - var var_field0 = sse_decode_list_indexed_message_part(deserializer); - return MessageParts(field0: var_field0); + + if (sse_decode_bool(deserializer)) { + return (sse_decode_box_autoadd_cloud_sync_transient_quarantine_reason( + deserializer, + )); + } else { + return null; + } } @protected - MessageProto sse_decode_message_proto(SseDeserializer deserializer) { + CloudSyncTransientReactionKind? + sse_decode_opt_box_autoadd_cloud_sync_transient_reaction_kind( + SseDeserializer deserializer, + ) { // Codec=Sse (Serialization based), see doc to use other codecs - var var_unk1 = sse_decode_u_32(deserializer); - var var_subject = sse_decode_opt_String(deserializer); - var var_text = sse_decode_opt_String(deserializer); - var var_attributedBody = sse_decode_opt_list_prim_u_8_strict(deserializer); - var var_balloonBundleId = sse_decode_opt_String(deserializer); - var var_payloadData = sse_decode_opt_list_prim_u_8_strict(deserializer); - var var_messageSummaryInfo = - sse_decode_opt_list_prim_u_8_strict(deserializer); - var var_effect = sse_decode_opt_String(deserializer); - var var_dateRead = sse_decode_opt_CastedPrimitive_u_64(deserializer); - var var_unk10 = sse_decode_opt_box_autoadd_u_32(deserializer); - var var_unk11 = sse_decode_opt_box_autoadd_u_32(deserializer); - var var_dateDelivered = sse_decode_opt_CastedPrimitive_u_64(deserializer); - var var_unk14 = sse_decode_opt_box_autoadd_u_32(deserializer); - var var_associatedMessageType = - sse_decode_opt_box_autoadd_u_32(deserializer); - var var_associatedMessageGuid = sse_decode_opt_String(deserializer); - var var_associatedMessageRangeLocation = - sse_decode_opt_box_autoadd_u_32(deserializer); - var var_associatedMessageRangeLength = - sse_decode_opt_box_autoadd_u_32(deserializer); - return MessageProto( - unk1: var_unk1, - subject: var_subject, - text: var_text, - attributedBody: var_attributedBody, - balloonBundleId: var_balloonBundleId, - payloadData: var_payloadData, - messageSummaryInfo: var_messageSummaryInfo, - effect: var_effect, - dateRead: var_dateRead, - unk10: var_unk10, - unk11: var_unk11, - dateDelivered: var_dateDelivered, - unk14: var_unk14, - associatedMessageType: var_associatedMessageType, - associatedMessageGuid: var_associatedMessageGuid, - associatedMessageRangeLocation: var_associatedMessageRangeLocation, - associatedMessageRangeLength: var_associatedMessageRangeLength); + + if (sse_decode_bool(deserializer)) { + return (sse_decode_box_autoadd_cloud_sync_transient_reaction_kind( + deserializer, + )); + } else { + return null; + } } @protected - MessageProto2 sse_decode_message_proto_2(SseDeserializer deserializer) { + CloudSyncTransientSnapshot? + sse_decode_opt_box_autoadd_cloud_sync_transient_snapshot( + SseDeserializer deserializer, + ) { // Codec=Sse (Serialization based), see doc to use other codecs - var var_reply = sse_decode_opt_String(deserializer); - return MessageProto2(reply: var_reply); + + if (sse_decode_bool(deserializer)) { + return (sse_decode_box_autoadd_cloud_sync_transient_snapshot( + deserializer, + )); + } else { + return null; + } } @protected - MessageProto3 sse_decode_message_proto_3(SseDeserializer deserializer) { + CloudSyncTransientTombstone? + sse_decode_opt_box_autoadd_cloud_sync_transient_tombstone( + SseDeserializer deserializer, + ) { // Codec=Sse (Serialization based), see doc to use other codecs - var var_unk2 = sse_decode_opt_box_autoadd_u_32(deserializer); - var var_unk3 = sse_decode_opt_box_autoadd_u_32(deserializer); - return MessageProto3(unk2: var_unk2, unk3: var_unk3); + + if (sse_decode_bool(deserializer)) { + return (sse_decode_box_autoadd_cloud_sync_transient_tombstone( + deserializer, + )); + } else { + return null; + } } @protected - MessageProto4 sse_decode_message_proto_4(SseDeserializer deserializer) { + ConversationData? sse_decode_opt_box_autoadd_conversation_data( + SseDeserializer deserializer, + ) { // Codec=Sse (Serialization based), see doc to use other codecs - var var_associatedMessageEmoji = sse_decode_opt_String(deserializer); - var var_service = sse_decode_opt_String(deserializer); - var var_scheduleType = sse_decode_opt_box_autoadd_u_32(deserializer); - var var_scheduleState = sse_decode_opt_box_autoadd_u_32(deserializer); - var var_groupId = sse_decode_opt_String(deserializer); - var var_sentOrReceivedOffGrid = - sse_decode_opt_box_autoadd_u_32(deserializer); - return MessageProto4( - associatedMessageEmoji: var_associatedMessageEmoji, - service: var_service, - scheduleType: var_scheduleType, - scheduleState: var_scheduleState, - groupId: var_groupId, - sentOrReceivedOffGrid: var_sentOrReceivedOffGrid); + + if (sse_decode_bool(deserializer)) { + return (sse_decode_box_autoadd_conversation_data(deserializer)); + } else { + return null; + } } @protected - MessageSummaryInfo sse_decode_message_summary_info( - SseDeserializer deserializer) { + DartBeaconShareInfo? sse_decode_opt_box_autoadd_dart_beacon_share_info( + SseDeserializer deserializer, + ) { // Codec=Sse (Serialization based), see doc to use other codecs - var var_ams = sse_decode_opt_String(deserializer); - var var_ampt = sse_decode_opt_list_prim_u_8_strict(deserializer); - var var_amc = sse_decode_opt_box_autoadd_u_32(deserializer); - var var_amb = sse_decode_opt_String(deserializer); - var var_amd = sse_decode_opt_String(deserializer); - var var_ec = sse_decode_Map_String_list_message_edit(deserializer); - var var_ep = sse_decode_list_prim_u_32_strict(deserializer); - var var_otr = sse_decode_Map_String_message_edit_range(deserializer); - var var_ust = sse_decode_opt_box_autoadd_bool(deserializer); - var var_rp = sse_decode_list_prim_u_32_strict(deserializer); - var var_hbr = sse_decode_opt_box_autoadd_bool(deserializer); - var var_oui = sse_decode_opt_String(deserializer); - var var_osn = sse_decode_opt_String(deserializer); - var var_euh = sse_decode_list_String(deserializer); - return MessageSummaryInfo( - ams: var_ams, - ampt: var_ampt, - amc: var_amc, - amb: var_amb, - amd: var_amd, - ec: var_ec, - ep: var_ep, - otr: var_otr, - ust: var_ust, - rp: var_rp, - hbr: var_hbr, - oui: var_oui, - osn: var_osn, - euh: var_euh); + + if (sse_decode_bool(deserializer)) { + return (sse_decode_box_autoadd_dart_beacon_share_info(deserializer)); + } else { + return null; + } } @protected - MessageTarget sse_decode_message_target(SseDeserializer deserializer) { + ExtensionApp? sse_decode_opt_box_autoadd_extension_app( + SseDeserializer deserializer, + ) { // Codec=Sse (Serialization based), see doc to use other codecs - var tag_ = sse_decode_i_32(deserializer); - switch (tag_) { - case 0: - var var_field0 = sse_decode_list_prim_u_8_strict(deserializer); - return MessageTarget_Token(var_field0); - case 1: - var var_field0 = sse_decode_String(deserializer); - return MessageTarget_Uuid(var_field0); - default: - throw UnimplementedError(''); + if (sse_decode_bool(deserializer)) { + return (sse_decode_box_autoadd_extension_app(deserializer)); + } else { + return null; } } @protected - MessageType sse_decode_message_type(SseDeserializer deserializer) { + double? sse_decode_opt_box_autoadd_f_64(SseDeserializer deserializer) { // Codec=Sse (Serialization based), see doc to use other codecs - var tag_ = sse_decode_i_32(deserializer); - switch (tag_) { - case 0: - return MessageType_IMessage(); - case 1: - var var_isPhone = sse_decode_bool(deserializer); - var var_usingNumber = sse_decode_String(deserializer); - var var_fromHandle = sse_decode_opt_String(deserializer); - return MessageType_SMS( - isPhone: var_isPhone, - usingNumber: var_usingNumber, - fromHandle: var_fromHandle); - default: - throw UnimplementedError(''); + if (sse_decode_bool(deserializer)) { + return (sse_decode_box_autoadd_f_64(deserializer)); + } else { + return null; } } @protected - MMCSAttachmentMeta sse_decode_mmcs_attachment_meta( - SseDeserializer deserializer) { + FTMode? sse_decode_opt_box_autoadd_ft_mode(SseDeserializer deserializer) { // Codec=Sse (Serialization based), see doc to use other codecs - var var_mmcsSignatureHex = sse_decode_opt_String(deserializer); - var var_mmcsOwner = sse_decode_opt_String(deserializer); - var var_mmcsUrl = sse_decode_opt_String(deserializer); - var var_decryptionKey = sse_decode_opt_String(deserializer); - var var_inlineAttachment = sse_decode_opt_String(deserializer); - var var_messagePart = sse_decode_opt_String(deserializer); - var var_fileSize = sse_decode_opt_box_autoadd_num_or_string(deserializer); - var var_utiType = sse_decode_opt_String(deserializer); - var var_mimeType = sse_decode_opt_String(deserializer); - var var_name = sse_decode_opt_String(deserializer); - return MMCSAttachmentMeta( - mmcsSignatureHex: var_mmcsSignatureHex, - mmcsOwner: var_mmcsOwner, - mmcsUrl: var_mmcsUrl, - decryptionKey: var_decryptionKey, - inlineAttachment: var_inlineAttachment, - messagePart: var_messagePart, - fileSize: var_fileSize, - utiType: var_utiType, - mimeType: var_mimeType, - name: var_name); + + if (sse_decode_bool(deserializer)) { + return (sse_decode_box_autoadd_ft_mode(deserializer)); + } else { + return null; + } } @protected - MMCSFile sse_decode_mmcs_file(SseDeserializer deserializer) { + int? sse_decode_opt_box_autoadd_i_32(SseDeserializer deserializer) { // Codec=Sse (Serialization based), see doc to use other codecs - var var_signature = sse_decode_list_prim_u_8_strict(deserializer); - var var_object = sse_decode_String(deserializer); - var var_url = sse_decode_String(deserializer); - var var_key = sse_decode_list_prim_u_8_strict(deserializer); - var var_size = sse_decode_CastedPrimitive_usize(deserializer); - return MMCSFile( - signature: var_signature, - object: var_object, - url: var_url, - key: var_key, - size: var_size); + + if (sse_decode_bool(deserializer)) { + return (sse_decode_box_autoadd_i_32(deserializer)); + } else { + return null; + } } @protected - MMCSTransferProgress sse_decode_mmcs_transfer_progress( - SseDeserializer deserializer) { + PlatformInt64? sse_decode_opt_box_autoadd_i_64(SseDeserializer deserializer) { // Codec=Sse (Serialization based), see doc to use other codecs - var var_prog = sse_decode_CastedPrimitive_usize(deserializer); - var var_total = sse_decode_CastedPrimitive_usize(deserializer); - var var_file = sse_decode_opt_box_autoadd_mmcs_file(deserializer); - return MMCSTransferProgress( - prog: var_prog, total: var_total, file: var_file); + + if (sse_decode_bool(deserializer)) { + return (sse_decode_box_autoadd_i_64(deserializer)); + } else { + return null; + } } @protected - MonogramData sse_decode_monogram_data(SseDeserializer deserializer) { + IMessagePosterRecord? sse_decode_opt_box_autoadd_i_message_poster_record( + SseDeserializer deserializer, + ) { // Codec=Sse (Serialization based), see doc to use other codecs - var var_topBackgroundColorDescription = - sse_decode_poster_color(deserializer); - var var_backgroundColorDescription = sse_decode_poster_color(deserializer); - var var_initials = sse_decode_String(deserializer); - var var_monogramSupportedForName = sse_decode_bool(deserializer); - return MonogramData( - topBackgroundColorDescription: var_topBackgroundColorDescription, - backgroundColorDescription: var_backgroundColorDescription, - initials: var_initials, - monogramSupportedForName: var_monogramSupportedForName); + + if (sse_decode_bool(deserializer)) { + return (sse_decode_box_autoadd_i_message_poster_record(deserializer)); + } else { + return null; + } } @protected - MoveToRecycleBinMessage sse_decode_move_to_recycle_bin_message( - SseDeserializer deserializer) { + IdmsRequestedSignIn? sse_decode_opt_box_autoadd_idms_requested_sign_in( + SseDeserializer deserializer, + ) { // Codec=Sse (Serialization based), see doc to use other codecs - var var_target = sse_decode_delete_target(deserializer); - var var_recoverableDeleteDate = - sse_decode_CastedPrimitive_u_64(deserializer); - return MoveToRecycleBinMessage( - target: var_target, recoverableDeleteDate: var_recoverableDeleteDate); + + if (sse_decode_bool(deserializer)) { + return (sse_decode_box_autoadd_idms_requested_sign_in(deserializer)); + } else { + return null; + } } @protected - MyAsyncRuntime sse_decode_my_async_runtime(SseDeserializer deserializer) { + LinkMeta? sse_decode_opt_box_autoadd_link_meta(SseDeserializer deserializer) { + // Codec=Sse (Serialization based), see doc to use other codecs + + if (sse_decode_bool(deserializer)) { + return (sse_decode_box_autoadd_link_meta(deserializer)); + } else { + return null; + } + } + + @protected + Location? sse_decode_opt_box_autoadd_location(SseDeserializer deserializer) { // Codec=Sse (Serialization based), see doc to use other codecs - return MyAsyncRuntime(); + + if (sse_decode_bool(deserializer)) { + return (sse_decode_box_autoadd_location(deserializer)); + } else { + return null; + } } @protected - NormalMessage sse_decode_normal_message(SseDeserializer deserializer) { + LoginState? sse_decode_opt_box_autoadd_login_state( + SseDeserializer deserializer, + ) { // Codec=Sse (Serialization based), see doc to use other codecs - var var_parts = sse_decode_message_parts(deserializer); - var var_effect = sse_decode_opt_String(deserializer); - var var_replyGuid = sse_decode_opt_String(deserializer); - var var_replyPart = sse_decode_opt_String(deserializer); - var var_service = sse_decode_message_type(deserializer); - var var_subject = sse_decode_opt_String(deserializer); - var var_app = sse_decode_opt_box_autoadd_extension_app(deserializer); - var var_linkMeta = sse_decode_opt_box_autoadd_link_meta(deserializer); - var var_voice = sse_decode_bool(deserializer); - var var_scheduled = sse_decode_opt_box_autoadd_schedule_mode(deserializer); - var var_embeddedProfile = - sse_decode_opt_box_autoadd_share_profile_message(deserializer); - return NormalMessage( - parts: var_parts, - effect: var_effect, - replyGuid: var_replyGuid, - replyPart: var_replyPart, - service: var_service, - subject: var_subject, - app: var_app, - linkMeta: var_linkMeta, - voice: var_voice, - scheduled: var_scheduled, - embeddedProfile: var_embeddedProfile); + + if (sse_decode_bool(deserializer)) { + return (sse_decode_box_autoadd_login_state(deserializer)); + } else { + return null; + } } @protected - NSAttributedString sse_decode_ns_attributed_string( - SseDeserializer deserializer) { + LPIconMetadata? sse_decode_opt_box_autoadd_lp_icon_metadata( + SseDeserializer deserializer, + ) { // Codec=Sse (Serialization based), see doc to use other codecs - var var_text = sse_decode_String(deserializer); - var var_ranges = - sse_decode_list_record_u_32_ns_dictionary_typed_coder(deserializer); - return NSAttributedString(text: var_text, ranges: var_ranges); + + if (sse_decode_bool(deserializer)) { + return (sse_decode_box_autoadd_lp_icon_metadata(deserializer)); + } else { + return null; + } } @protected - NSDictionaryClass sse_decode_ns_dictionary_class( - SseDeserializer deserializer) { + LPImageMetadata? sse_decode_opt_box_autoadd_lp_image_metadata( + SseDeserializer deserializer, + ) { // Codec=Sse (Serialization based), see doc to use other codecs - var inner = sse_decode_i_32(deserializer); - return NSDictionaryClass.values[inner]; + + if (sse_decode_bool(deserializer)) { + return (sse_decode_box_autoadd_lp_image_metadata(deserializer)); + } else { + return null; + } } @protected - NSDictionaryTypedCoder sse_decode_ns_dictionary_typed_coder( - SseDeserializer deserializer) { + LPSpecializationMetadata? + sse_decode_opt_box_autoadd_lp_specialization_metadata( + SseDeserializer deserializer, + ) { // Codec=Sse (Serialization based), see doc to use other codecs - var var_field0 = - sse_decode_Map_String_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerStCollapsedValue( - deserializer); - return NSDictionaryTypedCoder(field0: var_field0); + + if (sse_decode_bool(deserializer)) { + return (sse_decode_box_autoadd_lp_specialization_metadata(deserializer)); + } else { + return null; + } } @protected - NSNumber sse_decode_ns_number(SseDeserializer deserializer) { + MMCSAttachmentMeta? sse_decode_opt_box_autoadd_mmcs_attachment_meta( + SseDeserializer deserializer, + ) { // Codec=Sse (Serialization based), see doc to use other codecs - var var_field0 = sse_decode_u_32(deserializer); - return NSNumber(field0: var_field0); + + if (sse_decode_bool(deserializer)) { + return (sse_decode_box_autoadd_mmcs_attachment_meta(deserializer)); + } else { + return null; + } } @protected - NSString sse_decode_ns_string(SseDeserializer deserializer) { + MMCSFile? sse_decode_opt_box_autoadd_mmcs_file(SseDeserializer deserializer) { // Codec=Sse (Serialization based), see doc to use other codecs - var var_field0 = sse_decode_String(deserializer); - return NSString(field0: var_field0); + + if (sse_decode_bool(deserializer)) { + return (sse_decode_box_autoadd_mmcs_file(deserializer)); + } else { + return null; + } } @protected - NSURL sse_decode_nsurl(SseDeserializer deserializer) { + NSURL? sse_decode_opt_box_autoadd_nsurl(SseDeserializer deserializer) { // Codec=Sse (Serialization based), see doc to use other codecs - var var_base = sse_decode_String(deserializer); - var var_relative = sse_decode_String(deserializer); - return NSURL(base: var_base, relative: var_relative); + + if (sse_decode_bool(deserializer)) { + return (sse_decode_box_autoadd_nsurl(deserializer)); + } else { + return null; + } } @protected - NumOrString sse_decode_num_or_string(SseDeserializer deserializer) { + NumOrString? sse_decode_opt_box_autoadd_num_or_string( + SseDeserializer deserializer, + ) { // Codec=Sse (Serialization based), see doc to use other codecs - var tag_ = sse_decode_i_32(deserializer); - switch (tag_) { - case 0: - var var_field0 = sse_decode_u_32(deserializer); - return NumOrString_Num(var_field0); - case 1: - var var_field0 = sse_decode_String(deserializer); - return NumOrString_String(var_field0); - case 2: - var var_field0 = sse_decode_bool(deserializer); - return NumOrString_Bool(var_field0); - default: - throw UnimplementedError(''); + if (sse_decode_bool(deserializer)) { + return (sse_decode_box_autoadd_num_or_string(deserializer)); + } else { + return null; } } @protected - OperatedChat sse_decode_operated_chat(SseDeserializer deserializer) { + PartExtension? sse_decode_opt_box_autoadd_part_extension( + SseDeserializer deserializer, + ) { // Codec=Sse (Serialization based), see doc to use other codecs - var var_participants = sse_decode_list_String(deserializer); - var var_groupId = sse_decode_String(deserializer); - var var_guid = sse_decode_String(deserializer); - var var_deleteIncomingMessages = - sse_decode_opt_box_autoadd_bool(deserializer); - var var_wasReportedAsJunk = sse_decode_opt_box_autoadd_bool(deserializer); - return OperatedChat( - participants: var_participants, - groupId: var_groupId, - guid: var_guid, - deleteIncomingMessages: var_deleteIncomingMessages, - wasReportedAsJunk: var_wasReportedAsJunk); + + if (sse_decode_bool(deserializer)) { + return (sse_decode_box_autoadd_part_extension(deserializer)); + } else { + return null; + } } @protected - int? sse_decode_opt_CastedPrimitive_i_64(SseDeserializer deserializer) { + PasswordManagerMetaDataFormerlyShared? + sse_decode_opt_box_autoadd_password_manager_meta_data_formerly_shared( + SseDeserializer deserializer, + ) { // Codec=Sse (Serialization based), see doc to use other codecs if (sse_decode_bool(deserializer)) { - return (sse_decode_CastedPrimitive_i_64(deserializer)); + return (sse_decode_box_autoadd_password_manager_meta_data_formerly_shared( + deserializer, + )); } else { return null; } } @protected - int? sse_decode_opt_CastedPrimitive_u_64(SseDeserializer deserializer) { + PasswordManagerTotp? sse_decode_opt_box_autoadd_password_manager_totp( + SseDeserializer deserializer, + ) { // Codec=Sse (Serialization based), see doc to use other codecs if (sse_decode_bool(deserializer)) { - return (sse_decode_CastedPrimitive_u_64(deserializer)); + return (sse_decode_box_autoadd_password_manager_totp(deserializer)); } else { return null; } } @protected - int? sse_decode_opt_CastedPrimitive_usize(SseDeserializer deserializer) { + PosterColor? sse_decode_opt_box_autoadd_poster_color( + SseDeserializer deserializer, + ) { // Codec=Sse (Serialization based), see doc to use other codecs if (sse_decode_bool(deserializer)) { - return (sse_decode_CastedPrimitive_usize(deserializer)); + return (sse_decode_box_autoadd_poster_color(deserializer)); } else { return null; } } @protected - String? sse_decode_opt_String(SseDeserializer deserializer) { + PRPosterContentMaterialStyle? + sse_decode_opt_box_autoadd_pr_poster_content_material_style( + SseDeserializer deserializer, + ) { // Codec=Sse (Serialization based), see doc to use other codecs if (sse_decode_bool(deserializer)) { - return (sse_decode_String(deserializer)); + return (sse_decode_box_autoadd_pr_poster_content_material_style( + deserializer, + )); } else { return null; } } @protected - ApsState? - sse_decode_opt_box_autoadd_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerAPSState( - SseDeserializer deserializer) { + PushMessage? sse_decode_opt_box_autoadd_push_message( + SseDeserializer deserializer, + ) { // Codec=Sse (Serialization based), see doc to use other codecs if (sse_decode_bool(deserializer)) { - return (sse_decode_box_autoadd_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerAPSState( - deserializer)); + return (sse_decode_box_autoadd_push_message(deserializer)); } else { return null; } } @protected - ArcCloudKitClientDefaultAnisetteProvider? - sse_decode_opt_box_autoadd_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcCloudKitClientDefaultAnisetteProvider( - SseDeserializer deserializer) { + (SharedPushState, ApsWatcher)? + sse_decode_opt_box_autoadd_record_shared_push_state_auto_owned_rust_opaque_flutter_rust_bridgefor_generated_rust_auto_opaque_inner_aps_watcher( + SseDeserializer deserializer, + ) { // Codec=Sse (Serialization based), see doc to use other codecs if (sse_decode_bool(deserializer)) { - return (sse_decode_box_autoadd_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcCloudKitClientDefaultAnisetteProvider( - deserializer)); + return (sse_decode_box_autoadd_record_shared_push_state_auto_owned_rust_opaque_flutter_rust_bridgefor_generated_rust_auto_opaque_inner_aps_watcher( + deserializer, + )); } else { return null; } } @protected - ArcCloudMessagesClientDefaultAnisetteProvider? - sse_decode_opt_box_autoadd_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcCloudMessagesClientDefaultAnisetteProvider( - SseDeserializer deserializer) { + (String, String)? sse_decode_opt_box_autoadd_record_string_string( + SseDeserializer deserializer, + ) { // Codec=Sse (Serialization based), see doc to use other codecs if (sse_decode_bool(deserializer)) { - return (sse_decode_box_autoadd_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcCloudMessagesClientDefaultAnisetteProvider( - deserializer)); + return (sse_decode_box_autoadd_record_string_string(deserializer)); } else { return null; } } @protected - ArcFindMyClientDefaultAnisetteProvider? - sse_decode_opt_box_autoadd_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcFindMyClientDefaultAnisetteProvider( - SseDeserializer deserializer) { + (String, BigInt)? sse_decode_opt_box_autoadd_record_string_u_64( + SseDeserializer deserializer, + ) { // Codec=Sse (Serialization based), see doc to use other codecs if (sse_decode_bool(deserializer)) { - return (sse_decode_box_autoadd_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcFindMyClientDefaultAnisetteProvider( - deserializer)); + return (sse_decode_box_autoadd_record_string_u_64(deserializer)); } else { return null; } } @protected - ArcKeychainClientDefaultAnisetteProvider? - sse_decode_opt_box_autoadd_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcKeychainClientDefaultAnisetteProvider( - SseDeserializer deserializer) { + RichLinkImageAttachmentSubstitute? + sse_decode_opt_box_autoadd_rich_link_image_attachment_substitute( + SseDeserializer deserializer, + ) { // Codec=Sse (Serialization based), see doc to use other codecs if (sse_decode_bool(deserializer)) { - return (sse_decode_box_autoadd_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcKeychainClientDefaultAnisetteProvider( - deserializer)); + return (sse_decode_box_autoadd_rich_link_image_attachment_substitute( + deserializer, + )); } else { return null; } } @protected - ArcMutexAppleAccountDefaultAnisetteProvider? - sse_decode_opt_box_autoadd_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcMutexAppleAccountDefaultAnisetteProvider( - SseDeserializer deserializer) { + ScheduleMode? sse_decode_opt_box_autoadd_schedule_mode( + SseDeserializer deserializer, + ) { // Codec=Sse (Serialization based), see doc to use other codecs if (sse_decode_bool(deserializer)) { - return (sse_decode_box_autoadd_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcMutexAppleAccountDefaultAnisetteProvider( - deserializer)); + return (sse_decode_box_autoadd_schedule_mode(deserializer)); } else { return null; } } @protected - ArcPasswordManagerDefaultAnisetteProvider? - sse_decode_opt_box_autoadd_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcPasswordManagerDefaultAnisetteProvider( - SseDeserializer deserializer) { + ShareProfileMessage? sse_decode_opt_box_autoadd_share_profile_message( + SseDeserializer deserializer, + ) { // Codec=Sse (Serialization based), see doc to use other codecs if (sse_decode_bool(deserializer)) { - return (sse_decode_box_autoadd_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcPasswordManagerDefaultAnisetteProvider( - deserializer)); + return (sse_decode_box_autoadd_share_profile_message(deserializer)); } else { return null; } } @protected - Asset? - sse_decode_opt_box_autoadd_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerAsset( - SseDeserializer deserializer) { + SharedICloudServices? sse_decode_opt_box_autoadd_shared_i_cloud_services( + SseDeserializer deserializer, + ) { // Codec=Sse (Serialization based), see doc to use other codecs if (sse_decode_bool(deserializer)) { - return (sse_decode_box_autoadd_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerAsset( - deserializer)); + return (sse_decode_box_autoadd_shared_i_cloud_services(deserializer)); } else { return null; } } @protected - ChannelInterestToken? - sse_decode_opt_box_autoadd_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerChannelInterestToken( - SseDeserializer deserializer) { + SharedPoster? sse_decode_opt_box_autoadd_shared_poster( + SseDeserializer deserializer, + ) { // Codec=Sse (Serialization based), see doc to use other codecs if (sse_decode_bool(deserializer)) { - return (sse_decode_box_autoadd_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerChannelInterestToken( - deserializer)); + return (sse_decode_box_autoadd_shared_poster(deserializer)); } else { return null; } } @protected - CircleClientSessionDefaultAnisetteProvider? - sse_decode_opt_box_autoadd_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerCircleClientSessionDefaultAnisetteProvider( - SseDeserializer deserializer) { + SharedPushState? sse_decode_opt_box_autoadd_shared_push_state( + SseDeserializer deserializer, + ) { // Codec=Sse (Serialization based), see doc to use other codecs if (sse_decode_bool(deserializer)) { - return (sse_decode_box_autoadd_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerCircleClientSessionDefaultAnisetteProvider( - deserializer)); + return (sse_decode_box_autoadd_shared_push_state(deserializer)); } else { return null; } } @protected - ConversationLink? - sse_decode_opt_box_autoadd_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerConversationLink( - SseDeserializer deserializer) { + SupportAction? sse_decode_opt_box_autoadd_support_action( + SseDeserializer deserializer, + ) { // Codec=Sse (Serialization based), see doc to use other codecs if (sse_decode_bool(deserializer)) { - return (sse_decode_box_autoadd_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerConversationLink( - deserializer)); + return (sse_decode_box_autoadd_support_action(deserializer)); } else { return null; } } @protected - ConversationParticipant? - sse_decode_opt_box_autoadd_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerConversationParticipant( - SseDeserializer deserializer) { + SupportAlert? sse_decode_opt_box_autoadd_support_alert( + SseDeserializer deserializer, + ) { // Codec=Sse (Serialization based), see doc to use other codecs if (sse_decode_bool(deserializer)) { - return (sse_decode_box_autoadd_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerConversationParticipant( - deserializer)); + return (sse_decode_box_autoadd_support_alert(deserializer)); } else { return null; } } @protected - Date? - sse_decode_opt_box_autoadd_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerDate( - SseDeserializer deserializer) { + TypingApp? sse_decode_opt_box_autoadd_typing_app( + SseDeserializer deserializer, + ) { // Codec=Sse (Serialization based), see doc to use other codecs if (sse_decode_bool(deserializer)) { - return (sse_decode_box_autoadd_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerDate( - deserializer)); + return (sse_decode_box_autoadd_typing_app(deserializer)); } else { return null; } } @protected - GZipWrapperChatProto? - sse_decode_opt_box_autoadd_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerGZipWrapperChatProto( - SseDeserializer deserializer) { + int? sse_decode_opt_box_autoadd_u_16(SseDeserializer deserializer) { // Codec=Sse (Serialization based), see doc to use other codecs if (sse_decode_bool(deserializer)) { - return (sse_decode_box_autoadd_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerGZipWrapperChatProto( - deserializer)); + return (sse_decode_box_autoadd_u_16(deserializer)); } else { return null; } } @protected - GZipWrapperMessageProto2? - sse_decode_opt_box_autoadd_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerGZipWrapperMessageProto2( - SseDeserializer deserializer) { + int? sse_decode_opt_box_autoadd_u_32(SseDeserializer deserializer) { // Codec=Sse (Serialization based), see doc to use other codecs if (sse_decode_bool(deserializer)) { - return (sse_decode_box_autoadd_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerGZipWrapperMessageProto2( - deserializer)); + return (sse_decode_box_autoadd_u_32(deserializer)); } else { return null; } } @protected - GZipWrapperMessageProto3? - sse_decode_opt_box_autoadd_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerGZipWrapperMessageProto3( - SseDeserializer deserializer) { + BigInt? sse_decode_opt_box_autoadd_u_64(SseDeserializer deserializer) { // Codec=Sse (Serialization based), see doc to use other codecs if (sse_decode_bool(deserializer)) { - return (sse_decode_box_autoadd_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerGZipWrapperMessageProto3( - deserializer)); + return (sse_decode_box_autoadd_u_64(deserializer)); } else { return null; } } @protected - GZipWrapperMessageProto4? - sse_decode_opt_box_autoadd_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerGZipWrapperMessageProto4( - SseDeserializer deserializer) { + UpdateAccountFinish? sse_decode_opt_box_autoadd_update_account_finish( + SseDeserializer deserializer, + ) { // Codec=Sse (Serialization based), see doc to use other codecs if (sse_decode_bool(deserializer)) { - return (sse_decode_box_autoadd_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerGZipWrapperMessageProto4( - deserializer)); + return (sse_decode_box_autoadd_update_account_finish(deserializer)); } else { return null; } } @protected - IdsUser? - sse_decode_opt_box_autoadd_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerIDSUser( - SseDeserializer deserializer) { + List? + sse_decode_opt_list_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerIDSUser( + SseDeserializer deserializer, + ) { // Codec=Sse (Serialization based), see doc to use other codecs if (sse_decode_bool(deserializer)) { - return (sse_decode_box_autoadd_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerIDSUser( - deserializer)); + return (sse_decode_list_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerIDSUser( + deserializer, + )); } else { return null; } } @protected - LocationReport? - sse_decode_opt_box_autoadd_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerLocationReport( - SseDeserializer deserializer) { + List? sse_decode_opt_list_String(SseDeserializer deserializer) { // Codec=Sse (Serialization based), see doc to use other codecs if (sse_decode_bool(deserializer)) { - return (sse_decode_box_autoadd_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerLocationReport( - deserializer)); + return (sse_decode_list_String(deserializer)); } else { return null; } } @protected - NsArrayLpIconMetadata? - sse_decode_opt_box_autoadd_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerNSArrayLPIconMetadata( - SseDeserializer deserializer) { + List? sse_decode_opt_list_message_target( + SseDeserializer deserializer, + ) { // Codec=Sse (Serialization based), see doc to use other codecs if (sse_decode_bool(deserializer)) { - return (sse_decode_box_autoadd_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerNSArrayLPIconMetadata( - deserializer)); + return (sse_decode_list_message_target(deserializer)); } else { return null; } } @protected - NsArrayLpImageMetadata? - sse_decode_opt_box_autoadd_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerNSArrayLPImageMetadata( - SseDeserializer deserializer) { + Uint8List? sse_decode_opt_list_prim_u_8_strict(SseDeserializer deserializer) { // Codec=Sse (Serialization based), see doc to use other codecs if (sse_decode_bool(deserializer)) { - return (sse_decode_box_autoadd_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerNSArrayLPImageMetadata( - deserializer)); + return (sse_decode_list_prim_u_8_strict(deserializer)); } else { return null; } } @protected - PushError? - sse_decode_opt_box_autoadd_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerPushError( - SseDeserializer deserializer) { + PartExtension sse_decode_part_extension(SseDeserializer deserializer) { + // Codec=Sse (Serialization based), see doc to use other codecs + + var tag_ = sse_decode_i_32(deserializer); + switch (tag_) { + case 0: + var var_msgWidth = sse_decode_f_64(deserializer); + var var_rotation = sse_decode_f_64(deserializer); + var var_sai = sse_decode_u_64(deserializer); + var var_scale = sse_decode_f_64(deserializer); + var var_update = sse_decode_opt_box_autoadd_bool(deserializer); + var var_sli = sse_decode_u_64(deserializer); + var var_normalizedX = sse_decode_f_64(deserializer); + var var_normalizedY = sse_decode_f_64(deserializer); + var var_version = sse_decode_u_64(deserializer); + var var_hash = sse_decode_String(deserializer); + var var_safi = sse_decode_u_64(deserializer); + var var_effectType = sse_decode_i_64(deserializer); + var var_stickerId = sse_decode_String(deserializer); + return PartExtension_Sticker( + msgWidth: var_msgWidth, + rotation: var_rotation, + sai: var_sai, + scale: var_scale, + update: var_update, + sli: var_sli, + normalizedX: var_normalizedX, + normalizedY: var_normalizedY, + version: var_version, + hash: var_hash, + safi: var_safi, + effectType: var_effectType, + stickerId: var_stickerId, + ); + default: + throw UnimplementedError(''); + } + } + + @protected + Passkey sse_decode_passkey(SseDeserializer deserializer) { + // Codec=Sse (Serialization based), see doc to use other codecs + var var_cdat = sse_decode_CastedPrimitive_u_64(deserializer); + var var_mdat = sse_decode_CastedPrimitive_u_64(deserializer); + var var_agrp = sse_decode_String(deserializer); + var var_labl = sse_decode_String(deserializer); + var var_data = sse_decode_list_prim_u_8_strict(deserializer); + var var_atag = sse_decode_list_prim_u_8_strict(deserializer); + var var_klbl = sse_decode_list_prim_u_8_strict(deserializer); + return Passkey( + cdat: var_cdat, + mdat: var_mdat, + agrp: var_agrp, + labl: var_labl, + data: var_data, + atag: var_atag, + klbl: var_klbl, + ); + } + + @protected + PasswordManagerAltDomain sse_decode_password_manager_alt_domain( + SseDeserializer deserializer, + ) { // Codec=Sse (Serialization based), see doc to use other codecs - - if (sse_decode_bool(deserializer)) { - return (sse_decode_box_autoadd_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerPushError( - deserializer)); - } else { - return null; - } + var var_domain = sse_decode_String(deserializer); + return PasswordManagerAltDomain(domain: var_domain); } @protected - SavedHardwareState? - sse_decode_opt_box_autoadd_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerSavedHardwareState( - SseDeserializer deserializer) { + PasswordManagerMeta sse_decode_password_manager_meta( + SseDeserializer deserializer, + ) { // Codec=Sse (Serialization based), see doc to use other codecs - - if (sse_decode_bool(deserializer)) { - return (sse_decode_box_autoadd_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerSavedHardwareState( - deserializer)); - } else { - return null; - } + var var_cdat = sse_decode_CastedPrimitive_u_64(deserializer); + var var_mdat = sse_decode_CastedPrimitive_u_64(deserializer); + var var_srvr = sse_decode_String(deserializer); + var var_acct = sse_decode_String(deserializer); + var var_agrp = sse_decode_String(deserializer); + var var_data = sse_decode_list_prim_u_8_strict(deserializer); + return PasswordManagerMeta( + cdat: var_cdat, + mdat: var_mdat, + srvr: var_srvr, + acct: var_acct, + agrp: var_agrp, + data: var_data, + ); } @protected - SyncManagerDefaultAnisetteProviderMyFilePackager? - sse_decode_opt_box_autoadd_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerSyncManagerDefaultAnisetteProviderMyFilePackager( - SseDeserializer deserializer) { + PasswordManagerMetaChange sse_decode_password_manager_meta_change( + SseDeserializer deserializer, + ) { // Codec=Sse (Serialization based), see doc to use other codecs - - if (sse_decode_bool(deserializer)) { - return (sse_decode_box_autoadd_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerSyncManagerDefaultAnisetteProviderMyFilePackager( - deserializer)); - } else { - return null; - } + var var_date = sse_decode_CastedPrimitive_u_64(deserializer); + var var_password = sse_decode_opt_String(deserializer); + var var_oldPassword = sse_decode_opt_String(deserializer); + var var_groupName = sse_decode_opt_String(deserializer); + var var_groupId = sse_decode_opt_String(deserializer); + var var_shareType = sse_decode_opt_String(deserializer); + var var_id = sse_decode_String(deserializer); + var var_typ = sse_decode_String(deserializer); + return PasswordManagerMetaChange( + date: var_date, + password: var_password, + oldPassword: var_oldPassword, + groupName: var_groupName, + groupId: var_groupId, + shareType: var_shareType, + id: var_id, + typ: var_typ, + ); } @protected - SystemTime? - sse_decode_opt_box_autoadd_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerSystemTime( - SseDeserializer deserializer) { + PasswordManagerMetaData sse_decode_password_manager_meta_data( + SseDeserializer deserializer, + ) { // Codec=Sse (Serialization based), see doc to use other codecs - - if (sse_decode_bool(deserializer)) { - return (sse_decode_box_autoadd_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerSystemTime( - deserializer)); - } else { - return null; - } + var var_history = sse_decode_list_password_manager_meta_change( + deserializer, + ); + var var_altDomains = sse_decode_list_password_manager_alt_domain( + deserializer, + ); + var var_totp = sse_decode_opt_box_autoadd_password_manager_totp( + deserializer, + ); + var var_ctxt = sse_decode_Map_String_password_manager_meta_data_ctx( + deserializer, + ); + var var_title = sse_decode_opt_list_prim_u_8_strict(deserializer); + var var_notes = sse_decode_opt_list_prim_u_8_strict(deserializer); + var var_formerlyShared = + sse_decode_opt_box_autoadd_password_manager_meta_data_formerly_shared( + deserializer, + ); + var var_ocpid = sse_decode_opt_list_prim_u_8_strict(deserializer); + return PasswordManagerMetaData( + history: var_history, + altDomains: var_altDomains, + totp: var_totp, + ctxt: var_ctxt, + title: var_title, + notes: var_notes, + formerlyShared: var_formerlyShared, + ocpid: var_ocpid, + ); } @protected - Address? sse_decode_opt_box_autoadd_address(SseDeserializer deserializer) { + PasswordManagerMetaDataCtx sse_decode_password_manager_meta_data_ctx( + SseDeserializer deserializer, + ) { // Codec=Sse (Serialization based), see doc to use other codecs - - if (sse_decode_bool(deserializer)) { - return (sse_decode_box_autoadd_address(deserializer)); - } else { - return null; - } + var var_lastUsed = sse_decode_f_64(deserializer); + return PasswordManagerMetaDataCtx(lastUsed: var_lastUsed); } @protected - Attachment? sse_decode_opt_box_autoadd_attachment( - SseDeserializer deserializer) { + PasswordManagerMetaDataFormerlyShared + sse_decode_password_manager_meta_data_formerly_shared( + SseDeserializer deserializer, + ) { // Codec=Sse (Serialization based), see doc to use other codecs - - if (sse_decode_bool(deserializer)) { - return (sse_decode_box_autoadd_attachment(deserializer)); - } else { - return null; - } + var var_groupName = sse_decode_opt_String(deserializer); + var var_passwordManagerCredentialIdentifier = sse_decode_opt_String( + deserializer, + ); + return PasswordManagerMetaDataFormerlyShared( + groupName: var_groupName, + passwordManagerCredentialIdentifier: + var_passwordManagerCredentialIdentifier, + ); } @protected - AttachmentMetaExtra? sse_decode_opt_box_autoadd_attachment_meta_extra( - SseDeserializer deserializer) { + PasswordManagerTotp sse_decode_password_manager_totp( + SseDeserializer deserializer, + ) { // Codec=Sse (Serialization based), see doc to use other codecs - - if (sse_decode_bool(deserializer)) { - return (sse_decode_box_autoadd_attachment_meta_extra(deserializer)); - } else { - return null; - } + var var_secret = sse_decode_list_prim_u_8_strict(deserializer); + var var_digits = sse_decode_u_32(deserializer); + var var_issuer = sse_decode_opt_String(deserializer); + var var_period = sse_decode_u_32(deserializer); + var var_initialDate = sse_decode_CastedPrimitive_u_64(deserializer); + var var_algorithm = sse_decode_u_32(deserializer); + var var_accountName = sse_decode_opt_String(deserializer); + var var_originalUrl = sse_decode_opt_String(deserializer); + return PasswordManagerTotp( + secret: var_secret, + digits: var_digits, + issuer: var_issuer, + period: var_period, + initialDate: var_initialDate, + algorithm: var_algorithm, + accountName: var_accountName, + originalUrl: var_originalUrl, + ); } @protected - Balloon? sse_decode_opt_box_autoadd_balloon(SseDeserializer deserializer) { + PasswordRawEntry sse_decode_password_raw_entry(SseDeserializer deserializer) { // Codec=Sse (Serialization based), see doc to use other codecs - - if (sse_decode_bool(deserializer)) { - return (sse_decode_box_autoadd_balloon(deserializer)); - } else { - return null; - } + var var_cdat = sse_decode_CastedPrimitive_u_64(deserializer); + var var_mdat = sse_decode_CastedPrimitive_u_64(deserializer); + var var_srvr = sse_decode_String(deserializer); + var var_acct = sse_decode_String(deserializer); + var var_agrp = sse_decode_String(deserializer); + var var_data = sse_decode_list_prim_u_8_strict(deserializer); + return PasswordRawEntry( + cdat: var_cdat, + mdat: var_mdat, + srvr: var_srvr, + acct: var_acct, + agrp: var_agrp, + data: var_data, + ); } @protected - BalloonLayout? sse_decode_opt_box_autoadd_balloon_layout( - SseDeserializer deserializer) { + PermanentDeleteMessage sse_decode_permanent_delete_message( + SseDeserializer deserializer, + ) { // Codec=Sse (Serialization based), see doc to use other codecs - - if (sse_decode_bool(deserializer)) { - return (sse_decode_box_autoadd_balloon_layout(deserializer)); - } else { - return null; - } + var var_target = sse_decode_delete_target(deserializer); + var var_isScheduled = sse_decode_bool(deserializer); + return PermanentDeleteMessage( + target: var_target, + isScheduled: var_isScheduled, + ); } @protected - bool? sse_decode_opt_box_autoadd_bool(SseDeserializer deserializer) { + PhotoPosterContents sse_decode_photo_poster_contents( + SseDeserializer deserializer, + ) { // Codec=Sse (Serialization based), see doc to use other codecs - - if (sse_decode_bool(deserializer)) { - return (sse_decode_box_autoadd_bool(deserializer)); - } else { - return null; - } + var var_version = sse_decode_u_32(deserializer); + var var_layers = sse_decode_list_photo_poster_layer(deserializer); + var var_properties = sse_decode_photo_poster_properties(deserializer); + return PhotoPosterContents( + version: var_version, + layers: var_layers, + properties: var_properties, + ); } @protected - CertifiedContext? sse_decode_opt_box_autoadd_certified_context( - SseDeserializer deserializer) { + PhotoPosterContentsFrame sse_decode_photo_poster_contents_frame( + SseDeserializer deserializer, + ) { // Codec=Sse (Serialization based), see doc to use other codecs - - if (sse_decode_bool(deserializer)) { - return (sse_decode_box_autoadd_certified_context(deserializer)); - } else { - return null; - } + var var_width = sse_decode_f_64(deserializer); + var var_height = sse_decode_f_64(deserializer); + var var_x = sse_decode_f_64(deserializer); + var var_y = sse_decode_f_64(deserializer); + return PhotoPosterContentsFrame( + width: var_width, + height: var_height, + x: var_x, + y: var_y, + ); } @protected - CloudAttachment? sse_decode_opt_box_autoadd_cloud_attachment( - SseDeserializer deserializer) { + PhotoPosterContentsSize sse_decode_photo_poster_contents_size( + SseDeserializer deserializer, + ) { // Codec=Sse (Serialization based), see doc to use other codecs - - if (sse_decode_bool(deserializer)) { - return (sse_decode_box_autoadd_cloud_attachment(deserializer)); - } else { - return null; - } + var var_width = sse_decode_f_64(deserializer); + var var_height = sse_decode_f_64(deserializer); + return PhotoPosterContentsSize(width: var_width, height: var_height); } @protected - CloudChat? sse_decode_opt_box_autoadd_cloud_chat( - SseDeserializer deserializer) { + PhotoPosterLayer sse_decode_photo_poster_layer(SseDeserializer deserializer) { // Codec=Sse (Serialization based), see doc to use other codecs - - if (sse_decode_bool(deserializer)) { - return (sse_decode_box_autoadd_cloud_chat(deserializer)); - } else { - return null; - } + var var_frame = sse_decode_photo_poster_contents_frame(deserializer); + var var_filename = sse_decode_String(deserializer); + var var_zPosition = sse_decode_f_32(deserializer); + var var_identifier = sse_decode_String(deserializer); + return PhotoPosterLayer( + frame: var_frame, + filename: var_filename, + zPosition: var_zPosition, + identifier: var_identifier, + ); } @protected - CloudMessage? sse_decode_opt_box_autoadd_cloud_message( - SseDeserializer deserializer) { + PhotoPosterLayout sse_decode_photo_poster_layout( + SseDeserializer deserializer, + ) { // Codec=Sse (Serialization based), see doc to use other codecs - - if (sse_decode_bool(deserializer)) { - return (sse_decode_box_autoadd_cloud_message(deserializer)); - } else { - return null; - } + var var_clockIntersection = sse_decode_u_32(deserializer); + var var_deviceResolution = sse_decode_photo_poster_contents_size( + deserializer, + ); + var var_visibleFrame = sse_decode_photo_poster_contents_frame(deserializer); + var var_timeFrame = sse_decode_photo_poster_contents_frame(deserializer); + var var_clockLayerOrder = sse_decode_String(deserializer); + var var_hasTopEdgeContact = sse_decode_bool(deserializer); + var var_inactiveFrame = sse_decode_photo_poster_contents_frame( + deserializer, + ); + var var_imageSize = sse_decode_photo_poster_contents_size(deserializer); + var var_parallaxPadding = sse_decode_photo_poster_contents_size( + deserializer, + ); + return PhotoPosterLayout( + clockIntersection: var_clockIntersection, + deviceResolution: var_deviceResolution, + visibleFrame: var_visibleFrame, + timeFrame: var_timeFrame, + clockLayerOrder: var_clockLayerOrder, + hasTopEdgeContact: var_hasTopEdgeContact, + inactiveFrame: var_inactiveFrame, + imageSize: var_imageSize, + parallaxPadding: var_parallaxPadding, + ); } @protected - CloudProp? sse_decode_opt_box_autoadd_cloud_prop( - SseDeserializer deserializer) { + PhotoPosterProperties sse_decode_photo_poster_properties( + SseDeserializer deserializer, + ) { // Codec=Sse (Serialization based), see doc to use other codecs - - if (sse_decode_bool(deserializer)) { - return (sse_decode_box_autoadd_cloud_prop(deserializer)); - } else { - return null; - } + var var_portraitLayout = sse_decode_photo_poster_layout(deserializer); + var var_settlingEffectEnabled = sse_decode_bool(deserializer); + var var_depthEnabled = sse_decode_bool(deserializer); + var var_clockAreaLuminance = sse_decode_f_64(deserializer); + var var_parallaxDisabled = sse_decode_bool(deserializer); + return PhotoPosterProperties( + portraitLayout: var_portraitLayout, + settlingEffectEnabled: var_settlingEffectEnabled, + depthEnabled: var_depthEnabled, + clockAreaLuminance: var_clockAreaLuminance, + parallaxDisabled: var_parallaxDisabled, + ); } @protected - ConversationData? sse_decode_opt_box_autoadd_conversation_data( - SseDeserializer deserializer) { + PollResult sse_decode_poll_result(SseDeserializer deserializer) { // Codec=Sse (Serialization based), see doc to use other codecs - if (sse_decode_bool(deserializer)) { - return (sse_decode_box_autoadd_conversation_data(deserializer)); - } else { - return null; + var tag_ = sse_decode_i_32(deserializer); + switch (tag_) { + case 0: + return PollResult_Stop(); + case 1: + var var_field0 = sse_decode_opt_box_autoadd_push_message(deserializer); + return PollResult_Cont(var_field0); + default: + throw UnimplementedError(''); } } @protected - DartBeaconShareInfo? sse_decode_opt_box_autoadd_dart_beacon_share_info( - SseDeserializer deserializer) { + PosterAsset sse_decode_poster_asset(SseDeserializer deserializer) { // Codec=Sse (Serialization based), see doc to use other codecs + var var_contents = sse_decode_photo_poster_contents(deserializer); + var var_files = sse_decode_Map_String_list_prim_u_8_strict(deserializer); + var var_uuid = sse_decode_String(deserializer); + return PosterAsset( + contents: var_contents, + files: var_files, + uuid: var_uuid, + ); + } - if (sse_decode_bool(deserializer)) { - return (sse_decode_box_autoadd_dart_beacon_share_info(deserializer)); - } else { - return null; - } + @protected + PosterColor sse_decode_poster_color(SseDeserializer deserializer) { + // Codec=Sse (Serialization based), see doc to use other codecs + var var_alpha = sse_decode_f_64(deserializer); + var var_blue = sse_decode_f_64(deserializer); + var var_green = sse_decode_f_64(deserializer); + var var_red = sse_decode_f_64(deserializer); + return PosterColor( + alpha: var_alpha, + blue: var_blue, + green: var_green, + red: var_red, + ); } @protected - ExtensionApp? sse_decode_opt_box_autoadd_extension_app( - SseDeserializer deserializer) { + PosterRole sse_decode_poster_role(SseDeserializer deserializer) { // Codec=Sse (Serialization based), see doc to use other codecs - - if (sse_decode_bool(deserializer)) { - return (sse_decode_box_autoadd_extension_app(deserializer)); - } else { - return null; - } + var inner = sse_decode_i_32(deserializer); + return PosterRole.values[inner]; } @protected - double? sse_decode_opt_box_autoadd_f_64(SseDeserializer deserializer) { + PosterType sse_decode_poster_type(SseDeserializer deserializer) { // Codec=Sse (Serialization based), see doc to use other codecs - if (sse_decode_bool(deserializer)) { - return (sse_decode_box_autoadd_f_64(deserializer)); - } else { - return null; + var tag_ = sse_decode_i_32(deserializer); + switch (tag_) { + case 0: + var var_assets = sse_decode_list_poster_asset(deserializer); + return PosterType_Photo(assets: var_assets); + case 1: + var var_data = sse_decode_box_autoadd_monogram_data(deserializer); + var var_background = sse_decode_box_autoadd_poster_color(deserializer); + return PosterType_Monogram(data: var_data, background: var_background); + case 2: + var var_data = sse_decode_box_autoadd_memoji_data(deserializer); + var var_background = sse_decode_box_autoadd_poster_color(deserializer); + return PosterType_Memoji(data: var_data, background: var_background); + case 3: + var var_data = sse_decode_box_autoadd_transcript_dynamic_user_data( + deserializer, + ); + return PosterType_TranscriptDynamic(data: var_data); + case 4: + var var_colors = sse_decode_list_poster_color(deserializer); + return PosterType_TranscriptGradient(colors: var_colors); + default: + throw UnimplementedError(''); } } @protected - FTMode? sse_decode_opt_box_autoadd_ft_mode(SseDeserializer deserializer) { + PRPosterColor sse_decode_pr_poster_color(SseDeserializer deserializer) { // Codec=Sse (Serialization based), see doc to use other codecs - - if (sse_decode_bool(deserializer)) { - return (sse_decode_box_autoadd_ft_mode(deserializer)); - } else { - return null; - } + var var_preferredStyle = sse_decode_u_32(deserializer); + var var_identifier = sse_decode_String(deserializer); + var var_suggested = sse_decode_bool(deserializer); + var var_color = sse_decode_ui_color(deserializer); + return PRPosterColor( + preferredStyle: var_preferredStyle, + identifier: var_identifier, + suggested: var_suggested, + color: var_color, + ); } @protected - int? sse_decode_opt_box_autoadd_i_32(SseDeserializer deserializer) { + PRPosterContentMaterialStyle sse_decode_pr_poster_content_material_style( + SseDeserializer deserializer, + ) { // Codec=Sse (Serialization based), see doc to use other codecs - if (sse_decode_bool(deserializer)) { - return (sse_decode_box_autoadd_i_32(deserializer)); - } else { - return null; + var tag_ = sse_decode_i_32(deserializer); + switch (tag_) { + case 0: + var var_variation = sse_decode_f_32(deserializer); + var var_colors = sse_decode_list_ui_color(deserializer); + var var_vibrant = sse_decode_bool(deserializer); + var var_supportsVariation = sse_decode_bool(deserializer); + var var_needsToResolveVariation = sse_decode_bool(deserializer); + return PRPosterContentMaterialStyle_PRPosterContentDiscreteColorsStyle( + variation: var_variation, + colors: var_colors, + vibrant: var_vibrant, + supportsVariation: var_supportsVariation, + needsToResolveVariation: var_needsToResolveVariation, + ); + case 1: + return PRPosterContentMaterialStyle_PRPosterContentVibrantMaterialStyle(); + case 2: + var var_gradientType = sse_decode_u_32(deserializer); + var var_colors = sse_decode_list_ui_color(deserializer); + var var_startPoint = sse_decode_String(deserializer); + var var_locations = sse_decode_list_prim_f_64_strict(deserializer); + var var_endPoint = sse_decode_String(deserializer); + return PRPosterContentMaterialStyle_PRPosterContentGradientStyle( + gradientType: var_gradientType, + colors: var_colors, + startPoint: var_startPoint, + locations: var_locations, + endPoint: var_endPoint, + ); + default: + throw UnimplementedError(''); } } @protected - PlatformInt64? sse_decode_opt_box_autoadd_i_64(SseDeserializer deserializer) { + PRPosterSystemTimeFontConfiguration + sse_decode_pr_poster_system_time_font_configuration( + SseDeserializer deserializer, + ) { // Codec=Sse (Serialization based), see doc to use other codecs - - if (sse_decode_bool(deserializer)) { - return (sse_decode_box_autoadd_i_64(deserializer)); - } else { - return null; - } + var var_isSystemItem = sse_decode_bool(deserializer); + var var_timeFontIdentifier = sse_decode_String(deserializer); + var var_weight = sse_decode_f_64(deserializer); + return PRPosterSystemTimeFontConfiguration( + isSystemItem: var_isSystemItem, + timeFontIdentifier: var_timeFontIdentifier, + weight: var_weight, + ); } @protected - IMessagePosterRecord? sse_decode_opt_box_autoadd_i_message_poster_record( - SseDeserializer deserializer) { + PRPosterTitleStyleConfiguration + sse_decode_pr_poster_title_style_configuration(SseDeserializer deserializer) { // Codec=Sse (Serialization based), see doc to use other codecs - - if (sse_decode_bool(deserializer)) { - return (sse_decode_box_autoadd_i_message_poster_record(deserializer)); - } else { - return null; - } + var var_alternateDateEnabled = sse_decode_bool(deserializer); + var var_contentsLuminence = sse_decode_f_64(deserializer); + var var_groupName = sse_decode_String(deserializer); + var var_preferredTitleAlignment = sse_decode_u_32(deserializer); + var var_preferredTitleLayout = sse_decode_u_32(deserializer); + var var_timeFontConfiguration = + sse_decode_pr_poster_system_time_font_configuration(deserializer); + var var_timeNumberingSystem = sse_decode_opt_list_prim_u_8_strict( + deserializer, + ); + var var_titleColor = sse_decode_pr_poster_color(deserializer); + var var_titleContentStyle = sse_decode_list_prim_u_8_strict(deserializer); + var var_userConfigured = sse_decode_bool(deserializer); + var var_titleStyle = + sse_decode_opt_box_autoadd_pr_poster_content_material_style( + deserializer, + ); + return PRPosterTitleStyleConfiguration( + alternateDateEnabled: var_alternateDateEnabled, + contentsLuminence: var_contentsLuminence, + groupName: var_groupName, + preferredTitleAlignment: var_preferredTitleAlignment, + preferredTitleLayout: var_preferredTitleLayout, + timeFontConfiguration: var_timeFontConfiguration, + timeNumberingSystem: var_timeNumberingSystem, + titleColor: var_titleColor, + titleContentStyle: var_titleContentStyle, + userConfigured: var_userConfigured, + titleStyle: var_titleStyle, + ); } @protected - IdmsRequestedSignIn? sse_decode_opt_box_autoadd_idms_requested_sign_in( - SseDeserializer deserializer) { + PrivateDeviceInfo sse_decode_private_device_info( + SseDeserializer deserializer, + ) { // Codec=Sse (Serialization based), see doc to use other codecs - - if (sse_decode_bool(deserializer)) { - return (sse_decode_box_autoadd_idms_requested_sign_in(deserializer)); - } else { - return null; - } + var var_uuid = sse_decode_opt_String(deserializer); + var var_deviceName = sse_decode_opt_String(deserializer); + var var_token = sse_decode_list_prim_u_8_strict(deserializer); + var var_isHsaTrusted = sse_decode_bool(deserializer); + var var_identites = sse_decode_list_String(deserializer); + var var_subServices = sse_decode_list_String(deserializer); + return PrivateDeviceInfo( + uuid: var_uuid, + deviceName: var_deviceName, + token: var_token, + isHsaTrusted: var_isHsaTrusted, + identites: var_identites, + subServices: var_subServices, + ); } @protected - LinkMeta? sse_decode_opt_box_autoadd_link_meta(SseDeserializer deserializer) { + ProvisionedFlavor sse_decode_provisioned_flavor( + SseDeserializer deserializer, + ) { // Codec=Sse (Serialization based), see doc to use other codecs - - if (sse_decode_bool(deserializer)) { - return (sse_decode_box_autoadd_link_meta(deserializer)); - } else { - return null; - } + var inner = sse_decode_i_32(deserializer); + return ProvisionedFlavor.values[inner]; } @protected - Location? sse_decode_opt_box_autoadd_location(SseDeserializer deserializer) { + PushMessage sse_decode_push_message(SseDeserializer deserializer) { // Codec=Sse (Serialization based), see doc to use other codecs - if (sse_decode_bool(deserializer)) { - return (sse_decode_box_autoadd_location(deserializer)); - } else { - return null; + var tag_ = sse_decode_i_32(deserializer); + switch (tag_) { + case 0: + var var_field0 = sse_decode_box_autoadd_message_inst(deserializer); + return PushMessage_IMessage(var_field0); + case 1: + var var_uuid = sse_decode_String(deserializer); + var var_error = sse_decode_opt_String(deserializer); + return PushMessage_SendConfirm(uuid: var_uuid, error: var_error); + case 2: + var var_field0 = sse_decode_box_autoadd_register_state(deserializer); + return PushMessage_RegistrationState(var_field0); + case 3: + var var_field0 = sse_decode_box_autoadd_shared_album(deserializer); + return PushMessage_NewPhotostream(var_field0); + case 4: + var var_field0 = sse_decode_box_autoadd_ft_message(deserializer); + return PushMessage_FaceTime(var_field0); + case 5: + var var_field0 = sse_decode_box_autoadd_status_kit_message( + deserializer, + ); + return PushMessage_StatusUpdate(var_field0); + case 6: + var var_field0 = sse_decode_box_autoadd_idms_message(deserializer); + return PushMessage_Idms(var_field0); + case 7: + var var_field0 = sse_decode_bool(deserializer); + return PushMessage_TwoFaAuthEvent(var_field0); + case 8: + return PushMessage_CircleFinishEvent(); + case 9: + var var_sender = sse_decode_String(deserializer); + var var_beacon = sse_decode_String(deserializer); + var var_attributes = sse_decode_box_autoadd_beacon_attributes( + deserializer, + ); + return PushMessage_BeaconShared( + sender: var_sender, + beacon: var_beacon, + attributes: var_attributes, + ); + default: + throw UnimplementedError(''); } } @protected - LoginState? sse_decode_opt_box_autoadd_login_state( - SseDeserializer deserializer) { + QuotaInfo sse_decode_quota_info(SseDeserializer deserializer) { // Codec=Sse (Serialization based), see doc to use other codecs + var var_totalBytes = sse_decode_CastedPrimitive_u_64(deserializer); + var var_availableBytes = sse_decode_CastedPrimitive_u_64(deserializer); + var var_messagesBytes = sse_decode_CastedPrimitive_u_64(deserializer); + return QuotaInfo( + totalBytes: var_totalBytes, + availableBytes: var_availableBytes, + messagesBytes: var_messagesBytes, + ); + } - if (sse_decode_bool(deserializer)) { - return (sse_decode_box_autoadd_login_state(deserializer)); - } else { - return null; - } + @protected + ReactMessage sse_decode_react_message(SseDeserializer deserializer) { + // Codec=Sse (Serialization based), see doc to use other codecs + var var_toUuid = sse_decode_String(deserializer); + var var_toPart = sse_decode_opt_CastedPrimitive_u_64(deserializer); + var var_reaction = sse_decode_react_message_type(deserializer); + var var_toText = sse_decode_String(deserializer); + var var_embeddedProfile = sse_decode_opt_box_autoadd_share_profile_message( + deserializer, + ); + return ReactMessage( + toUuid: var_toUuid, + toPart: var_toPart, + reaction: var_reaction, + toText: var_toText, + embeddedProfile: var_embeddedProfile, + ); } @protected - LPIconMetadata? sse_decode_opt_box_autoadd_lp_icon_metadata( - SseDeserializer deserializer) { + ReactMessageType sse_decode_react_message_type(SseDeserializer deserializer) { // Codec=Sse (Serialization based), see doc to use other codecs - if (sse_decode_bool(deserializer)) { - return (sse_decode_box_autoadd_lp_icon_metadata(deserializer)); - } else { - return null; + var tag_ = sse_decode_i_32(deserializer); + switch (tag_) { + case 0: + var var_reaction = sse_decode_box_autoadd_reaction(deserializer); + var var_enable = sse_decode_bool(deserializer); + return ReactMessageType_React( + reaction: var_reaction, + enable: var_enable, + ); + case 1: + var var_spec = sse_decode_box_autoadd_extension_app(deserializer); + var var_body = sse_decode_box_autoadd_message_parts(deserializer); + var var_isMeta = sse_decode_bool(deserializer); + return ReactMessageType_Extension( + spec: var_spec, + body: var_body, + isMeta: var_isMeta, + ); + default: + throw UnimplementedError(''); } } @protected - LPImageMetadata? sse_decode_opt_box_autoadd_lp_image_metadata( - SseDeserializer deserializer) { + Reaction sse_decode_reaction(SseDeserializer deserializer) { // Codec=Sse (Serialization based), see doc to use other codecs - if (sse_decode_bool(deserializer)) { - return (sse_decode_box_autoadd_lp_image_metadata(deserializer)); - } else { - return null; + var tag_ = sse_decode_i_32(deserializer); + switch (tag_) { + case 0: + return Reaction_Heart(); + case 1: + return Reaction_Like(); + case 2: + return Reaction_Dislike(); + case 3: + return Reaction_Laugh(); + case 4: + return Reaction_Emphasize(); + case 5: + return Reaction_Question(); + case 6: + var var_field0 = sse_decode_String(deserializer); + return Reaction_Emoji(var_field0); + case 7: + var var_spec = sse_decode_opt_box_autoadd_extension_app(deserializer); + var var_body = sse_decode_box_autoadd_message_parts(deserializer); + return Reaction_Sticker(spec: var_spec, body: var_body); + default: + throw UnimplementedError(''); } } @protected - LPSpecializationMetadata? - sse_decode_opt_box_autoadd_lp_specialization_metadata( - SseDeserializer deserializer) { + (ApsConnection, PushError?) + sse_decode_record_auto_owned_rust_opaque_flutter_rust_bridgefor_generated_rust_auto_opaque_inner_aps_connection_opt_box_autoadd_auto_owned_rust_opaque_flutter_rust_bridgefor_generated_rust_auto_opaque_inner_push_error( + SseDeserializer deserializer, + ) { // Codec=Sse (Serialization based), see doc to use other codecs - - if (sse_decode_bool(deserializer)) { - return (sse_decode_box_autoadd_lp_specialization_metadata(deserializer)); - } else { - return null; - } + var var_field0 = + sse_decode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerAPSConnection( + deserializer, + ); + var var_field1 = + sse_decode_opt_box_autoadd_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerPushError( + deserializer, + ); + return (var_field0, var_field1); } @protected - MMCSAttachmentMeta? sse_decode_opt_box_autoadd_mmcs_attachment_meta( - SseDeserializer deserializer) { + (ArcMutexAppleAccountDefaultAnisetteProvider, LoginState) + sse_decode_record_auto_owned_rust_opaque_flutter_rust_bridgefor_generated_rust_auto_opaque_inner_arc_mutex_apple_account_default_anisette_provider_login_state( + SseDeserializer deserializer, + ) { // Codec=Sse (Serialization based), see doc to use other codecs - - if (sse_decode_bool(deserializer)) { - return (sse_decode_box_autoadd_mmcs_attachment_meta(deserializer)); - } else { - return null; - } + var var_field0 = + sse_decode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcMutexAppleAccountDefaultAnisetteProvider( + deserializer, + ); + var var_field1 = sse_decode_login_state(deserializer); + return (var_field0, var_field1); } @protected - MMCSFile? sse_decode_opt_box_autoadd_mmcs_file(SseDeserializer deserializer) { + (ArcSharedPushState, SharedPushState) + sse_decode_record_auto_owned_rust_opaque_flutter_rust_bridgefor_generated_rust_auto_opaque_inner_arc_shared_push_state_shared_push_state( + SseDeserializer deserializer, + ) { // Codec=Sse (Serialization based), see doc to use other codecs - - if (sse_decode_bool(deserializer)) { - return (sse_decode_box_autoadd_mmcs_file(deserializer)); - } else { - return null; - } + var var_field0 = + sse_decode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcSharedPushState( + deserializer, + ); + var var_field1 = sse_decode_shared_push_state(deserializer); + return (var_field0, var_field1); } @protected - NSURL? sse_decode_opt_box_autoadd_nsurl(SseDeserializer deserializer) { + (CircleClientSessionDefaultAnisetteProvider, LoginState, String?) + sse_decode_record_auto_owned_rust_opaque_flutter_rust_bridgefor_generated_rust_auto_opaque_inner_circle_client_session_default_anisette_provider_login_state_opt_string( + SseDeserializer deserializer, + ) { // Codec=Sse (Serialization based), see doc to use other codecs - - if (sse_decode_bool(deserializer)) { - return (sse_decode_box_autoadd_nsurl(deserializer)); - } else { - return null; - } + var var_field0 = + sse_decode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerCircleClientSessionDefaultAnisetteProvider( + deserializer, + ); + var var_field1 = sse_decode_login_state(deserializer); + var var_field2 = sse_decode_opt_String(deserializer); + return (var_field0, var_field1, var_field2); } @protected - NumOrString? sse_decode_opt_box_autoadd_num_or_string( - SseDeserializer deserializer) { + (Sender, ArcSenderPushMessage, ApsWatcher) + sse_decode_record_auto_owned_rust_opaque_flutter_rust_bridgefor_generated_rust_auto_opaque_inner_sender_auto_owned_rust_opaque_flutter_rust_bridgefor_generated_rust_auto_opaque_inner_arc_sender_push_message_auto_owned_rust_opaque_flutter_rust_bridgefor_generated_rust_auto_opaque_inner_aps_watcher( + SseDeserializer deserializer, + ) { // Codec=Sse (Serialization based), see doc to use other codecs - - if (sse_decode_bool(deserializer)) { - return (sse_decode_box_autoadd_num_or_string(deserializer)); - } else { - return null; - } + var var_field0 = + sse_decode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerSender( + deserializer, + ); + var var_field1 = + sse_decode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcSenderPushMessage( + deserializer, + ); + var var_field2 = + sse_decode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerAPSWatcher( + deserializer, + ); + return (var_field0, var_field1, var_field2); } @protected - PartExtension? sse_decode_opt_box_autoadd_part_extension( - SseDeserializer deserializer) { + (Uint8List, Map, int) + sse_decode_record_list_prim_u_8_strict_map_string_opt_box_autoadd_cloud_attachment_i_32( + SseDeserializer deserializer, + ) { // Codec=Sse (Serialization based), see doc to use other codecs - - if (sse_decode_bool(deserializer)) { - return (sse_decode_box_autoadd_part_extension(deserializer)); - } else { - return null; - } + var var_field0 = sse_decode_list_prim_u_8_strict(deserializer); + var var_field1 = sse_decode_Map_String_opt_box_autoadd_cloud_attachment( + deserializer, + ); + var var_field2 = sse_decode_i_32(deserializer); + return (var_field0, var_field1, var_field2); } @protected - PasswordManagerMetaDataFormerlyShared? - sse_decode_opt_box_autoadd_password_manager_meta_data_formerly_shared( - SseDeserializer deserializer) { + (Uint8List, Map, int) + sse_decode_record_list_prim_u_8_strict_map_string_opt_box_autoadd_cloud_chat_i_32( + SseDeserializer deserializer, + ) { // Codec=Sse (Serialization based), see doc to use other codecs - - if (sse_decode_bool(deserializer)) { - return (sse_decode_box_autoadd_password_manager_meta_data_formerly_shared( - deserializer)); - } else { - return null; - } + var var_field0 = sse_decode_list_prim_u_8_strict(deserializer); + var var_field1 = sse_decode_Map_String_opt_box_autoadd_cloud_chat( + deserializer, + ); + var var_field2 = sse_decode_i_32(deserializer); + return (var_field0, var_field1, var_field2); } @protected - PasswordManagerTotp? sse_decode_opt_box_autoadd_password_manager_totp( - SseDeserializer deserializer) { + (Uint8List, Map, int) + sse_decode_record_list_prim_u_8_strict_map_string_opt_box_autoadd_cloud_message_i_32( + SseDeserializer deserializer, + ) { // Codec=Sse (Serialization based), see doc to use other codecs - - if (sse_decode_bool(deserializer)) { - return (sse_decode_box_autoadd_password_manager_totp(deserializer)); - } else { - return null; - } + var var_field0 = sse_decode_list_prim_u_8_strict(deserializer); + var var_field1 = sse_decode_Map_String_opt_box_autoadd_cloud_message( + deserializer, + ); + var var_field2 = sse_decode_i_32(deserializer); + return (var_field0, var_field1, var_field2); } @protected - PosterColor? sse_decode_opt_box_autoadd_poster_color( - SseDeserializer deserializer) { + (Uint8List, Uint8List?) + sse_decode_record_list_prim_u_8_strict_opt_list_prim_u_8_strict( + SseDeserializer deserializer, + ) { // Codec=Sse (Serialization based), see doc to use other codecs - - if (sse_decode_bool(deserializer)) { - return (sse_decode_box_autoadd_poster_color(deserializer)); - } else { - return null; - } + var var_field0 = sse_decode_list_prim_u_8_strict(deserializer); + var var_field1 = sse_decode_opt_list_prim_u_8_strict(deserializer); + return (var_field0, var_field1); } @protected - PRPosterContentMaterialStyle? - sse_decode_opt_box_autoadd_pr_poster_content_material_style( - SseDeserializer deserializer) { + (List, List) + sse_decode_record_list_shared_album_list_string( + SseDeserializer deserializer, + ) { // Codec=Sse (Serialization based), see doc to use other codecs - - if (sse_decode_bool(deserializer)) { - return (sse_decode_box_autoadd_pr_poster_content_material_style( - deserializer)); - } else { - return null; - } + var var_field0 = sse_decode_list_shared_album(deserializer); + var var_field1 = sse_decode_list_String(deserializer); + return (var_field0, var_field1); } @protected - PushMessage? sse_decode_opt_box_autoadd_push_message( - SseDeserializer deserializer) { + (List, LoginState?) + sse_decode_record_list_trusted_phone_number_opt_box_autoadd_login_state( + SseDeserializer deserializer, + ) { // Codec=Sse (Serialization based), see doc to use other codecs - - if (sse_decode_bool(deserializer)) { - return (sse_decode_box_autoadd_push_message(deserializer)); - } else { - return null; - } + var var_field0 = sse_decode_list_trusted_phone_number(deserializer); + var var_field1 = sse_decode_opt_box_autoadd_login_state(deserializer); + return (var_field0, var_field1); } @protected - ( - SharedPushState, - ApsWatcher - )? sse_decode_opt_box_autoadd_record_shared_push_state_auto_owned_rust_opaque_flutter_rust_bridgefor_generated_rust_auto_opaque_inner_aps_watcher( - SseDeserializer deserializer) { + (LoginState, IdsUser?) + sse_decode_record_login_state_opt_box_autoadd_auto_owned_rust_opaque_flutter_rust_bridgefor_generated_rust_auto_opaque_inner_ids_user( + SseDeserializer deserializer, + ) { // Codec=Sse (Serialization based), see doc to use other codecs - - if (sse_decode_bool(deserializer)) { - return (sse_decode_box_autoadd_record_shared_push_state_auto_owned_rust_opaque_flutter_rust_bridgefor_generated_rust_auto_opaque_inner_aps_watcher( - deserializer)); - } else { - return null; - } + var var_field0 = sse_decode_login_state(deserializer); + var var_field1 = + sse_decode_opt_box_autoadd_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerIDSUser( + deserializer, + ); + return (var_field0, var_field1); } @protected - (String, String)? sse_decode_opt_box_autoadd_record_string_string( - SseDeserializer deserializer) { + (Map, (String, BigInt)?) + sse_decode_record_map_string_sync_status_opt_box_autoadd_record_string_u_64( + SseDeserializer deserializer, + ) { // Codec=Sse (Serialization based), see doc to use other codecs - - if (sse_decode_bool(deserializer)) { - return (sse_decode_box_autoadd_record_string_string(deserializer)); - } else { - return null; - } + var var_field0 = sse_decode_Map_String_sync_status(deserializer); + var var_field1 = sse_decode_opt_box_autoadd_record_string_u_64( + deserializer, + ); + return (var_field0, var_field1); } @protected - (String, BigInt)? sse_decode_opt_box_autoadd_record_string_u_64( - SseDeserializer deserializer) { + (List?, SupportAlert?) + sse_decode_record_opt_list_auto_owned_rust_opaque_flutter_rust_bridgefor_generated_rust_auto_opaque_inner_ids_user_opt_box_autoadd_support_alert( + SseDeserializer deserializer, + ) { // Codec=Sse (Serialization based), see doc to use other codecs - - if (sse_decode_bool(deserializer)) { - return (sse_decode_box_autoadd_record_string_u_64(deserializer)); - } else { - return null; - } + var var_field0 = + sse_decode_opt_list_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerIDSUser( + deserializer, + ); + var var_field1 = sse_decode_opt_box_autoadd_support_alert(deserializer); + return (var_field0, var_field1); } @protected - RichLinkImageAttachmentSubstitute? - sse_decode_opt_box_autoadd_rich_link_image_attachment_substitute( - SseDeserializer deserializer) { + (String?, Passkey) sse_decode_record_opt_string_passkey( + SseDeserializer deserializer, + ) { // Codec=Sse (Serialization based), see doc to use other codecs - - if (sse_decode_bool(deserializer)) { - return (sse_decode_box_autoadd_rich_link_image_attachment_substitute( - deserializer)); - } else { - return null; - } + var var_field0 = sse_decode_opt_String(deserializer); + var var_field1 = sse_decode_passkey(deserializer); + return (var_field0, var_field1); } @protected - ScheduleMode? sse_decode_opt_box_autoadd_schedule_mode( - SseDeserializer deserializer) { + (String?, PasswordManagerMeta) + sse_decode_record_opt_string_password_manager_meta( + SseDeserializer deserializer, + ) { // Codec=Sse (Serialization based), see doc to use other codecs - - if (sse_decode_bool(deserializer)) { - return (sse_decode_box_autoadd_schedule_mode(deserializer)); - } else { - return null; - } + var var_field0 = sse_decode_opt_String(deserializer); + var var_field1 = sse_decode_password_manager_meta(deserializer); + return (var_field0, var_field1); } @protected - ShareProfileMessage? sse_decode_opt_box_autoadd_share_profile_message( - SseDeserializer deserializer) { + (String?, PasswordRawEntry) sse_decode_record_opt_string_password_raw_entry( + SseDeserializer deserializer, + ) { // Codec=Sse (Serialization based), see doc to use other codecs - - if (sse_decode_bool(deserializer)) { - return (sse_decode_box_autoadd_share_profile_message(deserializer)); - } else { - return null; - } + var var_field0 = sse_decode_opt_String(deserializer); + var var_field1 = sse_decode_password_raw_entry(deserializer); + return (var_field0, var_field1); } @protected - SharedICloudServices? sse_decode_opt_box_autoadd_shared_i_cloud_services( - SseDeserializer deserializer) { + (String?, WifiPassword) sse_decode_record_opt_string_wifi_password( + SseDeserializer deserializer, + ) { // Codec=Sse (Serialization based), see doc to use other codecs - - if (sse_decode_bool(deserializer)) { - return (sse_decode_box_autoadd_shared_i_cloud_services(deserializer)); - } else { - return null; - } + var var_field0 = sse_decode_opt_String(deserializer); + var var_field1 = sse_decode_wifi_password(deserializer); + return (var_field0, var_field1); } @protected - SharedPoster? sse_decode_opt_box_autoadd_shared_poster( - SseDeserializer deserializer) { + (SharedPushState, ApsWatcher) + sse_decode_record_shared_push_state_auto_owned_rust_opaque_flutter_rust_bridgefor_generated_rust_auto_opaque_inner_aps_watcher( + SseDeserializer deserializer, + ) { // Codec=Sse (Serialization based), see doc to use other codecs - - if (sse_decode_bool(deserializer)) { - return (sse_decode_box_autoadd_shared_poster(deserializer)); - } else { - return null; - } + var var_field0 = sse_decode_shared_push_state(deserializer); + var var_field1 = + sse_decode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerAPSWatcher( + deserializer, + ); + return (var_field0, var_field1); } @protected - SharedPushState? sse_decode_opt_box_autoadd_shared_push_state( - SseDeserializer deserializer) { + (String, Asset) + sse_decode_record_string_auto_owned_rust_opaque_flutter_rust_bridgefor_generated_rust_auto_opaque_inner_asset( + SseDeserializer deserializer, + ) { // Codec=Sse (Serialization based), see doc to use other codecs - - if (sse_decode_bool(deserializer)) { - return (sse_decode_box_autoadd_shared_push_state(deserializer)); - } else { - return null; - } + var var_field0 = sse_decode_String(deserializer); + var var_field1 = + sse_decode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerAsset( + deserializer, + ); + return (var_field0, var_field1); } @protected - SupportAction? sse_decode_opt_box_autoadd_support_action( - SseDeserializer deserializer) { + (String, StCollapsedValue) + sse_decode_record_string_auto_owned_rust_opaque_flutter_rust_bridgefor_generated_rust_auto_opaque_inner_st_collapsed_value( + SseDeserializer deserializer, + ) { // Codec=Sse (Serialization based), see doc to use other codecs + var var_field0 = sse_decode_String(deserializer); + var var_field1 = + sse_decode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerStCollapsedValue( + deserializer, + ); + return (var_field0, var_field1); + } - if (sse_decode_bool(deserializer)) { - return (sse_decode_box_autoadd_support_action(deserializer)); - } else { - return null; - } + @protected + (String, bool) sse_decode_record_string_bool(SseDeserializer deserializer) { + // Codec=Sse (Serialization based), see doc to use other codecs + var var_field0 = sse_decode_String(deserializer); + var var_field1 = sse_decode_bool(deserializer); + return (var_field0, var_field1); } @protected - SupportAlert? sse_decode_opt_box_autoadd_support_alert( - SseDeserializer deserializer) { + (String, int) sse_decode_record_string_casted_primitive_u_64( + SseDeserializer deserializer, + ) { // Codec=Sse (Serialization based), see doc to use other codecs - - if (sse_decode_bool(deserializer)) { - return (sse_decode_box_autoadd_support_alert(deserializer)); - } else { - return null; - } + var var_field0 = sse_decode_String(deserializer); + var var_field1 = sse_decode_CastedPrimitive_u_64(deserializer); + return (var_field0, var_field1); } @protected - TypingApp? sse_decode_opt_box_autoadd_typing_app( - SseDeserializer deserializer) { + (String, CloudAttachment) sse_decode_record_string_cloud_attachment( + SseDeserializer deserializer, + ) { // Codec=Sse (Serialization based), see doc to use other codecs - - if (sse_decode_bool(deserializer)) { - return (sse_decode_box_autoadd_typing_app(deserializer)); - } else { - return null; - } + var var_field0 = sse_decode_String(deserializer); + var var_field1 = sse_decode_cloud_attachment(deserializer); + return (var_field0, var_field1); } @protected - int? sse_decode_opt_box_autoadd_u_32(SseDeserializer deserializer) { + (String, CloudChat) sse_decode_record_string_cloud_chat( + SseDeserializer deserializer, + ) { // Codec=Sse (Serialization based), see doc to use other codecs - - if (sse_decode_bool(deserializer)) { - return (sse_decode_box_autoadd_u_32(deserializer)); - } else { - return null; - } + var var_field0 = sse_decode_String(deserializer); + var var_field1 = sse_decode_cloud_chat(deserializer); + return (var_field0, var_field1); } @protected - BigInt? sse_decode_opt_box_autoadd_u_64(SseDeserializer deserializer) { + (String, CloudMessage) sse_decode_record_string_cloud_message( + SseDeserializer deserializer, + ) { // Codec=Sse (Serialization based), see doc to use other codecs - - if (sse_decode_bool(deserializer)) { - return (sse_decode_box_autoadd_u_64(deserializer)); - } else { - return null; - } + var var_field0 = sse_decode_String(deserializer); + var var_field1 = sse_decode_cloud_message(deserializer); + return (var_field0, var_field1); } @protected - UpdateAccountFinish? sse_decode_opt_box_autoadd_update_account_finish( - SseDeserializer deserializer) { + (String, FTParticipant) sse_decode_record_string_ft_participant( + SseDeserializer deserializer, + ) { // Codec=Sse (Serialization based), see doc to use other codecs - - if (sse_decode_bool(deserializer)) { - return (sse_decode_box_autoadd_update_account_finish(deserializer)); - } else { - return null; - } + var var_field0 = sse_decode_String(deserializer); + var var_field1 = sse_decode_ft_participant(deserializer); + return (var_field0, var_field1); } @protected - List? - sse_decode_opt_list_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerIDSUser( - SseDeserializer deserializer) { + (String, GroupSummary) sse_decode_record_string_group_summary( + SseDeserializer deserializer, + ) { // Codec=Sse (Serialization based), see doc to use other codecs - - if (sse_decode_bool(deserializer)) { - return (sse_decode_list_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerIDSUser( - deserializer)); - } else { - return null; - } + var var_field0 = sse_decode_String(deserializer); + var var_field1 = sse_decode_group_summary(deserializer); + return (var_field0, var_field1); } @protected - List? sse_decode_opt_list_String(SseDeserializer deserializer) { + (String, List) sse_decode_record_string_list_message_edit( + SseDeserializer deserializer, + ) { // Codec=Sse (Serialization based), see doc to use other codecs - - if (sse_decode_bool(deserializer)) { - return (sse_decode_list_String(deserializer)); - } else { - return null; - } + var var_field0 = sse_decode_String(deserializer); + var var_field1 = sse_decode_list_message_edit(deserializer); + return (var_field0, var_field1); } @protected - List? sse_decode_opt_list_message_target( - SseDeserializer deserializer) { + (String, Uint8List) sse_decode_record_string_list_prim_u_8_strict( + SseDeserializer deserializer, + ) { // Codec=Sse (Serialization based), see doc to use other codecs - - if (sse_decode_bool(deserializer)) { - return (sse_decode_list_message_target(deserializer)); - } else { - return null; - } + var var_field0 = sse_decode_String(deserializer); + var var_field1 = sse_decode_list_prim_u_8_strict(deserializer); + return (var_field0, var_field1); } @protected - Uint8List? sse_decode_opt_list_prim_u_8_strict(SseDeserializer deserializer) { + (String, Map, Map) + sse_decode_record_string_map_string_group_summary_map_string_share_invite_content_data( + SseDeserializer deserializer, + ) { // Codec=Sse (Serialization based), see doc to use other codecs - - if (sse_decode_bool(deserializer)) { - return (sse_decode_list_prim_u_8_strict(deserializer)); - } else { - return null; - } + var var_field0 = sse_decode_String(deserializer); + var var_field1 = sse_decode_Map_String_group_summary(deserializer); + var var_field2 = sse_decode_Map_String_share_invite_content_data( + deserializer, + ); + return (var_field0, var_field1, var_field2); } @protected - PartExtension sse_decode_part_extension(SseDeserializer deserializer) { + (String, MessageEditRange) sse_decode_record_string_message_edit_range( + SseDeserializer deserializer, + ) { // Codec=Sse (Serialization based), see doc to use other codecs + var var_field0 = sse_decode_String(deserializer); + var var_field1 = sse_decode_message_edit_range(deserializer); + return (var_field0, var_field1); + } - var tag_ = sse_decode_i_32(deserializer); - switch (tag_) { - case 0: - var var_msgWidth = sse_decode_f_64(deserializer); - var var_rotation = sse_decode_f_64(deserializer); - var var_sai = sse_decode_u_64(deserializer); - var var_scale = sse_decode_f_64(deserializer); - var var_update = sse_decode_opt_box_autoadd_bool(deserializer); - var var_sli = sse_decode_u_64(deserializer); - var var_normalizedX = sse_decode_f_64(deserializer); - var var_normalizedY = sse_decode_f_64(deserializer); - var var_version = sse_decode_u_64(deserializer); - var var_hash = sse_decode_String(deserializer); - var var_safi = sse_decode_u_64(deserializer); - var var_effectType = sse_decode_i_64(deserializer); - var var_stickerId = sse_decode_String(deserializer); - return PartExtension_Sticker( - msgWidth: var_msgWidth, - rotation: var_rotation, - sai: var_sai, - scale: var_scale, - update: var_update, - sli: var_sli, - normalizedX: var_normalizedX, - normalizedY: var_normalizedY, - version: var_version, - hash: var_hash, - safi: var_safi, - effectType: var_effectType, - stickerId: var_stickerId); - default: - throw UnimplementedError(''); - } + @protected + (String, CloudAttachment?) + sse_decode_record_string_opt_box_autoadd_cloud_attachment( + SseDeserializer deserializer, + ) { + // Codec=Sse (Serialization based), see doc to use other codecs + var var_field0 = sse_decode_String(deserializer); + var var_field1 = sse_decode_opt_box_autoadd_cloud_attachment(deserializer); + return (var_field0, var_field1); } @protected - Passkey sse_decode_passkey(SseDeserializer deserializer) { + (String, CloudChat?) sse_decode_record_string_opt_box_autoadd_cloud_chat( + SseDeserializer deserializer, + ) { // Codec=Sse (Serialization based), see doc to use other codecs - var var_cdat = sse_decode_CastedPrimitive_u_64(deserializer); - var var_mdat = sse_decode_CastedPrimitive_u_64(deserializer); - var var_agrp = sse_decode_String(deserializer); - var var_labl = sse_decode_String(deserializer); - var var_data = sse_decode_list_prim_u_8_strict(deserializer); - var var_atag = sse_decode_list_prim_u_8_strict(deserializer); - var var_klbl = sse_decode_list_prim_u_8_strict(deserializer); - return Passkey( - cdat: var_cdat, - mdat: var_mdat, - agrp: var_agrp, - labl: var_labl, - data: var_data, - atag: var_atag, - klbl: var_klbl); + var var_field0 = sse_decode_String(deserializer); + var var_field1 = sse_decode_opt_box_autoadd_cloud_chat(deserializer); + return (var_field0, var_field1); } @protected - PasswordManagerAltDomain sse_decode_password_manager_alt_domain( - SseDeserializer deserializer) { + (String, CloudMessage?) + sse_decode_record_string_opt_box_autoadd_cloud_message( + SseDeserializer deserializer, + ) { // Codec=Sse (Serialization based), see doc to use other codecs - var var_domain = sse_decode_String(deserializer); - return PasswordManagerAltDomain(domain: var_domain); + var var_field0 = sse_decode_String(deserializer); + var var_field1 = sse_decode_opt_box_autoadd_cloud_message(deserializer); + return (var_field0, var_field1); } @protected - PasswordManagerMeta sse_decode_password_manager_meta( - SseDeserializer deserializer) { + (String, PasswordManagerMetaDataCtx) + sse_decode_record_string_password_manager_meta_data_ctx( + SseDeserializer deserializer, + ) { // Codec=Sse (Serialization based), see doc to use other codecs - var var_cdat = sse_decode_CastedPrimitive_u_64(deserializer); - var var_mdat = sse_decode_CastedPrimitive_u_64(deserializer); - var var_srvr = sse_decode_String(deserializer); - var var_acct = sse_decode_String(deserializer); - var var_agrp = sse_decode_String(deserializer); - var var_data = sse_decode_list_prim_u_8_strict(deserializer); - return PasswordManagerMeta( - cdat: var_cdat, - mdat: var_mdat, - srvr: var_srvr, - acct: var_acct, - agrp: var_agrp, - data: var_data); + var var_field0 = sse_decode_String(deserializer); + var var_field1 = sse_decode_password_manager_meta_data_ctx(deserializer); + return (var_field0, var_field1); } @protected - PasswordManagerMetaChange sse_decode_password_manager_meta_change( - SseDeserializer deserializer) { + (String, (String?, Passkey)) + sse_decode_record_string_record_opt_string_passkey( + SseDeserializer deserializer, + ) { // Codec=Sse (Serialization based), see doc to use other codecs - var var_date = sse_decode_CastedPrimitive_u_64(deserializer); - var var_password = sse_decode_opt_String(deserializer); - var var_oldPassword = sse_decode_opt_String(deserializer); - var var_groupName = sse_decode_opt_String(deserializer); - var var_groupId = sse_decode_opt_String(deserializer); - var var_shareType = sse_decode_opt_String(deserializer); - var var_id = sse_decode_String(deserializer); - var var_typ = sse_decode_String(deserializer); - return PasswordManagerMetaChange( - date: var_date, - password: var_password, - oldPassword: var_oldPassword, - groupName: var_groupName, - groupId: var_groupId, - shareType: var_shareType, - id: var_id, - typ: var_typ); + var var_field0 = sse_decode_String(deserializer); + var var_field1 = sse_decode_record_opt_string_passkey(deserializer); + return (var_field0, var_field1); } @protected - PasswordManagerMetaData sse_decode_password_manager_meta_data( - SseDeserializer deserializer) { - // Codec=Sse (Serialization based), see doc to use other codecs - var var_history = - sse_decode_list_password_manager_meta_change(deserializer); - var var_altDomains = - sse_decode_list_password_manager_alt_domain(deserializer); - var var_totp = - sse_decode_opt_box_autoadd_password_manager_totp(deserializer); - var var_ctxt = - sse_decode_Map_String_password_manager_meta_data_ctx(deserializer); - var var_title = sse_decode_opt_list_prim_u_8_strict(deserializer); - var var_notes = sse_decode_opt_list_prim_u_8_strict(deserializer); - var var_formerlyShared = - sse_decode_opt_box_autoadd_password_manager_meta_data_formerly_shared( - deserializer); - var var_ocpid = sse_decode_opt_list_prim_u_8_strict(deserializer); - return PasswordManagerMetaData( - history: var_history, - altDomains: var_altDomains, - totp: var_totp, - ctxt: var_ctxt, - title: var_title, - notes: var_notes, - formerlyShared: var_formerlyShared, - ocpid: var_ocpid); + (String, (String?, PasswordManagerMeta)) + sse_decode_record_string_record_opt_string_password_manager_meta( + SseDeserializer deserializer, + ) { + // Codec=Sse (Serialization based), see doc to use other codecs + var var_field0 = sse_decode_String(deserializer); + var var_field1 = sse_decode_record_opt_string_password_manager_meta( + deserializer, + ); + return (var_field0, var_field1); } @protected - PasswordManagerMetaDataCtx sse_decode_password_manager_meta_data_ctx( - SseDeserializer deserializer) { + (String, (String?, PasswordRawEntry)) + sse_decode_record_string_record_opt_string_password_raw_entry( + SseDeserializer deserializer, + ) { // Codec=Sse (Serialization based), see doc to use other codecs - var var_lastUsed = sse_decode_f_64(deserializer); - return PasswordManagerMetaDataCtx(lastUsed: var_lastUsed); + var var_field0 = sse_decode_String(deserializer); + var var_field1 = sse_decode_record_opt_string_password_raw_entry( + deserializer, + ); + return (var_field0, var_field1); } @protected - PasswordManagerMetaDataFormerlyShared - sse_decode_password_manager_meta_data_formerly_shared( - SseDeserializer deserializer) { + (String, (String?, WifiPassword)) + sse_decode_record_string_record_opt_string_wifi_password( + SseDeserializer deserializer, + ) { // Codec=Sse (Serialization based), see doc to use other codecs - var var_groupName = sse_decode_opt_String(deserializer); - var var_passwordManagerCredentialIdentifier = - sse_decode_opt_String(deserializer); - return PasswordManagerMetaDataFormerlyShared( - groupName: var_groupName, - passwordManagerCredentialIdentifier: - var_passwordManagerCredentialIdentifier); + var var_field0 = sse_decode_String(deserializer); + var var_field1 = sse_decode_record_opt_string_wifi_password(deserializer); + return (var_field0, var_field1); } @protected - PasswordManagerTotp sse_decode_password_manager_totp( - SseDeserializer deserializer) { + (String, ShareInviteContentData) + sse_decode_record_string_share_invite_content_data( + SseDeserializer deserializer, + ) { // Codec=Sse (Serialization based), see doc to use other codecs - var var_secret = sse_decode_list_prim_u_8_strict(deserializer); - var var_digits = sse_decode_u_32(deserializer); - var var_issuer = sse_decode_opt_String(deserializer); - var var_period = sse_decode_u_32(deserializer); - var var_initialDate = sse_decode_CastedPrimitive_u_64(deserializer); - var var_algorithm = sse_decode_u_32(deserializer); - var var_accountName = sse_decode_opt_String(deserializer); - var var_originalUrl = sse_decode_opt_String(deserializer); - return PasswordManagerTotp( - secret: var_secret, - digits: var_digits, - issuer: var_issuer, - period: var_period, - initialDate: var_initialDate, - algorithm: var_algorithm, - accountName: var_accountName, - originalUrl: var_originalUrl); + var var_field0 = sse_decode_String(deserializer); + var var_field1 = sse_decode_share_invite_content_data(deserializer); + return (var_field0, var_field1); } @protected - PasswordRawEntry sse_decode_password_raw_entry(SseDeserializer deserializer) { + (String, SharedPushState) sse_decode_record_string_shared_push_state( + SseDeserializer deserializer, + ) { // Codec=Sse (Serialization based), see doc to use other codecs - var var_cdat = sse_decode_CastedPrimitive_u_64(deserializer); - var var_mdat = sse_decode_CastedPrimitive_u_64(deserializer); - var var_srvr = sse_decode_String(deserializer); - var var_acct = sse_decode_String(deserializer); - var var_agrp = sse_decode_String(deserializer); - var var_data = sse_decode_list_prim_u_8_strict(deserializer); - return PasswordRawEntry( - cdat: var_cdat, - mdat: var_mdat, - srvr: var_srvr, - acct: var_acct, - agrp: var_agrp, - data: var_data); + var var_field0 = sse_decode_String(deserializer); + var var_field1 = sse_decode_shared_push_state(deserializer); + return (var_field0, var_field1); } @protected - PermanentDeleteMessage sse_decode_permanent_delete_message( - SseDeserializer deserializer) { + (String, StatusKitPersonalConfig) + sse_decode_record_string_status_kit_personal_config( + SseDeserializer deserializer, + ) { // Codec=Sse (Serialization based), see doc to use other codecs - var var_target = sse_decode_delete_target(deserializer); - var var_isScheduled = sse_decode_bool(deserializer); - return PermanentDeleteMessage( - target: var_target, isScheduled: var_isScheduled); + var var_field0 = sse_decode_String(deserializer); + var var_field1 = sse_decode_status_kit_personal_config(deserializer); + return (var_field0, var_field1); } @protected - PhotoPosterContents sse_decode_photo_poster_contents( - SseDeserializer deserializer) { + (String, String) sse_decode_record_string_string( + SseDeserializer deserializer, + ) { // Codec=Sse (Serialization based), see doc to use other codecs - var var_version = sse_decode_u_32(deserializer); - var var_layers = sse_decode_list_photo_poster_layer(deserializer); - var var_properties = sse_decode_photo_poster_properties(deserializer); - return PhotoPosterContents( - version: var_version, layers: var_layers, properties: var_properties); + var var_field0 = sse_decode_String(deserializer); + var var_field1 = sse_decode_String(deserializer); + return (var_field0, var_field1); } @protected - PhotoPosterContentsFrame sse_decode_photo_poster_contents_frame( - SseDeserializer deserializer) { + (String, SyncStatus) sse_decode_record_string_sync_status( + SseDeserializer deserializer, + ) { // Codec=Sse (Serialization based), see doc to use other codecs - var var_width = sse_decode_f_64(deserializer); - var var_height = sse_decode_f_64(deserializer); - var var_x = sse_decode_f_64(deserializer); - var var_y = sse_decode_f_64(deserializer); - return PhotoPosterContentsFrame( - width: var_width, height: var_height, x: var_x, y: var_y); + var var_field0 = sse_decode_String(deserializer); + var var_field1 = sse_decode_sync_status(deserializer); + return (var_field0, var_field1); } @protected - PhotoPosterContentsSize sse_decode_photo_poster_contents_size( - SseDeserializer deserializer) { + (String, BigInt) sse_decode_record_string_u_64(SseDeserializer deserializer) { // Codec=Sse (Serialization based), see doc to use other codecs - var var_width = sse_decode_f_64(deserializer); - var var_height = sse_decode_f_64(deserializer); - return PhotoPosterContentsSize(width: var_width, height: var_height); + var var_field0 = sse_decode_String(deserializer); + var var_field1 = sse_decode_u_64(deserializer); + return (var_field0, var_field1); } @protected - PhotoPosterLayer sse_decode_photo_poster_layer(SseDeserializer deserializer) { + (String, UpdateAccountFinish) sse_decode_record_string_update_account_finish( + SseDeserializer deserializer, + ) { // Codec=Sse (Serialization based), see doc to use other codecs - var var_frame = sse_decode_photo_poster_contents_frame(deserializer); - var var_filename = sse_decode_String(deserializer); - var var_zPosition = sse_decode_f_32(deserializer); - var var_identifier = sse_decode_String(deserializer); - return PhotoPosterLayer( - frame: var_frame, - filename: var_filename, - zPosition: var_zPosition, - identifier: var_identifier); + var var_field0 = sse_decode_String(deserializer); + var var_field1 = sse_decode_update_account_finish(deserializer); + return (var_field0, var_field1); } @protected - PhotoPosterLayout sse_decode_photo_poster_layout( - SseDeserializer deserializer) { + (int, NSDictionaryTypedCoder) + sse_decode_record_u_32_ns_dictionary_typed_coder( + SseDeserializer deserializer, + ) { // Codec=Sse (Serialization based), see doc to use other codecs - var var_clockIntersection = sse_decode_u_32(deserializer); - var var_deviceResolution = - sse_decode_photo_poster_contents_size(deserializer); - var var_visibleFrame = sse_decode_photo_poster_contents_frame(deserializer); - var var_timeFrame = sse_decode_photo_poster_contents_frame(deserializer); - var var_clockLayerOrder = sse_decode_String(deserializer); - var var_hasTopEdgeContact = sse_decode_bool(deserializer); - var var_inactiveFrame = - sse_decode_photo_poster_contents_frame(deserializer); - var var_imageSize = sse_decode_photo_poster_contents_size(deserializer); - var var_parallaxPadding = - sse_decode_photo_poster_contents_size(deserializer); - return PhotoPosterLayout( - clockIntersection: var_clockIntersection, - deviceResolution: var_deviceResolution, - visibleFrame: var_visibleFrame, - timeFrame: var_timeFrame, - clockLayerOrder: var_clockLayerOrder, - hasTopEdgeContact: var_hasTopEdgeContact, - inactiveFrame: var_inactiveFrame, - imageSize: var_imageSize, - parallaxPadding: var_parallaxPadding); + var var_field0 = sse_decode_u_32(deserializer); + var var_field1 = sse_decode_ns_dictionary_typed_coder(deserializer); + return (var_field0, var_field1); } @protected - PhotoPosterProperties sse_decode_photo_poster_properties( - SseDeserializer deserializer) { + (int, BigInt) sse_decode_record_u_32_u_64(SseDeserializer deserializer) { // Codec=Sse (Serialization based), see doc to use other codecs - var var_portraitLayout = sse_decode_photo_poster_layout(deserializer); - var var_settlingEffectEnabled = sse_decode_bool(deserializer); - var var_depthEnabled = sse_decode_bool(deserializer); - var var_clockAreaLuminance = sse_decode_f_64(deserializer); - var var_parallaxDisabled = sse_decode_bool(deserializer); - return PhotoPosterProperties( - portraitLayout: var_portraitLayout, - settlingEffectEnabled: var_settlingEffectEnabled, - depthEnabled: var_depthEnabled, - clockAreaLuminance: var_clockAreaLuminance, - parallaxDisabled: var_parallaxDisabled); + var var_field0 = sse_decode_u_32(deserializer); + var var_field1 = sse_decode_u_64(deserializer); + return (var_field0, var_field1); } @protected - PollResult sse_decode_poll_result(SseDeserializer deserializer) { + RegisterState sse_decode_register_state(SseDeserializer deserializer) { // Codec=Sse (Serialization based), see doc to use other codecs var tag_ = sse_decode_i_32(deserializer); switch (tag_) { case 0: - return PollResult_Stop(); + var var_nextS = sse_decode_i_64(deserializer); + return RegisterState_Registered(nextS: var_nextS); case 1: - var var_field0 = sse_decode_opt_box_autoadd_push_message(deserializer); - return PollResult_Cont(var_field0); + return RegisterState_Registering(); + case 2: + var var_retryWait = sse_decode_opt_box_autoadd_u_64(deserializer); + var var_error = sse_decode_String(deserializer); + return RegisterState_Failed(retryWait: var_retryWait, error: var_error); default: throw UnimplementedError(''); } } @protected - PosterAsset sse_decode_poster_asset(SseDeserializer deserializer) { + RenameMessage sse_decode_rename_message(SseDeserializer deserializer) { // Codec=Sse (Serialization based), see doc to use other codecs - var var_contents = sse_decode_photo_poster_contents(deserializer); - var var_files = sse_decode_Map_String_list_prim_u_8_strict(deserializer); - var var_uuid = sse_decode_String(deserializer); - return PosterAsset( - contents: var_contents, files: var_files, uuid: var_uuid); + var var_newName = sse_decode_String(deserializer); + return RenameMessage(newName: var_newName); } @protected - PosterColor sse_decode_poster_color(SseDeserializer deserializer) { + ReportMessage sse_decode_report_message(SseDeserializer deserializer) { // Codec=Sse (Serialization based), see doc to use other codecs - var var_alpha = sse_decode_f_64(deserializer); - var var_blue = sse_decode_f_64(deserializer); - var var_green = sse_decode_f_64(deserializer); - var var_red = sse_decode_f_64(deserializer); - return PosterColor( - alpha: var_alpha, blue: var_blue, green: var_green, red: var_red); + var var_guid = sse_decode_String(deserializer); + var var_sender = sse_decode_String(deserializer); + var var_conversationSize = sse_decode_u_32(deserializer); + var var_parts = sse_decode_message_parts(deserializer); + var var_timeOfMessage = sse_decode_f_64(deserializer); + return ReportMessage( + guid: var_guid, + sender: var_sender, + conversationSize: var_conversationSize, + parts: var_parts, + timeOfMessage: var_timeOfMessage, + ); } @protected - PosterRole sse_decode_poster_role(SseDeserializer deserializer) { + RichLinkImageAttachmentSubstitute + sse_decode_rich_link_image_attachment_substitute( + SseDeserializer deserializer, + ) { // Codec=Sse (Serialization based), see doc to use other codecs - var inner = sse_decode_i_32(deserializer); - return PosterRole.values[inner]; + var var_mimeType = sse_decode_String(deserializer); + var var_richLinkImageAttachmentSubstituteIndex = sse_decode_u_64( + deserializer, + ); + return RichLinkImageAttachmentSubstitute( + mimeType: var_mimeType, + richLinkImageAttachmentSubstituteIndex: + var_richLinkImageAttachmentSubstituteIndex, + ); } @protected - PosterType sse_decode_poster_type(SseDeserializer deserializer) { + ScheduleMode sse_decode_schedule_mode(SseDeserializer deserializer) { + // Codec=Sse (Serialization based), see doc to use other codecs + var var_ms = sse_decode_CastedPrimitive_u_64(deserializer); + var var_schedule = sse_decode_bool(deserializer); + return ScheduleMode(ms: var_ms, schedule: var_schedule); + } + + @protected + SetTranscriptBackgroundMessage sse_decode_set_transcript_background_message( + SseDeserializer deserializer, + ) { // Codec=Sse (Serialization based), see doc to use other codecs var tag_ = sse_decode_i_32(deserializer); switch (tag_) { case 0: - var var_assets = sse_decode_list_poster_asset(deserializer); - return PosterType_Photo(assets: var_assets); + var var_aid = sse_decode_u_32(deserializer); + var var_bid = sse_decode_u_64(deserializer); + var var_chatId = sse_decode_opt_String(deserializer); + var var_remove = sse_decode_bool(deserializer); + return SetTranscriptBackgroundMessage_Remove( + aid: var_aid, + bid: var_bid, + chatId: var_chatId, + remove: var_remove, + ); case 1: - var var_data = sse_decode_box_autoadd_monogram_data(deserializer); - var var_background = sse_decode_box_autoadd_poster_color(deserializer); - return PosterType_Monogram(data: var_data, background: var_background); - case 2: - var var_data = sse_decode_box_autoadd_memoji_data(deserializer); - var var_background = sse_decode_box_autoadd_poster_color(deserializer); - return PosterType_Memoji(data: var_data, background: var_background); - case 3: - var var_data = - sse_decode_box_autoadd_transcript_dynamic_user_data(deserializer); - return PosterType_TranscriptDynamic(data: var_data); - case 4: - var var_colors = sse_decode_list_poster_color(deserializer); - return PosterType_TranscriptGradient(colors: var_colors); + var var_aid = sse_decode_u_32(deserializer); + var var_bid = sse_decode_u_64(deserializer); + var var_chatId = sse_decode_opt_String(deserializer); + var var_objectId = sse_decode_String(deserializer); + var var_payloadVersion = sse_decode_u_32(deserializer); + var var_backgroundId = sse_decode_String(deserializer); + var var_url = sse_decode_String(deserializer); + var var_signature = sse_decode_String(deserializer); + var var_key = sse_decode_String(deserializer); + var var_fileSize = sse_decode_usize(deserializer); + return SetTranscriptBackgroundMessage_Set( + aid: var_aid, + bid: var_bid, + chatId: var_chatId, + objectId: var_objectId, + payloadVersion: var_payloadVersion, + backgroundId: var_backgroundId, + url: var_url, + signature: var_signature, + key: var_key, + fileSize: var_fileSize, + ); default: throw UnimplementedError(''); } } @protected - PRPosterColor sse_decode_pr_poster_color(SseDeserializer deserializer) { + ShareInviteContentData sse_decode_share_invite_content_data( + SseDeserializer deserializer, + ) { // Codec=Sse (Serialization based), see doc to use other codecs - var var_preferredStyle = sse_decode_u_32(deserializer); - var var_identifier = sse_decode_String(deserializer); - var var_suggested = sse_decode_bool(deserializer); - var var_color = sse_decode_ui_color(deserializer); - return PRPosterColor( - preferredStyle: var_preferredStyle, - identifier: var_identifier, - suggested: var_suggested, - color: var_color); + var var_invitationToken = sse_decode_list_prim_u_8_strict(deserializer); + var var_groupId = sse_decode_String(deserializer); + var var_sentTime = + sse_decode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerDate( + deserializer, + ); + var var_groupName = sse_decode_String(deserializer); + var var_shareUrl = sse_decode_String(deserializer); + var var_inviteeHandle = sse_decode_String(deserializer); + return ShareInviteContentData( + invitationToken: var_invitationToken, + groupId: var_groupId, + sentTime: var_sentTime, + groupName: var_groupName, + shareUrl: var_shareUrl, + inviteeHandle: var_inviteeHandle, + ); } @protected - PRPosterContentMaterialStyle sse_decode_pr_poster_content_material_style( - SseDeserializer deserializer) { + ShareProfileMessage sse_decode_share_profile_message( + SseDeserializer deserializer, + ) { // Codec=Sse (Serialization based), see doc to use other codecs + var var_cloudKitDecryptionRecordKey = sse_decode_list_prim_u_8_strict( + deserializer, + ); + var var_cloudKitRecordKey = sse_decode_String(deserializer); + var var_poster = sse_decode_opt_box_autoadd_shared_poster(deserializer); + return ShareProfileMessage( + cloudKitDecryptionRecordKey: var_cloudKitDecryptionRecordKey, + cloudKitRecordKey: var_cloudKitRecordKey, + poster: var_poster, + ); + } - var tag_ = sse_decode_i_32(deserializer); - switch (tag_) { - case 0: - var var_variation = sse_decode_f_32(deserializer); - var var_colors = sse_decode_list_ui_color(deserializer); - var var_vibrant = sse_decode_bool(deserializer); - var var_supportsVariation = sse_decode_bool(deserializer); - var var_needsToResolveVariation = sse_decode_bool(deserializer); - return PRPosterContentMaterialStyle_PRPosterContentDiscreteColorsStyle( - variation: var_variation, - colors: var_colors, - vibrant: var_vibrant, - supportsVariation: var_supportsVariation, - needsToResolveVariation: var_needsToResolveVariation); - case 1: - return PRPosterContentMaterialStyle_PRPosterContentVibrantMaterialStyle(); - case 2: - var var_gradientType = sse_decode_u_32(deserializer); - var var_colors = sse_decode_list_ui_color(deserializer); - var var_startPoint = sse_decode_String(deserializer); - var var_locations = sse_decode_list_prim_f_64_strict(deserializer); - var var_endPoint = sse_decode_String(deserializer); - return PRPosterContentMaterialStyle_PRPosterContentGradientStyle( - gradientType: var_gradientType, - colors: var_colors, - startPoint: var_startPoint, - locations: var_locations, - endPoint: var_endPoint); - default: - throw UnimplementedError(''); - } + @protected + SharedAlbum sse_decode_shared_album(SseDeserializer deserializer) { + // Codec=Sse (Serialization based), see doc to use other codecs + var var_name = sse_decode_opt_String(deserializer); + var var_fullname = sse_decode_opt_String(deserializer); + var var_email = sse_decode_opt_String(deserializer); + var var_albumguid = sse_decode_String(deserializer); + var var_sharingtype = sse_decode_String(deserializer); + var var_subscriptiondate = sse_decode_opt_String(deserializer); + var var_albumlocation = sse_decode_opt_String(deserializer); + var var_assets = sse_decode_list_String(deserializer); + var var_delete = sse_decode_opt_String(deserializer); + return SharedAlbum( + name: var_name, + fullname: var_fullname, + email: var_email, + albumguid: var_albumguid, + sharingtype: var_sharingtype, + subscriptiondate: var_subscriptiondate, + albumlocation: var_albumlocation, + assets: var_assets, + delete: var_delete, + ); } @protected - PRPosterSystemTimeFontConfiguration - sse_decode_pr_poster_system_time_font_configuration( - SseDeserializer deserializer) { + SharedICloudServices sse_decode_shared_i_cloud_services( + SseDeserializer deserializer, + ) { // Codec=Sse (Serialization based), see doc to use other codecs - var var_isSystemItem = sse_decode_bool(deserializer); - var var_timeFontIdentifier = sse_decode_String(deserializer); - var var_weight = sse_decode_f_64(deserializer); - return PRPosterSystemTimeFontConfiguration( - isSystemItem: var_isSystemItem, - timeFontIdentifier: var_timeFontIdentifier, - weight: var_weight); + var var_account = + sse_decode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcMutexAppleAccountDefaultAnisetteProvider( + deserializer, + ); + var var_tokenProvider = + sse_decode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcTokenProviderDefaultAnisetteProvider( + deserializer, + ); + var var_cloudkitClient = + sse_decode_opt_box_autoadd_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcCloudKitClientDefaultAnisetteProvider( + deserializer, + ); + var var_keychain = + sse_decode_opt_box_autoadd_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcKeychainClientDefaultAnisetteProvider( + deserializer, + ); + var var_passwords = + sse_decode_opt_box_autoadd_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcPasswordManagerDefaultAnisetteProvider( + deserializer, + ); + var var_profilesClient = + sse_decode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcProfilesClientDefaultAnisetteProvider( + deserializer, + ); + var var_fmfd = + sse_decode_opt_box_autoadd_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcFindMyClientDefaultAnisetteProvider( + deserializer, + ); + var var_sharedstreams = + sse_decode_opt_box_autoadd_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerSyncManagerDefaultAnisetteProviderMyFilePackager( + deserializer, + ); + var var_cloudMessagesClient = + sse_decode_opt_box_autoadd_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcCloudMessagesClientDefaultAnisetteProvider( + deserializer, + ); + var var_statuskitClient = + sse_decode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcStatusKitClientDefaultAnisetteProvider( + deserializer, + ); + return SharedICloudServices( + account: var_account, + tokenProvider: var_tokenProvider, + cloudkitClient: var_cloudkitClient, + keychain: var_keychain, + passwords: var_passwords, + profilesClient: var_profilesClient, + fmfd: var_fmfd, + sharedstreams: var_sharedstreams, + cloudMessagesClient: var_cloudMessagesClient, + statuskitClient: var_statuskitClient, + ); + } + + @protected + SharedPoster sse_decode_shared_poster(SseDeserializer deserializer) { + // Codec=Sse (Serialization based), see doc to use other codecs + var var_lowResWallpaperTag = sse_decode_list_prim_u_8_strict(deserializer); + var var_wallpaperTag = sse_decode_list_prim_u_8_strict(deserializer); + var var_messageTag = sse_decode_list_prim_u_8_strict(deserializer); + return SharedPoster( + lowResWallpaperTag: var_lowResWallpaperTag, + wallpaperTag: var_wallpaperTag, + messageTag: var_messageTag, + ); + } + + @protected + SharedPushState sse_decode_shared_push_state(SseDeserializer deserializer) { + // Codec=Sse (Serialization based), see doc to use other codecs + var var_osConfig = + sse_decode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerJoinedOSConfig( + deserializer, + ); + var var_cancelPoll = + sse_decode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerSender( + deserializer, + ); + var var_confDir = sse_decode_String(deserializer); + var var_localBroadcast = + sse_decode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcSenderPushMessage( + deserializer, + ); + var var_anisette = + sse_decode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcAnisetteClientDefaultAnisetteProvider( + deserializer, + ); + var var_conn = + sse_decode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerAPSConnection( + deserializer, + ); + var var_icloudServices = sse_decode_opt_box_autoadd_shared_i_cloud_services( + deserializer, + ); + var var_client = + sse_decode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcIMClient( + deserializer, + ); + var var_ftClient = + sse_decode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcFTClient( + deserializer, + ); + var var_idmsClient = + sse_decode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcIdmsAuthListener( + deserializer, + ); + var var_activeCircleSessions = + sse_decode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcMutexVecActiveCircleSession( + deserializer, + ); + var var_clientSession = + sse_decode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcMutexOptionCircleClientSessionDefaultAnisetteProvider( + deserializer, + ); + return SharedPushState( + osConfig: var_osConfig, + cancelPoll: var_cancelPoll, + confDir: var_confDir, + localBroadcast: var_localBroadcast, + anisette: var_anisette, + conn: var_conn, + icloudServices: var_icloudServices, + client: var_client, + ftClient: var_ftClient, + idmsClient: var_idmsClient, + activeCircleSessions: var_activeCircleSessions, + clientSession: var_clientSession, + ); } @protected - PRPosterTitleStyleConfiguration - sse_decode_pr_poster_title_style_configuration( - SseDeserializer deserializer) { + SimplifiedIncomingCallPoster sse_decode_simplified_incoming_call_poster( + SseDeserializer deserializer, + ) { // Codec=Sse (Serialization based), see doc to use other codecs - var var_alternateDateEnabled = sse_decode_bool(deserializer); - var var_contentsLuminence = sse_decode_f_64(deserializer); - var var_groupName = sse_decode_String(deserializer); - var var_preferredTitleAlignment = sse_decode_u_32(deserializer); - var var_preferredTitleLayout = sse_decode_u_32(deserializer); - var var_timeFontConfiguration = - sse_decode_pr_poster_system_time_font_configuration(deserializer); - var var_timeNumberingSystem = - sse_decode_opt_list_prim_u_8_strict(deserializer); - var var_titleColor = sse_decode_pr_poster_color(deserializer); - var var_titleContentStyle = sse_decode_list_prim_u_8_strict(deserializer); - var var_userConfigured = sse_decode_bool(deserializer); - var var_titleStyle = - sse_decode_opt_box_autoadd_pr_poster_content_material_style( - deserializer); - return PRPosterTitleStyleConfiguration( - alternateDateEnabled: var_alternateDateEnabled, - contentsLuminence: var_contentsLuminence, - groupName: var_groupName, - preferredTitleAlignment: var_preferredTitleAlignment, - preferredTitleLayout: var_preferredTitleLayout, - timeFontConfiguration: var_timeFontConfiguration, - timeNumberingSystem: var_timeNumberingSystem, - titleColor: var_titleColor, - titleContentStyle: var_titleContentStyle, - userConfigured: var_userConfigured, - titleStyle: var_titleStyle); + var var_poster = sse_decode_simplified_poster(deserializer); + var var_textMetadata = sse_decode_wallpaper_metadata(deserializer); + var var_lowRes = sse_decode_list_prim_u_8_strict(deserializer); + return SimplifiedIncomingCallPoster( + poster: var_poster, + textMetadata: var_textMetadata, + lowRes: var_lowRes, + ); } @protected - PrivateDeviceInfo sse_decode_private_device_info( - SseDeserializer deserializer) { + SimplifiedPoster sse_decode_simplified_poster(SseDeserializer deserializer) { // Codec=Sse (Serialization based), see doc to use other codecs - var var_uuid = sse_decode_opt_String(deserializer); - var var_deviceName = sse_decode_opt_String(deserializer); - var var_token = sse_decode_list_prim_u_8_strict(deserializer); - var var_isHsaTrusted = sse_decode_bool(deserializer); - var var_identites = sse_decode_list_String(deserializer); - var var_subServices = sse_decode_list_String(deserializer); - return PrivateDeviceInfo( - uuid: var_uuid, - deviceName: var_deviceName, - token: var_token, - isHsaTrusted: var_isHsaTrusted, - identites: var_identites, - subServices: var_subServices); + var var_titleConfiguration = sse_decode_pr_poster_title_style_configuration( + deserializer, + ); + var var_type = sse_decode_poster_type(deserializer); + var var_role = sse_decode_poster_role(deserializer); + return SimplifiedPoster( + titleConfiguration: var_titleConfiguration, + type: var_type, + role: var_role, + ); } @protected - ProvisionedFlavor sse_decode_provisioned_flavor( - SseDeserializer deserializer) { + SimplifiedTranscriptPoster sse_decode_simplified_transcript_poster( + SseDeserializer deserializer, + ) { // Codec=Sse (Serialization based), see doc to use other codecs - var inner = sse_decode_i_32(deserializer); - return ProvisionedFlavor.values[inner]; + var var_watch = sse_decode_watch_background(deserializer); + var var_poster = sse_decode_simplified_poster(deserializer); + return SimplifiedTranscriptPoster(watch: var_watch, poster: var_poster); } @protected - PushMessage sse_decode_push_message(SseDeserializer deserializer) { + StatusKitMessage sse_decode_status_kit_message(SseDeserializer deserializer) { // Codec=Sse (Serialization based), see doc to use other codecs var tag_ = sse_decode_i_32(deserializer); switch (tag_) { case 0: - var var_field0 = sse_decode_box_autoadd_message_inst(deserializer); - return PushMessage_IMessage(var_field0); - case 1: - var var_uuid = sse_decode_String(deserializer); - var var_error = sse_decode_opt_String(deserializer); - return PushMessage_SendConfirm(uuid: var_uuid, error: var_error); - case 2: - var var_field0 = sse_decode_box_autoadd_register_state(deserializer); - return PushMessage_RegistrationState(var_field0); - case 3: - var var_field0 = sse_decode_box_autoadd_shared_album(deserializer); - return PushMessage_NewPhotostream(var_field0); - case 4: - var var_field0 = sse_decode_box_autoadd_ft_message(deserializer); - return PushMessage_FaceTime(var_field0); - case 5: - var var_field0 = - sse_decode_box_autoadd_status_kit_message(deserializer); - return PushMessage_StatusUpdate(var_field0); - case 6: - var var_field0 = sse_decode_box_autoadd_idms_message(deserializer); - return PushMessage_Idms(var_field0); - case 7: - var var_field0 = sse_decode_bool(deserializer); - return PushMessage_TwoFaAuthEvent(var_field0); - case 8: - return PushMessage_CircleFinishEvent(); - case 9: - var var_sender = sse_decode_String(deserializer); - var var_beacon = sse_decode_String(deserializer); - var var_attributes = - sse_decode_box_autoadd_beacon_attributes(deserializer); - return PushMessage_BeaconShared( - sender: var_sender, beacon: var_beacon, attributes: var_attributes); + var var_user = sse_decode_String(deserializer); + var var_mode = sse_decode_opt_String(deserializer); + var var_allowed = sse_decode_bool(deserializer); + return StatusKitMessage_StatusChanged( + user: var_user, + mode: var_mode, + allowed: var_allowed, + ); default: throw UnimplementedError(''); } } @protected - QuotaInfo sse_decode_quota_info(SseDeserializer deserializer) { + StatusKitPersonalConfig sse_decode_status_kit_personal_config( + SseDeserializer deserializer, + ) { // Codec=Sse (Serialization based), see doc to use other codecs - var var_totalBytes = sse_decode_CastedPrimitive_u_64(deserializer); - var var_availableBytes = sse_decode_CastedPrimitive_u_64(deserializer); - var var_messagesBytes = sse_decode_CastedPrimitive_u_64(deserializer); - return QuotaInfo( - totalBytes: var_totalBytes, - availableBytes: var_availableBytes, - messagesBytes: var_messagesBytes); + var var_allowedModes = sse_decode_list_String(deserializer); + return StatusKitPersonalConfig(allowedModes: var_allowedModes); } @protected - ReactMessage sse_decode_react_message(SseDeserializer deserializer) { + SupportAction sse_decode_support_action(SseDeserializer deserializer) { // Codec=Sse (Serialization based), see doc to use other codecs - var var_toUuid = sse_decode_String(deserializer); - var var_toPart = sse_decode_opt_CastedPrimitive_u_64(deserializer); - var var_reaction = sse_decode_react_message_type(deserializer); - var var_toText = sse_decode_String(deserializer); - var var_embeddedProfile = - sse_decode_opt_box_autoadd_share_profile_message(deserializer); - return ReactMessage( - toUuid: var_toUuid, - toPart: var_toPart, - reaction: var_reaction, - toText: var_toText, - embeddedProfile: var_embeddedProfile); + var var_url = sse_decode_String(deserializer); + var var_button = sse_decode_String(deserializer); + return SupportAction(url: var_url, button: var_button); } @protected - ReactMessageType sse_decode_react_message_type(SseDeserializer deserializer) { + SupportAlert sse_decode_support_alert(SseDeserializer deserializer) { // Codec=Sse (Serialization based), see doc to use other codecs - - var tag_ = sse_decode_i_32(deserializer); - switch (tag_) { - case 0: - var var_reaction = sse_decode_box_autoadd_reaction(deserializer); - var var_enable = sse_decode_bool(deserializer); - return ReactMessageType_React( - reaction: var_reaction, enable: var_enable); - case 1: - var var_spec = sse_decode_box_autoadd_extension_app(deserializer); - var var_body = sse_decode_box_autoadd_message_parts(deserializer); - var var_isMeta = sse_decode_bool(deserializer); - return ReactMessageType_Extension( - spec: var_spec, body: var_body, isMeta: var_isMeta); - default: - throw UnimplementedError(''); - } + var var_title = sse_decode_String(deserializer); + var var_body = sse_decode_String(deserializer); + var var_action = sse_decode_opt_box_autoadd_support_action(deserializer); + return SupportAlert(title: var_title, body: var_body, action: var_action); } @protected - Reaction sse_decode_reaction(SseDeserializer deserializer) { + SyncStatus sse_decode_sync_status(SseDeserializer deserializer) { // Codec=Sse (Serialization based), see doc to use other codecs var tag_ = sse_decode_i_32(deserializer); switch (tag_) { case 0: - return Reaction_Heart(); + return SyncStatus_Synced(); case 1: - return Reaction_Like(); + var var_progress = sse_decode_usize(deserializer); + var var_total = sse_decode_usize(deserializer); + return SyncStatus_Downloading(progress: var_progress, total: var_total); case 2: - return Reaction_Dislike(); + var var_progress = sse_decode_usize(deserializer); + var var_total = sse_decode_usize(deserializer); + return SyncStatus_Uploading(progress: var_progress, total: var_total); case 3: - return Reaction_Laugh(); - case 4: - return Reaction_Emphasize(); - case 5: - return Reaction_Question(); - case 6: - var var_field0 = sse_decode_String(deserializer); - return Reaction_Emoji(var_field0); - case 7: - var var_spec = sse_decode_opt_box_autoadd_extension_app(deserializer); - var var_body = sse_decode_box_autoadd_message_parts(deserializer); - return Reaction_Sticker(spec: var_spec, body: var_body); + return SyncStatus_Syncing(); default: throw UnimplementedError(''); } } @protected - ( - ApsConnection, - PushError? - ) sse_decode_record_auto_owned_rust_opaque_flutter_rust_bridgefor_generated_rust_auto_opaque_inner_aps_connection_opt_box_autoadd_auto_owned_rust_opaque_flutter_rust_bridgefor_generated_rust_auto_opaque_inner_push_error( - SseDeserializer deserializer) { - // Codec=Sse (Serialization based), see doc to use other codecs - var var_field0 = - sse_decode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerAPSConnection( - deserializer); - var var_field1 = - sse_decode_opt_box_autoadd_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerPushError( - deserializer); - return (var_field0, var_field1); - } - - @protected - ( - ArcMutexAppleAccountDefaultAnisetteProvider, - LoginState - ) sse_decode_record_auto_owned_rust_opaque_flutter_rust_bridgefor_generated_rust_auto_opaque_inner_arc_mutex_apple_account_default_anisette_provider_login_state( - SseDeserializer deserializer) { - // Codec=Sse (Serialization based), see doc to use other codecs - var var_field0 = - sse_decode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcMutexAppleAccountDefaultAnisetteProvider( - deserializer); - var var_field1 = sse_decode_login_state(deserializer); - return (var_field0, var_field1); - } - - @protected - ( - ArcSharedPushState, - SharedPushState - ) sse_decode_record_auto_owned_rust_opaque_flutter_rust_bridgefor_generated_rust_auto_opaque_inner_arc_shared_push_state_shared_push_state( - SseDeserializer deserializer) { - // Codec=Sse (Serialization based), see doc to use other codecs - var var_field0 = - sse_decode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcSharedPushState( - deserializer); - var var_field1 = sse_decode_shared_push_state(deserializer); - return (var_field0, var_field1); - } - - @protected - ( - CircleClientSessionDefaultAnisetteProvider, - LoginState, - String? - ) sse_decode_record_auto_owned_rust_opaque_flutter_rust_bridgefor_generated_rust_auto_opaque_inner_circle_client_session_default_anisette_provider_login_state_opt_string( - SseDeserializer deserializer) { - // Codec=Sse (Serialization based), see doc to use other codecs - var var_field0 = - sse_decode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerCircleClientSessionDefaultAnisetteProvider( - deserializer); - var var_field1 = sse_decode_login_state(deserializer); - var var_field2 = sse_decode_opt_String(deserializer); - return (var_field0, var_field1, var_field2); - } - - @protected - ( - Sender, - ArcSenderPushMessage, - ApsWatcher - ) sse_decode_record_auto_owned_rust_opaque_flutter_rust_bridgefor_generated_rust_auto_opaque_inner_sender_auto_owned_rust_opaque_flutter_rust_bridgefor_generated_rust_auto_opaque_inner_arc_sender_push_message_auto_owned_rust_opaque_flutter_rust_bridgefor_generated_rust_auto_opaque_inner_aps_watcher( - SseDeserializer deserializer) { - // Codec=Sse (Serialization based), see doc to use other codecs - var var_field0 = - sse_decode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerSender( - deserializer); - var var_field1 = - sse_decode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcSenderPushMessage( - deserializer); - var var_field2 = - sse_decode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerAPSWatcher( - deserializer); - return (var_field0, var_field1, var_field2); - } - - @protected - ( - Uint8List, - Map, - int - ) sse_decode_record_list_prim_u_8_strict_map_string_opt_box_autoadd_cloud_attachment_i_32( - SseDeserializer deserializer) { + TeardownSignIn sse_decode_teardown_sign_in(SseDeserializer deserializer) { // Codec=Sse (Serialization based), see doc to use other codecs - var var_field0 = sse_decode_list_prim_u_8_strict(deserializer); - var var_field1 = - sse_decode_Map_String_opt_box_autoadd_cloud_attachment(deserializer); - var var_field2 = sse_decode_i_32(deserializer); - return (var_field0, var_field1, var_field2); + var var_prevtxnid = sse_decode_String(deserializer); + return TeardownSignIn(prevtxnid: var_prevtxnid); } @protected - ( - Uint8List, - Map, - int - ) sse_decode_record_list_prim_u_8_strict_map_string_opt_box_autoadd_cloud_chat_i_32( - SseDeserializer deserializer) { + TextEffect sse_decode_text_effect(SseDeserializer deserializer) { // Codec=Sse (Serialization based), see doc to use other codecs - var var_field0 = sse_decode_list_prim_u_8_strict(deserializer); - var var_field1 = - sse_decode_Map_String_opt_box_autoadd_cloud_chat(deserializer); - var var_field2 = sse_decode_i_32(deserializer); - return (var_field0, var_field1, var_field2); + var inner = sse_decode_i_32(deserializer); + return TextEffect.values[inner]; } @protected - ( - Uint8List, - Map, - int - ) sse_decode_record_list_prim_u_8_strict_map_string_opt_box_autoadd_cloud_message_i_32( - SseDeserializer deserializer) { + TextFlags sse_decode_text_flags(SseDeserializer deserializer) { // Codec=Sse (Serialization based), see doc to use other codecs - var var_field0 = sse_decode_list_prim_u_8_strict(deserializer); - var var_field1 = - sse_decode_Map_String_opt_box_autoadd_cloud_message(deserializer); - var var_field2 = sse_decode_i_32(deserializer); - return (var_field0, var_field1, var_field2); + var var_bold = sse_decode_bool(deserializer); + var var_italic = sse_decode_bool(deserializer); + var var_underline = sse_decode_bool(deserializer); + var var_strikethrough = sse_decode_bool(deserializer); + return TextFlags( + bold: var_bold, + italic: var_italic, + underline: var_underline, + strikethrough: var_strikethrough, + ); } @protected - (Uint8List, Uint8List?) - sse_decode_record_list_prim_u_8_strict_opt_list_prim_u_8_strict( - SseDeserializer deserializer) { + TextFormat sse_decode_text_format(SseDeserializer deserializer) { // Codec=Sse (Serialization based), see doc to use other codecs - var var_field0 = sse_decode_list_prim_u_8_strict(deserializer); - var var_field1 = sse_decode_opt_list_prim_u_8_strict(deserializer); - return (var_field0, var_field1); - } - @protected - (List, List) - sse_decode_record_list_shared_album_list_string( - SseDeserializer deserializer) { - // Codec=Sse (Serialization based), see doc to use other codecs - var var_field0 = sse_decode_list_shared_album(deserializer); - var var_field1 = sse_decode_list_String(deserializer); - return (var_field0, var_field1); + var tag_ = sse_decode_i_32(deserializer); + switch (tag_) { + case 0: + var var_field0 = sse_decode_box_autoadd_text_flags(deserializer); + return TextFormat_Flags(var_field0); + case 1: + var var_field0 = sse_decode_text_effect(deserializer); + return TextFormat_Effect(var_field0); + default: + throw UnimplementedError(''); + } } @protected - (List, LoginState?) - sse_decode_record_list_trusted_phone_number_opt_box_autoadd_login_state( - SseDeserializer deserializer) { - // Codec=Sse (Serialization based), see doc to use other codecs - var var_field0 = sse_decode_list_trusted_phone_number(deserializer); - var var_field1 = sse_decode_opt_box_autoadd_login_state(deserializer); - return (var_field0, var_field1); + TranscriptDynamicUserData sse_decode_transcript_dynamic_user_data( + SseDeserializer deserializer, + ) { + // Codec=Sse (Serialization based), see doc to use other codecs + var var_identifier = sse_decode_String(deserializer); + return TranscriptDynamicUserData(identifier: var_identifier); } @protected - ( - LoginState, - IdsUser? - ) sse_decode_record_login_state_opt_box_autoadd_auto_owned_rust_opaque_flutter_rust_bridgefor_generated_rust_auto_opaque_inner_ids_user( - SseDeserializer deserializer) { + TransferProgress sse_decode_transfer_progress(SseDeserializer deserializer) { // Codec=Sse (Serialization based), see doc to use other codecs - var var_field0 = sse_decode_login_state(deserializer); - var var_field1 = - sse_decode_opt_box_autoadd_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerIDSUser( - deserializer); - return (var_field0, var_field1); + var var_prog = sse_decode_CastedPrimitive_usize(deserializer); + var var_total = sse_decode_CastedPrimitive_usize(deserializer); + var var_attachment = sse_decode_opt_box_autoadd_attachment(deserializer); + return TransferProgress( + prog: var_prog, + total: var_total, + attachment: var_attachment, + ); } @protected - ( - Map, - (String, BigInt)? - ) sse_decode_record_map_string_sync_status_opt_box_autoadd_record_string_u_64( - SseDeserializer deserializer) { + TrustedPhoneNumber sse_decode_trusted_phone_number( + SseDeserializer deserializer, + ) { // Codec=Sse (Serialization based), see doc to use other codecs - var var_field0 = sse_decode_Map_String_sync_status(deserializer); - var var_field1 = - sse_decode_opt_box_autoadd_record_string_u_64(deserializer); - return (var_field0, var_field1); + var var_numberWithDialCode = sse_decode_String(deserializer); + var var_lastTwoDigits = sse_decode_String(deserializer); + var var_pushMode = sse_decode_String(deserializer); + var var_id = sse_decode_u_32(deserializer); + return TrustedPhoneNumber( + numberWithDialCode: var_numberWithDialCode, + lastTwoDigits: var_lastTwoDigits, + pushMode: var_pushMode, + id: var_id, + ); } @protected - ( - List?, - SupportAlert? - ) sse_decode_record_opt_list_auto_owned_rust_opaque_flutter_rust_bridgefor_generated_rust_auto_opaque_inner_ids_user_opt_box_autoadd_support_alert( - SseDeserializer deserializer) { + TypingApp sse_decode_typing_app(SseDeserializer deserializer) { // Codec=Sse (Serialization based), see doc to use other codecs - var var_field0 = - sse_decode_opt_list_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerIDSUser( - deserializer); - var var_field1 = sse_decode_opt_box_autoadd_support_alert(deserializer); - return (var_field0, var_field1); + var var_bundleId = sse_decode_String(deserializer); + var var_icon = sse_decode_list_prim_u_8_strict(deserializer); + return TypingApp(bundleId: var_bundleId, icon: var_icon); } @protected - (String?, Passkey) sse_decode_record_opt_string_passkey( - SseDeserializer deserializer) { + int sse_decode_u_16(SseDeserializer deserializer) { // Codec=Sse (Serialization based), see doc to use other codecs - var var_field0 = sse_decode_opt_String(deserializer); - var var_field1 = sse_decode_passkey(deserializer); - return (var_field0, var_field1); + return deserializer.buffer.getUint16(); } @protected - (String?, PasswordManagerMeta) - sse_decode_record_opt_string_password_manager_meta( - SseDeserializer deserializer) { + int sse_decode_u_32(SseDeserializer deserializer) { // Codec=Sse (Serialization based), see doc to use other codecs - var var_field0 = sse_decode_opt_String(deserializer); - var var_field1 = sse_decode_password_manager_meta(deserializer); - return (var_field0, var_field1); + return deserializer.buffer.getUint32(); } @protected - (String?, PasswordRawEntry) sse_decode_record_opt_string_password_raw_entry( - SseDeserializer deserializer) { + BigInt sse_decode_u_64(SseDeserializer deserializer) { // Codec=Sse (Serialization based), see doc to use other codecs - var var_field0 = sse_decode_opt_String(deserializer); - var var_field1 = sse_decode_password_raw_entry(deserializer); - return (var_field0, var_field1); + return deserializer.buffer.getBigUint64(); } @protected - (String?, WifiPassword) sse_decode_record_opt_string_wifi_password( - SseDeserializer deserializer) { + int sse_decode_u_8(SseDeserializer deserializer) { // Codec=Sse (Serialization based), see doc to use other codecs - var var_field0 = sse_decode_opt_String(deserializer); - var var_field1 = sse_decode_wifi_password(deserializer); - return (var_field0, var_field1); + return deserializer.buffer.getUint8(); } @protected - ( - SharedPushState, - ApsWatcher - ) sse_decode_record_shared_push_state_auto_owned_rust_opaque_flutter_rust_bridgefor_generated_rust_auto_opaque_inner_aps_watcher( - SseDeserializer deserializer) { + UIColor sse_decode_ui_color(SseDeserializer deserializer) { // Codec=Sse (Serialization based), see doc to use other codecs - var var_field0 = sse_decode_shared_push_state(deserializer); - var var_field1 = - sse_decode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerAPSWatcher( - deserializer); - return (var_field0, var_field1); + + var tag_ = sse_decode_i_32(deserializer); + switch (tag_) { + case 0: + var var_colorComponents = sse_decode_u_32(deserializer); + var var_green = sse_decode_f_64(deserializer); + var var_blue = sse_decode_f_64(deserializer); + var var_red = sse_decode_f_64(deserializer); + var var_greenDbl = sse_decode_opt_box_autoadd_f_64(deserializer); + var var_blueDbl = sse_decode_opt_box_autoadd_f_64(deserializer); + var var_redDbl = sse_decode_opt_box_autoadd_f_64(deserializer); + var var_alphaDbl = sse_decode_opt_box_autoadd_f_64(deserializer); + var var_alpha = sse_decode_f_64(deserializer); + var var_rgb = sse_decode_list_prim_u_8_strict(deserializer); + var var_colorSpace = sse_decode_u_32(deserializer); + var var_class_ = sse_decode_String(deserializer); + return UIColor_RGBAColorSpace( + colorComponents: var_colorComponents, + green: var_green, + blue: var_blue, + red: var_red, + greenDbl: var_greenDbl, + blueDbl: var_blueDbl, + redDbl: var_redDbl, + alphaDbl: var_alphaDbl, + alpha: var_alpha, + rgb: var_rgb, + colorSpace: var_colorSpace, + class_: var_class_, + ); + case 1: + var var_colorComponents = sse_decode_u_32(deserializer); + var var_white = sse_decode_f_64(deserializer); + var var_alpha = sse_decode_f_64(deserializer); + var var_bin = sse_decode_list_prim_u_8_strict(deserializer); + var var_colorSpace = sse_decode_u_32(deserializer); + var var_class_ = sse_decode_String(deserializer); + return UIColor_GrayscaleAlphaColorSpace( + colorComponents: var_colorComponents, + white: var_white, + alpha: var_alpha, + bin: var_bin, + colorSpace: var_colorSpace, + class_: var_class_, + ); + default: + throw UnimplementedError(''); + } } @protected - ( - String, - Asset - ) sse_decode_record_string_auto_owned_rust_opaque_flutter_rust_bridgefor_generated_rust_auto_opaque_inner_asset( - SseDeserializer deserializer) { + void sse_decode_unit(SseDeserializer deserializer) { // Codec=Sse (Serialization based), see doc to use other codecs - var var_field0 = sse_decode_String(deserializer); - var var_field1 = - sse_decode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerAsset( - deserializer); - return (var_field0, var_field1); } @protected - ( - String, - StCollapsedValue - ) sse_decode_record_string_auto_owned_rust_opaque_flutter_rust_bridgefor_generated_rust_auto_opaque_inner_st_collapsed_value( - SseDeserializer deserializer) { + UnsendMessage sse_decode_unsend_message(SseDeserializer deserializer) { // Codec=Sse (Serialization based), see doc to use other codecs - var var_field0 = sse_decode_String(deserializer); - var var_field1 = - sse_decode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerStCollapsedValue( - deserializer); - return (var_field0, var_field1); + var var_tuuid = sse_decode_String(deserializer); + var var_editPart = sse_decode_CastedPrimitive_u_64(deserializer); + return UnsendMessage(tuuid: var_tuuid, editPart: var_editPart); } @protected - (String, bool) sse_decode_record_string_bool(SseDeserializer deserializer) { + UpdateAccountFinish sse_decode_update_account_finish( + SseDeserializer deserializer, + ) { // Codec=Sse (Serialization based), see doc to use other codecs - var var_field0 = sse_decode_String(deserializer); - var var_field1 = sse_decode_bool(deserializer); - return (var_field0, var_field1); + + var tag_ = sse_decode_i_32(deserializer); + switch (tag_) { + case 0: + return UpdateAccountFinish_MacOS(); + case 1: + var var_url = sse_decode_String(deserializer); + return UpdateAccountFinish_IOS(url: var_url); + default: + throw UnimplementedError(''); + } } @protected - (String, int) sse_decode_record_string_casted_primitive_u_64( - SseDeserializer deserializer) { + UpdateExtensionMessage sse_decode_update_extension_message( + SseDeserializer deserializer, + ) { // Codec=Sse (Serialization based), see doc to use other codecs - var var_field0 = sse_decode_String(deserializer); - var var_field1 = sse_decode_CastedPrimitive_u_64(deserializer); - return (var_field0, var_field1); + var var_forUuid = sse_decode_String(deserializer); + var var_ext = sse_decode_part_extension(deserializer); + return UpdateExtensionMessage(forUuid: var_forUuid, ext: var_ext); } @protected - (String, CloudAttachment) sse_decode_record_string_cloud_attachment( - SseDeserializer deserializer) { + UpdateProfileMessage sse_decode_update_profile_message( + SseDeserializer deserializer, + ) { // Codec=Sse (Serialization based), see doc to use other codecs - var var_field0 = sse_decode_String(deserializer); - var var_field1 = sse_decode_cloud_attachment(deserializer); - return (var_field0, var_field1); + var var_profile = sse_decode_opt_box_autoadd_share_profile_message( + deserializer, + ); + var var_shareContacts = sse_decode_bool(deserializer); + return UpdateProfileMessage( + profile: var_profile, + shareContacts: var_shareContacts, + ); } @protected - (String, CloudChat) sse_decode_record_string_cloud_chat( - SseDeserializer deserializer) { + UpdateProfileSharingMessage sse_decode_update_profile_sharing_message( + SseDeserializer deserializer, + ) { // Codec=Sse (Serialization based), see doc to use other codecs - var var_field0 = sse_decode_String(deserializer); - var var_field1 = sse_decode_cloud_chat(deserializer); - return (var_field0, var_field1); + var var_sharedDismissed = sse_decode_list_String(deserializer); + var var_sharedAll = sse_decode_list_String(deserializer); + var var_version = sse_decode_CastedPrimitive_u_64(deserializer); + return UpdateProfileSharingMessage( + sharedDismissed: var_sharedDismissed, + sharedAll: var_sharedAll, + version: var_version, + ); } @protected - (String, CloudMessage) sse_decode_record_string_cloud_message( - SseDeserializer deserializer) { + BigInt sse_decode_usize(SseDeserializer deserializer) { // Codec=Sse (Serialization based), see doc to use other codecs - var var_field0 = sse_decode_String(deserializer); - var var_field1 = sse_decode_cloud_message(deserializer); - return (var_field0, var_field1); + return deserializer.buffer.getBigUint64(); } @protected - (String, FTParticipant) sse_decode_record_string_ft_participant( - SseDeserializer deserializer) { + WallpaperMetadata sse_decode_wallpaper_metadata( + SseDeserializer deserializer, + ) { // Codec=Sse (Serialization based), see doc to use other codecs - var var_field0 = sse_decode_String(deserializer); - var var_field1 = sse_decode_ft_participant(deserializer); - return (var_field0, var_field1); + var var_backgroundColorKey = sse_decode_opt_box_autoadd_poster_color( + deserializer, + ); + var var_fontColorKey = sse_decode_poster_color(deserializer); + var var_fontNameKey = sse_decode_String(deserializer); + var var_fontSizeKey = sse_decode_f_32(deserializer); + var var_fontWeightKey = sse_decode_f_32(deserializer); + var var_isVerticalKey = sse_decode_bool(deserializer); + var var_typeKey = sse_decode_String(deserializer); + return WallpaperMetadata( + backgroundColorKey: var_backgroundColorKey, + fontColorKey: var_fontColorKey, + fontNameKey: var_fontNameKey, + fontSizeKey: var_fontSizeKey, + fontWeightKey: var_fontWeightKey, + isVerticalKey: var_isVerticalKey, + typeKey: var_typeKey, + ); } @protected - (String, GroupSummary) sse_decode_record_string_group_summary( - SseDeserializer deserializer) { + WatchBackground sse_decode_watch_background(SseDeserializer deserializer) { // Codec=Sse (Serialization based), see doc to use other codecs - var var_field0 = sse_decode_String(deserializer); - var var_field1 = sse_decode_group_summary(deserializer); - return (var_field0, var_field1); + var var_isHighKey = sse_decode_bool(deserializer); + var var_luminance = sse_decode_f_64(deserializer); + var var_backgroundImageData = sse_decode_list_prim_u_8_strict(deserializer); + var var_extensionIdentifier = sse_decode_String(deserializer); + return WatchBackground( + isHighKey: var_isHighKey, + luminance: var_luminance, + backgroundImageData: var_backgroundImageData, + extensionIdentifier: var_extensionIdentifier, + ); } @protected - (String, List) sse_decode_record_string_list_message_edit( - SseDeserializer deserializer) { + WifiPassword sse_decode_wifi_password(SseDeserializer deserializer) { // Codec=Sse (Serialization based), see doc to use other codecs - var var_field0 = sse_decode_String(deserializer); - var var_field1 = sse_decode_list_message_edit(deserializer); - return (var_field0, var_field1); + var var_cdat = sse_decode_CastedPrimitive_u_64(deserializer); + var var_mdat = sse_decode_CastedPrimitive_u_64(deserializer); + var var_acct = sse_decode_String(deserializer); + var var_svce = sse_decode_String(deserializer); + var var_data = sse_decode_list_prim_u_8_strict(deserializer); + return WifiPassword( + cdat: var_cdat, + mdat: var_mdat, + acct: var_acct, + svce: var_svce, + data: var_data, + ); } @protected - (String, Uint8List) sse_decode_record_string_list_prim_u_8_strict( - SseDeserializer deserializer) { + void sse_encode_AnyhowException( + AnyhowException self, + SseSerializer serializer, + ) { // Codec=Sse (Serialization based), see doc to use other codecs - var var_field0 = sse_decode_String(deserializer); - var var_field1 = sse_decode_list_prim_u_8_strict(deserializer); - return (var_field0, var_field1); + sse_encode_String(self.message, serializer); } @protected - ( - String, - Map, - Map - ) sse_decode_record_string_map_string_group_summary_map_string_share_invite_content_data( - SseDeserializer deserializer) { + void + sse_encode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerAPSConnection( + ApsConnection self, + SseSerializer serializer, + ) { // Codec=Sse (Serialization based), see doc to use other codecs - var var_field0 = sse_decode_String(deserializer); - var var_field1 = sse_decode_Map_String_group_summary(deserializer); - var var_field2 = - sse_decode_Map_String_share_invite_content_data(deserializer); - return (var_field0, var_field1, var_field2); + sse_encode_usize( + (self as ApsConnectionImpl).frbInternalSseEncode(move: true), + serializer, + ); } @protected - (String, MessageEditRange) sse_decode_record_string_message_edit_range( - SseDeserializer deserializer) { + void + sse_encode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerAPSState( + ApsState self, + SseSerializer serializer, + ) { // Codec=Sse (Serialization based), see doc to use other codecs - var var_field0 = sse_decode_String(deserializer); - var var_field1 = sse_decode_message_edit_range(deserializer); - return (var_field0, var_field1); + sse_encode_usize( + (self as ApsStateImpl).frbInternalSseEncode(move: true), + serializer, + ); } @protected - (String, CloudAttachment?) - sse_decode_record_string_opt_box_autoadd_cloud_attachment( - SseDeserializer deserializer) { + void + sse_encode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerAPSWatcher( + ApsWatcher self, + SseSerializer serializer, + ) { // Codec=Sse (Serialization based), see doc to use other codecs - var var_field0 = sse_decode_String(deserializer); - var var_field1 = sse_decode_opt_box_autoadd_cloud_attachment(deserializer); - return (var_field0, var_field1); + sse_encode_usize( + (self as ApsWatcherImpl).frbInternalSseEncode(move: true), + serializer, + ); } @protected - (String, CloudChat?) sse_decode_record_string_opt_box_autoadd_cloud_chat( - SseDeserializer deserializer) { + void + sse_encode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcAnisetteClientDefaultAnisetteProvider( + ArcAnisetteClientDefaultAnisetteProvider self, + SseSerializer serializer, + ) { // Codec=Sse (Serialization based), see doc to use other codecs - var var_field0 = sse_decode_String(deserializer); - var var_field1 = sse_decode_opt_box_autoadd_cloud_chat(deserializer); - return (var_field0, var_field1); + sse_encode_usize( + (self as ArcAnisetteClientDefaultAnisetteProviderImpl) + .frbInternalSseEncode(move: true), + serializer, + ); } @protected - (String, CloudMessage?) - sse_decode_record_string_opt_box_autoadd_cloud_message( - SseDeserializer deserializer) { + void + sse_encode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcCloudKitClientDefaultAnisetteProvider( + ArcCloudKitClientDefaultAnisetteProvider self, + SseSerializer serializer, + ) { // Codec=Sse (Serialization based), see doc to use other codecs - var var_field0 = sse_decode_String(deserializer); - var var_field1 = sse_decode_opt_box_autoadd_cloud_message(deserializer); - return (var_field0, var_field1); + sse_encode_usize( + (self as ArcCloudKitClientDefaultAnisetteProviderImpl) + .frbInternalSseEncode(move: true), + serializer, + ); } @protected - (String, PasswordManagerMetaDataCtx) - sse_decode_record_string_password_manager_meta_data_ctx( - SseDeserializer deserializer) { + void + sse_encode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcCloudMessagesClientDefaultAnisetteProvider( + ArcCloudMessagesClientDefaultAnisetteProvider self, + SseSerializer serializer, + ) { // Codec=Sse (Serialization based), see doc to use other codecs - var var_field0 = sse_decode_String(deserializer); - var var_field1 = sse_decode_password_manager_meta_data_ctx(deserializer); - return (var_field0, var_field1); + sse_encode_usize( + (self as ArcCloudMessagesClientDefaultAnisetteProviderImpl) + .frbInternalSseEncode(move: true), + serializer, + ); } @protected - (String, (String?, Passkey)) - sse_decode_record_string_record_opt_string_passkey( - SseDeserializer deserializer) { + void + sse_encode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcFTClient( + ArcFtClient self, + SseSerializer serializer, + ) { // Codec=Sse (Serialization based), see doc to use other codecs - var var_field0 = sse_decode_String(deserializer); - var var_field1 = sse_decode_record_opt_string_passkey(deserializer); - return (var_field0, var_field1); + sse_encode_usize( + (self as ArcFtClientImpl).frbInternalSseEncode(move: true), + serializer, + ); } @protected - (String, (String?, PasswordManagerMeta)) - sse_decode_record_string_record_opt_string_password_manager_meta( - SseDeserializer deserializer) { + void + sse_encode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcFindMyClientDefaultAnisetteProvider( + ArcFindMyClientDefaultAnisetteProvider self, + SseSerializer serializer, + ) { // Codec=Sse (Serialization based), see doc to use other codecs - var var_field0 = sse_decode_String(deserializer); - var var_field1 = - sse_decode_record_opt_string_password_manager_meta(deserializer); - return (var_field0, var_field1); + sse_encode_usize( + (self as ArcFindMyClientDefaultAnisetteProviderImpl).frbInternalSseEncode( + move: true, + ), + serializer, + ); } @protected - (String, (String?, PasswordRawEntry)) - sse_decode_record_string_record_opt_string_password_raw_entry( - SseDeserializer deserializer) { + void + sse_encode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcIMClient( + ArcImClient self, + SseSerializer serializer, + ) { // Codec=Sse (Serialization based), see doc to use other codecs - var var_field0 = sse_decode_String(deserializer); - var var_field1 = - sse_decode_record_opt_string_password_raw_entry(deserializer); - return (var_field0, var_field1); + sse_encode_usize( + (self as ArcImClientImpl).frbInternalSseEncode(move: true), + serializer, + ); } @protected - (String, (String?, WifiPassword)) - sse_decode_record_string_record_opt_string_wifi_password( - SseDeserializer deserializer) { + void + sse_encode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcIdmsAuthListener( + ArcIdmsAuthListener self, + SseSerializer serializer, + ) { // Codec=Sse (Serialization based), see doc to use other codecs - var var_field0 = sse_decode_String(deserializer); - var var_field1 = sse_decode_record_opt_string_wifi_password(deserializer); - return (var_field0, var_field1); + sse_encode_usize( + (self as ArcIdmsAuthListenerImpl).frbInternalSseEncode(move: true), + serializer, + ); } @protected - (String, ShareInviteContentData) - sse_decode_record_string_share_invite_content_data( - SseDeserializer deserializer) { + void + sse_encode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcKeychainClientDefaultAnisetteProvider( + ArcKeychainClientDefaultAnisetteProvider self, + SseSerializer serializer, + ) { // Codec=Sse (Serialization based), see doc to use other codecs - var var_field0 = sse_decode_String(deserializer); - var var_field1 = sse_decode_share_invite_content_data(deserializer); - return (var_field0, var_field1); + sse_encode_usize( + (self as ArcKeychainClientDefaultAnisetteProviderImpl) + .frbInternalSseEncode(move: true), + serializer, + ); } @protected - (String, SharedPushState) sse_decode_record_string_shared_push_state( - SseDeserializer deserializer) { + void + sse_encode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcMutexAppleAccountDefaultAnisetteProvider( + ArcMutexAppleAccountDefaultAnisetteProvider self, + SseSerializer serializer, + ) { // Codec=Sse (Serialization based), see doc to use other codecs - var var_field0 = sse_decode_String(deserializer); - var var_field1 = sse_decode_shared_push_state(deserializer); - return (var_field0, var_field1); + sse_encode_usize( + (self as ArcMutexAppleAccountDefaultAnisetteProviderImpl) + .frbInternalSseEncode(move: true), + serializer, + ); } @protected - (String, StatusKitPersonalConfig) - sse_decode_record_string_status_kit_personal_config( - SseDeserializer deserializer) { + void + sse_encode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcMutexOptionCircleClientSessionDefaultAnisetteProvider( + ArcMutexOptionCircleClientSessionDefaultAnisetteProvider self, + SseSerializer serializer, + ) { // Codec=Sse (Serialization based), see doc to use other codecs - var var_field0 = sse_decode_String(deserializer); - var var_field1 = sse_decode_status_kit_personal_config(deserializer); - return (var_field0, var_field1); + sse_encode_usize( + (self as ArcMutexOptionCircleClientSessionDefaultAnisetteProviderImpl) + .frbInternalSseEncode(move: true), + serializer, + ); } @protected - (String, String) sse_decode_record_string_string( - SseDeserializer deserializer) { + void + sse_encode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcMutexVecActiveCircleSession( + ArcMutexVecActiveCircleSession self, + SseSerializer serializer, + ) { // Codec=Sse (Serialization based), see doc to use other codecs - var var_field0 = sse_decode_String(deserializer); - var var_field1 = sse_decode_String(deserializer); - return (var_field0, var_field1); + sse_encode_usize( + (self as ArcMutexVecActiveCircleSessionImpl).frbInternalSseEncode( + move: true, + ), + serializer, + ); } @protected - (String, SyncStatus) sse_decode_record_string_sync_status( - SseDeserializer deserializer) { + void + sse_encode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcPasswordManagerDefaultAnisetteProvider( + ArcPasswordManagerDefaultAnisetteProvider self, + SseSerializer serializer, + ) { // Codec=Sse (Serialization based), see doc to use other codecs - var var_field0 = sse_decode_String(deserializer); - var var_field1 = sse_decode_sync_status(deserializer); - return (var_field0, var_field1); + sse_encode_usize( + (self as ArcPasswordManagerDefaultAnisetteProviderImpl) + .frbInternalSseEncode(move: true), + serializer, + ); } @protected - (String, BigInt) sse_decode_record_string_u_64(SseDeserializer deserializer) { + void + sse_encode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcProfilesClientDefaultAnisetteProvider( + ArcProfilesClientDefaultAnisetteProvider self, + SseSerializer serializer, + ) { // Codec=Sse (Serialization based), see doc to use other codecs - var var_field0 = sse_decode_String(deserializer); - var var_field1 = sse_decode_u_64(deserializer); - return (var_field0, var_field1); + sse_encode_usize( + (self as ArcProfilesClientDefaultAnisetteProviderImpl) + .frbInternalSseEncode(move: true), + serializer, + ); } @protected - (String, UpdateAccountFinish) sse_decode_record_string_update_account_finish( - SseDeserializer deserializer) { + void + sse_encode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcSenderPushMessage( + ArcSenderPushMessage self, + SseSerializer serializer, + ) { // Codec=Sse (Serialization based), see doc to use other codecs - var var_field0 = sse_decode_String(deserializer); - var var_field1 = sse_decode_update_account_finish(deserializer); - return (var_field0, var_field1); + sse_encode_usize( + (self as ArcSenderPushMessageImpl).frbInternalSseEncode(move: true), + serializer, + ); } @protected - (int, NSDictionaryTypedCoder) - sse_decode_record_u_32_ns_dictionary_typed_coder( - SseDeserializer deserializer) { + void + sse_encode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcSharedPushState( + ArcSharedPushState self, + SseSerializer serializer, + ) { // Codec=Sse (Serialization based), see doc to use other codecs - var var_field0 = sse_decode_u_32(deserializer); - var var_field1 = sse_decode_ns_dictionary_typed_coder(deserializer); - return (var_field0, var_field1); + sse_encode_usize( + (self as ArcSharedPushStateImpl).frbInternalSseEncode(move: true), + serializer, + ); } @protected - (int, BigInt) sse_decode_record_u_32_u_64(SseDeserializer deserializer) { + void + sse_encode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcStatusKitClientDefaultAnisetteProvider( + ArcStatusKitClientDefaultAnisetteProvider self, + SseSerializer serializer, + ) { // Codec=Sse (Serialization based), see doc to use other codecs - var var_field0 = sse_decode_u_32(deserializer); - var var_field1 = sse_decode_u_64(deserializer); - return (var_field0, var_field1); + sse_encode_usize( + (self as ArcStatusKitClientDefaultAnisetteProviderImpl) + .frbInternalSseEncode(move: true), + serializer, + ); } @protected - RegisterState sse_decode_register_state(SseDeserializer deserializer) { + void + sse_encode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcTokenProviderDefaultAnisetteProvider( + ArcTokenProviderDefaultAnisetteProvider self, + SseSerializer serializer, + ) { // Codec=Sse (Serialization based), see doc to use other codecs - - var tag_ = sse_decode_i_32(deserializer); - switch (tag_) { - case 0: - var var_nextS = sse_decode_i_64(deserializer); - return RegisterState_Registered(nextS: var_nextS); - case 1: - return RegisterState_Registering(); - case 2: - var var_retryWait = sse_decode_opt_box_autoadd_u_64(deserializer); - var var_error = sse_decode_String(deserializer); - return RegisterState_Failed(retryWait: var_retryWait, error: var_error); - default: - throw UnimplementedError(''); - } + sse_encode_usize( + (self as ArcTokenProviderDefaultAnisetteProviderImpl) + .frbInternalSseEncode(move: true), + serializer, + ); } @protected - RenameMessage sse_decode_rename_message(SseDeserializer deserializer) { + void + sse_encode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerAsset( + Asset self, + SseSerializer serializer, + ) { // Codec=Sse (Serialization based), see doc to use other codecs - var var_newName = sse_decode_String(deserializer); - return RenameMessage(newName: var_newName); + sse_encode_usize( + (self as AssetImpl).frbInternalSseEncode(move: true), + serializer, + ); } @protected - ReportMessage sse_decode_report_message(SseDeserializer deserializer) { + void + sse_encode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerChannelInterestToken( + ChannelInterestToken self, + SseSerializer serializer, + ) { // Codec=Sse (Serialization based), see doc to use other codecs - var var_guid = sse_decode_String(deserializer); - var var_sender = sse_decode_String(deserializer); - var var_conversationSize = sse_decode_u_32(deserializer); - var var_parts = sse_decode_message_parts(deserializer); - var var_timeOfMessage = sse_decode_f_64(deserializer); - return ReportMessage( - guid: var_guid, - sender: var_sender, - conversationSize: var_conversationSize, - parts: var_parts, - timeOfMessage: var_timeOfMessage); + sse_encode_usize( + (self as ChannelInterestTokenImpl).frbInternalSseEncode(move: true), + serializer, + ); } @protected - RichLinkImageAttachmentSubstitute - sse_decode_rich_link_image_attachment_substitute( - SseDeserializer deserializer) { + void + sse_encode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerCircleClientSessionDefaultAnisetteProvider( + CircleClientSessionDefaultAnisetteProvider self, + SseSerializer serializer, + ) { // Codec=Sse (Serialization based), see doc to use other codecs - var var_mimeType = sse_decode_String(deserializer); - var var_richLinkImageAttachmentSubstituteIndex = - sse_decode_u_64(deserializer); - return RichLinkImageAttachmentSubstitute( - mimeType: var_mimeType, - richLinkImageAttachmentSubstituteIndex: - var_richLinkImageAttachmentSubstituteIndex); + sse_encode_usize( + (self as CircleClientSessionDefaultAnisetteProviderImpl) + .frbInternalSseEncode(move: true), + serializer, + ); } @protected - ScheduleMode sse_decode_schedule_mode(SseDeserializer deserializer) { + void + sse_encode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerCloudSyncPreparedMessageCreateHandle( + CloudSyncPreparedMessageCreateHandle self, + SseSerializer serializer, + ) { // Codec=Sse (Serialization based), see doc to use other codecs - var var_ms = sse_decode_CastedPrimitive_u_64(deserializer); - var var_schedule = sse_decode_bool(deserializer); - return ScheduleMode(ms: var_ms, schedule: var_schedule); + sse_encode_usize( + (self as CloudSyncPreparedMessageCreateHandleImpl).frbInternalSseEncode( + move: true, + ), + serializer, + ); } @protected - SetTranscriptBackgroundMessage sse_decode_set_transcript_background_message( - SseDeserializer deserializer) { + void + sse_encode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerConversationLink( + ConversationLink self, + SseSerializer serializer, + ) { // Codec=Sse (Serialization based), see doc to use other codecs - - var tag_ = sse_decode_i_32(deserializer); - switch (tag_) { - case 0: - var var_aid = sse_decode_u_32(deserializer); - var var_bid = sse_decode_u_64(deserializer); - var var_chatId = sse_decode_opt_String(deserializer); - var var_remove = sse_decode_bool(deserializer); - return SetTranscriptBackgroundMessage_Remove( - aid: var_aid, bid: var_bid, chatId: var_chatId, remove: var_remove); - case 1: - var var_aid = sse_decode_u_32(deserializer); - var var_bid = sse_decode_u_64(deserializer); - var var_chatId = sse_decode_opt_String(deserializer); - var var_objectId = sse_decode_String(deserializer); - var var_payloadVersion = sse_decode_u_32(deserializer); - var var_backgroundId = sse_decode_String(deserializer); - var var_url = sse_decode_String(deserializer); - var var_signature = sse_decode_String(deserializer); - var var_key = sse_decode_String(deserializer); - var var_fileSize = sse_decode_usize(deserializer); - return SetTranscriptBackgroundMessage_Set( - aid: var_aid, - bid: var_bid, - chatId: var_chatId, - objectId: var_objectId, - payloadVersion: var_payloadVersion, - backgroundId: var_backgroundId, - url: var_url, - signature: var_signature, - key: var_key, - fileSize: var_fileSize); - default: - throw UnimplementedError(''); - } + sse_encode_usize( + (self as ConversationLinkImpl).frbInternalSseEncode(move: true), + serializer, + ); } @protected - ShareInviteContentData sse_decode_share_invite_content_data( - SseDeserializer deserializer) { + void + sse_encode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerConversationParticipant( + ConversationParticipant self, + SseSerializer serializer, + ) { // Codec=Sse (Serialization based), see doc to use other codecs - var var_invitationToken = sse_decode_list_prim_u_8_strict(deserializer); - var var_groupId = sse_decode_String(deserializer); - var var_sentTime = - sse_decode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerDate( - deserializer); - var var_groupName = sse_decode_String(deserializer); - var var_shareUrl = sse_decode_String(deserializer); - var var_inviteeHandle = sse_decode_String(deserializer); - return ShareInviteContentData( - invitationToken: var_invitationToken, - groupId: var_groupId, - sentTime: var_sentTime, - groupName: var_groupName, - shareUrl: var_shareUrl, - inviteeHandle: var_inviteeHandle); + sse_encode_usize( + (self as ConversationParticipantImpl).frbInternalSseEncode(move: true), + serializer, + ); } @protected - ShareProfileMessage sse_decode_share_profile_message( - SseDeserializer deserializer) { + void + sse_encode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerDate( + Date self, + SseSerializer serializer, + ) { // Codec=Sse (Serialization based), see doc to use other codecs - var var_cloudKitDecryptionRecordKey = - sse_decode_list_prim_u_8_strict(deserializer); - var var_cloudKitRecordKey = sse_decode_String(deserializer); - var var_poster = sse_decode_opt_box_autoadd_shared_poster(deserializer); - return ShareProfileMessage( - cloudKitDecryptionRecordKey: var_cloudKitDecryptionRecordKey, - cloudKitRecordKey: var_cloudKitRecordKey, - poster: var_poster); + sse_encode_usize( + (self as DateImpl).frbInternalSseEncode(move: true), + serializer, + ); } @protected - SharedAlbum sse_decode_shared_album(SseDeserializer deserializer) { + void + sse_encode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerEscrowData( + EscrowData self, + SseSerializer serializer, + ) { // Codec=Sse (Serialization based), see doc to use other codecs - var var_name = sse_decode_opt_String(deserializer); - var var_fullname = sse_decode_opt_String(deserializer); - var var_email = sse_decode_opt_String(deserializer); - var var_albumguid = sse_decode_String(deserializer); - var var_sharingtype = sse_decode_String(deserializer); - var var_subscriptiondate = sse_decode_opt_String(deserializer); - var var_albumlocation = sse_decode_opt_String(deserializer); - var var_assets = sse_decode_list_String(deserializer); - var var_delete = sse_decode_opt_String(deserializer); - return SharedAlbum( - name: var_name, - fullname: var_fullname, - email: var_email, - albumguid: var_albumguid, - sharingtype: var_sharingtype, - subscriptiondate: var_subscriptiondate, - albumlocation: var_albumlocation, - assets: var_assets, - delete: var_delete); + sse_encode_usize( + (self as EscrowDataImpl).frbInternalSseEncode(move: true), + serializer, + ); } @protected - SharedICloudServices sse_decode_shared_i_cloud_services( - SseDeserializer deserializer) { + void + sse_encode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerFindMyFriendsClientDefaultAnisetteProvider( + FindMyFriendsClientDefaultAnisetteProvider self, + SseSerializer serializer, + ) { // Codec=Sse (Serialization based), see doc to use other codecs - var var_account = - sse_decode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcMutexAppleAccountDefaultAnisetteProvider( - deserializer); - var var_tokenProvider = - sse_decode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcTokenProviderDefaultAnisetteProvider( - deserializer); - var var_cloudkitClient = - sse_decode_opt_box_autoadd_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcCloudKitClientDefaultAnisetteProvider( - deserializer); - var var_keychain = - sse_decode_opt_box_autoadd_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcKeychainClientDefaultAnisetteProvider( - deserializer); - var var_passwords = - sse_decode_opt_box_autoadd_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcPasswordManagerDefaultAnisetteProvider( - deserializer); - var var_profilesClient = - sse_decode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcProfilesClientDefaultAnisetteProvider( - deserializer); - var var_fmfd = - sse_decode_opt_box_autoadd_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcFindMyClientDefaultAnisetteProvider( - deserializer); - var var_sharedstreams = - sse_decode_opt_box_autoadd_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerSyncManagerDefaultAnisetteProviderMyFilePackager( - deserializer); - var var_cloudMessagesClient = - sse_decode_opt_box_autoadd_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcCloudMessagesClientDefaultAnisetteProvider( - deserializer); - var var_statuskitClient = - sse_decode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcStatusKitClientDefaultAnisetteProvider( - deserializer); - return SharedICloudServices( - account: var_account, - tokenProvider: var_tokenProvider, - cloudkitClient: var_cloudkitClient, - keychain: var_keychain, - passwords: var_passwords, - profilesClient: var_profilesClient, - fmfd: var_fmfd, - sharedstreams: var_sharedstreams, - cloudMessagesClient: var_cloudMessagesClient, - statuskitClient: var_statuskitClient); + sse_encode_usize( + (self as FindMyFriendsClientDefaultAnisetteProviderImpl) + .frbInternalSseEncode(move: true), + serializer, + ); } @protected - SharedPoster sse_decode_shared_poster(SseDeserializer deserializer) { + void + sse_encode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerFindMyPhoneClientDefaultAnisetteProvider( + FindMyPhoneClientDefaultAnisetteProvider self, + SseSerializer serializer, + ) { // Codec=Sse (Serialization based), see doc to use other codecs - var var_lowResWallpaperTag = sse_decode_list_prim_u_8_strict(deserializer); - var var_wallpaperTag = sse_decode_list_prim_u_8_strict(deserializer); - var var_messageTag = sse_decode_list_prim_u_8_strict(deserializer); - return SharedPoster( - lowResWallpaperTag: var_lowResWallpaperTag, - wallpaperTag: var_wallpaperTag, - messageTag: var_messageTag); + sse_encode_usize( + (self as FindMyPhoneClientDefaultAnisetteProviderImpl) + .frbInternalSseEncode(move: true), + serializer, + ); } @protected - SharedPushState sse_decode_shared_push_state(SseDeserializer deserializer) { + void + sse_encode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerGZipWrapperAttachmentMeta( + GZipWrapperAttachmentMeta self, + SseSerializer serializer, + ) { // Codec=Sse (Serialization based), see doc to use other codecs - var var_osConfig = - sse_decode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerJoinedOSConfig( - deserializer); - var var_cancelPoll = - sse_decode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerSender( - deserializer); - var var_confDir = sse_decode_String(deserializer); - var var_localBroadcast = - sse_decode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcSenderPushMessage( - deserializer); - var var_anisette = - sse_decode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcAnisetteClientDefaultAnisetteProvider( - deserializer); - var var_conn = - sse_decode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerAPSConnection( - deserializer); - var var_icloudServices = - sse_decode_opt_box_autoadd_shared_i_cloud_services(deserializer); - var var_client = - sse_decode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcIMClient( - deserializer); - var var_ftClient = - sse_decode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcFTClient( - deserializer); - var var_idmsClient = - sse_decode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcIdmsAuthListener( - deserializer); - var var_activeCircleSessions = - sse_decode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcMutexVecActiveCircleSession( - deserializer); - var var_clientSession = - sse_decode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcMutexOptionCircleClientSessionDefaultAnisetteProvider( - deserializer); - return SharedPushState( - osConfig: var_osConfig, - cancelPoll: var_cancelPoll, - confDir: var_confDir, - localBroadcast: var_localBroadcast, - anisette: var_anisette, - conn: var_conn, - icloudServices: var_icloudServices, - client: var_client, - ftClient: var_ftClient, - idmsClient: var_idmsClient, - activeCircleSessions: var_activeCircleSessions, - clientSession: var_clientSession); + sse_encode_usize( + (self as GZipWrapperAttachmentMetaImpl).frbInternalSseEncode(move: true), + serializer, + ); } @protected - SimplifiedIncomingCallPoster sse_decode_simplified_incoming_call_poster( - SseDeserializer deserializer) { + void + sse_encode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerGZipWrapperChatProto( + GZipWrapperChatProto self, + SseSerializer serializer, + ) { // Codec=Sse (Serialization based), see doc to use other codecs - var var_poster = sse_decode_simplified_poster(deserializer); - var var_textMetadata = sse_decode_wallpaper_metadata(deserializer); - var var_lowRes = sse_decode_list_prim_u_8_strict(deserializer); - return SimplifiedIncomingCallPoster( - poster: var_poster, textMetadata: var_textMetadata, lowRes: var_lowRes); + sse_encode_usize( + (self as GZipWrapperChatProtoImpl).frbInternalSseEncode(move: true), + serializer, + ); } @protected - SimplifiedPoster sse_decode_simplified_poster(SseDeserializer deserializer) { + void + sse_encode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerGZipWrapperMessageProto( + GZipWrapperMessageProto self, + SseSerializer serializer, + ) { // Codec=Sse (Serialization based), see doc to use other codecs - var var_titleConfiguration = - sse_decode_pr_poster_title_style_configuration(deserializer); - var var_type = sse_decode_poster_type(deserializer); - var var_role = sse_decode_poster_role(deserializer); - return SimplifiedPoster( - titleConfiguration: var_titleConfiguration, - type: var_type, - role: var_role); + sse_encode_usize( + (self as GZipWrapperMessageProtoImpl).frbInternalSseEncode(move: true), + serializer, + ); } @protected - SimplifiedTranscriptPoster sse_decode_simplified_transcript_poster( - SseDeserializer deserializer) { + void + sse_encode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerGZipWrapperMessageProto2( + GZipWrapperMessageProto2 self, + SseSerializer serializer, + ) { // Codec=Sse (Serialization based), see doc to use other codecs - var var_watch = sse_decode_watch_background(deserializer); - var var_poster = sse_decode_simplified_poster(deserializer); - return SimplifiedTranscriptPoster(watch: var_watch, poster: var_poster); + sse_encode_usize( + (self as GZipWrapperMessageProto2Impl).frbInternalSseEncode(move: true), + serializer, + ); } @protected - StatusKitMessage sse_decode_status_kit_message(SseDeserializer deserializer) { + void + sse_encode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerGZipWrapperMessageProto3( + GZipWrapperMessageProto3 self, + SseSerializer serializer, + ) { // Codec=Sse (Serialization based), see doc to use other codecs - - var tag_ = sse_decode_i_32(deserializer); - switch (tag_) { - case 0: - var var_user = sse_decode_String(deserializer); - var var_mode = sse_decode_opt_String(deserializer); - var var_allowed = sse_decode_bool(deserializer); - return StatusKitMessage_StatusChanged( - user: var_user, mode: var_mode, allowed: var_allowed); - default: - throw UnimplementedError(''); - } + sse_encode_usize( + (self as GZipWrapperMessageProto3Impl).frbInternalSseEncode(move: true), + serializer, + ); } @protected - StatusKitPersonalConfig sse_decode_status_kit_personal_config( - SseDeserializer deserializer) { + void + sse_encode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerGZipWrapperMessageProto4( + GZipWrapperMessageProto4 self, + SseSerializer serializer, + ) { // Codec=Sse (Serialization based), see doc to use other codecs - var var_allowedModes = sse_decode_list_String(deserializer); - return StatusKitPersonalConfig(allowedModes: var_allowedModes); + sse_encode_usize( + (self as GZipWrapperMessageProto4Impl).frbInternalSseEncode(move: true), + serializer, + ); } @protected - SupportAction sse_decode_support_action(SseDeserializer deserializer) { + void + sse_encode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerIDSNGMIdentity( + IdsngmIdentity self, + SseSerializer serializer, + ) { // Codec=Sse (Serialization based), see doc to use other codecs - var var_url = sse_decode_String(deserializer); - var var_button = sse_decode_String(deserializer); - return SupportAction(url: var_url, button: var_button); + sse_encode_usize( + (self as IdsngmIdentityImpl).frbInternalSseEncode(move: true), + serializer, + ); } @protected - SupportAlert sse_decode_support_alert(SseDeserializer deserializer) { + void + sse_encode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerIDSUser( + IdsUser self, + SseSerializer serializer, + ) { // Codec=Sse (Serialization based), see doc to use other codecs - var var_title = sse_decode_String(deserializer); - var var_body = sse_decode_String(deserializer); - var var_action = sse_decode_opt_box_autoadd_support_action(deserializer); - return SupportAlert(title: var_title, body: var_body, action: var_action); + sse_encode_usize( + (self as IdsUserImpl).frbInternalSseEncode(move: true), + serializer, + ); } @protected - SyncStatus sse_decode_sync_status(SseDeserializer deserializer) { + void + sse_encode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerJoinedOSConfig( + JoinedOsConfig self, + SseSerializer serializer, + ) { // Codec=Sse (Serialization based), see doc to use other codecs - - var tag_ = sse_decode_i_32(deserializer); - switch (tag_) { - case 0: - return SyncStatus_Synced(); - case 1: - var var_progress = sse_decode_usize(deserializer); - var var_total = sse_decode_usize(deserializer); - return SyncStatus_Downloading(progress: var_progress, total: var_total); - case 2: - var var_progress = sse_decode_usize(deserializer); - var var_total = sse_decode_usize(deserializer); - return SyncStatus_Uploading(progress: var_progress, total: var_total); - case 3: - return SyncStatus_Syncing(); - default: - throw UnimplementedError(''); - } + sse_encode_usize( + (self as JoinedOsConfigImpl).frbInternalSseEncode(move: true), + serializer, + ); } @protected - TeardownSignIn sse_decode_teardown_sign_in(SseDeserializer deserializer) { + void + sse_encode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerLocationReport( + LocationReport self, + SseSerializer serializer, + ) { // Codec=Sse (Serialization based), see doc to use other codecs - var var_prevtxnid = sse_decode_String(deserializer); - return TeardownSignIn(prevtxnid: var_prevtxnid); + sse_encode_usize( + (self as LocationReportImpl).frbInternalSseEncode(move: true), + serializer, + ); } @protected - TextEffect sse_decode_text_effect(SseDeserializer deserializer) { + void + sse_encode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerMessageFlags( + MessageFlags self, + SseSerializer serializer, + ) { // Codec=Sse (Serialization based), see doc to use other codecs - var inner = sse_decode_i_32(deserializer); - return TextEffect.values[inner]; + sse_encode_usize( + (self as MessageFlagsImpl).frbInternalSseEncode(move: true), + serializer, + ); } @protected - TextFlags sse_decode_text_flags(SseDeserializer deserializer) { + void + sse_encode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerNSArrayLPIconMetadata( + NsArrayLpIconMetadata self, + SseSerializer serializer, + ) { // Codec=Sse (Serialization based), see doc to use other codecs - var var_bold = sse_decode_bool(deserializer); - var var_italic = sse_decode_bool(deserializer); - var var_underline = sse_decode_bool(deserializer); - var var_strikethrough = sse_decode_bool(deserializer); - return TextFlags( - bold: var_bold, - italic: var_italic, - underline: var_underline, - strikethrough: var_strikethrough); + sse_encode_usize( + (self as NsArrayLpIconMetadataImpl).frbInternalSseEncode(move: true), + serializer, + ); } @protected - TextFormat sse_decode_text_format(SseDeserializer deserializer) { + void + sse_encode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerNSArrayLPImageMetadata( + NsArrayLpImageMetadata self, + SseSerializer serializer, + ) { // Codec=Sse (Serialization based), see doc to use other codecs - - var tag_ = sse_decode_i_32(deserializer); - switch (tag_) { - case 0: - var var_field0 = sse_decode_box_autoadd_text_flags(deserializer); - return TextFormat_Flags(var_field0); - case 1: - var var_field0 = sse_decode_text_effect(deserializer); - return TextFormat_Effect(var_field0); - default: - throw UnimplementedError(''); - } + sse_encode_usize( + (self as NsArrayLpImageMetadataImpl).frbInternalSseEncode(move: true), + serializer, + ); } @protected - TranscriptDynamicUserData sse_decode_transcript_dynamic_user_data( - SseDeserializer deserializer) { + void + sse_encode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerPushError( + PushError self, + SseSerializer serializer, + ) { // Codec=Sse (Serialization based), see doc to use other codecs - var var_identifier = sse_decode_String(deserializer); - return TranscriptDynamicUserData(identifier: var_identifier); + sse_encode_usize( + (self as PushErrorImpl).frbInternalSseEncode(move: true), + serializer, + ); } @protected - TransferProgress sse_decode_transfer_progress(SseDeserializer deserializer) { + void + sse_encode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerReceiverAPSMessage( + ReceiverApsMessage self, + SseSerializer serializer, + ) { // Codec=Sse (Serialization based), see doc to use other codecs - var var_prog = sse_decode_CastedPrimitive_usize(deserializer); - var var_total = sse_decode_CastedPrimitive_usize(deserializer); - var var_attachment = sse_decode_opt_box_autoadd_attachment(deserializer); - return TransferProgress( - prog: var_prog, total: var_total, attachment: var_attachment); + sse_encode_usize( + (self as ReceiverApsMessageImpl).frbInternalSseEncode(move: true), + serializer, + ); } @protected - TrustedPhoneNumber sse_decode_trusted_phone_number( - SseDeserializer deserializer) { + void + sse_encode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerSavedHardwareState( + SavedHardwareState self, + SseSerializer serializer, + ) { // Codec=Sse (Serialization based), see doc to use other codecs - var var_numberWithDialCode = sse_decode_String(deserializer); - var var_lastTwoDigits = sse_decode_String(deserializer); - var var_pushMode = sse_decode_String(deserializer); - var var_id = sse_decode_u_32(deserializer); - return TrustedPhoneNumber( - numberWithDialCode: var_numberWithDialCode, - lastTwoDigits: var_lastTwoDigits, - pushMode: var_pushMode, - id: var_id); + sse_encode_usize( + (self as SavedHardwareStateImpl).frbInternalSseEncode(move: true), + serializer, + ); } @protected - TypingApp sse_decode_typing_app(SseDeserializer deserializer) { + void + sse_encode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerSender( + Sender self, + SseSerializer serializer, + ) { // Codec=Sse (Serialization based), see doc to use other codecs - var var_bundleId = sse_decode_String(deserializer); - var var_icon = sse_decode_list_prim_u_8_strict(deserializer); - return TypingApp(bundleId: var_bundleId, icon: var_icon); + sse_encode_usize( + (self as SenderImpl).frbInternalSseEncode(move: true), + serializer, + ); } @protected - int sse_decode_u_32(SseDeserializer deserializer) { + void + sse_encode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerStCollapsedValue( + StCollapsedValue self, + SseSerializer serializer, + ) { // Codec=Sse (Serialization based), see doc to use other codecs - return deserializer.buffer.getUint32(); + sse_encode_usize( + (self as StCollapsedValueImpl).frbInternalSseEncode(move: true), + serializer, + ); } @protected - BigInt sse_decode_u_64(SseDeserializer deserializer) { + void + sse_encode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerSyncManagerDefaultAnisetteProviderMyFilePackager( + SyncManagerDefaultAnisetteProviderMyFilePackager self, + SseSerializer serializer, + ) { // Codec=Sse (Serialization based), see doc to use other codecs - return deserializer.buffer.getBigUint64(); + sse_encode_usize( + (self as SyncManagerDefaultAnisetteProviderMyFilePackagerImpl) + .frbInternalSseEncode(move: true), + serializer, + ); } @protected - int sse_decode_u_8(SseDeserializer deserializer) { + void + sse_encode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerSystemTime( + SystemTime self, + SseSerializer serializer, + ) { // Codec=Sse (Serialization based), see doc to use other codecs - return deserializer.buffer.getUint8(); + sse_encode_usize( + (self as SystemTimeImpl).frbInternalSseEncode(move: true), + serializer, + ); } @protected - UIColor sse_decode_ui_color(SseDeserializer deserializer) { + void + sse_encode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerVerifyBody( + VerifyBody self, + SseSerializer serializer, + ) { // Codec=Sse (Serialization based), see doc to use other codecs - - var tag_ = sse_decode_i_32(deserializer); - switch (tag_) { - case 0: - var var_colorComponents = sse_decode_u_32(deserializer); - var var_green = sse_decode_f_64(deserializer); - var var_blue = sse_decode_f_64(deserializer); - var var_red = sse_decode_f_64(deserializer); - var var_greenDbl = sse_decode_opt_box_autoadd_f_64(deserializer); - var var_blueDbl = sse_decode_opt_box_autoadd_f_64(deserializer); - var var_redDbl = sse_decode_opt_box_autoadd_f_64(deserializer); - var var_alphaDbl = sse_decode_opt_box_autoadd_f_64(deserializer); - var var_alpha = sse_decode_f_64(deserializer); - var var_rgb = sse_decode_list_prim_u_8_strict(deserializer); - var var_colorSpace = sse_decode_u_32(deserializer); - var var_class_ = sse_decode_String(deserializer); - return UIColor_RGBAColorSpace( - colorComponents: var_colorComponents, - green: var_green, - blue: var_blue, - red: var_red, - greenDbl: var_greenDbl, - blueDbl: var_blueDbl, - redDbl: var_redDbl, - alphaDbl: var_alphaDbl, - alpha: var_alpha, - rgb: var_rgb, - colorSpace: var_colorSpace, - class_: var_class_); - case 1: - var var_colorComponents = sse_decode_u_32(deserializer); - var var_white = sse_decode_f_64(deserializer); - var var_alpha = sse_decode_f_64(deserializer); - var var_bin = sse_decode_list_prim_u_8_strict(deserializer); - var var_colorSpace = sse_decode_u_32(deserializer); - var var_class_ = sse_decode_String(deserializer); - return UIColor_GrayscaleAlphaColorSpace( - colorComponents: var_colorComponents, - white: var_white, - alpha: var_alpha, - bin: var_bin, - colorSpace: var_colorSpace, - class_: var_class_); - default: - throw UnimplementedError(''); - } + sse_encode_usize( + (self as VerifyBodyImpl).frbInternalSseEncode(move: true), + serializer, + ); } @protected - void sse_decode_unit(SseDeserializer deserializer) { + void + sse_encode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerViableBottle( + ViableBottle self, + SseSerializer serializer, + ) { // Codec=Sse (Serialization based), see doc to use other codecs + sse_encode_usize( + (self as ViableBottleImpl).frbInternalSseEncode(move: true), + serializer, + ); } @protected - UnsendMessage sse_decode_unsend_message(SseDeserializer deserializer) { + void + sse_encode_Auto_RefMut_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerAPSWatcher( + ApsWatcher self, + SseSerializer serializer, + ) { // Codec=Sse (Serialization based), see doc to use other codecs - var var_tuuid = sse_decode_String(deserializer); - var var_editPart = sse_decode_CastedPrimitive_u_64(deserializer); - return UnsendMessage(tuuid: var_tuuid, editPart: var_editPart); + sse_encode_usize( + (self as ApsWatcherImpl).frbInternalSseEncode(move: false), + serializer, + ); } @protected - UpdateAccountFinish sse_decode_update_account_finish( - SseDeserializer deserializer) { + void + sse_encode_Auto_RefMut_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerCircleClientSessionDefaultAnisetteProvider( + CircleClientSessionDefaultAnisetteProvider self, + SseSerializer serializer, + ) { // Codec=Sse (Serialization based), see doc to use other codecs + sse_encode_usize( + (self as CircleClientSessionDefaultAnisetteProviderImpl) + .frbInternalSseEncode(move: false), + serializer, + ); + } - var tag_ = sse_decode_i_32(deserializer); - switch (tag_) { - case 0: - return UpdateAccountFinish_MacOS(); - case 1: - var var_url = sse_decode_String(deserializer); - return UpdateAccountFinish_IOS(url: var_url); - default: - throw UnimplementedError(''); - } + @protected + void + sse_encode_Auto_RefMut_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerFindMyFriendsClientDefaultAnisetteProvider( + FindMyFriendsClientDefaultAnisetteProvider self, + SseSerializer serializer, + ) { + // Codec=Sse (Serialization based), see doc to use other codecs + sse_encode_usize( + (self as FindMyFriendsClientDefaultAnisetteProviderImpl) + .frbInternalSseEncode(move: false), + serializer, + ); } @protected - UpdateExtensionMessage sse_decode_update_extension_message( - SseDeserializer deserializer) { + void + sse_encode_Auto_RefMut_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerFindMyPhoneClientDefaultAnisetteProvider( + FindMyPhoneClientDefaultAnisetteProvider self, + SseSerializer serializer, + ) { // Codec=Sse (Serialization based), see doc to use other codecs - var var_forUuid = sse_decode_String(deserializer); - var var_ext = sse_decode_part_extension(deserializer); - return UpdateExtensionMessage(forUuid: var_forUuid, ext: var_ext); + sse_encode_usize( + (self as FindMyPhoneClientDefaultAnisetteProviderImpl) + .frbInternalSseEncode(move: false), + serializer, + ); } @protected - UpdateProfileMessage sse_decode_update_profile_message( - SseDeserializer deserializer) { + void + sse_encode_Auto_RefMut_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerLocationReport( + LocationReport self, + SseSerializer serializer, + ) { // Codec=Sse (Serialization based), see doc to use other codecs - var var_profile = - sse_decode_opt_box_autoadd_share_profile_message(deserializer); - var var_shareContacts = sse_decode_bool(deserializer); - return UpdateProfileMessage( - profile: var_profile, shareContacts: var_shareContacts); + sse_encode_usize( + (self as LocationReportImpl).frbInternalSseEncode(move: false), + serializer, + ); } @protected - UpdateProfileSharingMessage sse_decode_update_profile_sharing_message( - SseDeserializer deserializer) { + void + sse_encode_Auto_RefMut_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerReceiverAPSMessage( + ReceiverApsMessage self, + SseSerializer serializer, + ) { // Codec=Sse (Serialization based), see doc to use other codecs - var var_sharedDismissed = sse_decode_list_String(deserializer); - var var_sharedAll = sse_decode_list_String(deserializer); - var var_version = sse_decode_CastedPrimitive_u_64(deserializer); - return UpdateProfileSharingMessage( - sharedDismissed: var_sharedDismissed, - sharedAll: var_sharedAll, - version: var_version); + sse_encode_usize( + (self as ReceiverApsMessageImpl).frbInternalSseEncode(move: false), + serializer, + ); } @protected - BigInt sse_decode_usize(SseDeserializer deserializer) { + void + sse_encode_Auto_RefMut_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerSavedHardwareState( + SavedHardwareState self, + SseSerializer serializer, + ) { // Codec=Sse (Serialization based), see doc to use other codecs - return deserializer.buffer.getBigUint64(); + sse_encode_usize( + (self as SavedHardwareStateImpl).frbInternalSseEncode(move: false), + serializer, + ); } @protected - WallpaperMetadata sse_decode_wallpaper_metadata( - SseDeserializer deserializer) { + void + sse_encode_Auto_RefMut_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerViableBottle( + ViableBottle self, + SseSerializer serializer, + ) { // Codec=Sse (Serialization based), see doc to use other codecs - var var_backgroundColorKey = - sse_decode_opt_box_autoadd_poster_color(deserializer); - var var_fontColorKey = sse_decode_poster_color(deserializer); - var var_fontNameKey = sse_decode_String(deserializer); - var var_fontSizeKey = sse_decode_f_32(deserializer); - var var_fontWeightKey = sse_decode_f_32(deserializer); - var var_isVerticalKey = sse_decode_bool(deserializer); - var var_typeKey = sse_decode_String(deserializer); - return WallpaperMetadata( - backgroundColorKey: var_backgroundColorKey, - fontColorKey: var_fontColorKey, - fontNameKey: var_fontNameKey, - fontSizeKey: var_fontSizeKey, - fontWeightKey: var_fontWeightKey, - isVerticalKey: var_isVerticalKey, - typeKey: var_typeKey); + sse_encode_usize( + (self as ViableBottleImpl).frbInternalSseEncode(move: false), + serializer, + ); } @protected - WatchBackground sse_decode_watch_background(SseDeserializer deserializer) { + void + sse_encode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerAPSConnection( + ApsConnection self, + SseSerializer serializer, + ) { // Codec=Sse (Serialization based), see doc to use other codecs - var var_isHighKey = sse_decode_bool(deserializer); - var var_luminance = sse_decode_f_64(deserializer); - var var_backgroundImageData = sse_decode_list_prim_u_8_strict(deserializer); - var var_extensionIdentifier = sse_decode_String(deserializer); - return WatchBackground( - isHighKey: var_isHighKey, - luminance: var_luminance, - backgroundImageData: var_backgroundImageData, - extensionIdentifier: var_extensionIdentifier); + sse_encode_usize( + (self as ApsConnectionImpl).frbInternalSseEncode(move: false), + serializer, + ); } @protected - WifiPassword sse_decode_wifi_password(SseDeserializer deserializer) { + void + sse_encode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcAnisetteClientDefaultAnisetteProvider( + ArcAnisetteClientDefaultAnisetteProvider self, + SseSerializer serializer, + ) { // Codec=Sse (Serialization based), see doc to use other codecs - var var_cdat = sse_decode_CastedPrimitive_u_64(deserializer); - var var_mdat = sse_decode_CastedPrimitive_u_64(deserializer); - var var_acct = sse_decode_String(deserializer); - var var_svce = sse_decode_String(deserializer); - var var_data = sse_decode_list_prim_u_8_strict(deserializer); - return WifiPassword( - cdat: var_cdat, - mdat: var_mdat, - acct: var_acct, - svce: var_svce, - data: var_data); + sse_encode_usize( + (self as ArcAnisetteClientDefaultAnisetteProviderImpl) + .frbInternalSseEncode(move: false), + serializer, + ); } @protected - void sse_encode_AnyhowException( - AnyhowException self, SseSerializer serializer) { + void + sse_encode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcCloudKitClientDefaultAnisetteProvider( + ArcCloudKitClientDefaultAnisetteProvider self, + SseSerializer serializer, + ) { // Codec=Sse (Serialization based), see doc to use other codecs - sse_encode_String(self.message, serializer); + sse_encode_usize( + (self as ArcCloudKitClientDefaultAnisetteProviderImpl) + .frbInternalSseEncode(move: false), + serializer, + ); } @protected void - sse_encode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerAPSConnection( - ApsConnection self, SseSerializer serializer) { + sse_encode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcCloudMessagesClientDefaultAnisetteProvider( + ArcCloudMessagesClientDefaultAnisetteProvider self, + SseSerializer serializer, + ) { // Codec=Sse (Serialization based), see doc to use other codecs sse_encode_usize( - (self as ApsConnectionImpl).frbInternalSseEncode(move: true), - serializer); + (self as ArcCloudMessagesClientDefaultAnisetteProviderImpl) + .frbInternalSseEncode(move: false), + serializer, + ); } @protected void - sse_encode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerAPSState( - ApsState self, SseSerializer serializer) { + sse_encode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcFTClient( + ArcFtClient self, + SseSerializer serializer, + ) { // Codec=Sse (Serialization based), see doc to use other codecs sse_encode_usize( - (self as ApsStateImpl).frbInternalSseEncode(move: true), serializer); + (self as ArcFtClientImpl).frbInternalSseEncode(move: false), + serializer, + ); } @protected void - sse_encode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerAPSWatcher( - ApsWatcher self, SseSerializer serializer) { + sse_encode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcFindMyClientDefaultAnisetteProvider( + ArcFindMyClientDefaultAnisetteProvider self, + SseSerializer serializer, + ) { // Codec=Sse (Serialization based), see doc to use other codecs sse_encode_usize( - (self as ApsWatcherImpl).frbInternalSseEncode(move: true), serializer); + (self as ArcFindMyClientDefaultAnisetteProviderImpl).frbInternalSseEncode( + move: false, + ), + serializer, + ); } @protected void - sse_encode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcAnisetteClientDefaultAnisetteProvider( - ArcAnisetteClientDefaultAnisetteProvider self, - SseSerializer serializer) { + sse_encode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcIMClient( + ArcImClient self, + SseSerializer serializer, + ) { // Codec=Sse (Serialization based), see doc to use other codecs sse_encode_usize( - (self as ArcAnisetteClientDefaultAnisetteProviderImpl) - .frbInternalSseEncode(move: true), - serializer); + (self as ArcImClientImpl).frbInternalSseEncode(move: false), + serializer, + ); } @protected void - sse_encode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcCloudKitClientDefaultAnisetteProvider( - ArcCloudKitClientDefaultAnisetteProvider self, - SseSerializer serializer) { + sse_encode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcIdmsAuthListener( + ArcIdmsAuthListener self, + SseSerializer serializer, + ) { // Codec=Sse (Serialization based), see doc to use other codecs sse_encode_usize( - (self as ArcCloudKitClientDefaultAnisetteProviderImpl) - .frbInternalSseEncode(move: true), - serializer); + (self as ArcIdmsAuthListenerImpl).frbInternalSseEncode(move: false), + serializer, + ); } @protected void - sse_encode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcCloudMessagesClientDefaultAnisetteProvider( - ArcCloudMessagesClientDefaultAnisetteProvider self, - SseSerializer serializer) { + sse_encode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcKeychainClientDefaultAnisetteProvider( + ArcKeychainClientDefaultAnisetteProvider self, + SseSerializer serializer, + ) { // Codec=Sse (Serialization based), see doc to use other codecs sse_encode_usize( - (self as ArcCloudMessagesClientDefaultAnisetteProviderImpl) - .frbInternalSseEncode(move: true), - serializer); + (self as ArcKeychainClientDefaultAnisetteProviderImpl) + .frbInternalSseEncode(move: false), + serializer, + ); } @protected void - sse_encode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcFTClient( - ArcFtClient self, SseSerializer serializer) { + sse_encode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcMutexAppleAccountDefaultAnisetteProvider( + ArcMutexAppleAccountDefaultAnisetteProvider self, + SseSerializer serializer, + ) { // Codec=Sse (Serialization based), see doc to use other codecs sse_encode_usize( - (self as ArcFtClientImpl).frbInternalSseEncode(move: true), serializer); + (self as ArcMutexAppleAccountDefaultAnisetteProviderImpl) + .frbInternalSseEncode(move: false), + serializer, + ); } @protected void - sse_encode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcFindMyClientDefaultAnisetteProvider( - ArcFindMyClientDefaultAnisetteProvider self, - SseSerializer serializer) { + sse_encode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcMutexOptionCircleClientSessionDefaultAnisetteProvider( + ArcMutexOptionCircleClientSessionDefaultAnisetteProvider self, + SseSerializer serializer, + ) { // Codec=Sse (Serialization based), see doc to use other codecs sse_encode_usize( - (self as ArcFindMyClientDefaultAnisetteProviderImpl) - .frbInternalSseEncode(move: true), - serializer); + (self as ArcMutexOptionCircleClientSessionDefaultAnisetteProviderImpl) + .frbInternalSseEncode(move: false), + serializer, + ); } @protected void - sse_encode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcIMClient( - ArcImClient self, SseSerializer serializer) { + sse_encode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcMutexVecActiveCircleSession( + ArcMutexVecActiveCircleSession self, + SseSerializer serializer, + ) { // Codec=Sse (Serialization based), see doc to use other codecs sse_encode_usize( - (self as ArcImClientImpl).frbInternalSseEncode(move: true), serializer); + (self as ArcMutexVecActiveCircleSessionImpl).frbInternalSseEncode( + move: false, + ), + serializer, + ); } @protected void - sse_encode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcIdmsAuthListener( - ArcIdmsAuthListener self, SseSerializer serializer) { + sse_encode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcPasswordManagerDefaultAnisetteProvider( + ArcPasswordManagerDefaultAnisetteProvider self, + SseSerializer serializer, + ) { // Codec=Sse (Serialization based), see doc to use other codecs sse_encode_usize( - (self as ArcIdmsAuthListenerImpl).frbInternalSseEncode(move: true), - serializer); + (self as ArcPasswordManagerDefaultAnisetteProviderImpl) + .frbInternalSseEncode(move: false), + serializer, + ); } @protected void - sse_encode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcKeychainClientDefaultAnisetteProvider( - ArcKeychainClientDefaultAnisetteProvider self, - SseSerializer serializer) { + sse_encode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcProfilesClientDefaultAnisetteProvider( + ArcProfilesClientDefaultAnisetteProvider self, + SseSerializer serializer, + ) { // Codec=Sse (Serialization based), see doc to use other codecs sse_encode_usize( - (self as ArcKeychainClientDefaultAnisetteProviderImpl) - .frbInternalSseEncode(move: true), - serializer); + (self as ArcProfilesClientDefaultAnisetteProviderImpl) + .frbInternalSseEncode(move: false), + serializer, + ); } @protected void - sse_encode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcMutexAppleAccountDefaultAnisetteProvider( - ArcMutexAppleAccountDefaultAnisetteProvider self, - SseSerializer serializer) { + sse_encode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcSenderPushMessage( + ArcSenderPushMessage self, + SseSerializer serializer, + ) { // Codec=Sse (Serialization based), see doc to use other codecs sse_encode_usize( - (self as ArcMutexAppleAccountDefaultAnisetteProviderImpl) - .frbInternalSseEncode(move: true), - serializer); + (self as ArcSenderPushMessageImpl).frbInternalSseEncode(move: false), + serializer, + ); } @protected void - sse_encode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcMutexOptionCircleClientSessionDefaultAnisetteProvider( - ArcMutexOptionCircleClientSessionDefaultAnisetteProvider self, - SseSerializer serializer) { + sse_encode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcSharedPushState( + ArcSharedPushState self, + SseSerializer serializer, + ) { // Codec=Sse (Serialization based), see doc to use other codecs sse_encode_usize( - (self as ArcMutexOptionCircleClientSessionDefaultAnisetteProviderImpl) - .frbInternalSseEncode(move: true), - serializer); + (self as ArcSharedPushStateImpl).frbInternalSseEncode(move: false), + serializer, + ); } @protected void - sse_encode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcMutexVecActiveCircleSession( - ArcMutexVecActiveCircleSession self, SseSerializer serializer) { + sse_encode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcStatusKitClientDefaultAnisetteProvider( + ArcStatusKitClientDefaultAnisetteProvider self, + SseSerializer serializer, + ) { // Codec=Sse (Serialization based), see doc to use other codecs sse_encode_usize( - (self as ArcMutexVecActiveCircleSessionImpl) - .frbInternalSseEncode(move: true), - serializer); + (self as ArcStatusKitClientDefaultAnisetteProviderImpl) + .frbInternalSseEncode(move: false), + serializer, + ); } @protected void - sse_encode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcPasswordManagerDefaultAnisetteProvider( - ArcPasswordManagerDefaultAnisetteProvider self, - SseSerializer serializer) { + sse_encode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcTokenProviderDefaultAnisetteProvider( + ArcTokenProviderDefaultAnisetteProvider self, + SseSerializer serializer, + ) { // Codec=Sse (Serialization based), see doc to use other codecs sse_encode_usize( - (self as ArcPasswordManagerDefaultAnisetteProviderImpl) - .frbInternalSseEncode(move: true), - serializer); + (self as ArcTokenProviderDefaultAnisetteProviderImpl) + .frbInternalSseEncode(move: false), + serializer, + ); } @protected void - sse_encode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcProfilesClientDefaultAnisetteProvider( - ArcProfilesClientDefaultAnisetteProvider self, - SseSerializer serializer) { + sse_encode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerCloudSyncPreparedMessageCreateHandle( + CloudSyncPreparedMessageCreateHandle self, + SseSerializer serializer, + ) { // Codec=Sse (Serialization based), see doc to use other codecs sse_encode_usize( - (self as ArcProfilesClientDefaultAnisetteProviderImpl) - .frbInternalSseEncode(move: true), - serializer); + (self as CloudSyncPreparedMessageCreateHandleImpl).frbInternalSseEncode( + move: false, + ), + serializer, + ); } @protected void - sse_encode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcSenderPushMessage( - ArcSenderPushMessage self, SseSerializer serializer) { + sse_encode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerDate( + Date self, + SseSerializer serializer, + ) { // Codec=Sse (Serialization based), see doc to use other codecs sse_encode_usize( - (self as ArcSenderPushMessageImpl).frbInternalSseEncode(move: true), - serializer); + (self as DateImpl).frbInternalSseEncode(move: false), + serializer, + ); } @protected void - sse_encode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcSharedPushState( - ArcSharedPushState self, SseSerializer serializer) { + sse_encode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerEscrowData( + EscrowData self, + SseSerializer serializer, + ) { // Codec=Sse (Serialization based), see doc to use other codecs sse_encode_usize( - (self as ArcSharedPushStateImpl).frbInternalSseEncode(move: true), - serializer); + (self as EscrowDataImpl).frbInternalSseEncode(move: false), + serializer, + ); } @protected void - sse_encode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcStatusKitClientDefaultAnisetteProvider( - ArcStatusKitClientDefaultAnisetteProvider self, - SseSerializer serializer) { + sse_encode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerGZipWrapperAttachmentMeta( + GZipWrapperAttachmentMeta self, + SseSerializer serializer, + ) { // Codec=Sse (Serialization based), see doc to use other codecs sse_encode_usize( - (self as ArcStatusKitClientDefaultAnisetteProviderImpl) - .frbInternalSseEncode(move: true), - serializer); + (self as GZipWrapperAttachmentMetaImpl).frbInternalSseEncode(move: false), + serializer, + ); } @protected void - sse_encode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcTokenProviderDefaultAnisetteProvider( - ArcTokenProviderDefaultAnisetteProvider self, - SseSerializer serializer) { + sse_encode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerGZipWrapperChatProto( + GZipWrapperChatProto self, + SseSerializer serializer, + ) { // Codec=Sse (Serialization based), see doc to use other codecs sse_encode_usize( - (self as ArcTokenProviderDefaultAnisetteProviderImpl) - .frbInternalSseEncode(move: true), - serializer); + (self as GZipWrapperChatProtoImpl).frbInternalSseEncode(move: false), + serializer, + ); } @protected void - sse_encode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerAsset( - Asset self, SseSerializer serializer) { + sse_encode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerGZipWrapperMessageProto( + GZipWrapperMessageProto self, + SseSerializer serializer, + ) { // Codec=Sse (Serialization based), see doc to use other codecs sse_encode_usize( - (self as AssetImpl).frbInternalSseEncode(move: true), serializer); + (self as GZipWrapperMessageProtoImpl).frbInternalSseEncode(move: false), + serializer, + ); } @protected void - sse_encode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerChannelInterestToken( - ChannelInterestToken self, SseSerializer serializer) { + sse_encode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerGZipWrapperMessageProto2( + GZipWrapperMessageProto2 self, + SseSerializer serializer, + ) { // Codec=Sse (Serialization based), see doc to use other codecs sse_encode_usize( - (self as ChannelInterestTokenImpl).frbInternalSseEncode(move: true), - serializer); + (self as GZipWrapperMessageProto2Impl).frbInternalSseEncode(move: false), + serializer, + ); } @protected void - sse_encode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerCircleClientSessionDefaultAnisetteProvider( - CircleClientSessionDefaultAnisetteProvider self, - SseSerializer serializer) { + sse_encode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerGZipWrapperMessageProto3( + GZipWrapperMessageProto3 self, + SseSerializer serializer, + ) { // Codec=Sse (Serialization based), see doc to use other codecs sse_encode_usize( - (self as CircleClientSessionDefaultAnisetteProviderImpl) - .frbInternalSseEncode(move: true), - serializer); + (self as GZipWrapperMessageProto3Impl).frbInternalSseEncode(move: false), + serializer, + ); } @protected void - sse_encode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerConversationLink( - ConversationLink self, SseSerializer serializer) { + sse_encode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerGZipWrapperMessageProto4( + GZipWrapperMessageProto4 self, + SseSerializer serializer, + ) { // Codec=Sse (Serialization based), see doc to use other codecs sse_encode_usize( - (self as ConversationLinkImpl).frbInternalSseEncode(move: true), - serializer); + (self as GZipWrapperMessageProto4Impl).frbInternalSseEncode(move: false), + serializer, + ); } @protected void - sse_encode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerConversationParticipant( - ConversationParticipant self, SseSerializer serializer) { + sse_encode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerIDSNGMIdentity( + IdsngmIdentity self, + SseSerializer serializer, + ) { // Codec=Sse (Serialization based), see doc to use other codecs sse_encode_usize( - (self as ConversationParticipantImpl).frbInternalSseEncode(move: true), - serializer); + (self as IdsngmIdentityImpl).frbInternalSseEncode(move: false), + serializer, + ); } @protected void - sse_encode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerDate( - Date self, SseSerializer serializer) { + sse_encode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerIDSUser( + IdsUser self, + SseSerializer serializer, + ) { // Codec=Sse (Serialization based), see doc to use other codecs sse_encode_usize( - (self as DateImpl).frbInternalSseEncode(move: true), serializer); + (self as IdsUserImpl).frbInternalSseEncode(move: false), + serializer, + ); } @protected void - sse_encode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerEscrowData( - EscrowData self, SseSerializer serializer) { + sse_encode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerJoinedOSConfig( + JoinedOsConfig self, + SseSerializer serializer, + ) { // Codec=Sse (Serialization based), see doc to use other codecs sse_encode_usize( - (self as EscrowDataImpl).frbInternalSseEncode(move: true), serializer); + (self as JoinedOsConfigImpl).frbInternalSseEncode(move: false), + serializer, + ); } @protected void - sse_encode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerFindMyFriendsClientDefaultAnisetteProvider( - FindMyFriendsClientDefaultAnisetteProvider self, - SseSerializer serializer) { + sse_encode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerLocationReport( + LocationReport self, + SseSerializer serializer, + ) { // Codec=Sse (Serialization based), see doc to use other codecs sse_encode_usize( - (self as FindMyFriendsClientDefaultAnisetteProviderImpl) - .frbInternalSseEncode(move: true), - serializer); + (self as LocationReportImpl).frbInternalSseEncode(move: false), + serializer, + ); } @protected void - sse_encode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerFindMyPhoneClientDefaultAnisetteProvider( - FindMyPhoneClientDefaultAnisetteProvider self, - SseSerializer serializer) { + sse_encode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerMessageFlags( + MessageFlags self, + SseSerializer serializer, + ) { // Codec=Sse (Serialization based), see doc to use other codecs sse_encode_usize( - (self as FindMyPhoneClientDefaultAnisetteProviderImpl) - .frbInternalSseEncode(move: true), - serializer); + (self as MessageFlagsImpl).frbInternalSseEncode(move: false), + serializer, + ); } @protected void - sse_encode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerGZipWrapperAttachmentMeta( - GZipWrapperAttachmentMeta self, SseSerializer serializer) { + sse_encode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerSavedHardwareState( + SavedHardwareState self, + SseSerializer serializer, + ) { // Codec=Sse (Serialization based), see doc to use other codecs sse_encode_usize( - (self as GZipWrapperAttachmentMetaImpl) - .frbInternalSseEncode(move: true), - serializer); + (self as SavedHardwareStateImpl).frbInternalSseEncode(move: false), + serializer, + ); } @protected void - sse_encode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerGZipWrapperChatProto( - GZipWrapperChatProto self, SseSerializer serializer) { + sse_encode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerSender( + Sender self, + SseSerializer serializer, + ) { // Codec=Sse (Serialization based), see doc to use other codecs sse_encode_usize( - (self as GZipWrapperChatProtoImpl).frbInternalSseEncode(move: true), - serializer); + (self as SenderImpl).frbInternalSseEncode(move: false), + serializer, + ); } @protected void - sse_encode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerGZipWrapperMessageProto( - GZipWrapperMessageProto self, SseSerializer serializer) { + sse_encode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerStCollapsedValue( + StCollapsedValue self, + SseSerializer serializer, + ) { // Codec=Sse (Serialization based), see doc to use other codecs sse_encode_usize( - (self as GZipWrapperMessageProtoImpl).frbInternalSseEncode(move: true), - serializer); + (self as StCollapsedValueImpl).frbInternalSseEncode(move: false), + serializer, + ); } @protected void - sse_encode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerGZipWrapperMessageProto2( - GZipWrapperMessageProto2 self, SseSerializer serializer) { + sse_encode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerSyncManagerDefaultAnisetteProviderMyFilePackager( + SyncManagerDefaultAnisetteProviderMyFilePackager self, + SseSerializer serializer, + ) { // Codec=Sse (Serialization based), see doc to use other codecs sse_encode_usize( - (self as GZipWrapperMessageProto2Impl).frbInternalSseEncode(move: true), - serializer); + (self as SyncManagerDefaultAnisetteProviderMyFilePackagerImpl) + .frbInternalSseEncode(move: false), + serializer, + ); } @protected void - sse_encode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerGZipWrapperMessageProto3( - GZipWrapperMessageProto3 self, SseSerializer serializer) { + sse_encode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerVerifyBody( + VerifyBody self, + SseSerializer serializer, + ) { // Codec=Sse (Serialization based), see doc to use other codecs sse_encode_usize( - (self as GZipWrapperMessageProto3Impl).frbInternalSseEncode(move: true), - serializer); + (self as VerifyBodyImpl).frbInternalSseEncode(move: false), + serializer, + ); } @protected void - sse_encode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerGZipWrapperMessageProto4( - GZipWrapperMessageProto4 self, SseSerializer serializer) { + sse_encode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerViableBottle( + ViableBottle self, + SseSerializer serializer, + ) { // Codec=Sse (Serialization based), see doc to use other codecs sse_encode_usize( - (self as GZipWrapperMessageProto4Impl).frbInternalSseEncode(move: true), - serializer); + (self as ViableBottleImpl).frbInternalSseEncode(move: false), + serializer, + ); } @protected - void - sse_encode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerIDSNGMIdentity( - IdsngmIdentity self, SseSerializer serializer) { + void sse_encode_CastedPrimitive_i_64(int self, SseSerializer serializer) { // Codec=Sse (Serialization based), see doc to use other codecs - sse_encode_usize( - (self as IdsngmIdentityImpl).frbInternalSseEncode(move: true), - serializer); + sse_encode_i_64(sseEncodeCastedPrimitiveI64(self), serializer); } @protected - void - sse_encode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerIDSUser( - IdsUser self, SseSerializer serializer) { + void sse_encode_CastedPrimitive_u_64(int self, SseSerializer serializer) { + // Codec=Sse (Serialization based), see doc to use other codecs + sse_encode_u_64(sseEncodeCastedPrimitiveU64(self), serializer); + } + + @protected + void sse_encode_CastedPrimitive_usize(int self, SseSerializer serializer) { + // Codec=Sse (Serialization based), see doc to use other codecs + sse_encode_usize(sseEncodeCastedPrimitiveU64(self), serializer); + } + + @protected + void sse_encode_DartFn_Inputs_String_Output_String_AnyhowException( + FutureOr Function(String) self, + SseSerializer serializer, + ) { + // Codec=Sse (Serialization based), see doc to use other codecs + sse_encode_DartOpaque( + encode_DartFn_Inputs_String_Output_String_AnyhowException(self), + serializer, + ); + } + + @protected + void sse_encode_DartOpaque(Object self, SseSerializer serializer) { // Codec=Sse (Serialization based), see doc to use other codecs sse_encode_usize( - (self as IdsUserImpl).frbInternalSseEncode(move: true), serializer); + BigInt.from( + PlatformPointerUtil.ptrToInt( + encodeDartOpaque( + self, + portManager.dartHandlerPort, + generalizedFrbRustBinding, + ), + ), + ).toUnsigned(64), + serializer, + ); } @protected void - sse_encode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerJoinedOSConfig( - JoinedOsConfig self, SseSerializer serializer) { + sse_encode_Map_String_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerAsset( + Map self, + SseSerializer serializer, + ) { // Codec=Sse (Serialization based), see doc to use other codecs - sse_encode_usize( - (self as JoinedOsConfigImpl).frbInternalSseEncode(move: true), - serializer); + sse_encode_list_record_string_auto_owned_rust_opaque_flutter_rust_bridgefor_generated_rust_auto_opaque_inner_asset( + self.entries.map((e) => (e.key, e.value)).toList(), + serializer, + ); } @protected void - sse_encode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerLocationReport( - LocationReport self, SseSerializer serializer) { + sse_encode_Map_String_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerStCollapsedValue( + Map self, + SseSerializer serializer, + ) { // Codec=Sse (Serialization based), see doc to use other codecs - sse_encode_usize( - (self as LocationReportImpl).frbInternalSseEncode(move: true), - serializer); + sse_encode_list_record_string_auto_owned_rust_opaque_flutter_rust_bridgefor_generated_rust_auto_opaque_inner_st_collapsed_value( + self.entries.map((e) => (e.key, e.value)).toList(), + serializer, + ); + } + + @protected + void sse_encode_Map_String_CastedPrimitive_u_64( + Map self, + SseSerializer serializer, + ) { + // Codec=Sse (Serialization based), see doc to use other codecs + sse_encode_list_record_string_casted_primitive_u_64( + self.entries.map((e) => (e.key, e.value)).toList(), + serializer, + ); + } + + @protected + void sse_encode_Map_String_String( + Map self, + SseSerializer serializer, + ) { + // Codec=Sse (Serialization based), see doc to use other codecs + sse_encode_list_record_string_string( + self.entries.map((e) => (e.key, e.value)).toList(), + serializer, + ); + } + + @protected + void sse_encode_Map_String_bool( + Map self, + SseSerializer serializer, + ) { + // Codec=Sse (Serialization based), see doc to use other codecs + sse_encode_list_record_string_bool( + self.entries.map((e) => (e.key, e.value)).toList(), + serializer, + ); + } + + @protected + void sse_encode_Map_String_cloud_attachment( + Map self, + SseSerializer serializer, + ) { + // Codec=Sse (Serialization based), see doc to use other codecs + sse_encode_list_record_string_cloud_attachment( + self.entries.map((e) => (e.key, e.value)).toList(), + serializer, + ); + } + + @protected + void sse_encode_Map_String_cloud_chat( + Map self, + SseSerializer serializer, + ) { + // Codec=Sse (Serialization based), see doc to use other codecs + sse_encode_list_record_string_cloud_chat( + self.entries.map((e) => (e.key, e.value)).toList(), + serializer, + ); + } + + @protected + void sse_encode_Map_String_cloud_message( + Map self, + SseSerializer serializer, + ) { + // Codec=Sse (Serialization based), see doc to use other codecs + sse_encode_list_record_string_cloud_message( + self.entries.map((e) => (e.key, e.value)).toList(), + serializer, + ); + } + + @protected + void sse_encode_Map_String_ft_participant( + Map self, + SseSerializer serializer, + ) { + // Codec=Sse (Serialization based), see doc to use other codecs + sse_encode_list_record_string_ft_participant( + self.entries.map((e) => (e.key, e.value)).toList(), + serializer, + ); + } + + @protected + void sse_encode_Map_String_group_summary( + Map self, + SseSerializer serializer, + ) { + // Codec=Sse (Serialization based), see doc to use other codecs + sse_encode_list_record_string_group_summary( + self.entries.map((e) => (e.key, e.value)).toList(), + serializer, + ); + } + + @protected + void sse_encode_Map_String_list_message_edit( + Map> self, + SseSerializer serializer, + ) { + // Codec=Sse (Serialization based), see doc to use other codecs + sse_encode_list_record_string_list_message_edit( + self.entries.map((e) => (e.key, e.value)).toList(), + serializer, + ); + } + + @protected + void sse_encode_Map_String_list_prim_u_8_strict( + Map self, + SseSerializer serializer, + ) { + // Codec=Sse (Serialization based), see doc to use other codecs + sse_encode_list_record_string_list_prim_u_8_strict( + self.entries.map((e) => (e.key, e.value)).toList(), + serializer, + ); + } + + @protected + void sse_encode_Map_String_message_edit_range( + Map self, + SseSerializer serializer, + ) { + // Codec=Sse (Serialization based), see doc to use other codecs + sse_encode_list_record_string_message_edit_range( + self.entries.map((e) => (e.key, e.value)).toList(), + serializer, + ); + } + + @protected + void sse_encode_Map_String_opt_box_autoadd_cloud_attachment( + Map self, + SseSerializer serializer, + ) { + // Codec=Sse (Serialization based), see doc to use other codecs + sse_encode_list_record_string_opt_box_autoadd_cloud_attachment( + self.entries.map((e) => (e.key, e.value)).toList(), + serializer, + ); + } + + @protected + void sse_encode_Map_String_opt_box_autoadd_cloud_chat( + Map self, + SseSerializer serializer, + ) { + // Codec=Sse (Serialization based), see doc to use other codecs + sse_encode_list_record_string_opt_box_autoadd_cloud_chat( + self.entries.map((e) => (e.key, e.value)).toList(), + serializer, + ); + } + + @protected + void sse_encode_Map_String_opt_box_autoadd_cloud_message( + Map self, + SseSerializer serializer, + ) { + // Codec=Sse (Serialization based), see doc to use other codecs + sse_encode_list_record_string_opt_box_autoadd_cloud_message( + self.entries.map((e) => (e.key, e.value)).toList(), + serializer, + ); + } + + @protected + void sse_encode_Map_String_password_manager_meta_data_ctx( + Map self, + SseSerializer serializer, + ) { + // Codec=Sse (Serialization based), see doc to use other codecs + sse_encode_list_record_string_password_manager_meta_data_ctx( + self.entries.map((e) => (e.key, e.value)).toList(), + serializer, + ); + } + + @protected + void sse_encode_Map_String_record_opt_string_passkey( + Map self, + SseSerializer serializer, + ) { + // Codec=Sse (Serialization based), see doc to use other codecs + sse_encode_list_record_string_record_opt_string_passkey( + self.entries.map((e) => (e.key, e.value)).toList(), + serializer, + ); + } + + @protected + void sse_encode_Map_String_record_opt_string_password_manager_meta( + Map self, + SseSerializer serializer, + ) { + // Codec=Sse (Serialization based), see doc to use other codecs + sse_encode_list_record_string_record_opt_string_password_manager_meta( + self.entries.map((e) => (e.key, e.value)).toList(), + serializer, + ); + } + + @protected + void sse_encode_Map_String_record_opt_string_password_raw_entry( + Map self, + SseSerializer serializer, + ) { + // Codec=Sse (Serialization based), see doc to use other codecs + sse_encode_list_record_string_record_opt_string_password_raw_entry( + self.entries.map((e) => (e.key, e.value)).toList(), + serializer, + ); + } + + @protected + void sse_encode_Map_String_record_opt_string_wifi_password( + Map self, + SseSerializer serializer, + ) { + // Codec=Sse (Serialization based), see doc to use other codecs + sse_encode_list_record_string_record_opt_string_wifi_password( + self.entries.map((e) => (e.key, e.value)).toList(), + serializer, + ); + } + + @protected + void sse_encode_Map_String_share_invite_content_data( + Map self, + SseSerializer serializer, + ) { + // Codec=Sse (Serialization based), see doc to use other codecs + sse_encode_list_record_string_share_invite_content_data( + self.entries.map((e) => (e.key, e.value)).toList(), + serializer, + ); + } + + @protected + void sse_encode_Map_String_status_kit_personal_config( + Map self, + SseSerializer serializer, + ) { + // Codec=Sse (Serialization based), see doc to use other codecs + sse_encode_list_record_string_status_kit_personal_config( + self.entries.map((e) => (e.key, e.value)).toList(), + serializer, + ); + } + + @protected + void sse_encode_Map_String_sync_status( + Map self, + SseSerializer serializer, + ) { + // Codec=Sse (Serialization based), see doc to use other codecs + sse_encode_list_record_string_sync_status( + self.entries.map((e) => (e.key, e.value)).toList(), + serializer, + ); } @protected void - sse_encode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerMessageFlags( - MessageFlags self, SseSerializer serializer) { + sse_encode_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerAPSConnection( + ApsConnection self, + SseSerializer serializer, + ) { // Codec=Sse (Serialization based), see doc to use other codecs sse_encode_usize( - (self as MessageFlagsImpl).frbInternalSseEncode(move: true), - serializer); + (self as ApsConnectionImpl).frbInternalSseEncode(move: null), + serializer, + ); } @protected void - sse_encode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerNSArrayLPIconMetadata( - NsArrayLpIconMetadata self, SseSerializer serializer) { + sse_encode_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerAPSState( + ApsState self, + SseSerializer serializer, + ) { // Codec=Sse (Serialization based), see doc to use other codecs sse_encode_usize( - (self as NsArrayLpIconMetadataImpl).frbInternalSseEncode(move: true), - serializer); + (self as ApsStateImpl).frbInternalSseEncode(move: null), + serializer, + ); } @protected void - sse_encode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerNSArrayLPImageMetadata( - NsArrayLpImageMetadata self, SseSerializer serializer) { + sse_encode_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerAPSWatcher( + ApsWatcher self, + SseSerializer serializer, + ) { // Codec=Sse (Serialization based), see doc to use other codecs sse_encode_usize( - (self as NsArrayLpImageMetadataImpl).frbInternalSseEncode(move: true), - serializer); + (self as ApsWatcherImpl).frbInternalSseEncode(move: null), + serializer, + ); } @protected void - sse_encode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerPushError( - PushError self, SseSerializer serializer) { + sse_encode_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcAnisetteClientDefaultAnisetteProvider( + ArcAnisetteClientDefaultAnisetteProvider self, + SseSerializer serializer, + ) { // Codec=Sse (Serialization based), see doc to use other codecs sse_encode_usize( - (self as PushErrorImpl).frbInternalSseEncode(move: true), serializer); + (self as ArcAnisetteClientDefaultAnisetteProviderImpl) + .frbInternalSseEncode(move: null), + serializer, + ); } @protected void - sse_encode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerReceiverAPSMessage( - ReceiverApsMessage self, SseSerializer serializer) { + sse_encode_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcCloudKitClientDefaultAnisetteProvider( + ArcCloudKitClientDefaultAnisetteProvider self, + SseSerializer serializer, + ) { // Codec=Sse (Serialization based), see doc to use other codecs sse_encode_usize( - (self as ReceiverApsMessageImpl).frbInternalSseEncode(move: true), - serializer); + (self as ArcCloudKitClientDefaultAnisetteProviderImpl) + .frbInternalSseEncode(move: null), + serializer, + ); } @protected void - sse_encode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerSavedHardwareState( - SavedHardwareState self, SseSerializer serializer) { + sse_encode_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcCloudMessagesClientDefaultAnisetteProvider( + ArcCloudMessagesClientDefaultAnisetteProvider self, + SseSerializer serializer, + ) { // Codec=Sse (Serialization based), see doc to use other codecs sse_encode_usize( - (self as SavedHardwareStateImpl).frbInternalSseEncode(move: true), - serializer); + (self as ArcCloudMessagesClientDefaultAnisetteProviderImpl) + .frbInternalSseEncode(move: null), + serializer, + ); } @protected void - sse_encode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerSender( - Sender self, SseSerializer serializer) { + sse_encode_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcFTClient( + ArcFtClient self, + SseSerializer serializer, + ) { // Codec=Sse (Serialization based), see doc to use other codecs sse_encode_usize( - (self as SenderImpl).frbInternalSseEncode(move: true), serializer); + (self as ArcFtClientImpl).frbInternalSseEncode(move: null), + serializer, + ); } @protected void - sse_encode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerStCollapsedValue( - StCollapsedValue self, SseSerializer serializer) { + sse_encode_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcFindMyClientDefaultAnisetteProvider( + ArcFindMyClientDefaultAnisetteProvider self, + SseSerializer serializer, + ) { // Codec=Sse (Serialization based), see doc to use other codecs sse_encode_usize( - (self as StCollapsedValueImpl).frbInternalSseEncode(move: true), - serializer); + (self as ArcFindMyClientDefaultAnisetteProviderImpl).frbInternalSseEncode( + move: null, + ), + serializer, + ); } @protected void - sse_encode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerSyncManagerDefaultAnisetteProviderMyFilePackager( - SyncManagerDefaultAnisetteProviderMyFilePackager self, - SseSerializer serializer) { + sse_encode_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcIMClient( + ArcImClient self, + SseSerializer serializer, + ) { // Codec=Sse (Serialization based), see doc to use other codecs sse_encode_usize( - (self as SyncManagerDefaultAnisetteProviderMyFilePackagerImpl) - .frbInternalSseEncode(move: true), - serializer); + (self as ArcImClientImpl).frbInternalSseEncode(move: null), + serializer, + ); } @protected void - sse_encode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerSystemTime( - SystemTime self, SseSerializer serializer) { + sse_encode_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcIdmsAuthListener( + ArcIdmsAuthListener self, + SseSerializer serializer, + ) { // Codec=Sse (Serialization based), see doc to use other codecs sse_encode_usize( - (self as SystemTimeImpl).frbInternalSseEncode(move: true), serializer); + (self as ArcIdmsAuthListenerImpl).frbInternalSseEncode(move: null), + serializer, + ); } @protected void - sse_encode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerVerifyBody( - VerifyBody self, SseSerializer serializer) { + sse_encode_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcKeychainClientDefaultAnisetteProvider( + ArcKeychainClientDefaultAnisetteProvider self, + SseSerializer serializer, + ) { // Codec=Sse (Serialization based), see doc to use other codecs sse_encode_usize( - (self as VerifyBodyImpl).frbInternalSseEncode(move: true), serializer); + (self as ArcKeychainClientDefaultAnisetteProviderImpl) + .frbInternalSseEncode(move: null), + serializer, + ); } @protected void - sse_encode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerViableBottle( - ViableBottle self, SseSerializer serializer) { + sse_encode_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcMutexAppleAccountDefaultAnisetteProvider( + ArcMutexAppleAccountDefaultAnisetteProvider self, + SseSerializer serializer, + ) { // Codec=Sse (Serialization based), see doc to use other codecs sse_encode_usize( - (self as ViableBottleImpl).frbInternalSseEncode(move: true), - serializer); + (self as ArcMutexAppleAccountDefaultAnisetteProviderImpl) + .frbInternalSseEncode(move: null), + serializer, + ); } @protected void - sse_encode_Auto_RefMut_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerAPSWatcher( - ApsWatcher self, SseSerializer serializer) { + sse_encode_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcMutexOptionCircleClientSessionDefaultAnisetteProvider( + ArcMutexOptionCircleClientSessionDefaultAnisetteProvider self, + SseSerializer serializer, + ) { // Codec=Sse (Serialization based), see doc to use other codecs sse_encode_usize( - (self as ApsWatcherImpl).frbInternalSseEncode(move: false), serializer); + (self as ArcMutexOptionCircleClientSessionDefaultAnisetteProviderImpl) + .frbInternalSseEncode(move: null), + serializer, + ); } @protected void - sse_encode_Auto_RefMut_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerCircleClientSessionDefaultAnisetteProvider( - CircleClientSessionDefaultAnisetteProvider self, - SseSerializer serializer) { + sse_encode_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcMutexVecActiveCircleSession( + ArcMutexVecActiveCircleSession self, + SseSerializer serializer, + ) { // Codec=Sse (Serialization based), see doc to use other codecs sse_encode_usize( - (self as CircleClientSessionDefaultAnisetteProviderImpl) - .frbInternalSseEncode(move: false), - serializer); + (self as ArcMutexVecActiveCircleSessionImpl).frbInternalSseEncode( + move: null, + ), + serializer, + ); } @protected void - sse_encode_Auto_RefMut_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerFindMyFriendsClientDefaultAnisetteProvider( - FindMyFriendsClientDefaultAnisetteProvider self, - SseSerializer serializer) { + sse_encode_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcPasswordManagerDefaultAnisetteProvider( + ArcPasswordManagerDefaultAnisetteProvider self, + SseSerializer serializer, + ) { // Codec=Sse (Serialization based), see doc to use other codecs sse_encode_usize( - (self as FindMyFriendsClientDefaultAnisetteProviderImpl) - .frbInternalSseEncode(move: false), - serializer); + (self as ArcPasswordManagerDefaultAnisetteProviderImpl) + .frbInternalSseEncode(move: null), + serializer, + ); } @protected void - sse_encode_Auto_RefMut_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerFindMyPhoneClientDefaultAnisetteProvider( - FindMyPhoneClientDefaultAnisetteProvider self, - SseSerializer serializer) { + sse_encode_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcProfilesClientDefaultAnisetteProvider( + ArcProfilesClientDefaultAnisetteProvider self, + SseSerializer serializer, + ) { // Codec=Sse (Serialization based), see doc to use other codecs sse_encode_usize( - (self as FindMyPhoneClientDefaultAnisetteProviderImpl) - .frbInternalSseEncode(move: false), - serializer); + (self as ArcProfilesClientDefaultAnisetteProviderImpl) + .frbInternalSseEncode(move: null), + serializer, + ); } @protected void - sse_encode_Auto_RefMut_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerLocationReport( - LocationReport self, SseSerializer serializer) { + sse_encode_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcSenderPushMessage( + ArcSenderPushMessage self, + SseSerializer serializer, + ) { // Codec=Sse (Serialization based), see doc to use other codecs sse_encode_usize( - (self as LocationReportImpl).frbInternalSseEncode(move: false), - serializer); + (self as ArcSenderPushMessageImpl).frbInternalSseEncode(move: null), + serializer, + ); } @protected void - sse_encode_Auto_RefMut_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerReceiverAPSMessage( - ReceiverApsMessage self, SseSerializer serializer) { + sse_encode_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcSharedPushState( + ArcSharedPushState self, + SseSerializer serializer, + ) { // Codec=Sse (Serialization based), see doc to use other codecs sse_encode_usize( - (self as ReceiverApsMessageImpl).frbInternalSseEncode(move: false), - serializer); + (self as ArcSharedPushStateImpl).frbInternalSseEncode(move: null), + serializer, + ); } @protected void - sse_encode_Auto_RefMut_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerSavedHardwareState( - SavedHardwareState self, SseSerializer serializer) { + sse_encode_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcStatusKitClientDefaultAnisetteProvider( + ArcStatusKitClientDefaultAnisetteProvider self, + SseSerializer serializer, + ) { // Codec=Sse (Serialization based), see doc to use other codecs sse_encode_usize( - (self as SavedHardwareStateImpl).frbInternalSseEncode(move: false), - serializer); + (self as ArcStatusKitClientDefaultAnisetteProviderImpl) + .frbInternalSseEncode(move: null), + serializer, + ); } @protected void - sse_encode_Auto_RefMut_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerViableBottle( - ViableBottle self, SseSerializer serializer) { + sse_encode_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcTokenProviderDefaultAnisetteProvider( + ArcTokenProviderDefaultAnisetteProvider self, + SseSerializer serializer, + ) { // Codec=Sse (Serialization based), see doc to use other codecs sse_encode_usize( - (self as ViableBottleImpl).frbInternalSseEncode(move: false), - serializer); + (self as ArcTokenProviderDefaultAnisetteProviderImpl) + .frbInternalSseEncode(move: null), + serializer, + ); } @protected void - sse_encode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerAPSConnection( - ApsConnection self, SseSerializer serializer) { + sse_encode_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerAsset( + Asset self, + SseSerializer serializer, + ) { // Codec=Sse (Serialization based), see doc to use other codecs sse_encode_usize( - (self as ApsConnectionImpl).frbInternalSseEncode(move: false), - serializer); + (self as AssetImpl).frbInternalSseEncode(move: null), + serializer, + ); } @protected void - sse_encode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcAnisetteClientDefaultAnisetteProvider( - ArcAnisetteClientDefaultAnisetteProvider self, - SseSerializer serializer) { + sse_encode_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerChannelInterestToken( + ChannelInterestToken self, + SseSerializer serializer, + ) { // Codec=Sse (Serialization based), see doc to use other codecs sse_encode_usize( - (self as ArcAnisetteClientDefaultAnisetteProviderImpl) - .frbInternalSseEncode(move: false), - serializer); + (self as ChannelInterestTokenImpl).frbInternalSseEncode(move: null), + serializer, + ); } @protected void - sse_encode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcCloudKitClientDefaultAnisetteProvider( - ArcCloudKitClientDefaultAnisetteProvider self, - SseSerializer serializer) { + sse_encode_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerCircleClientSessionDefaultAnisetteProvider( + CircleClientSessionDefaultAnisetteProvider self, + SseSerializer serializer, + ) { // Codec=Sse (Serialization based), see doc to use other codecs sse_encode_usize( - (self as ArcCloudKitClientDefaultAnisetteProviderImpl) - .frbInternalSseEncode(move: false), - serializer); + (self as CircleClientSessionDefaultAnisetteProviderImpl) + .frbInternalSseEncode(move: null), + serializer, + ); } @protected void - sse_encode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcCloudMessagesClientDefaultAnisetteProvider( - ArcCloudMessagesClientDefaultAnisetteProvider self, - SseSerializer serializer) { + sse_encode_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerCloudSyncPreparedMessageCreateHandle( + CloudSyncPreparedMessageCreateHandle self, + SseSerializer serializer, + ) { // Codec=Sse (Serialization based), see doc to use other codecs sse_encode_usize( - (self as ArcCloudMessagesClientDefaultAnisetteProviderImpl) - .frbInternalSseEncode(move: false), - serializer); + (self as CloudSyncPreparedMessageCreateHandleImpl).frbInternalSseEncode( + move: null, + ), + serializer, + ); } @protected void - sse_encode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcFTClient( - ArcFtClient self, SseSerializer serializer) { + sse_encode_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerConversationLink( + ConversationLink self, + SseSerializer serializer, + ) { // Codec=Sse (Serialization based), see doc to use other codecs sse_encode_usize( - (self as ArcFtClientImpl).frbInternalSseEncode(move: false), - serializer); + (self as ConversationLinkImpl).frbInternalSseEncode(move: null), + serializer, + ); } @protected void - sse_encode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcFindMyClientDefaultAnisetteProvider( - ArcFindMyClientDefaultAnisetteProvider self, - SseSerializer serializer) { + sse_encode_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerConversationParticipant( + ConversationParticipant self, + SseSerializer serializer, + ) { // Codec=Sse (Serialization based), see doc to use other codecs sse_encode_usize( - (self as ArcFindMyClientDefaultAnisetteProviderImpl) - .frbInternalSseEncode(move: false), - serializer); + (self as ConversationParticipantImpl).frbInternalSseEncode(move: null), + serializer, + ); } @protected void - sse_encode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcIMClient( - ArcImClient self, SseSerializer serializer) { + sse_encode_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerDate( + Date self, + SseSerializer serializer, + ) { // Codec=Sse (Serialization based), see doc to use other codecs sse_encode_usize( - (self as ArcImClientImpl).frbInternalSseEncode(move: false), - serializer); + (self as DateImpl).frbInternalSseEncode(move: null), + serializer, + ); } @protected void - sse_encode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcIdmsAuthListener( - ArcIdmsAuthListener self, SseSerializer serializer) { + sse_encode_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerEscrowData( + EscrowData self, + SseSerializer serializer, + ) { // Codec=Sse (Serialization based), see doc to use other codecs sse_encode_usize( - (self as ArcIdmsAuthListenerImpl).frbInternalSseEncode(move: false), - serializer); + (self as EscrowDataImpl).frbInternalSseEncode(move: null), + serializer, + ); } @protected void - sse_encode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcKeychainClientDefaultAnisetteProvider( - ArcKeychainClientDefaultAnisetteProvider self, - SseSerializer serializer) { + sse_encode_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerFindMyFriendsClientDefaultAnisetteProvider( + FindMyFriendsClientDefaultAnisetteProvider self, + SseSerializer serializer, + ) { // Codec=Sse (Serialization based), see doc to use other codecs sse_encode_usize( - (self as ArcKeychainClientDefaultAnisetteProviderImpl) - .frbInternalSseEncode(move: false), - serializer); + (self as FindMyFriendsClientDefaultAnisetteProviderImpl) + .frbInternalSseEncode(move: null), + serializer, + ); } @protected void - sse_encode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcMutexAppleAccountDefaultAnisetteProvider( - ArcMutexAppleAccountDefaultAnisetteProvider self, - SseSerializer serializer) { + sse_encode_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerFindMyPhoneClientDefaultAnisetteProvider( + FindMyPhoneClientDefaultAnisetteProvider self, + SseSerializer serializer, + ) { // Codec=Sse (Serialization based), see doc to use other codecs sse_encode_usize( - (self as ArcMutexAppleAccountDefaultAnisetteProviderImpl) - .frbInternalSseEncode(move: false), - serializer); + (self as FindMyPhoneClientDefaultAnisetteProviderImpl) + .frbInternalSseEncode(move: null), + serializer, + ); } @protected void - sse_encode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcMutexOptionCircleClientSessionDefaultAnisetteProvider( - ArcMutexOptionCircleClientSessionDefaultAnisetteProvider self, - SseSerializer serializer) { + sse_encode_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerGZipWrapperAttachmentMeta( + GZipWrapperAttachmentMeta self, + SseSerializer serializer, + ) { // Codec=Sse (Serialization based), see doc to use other codecs sse_encode_usize( - (self as ArcMutexOptionCircleClientSessionDefaultAnisetteProviderImpl) - .frbInternalSseEncode(move: false), - serializer); + (self as GZipWrapperAttachmentMetaImpl).frbInternalSseEncode(move: null), + serializer, + ); } @protected void - sse_encode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcMutexVecActiveCircleSession( - ArcMutexVecActiveCircleSession self, SseSerializer serializer) { + sse_encode_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerGZipWrapperChatProto( + GZipWrapperChatProto self, + SseSerializer serializer, + ) { // Codec=Sse (Serialization based), see doc to use other codecs sse_encode_usize( - (self as ArcMutexVecActiveCircleSessionImpl) - .frbInternalSseEncode(move: false), - serializer); + (self as GZipWrapperChatProtoImpl).frbInternalSseEncode(move: null), + serializer, + ); } @protected void - sse_encode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcPasswordManagerDefaultAnisetteProvider( - ArcPasswordManagerDefaultAnisetteProvider self, - SseSerializer serializer) { + sse_encode_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerGZipWrapperMessageProto( + GZipWrapperMessageProto self, + SseSerializer serializer, + ) { // Codec=Sse (Serialization based), see doc to use other codecs sse_encode_usize( - (self as ArcPasswordManagerDefaultAnisetteProviderImpl) - .frbInternalSseEncode(move: false), - serializer); + (self as GZipWrapperMessageProtoImpl).frbInternalSseEncode(move: null), + serializer, + ); } @protected void - sse_encode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcProfilesClientDefaultAnisetteProvider( - ArcProfilesClientDefaultAnisetteProvider self, - SseSerializer serializer) { + sse_encode_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerGZipWrapperMessageProto2( + GZipWrapperMessageProto2 self, + SseSerializer serializer, + ) { // Codec=Sse (Serialization based), see doc to use other codecs sse_encode_usize( - (self as ArcProfilesClientDefaultAnisetteProviderImpl) - .frbInternalSseEncode(move: false), - serializer); + (self as GZipWrapperMessageProto2Impl).frbInternalSseEncode(move: null), + serializer, + ); } @protected void - sse_encode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcSenderPushMessage( - ArcSenderPushMessage self, SseSerializer serializer) { + sse_encode_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerGZipWrapperMessageProto3( + GZipWrapperMessageProto3 self, + SseSerializer serializer, + ) { // Codec=Sse (Serialization based), see doc to use other codecs sse_encode_usize( - (self as ArcSenderPushMessageImpl).frbInternalSseEncode(move: false), - serializer); + (self as GZipWrapperMessageProto3Impl).frbInternalSseEncode(move: null), + serializer, + ); } @protected void - sse_encode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcSharedPushState( - ArcSharedPushState self, SseSerializer serializer) { + sse_encode_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerGZipWrapperMessageProto4( + GZipWrapperMessageProto4 self, + SseSerializer serializer, + ) { // Codec=Sse (Serialization based), see doc to use other codecs sse_encode_usize( - (self as ArcSharedPushStateImpl).frbInternalSseEncode(move: false), - serializer); + (self as GZipWrapperMessageProto4Impl).frbInternalSseEncode(move: null), + serializer, + ); } @protected void - sse_encode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcStatusKitClientDefaultAnisetteProvider( - ArcStatusKitClientDefaultAnisetteProvider self, - SseSerializer serializer) { + sse_encode_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerIDSNGMIdentity( + IdsngmIdentity self, + SseSerializer serializer, + ) { // Codec=Sse (Serialization based), see doc to use other codecs sse_encode_usize( - (self as ArcStatusKitClientDefaultAnisetteProviderImpl) - .frbInternalSseEncode(move: false), - serializer); + (self as IdsngmIdentityImpl).frbInternalSseEncode(move: null), + serializer, + ); } @protected void - sse_encode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcTokenProviderDefaultAnisetteProvider( - ArcTokenProviderDefaultAnisetteProvider self, - SseSerializer serializer) { + sse_encode_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerIDSUser( + IdsUser self, + SseSerializer serializer, + ) { // Codec=Sse (Serialization based), see doc to use other codecs sse_encode_usize( - (self as ArcTokenProviderDefaultAnisetteProviderImpl) - .frbInternalSseEncode(move: false), - serializer); + (self as IdsUserImpl).frbInternalSseEncode(move: null), + serializer, + ); } @protected void - sse_encode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerDate( - Date self, SseSerializer serializer) { + sse_encode_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerJoinedOSConfig( + JoinedOsConfig self, + SseSerializer serializer, + ) { // Codec=Sse (Serialization based), see doc to use other codecs sse_encode_usize( - (self as DateImpl).frbInternalSseEncode(move: false), serializer); + (self as JoinedOsConfigImpl).frbInternalSseEncode(move: null), + serializer, + ); } @protected void - sse_encode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerEscrowData( - EscrowData self, SseSerializer serializer) { + sse_encode_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerLocationReport( + LocationReport self, + SseSerializer serializer, + ) { // Codec=Sse (Serialization based), see doc to use other codecs sse_encode_usize( - (self as EscrowDataImpl).frbInternalSseEncode(move: false), serializer); + (self as LocationReportImpl).frbInternalSseEncode(move: null), + serializer, + ); } @protected void - sse_encode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerGZipWrapperAttachmentMeta( - GZipWrapperAttachmentMeta self, SseSerializer serializer) { + sse_encode_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerMessageFlags( + MessageFlags self, + SseSerializer serializer, + ) { // Codec=Sse (Serialization based), see doc to use other codecs sse_encode_usize( - (self as GZipWrapperAttachmentMetaImpl) - .frbInternalSseEncode(move: false), - serializer); + (self as MessageFlagsImpl).frbInternalSseEncode(move: null), + serializer, + ); } @protected void - sse_encode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerGZipWrapperChatProto( - GZipWrapperChatProto self, SseSerializer serializer) { + sse_encode_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerNSArrayLPIconMetadata( + NsArrayLpIconMetadata self, + SseSerializer serializer, + ) { // Codec=Sse (Serialization based), see doc to use other codecs sse_encode_usize( - (self as GZipWrapperChatProtoImpl).frbInternalSseEncode(move: false), - serializer); + (self as NsArrayLpIconMetadataImpl).frbInternalSseEncode(move: null), + serializer, + ); } @protected void - sse_encode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerGZipWrapperMessageProto( - GZipWrapperMessageProto self, SseSerializer serializer) { + sse_encode_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerNSArrayLPImageMetadata( + NsArrayLpImageMetadata self, + SseSerializer serializer, + ) { // Codec=Sse (Serialization based), see doc to use other codecs sse_encode_usize( - (self as GZipWrapperMessageProtoImpl).frbInternalSseEncode(move: false), - serializer); + (self as NsArrayLpImageMetadataImpl).frbInternalSseEncode(move: null), + serializer, + ); } @protected void - sse_encode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerGZipWrapperMessageProto2( - GZipWrapperMessageProto2 self, SseSerializer serializer) { + sse_encode_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerPushError( + PushError self, + SseSerializer serializer, + ) { // Codec=Sse (Serialization based), see doc to use other codecs sse_encode_usize( - (self as GZipWrapperMessageProto2Impl) - .frbInternalSseEncode(move: false), - serializer); + (self as PushErrorImpl).frbInternalSseEncode(move: null), + serializer, + ); } @protected void - sse_encode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerGZipWrapperMessageProto3( - GZipWrapperMessageProto3 self, SseSerializer serializer) { + sse_encode_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerReceiverAPSMessage( + ReceiverApsMessage self, + SseSerializer serializer, + ) { // Codec=Sse (Serialization based), see doc to use other codecs sse_encode_usize( - (self as GZipWrapperMessageProto3Impl) - .frbInternalSseEncode(move: false), - serializer); + (self as ReceiverApsMessageImpl).frbInternalSseEncode(move: null), + serializer, + ); } @protected void - sse_encode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerGZipWrapperMessageProto4( - GZipWrapperMessageProto4 self, SseSerializer serializer) { + sse_encode_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerSavedHardwareState( + SavedHardwareState self, + SseSerializer serializer, + ) { // Codec=Sse (Serialization based), see doc to use other codecs sse_encode_usize( - (self as GZipWrapperMessageProto4Impl) - .frbInternalSseEncode(move: false), - serializer); + (self as SavedHardwareStateImpl).frbInternalSseEncode(move: null), + serializer, + ); } @protected void - sse_encode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerIDSNGMIdentity( - IdsngmIdentity self, SseSerializer serializer) { + sse_encode_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerSender( + Sender self, + SseSerializer serializer, + ) { // Codec=Sse (Serialization based), see doc to use other codecs sse_encode_usize( - (self as IdsngmIdentityImpl).frbInternalSseEncode(move: false), - serializer); + (self as SenderImpl).frbInternalSseEncode(move: null), + serializer, + ); } @protected void - sse_encode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerIDSUser( - IdsUser self, SseSerializer serializer) { + sse_encode_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerStCollapsedValue( + StCollapsedValue self, + SseSerializer serializer, + ) { // Codec=Sse (Serialization based), see doc to use other codecs sse_encode_usize( - (self as IdsUserImpl).frbInternalSseEncode(move: false), serializer); + (self as StCollapsedValueImpl).frbInternalSseEncode(move: null), + serializer, + ); } @protected void - sse_encode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerJoinedOSConfig( - JoinedOsConfig self, SseSerializer serializer) { + sse_encode_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerSyncManagerDefaultAnisetteProviderMyFilePackager( + SyncManagerDefaultAnisetteProviderMyFilePackager self, + SseSerializer serializer, + ) { // Codec=Sse (Serialization based), see doc to use other codecs sse_encode_usize( - (self as JoinedOsConfigImpl).frbInternalSseEncode(move: false), - serializer); + (self as SyncManagerDefaultAnisetteProviderMyFilePackagerImpl) + .frbInternalSseEncode(move: null), + serializer, + ); } @protected void - sse_encode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerLocationReport( - LocationReport self, SseSerializer serializer) { + sse_encode_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerSystemTime( + SystemTime self, + SseSerializer serializer, + ) { // Codec=Sse (Serialization based), see doc to use other codecs sse_encode_usize( - (self as LocationReportImpl).frbInternalSseEncode(move: false), - serializer); + (self as SystemTimeImpl).frbInternalSseEncode(move: null), + serializer, + ); } @protected void - sse_encode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerMessageFlags( - MessageFlags self, SseSerializer serializer) { + sse_encode_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerVerifyBody( + VerifyBody self, + SseSerializer serializer, + ) { // Codec=Sse (Serialization based), see doc to use other codecs sse_encode_usize( - (self as MessageFlagsImpl).frbInternalSseEncode(move: false), - serializer); + (self as VerifyBodyImpl).frbInternalSseEncode(move: null), + serializer, + ); } @protected void - sse_encode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerSavedHardwareState( - SavedHardwareState self, SseSerializer serializer) { + sse_encode_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerViableBottle( + ViableBottle self, + SseSerializer serializer, + ) { // Codec=Sse (Serialization based), see doc to use other codecs sse_encode_usize( - (self as SavedHardwareStateImpl).frbInternalSseEncode(move: false), - serializer); + (self as ViableBottleImpl).frbInternalSseEncode(move: null), + serializer, + ); } @protected - void - sse_encode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerSender( - Sender self, SseSerializer serializer) { + void sse_encode_Set_ft_member(Set self, SseSerializer serializer) { // Codec=Sse (Serialization based), see doc to use other codecs - sse_encode_usize( - (self as SenderImpl).frbInternalSseEncode(move: false), serializer); + sse_encode_list_ft_member(self.toList(), serializer); } @protected - void - sse_encode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerStCollapsedValue( - StCollapsedValue self, SseSerializer serializer) { + void sse_encode_StreamSink_mmcs_transfer_progress_Sse( + RustStreamSink self, + SseSerializer serializer, + ) { // Codec=Sse (Serialization based), see doc to use other codecs - sse_encode_usize( - (self as StCollapsedValueImpl).frbInternalSseEncode(move: false), - serializer); + sse_encode_String( + self.setupAndSerialize( + codec: SseCodec( + decodeSuccessData: sse_decode_mmcs_transfer_progress, + decodeErrorData: sse_decode_AnyhowException, + ), + ), + serializer, + ); } @protected - void - sse_encode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerSyncManagerDefaultAnisetteProviderMyFilePackager( - SyncManagerDefaultAnisetteProviderMyFilePackager self, - SseSerializer serializer) { + void sse_encode_StreamSink_transfer_progress_Sse( + RustStreamSink self, + SseSerializer serializer, + ) { // Codec=Sse (Serialization based), see doc to use other codecs - sse_encode_usize( - (self as SyncManagerDefaultAnisetteProviderMyFilePackagerImpl) - .frbInternalSseEncode(move: false), - serializer); + sse_encode_String( + self.setupAndSerialize( + codec: SseCodec( + decodeSuccessData: sse_decode_transfer_progress, + decodeErrorData: sse_decode_AnyhowException, + ), + ), + serializer, + ); } @protected - void - sse_encode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerVerifyBody( - VerifyBody self, SseSerializer serializer) { + void sse_encode_String(String self, SseSerializer serializer) { // Codec=Sse (Serialization based), see doc to use other codecs - sse_encode_usize( - (self as VerifyBodyImpl).frbInternalSseEncode(move: false), serializer); + sse_encode_list_prim_u_8_strict(utf8.encoder.convert(self), serializer); } @protected - void - sse_encode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerViableBottle( - ViableBottle self, SseSerializer serializer) { + void sse_encode_address(Address self, SseSerializer serializer) { // Codec=Sse (Serialization based), see doc to use other codecs - sse_encode_usize( - (self as ViableBottleImpl).frbInternalSseEncode(move: false), - serializer); + sse_encode_opt_String(self.administrativeArea, serializer); + sse_encode_String(self.country, serializer); + sse_encode_String(self.countryCode, serializer); + sse_encode_opt_list_String(self.formattedAddressLines, serializer); + sse_encode_opt_String(self.locality, serializer); + sse_encode_opt_String(self.stateCode, serializer); + sse_encode_opt_String(self.streetAddress, serializer); + sse_encode_opt_String(self.streetName, serializer); } @protected - void sse_encode_CastedPrimitive_i_64(int self, SseSerializer serializer) { + void sse_encode_ak_data(AkData self, SseSerializer serializer) { // Codec=Sse (Serialization based), see doc to use other codecs - sse_encode_i_64(sseEncodeCastedPrimitiveI64(self), serializer); + sse_encode_f_32(self.lat, serializer); + sse_encode_f_32(self.lng, serializer); } @protected - void sse_encode_CastedPrimitive_u_64(int self, SseSerializer serializer) { + void sse_encode_aps_alert(ApsAlert self, SseSerializer serializer) { // Codec=Sse (Serialization based), see doc to use other codecs - sse_encode_u_64(sseEncodeCastedPrimitiveU64(self), serializer); + sse_encode_String(self.title, serializer); + sse_encode_String(self.body, serializer); + sse_encode_String(self.sbdy, serializer); + sse_encode_String(self.defbtn, serializer); + sse_encode_String(self.albtn, serializer); } @protected - void sse_encode_CastedPrimitive_usize(int self, SseSerializer serializer) { + void sse_encode_aps_connection_status( + ApsConnectionStatus self, + SseSerializer serializer, + ) { // Codec=Sse (Serialization based), see doc to use other codecs - sse_encode_usize(sseEncodeCastedPrimitiveU64(self), serializer); + sse_encode_String(self.state, serializer); + sse_encode_opt_box_autoadd_u_16(self.activePort, serializer); + sse_encode_opt_String(self.error, serializer); + sse_encode_opt_box_autoadd_u_64(self.retryWaitSeconds, serializer); } @protected - void sse_encode_DartFn_Inputs_String_Output_String_AnyhowException( - FutureOr Function(String) self, SseSerializer serializer) { + void sse_encode_aps_data(ApsData self, SseSerializer serializer) { // Codec=Sse (Serialization based), see doc to use other codecs - sse_encode_DartOpaque( - encode_DartFn_Inputs_String_Output_String_AnyhowException(self), - serializer); + sse_encode_aps_alert(self.alert, serializer); } @protected - void sse_encode_DartOpaque(Object self, SseSerializer serializer) { + void sse_encode_attachment(Attachment self, SseSerializer serializer) { // Codec=Sse (Serialization based), see doc to use other codecs - sse_encode_usize( - BigInt.from(PlatformPointerUtil.ptrToInt(encodeDartOpaque( - self, portManager.dartHandlerPort, generalizedFrbRustBinding))) - .toUnsigned(64), - serializer); + sse_encode_attachment_type(self.aType, serializer); + sse_encode_CastedPrimitive_u_64(self.part_, serializer); + sse_encode_String(self.utiType, serializer); + sse_encode_String(self.mime, serializer); + sse_encode_String(self.name, serializer); + sse_encode_bool(self.iris, serializer); } @protected - void - sse_encode_Map_String_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerAsset( - Map self, SseSerializer serializer) { + void sse_encode_attachment_meta( + AttachmentMeta self, + SseSerializer serializer, + ) { // Codec=Sse (Serialization based), see doc to use other codecs - sse_encode_list_record_string_auto_owned_rust_opaque_flutter_rust_bridgefor_generated_rust_auto_opaque_inner_asset( - self.entries.map((e) => (e.key, e.value)).toList(), serializer); + sse_encode_opt_String(self.mimeType, serializer); + sse_encode_CastedPrimitive_i_64(self.startDate, serializer); + sse_encode_CastedPrimitive_i_64(self.totalBytes, serializer); + sse_encode_i_32(self.transferState, serializer); + sse_encode_bool(self.isSticker, serializer); + sse_encode_String(self.guid, serializer); + sse_encode_bool(self.hideAttachment, serializer); + sse_encode_opt_box_autoadd_mmcs_attachment_meta(self.userInfo, serializer); + sse_encode_opt_String(self.filename, serializer); + sse_encode_opt_box_autoadd_attachment_meta_extra(self.extras, serializer); + sse_encode_bool(self.isOutgoing, serializer); + sse_encode_opt_String(self.transferName, serializer); + sse_encode_i_32(self.version, serializer); + sse_encode_opt_String(self.uti, serializer); + sse_encode_CastedPrimitive_i_64(self.createdDate, serializer); + sse_encode_opt_String(self.pathc, serializer); + sse_encode_opt_String(self.md5, serializer); } @protected - void - sse_encode_Map_String_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerStCollapsedValue( - Map self, SseSerializer serializer) { + void sse_encode_attachment_meta_extra( + AttachmentMetaExtra self, + SseSerializer serializer, + ) { // Codec=Sse (Serialization based), see doc to use other codecs - sse_encode_list_record_string_auto_owned_rust_opaque_flutter_rust_bridgefor_generated_rust_auto_opaque_inner_st_collapsed_value( - self.entries.map((e) => (e.key, e.value)).toList(), serializer); + sse_encode_opt_box_autoadd_num_or_string( + self.previewGenerationState, + serializer, + ); } @protected - void sse_encode_Map_String_CastedPrimitive_u_64( - Map self, SseSerializer serializer) { + void sse_encode_attachment_type( + AttachmentType self, + SseSerializer serializer, + ) { // Codec=Sse (Serialization based), see doc to use other codecs - sse_encode_list_record_string_casted_primitive_u_64( - self.entries.map((e) => (e.key, e.value)).toList(), serializer); + switch (self) { + case AttachmentType_Inline(field0: final field0): + sse_encode_i_32(0, serializer); + sse_encode_list_prim_u_8_strict(field0, serializer); + case AttachmentType_MMCS(field0: final field0): + sse_encode_i_32(1, serializer); + sse_encode_box_autoadd_mmcs_file(field0, serializer); + default: + throw UnimplementedError(''); + } } @protected - void sse_encode_Map_String_String( - Map self, SseSerializer serializer) { + void sse_encode_balloon(Balloon self, SseSerializer serializer) { // Codec=Sse (Serialization based), see doc to use other codecs - sse_encode_list_record_string_string( - self.entries.map((e) => (e.key, e.value)).toList(), serializer); + sse_encode_String(self.url, serializer); + sse_encode_opt_String(self.session, serializer); + sse_encode_opt_box_autoadd_balloon_layout(self.layout, serializer); + sse_encode_opt_String(self.ldText, serializer); + sse_encode_bool(self.isLive, serializer); + sse_encode_opt_list_prim_u_8_strict(self.icon, serializer); } @protected - void sse_encode_Map_String_bool( - Map self, SseSerializer serializer) { + void sse_encode_balloon_layout(BalloonLayout self, SseSerializer serializer) { // Codec=Sse (Serialization based), see doc to use other codecs - sse_encode_list_record_string_bool( - self.entries.map((e) => (e.key, e.value)).toList(), serializer); + switch (self) { + case BalloonLayout_TemplateLayout( + imageSubtitle: final imageSubtitle, + imageTitle: final imageTitle, + caption: final caption, + secondarySubcaption: final secondarySubcaption, + tertiarySubcaption: final tertiarySubcaption, + subcaption: final subcaption, + class_: final class_, + ): + sse_encode_i_32(0, serializer); + sse_encode_String(imageSubtitle, serializer); + sse_encode_String(imageTitle, serializer); + sse_encode_String(caption, serializer); + sse_encode_String(secondarySubcaption, serializer); + sse_encode_String(tertiarySubcaption, serializer); + sse_encode_String(subcaption, serializer); + sse_encode_ns_dictionary_class(class_, serializer); + default: + throw UnimplementedError(''); + } } @protected - void sse_encode_Map_String_cloud_attachment( - Map self, SseSerializer serializer) { + void sse_encode_beacon_attributes( + BeaconAttributes self, + SseSerializer serializer, + ) { // Codec=Sse (Serialization based), see doc to use other codecs - sse_encode_list_record_string_cloud_attachment( - self.entries.map((e) => (e.key, e.value)).toList(), serializer); + sse_encode_String(self.name, serializer); + sse_encode_i_64(self.roleId, serializer); + sse_encode_String(self.emoji, serializer); + sse_encode_String(self.systemVersion, serializer); + sse_encode_String(self.serialNumber, serializer); } @protected - void sse_encode_Map_String_cloud_chat( - Map self, SseSerializer serializer) { + void sse_encode_beacon_naming_record( + BeaconNamingRecord self, + SseSerializer serializer, + ) { // Codec=Sse (Serialization based), see doc to use other codecs - sse_encode_list_record_string_cloud_chat( - self.entries.map((e) => (e.key, e.value)).toList(), serializer); + sse_encode_String(self.emoji, serializer); + sse_encode_String(self.name, serializer); + sse_encode_String(self.associatedBeacon, serializer); + sse_encode_CastedPrimitive_i_64(self.roleId, serializer); } @protected - void sse_encode_Map_String_cloud_message( - Map self, SseSerializer serializer) { + void sse_encode_bool(bool self, SseSerializer serializer) { // Codec=Sse (Serialization based), see doc to use other codecs - sse_encode_list_record_string_cloud_message( - self.entries.map((e) => (e.key, e.value)).toList(), serializer); + serializer.buffer.putUint8(self ? 1 : 0); } @protected - void sse_encode_Map_String_ft_participant( - Map self, SseSerializer serializer) { + void + sse_encode_box_autoadd_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerAPSState( + ApsState self, + SseSerializer serializer, + ) { // Codec=Sse (Serialization based), see doc to use other codecs - sse_encode_list_record_string_ft_participant( - self.entries.map((e) => (e.key, e.value)).toList(), serializer); + sse_encode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerAPSState( + self, + serializer, + ); } @protected - void sse_encode_Map_String_group_summary( - Map self, SseSerializer serializer) { + void + sse_encode_box_autoadd_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcCloudKitClientDefaultAnisetteProvider( + ArcCloudKitClientDefaultAnisetteProvider self, + SseSerializer serializer, + ) { // Codec=Sse (Serialization based), see doc to use other codecs - sse_encode_list_record_string_group_summary( - self.entries.map((e) => (e.key, e.value)).toList(), serializer); + sse_encode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcCloudKitClientDefaultAnisetteProvider( + self, + serializer, + ); } @protected - void sse_encode_Map_String_list_message_edit( - Map> self, SseSerializer serializer) { + void + sse_encode_box_autoadd_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcCloudMessagesClientDefaultAnisetteProvider( + ArcCloudMessagesClientDefaultAnisetteProvider self, + SseSerializer serializer, + ) { // Codec=Sse (Serialization based), see doc to use other codecs - sse_encode_list_record_string_list_message_edit( - self.entries.map((e) => (e.key, e.value)).toList(), serializer); + sse_encode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcCloudMessagesClientDefaultAnisetteProvider( + self, + serializer, + ); } @protected - void sse_encode_Map_String_list_prim_u_8_strict( - Map self, SseSerializer serializer) { + void + sse_encode_box_autoadd_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcFindMyClientDefaultAnisetteProvider( + ArcFindMyClientDefaultAnisetteProvider self, + SseSerializer serializer, + ) { // Codec=Sse (Serialization based), see doc to use other codecs - sse_encode_list_record_string_list_prim_u_8_strict( - self.entries.map((e) => (e.key, e.value)).toList(), serializer); + sse_encode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcFindMyClientDefaultAnisetteProvider( + self, + serializer, + ); } @protected - void sse_encode_Map_String_message_edit_range( - Map self, SseSerializer serializer) { + void + sse_encode_box_autoadd_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcKeychainClientDefaultAnisetteProvider( + ArcKeychainClientDefaultAnisetteProvider self, + SseSerializer serializer, + ) { // Codec=Sse (Serialization based), see doc to use other codecs - sse_encode_list_record_string_message_edit_range( - self.entries.map((e) => (e.key, e.value)).toList(), serializer); + sse_encode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcKeychainClientDefaultAnisetteProvider( + self, + serializer, + ); } @protected - void sse_encode_Map_String_opt_box_autoadd_cloud_attachment( - Map self, SseSerializer serializer) { + void + sse_encode_box_autoadd_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcMutexAppleAccountDefaultAnisetteProvider( + ArcMutexAppleAccountDefaultAnisetteProvider self, + SseSerializer serializer, + ) { // Codec=Sse (Serialization based), see doc to use other codecs - sse_encode_list_record_string_opt_box_autoadd_cloud_attachment( - self.entries.map((e) => (e.key, e.value)).toList(), serializer); + sse_encode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcMutexAppleAccountDefaultAnisetteProvider( + self, + serializer, + ); } @protected - void sse_encode_Map_String_opt_box_autoadd_cloud_chat( - Map self, SseSerializer serializer) { + void + sse_encode_box_autoadd_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcPasswordManagerDefaultAnisetteProvider( + ArcPasswordManagerDefaultAnisetteProvider self, + SseSerializer serializer, + ) { // Codec=Sse (Serialization based), see doc to use other codecs - sse_encode_list_record_string_opt_box_autoadd_cloud_chat( - self.entries.map((e) => (e.key, e.value)).toList(), serializer); + sse_encode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcPasswordManagerDefaultAnisetteProvider( + self, + serializer, + ); } @protected - void sse_encode_Map_String_opt_box_autoadd_cloud_message( - Map self, SseSerializer serializer) { + void + sse_encode_box_autoadd_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerAsset( + Asset self, + SseSerializer serializer, + ) { // Codec=Sse (Serialization based), see doc to use other codecs - sse_encode_list_record_string_opt_box_autoadd_cloud_message( - self.entries.map((e) => (e.key, e.value)).toList(), serializer); + sse_encode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerAsset( + self, + serializer, + ); } @protected - void sse_encode_Map_String_password_manager_meta_data_ctx( - Map self, SseSerializer serializer) { + void + sse_encode_box_autoadd_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerChannelInterestToken( + ChannelInterestToken self, + SseSerializer serializer, + ) { // Codec=Sse (Serialization based), see doc to use other codecs - sse_encode_list_record_string_password_manager_meta_data_ctx( - self.entries.map((e) => (e.key, e.value)).toList(), serializer); + sse_encode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerChannelInterestToken( + self, + serializer, + ); } @protected - void sse_encode_Map_String_record_opt_string_passkey( - Map self, SseSerializer serializer) { + void + sse_encode_box_autoadd_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerCircleClientSessionDefaultAnisetteProvider( + CircleClientSessionDefaultAnisetteProvider self, + SseSerializer serializer, + ) { // Codec=Sse (Serialization based), see doc to use other codecs - sse_encode_list_record_string_record_opt_string_passkey( - self.entries.map((e) => (e.key, e.value)).toList(), serializer); + sse_encode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerCircleClientSessionDefaultAnisetteProvider( + self, + serializer, + ); } @protected - void sse_encode_Map_String_record_opt_string_password_manager_meta( - Map self, - SseSerializer serializer) { - // Codec=Sse (Serialization based), see doc to use other codecs - sse_encode_list_record_string_record_opt_string_password_manager_meta( - self.entries.map((e) => (e.key, e.value)).toList(), serializer); + void + sse_encode_box_autoadd_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerCloudSyncPreparedMessageCreateHandle( + CloudSyncPreparedMessageCreateHandle self, + SseSerializer serializer, + ) { + // Codec=Sse (Serialization based), see doc to use other codecs + sse_encode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerCloudSyncPreparedMessageCreateHandle( + self, + serializer, + ); } @protected - void sse_encode_Map_String_record_opt_string_password_raw_entry( - Map self, SseSerializer serializer) { + void + sse_encode_box_autoadd_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerConversationLink( + ConversationLink self, + SseSerializer serializer, + ) { // Codec=Sse (Serialization based), see doc to use other codecs - sse_encode_list_record_string_record_opt_string_password_raw_entry( - self.entries.map((e) => (e.key, e.value)).toList(), serializer); + sse_encode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerConversationLink( + self, + serializer, + ); } @protected - void sse_encode_Map_String_record_opt_string_wifi_password( - Map self, SseSerializer serializer) { + void + sse_encode_box_autoadd_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerConversationParticipant( + ConversationParticipant self, + SseSerializer serializer, + ) { // Codec=Sse (Serialization based), see doc to use other codecs - sse_encode_list_record_string_record_opt_string_wifi_password( - self.entries.map((e) => (e.key, e.value)).toList(), serializer); + sse_encode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerConversationParticipant( + self, + serializer, + ); } @protected - void sse_encode_Map_String_share_invite_content_data( - Map self, SseSerializer serializer) { + void + sse_encode_box_autoadd_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerDate( + Date self, + SseSerializer serializer, + ) { // Codec=Sse (Serialization based), see doc to use other codecs - sse_encode_list_record_string_share_invite_content_data( - self.entries.map((e) => (e.key, e.value)).toList(), serializer); + sse_encode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerDate( + self, + serializer, + ); } @protected - void sse_encode_Map_String_status_kit_personal_config( - Map self, SseSerializer serializer) { + void + sse_encode_box_autoadd_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerGZipWrapperChatProto( + GZipWrapperChatProto self, + SseSerializer serializer, + ) { // Codec=Sse (Serialization based), see doc to use other codecs - sse_encode_list_record_string_status_kit_personal_config( - self.entries.map((e) => (e.key, e.value)).toList(), serializer); + sse_encode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerGZipWrapperChatProto( + self, + serializer, + ); } @protected - void sse_encode_Map_String_sync_status( - Map self, SseSerializer serializer) { + void + sse_encode_box_autoadd_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerGZipWrapperMessageProto2( + GZipWrapperMessageProto2 self, + SseSerializer serializer, + ) { // Codec=Sse (Serialization based), see doc to use other codecs - sse_encode_list_record_string_sync_status( - self.entries.map((e) => (e.key, e.value)).toList(), serializer); + sse_encode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerGZipWrapperMessageProto2( + self, + serializer, + ); } @protected void - sse_encode_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerAPSConnection( - ApsConnection self, SseSerializer serializer) { + sse_encode_box_autoadd_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerGZipWrapperMessageProto3( + GZipWrapperMessageProto3 self, + SseSerializer serializer, + ) { // Codec=Sse (Serialization based), see doc to use other codecs - sse_encode_usize( - (self as ApsConnectionImpl).frbInternalSseEncode(move: null), - serializer); + sse_encode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerGZipWrapperMessageProto3( + self, + serializer, + ); } @protected void - sse_encode_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerAPSState( - ApsState self, SseSerializer serializer) { + sse_encode_box_autoadd_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerGZipWrapperMessageProto4( + GZipWrapperMessageProto4 self, + SseSerializer serializer, + ) { // Codec=Sse (Serialization based), see doc to use other codecs - sse_encode_usize( - (self as ApsStateImpl).frbInternalSseEncode(move: null), serializer); + sse_encode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerGZipWrapperMessageProto4( + self, + serializer, + ); } @protected void - sse_encode_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerAPSWatcher( - ApsWatcher self, SseSerializer serializer) { + sse_encode_box_autoadd_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerIDSUser( + IdsUser self, + SseSerializer serializer, + ) { // Codec=Sse (Serialization based), see doc to use other codecs - sse_encode_usize( - (self as ApsWatcherImpl).frbInternalSseEncode(move: null), serializer); + sse_encode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerIDSUser( + self, + serializer, + ); } @protected void - sse_encode_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcAnisetteClientDefaultAnisetteProvider( - ArcAnisetteClientDefaultAnisetteProvider self, - SseSerializer serializer) { + sse_encode_box_autoadd_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerLocationReport( + LocationReport self, + SseSerializer serializer, + ) { // Codec=Sse (Serialization based), see doc to use other codecs - sse_encode_usize( - (self as ArcAnisetteClientDefaultAnisetteProviderImpl) - .frbInternalSseEncode(move: null), - serializer); + sse_encode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerLocationReport( + self, + serializer, + ); } @protected void - sse_encode_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcCloudKitClientDefaultAnisetteProvider( - ArcCloudKitClientDefaultAnisetteProvider self, - SseSerializer serializer) { + sse_encode_box_autoadd_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerNSArrayLPIconMetadata( + NsArrayLpIconMetadata self, + SseSerializer serializer, + ) { // Codec=Sse (Serialization based), see doc to use other codecs - sse_encode_usize( - (self as ArcCloudKitClientDefaultAnisetteProviderImpl) - .frbInternalSseEncode(move: null), - serializer); + sse_encode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerNSArrayLPIconMetadata( + self, + serializer, + ); } @protected void - sse_encode_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcCloudMessagesClientDefaultAnisetteProvider( - ArcCloudMessagesClientDefaultAnisetteProvider self, - SseSerializer serializer) { + sse_encode_box_autoadd_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerNSArrayLPImageMetadata( + NsArrayLpImageMetadata self, + SseSerializer serializer, + ) { // Codec=Sse (Serialization based), see doc to use other codecs - sse_encode_usize( - (self as ArcCloudMessagesClientDefaultAnisetteProviderImpl) - .frbInternalSseEncode(move: null), - serializer); + sse_encode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerNSArrayLPImageMetadata( + self, + serializer, + ); } @protected void - sse_encode_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcFTClient( - ArcFtClient self, SseSerializer serializer) { + sse_encode_box_autoadd_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerPushError( + PushError self, + SseSerializer serializer, + ) { // Codec=Sse (Serialization based), see doc to use other codecs - sse_encode_usize( - (self as ArcFtClientImpl).frbInternalSseEncode(move: null), serializer); + sse_encode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerPushError( + self, + serializer, + ); } @protected void - sse_encode_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcFindMyClientDefaultAnisetteProvider( - ArcFindMyClientDefaultAnisetteProvider self, - SseSerializer serializer) { + sse_encode_box_autoadd_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerSavedHardwareState( + SavedHardwareState self, + SseSerializer serializer, + ) { // Codec=Sse (Serialization based), see doc to use other codecs - sse_encode_usize( - (self as ArcFindMyClientDefaultAnisetteProviderImpl) - .frbInternalSseEncode(move: null), - serializer); + sse_encode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerSavedHardwareState( + self, + serializer, + ); } @protected void - sse_encode_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcIMClient( - ArcImClient self, SseSerializer serializer) { + sse_encode_box_autoadd_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerSyncManagerDefaultAnisetteProviderMyFilePackager( + SyncManagerDefaultAnisetteProviderMyFilePackager self, + SseSerializer serializer, + ) { // Codec=Sse (Serialization based), see doc to use other codecs - sse_encode_usize( - (self as ArcImClientImpl).frbInternalSseEncode(move: null), serializer); + sse_encode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerSyncManagerDefaultAnisetteProviderMyFilePackager( + self, + serializer, + ); } @protected void - sse_encode_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcIdmsAuthListener( - ArcIdmsAuthListener self, SseSerializer serializer) { + sse_encode_box_autoadd_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerSystemTime( + SystemTime self, + SseSerializer serializer, + ) { // Codec=Sse (Serialization based), see doc to use other codecs - sse_encode_usize( - (self as ArcIdmsAuthListenerImpl).frbInternalSseEncode(move: null), - serializer); + sse_encode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerSystemTime( + self, + serializer, + ); } @protected - void - sse_encode_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcKeychainClientDefaultAnisetteProvider( - ArcKeychainClientDefaultAnisetteProvider self, - SseSerializer serializer) { + void sse_encode_box_autoadd_address(Address self, SseSerializer serializer) { // Codec=Sse (Serialization based), see doc to use other codecs - sse_encode_usize( - (self as ArcKeychainClientDefaultAnisetteProviderImpl) - .frbInternalSseEncode(move: null), - serializer); + sse_encode_address(self, serializer); } @protected - void - sse_encode_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcMutexAppleAccountDefaultAnisetteProvider( - ArcMutexAppleAccountDefaultAnisetteProvider self, - SseSerializer serializer) { + void sse_encode_box_autoadd_attachment( + Attachment self, + SseSerializer serializer, + ) { // Codec=Sse (Serialization based), see doc to use other codecs - sse_encode_usize( - (self as ArcMutexAppleAccountDefaultAnisetteProviderImpl) - .frbInternalSseEncode(move: null), - serializer); + sse_encode_attachment(self, serializer); } @protected - void - sse_encode_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcMutexOptionCircleClientSessionDefaultAnisetteProvider( - ArcMutexOptionCircleClientSessionDefaultAnisetteProvider self, - SseSerializer serializer) { + void sse_encode_box_autoadd_attachment_meta( + AttachmentMeta self, + SseSerializer serializer, + ) { // Codec=Sse (Serialization based), see doc to use other codecs - sse_encode_usize( - (self as ArcMutexOptionCircleClientSessionDefaultAnisetteProviderImpl) - .frbInternalSseEncode(move: null), - serializer); + sse_encode_attachment_meta(self, serializer); } @protected - void - sse_encode_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcMutexVecActiveCircleSession( - ArcMutexVecActiveCircleSession self, SseSerializer serializer) { + void sse_encode_box_autoadd_attachment_meta_extra( + AttachmentMetaExtra self, + SseSerializer serializer, + ) { // Codec=Sse (Serialization based), see doc to use other codecs - sse_encode_usize( - (self as ArcMutexVecActiveCircleSessionImpl) - .frbInternalSseEncode(move: null), - serializer); + sse_encode_attachment_meta_extra(self, serializer); } @protected - void - sse_encode_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcPasswordManagerDefaultAnisetteProvider( - ArcPasswordManagerDefaultAnisetteProvider self, - SseSerializer serializer) { + void sse_encode_box_autoadd_balloon(Balloon self, SseSerializer serializer) { // Codec=Sse (Serialization based), see doc to use other codecs - sse_encode_usize( - (self as ArcPasswordManagerDefaultAnisetteProviderImpl) - .frbInternalSseEncode(move: null), - serializer); + sse_encode_balloon(self, serializer); } @protected - void - sse_encode_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcProfilesClientDefaultAnisetteProvider( - ArcProfilesClientDefaultAnisetteProvider self, - SseSerializer serializer) { + void sse_encode_box_autoadd_balloon_layout( + BalloonLayout self, + SseSerializer serializer, + ) { // Codec=Sse (Serialization based), see doc to use other codecs - sse_encode_usize( - (self as ArcProfilesClientDefaultAnisetteProviderImpl) - .frbInternalSseEncode(move: null), - serializer); + sse_encode_balloon_layout(self, serializer); } @protected - void - sse_encode_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcSenderPushMessage( - ArcSenderPushMessage self, SseSerializer serializer) { + void sse_encode_box_autoadd_beacon_attributes( + BeaconAttributes self, + SseSerializer serializer, + ) { // Codec=Sse (Serialization based), see doc to use other codecs - sse_encode_usize( - (self as ArcSenderPushMessageImpl).frbInternalSseEncode(move: null), - serializer); + sse_encode_beacon_attributes(self, serializer); } @protected - void - sse_encode_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcSharedPushState( - ArcSharedPushState self, SseSerializer serializer) { + void sse_encode_box_autoadd_beacon_naming_record( + BeaconNamingRecord self, + SseSerializer serializer, + ) { // Codec=Sse (Serialization based), see doc to use other codecs - sse_encode_usize( - (self as ArcSharedPushStateImpl).frbInternalSseEncode(move: null), - serializer); + sse_encode_beacon_naming_record(self, serializer); } @protected - void - sse_encode_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcStatusKitClientDefaultAnisetteProvider( - ArcStatusKitClientDefaultAnisetteProvider self, - SseSerializer serializer) { + void sse_encode_box_autoadd_bool(bool self, SseSerializer serializer) { // Codec=Sse (Serialization based), see doc to use other codecs - sse_encode_usize( - (self as ArcStatusKitClientDefaultAnisetteProviderImpl) - .frbInternalSseEncode(move: null), - serializer); + sse_encode_bool(self, serializer); } @protected - void - sse_encode_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcTokenProviderDefaultAnisetteProvider( - ArcTokenProviderDefaultAnisetteProvider self, - SseSerializer serializer) { + void sse_encode_box_autoadd_certified_context( + CertifiedContext self, + SseSerializer serializer, + ) { // Codec=Sse (Serialization based), see doc to use other codecs - sse_encode_usize( - (self as ArcTokenProviderDefaultAnisetteProviderImpl) - .frbInternalSseEncode(move: null), - serializer); + sse_encode_certified_context(self, serializer); } @protected - void - sse_encode_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerAsset( - Asset self, SseSerializer serializer) { + void sse_encode_box_autoadd_change_participant_message( + ChangeParticipantMessage self, + SseSerializer serializer, + ) { // Codec=Sse (Serialization based), see doc to use other codecs - sse_encode_usize( - (self as AssetImpl).frbInternalSseEncode(move: null), serializer); + sse_encode_change_participant_message(self, serializer); } @protected - void - sse_encode_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerChannelInterestToken( - ChannelInterestToken self, SseSerializer serializer) { + void sse_encode_box_autoadd_chat_proto( + ChatProto self, + SseSerializer serializer, + ) { // Codec=Sse (Serialization based), see doc to use other codecs - sse_encode_usize( - (self as ChannelInterestTokenImpl).frbInternalSseEncode(move: null), - serializer); + sse_encode_chat_proto(self, serializer); } @protected - void - sse_encode_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerCircleClientSessionDefaultAnisetteProvider( - CircleClientSessionDefaultAnisetteProvider self, - SseSerializer serializer) { + void sse_encode_box_autoadd_cloud_attachment( + CloudAttachment self, + SseSerializer serializer, + ) { // Codec=Sse (Serialization based), see doc to use other codecs - sse_encode_usize( - (self as CircleClientSessionDefaultAnisetteProviderImpl) - .frbInternalSseEncode(move: null), - serializer); + sse_encode_cloud_attachment(self, serializer); } @protected - void - sse_encode_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerConversationLink( - ConversationLink self, SseSerializer serializer) { + void sse_encode_box_autoadd_cloud_chat( + CloudChat self, + SseSerializer serializer, + ) { // Codec=Sse (Serialization based), see doc to use other codecs - sse_encode_usize( - (self as ConversationLinkImpl).frbInternalSseEncode(move: null), - serializer); + sse_encode_cloud_chat(self, serializer); } @protected - void - sse_encode_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerConversationParticipant( - ConversationParticipant self, SseSerializer serializer) { + void sse_encode_box_autoadd_cloud_message( + CloudMessage self, + SseSerializer serializer, + ) { // Codec=Sse (Serialization based), see doc to use other codecs - sse_encode_usize( - (self as ConversationParticipantImpl).frbInternalSseEncode(move: null), - serializer); + sse_encode_cloud_message(self, serializer); } @protected - void - sse_encode_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerDate( - Date self, SseSerializer serializer) { + void sse_encode_box_autoadd_cloud_prop( + CloudProp self, + SseSerializer serializer, + ) { // Codec=Sse (Serialization based), see doc to use other codecs - sse_encode_usize( - (self as DateImpl).frbInternalSseEncode(move: null), serializer); + sse_encode_cloud_prop(self, serializer); } @protected - void - sse_encode_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerEscrowData( - EscrowData self, SseSerializer serializer) { + void sse_encode_box_autoadd_cloud_sync_outbound_failure_class( + CloudSyncOutboundFailureClass self, + SseSerializer serializer, + ) { // Codec=Sse (Serialization based), see doc to use other codecs - sse_encode_usize( - (self as EscrowDataImpl).frbInternalSseEncode(move: null), serializer); + sse_encode_cloud_sync_outbound_failure_class(self, serializer); } @protected - void - sse_encode_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerFindMyFriendsClientDefaultAnisetteProvider( - FindMyFriendsClientDefaultAnisetteProvider self, - SseSerializer serializer) { + void sse_encode_box_autoadd_cloud_sync_outbound_reconcile_disposition( + CloudSyncOutboundReconcileDisposition self, + SseSerializer serializer, + ) { // Codec=Sse (Serialization based), see doc to use other codecs - sse_encode_usize( - (self as FindMyFriendsClientDefaultAnisetteProviderImpl) - .frbInternalSseEncode(move: null), - serializer); + sse_encode_cloud_sync_outbound_reconcile_disposition(self, serializer); } @protected - void - sse_encode_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerFindMyPhoneClientDefaultAnisetteProvider( - FindMyPhoneClientDefaultAnisetteProvider self, - SseSerializer serializer) { + void sse_encode_box_autoadd_cloud_sync_outbound_safe_code( + CloudSyncOutboundSafeCode self, + SseSerializer serializer, + ) { // Codec=Sse (Serialization based), see doc to use other codecs - sse_encode_usize( - (self as FindMyPhoneClientDefaultAnisetteProviderImpl) - .frbInternalSseEncode(move: null), - serializer); + sse_encode_cloud_sync_outbound_safe_code(self, serializer); } @protected - void - sse_encode_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerGZipWrapperAttachmentMeta( - GZipWrapperAttachmentMeta self, SseSerializer serializer) { + void sse_encode_box_autoadd_cloud_sync_prepared_message_create_input( + CloudSyncPreparedMessageCreateInput self, + SseSerializer serializer, + ) { // Codec=Sse (Serialization based), see doc to use other codecs - sse_encode_usize( - (self as GZipWrapperAttachmentMetaImpl) - .frbInternalSseEncode(move: null), - serializer); + sse_encode_cloud_sync_prepared_message_create_input(self, serializer); } @protected - void - sse_encode_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerGZipWrapperChatProto( - GZipWrapperChatProto self, SseSerializer serializer) { + void sse_encode_box_autoadd_cloud_sync_protected_failure( + CloudSyncProtectedFailure self, + SseSerializer serializer, + ) { // Codec=Sse (Serialization based), see doc to use other codecs - sse_encode_usize( - (self as GZipWrapperChatProtoImpl).frbInternalSseEncode(move: null), - serializer); + sse_encode_cloud_sync_protected_failure(self, serializer); } @protected - void - sse_encode_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerGZipWrapperMessageProto( - GZipWrapperMessageProto self, SseSerializer serializer) { + void sse_encode_box_autoadd_cloud_sync_protected_garbage_collection( + CloudSyncProtectedGarbageCollection self, + SseSerializer serializer, + ) { // Codec=Sse (Serialization based), see doc to use other codecs - sse_encode_usize( - (self as GZipWrapperMessageProtoImpl).frbInternalSseEncode(move: null), - serializer); + sse_encode_cloud_sync_protected_garbage_collection(self, serializer); } @protected - void - sse_encode_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerGZipWrapperMessageProto2( - GZipWrapperMessageProto2 self, SseSerializer serializer) { + void sse_encode_box_autoadd_cloud_sync_protected_outbound_stage( + CloudSyncProtectedOutboundStage self, + SseSerializer serializer, + ) { // Codec=Sse (Serialization based), see doc to use other codecs - sse_encode_usize( - (self as GZipWrapperMessageProto2Impl).frbInternalSseEncode(move: null), - serializer); + sse_encode_cloud_sync_protected_outbound_stage(self, serializer); } @protected - void - sse_encode_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerGZipWrapperMessageProto3( - GZipWrapperMessageProto3 self, SseSerializer serializer) { + void sse_encode_box_autoadd_cloud_sync_protected_page( + CloudSyncProtectedPage self, + SseSerializer serializer, + ) { // Codec=Sse (Serialization based), see doc to use other codecs - sse_encode_usize( - (self as GZipWrapperMessageProto3Impl).frbInternalSseEncode(move: null), - serializer); + sse_encode_cloud_sync_protected_page(self, serializer); } @protected - void - sse_encode_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerGZipWrapperMessageProto4( - GZipWrapperMessageProto4 self, SseSerializer serializer) { + void sse_encode_box_autoadd_cloud_sync_protected_preflight_code( + CloudSyncProtectedPreflightCode self, + SseSerializer serializer, + ) { // Codec=Sse (Serialization based), see doc to use other codecs - sse_encode_usize( - (self as GZipWrapperMessageProto4Impl).frbInternalSseEncode(move: null), - serializer); + sse_encode_cloud_sync_protected_preflight_code(self, serializer); } @protected - void - sse_encode_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerIDSNGMIdentity( - IdsngmIdentity self, SseSerializer serializer) { + void sse_encode_box_autoadd_cloud_sync_protected_recovery( + CloudSyncProtectedRecovery self, + SseSerializer serializer, + ) { // Codec=Sse (Serialization based), see doc to use other codecs - sse_encode_usize( - (self as IdsngmIdentityImpl).frbInternalSseEncode(move: null), - serializer); + sse_encode_cloud_sync_protected_recovery(self, serializer); } @protected - void - sse_encode_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerIDSUser( - IdsUser self, SseSerializer serializer) { + void sse_encode_box_autoadd_cloud_sync_raw_failure( + CloudSyncRawFailure self, + SseSerializer serializer, + ) { // Codec=Sse (Serialization based), see doc to use other codecs - sse_encode_usize( - (self as IdsUserImpl).frbInternalSseEncode(move: null), serializer); + sse_encode_cloud_sync_raw_failure(self, serializer); } @protected - void - sse_encode_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerJoinedOSConfig( - JoinedOsConfig self, SseSerializer serializer) { + void sse_encode_box_autoadd_cloud_sync_raw_page( + CloudSyncRawPage self, + SseSerializer serializer, + ) { // Codec=Sse (Serialization based), see doc to use other codecs - sse_encode_usize( - (self as JoinedOsConfigImpl).frbInternalSseEncode(move: null), - serializer); + sse_encode_cloud_sync_raw_page(self, serializer); } @protected - void - sse_encode_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerLocationReport( - LocationReport self, SseSerializer serializer) { + void sse_encode_box_autoadd_cloud_sync_raw_system_fields( + CloudSyncRawSystemFields self, + SseSerializer serializer, + ) { // Codec=Sse (Serialization based), see doc to use other codecs - sse_encode_usize( - (self as LocationReportImpl).frbInternalSseEncode(move: null), - serializer); + sse_encode_cloud_sync_raw_system_fields(self, serializer); } @protected - void - sse_encode_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerMessageFlags( - MessageFlags self, SseSerializer serializer) { + void sse_encode_box_autoadd_cloud_sync_transient_attachment_payload( + CloudSyncTransientAttachmentPayload self, + SseSerializer serializer, + ) { // Codec=Sse (Serialization based), see doc to use other codecs - sse_encode_usize( - (self as MessageFlagsImpl).frbInternalSseEncode(move: null), - serializer); + sse_encode_cloud_sync_transient_attachment_payload(self, serializer); } @protected - void - sse_encode_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerNSArrayLPIconMetadata( - NsArrayLpIconMetadata self, SseSerializer serializer) { + void sse_encode_box_autoadd_cloud_sync_transient_chat_payload( + CloudSyncTransientChatPayload self, + SseSerializer serializer, + ) { // Codec=Sse (Serialization based), see doc to use other codecs - sse_encode_usize( - (self as NsArrayLpIconMetadataImpl).frbInternalSseEncode(move: null), - serializer); + sse_encode_cloud_sync_transient_chat_payload(self, serializer); } @protected - void - sse_encode_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerNSArrayLPImageMetadata( - NsArrayLpImageMetadata self, SseSerializer serializer) { + void sse_encode_box_autoadd_cloud_sync_transient_deferred_reason( + CloudSyncTransientDeferredReason self, + SseSerializer serializer, + ) { // Codec=Sse (Serialization based), see doc to use other codecs - sse_encode_usize( - (self as NsArrayLpImageMetadataImpl).frbInternalSseEncode(move: null), - serializer); + sse_encode_cloud_sync_transient_deferred_reason(self, serializer); } @protected - void - sse_encode_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerPushError( - PushError self, SseSerializer serializer) { + void sse_encode_box_autoadd_cloud_sync_transient_entity_kind( + CloudSyncTransientEntityKind self, + SseSerializer serializer, + ) { // Codec=Sse (Serialization based), see doc to use other codecs - sse_encode_usize( - (self as PushErrorImpl).frbInternalSseEncode(move: null), serializer); + sse_encode_cloud_sync_transient_entity_kind(self, serializer); } @protected - void - sse_encode_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerReceiverAPSMessage( - ReceiverApsMessage self, SseSerializer serializer) { + void sse_encode_box_autoadd_cloud_sync_transient_failure_code( + CloudSyncTransientFailureCode self, + SseSerializer serializer, + ) { // Codec=Sse (Serialization based), see doc to use other codecs - sse_encode_usize( - (self as ReceiverApsMessageImpl).frbInternalSseEncode(move: null), - serializer); + sse_encode_cloud_sync_transient_failure_code(self, serializer); } @protected - void - sse_encode_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerSavedHardwareState( - SavedHardwareState self, SseSerializer serializer) { + void sse_encode_box_autoadd_cloud_sync_transient_group_photo_payload( + CloudSyncTransientGroupPhotoPayload self, + SseSerializer serializer, + ) { // Codec=Sse (Serialization based), see doc to use other codecs - sse_encode_usize( - (self as SavedHardwareStateImpl).frbInternalSseEncode(move: null), - serializer); + sse_encode_cloud_sync_transient_group_photo_payload(self, serializer); } @protected - void - sse_encode_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerSender( - Sender self, SseSerializer serializer) { + void sse_encode_box_autoadd_cloud_sync_transient_message_payload( + CloudSyncTransientMessagePayload self, + SseSerializer serializer, + ) { // Codec=Sse (Serialization based), see doc to use other codecs - sse_encode_usize( - (self as SenderImpl).frbInternalSseEncode(move: null), serializer); + sse_encode_cloud_sync_transient_message_payload(self, serializer); } @protected - void - sse_encode_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerStCollapsedValue( - StCollapsedValue self, SseSerializer serializer) { + void sse_encode_box_autoadd_cloud_sync_transient_mutation_kind( + CloudSyncTransientMutationKind self, + SseSerializer serializer, + ) { // Codec=Sse (Serialization based), see doc to use other codecs - sse_encode_usize( - (self as StCollapsedValueImpl).frbInternalSseEncode(move: null), - serializer); + sse_encode_cloud_sync_transient_mutation_kind(self, serializer); } @protected - void - sse_encode_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerSyncManagerDefaultAnisetteProviderMyFilePackager( - SyncManagerDefaultAnisetteProviderMyFilePackager self, - SseSerializer serializer) { + void sse_encode_box_autoadd_cloud_sync_transient_payload( + CloudSyncTransientPayload self, + SseSerializer serializer, + ) { // Codec=Sse (Serialization based), see doc to use other codecs - sse_encode_usize( - (self as SyncManagerDefaultAnisetteProviderMyFilePackagerImpl) - .frbInternalSseEncode(move: null), - serializer); + sse_encode_cloud_sync_transient_payload(self, serializer); } @protected - void - sse_encode_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerSystemTime( - SystemTime self, SseSerializer serializer) { + void sse_encode_box_autoadd_cloud_sync_transient_quarantine_reason( + CloudSyncTransientQuarantineReason self, + SseSerializer serializer, + ) { // Codec=Sse (Serialization based), see doc to use other codecs - sse_encode_usize( - (self as SystemTimeImpl).frbInternalSseEncode(move: null), serializer); + sse_encode_cloud_sync_transient_quarantine_reason(self, serializer); } @protected - void - sse_encode_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerVerifyBody( - VerifyBody self, SseSerializer serializer) { + void sse_encode_box_autoadd_cloud_sync_transient_reaction_kind( + CloudSyncTransientReactionKind self, + SseSerializer serializer, + ) { // Codec=Sse (Serialization based), see doc to use other codecs - sse_encode_usize( - (self as VerifyBodyImpl).frbInternalSseEncode(move: null), serializer); + sse_encode_cloud_sync_transient_reaction_kind(self, serializer); } @protected - void - sse_encode_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerViableBottle( - ViableBottle self, SseSerializer serializer) { + void sse_encode_box_autoadd_cloud_sync_transient_snapshot( + CloudSyncTransientSnapshot self, + SseSerializer serializer, + ) { // Codec=Sse (Serialization based), see doc to use other codecs - sse_encode_usize( - (self as ViableBottleImpl).frbInternalSseEncode(move: null), - serializer); + sse_encode_cloud_sync_transient_snapshot(self, serializer); } @protected - void sse_encode_Set_ft_member(Set self, SseSerializer serializer) { + void sse_encode_box_autoadd_cloud_sync_transient_tombstone( + CloudSyncTransientTombstone self, + SseSerializer serializer, + ) { // Codec=Sse (Serialization based), see doc to use other codecs - sse_encode_list_ft_member(self.toList(), serializer); + sse_encode_cloud_sync_transient_tombstone(self, serializer); } @protected - void sse_encode_StreamSink_mmcs_transfer_progress_Sse( - RustStreamSink self, SseSerializer serializer) { + void sse_encode_box_autoadd_conversation_data( + ConversationData self, + SseSerializer serializer, + ) { // Codec=Sse (Serialization based), see doc to use other codecs - sse_encode_String( - self.setupAndSerialize( - codec: SseCodec( - decodeSuccessData: sse_decode_mmcs_transfer_progress, - decodeErrorData: sse_decode_AnyhowException, - )), - serializer); + sse_encode_conversation_data(self, serializer); } @protected - void sse_encode_StreamSink_transfer_progress_Sse( - RustStreamSink self, SseSerializer serializer) { + void sse_encode_box_autoadd_dart_beacon_share_info( + DartBeaconShareInfo self, + SseSerializer serializer, + ) { // Codec=Sse (Serialization based), see doc to use other codecs - sse_encode_String( - self.setupAndSerialize( - codec: SseCodec( - decodeSuccessData: sse_decode_transfer_progress, - decodeErrorData: sse_decode_AnyhowException, - )), - serializer); + sse_encode_dart_beacon_share_info(self, serializer); } @protected - void sse_encode_String(String self, SseSerializer serializer) { + void sse_encode_box_autoadd_edit_message( + EditMessage self, + SseSerializer serializer, + ) { // Codec=Sse (Serialization based), see doc to use other codecs - sse_encode_list_prim_u_8_strict(utf8.encoder.convert(self), serializer); + sse_encode_edit_message(self, serializer); } @protected - void sse_encode_address(Address self, SseSerializer serializer) { + void sse_encode_box_autoadd_error_message( + ErrorMessage self, + SseSerializer serializer, + ) { // Codec=Sse (Serialization based), see doc to use other codecs - sse_encode_opt_String(self.administrativeArea, serializer); - sse_encode_String(self.country, serializer); - sse_encode_String(self.countryCode, serializer); - sse_encode_opt_list_String(self.formattedAddressLines, serializer); - sse_encode_opt_String(self.locality, serializer); - sse_encode_opt_String(self.stateCode, serializer); - sse_encode_opt_String(self.streetAddress, serializer); - sse_encode_opt_String(self.streetName, serializer); + sse_encode_error_message(self, serializer); } @protected - void sse_encode_ak_data(AkData self, SseSerializer serializer) { + void sse_encode_box_autoadd_extension_app( + ExtensionApp self, + SseSerializer serializer, + ) { // Codec=Sse (Serialization based), see doc to use other codecs - sse_encode_f_32(self.lat, serializer); - sse_encode_f_32(self.lng, serializer); + sse_encode_extension_app(self, serializer); } @protected - void sse_encode_aps_alert(ApsAlert self, SseSerializer serializer) { + void sse_encode_box_autoadd_f_64(double self, SseSerializer serializer) { // Codec=Sse (Serialization based), see doc to use other codecs - sse_encode_String(self.title, serializer); - sse_encode_String(self.body, serializer); - sse_encode_String(self.sbdy, serializer); - sse_encode_String(self.defbtn, serializer); - sse_encode_String(self.albtn, serializer); + sse_encode_f_64(self, serializer); } @protected - void sse_encode_aps_data(ApsData self, SseSerializer serializer) { + void sse_encode_box_autoadd_ft_message( + FTMessage self, + SseSerializer serializer, + ) { // Codec=Sse (Serialization based), see doc to use other codecs - sse_encode_aps_alert(self.alert, serializer); + sse_encode_ft_message(self, serializer); } @protected - void sse_encode_attachment(Attachment self, SseSerializer serializer) { + void sse_encode_box_autoadd_ft_mode(FTMode self, SseSerializer serializer) { // Codec=Sse (Serialization based), see doc to use other codecs - sse_encode_attachment_type(self.aType, serializer); - sse_encode_CastedPrimitive_u_64(self.part_, serializer); - sse_encode_String(self.utiType, serializer); - sse_encode_String(self.mime, serializer); - sse_encode_String(self.name, serializer); - sse_encode_bool(self.iris, serializer); + sse_encode_ft_mode(self, serializer); } @protected - void sse_encode_attachment_meta( - AttachmentMeta self, SseSerializer serializer) { + void sse_encode_box_autoadd_hw_extra(HwExtra self, SseSerializer serializer) { // Codec=Sse (Serialization based), see doc to use other codecs - sse_encode_opt_String(self.mimeType, serializer); - sse_encode_CastedPrimitive_i_64(self.startDate, serializer); - sse_encode_CastedPrimitive_i_64(self.totalBytes, serializer); - sse_encode_i_32(self.transferState, serializer); - sse_encode_bool(self.isSticker, serializer); - sse_encode_String(self.guid, serializer); - sse_encode_bool(self.hideAttachment, serializer); - sse_encode_opt_box_autoadd_mmcs_attachment_meta(self.userInfo, serializer); - sse_encode_opt_String(self.filename, serializer); - sse_encode_opt_box_autoadd_attachment_meta_extra(self.extras, serializer); - sse_encode_bool(self.isOutgoing, serializer); - sse_encode_opt_String(self.transferName, serializer); - sse_encode_i_32(self.version, serializer); - sse_encode_opt_String(self.uti, serializer); - sse_encode_CastedPrimitive_i_64(self.createdDate, serializer); - sse_encode_opt_String(self.pathc, serializer); - sse_encode_opt_String(self.md5, serializer); + sse_encode_hw_extra(self, serializer); } @protected - void sse_encode_attachment_meta_extra( - AttachmentMetaExtra self, SseSerializer serializer) { + void sse_encode_box_autoadd_i_32(int self, SseSerializer serializer) { // Codec=Sse (Serialization based), see doc to use other codecs - sse_encode_opt_box_autoadd_num_or_string( - self.previewGenerationState, serializer); + sse_encode_i_32(self, serializer); } @protected - void sse_encode_attachment_type( - AttachmentType self, SseSerializer serializer) { + void sse_encode_box_autoadd_i_64( + PlatformInt64 self, + SseSerializer serializer, + ) { // Codec=Sse (Serialization based), see doc to use other codecs - switch (self) { - case AttachmentType_Inline(field0: final field0): - sse_encode_i_32(0, serializer); - sse_encode_list_prim_u_8_strict(field0, serializer); - case AttachmentType_MMCS(field0: final field0): - sse_encode_i_32(1, serializer); - sse_encode_box_autoadd_mmcs_file(field0, serializer); - default: - throw UnimplementedError(''); - } + sse_encode_i_64(self, serializer); } @protected - void sse_encode_balloon(Balloon self, SseSerializer serializer) { + void sse_encode_box_autoadd_i_message_nickname_record( + IMessageNicknameRecord self, + SseSerializer serializer, + ) { // Codec=Sse (Serialization based), see doc to use other codecs - sse_encode_String(self.url, serializer); - sse_encode_opt_String(self.session, serializer); - sse_encode_opt_box_autoadd_balloon_layout(self.layout, serializer); - sse_encode_opt_String(self.ldText, serializer); - sse_encode_bool(self.isLive, serializer); - sse_encode_opt_list_prim_u_8_strict(self.icon, serializer); + sse_encode_i_message_nickname_record(self, serializer); } @protected - void sse_encode_balloon_layout(BalloonLayout self, SseSerializer serializer) { + void sse_encode_box_autoadd_i_message_poster_record( + IMessagePosterRecord self, + SseSerializer serializer, + ) { // Codec=Sse (Serialization based), see doc to use other codecs - switch (self) { - case BalloonLayout_TemplateLayout( - imageSubtitle: final imageSubtitle, - imageTitle: final imageTitle, - caption: final caption, - secondarySubcaption: final secondarySubcaption, - tertiarySubcaption: final tertiarySubcaption, - subcaption: final subcaption, - class_: final class_ - ): - sse_encode_i_32(0, serializer); - sse_encode_String(imageSubtitle, serializer); - sse_encode_String(imageTitle, serializer); - sse_encode_String(caption, serializer); - sse_encode_String(secondarySubcaption, serializer); - sse_encode_String(tertiarySubcaption, serializer); - sse_encode_String(subcaption, serializer); - sse_encode_ns_dictionary_class(class_, serializer); - default: - throw UnimplementedError(''); - } + sse_encode_i_message_poster_record(self, serializer); } @protected - void sse_encode_beacon_attributes( - BeaconAttributes self, SseSerializer serializer) { + void sse_encode_box_autoadd_icon_change_message( + IconChangeMessage self, + SseSerializer serializer, + ) { // Codec=Sse (Serialization based), see doc to use other codecs - sse_encode_String(self.name, serializer); - sse_encode_i_64(self.roleId, serializer); - sse_encode_String(self.emoji, serializer); - sse_encode_String(self.systemVersion, serializer); - sse_encode_String(self.serialNumber, serializer); + sse_encode_icon_change_message(self, serializer); } @protected - void sse_encode_beacon_naming_record( - BeaconNamingRecord self, SseSerializer serializer) { + void sse_encode_box_autoadd_idms_circle_message( + IdmsCircleMessage self, + SseSerializer serializer, + ) { // Codec=Sse (Serialization based), see doc to use other codecs - sse_encode_String(self.emoji, serializer); - sse_encode_String(self.name, serializer); - sse_encode_String(self.associatedBeacon, serializer); - sse_encode_CastedPrimitive_i_64(self.roleId, serializer); + sse_encode_idms_circle_message(self, serializer); } @protected - void sse_encode_bool(bool self, SseSerializer serializer) { + void sse_encode_box_autoadd_idms_message( + IdmsMessage self, + SseSerializer serializer, + ) { // Codec=Sse (Serialization based), see doc to use other codecs - serializer.buffer.putUint8(self ? 1 : 0); + sse_encode_idms_message(self, serializer); } @protected - void - sse_encode_box_autoadd_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerAPSState( - ApsState self, SseSerializer serializer) { + void sse_encode_box_autoadd_idms_requested_sign_in( + IdmsRequestedSignIn self, + SseSerializer serializer, + ) { // Codec=Sse (Serialization based), see doc to use other codecs - sse_encode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerAPSState( - self, serializer); + sse_encode_idms_requested_sign_in(self, serializer); } @protected - void - sse_encode_box_autoadd_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcCloudKitClientDefaultAnisetteProvider( - ArcCloudKitClientDefaultAnisetteProvider self, - SseSerializer serializer) { + void sse_encode_box_autoadd_let_me_in_request( + LetMeInRequest self, + SseSerializer serializer, + ) { // Codec=Sse (Serialization based), see doc to use other codecs - sse_encode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcCloudKitClientDefaultAnisetteProvider( - self, serializer); + sse_encode_let_me_in_request(self, serializer); } @protected - void - sse_encode_box_autoadd_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcCloudMessagesClientDefaultAnisetteProvider( - ArcCloudMessagesClientDefaultAnisetteProvider self, - SseSerializer serializer) { + void sse_encode_box_autoadd_link_meta( + LinkMeta self, + SseSerializer serializer, + ) { // Codec=Sse (Serialization based), see doc to use other codecs - sse_encode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcCloudMessagesClientDefaultAnisetteProvider( - self, serializer); + sse_encode_link_meta(self, serializer); } @protected - void - sse_encode_box_autoadd_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcFindMyClientDefaultAnisetteProvider( - ArcFindMyClientDefaultAnisetteProvider self, - SseSerializer serializer) { + void sse_encode_box_autoadd_location( + Location self, + SseSerializer serializer, + ) { // Codec=Sse (Serialization based), see doc to use other codecs - sse_encode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcFindMyClientDefaultAnisetteProvider( - self, serializer); + sse_encode_location(self, serializer); } @protected - void - sse_encode_box_autoadd_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcKeychainClientDefaultAnisetteProvider( - ArcKeychainClientDefaultAnisetteProvider self, - SseSerializer serializer) { + void sse_encode_box_autoadd_login_state( + LoginState self, + SseSerializer serializer, + ) { // Codec=Sse (Serialization based), see doc to use other codecs - sse_encode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcKeychainClientDefaultAnisetteProvider( - self, serializer); + sse_encode_login_state(self, serializer); } @protected - void - sse_encode_box_autoadd_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcMutexAppleAccountDefaultAnisetteProvider( - ArcMutexAppleAccountDefaultAnisetteProvider self, - SseSerializer serializer) { + void sse_encode_box_autoadd_lp_icon_metadata( + LPIconMetadata self, + SseSerializer serializer, + ) { // Codec=Sse (Serialization based), see doc to use other codecs - sse_encode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcMutexAppleAccountDefaultAnisetteProvider( - self, serializer); + sse_encode_lp_icon_metadata(self, serializer); } @protected - void - sse_encode_box_autoadd_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcPasswordManagerDefaultAnisetteProvider( - ArcPasswordManagerDefaultAnisetteProvider self, - SseSerializer serializer) { + void sse_encode_box_autoadd_lp_image_metadata( + LPImageMetadata self, + SseSerializer serializer, + ) { // Codec=Sse (Serialization based), see doc to use other codecs - sse_encode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcPasswordManagerDefaultAnisetteProvider( - self, serializer); + sse_encode_lp_image_metadata(self, serializer); } @protected - void - sse_encode_box_autoadd_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerAsset( - Asset self, SseSerializer serializer) { + void sse_encode_box_autoadd_lp_specialization_metadata( + LPSpecializationMetadata self, + SseSerializer serializer, + ) { // Codec=Sse (Serialization based), see doc to use other codecs - sse_encode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerAsset( - self, serializer); + sse_encode_lp_specialization_metadata(self, serializer); } @protected - void - sse_encode_box_autoadd_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerChannelInterestToken( - ChannelInterestToken self, SseSerializer serializer) { + void sse_encode_box_autoadd_memoji_data( + MemojiData self, + SseSerializer serializer, + ) { // Codec=Sse (Serialization based), see doc to use other codecs - sse_encode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerChannelInterestToken( - self, serializer); + sse_encode_memoji_data(self, serializer); } @protected - void - sse_encode_box_autoadd_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerCircleClientSessionDefaultAnisetteProvider( - CircleClientSessionDefaultAnisetteProvider self, - SseSerializer serializer) { + void sse_encode_box_autoadd_message(Message self, SseSerializer serializer) { // Codec=Sse (Serialization based), see doc to use other codecs - sse_encode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerCircleClientSessionDefaultAnisetteProvider( - self, serializer); + sse_encode_message(self, serializer); } @protected - void - sse_encode_box_autoadd_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerConversationLink( - ConversationLink self, SseSerializer serializer) { + void sse_encode_box_autoadd_message_inst( + MessageInst self, + SseSerializer serializer, + ) { // Codec=Sse (Serialization based), see doc to use other codecs - sse_encode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerConversationLink( - self, serializer); + sse_encode_message_inst(self, serializer); } @protected - void - sse_encode_box_autoadd_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerConversationParticipant( - ConversationParticipant self, SseSerializer serializer) { + void sse_encode_box_autoadd_message_parts( + MessageParts self, + SseSerializer serializer, + ) { // Codec=Sse (Serialization based), see doc to use other codecs - sse_encode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerConversationParticipant( - self, serializer); + sse_encode_message_parts(self, serializer); } @protected - void - sse_encode_box_autoadd_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerDate( - Date self, SseSerializer serializer) { + void sse_encode_box_autoadd_message_proto( + MessageProto self, + SseSerializer serializer, + ) { // Codec=Sse (Serialization based), see doc to use other codecs - sse_encode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerDate( - self, serializer); + sse_encode_message_proto(self, serializer); } @protected - void - sse_encode_box_autoadd_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerGZipWrapperChatProto( - GZipWrapperChatProto self, SseSerializer serializer) { + void sse_encode_box_autoadd_message_proto_2( + MessageProto2 self, + SseSerializer serializer, + ) { // Codec=Sse (Serialization based), see doc to use other codecs - sse_encode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerGZipWrapperChatProto( - self, serializer); + sse_encode_message_proto_2(self, serializer); } @protected - void - sse_encode_box_autoadd_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerGZipWrapperMessageProto2( - GZipWrapperMessageProto2 self, SseSerializer serializer) { + void sse_encode_box_autoadd_message_proto_3( + MessageProto3 self, + SseSerializer serializer, + ) { // Codec=Sse (Serialization based), see doc to use other codecs - sse_encode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerGZipWrapperMessageProto2( - self, serializer); + sse_encode_message_proto_3(self, serializer); } @protected - void - sse_encode_box_autoadd_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerGZipWrapperMessageProto3( - GZipWrapperMessageProto3 self, SseSerializer serializer) { + void sse_encode_box_autoadd_message_proto_4( + MessageProto4 self, + SseSerializer serializer, + ) { // Codec=Sse (Serialization based), see doc to use other codecs - sse_encode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerGZipWrapperMessageProto3( - self, serializer); + sse_encode_message_proto_4(self, serializer); } @protected - void - sse_encode_box_autoadd_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerGZipWrapperMessageProto4( - GZipWrapperMessageProto4 self, SseSerializer serializer) { + void sse_encode_box_autoadd_message_summary_info( + MessageSummaryInfo self, + SseSerializer serializer, + ) { // Codec=Sse (Serialization based), see doc to use other codecs - sse_encode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerGZipWrapperMessageProto4( - self, serializer); + sse_encode_message_summary_info(self, serializer); } @protected - void - sse_encode_box_autoadd_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerIDSUser( - IdsUser self, SseSerializer serializer) { + void sse_encode_box_autoadd_mmcs_attachment_meta( + MMCSAttachmentMeta self, + SseSerializer serializer, + ) { // Codec=Sse (Serialization based), see doc to use other codecs - sse_encode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerIDSUser( - self, serializer); + sse_encode_mmcs_attachment_meta(self, serializer); } @protected - void - sse_encode_box_autoadd_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerLocationReport( - LocationReport self, SseSerializer serializer) { + void sse_encode_box_autoadd_mmcs_file( + MMCSFile self, + SseSerializer serializer, + ) { // Codec=Sse (Serialization based), see doc to use other codecs - sse_encode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerLocationReport( - self, serializer); + sse_encode_mmcs_file(self, serializer); } @protected - void - sse_encode_box_autoadd_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerNSArrayLPIconMetadata( - NsArrayLpIconMetadata self, SseSerializer serializer) { + void sse_encode_box_autoadd_monogram_data( + MonogramData self, + SseSerializer serializer, + ) { // Codec=Sse (Serialization based), see doc to use other codecs - sse_encode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerNSArrayLPIconMetadata( - self, serializer); + sse_encode_monogram_data(self, serializer); } @protected - void - sse_encode_box_autoadd_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerNSArrayLPImageMetadata( - NsArrayLpImageMetadata self, SseSerializer serializer) { + void sse_encode_box_autoadd_move_to_recycle_bin_message( + MoveToRecycleBinMessage self, + SseSerializer serializer, + ) { // Codec=Sse (Serialization based), see doc to use other codecs - sse_encode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerNSArrayLPImageMetadata( - self, serializer); + sse_encode_move_to_recycle_bin_message(self, serializer); } @protected - void - sse_encode_box_autoadd_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerPushError( - PushError self, SseSerializer serializer) { + void sse_encode_box_autoadd_normal_message( + NormalMessage self, + SseSerializer serializer, + ) { // Codec=Sse (Serialization based), see doc to use other codecs - sse_encode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerPushError( - self, serializer); + sse_encode_normal_message(self, serializer); } @protected - void - sse_encode_box_autoadd_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerSavedHardwareState( - SavedHardwareState self, SseSerializer serializer) { + void sse_encode_box_autoadd_ns_attributed_string( + NSAttributedString self, + SseSerializer serializer, + ) { // Codec=Sse (Serialization based), see doc to use other codecs - sse_encode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerSavedHardwareState( - self, serializer); + sse_encode_ns_attributed_string(self, serializer); } @protected - void - sse_encode_box_autoadd_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerSyncManagerDefaultAnisetteProviderMyFilePackager( - SyncManagerDefaultAnisetteProviderMyFilePackager self, - SseSerializer serializer) { + void sse_encode_box_autoadd_ns_number( + NSNumber self, + SseSerializer serializer, + ) { // Codec=Sse (Serialization based), see doc to use other codecs - sse_encode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerSyncManagerDefaultAnisetteProviderMyFilePackager( - self, serializer); + sse_encode_ns_number(self, serializer); } @protected - void - sse_encode_box_autoadd_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerSystemTime( - SystemTime self, SseSerializer serializer) { + void sse_encode_box_autoadd_ns_string( + NSString self, + SseSerializer serializer, + ) { // Codec=Sse (Serialization based), see doc to use other codecs - sse_encode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerSystemTime( - self, serializer); + sse_encode_ns_string(self, serializer); } @protected - void sse_encode_box_autoadd_address(Address self, SseSerializer serializer) { + void sse_encode_box_autoadd_nsurl(NSURL self, SseSerializer serializer) { // Codec=Sse (Serialization based), see doc to use other codecs - sse_encode_address(self, serializer); + sse_encode_nsurl(self, serializer); } @protected - void sse_encode_box_autoadd_attachment( - Attachment self, SseSerializer serializer) { + void sse_encode_box_autoadd_num_or_string( + NumOrString self, + SseSerializer serializer, + ) { // Codec=Sse (Serialization based), see doc to use other codecs - sse_encode_attachment(self, serializer); + sse_encode_num_or_string(self, serializer); } @protected - void sse_encode_box_autoadd_attachment_meta( - AttachmentMeta self, SseSerializer serializer) { + void sse_encode_box_autoadd_operated_chat( + OperatedChat self, + SseSerializer serializer, + ) { // Codec=Sse (Serialization based), see doc to use other codecs - sse_encode_attachment_meta(self, serializer); + sse_encode_operated_chat(self, serializer); } @protected - void sse_encode_box_autoadd_attachment_meta_extra( - AttachmentMetaExtra self, SseSerializer serializer) { + void sse_encode_box_autoadd_part_extension( + PartExtension self, + SseSerializer serializer, + ) { // Codec=Sse (Serialization based), see doc to use other codecs - sse_encode_attachment_meta_extra(self, serializer); + sse_encode_part_extension(self, serializer); } @protected - void sse_encode_box_autoadd_balloon(Balloon self, SseSerializer serializer) { + void sse_encode_box_autoadd_passkey(Passkey self, SseSerializer serializer) { // Codec=Sse (Serialization based), see doc to use other codecs - sse_encode_balloon(self, serializer); + sse_encode_passkey(self, serializer); } @protected - void sse_encode_box_autoadd_balloon_layout( - BalloonLayout self, SseSerializer serializer) { + void sse_encode_box_autoadd_password_manager_meta( + PasswordManagerMeta self, + SseSerializer serializer, + ) { // Codec=Sse (Serialization based), see doc to use other codecs - sse_encode_balloon_layout(self, serializer); + sse_encode_password_manager_meta(self, serializer); } @protected - void sse_encode_box_autoadd_beacon_attributes( - BeaconAttributes self, SseSerializer serializer) { + void sse_encode_box_autoadd_password_manager_meta_data( + PasswordManagerMetaData self, + SseSerializer serializer, + ) { // Codec=Sse (Serialization based), see doc to use other codecs - sse_encode_beacon_attributes(self, serializer); + sse_encode_password_manager_meta_data(self, serializer); } @protected - void sse_encode_box_autoadd_beacon_naming_record( - BeaconNamingRecord self, SseSerializer serializer) { + void sse_encode_box_autoadd_password_manager_meta_data_formerly_shared( + PasswordManagerMetaDataFormerlyShared self, + SseSerializer serializer, + ) { // Codec=Sse (Serialization based), see doc to use other codecs - sse_encode_beacon_naming_record(self, serializer); + sse_encode_password_manager_meta_data_formerly_shared(self, serializer); } @protected - void sse_encode_box_autoadd_bool(bool self, SseSerializer serializer) { + void sse_encode_box_autoadd_password_manager_totp( + PasswordManagerTotp self, + SseSerializer serializer, + ) { // Codec=Sse (Serialization based), see doc to use other codecs - sse_encode_bool(self, serializer); + sse_encode_password_manager_totp(self, serializer); } @protected - void sse_encode_box_autoadd_certified_context( - CertifiedContext self, SseSerializer serializer) { + void sse_encode_box_autoadd_password_raw_entry( + PasswordRawEntry self, + SseSerializer serializer, + ) { // Codec=Sse (Serialization based), see doc to use other codecs - sse_encode_certified_context(self, serializer); + sse_encode_password_raw_entry(self, serializer); } @protected - void sse_encode_box_autoadd_change_participant_message( - ChangeParticipantMessage self, SseSerializer serializer) { + void sse_encode_box_autoadd_permanent_delete_message( + PermanentDeleteMessage self, + SseSerializer serializer, + ) { // Codec=Sse (Serialization based), see doc to use other codecs - sse_encode_change_participant_message(self, serializer); + sse_encode_permanent_delete_message(self, serializer); } @protected - void sse_encode_box_autoadd_chat_proto( - ChatProto self, SseSerializer serializer) { + void sse_encode_box_autoadd_poster_color( + PosterColor self, + SseSerializer serializer, + ) { // Codec=Sse (Serialization based), see doc to use other codecs - sse_encode_chat_proto(self, serializer); + sse_encode_poster_color(self, serializer); } @protected - void sse_encode_box_autoadd_cloud_attachment( - CloudAttachment self, SseSerializer serializer) { + void sse_encode_box_autoadd_pr_poster_content_material_style( + PRPosterContentMaterialStyle self, + SseSerializer serializer, + ) { // Codec=Sse (Serialization based), see doc to use other codecs - sse_encode_cloud_attachment(self, serializer); + sse_encode_pr_poster_content_material_style(self, serializer); } @protected - void sse_encode_box_autoadd_cloud_chat( - CloudChat self, SseSerializer serializer) { + void sse_encode_box_autoadd_push_message( + PushMessage self, + SseSerializer serializer, + ) { // Codec=Sse (Serialization based), see doc to use other codecs - sse_encode_cloud_chat(self, serializer); + sse_encode_push_message(self, serializer); } @protected - void sse_encode_box_autoadd_cloud_message( - CloudMessage self, SseSerializer serializer) { + void sse_encode_box_autoadd_react_message( + ReactMessage self, + SseSerializer serializer, + ) { // Codec=Sse (Serialization based), see doc to use other codecs - sse_encode_cloud_message(self, serializer); + sse_encode_react_message(self, serializer); } @protected - void sse_encode_box_autoadd_cloud_prop( - CloudProp self, SseSerializer serializer) { + void sse_encode_box_autoadd_reaction( + Reaction self, + SseSerializer serializer, + ) { // Codec=Sse (Serialization based), see doc to use other codecs - sse_encode_cloud_prop(self, serializer); + sse_encode_reaction(self, serializer); } @protected - void sse_encode_box_autoadd_conversation_data( - ConversationData self, SseSerializer serializer) { + void + sse_encode_box_autoadd_record_shared_push_state_auto_owned_rust_opaque_flutter_rust_bridgefor_generated_rust_auto_opaque_inner_aps_watcher( + (SharedPushState, ApsWatcher) self, + SseSerializer serializer, + ) { // Codec=Sse (Serialization based), see doc to use other codecs - sse_encode_conversation_data(self, serializer); + sse_encode_record_shared_push_state_auto_owned_rust_opaque_flutter_rust_bridgefor_generated_rust_auto_opaque_inner_aps_watcher( + self, + serializer, + ); } @protected - void sse_encode_box_autoadd_dart_beacon_share_info( - DartBeaconShareInfo self, SseSerializer serializer) { + void sse_encode_box_autoadd_record_string_string( + (String, String) self, + SseSerializer serializer, + ) { // Codec=Sse (Serialization based), see doc to use other codecs - sse_encode_dart_beacon_share_info(self, serializer); + sse_encode_record_string_string(self, serializer); } @protected - void sse_encode_box_autoadd_edit_message( - EditMessage self, SseSerializer serializer) { + void sse_encode_box_autoadd_record_string_u_64( + (String, BigInt) self, + SseSerializer serializer, + ) { // Codec=Sse (Serialization based), see doc to use other codecs - sse_encode_edit_message(self, serializer); + sse_encode_record_string_u_64(self, serializer); } @protected - void sse_encode_box_autoadd_error_message( - ErrorMessage self, SseSerializer serializer) { + void sse_encode_box_autoadd_register_state( + RegisterState self, + SseSerializer serializer, + ) { // Codec=Sse (Serialization based), see doc to use other codecs - sse_encode_error_message(self, serializer); + sse_encode_register_state(self, serializer); } @protected - void sse_encode_box_autoadd_extension_app( - ExtensionApp self, SseSerializer serializer) { + void sse_encode_box_autoadd_rename_message( + RenameMessage self, + SseSerializer serializer, + ) { // Codec=Sse (Serialization based), see doc to use other codecs - sse_encode_extension_app(self, serializer); + sse_encode_rename_message(self, serializer); } @protected - void sse_encode_box_autoadd_f_64(double self, SseSerializer serializer) { + void sse_encode_box_autoadd_rich_link_image_attachment_substitute( + RichLinkImageAttachmentSubstitute self, + SseSerializer serializer, + ) { // Codec=Sse (Serialization based), see doc to use other codecs - sse_encode_f_64(self, serializer); + sse_encode_rich_link_image_attachment_substitute(self, serializer); } @protected - void sse_encode_box_autoadd_ft_message( - FTMessage self, SseSerializer serializer) { + void sse_encode_box_autoadd_schedule_mode( + ScheduleMode self, + SseSerializer serializer, + ) { // Codec=Sse (Serialization based), see doc to use other codecs - sse_encode_ft_message(self, serializer); + sse_encode_schedule_mode(self, serializer); } @protected - void sse_encode_box_autoadd_ft_mode(FTMode self, SseSerializer serializer) { + void sse_encode_box_autoadd_set_transcript_background_message( + SetTranscriptBackgroundMessage self, + SseSerializer serializer, + ) { // Codec=Sse (Serialization based), see doc to use other codecs - sse_encode_ft_mode(self, serializer); + sse_encode_set_transcript_background_message(self, serializer); } @protected - void sse_encode_box_autoadd_hw_extra(HwExtra self, SseSerializer serializer) { + void sse_encode_box_autoadd_share_profile_message( + ShareProfileMessage self, + SseSerializer serializer, + ) { // Codec=Sse (Serialization based), see doc to use other codecs - sse_encode_hw_extra(self, serializer); + sse_encode_share_profile_message(self, serializer); } @protected - void sse_encode_box_autoadd_i_32(int self, SseSerializer serializer) { + void sse_encode_box_autoadd_shared_album( + SharedAlbum self, + SseSerializer serializer, + ) { // Codec=Sse (Serialization based), see doc to use other codecs - sse_encode_i_32(self, serializer); + sse_encode_shared_album(self, serializer); } @protected - void sse_encode_box_autoadd_i_64( - PlatformInt64 self, SseSerializer serializer) { + void sse_encode_box_autoadd_shared_i_cloud_services( + SharedICloudServices self, + SseSerializer serializer, + ) { // Codec=Sse (Serialization based), see doc to use other codecs - sse_encode_i_64(self, serializer); + sse_encode_shared_i_cloud_services(self, serializer); } @protected - void sse_encode_box_autoadd_i_message_nickname_record( - IMessageNicknameRecord self, SseSerializer serializer) { + void sse_encode_box_autoadd_shared_poster( + SharedPoster self, + SseSerializer serializer, + ) { // Codec=Sse (Serialization based), see doc to use other codecs - sse_encode_i_message_nickname_record(self, serializer); + sse_encode_shared_poster(self, serializer); } @protected - void sse_encode_box_autoadd_i_message_poster_record( - IMessagePosterRecord self, SseSerializer serializer) { + void sse_encode_box_autoadd_shared_push_state( + SharedPushState self, + SseSerializer serializer, + ) { // Codec=Sse (Serialization based), see doc to use other codecs - sse_encode_i_message_poster_record(self, serializer); + sse_encode_shared_push_state(self, serializer); } @protected - void sse_encode_box_autoadd_icon_change_message( - IconChangeMessage self, SseSerializer serializer) { + void sse_encode_box_autoadd_simplified_incoming_call_poster( + SimplifiedIncomingCallPoster self, + SseSerializer serializer, + ) { // Codec=Sse (Serialization based), see doc to use other codecs - sse_encode_icon_change_message(self, serializer); + sse_encode_simplified_incoming_call_poster(self, serializer); } @protected - void sse_encode_box_autoadd_idms_circle_message( - IdmsCircleMessage self, SseSerializer serializer) { + void sse_encode_box_autoadd_simplified_transcript_poster( + SimplifiedTranscriptPoster self, + SseSerializer serializer, + ) { // Codec=Sse (Serialization based), see doc to use other codecs - sse_encode_idms_circle_message(self, serializer); + sse_encode_simplified_transcript_poster(self, serializer); } @protected - void sse_encode_box_autoadd_idms_message( - IdmsMessage self, SseSerializer serializer) { + void sse_encode_box_autoadd_status_kit_message( + StatusKitMessage self, + SseSerializer serializer, + ) { // Codec=Sse (Serialization based), see doc to use other codecs - sse_encode_idms_message(self, serializer); + sse_encode_status_kit_message(self, serializer); } @protected - void sse_encode_box_autoadd_idms_requested_sign_in( - IdmsRequestedSignIn self, SseSerializer serializer) { + void sse_encode_box_autoadd_support_action( + SupportAction self, + SseSerializer serializer, + ) { // Codec=Sse (Serialization based), see doc to use other codecs - sse_encode_idms_requested_sign_in(self, serializer); + sse_encode_support_action(self, serializer); } @protected - void sse_encode_box_autoadd_let_me_in_request( - LetMeInRequest self, SseSerializer serializer) { + void sse_encode_box_autoadd_support_alert( + SupportAlert self, + SseSerializer serializer, + ) { // Codec=Sse (Serialization based), see doc to use other codecs - sse_encode_let_me_in_request(self, serializer); + sse_encode_support_alert(self, serializer); } @protected - void sse_encode_box_autoadd_link_meta( - LinkMeta self, SseSerializer serializer) { + void sse_encode_box_autoadd_teardown_sign_in( + TeardownSignIn self, + SseSerializer serializer, + ) { // Codec=Sse (Serialization based), see doc to use other codecs - sse_encode_link_meta(self, serializer); + sse_encode_teardown_sign_in(self, serializer); } @protected - void sse_encode_box_autoadd_location( - Location self, SseSerializer serializer) { + void sse_encode_box_autoadd_text_flags( + TextFlags self, + SseSerializer serializer, + ) { // Codec=Sse (Serialization based), see doc to use other codecs - sse_encode_location(self, serializer); + sse_encode_text_flags(self, serializer); } @protected - void sse_encode_box_autoadd_login_state( - LoginState self, SseSerializer serializer) { + void sse_encode_box_autoadd_text_format( + TextFormat self, + SseSerializer serializer, + ) { // Codec=Sse (Serialization based), see doc to use other codecs - sse_encode_login_state(self, serializer); + sse_encode_text_format(self, serializer); } @protected - void sse_encode_box_autoadd_lp_icon_metadata( - LPIconMetadata self, SseSerializer serializer) { + void sse_encode_box_autoadd_transcript_dynamic_user_data( + TranscriptDynamicUserData self, + SseSerializer serializer, + ) { // Codec=Sse (Serialization based), see doc to use other codecs - sse_encode_lp_icon_metadata(self, serializer); + sse_encode_transcript_dynamic_user_data(self, serializer); } @protected - void sse_encode_box_autoadd_lp_image_metadata( - LPImageMetadata self, SseSerializer serializer) { + void sse_encode_box_autoadd_typing_app( + TypingApp self, + SseSerializer serializer, + ) { // Codec=Sse (Serialization based), see doc to use other codecs - sse_encode_lp_image_metadata(self, serializer); + sse_encode_typing_app(self, serializer); } @protected - void sse_encode_box_autoadd_lp_specialization_metadata( - LPSpecializationMetadata self, SseSerializer serializer) { + void sse_encode_box_autoadd_u_16(int self, SseSerializer serializer) { // Codec=Sse (Serialization based), see doc to use other codecs - sse_encode_lp_specialization_metadata(self, serializer); + sse_encode_u_16(self, serializer); } @protected - void sse_encode_box_autoadd_memoji_data( - MemojiData self, SseSerializer serializer) { + void sse_encode_box_autoadd_u_32(int self, SseSerializer serializer) { // Codec=Sse (Serialization based), see doc to use other codecs - sse_encode_memoji_data(self, serializer); + sse_encode_u_32(self, serializer); } @protected - void sse_encode_box_autoadd_message(Message self, SseSerializer serializer) { + void sse_encode_box_autoadd_u_64(BigInt self, SseSerializer serializer) { // Codec=Sse (Serialization based), see doc to use other codecs - sse_encode_message(self, serializer); + sse_encode_u_64(self, serializer); } @protected - void sse_encode_box_autoadd_message_inst( - MessageInst self, SseSerializer serializer) { + void sse_encode_box_autoadd_unsend_message( + UnsendMessage self, + SseSerializer serializer, + ) { // Codec=Sse (Serialization based), see doc to use other codecs - sse_encode_message_inst(self, serializer); + sse_encode_unsend_message(self, serializer); } @protected - void sse_encode_box_autoadd_message_parts( - MessageParts self, SseSerializer serializer) { + void sse_encode_box_autoadd_update_account_finish( + UpdateAccountFinish self, + SseSerializer serializer, + ) { // Codec=Sse (Serialization based), see doc to use other codecs - sse_encode_message_parts(self, serializer); + sse_encode_update_account_finish(self, serializer); } @protected - void sse_encode_box_autoadd_message_proto( - MessageProto self, SseSerializer serializer) { + void sse_encode_box_autoadd_update_extension_message( + UpdateExtensionMessage self, + SseSerializer serializer, + ) { // Codec=Sse (Serialization based), see doc to use other codecs - sse_encode_message_proto(self, serializer); + sse_encode_update_extension_message(self, serializer); } @protected - void sse_encode_box_autoadd_message_proto_2( - MessageProto2 self, SseSerializer serializer) { + void sse_encode_box_autoadd_update_profile_message( + UpdateProfileMessage self, + SseSerializer serializer, + ) { // Codec=Sse (Serialization based), see doc to use other codecs - sse_encode_message_proto_2(self, serializer); + sse_encode_update_profile_message(self, serializer); } @protected - void sse_encode_box_autoadd_message_proto_3( - MessageProto3 self, SseSerializer serializer) { + void sse_encode_box_autoadd_update_profile_sharing_message( + UpdateProfileSharingMessage self, + SseSerializer serializer, + ) { // Codec=Sse (Serialization based), see doc to use other codecs - sse_encode_message_proto_3(self, serializer); + sse_encode_update_profile_sharing_message(self, serializer); } @protected - void sse_encode_box_autoadd_message_proto_4( - MessageProto4 self, SseSerializer serializer) { + void sse_encode_box_autoadd_wifi_password( + WifiPassword self, + SseSerializer serializer, + ) { // Codec=Sse (Serialization based), see doc to use other codecs - sse_encode_message_proto_4(self, serializer); + sse_encode_wifi_password(self, serializer); } @protected - void sse_encode_box_autoadd_message_summary_info( - MessageSummaryInfo self, SseSerializer serializer) { + void sse_encode_certified_context( + CertifiedContext self, + SseSerializer serializer, + ) { // Codec=Sse (Serialization based), see doc to use other codecs - sse_encode_message_summary_info(self, serializer); + sse_encode_u_32(self.version, serializer); + sse_encode_list_prim_u_8_strict(self.receipt, serializer); + sse_encode_String(self.sender, serializer); + sse_encode_String(self.target, serializer); + sse_encode_list_prim_u_8_strict(self.uuid, serializer); + sse_encode_list_prim_u_8_strict(self.token, serializer); } @protected - void sse_encode_box_autoadd_mmcs_attachment_meta( - MMCSAttachmentMeta self, SseSerializer serializer) { + void sse_encode_change_participant_message( + ChangeParticipantMessage self, + SseSerializer serializer, + ) { // Codec=Sse (Serialization based), see doc to use other codecs - sse_encode_mmcs_attachment_meta(self, serializer); + sse_encode_list_String(self.newParticipants, serializer); + sse_encode_CastedPrimitive_u_64(self.groupVersion, serializer); } @protected - void sse_encode_box_autoadd_mmcs_file( - MMCSFile self, SseSerializer serializer) { + void sse_encode_chat_proto(ChatProto self, SseSerializer serializer) { // Codec=Sse (Serialization based), see doc to use other codecs - sse_encode_mmcs_file(self, serializer); + sse_encode_opt_box_autoadd_u_32(self.unk1, serializer); } @protected - void sse_encode_box_autoadd_monogram_data( - MonogramData self, SseSerializer serializer) { + void sse_encode_cloud_attachment( + CloudAttachment self, + SseSerializer serializer, + ) { // Codec=Sse (Serialization based), see doc to use other codecs - sse_encode_monogram_data(self, serializer); + sse_encode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerGZipWrapperAttachmentMeta( + self.cm, + serializer, + ); + sse_encode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerAsset( + self.lqa, + serializer, + ); } @protected - void sse_encode_box_autoadd_move_to_recycle_bin_message( - MoveToRecycleBinMessage self, SseSerializer serializer) { + void sse_encode_cloud_chat(CloudChat self, SseSerializer serializer) { // Codec=Sse (Serialization based), see doc to use other codecs - sse_encode_move_to_recycle_bin_message(self, serializer); + sse_encode_i_64(self.style, serializer); + sse_encode_i_64(self.isFiltered, serializer); + sse_encode_i_64(self.successfulQuery, serializer); + sse_encode_i_64(self.state, serializer); + sse_encode_String(self.chatIdentifier, serializer); + sse_encode_String(self.groupId, serializer); + sse_encode_String(self.serviceName, serializer); + sse_encode_String(self.originalGroupId, serializer); + sse_encode_opt_box_autoadd_cloud_prop(self.properties, serializer); + sse_encode_list_cloud_participant(self.participants, serializer); + sse_encode_cloud_prop_001(self.prop001, serializer); + sse_encode_i_64(self.lastReadMessageTimestamp, serializer); + sse_encode_String(self.lastAddressedHandle, serializer); + sse_encode_String(self.guid, serializer); + sse_encode_opt_String(self.displayName, serializer); + sse_encode_opt_box_autoadd_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerGZipWrapperChatProto( + self.proto001, + serializer, + ); + sse_encode_opt_String(self.groupPhotoGuid, serializer); + sse_encode_opt_box_autoadd_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerAsset( + self.groupPhoto, + serializer, + ); } @protected - void sse_encode_box_autoadd_normal_message( - NormalMessage self, SseSerializer serializer) { + void sse_encode_cloud_message(CloudMessage self, SseSerializer serializer) { // Codec=Sse (Serialization based), see doc to use other codecs - sse_encode_normal_message(self, serializer); + sse_encode_opt_box_autoadd_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerSystemTime( + self.utm, + serializer, + ); + sse_encode_i_64(self.type, serializer); + sse_encode_i_64(self.error, serializer); + sse_encode_String(self.chatId, serializer); + sse_encode_String(self.sender, serializer); + sse_encode_i_64(self.time, serializer); + sse_encode_opt_box_autoadd_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerGZipWrapperMessageProto2( + self.msgProto2, + serializer, + ); + sse_encode_String(self.destinationCallerId, serializer); + sse_encode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerGZipWrapperMessageProto( + self.msgProto, + serializer, + ); + sse_encode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerMessageFlags( + self.flags, + serializer, + ); + sse_encode_String(self.guid, serializer); + sse_encode_opt_box_autoadd_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerGZipWrapperMessageProto3( + self.msgProto3, + serializer, + ); + sse_encode_String(self.service, serializer); + sse_encode_opt_box_autoadd_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerGZipWrapperMessageProto4( + self.msgProto4, + serializer, + ); } @protected - void sse_encode_box_autoadd_ns_attributed_string( - NSAttributedString self, SseSerializer serializer) { + void sse_encode_cloud_message_summary( + CloudMessageSummary self, + SseSerializer serializer, + ) { // Codec=Sse (Serialization based), see doc to use other codecs - sse_encode_ns_attributed_string(self, serializer); + sse_encode_list_prim_i_64_strict(self.messagesSummary, serializer); + sse_encode_list_prim_i_64_strict(self.chatSummary, serializer); + sse_encode_list_prim_i_64_strict(self.attachmentSummary, serializer); } @protected - void sse_encode_box_autoadd_ns_number( - NSNumber self, SseSerializer serializer) { + void sse_encode_cloud_participant( + CloudParticipant self, + SseSerializer serializer, + ) { // Codec=Sse (Serialization based), see doc to use other codecs - sse_encode_ns_number(self, serializer); + sse_encode_String(self.uri, serializer); } @protected - void sse_encode_box_autoadd_ns_string( - NSString self, SseSerializer serializer) { + void sse_encode_cloud_prop(CloudProp self, SseSerializer serializer) { // Codec=Sse (Serialization based), see doc to use other codecs - sse_encode_ns_string(self, serializer); + sse_encode_opt_box_autoadd_u_32(self.gpufc, serializer); + sse_encode_opt_box_autoadd_u_32(self.pv, serializer); + sse_encode_opt_box_autoadd_u_32( + self.numberOfTimesRespondedtoThread, + serializer, + ); + sse_encode_opt_box_autoadd_bool(self.shouldForceToSms, serializer); + sse_encode_opt_String(self.lastSeenMessageGuid, serializer); + sse_encode_opt_box_autoadd_u_32(self.messageHandshakeState, serializer); + sse_encode_list_String(self.legacyGroupIdentifiers, serializer); + sse_encode_opt_String(self.groupPhotoGuid, serializer); + sse_encode_opt_box_autoadd_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerDate( + self.lastModificationDate, + serializer, + ); } @protected - void sse_encode_box_autoadd_nsurl(NSURL self, SseSerializer serializer) { + void sse_encode_cloud_prop_001(CloudProp001 self, SseSerializer serializer) { // Codec=Sse (Serialization based), see doc to use other codecs - sse_encode_nsurl(self, serializer); + sse_encode_u_32(self.syndicationType, serializer); } @protected - void sse_encode_box_autoadd_num_or_string( - NumOrString self, SseSerializer serializer) { + void sse_encode_cloud_sync_native_auth_metadata( + CloudSyncNativeAuthMetadata self, + SseSerializer serializer, + ) { // Codec=Sse (Serialization based), see doc to use other codecs - sse_encode_num_or_string(self, serializer); + sse_encode_String(self.nativeSessionId, serializer); + sse_encode_String(self.accountFingerprint, serializer); + sse_encode_String(self.protectedStoreIdentity, serializer); } @protected - void sse_encode_box_autoadd_operated_chat( - OperatedChat self, SseSerializer serializer) { + void sse_encode_cloud_sync_outbound_consume_result( + CloudSyncOutboundConsumeResult self, + SseSerializer serializer, + ) { // Codec=Sse (Serialization based), see doc to use other codecs - sse_encode_operated_chat(self, serializer); + sse_encode_list_cloud_sync_outbound_save_outcome(self.outcomes, serializer); + sse_encode_opt_box_autoadd_cloud_sync_outbound_safe_code( + self.failure, + serializer, + ); } @protected - void sse_encode_box_autoadd_part_extension( - PartExtension self, SseSerializer serializer) { + void sse_encode_cloud_sync_outbound_failure_class( + CloudSyncOutboundFailureClass self, + SseSerializer serializer, + ) { // Codec=Sse (Serialization based), see doc to use other codecs - sse_encode_part_extension(self, serializer); + sse_encode_i_32(self.index, serializer); } @protected - void sse_encode_box_autoadd_passkey(Passkey self, SseSerializer serializer) { + void sse_encode_cloud_sync_outbound_reconcile_disposition( + CloudSyncOutboundReconcileDisposition self, + SseSerializer serializer, + ) { // Codec=Sse (Serialization based), see doc to use other codecs - sse_encode_passkey(self, serializer); + sse_encode_i_32(self.index, serializer); } @protected - void sse_encode_box_autoadd_password_manager_meta( - PasswordManagerMeta self, SseSerializer serializer) { + void sse_encode_cloud_sync_outbound_reconcile_result( + CloudSyncOutboundReconcileResult self, + SseSerializer serializer, + ) { // Codec=Sse (Serialization based), see doc to use other codecs - sse_encode_password_manager_meta(self, serializer); + sse_encode_opt_box_autoadd_cloud_sync_outbound_reconcile_disposition( + self.disposition, + serializer, + ); + sse_encode_opt_String(self.protectedProofReference, serializer); + sse_encode_opt_box_autoadd_cloud_sync_outbound_failure_class( + self.failureClass, + serializer, + ); + sse_encode_opt_box_autoadd_u_64(self.retryAfterSeconds, serializer); + sse_encode_opt_box_autoadd_cloud_sync_outbound_safe_code( + self.failure, + serializer, + ); } @protected - void sse_encode_box_autoadd_password_manager_meta_data( - PasswordManagerMetaData self, SseSerializer serializer) { + void sse_encode_cloud_sync_outbound_safe_code( + CloudSyncOutboundSafeCode self, + SseSerializer serializer, + ) { // Codec=Sse (Serialization based), see doc to use other codecs - sse_encode_password_manager_meta_data(self, serializer); + sse_encode_i_32(self.index, serializer); } @protected - void sse_encode_box_autoadd_password_manager_meta_data_formerly_shared( - PasswordManagerMetaDataFormerlyShared self, SseSerializer serializer) { + void sse_encode_cloud_sync_outbound_save_disposition( + CloudSyncOutboundSaveDisposition self, + SseSerializer serializer, + ) { // Codec=Sse (Serialization based), see doc to use other codecs - sse_encode_password_manager_meta_data_formerly_shared(self, serializer); + sse_encode_i_32(self.index, serializer); } @protected - void sse_encode_box_autoadd_password_manager_totp( - PasswordManagerTotp self, SseSerializer serializer) { + void sse_encode_cloud_sync_outbound_save_outcome( + CloudSyncOutboundSaveOutcome self, + SseSerializer serializer, + ) { // Codec=Sse (Serialization based), see doc to use other codecs - sse_encode_password_manager_totp(self, serializer); + sse_encode_String(self.localOperationId, serializer); + sse_encode_String(self.appleOperationUuid, serializer); + sse_encode_cloud_sync_outbound_save_disposition( + self.disposition, + serializer, + ); + sse_encode_opt_box_autoadd_cloud_sync_outbound_failure_class( + self.failureClass, + serializer, + ); + sse_encode_opt_box_autoadd_u_64(self.retryAfterSeconds, serializer); } @protected - void sse_encode_box_autoadd_password_raw_entry( - PasswordRawEntry self, SseSerializer serializer) { + void sse_encode_cloud_sync_prepared_message_create_input( + CloudSyncPreparedMessageCreateInput self, + SseSerializer serializer, + ) { // Codec=Sse (Serialization based), see doc to use other codecs - sse_encode_password_raw_entry(self, serializer); + sse_encode_String(self.localOperationId, serializer); + sse_encode_String(self.logicalEntityKeyHash, serializer); + sse_encode_String(self.protectedLeaseReference, serializer); + sse_encode_String(self.protectedPayloadReference, serializer); + sse_encode_String(self.payloadSha256, serializer); + sse_encode_String(self.protectedServerRecordReference, serializer); + sse_encode_String(self.serverRecordIdHash, serializer); + sse_encode_String(self.appleOperationUuid, serializer); } @protected - void sse_encode_box_autoadd_permanent_delete_message( - PermanentDeleteMessage self, SseSerializer serializer) { + void sse_encode_cloud_sync_prepared_message_create_result( + CloudSyncPreparedMessageCreateResult self, + SseSerializer serializer, + ) { // Codec=Sse (Serialization based), see doc to use other codecs - sse_encode_permanent_delete_message(self, serializer); + sse_encode_opt_box_autoadd_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerCloudSyncPreparedMessageCreateHandle( + self.handle, + serializer, + ); + sse_encode_opt_box_autoadd_cloud_sync_outbound_safe_code( + self.failure, + serializer, + ); } @protected - void sse_encode_box_autoadd_poster_color( - PosterColor self, SseSerializer serializer) { - // Codec=Sse (Serialization based), see doc to use other codecs - sse_encode_poster_color(self, serializer); + void sse_encode_cloud_sync_protected_change( + CloudSyncProtectedChange self, + SseSerializer serializer, + ) { + // Codec=Sse (Serialization based), see doc to use other codecs + sse_encode_String(self.changeId, serializer); + sse_encode_String(self.recordIdHash, serializer); + sse_encode_opt_String(self.etagHash, serializer); + sse_encode_cloud_sync_protected_change_kind(self.kind, serializer); + sse_encode_String(self.payloadSha256, serializer); + sse_encode_u_64(self.payloadLength, serializer); + sse_encode_String(self.protectedRecordIdentityReference, serializer); + sse_encode_String(self.protectedRawEnvelopeReference, serializer); + sse_encode_opt_box_autoadd_i_64(self.serverModifiedAtMillis, serializer); + sse_encode_opt_box_autoadd_cloud_sync_protected_preflight_code( + self.preflightCode, + serializer, + ); + sse_encode_bool(self.isTombstone, serializer); } @protected - void sse_encode_box_autoadd_pr_poster_content_material_style( - PRPosterContentMaterialStyle self, SseSerializer serializer) { + void sse_encode_cloud_sync_protected_change_kind( + CloudSyncProtectedChangeKind self, + SseSerializer serializer, + ) { // Codec=Sse (Serialization based), see doc to use other codecs - sse_encode_pr_poster_content_material_style(self, serializer); + sse_encode_i_32(self.index, serializer); } @protected - void sse_encode_box_autoadd_push_message( - PushMessage self, SseSerializer serializer) { + void sse_encode_cloud_sync_protected_failure( + CloudSyncProtectedFailure self, + SseSerializer serializer, + ) { // Codec=Sse (Serialization based), see doc to use other codecs - sse_encode_push_message(self, serializer); + sse_encode_cloud_sync_protected_failure_category(self.category, serializer); + sse_encode_cloud_sync_protected_safe_code(self.safeCode, serializer); + sse_encode_opt_box_autoadd_u_64(self.retryAfterSeconds, serializer); } @protected - void sse_encode_box_autoadd_react_message( - ReactMessage self, SseSerializer serializer) { + void sse_encode_cloud_sync_protected_failure_category( + CloudSyncProtectedFailureCategory self, + SseSerializer serializer, + ) { // Codec=Sse (Serialization based), see doc to use other codecs - sse_encode_react_message(self, serializer); + sse_encode_i_32(self.index, serializer); } @protected - void sse_encode_box_autoadd_reaction( - Reaction self, SseSerializer serializer) { + void sse_encode_cloud_sync_protected_fetch_result( + CloudSyncProtectedFetchResult self, + SseSerializer serializer, + ) { // Codec=Sse (Serialization based), see doc to use other codecs - sse_encode_reaction(self, serializer); + sse_encode_opt_box_autoadd_cloud_sync_protected_page(self.page, serializer); + sse_encode_opt_box_autoadd_cloud_sync_protected_failure( + self.failure, + serializer, + ); } @protected - void - sse_encode_box_autoadd_record_shared_push_state_auto_owned_rust_opaque_flutter_rust_bridgefor_generated_rust_auto_opaque_inner_aps_watcher( - (SharedPushState, ApsWatcher) self, SseSerializer serializer) { + void sse_encode_cloud_sync_protected_garbage_collection( + CloudSyncProtectedGarbageCollection self, + SseSerializer serializer, + ) { // Codec=Sse (Serialization based), see doc to use other codecs - sse_encode_record_shared_push_state_auto_owned_rust_opaque_flutter_rust_bridgefor_generated_rust_auto_opaque_inner_aps_watcher( - self, serializer); + sse_encode_u_32(self.scannedCount, serializer); + sse_encode_u_32(self.firstObservedCount, serializer); + sse_encode_u_32(self.deletedCount, serializer); + sse_encode_u_32(self.preservedLiveCount, serializer); + sse_encode_u_32(self.preservedActiveLeaseCount, serializer); + sse_encode_bool(self.hasMore, serializer); } @protected - void sse_encode_box_autoadd_record_string_string( - (String, String) self, SseSerializer serializer) { + void sse_encode_cloud_sync_protected_garbage_collection_result( + CloudSyncProtectedGarbageCollectionResult self, + SseSerializer serializer, + ) { // Codec=Sse (Serialization based), see doc to use other codecs - sse_encode_record_string_string(self, serializer); + sse_encode_opt_box_autoadd_cloud_sync_protected_garbage_collection( + self.collection, + serializer, + ); + sse_encode_opt_box_autoadd_cloud_sync_protected_failure( + self.failure, + serializer, + ); } @protected - void sse_encode_box_autoadd_record_string_u_64( - (String, BigInt) self, SseSerializer serializer) { + void sse_encode_cloud_sync_protected_lease_result( + CloudSyncProtectedLeaseResult self, + SseSerializer serializer, + ) { // Codec=Sse (Serialization based), see doc to use other codecs - sse_encode_record_string_u_64(self, serializer); + sse_encode_opt_box_autoadd_cloud_sync_protected_failure( + self.failure, + serializer, + ); } @protected - void sse_encode_box_autoadd_register_state( - RegisterState self, SseSerializer serializer) { + void sse_encode_cloud_sync_protected_outbound_stage( + CloudSyncProtectedOutboundStage self, + SseSerializer serializer, + ) { // Codec=Sse (Serialization based), see doc to use other codecs - sse_encode_register_state(self, serializer); + sse_encode_String(self.logicalEntityKeyHash, serializer); + sse_encode_String(self.protectedPayloadReference, serializer); + sse_encode_String(self.payloadSha256, serializer); + sse_encode_u_64(self.payloadLength, serializer); + sse_encode_String(self.protectedServerRecordReference, serializer); + sse_encode_String(self.serverRecordIdHash, serializer); + sse_encode_String(self.leaseReference, serializer); } @protected - void sse_encode_box_autoadd_rename_message( - RenameMessage self, SseSerializer serializer) { + void sse_encode_cloud_sync_protected_outbound_stage_result( + CloudSyncProtectedOutboundStageResult self, + SseSerializer serializer, + ) { // Codec=Sse (Serialization based), see doc to use other codecs - sse_encode_rename_message(self, serializer); + sse_encode_opt_box_autoadd_cloud_sync_protected_outbound_stage( + self.stage, + serializer, + ); + sse_encode_opt_box_autoadd_cloud_sync_outbound_safe_code( + self.failure, + serializer, + ); } @protected - void sse_encode_box_autoadd_rich_link_image_attachment_substitute( - RichLinkImageAttachmentSubstitute self, SseSerializer serializer) { + void sse_encode_cloud_sync_protected_page( + CloudSyncProtectedPage self, + SseSerializer serializer, + ) { // Codec=Sse (Serialization based), see doc to use other codecs - sse_encode_rich_link_image_attachment_substitute(self, serializer); + sse_encode_list_cloud_sync_protected_change(self.changes, serializer); + sse_encode_String(self.batchId, serializer); + sse_encode_u_64(self.generation, serializer); + sse_encode_String(self.pageLeaseReference, serializer); + sse_encode_opt_String(self.protectedNextCheckpointReference, serializer); + sse_encode_bool(self.complete, serializer); + sse_encode_u_64(self.admittedRawBytes, serializer); } @protected - void sse_encode_box_autoadd_schedule_mode( - ScheduleMode self, SseSerializer serializer) { + void sse_encode_cloud_sync_protected_preflight_code( + CloudSyncProtectedPreflightCode self, + SseSerializer serializer, + ) { // Codec=Sse (Serialization based), see doc to use other codecs - sse_encode_schedule_mode(self, serializer); + sse_encode_i_32(self.index, serializer); } @protected - void sse_encode_box_autoadd_set_transcript_background_message( - SetTranscriptBackgroundMessage self, SseSerializer serializer) { + void sse_encode_cloud_sync_protected_recovery( + CloudSyncProtectedRecovery self, + SseSerializer serializer, + ) { // Codec=Sse (Serialization based), see doc to use other codecs - sse_encode_set_transcript_background_message(self, serializer); + sse_encode_list_String(self.finalizedAdoptedLeaseReferences, serializer); + sse_encode_list_String(self.absentAdoptedLeaseReferences, serializer); + sse_encode_u_32(self.rolledBackCount, serializer); + sse_encode_u_32(self.removedTemporaryFilesCount, serializer); + sse_encode_bool(self.hasMore, serializer); } @protected - void sse_encode_box_autoadd_share_profile_message( - ShareProfileMessage self, SseSerializer serializer) { + void sse_encode_cloud_sync_protected_recovery_result( + CloudSyncProtectedRecoveryResult self, + SseSerializer serializer, + ) { // Codec=Sse (Serialization based), see doc to use other codecs - sse_encode_share_profile_message(self, serializer); + sse_encode_opt_box_autoadd_cloud_sync_protected_recovery( + self.recovery, + serializer, + ); + sse_encode_opt_box_autoadd_cloud_sync_protected_failure( + self.failure, + serializer, + ); } @protected - void sse_encode_box_autoadd_shared_album( - SharedAlbum self, SseSerializer serializer) { + void sse_encode_cloud_sync_protected_retirement_result( + CloudSyncProtectedRetirementResult self, + SseSerializer serializer, + ) { // Codec=Sse (Serialization based), see doc to use other codecs - sse_encode_shared_album(self, serializer); + sse_encode_u_32(self.retiredCount, serializer); + sse_encode_opt_box_autoadd_cloud_sync_protected_failure( + self.failure, + serializer, + ); } @protected - void sse_encode_box_autoadd_shared_i_cloud_services( - SharedICloudServices self, SseSerializer serializer) { + void sse_encode_cloud_sync_protected_safe_code( + CloudSyncProtectedSafeCode self, + SseSerializer serializer, + ) { // Codec=Sse (Serialization based), see doc to use other codecs - sse_encode_shared_i_cloud_services(self, serializer); + sse_encode_i_32(self.index, serializer); } @protected - void sse_encode_box_autoadd_shared_poster( - SharedPoster self, SseSerializer serializer) { + void sse_encode_cloud_sync_raw_change( + CloudSyncRawChange self, + SseSerializer serializer, + ) { // Codec=Sse (Serialization based), see doc to use other codecs - sse_encode_shared_poster(self, serializer); + sse_encode_opt_String(self.recordName, serializer); + sse_encode_opt_String(self.recordType, serializer); + sse_encode_opt_box_autoadd_i_32(self.changeType, serializer); + sse_encode_opt_box_autoadd_cloud_sync_raw_system_fields( + self.systemFields, + serializer, + ); + sse_encode_opt_list_prim_u_8_strict(self.encryptedRecord, serializer); + sse_encode_opt_list_prim_u_8_strict(self.tombstonePayload, serializer); + sse_encode_cloud_sync_raw_record_kind(self.kind, serializer); } @protected - void sse_encode_box_autoadd_shared_push_state( - SharedPushState self, SseSerializer serializer) { + void sse_encode_cloud_sync_raw_failure( + CloudSyncRawFailure self, + SseSerializer serializer, + ) { // Codec=Sse (Serialization based), see doc to use other codecs - sse_encode_shared_push_state(self, serializer); + sse_encode_cloud_sync_raw_failure_category(self.category, serializer); + sse_encode_opt_box_autoadd_u_64(self.retryAfterSeconds, serializer); + sse_encode_String(self.safeCode, serializer); } @protected - void sse_encode_box_autoadd_simplified_incoming_call_poster( - SimplifiedIncomingCallPoster self, SseSerializer serializer) { + void sse_encode_cloud_sync_raw_failure_category( + CloudSyncRawFailureCategory self, + SseSerializer serializer, + ) { // Codec=Sse (Serialization based), see doc to use other codecs - sse_encode_simplified_incoming_call_poster(self, serializer); + sse_encode_i_32(self.index, serializer); } @protected - void sse_encode_box_autoadd_simplified_transcript_poster( - SimplifiedTranscriptPoster self, SseSerializer serializer) { + void sse_encode_cloud_sync_raw_fetch_result( + CloudSyncRawFetchResult self, + SseSerializer serializer, + ) { // Codec=Sse (Serialization based), see doc to use other codecs - sse_encode_simplified_transcript_poster(self, serializer); + sse_encode_opt_box_autoadd_cloud_sync_raw_page(self.page, serializer); + sse_encode_opt_box_autoadd_cloud_sync_raw_failure(self.failure, serializer); } @protected - void sse_encode_box_autoadd_status_kit_message( - StatusKitMessage self, SseSerializer serializer) { + void sse_encode_cloud_sync_raw_page( + CloudSyncRawPage self, + SseSerializer serializer, + ) { // Codec=Sse (Serialization based), see doc to use other codecs - sse_encode_status_kit_message(self, serializer); + sse_encode_list_cloud_sync_raw_change(self.changes, serializer); + sse_encode_opt_list_prim_u_8_strict(self.nextToken, serializer); + sse_encode_i_32(self.status, serializer); + sse_encode_bool(self.complete, serializer); } @protected - void sse_encode_box_autoadd_support_action( - SupportAction self, SseSerializer serializer) { + void sse_encode_cloud_sync_raw_record_kind( + CloudSyncRawRecordKind self, + SseSerializer serializer, + ) { // Codec=Sse (Serialization based), see doc to use other codecs - sse_encode_support_action(self, serializer); + sse_encode_i_32(self.index, serializer); } @protected - void sse_encode_box_autoadd_support_alert( - SupportAlert self, SseSerializer serializer) { + void sse_encode_cloud_sync_raw_system_fields( + CloudSyncRawSystemFields self, + SseSerializer serializer, + ) { // Codec=Sse (Serialization based), see doc to use other codecs - sse_encode_support_alert(self, serializer); + sse_encode_opt_String(self.etag, serializer); + sse_encode_opt_box_autoadd_f_64(self.createdAt, serializer); + sse_encode_opt_box_autoadd_f_64(self.modifiedAt, serializer); + sse_encode_opt_box_autoadd_u_32(self.permission, serializer); } @protected - void sse_encode_box_autoadd_teardown_sign_in( - TeardownSignIn self, SseSerializer serializer) { + void sse_encode_cloud_sync_transient_association_kind( + CloudSyncTransientAssociationKind self, + SseSerializer serializer, + ) { // Codec=Sse (Serialization based), see doc to use other codecs - sse_encode_teardown_sign_in(self, serializer); + sse_encode_i_32(self.index, serializer); } @protected - void sse_encode_box_autoadd_text_flags( - TextFlags self, SseSerializer serializer) { + void sse_encode_cloud_sync_transient_attachment_payload( + CloudSyncTransientAttachmentPayload self, + SseSerializer serializer, + ) { // Codec=Sse (Serialization based), see doc to use other codecs - sse_encode_text_flags(self, serializer); + sse_encode_String(self.logicalEntityKeyHash, serializer); + sse_encode_String(self.canonicalGuid, serializer); + sse_encode_opt_String(self.ownerLogicalKeyHash, serializer); + sse_encode_opt_String(self.ownerCanonicalGuid, serializer); + sse_encode_opt_box_autoadd_u_32(self.ownerPart, serializer); + sse_encode_cloud_sync_transient_field_state(self.utiState, serializer); + sse_encode_opt_String(self.uti, serializer); + sse_encode_cloud_sync_transient_field_state(self.fileNameState, serializer); + sse_encode_opt_String(self.fileName, serializer); + sse_encode_cloud_sync_transient_field_state(self.mimeTypeState, serializer); + sse_encode_opt_String(self.mimeType, serializer); + sse_encode_cloud_sync_transient_field_state( + self.totalBytesState, + serializer, + ); + sse_encode_opt_box_autoadd_u_64(self.totalBytes, serializer); + sse_encode_cloud_sync_transient_field_state( + self.isOutgoingState, + serializer, + ); + sse_encode_opt_box_autoadd_bool(self.isOutgoing, serializer); + sse_encode_cloud_sync_transient_field_state( + self.protectedLocalReferenceState, + serializer, + ); + sse_encode_opt_String(self.protectedLocalReference, serializer); } @protected - void sse_encode_box_autoadd_text_format( - TextFormat self, SseSerializer serializer) { + void sse_encode_cloud_sync_transient_attributed_body( + CloudSyncTransientAttributedBody self, + SseSerializer serializer, + ) { // Codec=Sse (Serialization based), see doc to use other codecs - sse_encode_text_format(self, serializer); + sse_encode_String(self.text, serializer); + sse_encode_list_cloud_sync_transient_text_run(self.runs, serializer); } @protected - void sse_encode_box_autoadd_transcript_dynamic_user_data( - TranscriptDynamicUserData self, SseSerializer serializer) { + void sse_encode_cloud_sync_transient_chat_payload( + CloudSyncTransientChatPayload self, + SseSerializer serializer, + ) { // Codec=Sse (Serialization based), see doc to use other codecs - sse_encode_transcript_dynamic_user_data(self, serializer); + sse_encode_String(self.logicalEntityKeyHash, serializer); + sse_encode_String(self.canonicalGuid, serializer); + sse_encode_String(self.chatIdentifier, serializer); + sse_encode_String(self.groupId, serializer); + sse_encode_String(self.originalGroupId, serializer); + sse_encode_cloud_sync_transient_service(self.service, serializer); + sse_encode_cloud_sync_transient_chat_style(self.style, serializer); + sse_encode_list_String(self.participantHandles, serializer); + sse_encode_cloud_sync_transient_field_state( + self.displayNameState, + serializer, + ); + sse_encode_opt_String(self.displayName, serializer); + sse_encode_cloud_sync_transient_field_state( + self.lastAddressedHandleState, + serializer, + ); + sse_encode_opt_String(self.lastAddressedHandle, serializer); + sse_encode_cloud_sync_transient_field_state( + self.groupVersionState, + serializer, + ); + sse_encode_opt_box_autoadd_u_32(self.groupVersion, serializer); + sse_encode_cloud_sync_transient_field_state( + self.lastSeenMessageGuidState, + serializer, + ); + sse_encode_opt_String(self.lastSeenMessageGuid, serializer); + sse_encode_cloud_sync_transient_field_state( + self.groupPhotoGuidState, + serializer, + ); + sse_encode_opt_String(self.groupPhotoGuid, serializer); } @protected - void sse_encode_box_autoadd_typing_app( - TypingApp self, SseSerializer serializer) { + void sse_encode_cloud_sync_transient_chat_style( + CloudSyncTransientChatStyle self, + SseSerializer serializer, + ) { // Codec=Sse (Serialization based), see doc to use other codecs - sse_encode_typing_app(self, serializer); + sse_encode_i_32(self.index, serializer); } @protected - void sse_encode_box_autoadd_u_32(int self, SseSerializer serializer) { + void sse_encode_cloud_sync_transient_decode_result( + CloudSyncTransientDecodeResult self, + SseSerializer serializer, + ) { // Codec=Sse (Serialization based), see doc to use other codecs - sse_encode_u_32(self, serializer); + sse_encode_opt_String(self.protectedSourceReference, serializer); + sse_encode_u_64(self.generation, serializer); + sse_encode_opt_String(self.changeId, serializer); + sse_encode_opt_box_autoadd_cloud_sync_transient_entity_kind( + self.entityKind, + serializer, + ); + sse_encode_opt_box_autoadd_cloud_sync_transient_mutation_kind( + self.mutationKind, + serializer, + ); + sse_encode_opt_box_autoadd_cloud_sync_transient_snapshot( + self.snapshot, + serializer, + ); + sse_encode_opt_box_autoadd_cloud_sync_transient_payload( + self.payload, + serializer, + ); + sse_encode_opt_box_autoadd_cloud_sync_transient_tombstone( + self.tombstone, + serializer, + ); + sse_encode_opt_box_autoadd_cloud_sync_transient_deferred_reason( + self.deferredReason, + serializer, + ); + sse_encode_opt_box_autoadd_cloud_sync_transient_quarantine_reason( + self.quarantineReason, + serializer, + ); + sse_encode_opt_box_autoadd_cloud_sync_transient_failure_code( + self.failureCode, + serializer, + ); } @protected - void sse_encode_box_autoadd_u_64(BigInt self, SseSerializer serializer) { + void sse_encode_cloud_sync_transient_deferred_reason( + CloudSyncTransientDeferredReason self, + SseSerializer serializer, + ) { // Codec=Sse (Serialization based), see doc to use other codecs - sse_encode_u_64(self, serializer); + sse_encode_i_32(self.index, serializer); } @protected - void sse_encode_box_autoadd_unsend_message( - UnsendMessage self, SseSerializer serializer) { + void sse_encode_cloud_sync_transient_edit_part( + CloudSyncTransientEditPart self, + SseSerializer serializer, + ) { // Codec=Sse (Serialization based), see doc to use other codecs - sse_encode_unsend_message(self, serializer); + sse_encode_String(self.partKeyHash, serializer); + sse_encode_u_32(self.revision, serializer); + sse_encode_String(self.contentDigest, serializer); + sse_encode_i_64(self.modifiedAtMillis, serializer); } @protected - void sse_encode_box_autoadd_update_account_finish( - UpdateAccountFinish self, SseSerializer serializer) { + void sse_encode_cloud_sync_transient_entity_kind( + CloudSyncTransientEntityKind self, + SseSerializer serializer, + ) { // Codec=Sse (Serialization based), see doc to use other codecs - sse_encode_update_account_finish(self, serializer); + sse_encode_i_32(self.index, serializer); } @protected - void sse_encode_box_autoadd_update_extension_message( - UpdateExtensionMessage self, SseSerializer serializer) { + void sse_encode_cloud_sync_transient_failure_code( + CloudSyncTransientFailureCode self, + SseSerializer serializer, + ) { // Codec=Sse (Serialization based), see doc to use other codecs - sse_encode_update_extension_message(self, serializer); + sse_encode_i_32(self.index, serializer); } @protected - void sse_encode_box_autoadd_update_profile_message( - UpdateProfileMessage self, SseSerializer serializer) { + void sse_encode_cloud_sync_transient_field_state( + CloudSyncTransientFieldState self, + SseSerializer serializer, + ) { // Codec=Sse (Serialization based), see doc to use other codecs - sse_encode_update_profile_message(self, serializer); + sse_encode_i_32(self.index, serializer); } @protected - void sse_encode_box_autoadd_update_profile_sharing_message( - UpdateProfileSharingMessage self, SseSerializer serializer) { + void sse_encode_cloud_sync_transient_group_photo_payload( + CloudSyncTransientGroupPhotoPayload self, + SseSerializer serializer, + ) { // Codec=Sse (Serialization based), see doc to use other codecs - sse_encode_update_profile_sharing_message(self, serializer); + sse_encode_String(self.logicalEntityKeyHash, serializer); + sse_encode_String(self.ownerLogicalKeyHash, serializer); + sse_encode_String(self.photoGuid, serializer); + sse_encode_String(self.protectedLocalReference, serializer); } @protected - void sse_encode_box_autoadd_wifi_password( - WifiPassword self, SseSerializer serializer) { + void sse_encode_cloud_sync_transient_known_message_flags( + CloudSyncTransientKnownMessageFlags self, + SseSerializer serializer, + ) { // Codec=Sse (Serialization based), see doc to use other codecs - sse_encode_wifi_password(self, serializer); + sse_encode_bool(self.fromMe, serializer); + sse_encode_bool(self.delivered, serializer); + sse_encode_bool(self.read, serializer); + sse_encode_bool(self.hasDataDetectorResults, serializer); + sse_encode_bool(self.deliveredQuietly, serializer); + sse_encode_bool(self.didNotifyRecipient, serializer); } @protected - void sse_encode_certified_context( - CertifiedContext self, SseSerializer serializer) { + void sse_encode_cloud_sync_transient_message_edit( + CloudSyncTransientMessageEdit self, + SseSerializer serializer, + ) { // Codec=Sse (Serialization based), see doc to use other codecs - sse_encode_u_32(self.version, serializer); - sse_encode_list_prim_u_8_strict(self.receipt, serializer); - sse_encode_String(self.sender, serializer); - sse_encode_String(self.target, serializer); - sse_encode_list_prim_u_8_strict(self.uuid, serializer); - sse_encode_list_prim_u_8_strict(self.token, serializer); + sse_encode_u_32(self.part_, serializer); + sse_encode_u_32(self.revision, serializer); + sse_encode_list_cloud_sync_transient_attributed_body( + self.bodies, + serializer, + ); + sse_encode_i_64(self.modifiedAtMillis, serializer); + sse_encode_opt_box_autoadd_u_32(self.originalRangeLocation, serializer); + sse_encode_opt_box_autoadd_u_32(self.originalRangeLength, serializer); } @protected - void sse_encode_change_participant_message( - ChangeParticipantMessage self, SseSerializer serializer) { + void sse_encode_cloud_sync_transient_message_payload( + CloudSyncTransientMessagePayload self, + SseSerializer serializer, + ) { // Codec=Sse (Serialization based), see doc to use other codecs - sse_encode_list_String(self.newParticipants, serializer); - sse_encode_CastedPrimitive_u_64(self.groupVersion, serializer); + sse_encode_String(self.logicalEntityKeyHash, serializer); + sse_encode_String(self.canonicalGuid, serializer); + sse_encode_String(self.chatAliasKeyHash, serializer); + sse_encode_String(self.chatIdentifier, serializer); + sse_encode_String(self.senderHandle, serializer); + sse_encode_i_64(self.createdAtMillis, serializer); + sse_encode_i_64(self.error, serializer); + sse_encode_cloud_sync_transient_service(self.service, serializer); + sse_encode_cloud_sync_transient_field_state(self.subjectState, serializer); + sse_encode_opt_String(self.subject, serializer); + sse_encode_cloud_sync_transient_field_state(self.bodyState, serializer); + sse_encode_opt_String(self.body, serializer); + sse_encode_cloud_sync_transient_field_state( + self.attributedBodiesState, + serializer, + ); + sse_encode_list_cloud_sync_transient_attributed_body( + self.attributedBodies, + serializer, + ); + sse_encode_cloud_sync_transient_field_state( + self.balloonBundleIdState, + serializer, + ); + sse_encode_opt_String(self.balloonBundleId, serializer); + sse_encode_cloud_sync_transient_field_state(self.effectState, serializer); + sse_encode_opt_String(self.effect, serializer); + sse_encode_cloud_sync_transient_field_state( + self.readAtMillisState, + serializer, + ); + sse_encode_opt_box_autoadd_i_64(self.readAtMillis, serializer); + sse_encode_cloud_sync_transient_field_state( + self.deliveredAtMillisState, + serializer, + ); + sse_encode_opt_box_autoadd_i_64(self.deliveredAtMillis, serializer); + sse_encode_cloud_sync_transient_known_message_flags( + self.knownFlags, + serializer, + ); + sse_encode_cloud_sync_transient_association_kind( + self.associationKind, + serializer, + ); + sse_encode_opt_box_autoadd_cloud_sync_transient_reaction_kind( + self.reactionKind, + serializer, + ); + sse_encode_bool(self.reactionRemoved, serializer); + sse_encode_opt_String(self.reactionParentLogicalKeyHash, serializer); + sse_encode_opt_String(self.reactionParentCanonicalGuid, serializer); + sse_encode_opt_box_autoadd_u_32(self.reactionParentPart, serializer); + sse_encode_opt_box_autoadd_u_32(self.associatedRangeLocation, serializer); + sse_encode_opt_box_autoadd_u_32(self.associatedRangeLength, serializer); + sse_encode_opt_String(self.replyParentLogicalKeyHash, serializer); + sse_encode_opt_String(self.replyParentCanonicalGuid, serializer); + sse_encode_opt_String(self.replyParentPart, serializer); + sse_encode_cloud_sync_transient_field_state(self.editsState, serializer); + sse_encode_list_cloud_sync_transient_message_edit(self.edits, serializer); + sse_encode_cloud_sync_transient_field_state( + self.retractedPartsState, + serializer, + ); + sse_encode_list_prim_u_32_strict(self.retractedParts, serializer); + sse_encode_cloud_sync_transient_field_state( + self.associatedEmojiState, + serializer, + ); + sse_encode_opt_String(self.associatedEmoji, serializer); } @protected - void sse_encode_chat_proto(ChatProto self, SseSerializer serializer) { + void sse_encode_cloud_sync_transient_mutation_kind( + CloudSyncTransientMutationKind self, + SseSerializer serializer, + ) { // Codec=Sse (Serialization based), see doc to use other codecs - sse_encode_opt_box_autoadd_u_32(self.unk1, serializer); + sse_encode_i_32(self.index, serializer); } @protected - void sse_encode_cloud_attachment( - CloudAttachment self, SseSerializer serializer) { + void sse_encode_cloud_sync_transient_payload( + CloudSyncTransientPayload self, + SseSerializer serializer, + ) { // Codec=Sse (Serialization based), see doc to use other codecs - sse_encode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerGZipWrapperAttachmentMeta( - self.cm, serializer); - sse_encode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerAsset( - self.lqa, serializer); + sse_encode_opt_box_autoadd_cloud_sync_transient_chat_payload( + self.chat, + serializer, + ); + sse_encode_opt_box_autoadd_cloud_sync_transient_message_payload( + self.message, + serializer, + ); + sse_encode_opt_box_autoadd_cloud_sync_transient_attachment_payload( + self.attachment, + serializer, + ); + sse_encode_opt_box_autoadd_cloud_sync_transient_group_photo_payload( + self.groupPhoto, + serializer, + ); } @protected - void sse_encode_cloud_chat(CloudChat self, SseSerializer serializer) { + void sse_encode_cloud_sync_transient_quarantine_reason( + CloudSyncTransientQuarantineReason self, + SseSerializer serializer, + ) { // Codec=Sse (Serialization based), see doc to use other codecs - sse_encode_i_64(self.style, serializer); - sse_encode_i_64(self.isFiltered, serializer); - sse_encode_i_64(self.successfulQuery, serializer); - sse_encode_i_64(self.state, serializer); - sse_encode_String(self.chatIdentifier, serializer); - sse_encode_String(self.groupId, serializer); - sse_encode_String(self.serviceName, serializer); - sse_encode_String(self.originalGroupId, serializer); - sse_encode_opt_box_autoadd_cloud_prop(self.properties, serializer); - sse_encode_list_cloud_participant(self.participants, serializer); - sse_encode_cloud_prop_001(self.prop001, serializer); - sse_encode_i_64(self.lastReadMessageTimestamp, serializer); - sse_encode_String(self.lastAddressedHandle, serializer); - sse_encode_String(self.guid, serializer); - sse_encode_opt_String(self.displayName, serializer); - sse_encode_opt_box_autoadd_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerGZipWrapperChatProto( - self.proto001, serializer); - sse_encode_opt_String(self.groupPhotoGuid, serializer); - sse_encode_opt_box_autoadd_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerAsset( - self.groupPhoto, serializer); + sse_encode_i_32(self.index, serializer); } @protected - void sse_encode_cloud_message(CloudMessage self, SseSerializer serializer) { + void sse_encode_cloud_sync_transient_reaction_kind( + CloudSyncTransientReactionKind self, + SseSerializer serializer, + ) { // Codec=Sse (Serialization based), see doc to use other codecs - sse_encode_opt_box_autoadd_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerSystemTime( - self.utm, serializer); - sse_encode_i_64(self.type, serializer); - sse_encode_i_64(self.error, serializer); - sse_encode_String(self.chatId, serializer); - sse_encode_String(self.sender, serializer); - sse_encode_i_64(self.time, serializer); - sse_encode_opt_box_autoadd_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerGZipWrapperMessageProto2( - self.msgProto2, serializer); - sse_encode_String(self.destinationCallerId, serializer); - sse_encode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerGZipWrapperMessageProto( - self.msgProto, serializer); - sse_encode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerMessageFlags( - self.flags, serializer); - sse_encode_String(self.guid, serializer); - sse_encode_opt_box_autoadd_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerGZipWrapperMessageProto3( - self.msgProto3, serializer); - sse_encode_String(self.service, serializer); - sse_encode_opt_box_autoadd_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerGZipWrapperMessageProto4( - self.msgProto4, serializer); + sse_encode_i_32(self.index, serializer); } @protected - void sse_encode_cloud_message_summary( - CloudMessageSummary self, SseSerializer serializer) { + void sse_encode_cloud_sync_transient_service( + CloudSyncTransientService self, + SseSerializer serializer, + ) { // Codec=Sse (Serialization based), see doc to use other codecs - sse_encode_list_prim_i_64_strict(self.messagesSummary, serializer); - sse_encode_list_prim_i_64_strict(self.chatSummary, serializer); - sse_encode_list_prim_i_64_strict(self.attachmentSummary, serializer); + sse_encode_i_32(self.index, serializer); } @protected - void sse_encode_cloud_participant( - CloudParticipant self, SseSerializer serializer) { + void sse_encode_cloud_sync_transient_snapshot( + CloudSyncTransientSnapshot self, + SseSerializer serializer, + ) { // Codec=Sse (Serialization based), see doc to use other codecs - sse_encode_String(self.uri, serializer); + sse_encode_cloud_sync_transient_entity_kind(self.entityKind, serializer); + sse_encode_String(self.logicalEntityKeyHash, serializer); + sse_encode_opt_String(self.parentLogicalKeyHash, serializer); + sse_encode_opt_String(self.immutableContentDigest, serializer); + sse_encode_opt_box_autoadd_i_64(self.createdAtMillis, serializer); + sse_encode_opt_box_autoadd_i_64(self.readAtMillis, serializer); + sse_encode_opt_box_autoadd_i_64(self.deliveredAtMillis, serializer); + sse_encode_list_cloud_sync_transient_edit_part(self.editParts, serializer); + sse_encode_opt_box_autoadd_i_64(self.retractedAtMillis, serializer); + sse_encode_opt_box_autoadd_u_32(self.groupVersion, serializer); + sse_encode_opt_String(self.groupMetadataDigest, serializer); + sse_encode_opt_String(self.etagHash, serializer); + sse_encode_String(self.protectedSourceReference, serializer); } @protected - void sse_encode_cloud_prop(CloudProp self, SseSerializer serializer) { + void sse_encode_cloud_sync_transient_text_run( + CloudSyncTransientTextRun self, + SseSerializer serializer, + ) { // Codec=Sse (Serialization based), see doc to use other codecs - sse_encode_opt_box_autoadd_u_32(self.gpufc, serializer); - sse_encode_opt_box_autoadd_u_32(self.pv, serializer); - sse_encode_opt_box_autoadd_u_32( - self.numberOfTimesRespondedtoThread, serializer); - sse_encode_opt_box_autoadd_bool(self.shouldForceToSms, serializer); - sse_encode_opt_String(self.lastSeenMessageGuid, serializer); - sse_encode_opt_box_autoadd_u_32(self.messageHandshakeState, serializer); - sse_encode_list_String(self.legacyGroupIdentifiers, serializer); - sse_encode_opt_String(self.groupPhotoGuid, serializer); - sse_encode_opt_box_autoadd_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerDate( - self.lastModificationDate, serializer); + sse_encode_u_32(self.startUtf16, serializer); + sse_encode_u_32(self.lengthUtf16, serializer); + sse_encode_opt_box_autoadd_u_32(self.messagePart, serializer); + sse_encode_opt_String(self.attachmentCanonicalGuid, serializer); + sse_encode_opt_String(self.attachmentLogicalKeyHash, serializer); + sse_encode_opt_String(self.mentionHandle, serializer); + sse_encode_opt_String(self.audioTranscript, serializer); + sse_encode_opt_box_autoadd_i_64(self.textEffect, serializer); + sse_encode_opt_box_autoadd_bool(self.bold, serializer); + sse_encode_opt_box_autoadd_bool(self.italic, serializer); + sse_encode_opt_box_autoadd_bool(self.strikethrough, serializer); + sse_encode_opt_box_autoadd_bool(self.underline, serializer); } @protected - void sse_encode_cloud_prop_001(CloudProp001 self, SseSerializer serializer) { + void sse_encode_cloud_sync_transient_tombstone( + CloudSyncTransientTombstone self, + SseSerializer serializer, + ) { // Codec=Sse (Serialization based), see doc to use other codecs - sse_encode_u_32(self.syndicationType, serializer); + sse_encode_cloud_sync_transient_entity_kind(self.entityKind, serializer); + sse_encode_String(self.logicalEntityKeyHash, serializer); + sse_encode_opt_box_autoadd_i_64(self.deletedAtMillis, serializer); + sse_encode_bool(self.serverConfirmed, serializer); } @protected void sse_encode_conversation_data( - ConversationData self, SseSerializer serializer) { + ConversationData self, + SseSerializer serializer, + ) { // Codec=Sse (Serialization based), see doc to use other codecs sse_encode_list_String(self.participants, serializer); sse_encode_opt_String(self.cvName, serializer); @@ -27128,7 +37339,9 @@ class RustLibApiImpl extends RustLibApiImplPlatform implements RustLibApi { // Codec=Sse (Serialization based), see doc to use other codecs sse_encode_beacon_naming_record(self.naming, serializer); sse_encode_opt_box_autoadd_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerLocationReport( - self.lastReport, serializer); + self.lastReport, + serializer, + ); sse_encode_CastedPrimitive_i_64(self.productId, serializer); sse_encode_opt_CastedPrimitive_i_64(self.batteryLevel, serializer); sse_encode_CastedPrimitive_i_64(self.vendorId, serializer); @@ -27140,7 +37353,9 @@ class RustLibApiImpl extends RustLibApiImplPlatform implements RustLibApi { @protected void sse_encode_dart_beacon_share_info( - DartBeaconShareInfo self, SseSerializer serializer) { + DartBeaconShareInfo self, + SseSerializer serializer, + ) { // Codec=Sse (Serialization based), see doc to use other codecs sse_encode_String(self.shareId, serializer); sse_encode_CastedPrimitive_i_64(self.acceptanceState, serializer); @@ -27210,7 +37425,9 @@ class RustLibApiImpl extends RustLibApiImplPlatform implements RustLibApi { @protected void sse_encode_ffi_file_packager( - FFIFilePackager self, SseSerializer serializer) { + FFIFilePackager self, + SseSerializer serializer, + ) { // Codec=Sse (Serialization based), see doc to use other codecs } @@ -27295,21 +37512,21 @@ class RustLibApiImpl extends RustLibApiImplPlatform implements RustLibApi { sse_encode_i_32(1, serializer); sse_encode_String(guid, serializer); case FTMessage_JoinEvent( - guid: final guid, - participant: final participant, - handle: final handle, - ring: final ring - ): + guid: final guid, + participant: final participant, + handle: final handle, + ring: final ring, + ): sse_encode_i_32(2, serializer); sse_encode_String(guid, serializer); sse_encode_u_64(participant, serializer); sse_encode_String(handle, serializer); sse_encode_bool(ring, serializer); case FTMessage_AddMembers( - guid: final guid, - members: final members, - ring: final ring - ): + guid: final guid, + members: final members, + ring: final ring, + ): sse_encode_i_32(3, serializer); sse_encode_String(guid, serializer); sse_encode_Set_ft_member(members, serializer); @@ -27319,10 +37536,10 @@ class RustLibApiImpl extends RustLibApiImplPlatform implements RustLibApi { sse_encode_String(guid, serializer); sse_encode_Set_ft_member(members, serializer); case FTMessage_LeaveEvent( - guid: final guid, - participant: final participant, - handle: final handle - ): + guid: final guid, + participant: final participant, + handle: final handle, + ): sse_encode_i_32(5, serializer); sse_encode_String(guid, serializer); sse_encode_u_64(participant, serializer); @@ -27355,7 +37572,9 @@ class RustLibApiImpl extends RustLibApiImplPlatform implements RustLibApi { sse_encode_CastedPrimitive_u_64(self.participantId, serializer); sse_encode_opt_CastedPrimitive_u_64(self.lastJoinDate, serializer); sse_encode_opt_box_autoadd_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerConversationParticipant( - self.active, serializer); + self.active, + serializer, + ); } @protected @@ -27365,7 +37584,9 @@ class RustLibApiImpl extends RustLibApiImplPlatform implements RustLibApi { sse_encode_list_String(self.myHandles, serializer); sse_encode_Map_String_ft_participant(self.participants, serializer); sse_encode_opt_box_autoadd_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerConversationLink( - self.link, serializer); + self.link, + serializer, + ); sse_encode_Set_ft_member(self.members, serializer); sse_encode_String(self.reportId, serializer); sse_encode_opt_CastedPrimitive_u_64(self.startTime, serializer); @@ -27374,7 +37595,9 @@ class RustLibApiImpl extends RustLibApiImplPlatform implements RustLibApi { sse_encode_bool(self.isRingingInaccurate, serializer); sse_encode_opt_box_autoadd_ft_mode(self.mode, serializer); sse_encode_Map_String_CastedPrimitive_u_64( - self.recentMemberAdds, serializer); + self.recentMemberAdds, + serializer, + ); } @protected @@ -27387,7 +37610,9 @@ class RustLibApiImpl extends RustLibApiImplPlatform implements RustLibApi { @protected void sse_encode_group_summary_member( - GroupSummaryMember self, SseSerializer serializer) { + GroupSummaryMember self, + SseSerializer serializer, + ) { // Codec=Sse (Serialization based), see doc to use other codecs sse_encode_opt_String(self.name, serializer); sse_encode_String(self.handle, serializer); @@ -27419,7 +37644,9 @@ class RustLibApiImpl extends RustLibApiImplPlatform implements RustLibApi { @protected void sse_encode_i_message_name_record( - IMessageNameRecord self, SseSerializer serializer) { + IMessageNameRecord self, + SseSerializer serializer, + ) { // Codec=Sse (Serialization based), see doc to use other codecs sse_encode_String(self.name, serializer); sse_encode_String(self.first, serializer); @@ -27428,7 +37655,9 @@ class RustLibApiImpl extends RustLibApiImplPlatform implements RustLibApi { @protected void sse_encode_i_message_nickname_record( - IMessageNicknameRecord self, SseSerializer serializer) { + IMessageNicknameRecord self, + SseSerializer serializer, + ) { // Codec=Sse (Serialization based), see doc to use other codecs sse_encode_i_message_name_record(self.name, serializer); sse_encode_opt_list_prim_u_8_strict(self.image, serializer); @@ -27437,7 +37666,9 @@ class RustLibApiImpl extends RustLibApiImplPlatform implements RustLibApi { @protected void sse_encode_i_message_poster_record( - IMessagePosterRecord self, SseSerializer serializer) { + IMessagePosterRecord self, + SseSerializer serializer, + ) { // Codec=Sse (Serialization based), see doc to use other codecs sse_encode_list_prim_u_8_strict(self.lowResPoster, serializer); sse_encode_list_prim_u_8_strict(self.package, serializer); @@ -27446,7 +37677,9 @@ class RustLibApiImpl extends RustLibApiImplPlatform implements RustLibApi { @protected void sse_encode_icon_change_message( - IconChangeMessage self, SseSerializer serializer) { + IconChangeMessage self, + SseSerializer serializer, + ) { // Codec=Sse (Serialization based), see doc to use other codecs sse_encode_opt_box_autoadd_mmcs_file(self.file, serializer); sse_encode_CastedPrimitive_u_64(self.groupVersion, serializer); @@ -27454,7 +37687,9 @@ class RustLibApiImpl extends RustLibApiImplPlatform implements RustLibApi { @protected void sse_encode_idms_circle_message( - IdmsCircleMessage self, SseSerializer serializer) { + IdmsCircleMessage self, + SseSerializer serializer, + ) { // Codec=Sse (Serialization based), see doc to use other codecs sse_encode_u_32(self.step, serializer); sse_encode_String(self.atxnid, serializer); @@ -27474,9 +37709,9 @@ class RustLibApiImpl extends RustLibApiImplPlatform implements RustLibApi { sse_encode_i_32(1, serializer); sse_encode_box_autoadd_teardown_sign_in(field0, serializer); case IdmsMessage_CircleRequest( - field0: final field0, - field1: final field1 - ): + field0: final field0, + field1: final field1, + ): sse_encode_i_32(2, serializer); sse_encode_box_autoadd_idms_circle_message(field0, serializer); sse_encode_opt_box_autoadd_idms_requested_sign_in(field1, serializer); @@ -27487,7 +37722,9 @@ class RustLibApiImpl extends RustLibApiImplPlatform implements RustLibApi { @protected void sse_encode_idms_requested_sign_in( - IdmsRequestedSignIn self, SseSerializer serializer) { + IdmsRequestedSignIn self, + SseSerializer serializer, + ) { // Codec=Sse (Serialization based), see doc to use other codecs sse_encode_aps_data(self.aps, serializer); sse_encode_String(self.txnid, serializer); @@ -27497,7 +37734,9 @@ class RustLibApiImpl extends RustLibApiImplPlatform implements RustLibApi { @protected void sse_encode_indexed_message_part( - IndexedMessagePart self, SseSerializer serializer) { + IndexedMessagePart self, + SseSerializer serializer, + ) { // Codec=Sse (Serialization based), see doc to use other codecs sse_encode_message_part(self.part_, serializer); sse_encode_opt_CastedPrimitive_usize(self.idx, serializer); @@ -27506,7 +37745,9 @@ class RustLibApiImpl extends RustLibApiImplPlatform implements RustLibApi { @protected void sse_encode_let_me_in_request( - LetMeInRequest self, SseSerializer serializer) { + LetMeInRequest self, + SseSerializer serializer, + ) { // Codec=Sse (Serialization based), see doc to use other codecs sse_encode_list_prim_u_8_strict(self.sharedSecret, serializer); sse_encode_String(self.pseud, serializer); @@ -27526,37 +37767,49 @@ class RustLibApiImpl extends RustLibApiImplPlatform implements RustLibApi { @protected void - sse_encode_list_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerIDSUser( - List self, SseSerializer serializer) { + sse_encode_list_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerIDSUser( + List self, + SseSerializer serializer, + ) { // Codec=Sse (Serialization based), see doc to use other codecs sse_encode_i_32(self.length, serializer); for (final item in self) { sse_encode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerIDSUser( - item, serializer); + item, + serializer, + ); } } @protected void - sse_encode_list_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerStCollapsedValue( - List self, SseSerializer serializer) { + sse_encode_list_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerStCollapsedValue( + List self, + SseSerializer serializer, + ) { // Codec=Sse (Serialization based), see doc to use other codecs sse_encode_i_32(self.length, serializer); for (final item in self) { sse_encode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerStCollapsedValue( - item, serializer); + item, + serializer, + ); } } @protected void - sse_encode_list_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerViableBottle( - List self, SseSerializer serializer) { + sse_encode_list_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerViableBottle( + List self, + SseSerializer serializer, + ) { // Codec=Sse (Serialization based), see doc to use other codecs sse_encode_i_32(self.length, serializer); for (final item in self) { sse_encode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerViableBottle( - item, serializer); + item, + serializer, + ); } } @@ -27571,7 +37824,9 @@ class RustLibApiImpl extends RustLibApiImplPlatform implements RustLibApi { @protected void sse_encode_list_cloud_participant( - List self, SseSerializer serializer) { + List self, + SseSerializer serializer, + ) { // Codec=Sse (Serialization based), see doc to use other codecs sse_encode_i_32(self.length, serializer); for (final item in self) { @@ -27579,9 +37834,107 @@ class RustLibApiImpl extends RustLibApiImplPlatform implements RustLibApi { } } + @protected + void sse_encode_list_cloud_sync_outbound_save_outcome( + List self, + SseSerializer serializer, + ) { + // Codec=Sse (Serialization based), see doc to use other codecs + sse_encode_i_32(self.length, serializer); + for (final item in self) { + sse_encode_cloud_sync_outbound_save_outcome(item, serializer); + } + } + + @protected + void sse_encode_list_cloud_sync_prepared_message_create_input( + List self, + SseSerializer serializer, + ) { + // Codec=Sse (Serialization based), see doc to use other codecs + sse_encode_i_32(self.length, serializer); + for (final item in self) { + sse_encode_cloud_sync_prepared_message_create_input(item, serializer); + } + } + + @protected + void sse_encode_list_cloud_sync_protected_change( + List self, + SseSerializer serializer, + ) { + // Codec=Sse (Serialization based), see doc to use other codecs + sse_encode_i_32(self.length, serializer); + for (final item in self) { + sse_encode_cloud_sync_protected_change(item, serializer); + } + } + + @protected + void sse_encode_list_cloud_sync_raw_change( + List self, + SseSerializer serializer, + ) { + // Codec=Sse (Serialization based), see doc to use other codecs + sse_encode_i_32(self.length, serializer); + for (final item in self) { + sse_encode_cloud_sync_raw_change(item, serializer); + } + } + + @protected + void sse_encode_list_cloud_sync_transient_attributed_body( + List self, + SseSerializer serializer, + ) { + // Codec=Sse (Serialization based), see doc to use other codecs + sse_encode_i_32(self.length, serializer); + for (final item in self) { + sse_encode_cloud_sync_transient_attributed_body(item, serializer); + } + } + + @protected + void sse_encode_list_cloud_sync_transient_edit_part( + List self, + SseSerializer serializer, + ) { + // Codec=Sse (Serialization based), see doc to use other codecs + sse_encode_i_32(self.length, serializer); + for (final item in self) { + sse_encode_cloud_sync_transient_edit_part(item, serializer); + } + } + + @protected + void sse_encode_list_cloud_sync_transient_message_edit( + List self, + SseSerializer serializer, + ) { + // Codec=Sse (Serialization based), see doc to use other codecs + sse_encode_i_32(self.length, serializer); + for (final item in self) { + sse_encode_cloud_sync_transient_message_edit(item, serializer); + } + } + + @protected + void sse_encode_list_cloud_sync_transient_text_run( + List self, + SseSerializer serializer, + ) { + // Codec=Sse (Serialization based), see doc to use other codecs + sse_encode_i_32(self.length, serializer); + for (final item in self) { + sse_encode_cloud_sync_transient_text_run(item, serializer); + } + } + @protected void sse_encode_list_dart_beacon( - List self, SseSerializer serializer) { + List self, + SseSerializer serializer, + ) { // Codec=Sse (Serialization based), see doc to use other codecs sse_encode_i_32(self.length, serializer); for (final item in self) { @@ -27600,7 +37953,9 @@ class RustLibApiImpl extends RustLibApiImplPlatform implements RustLibApi { @protected void sse_encode_list_found_device( - List self, SseSerializer serializer) { + List self, + SseSerializer serializer, + ) { // Codec=Sse (Serialization based), see doc to use other codecs sse_encode_i_32(self.length, serializer); for (final item in self) { @@ -27610,7 +37965,9 @@ class RustLibApiImpl extends RustLibApiImplPlatform implements RustLibApi { @protected void sse_encode_list_ft_member( - List self, SseSerializer serializer) { + List self, + SseSerializer serializer, + ) { // Codec=Sse (Serialization based), see doc to use other codecs sse_encode_i_32(self.length, serializer); for (final item in self) { @@ -27620,7 +37977,9 @@ class RustLibApiImpl extends RustLibApiImplPlatform implements RustLibApi { @protected void sse_encode_list_ft_session( - List self, SseSerializer serializer) { + List self, + SseSerializer serializer, + ) { // Codec=Sse (Serialization based), see doc to use other codecs sse_encode_i_32(self.length, serializer); for (final item in self) { @@ -27630,7 +37989,9 @@ class RustLibApiImpl extends RustLibApiImplPlatform implements RustLibApi { @protected void sse_encode_list_group_summary_member( - List self, SseSerializer serializer) { + List self, + SseSerializer serializer, + ) { // Codec=Sse (Serialization based), see doc to use other codecs sse_encode_i_32(self.length, serializer); for (final item in self) { @@ -27640,7 +38001,9 @@ class RustLibApiImpl extends RustLibApiImplPlatform implements RustLibApi { @protected void sse_encode_list_indexed_message_part( - List self, SseSerializer serializer) { + List self, + SseSerializer serializer, + ) { // Codec=Sse (Serialization based), see doc to use other codecs sse_encode_i_32(self.length, serializer); for (final item in self) { @@ -27650,7 +38013,9 @@ class RustLibApiImpl extends RustLibApiImplPlatform implements RustLibApi { @protected void sse_encode_list_list_prim_u_8_strict( - List self, SseSerializer serializer) { + List self, + SseSerializer serializer, + ) { // Codec=Sse (Serialization based), see doc to use other codecs sse_encode_i_32(self.length, serializer); for (final item in self) { @@ -27660,7 +38025,9 @@ class RustLibApiImpl extends RustLibApiImplPlatform implements RustLibApi { @protected void sse_encode_list_message_edit( - List self, SseSerializer serializer) { + List self, + SseSerializer serializer, + ) { // Codec=Sse (Serialization based), see doc to use other codecs sse_encode_i_32(self.length, serializer); for (final item in self) { @@ -27670,7 +38037,9 @@ class RustLibApiImpl extends RustLibApiImplPlatform implements RustLibApi { @protected void sse_encode_list_message_target( - List self, SseSerializer serializer) { + List self, + SseSerializer serializer, + ) { // Codec=Sse (Serialization based), see doc to use other codecs sse_encode_i_32(self.length, serializer); for (final item in self) { @@ -27680,7 +38049,9 @@ class RustLibApiImpl extends RustLibApiImplPlatform implements RustLibApi { @protected void sse_encode_list_password_manager_alt_domain( - List self, SseSerializer serializer) { + List self, + SseSerializer serializer, + ) { // Codec=Sse (Serialization based), see doc to use other codecs sse_encode_i_32(self.length, serializer); for (final item in self) { @@ -27690,7 +38061,9 @@ class RustLibApiImpl extends RustLibApiImplPlatform implements RustLibApi { @protected void sse_encode_list_password_manager_meta_change( - List self, SseSerializer serializer) { + List self, + SseSerializer serializer, + ) { // Codec=Sse (Serialization based), see doc to use other codecs sse_encode_i_32(self.length, serializer); for (final item in self) { @@ -27700,7 +38073,9 @@ class RustLibApiImpl extends RustLibApiImplPlatform implements RustLibApi { @protected void sse_encode_list_photo_poster_layer( - List self, SseSerializer serializer) { + List self, + SseSerializer serializer, + ) { // Codec=Sse (Serialization based), see doc to use other codecs sse_encode_i_32(self.length, serializer); for (final item in self) { @@ -27710,7 +38085,9 @@ class RustLibApiImpl extends RustLibApiImplPlatform implements RustLibApi { @protected void sse_encode_list_poster_asset( - List self, SseSerializer serializer) { + List self, + SseSerializer serializer, + ) { // Codec=Sse (Serialization based), see doc to use other codecs sse_encode_i_32(self.length, serializer); for (final item in self) { @@ -27720,7 +38097,9 @@ class RustLibApiImpl extends RustLibApiImplPlatform implements RustLibApi { @protected void sse_encode_list_poster_color( - List self, SseSerializer serializer) { + List self, + SseSerializer serializer, + ) { // Codec=Sse (Serialization based), see doc to use other codecs sse_encode_i_32(self.length, serializer); for (final item in self) { @@ -27730,7 +38109,9 @@ class RustLibApiImpl extends RustLibApiImplPlatform implements RustLibApi { @protected void sse_encode_list_prim_f_64_strict( - Float64List self, SseSerializer serializer) { + Float64List self, + SseSerializer serializer, + ) { // Codec=Sse (Serialization based), see doc to use other codecs sse_encode_i_32(self.length, serializer); serializer.buffer.putFloat64List(self); @@ -27738,7 +38119,9 @@ class RustLibApiImpl extends RustLibApiImplPlatform implements RustLibApi { @protected void sse_encode_list_prim_i_64_strict( - Int64List self, SseSerializer serializer) { + Int64List self, + SseSerializer serializer, + ) { // Codec=Sse (Serialization based), see doc to use other codecs sse_encode_i_32(self.length, serializer); serializer.buffer.putInt64List(self); @@ -27746,7 +38129,9 @@ class RustLibApiImpl extends RustLibApiImplPlatform implements RustLibApi { @protected void sse_encode_list_prim_u_32_strict( - Uint32List self, SseSerializer serializer) { + Uint32List self, + SseSerializer serializer, + ) { // Codec=Sse (Serialization based), see doc to use other codecs sse_encode_i_32(self.length, serializer); serializer.buffer.putUint32List(self); @@ -27754,16 +38139,21 @@ class RustLibApiImpl extends RustLibApiImplPlatform implements RustLibApi { @protected void sse_encode_list_prim_u_8_loose( - List self, SseSerializer serializer) { + List self, + SseSerializer serializer, + ) { // Codec=Sse (Serialization based), see doc to use other codecs sse_encode_i_32(self.length, serializer); - serializer.buffer - .putUint8List(self is Uint8List ? self : Uint8List.fromList(self)); + serializer.buffer.putUint8List( + self is Uint8List ? self : Uint8List.fromList(self), + ); } @protected void sse_encode_list_prim_u_8_strict( - Uint8List self, SseSerializer serializer) { + Uint8List self, + SseSerializer serializer, + ) { // Codec=Sse (Serialization based), see doc to use other codecs sse_encode_i_32(self.length, serializer); serializer.buffer.putUint8List(self); @@ -27771,7 +38161,9 @@ class RustLibApiImpl extends RustLibApiImplPlatform implements RustLibApi { @protected void sse_encode_list_private_device_info( - List self, SseSerializer serializer) { + List self, + SseSerializer serializer, + ) { // Codec=Sse (Serialization based), see doc to use other codecs sse_encode_i_32(self.length, serializer); for (final item in self) { @@ -27781,31 +38173,41 @@ class RustLibApiImpl extends RustLibApiImplPlatform implements RustLibApi { @protected void - sse_encode_list_record_string_auto_owned_rust_opaque_flutter_rust_bridgefor_generated_rust_auto_opaque_inner_asset( - List<(String, Asset)> self, SseSerializer serializer) { + sse_encode_list_record_string_auto_owned_rust_opaque_flutter_rust_bridgefor_generated_rust_auto_opaque_inner_asset( + List<(String, Asset)> self, + SseSerializer serializer, + ) { // Codec=Sse (Serialization based), see doc to use other codecs sse_encode_i_32(self.length, serializer); for (final item in self) { sse_encode_record_string_auto_owned_rust_opaque_flutter_rust_bridgefor_generated_rust_auto_opaque_inner_asset( - item, serializer); + item, + serializer, + ); } } @protected void - sse_encode_list_record_string_auto_owned_rust_opaque_flutter_rust_bridgefor_generated_rust_auto_opaque_inner_st_collapsed_value( - List<(String, StCollapsedValue)> self, SseSerializer serializer) { + sse_encode_list_record_string_auto_owned_rust_opaque_flutter_rust_bridgefor_generated_rust_auto_opaque_inner_st_collapsed_value( + List<(String, StCollapsedValue)> self, + SseSerializer serializer, + ) { // Codec=Sse (Serialization based), see doc to use other codecs sse_encode_i_32(self.length, serializer); for (final item in self) { sse_encode_record_string_auto_owned_rust_opaque_flutter_rust_bridgefor_generated_rust_auto_opaque_inner_st_collapsed_value( - item, serializer); + item, + serializer, + ); } } @protected void sse_encode_list_record_string_bool( - List<(String, bool)> self, SseSerializer serializer) { + List<(String, bool)> self, + SseSerializer serializer, + ) { // Codec=Sse (Serialization based), see doc to use other codecs sse_encode_i_32(self.length, serializer); for (final item in self) { @@ -27815,7 +38217,9 @@ class RustLibApiImpl extends RustLibApiImplPlatform implements RustLibApi { @protected void sse_encode_list_record_string_casted_primitive_u_64( - List<(String, int)> self, SseSerializer serializer) { + List<(String, int)> self, + SseSerializer serializer, + ) { // Codec=Sse (Serialization based), see doc to use other codecs sse_encode_i_32(self.length, serializer); for (final item in self) { @@ -27825,7 +38229,9 @@ class RustLibApiImpl extends RustLibApiImplPlatform implements RustLibApi { @protected void sse_encode_list_record_string_cloud_attachment( - List<(String, CloudAttachment)> self, SseSerializer serializer) { + List<(String, CloudAttachment)> self, + SseSerializer serializer, + ) { // Codec=Sse (Serialization based), see doc to use other codecs sse_encode_i_32(self.length, serializer); for (final item in self) { @@ -27835,7 +38241,9 @@ class RustLibApiImpl extends RustLibApiImplPlatform implements RustLibApi { @protected void sse_encode_list_record_string_cloud_chat( - List<(String, CloudChat)> self, SseSerializer serializer) { + List<(String, CloudChat)> self, + SseSerializer serializer, + ) { // Codec=Sse (Serialization based), see doc to use other codecs sse_encode_i_32(self.length, serializer); for (final item in self) { @@ -27845,7 +38253,9 @@ class RustLibApiImpl extends RustLibApiImplPlatform implements RustLibApi { @protected void sse_encode_list_record_string_cloud_message( - List<(String, CloudMessage)> self, SseSerializer serializer) { + List<(String, CloudMessage)> self, + SseSerializer serializer, + ) { // Codec=Sse (Serialization based), see doc to use other codecs sse_encode_i_32(self.length, serializer); for (final item in self) { @@ -27855,7 +38265,9 @@ class RustLibApiImpl extends RustLibApiImplPlatform implements RustLibApi { @protected void sse_encode_list_record_string_ft_participant( - List<(String, FTParticipant)> self, SseSerializer serializer) { + List<(String, FTParticipant)> self, + SseSerializer serializer, + ) { // Codec=Sse (Serialization based), see doc to use other codecs sse_encode_i_32(self.length, serializer); for (final item in self) { @@ -27865,7 +38277,9 @@ class RustLibApiImpl extends RustLibApiImplPlatform implements RustLibApi { @protected void sse_encode_list_record_string_group_summary( - List<(String, GroupSummary)> self, SseSerializer serializer) { + List<(String, GroupSummary)> self, + SseSerializer serializer, + ) { // Codec=Sse (Serialization based), see doc to use other codecs sse_encode_i_32(self.length, serializer); for (final item in self) { @@ -27875,7 +38289,9 @@ class RustLibApiImpl extends RustLibApiImplPlatform implements RustLibApi { @protected void sse_encode_list_record_string_list_message_edit( - List<(String, List)> self, SseSerializer serializer) { + List<(String, List)> self, + SseSerializer serializer, + ) { // Codec=Sse (Serialization based), see doc to use other codecs sse_encode_i_32(self.length, serializer); for (final item in self) { @@ -27885,7 +38301,9 @@ class RustLibApiImpl extends RustLibApiImplPlatform implements RustLibApi { @protected void sse_encode_list_record_string_list_prim_u_8_strict( - List<(String, Uint8List)> self, SseSerializer serializer) { + List<(String, Uint8List)> self, + SseSerializer serializer, + ) { // Codec=Sse (Serialization based), see doc to use other codecs sse_encode_i_32(self.length, serializer); for (final item in self) { @@ -27895,7 +38313,9 @@ class RustLibApiImpl extends RustLibApiImplPlatform implements RustLibApi { @protected void sse_encode_list_record_string_message_edit_range( - List<(String, MessageEditRange)> self, SseSerializer serializer) { + List<(String, MessageEditRange)> self, + SseSerializer serializer, + ) { // Codec=Sse (Serialization based), see doc to use other codecs sse_encode_i_32(self.length, serializer); for (final item in self) { @@ -27905,18 +38325,24 @@ class RustLibApiImpl extends RustLibApiImplPlatform implements RustLibApi { @protected void sse_encode_list_record_string_opt_box_autoadd_cloud_attachment( - List<(String, CloudAttachment?)> self, SseSerializer serializer) { + List<(String, CloudAttachment?)> self, + SseSerializer serializer, + ) { // Codec=Sse (Serialization based), see doc to use other codecs sse_encode_i_32(self.length, serializer); for (final item in self) { sse_encode_record_string_opt_box_autoadd_cloud_attachment( - item, serializer); + item, + serializer, + ); } } @protected void sse_encode_list_record_string_opt_box_autoadd_cloud_chat( - List<(String, CloudChat?)> self, SseSerializer serializer) { + List<(String, CloudChat?)> self, + SseSerializer serializer, + ) { // Codec=Sse (Serialization based), see doc to use other codecs sse_encode_i_32(self.length, serializer); for (final item in self) { @@ -27926,7 +38352,9 @@ class RustLibApiImpl extends RustLibApiImplPlatform implements RustLibApi { @protected void sse_encode_list_record_string_opt_box_autoadd_cloud_message( - List<(String, CloudMessage?)> self, SseSerializer serializer) { + List<(String, CloudMessage?)> self, + SseSerializer serializer, + ) { // Codec=Sse (Serialization based), see doc to use other codecs sse_encode_i_32(self.length, serializer); for (final item in self) { @@ -27936,8 +38364,9 @@ class RustLibApiImpl extends RustLibApiImplPlatform implements RustLibApi { @protected void sse_encode_list_record_string_password_manager_meta_data_ctx( - List<(String, PasswordManagerMetaDataCtx)> self, - SseSerializer serializer) { + List<(String, PasswordManagerMetaDataCtx)> self, + SseSerializer serializer, + ) { // Codec=Sse (Serialization based), see doc to use other codecs sse_encode_i_32(self.length, serializer); for (final item in self) { @@ -27947,7 +38376,9 @@ class RustLibApiImpl extends RustLibApiImplPlatform implements RustLibApi { @protected void sse_encode_list_record_string_record_opt_string_passkey( - List<(String, (String?, Passkey))> self, SseSerializer serializer) { + List<(String, (String?, Passkey))> self, + SseSerializer serializer, + ) { // Codec=Sse (Serialization based), see doc to use other codecs sse_encode_i_32(self.length, serializer); for (final item in self) { @@ -27957,42 +38388,54 @@ class RustLibApiImpl extends RustLibApiImplPlatform implements RustLibApi { @protected void sse_encode_list_record_string_record_opt_string_password_manager_meta( - List<(String, (String?, PasswordManagerMeta))> self, - SseSerializer serializer) { + List<(String, (String?, PasswordManagerMeta))> self, + SseSerializer serializer, + ) { // Codec=Sse (Serialization based), see doc to use other codecs sse_encode_i_32(self.length, serializer); for (final item in self) { sse_encode_record_string_record_opt_string_password_manager_meta( - item, serializer); + item, + serializer, + ); } } @protected void sse_encode_list_record_string_record_opt_string_password_raw_entry( - List<(String, (String?, PasswordRawEntry))> self, - SseSerializer serializer) { + List<(String, (String?, PasswordRawEntry))> self, + SseSerializer serializer, + ) { // Codec=Sse (Serialization based), see doc to use other codecs sse_encode_i_32(self.length, serializer); for (final item in self) { sse_encode_record_string_record_opt_string_password_raw_entry( - item, serializer); + item, + serializer, + ); } } @protected void sse_encode_list_record_string_record_opt_string_wifi_password( - List<(String, (String?, WifiPassword))> self, SseSerializer serializer) { + List<(String, (String?, WifiPassword))> self, + SseSerializer serializer, + ) { // Codec=Sse (Serialization based), see doc to use other codecs sse_encode_i_32(self.length, serializer); for (final item in self) { sse_encode_record_string_record_opt_string_wifi_password( - item, serializer); + item, + serializer, + ); } } @protected void sse_encode_list_record_string_share_invite_content_data( - List<(String, ShareInviteContentData)> self, SseSerializer serializer) { + List<(String, ShareInviteContentData)> self, + SseSerializer serializer, + ) { // Codec=Sse (Serialization based), see doc to use other codecs sse_encode_i_32(self.length, serializer); for (final item in self) { @@ -28002,7 +38445,9 @@ class RustLibApiImpl extends RustLibApiImplPlatform implements RustLibApi { @protected void sse_encode_list_record_string_status_kit_personal_config( - List<(String, StatusKitPersonalConfig)> self, SseSerializer serializer) { + List<(String, StatusKitPersonalConfig)> self, + SseSerializer serializer, + ) { // Codec=Sse (Serialization based), see doc to use other codecs sse_encode_i_32(self.length, serializer); for (final item in self) { @@ -28012,7 +38457,9 @@ class RustLibApiImpl extends RustLibApiImplPlatform implements RustLibApi { @protected void sse_encode_list_record_string_string( - List<(String, String)> self, SseSerializer serializer) { + List<(String, String)> self, + SseSerializer serializer, + ) { // Codec=Sse (Serialization based), see doc to use other codecs sse_encode_i_32(self.length, serializer); for (final item in self) { @@ -28022,7 +38469,9 @@ class RustLibApiImpl extends RustLibApiImplPlatform implements RustLibApi { @protected void sse_encode_list_record_string_sync_status( - List<(String, SyncStatus)> self, SseSerializer serializer) { + List<(String, SyncStatus)> self, + SseSerializer serializer, + ) { // Codec=Sse (Serialization based), see doc to use other codecs sse_encode_i_32(self.length, serializer); for (final item in self) { @@ -28032,7 +38481,9 @@ class RustLibApiImpl extends RustLibApiImplPlatform implements RustLibApi { @protected void sse_encode_list_record_u_32_ns_dictionary_typed_coder( - List<(int, NSDictionaryTypedCoder)> self, SseSerializer serializer) { + List<(int, NSDictionaryTypedCoder)> self, + SseSerializer serializer, + ) { // Codec=Sse (Serialization based), see doc to use other codecs sse_encode_i_32(self.length, serializer); for (final item in self) { @@ -28042,7 +38493,9 @@ class RustLibApiImpl extends RustLibApiImplPlatform implements RustLibApi { @protected void sse_encode_list_report_message( - List self, SseSerializer serializer) { + List self, + SseSerializer serializer, + ) { // Codec=Sse (Serialization based), see doc to use other codecs sse_encode_i_32(self.length, serializer); for (final item in self) { @@ -28052,7 +38505,9 @@ class RustLibApiImpl extends RustLibApiImplPlatform implements RustLibApi { @protected void sse_encode_list_shared_album( - List self, SseSerializer serializer) { + List self, + SseSerializer serializer, + ) { // Codec=Sse (Serialization based), see doc to use other codecs sse_encode_i_32(self.length, serializer); for (final item in self) { @@ -28062,7 +38517,9 @@ class RustLibApiImpl extends RustLibApiImplPlatform implements RustLibApi { @protected void sse_encode_list_trusted_phone_number( - List self, SseSerializer serializer) { + List self, + SseSerializer serializer, + ) { // Codec=Sse (Serialization based), see doc to use other codecs sse_encode_i_32(self.length, serializer); for (final item in self) { @@ -28114,7 +38571,9 @@ class RustLibApiImpl extends RustLibApiImplPlatform implements RustLibApi { case LoginState_NeedsSMS2FAVerification(field0: final field0): sse_encode_i_32(4, serializer); sse_encode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerVerifyBody( - field0, serializer); + field0, + serializer, + ); case LoginState_NeedsExtraStep(field0: final field0): sse_encode_i_32(5, serializer); sse_encode_String(field0, serializer); @@ -28127,7 +38586,9 @@ class RustLibApiImpl extends RustLibApiImplPlatform implements RustLibApi { @protected void sse_encode_lp_icon_metadata( - LPIconMetadata self, SseSerializer serializer) { + LPIconMetadata self, + SseSerializer serializer, + ) { // Codec=Sse (Serialization based), see doc to use other codecs sse_encode_nsurl(self.url, serializer); sse_encode_u_8(self.version, serializer); @@ -28135,7 +38596,9 @@ class RustLibApiImpl extends RustLibApiImplPlatform implements RustLibApi { @protected void sse_encode_lp_image_metadata( - LPImageMetadata self, SseSerializer serializer) { + LPImageMetadata self, + SseSerializer serializer, + ) { // Codec=Sse (Serialization based), see doc to use other codecs sse_encode_String(self.size, serializer); sse_encode_nsurl(self.url, serializer); @@ -28144,10 +38607,14 @@ class RustLibApiImpl extends RustLibApiImplPlatform implements RustLibApi { @protected void sse_encode_lp_link_metadata( - LPLinkMetadata self, SseSerializer serializer) { + LPLinkMetadata self, + SseSerializer serializer, + ) { // Codec=Sse (Serialization based), see doc to use other codecs sse_encode_opt_box_autoadd_lp_image_metadata( - self.imageMetadata, serializer); + self.imageMetadata, + serializer, + ); sse_encode_u_8(self.version, serializer); sse_encode_opt_box_autoadd_lp_icon_metadata(self.iconMetadata, serializer); sse_encode_opt_box_autoadd_nsurl(self.originalUrl, serializer); @@ -28155,30 +38622,42 @@ class RustLibApiImpl extends RustLibApiImplPlatform implements RustLibApi { sse_encode_opt_String(self.title, serializer); sse_encode_opt_String(self.summary, serializer); sse_encode_opt_box_autoadd_rich_link_image_attachment_substitute( - self.image, serializer); + self.image, + serializer, + ); sse_encode_opt_box_autoadd_rich_link_image_attachment_substitute( - self.icon, serializer); + self.icon, + serializer, + ); sse_encode_opt_box_autoadd_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerNSArrayLPImageMetadata( - self.images, serializer); + self.images, + serializer, + ); sse_encode_opt_box_autoadd_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerNSArrayLPIconMetadata( - self.icons, serializer); + self.icons, + serializer, + ); sse_encode_opt_box_autoadd_bool(self.isIncomplete, serializer); sse_encode_opt_box_autoadd_bool(self.usesActivityPub, serializer); sse_encode_opt_box_autoadd_bool(self.isEncodedForLocalUse, serializer); sse_encode_opt_box_autoadd_u_32(self.collaborationType, serializer); sse_encode_opt_box_autoadd_lp_specialization_metadata( - self.specialization2, serializer); + self.specialization2, + serializer, + ); } @protected void sse_encode_lp_specialization_metadata( - LPSpecializationMetadata self, SseSerializer serializer) { + LPSpecializationMetadata self, + SseSerializer serializer, + ) { // Codec=Sse (Serialization based), see doc to use other codecs switch (self) { case LPSpecializationMetadata_LPPasswordsInviteMetadata( - groupName: final groupName, - urlParameters: final urlParameters - ): + groupName: final groupName, + urlParameters: final urlParameters, + ): sse_encode_i_32(0, serializer); sse_encode_String(groupName, serializer); sse_encode_String(urlParameters, serializer); @@ -28265,7 +38744,9 @@ class RustLibApiImpl extends RustLibApiImplPlatform implements RustLibApi { case Message_UpdateProfileSharing(field0: final field0): sse_encode_i_32(22, serializer); sse_encode_box_autoadd_update_profile_sharing_message( - field0, serializer); + field0, + serializer, + ); case Message_ShareProfile(field0: final field0): sse_encode_i_32(23, serializer); sse_encode_box_autoadd_share_profile_message(field0, serializer); @@ -28274,7 +38755,9 @@ class RustLibApiImpl extends RustLibApiImplPlatform implements RustLibApi { case Message_SetTranscriptBackground(field0: final field0): sse_encode_i_32(25, serializer); sse_encode_box_autoadd_set_transcript_background_message( - field0, serializer); + field0, + serializer, + ); default: throw UnimplementedError(''); } @@ -28290,7 +38773,9 @@ class RustLibApiImpl extends RustLibApiImplPlatform implements RustLibApi { @protected void sse_encode_message_edit_range( - MessageEditRange self, SseSerializer serializer) { + MessageEditRange self, + SseSerializer serializer, + ) { // Codec=Sse (Serialization based), see doc to use other codecs sse_encode_u_32(self.lo, serializer); sse_encode_u_32(self.le, serializer); @@ -28308,7 +38793,9 @@ class RustLibApiImpl extends RustLibApiImplPlatform implements RustLibApi { sse_encode_bool(self.sendDelivered, serializer); sse_encode_bool(self.verificationFailed, serializer); sse_encode_opt_box_autoadd_certified_context( - self.certifiedContext, serializer); + self.certifiedContext, + serializer, + ); } @protected @@ -28359,21 +38846,29 @@ class RustLibApiImpl extends RustLibApiImplPlatform implements RustLibApi { sse_encode_opt_box_autoadd_u_32(self.associatedMessageType, serializer); sse_encode_opt_String(self.associatedMessageGuid, serializer); sse_encode_opt_box_autoadd_u_32( - self.associatedMessageRangeLocation, serializer); + self.associatedMessageRangeLocation, + serializer, + ); sse_encode_opt_box_autoadd_u_32( - self.associatedMessageRangeLength, serializer); + self.associatedMessageRangeLength, + serializer, + ); } @protected void sse_encode_message_proto_2( - MessageProto2 self, SseSerializer serializer) { + MessageProto2 self, + SseSerializer serializer, + ) { // Codec=Sse (Serialization based), see doc to use other codecs sse_encode_opt_String(self.reply, serializer); } @protected void sse_encode_message_proto_3( - MessageProto3 self, SseSerializer serializer) { + MessageProto3 self, + SseSerializer serializer, + ) { // Codec=Sse (Serialization based), see doc to use other codecs sse_encode_opt_box_autoadd_u_32(self.unk2, serializer); sse_encode_opt_box_autoadd_u_32(self.unk3, serializer); @@ -28381,7 +38876,9 @@ class RustLibApiImpl extends RustLibApiImplPlatform implements RustLibApi { @protected void sse_encode_message_proto_4( - MessageProto4 self, SseSerializer serializer) { + MessageProto4 self, + SseSerializer serializer, + ) { // Codec=Sse (Serialization based), see doc to use other codecs sse_encode_opt_String(self.associatedMessageEmoji, serializer); sse_encode_opt_String(self.service, serializer); @@ -28393,7 +38890,9 @@ class RustLibApiImpl extends RustLibApiImplPlatform implements RustLibApi { @protected void sse_encode_message_summary_info( - MessageSummaryInfo self, SseSerializer serializer) { + MessageSummaryInfo self, + SseSerializer serializer, + ) { // Codec=Sse (Serialization based), see doc to use other codecs sse_encode_opt_String(self.ams, serializer); sse_encode_opt_list_prim_u_8_strict(self.ampt, serializer); @@ -28427,670 +38926,1194 @@ class RustLibApiImpl extends RustLibApiImplPlatform implements RustLibApi { } @protected - void sse_encode_message_type(MessageType self, SseSerializer serializer) { + void sse_encode_message_type(MessageType self, SseSerializer serializer) { + // Codec=Sse (Serialization based), see doc to use other codecs + switch (self) { + case MessageType_IMessage(): + sse_encode_i_32(0, serializer); + case MessageType_SMS( + isPhone: final isPhone, + usingNumber: final usingNumber, + fromHandle: final fromHandle, + ): + sse_encode_i_32(1, serializer); + sse_encode_bool(isPhone, serializer); + sse_encode_String(usingNumber, serializer); + sse_encode_opt_String(fromHandle, serializer); + default: + throw UnimplementedError(''); + } + } + + @protected + void sse_encode_mmcs_attachment_meta( + MMCSAttachmentMeta self, + SseSerializer serializer, + ) { + // Codec=Sse (Serialization based), see doc to use other codecs + sse_encode_opt_String(self.mmcsSignatureHex, serializer); + sse_encode_opt_String(self.mmcsOwner, serializer); + sse_encode_opt_String(self.mmcsUrl, serializer); + sse_encode_opt_String(self.decryptionKey, serializer); + sse_encode_opt_String(self.inlineAttachment, serializer); + sse_encode_opt_String(self.messagePart, serializer); + sse_encode_opt_box_autoadd_num_or_string(self.fileSize, serializer); + sse_encode_opt_String(self.utiType, serializer); + sse_encode_opt_String(self.mimeType, serializer); + sse_encode_opt_String(self.name, serializer); + } + + @protected + void sse_encode_mmcs_file(MMCSFile self, SseSerializer serializer) { + // Codec=Sse (Serialization based), see doc to use other codecs + sse_encode_list_prim_u_8_strict(self.signature, serializer); + sse_encode_String(self.object, serializer); + sse_encode_String(self.url, serializer); + sse_encode_list_prim_u_8_strict(self.key, serializer); + sse_encode_CastedPrimitive_usize(self.size, serializer); + } + + @protected + void sse_encode_mmcs_transfer_progress( + MMCSTransferProgress self, + SseSerializer serializer, + ) { + // Codec=Sse (Serialization based), see doc to use other codecs + sse_encode_CastedPrimitive_usize(self.prog, serializer); + sse_encode_CastedPrimitive_usize(self.total, serializer); + sse_encode_opt_box_autoadd_mmcs_file(self.file, serializer); + } + + @protected + void sse_encode_monogram_data(MonogramData self, SseSerializer serializer) { + // Codec=Sse (Serialization based), see doc to use other codecs + sse_encode_poster_color(self.topBackgroundColorDescription, serializer); + sse_encode_poster_color(self.backgroundColorDescription, serializer); + sse_encode_String(self.initials, serializer); + sse_encode_bool(self.monogramSupportedForName, serializer); + } + + @protected + void sse_encode_move_to_recycle_bin_message( + MoveToRecycleBinMessage self, + SseSerializer serializer, + ) { + // Codec=Sse (Serialization based), see doc to use other codecs + sse_encode_delete_target(self.target, serializer); + sse_encode_CastedPrimitive_u_64(self.recoverableDeleteDate, serializer); + } + + @protected + void sse_encode_my_async_runtime( + MyAsyncRuntime self, + SseSerializer serializer, + ) { + // Codec=Sse (Serialization based), see doc to use other codecs + } + + @protected + void sse_encode_normal_message(NormalMessage self, SseSerializer serializer) { + // Codec=Sse (Serialization based), see doc to use other codecs + sse_encode_message_parts(self.parts, serializer); + sse_encode_opt_String(self.effect, serializer); + sse_encode_opt_String(self.replyGuid, serializer); + sse_encode_opt_String(self.replyPart, serializer); + sse_encode_message_type(self.service, serializer); + sse_encode_opt_String(self.subject, serializer); + sse_encode_opt_box_autoadd_extension_app(self.app, serializer); + sse_encode_opt_box_autoadd_link_meta(self.linkMeta, serializer); + sse_encode_bool(self.voice, serializer); + sse_encode_opt_box_autoadd_schedule_mode(self.scheduled, serializer); + sse_encode_opt_box_autoadd_share_profile_message( + self.embeddedProfile, + serializer, + ); + } + + @protected + void sse_encode_ns_attributed_string( + NSAttributedString self, + SseSerializer serializer, + ) { + // Codec=Sse (Serialization based), see doc to use other codecs + sse_encode_String(self.text, serializer); + sse_encode_list_record_u_32_ns_dictionary_typed_coder( + self.ranges, + serializer, + ); + } + + @protected + void sse_encode_ns_dictionary_class( + NSDictionaryClass self, + SseSerializer serializer, + ) { + // Codec=Sse (Serialization based), see doc to use other codecs + sse_encode_i_32(self.index, serializer); + } + + @protected + void sse_encode_ns_dictionary_typed_coder( + NSDictionaryTypedCoder self, + SseSerializer serializer, + ) { + // Codec=Sse (Serialization based), see doc to use other codecs + sse_encode_Map_String_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerStCollapsedValue( + self.field0, + serializer, + ); + } + + @protected + void sse_encode_ns_number(NSNumber self, SseSerializer serializer) { + // Codec=Sse (Serialization based), see doc to use other codecs + sse_encode_u_32(self.field0, serializer); + } + + @protected + void sse_encode_ns_string(NSString self, SseSerializer serializer) { + // Codec=Sse (Serialization based), see doc to use other codecs + sse_encode_String(self.field0, serializer); + } + + @protected + void sse_encode_nsurl(NSURL self, SseSerializer serializer) { + // Codec=Sse (Serialization based), see doc to use other codecs + sse_encode_String(self.base, serializer); + sse_encode_String(self.relative, serializer); + } + + @protected + void sse_encode_num_or_string(NumOrString self, SseSerializer serializer) { + // Codec=Sse (Serialization based), see doc to use other codecs + switch (self) { + case NumOrString_Num(field0: final field0): + sse_encode_i_32(0, serializer); + sse_encode_u_32(field0, serializer); + case NumOrString_String(field0: final field0): + sse_encode_i_32(1, serializer); + sse_encode_String(field0, serializer); + case NumOrString_Bool(field0: final field0): + sse_encode_i_32(2, serializer); + sse_encode_bool(field0, serializer); + default: + throw UnimplementedError(''); + } + } + + @protected + void sse_encode_operated_chat(OperatedChat self, SseSerializer serializer) { + // Codec=Sse (Serialization based), see doc to use other codecs + sse_encode_list_String(self.participants, serializer); + sse_encode_String(self.groupId, serializer); + sse_encode_String(self.guid, serializer); + sse_encode_opt_box_autoadd_bool(self.deleteIncomingMessages, serializer); + sse_encode_opt_box_autoadd_bool(self.wasReportedAsJunk, serializer); + } + + @protected + void sse_encode_opt_CastedPrimitive_i_64( + int? self, + SseSerializer serializer, + ) { + // Codec=Sse (Serialization based), see doc to use other codecs + + sse_encode_bool(self != null, serializer); + if (self != null) { + sse_encode_CastedPrimitive_i_64(self, serializer); + } + } + + @protected + void sse_encode_opt_CastedPrimitive_u_64( + int? self, + SseSerializer serializer, + ) { + // Codec=Sse (Serialization based), see doc to use other codecs + + sse_encode_bool(self != null, serializer); + if (self != null) { + sse_encode_CastedPrimitive_u_64(self, serializer); + } + } + + @protected + void sse_encode_opt_CastedPrimitive_usize( + int? self, + SseSerializer serializer, + ) { + // Codec=Sse (Serialization based), see doc to use other codecs + + sse_encode_bool(self != null, serializer); + if (self != null) { + sse_encode_CastedPrimitive_usize(self, serializer); + } + } + + @protected + void sse_encode_opt_String(String? self, SseSerializer serializer) { + // Codec=Sse (Serialization based), see doc to use other codecs + + sse_encode_bool(self != null, serializer); + if (self != null) { + sse_encode_String(self, serializer); + } + } + + @protected + void + sse_encode_opt_box_autoadd_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerAPSState( + ApsState? self, + SseSerializer serializer, + ) { + // Codec=Sse (Serialization based), see doc to use other codecs + + sse_encode_bool(self != null, serializer); + if (self != null) { + sse_encode_box_autoadd_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerAPSState( + self, + serializer, + ); + } + } + + @protected + void + sse_encode_opt_box_autoadd_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcCloudKitClientDefaultAnisetteProvider( + ArcCloudKitClientDefaultAnisetteProvider? self, + SseSerializer serializer, + ) { + // Codec=Sse (Serialization based), see doc to use other codecs + + sse_encode_bool(self != null, serializer); + if (self != null) { + sse_encode_box_autoadd_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcCloudKitClientDefaultAnisetteProvider( + self, + serializer, + ); + } + } + + @protected + void + sse_encode_opt_box_autoadd_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcCloudMessagesClientDefaultAnisetteProvider( + ArcCloudMessagesClientDefaultAnisetteProvider? self, + SseSerializer serializer, + ) { + // Codec=Sse (Serialization based), see doc to use other codecs + + sse_encode_bool(self != null, serializer); + if (self != null) { + sse_encode_box_autoadd_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcCloudMessagesClientDefaultAnisetteProvider( + self, + serializer, + ); + } + } + + @protected + void + sse_encode_opt_box_autoadd_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcFindMyClientDefaultAnisetteProvider( + ArcFindMyClientDefaultAnisetteProvider? self, + SseSerializer serializer, + ) { + // Codec=Sse (Serialization based), see doc to use other codecs + + sse_encode_bool(self != null, serializer); + if (self != null) { + sse_encode_box_autoadd_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcFindMyClientDefaultAnisetteProvider( + self, + serializer, + ); + } + } + + @protected + void + sse_encode_opt_box_autoadd_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcKeychainClientDefaultAnisetteProvider( + ArcKeychainClientDefaultAnisetteProvider? self, + SseSerializer serializer, + ) { + // Codec=Sse (Serialization based), see doc to use other codecs + + sse_encode_bool(self != null, serializer); + if (self != null) { + sse_encode_box_autoadd_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcKeychainClientDefaultAnisetteProvider( + self, + serializer, + ); + } + } + + @protected + void + sse_encode_opt_box_autoadd_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcMutexAppleAccountDefaultAnisetteProvider( + ArcMutexAppleAccountDefaultAnisetteProvider? self, + SseSerializer serializer, + ) { // Codec=Sse (Serialization based), see doc to use other codecs - switch (self) { - case MessageType_IMessage(): - sse_encode_i_32(0, serializer); - case MessageType_SMS( - isPhone: final isPhone, - usingNumber: final usingNumber, - fromHandle: final fromHandle - ): - sse_encode_i_32(1, serializer); - sse_encode_bool(isPhone, serializer); - sse_encode_String(usingNumber, serializer); - sse_encode_opt_String(fromHandle, serializer); - default: - throw UnimplementedError(''); + + sse_encode_bool(self != null, serializer); + if (self != null) { + sse_encode_box_autoadd_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcMutexAppleAccountDefaultAnisetteProvider( + self, + serializer, + ); } } @protected - void sse_encode_mmcs_attachment_meta( - MMCSAttachmentMeta self, SseSerializer serializer) { + void + sse_encode_opt_box_autoadd_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcPasswordManagerDefaultAnisetteProvider( + ArcPasswordManagerDefaultAnisetteProvider? self, + SseSerializer serializer, + ) { // Codec=Sse (Serialization based), see doc to use other codecs - sse_encode_opt_String(self.mmcsSignatureHex, serializer); - sse_encode_opt_String(self.mmcsOwner, serializer); - sse_encode_opt_String(self.mmcsUrl, serializer); - sse_encode_opt_String(self.decryptionKey, serializer); - sse_encode_opt_String(self.inlineAttachment, serializer); - sse_encode_opt_String(self.messagePart, serializer); - sse_encode_opt_box_autoadd_num_or_string(self.fileSize, serializer); - sse_encode_opt_String(self.utiType, serializer); - sse_encode_opt_String(self.mimeType, serializer); - sse_encode_opt_String(self.name, serializer); + + sse_encode_bool(self != null, serializer); + if (self != null) { + sse_encode_box_autoadd_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcPasswordManagerDefaultAnisetteProvider( + self, + serializer, + ); + } } @protected - void sse_encode_mmcs_file(MMCSFile self, SseSerializer serializer) { + void + sse_encode_opt_box_autoadd_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerAsset( + Asset? self, + SseSerializer serializer, + ) { // Codec=Sse (Serialization based), see doc to use other codecs - sse_encode_list_prim_u_8_strict(self.signature, serializer); - sse_encode_String(self.object, serializer); - sse_encode_String(self.url, serializer); - sse_encode_list_prim_u_8_strict(self.key, serializer); - sse_encode_CastedPrimitive_usize(self.size, serializer); + + sse_encode_bool(self != null, serializer); + if (self != null) { + sse_encode_box_autoadd_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerAsset( + self, + serializer, + ); + } } @protected - void sse_encode_mmcs_transfer_progress( - MMCSTransferProgress self, SseSerializer serializer) { + void + sse_encode_opt_box_autoadd_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerChannelInterestToken( + ChannelInterestToken? self, + SseSerializer serializer, + ) { // Codec=Sse (Serialization based), see doc to use other codecs - sse_encode_CastedPrimitive_usize(self.prog, serializer); - sse_encode_CastedPrimitive_usize(self.total, serializer); - sse_encode_opt_box_autoadd_mmcs_file(self.file, serializer); + + sse_encode_bool(self != null, serializer); + if (self != null) { + sse_encode_box_autoadd_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerChannelInterestToken( + self, + serializer, + ); + } } @protected - void sse_encode_monogram_data(MonogramData self, SseSerializer serializer) { + void + sse_encode_opt_box_autoadd_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerCircleClientSessionDefaultAnisetteProvider( + CircleClientSessionDefaultAnisetteProvider? self, + SseSerializer serializer, + ) { // Codec=Sse (Serialization based), see doc to use other codecs - sse_encode_poster_color(self.topBackgroundColorDescription, serializer); - sse_encode_poster_color(self.backgroundColorDescription, serializer); - sse_encode_String(self.initials, serializer); - sse_encode_bool(self.monogramSupportedForName, serializer); + + sse_encode_bool(self != null, serializer); + if (self != null) { + sse_encode_box_autoadd_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerCircleClientSessionDefaultAnisetteProvider( + self, + serializer, + ); + } } @protected - void sse_encode_move_to_recycle_bin_message( - MoveToRecycleBinMessage self, SseSerializer serializer) { + void + sse_encode_opt_box_autoadd_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerCloudSyncPreparedMessageCreateHandle( + CloudSyncPreparedMessageCreateHandle? self, + SseSerializer serializer, + ) { // Codec=Sse (Serialization based), see doc to use other codecs - sse_encode_delete_target(self.target, serializer); - sse_encode_CastedPrimitive_u_64(self.recoverableDeleteDate, serializer); + + sse_encode_bool(self != null, serializer); + if (self != null) { + sse_encode_box_autoadd_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerCloudSyncPreparedMessageCreateHandle( + self, + serializer, + ); + } } @protected - void sse_encode_my_async_runtime( - MyAsyncRuntime self, SseSerializer serializer) { + void + sse_encode_opt_box_autoadd_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerConversationLink( + ConversationLink? self, + SseSerializer serializer, + ) { // Codec=Sse (Serialization based), see doc to use other codecs + + sse_encode_bool(self != null, serializer); + if (self != null) { + sse_encode_box_autoadd_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerConversationLink( + self, + serializer, + ); + } } @protected - void sse_encode_normal_message(NormalMessage self, SseSerializer serializer) { + void + sse_encode_opt_box_autoadd_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerConversationParticipant( + ConversationParticipant? self, + SseSerializer serializer, + ) { // Codec=Sse (Serialization based), see doc to use other codecs - sse_encode_message_parts(self.parts, serializer); - sse_encode_opt_String(self.effect, serializer); - sse_encode_opt_String(self.replyGuid, serializer); - sse_encode_opt_String(self.replyPart, serializer); - sse_encode_message_type(self.service, serializer); - sse_encode_opt_String(self.subject, serializer); - sse_encode_opt_box_autoadd_extension_app(self.app, serializer); - sse_encode_opt_box_autoadd_link_meta(self.linkMeta, serializer); - sse_encode_bool(self.voice, serializer); - sse_encode_opt_box_autoadd_schedule_mode(self.scheduled, serializer); - sse_encode_opt_box_autoadd_share_profile_message( - self.embeddedProfile, serializer); + + sse_encode_bool(self != null, serializer); + if (self != null) { + sse_encode_box_autoadd_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerConversationParticipant( + self, + serializer, + ); + } } @protected - void sse_encode_ns_attributed_string( - NSAttributedString self, SseSerializer serializer) { + void + sse_encode_opt_box_autoadd_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerDate( + Date? self, + SseSerializer serializer, + ) { // Codec=Sse (Serialization based), see doc to use other codecs - sse_encode_String(self.text, serializer); - sse_encode_list_record_u_32_ns_dictionary_typed_coder( - self.ranges, serializer); + + sse_encode_bool(self != null, serializer); + if (self != null) { + sse_encode_box_autoadd_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerDate( + self, + serializer, + ); + } } @protected - void sse_encode_ns_dictionary_class( - NSDictionaryClass self, SseSerializer serializer) { + void + sse_encode_opt_box_autoadd_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerGZipWrapperChatProto( + GZipWrapperChatProto? self, + SseSerializer serializer, + ) { // Codec=Sse (Serialization based), see doc to use other codecs - sse_encode_i_32(self.index, serializer); + + sse_encode_bool(self != null, serializer); + if (self != null) { + sse_encode_box_autoadd_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerGZipWrapperChatProto( + self, + serializer, + ); + } } @protected - void sse_encode_ns_dictionary_typed_coder( - NSDictionaryTypedCoder self, SseSerializer serializer) { + void + sse_encode_opt_box_autoadd_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerGZipWrapperMessageProto2( + GZipWrapperMessageProto2? self, + SseSerializer serializer, + ) { // Codec=Sse (Serialization based), see doc to use other codecs - sse_encode_Map_String_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerStCollapsedValue( - self.field0, serializer); + + sse_encode_bool(self != null, serializer); + if (self != null) { + sse_encode_box_autoadd_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerGZipWrapperMessageProto2( + self, + serializer, + ); + } } @protected - void sse_encode_ns_number(NSNumber self, SseSerializer serializer) { + void + sse_encode_opt_box_autoadd_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerGZipWrapperMessageProto3( + GZipWrapperMessageProto3? self, + SseSerializer serializer, + ) { // Codec=Sse (Serialization based), see doc to use other codecs - sse_encode_u_32(self.field0, serializer); + + sse_encode_bool(self != null, serializer); + if (self != null) { + sse_encode_box_autoadd_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerGZipWrapperMessageProto3( + self, + serializer, + ); + } } @protected - void sse_encode_ns_string(NSString self, SseSerializer serializer) { + void + sse_encode_opt_box_autoadd_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerGZipWrapperMessageProto4( + GZipWrapperMessageProto4? self, + SseSerializer serializer, + ) { // Codec=Sse (Serialization based), see doc to use other codecs - sse_encode_String(self.field0, serializer); + + sse_encode_bool(self != null, serializer); + if (self != null) { + sse_encode_box_autoadd_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerGZipWrapperMessageProto4( + self, + serializer, + ); + } } @protected - void sse_encode_nsurl(NSURL self, SseSerializer serializer) { + void + sse_encode_opt_box_autoadd_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerIDSUser( + IdsUser? self, + SseSerializer serializer, + ) { // Codec=Sse (Serialization based), see doc to use other codecs - sse_encode_String(self.base, serializer); - sse_encode_String(self.relative, serializer); + + sse_encode_bool(self != null, serializer); + if (self != null) { + sse_encode_box_autoadd_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerIDSUser( + self, + serializer, + ); + } } @protected - void sse_encode_num_or_string(NumOrString self, SseSerializer serializer) { + void + sse_encode_opt_box_autoadd_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerLocationReport( + LocationReport? self, + SseSerializer serializer, + ) { // Codec=Sse (Serialization based), see doc to use other codecs - switch (self) { - case NumOrString_Num(field0: final field0): - sse_encode_i_32(0, serializer); - sse_encode_u_32(field0, serializer); - case NumOrString_String(field0: final field0): - sse_encode_i_32(1, serializer); - sse_encode_String(field0, serializer); - case NumOrString_Bool(field0: final field0): - sse_encode_i_32(2, serializer); - sse_encode_bool(field0, serializer); - default: - throw UnimplementedError(''); + + sse_encode_bool(self != null, serializer); + if (self != null) { + sse_encode_box_autoadd_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerLocationReport( + self, + serializer, + ); } } @protected - void sse_encode_operated_chat(OperatedChat self, SseSerializer serializer) { + void + sse_encode_opt_box_autoadd_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerNSArrayLPIconMetadata( + NsArrayLpIconMetadata? self, + SseSerializer serializer, + ) { // Codec=Sse (Serialization based), see doc to use other codecs - sse_encode_list_String(self.participants, serializer); - sse_encode_String(self.groupId, serializer); - sse_encode_String(self.guid, serializer); - sse_encode_opt_box_autoadd_bool(self.deleteIncomingMessages, serializer); - sse_encode_opt_box_autoadd_bool(self.wasReportedAsJunk, serializer); + + sse_encode_bool(self != null, serializer); + if (self != null) { + sse_encode_box_autoadd_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerNSArrayLPIconMetadata( + self, + serializer, + ); + } } @protected - void sse_encode_opt_CastedPrimitive_i_64( - int? self, SseSerializer serializer) { + void + sse_encode_opt_box_autoadd_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerNSArrayLPImageMetadata( + NsArrayLpImageMetadata? self, + SseSerializer serializer, + ) { // Codec=Sse (Serialization based), see doc to use other codecs sse_encode_bool(self != null, serializer); if (self != null) { - sse_encode_CastedPrimitive_i_64(self, serializer); + sse_encode_box_autoadd_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerNSArrayLPImageMetadata( + self, + serializer, + ); } } @protected - void sse_encode_opt_CastedPrimitive_u_64( - int? self, SseSerializer serializer) { + void + sse_encode_opt_box_autoadd_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerPushError( + PushError? self, + SseSerializer serializer, + ) { // Codec=Sse (Serialization based), see doc to use other codecs sse_encode_bool(self != null, serializer); if (self != null) { - sse_encode_CastedPrimitive_u_64(self, serializer); + sse_encode_box_autoadd_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerPushError( + self, + serializer, + ); } } @protected - void sse_encode_opt_CastedPrimitive_usize( - int? self, SseSerializer serializer) { + void + sse_encode_opt_box_autoadd_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerSavedHardwareState( + SavedHardwareState? self, + SseSerializer serializer, + ) { // Codec=Sse (Serialization based), see doc to use other codecs sse_encode_bool(self != null, serializer); if (self != null) { - sse_encode_CastedPrimitive_usize(self, serializer); + sse_encode_box_autoadd_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerSavedHardwareState( + self, + serializer, + ); } } @protected - void sse_encode_opt_String(String? self, SseSerializer serializer) { + void + sse_encode_opt_box_autoadd_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerSyncManagerDefaultAnisetteProviderMyFilePackager( + SyncManagerDefaultAnisetteProviderMyFilePackager? self, + SseSerializer serializer, + ) { // Codec=Sse (Serialization based), see doc to use other codecs sse_encode_bool(self != null, serializer); if (self != null) { - sse_encode_String(self, serializer); + sse_encode_box_autoadd_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerSyncManagerDefaultAnisetteProviderMyFilePackager( + self, + serializer, + ); } } @protected void - sse_encode_opt_box_autoadd_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerAPSState( - ApsState? self, SseSerializer serializer) { + sse_encode_opt_box_autoadd_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerSystemTime( + SystemTime? self, + SseSerializer serializer, + ) { // Codec=Sse (Serialization based), see doc to use other codecs sse_encode_bool(self != null, serializer); if (self != null) { - sse_encode_box_autoadd_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerAPSState( - self, serializer); + sse_encode_box_autoadd_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerSystemTime( + self, + serializer, + ); } } @protected - void - sse_encode_opt_box_autoadd_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcCloudKitClientDefaultAnisetteProvider( - ArcCloudKitClientDefaultAnisetteProvider? self, - SseSerializer serializer) { + void sse_encode_opt_box_autoadd_address( + Address? self, + SseSerializer serializer, + ) { // Codec=Sse (Serialization based), see doc to use other codecs sse_encode_bool(self != null, serializer); if (self != null) { - sse_encode_box_autoadd_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcCloudKitClientDefaultAnisetteProvider( - self, serializer); + sse_encode_box_autoadd_address(self, serializer); } } @protected - void - sse_encode_opt_box_autoadd_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcCloudMessagesClientDefaultAnisetteProvider( - ArcCloudMessagesClientDefaultAnisetteProvider? self, - SseSerializer serializer) { + void sse_encode_opt_box_autoadd_attachment( + Attachment? self, + SseSerializer serializer, + ) { // Codec=Sse (Serialization based), see doc to use other codecs sse_encode_bool(self != null, serializer); if (self != null) { - sse_encode_box_autoadd_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcCloudMessagesClientDefaultAnisetteProvider( - self, serializer); + sse_encode_box_autoadd_attachment(self, serializer); } } @protected - void - sse_encode_opt_box_autoadd_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcFindMyClientDefaultAnisetteProvider( - ArcFindMyClientDefaultAnisetteProvider? self, - SseSerializer serializer) { + void sse_encode_opt_box_autoadd_attachment_meta_extra( + AttachmentMetaExtra? self, + SseSerializer serializer, + ) { // Codec=Sse (Serialization based), see doc to use other codecs sse_encode_bool(self != null, serializer); if (self != null) { - sse_encode_box_autoadd_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcFindMyClientDefaultAnisetteProvider( - self, serializer); + sse_encode_box_autoadd_attachment_meta_extra(self, serializer); } } @protected - void - sse_encode_opt_box_autoadd_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcKeychainClientDefaultAnisetteProvider( - ArcKeychainClientDefaultAnisetteProvider? self, - SseSerializer serializer) { + void sse_encode_opt_box_autoadd_balloon( + Balloon? self, + SseSerializer serializer, + ) { // Codec=Sse (Serialization based), see doc to use other codecs sse_encode_bool(self != null, serializer); if (self != null) { - sse_encode_box_autoadd_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcKeychainClientDefaultAnisetteProvider( - self, serializer); + sse_encode_box_autoadd_balloon(self, serializer); } } @protected - void - sse_encode_opt_box_autoadd_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcMutexAppleAccountDefaultAnisetteProvider( - ArcMutexAppleAccountDefaultAnisetteProvider? self, - SseSerializer serializer) { + void sse_encode_opt_box_autoadd_balloon_layout( + BalloonLayout? self, + SseSerializer serializer, + ) { // Codec=Sse (Serialization based), see doc to use other codecs sse_encode_bool(self != null, serializer); if (self != null) { - sse_encode_box_autoadd_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcMutexAppleAccountDefaultAnisetteProvider( - self, serializer); + sse_encode_box_autoadd_balloon_layout(self, serializer); } } @protected - void - sse_encode_opt_box_autoadd_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcPasswordManagerDefaultAnisetteProvider( - ArcPasswordManagerDefaultAnisetteProvider? self, - SseSerializer serializer) { + void sse_encode_opt_box_autoadd_bool(bool? self, SseSerializer serializer) { // Codec=Sse (Serialization based), see doc to use other codecs sse_encode_bool(self != null, serializer); if (self != null) { - sse_encode_box_autoadd_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcPasswordManagerDefaultAnisetteProvider( - self, serializer); + sse_encode_box_autoadd_bool(self, serializer); + } + } + + @protected + void sse_encode_opt_box_autoadd_certified_context( + CertifiedContext? self, + SseSerializer serializer, + ) { + // Codec=Sse (Serialization based), see doc to use other codecs + + sse_encode_bool(self != null, serializer); + if (self != null) { + sse_encode_box_autoadd_certified_context(self, serializer); } } @protected - void - sse_encode_opt_box_autoadd_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerAsset( - Asset? self, SseSerializer serializer) { + void sse_encode_opt_box_autoadd_cloud_attachment( + CloudAttachment? self, + SseSerializer serializer, + ) { // Codec=Sse (Serialization based), see doc to use other codecs sse_encode_bool(self != null, serializer); if (self != null) { - sse_encode_box_autoadd_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerAsset( - self, serializer); + sse_encode_box_autoadd_cloud_attachment(self, serializer); } } @protected - void - sse_encode_opt_box_autoadd_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerChannelInterestToken( - ChannelInterestToken? self, SseSerializer serializer) { + void sse_encode_opt_box_autoadd_cloud_chat( + CloudChat? self, + SseSerializer serializer, + ) { // Codec=Sse (Serialization based), see doc to use other codecs sse_encode_bool(self != null, serializer); if (self != null) { - sse_encode_box_autoadd_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerChannelInterestToken( - self, serializer); + sse_encode_box_autoadd_cloud_chat(self, serializer); } } @protected - void - sse_encode_opt_box_autoadd_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerCircleClientSessionDefaultAnisetteProvider( - CircleClientSessionDefaultAnisetteProvider? self, - SseSerializer serializer) { + void sse_encode_opt_box_autoadd_cloud_message( + CloudMessage? self, + SseSerializer serializer, + ) { // Codec=Sse (Serialization based), see doc to use other codecs sse_encode_bool(self != null, serializer); if (self != null) { - sse_encode_box_autoadd_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerCircleClientSessionDefaultAnisetteProvider( - self, serializer); + sse_encode_box_autoadd_cloud_message(self, serializer); } } @protected - void - sse_encode_opt_box_autoadd_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerConversationLink( - ConversationLink? self, SseSerializer serializer) { + void sse_encode_opt_box_autoadd_cloud_prop( + CloudProp? self, + SseSerializer serializer, + ) { // Codec=Sse (Serialization based), see doc to use other codecs sse_encode_bool(self != null, serializer); if (self != null) { - sse_encode_box_autoadd_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerConversationLink( - self, serializer); + sse_encode_box_autoadd_cloud_prop(self, serializer); } } @protected - void - sse_encode_opt_box_autoadd_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerConversationParticipant( - ConversationParticipant? self, SseSerializer serializer) { + void sse_encode_opt_box_autoadd_cloud_sync_outbound_failure_class( + CloudSyncOutboundFailureClass? self, + SseSerializer serializer, + ) { // Codec=Sse (Serialization based), see doc to use other codecs sse_encode_bool(self != null, serializer); if (self != null) { - sse_encode_box_autoadd_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerConversationParticipant( - self, serializer); + sse_encode_box_autoadd_cloud_sync_outbound_failure_class( + self, + serializer, + ); } } @protected - void - sse_encode_opt_box_autoadd_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerDate( - Date? self, SseSerializer serializer) { + void sse_encode_opt_box_autoadd_cloud_sync_outbound_reconcile_disposition( + CloudSyncOutboundReconcileDisposition? self, + SseSerializer serializer, + ) { // Codec=Sse (Serialization based), see doc to use other codecs sse_encode_bool(self != null, serializer); if (self != null) { - sse_encode_box_autoadd_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerDate( - self, serializer); + sse_encode_box_autoadd_cloud_sync_outbound_reconcile_disposition( + self, + serializer, + ); } } @protected - void - sse_encode_opt_box_autoadd_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerGZipWrapperChatProto( - GZipWrapperChatProto? self, SseSerializer serializer) { + void sse_encode_opt_box_autoadd_cloud_sync_outbound_safe_code( + CloudSyncOutboundSafeCode? self, + SseSerializer serializer, + ) { // Codec=Sse (Serialization based), see doc to use other codecs sse_encode_bool(self != null, serializer); if (self != null) { - sse_encode_box_autoadd_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerGZipWrapperChatProto( - self, serializer); + sse_encode_box_autoadd_cloud_sync_outbound_safe_code(self, serializer); } } @protected - void - sse_encode_opt_box_autoadd_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerGZipWrapperMessageProto2( - GZipWrapperMessageProto2? self, SseSerializer serializer) { + void sse_encode_opt_box_autoadd_cloud_sync_protected_failure( + CloudSyncProtectedFailure? self, + SseSerializer serializer, + ) { // Codec=Sse (Serialization based), see doc to use other codecs sse_encode_bool(self != null, serializer); if (self != null) { - sse_encode_box_autoadd_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerGZipWrapperMessageProto2( - self, serializer); + sse_encode_box_autoadd_cloud_sync_protected_failure(self, serializer); } } @protected - void - sse_encode_opt_box_autoadd_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerGZipWrapperMessageProto3( - GZipWrapperMessageProto3? self, SseSerializer serializer) { + void sse_encode_opt_box_autoadd_cloud_sync_protected_garbage_collection( + CloudSyncProtectedGarbageCollection? self, + SseSerializer serializer, + ) { // Codec=Sse (Serialization based), see doc to use other codecs sse_encode_bool(self != null, serializer); if (self != null) { - sse_encode_box_autoadd_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerGZipWrapperMessageProto3( - self, serializer); + sse_encode_box_autoadd_cloud_sync_protected_garbage_collection( + self, + serializer, + ); } } @protected - void - sse_encode_opt_box_autoadd_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerGZipWrapperMessageProto4( - GZipWrapperMessageProto4? self, SseSerializer serializer) { + void sse_encode_opt_box_autoadd_cloud_sync_protected_outbound_stage( + CloudSyncProtectedOutboundStage? self, + SseSerializer serializer, + ) { // Codec=Sse (Serialization based), see doc to use other codecs sse_encode_bool(self != null, serializer); if (self != null) { - sse_encode_box_autoadd_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerGZipWrapperMessageProto4( - self, serializer); + sse_encode_box_autoadd_cloud_sync_protected_outbound_stage( + self, + serializer, + ); } } @protected - void - sse_encode_opt_box_autoadd_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerIDSUser( - IdsUser? self, SseSerializer serializer) { + void sse_encode_opt_box_autoadd_cloud_sync_protected_page( + CloudSyncProtectedPage? self, + SseSerializer serializer, + ) { // Codec=Sse (Serialization based), see doc to use other codecs sse_encode_bool(self != null, serializer); if (self != null) { - sse_encode_box_autoadd_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerIDSUser( - self, serializer); + sse_encode_box_autoadd_cloud_sync_protected_page(self, serializer); } } @protected - void - sse_encode_opt_box_autoadd_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerLocationReport( - LocationReport? self, SseSerializer serializer) { + void sse_encode_opt_box_autoadd_cloud_sync_protected_preflight_code( + CloudSyncProtectedPreflightCode? self, + SseSerializer serializer, + ) { // Codec=Sse (Serialization based), see doc to use other codecs sse_encode_bool(self != null, serializer); if (self != null) { - sse_encode_box_autoadd_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerLocationReport( - self, serializer); + sse_encode_box_autoadd_cloud_sync_protected_preflight_code( + self, + serializer, + ); } } @protected - void - sse_encode_opt_box_autoadd_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerNSArrayLPIconMetadata( - NsArrayLpIconMetadata? self, SseSerializer serializer) { + void sse_encode_opt_box_autoadd_cloud_sync_protected_recovery( + CloudSyncProtectedRecovery? self, + SseSerializer serializer, + ) { // Codec=Sse (Serialization based), see doc to use other codecs sse_encode_bool(self != null, serializer); if (self != null) { - sse_encode_box_autoadd_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerNSArrayLPIconMetadata( - self, serializer); + sse_encode_box_autoadd_cloud_sync_protected_recovery(self, serializer); } } @protected - void - sse_encode_opt_box_autoadd_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerNSArrayLPImageMetadata( - NsArrayLpImageMetadata? self, SseSerializer serializer) { + void sse_encode_opt_box_autoadd_cloud_sync_raw_failure( + CloudSyncRawFailure? self, + SseSerializer serializer, + ) { // Codec=Sse (Serialization based), see doc to use other codecs sse_encode_bool(self != null, serializer); if (self != null) { - sse_encode_box_autoadd_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerNSArrayLPImageMetadata( - self, serializer); + sse_encode_box_autoadd_cloud_sync_raw_failure(self, serializer); } } @protected - void - sse_encode_opt_box_autoadd_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerPushError( - PushError? self, SseSerializer serializer) { + void sse_encode_opt_box_autoadd_cloud_sync_raw_page( + CloudSyncRawPage? self, + SseSerializer serializer, + ) { // Codec=Sse (Serialization based), see doc to use other codecs sse_encode_bool(self != null, serializer); if (self != null) { - sse_encode_box_autoadd_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerPushError( - self, serializer); + sse_encode_box_autoadd_cloud_sync_raw_page(self, serializer); } } @protected - void - sse_encode_opt_box_autoadd_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerSavedHardwareState( - SavedHardwareState? self, SseSerializer serializer) { + void sse_encode_opt_box_autoadd_cloud_sync_raw_system_fields( + CloudSyncRawSystemFields? self, + SseSerializer serializer, + ) { // Codec=Sse (Serialization based), see doc to use other codecs sse_encode_bool(self != null, serializer); if (self != null) { - sse_encode_box_autoadd_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerSavedHardwareState( - self, serializer); + sse_encode_box_autoadd_cloud_sync_raw_system_fields(self, serializer); } } @protected - void - sse_encode_opt_box_autoadd_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerSyncManagerDefaultAnisetteProviderMyFilePackager( - SyncManagerDefaultAnisetteProviderMyFilePackager? self, - SseSerializer serializer) { + void sse_encode_opt_box_autoadd_cloud_sync_transient_attachment_payload( + CloudSyncTransientAttachmentPayload? self, + SseSerializer serializer, + ) { // Codec=Sse (Serialization based), see doc to use other codecs sse_encode_bool(self != null, serializer); if (self != null) { - sse_encode_box_autoadd_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerSyncManagerDefaultAnisetteProviderMyFilePackager( - self, serializer); + sse_encode_box_autoadd_cloud_sync_transient_attachment_payload( + self, + serializer, + ); } } @protected - void - sse_encode_opt_box_autoadd_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerSystemTime( - SystemTime? self, SseSerializer serializer) { + void sse_encode_opt_box_autoadd_cloud_sync_transient_chat_payload( + CloudSyncTransientChatPayload? self, + SseSerializer serializer, + ) { // Codec=Sse (Serialization based), see doc to use other codecs sse_encode_bool(self != null, serializer); if (self != null) { - sse_encode_box_autoadd_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerSystemTime( - self, serializer); + sse_encode_box_autoadd_cloud_sync_transient_chat_payload( + self, + serializer, + ); } } @protected - void sse_encode_opt_box_autoadd_address( - Address? self, SseSerializer serializer) { + void sse_encode_opt_box_autoadd_cloud_sync_transient_deferred_reason( + CloudSyncTransientDeferredReason? self, + SseSerializer serializer, + ) { // Codec=Sse (Serialization based), see doc to use other codecs sse_encode_bool(self != null, serializer); if (self != null) { - sse_encode_box_autoadd_address(self, serializer); + sse_encode_box_autoadd_cloud_sync_transient_deferred_reason( + self, + serializer, + ); } } @protected - void sse_encode_opt_box_autoadd_attachment( - Attachment? self, SseSerializer serializer) { + void sse_encode_opt_box_autoadd_cloud_sync_transient_entity_kind( + CloudSyncTransientEntityKind? self, + SseSerializer serializer, + ) { // Codec=Sse (Serialization based), see doc to use other codecs sse_encode_bool(self != null, serializer); if (self != null) { - sse_encode_box_autoadd_attachment(self, serializer); + sse_encode_box_autoadd_cloud_sync_transient_entity_kind(self, serializer); } } @protected - void sse_encode_opt_box_autoadd_attachment_meta_extra( - AttachmentMetaExtra? self, SseSerializer serializer) { + void sse_encode_opt_box_autoadd_cloud_sync_transient_failure_code( + CloudSyncTransientFailureCode? self, + SseSerializer serializer, + ) { // Codec=Sse (Serialization based), see doc to use other codecs sse_encode_bool(self != null, serializer); if (self != null) { - sse_encode_box_autoadd_attachment_meta_extra(self, serializer); + sse_encode_box_autoadd_cloud_sync_transient_failure_code( + self, + serializer, + ); } } @protected - void sse_encode_opt_box_autoadd_balloon( - Balloon? self, SseSerializer serializer) { + void sse_encode_opt_box_autoadd_cloud_sync_transient_group_photo_payload( + CloudSyncTransientGroupPhotoPayload? self, + SseSerializer serializer, + ) { // Codec=Sse (Serialization based), see doc to use other codecs sse_encode_bool(self != null, serializer); if (self != null) { - sse_encode_box_autoadd_balloon(self, serializer); + sse_encode_box_autoadd_cloud_sync_transient_group_photo_payload( + self, + serializer, + ); } } @protected - void sse_encode_opt_box_autoadd_balloon_layout( - BalloonLayout? self, SseSerializer serializer) { + void sse_encode_opt_box_autoadd_cloud_sync_transient_message_payload( + CloudSyncTransientMessagePayload? self, + SseSerializer serializer, + ) { // Codec=Sse (Serialization based), see doc to use other codecs sse_encode_bool(self != null, serializer); if (self != null) { - sse_encode_box_autoadd_balloon_layout(self, serializer); + sse_encode_box_autoadd_cloud_sync_transient_message_payload( + self, + serializer, + ); } } @protected - void sse_encode_opt_box_autoadd_bool(bool? self, SseSerializer serializer) { + void sse_encode_opt_box_autoadd_cloud_sync_transient_mutation_kind( + CloudSyncTransientMutationKind? self, + SseSerializer serializer, + ) { // Codec=Sse (Serialization based), see doc to use other codecs sse_encode_bool(self != null, serializer); if (self != null) { - sse_encode_box_autoadd_bool(self, serializer); + sse_encode_box_autoadd_cloud_sync_transient_mutation_kind( + self, + serializer, + ); } } @protected - void sse_encode_opt_box_autoadd_certified_context( - CertifiedContext? self, SseSerializer serializer) { + void sse_encode_opt_box_autoadd_cloud_sync_transient_payload( + CloudSyncTransientPayload? self, + SseSerializer serializer, + ) { // Codec=Sse (Serialization based), see doc to use other codecs sse_encode_bool(self != null, serializer); if (self != null) { - sse_encode_box_autoadd_certified_context(self, serializer); + sse_encode_box_autoadd_cloud_sync_transient_payload(self, serializer); } } @protected - void sse_encode_opt_box_autoadd_cloud_attachment( - CloudAttachment? self, SseSerializer serializer) { + void sse_encode_opt_box_autoadd_cloud_sync_transient_quarantine_reason( + CloudSyncTransientQuarantineReason? self, + SseSerializer serializer, + ) { // Codec=Sse (Serialization based), see doc to use other codecs sse_encode_bool(self != null, serializer); if (self != null) { - sse_encode_box_autoadd_cloud_attachment(self, serializer); + sse_encode_box_autoadd_cloud_sync_transient_quarantine_reason( + self, + serializer, + ); } } @protected - void sse_encode_opt_box_autoadd_cloud_chat( - CloudChat? self, SseSerializer serializer) { + void sse_encode_opt_box_autoadd_cloud_sync_transient_reaction_kind( + CloudSyncTransientReactionKind? self, + SseSerializer serializer, + ) { // Codec=Sse (Serialization based), see doc to use other codecs sse_encode_bool(self != null, serializer); if (self != null) { - sse_encode_box_autoadd_cloud_chat(self, serializer); + sse_encode_box_autoadd_cloud_sync_transient_reaction_kind( + self, + serializer, + ); } } @protected - void sse_encode_opt_box_autoadd_cloud_message( - CloudMessage? self, SseSerializer serializer) { + void sse_encode_opt_box_autoadd_cloud_sync_transient_snapshot( + CloudSyncTransientSnapshot? self, + SseSerializer serializer, + ) { // Codec=Sse (Serialization based), see doc to use other codecs sse_encode_bool(self != null, serializer); if (self != null) { - sse_encode_box_autoadd_cloud_message(self, serializer); + sse_encode_box_autoadd_cloud_sync_transient_snapshot(self, serializer); } } @protected - void sse_encode_opt_box_autoadd_cloud_prop( - CloudProp? self, SseSerializer serializer) { + void sse_encode_opt_box_autoadd_cloud_sync_transient_tombstone( + CloudSyncTransientTombstone? self, + SseSerializer serializer, + ) { // Codec=Sse (Serialization based), see doc to use other codecs sse_encode_bool(self != null, serializer); if (self != null) { - sse_encode_box_autoadd_cloud_prop(self, serializer); + sse_encode_box_autoadd_cloud_sync_transient_tombstone(self, serializer); } } @protected void sse_encode_opt_box_autoadd_conversation_data( - ConversationData? self, SseSerializer serializer) { + ConversationData? self, + SseSerializer serializer, + ) { // Codec=Sse (Serialization based), see doc to use other codecs sse_encode_bool(self != null, serializer); @@ -29101,7 +40124,9 @@ class RustLibApiImpl extends RustLibApiImplPlatform implements RustLibApi { @protected void sse_encode_opt_box_autoadd_dart_beacon_share_info( - DartBeaconShareInfo? self, SseSerializer serializer) { + DartBeaconShareInfo? self, + SseSerializer serializer, + ) { // Codec=Sse (Serialization based), see doc to use other codecs sse_encode_bool(self != null, serializer); @@ -29112,7 +40137,9 @@ class RustLibApiImpl extends RustLibApiImplPlatform implements RustLibApi { @protected void sse_encode_opt_box_autoadd_extension_app( - ExtensionApp? self, SseSerializer serializer) { + ExtensionApp? self, + SseSerializer serializer, + ) { // Codec=Sse (Serialization based), see doc to use other codecs sse_encode_bool(self != null, serializer); @@ -29133,7 +40160,9 @@ class RustLibApiImpl extends RustLibApiImplPlatform implements RustLibApi { @protected void sse_encode_opt_box_autoadd_ft_mode( - FTMode? self, SseSerializer serializer) { + FTMode? self, + SseSerializer serializer, + ) { // Codec=Sse (Serialization based), see doc to use other codecs sse_encode_bool(self != null, serializer); @@ -29154,7 +40183,9 @@ class RustLibApiImpl extends RustLibApiImplPlatform implements RustLibApi { @protected void sse_encode_opt_box_autoadd_i_64( - PlatformInt64? self, SseSerializer serializer) { + PlatformInt64? self, + SseSerializer serializer, + ) { // Codec=Sse (Serialization based), see doc to use other codecs sse_encode_bool(self != null, serializer); @@ -29165,7 +40196,9 @@ class RustLibApiImpl extends RustLibApiImplPlatform implements RustLibApi { @protected void sse_encode_opt_box_autoadd_i_message_poster_record( - IMessagePosterRecord? self, SseSerializer serializer) { + IMessagePosterRecord? self, + SseSerializer serializer, + ) { // Codec=Sse (Serialization based), see doc to use other codecs sse_encode_bool(self != null, serializer); @@ -29176,7 +40209,9 @@ class RustLibApiImpl extends RustLibApiImplPlatform implements RustLibApi { @protected void sse_encode_opt_box_autoadd_idms_requested_sign_in( - IdmsRequestedSignIn? self, SseSerializer serializer) { + IdmsRequestedSignIn? self, + SseSerializer serializer, + ) { // Codec=Sse (Serialization based), see doc to use other codecs sse_encode_bool(self != null, serializer); @@ -29187,7 +40222,9 @@ class RustLibApiImpl extends RustLibApiImplPlatform implements RustLibApi { @protected void sse_encode_opt_box_autoadd_link_meta( - LinkMeta? self, SseSerializer serializer) { + LinkMeta? self, + SseSerializer serializer, + ) { // Codec=Sse (Serialization based), see doc to use other codecs sse_encode_bool(self != null, serializer); @@ -29198,7 +40235,9 @@ class RustLibApiImpl extends RustLibApiImplPlatform implements RustLibApi { @protected void sse_encode_opt_box_autoadd_location( - Location? self, SseSerializer serializer) { + Location? self, + SseSerializer serializer, + ) { // Codec=Sse (Serialization based), see doc to use other codecs sse_encode_bool(self != null, serializer); @@ -29209,7 +40248,9 @@ class RustLibApiImpl extends RustLibApiImplPlatform implements RustLibApi { @protected void sse_encode_opt_box_autoadd_login_state( - LoginState? self, SseSerializer serializer) { + LoginState? self, + SseSerializer serializer, + ) { // Codec=Sse (Serialization based), see doc to use other codecs sse_encode_bool(self != null, serializer); @@ -29220,7 +40261,9 @@ class RustLibApiImpl extends RustLibApiImplPlatform implements RustLibApi { @protected void sse_encode_opt_box_autoadd_lp_icon_metadata( - LPIconMetadata? self, SseSerializer serializer) { + LPIconMetadata? self, + SseSerializer serializer, + ) { // Codec=Sse (Serialization based), see doc to use other codecs sse_encode_bool(self != null, serializer); @@ -29231,7 +40274,9 @@ class RustLibApiImpl extends RustLibApiImplPlatform implements RustLibApi { @protected void sse_encode_opt_box_autoadd_lp_image_metadata( - LPImageMetadata? self, SseSerializer serializer) { + LPImageMetadata? self, + SseSerializer serializer, + ) { // Codec=Sse (Serialization based), see doc to use other codecs sse_encode_bool(self != null, serializer); @@ -29242,7 +40287,9 @@ class RustLibApiImpl extends RustLibApiImplPlatform implements RustLibApi { @protected void sse_encode_opt_box_autoadd_lp_specialization_metadata( - LPSpecializationMetadata? self, SseSerializer serializer) { + LPSpecializationMetadata? self, + SseSerializer serializer, + ) { // Codec=Sse (Serialization based), see doc to use other codecs sse_encode_bool(self != null, serializer); @@ -29253,7 +40300,9 @@ class RustLibApiImpl extends RustLibApiImplPlatform implements RustLibApi { @protected void sse_encode_opt_box_autoadd_mmcs_attachment_meta( - MMCSAttachmentMeta? self, SseSerializer serializer) { + MMCSAttachmentMeta? self, + SseSerializer serializer, + ) { // Codec=Sse (Serialization based), see doc to use other codecs sse_encode_bool(self != null, serializer); @@ -29264,7 +40313,9 @@ class RustLibApiImpl extends RustLibApiImplPlatform implements RustLibApi { @protected void sse_encode_opt_box_autoadd_mmcs_file( - MMCSFile? self, SseSerializer serializer) { + MMCSFile? self, + SseSerializer serializer, + ) { // Codec=Sse (Serialization based), see doc to use other codecs sse_encode_bool(self != null, serializer); @@ -29285,7 +40336,9 @@ class RustLibApiImpl extends RustLibApiImplPlatform implements RustLibApi { @protected void sse_encode_opt_box_autoadd_num_or_string( - NumOrString? self, SseSerializer serializer) { + NumOrString? self, + SseSerializer serializer, + ) { // Codec=Sse (Serialization based), see doc to use other codecs sse_encode_bool(self != null, serializer); @@ -29296,7 +40349,9 @@ class RustLibApiImpl extends RustLibApiImplPlatform implements RustLibApi { @protected void sse_encode_opt_box_autoadd_part_extension( - PartExtension? self, SseSerializer serializer) { + PartExtension? self, + SseSerializer serializer, + ) { // Codec=Sse (Serialization based), see doc to use other codecs sse_encode_bool(self != null, serializer); @@ -29307,19 +40362,25 @@ class RustLibApiImpl extends RustLibApiImplPlatform implements RustLibApi { @protected void sse_encode_opt_box_autoadd_password_manager_meta_data_formerly_shared( - PasswordManagerMetaDataFormerlyShared? self, SseSerializer serializer) { + PasswordManagerMetaDataFormerlyShared? self, + SseSerializer serializer, + ) { // Codec=Sse (Serialization based), see doc to use other codecs sse_encode_bool(self != null, serializer); if (self != null) { sse_encode_box_autoadd_password_manager_meta_data_formerly_shared( - self, serializer); + self, + serializer, + ); } } @protected void sse_encode_opt_box_autoadd_password_manager_totp( - PasswordManagerTotp? self, SseSerializer serializer) { + PasswordManagerTotp? self, + SseSerializer serializer, + ) { // Codec=Sse (Serialization based), see doc to use other codecs sse_encode_bool(self != null, serializer); @@ -29330,7 +40391,9 @@ class RustLibApiImpl extends RustLibApiImplPlatform implements RustLibApi { @protected void sse_encode_opt_box_autoadd_poster_color( - PosterColor? self, SseSerializer serializer) { + PosterColor? self, + SseSerializer serializer, + ) { // Codec=Sse (Serialization based), see doc to use other codecs sse_encode_bool(self != null, serializer); @@ -29341,7 +40404,9 @@ class RustLibApiImpl extends RustLibApiImplPlatform implements RustLibApi { @protected void sse_encode_opt_box_autoadd_pr_poster_content_material_style( - PRPosterContentMaterialStyle? self, SseSerializer serializer) { + PRPosterContentMaterialStyle? self, + SseSerializer serializer, + ) { // Codec=Sse (Serialization based), see doc to use other codecs sse_encode_bool(self != null, serializer); @@ -29352,7 +40417,9 @@ class RustLibApiImpl extends RustLibApiImplPlatform implements RustLibApi { @protected void sse_encode_opt_box_autoadd_push_message( - PushMessage? self, SseSerializer serializer) { + PushMessage? self, + SseSerializer serializer, + ) { // Codec=Sse (Serialization based), see doc to use other codecs sse_encode_bool(self != null, serializer); @@ -29363,20 +40430,26 @@ class RustLibApiImpl extends RustLibApiImplPlatform implements RustLibApi { @protected void - sse_encode_opt_box_autoadd_record_shared_push_state_auto_owned_rust_opaque_flutter_rust_bridgefor_generated_rust_auto_opaque_inner_aps_watcher( - (SharedPushState, ApsWatcher)? self, SseSerializer serializer) { + sse_encode_opt_box_autoadd_record_shared_push_state_auto_owned_rust_opaque_flutter_rust_bridgefor_generated_rust_auto_opaque_inner_aps_watcher( + (SharedPushState, ApsWatcher)? self, + SseSerializer serializer, + ) { // Codec=Sse (Serialization based), see doc to use other codecs sse_encode_bool(self != null, serializer); if (self != null) { sse_encode_box_autoadd_record_shared_push_state_auto_owned_rust_opaque_flutter_rust_bridgefor_generated_rust_auto_opaque_inner_aps_watcher( - self, serializer); + self, + serializer, + ); } } @protected void sse_encode_opt_box_autoadd_record_string_string( - (String, String)? self, SseSerializer serializer) { + (String, String)? self, + SseSerializer serializer, + ) { // Codec=Sse (Serialization based), see doc to use other codecs sse_encode_bool(self != null, serializer); @@ -29387,7 +40460,9 @@ class RustLibApiImpl extends RustLibApiImplPlatform implements RustLibApi { @protected void sse_encode_opt_box_autoadd_record_string_u_64( - (String, BigInt)? self, SseSerializer serializer) { + (String, BigInt)? self, + SseSerializer serializer, + ) { // Codec=Sse (Serialization based), see doc to use other codecs sse_encode_bool(self != null, serializer); @@ -29398,19 +40473,25 @@ class RustLibApiImpl extends RustLibApiImplPlatform implements RustLibApi { @protected void sse_encode_opt_box_autoadd_rich_link_image_attachment_substitute( - RichLinkImageAttachmentSubstitute? self, SseSerializer serializer) { + RichLinkImageAttachmentSubstitute? self, + SseSerializer serializer, + ) { // Codec=Sse (Serialization based), see doc to use other codecs sse_encode_bool(self != null, serializer); if (self != null) { sse_encode_box_autoadd_rich_link_image_attachment_substitute( - self, serializer); + self, + serializer, + ); } } @protected void sse_encode_opt_box_autoadd_schedule_mode( - ScheduleMode? self, SseSerializer serializer) { + ScheduleMode? self, + SseSerializer serializer, + ) { // Codec=Sse (Serialization based), see doc to use other codecs sse_encode_bool(self != null, serializer); @@ -29421,7 +40502,9 @@ class RustLibApiImpl extends RustLibApiImplPlatform implements RustLibApi { @protected void sse_encode_opt_box_autoadd_share_profile_message( - ShareProfileMessage? self, SseSerializer serializer) { + ShareProfileMessage? self, + SseSerializer serializer, + ) { // Codec=Sse (Serialization based), see doc to use other codecs sse_encode_bool(self != null, serializer); @@ -29432,7 +40515,9 @@ class RustLibApiImpl extends RustLibApiImplPlatform implements RustLibApi { @protected void sse_encode_opt_box_autoadd_shared_i_cloud_services( - SharedICloudServices? self, SseSerializer serializer) { + SharedICloudServices? self, + SseSerializer serializer, + ) { // Codec=Sse (Serialization based), see doc to use other codecs sse_encode_bool(self != null, serializer); @@ -29443,7 +40528,9 @@ class RustLibApiImpl extends RustLibApiImplPlatform implements RustLibApi { @protected void sse_encode_opt_box_autoadd_shared_poster( - SharedPoster? self, SseSerializer serializer) { + SharedPoster? self, + SseSerializer serializer, + ) { // Codec=Sse (Serialization based), see doc to use other codecs sse_encode_bool(self != null, serializer); @@ -29454,7 +40541,9 @@ class RustLibApiImpl extends RustLibApiImplPlatform implements RustLibApi { @protected void sse_encode_opt_box_autoadd_shared_push_state( - SharedPushState? self, SseSerializer serializer) { + SharedPushState? self, + SseSerializer serializer, + ) { // Codec=Sse (Serialization based), see doc to use other codecs sse_encode_bool(self != null, serializer); @@ -29465,7 +40554,9 @@ class RustLibApiImpl extends RustLibApiImplPlatform implements RustLibApi { @protected void sse_encode_opt_box_autoadd_support_action( - SupportAction? self, SseSerializer serializer) { + SupportAction? self, + SseSerializer serializer, + ) { // Codec=Sse (Serialization based), see doc to use other codecs sse_encode_bool(self != null, serializer); @@ -29476,7 +40567,9 @@ class RustLibApiImpl extends RustLibApiImplPlatform implements RustLibApi { @protected void sse_encode_opt_box_autoadd_support_alert( - SupportAlert? self, SseSerializer serializer) { + SupportAlert? self, + SseSerializer serializer, + ) { // Codec=Sse (Serialization based), see doc to use other codecs sse_encode_bool(self != null, serializer); @@ -29487,7 +40580,9 @@ class RustLibApiImpl extends RustLibApiImplPlatform implements RustLibApi { @protected void sse_encode_opt_box_autoadd_typing_app( - TypingApp? self, SseSerializer serializer) { + TypingApp? self, + SseSerializer serializer, + ) { // Codec=Sse (Serialization based), see doc to use other codecs sse_encode_bool(self != null, serializer); @@ -29496,6 +40591,16 @@ class RustLibApiImpl extends RustLibApiImplPlatform implements RustLibApi { } } + @protected + void sse_encode_opt_box_autoadd_u_16(int? self, SseSerializer serializer) { + // Codec=Sse (Serialization based), see doc to use other codecs + + sse_encode_bool(self != null, serializer); + if (self != null) { + sse_encode_box_autoadd_u_16(self, serializer); + } + } + @protected void sse_encode_opt_box_autoadd_u_32(int? self, SseSerializer serializer) { // Codec=Sse (Serialization based), see doc to use other codecs @@ -29518,7 +40623,9 @@ class RustLibApiImpl extends RustLibApiImplPlatform implements RustLibApi { @protected void sse_encode_opt_box_autoadd_update_account_finish( - UpdateAccountFinish? self, SseSerializer serializer) { + UpdateAccountFinish? self, + SseSerializer serializer, + ) { // Codec=Sse (Serialization based), see doc to use other codecs sse_encode_bool(self != null, serializer); @@ -29529,20 +40636,26 @@ class RustLibApiImpl extends RustLibApiImplPlatform implements RustLibApi { @protected void - sse_encode_opt_list_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerIDSUser( - List? self, SseSerializer serializer) { + sse_encode_opt_list_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerIDSUser( + List? self, + SseSerializer serializer, + ) { // Codec=Sse (Serialization based), see doc to use other codecs sse_encode_bool(self != null, serializer); if (self != null) { sse_encode_list_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerIDSUser( - self, serializer); + self, + serializer, + ); } } @protected void sse_encode_opt_list_String( - List? self, SseSerializer serializer) { + List? self, + SseSerializer serializer, + ) { // Codec=Sse (Serialization based), see doc to use other codecs sse_encode_bool(self != null, serializer); @@ -29553,7 +40666,9 @@ class RustLibApiImpl extends RustLibApiImplPlatform implements RustLibApi { @protected void sse_encode_opt_list_message_target( - List? self, SseSerializer serializer) { + List? self, + SseSerializer serializer, + ) { // Codec=Sse (Serialization based), see doc to use other codecs sse_encode_bool(self != null, serializer); @@ -29564,7 +40679,9 @@ class RustLibApiImpl extends RustLibApiImplPlatform implements RustLibApi { @protected void sse_encode_opt_list_prim_u_8_strict( - Uint8List? self, SseSerializer serializer) { + Uint8List? self, + SseSerializer serializer, + ) { // Codec=Sse (Serialization based), see doc to use other codecs sse_encode_bool(self != null, serializer); @@ -29578,20 +40695,20 @@ class RustLibApiImpl extends RustLibApiImplPlatform implements RustLibApi { // Codec=Sse (Serialization based), see doc to use other codecs switch (self) { case PartExtension_Sticker( - msgWidth: final msgWidth, - rotation: final rotation, - sai: final sai, - scale: final scale, - update: final update, - sli: final sli, - normalizedX: final normalizedX, - normalizedY: final normalizedY, - version: final version, - hash: final hash, - safi: final safi, - effectType: final effectType, - stickerId: final stickerId - ): + msgWidth: final msgWidth, + rotation: final rotation, + sai: final sai, + scale: final scale, + update: final update, + sli: final sli, + normalizedX: final normalizedX, + normalizedY: final normalizedY, + version: final version, + hash: final hash, + safi: final safi, + effectType: final effectType, + stickerId: final stickerId, + ): sse_encode_i_32(0, serializer); sse_encode_f_64(msgWidth, serializer); sse_encode_f_64(rotation, serializer); @@ -29625,14 +40742,18 @@ class RustLibApiImpl extends RustLibApiImplPlatform implements RustLibApi { @protected void sse_encode_password_manager_alt_domain( - PasswordManagerAltDomain self, SseSerializer serializer) { + PasswordManagerAltDomain self, + SseSerializer serializer, + ) { // Codec=Sse (Serialization based), see doc to use other codecs sse_encode_String(self.domain, serializer); } @protected void sse_encode_password_manager_meta( - PasswordManagerMeta self, SseSerializer serializer) { + PasswordManagerMeta self, + SseSerializer serializer, + ) { // Codec=Sse (Serialization based), see doc to use other codecs sse_encode_CastedPrimitive_u_64(self.cdat, serializer); sse_encode_CastedPrimitive_u_64(self.mdat, serializer); @@ -29644,7 +40765,9 @@ class RustLibApiImpl extends RustLibApiImplPlatform implements RustLibApi { @protected void sse_encode_password_manager_meta_change( - PasswordManagerMetaChange self, SseSerializer serializer) { + PasswordManagerMetaChange self, + SseSerializer serializer, + ) { // Codec=Sse (Serialization based), see doc to use other codecs sse_encode_CastedPrimitive_u_64(self.date, serializer); sse_encode_opt_String(self.password, serializer); @@ -29658,7 +40781,9 @@ class RustLibApiImpl extends RustLibApiImplPlatform implements RustLibApi { @protected void sse_encode_password_manager_meta_data( - PasswordManagerMetaData self, SseSerializer serializer) { + PasswordManagerMetaData self, + SseSerializer serializer, + ) { // Codec=Sse (Serialization based), see doc to use other codecs sse_encode_list_password_manager_meta_change(self.history, serializer); sse_encode_list_password_manager_alt_domain(self.altDomains, serializer); @@ -29667,20 +40792,26 @@ class RustLibApiImpl extends RustLibApiImplPlatform implements RustLibApi { sse_encode_opt_list_prim_u_8_strict(self.title, serializer); sse_encode_opt_list_prim_u_8_strict(self.notes, serializer); sse_encode_opt_box_autoadd_password_manager_meta_data_formerly_shared( - self.formerlyShared, serializer); + self.formerlyShared, + serializer, + ); sse_encode_opt_list_prim_u_8_strict(self.ocpid, serializer); } @protected void sse_encode_password_manager_meta_data_ctx( - PasswordManagerMetaDataCtx self, SseSerializer serializer) { + PasswordManagerMetaDataCtx self, + SseSerializer serializer, + ) { // Codec=Sse (Serialization based), see doc to use other codecs sse_encode_f_64(self.lastUsed, serializer); } @protected void sse_encode_password_manager_meta_data_formerly_shared( - PasswordManagerMetaDataFormerlyShared self, SseSerializer serializer) { + PasswordManagerMetaDataFormerlyShared self, + SseSerializer serializer, + ) { // Codec=Sse (Serialization based), see doc to use other codecs sse_encode_opt_String(self.groupName, serializer); sse_encode_opt_String(self.passwordManagerCredentialIdentifier, serializer); @@ -29688,7 +40819,9 @@ class RustLibApiImpl extends RustLibApiImplPlatform implements RustLibApi { @protected void sse_encode_password_manager_totp( - PasswordManagerTotp self, SseSerializer serializer) { + PasswordManagerTotp self, + SseSerializer serializer, + ) { // Codec=Sse (Serialization based), see doc to use other codecs sse_encode_list_prim_u_8_strict(self.secret, serializer); sse_encode_u_32(self.digits, serializer); @@ -29702,7 +40835,9 @@ class RustLibApiImpl extends RustLibApiImplPlatform implements RustLibApi { @protected void sse_encode_password_raw_entry( - PasswordRawEntry self, SseSerializer serializer) { + PasswordRawEntry self, + SseSerializer serializer, + ) { // Codec=Sse (Serialization based), see doc to use other codecs sse_encode_CastedPrimitive_u_64(self.cdat, serializer); sse_encode_CastedPrimitive_u_64(self.mdat, serializer); @@ -29714,7 +40849,9 @@ class RustLibApiImpl extends RustLibApiImplPlatform implements RustLibApi { @protected void sse_encode_permanent_delete_message( - PermanentDeleteMessage self, SseSerializer serializer) { + PermanentDeleteMessage self, + SseSerializer serializer, + ) { // Codec=Sse (Serialization based), see doc to use other codecs sse_encode_delete_target(self.target, serializer); sse_encode_bool(self.isScheduled, serializer); @@ -29722,7 +40859,9 @@ class RustLibApiImpl extends RustLibApiImplPlatform implements RustLibApi { @protected void sse_encode_photo_poster_contents( - PhotoPosterContents self, SseSerializer serializer) { + PhotoPosterContents self, + SseSerializer serializer, + ) { // Codec=Sse (Serialization based), see doc to use other codecs sse_encode_u_32(self.version, serializer); sse_encode_list_photo_poster_layer(self.layers, serializer); @@ -29731,7 +40870,9 @@ class RustLibApiImpl extends RustLibApiImplPlatform implements RustLibApi { @protected void sse_encode_photo_poster_contents_frame( - PhotoPosterContentsFrame self, SseSerializer serializer) { + PhotoPosterContentsFrame self, + SseSerializer serializer, + ) { // Codec=Sse (Serialization based), see doc to use other codecs sse_encode_f_64(self.width, serializer); sse_encode_f_64(self.height, serializer); @@ -29741,7 +40882,9 @@ class RustLibApiImpl extends RustLibApiImplPlatform implements RustLibApi { @protected void sse_encode_photo_poster_contents_size( - PhotoPosterContentsSize self, SseSerializer serializer) { + PhotoPosterContentsSize self, + SseSerializer serializer, + ) { // Codec=Sse (Serialization based), see doc to use other codecs sse_encode_f_64(self.width, serializer); sse_encode_f_64(self.height, serializer); @@ -29749,7 +40892,9 @@ class RustLibApiImpl extends RustLibApiImplPlatform implements RustLibApi { @protected void sse_encode_photo_poster_layer( - PhotoPosterLayer self, SseSerializer serializer) { + PhotoPosterLayer self, + SseSerializer serializer, + ) { // Codec=Sse (Serialization based), see doc to use other codecs sse_encode_photo_poster_contents_frame(self.frame, serializer); sse_encode_String(self.filename, serializer); @@ -29759,7 +40904,9 @@ class RustLibApiImpl extends RustLibApiImplPlatform implements RustLibApi { @protected void sse_encode_photo_poster_layout( - PhotoPosterLayout self, SseSerializer serializer) { + PhotoPosterLayout self, + SseSerializer serializer, + ) { // Codec=Sse (Serialization based), see doc to use other codecs sse_encode_u_32(self.clockIntersection, serializer); sse_encode_photo_poster_contents_size(self.deviceResolution, serializer); @@ -29774,7 +40921,9 @@ class RustLibApiImpl extends RustLibApiImplPlatform implements RustLibApi { @protected void sse_encode_photo_poster_properties( - PhotoPosterProperties self, SseSerializer serializer) { + PhotoPosterProperties self, + SseSerializer serializer, + ) { // Codec=Sse (Serialization based), see doc to use other codecs sse_encode_photo_poster_layout(self.portraitLayout, serializer); sse_encode_bool(self.settlingEffectEnabled, serializer); @@ -29848,7 +40997,9 @@ class RustLibApiImpl extends RustLibApiImplPlatform implements RustLibApi { @protected void sse_encode_pr_poster_color( - PRPosterColor self, SseSerializer serializer) { + PRPosterColor self, + SseSerializer serializer, + ) { // Codec=Sse (Serialization based), see doc to use other codecs sse_encode_u_32(self.preferredStyle, serializer); sse_encode_String(self.identifier, serializer); @@ -29858,16 +41009,18 @@ class RustLibApiImpl extends RustLibApiImplPlatform implements RustLibApi { @protected void sse_encode_pr_poster_content_material_style( - PRPosterContentMaterialStyle self, SseSerializer serializer) { + PRPosterContentMaterialStyle self, + SseSerializer serializer, + ) { // Codec=Sse (Serialization based), see doc to use other codecs switch (self) { case PRPosterContentMaterialStyle_PRPosterContentDiscreteColorsStyle( - variation: final variation, - colors: final colors, - vibrant: final vibrant, - supportsVariation: final supportsVariation, - needsToResolveVariation: final needsToResolveVariation - ): + variation: final variation, + colors: final colors, + vibrant: final vibrant, + supportsVariation: final supportsVariation, + needsToResolveVariation: final needsToResolveVariation, + ): sse_encode_i_32(0, serializer); sse_encode_f_32(variation, serializer); sse_encode_list_ui_color(colors, serializer); @@ -29877,12 +41030,12 @@ class RustLibApiImpl extends RustLibApiImplPlatform implements RustLibApi { case PRPosterContentMaterialStyle_PRPosterContentVibrantMaterialStyle(): sse_encode_i_32(1, serializer); case PRPosterContentMaterialStyle_PRPosterContentGradientStyle( - gradientType: final gradientType, - colors: final colors, - startPoint: final startPoint, - locations: final locations, - endPoint: final endPoint - ): + gradientType: final gradientType, + colors: final colors, + startPoint: final startPoint, + locations: final locations, + endPoint: final endPoint, + ): sse_encode_i_32(2, serializer); sse_encode_u_32(gradientType, serializer); sse_encode_list_ui_color(colors, serializer); @@ -29896,7 +41049,9 @@ class RustLibApiImpl extends RustLibApiImplPlatform implements RustLibApi { @protected void sse_encode_pr_poster_system_time_font_configuration( - PRPosterSystemTimeFontConfiguration self, SseSerializer serializer) { + PRPosterSystemTimeFontConfiguration self, + SseSerializer serializer, + ) { // Codec=Sse (Serialization based), see doc to use other codecs sse_encode_bool(self.isSystemItem, serializer); sse_encode_String(self.timeFontIdentifier, serializer); @@ -29905,7 +41060,9 @@ class RustLibApiImpl extends RustLibApiImplPlatform implements RustLibApi { @protected void sse_encode_pr_poster_title_style_configuration( - PRPosterTitleStyleConfiguration self, SseSerializer serializer) { + PRPosterTitleStyleConfiguration self, + SseSerializer serializer, + ) { // Codec=Sse (Serialization based), see doc to use other codecs sse_encode_bool(self.alternateDateEnabled, serializer); sse_encode_f_64(self.contentsLuminence, serializer); @@ -29913,18 +41070,24 @@ class RustLibApiImpl extends RustLibApiImplPlatform implements RustLibApi { sse_encode_u_32(self.preferredTitleAlignment, serializer); sse_encode_u_32(self.preferredTitleLayout, serializer); sse_encode_pr_poster_system_time_font_configuration( - self.timeFontConfiguration, serializer); + self.timeFontConfiguration, + serializer, + ); sse_encode_opt_list_prim_u_8_strict(self.timeNumberingSystem, serializer); sse_encode_pr_poster_color(self.titleColor, serializer); sse_encode_list_prim_u_8_strict(self.titleContentStyle, serializer); sse_encode_bool(self.userConfigured, serializer); sse_encode_opt_box_autoadd_pr_poster_content_material_style( - self.titleStyle, serializer); + self.titleStyle, + serializer, + ); } @protected void sse_encode_private_device_info( - PrivateDeviceInfo self, SseSerializer serializer) { + PrivateDeviceInfo self, + SseSerializer serializer, + ) { // Codec=Sse (Serialization based), see doc to use other codecs sse_encode_opt_String(self.uuid, serializer); sse_encode_opt_String(self.deviceName, serializer); @@ -29936,7 +41099,9 @@ class RustLibApiImpl extends RustLibApiImplPlatform implements RustLibApi { @protected void sse_encode_provisioned_flavor( - ProvisionedFlavor self, SseSerializer serializer) { + ProvisionedFlavor self, + SseSerializer serializer, + ) { // Codec=Sse (Serialization based), see doc to use other codecs sse_encode_i_32(self.index, serializer); } @@ -29973,10 +41138,10 @@ class RustLibApiImpl extends RustLibApiImplPlatform implements RustLibApi { case PushMessage_CircleFinishEvent(): sse_encode_i_32(8, serializer); case PushMessage_BeaconShared( - sender: final sender, - beacon: final beacon, - attributes: final attributes - ): + sender: final sender, + beacon: final beacon, + attributes: final attributes, + ): sse_encode_i_32(9, serializer); sse_encode_String(sender, serializer); sse_encode_String(beacon, serializer); @@ -30002,26 +41167,30 @@ class RustLibApiImpl extends RustLibApiImplPlatform implements RustLibApi { sse_encode_react_message_type(self.reaction, serializer); sse_encode_String(self.toText, serializer); sse_encode_opt_box_autoadd_share_profile_message( - self.embeddedProfile, serializer); + self.embeddedProfile, + serializer, + ); } @protected void sse_encode_react_message_type( - ReactMessageType self, SseSerializer serializer) { + ReactMessageType self, + SseSerializer serializer, + ) { // Codec=Sse (Serialization based), see doc to use other codecs switch (self) { case ReactMessageType_React( - reaction: final reaction, - enable: final enable - ): + reaction: final reaction, + enable: final enable, + ): sse_encode_i_32(0, serializer); sse_encode_box_autoadd_reaction(reaction, serializer); sse_encode_bool(enable, serializer); case ReactMessageType_Extension( - spec: final spec, - body: final body, - isMeta: final isMeta - ): + spec: final spec, + body: final body, + isMeta: final isMeta, + ): sse_encode_i_32(1, serializer); sse_encode_box_autoadd_extension_app(spec, serializer); sse_encode_box_autoadd_message_parts(body, serializer); @@ -30061,72 +41230,91 @@ class RustLibApiImpl extends RustLibApiImplPlatform implements RustLibApi { @protected void - sse_encode_record_auto_owned_rust_opaque_flutter_rust_bridgefor_generated_rust_auto_opaque_inner_aps_connection_opt_box_autoadd_auto_owned_rust_opaque_flutter_rust_bridgefor_generated_rust_auto_opaque_inner_push_error( - (ApsConnection, PushError?) self, SseSerializer serializer) { + sse_encode_record_auto_owned_rust_opaque_flutter_rust_bridgefor_generated_rust_auto_opaque_inner_aps_connection_opt_box_autoadd_auto_owned_rust_opaque_flutter_rust_bridgefor_generated_rust_auto_opaque_inner_push_error( + (ApsConnection, PushError?) self, + SseSerializer serializer, + ) { // Codec=Sse (Serialization based), see doc to use other codecs sse_encode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerAPSConnection( - self.$1, serializer); + self.$1, + serializer, + ); sse_encode_opt_box_autoadd_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerPushError( - self.$2, serializer); + self.$2, + serializer, + ); } @protected void - sse_encode_record_auto_owned_rust_opaque_flutter_rust_bridgefor_generated_rust_auto_opaque_inner_arc_mutex_apple_account_default_anisette_provider_login_state( - (ArcMutexAppleAccountDefaultAnisetteProvider, LoginState) self, - SseSerializer serializer) { + sse_encode_record_auto_owned_rust_opaque_flutter_rust_bridgefor_generated_rust_auto_opaque_inner_arc_mutex_apple_account_default_anisette_provider_login_state( + (ArcMutexAppleAccountDefaultAnisetteProvider, LoginState) self, + SseSerializer serializer, + ) { // Codec=Sse (Serialization based), see doc to use other codecs sse_encode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcMutexAppleAccountDefaultAnisetteProvider( - self.$1, serializer); + self.$1, + serializer, + ); sse_encode_login_state(self.$2, serializer); } @protected void - sse_encode_record_auto_owned_rust_opaque_flutter_rust_bridgefor_generated_rust_auto_opaque_inner_arc_shared_push_state_shared_push_state( - (ArcSharedPushState, SharedPushState) self, - SseSerializer serializer) { + sse_encode_record_auto_owned_rust_opaque_flutter_rust_bridgefor_generated_rust_auto_opaque_inner_arc_shared_push_state_shared_push_state( + (ArcSharedPushState, SharedPushState) self, + SseSerializer serializer, + ) { // Codec=Sse (Serialization based), see doc to use other codecs sse_encode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcSharedPushState( - self.$1, serializer); + self.$1, + serializer, + ); sse_encode_shared_push_state(self.$2, serializer); } @protected void - sse_encode_record_auto_owned_rust_opaque_flutter_rust_bridgefor_generated_rust_auto_opaque_inner_circle_client_session_default_anisette_provider_login_state_opt_string( - ( - CircleClientSessionDefaultAnisetteProvider, - LoginState, - String? - ) self, - SseSerializer serializer) { + sse_encode_record_auto_owned_rust_opaque_flutter_rust_bridgefor_generated_rust_auto_opaque_inner_circle_client_session_default_anisette_provider_login_state_opt_string( + (CircleClientSessionDefaultAnisetteProvider, LoginState, String?) self, + SseSerializer serializer, + ) { // Codec=Sse (Serialization based), see doc to use other codecs sse_encode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerCircleClientSessionDefaultAnisetteProvider( - self.$1, serializer); + self.$1, + serializer, + ); sse_encode_login_state(self.$2, serializer); sse_encode_opt_String(self.$3, serializer); } @protected void - sse_encode_record_auto_owned_rust_opaque_flutter_rust_bridgefor_generated_rust_auto_opaque_inner_sender_auto_owned_rust_opaque_flutter_rust_bridgefor_generated_rust_auto_opaque_inner_arc_sender_push_message_auto_owned_rust_opaque_flutter_rust_bridgefor_generated_rust_auto_opaque_inner_aps_watcher( - (Sender, ArcSenderPushMessage, ApsWatcher) self, - SseSerializer serializer) { + sse_encode_record_auto_owned_rust_opaque_flutter_rust_bridgefor_generated_rust_auto_opaque_inner_sender_auto_owned_rust_opaque_flutter_rust_bridgefor_generated_rust_auto_opaque_inner_arc_sender_push_message_auto_owned_rust_opaque_flutter_rust_bridgefor_generated_rust_auto_opaque_inner_aps_watcher( + (Sender, ArcSenderPushMessage, ApsWatcher) self, + SseSerializer serializer, + ) { // Codec=Sse (Serialization based), see doc to use other codecs sse_encode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerSender( - self.$1, serializer); + self.$1, + serializer, + ); sse_encode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcSenderPushMessage( - self.$2, serializer); + self.$2, + serializer, + ); sse_encode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerAPSWatcher( - self.$3, serializer); + self.$3, + serializer, + ); } @protected void - sse_encode_record_list_prim_u_8_strict_map_string_opt_box_autoadd_cloud_attachment_i_32( - (Uint8List, Map, int) self, - SseSerializer serializer) { + sse_encode_record_list_prim_u_8_strict_map_string_opt_box_autoadd_cloud_attachment_i_32( + (Uint8List, Map, int) self, + SseSerializer serializer, + ) { // Codec=Sse (Serialization based), see doc to use other codecs sse_encode_list_prim_u_8_strict(self.$1, serializer); sse_encode_Map_String_opt_box_autoadd_cloud_attachment(self.$2, serializer); @@ -30135,9 +41323,10 @@ class RustLibApiImpl extends RustLibApiImplPlatform implements RustLibApi { @protected void - sse_encode_record_list_prim_u_8_strict_map_string_opt_box_autoadd_cloud_chat_i_32( - (Uint8List, Map, int) self, - SseSerializer serializer) { + sse_encode_record_list_prim_u_8_strict_map_string_opt_box_autoadd_cloud_chat_i_32( + (Uint8List, Map, int) self, + SseSerializer serializer, + ) { // Codec=Sse (Serialization based), see doc to use other codecs sse_encode_list_prim_u_8_strict(self.$1, serializer); sse_encode_Map_String_opt_box_autoadd_cloud_chat(self.$2, serializer); @@ -30146,9 +41335,10 @@ class RustLibApiImpl extends RustLibApiImplPlatform implements RustLibApi { @protected void - sse_encode_record_list_prim_u_8_strict_map_string_opt_box_autoadd_cloud_message_i_32( - (Uint8List, Map, int) self, - SseSerializer serializer) { + sse_encode_record_list_prim_u_8_strict_map_string_opt_box_autoadd_cloud_message_i_32( + (Uint8List, Map, int) self, + SseSerializer serializer, + ) { // Codec=Sse (Serialization based), see doc to use other codecs sse_encode_list_prim_u_8_strict(self.$1, serializer); sse_encode_Map_String_opt_box_autoadd_cloud_message(self.$2, serializer); @@ -30157,7 +41347,9 @@ class RustLibApiImpl extends RustLibApiImplPlatform implements RustLibApi { @protected void sse_encode_record_list_prim_u_8_strict_opt_list_prim_u_8_strict( - (Uint8List, Uint8List?) self, SseSerializer serializer) { + (Uint8List, Uint8List?) self, + SseSerializer serializer, + ) { // Codec=Sse (Serialization based), see doc to use other codecs sse_encode_list_prim_u_8_strict(self.$1, serializer); sse_encode_opt_list_prim_u_8_strict(self.$2, serializer); @@ -30165,7 +41357,9 @@ class RustLibApiImpl extends RustLibApiImplPlatform implements RustLibApi { @protected void sse_encode_record_list_shared_album_list_string( - (List, List) self, SseSerializer serializer) { + (List, List) self, + SseSerializer serializer, + ) { // Codec=Sse (Serialization based), see doc to use other codecs sse_encode_list_shared_album(self.$1, serializer); sse_encode_list_String(self.$2, serializer); @@ -30173,7 +41367,9 @@ class RustLibApiImpl extends RustLibApiImplPlatform implements RustLibApi { @protected void sse_encode_record_list_trusted_phone_number_opt_box_autoadd_login_state( - (List, LoginState?) self, SseSerializer serializer) { + (List, LoginState?) self, + SseSerializer serializer, + ) { // Codec=Sse (Serialization based), see doc to use other codecs sse_encode_list_trusted_phone_number(self.$1, serializer); sse_encode_opt_box_autoadd_login_state(self.$2, serializer); @@ -30181,19 +41377,24 @@ class RustLibApiImpl extends RustLibApiImplPlatform implements RustLibApi { @protected void - sse_encode_record_login_state_opt_box_autoadd_auto_owned_rust_opaque_flutter_rust_bridgefor_generated_rust_auto_opaque_inner_ids_user( - (LoginState, IdsUser?) self, SseSerializer serializer) { + sse_encode_record_login_state_opt_box_autoadd_auto_owned_rust_opaque_flutter_rust_bridgefor_generated_rust_auto_opaque_inner_ids_user( + (LoginState, IdsUser?) self, + SseSerializer serializer, + ) { // Codec=Sse (Serialization based), see doc to use other codecs sse_encode_login_state(self.$1, serializer); sse_encode_opt_box_autoadd_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerIDSUser( - self.$2, serializer); + self.$2, + serializer, + ); } @protected void - sse_encode_record_map_string_sync_status_opt_box_autoadd_record_string_u_64( - (Map, (String, BigInt)?) self, - SseSerializer serializer) { + sse_encode_record_map_string_sync_status_opt_box_autoadd_record_string_u_64( + (Map, (String, BigInt)?) self, + SseSerializer serializer, + ) { // Codec=Sse (Serialization based), see doc to use other codecs sse_encode_Map_String_sync_status(self.$1, serializer); sse_encode_opt_box_autoadd_record_string_u_64(self.$2, serializer); @@ -30201,17 +41402,23 @@ class RustLibApiImpl extends RustLibApiImplPlatform implements RustLibApi { @protected void - sse_encode_record_opt_list_auto_owned_rust_opaque_flutter_rust_bridgefor_generated_rust_auto_opaque_inner_ids_user_opt_box_autoadd_support_alert( - (List?, SupportAlert?) self, SseSerializer serializer) { + sse_encode_record_opt_list_auto_owned_rust_opaque_flutter_rust_bridgefor_generated_rust_auto_opaque_inner_ids_user_opt_box_autoadd_support_alert( + (List?, SupportAlert?) self, + SseSerializer serializer, + ) { // Codec=Sse (Serialization based), see doc to use other codecs sse_encode_opt_list_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerIDSUser( - self.$1, serializer); + self.$1, + serializer, + ); sse_encode_opt_box_autoadd_support_alert(self.$2, serializer); } @protected void sse_encode_record_opt_string_passkey( - (String?, Passkey) self, SseSerializer serializer) { + (String?, Passkey) self, + SseSerializer serializer, + ) { // Codec=Sse (Serialization based), see doc to use other codecs sse_encode_opt_String(self.$1, serializer); sse_encode_passkey(self.$2, serializer); @@ -30219,7 +41426,9 @@ class RustLibApiImpl extends RustLibApiImplPlatform implements RustLibApi { @protected void sse_encode_record_opt_string_password_manager_meta( - (String?, PasswordManagerMeta) self, SseSerializer serializer) { + (String?, PasswordManagerMeta) self, + SseSerializer serializer, + ) { // Codec=Sse (Serialization based), see doc to use other codecs sse_encode_opt_String(self.$1, serializer); sse_encode_password_manager_meta(self.$2, serializer); @@ -30227,7 +41436,9 @@ class RustLibApiImpl extends RustLibApiImplPlatform implements RustLibApi { @protected void sse_encode_record_opt_string_password_raw_entry( - (String?, PasswordRawEntry) self, SseSerializer serializer) { + (String?, PasswordRawEntry) self, + SseSerializer serializer, + ) { // Codec=Sse (Serialization based), see doc to use other codecs sse_encode_opt_String(self.$1, serializer); sse_encode_password_raw_entry(self.$2, serializer); @@ -30235,7 +41446,9 @@ class RustLibApiImpl extends RustLibApiImplPlatform implements RustLibApi { @protected void sse_encode_record_opt_string_wifi_password( - (String?, WifiPassword) self, SseSerializer serializer) { + (String?, WifiPassword) self, + SseSerializer serializer, + ) { // Codec=Sse (Serialization based), see doc to use other codecs sse_encode_opt_String(self.$1, serializer); sse_encode_wifi_password(self.$2, serializer); @@ -30243,37 +41456,51 @@ class RustLibApiImpl extends RustLibApiImplPlatform implements RustLibApi { @protected void - sse_encode_record_shared_push_state_auto_owned_rust_opaque_flutter_rust_bridgefor_generated_rust_auto_opaque_inner_aps_watcher( - (SharedPushState, ApsWatcher) self, SseSerializer serializer) { + sse_encode_record_shared_push_state_auto_owned_rust_opaque_flutter_rust_bridgefor_generated_rust_auto_opaque_inner_aps_watcher( + (SharedPushState, ApsWatcher) self, + SseSerializer serializer, + ) { // Codec=Sse (Serialization based), see doc to use other codecs sse_encode_shared_push_state(self.$1, serializer); sse_encode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerAPSWatcher( - self.$2, serializer); + self.$2, + serializer, + ); } @protected void - sse_encode_record_string_auto_owned_rust_opaque_flutter_rust_bridgefor_generated_rust_auto_opaque_inner_asset( - (String, Asset) self, SseSerializer serializer) { + sse_encode_record_string_auto_owned_rust_opaque_flutter_rust_bridgefor_generated_rust_auto_opaque_inner_asset( + (String, Asset) self, + SseSerializer serializer, + ) { // Codec=Sse (Serialization based), see doc to use other codecs sse_encode_String(self.$1, serializer); sse_encode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerAsset( - self.$2, serializer); + self.$2, + serializer, + ); } @protected void - sse_encode_record_string_auto_owned_rust_opaque_flutter_rust_bridgefor_generated_rust_auto_opaque_inner_st_collapsed_value( - (String, StCollapsedValue) self, SseSerializer serializer) { + sse_encode_record_string_auto_owned_rust_opaque_flutter_rust_bridgefor_generated_rust_auto_opaque_inner_st_collapsed_value( + (String, StCollapsedValue) self, + SseSerializer serializer, + ) { // Codec=Sse (Serialization based), see doc to use other codecs sse_encode_String(self.$1, serializer); sse_encode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerStCollapsedValue( - self.$2, serializer); + self.$2, + serializer, + ); } @protected void sse_encode_record_string_bool( - (String, bool) self, SseSerializer serializer) { + (String, bool) self, + SseSerializer serializer, + ) { // Codec=Sse (Serialization based), see doc to use other codecs sse_encode_String(self.$1, serializer); sse_encode_bool(self.$2, serializer); @@ -30281,7 +41508,9 @@ class RustLibApiImpl extends RustLibApiImplPlatform implements RustLibApi { @protected void sse_encode_record_string_casted_primitive_u_64( - (String, int) self, SseSerializer serializer) { + (String, int) self, + SseSerializer serializer, + ) { // Codec=Sse (Serialization based), see doc to use other codecs sse_encode_String(self.$1, serializer); sse_encode_CastedPrimitive_u_64(self.$2, serializer); @@ -30289,7 +41518,9 @@ class RustLibApiImpl extends RustLibApiImplPlatform implements RustLibApi { @protected void sse_encode_record_string_cloud_attachment( - (String, CloudAttachment) self, SseSerializer serializer) { + (String, CloudAttachment) self, + SseSerializer serializer, + ) { // Codec=Sse (Serialization based), see doc to use other codecs sse_encode_String(self.$1, serializer); sse_encode_cloud_attachment(self.$2, serializer); @@ -30297,7 +41528,9 @@ class RustLibApiImpl extends RustLibApiImplPlatform implements RustLibApi { @protected void sse_encode_record_string_cloud_chat( - (String, CloudChat) self, SseSerializer serializer) { + (String, CloudChat) self, + SseSerializer serializer, + ) { // Codec=Sse (Serialization based), see doc to use other codecs sse_encode_String(self.$1, serializer); sse_encode_cloud_chat(self.$2, serializer); @@ -30305,7 +41538,9 @@ class RustLibApiImpl extends RustLibApiImplPlatform implements RustLibApi { @protected void sse_encode_record_string_cloud_message( - (String, CloudMessage) self, SseSerializer serializer) { + (String, CloudMessage) self, + SseSerializer serializer, + ) { // Codec=Sse (Serialization based), see doc to use other codecs sse_encode_String(self.$1, serializer); sse_encode_cloud_message(self.$2, serializer); @@ -30313,7 +41548,9 @@ class RustLibApiImpl extends RustLibApiImplPlatform implements RustLibApi { @protected void sse_encode_record_string_ft_participant( - (String, FTParticipant) self, SseSerializer serializer) { + (String, FTParticipant) self, + SseSerializer serializer, + ) { // Codec=Sse (Serialization based), see doc to use other codecs sse_encode_String(self.$1, serializer); sse_encode_ft_participant(self.$2, serializer); @@ -30321,7 +41558,9 @@ class RustLibApiImpl extends RustLibApiImplPlatform implements RustLibApi { @protected void sse_encode_record_string_group_summary( - (String, GroupSummary) self, SseSerializer serializer) { + (String, GroupSummary) self, + SseSerializer serializer, + ) { // Codec=Sse (Serialization based), see doc to use other codecs sse_encode_String(self.$1, serializer); sse_encode_group_summary(self.$2, serializer); @@ -30329,7 +41568,9 @@ class RustLibApiImpl extends RustLibApiImplPlatform implements RustLibApi { @protected void sse_encode_record_string_list_message_edit( - (String, List) self, SseSerializer serializer) { + (String, List) self, + SseSerializer serializer, + ) { // Codec=Sse (Serialization based), see doc to use other codecs sse_encode_String(self.$1, serializer); sse_encode_list_message_edit(self.$2, serializer); @@ -30337,7 +41578,9 @@ class RustLibApiImpl extends RustLibApiImplPlatform implements RustLibApi { @protected void sse_encode_record_string_list_prim_u_8_strict( - (String, Uint8List) self, SseSerializer serializer) { + (String, Uint8List) self, + SseSerializer serializer, + ) { // Codec=Sse (Serialization based), see doc to use other codecs sse_encode_String(self.$1, serializer); sse_encode_list_prim_u_8_strict(self.$2, serializer); @@ -30345,13 +41588,11 @@ class RustLibApiImpl extends RustLibApiImplPlatform implements RustLibApi { @protected void - sse_encode_record_string_map_string_group_summary_map_string_share_invite_content_data( - ( - String, - Map, - Map - ) self, - SseSerializer serializer) { + sse_encode_record_string_map_string_group_summary_map_string_share_invite_content_data( + (String, Map, Map) + self, + SseSerializer serializer, + ) { // Codec=Sse (Serialization based), see doc to use other codecs sse_encode_String(self.$1, serializer); sse_encode_Map_String_group_summary(self.$2, serializer); @@ -30360,7 +41601,9 @@ class RustLibApiImpl extends RustLibApiImplPlatform implements RustLibApi { @protected void sse_encode_record_string_message_edit_range( - (String, MessageEditRange) self, SseSerializer serializer) { + (String, MessageEditRange) self, + SseSerializer serializer, + ) { // Codec=Sse (Serialization based), see doc to use other codecs sse_encode_String(self.$1, serializer); sse_encode_message_edit_range(self.$2, serializer); @@ -30368,7 +41611,9 @@ class RustLibApiImpl extends RustLibApiImplPlatform implements RustLibApi { @protected void sse_encode_record_string_opt_box_autoadd_cloud_attachment( - (String, CloudAttachment?) self, SseSerializer serializer) { + (String, CloudAttachment?) self, + SseSerializer serializer, + ) { // Codec=Sse (Serialization based), see doc to use other codecs sse_encode_String(self.$1, serializer); sse_encode_opt_box_autoadd_cloud_attachment(self.$2, serializer); @@ -30376,7 +41621,9 @@ class RustLibApiImpl extends RustLibApiImplPlatform implements RustLibApi { @protected void sse_encode_record_string_opt_box_autoadd_cloud_chat( - (String, CloudChat?) self, SseSerializer serializer) { + (String, CloudChat?) self, + SseSerializer serializer, + ) { // Codec=Sse (Serialization based), see doc to use other codecs sse_encode_String(self.$1, serializer); sse_encode_opt_box_autoadd_cloud_chat(self.$2, serializer); @@ -30384,7 +41631,9 @@ class RustLibApiImpl extends RustLibApiImplPlatform implements RustLibApi { @protected void sse_encode_record_string_opt_box_autoadd_cloud_message( - (String, CloudMessage?) self, SseSerializer serializer) { + (String, CloudMessage?) self, + SseSerializer serializer, + ) { // Codec=Sse (Serialization based), see doc to use other codecs sse_encode_String(self.$1, serializer); sse_encode_opt_box_autoadd_cloud_message(self.$2, serializer); @@ -30392,7 +41641,9 @@ class RustLibApiImpl extends RustLibApiImplPlatform implements RustLibApi { @protected void sse_encode_record_string_password_manager_meta_data_ctx( - (String, PasswordManagerMetaDataCtx) self, SseSerializer serializer) { + (String, PasswordManagerMetaDataCtx) self, + SseSerializer serializer, + ) { // Codec=Sse (Serialization based), see doc to use other codecs sse_encode_String(self.$1, serializer); sse_encode_password_manager_meta_data_ctx(self.$2, serializer); @@ -30400,7 +41651,9 @@ class RustLibApiImpl extends RustLibApiImplPlatform implements RustLibApi { @protected void sse_encode_record_string_record_opt_string_passkey( - (String, (String?, Passkey)) self, SseSerializer serializer) { + (String, (String?, Passkey)) self, + SseSerializer serializer, + ) { // Codec=Sse (Serialization based), see doc to use other codecs sse_encode_String(self.$1, serializer); sse_encode_record_opt_string_passkey(self.$2, serializer); @@ -30408,7 +41661,9 @@ class RustLibApiImpl extends RustLibApiImplPlatform implements RustLibApi { @protected void sse_encode_record_string_record_opt_string_password_manager_meta( - (String, (String?, PasswordManagerMeta)) self, SseSerializer serializer) { + (String, (String?, PasswordManagerMeta)) self, + SseSerializer serializer, + ) { // Codec=Sse (Serialization based), see doc to use other codecs sse_encode_String(self.$1, serializer); sse_encode_record_opt_string_password_manager_meta(self.$2, serializer); @@ -30416,7 +41671,9 @@ class RustLibApiImpl extends RustLibApiImplPlatform implements RustLibApi { @protected void sse_encode_record_string_record_opt_string_password_raw_entry( - (String, (String?, PasswordRawEntry)) self, SseSerializer serializer) { + (String, (String?, PasswordRawEntry)) self, + SseSerializer serializer, + ) { // Codec=Sse (Serialization based), see doc to use other codecs sse_encode_String(self.$1, serializer); sse_encode_record_opt_string_password_raw_entry(self.$2, serializer); @@ -30424,7 +41681,9 @@ class RustLibApiImpl extends RustLibApiImplPlatform implements RustLibApi { @protected void sse_encode_record_string_record_opt_string_wifi_password( - (String, (String?, WifiPassword)) self, SseSerializer serializer) { + (String, (String?, WifiPassword)) self, + SseSerializer serializer, + ) { // Codec=Sse (Serialization based), see doc to use other codecs sse_encode_String(self.$1, serializer); sse_encode_record_opt_string_wifi_password(self.$2, serializer); @@ -30432,7 +41691,9 @@ class RustLibApiImpl extends RustLibApiImplPlatform implements RustLibApi { @protected void sse_encode_record_string_share_invite_content_data( - (String, ShareInviteContentData) self, SseSerializer serializer) { + (String, ShareInviteContentData) self, + SseSerializer serializer, + ) { // Codec=Sse (Serialization based), see doc to use other codecs sse_encode_String(self.$1, serializer); sse_encode_share_invite_content_data(self.$2, serializer); @@ -30440,7 +41701,9 @@ class RustLibApiImpl extends RustLibApiImplPlatform implements RustLibApi { @protected void sse_encode_record_string_shared_push_state( - (String, SharedPushState) self, SseSerializer serializer) { + (String, SharedPushState) self, + SseSerializer serializer, + ) { // Codec=Sse (Serialization based), see doc to use other codecs sse_encode_String(self.$1, serializer); sse_encode_shared_push_state(self.$2, serializer); @@ -30448,7 +41711,9 @@ class RustLibApiImpl extends RustLibApiImplPlatform implements RustLibApi { @protected void sse_encode_record_string_status_kit_personal_config( - (String, StatusKitPersonalConfig) self, SseSerializer serializer) { + (String, StatusKitPersonalConfig) self, + SseSerializer serializer, + ) { // Codec=Sse (Serialization based), see doc to use other codecs sse_encode_String(self.$1, serializer); sse_encode_status_kit_personal_config(self.$2, serializer); @@ -30456,7 +41721,9 @@ class RustLibApiImpl extends RustLibApiImplPlatform implements RustLibApi { @protected void sse_encode_record_string_string( - (String, String) self, SseSerializer serializer) { + (String, String) self, + SseSerializer serializer, + ) { // Codec=Sse (Serialization based), see doc to use other codecs sse_encode_String(self.$1, serializer); sse_encode_String(self.$2, serializer); @@ -30464,7 +41731,9 @@ class RustLibApiImpl extends RustLibApiImplPlatform implements RustLibApi { @protected void sse_encode_record_string_sync_status( - (String, SyncStatus) self, SseSerializer serializer) { + (String, SyncStatus) self, + SseSerializer serializer, + ) { // Codec=Sse (Serialization based), see doc to use other codecs sse_encode_String(self.$1, serializer); sse_encode_sync_status(self.$2, serializer); @@ -30472,7 +41741,9 @@ class RustLibApiImpl extends RustLibApiImplPlatform implements RustLibApi { @protected void sse_encode_record_string_u_64( - (String, BigInt) self, SseSerializer serializer) { + (String, BigInt) self, + SseSerializer serializer, + ) { // Codec=Sse (Serialization based), see doc to use other codecs sse_encode_String(self.$1, serializer); sse_encode_u_64(self.$2, serializer); @@ -30480,7 +41751,9 @@ class RustLibApiImpl extends RustLibApiImplPlatform implements RustLibApi { @protected void sse_encode_record_string_update_account_finish( - (String, UpdateAccountFinish) self, SseSerializer serializer) { + (String, UpdateAccountFinish) self, + SseSerializer serializer, + ) { // Codec=Sse (Serialization based), see doc to use other codecs sse_encode_String(self.$1, serializer); sse_encode_update_account_finish(self.$2, serializer); @@ -30488,7 +41761,9 @@ class RustLibApiImpl extends RustLibApiImplPlatform implements RustLibApi { @protected void sse_encode_record_u_32_ns_dictionary_typed_coder( - (int, NSDictionaryTypedCoder) self, SseSerializer serializer) { + (int, NSDictionaryTypedCoder) self, + SseSerializer serializer, + ) { // Codec=Sse (Serialization based), see doc to use other codecs sse_encode_u_32(self.$1, serializer); sse_encode_ns_dictionary_typed_coder(self.$2, serializer); @@ -30496,7 +41771,9 @@ class RustLibApiImpl extends RustLibApiImplPlatform implements RustLibApi { @protected void sse_encode_record_u_32_u_64( - (int, BigInt) self, SseSerializer serializer) { + (int, BigInt) self, + SseSerializer serializer, + ) { // Codec=Sse (Serialization based), see doc to use other codecs sse_encode_u_32(self.$1, serializer); sse_encode_u_64(self.$2, serializer); @@ -30538,7 +41815,9 @@ class RustLibApiImpl extends RustLibApiImplPlatform implements RustLibApi { @protected void sse_encode_rich_link_image_attachment_substitute( - RichLinkImageAttachmentSubstitute self, SseSerializer serializer) { + RichLinkImageAttachmentSubstitute self, + SseSerializer serializer, + ) { // Codec=Sse (Serialization based), see doc to use other codecs sse_encode_String(self.mimeType, serializer); sse_encode_u_64(self.richLinkImageAttachmentSubstituteIndex, serializer); @@ -30553,32 +41832,34 @@ class RustLibApiImpl extends RustLibApiImplPlatform implements RustLibApi { @protected void sse_encode_set_transcript_background_message( - SetTranscriptBackgroundMessage self, SseSerializer serializer) { + SetTranscriptBackgroundMessage self, + SseSerializer serializer, + ) { // Codec=Sse (Serialization based), see doc to use other codecs switch (self) { case SetTranscriptBackgroundMessage_Remove( - aid: final aid, - bid: final bid, - chatId: final chatId, - remove: final remove - ): + aid: final aid, + bid: final bid, + chatId: final chatId, + remove: final remove, + ): sse_encode_i_32(0, serializer); sse_encode_u_32(aid, serializer); sse_encode_u_64(bid, serializer); sse_encode_opt_String(chatId, serializer); sse_encode_bool(remove, serializer); case SetTranscriptBackgroundMessage_Set( - aid: final aid, - bid: final bid, - chatId: final chatId, - objectId: final objectId, - payloadVersion: final payloadVersion, - backgroundId: final backgroundId, - url: final url, - signature: final signature, - key: final key, - fileSize: final fileSize - ): + aid: final aid, + bid: final bid, + chatId: final chatId, + objectId: final objectId, + payloadVersion: final payloadVersion, + backgroundId: final backgroundId, + url: final url, + signature: final signature, + key: final key, + fileSize: final fileSize, + ): sse_encode_i_32(1, serializer); sse_encode_u_32(aid, serializer); sse_encode_u_64(bid, serializer); @@ -30597,12 +41878,16 @@ class RustLibApiImpl extends RustLibApiImplPlatform implements RustLibApi { @protected void sse_encode_share_invite_content_data( - ShareInviteContentData self, SseSerializer serializer) { + ShareInviteContentData self, + SseSerializer serializer, + ) { // Codec=Sse (Serialization based), see doc to use other codecs sse_encode_list_prim_u_8_strict(self.invitationToken, serializer); sse_encode_String(self.groupId, serializer); sse_encode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerDate( - self.sentTime, serializer); + self.sentTime, + serializer, + ); sse_encode_String(self.groupName, serializer); sse_encode_String(self.shareUrl, serializer); sse_encode_String(self.inviteeHandle, serializer); @@ -30610,10 +41895,14 @@ class RustLibApiImpl extends RustLibApiImplPlatform implements RustLibApi { @protected void sse_encode_share_profile_message( - ShareProfileMessage self, SseSerializer serializer) { + ShareProfileMessage self, + SseSerializer serializer, + ) { // Codec=Sse (Serialization based), see doc to use other codecs sse_encode_list_prim_u_8_strict( - self.cloudKitDecryptionRecordKey, serializer); + self.cloudKitDecryptionRecordKey, + serializer, + ); sse_encode_String(self.cloudKitRecordKey, serializer); sse_encode_opt_box_autoadd_shared_poster(self.poster, serializer); } @@ -30634,28 +41923,50 @@ class RustLibApiImpl extends RustLibApiImplPlatform implements RustLibApi { @protected void sse_encode_shared_i_cloud_services( - SharedICloudServices self, SseSerializer serializer) { + SharedICloudServices self, + SseSerializer serializer, + ) { // Codec=Sse (Serialization based), see doc to use other codecs sse_encode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcMutexAppleAccountDefaultAnisetteProvider( - self.account, serializer); + self.account, + serializer, + ); sse_encode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcTokenProviderDefaultAnisetteProvider( - self.tokenProvider, serializer); + self.tokenProvider, + serializer, + ); sse_encode_opt_box_autoadd_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcCloudKitClientDefaultAnisetteProvider( - self.cloudkitClient, serializer); + self.cloudkitClient, + serializer, + ); sse_encode_opt_box_autoadd_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcKeychainClientDefaultAnisetteProvider( - self.keychain, serializer); + self.keychain, + serializer, + ); sse_encode_opt_box_autoadd_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcPasswordManagerDefaultAnisetteProvider( - self.passwords, serializer); + self.passwords, + serializer, + ); sse_encode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcProfilesClientDefaultAnisetteProvider( - self.profilesClient, serializer); + self.profilesClient, + serializer, + ); sse_encode_opt_box_autoadd_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcFindMyClientDefaultAnisetteProvider( - self.fmfd, serializer); + self.fmfd, + serializer, + ); sse_encode_opt_box_autoadd_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerSyncManagerDefaultAnisetteProviderMyFilePackager( - self.sharedstreams, serializer); + self.sharedstreams, + serializer, + ); sse_encode_opt_box_autoadd_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcCloudMessagesClientDefaultAnisetteProvider( - self.cloudMessagesClient, serializer); + self.cloudMessagesClient, + serializer, + ); sse_encode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcStatusKitClientDefaultAnisetteProvider( - self.statuskitClient, serializer); + self.statuskitClient, + serializer, + ); } @protected @@ -30668,36 +41979,62 @@ class RustLibApiImpl extends RustLibApiImplPlatform implements RustLibApi { @protected void sse_encode_shared_push_state( - SharedPushState self, SseSerializer serializer) { + SharedPushState self, + SseSerializer serializer, + ) { // Codec=Sse (Serialization based), see doc to use other codecs sse_encode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerJoinedOSConfig( - self.osConfig, serializer); + self.osConfig, + serializer, + ); sse_encode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerSender( - self.cancelPoll, serializer); + self.cancelPoll, + serializer, + ); sse_encode_String(self.confDir, serializer); sse_encode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcSenderPushMessage( - self.localBroadcast, serializer); + self.localBroadcast, + serializer, + ); sse_encode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcAnisetteClientDefaultAnisetteProvider( - self.anisette, serializer); + self.anisette, + serializer, + ); sse_encode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerAPSConnection( - self.conn, serializer); + self.conn, + serializer, + ); sse_encode_opt_box_autoadd_shared_i_cloud_services( - self.icloudServices, serializer); + self.icloudServices, + serializer, + ); sse_encode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcIMClient( - self.client, serializer); + self.client, + serializer, + ); sse_encode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcFTClient( - self.ftClient, serializer); + self.ftClient, + serializer, + ); sse_encode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcIdmsAuthListener( - self.idmsClient, serializer); + self.idmsClient, + serializer, + ); sse_encode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcMutexVecActiveCircleSession( - self.activeCircleSessions, serializer); + self.activeCircleSessions, + serializer, + ); sse_encode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcMutexOptionCircleClientSessionDefaultAnisetteProvider( - self.clientSession, serializer); + self.clientSession, + serializer, + ); } @protected void sse_encode_simplified_incoming_call_poster( - SimplifiedIncomingCallPoster self, SseSerializer serializer) { + SimplifiedIncomingCallPoster self, + SseSerializer serializer, + ) { // Codec=Sse (Serialization based), see doc to use other codecs sse_encode_simplified_poster(self.poster, serializer); sse_encode_wallpaper_metadata(self.textMetadata, serializer); @@ -30706,17 +42043,23 @@ class RustLibApiImpl extends RustLibApiImplPlatform implements RustLibApi { @protected void sse_encode_simplified_poster( - SimplifiedPoster self, SseSerializer serializer) { + SimplifiedPoster self, + SseSerializer serializer, + ) { // Codec=Sse (Serialization based), see doc to use other codecs sse_encode_pr_poster_title_style_configuration( - self.titleConfiguration, serializer); + self.titleConfiguration, + serializer, + ); sse_encode_poster_type(self.type, serializer); sse_encode_poster_role(self.role, serializer); } @protected void sse_encode_simplified_transcript_poster( - SimplifiedTranscriptPoster self, SseSerializer serializer) { + SimplifiedTranscriptPoster self, + SseSerializer serializer, + ) { // Codec=Sse (Serialization based), see doc to use other codecs sse_encode_watch_background(self.watch, serializer); sse_encode_simplified_poster(self.poster, serializer); @@ -30724,14 +42067,16 @@ class RustLibApiImpl extends RustLibApiImplPlatform implements RustLibApi { @protected void sse_encode_status_kit_message( - StatusKitMessage self, SseSerializer serializer) { + StatusKitMessage self, + SseSerializer serializer, + ) { // Codec=Sse (Serialization based), see doc to use other codecs switch (self) { case StatusKitMessage_StatusChanged( - user: final user, - mode: final mode, - allowed: final allowed - ): + user: final user, + mode: final mode, + allowed: final allowed, + ): sse_encode_i_32(0, serializer); sse_encode_String(user, serializer); sse_encode_opt_String(mode, serializer); @@ -30743,7 +42088,9 @@ class RustLibApiImpl extends RustLibApiImplPlatform implements RustLibApi { @protected void sse_encode_status_kit_personal_config( - StatusKitPersonalConfig self, SseSerializer serializer) { + StatusKitPersonalConfig self, + SseSerializer serializer, + ) { // Codec=Sse (Serialization based), see doc to use other codecs sse_encode_list_String(self.allowedModes, serializer); } @@ -30786,7 +42133,9 @@ class RustLibApiImpl extends RustLibApiImplPlatform implements RustLibApi { @protected void sse_encode_teardown_sign_in( - TeardownSignIn self, SseSerializer serializer) { + TeardownSignIn self, + SseSerializer serializer, + ) { // Codec=Sse (Serialization based), see doc to use other codecs sse_encode_String(self.prevtxnid, serializer); } @@ -30823,14 +42172,18 @@ class RustLibApiImpl extends RustLibApiImplPlatform implements RustLibApi { @protected void sse_encode_transcript_dynamic_user_data( - TranscriptDynamicUserData self, SseSerializer serializer) { + TranscriptDynamicUserData self, + SseSerializer serializer, + ) { // Codec=Sse (Serialization based), see doc to use other codecs sse_encode_String(self.identifier, serializer); } @protected void sse_encode_transfer_progress( - TransferProgress self, SseSerializer serializer) { + TransferProgress self, + SseSerializer serializer, + ) { // Codec=Sse (Serialization based), see doc to use other codecs sse_encode_CastedPrimitive_usize(self.prog, serializer); sse_encode_CastedPrimitive_usize(self.total, serializer); @@ -30839,7 +42192,9 @@ class RustLibApiImpl extends RustLibApiImplPlatform implements RustLibApi { @protected void sse_encode_trusted_phone_number( - TrustedPhoneNumber self, SseSerializer serializer) { + TrustedPhoneNumber self, + SseSerializer serializer, + ) { // Codec=Sse (Serialization based), see doc to use other codecs sse_encode_String(self.numberWithDialCode, serializer); sse_encode_String(self.lastTwoDigits, serializer); @@ -30854,6 +42209,12 @@ class RustLibApiImpl extends RustLibApiImplPlatform implements RustLibApi { sse_encode_list_prim_u_8_strict(self.icon, serializer); } + @protected + void sse_encode_u_16(int self, SseSerializer serializer) { + // Codec=Sse (Serialization based), see doc to use other codecs + serializer.buffer.putUint16(self); + } + @protected void sse_encode_u_32(int self, SseSerializer serializer) { // Codec=Sse (Serialization based), see doc to use other codecs @@ -30877,19 +42238,19 @@ class RustLibApiImpl extends RustLibApiImplPlatform implements RustLibApi { // Codec=Sse (Serialization based), see doc to use other codecs switch (self) { case UIColor_RGBAColorSpace( - colorComponents: final colorComponents, - green: final green, - blue: final blue, - red: final red, - greenDbl: final greenDbl, - blueDbl: final blueDbl, - redDbl: final redDbl, - alphaDbl: final alphaDbl, - alpha: final alpha, - rgb: final rgb, - colorSpace: final colorSpace, - class_: final class_ - ): + colorComponents: final colorComponents, + green: final green, + blue: final blue, + red: final red, + greenDbl: final greenDbl, + blueDbl: final blueDbl, + redDbl: final redDbl, + alphaDbl: final alphaDbl, + alpha: final alpha, + rgb: final rgb, + colorSpace: final colorSpace, + class_: final class_, + ): sse_encode_i_32(0, serializer); sse_encode_u_32(colorComponents, serializer); sse_encode_f_64(green, serializer); @@ -30904,13 +42265,13 @@ class RustLibApiImpl extends RustLibApiImplPlatform implements RustLibApi { sse_encode_u_32(colorSpace, serializer); sse_encode_String(class_, serializer); case UIColor_GrayscaleAlphaColorSpace( - colorComponents: final colorComponents, - white: final white, - alpha: final alpha, - bin: final bin, - colorSpace: final colorSpace, - class_: final class_ - ): + colorComponents: final colorComponents, + white: final white, + alpha: final alpha, + bin: final bin, + colorSpace: final colorSpace, + class_: final class_, + ): sse_encode_i_32(1, serializer); sse_encode_u_32(colorComponents, serializer); sse_encode_f_64(white, serializer); @@ -30937,7 +42298,9 @@ class RustLibApiImpl extends RustLibApiImplPlatform implements RustLibApi { @protected void sse_encode_update_account_finish( - UpdateAccountFinish self, SseSerializer serializer) { + UpdateAccountFinish self, + SseSerializer serializer, + ) { // Codec=Sse (Serialization based), see doc to use other codecs switch (self) { case UpdateAccountFinish_MacOS(): @@ -30952,7 +42315,9 @@ class RustLibApiImpl extends RustLibApiImplPlatform implements RustLibApi { @protected void sse_encode_update_extension_message( - UpdateExtensionMessage self, SseSerializer serializer) { + UpdateExtensionMessage self, + SseSerializer serializer, + ) { // Codec=Sse (Serialization based), see doc to use other codecs sse_encode_String(self.forUuid, serializer); sse_encode_part_extension(self.ext, serializer); @@ -30960,7 +42325,9 @@ class RustLibApiImpl extends RustLibApiImplPlatform implements RustLibApi { @protected void sse_encode_update_profile_message( - UpdateProfileMessage self, SseSerializer serializer) { + UpdateProfileMessage self, + SseSerializer serializer, + ) { // Codec=Sse (Serialization based), see doc to use other codecs sse_encode_opt_box_autoadd_share_profile_message(self.profile, serializer); sse_encode_bool(self.shareContacts, serializer); @@ -30968,7 +42335,9 @@ class RustLibApiImpl extends RustLibApiImplPlatform implements RustLibApi { @protected void sse_encode_update_profile_sharing_message( - UpdateProfileSharingMessage self, SseSerializer serializer) { + UpdateProfileSharingMessage self, + SseSerializer serializer, + ) { // Codec=Sse (Serialization based), see doc to use other codecs sse_encode_list_String(self.sharedDismissed, serializer); sse_encode_list_String(self.sharedAll, serializer); @@ -30983,10 +42352,14 @@ class RustLibApiImpl extends RustLibApiImplPlatform implements RustLibApi { @protected void sse_encode_wallpaper_metadata( - WallpaperMetadata self, SseSerializer serializer) { + WallpaperMetadata self, + SseSerializer serializer, + ) { // Codec=Sse (Serialization based), see doc to use other codecs sse_encode_opt_box_autoadd_poster_color( - self.backgroundColorKey, serializer); + self.backgroundColorKey, + serializer, + ); sse_encode_poster_color(self.fontColorKey, serializer); sse_encode_String(self.fontNameKey, serializer); sse_encode_f_32(self.fontSizeKey, serializer); @@ -30997,7 +42370,9 @@ class RustLibApiImpl extends RustLibApiImplPlatform implements RustLibApi { @protected void sse_encode_watch_background( - WatchBackground self, SseSerializer serializer) { + WatchBackground self, + SseSerializer serializer, + ) { // Codec=Sse (Serialization based), see doc to use other codecs sse_encode_bool(self.isHighKey, serializer); sse_encode_f_64(self.luminance, serializer); @@ -31020,11 +42395,11 @@ class RustLibApiImpl extends RustLibApiImplPlatform implements RustLibApi { class ApsConnectionImpl extends RustOpaque implements ApsConnection { // Not to be used by end users ApsConnectionImpl.frbInternalDcoDecode(List wire) - : super.frbInternalDcoDecode(wire, _kStaticData); + : super.frbInternalDcoDecode(wire, _kStaticData); // Not to be used by end users ApsConnectionImpl.frbInternalSseDecode(BigInt ptr, int externalSizeOnNative) - : super.frbInternalSseDecode(ptr, externalSizeOnNative, _kStaticData); + : super.frbInternalSseDecode(ptr, externalSizeOnNative, _kStaticData); static final _kStaticData = RustArcStaticData( rustArcIncrementStrongCount: @@ -31040,11 +42415,11 @@ class ApsConnectionImpl extends RustOpaque implements ApsConnection { class ApsStateImpl extends RustOpaque implements ApsState { // Not to be used by end users ApsStateImpl.frbInternalDcoDecode(List wire) - : super.frbInternalDcoDecode(wire, _kStaticData); + : super.frbInternalDcoDecode(wire, _kStaticData); // Not to be used by end users ApsStateImpl.frbInternalSseDecode(BigInt ptr, int externalSizeOnNative) - : super.frbInternalSseDecode(ptr, externalSizeOnNative, _kStaticData); + : super.frbInternalSseDecode(ptr, externalSizeOnNative, _kStaticData); static final _kStaticData = RustArcStaticData( rustArcIncrementStrongCount: @@ -31060,11 +42435,11 @@ class ApsStateImpl extends RustOpaque implements ApsState { class ApsWatcherImpl extends RustOpaque implements ApsWatcher { // Not to be used by end users ApsWatcherImpl.frbInternalDcoDecode(List wire) - : super.frbInternalDcoDecode(wire, _kStaticData); + : super.frbInternalDcoDecode(wire, _kStaticData); // Not to be used by end users ApsWatcherImpl.frbInternalSseDecode(BigInt ptr, int externalSizeOnNative) - : super.frbInternalSseDecode(ptr, externalSizeOnNative, _kStaticData); + : super.frbInternalSseDecode(ptr, externalSizeOnNative, _kStaticData); static final _kStaticData = RustArcStaticData( rustArcIncrementStrongCount: @@ -31081,20 +42456,27 @@ class ArcAnisetteClientDefaultAnisetteProviderImpl extends RustOpaque implements ArcAnisetteClientDefaultAnisetteProvider { // Not to be used by end users ArcAnisetteClientDefaultAnisetteProviderImpl.frbInternalDcoDecode( - List wire) - : super.frbInternalDcoDecode(wire, _kStaticData); + List wire, + ) : super.frbInternalDcoDecode(wire, _kStaticData); // Not to be used by end users ArcAnisetteClientDefaultAnisetteProviderImpl.frbInternalSseDecode( - BigInt ptr, int externalSizeOnNative) - : super.frbInternalSseDecode(ptr, externalSizeOnNative, _kStaticData); + BigInt ptr, + int externalSizeOnNative, + ) : super.frbInternalSseDecode(ptr, externalSizeOnNative, _kStaticData); static final _kStaticData = RustArcStaticData( - rustArcIncrementStrongCount: RustLib.instance.api + rustArcIncrementStrongCount: RustLib + .instance + .api .rust_arc_increment_strong_count_ArcAnisetteClientDefaultAnisetteProvider, - rustArcDecrementStrongCount: RustLib.instance.api + rustArcDecrementStrongCount: RustLib + .instance + .api .rust_arc_decrement_strong_count_ArcAnisetteClientDefaultAnisetteProvider, - rustArcDecrementStrongCountPtr: RustLib.instance.api + rustArcDecrementStrongCountPtr: RustLib + .instance + .api .rust_arc_decrement_strong_count_ArcAnisetteClientDefaultAnisetteProviderPtr, ); } @@ -31104,20 +42486,27 @@ class ArcCloudKitClientDefaultAnisetteProviderImpl extends RustOpaque implements ArcCloudKitClientDefaultAnisetteProvider { // Not to be used by end users ArcCloudKitClientDefaultAnisetteProviderImpl.frbInternalDcoDecode( - List wire) - : super.frbInternalDcoDecode(wire, _kStaticData); + List wire, + ) : super.frbInternalDcoDecode(wire, _kStaticData); // Not to be used by end users ArcCloudKitClientDefaultAnisetteProviderImpl.frbInternalSseDecode( - BigInt ptr, int externalSizeOnNative) - : super.frbInternalSseDecode(ptr, externalSizeOnNative, _kStaticData); + BigInt ptr, + int externalSizeOnNative, + ) : super.frbInternalSseDecode(ptr, externalSizeOnNative, _kStaticData); static final _kStaticData = RustArcStaticData( - rustArcIncrementStrongCount: RustLib.instance.api + rustArcIncrementStrongCount: RustLib + .instance + .api .rust_arc_increment_strong_count_ArcCloudKitClientDefaultAnisetteProvider, - rustArcDecrementStrongCount: RustLib.instance.api + rustArcDecrementStrongCount: RustLib + .instance + .api .rust_arc_decrement_strong_count_ArcCloudKitClientDefaultAnisetteProvider, - rustArcDecrementStrongCountPtr: RustLib.instance.api + rustArcDecrementStrongCountPtr: RustLib + .instance + .api .rust_arc_decrement_strong_count_ArcCloudKitClientDefaultAnisetteProviderPtr, ); } @@ -31127,20 +42516,27 @@ class ArcCloudMessagesClientDefaultAnisetteProviderImpl extends RustOpaque implements ArcCloudMessagesClientDefaultAnisetteProvider { // Not to be used by end users ArcCloudMessagesClientDefaultAnisetteProviderImpl.frbInternalDcoDecode( - List wire) - : super.frbInternalDcoDecode(wire, _kStaticData); + List wire, + ) : super.frbInternalDcoDecode(wire, _kStaticData); // Not to be used by end users ArcCloudMessagesClientDefaultAnisetteProviderImpl.frbInternalSseDecode( - BigInt ptr, int externalSizeOnNative) - : super.frbInternalSseDecode(ptr, externalSizeOnNative, _kStaticData); + BigInt ptr, + int externalSizeOnNative, + ) : super.frbInternalSseDecode(ptr, externalSizeOnNative, _kStaticData); static final _kStaticData = RustArcStaticData( - rustArcIncrementStrongCount: RustLib.instance.api + rustArcIncrementStrongCount: RustLib + .instance + .api .rust_arc_increment_strong_count_ArcCloudMessagesClientDefaultAnisetteProvider, - rustArcDecrementStrongCount: RustLib.instance.api + rustArcDecrementStrongCount: RustLib + .instance + .api .rust_arc_decrement_strong_count_ArcCloudMessagesClientDefaultAnisetteProvider, - rustArcDecrementStrongCountPtr: RustLib.instance.api + rustArcDecrementStrongCountPtr: RustLib + .instance + .api .rust_arc_decrement_strong_count_ArcCloudMessagesClientDefaultAnisetteProviderPtr, ); } @@ -31150,20 +42546,27 @@ class ArcFindMyClientDefaultAnisetteProviderImpl extends RustOpaque implements ArcFindMyClientDefaultAnisetteProvider { // Not to be used by end users ArcFindMyClientDefaultAnisetteProviderImpl.frbInternalDcoDecode( - List wire) - : super.frbInternalDcoDecode(wire, _kStaticData); + List wire, + ) : super.frbInternalDcoDecode(wire, _kStaticData); // Not to be used by end users ArcFindMyClientDefaultAnisetteProviderImpl.frbInternalSseDecode( - BigInt ptr, int externalSizeOnNative) - : super.frbInternalSseDecode(ptr, externalSizeOnNative, _kStaticData); + BigInt ptr, + int externalSizeOnNative, + ) : super.frbInternalSseDecode(ptr, externalSizeOnNative, _kStaticData); static final _kStaticData = RustArcStaticData( - rustArcIncrementStrongCount: RustLib.instance.api + rustArcIncrementStrongCount: RustLib + .instance + .api .rust_arc_increment_strong_count_ArcFindMyClientDefaultAnisetteProvider, - rustArcDecrementStrongCount: RustLib.instance.api + rustArcDecrementStrongCount: RustLib + .instance + .api .rust_arc_decrement_strong_count_ArcFindMyClientDefaultAnisetteProvider, - rustArcDecrementStrongCountPtr: RustLib.instance.api + rustArcDecrementStrongCountPtr: RustLib + .instance + .api .rust_arc_decrement_strong_count_ArcFindMyClientDefaultAnisetteProviderPtr, ); } @@ -31172,11 +42575,11 @@ class ArcFindMyClientDefaultAnisetteProviderImpl extends RustOpaque class ArcFtClientImpl extends RustOpaque implements ArcFtClient { // Not to be used by end users ArcFtClientImpl.frbInternalDcoDecode(List wire) - : super.frbInternalDcoDecode(wire, _kStaticData); + : super.frbInternalDcoDecode(wire, _kStaticData); // Not to be used by end users ArcFtClientImpl.frbInternalSseDecode(BigInt ptr, int externalSizeOnNative) - : super.frbInternalSseDecode(ptr, externalSizeOnNative, _kStaticData); + : super.frbInternalSseDecode(ptr, externalSizeOnNative, _kStaticData); static final _kStaticData = RustArcStaticData( rustArcIncrementStrongCount: @@ -31193,20 +42596,27 @@ class ArcIdmsAuthListenerImpl extends RustOpaque implements ArcIdmsAuthListener { // Not to be used by end users ArcIdmsAuthListenerImpl.frbInternalDcoDecode(List wire) - : super.frbInternalDcoDecode(wire, _kStaticData); + : super.frbInternalDcoDecode(wire, _kStaticData); // Not to be used by end users ArcIdmsAuthListenerImpl.frbInternalSseDecode( - BigInt ptr, int externalSizeOnNative) - : super.frbInternalSseDecode(ptr, externalSizeOnNative, _kStaticData); + BigInt ptr, + int externalSizeOnNative, + ) : super.frbInternalSseDecode(ptr, externalSizeOnNative, _kStaticData); static final _kStaticData = RustArcStaticData( rustArcIncrementStrongCount: RustLib - .instance.api.rust_arc_increment_strong_count_ArcIdmsAuthListener, + .instance + .api + .rust_arc_increment_strong_count_ArcIdmsAuthListener, rustArcDecrementStrongCount: RustLib - .instance.api.rust_arc_decrement_strong_count_ArcIdmsAuthListener, + .instance + .api + .rust_arc_decrement_strong_count_ArcIdmsAuthListener, rustArcDecrementStrongCountPtr: RustLib - .instance.api.rust_arc_decrement_strong_count_ArcIdmsAuthListenerPtr, + .instance + .api + .rust_arc_decrement_strong_count_ArcIdmsAuthListenerPtr, ); } @@ -31214,11 +42624,11 @@ class ArcIdmsAuthListenerImpl extends RustOpaque class ArcImClientImpl extends RustOpaque implements ArcImClient { // Not to be used by end users ArcImClientImpl.frbInternalDcoDecode(List wire) - : super.frbInternalDcoDecode(wire, _kStaticData); + : super.frbInternalDcoDecode(wire, _kStaticData); // Not to be used by end users ArcImClientImpl.frbInternalSseDecode(BigInt ptr, int externalSizeOnNative) - : super.frbInternalSseDecode(ptr, externalSizeOnNative, _kStaticData); + : super.frbInternalSseDecode(ptr, externalSizeOnNative, _kStaticData); static final _kStaticData = RustArcStaticData( rustArcIncrementStrongCount: @@ -31235,20 +42645,27 @@ class ArcKeychainClientDefaultAnisetteProviderImpl extends RustOpaque implements ArcKeychainClientDefaultAnisetteProvider { // Not to be used by end users ArcKeychainClientDefaultAnisetteProviderImpl.frbInternalDcoDecode( - List wire) - : super.frbInternalDcoDecode(wire, _kStaticData); + List wire, + ) : super.frbInternalDcoDecode(wire, _kStaticData); // Not to be used by end users ArcKeychainClientDefaultAnisetteProviderImpl.frbInternalSseDecode( - BigInt ptr, int externalSizeOnNative) - : super.frbInternalSseDecode(ptr, externalSizeOnNative, _kStaticData); + BigInt ptr, + int externalSizeOnNative, + ) : super.frbInternalSseDecode(ptr, externalSizeOnNative, _kStaticData); static final _kStaticData = RustArcStaticData( - rustArcIncrementStrongCount: RustLib.instance.api + rustArcIncrementStrongCount: RustLib + .instance + .api .rust_arc_increment_strong_count_ArcKeychainClientDefaultAnisetteProvider, - rustArcDecrementStrongCount: RustLib.instance.api + rustArcDecrementStrongCount: RustLib + .instance + .api .rust_arc_decrement_strong_count_ArcKeychainClientDefaultAnisetteProvider, - rustArcDecrementStrongCountPtr: RustLib.instance.api + rustArcDecrementStrongCountPtr: RustLib + .instance + .api .rust_arc_decrement_strong_count_ArcKeychainClientDefaultAnisetteProviderPtr, ); } @@ -31258,20 +42675,27 @@ class ArcMutexAppleAccountDefaultAnisetteProviderImpl extends RustOpaque implements ArcMutexAppleAccountDefaultAnisetteProvider { // Not to be used by end users ArcMutexAppleAccountDefaultAnisetteProviderImpl.frbInternalDcoDecode( - List wire) - : super.frbInternalDcoDecode(wire, _kStaticData); + List wire, + ) : super.frbInternalDcoDecode(wire, _kStaticData); // Not to be used by end users ArcMutexAppleAccountDefaultAnisetteProviderImpl.frbInternalSseDecode( - BigInt ptr, int externalSizeOnNative) - : super.frbInternalSseDecode(ptr, externalSizeOnNative, _kStaticData); + BigInt ptr, + int externalSizeOnNative, + ) : super.frbInternalSseDecode(ptr, externalSizeOnNative, _kStaticData); static final _kStaticData = RustArcStaticData( - rustArcIncrementStrongCount: RustLib.instance.api + rustArcIncrementStrongCount: RustLib + .instance + .api .rust_arc_increment_strong_count_ArcMutexAppleAccountDefaultAnisetteProvider, - rustArcDecrementStrongCount: RustLib.instance.api + rustArcDecrementStrongCount: RustLib + .instance + .api .rust_arc_decrement_strong_count_ArcMutexAppleAccountDefaultAnisetteProvider, - rustArcDecrementStrongCountPtr: RustLib.instance.api + rustArcDecrementStrongCountPtr: RustLib + .instance + .api .rust_arc_decrement_strong_count_ArcMutexAppleAccountDefaultAnisetteProviderPtr, ); } @@ -31282,20 +42706,27 @@ class ArcMutexOptionCircleClientSessionDefaultAnisetteProviderImpl implements ArcMutexOptionCircleClientSessionDefaultAnisetteProvider { // Not to be used by end users ArcMutexOptionCircleClientSessionDefaultAnisetteProviderImpl.frbInternalDcoDecode( - List wire) - : super.frbInternalDcoDecode(wire, _kStaticData); + List wire, + ) : super.frbInternalDcoDecode(wire, _kStaticData); // Not to be used by end users ArcMutexOptionCircleClientSessionDefaultAnisetteProviderImpl.frbInternalSseDecode( - BigInt ptr, int externalSizeOnNative) - : super.frbInternalSseDecode(ptr, externalSizeOnNative, _kStaticData); + BigInt ptr, + int externalSizeOnNative, + ) : super.frbInternalSseDecode(ptr, externalSizeOnNative, _kStaticData); static final _kStaticData = RustArcStaticData( - rustArcIncrementStrongCount: RustLib.instance.api + rustArcIncrementStrongCount: RustLib + .instance + .api .rust_arc_increment_strong_count_ArcMutexOptionCircleClientSessionDefaultAnisetteProvider, - rustArcDecrementStrongCount: RustLib.instance.api + rustArcDecrementStrongCount: RustLib + .instance + .api .rust_arc_decrement_strong_count_ArcMutexOptionCircleClientSessionDefaultAnisetteProvider, - rustArcDecrementStrongCountPtr: RustLib.instance.api + rustArcDecrementStrongCountPtr: RustLib + .instance + .api .rust_arc_decrement_strong_count_ArcMutexOptionCircleClientSessionDefaultAnisetteProviderPtr, ); } @@ -31305,19 +42736,26 @@ class ArcMutexVecActiveCircleSessionImpl extends RustOpaque implements ArcMutexVecActiveCircleSession { // Not to be used by end users ArcMutexVecActiveCircleSessionImpl.frbInternalDcoDecode(List wire) - : super.frbInternalDcoDecode(wire, _kStaticData); + : super.frbInternalDcoDecode(wire, _kStaticData); // Not to be used by end users ArcMutexVecActiveCircleSessionImpl.frbInternalSseDecode( - BigInt ptr, int externalSizeOnNative) - : super.frbInternalSseDecode(ptr, externalSizeOnNative, _kStaticData); + BigInt ptr, + int externalSizeOnNative, + ) : super.frbInternalSseDecode(ptr, externalSizeOnNative, _kStaticData); static final _kStaticData = RustArcStaticData( - rustArcIncrementStrongCount: RustLib.instance.api + rustArcIncrementStrongCount: RustLib + .instance + .api .rust_arc_increment_strong_count_ArcMutexVecActiveCircleSession, - rustArcDecrementStrongCount: RustLib.instance.api + rustArcDecrementStrongCount: RustLib + .instance + .api .rust_arc_decrement_strong_count_ArcMutexVecActiveCircleSession, - rustArcDecrementStrongCountPtr: RustLib.instance.api + rustArcDecrementStrongCountPtr: RustLib + .instance + .api .rust_arc_decrement_strong_count_ArcMutexVecActiveCircleSessionPtr, ); } @@ -31327,20 +42765,27 @@ class ArcPasswordManagerDefaultAnisetteProviderImpl extends RustOpaque implements ArcPasswordManagerDefaultAnisetteProvider { // Not to be used by end users ArcPasswordManagerDefaultAnisetteProviderImpl.frbInternalDcoDecode( - List wire) - : super.frbInternalDcoDecode(wire, _kStaticData); + List wire, + ) : super.frbInternalDcoDecode(wire, _kStaticData); // Not to be used by end users ArcPasswordManagerDefaultAnisetteProviderImpl.frbInternalSseDecode( - BigInt ptr, int externalSizeOnNative) - : super.frbInternalSseDecode(ptr, externalSizeOnNative, _kStaticData); + BigInt ptr, + int externalSizeOnNative, + ) : super.frbInternalSseDecode(ptr, externalSizeOnNative, _kStaticData); static final _kStaticData = RustArcStaticData( - rustArcIncrementStrongCount: RustLib.instance.api + rustArcIncrementStrongCount: RustLib + .instance + .api .rust_arc_increment_strong_count_ArcPasswordManagerDefaultAnisetteProvider, - rustArcDecrementStrongCount: RustLib.instance.api + rustArcDecrementStrongCount: RustLib + .instance + .api .rust_arc_decrement_strong_count_ArcPasswordManagerDefaultAnisetteProvider, - rustArcDecrementStrongCountPtr: RustLib.instance.api + rustArcDecrementStrongCountPtr: RustLib + .instance + .api .rust_arc_decrement_strong_count_ArcPasswordManagerDefaultAnisetteProviderPtr, ); } @@ -31350,20 +42795,27 @@ class ArcProfilesClientDefaultAnisetteProviderImpl extends RustOpaque implements ArcProfilesClientDefaultAnisetteProvider { // Not to be used by end users ArcProfilesClientDefaultAnisetteProviderImpl.frbInternalDcoDecode( - List wire) - : super.frbInternalDcoDecode(wire, _kStaticData); + List wire, + ) : super.frbInternalDcoDecode(wire, _kStaticData); // Not to be used by end users ArcProfilesClientDefaultAnisetteProviderImpl.frbInternalSseDecode( - BigInt ptr, int externalSizeOnNative) - : super.frbInternalSseDecode(ptr, externalSizeOnNative, _kStaticData); + BigInt ptr, + int externalSizeOnNative, + ) : super.frbInternalSseDecode(ptr, externalSizeOnNative, _kStaticData); static final _kStaticData = RustArcStaticData( - rustArcIncrementStrongCount: RustLib.instance.api + rustArcIncrementStrongCount: RustLib + .instance + .api .rust_arc_increment_strong_count_ArcProfilesClientDefaultAnisetteProvider, - rustArcDecrementStrongCount: RustLib.instance.api + rustArcDecrementStrongCount: RustLib + .instance + .api .rust_arc_decrement_strong_count_ArcProfilesClientDefaultAnisetteProvider, - rustArcDecrementStrongCountPtr: RustLib.instance.api + rustArcDecrementStrongCountPtr: RustLib + .instance + .api .rust_arc_decrement_strong_count_ArcProfilesClientDefaultAnisetteProviderPtr, ); } @@ -31373,20 +42825,27 @@ class ArcSenderPushMessageImpl extends RustOpaque implements ArcSenderPushMessage { // Not to be used by end users ArcSenderPushMessageImpl.frbInternalDcoDecode(List wire) - : super.frbInternalDcoDecode(wire, _kStaticData); + : super.frbInternalDcoDecode(wire, _kStaticData); // Not to be used by end users ArcSenderPushMessageImpl.frbInternalSseDecode( - BigInt ptr, int externalSizeOnNative) - : super.frbInternalSseDecode(ptr, externalSizeOnNative, _kStaticData); + BigInt ptr, + int externalSizeOnNative, + ) : super.frbInternalSseDecode(ptr, externalSizeOnNative, _kStaticData); static final _kStaticData = RustArcStaticData( rustArcIncrementStrongCount: RustLib - .instance.api.rust_arc_increment_strong_count_ArcSenderPushMessage, + .instance + .api + .rust_arc_increment_strong_count_ArcSenderPushMessage, rustArcDecrementStrongCount: RustLib - .instance.api.rust_arc_decrement_strong_count_ArcSenderPushMessage, + .instance + .api + .rust_arc_decrement_strong_count_ArcSenderPushMessage, rustArcDecrementStrongCountPtr: RustLib - .instance.api.rust_arc_decrement_strong_count_ArcSenderPushMessagePtr, + .instance + .api + .rust_arc_decrement_strong_count_ArcSenderPushMessagePtr, ); } @@ -31394,12 +42853,13 @@ class ArcSenderPushMessageImpl extends RustOpaque class ArcSharedPushStateImpl extends RustOpaque implements ArcSharedPushState { // Not to be used by end users ArcSharedPushStateImpl.frbInternalDcoDecode(List wire) - : super.frbInternalDcoDecode(wire, _kStaticData); + : super.frbInternalDcoDecode(wire, _kStaticData); // Not to be used by end users ArcSharedPushStateImpl.frbInternalSseDecode( - BigInt ptr, int externalSizeOnNative) - : super.frbInternalSseDecode(ptr, externalSizeOnNative, _kStaticData); + BigInt ptr, + int externalSizeOnNative, + ) : super.frbInternalSseDecode(ptr, externalSizeOnNative, _kStaticData); static final _kStaticData = RustArcStaticData( rustArcIncrementStrongCount: @@ -31407,7 +42867,9 @@ class ArcSharedPushStateImpl extends RustOpaque implements ArcSharedPushState { rustArcDecrementStrongCount: RustLib.instance.api.rust_arc_decrement_strong_count_ArcSharedPushState, rustArcDecrementStrongCountPtr: RustLib - .instance.api.rust_arc_decrement_strong_count_ArcSharedPushStatePtr, + .instance + .api + .rust_arc_decrement_strong_count_ArcSharedPushStatePtr, ); } @@ -31416,20 +42878,27 @@ class ArcStatusKitClientDefaultAnisetteProviderImpl extends RustOpaque implements ArcStatusKitClientDefaultAnisetteProvider { // Not to be used by end users ArcStatusKitClientDefaultAnisetteProviderImpl.frbInternalDcoDecode( - List wire) - : super.frbInternalDcoDecode(wire, _kStaticData); + List wire, + ) : super.frbInternalDcoDecode(wire, _kStaticData); // Not to be used by end users ArcStatusKitClientDefaultAnisetteProviderImpl.frbInternalSseDecode( - BigInt ptr, int externalSizeOnNative) - : super.frbInternalSseDecode(ptr, externalSizeOnNative, _kStaticData); + BigInt ptr, + int externalSizeOnNative, + ) : super.frbInternalSseDecode(ptr, externalSizeOnNative, _kStaticData); static final _kStaticData = RustArcStaticData( - rustArcIncrementStrongCount: RustLib.instance.api + rustArcIncrementStrongCount: RustLib + .instance + .api .rust_arc_increment_strong_count_ArcStatusKitClientDefaultAnisetteProvider, - rustArcDecrementStrongCount: RustLib.instance.api + rustArcDecrementStrongCount: RustLib + .instance + .api .rust_arc_decrement_strong_count_ArcStatusKitClientDefaultAnisetteProvider, - rustArcDecrementStrongCountPtr: RustLib.instance.api + rustArcDecrementStrongCountPtr: RustLib + .instance + .api .rust_arc_decrement_strong_count_ArcStatusKitClientDefaultAnisetteProviderPtr, ); } @@ -31439,20 +42908,27 @@ class ArcTokenProviderDefaultAnisetteProviderImpl extends RustOpaque implements ArcTokenProviderDefaultAnisetteProvider { // Not to be used by end users ArcTokenProviderDefaultAnisetteProviderImpl.frbInternalDcoDecode( - List wire) - : super.frbInternalDcoDecode(wire, _kStaticData); + List wire, + ) : super.frbInternalDcoDecode(wire, _kStaticData); // Not to be used by end users ArcTokenProviderDefaultAnisetteProviderImpl.frbInternalSseDecode( - BigInt ptr, int externalSizeOnNative) - : super.frbInternalSseDecode(ptr, externalSizeOnNative, _kStaticData); + BigInt ptr, + int externalSizeOnNative, + ) : super.frbInternalSseDecode(ptr, externalSizeOnNative, _kStaticData); static final _kStaticData = RustArcStaticData( - rustArcIncrementStrongCount: RustLib.instance.api + rustArcIncrementStrongCount: RustLib + .instance + .api .rust_arc_increment_strong_count_ArcTokenProviderDefaultAnisetteProvider, - rustArcDecrementStrongCount: RustLib.instance.api + rustArcDecrementStrongCount: RustLib + .instance + .api .rust_arc_decrement_strong_count_ArcTokenProviderDefaultAnisetteProvider, - rustArcDecrementStrongCountPtr: RustLib.instance.api + rustArcDecrementStrongCountPtr: RustLib + .instance + .api .rust_arc_decrement_strong_count_ArcTokenProviderDefaultAnisetteProviderPtr, ); } @@ -31461,11 +42937,11 @@ class ArcTokenProviderDefaultAnisetteProviderImpl extends RustOpaque class AssetImpl extends RustOpaque implements Asset { // Not to be used by end users AssetImpl.frbInternalDcoDecode(List wire) - : super.frbInternalDcoDecode(wire, _kStaticData); + : super.frbInternalDcoDecode(wire, _kStaticData); // Not to be used by end users AssetImpl.frbInternalSseDecode(BigInt ptr, int externalSizeOnNative) - : super.frbInternalSseDecode(ptr, externalSizeOnNative, _kStaticData); + : super.frbInternalSseDecode(ptr, externalSizeOnNative, _kStaticData); static final _kStaticData = RustArcStaticData( rustArcIncrementStrongCount: @@ -31482,20 +42958,27 @@ class ChannelInterestTokenImpl extends RustOpaque implements ChannelInterestToken { // Not to be used by end users ChannelInterestTokenImpl.frbInternalDcoDecode(List wire) - : super.frbInternalDcoDecode(wire, _kStaticData); + : super.frbInternalDcoDecode(wire, _kStaticData); // Not to be used by end users ChannelInterestTokenImpl.frbInternalSseDecode( - BigInt ptr, int externalSizeOnNative) - : super.frbInternalSseDecode(ptr, externalSizeOnNative, _kStaticData); + BigInt ptr, + int externalSizeOnNative, + ) : super.frbInternalSseDecode(ptr, externalSizeOnNative, _kStaticData); static final _kStaticData = RustArcStaticData( rustArcIncrementStrongCount: RustLib - .instance.api.rust_arc_increment_strong_count_ChannelInterestToken, + .instance + .api + .rust_arc_increment_strong_count_ChannelInterestToken, rustArcDecrementStrongCount: RustLib - .instance.api.rust_arc_decrement_strong_count_ChannelInterestToken, + .instance + .api + .rust_arc_decrement_strong_count_ChannelInterestToken, rustArcDecrementStrongCountPtr: RustLib - .instance.api.rust_arc_decrement_strong_count_ChannelInterestTokenPtr, + .instance + .api + .rust_arc_decrement_strong_count_ChannelInterestTokenPtr, ); } @@ -31504,34 +42987,72 @@ class CircleClientSessionDefaultAnisetteProviderImpl extends RustOpaque implements CircleClientSessionDefaultAnisetteProvider { // Not to be used by end users CircleClientSessionDefaultAnisetteProviderImpl.frbInternalDcoDecode( - List wire) - : super.frbInternalDcoDecode(wire, _kStaticData); + List wire, + ) : super.frbInternalDcoDecode(wire, _kStaticData); // Not to be used by end users CircleClientSessionDefaultAnisetteProviderImpl.frbInternalSseDecode( - BigInt ptr, int externalSizeOnNative) - : super.frbInternalSseDecode(ptr, externalSizeOnNative, _kStaticData); + BigInt ptr, + int externalSizeOnNative, + ) : super.frbInternalSseDecode(ptr, externalSizeOnNative, _kStaticData); static final _kStaticData = RustArcStaticData( - rustArcIncrementStrongCount: RustLib.instance.api + rustArcIncrementStrongCount: RustLib + .instance + .api .rust_arc_increment_strong_count_CircleClientSessionDefaultAnisetteProvider, - rustArcDecrementStrongCount: RustLib.instance.api + rustArcDecrementStrongCount: RustLib + .instance + .api .rust_arc_decrement_strong_count_CircleClientSessionDefaultAnisetteProvider, - rustArcDecrementStrongCountPtr: RustLib.instance.api + rustArcDecrementStrongCountPtr: RustLib + .instance + .api .rust_arc_decrement_strong_count_CircleClientSessionDefaultAnisetteProviderPtr, ); } +@sealed +class CloudSyncPreparedMessageCreateHandleImpl extends RustOpaque + implements CloudSyncPreparedMessageCreateHandle { + // Not to be used by end users + CloudSyncPreparedMessageCreateHandleImpl.frbInternalDcoDecode( + List wire, + ) : super.frbInternalDcoDecode(wire, _kStaticData); + + // Not to be used by end users + CloudSyncPreparedMessageCreateHandleImpl.frbInternalSseDecode( + BigInt ptr, + int externalSizeOnNative, + ) : super.frbInternalSseDecode(ptr, externalSizeOnNative, _kStaticData); + + static final _kStaticData = RustArcStaticData( + rustArcIncrementStrongCount: RustLib + .instance + .api + .rust_arc_increment_strong_count_CloudSyncPreparedMessageCreateHandle, + rustArcDecrementStrongCount: RustLib + .instance + .api + .rust_arc_decrement_strong_count_CloudSyncPreparedMessageCreateHandle, + rustArcDecrementStrongCountPtr: RustLib + .instance + .api + .rust_arc_decrement_strong_count_CloudSyncPreparedMessageCreateHandlePtr, + ); +} + @sealed class ConversationLinkImpl extends RustOpaque implements ConversationLink { // Not to be used by end users ConversationLinkImpl.frbInternalDcoDecode(List wire) - : super.frbInternalDcoDecode(wire, _kStaticData); + : super.frbInternalDcoDecode(wire, _kStaticData); // Not to be used by end users ConversationLinkImpl.frbInternalSseDecode( - BigInt ptr, int externalSizeOnNative) - : super.frbInternalSseDecode(ptr, externalSizeOnNative, _kStaticData); + BigInt ptr, + int externalSizeOnNative, + ) : super.frbInternalSseDecode(ptr, externalSizeOnNative, _kStaticData); static final _kStaticData = RustArcStaticData( rustArcIncrementStrongCount: @@ -31539,7 +43060,9 @@ class ConversationLinkImpl extends RustOpaque implements ConversationLink { rustArcDecrementStrongCount: RustLib.instance.api.rust_arc_decrement_strong_count_ConversationLink, rustArcDecrementStrongCountPtr: RustLib - .instance.api.rust_arc_decrement_strong_count_ConversationLinkPtr, + .instance + .api + .rust_arc_decrement_strong_count_ConversationLinkPtr, ); } @@ -31548,19 +43071,26 @@ class ConversationParticipantImpl extends RustOpaque implements ConversationParticipant { // Not to be used by end users ConversationParticipantImpl.frbInternalDcoDecode(List wire) - : super.frbInternalDcoDecode(wire, _kStaticData); + : super.frbInternalDcoDecode(wire, _kStaticData); // Not to be used by end users ConversationParticipantImpl.frbInternalSseDecode( - BigInt ptr, int externalSizeOnNative) - : super.frbInternalSseDecode(ptr, externalSizeOnNative, _kStaticData); + BigInt ptr, + int externalSizeOnNative, + ) : super.frbInternalSseDecode(ptr, externalSizeOnNative, _kStaticData); static final _kStaticData = RustArcStaticData( rustArcIncrementStrongCount: RustLib - .instance.api.rust_arc_increment_strong_count_ConversationParticipant, + .instance + .api + .rust_arc_increment_strong_count_ConversationParticipant, rustArcDecrementStrongCount: RustLib - .instance.api.rust_arc_decrement_strong_count_ConversationParticipant, - rustArcDecrementStrongCountPtr: RustLib.instance.api + .instance + .api + .rust_arc_decrement_strong_count_ConversationParticipant, + rustArcDecrementStrongCountPtr: RustLib + .instance + .api .rust_arc_decrement_strong_count_ConversationParticipantPtr, ); } @@ -31569,11 +43099,11 @@ class ConversationParticipantImpl extends RustOpaque class DateImpl extends RustOpaque implements Date { // Not to be used by end users DateImpl.frbInternalDcoDecode(List wire) - : super.frbInternalDcoDecode(wire, _kStaticData); + : super.frbInternalDcoDecode(wire, _kStaticData); // Not to be used by end users DateImpl.frbInternalSseDecode(BigInt ptr, int externalSizeOnNative) - : super.frbInternalSseDecode(ptr, externalSizeOnNative, _kStaticData); + : super.frbInternalSseDecode(ptr, externalSizeOnNative, _kStaticData); static final _kStaticData = RustArcStaticData( rustArcIncrementStrongCount: @@ -31589,11 +43119,11 @@ class DateImpl extends RustOpaque implements Date { class EscrowDataImpl extends RustOpaque implements EscrowData { // Not to be used by end users EscrowDataImpl.frbInternalDcoDecode(List wire) - : super.frbInternalDcoDecode(wire, _kStaticData); + : super.frbInternalDcoDecode(wire, _kStaticData); // Not to be used by end users EscrowDataImpl.frbInternalSseDecode(BigInt ptr, int externalSizeOnNative) - : super.frbInternalSseDecode(ptr, externalSizeOnNative, _kStaticData); + : super.frbInternalSseDecode(ptr, externalSizeOnNative, _kStaticData); static final _kStaticData = RustArcStaticData( rustArcIncrementStrongCount: @@ -31610,20 +43140,27 @@ class FindMyFriendsClientDefaultAnisetteProviderImpl extends RustOpaque implements FindMyFriendsClientDefaultAnisetteProvider { // Not to be used by end users FindMyFriendsClientDefaultAnisetteProviderImpl.frbInternalDcoDecode( - List wire) - : super.frbInternalDcoDecode(wire, _kStaticData); + List wire, + ) : super.frbInternalDcoDecode(wire, _kStaticData); // Not to be used by end users FindMyFriendsClientDefaultAnisetteProviderImpl.frbInternalSseDecode( - BigInt ptr, int externalSizeOnNative) - : super.frbInternalSseDecode(ptr, externalSizeOnNative, _kStaticData); + BigInt ptr, + int externalSizeOnNative, + ) : super.frbInternalSseDecode(ptr, externalSizeOnNative, _kStaticData); static final _kStaticData = RustArcStaticData( - rustArcIncrementStrongCount: RustLib.instance.api + rustArcIncrementStrongCount: RustLib + .instance + .api .rust_arc_increment_strong_count_FindMyFriendsClientDefaultAnisetteProvider, - rustArcDecrementStrongCount: RustLib.instance.api + rustArcDecrementStrongCount: RustLib + .instance + .api .rust_arc_decrement_strong_count_FindMyFriendsClientDefaultAnisetteProvider, - rustArcDecrementStrongCountPtr: RustLib.instance.api + rustArcDecrementStrongCountPtr: RustLib + .instance + .api .rust_arc_decrement_strong_count_FindMyFriendsClientDefaultAnisetteProviderPtr, ); } @@ -31633,20 +43170,27 @@ class FindMyPhoneClientDefaultAnisetteProviderImpl extends RustOpaque implements FindMyPhoneClientDefaultAnisetteProvider { // Not to be used by end users FindMyPhoneClientDefaultAnisetteProviderImpl.frbInternalDcoDecode( - List wire) - : super.frbInternalDcoDecode(wire, _kStaticData); + List wire, + ) : super.frbInternalDcoDecode(wire, _kStaticData); // Not to be used by end users FindMyPhoneClientDefaultAnisetteProviderImpl.frbInternalSseDecode( - BigInt ptr, int externalSizeOnNative) - : super.frbInternalSseDecode(ptr, externalSizeOnNative, _kStaticData); + BigInt ptr, + int externalSizeOnNative, + ) : super.frbInternalSseDecode(ptr, externalSizeOnNative, _kStaticData); static final _kStaticData = RustArcStaticData( - rustArcIncrementStrongCount: RustLib.instance.api + rustArcIncrementStrongCount: RustLib + .instance + .api .rust_arc_increment_strong_count_FindMyPhoneClientDefaultAnisetteProvider, - rustArcDecrementStrongCount: RustLib.instance.api + rustArcDecrementStrongCount: RustLib + .instance + .api .rust_arc_decrement_strong_count_FindMyPhoneClientDefaultAnisetteProvider, - rustArcDecrementStrongCountPtr: RustLib.instance.api + rustArcDecrementStrongCountPtr: RustLib + .instance + .api .rust_arc_decrement_strong_count_FindMyPhoneClientDefaultAnisetteProviderPtr, ); } @@ -31656,19 +43200,26 @@ class GZipWrapperAttachmentMetaImpl extends RustOpaque implements GZipWrapperAttachmentMeta { // Not to be used by end users GZipWrapperAttachmentMetaImpl.frbInternalDcoDecode(List wire) - : super.frbInternalDcoDecode(wire, _kStaticData); + : super.frbInternalDcoDecode(wire, _kStaticData); // Not to be used by end users GZipWrapperAttachmentMetaImpl.frbInternalSseDecode( - BigInt ptr, int externalSizeOnNative) - : super.frbInternalSseDecode(ptr, externalSizeOnNative, _kStaticData); + BigInt ptr, + int externalSizeOnNative, + ) : super.frbInternalSseDecode(ptr, externalSizeOnNative, _kStaticData); static final _kStaticData = RustArcStaticData( rustArcIncrementStrongCount: RustLib - .instance.api.rust_arc_increment_strong_count_GZipWrapperAttachmentMeta, + .instance + .api + .rust_arc_increment_strong_count_GZipWrapperAttachmentMeta, rustArcDecrementStrongCount: RustLib - .instance.api.rust_arc_decrement_strong_count_GZipWrapperAttachmentMeta, - rustArcDecrementStrongCountPtr: RustLib.instance.api + .instance + .api + .rust_arc_decrement_strong_count_GZipWrapperAttachmentMeta, + rustArcDecrementStrongCountPtr: RustLib + .instance + .api .rust_arc_decrement_strong_count_GZipWrapperAttachmentMetaPtr, ); } @@ -31678,20 +43229,27 @@ class GZipWrapperChatProtoImpl extends RustOpaque implements GZipWrapperChatProto { // Not to be used by end users GZipWrapperChatProtoImpl.frbInternalDcoDecode(List wire) - : super.frbInternalDcoDecode(wire, _kStaticData); + : super.frbInternalDcoDecode(wire, _kStaticData); // Not to be used by end users GZipWrapperChatProtoImpl.frbInternalSseDecode( - BigInt ptr, int externalSizeOnNative) - : super.frbInternalSseDecode(ptr, externalSizeOnNative, _kStaticData); + BigInt ptr, + int externalSizeOnNative, + ) : super.frbInternalSseDecode(ptr, externalSizeOnNative, _kStaticData); static final _kStaticData = RustArcStaticData( rustArcIncrementStrongCount: RustLib - .instance.api.rust_arc_increment_strong_count_GZipWrapperChatProto, + .instance + .api + .rust_arc_increment_strong_count_GZipWrapperChatProto, rustArcDecrementStrongCount: RustLib - .instance.api.rust_arc_decrement_strong_count_GZipWrapperChatProto, + .instance + .api + .rust_arc_decrement_strong_count_GZipWrapperChatProto, rustArcDecrementStrongCountPtr: RustLib - .instance.api.rust_arc_decrement_strong_count_GZipWrapperChatProtoPtr, + .instance + .api + .rust_arc_decrement_strong_count_GZipWrapperChatProtoPtr, ); } @@ -31700,19 +43258,26 @@ class GZipWrapperMessageProto2Impl extends RustOpaque implements GZipWrapperMessageProto2 { // Not to be used by end users GZipWrapperMessageProto2Impl.frbInternalDcoDecode(List wire) - : super.frbInternalDcoDecode(wire, _kStaticData); + : super.frbInternalDcoDecode(wire, _kStaticData); // Not to be used by end users GZipWrapperMessageProto2Impl.frbInternalSseDecode( - BigInt ptr, int externalSizeOnNative) - : super.frbInternalSseDecode(ptr, externalSizeOnNative, _kStaticData); + BigInt ptr, + int externalSizeOnNative, + ) : super.frbInternalSseDecode(ptr, externalSizeOnNative, _kStaticData); static final _kStaticData = RustArcStaticData( rustArcIncrementStrongCount: RustLib - .instance.api.rust_arc_increment_strong_count_GZipWrapperMessageProto2, + .instance + .api + .rust_arc_increment_strong_count_GZipWrapperMessageProto2, rustArcDecrementStrongCount: RustLib - .instance.api.rust_arc_decrement_strong_count_GZipWrapperMessageProto2, - rustArcDecrementStrongCountPtr: RustLib.instance.api + .instance + .api + .rust_arc_decrement_strong_count_GZipWrapperMessageProto2, + rustArcDecrementStrongCountPtr: RustLib + .instance + .api .rust_arc_decrement_strong_count_GZipWrapperMessageProto2Ptr, ); } @@ -31722,19 +43287,26 @@ class GZipWrapperMessageProto3Impl extends RustOpaque implements GZipWrapperMessageProto3 { // Not to be used by end users GZipWrapperMessageProto3Impl.frbInternalDcoDecode(List wire) - : super.frbInternalDcoDecode(wire, _kStaticData); + : super.frbInternalDcoDecode(wire, _kStaticData); // Not to be used by end users GZipWrapperMessageProto3Impl.frbInternalSseDecode( - BigInt ptr, int externalSizeOnNative) - : super.frbInternalSseDecode(ptr, externalSizeOnNative, _kStaticData); + BigInt ptr, + int externalSizeOnNative, + ) : super.frbInternalSseDecode(ptr, externalSizeOnNative, _kStaticData); static final _kStaticData = RustArcStaticData( rustArcIncrementStrongCount: RustLib - .instance.api.rust_arc_increment_strong_count_GZipWrapperMessageProto3, + .instance + .api + .rust_arc_increment_strong_count_GZipWrapperMessageProto3, rustArcDecrementStrongCount: RustLib - .instance.api.rust_arc_decrement_strong_count_GZipWrapperMessageProto3, - rustArcDecrementStrongCountPtr: RustLib.instance.api + .instance + .api + .rust_arc_decrement_strong_count_GZipWrapperMessageProto3, + rustArcDecrementStrongCountPtr: RustLib + .instance + .api .rust_arc_decrement_strong_count_GZipWrapperMessageProto3Ptr, ); } @@ -31744,19 +43316,26 @@ class GZipWrapperMessageProto4Impl extends RustOpaque implements GZipWrapperMessageProto4 { // Not to be used by end users GZipWrapperMessageProto4Impl.frbInternalDcoDecode(List wire) - : super.frbInternalDcoDecode(wire, _kStaticData); + : super.frbInternalDcoDecode(wire, _kStaticData); // Not to be used by end users GZipWrapperMessageProto4Impl.frbInternalSseDecode( - BigInt ptr, int externalSizeOnNative) - : super.frbInternalSseDecode(ptr, externalSizeOnNative, _kStaticData); + BigInt ptr, + int externalSizeOnNative, + ) : super.frbInternalSseDecode(ptr, externalSizeOnNative, _kStaticData); static final _kStaticData = RustArcStaticData( rustArcIncrementStrongCount: RustLib - .instance.api.rust_arc_increment_strong_count_GZipWrapperMessageProto4, + .instance + .api + .rust_arc_increment_strong_count_GZipWrapperMessageProto4, rustArcDecrementStrongCount: RustLib - .instance.api.rust_arc_decrement_strong_count_GZipWrapperMessageProto4, - rustArcDecrementStrongCountPtr: RustLib.instance.api + .instance + .api + .rust_arc_decrement_strong_count_GZipWrapperMessageProto4, + rustArcDecrementStrongCountPtr: RustLib + .instance + .api .rust_arc_decrement_strong_count_GZipWrapperMessageProto4Ptr, ); } @@ -31766,19 +43345,26 @@ class GZipWrapperMessageProtoImpl extends RustOpaque implements GZipWrapperMessageProto { // Not to be used by end users GZipWrapperMessageProtoImpl.frbInternalDcoDecode(List wire) - : super.frbInternalDcoDecode(wire, _kStaticData); + : super.frbInternalDcoDecode(wire, _kStaticData); // Not to be used by end users GZipWrapperMessageProtoImpl.frbInternalSseDecode( - BigInt ptr, int externalSizeOnNative) - : super.frbInternalSseDecode(ptr, externalSizeOnNative, _kStaticData); + BigInt ptr, + int externalSizeOnNative, + ) : super.frbInternalSseDecode(ptr, externalSizeOnNative, _kStaticData); static final _kStaticData = RustArcStaticData( rustArcIncrementStrongCount: RustLib - .instance.api.rust_arc_increment_strong_count_GZipWrapperMessageProto, + .instance + .api + .rust_arc_increment_strong_count_GZipWrapperMessageProto, rustArcDecrementStrongCount: RustLib - .instance.api.rust_arc_decrement_strong_count_GZipWrapperMessageProto, - rustArcDecrementStrongCountPtr: RustLib.instance.api + .instance + .api + .rust_arc_decrement_strong_count_GZipWrapperMessageProto, + rustArcDecrementStrongCountPtr: RustLib + .instance + .api .rust_arc_decrement_strong_count_GZipWrapperMessageProtoPtr, ); } @@ -31787,11 +43373,11 @@ class GZipWrapperMessageProtoImpl extends RustOpaque class IdsUserImpl extends RustOpaque implements IdsUser { // Not to be used by end users IdsUserImpl.frbInternalDcoDecode(List wire) - : super.frbInternalDcoDecode(wire, _kStaticData); + : super.frbInternalDcoDecode(wire, _kStaticData); // Not to be used by end users IdsUserImpl.frbInternalSseDecode(BigInt ptr, int externalSizeOnNative) - : super.frbInternalSseDecode(ptr, externalSizeOnNative, _kStaticData); + : super.frbInternalSseDecode(ptr, externalSizeOnNative, _kStaticData); static final _kStaticData = RustArcStaticData( rustArcIncrementStrongCount: @@ -31807,11 +43393,11 @@ class IdsUserImpl extends RustOpaque implements IdsUser { class IdsngmIdentityImpl extends RustOpaque implements IdsngmIdentity { // Not to be used by end users IdsngmIdentityImpl.frbInternalDcoDecode(List wire) - : super.frbInternalDcoDecode(wire, _kStaticData); + : super.frbInternalDcoDecode(wire, _kStaticData); // Not to be used by end users IdsngmIdentityImpl.frbInternalSseDecode(BigInt ptr, int externalSizeOnNative) - : super.frbInternalSseDecode(ptr, externalSizeOnNative, _kStaticData); + : super.frbInternalSseDecode(ptr, externalSizeOnNative, _kStaticData); static final _kStaticData = RustArcStaticData( rustArcIncrementStrongCount: @@ -31827,11 +43413,11 @@ class IdsngmIdentityImpl extends RustOpaque implements IdsngmIdentity { class JoinedOsConfigImpl extends RustOpaque implements JoinedOsConfig { // Not to be used by end users JoinedOsConfigImpl.frbInternalDcoDecode(List wire) - : super.frbInternalDcoDecode(wire, _kStaticData); + : super.frbInternalDcoDecode(wire, _kStaticData); // Not to be used by end users JoinedOsConfigImpl.frbInternalSseDecode(BigInt ptr, int externalSizeOnNative) - : super.frbInternalSseDecode(ptr, externalSizeOnNative, _kStaticData); + : super.frbInternalSseDecode(ptr, externalSizeOnNative, _kStaticData); static final _kStaticData = RustArcStaticData( rustArcIncrementStrongCount: @@ -31847,11 +43433,11 @@ class JoinedOsConfigImpl extends RustOpaque implements JoinedOsConfig { class LocationReportImpl extends RustOpaque implements LocationReport { // Not to be used by end users LocationReportImpl.frbInternalDcoDecode(List wire) - : super.frbInternalDcoDecode(wire, _kStaticData); + : super.frbInternalDcoDecode(wire, _kStaticData); // Not to be used by end users LocationReportImpl.frbInternalSseDecode(BigInt ptr, int externalSizeOnNative) - : super.frbInternalSseDecode(ptr, externalSizeOnNative, _kStaticData); + : super.frbInternalSseDecode(ptr, externalSizeOnNative, _kStaticData); static final _kStaticData = RustArcStaticData( rustArcIncrementStrongCount: @@ -31862,52 +43448,44 @@ class LocationReportImpl extends RustOpaque implements LocationReport { RustLib.instance.api.rust_arc_decrement_strong_count_LocationReportPtr, ); - int get confidence => - RustLib.instance.api.crateApiApiLocationReportAutoAccessorGetConfidence( - that: this, - ); + int get confidence => RustLib.instance.api + .crateApiApiLocationReportAutoAccessorGetConfidence(that: this); int get horizontalAccuracy => RustLib.instance.api - .crateApiApiLocationReportAutoAccessorGetHorizontalAccuracy( - that: this, - ); + .crateApiApiLocationReportAutoAccessorGetHorizontalAccuracy(that: this); - int get keyIndex => - RustLib.instance.api.crateApiApiLocationReportAutoAccessorGetKeyIndex( - that: this, - ); + int get keyIndex => RustLib.instance.api + .crateApiApiLocationReportAutoAccessorGetKeyIndex(that: this); - double get lat => - RustLib.instance.api.crateApiApiLocationReportAutoAccessorGetLat( - that: this, - ); + double get lat => RustLib.instance.api + .crateApiApiLocationReportAutoAccessorGetLat(that: this); - double get long => - RustLib.instance.api.crateApiApiLocationReportAutoAccessorGetLong( - that: this, - ); + double get long => RustLib.instance.api + .crateApiApiLocationReportAutoAccessorGetLong(that: this); - int get status => - RustLib.instance.api.crateApiApiLocationReportAutoAccessorGetStatus( - that: this, - ); + int get status => RustLib.instance.api + .crateApiApiLocationReportAutoAccessorGetStatus(that: this); - SystemTime get timestamp => - RustLib.instance.api.crateApiApiLocationReportAutoAccessorGetTimestamp( - that: this, - ); + SystemTime get timestamp => RustLib.instance.api + .crateApiApiLocationReportAutoAccessorGetTimestamp(that: this); set confidence(int confidence) => RustLib.instance.api.crateApiApiLocationReportAutoAccessorSetConfidence( - that: this, confidence: confidence); + that: this, + confidence: confidence, + ); set horizontalAccuracy(int horizontalAccuracy) => RustLib.instance.api .crateApiApiLocationReportAutoAccessorSetHorizontalAccuracy( - that: this, horizontalAccuracy: horizontalAccuracy); + that: this, + horizontalAccuracy: horizontalAccuracy, + ); set keyIndex(int keyIndex) => RustLib.instance.api.crateApiApiLocationReportAutoAccessorSetKeyIndex( - that: this, keyIndex: keyIndex); + that: this, + keyIndex: keyIndex, + ); set lat(double lat) => RustLib.instance.api .crateApiApiLocationReportAutoAccessorSetLat(that: this, lat: lat); @@ -31917,22 +43495,26 @@ class LocationReportImpl extends RustOpaque implements LocationReport { set status(int status) => RustLib.instance.api.crateApiApiLocationReportAutoAccessorSetStatus( - that: this, status: status); + that: this, + status: status, + ); set timestamp(SystemTime timestamp) => RustLib.instance.api.crateApiApiLocationReportAutoAccessorSetTimestamp( - that: this, timestamp: timestamp); + that: this, + timestamp: timestamp, + ); } @sealed class MessageFlagsImpl extends RustOpaque implements MessageFlags { // Not to be used by end users MessageFlagsImpl.frbInternalDcoDecode(List wire) - : super.frbInternalDcoDecode(wire, _kStaticData); + : super.frbInternalDcoDecode(wire, _kStaticData); // Not to be used by end users MessageFlagsImpl.frbInternalSseDecode(BigInt ptr, int externalSizeOnNative) - : super.frbInternalSseDecode(ptr, externalSizeOnNative, _kStaticData); + : super.frbInternalSseDecode(ptr, externalSizeOnNative, _kStaticData); static final _kStaticData = RustArcStaticData( rustArcIncrementStrongCount: @@ -31943,9 +43525,8 @@ class MessageFlagsImpl extends RustOpaque implements MessageFlags { RustLib.instance.api.rust_arc_decrement_strong_count_MessageFlagsPtr, ); - PlatformInt64 bits() => RustLib.instance.api.crateApiApiMessageFlagsBits( - that: this, - ); + PlatformInt64 bits() => + RustLib.instance.api.crateApiApiMessageFlagsBits(that: this); } @sealed @@ -31953,20 +43534,27 @@ class NsArrayLpIconMetadataImpl extends RustOpaque implements NsArrayLpIconMetadata { // Not to be used by end users NsArrayLpIconMetadataImpl.frbInternalDcoDecode(List wire) - : super.frbInternalDcoDecode(wire, _kStaticData); + : super.frbInternalDcoDecode(wire, _kStaticData); // Not to be used by end users NsArrayLpIconMetadataImpl.frbInternalSseDecode( - BigInt ptr, int externalSizeOnNative) - : super.frbInternalSseDecode(ptr, externalSizeOnNative, _kStaticData); + BigInt ptr, + int externalSizeOnNative, + ) : super.frbInternalSseDecode(ptr, externalSizeOnNative, _kStaticData); static final _kStaticData = RustArcStaticData( rustArcIncrementStrongCount: RustLib - .instance.api.rust_arc_increment_strong_count_NsArrayLpIconMetadata, + .instance + .api + .rust_arc_increment_strong_count_NsArrayLpIconMetadata, rustArcDecrementStrongCount: RustLib - .instance.api.rust_arc_decrement_strong_count_NsArrayLpIconMetadata, + .instance + .api + .rust_arc_decrement_strong_count_NsArrayLpIconMetadata, rustArcDecrementStrongCountPtr: RustLib - .instance.api.rust_arc_decrement_strong_count_NsArrayLpIconMetadataPtr, + .instance + .api + .rust_arc_decrement_strong_count_NsArrayLpIconMetadataPtr, ); } @@ -31975,20 +43563,27 @@ class NsArrayLpImageMetadataImpl extends RustOpaque implements NsArrayLpImageMetadata { // Not to be used by end users NsArrayLpImageMetadataImpl.frbInternalDcoDecode(List wire) - : super.frbInternalDcoDecode(wire, _kStaticData); + : super.frbInternalDcoDecode(wire, _kStaticData); // Not to be used by end users NsArrayLpImageMetadataImpl.frbInternalSseDecode( - BigInt ptr, int externalSizeOnNative) - : super.frbInternalSseDecode(ptr, externalSizeOnNative, _kStaticData); + BigInt ptr, + int externalSizeOnNative, + ) : super.frbInternalSseDecode(ptr, externalSizeOnNative, _kStaticData); static final _kStaticData = RustArcStaticData( rustArcIncrementStrongCount: RustLib - .instance.api.rust_arc_increment_strong_count_NsArrayLpImageMetadata, + .instance + .api + .rust_arc_increment_strong_count_NsArrayLpImageMetadata, rustArcDecrementStrongCount: RustLib - .instance.api.rust_arc_decrement_strong_count_NsArrayLpImageMetadata, + .instance + .api + .rust_arc_decrement_strong_count_NsArrayLpImageMetadata, rustArcDecrementStrongCountPtr: RustLib - .instance.api.rust_arc_decrement_strong_count_NsArrayLpImageMetadataPtr, + .instance + .api + .rust_arc_decrement_strong_count_NsArrayLpImageMetadataPtr, ); } @@ -31996,11 +43591,11 @@ class NsArrayLpImageMetadataImpl extends RustOpaque class PushErrorImpl extends RustOpaque implements PushError { // Not to be used by end users PushErrorImpl.frbInternalDcoDecode(List wire) - : super.frbInternalDcoDecode(wire, _kStaticData); + : super.frbInternalDcoDecode(wire, _kStaticData); // Not to be used by end users PushErrorImpl.frbInternalSseDecode(BigInt ptr, int externalSizeOnNative) - : super.frbInternalSseDecode(ptr, externalSizeOnNative, _kStaticData); + : super.frbInternalSseDecode(ptr, externalSizeOnNative, _kStaticData); static final _kStaticData = RustArcStaticData( rustArcIncrementStrongCount: @@ -32016,12 +43611,13 @@ class PushErrorImpl extends RustOpaque implements PushError { class ReceiverApsMessageImpl extends RustOpaque implements ReceiverApsMessage { // Not to be used by end users ReceiverApsMessageImpl.frbInternalDcoDecode(List wire) - : super.frbInternalDcoDecode(wire, _kStaticData); + : super.frbInternalDcoDecode(wire, _kStaticData); // Not to be used by end users ReceiverApsMessageImpl.frbInternalSseDecode( - BigInt ptr, int externalSizeOnNative) - : super.frbInternalSseDecode(ptr, externalSizeOnNative, _kStaticData); + BigInt ptr, + int externalSizeOnNative, + ) : super.frbInternalSseDecode(ptr, externalSizeOnNative, _kStaticData); static final _kStaticData = RustArcStaticData( rustArcIncrementStrongCount: @@ -32029,7 +43625,9 @@ class ReceiverApsMessageImpl extends RustOpaque implements ReceiverApsMessage { rustArcDecrementStrongCount: RustLib.instance.api.rust_arc_decrement_strong_count_ReceiverApsMessage, rustArcDecrementStrongCountPtr: RustLib - .instance.api.rust_arc_decrement_strong_count_ReceiverApsMessagePtr, + .instance + .api + .rust_arc_decrement_strong_count_ReceiverApsMessagePtr, ); } @@ -32037,12 +43635,13 @@ class ReceiverApsMessageImpl extends RustOpaque implements ReceiverApsMessage { class SavedHardwareStateImpl extends RustOpaque implements SavedHardwareState { // Not to be used by end users SavedHardwareStateImpl.frbInternalDcoDecode(List wire) - : super.frbInternalDcoDecode(wire, _kStaticData); + : super.frbInternalDcoDecode(wire, _kStaticData); // Not to be used by end users SavedHardwareStateImpl.frbInternalSseDecode( - BigInt ptr, int externalSizeOnNative) - : super.frbInternalSseDecode(ptr, externalSizeOnNative, _kStaticData); + BigInt ptr, + int externalSizeOnNative, + ) : super.frbInternalSseDecode(ptr, externalSizeOnNative, _kStaticData); static final _kStaticData = RustArcStaticData( rustArcIncrementStrongCount: @@ -32050,31 +43649,31 @@ class SavedHardwareStateImpl extends RustOpaque implements SavedHardwareState { rustArcDecrementStrongCount: RustLib.instance.api.rust_arc_decrement_strong_count_SavedHardwareState, rustArcDecrementStrongCountPtr: RustLib - .instance.api.rust_arc_decrement_strong_count_SavedHardwareStatePtr, + .instance + .api + .rust_arc_decrement_strong_count_SavedHardwareStatePtr, ); - Uint8List get identity => - RustLib.instance.api.crateApiApiSavedHardwareStateAutoAccessorGetIdentity( - that: this, - ); + Uint8List get identity => RustLib.instance.api + .crateApiApiSavedHardwareStateAutoAccessorGetIdentity(that: this); - JoinedOsConfig get osConfig => - RustLib.instance.api.crateApiApiSavedHardwareStateAutoAccessorGetOsConfig( - that: this, - ); + JoinedOsConfig get osConfig => RustLib.instance.api + .crateApiApiSavedHardwareStateAutoAccessorGetOsConfig(that: this); - ApsState get push => - RustLib.instance.api.crateApiApiSavedHardwareStateAutoAccessorGetPush( - that: this, - ); + ApsState get push => RustLib.instance.api + .crateApiApiSavedHardwareStateAutoAccessorGetPush(that: this); set identity(Uint8List identity) => RustLib.instance.api.crateApiApiSavedHardwareStateAutoAccessorSetIdentity( - that: this, identity: identity); + that: this, + identity: identity, + ); set osConfig(JoinedOsConfig osConfig) => RustLib.instance.api.crateApiApiSavedHardwareStateAutoAccessorSetOsConfig( - that: this, osConfig: osConfig); + that: this, + osConfig: osConfig, + ); set push(ApsState push) => RustLib.instance.api .crateApiApiSavedHardwareStateAutoAccessorSetPush(that: this, push: push); @@ -32084,11 +43683,11 @@ class SavedHardwareStateImpl extends RustOpaque implements SavedHardwareState { class SenderImpl extends RustOpaque implements Sender { // Not to be used by end users SenderImpl.frbInternalDcoDecode(List wire) - : super.frbInternalDcoDecode(wire, _kStaticData); + : super.frbInternalDcoDecode(wire, _kStaticData); // Not to be used by end users SenderImpl.frbInternalSseDecode(BigInt ptr, int externalSizeOnNative) - : super.frbInternalSseDecode(ptr, externalSizeOnNative, _kStaticData); + : super.frbInternalSseDecode(ptr, externalSizeOnNative, _kStaticData); static final _kStaticData = RustArcStaticData( rustArcIncrementStrongCount: @@ -32104,12 +43703,13 @@ class SenderImpl extends RustOpaque implements Sender { class StCollapsedValueImpl extends RustOpaque implements StCollapsedValue { // Not to be used by end users StCollapsedValueImpl.frbInternalDcoDecode(List wire) - : super.frbInternalDcoDecode(wire, _kStaticData); + : super.frbInternalDcoDecode(wire, _kStaticData); // Not to be used by end users StCollapsedValueImpl.frbInternalSseDecode( - BigInt ptr, int externalSizeOnNative) - : super.frbInternalSseDecode(ptr, externalSizeOnNative, _kStaticData); + BigInt ptr, + int externalSizeOnNative, + ) : super.frbInternalSseDecode(ptr, externalSizeOnNative, _kStaticData); static final _kStaticData = RustArcStaticData( rustArcIncrementStrongCount: @@ -32117,7 +43717,9 @@ class StCollapsedValueImpl extends RustOpaque implements StCollapsedValue { rustArcDecrementStrongCount: RustLib.instance.api.rust_arc_decrement_strong_count_StCollapsedValue, rustArcDecrementStrongCountPtr: RustLib - .instance.api.rust_arc_decrement_strong_count_StCollapsedValuePtr, + .instance + .api + .rust_arc_decrement_strong_count_StCollapsedValuePtr, ); } @@ -32126,20 +43728,27 @@ class SyncManagerDefaultAnisetteProviderMyFilePackagerImpl extends RustOpaque implements SyncManagerDefaultAnisetteProviderMyFilePackager { // Not to be used by end users SyncManagerDefaultAnisetteProviderMyFilePackagerImpl.frbInternalDcoDecode( - List wire) - : super.frbInternalDcoDecode(wire, _kStaticData); + List wire, + ) : super.frbInternalDcoDecode(wire, _kStaticData); // Not to be used by end users SyncManagerDefaultAnisetteProviderMyFilePackagerImpl.frbInternalSseDecode( - BigInt ptr, int externalSizeOnNative) - : super.frbInternalSseDecode(ptr, externalSizeOnNative, _kStaticData); + BigInt ptr, + int externalSizeOnNative, + ) : super.frbInternalSseDecode(ptr, externalSizeOnNative, _kStaticData); static final _kStaticData = RustArcStaticData( - rustArcIncrementStrongCount: RustLib.instance.api + rustArcIncrementStrongCount: RustLib + .instance + .api .rust_arc_increment_strong_count_SyncManagerDefaultAnisetteProviderMyFilePackager, - rustArcDecrementStrongCount: RustLib.instance.api + rustArcDecrementStrongCount: RustLib + .instance + .api .rust_arc_decrement_strong_count_SyncManagerDefaultAnisetteProviderMyFilePackager, - rustArcDecrementStrongCountPtr: RustLib.instance.api + rustArcDecrementStrongCountPtr: RustLib + .instance + .api .rust_arc_decrement_strong_count_SyncManagerDefaultAnisetteProviderMyFilePackagerPtr, ); } @@ -32148,11 +43757,11 @@ class SyncManagerDefaultAnisetteProviderMyFilePackagerImpl extends RustOpaque class SystemTimeImpl extends RustOpaque implements SystemTime { // Not to be used by end users SystemTimeImpl.frbInternalDcoDecode(List wire) - : super.frbInternalDcoDecode(wire, _kStaticData); + : super.frbInternalDcoDecode(wire, _kStaticData); // Not to be used by end users SystemTimeImpl.frbInternalSseDecode(BigInt ptr, int externalSizeOnNative) - : super.frbInternalSseDecode(ptr, externalSizeOnNative, _kStaticData); + : super.frbInternalSseDecode(ptr, externalSizeOnNative, _kStaticData); static final _kStaticData = RustArcStaticData( rustArcIncrementStrongCount: @@ -32168,11 +43777,11 @@ class SystemTimeImpl extends RustOpaque implements SystemTime { class VerifyBodyImpl extends RustOpaque implements VerifyBody { // Not to be used by end users VerifyBodyImpl.frbInternalDcoDecode(List wire) - : super.frbInternalDcoDecode(wire, _kStaticData); + : super.frbInternalDcoDecode(wire, _kStaticData); // Not to be used by end users VerifyBodyImpl.frbInternalSseDecode(BigInt ptr, int externalSizeOnNative) - : super.frbInternalSseDecode(ptr, externalSizeOnNative, _kStaticData); + : super.frbInternalSseDecode(ptr, externalSizeOnNative, _kStaticData); static final _kStaticData = RustArcStaticData( rustArcIncrementStrongCount: @@ -32188,11 +43797,11 @@ class VerifyBodyImpl extends RustOpaque implements VerifyBody { class ViableBottleImpl extends RustOpaque implements ViableBottle { // Not to be used by end users ViableBottleImpl.frbInternalDcoDecode(List wire) - : super.frbInternalDcoDecode(wire, _kStaticData); + : super.frbInternalDcoDecode(wire, _kStaticData); // Not to be used by end users ViableBottleImpl.frbInternalSseDecode(BigInt ptr, int externalSizeOnNative) - : super.frbInternalSseDecode(ptr, externalSizeOnNative, _kStaticData); + : super.frbInternalSseDecode(ptr, externalSizeOnNative, _kStaticData); static final _kStaticData = RustArcStaticData( rustArcIncrementStrongCount: @@ -32203,38 +43812,36 @@ class ViableBottleImpl extends RustOpaque implements ViableBottle { RustLib.instance.api.rust_arc_decrement_strong_count_ViableBottlePtr, ); - String get deviceName => - RustLib.instance.api.crateApiApiViableBottleAutoAccessorGetDeviceName( - that: this, - ); + String get deviceName => RustLib.instance.api + .crateApiApiViableBottleAutoAccessorGetDeviceName(that: this); - EscrowData get escrow => - RustLib.instance.api.crateApiApiViableBottleAutoAccessorGetEscrow( - that: this, - ); + EscrowData get escrow => RustLib.instance.api + .crateApiApiViableBottleAutoAccessorGetEscrow(that: this); - String get modelClass => - RustLib.instance.api.crateApiApiViableBottleAutoAccessorGetModelClass( - that: this, - ); + String get modelClass => RustLib.instance.api + .crateApiApiViableBottleAutoAccessorGetModelClass(that: this); - int get numericLength => - RustLib.instance.api.crateApiApiViableBottleAutoAccessorGetNumericLength( - that: this, - ); + int get numericLength => RustLib.instance.api + .crateApiApiViableBottleAutoAccessorGetNumericLength(that: this); set deviceName(String deviceName) => RustLib.instance.api.crateApiApiViableBottleAutoAccessorSetDeviceName( - that: this, deviceName: deviceName); + that: this, + deviceName: deviceName, + ); set escrow(EscrowData escrow) => RustLib.instance.api .crateApiApiViableBottleAutoAccessorSetEscrow(that: this, escrow: escrow); set modelClass(String modelClass) => RustLib.instance.api.crateApiApiViableBottleAutoAccessorSetModelClass( - that: this, modelClass: modelClass); + that: this, + modelClass: modelClass, + ); set numericLength(int numericLength) => RustLib.instance.api.crateApiApiViableBottleAutoAccessorSetNumericLength( - that: this, numericLength: numericLength); + that: this, + numericLength: numericLength, + ); } diff --git a/lib/src/rust/frb_generated.io.dart b/lib/src/rust/frb_generated.io.dart index 9b9b72d628..cb9cb37348 100644 --- a/lib/src/rust/frb_generated.io.dart +++ b/lib/src/rust/frb_generated.io.dart @@ -20,681 +20,801 @@ abstract class RustLibApiImplPlatform extends BaseApiImpl { }); CrossPlatformFinalizerArg - get rust_arc_decrement_strong_count_ApsConnectionPtr => wire - ._rust_arc_decrement_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerAPSConnectionPtr; + get rust_arc_decrement_strong_count_ApsConnectionPtr => wire + ._rust_arc_decrement_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerAPSConnectionPtr; - CrossPlatformFinalizerArg get rust_arc_decrement_strong_count_ApsStatePtr => wire + CrossPlatformFinalizerArg + get rust_arc_decrement_strong_count_ApsStatePtr => wire ._rust_arc_decrement_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerAPSStatePtr; - CrossPlatformFinalizerArg get rust_arc_decrement_strong_count_ApsWatcherPtr => - wire._rust_arc_decrement_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerAPSWatcherPtr; + CrossPlatformFinalizerArg + get rust_arc_decrement_strong_count_ApsWatcherPtr => wire + ._rust_arc_decrement_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerAPSWatcherPtr; CrossPlatformFinalizerArg - get rust_arc_decrement_strong_count_ArcAnisetteClientDefaultAnisetteProviderPtr => - wire._rust_arc_decrement_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcAnisetteClientDefaultAnisetteProviderPtr; + get rust_arc_decrement_strong_count_ArcAnisetteClientDefaultAnisetteProviderPtr => + wire._rust_arc_decrement_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcAnisetteClientDefaultAnisetteProviderPtr; CrossPlatformFinalizerArg - get rust_arc_decrement_strong_count_ArcCloudKitClientDefaultAnisetteProviderPtr => - wire._rust_arc_decrement_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcCloudKitClientDefaultAnisetteProviderPtr; + get rust_arc_decrement_strong_count_ArcCloudKitClientDefaultAnisetteProviderPtr => + wire._rust_arc_decrement_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcCloudKitClientDefaultAnisetteProviderPtr; CrossPlatformFinalizerArg - get rust_arc_decrement_strong_count_ArcCloudMessagesClientDefaultAnisetteProviderPtr => - wire._rust_arc_decrement_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcCloudMessagesClientDefaultAnisetteProviderPtr; + get rust_arc_decrement_strong_count_ArcCloudMessagesClientDefaultAnisetteProviderPtr => + wire._rust_arc_decrement_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcCloudMessagesClientDefaultAnisetteProviderPtr; CrossPlatformFinalizerArg - get rust_arc_decrement_strong_count_ArcFtClientPtr => wire - ._rust_arc_decrement_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcFTClientPtr; + get rust_arc_decrement_strong_count_ArcFtClientPtr => wire + ._rust_arc_decrement_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcFTClientPtr; CrossPlatformFinalizerArg - get rust_arc_decrement_strong_count_ArcFindMyClientDefaultAnisetteProviderPtr => - wire._rust_arc_decrement_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcFindMyClientDefaultAnisetteProviderPtr; + get rust_arc_decrement_strong_count_ArcFindMyClientDefaultAnisetteProviderPtr => + wire._rust_arc_decrement_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcFindMyClientDefaultAnisetteProviderPtr; CrossPlatformFinalizerArg - get rust_arc_decrement_strong_count_ArcImClientPtr => wire - ._rust_arc_decrement_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcIMClientPtr; + get rust_arc_decrement_strong_count_ArcImClientPtr => wire + ._rust_arc_decrement_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcIMClientPtr; CrossPlatformFinalizerArg - get rust_arc_decrement_strong_count_ArcIdmsAuthListenerPtr => wire - ._rust_arc_decrement_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcIdmsAuthListenerPtr; + get rust_arc_decrement_strong_count_ArcIdmsAuthListenerPtr => wire + ._rust_arc_decrement_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcIdmsAuthListenerPtr; CrossPlatformFinalizerArg - get rust_arc_decrement_strong_count_ArcKeychainClientDefaultAnisetteProviderPtr => - wire._rust_arc_decrement_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcKeychainClientDefaultAnisetteProviderPtr; + get rust_arc_decrement_strong_count_ArcKeychainClientDefaultAnisetteProviderPtr => + wire._rust_arc_decrement_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcKeychainClientDefaultAnisetteProviderPtr; CrossPlatformFinalizerArg - get rust_arc_decrement_strong_count_ArcMutexAppleAccountDefaultAnisetteProviderPtr => - wire._rust_arc_decrement_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcMutexAppleAccountDefaultAnisetteProviderPtr; + get rust_arc_decrement_strong_count_ArcMutexAppleAccountDefaultAnisetteProviderPtr => + wire._rust_arc_decrement_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcMutexAppleAccountDefaultAnisetteProviderPtr; CrossPlatformFinalizerArg - get rust_arc_decrement_strong_count_ArcMutexOptionCircleClientSessionDefaultAnisetteProviderPtr => - wire._rust_arc_decrement_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcMutexOptionCircleClientSessionDefaultAnisetteProviderPtr; + get rust_arc_decrement_strong_count_ArcMutexOptionCircleClientSessionDefaultAnisetteProviderPtr => + wire._rust_arc_decrement_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcMutexOptionCircleClientSessionDefaultAnisetteProviderPtr; CrossPlatformFinalizerArg - get rust_arc_decrement_strong_count_ArcMutexVecActiveCircleSessionPtr => wire - ._rust_arc_decrement_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcMutexVecActiveCircleSessionPtr; + get rust_arc_decrement_strong_count_ArcMutexVecActiveCircleSessionPtr => wire + ._rust_arc_decrement_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcMutexVecActiveCircleSessionPtr; CrossPlatformFinalizerArg - get rust_arc_decrement_strong_count_ArcPasswordManagerDefaultAnisetteProviderPtr => - wire._rust_arc_decrement_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcPasswordManagerDefaultAnisetteProviderPtr; + get rust_arc_decrement_strong_count_ArcPasswordManagerDefaultAnisetteProviderPtr => + wire._rust_arc_decrement_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcPasswordManagerDefaultAnisetteProviderPtr; CrossPlatformFinalizerArg - get rust_arc_decrement_strong_count_ArcProfilesClientDefaultAnisetteProviderPtr => - wire._rust_arc_decrement_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcProfilesClientDefaultAnisetteProviderPtr; + get rust_arc_decrement_strong_count_ArcProfilesClientDefaultAnisetteProviderPtr => + wire._rust_arc_decrement_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcProfilesClientDefaultAnisetteProviderPtr; CrossPlatformFinalizerArg - get rust_arc_decrement_strong_count_ArcSenderPushMessagePtr => wire - ._rust_arc_decrement_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcSenderPushMessagePtr; + get rust_arc_decrement_strong_count_ArcSenderPushMessagePtr => wire + ._rust_arc_decrement_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcSenderPushMessagePtr; CrossPlatformFinalizerArg - get rust_arc_decrement_strong_count_ArcSharedPushStatePtr => wire - ._rust_arc_decrement_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcSharedPushStatePtr; + get rust_arc_decrement_strong_count_ArcSharedPushStatePtr => wire + ._rust_arc_decrement_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcSharedPushStatePtr; CrossPlatformFinalizerArg - get rust_arc_decrement_strong_count_ArcStatusKitClientDefaultAnisetteProviderPtr => - wire._rust_arc_decrement_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcStatusKitClientDefaultAnisetteProviderPtr; + get rust_arc_decrement_strong_count_ArcStatusKitClientDefaultAnisetteProviderPtr => + wire._rust_arc_decrement_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcStatusKitClientDefaultAnisetteProviderPtr; CrossPlatformFinalizerArg - get rust_arc_decrement_strong_count_ArcTokenProviderDefaultAnisetteProviderPtr => - wire._rust_arc_decrement_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcTokenProviderDefaultAnisetteProviderPtr; + get rust_arc_decrement_strong_count_ArcTokenProviderDefaultAnisetteProviderPtr => + wire._rust_arc_decrement_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcTokenProviderDefaultAnisetteProviderPtr; CrossPlatformFinalizerArg get rust_arc_decrement_strong_count_AssetPtr => wire ._rust_arc_decrement_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerAssetPtr; CrossPlatformFinalizerArg - get rust_arc_decrement_strong_count_ChannelInterestTokenPtr => wire - ._rust_arc_decrement_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerChannelInterestTokenPtr; + get rust_arc_decrement_strong_count_ChannelInterestTokenPtr => wire + ._rust_arc_decrement_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerChannelInterestTokenPtr; + + CrossPlatformFinalizerArg + get rust_arc_decrement_strong_count_CircleClientSessionDefaultAnisetteProviderPtr => + wire._rust_arc_decrement_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerCircleClientSessionDefaultAnisetteProviderPtr; CrossPlatformFinalizerArg - get rust_arc_decrement_strong_count_CircleClientSessionDefaultAnisetteProviderPtr => - wire._rust_arc_decrement_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerCircleClientSessionDefaultAnisetteProviderPtr; + get rust_arc_decrement_strong_count_CloudSyncPreparedMessageCreateHandlePtr => + wire._rust_arc_decrement_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerCloudSyncPreparedMessageCreateHandlePtr; CrossPlatformFinalizerArg - get rust_arc_decrement_strong_count_ConversationLinkPtr => wire - ._rust_arc_decrement_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerConversationLinkPtr; + get rust_arc_decrement_strong_count_ConversationLinkPtr => wire + ._rust_arc_decrement_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerConversationLinkPtr; CrossPlatformFinalizerArg - get rust_arc_decrement_strong_count_ConversationParticipantPtr => wire - ._rust_arc_decrement_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerConversationParticipantPtr; + get rust_arc_decrement_strong_count_ConversationParticipantPtr => wire + ._rust_arc_decrement_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerConversationParticipantPtr; CrossPlatformFinalizerArg get rust_arc_decrement_strong_count_DatePtr => wire ._rust_arc_decrement_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerDatePtr; - CrossPlatformFinalizerArg get rust_arc_decrement_strong_count_EscrowDataPtr => - wire._rust_arc_decrement_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerEscrowDataPtr; + CrossPlatformFinalizerArg + get rust_arc_decrement_strong_count_EscrowDataPtr => wire + ._rust_arc_decrement_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerEscrowDataPtr; CrossPlatformFinalizerArg - get rust_arc_decrement_strong_count_FindMyFriendsClientDefaultAnisetteProviderPtr => - wire._rust_arc_decrement_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerFindMyFriendsClientDefaultAnisetteProviderPtr; + get rust_arc_decrement_strong_count_FindMyFriendsClientDefaultAnisetteProviderPtr => + wire._rust_arc_decrement_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerFindMyFriendsClientDefaultAnisetteProviderPtr; CrossPlatformFinalizerArg - get rust_arc_decrement_strong_count_FindMyPhoneClientDefaultAnisetteProviderPtr => - wire._rust_arc_decrement_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerFindMyPhoneClientDefaultAnisetteProviderPtr; + get rust_arc_decrement_strong_count_FindMyPhoneClientDefaultAnisetteProviderPtr => + wire._rust_arc_decrement_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerFindMyPhoneClientDefaultAnisetteProviderPtr; CrossPlatformFinalizerArg - get rust_arc_decrement_strong_count_GZipWrapperAttachmentMetaPtr => wire - ._rust_arc_decrement_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerGZipWrapperAttachmentMetaPtr; + get rust_arc_decrement_strong_count_GZipWrapperAttachmentMetaPtr => wire + ._rust_arc_decrement_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerGZipWrapperAttachmentMetaPtr; CrossPlatformFinalizerArg - get rust_arc_decrement_strong_count_GZipWrapperChatProtoPtr => wire - ._rust_arc_decrement_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerGZipWrapperChatProtoPtr; + get rust_arc_decrement_strong_count_GZipWrapperChatProtoPtr => wire + ._rust_arc_decrement_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerGZipWrapperChatProtoPtr; CrossPlatformFinalizerArg - get rust_arc_decrement_strong_count_GZipWrapperMessageProtoPtr => wire - ._rust_arc_decrement_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerGZipWrapperMessageProtoPtr; + get rust_arc_decrement_strong_count_GZipWrapperMessageProtoPtr => wire + ._rust_arc_decrement_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerGZipWrapperMessageProtoPtr; CrossPlatformFinalizerArg - get rust_arc_decrement_strong_count_GZipWrapperMessageProto2Ptr => wire - ._rust_arc_decrement_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerGZipWrapperMessageProto2Ptr; + get rust_arc_decrement_strong_count_GZipWrapperMessageProto2Ptr => wire + ._rust_arc_decrement_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerGZipWrapperMessageProto2Ptr; CrossPlatformFinalizerArg - get rust_arc_decrement_strong_count_GZipWrapperMessageProto3Ptr => wire - ._rust_arc_decrement_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerGZipWrapperMessageProto3Ptr; + get rust_arc_decrement_strong_count_GZipWrapperMessageProto3Ptr => wire + ._rust_arc_decrement_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerGZipWrapperMessageProto3Ptr; CrossPlatformFinalizerArg - get rust_arc_decrement_strong_count_GZipWrapperMessageProto4Ptr => wire - ._rust_arc_decrement_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerGZipWrapperMessageProto4Ptr; + get rust_arc_decrement_strong_count_GZipWrapperMessageProto4Ptr => wire + ._rust_arc_decrement_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerGZipWrapperMessageProto4Ptr; CrossPlatformFinalizerArg - get rust_arc_decrement_strong_count_IdsngmIdentityPtr => wire - ._rust_arc_decrement_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerIDSNGMIdentityPtr; + get rust_arc_decrement_strong_count_IdsngmIdentityPtr => wire + ._rust_arc_decrement_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerIDSNGMIdentityPtr; - CrossPlatformFinalizerArg get rust_arc_decrement_strong_count_IdsUserPtr => wire + CrossPlatformFinalizerArg + get rust_arc_decrement_strong_count_IdsUserPtr => wire ._rust_arc_decrement_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerIDSUserPtr; CrossPlatformFinalizerArg - get rust_arc_decrement_strong_count_JoinedOsConfigPtr => wire - ._rust_arc_decrement_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerJoinedOSConfigPtr; + get rust_arc_decrement_strong_count_JoinedOsConfigPtr => wire + ._rust_arc_decrement_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerJoinedOSConfigPtr; CrossPlatformFinalizerArg - get rust_arc_decrement_strong_count_LocationReportPtr => wire - ._rust_arc_decrement_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerLocationReportPtr; + get rust_arc_decrement_strong_count_LocationReportPtr => wire + ._rust_arc_decrement_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerLocationReportPtr; CrossPlatformFinalizerArg - get rust_arc_decrement_strong_count_MessageFlagsPtr => wire - ._rust_arc_decrement_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerMessageFlagsPtr; + get rust_arc_decrement_strong_count_MessageFlagsPtr => wire + ._rust_arc_decrement_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerMessageFlagsPtr; CrossPlatformFinalizerArg - get rust_arc_decrement_strong_count_NsArrayLpIconMetadataPtr => wire - ._rust_arc_decrement_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerNSArrayLPIconMetadataPtr; + get rust_arc_decrement_strong_count_NsArrayLpIconMetadataPtr => wire + ._rust_arc_decrement_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerNSArrayLPIconMetadataPtr; CrossPlatformFinalizerArg - get rust_arc_decrement_strong_count_NsArrayLpImageMetadataPtr => wire - ._rust_arc_decrement_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerNSArrayLPImageMetadataPtr; + get rust_arc_decrement_strong_count_NsArrayLpImageMetadataPtr => wire + ._rust_arc_decrement_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerNSArrayLPImageMetadataPtr; - CrossPlatformFinalizerArg get rust_arc_decrement_strong_count_PushErrorPtr => - wire._rust_arc_decrement_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerPushErrorPtr; + CrossPlatformFinalizerArg + get rust_arc_decrement_strong_count_PushErrorPtr => wire + ._rust_arc_decrement_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerPushErrorPtr; CrossPlatformFinalizerArg - get rust_arc_decrement_strong_count_ReceiverApsMessagePtr => wire - ._rust_arc_decrement_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerReceiverAPSMessagePtr; + get rust_arc_decrement_strong_count_ReceiverApsMessagePtr => wire + ._rust_arc_decrement_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerReceiverAPSMessagePtr; CrossPlatformFinalizerArg - get rust_arc_decrement_strong_count_SavedHardwareStatePtr => wire - ._rust_arc_decrement_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerSavedHardwareStatePtr; + get rust_arc_decrement_strong_count_SavedHardwareStatePtr => wire + ._rust_arc_decrement_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerSavedHardwareStatePtr; - CrossPlatformFinalizerArg get rust_arc_decrement_strong_count_SenderPtr => wire + CrossPlatformFinalizerArg + get rust_arc_decrement_strong_count_SenderPtr => wire ._rust_arc_decrement_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerSenderPtr; CrossPlatformFinalizerArg - get rust_arc_decrement_strong_count_StCollapsedValuePtr => wire - ._rust_arc_decrement_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerStCollapsedValuePtr; + get rust_arc_decrement_strong_count_StCollapsedValuePtr => wire + ._rust_arc_decrement_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerStCollapsedValuePtr; CrossPlatformFinalizerArg - get rust_arc_decrement_strong_count_SyncManagerDefaultAnisetteProviderMyFilePackagerPtr => - wire._rust_arc_decrement_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerSyncManagerDefaultAnisetteProviderMyFilePackagerPtr; + get rust_arc_decrement_strong_count_SyncManagerDefaultAnisetteProviderMyFilePackagerPtr => + wire._rust_arc_decrement_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerSyncManagerDefaultAnisetteProviderMyFilePackagerPtr; - CrossPlatformFinalizerArg get rust_arc_decrement_strong_count_SystemTimePtr => - wire._rust_arc_decrement_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerSystemTimePtr; + CrossPlatformFinalizerArg + get rust_arc_decrement_strong_count_SystemTimePtr => wire + ._rust_arc_decrement_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerSystemTimePtr; - CrossPlatformFinalizerArg get rust_arc_decrement_strong_count_VerifyBodyPtr => - wire._rust_arc_decrement_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerVerifyBodyPtr; + CrossPlatformFinalizerArg + get rust_arc_decrement_strong_count_VerifyBodyPtr => wire + ._rust_arc_decrement_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerVerifyBodyPtr; CrossPlatformFinalizerArg - get rust_arc_decrement_strong_count_ViableBottlePtr => wire - ._rust_arc_decrement_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerViableBottlePtr; + get rust_arc_decrement_strong_count_ViableBottlePtr => wire + ._rust_arc_decrement_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerViableBottlePtr; @protected AnyhowException dco_decode_AnyhowException(dynamic raw); @protected ApsConnection - dco_decode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerAPSConnection( - dynamic raw); + dco_decode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerAPSConnection( + dynamic raw, + ); @protected ApsState - dco_decode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerAPSState( - dynamic raw); + dco_decode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerAPSState( + dynamic raw, + ); @protected ApsWatcher - dco_decode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerAPSWatcher( - dynamic raw); + dco_decode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerAPSWatcher( + dynamic raw, + ); @protected ArcAnisetteClientDefaultAnisetteProvider - dco_decode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcAnisetteClientDefaultAnisetteProvider( - dynamic raw); + dco_decode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcAnisetteClientDefaultAnisetteProvider( + dynamic raw, + ); @protected ArcCloudKitClientDefaultAnisetteProvider - dco_decode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcCloudKitClientDefaultAnisetteProvider( - dynamic raw); + dco_decode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcCloudKitClientDefaultAnisetteProvider( + dynamic raw, + ); @protected ArcCloudMessagesClientDefaultAnisetteProvider - dco_decode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcCloudMessagesClientDefaultAnisetteProvider( - dynamic raw); + dco_decode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcCloudMessagesClientDefaultAnisetteProvider( + dynamic raw, + ); @protected ArcFtClient - dco_decode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcFTClient( - dynamic raw); + dco_decode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcFTClient( + dynamic raw, + ); @protected ArcFindMyClientDefaultAnisetteProvider - dco_decode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcFindMyClientDefaultAnisetteProvider( - dynamic raw); + dco_decode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcFindMyClientDefaultAnisetteProvider( + dynamic raw, + ); @protected ArcImClient - dco_decode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcIMClient( - dynamic raw); + dco_decode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcIMClient( + dynamic raw, + ); @protected ArcIdmsAuthListener - dco_decode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcIdmsAuthListener( - dynamic raw); + dco_decode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcIdmsAuthListener( + dynamic raw, + ); @protected ArcKeychainClientDefaultAnisetteProvider - dco_decode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcKeychainClientDefaultAnisetteProvider( - dynamic raw); + dco_decode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcKeychainClientDefaultAnisetteProvider( + dynamic raw, + ); @protected ArcMutexAppleAccountDefaultAnisetteProvider - dco_decode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcMutexAppleAccountDefaultAnisetteProvider( - dynamic raw); + dco_decode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcMutexAppleAccountDefaultAnisetteProvider( + dynamic raw, + ); @protected ArcMutexOptionCircleClientSessionDefaultAnisetteProvider - dco_decode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcMutexOptionCircleClientSessionDefaultAnisetteProvider( - dynamic raw); + dco_decode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcMutexOptionCircleClientSessionDefaultAnisetteProvider( + dynamic raw, + ); @protected ArcMutexVecActiveCircleSession - dco_decode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcMutexVecActiveCircleSession( - dynamic raw); + dco_decode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcMutexVecActiveCircleSession( + dynamic raw, + ); @protected ArcPasswordManagerDefaultAnisetteProvider - dco_decode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcPasswordManagerDefaultAnisetteProvider( - dynamic raw); + dco_decode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcPasswordManagerDefaultAnisetteProvider( + dynamic raw, + ); @protected ArcProfilesClientDefaultAnisetteProvider - dco_decode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcProfilesClientDefaultAnisetteProvider( - dynamic raw); + dco_decode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcProfilesClientDefaultAnisetteProvider( + dynamic raw, + ); @protected ArcSenderPushMessage - dco_decode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcSenderPushMessage( - dynamic raw); + dco_decode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcSenderPushMessage( + dynamic raw, + ); @protected ArcSharedPushState - dco_decode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcSharedPushState( - dynamic raw); + dco_decode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcSharedPushState( + dynamic raw, + ); @protected ArcStatusKitClientDefaultAnisetteProvider - dco_decode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcStatusKitClientDefaultAnisetteProvider( - dynamic raw); + dco_decode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcStatusKitClientDefaultAnisetteProvider( + dynamic raw, + ); @protected ArcTokenProviderDefaultAnisetteProvider - dco_decode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcTokenProviderDefaultAnisetteProvider( - dynamic raw); + dco_decode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcTokenProviderDefaultAnisetteProvider( + dynamic raw, + ); @protected Asset - dco_decode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerAsset( - dynamic raw); + dco_decode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerAsset( + dynamic raw, + ); @protected ChannelInterestToken - dco_decode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerChannelInterestToken( - dynamic raw); + dco_decode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerChannelInterestToken( + dynamic raw, + ); @protected CircleClientSessionDefaultAnisetteProvider - dco_decode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerCircleClientSessionDefaultAnisetteProvider( - dynamic raw); + dco_decode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerCircleClientSessionDefaultAnisetteProvider( + dynamic raw, + ); + + @protected + CloudSyncPreparedMessageCreateHandle + dco_decode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerCloudSyncPreparedMessageCreateHandle( + dynamic raw, + ); @protected ConversationLink - dco_decode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerConversationLink( - dynamic raw); + dco_decode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerConversationLink( + dynamic raw, + ); @protected ConversationParticipant - dco_decode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerConversationParticipant( - dynamic raw); + dco_decode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerConversationParticipant( + dynamic raw, + ); @protected Date - dco_decode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerDate( - dynamic raw); + dco_decode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerDate( + dynamic raw, + ); @protected EscrowData - dco_decode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerEscrowData( - dynamic raw); + dco_decode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerEscrowData( + dynamic raw, + ); @protected FindMyFriendsClientDefaultAnisetteProvider - dco_decode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerFindMyFriendsClientDefaultAnisetteProvider( - dynamic raw); + dco_decode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerFindMyFriendsClientDefaultAnisetteProvider( + dynamic raw, + ); @protected FindMyPhoneClientDefaultAnisetteProvider - dco_decode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerFindMyPhoneClientDefaultAnisetteProvider( - dynamic raw); + dco_decode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerFindMyPhoneClientDefaultAnisetteProvider( + dynamic raw, + ); @protected GZipWrapperAttachmentMeta - dco_decode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerGZipWrapperAttachmentMeta( - dynamic raw); + dco_decode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerGZipWrapperAttachmentMeta( + dynamic raw, + ); @protected GZipWrapperChatProto - dco_decode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerGZipWrapperChatProto( - dynamic raw); + dco_decode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerGZipWrapperChatProto( + dynamic raw, + ); @protected GZipWrapperMessageProto - dco_decode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerGZipWrapperMessageProto( - dynamic raw); + dco_decode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerGZipWrapperMessageProto( + dynamic raw, + ); @protected GZipWrapperMessageProto2 - dco_decode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerGZipWrapperMessageProto2( - dynamic raw); + dco_decode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerGZipWrapperMessageProto2( + dynamic raw, + ); @protected GZipWrapperMessageProto3 - dco_decode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerGZipWrapperMessageProto3( - dynamic raw); + dco_decode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerGZipWrapperMessageProto3( + dynamic raw, + ); @protected GZipWrapperMessageProto4 - dco_decode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerGZipWrapperMessageProto4( - dynamic raw); + dco_decode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerGZipWrapperMessageProto4( + dynamic raw, + ); @protected IdsngmIdentity - dco_decode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerIDSNGMIdentity( - dynamic raw); + dco_decode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerIDSNGMIdentity( + dynamic raw, + ); @protected IdsUser - dco_decode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerIDSUser( - dynamic raw); + dco_decode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerIDSUser( + dynamic raw, + ); @protected JoinedOsConfig - dco_decode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerJoinedOSConfig( - dynamic raw); + dco_decode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerJoinedOSConfig( + dynamic raw, + ); @protected LocationReport - dco_decode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerLocationReport( - dynamic raw); + dco_decode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerLocationReport( + dynamic raw, + ); @protected MessageFlags - dco_decode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerMessageFlags( - dynamic raw); + dco_decode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerMessageFlags( + dynamic raw, + ); @protected NsArrayLpIconMetadata - dco_decode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerNSArrayLPIconMetadata( - dynamic raw); + dco_decode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerNSArrayLPIconMetadata( + dynamic raw, + ); @protected NsArrayLpImageMetadata - dco_decode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerNSArrayLPImageMetadata( - dynamic raw); + dco_decode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerNSArrayLPImageMetadata( + dynamic raw, + ); @protected PushError - dco_decode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerPushError( - dynamic raw); + dco_decode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerPushError( + dynamic raw, + ); @protected ReceiverApsMessage - dco_decode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerReceiverAPSMessage( - dynamic raw); + dco_decode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerReceiverAPSMessage( + dynamic raw, + ); @protected SavedHardwareState - dco_decode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerSavedHardwareState( - dynamic raw); + dco_decode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerSavedHardwareState( + dynamic raw, + ); @protected Sender - dco_decode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerSender( - dynamic raw); + dco_decode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerSender( + dynamic raw, + ); @protected StCollapsedValue - dco_decode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerStCollapsedValue( - dynamic raw); + dco_decode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerStCollapsedValue( + dynamic raw, + ); @protected SyncManagerDefaultAnisetteProviderMyFilePackager - dco_decode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerSyncManagerDefaultAnisetteProviderMyFilePackager( - dynamic raw); + dco_decode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerSyncManagerDefaultAnisetteProviderMyFilePackager( + dynamic raw, + ); @protected SystemTime - dco_decode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerSystemTime( - dynamic raw); + dco_decode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerSystemTime( + dynamic raw, + ); @protected VerifyBody - dco_decode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerVerifyBody( - dynamic raw); + dco_decode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerVerifyBody( + dynamic raw, + ); @protected ViableBottle - dco_decode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerViableBottle( - dynamic raw); + dco_decode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerViableBottle( + dynamic raw, + ); @protected ApsWatcher - dco_decode_Auto_RefMut_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerAPSWatcher( - dynamic raw); + dco_decode_Auto_RefMut_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerAPSWatcher( + dynamic raw, + ); @protected CircleClientSessionDefaultAnisetteProvider - dco_decode_Auto_RefMut_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerCircleClientSessionDefaultAnisetteProvider( - dynamic raw); + dco_decode_Auto_RefMut_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerCircleClientSessionDefaultAnisetteProvider( + dynamic raw, + ); @protected FindMyFriendsClientDefaultAnisetteProvider - dco_decode_Auto_RefMut_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerFindMyFriendsClientDefaultAnisetteProvider( - dynamic raw); + dco_decode_Auto_RefMut_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerFindMyFriendsClientDefaultAnisetteProvider( + dynamic raw, + ); @protected FindMyPhoneClientDefaultAnisetteProvider - dco_decode_Auto_RefMut_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerFindMyPhoneClientDefaultAnisetteProvider( - dynamic raw); + dco_decode_Auto_RefMut_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerFindMyPhoneClientDefaultAnisetteProvider( + dynamic raw, + ); @protected LocationReport - dco_decode_Auto_RefMut_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerLocationReport( - dynamic raw); + dco_decode_Auto_RefMut_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerLocationReport( + dynamic raw, + ); @protected ReceiverApsMessage - dco_decode_Auto_RefMut_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerReceiverAPSMessage( - dynamic raw); + dco_decode_Auto_RefMut_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerReceiverAPSMessage( + dynamic raw, + ); @protected SavedHardwareState - dco_decode_Auto_RefMut_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerSavedHardwareState( - dynamic raw); + dco_decode_Auto_RefMut_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerSavedHardwareState( + dynamic raw, + ); @protected ViableBottle - dco_decode_Auto_RefMut_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerViableBottle( - dynamic raw); + dco_decode_Auto_RefMut_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerViableBottle( + dynamic raw, + ); @protected ApsConnection - dco_decode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerAPSConnection( - dynamic raw); + dco_decode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerAPSConnection( + dynamic raw, + ); @protected ArcAnisetteClientDefaultAnisetteProvider - dco_decode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcAnisetteClientDefaultAnisetteProvider( - dynamic raw); + dco_decode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcAnisetteClientDefaultAnisetteProvider( + dynamic raw, + ); @protected ArcCloudKitClientDefaultAnisetteProvider - dco_decode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcCloudKitClientDefaultAnisetteProvider( - dynamic raw); + dco_decode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcCloudKitClientDefaultAnisetteProvider( + dynamic raw, + ); @protected ArcCloudMessagesClientDefaultAnisetteProvider - dco_decode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcCloudMessagesClientDefaultAnisetteProvider( - dynamic raw); + dco_decode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcCloudMessagesClientDefaultAnisetteProvider( + dynamic raw, + ); @protected ArcFtClient - dco_decode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcFTClient( - dynamic raw); + dco_decode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcFTClient( + dynamic raw, + ); @protected ArcFindMyClientDefaultAnisetteProvider - dco_decode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcFindMyClientDefaultAnisetteProvider( - dynamic raw); + dco_decode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcFindMyClientDefaultAnisetteProvider( + dynamic raw, + ); @protected ArcImClient - dco_decode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcIMClient( - dynamic raw); + dco_decode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcIMClient( + dynamic raw, + ); @protected ArcIdmsAuthListener - dco_decode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcIdmsAuthListener( - dynamic raw); + dco_decode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcIdmsAuthListener( + dynamic raw, + ); @protected ArcKeychainClientDefaultAnisetteProvider - dco_decode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcKeychainClientDefaultAnisetteProvider( - dynamic raw); + dco_decode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcKeychainClientDefaultAnisetteProvider( + dynamic raw, + ); @protected ArcMutexAppleAccountDefaultAnisetteProvider - dco_decode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcMutexAppleAccountDefaultAnisetteProvider( - dynamic raw); + dco_decode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcMutexAppleAccountDefaultAnisetteProvider( + dynamic raw, + ); @protected ArcMutexOptionCircleClientSessionDefaultAnisetteProvider - dco_decode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcMutexOptionCircleClientSessionDefaultAnisetteProvider( - dynamic raw); + dco_decode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcMutexOptionCircleClientSessionDefaultAnisetteProvider( + dynamic raw, + ); @protected ArcMutexVecActiveCircleSession - dco_decode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcMutexVecActiveCircleSession( - dynamic raw); + dco_decode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcMutexVecActiveCircleSession( + dynamic raw, + ); @protected ArcPasswordManagerDefaultAnisetteProvider - dco_decode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcPasswordManagerDefaultAnisetteProvider( - dynamic raw); + dco_decode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcPasswordManagerDefaultAnisetteProvider( + dynamic raw, + ); @protected ArcProfilesClientDefaultAnisetteProvider - dco_decode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcProfilesClientDefaultAnisetteProvider( - dynamic raw); + dco_decode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcProfilesClientDefaultAnisetteProvider( + dynamic raw, + ); @protected ArcSenderPushMessage - dco_decode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcSenderPushMessage( - dynamic raw); + dco_decode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcSenderPushMessage( + dynamic raw, + ); @protected ArcSharedPushState - dco_decode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcSharedPushState( - dynamic raw); + dco_decode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcSharedPushState( + dynamic raw, + ); @protected ArcStatusKitClientDefaultAnisetteProvider - dco_decode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcStatusKitClientDefaultAnisetteProvider( - dynamic raw); + dco_decode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcStatusKitClientDefaultAnisetteProvider( + dynamic raw, + ); @protected ArcTokenProviderDefaultAnisetteProvider - dco_decode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcTokenProviderDefaultAnisetteProvider( - dynamic raw); + dco_decode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcTokenProviderDefaultAnisetteProvider( + dynamic raw, + ); + + @protected + CloudSyncPreparedMessageCreateHandle + dco_decode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerCloudSyncPreparedMessageCreateHandle( + dynamic raw, + ); @protected Date - dco_decode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerDate( - dynamic raw); + dco_decode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerDate( + dynamic raw, + ); @protected EscrowData - dco_decode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerEscrowData( - dynamic raw); + dco_decode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerEscrowData( + dynamic raw, + ); @protected GZipWrapperAttachmentMeta - dco_decode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerGZipWrapperAttachmentMeta( - dynamic raw); + dco_decode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerGZipWrapperAttachmentMeta( + dynamic raw, + ); @protected GZipWrapperChatProto - dco_decode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerGZipWrapperChatProto( - dynamic raw); + dco_decode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerGZipWrapperChatProto( + dynamic raw, + ); @protected GZipWrapperMessageProto - dco_decode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerGZipWrapperMessageProto( - dynamic raw); + dco_decode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerGZipWrapperMessageProto( + dynamic raw, + ); @protected GZipWrapperMessageProto2 - dco_decode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerGZipWrapperMessageProto2( - dynamic raw); + dco_decode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerGZipWrapperMessageProto2( + dynamic raw, + ); @protected GZipWrapperMessageProto3 - dco_decode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerGZipWrapperMessageProto3( - dynamic raw); + dco_decode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerGZipWrapperMessageProto3( + dynamic raw, + ); @protected GZipWrapperMessageProto4 - dco_decode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerGZipWrapperMessageProto4( - dynamic raw); + dco_decode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerGZipWrapperMessageProto4( + dynamic raw, + ); @protected IdsngmIdentity - dco_decode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerIDSNGMIdentity( - dynamic raw); + dco_decode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerIDSNGMIdentity( + dynamic raw, + ); @protected IdsUser - dco_decode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerIDSUser( - dynamic raw); + dco_decode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerIDSUser( + dynamic raw, + ); @protected JoinedOsConfig - dco_decode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerJoinedOSConfig( - dynamic raw); + dco_decode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerJoinedOSConfig( + dynamic raw, + ); @protected LocationReport - dco_decode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerLocationReport( - dynamic raw); + dco_decode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerLocationReport( + dynamic raw, + ); @protected MessageFlags - dco_decode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerMessageFlags( - dynamic raw); + dco_decode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerMessageFlags( + dynamic raw, + ); @protected SavedHardwareState - dco_decode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerSavedHardwareState( - dynamic raw); + dco_decode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerSavedHardwareState( + dynamic raw, + ); @protected Sender - dco_decode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerSender( - dynamic raw); + dco_decode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerSender( + dynamic raw, + ); @protected StCollapsedValue - dco_decode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerStCollapsedValue( - dynamic raw); + dco_decode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerStCollapsedValue( + dynamic raw, + ); @protected SyncManagerDefaultAnisetteProviderMyFilePackager - dco_decode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerSyncManagerDefaultAnisetteProviderMyFilePackager( - dynamic raw); + dco_decode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerSyncManagerDefaultAnisetteProviderMyFilePackager( + dynamic raw, + ); @protected VerifyBody - dco_decode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerVerifyBody( - dynamic raw); + dco_decode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerVerifyBody( + dynamic raw, + ); @protected ViableBottle - dco_decode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerViableBottle( - dynamic raw); + dco_decode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerViableBottle( + dynamic raw, + ); @protected int dco_decode_CastedPrimitive_i_64(dynamic raw); @@ -707,21 +827,22 @@ abstract class RustLibApiImplPlatform extends BaseApiImpl { @protected FutureOr Function(String) - dco_decode_DartFn_Inputs_String_Output_String_AnyhowException( - dynamic raw); + dco_decode_DartFn_Inputs_String_Output_String_AnyhowException(dynamic raw); @protected Object dco_decode_DartOpaque(dynamic raw); @protected Map - dco_decode_Map_String_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerAsset( - dynamic raw); + dco_decode_Map_String_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerAsset( + dynamic raw, + ); @protected Map - dco_decode_Map_String_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerStCollapsedValue( - dynamic raw); + dco_decode_Map_String_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerStCollapsedValue( + dynamic raw, + ); @protected Map dco_decode_Map_String_CastedPrimitive_u_64(dynamic raw); @@ -734,7 +855,8 @@ abstract class RustLibApiImplPlatform extends BaseApiImpl { @protected Map dco_decode_Map_String_cloud_attachment( - dynamic raw); + dynamic raw, + ); @protected Map dco_decode_Map_String_cloud_chat(dynamic raw); @@ -750,325 +872,386 @@ abstract class RustLibApiImplPlatform extends BaseApiImpl { @protected Map> dco_decode_Map_String_list_message_edit( - dynamic raw); + dynamic raw, + ); @protected Map dco_decode_Map_String_list_prim_u_8_strict( - dynamic raw); + dynamic raw, + ); @protected Map dco_decode_Map_String_message_edit_range( - dynamic raw); + dynamic raw, + ); @protected Map - dco_decode_Map_String_opt_box_autoadd_cloud_attachment(dynamic raw); + dco_decode_Map_String_opt_box_autoadd_cloud_attachment(dynamic raw); @protected Map dco_decode_Map_String_opt_box_autoadd_cloud_chat( - dynamic raw); + dynamic raw, + ); @protected Map - dco_decode_Map_String_opt_box_autoadd_cloud_message(dynamic raw); + dco_decode_Map_String_opt_box_autoadd_cloud_message(dynamic raw); @protected Map - dco_decode_Map_String_password_manager_meta_data_ctx(dynamic raw); + dco_decode_Map_String_password_manager_meta_data_ctx(dynamic raw); @protected Map - dco_decode_Map_String_record_opt_string_passkey(dynamic raw); + dco_decode_Map_String_record_opt_string_passkey(dynamic raw); @protected Map - dco_decode_Map_String_record_opt_string_password_manager_meta( - dynamic raw); + dco_decode_Map_String_record_opt_string_password_manager_meta(dynamic raw); @protected Map - dco_decode_Map_String_record_opt_string_password_raw_entry(dynamic raw); + dco_decode_Map_String_record_opt_string_password_raw_entry(dynamic raw); @protected Map - dco_decode_Map_String_record_opt_string_wifi_password(dynamic raw); + dco_decode_Map_String_record_opt_string_wifi_password(dynamic raw); @protected Map - dco_decode_Map_String_share_invite_content_data(dynamic raw); + dco_decode_Map_String_share_invite_content_data(dynamic raw); @protected Map - dco_decode_Map_String_status_kit_personal_config(dynamic raw); + dco_decode_Map_String_status_kit_personal_config(dynamic raw); @protected Map dco_decode_Map_String_sync_status(dynamic raw); @protected ApsConnection - dco_decode_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerAPSConnection( - dynamic raw); + dco_decode_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerAPSConnection( + dynamic raw, + ); @protected ApsState - dco_decode_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerAPSState( - dynamic raw); + dco_decode_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerAPSState( + dynamic raw, + ); @protected ApsWatcher - dco_decode_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerAPSWatcher( - dynamic raw); + dco_decode_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerAPSWatcher( + dynamic raw, + ); @protected ArcAnisetteClientDefaultAnisetteProvider - dco_decode_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcAnisetteClientDefaultAnisetteProvider( - dynamic raw); + dco_decode_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcAnisetteClientDefaultAnisetteProvider( + dynamic raw, + ); @protected ArcCloudKitClientDefaultAnisetteProvider - dco_decode_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcCloudKitClientDefaultAnisetteProvider( - dynamic raw); + dco_decode_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcCloudKitClientDefaultAnisetteProvider( + dynamic raw, + ); @protected ArcCloudMessagesClientDefaultAnisetteProvider - dco_decode_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcCloudMessagesClientDefaultAnisetteProvider( - dynamic raw); + dco_decode_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcCloudMessagesClientDefaultAnisetteProvider( + dynamic raw, + ); @protected ArcFtClient - dco_decode_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcFTClient( - dynamic raw); + dco_decode_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcFTClient( + dynamic raw, + ); @protected ArcFindMyClientDefaultAnisetteProvider - dco_decode_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcFindMyClientDefaultAnisetteProvider( - dynamic raw); + dco_decode_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcFindMyClientDefaultAnisetteProvider( + dynamic raw, + ); @protected ArcImClient - dco_decode_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcIMClient( - dynamic raw); + dco_decode_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcIMClient( + dynamic raw, + ); @protected ArcIdmsAuthListener - dco_decode_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcIdmsAuthListener( - dynamic raw); + dco_decode_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcIdmsAuthListener( + dynamic raw, + ); @protected ArcKeychainClientDefaultAnisetteProvider - dco_decode_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcKeychainClientDefaultAnisetteProvider( - dynamic raw); + dco_decode_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcKeychainClientDefaultAnisetteProvider( + dynamic raw, + ); @protected ArcMutexAppleAccountDefaultAnisetteProvider - dco_decode_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcMutexAppleAccountDefaultAnisetteProvider( - dynamic raw); + dco_decode_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcMutexAppleAccountDefaultAnisetteProvider( + dynamic raw, + ); @protected ArcMutexOptionCircleClientSessionDefaultAnisetteProvider - dco_decode_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcMutexOptionCircleClientSessionDefaultAnisetteProvider( - dynamic raw); + dco_decode_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcMutexOptionCircleClientSessionDefaultAnisetteProvider( + dynamic raw, + ); @protected ArcMutexVecActiveCircleSession - dco_decode_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcMutexVecActiveCircleSession( - dynamic raw); + dco_decode_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcMutexVecActiveCircleSession( + dynamic raw, + ); @protected ArcPasswordManagerDefaultAnisetteProvider - dco_decode_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcPasswordManagerDefaultAnisetteProvider( - dynamic raw); + dco_decode_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcPasswordManagerDefaultAnisetteProvider( + dynamic raw, + ); @protected ArcProfilesClientDefaultAnisetteProvider - dco_decode_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcProfilesClientDefaultAnisetteProvider( - dynamic raw); + dco_decode_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcProfilesClientDefaultAnisetteProvider( + dynamic raw, + ); @protected ArcSenderPushMessage - dco_decode_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcSenderPushMessage( - dynamic raw); + dco_decode_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcSenderPushMessage( + dynamic raw, + ); @protected ArcSharedPushState - dco_decode_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcSharedPushState( - dynamic raw); + dco_decode_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcSharedPushState( + dynamic raw, + ); @protected ArcStatusKitClientDefaultAnisetteProvider - dco_decode_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcStatusKitClientDefaultAnisetteProvider( - dynamic raw); + dco_decode_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcStatusKitClientDefaultAnisetteProvider( + dynamic raw, + ); @protected ArcTokenProviderDefaultAnisetteProvider - dco_decode_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcTokenProviderDefaultAnisetteProvider( - dynamic raw); + dco_decode_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcTokenProviderDefaultAnisetteProvider( + dynamic raw, + ); @protected Asset - dco_decode_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerAsset( - dynamic raw); + dco_decode_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerAsset( + dynamic raw, + ); @protected ChannelInterestToken - dco_decode_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerChannelInterestToken( - dynamic raw); + dco_decode_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerChannelInterestToken( + dynamic raw, + ); @protected CircleClientSessionDefaultAnisetteProvider - dco_decode_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerCircleClientSessionDefaultAnisetteProvider( - dynamic raw); + dco_decode_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerCircleClientSessionDefaultAnisetteProvider( + dynamic raw, + ); + + @protected + CloudSyncPreparedMessageCreateHandle + dco_decode_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerCloudSyncPreparedMessageCreateHandle( + dynamic raw, + ); @protected ConversationLink - dco_decode_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerConversationLink( - dynamic raw); + dco_decode_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerConversationLink( + dynamic raw, + ); @protected ConversationParticipant - dco_decode_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerConversationParticipant( - dynamic raw); + dco_decode_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerConversationParticipant( + dynamic raw, + ); @protected Date - dco_decode_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerDate( - dynamic raw); + dco_decode_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerDate( + dynamic raw, + ); @protected EscrowData - dco_decode_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerEscrowData( - dynamic raw); + dco_decode_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerEscrowData( + dynamic raw, + ); @protected FindMyFriendsClientDefaultAnisetteProvider - dco_decode_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerFindMyFriendsClientDefaultAnisetteProvider( - dynamic raw); + dco_decode_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerFindMyFriendsClientDefaultAnisetteProvider( + dynamic raw, + ); @protected FindMyPhoneClientDefaultAnisetteProvider - dco_decode_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerFindMyPhoneClientDefaultAnisetteProvider( - dynamic raw); + dco_decode_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerFindMyPhoneClientDefaultAnisetteProvider( + dynamic raw, + ); @protected GZipWrapperAttachmentMeta - dco_decode_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerGZipWrapperAttachmentMeta( - dynamic raw); + dco_decode_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerGZipWrapperAttachmentMeta( + dynamic raw, + ); @protected GZipWrapperChatProto - dco_decode_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerGZipWrapperChatProto( - dynamic raw); + dco_decode_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerGZipWrapperChatProto( + dynamic raw, + ); @protected GZipWrapperMessageProto - dco_decode_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerGZipWrapperMessageProto( - dynamic raw); + dco_decode_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerGZipWrapperMessageProto( + dynamic raw, + ); @protected GZipWrapperMessageProto2 - dco_decode_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerGZipWrapperMessageProto2( - dynamic raw); + dco_decode_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerGZipWrapperMessageProto2( + dynamic raw, + ); @protected GZipWrapperMessageProto3 - dco_decode_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerGZipWrapperMessageProto3( - dynamic raw); + dco_decode_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerGZipWrapperMessageProto3( + dynamic raw, + ); @protected GZipWrapperMessageProto4 - dco_decode_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerGZipWrapperMessageProto4( - dynamic raw); + dco_decode_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerGZipWrapperMessageProto4( + dynamic raw, + ); @protected IdsngmIdentity - dco_decode_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerIDSNGMIdentity( - dynamic raw); + dco_decode_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerIDSNGMIdentity( + dynamic raw, + ); @protected IdsUser - dco_decode_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerIDSUser( - dynamic raw); + dco_decode_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerIDSUser( + dynamic raw, + ); @protected JoinedOsConfig - dco_decode_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerJoinedOSConfig( - dynamic raw); + dco_decode_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerJoinedOSConfig( + dynamic raw, + ); @protected LocationReport - dco_decode_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerLocationReport( - dynamic raw); + dco_decode_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerLocationReport( + dynamic raw, + ); @protected MessageFlags - dco_decode_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerMessageFlags( - dynamic raw); + dco_decode_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerMessageFlags( + dynamic raw, + ); @protected NsArrayLpIconMetadata - dco_decode_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerNSArrayLPIconMetadata( - dynamic raw); + dco_decode_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerNSArrayLPIconMetadata( + dynamic raw, + ); @protected NsArrayLpImageMetadata - dco_decode_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerNSArrayLPImageMetadata( - dynamic raw); + dco_decode_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerNSArrayLPImageMetadata( + dynamic raw, + ); @protected PushError - dco_decode_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerPushError( - dynamic raw); + dco_decode_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerPushError( + dynamic raw, + ); @protected ReceiverApsMessage - dco_decode_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerReceiverAPSMessage( - dynamic raw); + dco_decode_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerReceiverAPSMessage( + dynamic raw, + ); @protected SavedHardwareState - dco_decode_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerSavedHardwareState( - dynamic raw); + dco_decode_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerSavedHardwareState( + dynamic raw, + ); @protected Sender - dco_decode_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerSender( - dynamic raw); + dco_decode_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerSender( + dynamic raw, + ); @protected StCollapsedValue - dco_decode_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerStCollapsedValue( - dynamic raw); + dco_decode_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerStCollapsedValue( + dynamic raw, + ); @protected SyncManagerDefaultAnisetteProviderMyFilePackager - dco_decode_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerSyncManagerDefaultAnisetteProviderMyFilePackager( - dynamic raw); + dco_decode_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerSyncManagerDefaultAnisetteProviderMyFilePackager( + dynamic raw, + ); @protected SystemTime - dco_decode_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerSystemTime( - dynamic raw); + dco_decode_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerSystemTime( + dynamic raw, + ); @protected VerifyBody - dco_decode_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerVerifyBody( - dynamic raw); + dco_decode_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerVerifyBody( + dynamic raw, + ); @protected ViableBottle - dco_decode_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerViableBottle( - dynamic raw); + dco_decode_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerViableBottle( + dynamic raw, + ); @protected Set dco_decode_Set_ft_member(dynamic raw); @protected RustStreamSink - dco_decode_StreamSink_mmcs_transfer_progress_Sse(dynamic raw); + dco_decode_StreamSink_mmcs_transfer_progress_Sse(dynamic raw); @protected RustStreamSink dco_decode_StreamSink_transfer_progress_Sse( - dynamic raw); + dynamic raw, + ); @protected String dco_decode_String(dynamic raw); @@ -1082,6 +1265,9 @@ abstract class RustLibApiImplPlatform extends BaseApiImpl { @protected ApsAlert dco_decode_aps_alert(dynamic raw); + @protected + ApsConnectionStatus dco_decode_aps_connection_status(dynamic raw); + @protected ApsData dco_decode_aps_data(dynamic raw); @@ -1114,128 +1300,159 @@ abstract class RustLibApiImplPlatform extends BaseApiImpl { @protected ApsState - dco_decode_box_autoadd_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerAPSState( - dynamic raw); + dco_decode_box_autoadd_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerAPSState( + dynamic raw, + ); @protected ArcCloudKitClientDefaultAnisetteProvider - dco_decode_box_autoadd_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcCloudKitClientDefaultAnisetteProvider( - dynamic raw); + dco_decode_box_autoadd_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcCloudKitClientDefaultAnisetteProvider( + dynamic raw, + ); @protected ArcCloudMessagesClientDefaultAnisetteProvider - dco_decode_box_autoadd_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcCloudMessagesClientDefaultAnisetteProvider( - dynamic raw); + dco_decode_box_autoadd_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcCloudMessagesClientDefaultAnisetteProvider( + dynamic raw, + ); @protected ArcFindMyClientDefaultAnisetteProvider - dco_decode_box_autoadd_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcFindMyClientDefaultAnisetteProvider( - dynamic raw); + dco_decode_box_autoadd_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcFindMyClientDefaultAnisetteProvider( + dynamic raw, + ); @protected ArcKeychainClientDefaultAnisetteProvider - dco_decode_box_autoadd_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcKeychainClientDefaultAnisetteProvider( - dynamic raw); + dco_decode_box_autoadd_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcKeychainClientDefaultAnisetteProvider( + dynamic raw, + ); @protected ArcMutexAppleAccountDefaultAnisetteProvider - dco_decode_box_autoadd_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcMutexAppleAccountDefaultAnisetteProvider( - dynamic raw); + dco_decode_box_autoadd_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcMutexAppleAccountDefaultAnisetteProvider( + dynamic raw, + ); @protected ArcPasswordManagerDefaultAnisetteProvider - dco_decode_box_autoadd_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcPasswordManagerDefaultAnisetteProvider( - dynamic raw); + dco_decode_box_autoadd_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcPasswordManagerDefaultAnisetteProvider( + dynamic raw, + ); @protected Asset - dco_decode_box_autoadd_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerAsset( - dynamic raw); + dco_decode_box_autoadd_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerAsset( + dynamic raw, + ); @protected ChannelInterestToken - dco_decode_box_autoadd_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerChannelInterestToken( - dynamic raw); + dco_decode_box_autoadd_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerChannelInterestToken( + dynamic raw, + ); @protected CircleClientSessionDefaultAnisetteProvider - dco_decode_box_autoadd_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerCircleClientSessionDefaultAnisetteProvider( - dynamic raw); + dco_decode_box_autoadd_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerCircleClientSessionDefaultAnisetteProvider( + dynamic raw, + ); + + @protected + CloudSyncPreparedMessageCreateHandle + dco_decode_box_autoadd_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerCloudSyncPreparedMessageCreateHandle( + dynamic raw, + ); @protected ConversationLink - dco_decode_box_autoadd_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerConversationLink( - dynamic raw); + dco_decode_box_autoadd_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerConversationLink( + dynamic raw, + ); @protected ConversationParticipant - dco_decode_box_autoadd_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerConversationParticipant( - dynamic raw); + dco_decode_box_autoadd_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerConversationParticipant( + dynamic raw, + ); @protected Date - dco_decode_box_autoadd_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerDate( - dynamic raw); + dco_decode_box_autoadd_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerDate( + dynamic raw, + ); @protected GZipWrapperChatProto - dco_decode_box_autoadd_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerGZipWrapperChatProto( - dynamic raw); + dco_decode_box_autoadd_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerGZipWrapperChatProto( + dynamic raw, + ); @protected GZipWrapperMessageProto2 - dco_decode_box_autoadd_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerGZipWrapperMessageProto2( - dynamic raw); + dco_decode_box_autoadd_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerGZipWrapperMessageProto2( + dynamic raw, + ); @protected GZipWrapperMessageProto3 - dco_decode_box_autoadd_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerGZipWrapperMessageProto3( - dynamic raw); + dco_decode_box_autoadd_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerGZipWrapperMessageProto3( + dynamic raw, + ); @protected GZipWrapperMessageProto4 - dco_decode_box_autoadd_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerGZipWrapperMessageProto4( - dynamic raw); + dco_decode_box_autoadd_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerGZipWrapperMessageProto4( + dynamic raw, + ); @protected IdsUser - dco_decode_box_autoadd_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerIDSUser( - dynamic raw); + dco_decode_box_autoadd_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerIDSUser( + dynamic raw, + ); @protected LocationReport - dco_decode_box_autoadd_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerLocationReport( - dynamic raw); + dco_decode_box_autoadd_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerLocationReport( + dynamic raw, + ); @protected NsArrayLpIconMetadata - dco_decode_box_autoadd_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerNSArrayLPIconMetadata( - dynamic raw); + dco_decode_box_autoadd_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerNSArrayLPIconMetadata( + dynamic raw, + ); @protected NsArrayLpImageMetadata - dco_decode_box_autoadd_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerNSArrayLPImageMetadata( - dynamic raw); + dco_decode_box_autoadd_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerNSArrayLPImageMetadata( + dynamic raw, + ); @protected PushError - dco_decode_box_autoadd_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerPushError( - dynamic raw); + dco_decode_box_autoadd_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerPushError( + dynamic raw, + ); @protected SavedHardwareState - dco_decode_box_autoadd_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerSavedHardwareState( - dynamic raw); + dco_decode_box_autoadd_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerSavedHardwareState( + dynamic raw, + ); @protected SyncManagerDefaultAnisetteProviderMyFilePackager - dco_decode_box_autoadd_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerSyncManagerDefaultAnisetteProviderMyFilePackager( - dynamic raw); + dco_decode_box_autoadd_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerSyncManagerDefaultAnisetteProviderMyFilePackager( + dynamic raw, + ); @protected SystemTime - dco_decode_box_autoadd_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerSystemTime( - dynamic raw); + dco_decode_box_autoadd_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerSystemTime( + dynamic raw, + ); @protected Address dco_decode_box_autoadd_address(dynamic raw); @@ -1269,7 +1486,8 @@ abstract class RustLibApiImplPlatform extends BaseApiImpl { @protected ChangeParticipantMessage dco_decode_box_autoadd_change_participant_message( - dynamic raw); + dynamic raw, + ); @protected ChatProto dco_decode_box_autoadd_chat_proto(dynamic raw); @@ -1286,12 +1504,121 @@ abstract class RustLibApiImplPlatform extends BaseApiImpl { @protected CloudProp dco_decode_box_autoadd_cloud_prop(dynamic raw); + @protected + CloudSyncOutboundFailureClass + dco_decode_box_autoadd_cloud_sync_outbound_failure_class(dynamic raw); + + @protected + CloudSyncOutboundReconcileDisposition + dco_decode_box_autoadd_cloud_sync_outbound_reconcile_disposition(dynamic raw); + + @protected + CloudSyncOutboundSafeCode + dco_decode_box_autoadd_cloud_sync_outbound_safe_code(dynamic raw); + + @protected + CloudSyncPreparedMessageCreateInput + dco_decode_box_autoadd_cloud_sync_prepared_message_create_input(dynamic raw); + + @protected + CloudSyncProtectedFailure dco_decode_box_autoadd_cloud_sync_protected_failure( + dynamic raw, + ); + + @protected + CloudSyncProtectedGarbageCollection + dco_decode_box_autoadd_cloud_sync_protected_garbage_collection(dynamic raw); + + @protected + CloudSyncProtectedOutboundStage + dco_decode_box_autoadd_cloud_sync_protected_outbound_stage(dynamic raw); + + @protected + CloudSyncProtectedPage dco_decode_box_autoadd_cloud_sync_protected_page( + dynamic raw, + ); + + @protected + CloudSyncProtectedPreflightCode + dco_decode_box_autoadd_cloud_sync_protected_preflight_code(dynamic raw); + + @protected + CloudSyncProtectedRecovery + dco_decode_box_autoadd_cloud_sync_protected_recovery(dynamic raw); + + @protected + CloudSyncRawFailure dco_decode_box_autoadd_cloud_sync_raw_failure( + dynamic raw, + ); + + @protected + CloudSyncRawPage dco_decode_box_autoadd_cloud_sync_raw_page(dynamic raw); + + @protected + CloudSyncRawSystemFields dco_decode_box_autoadd_cloud_sync_raw_system_fields( + dynamic raw, + ); + + @protected + CloudSyncTransientAttachmentPayload + dco_decode_box_autoadd_cloud_sync_transient_attachment_payload(dynamic raw); + + @protected + CloudSyncTransientChatPayload + dco_decode_box_autoadd_cloud_sync_transient_chat_payload(dynamic raw); + + @protected + CloudSyncTransientDeferredReason + dco_decode_box_autoadd_cloud_sync_transient_deferred_reason(dynamic raw); + + @protected + CloudSyncTransientEntityKind + dco_decode_box_autoadd_cloud_sync_transient_entity_kind(dynamic raw); + + @protected + CloudSyncTransientFailureCode + dco_decode_box_autoadd_cloud_sync_transient_failure_code(dynamic raw); + + @protected + CloudSyncTransientGroupPhotoPayload + dco_decode_box_autoadd_cloud_sync_transient_group_photo_payload(dynamic raw); + + @protected + CloudSyncTransientMessagePayload + dco_decode_box_autoadd_cloud_sync_transient_message_payload(dynamic raw); + + @protected + CloudSyncTransientMutationKind + dco_decode_box_autoadd_cloud_sync_transient_mutation_kind(dynamic raw); + + @protected + CloudSyncTransientPayload dco_decode_box_autoadd_cloud_sync_transient_payload( + dynamic raw, + ); + + @protected + CloudSyncTransientQuarantineReason + dco_decode_box_autoadd_cloud_sync_transient_quarantine_reason(dynamic raw); + + @protected + CloudSyncTransientReactionKind + dco_decode_box_autoadd_cloud_sync_transient_reaction_kind(dynamic raw); + + @protected + CloudSyncTransientSnapshot + dco_decode_box_autoadd_cloud_sync_transient_snapshot(dynamic raw); + + @protected + CloudSyncTransientTombstone + dco_decode_box_autoadd_cloud_sync_transient_tombstone(dynamic raw); + @protected ConversationData dco_decode_box_autoadd_conversation_data(dynamic raw); @protected DartBeaconShareInfo dco_decode_box_autoadd_dart_beacon_share_info( - dynamic raw); + dynamic raw, + ); @protected EditMessage dco_decode_box_autoadd_edit_message(dynamic raw); @@ -1322,11 +1649,13 @@ abstract class RustLibApiImplPlatform extends BaseApiImpl { @protected IMessageNicknameRecord dco_decode_box_autoadd_i_message_nickname_record( - dynamic raw); + dynamic raw, + ); @protected IMessagePosterRecord dco_decode_box_autoadd_i_message_poster_record( - dynamic raw); + dynamic raw, + ); @protected IconChangeMessage dco_decode_box_autoadd_icon_change_message(dynamic raw); @@ -1339,7 +1668,8 @@ abstract class RustLibApiImplPlatform extends BaseApiImpl { @protected IdmsRequestedSignIn dco_decode_box_autoadd_idms_requested_sign_in( - dynamic raw); + dynamic raw, + ); @protected LetMeInRequest dco_decode_box_autoadd_let_me_in_request(dynamic raw); @@ -1361,7 +1691,8 @@ abstract class RustLibApiImplPlatform extends BaseApiImpl { @protected LPSpecializationMetadata dco_decode_box_autoadd_lp_specialization_metadata( - dynamic raw); + dynamic raw, + ); @protected MemojiData dco_decode_box_autoadd_memoji_data(dynamic raw); @@ -1401,7 +1732,8 @@ abstract class RustLibApiImplPlatform extends BaseApiImpl { @protected MoveToRecycleBinMessage dco_decode_box_autoadd_move_to_recycle_bin_message( - dynamic raw); + dynamic raw, + ); @protected NormalMessage dco_decode_box_autoadd_normal_message(dynamic raw); @@ -1435,12 +1767,14 @@ abstract class RustLibApiImplPlatform extends BaseApiImpl { @protected PasswordManagerMetaData dco_decode_box_autoadd_password_manager_meta_data( - dynamic raw); + dynamic raw, + ); @protected PasswordManagerMetaDataFormerlyShared - dco_decode_box_autoadd_password_manager_meta_data_formerly_shared( - dynamic raw); + dco_decode_box_autoadd_password_manager_meta_data_formerly_shared( + dynamic raw, + ); @protected PasswordManagerTotp dco_decode_box_autoadd_password_manager_totp(dynamic raw); @@ -1450,14 +1784,15 @@ abstract class RustLibApiImplPlatform extends BaseApiImpl { @protected PermanentDeleteMessage dco_decode_box_autoadd_permanent_delete_message( - dynamic raw); + dynamic raw, + ); @protected PosterColor dco_decode_box_autoadd_poster_color(dynamic raw); @protected PRPosterContentMaterialStyle - dco_decode_box_autoadd_pr_poster_content_material_style(dynamic raw); + dco_decode_box_autoadd_pr_poster_content_material_style(dynamic raw); @protected PushMessage dco_decode_box_autoadd_push_message(dynamic raw); @@ -1469,11 +1804,10 @@ abstract class RustLibApiImplPlatform extends BaseApiImpl { Reaction dco_decode_box_autoadd_reaction(dynamic raw); @protected - ( - SharedPushState, - ApsWatcher - ) dco_decode_box_autoadd_record_shared_push_state_auto_owned_rust_opaque_flutter_rust_bridgefor_generated_rust_auto_opaque_inner_aps_watcher( - dynamic raw); + (SharedPushState, ApsWatcher) + dco_decode_box_autoadd_record_shared_push_state_auto_owned_rust_opaque_flutter_rust_bridgefor_generated_rust_auto_opaque_inner_aps_watcher( + dynamic raw, + ); @protected (String, String) dco_decode_box_autoadd_record_string_string(dynamic raw); @@ -1489,14 +1823,14 @@ abstract class RustLibApiImplPlatform extends BaseApiImpl { @protected RichLinkImageAttachmentSubstitute - dco_decode_box_autoadd_rich_link_image_attachment_substitute(dynamic raw); + dco_decode_box_autoadd_rich_link_image_attachment_substitute(dynamic raw); @protected ScheduleMode dco_decode_box_autoadd_schedule_mode(dynamic raw); @protected SetTranscriptBackgroundMessage - dco_decode_box_autoadd_set_transcript_background_message(dynamic raw); + dco_decode_box_autoadd_set_transcript_background_message(dynamic raw); @protected ShareProfileMessage dco_decode_box_autoadd_share_profile_message(dynamic raw); @@ -1506,7 +1840,8 @@ abstract class RustLibApiImplPlatform extends BaseApiImpl { @protected SharedICloudServices dco_decode_box_autoadd_shared_i_cloud_services( - dynamic raw); + dynamic raw, + ); @protected SharedPoster dco_decode_box_autoadd_shared_poster(dynamic raw); @@ -1516,11 +1851,11 @@ abstract class RustLibApiImplPlatform extends BaseApiImpl { @protected SimplifiedIncomingCallPoster - dco_decode_box_autoadd_simplified_incoming_call_poster(dynamic raw); + dco_decode_box_autoadd_simplified_incoming_call_poster(dynamic raw); @protected SimplifiedTranscriptPoster - dco_decode_box_autoadd_simplified_transcript_poster(dynamic raw); + dco_decode_box_autoadd_simplified_transcript_poster(dynamic raw); @protected StatusKitMessage dco_decode_box_autoadd_status_kit_message(dynamic raw); @@ -1542,11 +1877,15 @@ abstract class RustLibApiImplPlatform extends BaseApiImpl { @protected TranscriptDynamicUserData dco_decode_box_autoadd_transcript_dynamic_user_data( - dynamic raw); + dynamic raw, + ); @protected TypingApp dco_decode_box_autoadd_typing_app(dynamic raw); + @protected + int dco_decode_box_autoadd_u_16(dynamic raw); + @protected int dco_decode_box_autoadd_u_32(dynamic raw); @@ -1561,15 +1900,17 @@ abstract class RustLibApiImplPlatform extends BaseApiImpl { @protected UpdateExtensionMessage dco_decode_box_autoadd_update_extension_message( - dynamic raw); + dynamic raw, + ); @protected UpdateProfileMessage dco_decode_box_autoadd_update_profile_message( - dynamic raw); + dynamic raw, + ); @protected UpdateProfileSharingMessage - dco_decode_box_autoadd_update_profile_sharing_message(dynamic raw); + dco_decode_box_autoadd_update_profile_sharing_message(dynamic raw); @protected WifiPassword dco_decode_box_autoadd_wifi_password(dynamic raw); @@ -1604,6 +1945,249 @@ abstract class RustLibApiImplPlatform extends BaseApiImpl { @protected CloudProp001 dco_decode_cloud_prop_001(dynamic raw); + @protected + CloudSyncNativeAuthMetadata dco_decode_cloud_sync_native_auth_metadata( + dynamic raw, + ); + + @protected + CloudSyncOutboundConsumeResult dco_decode_cloud_sync_outbound_consume_result( + dynamic raw, + ); + + @protected + CloudSyncOutboundFailureClass dco_decode_cloud_sync_outbound_failure_class( + dynamic raw, + ); + + @protected + CloudSyncOutboundReconcileDisposition + dco_decode_cloud_sync_outbound_reconcile_disposition(dynamic raw); + + @protected + CloudSyncOutboundReconcileResult + dco_decode_cloud_sync_outbound_reconcile_result(dynamic raw); + + @protected + CloudSyncOutboundSafeCode dco_decode_cloud_sync_outbound_safe_code( + dynamic raw, + ); + + @protected + CloudSyncOutboundSaveDisposition + dco_decode_cloud_sync_outbound_save_disposition(dynamic raw); + + @protected + CloudSyncOutboundSaveOutcome dco_decode_cloud_sync_outbound_save_outcome( + dynamic raw, + ); + + @protected + CloudSyncPreparedMessageCreateInput + dco_decode_cloud_sync_prepared_message_create_input(dynamic raw); + + @protected + CloudSyncPreparedMessageCreateResult + dco_decode_cloud_sync_prepared_message_create_result(dynamic raw); + + @protected + CloudSyncProtectedChange dco_decode_cloud_sync_protected_change(dynamic raw); + + @protected + CloudSyncProtectedChangeKind dco_decode_cloud_sync_protected_change_kind( + dynamic raw, + ); + + @protected + CloudSyncProtectedFailure dco_decode_cloud_sync_protected_failure( + dynamic raw, + ); + + @protected + CloudSyncProtectedFailureCategory + dco_decode_cloud_sync_protected_failure_category(dynamic raw); + + @protected + CloudSyncProtectedFetchResult dco_decode_cloud_sync_protected_fetch_result( + dynamic raw, + ); + + @protected + CloudSyncProtectedGarbageCollection + dco_decode_cloud_sync_protected_garbage_collection(dynamic raw); + + @protected + CloudSyncProtectedGarbageCollectionResult + dco_decode_cloud_sync_protected_garbage_collection_result(dynamic raw); + + @protected + CloudSyncProtectedLeaseResult dco_decode_cloud_sync_protected_lease_result( + dynamic raw, + ); + + @protected + CloudSyncProtectedOutboundStage + dco_decode_cloud_sync_protected_outbound_stage(dynamic raw); + + @protected + CloudSyncProtectedOutboundStageResult + dco_decode_cloud_sync_protected_outbound_stage_result(dynamic raw); + + @protected + CloudSyncProtectedPage dco_decode_cloud_sync_protected_page(dynamic raw); + + @protected + CloudSyncProtectedPreflightCode + dco_decode_cloud_sync_protected_preflight_code(dynamic raw); + + @protected + CloudSyncProtectedRecovery dco_decode_cloud_sync_protected_recovery( + dynamic raw, + ); + + @protected + CloudSyncProtectedRecoveryResult + dco_decode_cloud_sync_protected_recovery_result(dynamic raw); + + @protected + CloudSyncProtectedRetirementResult + dco_decode_cloud_sync_protected_retirement_result(dynamic raw); + + @protected + CloudSyncProtectedSafeCode dco_decode_cloud_sync_protected_safe_code( + dynamic raw, + ); + + @protected + CloudSyncRawChange dco_decode_cloud_sync_raw_change(dynamic raw); + + @protected + CloudSyncRawFailure dco_decode_cloud_sync_raw_failure(dynamic raw); + + @protected + CloudSyncRawFailureCategory dco_decode_cloud_sync_raw_failure_category( + dynamic raw, + ); + + @protected + CloudSyncRawFetchResult dco_decode_cloud_sync_raw_fetch_result(dynamic raw); + + @protected + CloudSyncRawPage dco_decode_cloud_sync_raw_page(dynamic raw); + + @protected + CloudSyncRawRecordKind dco_decode_cloud_sync_raw_record_kind(dynamic raw); + + @protected + CloudSyncRawSystemFields dco_decode_cloud_sync_raw_system_fields(dynamic raw); + + @protected + CloudSyncTransientAssociationKind + dco_decode_cloud_sync_transient_association_kind(dynamic raw); + + @protected + CloudSyncTransientAttachmentPayload + dco_decode_cloud_sync_transient_attachment_payload(dynamic raw); + + @protected + CloudSyncTransientAttributedBody + dco_decode_cloud_sync_transient_attributed_body(dynamic raw); + + @protected + CloudSyncTransientChatPayload dco_decode_cloud_sync_transient_chat_payload( + dynamic raw, + ); + + @protected + CloudSyncTransientChatStyle dco_decode_cloud_sync_transient_chat_style( + dynamic raw, + ); + + @protected + CloudSyncTransientDecodeResult dco_decode_cloud_sync_transient_decode_result( + dynamic raw, + ); + + @protected + CloudSyncTransientDeferredReason + dco_decode_cloud_sync_transient_deferred_reason(dynamic raw); + + @protected + CloudSyncTransientEditPart dco_decode_cloud_sync_transient_edit_part( + dynamic raw, + ); + + @protected + CloudSyncTransientEntityKind dco_decode_cloud_sync_transient_entity_kind( + dynamic raw, + ); + + @protected + CloudSyncTransientFailureCode dco_decode_cloud_sync_transient_failure_code( + dynamic raw, + ); + + @protected + CloudSyncTransientFieldState dco_decode_cloud_sync_transient_field_state( + dynamic raw, + ); + + @protected + CloudSyncTransientGroupPhotoPayload + dco_decode_cloud_sync_transient_group_photo_payload(dynamic raw); + + @protected + CloudSyncTransientKnownMessageFlags + dco_decode_cloud_sync_transient_known_message_flags(dynamic raw); + + @protected + CloudSyncTransientMessageEdit dco_decode_cloud_sync_transient_message_edit( + dynamic raw, + ); + + @protected + CloudSyncTransientMessagePayload + dco_decode_cloud_sync_transient_message_payload(dynamic raw); + + @protected + CloudSyncTransientMutationKind dco_decode_cloud_sync_transient_mutation_kind( + dynamic raw, + ); + + @protected + CloudSyncTransientPayload dco_decode_cloud_sync_transient_payload( + dynamic raw, + ); + + @protected + CloudSyncTransientQuarantineReason + dco_decode_cloud_sync_transient_quarantine_reason(dynamic raw); + + @protected + CloudSyncTransientReactionKind dco_decode_cloud_sync_transient_reaction_kind( + dynamic raw, + ); + + @protected + CloudSyncTransientService dco_decode_cloud_sync_transient_service( + dynamic raw, + ); + + @protected + CloudSyncTransientSnapshot dco_decode_cloud_sync_transient_snapshot( + dynamic raw, + ); + + @protected + CloudSyncTransientTextRun dco_decode_cloud_sync_transient_text_run( + dynamic raw, + ); + + @protected + CloudSyncTransientTombstone dco_decode_cloud_sync_transient_tombstone( + dynamic raw, + ); + @protected ConversationData dco_decode_conversation_data(dynamic raw); @@ -1705,18 +2289,21 @@ abstract class RustLibApiImplPlatform extends BaseApiImpl { @protected List - dco_decode_list_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerIDSUser( - dynamic raw); + dco_decode_list_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerIDSUser( + dynamic raw, + ); @protected List - dco_decode_list_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerStCollapsedValue( - dynamic raw); + dco_decode_list_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerStCollapsedValue( + dynamic raw, + ); @protected List - dco_decode_list_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerViableBottle( - dynamic raw); + dco_decode_list_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerViableBottle( + dynamic raw, + ); @protected List dco_decode_list_String(dynamic raw); @@ -1724,6 +2311,39 @@ abstract class RustLibApiImplPlatform extends BaseApiImpl { @protected List dco_decode_list_cloud_participant(dynamic raw); + @protected + List + dco_decode_list_cloud_sync_outbound_save_outcome(dynamic raw); + + @protected + List + dco_decode_list_cloud_sync_prepared_message_create_input(dynamic raw); + + @protected + List dco_decode_list_cloud_sync_protected_change( + dynamic raw, + ); + + @protected + List dco_decode_list_cloud_sync_raw_change(dynamic raw); + + @protected + List + dco_decode_list_cloud_sync_transient_attributed_body(dynamic raw); + + @protected + List + dco_decode_list_cloud_sync_transient_edit_part(dynamic raw); + + @protected + List + dco_decode_list_cloud_sync_transient_message_edit(dynamic raw); + + @protected + List dco_decode_list_cloud_sync_transient_text_run( + dynamic raw, + ); + @protected List dco_decode_list_dart_beacon(dynamic raw); @@ -1756,11 +2376,13 @@ abstract class RustLibApiImplPlatform extends BaseApiImpl { @protected List dco_decode_list_password_manager_alt_domain( - dynamic raw); + dynamic raw, + ); @protected List dco_decode_list_password_manager_meta_change( - dynamic raw); + dynamic raw, + ); @protected List dco_decode_list_photo_poster_layer(dynamic raw); @@ -1791,107 +2413,116 @@ abstract class RustLibApiImplPlatform extends BaseApiImpl { @protected List<(String, Asset)> - dco_decode_list_record_string_auto_owned_rust_opaque_flutter_rust_bridgefor_generated_rust_auto_opaque_inner_asset( - dynamic raw); + dco_decode_list_record_string_auto_owned_rust_opaque_flutter_rust_bridgefor_generated_rust_auto_opaque_inner_asset( + dynamic raw, + ); @protected List<(String, StCollapsedValue)> - dco_decode_list_record_string_auto_owned_rust_opaque_flutter_rust_bridgefor_generated_rust_auto_opaque_inner_st_collapsed_value( - dynamic raw); + dco_decode_list_record_string_auto_owned_rust_opaque_flutter_rust_bridgefor_generated_rust_auto_opaque_inner_st_collapsed_value( + dynamic raw, + ); @protected List<(String, bool)> dco_decode_list_record_string_bool(dynamic raw); @protected List<(String, int)> dco_decode_list_record_string_casted_primitive_u_64( - dynamic raw); + dynamic raw, + ); @protected List<(String, CloudAttachment)> - dco_decode_list_record_string_cloud_attachment(dynamic raw); + dco_decode_list_record_string_cloud_attachment(dynamic raw); @protected List<(String, CloudChat)> dco_decode_list_record_string_cloud_chat( - dynamic raw); + dynamic raw, + ); @protected List<(String, CloudMessage)> dco_decode_list_record_string_cloud_message( - dynamic raw); + dynamic raw, + ); @protected List<(String, FTParticipant)> dco_decode_list_record_string_ft_participant( - dynamic raw); + dynamic raw, + ); @protected List<(String, GroupSummary)> dco_decode_list_record_string_group_summary( - dynamic raw); + dynamic raw, + ); @protected List<(String, List)> - dco_decode_list_record_string_list_message_edit(dynamic raw); + dco_decode_list_record_string_list_message_edit(dynamic raw); @protected List<(String, Uint8List)> dco_decode_list_record_string_list_prim_u_8_strict( - dynamic raw); + dynamic raw, + ); @protected List<(String, MessageEditRange)> - dco_decode_list_record_string_message_edit_range(dynamic raw); + dco_decode_list_record_string_message_edit_range(dynamic raw); @protected List<(String, CloudAttachment?)> - dco_decode_list_record_string_opt_box_autoadd_cloud_attachment( - dynamic raw); + dco_decode_list_record_string_opt_box_autoadd_cloud_attachment(dynamic raw); @protected List<(String, CloudChat?)> - dco_decode_list_record_string_opt_box_autoadd_cloud_chat(dynamic raw); + dco_decode_list_record_string_opt_box_autoadd_cloud_chat(dynamic raw); @protected List<(String, CloudMessage?)> - dco_decode_list_record_string_opt_box_autoadd_cloud_message(dynamic raw); + dco_decode_list_record_string_opt_box_autoadd_cloud_message(dynamic raw); @protected List<(String, PasswordManagerMetaDataCtx)> - dco_decode_list_record_string_password_manager_meta_data_ctx(dynamic raw); + dco_decode_list_record_string_password_manager_meta_data_ctx(dynamic raw); @protected List<(String, (String?, Passkey))> - dco_decode_list_record_string_record_opt_string_passkey(dynamic raw); + dco_decode_list_record_string_record_opt_string_passkey(dynamic raw); @protected List<(String, (String?, PasswordManagerMeta))> - dco_decode_list_record_string_record_opt_string_password_manager_meta( - dynamic raw); + dco_decode_list_record_string_record_opt_string_password_manager_meta( + dynamic raw, + ); @protected List<(String, (String?, PasswordRawEntry))> - dco_decode_list_record_string_record_opt_string_password_raw_entry( - dynamic raw); + dco_decode_list_record_string_record_opt_string_password_raw_entry( + dynamic raw, + ); @protected List<(String, (String?, WifiPassword))> - dco_decode_list_record_string_record_opt_string_wifi_password( - dynamic raw); + dco_decode_list_record_string_record_opt_string_wifi_password(dynamic raw); @protected List<(String, ShareInviteContentData)> - dco_decode_list_record_string_share_invite_content_data(dynamic raw); + dco_decode_list_record_string_share_invite_content_data(dynamic raw); @protected List<(String, StatusKitPersonalConfig)> - dco_decode_list_record_string_status_kit_personal_config(dynamic raw); + dco_decode_list_record_string_status_kit_personal_config(dynamic raw); @protected List<(String, String)> dco_decode_list_record_string_string(dynamic raw); @protected List<(String, SyncStatus)> dco_decode_list_record_string_sync_status( - dynamic raw); + dynamic raw, + ); @protected List<(int, NSDictionaryTypedCoder)> - dco_decode_list_record_u_32_ns_dictionary_typed_coder(dynamic raw); + dco_decode_list_record_u_32_ns_dictionary_typed_coder(dynamic raw); @protected List dco_decode_list_report_message(dynamic raw); @@ -2024,128 +2655,159 @@ abstract class RustLibApiImplPlatform extends BaseApiImpl { @protected ApsState? - dco_decode_opt_box_autoadd_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerAPSState( - dynamic raw); + dco_decode_opt_box_autoadd_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerAPSState( + dynamic raw, + ); @protected ArcCloudKitClientDefaultAnisetteProvider? - dco_decode_opt_box_autoadd_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcCloudKitClientDefaultAnisetteProvider( - dynamic raw); + dco_decode_opt_box_autoadd_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcCloudKitClientDefaultAnisetteProvider( + dynamic raw, + ); @protected ArcCloudMessagesClientDefaultAnisetteProvider? - dco_decode_opt_box_autoadd_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcCloudMessagesClientDefaultAnisetteProvider( - dynamic raw); + dco_decode_opt_box_autoadd_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcCloudMessagesClientDefaultAnisetteProvider( + dynamic raw, + ); @protected ArcFindMyClientDefaultAnisetteProvider? - dco_decode_opt_box_autoadd_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcFindMyClientDefaultAnisetteProvider( - dynamic raw); + dco_decode_opt_box_autoadd_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcFindMyClientDefaultAnisetteProvider( + dynamic raw, + ); @protected ArcKeychainClientDefaultAnisetteProvider? - dco_decode_opt_box_autoadd_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcKeychainClientDefaultAnisetteProvider( - dynamic raw); + dco_decode_opt_box_autoadd_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcKeychainClientDefaultAnisetteProvider( + dynamic raw, + ); @protected ArcMutexAppleAccountDefaultAnisetteProvider? - dco_decode_opt_box_autoadd_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcMutexAppleAccountDefaultAnisetteProvider( - dynamic raw); + dco_decode_opt_box_autoadd_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcMutexAppleAccountDefaultAnisetteProvider( + dynamic raw, + ); @protected ArcPasswordManagerDefaultAnisetteProvider? - dco_decode_opt_box_autoadd_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcPasswordManagerDefaultAnisetteProvider( - dynamic raw); + dco_decode_opt_box_autoadd_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcPasswordManagerDefaultAnisetteProvider( + dynamic raw, + ); @protected Asset? - dco_decode_opt_box_autoadd_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerAsset( - dynamic raw); + dco_decode_opt_box_autoadd_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerAsset( + dynamic raw, + ); @protected ChannelInterestToken? - dco_decode_opt_box_autoadd_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerChannelInterestToken( - dynamic raw); + dco_decode_opt_box_autoadd_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerChannelInterestToken( + dynamic raw, + ); @protected CircleClientSessionDefaultAnisetteProvider? - dco_decode_opt_box_autoadd_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerCircleClientSessionDefaultAnisetteProvider( - dynamic raw); + dco_decode_opt_box_autoadd_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerCircleClientSessionDefaultAnisetteProvider( + dynamic raw, + ); + + @protected + CloudSyncPreparedMessageCreateHandle? + dco_decode_opt_box_autoadd_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerCloudSyncPreparedMessageCreateHandle( + dynamic raw, + ); @protected ConversationLink? - dco_decode_opt_box_autoadd_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerConversationLink( - dynamic raw); + dco_decode_opt_box_autoadd_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerConversationLink( + dynamic raw, + ); @protected ConversationParticipant? - dco_decode_opt_box_autoadd_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerConversationParticipant( - dynamic raw); + dco_decode_opt_box_autoadd_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerConversationParticipant( + dynamic raw, + ); @protected Date? - dco_decode_opt_box_autoadd_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerDate( - dynamic raw); + dco_decode_opt_box_autoadd_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerDate( + dynamic raw, + ); @protected GZipWrapperChatProto? - dco_decode_opt_box_autoadd_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerGZipWrapperChatProto( - dynamic raw); + dco_decode_opt_box_autoadd_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerGZipWrapperChatProto( + dynamic raw, + ); @protected GZipWrapperMessageProto2? - dco_decode_opt_box_autoadd_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerGZipWrapperMessageProto2( - dynamic raw); + dco_decode_opt_box_autoadd_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerGZipWrapperMessageProto2( + dynamic raw, + ); @protected GZipWrapperMessageProto3? - dco_decode_opt_box_autoadd_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerGZipWrapperMessageProto3( - dynamic raw); + dco_decode_opt_box_autoadd_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerGZipWrapperMessageProto3( + dynamic raw, + ); @protected GZipWrapperMessageProto4? - dco_decode_opt_box_autoadd_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerGZipWrapperMessageProto4( - dynamic raw); + dco_decode_opt_box_autoadd_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerGZipWrapperMessageProto4( + dynamic raw, + ); @protected IdsUser? - dco_decode_opt_box_autoadd_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerIDSUser( - dynamic raw); + dco_decode_opt_box_autoadd_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerIDSUser( + dynamic raw, + ); @protected LocationReport? - dco_decode_opt_box_autoadd_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerLocationReport( - dynamic raw); + dco_decode_opt_box_autoadd_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerLocationReport( + dynamic raw, + ); @protected NsArrayLpIconMetadata? - dco_decode_opt_box_autoadd_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerNSArrayLPIconMetadata( - dynamic raw); + dco_decode_opt_box_autoadd_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerNSArrayLPIconMetadata( + dynamic raw, + ); @protected NsArrayLpImageMetadata? - dco_decode_opt_box_autoadd_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerNSArrayLPImageMetadata( - dynamic raw); + dco_decode_opt_box_autoadd_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerNSArrayLPImageMetadata( + dynamic raw, + ); @protected PushError? - dco_decode_opt_box_autoadd_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerPushError( - dynamic raw); + dco_decode_opt_box_autoadd_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerPushError( + dynamic raw, + ); @protected SavedHardwareState? - dco_decode_opt_box_autoadd_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerSavedHardwareState( - dynamic raw); + dco_decode_opt_box_autoadd_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerSavedHardwareState( + dynamic raw, + ); @protected SyncManagerDefaultAnisetteProviderMyFilePackager? - dco_decode_opt_box_autoadd_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerSyncManagerDefaultAnisetteProviderMyFilePackager( - dynamic raw); + dco_decode_opt_box_autoadd_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerSyncManagerDefaultAnisetteProviderMyFilePackager( + dynamic raw, + ); @protected SystemTime? - dco_decode_opt_box_autoadd_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerSystemTime( - dynamic raw); + dco_decode_opt_box_autoadd_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerSystemTime( + dynamic raw, + ); @protected Address? dco_decode_opt_box_autoadd_address(dynamic raw); @@ -2155,7 +2817,8 @@ abstract class RustLibApiImplPlatform extends BaseApiImpl { @protected AttachmentMetaExtra? dco_decode_opt_box_autoadd_attachment_meta_extra( - dynamic raw); + dynamic raw, + ); @protected Balloon? dco_decode_opt_box_autoadd_balloon(dynamic raw); @@ -2181,12 +2844,124 @@ abstract class RustLibApiImplPlatform extends BaseApiImpl { @protected CloudProp? dco_decode_opt_box_autoadd_cloud_prop(dynamic raw); + @protected + CloudSyncOutboundFailureClass? + dco_decode_opt_box_autoadd_cloud_sync_outbound_failure_class(dynamic raw); + + @protected + CloudSyncOutboundReconcileDisposition? + dco_decode_opt_box_autoadd_cloud_sync_outbound_reconcile_disposition( + dynamic raw, + ); + + @protected + CloudSyncOutboundSafeCode? + dco_decode_opt_box_autoadd_cloud_sync_outbound_safe_code(dynamic raw); + + @protected + CloudSyncProtectedFailure? + dco_decode_opt_box_autoadd_cloud_sync_protected_failure(dynamic raw); + + @protected + CloudSyncProtectedGarbageCollection? + dco_decode_opt_box_autoadd_cloud_sync_protected_garbage_collection( + dynamic raw, + ); + + @protected + CloudSyncProtectedOutboundStage? + dco_decode_opt_box_autoadd_cloud_sync_protected_outbound_stage(dynamic raw); + + @protected + CloudSyncProtectedPage? dco_decode_opt_box_autoadd_cloud_sync_protected_page( + dynamic raw, + ); + + @protected + CloudSyncProtectedPreflightCode? + dco_decode_opt_box_autoadd_cloud_sync_protected_preflight_code(dynamic raw); + + @protected + CloudSyncProtectedRecovery? + dco_decode_opt_box_autoadd_cloud_sync_protected_recovery(dynamic raw); + + @protected + CloudSyncRawFailure? dco_decode_opt_box_autoadd_cloud_sync_raw_failure( + dynamic raw, + ); + + @protected + CloudSyncRawPage? dco_decode_opt_box_autoadd_cloud_sync_raw_page(dynamic raw); + + @protected + CloudSyncRawSystemFields? + dco_decode_opt_box_autoadd_cloud_sync_raw_system_fields(dynamic raw); + + @protected + CloudSyncTransientAttachmentPayload? + dco_decode_opt_box_autoadd_cloud_sync_transient_attachment_payload( + dynamic raw, + ); + + @protected + CloudSyncTransientChatPayload? + dco_decode_opt_box_autoadd_cloud_sync_transient_chat_payload(dynamic raw); + + @protected + CloudSyncTransientDeferredReason? + dco_decode_opt_box_autoadd_cloud_sync_transient_deferred_reason(dynamic raw); + + @protected + CloudSyncTransientEntityKind? + dco_decode_opt_box_autoadd_cloud_sync_transient_entity_kind(dynamic raw); + + @protected + CloudSyncTransientFailureCode? + dco_decode_opt_box_autoadd_cloud_sync_transient_failure_code(dynamic raw); + + @protected + CloudSyncTransientGroupPhotoPayload? + dco_decode_opt_box_autoadd_cloud_sync_transient_group_photo_payload( + dynamic raw, + ); + + @protected + CloudSyncTransientMessagePayload? + dco_decode_opt_box_autoadd_cloud_sync_transient_message_payload(dynamic raw); + + @protected + CloudSyncTransientMutationKind? + dco_decode_opt_box_autoadd_cloud_sync_transient_mutation_kind(dynamic raw); + + @protected + CloudSyncTransientPayload? + dco_decode_opt_box_autoadd_cloud_sync_transient_payload(dynamic raw); + + @protected + CloudSyncTransientQuarantineReason? + dco_decode_opt_box_autoadd_cloud_sync_transient_quarantine_reason( + dynamic raw, + ); + + @protected + CloudSyncTransientReactionKind? + dco_decode_opt_box_autoadd_cloud_sync_transient_reaction_kind(dynamic raw); + + @protected + CloudSyncTransientSnapshot? + dco_decode_opt_box_autoadd_cloud_sync_transient_snapshot(dynamic raw); + + @protected + CloudSyncTransientTombstone? + dco_decode_opt_box_autoadd_cloud_sync_transient_tombstone(dynamic raw); + @protected ConversationData? dco_decode_opt_box_autoadd_conversation_data(dynamic raw); @protected DartBeaconShareInfo? dco_decode_opt_box_autoadd_dart_beacon_share_info( - dynamic raw); + dynamic raw, + ); @protected ExtensionApp? dco_decode_opt_box_autoadd_extension_app(dynamic raw); @@ -2205,11 +2980,13 @@ abstract class RustLibApiImplPlatform extends BaseApiImpl { @protected IMessagePosterRecord? dco_decode_opt_box_autoadd_i_message_poster_record( - dynamic raw); + dynamic raw, + ); @protected IdmsRequestedSignIn? dco_decode_opt_box_autoadd_idms_requested_sign_in( - dynamic raw); + dynamic raw, + ); @protected LinkMeta? dco_decode_opt_box_autoadd_link_meta(dynamic raw); @@ -2228,11 +3005,12 @@ abstract class RustLibApiImplPlatform extends BaseApiImpl { @protected LPSpecializationMetadata? - dco_decode_opt_box_autoadd_lp_specialization_metadata(dynamic raw); + dco_decode_opt_box_autoadd_lp_specialization_metadata(dynamic raw); @protected MMCSAttachmentMeta? dco_decode_opt_box_autoadd_mmcs_attachment_meta( - dynamic raw); + dynamic raw, + ); @protected MMCSFile? dco_decode_opt_box_autoadd_mmcs_file(dynamic raw); @@ -2248,52 +3026,55 @@ abstract class RustLibApiImplPlatform extends BaseApiImpl { @protected PasswordManagerMetaDataFormerlyShared? - dco_decode_opt_box_autoadd_password_manager_meta_data_formerly_shared( - dynamic raw); + dco_decode_opt_box_autoadd_password_manager_meta_data_formerly_shared( + dynamic raw, + ); @protected PasswordManagerTotp? dco_decode_opt_box_autoadd_password_manager_totp( - dynamic raw); + dynamic raw, + ); @protected PosterColor? dco_decode_opt_box_autoadd_poster_color(dynamic raw); @protected PRPosterContentMaterialStyle? - dco_decode_opt_box_autoadd_pr_poster_content_material_style(dynamic raw); + dco_decode_opt_box_autoadd_pr_poster_content_material_style(dynamic raw); @protected PushMessage? dco_decode_opt_box_autoadd_push_message(dynamic raw); @protected - ( - SharedPushState, - ApsWatcher - )? dco_decode_opt_box_autoadd_record_shared_push_state_auto_owned_rust_opaque_flutter_rust_bridgefor_generated_rust_auto_opaque_inner_aps_watcher( - dynamic raw); + (SharedPushState, ApsWatcher)? + dco_decode_opt_box_autoadd_record_shared_push_state_auto_owned_rust_opaque_flutter_rust_bridgefor_generated_rust_auto_opaque_inner_aps_watcher( + dynamic raw, + ); @protected (String, String)? dco_decode_opt_box_autoadd_record_string_string( - dynamic raw); + dynamic raw, + ); @protected (String, BigInt)? dco_decode_opt_box_autoadd_record_string_u_64(dynamic raw); @protected RichLinkImageAttachmentSubstitute? - dco_decode_opt_box_autoadd_rich_link_image_attachment_substitute( - dynamic raw); + dco_decode_opt_box_autoadd_rich_link_image_attachment_substitute(dynamic raw); @protected ScheduleMode? dco_decode_opt_box_autoadd_schedule_mode(dynamic raw); @protected ShareProfileMessage? dco_decode_opt_box_autoadd_share_profile_message( - dynamic raw); + dynamic raw, + ); @protected SharedICloudServices? dco_decode_opt_box_autoadd_shared_i_cloud_services( - dynamic raw); + dynamic raw, + ); @protected SharedPoster? dco_decode_opt_box_autoadd_shared_poster(dynamic raw); @@ -2310,6 +3091,9 @@ abstract class RustLibApiImplPlatform extends BaseApiImpl { @protected TypingApp? dco_decode_opt_box_autoadd_typing_app(dynamic raw); + @protected + int? dco_decode_opt_box_autoadd_u_16(dynamic raw); + @protected int? dco_decode_opt_box_autoadd_u_32(dynamic raw); @@ -2318,12 +3102,14 @@ abstract class RustLibApiImplPlatform extends BaseApiImpl { @protected UpdateAccountFinish? dco_decode_opt_box_autoadd_update_account_finish( - dynamic raw); + dynamic raw, + ); @protected List? - dco_decode_opt_list_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerIDSUser( - dynamic raw); + dco_decode_opt_list_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerIDSUser( + dynamic raw, + ); @protected List? dco_decode_opt_list_String(dynamic raw); @@ -2348,18 +3134,20 @@ abstract class RustLibApiImplPlatform extends BaseApiImpl { @protected PasswordManagerMetaChange dco_decode_password_manager_meta_change( - dynamic raw); + dynamic raw, + ); @protected PasswordManagerMetaData dco_decode_password_manager_meta_data(dynamic raw); @protected PasswordManagerMetaDataCtx dco_decode_password_manager_meta_data_ctx( - dynamic raw); + dynamic raw, + ); @protected PasswordManagerMetaDataFormerlyShared - dco_decode_password_manager_meta_data_formerly_shared(dynamic raw); + dco_decode_password_manager_meta_data_formerly_shared(dynamic raw); @protected PasswordManagerTotp dco_decode_password_manager_totp(dynamic raw); @@ -2408,15 +3196,16 @@ abstract class RustLibApiImplPlatform extends BaseApiImpl { @protected PRPosterContentMaterialStyle dco_decode_pr_poster_content_material_style( - dynamic raw); + dynamic raw, + ); @protected PRPosterSystemTimeFontConfiguration - dco_decode_pr_poster_system_time_font_configuration(dynamic raw); + dco_decode_pr_poster_system_time_font_configuration(dynamic raw); @protected PRPosterTitleStyleConfiguration - dco_decode_pr_poster_title_style_configuration(dynamic raw); + dco_decode_pr_poster_title_style_configuration(dynamic raw); @protected PrivateDeviceInfo dco_decode_private_device_info(dynamic raw); @@ -2440,136 +3229,119 @@ abstract class RustLibApiImplPlatform extends BaseApiImpl { Reaction dco_decode_reaction(dynamic raw); @protected - ( - ApsConnection, - PushError? - ) dco_decode_record_auto_owned_rust_opaque_flutter_rust_bridgefor_generated_rust_auto_opaque_inner_aps_connection_opt_box_autoadd_auto_owned_rust_opaque_flutter_rust_bridgefor_generated_rust_auto_opaque_inner_push_error( - dynamic raw); + (ApsConnection, PushError?) + dco_decode_record_auto_owned_rust_opaque_flutter_rust_bridgefor_generated_rust_auto_opaque_inner_aps_connection_opt_box_autoadd_auto_owned_rust_opaque_flutter_rust_bridgefor_generated_rust_auto_opaque_inner_push_error( + dynamic raw, + ); @protected - ( - ArcMutexAppleAccountDefaultAnisetteProvider, - LoginState - ) dco_decode_record_auto_owned_rust_opaque_flutter_rust_bridgefor_generated_rust_auto_opaque_inner_arc_mutex_apple_account_default_anisette_provider_login_state( - dynamic raw); + (ArcMutexAppleAccountDefaultAnisetteProvider, LoginState) + dco_decode_record_auto_owned_rust_opaque_flutter_rust_bridgefor_generated_rust_auto_opaque_inner_arc_mutex_apple_account_default_anisette_provider_login_state( + dynamic raw, + ); @protected - ( - ArcSharedPushState, - SharedPushState - ) dco_decode_record_auto_owned_rust_opaque_flutter_rust_bridgefor_generated_rust_auto_opaque_inner_arc_shared_push_state_shared_push_state( - dynamic raw); + (ArcSharedPushState, SharedPushState) + dco_decode_record_auto_owned_rust_opaque_flutter_rust_bridgefor_generated_rust_auto_opaque_inner_arc_shared_push_state_shared_push_state( + dynamic raw, + ); @protected - ( - CircleClientSessionDefaultAnisetteProvider, - LoginState, - String? - ) dco_decode_record_auto_owned_rust_opaque_flutter_rust_bridgefor_generated_rust_auto_opaque_inner_circle_client_session_default_anisette_provider_login_state_opt_string( - dynamic raw); + (CircleClientSessionDefaultAnisetteProvider, LoginState, String?) + dco_decode_record_auto_owned_rust_opaque_flutter_rust_bridgefor_generated_rust_auto_opaque_inner_circle_client_session_default_anisette_provider_login_state_opt_string( + dynamic raw, + ); @protected - ( - Sender, - ArcSenderPushMessage, - ApsWatcher - ) dco_decode_record_auto_owned_rust_opaque_flutter_rust_bridgefor_generated_rust_auto_opaque_inner_sender_auto_owned_rust_opaque_flutter_rust_bridgefor_generated_rust_auto_opaque_inner_arc_sender_push_message_auto_owned_rust_opaque_flutter_rust_bridgefor_generated_rust_auto_opaque_inner_aps_watcher( - dynamic raw); + (Sender, ArcSenderPushMessage, ApsWatcher) + dco_decode_record_auto_owned_rust_opaque_flutter_rust_bridgefor_generated_rust_auto_opaque_inner_sender_auto_owned_rust_opaque_flutter_rust_bridgefor_generated_rust_auto_opaque_inner_arc_sender_push_message_auto_owned_rust_opaque_flutter_rust_bridgefor_generated_rust_auto_opaque_inner_aps_watcher( + dynamic raw, + ); @protected - ( - Uint8List, - Map, - int - ) dco_decode_record_list_prim_u_8_strict_map_string_opt_box_autoadd_cloud_attachment_i_32( - dynamic raw); + (Uint8List, Map, int) + dco_decode_record_list_prim_u_8_strict_map_string_opt_box_autoadd_cloud_attachment_i_32( + dynamic raw, + ); @protected - ( - Uint8List, - Map, - int - ) dco_decode_record_list_prim_u_8_strict_map_string_opt_box_autoadd_cloud_chat_i_32( - dynamic raw); + (Uint8List, Map, int) + dco_decode_record_list_prim_u_8_strict_map_string_opt_box_autoadd_cloud_chat_i_32( + dynamic raw, + ); @protected - ( - Uint8List, - Map, - int - ) dco_decode_record_list_prim_u_8_strict_map_string_opt_box_autoadd_cloud_message_i_32( - dynamic raw); + (Uint8List, Map, int) + dco_decode_record_list_prim_u_8_strict_map_string_opt_box_autoadd_cloud_message_i_32( + dynamic raw, + ); @protected (Uint8List, Uint8List?) - dco_decode_record_list_prim_u_8_strict_opt_list_prim_u_8_strict( - dynamic raw); + dco_decode_record_list_prim_u_8_strict_opt_list_prim_u_8_strict(dynamic raw); @protected (List, List) - dco_decode_record_list_shared_album_list_string(dynamic raw); + dco_decode_record_list_shared_album_list_string(dynamic raw); @protected (List, LoginState?) - dco_decode_record_list_trusted_phone_number_opt_box_autoadd_login_state( - dynamic raw); + dco_decode_record_list_trusted_phone_number_opt_box_autoadd_login_state( + dynamic raw, + ); @protected - ( - LoginState, - IdsUser? - ) dco_decode_record_login_state_opt_box_autoadd_auto_owned_rust_opaque_flutter_rust_bridgefor_generated_rust_auto_opaque_inner_ids_user( - dynamic raw); + (LoginState, IdsUser?) + dco_decode_record_login_state_opt_box_autoadd_auto_owned_rust_opaque_flutter_rust_bridgefor_generated_rust_auto_opaque_inner_ids_user( + dynamic raw, + ); @protected - ( - Map, - (String, BigInt)? - ) dco_decode_record_map_string_sync_status_opt_box_autoadd_record_string_u_64( - dynamic raw); + (Map, (String, BigInt)?) + dco_decode_record_map_string_sync_status_opt_box_autoadd_record_string_u_64( + dynamic raw, + ); @protected - ( - List?, - SupportAlert? - ) dco_decode_record_opt_list_auto_owned_rust_opaque_flutter_rust_bridgefor_generated_rust_auto_opaque_inner_ids_user_opt_box_autoadd_support_alert( - dynamic raw); + (List?, SupportAlert?) + dco_decode_record_opt_list_auto_owned_rust_opaque_flutter_rust_bridgefor_generated_rust_auto_opaque_inner_ids_user_opt_box_autoadd_support_alert( + dynamic raw, + ); @protected (String?, Passkey) dco_decode_record_opt_string_passkey(dynamic raw); @protected (String?, PasswordManagerMeta) - dco_decode_record_opt_string_password_manager_meta(dynamic raw); + dco_decode_record_opt_string_password_manager_meta(dynamic raw); @protected (String?, PasswordRawEntry) dco_decode_record_opt_string_password_raw_entry( - dynamic raw); + dynamic raw, + ); @protected (String?, WifiPassword) dco_decode_record_opt_string_wifi_password( - dynamic raw); + dynamic raw, + ); @protected - ( - SharedPushState, - ApsWatcher - ) dco_decode_record_shared_push_state_auto_owned_rust_opaque_flutter_rust_bridgefor_generated_rust_auto_opaque_inner_aps_watcher( - dynamic raw); + (SharedPushState, ApsWatcher) + dco_decode_record_shared_push_state_auto_owned_rust_opaque_flutter_rust_bridgefor_generated_rust_auto_opaque_inner_aps_watcher( + dynamic raw, + ); @protected - ( - String, - Asset - ) dco_decode_record_string_auto_owned_rust_opaque_flutter_rust_bridgefor_generated_rust_auto_opaque_inner_asset( - dynamic raw); + (String, Asset) + dco_decode_record_string_auto_owned_rust_opaque_flutter_rust_bridgefor_generated_rust_auto_opaque_inner_asset( + dynamic raw, + ); @protected - ( - String, - StCollapsedValue - ) dco_decode_record_string_auto_owned_rust_opaque_flutter_rust_bridgefor_generated_rust_auto_opaque_inner_st_collapsed_value( - dynamic raw); + (String, StCollapsedValue) + dco_decode_record_string_auto_owned_rust_opaque_flutter_rust_bridgefor_generated_rust_auto_opaque_inner_st_collapsed_value( + dynamic raw, + ); @protected (String, bool) dco_decode_record_string_bool(dynamic raw); @@ -2579,7 +3351,8 @@ abstract class RustLibApiImplPlatform extends BaseApiImpl { @protected (String, CloudAttachment) dco_decode_record_string_cloud_attachment( - dynamic raw); + dynamic raw, + ); @protected (String, CloudChat) dco_decode_record_string_cloud_chat(dynamic raw); @@ -2595,70 +3368,70 @@ abstract class RustLibApiImplPlatform extends BaseApiImpl { @protected (String, List) dco_decode_record_string_list_message_edit( - dynamic raw); + dynamic raw, + ); @protected (String, Uint8List) dco_decode_record_string_list_prim_u_8_strict( - dynamic raw); + dynamic raw, + ); @protected - ( - String, - Map, - Map - ) dco_decode_record_string_map_string_group_summary_map_string_share_invite_content_data( - dynamic raw); + (String, Map, Map) + dco_decode_record_string_map_string_group_summary_map_string_share_invite_content_data( + dynamic raw, + ); @protected (String, MessageEditRange) dco_decode_record_string_message_edit_range( - dynamic raw); + dynamic raw, + ); @protected (String, CloudAttachment?) - dco_decode_record_string_opt_box_autoadd_cloud_attachment(dynamic raw); + dco_decode_record_string_opt_box_autoadd_cloud_attachment(dynamic raw); @protected (String, CloudChat?) dco_decode_record_string_opt_box_autoadd_cloud_chat( - dynamic raw); + dynamic raw, + ); @protected (String, CloudMessage?) - dco_decode_record_string_opt_box_autoadd_cloud_message(dynamic raw); + dco_decode_record_string_opt_box_autoadd_cloud_message(dynamic raw); @protected (String, PasswordManagerMetaDataCtx) - dco_decode_record_string_password_manager_meta_data_ctx(dynamic raw); + dco_decode_record_string_password_manager_meta_data_ctx(dynamic raw); @protected (String, (String?, Passkey)) - dco_decode_record_string_record_opt_string_passkey(dynamic raw); + dco_decode_record_string_record_opt_string_passkey(dynamic raw); @protected (String, (String?, PasswordManagerMeta)) - dco_decode_record_string_record_opt_string_password_manager_meta( - dynamic raw); + dco_decode_record_string_record_opt_string_password_manager_meta(dynamic raw); @protected - ( - String, - (String?, PasswordRawEntry) - ) dco_decode_record_string_record_opt_string_password_raw_entry(dynamic raw); + (String, (String?, PasswordRawEntry)) + dco_decode_record_string_record_opt_string_password_raw_entry(dynamic raw); @protected (String, (String?, WifiPassword)) - dco_decode_record_string_record_opt_string_wifi_password(dynamic raw); + dco_decode_record_string_record_opt_string_wifi_password(dynamic raw); @protected (String, ShareInviteContentData) - dco_decode_record_string_share_invite_content_data(dynamic raw); + dco_decode_record_string_share_invite_content_data(dynamic raw); @protected (String, SharedPushState) dco_decode_record_string_shared_push_state( - dynamic raw); + dynamic raw, + ); @protected (String, StatusKitPersonalConfig) - dco_decode_record_string_status_kit_personal_config(dynamic raw); + dco_decode_record_string_status_kit_personal_config(dynamic raw); @protected (String, String) dco_decode_record_string_string(dynamic raw); @@ -2671,11 +3444,12 @@ abstract class RustLibApiImplPlatform extends BaseApiImpl { @protected (String, UpdateAccountFinish) dco_decode_record_string_update_account_finish( - dynamic raw); + dynamic raw, + ); @protected (int, NSDictionaryTypedCoder) - dco_decode_record_u_32_ns_dictionary_typed_coder(dynamic raw); + dco_decode_record_u_32_ns_dictionary_typed_coder(dynamic raw); @protected (int, BigInt) dco_decode_record_u_32_u_64(dynamic raw); @@ -2691,14 +3465,15 @@ abstract class RustLibApiImplPlatform extends BaseApiImpl { @protected RichLinkImageAttachmentSubstitute - dco_decode_rich_link_image_attachment_substitute(dynamic raw); + dco_decode_rich_link_image_attachment_substitute(dynamic raw); @protected ScheduleMode dco_decode_schedule_mode(dynamic raw); @protected SetTranscriptBackgroundMessage dco_decode_set_transcript_background_message( - dynamic raw); + dynamic raw, + ); @protected ShareInviteContentData dco_decode_share_invite_content_data(dynamic raw); @@ -2720,14 +3495,16 @@ abstract class RustLibApiImplPlatform extends BaseApiImpl { @protected SimplifiedIncomingCallPoster dco_decode_simplified_incoming_call_poster( - dynamic raw); + dynamic raw, + ); @protected SimplifiedPoster dco_decode_simplified_poster(dynamic raw); @protected SimplifiedTranscriptPoster dco_decode_simplified_transcript_poster( - dynamic raw); + dynamic raw, + ); @protected StatusKitMessage dco_decode_status_kit_message(dynamic raw); @@ -2758,7 +3535,8 @@ abstract class RustLibApiImplPlatform extends BaseApiImpl { @protected TranscriptDynamicUserData dco_decode_transcript_dynamic_user_data( - dynamic raw); + dynamic raw, + ); @protected TransferProgress dco_decode_transfer_progress(dynamic raw); @@ -2769,6 +3547,9 @@ abstract class RustLibApiImplPlatform extends BaseApiImpl { @protected TypingApp dco_decode_typing_app(dynamic raw); + @protected + int dco_decode_u_16(dynamic raw); + @protected int dco_decode_u_32(dynamic raw); @@ -2798,7 +3579,8 @@ abstract class RustLibApiImplPlatform extends BaseApiImpl { @protected UpdateProfileSharingMessage dco_decode_update_profile_sharing_message( - dynamic raw); + dynamic raw, + ); @protected BigInt dco_decode_usize(dynamic raw); @@ -2817,483 +3599,591 @@ abstract class RustLibApiImplPlatform extends BaseApiImpl { @protected ApsConnection - sse_decode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerAPSConnection( - SseDeserializer deserializer); + sse_decode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerAPSConnection( + SseDeserializer deserializer, + ); @protected ApsState - sse_decode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerAPSState( - SseDeserializer deserializer); + sse_decode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerAPSState( + SseDeserializer deserializer, + ); @protected ApsWatcher - sse_decode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerAPSWatcher( - SseDeserializer deserializer); + sse_decode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerAPSWatcher( + SseDeserializer deserializer, + ); @protected ArcAnisetteClientDefaultAnisetteProvider - sse_decode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcAnisetteClientDefaultAnisetteProvider( - SseDeserializer deserializer); + sse_decode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcAnisetteClientDefaultAnisetteProvider( + SseDeserializer deserializer, + ); @protected ArcCloudKitClientDefaultAnisetteProvider - sse_decode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcCloudKitClientDefaultAnisetteProvider( - SseDeserializer deserializer); + sse_decode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcCloudKitClientDefaultAnisetteProvider( + SseDeserializer deserializer, + ); @protected ArcCloudMessagesClientDefaultAnisetteProvider - sse_decode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcCloudMessagesClientDefaultAnisetteProvider( - SseDeserializer deserializer); + sse_decode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcCloudMessagesClientDefaultAnisetteProvider( + SseDeserializer deserializer, + ); @protected ArcFtClient - sse_decode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcFTClient( - SseDeserializer deserializer); + sse_decode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcFTClient( + SseDeserializer deserializer, + ); @protected ArcFindMyClientDefaultAnisetteProvider - sse_decode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcFindMyClientDefaultAnisetteProvider( - SseDeserializer deserializer); + sse_decode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcFindMyClientDefaultAnisetteProvider( + SseDeserializer deserializer, + ); @protected ArcImClient - sse_decode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcIMClient( - SseDeserializer deserializer); + sse_decode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcIMClient( + SseDeserializer deserializer, + ); @protected ArcIdmsAuthListener - sse_decode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcIdmsAuthListener( - SseDeserializer deserializer); + sse_decode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcIdmsAuthListener( + SseDeserializer deserializer, + ); @protected ArcKeychainClientDefaultAnisetteProvider - sse_decode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcKeychainClientDefaultAnisetteProvider( - SseDeserializer deserializer); + sse_decode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcKeychainClientDefaultAnisetteProvider( + SseDeserializer deserializer, + ); @protected ArcMutexAppleAccountDefaultAnisetteProvider - sse_decode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcMutexAppleAccountDefaultAnisetteProvider( - SseDeserializer deserializer); + sse_decode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcMutexAppleAccountDefaultAnisetteProvider( + SseDeserializer deserializer, + ); @protected ArcMutexOptionCircleClientSessionDefaultAnisetteProvider - sse_decode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcMutexOptionCircleClientSessionDefaultAnisetteProvider( - SseDeserializer deserializer); + sse_decode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcMutexOptionCircleClientSessionDefaultAnisetteProvider( + SseDeserializer deserializer, + ); @protected ArcMutexVecActiveCircleSession - sse_decode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcMutexVecActiveCircleSession( - SseDeserializer deserializer); + sse_decode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcMutexVecActiveCircleSession( + SseDeserializer deserializer, + ); @protected ArcPasswordManagerDefaultAnisetteProvider - sse_decode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcPasswordManagerDefaultAnisetteProvider( - SseDeserializer deserializer); + sse_decode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcPasswordManagerDefaultAnisetteProvider( + SseDeserializer deserializer, + ); @protected ArcProfilesClientDefaultAnisetteProvider - sse_decode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcProfilesClientDefaultAnisetteProvider( - SseDeserializer deserializer); + sse_decode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcProfilesClientDefaultAnisetteProvider( + SseDeserializer deserializer, + ); @protected ArcSenderPushMessage - sse_decode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcSenderPushMessage( - SseDeserializer deserializer); + sse_decode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcSenderPushMessage( + SseDeserializer deserializer, + ); @protected ArcSharedPushState - sse_decode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcSharedPushState( - SseDeserializer deserializer); + sse_decode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcSharedPushState( + SseDeserializer deserializer, + ); @protected ArcStatusKitClientDefaultAnisetteProvider - sse_decode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcStatusKitClientDefaultAnisetteProvider( - SseDeserializer deserializer); + sse_decode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcStatusKitClientDefaultAnisetteProvider( + SseDeserializer deserializer, + ); @protected ArcTokenProviderDefaultAnisetteProvider - sse_decode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcTokenProviderDefaultAnisetteProvider( - SseDeserializer deserializer); + sse_decode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcTokenProviderDefaultAnisetteProvider( + SseDeserializer deserializer, + ); @protected Asset - sse_decode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerAsset( - SseDeserializer deserializer); + sse_decode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerAsset( + SseDeserializer deserializer, + ); @protected ChannelInterestToken - sse_decode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerChannelInterestToken( - SseDeserializer deserializer); + sse_decode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerChannelInterestToken( + SseDeserializer deserializer, + ); @protected CircleClientSessionDefaultAnisetteProvider - sse_decode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerCircleClientSessionDefaultAnisetteProvider( - SseDeserializer deserializer); + sse_decode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerCircleClientSessionDefaultAnisetteProvider( + SseDeserializer deserializer, + ); + + @protected + CloudSyncPreparedMessageCreateHandle + sse_decode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerCloudSyncPreparedMessageCreateHandle( + SseDeserializer deserializer, + ); @protected ConversationLink - sse_decode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerConversationLink( - SseDeserializer deserializer); + sse_decode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerConversationLink( + SseDeserializer deserializer, + ); @protected ConversationParticipant - sse_decode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerConversationParticipant( - SseDeserializer deserializer); + sse_decode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerConversationParticipant( + SseDeserializer deserializer, + ); @protected Date - sse_decode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerDate( - SseDeserializer deserializer); + sse_decode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerDate( + SseDeserializer deserializer, + ); @protected EscrowData - sse_decode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerEscrowData( - SseDeserializer deserializer); + sse_decode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerEscrowData( + SseDeserializer deserializer, + ); @protected FindMyFriendsClientDefaultAnisetteProvider - sse_decode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerFindMyFriendsClientDefaultAnisetteProvider( - SseDeserializer deserializer); + sse_decode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerFindMyFriendsClientDefaultAnisetteProvider( + SseDeserializer deserializer, + ); @protected FindMyPhoneClientDefaultAnisetteProvider - sse_decode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerFindMyPhoneClientDefaultAnisetteProvider( - SseDeserializer deserializer); + sse_decode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerFindMyPhoneClientDefaultAnisetteProvider( + SseDeserializer deserializer, + ); @protected GZipWrapperAttachmentMeta - sse_decode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerGZipWrapperAttachmentMeta( - SseDeserializer deserializer); + sse_decode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerGZipWrapperAttachmentMeta( + SseDeserializer deserializer, + ); @protected GZipWrapperChatProto - sse_decode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerGZipWrapperChatProto( - SseDeserializer deserializer); + sse_decode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerGZipWrapperChatProto( + SseDeserializer deserializer, + ); @protected GZipWrapperMessageProto - sse_decode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerGZipWrapperMessageProto( - SseDeserializer deserializer); + sse_decode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerGZipWrapperMessageProto( + SseDeserializer deserializer, + ); @protected GZipWrapperMessageProto2 - sse_decode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerGZipWrapperMessageProto2( - SseDeserializer deserializer); + sse_decode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerGZipWrapperMessageProto2( + SseDeserializer deserializer, + ); @protected GZipWrapperMessageProto3 - sse_decode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerGZipWrapperMessageProto3( - SseDeserializer deserializer); + sse_decode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerGZipWrapperMessageProto3( + SseDeserializer deserializer, + ); @protected GZipWrapperMessageProto4 - sse_decode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerGZipWrapperMessageProto4( - SseDeserializer deserializer); + sse_decode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerGZipWrapperMessageProto4( + SseDeserializer deserializer, + ); @protected IdsngmIdentity - sse_decode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerIDSNGMIdentity( - SseDeserializer deserializer); + sse_decode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerIDSNGMIdentity( + SseDeserializer deserializer, + ); @protected IdsUser - sse_decode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerIDSUser( - SseDeserializer deserializer); + sse_decode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerIDSUser( + SseDeserializer deserializer, + ); @protected JoinedOsConfig - sse_decode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerJoinedOSConfig( - SseDeserializer deserializer); + sse_decode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerJoinedOSConfig( + SseDeserializer deserializer, + ); @protected LocationReport - sse_decode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerLocationReport( - SseDeserializer deserializer); + sse_decode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerLocationReport( + SseDeserializer deserializer, + ); @protected MessageFlags - sse_decode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerMessageFlags( - SseDeserializer deserializer); + sse_decode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerMessageFlags( + SseDeserializer deserializer, + ); @protected NsArrayLpIconMetadata - sse_decode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerNSArrayLPIconMetadata( - SseDeserializer deserializer); + sse_decode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerNSArrayLPIconMetadata( + SseDeserializer deserializer, + ); @protected NsArrayLpImageMetadata - sse_decode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerNSArrayLPImageMetadata( - SseDeserializer deserializer); + sse_decode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerNSArrayLPImageMetadata( + SseDeserializer deserializer, + ); @protected PushError - sse_decode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerPushError( - SseDeserializer deserializer); + sse_decode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerPushError( + SseDeserializer deserializer, + ); @protected ReceiverApsMessage - sse_decode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerReceiverAPSMessage( - SseDeserializer deserializer); + sse_decode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerReceiverAPSMessage( + SseDeserializer deserializer, + ); @protected SavedHardwareState - sse_decode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerSavedHardwareState( - SseDeserializer deserializer); + sse_decode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerSavedHardwareState( + SseDeserializer deserializer, + ); @protected Sender - sse_decode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerSender( - SseDeserializer deserializer); + sse_decode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerSender( + SseDeserializer deserializer, + ); @protected StCollapsedValue - sse_decode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerStCollapsedValue( - SseDeserializer deserializer); + sse_decode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerStCollapsedValue( + SseDeserializer deserializer, + ); @protected SyncManagerDefaultAnisetteProviderMyFilePackager - sse_decode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerSyncManagerDefaultAnisetteProviderMyFilePackager( - SseDeserializer deserializer); + sse_decode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerSyncManagerDefaultAnisetteProviderMyFilePackager( + SseDeserializer deserializer, + ); @protected SystemTime - sse_decode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerSystemTime( - SseDeserializer deserializer); + sse_decode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerSystemTime( + SseDeserializer deserializer, + ); @protected VerifyBody - sse_decode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerVerifyBody( - SseDeserializer deserializer); + sse_decode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerVerifyBody( + SseDeserializer deserializer, + ); @protected ViableBottle - sse_decode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerViableBottle( - SseDeserializer deserializer); + sse_decode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerViableBottle( + SseDeserializer deserializer, + ); @protected ApsWatcher - sse_decode_Auto_RefMut_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerAPSWatcher( - SseDeserializer deserializer); + sse_decode_Auto_RefMut_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerAPSWatcher( + SseDeserializer deserializer, + ); @protected CircleClientSessionDefaultAnisetteProvider - sse_decode_Auto_RefMut_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerCircleClientSessionDefaultAnisetteProvider( - SseDeserializer deserializer); + sse_decode_Auto_RefMut_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerCircleClientSessionDefaultAnisetteProvider( + SseDeserializer deserializer, + ); @protected FindMyFriendsClientDefaultAnisetteProvider - sse_decode_Auto_RefMut_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerFindMyFriendsClientDefaultAnisetteProvider( - SseDeserializer deserializer); + sse_decode_Auto_RefMut_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerFindMyFriendsClientDefaultAnisetteProvider( + SseDeserializer deserializer, + ); @protected FindMyPhoneClientDefaultAnisetteProvider - sse_decode_Auto_RefMut_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerFindMyPhoneClientDefaultAnisetteProvider( - SseDeserializer deserializer); + sse_decode_Auto_RefMut_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerFindMyPhoneClientDefaultAnisetteProvider( + SseDeserializer deserializer, + ); @protected LocationReport - sse_decode_Auto_RefMut_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerLocationReport( - SseDeserializer deserializer); + sse_decode_Auto_RefMut_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerLocationReport( + SseDeserializer deserializer, + ); @protected ReceiverApsMessage - sse_decode_Auto_RefMut_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerReceiverAPSMessage( - SseDeserializer deserializer); + sse_decode_Auto_RefMut_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerReceiverAPSMessage( + SseDeserializer deserializer, + ); @protected SavedHardwareState - sse_decode_Auto_RefMut_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerSavedHardwareState( - SseDeserializer deserializer); + sse_decode_Auto_RefMut_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerSavedHardwareState( + SseDeserializer deserializer, + ); @protected ViableBottle - sse_decode_Auto_RefMut_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerViableBottle( - SseDeserializer deserializer); + sse_decode_Auto_RefMut_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerViableBottle( + SseDeserializer deserializer, + ); @protected ApsConnection - sse_decode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerAPSConnection( - SseDeserializer deserializer); + sse_decode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerAPSConnection( + SseDeserializer deserializer, + ); @protected ArcAnisetteClientDefaultAnisetteProvider - sse_decode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcAnisetteClientDefaultAnisetteProvider( - SseDeserializer deserializer); + sse_decode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcAnisetteClientDefaultAnisetteProvider( + SseDeserializer deserializer, + ); @protected ArcCloudKitClientDefaultAnisetteProvider - sse_decode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcCloudKitClientDefaultAnisetteProvider( - SseDeserializer deserializer); + sse_decode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcCloudKitClientDefaultAnisetteProvider( + SseDeserializer deserializer, + ); @protected ArcCloudMessagesClientDefaultAnisetteProvider - sse_decode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcCloudMessagesClientDefaultAnisetteProvider( - SseDeserializer deserializer); + sse_decode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcCloudMessagesClientDefaultAnisetteProvider( + SseDeserializer deserializer, + ); @protected ArcFtClient - sse_decode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcFTClient( - SseDeserializer deserializer); + sse_decode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcFTClient( + SseDeserializer deserializer, + ); @protected ArcFindMyClientDefaultAnisetteProvider - sse_decode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcFindMyClientDefaultAnisetteProvider( - SseDeserializer deserializer); + sse_decode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcFindMyClientDefaultAnisetteProvider( + SseDeserializer deserializer, + ); @protected ArcImClient - sse_decode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcIMClient( - SseDeserializer deserializer); + sse_decode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcIMClient( + SseDeserializer deserializer, + ); @protected ArcIdmsAuthListener - sse_decode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcIdmsAuthListener( - SseDeserializer deserializer); + sse_decode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcIdmsAuthListener( + SseDeserializer deserializer, + ); @protected ArcKeychainClientDefaultAnisetteProvider - sse_decode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcKeychainClientDefaultAnisetteProvider( - SseDeserializer deserializer); + sse_decode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcKeychainClientDefaultAnisetteProvider( + SseDeserializer deserializer, + ); @protected ArcMutexAppleAccountDefaultAnisetteProvider - sse_decode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcMutexAppleAccountDefaultAnisetteProvider( - SseDeserializer deserializer); + sse_decode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcMutexAppleAccountDefaultAnisetteProvider( + SseDeserializer deserializer, + ); @protected ArcMutexOptionCircleClientSessionDefaultAnisetteProvider - sse_decode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcMutexOptionCircleClientSessionDefaultAnisetteProvider( - SseDeserializer deserializer); + sse_decode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcMutexOptionCircleClientSessionDefaultAnisetteProvider( + SseDeserializer deserializer, + ); @protected ArcMutexVecActiveCircleSession - sse_decode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcMutexVecActiveCircleSession( - SseDeserializer deserializer); + sse_decode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcMutexVecActiveCircleSession( + SseDeserializer deserializer, + ); @protected ArcPasswordManagerDefaultAnisetteProvider - sse_decode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcPasswordManagerDefaultAnisetteProvider( - SseDeserializer deserializer); + sse_decode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcPasswordManagerDefaultAnisetteProvider( + SseDeserializer deserializer, + ); @protected ArcProfilesClientDefaultAnisetteProvider - sse_decode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcProfilesClientDefaultAnisetteProvider( - SseDeserializer deserializer); + sse_decode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcProfilesClientDefaultAnisetteProvider( + SseDeserializer deserializer, + ); @protected ArcSenderPushMessage - sse_decode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcSenderPushMessage( - SseDeserializer deserializer); + sse_decode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcSenderPushMessage( + SseDeserializer deserializer, + ); @protected ArcSharedPushState - sse_decode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcSharedPushState( - SseDeserializer deserializer); + sse_decode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcSharedPushState( + SseDeserializer deserializer, + ); @protected ArcStatusKitClientDefaultAnisetteProvider - sse_decode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcStatusKitClientDefaultAnisetteProvider( - SseDeserializer deserializer); + sse_decode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcStatusKitClientDefaultAnisetteProvider( + SseDeserializer deserializer, + ); @protected ArcTokenProviderDefaultAnisetteProvider - sse_decode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcTokenProviderDefaultAnisetteProvider( - SseDeserializer deserializer); + sse_decode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcTokenProviderDefaultAnisetteProvider( + SseDeserializer deserializer, + ); + + @protected + CloudSyncPreparedMessageCreateHandle + sse_decode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerCloudSyncPreparedMessageCreateHandle( + SseDeserializer deserializer, + ); @protected Date - sse_decode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerDate( - SseDeserializer deserializer); + sse_decode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerDate( + SseDeserializer deserializer, + ); @protected EscrowData - sse_decode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerEscrowData( - SseDeserializer deserializer); + sse_decode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerEscrowData( + SseDeserializer deserializer, + ); @protected GZipWrapperAttachmentMeta - sse_decode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerGZipWrapperAttachmentMeta( - SseDeserializer deserializer); + sse_decode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerGZipWrapperAttachmentMeta( + SseDeserializer deserializer, + ); @protected GZipWrapperChatProto - sse_decode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerGZipWrapperChatProto( - SseDeserializer deserializer); + sse_decode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerGZipWrapperChatProto( + SseDeserializer deserializer, + ); @protected GZipWrapperMessageProto - sse_decode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerGZipWrapperMessageProto( - SseDeserializer deserializer); + sse_decode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerGZipWrapperMessageProto( + SseDeserializer deserializer, + ); @protected GZipWrapperMessageProto2 - sse_decode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerGZipWrapperMessageProto2( - SseDeserializer deserializer); + sse_decode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerGZipWrapperMessageProto2( + SseDeserializer deserializer, + ); @protected GZipWrapperMessageProto3 - sse_decode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerGZipWrapperMessageProto3( - SseDeserializer deserializer); + sse_decode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerGZipWrapperMessageProto3( + SseDeserializer deserializer, + ); @protected GZipWrapperMessageProto4 - sse_decode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerGZipWrapperMessageProto4( - SseDeserializer deserializer); + sse_decode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerGZipWrapperMessageProto4( + SseDeserializer deserializer, + ); @protected IdsngmIdentity - sse_decode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerIDSNGMIdentity( - SseDeserializer deserializer); + sse_decode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerIDSNGMIdentity( + SseDeserializer deserializer, + ); @protected IdsUser - sse_decode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerIDSUser( - SseDeserializer deserializer); + sse_decode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerIDSUser( + SseDeserializer deserializer, + ); @protected JoinedOsConfig - sse_decode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerJoinedOSConfig( - SseDeserializer deserializer); + sse_decode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerJoinedOSConfig( + SseDeserializer deserializer, + ); @protected LocationReport - sse_decode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerLocationReport( - SseDeserializer deserializer); + sse_decode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerLocationReport( + SseDeserializer deserializer, + ); @protected MessageFlags - sse_decode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerMessageFlags( - SseDeserializer deserializer); + sse_decode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerMessageFlags( + SseDeserializer deserializer, + ); @protected SavedHardwareState - sse_decode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerSavedHardwareState( - SseDeserializer deserializer); + sse_decode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerSavedHardwareState( + SseDeserializer deserializer, + ); @protected Sender - sse_decode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerSender( - SseDeserializer deserializer); + sse_decode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerSender( + SseDeserializer deserializer, + ); @protected StCollapsedValue - sse_decode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerStCollapsedValue( - SseDeserializer deserializer); + sse_decode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerStCollapsedValue( + SseDeserializer deserializer, + ); @protected SyncManagerDefaultAnisetteProviderMyFilePackager - sse_decode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerSyncManagerDefaultAnisetteProviderMyFilePackager( - SseDeserializer deserializer); + sse_decode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerSyncManagerDefaultAnisetteProviderMyFilePackager( + SseDeserializer deserializer, + ); @protected VerifyBody - sse_decode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerVerifyBody( - SseDeserializer deserializer); + sse_decode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerVerifyBody( + SseDeserializer deserializer, + ); @protected ViableBottle - sse_decode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerViableBottle( - SseDeserializer deserializer); + sse_decode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerViableBottle( + SseDeserializer deserializer, + ); @protected int sse_decode_CastedPrimitive_i_64(SseDeserializer deserializer); @@ -3309,376 +4199,454 @@ abstract class RustLibApiImplPlatform extends BaseApiImpl { @protected Map - sse_decode_Map_String_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerAsset( - SseDeserializer deserializer); + sse_decode_Map_String_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerAsset( + SseDeserializer deserializer, + ); @protected Map - sse_decode_Map_String_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerStCollapsedValue( - SseDeserializer deserializer); + sse_decode_Map_String_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerStCollapsedValue( + SseDeserializer deserializer, + ); @protected Map sse_decode_Map_String_CastedPrimitive_u_64( - SseDeserializer deserializer); + SseDeserializer deserializer, + ); @protected Map sse_decode_Map_String_String( - SseDeserializer deserializer); + SseDeserializer deserializer, + ); @protected Map sse_decode_Map_String_bool(SseDeserializer deserializer); @protected Map sse_decode_Map_String_cloud_attachment( - SseDeserializer deserializer); + SseDeserializer deserializer, + ); @protected Map sse_decode_Map_String_cloud_chat( - SseDeserializer deserializer); + SseDeserializer deserializer, + ); @protected Map sse_decode_Map_String_cloud_message( - SseDeserializer deserializer); + SseDeserializer deserializer, + ); @protected Map sse_decode_Map_String_ft_participant( - SseDeserializer deserializer); + SseDeserializer deserializer, + ); @protected Map sse_decode_Map_String_group_summary( - SseDeserializer deserializer); + SseDeserializer deserializer, + ); @protected Map> sse_decode_Map_String_list_message_edit( - SseDeserializer deserializer); + SseDeserializer deserializer, + ); @protected Map sse_decode_Map_String_list_prim_u_8_strict( - SseDeserializer deserializer); + SseDeserializer deserializer, + ); @protected Map sse_decode_Map_String_message_edit_range( - SseDeserializer deserializer); + SseDeserializer deserializer, + ); @protected Map - sse_decode_Map_String_opt_box_autoadd_cloud_attachment( - SseDeserializer deserializer); + sse_decode_Map_String_opt_box_autoadd_cloud_attachment( + SseDeserializer deserializer, + ); @protected Map sse_decode_Map_String_opt_box_autoadd_cloud_chat( - SseDeserializer deserializer); + SseDeserializer deserializer, + ); @protected Map - sse_decode_Map_String_opt_box_autoadd_cloud_message( - SseDeserializer deserializer); + sse_decode_Map_String_opt_box_autoadd_cloud_message( + SseDeserializer deserializer, + ); @protected Map - sse_decode_Map_String_password_manager_meta_data_ctx( - SseDeserializer deserializer); + sse_decode_Map_String_password_manager_meta_data_ctx( + SseDeserializer deserializer, + ); @protected Map - sse_decode_Map_String_record_opt_string_passkey( - SseDeserializer deserializer); + sse_decode_Map_String_record_opt_string_passkey(SseDeserializer deserializer); @protected Map - sse_decode_Map_String_record_opt_string_password_manager_meta( - SseDeserializer deserializer); + sse_decode_Map_String_record_opt_string_password_manager_meta( + SseDeserializer deserializer, + ); @protected Map - sse_decode_Map_String_record_opt_string_password_raw_entry( - SseDeserializer deserializer); + sse_decode_Map_String_record_opt_string_password_raw_entry( + SseDeserializer deserializer, + ); @protected Map - sse_decode_Map_String_record_opt_string_wifi_password( - SseDeserializer deserializer); + sse_decode_Map_String_record_opt_string_wifi_password( + SseDeserializer deserializer, + ); @protected Map - sse_decode_Map_String_share_invite_content_data( - SseDeserializer deserializer); + sse_decode_Map_String_share_invite_content_data(SseDeserializer deserializer); @protected Map - sse_decode_Map_String_status_kit_personal_config( - SseDeserializer deserializer); + sse_decode_Map_String_status_kit_personal_config( + SseDeserializer deserializer, + ); @protected Map sse_decode_Map_String_sync_status( - SseDeserializer deserializer); + SseDeserializer deserializer, + ); @protected ApsConnection - sse_decode_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerAPSConnection( - SseDeserializer deserializer); + sse_decode_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerAPSConnection( + SseDeserializer deserializer, + ); @protected ApsState - sse_decode_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerAPSState( - SseDeserializer deserializer); + sse_decode_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerAPSState( + SseDeserializer deserializer, + ); @protected ApsWatcher - sse_decode_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerAPSWatcher( - SseDeserializer deserializer); + sse_decode_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerAPSWatcher( + SseDeserializer deserializer, + ); @protected ArcAnisetteClientDefaultAnisetteProvider - sse_decode_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcAnisetteClientDefaultAnisetteProvider( - SseDeserializer deserializer); + sse_decode_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcAnisetteClientDefaultAnisetteProvider( + SseDeserializer deserializer, + ); @protected ArcCloudKitClientDefaultAnisetteProvider - sse_decode_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcCloudKitClientDefaultAnisetteProvider( - SseDeserializer deserializer); + sse_decode_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcCloudKitClientDefaultAnisetteProvider( + SseDeserializer deserializer, + ); @protected ArcCloudMessagesClientDefaultAnisetteProvider - sse_decode_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcCloudMessagesClientDefaultAnisetteProvider( - SseDeserializer deserializer); + sse_decode_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcCloudMessagesClientDefaultAnisetteProvider( + SseDeserializer deserializer, + ); @protected ArcFtClient - sse_decode_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcFTClient( - SseDeserializer deserializer); + sse_decode_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcFTClient( + SseDeserializer deserializer, + ); @protected ArcFindMyClientDefaultAnisetteProvider - sse_decode_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcFindMyClientDefaultAnisetteProvider( - SseDeserializer deserializer); + sse_decode_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcFindMyClientDefaultAnisetteProvider( + SseDeserializer deserializer, + ); @protected ArcImClient - sse_decode_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcIMClient( - SseDeserializer deserializer); + sse_decode_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcIMClient( + SseDeserializer deserializer, + ); @protected ArcIdmsAuthListener - sse_decode_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcIdmsAuthListener( - SseDeserializer deserializer); + sse_decode_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcIdmsAuthListener( + SseDeserializer deserializer, + ); @protected ArcKeychainClientDefaultAnisetteProvider - sse_decode_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcKeychainClientDefaultAnisetteProvider( - SseDeserializer deserializer); + sse_decode_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcKeychainClientDefaultAnisetteProvider( + SseDeserializer deserializer, + ); @protected ArcMutexAppleAccountDefaultAnisetteProvider - sse_decode_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcMutexAppleAccountDefaultAnisetteProvider( - SseDeserializer deserializer); + sse_decode_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcMutexAppleAccountDefaultAnisetteProvider( + SseDeserializer deserializer, + ); @protected ArcMutexOptionCircleClientSessionDefaultAnisetteProvider - sse_decode_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcMutexOptionCircleClientSessionDefaultAnisetteProvider( - SseDeserializer deserializer); + sse_decode_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcMutexOptionCircleClientSessionDefaultAnisetteProvider( + SseDeserializer deserializer, + ); @protected ArcMutexVecActiveCircleSession - sse_decode_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcMutexVecActiveCircleSession( - SseDeserializer deserializer); + sse_decode_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcMutexVecActiveCircleSession( + SseDeserializer deserializer, + ); @protected ArcPasswordManagerDefaultAnisetteProvider - sse_decode_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcPasswordManagerDefaultAnisetteProvider( - SseDeserializer deserializer); + sse_decode_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcPasswordManagerDefaultAnisetteProvider( + SseDeserializer deserializer, + ); @protected ArcProfilesClientDefaultAnisetteProvider - sse_decode_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcProfilesClientDefaultAnisetteProvider( - SseDeserializer deserializer); + sse_decode_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcProfilesClientDefaultAnisetteProvider( + SseDeserializer deserializer, + ); @protected ArcSenderPushMessage - sse_decode_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcSenderPushMessage( - SseDeserializer deserializer); + sse_decode_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcSenderPushMessage( + SseDeserializer deserializer, + ); @protected ArcSharedPushState - sse_decode_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcSharedPushState( - SseDeserializer deserializer); + sse_decode_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcSharedPushState( + SseDeserializer deserializer, + ); @protected ArcStatusKitClientDefaultAnisetteProvider - sse_decode_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcStatusKitClientDefaultAnisetteProvider( - SseDeserializer deserializer); + sse_decode_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcStatusKitClientDefaultAnisetteProvider( + SseDeserializer deserializer, + ); @protected ArcTokenProviderDefaultAnisetteProvider - sse_decode_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcTokenProviderDefaultAnisetteProvider( - SseDeserializer deserializer); + sse_decode_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcTokenProviderDefaultAnisetteProvider( + SseDeserializer deserializer, + ); @protected Asset - sse_decode_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerAsset( - SseDeserializer deserializer); + sse_decode_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerAsset( + SseDeserializer deserializer, + ); @protected ChannelInterestToken - sse_decode_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerChannelInterestToken( - SseDeserializer deserializer); + sse_decode_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerChannelInterestToken( + SseDeserializer deserializer, + ); @protected CircleClientSessionDefaultAnisetteProvider - sse_decode_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerCircleClientSessionDefaultAnisetteProvider( - SseDeserializer deserializer); + sse_decode_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerCircleClientSessionDefaultAnisetteProvider( + SseDeserializer deserializer, + ); + + @protected + CloudSyncPreparedMessageCreateHandle + sse_decode_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerCloudSyncPreparedMessageCreateHandle( + SseDeserializer deserializer, + ); @protected ConversationLink - sse_decode_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerConversationLink( - SseDeserializer deserializer); + sse_decode_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerConversationLink( + SseDeserializer deserializer, + ); @protected ConversationParticipant - sse_decode_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerConversationParticipant( - SseDeserializer deserializer); + sse_decode_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerConversationParticipant( + SseDeserializer deserializer, + ); @protected Date - sse_decode_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerDate( - SseDeserializer deserializer); + sse_decode_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerDate( + SseDeserializer deserializer, + ); @protected EscrowData - sse_decode_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerEscrowData( - SseDeserializer deserializer); + sse_decode_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerEscrowData( + SseDeserializer deserializer, + ); @protected FindMyFriendsClientDefaultAnisetteProvider - sse_decode_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerFindMyFriendsClientDefaultAnisetteProvider( - SseDeserializer deserializer); + sse_decode_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerFindMyFriendsClientDefaultAnisetteProvider( + SseDeserializer deserializer, + ); @protected FindMyPhoneClientDefaultAnisetteProvider - sse_decode_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerFindMyPhoneClientDefaultAnisetteProvider( - SseDeserializer deserializer); + sse_decode_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerFindMyPhoneClientDefaultAnisetteProvider( + SseDeserializer deserializer, + ); @protected GZipWrapperAttachmentMeta - sse_decode_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerGZipWrapperAttachmentMeta( - SseDeserializer deserializer); + sse_decode_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerGZipWrapperAttachmentMeta( + SseDeserializer deserializer, + ); @protected GZipWrapperChatProto - sse_decode_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerGZipWrapperChatProto( - SseDeserializer deserializer); + sse_decode_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerGZipWrapperChatProto( + SseDeserializer deserializer, + ); @protected GZipWrapperMessageProto - sse_decode_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerGZipWrapperMessageProto( - SseDeserializer deserializer); + sse_decode_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerGZipWrapperMessageProto( + SseDeserializer deserializer, + ); @protected GZipWrapperMessageProto2 - sse_decode_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerGZipWrapperMessageProto2( - SseDeserializer deserializer); + sse_decode_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerGZipWrapperMessageProto2( + SseDeserializer deserializer, + ); @protected GZipWrapperMessageProto3 - sse_decode_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerGZipWrapperMessageProto3( - SseDeserializer deserializer); + sse_decode_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerGZipWrapperMessageProto3( + SseDeserializer deserializer, + ); @protected GZipWrapperMessageProto4 - sse_decode_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerGZipWrapperMessageProto4( - SseDeserializer deserializer); + sse_decode_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerGZipWrapperMessageProto4( + SseDeserializer deserializer, + ); @protected IdsngmIdentity - sse_decode_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerIDSNGMIdentity( - SseDeserializer deserializer); + sse_decode_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerIDSNGMIdentity( + SseDeserializer deserializer, + ); @protected IdsUser - sse_decode_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerIDSUser( - SseDeserializer deserializer); + sse_decode_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerIDSUser( + SseDeserializer deserializer, + ); @protected JoinedOsConfig - sse_decode_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerJoinedOSConfig( - SseDeserializer deserializer); + sse_decode_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerJoinedOSConfig( + SseDeserializer deserializer, + ); @protected LocationReport - sse_decode_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerLocationReport( - SseDeserializer deserializer); + sse_decode_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerLocationReport( + SseDeserializer deserializer, + ); @protected MessageFlags - sse_decode_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerMessageFlags( - SseDeserializer deserializer); + sse_decode_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerMessageFlags( + SseDeserializer deserializer, + ); @protected NsArrayLpIconMetadata - sse_decode_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerNSArrayLPIconMetadata( - SseDeserializer deserializer); + sse_decode_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerNSArrayLPIconMetadata( + SseDeserializer deserializer, + ); @protected NsArrayLpImageMetadata - sse_decode_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerNSArrayLPImageMetadata( - SseDeserializer deserializer); + sse_decode_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerNSArrayLPImageMetadata( + SseDeserializer deserializer, + ); @protected PushError - sse_decode_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerPushError( - SseDeserializer deserializer); + sse_decode_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerPushError( + SseDeserializer deserializer, + ); @protected ReceiverApsMessage - sse_decode_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerReceiverAPSMessage( - SseDeserializer deserializer); + sse_decode_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerReceiverAPSMessage( + SseDeserializer deserializer, + ); @protected SavedHardwareState - sse_decode_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerSavedHardwareState( - SseDeserializer deserializer); + sse_decode_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerSavedHardwareState( + SseDeserializer deserializer, + ); @protected Sender - sse_decode_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerSender( - SseDeserializer deserializer); + sse_decode_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerSender( + SseDeserializer deserializer, + ); @protected StCollapsedValue - sse_decode_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerStCollapsedValue( - SseDeserializer deserializer); + sse_decode_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerStCollapsedValue( + SseDeserializer deserializer, + ); @protected SyncManagerDefaultAnisetteProviderMyFilePackager - sse_decode_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerSyncManagerDefaultAnisetteProviderMyFilePackager( - SseDeserializer deserializer); + sse_decode_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerSyncManagerDefaultAnisetteProviderMyFilePackager( + SseDeserializer deserializer, + ); @protected SystemTime - sse_decode_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerSystemTime( - SseDeserializer deserializer); + sse_decode_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerSystemTime( + SseDeserializer deserializer, + ); @protected VerifyBody - sse_decode_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerVerifyBody( - SseDeserializer deserializer); + sse_decode_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerVerifyBody( + SseDeserializer deserializer, + ); @protected ViableBottle - sse_decode_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerViableBottle( - SseDeserializer deserializer); + sse_decode_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerViableBottle( + SseDeserializer deserializer, + ); @protected Set sse_decode_Set_ft_member(SseDeserializer deserializer); @protected RustStreamSink - sse_decode_StreamSink_mmcs_transfer_progress_Sse( - SseDeserializer deserializer); + sse_decode_StreamSink_mmcs_transfer_progress_Sse( + SseDeserializer deserializer, + ); @protected RustStreamSink sse_decode_StreamSink_transfer_progress_Sse( - SseDeserializer deserializer); + SseDeserializer deserializer, + ); @protected String sse_decode_String(SseDeserializer deserializer); @@ -3692,6 +4660,11 @@ abstract class RustLibApiImplPlatform extends BaseApiImpl { @protected ApsAlert sse_decode_aps_alert(SseDeserializer deserializer); + @protected + ApsConnectionStatus sse_decode_aps_connection_status( + SseDeserializer deserializer, + ); + @protected ApsData sse_decode_aps_data(SseDeserializer deserializer); @@ -3703,7 +4676,8 @@ abstract class RustLibApiImplPlatform extends BaseApiImpl { @protected AttachmentMetaExtra sse_decode_attachment_meta_extra( - SseDeserializer deserializer); + SseDeserializer deserializer, + ); @protected AttachmentType sse_decode_attachment_type(SseDeserializer deserializer); @@ -3719,135 +4693,167 @@ abstract class RustLibApiImplPlatform extends BaseApiImpl { @protected BeaconNamingRecord sse_decode_beacon_naming_record( - SseDeserializer deserializer); + SseDeserializer deserializer, + ); @protected bool sse_decode_bool(SseDeserializer deserializer); @protected ApsState - sse_decode_box_autoadd_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerAPSState( - SseDeserializer deserializer); + sse_decode_box_autoadd_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerAPSState( + SseDeserializer deserializer, + ); @protected ArcCloudKitClientDefaultAnisetteProvider - sse_decode_box_autoadd_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcCloudKitClientDefaultAnisetteProvider( - SseDeserializer deserializer); + sse_decode_box_autoadd_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcCloudKitClientDefaultAnisetteProvider( + SseDeserializer deserializer, + ); @protected ArcCloudMessagesClientDefaultAnisetteProvider - sse_decode_box_autoadd_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcCloudMessagesClientDefaultAnisetteProvider( - SseDeserializer deserializer); + sse_decode_box_autoadd_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcCloudMessagesClientDefaultAnisetteProvider( + SseDeserializer deserializer, + ); @protected ArcFindMyClientDefaultAnisetteProvider - sse_decode_box_autoadd_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcFindMyClientDefaultAnisetteProvider( - SseDeserializer deserializer); + sse_decode_box_autoadd_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcFindMyClientDefaultAnisetteProvider( + SseDeserializer deserializer, + ); @protected ArcKeychainClientDefaultAnisetteProvider - sse_decode_box_autoadd_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcKeychainClientDefaultAnisetteProvider( - SseDeserializer deserializer); + sse_decode_box_autoadd_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcKeychainClientDefaultAnisetteProvider( + SseDeserializer deserializer, + ); @protected ArcMutexAppleAccountDefaultAnisetteProvider - sse_decode_box_autoadd_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcMutexAppleAccountDefaultAnisetteProvider( - SseDeserializer deserializer); + sse_decode_box_autoadd_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcMutexAppleAccountDefaultAnisetteProvider( + SseDeserializer deserializer, + ); @protected ArcPasswordManagerDefaultAnisetteProvider - sse_decode_box_autoadd_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcPasswordManagerDefaultAnisetteProvider( - SseDeserializer deserializer); + sse_decode_box_autoadd_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcPasswordManagerDefaultAnisetteProvider( + SseDeserializer deserializer, + ); @protected Asset - sse_decode_box_autoadd_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerAsset( - SseDeserializer deserializer); + sse_decode_box_autoadd_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerAsset( + SseDeserializer deserializer, + ); @protected ChannelInterestToken - sse_decode_box_autoadd_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerChannelInterestToken( - SseDeserializer deserializer); + sse_decode_box_autoadd_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerChannelInterestToken( + SseDeserializer deserializer, + ); @protected CircleClientSessionDefaultAnisetteProvider - sse_decode_box_autoadd_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerCircleClientSessionDefaultAnisetteProvider( - SseDeserializer deserializer); + sse_decode_box_autoadd_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerCircleClientSessionDefaultAnisetteProvider( + SseDeserializer deserializer, + ); + + @protected + CloudSyncPreparedMessageCreateHandle + sse_decode_box_autoadd_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerCloudSyncPreparedMessageCreateHandle( + SseDeserializer deserializer, + ); @protected ConversationLink - sse_decode_box_autoadd_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerConversationLink( - SseDeserializer deserializer); + sse_decode_box_autoadd_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerConversationLink( + SseDeserializer deserializer, + ); @protected ConversationParticipant - sse_decode_box_autoadd_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerConversationParticipant( - SseDeserializer deserializer); + sse_decode_box_autoadd_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerConversationParticipant( + SseDeserializer deserializer, + ); @protected Date - sse_decode_box_autoadd_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerDate( - SseDeserializer deserializer); + sse_decode_box_autoadd_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerDate( + SseDeserializer deserializer, + ); @protected GZipWrapperChatProto - sse_decode_box_autoadd_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerGZipWrapperChatProto( - SseDeserializer deserializer); + sse_decode_box_autoadd_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerGZipWrapperChatProto( + SseDeserializer deserializer, + ); @protected GZipWrapperMessageProto2 - sse_decode_box_autoadd_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerGZipWrapperMessageProto2( - SseDeserializer deserializer); + sse_decode_box_autoadd_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerGZipWrapperMessageProto2( + SseDeserializer deserializer, + ); @protected GZipWrapperMessageProto3 - sse_decode_box_autoadd_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerGZipWrapperMessageProto3( - SseDeserializer deserializer); + sse_decode_box_autoadd_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerGZipWrapperMessageProto3( + SseDeserializer deserializer, + ); @protected GZipWrapperMessageProto4 - sse_decode_box_autoadd_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerGZipWrapperMessageProto4( - SseDeserializer deserializer); + sse_decode_box_autoadd_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerGZipWrapperMessageProto4( + SseDeserializer deserializer, + ); @protected IdsUser - sse_decode_box_autoadd_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerIDSUser( - SseDeserializer deserializer); + sse_decode_box_autoadd_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerIDSUser( + SseDeserializer deserializer, + ); @protected LocationReport - sse_decode_box_autoadd_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerLocationReport( - SseDeserializer deserializer); + sse_decode_box_autoadd_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerLocationReport( + SseDeserializer deserializer, + ); @protected NsArrayLpIconMetadata - sse_decode_box_autoadd_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerNSArrayLPIconMetadata( - SseDeserializer deserializer); + sse_decode_box_autoadd_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerNSArrayLPIconMetadata( + SseDeserializer deserializer, + ); @protected NsArrayLpImageMetadata - sse_decode_box_autoadd_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerNSArrayLPImageMetadata( - SseDeserializer deserializer); + sse_decode_box_autoadd_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerNSArrayLPImageMetadata( + SseDeserializer deserializer, + ); @protected PushError - sse_decode_box_autoadd_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerPushError( - SseDeserializer deserializer); + sse_decode_box_autoadd_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerPushError( + SseDeserializer deserializer, + ); @protected SavedHardwareState - sse_decode_box_autoadd_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerSavedHardwareState( - SseDeserializer deserializer); + sse_decode_box_autoadd_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerSavedHardwareState( + SseDeserializer deserializer, + ); @protected SyncManagerDefaultAnisetteProviderMyFilePackager - sse_decode_box_autoadd_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerSyncManagerDefaultAnisetteProviderMyFilePackager( - SseDeserializer deserializer); + sse_decode_box_autoadd_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerSyncManagerDefaultAnisetteProviderMyFilePackager( + SseDeserializer deserializer, + ); @protected SystemTime - sse_decode_box_autoadd_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerSystemTime( - SseDeserializer deserializer); + sse_decode_box_autoadd_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerSystemTime( + SseDeserializer deserializer, + ); @protected Address sse_decode_box_autoadd_address(SseDeserializer deserializer); @@ -3857,73 +4863,236 @@ abstract class RustLibApiImplPlatform extends BaseApiImpl { @protected AttachmentMeta sse_decode_box_autoadd_attachment_meta( - SseDeserializer deserializer); + SseDeserializer deserializer, + ); @protected AttachmentMetaExtra sse_decode_box_autoadd_attachment_meta_extra( - SseDeserializer deserializer); + SseDeserializer deserializer, + ); @protected Balloon sse_decode_box_autoadd_balloon(SseDeserializer deserializer); @protected BalloonLayout sse_decode_box_autoadd_balloon_layout( - SseDeserializer deserializer); + SseDeserializer deserializer, + ); @protected BeaconAttributes sse_decode_box_autoadd_beacon_attributes( - SseDeserializer deserializer); + SseDeserializer deserializer, + ); @protected BeaconNamingRecord sse_decode_box_autoadd_beacon_naming_record( - SseDeserializer deserializer); + SseDeserializer deserializer, + ); @protected bool sse_decode_box_autoadd_bool(SseDeserializer deserializer); @protected CertifiedContext sse_decode_box_autoadd_certified_context( - SseDeserializer deserializer); + SseDeserializer deserializer, + ); @protected ChangeParticipantMessage sse_decode_box_autoadd_change_participant_message( - SseDeserializer deserializer); + SseDeserializer deserializer, + ); @protected ChatProto sse_decode_box_autoadd_chat_proto(SseDeserializer deserializer); @protected CloudAttachment sse_decode_box_autoadd_cloud_attachment( - SseDeserializer deserializer); + SseDeserializer deserializer, + ); @protected CloudChat sse_decode_box_autoadd_cloud_chat(SseDeserializer deserializer); @protected CloudMessage sse_decode_box_autoadd_cloud_message( - SseDeserializer deserializer); + SseDeserializer deserializer, + ); @protected CloudProp sse_decode_box_autoadd_cloud_prop(SseDeserializer deserializer); + @protected + CloudSyncOutboundFailureClass + sse_decode_box_autoadd_cloud_sync_outbound_failure_class( + SseDeserializer deserializer, + ); + + @protected + CloudSyncOutboundReconcileDisposition + sse_decode_box_autoadd_cloud_sync_outbound_reconcile_disposition( + SseDeserializer deserializer, + ); + + @protected + CloudSyncOutboundSafeCode + sse_decode_box_autoadd_cloud_sync_outbound_safe_code( + SseDeserializer deserializer, + ); + + @protected + CloudSyncPreparedMessageCreateInput + sse_decode_box_autoadd_cloud_sync_prepared_message_create_input( + SseDeserializer deserializer, + ); + + @protected + CloudSyncProtectedFailure sse_decode_box_autoadd_cloud_sync_protected_failure( + SseDeserializer deserializer, + ); + + @protected + CloudSyncProtectedGarbageCollection + sse_decode_box_autoadd_cloud_sync_protected_garbage_collection( + SseDeserializer deserializer, + ); + + @protected + CloudSyncProtectedOutboundStage + sse_decode_box_autoadd_cloud_sync_protected_outbound_stage( + SseDeserializer deserializer, + ); + + @protected + CloudSyncProtectedPage sse_decode_box_autoadd_cloud_sync_protected_page( + SseDeserializer deserializer, + ); + + @protected + CloudSyncProtectedPreflightCode + sse_decode_box_autoadd_cloud_sync_protected_preflight_code( + SseDeserializer deserializer, + ); + + @protected + CloudSyncProtectedRecovery + sse_decode_box_autoadd_cloud_sync_protected_recovery( + SseDeserializer deserializer, + ); + + @protected + CloudSyncRawFailure sse_decode_box_autoadd_cloud_sync_raw_failure( + SseDeserializer deserializer, + ); + + @protected + CloudSyncRawPage sse_decode_box_autoadd_cloud_sync_raw_page( + SseDeserializer deserializer, + ); + + @protected + CloudSyncRawSystemFields sse_decode_box_autoadd_cloud_sync_raw_system_fields( + SseDeserializer deserializer, + ); + + @protected + CloudSyncTransientAttachmentPayload + sse_decode_box_autoadd_cloud_sync_transient_attachment_payload( + SseDeserializer deserializer, + ); + + @protected + CloudSyncTransientChatPayload + sse_decode_box_autoadd_cloud_sync_transient_chat_payload( + SseDeserializer deserializer, + ); + + @protected + CloudSyncTransientDeferredReason + sse_decode_box_autoadd_cloud_sync_transient_deferred_reason( + SseDeserializer deserializer, + ); + + @protected + CloudSyncTransientEntityKind + sse_decode_box_autoadd_cloud_sync_transient_entity_kind( + SseDeserializer deserializer, + ); + + @protected + CloudSyncTransientFailureCode + sse_decode_box_autoadd_cloud_sync_transient_failure_code( + SseDeserializer deserializer, + ); + + @protected + CloudSyncTransientGroupPhotoPayload + sse_decode_box_autoadd_cloud_sync_transient_group_photo_payload( + SseDeserializer deserializer, + ); + + @protected + CloudSyncTransientMessagePayload + sse_decode_box_autoadd_cloud_sync_transient_message_payload( + SseDeserializer deserializer, + ); + + @protected + CloudSyncTransientMutationKind + sse_decode_box_autoadd_cloud_sync_transient_mutation_kind( + SseDeserializer deserializer, + ); + + @protected + CloudSyncTransientPayload sse_decode_box_autoadd_cloud_sync_transient_payload( + SseDeserializer deserializer, + ); + + @protected + CloudSyncTransientQuarantineReason + sse_decode_box_autoadd_cloud_sync_transient_quarantine_reason( + SseDeserializer deserializer, + ); + + @protected + CloudSyncTransientReactionKind + sse_decode_box_autoadd_cloud_sync_transient_reaction_kind( + SseDeserializer deserializer, + ); + + @protected + CloudSyncTransientSnapshot + sse_decode_box_autoadd_cloud_sync_transient_snapshot( + SseDeserializer deserializer, + ); + + @protected + CloudSyncTransientTombstone + sse_decode_box_autoadd_cloud_sync_transient_tombstone( + SseDeserializer deserializer, + ); + @protected ConversationData sse_decode_box_autoadd_conversation_data( - SseDeserializer deserializer); + SseDeserializer deserializer, + ); @protected DartBeaconShareInfo sse_decode_box_autoadd_dart_beacon_share_info( - SseDeserializer deserializer); + SseDeserializer deserializer, + ); @protected EditMessage sse_decode_box_autoadd_edit_message(SseDeserializer deserializer); @protected ErrorMessage sse_decode_box_autoadd_error_message( - SseDeserializer deserializer); + SseDeserializer deserializer, + ); @protected ExtensionApp sse_decode_box_autoadd_extension_app( - SseDeserializer deserializer); + SseDeserializer deserializer, + ); @protected double sse_decode_box_autoadd_f_64(SseDeserializer deserializer); @@ -3945,30 +5114,36 @@ abstract class RustLibApiImplPlatform extends BaseApiImpl { @protected IMessageNicknameRecord sse_decode_box_autoadd_i_message_nickname_record( - SseDeserializer deserializer); + SseDeserializer deserializer, + ); @protected IMessagePosterRecord sse_decode_box_autoadd_i_message_poster_record( - SseDeserializer deserializer); + SseDeserializer deserializer, + ); @protected IconChangeMessage sse_decode_box_autoadd_icon_change_message( - SseDeserializer deserializer); + SseDeserializer deserializer, + ); @protected IdmsCircleMessage sse_decode_box_autoadd_idms_circle_message( - SseDeserializer deserializer); + SseDeserializer deserializer, + ); @protected IdmsMessage sse_decode_box_autoadd_idms_message(SseDeserializer deserializer); @protected IdmsRequestedSignIn sse_decode_box_autoadd_idms_requested_sign_in( - SseDeserializer deserializer); + SseDeserializer deserializer, + ); @protected LetMeInRequest sse_decode_box_autoadd_let_me_in_request( - SseDeserializer deserializer); + SseDeserializer deserializer, + ); @protected LinkMeta sse_decode_box_autoadd_link_meta(SseDeserializer deserializer); @@ -3981,15 +5156,18 @@ abstract class RustLibApiImplPlatform extends BaseApiImpl { @protected LPIconMetadata sse_decode_box_autoadd_lp_icon_metadata( - SseDeserializer deserializer); + SseDeserializer deserializer, + ); @protected LPImageMetadata sse_decode_box_autoadd_lp_image_metadata( - SseDeserializer deserializer); + SseDeserializer deserializer, + ); @protected LPSpecializationMetadata sse_decode_box_autoadd_lp_specialization_metadata( - SseDeserializer deserializer); + SseDeserializer deserializer, + ); @protected MemojiData sse_decode_box_autoadd_memoji_data(SseDeserializer deserializer); @@ -4002,50 +5180,61 @@ abstract class RustLibApiImplPlatform extends BaseApiImpl { @protected MessageParts sse_decode_box_autoadd_message_parts( - SseDeserializer deserializer); + SseDeserializer deserializer, + ); @protected MessageProto sse_decode_box_autoadd_message_proto( - SseDeserializer deserializer); + SseDeserializer deserializer, + ); @protected MessageProto2 sse_decode_box_autoadd_message_proto_2( - SseDeserializer deserializer); + SseDeserializer deserializer, + ); @protected MessageProto3 sse_decode_box_autoadd_message_proto_3( - SseDeserializer deserializer); + SseDeserializer deserializer, + ); @protected MessageProto4 sse_decode_box_autoadd_message_proto_4( - SseDeserializer deserializer); + SseDeserializer deserializer, + ); @protected MessageSummaryInfo sse_decode_box_autoadd_message_summary_info( - SseDeserializer deserializer); + SseDeserializer deserializer, + ); @protected MMCSAttachmentMeta sse_decode_box_autoadd_mmcs_attachment_meta( - SseDeserializer deserializer); + SseDeserializer deserializer, + ); @protected MMCSFile sse_decode_box_autoadd_mmcs_file(SseDeserializer deserializer); @protected MonogramData sse_decode_box_autoadd_monogram_data( - SseDeserializer deserializer); + SseDeserializer deserializer, + ); @protected MoveToRecycleBinMessage sse_decode_box_autoadd_move_to_recycle_bin_message( - SseDeserializer deserializer); + SseDeserializer deserializer, + ); @protected NormalMessage sse_decode_box_autoadd_normal_message( - SseDeserializer deserializer); + SseDeserializer deserializer, + ); @protected NSAttributedString sse_decode_box_autoadd_ns_attributed_string( - SseDeserializer deserializer); + SseDeserializer deserializer, + ); @protected NSNumber sse_decode_box_autoadd_ns_number(SseDeserializer deserializer); @@ -4058,143 +5247,170 @@ abstract class RustLibApiImplPlatform extends BaseApiImpl { @protected NumOrString sse_decode_box_autoadd_num_or_string( - SseDeserializer deserializer); + SseDeserializer deserializer, + ); @protected OperatedChat sse_decode_box_autoadd_operated_chat( - SseDeserializer deserializer); + SseDeserializer deserializer, + ); @protected PartExtension sse_decode_box_autoadd_part_extension( - SseDeserializer deserializer); + SseDeserializer deserializer, + ); @protected Passkey sse_decode_box_autoadd_passkey(SseDeserializer deserializer); @protected PasswordManagerMeta sse_decode_box_autoadd_password_manager_meta( - SseDeserializer deserializer); + SseDeserializer deserializer, + ); @protected PasswordManagerMetaData sse_decode_box_autoadd_password_manager_meta_data( - SseDeserializer deserializer); + SseDeserializer deserializer, + ); @protected PasswordManagerMetaDataFormerlyShared - sse_decode_box_autoadd_password_manager_meta_data_formerly_shared( - SseDeserializer deserializer); + sse_decode_box_autoadd_password_manager_meta_data_formerly_shared( + SseDeserializer deserializer, + ); @protected PasswordManagerTotp sse_decode_box_autoadd_password_manager_totp( - SseDeserializer deserializer); + SseDeserializer deserializer, + ); @protected PasswordRawEntry sse_decode_box_autoadd_password_raw_entry( - SseDeserializer deserializer); + SseDeserializer deserializer, + ); @protected PermanentDeleteMessage sse_decode_box_autoadd_permanent_delete_message( - SseDeserializer deserializer); + SseDeserializer deserializer, + ); @protected PosterColor sse_decode_box_autoadd_poster_color(SseDeserializer deserializer); @protected PRPosterContentMaterialStyle - sse_decode_box_autoadd_pr_poster_content_material_style( - SseDeserializer deserializer); + sse_decode_box_autoadd_pr_poster_content_material_style( + SseDeserializer deserializer, + ); @protected PushMessage sse_decode_box_autoadd_push_message(SseDeserializer deserializer); @protected ReactMessage sse_decode_box_autoadd_react_message( - SseDeserializer deserializer); + SseDeserializer deserializer, + ); @protected Reaction sse_decode_box_autoadd_reaction(SseDeserializer deserializer); @protected - ( - SharedPushState, - ApsWatcher - ) sse_decode_box_autoadd_record_shared_push_state_auto_owned_rust_opaque_flutter_rust_bridgefor_generated_rust_auto_opaque_inner_aps_watcher( - SseDeserializer deserializer); + (SharedPushState, ApsWatcher) + sse_decode_box_autoadd_record_shared_push_state_auto_owned_rust_opaque_flutter_rust_bridgefor_generated_rust_auto_opaque_inner_aps_watcher( + SseDeserializer deserializer, + ); @protected (String, String) sse_decode_box_autoadd_record_string_string( - SseDeserializer deserializer); + SseDeserializer deserializer, + ); @protected (String, BigInt) sse_decode_box_autoadd_record_string_u_64( - SseDeserializer deserializer); + SseDeserializer deserializer, + ); @protected RegisterState sse_decode_box_autoadd_register_state( - SseDeserializer deserializer); + SseDeserializer deserializer, + ); @protected RenameMessage sse_decode_box_autoadd_rename_message( - SseDeserializer deserializer); + SseDeserializer deserializer, + ); @protected RichLinkImageAttachmentSubstitute - sse_decode_box_autoadd_rich_link_image_attachment_substitute( - SseDeserializer deserializer); + sse_decode_box_autoadd_rich_link_image_attachment_substitute( + SseDeserializer deserializer, + ); @protected ScheduleMode sse_decode_box_autoadd_schedule_mode( - SseDeserializer deserializer); + SseDeserializer deserializer, + ); @protected SetTranscriptBackgroundMessage - sse_decode_box_autoadd_set_transcript_background_message( - SseDeserializer deserializer); + sse_decode_box_autoadd_set_transcript_background_message( + SseDeserializer deserializer, + ); @protected ShareProfileMessage sse_decode_box_autoadd_share_profile_message( - SseDeserializer deserializer); + SseDeserializer deserializer, + ); @protected SharedAlbum sse_decode_box_autoadd_shared_album(SseDeserializer deserializer); @protected SharedICloudServices sse_decode_box_autoadd_shared_i_cloud_services( - SseDeserializer deserializer); + SseDeserializer deserializer, + ); @protected SharedPoster sse_decode_box_autoadd_shared_poster( - SseDeserializer deserializer); + SseDeserializer deserializer, + ); @protected SharedPushState sse_decode_box_autoadd_shared_push_state( - SseDeserializer deserializer); + SseDeserializer deserializer, + ); @protected SimplifiedIncomingCallPoster - sse_decode_box_autoadd_simplified_incoming_call_poster( - SseDeserializer deserializer); + sse_decode_box_autoadd_simplified_incoming_call_poster( + SseDeserializer deserializer, + ); @protected SimplifiedTranscriptPoster - sse_decode_box_autoadd_simplified_transcript_poster( - SseDeserializer deserializer); + sse_decode_box_autoadd_simplified_transcript_poster( + SseDeserializer deserializer, + ); @protected StatusKitMessage sse_decode_box_autoadd_status_kit_message( - SseDeserializer deserializer); + SseDeserializer deserializer, + ); @protected SupportAction sse_decode_box_autoadd_support_action( - SseDeserializer deserializer); + SseDeserializer deserializer, + ); @protected SupportAlert sse_decode_box_autoadd_support_alert( - SseDeserializer deserializer); + SseDeserializer deserializer, + ); @protected TeardownSignIn sse_decode_box_autoadd_teardown_sign_in( - SseDeserializer deserializer); + SseDeserializer deserializer, + ); @protected TextFlags sse_decode_box_autoadd_text_flags(SseDeserializer deserializer); @@ -4204,11 +5420,15 @@ abstract class RustLibApiImplPlatform extends BaseApiImpl { @protected TranscriptDynamicUserData sse_decode_box_autoadd_transcript_dynamic_user_data( - SseDeserializer deserializer); + SseDeserializer deserializer, + ); @protected TypingApp sse_decode_box_autoadd_typing_app(SseDeserializer deserializer); + @protected + int sse_decode_box_autoadd_u_16(SseDeserializer deserializer); + @protected int sse_decode_box_autoadd_u_32(SseDeserializer deserializer); @@ -4217,35 +5437,42 @@ abstract class RustLibApiImplPlatform extends BaseApiImpl { @protected UnsendMessage sse_decode_box_autoadd_unsend_message( - SseDeserializer deserializer); + SseDeserializer deserializer, + ); @protected UpdateAccountFinish sse_decode_box_autoadd_update_account_finish( - SseDeserializer deserializer); + SseDeserializer deserializer, + ); @protected UpdateExtensionMessage sse_decode_box_autoadd_update_extension_message( - SseDeserializer deserializer); + SseDeserializer deserializer, + ); @protected UpdateProfileMessage sse_decode_box_autoadd_update_profile_message( - SseDeserializer deserializer); + SseDeserializer deserializer, + ); @protected UpdateProfileSharingMessage - sse_decode_box_autoadd_update_profile_sharing_message( - SseDeserializer deserializer); + sse_decode_box_autoadd_update_profile_sharing_message( + SseDeserializer deserializer, + ); @protected WifiPassword sse_decode_box_autoadd_wifi_password( - SseDeserializer deserializer); + SseDeserializer deserializer, + ); @protected CertifiedContext sse_decode_certified_context(SseDeserializer deserializer); @protected ChangeParticipantMessage sse_decode_change_participant_message( - SseDeserializer deserializer); + SseDeserializer deserializer, + ); @protected ChatProto sse_decode_chat_proto(SseDeserializer deserializer); @@ -4261,7 +5488,8 @@ abstract class RustLibApiImplPlatform extends BaseApiImpl { @protected CloudMessageSummary sse_decode_cloud_message_summary( - SseDeserializer deserializer); + SseDeserializer deserializer, + ); @protected CloudParticipant sse_decode_cloud_participant(SseDeserializer deserializer); @@ -4272,6 +5500,289 @@ abstract class RustLibApiImplPlatform extends BaseApiImpl { @protected CloudProp001 sse_decode_cloud_prop_001(SseDeserializer deserializer); + @protected + CloudSyncNativeAuthMetadata sse_decode_cloud_sync_native_auth_metadata( + SseDeserializer deserializer, + ); + + @protected + CloudSyncOutboundConsumeResult sse_decode_cloud_sync_outbound_consume_result( + SseDeserializer deserializer, + ); + + @protected + CloudSyncOutboundFailureClass sse_decode_cloud_sync_outbound_failure_class( + SseDeserializer deserializer, + ); + + @protected + CloudSyncOutboundReconcileDisposition + sse_decode_cloud_sync_outbound_reconcile_disposition( + SseDeserializer deserializer, + ); + + @protected + CloudSyncOutboundReconcileResult + sse_decode_cloud_sync_outbound_reconcile_result(SseDeserializer deserializer); + + @protected + CloudSyncOutboundSafeCode sse_decode_cloud_sync_outbound_safe_code( + SseDeserializer deserializer, + ); + + @protected + CloudSyncOutboundSaveDisposition + sse_decode_cloud_sync_outbound_save_disposition(SseDeserializer deserializer); + + @protected + CloudSyncOutboundSaveOutcome sse_decode_cloud_sync_outbound_save_outcome( + SseDeserializer deserializer, + ); + + @protected + CloudSyncPreparedMessageCreateInput + sse_decode_cloud_sync_prepared_message_create_input( + SseDeserializer deserializer, + ); + + @protected + CloudSyncPreparedMessageCreateResult + sse_decode_cloud_sync_prepared_message_create_result( + SseDeserializer deserializer, + ); + + @protected + CloudSyncProtectedChange sse_decode_cloud_sync_protected_change( + SseDeserializer deserializer, + ); + + @protected + CloudSyncProtectedChangeKind sse_decode_cloud_sync_protected_change_kind( + SseDeserializer deserializer, + ); + + @protected + CloudSyncProtectedFailure sse_decode_cloud_sync_protected_failure( + SseDeserializer deserializer, + ); + + @protected + CloudSyncProtectedFailureCategory + sse_decode_cloud_sync_protected_failure_category( + SseDeserializer deserializer, + ); + + @protected + CloudSyncProtectedFetchResult sse_decode_cloud_sync_protected_fetch_result( + SseDeserializer deserializer, + ); + + @protected + CloudSyncProtectedGarbageCollection + sse_decode_cloud_sync_protected_garbage_collection( + SseDeserializer deserializer, + ); + + @protected + CloudSyncProtectedGarbageCollectionResult + sse_decode_cloud_sync_protected_garbage_collection_result( + SseDeserializer deserializer, + ); + + @protected + CloudSyncProtectedLeaseResult sse_decode_cloud_sync_protected_lease_result( + SseDeserializer deserializer, + ); + + @protected + CloudSyncProtectedOutboundStage + sse_decode_cloud_sync_protected_outbound_stage(SseDeserializer deserializer); + + @protected + CloudSyncProtectedOutboundStageResult + sse_decode_cloud_sync_protected_outbound_stage_result( + SseDeserializer deserializer, + ); + + @protected + CloudSyncProtectedPage sse_decode_cloud_sync_protected_page( + SseDeserializer deserializer, + ); + + @protected + CloudSyncProtectedPreflightCode + sse_decode_cloud_sync_protected_preflight_code(SseDeserializer deserializer); + + @protected + CloudSyncProtectedRecovery sse_decode_cloud_sync_protected_recovery( + SseDeserializer deserializer, + ); + + @protected + CloudSyncProtectedRecoveryResult + sse_decode_cloud_sync_protected_recovery_result(SseDeserializer deserializer); + + @protected + CloudSyncProtectedRetirementResult + sse_decode_cloud_sync_protected_retirement_result( + SseDeserializer deserializer, + ); + + @protected + CloudSyncProtectedSafeCode sse_decode_cloud_sync_protected_safe_code( + SseDeserializer deserializer, + ); + + @protected + CloudSyncRawChange sse_decode_cloud_sync_raw_change( + SseDeserializer deserializer, + ); + + @protected + CloudSyncRawFailure sse_decode_cloud_sync_raw_failure( + SseDeserializer deserializer, + ); + + @protected + CloudSyncRawFailureCategory sse_decode_cloud_sync_raw_failure_category( + SseDeserializer deserializer, + ); + + @protected + CloudSyncRawFetchResult sse_decode_cloud_sync_raw_fetch_result( + SseDeserializer deserializer, + ); + + @protected + CloudSyncRawPage sse_decode_cloud_sync_raw_page(SseDeserializer deserializer); + + @protected + CloudSyncRawRecordKind sse_decode_cloud_sync_raw_record_kind( + SseDeserializer deserializer, + ); + + @protected + CloudSyncRawSystemFields sse_decode_cloud_sync_raw_system_fields( + SseDeserializer deserializer, + ); + + @protected + CloudSyncTransientAssociationKind + sse_decode_cloud_sync_transient_association_kind( + SseDeserializer deserializer, + ); + + @protected + CloudSyncTransientAttachmentPayload + sse_decode_cloud_sync_transient_attachment_payload( + SseDeserializer deserializer, + ); + + @protected + CloudSyncTransientAttributedBody + sse_decode_cloud_sync_transient_attributed_body(SseDeserializer deserializer); + + @protected + CloudSyncTransientChatPayload sse_decode_cloud_sync_transient_chat_payload( + SseDeserializer deserializer, + ); + + @protected + CloudSyncTransientChatStyle sse_decode_cloud_sync_transient_chat_style( + SseDeserializer deserializer, + ); + + @protected + CloudSyncTransientDecodeResult sse_decode_cloud_sync_transient_decode_result( + SseDeserializer deserializer, + ); + + @protected + CloudSyncTransientDeferredReason + sse_decode_cloud_sync_transient_deferred_reason(SseDeserializer deserializer); + + @protected + CloudSyncTransientEditPart sse_decode_cloud_sync_transient_edit_part( + SseDeserializer deserializer, + ); + + @protected + CloudSyncTransientEntityKind sse_decode_cloud_sync_transient_entity_kind( + SseDeserializer deserializer, + ); + + @protected + CloudSyncTransientFailureCode sse_decode_cloud_sync_transient_failure_code( + SseDeserializer deserializer, + ); + + @protected + CloudSyncTransientFieldState sse_decode_cloud_sync_transient_field_state( + SseDeserializer deserializer, + ); + + @protected + CloudSyncTransientGroupPhotoPayload + sse_decode_cloud_sync_transient_group_photo_payload( + SseDeserializer deserializer, + ); + + @protected + CloudSyncTransientKnownMessageFlags + sse_decode_cloud_sync_transient_known_message_flags( + SseDeserializer deserializer, + ); + + @protected + CloudSyncTransientMessageEdit sse_decode_cloud_sync_transient_message_edit( + SseDeserializer deserializer, + ); + + @protected + CloudSyncTransientMessagePayload + sse_decode_cloud_sync_transient_message_payload(SseDeserializer deserializer); + + @protected + CloudSyncTransientMutationKind sse_decode_cloud_sync_transient_mutation_kind( + SseDeserializer deserializer, + ); + + @protected + CloudSyncTransientPayload sse_decode_cloud_sync_transient_payload( + SseDeserializer deserializer, + ); + + @protected + CloudSyncTransientQuarantineReason + sse_decode_cloud_sync_transient_quarantine_reason( + SseDeserializer deserializer, + ); + + @protected + CloudSyncTransientReactionKind sse_decode_cloud_sync_transient_reaction_kind( + SseDeserializer deserializer, + ); + + @protected + CloudSyncTransientService sse_decode_cloud_sync_transient_service( + SseDeserializer deserializer, + ); + + @protected + CloudSyncTransientSnapshot sse_decode_cloud_sync_transient_snapshot( + SseDeserializer deserializer, + ); + + @protected + CloudSyncTransientTextRun sse_decode_cloud_sync_transient_text_run( + SseDeserializer deserializer, + ); + + @protected + CloudSyncTransientTombstone sse_decode_cloud_sync_transient_tombstone( + SseDeserializer deserializer, + ); + @protected ConversationData sse_decode_conversation_data(SseDeserializer deserializer); @@ -4280,7 +5791,8 @@ abstract class RustLibApiImplPlatform extends BaseApiImpl { @protected DartBeaconShareInfo sse_decode_dart_beacon_share_info( - SseDeserializer deserializer); + SseDeserializer deserializer, + ); @protected DeleteTarget sse_decode_delete_target(SseDeserializer deserializer); @@ -4332,7 +5844,8 @@ abstract class RustLibApiImplPlatform extends BaseApiImpl { @protected GroupSummaryMember sse_decode_group_summary_member( - SseDeserializer deserializer); + SseDeserializer deserializer, + ); @protected HwExtra sse_decode_hw_extra(SseDeserializer deserializer); @@ -4345,34 +5858,41 @@ abstract class RustLibApiImplPlatform extends BaseApiImpl { @protected IMessageNameRecord sse_decode_i_message_name_record( - SseDeserializer deserializer); + SseDeserializer deserializer, + ); @protected IMessageNicknameRecord sse_decode_i_message_nickname_record( - SseDeserializer deserializer); + SseDeserializer deserializer, + ); @protected IMessagePosterRecord sse_decode_i_message_poster_record( - SseDeserializer deserializer); + SseDeserializer deserializer, + ); @protected IconChangeMessage sse_decode_icon_change_message( - SseDeserializer deserializer); + SseDeserializer deserializer, + ); @protected IdmsCircleMessage sse_decode_idms_circle_message( - SseDeserializer deserializer); + SseDeserializer deserializer, + ); @protected IdmsMessage sse_decode_idms_message(SseDeserializer deserializer); @protected IdmsRequestedSignIn sse_decode_idms_requested_sign_in( - SseDeserializer deserializer); + SseDeserializer deserializer, + ); @protected IndexedMessagePart sse_decode_indexed_message_part( - SseDeserializer deserializer); + SseDeserializer deserializer, + ); @protected LetMeInRequest sse_decode_let_me_in_request(SseDeserializer deserializer); @@ -4382,25 +5902,72 @@ abstract class RustLibApiImplPlatform extends BaseApiImpl { @protected List - sse_decode_list_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerIDSUser( - SseDeserializer deserializer); + sse_decode_list_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerIDSUser( + SseDeserializer deserializer, + ); @protected List - sse_decode_list_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerStCollapsedValue( - SseDeserializer deserializer); + sse_decode_list_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerStCollapsedValue( + SseDeserializer deserializer, + ); @protected List - sse_decode_list_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerViableBottle( - SseDeserializer deserializer); + sse_decode_list_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerViableBottle( + SseDeserializer deserializer, + ); @protected List sse_decode_list_String(SseDeserializer deserializer); @protected List sse_decode_list_cloud_participant( - SseDeserializer deserializer); + SseDeserializer deserializer, + ); + + @protected + List + sse_decode_list_cloud_sync_outbound_save_outcome( + SseDeserializer deserializer, + ); + + @protected + List + sse_decode_list_cloud_sync_prepared_message_create_input( + SseDeserializer deserializer, + ); + + @protected + List sse_decode_list_cloud_sync_protected_change( + SseDeserializer deserializer, + ); + + @protected + List sse_decode_list_cloud_sync_raw_change( + SseDeserializer deserializer, + ); + + @protected + List + sse_decode_list_cloud_sync_transient_attributed_body( + SseDeserializer deserializer, + ); + + @protected + List + sse_decode_list_cloud_sync_transient_edit_part(SseDeserializer deserializer); + + @protected + List + sse_decode_list_cloud_sync_transient_message_edit( + SseDeserializer deserializer, + ); + + @protected + List sse_decode_list_cloud_sync_transient_text_run( + SseDeserializer deserializer, + ); @protected List sse_decode_list_dart_beacon(SseDeserializer deserializer); @@ -4419,34 +5986,41 @@ abstract class RustLibApiImplPlatform extends BaseApiImpl { @protected List sse_decode_list_group_summary_member( - SseDeserializer deserializer); + SseDeserializer deserializer, + ); @protected List sse_decode_list_indexed_message_part( - SseDeserializer deserializer); + SseDeserializer deserializer, + ); @protected List sse_decode_list_list_prim_u_8_strict( - SseDeserializer deserializer); + SseDeserializer deserializer, + ); @protected List sse_decode_list_message_edit(SseDeserializer deserializer); @protected List sse_decode_list_message_target( - SseDeserializer deserializer); + SseDeserializer deserializer, + ); @protected List sse_decode_list_password_manager_alt_domain( - SseDeserializer deserializer); + SseDeserializer deserializer, + ); @protected List sse_decode_list_password_manager_meta_change( - SseDeserializer deserializer); + SseDeserializer deserializer, + ); @protected List sse_decode_list_photo_poster_layer( - SseDeserializer deserializer); + SseDeserializer deserializer, + ); @protected List sse_decode_list_poster_asset(SseDeserializer deserializer); @@ -4471,134 +6045,158 @@ abstract class RustLibApiImplPlatform extends BaseApiImpl { @protected List sse_decode_list_private_device_info( - SseDeserializer deserializer); + SseDeserializer deserializer, + ); @protected List<(String, Asset)> - sse_decode_list_record_string_auto_owned_rust_opaque_flutter_rust_bridgefor_generated_rust_auto_opaque_inner_asset( - SseDeserializer deserializer); + sse_decode_list_record_string_auto_owned_rust_opaque_flutter_rust_bridgefor_generated_rust_auto_opaque_inner_asset( + SseDeserializer deserializer, + ); @protected List<(String, StCollapsedValue)> - sse_decode_list_record_string_auto_owned_rust_opaque_flutter_rust_bridgefor_generated_rust_auto_opaque_inner_st_collapsed_value( - SseDeserializer deserializer); + sse_decode_list_record_string_auto_owned_rust_opaque_flutter_rust_bridgefor_generated_rust_auto_opaque_inner_st_collapsed_value( + SseDeserializer deserializer, + ); @protected List<(String, bool)> sse_decode_list_record_string_bool( - SseDeserializer deserializer); + SseDeserializer deserializer, + ); @protected List<(String, int)> sse_decode_list_record_string_casted_primitive_u_64( - SseDeserializer deserializer); + SseDeserializer deserializer, + ); @protected List<(String, CloudAttachment)> - sse_decode_list_record_string_cloud_attachment( - SseDeserializer deserializer); + sse_decode_list_record_string_cloud_attachment(SseDeserializer deserializer); @protected List<(String, CloudChat)> sse_decode_list_record_string_cloud_chat( - SseDeserializer deserializer); + SseDeserializer deserializer, + ); @protected List<(String, CloudMessage)> sse_decode_list_record_string_cloud_message( - SseDeserializer deserializer); + SseDeserializer deserializer, + ); @protected List<(String, FTParticipant)> sse_decode_list_record_string_ft_participant( - SseDeserializer deserializer); + SseDeserializer deserializer, + ); @protected List<(String, GroupSummary)> sse_decode_list_record_string_group_summary( - SseDeserializer deserializer); + SseDeserializer deserializer, + ); @protected List<(String, List)> - sse_decode_list_record_string_list_message_edit( - SseDeserializer deserializer); + sse_decode_list_record_string_list_message_edit(SseDeserializer deserializer); @protected List<(String, Uint8List)> sse_decode_list_record_string_list_prim_u_8_strict( - SseDeserializer deserializer); + SseDeserializer deserializer, + ); @protected List<(String, MessageEditRange)> - sse_decode_list_record_string_message_edit_range( - SseDeserializer deserializer); + sse_decode_list_record_string_message_edit_range( + SseDeserializer deserializer, + ); @protected List<(String, CloudAttachment?)> - sse_decode_list_record_string_opt_box_autoadd_cloud_attachment( - SseDeserializer deserializer); + sse_decode_list_record_string_opt_box_autoadd_cloud_attachment( + SseDeserializer deserializer, + ); @protected List<(String, CloudChat?)> - sse_decode_list_record_string_opt_box_autoadd_cloud_chat( - SseDeserializer deserializer); + sse_decode_list_record_string_opt_box_autoadd_cloud_chat( + SseDeserializer deserializer, + ); @protected List<(String, CloudMessage?)> - sse_decode_list_record_string_opt_box_autoadd_cloud_message( - SseDeserializer deserializer); + sse_decode_list_record_string_opt_box_autoadd_cloud_message( + SseDeserializer deserializer, + ); @protected List<(String, PasswordManagerMetaDataCtx)> - sse_decode_list_record_string_password_manager_meta_data_ctx( - SseDeserializer deserializer); + sse_decode_list_record_string_password_manager_meta_data_ctx( + SseDeserializer deserializer, + ); @protected List<(String, (String?, Passkey))> - sse_decode_list_record_string_record_opt_string_passkey( - SseDeserializer deserializer); + sse_decode_list_record_string_record_opt_string_passkey( + SseDeserializer deserializer, + ); @protected List<(String, (String?, PasswordManagerMeta))> - sse_decode_list_record_string_record_opt_string_password_manager_meta( - SseDeserializer deserializer); + sse_decode_list_record_string_record_opt_string_password_manager_meta( + SseDeserializer deserializer, + ); @protected List<(String, (String?, PasswordRawEntry))> - sse_decode_list_record_string_record_opt_string_password_raw_entry( - SseDeserializer deserializer); + sse_decode_list_record_string_record_opt_string_password_raw_entry( + SseDeserializer deserializer, + ); @protected List<(String, (String?, WifiPassword))> - sse_decode_list_record_string_record_opt_string_wifi_password( - SseDeserializer deserializer); + sse_decode_list_record_string_record_opt_string_wifi_password( + SseDeserializer deserializer, + ); @protected List<(String, ShareInviteContentData)> - sse_decode_list_record_string_share_invite_content_data( - SseDeserializer deserializer); + sse_decode_list_record_string_share_invite_content_data( + SseDeserializer deserializer, + ); @protected List<(String, StatusKitPersonalConfig)> - sse_decode_list_record_string_status_kit_personal_config( - SseDeserializer deserializer); + sse_decode_list_record_string_status_kit_personal_config( + SseDeserializer deserializer, + ); @protected List<(String, String)> sse_decode_list_record_string_string( - SseDeserializer deserializer); + SseDeserializer deserializer, + ); @protected List<(String, SyncStatus)> sse_decode_list_record_string_sync_status( - SseDeserializer deserializer); + SseDeserializer deserializer, + ); @protected List<(int, NSDictionaryTypedCoder)> - sse_decode_list_record_u_32_ns_dictionary_typed_coder( - SseDeserializer deserializer); + sse_decode_list_record_u_32_ns_dictionary_typed_coder( + SseDeserializer deserializer, + ); @protected List sse_decode_list_report_message( - SseDeserializer deserializer); + SseDeserializer deserializer, + ); @protected List sse_decode_list_shared_album(SseDeserializer deserializer); @protected List sse_decode_list_trusted_phone_number( - SseDeserializer deserializer); + SseDeserializer deserializer, + ); @protected List sse_decode_list_ui_color(SseDeserializer deserializer); @@ -4620,7 +6218,8 @@ abstract class RustLibApiImplPlatform extends BaseApiImpl { @protected LPSpecializationMetadata sse_decode_lp_specialization_metadata( - SseDeserializer deserializer); + SseDeserializer deserializer, + ); @protected MemojiData sse_decode_memoji_data(SseDeserializer deserializer); @@ -4657,7 +6256,8 @@ abstract class RustLibApiImplPlatform extends BaseApiImpl { @protected MessageSummaryInfo sse_decode_message_summary_info( - SseDeserializer deserializer); + SseDeserializer deserializer, + ); @protected MessageTarget sse_decode_message_target(SseDeserializer deserializer); @@ -4667,21 +6267,24 @@ abstract class RustLibApiImplPlatform extends BaseApiImpl { @protected MMCSAttachmentMeta sse_decode_mmcs_attachment_meta( - SseDeserializer deserializer); + SseDeserializer deserializer, + ); @protected MMCSFile sse_decode_mmcs_file(SseDeserializer deserializer); @protected MMCSTransferProgress sse_decode_mmcs_transfer_progress( - SseDeserializer deserializer); + SseDeserializer deserializer, + ); @protected MonogramData sse_decode_monogram_data(SseDeserializer deserializer); @protected MoveToRecycleBinMessage sse_decode_move_to_recycle_bin_message( - SseDeserializer deserializer); + SseDeserializer deserializer, + ); @protected MyAsyncRuntime sse_decode_my_async_runtime(SseDeserializer deserializer); @@ -4691,15 +6294,18 @@ abstract class RustLibApiImplPlatform extends BaseApiImpl { @protected NSAttributedString sse_decode_ns_attributed_string( - SseDeserializer deserializer); + SseDeserializer deserializer, + ); @protected NSDictionaryClass sse_decode_ns_dictionary_class( - SseDeserializer deserializer); + SseDeserializer deserializer, + ); @protected NSDictionaryTypedCoder sse_decode_ns_dictionary_typed_coder( - SseDeserializer deserializer); + SseDeserializer deserializer, + ); @protected NSNumber sse_decode_ns_number(SseDeserializer deserializer); @@ -4730,181 +6336,370 @@ abstract class RustLibApiImplPlatform extends BaseApiImpl { @protected ApsState? - sse_decode_opt_box_autoadd_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerAPSState( - SseDeserializer deserializer); + sse_decode_opt_box_autoadd_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerAPSState( + SseDeserializer deserializer, + ); @protected ArcCloudKitClientDefaultAnisetteProvider? - sse_decode_opt_box_autoadd_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcCloudKitClientDefaultAnisetteProvider( - SseDeserializer deserializer); + sse_decode_opt_box_autoadd_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcCloudKitClientDefaultAnisetteProvider( + SseDeserializer deserializer, + ); @protected ArcCloudMessagesClientDefaultAnisetteProvider? - sse_decode_opt_box_autoadd_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcCloudMessagesClientDefaultAnisetteProvider( - SseDeserializer deserializer); + sse_decode_opt_box_autoadd_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcCloudMessagesClientDefaultAnisetteProvider( + SseDeserializer deserializer, + ); @protected ArcFindMyClientDefaultAnisetteProvider? - sse_decode_opt_box_autoadd_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcFindMyClientDefaultAnisetteProvider( - SseDeserializer deserializer); + sse_decode_opt_box_autoadd_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcFindMyClientDefaultAnisetteProvider( + SseDeserializer deserializer, + ); @protected ArcKeychainClientDefaultAnisetteProvider? - sse_decode_opt_box_autoadd_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcKeychainClientDefaultAnisetteProvider( - SseDeserializer deserializer); + sse_decode_opt_box_autoadd_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcKeychainClientDefaultAnisetteProvider( + SseDeserializer deserializer, + ); @protected ArcMutexAppleAccountDefaultAnisetteProvider? - sse_decode_opt_box_autoadd_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcMutexAppleAccountDefaultAnisetteProvider( - SseDeserializer deserializer); + sse_decode_opt_box_autoadd_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcMutexAppleAccountDefaultAnisetteProvider( + SseDeserializer deserializer, + ); @protected ArcPasswordManagerDefaultAnisetteProvider? - sse_decode_opt_box_autoadd_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcPasswordManagerDefaultAnisetteProvider( - SseDeserializer deserializer); + sse_decode_opt_box_autoadd_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcPasswordManagerDefaultAnisetteProvider( + SseDeserializer deserializer, + ); @protected Asset? - sse_decode_opt_box_autoadd_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerAsset( - SseDeserializer deserializer); + sse_decode_opt_box_autoadd_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerAsset( + SseDeserializer deserializer, + ); @protected ChannelInterestToken? - sse_decode_opt_box_autoadd_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerChannelInterestToken( - SseDeserializer deserializer); + sse_decode_opt_box_autoadd_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerChannelInterestToken( + SseDeserializer deserializer, + ); @protected CircleClientSessionDefaultAnisetteProvider? - sse_decode_opt_box_autoadd_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerCircleClientSessionDefaultAnisetteProvider( - SseDeserializer deserializer); + sse_decode_opt_box_autoadd_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerCircleClientSessionDefaultAnisetteProvider( + SseDeserializer deserializer, + ); + + @protected + CloudSyncPreparedMessageCreateHandle? + sse_decode_opt_box_autoadd_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerCloudSyncPreparedMessageCreateHandle( + SseDeserializer deserializer, + ); @protected ConversationLink? - sse_decode_opt_box_autoadd_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerConversationLink( - SseDeserializer deserializer); + sse_decode_opt_box_autoadd_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerConversationLink( + SseDeserializer deserializer, + ); @protected ConversationParticipant? - sse_decode_opt_box_autoadd_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerConversationParticipant( - SseDeserializer deserializer); + sse_decode_opt_box_autoadd_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerConversationParticipant( + SseDeserializer deserializer, + ); @protected Date? - sse_decode_opt_box_autoadd_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerDate( - SseDeserializer deserializer); + sse_decode_opt_box_autoadd_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerDate( + SseDeserializer deserializer, + ); @protected GZipWrapperChatProto? - sse_decode_opt_box_autoadd_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerGZipWrapperChatProto( - SseDeserializer deserializer); + sse_decode_opt_box_autoadd_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerGZipWrapperChatProto( + SseDeserializer deserializer, + ); @protected GZipWrapperMessageProto2? - sse_decode_opt_box_autoadd_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerGZipWrapperMessageProto2( - SseDeserializer deserializer); + sse_decode_opt_box_autoadd_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerGZipWrapperMessageProto2( + SseDeserializer deserializer, + ); @protected GZipWrapperMessageProto3? - sse_decode_opt_box_autoadd_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerGZipWrapperMessageProto3( - SseDeserializer deserializer); + sse_decode_opt_box_autoadd_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerGZipWrapperMessageProto3( + SseDeserializer deserializer, + ); @protected GZipWrapperMessageProto4? - sse_decode_opt_box_autoadd_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerGZipWrapperMessageProto4( - SseDeserializer deserializer); + sse_decode_opt_box_autoadd_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerGZipWrapperMessageProto4( + SseDeserializer deserializer, + ); @protected IdsUser? - sse_decode_opt_box_autoadd_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerIDSUser( - SseDeserializer deserializer); + sse_decode_opt_box_autoadd_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerIDSUser( + SseDeserializer deserializer, + ); @protected LocationReport? - sse_decode_opt_box_autoadd_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerLocationReport( - SseDeserializer deserializer); + sse_decode_opt_box_autoadd_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerLocationReport( + SseDeserializer deserializer, + ); @protected NsArrayLpIconMetadata? - sse_decode_opt_box_autoadd_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerNSArrayLPIconMetadata( - SseDeserializer deserializer); + sse_decode_opt_box_autoadd_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerNSArrayLPIconMetadata( + SseDeserializer deserializer, + ); @protected NsArrayLpImageMetadata? - sse_decode_opt_box_autoadd_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerNSArrayLPImageMetadata( - SseDeserializer deserializer); + sse_decode_opt_box_autoadd_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerNSArrayLPImageMetadata( + SseDeserializer deserializer, + ); @protected PushError? - sse_decode_opt_box_autoadd_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerPushError( - SseDeserializer deserializer); + sse_decode_opt_box_autoadd_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerPushError( + SseDeserializer deserializer, + ); @protected SavedHardwareState? - sse_decode_opt_box_autoadd_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerSavedHardwareState( - SseDeserializer deserializer); + sse_decode_opt_box_autoadd_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerSavedHardwareState( + SseDeserializer deserializer, + ); @protected SyncManagerDefaultAnisetteProviderMyFilePackager? - sse_decode_opt_box_autoadd_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerSyncManagerDefaultAnisetteProviderMyFilePackager( - SseDeserializer deserializer); + sse_decode_opt_box_autoadd_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerSyncManagerDefaultAnisetteProviderMyFilePackager( + SseDeserializer deserializer, + ); @protected SystemTime? - sse_decode_opt_box_autoadd_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerSystemTime( - SseDeserializer deserializer); + sse_decode_opt_box_autoadd_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerSystemTime( + SseDeserializer deserializer, + ); @protected Address? sse_decode_opt_box_autoadd_address(SseDeserializer deserializer); @protected Attachment? sse_decode_opt_box_autoadd_attachment( - SseDeserializer deserializer); + SseDeserializer deserializer, + ); @protected AttachmentMetaExtra? sse_decode_opt_box_autoadd_attachment_meta_extra( - SseDeserializer deserializer); + SseDeserializer deserializer, + ); @protected Balloon? sse_decode_opt_box_autoadd_balloon(SseDeserializer deserializer); @protected BalloonLayout? sse_decode_opt_box_autoadd_balloon_layout( - SseDeserializer deserializer); + SseDeserializer deserializer, + ); @protected bool? sse_decode_opt_box_autoadd_bool(SseDeserializer deserializer); @protected CertifiedContext? sse_decode_opt_box_autoadd_certified_context( - SseDeserializer deserializer); + SseDeserializer deserializer, + ); @protected CloudAttachment? sse_decode_opt_box_autoadd_cloud_attachment( - SseDeserializer deserializer); + SseDeserializer deserializer, + ); @protected CloudChat? sse_decode_opt_box_autoadd_cloud_chat( - SseDeserializer deserializer); + SseDeserializer deserializer, + ); @protected CloudMessage? sse_decode_opt_box_autoadd_cloud_message( - SseDeserializer deserializer); + SseDeserializer deserializer, + ); @protected CloudProp? sse_decode_opt_box_autoadd_cloud_prop( - SseDeserializer deserializer); + SseDeserializer deserializer, + ); + + @protected + CloudSyncOutboundFailureClass? + sse_decode_opt_box_autoadd_cloud_sync_outbound_failure_class( + SseDeserializer deserializer, + ); + + @protected + CloudSyncOutboundReconcileDisposition? + sse_decode_opt_box_autoadd_cloud_sync_outbound_reconcile_disposition( + SseDeserializer deserializer, + ); + + @protected + CloudSyncOutboundSafeCode? + sse_decode_opt_box_autoadd_cloud_sync_outbound_safe_code( + SseDeserializer deserializer, + ); + + @protected + CloudSyncProtectedFailure? + sse_decode_opt_box_autoadd_cloud_sync_protected_failure( + SseDeserializer deserializer, + ); + + @protected + CloudSyncProtectedGarbageCollection? + sse_decode_opt_box_autoadd_cloud_sync_protected_garbage_collection( + SseDeserializer deserializer, + ); + + @protected + CloudSyncProtectedOutboundStage? + sse_decode_opt_box_autoadd_cloud_sync_protected_outbound_stage( + SseDeserializer deserializer, + ); + + @protected + CloudSyncProtectedPage? sse_decode_opt_box_autoadd_cloud_sync_protected_page( + SseDeserializer deserializer, + ); + + @protected + CloudSyncProtectedPreflightCode? + sse_decode_opt_box_autoadd_cloud_sync_protected_preflight_code( + SseDeserializer deserializer, + ); + + @protected + CloudSyncProtectedRecovery? + sse_decode_opt_box_autoadd_cloud_sync_protected_recovery( + SseDeserializer deserializer, + ); + + @protected + CloudSyncRawFailure? sse_decode_opt_box_autoadd_cloud_sync_raw_failure( + SseDeserializer deserializer, + ); + + @protected + CloudSyncRawPage? sse_decode_opt_box_autoadd_cloud_sync_raw_page( + SseDeserializer deserializer, + ); + + @protected + CloudSyncRawSystemFields? + sse_decode_opt_box_autoadd_cloud_sync_raw_system_fields( + SseDeserializer deserializer, + ); + + @protected + CloudSyncTransientAttachmentPayload? + sse_decode_opt_box_autoadd_cloud_sync_transient_attachment_payload( + SseDeserializer deserializer, + ); + + @protected + CloudSyncTransientChatPayload? + sse_decode_opt_box_autoadd_cloud_sync_transient_chat_payload( + SseDeserializer deserializer, + ); + + @protected + CloudSyncTransientDeferredReason? + sse_decode_opt_box_autoadd_cloud_sync_transient_deferred_reason( + SseDeserializer deserializer, + ); + + @protected + CloudSyncTransientEntityKind? + sse_decode_opt_box_autoadd_cloud_sync_transient_entity_kind( + SseDeserializer deserializer, + ); + + @protected + CloudSyncTransientFailureCode? + sse_decode_opt_box_autoadd_cloud_sync_transient_failure_code( + SseDeserializer deserializer, + ); + + @protected + CloudSyncTransientGroupPhotoPayload? + sse_decode_opt_box_autoadd_cloud_sync_transient_group_photo_payload( + SseDeserializer deserializer, + ); + + @protected + CloudSyncTransientMessagePayload? + sse_decode_opt_box_autoadd_cloud_sync_transient_message_payload( + SseDeserializer deserializer, + ); + + @protected + CloudSyncTransientMutationKind? + sse_decode_opt_box_autoadd_cloud_sync_transient_mutation_kind( + SseDeserializer deserializer, + ); + + @protected + CloudSyncTransientPayload? + sse_decode_opt_box_autoadd_cloud_sync_transient_payload( + SseDeserializer deserializer, + ); + + @protected + CloudSyncTransientQuarantineReason? + sse_decode_opt_box_autoadd_cloud_sync_transient_quarantine_reason( + SseDeserializer deserializer, + ); + + @protected + CloudSyncTransientReactionKind? + sse_decode_opt_box_autoadd_cloud_sync_transient_reaction_kind( + SseDeserializer deserializer, + ); + + @protected + CloudSyncTransientSnapshot? + sse_decode_opt_box_autoadd_cloud_sync_transient_snapshot( + SseDeserializer deserializer, + ); + + @protected + CloudSyncTransientTombstone? + sse_decode_opt_box_autoadd_cloud_sync_transient_tombstone( + SseDeserializer deserializer, + ); @protected ConversationData? sse_decode_opt_box_autoadd_conversation_data( - SseDeserializer deserializer); + SseDeserializer deserializer, + ); @protected DartBeaconShareInfo? sse_decode_opt_box_autoadd_dart_beacon_share_info( - SseDeserializer deserializer); + SseDeserializer deserializer, + ); @protected ExtensionApp? sse_decode_opt_box_autoadd_extension_app( - SseDeserializer deserializer); + SseDeserializer deserializer, + ); @protected double? sse_decode_opt_box_autoadd_f_64(SseDeserializer deserializer); @@ -4920,11 +6715,13 @@ abstract class RustLibApiImplPlatform extends BaseApiImpl { @protected IMessagePosterRecord? sse_decode_opt_box_autoadd_i_message_poster_record( - SseDeserializer deserializer); + SseDeserializer deserializer, + ); @protected IdmsRequestedSignIn? sse_decode_opt_box_autoadd_idms_requested_sign_in( - SseDeserializer deserializer); + SseDeserializer deserializer, + ); @protected LinkMeta? sse_decode_opt_box_autoadd_link_meta(SseDeserializer deserializer); @@ -4934,24 +6731,29 @@ abstract class RustLibApiImplPlatform extends BaseApiImpl { @protected LoginState? sse_decode_opt_box_autoadd_login_state( - SseDeserializer deserializer); + SseDeserializer deserializer, + ); @protected LPIconMetadata? sse_decode_opt_box_autoadd_lp_icon_metadata( - SseDeserializer deserializer); + SseDeserializer deserializer, + ); @protected LPImageMetadata? sse_decode_opt_box_autoadd_lp_image_metadata( - SseDeserializer deserializer); + SseDeserializer deserializer, + ); @protected LPSpecializationMetadata? - sse_decode_opt_box_autoadd_lp_specialization_metadata( - SseDeserializer deserializer); + sse_decode_opt_box_autoadd_lp_specialization_metadata( + SseDeserializer deserializer, + ); @protected MMCSAttachmentMeta? sse_decode_opt_box_autoadd_mmcs_attachment_meta( - SseDeserializer deserializer); + SseDeserializer deserializer, + ); @protected MMCSFile? sse_decode_opt_box_autoadd_mmcs_file(SseDeserializer deserializer); @@ -4961,85 +6763,105 @@ abstract class RustLibApiImplPlatform extends BaseApiImpl { @protected NumOrString? sse_decode_opt_box_autoadd_num_or_string( - SseDeserializer deserializer); + SseDeserializer deserializer, + ); @protected PartExtension? sse_decode_opt_box_autoadd_part_extension( - SseDeserializer deserializer); + SseDeserializer deserializer, + ); @protected PasswordManagerMetaDataFormerlyShared? - sse_decode_opt_box_autoadd_password_manager_meta_data_formerly_shared( - SseDeserializer deserializer); + sse_decode_opt_box_autoadd_password_manager_meta_data_formerly_shared( + SseDeserializer deserializer, + ); @protected PasswordManagerTotp? sse_decode_opt_box_autoadd_password_manager_totp( - SseDeserializer deserializer); + SseDeserializer deserializer, + ); @protected PosterColor? sse_decode_opt_box_autoadd_poster_color( - SseDeserializer deserializer); + SseDeserializer deserializer, + ); @protected PRPosterContentMaterialStyle? - sse_decode_opt_box_autoadd_pr_poster_content_material_style( - SseDeserializer deserializer); + sse_decode_opt_box_autoadd_pr_poster_content_material_style( + SseDeserializer deserializer, + ); @protected PushMessage? sse_decode_opt_box_autoadd_push_message( - SseDeserializer deserializer); + SseDeserializer deserializer, + ); @protected - ( - SharedPushState, - ApsWatcher - )? sse_decode_opt_box_autoadd_record_shared_push_state_auto_owned_rust_opaque_flutter_rust_bridgefor_generated_rust_auto_opaque_inner_aps_watcher( - SseDeserializer deserializer); + (SharedPushState, ApsWatcher)? + sse_decode_opt_box_autoadd_record_shared_push_state_auto_owned_rust_opaque_flutter_rust_bridgefor_generated_rust_auto_opaque_inner_aps_watcher( + SseDeserializer deserializer, + ); @protected (String, String)? sse_decode_opt_box_autoadd_record_string_string( - SseDeserializer deserializer); + SseDeserializer deserializer, + ); @protected (String, BigInt)? sse_decode_opt_box_autoadd_record_string_u_64( - SseDeserializer deserializer); + SseDeserializer deserializer, + ); @protected RichLinkImageAttachmentSubstitute? - sse_decode_opt_box_autoadd_rich_link_image_attachment_substitute( - SseDeserializer deserializer); + sse_decode_opt_box_autoadd_rich_link_image_attachment_substitute( + SseDeserializer deserializer, + ); @protected ScheduleMode? sse_decode_opt_box_autoadd_schedule_mode( - SseDeserializer deserializer); + SseDeserializer deserializer, + ); @protected ShareProfileMessage? sse_decode_opt_box_autoadd_share_profile_message( - SseDeserializer deserializer); + SseDeserializer deserializer, + ); @protected SharedICloudServices? sse_decode_opt_box_autoadd_shared_i_cloud_services( - SseDeserializer deserializer); + SseDeserializer deserializer, + ); @protected SharedPoster? sse_decode_opt_box_autoadd_shared_poster( - SseDeserializer deserializer); + SseDeserializer deserializer, + ); @protected SharedPushState? sse_decode_opt_box_autoadd_shared_push_state( - SseDeserializer deserializer); + SseDeserializer deserializer, + ); @protected SupportAction? sse_decode_opt_box_autoadd_support_action( - SseDeserializer deserializer); + SseDeserializer deserializer, + ); @protected SupportAlert? sse_decode_opt_box_autoadd_support_alert( - SseDeserializer deserializer); + SseDeserializer deserializer, + ); @protected TypingApp? sse_decode_opt_box_autoadd_typing_app( - SseDeserializer deserializer); + SseDeserializer deserializer, + ); + + @protected + int? sse_decode_opt_box_autoadd_u_16(SseDeserializer deserializer); @protected int? sse_decode_opt_box_autoadd_u_32(SseDeserializer deserializer); @@ -5049,19 +6871,22 @@ abstract class RustLibApiImplPlatform extends BaseApiImpl { @protected UpdateAccountFinish? sse_decode_opt_box_autoadd_update_account_finish( - SseDeserializer deserializer); + SseDeserializer deserializer, + ); @protected List? - sse_decode_opt_list_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerIDSUser( - SseDeserializer deserializer); + sse_decode_opt_list_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerIDSUser( + SseDeserializer deserializer, + ); @protected List? sse_decode_opt_list_String(SseDeserializer deserializer); @protected List? sse_decode_opt_list_message_target( - SseDeserializer deserializer); + SseDeserializer deserializer, + ); @protected Uint8List? sse_decode_opt_list_prim_u_8_strict(SseDeserializer deserializer); @@ -5074,62 +6899,75 @@ abstract class RustLibApiImplPlatform extends BaseApiImpl { @protected PasswordManagerAltDomain sse_decode_password_manager_alt_domain( - SseDeserializer deserializer); + SseDeserializer deserializer, + ); @protected PasswordManagerMeta sse_decode_password_manager_meta( - SseDeserializer deserializer); + SseDeserializer deserializer, + ); @protected PasswordManagerMetaChange sse_decode_password_manager_meta_change( - SseDeserializer deserializer); + SseDeserializer deserializer, + ); @protected PasswordManagerMetaData sse_decode_password_manager_meta_data( - SseDeserializer deserializer); + SseDeserializer deserializer, + ); @protected PasswordManagerMetaDataCtx sse_decode_password_manager_meta_data_ctx( - SseDeserializer deserializer); + SseDeserializer deserializer, + ); @protected PasswordManagerMetaDataFormerlyShared - sse_decode_password_manager_meta_data_formerly_shared( - SseDeserializer deserializer); + sse_decode_password_manager_meta_data_formerly_shared( + SseDeserializer deserializer, + ); @protected PasswordManagerTotp sse_decode_password_manager_totp( - SseDeserializer deserializer); + SseDeserializer deserializer, + ); @protected PasswordRawEntry sse_decode_password_raw_entry(SseDeserializer deserializer); @protected PermanentDeleteMessage sse_decode_permanent_delete_message( - SseDeserializer deserializer); + SseDeserializer deserializer, + ); @protected PhotoPosterContents sse_decode_photo_poster_contents( - SseDeserializer deserializer); + SseDeserializer deserializer, + ); @protected PhotoPosterContentsFrame sse_decode_photo_poster_contents_frame( - SseDeserializer deserializer); + SseDeserializer deserializer, + ); @protected PhotoPosterContentsSize sse_decode_photo_poster_contents_size( - SseDeserializer deserializer); + SseDeserializer deserializer, + ); @protected PhotoPosterLayer sse_decode_photo_poster_layer(SseDeserializer deserializer); @protected PhotoPosterLayout sse_decode_photo_poster_layout( - SseDeserializer deserializer); + SseDeserializer deserializer, + ); @protected PhotoPosterProperties sse_decode_photo_poster_properties( - SseDeserializer deserializer); + SseDeserializer deserializer, + ); @protected PollResult sse_decode_poll_result(SseDeserializer deserializer); @@ -5151,21 +6989,23 @@ abstract class RustLibApiImplPlatform extends BaseApiImpl { @protected PRPosterContentMaterialStyle sse_decode_pr_poster_content_material_style( - SseDeserializer deserializer); + SseDeserializer deserializer, + ); @protected PRPosterSystemTimeFontConfiguration - sse_decode_pr_poster_system_time_font_configuration( - SseDeserializer deserializer); + sse_decode_pr_poster_system_time_font_configuration( + SseDeserializer deserializer, + ); @protected PRPosterTitleStyleConfiguration - sse_decode_pr_poster_title_style_configuration( - SseDeserializer deserializer); + sse_decode_pr_poster_title_style_configuration(SseDeserializer deserializer); @protected PrivateDeviceInfo sse_decode_private_device_info( - SseDeserializer deserializer); + SseDeserializer deserializer, + ); @protected ProvisionedFlavor sse_decode_provisioned_flavor(SseDeserializer deserializer); @@ -5186,259 +7026,267 @@ abstract class RustLibApiImplPlatform extends BaseApiImpl { Reaction sse_decode_reaction(SseDeserializer deserializer); @protected - ( - ApsConnection, - PushError? - ) sse_decode_record_auto_owned_rust_opaque_flutter_rust_bridgefor_generated_rust_auto_opaque_inner_aps_connection_opt_box_autoadd_auto_owned_rust_opaque_flutter_rust_bridgefor_generated_rust_auto_opaque_inner_push_error( - SseDeserializer deserializer); + (ApsConnection, PushError?) + sse_decode_record_auto_owned_rust_opaque_flutter_rust_bridgefor_generated_rust_auto_opaque_inner_aps_connection_opt_box_autoadd_auto_owned_rust_opaque_flutter_rust_bridgefor_generated_rust_auto_opaque_inner_push_error( + SseDeserializer deserializer, + ); @protected - ( - ArcMutexAppleAccountDefaultAnisetteProvider, - LoginState - ) sse_decode_record_auto_owned_rust_opaque_flutter_rust_bridgefor_generated_rust_auto_opaque_inner_arc_mutex_apple_account_default_anisette_provider_login_state( - SseDeserializer deserializer); + (ArcMutexAppleAccountDefaultAnisetteProvider, LoginState) + sse_decode_record_auto_owned_rust_opaque_flutter_rust_bridgefor_generated_rust_auto_opaque_inner_arc_mutex_apple_account_default_anisette_provider_login_state( + SseDeserializer deserializer, + ); @protected - ( - ArcSharedPushState, - SharedPushState - ) sse_decode_record_auto_owned_rust_opaque_flutter_rust_bridgefor_generated_rust_auto_opaque_inner_arc_shared_push_state_shared_push_state( - SseDeserializer deserializer); + (ArcSharedPushState, SharedPushState) + sse_decode_record_auto_owned_rust_opaque_flutter_rust_bridgefor_generated_rust_auto_opaque_inner_arc_shared_push_state_shared_push_state( + SseDeserializer deserializer, + ); @protected - ( - CircleClientSessionDefaultAnisetteProvider, - LoginState, - String? - ) sse_decode_record_auto_owned_rust_opaque_flutter_rust_bridgefor_generated_rust_auto_opaque_inner_circle_client_session_default_anisette_provider_login_state_opt_string( - SseDeserializer deserializer); + (CircleClientSessionDefaultAnisetteProvider, LoginState, String?) + sse_decode_record_auto_owned_rust_opaque_flutter_rust_bridgefor_generated_rust_auto_opaque_inner_circle_client_session_default_anisette_provider_login_state_opt_string( + SseDeserializer deserializer, + ); @protected - ( - Sender, - ArcSenderPushMessage, - ApsWatcher - ) sse_decode_record_auto_owned_rust_opaque_flutter_rust_bridgefor_generated_rust_auto_opaque_inner_sender_auto_owned_rust_opaque_flutter_rust_bridgefor_generated_rust_auto_opaque_inner_arc_sender_push_message_auto_owned_rust_opaque_flutter_rust_bridgefor_generated_rust_auto_opaque_inner_aps_watcher( - SseDeserializer deserializer); + (Sender, ArcSenderPushMessage, ApsWatcher) + sse_decode_record_auto_owned_rust_opaque_flutter_rust_bridgefor_generated_rust_auto_opaque_inner_sender_auto_owned_rust_opaque_flutter_rust_bridgefor_generated_rust_auto_opaque_inner_arc_sender_push_message_auto_owned_rust_opaque_flutter_rust_bridgefor_generated_rust_auto_opaque_inner_aps_watcher( + SseDeserializer deserializer, + ); @protected - ( - Uint8List, - Map, - int - ) sse_decode_record_list_prim_u_8_strict_map_string_opt_box_autoadd_cloud_attachment_i_32( - SseDeserializer deserializer); + (Uint8List, Map, int) + sse_decode_record_list_prim_u_8_strict_map_string_opt_box_autoadd_cloud_attachment_i_32( + SseDeserializer deserializer, + ); @protected - ( - Uint8List, - Map, - int - ) sse_decode_record_list_prim_u_8_strict_map_string_opt_box_autoadd_cloud_chat_i_32( - SseDeserializer deserializer); + (Uint8List, Map, int) + sse_decode_record_list_prim_u_8_strict_map_string_opt_box_autoadd_cloud_chat_i_32( + SseDeserializer deserializer, + ); @protected - ( - Uint8List, - Map, - int - ) sse_decode_record_list_prim_u_8_strict_map_string_opt_box_autoadd_cloud_message_i_32( - SseDeserializer deserializer); + (Uint8List, Map, int) + sse_decode_record_list_prim_u_8_strict_map_string_opt_box_autoadd_cloud_message_i_32( + SseDeserializer deserializer, + ); @protected (Uint8List, Uint8List?) - sse_decode_record_list_prim_u_8_strict_opt_list_prim_u_8_strict( - SseDeserializer deserializer); + sse_decode_record_list_prim_u_8_strict_opt_list_prim_u_8_strict( + SseDeserializer deserializer, + ); @protected (List, List) - sse_decode_record_list_shared_album_list_string( - SseDeserializer deserializer); + sse_decode_record_list_shared_album_list_string(SseDeserializer deserializer); @protected (List, LoginState?) - sse_decode_record_list_trusted_phone_number_opt_box_autoadd_login_state( - SseDeserializer deserializer); + sse_decode_record_list_trusted_phone_number_opt_box_autoadd_login_state( + SseDeserializer deserializer, + ); @protected - ( - LoginState, - IdsUser? - ) sse_decode_record_login_state_opt_box_autoadd_auto_owned_rust_opaque_flutter_rust_bridgefor_generated_rust_auto_opaque_inner_ids_user( - SseDeserializer deserializer); + (LoginState, IdsUser?) + sse_decode_record_login_state_opt_box_autoadd_auto_owned_rust_opaque_flutter_rust_bridgefor_generated_rust_auto_opaque_inner_ids_user( + SseDeserializer deserializer, + ); @protected - ( - Map, - (String, BigInt)? - ) sse_decode_record_map_string_sync_status_opt_box_autoadd_record_string_u_64( - SseDeserializer deserializer); + (Map, (String, BigInt)?) + sse_decode_record_map_string_sync_status_opt_box_autoadd_record_string_u_64( + SseDeserializer deserializer, + ); @protected - ( - List?, - SupportAlert? - ) sse_decode_record_opt_list_auto_owned_rust_opaque_flutter_rust_bridgefor_generated_rust_auto_opaque_inner_ids_user_opt_box_autoadd_support_alert( - SseDeserializer deserializer); + (List?, SupportAlert?) + sse_decode_record_opt_list_auto_owned_rust_opaque_flutter_rust_bridgefor_generated_rust_auto_opaque_inner_ids_user_opt_box_autoadd_support_alert( + SseDeserializer deserializer, + ); @protected (String?, Passkey) sse_decode_record_opt_string_passkey( - SseDeserializer deserializer); + SseDeserializer deserializer, + ); @protected (String?, PasswordManagerMeta) - sse_decode_record_opt_string_password_manager_meta( - SseDeserializer deserializer); + sse_decode_record_opt_string_password_manager_meta( + SseDeserializer deserializer, + ); @protected (String?, PasswordRawEntry) sse_decode_record_opt_string_password_raw_entry( - SseDeserializer deserializer); + SseDeserializer deserializer, + ); @protected (String?, WifiPassword) sse_decode_record_opt_string_wifi_password( - SseDeserializer deserializer); + SseDeserializer deserializer, + ); @protected - ( - SharedPushState, - ApsWatcher - ) sse_decode_record_shared_push_state_auto_owned_rust_opaque_flutter_rust_bridgefor_generated_rust_auto_opaque_inner_aps_watcher( - SseDeserializer deserializer); + (SharedPushState, ApsWatcher) + sse_decode_record_shared_push_state_auto_owned_rust_opaque_flutter_rust_bridgefor_generated_rust_auto_opaque_inner_aps_watcher( + SseDeserializer deserializer, + ); @protected - ( - String, - Asset - ) sse_decode_record_string_auto_owned_rust_opaque_flutter_rust_bridgefor_generated_rust_auto_opaque_inner_asset( - SseDeserializer deserializer); + (String, Asset) + sse_decode_record_string_auto_owned_rust_opaque_flutter_rust_bridgefor_generated_rust_auto_opaque_inner_asset( + SseDeserializer deserializer, + ); @protected - ( - String, - StCollapsedValue - ) sse_decode_record_string_auto_owned_rust_opaque_flutter_rust_bridgefor_generated_rust_auto_opaque_inner_st_collapsed_value( - SseDeserializer deserializer); + (String, StCollapsedValue) + sse_decode_record_string_auto_owned_rust_opaque_flutter_rust_bridgefor_generated_rust_auto_opaque_inner_st_collapsed_value( + SseDeserializer deserializer, + ); @protected (String, bool) sse_decode_record_string_bool(SseDeserializer deserializer); @protected (String, int) sse_decode_record_string_casted_primitive_u_64( - SseDeserializer deserializer); + SseDeserializer deserializer, + ); @protected (String, CloudAttachment) sse_decode_record_string_cloud_attachment( - SseDeserializer deserializer); + SseDeserializer deserializer, + ); @protected (String, CloudChat) sse_decode_record_string_cloud_chat( - SseDeserializer deserializer); + SseDeserializer deserializer, + ); @protected (String, CloudMessage) sse_decode_record_string_cloud_message( - SseDeserializer deserializer); + SseDeserializer deserializer, + ); @protected (String, FTParticipant) sse_decode_record_string_ft_participant( - SseDeserializer deserializer); + SseDeserializer deserializer, + ); @protected (String, GroupSummary) sse_decode_record_string_group_summary( - SseDeserializer deserializer); + SseDeserializer deserializer, + ); @protected (String, List) sse_decode_record_string_list_message_edit( - SseDeserializer deserializer); + SseDeserializer deserializer, + ); @protected (String, Uint8List) sse_decode_record_string_list_prim_u_8_strict( - SseDeserializer deserializer); + SseDeserializer deserializer, + ); @protected - ( - String, - Map, - Map - ) sse_decode_record_string_map_string_group_summary_map_string_share_invite_content_data( - SseDeserializer deserializer); + (String, Map, Map) + sse_decode_record_string_map_string_group_summary_map_string_share_invite_content_data( + SseDeserializer deserializer, + ); @protected (String, MessageEditRange) sse_decode_record_string_message_edit_range( - SseDeserializer deserializer); + SseDeserializer deserializer, + ); @protected (String, CloudAttachment?) - sse_decode_record_string_opt_box_autoadd_cloud_attachment( - SseDeserializer deserializer); + sse_decode_record_string_opt_box_autoadd_cloud_attachment( + SseDeserializer deserializer, + ); @protected (String, CloudChat?) sse_decode_record_string_opt_box_autoadd_cloud_chat( - SseDeserializer deserializer); + SseDeserializer deserializer, + ); @protected (String, CloudMessage?) - sse_decode_record_string_opt_box_autoadd_cloud_message( - SseDeserializer deserializer); + sse_decode_record_string_opt_box_autoadd_cloud_message( + SseDeserializer deserializer, + ); @protected (String, PasswordManagerMetaDataCtx) - sse_decode_record_string_password_manager_meta_data_ctx( - SseDeserializer deserializer); + sse_decode_record_string_password_manager_meta_data_ctx( + SseDeserializer deserializer, + ); @protected (String, (String?, Passkey)) - sse_decode_record_string_record_opt_string_passkey( - SseDeserializer deserializer); + sse_decode_record_string_record_opt_string_passkey( + SseDeserializer deserializer, + ); @protected (String, (String?, PasswordManagerMeta)) - sse_decode_record_string_record_opt_string_password_manager_meta( - SseDeserializer deserializer); + sse_decode_record_string_record_opt_string_password_manager_meta( + SseDeserializer deserializer, + ); @protected (String, (String?, PasswordRawEntry)) - sse_decode_record_string_record_opt_string_password_raw_entry( - SseDeserializer deserializer); + sse_decode_record_string_record_opt_string_password_raw_entry( + SseDeserializer deserializer, + ); @protected (String, (String?, WifiPassword)) - sse_decode_record_string_record_opt_string_wifi_password( - SseDeserializer deserializer); + sse_decode_record_string_record_opt_string_wifi_password( + SseDeserializer deserializer, + ); @protected (String, ShareInviteContentData) - sse_decode_record_string_share_invite_content_data( - SseDeserializer deserializer); + sse_decode_record_string_share_invite_content_data( + SseDeserializer deserializer, + ); @protected (String, SharedPushState) sse_decode_record_string_shared_push_state( - SseDeserializer deserializer); + SseDeserializer deserializer, + ); @protected (String, StatusKitPersonalConfig) - sse_decode_record_string_status_kit_personal_config( - SseDeserializer deserializer); + sse_decode_record_string_status_kit_personal_config( + SseDeserializer deserializer, + ); @protected (String, String) sse_decode_record_string_string( - SseDeserializer deserializer); + SseDeserializer deserializer, + ); @protected (String, SyncStatus) sse_decode_record_string_sync_status( - SseDeserializer deserializer); + SseDeserializer deserializer, + ); @protected (String, BigInt) sse_decode_record_string_u_64(SseDeserializer deserializer); @protected (String, UpdateAccountFinish) sse_decode_record_string_update_account_finish( - SseDeserializer deserializer); + SseDeserializer deserializer, + ); @protected (int, NSDictionaryTypedCoder) - sse_decode_record_u_32_ns_dictionary_typed_coder( - SseDeserializer deserializer); + sse_decode_record_u_32_ns_dictionary_typed_coder( + SseDeserializer deserializer, + ); @protected (int, BigInt) sse_decode_record_u_32_u_64(SseDeserializer deserializer); @@ -5454,30 +7302,35 @@ abstract class RustLibApiImplPlatform extends BaseApiImpl { @protected RichLinkImageAttachmentSubstitute - sse_decode_rich_link_image_attachment_substitute( - SseDeserializer deserializer); + sse_decode_rich_link_image_attachment_substitute( + SseDeserializer deserializer, + ); @protected ScheduleMode sse_decode_schedule_mode(SseDeserializer deserializer); @protected SetTranscriptBackgroundMessage sse_decode_set_transcript_background_message( - SseDeserializer deserializer); + SseDeserializer deserializer, + ); @protected ShareInviteContentData sse_decode_share_invite_content_data( - SseDeserializer deserializer); + SseDeserializer deserializer, + ); @protected ShareProfileMessage sse_decode_share_profile_message( - SseDeserializer deserializer); + SseDeserializer deserializer, + ); @protected SharedAlbum sse_decode_shared_album(SseDeserializer deserializer); @protected SharedICloudServices sse_decode_shared_i_cloud_services( - SseDeserializer deserializer); + SseDeserializer deserializer, + ); @protected SharedPoster sse_decode_shared_poster(SseDeserializer deserializer); @@ -5487,21 +7340,24 @@ abstract class RustLibApiImplPlatform extends BaseApiImpl { @protected SimplifiedIncomingCallPoster sse_decode_simplified_incoming_call_poster( - SseDeserializer deserializer); + SseDeserializer deserializer, + ); @protected SimplifiedPoster sse_decode_simplified_poster(SseDeserializer deserializer); @protected SimplifiedTranscriptPoster sse_decode_simplified_transcript_poster( - SseDeserializer deserializer); + SseDeserializer deserializer, + ); @protected StatusKitMessage sse_decode_status_kit_message(SseDeserializer deserializer); @protected StatusKitPersonalConfig sse_decode_status_kit_personal_config( - SseDeserializer deserializer); + SseDeserializer deserializer, + ); @protected SupportAction sse_decode_support_action(SseDeserializer deserializer); @@ -5526,18 +7382,23 @@ abstract class RustLibApiImplPlatform extends BaseApiImpl { @protected TranscriptDynamicUserData sse_decode_transcript_dynamic_user_data( - SseDeserializer deserializer); + SseDeserializer deserializer, + ); @protected TransferProgress sse_decode_transfer_progress(SseDeserializer deserializer); @protected TrustedPhoneNumber sse_decode_trusted_phone_number( - SseDeserializer deserializer); + SseDeserializer deserializer, + ); @protected TypingApp sse_decode_typing_app(SseDeserializer deserializer); + @protected + int sse_decode_u_16(SseDeserializer deserializer); + @protected int sse_decode_u_32(SseDeserializer deserializer); @@ -5558,19 +7419,23 @@ abstract class RustLibApiImplPlatform extends BaseApiImpl { @protected UpdateAccountFinish sse_decode_update_account_finish( - SseDeserializer deserializer); + SseDeserializer deserializer, + ); @protected UpdateExtensionMessage sse_decode_update_extension_message( - SseDeserializer deserializer); + SseDeserializer deserializer, + ); @protected UpdateProfileMessage sse_decode_update_profile_message( - SseDeserializer deserializer); + SseDeserializer deserializer, + ); @protected UpdateProfileSharingMessage sse_decode_update_profile_sharing_message( - SseDeserializer deserializer); + SseDeserializer deserializer, + ); @protected BigInt sse_decode_usize(SseDeserializer deserializer); @@ -5586,517 +7451,695 @@ abstract class RustLibApiImplPlatform extends BaseApiImpl { @protected void sse_encode_AnyhowException( - AnyhowException self, SseSerializer serializer); + AnyhowException self, + SseSerializer serializer, + ); + + @protected + void + sse_encode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerAPSConnection( + ApsConnection self, + SseSerializer serializer, + ); + + @protected + void + sse_encode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerAPSState( + ApsState self, + SseSerializer serializer, + ); @protected void - sse_encode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerAPSConnection( - ApsConnection self, SseSerializer serializer); + sse_encode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerAPSWatcher( + ApsWatcher self, + SseSerializer serializer, + ); @protected void - sse_encode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerAPSState( - ApsState self, SseSerializer serializer); + sse_encode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcAnisetteClientDefaultAnisetteProvider( + ArcAnisetteClientDefaultAnisetteProvider self, + SseSerializer serializer, + ); @protected void - sse_encode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerAPSWatcher( - ApsWatcher self, SseSerializer serializer); + sse_encode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcCloudKitClientDefaultAnisetteProvider( + ArcCloudKitClientDefaultAnisetteProvider self, + SseSerializer serializer, + ); @protected void - sse_encode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcAnisetteClientDefaultAnisetteProvider( - ArcAnisetteClientDefaultAnisetteProvider self, - SseSerializer serializer); + sse_encode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcCloudMessagesClientDefaultAnisetteProvider( + ArcCloudMessagesClientDefaultAnisetteProvider self, + SseSerializer serializer, + ); @protected void - sse_encode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcCloudKitClientDefaultAnisetteProvider( - ArcCloudKitClientDefaultAnisetteProvider self, - SseSerializer serializer); + sse_encode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcFTClient( + ArcFtClient self, + SseSerializer serializer, + ); @protected void - sse_encode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcCloudMessagesClientDefaultAnisetteProvider( - ArcCloudMessagesClientDefaultAnisetteProvider self, - SseSerializer serializer); + sse_encode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcFindMyClientDefaultAnisetteProvider( + ArcFindMyClientDefaultAnisetteProvider self, + SseSerializer serializer, + ); @protected void - sse_encode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcFTClient( - ArcFtClient self, SseSerializer serializer); + sse_encode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcIMClient( + ArcImClient self, + SseSerializer serializer, + ); @protected void - sse_encode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcFindMyClientDefaultAnisetteProvider( - ArcFindMyClientDefaultAnisetteProvider self, - SseSerializer serializer); + sse_encode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcIdmsAuthListener( + ArcIdmsAuthListener self, + SseSerializer serializer, + ); @protected void - sse_encode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcIMClient( - ArcImClient self, SseSerializer serializer); + sse_encode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcKeychainClientDefaultAnisetteProvider( + ArcKeychainClientDefaultAnisetteProvider self, + SseSerializer serializer, + ); @protected void - sse_encode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcIdmsAuthListener( - ArcIdmsAuthListener self, SseSerializer serializer); + sse_encode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcMutexAppleAccountDefaultAnisetteProvider( + ArcMutexAppleAccountDefaultAnisetteProvider self, + SseSerializer serializer, + ); @protected void - sse_encode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcKeychainClientDefaultAnisetteProvider( - ArcKeychainClientDefaultAnisetteProvider self, - SseSerializer serializer); + sse_encode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcMutexOptionCircleClientSessionDefaultAnisetteProvider( + ArcMutexOptionCircleClientSessionDefaultAnisetteProvider self, + SseSerializer serializer, + ); @protected void - sse_encode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcMutexAppleAccountDefaultAnisetteProvider( - ArcMutexAppleAccountDefaultAnisetteProvider self, - SseSerializer serializer); + sse_encode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcMutexVecActiveCircleSession( + ArcMutexVecActiveCircleSession self, + SseSerializer serializer, + ); @protected void - sse_encode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcMutexOptionCircleClientSessionDefaultAnisetteProvider( - ArcMutexOptionCircleClientSessionDefaultAnisetteProvider self, - SseSerializer serializer); + sse_encode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcPasswordManagerDefaultAnisetteProvider( + ArcPasswordManagerDefaultAnisetteProvider self, + SseSerializer serializer, + ); @protected void - sse_encode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcMutexVecActiveCircleSession( - ArcMutexVecActiveCircleSession self, SseSerializer serializer); + sse_encode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcProfilesClientDefaultAnisetteProvider( + ArcProfilesClientDefaultAnisetteProvider self, + SseSerializer serializer, + ); @protected void - sse_encode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcPasswordManagerDefaultAnisetteProvider( - ArcPasswordManagerDefaultAnisetteProvider self, - SseSerializer serializer); + sse_encode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcSenderPushMessage( + ArcSenderPushMessage self, + SseSerializer serializer, + ); @protected void - sse_encode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcProfilesClientDefaultAnisetteProvider( - ArcProfilesClientDefaultAnisetteProvider self, - SseSerializer serializer); + sse_encode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcSharedPushState( + ArcSharedPushState self, + SseSerializer serializer, + ); @protected void - sse_encode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcSenderPushMessage( - ArcSenderPushMessage self, SseSerializer serializer); + sse_encode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcStatusKitClientDefaultAnisetteProvider( + ArcStatusKitClientDefaultAnisetteProvider self, + SseSerializer serializer, + ); @protected void - sse_encode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcSharedPushState( - ArcSharedPushState self, SseSerializer serializer); + sse_encode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcTokenProviderDefaultAnisetteProvider( + ArcTokenProviderDefaultAnisetteProvider self, + SseSerializer serializer, + ); @protected void - sse_encode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcStatusKitClientDefaultAnisetteProvider( - ArcStatusKitClientDefaultAnisetteProvider self, - SseSerializer serializer); + sse_encode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerAsset( + Asset self, + SseSerializer serializer, + ); @protected void - sse_encode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcTokenProviderDefaultAnisetteProvider( - ArcTokenProviderDefaultAnisetteProvider self, - SseSerializer serializer); + sse_encode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerChannelInterestToken( + ChannelInterestToken self, + SseSerializer serializer, + ); @protected void - sse_encode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerAsset( - Asset self, SseSerializer serializer); + sse_encode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerCircleClientSessionDefaultAnisetteProvider( + CircleClientSessionDefaultAnisetteProvider self, + SseSerializer serializer, + ); @protected void - sse_encode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerChannelInterestToken( - ChannelInterestToken self, SseSerializer serializer); + sse_encode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerCloudSyncPreparedMessageCreateHandle( + CloudSyncPreparedMessageCreateHandle self, + SseSerializer serializer, + ); @protected void - sse_encode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerCircleClientSessionDefaultAnisetteProvider( - CircleClientSessionDefaultAnisetteProvider self, - SseSerializer serializer); + sse_encode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerConversationLink( + ConversationLink self, + SseSerializer serializer, + ); @protected void - sse_encode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerConversationLink( - ConversationLink self, SseSerializer serializer); + sse_encode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerConversationParticipant( + ConversationParticipant self, + SseSerializer serializer, + ); @protected void - sse_encode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerConversationParticipant( - ConversationParticipant self, SseSerializer serializer); + sse_encode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerDate( + Date self, + SseSerializer serializer, + ); @protected void - sse_encode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerDate( - Date self, SseSerializer serializer); + sse_encode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerEscrowData( + EscrowData self, + SseSerializer serializer, + ); @protected void - sse_encode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerEscrowData( - EscrowData self, SseSerializer serializer); + sse_encode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerFindMyFriendsClientDefaultAnisetteProvider( + FindMyFriendsClientDefaultAnisetteProvider self, + SseSerializer serializer, + ); @protected void - sse_encode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerFindMyFriendsClientDefaultAnisetteProvider( - FindMyFriendsClientDefaultAnisetteProvider self, - SseSerializer serializer); + sse_encode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerFindMyPhoneClientDefaultAnisetteProvider( + FindMyPhoneClientDefaultAnisetteProvider self, + SseSerializer serializer, + ); @protected void - sse_encode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerFindMyPhoneClientDefaultAnisetteProvider( - FindMyPhoneClientDefaultAnisetteProvider self, - SseSerializer serializer); + sse_encode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerGZipWrapperAttachmentMeta( + GZipWrapperAttachmentMeta self, + SseSerializer serializer, + ); @protected void - sse_encode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerGZipWrapperAttachmentMeta( - GZipWrapperAttachmentMeta self, SseSerializer serializer); + sse_encode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerGZipWrapperChatProto( + GZipWrapperChatProto self, + SseSerializer serializer, + ); @protected void - sse_encode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerGZipWrapperChatProto( - GZipWrapperChatProto self, SseSerializer serializer); + sse_encode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerGZipWrapperMessageProto( + GZipWrapperMessageProto self, + SseSerializer serializer, + ); @protected void - sse_encode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerGZipWrapperMessageProto( - GZipWrapperMessageProto self, SseSerializer serializer); + sse_encode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerGZipWrapperMessageProto2( + GZipWrapperMessageProto2 self, + SseSerializer serializer, + ); @protected void - sse_encode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerGZipWrapperMessageProto2( - GZipWrapperMessageProto2 self, SseSerializer serializer); + sse_encode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerGZipWrapperMessageProto3( + GZipWrapperMessageProto3 self, + SseSerializer serializer, + ); @protected void - sse_encode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerGZipWrapperMessageProto3( - GZipWrapperMessageProto3 self, SseSerializer serializer); + sse_encode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerGZipWrapperMessageProto4( + GZipWrapperMessageProto4 self, + SseSerializer serializer, + ); @protected void - sse_encode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerGZipWrapperMessageProto4( - GZipWrapperMessageProto4 self, SseSerializer serializer); + sse_encode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerIDSNGMIdentity( + IdsngmIdentity self, + SseSerializer serializer, + ); @protected void - sse_encode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerIDSNGMIdentity( - IdsngmIdentity self, SseSerializer serializer); + sse_encode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerIDSUser( + IdsUser self, + SseSerializer serializer, + ); @protected void - sse_encode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerIDSUser( - IdsUser self, SseSerializer serializer); + sse_encode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerJoinedOSConfig( + JoinedOsConfig self, + SseSerializer serializer, + ); @protected void - sse_encode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerJoinedOSConfig( - JoinedOsConfig self, SseSerializer serializer); + sse_encode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerLocationReport( + LocationReport self, + SseSerializer serializer, + ); @protected void - sse_encode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerLocationReport( - LocationReport self, SseSerializer serializer); + sse_encode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerMessageFlags( + MessageFlags self, + SseSerializer serializer, + ); @protected void - sse_encode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerMessageFlags( - MessageFlags self, SseSerializer serializer); + sse_encode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerNSArrayLPIconMetadata( + NsArrayLpIconMetadata self, + SseSerializer serializer, + ); @protected void - sse_encode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerNSArrayLPIconMetadata( - NsArrayLpIconMetadata self, SseSerializer serializer); + sse_encode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerNSArrayLPImageMetadata( + NsArrayLpImageMetadata self, + SseSerializer serializer, + ); @protected void - sse_encode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerNSArrayLPImageMetadata( - NsArrayLpImageMetadata self, SseSerializer serializer); + sse_encode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerPushError( + PushError self, + SseSerializer serializer, + ); @protected void - sse_encode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerPushError( - PushError self, SseSerializer serializer); + sse_encode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerReceiverAPSMessage( + ReceiverApsMessage self, + SseSerializer serializer, + ); @protected void - sse_encode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerReceiverAPSMessage( - ReceiverApsMessage self, SseSerializer serializer); + sse_encode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerSavedHardwareState( + SavedHardwareState self, + SseSerializer serializer, + ); @protected void - sse_encode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerSavedHardwareState( - SavedHardwareState self, SseSerializer serializer); + sse_encode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerSender( + Sender self, + SseSerializer serializer, + ); @protected void - sse_encode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerSender( - Sender self, SseSerializer serializer); + sse_encode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerStCollapsedValue( + StCollapsedValue self, + SseSerializer serializer, + ); @protected void - sse_encode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerStCollapsedValue( - StCollapsedValue self, SseSerializer serializer); + sse_encode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerSyncManagerDefaultAnisetteProviderMyFilePackager( + SyncManagerDefaultAnisetteProviderMyFilePackager self, + SseSerializer serializer, + ); @protected void - sse_encode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerSyncManagerDefaultAnisetteProviderMyFilePackager( - SyncManagerDefaultAnisetteProviderMyFilePackager self, - SseSerializer serializer); + sse_encode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerSystemTime( + SystemTime self, + SseSerializer serializer, + ); @protected void - sse_encode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerSystemTime( - SystemTime self, SseSerializer serializer); + sse_encode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerVerifyBody( + VerifyBody self, + SseSerializer serializer, + ); @protected void - sse_encode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerVerifyBody( - VerifyBody self, SseSerializer serializer); + sse_encode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerViableBottle( + ViableBottle self, + SseSerializer serializer, + ); @protected void - sse_encode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerViableBottle( - ViableBottle self, SseSerializer serializer); + sse_encode_Auto_RefMut_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerAPSWatcher( + ApsWatcher self, + SseSerializer serializer, + ); @protected void - sse_encode_Auto_RefMut_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerAPSWatcher( - ApsWatcher self, SseSerializer serializer); + sse_encode_Auto_RefMut_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerCircleClientSessionDefaultAnisetteProvider( + CircleClientSessionDefaultAnisetteProvider self, + SseSerializer serializer, + ); @protected void - sse_encode_Auto_RefMut_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerCircleClientSessionDefaultAnisetteProvider( - CircleClientSessionDefaultAnisetteProvider self, - SseSerializer serializer); + sse_encode_Auto_RefMut_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerFindMyFriendsClientDefaultAnisetteProvider( + FindMyFriendsClientDefaultAnisetteProvider self, + SseSerializer serializer, + ); @protected void - sse_encode_Auto_RefMut_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerFindMyFriendsClientDefaultAnisetteProvider( - FindMyFriendsClientDefaultAnisetteProvider self, - SseSerializer serializer); + sse_encode_Auto_RefMut_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerFindMyPhoneClientDefaultAnisetteProvider( + FindMyPhoneClientDefaultAnisetteProvider self, + SseSerializer serializer, + ); @protected void - sse_encode_Auto_RefMut_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerFindMyPhoneClientDefaultAnisetteProvider( - FindMyPhoneClientDefaultAnisetteProvider self, - SseSerializer serializer); + sse_encode_Auto_RefMut_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerLocationReport( + LocationReport self, + SseSerializer serializer, + ); @protected void - sse_encode_Auto_RefMut_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerLocationReport( - LocationReport self, SseSerializer serializer); + sse_encode_Auto_RefMut_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerReceiverAPSMessage( + ReceiverApsMessage self, + SseSerializer serializer, + ); @protected void - sse_encode_Auto_RefMut_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerReceiverAPSMessage( - ReceiverApsMessage self, SseSerializer serializer); + sse_encode_Auto_RefMut_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerSavedHardwareState( + SavedHardwareState self, + SseSerializer serializer, + ); @protected void - sse_encode_Auto_RefMut_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerSavedHardwareState( - SavedHardwareState self, SseSerializer serializer); + sse_encode_Auto_RefMut_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerViableBottle( + ViableBottle self, + SseSerializer serializer, + ); @protected void - sse_encode_Auto_RefMut_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerViableBottle( - ViableBottle self, SseSerializer serializer); + sse_encode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerAPSConnection( + ApsConnection self, + SseSerializer serializer, + ); @protected void - sse_encode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerAPSConnection( - ApsConnection self, SseSerializer serializer); + sse_encode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcAnisetteClientDefaultAnisetteProvider( + ArcAnisetteClientDefaultAnisetteProvider self, + SseSerializer serializer, + ); @protected void - sse_encode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcAnisetteClientDefaultAnisetteProvider( - ArcAnisetteClientDefaultAnisetteProvider self, - SseSerializer serializer); + sse_encode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcCloudKitClientDefaultAnisetteProvider( + ArcCloudKitClientDefaultAnisetteProvider self, + SseSerializer serializer, + ); @protected void - sse_encode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcCloudKitClientDefaultAnisetteProvider( - ArcCloudKitClientDefaultAnisetteProvider self, - SseSerializer serializer); + sse_encode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcCloudMessagesClientDefaultAnisetteProvider( + ArcCloudMessagesClientDefaultAnisetteProvider self, + SseSerializer serializer, + ); @protected void - sse_encode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcCloudMessagesClientDefaultAnisetteProvider( - ArcCloudMessagesClientDefaultAnisetteProvider self, - SseSerializer serializer); + sse_encode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcFTClient( + ArcFtClient self, + SseSerializer serializer, + ); @protected void - sse_encode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcFTClient( - ArcFtClient self, SseSerializer serializer); + sse_encode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcFindMyClientDefaultAnisetteProvider( + ArcFindMyClientDefaultAnisetteProvider self, + SseSerializer serializer, + ); @protected void - sse_encode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcFindMyClientDefaultAnisetteProvider( - ArcFindMyClientDefaultAnisetteProvider self, - SseSerializer serializer); + sse_encode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcIMClient( + ArcImClient self, + SseSerializer serializer, + ); @protected void - sse_encode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcIMClient( - ArcImClient self, SseSerializer serializer); + sse_encode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcIdmsAuthListener( + ArcIdmsAuthListener self, + SseSerializer serializer, + ); @protected void - sse_encode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcIdmsAuthListener( - ArcIdmsAuthListener self, SseSerializer serializer); + sse_encode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcKeychainClientDefaultAnisetteProvider( + ArcKeychainClientDefaultAnisetteProvider self, + SseSerializer serializer, + ); @protected void - sse_encode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcKeychainClientDefaultAnisetteProvider( - ArcKeychainClientDefaultAnisetteProvider self, - SseSerializer serializer); + sse_encode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcMutexAppleAccountDefaultAnisetteProvider( + ArcMutexAppleAccountDefaultAnisetteProvider self, + SseSerializer serializer, + ); @protected void - sse_encode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcMutexAppleAccountDefaultAnisetteProvider( - ArcMutexAppleAccountDefaultAnisetteProvider self, - SseSerializer serializer); + sse_encode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcMutexOptionCircleClientSessionDefaultAnisetteProvider( + ArcMutexOptionCircleClientSessionDefaultAnisetteProvider self, + SseSerializer serializer, + ); @protected void - sse_encode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcMutexOptionCircleClientSessionDefaultAnisetteProvider( - ArcMutexOptionCircleClientSessionDefaultAnisetteProvider self, - SseSerializer serializer); + sse_encode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcMutexVecActiveCircleSession( + ArcMutexVecActiveCircleSession self, + SseSerializer serializer, + ); @protected void - sse_encode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcMutexVecActiveCircleSession( - ArcMutexVecActiveCircleSession self, SseSerializer serializer); + sse_encode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcPasswordManagerDefaultAnisetteProvider( + ArcPasswordManagerDefaultAnisetteProvider self, + SseSerializer serializer, + ); @protected void - sse_encode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcPasswordManagerDefaultAnisetteProvider( - ArcPasswordManagerDefaultAnisetteProvider self, - SseSerializer serializer); + sse_encode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcProfilesClientDefaultAnisetteProvider( + ArcProfilesClientDefaultAnisetteProvider self, + SseSerializer serializer, + ); @protected void - sse_encode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcProfilesClientDefaultAnisetteProvider( - ArcProfilesClientDefaultAnisetteProvider self, - SseSerializer serializer); + sse_encode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcSenderPushMessage( + ArcSenderPushMessage self, + SseSerializer serializer, + ); @protected void - sse_encode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcSenderPushMessage( - ArcSenderPushMessage self, SseSerializer serializer); + sse_encode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcSharedPushState( + ArcSharedPushState self, + SseSerializer serializer, + ); @protected void - sse_encode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcSharedPushState( - ArcSharedPushState self, SseSerializer serializer); + sse_encode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcStatusKitClientDefaultAnisetteProvider( + ArcStatusKitClientDefaultAnisetteProvider self, + SseSerializer serializer, + ); @protected void - sse_encode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcStatusKitClientDefaultAnisetteProvider( - ArcStatusKitClientDefaultAnisetteProvider self, - SseSerializer serializer); + sse_encode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcTokenProviderDefaultAnisetteProvider( + ArcTokenProviderDefaultAnisetteProvider self, + SseSerializer serializer, + ); @protected void - sse_encode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcTokenProviderDefaultAnisetteProvider( - ArcTokenProviderDefaultAnisetteProvider self, - SseSerializer serializer); + sse_encode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerCloudSyncPreparedMessageCreateHandle( + CloudSyncPreparedMessageCreateHandle self, + SseSerializer serializer, + ); @protected void - sse_encode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerDate( - Date self, SseSerializer serializer); + sse_encode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerDate( + Date self, + SseSerializer serializer, + ); @protected void - sse_encode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerEscrowData( - EscrowData self, SseSerializer serializer); + sse_encode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerEscrowData( + EscrowData self, + SseSerializer serializer, + ); @protected void - sse_encode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerGZipWrapperAttachmentMeta( - GZipWrapperAttachmentMeta self, SseSerializer serializer); + sse_encode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerGZipWrapperAttachmentMeta( + GZipWrapperAttachmentMeta self, + SseSerializer serializer, + ); @protected void - sse_encode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerGZipWrapperChatProto( - GZipWrapperChatProto self, SseSerializer serializer); + sse_encode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerGZipWrapperChatProto( + GZipWrapperChatProto self, + SseSerializer serializer, + ); @protected void - sse_encode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerGZipWrapperMessageProto( - GZipWrapperMessageProto self, SseSerializer serializer); + sse_encode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerGZipWrapperMessageProto( + GZipWrapperMessageProto self, + SseSerializer serializer, + ); @protected void - sse_encode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerGZipWrapperMessageProto2( - GZipWrapperMessageProto2 self, SseSerializer serializer); + sse_encode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerGZipWrapperMessageProto2( + GZipWrapperMessageProto2 self, + SseSerializer serializer, + ); @protected void - sse_encode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerGZipWrapperMessageProto3( - GZipWrapperMessageProto3 self, SseSerializer serializer); + sse_encode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerGZipWrapperMessageProto3( + GZipWrapperMessageProto3 self, + SseSerializer serializer, + ); @protected void - sse_encode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerGZipWrapperMessageProto4( - GZipWrapperMessageProto4 self, SseSerializer serializer); + sse_encode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerGZipWrapperMessageProto4( + GZipWrapperMessageProto4 self, + SseSerializer serializer, + ); @protected void - sse_encode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerIDSNGMIdentity( - IdsngmIdentity self, SseSerializer serializer); + sse_encode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerIDSNGMIdentity( + IdsngmIdentity self, + SseSerializer serializer, + ); @protected void - sse_encode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerIDSUser( - IdsUser self, SseSerializer serializer); + sse_encode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerIDSUser( + IdsUser self, + SseSerializer serializer, + ); @protected void - sse_encode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerJoinedOSConfig( - JoinedOsConfig self, SseSerializer serializer); + sse_encode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerJoinedOSConfig( + JoinedOsConfig self, + SseSerializer serializer, + ); @protected void - sse_encode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerLocationReport( - LocationReport self, SseSerializer serializer); + sse_encode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerLocationReport( + LocationReport self, + SseSerializer serializer, + ); @protected void - sse_encode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerMessageFlags( - MessageFlags self, SseSerializer serializer); + sse_encode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerMessageFlags( + MessageFlags self, + SseSerializer serializer, + ); @protected void - sse_encode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerSavedHardwareState( - SavedHardwareState self, SseSerializer serializer); + sse_encode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerSavedHardwareState( + SavedHardwareState self, + SseSerializer serializer, + ); @protected void - sse_encode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerSender( - Sender self, SseSerializer serializer); + sse_encode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerSender( + Sender self, + SseSerializer serializer, + ); @protected void - sse_encode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerStCollapsedValue( - StCollapsedValue self, SseSerializer serializer); + sse_encode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerStCollapsedValue( + StCollapsedValue self, + SseSerializer serializer, + ); @protected void - sse_encode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerSyncManagerDefaultAnisetteProviderMyFilePackager( - SyncManagerDefaultAnisetteProviderMyFilePackager self, - SseSerializer serializer); + sse_encode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerSyncManagerDefaultAnisetteProviderMyFilePackager( + SyncManagerDefaultAnisetteProviderMyFilePackager self, + SseSerializer serializer, + ); @protected void - sse_encode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerVerifyBody( - VerifyBody self, SseSerializer serializer); + sse_encode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerVerifyBody( + VerifyBody self, + SseSerializer serializer, + ); @protected void - sse_encode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerViableBottle( - ViableBottle self, SseSerializer serializer); + sse_encode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerViableBottle( + ViableBottle self, + SseSerializer serializer, + ); @protected void sse_encode_CastedPrimitive_i_64(int self, SseSerializer serializer); @@ -6109,390 +8152,537 @@ abstract class RustLibApiImplPlatform extends BaseApiImpl { @protected void sse_encode_DartFn_Inputs_String_Output_String_AnyhowException( - FutureOr Function(String) self, SseSerializer serializer); + FutureOr Function(String) self, + SseSerializer serializer, + ); @protected void sse_encode_DartOpaque(Object self, SseSerializer serializer); @protected void - sse_encode_Map_String_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerAsset( - Map self, SseSerializer serializer); + sse_encode_Map_String_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerAsset( + Map self, + SseSerializer serializer, + ); @protected void - sse_encode_Map_String_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerStCollapsedValue( - Map self, SseSerializer serializer); + sse_encode_Map_String_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerStCollapsedValue( + Map self, + SseSerializer serializer, + ); @protected void sse_encode_Map_String_CastedPrimitive_u_64( - Map self, SseSerializer serializer); + Map self, + SseSerializer serializer, + ); @protected void sse_encode_Map_String_String( - Map self, SseSerializer serializer); + Map self, + SseSerializer serializer, + ); @protected void sse_encode_Map_String_bool( - Map self, SseSerializer serializer); + Map self, + SseSerializer serializer, + ); @protected void sse_encode_Map_String_cloud_attachment( - Map self, SseSerializer serializer); + Map self, + SseSerializer serializer, + ); @protected void sse_encode_Map_String_cloud_chat( - Map self, SseSerializer serializer); + Map self, + SseSerializer serializer, + ); @protected void sse_encode_Map_String_cloud_message( - Map self, SseSerializer serializer); + Map self, + SseSerializer serializer, + ); @protected void sse_encode_Map_String_ft_participant( - Map self, SseSerializer serializer); + Map self, + SseSerializer serializer, + ); @protected void sse_encode_Map_String_group_summary( - Map self, SseSerializer serializer); + Map self, + SseSerializer serializer, + ); @protected void sse_encode_Map_String_list_message_edit( - Map> self, SseSerializer serializer); + Map> self, + SseSerializer serializer, + ); @protected void sse_encode_Map_String_list_prim_u_8_strict( - Map self, SseSerializer serializer); + Map self, + SseSerializer serializer, + ); @protected void sse_encode_Map_String_message_edit_range( - Map self, SseSerializer serializer); + Map self, + SseSerializer serializer, + ); @protected void sse_encode_Map_String_opt_box_autoadd_cloud_attachment( - Map self, SseSerializer serializer); + Map self, + SseSerializer serializer, + ); @protected void sse_encode_Map_String_opt_box_autoadd_cloud_chat( - Map self, SseSerializer serializer); + Map self, + SseSerializer serializer, + ); @protected void sse_encode_Map_String_opt_box_autoadd_cloud_message( - Map self, SseSerializer serializer); + Map self, + SseSerializer serializer, + ); @protected void sse_encode_Map_String_password_manager_meta_data_ctx( - Map self, SseSerializer serializer); + Map self, + SseSerializer serializer, + ); @protected void sse_encode_Map_String_record_opt_string_passkey( - Map self, SseSerializer serializer); + Map self, + SseSerializer serializer, + ); @protected void sse_encode_Map_String_record_opt_string_password_manager_meta( - Map self, - SseSerializer serializer); + Map self, + SseSerializer serializer, + ); @protected void sse_encode_Map_String_record_opt_string_password_raw_entry( - Map self, SseSerializer serializer); + Map self, + SseSerializer serializer, + ); @protected void sse_encode_Map_String_record_opt_string_wifi_password( - Map self, SseSerializer serializer); + Map self, + SseSerializer serializer, + ); @protected void sse_encode_Map_String_share_invite_content_data( - Map self, SseSerializer serializer); + Map self, + SseSerializer serializer, + ); @protected void sse_encode_Map_String_status_kit_personal_config( - Map self, SseSerializer serializer); + Map self, + SseSerializer serializer, + ); @protected void sse_encode_Map_String_sync_status( - Map self, SseSerializer serializer); + Map self, + SseSerializer serializer, + ); @protected void - sse_encode_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerAPSConnection( - ApsConnection self, SseSerializer serializer); + sse_encode_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerAPSConnection( + ApsConnection self, + SseSerializer serializer, + ); @protected void - sse_encode_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerAPSState( - ApsState self, SseSerializer serializer); + sse_encode_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerAPSState( + ApsState self, + SseSerializer serializer, + ); @protected void - sse_encode_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerAPSWatcher( - ApsWatcher self, SseSerializer serializer); + sse_encode_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerAPSWatcher( + ApsWatcher self, + SseSerializer serializer, + ); @protected void - sse_encode_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcAnisetteClientDefaultAnisetteProvider( - ArcAnisetteClientDefaultAnisetteProvider self, - SseSerializer serializer); + sse_encode_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcAnisetteClientDefaultAnisetteProvider( + ArcAnisetteClientDefaultAnisetteProvider self, + SseSerializer serializer, + ); @protected void - sse_encode_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcCloudKitClientDefaultAnisetteProvider( - ArcCloudKitClientDefaultAnisetteProvider self, - SseSerializer serializer); + sse_encode_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcCloudKitClientDefaultAnisetteProvider( + ArcCloudKitClientDefaultAnisetteProvider self, + SseSerializer serializer, + ); @protected void - sse_encode_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcCloudMessagesClientDefaultAnisetteProvider( - ArcCloudMessagesClientDefaultAnisetteProvider self, - SseSerializer serializer); + sse_encode_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcCloudMessagesClientDefaultAnisetteProvider( + ArcCloudMessagesClientDefaultAnisetteProvider self, + SseSerializer serializer, + ); @protected void - sse_encode_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcFTClient( - ArcFtClient self, SseSerializer serializer); + sse_encode_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcFTClient( + ArcFtClient self, + SseSerializer serializer, + ); @protected void - sse_encode_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcFindMyClientDefaultAnisetteProvider( - ArcFindMyClientDefaultAnisetteProvider self, - SseSerializer serializer); + sse_encode_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcFindMyClientDefaultAnisetteProvider( + ArcFindMyClientDefaultAnisetteProvider self, + SseSerializer serializer, + ); @protected void - sse_encode_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcIMClient( - ArcImClient self, SseSerializer serializer); + sse_encode_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcIMClient( + ArcImClient self, + SseSerializer serializer, + ); @protected void - sse_encode_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcIdmsAuthListener( - ArcIdmsAuthListener self, SseSerializer serializer); + sse_encode_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcIdmsAuthListener( + ArcIdmsAuthListener self, + SseSerializer serializer, + ); @protected void - sse_encode_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcKeychainClientDefaultAnisetteProvider( - ArcKeychainClientDefaultAnisetteProvider self, - SseSerializer serializer); + sse_encode_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcKeychainClientDefaultAnisetteProvider( + ArcKeychainClientDefaultAnisetteProvider self, + SseSerializer serializer, + ); @protected void - sse_encode_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcMutexAppleAccountDefaultAnisetteProvider( - ArcMutexAppleAccountDefaultAnisetteProvider self, - SseSerializer serializer); + sse_encode_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcMutexAppleAccountDefaultAnisetteProvider( + ArcMutexAppleAccountDefaultAnisetteProvider self, + SseSerializer serializer, + ); @protected void - sse_encode_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcMutexOptionCircleClientSessionDefaultAnisetteProvider( - ArcMutexOptionCircleClientSessionDefaultAnisetteProvider self, - SseSerializer serializer); + sse_encode_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcMutexOptionCircleClientSessionDefaultAnisetteProvider( + ArcMutexOptionCircleClientSessionDefaultAnisetteProvider self, + SseSerializer serializer, + ); @protected void - sse_encode_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcMutexVecActiveCircleSession( - ArcMutexVecActiveCircleSession self, SseSerializer serializer); + sse_encode_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcMutexVecActiveCircleSession( + ArcMutexVecActiveCircleSession self, + SseSerializer serializer, + ); @protected void - sse_encode_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcPasswordManagerDefaultAnisetteProvider( - ArcPasswordManagerDefaultAnisetteProvider self, - SseSerializer serializer); + sse_encode_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcPasswordManagerDefaultAnisetteProvider( + ArcPasswordManagerDefaultAnisetteProvider self, + SseSerializer serializer, + ); @protected void - sse_encode_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcProfilesClientDefaultAnisetteProvider( - ArcProfilesClientDefaultAnisetteProvider self, - SseSerializer serializer); + sse_encode_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcProfilesClientDefaultAnisetteProvider( + ArcProfilesClientDefaultAnisetteProvider self, + SseSerializer serializer, + ); @protected void - sse_encode_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcSenderPushMessage( - ArcSenderPushMessage self, SseSerializer serializer); + sse_encode_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcSenderPushMessage( + ArcSenderPushMessage self, + SseSerializer serializer, + ); @protected void - sse_encode_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcSharedPushState( - ArcSharedPushState self, SseSerializer serializer); + sse_encode_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcSharedPushState( + ArcSharedPushState self, + SseSerializer serializer, + ); @protected void - sse_encode_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcStatusKitClientDefaultAnisetteProvider( - ArcStatusKitClientDefaultAnisetteProvider self, - SseSerializer serializer); + sse_encode_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcStatusKitClientDefaultAnisetteProvider( + ArcStatusKitClientDefaultAnisetteProvider self, + SseSerializer serializer, + ); @protected void - sse_encode_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcTokenProviderDefaultAnisetteProvider( - ArcTokenProviderDefaultAnisetteProvider self, - SseSerializer serializer); + sse_encode_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcTokenProviderDefaultAnisetteProvider( + ArcTokenProviderDefaultAnisetteProvider self, + SseSerializer serializer, + ); @protected void - sse_encode_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerAsset( - Asset self, SseSerializer serializer); + sse_encode_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerAsset( + Asset self, + SseSerializer serializer, + ); @protected void - sse_encode_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerChannelInterestToken( - ChannelInterestToken self, SseSerializer serializer); + sse_encode_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerChannelInterestToken( + ChannelInterestToken self, + SseSerializer serializer, + ); @protected void - sse_encode_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerCircleClientSessionDefaultAnisetteProvider( - CircleClientSessionDefaultAnisetteProvider self, - SseSerializer serializer); + sse_encode_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerCircleClientSessionDefaultAnisetteProvider( + CircleClientSessionDefaultAnisetteProvider self, + SseSerializer serializer, + ); @protected void - sse_encode_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerConversationLink( - ConversationLink self, SseSerializer serializer); + sse_encode_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerCloudSyncPreparedMessageCreateHandle( + CloudSyncPreparedMessageCreateHandle self, + SseSerializer serializer, + ); @protected void - sse_encode_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerConversationParticipant( - ConversationParticipant self, SseSerializer serializer); + sse_encode_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerConversationLink( + ConversationLink self, + SseSerializer serializer, + ); @protected void - sse_encode_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerDate( - Date self, SseSerializer serializer); + sse_encode_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerConversationParticipant( + ConversationParticipant self, + SseSerializer serializer, + ); @protected void - sse_encode_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerEscrowData( - EscrowData self, SseSerializer serializer); + sse_encode_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerDate( + Date self, + SseSerializer serializer, + ); @protected void - sse_encode_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerFindMyFriendsClientDefaultAnisetteProvider( - FindMyFriendsClientDefaultAnisetteProvider self, - SseSerializer serializer); + sse_encode_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerEscrowData( + EscrowData self, + SseSerializer serializer, + ); @protected void - sse_encode_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerFindMyPhoneClientDefaultAnisetteProvider( - FindMyPhoneClientDefaultAnisetteProvider self, - SseSerializer serializer); + sse_encode_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerFindMyFriendsClientDefaultAnisetteProvider( + FindMyFriendsClientDefaultAnisetteProvider self, + SseSerializer serializer, + ); @protected void - sse_encode_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerGZipWrapperAttachmentMeta( - GZipWrapperAttachmentMeta self, SseSerializer serializer); + sse_encode_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerFindMyPhoneClientDefaultAnisetteProvider( + FindMyPhoneClientDefaultAnisetteProvider self, + SseSerializer serializer, + ); @protected void - sse_encode_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerGZipWrapperChatProto( - GZipWrapperChatProto self, SseSerializer serializer); + sse_encode_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerGZipWrapperAttachmentMeta( + GZipWrapperAttachmentMeta self, + SseSerializer serializer, + ); @protected void - sse_encode_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerGZipWrapperMessageProto( - GZipWrapperMessageProto self, SseSerializer serializer); + sse_encode_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerGZipWrapperChatProto( + GZipWrapperChatProto self, + SseSerializer serializer, + ); @protected void - sse_encode_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerGZipWrapperMessageProto2( - GZipWrapperMessageProto2 self, SseSerializer serializer); + sse_encode_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerGZipWrapperMessageProto( + GZipWrapperMessageProto self, + SseSerializer serializer, + ); @protected void - sse_encode_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerGZipWrapperMessageProto3( - GZipWrapperMessageProto3 self, SseSerializer serializer); + sse_encode_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerGZipWrapperMessageProto2( + GZipWrapperMessageProto2 self, + SseSerializer serializer, + ); @protected void - sse_encode_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerGZipWrapperMessageProto4( - GZipWrapperMessageProto4 self, SseSerializer serializer); + sse_encode_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerGZipWrapperMessageProto3( + GZipWrapperMessageProto3 self, + SseSerializer serializer, + ); @protected void - sse_encode_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerIDSNGMIdentity( - IdsngmIdentity self, SseSerializer serializer); + sse_encode_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerGZipWrapperMessageProto4( + GZipWrapperMessageProto4 self, + SseSerializer serializer, + ); @protected void - sse_encode_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerIDSUser( - IdsUser self, SseSerializer serializer); + sse_encode_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerIDSNGMIdentity( + IdsngmIdentity self, + SseSerializer serializer, + ); @protected void - sse_encode_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerJoinedOSConfig( - JoinedOsConfig self, SseSerializer serializer); + sse_encode_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerIDSUser( + IdsUser self, + SseSerializer serializer, + ); @protected void - sse_encode_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerLocationReport( - LocationReport self, SseSerializer serializer); + sse_encode_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerJoinedOSConfig( + JoinedOsConfig self, + SseSerializer serializer, + ); @protected void - sse_encode_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerMessageFlags( - MessageFlags self, SseSerializer serializer); + sse_encode_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerLocationReport( + LocationReport self, + SseSerializer serializer, + ); @protected void - sse_encode_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerNSArrayLPIconMetadata( - NsArrayLpIconMetadata self, SseSerializer serializer); + sse_encode_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerMessageFlags( + MessageFlags self, + SseSerializer serializer, + ); @protected void - sse_encode_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerNSArrayLPImageMetadata( - NsArrayLpImageMetadata self, SseSerializer serializer); + sse_encode_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerNSArrayLPIconMetadata( + NsArrayLpIconMetadata self, + SseSerializer serializer, + ); @protected void - sse_encode_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerPushError( - PushError self, SseSerializer serializer); + sse_encode_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerNSArrayLPImageMetadata( + NsArrayLpImageMetadata self, + SseSerializer serializer, + ); @protected void - sse_encode_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerReceiverAPSMessage( - ReceiverApsMessage self, SseSerializer serializer); + sse_encode_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerPushError( + PushError self, + SseSerializer serializer, + ); @protected void - sse_encode_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerSavedHardwareState( - SavedHardwareState self, SseSerializer serializer); + sse_encode_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerReceiverAPSMessage( + ReceiverApsMessage self, + SseSerializer serializer, + ); @protected void - sse_encode_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerSender( - Sender self, SseSerializer serializer); + sse_encode_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerSavedHardwareState( + SavedHardwareState self, + SseSerializer serializer, + ); @protected void - sse_encode_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerStCollapsedValue( - StCollapsedValue self, SseSerializer serializer); + sse_encode_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerSender( + Sender self, + SseSerializer serializer, + ); @protected void - sse_encode_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerSyncManagerDefaultAnisetteProviderMyFilePackager( - SyncManagerDefaultAnisetteProviderMyFilePackager self, - SseSerializer serializer); + sse_encode_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerStCollapsedValue( + StCollapsedValue self, + SseSerializer serializer, + ); @protected void - sse_encode_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerSystemTime( - SystemTime self, SseSerializer serializer); + sse_encode_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerSyncManagerDefaultAnisetteProviderMyFilePackager( + SyncManagerDefaultAnisetteProviderMyFilePackager self, + SseSerializer serializer, + ); @protected void - sse_encode_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerVerifyBody( - VerifyBody self, SseSerializer serializer); + sse_encode_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerSystemTime( + SystemTime self, + SseSerializer serializer, + ); @protected void - sse_encode_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerViableBottle( - ViableBottle self, SseSerializer serializer); + sse_encode_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerVerifyBody( + VerifyBody self, + SseSerializer serializer, + ); + + @protected + void + sse_encode_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerViableBottle( + ViableBottle self, + SseSerializer serializer, + ); @protected void sse_encode_Set_ft_member(Set self, SseSerializer serializer); @protected void sse_encode_StreamSink_mmcs_transfer_progress_Sse( - RustStreamSink self, SseSerializer serializer); + RustStreamSink self, + SseSerializer serializer, + ); @protected void sse_encode_StreamSink_transfer_progress_Sse( - RustStreamSink self, SseSerializer serializer); + RustStreamSink self, + SseSerializer serializer, + ); @protected void sse_encode_String(String self, SseSerializer serializer); @@ -6506,6 +8696,12 @@ abstract class RustLibApiImplPlatform extends BaseApiImpl { @protected void sse_encode_aps_alert(ApsAlert self, SseSerializer serializer); + @protected + void sse_encode_aps_connection_status( + ApsConnectionStatus self, + SseSerializer serializer, + ); + @protected void sse_encode_aps_data(ApsData self, SseSerializer serializer); @@ -6514,15 +8710,21 @@ abstract class RustLibApiImplPlatform extends BaseApiImpl { @protected void sse_encode_attachment_meta( - AttachmentMeta self, SseSerializer serializer); + AttachmentMeta self, + SseSerializer serializer, + ); @protected void sse_encode_attachment_meta_extra( - AttachmentMetaExtra self, SseSerializer serializer); + AttachmentMetaExtra self, + SseSerializer serializer, + ); @protected void sse_encode_attachment_type( - AttachmentType self, SseSerializer serializer); + AttachmentType self, + SseSerializer serializer, + ); @protected void sse_encode_balloon(Balloon self, SseSerializer serializer); @@ -6532,235 +8734,482 @@ abstract class RustLibApiImplPlatform extends BaseApiImpl { @protected void sse_encode_beacon_attributes( - BeaconAttributes self, SseSerializer serializer); + BeaconAttributes self, + SseSerializer serializer, + ); @protected void sse_encode_beacon_naming_record( - BeaconNamingRecord self, SseSerializer serializer); + BeaconNamingRecord self, + SseSerializer serializer, + ); @protected void sse_encode_bool(bool self, SseSerializer serializer); @protected void - sse_encode_box_autoadd_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerAPSState( - ApsState self, SseSerializer serializer); + sse_encode_box_autoadd_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerAPSState( + ApsState self, + SseSerializer serializer, + ); + + @protected + void + sse_encode_box_autoadd_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcCloudKitClientDefaultAnisetteProvider( + ArcCloudKitClientDefaultAnisetteProvider self, + SseSerializer serializer, + ); + + @protected + void + sse_encode_box_autoadd_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcCloudMessagesClientDefaultAnisetteProvider( + ArcCloudMessagesClientDefaultAnisetteProvider self, + SseSerializer serializer, + ); @protected void - sse_encode_box_autoadd_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcCloudKitClientDefaultAnisetteProvider( - ArcCloudKitClientDefaultAnisetteProvider self, - SseSerializer serializer); + sse_encode_box_autoadd_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcFindMyClientDefaultAnisetteProvider( + ArcFindMyClientDefaultAnisetteProvider self, + SseSerializer serializer, + ); @protected void - sse_encode_box_autoadd_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcCloudMessagesClientDefaultAnisetteProvider( - ArcCloudMessagesClientDefaultAnisetteProvider self, - SseSerializer serializer); + sse_encode_box_autoadd_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcKeychainClientDefaultAnisetteProvider( + ArcKeychainClientDefaultAnisetteProvider self, + SseSerializer serializer, + ); @protected void - sse_encode_box_autoadd_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcFindMyClientDefaultAnisetteProvider( - ArcFindMyClientDefaultAnisetteProvider self, - SseSerializer serializer); + sse_encode_box_autoadd_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcMutexAppleAccountDefaultAnisetteProvider( + ArcMutexAppleAccountDefaultAnisetteProvider self, + SseSerializer serializer, + ); + + @protected + void + sse_encode_box_autoadd_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcPasswordManagerDefaultAnisetteProvider( + ArcPasswordManagerDefaultAnisetteProvider self, + SseSerializer serializer, + ); + + @protected + void + sse_encode_box_autoadd_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerAsset( + Asset self, + SseSerializer serializer, + ); + + @protected + void + sse_encode_box_autoadd_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerChannelInterestToken( + ChannelInterestToken self, + SseSerializer serializer, + ); + + @protected + void + sse_encode_box_autoadd_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerCircleClientSessionDefaultAnisetteProvider( + CircleClientSessionDefaultAnisetteProvider self, + SseSerializer serializer, + ); + + @protected + void + sse_encode_box_autoadd_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerCloudSyncPreparedMessageCreateHandle( + CloudSyncPreparedMessageCreateHandle self, + SseSerializer serializer, + ); + + @protected + void + sse_encode_box_autoadd_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerConversationLink( + ConversationLink self, + SseSerializer serializer, + ); + + @protected + void + sse_encode_box_autoadd_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerConversationParticipant( + ConversationParticipant self, + SseSerializer serializer, + ); + + @protected + void + sse_encode_box_autoadd_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerDate( + Date self, + SseSerializer serializer, + ); + + @protected + void + sse_encode_box_autoadd_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerGZipWrapperChatProto( + GZipWrapperChatProto self, + SseSerializer serializer, + ); + + @protected + void + sse_encode_box_autoadd_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerGZipWrapperMessageProto2( + GZipWrapperMessageProto2 self, + SseSerializer serializer, + ); + + @protected + void + sse_encode_box_autoadd_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerGZipWrapperMessageProto3( + GZipWrapperMessageProto3 self, + SseSerializer serializer, + ); + + @protected + void + sse_encode_box_autoadd_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerGZipWrapperMessageProto4( + GZipWrapperMessageProto4 self, + SseSerializer serializer, + ); + + @protected + void + sse_encode_box_autoadd_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerIDSUser( + IdsUser self, + SseSerializer serializer, + ); + + @protected + void + sse_encode_box_autoadd_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerLocationReport( + LocationReport self, + SseSerializer serializer, + ); + + @protected + void + sse_encode_box_autoadd_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerNSArrayLPIconMetadata( + NsArrayLpIconMetadata self, + SseSerializer serializer, + ); + + @protected + void + sse_encode_box_autoadd_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerNSArrayLPImageMetadata( + NsArrayLpImageMetadata self, + SseSerializer serializer, + ); + + @protected + void + sse_encode_box_autoadd_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerPushError( + PushError self, + SseSerializer serializer, + ); + + @protected + void + sse_encode_box_autoadd_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerSavedHardwareState( + SavedHardwareState self, + SseSerializer serializer, + ); + + @protected + void + sse_encode_box_autoadd_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerSyncManagerDefaultAnisetteProviderMyFilePackager( + SyncManagerDefaultAnisetteProviderMyFilePackager self, + SseSerializer serializer, + ); + + @protected + void + sse_encode_box_autoadd_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerSystemTime( + SystemTime self, + SseSerializer serializer, + ); + + @protected + void sse_encode_box_autoadd_address(Address self, SseSerializer serializer); + + @protected + void sse_encode_box_autoadd_attachment( + Attachment self, + SseSerializer serializer, + ); + + @protected + void sse_encode_box_autoadd_attachment_meta( + AttachmentMeta self, + SseSerializer serializer, + ); + + @protected + void sse_encode_box_autoadd_attachment_meta_extra( + AttachmentMetaExtra self, + SseSerializer serializer, + ); + + @protected + void sse_encode_box_autoadd_balloon(Balloon self, SseSerializer serializer); @protected - void - sse_encode_box_autoadd_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcKeychainClientDefaultAnisetteProvider( - ArcKeychainClientDefaultAnisetteProvider self, - SseSerializer serializer); + void sse_encode_box_autoadd_balloon_layout( + BalloonLayout self, + SseSerializer serializer, + ); @protected - void - sse_encode_box_autoadd_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcMutexAppleAccountDefaultAnisetteProvider( - ArcMutexAppleAccountDefaultAnisetteProvider self, - SseSerializer serializer); + void sse_encode_box_autoadd_beacon_attributes( + BeaconAttributes self, + SseSerializer serializer, + ); @protected - void - sse_encode_box_autoadd_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcPasswordManagerDefaultAnisetteProvider( - ArcPasswordManagerDefaultAnisetteProvider self, - SseSerializer serializer); + void sse_encode_box_autoadd_beacon_naming_record( + BeaconNamingRecord self, + SseSerializer serializer, + ); @protected - void - sse_encode_box_autoadd_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerAsset( - Asset self, SseSerializer serializer); + void sse_encode_box_autoadd_bool(bool self, SseSerializer serializer); @protected - void - sse_encode_box_autoadd_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerChannelInterestToken( - ChannelInterestToken self, SseSerializer serializer); + void sse_encode_box_autoadd_certified_context( + CertifiedContext self, + SseSerializer serializer, + ); @protected - void - sse_encode_box_autoadd_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerCircleClientSessionDefaultAnisetteProvider( - CircleClientSessionDefaultAnisetteProvider self, - SseSerializer serializer); + void sse_encode_box_autoadd_change_participant_message( + ChangeParticipantMessage self, + SseSerializer serializer, + ); @protected - void - sse_encode_box_autoadd_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerConversationLink( - ConversationLink self, SseSerializer serializer); + void sse_encode_box_autoadd_chat_proto( + ChatProto self, + SseSerializer serializer, + ); @protected - void - sse_encode_box_autoadd_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerConversationParticipant( - ConversationParticipant self, SseSerializer serializer); + void sse_encode_box_autoadd_cloud_attachment( + CloudAttachment self, + SseSerializer serializer, + ); @protected - void - sse_encode_box_autoadd_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerDate( - Date self, SseSerializer serializer); + void sse_encode_box_autoadd_cloud_chat( + CloudChat self, + SseSerializer serializer, + ); @protected - void - sse_encode_box_autoadd_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerGZipWrapperChatProto( - GZipWrapperChatProto self, SseSerializer serializer); + void sse_encode_box_autoadd_cloud_message( + CloudMessage self, + SseSerializer serializer, + ); @protected - void - sse_encode_box_autoadd_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerGZipWrapperMessageProto2( - GZipWrapperMessageProto2 self, SseSerializer serializer); + void sse_encode_box_autoadd_cloud_prop( + CloudProp self, + SseSerializer serializer, + ); @protected - void - sse_encode_box_autoadd_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerGZipWrapperMessageProto3( - GZipWrapperMessageProto3 self, SseSerializer serializer); + void sse_encode_box_autoadd_cloud_sync_outbound_failure_class( + CloudSyncOutboundFailureClass self, + SseSerializer serializer, + ); @protected - void - sse_encode_box_autoadd_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerGZipWrapperMessageProto4( - GZipWrapperMessageProto4 self, SseSerializer serializer); + void sse_encode_box_autoadd_cloud_sync_outbound_reconcile_disposition( + CloudSyncOutboundReconcileDisposition self, + SseSerializer serializer, + ); @protected - void - sse_encode_box_autoadd_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerIDSUser( - IdsUser self, SseSerializer serializer); + void sse_encode_box_autoadd_cloud_sync_outbound_safe_code( + CloudSyncOutboundSafeCode self, + SseSerializer serializer, + ); @protected - void - sse_encode_box_autoadd_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerLocationReport( - LocationReport self, SseSerializer serializer); + void sse_encode_box_autoadd_cloud_sync_prepared_message_create_input( + CloudSyncPreparedMessageCreateInput self, + SseSerializer serializer, + ); @protected - void - sse_encode_box_autoadd_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerNSArrayLPIconMetadata( - NsArrayLpIconMetadata self, SseSerializer serializer); + void sse_encode_box_autoadd_cloud_sync_protected_failure( + CloudSyncProtectedFailure self, + SseSerializer serializer, + ); @protected - void - sse_encode_box_autoadd_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerNSArrayLPImageMetadata( - NsArrayLpImageMetadata self, SseSerializer serializer); + void sse_encode_box_autoadd_cloud_sync_protected_garbage_collection( + CloudSyncProtectedGarbageCollection self, + SseSerializer serializer, + ); @protected - void - sse_encode_box_autoadd_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerPushError( - PushError self, SseSerializer serializer); + void sse_encode_box_autoadd_cloud_sync_protected_outbound_stage( + CloudSyncProtectedOutboundStage self, + SseSerializer serializer, + ); @protected - void - sse_encode_box_autoadd_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerSavedHardwareState( - SavedHardwareState self, SseSerializer serializer); + void sse_encode_box_autoadd_cloud_sync_protected_page( + CloudSyncProtectedPage self, + SseSerializer serializer, + ); @protected - void - sse_encode_box_autoadd_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerSyncManagerDefaultAnisetteProviderMyFilePackager( - SyncManagerDefaultAnisetteProviderMyFilePackager self, - SseSerializer serializer); + void sse_encode_box_autoadd_cloud_sync_protected_preflight_code( + CloudSyncProtectedPreflightCode self, + SseSerializer serializer, + ); @protected - void - sse_encode_box_autoadd_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerSystemTime( - SystemTime self, SseSerializer serializer); + void sse_encode_box_autoadd_cloud_sync_protected_recovery( + CloudSyncProtectedRecovery self, + SseSerializer serializer, + ); @protected - void sse_encode_box_autoadd_address(Address self, SseSerializer serializer); + void sse_encode_box_autoadd_cloud_sync_raw_failure( + CloudSyncRawFailure self, + SseSerializer serializer, + ); @protected - void sse_encode_box_autoadd_attachment( - Attachment self, SseSerializer serializer); + void sse_encode_box_autoadd_cloud_sync_raw_page( + CloudSyncRawPage self, + SseSerializer serializer, + ); @protected - void sse_encode_box_autoadd_attachment_meta( - AttachmentMeta self, SseSerializer serializer); + void sse_encode_box_autoadd_cloud_sync_raw_system_fields( + CloudSyncRawSystemFields self, + SseSerializer serializer, + ); @protected - void sse_encode_box_autoadd_attachment_meta_extra( - AttachmentMetaExtra self, SseSerializer serializer); + void sse_encode_box_autoadd_cloud_sync_transient_attachment_payload( + CloudSyncTransientAttachmentPayload self, + SseSerializer serializer, + ); @protected - void sse_encode_box_autoadd_balloon(Balloon self, SseSerializer serializer); + void sse_encode_box_autoadd_cloud_sync_transient_chat_payload( + CloudSyncTransientChatPayload self, + SseSerializer serializer, + ); @protected - void sse_encode_box_autoadd_balloon_layout( - BalloonLayout self, SseSerializer serializer); + void sse_encode_box_autoadd_cloud_sync_transient_deferred_reason( + CloudSyncTransientDeferredReason self, + SseSerializer serializer, + ); @protected - void sse_encode_box_autoadd_beacon_attributes( - BeaconAttributes self, SseSerializer serializer); + void sse_encode_box_autoadd_cloud_sync_transient_entity_kind( + CloudSyncTransientEntityKind self, + SseSerializer serializer, + ); @protected - void sse_encode_box_autoadd_beacon_naming_record( - BeaconNamingRecord self, SseSerializer serializer); + void sse_encode_box_autoadd_cloud_sync_transient_failure_code( + CloudSyncTransientFailureCode self, + SseSerializer serializer, + ); @protected - void sse_encode_box_autoadd_bool(bool self, SseSerializer serializer); + void sse_encode_box_autoadd_cloud_sync_transient_group_photo_payload( + CloudSyncTransientGroupPhotoPayload self, + SseSerializer serializer, + ); @protected - void sse_encode_box_autoadd_certified_context( - CertifiedContext self, SseSerializer serializer); + void sse_encode_box_autoadd_cloud_sync_transient_message_payload( + CloudSyncTransientMessagePayload self, + SseSerializer serializer, + ); @protected - void sse_encode_box_autoadd_change_participant_message( - ChangeParticipantMessage self, SseSerializer serializer); + void sse_encode_box_autoadd_cloud_sync_transient_mutation_kind( + CloudSyncTransientMutationKind self, + SseSerializer serializer, + ); @protected - void sse_encode_box_autoadd_chat_proto( - ChatProto self, SseSerializer serializer); + void sse_encode_box_autoadd_cloud_sync_transient_payload( + CloudSyncTransientPayload self, + SseSerializer serializer, + ); @protected - void sse_encode_box_autoadd_cloud_attachment( - CloudAttachment self, SseSerializer serializer); + void sse_encode_box_autoadd_cloud_sync_transient_quarantine_reason( + CloudSyncTransientQuarantineReason self, + SseSerializer serializer, + ); @protected - void sse_encode_box_autoadd_cloud_chat( - CloudChat self, SseSerializer serializer); + void sse_encode_box_autoadd_cloud_sync_transient_reaction_kind( + CloudSyncTransientReactionKind self, + SseSerializer serializer, + ); @protected - void sse_encode_box_autoadd_cloud_message( - CloudMessage self, SseSerializer serializer); + void sse_encode_box_autoadd_cloud_sync_transient_snapshot( + CloudSyncTransientSnapshot self, + SseSerializer serializer, + ); @protected - void sse_encode_box_autoadd_cloud_prop( - CloudProp self, SseSerializer serializer); + void sse_encode_box_autoadd_cloud_sync_transient_tombstone( + CloudSyncTransientTombstone self, + SseSerializer serializer, + ); @protected void sse_encode_box_autoadd_conversation_data( - ConversationData self, SseSerializer serializer); + ConversationData self, + SseSerializer serializer, + ); @protected void sse_encode_box_autoadd_dart_beacon_share_info( - DartBeaconShareInfo self, SseSerializer serializer); + DartBeaconShareInfo self, + SseSerializer serializer, + ); @protected void sse_encode_box_autoadd_edit_message( - EditMessage self, SseSerializer serializer); + EditMessage self, + SseSerializer serializer, + ); @protected void sse_encode_box_autoadd_error_message( - ErrorMessage self, SseSerializer serializer); + ErrorMessage self, + SseSerializer serializer, + ); @protected void sse_encode_box_autoadd_extension_app( - ExtensionApp self, SseSerializer serializer); + ExtensionApp self, + SseSerializer serializer, + ); @protected void sse_encode_box_autoadd_f_64(double self, SseSerializer serializer); @protected void sse_encode_box_autoadd_ft_message( - FTMessage self, SseSerializer serializer); + FTMessage self, + SseSerializer serializer, + ); @protected void sse_encode_box_autoadd_ft_mode(FTMode self, SseSerializer serializer); @@ -6773,279 +9222,412 @@ abstract class RustLibApiImplPlatform extends BaseApiImpl { @protected void sse_encode_box_autoadd_i_64( - PlatformInt64 self, SseSerializer serializer); + PlatformInt64 self, + SseSerializer serializer, + ); @protected void sse_encode_box_autoadd_i_message_nickname_record( - IMessageNicknameRecord self, SseSerializer serializer); + IMessageNicknameRecord self, + SseSerializer serializer, + ); @protected void sse_encode_box_autoadd_i_message_poster_record( - IMessagePosterRecord self, SseSerializer serializer); + IMessagePosterRecord self, + SseSerializer serializer, + ); @protected void sse_encode_box_autoadd_icon_change_message( - IconChangeMessage self, SseSerializer serializer); + IconChangeMessage self, + SseSerializer serializer, + ); @protected void sse_encode_box_autoadd_idms_circle_message( - IdmsCircleMessage self, SseSerializer serializer); + IdmsCircleMessage self, + SseSerializer serializer, + ); @protected void sse_encode_box_autoadd_idms_message( - IdmsMessage self, SseSerializer serializer); + IdmsMessage self, + SseSerializer serializer, + ); @protected void sse_encode_box_autoadd_idms_requested_sign_in( - IdmsRequestedSignIn self, SseSerializer serializer); + IdmsRequestedSignIn self, + SseSerializer serializer, + ); @protected void sse_encode_box_autoadd_let_me_in_request( - LetMeInRequest self, SseSerializer serializer); + LetMeInRequest self, + SseSerializer serializer, + ); @protected void sse_encode_box_autoadd_link_meta( - LinkMeta self, SseSerializer serializer); + LinkMeta self, + SseSerializer serializer, + ); @protected void sse_encode_box_autoadd_location(Location self, SseSerializer serializer); @protected void sse_encode_box_autoadd_login_state( - LoginState self, SseSerializer serializer); + LoginState self, + SseSerializer serializer, + ); @protected void sse_encode_box_autoadd_lp_icon_metadata( - LPIconMetadata self, SseSerializer serializer); + LPIconMetadata self, + SseSerializer serializer, + ); @protected void sse_encode_box_autoadd_lp_image_metadata( - LPImageMetadata self, SseSerializer serializer); + LPImageMetadata self, + SseSerializer serializer, + ); @protected void sse_encode_box_autoadd_lp_specialization_metadata( - LPSpecializationMetadata self, SseSerializer serializer); + LPSpecializationMetadata self, + SseSerializer serializer, + ); @protected void sse_encode_box_autoadd_memoji_data( - MemojiData self, SseSerializer serializer); + MemojiData self, + SseSerializer serializer, + ); @protected void sse_encode_box_autoadd_message(Message self, SseSerializer serializer); @protected void sse_encode_box_autoadd_message_inst( - MessageInst self, SseSerializer serializer); + MessageInst self, + SseSerializer serializer, + ); @protected void sse_encode_box_autoadd_message_parts( - MessageParts self, SseSerializer serializer); + MessageParts self, + SseSerializer serializer, + ); @protected void sse_encode_box_autoadd_message_proto( - MessageProto self, SseSerializer serializer); + MessageProto self, + SseSerializer serializer, + ); @protected void sse_encode_box_autoadd_message_proto_2( - MessageProto2 self, SseSerializer serializer); + MessageProto2 self, + SseSerializer serializer, + ); @protected void sse_encode_box_autoadd_message_proto_3( - MessageProto3 self, SseSerializer serializer); + MessageProto3 self, + SseSerializer serializer, + ); @protected void sse_encode_box_autoadd_message_proto_4( - MessageProto4 self, SseSerializer serializer); + MessageProto4 self, + SseSerializer serializer, + ); @protected void sse_encode_box_autoadd_message_summary_info( - MessageSummaryInfo self, SseSerializer serializer); + MessageSummaryInfo self, + SseSerializer serializer, + ); @protected void sse_encode_box_autoadd_mmcs_attachment_meta( - MMCSAttachmentMeta self, SseSerializer serializer); + MMCSAttachmentMeta self, + SseSerializer serializer, + ); @protected void sse_encode_box_autoadd_mmcs_file( - MMCSFile self, SseSerializer serializer); + MMCSFile self, + SseSerializer serializer, + ); @protected void sse_encode_box_autoadd_monogram_data( - MonogramData self, SseSerializer serializer); + MonogramData self, + SseSerializer serializer, + ); @protected void sse_encode_box_autoadd_move_to_recycle_bin_message( - MoveToRecycleBinMessage self, SseSerializer serializer); + MoveToRecycleBinMessage self, + SseSerializer serializer, + ); @protected void sse_encode_box_autoadd_normal_message( - NormalMessage self, SseSerializer serializer); + NormalMessage self, + SseSerializer serializer, + ); @protected void sse_encode_box_autoadd_ns_attributed_string( - NSAttributedString self, SseSerializer serializer); + NSAttributedString self, + SseSerializer serializer, + ); @protected void sse_encode_box_autoadd_ns_number( - NSNumber self, SseSerializer serializer); + NSNumber self, + SseSerializer serializer, + ); @protected void sse_encode_box_autoadd_ns_string( - NSString self, SseSerializer serializer); + NSString self, + SseSerializer serializer, + ); @protected void sse_encode_box_autoadd_nsurl(NSURL self, SseSerializer serializer); @protected void sse_encode_box_autoadd_num_or_string( - NumOrString self, SseSerializer serializer); + NumOrString self, + SseSerializer serializer, + ); @protected void sse_encode_box_autoadd_operated_chat( - OperatedChat self, SseSerializer serializer); + OperatedChat self, + SseSerializer serializer, + ); @protected void sse_encode_box_autoadd_part_extension( - PartExtension self, SseSerializer serializer); + PartExtension self, + SseSerializer serializer, + ); @protected void sse_encode_box_autoadd_passkey(Passkey self, SseSerializer serializer); @protected void sse_encode_box_autoadd_password_manager_meta( - PasswordManagerMeta self, SseSerializer serializer); + PasswordManagerMeta self, + SseSerializer serializer, + ); @protected void sse_encode_box_autoadd_password_manager_meta_data( - PasswordManagerMetaData self, SseSerializer serializer); + PasswordManagerMetaData self, + SseSerializer serializer, + ); @protected void sse_encode_box_autoadd_password_manager_meta_data_formerly_shared( - PasswordManagerMetaDataFormerlyShared self, SseSerializer serializer); + PasswordManagerMetaDataFormerlyShared self, + SseSerializer serializer, + ); @protected void sse_encode_box_autoadd_password_manager_totp( - PasswordManagerTotp self, SseSerializer serializer); + PasswordManagerTotp self, + SseSerializer serializer, + ); @protected void sse_encode_box_autoadd_password_raw_entry( - PasswordRawEntry self, SseSerializer serializer); + PasswordRawEntry self, + SseSerializer serializer, + ); @protected void sse_encode_box_autoadd_permanent_delete_message( - PermanentDeleteMessage self, SseSerializer serializer); + PermanentDeleteMessage self, + SseSerializer serializer, + ); @protected void sse_encode_box_autoadd_poster_color( - PosterColor self, SseSerializer serializer); + PosterColor self, + SseSerializer serializer, + ); @protected void sse_encode_box_autoadd_pr_poster_content_material_style( - PRPosterContentMaterialStyle self, SseSerializer serializer); + PRPosterContentMaterialStyle self, + SseSerializer serializer, + ); @protected void sse_encode_box_autoadd_push_message( - PushMessage self, SseSerializer serializer); + PushMessage self, + SseSerializer serializer, + ); @protected void sse_encode_box_autoadd_react_message( - ReactMessage self, SseSerializer serializer); + ReactMessage self, + SseSerializer serializer, + ); @protected void sse_encode_box_autoadd_reaction(Reaction self, SseSerializer serializer); @protected void - sse_encode_box_autoadd_record_shared_push_state_auto_owned_rust_opaque_flutter_rust_bridgefor_generated_rust_auto_opaque_inner_aps_watcher( - (SharedPushState, ApsWatcher) self, SseSerializer serializer); + sse_encode_box_autoadd_record_shared_push_state_auto_owned_rust_opaque_flutter_rust_bridgefor_generated_rust_auto_opaque_inner_aps_watcher( + (SharedPushState, ApsWatcher) self, + SseSerializer serializer, + ); @protected void sse_encode_box_autoadd_record_string_string( - (String, String) self, SseSerializer serializer); + (String, String) self, + SseSerializer serializer, + ); @protected void sse_encode_box_autoadd_record_string_u_64( - (String, BigInt) self, SseSerializer serializer); + (String, BigInt) self, + SseSerializer serializer, + ); @protected void sse_encode_box_autoadd_register_state( - RegisterState self, SseSerializer serializer); + RegisterState self, + SseSerializer serializer, + ); @protected void sse_encode_box_autoadd_rename_message( - RenameMessage self, SseSerializer serializer); + RenameMessage self, + SseSerializer serializer, + ); @protected void sse_encode_box_autoadd_rich_link_image_attachment_substitute( - RichLinkImageAttachmentSubstitute self, SseSerializer serializer); + RichLinkImageAttachmentSubstitute self, + SseSerializer serializer, + ); @protected void sse_encode_box_autoadd_schedule_mode( - ScheduleMode self, SseSerializer serializer); + ScheduleMode self, + SseSerializer serializer, + ); @protected void sse_encode_box_autoadd_set_transcript_background_message( - SetTranscriptBackgroundMessage self, SseSerializer serializer); + SetTranscriptBackgroundMessage self, + SseSerializer serializer, + ); @protected void sse_encode_box_autoadd_share_profile_message( - ShareProfileMessage self, SseSerializer serializer); + ShareProfileMessage self, + SseSerializer serializer, + ); @protected void sse_encode_box_autoadd_shared_album( - SharedAlbum self, SseSerializer serializer); + SharedAlbum self, + SseSerializer serializer, + ); @protected void sse_encode_box_autoadd_shared_i_cloud_services( - SharedICloudServices self, SseSerializer serializer); + SharedICloudServices self, + SseSerializer serializer, + ); @protected void sse_encode_box_autoadd_shared_poster( - SharedPoster self, SseSerializer serializer); + SharedPoster self, + SseSerializer serializer, + ); @protected void sse_encode_box_autoadd_shared_push_state( - SharedPushState self, SseSerializer serializer); + SharedPushState self, + SseSerializer serializer, + ); @protected void sse_encode_box_autoadd_simplified_incoming_call_poster( - SimplifiedIncomingCallPoster self, SseSerializer serializer); + SimplifiedIncomingCallPoster self, + SseSerializer serializer, + ); @protected void sse_encode_box_autoadd_simplified_transcript_poster( - SimplifiedTranscriptPoster self, SseSerializer serializer); + SimplifiedTranscriptPoster self, + SseSerializer serializer, + ); @protected void sse_encode_box_autoadd_status_kit_message( - StatusKitMessage self, SseSerializer serializer); + StatusKitMessage self, + SseSerializer serializer, + ); @protected void sse_encode_box_autoadd_support_action( - SupportAction self, SseSerializer serializer); + SupportAction self, + SseSerializer serializer, + ); @protected void sse_encode_box_autoadd_support_alert( - SupportAlert self, SseSerializer serializer); + SupportAlert self, + SseSerializer serializer, + ); @protected void sse_encode_box_autoadd_teardown_sign_in( - TeardownSignIn self, SseSerializer serializer); + TeardownSignIn self, + SseSerializer serializer, + ); @protected void sse_encode_box_autoadd_text_flags( - TextFlags self, SseSerializer serializer); + TextFlags self, + SseSerializer serializer, + ); @protected void sse_encode_box_autoadd_text_format( - TextFormat self, SseSerializer serializer); + TextFormat self, + SseSerializer serializer, + ); @protected void sse_encode_box_autoadd_transcript_dynamic_user_data( - TranscriptDynamicUserData self, SseSerializer serializer); + TranscriptDynamicUserData self, + SseSerializer serializer, + ); @protected void sse_encode_box_autoadd_typing_app( - TypingApp self, SseSerializer serializer); + TypingApp self, + SseSerializer serializer, + ); + + @protected + void sse_encode_box_autoadd_u_16(int self, SseSerializer serializer); @protected void sse_encode_box_autoadd_u_32(int self, SseSerializer serializer); @@ -7055,42 +9637,60 @@ abstract class RustLibApiImplPlatform extends BaseApiImpl { @protected void sse_encode_box_autoadd_unsend_message( - UnsendMessage self, SseSerializer serializer); + UnsendMessage self, + SseSerializer serializer, + ); @protected void sse_encode_box_autoadd_update_account_finish( - UpdateAccountFinish self, SseSerializer serializer); + UpdateAccountFinish self, + SseSerializer serializer, + ); @protected void sse_encode_box_autoadd_update_extension_message( - UpdateExtensionMessage self, SseSerializer serializer); + UpdateExtensionMessage self, + SseSerializer serializer, + ); @protected void sse_encode_box_autoadd_update_profile_message( - UpdateProfileMessage self, SseSerializer serializer); + UpdateProfileMessage self, + SseSerializer serializer, + ); @protected void sse_encode_box_autoadd_update_profile_sharing_message( - UpdateProfileSharingMessage self, SseSerializer serializer); + UpdateProfileSharingMessage self, + SseSerializer serializer, + ); @protected void sse_encode_box_autoadd_wifi_password( - WifiPassword self, SseSerializer serializer); + WifiPassword self, + SseSerializer serializer, + ); @protected void sse_encode_certified_context( - CertifiedContext self, SseSerializer serializer); + CertifiedContext self, + SseSerializer serializer, + ); @protected void sse_encode_change_participant_message( - ChangeParticipantMessage self, SseSerializer serializer); + ChangeParticipantMessage self, + SseSerializer serializer, + ); @protected void sse_encode_chat_proto(ChatProto self, SseSerializer serializer); @protected void sse_encode_cloud_attachment( - CloudAttachment self, SseSerializer serializer); + CloudAttachment self, + SseSerializer serializer, + ); @protected void sse_encode_cloud_chat(CloudChat self, SseSerializer serializer); @@ -7100,11 +9700,15 @@ abstract class RustLibApiImplPlatform extends BaseApiImpl { @protected void sse_encode_cloud_message_summary( - CloudMessageSummary self, SseSerializer serializer); + CloudMessageSummary self, + SseSerializer serializer, + ); @protected void sse_encode_cloud_participant( - CloudParticipant self, SseSerializer serializer); + CloudParticipant self, + SseSerializer serializer, + ); @protected void sse_encode_cloud_prop(CloudProp self, SseSerializer serializer); @@ -7112,16 +9716,356 @@ abstract class RustLibApiImplPlatform extends BaseApiImpl { @protected void sse_encode_cloud_prop_001(CloudProp001 self, SseSerializer serializer); + @protected + void sse_encode_cloud_sync_native_auth_metadata( + CloudSyncNativeAuthMetadata self, + SseSerializer serializer, + ); + + @protected + void sse_encode_cloud_sync_outbound_consume_result( + CloudSyncOutboundConsumeResult self, + SseSerializer serializer, + ); + + @protected + void sse_encode_cloud_sync_outbound_failure_class( + CloudSyncOutboundFailureClass self, + SseSerializer serializer, + ); + + @protected + void sse_encode_cloud_sync_outbound_reconcile_disposition( + CloudSyncOutboundReconcileDisposition self, + SseSerializer serializer, + ); + + @protected + void sse_encode_cloud_sync_outbound_reconcile_result( + CloudSyncOutboundReconcileResult self, + SseSerializer serializer, + ); + + @protected + void sse_encode_cloud_sync_outbound_safe_code( + CloudSyncOutboundSafeCode self, + SseSerializer serializer, + ); + + @protected + void sse_encode_cloud_sync_outbound_save_disposition( + CloudSyncOutboundSaveDisposition self, + SseSerializer serializer, + ); + + @protected + void sse_encode_cloud_sync_outbound_save_outcome( + CloudSyncOutboundSaveOutcome self, + SseSerializer serializer, + ); + + @protected + void sse_encode_cloud_sync_prepared_message_create_input( + CloudSyncPreparedMessageCreateInput self, + SseSerializer serializer, + ); + + @protected + void sse_encode_cloud_sync_prepared_message_create_result( + CloudSyncPreparedMessageCreateResult self, + SseSerializer serializer, + ); + + @protected + void sse_encode_cloud_sync_protected_change( + CloudSyncProtectedChange self, + SseSerializer serializer, + ); + + @protected + void sse_encode_cloud_sync_protected_change_kind( + CloudSyncProtectedChangeKind self, + SseSerializer serializer, + ); + + @protected + void sse_encode_cloud_sync_protected_failure( + CloudSyncProtectedFailure self, + SseSerializer serializer, + ); + + @protected + void sse_encode_cloud_sync_protected_failure_category( + CloudSyncProtectedFailureCategory self, + SseSerializer serializer, + ); + + @protected + void sse_encode_cloud_sync_protected_fetch_result( + CloudSyncProtectedFetchResult self, + SseSerializer serializer, + ); + + @protected + void sse_encode_cloud_sync_protected_garbage_collection( + CloudSyncProtectedGarbageCollection self, + SseSerializer serializer, + ); + + @protected + void sse_encode_cloud_sync_protected_garbage_collection_result( + CloudSyncProtectedGarbageCollectionResult self, + SseSerializer serializer, + ); + + @protected + void sse_encode_cloud_sync_protected_lease_result( + CloudSyncProtectedLeaseResult self, + SseSerializer serializer, + ); + + @protected + void sse_encode_cloud_sync_protected_outbound_stage( + CloudSyncProtectedOutboundStage self, + SseSerializer serializer, + ); + + @protected + void sse_encode_cloud_sync_protected_outbound_stage_result( + CloudSyncProtectedOutboundStageResult self, + SseSerializer serializer, + ); + + @protected + void sse_encode_cloud_sync_protected_page( + CloudSyncProtectedPage self, + SseSerializer serializer, + ); + + @protected + void sse_encode_cloud_sync_protected_preflight_code( + CloudSyncProtectedPreflightCode self, + SseSerializer serializer, + ); + + @protected + void sse_encode_cloud_sync_protected_recovery( + CloudSyncProtectedRecovery self, + SseSerializer serializer, + ); + + @protected + void sse_encode_cloud_sync_protected_recovery_result( + CloudSyncProtectedRecoveryResult self, + SseSerializer serializer, + ); + + @protected + void sse_encode_cloud_sync_protected_retirement_result( + CloudSyncProtectedRetirementResult self, + SseSerializer serializer, + ); + + @protected + void sse_encode_cloud_sync_protected_safe_code( + CloudSyncProtectedSafeCode self, + SseSerializer serializer, + ); + + @protected + void sse_encode_cloud_sync_raw_change( + CloudSyncRawChange self, + SseSerializer serializer, + ); + + @protected + void sse_encode_cloud_sync_raw_failure( + CloudSyncRawFailure self, + SseSerializer serializer, + ); + + @protected + void sse_encode_cloud_sync_raw_failure_category( + CloudSyncRawFailureCategory self, + SseSerializer serializer, + ); + + @protected + void sse_encode_cloud_sync_raw_fetch_result( + CloudSyncRawFetchResult self, + SseSerializer serializer, + ); + + @protected + void sse_encode_cloud_sync_raw_page( + CloudSyncRawPage self, + SseSerializer serializer, + ); + + @protected + void sse_encode_cloud_sync_raw_record_kind( + CloudSyncRawRecordKind self, + SseSerializer serializer, + ); + + @protected + void sse_encode_cloud_sync_raw_system_fields( + CloudSyncRawSystemFields self, + SseSerializer serializer, + ); + + @protected + void sse_encode_cloud_sync_transient_association_kind( + CloudSyncTransientAssociationKind self, + SseSerializer serializer, + ); + + @protected + void sse_encode_cloud_sync_transient_attachment_payload( + CloudSyncTransientAttachmentPayload self, + SseSerializer serializer, + ); + + @protected + void sse_encode_cloud_sync_transient_attributed_body( + CloudSyncTransientAttributedBody self, + SseSerializer serializer, + ); + + @protected + void sse_encode_cloud_sync_transient_chat_payload( + CloudSyncTransientChatPayload self, + SseSerializer serializer, + ); + + @protected + void sse_encode_cloud_sync_transient_chat_style( + CloudSyncTransientChatStyle self, + SseSerializer serializer, + ); + + @protected + void sse_encode_cloud_sync_transient_decode_result( + CloudSyncTransientDecodeResult self, + SseSerializer serializer, + ); + + @protected + void sse_encode_cloud_sync_transient_deferred_reason( + CloudSyncTransientDeferredReason self, + SseSerializer serializer, + ); + + @protected + void sse_encode_cloud_sync_transient_edit_part( + CloudSyncTransientEditPart self, + SseSerializer serializer, + ); + + @protected + void sse_encode_cloud_sync_transient_entity_kind( + CloudSyncTransientEntityKind self, + SseSerializer serializer, + ); + + @protected + void sse_encode_cloud_sync_transient_failure_code( + CloudSyncTransientFailureCode self, + SseSerializer serializer, + ); + + @protected + void sse_encode_cloud_sync_transient_field_state( + CloudSyncTransientFieldState self, + SseSerializer serializer, + ); + + @protected + void sse_encode_cloud_sync_transient_group_photo_payload( + CloudSyncTransientGroupPhotoPayload self, + SseSerializer serializer, + ); + + @protected + void sse_encode_cloud_sync_transient_known_message_flags( + CloudSyncTransientKnownMessageFlags self, + SseSerializer serializer, + ); + + @protected + void sse_encode_cloud_sync_transient_message_edit( + CloudSyncTransientMessageEdit self, + SseSerializer serializer, + ); + + @protected + void sse_encode_cloud_sync_transient_message_payload( + CloudSyncTransientMessagePayload self, + SseSerializer serializer, + ); + + @protected + void sse_encode_cloud_sync_transient_mutation_kind( + CloudSyncTransientMutationKind self, + SseSerializer serializer, + ); + + @protected + void sse_encode_cloud_sync_transient_payload( + CloudSyncTransientPayload self, + SseSerializer serializer, + ); + + @protected + void sse_encode_cloud_sync_transient_quarantine_reason( + CloudSyncTransientQuarantineReason self, + SseSerializer serializer, + ); + + @protected + void sse_encode_cloud_sync_transient_reaction_kind( + CloudSyncTransientReactionKind self, + SseSerializer serializer, + ); + + @protected + void sse_encode_cloud_sync_transient_service( + CloudSyncTransientService self, + SseSerializer serializer, + ); + + @protected + void sse_encode_cloud_sync_transient_snapshot( + CloudSyncTransientSnapshot self, + SseSerializer serializer, + ); + + @protected + void sse_encode_cloud_sync_transient_text_run( + CloudSyncTransientTextRun self, + SseSerializer serializer, + ); + + @protected + void sse_encode_cloud_sync_transient_tombstone( + CloudSyncTransientTombstone self, + SseSerializer serializer, + ); + @protected void sse_encode_conversation_data( - ConversationData self, SseSerializer serializer); + ConversationData self, + SseSerializer serializer, + ); @protected void sse_encode_dart_beacon(DartBeacon self, SseSerializer serializer); @protected void sse_encode_dart_beacon_share_info( - DartBeaconShareInfo self, SseSerializer serializer); + DartBeaconShareInfo self, + SseSerializer serializer, + ); @protected void sse_encode_delete_target(DeleteTarget self, SseSerializer serializer); @@ -7146,7 +10090,9 @@ abstract class RustLibApiImplPlatform extends BaseApiImpl { @protected void sse_encode_ffi_file_packager( - FFIFilePackager self, SseSerializer serializer); + FFIFilePackager self, + SseSerializer serializer, + ); @protected void sse_encode_follow(Follow self, SseSerializer serializer); @@ -7174,7 +10120,9 @@ abstract class RustLibApiImplPlatform extends BaseApiImpl { @protected void sse_encode_group_summary_member( - GroupSummaryMember self, SseSerializer serializer); + GroupSummaryMember self, + SseSerializer serializer, + ); @protected void sse_encode_hw_extra(HwExtra self, SseSerializer serializer); @@ -7187,261 +10135,422 @@ abstract class RustLibApiImplPlatform extends BaseApiImpl { @protected void sse_encode_i_message_name_record( - IMessageNameRecord self, SseSerializer serializer); + IMessageNameRecord self, + SseSerializer serializer, + ); @protected void sse_encode_i_message_nickname_record( - IMessageNicknameRecord self, SseSerializer serializer); + IMessageNicknameRecord self, + SseSerializer serializer, + ); @protected void sse_encode_i_message_poster_record( - IMessagePosterRecord self, SseSerializer serializer); + IMessagePosterRecord self, + SseSerializer serializer, + ); @protected void sse_encode_icon_change_message( - IconChangeMessage self, SseSerializer serializer); + IconChangeMessage self, + SseSerializer serializer, + ); @protected void sse_encode_idms_circle_message( - IdmsCircleMessage self, SseSerializer serializer); + IdmsCircleMessage self, + SseSerializer serializer, + ); @protected void sse_encode_idms_message(IdmsMessage self, SseSerializer serializer); @protected void sse_encode_idms_requested_sign_in( - IdmsRequestedSignIn self, SseSerializer serializer); + IdmsRequestedSignIn self, + SseSerializer serializer, + ); @protected void sse_encode_indexed_message_part( - IndexedMessagePart self, SseSerializer serializer); + IndexedMessagePart self, + SseSerializer serializer, + ); @protected void sse_encode_let_me_in_request( - LetMeInRequest self, SseSerializer serializer); + LetMeInRequest self, + SseSerializer serializer, + ); @protected void sse_encode_link_meta(LinkMeta self, SseSerializer serializer); @protected void - sse_encode_list_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerIDSUser( - List self, SseSerializer serializer); + sse_encode_list_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerIDSUser( + List self, + SseSerializer serializer, + ); @protected void - sse_encode_list_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerStCollapsedValue( - List self, SseSerializer serializer); + sse_encode_list_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerStCollapsedValue( + List self, + SseSerializer serializer, + ); @protected void - sse_encode_list_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerViableBottle( - List self, SseSerializer serializer); + sse_encode_list_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerViableBottle( + List self, + SseSerializer serializer, + ); @protected void sse_encode_list_String(List self, SseSerializer serializer); @protected void sse_encode_list_cloud_participant( - List self, SseSerializer serializer); + List self, + SseSerializer serializer, + ); + + @protected + void sse_encode_list_cloud_sync_outbound_save_outcome( + List self, + SseSerializer serializer, + ); + + @protected + void sse_encode_list_cloud_sync_prepared_message_create_input( + List self, + SseSerializer serializer, + ); + + @protected + void sse_encode_list_cloud_sync_protected_change( + List self, + SseSerializer serializer, + ); + + @protected + void sse_encode_list_cloud_sync_raw_change( + List self, + SseSerializer serializer, + ); + + @protected + void sse_encode_list_cloud_sync_transient_attributed_body( + List self, + SseSerializer serializer, + ); + + @protected + void sse_encode_list_cloud_sync_transient_edit_part( + List self, + SseSerializer serializer, + ); + + @protected + void sse_encode_list_cloud_sync_transient_message_edit( + List self, + SseSerializer serializer, + ); + + @protected + void sse_encode_list_cloud_sync_transient_text_run( + List self, + SseSerializer serializer, + ); @protected void sse_encode_list_dart_beacon( - List self, SseSerializer serializer); + List self, + SseSerializer serializer, + ); @protected void sse_encode_list_follow(List self, SseSerializer serializer); @protected void sse_encode_list_found_device( - List self, SseSerializer serializer); + List self, + SseSerializer serializer, + ); @protected void sse_encode_list_ft_member(List self, SseSerializer serializer); @protected void sse_encode_list_ft_session( - List self, SseSerializer serializer); + List self, + SseSerializer serializer, + ); @protected void sse_encode_list_group_summary_member( - List self, SseSerializer serializer); + List self, + SseSerializer serializer, + ); @protected void sse_encode_list_indexed_message_part( - List self, SseSerializer serializer); + List self, + SseSerializer serializer, + ); @protected void sse_encode_list_list_prim_u_8_strict( - List self, SseSerializer serializer); + List self, + SseSerializer serializer, + ); @protected void sse_encode_list_message_edit( - List self, SseSerializer serializer); + List self, + SseSerializer serializer, + ); @protected void sse_encode_list_message_target( - List self, SseSerializer serializer); + List self, + SseSerializer serializer, + ); @protected void sse_encode_list_password_manager_alt_domain( - List self, SseSerializer serializer); + List self, + SseSerializer serializer, + ); @protected void sse_encode_list_password_manager_meta_change( - List self, SseSerializer serializer); + List self, + SseSerializer serializer, + ); @protected void sse_encode_list_photo_poster_layer( - List self, SseSerializer serializer); + List self, + SseSerializer serializer, + ); @protected void sse_encode_list_poster_asset( - List self, SseSerializer serializer); + List self, + SseSerializer serializer, + ); @protected void sse_encode_list_poster_color( - List self, SseSerializer serializer); + List self, + SseSerializer serializer, + ); @protected void sse_encode_list_prim_f_64_strict( - Float64List self, SseSerializer serializer); + Float64List self, + SseSerializer serializer, + ); @protected void sse_encode_list_prim_i_64_strict( - Int64List self, SseSerializer serializer); + Int64List self, + SseSerializer serializer, + ); @protected void sse_encode_list_prim_u_32_strict( - Uint32List self, SseSerializer serializer); + Uint32List self, + SseSerializer serializer, + ); @protected void sse_encode_list_prim_u_8_loose(List self, SseSerializer serializer); @protected void sse_encode_list_prim_u_8_strict( - Uint8List self, SseSerializer serializer); + Uint8List self, + SseSerializer serializer, + ); @protected void sse_encode_list_private_device_info( - List self, SseSerializer serializer); + List self, + SseSerializer serializer, + ); @protected void - sse_encode_list_record_string_auto_owned_rust_opaque_flutter_rust_bridgefor_generated_rust_auto_opaque_inner_asset( - List<(String, Asset)> self, SseSerializer serializer); + sse_encode_list_record_string_auto_owned_rust_opaque_flutter_rust_bridgefor_generated_rust_auto_opaque_inner_asset( + List<(String, Asset)> self, + SseSerializer serializer, + ); @protected void - sse_encode_list_record_string_auto_owned_rust_opaque_flutter_rust_bridgefor_generated_rust_auto_opaque_inner_st_collapsed_value( - List<(String, StCollapsedValue)> self, SseSerializer serializer); + sse_encode_list_record_string_auto_owned_rust_opaque_flutter_rust_bridgefor_generated_rust_auto_opaque_inner_st_collapsed_value( + List<(String, StCollapsedValue)> self, + SseSerializer serializer, + ); @protected void sse_encode_list_record_string_bool( - List<(String, bool)> self, SseSerializer serializer); + List<(String, bool)> self, + SseSerializer serializer, + ); @protected void sse_encode_list_record_string_casted_primitive_u_64( - List<(String, int)> self, SseSerializer serializer); + List<(String, int)> self, + SseSerializer serializer, + ); @protected void sse_encode_list_record_string_cloud_attachment( - List<(String, CloudAttachment)> self, SseSerializer serializer); + List<(String, CloudAttachment)> self, + SseSerializer serializer, + ); @protected void sse_encode_list_record_string_cloud_chat( - List<(String, CloudChat)> self, SseSerializer serializer); + List<(String, CloudChat)> self, + SseSerializer serializer, + ); @protected void sse_encode_list_record_string_cloud_message( - List<(String, CloudMessage)> self, SseSerializer serializer); + List<(String, CloudMessage)> self, + SseSerializer serializer, + ); @protected void sse_encode_list_record_string_ft_participant( - List<(String, FTParticipant)> self, SseSerializer serializer); + List<(String, FTParticipant)> self, + SseSerializer serializer, + ); @protected void sse_encode_list_record_string_group_summary( - List<(String, GroupSummary)> self, SseSerializer serializer); + List<(String, GroupSummary)> self, + SseSerializer serializer, + ); @protected void sse_encode_list_record_string_list_message_edit( - List<(String, List)> self, SseSerializer serializer); + List<(String, List)> self, + SseSerializer serializer, + ); @protected void sse_encode_list_record_string_list_prim_u_8_strict( - List<(String, Uint8List)> self, SseSerializer serializer); + List<(String, Uint8List)> self, + SseSerializer serializer, + ); @protected void sse_encode_list_record_string_message_edit_range( - List<(String, MessageEditRange)> self, SseSerializer serializer); + List<(String, MessageEditRange)> self, + SseSerializer serializer, + ); @protected void sse_encode_list_record_string_opt_box_autoadd_cloud_attachment( - List<(String, CloudAttachment?)> self, SseSerializer serializer); + List<(String, CloudAttachment?)> self, + SseSerializer serializer, + ); @protected void sse_encode_list_record_string_opt_box_autoadd_cloud_chat( - List<(String, CloudChat?)> self, SseSerializer serializer); + List<(String, CloudChat?)> self, + SseSerializer serializer, + ); @protected void sse_encode_list_record_string_opt_box_autoadd_cloud_message( - List<(String, CloudMessage?)> self, SseSerializer serializer); + List<(String, CloudMessage?)> self, + SseSerializer serializer, + ); @protected void sse_encode_list_record_string_password_manager_meta_data_ctx( - List<(String, PasswordManagerMetaDataCtx)> self, - SseSerializer serializer); + List<(String, PasswordManagerMetaDataCtx)> self, + SseSerializer serializer, + ); @protected void sse_encode_list_record_string_record_opt_string_passkey( - List<(String, (String?, Passkey))> self, SseSerializer serializer); + List<(String, (String?, Passkey))> self, + SseSerializer serializer, + ); @protected void sse_encode_list_record_string_record_opt_string_password_manager_meta( - List<(String, (String?, PasswordManagerMeta))> self, - SseSerializer serializer); + List<(String, (String?, PasswordManagerMeta))> self, + SseSerializer serializer, + ); @protected void sse_encode_list_record_string_record_opt_string_password_raw_entry( - List<(String, (String?, PasswordRawEntry))> self, - SseSerializer serializer); + List<(String, (String?, PasswordRawEntry))> self, + SseSerializer serializer, + ); @protected void sse_encode_list_record_string_record_opt_string_wifi_password( - List<(String, (String?, WifiPassword))> self, SseSerializer serializer); + List<(String, (String?, WifiPassword))> self, + SseSerializer serializer, + ); @protected void sse_encode_list_record_string_share_invite_content_data( - List<(String, ShareInviteContentData)> self, SseSerializer serializer); + List<(String, ShareInviteContentData)> self, + SseSerializer serializer, + ); @protected void sse_encode_list_record_string_status_kit_personal_config( - List<(String, StatusKitPersonalConfig)> self, SseSerializer serializer); + List<(String, StatusKitPersonalConfig)> self, + SseSerializer serializer, + ); @protected void sse_encode_list_record_string_string( - List<(String, String)> self, SseSerializer serializer); + List<(String, String)> self, + SseSerializer serializer, + ); @protected void sse_encode_list_record_string_sync_status( - List<(String, SyncStatus)> self, SseSerializer serializer); + List<(String, SyncStatus)> self, + SseSerializer serializer, + ); @protected void sse_encode_list_record_u_32_ns_dictionary_typed_coder( - List<(int, NSDictionaryTypedCoder)> self, SseSerializer serializer); + List<(int, NSDictionaryTypedCoder)> self, + SseSerializer serializer, + ); @protected void sse_encode_list_report_message( - List self, SseSerializer serializer); + List self, + SseSerializer serializer, + ); @protected void sse_encode_list_shared_album( - List self, SseSerializer serializer); + List self, + SseSerializer serializer, + ); @protected void sse_encode_list_trusted_phone_number( - List self, SseSerializer serializer); + List self, + SseSerializer serializer, + ); @protected void sse_encode_list_ui_color(List self, SseSerializer serializer); @@ -7454,19 +10563,27 @@ abstract class RustLibApiImplPlatform extends BaseApiImpl { @protected void sse_encode_lp_icon_metadata( - LPIconMetadata self, SseSerializer serializer); + LPIconMetadata self, + SseSerializer serializer, + ); @protected void sse_encode_lp_image_metadata( - LPImageMetadata self, SseSerializer serializer); + LPImageMetadata self, + SseSerializer serializer, + ); @protected void sse_encode_lp_link_metadata( - LPLinkMetadata self, SseSerializer serializer); + LPLinkMetadata self, + SseSerializer serializer, + ); @protected void sse_encode_lp_specialization_metadata( - LPSpecializationMetadata self, SseSerializer serializer); + LPSpecializationMetadata self, + SseSerializer serializer, + ); @protected void sse_encode_memoji_data(MemojiData self, SseSerializer serializer); @@ -7479,7 +10596,9 @@ abstract class RustLibApiImplPlatform extends BaseApiImpl { @protected void sse_encode_message_edit_range( - MessageEditRange self, SseSerializer serializer); + MessageEditRange self, + SseSerializer serializer, + ); @protected void sse_encode_message_inst(MessageInst self, SseSerializer serializer); @@ -7504,7 +10623,9 @@ abstract class RustLibApiImplPlatform extends BaseApiImpl { @protected void sse_encode_message_summary_info( - MessageSummaryInfo self, SseSerializer serializer); + MessageSummaryInfo self, + SseSerializer serializer, + ); @protected void sse_encode_message_target(MessageTarget self, SseSerializer serializer); @@ -7514,40 +10635,54 @@ abstract class RustLibApiImplPlatform extends BaseApiImpl { @protected void sse_encode_mmcs_attachment_meta( - MMCSAttachmentMeta self, SseSerializer serializer); + MMCSAttachmentMeta self, + SseSerializer serializer, + ); @protected void sse_encode_mmcs_file(MMCSFile self, SseSerializer serializer); @protected void sse_encode_mmcs_transfer_progress( - MMCSTransferProgress self, SseSerializer serializer); + MMCSTransferProgress self, + SseSerializer serializer, + ); @protected void sse_encode_monogram_data(MonogramData self, SseSerializer serializer); @protected void sse_encode_move_to_recycle_bin_message( - MoveToRecycleBinMessage self, SseSerializer serializer); + MoveToRecycleBinMessage self, + SseSerializer serializer, + ); @protected void sse_encode_my_async_runtime( - MyAsyncRuntime self, SseSerializer serializer); + MyAsyncRuntime self, + SseSerializer serializer, + ); @protected void sse_encode_normal_message(NormalMessage self, SseSerializer serializer); @protected void sse_encode_ns_attributed_string( - NSAttributedString self, SseSerializer serializer); + NSAttributedString self, + SseSerializer serializer, + ); @protected void sse_encode_ns_dictionary_class( - NSDictionaryClass self, SseSerializer serializer); + NSDictionaryClass self, + SseSerializer serializer, + ); @protected void sse_encode_ns_dictionary_typed_coder( - NSDictionaryTypedCoder self, SseSerializer serializer); + NSDictionaryTypedCoder self, + SseSerializer serializer, + ); @protected void sse_encode_ns_number(NSNumber self, SseSerializer serializer); @@ -7572,332 +10707,624 @@ abstract class RustLibApiImplPlatform extends BaseApiImpl { @protected void sse_encode_opt_CastedPrimitive_usize( - int? self, SseSerializer serializer); + int? self, + SseSerializer serializer, + ); @protected void sse_encode_opt_String(String? self, SseSerializer serializer); @protected void - sse_encode_opt_box_autoadd_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerAPSState( - ApsState? self, SseSerializer serializer); + sse_encode_opt_box_autoadd_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerAPSState( + ApsState? self, + SseSerializer serializer, + ); + + @protected + void + sse_encode_opt_box_autoadd_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcCloudKitClientDefaultAnisetteProvider( + ArcCloudKitClientDefaultAnisetteProvider? self, + SseSerializer serializer, + ); @protected void - sse_encode_opt_box_autoadd_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcCloudKitClientDefaultAnisetteProvider( - ArcCloudKitClientDefaultAnisetteProvider? self, - SseSerializer serializer); + sse_encode_opt_box_autoadd_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcCloudMessagesClientDefaultAnisetteProvider( + ArcCloudMessagesClientDefaultAnisetteProvider? self, + SseSerializer serializer, + ); @protected void - sse_encode_opt_box_autoadd_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcCloudMessagesClientDefaultAnisetteProvider( - ArcCloudMessagesClientDefaultAnisetteProvider? self, - SseSerializer serializer); + sse_encode_opt_box_autoadd_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcFindMyClientDefaultAnisetteProvider( + ArcFindMyClientDefaultAnisetteProvider? self, + SseSerializer serializer, + ); @protected void - sse_encode_opt_box_autoadd_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcFindMyClientDefaultAnisetteProvider( - ArcFindMyClientDefaultAnisetteProvider? self, - SseSerializer serializer); + sse_encode_opt_box_autoadd_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcKeychainClientDefaultAnisetteProvider( + ArcKeychainClientDefaultAnisetteProvider? self, + SseSerializer serializer, + ); @protected void - sse_encode_opt_box_autoadd_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcKeychainClientDefaultAnisetteProvider( - ArcKeychainClientDefaultAnisetteProvider? self, - SseSerializer serializer); + sse_encode_opt_box_autoadd_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcMutexAppleAccountDefaultAnisetteProvider( + ArcMutexAppleAccountDefaultAnisetteProvider? self, + SseSerializer serializer, + ); @protected void - sse_encode_opt_box_autoadd_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcMutexAppleAccountDefaultAnisetteProvider( - ArcMutexAppleAccountDefaultAnisetteProvider? self, - SseSerializer serializer); + sse_encode_opt_box_autoadd_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcPasswordManagerDefaultAnisetteProvider( + ArcPasswordManagerDefaultAnisetteProvider? self, + SseSerializer serializer, + ); @protected void - sse_encode_opt_box_autoadd_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcPasswordManagerDefaultAnisetteProvider( - ArcPasswordManagerDefaultAnisetteProvider? self, - SseSerializer serializer); + sse_encode_opt_box_autoadd_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerAsset( + Asset? self, + SseSerializer serializer, + ); @protected void - sse_encode_opt_box_autoadd_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerAsset( - Asset? self, SseSerializer serializer); + sse_encode_opt_box_autoadd_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerChannelInterestToken( + ChannelInterestToken? self, + SseSerializer serializer, + ); @protected void - sse_encode_opt_box_autoadd_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerChannelInterestToken( - ChannelInterestToken? self, SseSerializer serializer); + sse_encode_opt_box_autoadd_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerCircleClientSessionDefaultAnisetteProvider( + CircleClientSessionDefaultAnisetteProvider? self, + SseSerializer serializer, + ); @protected void - sse_encode_opt_box_autoadd_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerCircleClientSessionDefaultAnisetteProvider( - CircleClientSessionDefaultAnisetteProvider? self, - SseSerializer serializer); + sse_encode_opt_box_autoadd_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerCloudSyncPreparedMessageCreateHandle( + CloudSyncPreparedMessageCreateHandle? self, + SseSerializer serializer, + ); @protected void - sse_encode_opt_box_autoadd_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerConversationLink( - ConversationLink? self, SseSerializer serializer); + sse_encode_opt_box_autoadd_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerConversationLink( + ConversationLink? self, + SseSerializer serializer, + ); @protected void - sse_encode_opt_box_autoadd_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerConversationParticipant( - ConversationParticipant? self, SseSerializer serializer); + sse_encode_opt_box_autoadd_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerConversationParticipant( + ConversationParticipant? self, + SseSerializer serializer, + ); @protected void - sse_encode_opt_box_autoadd_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerDate( - Date? self, SseSerializer serializer); + sse_encode_opt_box_autoadd_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerDate( + Date? self, + SseSerializer serializer, + ); @protected void - sse_encode_opt_box_autoadd_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerGZipWrapperChatProto( - GZipWrapperChatProto? self, SseSerializer serializer); + sse_encode_opt_box_autoadd_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerGZipWrapperChatProto( + GZipWrapperChatProto? self, + SseSerializer serializer, + ); @protected void - sse_encode_opt_box_autoadd_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerGZipWrapperMessageProto2( - GZipWrapperMessageProto2? self, SseSerializer serializer); + sse_encode_opt_box_autoadd_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerGZipWrapperMessageProto2( + GZipWrapperMessageProto2? self, + SseSerializer serializer, + ); @protected void - sse_encode_opt_box_autoadd_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerGZipWrapperMessageProto3( - GZipWrapperMessageProto3? self, SseSerializer serializer); + sse_encode_opt_box_autoadd_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerGZipWrapperMessageProto3( + GZipWrapperMessageProto3? self, + SseSerializer serializer, + ); @protected void - sse_encode_opt_box_autoadd_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerGZipWrapperMessageProto4( - GZipWrapperMessageProto4? self, SseSerializer serializer); + sse_encode_opt_box_autoadd_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerGZipWrapperMessageProto4( + GZipWrapperMessageProto4? self, + SseSerializer serializer, + ); @protected void - sse_encode_opt_box_autoadd_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerIDSUser( - IdsUser? self, SseSerializer serializer); + sse_encode_opt_box_autoadd_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerIDSUser( + IdsUser? self, + SseSerializer serializer, + ); @protected void - sse_encode_opt_box_autoadd_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerLocationReport( - LocationReport? self, SseSerializer serializer); + sse_encode_opt_box_autoadd_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerLocationReport( + LocationReport? self, + SseSerializer serializer, + ); @protected void - sse_encode_opt_box_autoadd_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerNSArrayLPIconMetadata( - NsArrayLpIconMetadata? self, SseSerializer serializer); + sse_encode_opt_box_autoadd_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerNSArrayLPIconMetadata( + NsArrayLpIconMetadata? self, + SseSerializer serializer, + ); @protected void - sse_encode_opt_box_autoadd_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerNSArrayLPImageMetadata( - NsArrayLpImageMetadata? self, SseSerializer serializer); + sse_encode_opt_box_autoadd_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerNSArrayLPImageMetadata( + NsArrayLpImageMetadata? self, + SseSerializer serializer, + ); @protected void - sse_encode_opt_box_autoadd_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerPushError( - PushError? self, SseSerializer serializer); + sse_encode_opt_box_autoadd_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerPushError( + PushError? self, + SseSerializer serializer, + ); @protected void - sse_encode_opt_box_autoadd_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerSavedHardwareState( - SavedHardwareState? self, SseSerializer serializer); + sse_encode_opt_box_autoadd_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerSavedHardwareState( + SavedHardwareState? self, + SseSerializer serializer, + ); @protected void - sse_encode_opt_box_autoadd_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerSyncManagerDefaultAnisetteProviderMyFilePackager( - SyncManagerDefaultAnisetteProviderMyFilePackager? self, - SseSerializer serializer); + sse_encode_opt_box_autoadd_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerSyncManagerDefaultAnisetteProviderMyFilePackager( + SyncManagerDefaultAnisetteProviderMyFilePackager? self, + SseSerializer serializer, + ); @protected void - sse_encode_opt_box_autoadd_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerSystemTime( - SystemTime? self, SseSerializer serializer); + sse_encode_opt_box_autoadd_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerSystemTime( + SystemTime? self, + SseSerializer serializer, + ); @protected void sse_encode_opt_box_autoadd_address( - Address? self, SseSerializer serializer); + Address? self, + SseSerializer serializer, + ); @protected void sse_encode_opt_box_autoadd_attachment( - Attachment? self, SseSerializer serializer); + Attachment? self, + SseSerializer serializer, + ); @protected void sse_encode_opt_box_autoadd_attachment_meta_extra( - AttachmentMetaExtra? self, SseSerializer serializer); + AttachmentMetaExtra? self, + SseSerializer serializer, + ); @protected void sse_encode_opt_box_autoadd_balloon( - Balloon? self, SseSerializer serializer); + Balloon? self, + SseSerializer serializer, + ); @protected void sse_encode_opt_box_autoadd_balloon_layout( - BalloonLayout? self, SseSerializer serializer); + BalloonLayout? self, + SseSerializer serializer, + ); @protected void sse_encode_opt_box_autoadd_bool(bool? self, SseSerializer serializer); @protected void sse_encode_opt_box_autoadd_certified_context( - CertifiedContext? self, SseSerializer serializer); + CertifiedContext? self, + SseSerializer serializer, + ); @protected void sse_encode_opt_box_autoadd_cloud_attachment( - CloudAttachment? self, SseSerializer serializer); + CloudAttachment? self, + SseSerializer serializer, + ); @protected void sse_encode_opt_box_autoadd_cloud_chat( - CloudChat? self, SseSerializer serializer); + CloudChat? self, + SseSerializer serializer, + ); @protected void sse_encode_opt_box_autoadd_cloud_message( - CloudMessage? self, SseSerializer serializer); + CloudMessage? self, + SseSerializer serializer, + ); @protected void sse_encode_opt_box_autoadd_cloud_prop( - CloudProp? self, SseSerializer serializer); + CloudProp? self, + SseSerializer serializer, + ); + + @protected + void sse_encode_opt_box_autoadd_cloud_sync_outbound_failure_class( + CloudSyncOutboundFailureClass? self, + SseSerializer serializer, + ); + + @protected + void sse_encode_opt_box_autoadd_cloud_sync_outbound_reconcile_disposition( + CloudSyncOutboundReconcileDisposition? self, + SseSerializer serializer, + ); + + @protected + void sse_encode_opt_box_autoadd_cloud_sync_outbound_safe_code( + CloudSyncOutboundSafeCode? self, + SseSerializer serializer, + ); + + @protected + void sse_encode_opt_box_autoadd_cloud_sync_protected_failure( + CloudSyncProtectedFailure? self, + SseSerializer serializer, + ); + + @protected + void sse_encode_opt_box_autoadd_cloud_sync_protected_garbage_collection( + CloudSyncProtectedGarbageCollection? self, + SseSerializer serializer, + ); + + @protected + void sse_encode_opt_box_autoadd_cloud_sync_protected_outbound_stage( + CloudSyncProtectedOutboundStage? self, + SseSerializer serializer, + ); + + @protected + void sse_encode_opt_box_autoadd_cloud_sync_protected_page( + CloudSyncProtectedPage? self, + SseSerializer serializer, + ); + + @protected + void sse_encode_opt_box_autoadd_cloud_sync_protected_preflight_code( + CloudSyncProtectedPreflightCode? self, + SseSerializer serializer, + ); + + @protected + void sse_encode_opt_box_autoadd_cloud_sync_protected_recovery( + CloudSyncProtectedRecovery? self, + SseSerializer serializer, + ); + + @protected + void sse_encode_opt_box_autoadd_cloud_sync_raw_failure( + CloudSyncRawFailure? self, + SseSerializer serializer, + ); + + @protected + void sse_encode_opt_box_autoadd_cloud_sync_raw_page( + CloudSyncRawPage? self, + SseSerializer serializer, + ); + + @protected + void sse_encode_opt_box_autoadd_cloud_sync_raw_system_fields( + CloudSyncRawSystemFields? self, + SseSerializer serializer, + ); + + @protected + void sse_encode_opt_box_autoadd_cloud_sync_transient_attachment_payload( + CloudSyncTransientAttachmentPayload? self, + SseSerializer serializer, + ); + + @protected + void sse_encode_opt_box_autoadd_cloud_sync_transient_chat_payload( + CloudSyncTransientChatPayload? self, + SseSerializer serializer, + ); + + @protected + void sse_encode_opt_box_autoadd_cloud_sync_transient_deferred_reason( + CloudSyncTransientDeferredReason? self, + SseSerializer serializer, + ); + + @protected + void sse_encode_opt_box_autoadd_cloud_sync_transient_entity_kind( + CloudSyncTransientEntityKind? self, + SseSerializer serializer, + ); + + @protected + void sse_encode_opt_box_autoadd_cloud_sync_transient_failure_code( + CloudSyncTransientFailureCode? self, + SseSerializer serializer, + ); + + @protected + void sse_encode_opt_box_autoadd_cloud_sync_transient_group_photo_payload( + CloudSyncTransientGroupPhotoPayload? self, + SseSerializer serializer, + ); + + @protected + void sse_encode_opt_box_autoadd_cloud_sync_transient_message_payload( + CloudSyncTransientMessagePayload? self, + SseSerializer serializer, + ); + + @protected + void sse_encode_opt_box_autoadd_cloud_sync_transient_mutation_kind( + CloudSyncTransientMutationKind? self, + SseSerializer serializer, + ); + + @protected + void sse_encode_opt_box_autoadd_cloud_sync_transient_payload( + CloudSyncTransientPayload? self, + SseSerializer serializer, + ); + + @protected + void sse_encode_opt_box_autoadd_cloud_sync_transient_quarantine_reason( + CloudSyncTransientQuarantineReason? self, + SseSerializer serializer, + ); + + @protected + void sse_encode_opt_box_autoadd_cloud_sync_transient_reaction_kind( + CloudSyncTransientReactionKind? self, + SseSerializer serializer, + ); + + @protected + void sse_encode_opt_box_autoadd_cloud_sync_transient_snapshot( + CloudSyncTransientSnapshot? self, + SseSerializer serializer, + ); + + @protected + void sse_encode_opt_box_autoadd_cloud_sync_transient_tombstone( + CloudSyncTransientTombstone? self, + SseSerializer serializer, + ); @protected void sse_encode_opt_box_autoadd_conversation_data( - ConversationData? self, SseSerializer serializer); + ConversationData? self, + SseSerializer serializer, + ); @protected void sse_encode_opt_box_autoadd_dart_beacon_share_info( - DartBeaconShareInfo? self, SseSerializer serializer); + DartBeaconShareInfo? self, + SseSerializer serializer, + ); @protected void sse_encode_opt_box_autoadd_extension_app( - ExtensionApp? self, SseSerializer serializer); + ExtensionApp? self, + SseSerializer serializer, + ); @protected void sse_encode_opt_box_autoadd_f_64(double? self, SseSerializer serializer); @protected void sse_encode_opt_box_autoadd_ft_mode( - FTMode? self, SseSerializer serializer); + FTMode? self, + SseSerializer serializer, + ); @protected void sse_encode_opt_box_autoadd_i_32(int? self, SseSerializer serializer); @protected void sse_encode_opt_box_autoadd_i_64( - PlatformInt64? self, SseSerializer serializer); + PlatformInt64? self, + SseSerializer serializer, + ); @protected void sse_encode_opt_box_autoadd_i_message_poster_record( - IMessagePosterRecord? self, SseSerializer serializer); + IMessagePosterRecord? self, + SseSerializer serializer, + ); @protected void sse_encode_opt_box_autoadd_idms_requested_sign_in( - IdmsRequestedSignIn? self, SseSerializer serializer); + IdmsRequestedSignIn? self, + SseSerializer serializer, + ); @protected void sse_encode_opt_box_autoadd_link_meta( - LinkMeta? self, SseSerializer serializer); + LinkMeta? self, + SseSerializer serializer, + ); @protected void sse_encode_opt_box_autoadd_location( - Location? self, SseSerializer serializer); + Location? self, + SseSerializer serializer, + ); @protected void sse_encode_opt_box_autoadd_login_state( - LoginState? self, SseSerializer serializer); + LoginState? self, + SseSerializer serializer, + ); @protected void sse_encode_opt_box_autoadd_lp_icon_metadata( - LPIconMetadata? self, SseSerializer serializer); + LPIconMetadata? self, + SseSerializer serializer, + ); @protected void sse_encode_opt_box_autoadd_lp_image_metadata( - LPImageMetadata? self, SseSerializer serializer); + LPImageMetadata? self, + SseSerializer serializer, + ); @protected void sse_encode_opt_box_autoadd_lp_specialization_metadata( - LPSpecializationMetadata? self, SseSerializer serializer); + LPSpecializationMetadata? self, + SseSerializer serializer, + ); @protected void sse_encode_opt_box_autoadd_mmcs_attachment_meta( - MMCSAttachmentMeta? self, SseSerializer serializer); + MMCSAttachmentMeta? self, + SseSerializer serializer, + ); @protected void sse_encode_opt_box_autoadd_mmcs_file( - MMCSFile? self, SseSerializer serializer); + MMCSFile? self, + SseSerializer serializer, + ); @protected void sse_encode_opt_box_autoadd_nsurl(NSURL? self, SseSerializer serializer); @protected void sse_encode_opt_box_autoadd_num_or_string( - NumOrString? self, SseSerializer serializer); + NumOrString? self, + SseSerializer serializer, + ); @protected void sse_encode_opt_box_autoadd_part_extension( - PartExtension? self, SseSerializer serializer); + PartExtension? self, + SseSerializer serializer, + ); @protected void sse_encode_opt_box_autoadd_password_manager_meta_data_formerly_shared( - PasswordManagerMetaDataFormerlyShared? self, SseSerializer serializer); + PasswordManagerMetaDataFormerlyShared? self, + SseSerializer serializer, + ); @protected void sse_encode_opt_box_autoadd_password_manager_totp( - PasswordManagerTotp? self, SseSerializer serializer); + PasswordManagerTotp? self, + SseSerializer serializer, + ); @protected void sse_encode_opt_box_autoadd_poster_color( - PosterColor? self, SseSerializer serializer); + PosterColor? self, + SseSerializer serializer, + ); @protected void sse_encode_opt_box_autoadd_pr_poster_content_material_style( - PRPosterContentMaterialStyle? self, SseSerializer serializer); + PRPosterContentMaterialStyle? self, + SseSerializer serializer, + ); @protected void sse_encode_opt_box_autoadd_push_message( - PushMessage? self, SseSerializer serializer); + PushMessage? self, + SseSerializer serializer, + ); @protected void - sse_encode_opt_box_autoadd_record_shared_push_state_auto_owned_rust_opaque_flutter_rust_bridgefor_generated_rust_auto_opaque_inner_aps_watcher( - (SharedPushState, ApsWatcher)? self, SseSerializer serializer); + sse_encode_opt_box_autoadd_record_shared_push_state_auto_owned_rust_opaque_flutter_rust_bridgefor_generated_rust_auto_opaque_inner_aps_watcher( + (SharedPushState, ApsWatcher)? self, + SseSerializer serializer, + ); @protected void sse_encode_opt_box_autoadd_record_string_string( - (String, String)? self, SseSerializer serializer); + (String, String)? self, + SseSerializer serializer, + ); @protected void sse_encode_opt_box_autoadd_record_string_u_64( - (String, BigInt)? self, SseSerializer serializer); + (String, BigInt)? self, + SseSerializer serializer, + ); @protected void sse_encode_opt_box_autoadd_rich_link_image_attachment_substitute( - RichLinkImageAttachmentSubstitute? self, SseSerializer serializer); + RichLinkImageAttachmentSubstitute? self, + SseSerializer serializer, + ); @protected void sse_encode_opt_box_autoadd_schedule_mode( - ScheduleMode? self, SseSerializer serializer); + ScheduleMode? self, + SseSerializer serializer, + ); @protected void sse_encode_opt_box_autoadd_share_profile_message( - ShareProfileMessage? self, SseSerializer serializer); + ShareProfileMessage? self, + SseSerializer serializer, + ); @protected void sse_encode_opt_box_autoadd_shared_i_cloud_services( - SharedICloudServices? self, SseSerializer serializer); + SharedICloudServices? self, + SseSerializer serializer, + ); @protected void sse_encode_opt_box_autoadd_shared_poster( - SharedPoster? self, SseSerializer serializer); + SharedPoster? self, + SseSerializer serializer, + ); @protected void sse_encode_opt_box_autoadd_shared_push_state( - SharedPushState? self, SseSerializer serializer); + SharedPushState? self, + SseSerializer serializer, + ); @protected void sse_encode_opt_box_autoadd_support_action( - SupportAction? self, SseSerializer serializer); + SupportAction? self, + SseSerializer serializer, + ); @protected void sse_encode_opt_box_autoadd_support_alert( - SupportAlert? self, SseSerializer serializer); + SupportAlert? self, + SseSerializer serializer, + ); @protected void sse_encode_opt_box_autoadd_typing_app( - TypingApp? self, SseSerializer serializer); + TypingApp? self, + SseSerializer serializer, + ); + + @protected + void sse_encode_opt_box_autoadd_u_16(int? self, SseSerializer serializer); @protected void sse_encode_opt_box_autoadd_u_32(int? self, SseSerializer serializer); @@ -7907,23 +11334,31 @@ abstract class RustLibApiImplPlatform extends BaseApiImpl { @protected void sse_encode_opt_box_autoadd_update_account_finish( - UpdateAccountFinish? self, SseSerializer serializer); + UpdateAccountFinish? self, + SseSerializer serializer, + ); @protected void - sse_encode_opt_list_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerIDSUser( - List? self, SseSerializer serializer); + sse_encode_opt_list_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerIDSUser( + List? self, + SseSerializer serializer, + ); @protected void sse_encode_opt_list_String(List? self, SseSerializer serializer); @protected void sse_encode_opt_list_message_target( - List? self, SseSerializer serializer); + List? self, + SseSerializer serializer, + ); @protected void sse_encode_opt_list_prim_u_8_strict( - Uint8List? self, SseSerializer serializer); + Uint8List? self, + SseSerializer serializer, + ); @protected void sse_encode_part_extension(PartExtension self, SseSerializer serializer); @@ -7933,63 +11368,93 @@ abstract class RustLibApiImplPlatform extends BaseApiImpl { @protected void sse_encode_password_manager_alt_domain( - PasswordManagerAltDomain self, SseSerializer serializer); + PasswordManagerAltDomain self, + SseSerializer serializer, + ); @protected void sse_encode_password_manager_meta( - PasswordManagerMeta self, SseSerializer serializer); + PasswordManagerMeta self, + SseSerializer serializer, + ); @protected void sse_encode_password_manager_meta_change( - PasswordManagerMetaChange self, SseSerializer serializer); + PasswordManagerMetaChange self, + SseSerializer serializer, + ); @protected void sse_encode_password_manager_meta_data( - PasswordManagerMetaData self, SseSerializer serializer); + PasswordManagerMetaData self, + SseSerializer serializer, + ); @protected void sse_encode_password_manager_meta_data_ctx( - PasswordManagerMetaDataCtx self, SseSerializer serializer); + PasswordManagerMetaDataCtx self, + SseSerializer serializer, + ); @protected void sse_encode_password_manager_meta_data_formerly_shared( - PasswordManagerMetaDataFormerlyShared self, SseSerializer serializer); + PasswordManagerMetaDataFormerlyShared self, + SseSerializer serializer, + ); @protected void sse_encode_password_manager_totp( - PasswordManagerTotp self, SseSerializer serializer); + PasswordManagerTotp self, + SseSerializer serializer, + ); @protected void sse_encode_password_raw_entry( - PasswordRawEntry self, SseSerializer serializer); + PasswordRawEntry self, + SseSerializer serializer, + ); @protected void sse_encode_permanent_delete_message( - PermanentDeleteMessage self, SseSerializer serializer); + PermanentDeleteMessage self, + SseSerializer serializer, + ); @protected void sse_encode_photo_poster_contents( - PhotoPosterContents self, SseSerializer serializer); + PhotoPosterContents self, + SseSerializer serializer, + ); @protected void sse_encode_photo_poster_contents_frame( - PhotoPosterContentsFrame self, SseSerializer serializer); + PhotoPosterContentsFrame self, + SseSerializer serializer, + ); @protected void sse_encode_photo_poster_contents_size( - PhotoPosterContentsSize self, SseSerializer serializer); + PhotoPosterContentsSize self, + SseSerializer serializer, + ); @protected void sse_encode_photo_poster_layer( - PhotoPosterLayer self, SseSerializer serializer); + PhotoPosterLayer self, + SseSerializer serializer, + ); @protected void sse_encode_photo_poster_layout( - PhotoPosterLayout self, SseSerializer serializer); + PhotoPosterLayout self, + SseSerializer serializer, + ); @protected void sse_encode_photo_poster_properties( - PhotoPosterProperties self, SseSerializer serializer); + PhotoPosterProperties self, + SseSerializer serializer, + ); @protected void sse_encode_poll_result(PollResult self, SseSerializer serializer); @@ -8011,23 +11476,33 @@ abstract class RustLibApiImplPlatform extends BaseApiImpl { @protected void sse_encode_pr_poster_content_material_style( - PRPosterContentMaterialStyle self, SseSerializer serializer); + PRPosterContentMaterialStyle self, + SseSerializer serializer, + ); @protected void sse_encode_pr_poster_system_time_font_configuration( - PRPosterSystemTimeFontConfiguration self, SseSerializer serializer); + PRPosterSystemTimeFontConfiguration self, + SseSerializer serializer, + ); @protected void sse_encode_pr_poster_title_style_configuration( - PRPosterTitleStyleConfiguration self, SseSerializer serializer); + PRPosterTitleStyleConfiguration self, + SseSerializer serializer, + ); @protected void sse_encode_private_device_info( - PrivateDeviceInfo self, SseSerializer serializer); + PrivateDeviceInfo self, + SseSerializer serializer, + ); @protected void sse_encode_provisioned_flavor( - ProvisionedFlavor self, SseSerializer serializer); + ProvisionedFlavor self, + SseSerializer serializer, + ); @protected void sse_encode_push_message(PushMessage self, SseSerializer serializer); @@ -8040,237 +11515,322 @@ abstract class RustLibApiImplPlatform extends BaseApiImpl { @protected void sse_encode_react_message_type( - ReactMessageType self, SseSerializer serializer); + ReactMessageType self, + SseSerializer serializer, + ); @protected void sse_encode_reaction(Reaction self, SseSerializer serializer); @protected void - sse_encode_record_auto_owned_rust_opaque_flutter_rust_bridgefor_generated_rust_auto_opaque_inner_aps_connection_opt_box_autoadd_auto_owned_rust_opaque_flutter_rust_bridgefor_generated_rust_auto_opaque_inner_push_error( - (ApsConnection, PushError?) self, SseSerializer serializer); + sse_encode_record_auto_owned_rust_opaque_flutter_rust_bridgefor_generated_rust_auto_opaque_inner_aps_connection_opt_box_autoadd_auto_owned_rust_opaque_flutter_rust_bridgefor_generated_rust_auto_opaque_inner_push_error( + (ApsConnection, PushError?) self, + SseSerializer serializer, + ); @protected void - sse_encode_record_auto_owned_rust_opaque_flutter_rust_bridgefor_generated_rust_auto_opaque_inner_arc_mutex_apple_account_default_anisette_provider_login_state( - (ArcMutexAppleAccountDefaultAnisetteProvider, LoginState) self, - SseSerializer serializer); + sse_encode_record_auto_owned_rust_opaque_flutter_rust_bridgefor_generated_rust_auto_opaque_inner_arc_mutex_apple_account_default_anisette_provider_login_state( + (ArcMutexAppleAccountDefaultAnisetteProvider, LoginState) self, + SseSerializer serializer, + ); @protected void - sse_encode_record_auto_owned_rust_opaque_flutter_rust_bridgefor_generated_rust_auto_opaque_inner_arc_shared_push_state_shared_push_state( - (ArcSharedPushState, SharedPushState) self, SseSerializer serializer); + sse_encode_record_auto_owned_rust_opaque_flutter_rust_bridgefor_generated_rust_auto_opaque_inner_arc_shared_push_state_shared_push_state( + (ArcSharedPushState, SharedPushState) self, + SseSerializer serializer, + ); @protected void - sse_encode_record_auto_owned_rust_opaque_flutter_rust_bridgefor_generated_rust_auto_opaque_inner_circle_client_session_default_anisette_provider_login_state_opt_string( - ( - CircleClientSessionDefaultAnisetteProvider, - LoginState, - String? - ) self, - SseSerializer serializer); + sse_encode_record_auto_owned_rust_opaque_flutter_rust_bridgefor_generated_rust_auto_opaque_inner_circle_client_session_default_anisette_provider_login_state_opt_string( + (CircleClientSessionDefaultAnisetteProvider, LoginState, String?) self, + SseSerializer serializer, + ); @protected void - sse_encode_record_auto_owned_rust_opaque_flutter_rust_bridgefor_generated_rust_auto_opaque_inner_sender_auto_owned_rust_opaque_flutter_rust_bridgefor_generated_rust_auto_opaque_inner_arc_sender_push_message_auto_owned_rust_opaque_flutter_rust_bridgefor_generated_rust_auto_opaque_inner_aps_watcher( - (Sender, ArcSenderPushMessage, ApsWatcher) self, - SseSerializer serializer); + sse_encode_record_auto_owned_rust_opaque_flutter_rust_bridgefor_generated_rust_auto_opaque_inner_sender_auto_owned_rust_opaque_flutter_rust_bridgefor_generated_rust_auto_opaque_inner_arc_sender_push_message_auto_owned_rust_opaque_flutter_rust_bridgefor_generated_rust_auto_opaque_inner_aps_watcher( + (Sender, ArcSenderPushMessage, ApsWatcher) self, + SseSerializer serializer, + ); @protected void - sse_encode_record_list_prim_u_8_strict_map_string_opt_box_autoadd_cloud_attachment_i_32( - (Uint8List, Map, int) self, - SseSerializer serializer); + sse_encode_record_list_prim_u_8_strict_map_string_opt_box_autoadd_cloud_attachment_i_32( + (Uint8List, Map, int) self, + SseSerializer serializer, + ); @protected void - sse_encode_record_list_prim_u_8_strict_map_string_opt_box_autoadd_cloud_chat_i_32( - (Uint8List, Map, int) self, - SseSerializer serializer); + sse_encode_record_list_prim_u_8_strict_map_string_opt_box_autoadd_cloud_chat_i_32( + (Uint8List, Map, int) self, + SseSerializer serializer, + ); @protected void - sse_encode_record_list_prim_u_8_strict_map_string_opt_box_autoadd_cloud_message_i_32( - (Uint8List, Map, int) self, - SseSerializer serializer); + sse_encode_record_list_prim_u_8_strict_map_string_opt_box_autoadd_cloud_message_i_32( + (Uint8List, Map, int) self, + SseSerializer serializer, + ); @protected void sse_encode_record_list_prim_u_8_strict_opt_list_prim_u_8_strict( - (Uint8List, Uint8List?) self, SseSerializer serializer); + (Uint8List, Uint8List?) self, + SseSerializer serializer, + ); @protected void sse_encode_record_list_shared_album_list_string( - (List, List) self, SseSerializer serializer); + (List, List) self, + SseSerializer serializer, + ); @protected void sse_encode_record_list_trusted_phone_number_opt_box_autoadd_login_state( - (List, LoginState?) self, SseSerializer serializer); + (List, LoginState?) self, + SseSerializer serializer, + ); @protected void - sse_encode_record_login_state_opt_box_autoadd_auto_owned_rust_opaque_flutter_rust_bridgefor_generated_rust_auto_opaque_inner_ids_user( - (LoginState, IdsUser?) self, SseSerializer serializer); + sse_encode_record_login_state_opt_box_autoadd_auto_owned_rust_opaque_flutter_rust_bridgefor_generated_rust_auto_opaque_inner_ids_user( + (LoginState, IdsUser?) self, + SseSerializer serializer, + ); @protected void - sse_encode_record_map_string_sync_status_opt_box_autoadd_record_string_u_64( - (Map, (String, BigInt)?) self, - SseSerializer serializer); + sse_encode_record_map_string_sync_status_opt_box_autoadd_record_string_u_64( + (Map, (String, BigInt)?) self, + SseSerializer serializer, + ); @protected void - sse_encode_record_opt_list_auto_owned_rust_opaque_flutter_rust_bridgefor_generated_rust_auto_opaque_inner_ids_user_opt_box_autoadd_support_alert( - (List?, SupportAlert?) self, SseSerializer serializer); + sse_encode_record_opt_list_auto_owned_rust_opaque_flutter_rust_bridgefor_generated_rust_auto_opaque_inner_ids_user_opt_box_autoadd_support_alert( + (List?, SupportAlert?) self, + SseSerializer serializer, + ); @protected void sse_encode_record_opt_string_passkey( - (String?, Passkey) self, SseSerializer serializer); + (String?, Passkey) self, + SseSerializer serializer, + ); @protected void sse_encode_record_opt_string_password_manager_meta( - (String?, PasswordManagerMeta) self, SseSerializer serializer); + (String?, PasswordManagerMeta) self, + SseSerializer serializer, + ); @protected void sse_encode_record_opt_string_password_raw_entry( - (String?, PasswordRawEntry) self, SseSerializer serializer); + (String?, PasswordRawEntry) self, + SseSerializer serializer, + ); @protected void sse_encode_record_opt_string_wifi_password( - (String?, WifiPassword) self, SseSerializer serializer); + (String?, WifiPassword) self, + SseSerializer serializer, + ); @protected void - sse_encode_record_shared_push_state_auto_owned_rust_opaque_flutter_rust_bridgefor_generated_rust_auto_opaque_inner_aps_watcher( - (SharedPushState, ApsWatcher) self, SseSerializer serializer); + sse_encode_record_shared_push_state_auto_owned_rust_opaque_flutter_rust_bridgefor_generated_rust_auto_opaque_inner_aps_watcher( + (SharedPushState, ApsWatcher) self, + SseSerializer serializer, + ); @protected void - sse_encode_record_string_auto_owned_rust_opaque_flutter_rust_bridgefor_generated_rust_auto_opaque_inner_asset( - (String, Asset) self, SseSerializer serializer); + sse_encode_record_string_auto_owned_rust_opaque_flutter_rust_bridgefor_generated_rust_auto_opaque_inner_asset( + (String, Asset) self, + SseSerializer serializer, + ); @protected void - sse_encode_record_string_auto_owned_rust_opaque_flutter_rust_bridgefor_generated_rust_auto_opaque_inner_st_collapsed_value( - (String, StCollapsedValue) self, SseSerializer serializer); + sse_encode_record_string_auto_owned_rust_opaque_flutter_rust_bridgefor_generated_rust_auto_opaque_inner_st_collapsed_value( + (String, StCollapsedValue) self, + SseSerializer serializer, + ); @protected void sse_encode_record_string_bool( - (String, bool) self, SseSerializer serializer); + (String, bool) self, + SseSerializer serializer, + ); @protected void sse_encode_record_string_casted_primitive_u_64( - (String, int) self, SseSerializer serializer); + (String, int) self, + SseSerializer serializer, + ); @protected void sse_encode_record_string_cloud_attachment( - (String, CloudAttachment) self, SseSerializer serializer); + (String, CloudAttachment) self, + SseSerializer serializer, + ); @protected void sse_encode_record_string_cloud_chat( - (String, CloudChat) self, SseSerializer serializer); + (String, CloudChat) self, + SseSerializer serializer, + ); @protected void sse_encode_record_string_cloud_message( - (String, CloudMessage) self, SseSerializer serializer); + (String, CloudMessage) self, + SseSerializer serializer, + ); @protected void sse_encode_record_string_ft_participant( - (String, FTParticipant) self, SseSerializer serializer); + (String, FTParticipant) self, + SseSerializer serializer, + ); @protected void sse_encode_record_string_group_summary( - (String, GroupSummary) self, SseSerializer serializer); + (String, GroupSummary) self, + SseSerializer serializer, + ); @protected void sse_encode_record_string_list_message_edit( - (String, List) self, SseSerializer serializer); + (String, List) self, + SseSerializer serializer, + ); @protected void sse_encode_record_string_list_prim_u_8_strict( - (String, Uint8List) self, SseSerializer serializer); + (String, Uint8List) self, + SseSerializer serializer, + ); @protected void - sse_encode_record_string_map_string_group_summary_map_string_share_invite_content_data( - ( - String, - Map, - Map - ) self, - SseSerializer serializer); + sse_encode_record_string_map_string_group_summary_map_string_share_invite_content_data( + (String, Map, Map) + self, + SseSerializer serializer, + ); @protected void sse_encode_record_string_message_edit_range( - (String, MessageEditRange) self, SseSerializer serializer); + (String, MessageEditRange) self, + SseSerializer serializer, + ); @protected void sse_encode_record_string_opt_box_autoadd_cloud_attachment( - (String, CloudAttachment?) self, SseSerializer serializer); + (String, CloudAttachment?) self, + SseSerializer serializer, + ); @protected void sse_encode_record_string_opt_box_autoadd_cloud_chat( - (String, CloudChat?) self, SseSerializer serializer); + (String, CloudChat?) self, + SseSerializer serializer, + ); @protected void sse_encode_record_string_opt_box_autoadd_cloud_message( - (String, CloudMessage?) self, SseSerializer serializer); + (String, CloudMessage?) self, + SseSerializer serializer, + ); @protected void sse_encode_record_string_password_manager_meta_data_ctx( - (String, PasswordManagerMetaDataCtx) self, SseSerializer serializer); + (String, PasswordManagerMetaDataCtx) self, + SseSerializer serializer, + ); @protected void sse_encode_record_string_record_opt_string_passkey( - (String, (String?, Passkey)) self, SseSerializer serializer); + (String, (String?, Passkey)) self, + SseSerializer serializer, + ); @protected void sse_encode_record_string_record_opt_string_password_manager_meta( - (String, (String?, PasswordManagerMeta)) self, SseSerializer serializer); + (String, (String?, PasswordManagerMeta)) self, + SseSerializer serializer, + ); @protected void sse_encode_record_string_record_opt_string_password_raw_entry( - (String, (String?, PasswordRawEntry)) self, SseSerializer serializer); + (String, (String?, PasswordRawEntry)) self, + SseSerializer serializer, + ); @protected void sse_encode_record_string_record_opt_string_wifi_password( - (String, (String?, WifiPassword)) self, SseSerializer serializer); + (String, (String?, WifiPassword)) self, + SseSerializer serializer, + ); @protected void sse_encode_record_string_share_invite_content_data( - (String, ShareInviteContentData) self, SseSerializer serializer); + (String, ShareInviteContentData) self, + SseSerializer serializer, + ); @protected void sse_encode_record_string_shared_push_state( - (String, SharedPushState) self, SseSerializer serializer); + (String, SharedPushState) self, + SseSerializer serializer, + ); @protected void sse_encode_record_string_status_kit_personal_config( - (String, StatusKitPersonalConfig) self, SseSerializer serializer); + (String, StatusKitPersonalConfig) self, + SseSerializer serializer, + ); @protected void sse_encode_record_string_string( - (String, String) self, SseSerializer serializer); + (String, String) self, + SseSerializer serializer, + ); @protected void sse_encode_record_string_sync_status( - (String, SyncStatus) self, SseSerializer serializer); + (String, SyncStatus) self, + SseSerializer serializer, + ); @protected void sse_encode_record_string_u_64( - (String, BigInt) self, SseSerializer serializer); + (String, BigInt) self, + SseSerializer serializer, + ); @protected void sse_encode_record_string_update_account_finish( - (String, UpdateAccountFinish) self, SseSerializer serializer); + (String, UpdateAccountFinish) self, + SseSerializer serializer, + ); @protected void sse_encode_record_u_32_ns_dictionary_typed_coder( - (int, NSDictionaryTypedCoder) self, SseSerializer serializer); + (int, NSDictionaryTypedCoder) self, + SseSerializer serializer, + ); @protected void sse_encode_record_u_32_u_64( - (int, BigInt) self, SseSerializer serializer); + (int, BigInt) self, + SseSerializer serializer, + ); @protected void sse_encode_register_state(RegisterState self, SseSerializer serializer); @@ -8283,56 +11843,78 @@ abstract class RustLibApiImplPlatform extends BaseApiImpl { @protected void sse_encode_rich_link_image_attachment_substitute( - RichLinkImageAttachmentSubstitute self, SseSerializer serializer); + RichLinkImageAttachmentSubstitute self, + SseSerializer serializer, + ); @protected void sse_encode_schedule_mode(ScheduleMode self, SseSerializer serializer); @protected void sse_encode_set_transcript_background_message( - SetTranscriptBackgroundMessage self, SseSerializer serializer); + SetTranscriptBackgroundMessage self, + SseSerializer serializer, + ); @protected void sse_encode_share_invite_content_data( - ShareInviteContentData self, SseSerializer serializer); + ShareInviteContentData self, + SseSerializer serializer, + ); @protected void sse_encode_share_profile_message( - ShareProfileMessage self, SseSerializer serializer); + ShareProfileMessage self, + SseSerializer serializer, + ); @protected void sse_encode_shared_album(SharedAlbum self, SseSerializer serializer); @protected void sse_encode_shared_i_cloud_services( - SharedICloudServices self, SseSerializer serializer); + SharedICloudServices self, + SseSerializer serializer, + ); @protected void sse_encode_shared_poster(SharedPoster self, SseSerializer serializer); @protected void sse_encode_shared_push_state( - SharedPushState self, SseSerializer serializer); + SharedPushState self, + SseSerializer serializer, + ); @protected void sse_encode_simplified_incoming_call_poster( - SimplifiedIncomingCallPoster self, SseSerializer serializer); + SimplifiedIncomingCallPoster self, + SseSerializer serializer, + ); @protected void sse_encode_simplified_poster( - SimplifiedPoster self, SseSerializer serializer); + SimplifiedPoster self, + SseSerializer serializer, + ); @protected void sse_encode_simplified_transcript_poster( - SimplifiedTranscriptPoster self, SseSerializer serializer); + SimplifiedTranscriptPoster self, + SseSerializer serializer, + ); @protected void sse_encode_status_kit_message( - StatusKitMessage self, SseSerializer serializer); + StatusKitMessage self, + SseSerializer serializer, + ); @protected void sse_encode_status_kit_personal_config( - StatusKitPersonalConfig self, SseSerializer serializer); + StatusKitPersonalConfig self, + SseSerializer serializer, + ); @protected void sse_encode_support_action(SupportAction self, SseSerializer serializer); @@ -8345,7 +11927,9 @@ abstract class RustLibApiImplPlatform extends BaseApiImpl { @protected void sse_encode_teardown_sign_in( - TeardownSignIn self, SseSerializer serializer); + TeardownSignIn self, + SseSerializer serializer, + ); @protected void sse_encode_text_effect(TextEffect self, SseSerializer serializer); @@ -8358,19 +11942,28 @@ abstract class RustLibApiImplPlatform extends BaseApiImpl { @protected void sse_encode_transcript_dynamic_user_data( - TranscriptDynamicUserData self, SseSerializer serializer); + TranscriptDynamicUserData self, + SseSerializer serializer, + ); @protected void sse_encode_transfer_progress( - TransferProgress self, SseSerializer serializer); + TransferProgress self, + SseSerializer serializer, + ); @protected void sse_encode_trusted_phone_number( - TrustedPhoneNumber self, SseSerializer serializer); + TrustedPhoneNumber self, + SseSerializer serializer, + ); @protected void sse_encode_typing_app(TypingApp self, SseSerializer serializer); + @protected + void sse_encode_u_16(int self, SseSerializer serializer); + @protected void sse_encode_u_32(int self, SseSerializer serializer); @@ -8391,30 +11984,42 @@ abstract class RustLibApiImplPlatform extends BaseApiImpl { @protected void sse_encode_update_account_finish( - UpdateAccountFinish self, SseSerializer serializer); + UpdateAccountFinish self, + SseSerializer serializer, + ); @protected void sse_encode_update_extension_message( - UpdateExtensionMessage self, SseSerializer serializer); + UpdateExtensionMessage self, + SseSerializer serializer, + ); @protected void sse_encode_update_profile_message( - UpdateProfileMessage self, SseSerializer serializer); + UpdateProfileMessage self, + SseSerializer serializer, + ); @protected void sse_encode_update_profile_sharing_message( - UpdateProfileSharingMessage self, SseSerializer serializer); + UpdateProfileSharingMessage self, + SseSerializer serializer, + ); @protected void sse_encode_usize(BigInt self, SseSerializer serializer); @protected void sse_encode_wallpaper_metadata( - WallpaperMetadata self, SseSerializer serializer); + WallpaperMetadata self, + SseSerializer serializer, + ); @protected void sse_encode_watch_background( - WatchBackground self, SseSerializer serializer); + WatchBackground self, + SseSerializer serializer, + ); @protected void sse_encode_wifi_password(WifiPassword self, SseSerializer serializer); @@ -8428,14 +12033,14 @@ class RustLibWire implements BaseWire { /// Holds the symbol lookup function. final ffi.Pointer Function(String symbolName) - _lookup; + _lookup; /// The symbols are looked up in [dynamicLibrary]. RustLibWire(ffi.DynamicLibrary dynamicLibrary) - : _lookup = dynamicLibrary.lookup; + : _lookup = dynamicLibrary.lookup; void - rust_arc_increment_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerAPSConnection( + rust_arc_increment_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerAPSConnection( ffi.Pointer ptr, ) { return _rust_arc_increment_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerAPSConnection( @@ -8445,13 +12050,14 @@ class RustLibWire implements BaseWire { late final _rust_arc_increment_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerAPSConnectionPtr = _lookup)>>( - 'frbgen_bluebubbles_rust_arc_increment_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerAPSConnection'); + 'frbgen_bluebubbles_rust_arc_increment_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerAPSConnection', + ); late final _rust_arc_increment_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerAPSConnection = _rust_arc_increment_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerAPSConnectionPtr .asFunction)>(); void - rust_arc_decrement_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerAPSConnection( + rust_arc_decrement_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerAPSConnection( ffi.Pointer ptr, ) { return _rust_arc_decrement_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerAPSConnection( @@ -8461,13 +12067,14 @@ class RustLibWire implements BaseWire { late final _rust_arc_decrement_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerAPSConnectionPtr = _lookup)>>( - 'frbgen_bluebubbles_rust_arc_decrement_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerAPSConnection'); + 'frbgen_bluebubbles_rust_arc_decrement_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerAPSConnection', + ); late final _rust_arc_decrement_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerAPSConnection = _rust_arc_decrement_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerAPSConnectionPtr .asFunction)>(); void - rust_arc_increment_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerAPSState( + rust_arc_increment_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerAPSState( ffi.Pointer ptr, ) { return _rust_arc_increment_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerAPSState( @@ -8477,13 +12084,14 @@ class RustLibWire implements BaseWire { late final _rust_arc_increment_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerAPSStatePtr = _lookup)>>( - 'frbgen_bluebubbles_rust_arc_increment_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerAPSState'); + 'frbgen_bluebubbles_rust_arc_increment_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerAPSState', + ); late final _rust_arc_increment_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerAPSState = _rust_arc_increment_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerAPSStatePtr .asFunction)>(); void - rust_arc_decrement_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerAPSState( + rust_arc_decrement_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerAPSState( ffi.Pointer ptr, ) { return _rust_arc_decrement_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerAPSState( @@ -8493,13 +12101,14 @@ class RustLibWire implements BaseWire { late final _rust_arc_decrement_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerAPSStatePtr = _lookup)>>( - 'frbgen_bluebubbles_rust_arc_decrement_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerAPSState'); + 'frbgen_bluebubbles_rust_arc_decrement_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerAPSState', + ); late final _rust_arc_decrement_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerAPSState = _rust_arc_decrement_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerAPSStatePtr .asFunction)>(); void - rust_arc_increment_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerAPSWatcher( + rust_arc_increment_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerAPSWatcher( ffi.Pointer ptr, ) { return _rust_arc_increment_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerAPSWatcher( @@ -8509,13 +12118,14 @@ class RustLibWire implements BaseWire { late final _rust_arc_increment_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerAPSWatcherPtr = _lookup)>>( - 'frbgen_bluebubbles_rust_arc_increment_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerAPSWatcher'); + 'frbgen_bluebubbles_rust_arc_increment_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerAPSWatcher', + ); late final _rust_arc_increment_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerAPSWatcher = _rust_arc_increment_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerAPSWatcherPtr .asFunction)>(); void - rust_arc_decrement_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerAPSWatcher( + rust_arc_decrement_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerAPSWatcher( ffi.Pointer ptr, ) { return _rust_arc_decrement_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerAPSWatcher( @@ -8525,13 +12135,14 @@ class RustLibWire implements BaseWire { late final _rust_arc_decrement_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerAPSWatcherPtr = _lookup)>>( - 'frbgen_bluebubbles_rust_arc_decrement_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerAPSWatcher'); + 'frbgen_bluebubbles_rust_arc_decrement_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerAPSWatcher', + ); late final _rust_arc_decrement_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerAPSWatcher = _rust_arc_decrement_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerAPSWatcherPtr .asFunction)>(); void - rust_arc_increment_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcAnisetteClientDefaultAnisetteProvider( + rust_arc_increment_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcAnisetteClientDefaultAnisetteProvider( ffi.Pointer ptr, ) { return _rust_arc_increment_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcAnisetteClientDefaultAnisetteProvider( @@ -8541,13 +12152,14 @@ class RustLibWire implements BaseWire { late final _rust_arc_increment_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcAnisetteClientDefaultAnisetteProviderPtr = _lookup)>>( - 'frbgen_bluebubbles_rust_arc_increment_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcAnisetteClientDefaultAnisetteProvider'); + 'frbgen_bluebubbles_rust_arc_increment_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcAnisetteClientDefaultAnisetteProvider', + ); late final _rust_arc_increment_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcAnisetteClientDefaultAnisetteProvider = _rust_arc_increment_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcAnisetteClientDefaultAnisetteProviderPtr .asFunction)>(); void - rust_arc_decrement_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcAnisetteClientDefaultAnisetteProvider( + rust_arc_decrement_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcAnisetteClientDefaultAnisetteProvider( ffi.Pointer ptr, ) { return _rust_arc_decrement_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcAnisetteClientDefaultAnisetteProvider( @@ -8557,13 +12169,14 @@ class RustLibWire implements BaseWire { late final _rust_arc_decrement_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcAnisetteClientDefaultAnisetteProviderPtr = _lookup)>>( - 'frbgen_bluebubbles_rust_arc_decrement_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcAnisetteClientDefaultAnisetteProvider'); + 'frbgen_bluebubbles_rust_arc_decrement_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcAnisetteClientDefaultAnisetteProvider', + ); late final _rust_arc_decrement_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcAnisetteClientDefaultAnisetteProvider = _rust_arc_decrement_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcAnisetteClientDefaultAnisetteProviderPtr .asFunction)>(); void - rust_arc_increment_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcCloudKitClientDefaultAnisetteProvider( + rust_arc_increment_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcCloudKitClientDefaultAnisetteProvider( ffi.Pointer ptr, ) { return _rust_arc_increment_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcCloudKitClientDefaultAnisetteProvider( @@ -8573,13 +12186,14 @@ class RustLibWire implements BaseWire { late final _rust_arc_increment_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcCloudKitClientDefaultAnisetteProviderPtr = _lookup)>>( - 'frbgen_bluebubbles_rust_arc_increment_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcCloudKitClientDefaultAnisetteProvider'); + 'frbgen_bluebubbles_rust_arc_increment_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcCloudKitClientDefaultAnisetteProvider', + ); late final _rust_arc_increment_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcCloudKitClientDefaultAnisetteProvider = _rust_arc_increment_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcCloudKitClientDefaultAnisetteProviderPtr .asFunction)>(); void - rust_arc_decrement_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcCloudKitClientDefaultAnisetteProvider( + rust_arc_decrement_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcCloudKitClientDefaultAnisetteProvider( ffi.Pointer ptr, ) { return _rust_arc_decrement_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcCloudKitClientDefaultAnisetteProvider( @@ -8589,13 +12203,14 @@ class RustLibWire implements BaseWire { late final _rust_arc_decrement_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcCloudKitClientDefaultAnisetteProviderPtr = _lookup)>>( - 'frbgen_bluebubbles_rust_arc_decrement_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcCloudKitClientDefaultAnisetteProvider'); + 'frbgen_bluebubbles_rust_arc_decrement_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcCloudKitClientDefaultAnisetteProvider', + ); late final _rust_arc_decrement_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcCloudKitClientDefaultAnisetteProvider = _rust_arc_decrement_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcCloudKitClientDefaultAnisetteProviderPtr .asFunction)>(); void - rust_arc_increment_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcCloudMessagesClientDefaultAnisetteProvider( + rust_arc_increment_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcCloudMessagesClientDefaultAnisetteProvider( ffi.Pointer ptr, ) { return _rust_arc_increment_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcCloudMessagesClientDefaultAnisetteProvider( @@ -8605,13 +12220,14 @@ class RustLibWire implements BaseWire { late final _rust_arc_increment_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcCloudMessagesClientDefaultAnisetteProviderPtr = _lookup)>>( - 'frbgen_bluebubbles_rust_arc_increment_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcCloudMessagesClientDefaultAnisetteProvider'); + 'frbgen_bluebubbles_rust_arc_increment_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcCloudMessagesClientDefaultAnisetteProvider', + ); late final _rust_arc_increment_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcCloudMessagesClientDefaultAnisetteProvider = _rust_arc_increment_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcCloudMessagesClientDefaultAnisetteProviderPtr .asFunction)>(); void - rust_arc_decrement_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcCloudMessagesClientDefaultAnisetteProvider( + rust_arc_decrement_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcCloudMessagesClientDefaultAnisetteProvider( ffi.Pointer ptr, ) { return _rust_arc_decrement_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcCloudMessagesClientDefaultAnisetteProvider( @@ -8621,13 +12237,14 @@ class RustLibWire implements BaseWire { late final _rust_arc_decrement_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcCloudMessagesClientDefaultAnisetteProviderPtr = _lookup)>>( - 'frbgen_bluebubbles_rust_arc_decrement_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcCloudMessagesClientDefaultAnisetteProvider'); + 'frbgen_bluebubbles_rust_arc_decrement_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcCloudMessagesClientDefaultAnisetteProvider', + ); late final _rust_arc_decrement_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcCloudMessagesClientDefaultAnisetteProvider = _rust_arc_decrement_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcCloudMessagesClientDefaultAnisetteProviderPtr .asFunction)>(); void - rust_arc_increment_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcFTClient( + rust_arc_increment_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcFTClient( ffi.Pointer ptr, ) { return _rust_arc_increment_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcFTClient( @@ -8637,13 +12254,14 @@ class RustLibWire implements BaseWire { late final _rust_arc_increment_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcFTClientPtr = _lookup)>>( - 'frbgen_bluebubbles_rust_arc_increment_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcFTClient'); + 'frbgen_bluebubbles_rust_arc_increment_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcFTClient', + ); late final _rust_arc_increment_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcFTClient = _rust_arc_increment_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcFTClientPtr .asFunction)>(); void - rust_arc_decrement_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcFTClient( + rust_arc_decrement_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcFTClient( ffi.Pointer ptr, ) { return _rust_arc_decrement_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcFTClient( @@ -8653,13 +12271,14 @@ class RustLibWire implements BaseWire { late final _rust_arc_decrement_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcFTClientPtr = _lookup)>>( - 'frbgen_bluebubbles_rust_arc_decrement_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcFTClient'); + 'frbgen_bluebubbles_rust_arc_decrement_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcFTClient', + ); late final _rust_arc_decrement_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcFTClient = _rust_arc_decrement_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcFTClientPtr .asFunction)>(); void - rust_arc_increment_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcFindMyClientDefaultAnisetteProvider( + rust_arc_increment_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcFindMyClientDefaultAnisetteProvider( ffi.Pointer ptr, ) { return _rust_arc_increment_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcFindMyClientDefaultAnisetteProvider( @@ -8669,13 +12288,14 @@ class RustLibWire implements BaseWire { late final _rust_arc_increment_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcFindMyClientDefaultAnisetteProviderPtr = _lookup)>>( - 'frbgen_bluebubbles_rust_arc_increment_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcFindMyClientDefaultAnisetteProvider'); + 'frbgen_bluebubbles_rust_arc_increment_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcFindMyClientDefaultAnisetteProvider', + ); late final _rust_arc_increment_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcFindMyClientDefaultAnisetteProvider = _rust_arc_increment_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcFindMyClientDefaultAnisetteProviderPtr .asFunction)>(); void - rust_arc_decrement_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcFindMyClientDefaultAnisetteProvider( + rust_arc_decrement_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcFindMyClientDefaultAnisetteProvider( ffi.Pointer ptr, ) { return _rust_arc_decrement_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcFindMyClientDefaultAnisetteProvider( @@ -8685,13 +12305,14 @@ class RustLibWire implements BaseWire { late final _rust_arc_decrement_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcFindMyClientDefaultAnisetteProviderPtr = _lookup)>>( - 'frbgen_bluebubbles_rust_arc_decrement_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcFindMyClientDefaultAnisetteProvider'); + 'frbgen_bluebubbles_rust_arc_decrement_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcFindMyClientDefaultAnisetteProvider', + ); late final _rust_arc_decrement_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcFindMyClientDefaultAnisetteProvider = _rust_arc_decrement_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcFindMyClientDefaultAnisetteProviderPtr .asFunction)>(); void - rust_arc_increment_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcIMClient( + rust_arc_increment_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcIMClient( ffi.Pointer ptr, ) { return _rust_arc_increment_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcIMClient( @@ -8701,13 +12322,14 @@ class RustLibWire implements BaseWire { late final _rust_arc_increment_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcIMClientPtr = _lookup)>>( - 'frbgen_bluebubbles_rust_arc_increment_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcIMClient'); + 'frbgen_bluebubbles_rust_arc_increment_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcIMClient', + ); late final _rust_arc_increment_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcIMClient = _rust_arc_increment_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcIMClientPtr .asFunction)>(); void - rust_arc_decrement_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcIMClient( + rust_arc_decrement_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcIMClient( ffi.Pointer ptr, ) { return _rust_arc_decrement_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcIMClient( @@ -8717,13 +12339,14 @@ class RustLibWire implements BaseWire { late final _rust_arc_decrement_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcIMClientPtr = _lookup)>>( - 'frbgen_bluebubbles_rust_arc_decrement_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcIMClient'); + 'frbgen_bluebubbles_rust_arc_decrement_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcIMClient', + ); late final _rust_arc_decrement_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcIMClient = _rust_arc_decrement_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcIMClientPtr .asFunction)>(); void - rust_arc_increment_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcIdmsAuthListener( + rust_arc_increment_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcIdmsAuthListener( ffi.Pointer ptr, ) { return _rust_arc_increment_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcIdmsAuthListener( @@ -8733,13 +12356,14 @@ class RustLibWire implements BaseWire { late final _rust_arc_increment_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcIdmsAuthListenerPtr = _lookup)>>( - 'frbgen_bluebubbles_rust_arc_increment_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcIdmsAuthListener'); + 'frbgen_bluebubbles_rust_arc_increment_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcIdmsAuthListener', + ); late final _rust_arc_increment_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcIdmsAuthListener = _rust_arc_increment_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcIdmsAuthListenerPtr .asFunction)>(); void - rust_arc_decrement_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcIdmsAuthListener( + rust_arc_decrement_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcIdmsAuthListener( ffi.Pointer ptr, ) { return _rust_arc_decrement_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcIdmsAuthListener( @@ -8749,13 +12373,14 @@ class RustLibWire implements BaseWire { late final _rust_arc_decrement_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcIdmsAuthListenerPtr = _lookup)>>( - 'frbgen_bluebubbles_rust_arc_decrement_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcIdmsAuthListener'); + 'frbgen_bluebubbles_rust_arc_decrement_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcIdmsAuthListener', + ); late final _rust_arc_decrement_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcIdmsAuthListener = _rust_arc_decrement_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcIdmsAuthListenerPtr .asFunction)>(); void - rust_arc_increment_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcKeychainClientDefaultAnisetteProvider( + rust_arc_increment_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcKeychainClientDefaultAnisetteProvider( ffi.Pointer ptr, ) { return _rust_arc_increment_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcKeychainClientDefaultAnisetteProvider( @@ -8765,13 +12390,14 @@ class RustLibWire implements BaseWire { late final _rust_arc_increment_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcKeychainClientDefaultAnisetteProviderPtr = _lookup)>>( - 'frbgen_bluebubbles_rust_arc_increment_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcKeychainClientDefaultAnisetteProvider'); + 'frbgen_bluebubbles_rust_arc_increment_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcKeychainClientDefaultAnisetteProvider', + ); late final _rust_arc_increment_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcKeychainClientDefaultAnisetteProvider = _rust_arc_increment_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcKeychainClientDefaultAnisetteProviderPtr .asFunction)>(); void - rust_arc_decrement_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcKeychainClientDefaultAnisetteProvider( + rust_arc_decrement_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcKeychainClientDefaultAnisetteProvider( ffi.Pointer ptr, ) { return _rust_arc_decrement_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcKeychainClientDefaultAnisetteProvider( @@ -8781,13 +12407,14 @@ class RustLibWire implements BaseWire { late final _rust_arc_decrement_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcKeychainClientDefaultAnisetteProviderPtr = _lookup)>>( - 'frbgen_bluebubbles_rust_arc_decrement_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcKeychainClientDefaultAnisetteProvider'); + 'frbgen_bluebubbles_rust_arc_decrement_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcKeychainClientDefaultAnisetteProvider', + ); late final _rust_arc_decrement_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcKeychainClientDefaultAnisetteProvider = _rust_arc_decrement_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcKeychainClientDefaultAnisetteProviderPtr .asFunction)>(); void - rust_arc_increment_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcMutexAppleAccountDefaultAnisetteProvider( + rust_arc_increment_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcMutexAppleAccountDefaultAnisetteProvider( ffi.Pointer ptr, ) { return _rust_arc_increment_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcMutexAppleAccountDefaultAnisetteProvider( @@ -8797,13 +12424,14 @@ class RustLibWire implements BaseWire { late final _rust_arc_increment_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcMutexAppleAccountDefaultAnisetteProviderPtr = _lookup)>>( - 'frbgen_bluebubbles_rust_arc_increment_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcMutexAppleAccountDefaultAnisetteProvider'); + 'frbgen_bluebubbles_rust_arc_increment_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcMutexAppleAccountDefaultAnisetteProvider', + ); late final _rust_arc_increment_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcMutexAppleAccountDefaultAnisetteProvider = _rust_arc_increment_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcMutexAppleAccountDefaultAnisetteProviderPtr .asFunction)>(); void - rust_arc_decrement_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcMutexAppleAccountDefaultAnisetteProvider( + rust_arc_decrement_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcMutexAppleAccountDefaultAnisetteProvider( ffi.Pointer ptr, ) { return _rust_arc_decrement_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcMutexAppleAccountDefaultAnisetteProvider( @@ -8813,13 +12441,14 @@ class RustLibWire implements BaseWire { late final _rust_arc_decrement_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcMutexAppleAccountDefaultAnisetteProviderPtr = _lookup)>>( - 'frbgen_bluebubbles_rust_arc_decrement_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcMutexAppleAccountDefaultAnisetteProvider'); + 'frbgen_bluebubbles_rust_arc_decrement_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcMutexAppleAccountDefaultAnisetteProvider', + ); late final _rust_arc_decrement_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcMutexAppleAccountDefaultAnisetteProvider = _rust_arc_decrement_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcMutexAppleAccountDefaultAnisetteProviderPtr .asFunction)>(); void - rust_arc_increment_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcMutexOptionCircleClientSessionDefaultAnisetteProvider( + rust_arc_increment_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcMutexOptionCircleClientSessionDefaultAnisetteProvider( ffi.Pointer ptr, ) { return _rust_arc_increment_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcMutexOptionCircleClientSessionDefaultAnisetteProvider( @@ -8829,13 +12458,14 @@ class RustLibWire implements BaseWire { late final _rust_arc_increment_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcMutexOptionCircleClientSessionDefaultAnisetteProviderPtr = _lookup)>>( - 'frbgen_bluebubbles_rust_arc_increment_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcMutexOptionCircleClientSessionDefaultAnisetteProvider'); + 'frbgen_bluebubbles_rust_arc_increment_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcMutexOptionCircleClientSessionDefaultAnisetteProvider', + ); late final _rust_arc_increment_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcMutexOptionCircleClientSessionDefaultAnisetteProvider = _rust_arc_increment_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcMutexOptionCircleClientSessionDefaultAnisetteProviderPtr .asFunction)>(); void - rust_arc_decrement_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcMutexOptionCircleClientSessionDefaultAnisetteProvider( + rust_arc_decrement_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcMutexOptionCircleClientSessionDefaultAnisetteProvider( ffi.Pointer ptr, ) { return _rust_arc_decrement_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcMutexOptionCircleClientSessionDefaultAnisetteProvider( @@ -8845,13 +12475,14 @@ class RustLibWire implements BaseWire { late final _rust_arc_decrement_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcMutexOptionCircleClientSessionDefaultAnisetteProviderPtr = _lookup)>>( - 'frbgen_bluebubbles_rust_arc_decrement_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcMutexOptionCircleClientSessionDefaultAnisetteProvider'); + 'frbgen_bluebubbles_rust_arc_decrement_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcMutexOptionCircleClientSessionDefaultAnisetteProvider', + ); late final _rust_arc_decrement_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcMutexOptionCircleClientSessionDefaultAnisetteProvider = _rust_arc_decrement_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcMutexOptionCircleClientSessionDefaultAnisetteProviderPtr .asFunction)>(); void - rust_arc_increment_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcMutexVecActiveCircleSession( + rust_arc_increment_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcMutexVecActiveCircleSession( ffi.Pointer ptr, ) { return _rust_arc_increment_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcMutexVecActiveCircleSession( @@ -8861,13 +12492,14 @@ class RustLibWire implements BaseWire { late final _rust_arc_increment_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcMutexVecActiveCircleSessionPtr = _lookup)>>( - 'frbgen_bluebubbles_rust_arc_increment_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcMutexVecActiveCircleSession'); + 'frbgen_bluebubbles_rust_arc_increment_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcMutexVecActiveCircleSession', + ); late final _rust_arc_increment_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcMutexVecActiveCircleSession = _rust_arc_increment_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcMutexVecActiveCircleSessionPtr .asFunction)>(); void - rust_arc_decrement_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcMutexVecActiveCircleSession( + rust_arc_decrement_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcMutexVecActiveCircleSession( ffi.Pointer ptr, ) { return _rust_arc_decrement_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcMutexVecActiveCircleSession( @@ -8877,13 +12509,14 @@ class RustLibWire implements BaseWire { late final _rust_arc_decrement_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcMutexVecActiveCircleSessionPtr = _lookup)>>( - 'frbgen_bluebubbles_rust_arc_decrement_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcMutexVecActiveCircleSession'); + 'frbgen_bluebubbles_rust_arc_decrement_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcMutexVecActiveCircleSession', + ); late final _rust_arc_decrement_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcMutexVecActiveCircleSession = _rust_arc_decrement_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcMutexVecActiveCircleSessionPtr .asFunction)>(); void - rust_arc_increment_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcPasswordManagerDefaultAnisetteProvider( + rust_arc_increment_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcPasswordManagerDefaultAnisetteProvider( ffi.Pointer ptr, ) { return _rust_arc_increment_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcPasswordManagerDefaultAnisetteProvider( @@ -8893,13 +12526,14 @@ class RustLibWire implements BaseWire { late final _rust_arc_increment_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcPasswordManagerDefaultAnisetteProviderPtr = _lookup)>>( - 'frbgen_bluebubbles_rust_arc_increment_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcPasswordManagerDefaultAnisetteProvider'); + 'frbgen_bluebubbles_rust_arc_increment_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcPasswordManagerDefaultAnisetteProvider', + ); late final _rust_arc_increment_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcPasswordManagerDefaultAnisetteProvider = _rust_arc_increment_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcPasswordManagerDefaultAnisetteProviderPtr .asFunction)>(); void - rust_arc_decrement_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcPasswordManagerDefaultAnisetteProvider( + rust_arc_decrement_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcPasswordManagerDefaultAnisetteProvider( ffi.Pointer ptr, ) { return _rust_arc_decrement_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcPasswordManagerDefaultAnisetteProvider( @@ -8909,13 +12543,14 @@ class RustLibWire implements BaseWire { late final _rust_arc_decrement_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcPasswordManagerDefaultAnisetteProviderPtr = _lookup)>>( - 'frbgen_bluebubbles_rust_arc_decrement_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcPasswordManagerDefaultAnisetteProvider'); + 'frbgen_bluebubbles_rust_arc_decrement_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcPasswordManagerDefaultAnisetteProvider', + ); late final _rust_arc_decrement_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcPasswordManagerDefaultAnisetteProvider = _rust_arc_decrement_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcPasswordManagerDefaultAnisetteProviderPtr .asFunction)>(); void - rust_arc_increment_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcProfilesClientDefaultAnisetteProvider( + rust_arc_increment_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcProfilesClientDefaultAnisetteProvider( ffi.Pointer ptr, ) { return _rust_arc_increment_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcProfilesClientDefaultAnisetteProvider( @@ -8925,13 +12560,14 @@ class RustLibWire implements BaseWire { late final _rust_arc_increment_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcProfilesClientDefaultAnisetteProviderPtr = _lookup)>>( - 'frbgen_bluebubbles_rust_arc_increment_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcProfilesClientDefaultAnisetteProvider'); + 'frbgen_bluebubbles_rust_arc_increment_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcProfilesClientDefaultAnisetteProvider', + ); late final _rust_arc_increment_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcProfilesClientDefaultAnisetteProvider = _rust_arc_increment_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcProfilesClientDefaultAnisetteProviderPtr .asFunction)>(); void - rust_arc_decrement_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcProfilesClientDefaultAnisetteProvider( + rust_arc_decrement_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcProfilesClientDefaultAnisetteProvider( ffi.Pointer ptr, ) { return _rust_arc_decrement_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcProfilesClientDefaultAnisetteProvider( @@ -8941,13 +12577,14 @@ class RustLibWire implements BaseWire { late final _rust_arc_decrement_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcProfilesClientDefaultAnisetteProviderPtr = _lookup)>>( - 'frbgen_bluebubbles_rust_arc_decrement_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcProfilesClientDefaultAnisetteProvider'); + 'frbgen_bluebubbles_rust_arc_decrement_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcProfilesClientDefaultAnisetteProvider', + ); late final _rust_arc_decrement_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcProfilesClientDefaultAnisetteProvider = _rust_arc_decrement_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcProfilesClientDefaultAnisetteProviderPtr .asFunction)>(); void - rust_arc_increment_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcSenderPushMessage( + rust_arc_increment_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcSenderPushMessage( ffi.Pointer ptr, ) { return _rust_arc_increment_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcSenderPushMessage( @@ -8957,13 +12594,14 @@ class RustLibWire implements BaseWire { late final _rust_arc_increment_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcSenderPushMessagePtr = _lookup)>>( - 'frbgen_bluebubbles_rust_arc_increment_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcSenderPushMessage'); + 'frbgen_bluebubbles_rust_arc_increment_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcSenderPushMessage', + ); late final _rust_arc_increment_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcSenderPushMessage = _rust_arc_increment_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcSenderPushMessagePtr .asFunction)>(); void - rust_arc_decrement_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcSenderPushMessage( + rust_arc_decrement_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcSenderPushMessage( ffi.Pointer ptr, ) { return _rust_arc_decrement_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcSenderPushMessage( @@ -8973,13 +12611,14 @@ class RustLibWire implements BaseWire { late final _rust_arc_decrement_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcSenderPushMessagePtr = _lookup)>>( - 'frbgen_bluebubbles_rust_arc_decrement_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcSenderPushMessage'); + 'frbgen_bluebubbles_rust_arc_decrement_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcSenderPushMessage', + ); late final _rust_arc_decrement_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcSenderPushMessage = _rust_arc_decrement_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcSenderPushMessagePtr .asFunction)>(); void - rust_arc_increment_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcSharedPushState( + rust_arc_increment_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcSharedPushState( ffi.Pointer ptr, ) { return _rust_arc_increment_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcSharedPushState( @@ -8989,13 +12628,14 @@ class RustLibWire implements BaseWire { late final _rust_arc_increment_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcSharedPushStatePtr = _lookup)>>( - 'frbgen_bluebubbles_rust_arc_increment_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcSharedPushState'); + 'frbgen_bluebubbles_rust_arc_increment_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcSharedPushState', + ); late final _rust_arc_increment_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcSharedPushState = _rust_arc_increment_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcSharedPushStatePtr .asFunction)>(); void - rust_arc_decrement_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcSharedPushState( + rust_arc_decrement_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcSharedPushState( ffi.Pointer ptr, ) { return _rust_arc_decrement_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcSharedPushState( @@ -9005,13 +12645,14 @@ class RustLibWire implements BaseWire { late final _rust_arc_decrement_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcSharedPushStatePtr = _lookup)>>( - 'frbgen_bluebubbles_rust_arc_decrement_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcSharedPushState'); + 'frbgen_bluebubbles_rust_arc_decrement_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcSharedPushState', + ); late final _rust_arc_decrement_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcSharedPushState = _rust_arc_decrement_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcSharedPushStatePtr .asFunction)>(); void - rust_arc_increment_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcStatusKitClientDefaultAnisetteProvider( + rust_arc_increment_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcStatusKitClientDefaultAnisetteProvider( ffi.Pointer ptr, ) { return _rust_arc_increment_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcStatusKitClientDefaultAnisetteProvider( @@ -9021,13 +12662,14 @@ class RustLibWire implements BaseWire { late final _rust_arc_increment_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcStatusKitClientDefaultAnisetteProviderPtr = _lookup)>>( - 'frbgen_bluebubbles_rust_arc_increment_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcStatusKitClientDefaultAnisetteProvider'); + 'frbgen_bluebubbles_rust_arc_increment_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcStatusKitClientDefaultAnisetteProvider', + ); late final _rust_arc_increment_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcStatusKitClientDefaultAnisetteProvider = _rust_arc_increment_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcStatusKitClientDefaultAnisetteProviderPtr .asFunction)>(); void - rust_arc_decrement_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcStatusKitClientDefaultAnisetteProvider( + rust_arc_decrement_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcStatusKitClientDefaultAnisetteProvider( ffi.Pointer ptr, ) { return _rust_arc_decrement_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcStatusKitClientDefaultAnisetteProvider( @@ -9037,13 +12679,14 @@ class RustLibWire implements BaseWire { late final _rust_arc_decrement_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcStatusKitClientDefaultAnisetteProviderPtr = _lookup)>>( - 'frbgen_bluebubbles_rust_arc_decrement_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcStatusKitClientDefaultAnisetteProvider'); + 'frbgen_bluebubbles_rust_arc_decrement_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcStatusKitClientDefaultAnisetteProvider', + ); late final _rust_arc_decrement_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcStatusKitClientDefaultAnisetteProvider = _rust_arc_decrement_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcStatusKitClientDefaultAnisetteProviderPtr .asFunction)>(); void - rust_arc_increment_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcTokenProviderDefaultAnisetteProvider( + rust_arc_increment_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcTokenProviderDefaultAnisetteProvider( ffi.Pointer ptr, ) { return _rust_arc_increment_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcTokenProviderDefaultAnisetteProvider( @@ -9053,13 +12696,14 @@ class RustLibWire implements BaseWire { late final _rust_arc_increment_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcTokenProviderDefaultAnisetteProviderPtr = _lookup)>>( - 'frbgen_bluebubbles_rust_arc_increment_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcTokenProviderDefaultAnisetteProvider'); + 'frbgen_bluebubbles_rust_arc_increment_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcTokenProviderDefaultAnisetteProvider', + ); late final _rust_arc_increment_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcTokenProviderDefaultAnisetteProvider = _rust_arc_increment_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcTokenProviderDefaultAnisetteProviderPtr .asFunction)>(); void - rust_arc_decrement_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcTokenProviderDefaultAnisetteProvider( + rust_arc_decrement_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcTokenProviderDefaultAnisetteProvider( ffi.Pointer ptr, ) { return _rust_arc_decrement_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcTokenProviderDefaultAnisetteProvider( @@ -9069,13 +12713,14 @@ class RustLibWire implements BaseWire { late final _rust_arc_decrement_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcTokenProviderDefaultAnisetteProviderPtr = _lookup)>>( - 'frbgen_bluebubbles_rust_arc_decrement_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcTokenProviderDefaultAnisetteProvider'); + 'frbgen_bluebubbles_rust_arc_decrement_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcTokenProviderDefaultAnisetteProvider', + ); late final _rust_arc_decrement_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcTokenProviderDefaultAnisetteProvider = _rust_arc_decrement_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcTokenProviderDefaultAnisetteProviderPtr .asFunction)>(); void - rust_arc_increment_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerAsset( + rust_arc_increment_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerAsset( ffi.Pointer ptr, ) { return _rust_arc_increment_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerAsset( @@ -9085,13 +12730,14 @@ class RustLibWire implements BaseWire { late final _rust_arc_increment_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerAssetPtr = _lookup)>>( - 'frbgen_bluebubbles_rust_arc_increment_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerAsset'); + 'frbgen_bluebubbles_rust_arc_increment_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerAsset', + ); late final _rust_arc_increment_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerAsset = _rust_arc_increment_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerAssetPtr .asFunction)>(); void - rust_arc_decrement_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerAsset( + rust_arc_decrement_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerAsset( ffi.Pointer ptr, ) { return _rust_arc_decrement_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerAsset( @@ -9101,13 +12747,14 @@ class RustLibWire implements BaseWire { late final _rust_arc_decrement_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerAssetPtr = _lookup)>>( - 'frbgen_bluebubbles_rust_arc_decrement_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerAsset'); + 'frbgen_bluebubbles_rust_arc_decrement_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerAsset', + ); late final _rust_arc_decrement_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerAsset = _rust_arc_decrement_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerAssetPtr .asFunction)>(); void - rust_arc_increment_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerChannelInterestToken( + rust_arc_increment_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerChannelInterestToken( ffi.Pointer ptr, ) { return _rust_arc_increment_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerChannelInterestToken( @@ -9117,13 +12764,14 @@ class RustLibWire implements BaseWire { late final _rust_arc_increment_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerChannelInterestTokenPtr = _lookup)>>( - 'frbgen_bluebubbles_rust_arc_increment_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerChannelInterestToken'); + 'frbgen_bluebubbles_rust_arc_increment_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerChannelInterestToken', + ); late final _rust_arc_increment_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerChannelInterestToken = _rust_arc_increment_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerChannelInterestTokenPtr .asFunction)>(); void - rust_arc_decrement_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerChannelInterestToken( + rust_arc_decrement_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerChannelInterestToken( ffi.Pointer ptr, ) { return _rust_arc_decrement_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerChannelInterestToken( @@ -9133,13 +12781,14 @@ class RustLibWire implements BaseWire { late final _rust_arc_decrement_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerChannelInterestTokenPtr = _lookup)>>( - 'frbgen_bluebubbles_rust_arc_decrement_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerChannelInterestToken'); + 'frbgen_bluebubbles_rust_arc_decrement_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerChannelInterestToken', + ); late final _rust_arc_decrement_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerChannelInterestToken = _rust_arc_decrement_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerChannelInterestTokenPtr .asFunction)>(); void - rust_arc_increment_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerCircleClientSessionDefaultAnisetteProvider( + rust_arc_increment_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerCircleClientSessionDefaultAnisetteProvider( ffi.Pointer ptr, ) { return _rust_arc_increment_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerCircleClientSessionDefaultAnisetteProvider( @@ -9149,13 +12798,14 @@ class RustLibWire implements BaseWire { late final _rust_arc_increment_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerCircleClientSessionDefaultAnisetteProviderPtr = _lookup)>>( - 'frbgen_bluebubbles_rust_arc_increment_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerCircleClientSessionDefaultAnisetteProvider'); + 'frbgen_bluebubbles_rust_arc_increment_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerCircleClientSessionDefaultAnisetteProvider', + ); late final _rust_arc_increment_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerCircleClientSessionDefaultAnisetteProvider = _rust_arc_increment_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerCircleClientSessionDefaultAnisetteProviderPtr .asFunction)>(); void - rust_arc_decrement_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerCircleClientSessionDefaultAnisetteProvider( + rust_arc_decrement_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerCircleClientSessionDefaultAnisetteProvider( ffi.Pointer ptr, ) { return _rust_arc_decrement_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerCircleClientSessionDefaultAnisetteProvider( @@ -9165,13 +12815,48 @@ class RustLibWire implements BaseWire { late final _rust_arc_decrement_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerCircleClientSessionDefaultAnisetteProviderPtr = _lookup)>>( - 'frbgen_bluebubbles_rust_arc_decrement_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerCircleClientSessionDefaultAnisetteProvider'); + 'frbgen_bluebubbles_rust_arc_decrement_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerCircleClientSessionDefaultAnisetteProvider', + ); late final _rust_arc_decrement_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerCircleClientSessionDefaultAnisetteProvider = _rust_arc_decrement_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerCircleClientSessionDefaultAnisetteProviderPtr .asFunction)>(); void - rust_arc_increment_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerConversationLink( + rust_arc_increment_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerCloudSyncPreparedMessageCreateHandle( + ffi.Pointer ptr, + ) { + return _rust_arc_increment_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerCloudSyncPreparedMessageCreateHandle( + ptr, + ); + } + + late final _rust_arc_increment_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerCloudSyncPreparedMessageCreateHandlePtr = + _lookup)>>( + 'frbgen_bluebubbles_rust_arc_increment_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerCloudSyncPreparedMessageCreateHandle', + ); + late final _rust_arc_increment_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerCloudSyncPreparedMessageCreateHandle = + _rust_arc_increment_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerCloudSyncPreparedMessageCreateHandlePtr + .asFunction)>(); + + void + rust_arc_decrement_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerCloudSyncPreparedMessageCreateHandle( + ffi.Pointer ptr, + ) { + return _rust_arc_decrement_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerCloudSyncPreparedMessageCreateHandle( + ptr, + ); + } + + late final _rust_arc_decrement_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerCloudSyncPreparedMessageCreateHandlePtr = + _lookup)>>( + 'frbgen_bluebubbles_rust_arc_decrement_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerCloudSyncPreparedMessageCreateHandle', + ); + late final _rust_arc_decrement_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerCloudSyncPreparedMessageCreateHandle = + _rust_arc_decrement_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerCloudSyncPreparedMessageCreateHandlePtr + .asFunction)>(); + + void + rust_arc_increment_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerConversationLink( ffi.Pointer ptr, ) { return _rust_arc_increment_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerConversationLink( @@ -9181,13 +12866,14 @@ class RustLibWire implements BaseWire { late final _rust_arc_increment_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerConversationLinkPtr = _lookup)>>( - 'frbgen_bluebubbles_rust_arc_increment_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerConversationLink'); + 'frbgen_bluebubbles_rust_arc_increment_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerConversationLink', + ); late final _rust_arc_increment_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerConversationLink = _rust_arc_increment_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerConversationLinkPtr .asFunction)>(); void - rust_arc_decrement_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerConversationLink( + rust_arc_decrement_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerConversationLink( ffi.Pointer ptr, ) { return _rust_arc_decrement_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerConversationLink( @@ -9197,13 +12883,14 @@ class RustLibWire implements BaseWire { late final _rust_arc_decrement_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerConversationLinkPtr = _lookup)>>( - 'frbgen_bluebubbles_rust_arc_decrement_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerConversationLink'); + 'frbgen_bluebubbles_rust_arc_decrement_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerConversationLink', + ); late final _rust_arc_decrement_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerConversationLink = _rust_arc_decrement_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerConversationLinkPtr .asFunction)>(); void - rust_arc_increment_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerConversationParticipant( + rust_arc_increment_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerConversationParticipant( ffi.Pointer ptr, ) { return _rust_arc_increment_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerConversationParticipant( @@ -9213,13 +12900,14 @@ class RustLibWire implements BaseWire { late final _rust_arc_increment_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerConversationParticipantPtr = _lookup)>>( - 'frbgen_bluebubbles_rust_arc_increment_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerConversationParticipant'); + 'frbgen_bluebubbles_rust_arc_increment_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerConversationParticipant', + ); late final _rust_arc_increment_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerConversationParticipant = _rust_arc_increment_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerConversationParticipantPtr .asFunction)>(); void - rust_arc_decrement_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerConversationParticipant( + rust_arc_decrement_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerConversationParticipant( ffi.Pointer ptr, ) { return _rust_arc_decrement_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerConversationParticipant( @@ -9229,13 +12917,14 @@ class RustLibWire implements BaseWire { late final _rust_arc_decrement_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerConversationParticipantPtr = _lookup)>>( - 'frbgen_bluebubbles_rust_arc_decrement_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerConversationParticipant'); + 'frbgen_bluebubbles_rust_arc_decrement_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerConversationParticipant', + ); late final _rust_arc_decrement_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerConversationParticipant = _rust_arc_decrement_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerConversationParticipantPtr .asFunction)>(); void - rust_arc_increment_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerDate( + rust_arc_increment_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerDate( ffi.Pointer ptr, ) { return _rust_arc_increment_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerDate( @@ -9245,13 +12934,14 @@ class RustLibWire implements BaseWire { late final _rust_arc_increment_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerDatePtr = _lookup)>>( - 'frbgen_bluebubbles_rust_arc_increment_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerDate'); + 'frbgen_bluebubbles_rust_arc_increment_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerDate', + ); late final _rust_arc_increment_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerDate = _rust_arc_increment_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerDatePtr .asFunction)>(); void - rust_arc_decrement_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerDate( + rust_arc_decrement_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerDate( ffi.Pointer ptr, ) { return _rust_arc_decrement_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerDate( @@ -9261,13 +12951,14 @@ class RustLibWire implements BaseWire { late final _rust_arc_decrement_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerDatePtr = _lookup)>>( - 'frbgen_bluebubbles_rust_arc_decrement_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerDate'); + 'frbgen_bluebubbles_rust_arc_decrement_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerDate', + ); late final _rust_arc_decrement_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerDate = _rust_arc_decrement_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerDatePtr .asFunction)>(); void - rust_arc_increment_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerEscrowData( + rust_arc_increment_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerEscrowData( ffi.Pointer ptr, ) { return _rust_arc_increment_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerEscrowData( @@ -9277,13 +12968,14 @@ class RustLibWire implements BaseWire { late final _rust_arc_increment_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerEscrowDataPtr = _lookup)>>( - 'frbgen_bluebubbles_rust_arc_increment_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerEscrowData'); + 'frbgen_bluebubbles_rust_arc_increment_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerEscrowData', + ); late final _rust_arc_increment_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerEscrowData = _rust_arc_increment_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerEscrowDataPtr .asFunction)>(); void - rust_arc_decrement_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerEscrowData( + rust_arc_decrement_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerEscrowData( ffi.Pointer ptr, ) { return _rust_arc_decrement_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerEscrowData( @@ -9293,13 +12985,14 @@ class RustLibWire implements BaseWire { late final _rust_arc_decrement_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerEscrowDataPtr = _lookup)>>( - 'frbgen_bluebubbles_rust_arc_decrement_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerEscrowData'); + 'frbgen_bluebubbles_rust_arc_decrement_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerEscrowData', + ); late final _rust_arc_decrement_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerEscrowData = _rust_arc_decrement_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerEscrowDataPtr .asFunction)>(); void - rust_arc_increment_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerFindMyFriendsClientDefaultAnisetteProvider( + rust_arc_increment_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerFindMyFriendsClientDefaultAnisetteProvider( ffi.Pointer ptr, ) { return _rust_arc_increment_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerFindMyFriendsClientDefaultAnisetteProvider( @@ -9309,13 +13002,14 @@ class RustLibWire implements BaseWire { late final _rust_arc_increment_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerFindMyFriendsClientDefaultAnisetteProviderPtr = _lookup)>>( - 'frbgen_bluebubbles_rust_arc_increment_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerFindMyFriendsClientDefaultAnisetteProvider'); + 'frbgen_bluebubbles_rust_arc_increment_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerFindMyFriendsClientDefaultAnisetteProvider', + ); late final _rust_arc_increment_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerFindMyFriendsClientDefaultAnisetteProvider = _rust_arc_increment_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerFindMyFriendsClientDefaultAnisetteProviderPtr .asFunction)>(); void - rust_arc_decrement_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerFindMyFriendsClientDefaultAnisetteProvider( + rust_arc_decrement_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerFindMyFriendsClientDefaultAnisetteProvider( ffi.Pointer ptr, ) { return _rust_arc_decrement_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerFindMyFriendsClientDefaultAnisetteProvider( @@ -9325,13 +13019,14 @@ class RustLibWire implements BaseWire { late final _rust_arc_decrement_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerFindMyFriendsClientDefaultAnisetteProviderPtr = _lookup)>>( - 'frbgen_bluebubbles_rust_arc_decrement_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerFindMyFriendsClientDefaultAnisetteProvider'); + 'frbgen_bluebubbles_rust_arc_decrement_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerFindMyFriendsClientDefaultAnisetteProvider', + ); late final _rust_arc_decrement_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerFindMyFriendsClientDefaultAnisetteProvider = _rust_arc_decrement_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerFindMyFriendsClientDefaultAnisetteProviderPtr .asFunction)>(); void - rust_arc_increment_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerFindMyPhoneClientDefaultAnisetteProvider( + rust_arc_increment_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerFindMyPhoneClientDefaultAnisetteProvider( ffi.Pointer ptr, ) { return _rust_arc_increment_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerFindMyPhoneClientDefaultAnisetteProvider( @@ -9341,13 +13036,14 @@ class RustLibWire implements BaseWire { late final _rust_arc_increment_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerFindMyPhoneClientDefaultAnisetteProviderPtr = _lookup)>>( - 'frbgen_bluebubbles_rust_arc_increment_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerFindMyPhoneClientDefaultAnisetteProvider'); + 'frbgen_bluebubbles_rust_arc_increment_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerFindMyPhoneClientDefaultAnisetteProvider', + ); late final _rust_arc_increment_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerFindMyPhoneClientDefaultAnisetteProvider = _rust_arc_increment_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerFindMyPhoneClientDefaultAnisetteProviderPtr .asFunction)>(); void - rust_arc_decrement_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerFindMyPhoneClientDefaultAnisetteProvider( + rust_arc_decrement_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerFindMyPhoneClientDefaultAnisetteProvider( ffi.Pointer ptr, ) { return _rust_arc_decrement_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerFindMyPhoneClientDefaultAnisetteProvider( @@ -9357,13 +13053,14 @@ class RustLibWire implements BaseWire { late final _rust_arc_decrement_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerFindMyPhoneClientDefaultAnisetteProviderPtr = _lookup)>>( - 'frbgen_bluebubbles_rust_arc_decrement_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerFindMyPhoneClientDefaultAnisetteProvider'); + 'frbgen_bluebubbles_rust_arc_decrement_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerFindMyPhoneClientDefaultAnisetteProvider', + ); late final _rust_arc_decrement_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerFindMyPhoneClientDefaultAnisetteProvider = _rust_arc_decrement_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerFindMyPhoneClientDefaultAnisetteProviderPtr .asFunction)>(); void - rust_arc_increment_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerGZipWrapperAttachmentMeta( + rust_arc_increment_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerGZipWrapperAttachmentMeta( ffi.Pointer ptr, ) { return _rust_arc_increment_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerGZipWrapperAttachmentMeta( @@ -9373,13 +13070,14 @@ class RustLibWire implements BaseWire { late final _rust_arc_increment_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerGZipWrapperAttachmentMetaPtr = _lookup)>>( - 'frbgen_bluebubbles_rust_arc_increment_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerGZipWrapperAttachmentMeta'); + 'frbgen_bluebubbles_rust_arc_increment_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerGZipWrapperAttachmentMeta', + ); late final _rust_arc_increment_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerGZipWrapperAttachmentMeta = _rust_arc_increment_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerGZipWrapperAttachmentMetaPtr .asFunction)>(); void - rust_arc_decrement_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerGZipWrapperAttachmentMeta( + rust_arc_decrement_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerGZipWrapperAttachmentMeta( ffi.Pointer ptr, ) { return _rust_arc_decrement_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerGZipWrapperAttachmentMeta( @@ -9389,13 +13087,14 @@ class RustLibWire implements BaseWire { late final _rust_arc_decrement_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerGZipWrapperAttachmentMetaPtr = _lookup)>>( - 'frbgen_bluebubbles_rust_arc_decrement_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerGZipWrapperAttachmentMeta'); + 'frbgen_bluebubbles_rust_arc_decrement_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerGZipWrapperAttachmentMeta', + ); late final _rust_arc_decrement_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerGZipWrapperAttachmentMeta = _rust_arc_decrement_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerGZipWrapperAttachmentMetaPtr .asFunction)>(); void - rust_arc_increment_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerGZipWrapperChatProto( + rust_arc_increment_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerGZipWrapperChatProto( ffi.Pointer ptr, ) { return _rust_arc_increment_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerGZipWrapperChatProto( @@ -9405,13 +13104,14 @@ class RustLibWire implements BaseWire { late final _rust_arc_increment_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerGZipWrapperChatProtoPtr = _lookup)>>( - 'frbgen_bluebubbles_rust_arc_increment_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerGZipWrapperChatProto'); + 'frbgen_bluebubbles_rust_arc_increment_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerGZipWrapperChatProto', + ); late final _rust_arc_increment_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerGZipWrapperChatProto = _rust_arc_increment_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerGZipWrapperChatProtoPtr .asFunction)>(); void - rust_arc_decrement_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerGZipWrapperChatProto( + rust_arc_decrement_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerGZipWrapperChatProto( ffi.Pointer ptr, ) { return _rust_arc_decrement_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerGZipWrapperChatProto( @@ -9421,13 +13121,14 @@ class RustLibWire implements BaseWire { late final _rust_arc_decrement_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerGZipWrapperChatProtoPtr = _lookup)>>( - 'frbgen_bluebubbles_rust_arc_decrement_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerGZipWrapperChatProto'); + 'frbgen_bluebubbles_rust_arc_decrement_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerGZipWrapperChatProto', + ); late final _rust_arc_decrement_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerGZipWrapperChatProto = _rust_arc_decrement_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerGZipWrapperChatProtoPtr .asFunction)>(); void - rust_arc_increment_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerGZipWrapperMessageProto( + rust_arc_increment_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerGZipWrapperMessageProto( ffi.Pointer ptr, ) { return _rust_arc_increment_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerGZipWrapperMessageProto( @@ -9437,13 +13138,14 @@ class RustLibWire implements BaseWire { late final _rust_arc_increment_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerGZipWrapperMessageProtoPtr = _lookup)>>( - 'frbgen_bluebubbles_rust_arc_increment_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerGZipWrapperMessageProto'); + 'frbgen_bluebubbles_rust_arc_increment_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerGZipWrapperMessageProto', + ); late final _rust_arc_increment_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerGZipWrapperMessageProto = _rust_arc_increment_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerGZipWrapperMessageProtoPtr .asFunction)>(); void - rust_arc_decrement_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerGZipWrapperMessageProto( + rust_arc_decrement_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerGZipWrapperMessageProto( ffi.Pointer ptr, ) { return _rust_arc_decrement_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerGZipWrapperMessageProto( @@ -9453,13 +13155,14 @@ class RustLibWire implements BaseWire { late final _rust_arc_decrement_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerGZipWrapperMessageProtoPtr = _lookup)>>( - 'frbgen_bluebubbles_rust_arc_decrement_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerGZipWrapperMessageProto'); + 'frbgen_bluebubbles_rust_arc_decrement_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerGZipWrapperMessageProto', + ); late final _rust_arc_decrement_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerGZipWrapperMessageProto = _rust_arc_decrement_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerGZipWrapperMessageProtoPtr .asFunction)>(); void - rust_arc_increment_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerGZipWrapperMessageProto2( + rust_arc_increment_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerGZipWrapperMessageProto2( ffi.Pointer ptr, ) { return _rust_arc_increment_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerGZipWrapperMessageProto2( @@ -9469,13 +13172,14 @@ class RustLibWire implements BaseWire { late final _rust_arc_increment_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerGZipWrapperMessageProto2Ptr = _lookup)>>( - 'frbgen_bluebubbles_rust_arc_increment_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerGZipWrapperMessageProto2'); + 'frbgen_bluebubbles_rust_arc_increment_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerGZipWrapperMessageProto2', + ); late final _rust_arc_increment_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerGZipWrapperMessageProto2 = _rust_arc_increment_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerGZipWrapperMessageProto2Ptr .asFunction)>(); void - rust_arc_decrement_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerGZipWrapperMessageProto2( + rust_arc_decrement_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerGZipWrapperMessageProto2( ffi.Pointer ptr, ) { return _rust_arc_decrement_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerGZipWrapperMessageProto2( @@ -9485,13 +13189,14 @@ class RustLibWire implements BaseWire { late final _rust_arc_decrement_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerGZipWrapperMessageProto2Ptr = _lookup)>>( - 'frbgen_bluebubbles_rust_arc_decrement_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerGZipWrapperMessageProto2'); + 'frbgen_bluebubbles_rust_arc_decrement_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerGZipWrapperMessageProto2', + ); late final _rust_arc_decrement_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerGZipWrapperMessageProto2 = _rust_arc_decrement_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerGZipWrapperMessageProto2Ptr .asFunction)>(); void - rust_arc_increment_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerGZipWrapperMessageProto3( + rust_arc_increment_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerGZipWrapperMessageProto3( ffi.Pointer ptr, ) { return _rust_arc_increment_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerGZipWrapperMessageProto3( @@ -9501,13 +13206,14 @@ class RustLibWire implements BaseWire { late final _rust_arc_increment_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerGZipWrapperMessageProto3Ptr = _lookup)>>( - 'frbgen_bluebubbles_rust_arc_increment_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerGZipWrapperMessageProto3'); + 'frbgen_bluebubbles_rust_arc_increment_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerGZipWrapperMessageProto3', + ); late final _rust_arc_increment_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerGZipWrapperMessageProto3 = _rust_arc_increment_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerGZipWrapperMessageProto3Ptr .asFunction)>(); void - rust_arc_decrement_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerGZipWrapperMessageProto3( + rust_arc_decrement_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerGZipWrapperMessageProto3( ffi.Pointer ptr, ) { return _rust_arc_decrement_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerGZipWrapperMessageProto3( @@ -9517,13 +13223,14 @@ class RustLibWire implements BaseWire { late final _rust_arc_decrement_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerGZipWrapperMessageProto3Ptr = _lookup)>>( - 'frbgen_bluebubbles_rust_arc_decrement_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerGZipWrapperMessageProto3'); + 'frbgen_bluebubbles_rust_arc_decrement_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerGZipWrapperMessageProto3', + ); late final _rust_arc_decrement_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerGZipWrapperMessageProto3 = _rust_arc_decrement_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerGZipWrapperMessageProto3Ptr .asFunction)>(); void - rust_arc_increment_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerGZipWrapperMessageProto4( + rust_arc_increment_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerGZipWrapperMessageProto4( ffi.Pointer ptr, ) { return _rust_arc_increment_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerGZipWrapperMessageProto4( @@ -9533,13 +13240,14 @@ class RustLibWire implements BaseWire { late final _rust_arc_increment_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerGZipWrapperMessageProto4Ptr = _lookup)>>( - 'frbgen_bluebubbles_rust_arc_increment_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerGZipWrapperMessageProto4'); + 'frbgen_bluebubbles_rust_arc_increment_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerGZipWrapperMessageProto4', + ); late final _rust_arc_increment_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerGZipWrapperMessageProto4 = _rust_arc_increment_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerGZipWrapperMessageProto4Ptr .asFunction)>(); void - rust_arc_decrement_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerGZipWrapperMessageProto4( + rust_arc_decrement_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerGZipWrapperMessageProto4( ffi.Pointer ptr, ) { return _rust_arc_decrement_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerGZipWrapperMessageProto4( @@ -9549,13 +13257,14 @@ class RustLibWire implements BaseWire { late final _rust_arc_decrement_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerGZipWrapperMessageProto4Ptr = _lookup)>>( - 'frbgen_bluebubbles_rust_arc_decrement_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerGZipWrapperMessageProto4'); + 'frbgen_bluebubbles_rust_arc_decrement_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerGZipWrapperMessageProto4', + ); late final _rust_arc_decrement_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerGZipWrapperMessageProto4 = _rust_arc_decrement_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerGZipWrapperMessageProto4Ptr .asFunction)>(); void - rust_arc_increment_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerIDSNGMIdentity( + rust_arc_increment_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerIDSNGMIdentity( ffi.Pointer ptr, ) { return _rust_arc_increment_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerIDSNGMIdentity( @@ -9565,13 +13274,14 @@ class RustLibWire implements BaseWire { late final _rust_arc_increment_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerIDSNGMIdentityPtr = _lookup)>>( - 'frbgen_bluebubbles_rust_arc_increment_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerIDSNGMIdentity'); + 'frbgen_bluebubbles_rust_arc_increment_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerIDSNGMIdentity', + ); late final _rust_arc_increment_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerIDSNGMIdentity = _rust_arc_increment_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerIDSNGMIdentityPtr .asFunction)>(); void - rust_arc_decrement_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerIDSNGMIdentity( + rust_arc_decrement_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerIDSNGMIdentity( ffi.Pointer ptr, ) { return _rust_arc_decrement_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerIDSNGMIdentity( @@ -9581,13 +13291,14 @@ class RustLibWire implements BaseWire { late final _rust_arc_decrement_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerIDSNGMIdentityPtr = _lookup)>>( - 'frbgen_bluebubbles_rust_arc_decrement_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerIDSNGMIdentity'); + 'frbgen_bluebubbles_rust_arc_decrement_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerIDSNGMIdentity', + ); late final _rust_arc_decrement_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerIDSNGMIdentity = _rust_arc_decrement_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerIDSNGMIdentityPtr .asFunction)>(); void - rust_arc_increment_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerIDSUser( + rust_arc_increment_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerIDSUser( ffi.Pointer ptr, ) { return _rust_arc_increment_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerIDSUser( @@ -9597,13 +13308,14 @@ class RustLibWire implements BaseWire { late final _rust_arc_increment_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerIDSUserPtr = _lookup)>>( - 'frbgen_bluebubbles_rust_arc_increment_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerIDSUser'); + 'frbgen_bluebubbles_rust_arc_increment_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerIDSUser', + ); late final _rust_arc_increment_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerIDSUser = _rust_arc_increment_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerIDSUserPtr .asFunction)>(); void - rust_arc_decrement_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerIDSUser( + rust_arc_decrement_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerIDSUser( ffi.Pointer ptr, ) { return _rust_arc_decrement_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerIDSUser( @@ -9613,13 +13325,14 @@ class RustLibWire implements BaseWire { late final _rust_arc_decrement_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerIDSUserPtr = _lookup)>>( - 'frbgen_bluebubbles_rust_arc_decrement_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerIDSUser'); + 'frbgen_bluebubbles_rust_arc_decrement_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerIDSUser', + ); late final _rust_arc_decrement_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerIDSUser = _rust_arc_decrement_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerIDSUserPtr .asFunction)>(); void - rust_arc_increment_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerJoinedOSConfig( + rust_arc_increment_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerJoinedOSConfig( ffi.Pointer ptr, ) { return _rust_arc_increment_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerJoinedOSConfig( @@ -9629,13 +13342,14 @@ class RustLibWire implements BaseWire { late final _rust_arc_increment_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerJoinedOSConfigPtr = _lookup)>>( - 'frbgen_bluebubbles_rust_arc_increment_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerJoinedOSConfig'); + 'frbgen_bluebubbles_rust_arc_increment_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerJoinedOSConfig', + ); late final _rust_arc_increment_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerJoinedOSConfig = _rust_arc_increment_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerJoinedOSConfigPtr .asFunction)>(); void - rust_arc_decrement_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerJoinedOSConfig( + rust_arc_decrement_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerJoinedOSConfig( ffi.Pointer ptr, ) { return _rust_arc_decrement_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerJoinedOSConfig( @@ -9645,13 +13359,14 @@ class RustLibWire implements BaseWire { late final _rust_arc_decrement_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerJoinedOSConfigPtr = _lookup)>>( - 'frbgen_bluebubbles_rust_arc_decrement_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerJoinedOSConfig'); + 'frbgen_bluebubbles_rust_arc_decrement_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerJoinedOSConfig', + ); late final _rust_arc_decrement_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerJoinedOSConfig = _rust_arc_decrement_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerJoinedOSConfigPtr .asFunction)>(); void - rust_arc_increment_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerLocationReport( + rust_arc_increment_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerLocationReport( ffi.Pointer ptr, ) { return _rust_arc_increment_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerLocationReport( @@ -9661,13 +13376,14 @@ class RustLibWire implements BaseWire { late final _rust_arc_increment_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerLocationReportPtr = _lookup)>>( - 'frbgen_bluebubbles_rust_arc_increment_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerLocationReport'); + 'frbgen_bluebubbles_rust_arc_increment_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerLocationReport', + ); late final _rust_arc_increment_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerLocationReport = _rust_arc_increment_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerLocationReportPtr .asFunction)>(); void - rust_arc_decrement_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerLocationReport( + rust_arc_decrement_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerLocationReport( ffi.Pointer ptr, ) { return _rust_arc_decrement_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerLocationReport( @@ -9677,13 +13393,14 @@ class RustLibWire implements BaseWire { late final _rust_arc_decrement_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerLocationReportPtr = _lookup)>>( - 'frbgen_bluebubbles_rust_arc_decrement_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerLocationReport'); + 'frbgen_bluebubbles_rust_arc_decrement_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerLocationReport', + ); late final _rust_arc_decrement_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerLocationReport = _rust_arc_decrement_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerLocationReportPtr .asFunction)>(); void - rust_arc_increment_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerMessageFlags( + rust_arc_increment_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerMessageFlags( ffi.Pointer ptr, ) { return _rust_arc_increment_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerMessageFlags( @@ -9693,13 +13410,14 @@ class RustLibWire implements BaseWire { late final _rust_arc_increment_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerMessageFlagsPtr = _lookup)>>( - 'frbgen_bluebubbles_rust_arc_increment_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerMessageFlags'); + 'frbgen_bluebubbles_rust_arc_increment_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerMessageFlags', + ); late final _rust_arc_increment_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerMessageFlags = _rust_arc_increment_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerMessageFlagsPtr .asFunction)>(); void - rust_arc_decrement_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerMessageFlags( + rust_arc_decrement_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerMessageFlags( ffi.Pointer ptr, ) { return _rust_arc_decrement_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerMessageFlags( @@ -9709,13 +13427,14 @@ class RustLibWire implements BaseWire { late final _rust_arc_decrement_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerMessageFlagsPtr = _lookup)>>( - 'frbgen_bluebubbles_rust_arc_decrement_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerMessageFlags'); + 'frbgen_bluebubbles_rust_arc_decrement_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerMessageFlags', + ); late final _rust_arc_decrement_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerMessageFlags = _rust_arc_decrement_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerMessageFlagsPtr .asFunction)>(); void - rust_arc_increment_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerNSArrayLPIconMetadata( + rust_arc_increment_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerNSArrayLPIconMetadata( ffi.Pointer ptr, ) { return _rust_arc_increment_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerNSArrayLPIconMetadata( @@ -9725,13 +13444,14 @@ class RustLibWire implements BaseWire { late final _rust_arc_increment_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerNSArrayLPIconMetadataPtr = _lookup)>>( - 'frbgen_bluebubbles_rust_arc_increment_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerNSArrayLPIconMetadata'); + 'frbgen_bluebubbles_rust_arc_increment_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerNSArrayLPIconMetadata', + ); late final _rust_arc_increment_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerNSArrayLPIconMetadata = _rust_arc_increment_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerNSArrayLPIconMetadataPtr .asFunction)>(); void - rust_arc_decrement_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerNSArrayLPIconMetadata( + rust_arc_decrement_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerNSArrayLPIconMetadata( ffi.Pointer ptr, ) { return _rust_arc_decrement_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerNSArrayLPIconMetadata( @@ -9741,13 +13461,14 @@ class RustLibWire implements BaseWire { late final _rust_arc_decrement_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerNSArrayLPIconMetadataPtr = _lookup)>>( - 'frbgen_bluebubbles_rust_arc_decrement_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerNSArrayLPIconMetadata'); + 'frbgen_bluebubbles_rust_arc_decrement_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerNSArrayLPIconMetadata', + ); late final _rust_arc_decrement_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerNSArrayLPIconMetadata = _rust_arc_decrement_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerNSArrayLPIconMetadataPtr .asFunction)>(); void - rust_arc_increment_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerNSArrayLPImageMetadata( + rust_arc_increment_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerNSArrayLPImageMetadata( ffi.Pointer ptr, ) { return _rust_arc_increment_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerNSArrayLPImageMetadata( @@ -9757,13 +13478,14 @@ class RustLibWire implements BaseWire { late final _rust_arc_increment_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerNSArrayLPImageMetadataPtr = _lookup)>>( - 'frbgen_bluebubbles_rust_arc_increment_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerNSArrayLPImageMetadata'); + 'frbgen_bluebubbles_rust_arc_increment_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerNSArrayLPImageMetadata', + ); late final _rust_arc_increment_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerNSArrayLPImageMetadata = _rust_arc_increment_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerNSArrayLPImageMetadataPtr .asFunction)>(); void - rust_arc_decrement_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerNSArrayLPImageMetadata( + rust_arc_decrement_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerNSArrayLPImageMetadata( ffi.Pointer ptr, ) { return _rust_arc_decrement_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerNSArrayLPImageMetadata( @@ -9773,13 +13495,14 @@ class RustLibWire implements BaseWire { late final _rust_arc_decrement_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerNSArrayLPImageMetadataPtr = _lookup)>>( - 'frbgen_bluebubbles_rust_arc_decrement_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerNSArrayLPImageMetadata'); + 'frbgen_bluebubbles_rust_arc_decrement_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerNSArrayLPImageMetadata', + ); late final _rust_arc_decrement_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerNSArrayLPImageMetadata = _rust_arc_decrement_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerNSArrayLPImageMetadataPtr .asFunction)>(); void - rust_arc_increment_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerPushError( + rust_arc_increment_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerPushError( ffi.Pointer ptr, ) { return _rust_arc_increment_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerPushError( @@ -9789,13 +13512,14 @@ class RustLibWire implements BaseWire { late final _rust_arc_increment_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerPushErrorPtr = _lookup)>>( - 'frbgen_bluebubbles_rust_arc_increment_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerPushError'); + 'frbgen_bluebubbles_rust_arc_increment_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerPushError', + ); late final _rust_arc_increment_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerPushError = _rust_arc_increment_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerPushErrorPtr .asFunction)>(); void - rust_arc_decrement_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerPushError( + rust_arc_decrement_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerPushError( ffi.Pointer ptr, ) { return _rust_arc_decrement_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerPushError( @@ -9805,13 +13529,14 @@ class RustLibWire implements BaseWire { late final _rust_arc_decrement_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerPushErrorPtr = _lookup)>>( - 'frbgen_bluebubbles_rust_arc_decrement_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerPushError'); + 'frbgen_bluebubbles_rust_arc_decrement_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerPushError', + ); late final _rust_arc_decrement_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerPushError = _rust_arc_decrement_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerPushErrorPtr .asFunction)>(); void - rust_arc_increment_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerReceiverAPSMessage( + rust_arc_increment_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerReceiverAPSMessage( ffi.Pointer ptr, ) { return _rust_arc_increment_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerReceiverAPSMessage( @@ -9821,13 +13546,14 @@ class RustLibWire implements BaseWire { late final _rust_arc_increment_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerReceiverAPSMessagePtr = _lookup)>>( - 'frbgen_bluebubbles_rust_arc_increment_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerReceiverAPSMessage'); + 'frbgen_bluebubbles_rust_arc_increment_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerReceiverAPSMessage', + ); late final _rust_arc_increment_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerReceiverAPSMessage = _rust_arc_increment_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerReceiverAPSMessagePtr .asFunction)>(); void - rust_arc_decrement_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerReceiverAPSMessage( + rust_arc_decrement_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerReceiverAPSMessage( ffi.Pointer ptr, ) { return _rust_arc_decrement_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerReceiverAPSMessage( @@ -9837,13 +13563,14 @@ class RustLibWire implements BaseWire { late final _rust_arc_decrement_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerReceiverAPSMessagePtr = _lookup)>>( - 'frbgen_bluebubbles_rust_arc_decrement_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerReceiverAPSMessage'); + 'frbgen_bluebubbles_rust_arc_decrement_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerReceiverAPSMessage', + ); late final _rust_arc_decrement_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerReceiverAPSMessage = _rust_arc_decrement_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerReceiverAPSMessagePtr .asFunction)>(); void - rust_arc_increment_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerSavedHardwareState( + rust_arc_increment_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerSavedHardwareState( ffi.Pointer ptr, ) { return _rust_arc_increment_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerSavedHardwareState( @@ -9853,13 +13580,14 @@ class RustLibWire implements BaseWire { late final _rust_arc_increment_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerSavedHardwareStatePtr = _lookup)>>( - 'frbgen_bluebubbles_rust_arc_increment_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerSavedHardwareState'); + 'frbgen_bluebubbles_rust_arc_increment_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerSavedHardwareState', + ); late final _rust_arc_increment_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerSavedHardwareState = _rust_arc_increment_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerSavedHardwareStatePtr .asFunction)>(); void - rust_arc_decrement_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerSavedHardwareState( + rust_arc_decrement_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerSavedHardwareState( ffi.Pointer ptr, ) { return _rust_arc_decrement_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerSavedHardwareState( @@ -9869,13 +13597,14 @@ class RustLibWire implements BaseWire { late final _rust_arc_decrement_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerSavedHardwareStatePtr = _lookup)>>( - 'frbgen_bluebubbles_rust_arc_decrement_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerSavedHardwareState'); + 'frbgen_bluebubbles_rust_arc_decrement_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerSavedHardwareState', + ); late final _rust_arc_decrement_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerSavedHardwareState = _rust_arc_decrement_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerSavedHardwareStatePtr .asFunction)>(); void - rust_arc_increment_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerSender( + rust_arc_increment_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerSender( ffi.Pointer ptr, ) { return _rust_arc_increment_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerSender( @@ -9885,13 +13614,14 @@ class RustLibWire implements BaseWire { late final _rust_arc_increment_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerSenderPtr = _lookup)>>( - 'frbgen_bluebubbles_rust_arc_increment_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerSender'); + 'frbgen_bluebubbles_rust_arc_increment_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerSender', + ); late final _rust_arc_increment_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerSender = _rust_arc_increment_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerSenderPtr .asFunction)>(); void - rust_arc_decrement_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerSender( + rust_arc_decrement_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerSender( ffi.Pointer ptr, ) { return _rust_arc_decrement_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerSender( @@ -9901,13 +13631,14 @@ class RustLibWire implements BaseWire { late final _rust_arc_decrement_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerSenderPtr = _lookup)>>( - 'frbgen_bluebubbles_rust_arc_decrement_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerSender'); + 'frbgen_bluebubbles_rust_arc_decrement_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerSender', + ); late final _rust_arc_decrement_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerSender = _rust_arc_decrement_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerSenderPtr .asFunction)>(); void - rust_arc_increment_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerStCollapsedValue( + rust_arc_increment_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerStCollapsedValue( ffi.Pointer ptr, ) { return _rust_arc_increment_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerStCollapsedValue( @@ -9917,13 +13648,14 @@ class RustLibWire implements BaseWire { late final _rust_arc_increment_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerStCollapsedValuePtr = _lookup)>>( - 'frbgen_bluebubbles_rust_arc_increment_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerStCollapsedValue'); + 'frbgen_bluebubbles_rust_arc_increment_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerStCollapsedValue', + ); late final _rust_arc_increment_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerStCollapsedValue = _rust_arc_increment_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerStCollapsedValuePtr .asFunction)>(); void - rust_arc_decrement_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerStCollapsedValue( + rust_arc_decrement_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerStCollapsedValue( ffi.Pointer ptr, ) { return _rust_arc_decrement_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerStCollapsedValue( @@ -9933,13 +13665,14 @@ class RustLibWire implements BaseWire { late final _rust_arc_decrement_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerStCollapsedValuePtr = _lookup)>>( - 'frbgen_bluebubbles_rust_arc_decrement_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerStCollapsedValue'); + 'frbgen_bluebubbles_rust_arc_decrement_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerStCollapsedValue', + ); late final _rust_arc_decrement_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerStCollapsedValue = _rust_arc_decrement_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerStCollapsedValuePtr .asFunction)>(); void - rust_arc_increment_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerSyncManagerDefaultAnisetteProviderMyFilePackager( + rust_arc_increment_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerSyncManagerDefaultAnisetteProviderMyFilePackager( ffi.Pointer ptr, ) { return _rust_arc_increment_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerSyncManagerDefaultAnisetteProviderMyFilePackager( @@ -9949,13 +13682,14 @@ class RustLibWire implements BaseWire { late final _rust_arc_increment_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerSyncManagerDefaultAnisetteProviderMyFilePackagerPtr = _lookup)>>( - 'frbgen_bluebubbles_rust_arc_increment_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerSyncManagerDefaultAnisetteProviderMyFilePackager'); + 'frbgen_bluebubbles_rust_arc_increment_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerSyncManagerDefaultAnisetteProviderMyFilePackager', + ); late final _rust_arc_increment_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerSyncManagerDefaultAnisetteProviderMyFilePackager = _rust_arc_increment_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerSyncManagerDefaultAnisetteProviderMyFilePackagerPtr .asFunction)>(); void - rust_arc_decrement_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerSyncManagerDefaultAnisetteProviderMyFilePackager( + rust_arc_decrement_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerSyncManagerDefaultAnisetteProviderMyFilePackager( ffi.Pointer ptr, ) { return _rust_arc_decrement_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerSyncManagerDefaultAnisetteProviderMyFilePackager( @@ -9965,13 +13699,14 @@ class RustLibWire implements BaseWire { late final _rust_arc_decrement_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerSyncManagerDefaultAnisetteProviderMyFilePackagerPtr = _lookup)>>( - 'frbgen_bluebubbles_rust_arc_decrement_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerSyncManagerDefaultAnisetteProviderMyFilePackager'); + 'frbgen_bluebubbles_rust_arc_decrement_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerSyncManagerDefaultAnisetteProviderMyFilePackager', + ); late final _rust_arc_decrement_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerSyncManagerDefaultAnisetteProviderMyFilePackager = _rust_arc_decrement_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerSyncManagerDefaultAnisetteProviderMyFilePackagerPtr .asFunction)>(); void - rust_arc_increment_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerSystemTime( + rust_arc_increment_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerSystemTime( ffi.Pointer ptr, ) { return _rust_arc_increment_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerSystemTime( @@ -9981,13 +13716,14 @@ class RustLibWire implements BaseWire { late final _rust_arc_increment_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerSystemTimePtr = _lookup)>>( - 'frbgen_bluebubbles_rust_arc_increment_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerSystemTime'); + 'frbgen_bluebubbles_rust_arc_increment_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerSystemTime', + ); late final _rust_arc_increment_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerSystemTime = _rust_arc_increment_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerSystemTimePtr .asFunction)>(); void - rust_arc_decrement_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerSystemTime( + rust_arc_decrement_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerSystemTime( ffi.Pointer ptr, ) { return _rust_arc_decrement_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerSystemTime( @@ -9997,13 +13733,14 @@ class RustLibWire implements BaseWire { late final _rust_arc_decrement_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerSystemTimePtr = _lookup)>>( - 'frbgen_bluebubbles_rust_arc_decrement_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerSystemTime'); + 'frbgen_bluebubbles_rust_arc_decrement_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerSystemTime', + ); late final _rust_arc_decrement_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerSystemTime = _rust_arc_decrement_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerSystemTimePtr .asFunction)>(); void - rust_arc_increment_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerVerifyBody( + rust_arc_increment_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerVerifyBody( ffi.Pointer ptr, ) { return _rust_arc_increment_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerVerifyBody( @@ -10013,13 +13750,14 @@ class RustLibWire implements BaseWire { late final _rust_arc_increment_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerVerifyBodyPtr = _lookup)>>( - 'frbgen_bluebubbles_rust_arc_increment_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerVerifyBody'); + 'frbgen_bluebubbles_rust_arc_increment_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerVerifyBody', + ); late final _rust_arc_increment_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerVerifyBody = _rust_arc_increment_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerVerifyBodyPtr .asFunction)>(); void - rust_arc_decrement_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerVerifyBody( + rust_arc_decrement_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerVerifyBody( ffi.Pointer ptr, ) { return _rust_arc_decrement_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerVerifyBody( @@ -10029,13 +13767,14 @@ class RustLibWire implements BaseWire { late final _rust_arc_decrement_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerVerifyBodyPtr = _lookup)>>( - 'frbgen_bluebubbles_rust_arc_decrement_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerVerifyBody'); + 'frbgen_bluebubbles_rust_arc_decrement_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerVerifyBody', + ); late final _rust_arc_decrement_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerVerifyBody = _rust_arc_decrement_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerVerifyBodyPtr .asFunction)>(); void - rust_arc_increment_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerViableBottle( + rust_arc_increment_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerViableBottle( ffi.Pointer ptr, ) { return _rust_arc_increment_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerViableBottle( @@ -10045,13 +13784,14 @@ class RustLibWire implements BaseWire { late final _rust_arc_increment_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerViableBottlePtr = _lookup)>>( - 'frbgen_bluebubbles_rust_arc_increment_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerViableBottle'); + 'frbgen_bluebubbles_rust_arc_increment_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerViableBottle', + ); late final _rust_arc_increment_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerViableBottle = _rust_arc_increment_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerViableBottlePtr .asFunction)>(); void - rust_arc_decrement_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerViableBottle( + rust_arc_decrement_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerViableBottle( ffi.Pointer ptr, ) { return _rust_arc_decrement_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerViableBottle( @@ -10061,7 +13801,8 @@ class RustLibWire implements BaseWire { late final _rust_arc_decrement_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerViableBottlePtr = _lookup)>>( - 'frbgen_bluebubbles_rust_arc_decrement_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerViableBottle'); + 'frbgen_bluebubbles_rust_arc_decrement_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerViableBottle', + ); late final _rust_arc_decrement_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerViableBottle = _rust_arc_decrement_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerViableBottlePtr .asFunction)>(); diff --git a/lib/src/rust/frb_generated.web.dart b/lib/src/rust/frb_generated.web.dart new file mode 100644 index 0000000000..dad80758f8 --- /dev/null +++ b/lib/src/rust/frb_generated.web.dart @@ -0,0 +1,13393 @@ +// This file is automatically generated, so please do not edit it. +// Generated by `flutter_rust_bridge`@ 2.3.0. + +// ignore_for_file: unused_import, unused_element, unnecessary_import, duplicate_ignore, invalid_use_of_internal_member, annotate_overrides, non_constant_identifier_names, curly_braces_in_flow_control_structures, prefer_const_literals_to_create_immutables, unused_field + +// Static analysis wrongly picks the IO variant, thus ignore this +// ignore_for_file: argument_type_not_assignable + +import 'api/api.dart'; +import 'dart:async'; +import 'dart:convert'; +import 'frb_generated.dart'; +import 'lib.dart'; +import 'package:flutter_rust_bridge/flutter_rust_bridge_for_generated_web.dart'; + +abstract class RustLibApiImplPlatform extends BaseApiImpl { + RustLibApiImplPlatform({ + required super.handler, + required super.wire, + required super.generalizedFrbRustBinding, + required super.portManager, + }); + + CrossPlatformFinalizerArg + get rust_arc_decrement_strong_count_ApsConnectionPtr => wire + .rust_arc_decrement_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerAPSConnection; + + CrossPlatformFinalizerArg + get rust_arc_decrement_strong_count_ApsStatePtr => wire + .rust_arc_decrement_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerAPSState; + + CrossPlatformFinalizerArg + get rust_arc_decrement_strong_count_ApsWatcherPtr => wire + .rust_arc_decrement_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerAPSWatcher; + + CrossPlatformFinalizerArg + get rust_arc_decrement_strong_count_ArcAnisetteClientDefaultAnisetteProviderPtr => + wire.rust_arc_decrement_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcAnisetteClientDefaultAnisetteProvider; + + CrossPlatformFinalizerArg + get rust_arc_decrement_strong_count_ArcCloudKitClientDefaultAnisetteProviderPtr => + wire.rust_arc_decrement_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcCloudKitClientDefaultAnisetteProvider; + + CrossPlatformFinalizerArg + get rust_arc_decrement_strong_count_ArcCloudMessagesClientDefaultAnisetteProviderPtr => + wire.rust_arc_decrement_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcCloudMessagesClientDefaultAnisetteProvider; + + CrossPlatformFinalizerArg + get rust_arc_decrement_strong_count_ArcFtClientPtr => wire + .rust_arc_decrement_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcFTClient; + + CrossPlatformFinalizerArg + get rust_arc_decrement_strong_count_ArcFindMyClientDefaultAnisetteProviderPtr => + wire.rust_arc_decrement_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcFindMyClientDefaultAnisetteProvider; + + CrossPlatformFinalizerArg + get rust_arc_decrement_strong_count_ArcImClientPtr => wire + .rust_arc_decrement_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcIMClient; + + CrossPlatformFinalizerArg + get rust_arc_decrement_strong_count_ArcIdmsAuthListenerPtr => wire + .rust_arc_decrement_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcIdmsAuthListener; + + CrossPlatformFinalizerArg + get rust_arc_decrement_strong_count_ArcKeychainClientDefaultAnisetteProviderPtr => + wire.rust_arc_decrement_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcKeychainClientDefaultAnisetteProvider; + + CrossPlatformFinalizerArg + get rust_arc_decrement_strong_count_ArcMutexAppleAccountDefaultAnisetteProviderPtr => + wire.rust_arc_decrement_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcMutexAppleAccountDefaultAnisetteProvider; + + CrossPlatformFinalizerArg + get rust_arc_decrement_strong_count_ArcMutexOptionCircleClientSessionDefaultAnisetteProviderPtr => + wire.rust_arc_decrement_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcMutexOptionCircleClientSessionDefaultAnisetteProvider; + + CrossPlatformFinalizerArg + get rust_arc_decrement_strong_count_ArcMutexVecActiveCircleSessionPtr => wire + .rust_arc_decrement_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcMutexVecActiveCircleSession; + + CrossPlatformFinalizerArg + get rust_arc_decrement_strong_count_ArcPasswordManagerDefaultAnisetteProviderPtr => + wire.rust_arc_decrement_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcPasswordManagerDefaultAnisetteProvider; + + CrossPlatformFinalizerArg + get rust_arc_decrement_strong_count_ArcProfilesClientDefaultAnisetteProviderPtr => + wire.rust_arc_decrement_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcProfilesClientDefaultAnisetteProvider; + + CrossPlatformFinalizerArg + get rust_arc_decrement_strong_count_ArcSenderPushMessagePtr => wire + .rust_arc_decrement_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcSenderPushMessage; + + CrossPlatformFinalizerArg + get rust_arc_decrement_strong_count_ArcSharedPushStatePtr => wire + .rust_arc_decrement_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcSharedPushState; + + CrossPlatformFinalizerArg + get rust_arc_decrement_strong_count_ArcStatusKitClientDefaultAnisetteProviderPtr => + wire.rust_arc_decrement_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcStatusKitClientDefaultAnisetteProvider; + + CrossPlatformFinalizerArg + get rust_arc_decrement_strong_count_ArcTokenProviderDefaultAnisetteProviderPtr => + wire.rust_arc_decrement_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcTokenProviderDefaultAnisetteProvider; + + CrossPlatformFinalizerArg get rust_arc_decrement_strong_count_AssetPtr => wire + .rust_arc_decrement_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerAsset; + + CrossPlatformFinalizerArg + get rust_arc_decrement_strong_count_ChannelInterestTokenPtr => wire + .rust_arc_decrement_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerChannelInterestToken; + + CrossPlatformFinalizerArg + get rust_arc_decrement_strong_count_CircleClientSessionDefaultAnisetteProviderPtr => + wire.rust_arc_decrement_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerCircleClientSessionDefaultAnisetteProvider; + + CrossPlatformFinalizerArg + get rust_arc_decrement_strong_count_CloudSyncPreparedMessageCreateHandlePtr => + wire.rust_arc_decrement_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerCloudSyncPreparedMessageCreateHandle; + + CrossPlatformFinalizerArg + get rust_arc_decrement_strong_count_ConversationLinkPtr => wire + .rust_arc_decrement_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerConversationLink; + + CrossPlatformFinalizerArg + get rust_arc_decrement_strong_count_ConversationParticipantPtr => wire + .rust_arc_decrement_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerConversationParticipant; + + CrossPlatformFinalizerArg get rust_arc_decrement_strong_count_DatePtr => wire + .rust_arc_decrement_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerDate; + + CrossPlatformFinalizerArg + get rust_arc_decrement_strong_count_EscrowDataPtr => wire + .rust_arc_decrement_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerEscrowData; + + CrossPlatformFinalizerArg + get rust_arc_decrement_strong_count_FindMyFriendsClientDefaultAnisetteProviderPtr => + wire.rust_arc_decrement_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerFindMyFriendsClientDefaultAnisetteProvider; + + CrossPlatformFinalizerArg + get rust_arc_decrement_strong_count_FindMyPhoneClientDefaultAnisetteProviderPtr => + wire.rust_arc_decrement_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerFindMyPhoneClientDefaultAnisetteProvider; + + CrossPlatformFinalizerArg + get rust_arc_decrement_strong_count_GZipWrapperAttachmentMetaPtr => wire + .rust_arc_decrement_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerGZipWrapperAttachmentMeta; + + CrossPlatformFinalizerArg + get rust_arc_decrement_strong_count_GZipWrapperChatProtoPtr => wire + .rust_arc_decrement_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerGZipWrapperChatProto; + + CrossPlatformFinalizerArg + get rust_arc_decrement_strong_count_GZipWrapperMessageProtoPtr => wire + .rust_arc_decrement_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerGZipWrapperMessageProto; + + CrossPlatformFinalizerArg + get rust_arc_decrement_strong_count_GZipWrapperMessageProto2Ptr => wire + .rust_arc_decrement_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerGZipWrapperMessageProto2; + + CrossPlatformFinalizerArg + get rust_arc_decrement_strong_count_GZipWrapperMessageProto3Ptr => wire + .rust_arc_decrement_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerGZipWrapperMessageProto3; + + CrossPlatformFinalizerArg + get rust_arc_decrement_strong_count_GZipWrapperMessageProto4Ptr => wire + .rust_arc_decrement_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerGZipWrapperMessageProto4; + + CrossPlatformFinalizerArg + get rust_arc_decrement_strong_count_IdsngmIdentityPtr => wire + .rust_arc_decrement_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerIDSNGMIdentity; + + CrossPlatformFinalizerArg + get rust_arc_decrement_strong_count_IdsUserPtr => wire + .rust_arc_decrement_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerIDSUser; + + CrossPlatformFinalizerArg + get rust_arc_decrement_strong_count_JoinedOsConfigPtr => wire + .rust_arc_decrement_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerJoinedOSConfig; + + CrossPlatformFinalizerArg + get rust_arc_decrement_strong_count_LocationReportPtr => wire + .rust_arc_decrement_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerLocationReport; + + CrossPlatformFinalizerArg + get rust_arc_decrement_strong_count_MessageFlagsPtr => wire + .rust_arc_decrement_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerMessageFlags; + + CrossPlatformFinalizerArg + get rust_arc_decrement_strong_count_NsArrayLpIconMetadataPtr => wire + .rust_arc_decrement_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerNSArrayLPIconMetadata; + + CrossPlatformFinalizerArg + get rust_arc_decrement_strong_count_NsArrayLpImageMetadataPtr => wire + .rust_arc_decrement_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerNSArrayLPImageMetadata; + + CrossPlatformFinalizerArg + get rust_arc_decrement_strong_count_PushErrorPtr => wire + .rust_arc_decrement_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerPushError; + + CrossPlatformFinalizerArg + get rust_arc_decrement_strong_count_ReceiverApsMessagePtr => wire + .rust_arc_decrement_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerReceiverAPSMessage; + + CrossPlatformFinalizerArg + get rust_arc_decrement_strong_count_SavedHardwareStatePtr => wire + .rust_arc_decrement_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerSavedHardwareState; + + CrossPlatformFinalizerArg + get rust_arc_decrement_strong_count_SenderPtr => wire + .rust_arc_decrement_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerSender; + + CrossPlatformFinalizerArg + get rust_arc_decrement_strong_count_StCollapsedValuePtr => wire + .rust_arc_decrement_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerStCollapsedValue; + + CrossPlatformFinalizerArg + get rust_arc_decrement_strong_count_SyncManagerDefaultAnisetteProviderMyFilePackagerPtr => + wire.rust_arc_decrement_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerSyncManagerDefaultAnisetteProviderMyFilePackager; + + CrossPlatformFinalizerArg + get rust_arc_decrement_strong_count_SystemTimePtr => wire + .rust_arc_decrement_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerSystemTime; + + CrossPlatformFinalizerArg + get rust_arc_decrement_strong_count_VerifyBodyPtr => wire + .rust_arc_decrement_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerVerifyBody; + + CrossPlatformFinalizerArg + get rust_arc_decrement_strong_count_ViableBottlePtr => wire + .rust_arc_decrement_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerViableBottle; + + @protected + AnyhowException dco_decode_AnyhowException(dynamic raw); + + @protected + ApsConnection + dco_decode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerAPSConnection( + dynamic raw, + ); + + @protected + ApsState + dco_decode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerAPSState( + dynamic raw, + ); + + @protected + ApsWatcher + dco_decode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerAPSWatcher( + dynamic raw, + ); + + @protected + ArcAnisetteClientDefaultAnisetteProvider + dco_decode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcAnisetteClientDefaultAnisetteProvider( + dynamic raw, + ); + + @protected + ArcCloudKitClientDefaultAnisetteProvider + dco_decode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcCloudKitClientDefaultAnisetteProvider( + dynamic raw, + ); + + @protected + ArcCloudMessagesClientDefaultAnisetteProvider + dco_decode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcCloudMessagesClientDefaultAnisetteProvider( + dynamic raw, + ); + + @protected + ArcFtClient + dco_decode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcFTClient( + dynamic raw, + ); + + @protected + ArcFindMyClientDefaultAnisetteProvider + dco_decode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcFindMyClientDefaultAnisetteProvider( + dynamic raw, + ); + + @protected + ArcImClient + dco_decode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcIMClient( + dynamic raw, + ); + + @protected + ArcIdmsAuthListener + dco_decode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcIdmsAuthListener( + dynamic raw, + ); + + @protected + ArcKeychainClientDefaultAnisetteProvider + dco_decode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcKeychainClientDefaultAnisetteProvider( + dynamic raw, + ); + + @protected + ArcMutexAppleAccountDefaultAnisetteProvider + dco_decode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcMutexAppleAccountDefaultAnisetteProvider( + dynamic raw, + ); + + @protected + ArcMutexOptionCircleClientSessionDefaultAnisetteProvider + dco_decode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcMutexOptionCircleClientSessionDefaultAnisetteProvider( + dynamic raw, + ); + + @protected + ArcMutexVecActiveCircleSession + dco_decode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcMutexVecActiveCircleSession( + dynamic raw, + ); + + @protected + ArcPasswordManagerDefaultAnisetteProvider + dco_decode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcPasswordManagerDefaultAnisetteProvider( + dynamic raw, + ); + + @protected + ArcProfilesClientDefaultAnisetteProvider + dco_decode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcProfilesClientDefaultAnisetteProvider( + dynamic raw, + ); + + @protected + ArcSenderPushMessage + dco_decode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcSenderPushMessage( + dynamic raw, + ); + + @protected + ArcSharedPushState + dco_decode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcSharedPushState( + dynamic raw, + ); + + @protected + ArcStatusKitClientDefaultAnisetteProvider + dco_decode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcStatusKitClientDefaultAnisetteProvider( + dynamic raw, + ); + + @protected + ArcTokenProviderDefaultAnisetteProvider + dco_decode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcTokenProviderDefaultAnisetteProvider( + dynamic raw, + ); + + @protected + Asset + dco_decode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerAsset( + dynamic raw, + ); + + @protected + ChannelInterestToken + dco_decode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerChannelInterestToken( + dynamic raw, + ); + + @protected + CircleClientSessionDefaultAnisetteProvider + dco_decode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerCircleClientSessionDefaultAnisetteProvider( + dynamic raw, + ); + + @protected + CloudSyncPreparedMessageCreateHandle + dco_decode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerCloudSyncPreparedMessageCreateHandle( + dynamic raw, + ); + + @protected + ConversationLink + dco_decode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerConversationLink( + dynamic raw, + ); + + @protected + ConversationParticipant + dco_decode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerConversationParticipant( + dynamic raw, + ); + + @protected + Date + dco_decode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerDate( + dynamic raw, + ); + + @protected + EscrowData + dco_decode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerEscrowData( + dynamic raw, + ); + + @protected + FindMyFriendsClientDefaultAnisetteProvider + dco_decode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerFindMyFriendsClientDefaultAnisetteProvider( + dynamic raw, + ); + + @protected + FindMyPhoneClientDefaultAnisetteProvider + dco_decode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerFindMyPhoneClientDefaultAnisetteProvider( + dynamic raw, + ); + + @protected + GZipWrapperAttachmentMeta + dco_decode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerGZipWrapperAttachmentMeta( + dynamic raw, + ); + + @protected + GZipWrapperChatProto + dco_decode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerGZipWrapperChatProto( + dynamic raw, + ); + + @protected + GZipWrapperMessageProto + dco_decode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerGZipWrapperMessageProto( + dynamic raw, + ); + + @protected + GZipWrapperMessageProto2 + dco_decode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerGZipWrapperMessageProto2( + dynamic raw, + ); + + @protected + GZipWrapperMessageProto3 + dco_decode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerGZipWrapperMessageProto3( + dynamic raw, + ); + + @protected + GZipWrapperMessageProto4 + dco_decode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerGZipWrapperMessageProto4( + dynamic raw, + ); + + @protected + IdsngmIdentity + dco_decode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerIDSNGMIdentity( + dynamic raw, + ); + + @protected + IdsUser + dco_decode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerIDSUser( + dynamic raw, + ); + + @protected + JoinedOsConfig + dco_decode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerJoinedOSConfig( + dynamic raw, + ); + + @protected + LocationReport + dco_decode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerLocationReport( + dynamic raw, + ); + + @protected + MessageFlags + dco_decode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerMessageFlags( + dynamic raw, + ); + + @protected + NsArrayLpIconMetadata + dco_decode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerNSArrayLPIconMetadata( + dynamic raw, + ); + + @protected + NsArrayLpImageMetadata + dco_decode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerNSArrayLPImageMetadata( + dynamic raw, + ); + + @protected + PushError + dco_decode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerPushError( + dynamic raw, + ); + + @protected + ReceiverApsMessage + dco_decode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerReceiverAPSMessage( + dynamic raw, + ); + + @protected + SavedHardwareState + dco_decode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerSavedHardwareState( + dynamic raw, + ); + + @protected + Sender + dco_decode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerSender( + dynamic raw, + ); + + @protected + StCollapsedValue + dco_decode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerStCollapsedValue( + dynamic raw, + ); + + @protected + SyncManagerDefaultAnisetteProviderMyFilePackager + dco_decode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerSyncManagerDefaultAnisetteProviderMyFilePackager( + dynamic raw, + ); + + @protected + SystemTime + dco_decode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerSystemTime( + dynamic raw, + ); + + @protected + VerifyBody + dco_decode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerVerifyBody( + dynamic raw, + ); + + @protected + ViableBottle + dco_decode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerViableBottle( + dynamic raw, + ); + + @protected + ApsWatcher + dco_decode_Auto_RefMut_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerAPSWatcher( + dynamic raw, + ); + + @protected + CircleClientSessionDefaultAnisetteProvider + dco_decode_Auto_RefMut_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerCircleClientSessionDefaultAnisetteProvider( + dynamic raw, + ); + + @protected + FindMyFriendsClientDefaultAnisetteProvider + dco_decode_Auto_RefMut_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerFindMyFriendsClientDefaultAnisetteProvider( + dynamic raw, + ); + + @protected + FindMyPhoneClientDefaultAnisetteProvider + dco_decode_Auto_RefMut_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerFindMyPhoneClientDefaultAnisetteProvider( + dynamic raw, + ); + + @protected + LocationReport + dco_decode_Auto_RefMut_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerLocationReport( + dynamic raw, + ); + + @protected + ReceiverApsMessage + dco_decode_Auto_RefMut_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerReceiverAPSMessage( + dynamic raw, + ); + + @protected + SavedHardwareState + dco_decode_Auto_RefMut_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerSavedHardwareState( + dynamic raw, + ); + + @protected + ViableBottle + dco_decode_Auto_RefMut_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerViableBottle( + dynamic raw, + ); + + @protected + ApsConnection + dco_decode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerAPSConnection( + dynamic raw, + ); + + @protected + ArcAnisetteClientDefaultAnisetteProvider + dco_decode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcAnisetteClientDefaultAnisetteProvider( + dynamic raw, + ); + + @protected + ArcCloudKitClientDefaultAnisetteProvider + dco_decode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcCloudKitClientDefaultAnisetteProvider( + dynamic raw, + ); + + @protected + ArcCloudMessagesClientDefaultAnisetteProvider + dco_decode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcCloudMessagesClientDefaultAnisetteProvider( + dynamic raw, + ); + + @protected + ArcFtClient + dco_decode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcFTClient( + dynamic raw, + ); + + @protected + ArcFindMyClientDefaultAnisetteProvider + dco_decode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcFindMyClientDefaultAnisetteProvider( + dynamic raw, + ); + + @protected + ArcImClient + dco_decode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcIMClient( + dynamic raw, + ); + + @protected + ArcIdmsAuthListener + dco_decode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcIdmsAuthListener( + dynamic raw, + ); + + @protected + ArcKeychainClientDefaultAnisetteProvider + dco_decode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcKeychainClientDefaultAnisetteProvider( + dynamic raw, + ); + + @protected + ArcMutexAppleAccountDefaultAnisetteProvider + dco_decode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcMutexAppleAccountDefaultAnisetteProvider( + dynamic raw, + ); + + @protected + ArcMutexOptionCircleClientSessionDefaultAnisetteProvider + dco_decode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcMutexOptionCircleClientSessionDefaultAnisetteProvider( + dynamic raw, + ); + + @protected + ArcMutexVecActiveCircleSession + dco_decode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcMutexVecActiveCircleSession( + dynamic raw, + ); + + @protected + ArcPasswordManagerDefaultAnisetteProvider + dco_decode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcPasswordManagerDefaultAnisetteProvider( + dynamic raw, + ); + + @protected + ArcProfilesClientDefaultAnisetteProvider + dco_decode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcProfilesClientDefaultAnisetteProvider( + dynamic raw, + ); + + @protected + ArcSenderPushMessage + dco_decode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcSenderPushMessage( + dynamic raw, + ); + + @protected + ArcSharedPushState + dco_decode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcSharedPushState( + dynamic raw, + ); + + @protected + ArcStatusKitClientDefaultAnisetteProvider + dco_decode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcStatusKitClientDefaultAnisetteProvider( + dynamic raw, + ); + + @protected + ArcTokenProviderDefaultAnisetteProvider + dco_decode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcTokenProviderDefaultAnisetteProvider( + dynamic raw, + ); + + @protected + CloudSyncPreparedMessageCreateHandle + dco_decode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerCloudSyncPreparedMessageCreateHandle( + dynamic raw, + ); + + @protected + Date + dco_decode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerDate( + dynamic raw, + ); + + @protected + EscrowData + dco_decode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerEscrowData( + dynamic raw, + ); + + @protected + GZipWrapperAttachmentMeta + dco_decode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerGZipWrapperAttachmentMeta( + dynamic raw, + ); + + @protected + GZipWrapperChatProto + dco_decode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerGZipWrapperChatProto( + dynamic raw, + ); + + @protected + GZipWrapperMessageProto + dco_decode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerGZipWrapperMessageProto( + dynamic raw, + ); + + @protected + GZipWrapperMessageProto2 + dco_decode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerGZipWrapperMessageProto2( + dynamic raw, + ); + + @protected + GZipWrapperMessageProto3 + dco_decode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerGZipWrapperMessageProto3( + dynamic raw, + ); + + @protected + GZipWrapperMessageProto4 + dco_decode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerGZipWrapperMessageProto4( + dynamic raw, + ); + + @protected + IdsngmIdentity + dco_decode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerIDSNGMIdentity( + dynamic raw, + ); + + @protected + IdsUser + dco_decode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerIDSUser( + dynamic raw, + ); + + @protected + JoinedOsConfig + dco_decode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerJoinedOSConfig( + dynamic raw, + ); + + @protected + LocationReport + dco_decode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerLocationReport( + dynamic raw, + ); + + @protected + MessageFlags + dco_decode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerMessageFlags( + dynamic raw, + ); + + @protected + SavedHardwareState + dco_decode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerSavedHardwareState( + dynamic raw, + ); + + @protected + Sender + dco_decode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerSender( + dynamic raw, + ); + + @protected + StCollapsedValue + dco_decode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerStCollapsedValue( + dynamic raw, + ); + + @protected + SyncManagerDefaultAnisetteProviderMyFilePackager + dco_decode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerSyncManagerDefaultAnisetteProviderMyFilePackager( + dynamic raw, + ); + + @protected + VerifyBody + dco_decode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerVerifyBody( + dynamic raw, + ); + + @protected + ViableBottle + dco_decode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerViableBottle( + dynamic raw, + ); + + @protected + int dco_decode_CastedPrimitive_i_64(dynamic raw); + + @protected + int dco_decode_CastedPrimitive_u_64(dynamic raw); + + @protected + int dco_decode_CastedPrimitive_usize(dynamic raw); + + @protected + FutureOr Function(String) + dco_decode_DartFn_Inputs_String_Output_String_AnyhowException(dynamic raw); + + @protected + Object dco_decode_DartOpaque(dynamic raw); + + @protected + Map + dco_decode_Map_String_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerAsset( + dynamic raw, + ); + + @protected + Map + dco_decode_Map_String_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerStCollapsedValue( + dynamic raw, + ); + + @protected + Map dco_decode_Map_String_CastedPrimitive_u_64(dynamic raw); + + @protected + Map dco_decode_Map_String_String(dynamic raw); + + @protected + Map dco_decode_Map_String_bool(dynamic raw); + + @protected + Map dco_decode_Map_String_cloud_attachment( + dynamic raw, + ); + + @protected + Map dco_decode_Map_String_cloud_chat(dynamic raw); + + @protected + Map dco_decode_Map_String_cloud_message(dynamic raw); + + @protected + Map dco_decode_Map_String_ft_participant(dynamic raw); + + @protected + Map dco_decode_Map_String_group_summary(dynamic raw); + + @protected + Map> dco_decode_Map_String_list_message_edit( + dynamic raw, + ); + + @protected + Map dco_decode_Map_String_list_prim_u_8_strict( + dynamic raw, + ); + + @protected + Map dco_decode_Map_String_message_edit_range( + dynamic raw, + ); + + @protected + Map + dco_decode_Map_String_opt_box_autoadd_cloud_attachment(dynamic raw); + + @protected + Map dco_decode_Map_String_opt_box_autoadd_cloud_chat( + dynamic raw, + ); + + @protected + Map + dco_decode_Map_String_opt_box_autoadd_cloud_message(dynamic raw); + + @protected + Map + dco_decode_Map_String_password_manager_meta_data_ctx(dynamic raw); + + @protected + Map + dco_decode_Map_String_record_opt_string_passkey(dynamic raw); + + @protected + Map + dco_decode_Map_String_record_opt_string_password_manager_meta(dynamic raw); + + @protected + Map + dco_decode_Map_String_record_opt_string_password_raw_entry(dynamic raw); + + @protected + Map + dco_decode_Map_String_record_opt_string_wifi_password(dynamic raw); + + @protected + Map + dco_decode_Map_String_share_invite_content_data(dynamic raw); + + @protected + Map + dco_decode_Map_String_status_kit_personal_config(dynamic raw); + + @protected + Map dco_decode_Map_String_sync_status(dynamic raw); + + @protected + ApsConnection + dco_decode_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerAPSConnection( + dynamic raw, + ); + + @protected + ApsState + dco_decode_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerAPSState( + dynamic raw, + ); + + @protected + ApsWatcher + dco_decode_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerAPSWatcher( + dynamic raw, + ); + + @protected + ArcAnisetteClientDefaultAnisetteProvider + dco_decode_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcAnisetteClientDefaultAnisetteProvider( + dynamic raw, + ); + + @protected + ArcCloudKitClientDefaultAnisetteProvider + dco_decode_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcCloudKitClientDefaultAnisetteProvider( + dynamic raw, + ); + + @protected + ArcCloudMessagesClientDefaultAnisetteProvider + dco_decode_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcCloudMessagesClientDefaultAnisetteProvider( + dynamic raw, + ); + + @protected + ArcFtClient + dco_decode_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcFTClient( + dynamic raw, + ); + + @protected + ArcFindMyClientDefaultAnisetteProvider + dco_decode_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcFindMyClientDefaultAnisetteProvider( + dynamic raw, + ); + + @protected + ArcImClient + dco_decode_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcIMClient( + dynamic raw, + ); + + @protected + ArcIdmsAuthListener + dco_decode_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcIdmsAuthListener( + dynamic raw, + ); + + @protected + ArcKeychainClientDefaultAnisetteProvider + dco_decode_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcKeychainClientDefaultAnisetteProvider( + dynamic raw, + ); + + @protected + ArcMutexAppleAccountDefaultAnisetteProvider + dco_decode_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcMutexAppleAccountDefaultAnisetteProvider( + dynamic raw, + ); + + @protected + ArcMutexOptionCircleClientSessionDefaultAnisetteProvider + dco_decode_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcMutexOptionCircleClientSessionDefaultAnisetteProvider( + dynamic raw, + ); + + @protected + ArcMutexVecActiveCircleSession + dco_decode_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcMutexVecActiveCircleSession( + dynamic raw, + ); + + @protected + ArcPasswordManagerDefaultAnisetteProvider + dco_decode_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcPasswordManagerDefaultAnisetteProvider( + dynamic raw, + ); + + @protected + ArcProfilesClientDefaultAnisetteProvider + dco_decode_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcProfilesClientDefaultAnisetteProvider( + dynamic raw, + ); + + @protected + ArcSenderPushMessage + dco_decode_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcSenderPushMessage( + dynamic raw, + ); + + @protected + ArcSharedPushState + dco_decode_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcSharedPushState( + dynamic raw, + ); + + @protected + ArcStatusKitClientDefaultAnisetteProvider + dco_decode_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcStatusKitClientDefaultAnisetteProvider( + dynamic raw, + ); + + @protected + ArcTokenProviderDefaultAnisetteProvider + dco_decode_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcTokenProviderDefaultAnisetteProvider( + dynamic raw, + ); + + @protected + Asset + dco_decode_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerAsset( + dynamic raw, + ); + + @protected + ChannelInterestToken + dco_decode_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerChannelInterestToken( + dynamic raw, + ); + + @protected + CircleClientSessionDefaultAnisetteProvider + dco_decode_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerCircleClientSessionDefaultAnisetteProvider( + dynamic raw, + ); + + @protected + CloudSyncPreparedMessageCreateHandle + dco_decode_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerCloudSyncPreparedMessageCreateHandle( + dynamic raw, + ); + + @protected + ConversationLink + dco_decode_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerConversationLink( + dynamic raw, + ); + + @protected + ConversationParticipant + dco_decode_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerConversationParticipant( + dynamic raw, + ); + + @protected + Date + dco_decode_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerDate( + dynamic raw, + ); + + @protected + EscrowData + dco_decode_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerEscrowData( + dynamic raw, + ); + + @protected + FindMyFriendsClientDefaultAnisetteProvider + dco_decode_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerFindMyFriendsClientDefaultAnisetteProvider( + dynamic raw, + ); + + @protected + FindMyPhoneClientDefaultAnisetteProvider + dco_decode_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerFindMyPhoneClientDefaultAnisetteProvider( + dynamic raw, + ); + + @protected + GZipWrapperAttachmentMeta + dco_decode_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerGZipWrapperAttachmentMeta( + dynamic raw, + ); + + @protected + GZipWrapperChatProto + dco_decode_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerGZipWrapperChatProto( + dynamic raw, + ); + + @protected + GZipWrapperMessageProto + dco_decode_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerGZipWrapperMessageProto( + dynamic raw, + ); + + @protected + GZipWrapperMessageProto2 + dco_decode_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerGZipWrapperMessageProto2( + dynamic raw, + ); + + @protected + GZipWrapperMessageProto3 + dco_decode_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerGZipWrapperMessageProto3( + dynamic raw, + ); + + @protected + GZipWrapperMessageProto4 + dco_decode_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerGZipWrapperMessageProto4( + dynamic raw, + ); + + @protected + IdsngmIdentity + dco_decode_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerIDSNGMIdentity( + dynamic raw, + ); + + @protected + IdsUser + dco_decode_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerIDSUser( + dynamic raw, + ); + + @protected + JoinedOsConfig + dco_decode_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerJoinedOSConfig( + dynamic raw, + ); + + @protected + LocationReport + dco_decode_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerLocationReport( + dynamic raw, + ); + + @protected + MessageFlags + dco_decode_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerMessageFlags( + dynamic raw, + ); + + @protected + NsArrayLpIconMetadata + dco_decode_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerNSArrayLPIconMetadata( + dynamic raw, + ); + + @protected + NsArrayLpImageMetadata + dco_decode_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerNSArrayLPImageMetadata( + dynamic raw, + ); + + @protected + PushError + dco_decode_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerPushError( + dynamic raw, + ); + + @protected + ReceiverApsMessage + dco_decode_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerReceiverAPSMessage( + dynamic raw, + ); + + @protected + SavedHardwareState + dco_decode_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerSavedHardwareState( + dynamic raw, + ); + + @protected + Sender + dco_decode_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerSender( + dynamic raw, + ); + + @protected + StCollapsedValue + dco_decode_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerStCollapsedValue( + dynamic raw, + ); + + @protected + SyncManagerDefaultAnisetteProviderMyFilePackager + dco_decode_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerSyncManagerDefaultAnisetteProviderMyFilePackager( + dynamic raw, + ); + + @protected + SystemTime + dco_decode_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerSystemTime( + dynamic raw, + ); + + @protected + VerifyBody + dco_decode_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerVerifyBody( + dynamic raw, + ); + + @protected + ViableBottle + dco_decode_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerViableBottle( + dynamic raw, + ); + + @protected + Set dco_decode_Set_ft_member(dynamic raw); + + @protected + RustStreamSink + dco_decode_StreamSink_mmcs_transfer_progress_Sse(dynamic raw); + + @protected + RustStreamSink dco_decode_StreamSink_transfer_progress_Sse( + dynamic raw, + ); + + @protected + String dco_decode_String(dynamic raw); + + @protected + Address dco_decode_address(dynamic raw); + + @protected + AkData dco_decode_ak_data(dynamic raw); + + @protected + ApsAlert dco_decode_aps_alert(dynamic raw); + + @protected + ApsConnectionStatus dco_decode_aps_connection_status(dynamic raw); + + @protected + ApsData dco_decode_aps_data(dynamic raw); + + @protected + Attachment dco_decode_attachment(dynamic raw); + + @protected + AttachmentMeta dco_decode_attachment_meta(dynamic raw); + + @protected + AttachmentMetaExtra dco_decode_attachment_meta_extra(dynamic raw); + + @protected + AttachmentType dco_decode_attachment_type(dynamic raw); + + @protected + Balloon dco_decode_balloon(dynamic raw); + + @protected + BalloonLayout dco_decode_balloon_layout(dynamic raw); + + @protected + BeaconAttributes dco_decode_beacon_attributes(dynamic raw); + + @protected + BeaconNamingRecord dco_decode_beacon_naming_record(dynamic raw); + + @protected + bool dco_decode_bool(dynamic raw); + + @protected + ApsState + dco_decode_box_autoadd_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerAPSState( + dynamic raw, + ); + + @protected + ArcCloudKitClientDefaultAnisetteProvider + dco_decode_box_autoadd_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcCloudKitClientDefaultAnisetteProvider( + dynamic raw, + ); + + @protected + ArcCloudMessagesClientDefaultAnisetteProvider + dco_decode_box_autoadd_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcCloudMessagesClientDefaultAnisetteProvider( + dynamic raw, + ); + + @protected + ArcFindMyClientDefaultAnisetteProvider + dco_decode_box_autoadd_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcFindMyClientDefaultAnisetteProvider( + dynamic raw, + ); + + @protected + ArcKeychainClientDefaultAnisetteProvider + dco_decode_box_autoadd_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcKeychainClientDefaultAnisetteProvider( + dynamic raw, + ); + + @protected + ArcMutexAppleAccountDefaultAnisetteProvider + dco_decode_box_autoadd_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcMutexAppleAccountDefaultAnisetteProvider( + dynamic raw, + ); + + @protected + ArcPasswordManagerDefaultAnisetteProvider + dco_decode_box_autoadd_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcPasswordManagerDefaultAnisetteProvider( + dynamic raw, + ); + + @protected + Asset + dco_decode_box_autoadd_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerAsset( + dynamic raw, + ); + + @protected + ChannelInterestToken + dco_decode_box_autoadd_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerChannelInterestToken( + dynamic raw, + ); + + @protected + CircleClientSessionDefaultAnisetteProvider + dco_decode_box_autoadd_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerCircleClientSessionDefaultAnisetteProvider( + dynamic raw, + ); + + @protected + CloudSyncPreparedMessageCreateHandle + dco_decode_box_autoadd_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerCloudSyncPreparedMessageCreateHandle( + dynamic raw, + ); + + @protected + ConversationLink + dco_decode_box_autoadd_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerConversationLink( + dynamic raw, + ); + + @protected + ConversationParticipant + dco_decode_box_autoadd_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerConversationParticipant( + dynamic raw, + ); + + @protected + Date + dco_decode_box_autoadd_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerDate( + dynamic raw, + ); + + @protected + GZipWrapperChatProto + dco_decode_box_autoadd_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerGZipWrapperChatProto( + dynamic raw, + ); + + @protected + GZipWrapperMessageProto2 + dco_decode_box_autoadd_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerGZipWrapperMessageProto2( + dynamic raw, + ); + + @protected + GZipWrapperMessageProto3 + dco_decode_box_autoadd_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerGZipWrapperMessageProto3( + dynamic raw, + ); + + @protected + GZipWrapperMessageProto4 + dco_decode_box_autoadd_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerGZipWrapperMessageProto4( + dynamic raw, + ); + + @protected + IdsUser + dco_decode_box_autoadd_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerIDSUser( + dynamic raw, + ); + + @protected + LocationReport + dco_decode_box_autoadd_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerLocationReport( + dynamic raw, + ); + + @protected + NsArrayLpIconMetadata + dco_decode_box_autoadd_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerNSArrayLPIconMetadata( + dynamic raw, + ); + + @protected + NsArrayLpImageMetadata + dco_decode_box_autoadd_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerNSArrayLPImageMetadata( + dynamic raw, + ); + + @protected + PushError + dco_decode_box_autoadd_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerPushError( + dynamic raw, + ); + + @protected + SavedHardwareState + dco_decode_box_autoadd_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerSavedHardwareState( + dynamic raw, + ); + + @protected + SyncManagerDefaultAnisetteProviderMyFilePackager + dco_decode_box_autoadd_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerSyncManagerDefaultAnisetteProviderMyFilePackager( + dynamic raw, + ); + + @protected + SystemTime + dco_decode_box_autoadd_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerSystemTime( + dynamic raw, + ); + + @protected + Address dco_decode_box_autoadd_address(dynamic raw); + + @protected + Attachment dco_decode_box_autoadd_attachment(dynamic raw); + + @protected + AttachmentMeta dco_decode_box_autoadd_attachment_meta(dynamic raw); + + @protected + AttachmentMetaExtra dco_decode_box_autoadd_attachment_meta_extra(dynamic raw); + + @protected + Balloon dco_decode_box_autoadd_balloon(dynamic raw); + + @protected + BalloonLayout dco_decode_box_autoadd_balloon_layout(dynamic raw); + + @protected + BeaconAttributes dco_decode_box_autoadd_beacon_attributes(dynamic raw); + + @protected + BeaconNamingRecord dco_decode_box_autoadd_beacon_naming_record(dynamic raw); + + @protected + bool dco_decode_box_autoadd_bool(dynamic raw); + + @protected + CertifiedContext dco_decode_box_autoadd_certified_context(dynamic raw); + + @protected + ChangeParticipantMessage dco_decode_box_autoadd_change_participant_message( + dynamic raw, + ); + + @protected + ChatProto dco_decode_box_autoadd_chat_proto(dynamic raw); + + @protected + CloudAttachment dco_decode_box_autoadd_cloud_attachment(dynamic raw); + + @protected + CloudChat dco_decode_box_autoadd_cloud_chat(dynamic raw); + + @protected + CloudMessage dco_decode_box_autoadd_cloud_message(dynamic raw); + + @protected + CloudProp dco_decode_box_autoadd_cloud_prop(dynamic raw); + + @protected + CloudSyncOutboundFailureClass + dco_decode_box_autoadd_cloud_sync_outbound_failure_class(dynamic raw); + + @protected + CloudSyncOutboundReconcileDisposition + dco_decode_box_autoadd_cloud_sync_outbound_reconcile_disposition(dynamic raw); + + @protected + CloudSyncOutboundSafeCode + dco_decode_box_autoadd_cloud_sync_outbound_safe_code(dynamic raw); + + @protected + CloudSyncPreparedMessageCreateInput + dco_decode_box_autoadd_cloud_sync_prepared_message_create_input(dynamic raw); + + @protected + CloudSyncProtectedFailure dco_decode_box_autoadd_cloud_sync_protected_failure( + dynamic raw, + ); + + @protected + CloudSyncProtectedGarbageCollection + dco_decode_box_autoadd_cloud_sync_protected_garbage_collection(dynamic raw); + + @protected + CloudSyncProtectedOutboundStage + dco_decode_box_autoadd_cloud_sync_protected_outbound_stage(dynamic raw); + + @protected + CloudSyncProtectedPage dco_decode_box_autoadd_cloud_sync_protected_page( + dynamic raw, + ); + + @protected + CloudSyncProtectedPreflightCode + dco_decode_box_autoadd_cloud_sync_protected_preflight_code(dynamic raw); + + @protected + CloudSyncProtectedRecovery + dco_decode_box_autoadd_cloud_sync_protected_recovery(dynamic raw); + + @protected + CloudSyncRawFailure dco_decode_box_autoadd_cloud_sync_raw_failure( + dynamic raw, + ); + + @protected + CloudSyncRawPage dco_decode_box_autoadd_cloud_sync_raw_page(dynamic raw); + + @protected + CloudSyncRawSystemFields dco_decode_box_autoadd_cloud_sync_raw_system_fields( + dynamic raw, + ); + + @protected + CloudSyncTransientAttachmentPayload + dco_decode_box_autoadd_cloud_sync_transient_attachment_payload(dynamic raw); + + @protected + CloudSyncTransientChatPayload + dco_decode_box_autoadd_cloud_sync_transient_chat_payload(dynamic raw); + + @protected + CloudSyncTransientDeferredReason + dco_decode_box_autoadd_cloud_sync_transient_deferred_reason(dynamic raw); + + @protected + CloudSyncTransientEntityKind + dco_decode_box_autoadd_cloud_sync_transient_entity_kind(dynamic raw); + + @protected + CloudSyncTransientFailureCode + dco_decode_box_autoadd_cloud_sync_transient_failure_code(dynamic raw); + + @protected + CloudSyncTransientGroupPhotoPayload + dco_decode_box_autoadd_cloud_sync_transient_group_photo_payload(dynamic raw); + + @protected + CloudSyncTransientMessagePayload + dco_decode_box_autoadd_cloud_sync_transient_message_payload(dynamic raw); + + @protected + CloudSyncTransientMutationKind + dco_decode_box_autoadd_cloud_sync_transient_mutation_kind(dynamic raw); + + @protected + CloudSyncTransientPayload dco_decode_box_autoadd_cloud_sync_transient_payload( + dynamic raw, + ); + + @protected + CloudSyncTransientQuarantineReason + dco_decode_box_autoadd_cloud_sync_transient_quarantine_reason(dynamic raw); + + @protected + CloudSyncTransientReactionKind + dco_decode_box_autoadd_cloud_sync_transient_reaction_kind(dynamic raw); + + @protected + CloudSyncTransientSnapshot + dco_decode_box_autoadd_cloud_sync_transient_snapshot(dynamic raw); + + @protected + CloudSyncTransientTombstone + dco_decode_box_autoadd_cloud_sync_transient_tombstone(dynamic raw); + + @protected + ConversationData dco_decode_box_autoadd_conversation_data(dynamic raw); + + @protected + DartBeaconShareInfo dco_decode_box_autoadd_dart_beacon_share_info( + dynamic raw, + ); + + @protected + EditMessage dco_decode_box_autoadd_edit_message(dynamic raw); + + @protected + ErrorMessage dco_decode_box_autoadd_error_message(dynamic raw); + + @protected + ExtensionApp dco_decode_box_autoadd_extension_app(dynamic raw); + + @protected + double dco_decode_box_autoadd_f_64(dynamic raw); + + @protected + FTMessage dco_decode_box_autoadd_ft_message(dynamic raw); + + @protected + FTMode dco_decode_box_autoadd_ft_mode(dynamic raw); + + @protected + HwExtra dco_decode_box_autoadd_hw_extra(dynamic raw); + + @protected + int dco_decode_box_autoadd_i_32(dynamic raw); + + @protected + PlatformInt64 dco_decode_box_autoadd_i_64(dynamic raw); + + @protected + IMessageNicknameRecord dco_decode_box_autoadd_i_message_nickname_record( + dynamic raw, + ); + + @protected + IMessagePosterRecord dco_decode_box_autoadd_i_message_poster_record( + dynamic raw, + ); + + @protected + IconChangeMessage dco_decode_box_autoadd_icon_change_message(dynamic raw); + + @protected + IdmsCircleMessage dco_decode_box_autoadd_idms_circle_message(dynamic raw); + + @protected + IdmsMessage dco_decode_box_autoadd_idms_message(dynamic raw); + + @protected + IdmsRequestedSignIn dco_decode_box_autoadd_idms_requested_sign_in( + dynamic raw, + ); + + @protected + LetMeInRequest dco_decode_box_autoadd_let_me_in_request(dynamic raw); + + @protected + LinkMeta dco_decode_box_autoadd_link_meta(dynamic raw); + + @protected + Location dco_decode_box_autoadd_location(dynamic raw); + + @protected + LoginState dco_decode_box_autoadd_login_state(dynamic raw); + + @protected + LPIconMetadata dco_decode_box_autoadd_lp_icon_metadata(dynamic raw); + + @protected + LPImageMetadata dco_decode_box_autoadd_lp_image_metadata(dynamic raw); + + @protected + LPSpecializationMetadata dco_decode_box_autoadd_lp_specialization_metadata( + dynamic raw, + ); + + @protected + MemojiData dco_decode_box_autoadd_memoji_data(dynamic raw); + + @protected + Message dco_decode_box_autoadd_message(dynamic raw); + + @protected + MessageInst dco_decode_box_autoadd_message_inst(dynamic raw); + + @protected + MessageParts dco_decode_box_autoadd_message_parts(dynamic raw); + + @protected + MessageProto dco_decode_box_autoadd_message_proto(dynamic raw); + + @protected + MessageProto2 dco_decode_box_autoadd_message_proto_2(dynamic raw); + + @protected + MessageProto3 dco_decode_box_autoadd_message_proto_3(dynamic raw); + + @protected + MessageProto4 dco_decode_box_autoadd_message_proto_4(dynamic raw); + + @protected + MessageSummaryInfo dco_decode_box_autoadd_message_summary_info(dynamic raw); + + @protected + MMCSAttachmentMeta dco_decode_box_autoadd_mmcs_attachment_meta(dynamic raw); + + @protected + MMCSFile dco_decode_box_autoadd_mmcs_file(dynamic raw); + + @protected + MonogramData dco_decode_box_autoadd_monogram_data(dynamic raw); + + @protected + MoveToRecycleBinMessage dco_decode_box_autoadd_move_to_recycle_bin_message( + dynamic raw, + ); + + @protected + NormalMessage dco_decode_box_autoadd_normal_message(dynamic raw); + + @protected + NSAttributedString dco_decode_box_autoadd_ns_attributed_string(dynamic raw); + + @protected + NSNumber dco_decode_box_autoadd_ns_number(dynamic raw); + + @protected + NSString dco_decode_box_autoadd_ns_string(dynamic raw); + + @protected + NSURL dco_decode_box_autoadd_nsurl(dynamic raw); + + @protected + NumOrString dco_decode_box_autoadd_num_or_string(dynamic raw); + + @protected + OperatedChat dco_decode_box_autoadd_operated_chat(dynamic raw); + + @protected + PartExtension dco_decode_box_autoadd_part_extension(dynamic raw); + + @protected + Passkey dco_decode_box_autoadd_passkey(dynamic raw); + + @protected + PasswordManagerMeta dco_decode_box_autoadd_password_manager_meta(dynamic raw); + + @protected + PasswordManagerMetaData dco_decode_box_autoadd_password_manager_meta_data( + dynamic raw, + ); + + @protected + PasswordManagerMetaDataFormerlyShared + dco_decode_box_autoadd_password_manager_meta_data_formerly_shared( + dynamic raw, + ); + + @protected + PasswordManagerTotp dco_decode_box_autoadd_password_manager_totp(dynamic raw); + + @protected + PasswordRawEntry dco_decode_box_autoadd_password_raw_entry(dynamic raw); + + @protected + PermanentDeleteMessage dco_decode_box_autoadd_permanent_delete_message( + dynamic raw, + ); + + @protected + PosterColor dco_decode_box_autoadd_poster_color(dynamic raw); + + @protected + PRPosterContentMaterialStyle + dco_decode_box_autoadd_pr_poster_content_material_style(dynamic raw); + + @protected + PushMessage dco_decode_box_autoadd_push_message(dynamic raw); + + @protected + ReactMessage dco_decode_box_autoadd_react_message(dynamic raw); + + @protected + Reaction dco_decode_box_autoadd_reaction(dynamic raw); + + @protected + (SharedPushState, ApsWatcher) + dco_decode_box_autoadd_record_shared_push_state_auto_owned_rust_opaque_flutter_rust_bridgefor_generated_rust_auto_opaque_inner_aps_watcher( + dynamic raw, + ); + + @protected + (String, String) dco_decode_box_autoadd_record_string_string(dynamic raw); + + @protected + (String, BigInt) dco_decode_box_autoadd_record_string_u_64(dynamic raw); + + @protected + RegisterState dco_decode_box_autoadd_register_state(dynamic raw); + + @protected + RenameMessage dco_decode_box_autoadd_rename_message(dynamic raw); + + @protected + RichLinkImageAttachmentSubstitute + dco_decode_box_autoadd_rich_link_image_attachment_substitute(dynamic raw); + + @protected + ScheduleMode dco_decode_box_autoadd_schedule_mode(dynamic raw); + + @protected + SetTranscriptBackgroundMessage + dco_decode_box_autoadd_set_transcript_background_message(dynamic raw); + + @protected + ShareProfileMessage dco_decode_box_autoadd_share_profile_message(dynamic raw); + + @protected + SharedAlbum dco_decode_box_autoadd_shared_album(dynamic raw); + + @protected + SharedICloudServices dco_decode_box_autoadd_shared_i_cloud_services( + dynamic raw, + ); + + @protected + SharedPoster dco_decode_box_autoadd_shared_poster(dynamic raw); + + @protected + SharedPushState dco_decode_box_autoadd_shared_push_state(dynamic raw); + + @protected + SimplifiedIncomingCallPoster + dco_decode_box_autoadd_simplified_incoming_call_poster(dynamic raw); + + @protected + SimplifiedTranscriptPoster + dco_decode_box_autoadd_simplified_transcript_poster(dynamic raw); + + @protected + StatusKitMessage dco_decode_box_autoadd_status_kit_message(dynamic raw); + + @protected + SupportAction dco_decode_box_autoadd_support_action(dynamic raw); + + @protected + SupportAlert dco_decode_box_autoadd_support_alert(dynamic raw); + + @protected + TeardownSignIn dco_decode_box_autoadd_teardown_sign_in(dynamic raw); + + @protected + TextFlags dco_decode_box_autoadd_text_flags(dynamic raw); + + @protected + TextFormat dco_decode_box_autoadd_text_format(dynamic raw); + + @protected + TranscriptDynamicUserData dco_decode_box_autoadd_transcript_dynamic_user_data( + dynamic raw, + ); + + @protected + TypingApp dco_decode_box_autoadd_typing_app(dynamic raw); + + @protected + int dco_decode_box_autoadd_u_16(dynamic raw); + + @protected + int dco_decode_box_autoadd_u_32(dynamic raw); + + @protected + BigInt dco_decode_box_autoadd_u_64(dynamic raw); + + @protected + UnsendMessage dco_decode_box_autoadd_unsend_message(dynamic raw); + + @protected + UpdateAccountFinish dco_decode_box_autoadd_update_account_finish(dynamic raw); + + @protected + UpdateExtensionMessage dco_decode_box_autoadd_update_extension_message( + dynamic raw, + ); + + @protected + UpdateProfileMessage dco_decode_box_autoadd_update_profile_message( + dynamic raw, + ); + + @protected + UpdateProfileSharingMessage + dco_decode_box_autoadd_update_profile_sharing_message(dynamic raw); + + @protected + WifiPassword dco_decode_box_autoadd_wifi_password(dynamic raw); + + @protected + CertifiedContext dco_decode_certified_context(dynamic raw); + + @protected + ChangeParticipantMessage dco_decode_change_participant_message(dynamic raw); + + @protected + ChatProto dco_decode_chat_proto(dynamic raw); + + @protected + CloudAttachment dco_decode_cloud_attachment(dynamic raw); + + @protected + CloudChat dco_decode_cloud_chat(dynamic raw); + + @protected + CloudMessage dco_decode_cloud_message(dynamic raw); + + @protected + CloudMessageSummary dco_decode_cloud_message_summary(dynamic raw); + + @protected + CloudParticipant dco_decode_cloud_participant(dynamic raw); + + @protected + CloudProp dco_decode_cloud_prop(dynamic raw); + + @protected + CloudProp001 dco_decode_cloud_prop_001(dynamic raw); + + @protected + CloudSyncNativeAuthMetadata dco_decode_cloud_sync_native_auth_metadata( + dynamic raw, + ); + + @protected + CloudSyncOutboundConsumeResult dco_decode_cloud_sync_outbound_consume_result( + dynamic raw, + ); + + @protected + CloudSyncOutboundFailureClass dco_decode_cloud_sync_outbound_failure_class( + dynamic raw, + ); + + @protected + CloudSyncOutboundReconcileDisposition + dco_decode_cloud_sync_outbound_reconcile_disposition(dynamic raw); + + @protected + CloudSyncOutboundReconcileResult + dco_decode_cloud_sync_outbound_reconcile_result(dynamic raw); + + @protected + CloudSyncOutboundSafeCode dco_decode_cloud_sync_outbound_safe_code( + dynamic raw, + ); + + @protected + CloudSyncOutboundSaveDisposition + dco_decode_cloud_sync_outbound_save_disposition(dynamic raw); + + @protected + CloudSyncOutboundSaveOutcome dco_decode_cloud_sync_outbound_save_outcome( + dynamic raw, + ); + + @protected + CloudSyncPreparedMessageCreateInput + dco_decode_cloud_sync_prepared_message_create_input(dynamic raw); + + @protected + CloudSyncPreparedMessageCreateResult + dco_decode_cloud_sync_prepared_message_create_result(dynamic raw); + + @protected + CloudSyncProtectedChange dco_decode_cloud_sync_protected_change(dynamic raw); + + @protected + CloudSyncProtectedChangeKind dco_decode_cloud_sync_protected_change_kind( + dynamic raw, + ); + + @protected + CloudSyncProtectedFailure dco_decode_cloud_sync_protected_failure( + dynamic raw, + ); + + @protected + CloudSyncProtectedFailureCategory + dco_decode_cloud_sync_protected_failure_category(dynamic raw); + + @protected + CloudSyncProtectedFetchResult dco_decode_cloud_sync_protected_fetch_result( + dynamic raw, + ); + + @protected + CloudSyncProtectedGarbageCollection + dco_decode_cloud_sync_protected_garbage_collection(dynamic raw); + + @protected + CloudSyncProtectedGarbageCollectionResult + dco_decode_cloud_sync_protected_garbage_collection_result(dynamic raw); + + @protected + CloudSyncProtectedLeaseResult dco_decode_cloud_sync_protected_lease_result( + dynamic raw, + ); + + @protected + CloudSyncProtectedOutboundStage + dco_decode_cloud_sync_protected_outbound_stage(dynamic raw); + + @protected + CloudSyncProtectedOutboundStageResult + dco_decode_cloud_sync_protected_outbound_stage_result(dynamic raw); + + @protected + CloudSyncProtectedPage dco_decode_cloud_sync_protected_page(dynamic raw); + + @protected + CloudSyncProtectedPreflightCode + dco_decode_cloud_sync_protected_preflight_code(dynamic raw); + + @protected + CloudSyncProtectedRecovery dco_decode_cloud_sync_protected_recovery( + dynamic raw, + ); + + @protected + CloudSyncProtectedRecoveryResult + dco_decode_cloud_sync_protected_recovery_result(dynamic raw); + + @protected + CloudSyncProtectedRetirementResult + dco_decode_cloud_sync_protected_retirement_result(dynamic raw); + + @protected + CloudSyncProtectedSafeCode dco_decode_cloud_sync_protected_safe_code( + dynamic raw, + ); + + @protected + CloudSyncRawChange dco_decode_cloud_sync_raw_change(dynamic raw); + + @protected + CloudSyncRawFailure dco_decode_cloud_sync_raw_failure(dynamic raw); + + @protected + CloudSyncRawFailureCategory dco_decode_cloud_sync_raw_failure_category( + dynamic raw, + ); + + @protected + CloudSyncRawFetchResult dco_decode_cloud_sync_raw_fetch_result(dynamic raw); + + @protected + CloudSyncRawPage dco_decode_cloud_sync_raw_page(dynamic raw); + + @protected + CloudSyncRawRecordKind dco_decode_cloud_sync_raw_record_kind(dynamic raw); + + @protected + CloudSyncRawSystemFields dco_decode_cloud_sync_raw_system_fields(dynamic raw); + + @protected + CloudSyncTransientAssociationKind + dco_decode_cloud_sync_transient_association_kind(dynamic raw); + + @protected + CloudSyncTransientAttachmentPayload + dco_decode_cloud_sync_transient_attachment_payload(dynamic raw); + + @protected + CloudSyncTransientAttributedBody + dco_decode_cloud_sync_transient_attributed_body(dynamic raw); + + @protected + CloudSyncTransientChatPayload dco_decode_cloud_sync_transient_chat_payload( + dynamic raw, + ); + + @protected + CloudSyncTransientChatStyle dco_decode_cloud_sync_transient_chat_style( + dynamic raw, + ); + + @protected + CloudSyncTransientDecodeResult dco_decode_cloud_sync_transient_decode_result( + dynamic raw, + ); + + @protected + CloudSyncTransientDeferredReason + dco_decode_cloud_sync_transient_deferred_reason(dynamic raw); + + @protected + CloudSyncTransientEditPart dco_decode_cloud_sync_transient_edit_part( + dynamic raw, + ); + + @protected + CloudSyncTransientEntityKind dco_decode_cloud_sync_transient_entity_kind( + dynamic raw, + ); + + @protected + CloudSyncTransientFailureCode dco_decode_cloud_sync_transient_failure_code( + dynamic raw, + ); + + @protected + CloudSyncTransientFieldState dco_decode_cloud_sync_transient_field_state( + dynamic raw, + ); + + @protected + CloudSyncTransientGroupPhotoPayload + dco_decode_cloud_sync_transient_group_photo_payload(dynamic raw); + + @protected + CloudSyncTransientKnownMessageFlags + dco_decode_cloud_sync_transient_known_message_flags(dynamic raw); + + @protected + CloudSyncTransientMessageEdit dco_decode_cloud_sync_transient_message_edit( + dynamic raw, + ); + + @protected + CloudSyncTransientMessagePayload + dco_decode_cloud_sync_transient_message_payload(dynamic raw); + + @protected + CloudSyncTransientMutationKind dco_decode_cloud_sync_transient_mutation_kind( + dynamic raw, + ); + + @protected + CloudSyncTransientPayload dco_decode_cloud_sync_transient_payload( + dynamic raw, + ); + + @protected + CloudSyncTransientQuarantineReason + dco_decode_cloud_sync_transient_quarantine_reason(dynamic raw); + + @protected + CloudSyncTransientReactionKind dco_decode_cloud_sync_transient_reaction_kind( + dynamic raw, + ); + + @protected + CloudSyncTransientService dco_decode_cloud_sync_transient_service( + dynamic raw, + ); + + @protected + CloudSyncTransientSnapshot dco_decode_cloud_sync_transient_snapshot( + dynamic raw, + ); + + @protected + CloudSyncTransientTextRun dco_decode_cloud_sync_transient_text_run( + dynamic raw, + ); + + @protected + CloudSyncTransientTombstone dco_decode_cloud_sync_transient_tombstone( + dynamic raw, + ); + + @protected + ConversationData dco_decode_conversation_data(dynamic raw); + + @protected + DartBeacon dco_decode_dart_beacon(dynamic raw); + + @protected + DartBeaconShareInfo dco_decode_dart_beacon_share_info(dynamic raw); + + @protected + DeleteTarget dco_decode_delete_target(dynamic raw); + + @protected + DeviceInfo dco_decode_device_info(dynamic raw); + + @protected + EditMessage dco_decode_edit_message(dynamic raw); + + @protected + ErrorMessage dco_decode_error_message(dynamic raw); + + @protected + ExtensionApp dco_decode_extension_app(dynamic raw); + + @protected + double dco_decode_f_32(dynamic raw); + + @protected + double dco_decode_f_64(dynamic raw); + + @protected + FFIFilePackager dco_decode_ffi_file_packager(dynamic raw); + + @protected + Follow dco_decode_follow(dynamic raw); + + @protected + FoundDevice dco_decode_found_device(dynamic raw); + + @protected + FTMember dco_decode_ft_member(dynamic raw); + + @protected + FTMessage dco_decode_ft_message(dynamic raw); + + @protected + FTMode dco_decode_ft_mode(dynamic raw); + + @protected + FTParticipant dco_decode_ft_participant(dynamic raw); + + @protected + FTSession dco_decode_ft_session(dynamic raw); + + @protected + GroupSummary dco_decode_group_summary(dynamic raw); + + @protected + GroupSummaryMember dco_decode_group_summary_member(dynamic raw); + + @protected + HwExtra dco_decode_hw_extra(dynamic raw); + + @protected + int dco_decode_i_32(dynamic raw); + + @protected + PlatformInt64 dco_decode_i_64(dynamic raw); + + @protected + IMessageNameRecord dco_decode_i_message_name_record(dynamic raw); + + @protected + IMessageNicknameRecord dco_decode_i_message_nickname_record(dynamic raw); + + @protected + IMessagePosterRecord dco_decode_i_message_poster_record(dynamic raw); + + @protected + IconChangeMessage dco_decode_icon_change_message(dynamic raw); + + @protected + IdmsCircleMessage dco_decode_idms_circle_message(dynamic raw); + + @protected + IdmsMessage dco_decode_idms_message(dynamic raw); + + @protected + IdmsRequestedSignIn dco_decode_idms_requested_sign_in(dynamic raw); + + @protected + IndexedMessagePart dco_decode_indexed_message_part(dynamic raw); + + @protected + LetMeInRequest dco_decode_let_me_in_request(dynamic raw); + + @protected + LinkMeta dco_decode_link_meta(dynamic raw); + + @protected + List + dco_decode_list_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerIDSUser( + dynamic raw, + ); + + @protected + List + dco_decode_list_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerStCollapsedValue( + dynamic raw, + ); + + @protected + List + dco_decode_list_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerViableBottle( + dynamic raw, + ); + + @protected + List dco_decode_list_String(dynamic raw); + + @protected + List dco_decode_list_cloud_participant(dynamic raw); + + @protected + List + dco_decode_list_cloud_sync_outbound_save_outcome(dynamic raw); + + @protected + List + dco_decode_list_cloud_sync_prepared_message_create_input(dynamic raw); + + @protected + List dco_decode_list_cloud_sync_protected_change( + dynamic raw, + ); + + @protected + List dco_decode_list_cloud_sync_raw_change(dynamic raw); + + @protected + List + dco_decode_list_cloud_sync_transient_attributed_body(dynamic raw); + + @protected + List + dco_decode_list_cloud_sync_transient_edit_part(dynamic raw); + + @protected + List + dco_decode_list_cloud_sync_transient_message_edit(dynamic raw); + + @protected + List dco_decode_list_cloud_sync_transient_text_run( + dynamic raw, + ); + + @protected + List dco_decode_list_dart_beacon(dynamic raw); + + @protected + List dco_decode_list_follow(dynamic raw); + + @protected + List dco_decode_list_found_device(dynamic raw); + + @protected + List dco_decode_list_ft_member(dynamic raw); + + @protected + List dco_decode_list_ft_session(dynamic raw); + + @protected + List dco_decode_list_group_summary_member(dynamic raw); + + @protected + List dco_decode_list_indexed_message_part(dynamic raw); + + @protected + List dco_decode_list_list_prim_u_8_strict(dynamic raw); + + @protected + List dco_decode_list_message_edit(dynamic raw); + + @protected + List dco_decode_list_message_target(dynamic raw); + + @protected + List dco_decode_list_password_manager_alt_domain( + dynamic raw, + ); + + @protected + List dco_decode_list_password_manager_meta_change( + dynamic raw, + ); + + @protected + List dco_decode_list_photo_poster_layer(dynamic raw); + + @protected + List dco_decode_list_poster_asset(dynamic raw); + + @protected + List dco_decode_list_poster_color(dynamic raw); + + @protected + Float64List dco_decode_list_prim_f_64_strict(dynamic raw); + + @protected + Int64List dco_decode_list_prim_i_64_strict(dynamic raw); + + @protected + Uint32List dco_decode_list_prim_u_32_strict(dynamic raw); + + @protected + List dco_decode_list_prim_u_8_loose(dynamic raw); + + @protected + Uint8List dco_decode_list_prim_u_8_strict(dynamic raw); + + @protected + List dco_decode_list_private_device_info(dynamic raw); + + @protected + List<(String, Asset)> + dco_decode_list_record_string_auto_owned_rust_opaque_flutter_rust_bridgefor_generated_rust_auto_opaque_inner_asset( + dynamic raw, + ); + + @protected + List<(String, StCollapsedValue)> + dco_decode_list_record_string_auto_owned_rust_opaque_flutter_rust_bridgefor_generated_rust_auto_opaque_inner_st_collapsed_value( + dynamic raw, + ); + + @protected + List<(String, bool)> dco_decode_list_record_string_bool(dynamic raw); + + @protected + List<(String, int)> dco_decode_list_record_string_casted_primitive_u_64( + dynamic raw, + ); + + @protected + List<(String, CloudAttachment)> + dco_decode_list_record_string_cloud_attachment(dynamic raw); + + @protected + List<(String, CloudChat)> dco_decode_list_record_string_cloud_chat( + dynamic raw, + ); + + @protected + List<(String, CloudMessage)> dco_decode_list_record_string_cloud_message( + dynamic raw, + ); + + @protected + List<(String, FTParticipant)> dco_decode_list_record_string_ft_participant( + dynamic raw, + ); + + @protected + List<(String, GroupSummary)> dco_decode_list_record_string_group_summary( + dynamic raw, + ); + + @protected + List<(String, List)> + dco_decode_list_record_string_list_message_edit(dynamic raw); + + @protected + List<(String, Uint8List)> dco_decode_list_record_string_list_prim_u_8_strict( + dynamic raw, + ); + + @protected + List<(String, MessageEditRange)> + dco_decode_list_record_string_message_edit_range(dynamic raw); + + @protected + List<(String, CloudAttachment?)> + dco_decode_list_record_string_opt_box_autoadd_cloud_attachment(dynamic raw); + + @protected + List<(String, CloudChat?)> + dco_decode_list_record_string_opt_box_autoadd_cloud_chat(dynamic raw); + + @protected + List<(String, CloudMessage?)> + dco_decode_list_record_string_opt_box_autoadd_cloud_message(dynamic raw); + + @protected + List<(String, PasswordManagerMetaDataCtx)> + dco_decode_list_record_string_password_manager_meta_data_ctx(dynamic raw); + + @protected + List<(String, (String?, Passkey))> + dco_decode_list_record_string_record_opt_string_passkey(dynamic raw); + + @protected + List<(String, (String?, PasswordManagerMeta))> + dco_decode_list_record_string_record_opt_string_password_manager_meta( + dynamic raw, + ); + + @protected + List<(String, (String?, PasswordRawEntry))> + dco_decode_list_record_string_record_opt_string_password_raw_entry( + dynamic raw, + ); + + @protected + List<(String, (String?, WifiPassword))> + dco_decode_list_record_string_record_opt_string_wifi_password(dynamic raw); + + @protected + List<(String, ShareInviteContentData)> + dco_decode_list_record_string_share_invite_content_data(dynamic raw); + + @protected + List<(String, StatusKitPersonalConfig)> + dco_decode_list_record_string_status_kit_personal_config(dynamic raw); + + @protected + List<(String, String)> dco_decode_list_record_string_string(dynamic raw); + + @protected + List<(String, SyncStatus)> dco_decode_list_record_string_sync_status( + dynamic raw, + ); + + @protected + List<(int, NSDictionaryTypedCoder)> + dco_decode_list_record_u_32_ns_dictionary_typed_coder(dynamic raw); + + @protected + List dco_decode_list_report_message(dynamic raw); + + @protected + List dco_decode_list_shared_album(dynamic raw); + + @protected + List dco_decode_list_trusted_phone_number(dynamic raw); + + @protected + List dco_decode_list_ui_color(dynamic raw); + + @protected + Location dco_decode_location(dynamic raw); + + @protected + LoginState dco_decode_login_state(dynamic raw); + + @protected + LPIconMetadata dco_decode_lp_icon_metadata(dynamic raw); + + @protected + LPImageMetadata dco_decode_lp_image_metadata(dynamic raw); + + @protected + LPLinkMetadata dco_decode_lp_link_metadata(dynamic raw); + + @protected + LPSpecializationMetadata dco_decode_lp_specialization_metadata(dynamic raw); + + @protected + MemojiData dco_decode_memoji_data(dynamic raw); + + @protected + Message dco_decode_message(dynamic raw); + + @protected + MessageEdit dco_decode_message_edit(dynamic raw); + + @protected + MessageEditRange dco_decode_message_edit_range(dynamic raw); + + @protected + MessageInst dco_decode_message_inst(dynamic raw); + + @protected + MessagePart dco_decode_message_part(dynamic raw); + + @protected + MessageParts dco_decode_message_parts(dynamic raw); + + @protected + MessageProto dco_decode_message_proto(dynamic raw); + + @protected + MessageProto2 dco_decode_message_proto_2(dynamic raw); + + @protected + MessageProto3 dco_decode_message_proto_3(dynamic raw); + + @protected + MessageProto4 dco_decode_message_proto_4(dynamic raw); + + @protected + MessageSummaryInfo dco_decode_message_summary_info(dynamic raw); + + @protected + MessageTarget dco_decode_message_target(dynamic raw); + + @protected + MessageType dco_decode_message_type(dynamic raw); + + @protected + MMCSAttachmentMeta dco_decode_mmcs_attachment_meta(dynamic raw); + + @protected + MMCSFile dco_decode_mmcs_file(dynamic raw); + + @protected + MMCSTransferProgress dco_decode_mmcs_transfer_progress(dynamic raw); + + @protected + MonogramData dco_decode_monogram_data(dynamic raw); + + @protected + MoveToRecycleBinMessage dco_decode_move_to_recycle_bin_message(dynamic raw); + + @protected + MyAsyncRuntime dco_decode_my_async_runtime(dynamic raw); + + @protected + NormalMessage dco_decode_normal_message(dynamic raw); + + @protected + NSAttributedString dco_decode_ns_attributed_string(dynamic raw); + + @protected + NSDictionaryClass dco_decode_ns_dictionary_class(dynamic raw); + + @protected + NSDictionaryTypedCoder dco_decode_ns_dictionary_typed_coder(dynamic raw); + + @protected + NSNumber dco_decode_ns_number(dynamic raw); + + @protected + NSString dco_decode_ns_string(dynamic raw); + + @protected + NSURL dco_decode_nsurl(dynamic raw); + + @protected + NumOrString dco_decode_num_or_string(dynamic raw); + + @protected + OperatedChat dco_decode_operated_chat(dynamic raw); + + @protected + int? dco_decode_opt_CastedPrimitive_i_64(dynamic raw); + + @protected + int? dco_decode_opt_CastedPrimitive_u_64(dynamic raw); + + @protected + int? dco_decode_opt_CastedPrimitive_usize(dynamic raw); + + @protected + String? dco_decode_opt_String(dynamic raw); + + @protected + ApsState? + dco_decode_opt_box_autoadd_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerAPSState( + dynamic raw, + ); + + @protected + ArcCloudKitClientDefaultAnisetteProvider? + dco_decode_opt_box_autoadd_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcCloudKitClientDefaultAnisetteProvider( + dynamic raw, + ); + + @protected + ArcCloudMessagesClientDefaultAnisetteProvider? + dco_decode_opt_box_autoadd_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcCloudMessagesClientDefaultAnisetteProvider( + dynamic raw, + ); + + @protected + ArcFindMyClientDefaultAnisetteProvider? + dco_decode_opt_box_autoadd_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcFindMyClientDefaultAnisetteProvider( + dynamic raw, + ); + + @protected + ArcKeychainClientDefaultAnisetteProvider? + dco_decode_opt_box_autoadd_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcKeychainClientDefaultAnisetteProvider( + dynamic raw, + ); + + @protected + ArcMutexAppleAccountDefaultAnisetteProvider? + dco_decode_opt_box_autoadd_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcMutexAppleAccountDefaultAnisetteProvider( + dynamic raw, + ); + + @protected + ArcPasswordManagerDefaultAnisetteProvider? + dco_decode_opt_box_autoadd_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcPasswordManagerDefaultAnisetteProvider( + dynamic raw, + ); + + @protected + Asset? + dco_decode_opt_box_autoadd_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerAsset( + dynamic raw, + ); + + @protected + ChannelInterestToken? + dco_decode_opt_box_autoadd_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerChannelInterestToken( + dynamic raw, + ); + + @protected + CircleClientSessionDefaultAnisetteProvider? + dco_decode_opt_box_autoadd_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerCircleClientSessionDefaultAnisetteProvider( + dynamic raw, + ); + + @protected + CloudSyncPreparedMessageCreateHandle? + dco_decode_opt_box_autoadd_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerCloudSyncPreparedMessageCreateHandle( + dynamic raw, + ); + + @protected + ConversationLink? + dco_decode_opt_box_autoadd_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerConversationLink( + dynamic raw, + ); + + @protected + ConversationParticipant? + dco_decode_opt_box_autoadd_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerConversationParticipant( + dynamic raw, + ); + + @protected + Date? + dco_decode_opt_box_autoadd_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerDate( + dynamic raw, + ); + + @protected + GZipWrapperChatProto? + dco_decode_opt_box_autoadd_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerGZipWrapperChatProto( + dynamic raw, + ); + + @protected + GZipWrapperMessageProto2? + dco_decode_opt_box_autoadd_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerGZipWrapperMessageProto2( + dynamic raw, + ); + + @protected + GZipWrapperMessageProto3? + dco_decode_opt_box_autoadd_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerGZipWrapperMessageProto3( + dynamic raw, + ); + + @protected + GZipWrapperMessageProto4? + dco_decode_opt_box_autoadd_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerGZipWrapperMessageProto4( + dynamic raw, + ); + + @protected + IdsUser? + dco_decode_opt_box_autoadd_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerIDSUser( + dynamic raw, + ); + + @protected + LocationReport? + dco_decode_opt_box_autoadd_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerLocationReport( + dynamic raw, + ); + + @protected + NsArrayLpIconMetadata? + dco_decode_opt_box_autoadd_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerNSArrayLPIconMetadata( + dynamic raw, + ); + + @protected + NsArrayLpImageMetadata? + dco_decode_opt_box_autoadd_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerNSArrayLPImageMetadata( + dynamic raw, + ); + + @protected + PushError? + dco_decode_opt_box_autoadd_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerPushError( + dynamic raw, + ); + + @protected + SavedHardwareState? + dco_decode_opt_box_autoadd_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerSavedHardwareState( + dynamic raw, + ); + + @protected + SyncManagerDefaultAnisetteProviderMyFilePackager? + dco_decode_opt_box_autoadd_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerSyncManagerDefaultAnisetteProviderMyFilePackager( + dynamic raw, + ); + + @protected + SystemTime? + dco_decode_opt_box_autoadd_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerSystemTime( + dynamic raw, + ); + + @protected + Address? dco_decode_opt_box_autoadd_address(dynamic raw); + + @protected + Attachment? dco_decode_opt_box_autoadd_attachment(dynamic raw); + + @protected + AttachmentMetaExtra? dco_decode_opt_box_autoadd_attachment_meta_extra( + dynamic raw, + ); + + @protected + Balloon? dco_decode_opt_box_autoadd_balloon(dynamic raw); + + @protected + BalloonLayout? dco_decode_opt_box_autoadd_balloon_layout(dynamic raw); + + @protected + bool? dco_decode_opt_box_autoadd_bool(dynamic raw); + + @protected + CertifiedContext? dco_decode_opt_box_autoadd_certified_context(dynamic raw); + + @protected + CloudAttachment? dco_decode_opt_box_autoadd_cloud_attachment(dynamic raw); + + @protected + CloudChat? dco_decode_opt_box_autoadd_cloud_chat(dynamic raw); + + @protected + CloudMessage? dco_decode_opt_box_autoadd_cloud_message(dynamic raw); + + @protected + CloudProp? dco_decode_opt_box_autoadd_cloud_prop(dynamic raw); + + @protected + CloudSyncOutboundFailureClass? + dco_decode_opt_box_autoadd_cloud_sync_outbound_failure_class(dynamic raw); + + @protected + CloudSyncOutboundReconcileDisposition? + dco_decode_opt_box_autoadd_cloud_sync_outbound_reconcile_disposition( + dynamic raw, + ); + + @protected + CloudSyncOutboundSafeCode? + dco_decode_opt_box_autoadd_cloud_sync_outbound_safe_code(dynamic raw); + + @protected + CloudSyncProtectedFailure? + dco_decode_opt_box_autoadd_cloud_sync_protected_failure(dynamic raw); + + @protected + CloudSyncProtectedGarbageCollection? + dco_decode_opt_box_autoadd_cloud_sync_protected_garbage_collection( + dynamic raw, + ); + + @protected + CloudSyncProtectedOutboundStage? + dco_decode_opt_box_autoadd_cloud_sync_protected_outbound_stage(dynamic raw); + + @protected + CloudSyncProtectedPage? dco_decode_opt_box_autoadd_cloud_sync_protected_page( + dynamic raw, + ); + + @protected + CloudSyncProtectedPreflightCode? + dco_decode_opt_box_autoadd_cloud_sync_protected_preflight_code(dynamic raw); + + @protected + CloudSyncProtectedRecovery? + dco_decode_opt_box_autoadd_cloud_sync_protected_recovery(dynamic raw); + + @protected + CloudSyncRawFailure? dco_decode_opt_box_autoadd_cloud_sync_raw_failure( + dynamic raw, + ); + + @protected + CloudSyncRawPage? dco_decode_opt_box_autoadd_cloud_sync_raw_page(dynamic raw); + + @protected + CloudSyncRawSystemFields? + dco_decode_opt_box_autoadd_cloud_sync_raw_system_fields(dynamic raw); + + @protected + CloudSyncTransientAttachmentPayload? + dco_decode_opt_box_autoadd_cloud_sync_transient_attachment_payload( + dynamic raw, + ); + + @protected + CloudSyncTransientChatPayload? + dco_decode_opt_box_autoadd_cloud_sync_transient_chat_payload(dynamic raw); + + @protected + CloudSyncTransientDeferredReason? + dco_decode_opt_box_autoadd_cloud_sync_transient_deferred_reason(dynamic raw); + + @protected + CloudSyncTransientEntityKind? + dco_decode_opt_box_autoadd_cloud_sync_transient_entity_kind(dynamic raw); + + @protected + CloudSyncTransientFailureCode? + dco_decode_opt_box_autoadd_cloud_sync_transient_failure_code(dynamic raw); + + @protected + CloudSyncTransientGroupPhotoPayload? + dco_decode_opt_box_autoadd_cloud_sync_transient_group_photo_payload( + dynamic raw, + ); + + @protected + CloudSyncTransientMessagePayload? + dco_decode_opt_box_autoadd_cloud_sync_transient_message_payload(dynamic raw); + + @protected + CloudSyncTransientMutationKind? + dco_decode_opt_box_autoadd_cloud_sync_transient_mutation_kind(dynamic raw); + + @protected + CloudSyncTransientPayload? + dco_decode_opt_box_autoadd_cloud_sync_transient_payload(dynamic raw); + + @protected + CloudSyncTransientQuarantineReason? + dco_decode_opt_box_autoadd_cloud_sync_transient_quarantine_reason( + dynamic raw, + ); + + @protected + CloudSyncTransientReactionKind? + dco_decode_opt_box_autoadd_cloud_sync_transient_reaction_kind(dynamic raw); + + @protected + CloudSyncTransientSnapshot? + dco_decode_opt_box_autoadd_cloud_sync_transient_snapshot(dynamic raw); + + @protected + CloudSyncTransientTombstone? + dco_decode_opt_box_autoadd_cloud_sync_transient_tombstone(dynamic raw); + + @protected + ConversationData? dco_decode_opt_box_autoadd_conversation_data(dynamic raw); + + @protected + DartBeaconShareInfo? dco_decode_opt_box_autoadd_dart_beacon_share_info( + dynamic raw, + ); + + @protected + ExtensionApp? dco_decode_opt_box_autoadd_extension_app(dynamic raw); + + @protected + double? dco_decode_opt_box_autoadd_f_64(dynamic raw); + + @protected + FTMode? dco_decode_opt_box_autoadd_ft_mode(dynamic raw); + + @protected + int? dco_decode_opt_box_autoadd_i_32(dynamic raw); + + @protected + PlatformInt64? dco_decode_opt_box_autoadd_i_64(dynamic raw); + + @protected + IMessagePosterRecord? dco_decode_opt_box_autoadd_i_message_poster_record( + dynamic raw, + ); + + @protected + IdmsRequestedSignIn? dco_decode_opt_box_autoadd_idms_requested_sign_in( + dynamic raw, + ); + + @protected + LinkMeta? dco_decode_opt_box_autoadd_link_meta(dynamic raw); + + @protected + Location? dco_decode_opt_box_autoadd_location(dynamic raw); + + @protected + LoginState? dco_decode_opt_box_autoadd_login_state(dynamic raw); + + @protected + LPIconMetadata? dco_decode_opt_box_autoadd_lp_icon_metadata(dynamic raw); + + @protected + LPImageMetadata? dco_decode_opt_box_autoadd_lp_image_metadata(dynamic raw); + + @protected + LPSpecializationMetadata? + dco_decode_opt_box_autoadd_lp_specialization_metadata(dynamic raw); + + @protected + MMCSAttachmentMeta? dco_decode_opt_box_autoadd_mmcs_attachment_meta( + dynamic raw, + ); + + @protected + MMCSFile? dco_decode_opt_box_autoadd_mmcs_file(dynamic raw); + + @protected + NSURL? dco_decode_opt_box_autoadd_nsurl(dynamic raw); + + @protected + NumOrString? dco_decode_opt_box_autoadd_num_or_string(dynamic raw); + + @protected + PartExtension? dco_decode_opt_box_autoadd_part_extension(dynamic raw); + + @protected + PasswordManagerMetaDataFormerlyShared? + dco_decode_opt_box_autoadd_password_manager_meta_data_formerly_shared( + dynamic raw, + ); + + @protected + PasswordManagerTotp? dco_decode_opt_box_autoadd_password_manager_totp( + dynamic raw, + ); + + @protected + PosterColor? dco_decode_opt_box_autoadd_poster_color(dynamic raw); + + @protected + PRPosterContentMaterialStyle? + dco_decode_opt_box_autoadd_pr_poster_content_material_style(dynamic raw); + + @protected + PushMessage? dco_decode_opt_box_autoadd_push_message(dynamic raw); + + @protected + (SharedPushState, ApsWatcher)? + dco_decode_opt_box_autoadd_record_shared_push_state_auto_owned_rust_opaque_flutter_rust_bridgefor_generated_rust_auto_opaque_inner_aps_watcher( + dynamic raw, + ); + + @protected + (String, String)? dco_decode_opt_box_autoadd_record_string_string( + dynamic raw, + ); + + @protected + (String, BigInt)? dco_decode_opt_box_autoadd_record_string_u_64(dynamic raw); + + @protected + RichLinkImageAttachmentSubstitute? + dco_decode_opt_box_autoadd_rich_link_image_attachment_substitute(dynamic raw); + + @protected + ScheduleMode? dco_decode_opt_box_autoadd_schedule_mode(dynamic raw); + + @protected + ShareProfileMessage? dco_decode_opt_box_autoadd_share_profile_message( + dynamic raw, + ); + + @protected + SharedICloudServices? dco_decode_opt_box_autoadd_shared_i_cloud_services( + dynamic raw, + ); + + @protected + SharedPoster? dco_decode_opt_box_autoadd_shared_poster(dynamic raw); + + @protected + SharedPushState? dco_decode_opt_box_autoadd_shared_push_state(dynamic raw); + + @protected + SupportAction? dco_decode_opt_box_autoadd_support_action(dynamic raw); + + @protected + SupportAlert? dco_decode_opt_box_autoadd_support_alert(dynamic raw); + + @protected + TypingApp? dco_decode_opt_box_autoadd_typing_app(dynamic raw); + + @protected + int? dco_decode_opt_box_autoadd_u_16(dynamic raw); + + @protected + int? dco_decode_opt_box_autoadd_u_32(dynamic raw); + + @protected + BigInt? dco_decode_opt_box_autoadd_u_64(dynamic raw); + + @protected + UpdateAccountFinish? dco_decode_opt_box_autoadd_update_account_finish( + dynamic raw, + ); + + @protected + List? + dco_decode_opt_list_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerIDSUser( + dynamic raw, + ); + + @protected + List? dco_decode_opt_list_String(dynamic raw); + + @protected + List? dco_decode_opt_list_message_target(dynamic raw); + + @protected + Uint8List? dco_decode_opt_list_prim_u_8_strict(dynamic raw); + + @protected + PartExtension dco_decode_part_extension(dynamic raw); + + @protected + Passkey dco_decode_passkey(dynamic raw); + + @protected + PasswordManagerAltDomain dco_decode_password_manager_alt_domain(dynamic raw); + + @protected + PasswordManagerMeta dco_decode_password_manager_meta(dynamic raw); + + @protected + PasswordManagerMetaChange dco_decode_password_manager_meta_change( + dynamic raw, + ); + + @protected + PasswordManagerMetaData dco_decode_password_manager_meta_data(dynamic raw); + + @protected + PasswordManagerMetaDataCtx dco_decode_password_manager_meta_data_ctx( + dynamic raw, + ); + + @protected + PasswordManagerMetaDataFormerlyShared + dco_decode_password_manager_meta_data_formerly_shared(dynamic raw); + + @protected + PasswordManagerTotp dco_decode_password_manager_totp(dynamic raw); + + @protected + PasswordRawEntry dco_decode_password_raw_entry(dynamic raw); + + @protected + PermanentDeleteMessage dco_decode_permanent_delete_message(dynamic raw); + + @protected + PhotoPosterContents dco_decode_photo_poster_contents(dynamic raw); + + @protected + PhotoPosterContentsFrame dco_decode_photo_poster_contents_frame(dynamic raw); + + @protected + PhotoPosterContentsSize dco_decode_photo_poster_contents_size(dynamic raw); + + @protected + PhotoPosterLayer dco_decode_photo_poster_layer(dynamic raw); + + @protected + PhotoPosterLayout dco_decode_photo_poster_layout(dynamic raw); + + @protected + PhotoPosterProperties dco_decode_photo_poster_properties(dynamic raw); + + @protected + PollResult dco_decode_poll_result(dynamic raw); + + @protected + PosterAsset dco_decode_poster_asset(dynamic raw); + + @protected + PosterColor dco_decode_poster_color(dynamic raw); + + @protected + PosterRole dco_decode_poster_role(dynamic raw); + + @protected + PosterType dco_decode_poster_type(dynamic raw); + + @protected + PRPosterColor dco_decode_pr_poster_color(dynamic raw); + + @protected + PRPosterContentMaterialStyle dco_decode_pr_poster_content_material_style( + dynamic raw, + ); + + @protected + PRPosterSystemTimeFontConfiguration + dco_decode_pr_poster_system_time_font_configuration(dynamic raw); + + @protected + PRPosterTitleStyleConfiguration + dco_decode_pr_poster_title_style_configuration(dynamic raw); + + @protected + PrivateDeviceInfo dco_decode_private_device_info(dynamic raw); + + @protected + ProvisionedFlavor dco_decode_provisioned_flavor(dynamic raw); + + @protected + PushMessage dco_decode_push_message(dynamic raw); + + @protected + QuotaInfo dco_decode_quota_info(dynamic raw); + + @protected + ReactMessage dco_decode_react_message(dynamic raw); + + @protected + ReactMessageType dco_decode_react_message_type(dynamic raw); + + @protected + Reaction dco_decode_reaction(dynamic raw); + + @protected + (ApsConnection, PushError?) + dco_decode_record_auto_owned_rust_opaque_flutter_rust_bridgefor_generated_rust_auto_opaque_inner_aps_connection_opt_box_autoadd_auto_owned_rust_opaque_flutter_rust_bridgefor_generated_rust_auto_opaque_inner_push_error( + dynamic raw, + ); + + @protected + (ArcMutexAppleAccountDefaultAnisetteProvider, LoginState) + dco_decode_record_auto_owned_rust_opaque_flutter_rust_bridgefor_generated_rust_auto_opaque_inner_arc_mutex_apple_account_default_anisette_provider_login_state( + dynamic raw, + ); + + @protected + (ArcSharedPushState, SharedPushState) + dco_decode_record_auto_owned_rust_opaque_flutter_rust_bridgefor_generated_rust_auto_opaque_inner_arc_shared_push_state_shared_push_state( + dynamic raw, + ); + + @protected + (CircleClientSessionDefaultAnisetteProvider, LoginState, String?) + dco_decode_record_auto_owned_rust_opaque_flutter_rust_bridgefor_generated_rust_auto_opaque_inner_circle_client_session_default_anisette_provider_login_state_opt_string( + dynamic raw, + ); + + @protected + (Sender, ArcSenderPushMessage, ApsWatcher) + dco_decode_record_auto_owned_rust_opaque_flutter_rust_bridgefor_generated_rust_auto_opaque_inner_sender_auto_owned_rust_opaque_flutter_rust_bridgefor_generated_rust_auto_opaque_inner_arc_sender_push_message_auto_owned_rust_opaque_flutter_rust_bridgefor_generated_rust_auto_opaque_inner_aps_watcher( + dynamic raw, + ); + + @protected + (Uint8List, Map, int) + dco_decode_record_list_prim_u_8_strict_map_string_opt_box_autoadd_cloud_attachment_i_32( + dynamic raw, + ); + + @protected + (Uint8List, Map, int) + dco_decode_record_list_prim_u_8_strict_map_string_opt_box_autoadd_cloud_chat_i_32( + dynamic raw, + ); + + @protected + (Uint8List, Map, int) + dco_decode_record_list_prim_u_8_strict_map_string_opt_box_autoadd_cloud_message_i_32( + dynamic raw, + ); + + @protected + (Uint8List, Uint8List?) + dco_decode_record_list_prim_u_8_strict_opt_list_prim_u_8_strict(dynamic raw); + + @protected + (List, List) + dco_decode_record_list_shared_album_list_string(dynamic raw); + + @protected + (List, LoginState?) + dco_decode_record_list_trusted_phone_number_opt_box_autoadd_login_state( + dynamic raw, + ); + + @protected + (LoginState, IdsUser?) + dco_decode_record_login_state_opt_box_autoadd_auto_owned_rust_opaque_flutter_rust_bridgefor_generated_rust_auto_opaque_inner_ids_user( + dynamic raw, + ); + + @protected + (Map, (String, BigInt)?) + dco_decode_record_map_string_sync_status_opt_box_autoadd_record_string_u_64( + dynamic raw, + ); + + @protected + (List?, SupportAlert?) + dco_decode_record_opt_list_auto_owned_rust_opaque_flutter_rust_bridgefor_generated_rust_auto_opaque_inner_ids_user_opt_box_autoadd_support_alert( + dynamic raw, + ); + + @protected + (String?, Passkey) dco_decode_record_opt_string_passkey(dynamic raw); + + @protected + (String?, PasswordManagerMeta) + dco_decode_record_opt_string_password_manager_meta(dynamic raw); + + @protected + (String?, PasswordRawEntry) dco_decode_record_opt_string_password_raw_entry( + dynamic raw, + ); + + @protected + (String?, WifiPassword) dco_decode_record_opt_string_wifi_password( + dynamic raw, + ); + + @protected + (SharedPushState, ApsWatcher) + dco_decode_record_shared_push_state_auto_owned_rust_opaque_flutter_rust_bridgefor_generated_rust_auto_opaque_inner_aps_watcher( + dynamic raw, + ); + + @protected + (String, Asset) + dco_decode_record_string_auto_owned_rust_opaque_flutter_rust_bridgefor_generated_rust_auto_opaque_inner_asset( + dynamic raw, + ); + + @protected + (String, StCollapsedValue) + dco_decode_record_string_auto_owned_rust_opaque_flutter_rust_bridgefor_generated_rust_auto_opaque_inner_st_collapsed_value( + dynamic raw, + ); + + @protected + (String, bool) dco_decode_record_string_bool(dynamic raw); + + @protected + (String, int) dco_decode_record_string_casted_primitive_u_64(dynamic raw); + + @protected + (String, CloudAttachment) dco_decode_record_string_cloud_attachment( + dynamic raw, + ); + + @protected + (String, CloudChat) dco_decode_record_string_cloud_chat(dynamic raw); + + @protected + (String, CloudMessage) dco_decode_record_string_cloud_message(dynamic raw); + + @protected + (String, FTParticipant) dco_decode_record_string_ft_participant(dynamic raw); + + @protected + (String, GroupSummary) dco_decode_record_string_group_summary(dynamic raw); + + @protected + (String, List) dco_decode_record_string_list_message_edit( + dynamic raw, + ); + + @protected + (String, Uint8List) dco_decode_record_string_list_prim_u_8_strict( + dynamic raw, + ); + + @protected + (String, Map, Map) + dco_decode_record_string_map_string_group_summary_map_string_share_invite_content_data( + dynamic raw, + ); + + @protected + (String, MessageEditRange) dco_decode_record_string_message_edit_range( + dynamic raw, + ); + + @protected + (String, CloudAttachment?) + dco_decode_record_string_opt_box_autoadd_cloud_attachment(dynamic raw); + + @protected + (String, CloudChat?) dco_decode_record_string_opt_box_autoadd_cloud_chat( + dynamic raw, + ); + + @protected + (String, CloudMessage?) + dco_decode_record_string_opt_box_autoadd_cloud_message(dynamic raw); + + @protected + (String, PasswordManagerMetaDataCtx) + dco_decode_record_string_password_manager_meta_data_ctx(dynamic raw); + + @protected + (String, (String?, Passkey)) + dco_decode_record_string_record_opt_string_passkey(dynamic raw); + + @protected + (String, (String?, PasswordManagerMeta)) + dco_decode_record_string_record_opt_string_password_manager_meta(dynamic raw); + + @protected + (String, (String?, PasswordRawEntry)) + dco_decode_record_string_record_opt_string_password_raw_entry(dynamic raw); + + @protected + (String, (String?, WifiPassword)) + dco_decode_record_string_record_opt_string_wifi_password(dynamic raw); + + @protected + (String, ShareInviteContentData) + dco_decode_record_string_share_invite_content_data(dynamic raw); + + @protected + (String, SharedPushState) dco_decode_record_string_shared_push_state( + dynamic raw, + ); + + @protected + (String, StatusKitPersonalConfig) + dco_decode_record_string_status_kit_personal_config(dynamic raw); + + @protected + (String, String) dco_decode_record_string_string(dynamic raw); + + @protected + (String, SyncStatus) dco_decode_record_string_sync_status(dynamic raw); + + @protected + (String, BigInt) dco_decode_record_string_u_64(dynamic raw); + + @protected + (String, UpdateAccountFinish) dco_decode_record_string_update_account_finish( + dynamic raw, + ); + + @protected + (int, NSDictionaryTypedCoder) + dco_decode_record_u_32_ns_dictionary_typed_coder(dynamic raw); + + @protected + (int, BigInt) dco_decode_record_u_32_u_64(dynamic raw); + + @protected + RegisterState dco_decode_register_state(dynamic raw); + + @protected + RenameMessage dco_decode_rename_message(dynamic raw); + + @protected + ReportMessage dco_decode_report_message(dynamic raw); + + @protected + RichLinkImageAttachmentSubstitute + dco_decode_rich_link_image_attachment_substitute(dynamic raw); + + @protected + ScheduleMode dco_decode_schedule_mode(dynamic raw); + + @protected + SetTranscriptBackgroundMessage dco_decode_set_transcript_background_message( + dynamic raw, + ); + + @protected + ShareInviteContentData dco_decode_share_invite_content_data(dynamic raw); + + @protected + ShareProfileMessage dco_decode_share_profile_message(dynamic raw); + + @protected + SharedAlbum dco_decode_shared_album(dynamic raw); + + @protected + SharedICloudServices dco_decode_shared_i_cloud_services(dynamic raw); + + @protected + SharedPoster dco_decode_shared_poster(dynamic raw); + + @protected + SharedPushState dco_decode_shared_push_state(dynamic raw); + + @protected + SimplifiedIncomingCallPoster dco_decode_simplified_incoming_call_poster( + dynamic raw, + ); + + @protected + SimplifiedPoster dco_decode_simplified_poster(dynamic raw); + + @protected + SimplifiedTranscriptPoster dco_decode_simplified_transcript_poster( + dynamic raw, + ); + + @protected + StatusKitMessage dco_decode_status_kit_message(dynamic raw); + + @protected + StatusKitPersonalConfig dco_decode_status_kit_personal_config(dynamic raw); + + @protected + SupportAction dco_decode_support_action(dynamic raw); + + @protected + SupportAlert dco_decode_support_alert(dynamic raw); + + @protected + SyncStatus dco_decode_sync_status(dynamic raw); + + @protected + TeardownSignIn dco_decode_teardown_sign_in(dynamic raw); + + @protected + TextEffect dco_decode_text_effect(dynamic raw); + + @protected + TextFlags dco_decode_text_flags(dynamic raw); + + @protected + TextFormat dco_decode_text_format(dynamic raw); + + @protected + TranscriptDynamicUserData dco_decode_transcript_dynamic_user_data( + dynamic raw, + ); + + @protected + TransferProgress dco_decode_transfer_progress(dynamic raw); + + @protected + TrustedPhoneNumber dco_decode_trusted_phone_number(dynamic raw); + + @protected + TypingApp dco_decode_typing_app(dynamic raw); + + @protected + int dco_decode_u_16(dynamic raw); + + @protected + int dco_decode_u_32(dynamic raw); + + @protected + BigInt dco_decode_u_64(dynamic raw); + + @protected + int dco_decode_u_8(dynamic raw); + + @protected + UIColor dco_decode_ui_color(dynamic raw); + + @protected + void dco_decode_unit(dynamic raw); + + @protected + UnsendMessage dco_decode_unsend_message(dynamic raw); + + @protected + UpdateAccountFinish dco_decode_update_account_finish(dynamic raw); + + @protected + UpdateExtensionMessage dco_decode_update_extension_message(dynamic raw); + + @protected + UpdateProfileMessage dco_decode_update_profile_message(dynamic raw); + + @protected + UpdateProfileSharingMessage dco_decode_update_profile_sharing_message( + dynamic raw, + ); + + @protected + BigInt dco_decode_usize(dynamic raw); + + @protected + WallpaperMetadata dco_decode_wallpaper_metadata(dynamic raw); + + @protected + WatchBackground dco_decode_watch_background(dynamic raw); + + @protected + WifiPassword dco_decode_wifi_password(dynamic raw); + + @protected + AnyhowException sse_decode_AnyhowException(SseDeserializer deserializer); + + @protected + ApsConnection + sse_decode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerAPSConnection( + SseDeserializer deserializer, + ); + + @protected + ApsState + sse_decode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerAPSState( + SseDeserializer deserializer, + ); + + @protected + ApsWatcher + sse_decode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerAPSWatcher( + SseDeserializer deserializer, + ); + + @protected + ArcAnisetteClientDefaultAnisetteProvider + sse_decode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcAnisetteClientDefaultAnisetteProvider( + SseDeserializer deserializer, + ); + + @protected + ArcCloudKitClientDefaultAnisetteProvider + sse_decode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcCloudKitClientDefaultAnisetteProvider( + SseDeserializer deserializer, + ); + + @protected + ArcCloudMessagesClientDefaultAnisetteProvider + sse_decode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcCloudMessagesClientDefaultAnisetteProvider( + SseDeserializer deserializer, + ); + + @protected + ArcFtClient + sse_decode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcFTClient( + SseDeserializer deserializer, + ); + + @protected + ArcFindMyClientDefaultAnisetteProvider + sse_decode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcFindMyClientDefaultAnisetteProvider( + SseDeserializer deserializer, + ); + + @protected + ArcImClient + sse_decode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcIMClient( + SseDeserializer deserializer, + ); + + @protected + ArcIdmsAuthListener + sse_decode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcIdmsAuthListener( + SseDeserializer deserializer, + ); + + @protected + ArcKeychainClientDefaultAnisetteProvider + sse_decode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcKeychainClientDefaultAnisetteProvider( + SseDeserializer deserializer, + ); + + @protected + ArcMutexAppleAccountDefaultAnisetteProvider + sse_decode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcMutexAppleAccountDefaultAnisetteProvider( + SseDeserializer deserializer, + ); + + @protected + ArcMutexOptionCircleClientSessionDefaultAnisetteProvider + sse_decode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcMutexOptionCircleClientSessionDefaultAnisetteProvider( + SseDeserializer deserializer, + ); + + @protected + ArcMutexVecActiveCircleSession + sse_decode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcMutexVecActiveCircleSession( + SseDeserializer deserializer, + ); + + @protected + ArcPasswordManagerDefaultAnisetteProvider + sse_decode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcPasswordManagerDefaultAnisetteProvider( + SseDeserializer deserializer, + ); + + @protected + ArcProfilesClientDefaultAnisetteProvider + sse_decode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcProfilesClientDefaultAnisetteProvider( + SseDeserializer deserializer, + ); + + @protected + ArcSenderPushMessage + sse_decode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcSenderPushMessage( + SseDeserializer deserializer, + ); + + @protected + ArcSharedPushState + sse_decode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcSharedPushState( + SseDeserializer deserializer, + ); + + @protected + ArcStatusKitClientDefaultAnisetteProvider + sse_decode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcStatusKitClientDefaultAnisetteProvider( + SseDeserializer deserializer, + ); + + @protected + ArcTokenProviderDefaultAnisetteProvider + sse_decode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcTokenProviderDefaultAnisetteProvider( + SseDeserializer deserializer, + ); + + @protected + Asset + sse_decode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerAsset( + SseDeserializer deserializer, + ); + + @protected + ChannelInterestToken + sse_decode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerChannelInterestToken( + SseDeserializer deserializer, + ); + + @protected + CircleClientSessionDefaultAnisetteProvider + sse_decode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerCircleClientSessionDefaultAnisetteProvider( + SseDeserializer deserializer, + ); + + @protected + CloudSyncPreparedMessageCreateHandle + sse_decode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerCloudSyncPreparedMessageCreateHandle( + SseDeserializer deserializer, + ); + + @protected + ConversationLink + sse_decode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerConversationLink( + SseDeserializer deserializer, + ); + + @protected + ConversationParticipant + sse_decode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerConversationParticipant( + SseDeserializer deserializer, + ); + + @protected + Date + sse_decode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerDate( + SseDeserializer deserializer, + ); + + @protected + EscrowData + sse_decode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerEscrowData( + SseDeserializer deserializer, + ); + + @protected + FindMyFriendsClientDefaultAnisetteProvider + sse_decode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerFindMyFriendsClientDefaultAnisetteProvider( + SseDeserializer deserializer, + ); + + @protected + FindMyPhoneClientDefaultAnisetteProvider + sse_decode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerFindMyPhoneClientDefaultAnisetteProvider( + SseDeserializer deserializer, + ); + + @protected + GZipWrapperAttachmentMeta + sse_decode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerGZipWrapperAttachmentMeta( + SseDeserializer deserializer, + ); + + @protected + GZipWrapperChatProto + sse_decode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerGZipWrapperChatProto( + SseDeserializer deserializer, + ); + + @protected + GZipWrapperMessageProto + sse_decode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerGZipWrapperMessageProto( + SseDeserializer deserializer, + ); + + @protected + GZipWrapperMessageProto2 + sse_decode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerGZipWrapperMessageProto2( + SseDeserializer deserializer, + ); + + @protected + GZipWrapperMessageProto3 + sse_decode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerGZipWrapperMessageProto3( + SseDeserializer deserializer, + ); + + @protected + GZipWrapperMessageProto4 + sse_decode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerGZipWrapperMessageProto4( + SseDeserializer deserializer, + ); + + @protected + IdsngmIdentity + sse_decode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerIDSNGMIdentity( + SseDeserializer deserializer, + ); + + @protected + IdsUser + sse_decode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerIDSUser( + SseDeserializer deserializer, + ); + + @protected + JoinedOsConfig + sse_decode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerJoinedOSConfig( + SseDeserializer deserializer, + ); + + @protected + LocationReport + sse_decode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerLocationReport( + SseDeserializer deserializer, + ); + + @protected + MessageFlags + sse_decode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerMessageFlags( + SseDeserializer deserializer, + ); + + @protected + NsArrayLpIconMetadata + sse_decode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerNSArrayLPIconMetadata( + SseDeserializer deserializer, + ); + + @protected + NsArrayLpImageMetadata + sse_decode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerNSArrayLPImageMetadata( + SseDeserializer deserializer, + ); + + @protected + PushError + sse_decode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerPushError( + SseDeserializer deserializer, + ); + + @protected + ReceiverApsMessage + sse_decode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerReceiverAPSMessage( + SseDeserializer deserializer, + ); + + @protected + SavedHardwareState + sse_decode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerSavedHardwareState( + SseDeserializer deserializer, + ); + + @protected + Sender + sse_decode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerSender( + SseDeserializer deserializer, + ); + + @protected + StCollapsedValue + sse_decode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerStCollapsedValue( + SseDeserializer deserializer, + ); + + @protected + SyncManagerDefaultAnisetteProviderMyFilePackager + sse_decode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerSyncManagerDefaultAnisetteProviderMyFilePackager( + SseDeserializer deserializer, + ); + + @protected + SystemTime + sse_decode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerSystemTime( + SseDeserializer deserializer, + ); + + @protected + VerifyBody + sse_decode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerVerifyBody( + SseDeserializer deserializer, + ); + + @protected + ViableBottle + sse_decode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerViableBottle( + SseDeserializer deserializer, + ); + + @protected + ApsWatcher + sse_decode_Auto_RefMut_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerAPSWatcher( + SseDeserializer deserializer, + ); + + @protected + CircleClientSessionDefaultAnisetteProvider + sse_decode_Auto_RefMut_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerCircleClientSessionDefaultAnisetteProvider( + SseDeserializer deserializer, + ); + + @protected + FindMyFriendsClientDefaultAnisetteProvider + sse_decode_Auto_RefMut_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerFindMyFriendsClientDefaultAnisetteProvider( + SseDeserializer deserializer, + ); + + @protected + FindMyPhoneClientDefaultAnisetteProvider + sse_decode_Auto_RefMut_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerFindMyPhoneClientDefaultAnisetteProvider( + SseDeserializer deserializer, + ); + + @protected + LocationReport + sse_decode_Auto_RefMut_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerLocationReport( + SseDeserializer deserializer, + ); + + @protected + ReceiverApsMessage + sse_decode_Auto_RefMut_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerReceiverAPSMessage( + SseDeserializer deserializer, + ); + + @protected + SavedHardwareState + sse_decode_Auto_RefMut_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerSavedHardwareState( + SseDeserializer deserializer, + ); + + @protected + ViableBottle + sse_decode_Auto_RefMut_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerViableBottle( + SseDeserializer deserializer, + ); + + @protected + ApsConnection + sse_decode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerAPSConnection( + SseDeserializer deserializer, + ); + + @protected + ArcAnisetteClientDefaultAnisetteProvider + sse_decode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcAnisetteClientDefaultAnisetteProvider( + SseDeserializer deserializer, + ); + + @protected + ArcCloudKitClientDefaultAnisetteProvider + sse_decode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcCloudKitClientDefaultAnisetteProvider( + SseDeserializer deserializer, + ); + + @protected + ArcCloudMessagesClientDefaultAnisetteProvider + sse_decode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcCloudMessagesClientDefaultAnisetteProvider( + SseDeserializer deserializer, + ); + + @protected + ArcFtClient + sse_decode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcFTClient( + SseDeserializer deserializer, + ); + + @protected + ArcFindMyClientDefaultAnisetteProvider + sse_decode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcFindMyClientDefaultAnisetteProvider( + SseDeserializer deserializer, + ); + + @protected + ArcImClient + sse_decode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcIMClient( + SseDeserializer deserializer, + ); + + @protected + ArcIdmsAuthListener + sse_decode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcIdmsAuthListener( + SseDeserializer deserializer, + ); + + @protected + ArcKeychainClientDefaultAnisetteProvider + sse_decode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcKeychainClientDefaultAnisetteProvider( + SseDeserializer deserializer, + ); + + @protected + ArcMutexAppleAccountDefaultAnisetteProvider + sse_decode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcMutexAppleAccountDefaultAnisetteProvider( + SseDeserializer deserializer, + ); + + @protected + ArcMutexOptionCircleClientSessionDefaultAnisetteProvider + sse_decode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcMutexOptionCircleClientSessionDefaultAnisetteProvider( + SseDeserializer deserializer, + ); + + @protected + ArcMutexVecActiveCircleSession + sse_decode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcMutexVecActiveCircleSession( + SseDeserializer deserializer, + ); + + @protected + ArcPasswordManagerDefaultAnisetteProvider + sse_decode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcPasswordManagerDefaultAnisetteProvider( + SseDeserializer deserializer, + ); + + @protected + ArcProfilesClientDefaultAnisetteProvider + sse_decode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcProfilesClientDefaultAnisetteProvider( + SseDeserializer deserializer, + ); + + @protected + ArcSenderPushMessage + sse_decode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcSenderPushMessage( + SseDeserializer deserializer, + ); + + @protected + ArcSharedPushState + sse_decode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcSharedPushState( + SseDeserializer deserializer, + ); + + @protected + ArcStatusKitClientDefaultAnisetteProvider + sse_decode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcStatusKitClientDefaultAnisetteProvider( + SseDeserializer deserializer, + ); + + @protected + ArcTokenProviderDefaultAnisetteProvider + sse_decode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcTokenProviderDefaultAnisetteProvider( + SseDeserializer deserializer, + ); + + @protected + CloudSyncPreparedMessageCreateHandle + sse_decode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerCloudSyncPreparedMessageCreateHandle( + SseDeserializer deserializer, + ); + + @protected + Date + sse_decode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerDate( + SseDeserializer deserializer, + ); + + @protected + EscrowData + sse_decode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerEscrowData( + SseDeserializer deserializer, + ); + + @protected + GZipWrapperAttachmentMeta + sse_decode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerGZipWrapperAttachmentMeta( + SseDeserializer deserializer, + ); + + @protected + GZipWrapperChatProto + sse_decode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerGZipWrapperChatProto( + SseDeserializer deserializer, + ); + + @protected + GZipWrapperMessageProto + sse_decode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerGZipWrapperMessageProto( + SseDeserializer deserializer, + ); + + @protected + GZipWrapperMessageProto2 + sse_decode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerGZipWrapperMessageProto2( + SseDeserializer deserializer, + ); + + @protected + GZipWrapperMessageProto3 + sse_decode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerGZipWrapperMessageProto3( + SseDeserializer deserializer, + ); + + @protected + GZipWrapperMessageProto4 + sse_decode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerGZipWrapperMessageProto4( + SseDeserializer deserializer, + ); + + @protected + IdsngmIdentity + sse_decode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerIDSNGMIdentity( + SseDeserializer deserializer, + ); + + @protected + IdsUser + sse_decode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerIDSUser( + SseDeserializer deserializer, + ); + + @protected + JoinedOsConfig + sse_decode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerJoinedOSConfig( + SseDeserializer deserializer, + ); + + @protected + LocationReport + sse_decode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerLocationReport( + SseDeserializer deserializer, + ); + + @protected + MessageFlags + sse_decode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerMessageFlags( + SseDeserializer deserializer, + ); + + @protected + SavedHardwareState + sse_decode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerSavedHardwareState( + SseDeserializer deserializer, + ); + + @protected + Sender + sse_decode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerSender( + SseDeserializer deserializer, + ); + + @protected + StCollapsedValue + sse_decode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerStCollapsedValue( + SseDeserializer deserializer, + ); + + @protected + SyncManagerDefaultAnisetteProviderMyFilePackager + sse_decode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerSyncManagerDefaultAnisetteProviderMyFilePackager( + SseDeserializer deserializer, + ); + + @protected + VerifyBody + sse_decode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerVerifyBody( + SseDeserializer deserializer, + ); + + @protected + ViableBottle + sse_decode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerViableBottle( + SseDeserializer deserializer, + ); + + @protected + int sse_decode_CastedPrimitive_i_64(SseDeserializer deserializer); + + @protected + int sse_decode_CastedPrimitive_u_64(SseDeserializer deserializer); + + @protected + int sse_decode_CastedPrimitive_usize(SseDeserializer deserializer); + + @protected + Object sse_decode_DartOpaque(SseDeserializer deserializer); + + @protected + Map + sse_decode_Map_String_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerAsset( + SseDeserializer deserializer, + ); + + @protected + Map + sse_decode_Map_String_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerStCollapsedValue( + SseDeserializer deserializer, + ); + + @protected + Map sse_decode_Map_String_CastedPrimitive_u_64( + SseDeserializer deserializer, + ); + + @protected + Map sse_decode_Map_String_String( + SseDeserializer deserializer, + ); + + @protected + Map sse_decode_Map_String_bool(SseDeserializer deserializer); + + @protected + Map sse_decode_Map_String_cloud_attachment( + SseDeserializer deserializer, + ); + + @protected + Map sse_decode_Map_String_cloud_chat( + SseDeserializer deserializer, + ); + + @protected + Map sse_decode_Map_String_cloud_message( + SseDeserializer deserializer, + ); + + @protected + Map sse_decode_Map_String_ft_participant( + SseDeserializer deserializer, + ); + + @protected + Map sse_decode_Map_String_group_summary( + SseDeserializer deserializer, + ); + + @protected + Map> sse_decode_Map_String_list_message_edit( + SseDeserializer deserializer, + ); + + @protected + Map sse_decode_Map_String_list_prim_u_8_strict( + SseDeserializer deserializer, + ); + + @protected + Map sse_decode_Map_String_message_edit_range( + SseDeserializer deserializer, + ); + + @protected + Map + sse_decode_Map_String_opt_box_autoadd_cloud_attachment( + SseDeserializer deserializer, + ); + + @protected + Map sse_decode_Map_String_opt_box_autoadd_cloud_chat( + SseDeserializer deserializer, + ); + + @protected + Map + sse_decode_Map_String_opt_box_autoadd_cloud_message( + SseDeserializer deserializer, + ); + + @protected + Map + sse_decode_Map_String_password_manager_meta_data_ctx( + SseDeserializer deserializer, + ); + + @protected + Map + sse_decode_Map_String_record_opt_string_passkey(SseDeserializer deserializer); + + @protected + Map + sse_decode_Map_String_record_opt_string_password_manager_meta( + SseDeserializer deserializer, + ); + + @protected + Map + sse_decode_Map_String_record_opt_string_password_raw_entry( + SseDeserializer deserializer, + ); + + @protected + Map + sse_decode_Map_String_record_opt_string_wifi_password( + SseDeserializer deserializer, + ); + + @protected + Map + sse_decode_Map_String_share_invite_content_data(SseDeserializer deserializer); + + @protected + Map + sse_decode_Map_String_status_kit_personal_config( + SseDeserializer deserializer, + ); + + @protected + Map sse_decode_Map_String_sync_status( + SseDeserializer deserializer, + ); + + @protected + ApsConnection + sse_decode_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerAPSConnection( + SseDeserializer deserializer, + ); + + @protected + ApsState + sse_decode_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerAPSState( + SseDeserializer deserializer, + ); + + @protected + ApsWatcher + sse_decode_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerAPSWatcher( + SseDeserializer deserializer, + ); + + @protected + ArcAnisetteClientDefaultAnisetteProvider + sse_decode_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcAnisetteClientDefaultAnisetteProvider( + SseDeserializer deserializer, + ); + + @protected + ArcCloudKitClientDefaultAnisetteProvider + sse_decode_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcCloudKitClientDefaultAnisetteProvider( + SseDeserializer deserializer, + ); + + @protected + ArcCloudMessagesClientDefaultAnisetteProvider + sse_decode_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcCloudMessagesClientDefaultAnisetteProvider( + SseDeserializer deserializer, + ); + + @protected + ArcFtClient + sse_decode_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcFTClient( + SseDeserializer deserializer, + ); + + @protected + ArcFindMyClientDefaultAnisetteProvider + sse_decode_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcFindMyClientDefaultAnisetteProvider( + SseDeserializer deserializer, + ); + + @protected + ArcImClient + sse_decode_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcIMClient( + SseDeserializer deserializer, + ); + + @protected + ArcIdmsAuthListener + sse_decode_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcIdmsAuthListener( + SseDeserializer deserializer, + ); + + @protected + ArcKeychainClientDefaultAnisetteProvider + sse_decode_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcKeychainClientDefaultAnisetteProvider( + SseDeserializer deserializer, + ); + + @protected + ArcMutexAppleAccountDefaultAnisetteProvider + sse_decode_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcMutexAppleAccountDefaultAnisetteProvider( + SseDeserializer deserializer, + ); + + @protected + ArcMutexOptionCircleClientSessionDefaultAnisetteProvider + sse_decode_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcMutexOptionCircleClientSessionDefaultAnisetteProvider( + SseDeserializer deserializer, + ); + + @protected + ArcMutexVecActiveCircleSession + sse_decode_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcMutexVecActiveCircleSession( + SseDeserializer deserializer, + ); + + @protected + ArcPasswordManagerDefaultAnisetteProvider + sse_decode_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcPasswordManagerDefaultAnisetteProvider( + SseDeserializer deserializer, + ); + + @protected + ArcProfilesClientDefaultAnisetteProvider + sse_decode_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcProfilesClientDefaultAnisetteProvider( + SseDeserializer deserializer, + ); + + @protected + ArcSenderPushMessage + sse_decode_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcSenderPushMessage( + SseDeserializer deserializer, + ); + + @protected + ArcSharedPushState + sse_decode_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcSharedPushState( + SseDeserializer deserializer, + ); + + @protected + ArcStatusKitClientDefaultAnisetteProvider + sse_decode_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcStatusKitClientDefaultAnisetteProvider( + SseDeserializer deserializer, + ); + + @protected + ArcTokenProviderDefaultAnisetteProvider + sse_decode_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcTokenProviderDefaultAnisetteProvider( + SseDeserializer deserializer, + ); + + @protected + Asset + sse_decode_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerAsset( + SseDeserializer deserializer, + ); + + @protected + ChannelInterestToken + sse_decode_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerChannelInterestToken( + SseDeserializer deserializer, + ); + + @protected + CircleClientSessionDefaultAnisetteProvider + sse_decode_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerCircleClientSessionDefaultAnisetteProvider( + SseDeserializer deserializer, + ); + + @protected + CloudSyncPreparedMessageCreateHandle + sse_decode_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerCloudSyncPreparedMessageCreateHandle( + SseDeserializer deserializer, + ); + + @protected + ConversationLink + sse_decode_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerConversationLink( + SseDeserializer deserializer, + ); + + @protected + ConversationParticipant + sse_decode_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerConversationParticipant( + SseDeserializer deserializer, + ); + + @protected + Date + sse_decode_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerDate( + SseDeserializer deserializer, + ); + + @protected + EscrowData + sse_decode_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerEscrowData( + SseDeserializer deserializer, + ); + + @protected + FindMyFriendsClientDefaultAnisetteProvider + sse_decode_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerFindMyFriendsClientDefaultAnisetteProvider( + SseDeserializer deserializer, + ); + + @protected + FindMyPhoneClientDefaultAnisetteProvider + sse_decode_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerFindMyPhoneClientDefaultAnisetteProvider( + SseDeserializer deserializer, + ); + + @protected + GZipWrapperAttachmentMeta + sse_decode_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerGZipWrapperAttachmentMeta( + SseDeserializer deserializer, + ); + + @protected + GZipWrapperChatProto + sse_decode_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerGZipWrapperChatProto( + SseDeserializer deserializer, + ); + + @protected + GZipWrapperMessageProto + sse_decode_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerGZipWrapperMessageProto( + SseDeserializer deserializer, + ); + + @protected + GZipWrapperMessageProto2 + sse_decode_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerGZipWrapperMessageProto2( + SseDeserializer deserializer, + ); + + @protected + GZipWrapperMessageProto3 + sse_decode_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerGZipWrapperMessageProto3( + SseDeserializer deserializer, + ); + + @protected + GZipWrapperMessageProto4 + sse_decode_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerGZipWrapperMessageProto4( + SseDeserializer deserializer, + ); + + @protected + IdsngmIdentity + sse_decode_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerIDSNGMIdentity( + SseDeserializer deserializer, + ); + + @protected + IdsUser + sse_decode_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerIDSUser( + SseDeserializer deserializer, + ); + + @protected + JoinedOsConfig + sse_decode_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerJoinedOSConfig( + SseDeserializer deserializer, + ); + + @protected + LocationReport + sse_decode_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerLocationReport( + SseDeserializer deserializer, + ); + + @protected + MessageFlags + sse_decode_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerMessageFlags( + SseDeserializer deserializer, + ); + + @protected + NsArrayLpIconMetadata + sse_decode_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerNSArrayLPIconMetadata( + SseDeserializer deserializer, + ); + + @protected + NsArrayLpImageMetadata + sse_decode_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerNSArrayLPImageMetadata( + SseDeserializer deserializer, + ); + + @protected + PushError + sse_decode_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerPushError( + SseDeserializer deserializer, + ); + + @protected + ReceiverApsMessage + sse_decode_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerReceiverAPSMessage( + SseDeserializer deserializer, + ); + + @protected + SavedHardwareState + sse_decode_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerSavedHardwareState( + SseDeserializer deserializer, + ); + + @protected + Sender + sse_decode_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerSender( + SseDeserializer deserializer, + ); + + @protected + StCollapsedValue + sse_decode_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerStCollapsedValue( + SseDeserializer deserializer, + ); + + @protected + SyncManagerDefaultAnisetteProviderMyFilePackager + sse_decode_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerSyncManagerDefaultAnisetteProviderMyFilePackager( + SseDeserializer deserializer, + ); + + @protected + SystemTime + sse_decode_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerSystemTime( + SseDeserializer deserializer, + ); + + @protected + VerifyBody + sse_decode_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerVerifyBody( + SseDeserializer deserializer, + ); + + @protected + ViableBottle + sse_decode_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerViableBottle( + SseDeserializer deserializer, + ); + + @protected + Set sse_decode_Set_ft_member(SseDeserializer deserializer); + + @protected + RustStreamSink + sse_decode_StreamSink_mmcs_transfer_progress_Sse( + SseDeserializer deserializer, + ); + + @protected + RustStreamSink sse_decode_StreamSink_transfer_progress_Sse( + SseDeserializer deserializer, + ); + + @protected + String sse_decode_String(SseDeserializer deserializer); + + @protected + Address sse_decode_address(SseDeserializer deserializer); + + @protected + AkData sse_decode_ak_data(SseDeserializer deserializer); + + @protected + ApsAlert sse_decode_aps_alert(SseDeserializer deserializer); + + @protected + ApsConnectionStatus sse_decode_aps_connection_status( + SseDeserializer deserializer, + ); + + @protected + ApsData sse_decode_aps_data(SseDeserializer deserializer); + + @protected + Attachment sse_decode_attachment(SseDeserializer deserializer); + + @protected + AttachmentMeta sse_decode_attachment_meta(SseDeserializer deserializer); + + @protected + AttachmentMetaExtra sse_decode_attachment_meta_extra( + SseDeserializer deserializer, + ); + + @protected + AttachmentType sse_decode_attachment_type(SseDeserializer deserializer); + + @protected + Balloon sse_decode_balloon(SseDeserializer deserializer); + + @protected + BalloonLayout sse_decode_balloon_layout(SseDeserializer deserializer); + + @protected + BeaconAttributes sse_decode_beacon_attributes(SseDeserializer deserializer); + + @protected + BeaconNamingRecord sse_decode_beacon_naming_record( + SseDeserializer deserializer, + ); + + @protected + bool sse_decode_bool(SseDeserializer deserializer); + + @protected + ApsState + sse_decode_box_autoadd_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerAPSState( + SseDeserializer deserializer, + ); + + @protected + ArcCloudKitClientDefaultAnisetteProvider + sse_decode_box_autoadd_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcCloudKitClientDefaultAnisetteProvider( + SseDeserializer deserializer, + ); + + @protected + ArcCloudMessagesClientDefaultAnisetteProvider + sse_decode_box_autoadd_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcCloudMessagesClientDefaultAnisetteProvider( + SseDeserializer deserializer, + ); + + @protected + ArcFindMyClientDefaultAnisetteProvider + sse_decode_box_autoadd_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcFindMyClientDefaultAnisetteProvider( + SseDeserializer deserializer, + ); + + @protected + ArcKeychainClientDefaultAnisetteProvider + sse_decode_box_autoadd_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcKeychainClientDefaultAnisetteProvider( + SseDeserializer deserializer, + ); + + @protected + ArcMutexAppleAccountDefaultAnisetteProvider + sse_decode_box_autoadd_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcMutexAppleAccountDefaultAnisetteProvider( + SseDeserializer deserializer, + ); + + @protected + ArcPasswordManagerDefaultAnisetteProvider + sse_decode_box_autoadd_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcPasswordManagerDefaultAnisetteProvider( + SseDeserializer deserializer, + ); + + @protected + Asset + sse_decode_box_autoadd_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerAsset( + SseDeserializer deserializer, + ); + + @protected + ChannelInterestToken + sse_decode_box_autoadd_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerChannelInterestToken( + SseDeserializer deserializer, + ); + + @protected + CircleClientSessionDefaultAnisetteProvider + sse_decode_box_autoadd_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerCircleClientSessionDefaultAnisetteProvider( + SseDeserializer deserializer, + ); + + @protected + CloudSyncPreparedMessageCreateHandle + sse_decode_box_autoadd_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerCloudSyncPreparedMessageCreateHandle( + SseDeserializer deserializer, + ); + + @protected + ConversationLink + sse_decode_box_autoadd_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerConversationLink( + SseDeserializer deserializer, + ); + + @protected + ConversationParticipant + sse_decode_box_autoadd_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerConversationParticipant( + SseDeserializer deserializer, + ); + + @protected + Date + sse_decode_box_autoadd_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerDate( + SseDeserializer deserializer, + ); + + @protected + GZipWrapperChatProto + sse_decode_box_autoadd_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerGZipWrapperChatProto( + SseDeserializer deserializer, + ); + + @protected + GZipWrapperMessageProto2 + sse_decode_box_autoadd_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerGZipWrapperMessageProto2( + SseDeserializer deserializer, + ); + + @protected + GZipWrapperMessageProto3 + sse_decode_box_autoadd_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerGZipWrapperMessageProto3( + SseDeserializer deserializer, + ); + + @protected + GZipWrapperMessageProto4 + sse_decode_box_autoadd_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerGZipWrapperMessageProto4( + SseDeserializer deserializer, + ); + + @protected + IdsUser + sse_decode_box_autoadd_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerIDSUser( + SseDeserializer deserializer, + ); + + @protected + LocationReport + sse_decode_box_autoadd_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerLocationReport( + SseDeserializer deserializer, + ); + + @protected + NsArrayLpIconMetadata + sse_decode_box_autoadd_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerNSArrayLPIconMetadata( + SseDeserializer deserializer, + ); + + @protected + NsArrayLpImageMetadata + sse_decode_box_autoadd_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerNSArrayLPImageMetadata( + SseDeserializer deserializer, + ); + + @protected + PushError + sse_decode_box_autoadd_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerPushError( + SseDeserializer deserializer, + ); + + @protected + SavedHardwareState + sse_decode_box_autoadd_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerSavedHardwareState( + SseDeserializer deserializer, + ); + + @protected + SyncManagerDefaultAnisetteProviderMyFilePackager + sse_decode_box_autoadd_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerSyncManagerDefaultAnisetteProviderMyFilePackager( + SseDeserializer deserializer, + ); + + @protected + SystemTime + sse_decode_box_autoadd_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerSystemTime( + SseDeserializer deserializer, + ); + + @protected + Address sse_decode_box_autoadd_address(SseDeserializer deserializer); + + @protected + Attachment sse_decode_box_autoadd_attachment(SseDeserializer deserializer); + + @protected + AttachmentMeta sse_decode_box_autoadd_attachment_meta( + SseDeserializer deserializer, + ); + + @protected + AttachmentMetaExtra sse_decode_box_autoadd_attachment_meta_extra( + SseDeserializer deserializer, + ); + + @protected + Balloon sse_decode_box_autoadd_balloon(SseDeserializer deserializer); + + @protected + BalloonLayout sse_decode_box_autoadd_balloon_layout( + SseDeserializer deserializer, + ); + + @protected + BeaconAttributes sse_decode_box_autoadd_beacon_attributes( + SseDeserializer deserializer, + ); + + @protected + BeaconNamingRecord sse_decode_box_autoadd_beacon_naming_record( + SseDeserializer deserializer, + ); + + @protected + bool sse_decode_box_autoadd_bool(SseDeserializer deserializer); + + @protected + CertifiedContext sse_decode_box_autoadd_certified_context( + SseDeserializer deserializer, + ); + + @protected + ChangeParticipantMessage sse_decode_box_autoadd_change_participant_message( + SseDeserializer deserializer, + ); + + @protected + ChatProto sse_decode_box_autoadd_chat_proto(SseDeserializer deserializer); + + @protected + CloudAttachment sse_decode_box_autoadd_cloud_attachment( + SseDeserializer deserializer, + ); + + @protected + CloudChat sse_decode_box_autoadd_cloud_chat(SseDeserializer deserializer); + + @protected + CloudMessage sse_decode_box_autoadd_cloud_message( + SseDeserializer deserializer, + ); + + @protected + CloudProp sse_decode_box_autoadd_cloud_prop(SseDeserializer deserializer); + + @protected + CloudSyncOutboundFailureClass + sse_decode_box_autoadd_cloud_sync_outbound_failure_class( + SseDeserializer deserializer, + ); + + @protected + CloudSyncOutboundReconcileDisposition + sse_decode_box_autoadd_cloud_sync_outbound_reconcile_disposition( + SseDeserializer deserializer, + ); + + @protected + CloudSyncOutboundSafeCode + sse_decode_box_autoadd_cloud_sync_outbound_safe_code( + SseDeserializer deserializer, + ); + + @protected + CloudSyncPreparedMessageCreateInput + sse_decode_box_autoadd_cloud_sync_prepared_message_create_input( + SseDeserializer deserializer, + ); + + @protected + CloudSyncProtectedFailure sse_decode_box_autoadd_cloud_sync_protected_failure( + SseDeserializer deserializer, + ); + + @protected + CloudSyncProtectedGarbageCollection + sse_decode_box_autoadd_cloud_sync_protected_garbage_collection( + SseDeserializer deserializer, + ); + + @protected + CloudSyncProtectedOutboundStage + sse_decode_box_autoadd_cloud_sync_protected_outbound_stage( + SseDeserializer deserializer, + ); + + @protected + CloudSyncProtectedPage sse_decode_box_autoadd_cloud_sync_protected_page( + SseDeserializer deserializer, + ); + + @protected + CloudSyncProtectedPreflightCode + sse_decode_box_autoadd_cloud_sync_protected_preflight_code( + SseDeserializer deserializer, + ); + + @protected + CloudSyncProtectedRecovery + sse_decode_box_autoadd_cloud_sync_protected_recovery( + SseDeserializer deserializer, + ); + + @protected + CloudSyncRawFailure sse_decode_box_autoadd_cloud_sync_raw_failure( + SseDeserializer deserializer, + ); + + @protected + CloudSyncRawPage sse_decode_box_autoadd_cloud_sync_raw_page( + SseDeserializer deserializer, + ); + + @protected + CloudSyncRawSystemFields sse_decode_box_autoadd_cloud_sync_raw_system_fields( + SseDeserializer deserializer, + ); + + @protected + CloudSyncTransientAttachmentPayload + sse_decode_box_autoadd_cloud_sync_transient_attachment_payload( + SseDeserializer deserializer, + ); + + @protected + CloudSyncTransientChatPayload + sse_decode_box_autoadd_cloud_sync_transient_chat_payload( + SseDeserializer deserializer, + ); + + @protected + CloudSyncTransientDeferredReason + sse_decode_box_autoadd_cloud_sync_transient_deferred_reason( + SseDeserializer deserializer, + ); + + @protected + CloudSyncTransientEntityKind + sse_decode_box_autoadd_cloud_sync_transient_entity_kind( + SseDeserializer deserializer, + ); + + @protected + CloudSyncTransientFailureCode + sse_decode_box_autoadd_cloud_sync_transient_failure_code( + SseDeserializer deserializer, + ); + + @protected + CloudSyncTransientGroupPhotoPayload + sse_decode_box_autoadd_cloud_sync_transient_group_photo_payload( + SseDeserializer deserializer, + ); + + @protected + CloudSyncTransientMessagePayload + sse_decode_box_autoadd_cloud_sync_transient_message_payload( + SseDeserializer deserializer, + ); + + @protected + CloudSyncTransientMutationKind + sse_decode_box_autoadd_cloud_sync_transient_mutation_kind( + SseDeserializer deserializer, + ); + + @protected + CloudSyncTransientPayload sse_decode_box_autoadd_cloud_sync_transient_payload( + SseDeserializer deserializer, + ); + + @protected + CloudSyncTransientQuarantineReason + sse_decode_box_autoadd_cloud_sync_transient_quarantine_reason( + SseDeserializer deserializer, + ); + + @protected + CloudSyncTransientReactionKind + sse_decode_box_autoadd_cloud_sync_transient_reaction_kind( + SseDeserializer deserializer, + ); + + @protected + CloudSyncTransientSnapshot + sse_decode_box_autoadd_cloud_sync_transient_snapshot( + SseDeserializer deserializer, + ); + + @protected + CloudSyncTransientTombstone + sse_decode_box_autoadd_cloud_sync_transient_tombstone( + SseDeserializer deserializer, + ); + + @protected + ConversationData sse_decode_box_autoadd_conversation_data( + SseDeserializer deserializer, + ); + + @protected + DartBeaconShareInfo sse_decode_box_autoadd_dart_beacon_share_info( + SseDeserializer deserializer, + ); + + @protected + EditMessage sse_decode_box_autoadd_edit_message(SseDeserializer deserializer); + + @protected + ErrorMessage sse_decode_box_autoadd_error_message( + SseDeserializer deserializer, + ); + + @protected + ExtensionApp sse_decode_box_autoadd_extension_app( + SseDeserializer deserializer, + ); + + @protected + double sse_decode_box_autoadd_f_64(SseDeserializer deserializer); + + @protected + FTMessage sse_decode_box_autoadd_ft_message(SseDeserializer deserializer); + + @protected + FTMode sse_decode_box_autoadd_ft_mode(SseDeserializer deserializer); + + @protected + HwExtra sse_decode_box_autoadd_hw_extra(SseDeserializer deserializer); + + @protected + int sse_decode_box_autoadd_i_32(SseDeserializer deserializer); + + @protected + PlatformInt64 sse_decode_box_autoadd_i_64(SseDeserializer deserializer); + + @protected + IMessageNicknameRecord sse_decode_box_autoadd_i_message_nickname_record( + SseDeserializer deserializer, + ); + + @protected + IMessagePosterRecord sse_decode_box_autoadd_i_message_poster_record( + SseDeserializer deserializer, + ); + + @protected + IconChangeMessage sse_decode_box_autoadd_icon_change_message( + SseDeserializer deserializer, + ); + + @protected + IdmsCircleMessage sse_decode_box_autoadd_idms_circle_message( + SseDeserializer deserializer, + ); + + @protected + IdmsMessage sse_decode_box_autoadd_idms_message(SseDeserializer deserializer); + + @protected + IdmsRequestedSignIn sse_decode_box_autoadd_idms_requested_sign_in( + SseDeserializer deserializer, + ); + + @protected + LetMeInRequest sse_decode_box_autoadd_let_me_in_request( + SseDeserializer deserializer, + ); + + @protected + LinkMeta sse_decode_box_autoadd_link_meta(SseDeserializer deserializer); + + @protected + Location sse_decode_box_autoadd_location(SseDeserializer deserializer); + + @protected + LoginState sse_decode_box_autoadd_login_state(SseDeserializer deserializer); + + @protected + LPIconMetadata sse_decode_box_autoadd_lp_icon_metadata( + SseDeserializer deserializer, + ); + + @protected + LPImageMetadata sse_decode_box_autoadd_lp_image_metadata( + SseDeserializer deserializer, + ); + + @protected + LPSpecializationMetadata sse_decode_box_autoadd_lp_specialization_metadata( + SseDeserializer deserializer, + ); + + @protected + MemojiData sse_decode_box_autoadd_memoji_data(SseDeserializer deserializer); + + @protected + Message sse_decode_box_autoadd_message(SseDeserializer deserializer); + + @protected + MessageInst sse_decode_box_autoadd_message_inst(SseDeserializer deserializer); + + @protected + MessageParts sse_decode_box_autoadd_message_parts( + SseDeserializer deserializer, + ); + + @protected + MessageProto sse_decode_box_autoadd_message_proto( + SseDeserializer deserializer, + ); + + @protected + MessageProto2 sse_decode_box_autoadd_message_proto_2( + SseDeserializer deserializer, + ); + + @protected + MessageProto3 sse_decode_box_autoadd_message_proto_3( + SseDeserializer deserializer, + ); + + @protected + MessageProto4 sse_decode_box_autoadd_message_proto_4( + SseDeserializer deserializer, + ); + + @protected + MessageSummaryInfo sse_decode_box_autoadd_message_summary_info( + SseDeserializer deserializer, + ); + + @protected + MMCSAttachmentMeta sse_decode_box_autoadd_mmcs_attachment_meta( + SseDeserializer deserializer, + ); + + @protected + MMCSFile sse_decode_box_autoadd_mmcs_file(SseDeserializer deserializer); + + @protected + MonogramData sse_decode_box_autoadd_monogram_data( + SseDeserializer deserializer, + ); + + @protected + MoveToRecycleBinMessage sse_decode_box_autoadd_move_to_recycle_bin_message( + SseDeserializer deserializer, + ); + + @protected + NormalMessage sse_decode_box_autoadd_normal_message( + SseDeserializer deserializer, + ); + + @protected + NSAttributedString sse_decode_box_autoadd_ns_attributed_string( + SseDeserializer deserializer, + ); + + @protected + NSNumber sse_decode_box_autoadd_ns_number(SseDeserializer deserializer); + + @protected + NSString sse_decode_box_autoadd_ns_string(SseDeserializer deserializer); + + @protected + NSURL sse_decode_box_autoadd_nsurl(SseDeserializer deserializer); + + @protected + NumOrString sse_decode_box_autoadd_num_or_string( + SseDeserializer deserializer, + ); + + @protected + OperatedChat sse_decode_box_autoadd_operated_chat( + SseDeserializer deserializer, + ); + + @protected + PartExtension sse_decode_box_autoadd_part_extension( + SseDeserializer deserializer, + ); + + @protected + Passkey sse_decode_box_autoadd_passkey(SseDeserializer deserializer); + + @protected + PasswordManagerMeta sse_decode_box_autoadd_password_manager_meta( + SseDeserializer deserializer, + ); + + @protected + PasswordManagerMetaData sse_decode_box_autoadd_password_manager_meta_data( + SseDeserializer deserializer, + ); + + @protected + PasswordManagerMetaDataFormerlyShared + sse_decode_box_autoadd_password_manager_meta_data_formerly_shared( + SseDeserializer deserializer, + ); + + @protected + PasswordManagerTotp sse_decode_box_autoadd_password_manager_totp( + SseDeserializer deserializer, + ); + + @protected + PasswordRawEntry sse_decode_box_autoadd_password_raw_entry( + SseDeserializer deserializer, + ); + + @protected + PermanentDeleteMessage sse_decode_box_autoadd_permanent_delete_message( + SseDeserializer deserializer, + ); + + @protected + PosterColor sse_decode_box_autoadd_poster_color(SseDeserializer deserializer); + + @protected + PRPosterContentMaterialStyle + sse_decode_box_autoadd_pr_poster_content_material_style( + SseDeserializer deserializer, + ); + + @protected + PushMessage sse_decode_box_autoadd_push_message(SseDeserializer deserializer); + + @protected + ReactMessage sse_decode_box_autoadd_react_message( + SseDeserializer deserializer, + ); + + @protected + Reaction sse_decode_box_autoadd_reaction(SseDeserializer deserializer); + + @protected + (SharedPushState, ApsWatcher) + sse_decode_box_autoadd_record_shared_push_state_auto_owned_rust_opaque_flutter_rust_bridgefor_generated_rust_auto_opaque_inner_aps_watcher( + SseDeserializer deserializer, + ); + + @protected + (String, String) sse_decode_box_autoadd_record_string_string( + SseDeserializer deserializer, + ); + + @protected + (String, BigInt) sse_decode_box_autoadd_record_string_u_64( + SseDeserializer deserializer, + ); + + @protected + RegisterState sse_decode_box_autoadd_register_state( + SseDeserializer deserializer, + ); + + @protected + RenameMessage sse_decode_box_autoadd_rename_message( + SseDeserializer deserializer, + ); + + @protected + RichLinkImageAttachmentSubstitute + sse_decode_box_autoadd_rich_link_image_attachment_substitute( + SseDeserializer deserializer, + ); + + @protected + ScheduleMode sse_decode_box_autoadd_schedule_mode( + SseDeserializer deserializer, + ); + + @protected + SetTranscriptBackgroundMessage + sse_decode_box_autoadd_set_transcript_background_message( + SseDeserializer deserializer, + ); + + @protected + ShareProfileMessage sse_decode_box_autoadd_share_profile_message( + SseDeserializer deserializer, + ); + + @protected + SharedAlbum sse_decode_box_autoadd_shared_album(SseDeserializer deserializer); + + @protected + SharedICloudServices sse_decode_box_autoadd_shared_i_cloud_services( + SseDeserializer deserializer, + ); + + @protected + SharedPoster sse_decode_box_autoadd_shared_poster( + SseDeserializer deserializer, + ); + + @protected + SharedPushState sse_decode_box_autoadd_shared_push_state( + SseDeserializer deserializer, + ); + + @protected + SimplifiedIncomingCallPoster + sse_decode_box_autoadd_simplified_incoming_call_poster( + SseDeserializer deserializer, + ); + + @protected + SimplifiedTranscriptPoster + sse_decode_box_autoadd_simplified_transcript_poster( + SseDeserializer deserializer, + ); + + @protected + StatusKitMessage sse_decode_box_autoadd_status_kit_message( + SseDeserializer deserializer, + ); + + @protected + SupportAction sse_decode_box_autoadd_support_action( + SseDeserializer deserializer, + ); + + @protected + SupportAlert sse_decode_box_autoadd_support_alert( + SseDeserializer deserializer, + ); + + @protected + TeardownSignIn sse_decode_box_autoadd_teardown_sign_in( + SseDeserializer deserializer, + ); + + @protected + TextFlags sse_decode_box_autoadd_text_flags(SseDeserializer deserializer); + + @protected + TextFormat sse_decode_box_autoadd_text_format(SseDeserializer deserializer); + + @protected + TranscriptDynamicUserData sse_decode_box_autoadd_transcript_dynamic_user_data( + SseDeserializer deserializer, + ); + + @protected + TypingApp sse_decode_box_autoadd_typing_app(SseDeserializer deserializer); + + @protected + int sse_decode_box_autoadd_u_16(SseDeserializer deserializer); + + @protected + int sse_decode_box_autoadd_u_32(SseDeserializer deserializer); + + @protected + BigInt sse_decode_box_autoadd_u_64(SseDeserializer deserializer); + + @protected + UnsendMessage sse_decode_box_autoadd_unsend_message( + SseDeserializer deserializer, + ); + + @protected + UpdateAccountFinish sse_decode_box_autoadd_update_account_finish( + SseDeserializer deserializer, + ); + + @protected + UpdateExtensionMessage sse_decode_box_autoadd_update_extension_message( + SseDeserializer deserializer, + ); + + @protected + UpdateProfileMessage sse_decode_box_autoadd_update_profile_message( + SseDeserializer deserializer, + ); + + @protected + UpdateProfileSharingMessage + sse_decode_box_autoadd_update_profile_sharing_message( + SseDeserializer deserializer, + ); + + @protected + WifiPassword sse_decode_box_autoadd_wifi_password( + SseDeserializer deserializer, + ); + + @protected + CertifiedContext sse_decode_certified_context(SseDeserializer deserializer); + + @protected + ChangeParticipantMessage sse_decode_change_participant_message( + SseDeserializer deserializer, + ); + + @protected + ChatProto sse_decode_chat_proto(SseDeserializer deserializer); + + @protected + CloudAttachment sse_decode_cloud_attachment(SseDeserializer deserializer); + + @protected + CloudChat sse_decode_cloud_chat(SseDeserializer deserializer); + + @protected + CloudMessage sse_decode_cloud_message(SseDeserializer deserializer); + + @protected + CloudMessageSummary sse_decode_cloud_message_summary( + SseDeserializer deserializer, + ); + + @protected + CloudParticipant sse_decode_cloud_participant(SseDeserializer deserializer); + + @protected + CloudProp sse_decode_cloud_prop(SseDeserializer deserializer); + + @protected + CloudProp001 sse_decode_cloud_prop_001(SseDeserializer deserializer); + + @protected + CloudSyncNativeAuthMetadata sse_decode_cloud_sync_native_auth_metadata( + SseDeserializer deserializer, + ); + + @protected + CloudSyncOutboundConsumeResult sse_decode_cloud_sync_outbound_consume_result( + SseDeserializer deserializer, + ); + + @protected + CloudSyncOutboundFailureClass sse_decode_cloud_sync_outbound_failure_class( + SseDeserializer deserializer, + ); + + @protected + CloudSyncOutboundReconcileDisposition + sse_decode_cloud_sync_outbound_reconcile_disposition( + SseDeserializer deserializer, + ); + + @protected + CloudSyncOutboundReconcileResult + sse_decode_cloud_sync_outbound_reconcile_result(SseDeserializer deserializer); + + @protected + CloudSyncOutboundSafeCode sse_decode_cloud_sync_outbound_safe_code( + SseDeserializer deserializer, + ); + + @protected + CloudSyncOutboundSaveDisposition + sse_decode_cloud_sync_outbound_save_disposition(SseDeserializer deserializer); + + @protected + CloudSyncOutboundSaveOutcome sse_decode_cloud_sync_outbound_save_outcome( + SseDeserializer deserializer, + ); + + @protected + CloudSyncPreparedMessageCreateInput + sse_decode_cloud_sync_prepared_message_create_input( + SseDeserializer deserializer, + ); + + @protected + CloudSyncPreparedMessageCreateResult + sse_decode_cloud_sync_prepared_message_create_result( + SseDeserializer deserializer, + ); + + @protected + CloudSyncProtectedChange sse_decode_cloud_sync_protected_change( + SseDeserializer deserializer, + ); + + @protected + CloudSyncProtectedChangeKind sse_decode_cloud_sync_protected_change_kind( + SseDeserializer deserializer, + ); + + @protected + CloudSyncProtectedFailure sse_decode_cloud_sync_protected_failure( + SseDeserializer deserializer, + ); + + @protected + CloudSyncProtectedFailureCategory + sse_decode_cloud_sync_protected_failure_category( + SseDeserializer deserializer, + ); + + @protected + CloudSyncProtectedFetchResult sse_decode_cloud_sync_protected_fetch_result( + SseDeserializer deserializer, + ); + + @protected + CloudSyncProtectedGarbageCollection + sse_decode_cloud_sync_protected_garbage_collection( + SseDeserializer deserializer, + ); + + @protected + CloudSyncProtectedGarbageCollectionResult + sse_decode_cloud_sync_protected_garbage_collection_result( + SseDeserializer deserializer, + ); + + @protected + CloudSyncProtectedLeaseResult sse_decode_cloud_sync_protected_lease_result( + SseDeserializer deserializer, + ); + + @protected + CloudSyncProtectedOutboundStage + sse_decode_cloud_sync_protected_outbound_stage(SseDeserializer deserializer); + + @protected + CloudSyncProtectedOutboundStageResult + sse_decode_cloud_sync_protected_outbound_stage_result( + SseDeserializer deserializer, + ); + + @protected + CloudSyncProtectedPage sse_decode_cloud_sync_protected_page( + SseDeserializer deserializer, + ); + + @protected + CloudSyncProtectedPreflightCode + sse_decode_cloud_sync_protected_preflight_code(SseDeserializer deserializer); + + @protected + CloudSyncProtectedRecovery sse_decode_cloud_sync_protected_recovery( + SseDeserializer deserializer, + ); + + @protected + CloudSyncProtectedRecoveryResult + sse_decode_cloud_sync_protected_recovery_result(SseDeserializer deserializer); + + @protected + CloudSyncProtectedRetirementResult + sse_decode_cloud_sync_protected_retirement_result( + SseDeserializer deserializer, + ); + + @protected + CloudSyncProtectedSafeCode sse_decode_cloud_sync_protected_safe_code( + SseDeserializer deserializer, + ); + + @protected + CloudSyncRawChange sse_decode_cloud_sync_raw_change( + SseDeserializer deserializer, + ); + + @protected + CloudSyncRawFailure sse_decode_cloud_sync_raw_failure( + SseDeserializer deserializer, + ); + + @protected + CloudSyncRawFailureCategory sse_decode_cloud_sync_raw_failure_category( + SseDeserializer deserializer, + ); + + @protected + CloudSyncRawFetchResult sse_decode_cloud_sync_raw_fetch_result( + SseDeserializer deserializer, + ); + + @protected + CloudSyncRawPage sse_decode_cloud_sync_raw_page(SseDeserializer deserializer); + + @protected + CloudSyncRawRecordKind sse_decode_cloud_sync_raw_record_kind( + SseDeserializer deserializer, + ); + + @protected + CloudSyncRawSystemFields sse_decode_cloud_sync_raw_system_fields( + SseDeserializer deserializer, + ); + + @protected + CloudSyncTransientAssociationKind + sse_decode_cloud_sync_transient_association_kind( + SseDeserializer deserializer, + ); + + @protected + CloudSyncTransientAttachmentPayload + sse_decode_cloud_sync_transient_attachment_payload( + SseDeserializer deserializer, + ); + + @protected + CloudSyncTransientAttributedBody + sse_decode_cloud_sync_transient_attributed_body(SseDeserializer deserializer); + + @protected + CloudSyncTransientChatPayload sse_decode_cloud_sync_transient_chat_payload( + SseDeserializer deserializer, + ); + + @protected + CloudSyncTransientChatStyle sse_decode_cloud_sync_transient_chat_style( + SseDeserializer deserializer, + ); + + @protected + CloudSyncTransientDecodeResult sse_decode_cloud_sync_transient_decode_result( + SseDeserializer deserializer, + ); + + @protected + CloudSyncTransientDeferredReason + sse_decode_cloud_sync_transient_deferred_reason(SseDeserializer deserializer); + + @protected + CloudSyncTransientEditPart sse_decode_cloud_sync_transient_edit_part( + SseDeserializer deserializer, + ); + + @protected + CloudSyncTransientEntityKind sse_decode_cloud_sync_transient_entity_kind( + SseDeserializer deserializer, + ); + + @protected + CloudSyncTransientFailureCode sse_decode_cloud_sync_transient_failure_code( + SseDeserializer deserializer, + ); + + @protected + CloudSyncTransientFieldState sse_decode_cloud_sync_transient_field_state( + SseDeserializer deserializer, + ); + + @protected + CloudSyncTransientGroupPhotoPayload + sse_decode_cloud_sync_transient_group_photo_payload( + SseDeserializer deserializer, + ); + + @protected + CloudSyncTransientKnownMessageFlags + sse_decode_cloud_sync_transient_known_message_flags( + SseDeserializer deserializer, + ); + + @protected + CloudSyncTransientMessageEdit sse_decode_cloud_sync_transient_message_edit( + SseDeserializer deserializer, + ); + + @protected + CloudSyncTransientMessagePayload + sse_decode_cloud_sync_transient_message_payload(SseDeserializer deserializer); + + @protected + CloudSyncTransientMutationKind sse_decode_cloud_sync_transient_mutation_kind( + SseDeserializer deserializer, + ); + + @protected + CloudSyncTransientPayload sse_decode_cloud_sync_transient_payload( + SseDeserializer deserializer, + ); + + @protected + CloudSyncTransientQuarantineReason + sse_decode_cloud_sync_transient_quarantine_reason( + SseDeserializer deserializer, + ); + + @protected + CloudSyncTransientReactionKind sse_decode_cloud_sync_transient_reaction_kind( + SseDeserializer deserializer, + ); + + @protected + CloudSyncTransientService sse_decode_cloud_sync_transient_service( + SseDeserializer deserializer, + ); + + @protected + CloudSyncTransientSnapshot sse_decode_cloud_sync_transient_snapshot( + SseDeserializer deserializer, + ); + + @protected + CloudSyncTransientTextRun sse_decode_cloud_sync_transient_text_run( + SseDeserializer deserializer, + ); + + @protected + CloudSyncTransientTombstone sse_decode_cloud_sync_transient_tombstone( + SseDeserializer deserializer, + ); + + @protected + ConversationData sse_decode_conversation_data(SseDeserializer deserializer); + + @protected + DartBeacon sse_decode_dart_beacon(SseDeserializer deserializer); + + @protected + DartBeaconShareInfo sse_decode_dart_beacon_share_info( + SseDeserializer deserializer, + ); + + @protected + DeleteTarget sse_decode_delete_target(SseDeserializer deserializer); + + @protected + DeviceInfo sse_decode_device_info(SseDeserializer deserializer); + + @protected + EditMessage sse_decode_edit_message(SseDeserializer deserializer); + + @protected + ErrorMessage sse_decode_error_message(SseDeserializer deserializer); + + @protected + ExtensionApp sse_decode_extension_app(SseDeserializer deserializer); + + @protected + double sse_decode_f_32(SseDeserializer deserializer); + + @protected + double sse_decode_f_64(SseDeserializer deserializer); + + @protected + FFIFilePackager sse_decode_ffi_file_packager(SseDeserializer deserializer); + + @protected + Follow sse_decode_follow(SseDeserializer deserializer); + + @protected + FoundDevice sse_decode_found_device(SseDeserializer deserializer); + + @protected + FTMember sse_decode_ft_member(SseDeserializer deserializer); + + @protected + FTMessage sse_decode_ft_message(SseDeserializer deserializer); + + @protected + FTMode sse_decode_ft_mode(SseDeserializer deserializer); + + @protected + FTParticipant sse_decode_ft_participant(SseDeserializer deserializer); + + @protected + FTSession sse_decode_ft_session(SseDeserializer deserializer); + + @protected + GroupSummary sse_decode_group_summary(SseDeserializer deserializer); + + @protected + GroupSummaryMember sse_decode_group_summary_member( + SseDeserializer deserializer, + ); + + @protected + HwExtra sse_decode_hw_extra(SseDeserializer deserializer); + + @protected + int sse_decode_i_32(SseDeserializer deserializer); + + @protected + PlatformInt64 sse_decode_i_64(SseDeserializer deserializer); + + @protected + IMessageNameRecord sse_decode_i_message_name_record( + SseDeserializer deserializer, + ); + + @protected + IMessageNicknameRecord sse_decode_i_message_nickname_record( + SseDeserializer deserializer, + ); + + @protected + IMessagePosterRecord sse_decode_i_message_poster_record( + SseDeserializer deserializer, + ); + + @protected + IconChangeMessage sse_decode_icon_change_message( + SseDeserializer deserializer, + ); + + @protected + IdmsCircleMessage sse_decode_idms_circle_message( + SseDeserializer deserializer, + ); + + @protected + IdmsMessage sse_decode_idms_message(SseDeserializer deserializer); + + @protected + IdmsRequestedSignIn sse_decode_idms_requested_sign_in( + SseDeserializer deserializer, + ); + + @protected + IndexedMessagePart sse_decode_indexed_message_part( + SseDeserializer deserializer, + ); + + @protected + LetMeInRequest sse_decode_let_me_in_request(SseDeserializer deserializer); + + @protected + LinkMeta sse_decode_link_meta(SseDeserializer deserializer); + + @protected + List + sse_decode_list_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerIDSUser( + SseDeserializer deserializer, + ); + + @protected + List + sse_decode_list_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerStCollapsedValue( + SseDeserializer deserializer, + ); + + @protected + List + sse_decode_list_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerViableBottle( + SseDeserializer deserializer, + ); + + @protected + List sse_decode_list_String(SseDeserializer deserializer); + + @protected + List sse_decode_list_cloud_participant( + SseDeserializer deserializer, + ); + + @protected + List + sse_decode_list_cloud_sync_outbound_save_outcome( + SseDeserializer deserializer, + ); + + @protected + List + sse_decode_list_cloud_sync_prepared_message_create_input( + SseDeserializer deserializer, + ); + + @protected + List sse_decode_list_cloud_sync_protected_change( + SseDeserializer deserializer, + ); + + @protected + List sse_decode_list_cloud_sync_raw_change( + SseDeserializer deserializer, + ); + + @protected + List + sse_decode_list_cloud_sync_transient_attributed_body( + SseDeserializer deserializer, + ); + + @protected + List + sse_decode_list_cloud_sync_transient_edit_part(SseDeserializer deserializer); + + @protected + List + sse_decode_list_cloud_sync_transient_message_edit( + SseDeserializer deserializer, + ); + + @protected + List sse_decode_list_cloud_sync_transient_text_run( + SseDeserializer deserializer, + ); + + @protected + List sse_decode_list_dart_beacon(SseDeserializer deserializer); + + @protected + List sse_decode_list_follow(SseDeserializer deserializer); + + @protected + List sse_decode_list_found_device(SseDeserializer deserializer); + + @protected + List sse_decode_list_ft_member(SseDeserializer deserializer); + + @protected + List sse_decode_list_ft_session(SseDeserializer deserializer); + + @protected + List sse_decode_list_group_summary_member( + SseDeserializer deserializer, + ); + + @protected + List sse_decode_list_indexed_message_part( + SseDeserializer deserializer, + ); + + @protected + List sse_decode_list_list_prim_u_8_strict( + SseDeserializer deserializer, + ); + + @protected + List sse_decode_list_message_edit(SseDeserializer deserializer); + + @protected + List sse_decode_list_message_target( + SseDeserializer deserializer, + ); + + @protected + List sse_decode_list_password_manager_alt_domain( + SseDeserializer deserializer, + ); + + @protected + List sse_decode_list_password_manager_meta_change( + SseDeserializer deserializer, + ); + + @protected + List sse_decode_list_photo_poster_layer( + SseDeserializer deserializer, + ); + + @protected + List sse_decode_list_poster_asset(SseDeserializer deserializer); + + @protected + List sse_decode_list_poster_color(SseDeserializer deserializer); + + @protected + Float64List sse_decode_list_prim_f_64_strict(SseDeserializer deserializer); + + @protected + Int64List sse_decode_list_prim_i_64_strict(SseDeserializer deserializer); + + @protected + Uint32List sse_decode_list_prim_u_32_strict(SseDeserializer deserializer); + + @protected + List sse_decode_list_prim_u_8_loose(SseDeserializer deserializer); + + @protected + Uint8List sse_decode_list_prim_u_8_strict(SseDeserializer deserializer); + + @protected + List sse_decode_list_private_device_info( + SseDeserializer deserializer, + ); + + @protected + List<(String, Asset)> + sse_decode_list_record_string_auto_owned_rust_opaque_flutter_rust_bridgefor_generated_rust_auto_opaque_inner_asset( + SseDeserializer deserializer, + ); + + @protected + List<(String, StCollapsedValue)> + sse_decode_list_record_string_auto_owned_rust_opaque_flutter_rust_bridgefor_generated_rust_auto_opaque_inner_st_collapsed_value( + SseDeserializer deserializer, + ); + + @protected + List<(String, bool)> sse_decode_list_record_string_bool( + SseDeserializer deserializer, + ); + + @protected + List<(String, int)> sse_decode_list_record_string_casted_primitive_u_64( + SseDeserializer deserializer, + ); + + @protected + List<(String, CloudAttachment)> + sse_decode_list_record_string_cloud_attachment(SseDeserializer deserializer); + + @protected + List<(String, CloudChat)> sse_decode_list_record_string_cloud_chat( + SseDeserializer deserializer, + ); + + @protected + List<(String, CloudMessage)> sse_decode_list_record_string_cloud_message( + SseDeserializer deserializer, + ); + + @protected + List<(String, FTParticipant)> sse_decode_list_record_string_ft_participant( + SseDeserializer deserializer, + ); + + @protected + List<(String, GroupSummary)> sse_decode_list_record_string_group_summary( + SseDeserializer deserializer, + ); + + @protected + List<(String, List)> + sse_decode_list_record_string_list_message_edit(SseDeserializer deserializer); + + @protected + List<(String, Uint8List)> sse_decode_list_record_string_list_prim_u_8_strict( + SseDeserializer deserializer, + ); + + @protected + List<(String, MessageEditRange)> + sse_decode_list_record_string_message_edit_range( + SseDeserializer deserializer, + ); + + @protected + List<(String, CloudAttachment?)> + sse_decode_list_record_string_opt_box_autoadd_cloud_attachment( + SseDeserializer deserializer, + ); + + @protected + List<(String, CloudChat?)> + sse_decode_list_record_string_opt_box_autoadd_cloud_chat( + SseDeserializer deserializer, + ); + + @protected + List<(String, CloudMessage?)> + sse_decode_list_record_string_opt_box_autoadd_cloud_message( + SseDeserializer deserializer, + ); + + @protected + List<(String, PasswordManagerMetaDataCtx)> + sse_decode_list_record_string_password_manager_meta_data_ctx( + SseDeserializer deserializer, + ); + + @protected + List<(String, (String?, Passkey))> + sse_decode_list_record_string_record_opt_string_passkey( + SseDeserializer deserializer, + ); + + @protected + List<(String, (String?, PasswordManagerMeta))> + sse_decode_list_record_string_record_opt_string_password_manager_meta( + SseDeserializer deserializer, + ); + + @protected + List<(String, (String?, PasswordRawEntry))> + sse_decode_list_record_string_record_opt_string_password_raw_entry( + SseDeserializer deserializer, + ); + + @protected + List<(String, (String?, WifiPassword))> + sse_decode_list_record_string_record_opt_string_wifi_password( + SseDeserializer deserializer, + ); + + @protected + List<(String, ShareInviteContentData)> + sse_decode_list_record_string_share_invite_content_data( + SseDeserializer deserializer, + ); + + @protected + List<(String, StatusKitPersonalConfig)> + sse_decode_list_record_string_status_kit_personal_config( + SseDeserializer deserializer, + ); + + @protected + List<(String, String)> sse_decode_list_record_string_string( + SseDeserializer deserializer, + ); + + @protected + List<(String, SyncStatus)> sse_decode_list_record_string_sync_status( + SseDeserializer deserializer, + ); + + @protected + List<(int, NSDictionaryTypedCoder)> + sse_decode_list_record_u_32_ns_dictionary_typed_coder( + SseDeserializer deserializer, + ); + + @protected + List sse_decode_list_report_message( + SseDeserializer deserializer, + ); + + @protected + List sse_decode_list_shared_album(SseDeserializer deserializer); + + @protected + List sse_decode_list_trusted_phone_number( + SseDeserializer deserializer, + ); + + @protected + List sse_decode_list_ui_color(SseDeserializer deserializer); + + @protected + Location sse_decode_location(SseDeserializer deserializer); + + @protected + LoginState sse_decode_login_state(SseDeserializer deserializer); + + @protected + LPIconMetadata sse_decode_lp_icon_metadata(SseDeserializer deserializer); + + @protected + LPImageMetadata sse_decode_lp_image_metadata(SseDeserializer deserializer); + + @protected + LPLinkMetadata sse_decode_lp_link_metadata(SseDeserializer deserializer); + + @protected + LPSpecializationMetadata sse_decode_lp_specialization_metadata( + SseDeserializer deserializer, + ); + + @protected + MemojiData sse_decode_memoji_data(SseDeserializer deserializer); + + @protected + Message sse_decode_message(SseDeserializer deserializer); + + @protected + MessageEdit sse_decode_message_edit(SseDeserializer deserializer); + + @protected + MessageEditRange sse_decode_message_edit_range(SseDeserializer deserializer); + + @protected + MessageInst sse_decode_message_inst(SseDeserializer deserializer); + + @protected + MessagePart sse_decode_message_part(SseDeserializer deserializer); + + @protected + MessageParts sse_decode_message_parts(SseDeserializer deserializer); + + @protected + MessageProto sse_decode_message_proto(SseDeserializer deserializer); + + @protected + MessageProto2 sse_decode_message_proto_2(SseDeserializer deserializer); + + @protected + MessageProto3 sse_decode_message_proto_3(SseDeserializer deserializer); + + @protected + MessageProto4 sse_decode_message_proto_4(SseDeserializer deserializer); + + @protected + MessageSummaryInfo sse_decode_message_summary_info( + SseDeserializer deserializer, + ); + + @protected + MessageTarget sse_decode_message_target(SseDeserializer deserializer); + + @protected + MessageType sse_decode_message_type(SseDeserializer deserializer); + + @protected + MMCSAttachmentMeta sse_decode_mmcs_attachment_meta( + SseDeserializer deserializer, + ); + + @protected + MMCSFile sse_decode_mmcs_file(SseDeserializer deserializer); + + @protected + MMCSTransferProgress sse_decode_mmcs_transfer_progress( + SseDeserializer deserializer, + ); + + @protected + MonogramData sse_decode_monogram_data(SseDeserializer deserializer); + + @protected + MoveToRecycleBinMessage sse_decode_move_to_recycle_bin_message( + SseDeserializer deserializer, + ); + + @protected + MyAsyncRuntime sse_decode_my_async_runtime(SseDeserializer deserializer); + + @protected + NormalMessage sse_decode_normal_message(SseDeserializer deserializer); + + @protected + NSAttributedString sse_decode_ns_attributed_string( + SseDeserializer deserializer, + ); + + @protected + NSDictionaryClass sse_decode_ns_dictionary_class( + SseDeserializer deserializer, + ); + + @protected + NSDictionaryTypedCoder sse_decode_ns_dictionary_typed_coder( + SseDeserializer deserializer, + ); + + @protected + NSNumber sse_decode_ns_number(SseDeserializer deserializer); + + @protected + NSString sse_decode_ns_string(SseDeserializer deserializer); + + @protected + NSURL sse_decode_nsurl(SseDeserializer deserializer); + + @protected + NumOrString sse_decode_num_or_string(SseDeserializer deserializer); + + @protected + OperatedChat sse_decode_operated_chat(SseDeserializer deserializer); + + @protected + int? sse_decode_opt_CastedPrimitive_i_64(SseDeserializer deserializer); + + @protected + int? sse_decode_opt_CastedPrimitive_u_64(SseDeserializer deserializer); + + @protected + int? sse_decode_opt_CastedPrimitive_usize(SseDeserializer deserializer); + + @protected + String? sse_decode_opt_String(SseDeserializer deserializer); + + @protected + ApsState? + sse_decode_opt_box_autoadd_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerAPSState( + SseDeserializer deserializer, + ); + + @protected + ArcCloudKitClientDefaultAnisetteProvider? + sse_decode_opt_box_autoadd_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcCloudKitClientDefaultAnisetteProvider( + SseDeserializer deserializer, + ); + + @protected + ArcCloudMessagesClientDefaultAnisetteProvider? + sse_decode_opt_box_autoadd_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcCloudMessagesClientDefaultAnisetteProvider( + SseDeserializer deserializer, + ); + + @protected + ArcFindMyClientDefaultAnisetteProvider? + sse_decode_opt_box_autoadd_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcFindMyClientDefaultAnisetteProvider( + SseDeserializer deserializer, + ); + + @protected + ArcKeychainClientDefaultAnisetteProvider? + sse_decode_opt_box_autoadd_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcKeychainClientDefaultAnisetteProvider( + SseDeserializer deserializer, + ); + + @protected + ArcMutexAppleAccountDefaultAnisetteProvider? + sse_decode_opt_box_autoadd_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcMutexAppleAccountDefaultAnisetteProvider( + SseDeserializer deserializer, + ); + + @protected + ArcPasswordManagerDefaultAnisetteProvider? + sse_decode_opt_box_autoadd_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcPasswordManagerDefaultAnisetteProvider( + SseDeserializer deserializer, + ); + + @protected + Asset? + sse_decode_opt_box_autoadd_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerAsset( + SseDeserializer deserializer, + ); + + @protected + ChannelInterestToken? + sse_decode_opt_box_autoadd_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerChannelInterestToken( + SseDeserializer deserializer, + ); + + @protected + CircleClientSessionDefaultAnisetteProvider? + sse_decode_opt_box_autoadd_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerCircleClientSessionDefaultAnisetteProvider( + SseDeserializer deserializer, + ); + + @protected + CloudSyncPreparedMessageCreateHandle? + sse_decode_opt_box_autoadd_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerCloudSyncPreparedMessageCreateHandle( + SseDeserializer deserializer, + ); + + @protected + ConversationLink? + sse_decode_opt_box_autoadd_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerConversationLink( + SseDeserializer deserializer, + ); + + @protected + ConversationParticipant? + sse_decode_opt_box_autoadd_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerConversationParticipant( + SseDeserializer deserializer, + ); + + @protected + Date? + sse_decode_opt_box_autoadd_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerDate( + SseDeserializer deserializer, + ); + + @protected + GZipWrapperChatProto? + sse_decode_opt_box_autoadd_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerGZipWrapperChatProto( + SseDeserializer deserializer, + ); + + @protected + GZipWrapperMessageProto2? + sse_decode_opt_box_autoadd_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerGZipWrapperMessageProto2( + SseDeserializer deserializer, + ); + + @protected + GZipWrapperMessageProto3? + sse_decode_opt_box_autoadd_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerGZipWrapperMessageProto3( + SseDeserializer deserializer, + ); + + @protected + GZipWrapperMessageProto4? + sse_decode_opt_box_autoadd_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerGZipWrapperMessageProto4( + SseDeserializer deserializer, + ); + + @protected + IdsUser? + sse_decode_opt_box_autoadd_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerIDSUser( + SseDeserializer deserializer, + ); + + @protected + LocationReport? + sse_decode_opt_box_autoadd_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerLocationReport( + SseDeserializer deserializer, + ); + + @protected + NsArrayLpIconMetadata? + sse_decode_opt_box_autoadd_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerNSArrayLPIconMetadata( + SseDeserializer deserializer, + ); + + @protected + NsArrayLpImageMetadata? + sse_decode_opt_box_autoadd_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerNSArrayLPImageMetadata( + SseDeserializer deserializer, + ); + + @protected + PushError? + sse_decode_opt_box_autoadd_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerPushError( + SseDeserializer deserializer, + ); + + @protected + SavedHardwareState? + sse_decode_opt_box_autoadd_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerSavedHardwareState( + SseDeserializer deserializer, + ); + + @protected + SyncManagerDefaultAnisetteProviderMyFilePackager? + sse_decode_opt_box_autoadd_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerSyncManagerDefaultAnisetteProviderMyFilePackager( + SseDeserializer deserializer, + ); + + @protected + SystemTime? + sse_decode_opt_box_autoadd_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerSystemTime( + SseDeserializer deserializer, + ); + + @protected + Address? sse_decode_opt_box_autoadd_address(SseDeserializer deserializer); + + @protected + Attachment? sse_decode_opt_box_autoadd_attachment( + SseDeserializer deserializer, + ); + + @protected + AttachmentMetaExtra? sse_decode_opt_box_autoadd_attachment_meta_extra( + SseDeserializer deserializer, + ); + + @protected + Balloon? sse_decode_opt_box_autoadd_balloon(SseDeserializer deserializer); + + @protected + BalloonLayout? sse_decode_opt_box_autoadd_balloon_layout( + SseDeserializer deserializer, + ); + + @protected + bool? sse_decode_opt_box_autoadd_bool(SseDeserializer deserializer); + + @protected + CertifiedContext? sse_decode_opt_box_autoadd_certified_context( + SseDeserializer deserializer, + ); + + @protected + CloudAttachment? sse_decode_opt_box_autoadd_cloud_attachment( + SseDeserializer deserializer, + ); + + @protected + CloudChat? sse_decode_opt_box_autoadd_cloud_chat( + SseDeserializer deserializer, + ); + + @protected + CloudMessage? sse_decode_opt_box_autoadd_cloud_message( + SseDeserializer deserializer, + ); + + @protected + CloudProp? sse_decode_opt_box_autoadd_cloud_prop( + SseDeserializer deserializer, + ); + + @protected + CloudSyncOutboundFailureClass? + sse_decode_opt_box_autoadd_cloud_sync_outbound_failure_class( + SseDeserializer deserializer, + ); + + @protected + CloudSyncOutboundReconcileDisposition? + sse_decode_opt_box_autoadd_cloud_sync_outbound_reconcile_disposition( + SseDeserializer deserializer, + ); + + @protected + CloudSyncOutboundSafeCode? + sse_decode_opt_box_autoadd_cloud_sync_outbound_safe_code( + SseDeserializer deserializer, + ); + + @protected + CloudSyncProtectedFailure? + sse_decode_opt_box_autoadd_cloud_sync_protected_failure( + SseDeserializer deserializer, + ); + + @protected + CloudSyncProtectedGarbageCollection? + sse_decode_opt_box_autoadd_cloud_sync_protected_garbage_collection( + SseDeserializer deserializer, + ); + + @protected + CloudSyncProtectedOutboundStage? + sse_decode_opt_box_autoadd_cloud_sync_protected_outbound_stage( + SseDeserializer deserializer, + ); + + @protected + CloudSyncProtectedPage? sse_decode_opt_box_autoadd_cloud_sync_protected_page( + SseDeserializer deserializer, + ); + + @protected + CloudSyncProtectedPreflightCode? + sse_decode_opt_box_autoadd_cloud_sync_protected_preflight_code( + SseDeserializer deserializer, + ); + + @protected + CloudSyncProtectedRecovery? + sse_decode_opt_box_autoadd_cloud_sync_protected_recovery( + SseDeserializer deserializer, + ); + + @protected + CloudSyncRawFailure? sse_decode_opt_box_autoadd_cloud_sync_raw_failure( + SseDeserializer deserializer, + ); + + @protected + CloudSyncRawPage? sse_decode_opt_box_autoadd_cloud_sync_raw_page( + SseDeserializer deserializer, + ); + + @protected + CloudSyncRawSystemFields? + sse_decode_opt_box_autoadd_cloud_sync_raw_system_fields( + SseDeserializer deserializer, + ); + + @protected + CloudSyncTransientAttachmentPayload? + sse_decode_opt_box_autoadd_cloud_sync_transient_attachment_payload( + SseDeserializer deserializer, + ); + + @protected + CloudSyncTransientChatPayload? + sse_decode_opt_box_autoadd_cloud_sync_transient_chat_payload( + SseDeserializer deserializer, + ); + + @protected + CloudSyncTransientDeferredReason? + sse_decode_opt_box_autoadd_cloud_sync_transient_deferred_reason( + SseDeserializer deserializer, + ); + + @protected + CloudSyncTransientEntityKind? + sse_decode_opt_box_autoadd_cloud_sync_transient_entity_kind( + SseDeserializer deserializer, + ); + + @protected + CloudSyncTransientFailureCode? + sse_decode_opt_box_autoadd_cloud_sync_transient_failure_code( + SseDeserializer deserializer, + ); + + @protected + CloudSyncTransientGroupPhotoPayload? + sse_decode_opt_box_autoadd_cloud_sync_transient_group_photo_payload( + SseDeserializer deserializer, + ); + + @protected + CloudSyncTransientMessagePayload? + sse_decode_opt_box_autoadd_cloud_sync_transient_message_payload( + SseDeserializer deserializer, + ); + + @protected + CloudSyncTransientMutationKind? + sse_decode_opt_box_autoadd_cloud_sync_transient_mutation_kind( + SseDeserializer deserializer, + ); + + @protected + CloudSyncTransientPayload? + sse_decode_opt_box_autoadd_cloud_sync_transient_payload( + SseDeserializer deserializer, + ); + + @protected + CloudSyncTransientQuarantineReason? + sse_decode_opt_box_autoadd_cloud_sync_transient_quarantine_reason( + SseDeserializer deserializer, + ); + + @protected + CloudSyncTransientReactionKind? + sse_decode_opt_box_autoadd_cloud_sync_transient_reaction_kind( + SseDeserializer deserializer, + ); + + @protected + CloudSyncTransientSnapshot? + sse_decode_opt_box_autoadd_cloud_sync_transient_snapshot( + SseDeserializer deserializer, + ); + + @protected + CloudSyncTransientTombstone? + sse_decode_opt_box_autoadd_cloud_sync_transient_tombstone( + SseDeserializer deserializer, + ); + + @protected + ConversationData? sse_decode_opt_box_autoadd_conversation_data( + SseDeserializer deserializer, + ); + + @protected + DartBeaconShareInfo? sse_decode_opt_box_autoadd_dart_beacon_share_info( + SseDeserializer deserializer, + ); + + @protected + ExtensionApp? sse_decode_opt_box_autoadd_extension_app( + SseDeserializer deserializer, + ); + + @protected + double? sse_decode_opt_box_autoadd_f_64(SseDeserializer deserializer); + + @protected + FTMode? sse_decode_opt_box_autoadd_ft_mode(SseDeserializer deserializer); + + @protected + int? sse_decode_opt_box_autoadd_i_32(SseDeserializer deserializer); + + @protected + PlatformInt64? sse_decode_opt_box_autoadd_i_64(SseDeserializer deserializer); + + @protected + IMessagePosterRecord? sse_decode_opt_box_autoadd_i_message_poster_record( + SseDeserializer deserializer, + ); + + @protected + IdmsRequestedSignIn? sse_decode_opt_box_autoadd_idms_requested_sign_in( + SseDeserializer deserializer, + ); + + @protected + LinkMeta? sse_decode_opt_box_autoadd_link_meta(SseDeserializer deserializer); + + @protected + Location? sse_decode_opt_box_autoadd_location(SseDeserializer deserializer); + + @protected + LoginState? sse_decode_opt_box_autoadd_login_state( + SseDeserializer deserializer, + ); + + @protected + LPIconMetadata? sse_decode_opt_box_autoadd_lp_icon_metadata( + SseDeserializer deserializer, + ); + + @protected + LPImageMetadata? sse_decode_opt_box_autoadd_lp_image_metadata( + SseDeserializer deserializer, + ); + + @protected + LPSpecializationMetadata? + sse_decode_opt_box_autoadd_lp_specialization_metadata( + SseDeserializer deserializer, + ); + + @protected + MMCSAttachmentMeta? sse_decode_opt_box_autoadd_mmcs_attachment_meta( + SseDeserializer deserializer, + ); + + @protected + MMCSFile? sse_decode_opt_box_autoadd_mmcs_file(SseDeserializer deserializer); + + @protected + NSURL? sse_decode_opt_box_autoadd_nsurl(SseDeserializer deserializer); + + @protected + NumOrString? sse_decode_opt_box_autoadd_num_or_string( + SseDeserializer deserializer, + ); + + @protected + PartExtension? sse_decode_opt_box_autoadd_part_extension( + SseDeserializer deserializer, + ); + + @protected + PasswordManagerMetaDataFormerlyShared? + sse_decode_opt_box_autoadd_password_manager_meta_data_formerly_shared( + SseDeserializer deserializer, + ); + + @protected + PasswordManagerTotp? sse_decode_opt_box_autoadd_password_manager_totp( + SseDeserializer deserializer, + ); + + @protected + PosterColor? sse_decode_opt_box_autoadd_poster_color( + SseDeserializer deserializer, + ); + + @protected + PRPosterContentMaterialStyle? + sse_decode_opt_box_autoadd_pr_poster_content_material_style( + SseDeserializer deserializer, + ); + + @protected + PushMessage? sse_decode_opt_box_autoadd_push_message( + SseDeserializer deserializer, + ); + + @protected + (SharedPushState, ApsWatcher)? + sse_decode_opt_box_autoadd_record_shared_push_state_auto_owned_rust_opaque_flutter_rust_bridgefor_generated_rust_auto_opaque_inner_aps_watcher( + SseDeserializer deserializer, + ); + + @protected + (String, String)? sse_decode_opt_box_autoadd_record_string_string( + SseDeserializer deserializer, + ); + + @protected + (String, BigInt)? sse_decode_opt_box_autoadd_record_string_u_64( + SseDeserializer deserializer, + ); + + @protected + RichLinkImageAttachmentSubstitute? + sse_decode_opt_box_autoadd_rich_link_image_attachment_substitute( + SseDeserializer deserializer, + ); + + @protected + ScheduleMode? sse_decode_opt_box_autoadd_schedule_mode( + SseDeserializer deserializer, + ); + + @protected + ShareProfileMessage? sse_decode_opt_box_autoadd_share_profile_message( + SseDeserializer deserializer, + ); + + @protected + SharedICloudServices? sse_decode_opt_box_autoadd_shared_i_cloud_services( + SseDeserializer deserializer, + ); + + @protected + SharedPoster? sse_decode_opt_box_autoadd_shared_poster( + SseDeserializer deserializer, + ); + + @protected + SharedPushState? sse_decode_opt_box_autoadd_shared_push_state( + SseDeserializer deserializer, + ); + + @protected + SupportAction? sse_decode_opt_box_autoadd_support_action( + SseDeserializer deserializer, + ); + + @protected + SupportAlert? sse_decode_opt_box_autoadd_support_alert( + SseDeserializer deserializer, + ); + + @protected + TypingApp? sse_decode_opt_box_autoadd_typing_app( + SseDeserializer deserializer, + ); + + @protected + int? sse_decode_opt_box_autoadd_u_16(SseDeserializer deserializer); + + @protected + int? sse_decode_opt_box_autoadd_u_32(SseDeserializer deserializer); + + @protected + BigInt? sse_decode_opt_box_autoadd_u_64(SseDeserializer deserializer); + + @protected + UpdateAccountFinish? sse_decode_opt_box_autoadd_update_account_finish( + SseDeserializer deserializer, + ); + + @protected + List? + sse_decode_opt_list_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerIDSUser( + SseDeserializer deserializer, + ); + + @protected + List? sse_decode_opt_list_String(SseDeserializer deserializer); + + @protected + List? sse_decode_opt_list_message_target( + SseDeserializer deserializer, + ); + + @protected + Uint8List? sse_decode_opt_list_prim_u_8_strict(SseDeserializer deserializer); + + @protected + PartExtension sse_decode_part_extension(SseDeserializer deserializer); + + @protected + Passkey sse_decode_passkey(SseDeserializer deserializer); + + @protected + PasswordManagerAltDomain sse_decode_password_manager_alt_domain( + SseDeserializer deserializer, + ); + + @protected + PasswordManagerMeta sse_decode_password_manager_meta( + SseDeserializer deserializer, + ); + + @protected + PasswordManagerMetaChange sse_decode_password_manager_meta_change( + SseDeserializer deserializer, + ); + + @protected + PasswordManagerMetaData sse_decode_password_manager_meta_data( + SseDeserializer deserializer, + ); + + @protected + PasswordManagerMetaDataCtx sse_decode_password_manager_meta_data_ctx( + SseDeserializer deserializer, + ); + + @protected + PasswordManagerMetaDataFormerlyShared + sse_decode_password_manager_meta_data_formerly_shared( + SseDeserializer deserializer, + ); + + @protected + PasswordManagerTotp sse_decode_password_manager_totp( + SseDeserializer deserializer, + ); + + @protected + PasswordRawEntry sse_decode_password_raw_entry(SseDeserializer deserializer); + + @protected + PermanentDeleteMessage sse_decode_permanent_delete_message( + SseDeserializer deserializer, + ); + + @protected + PhotoPosterContents sse_decode_photo_poster_contents( + SseDeserializer deserializer, + ); + + @protected + PhotoPosterContentsFrame sse_decode_photo_poster_contents_frame( + SseDeserializer deserializer, + ); + + @protected + PhotoPosterContentsSize sse_decode_photo_poster_contents_size( + SseDeserializer deserializer, + ); + + @protected + PhotoPosterLayer sse_decode_photo_poster_layer(SseDeserializer deserializer); + + @protected + PhotoPosterLayout sse_decode_photo_poster_layout( + SseDeserializer deserializer, + ); + + @protected + PhotoPosterProperties sse_decode_photo_poster_properties( + SseDeserializer deserializer, + ); + + @protected + PollResult sse_decode_poll_result(SseDeserializer deserializer); + + @protected + PosterAsset sse_decode_poster_asset(SseDeserializer deserializer); + + @protected + PosterColor sse_decode_poster_color(SseDeserializer deserializer); + + @protected + PosterRole sse_decode_poster_role(SseDeserializer deserializer); + + @protected + PosterType sse_decode_poster_type(SseDeserializer deserializer); + + @protected + PRPosterColor sse_decode_pr_poster_color(SseDeserializer deserializer); + + @protected + PRPosterContentMaterialStyle sse_decode_pr_poster_content_material_style( + SseDeserializer deserializer, + ); + + @protected + PRPosterSystemTimeFontConfiguration + sse_decode_pr_poster_system_time_font_configuration( + SseDeserializer deserializer, + ); + + @protected + PRPosterTitleStyleConfiguration + sse_decode_pr_poster_title_style_configuration(SseDeserializer deserializer); + + @protected + PrivateDeviceInfo sse_decode_private_device_info( + SseDeserializer deserializer, + ); + + @protected + ProvisionedFlavor sse_decode_provisioned_flavor(SseDeserializer deserializer); + + @protected + PushMessage sse_decode_push_message(SseDeserializer deserializer); + + @protected + QuotaInfo sse_decode_quota_info(SseDeserializer deserializer); + + @protected + ReactMessage sse_decode_react_message(SseDeserializer deserializer); + + @protected + ReactMessageType sse_decode_react_message_type(SseDeserializer deserializer); + + @protected + Reaction sse_decode_reaction(SseDeserializer deserializer); + + @protected + (ApsConnection, PushError?) + sse_decode_record_auto_owned_rust_opaque_flutter_rust_bridgefor_generated_rust_auto_opaque_inner_aps_connection_opt_box_autoadd_auto_owned_rust_opaque_flutter_rust_bridgefor_generated_rust_auto_opaque_inner_push_error( + SseDeserializer deserializer, + ); + + @protected + (ArcMutexAppleAccountDefaultAnisetteProvider, LoginState) + sse_decode_record_auto_owned_rust_opaque_flutter_rust_bridgefor_generated_rust_auto_opaque_inner_arc_mutex_apple_account_default_anisette_provider_login_state( + SseDeserializer deserializer, + ); + + @protected + (ArcSharedPushState, SharedPushState) + sse_decode_record_auto_owned_rust_opaque_flutter_rust_bridgefor_generated_rust_auto_opaque_inner_arc_shared_push_state_shared_push_state( + SseDeserializer deserializer, + ); + + @protected + (CircleClientSessionDefaultAnisetteProvider, LoginState, String?) + sse_decode_record_auto_owned_rust_opaque_flutter_rust_bridgefor_generated_rust_auto_opaque_inner_circle_client_session_default_anisette_provider_login_state_opt_string( + SseDeserializer deserializer, + ); + + @protected + (Sender, ArcSenderPushMessage, ApsWatcher) + sse_decode_record_auto_owned_rust_opaque_flutter_rust_bridgefor_generated_rust_auto_opaque_inner_sender_auto_owned_rust_opaque_flutter_rust_bridgefor_generated_rust_auto_opaque_inner_arc_sender_push_message_auto_owned_rust_opaque_flutter_rust_bridgefor_generated_rust_auto_opaque_inner_aps_watcher( + SseDeserializer deserializer, + ); + + @protected + (Uint8List, Map, int) + sse_decode_record_list_prim_u_8_strict_map_string_opt_box_autoadd_cloud_attachment_i_32( + SseDeserializer deserializer, + ); + + @protected + (Uint8List, Map, int) + sse_decode_record_list_prim_u_8_strict_map_string_opt_box_autoadd_cloud_chat_i_32( + SseDeserializer deserializer, + ); + + @protected + (Uint8List, Map, int) + sse_decode_record_list_prim_u_8_strict_map_string_opt_box_autoadd_cloud_message_i_32( + SseDeserializer deserializer, + ); + + @protected + (Uint8List, Uint8List?) + sse_decode_record_list_prim_u_8_strict_opt_list_prim_u_8_strict( + SseDeserializer deserializer, + ); + + @protected + (List, List) + sse_decode_record_list_shared_album_list_string(SseDeserializer deserializer); + + @protected + (List, LoginState?) + sse_decode_record_list_trusted_phone_number_opt_box_autoadd_login_state( + SseDeserializer deserializer, + ); + + @protected + (LoginState, IdsUser?) + sse_decode_record_login_state_opt_box_autoadd_auto_owned_rust_opaque_flutter_rust_bridgefor_generated_rust_auto_opaque_inner_ids_user( + SseDeserializer deserializer, + ); + + @protected + (Map, (String, BigInt)?) + sse_decode_record_map_string_sync_status_opt_box_autoadd_record_string_u_64( + SseDeserializer deserializer, + ); + + @protected + (List?, SupportAlert?) + sse_decode_record_opt_list_auto_owned_rust_opaque_flutter_rust_bridgefor_generated_rust_auto_opaque_inner_ids_user_opt_box_autoadd_support_alert( + SseDeserializer deserializer, + ); + + @protected + (String?, Passkey) sse_decode_record_opt_string_passkey( + SseDeserializer deserializer, + ); + + @protected + (String?, PasswordManagerMeta) + sse_decode_record_opt_string_password_manager_meta( + SseDeserializer deserializer, + ); + + @protected + (String?, PasswordRawEntry) sse_decode_record_opt_string_password_raw_entry( + SseDeserializer deserializer, + ); + + @protected + (String?, WifiPassword) sse_decode_record_opt_string_wifi_password( + SseDeserializer deserializer, + ); + + @protected + (SharedPushState, ApsWatcher) + sse_decode_record_shared_push_state_auto_owned_rust_opaque_flutter_rust_bridgefor_generated_rust_auto_opaque_inner_aps_watcher( + SseDeserializer deserializer, + ); + + @protected + (String, Asset) + sse_decode_record_string_auto_owned_rust_opaque_flutter_rust_bridgefor_generated_rust_auto_opaque_inner_asset( + SseDeserializer deserializer, + ); + + @protected + (String, StCollapsedValue) + sse_decode_record_string_auto_owned_rust_opaque_flutter_rust_bridgefor_generated_rust_auto_opaque_inner_st_collapsed_value( + SseDeserializer deserializer, + ); + + @protected + (String, bool) sse_decode_record_string_bool(SseDeserializer deserializer); + + @protected + (String, int) sse_decode_record_string_casted_primitive_u_64( + SseDeserializer deserializer, + ); + + @protected + (String, CloudAttachment) sse_decode_record_string_cloud_attachment( + SseDeserializer deserializer, + ); + + @protected + (String, CloudChat) sse_decode_record_string_cloud_chat( + SseDeserializer deserializer, + ); + + @protected + (String, CloudMessage) sse_decode_record_string_cloud_message( + SseDeserializer deserializer, + ); + + @protected + (String, FTParticipant) sse_decode_record_string_ft_participant( + SseDeserializer deserializer, + ); + + @protected + (String, GroupSummary) sse_decode_record_string_group_summary( + SseDeserializer deserializer, + ); + + @protected + (String, List) sse_decode_record_string_list_message_edit( + SseDeserializer deserializer, + ); + + @protected + (String, Uint8List) sse_decode_record_string_list_prim_u_8_strict( + SseDeserializer deserializer, + ); + + @protected + (String, Map, Map) + sse_decode_record_string_map_string_group_summary_map_string_share_invite_content_data( + SseDeserializer deserializer, + ); + + @protected + (String, MessageEditRange) sse_decode_record_string_message_edit_range( + SseDeserializer deserializer, + ); + + @protected + (String, CloudAttachment?) + sse_decode_record_string_opt_box_autoadd_cloud_attachment( + SseDeserializer deserializer, + ); + + @protected + (String, CloudChat?) sse_decode_record_string_opt_box_autoadd_cloud_chat( + SseDeserializer deserializer, + ); + + @protected + (String, CloudMessage?) + sse_decode_record_string_opt_box_autoadd_cloud_message( + SseDeserializer deserializer, + ); + + @protected + (String, PasswordManagerMetaDataCtx) + sse_decode_record_string_password_manager_meta_data_ctx( + SseDeserializer deserializer, + ); + + @protected + (String, (String?, Passkey)) + sse_decode_record_string_record_opt_string_passkey( + SseDeserializer deserializer, + ); + + @protected + (String, (String?, PasswordManagerMeta)) + sse_decode_record_string_record_opt_string_password_manager_meta( + SseDeserializer deserializer, + ); + + @protected + (String, (String?, PasswordRawEntry)) + sse_decode_record_string_record_opt_string_password_raw_entry( + SseDeserializer deserializer, + ); + + @protected + (String, (String?, WifiPassword)) + sse_decode_record_string_record_opt_string_wifi_password( + SseDeserializer deserializer, + ); + + @protected + (String, ShareInviteContentData) + sse_decode_record_string_share_invite_content_data( + SseDeserializer deserializer, + ); + + @protected + (String, SharedPushState) sse_decode_record_string_shared_push_state( + SseDeserializer deserializer, + ); + + @protected + (String, StatusKitPersonalConfig) + sse_decode_record_string_status_kit_personal_config( + SseDeserializer deserializer, + ); + + @protected + (String, String) sse_decode_record_string_string( + SseDeserializer deserializer, + ); + + @protected + (String, SyncStatus) sse_decode_record_string_sync_status( + SseDeserializer deserializer, + ); + + @protected + (String, BigInt) sse_decode_record_string_u_64(SseDeserializer deserializer); + + @protected + (String, UpdateAccountFinish) sse_decode_record_string_update_account_finish( + SseDeserializer deserializer, + ); + + @protected + (int, NSDictionaryTypedCoder) + sse_decode_record_u_32_ns_dictionary_typed_coder( + SseDeserializer deserializer, + ); + + @protected + (int, BigInt) sse_decode_record_u_32_u_64(SseDeserializer deserializer); + + @protected + RegisterState sse_decode_register_state(SseDeserializer deserializer); + + @protected + RenameMessage sse_decode_rename_message(SseDeserializer deserializer); + + @protected + ReportMessage sse_decode_report_message(SseDeserializer deserializer); + + @protected + RichLinkImageAttachmentSubstitute + sse_decode_rich_link_image_attachment_substitute( + SseDeserializer deserializer, + ); + + @protected + ScheduleMode sse_decode_schedule_mode(SseDeserializer deserializer); + + @protected + SetTranscriptBackgroundMessage sse_decode_set_transcript_background_message( + SseDeserializer deserializer, + ); + + @protected + ShareInviteContentData sse_decode_share_invite_content_data( + SseDeserializer deserializer, + ); + + @protected + ShareProfileMessage sse_decode_share_profile_message( + SseDeserializer deserializer, + ); + + @protected + SharedAlbum sse_decode_shared_album(SseDeserializer deserializer); + + @protected + SharedICloudServices sse_decode_shared_i_cloud_services( + SseDeserializer deserializer, + ); + + @protected + SharedPoster sse_decode_shared_poster(SseDeserializer deserializer); + + @protected + SharedPushState sse_decode_shared_push_state(SseDeserializer deserializer); + + @protected + SimplifiedIncomingCallPoster sse_decode_simplified_incoming_call_poster( + SseDeserializer deserializer, + ); + + @protected + SimplifiedPoster sse_decode_simplified_poster(SseDeserializer deserializer); + + @protected + SimplifiedTranscriptPoster sse_decode_simplified_transcript_poster( + SseDeserializer deserializer, + ); + + @protected + StatusKitMessage sse_decode_status_kit_message(SseDeserializer deserializer); + + @protected + StatusKitPersonalConfig sse_decode_status_kit_personal_config( + SseDeserializer deserializer, + ); + + @protected + SupportAction sse_decode_support_action(SseDeserializer deserializer); + + @protected + SupportAlert sse_decode_support_alert(SseDeserializer deserializer); + + @protected + SyncStatus sse_decode_sync_status(SseDeserializer deserializer); + + @protected + TeardownSignIn sse_decode_teardown_sign_in(SseDeserializer deserializer); + + @protected + TextEffect sse_decode_text_effect(SseDeserializer deserializer); + + @protected + TextFlags sse_decode_text_flags(SseDeserializer deserializer); + + @protected + TextFormat sse_decode_text_format(SseDeserializer deserializer); + + @protected + TranscriptDynamicUserData sse_decode_transcript_dynamic_user_data( + SseDeserializer deserializer, + ); + + @protected + TransferProgress sse_decode_transfer_progress(SseDeserializer deserializer); + + @protected + TrustedPhoneNumber sse_decode_trusted_phone_number( + SseDeserializer deserializer, + ); + + @protected + TypingApp sse_decode_typing_app(SseDeserializer deserializer); + + @protected + int sse_decode_u_16(SseDeserializer deserializer); + + @protected + int sse_decode_u_32(SseDeserializer deserializer); + + @protected + BigInt sse_decode_u_64(SseDeserializer deserializer); + + @protected + int sse_decode_u_8(SseDeserializer deserializer); + + @protected + UIColor sse_decode_ui_color(SseDeserializer deserializer); + + @protected + void sse_decode_unit(SseDeserializer deserializer); + + @protected + UnsendMessage sse_decode_unsend_message(SseDeserializer deserializer); + + @protected + UpdateAccountFinish sse_decode_update_account_finish( + SseDeserializer deserializer, + ); + + @protected + UpdateExtensionMessage sse_decode_update_extension_message( + SseDeserializer deserializer, + ); + + @protected + UpdateProfileMessage sse_decode_update_profile_message( + SseDeserializer deserializer, + ); + + @protected + UpdateProfileSharingMessage sse_decode_update_profile_sharing_message( + SseDeserializer deserializer, + ); + + @protected + BigInt sse_decode_usize(SseDeserializer deserializer); + + @protected + WallpaperMetadata sse_decode_wallpaper_metadata(SseDeserializer deserializer); + + @protected + WatchBackground sse_decode_watch_background(SseDeserializer deserializer); + + @protected + WifiPassword sse_decode_wifi_password(SseDeserializer deserializer); + + @protected + void sse_encode_AnyhowException( + AnyhowException self, + SseSerializer serializer, + ); + + @protected + void + sse_encode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerAPSConnection( + ApsConnection self, + SseSerializer serializer, + ); + + @protected + void + sse_encode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerAPSState( + ApsState self, + SseSerializer serializer, + ); + + @protected + void + sse_encode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerAPSWatcher( + ApsWatcher self, + SseSerializer serializer, + ); + + @protected + void + sse_encode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcAnisetteClientDefaultAnisetteProvider( + ArcAnisetteClientDefaultAnisetteProvider self, + SseSerializer serializer, + ); + + @protected + void + sse_encode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcCloudKitClientDefaultAnisetteProvider( + ArcCloudKitClientDefaultAnisetteProvider self, + SseSerializer serializer, + ); + + @protected + void + sse_encode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcCloudMessagesClientDefaultAnisetteProvider( + ArcCloudMessagesClientDefaultAnisetteProvider self, + SseSerializer serializer, + ); + + @protected + void + sse_encode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcFTClient( + ArcFtClient self, + SseSerializer serializer, + ); + + @protected + void + sse_encode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcFindMyClientDefaultAnisetteProvider( + ArcFindMyClientDefaultAnisetteProvider self, + SseSerializer serializer, + ); + + @protected + void + sse_encode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcIMClient( + ArcImClient self, + SseSerializer serializer, + ); + + @protected + void + sse_encode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcIdmsAuthListener( + ArcIdmsAuthListener self, + SseSerializer serializer, + ); + + @protected + void + sse_encode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcKeychainClientDefaultAnisetteProvider( + ArcKeychainClientDefaultAnisetteProvider self, + SseSerializer serializer, + ); + + @protected + void + sse_encode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcMutexAppleAccountDefaultAnisetteProvider( + ArcMutexAppleAccountDefaultAnisetteProvider self, + SseSerializer serializer, + ); + + @protected + void + sse_encode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcMutexOptionCircleClientSessionDefaultAnisetteProvider( + ArcMutexOptionCircleClientSessionDefaultAnisetteProvider self, + SseSerializer serializer, + ); + + @protected + void + sse_encode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcMutexVecActiveCircleSession( + ArcMutexVecActiveCircleSession self, + SseSerializer serializer, + ); + + @protected + void + sse_encode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcPasswordManagerDefaultAnisetteProvider( + ArcPasswordManagerDefaultAnisetteProvider self, + SseSerializer serializer, + ); + + @protected + void + sse_encode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcProfilesClientDefaultAnisetteProvider( + ArcProfilesClientDefaultAnisetteProvider self, + SseSerializer serializer, + ); + + @protected + void + sse_encode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcSenderPushMessage( + ArcSenderPushMessage self, + SseSerializer serializer, + ); + + @protected + void + sse_encode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcSharedPushState( + ArcSharedPushState self, + SseSerializer serializer, + ); + + @protected + void + sse_encode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcStatusKitClientDefaultAnisetteProvider( + ArcStatusKitClientDefaultAnisetteProvider self, + SseSerializer serializer, + ); + + @protected + void + sse_encode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcTokenProviderDefaultAnisetteProvider( + ArcTokenProviderDefaultAnisetteProvider self, + SseSerializer serializer, + ); + + @protected + void + sse_encode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerAsset( + Asset self, + SseSerializer serializer, + ); + + @protected + void + sse_encode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerChannelInterestToken( + ChannelInterestToken self, + SseSerializer serializer, + ); + + @protected + void + sse_encode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerCircleClientSessionDefaultAnisetteProvider( + CircleClientSessionDefaultAnisetteProvider self, + SseSerializer serializer, + ); + + @protected + void + sse_encode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerCloudSyncPreparedMessageCreateHandle( + CloudSyncPreparedMessageCreateHandle self, + SseSerializer serializer, + ); + + @protected + void + sse_encode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerConversationLink( + ConversationLink self, + SseSerializer serializer, + ); + + @protected + void + sse_encode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerConversationParticipant( + ConversationParticipant self, + SseSerializer serializer, + ); + + @protected + void + sse_encode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerDate( + Date self, + SseSerializer serializer, + ); + + @protected + void + sse_encode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerEscrowData( + EscrowData self, + SseSerializer serializer, + ); + + @protected + void + sse_encode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerFindMyFriendsClientDefaultAnisetteProvider( + FindMyFriendsClientDefaultAnisetteProvider self, + SseSerializer serializer, + ); + + @protected + void + sse_encode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerFindMyPhoneClientDefaultAnisetteProvider( + FindMyPhoneClientDefaultAnisetteProvider self, + SseSerializer serializer, + ); + + @protected + void + sse_encode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerGZipWrapperAttachmentMeta( + GZipWrapperAttachmentMeta self, + SseSerializer serializer, + ); + + @protected + void + sse_encode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerGZipWrapperChatProto( + GZipWrapperChatProto self, + SseSerializer serializer, + ); + + @protected + void + sse_encode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerGZipWrapperMessageProto( + GZipWrapperMessageProto self, + SseSerializer serializer, + ); + + @protected + void + sse_encode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerGZipWrapperMessageProto2( + GZipWrapperMessageProto2 self, + SseSerializer serializer, + ); + + @protected + void + sse_encode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerGZipWrapperMessageProto3( + GZipWrapperMessageProto3 self, + SseSerializer serializer, + ); + + @protected + void + sse_encode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerGZipWrapperMessageProto4( + GZipWrapperMessageProto4 self, + SseSerializer serializer, + ); + + @protected + void + sse_encode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerIDSNGMIdentity( + IdsngmIdentity self, + SseSerializer serializer, + ); + + @protected + void + sse_encode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerIDSUser( + IdsUser self, + SseSerializer serializer, + ); + + @protected + void + sse_encode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerJoinedOSConfig( + JoinedOsConfig self, + SseSerializer serializer, + ); + + @protected + void + sse_encode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerLocationReport( + LocationReport self, + SseSerializer serializer, + ); + + @protected + void + sse_encode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerMessageFlags( + MessageFlags self, + SseSerializer serializer, + ); + + @protected + void + sse_encode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerNSArrayLPIconMetadata( + NsArrayLpIconMetadata self, + SseSerializer serializer, + ); + + @protected + void + sse_encode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerNSArrayLPImageMetadata( + NsArrayLpImageMetadata self, + SseSerializer serializer, + ); + + @protected + void + sse_encode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerPushError( + PushError self, + SseSerializer serializer, + ); + + @protected + void + sse_encode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerReceiverAPSMessage( + ReceiverApsMessage self, + SseSerializer serializer, + ); + + @protected + void + sse_encode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerSavedHardwareState( + SavedHardwareState self, + SseSerializer serializer, + ); + + @protected + void + sse_encode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerSender( + Sender self, + SseSerializer serializer, + ); + + @protected + void + sse_encode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerStCollapsedValue( + StCollapsedValue self, + SseSerializer serializer, + ); + + @protected + void + sse_encode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerSyncManagerDefaultAnisetteProviderMyFilePackager( + SyncManagerDefaultAnisetteProviderMyFilePackager self, + SseSerializer serializer, + ); + + @protected + void + sse_encode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerSystemTime( + SystemTime self, + SseSerializer serializer, + ); + + @protected + void + sse_encode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerVerifyBody( + VerifyBody self, + SseSerializer serializer, + ); + + @protected + void + sse_encode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerViableBottle( + ViableBottle self, + SseSerializer serializer, + ); + + @protected + void + sse_encode_Auto_RefMut_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerAPSWatcher( + ApsWatcher self, + SseSerializer serializer, + ); + + @protected + void + sse_encode_Auto_RefMut_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerCircleClientSessionDefaultAnisetteProvider( + CircleClientSessionDefaultAnisetteProvider self, + SseSerializer serializer, + ); + + @protected + void + sse_encode_Auto_RefMut_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerFindMyFriendsClientDefaultAnisetteProvider( + FindMyFriendsClientDefaultAnisetteProvider self, + SseSerializer serializer, + ); + + @protected + void + sse_encode_Auto_RefMut_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerFindMyPhoneClientDefaultAnisetteProvider( + FindMyPhoneClientDefaultAnisetteProvider self, + SseSerializer serializer, + ); + + @protected + void + sse_encode_Auto_RefMut_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerLocationReport( + LocationReport self, + SseSerializer serializer, + ); + + @protected + void + sse_encode_Auto_RefMut_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerReceiverAPSMessage( + ReceiverApsMessage self, + SseSerializer serializer, + ); + + @protected + void + sse_encode_Auto_RefMut_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerSavedHardwareState( + SavedHardwareState self, + SseSerializer serializer, + ); + + @protected + void + sse_encode_Auto_RefMut_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerViableBottle( + ViableBottle self, + SseSerializer serializer, + ); + + @protected + void + sse_encode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerAPSConnection( + ApsConnection self, + SseSerializer serializer, + ); + + @protected + void + sse_encode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcAnisetteClientDefaultAnisetteProvider( + ArcAnisetteClientDefaultAnisetteProvider self, + SseSerializer serializer, + ); + + @protected + void + sse_encode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcCloudKitClientDefaultAnisetteProvider( + ArcCloudKitClientDefaultAnisetteProvider self, + SseSerializer serializer, + ); + + @protected + void + sse_encode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcCloudMessagesClientDefaultAnisetteProvider( + ArcCloudMessagesClientDefaultAnisetteProvider self, + SseSerializer serializer, + ); + + @protected + void + sse_encode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcFTClient( + ArcFtClient self, + SseSerializer serializer, + ); + + @protected + void + sse_encode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcFindMyClientDefaultAnisetteProvider( + ArcFindMyClientDefaultAnisetteProvider self, + SseSerializer serializer, + ); + + @protected + void + sse_encode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcIMClient( + ArcImClient self, + SseSerializer serializer, + ); + + @protected + void + sse_encode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcIdmsAuthListener( + ArcIdmsAuthListener self, + SseSerializer serializer, + ); + + @protected + void + sse_encode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcKeychainClientDefaultAnisetteProvider( + ArcKeychainClientDefaultAnisetteProvider self, + SseSerializer serializer, + ); + + @protected + void + sse_encode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcMutexAppleAccountDefaultAnisetteProvider( + ArcMutexAppleAccountDefaultAnisetteProvider self, + SseSerializer serializer, + ); + + @protected + void + sse_encode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcMutexOptionCircleClientSessionDefaultAnisetteProvider( + ArcMutexOptionCircleClientSessionDefaultAnisetteProvider self, + SseSerializer serializer, + ); + + @protected + void + sse_encode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcMutexVecActiveCircleSession( + ArcMutexVecActiveCircleSession self, + SseSerializer serializer, + ); + + @protected + void + sse_encode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcPasswordManagerDefaultAnisetteProvider( + ArcPasswordManagerDefaultAnisetteProvider self, + SseSerializer serializer, + ); + + @protected + void + sse_encode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcProfilesClientDefaultAnisetteProvider( + ArcProfilesClientDefaultAnisetteProvider self, + SseSerializer serializer, + ); + + @protected + void + sse_encode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcSenderPushMessage( + ArcSenderPushMessage self, + SseSerializer serializer, + ); + + @protected + void + sse_encode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcSharedPushState( + ArcSharedPushState self, + SseSerializer serializer, + ); + + @protected + void + sse_encode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcStatusKitClientDefaultAnisetteProvider( + ArcStatusKitClientDefaultAnisetteProvider self, + SseSerializer serializer, + ); + + @protected + void + sse_encode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcTokenProviderDefaultAnisetteProvider( + ArcTokenProviderDefaultAnisetteProvider self, + SseSerializer serializer, + ); + + @protected + void + sse_encode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerCloudSyncPreparedMessageCreateHandle( + CloudSyncPreparedMessageCreateHandle self, + SseSerializer serializer, + ); + + @protected + void + sse_encode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerDate( + Date self, + SseSerializer serializer, + ); + + @protected + void + sse_encode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerEscrowData( + EscrowData self, + SseSerializer serializer, + ); + + @protected + void + sse_encode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerGZipWrapperAttachmentMeta( + GZipWrapperAttachmentMeta self, + SseSerializer serializer, + ); + + @protected + void + sse_encode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerGZipWrapperChatProto( + GZipWrapperChatProto self, + SseSerializer serializer, + ); + + @protected + void + sse_encode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerGZipWrapperMessageProto( + GZipWrapperMessageProto self, + SseSerializer serializer, + ); + + @protected + void + sse_encode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerGZipWrapperMessageProto2( + GZipWrapperMessageProto2 self, + SseSerializer serializer, + ); + + @protected + void + sse_encode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerGZipWrapperMessageProto3( + GZipWrapperMessageProto3 self, + SseSerializer serializer, + ); + + @protected + void + sse_encode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerGZipWrapperMessageProto4( + GZipWrapperMessageProto4 self, + SseSerializer serializer, + ); + + @protected + void + sse_encode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerIDSNGMIdentity( + IdsngmIdentity self, + SseSerializer serializer, + ); + + @protected + void + sse_encode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerIDSUser( + IdsUser self, + SseSerializer serializer, + ); + + @protected + void + sse_encode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerJoinedOSConfig( + JoinedOsConfig self, + SseSerializer serializer, + ); + + @protected + void + sse_encode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerLocationReport( + LocationReport self, + SseSerializer serializer, + ); + + @protected + void + sse_encode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerMessageFlags( + MessageFlags self, + SseSerializer serializer, + ); + + @protected + void + sse_encode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerSavedHardwareState( + SavedHardwareState self, + SseSerializer serializer, + ); + + @protected + void + sse_encode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerSender( + Sender self, + SseSerializer serializer, + ); + + @protected + void + sse_encode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerStCollapsedValue( + StCollapsedValue self, + SseSerializer serializer, + ); + + @protected + void + sse_encode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerSyncManagerDefaultAnisetteProviderMyFilePackager( + SyncManagerDefaultAnisetteProviderMyFilePackager self, + SseSerializer serializer, + ); + + @protected + void + sse_encode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerVerifyBody( + VerifyBody self, + SseSerializer serializer, + ); + + @protected + void + sse_encode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerViableBottle( + ViableBottle self, + SseSerializer serializer, + ); + + @protected + void sse_encode_CastedPrimitive_i_64(int self, SseSerializer serializer); + + @protected + void sse_encode_CastedPrimitive_u_64(int self, SseSerializer serializer); + + @protected + void sse_encode_CastedPrimitive_usize(int self, SseSerializer serializer); + + @protected + void sse_encode_DartFn_Inputs_String_Output_String_AnyhowException( + FutureOr Function(String) self, + SseSerializer serializer, + ); + + @protected + void sse_encode_DartOpaque(Object self, SseSerializer serializer); + + @protected + void + sse_encode_Map_String_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerAsset( + Map self, + SseSerializer serializer, + ); + + @protected + void + sse_encode_Map_String_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerStCollapsedValue( + Map self, + SseSerializer serializer, + ); + + @protected + void sse_encode_Map_String_CastedPrimitive_u_64( + Map self, + SseSerializer serializer, + ); + + @protected + void sse_encode_Map_String_String( + Map self, + SseSerializer serializer, + ); + + @protected + void sse_encode_Map_String_bool( + Map self, + SseSerializer serializer, + ); + + @protected + void sse_encode_Map_String_cloud_attachment( + Map self, + SseSerializer serializer, + ); + + @protected + void sse_encode_Map_String_cloud_chat( + Map self, + SseSerializer serializer, + ); + + @protected + void sse_encode_Map_String_cloud_message( + Map self, + SseSerializer serializer, + ); + + @protected + void sse_encode_Map_String_ft_participant( + Map self, + SseSerializer serializer, + ); + + @protected + void sse_encode_Map_String_group_summary( + Map self, + SseSerializer serializer, + ); + + @protected + void sse_encode_Map_String_list_message_edit( + Map> self, + SseSerializer serializer, + ); + + @protected + void sse_encode_Map_String_list_prim_u_8_strict( + Map self, + SseSerializer serializer, + ); + + @protected + void sse_encode_Map_String_message_edit_range( + Map self, + SseSerializer serializer, + ); + + @protected + void sse_encode_Map_String_opt_box_autoadd_cloud_attachment( + Map self, + SseSerializer serializer, + ); + + @protected + void sse_encode_Map_String_opt_box_autoadd_cloud_chat( + Map self, + SseSerializer serializer, + ); + + @protected + void sse_encode_Map_String_opt_box_autoadd_cloud_message( + Map self, + SseSerializer serializer, + ); + + @protected + void sse_encode_Map_String_password_manager_meta_data_ctx( + Map self, + SseSerializer serializer, + ); + + @protected + void sse_encode_Map_String_record_opt_string_passkey( + Map self, + SseSerializer serializer, + ); + + @protected + void sse_encode_Map_String_record_opt_string_password_manager_meta( + Map self, + SseSerializer serializer, + ); + + @protected + void sse_encode_Map_String_record_opt_string_password_raw_entry( + Map self, + SseSerializer serializer, + ); + + @protected + void sse_encode_Map_String_record_opt_string_wifi_password( + Map self, + SseSerializer serializer, + ); + + @protected + void sse_encode_Map_String_share_invite_content_data( + Map self, + SseSerializer serializer, + ); + + @protected + void sse_encode_Map_String_status_kit_personal_config( + Map self, + SseSerializer serializer, + ); + + @protected + void sse_encode_Map_String_sync_status( + Map self, + SseSerializer serializer, + ); + + @protected + void + sse_encode_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerAPSConnection( + ApsConnection self, + SseSerializer serializer, + ); + + @protected + void + sse_encode_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerAPSState( + ApsState self, + SseSerializer serializer, + ); + + @protected + void + sse_encode_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerAPSWatcher( + ApsWatcher self, + SseSerializer serializer, + ); + + @protected + void + sse_encode_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcAnisetteClientDefaultAnisetteProvider( + ArcAnisetteClientDefaultAnisetteProvider self, + SseSerializer serializer, + ); + + @protected + void + sse_encode_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcCloudKitClientDefaultAnisetteProvider( + ArcCloudKitClientDefaultAnisetteProvider self, + SseSerializer serializer, + ); + + @protected + void + sse_encode_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcCloudMessagesClientDefaultAnisetteProvider( + ArcCloudMessagesClientDefaultAnisetteProvider self, + SseSerializer serializer, + ); + + @protected + void + sse_encode_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcFTClient( + ArcFtClient self, + SseSerializer serializer, + ); + + @protected + void + sse_encode_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcFindMyClientDefaultAnisetteProvider( + ArcFindMyClientDefaultAnisetteProvider self, + SseSerializer serializer, + ); + + @protected + void + sse_encode_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcIMClient( + ArcImClient self, + SseSerializer serializer, + ); + + @protected + void + sse_encode_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcIdmsAuthListener( + ArcIdmsAuthListener self, + SseSerializer serializer, + ); + + @protected + void + sse_encode_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcKeychainClientDefaultAnisetteProvider( + ArcKeychainClientDefaultAnisetteProvider self, + SseSerializer serializer, + ); + + @protected + void + sse_encode_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcMutexAppleAccountDefaultAnisetteProvider( + ArcMutexAppleAccountDefaultAnisetteProvider self, + SseSerializer serializer, + ); + + @protected + void + sse_encode_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcMutexOptionCircleClientSessionDefaultAnisetteProvider( + ArcMutexOptionCircleClientSessionDefaultAnisetteProvider self, + SseSerializer serializer, + ); + + @protected + void + sse_encode_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcMutexVecActiveCircleSession( + ArcMutexVecActiveCircleSession self, + SseSerializer serializer, + ); + + @protected + void + sse_encode_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcPasswordManagerDefaultAnisetteProvider( + ArcPasswordManagerDefaultAnisetteProvider self, + SseSerializer serializer, + ); + + @protected + void + sse_encode_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcProfilesClientDefaultAnisetteProvider( + ArcProfilesClientDefaultAnisetteProvider self, + SseSerializer serializer, + ); + + @protected + void + sse_encode_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcSenderPushMessage( + ArcSenderPushMessage self, + SseSerializer serializer, + ); + + @protected + void + sse_encode_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcSharedPushState( + ArcSharedPushState self, + SseSerializer serializer, + ); + + @protected + void + sse_encode_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcStatusKitClientDefaultAnisetteProvider( + ArcStatusKitClientDefaultAnisetteProvider self, + SseSerializer serializer, + ); + + @protected + void + sse_encode_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcTokenProviderDefaultAnisetteProvider( + ArcTokenProviderDefaultAnisetteProvider self, + SseSerializer serializer, + ); + + @protected + void + sse_encode_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerAsset( + Asset self, + SseSerializer serializer, + ); + + @protected + void + sse_encode_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerChannelInterestToken( + ChannelInterestToken self, + SseSerializer serializer, + ); + + @protected + void + sse_encode_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerCircleClientSessionDefaultAnisetteProvider( + CircleClientSessionDefaultAnisetteProvider self, + SseSerializer serializer, + ); + + @protected + void + sse_encode_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerCloudSyncPreparedMessageCreateHandle( + CloudSyncPreparedMessageCreateHandle self, + SseSerializer serializer, + ); + + @protected + void + sse_encode_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerConversationLink( + ConversationLink self, + SseSerializer serializer, + ); + + @protected + void + sse_encode_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerConversationParticipant( + ConversationParticipant self, + SseSerializer serializer, + ); + + @protected + void + sse_encode_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerDate( + Date self, + SseSerializer serializer, + ); + + @protected + void + sse_encode_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerEscrowData( + EscrowData self, + SseSerializer serializer, + ); + + @protected + void + sse_encode_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerFindMyFriendsClientDefaultAnisetteProvider( + FindMyFriendsClientDefaultAnisetteProvider self, + SseSerializer serializer, + ); + + @protected + void + sse_encode_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerFindMyPhoneClientDefaultAnisetteProvider( + FindMyPhoneClientDefaultAnisetteProvider self, + SseSerializer serializer, + ); + + @protected + void + sse_encode_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerGZipWrapperAttachmentMeta( + GZipWrapperAttachmentMeta self, + SseSerializer serializer, + ); + + @protected + void + sse_encode_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerGZipWrapperChatProto( + GZipWrapperChatProto self, + SseSerializer serializer, + ); + + @protected + void + sse_encode_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerGZipWrapperMessageProto( + GZipWrapperMessageProto self, + SseSerializer serializer, + ); + + @protected + void + sse_encode_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerGZipWrapperMessageProto2( + GZipWrapperMessageProto2 self, + SseSerializer serializer, + ); + + @protected + void + sse_encode_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerGZipWrapperMessageProto3( + GZipWrapperMessageProto3 self, + SseSerializer serializer, + ); + + @protected + void + sse_encode_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerGZipWrapperMessageProto4( + GZipWrapperMessageProto4 self, + SseSerializer serializer, + ); + + @protected + void + sse_encode_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerIDSNGMIdentity( + IdsngmIdentity self, + SseSerializer serializer, + ); + + @protected + void + sse_encode_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerIDSUser( + IdsUser self, + SseSerializer serializer, + ); + + @protected + void + sse_encode_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerJoinedOSConfig( + JoinedOsConfig self, + SseSerializer serializer, + ); + + @protected + void + sse_encode_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerLocationReport( + LocationReport self, + SseSerializer serializer, + ); + + @protected + void + sse_encode_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerMessageFlags( + MessageFlags self, + SseSerializer serializer, + ); + + @protected + void + sse_encode_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerNSArrayLPIconMetadata( + NsArrayLpIconMetadata self, + SseSerializer serializer, + ); + + @protected + void + sse_encode_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerNSArrayLPImageMetadata( + NsArrayLpImageMetadata self, + SseSerializer serializer, + ); + + @protected + void + sse_encode_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerPushError( + PushError self, + SseSerializer serializer, + ); + + @protected + void + sse_encode_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerReceiverAPSMessage( + ReceiverApsMessage self, + SseSerializer serializer, + ); + + @protected + void + sse_encode_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerSavedHardwareState( + SavedHardwareState self, + SseSerializer serializer, + ); + + @protected + void + sse_encode_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerSender( + Sender self, + SseSerializer serializer, + ); + + @protected + void + sse_encode_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerStCollapsedValue( + StCollapsedValue self, + SseSerializer serializer, + ); + + @protected + void + sse_encode_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerSyncManagerDefaultAnisetteProviderMyFilePackager( + SyncManagerDefaultAnisetteProviderMyFilePackager self, + SseSerializer serializer, + ); + + @protected + void + sse_encode_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerSystemTime( + SystemTime self, + SseSerializer serializer, + ); + + @protected + void + sse_encode_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerVerifyBody( + VerifyBody self, + SseSerializer serializer, + ); + + @protected + void + sse_encode_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerViableBottle( + ViableBottle self, + SseSerializer serializer, + ); + + @protected + void sse_encode_Set_ft_member(Set self, SseSerializer serializer); + + @protected + void sse_encode_StreamSink_mmcs_transfer_progress_Sse( + RustStreamSink self, + SseSerializer serializer, + ); + + @protected + void sse_encode_StreamSink_transfer_progress_Sse( + RustStreamSink self, + SseSerializer serializer, + ); + + @protected + void sse_encode_String(String self, SseSerializer serializer); + + @protected + void sse_encode_address(Address self, SseSerializer serializer); + + @protected + void sse_encode_ak_data(AkData self, SseSerializer serializer); + + @protected + void sse_encode_aps_alert(ApsAlert self, SseSerializer serializer); + + @protected + void sse_encode_aps_connection_status( + ApsConnectionStatus self, + SseSerializer serializer, + ); + + @protected + void sse_encode_aps_data(ApsData self, SseSerializer serializer); + + @protected + void sse_encode_attachment(Attachment self, SseSerializer serializer); + + @protected + void sse_encode_attachment_meta( + AttachmentMeta self, + SseSerializer serializer, + ); + + @protected + void sse_encode_attachment_meta_extra( + AttachmentMetaExtra self, + SseSerializer serializer, + ); + + @protected + void sse_encode_attachment_type( + AttachmentType self, + SseSerializer serializer, + ); + + @protected + void sse_encode_balloon(Balloon self, SseSerializer serializer); + + @protected + void sse_encode_balloon_layout(BalloonLayout self, SseSerializer serializer); + + @protected + void sse_encode_beacon_attributes( + BeaconAttributes self, + SseSerializer serializer, + ); + + @protected + void sse_encode_beacon_naming_record( + BeaconNamingRecord self, + SseSerializer serializer, + ); + + @protected + void sse_encode_bool(bool self, SseSerializer serializer); + + @protected + void + sse_encode_box_autoadd_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerAPSState( + ApsState self, + SseSerializer serializer, + ); + + @protected + void + sse_encode_box_autoadd_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcCloudKitClientDefaultAnisetteProvider( + ArcCloudKitClientDefaultAnisetteProvider self, + SseSerializer serializer, + ); + + @protected + void + sse_encode_box_autoadd_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcCloudMessagesClientDefaultAnisetteProvider( + ArcCloudMessagesClientDefaultAnisetteProvider self, + SseSerializer serializer, + ); + + @protected + void + sse_encode_box_autoadd_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcFindMyClientDefaultAnisetteProvider( + ArcFindMyClientDefaultAnisetteProvider self, + SseSerializer serializer, + ); + + @protected + void + sse_encode_box_autoadd_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcKeychainClientDefaultAnisetteProvider( + ArcKeychainClientDefaultAnisetteProvider self, + SseSerializer serializer, + ); + + @protected + void + sse_encode_box_autoadd_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcMutexAppleAccountDefaultAnisetteProvider( + ArcMutexAppleAccountDefaultAnisetteProvider self, + SseSerializer serializer, + ); + + @protected + void + sse_encode_box_autoadd_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcPasswordManagerDefaultAnisetteProvider( + ArcPasswordManagerDefaultAnisetteProvider self, + SseSerializer serializer, + ); + + @protected + void + sse_encode_box_autoadd_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerAsset( + Asset self, + SseSerializer serializer, + ); + + @protected + void + sse_encode_box_autoadd_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerChannelInterestToken( + ChannelInterestToken self, + SseSerializer serializer, + ); + + @protected + void + sse_encode_box_autoadd_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerCircleClientSessionDefaultAnisetteProvider( + CircleClientSessionDefaultAnisetteProvider self, + SseSerializer serializer, + ); + + @protected + void + sse_encode_box_autoadd_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerCloudSyncPreparedMessageCreateHandle( + CloudSyncPreparedMessageCreateHandle self, + SseSerializer serializer, + ); + + @protected + void + sse_encode_box_autoadd_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerConversationLink( + ConversationLink self, + SseSerializer serializer, + ); + + @protected + void + sse_encode_box_autoadd_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerConversationParticipant( + ConversationParticipant self, + SseSerializer serializer, + ); + + @protected + void + sse_encode_box_autoadd_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerDate( + Date self, + SseSerializer serializer, + ); + + @protected + void + sse_encode_box_autoadd_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerGZipWrapperChatProto( + GZipWrapperChatProto self, + SseSerializer serializer, + ); + + @protected + void + sse_encode_box_autoadd_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerGZipWrapperMessageProto2( + GZipWrapperMessageProto2 self, + SseSerializer serializer, + ); + + @protected + void + sse_encode_box_autoadd_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerGZipWrapperMessageProto3( + GZipWrapperMessageProto3 self, + SseSerializer serializer, + ); + + @protected + void + sse_encode_box_autoadd_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerGZipWrapperMessageProto4( + GZipWrapperMessageProto4 self, + SseSerializer serializer, + ); + + @protected + void + sse_encode_box_autoadd_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerIDSUser( + IdsUser self, + SseSerializer serializer, + ); + + @protected + void + sse_encode_box_autoadd_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerLocationReport( + LocationReport self, + SseSerializer serializer, + ); + + @protected + void + sse_encode_box_autoadd_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerNSArrayLPIconMetadata( + NsArrayLpIconMetadata self, + SseSerializer serializer, + ); + + @protected + void + sse_encode_box_autoadd_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerNSArrayLPImageMetadata( + NsArrayLpImageMetadata self, + SseSerializer serializer, + ); + + @protected + void + sse_encode_box_autoadd_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerPushError( + PushError self, + SseSerializer serializer, + ); + + @protected + void + sse_encode_box_autoadd_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerSavedHardwareState( + SavedHardwareState self, + SseSerializer serializer, + ); + + @protected + void + sse_encode_box_autoadd_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerSyncManagerDefaultAnisetteProviderMyFilePackager( + SyncManagerDefaultAnisetteProviderMyFilePackager self, + SseSerializer serializer, + ); + + @protected + void + sse_encode_box_autoadd_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerSystemTime( + SystemTime self, + SseSerializer serializer, + ); + + @protected + void sse_encode_box_autoadd_address(Address self, SseSerializer serializer); + + @protected + void sse_encode_box_autoadd_attachment( + Attachment self, + SseSerializer serializer, + ); + + @protected + void sse_encode_box_autoadd_attachment_meta( + AttachmentMeta self, + SseSerializer serializer, + ); + + @protected + void sse_encode_box_autoadd_attachment_meta_extra( + AttachmentMetaExtra self, + SseSerializer serializer, + ); + + @protected + void sse_encode_box_autoadd_balloon(Balloon self, SseSerializer serializer); + + @protected + void sse_encode_box_autoadd_balloon_layout( + BalloonLayout self, + SseSerializer serializer, + ); + + @protected + void sse_encode_box_autoadd_beacon_attributes( + BeaconAttributes self, + SseSerializer serializer, + ); + + @protected + void sse_encode_box_autoadd_beacon_naming_record( + BeaconNamingRecord self, + SseSerializer serializer, + ); + + @protected + void sse_encode_box_autoadd_bool(bool self, SseSerializer serializer); + + @protected + void sse_encode_box_autoadd_certified_context( + CertifiedContext self, + SseSerializer serializer, + ); + + @protected + void sse_encode_box_autoadd_change_participant_message( + ChangeParticipantMessage self, + SseSerializer serializer, + ); + + @protected + void sse_encode_box_autoadd_chat_proto( + ChatProto self, + SseSerializer serializer, + ); + + @protected + void sse_encode_box_autoadd_cloud_attachment( + CloudAttachment self, + SseSerializer serializer, + ); + + @protected + void sse_encode_box_autoadd_cloud_chat( + CloudChat self, + SseSerializer serializer, + ); + + @protected + void sse_encode_box_autoadd_cloud_message( + CloudMessage self, + SseSerializer serializer, + ); + + @protected + void sse_encode_box_autoadd_cloud_prop( + CloudProp self, + SseSerializer serializer, + ); + + @protected + void sse_encode_box_autoadd_cloud_sync_outbound_failure_class( + CloudSyncOutboundFailureClass self, + SseSerializer serializer, + ); + + @protected + void sse_encode_box_autoadd_cloud_sync_outbound_reconcile_disposition( + CloudSyncOutboundReconcileDisposition self, + SseSerializer serializer, + ); + + @protected + void sse_encode_box_autoadd_cloud_sync_outbound_safe_code( + CloudSyncOutboundSafeCode self, + SseSerializer serializer, + ); + + @protected + void sse_encode_box_autoadd_cloud_sync_prepared_message_create_input( + CloudSyncPreparedMessageCreateInput self, + SseSerializer serializer, + ); + + @protected + void sse_encode_box_autoadd_cloud_sync_protected_failure( + CloudSyncProtectedFailure self, + SseSerializer serializer, + ); + + @protected + void sse_encode_box_autoadd_cloud_sync_protected_garbage_collection( + CloudSyncProtectedGarbageCollection self, + SseSerializer serializer, + ); + + @protected + void sse_encode_box_autoadd_cloud_sync_protected_outbound_stage( + CloudSyncProtectedOutboundStage self, + SseSerializer serializer, + ); + + @protected + void sse_encode_box_autoadd_cloud_sync_protected_page( + CloudSyncProtectedPage self, + SseSerializer serializer, + ); + + @protected + void sse_encode_box_autoadd_cloud_sync_protected_preflight_code( + CloudSyncProtectedPreflightCode self, + SseSerializer serializer, + ); + + @protected + void sse_encode_box_autoadd_cloud_sync_protected_recovery( + CloudSyncProtectedRecovery self, + SseSerializer serializer, + ); + + @protected + void sse_encode_box_autoadd_cloud_sync_raw_failure( + CloudSyncRawFailure self, + SseSerializer serializer, + ); + + @protected + void sse_encode_box_autoadd_cloud_sync_raw_page( + CloudSyncRawPage self, + SseSerializer serializer, + ); + + @protected + void sse_encode_box_autoadd_cloud_sync_raw_system_fields( + CloudSyncRawSystemFields self, + SseSerializer serializer, + ); + + @protected + void sse_encode_box_autoadd_cloud_sync_transient_attachment_payload( + CloudSyncTransientAttachmentPayload self, + SseSerializer serializer, + ); + + @protected + void sse_encode_box_autoadd_cloud_sync_transient_chat_payload( + CloudSyncTransientChatPayload self, + SseSerializer serializer, + ); + + @protected + void sse_encode_box_autoadd_cloud_sync_transient_deferred_reason( + CloudSyncTransientDeferredReason self, + SseSerializer serializer, + ); + + @protected + void sse_encode_box_autoadd_cloud_sync_transient_entity_kind( + CloudSyncTransientEntityKind self, + SseSerializer serializer, + ); + + @protected + void sse_encode_box_autoadd_cloud_sync_transient_failure_code( + CloudSyncTransientFailureCode self, + SseSerializer serializer, + ); + + @protected + void sse_encode_box_autoadd_cloud_sync_transient_group_photo_payload( + CloudSyncTransientGroupPhotoPayload self, + SseSerializer serializer, + ); + + @protected + void sse_encode_box_autoadd_cloud_sync_transient_message_payload( + CloudSyncTransientMessagePayload self, + SseSerializer serializer, + ); + + @protected + void sse_encode_box_autoadd_cloud_sync_transient_mutation_kind( + CloudSyncTransientMutationKind self, + SseSerializer serializer, + ); + + @protected + void sse_encode_box_autoadd_cloud_sync_transient_payload( + CloudSyncTransientPayload self, + SseSerializer serializer, + ); + + @protected + void sse_encode_box_autoadd_cloud_sync_transient_quarantine_reason( + CloudSyncTransientQuarantineReason self, + SseSerializer serializer, + ); + + @protected + void sse_encode_box_autoadd_cloud_sync_transient_reaction_kind( + CloudSyncTransientReactionKind self, + SseSerializer serializer, + ); + + @protected + void sse_encode_box_autoadd_cloud_sync_transient_snapshot( + CloudSyncTransientSnapshot self, + SseSerializer serializer, + ); + + @protected + void sse_encode_box_autoadd_cloud_sync_transient_tombstone( + CloudSyncTransientTombstone self, + SseSerializer serializer, + ); + + @protected + void sse_encode_box_autoadd_conversation_data( + ConversationData self, + SseSerializer serializer, + ); + + @protected + void sse_encode_box_autoadd_dart_beacon_share_info( + DartBeaconShareInfo self, + SseSerializer serializer, + ); + + @protected + void sse_encode_box_autoadd_edit_message( + EditMessage self, + SseSerializer serializer, + ); + + @protected + void sse_encode_box_autoadd_error_message( + ErrorMessage self, + SseSerializer serializer, + ); + + @protected + void sse_encode_box_autoadd_extension_app( + ExtensionApp self, + SseSerializer serializer, + ); + + @protected + void sse_encode_box_autoadd_f_64(double self, SseSerializer serializer); + + @protected + void sse_encode_box_autoadd_ft_message( + FTMessage self, + SseSerializer serializer, + ); + + @protected + void sse_encode_box_autoadd_ft_mode(FTMode self, SseSerializer serializer); + + @protected + void sse_encode_box_autoadd_hw_extra(HwExtra self, SseSerializer serializer); + + @protected + void sse_encode_box_autoadd_i_32(int self, SseSerializer serializer); + + @protected + void sse_encode_box_autoadd_i_64( + PlatformInt64 self, + SseSerializer serializer, + ); + + @protected + void sse_encode_box_autoadd_i_message_nickname_record( + IMessageNicknameRecord self, + SseSerializer serializer, + ); + + @protected + void sse_encode_box_autoadd_i_message_poster_record( + IMessagePosterRecord self, + SseSerializer serializer, + ); + + @protected + void sse_encode_box_autoadd_icon_change_message( + IconChangeMessage self, + SseSerializer serializer, + ); + + @protected + void sse_encode_box_autoadd_idms_circle_message( + IdmsCircleMessage self, + SseSerializer serializer, + ); + + @protected + void sse_encode_box_autoadd_idms_message( + IdmsMessage self, + SseSerializer serializer, + ); + + @protected + void sse_encode_box_autoadd_idms_requested_sign_in( + IdmsRequestedSignIn self, + SseSerializer serializer, + ); + + @protected + void sse_encode_box_autoadd_let_me_in_request( + LetMeInRequest self, + SseSerializer serializer, + ); + + @protected + void sse_encode_box_autoadd_link_meta( + LinkMeta self, + SseSerializer serializer, + ); + + @protected + void sse_encode_box_autoadd_location(Location self, SseSerializer serializer); + + @protected + void sse_encode_box_autoadd_login_state( + LoginState self, + SseSerializer serializer, + ); + + @protected + void sse_encode_box_autoadd_lp_icon_metadata( + LPIconMetadata self, + SseSerializer serializer, + ); + + @protected + void sse_encode_box_autoadd_lp_image_metadata( + LPImageMetadata self, + SseSerializer serializer, + ); + + @protected + void sse_encode_box_autoadd_lp_specialization_metadata( + LPSpecializationMetadata self, + SseSerializer serializer, + ); + + @protected + void sse_encode_box_autoadd_memoji_data( + MemojiData self, + SseSerializer serializer, + ); + + @protected + void sse_encode_box_autoadd_message(Message self, SseSerializer serializer); + + @protected + void sse_encode_box_autoadd_message_inst( + MessageInst self, + SseSerializer serializer, + ); + + @protected + void sse_encode_box_autoadd_message_parts( + MessageParts self, + SseSerializer serializer, + ); + + @protected + void sse_encode_box_autoadd_message_proto( + MessageProto self, + SseSerializer serializer, + ); + + @protected + void sse_encode_box_autoadd_message_proto_2( + MessageProto2 self, + SseSerializer serializer, + ); + + @protected + void sse_encode_box_autoadd_message_proto_3( + MessageProto3 self, + SseSerializer serializer, + ); + + @protected + void sse_encode_box_autoadd_message_proto_4( + MessageProto4 self, + SseSerializer serializer, + ); + + @protected + void sse_encode_box_autoadd_message_summary_info( + MessageSummaryInfo self, + SseSerializer serializer, + ); + + @protected + void sse_encode_box_autoadd_mmcs_attachment_meta( + MMCSAttachmentMeta self, + SseSerializer serializer, + ); + + @protected + void sse_encode_box_autoadd_mmcs_file( + MMCSFile self, + SseSerializer serializer, + ); + + @protected + void sse_encode_box_autoadd_monogram_data( + MonogramData self, + SseSerializer serializer, + ); + + @protected + void sse_encode_box_autoadd_move_to_recycle_bin_message( + MoveToRecycleBinMessage self, + SseSerializer serializer, + ); + + @protected + void sse_encode_box_autoadd_normal_message( + NormalMessage self, + SseSerializer serializer, + ); + + @protected + void sse_encode_box_autoadd_ns_attributed_string( + NSAttributedString self, + SseSerializer serializer, + ); + + @protected + void sse_encode_box_autoadd_ns_number( + NSNumber self, + SseSerializer serializer, + ); + + @protected + void sse_encode_box_autoadd_ns_string( + NSString self, + SseSerializer serializer, + ); + + @protected + void sse_encode_box_autoadd_nsurl(NSURL self, SseSerializer serializer); + + @protected + void sse_encode_box_autoadd_num_or_string( + NumOrString self, + SseSerializer serializer, + ); + + @protected + void sse_encode_box_autoadd_operated_chat( + OperatedChat self, + SseSerializer serializer, + ); + + @protected + void sse_encode_box_autoadd_part_extension( + PartExtension self, + SseSerializer serializer, + ); + + @protected + void sse_encode_box_autoadd_passkey(Passkey self, SseSerializer serializer); + + @protected + void sse_encode_box_autoadd_password_manager_meta( + PasswordManagerMeta self, + SseSerializer serializer, + ); + + @protected + void sse_encode_box_autoadd_password_manager_meta_data( + PasswordManagerMetaData self, + SseSerializer serializer, + ); + + @protected + void sse_encode_box_autoadd_password_manager_meta_data_formerly_shared( + PasswordManagerMetaDataFormerlyShared self, + SseSerializer serializer, + ); + + @protected + void sse_encode_box_autoadd_password_manager_totp( + PasswordManagerTotp self, + SseSerializer serializer, + ); + + @protected + void sse_encode_box_autoadd_password_raw_entry( + PasswordRawEntry self, + SseSerializer serializer, + ); + + @protected + void sse_encode_box_autoadd_permanent_delete_message( + PermanentDeleteMessage self, + SseSerializer serializer, + ); + + @protected + void sse_encode_box_autoadd_poster_color( + PosterColor self, + SseSerializer serializer, + ); + + @protected + void sse_encode_box_autoadd_pr_poster_content_material_style( + PRPosterContentMaterialStyle self, + SseSerializer serializer, + ); + + @protected + void sse_encode_box_autoadd_push_message( + PushMessage self, + SseSerializer serializer, + ); + + @protected + void sse_encode_box_autoadd_react_message( + ReactMessage self, + SseSerializer serializer, + ); + + @protected + void sse_encode_box_autoadd_reaction(Reaction self, SseSerializer serializer); + + @protected + void + sse_encode_box_autoadd_record_shared_push_state_auto_owned_rust_opaque_flutter_rust_bridgefor_generated_rust_auto_opaque_inner_aps_watcher( + (SharedPushState, ApsWatcher) self, + SseSerializer serializer, + ); + + @protected + void sse_encode_box_autoadd_record_string_string( + (String, String) self, + SseSerializer serializer, + ); + + @protected + void sse_encode_box_autoadd_record_string_u_64( + (String, BigInt) self, + SseSerializer serializer, + ); + + @protected + void sse_encode_box_autoadd_register_state( + RegisterState self, + SseSerializer serializer, + ); + + @protected + void sse_encode_box_autoadd_rename_message( + RenameMessage self, + SseSerializer serializer, + ); + + @protected + void sse_encode_box_autoadd_rich_link_image_attachment_substitute( + RichLinkImageAttachmentSubstitute self, + SseSerializer serializer, + ); + + @protected + void sse_encode_box_autoadd_schedule_mode( + ScheduleMode self, + SseSerializer serializer, + ); + + @protected + void sse_encode_box_autoadd_set_transcript_background_message( + SetTranscriptBackgroundMessage self, + SseSerializer serializer, + ); + + @protected + void sse_encode_box_autoadd_share_profile_message( + ShareProfileMessage self, + SseSerializer serializer, + ); + + @protected + void sse_encode_box_autoadd_shared_album( + SharedAlbum self, + SseSerializer serializer, + ); + + @protected + void sse_encode_box_autoadd_shared_i_cloud_services( + SharedICloudServices self, + SseSerializer serializer, + ); + + @protected + void sse_encode_box_autoadd_shared_poster( + SharedPoster self, + SseSerializer serializer, + ); + + @protected + void sse_encode_box_autoadd_shared_push_state( + SharedPushState self, + SseSerializer serializer, + ); + + @protected + void sse_encode_box_autoadd_simplified_incoming_call_poster( + SimplifiedIncomingCallPoster self, + SseSerializer serializer, + ); + + @protected + void sse_encode_box_autoadd_simplified_transcript_poster( + SimplifiedTranscriptPoster self, + SseSerializer serializer, + ); + + @protected + void sse_encode_box_autoadd_status_kit_message( + StatusKitMessage self, + SseSerializer serializer, + ); + + @protected + void sse_encode_box_autoadd_support_action( + SupportAction self, + SseSerializer serializer, + ); + + @protected + void sse_encode_box_autoadd_support_alert( + SupportAlert self, + SseSerializer serializer, + ); + + @protected + void sse_encode_box_autoadd_teardown_sign_in( + TeardownSignIn self, + SseSerializer serializer, + ); + + @protected + void sse_encode_box_autoadd_text_flags( + TextFlags self, + SseSerializer serializer, + ); + + @protected + void sse_encode_box_autoadd_text_format( + TextFormat self, + SseSerializer serializer, + ); + + @protected + void sse_encode_box_autoadd_transcript_dynamic_user_data( + TranscriptDynamicUserData self, + SseSerializer serializer, + ); + + @protected + void sse_encode_box_autoadd_typing_app( + TypingApp self, + SseSerializer serializer, + ); + + @protected + void sse_encode_box_autoadd_u_16(int self, SseSerializer serializer); + + @protected + void sse_encode_box_autoadd_u_32(int self, SseSerializer serializer); + + @protected + void sse_encode_box_autoadd_u_64(BigInt self, SseSerializer serializer); + + @protected + void sse_encode_box_autoadd_unsend_message( + UnsendMessage self, + SseSerializer serializer, + ); + + @protected + void sse_encode_box_autoadd_update_account_finish( + UpdateAccountFinish self, + SseSerializer serializer, + ); + + @protected + void sse_encode_box_autoadd_update_extension_message( + UpdateExtensionMessage self, + SseSerializer serializer, + ); + + @protected + void sse_encode_box_autoadd_update_profile_message( + UpdateProfileMessage self, + SseSerializer serializer, + ); + + @protected + void sse_encode_box_autoadd_update_profile_sharing_message( + UpdateProfileSharingMessage self, + SseSerializer serializer, + ); + + @protected + void sse_encode_box_autoadd_wifi_password( + WifiPassword self, + SseSerializer serializer, + ); + + @protected + void sse_encode_certified_context( + CertifiedContext self, + SseSerializer serializer, + ); + + @protected + void sse_encode_change_participant_message( + ChangeParticipantMessage self, + SseSerializer serializer, + ); + + @protected + void sse_encode_chat_proto(ChatProto self, SseSerializer serializer); + + @protected + void sse_encode_cloud_attachment( + CloudAttachment self, + SseSerializer serializer, + ); + + @protected + void sse_encode_cloud_chat(CloudChat self, SseSerializer serializer); + + @protected + void sse_encode_cloud_message(CloudMessage self, SseSerializer serializer); + + @protected + void sse_encode_cloud_message_summary( + CloudMessageSummary self, + SseSerializer serializer, + ); + + @protected + void sse_encode_cloud_participant( + CloudParticipant self, + SseSerializer serializer, + ); + + @protected + void sse_encode_cloud_prop(CloudProp self, SseSerializer serializer); + + @protected + void sse_encode_cloud_prop_001(CloudProp001 self, SseSerializer serializer); + + @protected + void sse_encode_cloud_sync_native_auth_metadata( + CloudSyncNativeAuthMetadata self, + SseSerializer serializer, + ); + + @protected + void sse_encode_cloud_sync_outbound_consume_result( + CloudSyncOutboundConsumeResult self, + SseSerializer serializer, + ); + + @protected + void sse_encode_cloud_sync_outbound_failure_class( + CloudSyncOutboundFailureClass self, + SseSerializer serializer, + ); + + @protected + void sse_encode_cloud_sync_outbound_reconcile_disposition( + CloudSyncOutboundReconcileDisposition self, + SseSerializer serializer, + ); + + @protected + void sse_encode_cloud_sync_outbound_reconcile_result( + CloudSyncOutboundReconcileResult self, + SseSerializer serializer, + ); + + @protected + void sse_encode_cloud_sync_outbound_safe_code( + CloudSyncOutboundSafeCode self, + SseSerializer serializer, + ); + + @protected + void sse_encode_cloud_sync_outbound_save_disposition( + CloudSyncOutboundSaveDisposition self, + SseSerializer serializer, + ); + + @protected + void sse_encode_cloud_sync_outbound_save_outcome( + CloudSyncOutboundSaveOutcome self, + SseSerializer serializer, + ); + + @protected + void sse_encode_cloud_sync_prepared_message_create_input( + CloudSyncPreparedMessageCreateInput self, + SseSerializer serializer, + ); + + @protected + void sse_encode_cloud_sync_prepared_message_create_result( + CloudSyncPreparedMessageCreateResult self, + SseSerializer serializer, + ); + + @protected + void sse_encode_cloud_sync_protected_change( + CloudSyncProtectedChange self, + SseSerializer serializer, + ); + + @protected + void sse_encode_cloud_sync_protected_change_kind( + CloudSyncProtectedChangeKind self, + SseSerializer serializer, + ); + + @protected + void sse_encode_cloud_sync_protected_failure( + CloudSyncProtectedFailure self, + SseSerializer serializer, + ); + + @protected + void sse_encode_cloud_sync_protected_failure_category( + CloudSyncProtectedFailureCategory self, + SseSerializer serializer, + ); + + @protected + void sse_encode_cloud_sync_protected_fetch_result( + CloudSyncProtectedFetchResult self, + SseSerializer serializer, + ); + + @protected + void sse_encode_cloud_sync_protected_garbage_collection( + CloudSyncProtectedGarbageCollection self, + SseSerializer serializer, + ); + + @protected + void sse_encode_cloud_sync_protected_garbage_collection_result( + CloudSyncProtectedGarbageCollectionResult self, + SseSerializer serializer, + ); + + @protected + void sse_encode_cloud_sync_protected_lease_result( + CloudSyncProtectedLeaseResult self, + SseSerializer serializer, + ); + + @protected + void sse_encode_cloud_sync_protected_outbound_stage( + CloudSyncProtectedOutboundStage self, + SseSerializer serializer, + ); + + @protected + void sse_encode_cloud_sync_protected_outbound_stage_result( + CloudSyncProtectedOutboundStageResult self, + SseSerializer serializer, + ); + + @protected + void sse_encode_cloud_sync_protected_page( + CloudSyncProtectedPage self, + SseSerializer serializer, + ); + + @protected + void sse_encode_cloud_sync_protected_preflight_code( + CloudSyncProtectedPreflightCode self, + SseSerializer serializer, + ); + + @protected + void sse_encode_cloud_sync_protected_recovery( + CloudSyncProtectedRecovery self, + SseSerializer serializer, + ); + + @protected + void sse_encode_cloud_sync_protected_recovery_result( + CloudSyncProtectedRecoveryResult self, + SseSerializer serializer, + ); + + @protected + void sse_encode_cloud_sync_protected_retirement_result( + CloudSyncProtectedRetirementResult self, + SseSerializer serializer, + ); + + @protected + void sse_encode_cloud_sync_protected_safe_code( + CloudSyncProtectedSafeCode self, + SseSerializer serializer, + ); + + @protected + void sse_encode_cloud_sync_raw_change( + CloudSyncRawChange self, + SseSerializer serializer, + ); + + @protected + void sse_encode_cloud_sync_raw_failure( + CloudSyncRawFailure self, + SseSerializer serializer, + ); + + @protected + void sse_encode_cloud_sync_raw_failure_category( + CloudSyncRawFailureCategory self, + SseSerializer serializer, + ); + + @protected + void sse_encode_cloud_sync_raw_fetch_result( + CloudSyncRawFetchResult self, + SseSerializer serializer, + ); + + @protected + void sse_encode_cloud_sync_raw_page( + CloudSyncRawPage self, + SseSerializer serializer, + ); + + @protected + void sse_encode_cloud_sync_raw_record_kind( + CloudSyncRawRecordKind self, + SseSerializer serializer, + ); + + @protected + void sse_encode_cloud_sync_raw_system_fields( + CloudSyncRawSystemFields self, + SseSerializer serializer, + ); + + @protected + void sse_encode_cloud_sync_transient_association_kind( + CloudSyncTransientAssociationKind self, + SseSerializer serializer, + ); + + @protected + void sse_encode_cloud_sync_transient_attachment_payload( + CloudSyncTransientAttachmentPayload self, + SseSerializer serializer, + ); + + @protected + void sse_encode_cloud_sync_transient_attributed_body( + CloudSyncTransientAttributedBody self, + SseSerializer serializer, + ); + + @protected + void sse_encode_cloud_sync_transient_chat_payload( + CloudSyncTransientChatPayload self, + SseSerializer serializer, + ); + + @protected + void sse_encode_cloud_sync_transient_chat_style( + CloudSyncTransientChatStyle self, + SseSerializer serializer, + ); + + @protected + void sse_encode_cloud_sync_transient_decode_result( + CloudSyncTransientDecodeResult self, + SseSerializer serializer, + ); + + @protected + void sse_encode_cloud_sync_transient_deferred_reason( + CloudSyncTransientDeferredReason self, + SseSerializer serializer, + ); + + @protected + void sse_encode_cloud_sync_transient_edit_part( + CloudSyncTransientEditPart self, + SseSerializer serializer, + ); + + @protected + void sse_encode_cloud_sync_transient_entity_kind( + CloudSyncTransientEntityKind self, + SseSerializer serializer, + ); + + @protected + void sse_encode_cloud_sync_transient_failure_code( + CloudSyncTransientFailureCode self, + SseSerializer serializer, + ); + + @protected + void sse_encode_cloud_sync_transient_field_state( + CloudSyncTransientFieldState self, + SseSerializer serializer, + ); + + @protected + void sse_encode_cloud_sync_transient_group_photo_payload( + CloudSyncTransientGroupPhotoPayload self, + SseSerializer serializer, + ); + + @protected + void sse_encode_cloud_sync_transient_known_message_flags( + CloudSyncTransientKnownMessageFlags self, + SseSerializer serializer, + ); + + @protected + void sse_encode_cloud_sync_transient_message_edit( + CloudSyncTransientMessageEdit self, + SseSerializer serializer, + ); + + @protected + void sse_encode_cloud_sync_transient_message_payload( + CloudSyncTransientMessagePayload self, + SseSerializer serializer, + ); + + @protected + void sse_encode_cloud_sync_transient_mutation_kind( + CloudSyncTransientMutationKind self, + SseSerializer serializer, + ); + + @protected + void sse_encode_cloud_sync_transient_payload( + CloudSyncTransientPayload self, + SseSerializer serializer, + ); + + @protected + void sse_encode_cloud_sync_transient_quarantine_reason( + CloudSyncTransientQuarantineReason self, + SseSerializer serializer, + ); + + @protected + void sse_encode_cloud_sync_transient_reaction_kind( + CloudSyncTransientReactionKind self, + SseSerializer serializer, + ); + + @protected + void sse_encode_cloud_sync_transient_service( + CloudSyncTransientService self, + SseSerializer serializer, + ); + + @protected + void sse_encode_cloud_sync_transient_snapshot( + CloudSyncTransientSnapshot self, + SseSerializer serializer, + ); + + @protected + void sse_encode_cloud_sync_transient_text_run( + CloudSyncTransientTextRun self, + SseSerializer serializer, + ); + + @protected + void sse_encode_cloud_sync_transient_tombstone( + CloudSyncTransientTombstone self, + SseSerializer serializer, + ); + + @protected + void sse_encode_conversation_data( + ConversationData self, + SseSerializer serializer, + ); + + @protected + void sse_encode_dart_beacon(DartBeacon self, SseSerializer serializer); + + @protected + void sse_encode_dart_beacon_share_info( + DartBeaconShareInfo self, + SseSerializer serializer, + ); + + @protected + void sse_encode_delete_target(DeleteTarget self, SseSerializer serializer); + + @protected + void sse_encode_device_info(DeviceInfo self, SseSerializer serializer); + + @protected + void sse_encode_edit_message(EditMessage self, SseSerializer serializer); + + @protected + void sse_encode_error_message(ErrorMessage self, SseSerializer serializer); + + @protected + void sse_encode_extension_app(ExtensionApp self, SseSerializer serializer); + + @protected + void sse_encode_f_32(double self, SseSerializer serializer); + + @protected + void sse_encode_f_64(double self, SseSerializer serializer); + + @protected + void sse_encode_ffi_file_packager( + FFIFilePackager self, + SseSerializer serializer, + ); + + @protected + void sse_encode_follow(Follow self, SseSerializer serializer); + + @protected + void sse_encode_found_device(FoundDevice self, SseSerializer serializer); + + @protected + void sse_encode_ft_member(FTMember self, SseSerializer serializer); + + @protected + void sse_encode_ft_message(FTMessage self, SseSerializer serializer); + + @protected + void sse_encode_ft_mode(FTMode self, SseSerializer serializer); + + @protected + void sse_encode_ft_participant(FTParticipant self, SseSerializer serializer); + + @protected + void sse_encode_ft_session(FTSession self, SseSerializer serializer); + + @protected + void sse_encode_group_summary(GroupSummary self, SseSerializer serializer); + + @protected + void sse_encode_group_summary_member( + GroupSummaryMember self, + SseSerializer serializer, + ); + + @protected + void sse_encode_hw_extra(HwExtra self, SseSerializer serializer); + + @protected + void sse_encode_i_32(int self, SseSerializer serializer); + + @protected + void sse_encode_i_64(PlatformInt64 self, SseSerializer serializer); + + @protected + void sse_encode_i_message_name_record( + IMessageNameRecord self, + SseSerializer serializer, + ); + + @protected + void sse_encode_i_message_nickname_record( + IMessageNicknameRecord self, + SseSerializer serializer, + ); + + @protected + void sse_encode_i_message_poster_record( + IMessagePosterRecord self, + SseSerializer serializer, + ); + + @protected + void sse_encode_icon_change_message( + IconChangeMessage self, + SseSerializer serializer, + ); + + @protected + void sse_encode_idms_circle_message( + IdmsCircleMessage self, + SseSerializer serializer, + ); + + @protected + void sse_encode_idms_message(IdmsMessage self, SseSerializer serializer); + + @protected + void sse_encode_idms_requested_sign_in( + IdmsRequestedSignIn self, + SseSerializer serializer, + ); + + @protected + void sse_encode_indexed_message_part( + IndexedMessagePart self, + SseSerializer serializer, + ); + + @protected + void sse_encode_let_me_in_request( + LetMeInRequest self, + SseSerializer serializer, + ); + + @protected + void sse_encode_link_meta(LinkMeta self, SseSerializer serializer); + + @protected + void + sse_encode_list_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerIDSUser( + List self, + SseSerializer serializer, + ); + + @protected + void + sse_encode_list_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerStCollapsedValue( + List self, + SseSerializer serializer, + ); + + @protected + void + sse_encode_list_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerViableBottle( + List self, + SseSerializer serializer, + ); + + @protected + void sse_encode_list_String(List self, SseSerializer serializer); + + @protected + void sse_encode_list_cloud_participant( + List self, + SseSerializer serializer, + ); + + @protected + void sse_encode_list_cloud_sync_outbound_save_outcome( + List self, + SseSerializer serializer, + ); + + @protected + void sse_encode_list_cloud_sync_prepared_message_create_input( + List self, + SseSerializer serializer, + ); + + @protected + void sse_encode_list_cloud_sync_protected_change( + List self, + SseSerializer serializer, + ); + + @protected + void sse_encode_list_cloud_sync_raw_change( + List self, + SseSerializer serializer, + ); + + @protected + void sse_encode_list_cloud_sync_transient_attributed_body( + List self, + SseSerializer serializer, + ); + + @protected + void sse_encode_list_cloud_sync_transient_edit_part( + List self, + SseSerializer serializer, + ); + + @protected + void sse_encode_list_cloud_sync_transient_message_edit( + List self, + SseSerializer serializer, + ); + + @protected + void sse_encode_list_cloud_sync_transient_text_run( + List self, + SseSerializer serializer, + ); + + @protected + void sse_encode_list_dart_beacon( + List self, + SseSerializer serializer, + ); + + @protected + void sse_encode_list_follow(List self, SseSerializer serializer); + + @protected + void sse_encode_list_found_device( + List self, + SseSerializer serializer, + ); + + @protected + void sse_encode_list_ft_member(List self, SseSerializer serializer); + + @protected + void sse_encode_list_ft_session( + List self, + SseSerializer serializer, + ); + + @protected + void sse_encode_list_group_summary_member( + List self, + SseSerializer serializer, + ); + + @protected + void sse_encode_list_indexed_message_part( + List self, + SseSerializer serializer, + ); + + @protected + void sse_encode_list_list_prim_u_8_strict( + List self, + SseSerializer serializer, + ); + + @protected + void sse_encode_list_message_edit( + List self, + SseSerializer serializer, + ); + + @protected + void sse_encode_list_message_target( + List self, + SseSerializer serializer, + ); + + @protected + void sse_encode_list_password_manager_alt_domain( + List self, + SseSerializer serializer, + ); + + @protected + void sse_encode_list_password_manager_meta_change( + List self, + SseSerializer serializer, + ); + + @protected + void sse_encode_list_photo_poster_layer( + List self, + SseSerializer serializer, + ); + + @protected + void sse_encode_list_poster_asset( + List self, + SseSerializer serializer, + ); + + @protected + void sse_encode_list_poster_color( + List self, + SseSerializer serializer, + ); + + @protected + void sse_encode_list_prim_f_64_strict( + Float64List self, + SseSerializer serializer, + ); + + @protected + void sse_encode_list_prim_i_64_strict( + Int64List self, + SseSerializer serializer, + ); + + @protected + void sse_encode_list_prim_u_32_strict( + Uint32List self, + SseSerializer serializer, + ); + + @protected + void sse_encode_list_prim_u_8_loose(List self, SseSerializer serializer); + + @protected + void sse_encode_list_prim_u_8_strict( + Uint8List self, + SseSerializer serializer, + ); + + @protected + void sse_encode_list_private_device_info( + List self, + SseSerializer serializer, + ); + + @protected + void + sse_encode_list_record_string_auto_owned_rust_opaque_flutter_rust_bridgefor_generated_rust_auto_opaque_inner_asset( + List<(String, Asset)> self, + SseSerializer serializer, + ); + + @protected + void + sse_encode_list_record_string_auto_owned_rust_opaque_flutter_rust_bridgefor_generated_rust_auto_opaque_inner_st_collapsed_value( + List<(String, StCollapsedValue)> self, + SseSerializer serializer, + ); + + @protected + void sse_encode_list_record_string_bool( + List<(String, bool)> self, + SseSerializer serializer, + ); + + @protected + void sse_encode_list_record_string_casted_primitive_u_64( + List<(String, int)> self, + SseSerializer serializer, + ); + + @protected + void sse_encode_list_record_string_cloud_attachment( + List<(String, CloudAttachment)> self, + SseSerializer serializer, + ); + + @protected + void sse_encode_list_record_string_cloud_chat( + List<(String, CloudChat)> self, + SseSerializer serializer, + ); + + @protected + void sse_encode_list_record_string_cloud_message( + List<(String, CloudMessage)> self, + SseSerializer serializer, + ); + + @protected + void sse_encode_list_record_string_ft_participant( + List<(String, FTParticipant)> self, + SseSerializer serializer, + ); + + @protected + void sse_encode_list_record_string_group_summary( + List<(String, GroupSummary)> self, + SseSerializer serializer, + ); + + @protected + void sse_encode_list_record_string_list_message_edit( + List<(String, List)> self, + SseSerializer serializer, + ); + + @protected + void sse_encode_list_record_string_list_prim_u_8_strict( + List<(String, Uint8List)> self, + SseSerializer serializer, + ); + + @protected + void sse_encode_list_record_string_message_edit_range( + List<(String, MessageEditRange)> self, + SseSerializer serializer, + ); + + @protected + void sse_encode_list_record_string_opt_box_autoadd_cloud_attachment( + List<(String, CloudAttachment?)> self, + SseSerializer serializer, + ); + + @protected + void sse_encode_list_record_string_opt_box_autoadd_cloud_chat( + List<(String, CloudChat?)> self, + SseSerializer serializer, + ); + + @protected + void sse_encode_list_record_string_opt_box_autoadd_cloud_message( + List<(String, CloudMessage?)> self, + SseSerializer serializer, + ); + + @protected + void sse_encode_list_record_string_password_manager_meta_data_ctx( + List<(String, PasswordManagerMetaDataCtx)> self, + SseSerializer serializer, + ); + + @protected + void sse_encode_list_record_string_record_opt_string_passkey( + List<(String, (String?, Passkey))> self, + SseSerializer serializer, + ); + + @protected + void sse_encode_list_record_string_record_opt_string_password_manager_meta( + List<(String, (String?, PasswordManagerMeta))> self, + SseSerializer serializer, + ); + + @protected + void sse_encode_list_record_string_record_opt_string_password_raw_entry( + List<(String, (String?, PasswordRawEntry))> self, + SseSerializer serializer, + ); + + @protected + void sse_encode_list_record_string_record_opt_string_wifi_password( + List<(String, (String?, WifiPassword))> self, + SseSerializer serializer, + ); + + @protected + void sse_encode_list_record_string_share_invite_content_data( + List<(String, ShareInviteContentData)> self, + SseSerializer serializer, + ); + + @protected + void sse_encode_list_record_string_status_kit_personal_config( + List<(String, StatusKitPersonalConfig)> self, + SseSerializer serializer, + ); + + @protected + void sse_encode_list_record_string_string( + List<(String, String)> self, + SseSerializer serializer, + ); + + @protected + void sse_encode_list_record_string_sync_status( + List<(String, SyncStatus)> self, + SseSerializer serializer, + ); + + @protected + void sse_encode_list_record_u_32_ns_dictionary_typed_coder( + List<(int, NSDictionaryTypedCoder)> self, + SseSerializer serializer, + ); + + @protected + void sse_encode_list_report_message( + List self, + SseSerializer serializer, + ); + + @protected + void sse_encode_list_shared_album( + List self, + SseSerializer serializer, + ); + + @protected + void sse_encode_list_trusted_phone_number( + List self, + SseSerializer serializer, + ); + + @protected + void sse_encode_list_ui_color(List self, SseSerializer serializer); + + @protected + void sse_encode_location(Location self, SseSerializer serializer); + + @protected + void sse_encode_login_state(LoginState self, SseSerializer serializer); + + @protected + void sse_encode_lp_icon_metadata( + LPIconMetadata self, + SseSerializer serializer, + ); + + @protected + void sse_encode_lp_image_metadata( + LPImageMetadata self, + SseSerializer serializer, + ); + + @protected + void sse_encode_lp_link_metadata( + LPLinkMetadata self, + SseSerializer serializer, + ); + + @protected + void sse_encode_lp_specialization_metadata( + LPSpecializationMetadata self, + SseSerializer serializer, + ); + + @protected + void sse_encode_memoji_data(MemojiData self, SseSerializer serializer); + + @protected + void sse_encode_message(Message self, SseSerializer serializer); + + @protected + void sse_encode_message_edit(MessageEdit self, SseSerializer serializer); + + @protected + void sse_encode_message_edit_range( + MessageEditRange self, + SseSerializer serializer, + ); + + @protected + void sse_encode_message_inst(MessageInst self, SseSerializer serializer); + + @protected + void sse_encode_message_part(MessagePart self, SseSerializer serializer); + + @protected + void sse_encode_message_parts(MessageParts self, SseSerializer serializer); + + @protected + void sse_encode_message_proto(MessageProto self, SseSerializer serializer); + + @protected + void sse_encode_message_proto_2(MessageProto2 self, SseSerializer serializer); + + @protected + void sse_encode_message_proto_3(MessageProto3 self, SseSerializer serializer); + + @protected + void sse_encode_message_proto_4(MessageProto4 self, SseSerializer serializer); + + @protected + void sse_encode_message_summary_info( + MessageSummaryInfo self, + SseSerializer serializer, + ); + + @protected + void sse_encode_message_target(MessageTarget self, SseSerializer serializer); + + @protected + void sse_encode_message_type(MessageType self, SseSerializer serializer); + + @protected + void sse_encode_mmcs_attachment_meta( + MMCSAttachmentMeta self, + SseSerializer serializer, + ); + + @protected + void sse_encode_mmcs_file(MMCSFile self, SseSerializer serializer); + + @protected + void sse_encode_mmcs_transfer_progress( + MMCSTransferProgress self, + SseSerializer serializer, + ); + + @protected + void sse_encode_monogram_data(MonogramData self, SseSerializer serializer); + + @protected + void sse_encode_move_to_recycle_bin_message( + MoveToRecycleBinMessage self, + SseSerializer serializer, + ); + + @protected + void sse_encode_my_async_runtime( + MyAsyncRuntime self, + SseSerializer serializer, + ); + + @protected + void sse_encode_normal_message(NormalMessage self, SseSerializer serializer); + + @protected + void sse_encode_ns_attributed_string( + NSAttributedString self, + SseSerializer serializer, + ); + + @protected + void sse_encode_ns_dictionary_class( + NSDictionaryClass self, + SseSerializer serializer, + ); + + @protected + void sse_encode_ns_dictionary_typed_coder( + NSDictionaryTypedCoder self, + SseSerializer serializer, + ); + + @protected + void sse_encode_ns_number(NSNumber self, SseSerializer serializer); + + @protected + void sse_encode_ns_string(NSString self, SseSerializer serializer); + + @protected + void sse_encode_nsurl(NSURL self, SseSerializer serializer); + + @protected + void sse_encode_num_or_string(NumOrString self, SseSerializer serializer); + + @protected + void sse_encode_operated_chat(OperatedChat self, SseSerializer serializer); + + @protected + void sse_encode_opt_CastedPrimitive_i_64(int? self, SseSerializer serializer); + + @protected + void sse_encode_opt_CastedPrimitive_u_64(int? self, SseSerializer serializer); + + @protected + void sse_encode_opt_CastedPrimitive_usize( + int? self, + SseSerializer serializer, + ); + + @protected + void sse_encode_opt_String(String? self, SseSerializer serializer); + + @protected + void + sse_encode_opt_box_autoadd_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerAPSState( + ApsState? self, + SseSerializer serializer, + ); + + @protected + void + sse_encode_opt_box_autoadd_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcCloudKitClientDefaultAnisetteProvider( + ArcCloudKitClientDefaultAnisetteProvider? self, + SseSerializer serializer, + ); + + @protected + void + sse_encode_opt_box_autoadd_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcCloudMessagesClientDefaultAnisetteProvider( + ArcCloudMessagesClientDefaultAnisetteProvider? self, + SseSerializer serializer, + ); + + @protected + void + sse_encode_opt_box_autoadd_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcFindMyClientDefaultAnisetteProvider( + ArcFindMyClientDefaultAnisetteProvider? self, + SseSerializer serializer, + ); + + @protected + void + sse_encode_opt_box_autoadd_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcKeychainClientDefaultAnisetteProvider( + ArcKeychainClientDefaultAnisetteProvider? self, + SseSerializer serializer, + ); + + @protected + void + sse_encode_opt_box_autoadd_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcMutexAppleAccountDefaultAnisetteProvider( + ArcMutexAppleAccountDefaultAnisetteProvider? self, + SseSerializer serializer, + ); + + @protected + void + sse_encode_opt_box_autoadd_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcPasswordManagerDefaultAnisetteProvider( + ArcPasswordManagerDefaultAnisetteProvider? self, + SseSerializer serializer, + ); + + @protected + void + sse_encode_opt_box_autoadd_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerAsset( + Asset? self, + SseSerializer serializer, + ); + + @protected + void + sse_encode_opt_box_autoadd_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerChannelInterestToken( + ChannelInterestToken? self, + SseSerializer serializer, + ); + + @protected + void + sse_encode_opt_box_autoadd_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerCircleClientSessionDefaultAnisetteProvider( + CircleClientSessionDefaultAnisetteProvider? self, + SseSerializer serializer, + ); + + @protected + void + sse_encode_opt_box_autoadd_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerCloudSyncPreparedMessageCreateHandle( + CloudSyncPreparedMessageCreateHandle? self, + SseSerializer serializer, + ); + + @protected + void + sse_encode_opt_box_autoadd_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerConversationLink( + ConversationLink? self, + SseSerializer serializer, + ); + + @protected + void + sse_encode_opt_box_autoadd_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerConversationParticipant( + ConversationParticipant? self, + SseSerializer serializer, + ); + + @protected + void + sse_encode_opt_box_autoadd_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerDate( + Date? self, + SseSerializer serializer, + ); + + @protected + void + sse_encode_opt_box_autoadd_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerGZipWrapperChatProto( + GZipWrapperChatProto? self, + SseSerializer serializer, + ); + + @protected + void + sse_encode_opt_box_autoadd_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerGZipWrapperMessageProto2( + GZipWrapperMessageProto2? self, + SseSerializer serializer, + ); + + @protected + void + sse_encode_opt_box_autoadd_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerGZipWrapperMessageProto3( + GZipWrapperMessageProto3? self, + SseSerializer serializer, + ); + + @protected + void + sse_encode_opt_box_autoadd_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerGZipWrapperMessageProto4( + GZipWrapperMessageProto4? self, + SseSerializer serializer, + ); + + @protected + void + sse_encode_opt_box_autoadd_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerIDSUser( + IdsUser? self, + SseSerializer serializer, + ); + + @protected + void + sse_encode_opt_box_autoadd_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerLocationReport( + LocationReport? self, + SseSerializer serializer, + ); + + @protected + void + sse_encode_opt_box_autoadd_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerNSArrayLPIconMetadata( + NsArrayLpIconMetadata? self, + SseSerializer serializer, + ); + + @protected + void + sse_encode_opt_box_autoadd_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerNSArrayLPImageMetadata( + NsArrayLpImageMetadata? self, + SseSerializer serializer, + ); + + @protected + void + sse_encode_opt_box_autoadd_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerPushError( + PushError? self, + SseSerializer serializer, + ); + + @protected + void + sse_encode_opt_box_autoadd_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerSavedHardwareState( + SavedHardwareState? self, + SseSerializer serializer, + ); + + @protected + void + sse_encode_opt_box_autoadd_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerSyncManagerDefaultAnisetteProviderMyFilePackager( + SyncManagerDefaultAnisetteProviderMyFilePackager? self, + SseSerializer serializer, + ); + + @protected + void + sse_encode_opt_box_autoadd_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerSystemTime( + SystemTime? self, + SseSerializer serializer, + ); + + @protected + void sse_encode_opt_box_autoadd_address( + Address? self, + SseSerializer serializer, + ); + + @protected + void sse_encode_opt_box_autoadd_attachment( + Attachment? self, + SseSerializer serializer, + ); + + @protected + void sse_encode_opt_box_autoadd_attachment_meta_extra( + AttachmentMetaExtra? self, + SseSerializer serializer, + ); + + @protected + void sse_encode_opt_box_autoadd_balloon( + Balloon? self, + SseSerializer serializer, + ); + + @protected + void sse_encode_opt_box_autoadd_balloon_layout( + BalloonLayout? self, + SseSerializer serializer, + ); + + @protected + void sse_encode_opt_box_autoadd_bool(bool? self, SseSerializer serializer); + + @protected + void sse_encode_opt_box_autoadd_certified_context( + CertifiedContext? self, + SseSerializer serializer, + ); + + @protected + void sse_encode_opt_box_autoadd_cloud_attachment( + CloudAttachment? self, + SseSerializer serializer, + ); + + @protected + void sse_encode_opt_box_autoadd_cloud_chat( + CloudChat? self, + SseSerializer serializer, + ); + + @protected + void sse_encode_opt_box_autoadd_cloud_message( + CloudMessage? self, + SseSerializer serializer, + ); + + @protected + void sse_encode_opt_box_autoadd_cloud_prop( + CloudProp? self, + SseSerializer serializer, + ); + + @protected + void sse_encode_opt_box_autoadd_cloud_sync_outbound_failure_class( + CloudSyncOutboundFailureClass? self, + SseSerializer serializer, + ); + + @protected + void sse_encode_opt_box_autoadd_cloud_sync_outbound_reconcile_disposition( + CloudSyncOutboundReconcileDisposition? self, + SseSerializer serializer, + ); + + @protected + void sse_encode_opt_box_autoadd_cloud_sync_outbound_safe_code( + CloudSyncOutboundSafeCode? self, + SseSerializer serializer, + ); + + @protected + void sse_encode_opt_box_autoadd_cloud_sync_protected_failure( + CloudSyncProtectedFailure? self, + SseSerializer serializer, + ); + + @protected + void sse_encode_opt_box_autoadd_cloud_sync_protected_garbage_collection( + CloudSyncProtectedGarbageCollection? self, + SseSerializer serializer, + ); + + @protected + void sse_encode_opt_box_autoadd_cloud_sync_protected_outbound_stage( + CloudSyncProtectedOutboundStage? self, + SseSerializer serializer, + ); + + @protected + void sse_encode_opt_box_autoadd_cloud_sync_protected_page( + CloudSyncProtectedPage? self, + SseSerializer serializer, + ); + + @protected + void sse_encode_opt_box_autoadd_cloud_sync_protected_preflight_code( + CloudSyncProtectedPreflightCode? self, + SseSerializer serializer, + ); + + @protected + void sse_encode_opt_box_autoadd_cloud_sync_protected_recovery( + CloudSyncProtectedRecovery? self, + SseSerializer serializer, + ); + + @protected + void sse_encode_opt_box_autoadd_cloud_sync_raw_failure( + CloudSyncRawFailure? self, + SseSerializer serializer, + ); + + @protected + void sse_encode_opt_box_autoadd_cloud_sync_raw_page( + CloudSyncRawPage? self, + SseSerializer serializer, + ); + + @protected + void sse_encode_opt_box_autoadd_cloud_sync_raw_system_fields( + CloudSyncRawSystemFields? self, + SseSerializer serializer, + ); + + @protected + void sse_encode_opt_box_autoadd_cloud_sync_transient_attachment_payload( + CloudSyncTransientAttachmentPayload? self, + SseSerializer serializer, + ); + + @protected + void sse_encode_opt_box_autoadd_cloud_sync_transient_chat_payload( + CloudSyncTransientChatPayload? self, + SseSerializer serializer, + ); + + @protected + void sse_encode_opt_box_autoadd_cloud_sync_transient_deferred_reason( + CloudSyncTransientDeferredReason? self, + SseSerializer serializer, + ); + + @protected + void sse_encode_opt_box_autoadd_cloud_sync_transient_entity_kind( + CloudSyncTransientEntityKind? self, + SseSerializer serializer, + ); + + @protected + void sse_encode_opt_box_autoadd_cloud_sync_transient_failure_code( + CloudSyncTransientFailureCode? self, + SseSerializer serializer, + ); + + @protected + void sse_encode_opt_box_autoadd_cloud_sync_transient_group_photo_payload( + CloudSyncTransientGroupPhotoPayload? self, + SseSerializer serializer, + ); + + @protected + void sse_encode_opt_box_autoadd_cloud_sync_transient_message_payload( + CloudSyncTransientMessagePayload? self, + SseSerializer serializer, + ); + + @protected + void sse_encode_opt_box_autoadd_cloud_sync_transient_mutation_kind( + CloudSyncTransientMutationKind? self, + SseSerializer serializer, + ); + + @protected + void sse_encode_opt_box_autoadd_cloud_sync_transient_payload( + CloudSyncTransientPayload? self, + SseSerializer serializer, + ); + + @protected + void sse_encode_opt_box_autoadd_cloud_sync_transient_quarantine_reason( + CloudSyncTransientQuarantineReason? self, + SseSerializer serializer, + ); + + @protected + void sse_encode_opt_box_autoadd_cloud_sync_transient_reaction_kind( + CloudSyncTransientReactionKind? self, + SseSerializer serializer, + ); + + @protected + void sse_encode_opt_box_autoadd_cloud_sync_transient_snapshot( + CloudSyncTransientSnapshot? self, + SseSerializer serializer, + ); + + @protected + void sse_encode_opt_box_autoadd_cloud_sync_transient_tombstone( + CloudSyncTransientTombstone? self, + SseSerializer serializer, + ); + + @protected + void sse_encode_opt_box_autoadd_conversation_data( + ConversationData? self, + SseSerializer serializer, + ); + + @protected + void sse_encode_opt_box_autoadd_dart_beacon_share_info( + DartBeaconShareInfo? self, + SseSerializer serializer, + ); + + @protected + void sse_encode_opt_box_autoadd_extension_app( + ExtensionApp? self, + SseSerializer serializer, + ); + + @protected + void sse_encode_opt_box_autoadd_f_64(double? self, SseSerializer serializer); + + @protected + void sse_encode_opt_box_autoadd_ft_mode( + FTMode? self, + SseSerializer serializer, + ); + + @protected + void sse_encode_opt_box_autoadd_i_32(int? self, SseSerializer serializer); + + @protected + void sse_encode_opt_box_autoadd_i_64( + PlatformInt64? self, + SseSerializer serializer, + ); + + @protected + void sse_encode_opt_box_autoadd_i_message_poster_record( + IMessagePosterRecord? self, + SseSerializer serializer, + ); + + @protected + void sse_encode_opt_box_autoadd_idms_requested_sign_in( + IdmsRequestedSignIn? self, + SseSerializer serializer, + ); + + @protected + void sse_encode_opt_box_autoadd_link_meta( + LinkMeta? self, + SseSerializer serializer, + ); + + @protected + void sse_encode_opt_box_autoadd_location( + Location? self, + SseSerializer serializer, + ); + + @protected + void sse_encode_opt_box_autoadd_login_state( + LoginState? self, + SseSerializer serializer, + ); + + @protected + void sse_encode_opt_box_autoadd_lp_icon_metadata( + LPIconMetadata? self, + SseSerializer serializer, + ); + + @protected + void sse_encode_opt_box_autoadd_lp_image_metadata( + LPImageMetadata? self, + SseSerializer serializer, + ); + + @protected + void sse_encode_opt_box_autoadd_lp_specialization_metadata( + LPSpecializationMetadata? self, + SseSerializer serializer, + ); + + @protected + void sse_encode_opt_box_autoadd_mmcs_attachment_meta( + MMCSAttachmentMeta? self, + SseSerializer serializer, + ); + + @protected + void sse_encode_opt_box_autoadd_mmcs_file( + MMCSFile? self, + SseSerializer serializer, + ); + + @protected + void sse_encode_opt_box_autoadd_nsurl(NSURL? self, SseSerializer serializer); + + @protected + void sse_encode_opt_box_autoadd_num_or_string( + NumOrString? self, + SseSerializer serializer, + ); + + @protected + void sse_encode_opt_box_autoadd_part_extension( + PartExtension? self, + SseSerializer serializer, + ); + + @protected + void sse_encode_opt_box_autoadd_password_manager_meta_data_formerly_shared( + PasswordManagerMetaDataFormerlyShared? self, + SseSerializer serializer, + ); + + @protected + void sse_encode_opt_box_autoadd_password_manager_totp( + PasswordManagerTotp? self, + SseSerializer serializer, + ); + + @protected + void sse_encode_opt_box_autoadd_poster_color( + PosterColor? self, + SseSerializer serializer, + ); + + @protected + void sse_encode_opt_box_autoadd_pr_poster_content_material_style( + PRPosterContentMaterialStyle? self, + SseSerializer serializer, + ); + + @protected + void sse_encode_opt_box_autoadd_push_message( + PushMessage? self, + SseSerializer serializer, + ); + + @protected + void + sse_encode_opt_box_autoadd_record_shared_push_state_auto_owned_rust_opaque_flutter_rust_bridgefor_generated_rust_auto_opaque_inner_aps_watcher( + (SharedPushState, ApsWatcher)? self, + SseSerializer serializer, + ); + + @protected + void sse_encode_opt_box_autoadd_record_string_string( + (String, String)? self, + SseSerializer serializer, + ); + + @protected + void sse_encode_opt_box_autoadd_record_string_u_64( + (String, BigInt)? self, + SseSerializer serializer, + ); + + @protected + void sse_encode_opt_box_autoadd_rich_link_image_attachment_substitute( + RichLinkImageAttachmentSubstitute? self, + SseSerializer serializer, + ); + + @protected + void sse_encode_opt_box_autoadd_schedule_mode( + ScheduleMode? self, + SseSerializer serializer, + ); + + @protected + void sse_encode_opt_box_autoadd_share_profile_message( + ShareProfileMessage? self, + SseSerializer serializer, + ); + + @protected + void sse_encode_opt_box_autoadd_shared_i_cloud_services( + SharedICloudServices? self, + SseSerializer serializer, + ); + + @protected + void sse_encode_opt_box_autoadd_shared_poster( + SharedPoster? self, + SseSerializer serializer, + ); + + @protected + void sse_encode_opt_box_autoadd_shared_push_state( + SharedPushState? self, + SseSerializer serializer, + ); + + @protected + void sse_encode_opt_box_autoadd_support_action( + SupportAction? self, + SseSerializer serializer, + ); + + @protected + void sse_encode_opt_box_autoadd_support_alert( + SupportAlert? self, + SseSerializer serializer, + ); + + @protected + void sse_encode_opt_box_autoadd_typing_app( + TypingApp? self, + SseSerializer serializer, + ); + + @protected + void sse_encode_opt_box_autoadd_u_16(int? self, SseSerializer serializer); + + @protected + void sse_encode_opt_box_autoadd_u_32(int? self, SseSerializer serializer); + + @protected + void sse_encode_opt_box_autoadd_u_64(BigInt? self, SseSerializer serializer); + + @protected + void sse_encode_opt_box_autoadd_update_account_finish( + UpdateAccountFinish? self, + SseSerializer serializer, + ); + + @protected + void + sse_encode_opt_list_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerIDSUser( + List? self, + SseSerializer serializer, + ); + + @protected + void sse_encode_opt_list_String(List? self, SseSerializer serializer); + + @protected + void sse_encode_opt_list_message_target( + List? self, + SseSerializer serializer, + ); + + @protected + void sse_encode_opt_list_prim_u_8_strict( + Uint8List? self, + SseSerializer serializer, + ); + + @protected + void sse_encode_part_extension(PartExtension self, SseSerializer serializer); + + @protected + void sse_encode_passkey(Passkey self, SseSerializer serializer); + + @protected + void sse_encode_password_manager_alt_domain( + PasswordManagerAltDomain self, + SseSerializer serializer, + ); + + @protected + void sse_encode_password_manager_meta( + PasswordManagerMeta self, + SseSerializer serializer, + ); + + @protected + void sse_encode_password_manager_meta_change( + PasswordManagerMetaChange self, + SseSerializer serializer, + ); + + @protected + void sse_encode_password_manager_meta_data( + PasswordManagerMetaData self, + SseSerializer serializer, + ); + + @protected + void sse_encode_password_manager_meta_data_ctx( + PasswordManagerMetaDataCtx self, + SseSerializer serializer, + ); + + @protected + void sse_encode_password_manager_meta_data_formerly_shared( + PasswordManagerMetaDataFormerlyShared self, + SseSerializer serializer, + ); + + @protected + void sse_encode_password_manager_totp( + PasswordManagerTotp self, + SseSerializer serializer, + ); + + @protected + void sse_encode_password_raw_entry( + PasswordRawEntry self, + SseSerializer serializer, + ); + + @protected + void sse_encode_permanent_delete_message( + PermanentDeleteMessage self, + SseSerializer serializer, + ); + + @protected + void sse_encode_photo_poster_contents( + PhotoPosterContents self, + SseSerializer serializer, + ); + + @protected + void sse_encode_photo_poster_contents_frame( + PhotoPosterContentsFrame self, + SseSerializer serializer, + ); + + @protected + void sse_encode_photo_poster_contents_size( + PhotoPosterContentsSize self, + SseSerializer serializer, + ); + + @protected + void sse_encode_photo_poster_layer( + PhotoPosterLayer self, + SseSerializer serializer, + ); + + @protected + void sse_encode_photo_poster_layout( + PhotoPosterLayout self, + SseSerializer serializer, + ); + + @protected + void sse_encode_photo_poster_properties( + PhotoPosterProperties self, + SseSerializer serializer, + ); + + @protected + void sse_encode_poll_result(PollResult self, SseSerializer serializer); + + @protected + void sse_encode_poster_asset(PosterAsset self, SseSerializer serializer); + + @protected + void sse_encode_poster_color(PosterColor self, SseSerializer serializer); + + @protected + void sse_encode_poster_role(PosterRole self, SseSerializer serializer); + + @protected + void sse_encode_poster_type(PosterType self, SseSerializer serializer); + + @protected + void sse_encode_pr_poster_color(PRPosterColor self, SseSerializer serializer); + + @protected + void sse_encode_pr_poster_content_material_style( + PRPosterContentMaterialStyle self, + SseSerializer serializer, + ); + + @protected + void sse_encode_pr_poster_system_time_font_configuration( + PRPosterSystemTimeFontConfiguration self, + SseSerializer serializer, + ); + + @protected + void sse_encode_pr_poster_title_style_configuration( + PRPosterTitleStyleConfiguration self, + SseSerializer serializer, + ); + + @protected + void sse_encode_private_device_info( + PrivateDeviceInfo self, + SseSerializer serializer, + ); + + @protected + void sse_encode_provisioned_flavor( + ProvisionedFlavor self, + SseSerializer serializer, + ); + + @protected + void sse_encode_push_message(PushMessage self, SseSerializer serializer); + + @protected + void sse_encode_quota_info(QuotaInfo self, SseSerializer serializer); + + @protected + void sse_encode_react_message(ReactMessage self, SseSerializer serializer); + + @protected + void sse_encode_react_message_type( + ReactMessageType self, + SseSerializer serializer, + ); + + @protected + void sse_encode_reaction(Reaction self, SseSerializer serializer); + + @protected + void + sse_encode_record_auto_owned_rust_opaque_flutter_rust_bridgefor_generated_rust_auto_opaque_inner_aps_connection_opt_box_autoadd_auto_owned_rust_opaque_flutter_rust_bridgefor_generated_rust_auto_opaque_inner_push_error( + (ApsConnection, PushError?) self, + SseSerializer serializer, + ); + + @protected + void + sse_encode_record_auto_owned_rust_opaque_flutter_rust_bridgefor_generated_rust_auto_opaque_inner_arc_mutex_apple_account_default_anisette_provider_login_state( + (ArcMutexAppleAccountDefaultAnisetteProvider, LoginState) self, + SseSerializer serializer, + ); + + @protected + void + sse_encode_record_auto_owned_rust_opaque_flutter_rust_bridgefor_generated_rust_auto_opaque_inner_arc_shared_push_state_shared_push_state( + (ArcSharedPushState, SharedPushState) self, + SseSerializer serializer, + ); + + @protected + void + sse_encode_record_auto_owned_rust_opaque_flutter_rust_bridgefor_generated_rust_auto_opaque_inner_circle_client_session_default_anisette_provider_login_state_opt_string( + (CircleClientSessionDefaultAnisetteProvider, LoginState, String?) self, + SseSerializer serializer, + ); + + @protected + void + sse_encode_record_auto_owned_rust_opaque_flutter_rust_bridgefor_generated_rust_auto_opaque_inner_sender_auto_owned_rust_opaque_flutter_rust_bridgefor_generated_rust_auto_opaque_inner_arc_sender_push_message_auto_owned_rust_opaque_flutter_rust_bridgefor_generated_rust_auto_opaque_inner_aps_watcher( + (Sender, ArcSenderPushMessage, ApsWatcher) self, + SseSerializer serializer, + ); + + @protected + void + sse_encode_record_list_prim_u_8_strict_map_string_opt_box_autoadd_cloud_attachment_i_32( + (Uint8List, Map, int) self, + SseSerializer serializer, + ); + + @protected + void + sse_encode_record_list_prim_u_8_strict_map_string_opt_box_autoadd_cloud_chat_i_32( + (Uint8List, Map, int) self, + SseSerializer serializer, + ); + + @protected + void + sse_encode_record_list_prim_u_8_strict_map_string_opt_box_autoadd_cloud_message_i_32( + (Uint8List, Map, int) self, + SseSerializer serializer, + ); + + @protected + void sse_encode_record_list_prim_u_8_strict_opt_list_prim_u_8_strict( + (Uint8List, Uint8List?) self, + SseSerializer serializer, + ); + + @protected + void sse_encode_record_list_shared_album_list_string( + (List, List) self, + SseSerializer serializer, + ); + + @protected + void sse_encode_record_list_trusted_phone_number_opt_box_autoadd_login_state( + (List, LoginState?) self, + SseSerializer serializer, + ); + + @protected + void + sse_encode_record_login_state_opt_box_autoadd_auto_owned_rust_opaque_flutter_rust_bridgefor_generated_rust_auto_opaque_inner_ids_user( + (LoginState, IdsUser?) self, + SseSerializer serializer, + ); + + @protected + void + sse_encode_record_map_string_sync_status_opt_box_autoadd_record_string_u_64( + (Map, (String, BigInt)?) self, + SseSerializer serializer, + ); + + @protected + void + sse_encode_record_opt_list_auto_owned_rust_opaque_flutter_rust_bridgefor_generated_rust_auto_opaque_inner_ids_user_opt_box_autoadd_support_alert( + (List?, SupportAlert?) self, + SseSerializer serializer, + ); + + @protected + void sse_encode_record_opt_string_passkey( + (String?, Passkey) self, + SseSerializer serializer, + ); + + @protected + void sse_encode_record_opt_string_password_manager_meta( + (String?, PasswordManagerMeta) self, + SseSerializer serializer, + ); + + @protected + void sse_encode_record_opt_string_password_raw_entry( + (String?, PasswordRawEntry) self, + SseSerializer serializer, + ); + + @protected + void sse_encode_record_opt_string_wifi_password( + (String?, WifiPassword) self, + SseSerializer serializer, + ); + + @protected + void + sse_encode_record_shared_push_state_auto_owned_rust_opaque_flutter_rust_bridgefor_generated_rust_auto_opaque_inner_aps_watcher( + (SharedPushState, ApsWatcher) self, + SseSerializer serializer, + ); + + @protected + void + sse_encode_record_string_auto_owned_rust_opaque_flutter_rust_bridgefor_generated_rust_auto_opaque_inner_asset( + (String, Asset) self, + SseSerializer serializer, + ); + + @protected + void + sse_encode_record_string_auto_owned_rust_opaque_flutter_rust_bridgefor_generated_rust_auto_opaque_inner_st_collapsed_value( + (String, StCollapsedValue) self, + SseSerializer serializer, + ); + + @protected + void sse_encode_record_string_bool( + (String, bool) self, + SseSerializer serializer, + ); + + @protected + void sse_encode_record_string_casted_primitive_u_64( + (String, int) self, + SseSerializer serializer, + ); + + @protected + void sse_encode_record_string_cloud_attachment( + (String, CloudAttachment) self, + SseSerializer serializer, + ); + + @protected + void sse_encode_record_string_cloud_chat( + (String, CloudChat) self, + SseSerializer serializer, + ); + + @protected + void sse_encode_record_string_cloud_message( + (String, CloudMessage) self, + SseSerializer serializer, + ); + + @protected + void sse_encode_record_string_ft_participant( + (String, FTParticipant) self, + SseSerializer serializer, + ); + + @protected + void sse_encode_record_string_group_summary( + (String, GroupSummary) self, + SseSerializer serializer, + ); + + @protected + void sse_encode_record_string_list_message_edit( + (String, List) self, + SseSerializer serializer, + ); + + @protected + void sse_encode_record_string_list_prim_u_8_strict( + (String, Uint8List) self, + SseSerializer serializer, + ); + + @protected + void + sse_encode_record_string_map_string_group_summary_map_string_share_invite_content_data( + (String, Map, Map) + self, + SseSerializer serializer, + ); + + @protected + void sse_encode_record_string_message_edit_range( + (String, MessageEditRange) self, + SseSerializer serializer, + ); + + @protected + void sse_encode_record_string_opt_box_autoadd_cloud_attachment( + (String, CloudAttachment?) self, + SseSerializer serializer, + ); + + @protected + void sse_encode_record_string_opt_box_autoadd_cloud_chat( + (String, CloudChat?) self, + SseSerializer serializer, + ); + + @protected + void sse_encode_record_string_opt_box_autoadd_cloud_message( + (String, CloudMessage?) self, + SseSerializer serializer, + ); + + @protected + void sse_encode_record_string_password_manager_meta_data_ctx( + (String, PasswordManagerMetaDataCtx) self, + SseSerializer serializer, + ); + + @protected + void sse_encode_record_string_record_opt_string_passkey( + (String, (String?, Passkey)) self, + SseSerializer serializer, + ); + + @protected + void sse_encode_record_string_record_opt_string_password_manager_meta( + (String, (String?, PasswordManagerMeta)) self, + SseSerializer serializer, + ); + + @protected + void sse_encode_record_string_record_opt_string_password_raw_entry( + (String, (String?, PasswordRawEntry)) self, + SseSerializer serializer, + ); + + @protected + void sse_encode_record_string_record_opt_string_wifi_password( + (String, (String?, WifiPassword)) self, + SseSerializer serializer, + ); + + @protected + void sse_encode_record_string_share_invite_content_data( + (String, ShareInviteContentData) self, + SseSerializer serializer, + ); + + @protected + void sse_encode_record_string_shared_push_state( + (String, SharedPushState) self, + SseSerializer serializer, + ); + + @protected + void sse_encode_record_string_status_kit_personal_config( + (String, StatusKitPersonalConfig) self, + SseSerializer serializer, + ); + + @protected + void sse_encode_record_string_string( + (String, String) self, + SseSerializer serializer, + ); + + @protected + void sse_encode_record_string_sync_status( + (String, SyncStatus) self, + SseSerializer serializer, + ); + + @protected + void sse_encode_record_string_u_64( + (String, BigInt) self, + SseSerializer serializer, + ); + + @protected + void sse_encode_record_string_update_account_finish( + (String, UpdateAccountFinish) self, + SseSerializer serializer, + ); + + @protected + void sse_encode_record_u_32_ns_dictionary_typed_coder( + (int, NSDictionaryTypedCoder) self, + SseSerializer serializer, + ); + + @protected + void sse_encode_record_u_32_u_64( + (int, BigInt) self, + SseSerializer serializer, + ); + + @protected + void sse_encode_register_state(RegisterState self, SseSerializer serializer); + + @protected + void sse_encode_rename_message(RenameMessage self, SseSerializer serializer); + + @protected + void sse_encode_report_message(ReportMessage self, SseSerializer serializer); + + @protected + void sse_encode_rich_link_image_attachment_substitute( + RichLinkImageAttachmentSubstitute self, + SseSerializer serializer, + ); + + @protected + void sse_encode_schedule_mode(ScheduleMode self, SseSerializer serializer); + + @protected + void sse_encode_set_transcript_background_message( + SetTranscriptBackgroundMessage self, + SseSerializer serializer, + ); + + @protected + void sse_encode_share_invite_content_data( + ShareInviteContentData self, + SseSerializer serializer, + ); + + @protected + void sse_encode_share_profile_message( + ShareProfileMessage self, + SseSerializer serializer, + ); + + @protected + void sse_encode_shared_album(SharedAlbum self, SseSerializer serializer); + + @protected + void sse_encode_shared_i_cloud_services( + SharedICloudServices self, + SseSerializer serializer, + ); + + @protected + void sse_encode_shared_poster(SharedPoster self, SseSerializer serializer); + + @protected + void sse_encode_shared_push_state( + SharedPushState self, + SseSerializer serializer, + ); + + @protected + void sse_encode_simplified_incoming_call_poster( + SimplifiedIncomingCallPoster self, + SseSerializer serializer, + ); + + @protected + void sse_encode_simplified_poster( + SimplifiedPoster self, + SseSerializer serializer, + ); + + @protected + void sse_encode_simplified_transcript_poster( + SimplifiedTranscriptPoster self, + SseSerializer serializer, + ); + + @protected + void sse_encode_status_kit_message( + StatusKitMessage self, + SseSerializer serializer, + ); + + @protected + void sse_encode_status_kit_personal_config( + StatusKitPersonalConfig self, + SseSerializer serializer, + ); + + @protected + void sse_encode_support_action(SupportAction self, SseSerializer serializer); + + @protected + void sse_encode_support_alert(SupportAlert self, SseSerializer serializer); + + @protected + void sse_encode_sync_status(SyncStatus self, SseSerializer serializer); + + @protected + void sse_encode_teardown_sign_in( + TeardownSignIn self, + SseSerializer serializer, + ); + + @protected + void sse_encode_text_effect(TextEffect self, SseSerializer serializer); + + @protected + void sse_encode_text_flags(TextFlags self, SseSerializer serializer); + + @protected + void sse_encode_text_format(TextFormat self, SseSerializer serializer); + + @protected + void sse_encode_transcript_dynamic_user_data( + TranscriptDynamicUserData self, + SseSerializer serializer, + ); + + @protected + void sse_encode_transfer_progress( + TransferProgress self, + SseSerializer serializer, + ); + + @protected + void sse_encode_trusted_phone_number( + TrustedPhoneNumber self, + SseSerializer serializer, + ); + + @protected + void sse_encode_typing_app(TypingApp self, SseSerializer serializer); + + @protected + void sse_encode_u_16(int self, SseSerializer serializer); + + @protected + void sse_encode_u_32(int self, SseSerializer serializer); + + @protected + void sse_encode_u_64(BigInt self, SseSerializer serializer); + + @protected + void sse_encode_u_8(int self, SseSerializer serializer); + + @protected + void sse_encode_ui_color(UIColor self, SseSerializer serializer); + + @protected + void sse_encode_unit(void self, SseSerializer serializer); + + @protected + void sse_encode_unsend_message(UnsendMessage self, SseSerializer serializer); + + @protected + void sse_encode_update_account_finish( + UpdateAccountFinish self, + SseSerializer serializer, + ); + + @protected + void sse_encode_update_extension_message( + UpdateExtensionMessage self, + SseSerializer serializer, + ); + + @protected + void sse_encode_update_profile_message( + UpdateProfileMessage self, + SseSerializer serializer, + ); + + @protected + void sse_encode_update_profile_sharing_message( + UpdateProfileSharingMessage self, + SseSerializer serializer, + ); + + @protected + void sse_encode_usize(BigInt self, SseSerializer serializer); + + @protected + void sse_encode_wallpaper_metadata( + WallpaperMetadata self, + SseSerializer serializer, + ); + + @protected + void sse_encode_watch_background( + WatchBackground self, + SseSerializer serializer, + ); + + @protected + void sse_encode_wifi_password(WifiPassword self, SseSerializer serializer); +} + +// Section: wire_class + +class RustLibWire implements BaseWire { + RustLibWire.fromExternalLibrary(ExternalLibrary lib); + + void + rust_arc_increment_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerAPSConnection( + int ptr, + ) => wasmModule + .rust_arc_increment_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerAPSConnection( + ptr, + ); + + void + rust_arc_decrement_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerAPSConnection( + int ptr, + ) => wasmModule + .rust_arc_decrement_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerAPSConnection( + ptr, + ); + + void + rust_arc_increment_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerAPSState( + int ptr, + ) => wasmModule + .rust_arc_increment_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerAPSState( + ptr, + ); + + void + rust_arc_decrement_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerAPSState( + int ptr, + ) => wasmModule + .rust_arc_decrement_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerAPSState( + ptr, + ); + + void + rust_arc_increment_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerAPSWatcher( + int ptr, + ) => wasmModule + .rust_arc_increment_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerAPSWatcher( + ptr, + ); + + void + rust_arc_decrement_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerAPSWatcher( + int ptr, + ) => wasmModule + .rust_arc_decrement_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerAPSWatcher( + ptr, + ); + + void + rust_arc_increment_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcAnisetteClientDefaultAnisetteProvider( + int ptr, + ) => wasmModule + .rust_arc_increment_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcAnisetteClientDefaultAnisetteProvider( + ptr, + ); + + void + rust_arc_decrement_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcAnisetteClientDefaultAnisetteProvider( + int ptr, + ) => wasmModule + .rust_arc_decrement_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcAnisetteClientDefaultAnisetteProvider( + ptr, + ); + + void + rust_arc_increment_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcCloudKitClientDefaultAnisetteProvider( + int ptr, + ) => wasmModule + .rust_arc_increment_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcCloudKitClientDefaultAnisetteProvider( + ptr, + ); + + void + rust_arc_decrement_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcCloudKitClientDefaultAnisetteProvider( + int ptr, + ) => wasmModule + .rust_arc_decrement_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcCloudKitClientDefaultAnisetteProvider( + ptr, + ); + + void + rust_arc_increment_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcCloudMessagesClientDefaultAnisetteProvider( + int ptr, + ) => wasmModule + .rust_arc_increment_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcCloudMessagesClientDefaultAnisetteProvider( + ptr, + ); + + void + rust_arc_decrement_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcCloudMessagesClientDefaultAnisetteProvider( + int ptr, + ) => wasmModule + .rust_arc_decrement_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcCloudMessagesClientDefaultAnisetteProvider( + ptr, + ); + + void + rust_arc_increment_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcFTClient( + int ptr, + ) => wasmModule + .rust_arc_increment_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcFTClient( + ptr, + ); + + void + rust_arc_decrement_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcFTClient( + int ptr, + ) => wasmModule + .rust_arc_decrement_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcFTClient( + ptr, + ); + + void + rust_arc_increment_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcFindMyClientDefaultAnisetteProvider( + int ptr, + ) => wasmModule + .rust_arc_increment_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcFindMyClientDefaultAnisetteProvider( + ptr, + ); + + void + rust_arc_decrement_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcFindMyClientDefaultAnisetteProvider( + int ptr, + ) => wasmModule + .rust_arc_decrement_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcFindMyClientDefaultAnisetteProvider( + ptr, + ); + + void + rust_arc_increment_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcIMClient( + int ptr, + ) => wasmModule + .rust_arc_increment_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcIMClient( + ptr, + ); + + void + rust_arc_decrement_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcIMClient( + int ptr, + ) => wasmModule + .rust_arc_decrement_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcIMClient( + ptr, + ); + + void + rust_arc_increment_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcIdmsAuthListener( + int ptr, + ) => wasmModule + .rust_arc_increment_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcIdmsAuthListener( + ptr, + ); + + void + rust_arc_decrement_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcIdmsAuthListener( + int ptr, + ) => wasmModule + .rust_arc_decrement_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcIdmsAuthListener( + ptr, + ); + + void + rust_arc_increment_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcKeychainClientDefaultAnisetteProvider( + int ptr, + ) => wasmModule + .rust_arc_increment_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcKeychainClientDefaultAnisetteProvider( + ptr, + ); + + void + rust_arc_decrement_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcKeychainClientDefaultAnisetteProvider( + int ptr, + ) => wasmModule + .rust_arc_decrement_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcKeychainClientDefaultAnisetteProvider( + ptr, + ); + + void + rust_arc_increment_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcMutexAppleAccountDefaultAnisetteProvider( + int ptr, + ) => wasmModule + .rust_arc_increment_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcMutexAppleAccountDefaultAnisetteProvider( + ptr, + ); + + void + rust_arc_decrement_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcMutexAppleAccountDefaultAnisetteProvider( + int ptr, + ) => wasmModule + .rust_arc_decrement_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcMutexAppleAccountDefaultAnisetteProvider( + ptr, + ); + + void + rust_arc_increment_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcMutexOptionCircleClientSessionDefaultAnisetteProvider( + int ptr, + ) => wasmModule + .rust_arc_increment_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcMutexOptionCircleClientSessionDefaultAnisetteProvider( + ptr, + ); + + void + rust_arc_decrement_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcMutexOptionCircleClientSessionDefaultAnisetteProvider( + int ptr, + ) => wasmModule + .rust_arc_decrement_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcMutexOptionCircleClientSessionDefaultAnisetteProvider( + ptr, + ); + + void + rust_arc_increment_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcMutexVecActiveCircleSession( + int ptr, + ) => wasmModule + .rust_arc_increment_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcMutexVecActiveCircleSession( + ptr, + ); + + void + rust_arc_decrement_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcMutexVecActiveCircleSession( + int ptr, + ) => wasmModule + .rust_arc_decrement_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcMutexVecActiveCircleSession( + ptr, + ); + + void + rust_arc_increment_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcPasswordManagerDefaultAnisetteProvider( + int ptr, + ) => wasmModule + .rust_arc_increment_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcPasswordManagerDefaultAnisetteProvider( + ptr, + ); + + void + rust_arc_decrement_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcPasswordManagerDefaultAnisetteProvider( + int ptr, + ) => wasmModule + .rust_arc_decrement_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcPasswordManagerDefaultAnisetteProvider( + ptr, + ); + + void + rust_arc_increment_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcProfilesClientDefaultAnisetteProvider( + int ptr, + ) => wasmModule + .rust_arc_increment_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcProfilesClientDefaultAnisetteProvider( + ptr, + ); + + void + rust_arc_decrement_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcProfilesClientDefaultAnisetteProvider( + int ptr, + ) => wasmModule + .rust_arc_decrement_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcProfilesClientDefaultAnisetteProvider( + ptr, + ); + + void + rust_arc_increment_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcSenderPushMessage( + int ptr, + ) => wasmModule + .rust_arc_increment_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcSenderPushMessage( + ptr, + ); + + void + rust_arc_decrement_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcSenderPushMessage( + int ptr, + ) => wasmModule + .rust_arc_decrement_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcSenderPushMessage( + ptr, + ); + + void + rust_arc_increment_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcSharedPushState( + int ptr, + ) => wasmModule + .rust_arc_increment_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcSharedPushState( + ptr, + ); + + void + rust_arc_decrement_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcSharedPushState( + int ptr, + ) => wasmModule + .rust_arc_decrement_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcSharedPushState( + ptr, + ); + + void + rust_arc_increment_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcStatusKitClientDefaultAnisetteProvider( + int ptr, + ) => wasmModule + .rust_arc_increment_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcStatusKitClientDefaultAnisetteProvider( + ptr, + ); + + void + rust_arc_decrement_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcStatusKitClientDefaultAnisetteProvider( + int ptr, + ) => wasmModule + .rust_arc_decrement_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcStatusKitClientDefaultAnisetteProvider( + ptr, + ); + + void + rust_arc_increment_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcTokenProviderDefaultAnisetteProvider( + int ptr, + ) => wasmModule + .rust_arc_increment_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcTokenProviderDefaultAnisetteProvider( + ptr, + ); + + void + rust_arc_decrement_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcTokenProviderDefaultAnisetteProvider( + int ptr, + ) => wasmModule + .rust_arc_decrement_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcTokenProviderDefaultAnisetteProvider( + ptr, + ); + + void + rust_arc_increment_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerAsset( + int ptr, + ) => wasmModule + .rust_arc_increment_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerAsset( + ptr, + ); + + void + rust_arc_decrement_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerAsset( + int ptr, + ) => wasmModule + .rust_arc_decrement_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerAsset( + ptr, + ); + + void + rust_arc_increment_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerChannelInterestToken( + int ptr, + ) => wasmModule + .rust_arc_increment_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerChannelInterestToken( + ptr, + ); + + void + rust_arc_decrement_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerChannelInterestToken( + int ptr, + ) => wasmModule + .rust_arc_decrement_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerChannelInterestToken( + ptr, + ); + + void + rust_arc_increment_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerCircleClientSessionDefaultAnisetteProvider( + int ptr, + ) => wasmModule + .rust_arc_increment_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerCircleClientSessionDefaultAnisetteProvider( + ptr, + ); + + void + rust_arc_decrement_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerCircleClientSessionDefaultAnisetteProvider( + int ptr, + ) => wasmModule + .rust_arc_decrement_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerCircleClientSessionDefaultAnisetteProvider( + ptr, + ); + + void + rust_arc_increment_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerCloudSyncPreparedMessageCreateHandle( + int ptr, + ) => wasmModule + .rust_arc_increment_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerCloudSyncPreparedMessageCreateHandle( + ptr, + ); + + void + rust_arc_decrement_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerCloudSyncPreparedMessageCreateHandle( + int ptr, + ) => wasmModule + .rust_arc_decrement_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerCloudSyncPreparedMessageCreateHandle( + ptr, + ); + + void + rust_arc_increment_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerConversationLink( + int ptr, + ) => wasmModule + .rust_arc_increment_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerConversationLink( + ptr, + ); + + void + rust_arc_decrement_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerConversationLink( + int ptr, + ) => wasmModule + .rust_arc_decrement_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerConversationLink( + ptr, + ); + + void + rust_arc_increment_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerConversationParticipant( + int ptr, + ) => wasmModule + .rust_arc_increment_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerConversationParticipant( + ptr, + ); + + void + rust_arc_decrement_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerConversationParticipant( + int ptr, + ) => wasmModule + .rust_arc_decrement_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerConversationParticipant( + ptr, + ); + + void + rust_arc_increment_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerDate( + int ptr, + ) => wasmModule + .rust_arc_increment_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerDate( + ptr, + ); + + void + rust_arc_decrement_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerDate( + int ptr, + ) => wasmModule + .rust_arc_decrement_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerDate( + ptr, + ); + + void + rust_arc_increment_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerEscrowData( + int ptr, + ) => wasmModule + .rust_arc_increment_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerEscrowData( + ptr, + ); + + void + rust_arc_decrement_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerEscrowData( + int ptr, + ) => wasmModule + .rust_arc_decrement_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerEscrowData( + ptr, + ); + + void + rust_arc_increment_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerFindMyFriendsClientDefaultAnisetteProvider( + int ptr, + ) => wasmModule + .rust_arc_increment_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerFindMyFriendsClientDefaultAnisetteProvider( + ptr, + ); + + void + rust_arc_decrement_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerFindMyFriendsClientDefaultAnisetteProvider( + int ptr, + ) => wasmModule + .rust_arc_decrement_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerFindMyFriendsClientDefaultAnisetteProvider( + ptr, + ); + + void + rust_arc_increment_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerFindMyPhoneClientDefaultAnisetteProvider( + int ptr, + ) => wasmModule + .rust_arc_increment_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerFindMyPhoneClientDefaultAnisetteProvider( + ptr, + ); + + void + rust_arc_decrement_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerFindMyPhoneClientDefaultAnisetteProvider( + int ptr, + ) => wasmModule + .rust_arc_decrement_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerFindMyPhoneClientDefaultAnisetteProvider( + ptr, + ); + + void + rust_arc_increment_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerGZipWrapperAttachmentMeta( + int ptr, + ) => wasmModule + .rust_arc_increment_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerGZipWrapperAttachmentMeta( + ptr, + ); + + void + rust_arc_decrement_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerGZipWrapperAttachmentMeta( + int ptr, + ) => wasmModule + .rust_arc_decrement_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerGZipWrapperAttachmentMeta( + ptr, + ); + + void + rust_arc_increment_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerGZipWrapperChatProto( + int ptr, + ) => wasmModule + .rust_arc_increment_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerGZipWrapperChatProto( + ptr, + ); + + void + rust_arc_decrement_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerGZipWrapperChatProto( + int ptr, + ) => wasmModule + .rust_arc_decrement_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerGZipWrapperChatProto( + ptr, + ); + + void + rust_arc_increment_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerGZipWrapperMessageProto( + int ptr, + ) => wasmModule + .rust_arc_increment_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerGZipWrapperMessageProto( + ptr, + ); + + void + rust_arc_decrement_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerGZipWrapperMessageProto( + int ptr, + ) => wasmModule + .rust_arc_decrement_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerGZipWrapperMessageProto( + ptr, + ); + + void + rust_arc_increment_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerGZipWrapperMessageProto2( + int ptr, + ) => wasmModule + .rust_arc_increment_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerGZipWrapperMessageProto2( + ptr, + ); + + void + rust_arc_decrement_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerGZipWrapperMessageProto2( + int ptr, + ) => wasmModule + .rust_arc_decrement_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerGZipWrapperMessageProto2( + ptr, + ); + + void + rust_arc_increment_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerGZipWrapperMessageProto3( + int ptr, + ) => wasmModule + .rust_arc_increment_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerGZipWrapperMessageProto3( + ptr, + ); + + void + rust_arc_decrement_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerGZipWrapperMessageProto3( + int ptr, + ) => wasmModule + .rust_arc_decrement_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerGZipWrapperMessageProto3( + ptr, + ); + + void + rust_arc_increment_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerGZipWrapperMessageProto4( + int ptr, + ) => wasmModule + .rust_arc_increment_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerGZipWrapperMessageProto4( + ptr, + ); + + void + rust_arc_decrement_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerGZipWrapperMessageProto4( + int ptr, + ) => wasmModule + .rust_arc_decrement_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerGZipWrapperMessageProto4( + ptr, + ); + + void + rust_arc_increment_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerIDSNGMIdentity( + int ptr, + ) => wasmModule + .rust_arc_increment_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerIDSNGMIdentity( + ptr, + ); + + void + rust_arc_decrement_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerIDSNGMIdentity( + int ptr, + ) => wasmModule + .rust_arc_decrement_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerIDSNGMIdentity( + ptr, + ); + + void + rust_arc_increment_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerIDSUser( + int ptr, + ) => wasmModule + .rust_arc_increment_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerIDSUser( + ptr, + ); + + void + rust_arc_decrement_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerIDSUser( + int ptr, + ) => wasmModule + .rust_arc_decrement_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerIDSUser( + ptr, + ); + + void + rust_arc_increment_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerJoinedOSConfig( + int ptr, + ) => wasmModule + .rust_arc_increment_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerJoinedOSConfig( + ptr, + ); + + void + rust_arc_decrement_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerJoinedOSConfig( + int ptr, + ) => wasmModule + .rust_arc_decrement_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerJoinedOSConfig( + ptr, + ); + + void + rust_arc_increment_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerLocationReport( + int ptr, + ) => wasmModule + .rust_arc_increment_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerLocationReport( + ptr, + ); + + void + rust_arc_decrement_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerLocationReport( + int ptr, + ) => wasmModule + .rust_arc_decrement_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerLocationReport( + ptr, + ); + + void + rust_arc_increment_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerMessageFlags( + int ptr, + ) => wasmModule + .rust_arc_increment_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerMessageFlags( + ptr, + ); + + void + rust_arc_decrement_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerMessageFlags( + int ptr, + ) => wasmModule + .rust_arc_decrement_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerMessageFlags( + ptr, + ); + + void + rust_arc_increment_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerNSArrayLPIconMetadata( + int ptr, + ) => wasmModule + .rust_arc_increment_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerNSArrayLPIconMetadata( + ptr, + ); + + void + rust_arc_decrement_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerNSArrayLPIconMetadata( + int ptr, + ) => wasmModule + .rust_arc_decrement_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerNSArrayLPIconMetadata( + ptr, + ); + + void + rust_arc_increment_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerNSArrayLPImageMetadata( + int ptr, + ) => wasmModule + .rust_arc_increment_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerNSArrayLPImageMetadata( + ptr, + ); + + void + rust_arc_decrement_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerNSArrayLPImageMetadata( + int ptr, + ) => wasmModule + .rust_arc_decrement_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerNSArrayLPImageMetadata( + ptr, + ); + + void + rust_arc_increment_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerPushError( + int ptr, + ) => wasmModule + .rust_arc_increment_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerPushError( + ptr, + ); + + void + rust_arc_decrement_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerPushError( + int ptr, + ) => wasmModule + .rust_arc_decrement_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerPushError( + ptr, + ); + + void + rust_arc_increment_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerReceiverAPSMessage( + int ptr, + ) => wasmModule + .rust_arc_increment_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerReceiverAPSMessage( + ptr, + ); + + void + rust_arc_decrement_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerReceiverAPSMessage( + int ptr, + ) => wasmModule + .rust_arc_decrement_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerReceiverAPSMessage( + ptr, + ); + + void + rust_arc_increment_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerSavedHardwareState( + int ptr, + ) => wasmModule + .rust_arc_increment_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerSavedHardwareState( + ptr, + ); + + void + rust_arc_decrement_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerSavedHardwareState( + int ptr, + ) => wasmModule + .rust_arc_decrement_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerSavedHardwareState( + ptr, + ); + + void + rust_arc_increment_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerSender( + int ptr, + ) => wasmModule + .rust_arc_increment_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerSender( + ptr, + ); + + void + rust_arc_decrement_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerSender( + int ptr, + ) => wasmModule + .rust_arc_decrement_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerSender( + ptr, + ); + + void + rust_arc_increment_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerStCollapsedValue( + int ptr, + ) => wasmModule + .rust_arc_increment_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerStCollapsedValue( + ptr, + ); + + void + rust_arc_decrement_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerStCollapsedValue( + int ptr, + ) => wasmModule + .rust_arc_decrement_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerStCollapsedValue( + ptr, + ); + + void + rust_arc_increment_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerSyncManagerDefaultAnisetteProviderMyFilePackager( + int ptr, + ) => wasmModule + .rust_arc_increment_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerSyncManagerDefaultAnisetteProviderMyFilePackager( + ptr, + ); + + void + rust_arc_decrement_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerSyncManagerDefaultAnisetteProviderMyFilePackager( + int ptr, + ) => wasmModule + .rust_arc_decrement_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerSyncManagerDefaultAnisetteProviderMyFilePackager( + ptr, + ); + + void + rust_arc_increment_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerSystemTime( + int ptr, + ) => wasmModule + .rust_arc_increment_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerSystemTime( + ptr, + ); + + void + rust_arc_decrement_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerSystemTime( + int ptr, + ) => wasmModule + .rust_arc_decrement_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerSystemTime( + ptr, + ); + + void + rust_arc_increment_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerVerifyBody( + int ptr, + ) => wasmModule + .rust_arc_increment_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerVerifyBody( + ptr, + ); + + void + rust_arc_decrement_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerVerifyBody( + int ptr, + ) => wasmModule + .rust_arc_decrement_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerVerifyBody( + ptr, + ); + + void + rust_arc_increment_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerViableBottle( + int ptr, + ) => wasmModule + .rust_arc_increment_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerViableBottle( + ptr, + ); + + void + rust_arc_decrement_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerViableBottle( + int ptr, + ) => wasmModule + .rust_arc_decrement_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerViableBottle( + ptr, + ); +} + +@JS('wasm_bindgen') +external RustLibWasmModule get wasmModule; + +@JS() +@anonymous +extension type RustLibWasmModule._(JSObject _) implements JSObject { + external void + rust_arc_increment_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerAPSConnection( + int ptr, + ); + + external void + rust_arc_decrement_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerAPSConnection( + int ptr, + ); + + external void + rust_arc_increment_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerAPSState( + int ptr, + ); + + external void + rust_arc_decrement_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerAPSState( + int ptr, + ); + + external void + rust_arc_increment_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerAPSWatcher( + int ptr, + ); + + external void + rust_arc_decrement_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerAPSWatcher( + int ptr, + ); + + external void + rust_arc_increment_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcAnisetteClientDefaultAnisetteProvider( + int ptr, + ); + + external void + rust_arc_decrement_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcAnisetteClientDefaultAnisetteProvider( + int ptr, + ); + + external void + rust_arc_increment_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcCloudKitClientDefaultAnisetteProvider( + int ptr, + ); + + external void + rust_arc_decrement_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcCloudKitClientDefaultAnisetteProvider( + int ptr, + ); + + external void + rust_arc_increment_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcCloudMessagesClientDefaultAnisetteProvider( + int ptr, + ); + + external void + rust_arc_decrement_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcCloudMessagesClientDefaultAnisetteProvider( + int ptr, + ); + + external void + rust_arc_increment_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcFTClient( + int ptr, + ); + + external void + rust_arc_decrement_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcFTClient( + int ptr, + ); + + external void + rust_arc_increment_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcFindMyClientDefaultAnisetteProvider( + int ptr, + ); + + external void + rust_arc_decrement_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcFindMyClientDefaultAnisetteProvider( + int ptr, + ); + + external void + rust_arc_increment_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcIMClient( + int ptr, + ); + + external void + rust_arc_decrement_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcIMClient( + int ptr, + ); + + external void + rust_arc_increment_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcIdmsAuthListener( + int ptr, + ); + + external void + rust_arc_decrement_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcIdmsAuthListener( + int ptr, + ); + + external void + rust_arc_increment_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcKeychainClientDefaultAnisetteProvider( + int ptr, + ); + + external void + rust_arc_decrement_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcKeychainClientDefaultAnisetteProvider( + int ptr, + ); + + external void + rust_arc_increment_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcMutexAppleAccountDefaultAnisetteProvider( + int ptr, + ); + + external void + rust_arc_decrement_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcMutexAppleAccountDefaultAnisetteProvider( + int ptr, + ); + + external void + rust_arc_increment_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcMutexOptionCircleClientSessionDefaultAnisetteProvider( + int ptr, + ); + + external void + rust_arc_decrement_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcMutexOptionCircleClientSessionDefaultAnisetteProvider( + int ptr, + ); + + external void + rust_arc_increment_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcMutexVecActiveCircleSession( + int ptr, + ); + + external void + rust_arc_decrement_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcMutexVecActiveCircleSession( + int ptr, + ); + + external void + rust_arc_increment_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcPasswordManagerDefaultAnisetteProvider( + int ptr, + ); + + external void + rust_arc_decrement_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcPasswordManagerDefaultAnisetteProvider( + int ptr, + ); + + external void + rust_arc_increment_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcProfilesClientDefaultAnisetteProvider( + int ptr, + ); + + external void + rust_arc_decrement_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcProfilesClientDefaultAnisetteProvider( + int ptr, + ); + + external void + rust_arc_increment_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcSenderPushMessage( + int ptr, + ); + + external void + rust_arc_decrement_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcSenderPushMessage( + int ptr, + ); + + external void + rust_arc_increment_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcSharedPushState( + int ptr, + ); + + external void + rust_arc_decrement_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcSharedPushState( + int ptr, + ); + + external void + rust_arc_increment_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcStatusKitClientDefaultAnisetteProvider( + int ptr, + ); + + external void + rust_arc_decrement_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcStatusKitClientDefaultAnisetteProvider( + int ptr, + ); + + external void + rust_arc_increment_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcTokenProviderDefaultAnisetteProvider( + int ptr, + ); + + external void + rust_arc_decrement_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcTokenProviderDefaultAnisetteProvider( + int ptr, + ); + + external void + rust_arc_increment_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerAsset( + int ptr, + ); + + external void + rust_arc_decrement_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerAsset( + int ptr, + ); + + external void + rust_arc_increment_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerChannelInterestToken( + int ptr, + ); + + external void + rust_arc_decrement_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerChannelInterestToken( + int ptr, + ); + + external void + rust_arc_increment_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerCircleClientSessionDefaultAnisetteProvider( + int ptr, + ); + + external void + rust_arc_decrement_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerCircleClientSessionDefaultAnisetteProvider( + int ptr, + ); + + external void + rust_arc_increment_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerCloudSyncPreparedMessageCreateHandle( + int ptr, + ); + + external void + rust_arc_decrement_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerCloudSyncPreparedMessageCreateHandle( + int ptr, + ); + + external void + rust_arc_increment_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerConversationLink( + int ptr, + ); + + external void + rust_arc_decrement_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerConversationLink( + int ptr, + ); + + external void + rust_arc_increment_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerConversationParticipant( + int ptr, + ); + + external void + rust_arc_decrement_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerConversationParticipant( + int ptr, + ); + + external void + rust_arc_increment_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerDate( + int ptr, + ); + + external void + rust_arc_decrement_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerDate( + int ptr, + ); + + external void + rust_arc_increment_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerEscrowData( + int ptr, + ); + + external void + rust_arc_decrement_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerEscrowData( + int ptr, + ); + + external void + rust_arc_increment_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerFindMyFriendsClientDefaultAnisetteProvider( + int ptr, + ); + + external void + rust_arc_decrement_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerFindMyFriendsClientDefaultAnisetteProvider( + int ptr, + ); + + external void + rust_arc_increment_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerFindMyPhoneClientDefaultAnisetteProvider( + int ptr, + ); + + external void + rust_arc_decrement_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerFindMyPhoneClientDefaultAnisetteProvider( + int ptr, + ); + + external void + rust_arc_increment_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerGZipWrapperAttachmentMeta( + int ptr, + ); + + external void + rust_arc_decrement_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerGZipWrapperAttachmentMeta( + int ptr, + ); + + external void + rust_arc_increment_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerGZipWrapperChatProto( + int ptr, + ); + + external void + rust_arc_decrement_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerGZipWrapperChatProto( + int ptr, + ); + + external void + rust_arc_increment_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerGZipWrapperMessageProto( + int ptr, + ); + + external void + rust_arc_decrement_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerGZipWrapperMessageProto( + int ptr, + ); + + external void + rust_arc_increment_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerGZipWrapperMessageProto2( + int ptr, + ); + + external void + rust_arc_decrement_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerGZipWrapperMessageProto2( + int ptr, + ); + + external void + rust_arc_increment_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerGZipWrapperMessageProto3( + int ptr, + ); + + external void + rust_arc_decrement_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerGZipWrapperMessageProto3( + int ptr, + ); + + external void + rust_arc_increment_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerGZipWrapperMessageProto4( + int ptr, + ); + + external void + rust_arc_decrement_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerGZipWrapperMessageProto4( + int ptr, + ); + + external void + rust_arc_increment_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerIDSNGMIdentity( + int ptr, + ); + + external void + rust_arc_decrement_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerIDSNGMIdentity( + int ptr, + ); + + external void + rust_arc_increment_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerIDSUser( + int ptr, + ); + + external void + rust_arc_decrement_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerIDSUser( + int ptr, + ); + + external void + rust_arc_increment_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerJoinedOSConfig( + int ptr, + ); + + external void + rust_arc_decrement_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerJoinedOSConfig( + int ptr, + ); + + external void + rust_arc_increment_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerLocationReport( + int ptr, + ); + + external void + rust_arc_decrement_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerLocationReport( + int ptr, + ); + + external void + rust_arc_increment_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerMessageFlags( + int ptr, + ); + + external void + rust_arc_decrement_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerMessageFlags( + int ptr, + ); + + external void + rust_arc_increment_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerNSArrayLPIconMetadata( + int ptr, + ); + + external void + rust_arc_decrement_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerNSArrayLPIconMetadata( + int ptr, + ); + + external void + rust_arc_increment_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerNSArrayLPImageMetadata( + int ptr, + ); + + external void + rust_arc_decrement_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerNSArrayLPImageMetadata( + int ptr, + ); + + external void + rust_arc_increment_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerPushError( + int ptr, + ); + + external void + rust_arc_decrement_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerPushError( + int ptr, + ); + + external void + rust_arc_increment_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerReceiverAPSMessage( + int ptr, + ); + + external void + rust_arc_decrement_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerReceiverAPSMessage( + int ptr, + ); + + external void + rust_arc_increment_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerSavedHardwareState( + int ptr, + ); + + external void + rust_arc_decrement_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerSavedHardwareState( + int ptr, + ); + + external void + rust_arc_increment_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerSender( + int ptr, + ); + + external void + rust_arc_decrement_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerSender( + int ptr, + ); + + external void + rust_arc_increment_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerStCollapsedValue( + int ptr, + ); + + external void + rust_arc_decrement_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerStCollapsedValue( + int ptr, + ); + + external void + rust_arc_increment_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerSyncManagerDefaultAnisetteProviderMyFilePackager( + int ptr, + ); + + external void + rust_arc_decrement_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerSyncManagerDefaultAnisetteProviderMyFilePackager( + int ptr, + ); + + external void + rust_arc_increment_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerSystemTime( + int ptr, + ); + + external void + rust_arc_decrement_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerSystemTime( + int ptr, + ); + + external void + rust_arc_increment_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerVerifyBody( + int ptr, + ); + + external void + rust_arc_decrement_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerVerifyBody( + int ptr, + ); + + external void + rust_arc_increment_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerViableBottle( + int ptr, + ); + + external void + rust_arc_decrement_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerViableBottle( + int ptr, + ); +} diff --git a/lib/utils/attachment_guid_utils.dart b/lib/utils/attachment_guid_utils.dart new file mode 100644 index 0000000000..b4d13b7e3c --- /dev/null +++ b/lib/utils/attachment_guid_utils.dart @@ -0,0 +1,68 @@ +// Apple represents an attachment owned by a message as `at__`, and OpenBubbles stores the same identity locally as +// `_`. +// +// A message GUID can itself contain underscores, so neither direction may split +// on every separator: the part is the single segment next to the `at_` prefix +// and the whole remaining suffix belongs to the GUID. Anything that does not +// match that exact shape is returned unchanged rather than throwing, because +// these run inside the CloudKit download path where one malformed identifier +// must not abort a message. + +/// The two halves of an `at__` identifier. +class AppleOwnedAttachmentGuid { + const AppleOwnedAttachmentGuid({ + required this.part, + required this.messageGuid, + }); + + final String part; + final String messageGuid; +} + +/// Splits Apple's `at__` form. +/// +/// Returns null when [guid] is not an owned-attachment identifier, so a +/// standalone attachment is never given an invented owner. +AppleOwnedAttachmentGuid? parseAppleOwnedAttachmentGuid(String guid) { + const prefix = 'at_'; + if (!guid.startsWith(prefix)) return null; + final remainder = guid.substring(prefix.length); + final separator = remainder.indexOf('_'); + if (separator <= 0 || separator >= remainder.length - 1) return null; + final part = remainder.substring(0, separator); + if (!_isCanonicalDecimal(part)) return null; + return AppleOwnedAttachmentGuid( + part: part, + messageGuid: remainder.substring(separator + 1), + ); +} + +bool _isCanonicalDecimal(String value) { + if (value.isEmpty) return false; + for (final unit in value.codeUnits) { + if (unit < 0x30 || unit > 0x39) return false; + } + // Reject a leading zero so one part cannot have two spellings. + return value == '0' || value.codeUnitAt(0) != 0x30; +} + +/// Converts Apple's `at__` form to `_`. +/// +/// Returns [guid] unchanged when it is not an owned-attachment identifier. +String convertAppleAttachmentGuid(String guid) { + final owned = parseAppleOwnedAttachmentGuid(guid); + if (owned == null) return guid; + return '${owned.messageGuid}_${owned.part}'; +} + +/// Converts `_` back to Apple's `at__`. +/// +/// Returns [guid] unchanged when it carries no trailing decimal part. +String unconvertAppleAttachmentGuid(String guid) { + final separator = guid.lastIndexOf('_'); + if (separator <= 0 || separator >= guid.length - 1) return guid; + final part = guid.substring(separator + 1); + if (!_isCanonicalDecimal(part)) return guid; + return 'at_${part}_${guid.substring(0, separator)}'; +} diff --git a/lib/utils/attachment_mime_utils.dart b/lib/utils/attachment_mime_utils.dart new file mode 100644 index 0000000000..c1276ecdea --- /dev/null +++ b/lib/utils/attachment_mime_utils.dart @@ -0,0 +1,5 @@ +import 'package:mime_type/mime_type.dart'; + +String? resolveAttachmentMimeType(String name, String? path) { + return mime(name) ?? (path == null ? null : mime(path)); +} diff --git a/lib/utils/crypto_utils.dart b/lib/utils/crypto_utils.dart index 9324f2428b..9fc72efcca 100644 --- a/lib/utils/crypto_utils.dart +++ b/lib/utils/crypto_utils.dart @@ -3,20 +3,22 @@ import 'dart:math'; import 'dart:typed_data'; import 'package:crypto/crypto.dart'; -import 'package:encrypt/encrypt.dart' as encrypt; +import 'package:pointycastle/export.dart'; import 'package:tuple/tuple.dart'; String encryptAESCryptoJS(Uint8List plainText, String passphrase) { try { final salt = genRandomWithNonZero(8); var keyndIV = deriveKeyAndIV(passphrase, salt); - final key = encrypt.Key(keyndIV.item1); - final iv = encrypt.IV(keyndIV.item2); - - final encrypter = encrypt.Encrypter(encrypt.AES(key, mode: encrypt.AESMode.cbc, padding: "PKCS7")); - final encrypted = encrypter.encryptBytes(plainText, iv: iv); - Uint8List encryptedBytesWithSalt = - Uint8List.fromList(createUint8ListFromString("Salted__") + salt + encrypted.bytes); + final encrypted = _processAesCbcPkcs7( + forEncryption: true, + input: plainText, + key: keyndIV.item1, + iv: keyndIV.item2, + ); + Uint8List encryptedBytesWithSalt = Uint8List.fromList( + createUint8ListFromString("Salted__") + salt + encrypted, + ); return base64.encode(encryptedBytesWithSalt); } catch (error) { rethrow; @@ -27,20 +29,40 @@ List decryptAESCryptoJS(String encrypted, String passphrase) { try { Uint8List encryptedBytesWithSalt = base64.decode(encrypted); - Uint8List encryptedBytes = encryptedBytesWithSalt.sublist(16, encryptedBytesWithSalt.length); + Uint8List encryptedBytes = encryptedBytesWithSalt.sublist( + 16, + encryptedBytesWithSalt.length, + ); final salt = encryptedBytesWithSalt.sublist(8, 16); var keyndIV = deriveKeyAndIV(passphrase, salt); - final key = encrypt.Key(keyndIV.item1); - final iv = encrypt.IV(keyndIV.item2); - - final encrypter = encrypt.Encrypter(encrypt.AES(key, mode: encrypt.AESMode.cbc, padding: "PKCS7")); - final decrypted = encrypter.decryptBytes(encrypt.Encrypted(encryptedBytes), iv: iv); - return decrypted; + return _processAesCbcPkcs7( + forEncryption: false, + input: encryptedBytes, + key: keyndIV.item1, + iv: keyndIV.item2, + ); } catch (error) { rethrow; } } +Uint8List _processAesCbcPkcs7({ + required bool forEncryption, + required Uint8List input, + required Uint8List key, + required Uint8List iv, +}) { + final cipher = PaddedBlockCipher('AES/CBC/PKCS7') + ..init( + forEncryption, + PaddedBlockCipherParameters, Null>( + ParametersWithIV(KeyParameter(key), iv), + null, + ), + ); + return cipher.process(input); +} + Tuple2 deriveKeyAndIV(String passphrase, Uint8List salt) { var password = createUint8ListFromString(passphrase); Uint8List concatenatedHashes = Uint8List(0); diff --git a/lib/utils/logger/logger.dart b/lib/utils/logger/logger.dart index 3278e9c428..61ea0a6aa6 100644 --- a/lib/utils/logger/logger.dart +++ b/lib/utils/logger/logger.dart @@ -204,9 +204,9 @@ class BaseLogger extends GetxService { final encoder = ZipFileEncoder(); encoder.create(zippedLogFile.path); for (final logPath in logPaths) { - encoder.addFile(File(logPath)); + encoder.addFileSync(File(logPath)); } - encoder.close(); + encoder.closeSync(); return zippedLogFile.path; } diff --git a/packages/media_kit_libs_windows_video/CHANGELOG.md b/packages/media_kit_libs_windows_video/CHANGELOG.md new file mode 100644 index 0000000000..3e7f55d372 --- /dev/null +++ b/packages/media_kit_libs_windows_video/CHANGELOG.md @@ -0,0 +1,11 @@ +## 1.0.11+openbubbles.1 + +* Keep the upstream media-kit plugin registration and runtime contract. +* Resolve both x64 and ARM64 libmpv from one pinned, SHA-256 verified release. +* Require ANGLE to be built from the pinned official Google source checkout. +* Reject missing, unlisted, hash-mismatched, or wrong-architecture PE files. +* Generate source, toolchain, file-hash, and license provenance with each ANGLE bundle. +* Install portable runtime evidence and ANGLE license inventory without local paths. +* Add verified app-runner packaging and architecture-matched libmpv load checks. +* Record the unresolved libmpv transitive source and redistribution blockers. +* Add native x64 and ARM64 CI scaffolding without committing generated binaries. diff --git a/packages/media_kit_libs_windows_video/LICENSE b/packages/media_kit_libs_windows_video/LICENSE new file mode 100644 index 0000000000..13a6a91f70 --- /dev/null +++ b/packages/media_kit_libs_windows_video/LICENSE @@ -0,0 +1,22 @@ +MIT License + +Copyright (c) 2021 and onwards Hitesh Kumar Saini +Copyright (c) 2026 OpenBubbles contributors + +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/packages/media_kit_libs_windows_video/README.md b/packages/media_kit_libs_windows_video/README.md new file mode 100644 index 0000000000..0f85e22813 --- /dev/null +++ b/packages/media_kit_libs_windows_video/README.md @@ -0,0 +1,51 @@ +# Audited Windows media-kit native bundle + +This is a repo-local fork of `media_kit_libs_windows_video` 1.0.11. It keeps +the plugin name and registration ABI and replaces the hosted package through +the application path override. + +Both architectures fail closed unless an ANGLE bundle built from the pinned +official Google ANGLE source is present and passes its manifest, SHA-256, +PE-machine, provenance, and license-inventory checks. The package never +downloads or accepts the unlicensed third-party ARM64 ANGLE bundle. + +## Trust boundary + +* ANGLE source: official `chromium.googlesource.com/angle/angle.git`, pinned. +* Build tools: official depot_tools, pinned. +* libmpv: pinned media-kit release assets, checked with committed SHA-256 values. +* Generated ANGLE DLLs: not committed. CI or a maintainer builds them from + source and produces a manifest, license inventory, archive hash, and GitHub + build-provenance attestation. +* Installed build evidence: sanitized manifests, hashes, notices, and ANGLE + licenses under the runner's `data/native-media` directory. Absolute cache + paths are never installed. +* Direct3D compiler/runtime: supplied by supported Windows versions, not copied + from an unrelated prebuilt bundle. + +Run the host-side checks: + +```powershell +pwsh -NoProfile -File .\tool\test_native_media_scaffold.ps1 +``` + +The application-level verifier and complete runner wrapper live under +`tooling/windows` at the repository root. + +PowerShell 7 (`pwsh`) is required so native command arguments and captured +verification output retain exact boundaries when CMake invokes the resolver. + +Build official ANGLE for the current Windows architecture: + +```powershell +pwsh -NoProfile -File .\tool\build_official_angle.ps1 ` + -Architecture arm64 ` + -WorkRoot C:\Codex\OpenBubblesReview\build-cache\official-angle-arm64 ` + -OutputRoot .\windows\native\arm64\angle +``` + +See `docs/WINDOWS_ARM64_NATIVE_MEDIA.md` in the application repository for +release gates and integration instructions. + +Public redistribution remains blocked until the exact libmpv/FFmpeg +transitive license inventory is complete. See `THIRD_PARTY_NOTICES.md`. diff --git a/packages/media_kit_libs_windows_video/THIRD_PARTY_NOTICES.md b/packages/media_kit_libs_windows_video/THIRD_PARTY_NOTICES.md new file mode 100644 index 0000000000..8100c171b2 --- /dev/null +++ b/packages/media_kit_libs_windows_video/THIRD_PARTY_NOTICES.md @@ -0,0 +1,49 @@ +# Third-party provenance and license boundary + +## media-kit package scaffold + +The registration shim and package structure derive from +`media_kit_libs_windows_video` 1.0.11 in the MIT-licensed +`media-kit/media-kit` project. + +## Google ANGLE + +ANGLE is built only from the official Google source repository at the commit +recorded in `provenance/native-dependencies.json`. ANGLE uses a BSD-style +license and includes separately licensed third-party components. The build +tool copies the top-level ANGLE license and inventories license, notice, +copying, and `README.chromium` files from the pinned source checkout into the +generated native bundle. + +No prebuilt ANGLE DLL from an unofficial fork is accepted. + +## mpv, FFmpeg, and static dependencies + +The selected libmpv release was produced by the source build identified in +`provenance/native-dependencies.json`. That build requests mpv with +`-Dgpl=false` and FFmpeg with `--disable-gpl --disable-nonfree`, but mpv +explicitly warns that flags alone do not prove that a resulting binary is +LGPL-only. The release archives do not contain a complete transitive license +inventory. + +The pinned builder recipe was also audited at commit +`8ddbe5472465950b87853789f7173f2eedc5586a`. The mpv target has 13 direct +recipe dependencies and FFmpeg has 32. The release archives contain eight +entries per architecture, with no license, notice, source-revision manifest, +or relinkable object inventory. Several source recipes are not pinned to full +commits, including FFmpeg, OpenSSL, and libpng at their then-current default +branches, plus explicit `main` references for libjpeg-turbo, shaderc, and the +Vulkan loader. The final transitive source revisions therefore cannot be +reconstructed from the archive or builder commit alone. + +Therefore: + +* local builds and native validation may use the pinned assets; +* a public installer must not be released until its exact libmpv/FFmpeg + transitive source and license inventory has been reviewed and bundled; +* release artifacts must retain the generated ANGLE license inventory and + supply all LGPL notices, relinkability/source obligations, and source offers + required by the verified native dependency set. + +This fail-closed release gate is intentional. A working DLL is not sufficient +evidence that redistribution is compliant. diff --git a/packages/media_kit_libs_windows_video/provenance/native-dependencies.json b/packages/media_kit_libs_windows_video/provenance/native-dependencies.json new file mode 100644 index 0000000000..ccc573f640 --- /dev/null +++ b/packages/media_kit_libs_windows_video/provenance/native-dependencies.json @@ -0,0 +1,89 @@ +{ + "schema_version": 1, + "upstream_package": { + "name": "media_kit_libs_windows_video", + "version": "1.0.11", + "repository": "https://github.com/media-kit/media-kit", + "license": "MIT" + }, + "angle": { + "source_url": "https://chromium.googlesource.com/angle/angle.git", + "source_commit": "cd05752a5137b5f068c11a7a3561e7441a34df75", + "source_license": "BSD-style with third-party notices", + "depot_tools_url": "https://chromium.googlesource.com/chromium/tools/depot_tools.git", + "depot_tools_commit": "e154c8eda5e63cbe85a765ae9d06e2b7af05139e", + "gn_args_common": [ + "is_debug=false", + "is_component_build=false", + "is_clang=true", + "clang_use_chrome_plugins=false", + "symbol_level=0", + "angle_build_tests=false", + "angle_enable_d3d11=true", + "angle_enable_gl=false", + "angle_enable_vulkan=false", + "angle_enable_vulkan_system_info=false", + "use_remoteexec=false" + ], + "runtime_files": { + "x64": [ + "bin/libEGL.dll", + "bin/libGLESv2.dll" + ], + "arm64": [ + "bin/libEGL.dll", + "bin/libGLESv2.dll" + ] + } + }, + "libmpv": { + "builder_repository": "https://github.com/media-kit/libmpv-win32-video-cmake", + "builder_commit": "8ddbe5472465950b87853789f7173f2eedc5586a", + "release": "20241021", + "release_url": "https://github.com/media-kit/libmpv-win32-video-cmake/releases/tag/20241021", + "mpv_commit": "0f7858451817c5fd5ebdb74a807a7c997662c390", + "license_mode_evidence": { + "mpv_configure": "-Dgpl=false", + "ffmpeg_configure": "--disable-gpl --disable-nonfree --enable-version3", + "redistribution_status": "blocked_pending_transitive_license_inventory" + }, + "release_audit": { + "verified_builder_commit": "8ddbe5472465950b87853789f7173f2eedc5586a", + "archive_inventory": { + "x64_entry_count": 8, + "arm64_entry_count": 8, + "license_or_notice_files": [], + "source_revision_manifest_present": false + }, + "builder_recipe": { + "direct_mpv_dependency_count": 13, + "direct_ffmpeg_dependency_count": 32, + "all_transitive_source_revisions_resolved": false, + "unresolved_revision_examples": [ + "FFmpeg", + "OpenSSL", + "libpng", + "libjpeg-turbo@main", + "shaderc@main", + "Vulkan-Loader@main" + ] + } + }, + "artifacts": { + "x64": { + "url": "https://github.com/media-kit/libmpv-win32-video-cmake/releases/download/20241021/mpv-dev-x86_64-20241021-git-0f78584.7z", + "sha256": "e23701df0adc1fe57c8ede3ff313513b0b80519870058c2d35ff02754284a007", + "archive_name": "mpv-dev-x86_64-20241021-git-0f78584.7z", + "dll_relative_path": "libmpv-2.dll", + "pe_machine": "X64" + }, + "arm64": { + "url": "https://github.com/media-kit/libmpv-win32-video-cmake/releases/download/20241021/mpv-dev-aarch64-20241021-git-0f78584.7z", + "sha256": "d445d02ab2ee60b1b5988f08ce4d2394cdcc594e98321b746a313313e96133ae", + "archive_name": "mpv-dev-aarch64-20241021-git-0f78584.7z", + "dll_relative_path": "libmpv-2.dll", + "pe_machine": "ARM64" + } + } + } +} diff --git a/packages/media_kit_libs_windows_video/pubspec.yaml b/packages/media_kit_libs_windows_video/pubspec.yaml new file mode 100644 index 0000000000..71569f47ff --- /dev/null +++ b/packages/media_kit_libs_windows_video/pubspec.yaml @@ -0,0 +1,25 @@ +name: media_kit_libs_windows_video +description: Auditable OpenBubbles Windows native media bundle for package:media_kit. +version: 1.0.11+openbubbles.1 +publish_to: none +homepage: https://github.com/OpenBubbles/openbubbles-app +repository: https://github.com/OpenBubbles/openbubbles-app + +environment: + sdk: ">=2.17.0 <4.0.0" + flutter: ">=3.0.0" + +dependencies: + flutter: + sdk: flutter + +dev_dependencies: + flutter_test: + sdk: flutter + flutter_lints: ^5.0.0 + +flutter: + plugin: + platforms: + windows: + pluginClass: MediaKitLibsWindowsVideoPluginCApi diff --git a/packages/media_kit_libs_windows_video/tool/NativeMediaVerification.psm1 b/packages/media_kit_libs_windows_video/tool/NativeMediaVerification.psm1 new file mode 100644 index 0000000000..95144eb933 --- /dev/null +++ b/packages/media_kit_libs_windows_video/tool/NativeMediaVerification.psm1 @@ -0,0 +1,364 @@ +Set-StrictMode -Version Latest + +function Get-Sha256Hex { + [CmdletBinding()] + param( + [Parameter(Mandatory)] + [string] $Path + ) + + $resolved = (Resolve-Path -LiteralPath $Path -ErrorAction Stop).Path + return (Get-FileHash -LiteralPath $resolved -Algorithm SHA256).Hash.ToLowerInvariant() +} + +function Get-PEMachine { + [CmdletBinding()] + param( + [Parameter(Mandatory)] + [string] $Path + ) + + $resolved = (Resolve-Path -LiteralPath $Path -ErrorAction Stop).Path + $stream = [System.IO.File]::Open( + $resolved, + [System.IO.FileMode]::Open, + [System.IO.FileAccess]::Read, + [System.IO.FileShare]::Read + ) + + try { + if ($stream.Length -lt 64) { + throw "PE file is too short: $resolved" + } + + $reader = [System.IO.BinaryReader]::new($stream) + if ($reader.ReadUInt16() -ne 0x5A4D) { + throw "Missing DOS MZ header: $resolved" + } + + $stream.Position = 0x3C + $peOffset = $reader.ReadInt32() + if ($peOffset -lt 0 -or ($peOffset + 6) -gt $stream.Length) { + throw "Invalid PE header offset in $resolved" + } + + $stream.Position = $peOffset + if ($reader.ReadUInt32() -ne 0x00004550) { + throw "Missing PE signature: $resolved" + } + + $machine = $reader.ReadUInt16() + switch ($machine) { + 0x014C { return "X86" } + 0x8664 { return "X64" } + 0xAA64 { return "ARM64" } + 0xA641 { return "ARM64EC" } + default { return ("UNKNOWN_0x{0:X4}" -f $machine) } + } + } + finally { + $stream.Dispose() + } +} + +function Assert-SafeRelativePath { + [CmdletBinding()] + param( + [Parameter(Mandatory)] + [string] $Root, + + [Parameter(Mandatory)] + [string] $RelativePath + ) + + if ([string]::IsNullOrWhiteSpace($RelativePath)) { + throw "Manifest contains an empty relative path." + } + if ([System.IO.Path]::IsPathRooted($RelativePath)) { + throw "Manifest path must be relative: $RelativePath" + } + + $segments = $RelativePath.Replace('\', '/').Split('/') + if ($segments -contains '..') { + throw "Manifest path escapes its bundle root: $RelativePath" + } + + $rootFull = [System.IO.Path]::GetFullPath($Root).TrimEnd('\', '/') + $candidate = [System.IO.Path]::GetFullPath( + (Join-Path $rootFull $RelativePath) + ) + $prefix = $rootFull + [System.IO.Path]::DirectorySeparatorChar + if (-not $candidate.StartsWith( + $prefix, + [System.StringComparison]::OrdinalIgnoreCase + )) { + throw "Manifest path escapes its bundle root: $RelativePath" + } + + return $candidate +} + +function Test-HexDigest { + param([string] $Value) + return $Value -match '^[0-9a-fA-F]{64}$' +} + +function Test-NativeMediaBundle { + [CmdletBinding()] + param( + [Parameter(Mandatory)] + [string] $BundleRoot, + + [Parameter(Mandatory)] + [string] $ManifestPath, + + [Parameter(Mandatory)] + [ValidateSet("x64", "arm64")] + [string] $Architecture, + + [Parameter(Mandatory)] + [string] $ExpectedAngleSourceUrl, + + [Parameter(Mandatory)] + [string] $ExpectedAngleCommit, + + [Parameter(Mandatory)] + [string] $ExpectedDepotToolsUrl, + + [Parameter(Mandatory)] + [string] $ExpectedDepotToolsCommit, + + [Parameter(Mandatory)] + [string[]] $RequiredRuntimeFiles + ) + + $bundle = (Resolve-Path -LiteralPath $BundleRoot -ErrorAction Stop).Path + $manifestFile = (Resolve-Path -LiteralPath $ManifestPath -ErrorAction Stop).Path + $manifest = Get-Content -LiteralPath $manifestFile -Raw | + ConvertFrom-Json -ErrorAction Stop + + if ($manifest.schema_version -ne 1) { + throw "Unsupported ANGLE bundle manifest schema: $($manifest.schema_version)" + } + if ($manifest.architecture -ne $Architecture) { + throw "ANGLE bundle architecture is '$($manifest.architecture)', expected '$Architecture'." + } + if ($manifest.source.angle_url -ne $ExpectedAngleSourceUrl) { + throw "ANGLE source URL does not match the reviewed official source." + } + if ($manifest.source.angle_commit -ne $ExpectedAngleCommit) { + throw "ANGLE source commit does not match the reviewed pin." + } + if ($manifest.source.depot_tools_url -ne $ExpectedDepotToolsUrl) { + throw "depot_tools URL does not match the reviewed official source." + } + if ($manifest.source.depot_tools_commit -ne $ExpectedDepotToolsCommit) { + throw "depot_tools commit does not match the reviewed pin." + } + + $expectedMachine = if ($Architecture -eq "arm64") { "ARM64" } else { "X64" } + $manifestFiles = @($manifest.files) + if ($manifestFiles.Count -eq 0) { + throw "ANGLE bundle manifest has no runtime files." + } + + $seen = [System.Collections.Generic.HashSet[string]]::new( + [System.StringComparer]::OrdinalIgnoreCase + ) + $required = [System.Collections.Generic.HashSet[string]]::new( + [System.StringComparer]::OrdinalIgnoreCase + ) + foreach ($requiredRuntime in $RequiredRuntimeFiles) { + $requiredRelative = ([string] $requiredRuntime).Replace('\', '/') + Assert-SafeRelativePath ` + -Root $bundle ` + -RelativePath $requiredRelative | + Out-Null + if (-not $required.Add($requiredRelative)) { + throw "Required ANGLE runtime list contains duplicate path: $requiredRelative" + } + } + $validatedFiles = [System.Collections.Generic.List[object]]::new() + + foreach ($entry in $manifestFiles) { + $relative = ([string] $entry.relative_path).Replace('\', '/') + if (-not $seen.Add($relative)) { + throw "ANGLE bundle manifest contains duplicate path: $relative" + } + if (-not $required.Contains($relative)) { + throw "ANGLE bundle manifest contains an unexpected runtime file: $relative" + } + if (-not (Test-HexDigest ([string] $entry.sha256))) { + throw "ANGLE bundle manifest has an invalid SHA-256 for $relative" + } + + $file = Assert-SafeRelativePath -Root $bundle -RelativePath $relative + if (-not (Test-Path -LiteralPath $file -PathType Leaf)) { + throw "ANGLE bundle is missing required manifest file: $relative" + } + + $actualHash = Get-Sha256Hex -Path $file + if ($actualHash -ne ([string] $entry.sha256).ToLowerInvariant()) { + throw "ANGLE bundle SHA-256 mismatch for $relative" + } + + $actualMachine = Get-PEMachine -Path $file + if ($actualMachine -ne $expectedMachine) { + throw "ANGLE bundle PE machine mismatch for ${relative}: got $actualMachine, expected $expectedMachine" + } + if ([string] $entry.pe_machine -ne $expectedMachine) { + throw "ANGLE manifest PE machine mismatch for ${relative}: got $($entry.pe_machine), expected $expectedMachine" + } + + $validatedFiles.Add([pscustomobject]@{ + relative_path = $relative.Replace('\', '/') + path = $file + sha256 = $actualHash + pe_machine = $actualMachine + }) + } + + foreach ($relative in $required) { + if (-not $seen.Contains($relative)) { + throw "ANGLE manifest omits required runtime file: $relative" + } + } + if ($seen.Count -ne $required.Count) { + throw "ANGLE manifest runtime set does not exactly match the reviewed set." + } + + $binRoot = Join-Path $bundle "bin" + if (-not (Test-Path -LiteralPath $binRoot -PathType Container)) { + throw "ANGLE bundle has no bin directory." + } + + $actualPeFiles = @( + Get-ChildItem -LiteralPath $bundle -File -Recurse | + Where-Object { $_.Extension -in @(".dll", ".exe") } + ) + $bundlePrefixLength = $bundle.TrimEnd('\', '/').Length + 1 + foreach ($actual in $actualPeFiles) { + $relative = $actual.FullName.Substring($bundlePrefixLength).Replace('\', '/') + if (-not $seen.Contains($relative)) { + throw "ANGLE bundle contains an unlisted PE runtime: $relative" + } + } + + $licensePath = Join-Path $bundle "licenses\ANGLE-LICENSE.txt" + $licenseInventoryPath = Join-Path $bundle "licenses\license-inventory.json" + foreach ($requiredLicenseFile in @($licensePath, $licenseInventoryPath)) { + if (-not (Test-Path -LiteralPath $requiredLicenseFile -PathType Leaf)) { + throw "ANGLE bundle is missing provenance file: $requiredLicenseFile" + } + } + if (-not (Test-HexDigest ([string] $manifest.angle_license_sha256))) { + throw "ANGLE manifest has an invalid top-level license SHA-256." + } + if ((Get-Sha256Hex -Path $licensePath) -ne + ([string] $manifest.angle_license_sha256).ToLowerInvariant()) { + throw "ANGLE top-level license hash does not match the manifest." + } + if (-not (Test-HexDigest ([string] $manifest.license_inventory_sha256))) { + throw "ANGLE manifest has an invalid license inventory SHA-256." + } + if ((Get-Sha256Hex -Path $licenseInventoryPath) -ne + ([string] $manifest.license_inventory_sha256).ToLowerInvariant()) { + throw "ANGLE license inventory hash does not match the manifest." + } + + $licenseInventory = @( + Get-Content -LiteralPath $licenseInventoryPath -Raw | + ConvertFrom-Json -ErrorAction Stop + ) + if ($licenseInventory.Count -eq 0) { + throw "ANGLE third-party license inventory is empty." + } + $seenLicenses = [System.Collections.Generic.HashSet[string]]::new( + [System.StringComparer]::OrdinalIgnoreCase + ) + foreach ($licenseEntry in $licenseInventory) { + $relative = [string] $licenseEntry.bundle_relative_path + if (-not $relative.StartsWith( + "licenses/source-tree/", + [System.StringComparison]::OrdinalIgnoreCase + )) { + throw "ANGLE license inventory path is outside its source-tree boundary: $relative" + } + if (-not $seenLicenses.Add($relative)) { + throw "ANGLE license inventory contains a duplicate path: $relative" + } + if (-not (Test-HexDigest ([string] $licenseEntry.sha256))) { + throw "ANGLE license inventory has an invalid SHA-256 for $relative" + } + $licenseFile = Assert-SafeRelativePath ` + -Root $bundle ` + -RelativePath $relative + if (-not (Test-Path -LiteralPath $licenseFile -PathType Leaf)) { + throw "ANGLE license inventory references a missing file: $relative" + } + if ((Get-Sha256Hex -Path $licenseFile) -ne + ([string] $licenseEntry.sha256).ToLowerInvariant()) { + throw "ANGLE third-party license hash mismatch: $relative" + } + } + + $sourceTree = Join-Path $bundle "licenses\source-tree" + if (-not (Test-Path -LiteralPath $sourceTree -PathType Container)) { + throw "ANGLE bundle is missing its third-party license source tree." + } + $sourceTreeFiles = @(Get-ChildItem -LiteralPath $sourceTree -File -Recurse) + $bundleLicensePrefix = $bundle.TrimEnd('\', '/').Length + 1 + foreach ($sourceTreeFile in $sourceTreeFiles) { + $relative = $sourceTreeFile.FullName.Substring( + $bundleLicensePrefix + ).Replace('\', '/') + if (-not $seenLicenses.Contains($relative)) { + throw "ANGLE license source tree contains an unlisted file: $relative" + } + } + if ($sourceTreeFiles.Count -ne $seenLicenses.Count) { + throw "ANGLE license source tree file count does not match its inventory." + } + + $evidenceFiles = @( + [pscustomobject]@{ + path = [string] $manifest.evidence.gclient_revisions_path + sha256 = [string] $manifest.evidence.gclient_revisions_sha256 + }, + [pscustomobject]@{ + path = [string] $manifest.evidence.gn_args_path + sha256 = [string] $manifest.evidence.gn_args_sha256 + } + ) + foreach ($evidenceEntry in $evidenceFiles) { + if (-not (Test-HexDigest $evidenceEntry.sha256)) { + throw "ANGLE manifest has an invalid evidence SHA-256 for $($evidenceEntry.path)." + } + $evidencePath = Assert-SafeRelativePath ` + -Root $bundle ` + -RelativePath $evidenceEntry.path + if (-not (Test-Path -LiteralPath $evidencePath -PathType Leaf)) { + throw "ANGLE bundle is missing provenance evidence: $($evidenceEntry.path)" + } + if ((Get-Sha256Hex -Path $evidencePath) -ne + $evidenceEntry.sha256.ToLowerInvariant()) { + throw "ANGLE provenance evidence hash mismatch for $($evidenceEntry.path)." + } + } + + return [pscustomobject]@{ + architecture = $Architecture + angle_commit = $ExpectedAngleCommit + depot_tools_commit = $ExpectedDepotToolsCommit + files = @($validatedFiles) + manifest_path = $manifestFile + bundle_root = $bundle + } +} + +Export-ModuleMember -Function @( + "Get-Sha256Hex", + "Get-PEMachine", + "Assert-SafeRelativePath", + "Test-NativeMediaBundle" +) diff --git a/packages/media_kit_libs_windows_video/tool/build_official_angle.ps1 b/packages/media_kit_libs_windows_video/tool/build_official_angle.ps1 new file mode 100644 index 0000000000..c90de37753 --- /dev/null +++ b/packages/media_kit_libs_windows_video/tool/build_official_angle.ps1 @@ -0,0 +1,449 @@ +[CmdletBinding()] +param( + [Parameter(Mandatory)] + [ValidateSet("x64", "arm64")] + [string] $Architecture, + + [Parameter(Mandatory)] + [string] $WorkRoot, + + [Parameter(Mandatory)] + [string] $OutputRoot, + + [string] $ProvenancePath = ( + Join-Path $PSScriptRoot "..\provenance\native-dependencies.json" + ), + + [switch] $Force, + + [switch] $ValidateOnly +) + +$ErrorActionPreference = "Stop" +Set-StrictMode -Version Latest + +Import-Module (Join-Path $PSScriptRoot "NativeMediaVerification.psm1") -Force + +function Get-SafeFullPath { + param( + [Parameter(Mandatory)] + [string] $Path, + + [Parameter(Mandatory)] + [string] $Label + ) + + $full = [System.IO.Path]::GetFullPath($Path).TrimEnd('\', '/') + $root = [System.IO.Path]::GetPathRoot($full).TrimEnd('\', '/') + if ([string]::IsNullOrWhiteSpace($full) -or $full -eq $root) { + throw "$Label cannot be a filesystem root: $full" + } + if ($full.Length -lt ($root.Length + 8)) { + throw "$Label is too broad for build output: $full" + } + return $full +} + +function Invoke-Checked { + param( + [Parameter(Mandatory)] + [string] $FilePath, + + [Parameter(Mandatory)] + [string[]] $ArgumentList, + + [Parameter(Mandatory)] + [string] $WorkingDirectory + ) + + Push-Location $WorkingDirectory + try { + & $FilePath @ArgumentList + if ($LASTEXITCODE -ne 0) { + throw "Command failed with exit code ${LASTEXITCODE}: $FilePath $($ArgumentList -join ' ')" + } + } + finally { + Pop-Location + } +} + +function Get-CommandText { + param( + [Parameter(Mandatory)] + [string] $FilePath, + + [string[]] $ArgumentList = @(), + + [string] $WorkingDirectory + ) + + if ($WorkingDirectory) { + Push-Location $WorkingDirectory + } + try { + $value = & $FilePath @ArgumentList 2>&1 + if ($LASTEXITCODE -ne 0) { + throw "Unable to query command output: $FilePath $($ArgumentList -join ' ')" + } + return (($value | Out-String).Trim()) + } + finally { + if ($WorkingDirectory) { + Pop-Location + } + } +} + +function Ensure-PinnedCheckout { + param( + [Parameter(Mandatory)] + [string] $Path, + + [Parameter(Mandatory)] + [string] $RemoteUrl, + + [Parameter(Mandatory)] + [string] $Commit, + + [Parameter(Mandatory)] + [string] $Git + ) + + if (-not (Test-Path -LiteralPath $Path -PathType Container)) { + New-Item -ItemType Directory -Path $Path -Force | Out-Null + Invoke-Checked -FilePath $Git -ArgumentList @("init") -WorkingDirectory $Path + Invoke-Checked -FilePath $Git -ArgumentList @( + "remote", "add", "origin", $RemoteUrl + ) -WorkingDirectory $Path + } + elseif (-not (Test-Path -LiteralPath (Join-Path $Path ".git"))) { + throw "Existing checkout path is not a Git repository: $Path" + } + + $actualRemote = (& $Git -C $Path remote get-url origin).Trim() + if ($LASTEXITCODE -ne 0 -or $actualRemote -ne $RemoteUrl) { + throw "Checkout origin mismatch at $Path. Got '$actualRemote', expected '$RemoteUrl'." + } + + Invoke-Checked -FilePath $Git -ArgumentList @( + "fetch", "--depth", "1", "origin", $Commit + ) -WorkingDirectory $Path + Invoke-Checked -FilePath $Git -ArgumentList @( + "checkout", "--detach", "--force", $Commit + ) -WorkingDirectory $Path + + $actualCommit = (& $Git -C $Path rev-parse HEAD).Trim() + if ($actualCommit -ne $Commit) { + throw "Checkout commit mismatch at $Path. Got $actualCommit, expected $Commit." + } +} + +function Write-Utf8NoBom { + param( + [Parameter(Mandatory)] + [string] $Path, + + [Parameter(Mandatory)] + [string] $Content + ) + + [System.IO.File]::WriteAllText( + $Path, + $Content, + [System.Text.UTF8Encoding]::new($false) + ) +} + +$work = Get-SafeFullPath -Path $WorkRoot -Label "WorkRoot" +$output = Get-SafeFullPath -Path $OutputRoot -Label "OutputRoot" +$provenanceFile = (Resolve-Path -LiteralPath $ProvenancePath -ErrorAction Stop).Path +$provenance = Get-Content -LiteralPath $provenanceFile -Raw | + ConvertFrom-Json -ErrorAction Stop + +if ($provenance.schema_version -ne 1) { + throw "Unsupported native dependency provenance schema." +} +if ($provenance.angle.source_url -ne + "https://chromium.googlesource.com/angle/angle.git") { + throw "Refusing non-official ANGLE source URL." +} +if ($provenance.angle.depot_tools_url -ne + "https://chromium.googlesource.com/chromium/tools/depot_tools.git") { + throw "Refusing non-official depot_tools source URL." +} +foreach ($pin in @( + [string] $provenance.angle.source_commit, + [string] $provenance.angle.depot_tools_commit +)) { + if ($pin -notmatch '^[0-9a-f]{40}$') { + throw "Official source pins must be full lowercase Git commit hashes." + } +} + +$requiredRuntimeFiles = @($provenance.angle.runtime_files.$Architecture) +$expectedMachine = if ($Architecture -eq "arm64") { "ARM64" } else { "X64" } + +if (Test-Path -LiteralPath $output -PathType Container) { + $existingManifest = Join-Path $output "native-manifest.json" + if (-not $Force) { + $result = Test-NativeMediaBundle ` + -BundleRoot $output ` + -ManifestPath $existingManifest ` + -Architecture $Architecture ` + -ExpectedAngleSourceUrl $provenance.angle.source_url ` + -ExpectedAngleCommit $provenance.angle.source_commit ` + -ExpectedDepotToolsUrl $provenance.angle.depot_tools_url ` + -ExpectedDepotToolsCommit $provenance.angle.depot_tools_commit ` + -RequiredRuntimeFiles $requiredRuntimeFiles + $result | ConvertTo-Json -Depth 7 + exit 0 + } +} + +$plan = [pscustomobject]@{ + architecture = $Architecture + work_root = $work + output_root = $output + angle_source = $provenance.angle.source_url + angle_commit = $provenance.angle.source_commit + depot_tools_source = $provenance.angle.depot_tools_url + depot_tools_commit = $provenance.angle.depot_tools_commit + required_runtime_files = $requiredRuntimeFiles +} + +if ($ValidateOnly) { + $plan | ConvertTo-Json -Depth 6 + exit 0 +} + +New-Item -ItemType Directory -Path $work -Force | Out-Null + +$git = (Get-Command git -ErrorAction Stop).Source +$python = (Get-Command python -ErrorAction Stop).Source +$depotTools = Join-Path $work "depot_tools" +$angleSource = Join-Path $work "angle" + +Ensure-PinnedCheckout ` + -Path $depotTools ` + -RemoteUrl $provenance.angle.depot_tools_url ` + -Commit $provenance.angle.depot_tools_commit ` + -Git $git + +$env:PATH = "$depotTools;$env:PATH" +$env:DEPOT_TOOLS_WIN_TOOLCHAIN = "0" +$env:DEPOT_TOOLS_UPDATE = "0" + +Ensure-PinnedCheckout ` + -Path $angleSource ` + -RemoteUrl $provenance.angle.source_url ` + -Commit $provenance.angle.source_commit ` + -Git $git + +Invoke-Checked ` + -FilePath $python ` + -ArgumentList @("scripts/bootstrap.py") ` + -WorkingDirectory $angleSource +Invoke-Checked ` + -FilePath (Join-Path $depotTools "gclient.bat") ` + -ArgumentList @("sync", "--force", "--reset", "--no-history") ` + -WorkingDirectory $angleSource + +$actualAngleCommit = (& $git -C $angleSource rev-parse HEAD).Trim() +if ($actualAngleCommit -ne $provenance.angle.source_commit) { + throw "gclient changed the pinned ANGLE checkout to $actualAngleCommit." +} +$actualDepotToolsCommit = (& $git -C $depotTools rev-parse HEAD).Trim() +if ($actualDepotToolsCommit -ne $provenance.angle.depot_tools_commit) { + throw "depot_tools moved away from its reviewed pin to $actualDepotToolsCommit." +} + +$gn = (Get-Command gn -ErrorAction Stop).Source +$autoninja = (Get-Command autoninja -ErrorAction Stop).Source +$targetCpu = if ($Architecture -eq "arm64") { "arm64" } else { "x64" } +$gnArgs = @($provenance.angle.gn_args_common) + @("target_cpu=`"$targetCpu`"") +$gnArgsText = $gnArgs -join " " +$buildRoot = Join-Path $angleSource "out\openbubbles-$Architecture-release" + +Invoke-Checked ` + -FilePath $gn ` + -ArgumentList @("gen", $buildRoot, "--args=$gnArgsText") ` + -WorkingDirectory $angleSource +Invoke-Checked ` + -FilePath $autoninja ` + -ArgumentList @("-C", $buildRoot, "libEGL", "libGLESv2") ` + -WorkingDirectory $angleSource + +$stage = "$output.stage-$([guid]::NewGuid().ToString('N'))" +$bin = Join-Path $stage "bin" +$licenses = Join-Path $stage "licenses" +$sourceLicenses = Join-Path $licenses "source-tree" +$evidence = Join-Path $stage "provenance" +New-Item -ItemType Directory -Path $bin -Force | Out-Null +New-Item -ItemType Directory -Path $sourceLicenses -Force | Out-Null +New-Item -ItemType Directory -Path $evidence -Force | Out-Null + +foreach ($relative in $requiredRuntimeFiles) { + $name = Split-Path $relative -Leaf + $source = Join-Path $buildRoot $name + if (-not (Test-Path -LiteralPath $source -PathType Leaf)) { + throw "Official ANGLE build did not produce required runtime: $source" + } + Copy-Item -LiteralPath $source -Destination (Join-Path $bin $name) +} + +$angleLicense = Join-Path $angleSource "LICENSE" +if (-not (Test-Path -LiteralPath $angleLicense -PathType Leaf)) { + throw "Pinned ANGLE checkout is missing its top-level LICENSE." +} +Copy-Item -LiteralPath $angleLicense -Destination ( + Join-Path $licenses "ANGLE-LICENSE.txt" +) + +$licenseNames = @( + "LICENSE", + "COPYING", + "NOTICE", + "README.chromium" +) +$licenseFiles = @( + Get-ChildItem -LiteralPath (Join-Path $angleSource "third_party") -File -Recurse | + Where-Object { + $base = $_.BaseName + $_.Name -eq "README.chromium" -or + $licenseNames -contains $base -or + $_.Name -like "LICENSE.*" -or + $_.Name -like "COPYING.*" -or + $_.Name -like "NOTICE.*" + } | + Sort-Object FullName +) +if ($licenseFiles.Count -eq 0) { + throw "No third-party license evidence was found in the pinned ANGLE checkout." +} + +$sourcePrefixLength = $angleSource.TrimEnd('\', '/').Length + 1 +$licenseInventory = [System.Collections.Generic.List[object]]::new() +foreach ($item in $licenseFiles) { + if ($item.FullName.StartsWith( + $buildRoot, + [System.StringComparison]::OrdinalIgnoreCase + )) { + continue + } + $sourceRelative = $item.FullName.Substring($sourcePrefixLength).Replace('\', '/') + $bundleRelative = "source-tree/$sourceRelative" + $destination = Join-Path $licenses $bundleRelative + New-Item -ItemType Directory -Path (Split-Path $destination -Parent) -Force | + Out-Null + Copy-Item -LiteralPath $item.FullName -Destination $destination + $licenseInventory.Add([pscustomobject]@{ + source_relative_path = $sourceRelative + bundle_relative_path = "licenses/$bundleRelative" + sha256 = Get-Sha256Hex -Path $destination + }) +} + +$licenseInventoryPath = Join-Path $licenses "license-inventory.json" +Write-Utf8NoBom ` + -Path $licenseInventoryPath ` + -Content (@($licenseInventory) | ConvertTo-Json -Depth 6) + +$gclient = Join-Path $depotTools "gclient.bat" +$gclientRevisionsPath = Join-Path $evidence "gclient-revisions.txt" +$gclientRevisions = Get-CommandText ` + -FilePath $gclient ` + -ArgumentList @("revinfo", "-a") ` + -WorkingDirectory $angleSource +Write-Utf8NoBom ` + -Path $gclientRevisionsPath ` + -Content ($gclientRevisions + [Environment]::NewLine) + +$gnArgsPath = Join-Path $evidence "gn-args.txt" +Write-Utf8NoBom ` + -Path $gnArgsPath ` + -Content (($gnArgs -join [Environment]::NewLine) + [Environment]::NewLine) + +$runtimeEntries = [System.Collections.Generic.List[object]]::new() +foreach ($relative in $requiredRuntimeFiles) { + $file = Join-Path $stage $relative + $machine = Get-PEMachine -Path $file + if ($machine -ne $expectedMachine) { + throw "Official ANGLE output has PE machine $machine, expected $expectedMachine`: $file" + } + $runtimeEntries.Add([pscustomobject]@{ + relative_path = $relative + sha256 = Get-Sha256Hex -Path $file + pe_machine = $machine + origin = "official ANGLE source build" + }) +} + +$manifest = [ordered]@{ + schema_version = 1 + architecture = $Architecture + source = [ordered]@{ + angle_url = $provenance.angle.source_url + angle_commit = $provenance.angle.source_commit + depot_tools_url = $provenance.angle.depot_tools_url + depot_tools_commit = $provenance.angle.depot_tools_commit + } + build = [ordered]@{ + built_at_utc = [DateTime]::UtcNow.ToString("o") + gn_args = $gnArgs + git_version = Get-CommandText -FilePath $git -ArgumentList @("--version") + python_version = Get-CommandText -FilePath $python -ArgumentList @("--version") + gn_version = Get-CommandText -FilePath $gn -ArgumentList @("--version") + ninja_version = Get-CommandText -FilePath $autoninja -ArgumentList @("--version") + os_version = [System.Environment]::OSVersion.VersionString + process_architecture = [System.Runtime.InteropServices.RuntimeInformation]::ProcessArchitecture.ToString() + } + files = @($runtimeEntries) + angle_license_sha256 = Get-Sha256Hex -Path ( + Join-Path $licenses "ANGLE-LICENSE.txt" + ) + license_inventory_sha256 = Get-Sha256Hex -Path $licenseInventoryPath + evidence = [ordered]@{ + gclient_revisions_path = "provenance/gclient-revisions.txt" + gclient_revisions_sha256 = Get-Sha256Hex -Path $gclientRevisionsPath + gn_args_path = "provenance/gn-args.txt" + gn_args_sha256 = Get-Sha256Hex -Path $gnArgsPath + } +} + +$manifestPath = Join-Path $stage "native-manifest.json" +Write-Utf8NoBom ` + -Path $manifestPath ` + -Content ($manifest | ConvertTo-Json -Depth 10) + +Test-NativeMediaBundle ` + -BundleRoot $stage ` + -ManifestPath $manifestPath ` + -Architecture $Architecture ` + -ExpectedAngleSourceUrl $provenance.angle.source_url ` + -ExpectedAngleCommit $provenance.angle.source_commit ` + -ExpectedDepotToolsUrl $provenance.angle.depot_tools_url ` + -ExpectedDepotToolsCommit $provenance.angle.depot_tools_commit ` + -RequiredRuntimeFiles $requiredRuntimeFiles | + Out-Null + +if (Test-Path -LiteralPath $output) { + $backup = "$output.previous-$([DateTime]::UtcNow.ToString('yyyyMMddHHmmss'))" + if (Test-Path -LiteralPath $backup) { + throw "Refusing to overwrite existing native bundle backup: $backup" + } + Move-Item -LiteralPath $output -Destination $backup +} +Move-Item -LiteralPath $stage -Destination $output + +$result = Test-NativeMediaBundle ` + -BundleRoot $output ` + -ManifestPath (Join-Path $output "native-manifest.json") ` + -Architecture $Architecture ` + -ExpectedAngleSourceUrl $provenance.angle.source_url ` + -ExpectedAngleCommit $provenance.angle.source_commit ` + -ExpectedDepotToolsUrl $provenance.angle.depot_tools_url ` + -ExpectedDepotToolsCommit $provenance.angle.depot_tools_commit ` + -RequiredRuntimeFiles $requiredRuntimeFiles + +$result | ConvertTo-Json -Depth 7 diff --git a/packages/media_kit_libs_windows_video/tool/prepare_native_media.ps1 b/packages/media_kit_libs_windows_video/tool/prepare_native_media.ps1 new file mode 100644 index 0000000000..3a78572468 --- /dev/null +++ b/packages/media_kit_libs_windows_video/tool/prepare_native_media.ps1 @@ -0,0 +1,645 @@ +[CmdletBinding()] +param( + [Parameter(Mandatory)] + [ValidateSet("x64", "arm64")] + [string] $Architecture, + + [Parameter(Mandatory)] + [string] $AngleBundleRoot, + + [Parameter(Mandatory)] + [string] $CacheRoot, + + [Parameter(Mandatory)] + [string] $GeneratedCmakePath, + + [string] $ResolutionPath, + + [string] $LibmpvArchivePath, + + [string] $ProvenancePath = ( + Join-Path $PSScriptRoot "..\provenance\native-dependencies.json" + ), + + [switch] $Offline +) + +$ErrorActionPreference = "Stop" +Set-StrictMode -Version Latest + +Import-Module (Join-Path $PSScriptRoot "NativeMediaVerification.psm1") -Force + +function Get-OptionalProperty { + param( + [Parameter(Mandatory)] + [object] $InputObject, + + [Parameter(Mandatory)] + [string] $Name + ) + + $property = $InputObject.PSObject.Properties[$Name] + if ($null -eq $property) { + return $null + } + return $property.Value +} + +function Get-SafeBuildPath { + param( + [Parameter(Mandatory)] + [string] $Path, + + [Parameter(Mandatory)] + [string] $Label + ) + + $full = [System.IO.Path]::GetFullPath($Path).TrimEnd('\', '/') + $root = [System.IO.Path]::GetPathRoot($full).TrimEnd('\', '/') + if ([string]::IsNullOrWhiteSpace($full) -or $full -eq $root) { + throw "$Label cannot be a filesystem root: $full" + } + if ($full.Length -lt ($root.Length + 8)) { + throw "$Label is too broad for generated native files: $full" + } + return $full +} + +function Write-AtomicUtf8NoBom { + param( + [Parameter(Mandatory)] + [string] $Path, + + [Parameter(Mandatory)] + [string] $Content + ) + + $parent = Split-Path $Path -Parent + New-Item -ItemType Directory -Path $parent -Force | Out-Null + $temporary = "$Path.tmp-$([guid]::NewGuid().ToString('N'))" + try { + [System.IO.File]::WriteAllText( + $temporary, + $Content, + [System.Text.UTF8Encoding]::new($false) + ) + Move-Item -LiteralPath $temporary -Destination $Path -Force + } + finally { + if (Test-Path -LiteralPath $temporary) { + Remove-Item -LiteralPath $temporary -Force + } + } +} + +function Invoke-CheckedCapture { + param( + [Parameter(Mandatory)] + [string] $FilePath, + + [Parameter(Mandatory)] + [string[]] $ArgumentList, + + [string] $WorkingDirectory + ) + + $startInfo = [System.Diagnostics.ProcessStartInfo]::new() + $startInfo.FileName = $FilePath + $startInfo.UseShellExecute = $false + $startInfo.CreateNoWindow = $true + $startInfo.RedirectStandardOutput = $true + $startInfo.RedirectStandardError = $true + if ($WorkingDirectory) { + $startInfo.WorkingDirectory = $WorkingDirectory + } + foreach ($argument in $ArgumentList) { + $startInfo.ArgumentList.Add($argument) + } + + $process = [System.Diagnostics.Process]::new() + $process.StartInfo = $startInfo + try { + if (-not $process.Start()) { + throw "Unable to start command: $FilePath" + } + $stdoutTask = $process.StandardOutput.ReadToEndAsync() + $stderrTask = $process.StandardError.ReadToEndAsync() + $process.WaitForExit() + $stdout = $stdoutTask.GetAwaiter().GetResult() + $stderr = $stderrTask.GetAwaiter().GetResult() + if ($process.ExitCode -ne 0) { + throw "Command failed with exit code $($process.ExitCode): $FilePath $($ArgumentList -join ' ')`n$stdout`n$stderr" + } + if ($stderr) { + Write-Verbose $stderr.Trim() + } + return @($stdout -split "`r?`n") + } + finally { + $process.Dispose() + } +} + +function Assert-SafeArchiveListing { + param( + [Parameter(Mandatory)] + [object[]] $Entries + ) + + foreach ($rawEntry in $Entries) { + $entry = ([string] $rawEntry).Trim().Replace('\', '/') + if ([string]::IsNullOrWhiteSpace($entry)) { + continue + } + if ($entry.StartsWith("/") -or + $entry -match '^[A-Za-z]:' -or + $entry.Split('/') -contains '..') { + throw "libmpv archive contains an unsafe path: $entry" + } + } +} + +function Assert-ApprovedLibmpvUrl { + param( + [Parameter(Mandatory)] + [string] $Url, + + [Parameter(Mandatory)] + [string] $Release, + + [Parameter(Mandatory)] + [string] $ArchiveName + ) + + $uri = [Uri] $Url + $expectedPath = ( + "/media-kit/libmpv-win32-video-cmake/releases/download/" + + "$Release/$ArchiveName" + ) + if ($uri.Scheme -ne "https" -or + $uri.Host -ne "github.com" -or + $uri.AbsolutePath -ne $expectedPath -or + -not [string]::IsNullOrEmpty($uri.Query) -or + -not [string]::IsNullOrEmpty($uri.Fragment)) { + throw "Refusing libmpv URL outside the reviewed GitHub release path: $Url" + } +} + +function ConvertTo-CmakePath { + param([Parameter(Mandatory)][string] $Path) + if ($Path.Contains('"')) { + throw "CMake path contains an unsupported quote: $Path" + } + return $Path.Replace('\', '/') +} + +function Test-LibmpvExtraction { + param( + [Parameter(Mandatory)][string] $Root, + [Parameter(Mandatory)][ValidateSet("x64", "arm64")][string] $Architecture, + [Parameter(Mandatory)][string] $ArchiveSha256, + [Parameter(Mandatory)][string] $ExpectedMachine, + [Parameter(Mandatory)][string] $DllRelativePath + ) + + $resolvedRoot = (Resolve-Path -LiteralPath $Root -ErrorAction Stop).Path + $manifestPath = Join-Path $resolvedRoot "extraction-manifest.json" + $manifest = Get-Content -LiteralPath $manifestPath -Raw -ErrorAction Stop | + ConvertFrom-Json -ErrorAction Stop + if ($manifest.schema_version -ne 1 -or + $manifest.architecture -ne $Architecture -or + [string] $manifest.archive_sha256 -ne $ArchiveSha256) { + throw "Existing libmpv extraction manifest does not match the pinned archive." + } + + $seen = [System.Collections.Generic.HashSet[string]]::new( + [System.StringComparer]::OrdinalIgnoreCase + ) + foreach ($entry in @($manifest.files)) { + $relative = [string] $entry.relative_path + if (-not $seen.Add($relative)) { + throw "libmpv extraction manifest contains a duplicate path: $relative" + } + if ([string] $entry.sha256 -notmatch '^[0-9a-fA-F]{64}$') { + throw "libmpv extraction manifest has an invalid hash: $relative" + } + $file = Assert-SafeRelativePath ` + -Root $resolvedRoot ` + -RelativePath $relative + if (-not (Test-Path -LiteralPath $file -PathType Leaf)) { + throw "Existing libmpv extraction is missing $relative." + } + if ((Get-Sha256Hex -Path $file) -ne + ([string] $entry.sha256).ToLowerInvariant()) { + throw "Existing libmpv extraction hash mismatch: $relative" + } + if ([System.IO.Path]::GetExtension($file) -in @(".dll", ".exe")) { + if ((Get-PEMachine -Path $file) -ne $ExpectedMachine) { + throw "Existing libmpv extraction PE mismatch: $relative" + } + } + } + + foreach ($required in @($DllRelativePath, "include/mpv/client.h")) { + if (-not $seen.Contains($required)) { + throw "libmpv extraction manifest omits required file: $required" + } + } + + $rootPrefixLength = $resolvedRoot.TrimEnd('\', '/').Length + 1 + $actualFiles = @( + Get-ChildItem -LiteralPath $resolvedRoot -File -Recurse | + Where-Object { $_.Name -ne "extraction-manifest.json" } + ) + foreach ($actual in $actualFiles) { + $relative = $actual.FullName.Substring($rootPrefixLength).Replace('\', '/') + if (-not $seen.Contains($relative)) { + throw "Existing libmpv extraction contains an unlisted file: $relative" + } + } + if ($actualFiles.Count -ne $seen.Count) { + throw "Existing libmpv extraction file count does not match its manifest." + } + + return [pscustomobject]@{ + root = $resolvedRoot + dll = Assert-SafeRelativePath ` + -Root $resolvedRoot ` + -RelativePath $DllRelativePath + manifest = $manifestPath + } +} + +$cache = Get-SafeBuildPath -Path $CacheRoot -Label "CacheRoot" +$generatedCmake = [System.IO.Path]::GetFullPath($GeneratedCmakePath) +if (-not $ResolutionPath) { + $ResolutionPath = Join-Path $cache "native-media-resolution.json" +} +$resolutionFile = [System.IO.Path]::GetFullPath($ResolutionPath) +$provenanceFile = (Resolve-Path -LiteralPath $ProvenancePath -ErrorAction Stop).Path +$provenance = Get-Content -LiteralPath $provenanceFile -Raw | + ConvertFrom-Json -ErrorAction Stop + +if ($provenance.schema_version -ne 1) { + throw "Unsupported native dependency provenance schema." +} +if ($provenance.angle.source_url -ne + "https://chromium.googlesource.com/angle/angle.git") { + throw "Refusing non-official ANGLE source URL." +} +if ($provenance.angle.depot_tools_url -ne + "https://chromium.googlesource.com/chromium/tools/depot_tools.git") { + throw "Refusing non-official depot_tools source URL." +} +foreach ($pin in @( + [string] $provenance.angle.source_commit, + [string] $provenance.angle.depot_tools_commit, + [string] $provenance.libmpv.builder_commit, + [string] $provenance.libmpv.mpv_commit +)) { + if ($pin -notmatch '^[0-9a-f]{40}$') { + throw "Native source pins must be full lowercase Git commit hashes." + } +} +if ([string] $provenance.libmpv.license_mode_evidence.redistribution_status -ne + "blocked_pending_transitive_license_inventory") { + throw "libmpv redistribution gate changed without a reviewed schema update." +} + +$angleRoot = (Resolve-Path -LiteralPath $AngleBundleRoot -ErrorAction Stop).Path +$angleManifestPath = Join-Path $angleRoot "native-manifest.json" +$requiredAngleFiles = @($provenance.angle.runtime_files.$Architecture) +$angleResult = Test-NativeMediaBundle ` + -BundleRoot $angleRoot ` + -ManifestPath $angleManifestPath ` + -Architecture $Architecture ` + -ExpectedAngleSourceUrl $provenance.angle.source_url ` + -ExpectedAngleCommit $provenance.angle.source_commit ` + -ExpectedDepotToolsUrl $provenance.angle.depot_tools_url ` + -ExpectedDepotToolsCommit $provenance.angle.depot_tools_commit ` + -RequiredRuntimeFiles $requiredAngleFiles + +$artifact = $provenance.libmpv.artifacts.$Architecture +if (-not $artifact) { + throw "No pinned libmpv artifact exists for $Architecture." +} +if ([string] $artifact.sha256 -notmatch '^[0-9a-fA-F]{64}$') { + throw "Pinned libmpv artifact does not have a valid SHA-256." +} +Assert-ApprovedLibmpvUrl ` + -Url $artifact.url ` + -Release $provenance.libmpv.release ` + -ArchiveName $artifact.archive_name + +$downloadRoot = Join-Path $cache "dl" +New-Item -ItemType Directory -Path $downloadRoot -Force | Out-Null +if ($LibmpvArchivePath) { + $archive = (Resolve-Path -LiteralPath $LibmpvArchivePath -ErrorAction Stop).Path +} +else { + $archive = Join-Path $downloadRoot $artifact.archive_name +} + +if (Test-Path -LiteralPath $archive -PathType Leaf) { + $archiveHash = Get-Sha256Hex -Path $archive + if ($archiveHash -ne ([string] $artifact.sha256).ToLowerInvariant()) { + throw "Existing libmpv archive SHA-256 mismatch. Refusing to delete or replace it: $archive" + } +} +else { + if ($LibmpvArchivePath) { + throw "Explicit libmpv archive does not exist: $LibmpvArchivePath" + } + if ($Offline) { + throw "Offline mode requires the pinned libmpv archive at $archive" + } + + $partial = "$archive.partial-$([guid]::NewGuid().ToString('N'))" + try { + Invoke-WebRequest ` + -Uri $artifact.url ` + -OutFile $partial ` + -UseBasicParsing + $partialHash = Get-Sha256Hex -Path $partial + if ($partialHash -ne ([string] $artifact.sha256).ToLowerInvariant()) { + throw "Downloaded libmpv archive SHA-256 mismatch." + } + Move-Item -LiteralPath $partial -Destination $archive + } + finally { + if (Test-Path -LiteralPath $partial) { + Remove-Item -LiteralPath $partial -Force + } + } +} + +$cmake = (Get-Command cmake -ErrorAction Stop).Source +$archiveEntries = Invoke-CheckedCapture ` + -FilePath $cmake ` + -ArgumentList @("-E", "tar", "tf", $archive) +Assert-SafeArchiveListing -Entries $archiveEntries + +$artifactHash = ([string] $artifact.sha256).ToLowerInvariant() +$libmpvRoot = Join-Path $cache ( + "mpv\$($provenance.libmpv.release)-$($artifactHash.Substring(0, 12))" +) +$libmpvDll = Join-Path $libmpvRoot $artifact.dll_relative_path +$libmpvHeader = Join-Path $libmpvRoot "include\mpv\client.h" + +if (-not (Test-Path -LiteralPath $libmpvRoot -PathType Container)) { + $stage = Join-Path (Split-Path $libmpvRoot -Parent) ( + ".stage-$([guid]::NewGuid().ToString('N'))" + ) + New-Item -ItemType Directory -Path $stage -Force | Out-Null + try { + Invoke-CheckedCapture ` + -FilePath $cmake ` + -ArgumentList @( + "-E", "chdir", $stage, + $cmake, "-E", "tar", "xvf", $archive + ) | + Out-Null + $stagePrefixLength = $stage.TrimEnd('\', '/').Length + 1 + $extractedInventory = @( + Get-ChildItem -LiteralPath $stage -File -Recurse | + Sort-Object FullName | + ForEach-Object { + [pscustomobject]@{ + relative_path = $_.FullName.Substring( + $stagePrefixLength + ).Replace('\', '/') + sha256 = Get-Sha256Hex -Path $_.FullName + } + } + ) + $extractionManifest = [ordered]@{ + schema_version = 1 + architecture = $Architecture + archive_sha256 = $artifactHash + files = $extractedInventory + } + Write-AtomicUtf8NoBom ` + -Path (Join-Path $stage "extraction-manifest.json") ` + -Content ($extractionManifest | ConvertTo-Json -Depth 7) + Test-LibmpvExtraction ` + -Root $stage ` + -Architecture $Architecture ` + -ArchiveSha256 $artifactHash ` + -ExpectedMachine ([string] $artifact.pe_machine) ` + -DllRelativePath ([string] $artifact.dll_relative_path) | + Out-Null + if (Test-Path -LiteralPath $libmpvRoot) { + throw "Refusing to overwrite an existing libmpv extraction: $libmpvRoot" + } + Move-Item -LiteralPath $stage -Destination $libmpvRoot + } + finally { + if (Test-Path -LiteralPath $stage) { + Remove-Item -LiteralPath $stage -Recurse -Force + } + } +} + +$libmpvExtraction = Test-LibmpvExtraction ` + -Root $libmpvRoot ` + -Architecture $Architecture ` + -ArchiveSha256 $artifactHash ` + -ExpectedMachine ([string] $artifact.pe_machine) ` + -DllRelativePath ([string] $artifact.dll_relative_path) +$libmpvDll = $libmpvExtraction.dll + +$expectedMachine = [string] $artifact.pe_machine +$actualMachine = Get-PEMachine -Path $libmpvDll +if ($actualMachine -ne $expectedMachine) { + throw "libmpv PE machine mismatch: got $actualMachine, expected $expectedMachine" +} + +$extractedPeFiles = @( + Get-ChildItem -LiteralPath $libmpvRoot -File -Recurse | + Where-Object { $_.Extension -in @(".dll", ".exe") } +) +if ($extractedPeFiles.Count -ne 1 -or + $extractedPeFiles[0].FullName -ne (Resolve-Path -LiteralPath $libmpvDll).Path) { + throw "libmpv extraction contains an unexpected PE executable or DLL." +} + +$runtimeFiles = [System.Collections.Generic.List[object]]::new() +$runtimeFiles.Add([pscustomobject]@{ + role = "libmpv" + path = (Resolve-Path -LiteralPath $libmpvDll).Path + sha256 = Get-Sha256Hex -Path $libmpvDll + pe_machine = $actualMachine + expected_export = "mpv_client_api_version" +}) + +foreach ($angleFile in @($angleResult.files)) { + $expectedExport = if ($angleFile.relative_path -like "*libEGL.dll") { + "eglGetDisplay" + } + else { + "glGetString" + } + $runtimeFiles.Add([pscustomobject]@{ + role = "angle" + path = $angleFile.path + sha256 = $angleFile.sha256 + pe_machine = $angleFile.pe_machine + expected_export = $expectedExport + }) +} + +$resolution = [ordered]@{ + schema_version = 1 + architecture = $Architecture + generated_at_utc = [DateTime]::UtcNow.ToString("o") + provenance = [ordered]@{ + path = $provenanceFile + sha256 = Get-Sha256Hex -Path $provenanceFile + } + angle = [ordered]@{ + bundle_root = $angleRoot + manifest_path = (Resolve-Path -LiteralPath $angleManifestPath).Path + manifest_sha256 = Get-Sha256Hex -Path $angleManifestPath + source_commit = $provenance.angle.source_commit + depot_tools_commit = $provenance.angle.depot_tools_commit + } + libmpv = [ordered]@{ + archive_path = (Resolve-Path -LiteralPath $archive).Path + archive_url = $artifact.url + archive_sha256 = $artifactHash + extraction_manifest_path = $libmpvExtraction.manifest + extraction_manifest_sha256 = Get-Sha256Hex -Path $libmpvExtraction.manifest + builder_commit = $provenance.libmpv.builder_commit + mpv_commit = $provenance.libmpv.mpv_commit + redistribution_status = $provenance.libmpv.license_mode_evidence.redistribution_status + } + runtime_files = @($runtimeFiles) +} + +Write-AtomicUtf8NoBom ` + -Path $resolutionFile ` + -Content ($resolution | ConvertTo-Json -Depth 10) + +$angleManifest = Get-Content -LiteralPath $angleManifestPath -Raw | + ConvertFrom-Json -ErrorAction Stop +$portableAngleManifestPath = Join-Path $cache "angle-native-manifest.json" +$portableAngleManifest = [ordered]@{ + schema_version = 1 + architecture = $Architecture + source = [ordered]@{ + angle_url = $angleManifest.source.angle_url + angle_commit = $angleManifest.source.angle_commit + depot_tools_url = $angleManifest.source.depot_tools_url + depot_tools_commit = $angleManifest.source.depot_tools_commit + } + build = [ordered]@{ + gn_args = @( + Get-OptionalProperty -InputObject $angleManifest.build -Name "gn_args" + ) + git_version = Get-OptionalProperty ` + -InputObject $angleManifest.build ` + -Name "git_version" + python_version = Get-OptionalProperty ` + -InputObject $angleManifest.build ` + -Name "python_version" + gn_version = Get-OptionalProperty ` + -InputObject $angleManifest.build ` + -Name "gn_version" + ninja_version = Get-OptionalProperty ` + -InputObject $angleManifest.build ` + -Name "ninja_version" + os_version = Get-OptionalProperty ` + -InputObject $angleManifest.build ` + -Name "os_version" + process_architecture = Get-OptionalProperty ` + -InputObject $angleManifest.build ` + -Name "process_architecture" + } + files = @( + $angleManifest.files | + ForEach-Object { + [ordered]@{ + relative_path = $_.relative_path + sha256 = $_.sha256 + pe_machine = $_.pe_machine + origin = $_.origin + } + } + ) + angle_license_sha256 = $angleManifest.angle_license_sha256 + license_inventory_sha256 = $angleManifest.license_inventory_sha256 +} +$portableAngleJson = $portableAngleManifest | ConvertTo-Json -Depth 10 +if ($portableAngleJson -match '(?i)(? arguments) { + if (arguments.length != 2) { + stderr.writeln('Usage: dart smoke_library.dart '); + exitCode = 64; + return; + } + + final libraryPath = File(arguments[0]).absolute.path; + final exportName = arguments[1]; + if (!File(libraryPath).existsSync()) { + stderr.writeln('Native library does not exist: $libraryPath'); + exitCode = 66; + return; + } + + final library = DynamicLibrary.open(libraryPath); + library.lookup>(exportName); + stdout.writeln( + jsonEncode({ + 'result': 'passed', + 'abi': Abi.current().toString(), + 'library': libraryPath, + 'export': exportName, + }), + ); +} diff --git a/packages/media_kit_libs_windows_video/tool/test_native_media_scaffold.ps1 b/packages/media_kit_libs_windows_video/tool/test_native_media_scaffold.ps1 new file mode 100644 index 0000000000..8e44e4fa9a --- /dev/null +++ b/packages/media_kit_libs_windows_video/tool/test_native_media_scaffold.ps1 @@ -0,0 +1,796 @@ +[CmdletBinding()] +param( + [string] $X64LibmpvArchive, + [string] $Arm64LibmpvArchive +) + +$ErrorActionPreference = "Stop" +Set-StrictMode -Version Latest + +$packageRoot = (Resolve-Path (Join-Path $PSScriptRoot "..")).Path +$modulePath = Join-Path $PSScriptRoot "NativeMediaVerification.psm1" +$provenancePath = Join-Path $packageRoot "provenance\native-dependencies.json" +Import-Module $modulePath -Force + +$script:Passed = 0 + +function Write-Utf8NoBom { + param( + [Parameter(Mandatory)][string] $Path, + [Parameter(Mandatory)][string] $Content + ) + New-Item -ItemType Directory -Path (Split-Path $Path -Parent) -Force | + Out-Null + [System.IO.File]::WriteAllText( + $Path, + $Content, + [System.Text.UTF8Encoding]::new($false) + ) +} + +function Assert-True { + param( + [Parameter(Mandatory)][bool] $Condition, + [Parameter(Mandatory)][string] $Message + ) + if (-not $Condition) { + throw "ASSERTION FAILED: $Message" + } + $script:Passed++ +} + +function Assert-Throws { + param( + [Parameter(Mandatory)][scriptblock] $Action, + [Parameter(Mandatory)][string] $MessagePattern + ) + try { + & $Action + } + catch { + if ($_.Exception.Message -notmatch $MessagePattern) { + throw "Expected error matching '$MessagePattern', got: $($_.Exception.Message)" + } + $script:Passed++ + return + } + throw "Expected an error matching '$MessagePattern', but the action succeeded." +} + +function New-FakePe { + param( + [Parameter(Mandatory)][string] $Path, + [Parameter(Mandatory)][ValidateSet("X64", "ARM64")][string] $Machine + ) + + New-Item -ItemType Directory -Path (Split-Path $Path -Parent) -Force | + Out-Null + $bytes = [byte[]]::new(512) + $bytes[0] = 0x4D + $bytes[1] = 0x5A + [BitConverter]::GetBytes([int] 0x80).CopyTo($bytes, 0x3C) + [BitConverter]::GetBytes([uint32] 0x00004550).CopyTo($bytes, 0x80) + $machineCode = if ($Machine -eq "ARM64") { + [uint16] 0xAA64 + } + else { + [uint16] 0x8664 + } + [BitConverter]::GetBytes($machineCode).CopyTo($bytes, 0x84) + [System.IO.File]::WriteAllBytes($Path, $bytes) +} + +function New-SyntheticAngleBundle { + param( + [Parameter(Mandatory)][string] $Root, + [Parameter(Mandatory)][ValidateSet("x64", "arm64")][string] $Architecture, + [Parameter(Mandatory)][object] $Provenance + ) + + $machine = if ($Architecture -eq "arm64") { "ARM64" } else { "X64" } + $runtimeFiles = @($Provenance.angle.runtime_files.$Architecture) + $entries = [System.Collections.Generic.List[object]]::new() + foreach ($relative in $runtimeFiles) { + $path = Join-Path $Root $relative + New-FakePe -Path $path -Machine $machine + $entries.Add([pscustomobject]@{ + relative_path = $relative + sha256 = Get-Sha256Hex -Path $path + pe_machine = $machine + origin = "synthetic test fixture" + }) + } + + $angleLicense = Join-Path $Root "licenses\ANGLE-LICENSE.txt" + $inventory = Join-Path $Root "licenses\license-inventory.json" + $thirdPartyLicense = Join-Path $Root ( + "licenses\source-tree\third_party\synthetic\LICENSE" + ) + $revisions = Join-Path $Root "provenance\gclient-revisions.txt" + $gnArgs = Join-Path $Root "provenance\gn-args.txt" + Write-Utf8NoBom -Path $angleLicense -Content "Synthetic fixture only." + Write-Utf8NoBom -Path $thirdPartyLicense -Content "Synthetic third-party fixture." + $licenseInventory = @( + [pscustomobject]@{ + source_relative_path = "third_party/synthetic/LICENSE" + bundle_relative_path = ( + "licenses/source-tree/third_party/synthetic/LICENSE" + ) + sha256 = Get-Sha256Hex -Path $thirdPartyLicense + } + ) + Write-Utf8NoBom ` + -Path $inventory ` + -Content ($licenseInventory | ConvertTo-Json -Depth 5) + Write-Utf8NoBom -Path $revisions -Content "angle@test" + Write-Utf8NoBom -Path $gnArgs -Content "is_debug=false" + + $manifest = [ordered]@{ + schema_version = 1 + architecture = $Architecture + source = [ordered]@{ + angle_url = $Provenance.angle.source_url + angle_commit = $Provenance.angle.source_commit + depot_tools_url = $Provenance.angle.depot_tools_url + depot_tools_commit = $Provenance.angle.depot_tools_commit + } + build = [ordered]@{ + synthetic_fixture = $true + } + files = @($entries) + angle_license_sha256 = Get-Sha256Hex -Path $angleLicense + license_inventory_sha256 = Get-Sha256Hex -Path $inventory + evidence = [ordered]@{ + gclient_revisions_path = "provenance/gclient-revisions.txt" + gclient_revisions_sha256 = Get-Sha256Hex -Path $revisions + gn_args_path = "provenance/gn-args.txt" + gn_args_sha256 = Get-Sha256Hex -Path $gnArgs + } + } + $manifestPath = Join-Path $Root "native-manifest.json" + Write-Utf8NoBom ` + -Path $manifestPath ` + -Content ($manifest | ConvertTo-Json -Depth 10) + return [pscustomobject]@{ + root = $Root + manifest = $manifestPath + runtime_files = $runtimeFiles + } +} + +function Invoke-BundleValidation { + param( + [Parameter(Mandatory)][object] $Bundle, + [Parameter(Mandatory)][object] $Provenance, + [Parameter(Mandatory)][ValidateSet("x64", "arm64")][string] $Architecture + ) + Test-NativeMediaBundle ` + -BundleRoot $Bundle.root ` + -ManifestPath $Bundle.manifest ` + -Architecture $Architecture ` + -ExpectedAngleSourceUrl $Provenance.angle.source_url ` + -ExpectedAngleCommit $Provenance.angle.source_commit ` + -ExpectedDepotToolsUrl $Provenance.angle.depot_tools_url ` + -ExpectedDepotToolsCommit $Provenance.angle.depot_tools_commit ` + -RequiredRuntimeFiles $Bundle.runtime_files +} + +$testRoot = Join-Path ( + [System.IO.Path]::GetTempPath() +) "openbubbles-native-media-tests-$([guid]::NewGuid().ToString('N'))" +$tempPrefix = [System.IO.Path]::GetFullPath( + [System.IO.Path]::GetTempPath() +).TrimEnd('\', '/') + [System.IO.Path]::DirectorySeparatorChar +$testRootFull = [System.IO.Path]::GetFullPath($testRoot) +if (-not $testRootFull.StartsWith( + $tempPrefix, + [System.StringComparison]::OrdinalIgnoreCase +)) { + throw "Test directory is outside the system temporary directory." +} + +try { + New-Item -ItemType Directory -Path $testRoot -Force | Out-Null + $provenance = Get-Content -LiteralPath $provenancePath -Raw | + ConvertFrom-Json -ErrorAction Stop + + Assert-True ` + -Condition ($provenance.schema_version -eq 1) ` + -Message "provenance schema must remain pinned" + Assert-True ` + -Condition ($provenance.angle.source_url -eq + "https://chromium.googlesource.com/angle/angle.git") ` + -Message "ANGLE must use Google's official source" + Assert-True ` + -Condition ($provenance.angle.depot_tools_url -eq + "https://chromium.googlesource.com/chromium/tools/depot_tools.git") ` + -Message "depot_tools must use Google's official source" + Assert-True ` + -Condition ($provenance.libmpv.license_mode_evidence.redistribution_status -eq + "blocked_pending_transitive_license_inventory") ` + -Message "public redistribution must remain blocked pending license inventory" + Assert-True ` + -Condition (-not $provenance.libmpv.release_audit.builder_recipe.all_transitive_source_revisions_resolved) ` + -Message "release audit must retain the unresolved transitive source-revision gate" + Assert-True ` + -Condition (@($provenance.libmpv.release_audit.archive_inventory.license_or_notice_files).Count -eq 0) ` + -Message "release audit must record that the archives contain no notices" + + $validBundles = @{} + foreach ($architecture in @("x64", "arm64")) { + $bundle = New-SyntheticAngleBundle ` + -Root (Join-Path $testRoot "valid-$architecture") ` + -Architecture $architecture ` + -Provenance $provenance + $validBundles[$architecture] = $bundle + $result = Invoke-BundleValidation ` + -Bundle $bundle ` + -Provenance $provenance ` + -Architecture $architecture + Assert-True ` + -Condition ($result.architecture -eq $architecture) ` + -Message "valid $architecture bundle must pass" + $wrapperResult = & ( + Join-Path $PSScriptRoot "verify_native_media.ps1" + ) ` + -BundleRoot $bundle.root ` + -ManifestPath $bundle.manifest ` + -ProvenancePath $provenancePath ` + -Architecture $architecture | + ConvertFrom-Json + Assert-True ` + -Condition ($wrapperResult.architecture -eq $architecture) ` + -Message "standalone verifier must accept valid $architecture bundle" + } + + $wrongMachine = New-SyntheticAngleBundle ` + -Root (Join-Path $testRoot "wrong-machine") ` + -Architecture "x64" ` + -Provenance $provenance + $wrongFile = Join-Path $wrongMachine.root $wrongMachine.runtime_files[0] + New-FakePe -Path $wrongFile -Machine "ARM64" + $wrongManifest = Get-Content -LiteralPath $wrongMachine.manifest -Raw | + ConvertFrom-Json + $wrongManifest.files[0].sha256 = Get-Sha256Hex -Path $wrongFile + Write-Utf8NoBom ` + -Path $wrongMachine.manifest ` + -Content ($wrongManifest | ConvertTo-Json -Depth 10) + Assert-Throws ` + -Action { + Invoke-BundleValidation ` + -Bundle $wrongMachine ` + -Provenance $provenance ` + -Architecture "x64" + } ` + -MessagePattern "PE machine mismatch" + + $badHash = New-SyntheticAngleBundle ` + -Root (Join-Path $testRoot "bad-hash") ` + -Architecture "x64" ` + -Provenance $provenance + $badHashManifest = Get-Content -LiteralPath $badHash.manifest -Raw | + ConvertFrom-Json + $badHashManifest.files[0].sha256 = "0" * 64 + Write-Utf8NoBom ` + -Path $badHash.manifest ` + -Content ($badHashManifest | ConvertTo-Json -Depth 10) + Assert-Throws ` + -Action { + Invoke-BundleValidation ` + -Bundle $badHash ` + -Provenance $provenance ` + -Architecture "x64" + } ` + -MessagePattern "SHA-256 mismatch" + + $missing = New-SyntheticAngleBundle ` + -Root (Join-Path $testRoot "missing") ` + -Architecture "x64" ` + -Provenance $provenance + Remove-Item -LiteralPath ( + Join-Path $missing.root $missing.runtime_files[0] + ) -Force + Assert-Throws ` + -Action { + Invoke-BundleValidation ` + -Bundle $missing ` + -Provenance $provenance ` + -Architecture "x64" + } ` + -MessagePattern "missing required manifest file" + + $unlisted = New-SyntheticAngleBundle ` + -Root (Join-Path $testRoot "unlisted") ` + -Architecture "x64" ` + -Provenance $provenance + New-FakePe ` + -Path (Join-Path $unlisted.root "bin\opaque.dll") ` + -Machine "X64" + Assert-Throws ` + -Action { + Invoke-BundleValidation ` + -Bundle $unlisted ` + -Provenance $provenance ` + -Architecture "x64" + } ` + -MessagePattern "unlisted PE runtime" + + $unlistedOutsideBin = New-SyntheticAngleBundle ` + -Root (Join-Path $testRoot "unlisted-outside-bin") ` + -Architecture "x64" ` + -Provenance $provenance + New-FakePe ` + -Path (Join-Path $unlistedOutsideBin.root ( + "licenses\source-tree\third_party\synthetic\opaque.exe" + )) ` + -Machine "X64" + Assert-Throws ` + -Action { + Invoke-BundleValidation ` + -Bundle $unlistedOutsideBin ` + -Provenance $provenance ` + -Architecture "x64" + } ` + -MessagePattern "unlisted PE runtime" + + $listedExtra = New-SyntheticAngleBundle ` + -Root (Join-Path $testRoot "listed-extra") ` + -Architecture "x64" ` + -Provenance $provenance + $listedExtraPath = Join-Path $listedExtra.root "bin\opaque.dll" + New-FakePe -Path $listedExtraPath -Machine "X64" + $listedExtraManifest = Get-Content ` + -LiteralPath $listedExtra.manifest ` + -Raw | + ConvertFrom-Json + $listedExtraManifest.files = @($listedExtraManifest.files) + @( + [pscustomobject]@{ + relative_path = "bin/opaque.dll" + sha256 = Get-Sha256Hex -Path $listedExtraPath + pe_machine = "X64" + origin = "synthetic unreviewed fixture" + } + ) + Write-Utf8NoBom ` + -Path $listedExtra.manifest ` + -Content ($listedExtraManifest | ConvertTo-Json -Depth 10) + Assert-Throws ` + -Action { + Invoke-BundleValidation ` + -Bundle $listedExtra ` + -Provenance $provenance ` + -Architecture "x64" + } ` + -MessagePattern "unexpected runtime file" + + $badEvidence = New-SyntheticAngleBundle ` + -Root (Join-Path $testRoot "bad-evidence") ` + -Architecture "x64" ` + -Provenance $provenance + Add-Content -LiteralPath ( + Join-Path $badEvidence.root "provenance\gn-args.txt" + ) -Value "tampered" + Assert-Throws ` + -Action { + Invoke-BundleValidation ` + -Bundle $badEvidence ` + -Provenance $provenance ` + -Architecture "x64" + } ` + -MessagePattern "evidence hash mismatch" + + $badLicense = New-SyntheticAngleBundle ` + -Root (Join-Path $testRoot "bad-license") ` + -Architecture "x64" ` + -Provenance $provenance + Add-Content -LiteralPath ( + Join-Path $badLicense.root ( + "licenses\source-tree\third_party\synthetic\LICENSE" + ) + ) -Value "tampered" + Assert-Throws ` + -Action { + Invoke-BundleValidation ` + -Bundle $badLicense ` + -Provenance $provenance ` + -Architecture "x64" + } ` + -MessagePattern "third-party license hash mismatch" + + Assert-Throws ` + -Action { + Assert-SafeRelativePath ` + -Root $testRoot ` + -RelativePath "..\escape.dll" + } ` + -MessagePattern "escapes" + + $prohibitedBinaries = @( + Get-ChildItem -LiteralPath $packageRoot -File -Recurse | + Where-Object { + $_.Extension.ToLowerInvariant() -in @( + ".dll", ".exe", ".7z", ".zip", ".lib" + ) + } + ) + Assert-True ` + -Condition ($prohibitedBinaries.Count -eq 0) ` + -Message "no native binaries or archives may be committed in the package" + + $textFiles = @( + Get-ChildItem -LiteralPath $packageRoot -File -Recurse | + Where-Object { + $_.Extension.ToLowerInvariant() -in @( + ".md", ".json", ".yaml", ".yml", ".txt", + ".ps1", ".psm1", ".cmake" + ) -or $_.Name -eq "CMakeLists.txt" + } + ) + $prohibitedPattern = @( + ("alex" + "mercerind"), + ("file\s*\(\s*M" + "D5"), + ("LIBMPV_M" + "D5"), + ("ANGLE_M" + "D5") + ) -join "|" + $prohibitedText = @( + $textFiles | + Select-String -Pattern $prohibitedPattern + ) + Assert-True ` + -Condition ($prohibitedText.Count -eq 0) ` + -Message "opaque ANGLE URLs and MD5 verification must not return" + + $powershellFiles = @( + Get-ChildItem -LiteralPath $PSScriptRoot -File | + Where-Object { $_.Extension -in @(".ps1", ".psm1") } + ) + foreach ($file in $powershellFiles) { + $tokens = $null + $errors = $null + [System.Management.Automation.Language.Parser]::ParseFile( + $file.FullName, + [ref] $tokens, + [ref] $errors + ) | Out-Null + Assert-True ` + -Condition ($errors.Count -eq 0) ` + -Message "$($file.Name) must parse without PowerShell errors" + } + + foreach ($architecture in @("x64", "arm64")) { + $planOutput = & ( + Join-Path $PSScriptRoot "build_official_angle.ps1" + ) ` + -Architecture $architecture ` + -WorkRoot (Join-Path $testRoot "plan-work-$architecture") ` + -OutputRoot (Join-Path $testRoot "plan-output-$architecture") ` + -ValidateOnly + if ($LASTEXITCODE -ne 0) { + throw "ANGLE build plan validation failed for $architecture." + } + $plan = ($planOutput | Out-String) | ConvertFrom-Json + Assert-True ` + -Condition ($plan.architecture -eq $architecture) ` + -Message "ANGLE build plan must resolve $architecture" + } + + $integrationArchives = @{ + x64 = $X64LibmpvArchive + arm64 = $Arm64LibmpvArchive + } + foreach ($architecture in @("x64", "arm64")) { + $integrationArchive = $integrationArchives[$architecture] + if (-not $integrationArchive) { + continue + } + $archiveEntries = @( + & cmake -E tar tf $integrationArchive | + ForEach-Object { ([string] $_).Trim().Replace('\', '/') } | + Where-Object { -not [string]::IsNullOrWhiteSpace($_) } + ) + $expectedEntryCount = if ($architecture -eq "x64") { + [int] $provenance.libmpv.release_audit.archive_inventory.x64_entry_count + } + else { + [int] $provenance.libmpv.release_audit.archive_inventory.arm64_entry_count + } + Assert-True ` + -Condition ($archiveEntries.Count -eq $expectedEntryCount) ` + -Message "$architecture archive entry count must match the reviewed inventory" + $archiveNoticeFiles = @( + $archiveEntries | + Where-Object { + $_ -match '(?i)(^|/)(license|copying|notice)(?:[._-].*)?$' + } + ) + Assert-True ` + -Condition ($archiveNoticeFiles.Count -eq 0) ` + -Message "$architecture archive must not silently gain or lose unreviewed notices" + $integrationRoot = Join-Path $testRoot "resolver-$architecture" + $generatedCmake = Join-Path $integrationRoot "native-media.cmake" + $resolutionPath = Join-Path $integrationRoot "resolution.json" + $prepareOutput = & ( + Join-Path $PSScriptRoot "prepare_native_media.ps1" + ) ` + -Architecture $architecture ` + -AngleBundleRoot $validBundles[$architecture].root ` + -CacheRoot (Join-Path $integrationRoot "cache") ` + -GeneratedCmakePath $generatedCmake ` + -ResolutionPath $resolutionPath ` + -LibmpvArchivePath $integrationArchive ` + -Offline + if ($LASTEXITCODE -ne 0) { + throw "Native resolver integration failed for $architecture." + } + $prepareOutput | Out-Null + $resolution = Get-Content -LiteralPath $resolutionPath -Raw | + ConvertFrom-Json + Assert-True ` + -Condition ($resolution.architecture -eq $architecture) ` + -Message "resolver must preserve $architecture" + Assert-True ` + -Condition (@($resolution.runtime_files).Count -eq 3) ` + -Message "resolver must emit libmpv and two ANGLE runtimes" + Assert-True ` + -Condition (Test-Path -LiteralPath $generatedCmake -PathType Leaf) ` + -Message "resolver must emit CMake input" + $portableEvidencePath = Join-Path ( + Join-Path $integrationRoot "cache" + ) "native-media-package-evidence.json" + $portableAnglePath = Join-Path ( + Join-Path $integrationRoot "cache" + ) "angle-native-manifest.json" + Assert-True ` + -Condition (Test-Path -LiteralPath $portableEvidencePath -PathType Leaf) ` + -Message "resolver must emit portable package evidence" + Assert-True ` + -Condition (Test-Path -LiteralPath $portableAnglePath -PathType Leaf) ` + -Message "resolver must emit a portable ANGLE manifest" + $portableEvidenceRaw = Get-Content -LiteralPath $portableEvidencePath -Raw + $portableAngleRaw = Get-Content -LiteralPath $portableAnglePath -Raw + Assert-True ` + -Condition (-not $portableEvidenceRaw.Contains($integrationRoot)) ` + -Message "portable package evidence must omit local cache paths" + Assert-True ` + -Condition (-not $portableAngleRaw.Contains($integrationRoot)) ` + -Message "portable ANGLE evidence must omit local cache paths" + $portableEvidence = $portableEvidenceRaw | ConvertFrom-Json + Assert-True ` + -Condition ($portableEvidence.architecture -eq $architecture) ` + -Message "portable evidence must preserve $architecture" + Assert-True ` + -Condition (@($portableEvidence.runtime_files).Count -eq 3) ` + -Message "portable evidence must inventory all three runtime DLLs" + Assert-True ` + -Condition (-not $portableEvidence.release_gate.public_redistribution_allowed) ` + -Message "portable evidence must retain the public release gate" + Assert-True ` + -Condition ($portableEvidence.libmpv.redistribution_status -eq + "blocked_pending_transitive_license_inventory") ` + -Message "portable evidence must retain the libmpv license blocker" + $generatedCmakeText = Get-Content -LiteralPath $generatedCmake -Raw + foreach ($requiredVariable in @( + "MEDIA_KIT_NATIVE_MEDIA_PACKAGE_EVIDENCE", + "MEDIA_KIT_NATIVE_MEDIA_ANGLE_MANIFEST", + "MEDIA_KIT_NATIVE_MEDIA_LIBMPV_MANIFEST" + )) { + Assert-True ` + -Condition $generatedCmakeText.Contains($requiredVariable) ` + -Message "generated CMake must expose $requiredVariable" + } + & (Join-Path $PSScriptRoot "prepare_native_media.ps1") ` + -Architecture $architecture ` + -AngleBundleRoot $validBundles[$architecture].root ` + -CacheRoot (Join-Path $integrationRoot "cache") ` + -GeneratedCmakePath $generatedCmake ` + -ResolutionPath $resolutionPath ` + -LibmpvArchivePath $integrationArchive ` + -Offline | + Out-Null + Assert-True ` + -Condition ($LASTEXITCODE -eq 0) ` + -Message "resolver cache reuse must be idempotent for $architecture" + + $cmakeSource = Join-Path $integrationRoot "cmake-source" + $cmakeBuild = Join-Path $integrationRoot "cmake-build" + $fakeFlutter = Join-Path $cmakeSource "fake-flutter" + Write-Utf8NoBom ` + -Path (Join-Path $fakeFlutter "flutter_plugin_registrar.h") ` + -Content @" +#ifndef FLUTTER_PLUGIN_REGISTRAR_H_ +#define FLUTTER_PLUGIN_REGISTRAR_H_ +typedef void* FlutterDesktopPluginRegistrarRef; +#endif +"@ + Write-Utf8NoBom ` + -Path (Join-Path $fakeFlutter "flutter/plugin_registrar_windows.h") ` + -Content @" +#ifndef FLUTTER_PLUGIN_REGISTRAR_WINDOWS_H_ +#define FLUTTER_PLUGIN_REGISTRAR_WINDOWS_H_ +#include "../flutter_plugin_registrar.h" +#endif +"@ + $windowsPackage = ( + Join-Path $packageRoot "windows" + ).Replace('\', '/') + $fakeFlutterForCmake = $fakeFlutter.Replace('\', '/') + $angleForCmake = $validBundles[$architecture].root.Replace('\', '/') + $archiveForCmake = ( + Resolve-Path -LiteralPath $integrationArchive + ).Path.Replace('\', '/') + $fixture = @" +cmake_minimum_required(VERSION 3.14) +project(openbubbles_native_media_configure_smoke LANGUAGES CXX) +function(apply_standard_settings target) +endfunction() +add_library(flutter INTERFACE) +add_library(flutter_wrapper_plugin INTERFACE) +target_include_directories(flutter INTERFACE "$fakeFlutterForCmake") +set(MEDIA_KIT_OFFICIAL_ANGLE_ROOT "$angleForCmake" CACHE PATH "" FORCE) +set(MEDIA_KIT_LIBMPV_ARCHIVE "$archiveForCmake" CACHE FILEPATH "" FORCE) +set(MEDIA_KIT_NATIVE_MEDIA_OFFLINE ON CACHE BOOL "" FORCE) +add_subdirectory("$windowsPackage" media_kit_native) +install( + FILES `${media_kit_libs_windows_video_bundled_libraries} + DESTINATION bundle +) +install( + FILES `${media_kit_libs_windows_video_portable_evidence_files} + DESTINATION bundle/data/native-media +) +install( + DIRECTORY "`${media_kit_libs_windows_video_angle_license_directory}/" + DESTINATION bundle/data/native-media/angle-licenses +) +"@ + Write-Utf8NoBom ` + -Path (Join-Path $cmakeSource "CMakeLists.txt") ` + -Content $fixture + $vsArchitecture = if ($architecture -eq "arm64") { "ARM64" } else { "x64" } + $cmakeCapabilities = (& cmake -E capabilities | Out-String) | + ConvertFrom-Json + $vsGenerator = @( + $cmakeCapabilities.generators | + Where-Object { + $_.platformSupport -and + $_.name -match '^Visual Studio ([0-9]+) [0-9]+$' + } | + ForEach-Object { + [pscustomobject]@{ + name = $_.name + major = [int] ( + [regex]::Match( + $_.name, + '^Visual Studio ([0-9]+)' + ).Groups[1].Value + ) + } + } | + Sort-Object major -Descending + )[0] + if (-not $vsGenerator) { + throw "No platform-capable Visual Studio CMake generator is installed." + } + $cmakeOutput = & cmake ` + -S $cmakeSource ` + -B $cmakeBuild ` + -G $vsGenerator.name ` + -A $vsArchitecture 2>&1 + if ($LASTEXITCODE -ne 0) { + throw "CMake configure smoke failed for ${architecture}:`n$($cmakeOutput | Out-String)" + } + Assert-True ` + -Condition (Test-Path -LiteralPath ( + Join-Path $cmakeBuild "CMakeCache.txt" + )) ` + -Message "CMake must configure the $architecture package" + + $buildOutput = & cmake ` + --build $cmakeBuild ` + --config Release ` + --target media_kit_libs_windows_video_plugin 2>&1 + if ($LASTEXITCODE -ne 0) { + throw "CMake plugin build failed for ${architecture}:`n$($buildOutput | Out-String)" + } + $pluginDlls = @( + Get-ChildItem -LiteralPath $cmakeBuild -Recurse -File ` + -Filter "media_kit_libs_windows_video_plugin.dll" + ) + Assert-True ` + -Condition ($pluginDlls.Count -eq 1) ` + -Message "CMake must produce one $architecture registration DLL" + $expectedPluginMachine = if ($architecture -eq "arm64") { + "ARM64" + } + else { + "X64" + } + Assert-True ` + -Condition ((Get-PEMachine -Path $pluginDlls[0].FullName) -eq + $expectedPluginMachine) ` + -Message "registration DLL must target $expectedPluginMachine" + + $installRoot = Join-Path $integrationRoot "cmake-install" + $installOutput = & cmake ` + --install $cmakeBuild ` + --config Release ` + --prefix $installRoot 2>&1 + if ($LASTEXITCODE -ne 0) { + throw "CMake package install failed for ${architecture}:`n$($installOutput | Out-String)" + } + $installedBundle = Join-Path $installRoot "bundle" + foreach ($runtimeName in @( + "libmpv-2.dll", + "libEGL.dll", + "libGLESv2.dll" + )) { + $installedRuntime = Join-Path $installedBundle $runtimeName + Assert-True ` + -Condition (Test-Path -LiteralPath $installedRuntime -PathType Leaf) ` + -Message "CMake install must package $runtimeName for $architecture" + Assert-True ` + -Condition ((Get-PEMachine -Path $installedRuntime) -eq + $expectedPluginMachine) ` + -Message "installed $runtimeName must target $expectedPluginMachine" + } + $installedEvidence = Join-Path $installedBundle "data\native-media" + foreach ($evidenceName in @( + "native-media-package-evidence.json", + "angle-native-manifest.json", + "extraction-manifest.json", + "native-dependencies.json", + "THIRD_PARTY_NOTICES.md", + "angle-licenses\ANGLE-LICENSE.txt", + "angle-licenses\license-inventory.json" + )) { + Assert-True ` + -Condition (Test-Path -LiteralPath ( + Join-Path $installedEvidence $evidenceName + ) -PathType Leaf) ` + -Message "CMake install must package $evidenceName" + } + $installedPortableEvidence = Get-Content -LiteralPath ( + Join-Path $installedEvidence "native-media-package-evidence.json" + ) -Raw + Assert-True ` + -Condition (-not $installedPortableEvidence.Contains($integrationRoot)) ` + -Message "installed evidence must not expose the local build path" + + $cachedLibmpv = @( + $resolution.runtime_files | + Where-Object { $_.role -eq "libmpv" } + )[0].path + $tamperStream = [System.IO.File]::OpenWrite($cachedLibmpv) + try { + $tamperStream.Position = $tamperStream.Length + $tamperStream.WriteByte(0x00) + } + finally { + $tamperStream.Dispose() + } + Assert-Throws ` + -Action { + & (Join-Path $PSScriptRoot "prepare_native_media.ps1") ` + -Architecture $architecture ` + -AngleBundleRoot $validBundles[$architecture].root ` + -CacheRoot (Join-Path $integrationRoot "cache") ` + -GeneratedCmakePath $generatedCmake ` + -ResolutionPath $resolutionPath ` + -LibmpvArchivePath $integrationArchive ` + -Offline | + Out-Null + } ` + -MessagePattern "extraction hash mismatch" + } +} +finally { + if (Test-Path -LiteralPath $testRootFull) { + Remove-Item -LiteralPath $testRootFull -Recurse -Force + } +} + +[pscustomobject]@{ + result = "passed" + assertions = $script:Passed + package_root = $packageRoot +} | ConvertTo-Json -Depth 4 diff --git a/packages/media_kit_libs_windows_video/tool/verify_native_media.ps1 b/packages/media_kit_libs_windows_video/tool/verify_native_media.ps1 new file mode 100644 index 0000000000..e88347a37c --- /dev/null +++ b/packages/media_kit_libs_windows_video/tool/verify_native_media.ps1 @@ -0,0 +1,78 @@ +[CmdletBinding(DefaultParameterSetName = "Bundle")] +param( + [Parameter(Mandatory, ParameterSetName = "Bundle")] + [string] $BundleRoot, + + [Parameter(Mandatory, ParameterSetName = "Bundle")] + [string] $ManifestPath, + + [Parameter(Mandatory, ParameterSetName = "Bundle")] + [string] $ProvenancePath, + + [Parameter(Mandatory, ParameterSetName = "Files")] + [string[]] $File, + + [Parameter(Mandatory)] + [ValidateSet("x64", "arm64")] + [string] $Architecture +) + +$ErrorActionPreference = "Stop" +Set-StrictMode -Version Latest + +Import-Module (Join-Path $PSScriptRoot "NativeMediaVerification.psm1") -Force + +if ($PSCmdlet.ParameterSetName -eq "Files") { + $expectedMachine = if ($Architecture -eq "arm64") { "ARM64" } else { "X64" } + $files = foreach ($item in $File) { + $resolved = (Resolve-Path -LiteralPath $item -ErrorAction Stop).Path + $machine = Get-PEMachine -Path $resolved + if ($machine -ne $expectedMachine) { + throw "PE machine mismatch for ${resolved}: got $machine, expected $expectedMachine" + } + [pscustomobject]@{ + path = $resolved + pe_machine = $machine + sha256 = Get-Sha256Hex -Path $resolved + } + } + + [pscustomobject]@{ + architecture = $Architecture + files = @($files) + } | ConvertTo-Json -Depth 5 -Compress + exit 0 +} + +$provenance = Get-Content -LiteralPath $ProvenancePath -Raw | + ConvertFrom-Json -ErrorAction Stop +if ($provenance.schema_version -ne 1) { + throw "Unsupported native dependency provenance schema." +} +if ($provenance.angle.source_url -ne + "https://chromium.googlesource.com/angle/angle.git" -or + $provenance.angle.depot_tools_url -ne + "https://chromium.googlesource.com/chromium/tools/depot_tools.git") { + throw "Standalone verification refuses non-official ANGLE build sources." +} +foreach ($pin in @( + [string] $provenance.angle.source_commit, + [string] $provenance.angle.depot_tools_commit +)) { + if ($pin -notmatch '^[0-9a-f]{40}$') { + throw "Official source pins must be full lowercase Git commit hashes." + } +} +$required = @($provenance.angle.runtime_files.$Architecture) + +$result = Test-NativeMediaBundle ` + -BundleRoot $BundleRoot ` + -ManifestPath $ManifestPath ` + -Architecture $Architecture ` + -ExpectedAngleSourceUrl $provenance.angle.source_url ` + -ExpectedAngleCommit $provenance.angle.source_commit ` + -ExpectedDepotToolsUrl $provenance.angle.depot_tools_url ` + -ExpectedDepotToolsCommit $provenance.angle.depot_tools_commit ` + -RequiredRuntimeFiles $required + +$result | ConvertTo-Json -Depth 7 -Compress diff --git a/packages/media_kit_libs_windows_video/windows/CMakeLists.txt b/packages/media_kit_libs_windows_video/windows/CMakeLists.txt new file mode 100644 index 0000000000..f7d7810a29 --- /dev/null +++ b/packages/media_kit_libs_windows_video/windows/CMakeLists.txt @@ -0,0 +1,215 @@ +# This file is a part of media_kit (https://github.com/media-kit/media-kit). +# The OpenBubbles fork replaces opaque native downloads with pinned, +# independently verified native inputs. + +cmake_minimum_required(VERSION 3.14) + +option(MEDIA_KIT_LIBS_AVAILABLE "package:media_kit libraries are available." ON) +option( + MEDIA_KIT_NATIVE_MEDIA_OFFLINE + "Refuse network access while resolving the pinned libmpv archive." + OFF +) + +set(PROJECT_NAME "media_kit_libs_windows_video") +project(${PROJECT_NAME} LANGUAGES CXX) + +add_compile_definitions(_DISABLE_CONSTEXPR_MUTEX_CONSTRUCTOR) + +if( + CMAKE_GENERATOR_PLATFORM STREQUAL "ARM64" + OR CMAKE_VS_PLATFORM_NAME STREQUAL "ARM64" + OR CMAKE_SYSTEM_PROCESSOR MATCHES "^(ARM64|arm64|aarch64)$" +) + set(MEDIA_KIT_NATIVE_ARCH "arm64") +elseif( + CMAKE_GENERATOR_PLATFORM STREQUAL "x64" + OR CMAKE_VS_PLATFORM_NAME STREQUAL "x64" + OR CMAKE_SYSTEM_PROCESSOR MATCHES "^(AMD64|amd64|x86_64|X86_64)$" +) + set(MEDIA_KIT_NATIVE_ARCH "x64") +else() + message( + FATAL_ERROR + "media_kit_libs_windows_video supports only Windows x64 and ARM64. " + "Generator platform='${CMAKE_GENERATOR_PLATFORM}', " + "VS platform='${CMAKE_VS_PLATFORM_NAME}', " + "system processor='${CMAKE_SYSTEM_PROCESSOR}'." + ) +endif() + +set( + MEDIA_KIT_OFFICIAL_ANGLE_ROOT + "" + CACHE PATH + "Path to a verified official-source ANGLE bundle." +) +set( + MEDIA_KIT_LIBMPV_ARCHIVE + "" + CACHE FILEPATH + "Optional offline path to the pinned libmpv archive." +) +if(NOT MEDIA_KIT_LIBMPV_ARCHIVE AND DEFINED ENV{MEDIA_KIT_LIBMPV_ARCHIVE}) + set(MEDIA_KIT_LIBMPV_ARCHIVE "$ENV{MEDIA_KIT_LIBMPV_ARCHIVE}") +endif() + +if(NOT MEDIA_KIT_OFFICIAL_ANGLE_ROOT) + if(DEFINED ENV{MEDIA_KIT_OFFICIAL_ANGLE_ROOT}) + set(MEDIA_KIT_OFFICIAL_ANGLE_ROOT "$ENV{MEDIA_KIT_OFFICIAL_ANGLE_ROOT}") + else() + set( + MEDIA_KIT_OFFICIAL_ANGLE_ROOT + "${CMAKE_CURRENT_SOURCE_DIR}/native/${MEDIA_KIT_NATIVE_ARCH}/angle" + ) + endif() +endif() + +find_program(MEDIA_KIT_POWERSHELL NAMES pwsh REQUIRED) +set( + MEDIA_KIT_NATIVE_CACHE + "${CMAKE_BINARY_DIR}/obnm/${MEDIA_KIT_NATIVE_ARCH}" +) +set( + MEDIA_KIT_GENERATED_CMAKE + "${MEDIA_KIT_NATIVE_CACHE}/native-media.cmake" +) +set( + MEDIA_KIT_RESOLUTION_JSON + "${MEDIA_KIT_NATIVE_CACHE}/native-media-resolution.json" +) + +set( + MEDIA_KIT_PREPARE_COMMAND + "${MEDIA_KIT_POWERSHELL}" + -NoLogo + -NoProfile + -NonInteractive + -ExecutionPolicy + Bypass + -File + "${CMAKE_CURRENT_SOURCE_DIR}/../tool/prepare_native_media.ps1" + -Architecture + "${MEDIA_KIT_NATIVE_ARCH}" + -AngleBundleRoot + "${MEDIA_KIT_OFFICIAL_ANGLE_ROOT}" + -CacheRoot + "${MEDIA_KIT_NATIVE_CACHE}" + -GeneratedCmakePath + "${MEDIA_KIT_GENERATED_CMAKE}" + -ResolutionPath + "${MEDIA_KIT_RESOLUTION_JSON}" +) +if(MEDIA_KIT_LIBMPV_ARCHIVE) + list( + APPEND MEDIA_KIT_PREPARE_COMMAND + -LibmpvArchivePath + "${MEDIA_KIT_LIBMPV_ARCHIVE}" + ) +endif() +if(MEDIA_KIT_NATIVE_MEDIA_OFFLINE) + list(APPEND MEDIA_KIT_PREPARE_COMMAND -Offline) +endif() + +execute_process( + COMMAND ${MEDIA_KIT_PREPARE_COMMAND} + RESULT_VARIABLE MEDIA_KIT_PREPARE_RESULT + OUTPUT_VARIABLE MEDIA_KIT_PREPARE_OUTPUT + ERROR_VARIABLE MEDIA_KIT_PREPARE_ERROR + COMMAND_ECHO STDOUT +) +if(NOT MEDIA_KIT_PREPARE_RESULT EQUAL 0) + message( + FATAL_ERROR + "Native media verification failed closed.\n" + "stdout:\n${MEDIA_KIT_PREPARE_OUTPUT}\n" + "stderr:\n${MEDIA_KIT_PREPARE_ERROR}" + ) +endif() +if(NOT EXISTS "${MEDIA_KIT_GENERATED_CMAKE}") + message(FATAL_ERROR "Native media verifier did not generate its CMake input.") +endif() +include("${MEDIA_KIT_GENERATED_CMAKE}") + +set( + MEDIA_KIT_NATIVE_MEDIA_PROVENANCE + "${CMAKE_CURRENT_SOURCE_DIR}/../provenance/native-dependencies.json" +) +set( + MEDIA_KIT_NATIVE_MEDIA_NOTICES + "${CMAKE_CURRENT_SOURCE_DIR}/../THIRD_PARTY_NOTICES.md" +) +set( + MEDIA_KIT_NATIVE_MEDIA_ANGLE_LICENSES + "${MEDIA_KIT_OFFICIAL_ANGLE_ROOT}/licenses" +) +set( + MEDIA_KIT_NATIVE_MEDIA_PORTABLE_EVIDENCE_FILES + "${MEDIA_KIT_NATIVE_MEDIA_PACKAGE_EVIDENCE}" + "${MEDIA_KIT_NATIVE_MEDIA_ANGLE_MANIFEST}" + "${MEDIA_KIT_NATIVE_MEDIA_LIBMPV_MANIFEST}" + "${MEDIA_KIT_NATIVE_MEDIA_PROVENANCE}" + "${MEDIA_KIT_NATIVE_MEDIA_NOTICES}" +) +foreach( + MEDIA_KIT_NATIVE_MEDIA_REQUIRED_FILE + IN LISTS MEDIA_KIT_NATIVE_MEDIA_PORTABLE_EVIDENCE_FILES +) + if(NOT EXISTS "${MEDIA_KIT_NATIVE_MEDIA_REQUIRED_FILE}") + message( + FATAL_ERROR + "Required native-media package evidence is missing: " + "${MEDIA_KIT_NATIVE_MEDIA_REQUIRED_FILE}" + ) + endif() +endforeach() +if(NOT IS_DIRECTORY "${MEDIA_KIT_NATIVE_MEDIA_ANGLE_LICENSES}") + message( + FATAL_ERROR + "Required ANGLE license inventory is missing: " + "${MEDIA_KIT_NATIVE_MEDIA_ANGLE_LICENSES}" + ) +endif() + +set(PLUGIN_NAME "media_kit_libs_windows_video_plugin") +add_library( + ${PLUGIN_NAME} + SHARED + "include/media_kit_libs_windows_video/media_kit_libs_windows_video_plugin_c_api.h" + "media_kit_libs_windows_video_plugin_c_api.cpp" +) + +apply_standard_settings(${PLUGIN_NAME}) +set_target_properties( + ${PLUGIN_NAME} + PROPERTIES + CXX_VISIBILITY_PRESET hidden +) +target_compile_definitions(${PLUGIN_NAME} PRIVATE FLUTTER_PLUGIN_IMPL) +target_include_directories( + ${PLUGIN_NAME} + INTERFACE "${CMAKE_CURRENT_SOURCE_DIR}/include" +) +target_link_libraries( + ${PLUGIN_NAME} + PRIVATE + flutter + flutter_wrapper_plugin +) + +set( + media_kit_libs_windows_video_bundled_libraries + "${MEDIA_KIT_LIBMPV_DLL}" + ${MEDIA_KIT_ANGLE_RUNTIME_LIBRARIES} + PARENT_SCOPE +) +set( + media_kit_libs_windows_video_portable_evidence_files + ${MEDIA_KIT_NATIVE_MEDIA_PORTABLE_EVIDENCE_FILES} + PARENT_SCOPE +) +set( + media_kit_libs_windows_video_angle_license_directory + "${MEDIA_KIT_NATIVE_MEDIA_ANGLE_LICENSES}" + PARENT_SCOPE +) diff --git a/packages/media_kit_libs_windows_video/windows/include/media_kit_libs_windows_video/media_kit_libs_windows_video_plugin_c_api.h b/packages/media_kit_libs_windows_video/windows/include/media_kit_libs_windows_video/media_kit_libs_windows_video_plugin_c_api.h new file mode 100644 index 0000000000..76a2521024 --- /dev/null +++ b/packages/media_kit_libs_windows_video/windows/include/media_kit_libs_windows_video/media_kit_libs_windows_video_plugin_c_api.h @@ -0,0 +1,24 @@ +#ifndef FLUTTER_PLUGIN_MEDIA_KIT_LIBS_WINDOWS_VIDEO_PLUGIN_C_API_H_ +#define FLUTTER_PLUGIN_MEDIA_KIT_LIBS_WINDOWS_VIDEO_PLUGIN_C_API_H_ + +#include + +#ifdef FLUTTER_PLUGIN_IMPL +#define FLUTTER_PLUGIN_EXPORT __declspec(dllexport) +#else +#define FLUTTER_PLUGIN_EXPORT __declspec(dllimport) +#endif + +#if defined(__cplusplus) +extern "C" { +#endif + +FLUTTER_PLUGIN_EXPORT void +MediaKitLibsWindowsVideoPluginCApiRegisterWithRegistrar( + FlutterDesktopPluginRegistrarRef registrar); + +#if defined(__cplusplus) +} // extern "C" +#endif + +#endif // FLUTTER_PLUGIN_MEDIA_KIT_LIBS_WINDOWS_VIDEO_PLUGIN_C_API_H_ diff --git a/packages/media_kit_libs_windows_video/windows/media_kit_libs_windows_video_plugin_c_api.cpp b/packages/media_kit_libs_windows_video/windows/media_kit_libs_windows_video_plugin_c_api.cpp new file mode 100644 index 0000000000..37b3b7d03b --- /dev/null +++ b/packages/media_kit_libs_windows_video/windows/media_kit_libs_windows_video_plugin_c_api.cpp @@ -0,0 +1,9 @@ +#include "include/media_kit_libs_windows_video/media_kit_libs_windows_video_plugin_c_api.h" + +#include + +#include + +void MediaKitLibsWindowsVideoPluginCApiRegisterWithRegistrar(FlutterDesktopPluginRegistrarRef registrar) { + std::cout << "package:media_kit_libs_windows_video registered." << std::endl; +} diff --git a/packages/media_kit_libs_windows_video/windows/native/.gitignore b/packages/media_kit_libs_windows_video/windows/native/.gitignore new file mode 100644 index 0000000000..7c9d611b59 --- /dev/null +++ b/packages/media_kit_libs_windows_video/windows/native/.gitignore @@ -0,0 +1,3 @@ +* +!.gitignore +!README.md diff --git a/packages/media_kit_libs_windows_video/windows/native/README.md b/packages/media_kit_libs_windows_video/windows/native/README.md new file mode 100644 index 0000000000..2ed4b3f5c5 --- /dev/null +++ b/packages/media_kit_libs_windows_video/windows/native/README.md @@ -0,0 +1,19 @@ +# Generated native inputs + +No native executable, DLL, archive, or generated manifest belongs in Git. + +`tool/build_official_angle.ps1` creates an architecture-specific `angle` +directory here for local integration. The committed provenance pins and +verification scripts determine whether CMake accepts it. CI builds the same +bundle from official source and publishes a short-lived artifact with build +attestation. + +Expected local paths: + +```text +native/ + arm64/angle/ + x64/angle/ +``` + +The `.gitignore` intentionally blocks everything except this explanation. diff --git a/pubspec.lock b/pubspec.lock index 84d939bcc5..d8ad15bc35 100644 --- a/pubspec.lock +++ b/pubspec.lock @@ -13,15 +13,10 @@ packages: dependency: transitive description: name: _fe_analyzer_shared - sha256: f256b0c0ba6c7577c15e2e4e114755640a875e885099367bf6e012b19314c834 + sha256: "3b19a47f6ea7c2632760777c78174f47f6aec1e05f0cd611380d4593b8af1dbc" url: "https://pub.dev" source: hosted - version: "72.0.0" - _macros: - dependency: transitive - description: dart - source: sdk - version: "0.3.2" + version: "96.0.0" adaptive_theme: dependency: "direct main" description: @@ -34,10 +29,10 @@ packages: dependency: transitive description: name: analyzer - sha256: b652861553cd3990d8ed361f7979dc6d7053a9ac8843fa73820ab68ce5410139 + sha256: "0c516bc4ad36a1a75759e54d5047cb9d15cded4459df01aa35a0b5ec7db2c2a0" url: "https://pub.dev" source: hosted - version: "6.7.0" + version: "10.2.0" android_play_install_referrer: dependency: "direct main" description: @@ -122,18 +117,18 @@ packages: dependency: "direct main" description: name: archive - sha256: cb6a278ef2dbb298455e1a713bda08524a175630ec643a242c399c932a0a1f7d + sha256: a96e8b390886ee8abb49b7bd3ac8df6f451c621619f52a26e815fdcf568959ff url: "https://pub.dev" source: hosted - version: "3.6.1" + version: "4.0.9" args: dependency: transitive description: name: args - sha256: bf9f5caeea8d8fe6721a9c358dd8a5c1947b27f1cfaa18b39c301273594919e6 + sha256: d0481093c50b1da8910eb0bb301626d4d8eb7284aa739614d2b394ee09e3ea04 url: "https://pub.dev" source: hosted - version: "2.6.0" + version: "2.7.0" asn1lib: dependency: transitive description: @@ -259,10 +254,10 @@ packages: dependency: transitive description: name: build - sha256: "80184af8b6cb3e5c1c4ec6d8544d27711700bc3e6d2efad04238c7b5290889f0" + sha256: "45d14a0fb23e018d8287c32fc98d726ce466b231928ed9b9200f29bd3ccd39ae" url: "https://pub.dev" source: hosted - version: "2.4.1" + version: "4.0.7" build_cli_annotations: dependency: transitive description: @@ -275,10 +270,10 @@ packages: dependency: transitive description: name: build_config - sha256: bf80fcfb46a29945b423bd9aad884590fb1dc69b330a4d4700cac476af1708d1 + sha256: "94eaf6708fe64408c632ef2689ca3777b112f9421306ccf4f8c84d7c5c9f83f8" url: "https://pub.dev" source: hosted - version: "1.1.1" + version: "1.3.2" build_daemon: dependency: transitive description: @@ -287,38 +282,14 @@ packages: url: "https://pub.dev" source: hosted version: "4.0.2" - build_resolvers: - dependency: transitive - description: - name: build_resolvers - sha256: "339086358431fa15d7eca8b6a36e5d783728cf025e559b834f4609a1fcfb7b0a" - url: "https://pub.dev" - source: hosted - version: "2.4.2" build_runner: dependency: "direct dev" description: name: build_runner - sha256: "028819cfb90051c6b5440c7e574d1896f8037e3c96cf17aaeb054c9311cfbf4d" - url: "https://pub.dev" - source: hosted - version: "2.4.13" - build_runner_core: - dependency: transitive - description: - name: build_runner_core - sha256: f8126682b87a7282a339b871298cc12009cb67109cfa1614d6436fb0289193e0 - url: "https://pub.dev" - source: hosted - version: "7.3.2" - build_verify: - dependency: "direct dev" - description: - name: build_verify - sha256: abbb9b9eda076854ac1678d284c053a5ec608e64da741d0801f56d4bbea27e23 + sha256: "5367e521935b102bdf1e735d2aab461e36b2edca6517662d088dd04cc39f8d16" url: "https://pub.dev" source: hosted - version: "3.1.0" + version: "2.15.1" built_collection: dependency: transitive description: @@ -331,10 +302,10 @@ packages: dependency: transitive description: name: built_value - sha256: c7913a9737ee4007efedaffc968c049fd0f3d0e49109e778edc10de9426005cb + sha256: "34e4067d30ce212937df995f03b69992eea683539ceeac7f679a1f1eba055b56" url: "https://pub.dev" source: hosted - version: "8.9.2" + version: "8.12.6" cbor: dependency: "direct main" description: @@ -347,10 +318,10 @@ packages: dependency: transitive description: name: characters - sha256: "04a925763edad70e8443c99234dc3328f442e811f1d8fd1a72f1c8ad0f69a605" + sha256: faf38497bda5ead2a8c7615f4f7939df04333478bf32e4173fcb06d428b5716b url: "https://pub.dev" source: hosted - version: "1.3.0" + version: "1.4.1" charcode: dependency: transitive description: @@ -387,26 +358,18 @@ packages: dependency: transitive description: name: clock - sha256: cb6d7f03e1de671e34607e909a7213e31d7752be4fb66a86d29fe1eb14bfb5cf + sha256: fddb70d9b5277016c77a80201021d40a2247104d9f4aa7bab7157b7e3f05b84b url: "https://pub.dev" source: hosted - version: "1.1.1" - code_builder: - dependency: transitive - description: - name: code_builder - sha256: "0ec10bf4a89e4c613960bf1e8b42c64127021740fb21640c29c909826a5eea3e" - url: "https://pub.dev" - source: hosted - version: "4.10.1" + version: "1.1.2" collection: dependency: "direct main" description: name: collection - sha256: ee67cb0715911d28db6bf4af1026078bd6f0128b07a5f66fb2ed94ec6783c09a + sha256: "2f5709ae4d3d59dd8f7cd309b4e023046b57d8a6c82130785d2b0e5868084e76" url: "https://pub.dev" source: hosted - version: "1.18.0" + version: "1.19.1" confetti: dependency: "direct main" description: @@ -447,14 +410,6 @@ packages: url: "https://pub.dev" source: hosted version: "3.1.2" - coverage: - dependency: transitive - description: - name: coverage - sha256: "4b03e11f6d5b8f6e5bb5e9f7889a56fe6c5cbe942da5378ea4d4d7f73ef9dfe5" - url: "https://pub.dev" - source: hosted - version: "1.11.0" crop_your_image: dependency: "direct main" description: @@ -472,7 +427,7 @@ packages: source: hosted version: "0.3.4+2" crypto: - dependency: transitive + dependency: "direct main" description: name: crypto sha256: "1e445881f28f22d6140f181e07737b22f1e099a5e1ff94b0af2f9e4a463f4855" @@ -483,10 +438,10 @@ packages: dependency: transitive description: name: crypto_keys - sha256: acc19abf34623d990a0e8aec69463d74a824c31f137128f42e2810befc509ad0 + sha256: "6e473fff865ec757174dcc585d6eaa7f5f40bf3cb58f444ec5ab4a01e9083cf9" url: "https://pub.dev" source: hosted - version: "0.3.0+1" + version: "0.3.1" csslib: dependency: "direct main" description: @@ -531,18 +486,18 @@ packages: dependency: transitive description: name: dart_style - sha256: "7856d364b589d1f08986e140938578ed36ed948581fbc3bc9aef1805039ac5ab" + sha256: "29f7ecc274a86d32920b1d9cfc7502fa87220da41ec60b55f329559d5732e2b2" url: "https://pub.dev" source: hosted - version: "2.3.7" + version: "3.1.7" dbus: dependency: transitive description: name: dbus - sha256: "365c771ac3b0e58845f39ec6deebc76e3276aa9922b0cc60840712094d9047ac" + sha256: "792974a4007974fbc5c1b5433eb2330a9db3e368c3f906253af4c007d0f49a91" url: "https://pub.dev" source: hosted - version: "0.7.10" + version: "0.7.13" defer_pointer: dependency: "direct main" description: @@ -657,14 +612,6 @@ packages: url: "https://pub.dev" source: hosted version: "0.9.9" - encrypt: - dependency: "direct main" - description: - name: encrypt - sha256: "62d9aa4670cc2a8798bab89b39fc71b6dfbacf615de6cf5001fb39f7e4a996a2" - url: "https://pub.dev" - source: hosted - version: "5.0.3" equatable: dependency: transitive description: @@ -685,10 +632,10 @@ packages: dependency: transitive description: name: expressions - sha256: "308a621b602923dd8a0cf3072793b24850d06453eb49c6b698cbda41a282e904" + sha256: f3b0e99563a9a1bde1138e728eb722f292cc7d2aec55d28136c49b1a370306c5 url: "https://pub.dev" source: hosted - version: "0.2.5+2" + version: "0.2.5+3" extended_image: dependency: transitive description: @@ -717,18 +664,18 @@ packages: dependency: "direct main" description: name: external_path - sha256: "272d067c719c2421ff40c202ac32ccddcb689f3b0c839ec370942666dae589db" + sha256: "68a18a2aa51ec012d7013ea2a80305dc5372f3577a2bbcc7dcc5550b25a5a73b" url: "https://pub.dev" source: hosted - version: "2.0.1" + version: "2.2.0" fake_async: dependency: transitive description: name: fake_async - sha256: "511392330127add0b769b75a987850d136345d9227c6b94c96a04cf4a391bf78" + sha256: "5368f224a74523e8d2e7399ea1638b37aecfca824a3cc4dfdf77bf1fa905ac44" url: "https://pub.dev" source: hosted - version: "1.3.1" + version: "1.3.3" faker: dependency: "direct main" description: @@ -835,37 +782,38 @@ packages: source: hosted version: "1.1.1" flat_buffers: - dependency: transitive + dependency: "direct overridden" description: - name: flat_buffers - sha256: "380bdcba5664a718bfd4ea20a45d39e13684f5318fcd8883066a55e21f37f4c3" - url: "https://pub.dev" - source: hosted - version: "23.5.26" + path: dart + ref: e7c6874192a643c50b10cb90f81c0ed84fd7f53a + resolved-ref: e7c6874192a643c50b10cb90f81c0ed84fd7f53a + url: "https://github.com/google/flatbuffers.git" + source: git + version: "25.12.19" flex_color_picker: dependency: "direct main" description: name: flex_color_picker - sha256: "5c846437069fb7afdd7ade6bf37e628a71d2ab0787095ddcb1253bf9345d5f3a" + sha256: a0979dd61f21b634717b98eb4ceaed2bfe009fe020ce8597aaf164b9eeb57aaa url: "https://pub.dev" source: hosted - version: "3.4.1" + version: "3.8.0" flex_color_scheme: dependency: "direct main" description: name: flex_color_scheme - sha256: "32914024a4f404d90ff449f58d279191675b28e7c08824046baf06826e99d984" + sha256: ab854146f201d2d62cc251fd525ef023b84182c4a0bfe4ae4c18ffc505b412d3 url: "https://pub.dev" source: hosted - version: "7.3.1" + version: "8.4.0" flex_seed_scheme: dependency: transitive description: name: flex_seed_scheme - sha256: "4cee2f1d07259f77e8b36f4ec5f35499d19e74e17c7dce5b819554914082bc01" + sha256: a3183753bbcfc3af106224bff3ab3e1844b73f58062136b7499919f49f3667e7 url: "https://pub.dev" source: hosted - version: "1.5.0" + version: "4.0.1" flutter: dependency: "direct main" description: flutter @@ -1160,10 +1108,10 @@ packages: dependency: "direct dev" description: name: flutter_native_splash - sha256: ee5c9bd2b74ea8676442fd4ab876b5d41681df49276488854d6c81a5377c0ef1 + sha256: "9db4b80b044e9af17cc4b1272137fc7ace0054d879ef8210a76adc34aaf4cdff" url: "https://pub.dev" source: hosted - version: "2.4.2" + version: "2.4.8" flutter_plugin_android_lifecycle: dependency: transitive description: @@ -1226,26 +1174,18 @@ packages: dependency: "direct dev" description: name: freezed - sha256: "44c19278dd9d89292cf46e97dc0c1e52ce03275f40a97c5a348e802a924bf40e" + sha256: f23ea33b3863f119b58ed1b586e881a46bd28715ddcc4dbc33104524e3434131 url: "https://pub.dev" source: hosted - version: "2.5.7" + version: "3.2.5" freezed_annotation: dependency: "direct main" description: name: freezed_annotation - sha256: c2e2d632dd9b8a2b7751117abcfc2b4888ecfe181bd9fca7170d9ef02e595fe2 - url: "https://pub.dev" - source: hosted - version: "2.4.4" - frontend_server_client: - dependency: "direct overridden" - description: - name: frontend_server_client - sha256: f64a0333a82f30b0cca061bc3d143813a486dc086b574bfb233b7c1372427694 + sha256: "7294967ff0a6d98638e7acb774aac3af2550777accd8149c90af5b014e6d44d8" url: "https://pub.dev" source: hosted - version: "4.0.0" + version: "3.1.0" geocoding: dependency: "direct main" description: @@ -1379,10 +1319,10 @@ packages: dependency: transitive description: name: glob - sha256: "0e7014b3b7d4dac1ca4d6114f82bf1782ee86745b9b42a92c9289c23d8a0ab63" + sha256: c3f1ee72c96f8f78935e18aa8cecced9ab132419e8625dc187e1c2408efc20de url: "https://pub.dev" source: hosted - version: "2.1.2" + version: "2.1.3" globbing: dependency: transitive description: @@ -1395,10 +1335,10 @@ packages: dependency: "direct main" description: name: google_fonts - sha256: b1ac0fe2832c9cc95e5e88b57d627c5e68c223b9657f4b96e1487aa9098c7b82 + sha256: e3cb3ee6b47fd2472c23de6da5744796a4da195137759ddb3fbcc9467b7b3c7d url: "https://pub.dev" source: hosted - version: "6.2.1" + version: "8.2.1" google_identity_services_web: dependency: transitive description: @@ -1667,10 +1607,10 @@ packages: dependency: transitive description: name: html - sha256: "1fc58edeaec4307368c60d59b7e15b9d658b57d7f3125098b6294153c75337ec" + sha256: "6d1264f2dffa1b1101c25a91dff0dc2daee4c18e87cd8538729773c073dbf602" url: "https://pub.dev" source: hosted - version: "0.15.5" + version: "0.15.6" http: dependency: "direct overridden" description: @@ -1731,10 +1671,10 @@ packages: dependency: "direct main" description: name: image - sha256: f31d52537dc417fdcde36088fdf11d191026fd5e4fae742491ebd40e5a8bea7d + sha256: "6300175e00616bbc832e2fc91bfa4d776af5402c81c7151bee6905bb08473c52" url: "https://pub.dev" source: hosted - version: "4.3.0" + version: "4.9.1" image_picker: dependency: "direct main" description: @@ -1880,13 +1820,13 @@ packages: source: hosted version: "0.7.0" jose: - dependency: transitive + dependency: "direct overridden" description: name: jose - sha256: "7955ec5d131960104e81fbf151abacb9d835c16c9e793ed394b2809f28b2198d" + sha256: a0a339d0a0652dc1bd89f8b92d38479e07e16db83858fb55fa57212479f323f7 url: "https://pub.dev" source: hosted - version: "0.3.4" + version: "0.3.5+2" js: dependency: "direct main" description: @@ -1931,26 +1871,26 @@ packages: dependency: transitive description: name: leak_tracker - sha256: "3f87a60e8c63aecc975dda1ceedbc8f24de75f09e4856ea27daf8958f2f0ce05" + sha256: "33e2e26bdd85a0112ec15400c8cbffea70d0f9c3407491f672a2fad47915e2de" url: "https://pub.dev" source: hosted - version: "10.0.5" + version: "11.0.2" leak_tracker_flutter_testing: dependency: transitive description: name: leak_tracker_flutter_testing - sha256: "932549fb305594d82d7183ecd9fa93463e9914e1b67cacc34bc40906594a1806" + sha256: "1dbc140bb5a23c75ea9c4811222756104fbcd1a27173f0c34ca01e16bea473c1" url: "https://pub.dev" source: hosted - version: "3.0.5" + version: "3.0.10" leak_tracker_testing: dependency: transitive description: name: leak_tracker_testing - sha256: "6ba465d5d76e67ddf503e1161d1f4a6bc42306f9d66ca1e8f079a47290fb06d3" + sha256: "8d5a2d49f4a66b49744b23b018848400d23e54caf9463f4eb20df3eb8acb2eb1" url: "https://pub.dev" source: hosted - version: "3.0.1" + version: "3.0.2" lints: dependency: transitive description: @@ -2040,14 +1980,6 @@ packages: url: "https://pub.dev" source: hosted version: "1.6.1" - macros: - dependency: transitive - description: - name: macros - sha256: "0acaed5d6b7eab89f63350bccd82119e6c602df0f391260d0e32b5e23db79536" - url: "https://pub.dev" - source: hosted - version: "0.1.2-main.4" maps_launcher: dependency: "direct main" description: @@ -2069,10 +2001,10 @@ packages: dependency: transitive description: name: matcher - sha256: d2323aa2060500f906aa31a895b4030b6da3ebdcc5619d14ce1aada65cd161cb + sha256: dc0b7dc7651697ea4ff3e69ef44b0407ea32c487a39fff6a4004fa585e901861 url: "https://pub.dev" source: hosted - version: "0.12.16+1" + version: "0.12.19" material_color_utilities: dependency: "direct main" description: @@ -2108,11 +2040,10 @@ packages: media_kit_libs_windows_video: dependency: "direct main" description: - name: media_kit_libs_windows_video - sha256: "32654572167825c42c55466f5d08eee23ea11061c84aa91b09d0e0f69bdd0887" - url: "https://pub.dev" - source: hosted - version: "1.0.10" + path: "packages/media_kit_libs_windows_video" + relative: true + source: path + version: "1.0.11+openbubbles.1" media_kit_native_event_loop: dependency: "direct main" description: @@ -2141,10 +2072,10 @@ packages: dependency: transitive description: name: meta - sha256: bdb68674043280c3428e9ec998512fb681678676b3c54e773629ffe74419f8c7 + sha256: "1741988757a65eb6b36abe716829688cf01910bbf91c34354ff7ec1c3de2b349" url: "https://pub.dev" source: hosted - version: "1.15.0" + version: "1.18.0" metadata_fetch: dependency: "direct main" description: @@ -2257,14 +2188,6 @@ packages: url: "https://pub.dev" source: hosted version: "0.5.0" - node_preamble: - dependency: transitive - description: - name: node_preamble - sha256: "6e7eac89047ab8a8d26cf16127b5ed26de65209847630400f9aefd7cd5c730db" - url: "https://pub.dev" - source: hosted - version: "2.0.2" numberpicker: dependency: "direct main" description: @@ -2277,26 +2200,26 @@ packages: dependency: "direct main" description: name: objectbox - sha256: ea823f4bf1d0a636e7aa50b43daabb64dd0fbd80b85a033016ccc1bc4f76f432 + sha256: f68d74bfdfa6758cebf4cd319db1f4a4386c79ba8896d19e2e999faf041bac78 url: "https://pub.dev" source: hosted - version: "4.0.3" + version: "5.3.2" objectbox_flutter_libs: dependency: "direct main" description: name: objectbox_flutter_libs - sha256: c91350bbbce5e6c2038255760b5be988faead004c814f833c2cd137445c6ae70 + sha256: "604d26fac4548693449c9ea802e007d4adf7f31e361ae3ebf362ac142295078d" url: "https://pub.dev" source: hosted - version: "4.0.3" + version: "5.3.2" objectbox_generator: dependency: "direct dev" description: name: objectbox_generator - sha256: "96da521f2cef455cd524f8854e31d64495c50711ad5f1e2cf3142a8e527bc75f" + sha256: b5f6b9e6062635689d777ba2b3a16548991eb1e61007baf607022537e3bc0436 url: "https://pub.dev" source: hosted - version: "4.0.3" + version: "5.3.2" on_exit: dependency: "direct main" description: @@ -2309,18 +2232,18 @@ packages: dependency: "direct main" description: name: open_filex - sha256: ba425ea49affd0a98a234aa9344b9ea5d4c4f7625a1377961eae9fe194c3d523 + sha256: "9976da61b6a72302cf3b1efbce259200cd40232643a467aac7370addf94d6900" url: "https://pub.dev" source: hosted - version: "4.5.0" + version: "4.7.0" openid_client: dependency: transitive description: name: openid_client - sha256: "043878e907b7a1b460b54fb7b3b27b101cf70d4ac28b32a2db87ae67dbaed611" + sha256: d7c229b849eaf4ff0ac77c22f8f1c4c522f6830b8c58d7b73953514ad6980954 url: "https://pub.dev" source: hosted - version: "0.4.8" + version: "0.4.9+2" package_config: dependency: transitive description: @@ -2373,10 +2296,10 @@ packages: dependency: "direct main" description: name: path - sha256: "087ce49c3f0dc39180befefc60fdb4acd8f8620e5682fe2476afd0b3688bb4af" + sha256: "75cca69d1490965be98c73ceaea117e8a04dd21217b37b292c9ddbec0d955bc5" url: "https://pub.dev" source: hosted - version: "1.9.0" + version: "1.9.1" path_drawing: dependency: transitive description: @@ -2445,10 +2368,10 @@ packages: dependency: "direct main" description: name: pdf - sha256: "05df53f8791587402493ac97b9869d3824eccbc77d97855f4545cf72df3cae07" + sha256: "517df47af468734a23c8b513c0c6a8a62357403ab1b8ab7fad1606576a9dbdd0" url: "https://pub.dev" source: hosted - version: "3.11.1" + version: "3.13.0" pdf_widget_wrapper: dependency: transitive description: @@ -2518,10 +2441,10 @@ packages: dependency: transitive description: name: petitparser - sha256: c15605cd28af66339f8eb6fbe0e541bfe2d1b72d5825efc6598f3e0a31b9ad27 + sha256: "91bd59303e9f769f108f8df05e371341b15d59e995e6806aefab827b58336675" url: "https://pub.dev" source: hosted - version: "6.0.2" + version: "7.0.2" photo_manager: dependency: "direct main" description: @@ -2563,13 +2486,13 @@ packages: source: hosted version: "2.1.8" pointycastle: - dependency: transitive + dependency: "direct main" description: name: pointycastle - sha256: "4be0097fcf3fd3e8449e53730c631200ebc7b88016acecab2b0da2f0149222fe" + sha256: "92aa3841d083cc4b0f4709b5c74fd6409a3e6ba833ffc7dc6a8fee096366acf5" url: "https://pub.dev" source: hosted - version: "3.9.1" + version: "4.0.0" polylabel: dependency: transitive description: @@ -2586,14 +2509,22 @@ packages: url: "https://pub.dev" source: hosted version: "1.5.1" + posix: + dependency: transitive + description: + name: posix + sha256: bc1bad54ad2b735816e31f8d4600cfde6c7839975085ddfbca48b6c9f7c4044e + url: "https://pub.dev" + source: hosted + version: "6.5.2" printing: dependency: "direct main" description: name: printing - sha256: b535d177fc6e8f8908e19b0ff5c1d4a87e3c4d0bf675e05aa2562af1b7853906 + sha256: f6cd14c768c1352dd37a958a3ee351aa9ce305b398218d3acd86389d5f7ecad1 url: "https://pub.dev" source: hosted - version: "5.13.4" + version: "5.15.0" process_run: dependency: transitive description: @@ -2630,18 +2561,18 @@ packages: dependency: transitive description: name: pub_semver - sha256: "40d3ab1bbd474c4c2328c91e3a7df8c6dd629b79ece4c4bd04bee496a224fb0c" + sha256: "5bfcf68ca79ef689f8990d1160781b4bad40a3bd5e5218ad4076ddb7f4081585" url: "https://pub.dev" source: hosted - version: "2.1.4" + version: "2.2.0" pubspec_parse: dependency: transitive description: name: pubspec_parse - sha256: c799b721d79eb6ee6fa56f00c04b472dcd44a30d258fac2174a6ec57302678f8 + sha256: "0560ba233314abbed0a48a2956f7f022cce7c3e1e73df540277da7544cad4082" url: "https://pub.dev" source: hosted - version: "1.3.0" + version: "1.5.0" pull_down_button: dependency: "direct main" description: @@ -2754,13 +2685,13 @@ packages: source: path version: "0.0.1" rxdart: - dependency: transitive + dependency: "direct overridden" description: name: rxdart - sha256: "0c7c0cedd93788d996e33041ffecda924cc54389199cde4e6a34b440f50044cb" + sha256: "5c3004a4a8dbb94bd4bf5412a4def4acdaa12e12f269737a5751369e12d1a962" url: "https://pub.dev" source: hosted - version: "0.27.7" + version: "0.28.0" safe_local_storage: dependency: transitive description: @@ -2844,12 +2775,11 @@ packages: secure_application: dependency: "direct main" description: - path: "." - ref: master - resolved-ref: "7ca070f00552f211b8978d701bc292da7217c2ff" - url: "https://github.com/BlueBubblesApp/secure_application.git" - source: git - version: "4.0.0" + name: secure_application + sha256: "1476f2a8df44ed9617bf42f51a1fce2ab0b83bfd4ea58983a5f7d3748b356ef3" + url: "https://pub.dev" + source: hosted + version: "4.1.0" sembast: dependency: transitive description: @@ -2878,18 +2808,18 @@ packages: dependency: "direct main" description: name: shared_preferences - sha256: "95f9997ca1fb9799d494d0cb2a780fd7be075818d59f00c43832ed112b158a82" + sha256: c3025c5534b01739267eb7d76959bbc25a6d10f6988e1c2a3036940133dd10bf url: "https://pub.dev" source: hosted - version: "2.3.3" + version: "2.5.5" shared_preferences_android: dependency: transitive description: name: shared_preferences_android - sha256: "3b9febd815c9ca29c9e3520d50ec32f49157711e143b7a4ca039eb87e8ade5ab" + sha256: "0634e64bd719f89c012f392938e173521f535d3ecaf66558fa94a056d22b5cc7" url: "https://pub.dev" source: hosted - version: "2.3.3" + version: "2.4.27" shared_preferences_foundation: dependency: transitive description: @@ -2938,14 +2868,6 @@ packages: url: "https://pub.dev" source: hosted version: "1.4.1" - shelf_packages_handler: - dependency: transitive - description: - name: shelf_packages_handler - sha256: "89f967eca29607c933ba9571d838be31d67f53f6e4ee15147d5dc2934fee1b1e" - url: "https://pub.dev" - source: hosted - version: "3.0.2" shelf_router: dependency: transitive description: @@ -2954,14 +2876,6 @@ packages: url: "https://pub.dev" source: hosted version: "1.1.4" - shelf_static: - dependency: transitive - description: - name: shelf_static - sha256: c87c3875f91262785dade62d135760c2c69cb217ac759485334c5857ad89f6e3 - url: "https://pub.dev" - source: hosted - version: "1.1.3" shelf_web_socket: dependency: transitive description: @@ -2998,15 +2912,15 @@ packages: dependency: "direct main" description: name: skeletonizer - sha256: "3b202e4fa9c49b017d368fb0e570d4952bcd19972b67b2face071bdd68abbfae" + sha256: "9f38f9b47ec3cf2235a6a4f154a88a95432bc55ba98b3e2eb6ced5c1974bc122" url: "https://pub.dev" source: hosted - version: "1.4.2" + version: "2.1.3" sky_engine: dependency: transitive description: flutter source: sdk - version: "0.0.99" + version: "0.0.0" sliding_up_panel2: dependency: "direct main" description: @@ -3059,26 +2973,10 @@ packages: dependency: transitive description: name: source_gen - sha256: "14658ba5f669685cd3d63701d01b31ea748310f7ab854e471962670abcf57832" - url: "https://pub.dev" - source: hosted - version: "1.5.0" - source_map_stack_trace: - dependency: transitive - description: - name: source_map_stack_trace - sha256: c0713a43e323c3302c2abe2a1cc89aa057a387101ebd280371d6a6c9fa68516b - url: "https://pub.dev" - source: hosted - version: "2.1.2" - source_maps: - dependency: transitive - description: - name: source_maps - sha256: "708b3f6b97248e5781f493b765c3337db11c5d2c81c3094f10904bfa8004c703" + sha256: a603f1fb984a7391ae5978d1b92bfaaa08b350dca5c825256f925818f7943bf5 url: "https://pub.dev" source: hosted - version: "0.10.12" + version: "4.2.4" source_span: dependency: transitive description: @@ -3107,27 +3005,27 @@ packages: dependency: transitive description: name: stack_trace - sha256: "73713990125a6d93122541237550ee3352a2d84baad52d375a4cad2eb9b7ce0b" + sha256: "8b27215b45d22309b5cddda1aa2b19bdfec9df0e765f2de506401c071d38d1b1" url: "https://pub.dev" source: hosted - version: "1.11.1" + version: "1.12.1" store_checker: dependency: "direct main" description: path: "." - ref: master - resolved-ref: "5881dfbb97c733dea416660e30444899b347ed52" + ref: "36bd4f13b22a3ca07dd7fd1abe997d9f312292ea" + resolved-ref: "36bd4f13b22a3ca07dd7fd1abe997d9f312292ea" url: "https://github.com/ravitejaavv/store_checker" source: git - version: "1.6.0" + version: "1.8.0" stream_channel: dependency: transitive description: name: stream_channel - sha256: ba2aa5d8cc609d96bbb2899c28934f9e1af5cddbd60a827822ea467161eb54e7 + sha256: "969e04c80b8bcdf826f8f16579c7b14d780458bd97f56d107d3950fdbeef059d" url: "https://pub.dev" source: hosted - version: "2.1.2" + version: "2.1.4" stream_transform: dependency: transitive description: @@ -3231,30 +3129,14 @@ packages: url: "https://pub.dev" source: hosted version: "1.2.1" - test: - dependency: transitive - description: - name: test - sha256: "7ee44229615f8f642b68120165ae4c2a75fe77ae2065b1e55ae4711f6cf0899e" - url: "https://pub.dev" - source: hosted - version: "1.25.7" test_api: dependency: transitive description: name: test_api - sha256: "5b8a98dafc4d5c4c9c72d8b31ab2b23fc13422348d2997120294d3bac86b4ddb" + sha256: "949a932224383300f01be9221c39180316445ecb8e7547f70a41a35bf421fb9e" url: "https://pub.dev" source: hosted - version: "0.7.2" - test_core: - dependency: transitive - description: - name: test_core - sha256: "55ea5a652e38a1dfb32943a7973f3681a60f872f8c3a05a14664ad54ef9c6696" - url: "https://pub.dev" - source: hosted - version: "0.6.4" + version: "0.7.11" throttling: dependency: transitive description: @@ -3271,14 +3153,6 @@ packages: url: "https://pub.dev" source: hosted version: "0.9.4" - timing: - dependency: transitive - description: - name: timing - sha256: "70a3b636575d4163c477e6de42f247a23b315ae20e86442bebe32d3cabf61c32" - url: "https://pub.dev" - source: hosted - version: "1.0.1" tray_manager: dependency: "direct main" description: @@ -3355,10 +3229,10 @@ packages: dependency: "direct main" description: name: universal_io - sha256: "1722b2dcc462b4b2f3ee7d188dad008b6eb4c40bbd03a3de451d82c78bba9aad" + sha256: f63cbc48103236abf48e345e07a03ce5757ea86285ed313a6a032596ed9301e2 url: "https://pub.dev" source: hosted - version: "2.2.2" + version: "2.3.1" universal_platform: dependency: transitive description: @@ -3475,18 +3349,18 @@ packages: dependency: transitive description: name: vector_graphics_compiler - sha256: ab9ff38fc771e9ee1139320adbe3d18a60327370c218c60752068ebee4b49ab1 + sha256: "4dca4feb77dc3ec7f6e27e49c53241eb8217f55e4f9b12599a27f8903bca5682" url: "https://pub.dev" source: hosted - version: "1.1.15" + version: "1.3.0" vector_math: dependency: transitive description: name: vector_math - sha256: "80b3257d1492ce4d091729e3a67a60407d227c27241d6927be0130c98e741803" + sha256: d530bd74fea330e6e364cda7a85019c434070188383e1cd8d9777ee586914c5b url: "https://pub.dev" source: hosted - version: "2.1.4" + version: "2.2.0" version: dependency: "direct main" description: @@ -3596,10 +3470,10 @@ packages: dependency: transitive description: name: web - sha256: cd3543bd5798f6ad290ea73d210f423502e71900302dde696f8bff84bf89a1cb + sha256: "868d88a33d8a87b18ffc05f9f030ba328ffefba92d6c127917a2ba740f9cfe4a" url: "https://pub.dev" source: hosted - version: "1.1.0" + version: "1.1.1" web_socket_channel: dependency: transitive description: @@ -3608,14 +3482,6 @@ packages: url: "https://pub.dev" source: hosted version: "2.4.0" - webkit_inspection_protocol: - dependency: transitive - description: - name: webkit_inspection_protocol - sha256: "87d3f2333bb240704cd3f1c6b5b7acd8a10e7f0bc28c28dcf14e782014f4a572" - url: "https://pub.dev" - source: hosted - version: "1.2.1" win32: dependency: "direct overridden" description: @@ -3676,18 +3542,18 @@ packages: dependency: transitive description: name: xml - sha256: b015a8ad1c488f66851d762d3090a21c600e479dc75e68328c52774040cf9226 + sha256: "67f0aff7be013d107995e9b75bf4e7f2c3ef2dfdb2c8e68024bba0a7fd5756a4" url: "https://pub.dev" source: hosted - version: "6.5.0" + version: "7.0.1" yaml: dependency: transitive description: name: yaml - sha256: "75769501ea3489fca56601ff33454fe45507ea3bfb014161abc3b43ae25989d5" + sha256: b9da305ac7c39faa3f030eccd175340f968459dae4af175130b3fc47e40d76ce url: "https://pub.dev" source: hosted - version: "3.1.2" + version: "3.1.3" sdks: - dart: ">=3.5.0 <4.0.0" - flutter: ">=3.24.0" + dart: ">=3.12.0 <4.0.0" + flutter: ">=3.44.0" diff --git a/pubspec.yaml b/pubspec.yaml index 7b30847094..3ee50695a5 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -16,7 +16,7 @@ version: 1.15.0+227 publish_to: none environment: - sdk: '>=3.1.3 <4.0.0' + sdk: '>=3.12.0 <4.0.0' dependencies: flutter: @@ -56,7 +56,7 @@ dependencies: easy_debounce: ^2.0.3 emojis: ^0.9.9 emoji_picker_flutter: 3.0.0 - encrypt: ^5.0.3 + pointycastle: ^4.0.0 exif: ^3.3.0 faker: ^2.1.0 fast_contacts: ^4.0.0 # mobile only @@ -64,10 +64,11 @@ dependencies: firebase_dart: git: url: https://github.com/appsup-dart/firebase_dart.git + # Feature branch retained for the desktop Firestore fallback. ref: beb79f70a2bb0e96e6bb9fdebac2ff452f138950 path: packages/firebase_dart flex_color_picker: ^3.4.1 - flex_color_scheme: ^7.3.1 + flex_color_scheme: 8.4.0 flutter_acrylic: ^1.1.3 flutter_audio_waveforms: ^1.2.1+8 flutter_displaymode: ^0.6.0 # android only @@ -92,7 +93,7 @@ dependencies: get: ^4.6.6 giphy_get: ^3.5.4 github: ^9.24.0 - google_fonts: ^6.2.1 + google_fonts: 8.2.1 google_ml_kit: ^0.18.0 # mobile only google_mlkit_smart_reply: ^0.11.0 google_sign_in: ^6.2.1 @@ -119,7 +120,7 @@ dependencies: media_kit_video: ^1.2.4 # For video rendering. media_kit_native_event_loop: ^1.0.8 # Support for higher number of concurrent instances & better performance. media_kit_libs_android_video: ^1.3.6 # Android package for video native libraries. - media_kit_libs_windows_video: ^1.0.9 # Windows package for video native libraries. + media_kit_libs_windows_video: ^1.0.11 # Windows package for video native libraries. media_kit_libs_linux: ^1.1.3 # GNU/Linux dependency package. metadata_fetch: ^0.4.1 mime_type: ^1.0.0 @@ -129,10 +130,10 @@ dependencies: network_info_plus: ^6.0.1 network_tools: ^5.0.2 numberpicker: ^2.1.2 - objectbox: ^4.0.1 - objectbox_flutter_libs: any + objectbox: 5.3.2 + objectbox_flutter_libs: 5.3.2 on_exit: ^1.0.0 - open_filex: ^4.4.0 + open_filex: ^4.7.0 package_info_plus: ^8.0.0 particles_flutter: ^1.0.1 pasteboard: ^0.3.0 @@ -142,7 +143,7 @@ dependencies: permission_handler: ^11.3.1 # mobile only photo_manager: ^3.2.0 # only mobile photo_view: ^0.15.0 - printing: ^5.12.0 + printing: ^5.15.0 qr_flutter: ^4.1.0 receive_intent: ^0.2.5 # mobile only record: ^5.0.5 @@ -150,15 +151,13 @@ dependencies: saver_gallery: ^3.0.3 screen_retriever: ^0.1.9 scroll_to_index: ^3.0.1 - secure_application: # no linux support, gradle namespace issue - git: - url: https://github.com/BlueBubblesApp/secure_application.git - ref: master + # 4.1.0 removes the Android v1 Registrar API that Flutter 3.29+ deleted. + secure_application: ^4.1.0 share_plus: ^10.0.2 # sharing files not supported on Windows & Linux, todo desktop - shared_preferences: ^2.2.2 + shared_preferences: ^2.5.5 shimmer: ^3.0.0 simple_animations: ^5.0.2 - skeletonizer: ^1.1.1 + skeletonizer: 2.1.3 sliding_up_panel2: ^3.3.0+1 slugify: ^2.0.0 smooth_page_indicator: ^1.1.0 @@ -167,7 +166,8 @@ dependencies: store_checker: # android namespace issue git: url: https://github.com/ravitejaavv/store_checker - ref: master + # Removes the Android v1 Registrar API deleted by Flutter 3.29. + ref: 36bd4f13b22a3ca07dd7fd1abe997d9f312292ea synchronized: ^3.1.0+1 system_tray: ^2.0.3 super_drag_and_drop: ^0.8.20 @@ -189,7 +189,7 @@ dependencies: window_manager: ^0.4.2 windows_taskbar: ^1.1.2 logger: ^2.4.0 - archive: ^3.6.1 + archive: ^4.0.9 in_app_review: ^2.0.9 pull_down_button: ^0.10.1 app_install_date: ^0.1.5 @@ -197,14 +197,14 @@ dependencies: flutter_rust_bridge: 2.3.0 rust_lib_bluebubbles: path: rust_builder - freezed_annotation: ^2.4.1 + freezed_annotation: ^3.1.0 telephony_plus: path: ./telephony_plus barcode_widget: ^2.0.4 vpn_connection_detector: ^1.0.6 ffmpeg_kit_flutter_new: ^3.2.0 dotted_border: ^2.1.0 - external_path: ^2.0.1 + external_path: ^2.2.0 flutter_inappwebview: ^6.1.5 in_app_purchase_android: ^0.4.0 android_play_install_referrer: ^0.4.0 @@ -217,10 +217,31 @@ dependencies: dpad: ^2.0.2 + crypto: any dependency_overrides: + # 25.9.23 allocates but never installs a larger FlexBuffers buffer, causing + # ObjectBox writes with more than 2048 bytes of metadata to throw RangeError. + # Pin the upstream fix until it is published on pub.dev. + # https://github.com/google/flatbuffers/commit/e7c6874192a643c50b10cb90f81c0ed84fd7f53a + flat_buffers: + git: + url: https://github.com/google/flatbuffers.git + ref: e7c6874192a643c50b10cb90f81c0ed84fd7f53a + path: dart + # Architecture-aware, provenance-checked Windows libmpv/ANGLE bundle. + # Keep the declared dependency above for upstream compatibility; this local + # fork preserves x64 and adds fail-closed ARM64 native selection. + media_kit_libs_windows_video: + path: packages/media_kit_libs_windows_video # overrides for packages stuck on outdated versions http: ^1.2.1 # metadata_fetch intl: ^0.19.0 # firebase_dart + # jose <=0.3.5 accepts attacker-controlled JWK header keys during + # signature verification (GHSA-vm9r-h74p-hg97). + jose: ^0.3.5+2 + # The pinned firebase_dart Firestore branch declares ^0.27, but its API is + # compatible with 0.28; secure_application 4.1 requires the newer line. + rxdart: ^0.28.0 js: ^0.7.1 # socket_io_client material_color_utilities: ^0.11.1 # flutter test SDK permission_handler_platform_interface: ^4.2.1 # BB permission_handler_windows @@ -231,19 +252,16 @@ dependency_overrides: path: permission_handler_windows uuid: ^4.4.0 # firebase_dart win32: ^5.5.3 # for build issue in flutter v3.24.0 - frontend_server_client: ^4.0.0 # for build_runner issues on v3.24.0 - dev_dependencies: - build_runner: ^2.4.12 - build_verify: ^3.1.0 + build_runner: ^2.15.1 flutter_launcher_icons: ^0.13.1 flutter_native_splash: ^2.4.0 flutter_lints: ^4.0.0 peanut: ^5.0.0 - objectbox_generator: any + objectbox_generator: 5.3.2 flutter_test: sdk: flutter - freezed: ^2.4.1 + freezed: ^3.2.5 in_app_purchase_platform_interface: ^1.4.0 flutter_icons: diff --git a/rust/.gitignore b/rust/.gitignore index ea8c4bf7f3..5c6e2c3b8e 100644 --- a/rust/.gitignore +++ b/rust/.gitignore @@ -1 +1,2 @@ /target +/target-* diff --git a/rust/Cargo.lock b/rust/Cargo.lock index c9bde700b9..58296e2e52 100644 --- a/rust/Cargo.lock +++ b/rust/Cargo.lock @@ -1196,7 +1196,7 @@ dependencies = [ "futures-core", "futures-sink", "nanorand", - "spin 0.9.8", + "spin", ] [[package]] @@ -1679,8 +1679,6 @@ dependencies = [ "plist", "rand 0.8.5", "reqwest", - "rustls 0.20.9", - "rustls-pemfile", "serde", "serde_json", "sha2", @@ -3051,21 +3049,6 @@ dependencies = [ "winreg", ] -[[package]] -name = "ring" -version = "0.16.20" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3053cf52e236a3ed746dfc745aa9cacf1b791d846bdaf412f60a8d7d6e17c8fc" -dependencies = [ - "cc", - "libc", - "once_cell", - "spin 0.5.2", - "untrusted 0.7.1", - "web-sys", - "winapi", -] - [[package]] name = "ring" version = "0.17.8" @@ -3076,8 +3059,8 @@ dependencies = [ "cfg-if", "getrandom 0.2.15", "libc", - "spin 0.9.8", - "untrusted 0.9.0", + "spin", + "untrusted", "windows-sys 0.52.0", ] @@ -3135,9 +3118,11 @@ dependencies = [ "anyhow", "async-recursion", "base64 0.22.1", + "flate2", "flexi_logger", "flutter_rust_bridge", "futures", + "hmac", "keystore", "log", "multi_log", @@ -3152,9 +3137,12 @@ dependencies = [ "rustpush", "serde", "sha2", + "tempfile", + "thiserror 1.0.69", "tokio", "uniffi", "uuid", + "windows-sys 0.59.0", ] [[package]] @@ -3182,18 +3170,6 @@ dependencies = [ "windows-sys 0.59.0", ] -[[package]] -name = "rustls" -version = "0.20.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1b80e3dec595989ea8510028f30c408a4630db12c9cbb8de34203b89d6577e99" -dependencies = [ - "log", - "ring 0.16.20", - "sct", - "webpki", -] - [[package]] name = "rustls" version = "0.21.12" @@ -3201,7 +3177,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3f56a14d1f48b391359b22f731fd4bd7e43c97f3c50eee276f3aa09c94784d3e" dependencies = [ "log", - "ring 0.17.8", + "ring", "rustls-webpki 0.101.7", "sct", ] @@ -3245,8 +3221,8 @@ version = "0.101.7" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8b6275d1ee7a1cd780b64aca7726599a1dbc893b1e64144529e55c3c2f745765" dependencies = [ - "ring 0.17.8", - "untrusted 0.9.0", + "ring", + "untrusted", ] [[package]] @@ -3256,9 +3232,9 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "20a6af516fea4b20eccceaf166e8aa666ac996208e8a644ce3ef5aa783bc7cd4" dependencies = [ "aws-lc-rs", - "ring 0.17.8", + "ring", "rustls-pki-types", - "untrusted 0.9.0", + "untrusted", ] [[package]] @@ -3376,8 +3352,8 @@ version = "0.7.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "da046153aa2352493d6cb7da4b6e5c0c057d8a1d0a9aa8560baffdd945acd414" dependencies = [ - "ring 0.17.8", - "untrusted 0.9.0", + "ring", + "untrusted", ] [[package]] @@ -3562,12 +3538,6 @@ dependencies = [ "windows-sys 0.59.0", ] -[[package]] -name = "spin" -version = "0.5.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6e63cff320ae2c57904679ba7cb63280a3dc4613885beafb148ee7bf9aa9042d" - [[package]] name = "spin" version = "0.9.8" @@ -4199,12 +4169,6 @@ dependencies = [ "subtle", ] -[[package]] -name = "untrusted" -version = "0.7.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a156c684c91ea7d62626509bce3cb4e1d9ed5c4d978f7b4352658f96a4c26b4a" - [[package]] name = "untrusted" version = "0.9.0" @@ -4416,16 +4380,6 @@ dependencies = [ "wasm-bindgen", ] -[[package]] -name = "webpki" -version = "0.22.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ed63aea5ce73d0ff405984102c42de94fc55a6b75765d621c65262469b3c9b53" -dependencies = [ - "ring 0.17.8", - "untrusted 0.9.0", -] - [[package]] name = "webpki-roots" version = "0.25.4" diff --git a/rust/Cargo.toml b/rust/Cargo.toml index 23f850ea41..ac92874b71 100644 --- a/rust/Cargo.toml +++ b/rust/Cargo.toml @@ -26,15 +26,28 @@ log = "0.4.22" pretty_env_logger = "0.5.0" uuid = { version = "1.4.1", features = ["v4"] } futures = "0.3.30" +flate2 = "1.0" base64 = "0.22.1" sha2 = "0.10.8" +hmac = "0.12.1" rasn = "0.16.0" openssl = { version = "0.10.56", features = ["vendored"] } aes-gcm = "0.10.3" +thiserror = "1.0.47" [target.'cfg(target_os = "android")'.dependencies] android_logger = "0.14.1" +[target.'cfg(target_os = "windows")'.dependencies] +windows-sys = { version = "=0.59.0", features = [ + "Win32_Foundation", + "Win32_Security_Cryptography", + "Win32_Storage_FileSystem", +] } + +[dev-dependencies] +tempfile = "3" + [build-dependencies] uniffi = { git = "https://github.com/mozilla/uniffi-rs", features = [ "build" ] } prost-build = { version = "0.12" } diff --git a/rust/build.rs b/rust/build.rs index 4e73c0431d..a411c00687 100644 --- a/rust/build.rs +++ b/rust/build.rs @@ -4,6 +4,9 @@ fn main() -> Result<()> { let mut prost_build = prost_build::Config::new(); // Enable a protoc experimental feature. prost_build.protoc_arg("--experimental_allow_proto3_optional"); - prost_build.compile_protos(&["src/mac_hw_info.proto"], &["src/"])?; + prost_build.compile_protos( + &["src/mac_hw_info.proto", "src/cloud_sync_outbound.proto"], + &["src/"], + )?; Ok(()) -} \ No newline at end of file +} diff --git a/rust/cloud_sync_protector_harness/Cargo.lock b/rust/cloud_sync_protector_harness/Cargo.lock new file mode 100644 index 0000000000..a743e2587a --- /dev/null +++ b/rust/cloud_sync_protector_harness/Cargo.lock @@ -0,0 +1,887 @@ +# This file is automatically @generated by Cargo. +# It is not intended for manual editing. +version = 4 + +[[package]] +name = "aead" +version = "0.5.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d122413f284cf2d62fb1b7db97e02edb8cda96d769b16e443a4f6195e35662b0" +dependencies = [ + "crypto-common", + "generic-array", +] + +[[package]] +name = "aes" +version = "0.8.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b169f7a6d4742236a0a00c541b845991d0ac43e546831af1249753ab4c3aa3a0" +dependencies = [ + "cfg-if", + "cipher", + "cpufeatures", +] + +[[package]] +name = "aes-gcm" +version = "0.10.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "831010a0f742e1209b3bcea8fab6a8e149051ba6099432c8cb2cc117dec3ead1" +dependencies = [ + "aead", + "aes", + "cipher", + "ctr", + "ghash", + "subtle", +] + +[[package]] +name = "base64" +version = "0.22.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "72b3254f16251a8381aa12e40e3c4d2f0199f8c6508fbecb9d91f575e0fbb8c6" + +[[package]] +name = "bitflags" +version = "2.13.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b588b76d00fde79687d7646a9b5bdf3cc0f655e0bbd080335a95d7e96f3587da" + +[[package]] +name = "block-buffer" +version = "0.10.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3078c7629b62d3f0439517fa394996acacc5cbc91c5a20d8c658e77abd503a71" +dependencies = [ + "generic-array", +] + +[[package]] +name = "bumpalo" +version = "3.20.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "72f5acc6cb2ba439de613abc23857ec3d78374d8ed5ac84e9d11336e87da8649" + +[[package]] +name = "cc" +version = "1.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5add81bb678e6cb321aff7fa0dc7689ad82b112dbc032cea19f91d6b8e3582b9" +dependencies = [ + "find-msvc-tools", + "shlex", +] + +[[package]] +name = "cfg-if" +version = "1.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9330f8b2ff13f34540b44e946ef35111825727b38d33286ef986142615121801" + +[[package]] +name = "cipher" +version = "0.4.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "773f3b9af64447d2ce9850330c473515014aa235e6a783b02db81ff39e4a3dad" +dependencies = [ + "crypto-common", + "inout", +] + +[[package]] +name = "cloud_sync_protector_harness" +version = "0.1.0" +dependencies = [ + "aes-gcm", + "base64", + "hmac", + "keystore", + "plist", + "rand", + "serde", + "sha2", + "tempfile", + "thiserror", + "uuid", + "windows-sys 0.59.0", +] + +[[package]] +name = "cpufeatures" +version = "0.2.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "59ed5838eebb26a2bb2e58f6d5b5316989ae9d08bab10e0e6d103e656d1b0280" +dependencies = [ + "libc", +] + +[[package]] +name = "crypto-common" +version = "0.1.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "78c8292055d1c1df0cce5d180393dc8cce0abec0a7102adb6c7b1eef6016d60a" +dependencies = [ + "generic-array", + "rand_core", + "typenum", +] + +[[package]] +name = "ctr" +version = "0.9.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0369ee1ad671834580515889b80f2ea915f23b8be8d0daa4bbaf2ac5c7590835" +dependencies = [ + "cipher", +] + +[[package]] +name = "deranged" +version = "0.5.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7cd812cc2bc1d69d4764bd80df88b4317eaef9e773c75226407d9bc0876b211c" + +[[package]] +name = "digest" +version = "0.10.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9ed9a281f7bc9b7576e61468ba615a66a5c8cfdff42420a70aa82701a3b1e292" +dependencies = [ + "block-buffer", + "crypto-common", + "subtle", +] + +[[package]] +name = "equivalent" +version = "1.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "877a4ace8713b0bcf2a4e7eec82529c029f1d0619886d18145fea96c3ffe5c0f" + +[[package]] +name = "errno" +version = "0.3.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "39cab71617ae0d63f51a36d69f866391735b51691dbda63cf6f96d042b63efeb" +dependencies = [ + "libc", + "windows-sys 0.61.2", +] + +[[package]] +name = "fastrand" +version = "2.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "da7c62ceae207dd37ea5b845da6a0696c799f85e97da1ab5b7910be3c1c80223" + +[[package]] +name = "find-msvc-tools" +version = "0.1.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5baebc0774151f905a1a2cc41989300b1e6fbb29aff0ceffa1064fdd3088d582" + +[[package]] +name = "foreign-types" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f6f339eb8adc052cd2ca78910fda869aefa38d22d5cb648e6485e4d3fc06f3b1" +dependencies = [ + "foreign-types-shared", +] + +[[package]] +name = "foreign-types-shared" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "00b0228411908ca8685dba7fc2cdd70ec9990a6e753e89b6ac91a84c40fbaf4b" + +[[package]] +name = "futures-core" +version = "0.3.33" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2cd50c473c80f6d7c3670a752354b8e569b1a7cbfdc0419ec88e5edad85e0dc7" + +[[package]] +name = "futures-task" +version = "0.3.33" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b231ed28831efb4a61a08580c4bc233ec56bc009f4cd8f52da2c3cb97df0c109" + +[[package]] +name = "futures-util" +version = "0.3.33" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a77a90a256fce34da66415271e30f94ee91c57b04b8a2c042d9cf3220179deaa" +dependencies = [ + "futures-core", + "futures-task", + "pin-project-lite", + "slab", +] + +[[package]] +name = "generic-array" +version = "0.14.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "85649ca51fd72272d7821adaf274ad91c288277713d9c18820d8499a7ff69e9a" +dependencies = [ + "typenum", + "version_check", +] + +[[package]] +name = "getrandom" +version = "0.2.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ff2abc00be7fca6ebc474524697ae276ad847ad0a6b3faa4bcb027e9a4614ad0" +dependencies = [ + "cfg-if", + "libc", + "wasi", +] + +[[package]] +name = "getrandom" +version = "0.4.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "300e883d756b2e4ec94e02791f39b04b522276138852cfc41d9fb7e904106099" +dependencies = [ + "cfg-if", + "libc", + "r-efi", +] + +[[package]] +name = "ghash" +version = "0.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f0d8a4362ccb29cb0b265253fb0a2728f592895ee6854fd9bc13f2ffda266ff1" +dependencies = [ + "opaque-debug", + "polyval", +] + +[[package]] +name = "hashbrown" +version = "0.17.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ed5909b6e89a2db4456e54cd5f673791d7eca6732202bbf2a9cc504fe2f9b84a" + +[[package]] +name = "hmac" +version = "0.12.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6c49c37c09c17a53d937dfbb742eb3a961d65a994e6bcdcf37e7399d0cc8ab5e" +dependencies = [ + "digest", +] + +[[package]] +name = "indexmap" +version = "2.14.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d466e9454f08e4a911e14806c24e16fba1b4c121d1ea474396f396069cf949d9" +dependencies = [ + "equivalent", + "hashbrown", +] + +[[package]] +name = "inout" +version = "0.1.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "879f10e63c20629ecabbb64a8010319738c66a5cd0c29b02d63d272b03751d01" +dependencies = [ + "generic-array", +] + +[[package]] +name = "js-sys" +version = "0.3.103" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "53b44bfcdb3f8d5837a46dae1ca9660a837176eee74a28b229bc626816589102" +dependencies = [ + "cfg-if", + "futures-util", + "wasm-bindgen", +] + +[[package]] +name = "keystore" +version = "0.1.0" +dependencies = [ + "aes-gcm", + "openssl", + "plist", + "rand", + "serde", + "sha2", + "thiserror", +] + +[[package]] +name = "libc" +version = "0.2.189" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3eaf3ede3fee6db1a4c2ee091bf8a8b4dccdc6d17f656fb07896ee72867612f2" + +[[package]] +name = "linux-raw-sys" +version = "0.12.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "32a66949e030da00e8c7d4434b251670a91556f4144941d37452769c25d58a53" + +[[package]] +name = "memchr" +version = "2.8.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cf8baf1c55e62ffcace7a9f06f4bd9cd3f0c4beb022d3b367256b91b87513d98" + +[[package]] +name = "num-conv" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "521739c6d2bac4aa25192232afe6841231376b2b26d4d9fae5ecf8ca5772e441" + +[[package]] +name = "once_cell" +version = "1.21.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9f7c3e4beb33f85d45ae3e3a1792185706c8e16d043238c593331cc7cd313b50" + +[[package]] +name = "opaque-debug" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c08d65885ee38876c4f86fa503fb49d7b507c2b62552df7c70b2fce627e06381" + +[[package]] +name = "openssl" +version = "0.10.81" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "77823a27f0babb03091cb9ed9ef80af3b39dbc82f97e8fa530374b7dafd87a45" +dependencies = [ + "bitflags", + "cfg-if", + "foreign-types", + "libc", + "openssl-macros", + "openssl-sys", +] + +[[package]] +name = "openssl-macros" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a948666b637a0f465e8564c73e89d4dde00d72d4d473cc972f390fc3dcee7d9c" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.119", +] + +[[package]] +name = "openssl-src" +version = "300.6.1+3.6.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "46eb8fb9fb3b61ce1c0f8a026c4c1a0714d3a9e138e7fbde78753ce2babc3846" +dependencies = [ + "cc", +] + +[[package]] +name = "openssl-sys" +version = "0.9.117" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b47e7e6bb2c38cd930d25a23b40fa52e068c10e85f3e03a7f5ba5aaca5713695" +dependencies = [ + "cc", + "libc", + "openssl-src", + "pkg-config", + "vcpkg", +] + +[[package]] +name = "pin-project-lite" +version = "0.2.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a89322df9ebe1c1578d689c92318e070967d1042b512afbe49518723f4e6d5cd" + +[[package]] +name = "pkg-config" +version = "0.3.33" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "19f132c84eca552bf34cab8ec81f1c1dcc229b811638f9d283dceabe58c5569e" + +[[package]] +name = "plist" +version = "1.10.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7da1d65da6dd5d1e44199ac0f58712d241c0f439f80adea8924d832384087f85" +dependencies = [ + "base64", + "indexmap", + "quick-xml", + "serde", + "time", +] + +[[package]] +name = "polyval" +version = "0.6.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9d1fe60d06143b2430aa532c94cfe9e29783047f06c0d7fd359a9a51b729fa25" +dependencies = [ + "cfg-if", + "cpufeatures", + "opaque-debug", + "universal-hash", +] + +[[package]] +name = "powerfmt" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "439ee305def115ba05938db6eb1644ff94165c5ab5e9420d1c1bcedbba909391" + +[[package]] +name = "ppv-lite86" +version = "0.2.21" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "85eae3c4ed2f50dcfe72643da4befc30deadb458a9b590d720cde2f2b1e97da9" +dependencies = [ + "zerocopy", +] + +[[package]] +name = "proc-macro2" +version = "1.0.107" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "985e7ec9bb745e6ce6535b544d84d6cd6f7ad8bd711c398938ae983b91a766d9" +dependencies = [ + "unicode-ident", +] + +[[package]] +name = "quick-xml" +version = "0.41.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e660451e55124f798a69a5af3f49ccfbefbd41910eefd25caf2393e1f3473ec1" +dependencies = [ + "memchr", +] + +[[package]] +name = "quote" +version = "1.0.47" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1fbf4db142a473a8d80c26bbf18454ed458bf8d26c8219c331daecfdbd079001" +dependencies = [ + "proc-macro2", +] + +[[package]] +name = "r-efi" +version = "6.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f8dcc9c7d52a811697d2151c701e0d08956f92b0e24136cf4cf27b57a6a0d9bf" + +[[package]] +name = "rand" +version = "0.8.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "22f6172bdec972074665ed81ed53b71da00bfc44b65a753cfde883ec4c702a1a" +dependencies = [ + "libc", + "rand_chacha", + "rand_core", +] + +[[package]] +name = "rand_chacha" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e6c10a63a0fa32252be49d21e7709d4d4baf8d231c2dbce1eaa8141b9b127d88" +dependencies = [ + "ppv-lite86", + "rand_core", +] + +[[package]] +name = "rand_core" +version = "0.6.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ec0be4795e2f6a28069bec0b5ff3e2ac9bafc99e6a9a7dc3547996c5c816922c" +dependencies = [ + "getrandom 0.2.17", +] + +[[package]] +name = "rustix" +version = "1.1.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b6fe4565b9518b83ef4f91bb47ce29620ca828bd32cb7e408f0062e9930ba190" +dependencies = [ + "bitflags", + "errno", + "libc", + "linux-raw-sys", + "windows-sys 0.61.2", +] + +[[package]] +name = "rustversion" +version = "1.0.23" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cf54715a573b99ac80df0bc206da022bcd442c974952c7b9720069370852e21f" + +[[package]] +name = "serde" +version = "1.0.229" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4148590afebada386688f18773da617792bf2ef03ffc1e4cbd2b1d45b023e0ba" +dependencies = [ + "serde_core", + "serde_derive", +] + +[[package]] +name = "serde_core" +version = "1.0.229" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "67dca2c9c51e58a4791a4b1ed58308b39c64224d349a935ab5039aa360942a48" +dependencies = [ + "serde_derive", +] + +[[package]] +name = "serde_derive" +version = "1.0.229" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e7a5d71263a5a7d47b41f6b3f06ba276f10cc18b0931f1799f710578e2309348" +dependencies = [ + "proc-macro2", + "quote", + "syn 3.0.3", +] + +[[package]] +name = "sha2" +version = "0.10.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a7507d819769d01a365ab707794a4084392c824f54a7a6a7862f8c3d0892b283" +dependencies = [ + "cfg-if", + "cpufeatures", + "digest", +] + +[[package]] +name = "shlex" +version = "2.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f8fadd59c855ef2080decdef8ff161eb6661b86933c9d82e5ba29dc602a55aba" + +[[package]] +name = "slab" +version = "0.4.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0c790de23124f9ab44544d7ac05d60440adc586479ce501c1d6d7da3cd8c9cf5" + +[[package]] +name = "subtle" +version = "2.6.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "13c2bddecc57b384dee18652358fb23172facb8a2c51ccc10d74c157bdea3292" + +[[package]] +name = "syn" +version = "2.0.119" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "872831b642d1a07999a962a351ed35b955ea2cfc8f3862091e2a240a84f17297" +dependencies = [ + "proc-macro2", + "quote", + "unicode-ident", +] + +[[package]] +name = "syn" +version = "3.0.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "53e9bae58849f64dfa4f5d5ae372c8341f7305f82a3868709269343628b659a3" +dependencies = [ + "proc-macro2", + "quote", + "unicode-ident", +] + +[[package]] +name = "tempfile" +version = "3.27.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "32497e9a4c7b38532efcdebeef879707aa9f794296a4f0244f6f69e9bc8574bd" +dependencies = [ + "fastrand", + "getrandom 0.4.3", + "once_cell", + "rustix", + "windows-sys 0.61.2", +] + +[[package]] +name = "thiserror" +version = "1.0.69" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b6aaf5339b578ea85b50e080feb250a3e8ae8cfcdff9a461c9ec2904bc923f52" +dependencies = [ + "thiserror-impl", +] + +[[package]] +name = "thiserror-impl" +version = "1.0.69" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4fee6c4efc90059e10f81e6d42c60a18f76588c3d74cb83a0b242a2b6c7504c1" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.119", +] + +[[package]] +name = "time" +version = "0.3.55" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cdb87b95ec50ddfa440816d227a17b2ccbdda963a316a727fda0fc4334f7d134" +dependencies = [ + "deranged", + "num-conv", + "powerfmt", + "serde_core", + "time-core", + "time-macros", +] + +[[package]] +name = "time-core" +version = "0.1.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9e1c906769ad99c88eaa54e728060edef082f8e358ff32030cb7c7d315e81109" + +[[package]] +name = "time-macros" +version = "0.2.32" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7e689342a48d2ea927c87ea50cabf8594854bf940e9310208848d680d668ed85" +dependencies = [ + "num-conv", + "time-core", +] + +[[package]] +name = "typenum" +version = "1.20.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b6f5e870be6c3b371b77fe0ee0bafb859fa4964b4404c27de1d380043c4dda20" + +[[package]] +name = "unicode-ident" +version = "1.0.24" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e6e4313cd5fcd3dad5cafa179702e2b244f760991f45397d14d4ebf38247da75" + +[[package]] +name = "universal-hash" +version = "0.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fc1de2c688dc15305988b563c3854064043356019f97a4b46276fe734c4f07ea" +dependencies = [ + "crypto-common", + "subtle", +] + +[[package]] +name = "uuid" +version = "1.24.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bf3923a6f5c4c6382e0b653c4117f48d631ea17f38ed86e2a828e6f7412f5239" +dependencies = [ + "getrandom 0.4.3", + "js-sys", + "wasm-bindgen", +] + +[[package]] +name = "vcpkg" +version = "0.2.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "accd4ea62f7bb7a82fe23066fb0957d48ef677f6eeb8215f372f52e48bb32426" + +[[package]] +name = "version_check" +version = "0.9.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0b928f33d975fc6ad9f86c8f283853ad26bdd5b10b7f1542aa2fa15e2289105a" + +[[package]] +name = "wasi" +version = "0.11.1+wasi-snapshot-preview1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ccf3ec651a847eb01de73ccad15eb7d99f80485de043efb2f370cd654f4ea44b" + +[[package]] +name = "wasm-bindgen" +version = "0.2.126" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4b067c0c11094aef6b7a801c1e34a26affafdf3d051dba08456b868789aaf9a4" +dependencies = [ + "cfg-if", + "once_cell", + "rustversion", + "wasm-bindgen-macro", + "wasm-bindgen-shared", +] + +[[package]] +name = "wasm-bindgen-macro" +version = "0.2.126" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "167ce5e579f6bcf889c4f7175a8a5a585de84e8ff93976ce393efa5f2837aab1" +dependencies = [ + "quote", + "wasm-bindgen-macro-support", +] + +[[package]] +name = "wasm-bindgen-macro-support" +version = "0.2.126" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f3997c7839262f4ef12cf90b818d6340c18e80f263f1a94bf157d0ec4420380e" +dependencies = [ + "bumpalo", + "proc-macro2", + "quote", + "syn 2.0.119", + "wasm-bindgen-shared", +] + +[[package]] +name = "wasm-bindgen-shared" +version = "0.2.126" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dc1b4cb0cc549fcf58d7dfc081778139b3d283a081644e833e84682ad71cea24" +dependencies = [ + "unicode-ident", +] + +[[package]] +name = "windows-link" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f0805222e57f7521d6a62e36fa9163bc891acd422f971defe97d64e70d0a4fe5" + +[[package]] +name = "windows-sys" +version = "0.59.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1e38bc4d79ed67fd075bcc251a1c39b32a1776bbe92e5bef1f0bf1f8c531853b" +dependencies = [ + "windows-targets", +] + +[[package]] +name = "windows-sys" +version = "0.61.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ae137229bcbd6cdf0f7b80a31df61766145077ddf49416a728b02cb3921ff3fc" +dependencies = [ + "windows-link", +] + +[[package]] +name = "windows-targets" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9b724f72796e036ab90c1021d4780d4d3d648aca59e491e6b98e725b84e99973" +dependencies = [ + "windows_aarch64_gnullvm", + "windows_aarch64_msvc", + "windows_i686_gnu", + "windows_i686_gnullvm", + "windows_i686_msvc", + "windows_x86_64_gnu", + "windows_x86_64_gnullvm", + "windows_x86_64_msvc", +] + +[[package]] +name = "windows_aarch64_gnullvm" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "32a4622180e7a0ec044bb555404c800bc9fd9ec262ec147edd5989ccd0c02cd3" + +[[package]] +name = "windows_aarch64_msvc" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "09ec2a7bb152e2252b53fa7803150007879548bc709c039df7627cabbd05d469" + +[[package]] +name = "windows_i686_gnu" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8e9b5ad5ab802e97eb8e295ac6720e509ee4c243f69d781394014ebfe8bbfa0b" + +[[package]] +name = "windows_i686_gnullvm" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0eee52d38c090b3caa76c563b86c3a4bd71ef1a819287c19d586d7334ae8ed66" + +[[package]] +name = "windows_i686_msvc" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "240948bc05c5e7c6dabba28bf89d89ffce3e303022809e73deaefe4f6ec56c66" + +[[package]] +name = "windows_x86_64_gnu" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "147a5c80aabfbf0c7d901cb5895d1de30ef2907eb21fbbab29ca94c5b08b1a78" + +[[package]] +name = "windows_x86_64_gnullvm" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "24d5b23dc417412679681396f2b49f3de8c1473deb516bd34410872eff51ed0d" + +[[package]] +name = "windows_x86_64_msvc" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "589f6da84c646204747d1270a2a5661ea66ed1cced2631d546fdfb155959f9ec" + +[[package]] +name = "zerocopy" +version = "0.8.55" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b5a105cd7b140f6eeec8acff2ea38135d3cab283ada58540f629fe51e46696eb" +dependencies = [ + "zerocopy-derive", +] + +[[package]] +name = "zerocopy-derive" +version = "0.8.55" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0fe976fb70c78cd64cccfe3a6fc142244e8a77b70959b30faf9d0ac37ee228eb" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.119", +] diff --git a/rust/cloud_sync_protector_harness/Cargo.toml b/rust/cloud_sync_protector_harness/Cargo.toml new file mode 100644 index 0000000000..7ff6b3f08e --- /dev/null +++ b/rust/cloud_sync_protector_harness/Cargo.toml @@ -0,0 +1,25 @@ +[package] +name = "cloud_sync_protector_harness" +version = "0.1.0" +edition = "2021" +publish = false + +[dependencies] +aes-gcm = "0.10.3" +base64 = "0.22.1" +hmac = "0.12.1" +keystore = { path = "../../rustpush/keystore" } +plist = "1.5.0" +rand = "0.8.5" +serde = { version = "1.0", features = ["derive"] } +sha2 = "0.10.8" +tempfile = "3" +thiserror = "1.0.47" +uuid = { version = "1.4.1", features = ["v4"] } + +[target.'cfg(target_os = "windows")'.dependencies] +windows-sys = { version = "=0.59.0", features = [ + "Win32_Foundation", + "Win32_Security_Cryptography", + "Win32_Storage_FileSystem", +] } diff --git a/rust/cloud_sync_protector_harness/src/lib.rs b/rust/cloud_sync_protector_harness/src/lib.rs new file mode 100644 index 0000000000..b8c9373c2a --- /dev/null +++ b/rust/cloud_sync_protector_harness/src/lib.rs @@ -0,0 +1,24 @@ +//! Lightweight host harness for the platform-neutral Cloud Sync protector +//! envelope, HMAC, corruption, and race tests. +//! +//! The full application crate pulls in legacy platform dependencies that do +//! not build on every development host. Keeping this harness dependency-small +//! lets those security invariants run independently. + +#![allow(dead_code)] + +#[cfg(target_os = "windows")] +#[path = "../../src/windows_secret_storage.rs"] +mod windows_secret_storage; + +// The protector derives its native-only semantic identifier hasher from the +// same per-install secret, so the harness links that hasher and the canonical +// validation types it reports through. Both are dependency-light by design. +#[path = "../../src/cloud_sync_canonical_dto.rs"] +mod cloud_sync_canonical_dto; + +#[path = "../../src/cloud_sync_semantic_identity.rs"] +mod cloud_sync_semantic_identity; + +#[path = "../../src/cloud_sync_protector.rs"] +mod cloud_sync_protector; diff --git a/rust/src/api/api.rs b/rust/src/api/api.rs index 59b1379cca..2364d60799 100644 --- a/rust/src/api/api.rs +++ b/rust/src/api/api.rs @@ -1,45 +1,105 @@ - - -use std::{borrow::{Borrow, BorrowMut}, collections::HashSet, fs::{self, File}, future::Future, io::{Cursor, Read, Write}, ops::Deref, panic, str::FromStr, sync::{Arc, OnceLock, Weak}, time::Duration, u64}; -pub use std::time::SystemTime; +#[cfg(target_os = "windows")] +use crate::windows_secret_storage::open_windows_keystore; use anyhow::anyhow; -use flutter_rust_bridge::{DartFnFuture, IntoDart, JoinHandle, frb}; +use flutter_rust_bridge::{frb, DartFnFuture, IntoDart, JoinHandle}; +#[cfg(all(not(target_os = "android"), not(target_os = "windows")))] +use keystore::software::SoftwareEncryptor; #[cfg(not(target_os = "android"))] -use keystore::software::{SoftwareEncryptor, SoftwareKeystore}; -use keystore::{AesKeystoreKey, EcCurve, EcKeystoreKey, EncryptMode, KeystoreAccessRules, KeystoreDigest, KeystoreEncryptKey, KeystorePadding, RsaKey, init_keystore, keystore}; -pub use rustpush::{default_provider, ArcAnisetteClient, LoginClientInfo, DefaultAnisetteProvider}; +use keystore::software::SoftwareKeystore; +use keystore::{ + init_keystore, keystore, AesKeystoreKey, EcCurve, EcKeystoreKey, EncryptMode, + KeystoreAccessRules, KeystoreDigest, KeystoreEncryptKey, KeystorePadding, RsaKey, +}; use log::{debug, error, info, warn}; -use plist::{Data, Dictionary}; pub use plist::Value; +use plist::{Data, Dictionary}; +pub use rustpush::{default_provider, ArcAnisetteClient, DefaultAnisetteProvider, LoginClientInfo}; use sha2::Digest; +pub use std::time::SystemTime; +use std::{ + borrow::{Borrow, BorrowMut}, + collections::HashSet, + fs::{self, File}, + future::Future, + io::{Cursor, Read, Write}, + ops::Deref, + panic, + str::FromStr, + sync::{Arc, OnceLock, Weak}, + time::Duration, + u64, +}; -pub use rustpush::DebugMutex as Mutex; -pub use std::path::PathBuf; -use prost::Message as prostMessage; -use serde::{Deserialize, Deserializer, Serialize, Serializer}; -use tokio::{runtime::Runtime, select, sync::{broadcast, mpsc, watch, RwLock}}; +use async_recursion::async_recursion; +use base64::prelude::*; +pub use broadcast::Receiver; pub use mpsc::Sender; -pub use rustpush::{APSMessage, CircleClientSession, CircleServerSession, EntitlementAuthState, IDSNGMIdentity, LoginDelegate, MADRID_SERVICE, TokenProvider, authenticate_apple, authenticate_phone, authenticate_smsless, cloud_messages::CloudMessagesClient, cloudkit::{CloudKitClient, CloudKitState}, facetime::{FACETIME_SERVICE, FTClient, FTState, VIDEO_SERVICE}, findmy::{FindMyClient, FindMyState, FindMyStateManager, MULTIPLEX_SERVICE}, keychain::{KeychainClient, KeychainClientState}, login_apple_delegates, name_photo_sharing::ProfilesClient, sharedstreams::{AssetMetadata, FFMpegFilePackager, FileMetadata, FilePackager, PreparedAsset, PreparedFile, SharedStreamClient, SharedStreamsState, SyncController, SyncManager, SyncState}, statuskit::{ChannelInterestToken, StatusKitClient, StatusKitState, StatusKitStatus}}; -use rustpush::{AnisetteProvider, DebugRwLock, cloudkit::contact_info_to_handle, cloudkit_proto::{CuttlefishSerializedKey, base64_encode}, findmy::SharedBeaconClient, keychain::{CloudKey, CurrentBottle, SivKey}, passwords::PasswordState, request_update_account}; -pub use rustpush::findmy::{FindMyFriendsClient, FindMyPhoneClient}; -pub use rustpush::sharedstreams::{SharedAlbum, SyncStatus}; +use prost::Message as prostMessage; +use rand::Rng; pub use rustpush::cloudkit_proto::EscrowData; +pub use rustpush::findmy::{FindMyFriendsClient, FindMyPhoneClient}; pub use rustpush::passwords::PasswordManager; -use uniffi::HandleAlloc; -use rand::Rng; -use uuid::Uuid; +pub use rustpush::sharedstreams::{SharedAlbum, SyncStatus}; +pub use rustpush::DebugMutex as Mutex; +pub use rustpush::IdmsAuthListener; use rustpush::KeyCache; +pub use rustpush::{ + authenticate_apple, authenticate_phone, authenticate_smsless, + cloud_messages::CloudMessagesClient, + cloudkit::{CloudKitClient, CloudKitState}, + facetime::{FTClient, FTState, FACETIME_SERVICE, VIDEO_SERVICE}, + findmy::{FindMyClient, FindMyState, FindMyStateManager, MULTIPLEX_SERVICE}, + keychain::{KeychainClient, KeychainClientState}, + login_apple_delegates, + name_photo_sharing::ProfilesClient, + sharedstreams::{ + AssetMetadata, FFMpegFilePackager, FileMetadata, FilePackager, PreparedAsset, PreparedFile, + SharedStreamClient, SharedStreamsState, SyncController, SyncManager, SyncState, + }, + statuskit::{ChannelInterestToken, StatusKitClient, StatusKitState, StatusKitStatus}, + APSMessage, CircleClientSession, CircleServerSession, EntitlementAuthState, IDSNGMIdentity, + LoginDelegate, TokenProvider, MADRID_SERVICE, +}; +use rustpush::{ + cloud_messages::{CloudMessageRecordKind, CloudMessageRecordPage}, + cloudkit::{classify_cloudkit_failure, CloudKitFailureClass}, + CloudKitProtocolError, +}; +use rustpush::{ + cloudkit::contact_info_to_handle, + cloudkit_proto::{base64_encode, CuttlefishSerializedKey}, + findmy::SharedBeaconClient, + keychain::{CloudKey, CurrentBottle, SivKey}, + passwords::PasswordState, + request_update_account, AnisetteProvider, DebugRwLock, +}; +use serde::{Deserialize, Deserializer, Serialize, Serializer}; use std::io::Seek; -use async_recursion::async_recursion; -use base64::prelude::*; -pub use rustpush::IdmsAuthListener; -pub use broadcast::Receiver; +pub use std::path::PathBuf; +use tokio::{ + runtime::Runtime, + select, + sync::{broadcast, mpsc, watch, RwLock}, +}; +use uniffi::HandleAlloc; +use uuid::Uuid; -use crate::{RUNTIME, frb_generated::{SseEncode, StreamSink}, init_logger, native::{HANDLE_WIFI_NETWORKS, PACKAGER_LOCK, PackagedFile, QUEUED_MESSAGES}}; +use crate::{ + frb_generated::{SseEncode, StreamSink}, + init_logger, + native::{PackagedFile, HANDLE_WIFI_NETWORKS, PACKAGER_LOCK, QUEUED_MESSAGES}, + RUNTIME, +}; -use flutter_rust_bridge::for_generated::{SimpleHandler, SimpleExecutor, NoOpErrorListener, SimpleThreadPool, BaseAsyncRuntime, lazy_static}; +use flutter_rust_bridge::for_generated::{ + lazy_static, BaseAsyncRuntime, NoOpErrorListener, SimpleExecutor, SimpleHandler, + SimpleThreadPool, +}; -pub type MyHandler = SimpleHandler, NoOpErrorListener>; +pub type MyHandler = SimpleHandler< + SimpleExecutor, + NoOpErrorListener, +>; include!("./mirrors.rs"); @@ -71,6 +131,2562 @@ pub fn do_first_time_init(path: String) { init_logger(&dir); } +/// Protects one Cloud Sync V2 value at rest. +/// +/// The complete scope and purpose are authenticated by the platform bridge. +/// This function does not perform CloudKit I/O or enable sync writes. +#[frb(sync)] +#[allow(clippy::too_many_arguments)] +pub fn cloud_sync_protect( + storage_directory: String, + account_fingerprint: String, + container: String, + database: String, + zone: String, + stream_kind: String, + schema_version: u32, + purpose: String, + plaintext: String, +) -> anyhow::Result { + crate::cloud_sync_protector::protect( + storage_directory, + account_fingerprint, + container, + database, + zone, + stream_kind, + schema_version, + purpose, + plaintext, + ) + .map_err(Into::into) +} + +/// Opens one Cloud Sync V2 value only in its original scope and purpose. +#[frb(sync)] +#[allow(clippy::too_many_arguments)] +pub fn cloud_sync_unprotect( + storage_directory: String, + account_fingerprint: String, + container: String, + database: String, + zone: String, + stream_kind: String, + schema_version: u32, + purpose: String, + ciphertext: String, +) -> anyhow::Result { + crate::cloud_sync_protector::unprotect( + storage_directory, + account_fingerprint, + container, + database, + zone, + stream_kind, + schema_version, + purpose, + ciphertext, + ) + .map_err(Into::into) +} + +/// Returns a per-install HMAC-SHA256 account fingerprint. +#[frb(sync)] +pub fn cloud_sync_fingerprint_account( + storage_directory: String, + raw_account_identifier: String, +) -> anyhow::Result { + crate::cloud_sync_protector::fingerprint_account(storage_directory, raw_account_identifier) + .map_err(Into::into) +} + +/// Redacted identity binding for one active Cloud Messages client. +/// +/// The raw DSID is read and transformed entirely in Rust. Only two +/// per-install HMAC values cross FRB: an account fingerprint and a +/// process-local client-generation tag. Neither value is an Apple credential. +pub struct CloudSyncNativeAuthMetadata { + pub native_session_id: String, + pub account_fingerprint: String, + pub protected_store_identity: String, +} + +pub async fn cloud_sync_capture_auth_snapshot( + cloud_messages_client: &Arc>, + storage_directory: String, +) -> anyhow::Result { + let raw_account_identifier = cloud_messages_client.native_account_identifier().await; + if raw_account_identifier.is_empty() { + return Err(anyhow!("Cloud Messages account identity is unavailable")); + } + let account_fingerprint = crate::cloud_sync_protector::fingerprint_account( + storage_directory.clone(), + raw_account_identifier.clone(), + )?; + let client_generation_input = format!( + "{raw_account_identifier}\0client:{:p}", + Arc::as_ptr(cloud_messages_client) + ); + let native_session_id = crate::cloud_sync_protector::fingerprint_account( + storage_directory.clone(), + client_generation_input, + )?; + let protected_store_identity = + crate::cloud_sync_protector::protected_store_identity(storage_directory)?; + Ok(CloudSyncNativeAuthMetadata { + native_session_id, + account_fingerprint, + protected_store_identity, + }) +} + +// CLOUD_SYNC_PROTECTED_DTO_BEGIN +/// D0-safe change disposition emitted by the native protected fetch boundary. +#[derive(Clone, Copy, Debug, Eq, PartialEq)] +pub enum CloudSyncProtectedChangeKind { + Save, + Delete, + Quarantined, +} + +/// Fixed, content-free preflight classification. +#[derive(Clone, Copy, Debug, Eq, PartialEq)] +pub enum CloudSyncProtectedPreflightCode { + UnsupportedRecordType, + MalformedMetadata, + OversizedRecord, + InvalidChangeShape, +} + +/// One protected CloudKit change. Every string is either a fixed-format digest +/// or an opaque `obcs2.ref.*` capability. No Apple identifier or record body is +/// present. +#[derive(Clone, Debug)] +pub struct CloudSyncProtectedChange { + pub change_id: String, + pub record_id_hash: String, + pub etag_hash: Option, + pub kind: CloudSyncProtectedChangeKind, + pub payload_sha256: String, + pub payload_length: u64, + pub protected_record_identity_reference: String, + pub protected_raw_envelope_reference: String, + pub server_modified_at_millis: Option, + pub preflight_code: Option, + pub is_tombstone: bool, +} + +/// One bounded protected page. Checkpoints and page leases remain opaque +/// native-store references. +#[derive(Clone, Debug)] +pub struct CloudSyncProtectedPage { + pub changes: Vec, + pub batch_id: String, + pub generation: u64, + pub page_lease_reference: String, + pub protected_next_checkpoint_reference: Option, + pub complete: bool, + pub admitted_raw_bytes: u64, +} + +#[derive(Clone, Copy, Debug, Eq, PartialEq)] +pub enum CloudSyncProtectedFailureCategory { + Network, + Throttled, + Server, + Authorization, + PcsUnavailable, + MalformedRecord, + Conflict, + LocalStorage, + Unknown, +} + +/// Fixed safe-code vocabulary for the protected bridge. These variants carry +/// no server body, path, token, identifier, or record content. +#[derive(Clone, Copy, Debug, Eq, PartialEq)] +pub enum CloudSyncProtectedSafeCode { + InvalidScope, + InvalidRequest, + InvalidCheckpoint, + CheckpointContextMismatch, + OversizedPage, + OversizedRecord, + ProtectionFailed, + LocalStoreFailed, + FetchDeadline, + Network, + CloudKitThrottled, + CloudKitServer, + CloudKitAuthorization, + CloudKitConflict, + CloudKitResetRequired, + CloudKitPermanent, + CloudKitUnknown, + HttpAuthorization, + HttpTimeout, + HttpThrottled, + HttpServer, + HttpUnknown, + PcsUnavailable, + MalformedResponse, + ContinuationNoProgress, + NativeAuthUnavailable, + Unknown, +} + +#[derive(Clone, Debug)] +pub struct CloudSyncProtectedFailure { + pub category: CloudSyncProtectedFailureCategory, + pub safe_code: CloudSyncProtectedSafeCode, + pub retry_after_seconds: Option, +} + +/// Exactly one of `page` and `failure` is populated. +#[derive(Clone, Debug)] +pub struct CloudSyncProtectedFetchResult { + pub page: Option, + pub failure: Option, +} + +/// A lease mutation succeeds only when `failure` is absent. +#[derive(Clone, Debug)] +pub struct CloudSyncProtectedLeaseResult { + pub failure: Option, +} + +#[derive(Clone, Debug)] +pub struct CloudSyncProtectedRecovery { + pub finalized_adopted_lease_references: Vec, + pub absent_adopted_lease_references: Vec, + pub rolled_back_count: u32, + pub removed_temporary_files_count: u32, + pub has_more: bool, +} + +/// Exactly one of `recovery` and `failure` is populated. +#[derive(Clone, Debug)] +pub struct CloudSyncProtectedRecoveryResult { + pub recovery: Option, + pub failure: Option, +} + +#[derive(Clone, Debug)] +pub struct CloudSyncProtectedRetirementResult { + pub retired_count: u32, + pub failure: Option, +} + +#[derive(Clone, Debug)] +pub struct CloudSyncProtectedGarbageCollection { + pub scanned_count: u32, + pub first_observed_count: u32, + pub deleted_count: u32, + pub preserved_live_count: u32, + pub preserved_active_lease_count: u32, + pub has_more: bool, +} + +#[derive(Clone, Debug)] +pub struct CloudSyncProtectedGarbageCollectionResult { + pub collection: Option, + pub failure: Option, +} +// CLOUD_SYNC_PROTECTED_DTO_END + +// CLOUD_SYNC_OUTBOUND_DTO_BEGIN +#[derive(Clone, Copy, Debug, Eq, PartialEq)] +pub enum CloudSyncOutboundSafeCode { + InvalidScope, + InvalidRequest, + UnsupportedMessage, + MalformedMessage, + OversizedMessage, + ProtectedStorage, + BindingMismatch, + NativeAuthUnavailable, + NativePrepareFailed, + AlreadyConsumed, + CorrelationMismatch, +} + +#[derive(Clone, Debug)] +pub struct CloudSyncProtectedOutboundStage { + pub logical_entity_key_hash: String, + pub protected_payload_reference: String, + pub payload_sha256: String, + pub payload_length: u64, + pub protected_server_record_reference: String, + pub server_record_id_hash: String, + pub lease_reference: String, +} + +#[derive(Debug)] +pub struct CloudSyncProtectedOutboundStageResult { + pub stage: Option, + pub failure: Option, +} + +#[derive(Clone, Debug)] +pub struct CloudSyncPreparedMessageCreateInput { + pub local_operation_id: String, + pub logical_entity_key_hash: String, + pub protected_lease_reference: String, + pub protected_payload_reference: String, + pub payload_sha256: String, + pub protected_server_record_reference: String, + pub server_record_id_hash: String, + pub apple_operation_uuid: String, +} + +#[frb(opaque)] +pub struct CloudSyncPreparedMessageCreateHandle { + prepared: tokio::sync::Mutex< + Option< + rustpush::cloud_messages::CloudMessagesPreparedSaveSubmission, + >, + >, +} + +impl std::fmt::Debug for CloudSyncPreparedMessageCreateHandle { + fn fmt(&self, formatter: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { + formatter.write_str("CloudSyncPreparedMessageCreateHandle(redacted)") + } +} + +#[derive(Debug)] +pub struct CloudSyncPreparedMessageCreateResult { + pub handle: Option, + pub failure: Option, +} + +#[derive(Clone, Copy, Debug, Eq, PartialEq)] +pub enum CloudSyncOutboundSaveDisposition { + Succeeded, + UnknownOutcome, + Failed, +} + +#[derive(Clone, Copy, Debug, Eq, PartialEq)] +pub enum CloudSyncOutboundFailureClass { + Throttled, + TransientServer, + Authentication, + Conflict, + ResetRequired, + Permanent, + Unknown, +} + +#[derive(Clone, Debug)] +pub struct CloudSyncOutboundSaveOutcome { + pub local_operation_id: String, + pub apple_operation_uuid: String, + pub disposition: CloudSyncOutboundSaveDisposition, + pub failure_class: Option, + pub retry_after_seconds: Option, +} + +#[derive(Clone, Debug)] +pub struct CloudSyncOutboundConsumeResult { + pub outcomes: Vec, + pub failure: Option, +} + +#[derive(Clone, Copy, Debug, Eq, PartialEq)] +pub enum CloudSyncOutboundReconcileDisposition { + Committed, + NotApplied, + Diverged, + Unresolved, +} + +#[derive(Clone, Debug)] +pub struct CloudSyncOutboundReconcileResult { + pub disposition: Option, + pub protected_proof_reference: Option, + pub failure_class: Option, + pub retry_after_seconds: Option, + pub failure: Option, +} +// CLOUD_SYNC_OUTBOUND_DTO_END + +// CLOUD_SYNC_TRANSIENT_DTO_BEGIN +/// D1-only entity vocabulary. These values are safe fixed discriminants. +#[derive(Clone, Copy, Debug, Eq, PartialEq)] +pub enum CloudSyncTransientEntityKind { + Chat, + Message, + Reaction, + Attachment, + GroupPhoto, +} + +#[derive(Clone, Copy, Debug, Eq, PartialEq)] +pub enum CloudSyncTransientMutationKind { + Upsert, + Tombstone, +} + +#[derive(Clone, Copy, Debug, Eq, PartialEq)] +pub enum CloudSyncTransientFieldState { + Absent, + Value, + ExplicitClear, +} + +#[derive(Clone, Copy, Debug, Eq, PartialEq)] +pub enum CloudSyncTransientService { + IMessage, +} + +#[derive(Clone, Copy, Debug, Eq, PartialEq)] +pub enum CloudSyncTransientChatStyle { + Direct, + Group, +} + +#[derive(Clone, Copy, Debug, Eq, PartialEq)] +pub enum CloudSyncTransientReactionKind { + Heart, + Like, + Dislike, + Laugh, + Emphasize, + Question, + Emoji, + StickerBack, +} + +#[derive(Clone, Copy, Debug, Eq, PartialEq)] +pub enum CloudSyncTransientAssociationKind { + None, + Sticker, + ReactionAdd, + ReactionRemove, +} + +#[derive(Clone, Copy, Debug, Eq, PartialEq)] +pub enum CloudSyncTransientDeferredReason { + NestedPresenceUnavailable, + UnprovenEditTimestamp, + UnsupportedExtensionPayload, + UnsupportedMediaCredentials, + UnsupportedGroupPhoto, + UnsupportedSticker, + UnsupportedScheduling, + UnsupportedOffGridMetadata, + UnsupportedNegativeAttachmentSize, +} + +#[derive(Clone, Copy, Debug, Eq, PartialEq)] +pub enum CloudSyncTransientQuarantineReason { + MalformedRequiredIdentity, + FieldPresenceMismatch, + UnsupportedService, + UnsupportedChatStyle, + UnsupportedMessageType, + UnsupportedAssociationType, + MalformedParent, + AmbiguousReply, + MalformedAttributedBody, + MalformedMessageSummary, + ConflictingEditAndRetraction, + OversizedContent, + InvalidCanonicalPayload, + MalformedRecord, +} + +#[derive(Clone, Copy, Debug, Eq, PartialEq)] +pub enum CloudSyncTransientFailureCode { + InvalidRequest, + ActiveAccountMismatch, + ScopeMismatch, + GenerationMismatch, + StoreIdentityMismatch, + ProtectedReferenceMismatch, + MalformedRecord, + OversizedRecord, + PcsUnavailable, + RetryableUpstream, + DecoderFailure, +} + +/// Content-free edit metadata used by the merge policy. +#[derive(Clone)] +pub struct CloudSyncTransientEditPart { + pub part_key_hash: String, + pub revision: u32, + pub content_digest: String, + pub modified_at_millis: i64, +} + +#[derive(Clone)] +pub struct CloudSyncTransientKnownMessageFlags { + pub from_me: bool, + pub delivered: bool, + pub read: bool, + pub has_data_detector_results: bool, + pub delivered_quietly: bool, + pub did_notify_recipient: bool, +} + +#[derive(Clone)] +pub struct CloudSyncTransientTextRun { + pub start_utf16: u32, + pub length_utf16: u32, + pub message_part: Option, + pub attachment_canonical_guid: Option, + pub attachment_logical_key_hash: Option, + pub mention_handle: Option, + pub audio_transcript: Option, + pub text_effect: Option, + pub bold: Option, + pub italic: Option, + pub strikethrough: Option, + pub underline: Option, +} + +#[derive(Clone)] +pub struct CloudSyncTransientAttributedBody { + pub text: String, + pub runs: Vec, +} + +#[derive(Clone)] +pub struct CloudSyncTransientMessageEdit { + pub part: u32, + pub revision: u32, + pub bodies: Vec, + pub modified_at_millis: i64, + pub original_range_location: Option, + pub original_range_length: Option, +} + +/// Content-free canonical snapshot. The opaque protected source reference is +/// retained so unknown semantics can be retried by a later decoder. +#[derive(Clone)] +pub struct CloudSyncTransientSnapshot { + pub entity_kind: CloudSyncTransientEntityKind, + pub logical_entity_key_hash: String, + pub parent_logical_key_hash: Option, + pub immutable_content_digest: Option, + pub created_at_millis: Option, + pub read_at_millis: Option, + pub delivered_at_millis: Option, + pub edit_parts: Vec, + pub retracted_at_millis: Option, + pub group_version: Option, + pub group_metadata_digest: Option, + pub etag_hash: Option, + pub protected_source_reference: String, +} + +/// Transient chat content. This type has no Debug, Display, serde, or durable +/// representation and must flow directly into the canonical applier. +#[derive(Clone)] +pub struct CloudSyncTransientChatPayload { + pub logical_entity_key_hash: String, + /// Validated application-level chat GUID. Transient typed memory only. + pub canonical_guid: String, + /// Validated iMessage chat identifier used to bind message records. + pub chat_identifier: String, + pub group_id: String, + pub original_group_id: String, + pub service: CloudSyncTransientService, + pub style: CloudSyncTransientChatStyle, + pub participant_handles: Vec, + pub display_name_state: CloudSyncTransientFieldState, + pub display_name: Option, + pub last_addressed_handle_state: CloudSyncTransientFieldState, + pub last_addressed_handle: Option, + pub group_version_state: CloudSyncTransientFieldState, + pub group_version: Option, + pub last_seen_message_guid_state: CloudSyncTransientFieldState, + pub last_seen_message_guid: Option, + pub group_photo_guid_state: CloudSyncTransientFieldState, + pub group_photo_guid: Option, +} + +/// Transient message/reaction content. Raw CloudKit record names and Apple +/// private identifiers are deliberately absent; validated app canonical +/// identities may cross this typed in-memory boundary. +#[derive(Clone)] +pub struct CloudSyncTransientMessagePayload { + pub logical_entity_key_hash: String, + /// Validated application-level message/reaction GUID. Transient only. + pub canonical_guid: String, + pub chat_alias_key_hash: String, + pub chat_identifier: String, + pub sender_handle: String, + pub created_at_millis: i64, + pub error: i64, + pub service: CloudSyncTransientService, + pub subject_state: CloudSyncTransientFieldState, + pub subject: Option, + pub body_state: CloudSyncTransientFieldState, + pub body: Option, + pub attributed_bodies_state: CloudSyncTransientFieldState, + pub attributed_bodies: Vec, + pub balloon_bundle_id_state: CloudSyncTransientFieldState, + pub balloon_bundle_id: Option, + pub effect_state: CloudSyncTransientFieldState, + pub effect: Option, + pub read_at_millis_state: CloudSyncTransientFieldState, + pub read_at_millis: Option, + pub delivered_at_millis_state: CloudSyncTransientFieldState, + pub delivered_at_millis: Option, + pub known_flags: CloudSyncTransientKnownMessageFlags, + pub association_kind: CloudSyncTransientAssociationKind, + pub reaction_kind: Option, + pub reaction_removed: bool, + pub reaction_parent_logical_key_hash: Option, + pub reaction_parent_canonical_guid: Option, + pub reaction_parent_part: Option, + pub associated_range_location: Option, + pub associated_range_length: Option, + pub reply_parent_logical_key_hash: Option, + pub reply_parent_canonical_guid: Option, + pub reply_parent_part: Option, + pub edits_state: CloudSyncTransientFieldState, + pub edits: Vec, + pub retracted_parts_state: CloudSyncTransientFieldState, + pub retracted_parts: Vec, + pub associated_emoji_state: CloudSyncTransientFieldState, + pub associated_emoji: Option, +} + +#[derive(Clone)] +pub struct CloudSyncTransientAttachmentPayload { + pub logical_entity_key_hash: String, + pub canonical_guid: String, + pub owner_logical_key_hash: Option, + pub owner_canonical_guid: Option, + pub owner_part: Option, + pub uti_state: CloudSyncTransientFieldState, + pub uti: Option, + pub file_name_state: CloudSyncTransientFieldState, + pub file_name: Option, + pub mime_type_state: CloudSyncTransientFieldState, + pub mime_type: Option, + pub total_bytes_state: CloudSyncTransientFieldState, + pub total_bytes: Option, + pub is_outgoing_state: CloudSyncTransientFieldState, + pub is_outgoing: Option, + pub protected_local_reference_state: CloudSyncTransientFieldState, + pub protected_local_reference: Option, +} + +#[derive(Clone)] +pub struct CloudSyncTransientGroupPhotoPayload { + pub logical_entity_key_hash: String, + pub owner_logical_key_hash: String, + pub photo_guid: String, + pub protected_local_reference: String, +} + +/// Exactly one payload member is populated for an upsert. +#[derive(Clone)] +pub struct CloudSyncTransientPayload { + pub chat: Option, + pub message: Option, + pub attachment: Option, + pub group_photo: Option, +} + +#[derive(Clone)] +pub struct CloudSyncTransientTombstone { + pub entity_kind: CloudSyncTransientEntityKind, + pub logical_entity_key_hash: String, + pub deleted_at_millis: Option, + pub server_confirmed: bool, +} + +/// A bounded, single-record D1 result. Exactly one of `mutation`, +/// `deferred_reason`, `quarantine_reason`, and `failure_code` is populated. +/// The optional source capability is echoed only after it passes the native +/// protected-reference grammar. +#[derive(Clone)] +pub struct CloudSyncTransientDecodeResult { + pub protected_source_reference: Option, + pub generation: u64, + pub change_id: Option, + pub entity_kind: Option, + pub mutation_kind: Option, + pub snapshot: Option, + pub payload: Option, + pub tombstone: Option, + pub deferred_reason: Option, + pub quarantine_reason: Option, + pub failure_code: Option, +} +// CLOUD_SYNC_TRANSIENT_DTO_END + +fn map_cloud_sync_outbound_failure( + failure: crate::cloud_sync_outbound::CloudSyncOutboundFailure, +) -> CloudSyncOutboundSafeCode { + use crate::cloud_sync_outbound::CloudSyncOutboundFailure as Native; + match failure { + Native::UnsupportedMessage => CloudSyncOutboundSafeCode::UnsupportedMessage, + Native::MalformedMessage => CloudSyncOutboundSafeCode::MalformedMessage, + Native::OversizedMessage => CloudSyncOutboundSafeCode::OversizedMessage, + Native::ProtectedStorage => CloudSyncOutboundSafeCode::ProtectedStorage, + Native::BindingMismatch => CloudSyncOutboundSafeCode::BindingMismatch, + } +} + +fn map_cloud_sync_outbound_failure_class( + failure: rustpush::cloudkit::CloudKitFailureClass, +) -> CloudSyncOutboundFailureClass { + use rustpush::cloudkit::CloudKitFailureClass as Native; + match failure { + Native::Throttled => CloudSyncOutboundFailureClass::Throttled, + Native::TransientServer => CloudSyncOutboundFailureClass::TransientServer, + Native::Authentication => CloudSyncOutboundFailureClass::Authentication, + Native::Conflict => CloudSyncOutboundFailureClass::Conflict, + Native::ResetRequired => CloudSyncOutboundFailureClass::ResetRequired, + Native::Permanent => CloudSyncOutboundFailureClass::Permanent, + Native::Unknown => CloudSyncOutboundFailureClass::Unknown, + } +} + +fn cloud_sync_outbound_failure_result( + failure: CloudSyncOutboundSafeCode, +) -> CloudSyncProtectedOutboundStageResult { + CloudSyncProtectedOutboundStageResult { + stage: None, + failure: Some(failure), + } +} + +/// Converts one transient outgoing iMessage into a protected, crash-recoverable +/// outbox payload and stable server-record mapping. Message content and the raw +/// server record name remain native-only. +pub async fn cloud_sync_stage_outbound_message( + cloud_messages_client: &Arc>, + storage_directory: String, + expected_account_fingerprint: String, + expected_protected_store_identity: String, + message: CloudMessage, +) -> CloudSyncProtectedOutboundStageResult { + let auth = + match cloud_sync_capture_auth_snapshot(cloud_messages_client, storage_directory.clone()) + .await + { + Ok(auth) => auth, + Err(_) => { + return cloud_sync_outbound_failure_result( + CloudSyncOutboundSafeCode::NativeAuthUnavailable, + ) + } + }; + if expected_account_fingerprint != auth.account_fingerprint + || expected_protected_store_identity != auth.protected_store_identity + { + return cloud_sync_outbound_failure_result(CloudSyncOutboundSafeCode::InvalidScope); + } + match crate::cloud_sync_outbound::stage_outbound_message( + PathBuf::from(storage_directory), + auth.account_fingerprint, + message, + ) { + Ok(stage) => CloudSyncProtectedOutboundStageResult { + stage: Some(CloudSyncProtectedOutboundStage { + logical_entity_key_hash: stage.logical_entity_key_hash, + protected_payload_reference: stage.protected_payload_reference, + payload_sha256: stage.payload_sha256, + payload_length: stage.payload_length, + protected_server_record_reference: stage.protected_server_record_reference, + server_record_id_hash: stage.server_record_id_hash, + lease_reference: stage.lease_reference, + }), + failure: None, + }, + Err(failure) => { + cloud_sync_outbound_failure_result(map_cloud_sync_outbound_failure(failure)) + } + } +} + +fn cloud_sync_prepare_failure( + failure: CloudSyncOutboundSafeCode, +) -> CloudSyncPreparedMessageCreateResult { + CloudSyncPreparedMessageCreateResult { + handle: None, + failure: Some(failure), + } +} + +fn is_cloud_sync_hex_digest(value: &str) -> bool { + value.len() == 64 + && value + .bytes() + .all(|byte| byte.is_ascii_digit() || matches!(byte, b'a'..=b'f')) +} + +fn is_cloud_sync_operation_id(value: &str) -> bool { + value.len() == 68 + && value.starts_with("op1:") + && value[4..] + .bytes() + .all(|byte| byte.is_ascii_digit() || matches!(byte, b'a'..=b'f')) +} + +fn is_cloud_sync_keyed_hash(value: &str) -> bool { + value.len() == 43 + && value + .bytes() + .all(|byte| byte.is_ascii_alphanumeric() || matches!(byte, b'_' | b'-')) +} + +fn is_cloud_sync_protected_reference(value: &str) -> bool { + value.len() == 53 && value.starts_with("obcs2.ref.") && is_cloud_sync_keyed_hash(&value[10..]) +} + +fn is_cloud_sync_lease_reference(value: &str) -> bool { + value.len() == 44 + && value.starts_with("obcs2.lease.") + && value[12..] + .bytes() + .all(|byte| byte.is_ascii_digit() || matches!(byte, b'a'..=b'f')) +} + +/// Prepares a create-only CloudKit request without performing remote I/O. The +/// returned opaque handle owns PCS material, prepared authentication, exact +/// request identity, and all operations. It can be consumed only once. +#[allow(clippy::too_many_arguments)] +pub async fn cloud_sync_prepare_message_create( + cloud_messages_client: &Arc>, + storage_directory: String, + expected_account_fingerprint: String, + expected_protected_store_identity: String, + request_uuid: String, + request_timeout_seconds: u64, + inputs: Vec, +) -> CloudSyncPreparedMessageCreateResult { + if inputs.is_empty() + || inputs.len() > 200 + || request_timeout_seconds == 0 + || request_timeout_seconds > 300 + { + return cloud_sync_prepare_failure(CloudSyncOutboundSafeCode::InvalidRequest); + } + let auth = + match cloud_sync_capture_auth_snapshot(cloud_messages_client, storage_directory.clone()) + .await + { + Ok(auth) => auth, + Err(_) => { + return cloud_sync_prepare_failure(CloudSyncOutboundSafeCode::NativeAuthUnavailable) + } + }; + if auth.account_fingerprint != expected_account_fingerprint + || auth.protected_store_identity != expected_protected_store_identity + { + return cloud_sync_prepare_failure(CloudSyncOutboundSafeCode::InvalidScope); + } + + let mut local_ids = HashSet::with_capacity(inputs.len()); + let mut lease_references = HashSet::with_capacity(inputs.len()); + let mut payload_references = HashSet::with_capacity(inputs.len()); + let mut server_references = HashSet::with_capacity(inputs.len()); + let mut server_hashes = HashSet::with_capacity(inputs.len()); + if inputs.iter().any(|input| { + !is_cloud_sync_operation_id(&input.local_operation_id) + || crate::cloud_sync_outbound::initial_message_create_operation_id( + &expected_account_fingerprint, + &input.logical_entity_key_hash, + ) + .as_deref() + != Ok(input.local_operation_id.as_str()) + || !is_cloud_sync_keyed_hash(&input.logical_entity_key_hash) + || !is_cloud_sync_lease_reference(&input.protected_lease_reference) + || !is_cloud_sync_protected_reference(&input.protected_payload_reference) + || !is_cloud_sync_hex_digest(&input.payload_sha256) + || !is_cloud_sync_protected_reference(&input.protected_server_record_reference) + || !is_cloud_sync_keyed_hash(&input.server_record_id_hash) + || input.protected_payload_reference != input.protected_server_record_reference + || !local_ids.insert(input.local_operation_id.as_str()) + || !lease_references.insert(input.protected_lease_reference.as_str()) + || !payload_references.insert(input.protected_payload_reference.as_str()) + || !server_references.insert(input.protected_server_record_reference.as_str()) + || !server_hashes.insert(input.server_record_id_hash.as_str()) + }) { + return cloud_sync_prepare_failure(CloudSyncOutboundSafeCode::InvalidRequest); + } + + let operation_uuids = inputs + .iter() + .map(|input| input.apple_operation_uuid.clone()) + .collect::>(); + if operation_uuids.iter().any(|uuid| uuid == &request_uuid) { + return cloud_sync_prepare_failure(CloudSyncOutboundSafeCode::InvalidRequest); + } + let request_identity = + match rustpush::cloudkit::CloudKitRequestIdentity::new(request_uuid, operation_uuids) { + Ok(identity) => identity, + Err(_) => return cloud_sync_prepare_failure(CloudSyncOutboundSafeCode::InvalidRequest), + }; + let hasher = + match crate::cloud_sync_protector::semantic_identifier_hasher(storage_directory.clone()) { + Ok(hasher) => hasher, + Err(_) => { + return cloud_sync_prepare_failure(CloudSyncOutboundSafeCode::ProtectedStorage) + } + }; + + let storage_path = PathBuf::from(&storage_directory); + let mut messages = Vec::with_capacity(inputs.len()); + for input in inputs { + if crate::cloud_sync_native_fetch::cloud_sync_verify_committed_lease_exact( + storage_path.clone(), + &input.protected_lease_reference, + std::slice::from_ref(&input.protected_payload_reference), + ) + .is_err() + { + return cloud_sync_prepare_failure(CloudSyncOutboundSafeCode::ProtectedStorage); + } + let message = match crate::cloud_sync_outbound::open_staged_outbound_message( + storage_path.clone(), + auth.account_fingerprint.clone(), + &input.protected_payload_reference, + &input.payload_sha256, + ) { + Ok(message) => message, + Err(failure) => { + return cloud_sync_prepare_failure(map_cloud_sync_outbound_failure(failure)) + } + }; + let logical_hash = match hasher.canonical_entity_key_hash( + crate::cloud_sync_canonical_dto::CloudCanonicalEntityKind::Message, + &message.guid, + ) { + Ok(hash) => hash, + Err(_) => { + return cloud_sync_prepare_failure(CloudSyncOutboundSafeCode::BindingMismatch) + } + }; + if logical_hash.value() != input.logical_entity_key_hash { + return cloud_sync_prepare_failure(CloudSyncOutboundSafeCode::BindingMismatch); + } + let server_record_name = match crate::cloud_sync_outbound::open_staged_server_record_name( + storage_path.clone(), + auth.account_fingerprint.clone(), + &input.protected_server_record_reference, + &input.server_record_id_hash, + ) { + Ok(record_name) => record_name, + Err(failure) => { + return cloud_sync_prepare_failure(map_cloud_sync_outbound_failure(failure)) + } + }; + messages.push(rustpush::cloud_messages::CloudMessageSaveInput { + local_operation_id: input.local_operation_id, + server_record_name, + apple_operation_uuid: input.apple_operation_uuid, + message, + }); + } + + match cloud_messages_client + .prepare_message_save_submission( + messages, + request_identity, + Duration::from_secs(request_timeout_seconds), + ) + .await + { + Ok(prepared) => CloudSyncPreparedMessageCreateResult { + handle: Some(CloudSyncPreparedMessageCreateHandle { + prepared: tokio::sync::Mutex::new(Some(prepared)), + }), + failure: None, + }, + Err(_) => cloud_sync_prepare_failure(CloudSyncOutboundSafeCode::NativePrepareFailed), + } +} + +pub async fn cloud_sync_consume_prepared_message_create( + handle: &CloudSyncPreparedMessageCreateHandle, +) -> CloudSyncOutboundConsumeResult { + let prepared = { + let mut guard = handle.prepared.lock().await; + guard.take() + }; + let Some(prepared) = prepared else { + return CloudSyncOutboundConsumeResult { + outcomes: vec![], + failure: Some(CloudSyncOutboundSafeCode::AlreadyConsumed), + }; + }; + let outcomes = match prepared.consume_once().await { + Ok(outcomes) => outcomes, + Err(_) => { + return CloudSyncOutboundConsumeResult { + outcomes: vec![], + failure: Some(CloudSyncOutboundSafeCode::CorrelationMismatch), + } + } + }; + CloudSyncOutboundConsumeResult { + outcomes: outcomes + .into_iter() + .map(|outcome| { + use rustpush::cloud_messages::CloudMessagesSaveResult as NativeResult; + let (disposition, failure_class, retry_after_seconds) = match outcome.result { + NativeResult::Succeeded => { + (CloudSyncOutboundSaveDisposition::Succeeded, None, None) + } + NativeResult::UnknownOutcome { + failure_class, + retry_after, + } => ( + CloudSyncOutboundSaveDisposition::UnknownOutcome, + failure_class.map(map_cloud_sync_outbound_failure_class), + retry_after.map(|value| value.as_secs()), + ), + NativeResult::Failed { + failure_class, + retry_after, + .. + } => ( + CloudSyncOutboundSaveDisposition::Failed, + failure_class.map(map_cloud_sync_outbound_failure_class), + retry_after.map(|value| value.as_secs()), + ), + }; + CloudSyncOutboundSaveOutcome { + local_operation_id: outcome.local_operation_id, + apple_operation_uuid: outcome.apple_operation_uuid, + disposition, + failure_class, + retry_after_seconds, + } + }) + .collect(), + failure: None, + } +} + +fn cloud_sync_reconcile_failure( + failure: CloudSyncOutboundSafeCode, +) -> CloudSyncOutboundReconcileResult { + CloudSyncOutboundReconcileResult { + disposition: None, + protected_proof_reference: None, + failure_class: None, + retry_after_seconds: None, + failure: Some(failure), + } +} + +fn is_valid_cloud_sync_reconcile_message_create_input( + expected_account_fingerprint: &str, + request_uuid: &str, + input: &CloudSyncPreparedMessageCreateInput, +) -> bool { + is_cloud_sync_operation_id(&input.local_operation_id) + && crate::cloud_sync_outbound::initial_message_create_operation_id( + expected_account_fingerprint, + &input.logical_entity_key_hash, + ) + .as_deref() + == Ok(input.local_operation_id.as_str()) + && is_cloud_sync_keyed_hash(&input.logical_entity_key_hash) + && is_cloud_sync_lease_reference(&input.protected_lease_reference) + && is_cloud_sync_protected_reference(&input.protected_payload_reference) + && is_cloud_sync_hex_digest(&input.payload_sha256) + && is_cloud_sync_protected_reference(&input.protected_server_record_reference) + && is_cloud_sync_keyed_hash(&input.server_record_id_hash) + && input.protected_payload_reference == input.protected_server_record_reference + && request_uuid != input.apple_operation_uuid + && rustpush::cloudkit::CloudKitRequestIdentity::new( + request_uuid.to_owned(), + vec![input.apple_operation_uuid.clone()], + ) + .is_ok() +} + +enum CloudSyncReconcileObservation { + FoundPayloadDigest(String), + DivergedRecord, + NotFound, + Unresolved { + failure_class: Option, + retry_after: Option, + }, + UnknownFailure, +} + +fn classify_cloud_sync_reconcile_observation( + observation: CloudSyncReconcileObservation, + expected_payload_sha256: &str, + protected_proof_reference: String, +) -> CloudSyncOutboundReconcileResult { + let (disposition, failure_class, retry_after_seconds, decisive) = match observation { + CloudSyncReconcileObservation::FoundPayloadDigest(observed_digest) + if observed_digest == expected_payload_sha256 => + { + ( + CloudSyncOutboundReconcileDisposition::Committed, + None, + None, + true, + ) + } + CloudSyncReconcileObservation::FoundPayloadDigest(_) + | CloudSyncReconcileObservation::DivergedRecord => ( + CloudSyncOutboundReconcileDisposition::Diverged, + Some(CloudSyncOutboundFailureClass::Conflict), + None, + true, + ), + CloudSyncReconcileObservation::NotFound => ( + CloudSyncOutboundReconcileDisposition::NotApplied, + None, + None, + true, + ), + CloudSyncReconcileObservation::Unresolved { + failure_class, + retry_after, + } => ( + CloudSyncOutboundReconcileDisposition::Unresolved, + failure_class.map(map_cloud_sync_outbound_failure_class), + retry_after.map(|value| value.as_secs()), + false, + ), + CloudSyncReconcileObservation::UnknownFailure => ( + CloudSyncOutboundReconcileDisposition::Unresolved, + Some(CloudSyncOutboundFailureClass::Unknown), + None, + false, + ), + }; + CloudSyncOutboundReconcileResult { + disposition: Some(disposition), + protected_proof_reference: decisive.then_some(protected_proof_reference), + failure_class, + retry_after_seconds, + failure: None, + } +} + +/// Reconciles one ambiguous create by fetching its stable CloudKit record name +/// and comparing the decrypted server message with the exact protected payload +/// staged before submission. Only explicit record absence permits replay. +#[allow(clippy::too_many_arguments)] +pub async fn cloud_sync_reconcile_message_create( + cloud_messages_client: &Arc>, + storage_directory: String, + expected_account_fingerprint: String, + expected_protected_store_identity: String, + request_uuid: String, + input: CloudSyncPreparedMessageCreateInput, +) -> CloudSyncOutboundReconcileResult { + if !is_valid_cloud_sync_reconcile_message_create_input( + &expected_account_fingerprint, + &request_uuid, + &input, + ) { + return cloud_sync_reconcile_failure(CloudSyncOutboundSafeCode::InvalidRequest); + } + let auth = + match cloud_sync_capture_auth_snapshot(cloud_messages_client, storage_directory.clone()) + .await + { + Ok(auth) => auth, + Err(_) => { + return cloud_sync_reconcile_failure( + CloudSyncOutboundSafeCode::NativeAuthUnavailable, + ) + } + }; + if auth.account_fingerprint != expected_account_fingerprint + || auth.protected_store_identity != expected_protected_store_identity + { + return cloud_sync_reconcile_failure(CloudSyncOutboundSafeCode::InvalidScope); + } + + let storage_path = PathBuf::from(&storage_directory); + if crate::cloud_sync_native_fetch::cloud_sync_verify_committed_lease_exact( + storage_path.clone(), + &input.protected_lease_reference, + std::slice::from_ref(&input.protected_payload_reference), + ) + .is_err() + { + return cloud_sync_reconcile_failure(CloudSyncOutboundSafeCode::ProtectedStorage); + } + let expected_message = match crate::cloud_sync_outbound::open_staged_outbound_message( + storage_path.clone(), + auth.account_fingerprint.clone(), + &input.protected_payload_reference, + &input.payload_sha256, + ) { + Ok(message) => message, + Err(failure) => { + return cloud_sync_reconcile_failure(map_cloud_sync_outbound_failure(failure)) + } + }; + let hasher = + match crate::cloud_sync_protector::semantic_identifier_hasher(storage_directory.clone()) { + Ok(hasher) => hasher, + Err(_) => { + return cloud_sync_reconcile_failure(CloudSyncOutboundSafeCode::ProtectedStorage) + } + }; + let logical_hash = match hasher.canonical_entity_key_hash( + crate::cloud_sync_canonical_dto::CloudCanonicalEntityKind::Message, + &expected_message.guid, + ) { + Ok(hash) => hash, + Err(_) => return cloud_sync_reconcile_failure(CloudSyncOutboundSafeCode::BindingMismatch), + }; + if logical_hash.value() != input.logical_entity_key_hash { + return cloud_sync_reconcile_failure(CloudSyncOutboundSafeCode::BindingMismatch); + } + let server_record_name = match crate::cloud_sync_outbound::open_staged_server_record_name( + storage_path, + auth.account_fingerprint, + &input.protected_server_record_reference, + &input.server_record_id_hash, + ) { + Ok(record_name) => record_name, + Err(failure) => { + return cloud_sync_reconcile_failure(map_cloud_sync_outbound_failure(failure)) + } + }; + + use rustpush::cloud_messages::CloudMessageRecordLookup; + let observation = match cloud_messages_client + .lookup_message_record(&server_record_name) + .await + { + Ok(CloudMessageRecordLookup::Found(message)) => { + match crate::cloud_sync_outbound::outbound_message_payload_sha256( + message, + &server_record_name, + ) { + Ok(digest) => CloudSyncReconcileObservation::FoundPayloadDigest(digest), + Err(_) => CloudSyncReconcileObservation::DivergedRecord, + } + } + Ok(CloudMessageRecordLookup::NotFound) => CloudSyncReconcileObservation::NotFound, + Ok(CloudMessageRecordLookup::Unresolved { + failure_class, + retry_after, + }) => CloudSyncReconcileObservation::Unresolved { + failure_class, + retry_after, + }, + Err(_) => CloudSyncReconcileObservation::UnknownFailure, + }; + classify_cloud_sync_reconcile_observation( + observation, + &input.payload_sha256, + input.protected_payload_reference, + ) +} + +#[cfg(test)] +mod cloud_sync_outbound_reconcile_contract_tests { + use super::*; + + const REQUEST_UUID: &str = "11111111-2222-4ABC-8DEF-555555555555"; + const OPERATION_UUID: &str = "AAAAAAAA-BBBB-4CCC-8DDD-000000000001"; + + fn account() -> String { + "A".repeat(43) + } + + fn input() -> CloudSyncPreparedMessageCreateInput { + let logical_entity_key_hash = "L".repeat(43); + CloudSyncPreparedMessageCreateInput { + local_operation_id: crate::cloud_sync_outbound::initial_message_create_operation_id( + &account(), + &logical_entity_key_hash, + ) + .unwrap(), + logical_entity_key_hash, + protected_lease_reference: format!("obcs2.lease.{}", "a".repeat(32)), + protected_payload_reference: format!("obcs2.ref.{}", "P".repeat(43)), + payload_sha256: "b".repeat(64), + protected_server_record_reference: format!("obcs2.ref.{}", "P".repeat(43)), + server_record_id_hash: "S".repeat(43), + apple_operation_uuid: OPERATION_UUID.to_owned(), + } + } + + #[test] + fn reconciliation_input_binds_the_semantic_operation_and_both_uuids() { + let valid = input(); + assert!(is_valid_cloud_sync_reconcile_message_create_input( + &account(), + REQUEST_UUID, + &valid + )); + + let mut wrong_operation_id = valid.clone(); + wrong_operation_id.local_operation_id = format!("op1:{}", "f".repeat(64)); + assert!(!is_valid_cloud_sync_reconcile_message_create_input( + &account(), + REQUEST_UUID, + &wrong_operation_id + )); + + assert!(!is_valid_cloud_sync_reconcile_message_create_input( + &"B".repeat(43), + REQUEST_UUID, + &valid + )); + assert!(!is_valid_cloud_sync_reconcile_message_create_input( + &account(), + OPERATION_UUID, + &valid + )); + + let mut malformed_operation_uuid = valid; + malformed_operation_uuid.apple_operation_uuid = OPERATION_UUID.to_lowercase(); + assert!(!is_valid_cloud_sync_reconcile_message_create_input( + &account(), + REQUEST_UUID, + &malformed_operation_uuid + )); + } + + #[test] + fn exact_digest_commits_and_explicit_absence_is_the_only_replay_proof() { + let protected_reference = format!("obcs2.ref.{}", "P".repeat(43)); + let expected_digest = "b".repeat(64); + let committed = classify_cloud_sync_reconcile_observation( + CloudSyncReconcileObservation::FoundPayloadDigest(expected_digest.clone()), + &expected_digest, + protected_reference.clone(), + ); + assert_eq!( + committed.disposition, + Some(CloudSyncOutboundReconcileDisposition::Committed) + ); + assert_eq!( + committed.protected_proof_reference, + Some(protected_reference.clone()) + ); + assert_eq!(committed.failure_class, None); + + let absent = classify_cloud_sync_reconcile_observation( + CloudSyncReconcileObservation::NotFound, + &expected_digest, + protected_reference.clone(), + ); + assert_eq!( + absent.disposition, + Some(CloudSyncOutboundReconcileDisposition::NotApplied) + ); + assert_eq!(absent.protected_proof_reference, Some(protected_reference)); + assert_eq!(absent.failure_class, None); + } + + #[test] + fn divergent_or_malformed_found_records_quarantine_as_conflicts() { + for observation in [ + CloudSyncReconcileObservation::FoundPayloadDigest("c".repeat(64)), + CloudSyncReconcileObservation::DivergedRecord, + ] { + let result = classify_cloud_sync_reconcile_observation( + observation, + &"b".repeat(64), + format!("obcs2.ref.{}", "P".repeat(43)), + ); + assert_eq!( + result.disposition, + Some(CloudSyncOutboundReconcileDisposition::Diverged) + ); + assert_eq!( + result.failure_class, + Some(CloudSyncOutboundFailureClass::Conflict) + ); + assert!(result.protected_proof_reference.is_some()); + assert_eq!(result.retry_after_seconds, None); + } + } + + #[test] + fn transient_and_transport_or_decrypt_failures_never_emit_a_proof() { + let transient = classify_cloud_sync_reconcile_observation( + CloudSyncReconcileObservation::Unresolved { + failure_class: Some(CloudKitFailureClass::TransientServer), + retry_after: Some(Duration::from_secs(901)), + }, + &"b".repeat(64), + format!("obcs2.ref.{}", "P".repeat(43)), + ); + assert_eq!( + transient.disposition, + Some(CloudSyncOutboundReconcileDisposition::Unresolved) + ); + assert_eq!( + transient.failure_class, + Some(CloudSyncOutboundFailureClass::TransientServer) + ); + assert_eq!(transient.retry_after_seconds, Some(901)); + assert_eq!(transient.protected_proof_reference, None); + + let failed = classify_cloud_sync_reconcile_observation( + CloudSyncReconcileObservation::UnknownFailure, + &"b".repeat(64), + format!("obcs2.ref.{}", "P".repeat(43)), + ); + assert_eq!( + failed.disposition, + Some(CloudSyncOutboundReconcileDisposition::Unresolved) + ); + assert_eq!( + failed.failure_class, + Some(CloudSyncOutboundFailureClass::Unknown) + ); + assert_eq!(failed.protected_proof_reference, None); + } +} + +fn map_cloud_sync_protected_category( + category: crate::cloud_sync_native_fetch::CloudNativeFailureCategory, +) -> CloudSyncProtectedFailureCategory { + use crate::cloud_sync_native_fetch::CloudNativeFailureCategory as Native; + match category { + Native::Network => CloudSyncProtectedFailureCategory::Network, + Native::Throttled => CloudSyncProtectedFailureCategory::Throttled, + Native::Server => CloudSyncProtectedFailureCategory::Server, + Native::Authorization => CloudSyncProtectedFailureCategory::Authorization, + Native::PcsUnavailable => CloudSyncProtectedFailureCategory::PcsUnavailable, + Native::MalformedRecord => CloudSyncProtectedFailureCategory::MalformedRecord, + Native::Conflict => CloudSyncProtectedFailureCategory::Conflict, + Native::LocalStorage => CloudSyncProtectedFailureCategory::LocalStorage, + Native::Unknown => CloudSyncProtectedFailureCategory::Unknown, + } +} + +fn map_cloud_sync_protected_safe_code( + safe_code: crate::cloud_sync_native_fetch::CloudNativeSafeCode, +) -> CloudSyncProtectedSafeCode { + use crate::cloud_sync_native_fetch::CloudNativeSafeCode as Native; + match safe_code { + Native::InvalidScope => CloudSyncProtectedSafeCode::InvalidScope, + Native::InvalidRequest => CloudSyncProtectedSafeCode::InvalidRequest, + Native::InvalidCheckpoint => CloudSyncProtectedSafeCode::InvalidCheckpoint, + Native::CheckpointContextMismatch => CloudSyncProtectedSafeCode::CheckpointContextMismatch, + Native::OversizedPage => CloudSyncProtectedSafeCode::OversizedPage, + Native::OversizedRecord => CloudSyncProtectedSafeCode::OversizedRecord, + Native::ProtectionFailed => CloudSyncProtectedSafeCode::ProtectionFailed, + Native::LocalStoreFailed => CloudSyncProtectedSafeCode::LocalStoreFailed, + Native::FetchDeadline => CloudSyncProtectedSafeCode::FetchDeadline, + Native::Network => CloudSyncProtectedSafeCode::Network, + Native::CloudKitThrottled => CloudSyncProtectedSafeCode::CloudKitThrottled, + Native::CloudKitServer => CloudSyncProtectedSafeCode::CloudKitServer, + Native::CloudKitAuthorization => CloudSyncProtectedSafeCode::CloudKitAuthorization, + Native::CloudKitConflict => CloudSyncProtectedSafeCode::CloudKitConflict, + Native::CloudKitResetRequired => CloudSyncProtectedSafeCode::CloudKitResetRequired, + Native::CloudKitPermanent => CloudSyncProtectedSafeCode::CloudKitPermanent, + Native::CloudKitUnknown => CloudSyncProtectedSafeCode::CloudKitUnknown, + Native::HttpAuthorization => CloudSyncProtectedSafeCode::HttpAuthorization, + Native::HttpTimeout => CloudSyncProtectedSafeCode::HttpTimeout, + Native::HttpThrottled => CloudSyncProtectedSafeCode::HttpThrottled, + Native::HttpServer => CloudSyncProtectedSafeCode::HttpServer, + Native::HttpUnknown => CloudSyncProtectedSafeCode::HttpUnknown, + Native::PcsUnavailable => CloudSyncProtectedSafeCode::PcsUnavailable, + Native::MalformedResponse => CloudSyncProtectedSafeCode::MalformedResponse, + Native::ContinuationNoProgress => CloudSyncProtectedSafeCode::ContinuationNoProgress, + Native::Unknown => CloudSyncProtectedSafeCode::Unknown, + } +} + +fn map_cloud_sync_protected_failure( + failure: &crate::cloud_sync_native_fetch::CloudNativeFetchFailure, +) -> CloudSyncProtectedFailure { + CloudSyncProtectedFailure { + category: map_cloud_sync_protected_category(failure.category()), + safe_code: map_cloud_sync_protected_safe_code(failure.safe_code()), + retry_after_seconds: failure.retry_after_seconds(), + } +} + +fn local_cloud_sync_protected_failure( + category: CloudSyncProtectedFailureCategory, + safe_code: CloudSyncProtectedSafeCode, +) -> CloudSyncProtectedFailure { + CloudSyncProtectedFailure { + category, + safe_code, + retry_after_seconds: None, + } +} + +fn map_cloud_sync_protected_change( + change: &crate::cloud_sync_native_fetch::CloudNativeProtectedChange, +) -> CloudSyncProtectedChange { + use crate::cloud_sync_native_fetch::{ + CloudNativeChangeKind as NativeKind, CloudNativePreflightCode as NativePreflight, + }; + let kind = match change.kind() { + NativeKind::Save => CloudSyncProtectedChangeKind::Save, + NativeKind::Delete => CloudSyncProtectedChangeKind::Delete, + NativeKind::Quarantined => CloudSyncProtectedChangeKind::Quarantined, + }; + let preflight_code = change.preflight_code().map(|code| match code { + NativePreflight::UnsupportedRecordType => { + CloudSyncProtectedPreflightCode::UnsupportedRecordType + } + NativePreflight::MalformedMetadata => CloudSyncProtectedPreflightCode::MalformedMetadata, + NativePreflight::OversizedRecord => CloudSyncProtectedPreflightCode::OversizedRecord, + NativePreflight::InvalidChangeShape => CloudSyncProtectedPreflightCode::InvalidChangeShape, + }); + CloudSyncProtectedChange { + change_id: change.change_id().to_owned(), + record_id_hash: change.record_id_hash().to_owned(), + etag_hash: change.etag_hash().map(str::to_owned), + kind, + payload_sha256: change.payload_digest().to_owned(), + payload_length: change.payload_length(), + protected_record_identity_reference: change + .protected_record_identity_reference() + .to_owned(), + protected_raw_envelope_reference: change.protected_raw_envelope_reference().to_owned(), + server_modified_at_millis: change.server_modified_at_millis(), + preflight_code, + is_tombstone: change.is_tombstone(), + } +} + +fn map_cloud_sync_protected_page( + page: &crate::cloud_sync_native_fetch::CloudNativeProtectedPage, +) -> CloudSyncProtectedPage { + CloudSyncProtectedPage { + changes: page + .changes() + .iter() + .map(map_cloud_sync_protected_change) + .collect(), + batch_id: page.batch_id().to_owned(), + generation: page.generation(), + page_lease_reference: page.page_lease_reference().to_owned(), + protected_next_checkpoint_reference: page + .protected_next_checkpoint_reference() + .map(str::to_owned), + complete: page.complete(), + admitted_raw_bytes: page.admitted_raw_bytes(), + } +} + +/// Fetches and protects one bounded CloudKit page without allowing raw record +/// material, Apple identifiers, etags, continuation tokens, or paths to cross +/// Flutter Rust Bridge. +pub async fn cloud_sync_fetch_protected_page( + cloud_messages_client: &Arc>, + storage_directory: String, + expected_account_fingerprint: String, + stream: String, + generation: u64, + previous_checkpoint_reference: Option, + maximum_changes: u32, +) -> CloudSyncProtectedFetchResult { + use crate::cloud_sync_native_fetch::{ + CloudNativeFetchRequest, CloudNativeProtectedFetchOutcome, CloudNativeProtectionScope, + CloudNativeStream, + }; + + let Some(stream) = CloudNativeStream::parse(&stream) else { + return CloudSyncProtectedFetchResult { + page: None, + failure: Some(local_cloud_sync_protected_failure( + CloudSyncProtectedFailureCategory::MalformedRecord, + CloudSyncProtectedSafeCode::InvalidRequest, + )), + }; + }; + let auth = + match cloud_sync_capture_auth_snapshot(cloud_messages_client, storage_directory.clone()) + .await + { + Ok(auth) => auth, + Err(_) => { + return CloudSyncProtectedFetchResult { + page: None, + failure: Some(local_cloud_sync_protected_failure( + CloudSyncProtectedFailureCategory::Authorization, + CloudSyncProtectedSafeCode::NativeAuthUnavailable, + )), + } + } + }; + if expected_account_fingerprint.len() != 43 + || !expected_account_fingerprint + .bytes() + .all(|byte| byte.is_ascii_alphanumeric() || matches!(byte, b'_' | b'-')) + || expected_account_fingerprint != auth.account_fingerprint + { + return CloudSyncProtectedFetchResult { + page: None, + failure: Some(local_cloud_sync_protected_failure( + CloudSyncProtectedFailureCategory::MalformedRecord, + CloudSyncProtectedSafeCode::InvalidScope, + )), + }; + } + let scope = match CloudNativeProtectionScope::new(auth.account_fingerprint, stream) { + Ok(scope) => scope, + Err(failure) => { + return CloudSyncProtectedFetchResult { + page: None, + failure: Some(map_cloud_sync_protected_failure(&failure)), + } + } + }; + let hasher = + match crate::cloud_sync_protector::semantic_identifier_hasher(storage_directory.clone()) { + Ok(hasher) => hasher, + Err(_) => { + return CloudSyncProtectedFetchResult { + page: None, + failure: Some(local_cloud_sync_protected_failure( + CloudSyncProtectedFailureCategory::LocalStorage, + CloudSyncProtectedSafeCode::ProtectionFailed, + )), + } + } + }; + let request = CloudNativeFetchRequest::new( + stream, + &scope, + generation, + previous_checkpoint_reference.as_deref(), + maximum_changes, + ); + match crate::cloud_sync_native_fetch::cloud_sync_fetch_protected_page( + cloud_messages_client, + PathBuf::from(storage_directory), + &hasher, + &request, + ) + .await + { + CloudNativeProtectedFetchOutcome::Page(page) => CloudSyncProtectedFetchResult { + page: Some(map_cloud_sync_protected_page(&page)), + failure: None, + }, + CloudNativeProtectedFetchOutcome::Failure(failure) => CloudSyncProtectedFetchResult { + page: None, + failure: Some(map_cloud_sync_protected_failure(&failure)), + }, + } +} + +#[frb(sync)] +pub fn cloud_sync_commit_protected_page_lease( + storage_directory: String, + page_lease_reference: String, + retained_references: Vec, +) -> CloudSyncProtectedLeaseResult { + let failure = crate::cloud_sync_native_fetch::cloud_sync_commit_protected_page_lease( + PathBuf::from(storage_directory), + &page_lease_reference, + &retained_references, + ) + .err() + .map(|failure| map_cloud_sync_protected_failure(&failure)); + CloudSyncProtectedLeaseResult { failure } +} + +#[frb(sync)] +pub fn cloud_sync_acknowledge_committed_page_lease( + storage_directory: String, + page_lease_reference: String, +) -> CloudSyncProtectedLeaseResult { + let failure = crate::cloud_sync_native_fetch::cloud_sync_acknowledge_committed_page_lease( + PathBuf::from(storage_directory), + &page_lease_reference, + ) + .err() + .map(|failure| map_cloud_sync_protected_failure(&failure)); + CloudSyncProtectedLeaseResult { failure } +} + +#[frb(sync)] +pub fn cloud_sync_rollback_protected_page_lease( + storage_directory: String, + page_lease_reference: String, +) -> CloudSyncProtectedLeaseResult { + let failure = crate::cloud_sync_native_fetch::cloud_sync_rollback_protected_page_lease( + PathBuf::from(storage_directory), + &page_lease_reference, + ) + .err() + .map(|failure| map_cloud_sync_protected_failure(&failure)); + CloudSyncProtectedLeaseResult { failure } +} + +#[frb(sync)] +pub fn cloud_sync_recover_abandoned_page_leases( + storage_directory: String, + adopted_lease_references: Vec, + live_references: Vec, + live_reference_enumeration_complete: bool, +) -> CloudSyncProtectedRecoveryResult { + match crate::cloud_sync_native_fetch::cloud_sync_recover_abandoned_page_leases( + PathBuf::from(storage_directory), + &adopted_lease_references, + &live_references, + live_reference_enumeration_complete, + ) { + Ok(summary) => CloudSyncProtectedRecoveryResult { + recovery: Some(CloudSyncProtectedRecovery { + finalized_adopted_lease_references: summary + .finalized_adopted_lease_references() + .into_iter() + .map(str::to_owned) + .collect(), + absent_adopted_lease_references: summary + .absent_adopted_lease_references() + .into_iter() + .map(str::to_owned) + .collect(), + rolled_back_count: summary.rolled_back_count() as u32, + removed_temporary_files_count: summary.removed_temporary_file_count() as u32, + has_more: summary.has_more(), + }), + failure: None, + }, + Err(failure) => CloudSyncProtectedRecoveryResult { + recovery: None, + failure: Some(map_cloud_sync_protected_failure(&failure)), + }, + } +} + +#[frb(sync)] +pub fn cloud_sync_retire_protected_references( + storage_directory: String, + references: Vec, +) -> CloudSyncProtectedRetirementResult { + match crate::cloud_sync_native_fetch::cloud_sync_retire_protected_references( + PathBuf::from(storage_directory), + &references, + ) { + Ok(retired_count) => CloudSyncProtectedRetirementResult { + retired_count: retired_count as u32, + failure: None, + }, + Err(failure) => CloudSyncProtectedRetirementResult { + retired_count: 0, + failure: Some(map_cloud_sync_protected_failure(&failure)), + }, + } +} + +#[frb(sync)] +pub fn cloud_sync_collect_protected_garbage( + storage_directory: String, + live_references: Vec, + live_reference_enumeration_complete: bool, +) -> CloudSyncProtectedGarbageCollectionResult { + match crate::cloud_sync_native_fetch::cloud_sync_collect_protected_garbage( + PathBuf::from(storage_directory), + &live_references, + live_reference_enumeration_complete, + ) { + Ok(summary) => CloudSyncProtectedGarbageCollectionResult { + collection: Some(CloudSyncProtectedGarbageCollection { + scanned_count: summary.scanned_count() as u32, + first_observed_count: summary.first_observed_count() as u32, + deleted_count: summary.deleted_count() as u32, + preserved_live_count: summary.preserved_live_count() as u32, + preserved_active_lease_count: summary.preserved_active_lease_count() as u32, + has_more: summary.has_more(), + }), + failure: None, + }, + Err(failure) => CloudSyncProtectedGarbageCollectionResult { + collection: None, + failure: Some(map_cloud_sync_protected_failure(&failure)), + }, + } +} + +fn map_cloud_sync_transient_entity_kind( + kind: crate::cloud_sync_canonical_dto::CloudCanonicalEntityKind, +) -> CloudSyncTransientEntityKind { + use crate::cloud_sync_canonical_dto::CloudCanonicalEntityKind as Canonical; + match kind { + Canonical::Chat => CloudSyncTransientEntityKind::Chat, + Canonical::Message => CloudSyncTransientEntityKind::Message, + Canonical::Reaction => CloudSyncTransientEntityKind::Reaction, + Canonical::Attachment => CloudSyncTransientEntityKind::Attachment, + Canonical::GroupPhoto => CloudSyncTransientEntityKind::GroupPhoto, + } +} + +fn unmap_cloud_sync_transient_entity_kind( + kind: CloudSyncTransientEntityKind, +) -> crate::cloud_sync_canonical_dto::CloudCanonicalEntityKind { + use crate::cloud_sync_canonical_dto::CloudCanonicalEntityKind as Canonical; + match kind { + CloudSyncTransientEntityKind::Chat => Canonical::Chat, + CloudSyncTransientEntityKind::Message => Canonical::Message, + CloudSyncTransientEntityKind::Reaction => Canonical::Reaction, + CloudSyncTransientEntityKind::Attachment => Canonical::Attachment, + CloudSyncTransientEntityKind::GroupPhoto => Canonical::GroupPhoto, + } +} + +fn map_cloud_sync_transient_field_state( + state: crate::cloud_sync_canonical_dto::CloudCanonicalFieldState, +) -> CloudSyncTransientFieldState { + use crate::cloud_sync_canonical_dto::CloudCanonicalFieldState as Canonical; + match state { + Canonical::Absent => CloudSyncTransientFieldState::Absent, + Canonical::Value => CloudSyncTransientFieldState::Value, + Canonical::ExplicitClear => CloudSyncTransientFieldState::ExplicitClear, + } +} + +fn map_cloud_sync_transient_service( + service: crate::cloud_sync_canonical_dto::CloudCanonicalService, +) -> CloudSyncTransientService { + use crate::cloud_sync_canonical_dto::CloudCanonicalService as Canonical; + match service { + Canonical::IMessage => CloudSyncTransientService::IMessage, + } +} + +fn map_cloud_sync_transient_chat_style( + style: crate::cloud_sync_canonical_dto::CloudCanonicalChatStyle, +) -> CloudSyncTransientChatStyle { + use crate::cloud_sync_canonical_dto::CloudCanonicalChatStyle as Canonical; + match style { + Canonical::Direct => CloudSyncTransientChatStyle::Direct, + Canonical::Group => CloudSyncTransientChatStyle::Group, + } +} + +fn map_cloud_sync_transient_reaction_kind( + kind: crate::cloud_sync_canonical_dto::CloudCanonicalReactionKind, +) -> CloudSyncTransientReactionKind { + use crate::cloud_sync_canonical_dto::CloudCanonicalReactionKind as Canonical; + match kind { + Canonical::Heart => CloudSyncTransientReactionKind::Heart, + Canonical::Like => CloudSyncTransientReactionKind::Like, + Canonical::Dislike => CloudSyncTransientReactionKind::Dislike, + Canonical::Laugh => CloudSyncTransientReactionKind::Laugh, + Canonical::Emphasize => CloudSyncTransientReactionKind::Emphasize, + Canonical::Question => CloudSyncTransientReactionKind::Question, + Canonical::Emoji => CloudSyncTransientReactionKind::Emoji, + Canonical::StickerBack => CloudSyncTransientReactionKind::StickerBack, + } +} + +fn map_cloud_sync_transient_text_run( + run: &crate::cloud_sync_canonical_dto::CloudCanonicalTextRun, +) -> CloudSyncTransientTextRun { + let attachment = run.attachment(); + CloudSyncTransientTextRun { + start_utf16: run.start_utf16(), + length_utf16: run.length_utf16(), + message_part: run.message_part(), + attachment_canonical_guid: attachment.map(|value| value.canonical_guid().to_owned()), + attachment_logical_key_hash: attachment + .map(|value| value.logical_key_hash().value().to_owned()), + mention_handle: run.mention().map(str::to_owned), + audio_transcript: run.audio_transcript().map(str::to_owned), + text_effect: run.text_effect(), + bold: run.bold(), + italic: run.italic(), + strikethrough: run.strikethrough(), + underline: run.underline(), + } +} + +fn map_cloud_sync_transient_attributed_body( + body: &crate::cloud_sync_canonical_dto::CloudCanonicalAttributedBody, +) -> CloudSyncTransientAttributedBody { + CloudSyncTransientAttributedBody { + text: body.text().to_owned(), + runs: body + .runs() + .iter() + .map(map_cloud_sync_transient_text_run) + .collect(), + } +} + +fn map_cloud_sync_transient_message_edit( + edit: &crate::cloud_sync_canonical_dto::CloudCanonicalMessageEdit, +) -> CloudSyncTransientMessageEdit { + let (original_range_location, original_range_length) = edit + .original_range() + .map_or((None, None), |(location, length)| { + (Some(location), Some(length)) + }); + CloudSyncTransientMessageEdit { + part: edit.part(), + revision: edit.revision(), + bodies: edit + .bodies() + .iter() + .map(map_cloud_sync_transient_attributed_body) + .collect(), + modified_at_millis: edit.modified_at_millis(), + original_range_location, + original_range_length, + } +} + +fn map_cloud_sync_transient_known_flags( + flags: crate::cloud_sync_canonical_dto::CloudCanonicalKnownMessageFlags, +) -> CloudSyncTransientKnownMessageFlags { + CloudSyncTransientKnownMessageFlags { + from_me: flags.from_me, + delivered: flags.delivered, + read: flags.read, + has_data_detector_results: flags.has_data_detector_results, + delivered_quietly: flags.delivered_quietly, + did_notify_recipient: flags.did_notify_recipient, + } +} + +fn map_cloud_sync_transient_snapshot( + snapshot: &crate::cloud_sync_canonical_dto::CloudCanonicalSnapshot, +) -> CloudSyncTransientSnapshot { + CloudSyncTransientSnapshot { + entity_kind: map_cloud_sync_transient_entity_kind(snapshot.entity_kind()), + logical_entity_key_hash: snapshot.logical_entity_key_hash().value().to_owned(), + parent_logical_key_hash: snapshot + .parent_logical_key_hash() + .map(|value| value.value().to_owned()), + immutable_content_digest: snapshot + .immutable_content_digest() + .map(|value| value.value().to_owned()), + created_at_millis: snapshot.created_at_millis(), + read_at_millis: snapshot.read_at_millis(), + delivered_at_millis: snapshot.delivered_at_millis(), + edit_parts: snapshot + .edit_parts() + .iter() + .map(|part| CloudSyncTransientEditPart { + part_key_hash: part.part_key_hash().value().to_owned(), + revision: part.revision(), + content_digest: part.content_digest().value().to_owned(), + modified_at_millis: part.modified_at_millis(), + }) + .collect(), + retracted_at_millis: snapshot.retracted_at_millis(), + group_version: snapshot.group_version(), + group_metadata_digest: snapshot + .group_metadata_digest() + .map(|value| value.value().to_owned()), + etag_hash: snapshot.etag_hash().map(|value| value.value().to_owned()), + protected_source_reference: snapshot + .protected_raw_envelope_reference() + .value() + .to_owned(), + } +} + +fn map_cloud_sync_transient_payload( + logical_entity_key_hash: &str, + payload: &crate::cloud_sync_canonical_dto::CloudCanonicalPayload, +) -> Option { + use crate::cloud_sync_canonical_dto::CloudCanonicalPayload as Canonical; + let mut result = CloudSyncTransientPayload { + chat: None, + message: None, + attachment: None, + group_photo: None, + }; + match payload { + Canonical::Chat(payload) => { + result.chat = Some(CloudSyncTransientChatPayload { + logical_entity_key_hash: logical_entity_key_hash.to_owned(), + canonical_guid: payload.guid().to_owned(), + chat_identifier: payload.chat_identifier().to_owned(), + group_id: payload.group_id().to_owned(), + original_group_id: payload.original_group_id().to_owned(), + service: map_cloud_sync_transient_service(payload.service()), + style: map_cloud_sync_transient_chat_style(payload.style()), + participant_handles: payload.participant_handles().to_vec(), + display_name_state: map_cloud_sync_transient_field_state( + payload.display_name_state(), + ), + display_name: payload.display_name().value().cloned(), + last_addressed_handle_state: map_cloud_sync_transient_field_state( + payload.last_addressed_handle_state(), + ), + last_addressed_handle: payload.last_addressed_handle().value().cloned(), + group_version_state: map_cloud_sync_transient_field_state( + payload.group_version_state(), + ), + group_version: payload.group_version().value().copied(), + last_seen_message_guid_state: map_cloud_sync_transient_field_state( + payload.last_seen_message_guid_state(), + ), + last_seen_message_guid: payload.last_seen_message_guid().value().cloned(), + group_photo_guid_state: map_cloud_sync_transient_field_state( + payload.group_photo_guid_state(), + ), + group_photo_guid: payload.group_photo_guid().value().cloned(), + }); + } + Canonical::Message(payload) => { + let (association_kind, reaction_kind, association_parent, reaction_removed) = + match payload.association().reaction() { + Some((kind, parent, removed)) => ( + if removed { + CloudSyncTransientAssociationKind::ReactionRemove + } else { + CloudSyncTransientAssociationKind::ReactionAdd + }, + Some(map_cloud_sync_transient_reaction_kind(kind)), + Some(parent), + removed, + ), + None => match payload.association().sticker() { + Some(parent) => ( + CloudSyncTransientAssociationKind::Sticker, + None, + Some(parent), + false, + ), + None => (CloudSyncTransientAssociationKind::None, None, None, false), + }, + }; + let reply = payload.reply(); + result.message = Some(CloudSyncTransientMessagePayload { + logical_entity_key_hash: logical_entity_key_hash.to_owned(), + canonical_guid: payload.guid().to_owned(), + chat_alias_key_hash: payload.chat_alias_key_hash().value().to_owned(), + chat_identifier: payload.chat_identifier().to_owned(), + sender_handle: payload.sender_handle().to_owned(), + created_at_millis: payload.created_at_millis(), + error: payload.error(), + service: map_cloud_sync_transient_service(payload.service()), + subject_state: map_cloud_sync_transient_field_state(payload.subject().state()), + subject: payload.subject().value().cloned(), + body_state: map_cloud_sync_transient_field_state(payload.text_state()), + body: payload.text().value().cloned(), + attributed_bodies_state: map_cloud_sync_transient_field_state( + payload.attributed_bodies_state(), + ), + attributed_bodies: payload + .attributed_bodies() + .iter() + .map(map_cloud_sync_transient_attributed_body) + .collect(), + balloon_bundle_id_state: map_cloud_sync_transient_field_state( + payload.balloon_bundle_id().state(), + ), + balloon_bundle_id: payload.balloon_bundle_id().value().cloned(), + effect_state: map_cloud_sync_transient_field_state(payload.effect().state()), + effect: payload.effect().value().cloned(), + read_at_millis_state: map_cloud_sync_transient_field_state( + payload.read_at_millis().state(), + ), + read_at_millis: payload.read_at_millis().value().copied(), + delivered_at_millis_state: map_cloud_sync_transient_field_state( + payload.delivered_at_millis().state(), + ), + delivered_at_millis: payload.delivered_at_millis().value().copied(), + known_flags: map_cloud_sync_transient_known_flags(payload.flags()), + association_kind, + reaction_kind, + reaction_removed, + reaction_parent_logical_key_hash: association_parent + .map(|parent| parent.parent_hash().value().to_owned()), + reaction_parent_canonical_guid: association_parent + .map(|parent| parent.parent_guid().to_owned()), + reaction_parent_part: association_parent.and_then(|parent| parent.parent_part()), + associated_range_location: association_parent + .and_then(|parent| parent.range_location()), + associated_range_length: association_parent + .and_then(|parent| parent.range_length()), + reply_parent_logical_key_hash: reply + .map(|parent| parent.parent_hash().value().to_owned()), + reply_parent_canonical_guid: reply.map(|parent| parent.parent_guid().to_owned()), + reply_parent_part: reply.map(|parent| parent.parent_part().to_owned()), + edits_state: map_cloud_sync_transient_field_state(payload.edits_state()), + edits: payload + .edits() + .iter() + .map(map_cloud_sync_transient_message_edit) + .collect(), + retracted_parts_state: map_cloud_sync_transient_field_state( + payload.retracted_parts_state(), + ), + retracted_parts: payload.retracted_parts().to_vec(), + associated_emoji_state: map_cloud_sync_transient_field_state( + payload.associated_emoji().state(), + ), + associated_emoji: payload.associated_emoji().value().cloned(), + }); + } + Canonical::Attachment(payload) => { + result.attachment = Some(CloudSyncTransientAttachmentPayload { + logical_entity_key_hash: logical_entity_key_hash.to_owned(), + canonical_guid: payload.canonical_guid().to_owned(), + owner_logical_key_hash: payload + .owner_message_key_hash() + .map(|value| value.value().to_owned()), + owner_canonical_guid: payload.owner_message_guid().map(str::to_owned), + owner_part: payload.owner_part(), + uti_state: map_cloud_sync_transient_field_state(payload.uti().state()), + uti: payload.uti().value().cloned(), + file_name_state: map_cloud_sync_transient_field_state( + payload.transfer_name().state(), + ), + file_name: payload.transfer_name().value().cloned(), + mime_type_state: map_cloud_sync_transient_field_state(payload.mime_type().state()), + mime_type: payload.mime_type().value().cloned(), + total_bytes_state: map_cloud_sync_transient_field_state( + payload.total_bytes().state(), + ), + total_bytes: payload.total_bytes().value().copied(), + is_outgoing_state: map_cloud_sync_transient_field_state( + payload.is_outgoing().state(), + ), + is_outgoing: payload.is_outgoing().value().copied(), + protected_local_reference_state: map_cloud_sync_transient_field_state( + payload.verified_local_file_reference().state(), + ), + protected_local_reference: payload + .verified_local_file_reference() + .value() + .map(|value| value.value().to_owned()), + }); + } + Canonical::GroupPhoto(payload) => { + result.group_photo = Some(CloudSyncTransientGroupPhotoPayload { + logical_entity_key_hash: logical_entity_key_hash.to_owned(), + owner_logical_key_hash: payload.chat_key_hash().value().to_owned(), + photo_guid: payload.photo_guid().to_owned(), + protected_local_reference: payload + .verified_local_file_reference() + .value() + .to_owned(), + }); + } + } + Some(result) +} + +fn map_cloud_sync_transient_deferred( + reason: crate::cloud_sync_canonical_converter::CloudCanonicalDeferredReason, +) -> CloudSyncTransientDeferredReason { + use crate::cloud_sync_canonical_converter::CloudCanonicalDeferredReason as Canonical; + match reason { + Canonical::NestedPresenceUnavailable => { + CloudSyncTransientDeferredReason::NestedPresenceUnavailable + } + Canonical::UnprovenEditTimestamp => CloudSyncTransientDeferredReason::UnprovenEditTimestamp, + Canonical::UnsupportedExtensionPayload => { + CloudSyncTransientDeferredReason::UnsupportedExtensionPayload + } + Canonical::UnsupportedMediaCredentials => { + CloudSyncTransientDeferredReason::UnsupportedMediaCredentials + } + Canonical::UnsupportedGroupPhoto => CloudSyncTransientDeferredReason::UnsupportedGroupPhoto, + Canonical::UnsupportedSticker => CloudSyncTransientDeferredReason::UnsupportedSticker, + Canonical::UnsupportedScheduling => CloudSyncTransientDeferredReason::UnsupportedScheduling, + Canonical::UnsupportedOffGridMetadata => { + CloudSyncTransientDeferredReason::UnsupportedOffGridMetadata + } + Canonical::UnsupportedNegativeAttachmentSize => { + CloudSyncTransientDeferredReason::UnsupportedNegativeAttachmentSize + } + } +} + +fn map_cloud_sync_transient_quarantine( + reason: crate::cloud_sync_canonical_converter::CloudCanonicalQuarantineReason, +) -> CloudSyncTransientQuarantineReason { + use crate::cloud_sync_canonical_converter::CloudCanonicalQuarantineReason as Canonical; + match reason { + Canonical::MalformedRequiredIdentity => { + CloudSyncTransientQuarantineReason::MalformedRequiredIdentity + } + Canonical::FieldPresenceMismatch => { + CloudSyncTransientQuarantineReason::FieldPresenceMismatch + } + Canonical::UnsupportedService => CloudSyncTransientQuarantineReason::UnsupportedService, + Canonical::UnsupportedChatStyle => CloudSyncTransientQuarantineReason::UnsupportedChatStyle, + Canonical::UnsupportedMessageType => { + CloudSyncTransientQuarantineReason::UnsupportedMessageType + } + Canonical::UnsupportedAssociationType => { + CloudSyncTransientQuarantineReason::UnsupportedAssociationType + } + Canonical::MalformedParent => CloudSyncTransientQuarantineReason::MalformedParent, + Canonical::AmbiguousReply => CloudSyncTransientQuarantineReason::AmbiguousReply, + Canonical::MalformedAttributedBody => { + CloudSyncTransientQuarantineReason::MalformedAttributedBody + } + Canonical::MalformedMessageSummary => { + CloudSyncTransientQuarantineReason::MalformedMessageSummary + } + Canonical::ConflictingEditAndRetraction => { + CloudSyncTransientQuarantineReason::ConflictingEditAndRetraction + } + Canonical::OversizedContent => CloudSyncTransientQuarantineReason::OversizedContent, + Canonical::InvalidCanonicalPayload => { + CloudSyncTransientQuarantineReason::InvalidCanonicalPayload + } + Canonical::MalformedRecord => CloudSyncTransientQuarantineReason::MalformedRecord, + } +} + +fn map_cloud_sync_transient_failure( + failure: crate::cloud_sync_transient_bridge::CloudTransientBridgeFailure, +) -> CloudSyncTransientFailureCode { + use crate::cloud_sync_transient_bridge::CloudTransientBridgeFailure as Native; + match failure { + Native::InvalidRequest => CloudSyncTransientFailureCode::InvalidRequest, + Native::ActiveAccountMismatch => CloudSyncTransientFailureCode::ActiveAccountMismatch, + Native::ScopeMismatch => CloudSyncTransientFailureCode::ScopeMismatch, + Native::GenerationMismatch => CloudSyncTransientFailureCode::GenerationMismatch, + Native::StoreIdentityMismatch => CloudSyncTransientFailureCode::StoreIdentityMismatch, + Native::ProtectedReferenceMismatch => { + CloudSyncTransientFailureCode::ProtectedReferenceMismatch + } + Native::MalformedRecord => CloudSyncTransientFailureCode::MalformedRecord, + Native::OversizedRecord => CloudSyncTransientFailureCode::OversizedRecord, + Native::PcsUnavailable => CloudSyncTransientFailureCode::PcsUnavailable, + Native::RetryableUpstream => CloudSyncTransientFailureCode::RetryableUpstream, + Native::DecoderFailure => CloudSyncTransientFailureCode::DecoderFailure, + } +} + +fn cloud_sync_transient_empty_result( + protected_source_reference: Option, + generation: u64, +) -> CloudSyncTransientDecodeResult { + CloudSyncTransientDecodeResult { + protected_source_reference, + generation, + change_id: None, + entity_kind: None, + mutation_kind: None, + snapshot: None, + payload: None, + tombstone: None, + deferred_reason: None, + quarantine_reason: None, + failure_code: None, + } +} + +fn is_cloud_sync_protected_source_reference(value: &str) -> bool { + value.strip_prefix("obcs2.ref.").is_some_and(|suffix| { + suffix.len() == 43 + && suffix + .bytes() + .all(|byte| byte.is_ascii_alphanumeric() || matches!(byte, b'_' | b'-')) + }) +} + +/// Reads, unprotects, decrypts, and canonically converts one D0 protected +/// change. No raw Apple/CloudKit identifier, credential, key, or record body +/// crosses FRB. This entry point is intentionally not wired into production +/// composition. `expected_payload_length` is optional for legacy D0 rows that +/// retained the exact SHA-256 but not the redundant byte count; the protected +/// capability, digest, change ID, record hash, etag hash, and server timestamp +/// fences remain mandatory. +#[allow(clippy::too_many_arguments)] +pub async fn cloud_sync_decode_protected_change( + cloud_messages_client: &Arc>, + storage_directory: String, + expected_account_fingerprint: String, + expected_protected_store_identity: String, + container: String, + database: String, + zone: String, + stream_kind: String, + schema_version: u32, + native_stream: String, + generation: u64, + expected_change_kind: CloudSyncProtectedChangeKind, + expected_change_id: String, + expected_record_id_hash: String, + expected_etag_hash: Option, + expected_payload_sha256: String, + expected_payload_length: Option, + expected_server_modified_at_millis: Option, + protected_raw_envelope_reference: String, + tombstone_entity_kind: Option, + tombstone_logical_entity_key_hash: Option, +) -> CloudSyncTransientDecodeResult { + use crate::cloud_sync_native_fetch::CloudNativeStream; + use crate::cloud_sync_transient_bridge::{ + cloud_sync_decode_transient_record, CloudTransientDecodeOutcome, + CloudTransientDecodeRequest, CloudTransientExpectedChangeKind, + CloudTransientTombstoneMapping, + }; + + let protected_source_reference = + is_cloud_sync_protected_source_reference(&protected_raw_envelope_reference) + .then(|| protected_raw_envelope_reference.clone()); + let mut failure_result = + cloud_sync_transient_empty_result(protected_source_reference.clone(), generation); + + let Some(stream) = CloudNativeStream::parse(&native_stream) else { + failure_result.failure_code = Some(CloudSyncTransientFailureCode::InvalidRequest); + return failure_result; + }; + let expected_change_kind = match expected_change_kind { + CloudSyncProtectedChangeKind::Save => CloudTransientExpectedChangeKind::Save, + CloudSyncProtectedChangeKind::Delete => CloudTransientExpectedChangeKind::Delete, + CloudSyncProtectedChangeKind::Quarantined => CloudTransientExpectedChangeKind::Quarantined, + }; + let tombstone_mapping = match (tombstone_entity_kind, tombstone_logical_entity_key_hash) { + (Some(kind), Some(logical_hash)) => { + match CloudTransientTombstoneMapping::new( + unmap_cloud_sync_transient_entity_kind(kind), + logical_hash, + ) { + Ok(mapping) => Some(mapping), + Err(failure) => { + failure_result.failure_code = Some(map_cloud_sync_transient_failure(failure)); + return failure_result; + } + } + } + (None, None) => None, + _ => { + failure_result.failure_code = Some(CloudSyncTransientFailureCode::InvalidRequest); + return failure_result; + } + }; + let request = match CloudTransientDecodeRequest::new( + PathBuf::from(storage_directory), + expected_account_fingerprint, + expected_protected_store_identity, + container, + database, + zone, + stream_kind, + schema_version, + stream, + generation, + expected_change_kind, + expected_change_id, + expected_record_id_hash, + expected_etag_hash, + expected_payload_sha256, + expected_payload_length, + expected_server_modified_at_millis, + protected_raw_envelope_reference, + tombstone_mapping, + ) { + Ok(request) => request, + Err(failure) => { + failure_result.failure_code = Some(map_cloud_sync_transient_failure(failure)); + return failure_result; + } + }; + + match cloud_sync_decode_transient_record(cloud_messages_client, request).await { + CloudTransientDecodeOutcome::Ready(mutation) => { + let envelope = mutation.envelope(); + let source_matches = protected_source_reference.as_deref() + == Some(envelope.protected_raw_envelope_reference().value()); + if envelope.generation() != generation || !source_matches { + failure_result.failure_code = + Some(CloudSyncTransientFailureCode::GenerationMismatch); + return failure_result; + } + let snapshot = mutation.snapshot().map(map_cloud_sync_transient_snapshot); + let payload = mutation.payload().and_then(|payload| { + map_cloud_sync_transient_payload( + envelope.logical_entity_key_hash().value(), + payload, + ) + }); + let tombstone = mutation + .tombstone() + .map(|tombstone| CloudSyncTransientTombstone { + entity_kind: map_cloud_sync_transient_entity_kind(tombstone.entity_kind()), + logical_entity_key_hash: tombstone.logical_entity_key_hash().value().to_owned(), + deleted_at_millis: tombstone.deleted_at_millis(), + server_confirmed: tombstone.server_confirmed(), + }); + let mutation_kind = match envelope.mutation_kind() { + crate::cloud_sync_canonical_dto::CloudCanonicalMutationKind::Upsert => { + CloudSyncTransientMutationKind::Upsert + } + crate::cloud_sync_canonical_dto::CloudCanonicalMutationKind::Tombstone => { + CloudSyncTransientMutationKind::Tombstone + } + }; + if (mutation_kind == CloudSyncTransientMutationKind::Upsert + && (snapshot.is_none() || payload.is_none())) + || (mutation_kind == CloudSyncTransientMutationKind::Tombstone + && tombstone.is_none()) + { + failure_result.failure_code = Some(CloudSyncTransientFailureCode::DecoderFailure); + return failure_result; + } + CloudSyncTransientDecodeResult { + protected_source_reference, + generation: envelope.generation(), + change_id: Some(envelope.change_id().value().to_owned()), + entity_kind: Some(map_cloud_sync_transient_entity_kind(envelope.entity_kind())), + mutation_kind: Some(mutation_kind), + snapshot, + payload, + tombstone, + deferred_reason: None, + quarantine_reason: None, + failure_code: None, + } + } + CloudTransientDecodeOutcome::Deferred(reason) => { + let mut result = + cloud_sync_transient_empty_result(protected_source_reference, generation); + result.deferred_reason = Some(map_cloud_sync_transient_deferred(reason)); + result + } + CloudTransientDecodeOutcome::Quarantined(reason) => { + let mut result = + cloud_sync_transient_empty_result(protected_source_reference, generation); + result.quarantine_reason = Some(map_cloud_sync_transient_quarantine(reason)); + result + } + CloudTransientDecodeOutcome::Failure(failure) => { + failure_result.failure_code = Some(map_cloud_sync_transient_failure(failure)); + failure_result + } + } +} + +#[cfg(test)] +mod cloud_sync_protected_bridge_contract_tests { + use super::{ + cloud_sync_transient_empty_result, is_cloud_sync_lease_reference, + is_cloud_sync_protected_reference, is_cloud_sync_protected_source_reference, + CloudSyncTransientFailureCode, + }; + + #[test] + fn outbound_capabilities_require_exact_bounded_formats() { + assert!(is_cloud_sync_protected_reference(&format!( + "obcs2.ref.{}", + "A".repeat(43) + ))); + assert!(!is_cloud_sync_protected_reference("obcs2.ref.short")); + assert!(!is_cloud_sync_protected_reference(&format!( + "obcs2.ref.{}extra", + "A".repeat(43) + ))); + assert!(is_cloud_sync_lease_reference(&format!( + "obcs2.lease.{}", + "a".repeat(32) + ))); + assert!(!is_cloud_sync_lease_reference(&format!( + "obcs2.lease.{}", + "A".repeat(32) + ))); + } + + #[test] + fn protected_dtos_contain_only_hashes_opaque_references_and_safe_scalars() { + let source = include_str!("api.rs"); + let dto_source = source + .split("// CLOUD_SYNC_PROTECTED_DTO_BEGIN") + .nth(1) + .and_then(|source| source.split("// CLOUD_SYNC_PROTECTED_DTO_END").next()) + .expect("protected DTO source markers"); + for forbidden in [ + "record_name:", + "etag: Option", + "continuation_token", + "encrypted_record", + "tombstone_payload", + "credentials", + "PathBuf", + "storage_directory", + ] { + assert!( + !dto_source.contains(forbidden), + "protected DTO boundary must not expose {forbidden}" + ); + } + } + + #[test] + fn transient_dtos_exclude_native_identifiers_credentials_and_binary_records() { + let source = include_str!("api.rs"); + let dto_source = source + .split("// CLOUD_SYNC_TRANSIENT_DTO_BEGIN") + .nth(1) + .and_then(|source| source.split("// CLOUD_SYNC_TRANSIENT_DTO_END").next()) + .expect("transient DTO source markers"); + for forbidden in [ + "record_name:", + "record_type:", + "server_record_id:", + "raw_account_identifier:", + "continuation_token:", + "credentials:", + "decryption_key:", + "encrypted_record:", + "Vec", + "PathBuf", + "Serialize", + "Deserialize", + "derive(Clone, Debug", + ] { + assert!( + !dto_source.contains(forbidden), + "transient DTO boundary must not expose {forbidden}" + ); + } + assert!(dto_source.contains("protected_source_reference:")); + } + + #[test] + fn transient_source_reference_grammar_is_closed() { + let valid = format!("obcs2.ref.{}", "A".repeat(43)); + assert!(is_cloud_sync_protected_source_reference(&valid)); + for invalid in [ + "", + "obcs2.ref.short", + "obcs2.ref.AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/", + "obcs2.store.AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA", + "raw-record-id", + ] { + assert!(!is_cloud_sync_protected_source_reference(invalid)); + } + } + + #[test] + fn transient_failure_result_contains_one_safe_disposition_and_no_content() { + let source = format!("obcs2.ref.{}", "B".repeat(43)); + let mut result = cloud_sync_transient_empty_result(Some(source.clone()), 9); + result.failure_code = Some(CloudSyncTransientFailureCode::ScopeMismatch); + assert_eq!( + result.protected_source_reference.as_deref(), + Some(source.as_str()) + ); + assert_eq!(result.generation, 9); + assert!(result.change_id.is_none()); + assert!(result.snapshot.is_none()); + assert!(result.payload.is_none()); + assert!(result.tombstone.is_none()); + assert!(result.deferred_reason.is_none()); + assert!(result.quarantine_reason.is_none()); + assert_eq!( + result.failure_code, + Some(CloudSyncTransientFailureCode::ScopeMismatch) + ); + } +} + #[frb(opaque)] #[derive(Serialize, Deserialize, Clone)] #[serde(tag = "type")] @@ -146,9 +2762,7 @@ pub type MyFilePackager = FFMpegFilePackager; pub type MyFilePackager = FFIFilePackager; #[derive(Default)] -pub struct FFIFilePackager { - -} +pub struct FFIFilePackager {} #[frb(sync)] pub fn decode_extension_app(bp: &[u8], bid: &str) -> anyhow::Result { @@ -164,42 +2778,62 @@ impl FilePackager for FFIFilePackager { type Reader = Box; async fn get_files(&mut self, path: PathBuf) -> Result, PushError> { info!("Preparing to package {}", PACKAGER_LOCK.get().is_some()); - let processed = PACKAGER_LOCK.get().expect("No FFI packager!").get_file(path.to_str().unwrap().to_string()); + let processed = PACKAGER_LOCK + .get() + .expect("No FFI packager!") + .get_file(path.to_str().unwrap().to_string()); info!("Packaged"); let inner = match processed { - PackagedFile::Failure(failure) => { - return Err(PushError::FilePackageError(failure)) - }, - PackagedFile::Info(info) => info + PackagedFile::Failure(failure) => return Err(PushError::FilePackageError(failure)), + PackagedFile::Info(info) => info, }; let is_video = inner.duration.is_some(); - let file = PreparedFile::>::new(Box::new(File::open(&path)?), FileMetadata { - width: inner.width as usize, - height: inner.height as usize, - uti_type: if is_video { "public.mpeg-4".to_string() } else { "public.jpeg".to_string() }, - video_type: if is_video { Some("720p".to_string()) } else { None }, - asset_metadata: if !is_video { Some(AssetMetadata { - asset_type: "derivative".to_string(), - asset_type_flags: 2, - }) } else { None }, - }).await?; + let file = PreparedFile::>::new( + Box::new(File::open(&path)?), + FileMetadata { + width: inner.width as usize, + height: inner.height as usize, + uti_type: if is_video { + "public.mpeg-4".to_string() + } else { + "public.jpeg".to_string() + }, + video_type: if is_video { + Some("720p".to_string()) + } else { + None + }, + asset_metadata: if !is_video { + Some(AssetMetadata { + asset_type: "derivative".to_string(), + asset_type_flags: 2, + }) + } else { + None + }, + }, + ) + .await?; let mut prepared_files = vec![file]; if let Some(thumbnail) = inner.thumbnail { - let thumbnail = PreparedFile::>::new(Box::new(Cursor::new(thumbnail)), FileMetadata { - width: inner.width as usize, - height: inner.height as usize, - uti_type: "public.jpeg".to_string(), - video_type: Some("PosterFrame".to_string()), - asset_metadata: None, - }).await?; + let thumbnail = PreparedFile::>::new( + Box::new(Cursor::new(thumbnail)), + FileMetadata { + width: inner.width as usize, + height: inner.height as usize, + uti_type: "public.jpeg".to_string(), + video_type: Some("PosterFrame".to_string()), + asset_metadata: None, + }, + ) + .await?; prepared_files.push(thumbnail); } - Ok(PreparedAsset { files: prepared_files, name: path.file_name().unwrap().to_str().unwrap().to_string(), @@ -221,9 +2855,7 @@ pub struct ActiveCircleSession { pub fn service_from_ptr(ptr: String) -> Option { let pointer: u64 = ptr.parse().unwrap(); info!("using state {pointer}"); - let service = unsafe { - Weak::from_raw(pointer as *const SharedPushState) - }; + let service = unsafe { Weak::from_raw(pointer as *const SharedPushState) }; service.upgrade().map(|s| (*s).clone()) } @@ -257,12 +2889,18 @@ fn migrate(path: String) -> bool { if let Some(private) = item.get_mut("private") { if let Value::Data(cert) = private { let handle = format!("activation:{}", config.get_serial_number()); - RsaKey::import(&handle, 1024, cert, KeystoreAccessRules { - signature_padding: vec![KeystorePadding::PKCS1], - digests: vec![KeystoreDigest::Sha1], - can_sign: true, - ..Default::default() - }).expect("failed to import RSA"); + RsaKey::import( + &handle, + 1024, + cert, + KeystoreAccessRules { + signature_padding: vec![KeystorePadding::PKCS1], + digests: vec![KeystoreDigest::Sha1], + can_sign: true, + ..Default::default() + }, + ) + .expect("failed to import RSA"); *private = Value::String(handle); plist::to_file_xml(&hw_config_path, &item).expect("failed to save!"); } @@ -272,7 +2910,8 @@ fn migrate(path: String) -> bool { } if let Some(value) = item.get_mut("identity") { if value.as_dictionary().is_some() { - let identity: IDSNGMIdentity = plist::from_value(&value).expect("NGM Identity parse"); + let identity: IDSNGMIdentity = + plist::from_value(&value).expect("NGM Identity parse"); *value = Value::Data(identity.save("openbubbles").expect("Failed to save")); plist::to_file_xml(&hw_config_path, &item).expect("failed to save!"); } @@ -283,17 +2922,28 @@ fn migrate(path: String) -> bool { if let Ok(mut users) = plist::from_file::<_, Vec>(&id_path) { let mut modified = false; for user in &mut users { - let user_id = user.get("user_id").unwrap().as_string().unwrap().to_string(); + let user_id = user + .get("user_id") + .unwrap() + .as_string() + .unwrap() + .to_string(); if let Some(Value::Dictionary(item)) = user.get_mut("auth_keypair") { if let Some(private) = item.get_mut("private") { if let Value::Data(cert) = private { let handle = format!("ids:{user_id}"); - RsaKey::import(&handle, 2048, cert, KeystoreAccessRules { - signature_padding: vec![KeystorePadding::PKCS1], - digests: vec![KeystoreDigest::Sha1], - can_sign: true, - ..Default::default() - }).expect("failed to import RSA"); + RsaKey::import( + &handle, + 2048, + cert, + KeystoreAccessRules { + signature_padding: vec![KeystorePadding::PKCS1], + digests: vec![KeystoreDigest::Sha1], + can_sign: true, + ..Default::default() + }, + ) + .expect("failed to import RSA"); *private = Value::String(handle); modified = true; } @@ -301,7 +2951,9 @@ fn migrate(path: String) -> bool { } if let Some(Value::Dictionary(item)) = user.get_mut("registration") { for service in item.values_mut() { - if let Some(Value::Dictionary(item)) = service.as_dictionary_mut().unwrap().get_mut("id_keypair") { + if let Some(Value::Dictionary(item)) = + service.as_dictionary_mut().unwrap().get_mut("id_keypair") + { if let Some(private) = item.get_mut("private") { if let Value::Data(cert) = private { let handle = format!("ids:{user_id}"); @@ -320,7 +2972,11 @@ fn migrate(path: String) -> bool { let cloudkit_path = dir.join("keychain.plist"); if let Ok(mut users) = plist::from_file::<_, Dictionary>(&cloudkit_path) { let anisette_path = dir.join("anisette_test/state.plist"); - if let Ok(AnisetteState { provisioned: Some(ProvisionedAnisette { mid, .. }), .. }) = plist::from_file::<_, AnisetteState>(&anisette_path) { + if let Ok(AnisetteState { + provisioned: Some(ProvisionedAnisette { mid, .. }), + .. + }) = plist::from_file::<_, AnisetteState>(&anisette_path) + { let mid = base64_encode(mid.as_ref()); let mut migrate = false; let dsid = users.get("dsid").unwrap().as_string().unwrap().to_string(); @@ -328,11 +2984,17 @@ fn migrate(path: String) -> bool { if let Some(private) = item.get_mut("signing_key") { if let Value::Data(cert) = private { let handle = format!("keychain:signing:{mid}"); - EcKeystoreKey::import(&handle, EcCurve::P384, &cert, KeystoreAccessRules { - can_sign: true, - digests: vec![KeystoreDigest::Sha384, KeystoreDigest::Sha256], - ..Default::default() - }).expect("Failed to import EC"); + EcKeystoreKey::import( + &handle, + EcCurve::P384, + &cert, + KeystoreAccessRules { + can_sign: true, + digests: vec![KeystoreDigest::Sha384, KeystoreDigest::Sha256], + ..Default::default() + }, + ) + .expect("Failed to import EC"); *private = Value::String(handle); migrate = true; } @@ -340,11 +3002,17 @@ fn migrate(path: String) -> bool { if let Some(private) = item.get_mut("encryption_key") { if let Value::Data(cert) = private { let handle = format!("keychain:encryption:{mid}"); - EcKeystoreKey::import(&handle, EcCurve::P384, &cert, KeystoreAccessRules { - can_agree: true, - digests: vec![KeystoreDigest::Sha384, KeystoreDigest::Sha256], - ..Default::default() - }).expect("Failed to import EC"); + EcKeystoreKey::import( + &handle, + EcCurve::P384, + &cert, + KeystoreAccessRules { + can_agree: true, + digests: vec![KeystoreDigest::Sha384, KeystoreDigest::Sha256], + ..Default::default() + }, + ) + .expect("Failed to import EC"); *private = Value::String(handle); } } @@ -356,18 +3024,28 @@ fn migrate(path: String) -> bool { struct BadBottle { escrowed_signing_key: Vec, } - let bad: BadBottle = plist::from_value(&private).expect("bottle Identity parse"); + let bad: BadBottle = + plist::from_value(&private).expect("bottle Identity parse"); let dict = private.as_dictionary_mut().unwrap(); - dict.insert("escrowed_signing_key".to_string(), Value::Data(bad.escrowed_signing_key)); + dict.insert( + "escrowed_signing_key".to_string(), + Value::Data(bad.escrowed_signing_key), + ); - let identity: CurrentBottle = plist::from_value(&private).expect("bottle Identity parse"); + let identity: CurrentBottle = + plist::from_value(&private).expect("bottle Identity parse"); *private = Value::Data(identity.save(&dsid).expect("Failed to save")); } if let Some(Value::Array(items)) = users.get_mut("keystore") { - let keystore = SivKey(keystore().ensure_secret(&format!("keychain:cloudkey-access-key:{}", dsid), 64).expect("wha")); + let keystore = SivKey( + keystore() + .ensure_secret(&format!("keychain:cloudkey-access-key:{}", dsid), 64) + .expect("wha"), + ); for key in items { let Value::Data(data) = key else { continue }; - let serialized = CuttlefishSerializedKey::decode(&mut Cursor::new(data)).expect("failed to decode"); + let serialized = CuttlefishSerializedKey::decode(&mut Cursor::new(data)) + .expect("failed to decode"); let cloud = CloudKey::from_serialized_key(serialized, &keystore); *key = plist::to_value(&cloud).expect("Faield to serizsdf"); } @@ -383,7 +3061,10 @@ fn migrate(path: String) -> bool { let gsa_path = dir.join("gsa.plist"); if let Ok(mut account) = plist::from_file::<_, Dictionary>(&gsa_path) { if let Some(Value::Data(password)) = account.remove("password") { - account.insert("encrypted_password".to_string(), Value::Data(GSAConfig::encrypt(&password).expect("Undo").into())); + account.insert( + "encrypted_password".to_string(), + Value::Data(GSAConfig::encrypt(&password).expect("Undo").into()), + ); plist::to_file_xml(&gsa_path, &account).expect("failed to save!"); let findmy = dir.join("findmy.plist"); @@ -419,10 +3100,17 @@ pub fn reset_anisette(path: String) { } } -pub async fn make_anisette(path: String, config: &JoinedOSConfig, conn: &APSConnection) -> ArcAnisetteClient { +pub async fn make_anisette( + path: String, + config: &JoinedOSConfig, + conn: &APSConnection, +) -> ArcAnisetteClient { let dir = PathBuf::from_str(&path).unwrap(); - default_provider(get_login_config(&dir, config, conn).await, dir.join("anisette_test")) + default_provider( + get_login_config(&dir, config, conn).await, + dir.join("anisette_test"), + ) } #[frb(sync)] @@ -441,7 +3129,12 @@ pub fn save_users(users: &Vec, path: String) { plist::to_file_xml(id_path, users).unwrap(); } -pub async fn make_imclient(path: String, conn: &APSConnection, users: &Vec, identity: &IDSNGMIdentity) -> Arc { +pub async fn make_imclient( + path: String, + conn: &APSConnection, + users: &Vec, + identity: &IDSNGMIdentity, +) -> Arc { let dir = PathBuf::from_str(&path).unwrap(); let id_path = dir.join("id.plist"); @@ -453,11 +3146,26 @@ pub async fn make_imclient(path: String, conn: &APSConnection, users: &Vec, } - #[frb(sync)] -pub fn build_watcher(conn: &APSConnection, client: &Arc) -> (mpsc::Sender<()>, Arc>, APSWatcher) { +pub fn build_watcher( + conn: &APSConnection, + client: &Arc, +) -> (mpsc::Sender<()>, Arc>, APSWatcher) { import_watcher(conn.messages_cont.subscribe(), client) } #[frb(sync)] -pub fn import_watcher(queue: broadcast::Receiver, client: &Arc) -> (mpsc::Sender<()>, Arc>, APSWatcher) { +pub fn import_watcher( + queue: broadcast::Receiver, + client: &Arc, +) -> (mpsc::Sender<()>, Arc>, APSWatcher) { let (cancel_send, cancel_recv) = mpsc::channel::<()>(1); let (sender, recv) = mpsc::channel(999); - (cancel_send, Arc::new(sender), APSWatcher { - reg_state: client.identity.resource_state.subscribe(), - cancel_poll_recv: cancel_recv, - local_messages: recv, - inq_queue: queue, - }) + ( + cancel_send, + Arc::new(sender), + APSWatcher { + reg_state: client.identity.resource_state.subscribe(), + cancel_poll_recv: cancel_recv, + local_messages: recv, + inq_queue: queue, + }, + ) } #[frb(sync)] @@ -501,7 +3218,7 @@ pub struct DaemonData { pub fn send_daemon(state: SharedPushState, watcher: APSWatcher) -> (String, SharedPushState) { let data = DaemonData { watcher, - state: state.clone() + state: state.clone(), }; let num = Box::into_raw(Box::new(data)) as u64; @@ -529,7 +3246,7 @@ pub struct SharedPushState { pub anisette: ArcAnisetteClient, pub conn: APSConnection, pub icloud_services: Option, - + // APN services pub client: Arc, pub ft_client: Arc, @@ -566,7 +3283,28 @@ impl SharedPushState { let dir = PathBuf::from_str(&path).unwrap(); let keystore = dir.join("keystore.plist"); - #[cfg(not(target_os = "android"))] + #[cfg(target_os = "windows")] + { + let opened = match open_windows_keystore(&keystore) { + Ok(opened) => opened, + Err(error) => { + error!("Windows protected keystore restore failed: {error}"); + return None; + } + }; + let writer = opened.writer; + init_keystore(SoftwareKeystore { + state: std::sync::RwLock::new(opened.state), + update_state: Box::new(move |state| { + writer + .write_state(state) + .expect("Windows protected keystore persistence failed"); + }), + encryptor: opened.encryptor, + }); + } + + #[cfg(all(not(target_os = "android"), not(target_os = "windows")))] init_keystore(SoftwareKeystore { state: plist::from_file(&keystore).unwrap_or_default(), update_state: Box::new(move |state| { @@ -578,7 +3316,6 @@ impl SharedPushState { if let Err(err) = panic::catch_unwind(|| { migrate(path.clone()); }) { - if let Some(s) = err.downcast_ref::<&str>() { info!("Panic message: {}", s); } else if let Some(s) = err.downcast_ref::() { @@ -594,63 +3331,106 @@ impl SharedPushState { let users = restore_users(path.clone())?; let config = &hardware.os_config; let identity = IDSNGMIdentity::restore(hardware.identity.as_ref(), "openbubbles").ok()?; - let (conn, _) = setup_push(config, &identity, Some(hardware.push.clone()), path.clone()).await; + let (conn, _) = + setup_push(config, &identity, Some(hardware.push.clone()), path.clone()).await; let client = make_imclient(path.clone(), &conn, &users, &identity).await; let anisette = make_anisette(path.clone(), config, &conn).await; let account = restore_account(path.clone(), &anisette, config, &conn).await; info!("account {}", account.is_some()); - let (cancel_poll, local_broadcast, watcher) = build_watcher(&conn, &client); - Some((Self { - os_config: config.clone(), - cancel_poll, - conf_dir: path.clone(), - local_broadcast, - - anisette: anisette.clone(), - conn: conn.clone(), - icloud_services: if let Some(account) = &account { - let token_provider = make_token_provider(account, config); - let cloudkit = make_cloudkit(path.clone(), &anisette, config, &token_provider).await.expect("todo remove"); - let keychain = make_keychain(path.clone(), &cloudkit, &anisette, config, &token_provider); - - Some(SharedICloudServices { - account: account.clone(), - token_provider: token_provider.clone(), - - cloudkit_client: Some(cloudkit.clone()), - keychain: keychain.clone(), - passwords: if let Some(keychain) = &keychain { - Some(make_passwords(path.clone(), keychain, &cloudkit, &client, &conn).await) - } else { None }, - profiles_client: make_profiles(&cloudkit).await, - fmfd: if let Some(keychain) = &keychain { - make_findmy(path.clone(), &token_provider, &conn, &cloudkit, &keychain, &anisette, config, &client).await - } else { None }, - sharedstreams: make_shared_streams(path.clone(), &conn, &anisette, config, &token_provider).await, - cloud_messages_client: if let Some(keychain) = &keychain { - Some(make_cloud_messages_client(&cloudkit, &keychain)) - } else { None }, - statuskit_client: make_statuskit(path.clone(), &token_provider, &conn, config, &client).await, - }) - } else { None }, + Some(( + Self { + os_config: config.clone(), + cancel_poll, + conf_dir: path.clone(), + local_broadcast, + + anisette: anisette.clone(), + conn: conn.clone(), + icloud_services: if let Some(account) = &account { + let token_provider = make_token_provider(account, config); + let cloudkit = make_cloudkit(path.clone(), &anisette, config, &token_provider) + .await + .expect("todo remove"); + let keychain = + make_keychain(path.clone(), &cloudkit, &anisette, config, &token_provider); + + Some(SharedICloudServices { + account: account.clone(), + token_provider: token_provider.clone(), + + cloudkit_client: Some(cloudkit.clone()), + keychain: keychain.clone(), + passwords: if let Some(keychain) = &keychain { + Some( + make_passwords(path.clone(), keychain, &cloudkit, &client, &conn) + .await, + ) + } else { + None + }, + profiles_client: make_profiles(&cloudkit).await, + fmfd: if let Some(keychain) = &keychain { + make_findmy( + path.clone(), + &token_provider, + &conn, + &cloudkit, + &keychain, + &anisette, + config, + &client, + ) + .await + } else { + None + }, + sharedstreams: make_shared_streams( + path.clone(), + &conn, + &anisette, + config, + &token_provider, + ) + .await, + cloud_messages_client: if let Some(keychain) = &keychain { + Some(make_cloud_messages_client(&cloudkit, &keychain)) + } else { + None + }, + statuskit_client: make_statuskit( + path.clone(), + &token_provider, + &conn, + config, + &client, + ) + .await, + }) + } else { + None + }, - ft_client: make_facetime(path.clone(), &conn, &client).await, - client, - idms_client: make_idms(&conn).await, - - active_circle_sessions: make_circle_sessions(), - client_session: make_client_session(None), - }, watcher)) + ft_client: make_facetime(path.clone(), &conn, &client).await, + client, + idms_client: make_idms(&conn).await, + + active_circle_sessions: make_circle_sessions(), + client_session: make_client_session(None), + }, + watcher, + )) } } #[frb(sync)] -pub fn make_client_session(circle: Option>) -> Arc>>> { +pub fn make_client_session( + circle: Option>, +) -> Arc>>> { Arc::new(Mutex::new(circle)) } @@ -659,22 +3439,30 @@ pub fn make_circle_sessions() -> Arc>> { Arc::new(Mutex::new(vec![])) } - -pub async fn restore_account(path: String, anisette: &ArcAnisetteClient, config: &JoinedOSConfig, conn: &APSConnection) -> Option>>> { +pub async fn restore_account( + path: String, + anisette: &ArcAnisetteClient, + config: &JoinedOSConfig, + conn: &APSConnection, +) -> Option>>> { let dir = PathBuf::from_str(&path).unwrap(); - let mut state = plist::from_file::<_, GSAConfig>(&dir.join("gsa.plist")).ok()?; - let mut apple_account = - AppleAccount::new_with_anisette(get_login_config(&dir, config, conn).await, anisette.clone()).expect("aacbf?"); - + let mut apple_account = AppleAccount::new_with_anisette( + get_login_config(&dir, config, conn).await, + anisette.clone(), + ) + .expect("aacbf?"); + apple_account.username = Some(state.username.clone()); apple_account.hashed_password = state.get_password().ok(); if state.postdata_done.is_none() { info!("Updating postdata"); - let _ = apple_account.update_postdata("Apple Device", None, &["icloud", "imessage", "facetime"]).await; + let _ = apple_account + .update_postdata("Apple Device", None, &["icloud", "imessage", "facetime"]) + .await; state.postdata_done = Some(true); plist::to_file_xml(dir.join("gsa.plist"), &state).unwrap(); } @@ -683,30 +3471,56 @@ pub async fn restore_account(path: String, anisette: &ArcAnisetteClient>>, config: &JoinedOSConfig) -> Arc> { +pub fn make_token_provider( + account: &Arc>>, + config: &JoinedOSConfig, +) -> Arc> { TokenProvider::new(account.clone(), config.config()) } -pub async fn make_shared_streams(path: String, conn: &APSConnection, anisette: &ArcAnisetteClient, - config: &JoinedOSConfig, token: &Arc>) -> Option> { +pub async fn make_shared_streams( + path: String, + conn: &APSConnection, + anisette: &ArcAnisetteClient, + config: &JoinedOSConfig, + token: &Arc>, +) -> Option> { let dir = PathBuf::from_str(&path).unwrap(); let stream_path = dir.join("sharedstreams.plist"); - let state = plist::from_file(&stream_path).ok()?; - - let client = SharedStreamClient::new(state, Box::new(move |update| { - plist::to_file_xml(&stream_path, update).unwrap(); - }), token.clone(), conn.clone(), anisette.clone(), config.config()).await; - + let state = plist::from_file(&stream_path).ok()?; - let sync = SyncController::new(client, dir.join("sync.plist"), MyFilePackager::default(), Duration::from_secs(60 * 30)).await; + let client = SharedStreamClient::new( + state, + Box::new(move |update| { + plist::to_file_xml(&stream_path, update).unwrap(); + }), + token.clone(), + conn.clone(), + anisette.clone(), + config.config(), + ) + .await; + + let sync = SyncController::new( + client, + dir.join("sync.plist"), + MyFilePackager::default(), + Duration::from_secs(60 * 30), + ) + .await; subscribe_streams(sync.clone()); Some(sync) } -pub async fn make_cloudkit(path: String, anisette: &ArcAnisetteClient, config: &JoinedOSConfig, token_provider: &Arc>) -> Option>> { +pub async fn make_cloudkit( + path: String, + anisette: &ArcAnisetteClient, + config: &JoinedOSConfig, + token_provider: &Arc>, +) -> Option>> { let dir = PathBuf::from_str(&path).unwrap(); let cloudkit_path = dir.join("cloudkit.plist"); @@ -716,62 +3530,120 @@ pub async fn make_cloudkit(path: String, anisette: &ArcAnisetteClient>) -> Arc> { +pub async fn make_profiles( + cloudkit: &Arc>, +) -> Arc> { Arc::new(ProfilesClient::new(cloudkit.clone())) } -pub async fn make_passwords(path: String, keychain: &Arc>, cloudkit: &Arc>, client: &Arc, conn: &APSConnection) -> Arc> { +pub async fn make_passwords( + path: String, + keychain: &Arc>, + cloudkit: &Arc>, + client: &Arc, + conn: &APSConnection, +) -> Arc> { let dir = PathBuf::from_str(&path).unwrap(); let path = dir.join("passwords.plist"); let state: PasswordState = plist::from_file(&path).unwrap_or_default(); - PasswordManager::new(keychain.clone(), cloudkit.clone(), client.identity.clone(), conn.clone(), state, Box::new(move |item| { - plist::to_file_xml(&path, item).expect("Failed to serialize plist!"); - }), Box::new(|manager, wifi| { - if !wifi { return } - tokio::spawn(async move { - sync_wifi_passwords(&manager, false).await; - }); - })).await + PasswordManager::new( + keychain.clone(), + cloudkit.clone(), + client.identity.clone(), + conn.clone(), + state, + Box::new(move |item| { + plist::to_file_xml(&path, item).expect("Failed to serialize plist!"); + }), + Box::new(|manager, wifi| { + if !wifi { + return; + } + tokio::spawn(async move { + sync_wifi_passwords(&manager, false).await; + }); + }), + ) + .await } -pub async fn sync_wifi_passwords(manager: &Arc>, user_approve: bool) { - let wifi_networks: HashMap = get_wifi_passwords(manager).await.into_values() - .map(|(_, p)| (p.acct, String::from_utf8(p.data).expect("bad password!"))).collect(); +pub async fn sync_wifi_passwords( + manager: &Arc>, + user_approve: bool, +) { + let wifi_networks: HashMap = get_wifi_passwords(manager) + .await + .into_values() + .map(|(_, p)| (p.acct, String::from_utf8(p.data).expect("bad password!"))) + .collect(); if let Some(handle) = HANDLE_WIFI_NETWORKS.get() { handle.handle_wifi_networks(wifi_networks, user_approve); } } -pub async fn make_facetime(path: String, conn: &APSConnection, client: &Arc) -> Arc { +pub async fn make_facetime( + path: String, + conn: &APSConnection, + client: &Arc, +) -> Arc { let dir = PathBuf::from_str(&path).unwrap(); let facetime_path = dir.join("facetime.plist"); let state: FTState = plist::from_file(&facetime_path).unwrap_or_default(); - Arc::new(FTClient::new(state, Box::new(move |state| { - plist::to_file_xml(&facetime_path, state).expect("Failed to serialize plist!"); - }), conn.clone(), client.identity.clone(), conn.os_config.clone()).await) + Arc::new( + FTClient::new( + state, + Box::new(move |state| { + plist::to_file_xml(&facetime_path, state).expect("Failed to serialize plist!"); + }), + conn.clone(), + client.identity.clone(), + conn.os_config.clone(), + ) + .await, + ) } -pub async fn make_statuskit(path: String, provider: &Arc>, conn: &APSConnection, config: &JoinedOSConfig, client: &Arc) -> Arc> { +pub async fn make_statuskit( + path: String, + provider: &Arc>, + conn: &APSConnection, + config: &JoinedOSConfig, + client: &Arc, +) -> Arc> { let dir = PathBuf::from_str(&path).unwrap(); let path = dir.join("statuskit.plist"); let state: StatusKitState = plist::from_file(&path).unwrap_or_default(); - StatusKitClient::new(state, Box::new(move |state| { - plist::to_file_xml(&path, state).unwrap(); - }), provider.clone(), conn.clone(), config.config(), client.identity.clone()).await + StatusKitClient::new( + state, + Box::new(move |state| { + plist::to_file_xml(&path, state).unwrap(); + }), + provider.clone(), + conn.clone(), + config.config(), + client.identity.clone(), + ) + .await } #[frb(sync)] -pub fn make_keychain(path: String, cloudkit: &Arc>, anisette: &ArcAnisetteClient, config: &JoinedOSConfig, token_provider: &Arc>) -> Option>> { +pub fn make_keychain( + path: String, + cloudkit: &Arc>, + anisette: &ArcAnisetteClient, + config: &JoinedOSConfig, + token_provider: &Arc>, +) -> Option>> { let dir = PathBuf::from_str(&path).unwrap(); let cloudkit_path = dir.join("keychain.plist"); @@ -796,32 +3668,73 @@ pub fn make_keychain(path: String, cloudkit: &Arc>, keychain: &Arc>) -> Arc> { +pub fn make_cloud_messages_client( + cloudkit: &Arc>, + keychain: &Arc>, +) -> Arc> { Arc::new(CloudMessagesClient::new(cloudkit.clone(), keychain.clone())) } -pub async fn make_findmy(path: String, token_provider: &Arc>, conn: &APSConnection, cloudkit: &Arc>, keychain: &Arc>, anisette: &ArcAnisetteClient, config: &JoinedOSConfig, client: &Arc) -> Option>> { +pub async fn make_findmy( + path: String, + token_provider: &Arc>, + conn: &APSConnection, + cloudkit: &Arc>, + keychain: &Arc>, + anisette: &ArcAnisetteClient, + config: &JoinedOSConfig, + client: &Arc, +) -> Option>> { let dir = PathBuf::from_str(&path).unwrap(); let id_path = dir.join("findmy.plist"); let state = FindMyState::restore(&fs::read(&id_path).ok()?).ok()?; - Some(Arc::new(FindMyClient::new(conn.clone(), cloudkit.clone(), keychain.clone(), config.config(), Arc::new(FindMyStateManager { - state: Mutex::new(state), - update: Box::new(move |state| { - fs::write(&id_path, state).expect("Failed to serialize plist!"); - }), - }), token_provider.clone(), anisette.clone(), client.identity.clone()).await.unwrap())) + Some(Arc::new( + FindMyClient::new( + conn.clone(), + cloudkit.clone(), + keychain.clone(), + config.config(), + Arc::new(FindMyStateManager { + state: Mutex::new(state), + update: Box::new(move |state| { + fs::write(&id_path, state).expect("Failed to serialize plist!"); + }), + }), + token_provider.clone(), + anisette.clone(), + client.identity.clone(), + ) + .await + .unwrap(), + )) } -async fn shared_items(manager: &SyncManager, seen_paths: &mut HashSet) -> HashSet { - let paths = manager.sync_states.lock().await.values().map(|v| v.folder.clone()).collect::>(); +async fn shared_items< + P: AnisetteProvider + Send + Sync + 'static, + F: FilePackager + Send + Sync + 'static, +>( + manager: &SyncManager, + seen_paths: &mut HashSet, +) -> HashSet { + let paths = manager + .sync_states + .lock() + .await + .values() + .map(|v| v.folder.clone()) + .collect::>(); let mut new = HashSet::new(); seen_paths.retain(|a| fs::exists(a).is_ok_and(|a| a)); for path in paths { - let Ok(read) = fs::read_dir(path) else { continue }; + let Ok(read) = fs::read_dir(path) else { + continue; + }; for file in read { let Ok(result) = file else { continue }; - if seen_paths.contains(&result.path()) { continue } + if seen_paths.contains(&result.path()) { + continue; + } seen_paths.insert(result.path()); new.insert(result.path()); } @@ -829,7 +3742,12 @@ async fn shared_items(manager: SyncManager) { +fn subscribe_streams< + P: AnisetteProvider + Send + Sync + 'static, + F: FilePackager + Send + Sync + 'static, +>( + manager: SyncManager, +) { tokio::spawn(async move { let mut seen_paths = HashSet::new(); shared_items(&manager, &mut seen_paths).await; @@ -838,14 +3756,20 @@ fn subscribe_streams IDSUser { user.clone() } -pub async fn register_ids(path: String, config: &JoinedOSConfig, aps: &APSConnection, identity: &IDSNGMIdentity, mut users: Vec) -> anyhow::Result<(Option>, Option)> { +pub async fn register_ids( + path: String, + config: &JoinedOSConfig, + aps: &APSConnection, + identity: &IDSNGMIdentity, + mut users: Vec, +) -> anyhow::Result<(Option>, Option)> { let dir = PathBuf::from_str(&path).unwrap(); - if let Err(err) = register(&*config.config(), &*aps.state.read().await, &[&MADRID_SERVICE, &MULTIPLEX_SERVICE, &FACETIME_SERVICE, &VIDEO_SERVICE], &mut users, identity).await { + if let Err(err) = register( + &*config.config(), + &*aps.state.read().await, + &[ + &MADRID_SERVICE, + &MULTIPLEX_SERVICE, + &FACETIME_SERVICE, + &VIDEO_SERVICE, + ], + &mut users, + identity, + ) + .await + { return if let PushError::CustomerMessage(support) = err { Ok((None, Some(support))) } else { Err(anyhow!(err)) - } + }; } let id_path = dir.join("id.plist"); std::fs::write(&id_path, plist_to_string(&users).unwrap()).unwrap(); @@ -874,7 +3817,9 @@ pub async fn register_ids(path: String, config: &JoinedOSConfig, aps: &APSConnec } pub async fn set_identity(state_path: String, config: &JoinedOSConfig, identity: &IDSNGMIdentity) { - let state_path = PathBuf::from_str(&state_path).unwrap().join("hw_info.plist"); + let state_path = PathBuf::from_str(&state_path) + .unwrap() + .join("hw_info.plist"); let state = SavedHardwareState { push: Default::default(), os_config: config.clone(), @@ -883,8 +3828,15 @@ pub async fn set_identity(state_path: String, config: &JoinedOSConfig, identity: std::fs::write(&state_path, plist_to_string(&state).unwrap()).unwrap(); } -pub async fn setup_push(config: &JoinedOSConfig, identity: &IDSNGMIdentity, state: Option, state_path: String) -> (APSConnection, Option) { - let state_path = PathBuf::from_str(&state_path).unwrap().join("hw_info.plist"); +pub async fn setup_push( + config: &JoinedOSConfig, + identity: &IDSNGMIdentity, + state: Option, + state_path: String, +) -> (APSConnection, Option) { + let state_path = PathBuf::from_str(&state_path) + .unwrap() + .join("hw_info.plist"); let (conn, error) = APSConnectionResource::new(config.config(), state).await; let saved_identity = identity.save("openbubbles").expect("failed to save"); @@ -904,7 +3856,9 @@ pub async fn setup_push(config: &JoinedOSConfig, identity: &IDSNGMIdentity, stat loop { match to_refresh.recv().await { Ok(()) => { - let Some(conn) = reconn_conn.upgrade() else { break }; + let Some(conn) = reconn_conn.upgrade() else { + break; + }; // update keys let state = SavedHardwareState { push: conn.state.read().await.clone(), @@ -912,7 +3866,7 @@ pub async fn setup_push(config: &JoinedOSConfig, identity: &IDSNGMIdentity, stat identity: saved_identity.clone().into(), }; std::fs::write(&state_path, plist_to_string(&state).unwrap()).unwrap(); - }, + } Err(broadcast::error::RecvError::Lagged(_)) => continue, Err(broadcast::error::RecvError::Closed) => break, } @@ -922,9 +3876,58 @@ pub async fn setup_push(config: &JoinedOSConfig, identity: &IDSNGMIdentity, stat (conn, error) } +#[derive(Clone, Debug, Serialize)] +pub struct ApsConnectionStatus { + pub state: String, + pub active_port: Option, + pub error: Option, + pub retry_wait_seconds: Option, +} + +pub async fn get_aps_connection_status(aps: &APSConnection) -> ApsConnectionStatus { + let active_port = aps.active_port(); + match &*aps.resource_state.borrow() { + ResourceState::Generated => ApsConnectionStatus { + state: "connected".to_string(), + active_port, + error: None, + retry_wait_seconds: None, + }, + ResourceState::Generating => ApsConnectionStatus { + state: "reconnecting".to_string(), + active_port: None, + error: None, + retry_wait_seconds: None, + }, + ResourceState::Failed(failure) => ApsConnectionStatus { + state: "blocked".to_string(), + active_port: None, + error: Some(failure.error.to_string()), + retry_wait_seconds: failure.retry_wait, + }, + ResourceState::Closed => ApsConnectionStatus { + state: "closed".to_string(), + active_port: None, + error: Some("Apple Push connection is closed".to_string()), + retry_wait_seconds: None, + }, + } +} + +pub async fn refresh_aps_connection(aps: &APSConnection) -> anyhow::Result<()> { + // A network transition is explicit evidence that the existing socket and backoff + // belong to the old route. Do not retain ResourceManager's normal 15-second refresh + // suppression here. + aps.request_update_now().await; + Ok(()) +} + #[derive(Serialize, Deserialize)] pub struct AnisetteState { - #[serde(serialize_with = "bin_serialize", deserialize_with = "bin_deserialize_16")] + #[serde( + serialize_with = "bin_serialize", + deserialize_with = "bin_deserialize_16" + )] keychain_identifier: [u8; 16], provisioned: Option, } @@ -946,12 +3949,22 @@ pub enum ProvisionedFlavor { IOS, } -async fn get_login_config(conf_dir: &PathBuf, conf: &JoinedOSConfig, conn: &APSConnection) -> LoginClientInfo { +async fn get_login_config( + conf_dir: &PathBuf, + conf: &JoinedOSConfig, + conn: &APSConnection, +) -> LoginClientInfo { let anisette_dir = conf_dir.join("anisette_test"); let config_path = anisette_dir.join("state.plist"); let require_mac = if let Ok(decoded) = plist::from_file::<_, AnisetteState>(config_path) { - matches!(decoded.provisioned, Some(ProvisionedAnisette { flavor: ProvisionedFlavor::Mac, .. })) + matches!( + decoded.provisioned, + Some(ProvisionedAnisette { + flavor: ProvisionedFlavor::Mac, + .. + }) + ) } else { false }; @@ -965,7 +3978,6 @@ pub async fn configure_app_review(path: String) -> anyhow::Result<()> { std::fs::write(path.join("id.plist"), include_str!("id_testing.plist"))?; std::fs::write(path.join("hw_info.plist"), include_str!("hw_testing.plist"))?; - // let state = SharedPushState::restore(path) Ok(()) } @@ -992,7 +4004,10 @@ pub fn generate_udid() -> String { encode_hex(&udid).to_uppercase() } -pub fn config_from_validation_data(data: Vec, extra: HwExtra) -> anyhow::Result { +pub fn config_from_validation_data( + data: Vec, + extra: HwExtra, +) -> anyhow::Result { let inner = HardwareConfig::from_validation_data(&data)?; Ok(JoinedOSConfig::MacOS(Arc::new(MacOSConfig { inner, @@ -1005,7 +4020,11 @@ pub fn config_from_validation_data(data: Vec, extra: HwExtra) -> anyhow::Res }))) } -pub async fn config_from_relay(code: String, host: String, token: &Option) -> anyhow::Result { +pub async fn config_from_relay( + code: String, + host: String, + token: &Option, +) -> anyhow::Result { Ok(JoinedOSConfig::Relay(Arc::new(RelayConfig { version: RelayConfig::get_versions(&host, &code, token).await?, icloud_ua: "com.apple.iCloudHelper/282 CFNetwork/1408.0.4 Darwin/22.5.0".to_string(), @@ -1020,17 +4039,22 @@ pub async fn config_from_relay(code: String, host: String, token: &Option anyhow::Result> { - let Err(PushError::RelayError(_, message)) = config_ref.generate_validation_data().await else { return Ok(match config_ref { - JoinedOSConfig::MacOS(macos) => None, - JoinedOSConfig::Relay(relay) => Some(relay.code.clone()) - }) }; - if !message.contains("Subscription not active!") && !message.contains("Ticket not activated!") && !message.contains("Sorry, your hosted device is currently offline!") { + let Err(PushError::RelayError(_, message)) = config_ref.generate_validation_data().await else { + return Ok(match config_ref { + JoinedOSConfig::MacOS(macos) => None, + JoinedOSConfig::Relay(relay) => Some(relay.code.clone()), + }); + }; + if !message.contains("Subscription not active!") + && !message.contains("Ticket not activated!") + && !message.contains("Sorry, your hosted device is currently offline!") + { info!("Validation failed {message}"); return Ok(None); } Ok(match config_ref { JoinedOSConfig::MacOS(macos) => None, - JoinedOSConfig::Relay(relay) => Some(relay.code.clone()) + JoinedOSConfig::Relay(relay) => Some(relay.code.clone()), }) } @@ -1046,18 +4070,24 @@ pub fn parse_poster(poster: IMessagePosterRecord) -> anyhow::Result anyhow::Result { +pub fn from_poster( + mut poster: SimplifiedIncomingCallPoster, +) -> anyhow::Result { Ok(poster.to_poster()?) } // simple round trip to rust clones object #[frb(sync)] -pub fn clone_poster(poster: SimplifiedIncomingCallPoster) -> anyhow::Result { +pub fn clone_poster( + poster: SimplifiedIncomingCallPoster, +) -> anyhow::Result { Ok(poster) } #[frb(sync)] -pub fn clone_transcript_poster(poster: SimplifiedTranscriptPoster) -> anyhow::Result { +pub fn clone_transcript_poster( + poster: SimplifiedTranscriptPoster, +) -> anyhow::Result { Ok(poster) } @@ -1116,32 +4146,35 @@ pub fn get_device_info(config: &JoinedOSConfig) -> anyhow::Result { encoded_data: match config { JoinedOSConfig::MacOS(config) => { let copied = config.as_ref().clone(); - Some(crate::bbhwinfo::HwInfo { - inner: Some(crate::bbhwinfo::hw_info::InnerHwInfo { - product_name: copied.inner.product_name, - io_mac_address: copied.inner.io_mac_address.to_vec(), - platform_serial_number: copied.inner.platform_serial_number, - platform_uuid: copied.inner.platform_uuid, - root_disk_uuid: copied.inner.root_disk_uuid, - board_id: copied.inner.board_id, - os_build_num: copied.inner.os_build_num, - platform_serial_number_enc: copied.inner.platform_serial_number_enc, - platform_uuid_enc: copied.inner.platform_uuid_enc, - root_disk_uuid_enc: copied.inner.root_disk_uuid_enc, - rom: copied.inner.rom, - rom_enc: copied.inner.rom_enc, - mlb: copied.inner.mlb, - mlb_enc: copied.inner.mlb_enc - }), - version: copied.version, - protocol_version: copied.protocol_version as i32, - device_id: copied.device_id, - icloud_ua: copied.icloud_ua, - aoskit_version: copied.aoskit_version, - }.encode_to_vec()) - }, - JoinedOSConfig::Relay(_) => None - } + Some( + crate::bbhwinfo::HwInfo { + inner: Some(crate::bbhwinfo::hw_info::InnerHwInfo { + product_name: copied.inner.product_name, + io_mac_address: copied.inner.io_mac_address.to_vec(), + platform_serial_number: copied.inner.platform_serial_number, + platform_uuid: copied.inner.platform_uuid, + root_disk_uuid: copied.inner.root_disk_uuid, + board_id: copied.inner.board_id, + os_build_num: copied.inner.os_build_num, + platform_serial_number_enc: copied.inner.platform_serial_number_enc, + platform_uuid_enc: copied.inner.platform_uuid_enc, + root_disk_uuid_enc: copied.inner.root_disk_uuid_enc, + rom: copied.inner.rom, + rom_enc: copied.inner.rom_enc, + mlb: copied.inner.mlb, + mlb_enc: copied.inner.mlb_enc, + }), + version: copied.version, + protocol_version: copied.protocol_version as i32, + device_id: copied.device_id, + icloud_ua: copied.icloud_ua, + aoskit_version: copied.aoskit_version, + } + .encode_to_vec(), + ) + } + JoinedOSConfig::Relay(_) => None, + }, }) } @@ -1163,7 +4196,7 @@ pub fn config_from_encoded(encoded: Vec) -> anyhow::Result { rom: inner.rom, rom_enc: inner.rom_enc, mlb: inner.mlb, - mlb_enc: inner.mlb_enc + mlb_enc: inner.mlb_enc, }, version: copied.version, protocol_version: copied.protocol_version as u32, @@ -1174,7 +4207,6 @@ pub fn config_from_encoded(encoded: Vec) -> anyhow::Result { }))) } - pub async fn ptr_to_dart(ptr: String) -> Option { let pointer: u64 = ptr.parse().unwrap(); info!("using pointer {pointer}"); @@ -1187,8 +4219,6 @@ pub async fn complete_msg(ptr: String) { QUEUED_MESSAGES.lock().await.1.remove(&pointer); } - - #[frb(sync)] pub fn restore_attachment(data: String) -> Attachment { plist::from_reader_xml(Cursor::new(data)).unwrap() @@ -1217,8 +4247,6 @@ pub fn ns_null() -> Vec { plist_to_bin(&Value::String("$null".to_string())).unwrap() } - - #[repr(C)] #[derive(Clone)] pub enum PushMessage { @@ -1238,10 +4266,13 @@ pub enum PushMessage { sender: String, beacon: String, attributes: BeaconAttributes, - } + }, } -pub async fn sync_passwords(passwords: &Arc>, conn: &APSConnection) -> anyhow::Result<()> { +pub async fn sync_passwords( + passwords: &Arc>, + conn: &APSConnection, +) -> anyhow::Result<()> { passwords.sync_passwords(conn).await?; sync_wifi_passwords(passwords, false).await; @@ -1249,52 +4280,104 @@ pub async fn sync_passwords(passwords: &Arc>) -> HashMap, PasswordRawEntry)> { +pub async fn get_passwords( + passwords: &Arc>, +) -> HashMap, PasswordRawEntry)> { passwords.get_password_entries().await } -pub async fn get_passwords_meta(passwords: &Arc>) -> HashMap, PasswordManagerMeta)> { +pub async fn get_passwords_meta( + passwords: &Arc>, +) -> HashMap, PasswordManagerMeta)> { passwords.get_password_entries().await } -pub async fn get_passkeys(passwords: &Arc>) -> HashMap, Passkey)> { +pub async fn get_passkeys( + passwords: &Arc>, +) -> HashMap, Passkey)> { passwords.get_password_entries().await } -pub async fn get_wifi_passwords(passwords: &Arc>) -> HashMap, WifiPassword)> { +pub async fn get_wifi_passwords( + passwords: &Arc>, +) -> HashMap, WifiPassword)> { passwords.get_password_entries().await } -pub async fn save_password(passwords: &Arc>, id: String, entry: &PasswordRawEntry, group: Option) -> anyhow::Result<()> { +pub async fn save_password( + passwords: &Arc>, + id: String, + entry: &PasswordRawEntry, + group: Option, +) -> anyhow::Result<()> { Ok(passwords.insert_password_entry(&id, entry, group).await?) } -pub async fn save_password_meta(passwords: &Arc>, id: String, entry: &PasswordManagerMeta, group: Option) -> anyhow::Result<()> { +pub async fn save_password_meta( + passwords: &Arc>, + id: String, + entry: &PasswordManagerMeta, + group: Option, +) -> anyhow::Result<()> { Ok(passwords.insert_password_entry(&id, entry, group).await?) } -pub async fn save_passkey(passwords: &Arc>, id: String, entry: &Passkey, group: Option) -> anyhow::Result<()> { +pub async fn save_passkey( + passwords: &Arc>, + id: String, + entry: &Passkey, + group: Option, +) -> anyhow::Result<()> { Ok(passwords.insert_password_entry(&id, entry, group).await?) } -pub async fn save_wifi_password(passwords: &Arc>, id: String, entry: &WifiPassword, group: Option) -> anyhow::Result<()> { +pub async fn save_wifi_password( + passwords: &Arc>, + id: String, + entry: &WifiPassword, + group: Option, +) -> anyhow::Result<()> { Ok(passwords.insert_password_entry(&id, entry, group).await?) } -pub async fn delete_password(passwords: &Arc>, id: String, group: Option) -> anyhow::Result<()> { - Ok(passwords.delete_password_entry::(&id, group).await?) +pub async fn delete_password( + passwords: &Arc>, + id: String, + group: Option, +) -> anyhow::Result<()> { + Ok(passwords + .delete_password_entry::(&id, group) + .await?) } -pub async fn delete_password_meta(passwords: &Arc>, id: String, group: Option) -> anyhow::Result<()> { - Ok(passwords.delete_password_entry::(&id, group).await?) +pub async fn delete_password_meta( + passwords: &Arc>, + id: String, + group: Option, +) -> anyhow::Result<()> { + Ok(passwords + .delete_password_entry::(&id, group) + .await?) } -pub async fn delete_passkey(passwords: &Arc>, id: String, group: Option) -> anyhow::Result<()> { - Ok(passwords.delete_password_entry::(&id, group).await?) +pub async fn delete_passkey( + passwords: &Arc>, + id: String, + group: Option, +) -> anyhow::Result<()> { + Ok(passwords + .delete_password_entry::(&id, group) + .await?) } -pub async fn delete_wifi_password(passwords: &Arc>, id: String, group: Option) -> anyhow::Result<()> { - Ok(passwords.delete_password_entry::(&id, group).await?) +pub async fn delete_wifi_password( + passwords: &Arc>, + id: String, + group: Option, +) -> anyhow::Result<()> { + Ok(passwords + .delete_password_entry::(&id, group) + .await?) } pub struct GroupSummaryMember { @@ -1310,154 +4393,304 @@ pub struct GroupSummary { pub members: Vec, } -pub async fn get_groups(passwords: &Arc>) -> anyhow::Result<(String, HashMap, HashMap)> { +pub async fn get_groups( + passwords: &Arc>, +) -> anyhow::Result<( + String, + HashMap, + HashMap, +)> { let container = passwords.get_container().await?; let state = passwords.state.read().await; - let filter = state.groups.iter().filter_map(|(id, group)| { - let item = group.share.as_ref()?; - Some((id.clone(), GroupSummary { - display_name: item.display_name.clone(), - is_owner: group.is_owner, - members: item.share_info.participants.iter().filter_map(|p| if p.state() == 3 { None } else { - Some(GroupSummaryMember { - name: p.contact_information.as_ref()?.first_name.clone(), - handle: p.contact_information.as_ref().and_then(|c| contact_info_to_handle(c))?, - user_id: p.user_id.as_ref().and_then(|u| u.name.clone()), - is_joined: p.state() == 2, - }) - }).collect() - })) - }).collect::>(); - Ok((container.user_id.clone(), filter, state.invite_groups.clone())) + let filter = state + .groups + .iter() + .filter_map(|(id, group)| { + let item = group.share.as_ref()?; + Some(( + id.clone(), + GroupSummary { + display_name: item.display_name.clone(), + is_owner: group.is_owner, + members: item + .share_info + .participants + .iter() + .filter_map(|p| { + if p.state() == 3 { + None + } else { + Some(GroupSummaryMember { + name: p.contact_information.as_ref()?.first_name.clone(), + handle: p + .contact_information + .as_ref() + .and_then(|c| contact_info_to_handle(c))?, + user_id: p.user_id.as_ref().and_then(|u| u.name.clone()), + is_joined: p.state() == 2, + }) + } + }) + .collect(), + }, + )) + }) + .collect::>(); + Ok(( + container.user_id.clone(), + filter, + state.invite_groups.clone(), + )) } -pub async fn create_group(passwords: &Arc>, name: String) -> anyhow::Result { +pub async fn create_group( + passwords: &Arc>, + name: String, +) -> anyhow::Result { Ok(passwords.create_group(&name).await?) } -pub async fn delete_group(passwords: &Arc>, gid: String) -> anyhow::Result<()> { +pub async fn delete_group( + passwords: &Arc>, + gid: String, +) -> anyhow::Result<()> { Ok(passwords.remove_group(&gid).await?) } -pub async fn invite_user(passwords: &Arc>, gid: String, handle: String) -> anyhow::Result<()> { +pub async fn invite_user( + passwords: &Arc>, + gid: String, + handle: String, +) -> anyhow::Result<()> { Ok(passwords.invite_user(&gid, &handle).await?) } -pub async fn remove_user(passwords: &Arc>, gid: String, handle: String) -> anyhow::Result<()> { +pub async fn remove_user( + passwords: &Arc>, + gid: String, + handle: String, +) -> anyhow::Result<()> { Ok(passwords.remove_user(&gid, &handle).await?) } -pub async fn rename_group(passwords: &Arc>, gid: String, newname: String) -> anyhow::Result<()> { +pub async fn rename_group( + passwords: &Arc>, + gid: String, + newname: String, +) -> anyhow::Result<()> { Ok(passwords.rename_group(&gid, &newname).await?) } -pub async fn accept_invite(passwords: &Arc>, invite_id: String) -> anyhow::Result<()> { +pub async fn accept_invite( + passwords: &Arc>, + invite_id: String, +) -> anyhow::Result<()> { Ok(passwords.accept_invite(&invite_id).await?) } -pub async fn decline_invite(passwords: &Arc>, invite_id: String) -> anyhow::Result<()> { +pub async fn decline_invite( + passwords: &Arc>, + invite_id: String, +) -> anyhow::Result<()> { Ok(passwords.decline_invite(&invite_id).await?) } -pub async fn query_handle(passwords: &Arc>, handle: String) -> anyhow::Result { +pub async fn query_handle( + passwords: &Arc>, + handle: String, +) -> anyhow::Result { Ok(passwords.query_handle(&handle).await?) } -async fn handle_photostream(client: &SharedStreamClient, changes: Vec, local: &Arc>) { +async fn handle_photostream( + client: &SharedStreamClient, + changes: Vec, + local: &Arc>, +) { let lock = &client.state.read().await.albums; for change in changes { - let Some(item) = lock.iter().find(|a| &a.albumguid == &change) else { continue }; + let Some(item) = lock.iter().find(|a| &a.albumguid == &change) else { + continue; + }; if item.sharingtype == "pending" { - local.send(PushMessage::NewPhotostream(item.clone())).await.expect("Dropped?"); + local + .send(PushMessage::NewPhotostream(item.clone())) + .await + .expect("Dropped?"); } } } -pub async fn update_account_headers(account: &Arc>>, config: &JoinedOSConfig) -> anyhow::Result<(String, UpdateAccountFinish)> { +pub async fn update_account_headers( + account: &Arc>>, + config: &JoinedOSConfig, +) -> anyhow::Result<(String, UpdateAccountFinish)> { let account = account.lock().await; Ok(request_update_account(&*account, &*config.config()).await?) } -pub async fn get_anisette_headers(state: &ArcAnisetteClient, config: &JoinedOSConfig) -> anyhow::Result> { +pub async fn get_anisette_headers( + state: &ArcAnisetteClient, + config: &JoinedOSConfig, +) -> anyhow::Result> { let mut headers = state.lock().await.get_headers().await?.clone(); - headers.insert("X-Mme-Client-Info".to_string(), config.get_adi_mme_info("com.apple.AuthKit/1 (com.apple.findmy/375.20)", !headers["X-Mme-Client-Info"].contains("iPhone OS"))); + headers.insert( + "X-Mme-Client-Info".to_string(), + config.get_adi_mme_info( + "com.apple.AuthKit/1 (com.apple.findmy/375.20)", + !headers["X-Mme-Client-Info"].contains("iPhone OS"), + ), + ); Ok(headers) } -pub async fn get_contacts_headers(path: String, state: &ArcAnisetteClient, token_provider: &Arc>, config: &JoinedOSConfig) -> anyhow::Result> { +pub async fn get_contacts_headers( + path: String, + state: &ArcAnisetteClient, + token_provider: &Arc>, + config: &JoinedOSConfig, +) -> anyhow::Result> { let dir = PathBuf::from_str(&path).unwrap(); // I know it's the wrong answer. Stop looking at me! let id_path = dir.join("sharedstreams.plist"); let findmy_state: SharedStreamsState = plist::from_file(id_path)?; - + let mut headers = state.lock().await.get_headers().await?.clone(); - headers.insert("X-Mme-Client-Info".to_string(), config.get_adi_mme_info("com.apple.AuthKit/1 (com.apple.AddressBookSourceSync/2695.500.71)", !headers["X-Mme-Client-Info"].contains("iPhone OS"))); - - headers.insert("X-APPLE-FAMILY-AUTH-TOKEN".to_string(), token_provider.get_gsa_token("com.apple.gs.icloud.family.auth").await.expect("no Family auth token?")); + headers.insert( + "X-Mme-Client-Info".to_string(), + config.get_adi_mme_info( + "com.apple.AuthKit/1 (com.apple.AddressBookSourceSync/2695.500.71)", + !headers["X-Mme-Client-Info"].contains("iPhone OS"), + ), + ); + + headers.insert( + "X-APPLE-FAMILY-AUTH-TOKEN".to_string(), + token_provider + .get_gsa_token("com.apple.gs.icloud.family.auth") + .await + .expect("no Family auth token?"), + ); let mme_token = token_provider.get_mme_token("mmeAuthToken").await?; - headers.insert("Authorization".to_string(), format!("X-MobileMe-AuthToken {}", base64_encode(format!("{}:{}", &findmy_state.dsid, mme_token).as_bytes()))); + headers.insert( + "Authorization".to_string(), + format!( + "X-MobileMe-AuthToken {}", + base64_encode(format!("{}:{}", &findmy_state.dsid, mme_token).as_bytes()) + ), + ); Ok(headers) } -pub async fn get_entitlements(config: &JoinedOSConfig, conn: &APSConnection, mccmnc: String, subscriber: String, imei: String, process_challenge: impl Fn(String) -> DartFnFuture) -> anyhow::Result { +pub async fn get_entitlements( + config: &JoinedOSConfig, + conn: &APSConnection, + mccmnc: String, + subscriber: String, + imei: String, + process_challenge: impl Fn(String) -> DartFnFuture, +) -> anyhow::Result { let mut entitlementstate = EntitlementAuthState::new(subscriber, mccmnc, imei); - let entitlements = entitlementstate.get_entitlements(&*config.config(), &conn, |challenge| async move { - Ok(process_challenge(challenge).await) - }).await?; + let entitlements = entitlementstate + .get_entitlements(&*config.config(), &conn, |challenge| async move { + Ok(process_challenge(challenge).await) + }) + .await?; - let user = authenticate_smsless(&entitlements.phone, &entitlements.host, &*config.config(), &conn).await?; + let user = authenticate_smsless( + &entitlements.phone, + &entitlements.host, + &*config.config(), + &conn, + ) + .await?; Ok(user) } -pub async fn get_albums(lock: &SyncManager, refresh: bool) -> anyhow::Result<(Vec, Vec)> { +pub async fn get_albums( + lock: &SyncManager, + refresh: bool, +) -> anyhow::Result<(Vec, Vec)> { if refresh { let _ = lock.client.get_changes().await?; - let nameless_albums: Vec<_> = lock.client.state.read().await.albums.iter().filter(|album| album.name.is_none()).map(|album| album.albumguid.clone()).collect(); + let nameless_albums: Vec<_> = lock + .client + .state + .read() + .await + .albums + .iter() + .filter(|album| album.name.is_none()) + .map(|album| album.albumguid.clone()) + .collect(); for album in nameless_albums { lock.client.get_album_summary(&album).await?; } } let albums_ref = lock.client.state.read().await.albums.clone(); - let extras = lock.dirty_map.lock().await.iter().map(|a| a.0.clone()).collect(); + let extras = lock + .dirty_map + .lock() + .await + .iter() + .map(|a| a.0.clone()) + .collect(); Ok((albums_ref, extras)) } -pub async fn subscribe(lock: &SyncManager, guid: String) -> anyhow::Result> { +pub async fn subscribe( + lock: &SyncManager, + guid: String, +) -> anyhow::Result> { let _ = lock.client.subscribe(&guid).await?; let albums_ref = lock.client.state.read().await.albums.clone(); Ok(albums_ref) } -pub async fn unsubscribe(lock: &SyncManager, guid: String) -> anyhow::Result> { +pub async fn unsubscribe( + lock: &SyncManager, + guid: String, +) -> anyhow::Result> { let _ = lock.unsubscribe(&guid).await?; let albums_ref = lock.client.state.read().await.albums.clone(); Ok(albums_ref) } -pub async fn subscribe_token(lock: &SyncManager, token: String) -> anyhow::Result> { +pub async fn subscribe_token( + lock: &SyncManager, + token: String, +) -> anyhow::Result> { let _ = lock.client.subscribe_token(&token).await?; let albums_ref = lock.client.state.read().await.albums.clone(); Ok(albums_ref) } -pub async fn add_album(lock: &SyncManager, guid: String, folder: String) -> anyhow::Result> { - lock.add_album(guid, PathBuf::from_str(&folder).unwrap()).await; +pub async fn add_album( + lock: &SyncManager, + guid: String, + folder: String, +) -> anyhow::Result> { + lock.add_album(guid, PathBuf::from_str(&folder).unwrap()) + .await; let albums_ref = lock.client.state.read().await.albums.clone(); Ok(albums_ref) } -pub async fn remove_album(lock: &SyncManager, guid: String) -> anyhow::Result> { +pub async fn remove_album( + lock: &SyncManager, + guid: String, +) -> anyhow::Result> { debug!("b"); lock.remove_album(guid).await; debug!("c"); @@ -1466,24 +4699,30 @@ pub async fn remove_album(lock: &SyncManager) -> anyhow::Result<(HashMap, Option<(String, u64)>)> { +pub async fn get_syncstatus( + lock: &SyncManager, +) -> anyhow::Result<(HashMap, Option<(String, u64)>)> { let statuses = lock.sync_statuses.borrow().clone(); let mut f: Option<(String, u64)> = None; if let ResourceState::Failed(failure) = &*lock.resource_state.borrow() { - f = Some((format!("{}", failure.error), failure.retry_wait.unwrap_or(u64::MAX))) + f = Some(( + format!("{}", failure.error), + failure.retry_wait.unwrap_or(u64::MAX), + )) } Ok((statuses, f)) } -pub async fn sync_now(lock: &SyncManager) -> anyhow::Result<()> { +pub async fn sync_now( + lock: &SyncManager, +) -> anyhow::Result<()> { lock.refresh_now().await?; Ok(()) } - pub async fn ft_sessions(facetime: &Arc) -> anyhow::Result> { let sessions = facetime.state.read().await; Ok(sessions.sessions.values().cloned().collect()) @@ -1491,12 +4730,16 @@ pub async fn ft_sessions(facetime: &Arc) -> anyhow::Result, usage: String) -> anyhow::Result { let handles = facetime.identity.get_handles().await.to_vec(); - + let handle = handles[0].clone(); Ok(facetime.get_link_for_usage(&handle, &usage).await?) } -pub async fn use_link_for(facetime: &Arc, old_usage: String, usage: String) -> anyhow::Result<()> { +pub async fn use_link_for( + facetime: &Arc, + old_usage: String, + usage: String, +) -> anyhow::Result<()> { Ok(facetime.use_link_for(&old_usage, &usage).await?) } @@ -1504,21 +4747,33 @@ pub async fn clear_links(facetime: &Arc) -> anyhow::Result<()> { Ok(facetime.clear_links().await?) } -pub async fn get_2fa_code(anisette: &ArcAnisetteClient) -> anyhow::Result { +pub async fn get_2fa_code( + anisette: &ArcAnisetteClient, +) -> anyhow::Result { info!("third lock"); let code = anisette.lock().await.provider.get_2fa_code().await?; info!("fouth lock"); Ok(code) } -pub async fn teardown_2fa(account: &Arc>>, action: String, txnid: String) -> anyhow::Result<()> { +pub async fn teardown_2fa( + account: &Arc>>, + action: String, + txnid: String, +) -> anyhow::Result<()> { let mut account = account.lock().await; account.teardown(&action, 100, &txnid).await?; Ok(()) } -pub async fn answer_ft_request(facetime: &Arc, request: LetMeInRequest, approved_group: Option) -> anyhow::Result<()> { - facetime.respond_letmein(request, approved_group.as_ref().map(|a| a.as_str())).await?; +pub async fn answer_ft_request( + facetime: &Arc, + request: LetMeInRequest, + approved_group: Option, +) -> anyhow::Result<()> { + facetime + .respond_letmein(request, approved_group.as_ref().map(|a| a.as_str())) + .await?; Ok(()) } @@ -1530,7 +4785,12 @@ pub async fn decline_facetime(facetime: &Arc, guid: String) -> anyhow: Ok(()) } -pub async fn create_facetime(facetime: &Arc, uuid: String, handle: String, participants: Vec) -> anyhow::Result<()> { +pub async fn create_facetime( + facetime: &Arc, + uuid: String, + handle: String, + participants: Vec, +) -> anyhow::Result<()> { facetime.create_session(uuid, handle, &participants).await?; Ok(()) } @@ -1542,16 +4802,34 @@ pub async fn cancel_facetime(facetime: &Arc, guid: String) -> anyhow:: Ok(()) } -pub async fn validate_targets_facetime(state: &Arc, targets: Vec, sender: String) -> anyhow::Result> { - Ok(state.identity.validate_targets(&targets, "com.apple.private.alloy.facetime.multi", &sender).await?) +pub async fn validate_targets_facetime( + state: &Arc, + targets: Vec, + sender: String, +) -> anyhow::Result> { + Ok(state + .identity + .validate_targets(&targets, "com.apple.private.alloy.facetime.multi", &sender) + .await?) } -pub async fn certify_delivery(state: &Arc, context: CertifiedContext, notify: bool) -> anyhow::Result<()> { - state.identity.certify_delivery("com.apple.madrid", &context, notify).await?; +pub async fn certify_delivery( + state: &Arc, + context: CertifiedContext, + notify: bool, +) -> anyhow::Result<()> { + state + .identity + .certify_delivery("com.apple.madrid", &context, notify) + .await?; Ok(()) } -pub async fn report_messages(state: &Arc, handle: String, messages: Vec) -> anyhow::Result<()> { +pub async fn report_messages( + state: &Arc, + handle: String, + messages: Vec, +) -> anyhow::Result<()> { state.identity.report_spam(&handle, &messages).await?; Ok(()) } @@ -1564,32 +4842,57 @@ pub fn decode_profile_message(s: String) -> anyhow::Result Ok(plist::from_bytes(s.as_bytes())?) } -pub async fn fetch_profile(profiles: &Arc>, message: &ShareProfileMessage) -> anyhow::Result { +pub async fn fetch_profile( + profiles: &Arc>, + message: &ShareProfileMessage, +) -> anyhow::Result { Ok(profiles.get_record(message).await?) } -pub async fn set_profile(profiles: &Arc>, record: IMessageNicknameRecord, mut existing: Option) -> anyhow::Result { +pub async fn set_profile( + profiles: &Arc>, + record: IMessageNicknameRecord, + mut existing: Option, +) -> anyhow::Result { profiles.set_record(record, &mut existing).await?; Ok(existing.expect("No profile set??")) } -pub async fn invite_to_channel(status: &Arc>, handle: String, to: HashMap) -> anyhow::Result<()> { +pub async fn invite_to_channel( + status: &Arc>, + handle: String, + to: HashMap, +) -> anyhow::Result<()> { Ok(status.invite_to_channel(&handle, to).await?) } -pub async fn reset_channel_keys(status: &Arc>) -> anyhow::Result<()> { +pub async fn reset_channel_keys( + status: &Arc>, +) -> anyhow::Result<()> { Ok(status.reset_keys().await) } -pub async fn request_handles(status: &Arc>, to: Vec) -> anyhow::Result> { - Ok(if to.is_empty() { None } else { Some(status.request_handles(&to).await) }) +pub async fn request_handles( + status: &Arc>, + to: Vec, +) -> anyhow::Result> { + Ok(if to.is_empty() { + None + } else { + Some(status.request_handles(&to).await) + }) } -pub async fn set_status(status: &Arc>, new_status: Option) -> anyhow::Result<()> { - status.share_status(&StatusKitStatus { - active: new_status.is_none(), - id: new_status, - }).await?; +pub async fn set_status( + status: &Arc>, + new_status: Option, +) -> anyhow::Result<()> { + status + .share_status(&StatusKitStatus { + active: new_status.is_none(), + id: new_status, + }) + .await?; Ok(()) } @@ -1616,36 +4919,50 @@ async fn handle_2fa(state: &SharedPushState, signin: &IdmsRequestedSignIn) -> bo return false; } } - let adsid = lock.spd.as_ref().unwrap().get("adsid").expect("no adsid???s").as_string().unwrap(); + let adsid = lock + .spd + .as_ref() + .unwrap() + .get("adsid") + .expect("no adsid???s") + .as_string() + .unwrap(); if adsid != &signin.adsid { - warn!("Dropping 2fa code for account because adsid is wrong {adsid} {}", signin.adsid); + warn!("Dropping 2fa code because the account identifier did not match"); return false; } drop(lock); true } -async fn handle_circle(state: &SharedPushState, signin: &Option, msg: &IdmsCircleMessage) { +async fn handle_circle( + state: &SharedPushState, + signin: &Option, + msg: &IdmsCircleMessage, +) { if msg.step % 2 == 0 { // this is a client step (we are the client) let mut locked = state.client_session.lock().await; let Some(client) = &mut *locked else { warn!("Ignoring unknown circle client session"); - return + return; }; match client.handle_circle_request(msg).await { Err(e) => { warn!("error {e}"); - }, + } Ok(Some(LoginState::LoggedIn)) => { // we are done *locked = None; - let _ = state.local_broadcast.send(PushMessage::CircleFinishEvent).await; + let _ = state + .local_broadcast + .send(PushMessage::CircleFinishEvent) + .await; info!("Finished client circle!"); - }, + } _ => info!("Did circle step {}", msg.step), } - return + return; } let mut circle_lock = state.active_circle_sessions.lock().await; @@ -1670,12 +4987,25 @@ async fn handle_circle(state: &SharedPushState, signin: &Option { warn!("error {e}"); - }, + } Ok(success) => { // login if msg.step == 3 { - let _ = state.local_broadcast.send(PushMessage::TwoFaAuthEvent(success)).await; + let _ = state + .local_broadcast + .send(PushMessage::TwoFaAuthEvent(success)) + .await; } } } @@ -1708,11 +5048,21 @@ async fn handle_circle(state: &SharedPushState, signin: &Option>>, account: &Arc>>, txnid: String) -> anyhow::Result { +pub async fn approve_circle( + state: &Arc>>, + account: &Arc>>, + txnid: String, +) -> anyhow::Result { let mut circle_lock = state.lock().await; let Some(item) = circle_lock.iter_mut().find(|a| a.txnid == txnid) else { let account = account.lock().await; - let code = account.anisette.lock().await.provider.get_2fa_code().await?; + let code = account + .anisette + .lock() + .await + .provider + .get_2fa_code() + .await?; return Ok(code); }; let Some(msg) = item.init_message.take() else { @@ -1725,7 +5075,7 @@ pub async fn approve_circle(state: &Arc>>, accoun let mut circle_lock = state_ref.lock().await; let Some(item) = circle_lock.iter_mut().find(|a| a.txnid == txnid) else { warn!("Session disappeared??"); - return + return; }; if let Err(e) = item.session.handle_circle_request(&msg).await { warn!("cirlce error {e}"); @@ -1839,7 +5189,11 @@ pub async fn recv_wait(watcher: &mut APSWatcher, state: &Arc) - } } -pub async fn send(state: &Arc, local: &Arc>, mut msg: MessageInst) -> anyhow::Result { +pub async fn send( + state: &Arc, + local: &Arc>, + mut msg: MessageInst, +) -> anyhow::Result { let result = state.send(&mut msg).await?; info!("send_finish"); @@ -1850,7 +5204,12 @@ pub async fn send(state: &Arc, local: &Arc>, let result = handle.await.unwrap(); info!("Finished handle {}", uuid); let maybeerr = result.err().map(|err| format!("{}", err)); - let _ = local.send(PushMessage::SendConfirm { uuid, error: maybeerr }).await; + let _ = local + .send(PushMessage::SendConfirm { + uuid, + error: maybeerr, + }) + .await; }); Ok(true) } else { @@ -1871,62 +5230,89 @@ pub async fn do_reregister(state: &Arc) -> anyhow::Result<()> { Ok(()) } -pub async fn new_msg(conversation: ConversationData, sender: String, message: Message) -> MessageInst { +pub async fn new_msg( + conversation: ConversationData, + sender: String, + message: Message, +) -> MessageInst { MessageInst::new(conversation, &sender, message) } -pub async fn validate_targets(state: &Arc, targets: Vec, sender: String) -> anyhow::Result> { - Ok(state.identity.validate_targets(&targets, "com.apple.madrid", &sender).await?) +pub async fn validate_targets( + state: &Arc, + targets: Vec, + sender: String, +) -> anyhow::Result> { + Ok(state + .identity + .validate_targets(&targets, "com.apple.madrid", &sender) + .await?) } #[frb(type_64bit_int)] pub struct TransferProgress { pub prog: usize, pub total: usize, - pub attachment: Option + pub attachment: Option, } -pub async fn download_attachment(sink: StreamSink, aps: &APSConnection, attachment: Attachment, path: String) { +pub async fn download_attachment( + sink: StreamSink, + aps: &APSConnection, + attachment: Attachment, + path: String, +) { wrap_sink(&sink, || async { - println!("donwloading file {}", path); let path = std::path::Path::new(&path); let prefix = path.parent().unwrap(); std::fs::create_dir_all(prefix)?; let mut file = std::fs::File::create(path)?; - attachment.get_attachment(aps, &mut file, |prog, total| { - println!("donwloading file {} of {}", prog, total); - let _ = sink.add(TransferProgress { - prog, - total, - attachment: None - }); - }).await?; + attachment + .get_attachment(aps, &mut file, |prog, total| { + let _ = sink.add(TransferProgress { + prog, + total, + attachment: None, + }); + }) + .await?; file.flush()?; Ok(()) - }).await + }) + .await } -pub async fn download_mmcs(sink: StreamSink, aps: &APSConnection, attachment: MMCSFile, path: String) { +pub async fn download_mmcs( + sink: StreamSink, + aps: &APSConnection, + attachment: MMCSFile, + path: String, +) { wrap_sink(&sink, || async { let path = std::path::Path::new(&path); let prefix = path.parent().unwrap(); std::fs::create_dir_all(prefix)?; let mut file = std::fs::File::create(path)?; - attachment.get_attachment(aps, &mut file, |prog, total| { - let _ = sink.add(TransferProgress { - prog, - total, - attachment: None - }); - }).await?; + attachment + .get_attachment(aps, &mut file, |prog, total| { + let _ = sink.add(TransferProgress { + prog, + total, + attachment: None, + }); + }) + .await?; file.flush()?; Ok(()) - }).await + }) + .await } async fn wrap_sink(sink: &StreamSink, f: impl FnOnce() -> Fut) - where Fut: Future> { +where + Fut: Future>, +{ if let Err(err) = f().await { let _ = sink.add_error(err); } @@ -1936,10 +5322,14 @@ async fn wrap_sink(sink: &StreamSink, f: imp pub struct MMCSTransferProgress { pub prog: usize, pub total: usize, - pub file: Option + pub file: Option, } -pub async fn upload_mmcs(sink: StreamSink, aps: &APSConnection, path: String) { +pub async fn upload_mmcs( + sink: StreamSink, + aps: &APSConnection, + path: String, +) { wrap_sink(&sink, || async { let mut file = std::fs::File::open(path)?; let prepared = MMCSFile::prepare_put(&mut file).await?; @@ -1948,30 +5338,49 @@ pub async fn upload_mmcs(sink: StreamSink, aps: &APSConnec let _ = sink.add(MMCSTransferProgress { prog, total, - file: None + file: None, }); - }).await?; - let _ = sink.add(MMCSTransferProgress { prog: 0, total: 0, file: Some(attachment) }); + }) + .await?; + let _ = sink.add(MMCSTransferProgress { + prog: 0, + total: 0, + file: Some(attachment), + }); Ok(()) - }).await + }) + .await } -pub async fn upload_attachment(sink: StreamSink, aps: &APSConnection, path: String, mime: String, uti: String, name: String) { +pub async fn upload_attachment( + sink: StreamSink, + aps: &APSConnection, + path: String, + mime: String, + uti: String, + name: String, +) { wrap_sink(&sink, || async { - let mut file = std::fs::File::open(path)?; let prepared = MMCSFile::prepare_put(&mut file).await?; file.rewind()?; - let attachment = Attachment::new_mmcs(aps, &prepared, file, &mime, &uti, &name,|prog, total| { - let _ = sink.add(TransferProgress { - prog, - total, - attachment: None - }); - }).await?; - let _ = sink.add(TransferProgress { prog: 0, total: 0, attachment: Some(attachment) }); + let attachment = + Attachment::new_mmcs(aps, &prepared, file, &mime, &uti, &name, |prog, total| { + let _ = sink.add(TransferProgress { + prog, + total, + attachment: None, + }); + }) + .await?; + let _ = sink.add(TransferProgress { + prog: 0, + total: 0, + attachment: Some(attachment), + }); Ok(()) - }).await + }) + .await } pub async fn get_token(state: &APSConnection) -> Vec { @@ -1983,35 +5392,76 @@ pub fn save_user(user: &IDSUser) -> anyhow::Result { } pub fn restore_user(user: String) -> anyhow::Result { - info!("Got user {user}"); + info!("Restoring serialized IDS user (bytes={})", user.len()); Ok(plist::from_reader(Cursor::new(user))?) } -pub async fn make_find_my_phone(path: String, config: &JoinedOSConfig, aps: &APSConnection, anisette: &ArcAnisetteClient, provider: &Arc>) -> anyhow::Result> { +pub async fn make_find_my_phone( + path: String, + config: &JoinedOSConfig, + aps: &APSConnection, + anisette: &ArcAnisetteClient, + provider: &Arc>, +) -> anyhow::Result> { let dir = PathBuf::from_str(&path).unwrap(); let id_path = dir.join("sharedstreams.plist"); let state: SharedStreamsState = plist::from_file(id_path)?; - Ok(FindMyPhoneClient::new(&*config.config(), state.dsid.clone(), aps.clone(), anisette.clone(), provider.clone()).await?) + Ok(FindMyPhoneClient::new( + &*config.config(), + state.dsid.clone(), + aps.clone(), + anisette.clone(), + provider.clone(), + ) + .await?) } -pub async fn get_devices(client: &mut FindMyPhoneClient) -> Vec { +pub async fn get_devices( + client: &mut FindMyPhoneClient, +) -> Vec { client.devices.clone() } -pub async fn refresh_devices(config: &JoinedOSConfig, client: &mut FindMyPhoneClient) -> anyhow::Result> { +pub async fn refresh_devices( + config: &JoinedOSConfig, + client: &mut FindMyPhoneClient, +) -> anyhow::Result> { client.refresh(&*config.config()).await?; Ok(client.devices.clone()) } -pub async fn make_find_my_friends(path: String, config: &JoinedOSConfig, aps: &APSConnection, anisette: &ArcAnisetteClient, provider: &Arc>) -> anyhow::Result> { +pub async fn play_find_my_sound( + config: &JoinedOSConfig, + client: &mut FindMyPhoneClient, + device_id: String, +) -> anyhow::Result<()> { + client.play_sound(&*config.config(), &device_id).await?; + Ok(()) +} + +pub async fn make_find_my_friends( + path: String, + config: &JoinedOSConfig, + aps: &APSConnection, + anisette: &ArcAnisetteClient, + provider: &Arc>, +) -> anyhow::Result> { let dir = PathBuf::from_str(&path).unwrap(); let id_path = dir.join("sharedstreams.plist"); let state: SharedStreamsState = plist::from_file(id_path)?; - let fmf_client = FindMyFriendsClient::new(&*config.config(), state.dsid.clone(), provider.clone(), aps.clone(), anisette.clone(), false).await?; + let fmf_client = FindMyFriendsClient::new( + &*config.config(), + state.dsid.clone(), + provider.clone(), + aps.clone(), + anisette.clone(), + false, + ) + .await?; Ok(fmf_client) } @@ -2035,89 +5485,135 @@ pub struct DartBeacon { pub shared: Option, } -pub async fn accept_beacon_share(items: &Arc>, share: String) -> anyhow::Result<()> { +pub async fn accept_beacon_share( + items: &Arc>, + share: String, +) -> anyhow::Result<()> { Ok(items.accept_item_share(&share).await?) } -pub async fn delete_beacon_share(items: &Arc>, share: String) -> anyhow::Result<()> { +pub async fn delete_beacon_share( + items: &Arc>, + share: String, +) -> anyhow::Result<()> { Ok(items.delete_shared_item(&share, true).await?) } -pub async fn get_beacon_items(items: &Arc>) -> anyhow::Result> { +pub async fn get_beacon_items( + items: &Arc>, +) -> anyhow::Result> { items.sync_item_positions().await?; let records = items.state.state.lock().await; - Ok(records.accessories.iter().map(|(id, a)| DartBeacon { - naming: a.naming.clone(), - last_report: a.last_report.clone(), - product_id: a.master_record.product_id, - battery_level: Some(a.master_record.battery_level), - vendor_id: a.master_record.vendor_id, - model: a.master_record.model.clone(), - system_version: a.master_record.system_version.clone(), - id: id.clone(), - shared: None, - }).chain(records.share_state.circles_member.iter().filter_map(|(id, circle)| { - let a = records.share_state.shared_beacons.get(&circle.beacon_identifier)?; - let def_state = SharedBeaconClient::default(); - let client_state = records.share_state.shared_beacons_client.get(&circle.beacon_identifier).unwrap_or(&def_state); - Some(DartBeacon { - naming: BeaconNamingRecord { - emoji: client_state.attributes.emoji.clone(), - name: client_state.attributes.name.clone(), - role_id: client_state.attributes.role_id, - associated_beacon: id.clone(), - }, - last_report: client_state.last_report.clone(), - product_id: a.product_id, - battery_level: None, - vendor_id: a.vendor_id, - model: a.model.clone(), - system_version: a.system_version.clone(), - id: circle.beacon_identifier.clone(), - shared: Some(DartBeaconShareInfo { - share_id: id.clone(), - acceptance_state: circle.acceptance_state, - owner_handle: a.owner_handle.clone(), - }), + Ok(records + .accessories + .iter() + .map(|(id, a)| DartBeacon { + naming: a.naming.clone(), + last_report: a.last_report.clone(), + product_id: a.master_record.product_id, + battery_level: Some(a.master_record.battery_level), + vendor_id: a.master_record.vendor_id, + model: a.master_record.model.clone(), + system_version: a.master_record.system_version.clone(), + id: id.clone(), + shared: None, }) - })).collect()) + .chain( + records + .share_state + .circles_member + .iter() + .filter_map(|(id, circle)| { + let a = records + .share_state + .shared_beacons + .get(&circle.beacon_identifier)?; + let def_state = SharedBeaconClient::default(); + let client_state = records + .share_state + .shared_beacons_client + .get(&circle.beacon_identifier) + .unwrap_or(&def_state); + Some(DartBeacon { + naming: BeaconNamingRecord { + emoji: client_state.attributes.emoji.clone(), + name: client_state.attributes.name.clone(), + role_id: client_state.attributes.role_id, + associated_beacon: id.clone(), + }, + last_report: client_state.last_report.clone(), + product_id: a.product_id, + battery_level: None, + vendor_id: a.vendor_id, + model: a.model.clone(), + system_version: a.system_version.clone(), + id: circle.beacon_identifier.clone(), + shared: Some(DartBeaconShareInfo { + share_id: id.clone(), + acceptance_state: circle.acceptance_state, + owner_handle: a.owner_handle.clone(), + }), + }) + }), + ) + .collect()) } -pub async fn update_beacon_name(items: &Arc>, naming_record: &BeaconNamingRecord) -> anyhow::Result<()> { +pub async fn update_beacon_name( + items: &Arc>, + naming_record: &BeaconNamingRecord, +) -> anyhow::Result<()> { items.update_beacon_name(naming_record).await?; Ok(()) } -pub async fn get_following(client: &mut FindMyFriendsClient) -> Vec { +pub async fn get_following( + client: &mut FindMyFriendsClient, +) -> Vec { client.following.clone() } -pub async fn refresh_following(config: &JoinedOSConfig, client: &mut FindMyFriendsClient) -> anyhow::Result> { +pub async fn refresh_following( + config: &JoinedOSConfig, + client: &mut FindMyFriendsClient, +) -> anyhow::Result> { client.refresh(&*config.config()).await?; Ok(client.following.clone()) } -pub async fn select_friend(config: &JoinedOSConfig, client: &mut FindMyFriendsClient, friend: Option) -> anyhow::Result> { +pub async fn select_friend( + config: &JoinedOSConfig, + client: &mut FindMyFriendsClient, + friend: Option, +) -> anyhow::Result> { client.selected_friend = friend; client.refresh(&*config.config()).await?; Ok(client.following.clone()) } -pub async fn select_background_friend(fmfd: &Arc>, friend: Option) -> anyhow::Result> { +pub async fn select_background_friend( + fmfd: &Arc>, + friend: Option, +) -> anyhow::Result> { let mut x = fmfd.daemon.lock().await; x.selected_friend = friend; Ok(x.following.clone()) } -pub async fn get_background_following(fmfd: &Arc>) -> Vec { +pub async fn get_background_following( + fmfd: &Arc>, +) -> Vec { let x = fmfd.daemon.lock().await.following.clone(); x } -pub async fn refresh_background_following(state: &Arc>, config: &JoinedOSConfig) -> anyhow::Result> { +pub async fn refresh_background_following( + state: &Arc>, + config: &JoinedOSConfig, +) -> anyhow::Result> { let mut x = state.daemon.lock().await; x.refresh(&*config.config()).await?; Ok(x.following.clone()) @@ -2130,12 +5626,22 @@ pub struct QuotaInfo { pub messages_bytes: u64, } -pub async fn get_quota_info(info: &Arc>) -> anyhow::Result { +pub async fn get_quota_info( + info: &Arc>, +) -> anyhow::Result { let storage_info = info.get_storage_info().await?; Ok(QuotaInfo { - total_bytes: storage_info.storage_data.quota_info_in_bytes.total_quota, - available_bytes: storage_info.storage_data.quota_info_in_bytes.total_available, - messages_bytes: storage_info.storage_usage_by_media.iter().find(|m| &m.media_key == "messages").map(|m| m.usage_in_bytes).unwrap_or(0), + total_bytes: storage_info.storage_data.quota_info_in_bytes.total_quota, + available_bytes: storage_info + .storage_data + .quota_info_in_bytes + .total_available, + messages_bytes: storage_info + .storage_usage_by_media + .iter() + .find(|m| &m.media_key == "messages") + .map(|m| m.usage_in_bytes) + .unwrap_or(0), }) } @@ -2148,62 +5654,121 @@ struct GSAConfig { impl GSAConfig { fn get_password(&self) -> Result, PushError> { - let key = AesKeystoreKey::ensure(&format!("gsa:password"), 256, KeystoreAccessRules { - block_modes: vec![EncryptMode::Gcm], - can_encrypt: true, - can_decrypt: true, - ..Default::default() - })?; + let key = AesKeystoreKey::ensure( + &format!("gsa:password"), + 256, + KeystoreAccessRules { + block_modes: vec![EncryptMode::Gcm], + can_encrypt: true, + can_decrypt: true, + ..Default::default() + }, + )?; let encoded = key.decrypt(self.encrypted_password.as_ref(), &mut EncryptMode::Gcm)?; Ok(encoded) } fn encrypt(password: &[u8]) -> Result { - let key = AesKeystoreKey::ensure(&format!("gsa:password"), 256, KeystoreAccessRules { - block_modes: vec![EncryptMode::Gcm], - can_encrypt: true, - can_decrypt: true, - ..Default::default() - })?; + let key = AesKeystoreKey::ensure( + &format!("gsa:password"), + 256, + KeystoreAccessRules { + block_modes: vec![EncryptMode::Gcm], + can_encrypt: true, + can_decrypt: true, + ..Default::default() + }, + )?; let encoded = key.encrypt(password, &mut EncryptMode::Gcm)?; Ok(encoded.into()) } } -pub async fn do_login(path: String, account: &Arc>>, finish: Option, os_config: &JoinedOSConfig) -> anyhow::Result { +pub async fn do_login( + path: String, + account: &Arc>>, + finish: Option, + os_config: &JoinedOSConfig, +) -> anyhow::Result { let mut account = account.lock().await; - + let conf_dir = PathBuf::from_str(&path).unwrap(); - account.update_postdata("Apple Device", None, &["icloud", "imessage", "facetime"]).await?; - - let Some(pet) = account.get_pet() else { return Err(anyhow!("No pet!")) }; - let Some(spd) = &account.spd else { return Err(anyhow!("No spd!")) }; + account + .update_postdata("Apple Device", None, &["icloud", "imessage", "facetime"]) + .await?; + + let Some(pet) = account.get_pet() else { + return Err(anyhow!("No pet!")); + }; + let Some(spd) = &account.spd else { + return Err(anyhow!("No spd!")); + }; + + debug!( + "Parsed SPD metadata (keys={}, has_account_name={}, has_dsid={}, has_adsid={})", + spd.len(), + spd.contains_key("acname"), + spd.contains_key("DsPrsId"), + spd.contains_key("adsid") + ); + let acname = spd + .get("acname") + .ok_or(anyhow!("No acname!"))? + .as_string() + .unwrap() + .to_string(); + let dsid = spd + .get("DsPrsId") + .ok_or(anyhow!("No dsid!"))? + .as_unsigned_integer() + .unwrap() + .to_string(); + let adsid = spd + .get("adsid") + .ok_or(anyhow!("No adsid!"))? + .as_string() + .unwrap(); - debug!("Got spd {:?}", spd); - let acname = spd.get("acname").ok_or(anyhow!("No acname!"))?.as_string().unwrap().to_string(); - let dsid = spd.get("DsPrsId").ok_or(anyhow!("No dsid!"))?.as_unsigned_integer().unwrap().to_string(); - let adsid = spd.get("adsid").ok_or(anyhow!("No adsid!"))?.as_string().unwrap(); - let delegates = if let Some(finish) = finish { - finish.accept_terms(&[LoginDelegate::IDS, LoginDelegate::MobileMe], &*account, &*os_config.config()).await? + finish + .accept_terms( + &[LoginDelegate::IDS, LoginDelegate::MobileMe], + &*account, + &*os_config.config(), + ) + .await? } else { - login_apple_delegates(&*account, None, &*os_config.config(), &[LoginDelegate::IDS, LoginDelegate::MobileMe]).await? + login_apple_delegates( + &*account, + None, + &*os_config.config(), + &[LoginDelegate::IDS, LoginDelegate::MobileMe], + ) + .await? }; - - - plist::to_file_xml(conf_dir.join("gsa.plist"), &GSAConfig { - username: account.username.clone().unwrap(), - encrypted_password: GSAConfig::encrypt(&account.hashed_password.clone().unwrap())?, - postdata_done: Some(true), - }).unwrap(); + + plist::to_file_xml( + conf_dir.join("gsa.plist"), + &GSAConfig { + username: account.username.clone().unwrap(), + encrypted_password: GSAConfig::encrypt(&account.hashed_password.clone().unwrap())?, + postdata_done: Some(true), + }, + ) + .unwrap(); let path = conf_dir.join("statuskit.plist"); - std::fs::write(&path, plist_to_string(&StatusKitState { - my_key: None, - ..plist::from_file(&path).unwrap_or_default() - }).unwrap()).unwrap(); - + std::fs::write( + &path, + plist_to_string(&StatusKitState { + my_key: None, + ..plist::from_file(&path).unwrap_or_default() + }) + .unwrap(), + ) + .unwrap(); + let mobileme = delegates.mobileme.unwrap(); let findmy = FindMyState::new(dsid.clone()); @@ -2216,7 +5781,7 @@ pub async fn do_login(path: String, account: &Arc Option { let conf_dir = PathBuf::from_str(&path).unwrap(); - plist::from_file::<_, GSAConfig>(&conf_dir.join("gsa.plist")).ok().map(|i| i.username) -} - -pub async fn try_auth(path: String, conf: &JoinedOSConfig, conn: &APSConnection, anisette: &ArcAnisetteClient, creds: Option<(String, String)>) -> anyhow::Result<(Arc>>, LoginState)> { + plist::from_file::<_, GSAConfig>(&conf_dir.join("gsa.plist")) + .ok() + .map(|i| i.username) +} + +pub async fn try_auth( + path: String, + conf: &JoinedOSConfig, + conn: &APSConnection, + anisette: &ArcAnisetteClient, + creds: Option<(String, String)>, +) -> anyhow::Result<( + Arc>>, + LoginState, +)> { let conf_dir = PathBuf::from_str(&path).unwrap(); info!("Here"); - let mut apple_account = - AppleAccount::new_with_anisette(get_login_config(&conf_dir, conf, conn).await, anisette.clone())?; - + let mut apple_account = AppleAccount::new_with_anisette( + get_login_config(&conf_dir, conf, conn).await, + anisette.clone(), + )?; + let result = if let Some((username, password)) = creds { reset_user(&path); @@ -2277,40 +5855,62 @@ pub async fn try_auth(path: String, conf: &JoinedOSConfig, conn: &APSConnection, info!("Here3"); let account = Arc::new(Mutex::new(apple_account)); - + info!("Here6"); Ok((account, login_state)) } -pub async fn try_icloud_login(path: String, conf: &JoinedOSConfig, account: &Arc>>) -> anyhow::Result> { +pub async fn try_icloud_login( + path: String, + conf: &JoinedOSConfig, + account: &Arc>>, +) -> anyhow::Result> { let pet = account.lock().await.get_pet(); if let Some(pet) = pet { info!("Here4"); let identity = do_login(path, &account, None, conf).await?; info!("Here5"); - + Ok(Some(identity)) } else { Ok(None) } } -pub async fn auth_phone(conn: &APSConnection, config: &JoinedOSConfig, number: String, sig: Vec) -> anyhow::Result { - let identity = authenticate_phone(&number, AuthPhone { - push_token: conn.get_token().await.to_vec().into(), - sigs: vec![sig.into()] - }, &*config.config()).await?; +pub async fn auth_phone( + conn: &APSConnection, + config: &JoinedOSConfig, + number: String, + sig: Vec, +) -> anyhow::Result { + let identity = authenticate_phone( + &number, + AuthPhone { + push_token: conn.get_token().await.to_vec().into(), + sigs: vec![sig.into()], + }, + &*config.config(), + ) + .await?; Ok(identity) } -pub async fn send_2fa_to_devices(state: &Arc>>, conn: &APSConnection) -> anyhow::Result<(CircleClientSession, LoginState, Option)> { +pub async fn send_2fa_to_devices( + state: &Arc>>, + conn: &APSConnection, +) -> anyhow::Result<( + CircleClientSession, + LoginState, + Option, +)> { let account = state.lock().await; let spd = account.spd.as_ref().unwrap(); let dsid = spd["DsPrsId"].as_unsigned_integer().unwrap(); drop(account); - let client_session = CircleClientSession::new(dsid, state.clone(), conn.get_token().await).await?; + let client_session = + CircleClientSession::new(dsid, state.clone(), conn.get_token().await).await?; #[cfg(target_os = "android")] { @@ -2340,29 +5940,56 @@ pub async fn is_in_clique(keychain: &Arc keychain.is_in_clique().await } -pub async fn join_clique_with_bottle(keychain: &Arc>, bottle: &EscrowData, password: String, device_password: String) -> anyhow::Result<()> { - keychain.join_clique_from_escrow(bottle, password.as_bytes(), device_password.as_bytes()).await?; +pub async fn join_clique_with_bottle( + keychain: &Arc>, + bottle: &EscrowData, + password: String, + device_password: String, +) -> anyhow::Result<()> { + keychain + .join_clique_from_escrow(bottle, password.as_bytes(), device_password.as_bytes()) + .await?; Ok(()) } -pub async fn reset_clique(keychain: &Arc>, cloud_messages: &Arc>, device_password: String) -> anyhow::Result<()> { +pub async fn reset_clique( + keychain: &Arc>, + cloud_messages: &Arc>, + device_password: String, +) -> anyhow::Result<()> { keychain.reset_clique(device_password.as_bytes()).await?; cloud_messages.reset().await?; Ok(()) } -pub async fn get_bottles(keychain: &Arc>) -> anyhow::Result> { +pub async fn get_bottles( + keychain: &Arc>, +) -> anyhow::Result> { let bottles = keychain.get_viable_bottles().await?; - Ok(bottles.into_iter().filter_map(|b| { - let client_metadata = b.1.client_metadata.as_dictionary()?; - Some(ViableBottle { - escrow: b.0, - numeric_length: client_metadata.get("SecureBackupNumericPassphraseLength").and_then(|i| i.as_unsigned_integer()).unwrap_or(0), - device_name: client_metadata.get("device_name").and_then(|i| i.as_string()).unwrap_or("No Name").to_string(), - model_class: client_metadata.get("device_model_class").and_then(|i| i.as_string()).unwrap_or("iMac").to_string(), + Ok(bottles + .into_iter() + .filter_map(|b| { + let client_metadata = b.1.client_metadata.as_dictionary()?; + Some(ViableBottle { + escrow: b.0, + numeric_length: client_metadata + .get("SecureBackupNumericPassphraseLength") + .and_then(|i| i.as_unsigned_integer()) + .unwrap_or(0), + device_name: client_metadata + .get("device_name") + .and_then(|i| i.as_string()) + .unwrap_or("No Name") + .to_string(), + model_class: client_metadata + .get("device_model_class") + .and_then(|i| i.as_string()) + .unwrap_or("iMac") + .to_string(), + }) }) - }).collect()) + .collect()) } pub fn encode_summary_info(info: &MessageSummaryInfo) -> Vec { @@ -2373,7 +6000,7 @@ pub fn decode_summary_info(info: &[u8]) -> MessageSummaryInfo { plist::from_bytes(info).unwrap() } -use rustpush::{coder_encode_flattened, coder_decode_flattened}; +use rustpush::{coder_decode_flattened, coder_encode_flattened}; #[frb(sync)] pub fn attachment_to_cloud(att: &Attachment) -> Option { @@ -2400,6 +6027,369 @@ pub fn restore_cloud_chat(data: &[u8]) -> CloudChat { plist::from_bytes(data).unwrap() } +#[derive(Clone, Copy, Debug, Eq, PartialEq)] +pub enum CloudSyncRawRecordKind { + EncryptedUpsert, + Tombstone, + UnsupportedRecordType, + MalformedMetadata, +} + +#[derive(Clone, Debug)] +pub struct CloudSyncRawSystemFields { + pub etag: Option, + pub created_at: Option, + pub modified_at: Option, + pub permission: Option, +} + +#[derive(Clone, Debug)] +pub struct CloudSyncRawChange { + pub record_name: Option, + pub record_type: Option, + pub change_type: Option, + pub system_fields: Option, + pub encrypted_record: Option>, + pub tombstone_payload: Option>, + pub kind: CloudSyncRawRecordKind, +} + +#[derive(Clone, Debug)] +pub struct CloudSyncRawPage { + pub changes: Vec, + pub next_token: Option>, + pub status: i32, + pub complete: bool, +} + +#[derive(Clone, Copy, Debug, Eq, PartialEq)] +pub enum CloudSyncRawFailureCategory { + Network, + Throttled, + Server, + Authorization, + PcsUnavailable, + MalformedRecord, + Conflict, + LocalStorage, + Unknown, +} + +/// Redacted failure information for the durable Dart scheduler. This contains +/// no server body, record identifier, token, account identifier, or message +/// content. +#[derive(Clone, Debug)] +pub struct CloudSyncRawFailure { + pub category: CloudSyncRawFailureCategory, + pub retry_after_seconds: Option, + pub safe_code: String, +} + +/// Exactly one of [page] and [failure] is populated. +#[derive(Clone, Debug)] +pub struct CloudSyncRawFetchResult { + pub page: Option, + pub failure: Option, +} + +fn map_cloud_sync_raw_page(page: CloudMessageRecordPage) -> CloudSyncRawPage { + let complete = page.is_complete(); + CloudSyncRawPage { + changes: page + .changes + .into_iter() + .map(|change| CloudSyncRawChange { + record_name: change.record_name, + record_type: change.record_type, + change_type: change.change_type, + system_fields: change.system_fields.map(|fields| CloudSyncRawSystemFields { + etag: fields.etag, + created_at: fields.created_at, + modified_at: fields.modified_at, + permission: fields.permission, + }), + encrypted_record: change.encrypted_record, + tombstone_payload: change.tombstone_payload, + kind: match change.kind { + CloudMessageRecordKind::EncryptedUpsert => { + CloudSyncRawRecordKind::EncryptedUpsert + } + CloudMessageRecordKind::Tombstone => CloudSyncRawRecordKind::Tombstone, + CloudMessageRecordKind::UnsupportedRecordType => { + CloudSyncRawRecordKind::UnsupportedRecordType + } + CloudMessageRecordKind::MalformedMetadata => { + CloudSyncRawRecordKind::MalformedMetadata + } + }, + }) + .collect(), + next_token: page.next_token, + status: page.status, + complete, + } +} + +fn cloud_sync_retry_after_seconds(error: &PushError) -> Option { + match error { + PushError::CloudKitError(result) => result + .error + .as_ref() + .and_then(|error| error.retry_after_seconds) + .filter(|seconds| *seconds > 0) + .map(|seconds| seconds as u64), + PushError::CloudKitHttpError { + retry_after: Some(retry_after), + .. + } if !retry_after.is_zero() => Some(retry_after.as_secs().max(1)), + PushError::DoNotRetry(inner) => cloud_sync_retry_after_seconds(inner), + PushError::BatchError(inner) => cloud_sync_retry_after_seconds(inner), + _ => None, + } +} + +fn cloud_sync_failure_category(error: &PushError) -> (CloudSyncRawFailureCategory, &'static str) { + match error { + PushError::CloudKitError(result) => match classify_cloudkit_failure(result) { + CloudKitFailureClass::Throttled => { + (CloudSyncRawFailureCategory::Throttled, "cloudkit-throttled") + } + CloudKitFailureClass::TransientServer => { + (CloudSyncRawFailureCategory::Server, "cloudkit-server") + } + CloudKitFailureClass::Authentication => ( + CloudSyncRawFailureCategory::Authorization, + "cloudkit-authorization", + ), + CloudKitFailureClass::Conflict => { + (CloudSyncRawFailureCategory::Conflict, "cloudkit-conflict") + } + // A checkpoint reset is a deliberate operator/engine decision. Do + // not turn it into an automatic destructive retry here. + CloudKitFailureClass::ResetRequired => ( + CloudSyncRawFailureCategory::Unknown, + "cloudkit-reset-required", + ), + CloudKitFailureClass::Permanent => { + (CloudSyncRawFailureCategory::Unknown, "cloudkit-permanent") + } + CloudKitFailureClass::Unknown => { + (CloudSyncRawFailureCategory::Unknown, "cloudkit-unknown") + } + }, + PushError::RequestError(error) => { + if error.is_timeout() || error.is_connect() { + return (CloudSyncRawFailureCategory::Network, "network"); + } + match error.status().map(|status| status.as_u16()) { + Some(401 | 403) => ( + CloudSyncRawFailureCategory::Authorization, + "http-authorization", + ), + Some(408) => (CloudSyncRawFailureCategory::Network, "http-timeout"), + Some(429) => (CloudSyncRawFailureCategory::Throttled, "http-throttled"), + Some(500..=599) => (CloudSyncRawFailureCategory::Server, "http-server"), + _ => (CloudSyncRawFailureCategory::Unknown, "http-unknown"), + } + } + PushError::StatusError(status) => match status.as_u16() { + 401 | 403 => ( + CloudSyncRawFailureCategory::Authorization, + "http-authorization", + ), + 408 => (CloudSyncRawFailureCategory::Network, "http-timeout"), + 429 => (CloudSyncRawFailureCategory::Throttled, "http-throttled"), + 500..=599 => (CloudSyncRawFailureCategory::Server, "http-server"), + _ => (CloudSyncRawFailureCategory::Unknown, "http-unknown"), + }, + PushError::CloudKitHttpError { status, .. } => match *status { + 401 | 403 => ( + CloudSyncRawFailureCategory::Authorization, + "http-authorization", + ), + 408 => (CloudSyncRawFailureCategory::Network, "http-timeout"), + 429 => (CloudSyncRawFailureCategory::Throttled, "http-throttled"), + 500..=599 => (CloudSyncRawFailureCategory::Server, "http-server"), + _ => (CloudSyncRawFailureCategory::Unknown, "http-unknown"), + }, + PushError::ResourceTimeout + | PushError::ResourceGenTimeout + | PushError::ResourceStalled + | PushError::NotConnected => (CloudSyncRawFailureCategory::Network, "network"), + PushError::TooManyRequests => { + (CloudSyncRawFailureCategory::Throttled, "cloudkit-throttled") + } + PushError::UnauthorizedAccountError + | PushError::TokenMissing + | PushError::UserNotFound + | PushError::AuthInvalid(_) + | PushError::MobileMeError(_, _) => ( + CloudSyncRawFailureCategory::Authorization, + "cloudkit-authorization", + ), + PushError::PCSRecordKeyMissing + | PushError::MasterKeyNotFound + | PushError::NotInClique + | PushError::ShareKeyNotFound(_) + | PushError::NoRoutingKey => ( + CloudSyncRawFailureCategory::PcsUnavailable, + "pcs-unavailable", + ), + PushError::ProtobufError(_) | PushError::JsonError(_) => ( + CloudSyncRawFailureCategory::MalformedRecord, + "malformed-response", + ), + PushError::CloudKitProtocolError(CloudKitProtocolError::ContinuationTokenNoProgress) => ( + CloudSyncRawFailureCategory::MalformedRecord, + "cloudkit-continuation-no-progress", + ), + PushError::IoError(_) => (CloudSyncRawFailureCategory::LocalStorage, "local-storage"), + PushError::DoNotRetry(inner) => cloud_sync_failure_category(inner), + PushError::BatchError(inner) => cloud_sync_failure_category(inner), + _ => (CloudSyncRawFailureCategory::Unknown, "unknown"), + } +} + +#[cfg(test)] +mod cloud_sync_failure_mapping_tests { + use super::*; + + #[test] + fn continuation_no_progress_is_nonretryable_protocol_failure() { + let error = + PushError::CloudKitProtocolError(CloudKitProtocolError::ContinuationTokenNoProgress); + + assert_eq!( + cloud_sync_failure_category(&error), + ( + CloudSyncRawFailureCategory::MalformedRecord, + "cloudkit-continuation-no-progress", + ) + ); + assert_eq!(cloud_sync_retry_after_seconds(&error), None); + } + + #[test] + fn cloudkit_http_retry_after_survives_bridge_mapping() { + let error = PushError::CloudKitHttpError { + status: 429, + retry_after: Some(Duration::from_secs(901)), + }; + + assert_eq!( + cloud_sync_failure_category(&error), + (CloudSyncRawFailureCategory::Throttled, "http-throttled",) + ); + assert_eq!(cloud_sync_retry_after_seconds(&error), Some(901)); + } +} + +/// Fetches one bounded, ordered, read-only raw CloudKit page. +/// +/// Records remain in their server-encrypted protobuf form. Unsupported or +/// malformed records are returned for quarantine rather than decoded. +const CLOUD_SYNC_RAW_FETCH_DEADLINE: Duration = Duration::from_secs(40); + +pub async fn cloud_sync_fetch_raw_page( + cloud_messages_client: &Arc>, + stream: String, + continuation_token: Option>, + max_changes: u32, +) -> CloudSyncRawFetchResult { + if !matches!( + stream.as_str(), + "chats" + | "messages" + | "attachments" + | "messageUpdateZone" + | "recoverableMessageDeleteZone" + | "scheduledMessageZone" + | "chat1ManateeZone" + ) { + return CloudSyncRawFetchResult { + page: None, + failure: Some(CloudSyncRawFailure { + category: CloudSyncRawFailureCategory::Unknown, + retry_after_seconds: None, + safe_code: "invalid-stream".to_string(), + }), + }; + } + + let fetch = async { + match stream.as_str() { + "chats" => { + cloud_messages_client + .sync_chats_page(continuation_token, Some(max_changes)) + .await + } + "messages" => { + cloud_messages_client + .sync_messages_page(continuation_token, Some(max_changes)) + .await + } + "attachments" => { + cloud_messages_client + .sync_attachments_page(continuation_token, Some(max_changes)) + .await + } + "messageUpdateZone" => { + cloud_messages_client + .sync_message_update_page(continuation_token, Some(max_changes)) + .await + } + "recoverableMessageDeleteZone" => { + cloud_messages_client + .sync_recoverable_message_delete_page(continuation_token, Some(max_changes)) + .await + } + "scheduledMessageZone" => { + cloud_messages_client + .sync_scheduled_message_page(continuation_token, Some(max_changes)) + .await + } + "chat1ManateeZone" => { + cloud_messages_client + .sync_chat1_page(continuation_token, Some(max_changes)) + .await + } + _ => unreachable!("stream was validated before starting the fetch"), + } + }; + + let result = match tokio::time::timeout(CLOUD_SYNC_RAW_FETCH_DEADLINE, fetch).await { + Ok(result) => result, + Err(_) => { + return CloudSyncRawFetchResult { + page: None, + failure: Some(CloudSyncRawFailure { + category: CloudSyncRawFailureCategory::Network, + retry_after_seconds: None, + safe_code: "fetch-deadline".to_string(), + }), + }; + } + }; + + match result { + Ok(page) => CloudSyncRawFetchResult { + page: Some(map_cloud_sync_raw_page(page)), + failure: None, + }, + Err(error) => { + let (category, safe_code) = cloud_sync_failure_category(&error); + CloudSyncRawFetchResult { + page: None, + failure: Some(CloudSyncRawFailure { + category, + retry_after_seconds: cloud_sync_retry_after_seconds(&error), + safe_code: safe_code.to_string(), + }), + } + } + } +} + pub async fn sync_chats( cloud_messages_client: &Arc>, continuation_token: Option>, @@ -2411,7 +6401,12 @@ pub async fn save_chats( cloud_messages_client: &Arc>, chats: HashMap, ) -> anyhow::Result> { - Ok(cloud_messages_client.save_chats(chats).await?.into_iter().map(|(a, b)| (a, b.is_ok())).collect()) + Ok(cloud_messages_client + .save_chats(chats) + .await? + .into_iter() + .map(|(a, b)| (a, b.is_ok())) + .collect()) } pub async fn delete_chats( @@ -2425,14 +6420,21 @@ pub async fn sync_messages( cloud_messages_client: &Arc>, continuation_token: Option>, ) -> anyhow::Result<(Vec, HashMap>, i32)> { - Ok(cloud_messages_client.sync_messages(continuation_token).await?) + Ok(cloud_messages_client + .sync_messages(continuation_token) + .await?) } pub async fn save_messages( cloud_messages_client: &Arc>, messages: HashMap, ) -> anyhow::Result> { - Ok(cloud_messages_client.save_messages(messages).await?.into_iter().map(|(a, b)| (a, b.is_ok())).collect()) + Ok(cloud_messages_client + .save_messages(messages) + .await? + .into_iter() + .map(|(a, b)| (a, b.is_ok())) + .collect()) } pub async fn delete_messages( @@ -2455,30 +6457,39 @@ pub fn encode_message_info(info: &MessageSummaryInfo) -> Vec { #[frb(external)] impl MessageFlags { #[frb(sync)] - pub fn bits(&self) -> i64 { } + pub fn bits(&self) -> i64 {} #[frb(sync)] - pub fn from_bits_truncate(val: i64) -> Self { } + pub fn from_bits_truncate(val: i64) -> Self {} } pub async fn sync_attachments( cloud_messages_client: &Arc>, continuation_token: Option>, ) -> anyhow::Result<(Vec, HashMap>, i32)> { - Ok(cloud_messages_client.sync_attachments(continuation_token).await?) + Ok(cloud_messages_client + .sync_attachments(continuation_token) + .await?) } pub async fn save_attachments( cloud_messages_client: &Arc>, attachments: HashMap, ) -> anyhow::Result> { - Ok(cloud_messages_client.save_attachments(attachments).await?.into_iter().map(|(a, b)| (a, b.is_ok())).collect()) + Ok(cloud_messages_client + .save_attachments(attachments) + .await? + .into_iter() + .map(|(a, b)| (a, b.is_ok())) + .collect()) } pub async fn delete_attachments( cloud_messages_client: &Arc>, attachments: &[String], ) -> anyhow::Result<()> { - Ok(cloud_messages_client.delete_attachments(attachments).await?) + Ok(cloud_messages_client + .delete_attachments(attachments) + .await?) } pub async fn count_records( @@ -2487,16 +6498,16 @@ pub async fn count_records( Ok(cloud_messages_client.count_records().await?) } -pub async fn download_cloud_attachments(cloud_messages_client: &Arc>, files: Vec<(String, String)>) -> anyhow::Result<()> { +pub async fn download_cloud_attachments( + cloud_messages_client: &Arc>, + files: Vec<(String, String)>, +) -> anyhow::Result<()> { let mut map = HashMap::new(); for (file, record) in files { - info!("here {}", file); let path = std::path::Path::new(&file); let prefix = path.parent().unwrap(); std::fs::create_dir_all(prefix)?; - info!("created {}", file); - map.insert(record, std::fs::File::create(file)?); } @@ -2506,7 +6517,9 @@ pub async fn download_cloud_attachments(cloud_messages_client: &Arc u64 { - time.duration_since(SystemTime::UNIX_EPOCH).unwrap().as_millis() as u64 + time.duration_since(SystemTime::UNIX_EPOCH) + .unwrap() + .as_millis() as u64 } #[frb(sync)] @@ -2522,7 +6535,10 @@ pub fn date_now() -> plist::Date { #[frb(sync, type_64bit_int)] pub fn date_to_ms(date: &plist::Date) -> u64 { let systemtime: SystemTime = date.clone().into(); - systemtime.duration_since(SystemTime::UNIX_EPOCH).unwrap().as_millis() as u64 + systemtime + .duration_since(SystemTime::UNIX_EPOCH) + .unwrap() + .as_millis() as u64 } #[frb(sync, type_64bit_int)] @@ -2531,8 +6547,10 @@ pub fn ms_to_date(ms: u64) -> plist::Date { time.into() } -pub async fn download_cloud_group_photos(cloud_messages_client: &Arc>, files: Vec<(String, String)>) -> anyhow::Result<()> { - +pub async fn download_cloud_group_photos( + cloud_messages_client: &Arc>, + files: Vec<(String, String)>, +) -> anyhow::Result<()> { let mut map = HashMap::new(); for (file, record) in files { let path = std::path::Path::new(&file); @@ -2546,74 +6564,113 @@ pub async fn download_cloud_group_photos(cloud_messages_client: &Arc>, files: Vec<(String, String)>) -> anyhow::Result> { - +pub async fn upload_cloud_attachments( + cloud_messages_client: &Arc>, + files: Vec<(String, String)>, +) -> anyhow::Result> { let mut to_upload = vec![]; let mut hashes = vec![]; for (file, record) in &files { - let prepared = cloud_messages_client.prepare_file(std::fs::File::open(file)?).await?; + let prepared = cloud_messages_client + .prepare_file(std::fs::File::open(file)?) + .await?; hashes.push(prepared.total_sig.clone()); to_upload.push((prepared, std::fs::File::open(file)?, record.clone())); } - + let results = cloud_messages_client.upload_attachments(to_upload).await?; let mut finish = HashMap::new(); for result in results { - let idx = hashes.iter().position(|h| h == result.signature.as_ref().unwrap()).unwrap(); + let idx = hashes + .iter() + .position(|h| h == result.signature.as_ref().unwrap()) + .unwrap(); finish.insert(files[idx].1.clone(), result); } Ok(finish) } -pub async fn upload_group_photo(cloud_messages_client: &Arc>, files: Vec<(String, String)>) -> anyhow::Result> { - +pub async fn upload_group_photo( + cloud_messages_client: &Arc>, + files: Vec<(String, String)>, +) -> anyhow::Result> { let mut to_upload = vec![]; let mut hashes = vec![]; for (file, record) in &files { - let prepared = cloud_messages_client.prepare_file(std::fs::File::open(file)?).await?; + let prepared = cloud_messages_client + .prepare_file(std::fs::File::open(file)?) + .await?; hashes.push(prepared.total_sig.clone()); to_upload.push((prepared, std::fs::File::open(file)?, record.clone())); } - + let results = cloud_messages_client.upload_group_photo(to_upload).await?; let mut finish = HashMap::new(); for result in results { - let idx = hashes.iter().position(|h| h == result.signature.as_ref().unwrap()).unwrap(); + let idx = hashes + .iter() + .position(|h| h == result.signature.as_ref().unwrap()) + .unwrap(); finish.insert(files[idx].1.clone(), result); } Ok(finish) } -pub async fn change_escrow_password(keychain: &Arc>, device_password: String) -> anyhow::Result<()> { - keychain.change_escrow_password(device_password.as_bytes()).await?; +pub async fn change_escrow_password( + keychain: &Arc>, + device_password: String, +) -> anyhow::Result<()> { + keychain + .change_escrow_password(device_password.as_bytes()) + .await?; Ok(()) } -pub async fn circle_setup_clique(client: &Arc>>>, keychain: &Arc>, device_password: String) -> anyhow::Result { +pub async fn circle_setup_clique( + client: &Arc>>>, + keychain: &Arc>, + device_password: String, +) -> anyhow::Result { let mut locked = client.lock().await; - let Some(inner) = &mut *locked else { return Ok(true) }; - if let Err(e) = inner.setup_trusted_peers(keychain.clone(), device_password.as_bytes()).await { + let Some(inner) = &mut *locked else { + return Ok(true); + }; + if let Err(e) = inner + .setup_trusted_peers(keychain.clone(), device_password.as_bytes()) + .await + { if let PushError::CircleOver = &e { - return Ok(true) + return Ok(true); } - return Err(e.into()) + return Err(e.into()); } Ok(false) } -pub async fn verify_2fa(path: String, client: &mut CircleClientSession, anisette: &ArcAnisetteClient, os_config: &JoinedOSConfig, account: &Arc>>, watcher: &mut broadcast::Receiver, idms: &Arc, code: String) -> anyhow::Result<(LoginState, Option)> { +pub async fn verify_2fa( + path: String, + client: &mut CircleClientSession, + anisette: &ArcAnisetteClient, + os_config: &JoinedOSConfig, + account: &Arc>>, + watcher: &mut broadcast::Receiver, + idms: &Arc, + code: String, +) -> anyhow::Result<(LoginState, Option)> { #[cfg(target_os = "android")] let mut login_state = { client.send_code(&code).await?; - tokio::time::timeout(Duration::from_secs(30), async { + let proximity_result = tokio::time::timeout(Duration::from_secs(10), async { loop { - let msg = watcher.recv().await + let msg = watcher + .recv() + .await .map_err(|error| anyhow!("Trusted-device 2FA push listener closed: {error}"))?; if let Some(test) = idms.handle(msg)? { match test { @@ -2621,12 +6678,31 @@ pub async fn verify_2fa(path: String, client: &mut CircleClientSession(state); } - }, - _ => { } + } + _ => {} } } } - }).await.map_err(|_| anyhow!("Timed out waiting for the trusted-device 2FA proximity response"))?? + }) + .await; + + match proximity_result { + Ok(Ok(state)) => state, + Ok(Err(error)) => { + warn!( + "Trusted-device 2FA proximity exchange failed ({error}); \ + falling back to direct verification" + ); + account.lock().await.verify_2fa(code).await? + } + Err(_) => { + warn!( + "Trusted-device 2FA proximity response timed out; \ + falling back to direct verification" + ); + account.lock().await.verify_2fa(code).await? + } + } }; #[cfg(not(target_os = "android"))] @@ -2643,7 +6719,7 @@ pub async fn verify_2fa(path: String, client: &mut CircleClientSession>>) -> anyhow::Result<(Vec, Option)> { +pub async fn get_2fa_sms_opts( + state: &Arc>>, +) -> anyhow::Result<(Vec, Option)> { let account = state.lock().await; let extras = account.get_auth_extras().await?; - Ok(( - extras.trusted_phone_numbers, - extras.new_state - )) + Ok((extras.trusted_phone_numbers, extras.new_state)) } -pub async fn send_2fa_sms(locked: Option>, account: &Arc>>, phone_id: u32) -> anyhow::Result { +pub async fn send_2fa_sms( + locked: Option>, + account: &Arc>>, + phone_id: u32, +) -> anyhow::Result { if let Some(l) = locked { l.cancel().await?; } @@ -2672,7 +6749,14 @@ pub async fn send_2fa_sms(locked: Option>>, anisette: &ArcAnisetteClient, config: &JoinedOSConfig, body: &VerifyBody, code: String) -> anyhow::Result<(LoginState, Option)> { +pub async fn verify_2fa_sms( + path: String, + account_mut: &Arc>>, + anisette: &ArcAnisetteClient, + config: &JoinedOSConfig, + body: &VerifyBody, + code: String, +) -> anyhow::Result<(LoginState, Option)> { let mut account = account_mut.lock().await; let mut login_state = account.verify_sms_2fa(code, body.clone()).await?; @@ -2683,7 +6767,7 @@ pub async fn verify_2fa_sms(path: String, account_mut: &Arc, path: String, config: &JoinedOSConfig, aps: &APSConnection, account: Option>>>, reset_hw: bool, logout: bool) -> anyhow::Result<()> { + std::fs::write( + &path, + plist_to_string(&StatusKitState { + my_key: None, + ..plist::from_file(&path).unwrap_or_default() + }) + .unwrap(), + ) + .unwrap(); +} + +pub async fn reset_state( + cancel: &mpsc::Sender<()>, + path: String, + config: &JoinedOSConfig, + aps: &APSConnection, + account: Option>>>, + reset_hw: bool, + logout: bool, +) -> anyhow::Result<()> { // tell any poll to stop let _ = cancel.try_send(()); let dir = PathBuf::from_str(&path).unwrap(); @@ -2730,8 +6827,16 @@ pub async fn reset_state(cancel: &mpsc::Sender<()>, path: String, config: &Joine if logout { if let Some(hardware) = read_hardware(path.clone()) { // try deregistering from iMessage, but if it fails we don't really care - if let Ok(identity) = IDSNGMIdentity::restore(hardware.identity.as_ref(), "openbubbles") { - let _ = register(&*config.config(), &*aps.state.read().await, &[], &mut [], &identity).await; + if let Ok(identity) = IDSNGMIdentity::restore(hardware.identity.as_ref(), "openbubbles") + { + let _ = register( + &*config.config(), + &*aps.state.read().await, + &[], + &mut [], + &identity, + ) + .await; } } if let Some(account) = &account { @@ -2743,7 +6848,12 @@ pub async fn reset_state(cancel: &mpsc::Sender<()>, path: String, config: &Joine let _ = std::fs::remove_file(dir.join("id.plist")); if let Ok(mut cache) = plist::from_file::<_, Dictionary>(dir.join("id_cache.plist")) { // keep replay counters which are nessesary if our identity doesn't change - cache.get_mut("cache").expect("No cache?").as_dictionary_mut().unwrap().clear(); + cache + .get_mut("cache") + .expect("No cache?") + .as_dictionary_mut() + .unwrap() + .clear(); plist::to_file_xml(dir.join("id_cache.plist"), &cache)?; } @@ -2778,12 +6888,13 @@ pub fn close_syncmanager(shared: &SyncManager>>) -> anyhow::Result { +pub async fn get_user_name( + state: &Arc>>, +) -> anyhow::Result { let (first, last) = state.lock().await.get_name(); Ok(format!("{first} {last}")) } - #[derive(Clone)] #[frb(type_64bit_int)] pub enum RegisterState { @@ -2793,8 +6904,8 @@ pub enum RegisterState { Registering, Failed { retry_wait: Option, - error: String - } + error: String, + }, } pub async fn get_regstate(state: &Arc) -> anyhow::Result { @@ -2802,21 +6913,33 @@ pub async fn get_regstate(state: &Arc) -> anyhow::Result RegisterState::Registering, ResourceState::Generated => RegisterState::Registered { - next_s: state.identity.calculate_rereg_time_s().await + next_s: state.identity.calculate_rereg_time_s().await, + }, + ResourceState::Failed(failure) => RegisterState::Failed { + retry_wait: failure.retry_wait, + error: format!("{}", failure.error), + }, + ResourceState::Closed => RegisterState::Failed { + retry_wait: None, + error: "Closed".to_owned(), }, - ResourceState::Failed(failure) => - RegisterState::Failed { retry_wait: failure.retry_wait, error: format!("{}", failure.error) }, - ResourceState::Closed => RegisterState::Failed { retry_wait: None, error: "Closed".to_owned() } }) } -pub async fn convert_token_to_uuid(state: &Arc, handle: String, token: Vec) -> anyhow::Result { +pub async fn convert_token_to_uuid( + state: &Arc, + handle: String, + token: Vec, +) -> anyhow::Result { let uuid = state.identity.token_to_uuid(&handle, &token).await?; Ok(uuid) } - -pub async fn get_sms_targets(state: &Arc, handle: String, refresh: bool) -> anyhow::Result> { +pub async fn get_sms_targets( + state: &Arc, + handle: String, + refresh: bool, +) -> anyhow::Result> { let targets = state.identity.get_sms_targets(&handle, refresh).await?; Ok(targets) } diff --git a/rust/src/api/mod.rs b/rust/src/api/mod.rs index 489180e72a..c860c33972 100644 --- a/rust/src/api/mod.rs +++ b/rust/src/api/mod.rs @@ -2,4 +2,4 @@ // Do not put code in `mod.rs`, but put in e.g. `simple.rs`. // -pub mod api; \ No newline at end of file +pub mod api; diff --git a/rust/src/cloud_sync_canonical_converter.rs b/rust/src/cloud_sync_canonical_converter.rs new file mode 100644 index 0000000000..1043ce2d02 --- /dev/null +++ b/rust/src/cloud_sync_canonical_converter.rs @@ -0,0 +1,3678 @@ +//! Private, default-off Cloud Sync V2 raw-presence conversion gate. +//! +//! `CloudKitRecord` derives populate missing fields through `Default`. This +//! gate therefore captures field presence from the raw protobuf before typed +//! decoding and captures nested plist keys immediately after decryption but +//! before serde. It refuses to infer absence or an explicit clear from a +//! defaulted typed value. + +#![allow(dead_code)] + +use std::{ + collections::{HashMap, HashSet}, + fmt::{self, Debug, Formatter}, + io::Cursor, +}; + +use plist::Value as PlistValue; +use rustpush::{ + cloud_messages::{ + cloudmessagesp::{MessageProto, MessageProto2, MessageProto4}, + AttachmentMeta, CloudChat, CloudMessage, MessageFlags, MessageSummaryInfo, + }, + cloudkit_proto::{record::field::value::Type as CloudKitFieldType, Record}, +}; +use sha2::{Digest, Sha256}; + +use crate::{ + cloud_sync_canonical_dto::{ + parse_associated_parent, parse_owned_attachment_guid, parse_reply_parent, + CloudCanonicalAlias, CloudCanonicalAliasKind, CloudCanonicalAttachmentPayload, + CloudCanonicalAttachmentReference, CloudCanonicalAttributedBody, CloudCanonicalChatPayload, + CloudCanonicalChatStyle, CloudCanonicalDigest, CloudCanonicalEditPartSnapshot, + CloudCanonicalEntityKind, CloudCanonicalEnvelope, CloudCanonicalField, CloudCanonicalHash, + CloudCanonicalKnownMessageFlags, CloudCanonicalMessageAssociation, + CloudCanonicalMessageEdit, CloudCanonicalMessagePayload, CloudCanonicalMutation, + CloudCanonicalMutationKind, CloudCanonicalParentReference, CloudCanonicalPayload, + CloudCanonicalProtectedReference, CloudCanonicalReactionKind, CloudCanonicalReplyReference, + CloudCanonicalService, CloudCanonicalSnapshot, CloudCanonicalTextRun, + CloudCanonicalTombstone, CloudCanonicalValidationFailure, CLOUD_CANONICAL_SCHEMA_VERSION, + }, + cloud_sync_semantic_decoder::CloudSemanticIdentifierHasher, +}; + +const MAX_RAW_FIELDS: usize = 4_096; +const MAX_FIELD_NAME_BYTES: usize = 256; +const MAX_NESTED_PLIST_BYTES: usize = 16 * 1024 * 1024; +const MAX_ATTRIBUTED_BODY_BYTES: usize = 16 * 1024 * 1024; +const MAX_MESSAGE_SUMMARY_BYTES: usize = 16 * 1024 * 1024; +const MAX_TYPED_STREAM_OBJECTS: usize = 131_072; +const MAX_TYPED_STREAM_FIELDS: usize = 131_072; +const MAX_TYPED_STREAM_EXPANDED_BYTES: usize = 32 * 1024 * 1024; +const MAX_TYPED_STREAM_DEPTH: usize = 64; +const MAX_ATTRIBUTED_BODIES: usize = 4_096; +const MAX_RUNS_PER_BODY: usize = 65_536; +const MAX_ATTRIBUTES_PER_RUN: usize = 256; +const MAX_MESSAGE_EDITS: usize = 65_536; +const MAX_RETRACTED_PARTS: usize = 65_536; +const MAX_CANONICAL_TIMESTAMP_MILLIS: i64 = 253_402_300_799_999; +const APPLE_EPOCH_OFFSET_MILLIS: i64 = 978_307_200_000; + +const TYPED_STREAM_TAG_START: u8 = 0x84; +const TYPED_STREAM_TAG_EMPTY: u8 = 0x85; +const TYPED_STREAM_FIELDS_END: u8 = 0x86; +const TYPED_STREAM_REF_START: usize = 0x92; + +#[derive(Clone)] +enum BoundedStreamValue { + Object(Option), + String(String), + Bool(bool), + Byte(u8), + Int(u32, bool), + Float(f32), + Double(f64), + Array(Vec), +} + +enum BoundedStreamObject { + Class { + parent: Option, + name: String, + }, + Object { + class: usize, + fields: Vec>, + }, + CString(String), + Placeholder, +} + +#[derive(Clone, Copy, Debug, Eq, PartialEq)] +enum BoundedStreamFailure { + Malformed, + Oversized, +} + +struct BoundedTypedStreamDecoder<'a> { + input: &'a [u8], + offset: usize, + string_cache: Vec, + objects: Vec, + field_count: usize, + expanded_bytes: usize, +} + +impl<'a> BoundedTypedStreamDecoder<'a> { + fn new(input: &'a [u8]) -> Result { + if input.len() > MAX_ATTRIBUTED_BODY_BYTES { + return Err(BoundedStreamFailure::Oversized); + } + Ok(Self { + input, + offset: 0, + string_cache: Vec::new(), + objects: Vec::new(), + field_count: 0, + expanded_bytes: 0, + }) + } + + fn charge_bytes(&mut self, count: usize) -> Result<(), BoundedStreamFailure> { + self.expanded_bytes = self + .expanded_bytes + .checked_add(count) + .ok_or(BoundedStreamFailure::Oversized)?; + if self.expanded_bytes > MAX_TYPED_STREAM_EXPANDED_BYTES { + return Err(BoundedStreamFailure::Oversized); + } + Ok(()) + } + + fn charge_fields(&mut self, count: usize) -> Result<(), BoundedStreamFailure> { + self.field_count = self + .field_count + .checked_add(count) + .ok_or(BoundedStreamFailure::Oversized)?; + if self.field_count > MAX_TYPED_STREAM_FIELDS { + return Err(BoundedStreamFailure::Oversized); + } + Ok(()) + } + + fn reserve_object(&mut self) -> Result { + if self.objects.len() >= MAX_TYPED_STREAM_OBJECTS { + return Err(BoundedStreamFailure::Oversized); + } + let index = self.objects.len(); + self.objects.push(BoundedStreamObject::Placeholder); + Ok(index) + } + + fn read_u8(&mut self) -> Result { + let value = *self + .input + .get(self.offset) + .ok_or(BoundedStreamFailure::Malformed)?; + self.offset += 1; + Ok(value) + } + + fn read_exact(&mut self, count: usize) -> Result<&'a [u8], BoundedStreamFailure> { + let end = self + .offset + .checked_add(count) + .ok_or(BoundedStreamFailure::Oversized)?; + let bytes = self + .input + .get(self.offset..end) + .ok_or(BoundedStreamFailure::Malformed)?; + self.offset = end; + Ok(bytes) + } + + fn read_number(&mut self, tag: Option) -> Result { + let tag = tag.map_or_else(|| self.read_u8(), Ok)?; + match tag { + 0x81 => { + let bytes: [u8; 2] = self + .read_exact(2)? + .try_into() + .map_err(|_| BoundedStreamFailure::Malformed)?; + Ok(u16::from_le_bytes(bytes) as u32) + } + 0x82 => { + let bytes: [u8; 4] = self + .read_exact(4)? + .try_into() + .map_err(|_| BoundedStreamFailure::Malformed)?; + Ok(u32::from_le_bytes(bytes)) + } + 0x80..=0x91 => Err(BoundedStreamFailure::Malformed), + value => Ok(value as u32), + } + } + + fn read_float(&mut self) -> Result { + let tag = self.read_u8()?; + if tag == 0x83 { + let bytes: [u8; 4] = self + .read_exact(4)? + .try_into() + .map_err(|_| BoundedStreamFailure::Malformed)?; + Ok(f32::from_le_bytes(bytes)) + } else { + self.read_number(Some(tag)).map(|value| value as f32) + } + } + + fn read_double(&mut self) -> Result { + let tag = self.read_u8()?; + if tag == 0x83 { + let bytes: [u8; 8] = self + .read_exact(8)? + .try_into() + .map_err(|_| BoundedStreamFailure::Malformed)?; + Ok(f64::from_le_bytes(bytes)) + } else { + self.read_number(Some(tag)).map(|value| value as f64) + } + } + + fn read_string_raw(&mut self) -> Result { + let length = usize::try_from(self.read_number(None)?) + .map_err(|_| BoundedStreamFailure::Oversized)?; + if length > MAX_ATTRIBUTED_BODY_BYTES { + return Err(BoundedStreamFailure::Oversized); + } + self.charge_bytes(length)?; + String::from_utf8(self.read_exact(length)?.to_vec()) + .map_err(|_| BoundedStreamFailure::Malformed) + } + + fn read_reference_index(&mut self, tag: u8) -> Result { + let encoded = usize::try_from(self.read_number(Some(tag))?) + .map_err(|_| BoundedStreamFailure::Oversized)?; + encoded + .checked_sub(TYPED_STREAM_REF_START) + .ok_or(BoundedStreamFailure::Malformed) + } + + fn read_string(&mut self, tag: Option) -> Result, BoundedStreamFailure> { + let tag = tag.map_or_else(|| self.read_u8(), Ok)?; + match tag { + TYPED_STREAM_TAG_START => { + let string = self.read_string_raw()?; + if self.string_cache.len() >= MAX_TYPED_STREAM_OBJECTS { + return Err(BoundedStreamFailure::Oversized); + } + self.string_cache.push(string.clone()); + Ok(Some(string)) + } + TYPED_STREAM_TAG_EMPTY => Ok(None), + tag => { + let index = self.read_reference_index(tag)?; + let value = self + .string_cache + .get(index) + .ok_or(BoundedStreamFailure::Malformed)? + .clone(); + self.charge_bytes(value.len())?; + Ok(Some(value)) + } + } + } + + fn decode_class_list(&mut self, depth: usize) -> Result, BoundedStreamFailure> { + if depth > MAX_TYPED_STREAM_DEPTH { + return Err(BoundedStreamFailure::Oversized); + } + match self.read_u8()? { + TYPED_STREAM_TAG_START => { + let index = self.reserve_object()?; + let name = self + .read_string(None)? + .ok_or(BoundedStreamFailure::Malformed)?; + if name.is_empty() || name.len() > MAX_FIELD_NAME_BYTES { + return Err(BoundedStreamFailure::Malformed); + } + let _version = self.read_number(None)?; + let parent = self.decode_class_list(depth + 1)?; + self.objects[index] = BoundedStreamObject::Class { parent, name }; + Ok(Some(index)) + } + TYPED_STREAM_TAG_EMPTY => Ok(None), + tag => { + let index = self.read_reference_index(tag)?; + if !matches!( + self.objects.get(index), + Some(BoundedStreamObject::Class { .. }) + ) { + return Err(BoundedStreamFailure::Malformed); + } + Ok(Some(index)) + } + } + } + + fn decode_c_string(&mut self) -> Result, BoundedStreamFailure> { + match self.read_u8()? { + TYPED_STREAM_TAG_START => { + let index = self.reserve_object()?; + let value = self + .read_string(None)? + .ok_or(BoundedStreamFailure::Malformed)?; + self.objects[index] = BoundedStreamObject::CString(value); + Ok(Some(index)) + } + TYPED_STREAM_TAG_EMPTY => Ok(None), + tag => { + let index = self.read_reference_index(tag)?; + if !matches!( + self.objects.get(index), + Some(BoundedStreamObject::CString(_)) + ) { + return Err(BoundedStreamFailure::Malformed); + } + Ok(Some(index)) + } + } + } + + fn decode_object(&mut self, depth: usize) -> Result, BoundedStreamFailure> { + if depth > MAX_TYPED_STREAM_DEPTH { + return Err(BoundedStreamFailure::Oversized); + } + match self.read_u8()? { + TYPED_STREAM_TAG_START => { + let index = self.reserve_object()?; + let class = self + .decode_class_list(depth + 1)? + .ok_or(BoundedStreamFailure::Malformed)?; + let mut fields = Vec::new(); + loop { + let tag = self.read_u8()?; + if tag == TYPED_STREAM_FIELDS_END { + break; + } + self.charge_fields(1)?; + fields.push(self.decode_type(Some(tag), depth + 1)?); + } + self.objects[index] = BoundedStreamObject::Object { class, fields }; + Ok(Some(index)) + } + TYPED_STREAM_TAG_EMPTY => Ok(None), + tag => { + let index = self.read_reference_index(tag)?; + if !matches!( + self.objects.get(index), + Some(BoundedStreamObject::Object { .. }) + ) { + return Err(BoundedStreamFailure::Malformed); + } + Ok(Some(index)) + } + } + } + + fn decode_type( + &mut self, + tag: Option, + depth: usize, + ) -> Result, BoundedStreamFailure> { + if depth > MAX_TYPED_STREAM_DEPTH { + return Err(BoundedStreamFailure::Oversized); + } + let type_string = self + .read_string(tag)? + .ok_or(BoundedStreamFailure::Malformed)?; + if type_string.starts_with('[') && type_string.ends_with("c]") { + let count = type_string[1..type_string.len() - 2] + .parse::() + .map_err(|_| BoundedStreamFailure::Malformed)?; + if count > MAX_ATTRIBUTED_BODY_BYTES { + return Err(BoundedStreamFailure::Oversized); + } + self.charge_bytes(count)?; + return Ok(vec![BoundedStreamValue::Array( + self.read_exact(count)?.to_vec(), + )]); + } + if type_string.len() > MAX_FIELD_NAME_BYTES { + return Err(BoundedStreamFailure::Oversized); + } + self.charge_fields(type_string.len())?; + let mut values = Vec::with_capacity(type_string.len()); + for kind in type_string.bytes() { + let value = match kind { + b'@' => BoundedStreamValue::Object(self.decode_object(depth + 1)?), + b'+' => BoundedStreamValue::String(self.read_string_raw()?), + b'*' => BoundedStreamValue::Object(self.decode_c_string()?), + b'B' => BoundedStreamValue::Bool(match self.read_u8()? { + 0 => false, + 1 => true, + _ => return Err(BoundedStreamFailure::Malformed), + }), + b'C' | b'c' => BoundedStreamValue::Byte(self.read_u8()?), + b's' | b'i' | b'l' | b'q' | b'S' | b'I' | b'L' | b'Q' => BoundedStreamValue::Int( + self.read_number(None)?, + matches!(kind, b's' | b'i' | b'l' | b'q'), + ), + b'f' => BoundedStreamValue::Float(self.read_float()?), + b'd' => BoundedStreamValue::Double(self.read_double()?), + _ => return Err(BoundedStreamFailure::Malformed), + }; + values.push(value); + } + Ok(values) + } + + fn decode(mut self) -> Result<(Self, Vec), BoundedStreamFailure> { + if self.read_u8()? != 0x04 + || self.read_string_raw()? != "streamtyped" + || self.read_number(None)? != 1000 + { + return Err(BoundedStreamFailure::Malformed); + } + let values = self.decode_type(None, 0)?; + if self.offset != self.input.len() { + return Err(BoundedStreamFailure::Malformed); + } + Ok((self, values)) + } + + fn class_name(&self, class: usize) -> Result<&str, BoundedStreamFailure> { + match self.objects.get(class) { + Some(BoundedStreamObject::Class { parent, name }) => { + if let Some(parent) = parent { + if !matches!( + self.objects.get(*parent), + Some(BoundedStreamObject::Class { .. }) + ) { + return Err(BoundedStreamFailure::Malformed); + } + } + Ok(name) + } + _ => Err(BoundedStreamFailure::Malformed), + } + } + + fn object_fields( + &self, + object: usize, + accepted_classes: &[&str], + ) -> Result<&[Vec], BoundedStreamFailure> { + let (class, fields) = match self.objects.get(object) { + Some(BoundedStreamObject::Object { class, fields }) => (*class, fields), + _ => return Err(BoundedStreamFailure::Malformed), + }; + let class_name = self.class_name(class)?; + if !accepted_classes.contains(&class_name) { + return Err(BoundedStreamFailure::Malformed); + } + Ok(fields) + } + + fn string_object(&self, value: &BoundedStreamValue) -> Result { + let BoundedStreamValue::Object(Some(object)) = value else { + return Err(BoundedStreamFailure::Malformed); + }; + let fields = self.object_fields(*object, &["NSString", "NSMutableString"])?; + match fields.first().and_then(|field| field.first()) { + Some(BoundedStreamValue::String(value)) => Ok(value.clone()), + _ => Err(BoundedStreamFailure::Malformed), + } + } + + fn number_object(&self, value: &BoundedStreamValue) -> Result { + let BoundedStreamValue::Object(Some(object)) = value else { + return Err(BoundedStreamFailure::Malformed); + }; + let fields = self.object_fields(*object, &["NSNumber"])?; + match fields.get(1).and_then(|field| field.first()) { + Some(BoundedStreamValue::Int(value, _)) => Ok(*value), + _ => Err(BoundedStreamFailure::Malformed), + } + } +} + +#[derive(Clone, Default)] +struct DecodedRunAttributes { + message_part: Option, + attachment_guid: Option, + mention: Option, + audio_transcript: Option, + text_effect: Option, + bold: Option, + italic: Option, + strikethrough: Option, + underline: Option, +} + +struct DecodedAttributedContent { + field: CloudCanonicalField>, + maximum_utf16_length: Option, +} + +struct DecodedMessageSummary { + edits: CloudCanonicalField>, + retracted_parts: CloudCanonicalField>, + edit_snapshots: Vec, +} + +#[derive(Clone, Copy, Debug, Eq, PartialEq)] +pub(crate) enum CloudRawFieldPresence { + Absent, + PresentWithoutValue, + PresentWithValue, +} + +#[derive(Clone, Copy, Debug, Eq, PartialEq)] +pub(crate) enum CloudRawPresenceFailure { + TooManyFields, + MalformedFieldIdentifier, + DuplicateFieldIdentifier, + FieldNotPresent, + NestedPayloadTooLarge, + MalformedNestedPlist, + NestedPlistIsNotDictionary, + ExplicitClearWithoutPresence, +} + +impl fmt::Display for CloudRawPresenceFailure { + fn fmt(&self, formatter: &mut Formatter<'_>) -> fmt::Result { + formatter.write_str(match self { + Self::TooManyFields => "Cloud Sync raw record contains too many fields", + Self::MalformedFieldIdentifier => "Cloud Sync raw field identifier is malformed", + Self::DuplicateFieldIdentifier => "Cloud Sync raw field identifier is duplicated", + Self::FieldNotPresent => "Cloud Sync nested presence source field is absent", + Self::NestedPayloadTooLarge => "Cloud Sync nested presence payload exceeds its bound", + Self::MalformedNestedPlist => "Cloud Sync nested presence plist is malformed", + Self::NestedPlistIsNotDictionary => { + "Cloud Sync nested presence plist is not a dictionary" + } + Self::ExplicitClearWithoutPresence => { + "Cloud Sync explicit-clear evidence has no matching present field" + } + }) + } +} + +impl std::error::Error for CloudRawPresenceFailure {} + +/// Content-free presence evidence. Values and decrypted plist payloads are +/// discarded after their field names are captured. +#[derive(Clone, Eq, PartialEq)] +pub(crate) struct CloudRawRecordPresence { + fields: HashMap, + nested_plist_keys: HashMap>, + explicit_top_level_clears: HashSet, + explicit_nested_clears: HashSet<(String, String)>, + /// Field names CloudKit sent with wire type `EMPTY_LIST`. + /// + /// The wire format distinguishes "present but empty" from a field being + /// absent, and the merge contract depends on that distinction. It was + /// previously discarded at this boundary, so no live fetch could report + /// whether Apple emits it at all. + /// + /// Recorded as evidence only. No decision reads it, because whether an + /// empty list means "clear" is precisely the question a live run has to + /// answer, and inferring a meaning here would repeat the mistake of + /// inferring one from an empty summary dictionary. + empty_list_fields: HashSet, +} + +impl CloudRawRecordPresence { + pub(crate) fn extract(record: &Record) -> Result { + if record.record_field.len() > MAX_RAW_FIELDS { + return Err(CloudRawPresenceFailure::TooManyFields); + } + let mut fields = HashMap::with_capacity(record.record_field.len()); + let mut empty_list_fields = HashSet::new(); + for field in &record.record_field { + let name = field + .identifier + .as_ref() + .and_then(|identifier| identifier.name.as_deref()) + .filter(|name| { + !name.is_empty() + && name.len() <= MAX_FIELD_NAME_BYTES + && !name.chars().any(char::is_control) + }) + .ok_or(CloudRawPresenceFailure::MalformedFieldIdentifier)?; + let state = if field.value.is_some() { + CloudRawFieldPresence::PresentWithValue + } else { + CloudRawFieldPresence::PresentWithoutValue + }; + if field + .value + .as_ref() + .and_then(|value| value.r#type) + .is_some_and(|kind| kind == CloudKitFieldType::EmptyList as i32) + { + empty_list_fields.insert(name.to_owned()); + } + if fields.insert(name.to_owned(), state).is_some() { + return Err(CloudRawPresenceFailure::DuplicateFieldIdentifier); + } + } + Ok(Self { + fields, + nested_plist_keys: HashMap::new(), + explicit_top_level_clears: HashSet::new(), + explicit_nested_clears: HashSet::new(), + empty_list_fields, + }) + } + + /// Captures keys from a decrypted, already-decompressed plist dictionary. + /// Callers handling `cm` must decompress its gzip wrapper before this + /// boundary. This method retains neither values nor the supplied bytes. + pub(crate) fn capture_decrypted_plist_dictionary( + &mut self, + outer_field: &str, + decrypted_plist: &[u8], + ) -> Result<(), CloudRawPresenceFailure> { + if self.field(outer_field) == CloudRawFieldPresence::Absent { + return Err(CloudRawPresenceFailure::FieldNotPresent); + } + if decrypted_plist.len() > MAX_NESTED_PLIST_BYTES { + return Err(CloudRawPresenceFailure::NestedPayloadTooLarge); + } + let value = PlistValue::from_reader(Cursor::new(decrypted_plist)) + .map_err(|_| CloudRawPresenceFailure::MalformedNestedPlist)?; + let dictionary = value + .into_dictionary() + .ok_or(CloudRawPresenceFailure::NestedPlistIsNotDictionary)?; + if dictionary.len() > MAX_RAW_FIELDS { + return Err(CloudRawPresenceFailure::TooManyFields); + } + let mut keys = HashSet::with_capacity(dictionary.len()); + for (key, _) in dictionary.into_iter() { + if key.is_empty() + || key.len() > MAX_FIELD_NAME_BYTES + || key.chars().any(char::is_control) + { + return Err(CloudRawPresenceFailure::MalformedFieldIdentifier); + } + keys.insert(key); + } + self.nested_plist_keys.insert(outer_field.to_owned(), keys); + Ok(()) + } + + pub(crate) fn field(&self, name: &str) -> CloudRawFieldPresence { + self.fields + .get(name) + .copied() + .unwrap_or(CloudRawFieldPresence::Absent) + } + + /// Whether CloudKit sent this field as wire type `EMPTY_LIST`. + /// + /// Deliberately unused outside tests for now. Surfacing it means adding a + /// field to the transient DTO, and that DTO must be widened once and + /// deliberately rather than regenerated for a single diagnostic. It is + /// recorded as a required item for that widening. + #[cfg_attr(not(test), allow(dead_code))] + pub(crate) fn was_sent_as_empty_list(&self, name: &str) -> bool { + self.empty_list_fields.contains(name) + } + + /// Field names sent as `EMPTY_LIST`, sorted, for redacted diagnostics. + /// + /// Sorted because the backing set has no stable iteration order and this + /// is destined for a report that should not vary between runs. + #[cfg_attr(not(test), allow(dead_code))] + pub(crate) fn empty_list_field_names(&self) -> Vec<&str> { + let mut names: Vec<&str> = self.empty_list_fields.iter().map(String::as_str).collect(); + names.sort_unstable(); + names + } + + /// Records an authoritative clear marker supplied by a pre-typed decoder. + /// Raw presence by itself is deliberately insufficient evidence. + pub(crate) fn mark_top_level_explicit_clear( + &mut self, + field: &str, + ) -> Result<(), CloudRawPresenceFailure> { + if self.field(field) != CloudRawFieldPresence::PresentWithValue { + return Err(CloudRawPresenceFailure::ExplicitClearWithoutPresence); + } + self.explicit_top_level_clears.insert(field.to_owned()); + Ok(()) + } + + /// Records an authoritative nested clear marker before serde defaults can + /// erase the distinction. + pub(crate) fn mark_nested_explicit_clear( + &mut self, + outer_field: &str, + nested_field: &str, + ) -> Result<(), CloudRawPresenceFailure> { + if self.nested_field(outer_field, nested_field) != CloudNestedPresence::Present { + return Err(CloudRawPresenceFailure::ExplicitClearWithoutPresence); + } + self.explicit_nested_clears + .insert((outer_field.to_owned(), nested_field.to_owned())); + Ok(()) + } + + fn is_top_level_explicit_clear(&self, field: &str) -> bool { + self.explicit_top_level_clears.contains(field) + } + + fn is_nested_explicit_clear(&self, outer_field: &str, nested_field: &str) -> bool { + self.explicit_nested_clears + .contains(&(outer_field.to_owned(), nested_field.to_owned())) + } + + fn nested_field(&self, outer_field: &str, nested_field: &str) -> CloudNestedPresence { + match self.field(outer_field) { + CloudRawFieldPresence::Absent => CloudNestedPresence::OuterAbsent, + CloudRawFieldPresence::PresentWithoutValue => CloudNestedPresence::OuterWithoutValue, + CloudRawFieldPresence::PresentWithValue => self + .nested_plist_keys + .get(outer_field) + .map(|keys| { + if keys.contains(nested_field) { + CloudNestedPresence::Present + } else { + CloudNestedPresence::Absent + } + }) + .unwrap_or(CloudNestedPresence::Unavailable), + } + } +} + +impl Debug for CloudRawRecordPresence { + fn fmt(&self, formatter: &mut Formatter<'_>) -> fmt::Result { + formatter + .debug_struct("CloudRawRecordPresence") + .field("field_count", &self.fields.len()) + .field("nested_dictionary_count", &self.nested_plist_keys.len()) + .field( + "explicit_clear_count", + &(self.explicit_top_level_clears.len() + self.explicit_nested_clears.len()), + ) + .finish() + } +} + +#[derive(Clone, Copy, Debug, Eq, PartialEq)] +enum CloudNestedPresence { + OuterAbsent, + OuterWithoutValue, + Unavailable, + Absent, + Present, +} + +#[derive(Clone, Copy, Debug, Eq, PartialEq)] +pub(crate) enum CloudCanonicalDeferredReason { + NestedPresenceUnavailable, + UnprovenEditTimestamp, + UnsupportedExtensionPayload, + UnsupportedMediaCredentials, + UnsupportedGroupPhoto, + UnsupportedSticker, + UnsupportedScheduling, + UnsupportedOffGridMetadata, + UnsupportedNegativeAttachmentSize, +} + +#[derive(Clone, Copy, Debug, Eq, PartialEq)] +pub(crate) enum CloudCanonicalQuarantineReason { + MalformedRequiredIdentity, + FieldPresenceMismatch, + UnsupportedService, + UnsupportedChatStyle, + UnsupportedMessageType, + UnsupportedAssociationType, + MalformedParent, + AmbiguousReply, + MalformedAttributedBody, + MalformedMessageSummary, + ConflictingEditAndRetraction, + OversizedContent, + InvalidCanonicalPayload, + MalformedRecord, +} + +#[derive(Clone, Eq, PartialEq)] +pub(crate) enum CloudCanonicalConversionOutcome { + Ready(Box), + Deferred(CloudCanonicalDeferredReason), + Quarantined(CloudCanonicalQuarantineReason), +} + +impl Debug for CloudCanonicalConversionOutcome { + fn fmt(&self, formatter: &mut Formatter<'_>) -> fmt::Result { + match self { + Self::Ready(_) => { + formatter.write_str("CloudCanonicalConversionOutcome::Ready(redacted)") + } + Self::Deferred(reason) => formatter + .debug_tuple("CloudCanonicalConversionOutcome::Deferred") + .field(reason) + .finish(), + Self::Quarantined(reason) => formatter + .debug_tuple("CloudCanonicalConversionOutcome::Quarantined") + .field(reason) + .finish(), + } + } +} + +pub(crate) struct CloudCanonicalConversionContext<'a> { + hasher: &'a CloudSemanticIdentifierHasher, + scope_fingerprint: CloudCanonicalHash, + zone_fingerprint: CloudCanonicalHash, + generation: u64, + change_id: CloudCanonicalHash, + record_name: &'a str, + etag: Option<&'a str>, + server_created_at_millis: Option, + server_modified_at_millis: Option, + protected_raw_envelope_reference: &'a str, +} + +impl<'a> CloudCanonicalConversionContext<'a> { + #[allow(clippy::too_many_arguments)] + pub(crate) fn new( + hasher: &'a CloudSemanticIdentifierHasher, + scope_fingerprint: CloudCanonicalHash, + zone_fingerprint: CloudCanonicalHash, + generation: u64, + change_id: CloudCanonicalHash, + record_name: &'a str, + etag: Option<&'a str>, + server_created_at_millis: Option, + server_modified_at_millis: Option, + protected_raw_envelope_reference: &'a str, + ) -> Self { + Self { + hasher, + scope_fingerprint, + zone_fingerprint, + generation, + change_id, + record_name, + etag, + server_created_at_millis, + server_modified_at_millis, + protected_raw_envelope_reference, + } + } +} + +impl Debug for CloudCanonicalConversionContext<'_> { + fn fmt(&self, formatter: &mut Formatter<'_>) -> fmt::Result { + formatter.write_str("CloudCanonicalConversionContext(redacted)") + } +} + +fn require_present( + presence: &CloudRawRecordPresence, + fields: &[&str], +) -> Result<(), CloudCanonicalQuarantineReason> { + if fields + .iter() + .all(|field| presence.field(field) == CloudRawFieldPresence::PresentWithValue) + { + Ok(()) + } else { + Err(CloudCanonicalQuarantineReason::MalformedRequiredIdentity) + } +} + +fn top_optional_string( + presence: &CloudRawRecordPresence, + field: &str, + value: &Option, +) -> Result, CloudCanonicalQuarantineReason> { + match (presence.field(field), value) { + (CloudRawFieldPresence::Absent, None) => Ok(CloudCanonicalField::Absent), + (CloudRawFieldPresence::PresentWithValue, Some(value)) => { + Ok(CloudCanonicalField::Value(value.clone())) + } + (CloudRawFieldPresence::PresentWithValue, None) + if presence.is_top_level_explicit_clear(field) => + { + Ok(CloudCanonicalField::ExplicitClear) + } + (CloudRawFieldPresence::PresentWithValue, None) => { + Err(CloudCanonicalQuarantineReason::FieldPresenceMismatch) + } + (CloudRawFieldPresence::PresentWithoutValue, _) => { + Err(CloudCanonicalQuarantineReason::MalformedRecord) + } + _ => Err(CloudCanonicalQuarantineReason::FieldPresenceMismatch), + } +} + +fn top_default_string( + presence: &CloudRawRecordPresence, + field: &str, + value: &str, +) -> Result, CloudCanonicalQuarantineReason> { + match presence.field(field) { + CloudRawFieldPresence::Absent if value.is_empty() => Ok(CloudCanonicalField::Absent), + CloudRawFieldPresence::Absent => Err(CloudCanonicalQuarantineReason::FieldPresenceMismatch), + CloudRawFieldPresence::PresentWithoutValue => { + Err(CloudCanonicalQuarantineReason::MalformedRecord) + } + CloudRawFieldPresence::PresentWithValue + if value.is_empty() && presence.is_top_level_explicit_clear(field) => + { + Ok(CloudCanonicalField::ExplicitClear) + } + CloudRawFieldPresence::PresentWithValue if value.is_empty() => { + Err(CloudCanonicalQuarantineReason::FieldPresenceMismatch) + } + CloudRawFieldPresence::PresentWithValue => Ok(CloudCanonicalField::Value(value.to_owned())), + } +} + +fn nested_optional( + presence: &CloudRawRecordPresence, + outer: &str, + nested: &str, + typed_outer_present: bool, + value: &Option, +) -> Result, CloudCanonicalConversionOutcome> { + match presence.nested_field(outer, nested) { + CloudNestedPresence::OuterAbsent if !typed_outer_present && value.is_none() => { + Ok(CloudCanonicalField::Absent) + } + CloudNestedPresence::OuterAbsent => Err(CloudCanonicalConversionOutcome::Quarantined( + CloudCanonicalQuarantineReason::FieldPresenceMismatch, + )), + CloudNestedPresence::OuterWithoutValue => { + Err(CloudCanonicalConversionOutcome::Quarantined( + CloudCanonicalQuarantineReason::MalformedRecord, + )) + } + CloudNestedPresence::Unavailable => Err(CloudCanonicalConversionOutcome::Deferred( + CloudCanonicalDeferredReason::NestedPresenceUnavailable, + )), + CloudNestedPresence::Absent if value.is_none() => Ok(CloudCanonicalField::Absent), + CloudNestedPresence::Absent => Err(CloudCanonicalConversionOutcome::Quarantined( + CloudCanonicalQuarantineReason::FieldPresenceMismatch, + )), + CloudNestedPresence::Present => match value { + Some(value) => Ok(CloudCanonicalField::Value(value.clone())), + None if presence.is_nested_explicit_clear(outer, nested) => { + Ok(CloudCanonicalField::ExplicitClear) + } + None => Err(CloudCanonicalConversionOutcome::Quarantined( + CloudCanonicalQuarantineReason::FieldPresenceMismatch, + )), + }, + } +} + +fn bounded_stream_failure_outcome( + failure: BoundedStreamFailure, +) -> CloudCanonicalConversionOutcome { + CloudCanonicalConversionOutcome::Quarantined(match failure { + BoundedStreamFailure::Malformed => CloudCanonicalQuarantineReason::MalformedAttributedBody, + BoundedStreamFailure::Oversized => CloudCanonicalQuarantineReason::OversizedContent, + }) +} + +fn decode_attribute_dictionary( + decoder: &BoundedTypedStreamDecoder<'_>, + value: &BoundedStreamValue, +) -> Result { + let BoundedStreamValue::Object(Some(object)) = value else { + return Err(BoundedStreamFailure::Malformed); + }; + let fields = decoder.object_fields(*object, &["NSDictionary", "NSMutableDictionary"])?; + let count = match fields.first().and_then(|field| field.first()) { + Some(BoundedStreamValue::Int(value, _)) => { + usize::try_from(*value).map_err(|_| BoundedStreamFailure::Oversized)? + } + _ => return Err(BoundedStreamFailure::Malformed), + }; + if count > MAX_ATTRIBUTES_PER_RUN + || fields.len() + != count + .checked_mul(2) + .and_then(|value| value.checked_add(1)) + .ok_or(BoundedStreamFailure::Oversized)? + { + return Err(if count > MAX_ATTRIBUTES_PER_RUN { + BoundedStreamFailure::Oversized + } else { + BoundedStreamFailure::Malformed + }); + } + + let mut decoded = DecodedRunAttributes::default(); + for pair in fields[1..].chunks_exact(2) { + let key = pair + .first() + .and_then(|field| field.first()) + .ok_or(BoundedStreamFailure::Malformed) + .and_then(|value| decoder.string_object(value))?; + let value = pair + .get(1) + .and_then(|field| field.first()) + .ok_or(BoundedStreamFailure::Malformed)?; + match key.as_str() { + "__kIMMessagePartAttributeName" => { + decoded.message_part = Some(decoder.number_object(value)?); + } + "__kIMFileTransferGUIDAttributeName" => { + decoded.attachment_guid = Some(decoder.string_object(value)?); + } + "__kIMMentionConfirmedMention" => { + decoded.mention = Some(decoder.string_object(value)?); + } + "IMAudioTranscription" => { + decoded.audio_transcript = Some(decoder.string_object(value)?); + } + "__kIMTextEffectAttributeName" => { + decoded.text_effect = Some(i64::from(decoder.number_object(value)?)); + } + "__kIMTextBoldAttributeName" => { + decoded.bold = Some(decode_boolean_number(decoder, value)?); + } + "__kIMTextItalicAttributeName" => { + decoded.italic = Some(decode_boolean_number(decoder, value)?); + } + "__kIMTextStrikethroughAttributeName" => { + decoded.strikethrough = Some(decode_boolean_number(decoder, value)?); + } + "__kIMTextUnderlineAttributeName" => { + decoded.underline = Some(decode_boolean_number(decoder, value)?); + } + // Unknown attributed-string keys remain available through the + // protected raw envelope. Projecting known text and runs does not + // authorize logging or discarding that protected source. + _ => {} + } + } + Ok(decoded) +} + +fn decode_boolean_number( + decoder: &BoundedTypedStreamDecoder<'_>, + value: &BoundedStreamValue, +) -> Result { + match decoder.number_object(value)? { + 0 => Ok(false), + 1 => Ok(true), + _ => Err(BoundedStreamFailure::Malformed), + } +} + +fn attachment_reference_for_run( + context: &CloudCanonicalConversionContext<'_>, + message_guid: &str, + wire_guid: &str, +) -> Result { + let (canonical_guid, logical_identifier) = match parse_owned_attachment_guid(wire_guid) { + Ok(owned) => { + if owned.message_guid() != message_guid { + return Err(CloudCanonicalConversionOutcome::Quarantined( + CloudCanonicalQuarantineReason::MalformedParent, + )); + } + ( + owned.canonical_guid().to_owned(), + format!("{}\0{}", owned.message_guid(), owned.part()), + ) + } + Err(_) if wire_guid.starts_with("at_") => { + return Err(CloudCanonicalConversionOutcome::Quarantined( + CloudCanonicalQuarantineReason::MalformedParent, + )) + } + Err(_) => (wire_guid.to_owned(), wire_guid.to_owned()), + }; + let logical_key_hash = context + .hasher + .canonical_entity_key_hash(CloudCanonicalEntityKind::Attachment, &logical_identifier) + .map_err(validation_quarantine)?; + CloudCanonicalAttachmentReference::new(canonical_guid, logical_key_hash) + .map_err(validation_quarantine) +} + +fn decode_attributed_body_object( + context: &CloudCanonicalConversionContext<'_>, + message_guid: &str, + decoder: &BoundedTypedStreamDecoder<'_>, + object: usize, +) -> Result<(CloudCanonicalAttributedBody, u32), CloudCanonicalConversionOutcome> { + let fields = decoder + .object_fields(object, &["NSAttributedString", "NSMutableAttributedString"]) + .map_err(bounded_stream_failure_outcome)?; + let text = fields + .first() + .and_then(|field| field.first()) + .ok_or_else(|| bounded_stream_failure_outcome(BoundedStreamFailure::Malformed)) + .and_then(|value| { + decoder + .string_object(value) + .map_err(bounded_stream_failure_outcome) + })?; + let utf16_length = u32::try_from(text.encode_utf16().count()).map_err(|_| { + CloudCanonicalConversionOutcome::Quarantined( + CloudCanonicalQuarantineReason::OversizedContent, + ) + })?; + + let mut ranges = HashMap::::new(); + let mut runs = Vec::new(); + let mut field_index = 1usize; + let mut start_utf16 = 0u32; + while field_index < fields.len() { + if runs.len() >= MAX_RUNS_PER_BODY { + return Err(CloudCanonicalConversionOutcome::Quarantined( + CloudCanonicalQuarantineReason::OversizedContent, + )); + } + let range_field = fields + .get(field_index) + .ok_or_else(|| bounded_stream_failure_outcome(BoundedStreamFailure::Malformed))?; + let range_id = match range_field.first() { + Some(BoundedStreamValue::Int(value, _)) => *value, + _ => { + return Err(bounded_stream_failure_outcome( + BoundedStreamFailure::Malformed, + )) + } + }; + let length_utf16 = match range_field.get(1) { + Some(BoundedStreamValue::Int(value, _)) => *value, + _ => { + return Err(bounded_stream_failure_outcome( + BoundedStreamFailure::Malformed, + )) + } + }; + field_index += 1; + let attributes = if let Some(cached) = ranges.get(&range_id) { + cached.clone() + } else { + let dictionary = fields + .get(field_index) + .and_then(|field| field.first()) + .ok_or_else(|| bounded_stream_failure_outcome(BoundedStreamFailure::Malformed))?; + field_index += 1; + let decoded = decode_attribute_dictionary(decoder, dictionary) + .map_err(bounded_stream_failure_outcome)?; + ranges.insert(range_id, decoded.clone()); + decoded + }; + let attachment = match attributes.attachment_guid.as_deref() { + Some(guid) => Some(attachment_reference_for_run(context, message_guid, guid)?), + None => None, + }; + let run = CloudCanonicalTextRun::new( + start_utf16, + length_utf16, + attributes.message_part, + attachment, + attributes.mention, + attributes.audio_transcript, + attributes.text_effect, + attributes.bold, + attributes.italic, + attributes.strikethrough, + attributes.underline, + ) + .map_err(validation_quarantine)?; + start_utf16 = start_utf16.checked_add(length_utf16).ok_or({ + CloudCanonicalConversionOutcome::Quarantined( + CloudCanonicalQuarantineReason::MalformedAttributedBody, + ) + })?; + runs.push(run); + } + let body = CloudCanonicalAttributedBody::new(text, runs).map_err(validation_quarantine)?; + Ok((body, utf16_length)) +} + +fn decode_attributed_content( + context: &CloudCanonicalConversionContext<'_>, + message_guid: &str, + raw: Option<&[u8]>, +) -> Result { + let Some(raw) = raw else { + return Ok(DecodedAttributedContent { + field: CloudCanonicalField::Absent, + maximum_utf16_length: None, + }); + }; + if raw.is_empty() { + return Err(CloudCanonicalConversionOutcome::Quarantined( + CloudCanonicalQuarantineReason::MalformedAttributedBody, + )); + } + let (decoder, values) = BoundedTypedStreamDecoder::new(raw) + .and_then(BoundedTypedStreamDecoder::decode) + .map_err(bounded_stream_failure_outcome)?; + if values.len() > MAX_ATTRIBUTED_BODIES { + return Err(CloudCanonicalConversionOutcome::Quarantined( + CloudCanonicalQuarantineReason::OversizedContent, + )); + } + if values.is_empty() { + return Ok(DecodedAttributedContent { + field: CloudCanonicalField::ExplicitClear, + maximum_utf16_length: Some(0), + }); + } + let mut bodies = Vec::with_capacity(values.len()); + let mut maximum_utf16_length = 0u32; + for value in values { + let BoundedStreamValue::Object(Some(object)) = value else { + return Err(CloudCanonicalConversionOutcome::Quarantined( + CloudCanonicalQuarantineReason::MalformedAttributedBody, + )); + }; + let (body, utf16_length) = + decode_attributed_body_object(context, message_guid, &decoder, object)?; + maximum_utf16_length = maximum_utf16_length.max(utf16_length); + bodies.push(body); + } + Ok(DecodedAttributedContent { + field: CloudCanonicalField::Value(bodies), + maximum_utf16_length: Some(maximum_utf16_length), + }) +} + +fn parse_decimal_part(value: &str) -> Option { + if value.is_empty() + || !value.bytes().all(|byte| byte.is_ascii_digit()) + || (value.len() > 1 && value.starts_with('0')) + { + return None; + } + let part = value.parse::().ok()?; + (part.to_string() == value).then_some(part) +} + +fn validated_edit_timestamp(value: f64) -> Result { + if !value.is_finite() || value < 0.0 || value > MAX_CANONICAL_TIMESTAMP_MILLIS as f64 { + return Err(CloudCanonicalConversionOutcome::Quarantined( + CloudCanonicalQuarantineReason::MalformedMessageSummary, + )); + } + if value.fract() != 0.0 || value < APPLE_EPOCH_OFFSET_MILLIS as f64 { + return Err(CloudCanonicalConversionOutcome::Deferred( + CloudCanonicalDeferredReason::UnprovenEditTimestamp, + )); + } + Ok(value as i64) +} + +fn decode_message_summary( + context: &CloudCanonicalConversionContext<'_>, + message_guid: &str, + raw: Option<&[u8]>, + original_maximum_utf16_length: Option, +) -> Result { + let Some(raw) = raw else { + return Ok(DecodedMessageSummary { + edits: CloudCanonicalField::Absent, + retracted_parts: CloudCanonicalField::Absent, + edit_snapshots: Vec::new(), + }); + }; + if raw.is_empty() { + return Err(CloudCanonicalConversionOutcome::Quarantined( + CloudCanonicalQuarantineReason::MalformedMessageSummary, + )); + } + if raw.len() > MAX_MESSAGE_SUMMARY_BYTES { + return Err(CloudCanonicalConversionOutcome::Quarantined( + CloudCanonicalQuarantineReason::OversizedContent, + )); + } + let raw_value = PlistValue::from_reader(Cursor::new(raw)).map_err(|_| { + CloudCanonicalConversionOutcome::Quarantined( + CloudCanonicalQuarantineReason::MalformedMessageSummary, + ) + })?; + let raw_dictionary = + raw_value + .as_dictionary() + .ok_or(CloudCanonicalConversionOutcome::Quarantined( + CloudCanonicalQuarantineReason::MalformedMessageSummary, + ))?; + if raw_dictionary.len() > MAX_RAW_FIELDS { + return Err(CloudCanonicalConversionOutcome::Quarantined( + CloudCanonicalQuarantineReason::OversizedContent, + )); + } + let edit_state_present = ["ec", "ep", "otr"] + .iter() + .any(|key| raw_dictionary.contains_key(key)); + let retraction_state_present = raw_dictionary.contains_key("rp"); + let summary: MessageSummaryInfo = plist::from_bytes(raw).map_err(|_| { + CloudCanonicalConversionOutcome::Quarantined( + CloudCanonicalQuarantineReason::MalformedMessageSummary, + ) + })?; + // This projection owns only edit history, original edit ranges, and + // retractions. Other summary keys (including associated-message and + // extension metadata) and each edit's `bcg` remain losslessly reachable + // through the protected raw envelope reference for a later schema. + if summary.ec.len() > MAX_MESSAGE_EDITS + || summary.ep.len() > MAX_MESSAGE_EDITS + || summary.otr.len() > MAX_MESSAGE_EDITS + || summary.rp.len() > MAX_RETRACTED_PARTS + { + return Err(CloudCanonicalConversionOutcome::Quarantined( + CloudCanonicalQuarantineReason::OversizedContent, + )); + } + + let mut declared_edit_parts = summary.ep; + declared_edit_parts.sort_unstable(); + declared_edit_parts.dedup(); + let declared_edit_parts = declared_edit_parts.into_iter().collect::>(); + + let mut encoded_parts = Vec::with_capacity(summary.ec.len()); + for (wire_part, wire_edits) in summary.ec { + let part = + parse_decimal_part(&wire_part).ok_or(CloudCanonicalConversionOutcome::Quarantined( + CloudCanonicalQuarantineReason::MalformedMessageSummary, + ))?; + if wire_edits.is_empty() || wire_edits.len() > MAX_MESSAGE_EDITS { + return Err(CloudCanonicalConversionOutcome::Quarantined( + CloudCanonicalQuarantineReason::MalformedMessageSummary, + )); + } + encoded_parts.push((part, wire_edits)); + } + encoded_parts.sort_unstable_by_key(|(part, _)| *part); + if encoded_parts + .windows(2) + .any(|window| window[0].0 == window[1].0) + { + return Err(CloudCanonicalConversionOutcome::Quarantined( + CloudCanonicalQuarantineReason::MalformedMessageSummary, + )); + } + let encoded_part_set = encoded_parts + .iter() + .map(|(part, _)| *part) + .collect::>(); + if encoded_part_set != declared_edit_parts { + return Err(CloudCanonicalConversionOutcome::Quarantined( + CloudCanonicalQuarantineReason::MalformedMessageSummary, + )); + } + + let mut original_ranges = HashMap::with_capacity(summary.otr.len()); + for (wire_part, range) in summary.otr { + let part = + parse_decimal_part(&wire_part).ok_or(CloudCanonicalConversionOutcome::Quarantined( + CloudCanonicalQuarantineReason::MalformedMessageSummary, + ))?; + if !declared_edit_parts.contains(&part) + || range.lo.checked_add(range.le).is_none() + || original_maximum_utf16_length.is_some_and(|maximum| { + range + .lo + .checked_add(range.le) + .is_none_or(|end| end > maximum) + }) + || original_ranges.insert(part, (range.lo, range.le)).is_some() + { + return Err(CloudCanonicalConversionOutcome::Quarantined( + CloudCanonicalQuarantineReason::MalformedMessageSummary, + )); + } + } + + let mut retracted_parts = summary.rp; + retracted_parts.sort_unstable(); + retracted_parts.dedup(); + if retracted_parts + .iter() + .any(|part| declared_edit_parts.contains(part)) + { + return Err(CloudCanonicalConversionOutcome::Quarantined( + CloudCanonicalQuarantineReason::ConflictingEditAndRetraction, + )); + } + + struct PreparedEdit { + bodies: Vec, + modified_at_millis: i64, + content_digest: CloudCanonicalDigest, + } + + let mut canonical_edits = Vec::new(); + let mut edit_snapshots = Vec::new(); + for (part, wire_edits) in encoded_parts { + let part_key_hash = context + .hasher + .canonical_entity_key_hash( + CloudCanonicalEntityKind::Message, + &format!("{message_guid}\0{part}"), + ) + .map_err(validation_quarantine)?; + let mut prepared = Vec::with_capacity(wire_edits.len()); + for wire_edit in wire_edits { + let modified_at_millis = validated_edit_timestamp(wire_edit.d)?; + let content_digest = sha256_digest(&[&wire_edit.t]).map_err(validation_quarantine)?; + let decoded = + decode_attributed_content(context, message_guid, Some(wire_edit.t.as_slice()))?; + let bodies = match decoded.field { + CloudCanonicalField::Value(bodies) if !bodies.is_empty() => bodies, + CloudCanonicalField::Absent + | CloudCanonicalField::ExplicitClear + | CloudCanonicalField::Value(_) => { + return Err(CloudCanonicalConversionOutcome::Quarantined( + CloudCanonicalQuarantineReason::MalformedMessageSummary, + )) + } + }; + prepared.push(PreparedEdit { + bodies, + modified_at_millis, + content_digest, + }); + } + prepared.sort_by(|left, right| { + left.modified_at_millis + .cmp(&right.modified_at_millis) + .then_with(|| { + left.content_digest + .value() + .cmp(right.content_digest.value()) + }) + }); + prepared.dedup_by(|left, right| { + left.modified_at_millis == right.modified_at_millis + && left.content_digest == right.content_digest + }); + for (revision_index, edit) in prepared.into_iter().enumerate() { + let revision = u32::try_from(revision_index).map_err(|_| { + CloudCanonicalConversionOutcome::Quarantined( + CloudCanonicalQuarantineReason::OversizedContent, + ) + })?; + edit_snapshots.push(CloudCanonicalEditPartSnapshot::new( + part_key_hash.clone(), + revision, + edit.content_digest.clone(), + edit.modified_at_millis, + )); + canonical_edits.push( + CloudCanonicalMessageEdit::new( + part, + revision, + edit.bodies, + edit.modified_at_millis, + original_ranges.get(&part).copied(), + ) + .map_err(validation_quarantine)?, + ); + } + } + if canonical_edits.len() > MAX_MESSAGE_EDITS || edit_snapshots.len() > MAX_MESSAGE_EDITS { + return Err(CloudCanonicalConversionOutcome::Quarantined( + CloudCanonicalQuarantineReason::OversizedContent, + )); + } + + // A present-but-empty edit collection is not a clear instruction. Apple's + // summary plist omits empty collections rather than sending them, so this + // shape carries no meaning we can act on, and treating it as "clear every + // edit" would wipe local edit history on a guess. + // + // This also brings the summary path in line with the record-level rule in + // this same file, where a clear requires an authoritative marker from a + // pre-typed decoder and raw presence alone is deliberately insufficient. + let edits = if edit_state_present { + if canonical_edits.is_empty() { + CloudCanonicalField::Absent + } else { + CloudCanonicalField::Value(canonical_edits) + } + } else if canonical_edits.is_empty() { + CloudCanonicalField::Absent + } else { + return Err(CloudCanonicalConversionOutcome::Quarantined( + CloudCanonicalQuarantineReason::MalformedMessageSummary, + )); + }; + // Same reasoning as the edit collection above: an empty retraction list is + // not an instruction to un-retract every part. + let retracted_parts = if retraction_state_present { + if retracted_parts.is_empty() { + CloudCanonicalField::Absent + } else { + CloudCanonicalField::Value(retracted_parts) + } + } else if retracted_parts.is_empty() { + CloudCanonicalField::Absent + } else { + return Err(CloudCanonicalConversionOutcome::Quarantined( + CloudCanonicalQuarantineReason::MalformedMessageSummary, + )); + }; + Ok(DecodedMessageSummary { + edits, + retracted_parts, + edit_snapshots, + }) +} + +fn sha256_digest(parts: &[&[u8]]) -> Result { + let mut hasher = Sha256::new(); + for part in parts { + hasher.update((part.len() as u64).to_be_bytes()); + hasher.update(part); + } + let hex = hasher + .finalize() + .iter() + .map(|byte| format!("{byte:02x}")) + .collect::(); + CloudCanonicalDigest::new(hex) +} + +fn etag_hash( + hasher: &CloudSemanticIdentifierHasher, + etag: Option<&str>, +) -> Result, CloudCanonicalValidationFailure> { + etag.map(|value| hasher.canonical_etag_hash(value)) + .transpose() +} + +fn protected_reference( + context: &CloudCanonicalConversionContext<'_>, +) -> Result { + CloudCanonicalProtectedReference::new(context.protected_raw_envelope_reference) + .map_err(|_| CloudCanonicalQuarantineReason::MalformedRecord) +} + +fn validation_quarantine(_: CloudCanonicalValidationFailure) -> CloudCanonicalConversionOutcome { + CloudCanonicalConversionOutcome::Quarantined( + CloudCanonicalQuarantineReason::InvalidCanonicalPayload, + ) +} + +#[allow(clippy::too_many_arguments)] +fn build_upsert( + context: &CloudCanonicalConversionContext<'_>, + entity_kind: CloudCanonicalEntityKind, + logical_entity_key_hash: CloudCanonicalHash, + parent_logical_key_hash: Option, + aliases: Vec, + payload: CloudCanonicalPayload, + immutable_content_digest: Option, + created_at_millis: Option, + read_at_millis: Option, + delivered_at_millis: Option, + edit_parts: Vec, + group_version: Option, +) -> CloudCanonicalConversionOutcome { + let protected = match protected_reference(context) { + Ok(value) => value, + Err(reason) => return CloudCanonicalConversionOutcome::Quarantined(reason), + }; + let server_record_id_hash = match context + .hasher + .canonical_server_record_id_hash(context.record_name) + { + Ok(value) => value, + Err(error) => return validation_quarantine(error), + }; + let etag_hash = match etag_hash(context.hasher, context.etag) { + Ok(value) => value, + Err(error) => return validation_quarantine(error), + }; + let envelope = match CloudCanonicalEnvelope::new( + context.scope_fingerprint.clone(), + context.zone_fingerprint.clone(), + context.generation, + CLOUD_CANONICAL_SCHEMA_VERSION, + context.change_id.clone(), + entity_kind, + CloudCanonicalMutationKind::Upsert, + server_record_id_hash, + logical_entity_key_hash.clone(), + parent_logical_key_hash.clone(), + aliases, + etag_hash.clone(), + context.server_created_at_millis, + context.server_modified_at_millis, + protected.clone(), + ) { + Ok(value) => value, + Err(error) => return validation_quarantine(error), + }; + let snapshot = match CloudCanonicalSnapshot::new( + entity_kind, + logical_entity_key_hash, + parent_logical_key_hash, + immutable_content_digest, + created_at_millis, + read_at_millis, + delivered_at_millis, + edit_parts, + None, + group_version, + None, + etag_hash, + protected, + ) { + Ok(value) => value, + Err(error) => return validation_quarantine(error), + }; + CloudCanonicalMutation::new(envelope, Some(snapshot), Some(payload), None) + .map(Box::new) + .map(CloudCanonicalConversionOutcome::Ready) + .unwrap_or_else(validation_quarantine) +} + +pub(crate) fn convert_chat( + context: &CloudCanonicalConversionContext<'_>, + presence: &CloudRawRecordPresence, + chat: &CloudChat, +) -> CloudCanonicalConversionOutcome { + if let Err(reason) = require_present( + presence, + &["guid", "cid", "gid", "ogid", "svc", "stl", "ptcpts"], + ) { + return CloudCanonicalConversionOutcome::Quarantined(reason); + } + if chat.service_name != "iMessage" { + return CloudCanonicalConversionOutcome::Quarantined( + CloudCanonicalQuarantineReason::UnsupportedService, + ); + } + let style = match chat.style { + 45 => CloudCanonicalChatStyle::Direct, + 43 => CloudCanonicalChatStyle::Group, + _ => { + return CloudCanonicalConversionOutcome::Quarantined( + CloudCanonicalQuarantineReason::UnsupportedChatStyle, + ) + } + }; + if [ + &chat.guid, + &chat.chat_identifier, + &chat.group_id, + &chat.original_group_id, + ] + .iter() + .any(|value| value.is_empty()) + { + return CloudCanonicalConversionOutcome::Quarantined( + CloudCanonicalQuarantineReason::MalformedRequiredIdentity, + ); + } + match (presence.field("gp"), chat.group_photo.is_some()) { + (CloudRawFieldPresence::Absent, false) => {} + (CloudRawFieldPresence::PresentWithValue, true) + if style == CloudCanonicalChatStyle::Group + && chat + .group_photo_guid + .as_deref() + .is_some_and(|guid| !guid.is_empty()) => + { + // The asset remains N0 behind the protected envelope reference. + // Only its independently supplied stable GUID is projected. + } + (CloudRawFieldPresence::PresentWithValue, true) => { + return CloudCanonicalConversionOutcome::Deferred( + CloudCanonicalDeferredReason::UnsupportedGroupPhoto, + ) + } + (CloudRawFieldPresence::PresentWithValue, false) + if presence.is_top_level_explicit_clear("gp") => {} + (CloudRawFieldPresence::PresentWithoutValue, _) => { + return CloudCanonicalConversionOutcome::Quarantined( + CloudCanonicalQuarantineReason::MalformedRecord, + ) + } + _ => { + return CloudCanonicalConversionOutcome::Quarantined( + CloudCanonicalQuarantineReason::FieldPresenceMismatch, + ) + } + } + + let display_name = match top_optional_string(presence, "name", &chat.display_name) { + Ok(value) => value, + Err(reason) => return CloudCanonicalConversionOutcome::Quarantined(reason), + }; + let last_addressed_handle = + match top_default_string(presence, "lah", &chat.last_addressed_handle) { + Ok(value) => value, + Err(reason) => return CloudCanonicalConversionOutcome::Quarantined(reason), + }; + let typed_properties_present = chat.properties.is_some(); + let properties = chat.properties.as_ref(); + let group_version = match nested_optional( + presence, + "prop", + "pv", + typed_properties_present, + &properties.and_then(|value| value.pv), + ) { + Ok(value) => value, + Err(outcome) => return outcome, + }; + let last_seen_message_guid = match nested_optional( + presence, + "prop", + "lastSeenMessageGuid", + typed_properties_present, + &properties.and_then(|value| value.last_seen_message_guid.clone()), + ) { + Ok(value) => value, + Err(outcome) => return outcome, + }; + let group_photo_guid = match top_optional_string(presence, "gpid", &chat.group_photo_guid) { + Ok(value) => value, + Err(reason) => return CloudCanonicalConversionOutcome::Quarantined(reason), + }; + if style == CloudCanonicalChatStyle::Direct + && !matches!(group_photo_guid, CloudCanonicalField::Absent) + { + return CloudCanonicalConversionOutcome::Quarantined( + CloudCanonicalQuarantineReason::MalformedRecord, + ); + } + + let logical_hash = match context + .hasher + .canonical_entity_key_hash(CloudCanonicalEntityKind::Chat, &chat.guid) + { + Ok(value) => value, + Err(error) => return validation_quarantine(error), + }; + let mut aliases = Vec::new(); + for (kind, value) in [ + (CloudCanonicalAliasKind::ChatGroupId, chat.group_id.as_str()), + ( + CloudCanonicalAliasKind::ChatOriginalGroupId, + chat.original_group_id.as_str(), + ), + ( + CloudCanonicalAliasKind::ChatServiceIdentifier, + chat.chat_identifier.as_str(), + ), + ] { + let hash = match context.hasher.canonical_alias_key_hash(kind, value) { + Ok(value) => value, + Err(error) => return validation_quarantine(error), + }; + aliases.push(CloudCanonicalAlias::new(kind, hash)); + } + if let Some(properties) = properties { + for legacy in &properties.legacy_group_identifiers { + if legacy.is_empty() { + return CloudCanonicalConversionOutcome::Quarantined( + CloudCanonicalQuarantineReason::MalformedRequiredIdentity, + ); + } + let hash = match context.hasher.canonical_alias_key_hash( + CloudCanonicalAliasKind::ChatLegacyGroupIdentifier, + legacy, + ) { + Ok(value) => value, + Err(error) => return validation_quarantine(error), + }; + aliases.push(CloudCanonicalAlias::new( + CloudCanonicalAliasKind::ChatLegacyGroupIdentifier, + hash, + )); + } + } + + let group_version_snapshot = match &group_version { + CloudCanonicalField::Value(value) => Some(*value), + CloudCanonicalField::Absent | CloudCanonicalField::ExplicitClear => None, + }; + let payload = match CloudCanonicalChatPayload::new( + chat.guid.clone(), + chat.chat_identifier.clone(), + chat.group_id.clone(), + chat.original_group_id.clone(), + CloudCanonicalService::IMessage, + style, + chat.participants + .iter() + .map(|participant| participant.uri.clone()) + .collect(), + display_name, + last_addressed_handle, + group_version, + last_seen_message_guid, + group_photo_guid, + ) { + Ok(value) => value, + Err(error) => return validation_quarantine(error), + }; + build_upsert( + context, + CloudCanonicalEntityKind::Chat, + logical_hash, + None, + aliases, + CloudCanonicalPayload::Chat(Box::new(payload)), + None, + None, + None, + None, + vec![], + group_version_snapshot, + ) +} + +fn apple_nanos_to_unix_millis(value: u64) -> Option { + let millis = i64::try_from(value / 1_000_000).ok()?; + APPLE_EPOCH_OFFSET_MILLIS.checked_add(millis) +} + +fn proto_string(value: &Option) -> CloudCanonicalField { + value + .clone() + .map(CloudCanonicalField::Value) + .unwrap_or(CloudCanonicalField::Absent) +} + +fn proto_timestamp( + value: Option, +) -> Result, CloudCanonicalQuarantineReason> { + match value { + None => Ok(CloudCanonicalField::Absent), + Some(0) => Ok(CloudCanonicalField::ExplicitClear), + Some(value) => apple_nanos_to_unix_millis(value) + .map(CloudCanonicalField::Value) + .ok_or(CloudCanonicalQuarantineReason::MalformedRecord), + } +} + +fn reaction_kind(index: u32) -> Option { + match index { + 0 => Some(CloudCanonicalReactionKind::Heart), + 1 => Some(CloudCanonicalReactionKind::Like), + 2 => Some(CloudCanonicalReactionKind::Dislike), + 3 => Some(CloudCanonicalReactionKind::Laugh), + 4 => Some(CloudCanonicalReactionKind::Emphasize), + 5 => Some(CloudCanonicalReactionKind::Question), + 6 => Some(CloudCanonicalReactionKind::Emoji), + 7 => Some(CloudCanonicalReactionKind::StickerBack), + _ => None, + } +} + +fn build_association( + context: &CloudCanonicalConversionContext<'_>, + message_type: i64, + proto: &MessageProto, +) -> Result< + ( + CloudCanonicalMessageAssociation, + CloudCanonicalEntityKind, + Option, + ), + CloudCanonicalConversionOutcome, +> { + let Some(associated_type) = proto.associated_message_type else { + if message_type != 1 { + return Err(CloudCanonicalConversionOutcome::Quarantined( + CloudCanonicalQuarantineReason::UnsupportedMessageType, + )); + } + if proto.associated_message_guid.is_some() + || proto.associated_message_range_location.is_some() + || proto.associated_message_range_length.is_some() + { + return Err(CloudCanonicalConversionOutcome::Quarantined( + CloudCanonicalQuarantineReason::MalformedParent, + )); + } + return Ok(( + CloudCanonicalMessageAssociation::None, + CloudCanonicalEntityKind::Message, + None, + )); + }; + if message_type != 2 { + return Err(CloudCanonicalConversionOutcome::Quarantined( + CloudCanonicalQuarantineReason::UnsupportedMessageType, + )); + } + if associated_type == 2 { + return Err(CloudCanonicalConversionOutcome::Deferred( + CloudCanonicalDeferredReason::UnsupportedSticker, + )); + } + + let (remove, index) = match associated_type { + 2000..=2007 => (false, associated_type - 2000), + 3000..=3007 => (true, associated_type - 3000), + _ => { + return Err(CloudCanonicalConversionOutcome::Quarantined( + CloudCanonicalQuarantineReason::UnsupportedAssociationType, + )) + } + }; + let kind = reaction_kind(index).ok_or(CloudCanonicalConversionOutcome::Quarantined( + CloudCanonicalQuarantineReason::UnsupportedAssociationType, + ))?; + if kind == CloudCanonicalReactionKind::StickerBack { + return Err(CloudCanonicalConversionOutcome::Deferred( + CloudCanonicalDeferredReason::UnsupportedSticker, + )); + } + let parent_wire = proto.associated_message_guid.as_deref().ok_or( + CloudCanonicalConversionOutcome::Quarantined( + CloudCanonicalQuarantineReason::MalformedParent, + ), + )?; + let parsed = parse_associated_parent(parent_wire).map_err(|_| { + CloudCanonicalConversionOutcome::Quarantined( + CloudCanonicalQuarantineReason::MalformedParent, + ) + })?; + let parent_hash = context + .hasher + .canonical_entity_key_hash(CloudCanonicalEntityKind::Message, parsed.parent_guid()) + .map_err(validation_quarantine)?; + let parent = CloudCanonicalParentReference::new( + parsed.parent_guid().to_owned(), + parsed.parent_part(), + parent_hash.clone(), + proto.associated_message_range_location, + proto.associated_message_range_length, + ) + .map_err(validation_quarantine)?; + let association = if remove { + CloudCanonicalMessageAssociation::ReactionRemove { kind, parent } + } else { + CloudCanonicalMessageAssociation::ReactionAdd { kind, parent } + }; + Ok(( + association, + CloudCanonicalEntityKind::Reaction, + Some(parent_hash), + )) +} + +fn build_reply( + context: &CloudCanonicalConversionContext<'_>, + proto_2: Option<&MessageProto2>, +) -> Result, CloudCanonicalConversionOutcome> { + let Some(reply) = proto_2.and_then(|value| value.reply.as_deref()) else { + return Ok(None); + }; + let parsed = parse_reply_parent(reply).map_err(|error| { + CloudCanonicalConversionOutcome::Quarantined(match error { + CloudCanonicalValidationFailure::AmbiguousReplyParent => { + CloudCanonicalQuarantineReason::AmbiguousReply + } + _ => CloudCanonicalQuarantineReason::MalformedParent, + }) + })?; + let parent_hash = context + .hasher + .canonical_entity_key_hash(CloudCanonicalEntityKind::Message, parsed.parent_guid()) + .map_err(validation_quarantine)?; + CloudCanonicalReplyReference::new( + parsed.parent_guid().to_owned(), + parsed.parent_part().to_owned(), + parent_hash, + ) + .map(Some) + .map_err(validation_quarantine) +} + +fn reject_unsupported_message_content( + proto: &MessageProto, + proto_4: Option<&MessageProto4>, +) -> Option { + if proto.payload_data.is_some() { + return Some(CloudCanonicalConversionOutcome::Deferred( + CloudCanonicalDeferredReason::UnsupportedExtensionPayload, + )); + } + if let Some(proto_4) = proto_4 { + if proto_4.schedule_type.unwrap_or_default() != 0 + || proto_4.schedule_state.unwrap_or_default() != 0 + { + return Some(CloudCanonicalConversionOutcome::Deferred( + CloudCanonicalDeferredReason::UnsupportedScheduling, + )); + } + if proto_4.sent_or_received_off_grid.unwrap_or_default() != 0 { + return Some(CloudCanonicalConversionOutcome::Deferred( + CloudCanonicalDeferredReason::UnsupportedOffGridMetadata, + )); + } + if proto_4 + .service + .as_deref() + .is_some_and(|service| service != "iMessage") + { + return Some(CloudCanonicalConversionOutcome::Quarantined( + CloudCanonicalQuarantineReason::UnsupportedService, + )); + } + } + None +} + +pub(crate) fn convert_message( + context: &CloudCanonicalConversionContext<'_>, + presence: &CloudRawRecordPresence, + message: &CloudMessage, +) -> CloudCanonicalConversionOutcome { + if let Err(reason) = require_present( + presence, + &[ + "msgType", "eCode", "chatID", "sender", "time", "msgProto", "flags", "guid", "svc", + ], + ) { + return CloudCanonicalConversionOutcome::Quarantined(reason); + } + if message.service != "iMessage" { + return CloudCanonicalConversionOutcome::Quarantined( + CloudCanonicalQuarantineReason::UnsupportedService, + ); + } + if message.guid.is_empty() || message.chat_id.is_empty() { + return CloudCanonicalConversionOutcome::Quarantined( + CloudCanonicalQuarantineReason::MalformedRequiredIdentity, + ); + } + let proto = &message.msg_proto.0; + let proto_2 = message.msg_proto_2.as_ref().map(|value| &value.0); + let proto_4 = message.msg_proto_4.as_ref().map(|value| &value.0); + if let Some(outcome) = reject_unsupported_message_content(proto, proto_4) { + return outcome; + } + let (association, entity_kind, association_parent_hash) = + match build_association(context, message.r#type, proto) { + Ok(value) => value, + Err(outcome) => return outcome, + }; + let reply = match build_reply(context, proto_2) { + Ok(value) => value, + Err(outcome) => return outcome, + }; + if association.is_reaction() && reply.is_some() { + return CloudCanonicalConversionOutcome::Quarantined( + CloudCanonicalQuarantineReason::AmbiguousReply, + ); + } + let parent_hash = + association_parent_hash.or_else(|| reply.as_ref().map(|value| value.parent_hash().clone())); + + let created_at_millis = match u64::try_from(message.time) + .ok() + .and_then(apple_nanos_to_unix_millis) + { + Some(value) => value, + None => { + return CloudCanonicalConversionOutcome::Quarantined( + CloudCanonicalQuarantineReason::MalformedRecord, + ) + } + }; + let read_at_millis = match proto_timestamp(proto.date_read) { + Ok(value) => value, + Err(reason) => return CloudCanonicalConversionOutcome::Quarantined(reason), + }; + let delivered_at_millis = match proto_timestamp(proto.date_delivered) { + Ok(value) => value, + Err(reason) => return CloudCanonicalConversionOutcome::Quarantined(reason), + }; + let read_snapshot = match &read_at_millis { + CloudCanonicalField::Value(value) => Some(*value), + CloudCanonicalField::Absent | CloudCanonicalField::ExplicitClear => None, + }; + let delivered_snapshot = match &delivered_at_millis { + CloudCanonicalField::Value(value) => Some(*value), + CloudCanonicalField::Absent | CloudCanonicalField::ExplicitClear => None, + }; + let associated_emoji = proto_4 + .and_then(|value| value.associated_message_emoji.clone()) + .map(CloudCanonicalField::Value) + .unwrap_or(CloudCanonicalField::Absent); + let flags = CloudCanonicalKnownMessageFlags { + from_me: message.flags.contains(MessageFlags::IS_FROM_ME), + delivered: message.flags.contains(MessageFlags::IS_DELIVERED), + read: message.flags.contains(MessageFlags::IS_READ), + has_data_detector_results: message.flags.contains(MessageFlags::HAS_DD_RESULTS), + delivered_quietly: message.flags.contains(MessageFlags::WAS_DELIVERED_QUIETLY), + did_notify_recipient: message.flags.contains(MessageFlags::DID_NOTIFY_RECIPIENT), + }; + let chat_alias_hash = match context.hasher.canonical_alias_key_hash( + CloudCanonicalAliasKind::ChatServiceIdentifier, + &message.chat_id, + ) { + Ok(value) => value, + Err(error) => return validation_quarantine(error), + }; + let logical_hash_result = match association.reaction() { + Some((_, parent, _)) => context.hasher.canonical_reaction_key_hash( + &message.guid, + parent.parent_guid(), + parent.parent_part(), + ), + None => context + .hasher + .canonical_entity_key_hash(entity_kind, &message.guid), + }; + let logical_hash = match logical_hash_result { + Ok(value) => value, + Err(error) => return validation_quarantine(error), + }; + let subject = proto_string(&proto.subject); + let text = proto_string(&proto.text); + let attributed_content = + match decode_attributed_content(context, &message.guid, proto.attributed_body.as_deref()) { + Ok(value) => value, + Err(outcome) => return outcome, + }; + let original_maximum_utf16_length = attributed_content.maximum_utf16_length.or_else(|| { + proto + .text + .as_ref() + .and_then(|value| u32::try_from(value.encode_utf16().count()).ok()) + }); + let message_summary = match decode_message_summary( + context, + &message.guid, + proto.message_summary_info.as_deref(), + original_maximum_utf16_length, + ) { + Ok(value) => value, + Err(outcome) => return outcome, + }; + let immutable_digest = match sha256_digest(&[ + message.guid.as_bytes(), + message.chat_id.as_bytes(), + message.sender.as_bytes(), + proto.subject.as_deref().unwrap_or_default().as_bytes(), + proto.text.as_deref().unwrap_or_default().as_bytes(), + proto.attributed_body.as_deref().unwrap_or_default(), + &message.r#type.to_be_bytes(), + ]) { + Ok(value) => value, + Err(error) => return validation_quarantine(error), + }; + let payload = match CloudCanonicalMessagePayload::new( + message.guid.clone(), + message.chat_id.clone(), + chat_alias_hash, + message.sender.clone(), + created_at_millis, + message.error, + CloudCanonicalService::IMessage, + subject, + text, + attributed_content.field, + proto_string(&proto.balloon_bundle_id), + CloudCanonicalField::Absent, + proto_string(&proto.effect), + read_at_millis, + delivered_at_millis, + flags, + association, + reply, + message_summary.edits, + message_summary.retracted_parts, + associated_emoji, + ) { + Ok(value) => value, + Err(error) => return validation_quarantine(error), + }; + build_upsert( + context, + entity_kind, + logical_hash, + parent_hash, + vec![], + CloudCanonicalPayload::Message(Box::new(payload)), + Some(immutable_digest), + Some(created_at_millis), + read_snapshot, + delivered_snapshot, + message_summary.edit_snapshots, + None, + ) +} + +fn nested_attachment_string( + presence: &CloudRawRecordPresence, + field: &str, + value: &Option, +) -> Result, CloudCanonicalConversionOutcome> { + nested_optional(presence, "cm", field, true, value) +} + +pub(crate) fn convert_attachment( + context: &CloudCanonicalConversionContext<'_>, + presence: &CloudRawRecordPresence, + attachment: &AttachmentMeta, +) -> CloudCanonicalConversionOutcome { + if let Err(reason) = require_present(presence, &["cm", "lqa"]) { + return CloudCanonicalConversionOutcome::Quarantined(reason); + } + for field in ["aguid", "tb", "ig"] { + match presence.nested_field("cm", field) { + CloudNestedPresence::Present => {} + CloudNestedPresence::Unavailable => { + return CloudCanonicalConversionOutcome::Deferred( + CloudCanonicalDeferredReason::NestedPresenceUnavailable, + ) + } + _ => { + return CloudCanonicalConversionOutcome::Quarantined( + CloudCanonicalQuarantineReason::MalformedRequiredIdentity, + ) + } + } + } + if attachment.guid.is_empty() { + return CloudCanonicalConversionOutcome::Quarantined( + CloudCanonicalQuarantineReason::MalformedRequiredIdentity, + ); + } + if attachment.user_info.is_some() { + return CloudCanonicalConversionOutcome::Deferred( + CloudCanonicalDeferredReason::UnsupportedMediaCredentials, + ); + } + if attachment.is_sticker { + return CloudCanonicalConversionOutcome::Deferred( + CloudCanonicalDeferredReason::UnsupportedSticker, + ); + } + let (canonical_guid, logical_hash, owner_guid, owner_hash, owner_part) = + match parse_owned_attachment_guid(&attachment.guid) { + Ok(owned) => { + let owner_hash = match context.hasher.canonical_entity_key_hash( + CloudCanonicalEntityKind::Message, + owned.message_guid(), + ) { + Ok(value) => value, + Err(error) => return validation_quarantine(error), + }; + let logical_hash = match context + .hasher + .canonical_owned_attachment_key_hash(owned.message_guid(), owned.part()) + { + Ok(value) => value, + Err(error) => return validation_quarantine(error), + }; + ( + owned.canonical_guid().to_owned(), + logical_hash, + Some(owned.message_guid().to_owned()), + Some(owner_hash), + Some(owned.part()), + ) + } + Err(_) if attachment.guid.starts_with("at_") => { + return CloudCanonicalConversionOutcome::Quarantined( + CloudCanonicalQuarantineReason::MalformedParent, + ) + } + Err(_) => { + let logical_hash = match context.hasher.canonical_entity_key_hash( + CloudCanonicalEntityKind::Attachment, + &attachment.guid, + ) { + Ok(value) => value, + Err(error) => return validation_quarantine(error), + }; + (attachment.guid.clone(), logical_hash, None, None, None) + } + }; + let uti = match nested_attachment_string(presence, "t", &attachment.uti) { + Ok(value) => value, + Err(outcome) => return outcome, + }; + let mime_type = match nested_attachment_string(presence, "mimet", &attachment.mime_type) { + Ok(value) => value, + Err(outcome) => return outcome, + }; + let transfer_name = match nested_attachment_string(presence, "tn", &attachment.transfer_name) { + Ok(value) => value, + Err(outcome) => return outcome, + }; + let total_bytes = if attachment.total_bytes < 0 { + return CloudCanonicalConversionOutcome::Deferred( + CloudCanonicalDeferredReason::UnsupportedNegativeAttachmentSize, + ); + } else { + CloudCanonicalField::Value(attachment.total_bytes as u64) + }; + let payload = match CloudCanonicalAttachmentPayload::new( + canonical_guid, + owner_guid, + owner_hash.clone(), + owner_part, + uti, + mime_type, + transfer_name, + total_bytes, + CloudCanonicalField::Value(attachment.is_outgoing), + CloudCanonicalField::Absent, + ) { + Ok(value) => value, + Err(error) => return validation_quarantine(error), + }; + build_upsert( + context, + CloudCanonicalEntityKind::Attachment, + logical_hash, + owner_hash, + vec![], + CloudCanonicalPayload::Attachment(Box::new(payload)), + None, + Some(attachment.created_date), + None, + None, + vec![], + None, + ) +} + +pub(crate) fn convert_tombstone( + context: &CloudCanonicalConversionContext<'_>, + entity_kind: CloudCanonicalEntityKind, + mapped_logical_entity_key_hash: CloudCanonicalHash, +) -> CloudCanonicalConversionOutcome { + let protected = match protected_reference(context) { + Ok(value) => value, + Err(reason) => return CloudCanonicalConversionOutcome::Quarantined(reason), + }; + let server_record_id_hash = match context + .hasher + .canonical_server_record_id_hash(context.record_name) + { + Ok(value) => value, + Err(error) => return validation_quarantine(error), + }; + let envelope = match CloudCanonicalEnvelope::new( + context.scope_fingerprint.clone(), + context.zone_fingerprint.clone(), + context.generation, + CLOUD_CANONICAL_SCHEMA_VERSION, + context.change_id.clone(), + entity_kind, + CloudCanonicalMutationKind::Tombstone, + server_record_id_hash.clone(), + mapped_logical_entity_key_hash.clone(), + None, + vec![], + match etag_hash(context.hasher, context.etag) { + Ok(value) => value, + Err(error) => return validation_quarantine(error), + }, + context.server_created_at_millis, + context.server_modified_at_millis, + protected.clone(), + ) { + Ok(value) => value, + Err(error) => return validation_quarantine(error), + }; + let tombstone = match CloudCanonicalTombstone::new( + entity_kind, + server_record_id_hash, + mapped_logical_entity_key_hash, + protected, + context.server_modified_at_millis, + true, + ) { + Ok(value) => value, + Err(error) => return validation_quarantine(error), + }; + CloudCanonicalMutation::new(envelope, None, None, Some(tombstone)) + .map(Box::new) + .map(CloudCanonicalConversionOutcome::Ready) + .unwrap_or_else(validation_quarantine) +} + +#[cfg(test)] +mod tests { + use super::*; + use prost::Message as _; + use rustpush::{ + cloud_messages::{ + CloudParticipant, CloudProp, GZipWrapper, MessageEdit as WireMessageEdit, + MessageEditRange, + }, + cloudkit_proto::{ + record::{field, Field}, + Asset, Record, + }, + coder_encode_flattened, NSAttributedString, NSDictionaryTypedCoder, NSNumber, NSString, + StCollapsedValue, + }; + + const SECRET: &str = "private-body-secret-should-never-be-logged"; + + fn hash(character: char) -> CloudCanonicalHash { + CloudCanonicalHash::new(character.to_string().repeat(43)).expect("fixture hash") + } + + fn context<'a>( + hasher: &'a CloudSemanticIdentifierHasher, + record_name: &'a str, + modified_at: Option, + ) -> CloudCanonicalConversionContext<'a> { + CloudCanonicalConversionContext::new( + hasher, + hash('a'), + hash('b'), + 7, + hash('c'), + record_name, + Some("private-etag"), + Some(1_720_000_000_000), + modified_at, + "obcs2.fixture.protected", + ) + } + + fn raw_presence(fields: &[&str]) -> CloudRawRecordPresence { + let record = Record { + record_field: fields + .iter() + .map(|name| Field { + identifier: Some(field::Identifier { + name: Some((*name).to_owned()), + }), + value: Some(field::Value::default()), + }) + .collect(), + ..Default::default() + }; + CloudRawRecordPresence::extract(&record).expect("fixture presence") + } + + fn capture_keys(presence: &mut CloudRawRecordPresence, outer: &str, keys: &[&str]) { + let mut dictionary = plist::Dictionary::new(); + for key in keys { + dictionary.insert((*key).to_owned(), PlistValue::String("fixture".to_owned())); + } + let mut bytes = Vec::new(); + plist::to_writer_binary(&mut bytes, &PlistValue::Dictionary(dictionary)) + .expect("fixture plist"); + presence + .capture_decrypted_plist_dictionary(outer, &bytes) + .expect("capture fixture keys"); + } + + fn direct_chat() -> CloudChat { + CloudChat { + style: 45, + chat_identifier: "iMessage;-;+15555550100".to_owned(), + group_id: "chat-direct".to_owned(), + service_name: "iMessage".to_owned(), + original_group_id: "chat-direct-original".to_owned(), + participants: vec![CloudParticipant { + uri: "tel:+15555550100".to_owned(), + }], + guid: "chat-guid-direct".to_owned(), + ..Default::default() + } + } + + fn group_chat() -> CloudChat { + CloudChat { + style: 43, + chat_identifier: "iMessage;+;group".to_owned(), + group_id: "chat-group".to_owned(), + service_name: "iMessage".to_owned(), + original_group_id: "chat-group-original".to_owned(), + properties: Some(CloudProp { + pv: Some(9), + ..Default::default() + }), + participants: vec![ + CloudParticipant { + uri: "tel:+15555550100".to_owned(), + }, + CloudParticipant { + uri: "tel:+15555550101".to_owned(), + }, + ], + guid: "chat-guid-group".to_owned(), + ..Default::default() + } + } + + fn chat_required_presence(with_prop: bool) -> CloudRawRecordPresence { + let mut fields = vec!["guid", "cid", "gid", "ogid", "svc", "stl", "ptcpts"]; + if with_prop { + fields.push("prop"); + } + raw_presence(&fields) + } + + fn message_presence() -> CloudRawRecordPresence { + raw_presence(&[ + "msgType", "eCode", "chatID", "sender", "time", "msgProto", "flags", "guid", "svc", + ]) + } + + fn normal_message(text: Option<&str>) -> CloudMessage { + CloudMessage { + r#type: 1, + chat_id: "iMessage;-;+15555550100".to_owned(), + sender: "tel:+15555550100".to_owned(), + time: 123_000_000, + msg_proto: GZipWrapper(MessageProto { + unk1: 1, + text: text.map(ToOwned::to_owned), + ..Default::default() + }), + guid: "message-guid-normal".to_owned(), + service: "iMessage".to_owned(), + ..Default::default() + } + } + + fn reaction_message() -> CloudMessage { + CloudMessage { + r#type: 2, + chat_id: "iMessage;-;+15555550100".to_owned(), + sender: "tel:+15555550100".to_owned(), + time: 124_000_000, + msg_proto: GZipWrapper(MessageProto { + unk1: 1, + associated_message_type: Some(2000), + associated_message_guid: Some("p:0/parent-guid-not-loaded".to_owned()), + associated_message_range_location: Some(0), + associated_message_range_length: Some(4), + ..Default::default() + }), + guid: "reaction-guid".to_owned(), + service: "iMessage".to_owned(), + ..Default::default() + } + } + + fn attachment_presence() -> CloudRawRecordPresence { + let mut presence = raw_presence(&["cm", "lqa"]); + capture_keys(&mut presence, "cm", &["aguid", "tb", "ig"]); + presence + } + + fn attribute_dictionary( + entries: impl IntoIterator, + ) -> NSDictionaryTypedCoder { + NSDictionaryTypedCoder( + entries + .into_iter() + .map(|(key, value)| (key.to_owned(), value)) + .collect(), + ) + } + + fn encoded_attributed_body(text: &str, ranges: Vec<(u32, NSDictionaryTypedCoder)>) -> Vec { + coder_encode_flattened(&[NSAttributedString { + text: text.to_owned(), + ranges, + } + .encode()]) + } + + fn plain_encoded_attributed_body(text: &str) -> Vec { + encoded_attributed_body( + text, + vec![(text.encode_utf16().count() as u32, attribute_dictionary([]))], + ) + } + + fn encoded_message_summary(summary: &MessageSummaryInfo) -> Vec { + let mut encoded = Vec::new(); + plist::to_writer_binary(&mut encoded, summary).expect("fixture message summary"); + encoded + } + + fn encoded_explicit_clear_message_summary() -> Vec { + let mut summary = plist::Dictionary::new(); + summary.insert("ec".to_owned(), PlistValue::Dictionary(Default::default())); + summary.insert("ep".to_owned(), PlistValue::Array(Vec::new())); + summary.insert("otr".to_owned(), PlistValue::Dictionary(Default::default())); + summary.insert("rp".to_owned(), PlistValue::Array(Vec::new())); + let mut encoded = Vec::new(); + plist::to_writer_binary(&mut encoded, &PlistValue::Dictionary(summary)) + .expect("explicit-clear summary"); + encoded + } + + fn message_payload(outcome: &CloudCanonicalConversionOutcome) -> &CloudCanonicalMessagePayload { + let CloudCanonicalConversionOutcome::Ready(mutation) = outcome else { + panic!("message fixture should convert"); + }; + let Some(CloudCanonicalPayload::Message(payload)) = mutation.payload() else { + panic!("message payload expected"); + }; + payload + } + + #[test] + fn direct_chat_fixture_converts_without_default_inference() { + let hasher = CloudSemanticIdentifierHasher::new(b"fixture-key").unwrap(); + let outcome = convert_chat( + &context(&hasher, "server-chat-direct", Some(1_720_000_000_001)), + &chat_required_presence(false), + &direct_chat(), + ); + let CloudCanonicalConversionOutcome::Ready(mutation) = outcome else { + panic!("direct chat should convert"); + }; + assert_eq!( + mutation.envelope().entity_kind(), + CloudCanonicalEntityKind::Chat + ); + let Some(CloudCanonicalPayload::Chat(payload)) = mutation.payload() else { + panic!("chat payload expected"); + }; + assert_eq!( + payload.display_name_state(), + crate::cloud_sync_canonical_dto::CloudCanonicalFieldState::Absent + ); + assert_eq!( + payload.group_version_state(), + crate::cloud_sync_canonical_dto::CloudCanonicalFieldState::Absent + ); + } + + #[test] + fn group_chat_fixture_preserves_nested_pv_presence() { + let hasher = CloudSemanticIdentifierHasher::new(b"fixture-key").unwrap(); + let mut presence = chat_required_presence(true); + capture_keys(&mut presence, "prop", &["pv"]); + let outcome = convert_chat( + &context(&hasher, "server-chat-group", Some(1_720_000_000_001)), + &presence, + &group_chat(), + ); + let CloudCanonicalConversionOutcome::Ready(mutation) = outcome else { + panic!("group chat should convert"); + }; + let Some(CloudCanonicalPayload::Chat(payload)) = mutation.payload() else { + panic!("chat payload expected"); + }; + assert_eq!( + payload.group_version_state(), + crate::cloud_sync_canonical_dto::CloudCanonicalFieldState::Value + ); + } + + #[test] + fn nested_presence_is_deferred_instead_of_guessed() { + let hasher = CloudSemanticIdentifierHasher::new(b"fixture-key").unwrap(); + let outcome = convert_chat( + &context(&hasher, "server-chat-group", None), + &chat_required_presence(true), + &group_chat(), + ); + assert_eq!( + outcome, + CloudCanonicalConversionOutcome::Deferred( + CloudCanonicalDeferredReason::NestedPresenceUnavailable + ) + ); + } + + #[test] + fn normal_text_preserves_omitted_vs_explicit_empty() { + let hasher = CloudSemanticIdentifierHasher::new(b"fixture-key").unwrap(); + let omitted = convert_message( + &context(&hasher, "server-message-omitted", None), + &message_presence(), + &normal_message(None), + ); + let empty = convert_message( + &context(&hasher, "server-message-empty", None), + &message_presence(), + &normal_message(Some("")), + ); + let CloudCanonicalConversionOutcome::Ready(omitted) = omitted else { + panic!("omitted fixture should convert"); + }; + let CloudCanonicalConversionOutcome::Ready(empty) = empty else { + panic!("empty fixture should convert"); + }; + let Some(CloudCanonicalPayload::Message(omitted)) = omitted.payload() else { + panic!("message payload expected"); + }; + let Some(CloudCanonicalPayload::Message(empty)) = empty.payload() else { + panic!("message payload expected"); + }; + assert_eq!( + omitted.text_state(), + crate::cloud_sync_canonical_dto::CloudCanonicalFieldState::Absent + ); + assert_eq!( + empty.text_state(), + crate::cloud_sync_canonical_dto::CloudCanonicalFieldState::Value + ); + } + + #[test] + fn attributed_body_projects_utf16_runs_known_attributes_and_attachment_reference() { + let hasher = CloudSemanticIdentifierHasher::new(b"fixture-key").unwrap(); + let attributes = attribute_dictionary([ + ("__kIMMessagePartAttributeName", NSNumber(0).encode()), + ( + "__kIMFileTransferGUIDAttributeName", + NSString("at_0_message-guid-normal".to_owned()).encode(), + ), + ( + "__kIMMentionConfirmedMention", + NSString("mailto:synthetic@example.invalid".to_owned()).encode(), + ), + ( + "IMAudioTranscription", + NSString("transcript".to_owned()).encode(), + ), + ("__kIMTextEffectAttributeName", NSNumber(3).encode()), + ("__kIMTextBoldAttributeName", NSNumber(1).encode()), + ("__kIMTextItalicAttributeName", NSNumber(0).encode()), + ( + "__kIMUnknownFutureAttribute", + NSString(SECRET.to_owned()).encode(), + ), + ]); + let mut message = normal_message(Some("A😀B")); + message.msg_proto.0.attributed_body = + Some(encoded_attributed_body("A😀B", vec![(4, attributes)])); + + let outcome = convert_message( + &context(&hasher, "server-message-attributed", None), + &message_presence(), + &message, + ); + let payload = message_payload(&outcome); + assert_eq!( + payload.attributed_bodies_state(), + crate::cloud_sync_canonical_dto::CloudCanonicalFieldState::Value + ); + assert_eq!(payload.attributed_bodies().len(), 1); + assert_eq!(payload.attributed_bodies()[0].text_utf16_length(), 4); + assert_eq!(payload.attributed_bodies()[0].runs().len(), 1); + assert_eq!( + payload.attributed_bodies()[0].runs()[0].message_part(), + Some(0) + ); + assert!(payload.attributed_bodies()[0].runs()[0].has_attachment()); + assert!(!format!("{outcome:?}").contains(SECRET)); + } + + #[test] + fn attributed_attachment_owner_must_match_the_message() { + let hasher = CloudSemanticIdentifierHasher::new(b"fixture-key").unwrap(); + let attributes = attribute_dictionary([( + "__kIMFileTransferGUIDAttributeName", + NSString("at_0_another-message-guid".to_owned()).encode(), + )]); + let mut message = normal_message(Some("attachment")); + message.msg_proto.0.attributed_body = Some(encoded_attributed_body( + "attachment", + vec![(10, attributes)], + )); + + assert_eq!( + convert_message( + &context(&hasher, "server-message-owner-mismatch", None), + &message_presence(), + &message, + ), + CloudCanonicalConversionOutcome::Quarantined( + CloudCanonicalQuarantineReason::MalformedParent + ) + ); + } + + #[test] + fn message_summary_edits_are_sorted_deduplicated_and_snapshotted() { + let hasher = CloudSemanticIdentifierHasher::new(b"fixture-key").unwrap(); + let older_body = plain_encoded_attributed_body("older"); + let newer_body = plain_encoded_attributed_body("newer"); + let mut summary = MessageSummaryInfo { + ep: vec![2, 1], + rp: vec![7, 3, 7], + ..Default::default() + }; + summary.ec.insert( + "1".to_owned(), + vec![WireMessageEdit { + t: plain_encoded_attributed_body("other part"), + d: 1_720_000_000_300.0, + bcg: None, + }], + ); + summary.ec.insert( + "2".to_owned(), + vec![ + WireMessageEdit { + t: newer_body, + d: 1_720_000_000_200.0, + bcg: None, + }, + WireMessageEdit { + t: older_body.clone(), + d: 1_720_000_000_100.0, + bcg: None, + }, + WireMessageEdit { + t: older_body, + d: 1_720_000_000_100.0, + bcg: None, + }, + ], + ); + summary + .otr + .insert("2".to_owned(), MessageEditRange { lo: 0, le: 4 }); + summary + .otr + .insert("1".to_owned(), MessageEditRange { lo: 0, le: 4 }); + + let mut message = normal_message(Some("base")); + message.msg_proto.0.attributed_body = Some(plain_encoded_attributed_body("base")); + message.msg_proto.0.message_summary_info = Some(encoded_message_summary(&summary)); + let outcome = convert_message( + &context(&hasher, "server-message-edits", None), + &message_presence(), + &message, + ); + let payload = message_payload(&outcome); + assert_eq!( + payload.edits_state(), + crate::cloud_sync_canonical_dto::CloudCanonicalFieldState::Value + ); + assert_eq!(payload.edit_count(), 3); + assert_eq!( + payload + .edits() + .iter() + .map(CloudCanonicalMessageEdit::part) + .collect::>(), + vec![1, 2, 2] + ); + assert_eq!( + payload + .edits() + .iter() + .map(CloudCanonicalMessageEdit::revision) + .collect::>(), + vec![0, 0, 1] + ); + assert_eq!( + payload + .edits() + .iter() + .map(CloudCanonicalMessageEdit::modified_at_millis) + .collect::>(), + vec![1_720_000_000_300, 1_720_000_000_100, 1_720_000_000_200] + ); + assert_eq!(payload.retracted_parts(), &[3, 7]); + + let CloudCanonicalConversionOutcome::Ready(mutation) = &outcome else { + unreachable!("payload helper already proved ready"); + }; + let snapshot = mutation.snapshot().expect("edit snapshot"); + assert_eq!(snapshot.edit_parts().len(), 3); + assert_eq!( + snapshot + .edit_parts() + .iter() + .map(CloudCanonicalEditPartSnapshot::revision) + .collect::>(), + vec![0, 0, 1] + ); + assert_eq!( + snapshot + .edit_parts() + .iter() + .map(CloudCanonicalEditPartSnapshot::modified_at_millis) + .collect::>(), + vec![1_720_000_000_300, 1_720_000_000_100, 1_720_000_000_200] + ); + } + + #[test] + fn empty_summary_collections_do_not_become_a_clear_instruction() { + let hasher = CloudSemanticIdentifierHasher::new(b"fixture-key").unwrap(); + let mut message = normal_message(Some("")); + message.msg_proto.0.attributed_body = Some(coder_encode_flattened(&[])); + message.msg_proto.0.message_summary_info = Some(encoded_explicit_clear_message_summary()); + let outcome = convert_message( + &context(&hasher, "server-message-explicit-clears", None), + &message_presence(), + &message, + ); + let payload = message_payload(&outcome); + assert_eq!( + payload.attributed_bodies_state(), + crate::cloud_sync_canonical_dto::CloudCanonicalFieldState::ExplicitClear + ); + // attributedBody is protobuf `optional bytes`, where present-and-empty + // is genuinely distinguishable from absent, so a clear is well founded + // there. + // + // The summary collections are not. Apple omits an empty collection + // rather than sending one, so an empty `ec`/`rp` carries no instruction + // and must not wipe local edit or retraction state. + assert_eq!( + payload.edits_state(), + crate::cloud_sync_canonical_dto::CloudCanonicalFieldState::Absent + ); + assert_eq!( + payload.retracted_parts_state(), + crate::cloud_sync_canonical_dto::CloudCanonicalFieldState::Absent + ); + } + + #[test] + fn malformed_and_oversized_attributed_content_fail_closed() { + let hasher = CloudSemanticIdentifierHasher::new(b"fixture-key").unwrap(); + let mut malformed = normal_message(Some("body")); + malformed.msg_proto.0.attributed_body = Some(vec![1, 2, 3]); + assert_eq!( + convert_message( + &context(&hasher, "server-message-malformed-body", None), + &message_presence(), + &malformed, + ), + CloudCanonicalConversionOutcome::Quarantined( + CloudCanonicalQuarantineReason::MalformedAttributedBody + ) + ); + + let oversized = vec![0_u8; MAX_ATTRIBUTED_BODY_BYTES + 1]; + assert!(matches!( + BoundedTypedStreamDecoder::new(&oversized), + Err(BoundedStreamFailure::Oversized) + )); + + let mut declared_oversized = vec![0x04, 11]; + declared_oversized.extend_from_slice(b"streamtyped"); + declared_oversized.extend_from_slice(&[0x81, 0xe8, 0x03, TYPED_STREAM_TAG_START, 13]); + declared_oversized.extend_from_slice(b"[4294967295c]"); + assert!(matches!( + BoundedTypedStreamDecoder::new(&declared_oversized) + .and_then(BoundedTypedStreamDecoder::decode), + Err(BoundedStreamFailure::Oversized) + )); + } + + #[test] + fn every_truncated_typedstream_prefix_returns_without_panicking() { + let encoded = plain_encoded_attributed_body("A😀B"); + for length in 0..encoded.len() { + let prefix = &encoded[..length]; + let result = std::panic::catch_unwind(|| { + BoundedTypedStreamDecoder::new(prefix).and_then(BoundedTypedStreamDecoder::decode) + }); + assert!(result.is_ok(), "decoder panicked at prefix length {length}"); + assert!( + result.expect("checked above").is_err(), + "truncated prefix unexpectedly decoded at length {length}" + ); + } + + let mut trailing = encoded; + trailing.push(0); + assert!(matches!( + BoundedTypedStreamDecoder::new(&trailing).and_then(BoundedTypedStreamDecoder::decode), + Err(BoundedStreamFailure::Malformed) + )); + } + + #[test] + fn unproven_edit_time_and_edit_retraction_conflict_do_not_apply() { + let hasher = CloudSemanticIdentifierHasher::new(b"fixture-key").unwrap(); + assert_eq!( + validated_edit_timestamp(0.0), + Err(CloudCanonicalConversionOutcome::Deferred( + CloudCanonicalDeferredReason::UnprovenEditTimestamp + )) + ); + let mut fractional = MessageSummaryInfo { + ep: vec![0], + ..Default::default() + }; + fractional.ec.insert( + "0".to_owned(), + vec![WireMessageEdit { + t: plain_encoded_attributed_body("edit"), + d: 1_720_000_000_100.5, + bcg: None, + }], + ); + let mut message = normal_message(Some("base")); + message.msg_proto.0.message_summary_info = Some(encoded_message_summary(&fractional)); + assert_eq!( + convert_message( + &context(&hasher, "server-message-fractional-time", None), + &message_presence(), + &message, + ), + CloudCanonicalConversionOutcome::Deferred( + CloudCanonicalDeferredReason::UnprovenEditTimestamp + ) + ); + + let mut conflicting = fractional; + conflicting.ec.get_mut("0").expect("edit")[0].d = 1_720_000_000_100.0; + conflicting.rp = vec![0]; + message.msg_proto.0.message_summary_info = Some(encoded_message_summary(&conflicting)); + assert_eq!( + convert_message( + &context(&hasher, "server-message-conflict", None), + &message_presence(), + &message, + ), + CloudCanonicalConversionOutcome::Quarantined( + CloudCanonicalQuarantineReason::ConflictingEditAndRetraction + ) + ); + } + + #[test] + fn reply_parent_sets_envelope_parent_and_malformed_parts_are_rejected() { + let hasher = CloudSemanticIdentifierHasher::new(b"fixture-key").unwrap(); + let mut reply = normal_message(Some("reply")); + reply.msg_proto_2 = Some(GZipWrapper(MessageProto2 { + reply: Some("r:0:parent-guid".to_owned()), + })); + let outcome = convert_message( + &context(&hasher, "server-message-valid-reply", None), + &message_presence(), + &reply, + ); + let CloudCanonicalConversionOutcome::Ready(mutation) = outcome else { + panic!("valid reply should convert"); + }; + assert!(mutation.envelope().parent_logical_key_hash().is_some()); + + for malformed in ["r:x:parent-guid", "r:01:parent-guid"] { + reply.msg_proto_2 = Some(GZipWrapper(MessageProto2 { + reply: Some(malformed.to_owned()), + })); + assert_eq!( + convert_message( + &context(&hasher, "server-message-malformed-reply", None), + &message_presence(), + &reply, + ), + CloudCanonicalConversionOutcome::Quarantined( + CloudCanonicalQuarantineReason::MalformedParent + ), + "{malformed}" + ); + } + } + + #[test] + fn safe_group_photo_guid_is_projected_while_asset_stays_protected() { + let hasher = CloudSemanticIdentifierHasher::new(b"fixture-key").unwrap(); + let mut chat = group_chat(); + chat.properties = None; + chat.group_photo_guid = Some("group-photo-guid".to_owned()); + chat.group_photo = Some(Asset::default()); + let presence = raw_presence(&[ + "guid", "cid", "gid", "ogid", "svc", "stl", "ptcpts", "gpid", "gp", + ]); + let outcome = convert_chat( + &context(&hasher, "server-chat-group-photo", None), + &presence, + &chat, + ); + let CloudCanonicalConversionOutcome::Ready(mutation) = outcome else { + panic!("group photo metadata should convert"); + }; + let Some(CloudCanonicalPayload::Chat(payload)) = mutation.payload() else { + panic!("chat payload expected"); + }; + assert_eq!( + payload.group_photo_guid_state(), + crate::cloud_sync_canonical_dto::CloudCanonicalFieldState::Value + ); + assert_eq!( + mutation + .envelope() + .protected_raw_envelope_reference() + .value(), + "obcs2.fixture.protected" + ); + + chat.group_photo_guid = None; + assert_eq!( + convert_chat( + &context(&hasher, "server-chat-unbound-group-photo", None), + &raw_presence(&["guid", "cid", "gid", "ogid", "svc", "stl", "ptcpts", "gp",]), + &chat, + ), + CloudCanonicalConversionOutcome::Deferred( + CloudCanonicalDeferredReason::UnsupportedGroupPhoto + ) + ); + } + + #[test] + fn unknown_protobuf_fields_preserve_the_protected_source_reference() { + let hasher = CloudSemanticIdentifierHasher::new(b"fixture-key").unwrap(); + let mut encoded = MessageProto { + unk1: 1, + text: Some("known text".to_owned()), + ..Default::default() + } + .encode_to_vec(); + // Unknown field 99, varint wire type, value 1. Prost safely ignores + // the projection, while the protected raw envelope retains it. + encoded.extend_from_slice(&[0x98, 0x06, 0x01]); + let decoded = MessageProto::decode(encoded.as_slice()).expect("protobuf fixture"); + let mut message = normal_message(None); + message.msg_proto = GZipWrapper(decoded); + let outcome = convert_message( + &context(&hasher, "server-message-unknown-proto", None), + &message_presence(), + &message, + ); + let CloudCanonicalConversionOutcome::Ready(mutation) = outcome else { + panic!("unknown protobuf fields should not block known projection"); + }; + assert_eq!( + mutation + .envelope() + .protected_raw_envelope_reference() + .value(), + "obcs2.fixture.protected" + ); + } + + #[test] + fn explicit_clear_requires_authoritative_pre_typed_evidence() { + let hasher = CloudSemanticIdentifierHasher::new(b"fixture-key").unwrap(); + let mut presence = chat_required_presence(false); + presence + .fields + .insert("name".to_owned(), CloudRawFieldPresence::PresentWithValue); + let unsafe_guess = convert_chat( + &context(&hasher, "server-chat-clear-unproven", None), + &presence, + &direct_chat(), + ); + assert_eq!( + unsafe_guess, + CloudCanonicalConversionOutcome::Quarantined( + CloudCanonicalQuarantineReason::FieldPresenceMismatch + ) + ); + + presence + .mark_top_level_explicit_clear("name") + .expect("fixture carries authoritative clear evidence"); + let proven_clear = convert_chat( + &context(&hasher, "server-chat-clear-proven", None), + &presence, + &direct_chat(), + ); + let CloudCanonicalConversionOutcome::Ready(mutation) = proven_clear else { + panic!("authoritative clear marker should convert"); + }; + let Some(CloudCanonicalPayload::Chat(payload)) = mutation.payload() else { + panic!("chat payload expected"); + }; + assert_eq!( + payload.display_name_state(), + crate::cloud_sync_canonical_dto::CloudCanonicalFieldState::ExplicitClear + ); + } + + #[test] + fn reaction_fixture_carries_parent_metadata_before_parent_exists() { + let hasher = CloudSemanticIdentifierHasher::new(b"fixture-key").unwrap(); + let outcome = convert_message( + &context(&hasher, "server-reaction", None), + &message_presence(), + &reaction_message(), + ); + let CloudCanonicalConversionOutcome::Ready(mutation) = outcome else { + panic!("reaction should convert without requiring parent storage"); + }; + assert_eq!( + mutation.envelope().entity_kind(), + CloudCanonicalEntityKind::Reaction + ); + assert!(mutation.envelope().parent_logical_key_hash().is_some()); + let Some(CloudCanonicalPayload::Message(payload)) = mutation.payload() else { + panic!("reaction message payload expected"); + }; + assert!(payload.association().is_reaction()); + } + + #[test] + fn reaction_identity_normalizes_p_and_bp_but_preserves_partless_semantics() { + let hasher = CloudSemanticIdentifierHasher::new(b"fixture-key").unwrap(); + let mut reaction = reaction_message(); + + reaction.msg_proto.0.associated_message_guid = Some("p:0/parent-guid".to_owned()); + let p = convert_message( + &context(&hasher, "server-reaction-p", None), + &message_presence(), + &reaction, + ); + reaction.msg_proto.0.associated_message_guid = Some("bp:0/parent-guid".to_owned()); + let bp = convert_message( + &context(&hasher, "server-reaction-bp", None), + &message_presence(), + &reaction, + ); + reaction.msg_proto.0.associated_message_guid = Some("parent-guid".to_owned()); + let partless = convert_message( + &context(&hasher, "server-reaction-partless", None), + &message_presence(), + &reaction, + ); + + let CloudCanonicalConversionOutcome::Ready(p) = p else { + panic!("p reaction should convert"); + }; + let CloudCanonicalConversionOutcome::Ready(bp) = bp else { + panic!("bp reaction should convert"); + }; + let CloudCanonicalConversionOutcome::Ready(partless) = partless else { + panic!("partless reaction should convert"); + }; + assert_eq!( + p.envelope().logical_entity_key_hash(), + bp.envelope().logical_entity_key_hash() + ); + assert_eq!( + p.envelope().parent_logical_key_hash(), + bp.envelope().parent_logical_key_hash() + ); + assert_eq!( + p.envelope().parent_logical_key_hash(), + partless.envelope().parent_logical_key_hash() + ); + assert_ne!( + p.envelope().logical_entity_key_hash(), + partless.envelope().logical_entity_key_hash() + ); + } + + #[test] + fn emoji_reaction_content_is_required_only_for_the_emoji_reaction_kind() { + let hasher = CloudSemanticIdentifierHasher::new(b"fixture-key").unwrap(); + let mut emoji = reaction_message(); + emoji.msg_proto.0.associated_message_type = Some(2006); + assert_eq!( + convert_message( + &context(&hasher, "server-emoji-missing-content", None), + &message_presence(), + &emoji, + ), + CloudCanonicalConversionOutcome::Quarantined( + CloudCanonicalQuarantineReason::InvalidCanonicalPayload + ) + ); + + emoji.msg_proto_4 = Some(GZipWrapper(MessageProto4 { + associated_message_emoji: Some("😀".to_owned()), + ..Default::default() + })); + assert!(matches!( + convert_message( + &context(&hasher, "server-emoji-reaction", None), + &message_presence(), + &emoji, + ), + CloudCanonicalConversionOutcome::Ready(_) + )); + + let mut ordinary = reaction_message(); + ordinary.msg_proto_4 = emoji.msg_proto_4; + assert_eq!( + convert_message( + &context(&hasher, "server-ordinary-with-emoji", None), + &message_presence(), + &ordinary, + ), + CloudCanonicalConversionOutcome::Quarantined( + CloudCanonicalQuarantineReason::InvalidCanonicalPayload + ) + ); + } + + #[test] + fn reaction_parent_rejects_noncanonical_part_or_nested_guid_separator() { + let hasher = CloudSemanticIdentifierHasher::new(b"fixture-key").unwrap(); + let mut reaction = reaction_message(); + for malformed in ["p:00/parent-guid", "p:0/parent/guid"] { + reaction.msg_proto.0.associated_message_guid = Some(malformed.to_owned()); + assert_eq!( + convert_message( + &context(&hasher, "server-malformed-reaction-parent", None), + &message_presence(), + &reaction, + ), + CloudCanonicalConversionOutcome::Quarantined( + CloudCanonicalQuarantineReason::MalformedParent + ), + "{malformed}" + ); + } + } + + #[test] + fn reaction_cannot_smuggle_edit_or_retraction_state() { + let hasher = CloudSemanticIdentifierHasher::new(b"fixture-key").unwrap(); + let mut reaction = reaction_message(); + // Carry real edit and retraction content. This previously used the + // all-empty summary and passed only because empty collections were + // being turned into a clear instruction, so the test was exercising + // that fabricated state rather than actual smuggled state. + let mut summary = MessageSummaryInfo { + ep: vec![0], + ..Default::default() + }; + summary.ec.insert( + "0".to_owned(), + vec![WireMessageEdit { + t: plain_encoded_attributed_body("smuggled edit"), + d: 1_720_000_000_400.0, + bcg: None, + }], + ); + reaction.msg_proto.0.message_summary_info = Some(encoded_message_summary(&summary)); + assert_eq!( + convert_message( + &context(&hasher, "server-reaction-with-summary", None), + &message_presence(), + &reaction, + ), + CloudCanonicalConversionOutcome::Quarantined( + CloudCanonicalQuarantineReason::InvalidCanonicalPayload + ) + ); + } + + #[test] + fn ambiguous_reply_is_quarantined_instead_of_guessed() { + let hasher = CloudSemanticIdentifierHasher::new(b"fixture-key").unwrap(); + let mut message = normal_message(Some("reply")); + message.msg_proto_2 = Some(GZipWrapper(MessageProto2 { + reply: Some("r:0:parent:ambiguous".to_owned()), + })); + assert_eq!( + convert_message( + &context(&hasher, "server-message-reply", None), + &message_presence(), + &message, + ), + CloudCanonicalConversionOutcome::Quarantined( + CloudCanonicalQuarantineReason::AmbiguousReply + ) + ); + } + + #[test] + fn owned_attachment_keeps_entire_guid_suffix_and_owner_part() { + let hasher = CloudSemanticIdentifierHasher::new(b"fixture-key").unwrap(); + let attachment = AttachmentMeta { + guid: "at_0_parent_guid_with_underscore".to_owned(), + total_bytes: 42, + is_outgoing: true, + ..Default::default() + }; + let outcome = convert_attachment( + &context(&hasher, "server-attachment-owned", None), + &attachment_presence(), + &attachment, + ); + let CloudCanonicalConversionOutcome::Ready(mutation) = outcome else { + panic!("owned attachment should convert"); + }; + let Some(CloudCanonicalPayload::Attachment(payload)) = mutation.payload() else { + panic!("attachment payload expected"); + }; + assert_eq!(payload.canonical_guid(), "parent_guid_with_underscore_0"); + assert_eq!(payload.owner_part(), Some(0)); + assert!(mutation.envelope().parent_logical_key_hash().is_some()); + assert_eq!( + mutation.envelope().logical_entity_key_hash(), + &hasher + .canonical_owned_attachment_key_hash("parent_guid_with_underscore", 0) + .unwrap() + ); + } + + #[test] + fn standalone_attachment_has_no_invented_owner() { + let hasher = CloudSemanticIdentifierHasher::new(b"fixture-key").unwrap(); + let attachment = AttachmentMeta { + guid: "standalone-attachment-guid".to_owned(), + total_bytes: 42, + ..Default::default() + }; + let outcome = convert_attachment( + &context(&hasher, "server-attachment-standalone", None), + &attachment_presence(), + &attachment, + ); + let CloudCanonicalConversionOutcome::Ready(mutation) = outcome else { + panic!("standalone attachment should convert"); + }; + let Some(CloudCanonicalPayload::Attachment(payload)) = mutation.payload() else { + panic!("attachment payload expected"); + }; + assert_eq!(payload.canonical_guid(), "standalone-attachment-guid"); + assert_eq!(payload.owner_part(), None); + assert!(mutation.envelope().parent_logical_key_hash().is_none()); + } + + #[test] + fn malformed_required_identity_is_quarantined() { + let hasher = CloudSemanticIdentifierHasher::new(b"fixture-key").unwrap(); + let mut presence = message_presence(); + presence.fields.remove("guid"); + assert_eq!( + convert_message( + &context(&hasher, "server-message", None), + &presence, + &normal_message(Some("hello")), + ), + CloudCanonicalConversionOutcome::Quarantined( + CloudCanonicalQuarantineReason::MalformedRequiredIdentity + ) + ); + } + + #[test] + fn unsupported_service_and_message_type_are_typed_quarantines() { + let hasher = CloudSemanticIdentifierHasher::new(b"fixture-key").unwrap(); + let mut service = normal_message(Some("hello")); + service.service = "SMS".to_owned(); + assert_eq!( + convert_message( + &context(&hasher, "server-message", None), + &message_presence(), + &service, + ), + CloudCanonicalConversionOutcome::Quarantined( + CloudCanonicalQuarantineReason::UnsupportedService + ) + ); + let mut message_type = normal_message(Some("hello")); + message_type.r#type = 99; + assert_eq!( + convert_message( + &context(&hasher, "server-message", None), + &message_presence(), + &message_type, + ), + CloudCanonicalConversionOutcome::Quarantined( + CloudCanonicalQuarantineReason::UnsupportedMessageType + ) + ); + } + + #[test] + fn malformed_edits_are_quarantined_and_media_credentials_are_deferred() { + let hasher = CloudSemanticIdentifierHasher::new(b"fixture-key").unwrap(); + let mut message = normal_message(Some("hello")); + message.msg_proto.0.message_summary_info = Some(vec![1, 2, 3]); + assert_eq!( + convert_message( + &context(&hasher, "server-message", None), + &message_presence(), + &message, + ), + CloudCanonicalConversionOutcome::Quarantined( + CloudCanonicalQuarantineReason::MalformedMessageSummary + ) + ); + message.msg_proto.0.message_summary_info = Some(vec![0; MAX_MESSAGE_SUMMARY_BYTES + 1]); + assert_eq!( + convert_message( + &context(&hasher, "server-message-oversized-summary", None), + &message_presence(), + &message, + ), + CloudCanonicalConversionOutcome::Quarantined( + CloudCanonicalQuarantineReason::OversizedContent + ) + ); + let mut attachment = AttachmentMeta { + guid: "standalone-attachment-guid".to_owned(), + total_bytes: 42, + ..Default::default() + }; + attachment.user_info = Some(Default::default()); + assert_eq!( + convert_attachment( + &context(&hasher, "server-attachment", None), + &attachment_presence(), + &attachment, + ), + CloudCanonicalConversionOutcome::Deferred( + CloudCanonicalDeferredReason::UnsupportedMediaCredentials + ) + ); + } + + #[test] + fn tombstone_supports_present_or_missing_server_time() { + let hasher = CloudSemanticIdentifierHasher::new(b"fixture-key").unwrap(); + for expected in [Some(1_720_000_000_999), None] { + let outcome = convert_tombstone( + &context(&hasher, "server-message-tombstone", expected), + CloudCanonicalEntityKind::Message, + hash('d'), + ); + let CloudCanonicalConversionOutcome::Ready(mutation) = outcome else { + panic!("server-confirmed tombstone should convert"); + }; + assert_eq!( + mutation + .tombstone() + .expect("tombstone payload") + .deleted_at_millis(), + expected + ); + } + } + + #[test] + fn debug_and_errors_never_expose_secret_material() { + let hasher = CloudSemanticIdentifierHasher::new(SECRET.as_bytes()).unwrap(); + let mut message = normal_message(Some(SECRET)); + message.guid = format!("message-{SECRET}"); + let outcome = convert_message( + &context(&hasher, SECRET, None), + &message_presence(), + &message, + ); + let rendered = format!( + "{outcome:?} {:?} {}", + message_presence(), + CloudRawPresenceFailure::MalformedNestedPlist + ); + assert!(!rendered.contains(SECRET)); + assert!(!format!("{:?}", context(&hasher, SECRET, None)).contains(SECRET)); + } + + #[test] + fn presence_extractor_rejects_duplicate_or_value_less_fields() { + let duplicate = Record { + record_field: vec![ + Field { + identifier: Some(field::Identifier { + name: Some("guid".to_owned()), + }), + value: Some(field::Value::default()), + }, + Field { + identifier: Some(field::Identifier { + name: Some("guid".to_owned()), + }), + value: None, + }, + ], + ..Default::default() + }; + assert_eq!( + CloudRawRecordPresence::extract(&duplicate), + Err(CloudRawPresenceFailure::DuplicateFieldIdentifier) + ); + + let value_less = Record { + record_field: vec![Field { + identifier: Some(field::Identifier { + name: Some("guid".to_owned()), + }), + value: None, + }], + ..Default::default() + }; + let presence = CloudRawRecordPresence::extract(&value_less).unwrap(); + assert_eq!( + presence.field("guid"), + CloudRawFieldPresence::PresentWithoutValue + ); + } + + #[test] + fn presence_extractor_preserves_the_empty_list_wire_type() { + // CloudKit distinguishes "present but empty" from absent with its own + // wire type. Discarding the tag here left a live fetch unable to report + // whether Apple emits it, which is the evidence the merge contract + // depends on. + let record = Record { + record_field: vec![ + Field { + identifier: Some(field::Identifier { + name: Some("empty".to_owned()), + }), + value: Some(field::Value { + r#type: Some(CloudKitFieldType::EmptyList as i32), + ..Default::default() + }), + }, + Field { + identifier: Some(field::Identifier { + name: Some("populated".to_owned()), + }), + value: Some(field::Value { + r#type: Some(CloudKitFieldType::StringType as i32), + string_value: Some("value".to_owned()), + ..Default::default() + }), + }, + Field { + identifier: Some(field::Identifier { + name: Some("untyped".to_owned()), + }), + value: Some(field::Value::default()), + }, + ], + ..Default::default() + }; + + let presence = CloudRawRecordPresence::extract(&record).unwrap(); + + assert!(presence.was_sent_as_empty_list("empty")); + assert!(!presence.was_sent_as_empty_list("populated")); + assert!(!presence.was_sent_as_empty_list("untyped")); + assert!(!presence.was_sent_as_empty_list("absent")); + assert_eq!(presence.empty_list_field_names(), vec!["empty"]); + + // Recording the observation must not move any conversion decision. + // Whether an empty list means "clear" is unanswered, so it still reads + // as an ordinary valued field until a live run settles the question. + assert_eq!( + presence.field("empty"), + CloudRawFieldPresence::PresentWithValue + ); + } + + #[test] + fn source_remains_private_and_unwired() { + let source = concat!( + include_str!("cloud_sync_canonical_converter.rs"), + include_str!("cloud_sync_canonical_dto.rs") + ); + for forbidden in [ + concat!("flutter_", "rust_bridge::frb"), + concat!("#[", "frb"), + concat!("ser", "de::Serialize"), + concat!("object", "box"), + concat!("apply", "FromCloud"), + concat!("print", "ln!"), + concat!("eprint", "ln!"), + concat!("db", "g!"), + concat!("log", "::"), + concat!("tracing", "::"), + ] { + assert!( + !source.contains(forbidden), + "private converter must not contain {forbidden}" + ); + } + } +} diff --git a/rust/src/cloud_sync_canonical_dto.rs b/rust/src/cloud_sync_canonical_dto.rs new file mode 100644 index 0000000000..81a20d18a2 --- /dev/null +++ b/rust/src/cloud_sync_canonical_dto.rs @@ -0,0 +1,2985 @@ +//! Private, dormant canonical DTO contract for Cloud Sync V2. +//! +//! These types separate content-free replay metadata from transient canonical +//! payloads. They are intentionally not exposed through Flutter Rust Bridge +//! and are not connected to the semantic decoder or local database. + +#![allow(dead_code)] + +use std::{ + collections::HashSet, + fmt::{self, Debug, Formatter}, + hash::Hash, +}; + +pub(crate) const CLOUD_CANONICAL_SCHEMA_VERSION: u16 = 1; + +const HASH_BYTES: usize = 43; +const MAX_IDENTIFIER_BYTES: usize = 16 * 1024; +const MAX_TEXT_BYTES: usize = 16 * 1024 * 1024; +const MAX_BINARY_PAYLOAD_BYTES: usize = 16 * 1024 * 1024; +const MAX_PROTECTED_REFERENCE_BYTES: usize = 32 * 1024; +const MAX_PARTICIPANTS: usize = 4_096; +const MAX_ATTRIBUTED_BODIES: usize = 4_096; +const MAX_RUNS_PER_BODY: usize = 65_536; +const MAX_EDITS: usize = 65_536; +const MAX_RETRACTED_PARTS: usize = 65_536; +const MAX_ALIASES: usize = 4_096; +const MAX_TRANSIENT_AGGREGATE_BYTES: usize = 32 * 1024 * 1024; +const MAX_TRANSIENT_COLLECTION_ELEMENTS: usize = 131_072; + +#[derive(Clone, Copy, Debug, Eq, Hash, PartialEq)] +pub(crate) enum CloudCanonicalEntityKind { + Chat, + Message, + Reaction, + Attachment, + GroupPhoto, +} + +#[derive(Clone, Copy, Debug, Eq, Hash, PartialEq)] +pub(crate) enum CloudCanonicalMutationKind { + Upsert, + Tombstone, +} + +#[derive(Clone, Copy, Debug, Eq, Hash, PartialEq)] +pub(crate) enum CloudCanonicalAliasKind { + ChatGroupId, + ChatOriginalGroupId, + ChatServiceIdentifier, + ChatLegacyGroupIdentifier, +} + +#[derive(Clone, Copy, Debug, Eq, Hash, PartialEq)] +pub(crate) enum CloudCanonicalService { + IMessage, +} + +#[derive(Clone, Copy, Debug, Eq, Hash, PartialEq)] +pub(crate) enum CloudCanonicalChatStyle { + Direct, + Group, +} + +#[derive(Clone, Copy, Debug, Eq, Hash, PartialEq)] +pub(crate) enum CloudCanonicalReactionKind { + Heart, + Like, + Dislike, + Laugh, + Emphasize, + Question, + Emoji, + StickerBack, +} + +#[derive(Clone, Copy, Debug, Eq, Hash, PartialEq)] +pub(crate) enum CloudCanonicalFieldState { + Absent, + Value, + ExplicitClear, +} + +#[derive(Clone, Copy, Debug, Eq, PartialEq)] +pub(crate) enum CloudCanonicalValidationFailure { + UnsupportedSchema, + InvalidHash, + InvalidProtectedReference, + InvalidIdentifier, + InvalidText, + CollectionLimit, + InvalidRange, + InvalidPayload, + InvalidEnvelope, + InvalidSnapshot, + InvalidTombstone, + ScopeMismatch, + MalformedAssociatedParent, + MalformedAttachmentOwner, + MalformedReplyParent, + AmbiguousReplyParent, +} + +impl fmt::Display for CloudCanonicalValidationFailure { + fn fmt(&self, formatter: &mut Formatter<'_>) -> fmt::Result { + let message = match self { + Self::UnsupportedSchema => "Cloud Sync canonical schema is unsupported", + Self::InvalidHash => "Cloud Sync canonical hash is invalid", + Self::InvalidProtectedReference => { + "Cloud Sync canonical protected reference is invalid" + } + Self::InvalidIdentifier => "Cloud Sync canonical identifier is invalid", + Self::InvalidText => "Cloud Sync canonical text is invalid", + Self::CollectionLimit => "Cloud Sync canonical collection exceeds its bound", + Self::InvalidRange => "Cloud Sync canonical attributed range is invalid", + Self::InvalidPayload => "Cloud Sync canonical payload invariant failed", + Self::InvalidEnvelope => "Cloud Sync canonical envelope invariant failed", + Self::InvalidSnapshot => "Cloud Sync canonical snapshot invariant failed", + Self::InvalidTombstone => "Cloud Sync canonical tombstone invariant failed", + Self::ScopeMismatch => "Cloud Sync canonical active scope does not match", + Self::MalformedAssociatedParent => "Cloud Sync associated-message parent is malformed", + Self::MalformedAttachmentOwner => "Cloud Sync attachment owner is malformed", + Self::MalformedReplyParent => "Cloud Sync reply parent is malformed", + Self::AmbiguousReplyParent => "Cloud Sync reply parent grammar is ambiguous", + }; + formatter.write_str(message) + } +} + +impl std::error::Error for CloudCanonicalValidationFailure {} + +#[derive(Clone, Eq, Hash, PartialEq)] +pub(crate) struct CloudCanonicalHash(String); + +impl CloudCanonicalHash { + pub(crate) fn new(value: impl Into) -> Result { + let value = value.into(); + if value.len() != HASH_BYTES + || !value + .bytes() + .all(|byte| byte.is_ascii_alphanumeric() || matches!(byte, b'_' | b'-')) + { + return Err(CloudCanonicalValidationFailure::InvalidHash); + } + Ok(Self(value)) + } + + pub(crate) fn value(&self) -> &str { + &self.0 + } +} + +impl Debug for CloudCanonicalHash { + fn fmt(&self, formatter: &mut Formatter<'_>) -> fmt::Result { + formatter.write_str("CloudCanonicalHash(redacted)") + } +} + +#[derive(Clone, Eq, Hash, PartialEq)] +pub(crate) struct CloudCanonicalDigest(String); + +impl CloudCanonicalDigest { + pub(crate) fn new(value: impl Into) -> Result { + let value = value.into(); + let is_base64url = value.len() == HASH_BYTES + && value + .bytes() + .all(|byte| byte.is_ascii_alphanumeric() || matches!(byte, b'_' | b'-')); + let is_hex = value.len() == 64 && value.bytes().all(|byte| byte.is_ascii_hexdigit()); + if !is_base64url && !is_hex { + return Err(CloudCanonicalValidationFailure::InvalidHash); + } + Ok(Self(value)) + } + + pub(crate) fn value(&self) -> &str { + &self.0 + } +} + +impl Debug for CloudCanonicalDigest { + fn fmt(&self, formatter: &mut Formatter<'_>) -> fmt::Result { + formatter.write_str("CloudCanonicalDigest(redacted)") + } +} + +#[derive(Clone, Eq, Hash, PartialEq)] +pub(crate) struct CloudCanonicalProtectedReference(String); + +impl CloudCanonicalProtectedReference { + pub(crate) fn new(value: impl Into) -> Result { + let value = value.into(); + if value.len() > MAX_PROTECTED_REFERENCE_BYTES + || !value.starts_with("obcs2.") + || !value.bytes().all(|byte| { + byte.is_ascii_alphanumeric() || matches!(byte, b'.' | b'_' | b'-' | b':') + }) + { + return Err(CloudCanonicalValidationFailure::InvalidProtectedReference); + } + Ok(Self(value)) + } + + pub(crate) fn value(&self) -> &str { + &self.0 + } +} + +impl Debug for CloudCanonicalProtectedReference { + fn fmt(&self, formatter: &mut Formatter<'_>) -> fmt::Result { + formatter.write_str("CloudCanonicalProtectedReference(redacted)") + } +} + +#[derive(Clone, Eq, PartialEq)] +pub(crate) enum CloudCanonicalField { + Absent, + Value(T), + ExplicitClear, +} + +impl CloudCanonicalField { + pub(crate) fn state(&self) -> CloudCanonicalFieldState { + match self { + Self::Absent => CloudCanonicalFieldState::Absent, + Self::Value(_) => CloudCanonicalFieldState::Value, + Self::ExplicitClear => CloudCanonicalFieldState::ExplicitClear, + } + } + + pub(crate) fn value(&self) -> Option<&T> { + match self { + Self::Value(value) => Some(value), + Self::Absent | Self::ExplicitClear => None, + } + } +} + +impl Debug for CloudCanonicalField { + fn fmt(&self, formatter: &mut Formatter<'_>) -> fmt::Result { + let state = match self { + Self::Absent => "absent", + Self::Value(_) => "value-redacted", + Self::ExplicitClear => "explicit-clear", + }; + formatter + .debug_tuple("CloudCanonicalField") + .field(&state) + .finish() + } +} + +#[derive(Clone, Eq, Hash, PartialEq)] +pub(crate) struct CloudCanonicalAlias { + kind: CloudCanonicalAliasKind, + key_hash: CloudCanonicalHash, +} + +impl CloudCanonicalAlias { + pub(crate) fn new(kind: CloudCanonicalAliasKind, key_hash: CloudCanonicalHash) -> Self { + Self { kind, key_hash } + } + + pub(crate) fn kind(&self) -> CloudCanonicalAliasKind { + self.kind + } + + pub(crate) fn key_hash(&self) -> &CloudCanonicalHash { + &self.key_hash + } +} + +impl Debug for CloudCanonicalAlias { + fn fmt(&self, formatter: &mut Formatter<'_>) -> fmt::Result { + formatter.write_str("CloudCanonicalAlias(redacted)") + } +} + +#[derive(Clone, Eq, PartialEq)] +pub(crate) struct CloudCanonicalEnvelope { + scope_fingerprint: CloudCanonicalHash, + zone_fingerprint: CloudCanonicalHash, + generation: u64, + schema_version: u16, + change_id: CloudCanonicalHash, + entity_kind: CloudCanonicalEntityKind, + mutation_kind: CloudCanonicalMutationKind, + server_record_id_hash: CloudCanonicalHash, + logical_entity_key_hash: CloudCanonicalHash, + parent_logical_key_hash: Option, + aliases: Vec, + etag_hash: Option, + server_created_at_millis: Option, + server_modified_at_millis: Option, + protected_raw_envelope_reference: CloudCanonicalProtectedReference, +} + +impl CloudCanonicalEnvelope { + #[allow(clippy::too_many_arguments)] + pub(crate) fn new( + scope_fingerprint: CloudCanonicalHash, + zone_fingerprint: CloudCanonicalHash, + generation: u64, + schema_version: u16, + change_id: CloudCanonicalHash, + entity_kind: CloudCanonicalEntityKind, + mutation_kind: CloudCanonicalMutationKind, + server_record_id_hash: CloudCanonicalHash, + logical_entity_key_hash: CloudCanonicalHash, + parent_logical_key_hash: Option, + aliases: Vec, + etag_hash: Option, + server_created_at_millis: Option, + server_modified_at_millis: Option, + protected_raw_envelope_reference: CloudCanonicalProtectedReference, + ) -> Result { + if schema_version != CLOUD_CANONICAL_SCHEMA_VERSION + || aliases.len() > MAX_ALIASES + || parent_logical_key_hash + .as_ref() + .is_some_and(|parent| parent == &logical_entity_key_hash) + { + return Err(if schema_version != CLOUD_CANONICAL_SCHEMA_VERSION { + CloudCanonicalValidationFailure::UnsupportedSchema + } else { + CloudCanonicalValidationFailure::InvalidEnvelope + }); + } + + if entity_kind != CloudCanonicalEntityKind::Chat && !aliases.is_empty() { + return Err(CloudCanonicalValidationFailure::InvalidEnvelope); + } + match entity_kind { + CloudCanonicalEntityKind::Chat if parent_logical_key_hash.is_some() => { + return Err(CloudCanonicalValidationFailure::InvalidEnvelope); + } + CloudCanonicalEntityKind::Reaction | CloudCanonicalEntityKind::GroupPhoto + if parent_logical_key_hash.is_none() => + { + return Err(CloudCanonicalValidationFailure::InvalidEnvelope); + } + _ => {} + } + + let mut alias_keys = HashSet::with_capacity(aliases.len()); + for alias in &aliases { + if !alias_keys.insert((alias.kind, alias.key_hash.value())) { + return Err(CloudCanonicalValidationFailure::InvalidEnvelope); + } + } + + Ok(Self { + scope_fingerprint, + zone_fingerprint, + generation, + schema_version, + change_id, + entity_kind, + mutation_kind, + server_record_id_hash, + logical_entity_key_hash, + parent_logical_key_hash, + aliases, + etag_hash, + server_created_at_millis, + server_modified_at_millis, + protected_raw_envelope_reference, + }) + } + + pub(crate) fn validate_active_context( + &self, + expected_scope_fingerprint: &CloudCanonicalHash, + expected_zone_fingerprint: &CloudCanonicalHash, + expected_generation: u64, + ) -> Result<(), CloudCanonicalValidationFailure> { + if &self.scope_fingerprint != expected_scope_fingerprint + || &self.zone_fingerprint != expected_zone_fingerprint + || self.generation != expected_generation + { + return Err(CloudCanonicalValidationFailure::ScopeMismatch); + } + Ok(()) + } + + pub(crate) fn entity_kind(&self) -> CloudCanonicalEntityKind { + self.entity_kind + } + + pub(crate) fn generation(&self) -> u64 { + self.generation + } + + pub(crate) fn change_id(&self) -> &CloudCanonicalHash { + &self.change_id + } + + pub(crate) fn mutation_kind(&self) -> CloudCanonicalMutationKind { + self.mutation_kind + } + + pub(crate) fn logical_entity_key_hash(&self) -> &CloudCanonicalHash { + &self.logical_entity_key_hash + } + + pub(crate) fn etag_hash(&self) -> Option<&CloudCanonicalHash> { + self.etag_hash.as_ref() + } + + pub(crate) fn parent_logical_key_hash(&self) -> Option<&CloudCanonicalHash> { + self.parent_logical_key_hash.as_ref() + } + + pub(crate) fn aliases(&self) -> &[CloudCanonicalAlias] { + &self.aliases + } + + pub(crate) fn protected_raw_envelope_reference(&self) -> &CloudCanonicalProtectedReference { + &self.protected_raw_envelope_reference + } +} + +impl Debug for CloudCanonicalEnvelope { + fn fmt(&self, formatter: &mut Formatter<'_>) -> fmt::Result { + formatter.write_str("CloudCanonicalEnvelope(redacted)") + } +} + +#[derive(Clone, Eq, Hash, PartialEq)] +pub(crate) struct CloudCanonicalEditPartSnapshot { + part_key_hash: CloudCanonicalHash, + revision: u32, + content_digest: CloudCanonicalDigest, + modified_at_millis: i64, +} + +impl CloudCanonicalEditPartSnapshot { + pub(crate) fn new( + part_key_hash: CloudCanonicalHash, + revision: u32, + content_digest: CloudCanonicalDigest, + modified_at_millis: i64, + ) -> Self { + Self { + part_key_hash, + revision, + content_digest, + modified_at_millis, + } + } + + pub(crate) fn revision(&self) -> u32 { + self.revision + } + + pub(crate) fn part_key_hash(&self) -> &CloudCanonicalHash { + &self.part_key_hash + } + + pub(crate) fn content_digest(&self) -> &CloudCanonicalDigest { + &self.content_digest + } + + pub(crate) fn modified_at_millis(&self) -> i64 { + self.modified_at_millis + } +} + +impl Debug for CloudCanonicalEditPartSnapshot { + fn fmt(&self, formatter: &mut Formatter<'_>) -> fmt::Result { + formatter.write_str("CloudCanonicalEditPartSnapshot(redacted)") + } +} + +#[derive(Clone, Eq, PartialEq)] +pub(crate) struct CloudCanonicalSnapshot { + entity_kind: CloudCanonicalEntityKind, + logical_entity_key_hash: CloudCanonicalHash, + parent_logical_key_hash: Option, + immutable_content_digest: Option, + created_at_millis: Option, + read_at_millis: Option, + delivered_at_millis: Option, + edit_parts: Vec, + retracted_at_millis: Option, + group_version: Option, + group_metadata_digest: Option, + etag_hash: Option, + protected_raw_envelope_reference: CloudCanonicalProtectedReference, +} + +impl CloudCanonicalSnapshot { + #[allow(clippy::too_many_arguments)] + pub(crate) fn new( + entity_kind: CloudCanonicalEntityKind, + logical_entity_key_hash: CloudCanonicalHash, + parent_logical_key_hash: Option, + immutable_content_digest: Option, + created_at_millis: Option, + read_at_millis: Option, + delivered_at_millis: Option, + edit_parts: Vec, + retracted_at_millis: Option, + group_version: Option, + group_metadata_digest: Option, + etag_hash: Option, + protected_raw_envelope_reference: CloudCanonicalProtectedReference, + ) -> Result { + if edit_parts.len() > MAX_EDITS + || (entity_kind != CloudCanonicalEntityKind::Message + && (!edit_parts.is_empty() + || read_at_millis.is_some() + || delivered_at_millis.is_some() + || retracted_at_millis.is_some())) + || (entity_kind != CloudCanonicalEntityKind::Chat + && (group_version.is_some() || group_metadata_digest.is_some())) + { + return Err(CloudCanonicalValidationFailure::InvalidSnapshot); + } + + match entity_kind { + CloudCanonicalEntityKind::Chat if parent_logical_key_hash.is_some() => { + return Err(CloudCanonicalValidationFailure::InvalidSnapshot); + } + CloudCanonicalEntityKind::Reaction | CloudCanonicalEntityKind::GroupPhoto + if parent_logical_key_hash.is_none() => + { + return Err(CloudCanonicalValidationFailure::InvalidSnapshot); + } + _ => {} + } + + let mut edit_keys = HashSet::with_capacity(edit_parts.len()); + for edit in &edit_parts { + if !edit_keys.insert((edit.part_key_hash.value(), edit.revision)) { + return Err(CloudCanonicalValidationFailure::InvalidSnapshot); + } + } + + Ok(Self { + entity_kind, + logical_entity_key_hash, + parent_logical_key_hash, + immutable_content_digest, + created_at_millis, + read_at_millis, + delivered_at_millis, + edit_parts, + retracted_at_millis, + group_version, + group_metadata_digest, + etag_hash, + protected_raw_envelope_reference, + }) + } + + fn validate_for_envelope( + &self, + envelope: &CloudCanonicalEnvelope, + ) -> Result<(), CloudCanonicalValidationFailure> { + if self.entity_kind != envelope.entity_kind + || self.logical_entity_key_hash != envelope.logical_entity_key_hash + || self.parent_logical_key_hash != envelope.parent_logical_key_hash + || self.protected_raw_envelope_reference != envelope.protected_raw_envelope_reference + || self.etag_hash != envelope.etag_hash + { + return Err(CloudCanonicalValidationFailure::InvalidSnapshot); + } + Ok(()) + } + + pub(crate) fn edit_parts(&self) -> &[CloudCanonicalEditPartSnapshot] { + &self.edit_parts + } + + pub(crate) fn entity_kind(&self) -> CloudCanonicalEntityKind { + self.entity_kind + } + + pub(crate) fn logical_entity_key_hash(&self) -> &CloudCanonicalHash { + &self.logical_entity_key_hash + } + + pub(crate) fn parent_logical_key_hash(&self) -> Option<&CloudCanonicalHash> { + self.parent_logical_key_hash.as_ref() + } + + pub(crate) fn immutable_content_digest(&self) -> Option<&CloudCanonicalDigest> { + self.immutable_content_digest.as_ref() + } + + pub(crate) fn created_at_millis(&self) -> Option { + self.created_at_millis + } + + pub(crate) fn read_at_millis(&self) -> Option { + self.read_at_millis + } + + pub(crate) fn delivered_at_millis(&self) -> Option { + self.delivered_at_millis + } + + pub(crate) fn retracted_at_millis(&self) -> Option { + self.retracted_at_millis + } + + pub(crate) fn group_version(&self) -> Option { + self.group_version + } + + pub(crate) fn group_metadata_digest(&self) -> Option<&CloudCanonicalDigest> { + self.group_metadata_digest.as_ref() + } + + pub(crate) fn etag_hash(&self) -> Option<&CloudCanonicalHash> { + self.etag_hash.as_ref() + } + + pub(crate) fn protected_raw_envelope_reference(&self) -> &CloudCanonicalProtectedReference { + &self.protected_raw_envelope_reference + } +} + +impl Debug for CloudCanonicalSnapshot { + fn fmt(&self, formatter: &mut Formatter<'_>) -> fmt::Result { + formatter.write_str("CloudCanonicalSnapshot(redacted)") + } +} + +#[derive(Clone, Eq, PartialEq)] +pub(crate) struct CloudCanonicalTombstone { + entity_kind: CloudCanonicalEntityKind, + server_record_id_hash: CloudCanonicalHash, + logical_entity_key_hash: CloudCanonicalHash, + protected_raw_envelope_reference: CloudCanonicalProtectedReference, + deleted_at_millis: Option, + server_confirmed: bool, +} + +impl CloudCanonicalTombstone { + pub(crate) fn new( + entity_kind: CloudCanonicalEntityKind, + server_record_id_hash: CloudCanonicalHash, + logical_entity_key_hash: CloudCanonicalHash, + protected_raw_envelope_reference: CloudCanonicalProtectedReference, + deleted_at_millis: Option, + server_confirmed: bool, + ) -> Result { + if !server_confirmed { + return Err(CloudCanonicalValidationFailure::InvalidTombstone); + } + Ok(Self { + entity_kind, + server_record_id_hash, + logical_entity_key_hash, + protected_raw_envelope_reference, + deleted_at_millis, + server_confirmed, + }) + } + + fn validate_for_envelope( + &self, + envelope: &CloudCanonicalEnvelope, + ) -> Result<(), CloudCanonicalValidationFailure> { + if self.entity_kind != envelope.entity_kind + || self.server_record_id_hash != envelope.server_record_id_hash + || self.logical_entity_key_hash != envelope.logical_entity_key_hash + || self.protected_raw_envelope_reference != envelope.protected_raw_envelope_reference + || self.deleted_at_millis != envelope.server_modified_at_millis + || !self.server_confirmed + { + return Err(CloudCanonicalValidationFailure::InvalidTombstone); + } + Ok(()) + } + + pub(crate) fn deleted_at_millis(&self) -> Option { + self.deleted_at_millis + } + + pub(crate) fn entity_kind(&self) -> CloudCanonicalEntityKind { + self.entity_kind + } + + pub(crate) fn logical_entity_key_hash(&self) -> &CloudCanonicalHash { + &self.logical_entity_key_hash + } + + pub(crate) fn server_confirmed(&self) -> bool { + self.server_confirmed + } +} + +impl Debug for CloudCanonicalTombstone { + fn fmt(&self, formatter: &mut Formatter<'_>) -> fmt::Result { + formatter.write_str("CloudCanonicalTombstone(redacted)") + } +} + +#[derive(Clone, Eq, PartialEq)] +pub(crate) struct CloudCanonicalChatPayload { + guid: String, + chat_identifier: String, + group_id: String, + original_group_id: String, + service: CloudCanonicalService, + style: CloudCanonicalChatStyle, + participant_handles: Vec, + display_name: CloudCanonicalField, + last_addressed_handle: CloudCanonicalField, + group_version: CloudCanonicalField, + last_seen_message_guid: CloudCanonicalField, + group_photo_guid: CloudCanonicalField, +} + +impl CloudCanonicalChatPayload { + #[allow(clippy::too_many_arguments)] + pub(crate) fn new( + guid: String, + chat_identifier: String, + group_id: String, + original_group_id: String, + service: CloudCanonicalService, + style: CloudCanonicalChatStyle, + participant_handles: Vec, + display_name: CloudCanonicalField, + last_addressed_handle: CloudCanonicalField, + group_version: CloudCanonicalField, + last_seen_message_guid: CloudCanonicalField, + group_photo_guid: CloudCanonicalField, + ) -> Result { + for value in [&guid, &chat_identifier, &group_id, &original_group_id] { + validate_identifier(value)?; + } + if participant_handles.len() > MAX_PARTICIPANTS { + return Err(CloudCanonicalValidationFailure::CollectionLimit); + } + for handle in &participant_handles { + validate_identifier(handle)?; + } + validate_optional_text(&display_name)?; + validate_optional_identifier(&last_addressed_handle)?; + validate_optional_identifier(&last_seen_message_guid)?; + validate_optional_identifier(&group_photo_guid)?; + let mut aggregate_bytes = guid + .len() + .checked_add(chat_identifier.len()) + .and_then(|size| size.checked_add(group_id.len())) + .and_then(|size| size.checked_add(original_group_id.len())) + .ok_or(CloudCanonicalValidationFailure::CollectionLimit)?; + for participant in &participant_handles { + aggregate_bytes = aggregate_bytes + .checked_add(participant.len()) + .ok_or(CloudCanonicalValidationFailure::CollectionLimit)?; + } + for field in [ + &display_name, + &last_addressed_handle, + &last_seen_message_guid, + &group_photo_guid, + ] { + aggregate_bytes = aggregate_bytes + .checked_add(field.value().map_or(0, String::len)) + .ok_or(CloudCanonicalValidationFailure::CollectionLimit)?; + } + if aggregate_bytes > MAX_TRANSIENT_AGGREGATE_BYTES { + return Err(CloudCanonicalValidationFailure::CollectionLimit); + } + + Ok(Self { + guid, + chat_identifier, + group_id, + original_group_id, + service, + style, + participant_handles, + display_name, + last_addressed_handle, + group_version, + last_seen_message_guid, + group_photo_guid, + }) + } + + pub(crate) fn display_name_state(&self) -> CloudCanonicalFieldState { + self.display_name.state() + } + + pub(crate) fn guid(&self) -> &str { + &self.guid + } + + pub(crate) fn chat_identifier(&self) -> &str { + &self.chat_identifier + } + + pub(crate) fn group_id(&self) -> &str { + &self.group_id + } + + pub(crate) fn original_group_id(&self) -> &str { + &self.original_group_id + } + + pub(crate) fn service(&self) -> CloudCanonicalService { + self.service + } + + pub(crate) fn style(&self) -> CloudCanonicalChatStyle { + self.style + } + + pub(crate) fn last_addressed_handle_state(&self) -> CloudCanonicalFieldState { + self.last_addressed_handle.state() + } + + pub(crate) fn last_addressed_handle(&self) -> &CloudCanonicalField { + &self.last_addressed_handle + } + + pub(crate) fn group_version_state(&self) -> CloudCanonicalFieldState { + self.group_version.state() + } + + pub(crate) fn group_version(&self) -> &CloudCanonicalField { + &self.group_version + } + + pub(crate) fn last_seen_message_guid_state(&self) -> CloudCanonicalFieldState { + self.last_seen_message_guid.state() + } + + pub(crate) fn last_seen_message_guid(&self) -> &CloudCanonicalField { + &self.last_seen_message_guid + } + + pub(crate) fn group_photo_guid_state(&self) -> CloudCanonicalFieldState { + self.group_photo_guid.state() + } + + pub(crate) fn group_photo_guid(&self) -> &CloudCanonicalField { + &self.group_photo_guid + } + + pub(crate) fn participant_handles(&self) -> &[String] { + &self.participant_handles + } + + pub(crate) fn display_name(&self) -> &CloudCanonicalField { + &self.display_name + } +} + +impl Debug for CloudCanonicalChatPayload { + fn fmt(&self, formatter: &mut Formatter<'_>) -> fmt::Result { + formatter.write_str("CloudCanonicalChatPayload(redacted)") + } +} + +#[derive(Clone, Eq, PartialEq)] +pub(crate) struct CloudCanonicalAttachmentReference { + canonical_guid: String, + logical_key_hash: CloudCanonicalHash, +} + +impl CloudCanonicalAttachmentReference { + pub(crate) fn new( + canonical_guid: String, + logical_key_hash: CloudCanonicalHash, + ) -> Result { + validate_identifier(&canonical_guid)?; + Ok(Self { + canonical_guid, + logical_key_hash, + }) + } + + pub(crate) fn canonical_guid(&self) -> &str { + &self.canonical_guid + } + + pub(crate) fn logical_key_hash(&self) -> &CloudCanonicalHash { + &self.logical_key_hash + } +} + +impl Debug for CloudCanonicalAttachmentReference { + fn fmt(&self, formatter: &mut Formatter<'_>) -> fmt::Result { + formatter.write_str("CloudCanonicalAttachmentReference(redacted)") + } +} + +#[derive(Clone, Eq, PartialEq)] +pub(crate) struct CloudCanonicalTextRun { + start_utf16: u32, + length_utf16: u32, + message_part: Option, + attachment: Option, + mention: Option, + audio_transcript: Option, + text_effect: Option, + bold: Option, + italic: Option, + strikethrough: Option, + underline: Option, +} + +impl CloudCanonicalTextRun { + #[allow(clippy::too_many_arguments)] + pub(crate) fn new( + start_utf16: u32, + length_utf16: u32, + message_part: Option, + attachment: Option, + mention: Option, + audio_transcript: Option, + text_effect: Option, + bold: Option, + italic: Option, + strikethrough: Option, + underline: Option, + ) -> Result { + if start_utf16.checked_add(length_utf16).is_none() { + return Err(CloudCanonicalValidationFailure::InvalidRange); + } + if let Some(mention) = &mention { + validate_identifier(mention)?; + } + if let Some(transcript) = &audio_transcript { + validate_text(transcript)?; + } + Ok(Self { + start_utf16, + length_utf16, + message_part, + attachment, + mention, + audio_transcript, + text_effect, + bold, + italic, + strikethrough, + underline, + }) + } + + fn transient_size(&self) -> Option<(usize, usize)> { + let bytes = self + .mention + .as_ref() + .map_or(0, String::len) + .checked_add(self.audio_transcript.as_ref().map_or(0, String::len))?; + Some((bytes, 1)) + } + + pub(crate) fn message_part(&self) -> Option { + self.message_part + } + + pub(crate) fn start_utf16(&self) -> u32 { + self.start_utf16 + } + + pub(crate) fn length_utf16(&self) -> u32 { + self.length_utf16 + } + + pub(crate) fn attachment(&self) -> Option<&CloudCanonicalAttachmentReference> { + self.attachment.as_ref() + } + + pub(crate) fn mention(&self) -> Option<&str> { + self.mention.as_deref() + } + + pub(crate) fn audio_transcript(&self) -> Option<&str> { + self.audio_transcript.as_deref() + } + + pub(crate) fn text_effect(&self) -> Option { + self.text_effect + } + + pub(crate) fn bold(&self) -> Option { + self.bold + } + + pub(crate) fn italic(&self) -> Option { + self.italic + } + + pub(crate) fn strikethrough(&self) -> Option { + self.strikethrough + } + + pub(crate) fn underline(&self) -> Option { + self.underline + } + + pub(crate) fn has_attachment(&self) -> bool { + self.attachment.is_some() + } +} + +impl Debug for CloudCanonicalTextRun { + fn fmt(&self, formatter: &mut Formatter<'_>) -> fmt::Result { + formatter.write_str("CloudCanonicalTextRun(redacted)") + } +} + +#[derive(Clone, Eq, PartialEq)] +pub(crate) struct CloudCanonicalAttributedBody { + text: String, + runs: Vec, +} + +impl CloudCanonicalAttributedBody { + pub(crate) fn new( + text: String, + runs: Vec, + ) -> Result { + validate_text(&text)?; + if runs.len() > MAX_RUNS_PER_BODY { + return Err(CloudCanonicalValidationFailure::CollectionLimit); + } + let utf16_length = text.encode_utf16().count(); + for run in &runs { + let end = run + .start_utf16 + .checked_add(run.length_utf16) + .ok_or(CloudCanonicalValidationFailure::InvalidRange)?; + if end as usize > utf16_length { + return Err(CloudCanonicalValidationFailure::InvalidRange); + } + } + Ok(Self { text, runs }) + } + + fn transient_size(&self) -> Option<(usize, usize)> { + let mut bytes = self.text.len(); + let mut elements = 1usize; + for run in &self.runs { + let (run_bytes, run_elements) = run.transient_size()?; + bytes = bytes.checked_add(run_bytes)?; + elements = elements.checked_add(run_elements)?; + } + Some((bytes, elements)) + } + + pub(crate) fn text_utf16_length(&self) -> usize { + self.text.encode_utf16().count() + } + + pub(crate) fn text(&self) -> &str { + &self.text + } + + pub(crate) fn runs(&self) -> &[CloudCanonicalTextRun] { + &self.runs + } +} + +impl Debug for CloudCanonicalAttributedBody { + fn fmt(&self, formatter: &mut Formatter<'_>) -> fmt::Result { + formatter.write_str("CloudCanonicalAttributedBody(redacted)") + } +} + +#[derive(Clone, Eq, PartialEq)] +pub(crate) struct CloudCanonicalParentReference { + parent_guid: String, + /// Absent when the reaction targets the whole message rather than a part. + parent_part: Option, + parent_logical_key_hash: CloudCanonicalHash, + range_location: Option, + range_length: Option, +} + +impl CloudCanonicalParentReference { + pub(crate) fn new( + parent_guid: String, + parent_part: Option, + parent_logical_key_hash: CloudCanonicalHash, + range_location: Option, + range_length: Option, + ) -> Result { + validate_identifier(&parent_guid)?; + if range_location.is_some() != range_length.is_some() + || range_location + .zip(range_length) + .is_some_and(|(start, length)| start.checked_add(length).is_none()) + { + return Err(CloudCanonicalValidationFailure::InvalidRange); + } + Ok(Self { + parent_guid, + parent_part, + parent_logical_key_hash, + range_location, + range_length, + }) + } + + pub(crate) fn parent_hash(&self) -> &CloudCanonicalHash { + &self.parent_logical_key_hash + } + + pub(crate) fn parent_guid(&self) -> &str { + &self.parent_guid + } + + pub(crate) fn parent_part(&self) -> Option { + self.parent_part + } + + pub(crate) fn range_location(&self) -> Option { + self.range_location + } + + pub(crate) fn range_length(&self) -> Option { + self.range_length + } +} + +impl Debug for CloudCanonicalParentReference { + fn fmt(&self, formatter: &mut Formatter<'_>) -> fmt::Result { + formatter.write_str("CloudCanonicalParentReference(redacted)") + } +} + +#[derive(Clone, Eq, PartialEq)] +pub(crate) struct CloudCanonicalReplyReference { + parent_guid: String, + parent_part: String, + parent_logical_key_hash: CloudCanonicalHash, +} + +impl CloudCanonicalReplyReference { + pub(crate) fn new( + parent_guid: String, + parent_part: String, + parent_logical_key_hash: CloudCanonicalHash, + ) -> Result { + validate_identifier(&parent_guid)?; + validate_identifier(&parent_part)?; + if parent_guid.contains(':') || parent_part.contains(':') { + return Err(CloudCanonicalValidationFailure::AmbiguousReplyParent); + } + Ok(Self { + parent_guid, + parent_part, + parent_logical_key_hash, + }) + } + + pub(crate) fn parent_hash(&self) -> &CloudCanonicalHash { + &self.parent_logical_key_hash + } + + pub(crate) fn parent_guid(&self) -> &str { + &self.parent_guid + } + + pub(crate) fn parent_part(&self) -> &str { + &self.parent_part + } +} + +impl Debug for CloudCanonicalReplyReference { + fn fmt(&self, formatter: &mut Formatter<'_>) -> fmt::Result { + formatter.write_str("CloudCanonicalReplyReference(redacted)") + } +} + +#[derive(Clone, Eq, PartialEq)] +pub(crate) enum CloudCanonicalMessageAssociation { + None, + Sticker(CloudCanonicalParentReference), + ReactionAdd { + kind: CloudCanonicalReactionKind, + parent: CloudCanonicalParentReference, + }, + ReactionRemove { + kind: CloudCanonicalReactionKind, + parent: CloudCanonicalParentReference, + }, +} + +impl CloudCanonicalMessageAssociation { + fn entity_kind(&self) -> CloudCanonicalEntityKind { + match self { + Self::ReactionAdd { .. } | Self::ReactionRemove { .. } => { + CloudCanonicalEntityKind::Reaction + } + Self::None | Self::Sticker(_) => CloudCanonicalEntityKind::Message, + } + } + + fn parent_hash(&self) -> Option<&CloudCanonicalHash> { + match self { + Self::None => None, + Self::Sticker(parent) + | Self::ReactionAdd { parent, .. } + | Self::ReactionRemove { parent, .. } => Some(&parent.parent_logical_key_hash), + } + } + + pub(crate) fn is_reaction(&self) -> bool { + matches!(self, Self::ReactionAdd { .. } | Self::ReactionRemove { .. }) + } + + pub(crate) fn reaction( + &self, + ) -> Option<( + CloudCanonicalReactionKind, + &CloudCanonicalParentReference, + bool, + )> { + match self { + Self::ReactionAdd { kind, parent } => Some((*kind, parent, false)), + Self::ReactionRemove { kind, parent } => Some((*kind, parent, true)), + Self::None | Self::Sticker(_) => None, + } + } + + pub(crate) fn sticker(&self) -> Option<&CloudCanonicalParentReference> { + match self { + Self::Sticker(parent) => Some(parent), + Self::None | Self::ReactionAdd { .. } | Self::ReactionRemove { .. } => None, + } + } + + pub(crate) fn is_sticker(&self) -> bool { + matches!(self, Self::Sticker(_)) + } +} + +impl Debug for CloudCanonicalMessageAssociation { + fn fmt(&self, formatter: &mut Formatter<'_>) -> fmt::Result { + let label = match self { + Self::None => "none", + Self::Sticker(_) => "sticker-redacted", + Self::ReactionAdd { .. } => "reaction-add-redacted", + Self::ReactionRemove { .. } => "reaction-remove-redacted", + }; + formatter + .debug_tuple("CloudCanonicalMessageAssociation") + .field(&label) + .finish() + } +} + +#[derive(Clone, Copy, Debug, Default, Eq, PartialEq)] +pub(crate) struct CloudCanonicalKnownMessageFlags { + pub(crate) from_me: bool, + pub(crate) delivered: bool, + pub(crate) read: bool, + pub(crate) has_data_detector_results: bool, + pub(crate) delivered_quietly: bool, + pub(crate) did_notify_recipient: bool, +} + +#[derive(Clone, Eq, PartialEq)] +pub(crate) struct CloudCanonicalMessageEdit { + part: u32, + revision: u32, + bodies: Vec, + modified_at_millis: i64, + original_range: Option<(u32, u32)>, +} + +impl CloudCanonicalMessageEdit { + pub(crate) fn new( + part: u32, + revision: u32, + bodies: Vec, + modified_at_millis: i64, + original_range: Option<(u32, u32)>, + ) -> Result { + if bodies.is_empty() || bodies.len() > MAX_ATTRIBUTED_BODIES { + return Err(CloudCanonicalValidationFailure::InvalidPayload); + } + if original_range.is_some_and(|(start, length)| start.checked_add(length).is_none()) { + return Err(CloudCanonicalValidationFailure::InvalidRange); + } + Ok(Self { + part, + revision, + bodies, + modified_at_millis, + original_range, + }) + } + + fn transient_size(&self) -> Option<(usize, usize)> { + let mut bytes = 0usize; + let mut elements = 1usize; + for body in &self.bodies { + let (body_bytes, body_elements) = body.transient_size()?; + bytes = bytes.checked_add(body_bytes)?; + elements = elements.checked_add(body_elements)?; + } + Some((bytes, elements)) + } + + pub(crate) fn part(&self) -> u32 { + self.part + } + + pub(crate) fn revision(&self) -> u32 { + self.revision + } + + pub(crate) fn modified_at_millis(&self) -> i64 { + self.modified_at_millis + } + + pub(crate) fn bodies(&self) -> &[CloudCanonicalAttributedBody] { + &self.bodies + } + + pub(crate) fn original_range(&self) -> Option<(u32, u32)> { + self.original_range + } +} + +impl Debug for CloudCanonicalMessageEdit { + fn fmt(&self, formatter: &mut Formatter<'_>) -> fmt::Result { + formatter.write_str("CloudCanonicalMessageEdit(redacted)") + } +} + +#[derive(Clone, Eq, PartialEq)] +pub(crate) struct CloudCanonicalMessagePayload { + guid: String, + chat_identifier: String, + chat_alias_key_hash: CloudCanonicalHash, + sender_handle: String, + created_at_millis: i64, + error: i64, + service: CloudCanonicalService, + subject: CloudCanonicalField, + text: CloudCanonicalField, + attributed_bodies: CloudCanonicalField>, + balloon_bundle_id: CloudCanonicalField, + decoded_extension_payload: CloudCanonicalField>, + effect: CloudCanonicalField, + read_at_millis: CloudCanonicalField, + delivered_at_millis: CloudCanonicalField, + flags: CloudCanonicalKnownMessageFlags, + association: CloudCanonicalMessageAssociation, + reply: Option, + edits: CloudCanonicalField>, + retracted_parts: CloudCanonicalField>, + associated_emoji: CloudCanonicalField, +} + +impl CloudCanonicalMessagePayload { + #[allow(clippy::too_many_arguments)] + pub(crate) fn new( + guid: String, + chat_identifier: String, + chat_alias_key_hash: CloudCanonicalHash, + sender_handle: String, + created_at_millis: i64, + error: i64, + service: CloudCanonicalService, + subject: CloudCanonicalField, + text: CloudCanonicalField, + attributed_bodies: CloudCanonicalField>, + balloon_bundle_id: CloudCanonicalField, + decoded_extension_payload: CloudCanonicalField>, + effect: CloudCanonicalField, + read_at_millis: CloudCanonicalField, + delivered_at_millis: CloudCanonicalField, + flags: CloudCanonicalKnownMessageFlags, + association: CloudCanonicalMessageAssociation, + reply: Option, + edits: CloudCanonicalField>, + retracted_parts: CloudCanonicalField>, + associated_emoji: CloudCanonicalField, + ) -> Result { + validate_identifier(&guid)?; + validate_identifier(&chat_identifier)?; + if !sender_handle.is_empty() { + validate_identifier(&sender_handle)?; + } + validate_optional_text(&subject)?; + validate_optional_text(&text)?; + validate_optional_identifier(&balloon_bundle_id)?; + validate_optional_identifier(&effect)?; + validate_optional_text(&associated_emoji)?; + if decoded_extension_payload + .value() + .is_some_and(|payload| payload.len() > MAX_BINARY_PAYLOAD_BYTES) + || attributed_bodies + .value() + .is_some_and(|bodies| bodies.len() > MAX_ATTRIBUTED_BODIES) + || edits.value().is_some_and(|edits| edits.len() > MAX_EDITS) + || retracted_parts + .value() + .is_some_and(|parts| parts.len() > MAX_RETRACTED_PARTS) + { + return Err(CloudCanonicalValidationFailure::CollectionLimit); + } + if let Some(edits) = edits.value() { + let mut edit_keys = HashSet::with_capacity(edits.len()); + for edit in edits { + if !edit_keys.insert((edit.part, edit.revision)) { + return Err(CloudCanonicalValidationFailure::InvalidPayload); + } + } + } + if let Some(retracted_parts) = retracted_parts.value() { + let mut retracted = HashSet::with_capacity(retracted_parts.len()); + if retracted_parts.iter().any(|part| !retracted.insert(*part)) { + return Err(CloudCanonicalValidationFailure::InvalidPayload); + } + } + if (!matches!(&association, CloudCanonicalMessageAssociation::None) && reply.is_some()) + || (association.is_reaction() + && (!matches!(&edits, CloudCanonicalField::Absent) + || !matches!(&retracted_parts, CloudCanonicalField::Absent))) + { + return Err(CloudCanonicalValidationFailure::InvalidPayload); + } + let emoji_association = matches!( + association, + CloudCanonicalMessageAssociation::ReactionAdd { + kind: CloudCanonicalReactionKind::Emoji, + .. + } | CloudCanonicalMessageAssociation::ReactionRemove { + kind: CloudCanonicalReactionKind::Emoji, + .. + } + ); + if emoji_association + != matches!( + associated_emoji, + CloudCanonicalField::Value(ref value) if !value.is_empty() + ) + { + return Err(CloudCanonicalValidationFailure::InvalidPayload); + } + + let mut aggregate_bytes = guid + .len() + .checked_add(chat_identifier.len()) + .ok_or(CloudCanonicalValidationFailure::CollectionLimit)? + .checked_add(sender_handle.len()) + .ok_or(CloudCanonicalValidationFailure::CollectionLimit)?; + for field in [ + &subject, + &text, + &balloon_bundle_id, + &effect, + &associated_emoji, + ] { + aggregate_bytes = aggregate_bytes + .checked_add(field.value().map_or(0, String::len)) + .ok_or(CloudCanonicalValidationFailure::CollectionLimit)?; + } + aggregate_bytes = aggregate_bytes + .checked_add(decoded_extension_payload.value().map_or(0, Vec::len)) + .ok_or(CloudCanonicalValidationFailure::CollectionLimit)?; + let mut aggregate_elements = retracted_parts.value().map_or(0, Vec::len); + if let Some(bodies) = attributed_bodies.value() { + for body in bodies { + let (bytes, elements) = body + .transient_size() + .ok_or(CloudCanonicalValidationFailure::CollectionLimit)?; + aggregate_bytes = aggregate_bytes + .checked_add(bytes) + .ok_or(CloudCanonicalValidationFailure::CollectionLimit)?; + aggregate_elements = aggregate_elements + .checked_add(elements) + .ok_or(CloudCanonicalValidationFailure::CollectionLimit)?; + } + } + if let Some(edits) = edits.value() { + for edit in edits { + let (bytes, elements) = edit + .transient_size() + .ok_or(CloudCanonicalValidationFailure::CollectionLimit)?; + aggregate_bytes = aggregate_bytes + .checked_add(bytes) + .ok_or(CloudCanonicalValidationFailure::CollectionLimit)?; + aggregate_elements = aggregate_elements + .checked_add(elements) + .ok_or(CloudCanonicalValidationFailure::CollectionLimit)?; + } + } + if aggregate_bytes > MAX_TRANSIENT_AGGREGATE_BYTES + || aggregate_elements > MAX_TRANSIENT_COLLECTION_ELEMENTS + { + return Err(CloudCanonicalValidationFailure::CollectionLimit); + } + + Ok(Self { + guid, + chat_identifier, + chat_alias_key_hash, + sender_handle, + created_at_millis, + error, + service, + subject, + text, + attributed_bodies, + balloon_bundle_id, + decoded_extension_payload, + effect, + read_at_millis, + delivered_at_millis, + flags, + association, + reply, + edits, + retracted_parts, + associated_emoji, + }) + } + + fn entity_kind(&self) -> CloudCanonicalEntityKind { + self.association.entity_kind() + } + + fn parent_hash(&self) -> Option<&CloudCanonicalHash> { + self.association.parent_hash().or_else(|| { + self.reply + .as_ref() + .map(CloudCanonicalReplyReference::parent_hash) + }) + } + + pub(crate) fn text_state(&self) -> CloudCanonicalFieldState { + self.text.state() + } + + pub(crate) fn guid(&self) -> &str { + &self.guid + } + + pub(crate) fn chat_identifier(&self) -> &str { + &self.chat_identifier + } + + pub(crate) fn association(&self) -> &CloudCanonicalMessageAssociation { + &self.association + } + + pub(crate) fn reply(&self) -> Option<&CloudCanonicalReplyReference> { + self.reply.as_ref() + } + + pub(crate) fn attributed_bodies_state(&self) -> CloudCanonicalFieldState { + self.attributed_bodies.state() + } + + pub(crate) fn edits_state(&self) -> CloudCanonicalFieldState { + self.edits.state() + } + + pub(crate) fn edit_count(&self) -> usize { + self.edits.value().map_or(0, Vec::len) + } + + pub(crate) fn attributed_bodies(&self) -> &[CloudCanonicalAttributedBody] { + self.attributed_bodies + .value() + .map(Vec::as_slice) + .unwrap_or_default() + } + + pub(crate) fn edits(&self) -> &[CloudCanonicalMessageEdit] { + self.edits.value().map(Vec::as_slice).unwrap_or_default() + } + + pub(crate) fn retracted_parts_state(&self) -> CloudCanonicalFieldState { + self.retracted_parts.state() + } + + pub(crate) fn retracted_parts(&self) -> &[u32] { + self.retracted_parts + .value() + .map(Vec::as_slice) + .unwrap_or_default() + } + + pub(crate) fn chat_alias_key_hash(&self) -> &CloudCanonicalHash { + &self.chat_alias_key_hash + } + + pub(crate) fn sender_handle(&self) -> &str { + &self.sender_handle + } + + pub(crate) fn created_at_millis(&self) -> i64 { + self.created_at_millis + } + + pub(crate) fn error(&self) -> i64 { + self.error + } + + pub(crate) fn service(&self) -> CloudCanonicalService { + self.service + } + + pub(crate) fn subject(&self) -> &CloudCanonicalField { + &self.subject + } + + pub(crate) fn text(&self) -> &CloudCanonicalField { + &self.text + } + + pub(crate) fn balloon_bundle_id(&self) -> &CloudCanonicalField { + &self.balloon_bundle_id + } + + pub(crate) fn decoded_extension_payload(&self) -> &CloudCanonicalField> { + &self.decoded_extension_payload + } + + pub(crate) fn effect(&self) -> &CloudCanonicalField { + &self.effect + } + + pub(crate) fn read_at_millis(&self) -> &CloudCanonicalField { + &self.read_at_millis + } + + pub(crate) fn delivered_at_millis(&self) -> &CloudCanonicalField { + &self.delivered_at_millis + } + + pub(crate) fn flags(&self) -> CloudCanonicalKnownMessageFlags { + self.flags + } + + pub(crate) fn associated_emoji(&self) -> &CloudCanonicalField { + &self.associated_emoji + } +} + +impl Debug for CloudCanonicalMessagePayload { + fn fmt(&self, formatter: &mut Formatter<'_>) -> fmt::Result { + formatter.write_str("CloudCanonicalMessagePayload(redacted)") + } +} + +#[derive(Clone, Eq, PartialEq)] +pub(crate) struct CloudCanonicalAttachmentPayload { + canonical_guid: String, + owner_message_guid: Option, + owner_message_key_hash: Option, + owner_part: Option, + uti: CloudCanonicalField, + mime_type: CloudCanonicalField, + transfer_name: CloudCanonicalField, + total_bytes: CloudCanonicalField, + is_outgoing: CloudCanonicalField, + verified_local_file_reference: CloudCanonicalField, +} + +impl CloudCanonicalAttachmentPayload { + #[allow(clippy::too_many_arguments)] + pub(crate) fn new( + canonical_guid: String, + owner_message_guid: Option, + owner_message_key_hash: Option, + owner_part: Option, + uti: CloudCanonicalField, + mime_type: CloudCanonicalField, + transfer_name: CloudCanonicalField, + total_bytes: CloudCanonicalField, + is_outgoing: CloudCanonicalField, + verified_local_file_reference: CloudCanonicalField, + ) -> Result { + validate_identifier(&canonical_guid)?; + if owner_message_guid.is_some() != owner_message_key_hash.is_some() + || owner_message_key_hash.is_some() != owner_part.is_some() + { + return Err(CloudCanonicalValidationFailure::InvalidPayload); + } + if let Some(owner_message_guid) = &owner_message_guid { + validate_identifier(owner_message_guid)?; + } + validate_optional_identifier(&uti)?; + validate_optional_identifier(&mime_type)?; + validate_optional_text(&transfer_name)?; + let aggregate_bytes = canonical_guid + .len() + .checked_add(owner_message_guid.as_ref().map_or(0, String::len)) + .ok_or(CloudCanonicalValidationFailure::CollectionLimit)? + .checked_add(uti.value().map_or(0, String::len)) + .and_then(|size| size.checked_add(mime_type.value().map_or(0, String::len))) + .and_then(|size| size.checked_add(transfer_name.value().map_or(0, String::len))) + .ok_or(CloudCanonicalValidationFailure::CollectionLimit)?; + if aggregate_bytes > MAX_TRANSIENT_AGGREGATE_BYTES { + return Err(CloudCanonicalValidationFailure::CollectionLimit); + } + Ok(Self { + canonical_guid, + owner_message_guid, + owner_message_key_hash, + owner_part, + uti, + mime_type, + transfer_name, + total_bytes, + is_outgoing, + verified_local_file_reference, + }) + } + + fn parent_hash(&self) -> Option<&CloudCanonicalHash> { + self.owner_message_key_hash.as_ref() + } + + pub(crate) fn canonical_guid(&self) -> &str { + &self.canonical_guid + } + + pub(crate) fn owner_part(&self) -> Option { + self.owner_part + } + + pub(crate) fn owner_message_guid(&self) -> Option<&str> { + self.owner_message_guid.as_deref() + } + + pub(crate) fn owner_message_key_hash(&self) -> Option<&CloudCanonicalHash> { + self.owner_message_key_hash.as_ref() + } + + pub(crate) fn uti(&self) -> &CloudCanonicalField { + &self.uti + } + + pub(crate) fn mime_type(&self) -> &CloudCanonicalField { + &self.mime_type + } + + pub(crate) fn transfer_name(&self) -> &CloudCanonicalField { + &self.transfer_name + } + + pub(crate) fn total_bytes(&self) -> &CloudCanonicalField { + &self.total_bytes + } + + pub(crate) fn is_outgoing(&self) -> &CloudCanonicalField { + &self.is_outgoing + } + + pub(crate) fn verified_local_file_reference( + &self, + ) -> &CloudCanonicalField { + &self.verified_local_file_reference + } +} + +impl Debug for CloudCanonicalAttachmentPayload { + fn fmt(&self, formatter: &mut Formatter<'_>) -> fmt::Result { + formatter.write_str("CloudCanonicalAttachmentPayload(redacted)") + } +} + +#[derive(Clone, Eq, PartialEq)] +pub(crate) struct CloudCanonicalGroupPhotoPayload { + chat_key_hash: CloudCanonicalHash, + photo_key_hash: CloudCanonicalHash, + photo_guid: String, + verified_local_file_reference: CloudCanonicalProtectedReference, +} + +impl CloudCanonicalGroupPhotoPayload { + pub(crate) fn new( + chat_key_hash: CloudCanonicalHash, + photo_key_hash: CloudCanonicalHash, + photo_guid: String, + verified_local_file_reference: CloudCanonicalProtectedReference, + ) -> Result { + validate_identifier(&photo_guid)?; + if chat_key_hash == photo_key_hash { + return Err(CloudCanonicalValidationFailure::InvalidPayload); + } + Ok(Self { + chat_key_hash, + photo_key_hash, + photo_guid, + verified_local_file_reference, + }) + } + + fn parent_hash(&self) -> &CloudCanonicalHash { + &self.chat_key_hash + } + + pub(crate) fn chat_key_hash(&self) -> &CloudCanonicalHash { + &self.chat_key_hash + } + + pub(crate) fn photo_guid(&self) -> &str { + &self.photo_guid + } + + pub(crate) fn verified_local_file_reference(&self) -> &CloudCanonicalProtectedReference { + &self.verified_local_file_reference + } +} + +impl Debug for CloudCanonicalGroupPhotoPayload { + fn fmt(&self, formatter: &mut Formatter<'_>) -> fmt::Result { + formatter.write_str("CloudCanonicalGroupPhotoPayload(redacted)") + } +} + +#[derive(Clone, Eq, PartialEq)] +pub(crate) enum CloudCanonicalPayload { + Chat(Box), + Message(Box), + Attachment(Box), + GroupPhoto(Box), +} + +impl CloudCanonicalPayload { + fn entity_kind(&self) -> CloudCanonicalEntityKind { + match self { + Self::Chat(_) => CloudCanonicalEntityKind::Chat, + Self::Message(payload) => payload.entity_kind(), + Self::Attachment(_) => CloudCanonicalEntityKind::Attachment, + Self::GroupPhoto(_) => CloudCanonicalEntityKind::GroupPhoto, + } + } + + fn parent_hash(&self) -> Option<&CloudCanonicalHash> { + match self { + Self::Chat(_) => None, + Self::Message(payload) => payload.parent_hash(), + Self::Attachment(payload) => payload.parent_hash(), + Self::GroupPhoto(payload) => Some(payload.parent_hash()), + } + } +} + +impl Debug for CloudCanonicalPayload { + fn fmt(&self, formatter: &mut Formatter<'_>) -> fmt::Result { + let label = match self { + Self::Chat(_) => "chat-redacted", + Self::Message(_) => "message-redacted", + Self::Attachment(_) => "attachment-redacted", + Self::GroupPhoto(_) => "group-photo-redacted", + }; + formatter + .debug_tuple("CloudCanonicalPayload") + .field(&label) + .finish() + } +} + +#[derive(Clone, Eq, PartialEq)] +pub(crate) struct CloudCanonicalMutation { + envelope: CloudCanonicalEnvelope, + snapshot: Option, + payload: Option, + tombstone: Option, +} + +impl CloudCanonicalMutation { + pub(crate) fn new( + envelope: CloudCanonicalEnvelope, + snapshot: Option, + payload: Option, + tombstone: Option, + ) -> Result { + match envelope.mutation_kind { + CloudCanonicalMutationKind::Upsert => { + let snapshot = snapshot + .as_ref() + .ok_or(CloudCanonicalValidationFailure::InvalidEnvelope)?; + let payload = payload + .as_ref() + .ok_or(CloudCanonicalValidationFailure::InvalidEnvelope)?; + if tombstone.is_some() + || payload.entity_kind() != envelope.entity_kind + || payload.parent_hash() != envelope.parent_logical_key_hash.as_ref() + { + return Err(CloudCanonicalValidationFailure::InvalidPayload); + } + snapshot.validate_for_envelope(&envelope)?; + } + CloudCanonicalMutationKind::Tombstone => { + let tombstone = tombstone + .as_ref() + .ok_or(CloudCanonicalValidationFailure::InvalidTombstone)?; + if snapshot.is_some() || payload.is_some() { + return Err(CloudCanonicalValidationFailure::InvalidTombstone); + } + tombstone.validate_for_envelope(&envelope)?; + } + } + Ok(Self { + envelope, + snapshot, + payload, + tombstone, + }) + } + + pub(crate) fn validate_active_context( + &self, + expected_scope_fingerprint: &CloudCanonicalHash, + expected_zone_fingerprint: &CloudCanonicalHash, + expected_generation: u64, + ) -> Result<(), CloudCanonicalValidationFailure> { + self.envelope.validate_active_context( + expected_scope_fingerprint, + expected_zone_fingerprint, + expected_generation, + ) + } + + pub(crate) fn envelope(&self) -> &CloudCanonicalEnvelope { + &self.envelope + } + + pub(crate) fn payload(&self) -> Option<&CloudCanonicalPayload> { + self.payload.as_ref() + } + + pub(crate) fn snapshot(&self) -> Option<&CloudCanonicalSnapshot> { + self.snapshot.as_ref() + } + + pub(crate) fn tombstone(&self) -> Option<&CloudCanonicalTombstone> { + self.tombstone.as_ref() + } +} + +impl Debug for CloudCanonicalMutation { + fn fmt(&self, formatter: &mut Formatter<'_>) -> fmt::Result { + formatter.write_str("CloudCanonicalMutation(redacted)") + } +} + +#[derive(Clone, Eq, PartialEq)] +pub(crate) struct ParsedOwnedAttachment { + message_guid: String, + part: u32, + canonical_guid: String, +} + +impl Debug for ParsedOwnedAttachment { + fn fmt(&self, formatter: &mut Formatter<'_>) -> fmt::Result { + formatter.write_str("ParsedOwnedAttachment(redacted)") + } +} + +pub(crate) fn parse_owned_attachment_guid( + value: &str, +) -> Result { + let body = value + .strip_prefix("at_") + .ok_or(CloudCanonicalValidationFailure::MalformedAttachmentOwner)?; + let (part, message_guid) = body + .split_once('_') + .ok_or(CloudCanonicalValidationFailure::MalformedAttachmentOwner)?; + if part.is_empty() + || !part.bytes().all(|byte| byte.is_ascii_digit()) + || (part.len() > 1 && part.starts_with('0')) + || message_guid.is_empty() + || message_guid.contains('/') + { + return Err(CloudCanonicalValidationFailure::MalformedAttachmentOwner); + } + let part = part + .parse::() + .map_err(|_| CloudCanonicalValidationFailure::MalformedAttachmentOwner)?; + validate_identifier(message_guid) + .map_err(|_| CloudCanonicalValidationFailure::MalformedAttachmentOwner)?; + Ok(ParsedOwnedAttachment { + message_guid: message_guid.to_owned(), + part, + canonical_guid: format!("{message_guid}_{part}"), + }) +} + +impl ParsedOwnedAttachment { + pub(crate) fn message_guid(&self) -> &str { + &self.message_guid + } + + pub(crate) fn part(&self) -> u32 { + self.part + } + + pub(crate) fn canonical_guid(&self) -> &str { + &self.canonical_guid + } +} + +#[derive(Clone, Eq, PartialEq)] +pub(crate) struct ParsedAssociatedParent { + parent_guid: String, + /// Absent when Apple sent a bare GUID, meaning the reaction targets the + /// message rather than one of its parts. + parent_part: Option, +} + +impl Debug for ParsedAssociatedParent { + fn fmt(&self, formatter: &mut Formatter<'_>) -> fmt::Result { + formatter.write_str("ParsedAssociatedParent(redacted)") + } +} + +pub(crate) fn parse_associated_parent( + value: &str, +) -> Result { + // Apple omits the wrapper entirely when a reaction targets no particular + // part, so a bare GUID is the ordinary partless encoding rather than a + // malformed value. Requiring the prefix quarantined every such reaction. + // + // A bare GUID must still carry no structure of its own: `validate_identifier` + // only rejects empty, oversized, and NUL-bearing values, so without this + // check a malformed wrapper like `0/` or `bp:0/` would be + // accepted whole as if it were the parent identifier. + // Apple uses `p:` for an ordinary message part and `bp:` for a bubble or + // tapback message. Both name the same thing, a parent GUID and a part, and + // the app's own JSON ingestion path has always stripped `bp:` for exactly + // that reason. Rejecting it dropped the association. + // + // `bpdi:` is deliberately not accepted. That is the balloon payload MMCS + // reference, not a parent. + let stripped = value + .strip_prefix("p:") + .or_else(|| value.strip_prefix("bp:")); + let Some(body) = stripped else { + if value.contains('/') || value.contains(':') { + return Err(CloudCanonicalValidationFailure::MalformedAssociatedParent); + } + validate_identifier(value) + .map_err(|_| CloudCanonicalValidationFailure::MalformedAssociatedParent)?; + return Ok(ParsedAssociatedParent { + parent_guid: value.to_owned(), + parent_part: None, + }); + }; + let (part, parent_guid) = body + .split_once('/') + .ok_or(CloudCanonicalValidationFailure::MalformedAssociatedParent)?; + if part.is_empty() + || !part.bytes().all(|byte| byte.is_ascii_digit()) + || (part.len() > 1 && part.starts_with('0')) + || parent_guid.is_empty() + || parent_guid.contains('/') + { + return Err(CloudCanonicalValidationFailure::MalformedAssociatedParent); + } + let parent_part = part + .parse::() + .map_err(|_| CloudCanonicalValidationFailure::MalformedAssociatedParent)?; + validate_identifier(parent_guid) + .map_err(|_| CloudCanonicalValidationFailure::MalformedAssociatedParent)?; + Ok(ParsedAssociatedParent { + parent_guid: parent_guid.to_owned(), + parent_part: Some(parent_part), + }) +} + +impl ParsedAssociatedParent { + pub(crate) fn parent_guid(&self) -> &str { + &self.parent_guid + } + + pub(crate) fn parent_part(&self) -> Option { + self.parent_part + } +} + +#[derive(Clone, Eq, PartialEq)] +pub(crate) struct ParsedReplyParent { + parent_guid: String, + parent_part: String, +} + +impl Debug for ParsedReplyParent { + fn fmt(&self, formatter: &mut Formatter<'_>) -> fmt::Result { + formatter.write_str("ParsedReplyParent(redacted)") + } +} + +pub(crate) fn parse_reply_parent( + value: &str, +) -> Result { + let body = value + .strip_prefix("r:") + .ok_or(CloudCanonicalValidationFailure::MalformedReplyParent)?; + let mut parts = body.split(':'); + let parent_part = parts + .next() + .ok_or(CloudCanonicalValidationFailure::MalformedReplyParent)?; + let parent_guid = parts + .next() + .ok_or(CloudCanonicalValidationFailure::MalformedReplyParent)?; + if parts.next().is_some() { + return Err(CloudCanonicalValidationFailure::AmbiguousReplyParent); + } + if parent_part.is_empty() + || !parent_part.bytes().all(|byte| byte.is_ascii_digit()) + || (parent_part.len() > 1 && parent_part.starts_with('0')) + || parent_guid.is_empty() + { + return Err(CloudCanonicalValidationFailure::MalformedReplyParent); + } + validate_identifier(parent_part) + .map_err(|_| CloudCanonicalValidationFailure::MalformedReplyParent)?; + validate_identifier(parent_guid) + .map_err(|_| CloudCanonicalValidationFailure::MalformedReplyParent)?; + Ok(ParsedReplyParent { + parent_guid: parent_guid.to_owned(), + parent_part: parent_part.to_owned(), + }) +} + +impl ParsedReplyParent { + pub(crate) fn parent_guid(&self) -> &str { + &self.parent_guid + } + + pub(crate) fn parent_part(&self) -> &str { + &self.parent_part + } +} + +fn validate_identifier(value: &str) -> Result<(), CloudCanonicalValidationFailure> { + if value.is_empty() || value.len() > MAX_IDENTIFIER_BYTES || value.contains('\0') { + return Err(CloudCanonicalValidationFailure::InvalidIdentifier); + } + Ok(()) +} + +fn validate_text(value: &str) -> Result<(), CloudCanonicalValidationFailure> { + if value.len() > MAX_TEXT_BYTES || value.contains('\0') { + return Err(CloudCanonicalValidationFailure::InvalidText); + } + Ok(()) +} + +fn validate_optional_identifier( + value: &CloudCanonicalField, +) -> Result<(), CloudCanonicalValidationFailure> { + if let Some(value) = value.value() { + validate_identifier(value)?; + } + Ok(()) +} + +fn validate_optional_text( + value: &CloudCanonicalField, +) -> Result<(), CloudCanonicalValidationFailure> { + if let Some(value) = value.value() { + validate_text(value)?; + } + Ok(()) +} + +#[cfg(test)] +mod tests { + use super::*; + + const SENTINEL: &str = "SENSITIVE-FIXTURE-DO-NOT-LOG"; + + fn hash(byte: char) -> CloudCanonicalHash { + CloudCanonicalHash::new(byte.to_string().repeat(HASH_BYTES)).expect("fixture hash") + } + + fn digest(byte: char) -> CloudCanonicalDigest { + CloudCanonicalDigest::new(byte.to_string().repeat(HASH_BYTES)).expect("fixture digest") + } + + fn protected() -> CloudCanonicalProtectedReference { + CloudCanonicalProtectedReference::new("obcs2.test.fixture").expect("fixture reference") + } + + fn chat_payload() -> CloudCanonicalChatPayload { + CloudCanonicalChatPayload::new( + format!("chat-{SENTINEL}"), + "direct-chat".to_owned(), + "group-id".to_owned(), + "original-group-id".to_owned(), + CloudCanonicalService::IMessage, + CloudCanonicalChatStyle::Direct, + vec!["mailto:synthetic@example.invalid".to_owned()], + CloudCanonicalField::Value(format!("Display {SENTINEL}")), + CloudCanonicalField::Value("mailto:sender@example.invalid".to_owned()), + CloudCanonicalField::Value(1), + CloudCanonicalField::Absent, + CloudCanonicalField::ExplicitClear, + ) + .expect("chat payload") + } + + fn envelope( + entity_kind: CloudCanonicalEntityKind, + mutation_kind: CloudCanonicalMutationKind, + logical_hash: CloudCanonicalHash, + parent_hash: Option, + ) -> CloudCanonicalEnvelope { + let aliases = if entity_kind == CloudCanonicalEntityKind::Chat { + vec![CloudCanonicalAlias::new( + CloudCanonicalAliasKind::ChatGroupId, + hash('G'), + )] + } else { + Vec::new() + }; + CloudCanonicalEnvelope::new( + hash('S'), + hash('Z'), + 7, + CLOUD_CANONICAL_SCHEMA_VERSION, + hash('C'), + entity_kind, + mutation_kind, + hash('R'), + logical_hash, + parent_hash, + aliases, + Some(hash('E')), + Some(10), + Some(20), + protected(), + ) + .expect("envelope") + } + + fn snapshot( + entity_kind: CloudCanonicalEntityKind, + logical_hash: CloudCanonicalHash, + parent_hash: Option, + ) -> CloudCanonicalSnapshot { + CloudCanonicalSnapshot::new( + entity_kind, + logical_hash, + parent_hash, + Some(digest('I')), + Some(1), + if entity_kind == CloudCanonicalEntityKind::Message { + Some(2) + } else { + None + }, + if entity_kind == CloudCanonicalEntityKind::Message { + Some(3) + } else { + None + }, + Vec::new(), + None, + if entity_kind == CloudCanonicalEntityKind::Chat { + Some(1) + } else { + None + }, + if entity_kind == CloudCanonicalEntityKind::Chat { + Some(digest('M')) + } else { + None + }, + Some(hash('E')), + protected(), + ) + .expect("snapshot") + } + + fn plain_body(value: &str) -> CloudCanonicalAttributedBody { + let length = value.encode_utf16().count() as u32; + CloudCanonicalAttributedBody::new( + value.to_owned(), + vec![CloudCanonicalTextRun::new( + 0, + length, + Some(0), + None, + None, + None, + None, + None, + None, + None, + None, + ) + .expect("run")], + ) + .expect("body") + } + + fn message_payload( + association: CloudCanonicalMessageAssociation, + ) -> CloudCanonicalMessagePayload { + CloudCanonicalMessagePayload::new( + format!("message-{SENTINEL}"), + "iMessage;-;synthetic".to_owned(), + hash('A'), + "mailto:synthetic@example.invalid".to_owned(), + 123, + 0, + CloudCanonicalService::IMessage, + CloudCanonicalField::Absent, + CloudCanonicalField::Value(SENTINEL.to_owned()), + CloudCanonicalField::Value(vec![plain_body(SENTINEL)]), + CloudCanonicalField::Absent, + CloudCanonicalField::Absent, + CloudCanonicalField::Absent, + CloudCanonicalField::Absent, + CloudCanonicalField::Absent, + CloudCanonicalKnownMessageFlags::default(), + association, + None, + CloudCanonicalField::Absent, + CloudCanonicalField::Absent, + CloudCanonicalField::Absent, + ) + .expect("message payload") + } + + #[test] + fn presence_states_remain_distinct_and_redacted() { + let absent = CloudCanonicalField::::Absent; + let value = CloudCanonicalField::Value(SENTINEL.to_owned()); + let clear = CloudCanonicalField::::ExplicitClear; + + assert_eq!(absent.state(), CloudCanonicalFieldState::Absent); + assert_eq!(value.state(), CloudCanonicalFieldState::Value); + assert_eq!(clear.state(), CloudCanonicalFieldState::ExplicitClear); + assert!(!format!("{value:?}").contains(SENTINEL)); + } + + #[test] + fn aggregate_transient_payload_bytes_are_bounded() { + let maximum_single_field = "x".repeat(MAX_TEXT_BYTES); + let result = CloudCanonicalMessagePayload::new( + "message-guid".to_owned(), + "iMessage;-;synthetic".to_owned(), + hash('A'), + "mailto:synthetic@example.invalid".to_owned(), + 1, + 0, + CloudCanonicalService::IMessage, + CloudCanonicalField::Value(maximum_single_field.clone()), + CloudCanonicalField::Value(maximum_single_field), + CloudCanonicalField::Absent, + CloudCanonicalField::Absent, + CloudCanonicalField::Absent, + CloudCanonicalField::Absent, + CloudCanonicalField::Absent, + CloudCanonicalField::Absent, + CloudCanonicalKnownMessageFlags::default(), + CloudCanonicalMessageAssociation::None, + None, + CloudCanonicalField::Absent, + CloudCanonicalField::Absent, + CloudCanonicalField::Absent, + ); + assert_eq!( + result, + Err(CloudCanonicalValidationFailure::CollectionLimit) + ); + } + + #[test] + fn valid_chat_upsert_enforces_internal_and_active_scope() { + let logical = hash('L'); + let envelope = envelope( + CloudCanonicalEntityKind::Chat, + CloudCanonicalMutationKind::Upsert, + logical.clone(), + None, + ); + let mutation = CloudCanonicalMutation::new( + envelope, + Some(snapshot(CloudCanonicalEntityKind::Chat, logical, None)), + Some(CloudCanonicalPayload::Chat(Box::new(chat_payload()))), + None, + ) + .expect("valid upsert"); + + assert_eq!( + mutation.validate_active_context(&hash('S'), &hash('Z'), 7), + Ok(()) + ); + assert_eq!( + mutation.validate_active_context(&hash('X'), &hash('Z'), 7), + Err(CloudCanonicalValidationFailure::ScopeMismatch) + ); + assert_eq!( + mutation.validate_active_context(&hash('S'), &hash('Z'), 8), + Err(CloudCanonicalValidationFailure::ScopeMismatch) + ); + } + + #[test] + fn envelope_rejects_schema_alias_and_parent_invariant_violations() { + let unsupported = CloudCanonicalEnvelope::new( + hash('S'), + hash('Z'), + 0, + CLOUD_CANONICAL_SCHEMA_VERSION + 1, + hash('C'), + CloudCanonicalEntityKind::Chat, + CloudCanonicalMutationKind::Upsert, + hash('R'), + hash('L'), + None, + Vec::new(), + None, + None, + None, + protected(), + ); + assert_eq!( + unsupported, + Err(CloudCanonicalValidationFailure::UnsupportedSchema) + ); + + let aliases_on_message = CloudCanonicalEnvelope::new( + hash('S'), + hash('Z'), + 0, + CLOUD_CANONICAL_SCHEMA_VERSION, + hash('C'), + CloudCanonicalEntityKind::Message, + CloudCanonicalMutationKind::Upsert, + hash('R'), + hash('L'), + None, + vec![CloudCanonicalAlias::new( + CloudCanonicalAliasKind::ChatGroupId, + hash('G'), + )], + None, + None, + None, + protected(), + ); + assert_eq!( + aliases_on_message, + Err(CloudCanonicalValidationFailure::InvalidEnvelope) + ); + + let group_photo_without_parent = CloudCanonicalEnvelope::new( + hash('S'), + hash('Z'), + 0, + CLOUD_CANONICAL_SCHEMA_VERSION, + hash('C'), + CloudCanonicalEntityKind::GroupPhoto, + CloudCanonicalMutationKind::Upsert, + hash('R'), + hash('L'), + None, + Vec::new(), + None, + None, + None, + protected(), + ); + assert_eq!( + group_photo_without_parent, + Err(CloudCanonicalValidationFailure::InvalidEnvelope) + ); + } + + #[test] + fn mutation_rejects_payload_kind_and_parent_mismatch() { + let logical = hash('L'); + let chat_envelope = envelope( + CloudCanonicalEntityKind::Chat, + CloudCanonicalMutationKind::Upsert, + logical.clone(), + None, + ); + assert_eq!( + CloudCanonicalMutation::new( + chat_envelope, + Some(snapshot(CloudCanonicalEntityKind::Chat, logical, None)), + Some(CloudCanonicalPayload::Message(Box::new(message_payload( + CloudCanonicalMessageAssociation::None, + )))), + None, + ), + Err(CloudCanonicalValidationFailure::InvalidPayload) + ); + + let parent = CloudCanonicalParentReference::new( + "parent-guid".to_owned(), + Some(0), + hash('P'), + Some(0), + Some(4), + ) + .expect("parent"); + let reaction = message_payload(CloudCanonicalMessageAssociation::ReactionAdd { + kind: CloudCanonicalReactionKind::Like, + parent, + }); + let reaction_envelope = envelope( + CloudCanonicalEntityKind::Reaction, + CloudCanonicalMutationKind::Upsert, + hash('L'), + Some(hash('Q')), + ); + assert_eq!( + CloudCanonicalMutation::new( + reaction_envelope, + Some( + CloudCanonicalSnapshot::new( + CloudCanonicalEntityKind::Reaction, + hash('L'), + Some(hash('Q')), + Some(digest('I')), + Some(1), + None, + None, + Vec::new(), + None, + None, + None, + Some(hash('E')), + protected(), + ) + .expect("reaction snapshot") + ), + Some(CloudCanonicalPayload::Message(Box::new(reaction))), + None, + ), + Err(CloudCanonicalValidationFailure::InvalidPayload) + ); + } + + #[test] + fn tombstone_accepts_missing_server_time_without_inventing_one() { + let logical = hash('L'); + let mut envelope = envelope( + CloudCanonicalEntityKind::Message, + CloudCanonicalMutationKind::Tombstone, + logical.clone(), + None, + ); + envelope.server_modified_at_millis = None; + let tombstone = CloudCanonicalTombstone::new( + CloudCanonicalEntityKind::Message, + hash('R'), + logical, + protected(), + None, + true, + ) + .expect("tombstone"); + let mutation = CloudCanonicalMutation::new(envelope, None, None, Some(tombstone)) + .expect("valid tombstone"); + assert!(mutation.tombstone.unwrap().deleted_at_millis.is_none()); + } + + #[test] + fn tombstone_requires_server_confirmation_and_exact_mapping() { + assert_eq!( + CloudCanonicalTombstone::new( + CloudCanonicalEntityKind::Message, + hash('R'), + hash('L'), + protected(), + Some(20), + false, + ), + Err(CloudCanonicalValidationFailure::InvalidTombstone) + ); + + let envelope = envelope( + CloudCanonicalEntityKind::Message, + CloudCanonicalMutationKind::Tombstone, + hash('L'), + None, + ); + let wrong_mapping = CloudCanonicalTombstone::new( + CloudCanonicalEntityKind::Message, + hash('X'), + hash('L'), + protected(), + Some(20), + true, + ) + .expect("mapped tombstone"); + assert_eq!( + CloudCanonicalMutation::new(envelope, None, None, Some(wrong_mapping)), + Err(CloudCanonicalValidationFailure::InvalidTombstone) + ); + } + + #[test] + fn owned_attachment_parser_preserves_the_entire_guid_suffix() { + let parsed = + parse_owned_attachment_guid("at_12_GUID_WITH_UNDERSCORES").expect("owned attachment"); + assert_eq!(parsed.part, 12); + assert_eq!(parsed.message_guid, "GUID_WITH_UNDERSCORES"); + assert_eq!(parsed.canonical_guid, "GUID_WITH_UNDERSCORES_12"); + assert!(!format!("{parsed:?}").contains("GUID_WITH_UNDERSCORES")); + } + + #[test] + fn owned_attachment_parser_rejects_non_exact_or_overflowing_shapes() { + for malformed in [ + "at", + "at_", + "at__guid", + "at_-1_guid", + "at_01_guid", + "at_x_guid", + "at_4294967296_guid", + "at_0_bad/guid", + "other_0_guid", + ] { + assert_eq!( + parse_owned_attachment_guid(malformed), + Err(CloudCanonicalValidationFailure::MalformedAttachmentOwner), + "{malformed}" + ); + } + } + + #[test] + fn partless_and_part_zero_are_distinct_payloads_sharing_one_parent_hash() { + // Pinning deliberate behaviour, not asserting it is semantically right. + // + // The parent hash covers only the GUID, so both spellings resolve to the + // same parent. The payload keeps the part, so they are not equal values. + // That is the truthful representation: for a single-part message a bare + // GUID and part 0 may well mean the same thing, but for a message with + // several parts "the message" and "its first part" are different + // targets, and nothing available offline settles which Apple intends. + // + // The consequence to watch for on a live run is one reaction arriving in + // both spellings, which would read here as a content change. Dart keeps + // the same distinction in storage and only coerces `?? 0` when matching + // for display. + let bare = parse_associated_parent("PARENT-GUID").expect("bare"); + let zero = parse_associated_parent("p:0/PARENT-GUID").expect("part zero"); + + assert_eq!(bare.parent_guid, zero.parent_guid); + assert_ne!(bare.parent_part, zero.parent_part); + assert_eq!(bare.parent_part, None); + assert_eq!(zero.parent_part, Some(0)); + } + + #[test] + fn associated_parent_accepts_a_bare_guid_as_the_partless_form() { + // Apple drops the wrapper when a reaction targets no particular part. + // Requiring the prefix quarantined every partless reaction. + let parsed = parse_associated_parent("PARENT-GUID").expect("bare associated parent"); + assert_eq!(parsed.parent_part, None); + assert_eq!(parsed.parent_guid, "PARENT-GUID"); + assert!(!format!("{parsed:?}").contains("PARENT")); + + // A bare value carries no structure of its own. Without this the + // identifier validator, which only rejects empty, oversized, and + // NUL-bearing values, would accept a malformed wrapper whole. + // `bp:` is the bubble/tapback spelling of the same reference and is + // accepted; `bpdi:` is a balloon payload reference and is not. + let bubble = parse_associated_parent("bp:2/PARENT-GUID").expect("bubble parent"); + assert_eq!(bubble.parent_part, Some(2)); + assert_eq!(bubble.parent_guid, "PARENT-GUID"); + + for malformed in [ + "0/guid", + "bpdi:0/guid", + "P:0/guid", + "r:0:guid", + "guid/extra", + "guid:extra", + "", + ] { + assert_eq!( + parse_associated_parent(malformed), + Err(CloudCanonicalValidationFailure::MalformedAssociatedParent), + "{malformed}" + ); + } + } + + #[test] + fn associated_parent_parser_requires_exact_unambiguous_prefix_part_and_guid() { + let parsed = parse_associated_parent("p:7/PARENT-GUID").expect("associated parent"); + assert_eq!(parsed.parent_part, Some(7)); + assert_eq!(parsed.parent_guid, "PARENT-GUID"); + assert!(!format!("{parsed:?}").contains("PARENT")); + + for malformed in [ + "bpdi:7/guid", + "p:/guid", + "p:x/guid", + "p:07/guid", + "p:7/", + "p:7", + "p:7/PARENT/GUID", + ] { + assert_eq!( + parse_associated_parent(malformed), + Err(CloudCanonicalValidationFailure::MalformedAssociatedParent), + "{malformed}" + ); + } + } + + #[test] + fn reply_parser_accepts_only_the_established_unambiguous_shape() { + let parsed = parse_reply_parent("r:0:PARENT-GUID").expect("reply parent"); + assert_eq!(parsed.parent_part, "0"); + assert_eq!(parsed.parent_guid, "PARENT-GUID"); + assert!(!format!("{parsed:?}").contains("PARENT-GUID")); + + assert_eq!( + parse_reply_parent("r:part:with-colon:PARENT-GUID"), + Err(CloudCanonicalValidationFailure::AmbiguousReplyParent) + ); + assert_eq!( + parse_reply_parent("r:0:PARENT:GUID"), + Err(CloudCanonicalValidationFailure::AmbiguousReplyParent) + ); + for malformed in ["r:", "r:0", "r::guid", "r:00:guid", "r:0:", "p:0/guid"] { + assert_eq!( + parse_reply_parent(malformed), + Err(CloudCanonicalValidationFailure::MalformedReplyParent), + "{malformed}" + ); + } + } + + #[test] + fn attributed_ranges_use_utf16_boundaries_and_reject_overflow() { + let emoji = "A😀B"; + assert_eq!(emoji.encode_utf16().count(), 4); + assert!(CloudCanonicalAttributedBody::new( + emoji.to_owned(), + vec![CloudCanonicalTextRun::new( + 1, + 2, + Some(0), + None, + None, + None, + None, + None, + None, + None, + None, + ) + .expect("emoji run")], + ) + .is_ok()); + assert_eq!( + CloudCanonicalAttributedBody::new( + emoji.to_owned(), + vec![CloudCanonicalTextRun::new( + 3, + 2, + Some(0), + None, + None, + None, + None, + None, + None, + None, + None, + ) + .expect("out of bounds run")], + ), + Err(CloudCanonicalValidationFailure::InvalidRange) + ); + } + + #[test] + fn attachment_owner_hash_and_part_are_atomic() { + assert_eq!( + CloudCanonicalAttachmentPayload::new( + "attachment-guid".to_owned(), + Some("owner-message-guid".to_owned()), + Some(hash('P')), + None, + CloudCanonicalField::Absent, + CloudCanonicalField::Absent, + CloudCanonicalField::Absent, + CloudCanonicalField::ExplicitClear, + CloudCanonicalField::Absent, + CloudCanonicalField::Absent, + ), + Err(CloudCanonicalValidationFailure::InvalidPayload) + ); + assert!(CloudCanonicalAttachmentPayload::new( + "attachment-guid".to_owned(), + Some("owner-message-guid".to_owned()), + Some(hash('P')), + Some(0), + CloudCanonicalField::Value("public.png".to_owned()), + CloudCanonicalField::Value("image/png".to_owned()), + CloudCanonicalField::Value(SENTINEL.to_owned()), + CloudCanonicalField::Value(42), + CloudCanonicalField::Value(false), + CloudCanonicalField::Value(protected()), + ) + .is_ok()); + } + + #[test] + fn emoji_reaction_requires_transient_emoji_content() { + let parent = || { + CloudCanonicalParentReference::new("parent".to_owned(), Some(0), hash('P'), None, None) + .expect("parent") + }; + let result = CloudCanonicalMessagePayload::new( + "reaction-guid".to_owned(), + "iMessage;-;synthetic".to_owned(), + hash('A'), + "mailto:synthetic@example.invalid".to_owned(), + 1, + 0, + CloudCanonicalService::IMessage, + CloudCanonicalField::Absent, + CloudCanonicalField::Absent, + CloudCanonicalField::Absent, + CloudCanonicalField::Absent, + CloudCanonicalField::Absent, + CloudCanonicalField::Absent, + CloudCanonicalField::Absent, + CloudCanonicalField::Absent, + CloudCanonicalKnownMessageFlags::default(), + CloudCanonicalMessageAssociation::ReactionAdd { + kind: CloudCanonicalReactionKind::Emoji, + parent: parent(), + }, + None, + CloudCanonicalField::Absent, + CloudCanonicalField::Absent, + CloudCanonicalField::Absent, + ); + assert_eq!(result, Err(CloudCanonicalValidationFailure::InvalidPayload)); + } + + #[test] + fn duplicate_aliases_edits_and_retracted_parts_are_rejected() { + let duplicate_alias = CloudCanonicalEnvelope::new( + hash('S'), + hash('Z'), + 0, + CLOUD_CANONICAL_SCHEMA_VERSION, + hash('C'), + CloudCanonicalEntityKind::Chat, + CloudCanonicalMutationKind::Upsert, + hash('R'), + hash('L'), + None, + vec![ + CloudCanonicalAlias::new(CloudCanonicalAliasKind::ChatGroupId, hash('G')), + CloudCanonicalAlias::new(CloudCanonicalAliasKind::ChatGroupId, hash('G')), + ], + None, + None, + None, + protected(), + ); + assert_eq!( + duplicate_alias, + Err(CloudCanonicalValidationFailure::InvalidEnvelope) + ); + + let edit = || { + CloudCanonicalMessageEdit::new(0, 1, vec![plain_body("edit")], 10, Some((0, 4))) + .expect("edit") + }; + let result = CloudCanonicalMessagePayload::new( + "message-guid".to_owned(), + "iMessage;-;synthetic".to_owned(), + hash('A'), + String::new(), + 1, + 0, + CloudCanonicalService::IMessage, + CloudCanonicalField::Absent, + CloudCanonicalField::Absent, + CloudCanonicalField::Absent, + CloudCanonicalField::Absent, + CloudCanonicalField::Absent, + CloudCanonicalField::Absent, + CloudCanonicalField::Absent, + CloudCanonicalField::Absent, + CloudCanonicalKnownMessageFlags::default(), + CloudCanonicalMessageAssociation::None, + None, + CloudCanonicalField::Value(vec![edit(), edit()]), + CloudCanonicalField::Value(vec![2, 2]), + CloudCanonicalField::Absent, + ); + assert_eq!(result, Err(CloudCanonicalValidationFailure::InvalidPayload)); + } + + #[test] + fn every_payload_and_metadata_debug_path_is_redacted() { + let chat = chat_payload(); + let message = message_payload(CloudCanonicalMessageAssociation::None); + let attachment = CloudCanonicalAttachmentPayload::new( + format!("attachment-{SENTINEL}"), + None, + None, + None, + CloudCanonicalField::Absent, + CloudCanonicalField::Absent, + CloudCanonicalField::Value(SENTINEL.to_owned()), + CloudCanonicalField::ExplicitClear, + CloudCanonicalField::Absent, + CloudCanonicalField::Absent, + ) + .expect("attachment"); + let photo = CloudCanonicalGroupPhotoPayload::new( + hash('P'), + hash('F'), + format!("photo-{SENTINEL}"), + protected(), + ) + .expect("photo"); + + for rendered in [ + format!("{chat:?}"), + format!("{message:?}"), + format!("{attachment:?}"), + format!("{photo:?}"), + format!("{:?}", CloudCanonicalPayload::Chat(Box::new(chat))), + format!("{:?}", CloudCanonicalPayload::Message(Box::new(message))), + ] { + assert!(!rendered.contains(SENTINEL), "{rendered}"); + assert!(rendered.contains("redacted"), "{rendered}"); + } + + let logical = hash('L'); + let mutation = CloudCanonicalMutation::new( + envelope( + CloudCanonicalEntityKind::Chat, + CloudCanonicalMutationKind::Upsert, + logical.clone(), + None, + ), + Some(snapshot(CloudCanonicalEntityKind::Chat, logical, None)), + Some(CloudCanonicalPayload::Chat(Box::new(chat_payload()))), + None, + ) + .expect("mutation"); + assert_eq!(format!("{mutation:?}"), "CloudCanonicalMutation(redacted)"); + } + + #[test] + fn source_has_no_bridge_serialization_or_secret_transport_types() { + let source = include_str!("cloud_sync_canonical_dto.rs"); + let forbidden = [ + concat!("flutter_", "rust_bridge"), + concat!("#[", "frb"), + concat!("ser", "de::"), + concat!("derive(", "Serialize"), + concat!("derive(", "Deserialize"), + concat!("PCSEn", "cryptor"), + concat!("MMCS", "AttachmentMeta"), + concat!("decryption", "_key"), + concat!("raw_account", "_id"), + concat!("raw_record", "_id"), + concat!("impl std::fmt::", "Display"), + ]; + for token in forbidden { + assert!(!source.contains(token), "forbidden source token: {token}"); + } + } +} diff --git a/rust/src/cloud_sync_native_fetch.rs b/rust/src/cloud_sync_native_fetch.rs new file mode 100644 index 0000000000..e7411f84ac --- /dev/null +++ b/rust/src/cloud_sync_native_fetch.rs @@ -0,0 +1,4829 @@ +//! Private, default-off native fetch and protection seam for Cloud Sync V2. +//! +//! Raw types from this module are intentionally absent from Flutter Rust +//! Bridge. A narrow wrapper in `api::api` exposes only content-free keyed +//! hashes, bounded lengths, fixed enums, and opaque references to +//! platform-protected local values. Raw CloudKit record names, etags, encrypted +//! records, tombstones, and continuation tokens remain native-only. + +#![allow(dead_code)] + +use std::{ + collections::{BTreeSet, HashSet}, + fmt::{self, Debug, Formatter}, + fs::{self, File, OpenOptions}, + io::{Read, Write}, + path::{Path, PathBuf}, + sync::{Arc, Mutex, MutexGuard}, + time::{Duration, SystemTime, UNIX_EPOCH}, +}; + +use base64::{engine::general_purpose::URL_SAFE_NO_PAD, Engine as _}; +use rustpush::{ + cloud_messages::{ + CloudMessageRecordKind, CloudMessageRecordPage, CloudMessageRecordPageChange, + CloudMessageRecordSystemFields, CloudMessagesClient, + }, + cloudkit::{classify_cloudkit_failure, CloudKitFailureClass}, + CloudKitProtocolError, DefaultAnisetteProvider, PushError, +}; +use sha2::{Digest, Sha256}; +use uuid::Uuid; + +use crate::{ + cloud_sync_canonical_dto::{ + CloudCanonicalDigest, CloudCanonicalHash, CloudCanonicalProtectedReference, + }, + cloud_sync_protector::{self, CloudSyncProtectionError}, + cloud_sync_semantic_decoder::CloudSemanticIdentifierHasher, +}; + +const FETCH_DEADLINE: Duration = Duration::from_secs(40); +const MAX_CHANGES_PER_PAGE: usize = 200; +const MAX_RAW_RECORD_BYTES: usize = 8 * 1024 * 1024; +const MAX_RAW_PAGE_BYTES: usize = 24 * 1024 * 1024; +const MAX_CONTINUATION_TOKEN_BYTES: usize = 64 * 1024; +const MAX_METADATA_BYTES: usize = 16 * 1024; +const MAX_PROTECTED_FILE_BYTES: usize = 18 * 1024 * 1024; +const MAX_PROTECTED_PLAINTEXT_BATCH_BYTES: usize = 36 * 1024 * 1024; +const MAX_PROTECTED_CIPHERTEXT_BATCH_BYTES: usize = 48 * 1024 * 1024; +const MAX_LEASE_FILES: usize = MAX_CHANGES_PER_PAGE * 2 + 1; +const MAX_LEASE_MANIFEST_BYTES: usize = 128 * 1024; +const MAX_RECOVERY_MANIFESTS_PER_PASS: usize = 64; +const MAX_RECOVERY_TEMPORARY_FILES_PER_PASS: usize = 64; +const MAX_ADOPTED_LEASES_PER_RECOVERY: usize = 4_096; +const MAX_LIVE_REFERENCES_PER_MAINTENANCE: usize = 131_072; +const MAX_RETIRE_REFERENCES_PER_CALL: usize = 64; +const MAX_GC_REFERENCES_PER_PASS: usize = 64; +const MAX_GC_ACTIVE_MANIFESTS: usize = 4_096; +const GC_GRACE_PERIOD: Duration = Duration::from_secs(24 * 60 * 60); +const MAX_RETRY_AFTER_SECONDS: u64 = 7 * 24 * 60 * 60; +const STORE_DIRECTORY_NAME: &str = "cloud_sync_v2_native_store"; +const LEASE_DIRECTORY_NAME: &str = ".leases"; +const COMMITTED_LEASE_DIRECTORY_NAME: &str = ".committed-leases"; +const TEMPORARY_DIRECTORY_NAME: &str = ".temporary"; +const GC_DIRECTORY_NAME: &str = ".gc"; +const GC_CURSOR_FILE_NAME: &str = ".cursor"; +const RAW_ENVELOPE_MAGIC: &[u8] = b"OBCS2-NATIVE-RAW"; +const CHECKPOINT_MAGIC: &[u8] = b"OBCS2-NATIVE-CHECKPOINT"; +const RECORD_IDENTITY_MAGIC: &[u8] = b"OBCS2-NATIVE-RECORD-ID"; +const FORMAT_VERSION: u16 = 1; + +static PROTECTED_STORE_OPERATION_LOCK: Mutex<()> = Mutex::new(()); + +#[derive(Clone, Copy, Debug, Eq, Hash, PartialEq)] +pub(crate) enum CloudNativeStream { + Chats, + Messages, + Attachments, + MessageUpdate, + RecoverableMessageDelete, + ScheduledMessage, + Chat1, +} + +impl CloudNativeStream { + pub(crate) fn parse(value: &str) -> Option { + match value { + "chats" => Some(Self::Chats), + "messages" => Some(Self::Messages), + "attachments" => Some(Self::Attachments), + "messageUpdateZone" => Some(Self::MessageUpdate), + "recoverableMessageDeleteZone" => Some(Self::RecoverableMessageDelete), + "scheduledMessageZone" => Some(Self::ScheduledMessage), + "chat1ManateeZone" => Some(Self::Chat1), + _ => None, + } + } + + pub(crate) fn zone(self) -> &'static str { + match self { + Self::Chats => "chatManateeZone", + Self::Messages => "messageManateeZone", + Self::Attachments => "attachmentManateeZone", + Self::MessageUpdate => "messageUpdateZone", + Self::RecoverableMessageDelete => "recoverableMessageDeleteZone", + Self::ScheduledMessage => "scheduledMessageZone", + Self::Chat1 => "chat1ManateeZone", + } + } + + fn tag(self) -> u8 { + match self { + Self::Chats => 1, + Self::Messages => 2, + Self::Attachments => 3, + Self::MessageUpdate => 4, + Self::RecoverableMessageDelete => 5, + Self::ScheduledMessage => 6, + Self::Chat1 => 7, + } + } + + fn from_tag(value: u8) -> Option { + match value { + 1 => Some(Self::Chats), + 2 => Some(Self::Messages), + 3 => Some(Self::Attachments), + 4 => Some(Self::MessageUpdate), + 5 => Some(Self::RecoverableMessageDelete), + 6 => Some(Self::ScheduledMessage), + 7 => Some(Self::Chat1), + _ => None, + } + } +} + +#[derive(Clone, Eq, PartialEq)] +pub(crate) struct CloudNativeProtectionScope { + account_fingerprint: String, + container: String, + database: String, + zone: String, + stream_kind: String, + schema_version: u32, +} + +impl CloudNativeProtectionScope { + pub(crate) fn new( + account_fingerprint: String, + stream: CloudNativeStream, + ) -> Result { + if !is_bare_digest(&account_fingerprint) { + return Err(CloudNativeFetchFailure::new( + CloudNativeFailureCategory::MalformedRecord, + CloudNativeSafeCode::InvalidScope, + None, + )); + } + Ok(Self { + account_fingerprint, + container: "com.apple.messages.cloud".to_owned(), + database: "private".to_owned(), + zone: stream.zone().to_owned(), + stream_kind: "messages".to_owned(), + schema_version: 2, + }) + } + + fn validate_for_stream( + &self, + stream: CloudNativeStream, + ) -> Result<(), CloudNativeFetchFailure> { + if !is_bare_digest(&self.account_fingerprint) + || self.container != "com.apple.messages.cloud" + || self.database != "private" + || self.zone != stream.zone() + || self.stream_kind != "messages" + || self.schema_version != 2 + { + return Err(CloudNativeFetchFailure::new( + CloudNativeFailureCategory::MalformedRecord, + CloudNativeSafeCode::InvalidScope, + None, + )); + } + Ok(()) + } + + pub(crate) fn binding(&self) -> String { + [ + self.account_fingerprint.as_str(), + self.container.as_str(), + self.database.as_str(), + self.zone.as_str(), + self.stream_kind.as_str(), + &self.schema_version.to_string(), + ] + .join("\u{1f}") + } +} + +#[derive(Clone, Copy, Debug, Eq, PartialEq)] +pub(crate) enum CloudNativeRawEnvelopeKind { + EncryptedUpsert, + Tombstone, + UnsupportedRecordType, + MalformedMetadata, +} + +/// Native-only unprotected record envelope. +/// +/// This type deliberately has no `Debug`, serde, or Flutter Rust Bridge +/// surface. It can contain raw CloudKit identifiers and encrypted record bytes +/// and must remain inside the transient native conversion boundary. +pub(crate) struct CloudNativeRawEnvelope { + generation: u64, + stream: CloudNativeStream, + kind: CloudNativeRawEnvelopeKind, + record_name: Option, + record_type: Option, + change_type: Option, + etag: Option, + server_created_at_millis: Option, + server_modified_at_millis: Option, + permission: Option, + raw_length: u64, + raw_digest_hex: String, + raw: Option>, +} + +impl CloudNativeRawEnvelope { + pub(crate) fn generation(&self) -> u64 { + self.generation + } + + pub(crate) fn stream(&self) -> CloudNativeStream { + self.stream + } + + pub(crate) fn kind(&self) -> CloudNativeRawEnvelopeKind { + self.kind + } + + pub(crate) fn record_name(&self) -> Option<&str> { + self.record_name.as_deref() + } + + pub(crate) fn record_type(&self) -> Option<&str> { + self.record_type.as_deref() + } + + pub(crate) fn change_type(&self) -> Option { + self.change_type + } + + pub(crate) fn etag(&self) -> Option<&str> { + self.etag.as_deref() + } + + pub(crate) fn server_created_at_millis(&self) -> Option { + self.server_created_at_millis + } + + pub(crate) fn server_modified_at_millis(&self) -> Option { + self.server_modified_at_millis + } + + pub(crate) fn permission(&self) -> Option { + self.permission + } + + pub(crate) fn raw_digest_hex(&self) -> &str { + &self.raw_digest_hex + } + + pub(crate) fn raw_length(&self) -> u64 { + self.raw_length + } + + pub(crate) fn raw(&self) -> Option<&[u8]> { + self.raw.as_deref() + } +} + +impl Debug for CloudNativeProtectionScope { + fn fmt(&self, formatter: &mut Formatter<'_>) -> fmt::Result { + formatter.write_str("CloudNativeProtectionScope(redacted)") + } +} + +#[derive(Clone, Copy, Debug, Eq, PartialEq)] +enum CloudNativeProtectionPurpose { + CheckpointToken, + ServerRecordId, + OutboundMessage, + RawRecord, +} + +impl CloudNativeProtectionPurpose { + fn value(self) -> &'static str { + match self { + Self::CheckpointToken => "checkpointToken", + Self::ServerRecordId => "serverRecordId", + Self::OutboundMessage => "outboundMessage", + Self::RawRecord => "rawRecord", + } + } +} + +struct CloudNativePlaintext { + purpose: CloudNativeProtectionPurpose, + value: String, +} + +impl Debug for CloudNativePlaintext { + fn fmt(&self, formatter: &mut Formatter<'_>) -> fmt::Result { + formatter + .debug_struct("CloudNativePlaintext") + .field("purpose", &self.purpose) + .field("length", &self.value.len()) + .finish() + } +} + +trait CloudNativeProtectedStore: Send + Sync { + fn protect_batch( + &self, + scope: &CloudNativeProtectionScope, + values: &[CloudNativePlaintext], + ) -> Result; + + fn unprotect( + &self, + scope: &CloudNativeProtectionScope, + purpose: CloudNativeProtectionPurpose, + reference: &CloudCanonicalProtectedReference, + ) -> Result; + + fn commit_lease( + &self, + lease: &CloudNativePageLease, + retained_references: &HashSet, + ) -> Result<(), CloudNativeStoreFailure>; + + fn acknowledge_committed_lease( + &self, + lease: &CloudNativePageLease, + ) -> Result<(), CloudNativeStoreFailure>; + + fn rollback_lease(&self, lease: &CloudNativePageLease) -> Result<(), CloudNativeStoreFailure>; + + fn recover_abandoned_leases( + &self, + adopted_lease_references: &HashSet, + live_references: &HashSet, + live_reference_enumeration_complete: bool, + ) -> Result; + + fn retire_references( + &self, + references: &HashSet, + ) -> Result; + + fn collect_garbage( + &self, + live_references: &HashSet, + live_reference_enumeration_complete: bool, + ) -> Result; +} + +#[derive(Clone, Eq, PartialEq)] +struct CloudNativePageLease { + reference: CloudCanonicalProtectedReference, +} + +impl Debug for CloudNativePageLease { + fn fmt(&self, formatter: &mut Formatter<'_>) -> fmt::Result { + formatter.write_str("CloudNativePageLease(redacted)") + } +} + +impl CloudNativePageLease { + fn value(&self) -> &str { + self.reference.value() + } + + fn parse(reference: &str) -> Result { + let token = reference + .strip_prefix("obcs2.lease.") + .filter(|token| is_lease_token(token)) + .ok_or_else(|| { + CloudNativeFetchFailure::new( + CloudNativeFailureCategory::LocalStorage, + CloudNativeSafeCode::InvalidRequest, + None, + ) + })?; + Ok(Self { + reference: CloudCanonicalProtectedReference::new(format!("obcs2.lease.{token}")) + .map_err(|_| { + CloudNativeFetchFailure::new( + CloudNativeFailureCategory::LocalStorage, + CloudNativeSafeCode::InvalidRequest, + None, + ) + })?, + }) + } +} + +struct CloudNativeProtectedBatch { + references: Vec, + lease: CloudNativePageLease, +} + +#[derive(Clone, Debug, Default, Eq, PartialEq)] +pub(crate) struct CloudNativeRecoverySummary { + finalized_adopted_lease_references: Vec, + absent_adopted_lease_references: Vec, + rolled_back: usize, + removed_temporary_files: usize, + has_more: bool, +} + +#[derive(Clone, Debug, Default, Eq, PartialEq)] +pub(crate) struct CloudNativeGarbageCollectionSummary { + scanned: usize, + first_observed: usize, + deleted: usize, + preserved_live: usize, + preserved_active_lease: usize, + has_more: bool, +} + +impl CloudNativeGarbageCollectionSummary { + pub(crate) fn scanned_count(&self) -> usize { + self.scanned + } + + pub(crate) fn first_observed_count(&self) -> usize { + self.first_observed + } + + pub(crate) fn deleted_count(&self) -> usize { + self.deleted + } + + pub(crate) fn preserved_live_count(&self) -> usize { + self.preserved_live + } + + pub(crate) fn preserved_active_lease_count(&self) -> usize { + self.preserved_active_lease + } + + pub(crate) fn has_more(&self) -> bool { + self.has_more + } +} + +#[derive(Clone)] +struct CloudNativeLeaseManifestEntry { + reference: CloudCanonicalProtectedReference, + expected_digest: String, +} + +impl CloudNativeRecoverySummary { + pub(crate) fn finalized_adopted_lease_references(&self) -> Vec<&str> { + self.finalized_adopted_lease_references + .iter() + .map(CloudCanonicalProtectedReference::value) + .collect() + } + + pub(crate) fn has_more(&self) -> bool { + self.has_more + } + + pub(crate) fn rolled_back_count(&self) -> usize { + self.rolled_back + } + + pub(crate) fn removed_temporary_file_count(&self) -> usize { + self.removed_temporary_files + } + + pub(crate) fn absent_adopted_lease_references(&self) -> Vec<&str> { + self.absent_adopted_lease_references + .iter() + .map(CloudCanonicalProtectedReference::value) + .collect() + } +} + +#[derive(Clone, Copy, Debug, Eq, PartialEq)] +enum CloudNativeStoreFailure { + InvalidStorage, + ProtectionUnavailable, + InvalidReference, + ContextMismatch, + Io, +} + +struct PlatformCloudNativeProtectedStore { + storage_directory: PathBuf, +} + +impl PlatformCloudNativeProtectedStore { + pub(crate) fn new(storage_directory: PathBuf) -> Self { + Self { storage_directory } + } + + fn store_directory(&self) -> Result { + if !self.storage_directory.is_dir() { + return Err(CloudNativeStoreFailure::InvalidStorage); + } + Ok(self.storage_directory.join(STORE_DIRECTORY_NAME)) + } + + fn reference_path( + &self, + reference: &CloudCanonicalProtectedReference, + ) -> Result { + let token = reference + .value() + .strip_prefix("obcs2.ref.") + .filter(|token| is_bare_digest(token)) + .ok_or(CloudNativeStoreFailure::InvalidReference)?; + Ok(self.store_directory()?.join(format!("{token}.protected"))) + } + + fn lease_path(&self, lease: &CloudNativePageLease) -> Result { + let token = lease + .reference + .value() + .strip_prefix("obcs2.lease.") + .filter(|token| is_lease_token(token)) + .ok_or(CloudNativeStoreFailure::InvalidReference)?; + Ok(self + .lease_directory()? + .join(format!(".lease-{token}.manifest"))) + } + + fn lease_directory(&self) -> Result { + Ok(self.store_directory()?.join(LEASE_DIRECTORY_NAME)) + } + + fn temporary_directory(&self) -> Result { + Ok(self.store_directory()?.join(TEMPORARY_DIRECTORY_NAME)) + } + + fn committed_lease_directory(&self) -> Result { + Ok(self.store_directory()?.join(COMMITTED_LEASE_DIRECTORY_NAME)) + } + + fn committed_lease_path( + &self, + lease: &CloudNativePageLease, + ) -> Result { + let token = lease + .reference + .value() + .strip_prefix("obcs2.lease.") + .filter(|token| is_lease_token(token)) + .ok_or(CloudNativeStoreFailure::InvalidReference)?; + Ok(self + .committed_lease_directory()? + .join(format!(".lease-{token}.receipt"))) + } + + fn gc_directory(&self) -> Result { + Ok(self.store_directory()?.join(GC_DIRECTORY_NAME)) + } + + fn gc_candidate_path(&self, token: &str) -> Result { + if !is_bare_digest(token) { + return Err(CloudNativeStoreFailure::InvalidReference); + } + Ok(self + .gc_directory()? + .join(format!(".candidate-{token}.mark"))) + } + + fn operation_guard() -> Result, CloudNativeStoreFailure> { + PROTECTED_STORE_OPERATION_LOCK + .lock() + .map_err(|_| CloudNativeStoreFailure::Io) + } + + fn lease_from_path(path: &Path) -> Result { + let token = path + .file_name() + .and_then(|name| name.to_str()) + .and_then(|name| name.strip_prefix(".lease-")) + .and_then(|name| name.strip_suffix(".manifest")) + .filter(|token| is_lease_token(token)) + .ok_or(CloudNativeStoreFailure::InvalidReference)?; + Ok(CloudNativePageLease { + reference: CloudCanonicalProtectedReference::new(format!("obcs2.lease.{token}")) + .map_err(|_| CloudNativeStoreFailure::InvalidReference)?, + }) + } + + fn committed_lease_from_path( + path: &Path, + ) -> Result { + let token = path + .file_name() + .and_then(|name| name.to_str()) + .and_then(|name| name.strip_prefix(".lease-")) + .and_then(|name| name.strip_suffix(".receipt")) + .filter(|token| is_lease_token(token)) + .ok_or(CloudNativeStoreFailure::InvalidReference)?; + Ok(CloudNativePageLease { + reference: CloudCanonicalProtectedReference::new(format!("obcs2.lease.{token}")) + .map_err(|_| CloudNativeStoreFailure::InvalidReference)?, + }) + } + + #[cfg(unix)] + fn sync_directory(path: &Path) -> Result<(), CloudNativeStoreFailure> { + File::open(path) + .and_then(|directory| directory.sync_all()) + .map_err(|_| CloudNativeStoreFailure::Io) + } + + /// Windows exposes no directory-sync primitive. + /// + /// This previously opened the directory read-only with backup semantics and + /// called `sync_all`, which issues `FlushFileBuffers`. That call needs write + /// access and is not supported on a directory handle, so it always failed + /// and took every enclosing store operation down with it. Eighteen lease and + /// recovery tests failed on Windows for this reason alone, each reporting an + /// opaque `Io` because the underlying error is discarded. + /// + /// Established practice is a no-op here rather than pretending to a + /// guarantee the platform does not provide. Durability of a rename on + /// Windows therefore rests on startup reconciliation, which treats the + /// database as authoritative and repairs the staging directory against it. + #[cfg(windows)] + fn sync_directory(_path: &Path) -> Result<(), CloudNativeStoreFailure> { + Ok(()) + } + + #[cfg(not(any(unix, windows)))] + fn sync_directory(_path: &Path) -> Result<(), CloudNativeStoreFailure> { + Err(CloudNativeStoreFailure::ProtectionUnavailable) + } + + fn map_protection_error(error: CloudSyncProtectionError) -> CloudNativeStoreFailure { + match error { + CloudSyncProtectionError::ContextMismatch + | CloudSyncProtectionError::PlatformMismatch => { + CloudNativeStoreFailure::ContextMismatch + } + CloudSyncProtectionError::InvalidProtectedValue + | CloudSyncProtectionError::UnsupportedFormat => { + CloudNativeStoreFailure::InvalidReference + } + CloudSyncProtectionError::InvalidStorageDirectory + | CloudSyncProtectionError::InvalidSecretStorage + | CloudSyncProtectionError::MissingSecretStorage + | CloudSyncProtectionError::SecretStorage => CloudNativeStoreFailure::InvalidStorage, + CloudSyncProtectionError::UnsupportedPlatform + | CloudSyncProtectionError::InvalidContext + | CloudSyncProtectionError::KeyUnavailable => { + CloudNativeStoreFailure::ProtectionUnavailable + } + } + } + + fn protect_one( + &self, + scope: &CloudNativeProtectionScope, + value: &CloudNativePlaintext, + ) -> Result { + cloud_sync_protector::protect( + self.storage_directory.to_string_lossy().into_owned(), + scope.account_fingerprint.clone(), + scope.container.clone(), + scope.database.clone(), + scope.zone.clone(), + scope.stream_kind.clone(), + scope.schema_version, + value.purpose.value().to_owned(), + value.value.clone(), + ) + .map_err(Self::map_protection_error) + } + + fn persist_batch( + &self, + protected: &[String], + ) -> Result { + let _guard = Self::operation_guard()?; + if protected.is_empty() || protected.len() > MAX_LEASE_FILES { + return Err(CloudNativeStoreFailure::InvalidReference); + } + let protected_batch_bytes = protected + .iter() + .try_fold(0usize, |total, value| total.checked_add(value.len())); + if protected_batch_bytes.is_none_or(|total| total > MAX_PROTECTED_CIPHERTEXT_BATCH_BYTES) { + return Err(CloudNativeStoreFailure::InvalidReference); + } + let store_directory = self.store_directory()?; + fs::create_dir_all(&store_directory).map_err(|_| CloudNativeStoreFailure::Io)?; + let lease_directory = self.lease_directory()?; + let temporary_directory = self.temporary_directory()?; + fs::create_dir_all(&lease_directory).map_err(|_| CloudNativeStoreFailure::Io)?; + fs::create_dir_all(&temporary_directory).map_err(|_| CloudNativeStoreFailure::Io)?; + Self::sync_directory(&store_directory)?; + + let lease_token = Uuid::new_v4().simple().to_string(); + let lease = CloudNativePageLease { + reference: CloudCanonicalProtectedReference::new(format!("obcs2.lease.{lease_token}")) + .map_err(|_| CloudNativeStoreFailure::InvalidReference)?, + }; + let lease_path = self.lease_path(&lease)?; + let mut prepared = Vec::with_capacity(protected.len()); + for ciphertext in protected { + let stored = format!("OBCS2-LEASE:{lease_token}\n{ciphertext}").into_bytes(); + if ciphertext.is_empty() || stored.len() > MAX_PROTECTED_FILE_BYTES { + return Err(CloudNativeStoreFailure::InvalidReference); + } + // A lease-specific token prevents one unadopted page from owning + // or deleting a blob already referenced by another page. + let token = URL_SAFE_NO_PAD.encode(Sha256::digest( + [lease_token.as_bytes(), b"\x1f", stored.as_slice()].concat(), + )); + let reference = CloudCanonicalProtectedReference::new(format!("obcs2.ref.{token}")) + .map_err(|_| CloudNativeStoreFailure::InvalidReference)?; + let destination = store_directory.join(format!("{token}.protected")); + let ciphertext_digest = sha256_hex(&stored); + prepared.push((reference, destination, stored, ciphertext_digest)); + } + + let manifest = prepared + .iter() + .map(|(reference, _, _, digest)| { + format!( + "{}|{}\n", + reference.value().trim_start_matches("obcs2.ref."), + digest + ) + }) + .collect::(); + if manifest.len() > MAX_LEASE_MANIFEST_BYTES { + return Err(CloudNativeStoreFailure::InvalidReference); + } + let temporary_manifest = + temporary_directory.join(format!(".tmp-lease-{lease_token}.manifest")); + OpenOptions::new() + .create_new(true) + .write(true) + .open(&temporary_manifest) + .and_then(|mut file| { + file.write_all(manifest.as_bytes())?; + file.sync_all() + }) + .map_err(|_| CloudNativeStoreFailure::Io)?; + fs::rename(&temporary_manifest, &lease_path).map_err(|_| CloudNativeStoreFailure::Io)?; + Self::sync_directory(&temporary_directory)?; + Self::sync_directory(&lease_directory)?; + + let mut created_destinations = Vec::new(); + let mut temporary_paths = Vec::new(); + let result = (|| { + for (_, destination, stored, _) in &prepared { + if destination + .try_exists() + .map_err(|_| CloudNativeStoreFailure::Io)? + { + // Tokens are lease-specific. Treat any existing path as a + // collision and never claim or remove it. + return Err(CloudNativeStoreFailure::InvalidReference); + } + + let temporary = + temporary_directory.join(format!(".tmp-{}.protected", Uuid::new_v4())); + temporary_paths.push(temporary.clone()); + let mut file = OpenOptions::new() + .create_new(true) + .write(true) + .open(&temporary) + .map_err(|_| CloudNativeStoreFailure::Io)?; + file.write_all(stored) + .and_then(|_| file.sync_all()) + .map_err(|_| CloudNativeStoreFailure::Io)?; + fs::rename(&temporary, destination).map_err(|_| CloudNativeStoreFailure::Io)?; + temporary_paths.retain(|path| path != &temporary); + created_destinations.push(destination.clone()); + Self::sync_directory(&temporary_directory)?; + Self::sync_directory(&store_directory)?; + } + Ok(prepared + .iter() + .map(|(reference, _, _, _)| reference.clone()) + .collect()) + })(); + + if result.is_err() { + for path in temporary_paths { + let _ = fs::remove_file(path); + } + for path in created_destinations { + let _ = fs::remove_file(path); + } + let _ = fs::remove_file(&temporary_manifest); + let _ = fs::remove_file(&lease_path); + let _ = Self::sync_directory(&temporary_directory); + let _ = Self::sync_directory(&lease_directory); + let _ = Self::sync_directory(&store_directory); + } + result.map(|references| CloudNativeProtectedBatch { references, lease }) + } + + fn read_lease_entries( + &self, + lease_path: &Path, + ) -> Result, CloudNativeStoreFailure> { + let metadata = + fs::metadata(lease_path).map_err(|_| CloudNativeStoreFailure::InvalidReference)?; + if metadata.len() == 0 || metadata.len() > MAX_LEASE_MANIFEST_BYTES as u64 { + return Err(CloudNativeStoreFailure::InvalidReference); + } + let manifest = fs::read_to_string(lease_path).map_err(|_| CloudNativeStoreFailure::Io)?; + let entries = manifest.lines().collect::>(); + if entries.is_empty() || entries.len() > MAX_LEASE_FILES { + return Err(CloudNativeStoreFailure::InvalidReference); + } + let mut parsed = Vec::with_capacity(entries.len()); + let mut unique = HashSet::with_capacity(entries.len()); + for entry in entries { + let Some((token, expected_digest)) = entry.split_once('|') else { + return Err(CloudNativeStoreFailure::InvalidReference); + }; + if !is_bare_digest(token) + || expected_digest.len() != 64 + || !expected_digest + .bytes() + .all(|byte| byte.is_ascii_hexdigit() && !byte.is_ascii_uppercase()) + || !unique.insert(token.to_owned()) + { + return Err(CloudNativeStoreFailure::InvalidReference); + } + parsed.push(CloudNativeLeaseManifestEntry { + reference: CloudCanonicalProtectedReference::new(format!("obcs2.ref.{token}")) + .map_err(|_| CloudNativeStoreFailure::InvalidReference)?, + expected_digest: expected_digest.to_owned(), + }); + } + Ok(parsed) + } + + fn read_committed_receipt( + &self, + receipt_path: &Path, + ) -> Result, CloudNativeStoreFailure> { + let metadata = + fs::metadata(receipt_path).map_err(|_| CloudNativeStoreFailure::InvalidReference)?; + if metadata.len() == 0 || metadata.len() > MAX_LEASE_MANIFEST_BYTES as u64 { + return Err(CloudNativeStoreFailure::InvalidReference); + } + let receipt = fs::read_to_string(receipt_path).map_err(|_| CloudNativeStoreFailure::Io)?; + let mut lines = receipt.lines(); + if lines.next() != Some("OBCS2-COMMITTED-LEASE|1") { + return Err(CloudNativeStoreFailure::InvalidReference); + } + let remaining = lines.collect::>(); + if remaining.len() > MAX_LEASE_FILES { + return Err(CloudNativeStoreFailure::InvalidReference); + } + let mut parsed = Vec::with_capacity(remaining.len()); + let mut unique = HashSet::with_capacity(remaining.len()); + for entry in remaining { + let Some((token, expected_digest)) = entry.split_once('|') else { + return Err(CloudNativeStoreFailure::InvalidReference); + }; + if !is_bare_digest(token) + || expected_digest.len() != 64 + || !expected_digest + .bytes() + .all(|byte| byte.is_ascii_hexdigit() && !byte.is_ascii_uppercase()) + || !unique.insert(token.to_owned()) + { + return Err(CloudNativeStoreFailure::InvalidReference); + } + parsed.push(CloudNativeLeaseManifestEntry { + reference: CloudCanonicalProtectedReference::new(format!("obcs2.ref.{token}")) + .map_err(|_| CloudNativeStoreFailure::InvalidReference)?, + expected_digest: expected_digest.to_owned(), + }); + } + Ok(parsed) + } + + fn remove_manifest_entry_if_owned( + &self, + entry: &CloudNativeLeaseManifestEntry, + ) -> Result { + let path = self.reference_path(&entry.reference)?; + let bytes = match fs::read(&path) { + Ok(bytes) => bytes, + Err(error) if error.kind() == std::io::ErrorKind::NotFound => return Ok(false), + Err(_) => return Err(CloudNativeStoreFailure::Io), + }; + // Never delete a pre-existing or replaced file. Only the exact + // ciphertext recorded by this lease is eligible for rollback or + // duplicate-page retirement. + if sha256_hex(&bytes) != entry.expected_digest { + return Ok(false); + } + fs::remove_file(path).map_err(|_| CloudNativeStoreFailure::Io)?; + Ok(true) + } + + fn cleanup_lease_manifest(&self, lease_path: &Path) -> Result<(), CloudNativeStoreFailure> { + let entries = self.read_lease_entries(lease_path)?; + for entry in &entries { + self.remove_manifest_entry_if_owned(entry)?; + } + let store_directory = self.store_directory()?; + fs::remove_file(lease_path).map_err(|_| CloudNativeStoreFailure::Io)?; + Self::sync_directory(&store_directory)?; + Self::sync_directory(&self.lease_directory()?) + } + + fn validate_reference_set( + references: &HashSet, + maximum: usize, + ) -> Result<(), CloudNativeStoreFailure> { + if references.len() > maximum + || references.iter().any(|reference| { + reference + .strip_prefix("obcs2.ref.") + .is_none_or(|token| !is_bare_digest(token)) + }) + { + return Err(CloudNativeStoreFailure::InvalidReference); + } + Ok(()) + } + + fn verify_retained_entry( + &self, + entry: &CloudNativeLeaseManifestEntry, + ) -> Result<(), CloudNativeStoreFailure> { + let bytes = fs::read(self.reference_path(&entry.reference)?) + .map_err(|_| CloudNativeStoreFailure::Io)?; + if sha256_hex(&bytes) != entry.expected_digest { + return Err(CloudNativeStoreFailure::InvalidReference); + } + Ok(()) + } + + fn write_committed_receipt( + &self, + lease: &CloudNativePageLease, + retained_entries: &[CloudNativeLeaseManifestEntry], + ) -> Result<(), CloudNativeStoreFailure> { + let committed_directory = self.committed_lease_directory()?; + let temporary_directory = self.temporary_directory()?; + fs::create_dir_all(&committed_directory).map_err(|_| CloudNativeStoreFailure::Io)?; + fs::create_dir_all(&temporary_directory).map_err(|_| CloudNativeStoreFailure::Io)?; + let receipt_path = self.committed_lease_path(lease)?; + let mut body = String::from("OBCS2-COMMITTED-LEASE|1\n"); + for entry in retained_entries { + body.push_str(entry.reference.value().trim_start_matches("obcs2.ref.")); + body.push('|'); + body.push_str(&entry.expected_digest); + body.push('\n'); + } + if body.len() > MAX_LEASE_MANIFEST_BYTES { + return Err(CloudNativeStoreFailure::InvalidReference); + } + if receipt_path + .try_exists() + .map_err(|_| CloudNativeStoreFailure::Io)? + { + let existing = self.read_committed_receipt(&receipt_path)?; + if !same_manifest_entries(&existing, retained_entries) { + return Err(CloudNativeStoreFailure::InvalidReference); + } + return Ok(()); + } + let temporary = temporary_directory.join(format!(".tmp-commit-{}.receipt", Uuid::new_v4())); + OpenOptions::new() + .create_new(true) + .write(true) + .open(&temporary) + .and_then(|mut file| { + file.write_all(body.as_bytes())?; + file.sync_all() + }) + .map_err(|_| CloudNativeStoreFailure::Io)?; + fs::rename(&temporary, &receipt_path).map_err(|_| CloudNativeStoreFailure::Io)?; + Self::sync_directory(&temporary_directory)?; + Self::sync_directory(&committed_directory) + } + + fn commit_lease_unlocked( + &self, + lease: &CloudNativePageLease, + retained_references: &HashSet, + ) -> Result<(), CloudNativeStoreFailure> { + Self::validate_reference_set(retained_references, MAX_LEASE_FILES)?; + let lease_path = self.lease_path(lease)?; + let receipt_path = self.committed_lease_path(lease)?; + if !lease_path + .try_exists() + .map_err(|_| CloudNativeStoreFailure::Io)? + { + if !receipt_path + .try_exists() + .map_err(|_| CloudNativeStoreFailure::Io)? + { + return Err(CloudNativeStoreFailure::InvalidReference); + } + let receipt = self.read_committed_receipt(&receipt_path)?; + let receipt_references = receipt + .iter() + .map(|entry| entry.reference.value().to_owned()) + .collect::>(); + if &receipt_references != retained_references { + return Err(CloudNativeStoreFailure::InvalidReference); + } + for entry in &receipt { + self.verify_retained_entry(entry)?; + } + return Ok(()); + } + + let entries = self.read_lease_entries(&lease_path)?; + let manifest_references = entries + .iter() + .map(|entry| entry.reference.value().to_owned()) + .collect::>(); + if !manifest_references.is_superset(retained_references) { + return Err(CloudNativeStoreFailure::InvalidReference); + } + let retained_entries = entries + .iter() + .filter(|entry| retained_references.contains(entry.reference.value())) + .cloned() + .collect::>(); + for entry in &retained_entries { + self.verify_retained_entry(entry)?; + } + for entry in entries + .iter() + .filter(|entry| !retained_references.contains(entry.reference.value())) + { + self.remove_manifest_entry_if_owned(entry)?; + } + self.write_committed_receipt(lease, &retained_entries)?; + fs::remove_file(&lease_path).map_err(|_| CloudNativeStoreFailure::Io)?; + Self::sync_directory(&self.store_directory()?)?; + Self::sync_directory(&self.lease_directory()?) + } + + fn acknowledge_committed_lease_unlocked( + &self, + lease: &CloudNativePageLease, + ) -> Result<(), CloudNativeStoreFailure> { + let path = self.committed_lease_path(lease)?; + match fs::remove_file(&path) { + Ok(()) => Self::sync_directory(&self.committed_lease_directory()?), + Err(error) if error.kind() == std::io::ErrorKind::NotFound => Ok(()), + Err(_) => Err(CloudNativeStoreFailure::Io), + } + } + + fn verify_committed_lease_exact_unlocked( + &self, + lease: &CloudNativePageLease, + retained_references: &HashSet, + ) -> Result<(), CloudNativeStoreFailure> { + Self::validate_reference_set(retained_references, MAX_LEASE_FILES)?; + if retained_references.is_empty() { + return Err(CloudNativeStoreFailure::InvalidReference); + } + // A receipt written before the active manifest is retired represents + // an interrupted commit, not a lease that is safe to submit. Recovery + // or an idempotent commit must finish that transition first. + if self + .lease_path(lease)? + .try_exists() + .map_err(|_| CloudNativeStoreFailure::Io)? + { + return Err(CloudNativeStoreFailure::InvalidReference); + } + let receipt_path = self.committed_lease_path(lease)?; + if !receipt_path + .try_exists() + .map_err(|_| CloudNativeStoreFailure::Io)? + { + return Err(CloudNativeStoreFailure::InvalidReference); + } + let receipt = self.read_committed_receipt(&receipt_path)?; + let receipt_references = receipt + .iter() + .map(|entry| entry.reference.value().to_owned()) + .collect::>(); + if &receipt_references != retained_references { + return Err(CloudNativeStoreFailure::InvalidReference); + } + for entry in &receipt { + self.verify_retained_entry(entry)?; + } + Ok(()) + } + + fn verify_committed_lease_exact( + &self, + lease: &CloudNativePageLease, + retained_references: &HashSet, + ) -> Result<(), CloudNativeStoreFailure> { + let _guard = Self::operation_guard()?; + self.verify_committed_lease_exact_unlocked(lease, retained_references) + } + + fn reference_file_matches(reference: &CloudCanonicalProtectedReference, bytes: &[u8]) -> bool { + let Some(token) = reference.value().strip_prefix("obcs2.ref.") else { + return false; + }; + let Some(newline) = bytes.iter().position(|byte| *byte == b'\n') else { + return false; + }; + let Ok(owner) = std::str::from_utf8(&bytes[..newline]) else { + return false; + }; + let Some(lease_token) = owner.strip_prefix("OBCS2-LEASE:") else { + return false; + }; + if !is_lease_token(lease_token) { + return false; + } + URL_SAFE_NO_PAD.encode(Sha256::digest( + [lease_token.as_bytes(), b"\x1f", bytes].concat(), + )) == token + } + + fn retire_references_unlocked( + &self, + references: &HashSet, + ) -> Result { + Self::validate_reference_set(references, MAX_RETIRE_REFERENCES_PER_CALL)?; + let mut removed = 0; + for value in references { + let reference = CloudCanonicalProtectedReference::new(value.clone()) + .map_err(|_| CloudNativeStoreFailure::InvalidReference)?; + let path = self.reference_path(&reference)?; + let bytes = match fs::read(&path) { + Ok(bytes) => bytes, + Err(error) if error.kind() == std::io::ErrorKind::NotFound => continue, + Err(_) => return Err(CloudNativeStoreFailure::Io), + }; + if !Self::reference_file_matches(&reference, &bytes) { + return Err(CloudNativeStoreFailure::InvalidReference); + } + fs::remove_file(path).map_err(|_| CloudNativeStoreFailure::Io)?; + removed += 1; + } + if removed > 0 { + Self::sync_directory(&self.store_directory()?)?; + } + Ok(removed) + } + + fn active_manifest_references_unlocked( + &self, + ) -> Result, CloudNativeStoreFailure> { + let directory = self.lease_directory()?; + if !directory + .try_exists() + .map_err(|_| CloudNativeStoreFailure::Io)? + { + return Ok(HashSet::new()); + } + let mut paths = Vec::new(); + for entry in fs::read_dir(&directory).map_err(|_| CloudNativeStoreFailure::Io)? { + let path = entry.map_err(|_| CloudNativeStoreFailure::Io)?.path(); + if path + .file_name() + .and_then(|name| name.to_str()) + .is_some_and(|name| name.starts_with(".lease-") && name.ends_with(".manifest")) + { + paths.push(path); + if paths.len() > MAX_GC_ACTIVE_MANIFESTS { + return Err(CloudNativeStoreFailure::InvalidReference); + } + } + } + let mut references = HashSet::new(); + for path in paths { + for entry in self.read_lease_entries(&path)? { + references.insert(entry.reference.value().to_owned()); + if references.len() > MAX_LIVE_REFERENCES_PER_MAINTENANCE { + return Err(CloudNativeStoreFailure::InvalidReference); + } + } + } + Ok(references) + } + + fn read_gc_cursor(&self) -> Result, CloudNativeStoreFailure> { + let path = self.gc_directory()?.join(GC_CURSOR_FILE_NAME); + let value = match fs::read_to_string(path) { + Ok(value) => value, + Err(error) if error.kind() == std::io::ErrorKind::NotFound => return Ok(None), + Err(_) => return Err(CloudNativeStoreFailure::Io), + }; + let token = value.trim(); + if token.is_empty() { + Ok(None) + } else if is_bare_digest(token) { + Ok(Some(token.to_owned())) + } else { + Err(CloudNativeStoreFailure::InvalidReference) + } + } + + fn write_gc_cursor(&self, cursor: Option<&str>) -> Result<(), CloudNativeStoreFailure> { + let directory = self.gc_directory()?; + let temporary_directory = self.temporary_directory()?; + fs::create_dir_all(&directory).map_err(|_| CloudNativeStoreFailure::Io)?; + fs::create_dir_all(&temporary_directory).map_err(|_| CloudNativeStoreFailure::Io)?; + let destination = directory.join(GC_CURSOR_FILE_NAME); + let temporary = temporary_directory.join(format!(".tmp-gc-cursor-{}", Uuid::new_v4())); + OpenOptions::new() + .create_new(true) + .write(true) + .open(&temporary) + .and_then(|mut file| { + if let Some(cursor) = cursor { + file.write_all(cursor.as_bytes())?; + } + file.write_all(b"\n")?; + file.sync_all() + }) + .map_err(|_| CloudNativeStoreFailure::Io)?; + match fs::remove_file(&destination) { + Ok(()) => {} + Err(error) if error.kind() == std::io::ErrorKind::NotFound => {} + Err(_) => return Err(CloudNativeStoreFailure::Io), + } + fs::rename(&temporary, &destination).map_err(|_| CloudNativeStoreFailure::Io)?; + Self::sync_directory(&temporary_directory)?; + Self::sync_directory(&directory) + } + + fn read_gc_first_seen(&self, token: &str) -> Result, CloudNativeStoreFailure> { + let path = self.gc_candidate_path(token)?; + let value = match fs::read_to_string(path) { + Ok(value) => value, + Err(error) if error.kind() == std::io::ErrorKind::NotFound => return Ok(None), + Err(_) => return Err(CloudNativeStoreFailure::Io), + }; + let first_seen = value + .trim() + .parse::() + .map_err(|_| CloudNativeStoreFailure::InvalidReference)?; + Ok(Some(first_seen)) + } + + fn write_gc_first_seen( + &self, + token: &str, + now_seconds: u64, + ) -> Result<(), CloudNativeStoreFailure> { + let directory = self.gc_directory()?; + fs::create_dir_all(&directory).map_err(|_| CloudNativeStoreFailure::Io)?; + let path = self.gc_candidate_path(token)?; + match OpenOptions::new().create_new(true).write(true).open(path) { + Ok(mut file) => { + writeln!(file, "{now_seconds}").map_err(|_| CloudNativeStoreFailure::Io)?; + file.sync_all().map_err(|_| CloudNativeStoreFailure::Io)?; + Self::sync_directory(&directory) + } + Err(error) if error.kind() == std::io::ErrorKind::AlreadyExists => Ok(()), + Err(_) => Err(CloudNativeStoreFailure::Io), + } + } + + fn clear_gc_candidate(&self, token: &str) -> Result<(), CloudNativeStoreFailure> { + match fs::remove_file(self.gc_candidate_path(token)?) { + Ok(()) => Self::sync_directory(&self.gc_directory()?), + Err(error) if error.kind() == std::io::ErrorKind::NotFound => Ok(()), + Err(_) => Err(CloudNativeStoreFailure::Io), + } + } + + fn collect_garbage_unlocked_at( + &self, + live_references: &HashSet, + live_reference_enumeration_complete: bool, + now_seconds: u64, + ) -> Result { + if !live_reference_enumeration_complete { + return Err(CloudNativeStoreFailure::InvalidReference); + } + Self::validate_reference_set(live_references, MAX_LIVE_REFERENCES_PER_MAINTENANCE)?; + let store_directory = self.store_directory()?; + if !store_directory + .try_exists() + .map_err(|_| CloudNativeStoreFailure::Io)? + { + return Ok(CloudNativeGarbageCollectionSummary::default()); + } + let active_references = self.active_manifest_references_unlocked()?; + let cursor = self.read_gc_cursor()?; + // Keep only the lexicographically earliest page plus one look-ahead + // token. Directory traversal may visit every filename, but resident + // candidate memory and every content/delete operation stay bounded. + let mut tokens = BTreeSet::new(); + for entry in fs::read_dir(&store_directory).map_err(|_| CloudNativeStoreFailure::Io)? { + let path = entry.map_err(|_| CloudNativeStoreFailure::Io)?.path(); + let Some(name) = path.file_name().and_then(|name| name.to_str()) else { + return Err(CloudNativeStoreFailure::InvalidReference); + }; + let Some(token) = name.strip_suffix(".protected") else { + continue; + }; + if !is_bare_digest(token) { + return Err(CloudNativeStoreFailure::InvalidReference); + } + if cursor + .as_ref() + .is_some_and(|cursor| token <= cursor.as_str()) + { + continue; + } + tokens.insert(token.to_owned()); + if tokens.len() > MAX_GC_REFERENCES_PER_PASS + 1 { + let largest = tokens + .iter() + .next_back() + .expect("bounded token set is non-empty") + .clone(); + tokens.remove(&largest); + } + } + let remaining = tokens + .iter() + .take(MAX_GC_REFERENCES_PER_PASS + 1) + .cloned() + .collect::>(); + let has_more = remaining.len() > MAX_GC_REFERENCES_PER_PASS; + let selected = remaining + .into_iter() + .take(MAX_GC_REFERENCES_PER_PASS) + .collect::>(); + let mut summary = CloudNativeGarbageCollectionSummary { + scanned: selected.len(), + has_more, + ..CloudNativeGarbageCollectionSummary::default() + }; + for token in &selected { + let reference_value = format!("obcs2.ref.{token}"); + if live_references.contains(&reference_value) { + self.clear_gc_candidate(token)?; + summary.preserved_live += 1; + continue; + } + if active_references.contains(&reference_value) { + self.clear_gc_candidate(token)?; + summary.preserved_active_lease += 1; + continue; + } + let first_seen = self.read_gc_first_seen(token)?; + if first_seen.is_none() { + self.write_gc_first_seen(token, now_seconds)?; + summary.first_observed += 1; + continue; + } + if now_seconds.saturating_sub(first_seen.expect("checked")) < GC_GRACE_PERIOD.as_secs() + { + continue; + } + let reference = CloudCanonicalProtectedReference::new(reference_value) + .map_err(|_| CloudNativeStoreFailure::InvalidReference)?; + let bytes = fs::read(self.reference_path(&reference)?) + .map_err(|_| CloudNativeStoreFailure::Io)?; + if !Self::reference_file_matches(&reference, &bytes) { + return Err(CloudNativeStoreFailure::InvalidReference); + } + // Clear the mark first. A crash before deletion then leaks the + // blob and requires two fresh scans; deleting first could leave + // unbounded orphan marker files after repeated crashes. + self.clear_gc_candidate(token)?; + fs::remove_file(self.reference_path(&reference)?) + .map_err(|_| CloudNativeStoreFailure::Io)?; + summary.deleted += 1; + } + let next_cursor = if has_more { + selected.last().map(String::as_str) + } else { + None + }; + self.write_gc_cursor(next_cursor)?; + if summary.deleted > 0 { + Self::sync_directory(&store_directory)?; + } + Ok(summary) + } +} + +fn same_manifest_entries( + left: &[CloudNativeLeaseManifestEntry], + right: &[CloudNativeLeaseManifestEntry], +) -> bool { + let to_set = |entries: &[CloudNativeLeaseManifestEntry]| { + entries + .iter() + .map(|entry| { + ( + entry.reference.value().to_owned(), + entry.expected_digest.clone(), + ) + }) + .collect::>() + }; + to_set(left) == to_set(right) +} + +impl CloudNativeProtectedStore for PlatformCloudNativeProtectedStore { + fn protect_batch( + &self, + scope: &CloudNativeProtectionScope, + values: &[CloudNativePlaintext], + ) -> Result { + // Platform protection is completed for the entire page before the + // first durable reference is made visible. + let protected = values + .iter() + .map(|value| self.protect_one(scope, value)) + .collect::, _>>()?; + self.persist_batch(&protected) + } + + fn unprotect( + &self, + scope: &CloudNativeProtectionScope, + purpose: CloudNativeProtectionPurpose, + reference: &CloudCanonicalProtectedReference, + ) -> Result { + let _guard = Self::operation_guard()?; + let path = self.reference_path(reference)?; + let metadata = + fs::metadata(&path).map_err(|_| CloudNativeStoreFailure::InvalidReference)?; + if metadata.len() == 0 || metadata.len() > MAX_PROTECTED_FILE_BYTES as u64 { + return Err(CloudNativeStoreFailure::InvalidReference); + } + let mut ciphertext = String::new(); + File::open(path) + .and_then(|mut file| file.read_to_string(&mut ciphertext)) + .map_err(|_| CloudNativeStoreFailure::Io)?; + let ciphertext = ciphertext + .split_once('\n') + .filter(|(owner, ciphertext)| { + owner + .strip_prefix("OBCS2-LEASE:") + .is_some_and(|token| is_lease_token(token)) + && !ciphertext.is_empty() + }) + .map(|(_, ciphertext)| ciphertext.to_owned()) + .ok_or(CloudNativeStoreFailure::InvalidReference)?; + cloud_sync_protector::unprotect( + self.storage_directory.to_string_lossy().into_owned(), + scope.account_fingerprint.clone(), + scope.container.clone(), + scope.database.clone(), + scope.zone.clone(), + scope.stream_kind.clone(), + scope.schema_version, + purpose.value().to_owned(), + ciphertext, + ) + .map_err(Self::map_protection_error) + } + + fn commit_lease( + &self, + lease: &CloudNativePageLease, + retained_references: &HashSet, + ) -> Result<(), CloudNativeStoreFailure> { + let _guard = Self::operation_guard()?; + self.commit_lease_unlocked(lease, retained_references) + } + + fn acknowledge_committed_lease( + &self, + lease: &CloudNativePageLease, + ) -> Result<(), CloudNativeStoreFailure> { + let _guard = Self::operation_guard()?; + self.acknowledge_committed_lease_unlocked(lease) + } + + fn rollback_lease(&self, lease: &CloudNativePageLease) -> Result<(), CloudNativeStoreFailure> { + let _guard = Self::operation_guard()?; + let lease_path = self.lease_path(lease)?; + if !lease_path + .try_exists() + .map_err(|_| CloudNativeStoreFailure::Io)? + { + return Ok(()); + } + self.cleanup_lease_manifest(&lease_path) + } + + fn recover_abandoned_leases( + &self, + adopted_lease_references: &HashSet, + live_references: &HashSet, + live_reference_enumeration_complete: bool, + ) -> Result { + if !live_reference_enumeration_complete { + return Err(CloudNativeStoreFailure::InvalidReference); + } + Self::validate_reference_set(live_references, MAX_LIVE_REFERENCES_PER_MAINTENANCE)?; + let _guard = Self::operation_guard()?; + let store_directory = self.store_directory()?; + if !store_directory + .try_exists() + .map_err(|_| CloudNativeStoreFailure::Io)? + { + return Ok(CloudNativeRecoverySummary { + absent_adopted_lease_references: adopted_lease_references + .iter() + .map(|reference| { + CloudCanonicalProtectedReference::new(reference.clone()) + .map_err(|_| CloudNativeStoreFailure::InvalidReference) + }) + .collect::, _>>()?, + ..CloudNativeRecoverySummary::default() + }); + } + let lease_directory = self.lease_directory()?; + let temporary_directory = self.temporary_directory()?; + let mut lease_paths = Vec::with_capacity(MAX_RECOVERY_MANIFESTS_PER_PASS + 1); + if lease_directory + .try_exists() + .map_err(|_| CloudNativeStoreFailure::Io)? + { + for entry in fs::read_dir(&lease_directory).map_err(|_| CloudNativeStoreFailure::Io)? { + let path = entry.map_err(|_| CloudNativeStoreFailure::Io)?.path(); + if path + .file_name() + .and_then(|name| name.to_str()) + .is_some_and(|name| name.starts_with(".lease-") && name.ends_with(".manifest")) + { + lease_paths.push(path); + if lease_paths.len() > MAX_RECOVERY_MANIFESTS_PER_PASS { + break; + } + } + } + } + lease_paths.sort(); + let has_more_manifests = lease_paths.len() > MAX_RECOVERY_MANIFESTS_PER_PASS; + lease_paths.truncate(MAX_RECOVERY_MANIFESTS_PER_PASS); + let mut temporary_paths = Vec::with_capacity(MAX_RECOVERY_TEMPORARY_FILES_PER_PASS + 1); + if temporary_directory + .try_exists() + .map_err(|_| CloudNativeStoreFailure::Io)? + { + for entry in + fs::read_dir(&temporary_directory).map_err(|_| CloudNativeStoreFailure::Io)? + { + let path = entry.map_err(|_| CloudNativeStoreFailure::Io)?.path(); + if path + .file_name() + .and_then(|name| name.to_str()) + .is_some_and(|name| name.starts_with(".tmp-")) + { + temporary_paths.push(path); + if temporary_paths.len() > MAX_RECOVERY_TEMPORARY_FILES_PER_PASS { + break; + } + } + } + } + temporary_paths.sort(); + let has_more_temporary = temporary_paths.len() > MAX_RECOVERY_TEMPORARY_FILES_PER_PASS; + temporary_paths.truncate(MAX_RECOVERY_TEMPORARY_FILES_PER_PASS); + for path in &temporary_paths { + fs::remove_file(path).map_err(|_| CloudNativeStoreFailure::Io)?; + } + if !temporary_paths.is_empty() { + Self::sync_directory(&temporary_directory)?; + } + let committed_directory = self.committed_lease_directory()?; + let mut receipt_paths = Vec::with_capacity(MAX_RECOVERY_MANIFESTS_PER_PASS + 1); + if committed_directory + .try_exists() + .map_err(|_| CloudNativeStoreFailure::Io)? + { + let remaining_capacity = + MAX_RECOVERY_MANIFESTS_PER_PASS.saturating_sub(lease_paths.len()); + for entry in + fs::read_dir(&committed_directory).map_err(|_| CloudNativeStoreFailure::Io)? + { + let path = entry.map_err(|_| CloudNativeStoreFailure::Io)?.path(); + if path + .file_name() + .and_then(|name| name.to_str()) + .is_some_and(|name| name.starts_with(".lease-") && name.ends_with(".receipt")) + { + receipt_paths.push(path); + if receipt_paths.len() > remaining_capacity { + break; + } + } + } + } + receipt_paths.sort(); + let has_more_receipts = + lease_paths.len() + receipt_paths.len() > MAX_RECOVERY_MANIFESTS_PER_PASS; + receipt_paths.truncate(MAX_RECOVERY_MANIFESTS_PER_PASS.saturating_sub(lease_paths.len())); + let has_more = has_more_manifests || has_more_temporary || has_more_receipts; + let manifest_lease_references = lease_paths + .iter() + .map(|path| Self::lease_from_path(path)) + .collect::, _>>()?; + let receipt_lease_references = receipt_paths + .iter() + .map(|path| Self::committed_lease_from_path(path)) + .collect::, _>>()?; + let mut summary = CloudNativeRecoverySummary { + has_more, + removed_temporary_files: temporary_paths.len(), + ..CloudNativeRecoverySummary::default() + }; + for (path, lease) in lease_paths + .into_iter() + .zip(manifest_lease_references.iter().cloned()) + { + if adopted_lease_references.contains(lease.reference.value()) { + let retained = self + .read_lease_entries(&path)? + .into_iter() + .map(|entry| entry.reference.value().to_owned()) + .filter(|reference| live_references.contains(reference)) + .collect::>(); + self.commit_lease_unlocked(&lease, &retained)?; + summary + .finalized_adopted_lease_references + .push(lease.reference); + } else { + if self + .read_lease_entries(&path)? + .iter() + .any(|entry| live_references.contains(entry.reference.value())) + { + // ObjectBox journal rows and their adoption marker are one + // transaction. A live reference without that marker + // violates the contract; fail closed instead of rolling + // back data that ObjectBox still names. + return Err(CloudNativeStoreFailure::InvalidReference); + } + self.cleanup_lease_manifest(&path)?; + summary.rolled_back += 1; + } + } + for (path, lease) in receipt_paths + .into_iter() + .zip(receipt_lease_references.iter().cloned()) + { + if adopted_lease_references.contains(lease.reference.value()) { + // A crash after the durable receipt rename but before active + // manifest removal can leave both files. The manifest branch + // above finishes that commit; do not report the same lease + // twice through the safe bridge result. + if summary + .finalized_adopted_lease_references + .iter() + .any(|reference| reference.value() == lease.reference.value()) + { + continue; + } + let receipt = self.read_committed_receipt(&path)?; + let retained = receipt + .iter() + .map(|entry| entry.reference.value().to_owned()) + .collect::>(); + if !live_references.is_superset(&retained) { + return Err(CloudNativeStoreFailure::InvalidReference); + } + self.commit_lease_unlocked(&lease, &retained)?; + summary + .finalized_adopted_lease_references + .push(lease.reference); + } else { + fs::remove_file(&path).map_err(|_| CloudNativeStoreFailure::Io)?; + Self::sync_directory(&committed_directory)?; + } + } + if !has_more { + let present = manifest_lease_references + .iter() + .chain(receipt_lease_references.iter()) + .map(|lease| lease.reference.value()) + .collect::>(); + summary.absent_adopted_lease_references = adopted_lease_references + .iter() + .filter(|reference| !present.contains(reference.as_str())) + .map(|reference| { + CloudCanonicalProtectedReference::new(reference.clone()) + .map_err(|_| CloudNativeStoreFailure::InvalidReference) + }) + .collect::, _>>()?; + summary + .absent_adopted_lease_references + .sort_by(|left, right| left.value().cmp(right.value())); + } + Ok(summary) + } + + fn retire_references( + &self, + references: &HashSet, + ) -> Result { + let _guard = Self::operation_guard()?; + self.retire_references_unlocked(references) + } + + fn collect_garbage( + &self, + live_references: &HashSet, + live_reference_enumeration_complete: bool, + ) -> Result { + let now_seconds = SystemTime::now() + .duration_since(UNIX_EPOCH) + .map_err(|_| CloudNativeStoreFailure::Io)? + .as_secs(); + let _guard = Self::operation_guard()?; + self.collect_garbage_unlocked_at( + live_references, + live_reference_enumeration_complete, + now_seconds, + ) + } +} + +#[derive(Clone, Copy, Debug, Eq, PartialEq)] +pub(crate) enum CloudNativeChangeKind { + Save, + Delete, + Quarantined, +} + +#[derive(Clone, Copy, Debug, Eq, PartialEq)] +pub(crate) enum CloudNativePreflightCode { + UnsupportedRecordType, + MalformedMetadata, + OversizedRecord, + InvalidChangeShape, +} + +#[derive(Clone, Eq, PartialEq)] +pub(crate) struct CloudNativeProtectedChange { + change_id: CloudCanonicalHash, + record_id_hash: CloudCanonicalHash, + etag_hash: Option, + kind: CloudNativeChangeKind, + payload_digest: CloudCanonicalDigest, + payload_length: u64, + protected_record_identity_reference: CloudCanonicalProtectedReference, + protected_raw_envelope_reference: CloudCanonicalProtectedReference, + server_modified_at_millis: Option, + preflight_code: Option, + is_tombstone: bool, +} + +impl Debug for CloudNativeProtectedChange { + fn fmt(&self, formatter: &mut Formatter<'_>) -> fmt::Result { + formatter + .debug_struct("CloudNativeProtectedChange") + .field("kind", &self.kind) + .field("payload_length", &self.payload_length) + .field("preflight_code", &self.preflight_code) + .finish_non_exhaustive() + } +} + +impl CloudNativeProtectedChange { + pub(crate) fn change_id(&self) -> &str { + self.change_id.value() + } + + pub(crate) fn record_id_hash(&self) -> &str { + self.record_id_hash.value() + } + + pub(crate) fn etag_hash(&self) -> Option<&str> { + self.etag_hash.as_ref().map(CloudCanonicalHash::value) + } + + pub(crate) fn protected_record_identity_reference(&self) -> &str { + self.protected_record_identity_reference.value() + } + + pub(crate) fn protected_raw_envelope_reference(&self) -> &str { + self.protected_raw_envelope_reference.value() + } + + pub(crate) fn kind(&self) -> CloudNativeChangeKind { + self.kind + } + + pub(crate) fn payload_digest(&self) -> &str { + self.payload_digest.value() + } + + pub(crate) fn payload_length(&self) -> u64 { + self.payload_length + } + + pub(crate) fn server_modified_at_millis(&self) -> Option { + self.server_modified_at_millis + } + + pub(crate) fn preflight_code(&self) -> Option { + self.preflight_code + } + + pub(crate) fn is_tombstone(&self) -> bool { + self.is_tombstone + } +} + +#[derive(Clone, Eq, PartialEq)] +pub(crate) struct CloudNativeProtectedPage { + changes: Vec, + batch_id: CloudCanonicalHash, + generation: u64, + page_lease: CloudNativePageLease, + protected_next_checkpoint_reference: Option, + status: i32, + complete: bool, + admitted_raw_bytes: u64, +} + +impl Debug for CloudNativeProtectedPage { + fn fmt(&self, formatter: &mut Formatter<'_>) -> fmt::Result { + formatter + .debug_struct("CloudNativeProtectedPage") + .field("change_count", &self.changes.len()) + .field("generation", &self.generation) + .field("has_page_lease", &true) + .field("status", &self.status) + .field("complete", &self.complete) + .field("admitted_raw_bytes", &self.admitted_raw_bytes) + .finish() + } +} + +impl CloudNativeProtectedPage { + pub(crate) fn page_lease_reference(&self) -> &str { + self.page_lease.value() + } + + pub(crate) fn changes(&self) -> &[CloudNativeProtectedChange] { + &self.changes + } + + pub(crate) fn batch_id(&self) -> &str { + self.batch_id.value() + } + + pub(crate) fn generation(&self) -> u64 { + self.generation + } + + pub(crate) fn protected_next_checkpoint_reference(&self) -> Option<&str> { + self.protected_next_checkpoint_reference + .as_ref() + .map(CloudCanonicalProtectedReference::value) + } + + pub(crate) fn status(&self) -> i32 { + self.status + } + + pub(crate) fn complete(&self) -> bool { + self.complete + } + + pub(crate) fn admitted_raw_bytes(&self) -> u64 { + self.admitted_raw_bytes + } +} + +#[derive(Clone, Copy, Debug, Eq, PartialEq)] +pub(crate) enum CloudNativeFailureCategory { + Network, + Throttled, + Server, + Authorization, + PcsUnavailable, + MalformedRecord, + Conflict, + LocalStorage, + Unknown, +} + +#[derive(Clone, Copy, Debug, Eq, PartialEq)] +pub(crate) enum CloudNativeSafeCode { + InvalidScope, + InvalidRequest, + InvalidCheckpoint, + CheckpointContextMismatch, + OversizedPage, + OversizedRecord, + ProtectionFailed, + LocalStoreFailed, + FetchDeadline, + Network, + CloudKitThrottled, + CloudKitServer, + CloudKitAuthorization, + CloudKitConflict, + CloudKitResetRequired, + CloudKitPermanent, + CloudKitUnknown, + HttpAuthorization, + HttpTimeout, + HttpThrottled, + HttpServer, + HttpUnknown, + PcsUnavailable, + MalformedResponse, + ContinuationNoProgress, + Unknown, +} + +#[derive(Clone, Eq, PartialEq)] +pub(crate) struct CloudNativeFetchFailure { + category: CloudNativeFailureCategory, + safe_code: CloudNativeSafeCode, + retry_after_seconds: Option, +} + +impl CloudNativeFetchFailure { + fn new( + category: CloudNativeFailureCategory, + safe_code: CloudNativeSafeCode, + retry_after_seconds: Option, + ) -> Self { + Self { + category, + safe_code, + retry_after_seconds, + } + } + + pub(crate) fn category(&self) -> CloudNativeFailureCategory { + self.category + } + + pub(crate) fn safe_code(&self) -> CloudNativeSafeCode { + self.safe_code + } + + pub(crate) fn retry_after_seconds(&self) -> Option { + self.retry_after_seconds + } +} + +impl Debug for CloudNativeFetchFailure { + fn fmt(&self, formatter: &mut Formatter<'_>) -> fmt::Result { + formatter + .debug_struct("CloudNativeFetchFailure") + .field("category", &self.category) + .field("safe_code", &self.safe_code) + .field("retry_after_seconds", &self.retry_after_seconds) + .finish() + } +} + +#[derive(Clone, Eq, PartialEq)] +pub(crate) enum CloudNativeProtectedFetchOutcome { + Page(CloudNativeProtectedPage), + Failure(CloudNativeFetchFailure), +} + +impl Debug for CloudNativeProtectedFetchOutcome { + fn fmt(&self, formatter: &mut Formatter<'_>) -> fmt::Result { + match self { + Self::Page(page) => page.fmt(formatter), + Self::Failure(failure) => failure.fmt(formatter), + } + } +} + +pub(crate) struct CloudNativeFetchRequest<'a> { + stream: CloudNativeStream, + scope: &'a CloudNativeProtectionScope, + generation: u64, + previous_checkpoint_reference: Option<&'a str>, + maximum_changes: u32, +} + +impl<'a> CloudNativeFetchRequest<'a> { + pub(crate) fn new( + stream: CloudNativeStream, + scope: &'a CloudNativeProtectionScope, + generation: u64, + previous_checkpoint_reference: Option<&'a str>, + maximum_changes: u32, + ) -> Self { + Self { + stream, + scope, + generation, + previous_checkpoint_reference, + maximum_changes, + } + } +} + +impl Debug for CloudNativeFetchRequest<'_> { + fn fmt(&self, formatter: &mut Formatter<'_>) -> fmt::Result { + formatter + .debug_struct("CloudNativeFetchRequest") + .field("stream", &self.stream) + .field("generation", &self.generation) + .field("maximum_changes", &self.maximum_changes) + .field( + "has_previous_checkpoint", + &self.previous_checkpoint_reference.is_some(), + ) + .finish() + } +} + +fn is_bare_digest(value: &str) -> bool { + value.len() == 43 + && value + .bytes() + .all(|byte| byte.is_ascii_alphanumeric() || matches!(byte, b'_' | b'-')) +} + +fn is_lease_token(value: &str) -> bool { + value.len() == 32 + && value + .bytes() + .all(|byte| byte.is_ascii_digit() || matches!(byte, b'a'..=b'f')) +} + +fn append_bytes(target: &mut Vec, value: &[u8]) -> Result<(), CloudNativeFetchFailure> { + let length = u32::try_from(value.len()).map_err(|_| { + CloudNativeFetchFailure::new( + CloudNativeFailureCategory::MalformedRecord, + CloudNativeSafeCode::OversizedRecord, + None, + ) + })?; + target.extend_from_slice(&length.to_be_bytes()); + target.extend_from_slice(value); + Ok(()) +} + +fn append_optional_bytes( + target: &mut Vec, + value: Option<&[u8]>, +) -> Result<(), CloudNativeFetchFailure> { + match value { + Some(value) => { + target.push(1); + append_bytes(target, value) + } + None => { + target.push(0); + Ok(()) + } + } +} + +fn append_optional_string( + target: &mut Vec, + value: Option<&str>, +) -> Result<(), CloudNativeFetchFailure> { + append_optional_bytes(target, value.map(str::as_bytes)) +} + +fn append_optional_i32(target: &mut Vec, value: Option) { + match value { + Some(value) => { + target.push(1); + target.extend_from_slice(&value.to_be_bytes()); + } + None => target.push(0), + } +} + +fn append_optional_u32(target: &mut Vec, value: Option) { + match value { + Some(value) => { + target.push(1); + target.extend_from_slice(&value.to_be_bytes()); + } + None => target.push(0), + } +} + +fn append_optional_f64(target: &mut Vec, value: Option) { + match value { + Some(value) => { + target.push(1); + target.extend_from_slice(&value.to_bits().to_be_bytes()); + } + None => target.push(0), + } +} + +fn encode_record_identity( + generation: u64, + stream: CloudNativeStream, + record_name: Option<&str>, +) -> Result { + let mut encoded = Vec::with_capacity(128 + record_name.map_or(0, str::len)); + encoded.extend_from_slice(RECORD_IDENTITY_MAGIC); + encoded.extend_from_slice(&FORMAT_VERSION.to_be_bytes()); + encoded.extend_from_slice(&generation.to_be_bytes()); + encoded.push(stream.tag()); + append_optional_string(&mut encoded, record_name)?; + Ok(URL_SAFE_NO_PAD.encode(encoded)) +} + +fn encode_raw_envelope( + generation: u64, + stream: CloudNativeStream, + change: &CloudMessageRecordPageChange, + raw: &[u8], + preserve_raw: bool, +) -> Result { + let system = change.system_fields.as_ref(); + let mut encoded = Vec::with_capacity( + 256 + change.record_name.as_ref().map_or(0, String::len) + + change.record_type.as_ref().map_or(0, String::len) + + system + .and_then(|fields| fields.etag.as_ref()) + .map_or(0, String::len) + + if preserve_raw { raw.len() } else { 0 }, + ); + encoded.extend_from_slice(RAW_ENVELOPE_MAGIC); + encoded.extend_from_slice(&FORMAT_VERSION.to_be_bytes()); + encoded.extend_from_slice(&generation.to_be_bytes()); + encoded.push(stream.tag()); + encoded.push(match change.kind { + CloudMessageRecordKind::EncryptedUpsert => 1, + CloudMessageRecordKind::Tombstone => 2, + CloudMessageRecordKind::UnsupportedRecordType => 3, + CloudMessageRecordKind::MalformedMetadata => 4, + }); + append_optional_string(&mut encoded, change.record_name.as_deref())?; + append_optional_string(&mut encoded, change.record_type.as_deref())?; + append_optional_i32(&mut encoded, change.change_type); + append_optional_string( + &mut encoded, + system.and_then(|fields| fields.etag.as_deref()), + )?; + append_optional_f64(&mut encoded, system.and_then(|fields| fields.created_at)); + append_optional_f64(&mut encoded, system.and_then(|fields| fields.modified_at)); + append_optional_u32(&mut encoded, system.and_then(|fields| fields.permission)); + encoded.extend_from_slice(&(raw.len() as u64).to_be_bytes()); + encoded.extend_from_slice(&Sha256::digest(raw)); + append_optional_bytes(&mut encoded, preserve_raw.then_some(raw))?; + Ok(URL_SAFE_NO_PAD.encode(encoded)) +} + +fn encode_checkpoint( + generation: u64, + stream: CloudNativeStream, + token: &[u8], +) -> Result { + if token.len() > MAX_CONTINUATION_TOKEN_BYTES { + return Err(CloudNativeFetchFailure::new( + CloudNativeFailureCategory::MalformedRecord, + CloudNativeSafeCode::InvalidCheckpoint, + None, + )); + } + let mut encoded = Vec::with_capacity(CHECKPOINT_MAGIC.len() + token.len() + 32); + encoded.extend_from_slice(CHECKPOINT_MAGIC); + encoded.extend_from_slice(&FORMAT_VERSION.to_be_bytes()); + encoded.extend_from_slice(&generation.to_be_bytes()); + encoded.push(stream.tag()); + append_bytes(&mut encoded, token)?; + Ok(URL_SAFE_NO_PAD.encode(encoded)) +} + +struct NativeByteCursor<'a> { + value: &'a [u8], + offset: usize, +} + +impl<'a> NativeByteCursor<'a> { + fn new(value: &'a [u8]) -> Self { + Self { value, offset: 0 } + } + + fn take(&mut self, length: usize) -> Option<&'a [u8]> { + let end = self.offset.checked_add(length)?; + let result = self.value.get(self.offset..end)?; + self.offset = end; + Some(result) + } + + fn u16(&mut self) -> Option { + Some(u16::from_be_bytes(self.take(2)?.try_into().ok()?)) + } + + fn u64(&mut self) -> Option { + Some(u64::from_be_bytes(self.take(8)?.try_into().ok()?)) + } + + fn byte(&mut self) -> Option { + self.take(1).map(|value| value[0]) + } + + fn bytes(&mut self, maximum: usize) -> Option> { + let length = u32::from_be_bytes(self.take(4)?.try_into().ok()?) as usize; + if length > maximum { + return None; + } + Some(self.take(length)?.to_vec()) + } + + fn optional_bytes(&mut self, maximum: usize) -> Option>> { + match self.byte()? { + 0 => Some(None), + 1 => self.bytes(maximum).map(Some), + _ => None, + } + } + + fn optional_string(&mut self, maximum: usize) -> Option> { + self.optional_bytes(maximum)? + .map(String::from_utf8) + .transpose() + .ok() + } + + fn optional_i32(&mut self) -> Option> { + match self.byte()? { + 0 => Some(None), + 1 => Some(Some(i32::from_be_bytes(self.take(4)?.try_into().ok()?))), + _ => None, + } + } + + fn optional_u32(&mut self) -> Option> { + match self.byte()? { + 0 => Some(None), + 1 => Some(Some(u32::from_be_bytes(self.take(4)?.try_into().ok()?))), + _ => None, + } + } + + fn optional_f64(&mut self) -> Option> { + match self.byte()? { + 0 => Some(None), + 1 => Some(Some(f64::from_bits(u64::from_be_bytes( + self.take(8)?.try_into().ok()?, + )))), + _ => None, + } + } + + fn finished(&self) -> bool { + self.offset == self.value.len() + } +} + +fn seconds_to_millis(value: Option) -> Option> { + match value { + Some(seconds) => { + if !seconds.is_finite() { + return None; + } + let millis = seconds * 1_000.0; + if millis < i64::MIN as f64 || millis > i64::MAX as f64 { + return None; + } + Some(Some(millis.round() as i64)) + } + None => Some(None), + } +} + +fn decode_raw_envelope( + encoded: &str, + expected_generation: u64, + expected_stream: CloudNativeStream, +) -> Result { + if encoded.len() > MAX_PROTECTED_FILE_BYTES { + return Err(CloudNativeFetchFailure::new( + CloudNativeFailureCategory::MalformedRecord, + CloudNativeSafeCode::OversizedRecord, + None, + )); + } + let bytes = URL_SAFE_NO_PAD.decode(encoded).map_err(|_| { + CloudNativeFetchFailure::new( + CloudNativeFailureCategory::MalformedRecord, + CloudNativeSafeCode::MalformedResponse, + None, + ) + })?; + if bytes.len() > MAX_PROTECTED_FILE_BYTES { + return Err(CloudNativeFetchFailure::new( + CloudNativeFailureCategory::MalformedRecord, + CloudNativeSafeCode::OversizedRecord, + None, + )); + } + let mut cursor = NativeByteCursor::new(&bytes); + if cursor.take(RAW_ENVELOPE_MAGIC.len()) != Some(RAW_ENVELOPE_MAGIC) + || cursor.u16() != Some(FORMAT_VERSION) + { + return Err(CloudNativeFetchFailure::new( + CloudNativeFailureCategory::MalformedRecord, + CloudNativeSafeCode::MalformedResponse, + None, + )); + } + let generation = cursor.u64().ok_or_else(|| { + CloudNativeFetchFailure::new( + CloudNativeFailureCategory::MalformedRecord, + CloudNativeSafeCode::MalformedResponse, + None, + ) + })?; + let stream = cursor + .byte() + .and_then(CloudNativeStream::from_tag) + .ok_or_else(|| { + CloudNativeFetchFailure::new( + CloudNativeFailureCategory::MalformedRecord, + CloudNativeSafeCode::MalformedResponse, + None, + ) + })?; + if generation != expected_generation || stream != expected_stream { + return Err(CloudNativeFetchFailure::new( + CloudNativeFailureCategory::LocalStorage, + CloudNativeSafeCode::CheckpointContextMismatch, + None, + )); + } + let kind = match cursor.byte() { + Some(1) => CloudNativeRawEnvelopeKind::EncryptedUpsert, + Some(2) => CloudNativeRawEnvelopeKind::Tombstone, + Some(3) => CloudNativeRawEnvelopeKind::UnsupportedRecordType, + Some(4) => CloudNativeRawEnvelopeKind::MalformedMetadata, + _ => { + return Err(CloudNativeFetchFailure::new( + CloudNativeFailureCategory::MalformedRecord, + CloudNativeSafeCode::MalformedResponse, + None, + )) + } + }; + let record_name = cursor.optional_string(MAX_METADATA_BYTES).ok_or_else(|| { + CloudNativeFetchFailure::new( + CloudNativeFailureCategory::MalformedRecord, + CloudNativeSafeCode::MalformedResponse, + None, + ) + })?; + let record_type = cursor.optional_string(MAX_METADATA_BYTES).ok_or_else(|| { + CloudNativeFetchFailure::new( + CloudNativeFailureCategory::MalformedRecord, + CloudNativeSafeCode::MalformedResponse, + None, + ) + })?; + let change_type = cursor.optional_i32().ok_or_else(|| { + CloudNativeFetchFailure::new( + CloudNativeFailureCategory::MalformedRecord, + CloudNativeSafeCode::MalformedResponse, + None, + ) + })?; + let etag = cursor.optional_string(MAX_METADATA_BYTES).ok_or_else(|| { + CloudNativeFetchFailure::new( + CloudNativeFailureCategory::MalformedRecord, + CloudNativeSafeCode::MalformedResponse, + None, + ) + })?; + let server_created_at_millis = seconds_to_millis(cursor.optional_f64().ok_or_else(|| { + CloudNativeFetchFailure::new( + CloudNativeFailureCategory::MalformedRecord, + CloudNativeSafeCode::MalformedResponse, + None, + ) + })?) + .ok_or_else(|| { + CloudNativeFetchFailure::new( + CloudNativeFailureCategory::MalformedRecord, + CloudNativeSafeCode::MalformedResponse, + None, + ) + })?; + let server_modified_at_millis = seconds_to_millis(cursor.optional_f64().ok_or_else(|| { + CloudNativeFetchFailure::new( + CloudNativeFailureCategory::MalformedRecord, + CloudNativeSafeCode::MalformedResponse, + None, + ) + })?) + .ok_or_else(|| { + CloudNativeFetchFailure::new( + CloudNativeFailureCategory::MalformedRecord, + CloudNativeSafeCode::MalformedResponse, + None, + ) + })?; + let permission = cursor.optional_u32().ok_or_else(|| { + CloudNativeFetchFailure::new( + CloudNativeFailureCategory::MalformedRecord, + CloudNativeSafeCode::MalformedResponse, + None, + ) + })?; + let raw_length = cursor.u64().ok_or_else(|| { + CloudNativeFetchFailure::new( + CloudNativeFailureCategory::MalformedRecord, + CloudNativeSafeCode::MalformedResponse, + None, + ) + })?; + let raw_digest = cursor.take(32).ok_or_else(|| { + CloudNativeFetchFailure::new( + CloudNativeFailureCategory::MalformedRecord, + CloudNativeSafeCode::MalformedResponse, + None, + ) + })?; + let raw = cursor.optional_bytes(MAX_RAW_RECORD_BYTES).ok_or_else(|| { + CloudNativeFetchFailure::new( + CloudNativeFailureCategory::MalformedRecord, + CloudNativeSafeCode::OversizedRecord, + None, + ) + })?; + if !cursor.finished() + || raw + .as_ref() + .is_some_and(|value| value.len() as u64 != raw_length) + || raw + .as_ref() + .is_some_and(|value| Sha256::digest(value).as_slice() != raw_digest) + { + return Err(CloudNativeFetchFailure::new( + CloudNativeFailureCategory::MalformedRecord, + CloudNativeSafeCode::MalformedResponse, + None, + )); + } + let raw_digest_hex = raw_digest + .iter() + .map(|byte| format!("{byte:02x}")) + .collect(); + Ok(CloudNativeRawEnvelope { + generation, + stream, + kind, + record_name, + record_type, + change_type, + etag, + server_created_at_millis, + server_modified_at_millis, + permission, + raw_length, + raw_digest_hex, + raw, + }) +} + +fn decode_checkpoint( + encoded: &str, + expected_generation: u64, + expected_stream: CloudNativeStream, +) -> Result, CloudNativeFetchFailure> { + let bytes = URL_SAFE_NO_PAD.decode(encoded).map_err(|_| { + CloudNativeFetchFailure::new( + CloudNativeFailureCategory::LocalStorage, + CloudNativeSafeCode::InvalidCheckpoint, + None, + ) + })?; + let mut cursor = NativeByteCursor::new(&bytes); + if cursor.take(CHECKPOINT_MAGIC.len()) != Some(CHECKPOINT_MAGIC) + || cursor.u16() != Some(FORMAT_VERSION) + || cursor.u64() != Some(expected_generation) + || cursor.byte() != Some(expected_stream.tag()) + { + return Err(CloudNativeFetchFailure::new( + CloudNativeFailureCategory::LocalStorage, + CloudNativeSafeCode::InvalidCheckpoint, + None, + )); + } + let token = cursor.bytes(MAX_CONTINUATION_TOKEN_BYTES).ok_or_else(|| { + CloudNativeFetchFailure::new( + CloudNativeFailureCategory::LocalStorage, + CloudNativeSafeCode::InvalidCheckpoint, + None, + ) + })?; + if !cursor.finished() { + return Err(CloudNativeFetchFailure::new( + CloudNativeFailureCategory::LocalStorage, + CloudNativeSafeCode::InvalidCheckpoint, + None, + )); + } + Ok(token) +} + +fn raw_bytes(change: &CloudMessageRecordPageChange) -> (&[u8], bool) { + match ( + change.encrypted_record.as_deref(), + change.tombstone_payload.as_deref(), + ) { + (Some(value), None) => (value, true), + (None, Some(value)) => (value, true), + (Some(value), Some(_)) => (value, false), + (None, None) => (&[], false), + } +} + +fn metadata_bytes(change: &CloudMessageRecordPageChange) -> Option { + let mut total = change.record_name.as_ref().map_or(0, String::len); + total = total.checked_add(change.record_type.as_ref().map_or(0, String::len))?; + total = total.checked_add( + change + .system_fields + .as_ref() + .and_then(|fields| fields.etag.as_ref()) + .map_or(0, String::len), + )?; + Some(total) +} + +fn server_modified_at_millis(change: &CloudMessageRecordPageChange) -> Option { + let seconds = change.system_fields.as_ref()?.modified_at?; + if !seconds.is_finite() { + return None; + } + let millis = seconds * 1_000.0; + if millis < i64::MIN as f64 || millis > i64::MAX as f64 { + return None; + } + Some(millis.round() as i64) +} + +fn sha256_digest(value: &[u8]) -> CloudCanonicalDigest { + CloudCanonicalDigest::new(sha256_hex(value)) + .expect("SHA-256 hex satisfies canonical digest grammar") +} + +fn sha256_hex(value: &[u8]) -> String { + Sha256::digest(value) + .iter() + .map(|byte| format!("{byte:02x}")) + .collect() +} + +fn map_store_failure(failure: CloudNativeStoreFailure) -> CloudNativeFetchFailure { + let safe_code = match failure { + CloudNativeStoreFailure::ContextMismatch => CloudNativeSafeCode::CheckpointContextMismatch, + CloudNativeStoreFailure::InvalidReference => CloudNativeSafeCode::InvalidCheckpoint, + CloudNativeStoreFailure::InvalidStorage | CloudNativeStoreFailure::Io => { + CloudNativeSafeCode::LocalStoreFailed + } + CloudNativeStoreFailure::ProtectionUnavailable => CloudNativeSafeCode::ProtectionFailed, + }; + CloudNativeFetchFailure::new(CloudNativeFailureCategory::LocalStorage, safe_code, None) +} + +fn preflight_code( + change: &CloudMessageRecordPageChange, + raw_shape_valid: bool, + oversized: bool, +) -> Option { + if oversized { + return Some(CloudNativePreflightCode::OversizedRecord); + } + if !raw_shape_valid { + return Some(CloudNativePreflightCode::InvalidChangeShape); + } + if change.record_name.as_deref().is_none_or(str::is_empty) { + return Some(CloudNativePreflightCode::MalformedMetadata); + } + match change.kind { + CloudMessageRecordKind::EncryptedUpsert => { + if change.encrypted_record.is_none() + || change.tombstone_payload.is_some() + || change.record_type.as_deref().is_none_or(str::is_empty) + { + Some(CloudNativePreflightCode::InvalidChangeShape) + } else { + None + } + } + CloudMessageRecordKind::Tombstone => { + if change.tombstone_payload.is_none() || change.encrypted_record.is_some() { + Some(CloudNativePreflightCode::InvalidChangeShape) + } else { + None + } + } + CloudMessageRecordKind::UnsupportedRecordType => { + Some(CloudNativePreflightCode::UnsupportedRecordType) + } + CloudMessageRecordKind::MalformedMetadata => { + Some(CloudNativePreflightCode::MalformedMetadata) + } + } +} + +struct PreparedChange { + change_id: CloudCanonicalHash, + record_id_hash: CloudCanonicalHash, + etag_hash: Option, + kind: CloudNativeChangeKind, + payload_digest: CloudCanonicalDigest, + payload_length: u64, + server_modified_at_millis: Option, + preflight_code: Option, + is_tombstone: bool, + identity_plaintext_index: usize, + raw_plaintext_index: usize, +} + +fn protect_native_page( + store: &dyn CloudNativeProtectedStore, + hasher: &CloudSemanticIdentifierHasher, + request: &CloudNativeFetchRequest<'_>, + page: CloudMessageRecordPage, +) -> CloudNativeProtectedFetchOutcome { + if let Err(failure) = request.scope.validate_for_stream(request.stream) { + return CloudNativeProtectedFetchOutcome::Failure(failure); + } + let maximum_changes = request.maximum_changes as usize; + if maximum_changes == 0 || maximum_changes > MAX_CHANGES_PER_PAGE { + return CloudNativeProtectedFetchOutcome::Failure(CloudNativeFetchFailure::new( + CloudNativeFailureCategory::MalformedRecord, + CloudNativeSafeCode::InvalidRequest, + None, + )); + } + if page.changes.len() > maximum_changes || page.changes.len() > MAX_CHANGES_PER_PAGE { + return CloudNativeProtectedFetchOutcome::Failure(CloudNativeFetchFailure::new( + CloudNativeFailureCategory::MalformedRecord, + CloudNativeSafeCode::OversizedPage, + None, + )); + } + if !page.is_complete() && page.next_token.is_none() { + return CloudNativeProtectedFetchOutcome::Failure(CloudNativeFetchFailure::new( + CloudNativeFailureCategory::MalformedRecord, + CloudNativeSafeCode::InvalidCheckpoint, + None, + )); + } + if page + .next_token + .as_ref() + .is_some_and(|token| token.len() > MAX_CONTINUATION_TOKEN_BYTES) + { + return CloudNativeProtectedFetchOutcome::Failure(CloudNativeFetchFailure::new( + CloudNativeFailureCategory::MalformedRecord, + CloudNativeSafeCode::InvalidCheckpoint, + None, + )); + } + + let mut admitted_bytes = page.next_token.as_ref().map_or(0, Vec::len); + for change in &page.changes { + let (raw, _) = raw_bytes(change); + let Some(metadata) = metadata_bytes(change) else { + return CloudNativeProtectedFetchOutcome::Failure(CloudNativeFetchFailure::new( + CloudNativeFailureCategory::MalformedRecord, + CloudNativeSafeCode::OversizedPage, + None, + )); + }; + if metadata > MAX_METADATA_BYTES { + return CloudNativeProtectedFetchOutcome::Failure(CloudNativeFetchFailure::new( + CloudNativeFailureCategory::MalformedRecord, + CloudNativeSafeCode::OversizedRecord, + None, + )); + } + admitted_bytes = match admitted_bytes + .checked_add(metadata) + .and_then(|size| size.checked_add(raw.len())) + .and_then(|size| size.checked_add(256)) + { + Some(value) if value <= MAX_RAW_PAGE_BYTES => value, + _ => { + return CloudNativeProtectedFetchOutcome::Failure(CloudNativeFetchFailure::new( + CloudNativeFailureCategory::MalformedRecord, + CloudNativeSafeCode::OversizedPage, + None, + )) + } + }; + } + + let mut plaintexts = Vec::with_capacity(page.changes.len() * 2 + 1); + let mut prepared = Vec::with_capacity(page.changes.len()); + for (index, change) in page.changes.iter().enumerate() { + let (raw, raw_shape_valid) = raw_bytes(change); + let oversized = raw.len() > MAX_RAW_RECORD_BYTES; + let preflight = preflight_code(change, raw_shape_valid, oversized); + let payload_digest = sha256_digest(raw); + let record_identity = change.record_name.as_deref(); + let fallback_identity = format!("missing\u{0}{}\u{0}{}", payload_digest.value(), index); + let record_id_hash = match hasher + .canonical_server_record_id_hash(record_identity.unwrap_or(&fallback_identity)) + { + Ok(value) => value, + Err(_) => { + return CloudNativeProtectedFetchOutcome::Failure(CloudNativeFetchFailure::new( + CloudNativeFailureCategory::MalformedRecord, + CloudNativeSafeCode::MalformedResponse, + None, + )) + } + }; + let etag_hash = match change + .system_fields + .as_ref() + .and_then(|fields| fields.etag.as_deref()) + .filter(|etag| !etag.is_empty()) + .map(|etag| hasher.canonical_etag_hash(etag)) + .transpose() + { + Ok(value) => value, + Err(_) => { + return CloudNativeProtectedFetchOutcome::Failure(CloudNativeFetchFailure::new( + CloudNativeFailureCategory::MalformedRecord, + CloudNativeSafeCode::MalformedResponse, + None, + )) + } + }; + let kind = match (change.kind, preflight) { + (_, Some(_)) => CloudNativeChangeKind::Quarantined, + (CloudMessageRecordKind::EncryptedUpsert, None) => CloudNativeChangeKind::Save, + (CloudMessageRecordKind::Tombstone, None) => CloudNativeChangeKind::Delete, + ( + CloudMessageRecordKind::UnsupportedRecordType + | CloudMessageRecordKind::MalformedMetadata, + None, + ) => CloudNativeChangeKind::Quarantined, + }; + let change_material = format!( + "{}\u{1f}{}\u{1f}{}\u{1f}{}\u{1f}{}\u{1f}{}", + request.generation, + record_id_hash.value(), + match kind { + CloudNativeChangeKind::Save => 1, + CloudNativeChangeKind::Delete => 2, + CloudNativeChangeKind::Quarantined => 3, + }, + change.change_type.unwrap_or_default(), + etag_hash + .as_ref() + .map(CloudCanonicalHash::value) + .unwrap_or("none"), + payload_digest.value(), + ); + let change_id = match hasher.canonical_change_id_hash(&change_material) { + Ok(value) => value, + Err(_) => { + return CloudNativeProtectedFetchOutcome::Failure(CloudNativeFetchFailure::new( + CloudNativeFailureCategory::MalformedRecord, + CloudNativeSafeCode::MalformedResponse, + None, + )) + } + }; + let identity_plaintext = + match encode_record_identity(request.generation, request.stream, record_identity) { + Ok(value) => value, + Err(failure) => return CloudNativeProtectedFetchOutcome::Failure(failure), + }; + let raw_plaintext = match encode_raw_envelope( + request.generation, + request.stream, + change, + raw, + !oversized, + ) { + Ok(value) => value, + Err(failure) => return CloudNativeProtectedFetchOutcome::Failure(failure), + }; + let identity_plaintext_index = plaintexts.len(); + plaintexts.push(CloudNativePlaintext { + purpose: CloudNativeProtectionPurpose::ServerRecordId, + value: identity_plaintext, + }); + let raw_plaintext_index = plaintexts.len(); + plaintexts.push(CloudNativePlaintext { + purpose: CloudNativeProtectionPurpose::RawRecord, + value: raw_plaintext, + }); + prepared.push(PreparedChange { + change_id, + record_id_hash, + etag_hash, + kind, + payload_digest, + payload_length: raw.len() as u64, + server_modified_at_millis: server_modified_at_millis(change), + preflight_code: preflight, + is_tombstone: matches!(change.kind, CloudMessageRecordKind::Tombstone), + identity_plaintext_index, + raw_plaintext_index, + }); + } + + let checkpoint_plaintext_index = if let Some(token) = page.next_token.as_deref() { + let value = match encode_checkpoint(request.generation, request.stream, token) { + Ok(value) => value, + Err(failure) => return CloudNativeProtectedFetchOutcome::Failure(failure), + }; + let index = plaintexts.len(); + plaintexts.push(CloudNativePlaintext { + purpose: CloudNativeProtectionPurpose::CheckpointToken, + value, + }); + Some(index) + } else { + None + }; + let protected_plaintext_bytes = plaintexts + .iter() + .try_fold(0usize, |total, value| total.checked_add(value.value.len())); + if protected_plaintext_bytes.is_none_or(|total| total > MAX_PROTECTED_PLAINTEXT_BATCH_BYTES) { + return CloudNativeProtectedFetchOutcome::Failure(CloudNativeFetchFailure::new( + CloudNativeFailureCategory::MalformedRecord, + CloudNativeSafeCode::OversizedPage, + None, + )); + } + let mut batch_material = format!( + "{}\u{1f}{}\u{1f}{}\u{1f}{}", + request.generation, + request.stream.tag(), + page.status, + page.is_complete() + ); + for change in &prepared { + batch_material.push('\u{1f}'); + batch_material.push_str(change.change_id.value()); + } + if let Some(token) = page.next_token.as_deref() { + batch_material.push('\u{1f}'); + batch_material.push_str(sha256_digest(token).value()); + } + let batch_id = match hasher.canonical_change_id_hash(&batch_material) { + Ok(value) => value, + Err(_) => { + return CloudNativeProtectedFetchOutcome::Failure(CloudNativeFetchFailure::new( + CloudNativeFailureCategory::MalformedRecord, + CloudNativeSafeCode::MalformedResponse, + None, + )) + } + }; + let protected_batch = match store.protect_batch(request.scope, &plaintexts) { + Ok(value) if value.references.len() == plaintexts.len() => value, + Ok(_) => { + return CloudNativeProtectedFetchOutcome::Failure(CloudNativeFetchFailure::new( + CloudNativeFailureCategory::LocalStorage, + CloudNativeSafeCode::ProtectionFailed, + None, + )) + } + Err(error) => { + return CloudNativeProtectedFetchOutcome::Failure(map_store_failure(error)); + } + }; + let references = &protected_batch.references; + + let changes = prepared + .into_iter() + .map(|change| CloudNativeProtectedChange { + change_id: change.change_id, + record_id_hash: change.record_id_hash, + etag_hash: change.etag_hash, + kind: change.kind, + payload_digest: change.payload_digest, + payload_length: change.payload_length, + protected_record_identity_reference: references[change.identity_plaintext_index] + .clone(), + protected_raw_envelope_reference: references[change.raw_plaintext_index].clone(), + server_modified_at_millis: change.server_modified_at_millis, + preflight_code: change.preflight_code, + is_tombstone: change.is_tombstone, + }) + .collect::>(); + CloudNativeProtectedFetchOutcome::Page(CloudNativeProtectedPage { + changes, + batch_id, + generation: request.generation, + page_lease: protected_batch.lease, + protected_next_checkpoint_reference: checkpoint_plaintext_index + .map(|index| references[index].clone()), + status: page.status, + complete: page.is_complete(), + admitted_raw_bytes: admitted_bytes as u64, + }) +} + +fn retry_after_seconds(error: &PushError) -> Option { + match error { + PushError::CloudKitError(result) => result + .error + .as_ref() + .and_then(|error| error.retry_after_seconds) + .filter(|seconds| *seconds > 0) + .map(|seconds| (seconds as u64).min(MAX_RETRY_AFTER_SECONDS)), + PushError::CloudKitHttpError { + retry_after: Some(retry_after), + .. + } if !retry_after.is_zero() => { + Some(retry_after.as_secs().max(1).min(MAX_RETRY_AFTER_SECONDS)) + } + PushError::DoNotRetry(inner) => retry_after_seconds(inner), + PushError::BatchError(inner) => retry_after_seconds(inner), + _ => None, + } +} + +fn map_fetch_failure(error: &PushError) -> CloudNativeFetchFailure { + let retry_after = retry_after_seconds(error); + let (category, safe_code) = match error { + PushError::CloudKitError(result) => match classify_cloudkit_failure(result) { + CloudKitFailureClass::Throttled => ( + CloudNativeFailureCategory::Throttled, + CloudNativeSafeCode::CloudKitThrottled, + ), + CloudKitFailureClass::TransientServer => ( + CloudNativeFailureCategory::Server, + CloudNativeSafeCode::CloudKitServer, + ), + CloudKitFailureClass::Authentication => ( + CloudNativeFailureCategory::Authorization, + CloudNativeSafeCode::CloudKitAuthorization, + ), + CloudKitFailureClass::Conflict => ( + CloudNativeFailureCategory::Conflict, + CloudNativeSafeCode::CloudKitConflict, + ), + CloudKitFailureClass::ResetRequired => ( + CloudNativeFailureCategory::Unknown, + CloudNativeSafeCode::CloudKitResetRequired, + ), + CloudKitFailureClass::Permanent => ( + CloudNativeFailureCategory::Unknown, + CloudNativeSafeCode::CloudKitPermanent, + ), + CloudKitFailureClass::Unknown => ( + CloudNativeFailureCategory::Unknown, + CloudNativeSafeCode::CloudKitUnknown, + ), + }, + PushError::RequestError(error) => { + if error.is_timeout() || error.is_connect() { + return CloudNativeFetchFailure::new( + CloudNativeFailureCategory::Network, + CloudNativeSafeCode::Network, + retry_after, + ); + } + match error.status().map(|status| status.as_u16()) { + Some(401 | 403) => ( + CloudNativeFailureCategory::Authorization, + CloudNativeSafeCode::HttpAuthorization, + ), + Some(408) => ( + CloudNativeFailureCategory::Network, + CloudNativeSafeCode::HttpTimeout, + ), + Some(429) => ( + CloudNativeFailureCategory::Throttled, + CloudNativeSafeCode::HttpThrottled, + ), + Some(500..=599) => ( + CloudNativeFailureCategory::Server, + CloudNativeSafeCode::HttpServer, + ), + _ => ( + CloudNativeFailureCategory::Unknown, + CloudNativeSafeCode::HttpUnknown, + ), + } + } + PushError::StatusError(status) => match status.as_u16() { + 401 | 403 => ( + CloudNativeFailureCategory::Authorization, + CloudNativeSafeCode::HttpAuthorization, + ), + 408 => ( + CloudNativeFailureCategory::Network, + CloudNativeSafeCode::HttpTimeout, + ), + 429 => ( + CloudNativeFailureCategory::Throttled, + CloudNativeSafeCode::HttpThrottled, + ), + 500..=599 => ( + CloudNativeFailureCategory::Server, + CloudNativeSafeCode::HttpServer, + ), + _ => ( + CloudNativeFailureCategory::Unknown, + CloudNativeSafeCode::HttpUnknown, + ), + }, + PushError::CloudKitHttpError { status, .. } => match *status { + 401 | 403 => ( + CloudNativeFailureCategory::Authorization, + CloudNativeSafeCode::HttpAuthorization, + ), + 408 => ( + CloudNativeFailureCategory::Network, + CloudNativeSafeCode::HttpTimeout, + ), + 429 => ( + CloudNativeFailureCategory::Throttled, + CloudNativeSafeCode::HttpThrottled, + ), + 500..=599 => ( + CloudNativeFailureCategory::Server, + CloudNativeSafeCode::HttpServer, + ), + _ => ( + CloudNativeFailureCategory::Unknown, + CloudNativeSafeCode::HttpUnknown, + ), + }, + PushError::ResourceTimeout + | PushError::ResourceGenTimeout + | PushError::ResourceStalled + | PushError::NotConnected => ( + CloudNativeFailureCategory::Network, + CloudNativeSafeCode::Network, + ), + PushError::TooManyRequests => ( + CloudNativeFailureCategory::Throttled, + CloudNativeSafeCode::CloudKitThrottled, + ), + PushError::UnauthorizedAccountError + | PushError::TokenMissing + | PushError::UserNotFound + | PushError::AuthInvalid(_) + | PushError::MobileMeError(_, _) => ( + CloudNativeFailureCategory::Authorization, + CloudNativeSafeCode::CloudKitAuthorization, + ), + PushError::PCSRecordKeyMissing + | PushError::MasterKeyNotFound + | PushError::NotInClique + | PushError::ShareKeyNotFound(_) + | PushError::NoRoutingKey => ( + CloudNativeFailureCategory::PcsUnavailable, + CloudNativeSafeCode::PcsUnavailable, + ), + PushError::ProtobufError(_) | PushError::JsonError(_) => ( + CloudNativeFailureCategory::MalformedRecord, + CloudNativeSafeCode::MalformedResponse, + ), + PushError::CloudKitProtocolError(CloudKitProtocolError::ContinuationTokenNoProgress) => ( + CloudNativeFailureCategory::MalformedRecord, + CloudNativeSafeCode::ContinuationNoProgress, + ), + PushError::IoError(_) => ( + CloudNativeFailureCategory::LocalStorage, + CloudNativeSafeCode::LocalStoreFailed, + ), + PushError::DoNotRetry(inner) => return map_fetch_failure(inner), + PushError::BatchError(inner) => return map_fetch_failure(inner), + _ => ( + CloudNativeFailureCategory::Unknown, + CloudNativeSafeCode::Unknown, + ), + }; + CloudNativeFetchFailure::new(category, safe_code, retry_after) +} + +async fn cloud_sync_fetch_protected_page_with_store( + cloud_messages_client: &Arc>, + hasher: &CloudSemanticIdentifierHasher, + store: &dyn CloudNativeProtectedStore, + request: &CloudNativeFetchRequest<'_>, +) -> CloudNativeProtectedFetchOutcome { + if request.maximum_changes == 0 + || request.maximum_changes as usize > MAX_CHANGES_PER_PAGE + || request.generation == 0 + { + return CloudNativeProtectedFetchOutcome::Failure(CloudNativeFetchFailure::new( + CloudNativeFailureCategory::MalformedRecord, + CloudNativeSafeCode::InvalidRequest, + None, + )); + } + if let Err(failure) = request.scope.validate_for_stream(request.stream) { + return CloudNativeProtectedFetchOutcome::Failure(failure); + } + let continuation_token = match decode_previous_checkpoint(store, request) { + Ok(value) => value, + Err(failure) => return CloudNativeProtectedFetchOutcome::Failure(failure), + }; + + let fetch = async { + match request.stream { + CloudNativeStream::Chats => { + cloud_messages_client + .sync_chats_page(continuation_token, Some(request.maximum_changes)) + .await + } + CloudNativeStream::Messages => { + cloud_messages_client + .sync_messages_page(continuation_token, Some(request.maximum_changes)) + .await + } + CloudNativeStream::Attachments => { + cloud_messages_client + .sync_attachments_page(continuation_token, Some(request.maximum_changes)) + .await + } + CloudNativeStream::MessageUpdate => { + cloud_messages_client + .sync_message_update_page(continuation_token, Some(request.maximum_changes)) + .await + } + CloudNativeStream::RecoverableMessageDelete => { + cloud_messages_client + .sync_recoverable_message_delete_page( + continuation_token, + Some(request.maximum_changes), + ) + .await + } + CloudNativeStream::ScheduledMessage => { + cloud_messages_client + .sync_scheduled_message_page(continuation_token, Some(request.maximum_changes)) + .await + } + CloudNativeStream::Chat1 => { + cloud_messages_client + .sync_chat1_page(continuation_token, Some(request.maximum_changes)) + .await + } + } + }; + match tokio::time::timeout(FETCH_DEADLINE, fetch).await { + Err(_) => CloudNativeProtectedFetchOutcome::Failure(CloudNativeFetchFailure::new( + CloudNativeFailureCategory::Network, + CloudNativeSafeCode::FetchDeadline, + None, + )), + Ok(Err(error)) => CloudNativeProtectedFetchOutcome::Failure(map_fetch_failure(&error)), + Ok(Ok(page)) => protect_native_page(store, hasher, request, page), + } +} + +fn decode_previous_checkpoint( + store: &dyn CloudNativeProtectedStore, + request: &CloudNativeFetchRequest<'_>, +) -> Result>, CloudNativeFetchFailure> { + match request.previous_checkpoint_reference { + Some(reference) => { + let reference = match CloudCanonicalProtectedReference::new(reference.to_owned()) { + Ok(value) => value, + Err(_) => { + return Err(CloudNativeFetchFailure::new( + CloudNativeFailureCategory::LocalStorage, + CloudNativeSafeCode::InvalidCheckpoint, + None, + )) + } + }; + let protected = match store.unprotect( + request.scope, + CloudNativeProtectionPurpose::CheckpointToken, + &reference, + ) { + Ok(value) => value, + Err(error) => return Err(map_store_failure(error)), + }; + decode_checkpoint(&protected, request.generation, request.stream).map(Some) + } + None => Ok(None), + } +} + +pub(crate) async fn cloud_sync_fetch_protected_page( + cloud_messages_client: &Arc>, + storage_directory: PathBuf, + hasher: &CloudSemanticIdentifierHasher, + request: &CloudNativeFetchRequest<'_>, +) -> CloudNativeProtectedFetchOutcome { + let store = PlatformCloudNativeProtectedStore::new(storage_directory); + cloud_sync_fetch_protected_page_with_store(cloud_messages_client, hasher, &store, request).await +} + +/// Unprotects and validates exactly one raw-record capability for the transient +/// semantic decoder. Raw identifiers and bytes never leave Rust. +pub(crate) fn cloud_sync_unprotect_raw_envelope( + storage_directory: PathBuf, + scope: &CloudNativeProtectionScope, + stream: CloudNativeStream, + generation: u64, + protected_raw_envelope_reference: &str, +) -> Result { + if generation == 0 { + return Err(CloudNativeFetchFailure::new( + CloudNativeFailureCategory::MalformedRecord, + CloudNativeSafeCode::InvalidRequest, + None, + )); + } + scope.validate_for_stream(stream)?; + let reference = + CloudCanonicalProtectedReference::new(protected_raw_envelope_reference.to_owned()) + .map_err(|_| { + CloudNativeFetchFailure::new( + CloudNativeFailureCategory::LocalStorage, + CloudNativeSafeCode::InvalidRequest, + None, + ) + })?; + let encoded = PlatformCloudNativeProtectedStore::new(storage_directory) + .unprotect(scope, CloudNativeProtectionPurpose::RawRecord, &reference) + .map_err(map_store_failure)?; + decode_raw_envelope(&encoded, generation, stream) +} + +/// Called only after the local ObjectBox journal transaction has adopted every +/// reference in the page. +pub(crate) fn cloud_sync_commit_protected_page( + storage_directory: PathBuf, + page: &CloudNativeProtectedPage, + retained_references: &[String], +) -> Result<(), CloudNativeFetchFailure> { + cloud_sync_commit_protected_page_lease( + storage_directory, + page.page_lease_reference(), + retained_references, + ) +} + +/// Called when local journal validation or admission rejects the page. +pub(crate) fn cloud_sync_rollback_protected_page( + storage_directory: PathBuf, + page: &CloudNativeProtectedPage, +) -> Result<(), CloudNativeFetchFailure> { + cloud_sync_rollback_protected_page_lease(storage_directory, page.page_lease_reference()) +} + +pub(crate) fn cloud_sync_commit_protected_page_lease( + storage_directory: PathBuf, + page_lease_reference: &str, + retained_references: &[String], +) -> Result<(), CloudNativeFetchFailure> { + let lease = CloudNativePageLease::parse(page_lease_reference)?; + let retained = parse_protected_reference_set(retained_references)?; + PlatformCloudNativeProtectedStore::new(storage_directory) + .commit_lease(&lease, &retained) + .map_err(map_store_failure) +} + +pub(crate) fn cloud_sync_verify_committed_lease_exact( + storage_directory: PathBuf, + lease_reference: &str, + retained_references: &[String], +) -> Result<(), CloudNativeFetchFailure> { + let lease = CloudNativePageLease::parse(lease_reference)?; + let retained = parse_protected_reference_set(retained_references)?; + PlatformCloudNativeProtectedStore::new(storage_directory) + .verify_committed_lease_exact(&lease, &retained) + .map_err(map_store_failure) +} + +/// Native-only result of staging one outbound message and its stable CloudKit +/// record name in a single crash-recoverable protected-store lease. +pub(crate) struct CloudNativeProtectedOutboundStage { + pub(crate) protected_envelope_reference: String, + pub(crate) lease_reference: String, +} + +/// Stages the outbound payload and server record identity together. Neither +/// plaintext value is returned through Flutter Rust Bridge; callers receive +/// only opaque capabilities and adopt them in their local journal before +/// committing the lease. +pub(crate) fn cloud_sync_stage_protected_outbound_envelope( + storage_directory: PathBuf, + account_fingerprint: String, + outbound_envelope: String, +) -> Result { + if outbound_envelope.is_empty() { + return Err(CloudNativeFetchFailure::new( + CloudNativeFailureCategory::MalformedRecord, + CloudNativeSafeCode::InvalidRequest, + None, + )); + } + let scope = CloudNativeProtectionScope::new(account_fingerprint, CloudNativeStream::Messages)?; + let store = PlatformCloudNativeProtectedStore::new(storage_directory); + let batch = store + .protect_batch( + &scope, + &[CloudNativePlaintext { + purpose: CloudNativeProtectionPurpose::OutboundMessage, + value: outbound_envelope, + }], + ) + .map_err(map_store_failure)?; + if batch.references.len() != 1 { + let _ = store.rollback_lease(&batch.lease); + return Err(CloudNativeFetchFailure::new( + CloudNativeFailureCategory::LocalStorage, + CloudNativeSafeCode::ProtectionFailed, + None, + )); + } + Ok(CloudNativeProtectedOutboundStage { + protected_envelope_reference: batch.references[0].value().to_owned(), + lease_reference: batch.lease.value().to_owned(), + }) +} + +pub(crate) fn cloud_sync_open_protected_outbound_message( + storage_directory: PathBuf, + account_fingerprint: String, + protected_reference: &str, +) -> Result { + cloud_sync_open_protected_outbound_value( + storage_directory, + account_fingerprint, + protected_reference, + CloudNativeProtectionPurpose::OutboundMessage, + ) +} + +fn cloud_sync_open_protected_outbound_value( + storage_directory: PathBuf, + account_fingerprint: String, + protected_reference: &str, + purpose: CloudNativeProtectionPurpose, +) -> Result { + let scope = CloudNativeProtectionScope::new(account_fingerprint, CloudNativeStream::Messages)?; + let reference = + CloudCanonicalProtectedReference::new(protected_reference.to_owned()).map_err(|_| { + CloudNativeFetchFailure::new( + CloudNativeFailureCategory::LocalStorage, + CloudNativeSafeCode::InvalidRequest, + None, + ) + })?; + PlatformCloudNativeProtectedStore::new(storage_directory) + .unprotect(&scope, purpose, &reference) + .map_err(map_store_failure) +} + +pub(crate) fn cloud_sync_acknowledge_committed_page_lease( + storage_directory: PathBuf, + page_lease_reference: &str, +) -> Result<(), CloudNativeFetchFailure> { + let lease = CloudNativePageLease::parse(page_lease_reference)?; + PlatformCloudNativeProtectedStore::new(storage_directory) + .acknowledge_committed_lease(&lease) + .map_err(map_store_failure) +} + +pub(crate) fn cloud_sync_rollback_protected_page_lease( + storage_directory: PathBuf, + page_lease_reference: &str, +) -> Result<(), CloudNativeFetchFailure> { + let lease = CloudNativePageLease::parse(page_lease_reference)?; + PlatformCloudNativeProtectedStore::new(storage_directory) + .rollback_lease(&lease) + .map_err(map_store_failure) +} + +/// Bounded startup recovery. It must run before any fetch is in flight. +pub(crate) fn cloud_sync_recover_abandoned_page_leases( + storage_directory: PathBuf, + adopted_lease_references: &[String], + live_references: &[String], + live_reference_enumeration_complete: bool, +) -> Result { + if !live_reference_enumeration_complete + || adopted_lease_references.len() > MAX_ADOPTED_LEASES_PER_RECOVERY + || adopted_lease_references.iter().any(|reference| { + !reference.starts_with("obcs2.lease.") + || reference.len() != "obcs2.lease.".len() + 32 + || !is_lease_token(&reference["obcs2.lease.".len()..]) + }) + { + return Err(CloudNativeFetchFailure::new( + CloudNativeFailureCategory::LocalStorage, + CloudNativeSafeCode::InvalidRequest, + None, + )); + } + let adopted = adopted_lease_references + .iter() + .cloned() + .collect::>(); + if adopted.len() != adopted_lease_references.len() { + return Err(CloudNativeFetchFailure::new( + CloudNativeFailureCategory::LocalStorage, + CloudNativeSafeCode::InvalidRequest, + None, + )); + } + let live = parse_protected_reference_set(live_references)?; + PlatformCloudNativeProtectedStore::new(storage_directory) + .recover_abandoned_leases(&adopted, &live, live_reference_enumeration_complete) + .map_err(map_store_failure) +} + +pub(crate) fn cloud_sync_retire_protected_references( + storage_directory: PathBuf, + references: &[String], +) -> Result { + if references.len() > MAX_RETIRE_REFERENCES_PER_CALL { + return Err(CloudNativeFetchFailure::new( + CloudNativeFailureCategory::LocalStorage, + CloudNativeSafeCode::InvalidRequest, + None, + )); + } + let references = parse_protected_reference_set(references)?; + PlatformCloudNativeProtectedStore::new(storage_directory) + .retire_references(&references) + .map_err(map_store_failure) +} + +pub(crate) fn cloud_sync_collect_protected_garbage( + storage_directory: PathBuf, + live_references: &[String], + live_reference_enumeration_complete: bool, +) -> Result { + if !live_reference_enumeration_complete { + return Err(CloudNativeFetchFailure::new( + CloudNativeFailureCategory::LocalStorage, + CloudNativeSafeCode::InvalidRequest, + None, + )); + } + let live = parse_protected_reference_set(live_references)?; + PlatformCloudNativeProtectedStore::new(storage_directory) + .collect_garbage(&live, live_reference_enumeration_complete) + .map_err(map_store_failure) +} + +fn parse_protected_reference_set( + references: &[String], +) -> Result, CloudNativeFetchFailure> { + if references.len() > MAX_LIVE_REFERENCES_PER_MAINTENANCE { + return Err(CloudNativeFetchFailure::new( + CloudNativeFailureCategory::LocalStorage, + CloudNativeSafeCode::InvalidRequest, + None, + )); + } + let unique = references.iter().cloned().collect::>(); + if unique.len() != references.len() + || unique.iter().any(|reference| { + reference + .strip_prefix("obcs2.ref.") + .is_none_or(|token| !is_bare_digest(token)) + }) + { + return Err(CloudNativeFetchFailure::new( + CloudNativeFailureCategory::LocalStorage, + CloudNativeSafeCode::InvalidRequest, + None, + )); + } + Ok(unique) +} + +#[cfg(test)] +mod tests { + use std::{ + collections::HashMap, + sync::{ + atomic::{AtomicBool, Ordering}, + Mutex, + }, + }; + + use tempfile::tempdir; + + use super::*; + + #[derive(Default)] + struct MemoryProtectedStore { + values: Mutex>, + leases: Mutex>>, + committed: Mutex>>, + fail_protection: AtomicBool, + } + + impl MemoryProtectedStore { + fn plaintexts(&self) -> Vec { + self.values + .lock() + .expect("values lock") + .values() + .map(|(_, _, value)| value.clone()) + .collect() + } + } + + impl CloudNativeProtectedStore for MemoryProtectedStore { + fn protect_batch( + &self, + scope: &CloudNativeProtectionScope, + values: &[CloudNativePlaintext], + ) -> Result { + if self.fail_protection.load(Ordering::SeqCst) { + return Err(CloudNativeStoreFailure::ProtectionUnavailable); + } + let lease_token = Uuid::new_v4().simple().to_string(); + let lease = CloudNativePageLease { + reference: CloudCanonicalProtectedReference::new(format!( + "obcs2.lease.{lease_token}" + )) + .expect("lease reference"), + }; + let mut staged = Vec::with_capacity(values.len()); + for (index, value) in values.iter().enumerate() { + let token = URL_SAFE_NO_PAD.encode(Sha256::digest( + format!( + "{}\u{1f}{}\u{1f}{}\u{1f}{}", + lease_token, + index, + value.purpose.value(), + value.value + ) + .as_bytes(), + )); + let reference = CloudCanonicalProtectedReference::new(format!("obcs2.ref.{token}")) + .expect("protected reference"); + staged.push(( + reference, + (scope.binding(), value.purpose, value.value.clone()), + )); + } + let references = staged + .iter() + .map(|(reference, _)| reference.clone()) + .collect::>(); + { + let mut stored = self.values.lock().expect("values lock"); + for (reference, value) in staged { + stored.insert(reference.value().to_owned(), value); + } + } + self.leases.lock().expect("leases lock").insert( + lease.reference.value().to_owned(), + references + .iter() + .map(|reference| reference.value().to_owned()) + .collect(), + ); + Ok(CloudNativeProtectedBatch { references, lease }) + } + + fn unprotect( + &self, + scope: &CloudNativeProtectionScope, + purpose: CloudNativeProtectionPurpose, + reference: &CloudCanonicalProtectedReference, + ) -> Result { + let values = self.values.lock().expect("values lock"); + let Some((binding, actual_purpose, value)) = values.get(reference.value()) else { + return Err(CloudNativeStoreFailure::InvalidReference); + }; + if binding != &scope.binding() || actual_purpose != &purpose { + return Err(CloudNativeStoreFailure::ContextMismatch); + } + Ok(value.clone()) + } + + fn commit_lease( + &self, + lease: &CloudNativePageLease, + retained_references: &HashSet, + ) -> Result<(), CloudNativeStoreFailure> { + let references = self + .leases + .lock() + .expect("leases lock") + .remove(lease.reference.value()); + if let Some(references) = references { + let manifest = references.iter().cloned().collect::>(); + if !manifest.is_superset(retained_references) { + return Err(CloudNativeStoreFailure::InvalidReference); + } + let mut values = self.values.lock().expect("values lock"); + for reference in manifest.difference(retained_references) { + values.remove(reference); + } + self.committed.lock().expect("committed lock").insert( + lease.reference.value().to_owned(), + retained_references.clone(), + ); + return Ok(()); + } + if self + .committed + .lock() + .expect("committed lock") + .get(lease.reference.value()) + == Some(retained_references) + { + return Ok(()); + } + Err(CloudNativeStoreFailure::InvalidReference) + } + + fn acknowledge_committed_lease( + &self, + lease: &CloudNativePageLease, + ) -> Result<(), CloudNativeStoreFailure> { + self.committed + .lock() + .expect("committed lock") + .remove(lease.reference.value()); + Ok(()) + } + + fn rollback_lease( + &self, + lease: &CloudNativePageLease, + ) -> Result<(), CloudNativeStoreFailure> { + let references = self + .leases + .lock() + .expect("leases lock") + .remove(lease.reference.value()) + .ok_or(CloudNativeStoreFailure::InvalidReference)?; + let mut values = self.values.lock().expect("values lock"); + for reference in references { + values.remove(&reference); + } + Ok(()) + } + + fn recover_abandoned_leases( + &self, + adopted_lease_references: &HashSet, + live_references: &HashSet, + live_reference_enumeration_complete: bool, + ) -> Result { + if !live_reference_enumeration_complete { + return Err(CloudNativeStoreFailure::InvalidReference); + } + let leases = self + .leases + .lock() + .expect("leases lock") + .iter() + .map(|(lease, references)| (lease.clone(), references.clone())) + .collect::>(); + let present_leases = leases + .iter() + .map(|(lease, _)| lease.clone()) + .collect::>(); + let mut summary = CloudNativeRecoverySummary::default(); + let mut values = self.values.lock().expect("values lock"); + for (lease, references) in leases { + if adopted_lease_references.contains(&lease) { + let retained = references + .iter() + .filter(|reference| live_references.contains(*reference)) + .cloned() + .collect::>(); + for reference in references + .iter() + .filter(|reference| !retained.contains(*reference)) + { + values.remove(reference); + } + self.committed + .lock() + .expect("committed lock") + .insert(lease.clone(), retained); + summary.finalized_adopted_lease_references.push( + CloudCanonicalProtectedReference::new(lease) + .expect("memory lease reference"), + ); + } else { + for reference in references { + values.remove(&reference); + } + summary.rolled_back += 1; + } + } + summary.absent_adopted_lease_references = adopted_lease_references + .iter() + .filter(|reference| !present_leases.contains(*reference)) + .map(|reference| { + CloudCanonicalProtectedReference::new(reference.clone()) + .expect("memory recovery fixture uses canonical lease references") + }) + .collect(); + self.leases.lock().expect("leases lock").clear(); + Ok(summary) + } + + fn retire_references( + &self, + references: &HashSet, + ) -> Result { + let mut values = self.values.lock().expect("values lock"); + let mut removed = 0; + for reference in references { + if values.remove(reference).is_some() { + removed += 1; + } + } + Ok(removed) + } + + fn collect_garbage( + &self, + live_references: &HashSet, + live_reference_enumeration_complete: bool, + ) -> Result { + if !live_reference_enumeration_complete { + return Err(CloudNativeStoreFailure::InvalidReference); + } + let values = self.values.lock().expect("values lock"); + Ok(CloudNativeGarbageCollectionSummary { + scanned: values.len(), + preserved_live: values + .keys() + .filter(|reference| live_references.contains(*reference)) + .count(), + ..CloudNativeGarbageCollectionSummary::default() + }) + } + } + + fn scope(stream: CloudNativeStream) -> CloudNativeProtectionScope { + CloudNativeProtectionScope::new( + "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA".to_owned(), + stream, + ) + .expect("scope") + } + + #[test] + fn auxiliary_streams_roundtrip_parse_tag_and_zone() { + let cases = [ + (CloudNativeStream::Chats, 1u8, "chatManateeZone", "chats"), + ( + CloudNativeStream::Messages, + 2u8, + "messageManateeZone", + "messages", + ), + ( + CloudNativeStream::Attachments, + 3u8, + "attachmentManateeZone", + "attachments", + ), + ( + CloudNativeStream::MessageUpdate, + 4u8, + "messageUpdateZone", + "messageUpdateZone", + ), + ( + CloudNativeStream::RecoverableMessageDelete, + 5u8, + "recoverableMessageDeleteZone", + "recoverableMessageDeleteZone", + ), + ( + CloudNativeStream::ScheduledMessage, + 6u8, + "scheduledMessageZone", + "scheduledMessageZone", + ), + ( + CloudNativeStream::Chat1, + 7u8, + "chat1ManateeZone", + "chat1ManateeZone", + ), + ]; + + for (stream, tag, zone, parsed_zone) in cases { + assert_eq!(stream.tag(), tag); + assert_eq!(stream.zone(), zone); + assert_eq!(CloudNativeStream::from_tag(tag), Some(stream)); + assert_eq!(CloudNativeStream::parse(parsed_zone), Some(stream)); + } + assert_eq!(CloudNativeStream::parse("futureZone"), None); + assert_eq!(CloudNativeStream::from_tag(8), None); + } + + fn change(name: &str, raw: Vec) -> CloudMessageRecordPageChange { + CloudMessageRecordPageChange { + record_name: Some(name.to_owned()), + record_type: Some("Message".to_owned()), + change_type: Some(1), + system_fields: Some(CloudMessageRecordSystemFields { + etag: Some(format!("etag-{name}")), + created_at: Some(1.0), + modified_at: Some(2.0), + permission: Some(1), + }), + encrypted_record: Some(raw), + tombstone_payload: None, + kind: CloudMessageRecordKind::EncryptedUpsert, + } + } + + fn request<'a>( + scope: &'a CloudNativeProtectionScope, + checkpoint: Option<&'a str>, + ) -> CloudNativeFetchRequest<'a> { + CloudNativeFetchRequest { + stream: CloudNativeStream::Messages, + scope, + generation: 7, + previous_checkpoint_reference: checkpoint, + maximum_changes: 50, + } + } + + fn hasher() -> CloudSemanticIdentifierHasher { + CloudSemanticIdentifierHasher::new(b"native-fetch-test-key").expect("hasher") + } + + #[test] + fn protected_page_exposes_only_canonical_identifiers_lengths_and_references() { + let store = MemoryProtectedStore::default(); + let scope = scope(CloudNativeStream::Messages); + let page = CloudMessageRecordPage { + changes: vec![change("RAW-RECORD-NAME", b"RAW-SERVER-ENVELOPE".to_vec())], + next_token: Some(b"RAW-CONTINUATION".to_vec()), + status: 2, + }; + let outcome = protect_native_page(&store, &hasher(), &request(&scope, None), page); + let CloudNativeProtectedFetchOutcome::Page(page) = outcome else { + panic!("expected protected page"); + }; + assert_eq!(page.changes.len(), 1); + let protected = &page.changes[0]; + assert!(is_bare_digest(protected.change_id())); + assert!(is_bare_digest(protected.record_id_hash())); + assert!(is_bare_digest(protected.etag_hash().expect("etag hash"))); + assert_eq!(protected.payload_digest.value().len(), 64); + assert!(protected + .protected_record_identity_reference() + .starts_with("obcs2.ref.")); + assert!(protected + .protected_raw_envelope_reference() + .starts_with("obcs2.ref.")); + assert_ne!( + protected.protected_record_identity_reference(), + protected.protected_raw_envelope_reference() + ); + let safe_debug = format!("{page:?}"); + for secret in [ + "RAW-RECORD-NAME", + "RAW-SERVER-ENVELOPE", + "RAW-CONTINUATION", + "etag-RAW-RECORD-NAME", + ] { + assert!(!safe_debug.contains(secret)); + } + let protected_plaintexts = store.plaintexts().join("|"); + assert!(!safe_debug.contains(&protected_plaintexts)); + assert!(store.plaintexts().iter().any(|value| { + URL_SAFE_NO_PAD.decode(value).is_ok_and(|decoded| { + decoded + .windows(b"RAW-RECORD-NAME".len()) + .any(|window| window == b"RAW-RECORD-NAME") + }) + })); + } + + #[test] + fn protection_failure_returns_no_partial_page_or_values() { + let store = MemoryProtectedStore::default(); + store.fail_protection.store(true, Ordering::SeqCst); + let scope = scope(CloudNativeStream::Messages); + let outcome = protect_native_page( + &store, + &hasher(), + &request(&scope, None), + CloudMessageRecordPage { + changes: vec![change("one", vec![1]), change("two", vec![2])], + next_token: None, + status: 3, + }, + ); + assert_eq!( + outcome, + CloudNativeProtectedFetchOutcome::Failure(CloudNativeFetchFailure::new( + CloudNativeFailureCategory::LocalStorage, + CloudNativeSafeCode::ProtectionFailed, + None, + )) + ); + assert!(store.plaintexts().is_empty()); + } + + #[test] + fn checkpoint_is_bound_to_scope_generation_and_stream() { + let store = MemoryProtectedStore::default(); + let message_scope = scope(CloudNativeStream::Messages); + let plaintext = CloudNativePlaintext { + purpose: CloudNativeProtectionPurpose::CheckpointToken, + value: encode_checkpoint(7, CloudNativeStream::Messages, b"token").expect("encode"), + }; + let batch = store + .protect_batch(&message_scope, &[plaintext]) + .expect("protect checkpoint"); + let reference = batch.references[0].value().to_owned(); + assert_eq!( + store.unprotect( + &message_scope, + CloudNativeProtectionPurpose::RawRecord, + &batch.references[0], + ), + Err(CloudNativeStoreFailure::ContextMismatch) + ); + + let attachment_scope = scope(CloudNativeStream::Attachments); + let wrong_scope_request = CloudNativeFetchRequest { + stream: CloudNativeStream::Attachments, + scope: &attachment_scope, + generation: 7, + previous_checkpoint_reference: Some(&reference), + maximum_changes: 50, + }; + assert_eq!( + decode_previous_checkpoint(&store, &wrong_scope_request), + Err(CloudNativeFetchFailure::new( + CloudNativeFailureCategory::LocalStorage, + CloudNativeSafeCode::CheckpointContextMismatch, + None, + )) + ); + + let wrong_generation = CloudNativeFetchRequest { + generation: 8, + ..request(&message_scope, Some(&reference)) + }; + assert_eq!( + decode_previous_checkpoint(&store, &wrong_generation), + Err(CloudNativeFetchFailure::new( + CloudNativeFailureCategory::LocalStorage, + CloudNativeSafeCode::InvalidCheckpoint, + None, + )) + ); + } + + #[test] + fn page_and_record_bounds_are_enforced_before_raw_values_escape() { + let store = MemoryProtectedStore::default(); + let scope = scope(CloudNativeStream::Messages); + let too_many = CloudMessageRecordPage { + changes: (0..=MAX_CHANGES_PER_PAGE) + .map(|index| change(&format!("record-{index}"), vec![1])) + .collect(), + next_token: None, + status: 3, + }; + assert_eq!( + protect_native_page(&store, &hasher(), &request(&scope, None), too_many), + CloudNativeProtectedFetchOutcome::Failure(CloudNativeFetchFailure::new( + CloudNativeFailureCategory::MalformedRecord, + CloudNativeSafeCode::OversizedPage, + None, + )) + ); + + let oversized = CloudMessageRecordPage { + changes: vec![change("large", vec![7; MAX_RAW_RECORD_BYTES + 1])], + next_token: None, + status: 3, + }; + let CloudNativeProtectedFetchOutcome::Page(page) = + protect_native_page(&store, &hasher(), &request(&scope, None), oversized) + else { + panic!("oversized individual record must be quarantined"); + }; + assert_eq!( + page.changes[0].preflight_code, + Some(CloudNativePreflightCode::OversizedRecord) + ); + assert_eq!(page.changes[0].kind, CloudNativeChangeKind::Quarantined); + + let aggregate_store = MemoryProtectedStore::default(); + let aggregate = CloudMessageRecordPage { + changes: (0..3) + .map(|index| change(&format!("aggregate-{index}"), vec![9; MAX_RAW_RECORD_BYTES])) + .collect(), + next_token: None, + status: 3, + }; + assert_eq!( + protect_native_page( + &aggregate_store, + &hasher(), + &request(&scope, None), + aggregate, + ), + CloudNativeProtectedFetchOutcome::Failure(CloudNativeFetchFailure::new( + CloudNativeFailureCategory::MalformedRecord, + CloudNativeSafeCode::OversizedPage, + None, + )) + ); + assert!(aggregate_store.plaintexts().is_empty()); + } + + #[test] + fn lease_reference_parser_accepts_only_canonical_safe_grammar() { + assert!( + CloudNativePageLease::parse("obcs2.lease.0123456789abcdef0123456789abcdef").is_ok() + ); + for invalid in [ + "obcs2.lease.0123456789ABCDEF0123456789ABCDEF", + "obcs2.lease.short", + "obcs2.ref.0123456789abcdef0123456789abcdef", + "raw-record-name", + ] { + assert_eq!( + CloudNativePageLease::parse(invalid), + Err(CloudNativeFetchFailure::new( + CloudNativeFailureCategory::LocalStorage, + CloudNativeSafeCode::InvalidRequest, + None, + )) + ); + } + } + + #[test] + fn retry_after_and_protocol_failures_map_to_fixed_codes() { + let throttled = PushError::CloudKitHttpError { + status: 429, + retry_after: Some(Duration::from_secs(91)), + }; + assert_eq!( + map_fetch_failure(&throttled), + CloudNativeFetchFailure::new( + CloudNativeFailureCategory::Throttled, + CloudNativeSafeCode::HttpThrottled, + Some(91), + ) + ); + assert_eq!( + map_fetch_failure(&PushError::CloudKitProtocolError( + CloudKitProtocolError::ContinuationTokenNoProgress, + )), + CloudNativeFetchFailure::new( + CloudNativeFailureCategory::MalformedRecord, + CloudNativeSafeCode::ContinuationNoProgress, + None, + ) + ); + assert_eq!( + retry_after_seconds(&PushError::CloudKitHttpError { + status: 429, + retry_after: Some(Duration::from_secs(MAX_RETRY_AFTER_SECONDS + 1)), + }), + Some(MAX_RETRY_AFTER_SECONDS), + ); + } + + #[test] + fn journal_rejection_rolls_back_all_new_files_and_manifest() { + let directory = tempdir().expect("temp directory"); + let store = PlatformCloudNativeProtectedStore::new(directory.path().to_path_buf()); + let batch = store + .persist_batch(&["protected-one".to_owned(), "protected-two".to_owned()]) + .expect("persist protected batch"); + let paths = batch + .references + .iter() + .map(|reference| store.reference_path(reference).expect("reference path")) + .collect::>(); + assert!(paths.iter().all(|path| path.is_file())); + assert!(store + .lease_path(&batch.lease) + .expect("lease path") + .is_file()); + + cloud_sync_rollback_protected_page_lease( + directory.path().to_path_buf(), + batch.lease.value(), + ) + .expect("rollback by safe lease reference"); + cloud_sync_rollback_protected_page_lease( + directory.path().to_path_buf(), + batch.lease.value(), + ) + .expect("idempotent rollback"); + assert!(paths.iter().all(|path| !path.exists())); + assert!(!store.lease_path(&batch.lease).expect("lease path").exists()); + } + + #[test] + fn crash_recovery_is_bounded_and_removes_only_abandoned_lease_files() { + let directory = tempdir().expect("temp directory"); + let store = PlatformCloudNativeProtectedStore::new(directory.path().to_path_buf()); + let batch = store + .persist_batch(&["protected-after-crash".to_owned()]) + .expect("persist protected batch"); + let protected_path = store + .reference_path(&batch.references[0]) + .expect("reference path"); + drop(store); + + let reopened = PlatformCloudNativeProtectedStore::new(directory.path().to_path_buf()); + assert_eq!( + reopened + .recover_abandoned_leases(&HashSet::new(), &HashSet::new(), true) + .expect("recover"), + CloudNativeRecoverySummary { + finalized_adopted_lease_references: vec![], + absent_adopted_lease_references: vec![], + rolled_back: 1, + removed_temporary_files: 0, + has_more: false, + } + ); + assert!(!protected_path.exists()); + assert_eq!( + reopened + .recover_abandoned_leases(&HashSet::new(), &HashSet::new(), true) + .expect("idempotent"), + CloudNativeRecoverySummary::default() + ); + } + + #[test] + fn journal_committed_before_native_commit_preserves_adopted_files() { + let directory = tempdir().expect("temp directory"); + let store = PlatformCloudNativeProtectedStore::new(directory.path().to_path_buf()); + let batch = store + .persist_batch(&["journal-adopted-value".to_owned()]) + .expect("persist protected batch"); + let protected_path = store + .reference_path(&batch.references[0]) + .expect("reference path"); + let adopted = HashSet::from([batch.lease.value().to_owned()]); + let live = HashSet::from([batch.references[0].value().to_owned()]); + drop(store); + + let reopened = PlatformCloudNativeProtectedStore::new(directory.path().to_path_buf()); + assert_eq!( + reopened + .recover_abandoned_leases(&adopted, &live, true) + .expect("recover adopted lease"), + CloudNativeRecoverySummary { + finalized_adopted_lease_references: vec![batch.lease.reference.clone()], + absent_adopted_lease_references: vec![], + rolled_back: 0, + removed_temporary_files: 0, + has_more: false, + } + ); + assert!(protected_path.is_file()); + assert!(!reopened + .lease_path(&batch.lease) + .expect("lease path") + .exists()); + } + + #[test] + fn recovery_never_rolls_back_an_unmarked_manifest_still_named_by_objectbox() { + let directory = tempdir().expect("temp directory"); + let store = PlatformCloudNativeProtectedStore::new(directory.path().to_path_buf()); + let batch = store + .persist_batch(&["unexpected-live-unmarked-value".to_owned()]) + .expect("persist protected batch"); + let live = HashSet::from([batch.references[0].value().to_owned()]); + let path = store + .reference_path(&batch.references[0]) + .expect("protected path"); + + assert!(matches!( + store.recover_abandoned_leases(&HashSet::new(), &live, true), + Err(CloudNativeStoreFailure::InvalidReference) + )); + assert!(path.is_file()); + assert!(store + .lease_path(&batch.lease) + .expect("lease path") + .is_file()); + } + + #[test] + fn adopted_recovery_over_sixty_four_manifests_is_exact_and_repeatable() { + let directory = tempdir().expect("temp directory"); + let store = PlatformCloudNativeProtectedStore::new(directory.path().to_path_buf()); + let batches = (0..(MAX_RECOVERY_MANIFESTS_PER_PASS + 1)) + .map(|index| { + store + .persist_batch(&[format!("adopted-value-{index}")]) + .expect("persist adopted batch") + }) + .collect::>(); + let adopted = batches + .iter() + .map(|batch| batch.lease.value().to_owned()) + .collect::>(); + let protected_paths = batches + .iter() + .map(|batch| { + store + .reference_path(&batch.references[0]) + .expect("protected path") + }) + .collect::>(); + let live = batches + .iter() + .map(|batch| batch.references[0].value().to_owned()) + .collect::>(); + + let first = store + .recover_abandoned_leases(&adopted, &live, true) + .expect("first bounded recovery"); + assert_eq!( + first.finalized_adopted_lease_references.len(), + MAX_RECOVERY_MANIFESTS_PER_PASS + ); + assert_eq!(first.rolled_back, 0); + assert!(first.has_more); + + let mut remaining_adopted = adopted.clone(); + for reference in &first.finalized_adopted_lease_references { + remaining_adopted.remove(reference.value()); + let lease = CloudNativePageLease { + reference: reference.clone(), + }; + store + .acknowledge_committed_lease(&lease) + .expect("ack finalized recovery receipt"); + } + let second = store + .recover_abandoned_leases(&remaining_adopted, &live, true) + .expect("second bounded recovery"); + assert_eq!(second.finalized_adopted_lease_references.len(), 1); + assert!(second.absent_adopted_lease_references.is_empty()); + assert_eq!(second.rolled_back, 0); + assert!(!second.has_more); + assert!(protected_paths.iter().all(|path| path.is_file())); + } + + #[test] + fn temporary_only_recovery_over_sixty_four_files_reports_progress() { + let directory = tempdir().expect("temp directory"); + let store = PlatformCloudNativeProtectedStore::new(directory.path().to_path_buf()); + let store_directory = directory.path().join(STORE_DIRECTORY_NAME); + let temporary_directory = store_directory.join(TEMPORARY_DIRECTORY_NAME); + fs::create_dir_all(&temporary_directory).expect("temporary store directory"); + for index in 0..(MAX_RECOVERY_TEMPORARY_FILES_PER_PASS + 1) { + fs::write( + temporary_directory.join(format!(".tmp-progress-{index}.protected")), + b"unadopted-temporary-data", + ) + .expect("temporary recovery fixture"); + } + + let first = store + .recover_abandoned_leases(&HashSet::new(), &HashSet::new(), true) + .expect("first temporary recovery"); + assert_eq!( + first.removed_temporary_files, + MAX_RECOVERY_TEMPORARY_FILES_PER_PASS + ); + assert!(first.has_more); + assert!(first.finalized_adopted_lease_references.is_empty()); + assert!(first.absent_adopted_lease_references.is_empty()); + assert_eq!(first.rolled_back, 0); + + let second = store + .recover_abandoned_leases(&HashSet::new(), &HashSet::new(), true) + .expect("second temporary recovery"); + assert_eq!(second.removed_temporary_files, 1); + assert!(!second.has_more); + assert!(fs::read_dir(&temporary_directory) + .expect("temporary directory remains readable") + .next() + .is_none()); + } + + #[test] + fn recovery_handles_partial_blob_durability_without_exposing_a_page() { + let directory = tempdir().expect("temp directory"); + let store = PlatformCloudNativeProtectedStore::new(directory.path().to_path_buf()); + let batch = store + .persist_batch(&["durable-first".to_owned(), "missing-second".to_owned()]) + .expect("persist protected batch"); + let first = store + .reference_path(&batch.references[0]) + .expect("first path"); + let second = store + .reference_path(&batch.references[1]) + .expect("second path"); + fs::remove_file(&second).expect("simulate partial durability"); + let temporary = store + .temporary_directory() + .expect("temporary directory") + .join(".tmp-crash-fixture.protected"); + fs::write(&temporary, b"partial-temporary-value").expect("temporary crash fixture"); + + assert_eq!( + store + .recover_abandoned_leases(&HashSet::new(), &HashSet::new(), true) + .expect("recover partial lease"), + CloudNativeRecoverySummary { + finalized_adopted_lease_references: vec![], + absent_adopted_lease_references: vec![], + rolled_back: 1, + removed_temporary_files: 1, + has_more: false, + } + ); + assert!(!first.exists()); + assert!(!second.exists()); + assert!(!temporary.exists()); + assert!(!store.lease_path(&batch.lease).expect("lease path").exists()); + } + + #[test] + fn rollback_never_deletes_a_replaced_or_preexisting_file() { + let directory = tempdir().expect("temp directory"); + let store = PlatformCloudNativeProtectedStore::new(directory.path().to_path_buf()); + let batch = store + .persist_batch(&["original-protected-value".to_owned()]) + .expect("persist protected batch"); + let path = store + .reference_path(&batch.references[0]) + .expect("reference path"); + fs::write(&path, b"pre-existing-replacement").expect("replace fixture"); + + store.rollback_lease(&batch.lease).expect("rollback"); + assert_eq!( + fs::read(&path).expect("replacement remains"), + b"pre-existing-replacement" + ); + } + + #[test] + fn committed_lease_survives_later_recovery() { + let directory = tempdir().expect("temp directory"); + let store = PlatformCloudNativeProtectedStore::new(directory.path().to_path_buf()); + let batch = store + .persist_batch(&["adopted-protected-value".to_owned()]) + .expect("persist protected batch"); + let path = store + .reference_path(&batch.references[0]) + .expect("reference path"); + + let retained = vec![batch.references[0].value().to_owned()]; + cloud_sync_commit_protected_page_lease( + directory.path().to_path_buf(), + batch.lease.value(), + &retained, + ) + .expect("commit by safe lease reference"); + cloud_sync_commit_protected_page_lease( + directory.path().to_path_buf(), + batch.lease.value(), + &retained, + ) + .expect("idempotent commit"); + drop(store); + let reopened = PlatformCloudNativeProtectedStore::new(directory.path().to_path_buf()); + let adopted = HashSet::from([batch.lease.value().to_owned()]); + let live = HashSet::from([batch.references[0].value().to_owned()]); + let recovery = reopened + .recover_abandoned_leases(&adopted, &live, true) + .expect("recover stale adoption marker"); + assert_eq!( + recovery.finalized_adopted_lease_references, + vec![batch.lease.reference.clone()] + ); + assert!(recovery.absent_adopted_lease_references.is_empty()); + assert_eq!(recovery.rolled_back, 0); + assert!(!recovery.has_more); + assert!(path.is_file()); + + reopened + .acknowledge_committed_lease(&batch.lease) + .expect("acknowledge receipt after marker release"); + let after_ack = reopened + .recover_abandoned_leases(&adopted, &live, true) + .expect("receipt acknowledgement is idempotent"); + assert_eq!( + after_ack.absent_adopted_lease_references, + vec![batch.lease.reference.clone()] + ); + } + + #[test] + fn outbound_submission_requires_an_exact_fully_committed_lease() { + let directory = tempdir().expect("temp directory"); + let store = PlatformCloudNativeProtectedStore::new(directory.path().to_path_buf()); + let batch = store + .persist_batch(&[ + "retained-outbound-envelope".to_owned(), + "unretained-fixture".to_owned(), + ]) + .expect("persist protected batch"); + let retained = HashSet::from([batch.references[0].value().to_owned()]); + + assert!(matches!( + store.verify_committed_lease_exact(&batch.lease, &retained), + Err(CloudNativeStoreFailure::InvalidReference) + )); + + store + .commit_lease(&batch.lease, &retained) + .expect("commit exact outbound capability"); + store + .verify_committed_lease_exact(&batch.lease, &retained) + .expect("verify committed outbound capability"); + + let wrong = HashSet::from([batch.references[1].value().to_owned()]); + assert!(matches!( + store.verify_committed_lease_exact(&batch.lease, &wrong), + Err(CloudNativeStoreFailure::InvalidReference) + )); + assert!(matches!( + store.verify_committed_lease_exact(&batch.lease, &HashSet::new()), + Err(CloudNativeStoreFailure::InvalidReference) + )); + } + + #[test] + fn all_duplicate_page_commit_deletes_every_unretained_reference() { + let directory = tempdir().expect("temp directory"); + let store = PlatformCloudNativeProtectedStore::new(directory.path().to_path_buf()); + let batch = store + .persist_batch(&[ + "duplicate-record-id".to_owned(), + "duplicate-envelope".to_owned(), + "duplicate-checkpoint".to_owned(), + ]) + .expect("persist duplicate page"); + let paths = batch + .references + .iter() + .map(|reference| store.reference_path(reference).expect("reference path")) + .collect::>(); + + store + .commit_lease(&batch.lease, &HashSet::new()) + .expect("commit exact empty retained subset"); + store + .commit_lease(&batch.lease, &HashSet::new()) + .expect("repeat exact empty commit"); + + assert!(paths.iter().all(|path| !path.exists())); + assert!(!store.lease_path(&batch.lease).expect("lease path").exists()); + assert!(store + .committed_lease_path(&batch.lease) + .expect("receipt path") + .is_file()); + } + + #[test] + fn mixed_duplicate_page_commit_retains_only_the_exact_live_subset() { + let directory = tempdir().expect("temp directory"); + let store = PlatformCloudNativeProtectedStore::new(directory.path().to_path_buf()); + let batch = store + .persist_batch(&[ + "duplicate-record".to_owned(), + "new-record".to_owned(), + "duplicate-checkpoint".to_owned(), + ]) + .expect("persist mixed page"); + let retained = HashSet::from([batch.references[1].value().to_owned()]); + let paths = batch + .references + .iter() + .map(|reference| store.reference_path(reference).expect("reference path")) + .collect::>(); + + store + .commit_lease(&batch.lease, &retained) + .expect("commit exact mixed subset"); + store + .commit_lease(&batch.lease, &retained) + .expect("repeat exact mixed commit"); + + assert!(!paths[0].exists()); + assert!(paths[1].is_file()); + assert!(!paths[2].exists()); + assert!(matches!( + store.commit_lease(&batch.lease, &HashSet::new()), + Err(CloudNativeStoreFailure::InvalidReference) + )); + } + + #[test] + fn replacing_checkpoint_retires_only_the_prior_reference() { + let directory = tempdir().expect("temp directory"); + let store = PlatformCloudNativeProtectedStore::new(directory.path().to_path_buf()); + let old = store + .persist_batch(&["old-checkpoint".to_owned()]) + .expect("persist old checkpoint"); + let new = store + .persist_batch(&["new-checkpoint".to_owned()]) + .expect("persist new checkpoint"); + let old_reference = old.references[0].value().to_owned(); + let new_reference = new.references[0].value().to_owned(); + let old_path = store + .reference_path(&old.references[0]) + .expect("old checkpoint path"); + let new_path = store + .reference_path(&new.references[0]) + .expect("new checkpoint path"); + + store + .commit_lease(&old.lease, &HashSet::from([old_reference.clone()])) + .expect("commit old checkpoint"); + store + .acknowledge_committed_lease(&old.lease) + .expect("ack old checkpoint"); + store + .commit_lease(&new.lease, &HashSet::from([new_reference])) + .expect("commit new checkpoint"); + store + .acknowledge_committed_lease(&new.lease) + .expect("ack new checkpoint"); + + assert_eq!( + store + .retire_references(&HashSet::from([old_reference])) + .expect("retire prior checkpoint"), + 1 + ); + assert!(!old_path.exists()); + assert!(new_path.is_file()); + } + + #[test] + fn crash_between_receipt_write_and_manifest_removal_reports_one_finalization() { + let directory = tempdir().expect("temp directory"); + let store = PlatformCloudNativeProtectedStore::new(directory.path().to_path_buf()); + let batch = store + .persist_batch(&["crash-window-value".to_owned()]) + .expect("persist crash window page"); + let entries = store + .read_lease_entries(&store.lease_path(&batch.lease).expect("lease path")) + .expect("read manifest"); + store + .write_committed_receipt(&batch.lease, &entries) + .expect("simulate durable receipt before manifest removal"); + let adopted = HashSet::from([batch.lease.value().to_owned()]); + let live = HashSet::from([batch.references[0].value().to_owned()]); + + let recovery = store + .recover_abandoned_leases(&adopted, &live, true) + .expect("recover both manifest and receipt"); + + assert_eq!( + recovery.finalized_adopted_lease_references, + vec![batch.lease.reference.clone()] + ); + assert!(recovery.absent_adopted_lease_references.is_empty()); + assert!(!store.lease_path(&batch.lease).expect("lease path").exists()); + assert!(store + .committed_lease_path(&batch.lease) + .expect("receipt path") + .is_file()); + } + + #[test] + fn crash_after_marker_release_before_receipt_ack_leaks_safely_then_cleans_receipt() { + let directory = tempdir().expect("temp directory"); + let store = PlatformCloudNativeProtectedStore::new(directory.path().to_path_buf()); + let batch = store + .persist_batch(&["live-after-marker-release".to_owned()]) + .expect("persist page"); + let retained = HashSet::from([batch.references[0].value().to_owned()]); + let path = store + .reference_path(&batch.references[0]) + .expect("reference path"); + store + .commit_lease(&batch.lease, &retained) + .expect("commit before marker release"); + + let recovery = store + .recover_abandoned_leases(&HashSet::new(), &retained, true) + .expect("startup without adoption marker"); + + assert!(recovery.finalized_adopted_lease_references.is_empty()); + assert!(path.is_file()); + assert!(!store + .committed_lease_path(&batch.lease) + .expect("receipt path") + .exists()); + } + + #[test] + fn garbage_collection_preserves_active_lease_manifest_references() { + let directory = tempdir().expect("temp directory"); + let store = PlatformCloudNativeProtectedStore::new(directory.path().to_path_buf()); + let batch = store + .persist_batch(&["active-lease-value".to_owned()]) + .expect("persist active lease"); + let reference = &batch.references[0]; + let token = reference + .value() + .strip_prefix("obcs2.ref.") + .expect("reference token"); + + let first = store + .collect_garbage_unlocked_at(&HashSet::new(), true, 10) + .expect("scan active lease"); + let second = store + .collect_garbage_unlocked_at(&HashSet::new(), true, 10 + GC_GRACE_PERIOD.as_secs()) + .expect("rescan active lease after grace"); + + assert_eq!(first.preserved_active_lease, 1); + assert_eq!(second.preserved_active_lease, 1); + assert_eq!(first.deleted + second.deleted, 0); + assert!(!store + .gc_candidate_path(token) + .expect("candidate path") + .exists()); + assert!(store + .reference_path(reference) + .expect("protected path") + .is_file()); + } + + #[test] + fn incomplete_liveness_enumeration_fails_closed_without_marking() { + let directory = tempdir().expect("temp directory"); + let store = PlatformCloudNativeProtectedStore::new(directory.path().to_path_buf()); + let batch = store + .persist_batch(&["orphan-candidate".to_owned()]) + .expect("persist candidate"); + let retained = HashSet::from([batch.references[0].value().to_owned()]); + store + .commit_lease(&batch.lease, &retained) + .expect("commit candidate"); + store + .acknowledge_committed_lease(&batch.lease) + .expect("ack candidate"); + let token = batch.references[0] + .value() + .strip_prefix("obcs2.ref.") + .expect("reference token"); + + assert!(matches!( + store.collect_garbage_unlocked_at(&HashSet::new(), false, 10), + Err(CloudNativeStoreFailure::InvalidReference) + )); + assert!(!store + .gc_candidate_path(token) + .expect("candidate path") + .exists()); + assert!(store + .reference_path(&batch.references[0]) + .expect("protected path") + .is_file()); + } + + #[test] + fn a_reference_becoming_live_clears_its_orphan_history() { + let directory = tempdir().expect("temp directory"); + let store = PlatformCloudNativeProtectedStore::new(directory.path().to_path_buf()); + let batch = store + .persist_batch(&["temporarily-orphaned-value".to_owned()]) + .expect("persist candidate"); + let reference = batch.references[0].value().to_owned(); + let retained = HashSet::from([reference.clone()]); + store + .commit_lease(&batch.lease, &retained) + .expect("commit candidate"); + store + .acknowledge_committed_lease(&batch.lease) + .expect("ack candidate"); + + let first = store + .collect_garbage_unlocked_at(&HashSet::new(), true, 10) + .expect("first orphan observation"); + let live = store + .collect_garbage_unlocked_at(&retained, true, 10 + GC_GRACE_PERIOD.as_secs()) + .expect("reference becomes live"); + let orphan_again = store + .collect_garbage_unlocked_at( + &HashSet::new(), + true, + 10 + (GC_GRACE_PERIOD.as_secs() * 2), + ) + .expect("fresh orphan history"); + + assert_eq!(first.first_observed, 1); + assert_eq!(live.preserved_live, 1); + assert_eq!(orphan_again.first_observed, 1); + assert_eq!(orphan_again.deleted, 0); + assert!(store + .reference_path(&batch.references[0]) + .expect("protected path") + .is_file()); + } + + #[test] + fn garbage_collection_over_sixty_four_references_makes_bounded_progress() { + let directory = tempdir().expect("temp directory"); + let store = PlatformCloudNativeProtectedStore::new(directory.path().to_path_buf()); + let mut paths = Vec::new(); + for index in 0..(MAX_GC_REFERENCES_PER_PASS + 1) { + let batch = store + .persist_batch(&[format!("bounded-gc-{index}")]) + .expect("persist bounded GC fixture"); + let retained = HashSet::from([batch.references[0].value().to_owned()]); + paths.push( + store + .reference_path(&batch.references[0]) + .expect("protected path"), + ); + store + .commit_lease(&batch.lease, &retained) + .expect("commit bounded GC fixture"); + store + .acknowledge_committed_lease(&batch.lease) + .expect("ack bounded GC fixture"); + } + + let first = store + .collect_garbage_unlocked_at(&HashSet::new(), true, 100) + .expect("first bounded mark page"); + let second = store + .collect_garbage_unlocked_at(&HashSet::new(), true, 100) + .expect("second bounded mark page"); + assert_eq!(first.scanned, MAX_GC_REFERENCES_PER_PASS); + assert_eq!(first.first_observed, MAX_GC_REFERENCES_PER_PASS); + assert!(first.has_more); + assert_eq!(second.scanned, 1); + assert_eq!(second.first_observed, 1); + assert!(!second.has_more); + assert!(paths.iter().all(|path| path.is_file())); + + let after_grace = 100 + GC_GRACE_PERIOD.as_secs(); + let third = store + .collect_garbage_unlocked_at(&HashSet::new(), true, after_grace) + .expect("first bounded sweep page"); + let fourth = store + .collect_garbage_unlocked_at(&HashSet::new(), true, after_grace) + .expect("second bounded sweep page"); + assert_eq!(third.deleted, MAX_GC_REFERENCES_PER_PASS); + assert!(third.has_more); + assert_eq!(fourth.deleted, 1); + assert!(!fourth.has_more); + assert!(paths.iter().all(|path| !path.exists())); + assert!(fs::read_dir(store.gc_directory().expect("GC directory")) + .expect("read GC directory") + .all(|entry| { + !entry + .expect("GC entry") + .file_name() + .to_string_lossy() + .starts_with(".candidate-") + })); + } + + #[test] + fn explicit_retirement_is_bounded_to_sixty_four_references() { + let directory = tempdir().expect("temp directory"); + let references = (0..(MAX_RETIRE_REFERENCES_PER_CALL + 1)) + .map(|index| { + let digest = URL_SAFE_NO_PAD.encode(Sha256::digest(index.to_le_bytes())); + format!("obcs2.ref.{digest}") + }) + .collect::>(); + + assert!(matches!( + cloud_sync_retire_protected_references(directory.path().to_path_buf(), &references), + Err(CloudNativeFetchFailure { + safe_code: CloudNativeSafeCode::InvalidRequest, + .. + }) + )); + } + + #[test] + fn native_seam_source_has_no_frb_or_serializable_raw_dto() { + let source = include_str!("cloud_sync_native_fetch.rs"); + let production = source + .split("#[cfg(test)]") + .next() + .expect("production source"); + for forbidden in ["#[frb", "Serialize", "Deserialize", "CloudSyncRawChange"] { + assert!( + !production.contains(forbidden), + "native seam must not contain {forbidden}" + ); + } + } +} diff --git a/rust/src/cloud_sync_outbound.proto b/rust/src/cloud_sync_outbound.proto new file mode 100644 index 0000000000..b39d74ab3a --- /dev/null +++ b/rust/src/cloud_sync_outbound.proto @@ -0,0 +1,27 @@ +syntax = "proto3"; + +package openbubbles.cloudsync.outbound; + +// Versioned native-only envelope for one outbound MessageEncryptedV3 record. +// It is encoded and platform-protected before any durable Dart-visible state +// is written. No instance of this protobuf crosses Flutter Rust Bridge. +message CloudSyncOutboundMessageV1 { + uint32 schema_version = 1; + bool has_utm = 2; + int64 utm_seconds = 3; + uint32 utm_nanos = 4; + int64 message_type = 5; + int64 error = 6; + string chat_id = 7; + string sender = 8; + int64 time = 9; + optional bytes msg_proto_2 = 10; + string destination_caller_id = 11; + bytes msg_proto = 12; + int64 flags = 13; + string guid = 14; + optional bytes msg_proto_3 = 15; + string service = 16; + optional bytes msg_proto_4 = 17; + string server_record_name = 18; +} diff --git a/rust/src/cloud_sync_outbound.rs b/rust/src/cloud_sync_outbound.rs new file mode 100644 index 0000000000..541a56664e --- /dev/null +++ b/rust/src/cloud_sync_outbound.rs @@ -0,0 +1,673 @@ +//! Native-only protected outbound message boundary for Cloud Sync V2. +//! +//! Dart may supply a transient `CloudMessage`, but the durable representation +//! is a versioned protobuf protected under the `outboundMessage` purpose. Raw +//! message content and CloudKit record names never cross the bridge again. + +use std::{path::PathBuf, time::UNIX_EPOCH}; + +use base64::{engine::general_purpose::URL_SAFE_NO_PAD, Engine as _}; +use prost::Message; +use rustpush::{ + cloud_messages::{ + cloudmessagesp::{MessageProto, MessageProto2, MessageProto3, MessageProto4}, + CloudMessage, GZipWrapper, MessageFlags, + }, + cloudkit::allocate_or_reuse_record_name, +}; +use sha2::{Digest, Sha256}; +use thiserror::Error; + +use crate::cloud_sync_native_fetch::{ + cloud_sync_open_protected_outbound_message, cloud_sync_stage_protected_outbound_envelope, +}; + +mod wire { + include!(concat!( + env!("OUT_DIR"), + "/openbubbles.cloudsync.outbound.rs" + )); +} + +use wire::CloudSyncOutboundMessageV1; + +const OUTBOUND_SCHEMA_VERSION: u32 = 1; +const MAX_OUTBOUND_ENVELOPE_BYTES: usize = 2 * 1024 * 1024; +const MAX_IDENTIFIER_BYTES: usize = 4 * 1024; +const MAX_PROTO_BYTES: usize = 1024 * 1024; +const MAX_TEXT_BYTES: usize = 256 * 1024; +const MAX_ATTRIBUTED_BODY_BYTES: usize = 1024 * 1024; +// This is the exact ordinary sent-from-me shape emitted by Message.toCloud. +// Delivered/read/forward are ordinary optional state; every other bit is +// outside the first plain-text V2 canary. +const ORDINARY_OUTBOUND_FLAG_BITS: i64 = MessageFlags::IS_FINISHED.bits() + | MessageFlags::IS_FROM_ME.bits() + | MessageFlags::IS_DELIVERED.bits() + | MessageFlags::IS_READ.bits() + | MessageFlags::IS_SENT.bits() + | MessageFlags::IS_FORWARD.bits() + | MessageFlags::WAS_DATA_DETECTED.bits(); +const CLOUD_SYNC_SCOPE_SEPARATOR: char = '\u{001f}'; + +#[derive(Clone, Copy, Debug, Error, Eq, PartialEq)] +pub(crate) enum CloudSyncOutboundFailure { + #[error("outbound message is unsupported")] + UnsupportedMessage, + #[error("outbound message is malformed")] + MalformedMessage, + #[error("outbound message is oversized")] + OversizedMessage, + #[error("outbound protected storage failed")] + ProtectedStorage, + #[error("outbound protected binding failed")] + BindingMismatch, +} + +/// Dart-safe stage metadata. Every reference is an opaque protected-store +/// capability; both hashes are keyed/content-only diagnostics. +pub(crate) struct NativeProtectedOutboundStage { + pub(crate) logical_entity_key_hash: String, + pub(crate) protected_payload_reference: String, + pub(crate) payload_sha256: String, + pub(crate) payload_length: u64, + pub(crate) protected_server_record_reference: String, + pub(crate) server_record_id_hash: String, + pub(crate) lease_reference: String, +} + +pub(crate) fn stage_outbound_message( + storage_directory: PathBuf, + account_fingerprint: String, + message: CloudMessage, +) -> Result { + let logical_message_guid = message.guid.clone(); + let allocation = allocate_or_reuse_record_name(None) + .map_err(|_| CloudSyncOutboundFailure::MalformedMessage)?; + let record_name = allocation.record_name().to_owned(); + let encoded = encode_outbound_message(message, &record_name)?; + let payload_sha256 = sha256_hex(&encoded); + let payload_length = + u64::try_from(encoded.len()).map_err(|_| CloudSyncOutboundFailure::OversizedMessage)?; + let protected_envelope = URL_SAFE_NO_PAD.encode(&encoded); + let hasher = crate::cloud_sync_protector::semantic_identifier_hasher( + storage_directory.to_string_lossy().into_owned(), + ) + .map_err(|_| CloudSyncOutboundFailure::ProtectedStorage)?; + let logical_entity_key_hash = hasher + .canonical_entity_key_hash( + crate::cloud_sync_canonical_dto::CloudCanonicalEntityKind::Message, + &logical_message_guid, + ) + .map_err(|_| CloudSyncOutboundFailure::MalformedMessage)? + .value() + .to_owned(); + let server_record_id_hash = hasher.server_record_id_hash(&record_name); + + let staged = cloud_sync_stage_protected_outbound_envelope( + storage_directory, + account_fingerprint, + protected_envelope, + ) + .map_err(|_| CloudSyncOutboundFailure::ProtectedStorage)?; + + Ok(NativeProtectedOutboundStage { + logical_entity_key_hash, + protected_payload_reference: staged.protected_envelope_reference.clone(), + payload_sha256, + payload_length, + protected_server_record_reference: staged.protected_envelope_reference, + server_record_id_hash, + lease_reference: staged.lease_reference, + }) +} + +pub(crate) fn open_staged_outbound_message( + storage_directory: PathBuf, + account_fingerprint: String, + protected_payload_reference: &str, + expected_payload_sha256: &str, +) -> Result { + let protected_payload = cloud_sync_open_protected_outbound_message( + storage_directory, + account_fingerprint, + protected_payload_reference, + ) + .map_err(|_| CloudSyncOutboundFailure::ProtectedStorage)?; + let encoded = URL_SAFE_NO_PAD + .decode(protected_payload) + .map_err(|_| CloudSyncOutboundFailure::MalformedMessage)?; + if encoded.len() > MAX_OUTBOUND_ENVELOPE_BYTES + || sha256_hex(&encoded) != expected_payload_sha256 + { + return Err(CloudSyncOutboundFailure::BindingMismatch); + } + decode_outbound_envelope(&encoded).map(|(message, _)| message) +} + +pub(crate) fn open_staged_server_record_name( + storage_directory: PathBuf, + account_fingerprint: String, + protected_server_record_reference: &str, + expected_server_record_id_hash: &str, +) -> Result { + let protected_envelope = cloud_sync_open_protected_outbound_message( + storage_directory.clone(), + account_fingerprint, + protected_server_record_reference, + ) + .map_err(|_| CloudSyncOutboundFailure::ProtectedStorage)?; + let encoded = URL_SAFE_NO_PAD + .decode(protected_envelope) + .map_err(|_| CloudSyncOutboundFailure::MalformedMessage)?; + let (_, record_name) = decode_outbound_envelope(&encoded)?; + let hasher = crate::cloud_sync_protector::semantic_identifier_hasher( + storage_directory.to_string_lossy().into_owned(), + ) + .map_err(|_| CloudSyncOutboundFailure::ProtectedStorage)?; + if hasher.server_record_id_hash(&record_name) != expected_server_record_id_hash { + return Err(CloudSyncOutboundFailure::BindingMismatch); + } + Ok(record_name) +} + +/// Re-encodes a fetched message with the stable record name so ambiguous-write +/// reconciliation can compare it with the exact protected envelope staged +/// before submission. Any CloudKit normalization becomes an explicit +/// divergence rather than an unsafe automatic replay. +pub(crate) fn outbound_message_payload_sha256( + message: CloudMessage, + server_record_name: &str, +) -> Result { + encode_outbound_message(message, server_record_name).map(|encoded| sha256_hex(&encoded)) +} + +/// Recomputes the Dart `CloudOperationIdentity.forInitialCreate` value for +/// the one currently supported outbound scope. Keeping this check native +/// prevents a well-formed but unrelated local ID from being paired with a +/// protected envelope at prepare or reconciliation time. +pub(crate) fn initial_message_create_operation_id( + account_fingerprint: &str, + logical_entity_key_hash: &str, +) -> Result { + if account_fingerprint.len() != 43 + || logical_entity_key_hash.len() != 43 + || !account_fingerprint + .bytes() + .all(|byte| byte.is_ascii_alphanumeric() || matches!(byte, b'_' | b'-')) + || !logical_entity_key_hash + .bytes() + .all(|byte| byte.is_ascii_alphanumeric() || matches!(byte, b'_' | b'-')) + { + return Err(CloudSyncOutboundFailure::BindingMismatch); + } + let storage_key = [ + account_fingerprint, + "com.apple.messages.cloud", + "private", + "messageManateeZone", + "messages", + "2", + ] + .join(&CLOUD_SYNC_SCOPE_SEPARATOR.to_string()); + let canonical = [ + "cloud-sync-initial-create-v1", + storage_key.as_str(), + logical_entity_key_hash, + "save", + "1", + ] + .join(&CLOUD_SYNC_SCOPE_SEPARATOR.to_string()); + Ok(format!("op1:{}", sha256_hex(canonical.as_bytes()))) +} + +fn encode_outbound_message( + message: CloudMessage, + server_record_name: &str, +) -> Result, CloudSyncOutboundFailure> { + validate_cloud_message(&message)?; + validate_identifier(server_record_name)?; + let (has_utm, utm_seconds, utm_nanos) = match message.utm { + Some(value) => { + let duration = value + .duration_since(UNIX_EPOCH) + .map_err(|_| CloudSyncOutboundFailure::MalformedMessage)?; + ( + true, + i64::try_from(duration.as_secs()) + .map_err(|_| CloudSyncOutboundFailure::MalformedMessage)?, + duration.subsec_nanos(), + ) + } + None => (false, 0, 0), + }; + let envelope = CloudSyncOutboundMessageV1 { + schema_version: OUTBOUND_SCHEMA_VERSION, + has_utm, + utm_seconds, + utm_nanos, + message_type: message.r#type, + error: message.error, + chat_id: message.chat_id, + sender: message.sender, + time: message.time, + msg_proto_2: message.msg_proto_2.map(|value| value.0.encode_to_vec()), + destination_caller_id: message.destination_caller_id, + msg_proto: message.msg_proto.0.encode_to_vec(), + flags: message.flags.bits(), + guid: message.guid, + msg_proto_3: message.msg_proto_3.map(|value| value.0.encode_to_vec()), + service: message.service, + msg_proto_4: message.msg_proto_4.map(|value| value.0.encode_to_vec()), + server_record_name: server_record_name.to_owned(), + }; + let encoded_len = envelope.encoded_len(); + if encoded_len == 0 || encoded_len > MAX_OUTBOUND_ENVELOPE_BYTES { + return Err(CloudSyncOutboundFailure::OversizedMessage); + } + let encoded = envelope.encode_to_vec(); + Ok(encoded) +} + +fn decode_outbound_envelope( + encoded: &[u8], +) -> Result<(CloudMessage, String), CloudSyncOutboundFailure> { + if encoded.is_empty() || encoded.len() > MAX_OUTBOUND_ENVELOPE_BYTES { + return Err(CloudSyncOutboundFailure::OversizedMessage); + } + let envelope = CloudSyncOutboundMessageV1::decode(encoded) + .map_err(|_| CloudSyncOutboundFailure::MalformedMessage)?; + if envelope.schema_version != OUTBOUND_SCHEMA_VERSION || envelope.utm_nanos >= 1_000_000_000 { + return Err(CloudSyncOutboundFailure::MalformedMessage); + } + let utm = if envelope.has_utm { + if envelope.utm_seconds < 0 { + return Err(CloudSyncOutboundFailure::MalformedMessage); + } + Some(UNIX_EPOCH + std::time::Duration::new(envelope.utm_seconds as u64, envelope.utm_nanos)) + } else { + if envelope.utm_seconds != 0 || envelope.utm_nanos != 0 { + return Err(CloudSyncOutboundFailure::MalformedMessage); + } + None + }; + validate_identifier(&envelope.server_record_name)?; + let server_record_name = envelope.server_record_name.clone(); + let message = CloudMessage { + utm, + r#type: envelope.message_type, + error: envelope.error, + chat_id: envelope.chat_id, + sender: envelope.sender, + time: envelope.time, + msg_proto_2: decode_optional_proto::(envelope.msg_proto_2)?.map(GZipWrapper), + destination_caller_id: envelope.destination_caller_id, + msg_proto: GZipWrapper(decode_required_proto::(envelope.msg_proto)?), + flags: MessageFlags::from_bits_retain(envelope.flags), + guid: envelope.guid, + msg_proto_3: decode_optional_proto::(envelope.msg_proto_3)?.map(GZipWrapper), + service: envelope.service, + msg_proto_4: decode_optional_proto::(envelope.msg_proto_4)?.map(GZipWrapper), + }; + validate_cloud_message(&message)?; + Ok((message, server_record_name)) +} + +fn validate_identifier(value: &str) -> Result<(), CloudSyncOutboundFailure> { + if value.is_empty() || value.len() > MAX_IDENTIFIER_BYTES || value.contains('\0') { + return Err(CloudSyncOutboundFailure::MalformedMessage); + } + Ok(()) +} + +fn decode_required_proto( + encoded: Vec, +) -> Result { + if encoded.is_empty() || encoded.len() > MAX_PROTO_BYTES { + return Err(CloudSyncOutboundFailure::MalformedMessage); + } + T::decode(encoded.as_slice()).map_err(|_| CloudSyncOutboundFailure::MalformedMessage) +} + +fn decode_optional_proto( + encoded: Option>, +) -> Result, CloudSyncOutboundFailure> { + encoded + .map(|encoded| { + if encoded.len() > MAX_PROTO_BYTES { + return Err(CloudSyncOutboundFailure::OversizedMessage); + } + T::decode(encoded.as_slice()).map_err(|_| CloudSyncOutboundFailure::MalformedMessage) + }) + .transpose() +} + +fn validate_cloud_message(message: &CloudMessage) -> Result<(), CloudSyncOutboundFailure> { + // The first production gate is intentionally one ordinary, outgoing + // iMessage text record. Reactions, edits, app balloons, attachments, SMS, + // and scheduled messages remain disabled until their own fixtures pass. + if message.r#type != 1 || message.service != "iMessage" { + return Err(CloudSyncOutboundFailure::UnsupportedMessage); + } + if message.chat_id.is_empty() + || message.destination_caller_id.is_empty() + || message.guid.is_empty() + || message.time <= 0 + || !message.sender.is_empty() + || !message.flags.contains(MessageFlags::IS_FINISHED) + || !message.flags.contains(MessageFlags::IS_FROM_ME) + || !message.flags.contains(MessageFlags::IS_SENT) + || !message.flags.contains(MessageFlags::WAS_DATA_DETECTED) + || message.error != 0 + { + return Err(CloudSyncOutboundFailure::MalformedMessage); + } + if (message.flags.bits() & !ORDINARY_OUTBOUND_FLAG_BITS) != 0 { + return Err(CloudSyncOutboundFailure::UnsupportedMessage); + } + for value in [ + message.chat_id.as_str(), + message.destination_caller_id.as_str(), + message.guid.as_str(), + message.service.as_str(), + ] { + if value.len() > MAX_IDENTIFIER_BYTES || value.contains('\0') { + return Err(CloudSyncOutboundFailure::OversizedMessage); + } + } + let proto = &message.msg_proto.0; + if proto.encoded_len() > MAX_PROTO_BYTES + || message + .msg_proto_2 + .as_ref() + .is_some_and(|value| value.0.encoded_len() > MAX_PROTO_BYTES) + || message + .msg_proto_3 + .as_ref() + .is_some_and(|value| value.0.encoded_len() > MAX_PROTO_BYTES) + || message + .msg_proto_4 + .as_ref() + .is_some_and(|value| value.0.encoded_len() > MAX_PROTO_BYTES) + || proto + .text + .as_ref() + .is_some_and(|value| value.len() > MAX_TEXT_BYTES) + || proto + .attributed_body + .as_ref() + .is_some_and(|value| value.len() > MAX_ATTRIBUTED_BODY_BYTES) + { + return Err(CloudSyncOutboundFailure::OversizedMessage); + } + // The first canary is plain text only. An attributed body is a separate + // NSKeyedArchiver/styling payload and must not enter this encoder yet. + if proto.attributed_body.as_ref().is_some_and(|value| !value.is_empty()) { + return Err(CloudSyncOutboundFailure::UnsupportedMessage); + } + if proto.unk1 != 1 + || proto.unk10.is_some_and(|value| value != 0) + || proto.unk11.is_some_and(|value| value != 0) + || proto.unk14.is_some_and(|value| value != 0) + || proto.subject.is_some() + || proto.effect.is_some() + || proto.balloon_bundle_id.is_some() + || proto.payload_data.is_some() + || proto.message_summary_info.is_some() + || proto.associated_message_type.is_some() + || proto.associated_message_guid.is_some() + || proto.associated_message_range_location.is_some() + || proto.associated_message_range_length.is_some() + || (proto.text.as_deref().unwrap_or_default().is_empty() + && proto + .attributed_body + .as_deref() + .unwrap_or_default() + .is_empty()) + { + return Err(CloudSyncOutboundFailure::UnsupportedMessage); + } + if message + .msg_proto_2 + .as_ref() + .is_some_and(|value| value.0.reply.is_some()) + || message.msg_proto_3.as_ref().is_some_and(|value| { + value.0.unk2.is_some_and(|field| field != 0) + || value.0.unk3.is_some_and(|field| field != 0) + }) + { + return Err(CloudSyncOutboundFailure::UnsupportedMessage); + } + if let Some(proto4) = message.msg_proto_4.as_ref().map(|value| &value.0) { + if proto4.associated_message_emoji.is_some() + || proto4.schedule_type.is_some_and(|value| value != 0) + || proto4.schedule_state.is_some_and(|value| value != 0) + || proto4 + .sent_or_received_off_grid + .is_some_and(|value| value != 0) + || proto4 + .service + .as_deref() + .is_some_and(|value| value != "iMessage") + { + return Err(CloudSyncOutboundFailure::UnsupportedMessage); + } + if let Some(group_id) = proto4.group_id.as_deref() { + // TODO: Message.toCloud currently emits groupId for DMs. Do not + // infer one-to-one versus group chat from its presence until the + // V2 wire contract is defined and covered by a real fixture. + validate_identifier(group_id)?; + } + } + Ok(()) +} + +fn sha256_hex(value: &[u8]) -> String { + Sha256::digest(value) + .iter() + .map(|byte| format!("{byte:02x}")) + .collect() +} + +#[cfg(test)] +mod tests { + use super::*; + + fn fixture() -> CloudMessage { + CloudMessage { + utm: Some(UNIX_EPOCH + std::time::Duration::new(1_700_000_000, 123)), + r#type: 1, + error: 0, + chat_id: "iMessage;-;fixture@example.com".to_owned(), + sender: String::new(), + time: 123_456_789, + msg_proto_2: None, + destination_caller_id: "sender@example.com".to_owned(), + msg_proto: GZipWrapper(MessageProto { + unk1: 1, + text: Some("fixture".to_owned()), + ..Default::default() + }), + flags: MessageFlags::IS_FINISHED + | MessageFlags::IS_FROM_ME + | MessageFlags::IS_SENT + | MessageFlags::WAS_DATA_DETECTED, + guid: "fixture-guid".to_owned(), + msg_proto_3: Some(GZipWrapper(MessageProto3::default())), + service: "iMessage".to_owned(), + msg_proto_4: Some(GZipWrapper(MessageProto4 { + service: Some("iMessage".to_owned()), + ..Default::default() + })), + } + } + + #[test] + fn outbound_envelope_round_trips_without_losing_presence_or_flags() { + let original = fixture(); + let encoded = encode_outbound_message(original, "SERVER-RECORD").expect("encode"); + let (decoded, record_name) = decode_outbound_envelope(&encoded).expect("decode"); + assert_eq!(decoded.chat_id, "iMessage;-;fixture@example.com"); + assert_eq!(decoded.msg_proto.text.as_deref(), Some("fixture")); + assert!(decoded.msg_proto_2.is_none()); + assert!(decoded.msg_proto_3.is_some()); + assert!(decoded.flags.contains(MessageFlags::IS_FROM_ME)); + assert!(decoded.flags.contains(MessageFlags::IS_SENT)); + assert_eq!(record_name, "SERVER-RECORD"); + } + + #[test] + fn reconciliation_digest_binds_message_and_stable_record_name() { + let expected = outbound_message_payload_sha256(fixture(), "SERVER-RECORD").unwrap(); + assert_eq!( + outbound_message_payload_sha256(fixture(), "SERVER-RECORD").unwrap(), + expected + ); + assert_ne!( + outbound_message_payload_sha256(fixture(), "OTHER-RECORD").unwrap(), + expected + ); + let mut changed = fixture(); + changed.msg_proto.0.text = Some("different".to_owned()); + assert_ne!( + outbound_message_payload_sha256(changed, "SERVER-RECORD").unwrap(), + expected + ); + } + + #[test] + fn initial_create_operation_identity_matches_the_dart_cross_language_fixture() { + assert_eq!( + initial_message_create_operation_id(&"A".repeat(43), &"L".repeat(43)).unwrap(), + "op1:516a95310adb6de12787de0e51d654e05f40f2289991f76dcd8e1dac2bd865cb" + ); + assert_ne!( + initial_message_create_operation_id(&"B".repeat(43), &"L".repeat(43)).unwrap(), + initial_message_create_operation_id(&"A".repeat(43), &"L".repeat(43)).unwrap() + ); + assert_ne!( + initial_message_create_operation_id(&"A".repeat(43), &"M".repeat(43)).unwrap(), + initial_message_create_operation_id(&"A".repeat(43), &"L".repeat(43)).unwrap() + ); + } + + #[test] + fn initial_create_operation_identity_rejects_noncanonical_hash_inputs() { + for invalid in ["short".to_owned(), "!".repeat(43), "A".repeat(44)] { + assert_eq!( + initial_message_create_operation_id(&invalid, &"L".repeat(43)).unwrap_err(), + CloudSyncOutboundFailure::BindingMismatch + ); + assert_eq!( + initial_message_create_operation_id(&"A".repeat(43), &invalid).unwrap_err(), + CloudSyncOutboundFailure::BindingMismatch + ); + } + } + + #[test] + fn outbound_gate_rejects_reactions_extensions_and_sms() { + let mut reaction = fixture(); + reaction.r#type = 2; + assert_eq!( + encode_outbound_message(reaction, "SERVER-RECORD").unwrap_err(), + CloudSyncOutboundFailure::UnsupportedMessage + ); + + let mut extension = fixture(); + extension.msg_proto.0.payload_data = Some(vec![1]); + assert_eq!( + encode_outbound_message(extension, "SERVER-RECORD").unwrap_err(), + CloudSyncOutboundFailure::UnsupportedMessage + ); + + let mut sms = fixture(); + sms.service = "SMS".to_owned(); + assert_eq!( + encode_outbound_message(sms, "SERVER-RECORD").unwrap_err(), + CloudSyncOutboundFailure::UnsupportedMessage + ); + } + + #[test] + fn outbound_gate_rejects_nonempty_attributed_body() { + let mut styled = fixture(); + styled.msg_proto.0.attributed_body = Some(vec![0x80, 0x01]); + assert_eq!( + encode_outbound_message(styled, "SERVER-RECORD").unwrap_err(), + CloudSyncOutboundFailure::UnsupportedMessage + ); + } + + #[test] + fn outbound_gate_rejects_unsupported_and_unknown_flag_bits() { + for flag in [ + MessageFlags::IS_AUDIO_MESSAGE, + MessageFlags::IS_SYSTEM_MESSAGE, + MessageFlags::IS_DELAYED, + ] { + let mut unsupported = fixture(); + unsupported.flags |= flag; + assert_eq!( + encode_outbound_message(unsupported, "SERVER-RECORD").unwrap_err(), + CloudSyncOutboundFailure::UnsupportedMessage + ); + } + + let mut unknown = fixture(); + unknown.flags = MessageFlags::from_bits_retain(unknown.flags.bits() | (1_i64 << 62)); + assert_eq!( + encode_outbound_message(unknown, "SERVER-RECORD").unwrap_err(), + CloudSyncOutboundFailure::UnsupportedMessage + ); + } + + #[test] + fn outbound_gate_keeps_group_id_contract_explicitly_unresolved() { + // Message.toCloud emits groupId for current DM records. This test + // deliberately documents acceptance, not a group-chat classification + // rule, until the V2 one-to-one wire contract has a real fixture. + let mut message = fixture(); + message.msg_proto_4.as_mut().unwrap().0.group_id = Some("dm-wire-id".to_owned()); + assert!(encode_outbound_message(message, "SERVER-RECORD").is_ok()); + } + + #[test] + fn envelope_rejects_version_and_digest_tampering() { + let encoded = encode_outbound_message(fixture(), "SERVER-RECORD").expect("encode"); + let mut envelope = CloudSyncOutboundMessageV1::decode(encoded.as_slice()).unwrap(); + envelope.schema_version += 1; + assert_eq!( + decode_outbound_envelope(&envelope.encode_to_vec()).unwrap_err(), + CloudSyncOutboundFailure::MalformedMessage + ); + } + + #[test] + fn outbound_gate_rejects_reply_and_scheduled_metadata() { + let mut reply = fixture(); + reply.msg_proto_2 = Some(GZipWrapper(MessageProto2 { + reply: Some("reply-guid".to_owned()), + })); + assert_eq!( + encode_outbound_message(reply, "SERVER-RECORD").unwrap_err(), + CloudSyncOutboundFailure::UnsupportedMessage + ); + + let mut scheduled = fixture(); + scheduled.msg_proto_4.as_mut().unwrap().0.schedule_type = Some(1); + assert_eq!( + encode_outbound_message(scheduled, "SERVER-RECORD").unwrap_err(), + CloudSyncOutboundFailure::UnsupportedMessage + ); + } + + #[test] + fn outbound_gate_rejects_oversized_text_before_envelope_encoding() { + let mut oversized = fixture(); + oversized.msg_proto.0.text = Some("x".repeat(MAX_TEXT_BYTES + 1)); + assert_eq!( + encode_outbound_message(oversized, "SERVER-RECORD").unwrap_err(), + CloudSyncOutboundFailure::OversizedMessage + ); + } +} diff --git a/rust/src/cloud_sync_protector.rs b/rust/src/cloud_sync_protector.rs new file mode 100644 index 0000000000..2813b1fe80 --- /dev/null +++ b/rust/src/cloud_sync_protector.rs @@ -0,0 +1,958 @@ +//! Platform protection boundary for Cloud Sync V2. +//! +//! The public entry points deliberately accept every scope component +//! separately. This avoids delimiter ambiguity and makes the complete scope, +//! value purpose, and plaintext part of one authenticated inner envelope. + +use std::{ + fs::{self, File, OpenOptions}, + io::{self, Read, Write}, + path::{Path, PathBuf}, +}; + +use base64::{engine::general_purpose::URL_SAFE_NO_PAD, Engine as _}; +use hmac::{Hmac, Mac}; +use sha2::Sha256; +use thiserror::Error; + +#[cfg(target_os = "android")] +use keystore::{EncryptMode, KeyType, KeystoreAccessRules}; + +use crate::cloud_sync_semantic_identity::CloudSemanticIdentifierHasher; +#[cfg(target_os = "android")] +use crate::keystore::{android_native_keystore, NativeKeystore}; +#[cfg(target_os = "windows")] +use crate::windows_secret_storage::{ + load_or_create_cloud_sync_install_secret, protect_current_user, unprotect_current_user, +}; + +const INNER_MAGIC: &[u8] = b"OBCS2-CONTEXT"; +const SECRET_MAGIC: &[u8] = b"OBCS2-SECRET"; +const FORMAT_VERSION: u16 = 1; +const WINDOWS_PLATFORM_TAG: &str = "windows"; +const ANDROID_PLATFORM_TAG: &str = "android"; +const CIPHERTEXT_PREFIX: &str = "obcs2"; +const INSTALL_SECRET_FILE_NAME: &str = "cloud_sync_v2_install_secret.bin"; +const ANDROID_KEY_ALIAS: &str = "openbubbles:cloud-sync:v2:master"; +const FINGERPRINT_DOMAIN: &[u8] = b"OpenBubbles Cloud Sync V2 account fingerprint\0"; +const IDENTIFIER_KEY_DOMAIN: &[u8] = b"OpenBubbles Cloud Sync V2 semantic identifier key v1\0"; +const PROTECTED_STORE_ID_DOMAIN: &[u8] = + b"OpenBubbles Cloud Sync V2 protected native store identity v1\0"; +const INSTALL_SECRET_LENGTH: usize = 32; +const MAX_CONTEXT_FIELD_BYTES: usize = 16 * 1024; +const MAX_PLAINTEXT_BYTES: usize = 16 * 1024 * 1024; +const MAX_PROTECTED_BYTES: usize = MAX_PLAINTEXT_BYTES + 1024 * 1024; +const MIN_GCM_CIPHERTEXT_BYTES: usize = 12 + 16; + +type HmacSha256 = Hmac; + +#[derive(Debug, Error)] +pub enum CloudSyncProtectionError { + #[error("Cloud Sync protection is unavailable on this platform")] + UnsupportedPlatform, + #[error("Cloud Sync protection storage is unavailable")] + InvalidStorageDirectory, + #[error("Cloud Sync protection context is invalid")] + InvalidContext, + #[error("Cloud Sync protected value is invalid")] + InvalidProtectedValue, + #[error("Cloud Sync protected value belongs to a different context")] + ContextMismatch, + #[error("Cloud Sync protected value belongs to a different platform")] + PlatformMismatch, + #[error("Cloud Sync protected value format is unsupported")] + UnsupportedFormat, + #[error("Cloud Sync protection key is unavailable")] + KeyUnavailable, + #[error("Cloud Sync secret storage is invalid")] + InvalidSecretStorage, + #[error("Cloud Sync secret storage does not exist")] + MissingSecretStorage, + #[error("Cloud Sync secret storage operation failed")] + SecretStorage, +} + +#[derive(Clone, PartialEq, Eq)] +pub struct CloudSyncProtectionContext { + account_fingerprint: String, + container: String, + database: String, + zone: String, + stream_kind: String, + schema_version: u32, + purpose: String, +} + +impl CloudSyncProtectionContext { + #[allow(clippy::too_many_arguments)] + pub fn new( + account_fingerprint: String, + container: String, + database: String, + zone: String, + stream_kind: String, + schema_version: u32, + purpose: String, + ) -> Result { + let context = Self { + account_fingerprint, + container, + database, + zone, + stream_kind, + schema_version, + purpose, + }; + context.validate()?; + Ok(context) + } + + fn validate(&self) -> Result<(), CloudSyncProtectionError> { + for field in [ + self.account_fingerprint.as_str(), + self.container.as_str(), + self.database.as_str(), + self.zone.as_str(), + ] { + validate_nonempty_field(field)?; + } + if !matches!(self.stream_kind.as_str(), "messages" | "profiles") + || self.schema_version == 0 + || !matches!( + self.purpose.as_str(), + "checkpointToken" + | "serverRecordId" + | "outboundMessage" + | "systemFields" + | "payloadReference" + | "rawRecord" + ) + { + return Err(CloudSyncProtectionError::InvalidContext); + } + Ok(()) + } +} + +#[allow(clippy::too_many_arguments)] +pub fn protect( + storage_directory: String, + account_fingerprint: String, + container: String, + database: String, + zone: String, + stream_kind: String, + schema_version: u32, + purpose: String, + plaintext: String, +) -> Result { + if plaintext.len() > MAX_PLAINTEXT_BYTES { + return Err(CloudSyncProtectionError::InvalidProtectedValue); + } + let context = CloudSyncProtectionContext::new( + account_fingerprint, + container, + database, + zone, + stream_kind, + schema_version, + purpose, + )?; + let storage_directory = validate_storage_directory(&storage_directory)?; + let authenticated_plaintext = encode_inner(&context, plaintext.as_bytes())?; + let (platform, protected) = platform_protect(&storage_directory, &authenticated_plaintext)?; + if protected.is_empty() || protected.len() > MAX_PROTECTED_BYTES { + return Err(CloudSyncProtectionError::InvalidProtectedValue); + } + Ok(format!( + "{CIPHERTEXT_PREFIX}.{platform}.{}", + URL_SAFE_NO_PAD.encode(protected) + )) +} + +#[allow(clippy::too_many_arguments)] +pub fn unprotect( + storage_directory: String, + account_fingerprint: String, + container: String, + database: String, + zone: String, + stream_kind: String, + schema_version: u32, + purpose: String, + ciphertext: String, +) -> Result { + let expected_context = CloudSyncProtectionContext::new( + account_fingerprint, + container, + database, + zone, + stream_kind, + schema_version, + purpose, + )?; + let storage_directory = validate_storage_directory(&storage_directory)?; + let (platform, protected) = decode_outer(&ciphertext)?; + let authenticated_plaintext = platform_unprotect(&storage_directory, platform, &protected)?; + let (actual_context, plaintext) = decode_inner(&authenticated_plaintext)?; + if actual_context != expected_context { + return Err(CloudSyncProtectionError::ContextMismatch); + } + String::from_utf8(plaintext).map_err(|_| CloudSyncProtectionError::InvalidProtectedValue) +} + +pub fn fingerprint_account( + storage_directory: String, + raw_account_identifier: String, +) -> Result { + if raw_account_identifier.is_empty() || raw_account_identifier.len() > MAX_CONTEXT_FIELD_BYTES { + return Err(CloudSyncProtectionError::InvalidContext); + } + let storage_directory = validate_storage_directory(&storage_directory)?; + let secret = platform_install_secret(&storage_directory)?; + let mut hmac = HmacSha256::new_from_slice(&secret) + .map_err(|_| CloudSyncProtectionError::KeyUnavailable)?; + hmac.update(FINGERPRINT_DOMAIN); + hmac.update(raw_account_identifier.as_bytes()); + Ok(URL_SAFE_NO_PAD.encode(hmac.finalize().into_bytes())) +} + +/// Builds the native-only semantic identifier hasher from a domain-separated +/// per-install key. The key never crosses Flutter Rust Bridge. +pub(crate) fn semantic_identifier_hasher( + storage_directory: String, +) -> Result { + let storage_directory = validate_storage_directory(&storage_directory)?; + let secret = platform_install_secret(&storage_directory)?; + let mut hmac = HmacSha256::new_from_slice(&secret) + .map_err(|_| CloudSyncProtectionError::KeyUnavailable)?; + hmac.update(IDENTIFIER_KEY_DOMAIN); + let identifier_key = hmac.finalize().into_bytes(); + CloudSemanticIdentifierHasher::new(identifier_key) + .map_err(|_| CloudSyncProtectionError::KeyUnavailable) +} + +/// Returns a non-reversible, per-native-store recovery identity. +/// +/// The identity is derived only from the protected per-install secret, so it +/// remains stable across Dart wrappers without disclosing a filesystem path. +pub(crate) fn protected_store_identity( + storage_directory: String, +) -> Result { + let storage_directory = validate_storage_directory(&storage_directory)?; + let secret = platform_install_secret(&storage_directory)?; + let mut hmac = HmacSha256::new_from_slice(&secret) + .map_err(|_| CloudSyncProtectionError::KeyUnavailable)?; + hmac.update(PROTECTED_STORE_ID_DOMAIN); + Ok(format!( + "obcs2.store.{}", + URL_SAFE_NO_PAD.encode(hmac.finalize().into_bytes()) + )) +} + +fn validate_storage_directory(path: &str) -> Result { + if path.is_empty() { + return Err(CloudSyncProtectionError::InvalidStorageDirectory); + } + let path = PathBuf::from(path); + if !path.is_dir() { + return Err(CloudSyncProtectionError::InvalidStorageDirectory); + } + Ok(path) +} + +fn validate_nonempty_field(field: &str) -> Result<(), CloudSyncProtectionError> { + if field.is_empty() || field.len() > MAX_CONTEXT_FIELD_BYTES { + return Err(CloudSyncProtectionError::InvalidContext); + } + Ok(()) +} + +fn encode_inner( + context: &CloudSyncProtectionContext, + plaintext: &[u8], +) -> Result, CloudSyncProtectionError> { + let mut encoded = Vec::with_capacity(INNER_MAGIC.len() + plaintext.len() + 256); + encoded.extend_from_slice(INNER_MAGIC); + encoded.extend_from_slice(&FORMAT_VERSION.to_be_bytes()); + append_bytes(&mut encoded, context.account_fingerprint.as_bytes())?; + append_bytes(&mut encoded, context.container.as_bytes())?; + append_bytes(&mut encoded, context.database.as_bytes())?; + append_bytes(&mut encoded, context.zone.as_bytes())?; + append_bytes(&mut encoded, context.stream_kind.as_bytes())?; + encoded.extend_from_slice(&context.schema_version.to_be_bytes()); + append_bytes(&mut encoded, context.purpose.as_bytes())?; + append_bytes(&mut encoded, plaintext)?; + Ok(encoded) +} + +fn decode_inner( + encoded: &[u8], +) -> Result<(CloudSyncProtectionContext, Vec), CloudSyncProtectionError> { + let mut cursor = ByteCursor::new(encoded); + cursor.expect(INNER_MAGIC)?; + if cursor.read_u16()? != FORMAT_VERSION { + return Err(CloudSyncProtectionError::UnsupportedFormat); + } + let account_fingerprint = cursor.read_string(MAX_CONTEXT_FIELD_BYTES)?; + let container = cursor.read_string(MAX_CONTEXT_FIELD_BYTES)?; + let database = cursor.read_string(MAX_CONTEXT_FIELD_BYTES)?; + let zone = cursor.read_string(MAX_CONTEXT_FIELD_BYTES)?; + let stream_kind = cursor.read_string(MAX_CONTEXT_FIELD_BYTES)?; + let schema_version = cursor.read_u32()?; + let purpose = cursor.read_string(MAX_CONTEXT_FIELD_BYTES)?; + let plaintext = cursor.read_bytes(MAX_PLAINTEXT_BYTES)?.to_vec(); + if !cursor.is_finished() { + return Err(CloudSyncProtectionError::InvalidProtectedValue); + } + let context = CloudSyncProtectionContext::new( + account_fingerprint, + container, + database, + zone, + stream_kind, + schema_version, + purpose, + )?; + Ok((context, plaintext)) +} + +fn append_bytes(target: &mut Vec, bytes: &[u8]) -> Result<(), CloudSyncProtectionError> { + let length = + u32::try_from(bytes.len()).map_err(|_| CloudSyncProtectionError::InvalidProtectedValue)?; + target.extend_from_slice(&length.to_be_bytes()); + target.extend_from_slice(bytes); + Ok(()) +} + +fn decode_outer(ciphertext: &str) -> Result<(&str, Vec), CloudSyncProtectionError> { + if ciphertext.len() > MAX_PROTECTED_BYTES * 2 { + return Err(CloudSyncProtectionError::InvalidProtectedValue); + } + let mut parts = ciphertext.split('.'); + if parts.next() != Some(CIPHERTEXT_PREFIX) { + return Err(CloudSyncProtectionError::UnsupportedFormat); + } + let platform = parts + .next() + .ok_or(CloudSyncProtectionError::InvalidProtectedValue)?; + let encoded = parts + .next() + .ok_or(CloudSyncProtectionError::InvalidProtectedValue)?; + if parts.next().is_some() || encoded.is_empty() { + return Err(CloudSyncProtectionError::InvalidProtectedValue); + } + let protected = URL_SAFE_NO_PAD + .decode(encoded) + .map_err(|_| CloudSyncProtectionError::InvalidProtectedValue)?; + if protected.is_empty() || protected.len() > MAX_PROTECTED_BYTES { + return Err(CloudSyncProtectionError::InvalidProtectedValue); + } + Ok((platform, protected)) +} + +struct ByteCursor<'a> { + bytes: &'a [u8], + offset: usize, +} + +impl<'a> ByteCursor<'a> { + fn new(bytes: &'a [u8]) -> Self { + Self { bytes, offset: 0 } + } + + fn expect(&mut self, expected: &[u8]) -> Result<(), CloudSyncProtectionError> { + if self.take(expected.len())? != expected { + return Err(CloudSyncProtectionError::InvalidProtectedValue); + } + Ok(()) + } + + fn read_u16(&mut self) -> Result { + let bytes: [u8; 2] = self + .take(2)? + .try_into() + .map_err(|_| CloudSyncProtectionError::InvalidProtectedValue)?; + Ok(u16::from_be_bytes(bytes)) + } + + fn read_u32(&mut self) -> Result { + let bytes: [u8; 4] = self + .take(4)? + .try_into() + .map_err(|_| CloudSyncProtectionError::InvalidProtectedValue)?; + Ok(u32::from_be_bytes(bytes)) + } + + fn read_bytes(&mut self, max_length: usize) -> Result<&'a [u8], CloudSyncProtectionError> { + let length = usize::try_from(self.read_u32()?) + .map_err(|_| CloudSyncProtectionError::InvalidProtectedValue)?; + if length > max_length { + return Err(CloudSyncProtectionError::InvalidProtectedValue); + } + self.take(length) + } + + fn read_string(&mut self, max_length: usize) -> Result { + String::from_utf8(self.read_bytes(max_length)?.to_vec()) + .map_err(|_| CloudSyncProtectionError::InvalidProtectedValue) + } + + fn take(&mut self, length: usize) -> Result<&'a [u8], CloudSyncProtectionError> { + let end = self + .offset + .checked_add(length) + .ok_or(CloudSyncProtectionError::InvalidProtectedValue)?; + if end > self.bytes.len() { + return Err(CloudSyncProtectionError::InvalidProtectedValue); + } + let result = &self.bytes[self.offset..end]; + self.offset = end; + Ok(result) + } + + fn is_finished(&self) -> bool { + self.offset == self.bytes.len() + } +} + +#[cfg(target_os = "windows")] +fn platform_protect( + _storage_directory: &Path, + plaintext: &[u8], +) -> Result<(&'static str, Vec), CloudSyncProtectionError> { + let protected = + protect_current_user(plaintext).map_err(|_| CloudSyncProtectionError::KeyUnavailable)?; + Ok((WINDOWS_PLATFORM_TAG, protected)) +} + +#[cfg(target_os = "windows")] +fn platform_unprotect( + _storage_directory: &Path, + platform: &str, + ciphertext: &[u8], +) -> Result, CloudSyncProtectionError> { + if platform != WINDOWS_PLATFORM_TAG { + return Err(CloudSyncProtectionError::PlatformMismatch); + } + unprotect_current_user(ciphertext).map_err(|_| CloudSyncProtectionError::InvalidProtectedValue) +} + +#[cfg(target_os = "windows")] +fn platform_install_secret( + storage_directory: &Path, +) -> Result<[u8; INSTALL_SECRET_LENGTH], CloudSyncProtectionError> { + load_or_create_cloud_sync_install_secret(&storage_directory.join(INSTALL_SECRET_FILE_NAME)) + .map_err(|_| CloudSyncProtectionError::InvalidSecretStorage) +} + +#[cfg(target_os = "android")] +fn android_keystore() -> Result<&'static dyn NativeKeystore, CloudSyncProtectionError> { + android_native_keystore() + .map(|store| store.as_ref()) + .ok_or(CloudSyncProtectionError::KeyUnavailable) +} + +#[cfg(target_os = "android")] +fn ensure_android_master_key() -> Result<&'static dyn NativeKeystore, CloudSyncProtectionError> { + let store = android_keystore()?; + match store + .get_key_type(ANDROID_KEY_ALIAS.to_owned()) + .map_err(|_| CloudSyncProtectionError::KeyUnavailable)? + { + Some(KeyType::Aes(256)) => return Ok(store), + Some(_) => return Err(CloudSyncProtectionError::KeyUnavailable), + None => {} + } + + let access_rules = KeystoreAccessRules { + block_modes: vec![EncryptMode::Gcm], + require_user: false, + can_encrypt: true, + can_decrypt: true, + ..Default::default() + }; + if store + .create_key( + ANDROID_KEY_ALIAS.to_owned(), + KeyType::Aes(256), + access_rules, + ) + .is_err() + { + // A concurrent caller may have won the create. Only accept the error + // when a fresh lookup proves that the exact expected key now exists. + if !matches!( + store.get_key_type(ANDROID_KEY_ALIAS.to_owned()), + Ok(Some(KeyType::Aes(256))) + ) { + return Err(CloudSyncProtectionError::KeyUnavailable); + } + } + Ok(store) +} + +#[cfg(target_os = "android")] +fn android_encrypt(plaintext: &[u8]) -> Result, CloudSyncProtectionError> { + let store = ensure_android_master_key()?; + store + .encrypt( + ANDROID_KEY_ALIAS.to_owned(), + plaintext.to_vec(), + EncryptMode::Gcm, + ) + .map_err(|_| CloudSyncProtectionError::KeyUnavailable) +} + +#[cfg(target_os = "android")] +fn android_decrypt(ciphertext: &[u8]) -> Result, CloudSyncProtectionError> { + if ciphertext.len() < MIN_GCM_CIPHERTEXT_BYTES { + return Err(CloudSyncProtectionError::InvalidProtectedValue); + } + let store = ensure_android_master_key()?; + store + .decrypt( + ANDROID_KEY_ALIAS.to_owned(), + ciphertext.to_vec(), + EncryptMode::Gcm, + ) + .map_err(|_| CloudSyncProtectionError::InvalidProtectedValue) +} + +#[cfg(target_os = "android")] +fn platform_protect( + _storage_directory: &Path, + plaintext: &[u8], +) -> Result<(&'static str, Vec), CloudSyncProtectionError> { + Ok((ANDROID_PLATFORM_TAG, android_encrypt(plaintext)?)) +} + +#[cfg(target_os = "android")] +fn platform_unprotect( + _storage_directory: &Path, + platform: &str, + ciphertext: &[u8], +) -> Result, CloudSyncProtectionError> { + if platform != ANDROID_PLATFORM_TAG { + return Err(CloudSyncProtectionError::PlatformMismatch); + } + android_decrypt(ciphertext) +} + +#[cfg(target_os = "android")] +fn platform_install_secret( + storage_directory: &Path, +) -> Result<[u8; INSTALL_SECRET_LENGTH], CloudSyncProtectionError> { + ensure_android_master_key()?; + load_or_create_encrypted_install_secret( + &storage_directory.join(INSTALL_SECRET_FILE_NAME), + android_encrypt, + android_decrypt, + ) +} + +#[cfg(not(any(target_os = "windows", target_os = "android")))] +fn platform_protect( + _storage_directory: &Path, + _plaintext: &[u8], +) -> Result<(&'static str, Vec), CloudSyncProtectionError> { + Err(CloudSyncProtectionError::UnsupportedPlatform) +} + +#[cfg(not(any(target_os = "windows", target_os = "android")))] +fn platform_unprotect( + _storage_directory: &Path, + _platform: &str, + _ciphertext: &[u8], +) -> Result, CloudSyncProtectionError> { + Err(CloudSyncProtectionError::UnsupportedPlatform) +} + +#[cfg(not(any(target_os = "windows", target_os = "android")))] +fn platform_install_secret( + _storage_directory: &Path, +) -> Result<[u8; INSTALL_SECRET_LENGTH], CloudSyncProtectionError> { + Err(CloudSyncProtectionError::UnsupportedPlatform) +} + +fn load_or_create_encrypted_install_secret( + path: &Path, + encrypt: Encrypt, + decrypt: Decrypt, +) -> Result<[u8; INSTALL_SECRET_LENGTH], CloudSyncProtectionError> +where + Encrypt: Fn(&[u8]) -> Result, CloudSyncProtectionError>, + Decrypt: Fn(&[u8]) -> Result, CloudSyncProtectionError>, +{ + match read_encrypted_install_secret(path, &decrypt) { + Ok(secret) => return Ok(secret), + Err(CloudSyncProtectionError::MissingSecretStorage) => {} + Err(error) => return Err(error), + } + + let secret: [u8; INSTALL_SECRET_LENGTH] = rand::random(); + let ciphertext = encrypt(&secret)?; + if ciphertext.len() < MIN_GCM_CIPHERTEXT_BYTES || ciphertext.len() > MAX_PROTECTED_BYTES { + return Err(CloudSyncProtectionError::InvalidSecretStorage); + } + let encoded = encode_secret_file(&ciphertext)?; + install_secret_file_atomically(path, &encoded)?; + + let installed = read_encrypted_install_secret(path, decrypt)?; + if installed != secret { + // Another process may have installed its secret first. That is valid, + // but the strict read above must be the authoritative result. + return Ok(installed); + } + Ok(secret) +} + +fn read_encrypted_install_secret( + path: &Path, + decrypt: Decrypt, +) -> Result<[u8; INSTALL_SECRET_LENGTH], CloudSyncProtectionError> +where + Decrypt: Fn(&[u8]) -> Result, CloudSyncProtectionError>, +{ + let mut file = match File::open(path) { + Ok(file) => file, + Err(error) if error.kind() == io::ErrorKind::NotFound => { + return Err(CloudSyncProtectionError::MissingSecretStorage) + } + Err(_) => return Err(CloudSyncProtectionError::SecretStorage), + }; + let metadata = file + .metadata() + .map_err(|_| CloudSyncProtectionError::SecretStorage)?; + if metadata.len() == 0 || metadata.len() > MAX_PROTECTED_BYTES as u64 { + return Err(CloudSyncProtectionError::InvalidSecretStorage); + } + let mut encoded = Vec::with_capacity(metadata.len() as usize); + file.read_to_end(&mut encoded) + .map_err(|_| CloudSyncProtectionError::SecretStorage)?; + let ciphertext = decode_secret_file(&encoded)?; + let plaintext = decrypt(ciphertext)?; + plaintext + .try_into() + .map_err(|_| CloudSyncProtectionError::InvalidSecretStorage) +} + +fn encode_secret_file(ciphertext: &[u8]) -> Result, CloudSyncProtectionError> { + let mut encoded = Vec::with_capacity(SECRET_MAGIC.len() + ciphertext.len() + 6); + encoded.extend_from_slice(SECRET_MAGIC); + encoded.extend_from_slice(&FORMAT_VERSION.to_be_bytes()); + append_bytes(&mut encoded, ciphertext)?; + Ok(encoded) +} + +fn decode_secret_file(encoded: &[u8]) -> Result<&[u8], CloudSyncProtectionError> { + let mut cursor = ByteCursor::new(encoded); + cursor + .expect(SECRET_MAGIC) + .map_err(|_| CloudSyncProtectionError::InvalidSecretStorage)?; + if cursor + .read_u16() + .map_err(|_| CloudSyncProtectionError::InvalidSecretStorage)? + != FORMAT_VERSION + { + return Err(CloudSyncProtectionError::UnsupportedFormat); + } + let ciphertext = cursor + .read_bytes(MAX_PROTECTED_BYTES) + .map_err(|_| CloudSyncProtectionError::InvalidSecretStorage)?; + if ciphertext.len() < MIN_GCM_CIPHERTEXT_BYTES || !cursor.is_finished() { + return Err(CloudSyncProtectionError::InvalidSecretStorage); + } + Ok(ciphertext) +} + +fn install_secret_file_atomically( + path: &Path, + encoded: &[u8], +) -> Result<(), CloudSyncProtectionError> { + let parent = path + .parent() + .ok_or(CloudSyncProtectionError::InvalidStorageDirectory)?; + let file_name = path + .file_name() + .ok_or(CloudSyncProtectionError::InvalidStorageDirectory)? + .to_string_lossy(); + let temporary = parent.join(format!(".{file_name}.{}.tmp", uuid::Uuid::new_v4())); + + let result = (|| { + let mut file = OpenOptions::new() + .write(true) + .create_new(true) + .open(&temporary) + .map_err(|_| CloudSyncProtectionError::SecretStorage)?; + file.write_all(encoded) + .map_err(|_| CloudSyncProtectionError::SecretStorage)?; + file.flush() + .map_err(|_| CloudSyncProtectionError::SecretStorage)?; + file.sync_all() + .map_err(|_| CloudSyncProtectionError::SecretStorage)?; + drop(file); + + match fs::hard_link(&temporary, path) { + Ok(()) => { + #[cfg(target_os = "android")] + File::open(parent) + .and_then(|directory| directory.sync_all()) + .map_err(|_| CloudSyncProtectionError::SecretStorage)?; + Ok(()) + } + Err(error) if error.kind() == io::ErrorKind::AlreadyExists => Ok(()), + Err(_) => Err(CloudSyncProtectionError::SecretStorage), + } + })(); + + let _ = fs::remove_file(&temporary); + result +} + +#[cfg(test)] +mod tests { + use std::{ + sync::{Arc, Barrier}, + thread, + }; + + use aes_gcm::{ + aead::{Aead, KeyInit}, + Aes256Gcm, Nonce, + }; + use sha2::{Digest, Sha256}; + use tempfile::tempdir; + + use super::*; + + fn context(purpose: &str) -> CloudSyncProtectionContext { + CloudSyncProtectionContext::new( + "fingerprint".to_owned(), + "container".to_owned(), + "private".to_owned(), + "zone".to_owned(), + "messages".to_owned(), + 2, + purpose.to_owned(), + ) + .expect("test context should be valid") + } + + fn test_encryptor( + key: [u8; 32], + ) -> ( + impl Fn(&[u8]) -> Result, CloudSyncProtectionError> + Clone, + impl Fn(&[u8]) -> Result, CloudSyncProtectionError> + Clone, + ) { + let cipher = Arc::new(Aes256Gcm::new_from_slice(&key).expect("test key")); + let encrypt_cipher = cipher.clone(); + let encrypt = move |plaintext: &[u8]| { + let nonce: [u8; 12] = rand::random(); + let mut result = nonce.to_vec(); + result.extend_from_slice( + &encrypt_cipher + .encrypt(Nonce::from_slice(&nonce), plaintext) + .map_err(|_| CloudSyncProtectionError::KeyUnavailable)?, + ); + Ok(result) + }; + let decrypt = move |ciphertext: &[u8]| { + if ciphertext.len() < MIN_GCM_CIPHERTEXT_BYTES { + return Err(CloudSyncProtectionError::InvalidProtectedValue); + } + cipher + .decrypt(Nonce::from_slice(&ciphertext[..12]), &ciphertext[12..]) + .map_err(|_| CloudSyncProtectionError::InvalidProtectedValue) + }; + (encrypt, decrypt) + } + + #[test] + fn authenticated_envelope_rejects_scope_and_purpose_moves() { + let original = context("checkpointToken"); + let encoded = encode_inner(&original, b"opaque token").expect("encode"); + let (decoded, plaintext) = decode_inner(&encoded).expect("decode"); + assert!(decoded == original); + assert_eq!(plaintext, b"opaque token"); + assert!(decoded != context("serverRecordId")); + + let different_scope = CloudSyncProtectionContext::new( + "other-fingerprint".to_owned(), + "container".to_owned(), + "private".to_owned(), + "zone".to_owned(), + "messages".to_owned(), + 2, + "checkpointToken".to_owned(), + ) + .expect("second context"); + assert!(decoded != different_scope); + } + + #[test] + fn inner_envelope_rejects_truncation_and_trailing_bytes() { + let mut encoded = encode_inner(&context("rawRecord"), b"record").expect("encode"); + assert!(decode_inner(&encoded[..encoded.len() - 1]).is_err()); + encoded.push(0); + assert!(decode_inner(&encoded).is_err()); + } + + #[test] + fn encrypted_secret_file_is_race_stable_and_corruption_fails_closed() { + let directory = tempdir().expect("temporary directory"); + let path = directory.path().join(INSTALL_SECRET_FILE_NAME); + let (encrypt, decrypt) = test_encryptor([7; 32]); + + let first = + load_or_create_encrypted_install_secret(&path, encrypt.clone(), decrypt.clone()) + .expect("first secret"); + let second = + load_or_create_encrypted_install_secret(&path, encrypt.clone(), decrypt.clone()) + .expect("same secret"); + assert_eq!(first, second); + + let original = fs::read(&path).expect("read secret file"); + fs::write(&path, &original[..original.len() / 2]).expect("truncate test file"); + assert!(load_or_create_encrypted_install_secret(&path, encrypt, decrypt).is_err()); + assert_eq!( + fs::read(&path).expect("corrupt file remains"), + original[..original.len() / 2] + ); + } + + #[test] + fn encrypted_secret_file_concurrent_creators_converge() { + let directory = tempdir().expect("temporary directory"); + let path = Arc::new(directory.path().join(INSTALL_SECRET_FILE_NAME)); + let barrier = Arc::new(Barrier::new(8)); + let mut workers = Vec::new(); + + for _ in 0..8 { + let path = path.clone(); + let barrier = barrier.clone(); + workers.push(thread::spawn(move || { + let (encrypt, decrypt) = test_encryptor([19; 32]); + barrier.wait(); + load_or_create_encrypted_install_secret(&path, encrypt, decrypt) + .expect("concurrent creator should converge") + })); + } + + let secrets: Vec<_> = workers + .into_iter() + .map(|worker| worker.join().expect("worker should not panic")) + .collect(); + assert!(secrets.windows(2).all(|pair| pair[0] == pair[1])); + } + + #[test] + fn fingerprint_uses_keyed_hmac_not_plain_sha256() { + let secret = [11; 32]; + let raw_identifier = b"low-entropy-account-id"; + let mut hmac = ::new_from_slice(&secret).expect("HMAC key"); + hmac.update(FINGERPRINT_DOMAIN); + hmac.update(raw_identifier); + let keyed = hmac.finalize().into_bytes(); + let plain = Sha256::digest(raw_identifier); + assert_ne!(keyed.as_slice(), plain.as_slice()); + } + + #[cfg(target_os = "windows")] + #[test] + fn windows_round_trip_rejects_tampering_and_cross_context_move() { + let directory = tempdir().expect("temporary directory"); + let storage = directory.path().to_string_lossy().into_owned(); + let ciphertext = protect( + storage.clone(), + "fingerprint".to_owned(), + "container".to_owned(), + "private".to_owned(), + "zone".to_owned(), + "messages".to_owned(), + 2, + "checkpointToken".to_owned(), + "opaque token".to_owned(), + ) + .expect("protect"); + + assert_eq!( + unprotect( + storage.clone(), + "fingerprint".to_owned(), + "container".to_owned(), + "private".to_owned(), + "zone".to_owned(), + "messages".to_owned(), + 2, + "checkpointToken".to_owned(), + ciphertext.clone(), + ) + .expect("unprotect"), + "opaque token" + ); + + assert!(unprotect( + storage.clone(), + "fingerprint".to_owned(), + "container".to_owned(), + "private".to_owned(), + "other-zone".to_owned(), + "messages".to_owned(), + 2, + "checkpointToken".to_owned(), + ciphertext.clone(), + ) + .is_err()); + + assert!(unprotect( + storage.clone(), + "fingerprint".to_owned(), + "container".to_owned(), + "private".to_owned(), + "zone".to_owned(), + "messages".to_owned(), + 2, + "serverRecordId".to_owned(), + ciphertext.clone(), + ) + .is_err()); + + let mut tampered = ciphertext.into_bytes(); + let last = tampered.len() - 1; + tampered[last] = if tampered[last] == b'A' { b'B' } else { b'A' }; + assert!(unprotect( + storage, + "fingerprint".to_owned(), + "container".to_owned(), + "private".to_owned(), + "zone".to_owned(), + "messages".to_owned(), + 2, + "checkpointToken".to_owned(), + String::from_utf8(tampered).expect("ASCII ciphertext"), + ) + .is_err()); + } + + #[cfg(target_os = "windows")] + #[test] + fn windows_fingerprint_is_stable_keyed_and_install_scoped() { + let directory = tempdir().expect("temporary directory"); + let storage = directory.path().to_string_lossy().into_owned(); + let raw = "low-entropy-account-id".to_owned(); + let first = fingerprint_account(storage.clone(), raw.clone()).expect("first fingerprint"); + let second = fingerprint_account(storage.clone(), raw.clone()).expect("stable fingerprint"); + let plain = URL_SAFE_NO_PAD.encode(Sha256::digest(raw.as_bytes())); + + assert_eq!(first, second); + assert_ne!(first, plain); + assert_eq!(first.len(), 43); + assert!(directory.path().join(INSTALL_SECRET_FILE_NAME).is_file()); + + let other_directory = tempdir().expect("second temporary directory"); + let other = fingerprint_account(other_directory.path().to_string_lossy().into_owned(), raw) + .expect("second installation fingerprint"); + assert_ne!(first, other); + } +} diff --git a/rust/src/cloud_sync_semantic_decoder.rs b/rust/src/cloud_sync_semantic_decoder.rs new file mode 100644 index 0000000000..d7d1ee25e5 --- /dev/null +++ b/rust/src/cloud_sync_semantic_decoder.rs @@ -0,0 +1,735 @@ +//! Native-only semantic identity projection for Cloud Sync V2. +//! +//! This module deliberately stops before Dart/ObjectBox mutation. It accepts +//! decrypted CloudKit records only inside Rust, emits keyed identifiers and a +//! protected raw-envelope reference, and never formats raw record names, +//! Apple GUIDs, handles, or plaintext in diagnostics. + +use std::{collections::HashMap, panic::AssertUnwindSafe}; + +use rustpush::{ + cloud_messages::{AttachmentMeta, CloudAttachment, CloudChat, CloudMessage}, + cloudkit_proto::{CloudKitRecord, Record}, + pcs::PCSEncryptor, + PushError, +}; +use thiserror::Error; + +use crate::cloud_sync_canonical_dto::{CloudCanonicalEntityKind, CloudCanonicalHash}; + +// The keyed hasher and the two types it reports through live in a +// dependency-light module so the native protector and its standalone harness +// can link them without this module's Apple record parsing stack. +pub use crate::cloud_sync_semantic_identity::{ + CloudSemanticDecodeFailure, CloudSemanticEntityKind, CloudSemanticIdentifierHasher, +}; + +#[derive(Clone, Copy, Debug, Eq, PartialEq, Hash)] +pub enum CloudSemanticStream { + Chats, + Messages, + Attachments, +} + +impl CloudSemanticStream { + fn record_type(self) -> &'static str { + match self { + Self::Chats => "chatEncryptedv2", + Self::Messages => "MessageEncryptedV3", + Self::Attachments => "attachment", + } + } + + fn entity_kind(self) -> CloudSemanticEntityKind { + match self { + Self::Chats => CloudSemanticEntityKind::Chat, + Self::Messages => CloudSemanticEntityKind::Message, + Self::Attachments => CloudSemanticEntityKind::Attachment, + } + } +} + +/// A transport-validated change shape. Apple may omit `RecordChange.type`, so +/// the semantic boundary must not require the numeric value after the +/// transport has proven whether the change carries a record or a tombstone. +#[derive(Clone, Copy, Debug, Eq, PartialEq, Hash)] +pub enum CloudSemanticChangeKind { + Upsert, + Tombstone, +} + +/// One preflighted server envelope. The raw record name remains native-only. +/// `protected_raw_envelope_reference` must refer to the lossless ciphertext +/// journal entry, never to decoded plaintext. +pub struct CloudSemanticEnvelope<'a> { + pub stream: CloudSemanticStream, + pub record_name: &'a str, + pub record_type: Option<&'a str>, + pub change_kind: CloudSemanticChangeKind, + pub protected_raw_envelope_reference: &'a str, + pub server_modified_at: Option, +} + +/// A content-free identity projection. It is safe to persist as Cloud Sync +/// metadata but its `Debug` implementation intentionally omits all values. +#[derive(Clone, Eq, PartialEq)] +pub struct CloudSemanticProjection { + pub entity_kind: CloudSemanticEntityKind, + pub server_record_id_hash: String, + pub logical_entity_key_hash: String, + pub protected_raw_envelope_reference: String, + pub server_modified_at_millis: Option, +} + +impl std::fmt::Debug for CloudSemanticProjection { + fn fmt(&self, formatter: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { + formatter.write_str("CloudSemanticProjection(redacted)") + } +} + +/// The only metadata necessary to resolve a later server tombstone. Raw server +/// identifiers are intentionally not retained here. +#[derive(Clone, Debug, Eq, PartialEq)] +pub struct CloudSemanticRecordMapEntry { + pub entity_kind: CloudSemanticEntityKind, + pub server_record_id_hash: String, + pub logical_entity_key_hash: String, +} + +#[derive(Clone, Eq, PartialEq)] +pub struct CloudSemanticTombstone { + pub entity_kind: CloudSemanticEntityKind, + pub server_record_id_hash: String, + pub logical_entity_key_hash: String, + pub protected_raw_envelope_reference: String, + pub deleted_at_millis: Option, + pub server_confirmed: bool, +} + +impl std::fmt::Debug for CloudSemanticTombstone { + fn fmt(&self, formatter: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { + formatter.write_str("CloudSemanticTombstone(redacted)") + } +} + +/// Classifies one envelope before any PCS decryption. This is intentionally +/// strict: an unexpected type, missing raw-reference, or contradictory change +/// shape cannot fall through into the semantic applier. +pub fn classify_envelope( + envelope: &CloudSemanticEnvelope<'_>, +) -> Result { + if envelope.record_name.is_empty() || envelope.protected_raw_envelope_reference.is_empty() { + return Err(CloudSemanticDecodeFailure::MalformedRecord); + } + + match envelope.change_kind { + // Server-confirmed delete. The enclosing stream supplies the entity + // class because a CloudKit tombstone may omit its record type. + CloudSemanticChangeKind::Tombstone => { + if envelope + .record_type + .is_some_and(|record_type| record_type != envelope.stream.record_type()) + { + return Err(CloudSemanticDecodeFailure::UnsupportedRecordType); + } + Ok(envelope.stream.entity_kind()) + } + // Upsert must name the exact schema expected for the stream. + CloudSemanticChangeKind::Upsert => match envelope.record_type { + Some(record_type) if record_type == envelope.stream.record_type() => { + Ok(envelope.stream.entity_kind()) + } + Some(_) => Err(CloudSemanticDecodeFailure::UnsupportedRecordType), + None => Err(CloudSemanticDecodeFailure::MalformedRecord), + }, + } +} + +/// Converts Apple's optional numeric change type plus the already-observed +/// payload shape into the closed semantic contract. A missing type is valid: +/// rustpush has historically classified those changes by record presence. +pub fn validated_change_kind( + change_type: Option, + has_record: bool, +) -> Result { + match (change_type, has_record) { + (Some(1) | None, true) => Ok(CloudSemanticChangeKind::Upsert), + (Some(2) | None, false) => Ok(CloudSemanticChangeKind::Tombstone), + _ => Err(CloudSemanticDecodeFailure::MalformedRecord), + } +} + +/// Projects a decrypted chat/message/attachment into durable, content-free +/// metadata. `record` must be the original CloudKit `Record` decoded from the +/// protected raw envelope; it is revalidated before decrypting fields. +pub fn decode_encrypted_upsert( + envelope: &CloudSemanticEnvelope<'_>, + record: &Record, + pcs_encryptor: Option<&PCSEncryptor>, + hasher: &CloudSemanticIdentifierHasher, +) -> Result { + let entity_kind = classify_envelope(envelope)?; + if envelope.change_kind != CloudSemanticChangeKind::Upsert + || !record_matches_envelope(record, envelope) + || !fields_are_well_formed(record) + { + return Err(CloudSemanticDecodeFailure::MalformedRecord); + } + let pcs_encryptor = pcs_encryptor.ok_or(CloudSemanticDecodeFailure::PcsUnavailable)?; + + let logical_identifier = match entity_kind { + CloudSemanticEntityKind::Chat => std::panic::catch_unwind(AssertUnwindSafe(|| { + CloudChat::from_record_encrypted(&record.record_field, Some(pcs_encryptor)).guid + })) + .map_err(|_| CloudSemanticDecodeFailure::MalformedRecord)?, + CloudSemanticEntityKind::Message => std::panic::catch_unwind(AssertUnwindSafe(|| { + CloudMessage::from_record_encrypted(&record.record_field, Some(pcs_encryptor)).guid + })) + .map_err(|_| CloudSemanticDecodeFailure::MalformedRecord)?, + CloudSemanticEntityKind::Attachment => std::panic::catch_unwind(AssertUnwindSafe(|| { + let attachment = + CloudAttachment::from_record_encrypted(&record.record_field, Some(pcs_encryptor)); + attachment.cm.guid.clone() + })) + .map_err(|_| CloudSemanticDecodeFailure::MalformedRecord)?, + }; + + project_logical_identifier(envelope, entity_kind, &logical_identifier, hasher) +} + +/// Adapter for the existing `pcs_keys_for_record` call. A PCS lookup failure +/// stays typed at the semantic boundary instead of becoming a generic decode +/// or local-storage error. +pub fn decode_encrypted_upsert_with_pcs_result( + envelope: &CloudSemanticEnvelope<'_>, + record: &Record, + pcs_encryptor: Result<&PCSEncryptor, &PushError>, + hasher: &CloudSemanticIdentifierHasher, +) -> Result { + let pcs_encryptor = pcs_encryptor.map_err(classify_pcs_failure)?; + decode_encrypted_upsert(envelope, record, Some(pcs_encryptor), hasher) +} + +/// Runs a future adapter's PCS lookup inside the same failure boundary as +/// semantic decoding. The existing rustpush lookup still contains legacy +/// panics for incomplete server metadata; those must remain retryable and must +/// never terminate an FFI caller or be reclassified as discardable corruption. +pub fn decode_encrypted_upsert_with_pcs_lookup( + envelope: &CloudSemanticEnvelope<'_>, + record: &Record, + pcs_lookup: F, + hasher: &CloudSemanticIdentifierHasher, +) -> Result +where + F: FnOnce() -> Result, +{ + let entity_kind = classify_envelope(envelope)?; + if envelope.change_kind != CloudSemanticChangeKind::Upsert + || !record_matches_envelope(record, envelope) + || !fields_are_well_formed(record) + { + return Err(CloudSemanticDecodeFailure::MalformedRecord); + } + + let pcs_encryptor = std::panic::catch_unwind(AssertUnwindSafe(pcs_lookup)) + .map_err(|_| CloudSemanticDecodeFailure::RetryableUpstreamFailure)? + .map_err(|error| classify_pcs_failure(&error))?; + + // Keep the preflight result live so future schema extensions cannot + // accidentally remove the exact stream/entity check above. + debug_assert_eq!(entity_kind, envelope.stream.entity_kind()); + decode_encrypted_upsert(envelope, record, Some(&pcs_encryptor), hasher) +} + +/// Projects already-decoded values for deterministic unit testing and for a +/// future client adapter that has performed PCS lookup. This deliberately does +/// not expose the decoded value in its return type. +pub fn project_chat( + envelope: &CloudSemanticEnvelope<'_>, + chat: &CloudChat, + hasher: &CloudSemanticIdentifierHasher, +) -> Result { + project_known_entity(envelope, CloudSemanticEntityKind::Chat, &chat.guid, hasher) +} + +pub fn project_message( + envelope: &CloudSemanticEnvelope<'_>, + message: &CloudMessage, + hasher: &CloudSemanticIdentifierHasher, +) -> Result { + project_known_entity( + envelope, + CloudSemanticEntityKind::Message, + &message.guid, + hasher, + ) +} + +pub fn project_attachment( + envelope: &CloudSemanticEnvelope<'_>, + attachment: &AttachmentMeta, + hasher: &CloudSemanticIdentifierHasher, +) -> Result { + // AttachmentMeta dates and byte counts are documented by the existing + // schema as potentially negative. They are intentionally not rejected or + // normalized here; attachment identity is the only safe Phase 2 output. + project_known_entity( + envelope, + CloudSemanticEntityKind::Attachment, + &attachment.guid, + hasher, + ) +} + +/// Resolves a server tombstone through the prior server-record mapping. A +/// tombstone never guesses a logical entity from its opaque server record name. +pub fn reverse_tombstone( + envelope: &CloudSemanticEnvelope<'_>, + mappings: &HashMap, + hasher: &CloudSemanticIdentifierHasher, +) -> Result { + let expected_kind = classify_envelope(envelope)?; + if envelope.change_kind != CloudSemanticChangeKind::Tombstone { + return Err(CloudSemanticDecodeFailure::MalformedRecord); + } + // CloudKit tombstones commonly omit the embedded Record, which is where + // rustpush obtains server timestamps. Preserve the absence rather than + // fabricating local wall time or rejecting a valid server deletion. + let deleted_at_millis = timestamp_millis(envelope.server_modified_at)?; + let server_record_id_hash = hasher.server_record_id_hash(envelope.record_name); + let mapping = mappings + .get(&server_record_id_hash) + .ok_or(CloudSemanticDecodeFailure::TombstoneMappingMissing)?; + if mapping.entity_kind != expected_kind + || mapping.server_record_id_hash != server_record_id_hash + { + return Err(CloudSemanticDecodeFailure::MalformedRecord); + } + + Ok(CloudSemanticTombstone { + entity_kind: mapping.entity_kind, + server_record_id_hash, + logical_entity_key_hash: mapping.logical_entity_key_hash.clone(), + protected_raw_envelope_reference: envelope.protected_raw_envelope_reference.to_owned(), + deleted_at_millis, + server_confirmed: true, + }) +} + +/// Converts Rustpush transport errors into the narrow semantic error contract. +/// The original error may contain protocol detail and is never propagated to +/// durable diagnostics by this module. +pub fn classify_pcs_failure(error: &PushError) -> CloudSemanticDecodeFailure { + match error { + PushError::PCSRecordKeyMissing + | PushError::MasterKeyNotFound + | PushError::NotInClique + | PushError::ShareKeyNotFound(_) + | PushError::NoRoutingKey => CloudSemanticDecodeFailure::PcsUnavailable, + _ => CloudSemanticDecodeFailure::RetryableUpstreamFailure, + } +} + +fn project_known_entity( + envelope: &CloudSemanticEnvelope<'_>, + expected_kind: CloudSemanticEntityKind, + logical_identifier: &str, + hasher: &CloudSemanticIdentifierHasher, +) -> Result { + if envelope.change_kind != CloudSemanticChangeKind::Upsert + || classify_envelope(envelope)? != expected_kind + { + return Err(CloudSemanticDecodeFailure::MalformedRecord); + } + project_logical_identifier(envelope, expected_kind, logical_identifier, hasher) +} + +fn project_logical_identifier( + envelope: &CloudSemanticEnvelope<'_>, + entity_kind: CloudSemanticEntityKind, + logical_identifier: &str, + hasher: &CloudSemanticIdentifierHasher, +) -> Result { + if logical_identifier.is_empty() { + return Err(CloudSemanticDecodeFailure::MalformedRecord); + } + Ok(CloudSemanticProjection { + entity_kind, + server_record_id_hash: hasher.server_record_id_hash(envelope.record_name), + logical_entity_key_hash: hasher.logical_entity_key_hash(entity_kind, logical_identifier), + protected_raw_envelope_reference: envelope.protected_raw_envelope_reference.to_owned(), + server_modified_at_millis: timestamp_millis(envelope.server_modified_at)?, + }) +} + +fn record_matches_envelope(record: &Record, envelope: &CloudSemanticEnvelope<'_>) -> bool { + let record_name = record + .record_identifier + .as_ref() + .and_then(|identifier| identifier.value.as_ref()) + .and_then(|identifier| identifier.name.as_deref()) + .filter(|name| !name.is_empty()); + let record_type = record + .r#type + .as_ref() + .and_then(|record_type| record_type.name.as_deref()) + .filter(|record_type| !record_type.is_empty()); + record_name == Some(envelope.record_name) && record_type == envelope.record_type +} + +fn fields_are_well_formed(record: &Record) -> bool { + record.record_field.iter().all(|field| { + field + .identifier + .as_ref() + .and_then(|identifier| identifier.name.as_deref()) + .is_some_and(|name| !name.is_empty()) + }) +} + +fn timestamp_millis(seconds: Option) -> Result, CloudSemanticDecodeFailure> { + let Some(seconds) = seconds else { + return Ok(None); + }; + if !seconds.is_finite() { + return Err(CloudSemanticDecodeFailure::MalformedRecord); + } + let millis = seconds * 1_000.0; + if millis < i64::MIN as f64 || millis > i64::MAX as f64 { + return Err(CloudSemanticDecodeFailure::MalformedRecord); + } + Ok(Some(millis.round() as i64)) +} + +#[cfg(test)] +mod tests { + use super::*; + + const TEST_KEY: &[u8] = b"native-semantic-decoder-fixture-key"; + + fn hasher() -> CloudSemanticIdentifierHasher { + CloudSemanticIdentifierHasher::new(TEST_KEY).expect("fixture hasher") + } + + fn envelope( + stream: CloudSemanticStream, + record_name: &'static str, + record_type: Option<&'static str>, + change_kind: CloudSemanticChangeKind, + modified_at: Option, + ) -> CloudSemanticEnvelope<'static> { + CloudSemanticEnvelope { + stream, + record_name, + record_type, + change_kind, + protected_raw_envelope_reference: "obcs2.protected.fixture", + server_modified_at: modified_at, + } + } + + fn matching_message_record() -> Record { + Record { + record_identifier: Some(rustpush::cloudkit_proto::RecordIdentifier { + value: Some(rustpush::cloudkit_proto::Identifier { + name: Some("server-message".to_owned()), + r#type: Some(rustpush::cloudkit_proto::identifier::Type::Record as i32), + }), + zone_identifier: None, + }), + r#type: Some(rustpush::cloudkit_proto::record::Type { + name: Some("MessageEncryptedV3".to_owned()), + }), + ..Default::default() + } + } + + #[test] + fn mixed_page_classification_is_lossless_and_ordered() { + let page = [ + envelope( + CloudSemanticStream::Chats, + "server-chat", + Some("chatEncryptedv2"), + CloudSemanticChangeKind::Upsert, + None, + ), + envelope( + CloudSemanticStream::Messages, + "server-message", + Some("MessageEncryptedV3"), + CloudSemanticChangeKind::Upsert, + None, + ), + envelope( + CloudSemanticStream::Attachments, + "server-attachment", + Some("attachment"), + CloudSemanticChangeKind::Upsert, + None, + ), + envelope( + CloudSemanticStream::Messages, + "server-delete", + None, + CloudSemanticChangeKind::Tombstone, + Some(2.5), + ), + ]; + + let classified = page + .iter() + .map(classify_envelope) + .collect::, _>>() + .expect("all fixture envelopes classify"); + assert_eq!( + classified, + vec![ + CloudSemanticEntityKind::Chat, + CloudSemanticEntityKind::Message, + CloudSemanticEntityKind::Attachment, + CloudSemanticEntityKind::Message, + ] + ); + } + + #[test] + fn malformed_fields_and_unknown_record_types_fail_closed() { + let malformed = envelope( + CloudSemanticStream::Messages, + "", + Some("MessageEncryptedV3"), + CloudSemanticChangeKind::Upsert, + None, + ); + assert_eq!( + classify_envelope(&malformed), + Err(CloudSemanticDecodeFailure::MalformedRecord) + ); + + let unknown = envelope( + CloudSemanticStream::Messages, + "server-future", + Some("FutureMessageV4"), + CloudSemanticChangeKind::Upsert, + None, + ); + assert_eq!( + classify_envelope(&unknown), + Err(CloudSemanticDecodeFailure::UnsupportedRecordType) + ); + + assert_eq!( + validated_change_kind(Some(7), true), + Err(CloudSemanticDecodeFailure::MalformedRecord) + ); + + let source = envelope( + CloudSemanticStream::Messages, + "server-message", + Some("MessageEncryptedV3"), + CloudSemanticChangeKind::Upsert, + None, + ); + let mut malformed_record = matching_message_record(); + malformed_record + .record_field + .push(rustpush::cloudkit_proto::record::Field { + identifier: None, + value: None, + }); + assert_eq!( + decode_encrypted_upsert(&source, &malformed_record, None, &hasher()), + Err(CloudSemanticDecodeFailure::MalformedRecord) + ); + } + + #[test] + fn omitted_change_type_uses_the_validated_record_shape() { + assert_eq!( + validated_change_kind(None, true), + Ok(CloudSemanticChangeKind::Upsert) + ); + assert_eq!( + validated_change_kind(None, false), + Ok(CloudSemanticChangeKind::Tombstone) + ); + assert_eq!( + validated_change_kind(Some(1), false), + Err(CloudSemanticDecodeFailure::MalformedRecord) + ); + assert_eq!( + validated_change_kind(Some(2), true), + Err(CloudSemanticDecodeFailure::MalformedRecord) + ); + } + + #[test] + fn known_entities_map_server_identity_without_exposing_plaintext() { + let hasher = hasher(); + let chat_source = envelope( + CloudSemanticStream::Chats, + "server-chat", + Some("chatEncryptedv2"), + CloudSemanticChangeKind::Upsert, + None, + ); + let message_source = envelope( + CloudSemanticStream::Messages, + "server-message", + Some("MessageEncryptedV3"), + CloudSemanticChangeKind::Upsert, + None, + ); + let chat = CloudChat { + guid: "chat-logical-id".to_owned(), + ..Default::default() + }; + let message = CloudMessage { + guid: "message-logical-id".to_owned(), + ..Default::default() + }; + + let chat_projection = project_chat(&chat_source, &chat, &hasher).expect("chat projection"); + let message_projection = + project_message(&message_source, &message, &hasher).expect("message projection"); + assert_eq!(chat_projection.entity_kind, CloudSemanticEntityKind::Chat); + assert_eq!( + message_projection.entity_kind, + CloudSemanticEntityKind::Message + ); + assert_ne!(chat_projection.server_record_id_hash, "server-chat"); + assert_ne!( + message_projection.logical_entity_key_hash, + "message-logical-id" + ); + assert_ne!( + chat_projection.logical_entity_key_hash, message_projection.logical_entity_key_hash, + "the entity type is part of the keyed logical identity domain" + ); + } + + #[test] + fn negative_attachment_dates_remain_valid_and_identifiers_are_redacted() { + let source = envelope( + CloudSemanticStream::Attachments, + "server-attachment-id", + Some("attachment"), + CloudSemanticChangeKind::Upsert, + Some(-1.25), + ); + let attachment = AttachmentMeta { + guid: "attachment-logical-id".to_owned(), + start_date: -9_999, + created_date: -4_000, + total_bytes: -1, + ..Default::default() + }; + + let projection = + project_attachment(&source, &attachment, &hasher()).expect("negative dates are valid"); + assert_eq!(projection.server_modified_at_millis, Some(-1_250)); + assert_ne!(projection.server_record_id_hash, "server-attachment-id"); + assert_ne!(projection.logical_entity_key_hash, "attachment-logical-id"); + assert_eq!( + format!("{projection:?}"), + "CloudSemanticProjection(redacted)" + ); + } + + #[test] + fn pcs_blocked_records_return_a_typed_failure() { + let source = envelope( + CloudSemanticStream::Messages, + "server-message", + Some("MessageEncryptedV3"), + CloudSemanticChangeKind::Upsert, + None, + ); + let record = matching_message_record(); + assert_eq!( + decode_encrypted_upsert(&source, &record, None, &hasher()), + Err(CloudSemanticDecodeFailure::PcsUnavailable) + ); + assert_eq!( + classify_pcs_failure(&PushError::PCSRecordKeyMissing), + CloudSemanticDecodeFailure::PcsUnavailable + ); + let pcs_error = PushError::PCSRecordKeyMissing; + assert_eq!( + decode_encrypted_upsert_with_pcs_result(&source, &record, Err(&pcs_error), &hasher()), + Err(CloudSemanticDecodeFailure::PcsUnavailable) + ); + assert_eq!( + classify_pcs_failure(&PushError::NotConnected), + CloudSemanticDecodeFailure::RetryableUpstreamFailure, + "unknown upstream failures must remain retryable, not look like corrupt data" + ); + assert_eq!( + decode_encrypted_upsert_with_pcs_lookup( + &source, + &record, + || -> Result { Err(PushError::NotConnected) }, + &hasher(), + ), + Err(CloudSemanticDecodeFailure::RetryableUpstreamFailure) + ); + assert_eq!( + decode_encrypted_upsert_with_pcs_lookup( + &source, + &record, + || -> Result { panic!("legacy PCS lookup panic fixture") }, + &hasher(), + ), + Err(CloudSemanticDecodeFailure::RetryableUpstreamFailure) + ); + } + + #[test] + fn reverse_tombstone_requires_prior_identity_mapping() { + let source = envelope( + CloudSemanticStream::Messages, + "server-message", + None, + CloudSemanticChangeKind::Tombstone, + Some(-2.0), + ); + let hasher = hasher(); + let server_hash = hasher.server_record_id_hash(source.record_name); + let logical_hash = + hasher.logical_entity_key_hash(CloudSemanticEntityKind::Message, "logical-message"); + let mut mappings = HashMap::new(); + mappings.insert( + server_hash.clone(), + CloudSemanticRecordMapEntry { + entity_kind: CloudSemanticEntityKind::Message, + server_record_id_hash: server_hash.clone(), + logical_entity_key_hash: logical_hash.clone(), + }, + ); + + let tombstone = reverse_tombstone(&source, &mappings, &hasher).expect("mapped tombstone"); + assert_eq!(tombstone.server_record_id_hash, server_hash); + assert_eq!(tombstone.logical_entity_key_hash, logical_hash); + assert_eq!(tombstone.deleted_at_millis, Some(-2_000)); + assert!(tombstone.server_confirmed); + assert_eq!(format!("{tombstone:?}"), "CloudSemanticTombstone(redacted)"); + + assert_eq!( + reverse_tombstone(&source, &HashMap::new(), &hasher), + Err(CloudSemanticDecodeFailure::TombstoneMappingMissing) + ); + + let source_without_server_time = envelope( + CloudSemanticStream::Messages, + "server-message", + None, + CloudSemanticChangeKind::Tombstone, + None, + ); + let tombstone_without_server_time = + reverse_tombstone(&source_without_server_time, &mappings, &hasher) + .expect("mapped tombstone may omit server time"); + assert_eq!(tombstone_without_server_time.deleted_at_millis, None); + } +} diff --git a/rust/src/cloud_sync_semantic_identity.rs b/rust/src/cloud_sync_semantic_identity.rs new file mode 100644 index 0000000000..6415d76f51 --- /dev/null +++ b/rust/src/cloud_sync_semantic_identity.rs @@ -0,0 +1,232 @@ +//! Dependency-light keyed identity hashing for Cloud Sync V2. +//! +//! This module holds the per-install semantic identifier hasher and the two +//! small types it reports through. It deliberately depends only on hashing, +//! encoding, and the canonical DTO validation types so the native protector +//! and its standalone harness can both link it without the Apple record +//! parsing stack. + +use base64::{engine::general_purpose::URL_SAFE_NO_PAD, Engine as _}; +use hmac::{Hmac, Mac}; +use sha2::Sha256; +use thiserror::Error; + +use crate::cloud_sync_canonical_dto::{ + CloudCanonicalAliasKind, CloudCanonicalEntityKind, CloudCanonicalHash, + CloudCanonicalValidationFailure, +}; + +type HmacSha256 = Hmac; + +const RECORD_ID_DOMAIN: &[u8] = b"OpenBubbles Cloud Sync V2 server record identity\0"; +const LOGICAL_ID_DOMAIN: &[u8] = b"OpenBubbles Cloud Sync V2 logical entity identity\0"; + +#[derive(Clone, Copy, Debug, Eq, PartialEq, Hash)] +pub enum CloudSemanticEntityKind { + Chat, + Message, + Attachment, +} + +#[derive(Clone, Copy, Debug, Error, Eq, PartialEq)] +pub enum CloudSemanticDecodeFailure { + #[error("Cloud Sync record type is unsupported")] + UnsupportedRecordType, + #[error("Cloud Sync record metadata is malformed")] + MalformedRecord, + #[error("Cloud Sync PCS material is unavailable")] + PcsUnavailable, + #[error("Cloud Sync upstream operation failed and may be retried")] + RetryableUpstreamFailure, + #[error("Cloud Sync tombstone has no known entity mapping")] + TombstoneMappingMissing, +} + +/// Per-install keyed hashing adapter. The key is held only in the native +/// boundary. Callers must obtain it from protected local storage and must not +/// place it in diagnostics or Dart-visible state. +#[derive(Clone)] +pub struct CloudSemanticIdentifierHasher { + key: Vec, +} + +impl CloudSemanticIdentifierHasher { + pub fn new(key: impl AsRef<[u8]>) -> Result { + let key = key.as_ref(); + if key.is_empty() { + return Err(CloudSemanticDecodeFailure::MalformedRecord); + } + Ok(Self { key: key.to_vec() }) + } + + pub(crate) fn digest(&self, domain: &[u8], value: &str) -> String { + let mut mac = HmacSha256::new_from_slice(&self.key) + .expect("HMAC accepts arbitrary non-empty key lengths"); + mac.update(domain); + mac.update(value.as_bytes()); + URL_SAFE_NO_PAD.encode(mac.finalize().into_bytes()) + } + + pub(crate) fn server_record_id_hash(&self, record_name: &str) -> String { + self.digest(RECORD_ID_DOMAIN, record_name) + } + + pub(crate) fn logical_entity_key_hash( + &self, + entity_kind: CloudSemanticEntityKind, + identifier: &str, + ) -> String { + let kind = match entity_kind { + CloudSemanticEntityKind::Chat => b"chat\0".as_slice(), + CloudSemanticEntityKind::Message => b"message\0".as_slice(), + CloudSemanticEntityKind::Attachment => b"attachment\0".as_slice(), + }; + let mut canonical = Vec::with_capacity(kind.len() + identifier.len()); + canonical.extend_from_slice(kind); + canonical.extend_from_slice(identifier.as_bytes()); + let canonical = + std::str::from_utf8(&canonical).expect("entity kind and logical identifiers are UTF-8"); + self.digest(LOGICAL_ID_DOMAIN, canonical) + } + + pub(crate) fn canonical_server_record_id_hash( + &self, + record_name: &str, + ) -> Result { + CloudCanonicalHash::new(self.server_record_id_hash(record_name)) + } + + pub(crate) fn canonical_entity_key_hash( + &self, + entity_kind: CloudCanonicalEntityKind, + identifier: &str, + ) -> Result { + let kind = match entity_kind { + CloudCanonicalEntityKind::Chat => b"chat\0".as_slice(), + CloudCanonicalEntityKind::Message => b"message\0".as_slice(), + CloudCanonicalEntityKind::Reaction => b"reaction\0".as_slice(), + CloudCanonicalEntityKind::Attachment => b"attachment\0".as_slice(), + CloudCanonicalEntityKind::GroupPhoto => b"group-photo\0".as_slice(), + }; + let mut canonical = Vec::with_capacity(kind.len() + identifier.len()); + canonical.extend_from_slice(kind); + canonical.extend_from_slice(identifier.as_bytes()); + let canonical = + std::str::from_utf8(&canonical).expect("entity kind and logical identifiers are UTF-8"); + CloudCanonicalHash::new(self.digest(LOGICAL_ID_DOMAIN, canonical)) + } + + pub(crate) fn canonical_reaction_key_hash( + &self, + reaction_guid: &str, + parent_guid: &str, + parent_part: Option, + ) -> Result { + let part = parent_part + .map(|value| format!("part:{value}")) + .unwrap_or_else(|| "partless".to_owned()); + self.canonical_entity_key_hash( + CloudCanonicalEntityKind::Reaction, + &format!("{reaction_guid}\0{parent_guid}\0{part}"), + ) + } + + pub(crate) fn canonical_owned_attachment_key_hash( + &self, + owner_message_guid: &str, + owner_part: u32, + ) -> Result { + self.canonical_entity_key_hash( + CloudCanonicalEntityKind::Attachment, + &format!("{owner_message_guid}\0{owner_part}"), + ) + } + + pub(crate) fn canonical_alias_key_hash( + &self, + alias_kind: CloudCanonicalAliasKind, + value: &str, + ) -> Result { + const ALIAS_DOMAIN: &[u8] = b"OpenBubbles Cloud Sync V2 canonical alias identity v1\0"; + let kind = match alias_kind { + CloudCanonicalAliasKind::ChatGroupId => b"group-id\0".as_slice(), + CloudCanonicalAliasKind::ChatOriginalGroupId => b"original-group-id\0".as_slice(), + CloudCanonicalAliasKind::ChatServiceIdentifier => b"service-identifier\0".as_slice(), + CloudCanonicalAliasKind::ChatLegacyGroupIdentifier => { + b"legacy-group-identifier\0".as_slice() + } + }; + let mut canonical = Vec::with_capacity(kind.len() + value.len()); + canonical.extend_from_slice(kind); + canonical.extend_from_slice(value.as_bytes()); + let canonical = + std::str::from_utf8(&canonical).expect("alias kind and identifier are UTF-8"); + CloudCanonicalHash::new(self.digest(ALIAS_DOMAIN, canonical)) + } + + pub(crate) fn canonical_etag_hash( + &self, + etag: &str, + ) -> Result { + const ETAG_DOMAIN: &[u8] = b"OpenBubbles Cloud Sync V2 etag identity v1\0"; + CloudCanonicalHash::new(self.digest(ETAG_DOMAIN, etag)) + } + + pub(crate) fn canonical_change_id_hash( + &self, + canonical_change_material: &str, + ) -> Result { + const CHANGE_DOMAIN: &[u8] = b"OpenBubbles Cloud Sync V2 change identity v1\0"; + CloudCanonicalHash::new(self.digest(CHANGE_DOMAIN, canonical_change_material)) + } +} + +#[cfg(test)] +mod tests { + use super::*; + + #[test] + fn canonical_reaction_identity_distinguishes_partless_from_part_zero() { + let hasher = CloudSemanticIdentifierHasher::new(b"reaction-identity-test").unwrap(); + let partless = hasher + .canonical_reaction_key_hash("reaction-guid", "parent-guid", None) + .unwrap(); + let part_zero = hasher + .canonical_reaction_key_hash("reaction-guid", "parent-guid", Some(0)) + .unwrap(); + let part_one = hasher + .canonical_reaction_key_hash("reaction-guid", "parent-guid", Some(1)) + .unwrap(); + + assert_ne!(partless, part_zero); + assert_ne!(partless, part_one); + assert_ne!(part_zero, part_one); + assert_eq!( + part_zero, + hasher + .canonical_reaction_key_hash("reaction-guid", "parent-guid", Some(0)) + .unwrap() + ); + } + + #[test] + fn owned_attachment_identity_is_stable_for_owner_and_part() { + let hasher = CloudSemanticIdentifierHasher::new(b"attachment-identity-test").unwrap(); + let first = hasher + .canonical_owned_attachment_key_hash("message_guid_with_underscores", 7) + .unwrap(); + + assert_eq!( + first, + hasher + .canonical_owned_attachment_key_hash("message_guid_with_underscores", 7) + .unwrap() + ); + assert_ne!( + first, + hasher + .canonical_owned_attachment_key_hash("message_guid_with_underscores", 8) + .unwrap() + ); + } +} diff --git a/rust/src/cloud_sync_transient_bridge.rs b/rust/src/cloud_sync_transient_bridge.rs new file mode 100644 index 0000000000..2baf0ca5ea --- /dev/null +++ b/rust/src/cloud_sync_transient_bridge.rs @@ -0,0 +1,1607 @@ +//! Default-off D1 Cloud Sync semantic conversion boundary. +//! +//! The D0 journal supplies only protected capabilities and content-free +//! digests. This module validates the complete active account/scope/generation +//! and native-store fence, unprotects one raw record inside Rust, decrypts it, +//! and invokes the canonical converter. Raw Apple identifiers, PCS material, +//! and CloudKit records never cross Flutter Rust Bridge. + +#![allow(dead_code)] + +use std::{ + io::Read, + panic::{catch_unwind, AssertUnwindSafe}, + path::PathBuf, + sync::Arc, +}; + +use flate2::read::GzDecoder; +use prost::Message as _; +use rustpush::{ + cloud_messages::{ + CloudAttachment, CloudChat, CloudMessage, CloudMessagesClient, MESSAGES_SERVICE, + }, + cloudkit::pcs_keys_for_record, + cloudkit_proto::{ + record::Field, retrieve_changes_response::RecordChange, CloudKitEncryptor, CloudKitRecord, + Record, + }, + pcs::PCSEncryptor, + DefaultAnisetteProvider, PushError, +}; +use sha2::{Digest, Sha256}; + +use crate::{ + cloud_sync_canonical_converter::{ + convert_attachment, convert_chat, convert_message, convert_tombstone, + CloudCanonicalConversionContext, CloudCanonicalConversionOutcome, + CloudCanonicalQuarantineReason, CloudRawRecordPresence, + }, + cloud_sync_canonical_dto::{ + CloudCanonicalAliasKind, CloudCanonicalEntityKind, CloudCanonicalHash, + CloudCanonicalMessageAssociation, CloudCanonicalMutation, CloudCanonicalPayload, + CloudCanonicalValidationFailure, + }, + cloud_sync_native_fetch::{ + cloud_sync_unprotect_raw_envelope, CloudNativeFailureCategory, CloudNativeProtectionScope, + CloudNativeRawEnvelope, CloudNativeRawEnvelopeKind, CloudNativeSafeCode, CloudNativeStream, + }, + cloud_sync_protector, + cloud_sync_semantic_identity::CloudSemanticIdentifierHasher, +}; + +const MAX_DECOMPRESSED_FIELD_BYTES: usize = 16 * 1024 * 1024; +const MAX_DECOMPRESSED_RECORD_BYTES: usize = 32 * 1024 * 1024; + +#[derive(Clone, Copy, Debug, Eq, PartialEq)] +pub(crate) enum CloudTransientExpectedChangeKind { + Save, + Delete, + Quarantined, +} + +#[derive(Clone, Copy, Debug, Eq, PartialEq)] +pub(crate) enum CloudTransientBridgeFailure { + InvalidRequest, + ActiveAccountMismatch, + ScopeMismatch, + GenerationMismatch, + StoreIdentityMismatch, + ProtectedReferenceMismatch, + MalformedRecord, + OversizedRecord, + PcsUnavailable, + RetryableUpstream, + DecoderFailure, +} + +pub(crate) enum CloudTransientDecodeOutcome { + Ready(Box), + Deferred(crate::cloud_sync_canonical_converter::CloudCanonicalDeferredReason), + Quarantined(CloudCanonicalQuarantineReason), + Failure(CloudTransientBridgeFailure), +} + +impl std::fmt::Debug for CloudTransientDecodeOutcome { + fn fmt(&self, formatter: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { + match self { + Self::Ready(_) => formatter.write_str("CloudTransientDecodeOutcome::Ready(redacted)"), + Self::Deferred(reason) => formatter + .debug_tuple("CloudTransientDecodeOutcome::Deferred") + .field(reason) + .finish(), + Self::Quarantined(reason) => formatter + .debug_tuple("CloudTransientDecodeOutcome::Quarantined") + .field(reason) + .finish(), + Self::Failure(failure) => formatter + .debug_tuple("CloudTransientDecodeOutcome::Failure") + .field(failure) + .finish(), + } + } +} + +#[derive(Clone)] +pub(crate) struct CloudTransientTombstoneMapping { + entity_kind: CloudCanonicalEntityKind, + logical_entity_key_hash: CloudCanonicalHash, +} + +impl CloudTransientTombstoneMapping { + pub(crate) fn new( + entity_kind: CloudCanonicalEntityKind, + logical_entity_key_hash: String, + ) -> Result { + let logical_entity_key_hash = CloudCanonicalHash::new(logical_entity_key_hash) + .map_err(|_| CloudTransientBridgeFailure::InvalidRequest)?; + Ok(Self { + entity_kind, + logical_entity_key_hash, + }) + } +} + +pub(crate) struct CloudTransientDecodeRequest { + storage_directory: PathBuf, + expected_account_fingerprint: String, + expected_protected_store_identity: String, + container: String, + database: String, + zone: String, + stream_kind: String, + schema_version: u32, + stream: CloudNativeStream, + generation: u64, + expected_change_kind: CloudTransientExpectedChangeKind, + expected_change_id: CloudCanonicalHash, + expected_record_id_hash: CloudCanonicalHash, + expected_etag_hash: Option, + expected_payload_sha256: String, + expected_payload_length: Option, + expected_server_modified_at_millis: Option, + protected_raw_envelope_reference: String, + tombstone_mapping: Option, +} + +impl CloudTransientDecodeRequest { + #[allow(clippy::too_many_arguments)] + pub(crate) fn new( + storage_directory: PathBuf, + expected_account_fingerprint: String, + expected_protected_store_identity: String, + container: String, + database: String, + zone: String, + stream_kind: String, + schema_version: u32, + stream: CloudNativeStream, + generation: u64, + expected_change_kind: CloudTransientExpectedChangeKind, + expected_change_id: String, + expected_record_id_hash: String, + expected_etag_hash: Option, + expected_payload_sha256: String, + expected_payload_length: Option, + expected_server_modified_at_millis: Option, + protected_raw_envelope_reference: String, + tombstone_mapping: Option, + ) -> Result { + if !storage_directory.is_dir() + || !is_digest(&expected_account_fingerprint) + || !is_store_identity(&expected_protected_store_identity) + || container != "com.apple.messages.cloud" + || database != "private" + || zone != stream.zone() + || stream_kind != "messages" + || schema_version != 2 + || generation == 0 + || !is_sha256_hex(&expected_payload_sha256) + || !is_protected_reference(&protected_raw_envelope_reference) + || !semantic_stream_is_supported(stream) + { + return Err(CloudTransientBridgeFailure::InvalidRequest); + } + let expected_change_id = CloudCanonicalHash::new(expected_change_id) + .map_err(|_| CloudTransientBridgeFailure::InvalidRequest)?; + let expected_record_id_hash = CloudCanonicalHash::new(expected_record_id_hash) + .map_err(|_| CloudTransientBridgeFailure::InvalidRequest)?; + let expected_etag_hash = expected_etag_hash + .map(CloudCanonicalHash::new) + .transpose() + .map_err(|_| CloudTransientBridgeFailure::InvalidRequest)?; + let is_delete = expected_change_kind == CloudTransientExpectedChangeKind::Delete; + if is_delete != tombstone_mapping.is_some() { + return Err(CloudTransientBridgeFailure::InvalidRequest); + } + if tombstone_mapping + .as_ref() + .is_some_and(|mapping| !entity_kind_matches_stream(mapping.entity_kind, stream)) + { + return Err(CloudTransientBridgeFailure::InvalidRequest); + } + Ok(Self { + storage_directory, + expected_account_fingerprint, + expected_protected_store_identity, + container, + database, + zone, + stream_kind, + schema_version, + stream, + generation, + expected_change_kind, + expected_change_id, + expected_record_id_hash, + expected_etag_hash, + expected_payload_sha256, + expected_payload_length, + expected_server_modified_at_millis, + protected_raw_envelope_reference, + tombstone_mapping, + }) + } +} + +fn is_digest(value: &str) -> bool { + value.len() == 43 + && value + .bytes() + .all(|byte| byte.is_ascii_alphanumeric() || matches!(byte, b'_' | b'-')) +} + +fn is_store_identity(value: &str) -> bool { + value.strip_prefix("obcs2.store.").is_some_and(is_digest) +} + +fn is_sha256_hex(value: &str) -> bool { + value.len() == 64 + && value + .bytes() + .all(|byte| byte.is_ascii_digit() || matches!(byte, b'a'..=b'f')) +} + +fn is_protected_reference(value: &str) -> bool { + value.strip_prefix("obcs2.ref.").is_some_and(is_digest) +} + +fn semantic_stream_is_supported(stream: CloudNativeStream) -> bool { + matches!( + stream, + CloudNativeStream::Chats | CloudNativeStream::Messages | CloudNativeStream::Attachments + ) +} + +fn entity_kind_matches_stream( + entity_kind: CloudCanonicalEntityKind, + stream: CloudNativeStream, +) -> bool { + matches!( + (stream, entity_kind), + (CloudNativeStream::Chats, CloudCanonicalEntityKind::Chat) + | ( + CloudNativeStream::Messages, + CloudCanonicalEntityKind::Message | CloudCanonicalEntityKind::Reaction + ) + | ( + CloudNativeStream::Attachments, + CloudCanonicalEntityKind::Attachment + ) + ) +} + +fn expected_record_type(stream: CloudNativeStream) -> &'static str { + match stream { + CloudNativeStream::Chats => CloudChat::record_type(), + CloudNativeStream::Messages => CloudMessage::record_type(), + CloudNativeStream::Attachments => CloudAttachment::record_type(), + _ => unreachable!("auxiliary streams are rejected before semantic decode"), + } +} + +fn field_name(field: &Field) -> Option<&str> { + field.identifier.as_ref()?.name.as_deref() +} + +fn record_name(record: &Record) -> Option<&str> { + record + .record_identifier + .as_ref()? + .value + .as_ref()? + .name + .as_deref() +} + +fn record_type(record: &Record) -> Option<&str> { + record.r#type.as_ref()?.name.as_deref() +} + +fn encrypted_field_bytes( + record: &Record, + key: &PCSEncryptor, + name: &str, +) -> Result>, CloudTransientBridgeFailure> { + let Some(value) = record + .record_field + .iter() + .find(|field| field_name(field) == Some(name)) + .and_then(|field| field.value.as_ref()) + else { + return Ok(None); + }; + let Some(ciphertext) = value.bytes_value.as_deref() else { + return Err(CloudTransientBridgeFailure::MalformedRecord); + }; + let decrypted = catch_unwind(AssertUnwindSafe(|| key.decrypt_data(ciphertext, name))) + .map_err(|_| CloudTransientBridgeFailure::DecoderFailure)?; + if decrypted.len() > MAX_DECOMPRESSED_FIELD_BYTES { + return Err(CloudTransientBridgeFailure::OversizedRecord); + } + Ok(Some(decrypted)) +} + +fn bounded_gunzip(value: &[u8]) -> Result, CloudTransientBridgeFailure> { + let mut decoder = GzDecoder::new(value); + let mut output = Vec::new(); + decoder + .by_ref() + .take((MAX_DECOMPRESSED_FIELD_BYTES + 1) as u64) + .read_to_end(&mut output) + .map_err(|_| CloudTransientBridgeFailure::MalformedRecord)?; + if output.len() > MAX_DECOMPRESSED_FIELD_BYTES { + return Err(CloudTransientBridgeFailure::OversizedRecord); + } + Ok(output) +} + +fn preflight_gzip_fields( + record: &Record, + key: &PCSEncryptor, + fields: &[&str], +) -> Result<(), CloudTransientBridgeFailure> { + let mut aggregate = 0usize; + for field in fields { + let Some(compressed) = encrypted_field_bytes(record, key, field)? else { + continue; + }; + let decompressed = bounded_gunzip(&compressed)?; + aggregate = aggregate + .checked_add(decompressed.len()) + .ok_or(CloudTransientBridgeFailure::OversizedRecord)?; + if aggregate > MAX_DECOMPRESSED_RECORD_BYTES { + return Err(CloudTransientBridgeFailure::OversizedRecord); + } + } + Ok(()) +} + +fn typed_record( + record: &Record, + key: &PCSEncryptor, +) -> Result { + catch_unwind(AssertUnwindSafe(|| { + T::from_record_encrypted(&record.record_field, Some(key)) + })) + .map_err(|_| CloudTransientBridgeFailure::DecoderFailure) +} + +fn map_native_failure( + category: CloudNativeFailureCategory, + safe_code: CloudNativeSafeCode, +) -> CloudTransientBridgeFailure { + match safe_code { + CloudNativeSafeCode::CheckpointContextMismatch => { + CloudTransientBridgeFailure::ScopeMismatch + } + CloudNativeSafeCode::OversizedRecord | CloudNativeSafeCode::OversizedPage => { + CloudTransientBridgeFailure::OversizedRecord + } + CloudNativeSafeCode::InvalidCheckpoint | CloudNativeSafeCode::InvalidRequest => { + CloudTransientBridgeFailure::ProtectedReferenceMismatch + } + CloudNativeSafeCode::PcsUnavailable => CloudTransientBridgeFailure::PcsUnavailable, + _ => match category { + CloudNativeFailureCategory::Network + | CloudNativeFailureCategory::Throttled + | CloudNativeFailureCategory::Server => CloudTransientBridgeFailure::RetryableUpstream, + CloudNativeFailureCategory::PcsUnavailable => { + CloudTransientBridgeFailure::PcsUnavailable + } + CloudNativeFailureCategory::Authorization | CloudNativeFailureCategory::Conflict => { + CloudTransientBridgeFailure::ScopeMismatch + } + CloudNativeFailureCategory::MalformedRecord => { + CloudTransientBridgeFailure::MalformedRecord + } + CloudNativeFailureCategory::LocalStorage | CloudNativeFailureCategory::Unknown => { + CloudTransientBridgeFailure::DecoderFailure + } + }, + } +} + +fn map_push_failure(error: &PushError) -> CloudTransientBridgeFailure { + match error { + PushError::PCSRecordKeyMissing + | PushError::ShareKeyNotFound(_) + | PushError::MasterKeyNotFound + | PushError::DecryptionKeyNotFound(_) => CloudTransientBridgeFailure::PcsUnavailable, + PushError::RequestError(_) + | PushError::CloudKitHttpError { .. } + | PushError::CloudKitError(_) + | PushError::ResourceTimeout + | PushError::ResourceGenTimeout + | PushError::TooManyRequests => CloudTransientBridgeFailure::RetryableUpstream, + PushError::DoNotRetry(inner) => map_push_failure(inner), + PushError::BatchError(inner) => map_push_failure(inner), + _ => CloudTransientBridgeFailure::DecoderFailure, + } +} + +fn envelope_change_kind(envelope: &CloudNativeRawEnvelope) -> CloudTransientExpectedChangeKind { + match envelope.kind() { + CloudNativeRawEnvelopeKind::EncryptedUpsert => CloudTransientExpectedChangeKind::Save, + CloudNativeRawEnvelopeKind::Tombstone => CloudTransientExpectedChangeKind::Delete, + CloudNativeRawEnvelopeKind::UnsupportedRecordType + | CloudNativeRawEnvelopeKind::MalformedMetadata => { + CloudTransientExpectedChangeKind::Quarantined + } + } +} + +fn bind_envelope( + request: &CloudTransientDecodeRequest, + envelope: &CloudNativeRawEnvelope, + hasher: &crate::cloud_sync_semantic_decoder::CloudSemanticIdentifierHasher, +) -> Result<(), CloudTransientBridgeFailure> { + if envelope.generation() != request.generation || envelope.stream() != request.stream { + return Err(CloudTransientBridgeFailure::GenerationMismatch); + } + if envelope_change_kind(envelope) != request.expected_change_kind { + return Err(CloudTransientBridgeFailure::ProtectedReferenceMismatch); + } + let record_name = envelope + .record_name() + .filter(|value| !value.is_empty()) + .ok_or(CloudTransientBridgeFailure::MalformedRecord)?; + let record_id_hash = hasher + .canonical_server_record_id_hash(record_name) + .map_err(|_| CloudTransientBridgeFailure::MalformedRecord)?; + let etag_hash = envelope + .etag() + .filter(|value| !value.is_empty()) + .map(|etag| hasher.canonical_etag_hash(etag)) + .transpose() + .map_err(|_| CloudTransientBridgeFailure::MalformedRecord)?; + if record_id_hash != request.expected_record_id_hash + || etag_hash != request.expected_etag_hash + || envelope.raw_digest_hex() != request.expected_payload_sha256 + || request + .expected_payload_length + .is_some_and(|length| envelope.raw_length() != length) + || envelope.server_modified_at_millis() != request.expected_server_modified_at_millis + { + return Err(CloudTransientBridgeFailure::ProtectedReferenceMismatch); + } + let kind_tag = match request.expected_change_kind { + CloudTransientExpectedChangeKind::Save => 1, + CloudTransientExpectedChangeKind::Delete => 2, + CloudTransientExpectedChangeKind::Quarantined => 3, + }; + let material = format!( + "{}\u{1f}{}\u{1f}{}\u{1f}{}\u{1f}{}\u{1f}{}", + request.generation, + record_id_hash.value(), + kind_tag, + envelope.change_type().unwrap_or_default(), + etag_hash + .as_ref() + .map(CloudCanonicalHash::value) + .unwrap_or("none"), + request.expected_payload_sha256, + ); + let change_id = hasher + .canonical_change_id_hash(&material) + .map_err(|_| CloudTransientBridgeFailure::MalformedRecord)?; + if change_id != request.expected_change_id { + return Err(CloudTransientBridgeFailure::ProtectedReferenceMismatch); + } + Ok(()) +} + +fn validate_upsert_record( + envelope: &CloudNativeRawEnvelope, + record: &Record, +) -> Result<(), CloudTransientBridgeFailure> { + if record_name(record) != envelope.record_name() + || record_type(record) != envelope.record_type() + || envelope.record_type() != Some(expected_record_type(envelope.stream())) + || envelope.change_type().is_some_and(|value| value != 1) + { + return Err(CloudTransientBridgeFailure::MalformedRecord); + } + Ok(()) +} + +fn validate_tombstone_record( + envelope: &CloudNativeRawEnvelope, + raw: &[u8], +) -> Result<(), CloudTransientBridgeFailure> { + let change = + RecordChange::decode(raw).map_err(|_| CloudTransientBridgeFailure::MalformedRecord)?; + let name = change + .identifier + .as_ref() + .and_then(|identifier| identifier.value.as_ref()) + .and_then(|identifier| identifier.name.as_deref()); + let record_type = change + .record_type + .as_ref() + .and_then(|record_type| record_type.name.as_deref()); + if name != envelope.record_name() + || record_type != envelope.record_type() + || change.r#type != envelope.change_type() + || change.record.is_some() + || envelope.change_type().is_some_and(|value| value != 2) + { + return Err(CloudTransientBridgeFailure::MalformedRecord); + } + Ok(()) +} + +fn conversion_context<'a>( + request: &'a CloudTransientDecodeRequest, + envelope: &'a CloudNativeRawEnvelope, + hasher: &'a crate::cloud_sync_semantic_decoder::CloudSemanticIdentifierHasher, + scope: &CloudNativeProtectionScope, +) -> Result< + ( + CloudCanonicalConversionContext<'a>, + CloudCanonicalHash, + CloudCanonicalHash, + ), + CloudTransientBridgeFailure, +> { + let scope_fingerprint = CloudCanonicalHash::new(request.expected_account_fingerprint.clone()) + .map_err(|_| CloudTransientBridgeFailure::InvalidRequest)?; + let zone_fingerprint = hasher + .canonical_change_id_hash(&format!("canonical-scope\u{1f}{}", scope.binding())) + .map_err(|_| CloudTransientBridgeFailure::InvalidRequest)?; + let record_name = envelope + .record_name() + .ok_or(CloudTransientBridgeFailure::MalformedRecord)?; + Ok(( + CloudCanonicalConversionContext::new( + hasher, + scope_fingerprint.clone(), + zone_fingerprint.clone(), + request.generation, + request.expected_change_id.clone(), + record_name, + envelope.etag(), + envelope.server_created_at_millis(), + envelope.server_modified_at_millis(), + &request.protected_raw_envelope_reference, + ), + scope_fingerprint, + zone_fingerprint, + )) +} + +fn validate_canonical_identity_bindings( + mutation: &CloudCanonicalMutation, + hasher: &CloudSemanticIdentifierHasher, +) -> Result<(), CloudCanonicalValidationFailure> { + let envelope_hash = mutation.envelope().logical_entity_key_hash(); + let Some(payload) = mutation.payload() else { + return Ok(()); + }; + + let expected_hash = match payload { + CloudCanonicalPayload::Chat(payload) => { + for (kind, value) in [ + (CloudCanonicalAliasKind::ChatGroupId, payload.group_id()), + ( + CloudCanonicalAliasKind::ChatOriginalGroupId, + payload.original_group_id(), + ), + ( + CloudCanonicalAliasKind::ChatServiceIdentifier, + payload.chat_identifier(), + ), + ] { + let expected_alias_hash = hasher.canonical_alias_key_hash(kind, value)?; + if !mutation + .envelope() + .aliases() + .iter() + .any(|alias| alias.kind() == kind && alias.key_hash() == &expected_alias_hash) + { + return Err(CloudCanonicalValidationFailure::InvalidPayload); + } + } + hasher.canonical_entity_key_hash(CloudCanonicalEntityKind::Chat, payload.guid())? + } + CloudCanonicalPayload::Message(payload) => { + let expected_alias_hash = hasher.canonical_alias_key_hash( + CloudCanonicalAliasKind::ChatServiceIdentifier, + payload.chat_identifier(), + )?; + if payload.chat_alias_key_hash() != &expected_alias_hash { + return Err(CloudCanonicalValidationFailure::InvalidPayload); + } + if let Some(reply) = payload.reply() { + let expected_reply_parent = hasher.canonical_entity_key_hash( + CloudCanonicalEntityKind::Message, + reply.parent_guid(), + )?; + if reply.parent_hash() != &expected_reply_parent { + return Err(CloudCanonicalValidationFailure::InvalidPayload); + } + } + + match payload.association() { + CloudCanonicalMessageAssociation::None => hasher + .canonical_entity_key_hash(CloudCanonicalEntityKind::Message, payload.guid())?, + CloudCanonicalMessageAssociation::Sticker(parent) => { + let expected_parent_hash = hasher.canonical_entity_key_hash( + CloudCanonicalEntityKind::Message, + parent.parent_guid(), + )?; + if parent.parent_hash() != &expected_parent_hash { + return Err(CloudCanonicalValidationFailure::InvalidPayload); + } + hasher.canonical_entity_key_hash( + CloudCanonicalEntityKind::Message, + payload.guid(), + )? + } + CloudCanonicalMessageAssociation::ReactionAdd { parent, .. } + | CloudCanonicalMessageAssociation::ReactionRemove { parent, .. } => { + let expected_parent_hash = hasher.canonical_entity_key_hash( + CloudCanonicalEntityKind::Message, + parent.parent_guid(), + )?; + if parent.parent_hash() != &expected_parent_hash { + return Err(CloudCanonicalValidationFailure::InvalidPayload); + } + hasher.canonical_reaction_key_hash( + payload.guid(), + parent.parent_guid(), + parent.parent_part(), + )? + } + } + } + CloudCanonicalPayload::Attachment(payload) => { + match ( + payload.owner_message_guid(), + payload.owner_message_key_hash(), + payload.owner_part(), + ) { + (Some(owner_guid), Some(owner_hash), Some(owner_part)) => { + if payload.canonical_guid() != format!("{owner_guid}_{owner_part}") { + return Err(CloudCanonicalValidationFailure::InvalidPayload); + } + let expected_owner_hash = hasher + .canonical_entity_key_hash(CloudCanonicalEntityKind::Message, owner_guid)?; + if owner_hash != &expected_owner_hash { + return Err(CloudCanonicalValidationFailure::InvalidPayload); + } + hasher.canonical_owned_attachment_key_hash(owner_guid, owner_part)? + } + (None, None, None) => hasher.canonical_entity_key_hash( + CloudCanonicalEntityKind::Attachment, + payload.canonical_guid(), + )?, + _ => return Err(CloudCanonicalValidationFailure::InvalidPayload), + } + } + CloudCanonicalPayload::GroupPhoto(_) => { + return Err(CloudCanonicalValidationFailure::InvalidPayload) + } + }; + + if envelope_hash != &expected_hash { + return Err(CloudCanonicalValidationFailure::InvalidPayload); + } + Ok(()) +} + +fn normalize_conversion( + outcome: CloudCanonicalConversionOutcome, + hasher: &CloudSemanticIdentifierHasher, + scope_fingerprint: &CloudCanonicalHash, + zone_fingerprint: &CloudCanonicalHash, + generation: u64, +) -> CloudTransientDecodeOutcome { + match outcome { + CloudCanonicalConversionOutcome::Ready(mutation) => { + if mutation + .validate_active_context(scope_fingerprint, zone_fingerprint, generation) + .is_err() + { + CloudTransientDecodeOutcome::Failure( + CloudTransientBridgeFailure::GenerationMismatch, + ) + } else if validate_canonical_identity_bindings(&mutation, hasher).is_err() { + CloudTransientDecodeOutcome::Quarantined( + CloudCanonicalQuarantineReason::InvalidCanonicalPayload, + ) + } else { + CloudTransientDecodeOutcome::Ready(mutation) + } + } + CloudCanonicalConversionOutcome::Deferred(reason) => { + CloudTransientDecodeOutcome::Deferred(reason) + } + CloudCanonicalConversionOutcome::Quarantined(reason) => { + CloudTransientDecodeOutcome::Quarantined(reason) + } + } +} + +pub(crate) async fn cloud_sync_decode_transient_record( + cloud_messages_client: &Arc>, + request: CloudTransientDecodeRequest, +) -> CloudTransientDecodeOutcome { + let Some(storage_directory) = request.storage_directory.to_str().map(str::to_owned) else { + return CloudTransientDecodeOutcome::Failure(CloudTransientBridgeFailure::InvalidRequest); + }; + let actual_store_identity = + match cloud_sync_protector::protected_store_identity(storage_directory.clone()) { + Ok(value) => value, + Err(_) => { + return CloudTransientDecodeOutcome::Failure( + CloudTransientBridgeFailure::DecoderFailure, + ) + } + }; + if actual_store_identity != request.expected_protected_store_identity { + return CloudTransientDecodeOutcome::Failure( + CloudTransientBridgeFailure::StoreIdentityMismatch, + ); + } + let raw_account_identifier = cloud_messages_client.native_account_identifier().await; + if raw_account_identifier.is_empty() { + return CloudTransientDecodeOutcome::Failure( + CloudTransientBridgeFailure::ActiveAccountMismatch, + ); + } + let actual_account_fingerprint = match cloud_sync_protector::fingerprint_account( + storage_directory.clone(), + raw_account_identifier, + ) { + Ok(value) => value, + Err(_) => { + return CloudTransientDecodeOutcome::Failure( + CloudTransientBridgeFailure::DecoderFailure, + ) + } + }; + if actual_account_fingerprint != request.expected_account_fingerprint { + return CloudTransientDecodeOutcome::Failure( + CloudTransientBridgeFailure::ActiveAccountMismatch, + ); + } + let scope = match CloudNativeProtectionScope::new(actual_account_fingerprint, request.stream) { + Ok(value) => value, + Err(failure) => { + return CloudTransientDecodeOutcome::Failure(map_native_failure( + failure.category(), + failure.safe_code(), + )) + } + }; + let hasher = match cloud_sync_protector::semantic_identifier_hasher(storage_directory) { + Ok(value) => value, + Err(_) => { + return CloudTransientDecodeOutcome::Failure( + CloudTransientBridgeFailure::DecoderFailure, + ) + } + }; + let envelope = match cloud_sync_unprotect_raw_envelope( + request.storage_directory.clone(), + &scope, + request.stream, + request.generation, + &request.protected_raw_envelope_reference, + ) { + Ok(value) => value, + Err(failure) => { + return CloudTransientDecodeOutcome::Failure(map_native_failure( + failure.category(), + failure.safe_code(), + )) + } + }; + if let Err(failure) = bind_envelope(&request, &envelope, &hasher) { + return CloudTransientDecodeOutcome::Failure(failure); + } + if matches!( + envelope.kind(), + CloudNativeRawEnvelopeKind::UnsupportedRecordType + | CloudNativeRawEnvelopeKind::MalformedMetadata + ) { + return CloudTransientDecodeOutcome::Quarantined( + CloudCanonicalQuarantineReason::MalformedRecord, + ); + } + let Some(raw) = envelope.raw() else { + return CloudTransientDecodeOutcome::Failure(CloudTransientBridgeFailure::OversizedRecord); + }; + let (context, scope_fingerprint, zone_fingerprint) = + match conversion_context(&request, &envelope, &hasher, &scope) { + Ok(value) => value, + Err(failure) => return CloudTransientDecodeOutcome::Failure(failure), + }; + if envelope.kind() == CloudNativeRawEnvelopeKind::Tombstone { + if let Err(failure) = validate_tombstone_record(&envelope, raw) { + return CloudTransientDecodeOutcome::Failure(failure); + } + let Some(mapping) = request.tombstone_mapping.as_ref() else { + return CloudTransientDecodeOutcome::Failure( + CloudTransientBridgeFailure::InvalidRequest, + ); + }; + return normalize_conversion( + convert_tombstone( + &context, + mapping.entity_kind, + mapping.logical_entity_key_hash.clone(), + ), + &hasher, + &scope_fingerprint, + &zone_fingerprint, + request.generation, + ); + } + + let record = match Record::decode(raw).map_err(|_| CloudTransientBridgeFailure::MalformedRecord) + { + Ok(value) => value, + Err(failure) => return CloudTransientDecodeOutcome::Failure(failure), + }; + if let Err(failure) = validate_upsert_record(&envelope, &record) { + return CloudTransientDecodeOutcome::Failure(failure); + } + let mut presence = match CloudRawRecordPresence::extract(&record) { + Ok(value) => value, + Err(_) => { + return CloudTransientDecodeOutcome::Quarantined( + CloudCanonicalQuarantineReason::MalformedRecord, + ) + } + }; + let container = match cloud_messages_client.get_container().await { + Ok(value) => value, + Err(error) => { + return CloudTransientDecodeOutcome::Failure(map_push_failure(&error)); + } + }; + let zone = container.private_zone(request.stream.zone().to_owned()); + let zone_key = match container + .get_zone_encryption_config(&zone, &cloud_messages_client.keychain, &MESSAGES_SERVICE) + .await + { + Ok(value) => value, + Err(error) => { + return CloudTransientDecodeOutcome::Failure(map_push_failure(&error)); + } + }; + let record_key = + match catch_unwind(AssertUnwindSafe(|| pcs_keys_for_record(&record, &zone_key))) { + Ok(Ok(value)) => value, + Ok(Err(error)) => { + return CloudTransientDecodeOutcome::Failure(map_push_failure(&error)); + } + Err(_) => { + return CloudTransientDecodeOutcome::Failure( + CloudTransientBridgeFailure::DecoderFailure, + ) + } + }; + + let converted = match request.stream { + CloudNativeStream::Chats => { + if let Err(failure) = preflight_gzip_fields(&record, &record_key, &["proto001"]) { + return CloudTransientDecodeOutcome::Failure(failure); + } + match encrypted_field_bytes(&record, &record_key, "prop") { + Ok(Some(decrypted)) => { + if presence + .capture_decrypted_plist_dictionary("prop", &decrypted) + .is_err() + { + return CloudTransientDecodeOutcome::Quarantined( + CloudCanonicalQuarantineReason::MalformedRecord, + ); + } + } + Ok(None) => {} + Err(failure) => return CloudTransientDecodeOutcome::Failure(failure), + } + let chat = match typed_record::(&record, &record_key) { + Ok(value) => value, + Err(failure) => return CloudTransientDecodeOutcome::Failure(failure), + }; + convert_chat(&context, &presence, &chat) + } + CloudNativeStream::Messages => { + if let Err(failure) = preflight_gzip_fields( + &record, + &record_key, + &["msgProto", "msgProto2", "msgProto3", "msgProto4"], + ) { + return CloudTransientDecodeOutcome::Failure(failure); + } + let message = match typed_record::(&record, &record_key) { + Ok(value) => value, + Err(failure) => return CloudTransientDecodeOutcome::Failure(failure), + }; + convert_message(&context, &presence, &message) + } + CloudNativeStream::Attachments => { + let decompressed = match encrypted_field_bytes(&record, &record_key, "cm") { + Ok(Some(compressed)) => match bounded_gunzip(&compressed) { + Ok(value) => value, + Err(failure) => return CloudTransientDecodeOutcome::Failure(failure), + }, + Ok(None) => { + return CloudTransientDecodeOutcome::Quarantined( + CloudCanonicalQuarantineReason::MalformedRecord, + ) + } + Err(failure) => return CloudTransientDecodeOutcome::Failure(failure), + }; + if presence + .capture_decrypted_plist_dictionary("cm", &decompressed) + .is_err() + { + return CloudTransientDecodeOutcome::Quarantined( + CloudCanonicalQuarantineReason::MalformedRecord, + ); + } + let attachment = match typed_record::(&record, &record_key) { + Ok(value) => value, + Err(failure) => return CloudTransientDecodeOutcome::Failure(failure), + }; + convert_attachment(&context, &presence, &attachment.cm.0) + } + CloudNativeStream::MessageUpdate + | CloudNativeStream::RecoverableMessageDelete + | CloudNativeStream::ScheduledMessage + | CloudNativeStream::Chat1 => { + return CloudTransientDecodeOutcome::Failure( + CloudTransientBridgeFailure::DecoderFailure, + ); + } + }; + normalize_conversion( + converted, + &hasher, + &scope_fingerprint, + &zone_fingerprint, + request.generation, + ) +} + +#[cfg(test)] +mod tests { + use super::*; + use crate::cloud_sync_canonical_dto::{ + parse_associated_parent, CloudCanonicalAlias, CloudCanonicalAttachmentPayload, + CloudCanonicalChatPayload, CloudCanonicalChatStyle, CloudCanonicalEnvelope, + CloudCanonicalField, CloudCanonicalKnownMessageFlags, CloudCanonicalMessageAssociation, + CloudCanonicalMessagePayload, CloudCanonicalMutationKind, CloudCanonicalParentReference, + CloudCanonicalPayload, CloudCanonicalProtectedReference, CloudCanonicalReactionKind, + CloudCanonicalService, CloudCanonicalSnapshot, CLOUD_CANONICAL_SCHEMA_VERSION, + }; + + fn digest(character: char) -> String { + character.to_string().repeat(43) + } + + fn upsert_mutation( + entity_kind: CloudCanonicalEntityKind, + logical_hash: CloudCanonicalHash, + parent_hash: Option, + payload: CloudCanonicalPayload, + ) -> CloudCanonicalMutation { + let protected_reference = + CloudCanonicalProtectedReference::new("obcs2.test-reference").unwrap(); + let envelope = CloudCanonicalEnvelope::new( + CloudCanonicalHash::new(digest('s')).unwrap(), + CloudCanonicalHash::new(digest('z')).unwrap(), + 7, + CLOUD_CANONICAL_SCHEMA_VERSION, + CloudCanonicalHash::new(digest('c')).unwrap(), + entity_kind, + CloudCanonicalMutationKind::Upsert, + CloudCanonicalHash::new(digest('r')).unwrap(), + logical_hash.clone(), + parent_hash.clone(), + Vec::new(), + None, + None, + None, + protected_reference.clone(), + ) + .unwrap(); + let snapshot = CloudCanonicalSnapshot::new( + entity_kind, + logical_hash, + parent_hash, + None, + None, + None, + None, + Vec::new(), + None, + None, + None, + None, + protected_reference, + ) + .unwrap(); + CloudCanonicalMutation::new(envelope, Some(snapshot), Some(payload), None).unwrap() + } + + fn message_payload( + hasher: &CloudSemanticIdentifierHasher, + guid: &str, + chat_alias_hash: Option, + association: CloudCanonicalMessageAssociation, + ) -> CloudCanonicalPayload { + let chat_alias_hash = chat_alias_hash.unwrap_or_else(|| { + hasher + .canonical_alias_key_hash( + CloudCanonicalAliasKind::ChatServiceIdentifier, + "iMessage;-;+15555550100", + ) + .unwrap() + }); + let is_reaction = association.is_reaction(); + CloudCanonicalPayload::Message(Box::new( + CloudCanonicalMessagePayload::new( + guid.to_owned(), + "iMessage;-;+15555550100".to_owned(), + chat_alias_hash, + "sender@example.invalid".to_owned(), + 1, + 0, + CloudCanonicalService::IMessage, + CloudCanonicalField::Absent, + if is_reaction { + CloudCanonicalField::Absent + } else { + CloudCanonicalField::Value("body".to_owned()) + }, + CloudCanonicalField::Absent, + CloudCanonicalField::Absent, + CloudCanonicalField::Absent, + CloudCanonicalField::Absent, + CloudCanonicalField::Absent, + CloudCanonicalField::Absent, + CloudCanonicalKnownMessageFlags::default(), + association, + None, + CloudCanonicalField::Absent, + CloudCanonicalField::Absent, + CloudCanonicalField::Absent, + ) + .unwrap(), + )) + } + + fn message_mutation( + hasher: &CloudSemanticIdentifierHasher, + logical_hash_override: Option, + chat_alias_hash_override: Option, + ) -> CloudCanonicalMutation { + let payload = message_payload( + hasher, + "message-guid", + chat_alias_hash_override, + CloudCanonicalMessageAssociation::None, + ); + let logical_hash = logical_hash_override.unwrap_or_else(|| { + hasher + .canonical_entity_key_hash(CloudCanonicalEntityKind::Message, "message-guid") + .unwrap() + }); + upsert_mutation( + CloudCanonicalEntityKind::Message, + logical_hash, + None, + payload, + ) + } + + fn reaction_mutation( + hasher: &CloudSemanticIdentifierHasher, + wire_parent: &str, + logical_hash_override: Option, + parent_hash_override: Option, + ) -> CloudCanonicalMutation { + let parsed = parse_associated_parent(wire_parent).unwrap(); + let expected_parent_hash = hasher + .canonical_entity_key_hash(CloudCanonicalEntityKind::Message, parsed.parent_guid()) + .unwrap(); + let parent_hash = parent_hash_override.unwrap_or_else(|| expected_parent_hash.clone()); + let parent = CloudCanonicalParentReference::new( + parsed.parent_guid().to_owned(), + parsed.parent_part(), + parent_hash.clone(), + None, + None, + ) + .unwrap(); + let association = CloudCanonicalMessageAssociation::ReactionAdd { + kind: CloudCanonicalReactionKind::Heart, + parent, + }; + let expected_logical_hash = hasher + .canonical_reaction_key_hash( + "reaction-guid", + parsed.parent_guid(), + parsed.parent_part(), + ) + .unwrap(); + let logical_hash = logical_hash_override.unwrap_or(expected_logical_hash); + let payload = message_payload(hasher, "reaction-guid", None, association); + upsert_mutation( + CloudCanonicalEntityKind::Reaction, + logical_hash, + Some(parent_hash), + payload, + ) + } + + fn attachment_mutation( + hasher: &CloudSemanticIdentifierHasher, + canonical_guid: &str, + owner: Option<(&str, u32)>, + owner_hash_override: Option, + logical_hash_override: Option, + ) -> CloudCanonicalMutation { + let (owner_message_guid, owner_part, expected_logical_hash, expected_owner_hash) = + match owner { + Some((owner_guid, part)) => ( + Some(owner_guid.to_owned()), + Some(part), + hasher + .canonical_owned_attachment_key_hash(owner_guid, part) + .unwrap(), + Some( + hasher + .canonical_entity_key_hash( + CloudCanonicalEntityKind::Message, + owner_guid, + ) + .unwrap(), + ), + ), + None => ( + None, + None, + hasher + .canonical_entity_key_hash( + CloudCanonicalEntityKind::Attachment, + canonical_guid, + ) + .unwrap(), + None, + ), + }; + let owner_hash = owner_hash_override.or(expected_owner_hash); + let payload = CloudCanonicalPayload::Attachment(Box::new( + CloudCanonicalAttachmentPayload::new( + canonical_guid.to_owned(), + owner_message_guid, + owner_hash.clone(), + owner_part, + CloudCanonicalField::Absent, + CloudCanonicalField::Absent, + CloudCanonicalField::Absent, + CloudCanonicalField::Value(0), + CloudCanonicalField::Value(false), + CloudCanonicalField::Absent, + ) + .unwrap(), + )); + upsert_mutation( + CloudCanonicalEntityKind::Attachment, + logical_hash_override.unwrap_or(expected_logical_hash), + owner_hash, + payload, + ) + } + + fn chat_mutation( + hasher: &CloudSemanticIdentifierHasher, + logical_hash: CloudCanonicalHash, + tamper_service_alias: bool, + ) -> CloudCanonicalMutation { + let protected_reference = + CloudCanonicalProtectedReference::new("obcs2.test-reference").unwrap(); + let aliases = [ + (CloudCanonicalAliasKind::ChatGroupId, "group-id"), + ( + CloudCanonicalAliasKind::ChatOriginalGroupId, + "original-group-id", + ), + ( + CloudCanonicalAliasKind::ChatServiceIdentifier, + "iMessage;-;+15555550100", + ), + ] + .into_iter() + .map(|(kind, value)| { + let key_hash = + if tamper_service_alias && kind == CloudCanonicalAliasKind::ChatServiceIdentifier { + CloudCanonicalHash::new(digest('a')).unwrap() + } else { + hasher.canonical_alias_key_hash(kind, value).unwrap() + }; + CloudCanonicalAlias::new(kind, key_hash) + }) + .collect(); + let envelope = CloudCanonicalEnvelope::new( + CloudCanonicalHash::new(digest('s')).unwrap(), + CloudCanonicalHash::new(digest('z')).unwrap(), + 7, + CLOUD_CANONICAL_SCHEMA_VERSION, + CloudCanonicalHash::new(digest('c')).unwrap(), + CloudCanonicalEntityKind::Chat, + CloudCanonicalMutationKind::Upsert, + CloudCanonicalHash::new(digest('r')).unwrap(), + logical_hash.clone(), + None, + aliases, + None, + None, + None, + protected_reference.clone(), + ) + .unwrap(); + let snapshot = CloudCanonicalSnapshot::new( + CloudCanonicalEntityKind::Chat, + logical_hash, + None, + None, + None, + None, + None, + Vec::new(), + None, + None, + None, + None, + protected_reference, + ) + .unwrap(); + let payload = CloudCanonicalChatPayload::new( + "chat-guid".to_owned(), + "iMessage;-;+15555550100".to_owned(), + "group-id".to_owned(), + "original-group-id".to_owned(), + CloudCanonicalService::IMessage, + CloudCanonicalChatStyle::Direct, + vec!["tel:+15555550100".to_owned()], + CloudCanonicalField::Absent, + CloudCanonicalField::Absent, + CloudCanonicalField::Absent, + CloudCanonicalField::Absent, + CloudCanonicalField::Absent, + ) + .unwrap(); + CloudCanonicalMutation::new( + envelope, + Some(snapshot), + Some(CloudCanonicalPayload::Chat(Box::new(payload))), + None, + ) + .unwrap() + } + + #[test] + fn canonical_identity_validator_recomputes_before_dart_handoff() { + let hasher = CloudSemanticIdentifierHasher::new(b"bridge-identity-test").unwrap(); + let valid_hash = hasher + .canonical_entity_key_hash(CloudCanonicalEntityKind::Chat, "chat-guid") + .unwrap(); + assert_eq!( + validate_canonical_identity_bindings( + &chat_mutation(&hasher, valid_hash.clone(), false), + &hasher + ), + Ok(()) + ); + + assert_eq!( + validate_canonical_identity_bindings( + &chat_mutation(&hasher, valid_hash, true), + &hasher + ), + Err(CloudCanonicalValidationFailure::InvalidPayload) + ); + + let tampered_hash = CloudCanonicalHash::new(digest('t')).unwrap(); + assert_eq!( + validate_canonical_identity_bindings( + &chat_mutation(&hasher, tampered_hash, false), + &hasher + ), + Err(CloudCanonicalValidationFailure::InvalidPayload) + ); + } + + #[test] + fn canonical_message_identity_tampering_is_rejected_before_dart_handoff() { + let hasher = CloudSemanticIdentifierHasher::new(b"message-identity-test").unwrap(); + let valid = message_mutation(&hasher, None, None); + assert_eq!( + validate_canonical_identity_bindings(&valid, &hasher), + Ok(()) + ); + + let wrong_logical_hash = CloudCanonicalHash::new(digest('m')).unwrap(); + assert_eq!( + validate_canonical_identity_bindings( + &message_mutation(&hasher, Some(wrong_logical_hash), None), + &hasher, + ), + Err(CloudCanonicalValidationFailure::InvalidPayload) + ); + + let wrong_chat_alias_hash = CloudCanonicalHash::new(digest('a')).unwrap(); + assert_eq!( + validate_canonical_identity_bindings( + &message_mutation(&hasher, None, Some(wrong_chat_alias_hash)), + &hasher, + ), + Err(CloudCanonicalValidationFailure::InvalidPayload) + ); + } + + #[test] + fn canonical_reaction_identity_preserves_parent_part_semantics_and_rejects_tampering() { + let hasher = CloudSemanticIdentifierHasher::new(b"reaction-identity-test").unwrap(); + let partless = reaction_mutation(&hasher, "parent-guid", None, None); + let part_zero = reaction_mutation(&hasher, "p:0/parent-guid", None, None); + let bubble_part_zero = reaction_mutation(&hasher, "bp:0/parent-guid", None, None); + + assert_eq!( + validate_canonical_identity_bindings(&partless, &hasher), + Ok(()) + ); + assert_eq!( + validate_canonical_identity_bindings(&part_zero, &hasher), + Ok(()) + ); + assert_eq!( + validate_canonical_identity_bindings(&bubble_part_zero, &hasher), + Ok(()) + ); + assert_ne!( + hasher + .canonical_reaction_key_hash("reaction-guid", "parent-guid", None) + .unwrap(), + hasher + .canonical_reaction_key_hash("reaction-guid", "parent-guid", Some(0)) + .unwrap() + ); + + let wrong_logical_hash = hasher + .canonical_reaction_key_hash("reaction-guid", "parent-guid", Some(0)) + .unwrap(); + assert_eq!( + validate_canonical_identity_bindings( + &reaction_mutation(&hasher, "parent-guid", Some(wrong_logical_hash), None), + &hasher, + ), + Err(CloudCanonicalValidationFailure::InvalidPayload) + ); + + let wrong_parent_hash = CloudCanonicalHash::new(digest('p')).unwrap(); + assert_eq!( + validate_canonical_identity_bindings( + &reaction_mutation(&hasher, "p:0/parent-guid", None, Some(wrong_parent_hash)), + &hasher, + ), + Err(CloudCanonicalValidationFailure::InvalidPayload) + ); + } + + #[test] + fn canonical_owned_attachment_identity_tampering_is_rejected_before_dart_handoff() { + let hasher = CloudSemanticIdentifierHasher::new(b"owned-attachment-test").unwrap(); + let valid = attachment_mutation( + &hasher, + "message_guid_with_underscores_7", + Some(("message_guid_with_underscores", 7)), + None, + None, + ); + assert_eq!( + validate_canonical_identity_bindings(&valid, &hasher), + Ok(()) + ); + + let wrong_canonical_guid = attachment_mutation( + &hasher, + "wrong-guid", + Some(("message_guid_with_underscores", 7)), + None, + None, + ); + assert_eq!( + validate_canonical_identity_bindings(&wrong_canonical_guid, &hasher), + Err(CloudCanonicalValidationFailure::InvalidPayload) + ); + + let wrong_owner_hash = CloudCanonicalHash::new(digest('o')).unwrap(); + let tampered_owner = attachment_mutation( + &hasher, + "message_guid_with_underscores_7", + Some(("message_guid_with_underscores", 7)), + Some(wrong_owner_hash), + None, + ); + assert_eq!( + validate_canonical_identity_bindings(&tampered_owner, &hasher), + Err(CloudCanonicalValidationFailure::InvalidPayload) + ); + } + + #[test] + fn canonical_bare_attachment_identity_tampering_is_rejected_before_dart_handoff() { + let hasher = CloudSemanticIdentifierHasher::new(b"bare-attachment-test").unwrap(); + let valid = attachment_mutation(&hasher, "bare-attachment-guid", None, None, None); + assert_eq!( + validate_canonical_identity_bindings(&valid, &hasher), + Ok(()) + ); + + let wrong_logical_hash = CloudCanonicalHash::new(digest('b')).unwrap(); + let tampered = attachment_mutation( + &hasher, + "bare-attachment-guid", + None, + None, + Some(wrong_logical_hash), + ); + assert_eq!( + validate_canonical_identity_bindings(&tampered, &hasher), + Err(CloudCanonicalValidationFailure::InvalidPayload) + ); + } + + #[test] + fn request_rejects_cross_scope_and_incomplete_tombstone_mapping() { + let result = CloudTransientDecodeRequest::new( + PathBuf::from("missing"), + digest('a'), + format!("obcs2.store.{}", digest('b')), + "com.apple.messages.cloud".to_owned(), + "private".to_owned(), + "messageManateeZone".to_owned(), + "messages".to_owned(), + 2, + CloudNativeStream::Messages, + 7, + CloudTransientExpectedChangeKind::Delete, + digest('c'), + digest('d'), + None, + "e".repeat(64), + Some(1), + None, + format!("obcs2.ref.{}", digest('f')), + None, + ); + assert_eq!( + result.err(), + Some(CloudTransientBridgeFailure::InvalidRequest) + ); + } + + #[test] + fn request_rejects_scope_zone_and_reference_confusion() { + let directory = tempfile::tempdir().expect("temporary directory"); + let result = CloudTransientDecodeRequest::new( + directory.path().to_path_buf(), + digest('a'), + format!("obcs2.store.{}", digest('b')), + "com.apple.messages.cloud".to_owned(), + "private".to_owned(), + "chatManateeZone".to_owned(), + "messages".to_owned(), + 2, + CloudNativeStream::Messages, + 7, + CloudTransientExpectedChangeKind::Save, + digest('c'), + digest('d'), + None, + "e".repeat(64), + Some(1), + None, + format!("obcs2.ref.{}", digest('f')), + None, + ); + assert_eq!( + result.err(), + Some(CloudTransientBridgeFailure::InvalidRequest) + ); + } + + #[test] + fn request_rejects_auxiliary_streams_before_semantic_decode() { + let directory = tempfile::tempdir().expect("temporary directory"); + for stream in [ + CloudNativeStream::MessageUpdate, + CloudNativeStream::RecoverableMessageDelete, + CloudNativeStream::ScheduledMessage, + CloudNativeStream::Chat1, + ] { + let result = CloudTransientDecodeRequest::new( + directory.path().to_path_buf(), + digest('a'), + format!("obcs2.store.{}", digest('b')), + "com.apple.messages.cloud".to_owned(), + "private".to_owned(), + stream.zone().to_owned(), + "messages".to_owned(), + 2, + stream, + 7, + CloudTransientExpectedChangeKind::Save, + digest('c'), + digest('d'), + None, + "e".repeat(64), + Some(1), + None, + format!("obcs2.ref.{}", digest('f')), + None, + ); + assert_eq!( + result.err(), + Some(CloudTransientBridgeFailure::InvalidRequest) + ); + } + } + + #[test] + fn bounded_gzip_rejects_malformed_input_without_panicking() { + assert_eq!( + bounded_gunzip(b"not-gzip").unwrap_err(), + CloudTransientBridgeFailure::MalformedRecord + ); + } + + #[test] + fn debug_output_never_contains_content() { + let secret = "private-message-content"; + let output = format!( + "{:?}", + CloudTransientDecodeOutcome::Failure(CloudTransientBridgeFailure::DecoderFailure) + ); + assert!(!output.contains(secret)); + assert!(!format!("{:?}", CloudTransientBridgeFailure::DecoderFailure).contains(secret)); + } + + #[test] + fn protected_reference_and_digest_grammars_are_closed() { + assert!(is_digest(&digest('a'))); + assert!(is_store_identity(&format!("obcs2.store.{}", digest('b')))); + assert!(is_protected_reference(&format!( + "obcs2.ref.{}", + digest('c') + ))); + assert!(is_sha256_hex(&"d".repeat(64))); + assert!(!is_protected_reference("obcs2.ref.apple-record-name")); + assert!(!is_sha256_hex(&"G".repeat(64))); + } + + #[test] + fn tombstone_entity_kind_is_stream_fenced() { + assert!(entity_kind_matches_stream( + CloudCanonicalEntityKind::Reaction, + CloudNativeStream::Messages + )); + assert!(!entity_kind_matches_stream( + CloudCanonicalEntityKind::Chat, + CloudNativeStream::Messages + )); + assert!(!entity_kind_matches_stream( + CloudCanonicalEntityKind::GroupPhoto, + CloudNativeStream::Chats + )); + } +} diff --git a/rust/src/frb_generated.rs b/rust/src/frb_generated.rs index 75c56b8197..9984632cb9 100644 --- a/rust/src/frb_generated.rs +++ b/rust/src/frb_generated.rs @@ -39,7 +39,7 @@ flutter_rust_bridge::frb_generated_boilerplate!( default_rust_auto_opaque = RustAutoOpaqueMoi, ); pub(crate) const FLUTTER_RUST_BRIDGE_CODEGEN_VERSION: &str = "2.3.0"; -pub(crate) const FLUTTER_RUST_BRIDGE_CODEGEN_CONTENT_HASH: i32 = -1267927268; +pub(crate) const FLUTTER_RUST_BRIDGE_CODEGEN_CONTENT_HASH: i32 = -2124671630; // Section: executor @@ -2608,17 +2608,16 @@ fn wire__crate__api__api__close_syncmanager_impl( }, ) } -fn wire__crate__api__api__complete_msg_impl( - port_: flutter_rust_bridge::for_generated::MessagePort, +fn wire__crate__api__api__cloud_sync_acknowledge_committed_page_lease_impl( ptr_: flutter_rust_bridge::for_generated::PlatformGeneralizedUint8ListPtr, rust_vec_len_: i32, data_len_: i32, -) { - FLUTTER_RUST_BRIDGE_HANDLER.wrap_async::( +) -> flutter_rust_bridge::for_generated::WireSyncRust2DartSse { + FLUTTER_RUST_BRIDGE_HANDLER.wrap_sync::( flutter_rust_bridge::for_generated::TaskInfo { - debug_name: "complete_msg", - port: Some(port_), - mode: flutter_rust_bridge::for_generated::FfiCallMode::Normal, + debug_name: "cloud_sync_acknowledge_committed_page_lease", + port: None, + mode: flutter_rust_bridge::for_generated::FfiCallMode::Sync, }, move || { let message = unsafe { @@ -2630,31 +2629,30 @@ fn wire__crate__api__api__complete_msg_impl( }; let mut deserializer = flutter_rust_bridge::for_generated::SseDeserializer::new(message); - let api_ptr = ::sse_decode(&mut deserializer); + let api_storage_directory = ::sse_decode(&mut deserializer); + let api_page_lease_reference = ::sse_decode(&mut deserializer); deserializer.end(); - move |context| async move { - transform_result_sse::<_, ()>( - (move || async move { - let output_ok = Result::<_, ()>::Ok({ - crate::api::api::complete_msg(api_ptr).await; - })?; - Ok(output_ok) - })() - .await, - ) - } + transform_result_sse::<_, ()>((move || { + let output_ok = Result::<_, ()>::Ok( + crate::api::api::cloud_sync_acknowledge_committed_page_lease( + api_storage_directory, + api_page_lease_reference, + ), + )?; + Ok(output_ok) + })()) }, ) } -fn wire__crate__api__api__config_from_encoded_impl( +fn wire__crate__api__api__cloud_sync_capture_auth_snapshot_impl( port_: flutter_rust_bridge::for_generated::MessagePort, ptr_: flutter_rust_bridge::for_generated::PlatformGeneralizedUint8ListPtr, rust_vec_len_: i32, data_len_: i32, ) { - FLUTTER_RUST_BRIDGE_HANDLER.wrap_normal::( + FLUTTER_RUST_BRIDGE_HANDLER.wrap_async::( flutter_rust_bridge::for_generated::TaskInfo { - debug_name: "config_from_encoded", + debug_name: "cloud_sync_capture_auth_snapshot", port: Some(port_), mode: flutter_rust_bridge::for_generated::FfiCallMode::Normal, }, @@ -2668,30 +2666,60 @@ fn wire__crate__api__api__config_from_encoded_impl( }; let mut deserializer = flutter_rust_bridge::for_generated::SseDeserializer::new(message); - let api_encoded = >::sse_decode(&mut deserializer); + let api_cloud_messages_client = >, + >, + >>::sse_decode(&mut deserializer); + let api_storage_directory = ::sse_decode(&mut deserializer); deserializer.end(); - move |context| { + move |context| async move { transform_result_sse::<_, flutter_rust_bridge::for_generated::anyhow::Error>( - (move || { - let output_ok = crate::api::api::config_from_encoded(api_encoded)?; + (move || async move { + let mut api_cloud_messages_client_guard = None; + let decode_indices_ = + flutter_rust_bridge::for_generated::lockable_compute_decode_order( + vec![flutter_rust_bridge::for_generated::LockableOrderInfo::new( + &api_cloud_messages_client, + 0, + false, + )], + ); + for i in decode_indices_ { + match i { + 0 => { + api_cloud_messages_client_guard = Some( + api_cloud_messages_client.lockable_decode_async_ref().await, + ) + } + _ => unreachable!(), + } + } + let api_cloud_messages_client_guard = + api_cloud_messages_client_guard.unwrap(); + let output_ok = crate::api::api::cloud_sync_capture_auth_snapshot( + &*api_cloud_messages_client_guard, + api_storage_directory, + ) + .await?; Ok(output_ok) - })(), + })() + .await, ) } }, ) } -fn wire__crate__api__api__config_from_relay_impl( - port_: flutter_rust_bridge::for_generated::MessagePort, +fn wire__crate__api__api__cloud_sync_collect_protected_garbage_impl( ptr_: flutter_rust_bridge::for_generated::PlatformGeneralizedUint8ListPtr, rust_vec_len_: i32, data_len_: i32, -) { - FLUTTER_RUST_BRIDGE_HANDLER.wrap_async::( +) -> flutter_rust_bridge::for_generated::WireSyncRust2DartSse { + FLUTTER_RUST_BRIDGE_HANDLER.wrap_sync::( flutter_rust_bridge::for_generated::TaskInfo { - debug_name: "config_from_relay", - port: Some(port_), - mode: flutter_rust_bridge::for_generated::FfiCallMode::Normal, + debug_name: "cloud_sync_collect_protected_garbage", + port: None, + mode: flutter_rust_bridge::for_generated::FfiCallMode::Sync, }, move || { let message = unsafe { @@ -2703,35 +2731,32 @@ fn wire__crate__api__api__config_from_relay_impl( }; let mut deserializer = flutter_rust_bridge::for_generated::SseDeserializer::new(message); - let api_code = ::sse_decode(&mut deserializer); - let api_host = ::sse_decode(&mut deserializer); - let api_token = >::sse_decode(&mut deserializer); + let api_storage_directory = ::sse_decode(&mut deserializer); + let api_live_references = >::sse_decode(&mut deserializer); + let api_live_reference_enumeration_complete = ::sse_decode(&mut deserializer); deserializer.end(); - move |context| async move { - transform_result_sse::<_, flutter_rust_bridge::for_generated::anyhow::Error>( - (move || async move { - let output_ok = - crate::api::api::config_from_relay(api_code, api_host, &api_token) - .await?; - Ok(output_ok) - })() - .await, - ) - } + transform_result_sse::<_, ()>((move || { + let output_ok = + Result::<_, ()>::Ok(crate::api::api::cloud_sync_collect_protected_garbage( + api_storage_directory, + api_live_references, + api_live_reference_enumeration_complete, + ))?; + Ok(output_ok) + })()) }, ) } -fn wire__crate__api__api__config_from_validation_data_impl( - port_: flutter_rust_bridge::for_generated::MessagePort, +fn wire__crate__api__api__cloud_sync_commit_protected_page_lease_impl( ptr_: flutter_rust_bridge::for_generated::PlatformGeneralizedUint8ListPtr, rust_vec_len_: i32, data_len_: i32, -) { - FLUTTER_RUST_BRIDGE_HANDLER.wrap_normal::( +) -> flutter_rust_bridge::for_generated::WireSyncRust2DartSse { + FLUTTER_RUST_BRIDGE_HANDLER.wrap_sync::( flutter_rust_bridge::for_generated::TaskInfo { - debug_name: "config_from_validation_data", - port: Some(port_), - mode: flutter_rust_bridge::for_generated::FfiCallMode::Normal, + debug_name: "cloud_sync_commit_protected_page_lease", + port: None, + mode: flutter_rust_bridge::for_generated::FfiCallMode::Sync, }, move || { let message = unsafe { @@ -2743,22 +2768,23 @@ fn wire__crate__api__api__config_from_validation_data_impl( }; let mut deserializer = flutter_rust_bridge::for_generated::SseDeserializer::new(message); - let api_data = >::sse_decode(&mut deserializer); - let api_extra = ::sse_decode(&mut deserializer); + let api_storage_directory = ::sse_decode(&mut deserializer); + let api_page_lease_reference = ::sse_decode(&mut deserializer); + let api_retained_references = >::sse_decode(&mut deserializer); deserializer.end(); - move |context| { - transform_result_sse::<_, flutter_rust_bridge::for_generated::anyhow::Error>( - (move || { - let output_ok = - crate::api::api::config_from_validation_data(api_data, api_extra)?; - Ok(output_ok) - })(), - ) - } + transform_result_sse::<_, ()>((move || { + let output_ok = + Result::<_, ()>::Ok(crate::api::api::cloud_sync_commit_protected_page_lease( + api_storage_directory, + api_page_lease_reference, + api_retained_references, + ))?; + Ok(output_ok) + })()) }, ) } -fn wire__crate__api__api__configure_app_review_impl( +fn wire__crate__api__api__cloud_sync_consume_prepared_message_create_impl( port_: flutter_rust_bridge::for_generated::MessagePort, ptr_: flutter_rust_bridge::for_generated::PlatformGeneralizedUint8ListPtr, rust_vec_len_: i32, @@ -2766,7 +2792,7 @@ fn wire__crate__api__api__configure_app_review_impl( ) { FLUTTER_RUST_BRIDGE_HANDLER.wrap_async::( flutter_rust_bridge::for_generated::TaskInfo { - debug_name: "configure_app_review", + debug_name: "cloud_sync_consume_prepared_message_create", port: Some(port_), mode: flutter_rust_bridge::for_generated::FfiCallMode::Normal, }, @@ -2780,12 +2806,40 @@ fn wire__crate__api__api__configure_app_review_impl( }; let mut deserializer = flutter_rust_bridge::for_generated::SseDeserializer::new(message); - let api_path = ::sse_decode(&mut deserializer); + let api_handle = , + >>::sse_decode(&mut deserializer); deserializer.end(); move |context| async move { - transform_result_sse::<_, flutter_rust_bridge::for_generated::anyhow::Error>( + transform_result_sse::<_, ()>( (move || async move { - let output_ok = crate::api::api::configure_app_review(api_path).await?; + let mut api_handle_guard = None; + let decode_indices_ = + flutter_rust_bridge::for_generated::lockable_compute_decode_order( + vec![flutter_rust_bridge::for_generated::LockableOrderInfo::new( + &api_handle, + 0, + false, + )], + ); + for i in decode_indices_ { + match i { + 0 => { + api_handle_guard = + Some(api_handle.lockable_decode_async_ref().await) + } + _ => unreachable!(), + } + } + let api_handle_guard = api_handle_guard.unwrap(); + let output_ok = Result::<_, ()>::Ok( + crate::api::api::cloud_sync_consume_prepared_message_create( + &*api_handle_guard, + ) + .await, + )?; Ok(output_ok) })() .await, @@ -2794,7 +2848,7 @@ fn wire__crate__api__api__configure_app_review_impl( }, ) } -fn wire__crate__api__api__convert_token_to_uuid_impl( +fn wire__crate__api__api__cloud_sync_decode_protected_change_impl( port_: flutter_rust_bridge::for_generated::MessagePort, ptr_: flutter_rust_bridge::for_generated::PlatformGeneralizedUint8ListPtr, rust_vec_len_: i32, @@ -2802,7 +2856,7 @@ fn wire__crate__api__api__convert_token_to_uuid_impl( ) { FLUTTER_RUST_BRIDGE_HANDLER.wrap_async::( flutter_rust_bridge::for_generated::TaskInfo { - debug_name: "convert_token_to_uuid", + debug_name: "cloud_sync_decode_protected_change", port: Some(port_), mode: flutter_rust_bridge::for_generated::FfiCallMode::Normal, }, @@ -2816,38 +2870,88 @@ fn wire__crate__api__api__convert_token_to_uuid_impl( }; let mut deserializer = flutter_rust_bridge::for_generated::SseDeserializer::new(message); - let api_state = >, + let api_cloud_messages_client = >, + >, >>::sse_decode(&mut deserializer); - let api_handle = ::sse_decode(&mut deserializer); - let api_token = >::sse_decode(&mut deserializer); + let api_storage_directory = ::sse_decode(&mut deserializer); + let api_expected_account_fingerprint = ::sse_decode(&mut deserializer); + let api_expected_protected_store_identity = ::sse_decode(&mut deserializer); + let api_container = ::sse_decode(&mut deserializer); + let api_database = ::sse_decode(&mut deserializer); + let api_zone = ::sse_decode(&mut deserializer); + let api_stream_kind = ::sse_decode(&mut deserializer); + let api_schema_version = ::sse_decode(&mut deserializer); + let api_native_stream = ::sse_decode(&mut deserializer); + let api_generation = ::sse_decode(&mut deserializer); + let api_expected_change_kind = + ::sse_decode(&mut deserializer); + let api_expected_change_id = ::sse_decode(&mut deserializer); + let api_expected_record_id_hash = ::sse_decode(&mut deserializer); + let api_expected_etag_hash = >::sse_decode(&mut deserializer); + let api_expected_payload_sha256 = ::sse_decode(&mut deserializer); + let api_expected_payload_length = >::sse_decode(&mut deserializer); + let api_expected_server_modified_at_millis = + >::sse_decode(&mut deserializer); + let api_protected_raw_envelope_reference = ::sse_decode(&mut deserializer); + let api_tombstone_entity_kind = + >::sse_decode( + &mut deserializer, + ); + let api_tombstone_logical_entity_key_hash = + >::sse_decode(&mut deserializer); deserializer.end(); move |context| async move { - transform_result_sse::<_, flutter_rust_bridge::for_generated::anyhow::Error>( + transform_result_sse::<_, ()>( (move || async move { - let mut api_state_guard = None; + let mut api_cloud_messages_client_guard = None; let decode_indices_ = flutter_rust_bridge::for_generated::lockable_compute_decode_order( vec![flutter_rust_bridge::for_generated::LockableOrderInfo::new( - &api_state, 0, false, + &api_cloud_messages_client, + 0, + false, )], ); for i in decode_indices_ { match i { 0 => { - api_state_guard = - Some(api_state.lockable_decode_async_ref().await) + api_cloud_messages_client_guard = Some( + api_cloud_messages_client.lockable_decode_async_ref().await, + ) } _ => unreachable!(), } } - let api_state_guard = api_state_guard.unwrap(); - let output_ok = crate::api::api::convert_token_to_uuid( - &*api_state_guard, - api_handle, - api_token, - ) - .await?; + let api_cloud_messages_client_guard = + api_cloud_messages_client_guard.unwrap(); + let output_ok = Result::<_, ()>::Ok( + crate::api::api::cloud_sync_decode_protected_change( + &*api_cloud_messages_client_guard, + api_storage_directory, + api_expected_account_fingerprint, + api_expected_protected_store_identity, + api_container, + api_database, + api_zone, + api_stream_kind, + api_schema_version, + api_native_stream, + api_generation, + api_expected_change_kind, + api_expected_change_id, + api_expected_record_id_hash, + api_expected_etag_hash, + api_expected_payload_sha256, + api_expected_payload_length, + api_expected_server_modified_at_millis, + api_protected_raw_envelope_reference, + api_tombstone_entity_kind, + api_tombstone_logical_entity_key_hash, + ) + .await, + )?; Ok(output_ok) })() .await, @@ -2856,7 +2960,7 @@ fn wire__crate__api__api__convert_token_to_uuid_impl( }, ) } -fn wire__crate__api__api__count_records_impl( +fn wire__crate__api__api__cloud_sync_fetch_protected_page_impl( port_: flutter_rust_bridge::for_generated::MessagePort, ptr_: flutter_rust_bridge::for_generated::PlatformGeneralizedUint8ListPtr, rust_vec_len_: i32, @@ -2864,7 +2968,7 @@ fn wire__crate__api__api__count_records_impl( ) { FLUTTER_RUST_BRIDGE_HANDLER.wrap_async::( flutter_rust_bridge::for_generated::TaskInfo { - debug_name: "count_records", + debug_name: "cloud_sync_fetch_protected_page", port: Some(port_), mode: flutter_rust_bridge::for_generated::FfiCallMode::Normal, }, @@ -2883,9 +2987,15 @@ fn wire__crate__api__api__count_records_impl( Arc>, >, >>::sse_decode(&mut deserializer); + let api_storage_directory = ::sse_decode(&mut deserializer); + let api_expected_account_fingerprint = ::sse_decode(&mut deserializer); + let api_stream = ::sse_decode(&mut deserializer); + let api_generation = ::sse_decode(&mut deserializer); + let api_previous_checkpoint_reference = >::sse_decode(&mut deserializer); + let api_maximum_changes = ::sse_decode(&mut deserializer); deserializer.end(); move |context| async move { - transform_result_sse::<_, flutter_rust_bridge::for_generated::anyhow::Error>( + transform_result_sse::<_, ()>( (move || async move { let mut api_cloud_messages_client_guard = None; let decode_indices_ = @@ -2908,9 +3018,18 @@ fn wire__crate__api__api__count_records_impl( } let api_cloud_messages_client_guard = api_cloud_messages_client_guard.unwrap(); - let output_ok = - crate::api::api::count_records(&*api_cloud_messages_client_guard) - .await?; + let output_ok = Result::<_, ()>::Ok( + crate::api::api::cloud_sync_fetch_protected_page( + &*api_cloud_messages_client_guard, + api_storage_directory, + api_expected_account_fingerprint, + api_stream, + api_generation, + api_previous_checkpoint_reference, + api_maximum_changes, + ) + .await, + )?; Ok(output_ok) })() .await, @@ -2919,7 +3038,7 @@ fn wire__crate__api__api__count_records_impl( }, ) } -fn wire__crate__api__api__create_facetime_impl( +fn wire__crate__api__api__cloud_sync_fetch_raw_page_impl( port_: flutter_rust_bridge::for_generated::MessagePort, ptr_: flutter_rust_bridge::for_generated::PlatformGeneralizedUint8ListPtr, rust_vec_len_: i32, @@ -2927,7 +3046,7 @@ fn wire__crate__api__api__create_facetime_impl( ) { FLUTTER_RUST_BRIDGE_HANDLER.wrap_async::( flutter_rust_bridge::for_generated::TaskInfo { - debug_name: "create_facetime", + debug_name: "cloud_sync_fetch_raw_page", port: Some(port_), mode: flutter_rust_bridge::for_generated::FfiCallMode::Normal, }, @@ -2941,21 +3060,23 @@ fn wire__crate__api__api__create_facetime_impl( }; let mut deserializer = flutter_rust_bridge::for_generated::SseDeserializer::new(message); - let api_facetime = >, + let api_cloud_messages_client = >, + >, >>::sse_decode(&mut deserializer); - let api_uuid = ::sse_decode(&mut deserializer); - let api_handle = ::sse_decode(&mut deserializer); - let api_participants = >::sse_decode(&mut deserializer); + let api_stream = ::sse_decode(&mut deserializer); + let api_continuation_token = >>::sse_decode(&mut deserializer); + let api_max_changes = ::sse_decode(&mut deserializer); deserializer.end(); move |context| async move { - transform_result_sse::<_, flutter_rust_bridge::for_generated::anyhow::Error>( + transform_result_sse::<_, ()>( (move || async move { - let mut api_facetime_guard = None; + let mut api_cloud_messages_client_guard = None; let decode_indices_ = flutter_rust_bridge::for_generated::lockable_compute_decode_order( vec![flutter_rust_bridge::for_generated::LockableOrderInfo::new( - &api_facetime, + &api_cloud_messages_client, 0, false, )], @@ -2963,20 +3084,24 @@ fn wire__crate__api__api__create_facetime_impl( for i in decode_indices_ { match i { 0 => { - api_facetime_guard = - Some(api_facetime.lockable_decode_async_ref().await) + api_cloud_messages_client_guard = Some( + api_cloud_messages_client.lockable_decode_async_ref().await, + ) } _ => unreachable!(), } } - let api_facetime_guard = api_facetime_guard.unwrap(); - let output_ok = crate::api::api::create_facetime( - &*api_facetime_guard, - api_uuid, - api_handle, - api_participants, - ) - .await?; + let api_cloud_messages_client_guard = + api_cloud_messages_client_guard.unwrap(); + let output_ok = Result::<_, ()>::Ok( + crate::api::api::cloud_sync_fetch_raw_page( + &*api_cloud_messages_client_guard, + api_stream, + api_continuation_token, + api_max_changes, + ) + .await, + )?; Ok(output_ok) })() .await, @@ -2985,7 +3110,43 @@ fn wire__crate__api__api__create_facetime_impl( }, ) } -fn wire__crate__api__api__create_group_impl( +fn wire__crate__api__api__cloud_sync_fingerprint_account_impl( + ptr_: flutter_rust_bridge::for_generated::PlatformGeneralizedUint8ListPtr, + rust_vec_len_: i32, + data_len_: i32, +) -> flutter_rust_bridge::for_generated::WireSyncRust2DartSse { + FLUTTER_RUST_BRIDGE_HANDLER.wrap_sync::( + flutter_rust_bridge::for_generated::TaskInfo { + debug_name: "cloud_sync_fingerprint_account", + port: None, + mode: flutter_rust_bridge::for_generated::FfiCallMode::Sync, + }, + move || { + let message = unsafe { + flutter_rust_bridge::for_generated::Dart2RustMessageSse::from_wire( + ptr_, + rust_vec_len_, + data_len_, + ) + }; + let mut deserializer = + flutter_rust_bridge::for_generated::SseDeserializer::new(message); + let api_storage_directory = ::sse_decode(&mut deserializer); + let api_raw_account_identifier = ::sse_decode(&mut deserializer); + deserializer.end(); + transform_result_sse::<_, flutter_rust_bridge::for_generated::anyhow::Error>( + (move || { + let output_ok = crate::api::api::cloud_sync_fingerprint_account( + api_storage_directory, + api_raw_account_identifier, + )?; + Ok(output_ok) + })(), + ) + }, + ) +} +fn wire__crate__api__api__cloud_sync_prepare_message_create_impl( port_: flutter_rust_bridge::for_generated::MessagePort, ptr_: flutter_rust_bridge::for_generated::PlatformGeneralizedUint8ListPtr, rust_vec_len_: i32, @@ -2993,7 +3154,7 @@ fn wire__crate__api__api__create_group_impl( ) { FLUTTER_RUST_BRIDGE_HANDLER.wrap_async::( flutter_rust_bridge::for_generated::TaskInfo { - debug_name: "create_group", + debug_name: "cloud_sync_prepare_message_create", port: Some(port_), mode: flutter_rust_bridge::for_generated::FfiCallMode::Normal, }, @@ -3007,21 +3168,29 @@ fn wire__crate__api__api__create_group_impl( }; let mut deserializer = flutter_rust_bridge::for_generated::SseDeserializer::new(message); - let api_passwords = >, + Arc>, >, >>::sse_decode(&mut deserializer); - let api_name = ::sse_decode(&mut deserializer); + let api_storage_directory = ::sse_decode(&mut deserializer); + let api_expected_account_fingerprint = ::sse_decode(&mut deserializer); + let api_expected_protected_store_identity = ::sse_decode(&mut deserializer); + let api_request_uuid = ::sse_decode(&mut deserializer); + let api_request_timeout_seconds = ::sse_decode(&mut deserializer); + let api_inputs = + >::sse_decode( + &mut deserializer, + ); deserializer.end(); move |context| async move { - transform_result_sse::<_, flutter_rust_bridge::for_generated::anyhow::Error>( + transform_result_sse::<_, ()>( (move || async move { - let mut api_passwords_guard = None; + let mut api_cloud_messages_client_guard = None; let decode_indices_ = flutter_rust_bridge::for_generated::lockable_compute_decode_order( vec![flutter_rust_bridge::for_generated::LockableOrderInfo::new( - &api_passwords, + &api_cloud_messages_client, 0, false, )], @@ -3029,15 +3198,27 @@ fn wire__crate__api__api__create_group_impl( for i in decode_indices_ { match i { 0 => { - api_passwords_guard = - Some(api_passwords.lockable_decode_async_ref().await) + api_cloud_messages_client_guard = Some( + api_cloud_messages_client.lockable_decode_async_ref().await, + ) } _ => unreachable!(), } } - let api_passwords_guard = api_passwords_guard.unwrap(); - let output_ok = - crate::api::api::create_group(&*api_passwords_guard, api_name).await?; + let api_cloud_messages_client_guard = + api_cloud_messages_client_guard.unwrap(); + let output_ok = Result::<_, ()>::Ok( + crate::api::api::cloud_sync_prepare_message_create( + &*api_cloud_messages_client_guard, + api_storage_directory, + api_expected_account_fingerprint, + api_expected_protected_store_identity, + api_request_uuid, + api_request_timeout_seconds, + api_inputs, + ) + .await, + )?; Ok(output_ok) })() .await, @@ -3046,17 +3227,16 @@ fn wire__crate__api__api__create_group_impl( }, ) } -fn wire__crate__api__api__create_icon_array_impl( - port_: flutter_rust_bridge::for_generated::MessagePort, +fn wire__crate__api__api__cloud_sync_protect_impl( ptr_: flutter_rust_bridge::for_generated::PlatformGeneralizedUint8ListPtr, rust_vec_len_: i32, data_len_: i32, -) { - FLUTTER_RUST_BRIDGE_HANDLER.wrap_normal::( +) -> flutter_rust_bridge::for_generated::WireSyncRust2DartSse { + FLUTTER_RUST_BRIDGE_HANDLER.wrap_sync::( flutter_rust_bridge::for_generated::TaskInfo { - debug_name: "create_icon_array", - port: Some(port_), - mode: flutter_rust_bridge::for_generated::FfiCallMode::Normal, + debug_name: "cloud_sync_protect", + port: None, + mode: flutter_rust_bridge::for_generated::FfiCallMode::Sync, }, move || { let message = unsafe { @@ -3068,27 +3248,44 @@ fn wire__crate__api__api__create_icon_array_impl( }; let mut deserializer = flutter_rust_bridge::for_generated::SseDeserializer::new(message); - let api_img = ::sse_decode(&mut deserializer); + let api_storage_directory = ::sse_decode(&mut deserializer); + let api_account_fingerprint = ::sse_decode(&mut deserializer); + let api_container = ::sse_decode(&mut deserializer); + let api_database = ::sse_decode(&mut deserializer); + let api_zone = ::sse_decode(&mut deserializer); + let api_stream_kind = ::sse_decode(&mut deserializer); + let api_schema_version = ::sse_decode(&mut deserializer); + let api_purpose = ::sse_decode(&mut deserializer); + let api_plaintext = ::sse_decode(&mut deserializer); deserializer.end(); - move |context| { - transform_result_sse::<_, ()>((move || { - let output_ok = - Result::<_, ()>::Ok(crate::api::api::create_icon_array(api_img))?; + transform_result_sse::<_, flutter_rust_bridge::for_generated::anyhow::Error>( + (move || { + let output_ok = crate::api::api::cloud_sync_protect( + api_storage_directory, + api_account_fingerprint, + api_container, + api_database, + api_zone, + api_stream_kind, + api_schema_version, + api_purpose, + api_plaintext, + )?; Ok(output_ok) - })()) - } + })(), + ) }, ) } -fn wire__crate__api__api__create_image_array_impl( +fn wire__crate__api__api__cloud_sync_reconcile_message_create_impl( port_: flutter_rust_bridge::for_generated::MessagePort, ptr_: flutter_rust_bridge::for_generated::PlatformGeneralizedUint8ListPtr, rust_vec_len_: i32, data_len_: i32, ) { - FLUTTER_RUST_BRIDGE_HANDLER.wrap_normal::( + FLUTTER_RUST_BRIDGE_HANDLER.wrap_async::( flutter_rust_bridge::for_generated::TaskInfo { - debug_name: "create_image_array", + debug_name: "cloud_sync_reconcile_message_create", port: Some(port_), mode: flutter_rust_bridge::for_generated::FfiCallMode::Normal, }, @@ -3102,26 +3299,70 @@ fn wire__crate__api__api__create_image_array_impl( }; let mut deserializer = flutter_rust_bridge::for_generated::SseDeserializer::new(message); - let api_img = ::sse_decode(&mut deserializer); + let api_cloud_messages_client = >, + >, + >>::sse_decode(&mut deserializer); + let api_storage_directory = ::sse_decode(&mut deserializer); + let api_expected_account_fingerprint = ::sse_decode(&mut deserializer); + let api_expected_protected_store_identity = ::sse_decode(&mut deserializer); + let api_request_uuid = ::sse_decode(&mut deserializer); + let api_input = ::sse_decode( + &mut deserializer, + ); deserializer.end(); - move |context| { - transform_result_sse::<_, ()>((move || { - let output_ok = - Result::<_, ()>::Ok(crate::api::api::create_image_array(api_img))?; - Ok(output_ok) - })()) + move |context| async move { + transform_result_sse::<_, ()>( + (move || async move { + let mut api_cloud_messages_client_guard = None; + let decode_indices_ = + flutter_rust_bridge::for_generated::lockable_compute_decode_order( + vec![flutter_rust_bridge::for_generated::LockableOrderInfo::new( + &api_cloud_messages_client, + 0, + false, + )], + ); + for i in decode_indices_ { + match i { + 0 => { + api_cloud_messages_client_guard = Some( + api_cloud_messages_client.lockable_decode_async_ref().await, + ) + } + _ => unreachable!(), + } + } + let api_cloud_messages_client_guard = + api_cloud_messages_client_guard.unwrap(); + let output_ok = Result::<_, ()>::Ok( + crate::api::api::cloud_sync_reconcile_message_create( + &*api_cloud_messages_client_guard, + api_storage_directory, + api_expected_account_fingerprint, + api_expected_protected_store_identity, + api_request_uuid, + api_input, + ) + .await, + )?; + Ok(output_ok) + })() + .await, + ) } }, ) } -fn wire__crate__api__api__date_now_impl( +fn wire__crate__api__api__cloud_sync_recover_abandoned_page_leases_impl( ptr_: flutter_rust_bridge::for_generated::PlatformGeneralizedUint8ListPtr, rust_vec_len_: i32, data_len_: i32, ) -> flutter_rust_bridge::for_generated::WireSyncRust2DartSse { FLUTTER_RUST_BRIDGE_HANDLER.wrap_sync::( flutter_rust_bridge::for_generated::TaskInfo { - debug_name: "date_now", + debug_name: "cloud_sync_recover_abandoned_page_leases", port: None, mode: flutter_rust_bridge::for_generated::FfiCallMode::Sync, }, @@ -3135,22 +3376,33 @@ fn wire__crate__api__api__date_now_impl( }; let mut deserializer = flutter_rust_bridge::for_generated::SseDeserializer::new(message); + let api_storage_directory = ::sse_decode(&mut deserializer); + let api_adopted_lease_references = >::sse_decode(&mut deserializer); + let api_live_references = >::sse_decode(&mut deserializer); + let api_live_reference_enumeration_complete = ::sse_decode(&mut deserializer); deserializer.end(); transform_result_sse::<_, ()>((move || { - let output_ok = Result::<_, ()>::Ok(crate::api::api::date_now())?; + let output_ok = Result::<_, ()>::Ok( + crate::api::api::cloud_sync_recover_abandoned_page_leases( + api_storage_directory, + api_adopted_lease_references, + api_live_references, + api_live_reference_enumeration_complete, + ), + )?; Ok(output_ok) })()) }, ) } -fn wire__crate__api__api__date_to_ms_impl( +fn wire__crate__api__api__cloud_sync_retire_protected_references_impl( ptr_: flutter_rust_bridge::for_generated::PlatformGeneralizedUint8ListPtr, rust_vec_len_: i32, data_len_: i32, ) -> flutter_rust_bridge::for_generated::WireSyncRust2DartSse { FLUTTER_RUST_BRIDGE_HANDLER.wrap_sync::( flutter_rust_bridge::for_generated::TaskInfo { - debug_name: "date_to_ms", + debug_name: "cloud_sync_retire_protected_references", port: None, mode: flutter_rust_bridge::for_generated::FfiCallMode::Sync, }, @@ -3164,42 +3416,30 @@ fn wire__crate__api__api__date_to_ms_impl( }; let mut deserializer = flutter_rust_bridge::for_generated::SseDeserializer::new(message); - let api_date = , - >>::sse_decode(&mut deserializer); + let api_storage_directory = ::sse_decode(&mut deserializer); + let api_references = >::sse_decode(&mut deserializer); deserializer.end(); transform_result_sse::<_, ()>((move || { - let mut api_date_guard = None; - let decode_indices_ = - flutter_rust_bridge::for_generated::lockable_compute_decode_order(vec![ - flutter_rust_bridge::for_generated::LockableOrderInfo::new( - &api_date, 0, false, - ), - ]); - for i in decode_indices_ { - match i { - 0 => api_date_guard = Some(api_date.lockable_decode_sync_ref()), - _ => unreachable!(), - } - } - let api_date_guard = api_date_guard.unwrap(); - let output_ok = Result::<_, ()>::Ok(crate::api::api::date_to_ms(&*api_date_guard))?; + let output_ok = + Result::<_, ()>::Ok(crate::api::api::cloud_sync_retire_protected_references( + api_storage_directory, + api_references, + ))?; Ok(output_ok) })()) }, ) } -fn wire__crate__api__api__decline_facetime_impl( - port_: flutter_rust_bridge::for_generated::MessagePort, +fn wire__crate__api__api__cloud_sync_rollback_protected_page_lease_impl( ptr_: flutter_rust_bridge::for_generated::PlatformGeneralizedUint8ListPtr, rust_vec_len_: i32, data_len_: i32, -) { - FLUTTER_RUST_BRIDGE_HANDLER.wrap_async::( +) -> flutter_rust_bridge::for_generated::WireSyncRust2DartSse { + FLUTTER_RUST_BRIDGE_HANDLER.wrap_sync::( flutter_rust_bridge::for_generated::TaskInfo { - debug_name: "decline_facetime", - port: Some(port_), - mode: flutter_rust_bridge::for_generated::FfiCallMode::Normal, + debug_name: "cloud_sync_rollback_protected_page_lease", + port: None, + mode: flutter_rust_bridge::for_generated::FfiCallMode::Sync, }, move || { let message = unsafe { @@ -3211,45 +3451,22 @@ fn wire__crate__api__api__decline_facetime_impl( }; let mut deserializer = flutter_rust_bridge::for_generated::SseDeserializer::new(message); - let api_facetime = >, - >>::sse_decode(&mut deserializer); - let api_guid = ::sse_decode(&mut deserializer); + let api_storage_directory = ::sse_decode(&mut deserializer); + let api_page_lease_reference = ::sse_decode(&mut deserializer); deserializer.end(); - move |context| async move { - transform_result_sse::<_, flutter_rust_bridge::for_generated::anyhow::Error>( - (move || async move { - let mut api_facetime_guard = None; - let decode_indices_ = - flutter_rust_bridge::for_generated::lockable_compute_decode_order( - vec![flutter_rust_bridge::for_generated::LockableOrderInfo::new( - &api_facetime, - 0, - false, - )], - ); - for i in decode_indices_ { - match i { - 0 => { - api_facetime_guard = - Some(api_facetime.lockable_decode_async_ref().await) - } - _ => unreachable!(), - } - } - let api_facetime_guard = api_facetime_guard.unwrap(); - let output_ok = - crate::api::api::decline_facetime(&*api_facetime_guard, api_guid) - .await?; - Ok(output_ok) - })() - .await, - ) - } + transform_result_sse::<_, ()>((move || { + let output_ok = Result::<_, ()>::Ok( + crate::api::api::cloud_sync_rollback_protected_page_lease( + api_storage_directory, + api_page_lease_reference, + ), + )?; + Ok(output_ok) + })()) }, ) } -fn wire__crate__api__api__decline_invite_impl( +fn wire__crate__api__api__cloud_sync_stage_outbound_message_impl( port_: flutter_rust_bridge::for_generated::MessagePort, ptr_: flutter_rust_bridge::for_generated::PlatformGeneralizedUint8ListPtr, rust_vec_len_: i32, @@ -3257,7 +3474,7 @@ fn wire__crate__api__api__decline_invite_impl( ) { FLUTTER_RUST_BRIDGE_HANDLER.wrap_async::( flutter_rust_bridge::for_generated::TaskInfo { - debug_name: "decline_invite", + debug_name: "cloud_sync_stage_outbound_message", port: Some(port_), mode: flutter_rust_bridge::for_generated::FfiCallMode::Normal, }, @@ -3271,21 +3488,24 @@ fn wire__crate__api__api__decline_invite_impl( }; let mut deserializer = flutter_rust_bridge::for_generated::SseDeserializer::new(message); - let api_passwords = >, + Arc>, >, >>::sse_decode(&mut deserializer); - let api_invite_id = ::sse_decode(&mut deserializer); + let api_storage_directory = ::sse_decode(&mut deserializer); + let api_expected_account_fingerprint = ::sse_decode(&mut deserializer); + let api_expected_protected_store_identity = ::sse_decode(&mut deserializer); + let api_message = ::sse_decode(&mut deserializer); deserializer.end(); move |context| async move { - transform_result_sse::<_, flutter_rust_bridge::for_generated::anyhow::Error>( + transform_result_sse::<_, ()>( (move || async move { - let mut api_passwords_guard = None; + let mut api_cloud_messages_client_guard = None; let decode_indices_ = flutter_rust_bridge::for_generated::lockable_compute_decode_order( vec![flutter_rust_bridge::for_generated::LockableOrderInfo::new( - &api_passwords, + &api_cloud_messages_client, 0, false, )], @@ -3293,16 +3513,25 @@ fn wire__crate__api__api__decline_invite_impl( for i in decode_indices_ { match i { 0 => { - api_passwords_guard = - Some(api_passwords.lockable_decode_async_ref().await) + api_cloud_messages_client_guard = Some( + api_cloud_messages_client.lockable_decode_async_ref().await, + ) } _ => unreachable!(), } } - let api_passwords_guard = api_passwords_guard.unwrap(); - let output_ok = - crate::api::api::decline_invite(&*api_passwords_guard, api_invite_id) - .await?; + let api_cloud_messages_client_guard = + api_cloud_messages_client_guard.unwrap(); + let output_ok = Result::<_, ()>::Ok( + crate::api::api::cloud_sync_stage_outbound_message( + &*api_cloud_messages_client_guard, + api_storage_directory, + api_expected_account_fingerprint, + api_expected_protected_store_identity, + api_message, + ) + .await, + )?; Ok(output_ok) })() .await, @@ -3311,14 +3540,14 @@ fn wire__crate__api__api__decline_invite_impl( }, ) } -fn wire__crate__api__api__decode_attachmentmeta_impl( +fn wire__crate__api__api__cloud_sync_unprotect_impl( ptr_: flutter_rust_bridge::for_generated::PlatformGeneralizedUint8ListPtr, rust_vec_len_: i32, data_len_: i32, ) -> flutter_rust_bridge::for_generated::WireSyncRust2DartSse { FLUTTER_RUST_BRIDGE_HANDLER.wrap_sync::( flutter_rust_bridge::for_generated::TaskInfo { - debug_name: "decode_attachmentmeta", + debug_name: "cloud_sync_unprotect", port: None, mode: flutter_rust_bridge::for_generated::FfiCallMode::Sync, }, @@ -3332,129 +3561,46 @@ fn wire__crate__api__api__decode_attachmentmeta_impl( }; let mut deserializer = flutter_rust_bridge::for_generated::SseDeserializer::new(message); - let api_wrapped = , - >, - >>::sse_decode(&mut deserializer); + let api_storage_directory = ::sse_decode(&mut deserializer); + let api_account_fingerprint = ::sse_decode(&mut deserializer); + let api_container = ::sse_decode(&mut deserializer); + let api_database = ::sse_decode(&mut deserializer); + let api_zone = ::sse_decode(&mut deserializer); + let api_stream_kind = ::sse_decode(&mut deserializer); + let api_schema_version = ::sse_decode(&mut deserializer); + let api_purpose = ::sse_decode(&mut deserializer); + let api_ciphertext = ::sse_decode(&mut deserializer); deserializer.end(); - transform_result_sse::<_, ()>((move || { - let mut api_wrapped_guard = None; - let decode_indices_ = - flutter_rust_bridge::for_generated::lockable_compute_decode_order(vec![ - flutter_rust_bridge::for_generated::LockableOrderInfo::new( - &api_wrapped, - 0, - false, - ), - ]); - for i in decode_indices_ { - match i { - 0 => api_wrapped_guard = Some(api_wrapped.lockable_decode_sync_ref()), - _ => unreachable!(), - } - } - let api_wrapped_guard = api_wrapped_guard.unwrap(); - let output_ok = Result::<_, ()>::Ok(crate::api::api::decode_attachmentmeta( - &*api_wrapped_guard, - ))?; - Ok(output_ok) - })()) + transform_result_sse::<_, flutter_rust_bridge::for_generated::anyhow::Error>( + (move || { + let output_ok = crate::api::api::cloud_sync_unprotect( + api_storage_directory, + api_account_fingerprint, + api_container, + api_database, + api_zone, + api_stream_kind, + api_schema_version, + api_purpose, + api_ciphertext, + )?; + Ok(output_ok) + })(), + ) }, ) } -fn wire__crate__api__api__decode_chatproto_impl( +fn wire__crate__api__api__complete_msg_impl( + port_: flutter_rust_bridge::for_generated::MessagePort, ptr_: flutter_rust_bridge::for_generated::PlatformGeneralizedUint8ListPtr, rust_vec_len_: i32, data_len_: i32, -) -> flutter_rust_bridge::for_generated::WireSyncRust2DartSse { - FLUTTER_RUST_BRIDGE_HANDLER.wrap_sync::( +) { + FLUTTER_RUST_BRIDGE_HANDLER.wrap_async::( flutter_rust_bridge::for_generated::TaskInfo { - debug_name: "decode_chatproto", - port: None, - mode: flutter_rust_bridge::for_generated::FfiCallMode::Sync, - }, - move || { - let message = unsafe { - flutter_rust_bridge::for_generated::Dart2RustMessageSse::from_wire( - ptr_, - rust_vec_len_, - data_len_, - ) - }; - let mut deserializer = - flutter_rust_bridge::for_generated::SseDeserializer::new(message); - let api_wrapped = >, - >>::sse_decode(&mut deserializer); - deserializer.end(); - transform_result_sse::<_, ()>((move || { - let mut api_wrapped_guard = None; - let decode_indices_ = - flutter_rust_bridge::for_generated::lockable_compute_decode_order(vec![ - flutter_rust_bridge::for_generated::LockableOrderInfo::new( - &api_wrapped, - 0, - false, - ), - ]); - for i in decode_indices_ { - match i { - 0 => api_wrapped_guard = Some(api_wrapped.lockable_decode_sync_ref()), - _ => unreachable!(), - } - } - let api_wrapped_guard = api_wrapped_guard.unwrap(); - let output_ok = - Result::<_, ()>::Ok(crate::api::api::decode_chatproto(&*api_wrapped_guard))?; - Ok(output_ok) - })()) - }, - ) -} -fn wire__crate__api__api__decode_extension_app_impl( - ptr_: flutter_rust_bridge::for_generated::PlatformGeneralizedUint8ListPtr, - rust_vec_len_: i32, - data_len_: i32, -) -> flutter_rust_bridge::for_generated::WireSyncRust2DartSse { - FLUTTER_RUST_BRIDGE_HANDLER.wrap_sync::( - flutter_rust_bridge::for_generated::TaskInfo { - debug_name: "decode_extension_app", - port: None, - mode: flutter_rust_bridge::for_generated::FfiCallMode::Sync, - }, - move || { - let message = unsafe { - flutter_rust_bridge::for_generated::Dart2RustMessageSse::from_wire( - ptr_, - rust_vec_len_, - data_len_, - ) - }; - let mut deserializer = - flutter_rust_bridge::for_generated::SseDeserializer::new(message); - let api_bp = >::sse_decode(&mut deserializer); - let api_bid = ::sse_decode(&mut deserializer); - deserializer.end(); - transform_result_sse::<_, flutter_rust_bridge::for_generated::anyhow::Error>( - (move || { - let output_ok = crate::api::api::decode_extension_app(&api_bp, &api_bid)?; - Ok(output_ok) - })(), - ) - }, - ) -} -fn wire__crate__api__api__decode_identity_impl( - ptr_: flutter_rust_bridge::for_generated::PlatformGeneralizedUint8ListPtr, - rust_vec_len_: i32, - data_len_: i32, -) -> flutter_rust_bridge::for_generated::WireSyncRust2DartSse { - FLUTTER_RUST_BRIDGE_HANDLER.wrap_sync::( - flutter_rust_bridge::for_generated::TaskInfo { - debug_name: "decode_identity", - port: None, - mode: flutter_rust_bridge::for_generated::FfiCallMode::Sync, + debug_name: "complete_msg", + port: Some(port_), + mode: flutter_rust_bridge::for_generated::FfiCallMode::Normal, }, move || { let message = unsafe { @@ -3466,59 +3612,33 @@ fn wire__crate__api__api__decode_identity_impl( }; let mut deserializer = flutter_rust_bridge::for_generated::SseDeserializer::new(message); - let api_identity = >::sse_decode(&mut deserializer); + let api_ptr = ::sse_decode(&mut deserializer); deserializer.end(); - transform_result_sse::<_, flutter_rust_bridge::for_generated::anyhow::Error>( - (move || { - let output_ok = crate::api::api::decode_identity(&api_identity)?; - Ok(output_ok) - })(), - ) - }, - ) -} -fn wire__crate__api__api__decode_message_info_impl( - ptr_: flutter_rust_bridge::for_generated::PlatformGeneralizedUint8ListPtr, - rust_vec_len_: i32, - data_len_: i32, -) -> flutter_rust_bridge::for_generated::WireSyncRust2DartSse { - FLUTTER_RUST_BRIDGE_HANDLER.wrap_sync::( - flutter_rust_bridge::for_generated::TaskInfo { - debug_name: "decode_message_info", - port: None, - mode: flutter_rust_bridge::for_generated::FfiCallMode::Sync, - }, - move || { - let message = unsafe { - flutter_rust_bridge::for_generated::Dart2RustMessageSse::from_wire( - ptr_, - rust_vec_len_, - data_len_, + move |context| async move { + transform_result_sse::<_, ()>( + (move || async move { + let output_ok = Result::<_, ()>::Ok({ + crate::api::api::complete_msg(api_ptr).await; + })?; + Ok(output_ok) + })() + .await, ) - }; - let mut deserializer = - flutter_rust_bridge::for_generated::SseDeserializer::new(message); - let api_data = >::sse_decode(&mut deserializer); - deserializer.end(); - transform_result_sse::<_, flutter_rust_bridge::for_generated::anyhow::Error>( - (move || { - let output_ok = crate::api::api::decode_message_info(&api_data)?; - Ok(output_ok) - })(), - ) + } }, ) } -fn wire__crate__api__api__decode_messageproto_impl( +fn wire__crate__api__api__config_from_encoded_impl( + port_: flutter_rust_bridge::for_generated::MessagePort, ptr_: flutter_rust_bridge::for_generated::PlatformGeneralizedUint8ListPtr, rust_vec_len_: i32, data_len_: i32, -) -> flutter_rust_bridge::for_generated::WireSyncRust2DartSse { - FLUTTER_RUST_BRIDGE_HANDLER.wrap_sync::( +) { + FLUTTER_RUST_BRIDGE_HANDLER.wrap_normal::( flutter_rust_bridge::for_generated::TaskInfo { - debug_name: "decode_messageproto", - port: None, - mode: flutter_rust_bridge::for_generated::FfiCallMode::Sync, + debug_name: "config_from_encoded", + port: Some(port_), + mode: flutter_rust_bridge::for_generated::FfiCallMode::Normal, }, move || { let message = unsafe { @@ -3530,94 +3650,30 @@ fn wire__crate__api__api__decode_messageproto_impl( }; let mut deserializer = flutter_rust_bridge::for_generated::SseDeserializer::new(message); - let api_wrapped = >, - >>::sse_decode(&mut deserializer); + let api_encoded = >::sse_decode(&mut deserializer); deserializer.end(); - transform_result_sse::<_, ()>((move || { - let mut api_wrapped_guard = None; - let decode_indices_ = - flutter_rust_bridge::for_generated::lockable_compute_decode_order(vec![ - flutter_rust_bridge::for_generated::LockableOrderInfo::new( - &api_wrapped, - 0, - false, - ), - ]); - for i in decode_indices_ { - match i { - 0 => api_wrapped_guard = Some(api_wrapped.lockable_decode_sync_ref()), - _ => unreachable!(), - } - } - let api_wrapped_guard = api_wrapped_guard.unwrap(); - let output_ok = - Result::<_, ()>::Ok(crate::api::api::decode_messageproto(&*api_wrapped_guard))?; - Ok(output_ok) - })()) - }, - ) -} -fn wire__crate__api__api__decode_messageproto2_impl( - ptr_: flutter_rust_bridge::for_generated::PlatformGeneralizedUint8ListPtr, - rust_vec_len_: i32, - data_len_: i32, -) -> flutter_rust_bridge::for_generated::WireSyncRust2DartSse { - FLUTTER_RUST_BRIDGE_HANDLER.wrap_sync::( - flutter_rust_bridge::for_generated::TaskInfo { - debug_name: "decode_messageproto2", - port: None, - mode: flutter_rust_bridge::for_generated::FfiCallMode::Sync, - }, - move || { - let message = unsafe { - flutter_rust_bridge::for_generated::Dart2RustMessageSse::from_wire( - ptr_, - rust_vec_len_, - data_len_, + move |context| { + transform_result_sse::<_, flutter_rust_bridge::for_generated::anyhow::Error>( + (move || { + let output_ok = crate::api::api::config_from_encoded(api_encoded)?; + Ok(output_ok) + })(), ) - }; - let mut deserializer = - flutter_rust_bridge::for_generated::SseDeserializer::new(message); - let api_wrapped = >, - >>::sse_decode(&mut deserializer); - deserializer.end(); - transform_result_sse::<_, ()>((move || { - let mut api_wrapped_guard = None; - let decode_indices_ = - flutter_rust_bridge::for_generated::lockable_compute_decode_order(vec![ - flutter_rust_bridge::for_generated::LockableOrderInfo::new( - &api_wrapped, - 0, - false, - ), - ]); - for i in decode_indices_ { - match i { - 0 => api_wrapped_guard = Some(api_wrapped.lockable_decode_sync_ref()), - _ => unreachable!(), - } - } - let api_wrapped_guard = api_wrapped_guard.unwrap(); - let output_ok = Result::<_, ()>::Ok(crate::api::api::decode_messageproto2( - &*api_wrapped_guard, - ))?; - Ok(output_ok) - })()) + } }, ) } -fn wire__crate__api__api__decode_messageproto3_impl( +fn wire__crate__api__api__config_from_relay_impl( + port_: flutter_rust_bridge::for_generated::MessagePort, ptr_: flutter_rust_bridge::for_generated::PlatformGeneralizedUint8ListPtr, rust_vec_len_: i32, data_len_: i32, -) -> flutter_rust_bridge::for_generated::WireSyncRust2DartSse { - FLUTTER_RUST_BRIDGE_HANDLER.wrap_sync::( +) { + FLUTTER_RUST_BRIDGE_HANDLER.wrap_async::( flutter_rust_bridge::for_generated::TaskInfo { - debug_name: "decode_messageproto3", - port: None, - mode: flutter_rust_bridge::for_generated::FfiCallMode::Sync, + debug_name: "config_from_relay", + port: Some(port_), + mode: flutter_rust_bridge::for_generated::FfiCallMode::Normal, }, move || { let message = unsafe { @@ -3629,86 +3685,25 @@ fn wire__crate__api__api__decode_messageproto3_impl( }; let mut deserializer = flutter_rust_bridge::for_generated::SseDeserializer::new(message); - let api_wrapped = >, - >>::sse_decode(&mut deserializer); + let api_code = ::sse_decode(&mut deserializer); + let api_host = ::sse_decode(&mut deserializer); + let api_token = >::sse_decode(&mut deserializer); deserializer.end(); - transform_result_sse::<_, ()>((move || { - let mut api_wrapped_guard = None; - let decode_indices_ = - flutter_rust_bridge::for_generated::lockable_compute_decode_order(vec![ - flutter_rust_bridge::for_generated::LockableOrderInfo::new( - &api_wrapped, - 0, - false, - ), - ]); - for i in decode_indices_ { - match i { - 0 => api_wrapped_guard = Some(api_wrapped.lockable_decode_sync_ref()), - _ => unreachable!(), - } - } - let api_wrapped_guard = api_wrapped_guard.unwrap(); - let output_ok = Result::<_, ()>::Ok(crate::api::api::decode_messageproto3( - &*api_wrapped_guard, - ))?; - Ok(output_ok) - })()) - }, - ) -} -fn wire__crate__api__api__decode_messageproto4_impl( - ptr_: flutter_rust_bridge::for_generated::PlatformGeneralizedUint8ListPtr, - rust_vec_len_: i32, - data_len_: i32, -) -> flutter_rust_bridge::for_generated::WireSyncRust2DartSse { - FLUTTER_RUST_BRIDGE_HANDLER.wrap_sync::( - flutter_rust_bridge::for_generated::TaskInfo { - debug_name: "decode_messageproto4", - port: None, - mode: flutter_rust_bridge::for_generated::FfiCallMode::Sync, - }, - move || { - let message = unsafe { - flutter_rust_bridge::for_generated::Dart2RustMessageSse::from_wire( - ptr_, - rust_vec_len_, - data_len_, + move |context| async move { + transform_result_sse::<_, flutter_rust_bridge::for_generated::anyhow::Error>( + (move || async move { + let output_ok = + crate::api::api::config_from_relay(api_code, api_host, &api_token) + .await?; + Ok(output_ok) + })() + .await, ) - }; - let mut deserializer = - flutter_rust_bridge::for_generated::SseDeserializer::new(message); - let api_wrapped = >, - >>::sse_decode(&mut deserializer); - deserializer.end(); - transform_result_sse::<_, ()>((move || { - let mut api_wrapped_guard = None; - let decode_indices_ = - flutter_rust_bridge::for_generated::lockable_compute_decode_order(vec![ - flutter_rust_bridge::for_generated::LockableOrderInfo::new( - &api_wrapped, - 0, - false, - ), - ]); - for i in decode_indices_ { - match i { - 0 => api_wrapped_guard = Some(api_wrapped.lockable_decode_sync_ref()), - _ => unreachable!(), - } - } - let api_wrapped_guard = api_wrapped_guard.unwrap(); - let output_ok = Result::<_, ()>::Ok(crate::api::api::decode_messageproto4( - &*api_wrapped_guard, - ))?; - Ok(output_ok) - })()) + } }, ) } -fn wire__crate__api__api__decode_profile_message_impl( +fn wire__crate__api__api__config_from_validation_data_impl( port_: flutter_rust_bridge::for_generated::MessagePort, ptr_: flutter_rust_bridge::for_generated::PlatformGeneralizedUint8ListPtr, rust_vec_len_: i32, @@ -3716,7 +3711,7 @@ fn wire__crate__api__api__decode_profile_message_impl( ) { FLUTTER_RUST_BRIDGE_HANDLER.wrap_normal::( flutter_rust_bridge::for_generated::TaskInfo { - debug_name: "decode_profile_message", + debug_name: "config_from_validation_data", port: Some(port_), mode: flutter_rust_bridge::for_generated::FfiCallMode::Normal, }, @@ -3730,12 +3725,14 @@ fn wire__crate__api__api__decode_profile_message_impl( }; let mut deserializer = flutter_rust_bridge::for_generated::SseDeserializer::new(message); - let api_s = ::sse_decode(&mut deserializer); + let api_data = >::sse_decode(&mut deserializer); + let api_extra = ::sse_decode(&mut deserializer); deserializer.end(); move |context| { transform_result_sse::<_, flutter_rust_bridge::for_generated::anyhow::Error>( (move || { - let output_ok = crate::api::api::decode_profile_message(api_s)?; + let output_ok = + crate::api::api::config_from_validation_data(api_data, api_extra)?; Ok(output_ok) })(), ) @@ -3743,15 +3740,15 @@ fn wire__crate__api__api__decode_profile_message_impl( }, ) } -fn wire__crate__api__api__decode_summary_info_impl( +fn wire__crate__api__api__configure_app_review_impl( port_: flutter_rust_bridge::for_generated::MessagePort, ptr_: flutter_rust_bridge::for_generated::PlatformGeneralizedUint8ListPtr, rust_vec_len_: i32, data_len_: i32, ) { - FLUTTER_RUST_BRIDGE_HANDLER.wrap_normal::( + FLUTTER_RUST_BRIDGE_HANDLER.wrap_async::( flutter_rust_bridge::for_generated::TaskInfo { - debug_name: "decode_summary_info", + debug_name: "configure_app_review", port: Some(port_), mode: flutter_rust_bridge::for_generated::FfiCallMode::Normal, }, @@ -3765,19 +3762,21 @@ fn wire__crate__api__api__decode_summary_info_impl( }; let mut deserializer = flutter_rust_bridge::for_generated::SseDeserializer::new(message); - let api_info = >::sse_decode(&mut deserializer); + let api_path = ::sse_decode(&mut deserializer); deserializer.end(); - move |context| { - transform_result_sse::<_, ()>((move || { - let output_ok = - Result::<_, ()>::Ok(crate::api::api::decode_summary_info(&api_info))?; - Ok(output_ok) - })()) + move |context| async move { + transform_result_sse::<_, flutter_rust_bridge::for_generated::anyhow::Error>( + (move || async move { + let output_ok = crate::api::api::configure_app_review(api_path).await?; + Ok(output_ok) + })() + .await, + ) } }, ) } -fn wire__crate__api__api__delete_attachments_impl( +fn wire__crate__api__api__convert_token_to_uuid_impl( port_: flutter_rust_bridge::for_generated::MessagePort, ptr_: flutter_rust_bridge::for_generated::PlatformGeneralizedUint8ListPtr, rust_vec_len_: i32, @@ -3785,7 +3784,7 @@ fn wire__crate__api__api__delete_attachments_impl( ) { FLUTTER_RUST_BRIDGE_HANDLER.wrap_async::( flutter_rust_bridge::for_generated::TaskInfo { - debug_name: "delete_attachments", + debug_name: "convert_token_to_uuid", port: Some(port_), mode: flutter_rust_bridge::for_generated::FfiCallMode::Normal, }, @@ -3799,40 +3798,36 @@ fn wire__crate__api__api__delete_attachments_impl( }; let mut deserializer = flutter_rust_bridge::for_generated::SseDeserializer::new(message); - let api_cloud_messages_client = >, - >, + let api_state = >, >>::sse_decode(&mut deserializer); - let api_attachments = >::sse_decode(&mut deserializer); + let api_handle = ::sse_decode(&mut deserializer); + let api_token = >::sse_decode(&mut deserializer); deserializer.end(); move |context| async move { transform_result_sse::<_, flutter_rust_bridge::for_generated::anyhow::Error>( (move || async move { - let mut api_cloud_messages_client_guard = None; + let mut api_state_guard = None; let decode_indices_ = flutter_rust_bridge::for_generated::lockable_compute_decode_order( vec![flutter_rust_bridge::for_generated::LockableOrderInfo::new( - &api_cloud_messages_client, - 0, - false, + &api_state, 0, false, )], ); for i in decode_indices_ { match i { 0 => { - api_cloud_messages_client_guard = Some( - api_cloud_messages_client.lockable_decode_async_ref().await, - ) + api_state_guard = + Some(api_state.lockable_decode_async_ref().await) } _ => unreachable!(), } } - let api_cloud_messages_client_guard = - api_cloud_messages_client_guard.unwrap(); - let output_ok = crate::api::api::delete_attachments( - &*api_cloud_messages_client_guard, - &api_attachments, + let api_state_guard = api_state_guard.unwrap(); + let output_ok = crate::api::api::convert_token_to_uuid( + &*api_state_guard, + api_handle, + api_token, ) .await?; Ok(output_ok) @@ -3843,7 +3838,7 @@ fn wire__crate__api__api__delete_attachments_impl( }, ) } -fn wire__crate__api__api__delete_beacon_share_impl( +fn wire__crate__api__api__count_records_impl( port_: flutter_rust_bridge::for_generated::MessagePort, ptr_: flutter_rust_bridge::for_generated::PlatformGeneralizedUint8ListPtr, rust_vec_len_: i32, @@ -3851,7 +3846,7 @@ fn wire__crate__api__api__delete_beacon_share_impl( ) { FLUTTER_RUST_BRIDGE_HANDLER.wrap_async::( flutter_rust_bridge::for_generated::TaskInfo { - debug_name: "delete_beacon_share", + debug_name: "count_records", port: Some(port_), mode: flutter_rust_bridge::for_generated::FfiCallMode::Normal, }, @@ -3865,35 +3860,38 @@ fn wire__crate__api__api__delete_beacon_share_impl( }; let mut deserializer = flutter_rust_bridge::for_generated::SseDeserializer::new(message); - let api_items = >, + Arc>, >, >>::sse_decode(&mut deserializer); - let api_share = ::sse_decode(&mut deserializer); deserializer.end(); move |context| async move { transform_result_sse::<_, flutter_rust_bridge::for_generated::anyhow::Error>( (move || async move { - let mut api_items_guard = None; + let mut api_cloud_messages_client_guard = None; let decode_indices_ = flutter_rust_bridge::for_generated::lockable_compute_decode_order( vec![flutter_rust_bridge::for_generated::LockableOrderInfo::new( - &api_items, 0, false, + &api_cloud_messages_client, + 0, + false, )], ); for i in decode_indices_ { match i { 0 => { - api_items_guard = - Some(api_items.lockable_decode_async_ref().await) + api_cloud_messages_client_guard = Some( + api_cloud_messages_client.lockable_decode_async_ref().await, + ) } _ => unreachable!(), } } - let api_items_guard = api_items_guard.unwrap(); + let api_cloud_messages_client_guard = + api_cloud_messages_client_guard.unwrap(); let output_ok = - crate::api::api::delete_beacon_share(&*api_items_guard, api_share) + crate::api::api::count_records(&*api_cloud_messages_client_guard) .await?; Ok(output_ok) })() @@ -3903,7 +3901,7 @@ fn wire__crate__api__api__delete_beacon_share_impl( }, ) } -fn wire__crate__api__api__delete_chats_impl( +fn wire__crate__api__api__create_facetime_impl( port_: flutter_rust_bridge::for_generated::MessagePort, ptr_: flutter_rust_bridge::for_generated::PlatformGeneralizedUint8ListPtr, rust_vec_len_: i32, @@ -3911,7 +3909,7 @@ fn wire__crate__api__api__delete_chats_impl( ) { FLUTTER_RUST_BRIDGE_HANDLER.wrap_async::( flutter_rust_bridge::for_generated::TaskInfo { - debug_name: "delete_chats", + debug_name: "create_facetime", port: Some(port_), mode: flutter_rust_bridge::for_generated::FfiCallMode::Normal, }, @@ -3925,21 +3923,21 @@ fn wire__crate__api__api__delete_chats_impl( }; let mut deserializer = flutter_rust_bridge::for_generated::SseDeserializer::new(message); - let api_cloud_messages_client = >, - >, + let api_facetime = >, >>::sse_decode(&mut deserializer); - let api_chats = >::sse_decode(&mut deserializer); + let api_uuid = ::sse_decode(&mut deserializer); + let api_handle = ::sse_decode(&mut deserializer); + let api_participants = >::sse_decode(&mut deserializer); deserializer.end(); move |context| async move { transform_result_sse::<_, flutter_rust_bridge::for_generated::anyhow::Error>( (move || async move { - let mut api_cloud_messages_client_guard = None; + let mut api_facetime_guard = None; let decode_indices_ = flutter_rust_bridge::for_generated::lockable_compute_decode_order( vec![flutter_rust_bridge::for_generated::LockableOrderInfo::new( - &api_cloud_messages_client, + &api_facetime, 0, false, )], @@ -3947,18 +3945,18 @@ fn wire__crate__api__api__delete_chats_impl( for i in decode_indices_ { match i { 0 => { - api_cloud_messages_client_guard = Some( - api_cloud_messages_client.lockable_decode_async_ref().await, - ) + api_facetime_guard = + Some(api_facetime.lockable_decode_async_ref().await) } _ => unreachable!(), } } - let api_cloud_messages_client_guard = - api_cloud_messages_client_guard.unwrap(); - let output_ok = crate::api::api::delete_chats( - &*api_cloud_messages_client_guard, - &api_chats, + let api_facetime_guard = api_facetime_guard.unwrap(); + let output_ok = crate::api::api::create_facetime( + &*api_facetime_guard, + api_uuid, + api_handle, + api_participants, ) .await?; Ok(output_ok) @@ -3969,7 +3967,7 @@ fn wire__crate__api__api__delete_chats_impl( }, ) } -fn wire__crate__api__api__delete_group_impl( +fn wire__crate__api__api__create_group_impl( port_: flutter_rust_bridge::for_generated::MessagePort, ptr_: flutter_rust_bridge::for_generated::PlatformGeneralizedUint8ListPtr, rust_vec_len_: i32, @@ -3977,7 +3975,7 @@ fn wire__crate__api__api__delete_group_impl( ) { FLUTTER_RUST_BRIDGE_HANDLER.wrap_async::( flutter_rust_bridge::for_generated::TaskInfo { - debug_name: "delete_group", + debug_name: "create_group", port: Some(port_), mode: flutter_rust_bridge::for_generated::FfiCallMode::Normal, }, @@ -3996,7 +3994,7 @@ fn wire__crate__api__api__delete_group_impl( Arc>, >, >>::sse_decode(&mut deserializer); - let api_gid = ::sse_decode(&mut deserializer); + let api_name = ::sse_decode(&mut deserializer); deserializer.end(); move |context| async move { transform_result_sse::<_, flutter_rust_bridge::for_generated::anyhow::Error>( @@ -4021,7 +4019,7 @@ fn wire__crate__api__api__delete_group_impl( } let api_passwords_guard = api_passwords_guard.unwrap(); let output_ok = - crate::api::api::delete_group(&*api_passwords_guard, api_gid).await?; + crate::api::api::create_group(&*api_passwords_guard, api_name).await?; Ok(output_ok) })() .await, @@ -4030,15 +4028,15 @@ fn wire__crate__api__api__delete_group_impl( }, ) } -fn wire__crate__api__api__delete_messages_impl( +fn wire__crate__api__api__create_icon_array_impl( port_: flutter_rust_bridge::for_generated::MessagePort, ptr_: flutter_rust_bridge::for_generated::PlatformGeneralizedUint8ListPtr, rust_vec_len_: i32, data_len_: i32, ) { - FLUTTER_RUST_BRIDGE_HANDLER.wrap_async::( + FLUTTER_RUST_BRIDGE_HANDLER.wrap_normal::( flutter_rust_bridge::for_generated::TaskInfo { - debug_name: "delete_messages", + debug_name: "create_icon_array", port: Some(port_), mode: flutter_rust_bridge::for_generated::FfiCallMode::Normal, }, @@ -4052,59 +4050,27 @@ fn wire__crate__api__api__delete_messages_impl( }; let mut deserializer = flutter_rust_bridge::for_generated::SseDeserializer::new(message); - let api_cloud_messages_client = >, - >, - >>::sse_decode(&mut deserializer); - let api_messages = >::sse_decode(&mut deserializer); + let api_img = ::sse_decode(&mut deserializer); deserializer.end(); - move |context| async move { - transform_result_sse::<_, flutter_rust_bridge::for_generated::anyhow::Error>( - (move || async move { - let mut api_cloud_messages_client_guard = None; - let decode_indices_ = - flutter_rust_bridge::for_generated::lockable_compute_decode_order( - vec![flutter_rust_bridge::for_generated::LockableOrderInfo::new( - &api_cloud_messages_client, - 0, - false, - )], - ); - for i in decode_indices_ { - match i { - 0 => { - api_cloud_messages_client_guard = Some( - api_cloud_messages_client.lockable_decode_async_ref().await, - ) - } - _ => unreachable!(), - } - } - let api_cloud_messages_client_guard = - api_cloud_messages_client_guard.unwrap(); - let output_ok = crate::api::api::delete_messages( - &*api_cloud_messages_client_guard, - &api_messages, - ) - .await?; - Ok(output_ok) - })() - .await, - ) - } - }, + move |context| { + transform_result_sse::<_, ()>((move || { + let output_ok = + Result::<_, ()>::Ok(crate::api::api::create_icon_array(api_img))?; + Ok(output_ok) + })()) + } + }, ) } -fn wire__crate__api__api__delete_passkey_impl( +fn wire__crate__api__api__create_image_array_impl( port_: flutter_rust_bridge::for_generated::MessagePort, ptr_: flutter_rust_bridge::for_generated::PlatformGeneralizedUint8ListPtr, rust_vec_len_: i32, data_len_: i32, ) { - FLUTTER_RUST_BRIDGE_HANDLER.wrap_async::( + FLUTTER_RUST_BRIDGE_HANDLER.wrap_normal::( flutter_rust_bridge::for_generated::TaskInfo { - debug_name: "delete_passkey", + debug_name: "create_image_array", port: Some(port_), mode: flutter_rust_bridge::for_generated::FfiCallMode::Normal, }, @@ -4118,61 +4084,28 @@ fn wire__crate__api__api__delete_passkey_impl( }; let mut deserializer = flutter_rust_bridge::for_generated::SseDeserializer::new(message); - let api_passwords = >, - >, - >>::sse_decode(&mut deserializer); - let api_id = ::sse_decode(&mut deserializer); - let api_group = >::sse_decode(&mut deserializer); + let api_img = ::sse_decode(&mut deserializer); deserializer.end(); - move |context| async move { - transform_result_sse::<_, flutter_rust_bridge::for_generated::anyhow::Error>( - (move || async move { - let mut api_passwords_guard = None; - let decode_indices_ = - flutter_rust_bridge::for_generated::lockable_compute_decode_order( - vec![flutter_rust_bridge::for_generated::LockableOrderInfo::new( - &api_passwords, - 0, - false, - )], - ); - for i in decode_indices_ { - match i { - 0 => { - api_passwords_guard = - Some(api_passwords.lockable_decode_async_ref().await) - } - _ => unreachable!(), - } - } - let api_passwords_guard = api_passwords_guard.unwrap(); - let output_ok = crate::api::api::delete_passkey( - &*api_passwords_guard, - api_id, - api_group, - ) - .await?; - Ok(output_ok) - })() - .await, - ) + move |context| { + transform_result_sse::<_, ()>((move || { + let output_ok = + Result::<_, ()>::Ok(crate::api::api::create_image_array(api_img))?; + Ok(output_ok) + })()) } }, ) } -fn wire__crate__api__api__delete_password_impl( - port_: flutter_rust_bridge::for_generated::MessagePort, +fn wire__crate__api__api__date_now_impl( ptr_: flutter_rust_bridge::for_generated::PlatformGeneralizedUint8ListPtr, rust_vec_len_: i32, data_len_: i32, -) { - FLUTTER_RUST_BRIDGE_HANDLER.wrap_async::( +) -> flutter_rust_bridge::for_generated::WireSyncRust2DartSse { + FLUTTER_RUST_BRIDGE_HANDLER.wrap_sync::( flutter_rust_bridge::for_generated::TaskInfo { - debug_name: "delete_password", - port: Some(port_), - mode: flutter_rust_bridge::for_generated::FfiCallMode::Normal, + debug_name: "date_now", + port: None, + mode: flutter_rust_bridge::for_generated::FfiCallMode::Sync, }, move || { let message = unsafe { @@ -4184,51 +4117,61 @@ fn wire__crate__api__api__delete_password_impl( }; let mut deserializer = flutter_rust_bridge::for_generated::SseDeserializer::new(message); - let api_passwords = >, - >, - >>::sse_decode(&mut deserializer); - let api_id = ::sse_decode(&mut deserializer); - let api_group = >::sse_decode(&mut deserializer); deserializer.end(); - move |context| async move { - transform_result_sse::<_, flutter_rust_bridge::for_generated::anyhow::Error>( - (move || async move { - let mut api_passwords_guard = None; - let decode_indices_ = - flutter_rust_bridge::for_generated::lockable_compute_decode_order( - vec![flutter_rust_bridge::for_generated::LockableOrderInfo::new( - &api_passwords, - 0, - false, - )], - ); - for i in decode_indices_ { - match i { - 0 => { - api_passwords_guard = - Some(api_passwords.lockable_decode_async_ref().await) - } - _ => unreachable!(), - } - } - let api_passwords_guard = api_passwords_guard.unwrap(); - let output_ok = crate::api::api::delete_password( - &*api_passwords_guard, - api_id, - api_group, - ) - .await?; - Ok(output_ok) - })() - .await, + transform_result_sse::<_, ()>((move || { + let output_ok = Result::<_, ()>::Ok(crate::api::api::date_now())?; + Ok(output_ok) + })()) + }, + ) +} +fn wire__crate__api__api__date_to_ms_impl( + ptr_: flutter_rust_bridge::for_generated::PlatformGeneralizedUint8ListPtr, + rust_vec_len_: i32, + data_len_: i32, +) -> flutter_rust_bridge::for_generated::WireSyncRust2DartSse { + FLUTTER_RUST_BRIDGE_HANDLER.wrap_sync::( + flutter_rust_bridge::for_generated::TaskInfo { + debug_name: "date_to_ms", + port: None, + mode: flutter_rust_bridge::for_generated::FfiCallMode::Sync, + }, + move || { + let message = unsafe { + flutter_rust_bridge::for_generated::Dart2RustMessageSse::from_wire( + ptr_, + rust_vec_len_, + data_len_, ) - } + }; + let mut deserializer = + flutter_rust_bridge::for_generated::SseDeserializer::new(message); + let api_date = , + >>::sse_decode(&mut deserializer); + deserializer.end(); + transform_result_sse::<_, ()>((move || { + let mut api_date_guard = None; + let decode_indices_ = + flutter_rust_bridge::for_generated::lockable_compute_decode_order(vec![ + flutter_rust_bridge::for_generated::LockableOrderInfo::new( + &api_date, 0, false, + ), + ]); + for i in decode_indices_ { + match i { + 0 => api_date_guard = Some(api_date.lockable_decode_sync_ref()), + _ => unreachable!(), + } + } + let api_date_guard = api_date_guard.unwrap(); + let output_ok = Result::<_, ()>::Ok(crate::api::api::date_to_ms(&*api_date_guard))?; + Ok(output_ok) + })()) }, ) } -fn wire__crate__api__api__delete_password_meta_impl( +fn wire__crate__api__api__decline_facetime_impl( port_: flutter_rust_bridge::for_generated::MessagePort, ptr_: flutter_rust_bridge::for_generated::PlatformGeneralizedUint8ListPtr, rust_vec_len_: i32, @@ -4236,7 +4179,7 @@ fn wire__crate__api__api__delete_password_meta_impl( ) { FLUTTER_RUST_BRIDGE_HANDLER.wrap_async::( flutter_rust_bridge::for_generated::TaskInfo { - debug_name: "delete_password_meta", + debug_name: "decline_facetime", port: Some(port_), mode: flutter_rust_bridge::for_generated::FfiCallMode::Normal, }, @@ -4250,22 +4193,19 @@ fn wire__crate__api__api__delete_password_meta_impl( }; let mut deserializer = flutter_rust_bridge::for_generated::SseDeserializer::new(message); - let api_passwords = >, - >, + let api_facetime = >, >>::sse_decode(&mut deserializer); - let api_id = ::sse_decode(&mut deserializer); - let api_group = >::sse_decode(&mut deserializer); + let api_guid = ::sse_decode(&mut deserializer); deserializer.end(); move |context| async move { transform_result_sse::<_, flutter_rust_bridge::for_generated::anyhow::Error>( (move || async move { - let mut api_passwords_guard = None; + let mut api_facetime_guard = None; let decode_indices_ = flutter_rust_bridge::for_generated::lockable_compute_decode_order( vec![flutter_rust_bridge::for_generated::LockableOrderInfo::new( - &api_passwords, + &api_facetime, 0, false, )], @@ -4273,19 +4213,16 @@ fn wire__crate__api__api__delete_password_meta_impl( for i in decode_indices_ { match i { 0 => { - api_passwords_guard = - Some(api_passwords.lockable_decode_async_ref().await) + api_facetime_guard = + Some(api_facetime.lockable_decode_async_ref().await) } _ => unreachable!(), } } - let api_passwords_guard = api_passwords_guard.unwrap(); - let output_ok = crate::api::api::delete_password_meta( - &*api_passwords_guard, - api_id, - api_group, - ) - .await?; + let api_facetime_guard = api_facetime_guard.unwrap(); + let output_ok = + crate::api::api::decline_facetime(&*api_facetime_guard, api_guid) + .await?; Ok(output_ok) })() .await, @@ -4294,7 +4231,7 @@ fn wire__crate__api__api__delete_password_meta_impl( }, ) } -fn wire__crate__api__api__delete_wifi_password_impl( +fn wire__crate__api__api__decline_invite_impl( port_: flutter_rust_bridge::for_generated::MessagePort, ptr_: flutter_rust_bridge::for_generated::PlatformGeneralizedUint8ListPtr, rust_vec_len_: i32, @@ -4302,7 +4239,7 @@ fn wire__crate__api__api__delete_wifi_password_impl( ) { FLUTTER_RUST_BRIDGE_HANDLER.wrap_async::( flutter_rust_bridge::for_generated::TaskInfo { - debug_name: "delete_wifi_password", + debug_name: "decline_invite", port: Some(port_), mode: flutter_rust_bridge::for_generated::FfiCallMode::Normal, }, @@ -4321,8 +4258,7 @@ fn wire__crate__api__api__delete_wifi_password_impl( Arc>, >, >>::sse_decode(&mut deserializer); - let api_id = ::sse_decode(&mut deserializer); - let api_group = >::sse_decode(&mut deserializer); + let api_invite_id = ::sse_decode(&mut deserializer); deserializer.end(); move |context| async move { transform_result_sse::<_, flutter_rust_bridge::for_generated::anyhow::Error>( @@ -4346,12 +4282,9 @@ fn wire__crate__api__api__delete_wifi_password_impl( } } let api_passwords_guard = api_passwords_guard.unwrap(); - let output_ok = crate::api::api::delete_wifi_password( - &*api_passwords_guard, - api_id, - api_group, - ) - .await?; + let output_ok = + crate::api::api::decline_invite(&*api_passwords_guard, api_invite_id) + .await?; Ok(output_ok) })() .await, @@ -4360,17 +4293,16 @@ fn wire__crate__api__api__delete_wifi_password_impl( }, ) } -fn wire__crate__api__api__do_first_time_init_impl( - port_: flutter_rust_bridge::for_generated::MessagePort, +fn wire__crate__api__api__decode_attachmentmeta_impl( ptr_: flutter_rust_bridge::for_generated::PlatformGeneralizedUint8ListPtr, rust_vec_len_: i32, data_len_: i32, -) { - FLUTTER_RUST_BRIDGE_HANDLER.wrap_normal::( +) -> flutter_rust_bridge::for_generated::WireSyncRust2DartSse { + FLUTTER_RUST_BRIDGE_HANDLER.wrap_sync::( flutter_rust_bridge::for_generated::TaskInfo { - debug_name: "do_first_time_init", - port: Some(port_), - mode: flutter_rust_bridge::for_generated::FfiCallMode::Normal, + debug_name: "decode_attachmentmeta", + port: None, + mode: flutter_rust_bridge::for_generated::FfiCallMode::Sync, }, move || { let message = unsafe { @@ -4382,30 +4314,47 @@ fn wire__crate__api__api__do_first_time_init_impl( }; let mut deserializer = flutter_rust_bridge::for_generated::SseDeserializer::new(message); - let api_path = ::sse_decode(&mut deserializer); + let api_wrapped = , + >, + >>::sse_decode(&mut deserializer); deserializer.end(); - move |context| { - transform_result_sse::<_, ()>((move || { - let output_ok = Result::<_, ()>::Ok({ - crate::api::api::do_first_time_init(api_path); - })?; - Ok(output_ok) - })()) - } + transform_result_sse::<_, ()>((move || { + let mut api_wrapped_guard = None; + let decode_indices_ = + flutter_rust_bridge::for_generated::lockable_compute_decode_order(vec![ + flutter_rust_bridge::for_generated::LockableOrderInfo::new( + &api_wrapped, + 0, + false, + ), + ]); + for i in decode_indices_ { + match i { + 0 => api_wrapped_guard = Some(api_wrapped.lockable_decode_sync_ref()), + _ => unreachable!(), + } + } + let api_wrapped_guard = api_wrapped_guard.unwrap(); + let output_ok = Result::<_, ()>::Ok(crate::api::api::decode_attachmentmeta( + &*api_wrapped_guard, + ))?; + Ok(output_ok) + })()) }, ) } -fn wire__crate__api__api__do_login_impl( - port_: flutter_rust_bridge::for_generated::MessagePort, +fn wire__crate__api__api__decode_chatproto_impl( ptr_: flutter_rust_bridge::for_generated::PlatformGeneralizedUint8ListPtr, rust_vec_len_: i32, data_len_: i32, -) { - FLUTTER_RUST_BRIDGE_HANDLER.wrap_async::( +) -> flutter_rust_bridge::for_generated::WireSyncRust2DartSse { + FLUTTER_RUST_BRIDGE_HANDLER.wrap_sync::( flutter_rust_bridge::for_generated::TaskInfo { - debug_name: "do_login", - port: Some(port_), - mode: flutter_rust_bridge::for_generated::FfiCallMode::Normal, + debug_name: "decode_chatproto", + port: None, + mode: flutter_rust_bridge::for_generated::FfiCallMode::Sync, }, move || { let message = unsafe { @@ -4417,79 +4366,44 @@ fn wire__crate__api__api__do_login_impl( }; let mut deserializer = flutter_rust_bridge::for_generated::SseDeserializer::new(message); - let api_path = ::sse_decode(&mut deserializer); - let api_account = >>, - >, - >>::sse_decode(&mut deserializer); - let api_finish = - >::sse_decode(&mut deserializer); - let api_os_config = , + let api_wrapped = >, >>::sse_decode(&mut deserializer); deserializer.end(); - move |context| async move { - transform_result_sse::<_, flutter_rust_bridge::for_generated::anyhow::Error>( - (move || async move { - let mut api_account_guard = None; - let mut api_os_config_guard = None; - let decode_indices_ = - flutter_rust_bridge::for_generated::lockable_compute_decode_order( - vec![ - flutter_rust_bridge::for_generated::LockableOrderInfo::new( - &api_account, - 0, - false, - ), - flutter_rust_bridge::for_generated::LockableOrderInfo::new( - &api_os_config, - 1, - false, - ), - ], - ); - for i in decode_indices_ { - match i { - 0 => { - api_account_guard = - Some(api_account.lockable_decode_async_ref().await) - } - 1 => { - api_os_config_guard = - Some(api_os_config.lockable_decode_async_ref().await) - } - _ => unreachable!(), - } - } - let api_account_guard = api_account_guard.unwrap(); - let api_os_config_guard = api_os_config_guard.unwrap(); - let output_ok = crate::api::api::do_login( - api_path, - &*api_account_guard, - api_finish, - &*api_os_config_guard, - ) - .await?; - Ok(output_ok) - })() - .await, - ) - } + transform_result_sse::<_, ()>((move || { + let mut api_wrapped_guard = None; + let decode_indices_ = + flutter_rust_bridge::for_generated::lockable_compute_decode_order(vec![ + flutter_rust_bridge::for_generated::LockableOrderInfo::new( + &api_wrapped, + 0, + false, + ), + ]); + for i in decode_indices_ { + match i { + 0 => api_wrapped_guard = Some(api_wrapped.lockable_decode_sync_ref()), + _ => unreachable!(), + } + } + let api_wrapped_guard = api_wrapped_guard.unwrap(); + let output_ok = + Result::<_, ()>::Ok(crate::api::api::decode_chatproto(&*api_wrapped_guard))?; + Ok(output_ok) + })()) }, ) } -fn wire__crate__api__api__do_reregister_impl( - port_: flutter_rust_bridge::for_generated::MessagePort, +fn wire__crate__api__api__decode_extension_app_impl( ptr_: flutter_rust_bridge::for_generated::PlatformGeneralizedUint8ListPtr, rust_vec_len_: i32, data_len_: i32, -) { - FLUTTER_RUST_BRIDGE_HANDLER.wrap_async::( +) -> flutter_rust_bridge::for_generated::WireSyncRust2DartSse { + FLUTTER_RUST_BRIDGE_HANDLER.wrap_sync::( flutter_rust_bridge::for_generated::TaskInfo { - debug_name: "do_reregister", - port: Some(port_), - mode: flutter_rust_bridge::for_generated::FfiCallMode::Normal, + debug_name: "decode_extension_app", + port: None, + mode: flutter_rust_bridge::for_generated::FfiCallMode::Sync, }, move || { let message = unsafe { @@ -4501,50 +4415,28 @@ fn wire__crate__api__api__do_reregister_impl( }; let mut deserializer = flutter_rust_bridge::for_generated::SseDeserializer::new(message); - let api_state = >, - >>::sse_decode(&mut deserializer); + let api_bp = >::sse_decode(&mut deserializer); + let api_bid = ::sse_decode(&mut deserializer); deserializer.end(); - move |context| async move { - transform_result_sse::<_, flutter_rust_bridge::for_generated::anyhow::Error>( - (move || async move { - let mut api_state_guard = None; - let decode_indices_ = - flutter_rust_bridge::for_generated::lockable_compute_decode_order( - vec![flutter_rust_bridge::for_generated::LockableOrderInfo::new( - &api_state, 0, false, - )], - ); - for i in decode_indices_ { - match i { - 0 => { - api_state_guard = - Some(api_state.lockable_decode_async_ref().await) - } - _ => unreachable!(), - } - } - let api_state_guard = api_state_guard.unwrap(); - let output_ok = crate::api::api::do_reregister(&*api_state_guard).await?; - Ok(output_ok) - })() - .await, - ) - } + transform_result_sse::<_, flutter_rust_bridge::for_generated::anyhow::Error>( + (move || { + let output_ok = crate::api::api::decode_extension_app(&api_bp, &api_bid)?; + Ok(output_ok) + })(), + ) }, ) } -fn wire__crate__api__api__download_attachment_impl( - port_: flutter_rust_bridge::for_generated::MessagePort, +fn wire__crate__api__api__decode_identity_impl( ptr_: flutter_rust_bridge::for_generated::PlatformGeneralizedUint8ListPtr, rust_vec_len_: i32, data_len_: i32, -) { - FLUTTER_RUST_BRIDGE_HANDLER.wrap_async::( +) -> flutter_rust_bridge::for_generated::WireSyncRust2DartSse { + FLUTTER_RUST_BRIDGE_HANDLER.wrap_sync::( flutter_rust_bridge::for_generated::TaskInfo { - debug_name: "download_attachment", - port: Some(port_), - mode: flutter_rust_bridge::for_generated::FfiCallMode::Normal, + debug_name: "decode_identity", + port: None, + mode: flutter_rust_bridge::for_generated::FfiCallMode::Sync, }, move || { let message = unsafe { @@ -4556,63 +4448,59 @@ fn wire__crate__api__api__download_attachment_impl( }; let mut deserializer = flutter_rust_bridge::for_generated::SseDeserializer::new(message); - let api_sink = >::sse_decode(&mut deserializer); - let api_aps = , - >>::sse_decode(&mut deserializer); - let api_attachment = ::sse_decode(&mut deserializer); - let api_path = ::sse_decode(&mut deserializer); + let api_identity = >::sse_decode(&mut deserializer); deserializer.end(); - move |context| async move { - transform_result_sse::<_, ()>( - (move || async move { - let mut api_aps_guard = None; - let decode_indices_ = - flutter_rust_bridge::for_generated::lockable_compute_decode_order( - vec![flutter_rust_bridge::for_generated::LockableOrderInfo::new( - &api_aps, 0, false, - )], - ); - for i in decode_indices_ { - match i { - 0 => { - api_aps_guard = Some(api_aps.lockable_decode_async_ref().await) - } - _ => unreachable!(), - } - } - let api_aps_guard = api_aps_guard.unwrap(); - let output_ok = Result::<_, ()>::Ok({ - crate::api::api::download_attachment( - api_sink, - &*api_aps_guard, - api_attachment, - api_path, - ) - .await; - })?; - Ok(output_ok) - })() - .await, + transform_result_sse::<_, flutter_rust_bridge::for_generated::anyhow::Error>( + (move || { + let output_ok = crate::api::api::decode_identity(&api_identity)?; + Ok(output_ok) + })(), + ) + }, + ) +} +fn wire__crate__api__api__decode_message_info_impl( + ptr_: flutter_rust_bridge::for_generated::PlatformGeneralizedUint8ListPtr, + rust_vec_len_: i32, + data_len_: i32, +) -> flutter_rust_bridge::for_generated::WireSyncRust2DartSse { + FLUTTER_RUST_BRIDGE_HANDLER.wrap_sync::( + flutter_rust_bridge::for_generated::TaskInfo { + debug_name: "decode_message_info", + port: None, + mode: flutter_rust_bridge::for_generated::FfiCallMode::Sync, + }, + move || { + let message = unsafe { + flutter_rust_bridge::for_generated::Dart2RustMessageSse::from_wire( + ptr_, + rust_vec_len_, + data_len_, ) - } + }; + let mut deserializer = + flutter_rust_bridge::for_generated::SseDeserializer::new(message); + let api_data = >::sse_decode(&mut deserializer); + deserializer.end(); + transform_result_sse::<_, flutter_rust_bridge::for_generated::anyhow::Error>( + (move || { + let output_ok = crate::api::api::decode_message_info(&api_data)?; + Ok(output_ok) + })(), + ) }, ) } -fn wire__crate__api__api__download_cloud_attachments_impl( - port_: flutter_rust_bridge::for_generated::MessagePort, +fn wire__crate__api__api__decode_messageproto_impl( ptr_: flutter_rust_bridge::for_generated::PlatformGeneralizedUint8ListPtr, rust_vec_len_: i32, data_len_: i32, -) { - FLUTTER_RUST_BRIDGE_HANDLER.wrap_async::( +) -> flutter_rust_bridge::for_generated::WireSyncRust2DartSse { + FLUTTER_RUST_BRIDGE_HANDLER.wrap_sync::( flutter_rust_bridge::for_generated::TaskInfo { - debug_name: "download_cloud_attachments", - port: Some(port_), - mode: flutter_rust_bridge::for_generated::FfiCallMode::Normal, + debug_name: "decode_messageproto", + port: None, + mode: flutter_rust_bridge::for_generated::FfiCallMode::Sync, }, move || { let message = unsafe { @@ -4624,192 +4512,42 @@ fn wire__crate__api__api__download_cloud_attachments_impl( }; let mut deserializer = flutter_rust_bridge::for_generated::SseDeserializer::new(message); - let api_cloud_messages_client = >, - >, + let api_wrapped = >, >>::sse_decode(&mut deserializer); - let api_files = >::sse_decode(&mut deserializer); - deserializer.end(); - move |context| async move { - transform_result_sse::<_, flutter_rust_bridge::for_generated::anyhow::Error>( - (move || async move { - let mut api_cloud_messages_client_guard = None; - let decode_indices_ = - flutter_rust_bridge::for_generated::lockable_compute_decode_order( - vec![flutter_rust_bridge::for_generated::LockableOrderInfo::new( - &api_cloud_messages_client, - 0, - false, - )], - ); - for i in decode_indices_ { - match i { - 0 => { - api_cloud_messages_client_guard = Some( - api_cloud_messages_client.lockable_decode_async_ref().await, - ) - } - _ => unreachable!(), - } - } - let api_cloud_messages_client_guard = - api_cloud_messages_client_guard.unwrap(); - let output_ok = crate::api::api::download_cloud_attachments( - &*api_cloud_messages_client_guard, - api_files, - ) - .await?; - Ok(output_ok) - })() - .await, - ) - } - }, - ) -} -fn wire__crate__api__api__download_cloud_group_photos_impl( - port_: flutter_rust_bridge::for_generated::MessagePort, - ptr_: flutter_rust_bridge::for_generated::PlatformGeneralizedUint8ListPtr, - rust_vec_len_: i32, - data_len_: i32, -) { - FLUTTER_RUST_BRIDGE_HANDLER.wrap_async::( - flutter_rust_bridge::for_generated::TaskInfo { - debug_name: "download_cloud_group_photos", - port: Some(port_), - mode: flutter_rust_bridge::for_generated::FfiCallMode::Normal, - }, - move || { - let message = unsafe { - flutter_rust_bridge::for_generated::Dart2RustMessageSse::from_wire( - ptr_, - rust_vec_len_, - data_len_, - ) - }; - let mut deserializer = - flutter_rust_bridge::for_generated::SseDeserializer::new(message); - let api_cloud_messages_client = >, - >, - >>::sse_decode(&mut deserializer); - let api_files = >::sse_decode(&mut deserializer); - deserializer.end(); - move |context| async move { - transform_result_sse::<_, flutter_rust_bridge::for_generated::anyhow::Error>( - (move || async move { - let mut api_cloud_messages_client_guard = None; - let decode_indices_ = - flutter_rust_bridge::for_generated::lockable_compute_decode_order( - vec![flutter_rust_bridge::for_generated::LockableOrderInfo::new( - &api_cloud_messages_client, - 0, - false, - )], - ); - for i in decode_indices_ { - match i { - 0 => { - api_cloud_messages_client_guard = Some( - api_cloud_messages_client.lockable_decode_async_ref().await, - ) - } - _ => unreachable!(), - } - } - let api_cloud_messages_client_guard = - api_cloud_messages_client_guard.unwrap(); - let output_ok = crate::api::api::download_cloud_group_photos( - &*api_cloud_messages_client_guard, - api_files, - ) - .await?; - Ok(output_ok) - })() - .await, - ) - } - }, - ) -} -fn wire__crate__api__api__download_mmcs_impl( - port_: flutter_rust_bridge::for_generated::MessagePort, - ptr_: flutter_rust_bridge::for_generated::PlatformGeneralizedUint8ListPtr, - rust_vec_len_: i32, - data_len_: i32, -) { - FLUTTER_RUST_BRIDGE_HANDLER.wrap_async::( - flutter_rust_bridge::for_generated::TaskInfo { - debug_name: "download_mmcs", - port: Some(port_), - mode: flutter_rust_bridge::for_generated::FfiCallMode::Normal, - }, - move || { - let message = unsafe { - flutter_rust_bridge::for_generated::Dart2RustMessageSse::from_wire( - ptr_, - rust_vec_len_, - data_len_, - ) - }; - let mut deserializer = - flutter_rust_bridge::for_generated::SseDeserializer::new(message); - let api_sink = >::sse_decode(&mut deserializer); - let api_aps = , - >>::sse_decode(&mut deserializer); - let api_attachment = ::sse_decode(&mut deserializer); - let api_path = ::sse_decode(&mut deserializer); deserializer.end(); - move |context| async move { - transform_result_sse::<_, ()>( - (move || async move { - let mut api_aps_guard = None; - let decode_indices_ = - flutter_rust_bridge::for_generated::lockable_compute_decode_order( - vec![flutter_rust_bridge::for_generated::LockableOrderInfo::new( - &api_aps, 0, false, - )], - ); - for i in decode_indices_ { - match i { - 0 => { - api_aps_guard = Some(api_aps.lockable_decode_async_ref().await) - } - _ => unreachable!(), - } - } - let api_aps_guard = api_aps_guard.unwrap(); - let output_ok = Result::<_, ()>::Ok({ - crate::api::api::download_mmcs( - api_sink, - &*api_aps_guard, - api_attachment, - api_path, - ) - .await; - })?; - Ok(output_ok) - })() - .await, - ) - } + transform_result_sse::<_, ()>((move || { + let mut api_wrapped_guard = None; + let decode_indices_ = + flutter_rust_bridge::for_generated::lockable_compute_decode_order(vec![ + flutter_rust_bridge::for_generated::LockableOrderInfo::new( + &api_wrapped, + 0, + false, + ), + ]); + for i in decode_indices_ { + match i { + 0 => api_wrapped_guard = Some(api_wrapped.lockable_decode_sync_ref()), + _ => unreachable!(), + } + } + let api_wrapped_guard = api_wrapped_guard.unwrap(); + let output_ok = + Result::<_, ()>::Ok(crate::api::api::decode_messageproto(&*api_wrapped_guard))?; + Ok(output_ok) + })()) }, ) } -fn wire__crate__api__api__dup_daemon_desk_impl( +fn wire__crate__api__api__decode_messageproto2_impl( ptr_: flutter_rust_bridge::for_generated::PlatformGeneralizedUint8ListPtr, rust_vec_len_: i32, data_len_: i32, ) -> flutter_rust_bridge::for_generated::WireSyncRust2DartSse { FLUTTER_RUST_BRIDGE_HANDLER.wrap_sync::( flutter_rust_bridge::for_generated::TaskInfo { - debug_name: "dup_daemon_desk", + debug_name: "decode_messageproto2", port: None, mode: flutter_rust_bridge::for_generated::FfiCallMode::Sync, }, @@ -4823,23 +4561,43 @@ fn wire__crate__api__api__dup_daemon_desk_impl( }; let mut deserializer = flutter_rust_bridge::for_generated::SseDeserializer::new(message); - let api_state = ::sse_decode(&mut deserializer); + let api_wrapped = >, + >>::sse_decode(&mut deserializer); deserializer.end(); transform_result_sse::<_, ()>((move || { - let output_ok = Result::<_, ()>::Ok(crate::api::api::dup_daemon_desk(api_state))?; + let mut api_wrapped_guard = None; + let decode_indices_ = + flutter_rust_bridge::for_generated::lockable_compute_decode_order(vec![ + flutter_rust_bridge::for_generated::LockableOrderInfo::new( + &api_wrapped, + 0, + false, + ), + ]); + for i in decode_indices_ { + match i { + 0 => api_wrapped_guard = Some(api_wrapped.lockable_decode_sync_ref()), + _ => unreachable!(), + } + } + let api_wrapped_guard = api_wrapped_guard.unwrap(); + let output_ok = Result::<_, ()>::Ok(crate::api::api::decode_messageproto2( + &*api_wrapped_guard, + ))?; Ok(output_ok) })()) }, ) } -fn wire__crate__api__api__duplicate_user_impl( +fn wire__crate__api__api__decode_messageproto3_impl( ptr_: flutter_rust_bridge::for_generated::PlatformGeneralizedUint8ListPtr, rust_vec_len_: i32, data_len_: i32, ) -> flutter_rust_bridge::for_generated::WireSyncRust2DartSse { FLUTTER_RUST_BRIDGE_HANDLER.wrap_sync::( flutter_rust_bridge::for_generated::TaskInfo { - debug_name: "duplicate_user", + debug_name: "decode_messageproto3", port: None, mode: flutter_rust_bridge::for_generated::FfiCallMode::Sync, }, @@ -4853,40 +4611,43 @@ fn wire__crate__api__api__duplicate_user_impl( }; let mut deserializer = flutter_rust_bridge::for_generated::SseDeserializer::new(message); - let api_user = , + let api_wrapped = >, >>::sse_decode(&mut deserializer); deserializer.end(); transform_result_sse::<_, ()>((move || { - let mut api_user_guard = None; + let mut api_wrapped_guard = None; let decode_indices_ = flutter_rust_bridge::for_generated::lockable_compute_decode_order(vec![ flutter_rust_bridge::for_generated::LockableOrderInfo::new( - &api_user, 0, false, + &api_wrapped, + 0, + false, ), ]); for i in decode_indices_ { match i { - 0 => api_user_guard = Some(api_user.lockable_decode_sync_ref()), + 0 => api_wrapped_guard = Some(api_wrapped.lockable_decode_sync_ref()), _ => unreachable!(), } } - let api_user_guard = api_user_guard.unwrap(); - let output_ok = - Result::<_, ()>::Ok(crate::api::api::duplicate_user(&*api_user_guard))?; + let api_wrapped_guard = api_wrapped_guard.unwrap(); + let output_ok = Result::<_, ()>::Ok(crate::api::api::decode_messageproto3( + &*api_wrapped_guard, + ))?; Ok(output_ok) })()) }, ) } -fn wire__crate__api__api__encode_attachmentmeta_impl( +fn wire__crate__api__api__decode_messageproto4_impl( ptr_: flutter_rust_bridge::for_generated::PlatformGeneralizedUint8ListPtr, rust_vec_len_: i32, data_len_: i32, ) -> flutter_rust_bridge::for_generated::WireSyncRust2DartSse { FLUTTER_RUST_BRIDGE_HANDLER.wrap_sync::( flutter_rust_bridge::for_generated::TaskInfo { - debug_name: "encode_attachmentmeta", + debug_name: "decode_messageproto4", port: None, mode: flutter_rust_bridge::for_generated::FfiCallMode::Sync, }, @@ -4900,28 +4661,46 @@ fn wire__crate__api__api__encode_attachmentmeta_impl( }; let mut deserializer = flutter_rust_bridge::for_generated::SseDeserializer::new(message); - let api_attachmentmeta = - ::sse_decode(&mut deserializer); + let api_wrapped = >, + >>::sse_decode(&mut deserializer); deserializer.end(); transform_result_sse::<_, ()>((move || { - let output_ok = Result::<_, ()>::Ok(crate::api::api::encode_attachmentmeta( - &api_attachmentmeta, + let mut api_wrapped_guard = None; + let decode_indices_ = + flutter_rust_bridge::for_generated::lockable_compute_decode_order(vec![ + flutter_rust_bridge::for_generated::LockableOrderInfo::new( + &api_wrapped, + 0, + false, + ), + ]); + for i in decode_indices_ { + match i { + 0 => api_wrapped_guard = Some(api_wrapped.lockable_decode_sync_ref()), + _ => unreachable!(), + } + } + let api_wrapped_guard = api_wrapped_guard.unwrap(); + let output_ok = Result::<_, ()>::Ok(crate::api::api::decode_messageproto4( + &*api_wrapped_guard, ))?; Ok(output_ok) })()) }, ) } -fn wire__crate__api__api__encode_chatproto_impl( +fn wire__crate__api__api__decode_profile_message_impl( + port_: flutter_rust_bridge::for_generated::MessagePort, ptr_: flutter_rust_bridge::for_generated::PlatformGeneralizedUint8ListPtr, rust_vec_len_: i32, data_len_: i32, -) -> flutter_rust_bridge::for_generated::WireSyncRust2DartSse { - FLUTTER_RUST_BRIDGE_HANDLER.wrap_sync::( +) { + FLUTTER_RUST_BRIDGE_HANDLER.wrap_normal::( flutter_rust_bridge::for_generated::TaskInfo { - debug_name: "encode_chatproto", - port: None, - mode: flutter_rust_bridge::for_generated::FfiCallMode::Sync, + debug_name: "decode_profile_message", + port: Some(port_), + mode: flutter_rust_bridge::for_generated::FfiCallMode::Normal, }, move || { let message = unsafe { @@ -4933,25 +4712,30 @@ fn wire__crate__api__api__encode_chatproto_impl( }; let mut deserializer = flutter_rust_bridge::for_generated::SseDeserializer::new(message); - let api_chat = ::sse_decode(&mut deserializer); + let api_s = ::sse_decode(&mut deserializer); deserializer.end(); - transform_result_sse::<_, ()>((move || { - let output_ok = Result::<_, ()>::Ok(crate::api::api::encode_chatproto(&api_chat))?; - Ok(output_ok) - })()) + move |context| { + transform_result_sse::<_, flutter_rust_bridge::for_generated::anyhow::Error>( + (move || { + let output_ok = crate::api::api::decode_profile_message(api_s)?; + Ok(output_ok) + })(), + ) + } }, ) } -fn wire__crate__api__api__encode_extension_app_impl( +fn wire__crate__api__api__decode_summary_info_impl( + port_: flutter_rust_bridge::for_generated::MessagePort, ptr_: flutter_rust_bridge::for_generated::PlatformGeneralizedUint8ListPtr, rust_vec_len_: i32, data_len_: i32, -) -> flutter_rust_bridge::for_generated::WireSyncRust2DartSse { - FLUTTER_RUST_BRIDGE_HANDLER.wrap_sync::( +) { + FLUTTER_RUST_BRIDGE_HANDLER.wrap_normal::( flutter_rust_bridge::for_generated::TaskInfo { - debug_name: "encode_extension_app", - port: None, - mode: flutter_rust_bridge::for_generated::FfiCallMode::Sync, + debug_name: "decode_summary_info", + port: Some(port_), + mode: flutter_rust_bridge::for_generated::FfiCallMode::Normal, }, move || { let message = unsafe { @@ -4963,26 +4747,27 @@ fn wire__crate__api__api__encode_extension_app_impl( }; let mut deserializer = flutter_rust_bridge::for_generated::SseDeserializer::new(message); - let api_app = ::sse_decode(&mut deserializer); + let api_info = >::sse_decode(&mut deserializer); deserializer.end(); - transform_result_sse::<_, flutter_rust_bridge::for_generated::anyhow::Error>( - (move || { - let output_ok = crate::api::api::encode_extension_app(&api_app)?; + move |context| { + transform_result_sse::<_, ()>((move || { + let output_ok = + Result::<_, ()>::Ok(crate::api::api::decode_summary_info(&api_info))?; Ok(output_ok) - })(), - ) + })()) + } }, ) } -fn wire__crate__api__api__encode_hex_impl( +fn wire__crate__api__api__delete_attachments_impl( port_: flutter_rust_bridge::for_generated::MessagePort, ptr_: flutter_rust_bridge::for_generated::PlatformGeneralizedUint8ListPtr, rust_vec_len_: i32, data_len_: i32, ) { - FLUTTER_RUST_BRIDGE_HANDLER.wrap_normal::( + FLUTTER_RUST_BRIDGE_HANDLER.wrap_async::( flutter_rust_bridge::for_generated::TaskInfo { - debug_name: "encode_hex", + debug_name: "delete_attachments", port: Some(port_), mode: flutter_rust_bridge::for_generated::FfiCallMode::Normal, }, @@ -4996,27 +4781,61 @@ fn wire__crate__api__api__encode_hex_impl( }; let mut deserializer = flutter_rust_bridge::for_generated::SseDeserializer::new(message); - let api_bytes = >::sse_decode(&mut deserializer); + let api_cloud_messages_client = >, + >, + >>::sse_decode(&mut deserializer); + let api_attachments = >::sse_decode(&mut deserializer); deserializer.end(); - move |context| { - transform_result_sse::<_, ()>((move || { - let output_ok = Result::<_, ()>::Ok(crate::api::api::encode_hex(&api_bytes))?; - Ok(output_ok) - })()) + move |context| async move { + transform_result_sse::<_, flutter_rust_bridge::for_generated::anyhow::Error>( + (move || async move { + let mut api_cloud_messages_client_guard = None; + let decode_indices_ = + flutter_rust_bridge::for_generated::lockable_compute_decode_order( + vec![flutter_rust_bridge::for_generated::LockableOrderInfo::new( + &api_cloud_messages_client, + 0, + false, + )], + ); + for i in decode_indices_ { + match i { + 0 => { + api_cloud_messages_client_guard = Some( + api_cloud_messages_client.lockable_decode_async_ref().await, + ) + } + _ => unreachable!(), + } + } + let api_cloud_messages_client_guard = + api_cloud_messages_client_guard.unwrap(); + let output_ok = crate::api::api::delete_attachments( + &*api_cloud_messages_client_guard, + &api_attachments, + ) + .await?; + Ok(output_ok) + })() + .await, + ) } }, ) } -fn wire__crate__api__api__encode_message_info_impl( +fn wire__crate__api__api__delete_beacon_share_impl( + port_: flutter_rust_bridge::for_generated::MessagePort, ptr_: flutter_rust_bridge::for_generated::PlatformGeneralizedUint8ListPtr, rust_vec_len_: i32, data_len_: i32, -) -> flutter_rust_bridge::for_generated::WireSyncRust2DartSse { - FLUTTER_RUST_BRIDGE_HANDLER.wrap_sync::( +) { + FLUTTER_RUST_BRIDGE_HANDLER.wrap_async::( flutter_rust_bridge::for_generated::TaskInfo { - debug_name: "encode_message_info", - port: None, - mode: flutter_rust_bridge::for_generated::FfiCallMode::Sync, + debug_name: "delete_beacon_share", + port: Some(port_), + mode: flutter_rust_bridge::for_generated::FfiCallMode::Normal, }, move || { let message = unsafe { @@ -5028,26 +4847,55 @@ fn wire__crate__api__api__encode_message_info_impl( }; let mut deserializer = flutter_rust_bridge::for_generated::SseDeserializer::new(message); - let api_info = ::sse_decode(&mut deserializer); + let api_items = >, + >, + >>::sse_decode(&mut deserializer); + let api_share = ::sse_decode(&mut deserializer); deserializer.end(); - transform_result_sse::<_, ()>((move || { - let output_ok = - Result::<_, ()>::Ok(crate::api::api::encode_message_info(&api_info))?; - Ok(output_ok) - })()) + move |context| async move { + transform_result_sse::<_, flutter_rust_bridge::for_generated::anyhow::Error>( + (move || async move { + let mut api_items_guard = None; + let decode_indices_ = + flutter_rust_bridge::for_generated::lockable_compute_decode_order( + vec![flutter_rust_bridge::for_generated::LockableOrderInfo::new( + &api_items, 0, false, + )], + ); + for i in decode_indices_ { + match i { + 0 => { + api_items_guard = + Some(api_items.lockable_decode_async_ref().await) + } + _ => unreachable!(), + } + } + let api_items_guard = api_items_guard.unwrap(); + let output_ok = + crate::api::api::delete_beacon_share(&*api_items_guard, api_share) + .await?; + Ok(output_ok) + })() + .await, + ) + } }, ) } -fn wire__crate__api__api__encode_messageproto_impl( +fn wire__crate__api__api__delete_chats_impl( + port_: flutter_rust_bridge::for_generated::MessagePort, ptr_: flutter_rust_bridge::for_generated::PlatformGeneralizedUint8ListPtr, rust_vec_len_: i32, data_len_: i32, -) -> flutter_rust_bridge::for_generated::WireSyncRust2DartSse { - FLUTTER_RUST_BRIDGE_HANDLER.wrap_sync::( +) { + FLUTTER_RUST_BRIDGE_HANDLER.wrap_async::( flutter_rust_bridge::for_generated::TaskInfo { - debug_name: "encode_messageproto", - port: None, - mode: flutter_rust_bridge::for_generated::FfiCallMode::Sync, + debug_name: "delete_chats", + port: Some(port_), + mode: flutter_rust_bridge::for_generated::FfiCallMode::Normal, }, move || { let message = unsafe { @@ -5059,26 +4907,61 @@ fn wire__crate__api__api__encode_messageproto_impl( }; let mut deserializer = flutter_rust_bridge::for_generated::SseDeserializer::new(message); - let api_messageproto = ::sse_decode(&mut deserializer); + let api_cloud_messages_client = >, + >, + >>::sse_decode(&mut deserializer); + let api_chats = >::sse_decode(&mut deserializer); deserializer.end(); - transform_result_sse::<_, ()>((move || { - let output_ok = - Result::<_, ()>::Ok(crate::api::api::encode_messageproto(&api_messageproto))?; - Ok(output_ok) - })()) + move |context| async move { + transform_result_sse::<_, flutter_rust_bridge::for_generated::anyhow::Error>( + (move || async move { + let mut api_cloud_messages_client_guard = None; + let decode_indices_ = + flutter_rust_bridge::for_generated::lockable_compute_decode_order( + vec![flutter_rust_bridge::for_generated::LockableOrderInfo::new( + &api_cloud_messages_client, + 0, + false, + )], + ); + for i in decode_indices_ { + match i { + 0 => { + api_cloud_messages_client_guard = Some( + api_cloud_messages_client.lockable_decode_async_ref().await, + ) + } + _ => unreachable!(), + } + } + let api_cloud_messages_client_guard = + api_cloud_messages_client_guard.unwrap(); + let output_ok = crate::api::api::delete_chats( + &*api_cloud_messages_client_guard, + &api_chats, + ) + .await?; + Ok(output_ok) + })() + .await, + ) + } }, ) } -fn wire__crate__api__api__encode_messageproto2_impl( +fn wire__crate__api__api__delete_group_impl( + port_: flutter_rust_bridge::for_generated::MessagePort, ptr_: flutter_rust_bridge::for_generated::PlatformGeneralizedUint8ListPtr, rust_vec_len_: i32, data_len_: i32, -) -> flutter_rust_bridge::for_generated::WireSyncRust2DartSse { - FLUTTER_RUST_BRIDGE_HANDLER.wrap_sync::( +) { + FLUTTER_RUST_BRIDGE_HANDLER.wrap_async::( flutter_rust_bridge::for_generated::TaskInfo { - debug_name: "encode_messageproto2", - port: None, - mode: flutter_rust_bridge::for_generated::FfiCallMode::Sync, + debug_name: "delete_group", + port: Some(port_), + mode: flutter_rust_bridge::for_generated::FfiCallMode::Normal, }, move || { let message = unsafe { @@ -5090,147 +4973,46 @@ fn wire__crate__api__api__encode_messageproto2_impl( }; let mut deserializer = flutter_rust_bridge::for_generated::SseDeserializer::new(message); - let api_messageproto2 = ::sse_decode(&mut deserializer); + let api_passwords = >, + >, + >>::sse_decode(&mut deserializer); + let api_gid = ::sse_decode(&mut deserializer); deserializer.end(); - transform_result_sse::<_, ()>((move || { - let output_ok = - Result::<_, ()>::Ok(crate::api::api::encode_messageproto2(&api_messageproto2))?; - Ok(output_ok) - })()) - }, - ) -} -fn wire__crate__api__api__encode_messageproto3_impl( - ptr_: flutter_rust_bridge::for_generated::PlatformGeneralizedUint8ListPtr, - rust_vec_len_: i32, - data_len_: i32, -) -> flutter_rust_bridge::for_generated::WireSyncRust2DartSse { - FLUTTER_RUST_BRIDGE_HANDLER.wrap_sync::( - flutter_rust_bridge::for_generated::TaskInfo { - debug_name: "encode_messageproto3", - port: None, - mode: flutter_rust_bridge::for_generated::FfiCallMode::Sync, - }, - move || { - let message = unsafe { - flutter_rust_bridge::for_generated::Dart2RustMessageSse::from_wire( - ptr_, - rust_vec_len_, - data_len_, - ) - }; - let mut deserializer = - flutter_rust_bridge::for_generated::SseDeserializer::new(message); - let api_messageproto3 = ::sse_decode(&mut deserializer); - deserializer.end(); - transform_result_sse::<_, ()>((move || { - let output_ok = - Result::<_, ()>::Ok(crate::api::api::encode_messageproto3(&api_messageproto3))?; - Ok(output_ok) - })()) - }, - ) -} -fn wire__crate__api__api__encode_messageproto4_impl( - ptr_: flutter_rust_bridge::for_generated::PlatformGeneralizedUint8ListPtr, - rust_vec_len_: i32, - data_len_: i32, -) -> flutter_rust_bridge::for_generated::WireSyncRust2DartSse { - FLUTTER_RUST_BRIDGE_HANDLER.wrap_sync::( - flutter_rust_bridge::for_generated::TaskInfo { - debug_name: "encode_messageproto4", - port: None, - mode: flutter_rust_bridge::for_generated::FfiCallMode::Sync, - }, - move || { - let message = unsafe { - flutter_rust_bridge::for_generated::Dart2RustMessageSse::from_wire( - ptr_, - rust_vec_len_, - data_len_, - ) - }; - let mut deserializer = - flutter_rust_bridge::for_generated::SseDeserializer::new(message); - let api_messageproto4 = ::sse_decode(&mut deserializer); - deserializer.end(); - transform_result_sse::<_, ()>((move || { - let output_ok = - Result::<_, ()>::Ok(crate::api::api::encode_messageproto4(&api_messageproto4))?; - Ok(output_ok) - })()) - }, - ) -} -fn wire__crate__api__api__encode_profile_message_impl( - port_: flutter_rust_bridge::for_generated::MessagePort, - ptr_: flutter_rust_bridge::for_generated::PlatformGeneralizedUint8ListPtr, - rust_vec_len_: i32, - data_len_: i32, -) { - FLUTTER_RUST_BRIDGE_HANDLER.wrap_normal::( - flutter_rust_bridge::for_generated::TaskInfo { - debug_name: "encode_profile_message", - port: Some(port_), - mode: flutter_rust_bridge::for_generated::FfiCallMode::Normal, - }, - move || { - let message = unsafe { - flutter_rust_bridge::for_generated::Dart2RustMessageSse::from_wire( - ptr_, - rust_vec_len_, - data_len_, - ) - }; - let mut deserializer = - flutter_rust_bridge::for_generated::SseDeserializer::new(message); - let api_p = ::sse_decode(&mut deserializer); - deserializer.end(); - move |context| { - transform_result_sse::<_, ()>((move || { - let output_ok = - Result::<_, ()>::Ok(crate::api::api::encode_profile_message(&api_p))?; - Ok(output_ok) - })()) - } - }, - ) -} -fn wire__crate__api__api__encode_summary_info_impl( - port_: flutter_rust_bridge::for_generated::MessagePort, - ptr_: flutter_rust_bridge::for_generated::PlatformGeneralizedUint8ListPtr, - rust_vec_len_: i32, - data_len_: i32, -) { - FLUTTER_RUST_BRIDGE_HANDLER.wrap_normal::( - flutter_rust_bridge::for_generated::TaskInfo { - debug_name: "encode_summary_info", - port: Some(port_), - mode: flutter_rust_bridge::for_generated::FfiCallMode::Normal, - }, - move || { - let message = unsafe { - flutter_rust_bridge::for_generated::Dart2RustMessageSse::from_wire( - ptr_, - rust_vec_len_, - data_len_, + move |context| async move { + transform_result_sse::<_, flutter_rust_bridge::for_generated::anyhow::Error>( + (move || async move { + let mut api_passwords_guard = None; + let decode_indices_ = + flutter_rust_bridge::for_generated::lockable_compute_decode_order( + vec![flutter_rust_bridge::for_generated::LockableOrderInfo::new( + &api_passwords, + 0, + false, + )], + ); + for i in decode_indices_ { + match i { + 0 => { + api_passwords_guard = + Some(api_passwords.lockable_decode_async_ref().await) + } + _ => unreachable!(), + } + } + let api_passwords_guard = api_passwords_guard.unwrap(); + let output_ok = + crate::api::api::delete_group(&*api_passwords_guard, api_gid).await?; + Ok(output_ok) + })() + .await, ) - }; - let mut deserializer = - flutter_rust_bridge::for_generated::SseDeserializer::new(message); - let api_info = ::sse_decode(&mut deserializer); - deserializer.end(); - move |context| { - transform_result_sse::<_, ()>((move || { - let output_ok = - Result::<_, ()>::Ok(crate::api::api::encode_summary_info(&api_info))?; - Ok(output_ok) - })()) } }, ) } -fn wire__crate__api__api__fetch_profile_impl( +fn wire__crate__api__api__delete_messages_impl( port_: flutter_rust_bridge::for_generated::MessagePort, ptr_: flutter_rust_bridge::for_generated::PlatformGeneralizedUint8ListPtr, rust_vec_len_: i32, @@ -5238,7 +5020,7 @@ fn wire__crate__api__api__fetch_profile_impl( ) { FLUTTER_RUST_BRIDGE_HANDLER.wrap_async::( flutter_rust_bridge::for_generated::TaskInfo { - debug_name: "fetch_profile", + debug_name: "delete_messages", port: Some(port_), mode: flutter_rust_bridge::for_generated::FfiCallMode::Normal, }, @@ -5252,21 +5034,21 @@ fn wire__crate__api__api__fetch_profile_impl( }; let mut deserializer = flutter_rust_bridge::for_generated::SseDeserializer::new(message); - let api_profiles = >, + Arc>, >, >>::sse_decode(&mut deserializer); - let api_message = ::sse_decode(&mut deserializer); + let api_messages = >::sse_decode(&mut deserializer); deserializer.end(); move |context| async move { transform_result_sse::<_, flutter_rust_bridge::for_generated::anyhow::Error>( (move || async move { - let mut api_profiles_guard = None; + let mut api_cloud_messages_client_guard = None; let decode_indices_ = flutter_rust_bridge::for_generated::lockable_compute_decode_order( vec![flutter_rust_bridge::for_generated::LockableOrderInfo::new( - &api_profiles, + &api_cloud_messages_client, 0, false, )], @@ -5274,16 +5056,20 @@ fn wire__crate__api__api__fetch_profile_impl( for i in decode_indices_ { match i { 0 => { - api_profiles_guard = - Some(api_profiles.lockable_decode_async_ref().await) + api_cloud_messages_client_guard = Some( + api_cloud_messages_client.lockable_decode_async_ref().await, + ) } _ => unreachable!(), } } - let api_profiles_guard = api_profiles_guard.unwrap(); - let output_ok = - crate::api::api::fetch_profile(&*api_profiles_guard, &api_message) - .await?; + let api_cloud_messages_client_guard = + api_cloud_messages_client_guard.unwrap(); + let output_ok = crate::api::api::delete_messages( + &*api_cloud_messages_client_guard, + &api_messages, + ) + .await?; Ok(output_ok) })() .await, @@ -5292,48 +5078,15 @@ fn wire__crate__api__api__fetch_profile_impl( }, ) } -fn wire__crate__api__api__ffi_file_packager_default_impl( - port_: flutter_rust_bridge::for_generated::MessagePort, - ptr_: flutter_rust_bridge::for_generated::PlatformGeneralizedUint8ListPtr, - rust_vec_len_: i32, - data_len_: i32, -) { - FLUTTER_RUST_BRIDGE_HANDLER.wrap_normal::( - flutter_rust_bridge::for_generated::TaskInfo { - debug_name: "ffi_file_packager_default", - port: Some(port_), - mode: flutter_rust_bridge::for_generated::FfiCallMode::Normal, - }, - move || { - let message = unsafe { - flutter_rust_bridge::for_generated::Dart2RustMessageSse::from_wire( - ptr_, - rust_vec_len_, - data_len_, - ) - }; - let mut deserializer = - flutter_rust_bridge::for_generated::SseDeserializer::new(message); - deserializer.end(); - move |context| { - transform_result_sse::<_, ()>((move || { - let output_ok = - Result::<_, ()>::Ok(crate::api::api::FFIFilePackager::default())?; - Ok(output_ok) - })()) - } - }, - ) -} -fn wire__crate__api__api__from_poster_impl( +fn wire__crate__api__api__delete_passkey_impl( port_: flutter_rust_bridge::for_generated::MessagePort, ptr_: flutter_rust_bridge::for_generated::PlatformGeneralizedUint8ListPtr, rust_vec_len_: i32, data_len_: i32, ) { - FLUTTER_RUST_BRIDGE_HANDLER.wrap_normal::( + FLUTTER_RUST_BRIDGE_HANDLER.wrap_async::( flutter_rust_bridge::for_generated::TaskInfo { - debug_name: "from_poster", + debug_name: "delete_passkey", port: Some(port_), mode: flutter_rust_bridge::for_generated::FfiCallMode::Normal, }, @@ -5347,29 +5100,59 @@ fn wire__crate__api__api__from_poster_impl( }; let mut deserializer = flutter_rust_bridge::for_generated::SseDeserializer::new(message); - let api_poster = - ::sse_decode(&mut deserializer); + let api_passwords = >, + >, + >>::sse_decode(&mut deserializer); + let api_id = ::sse_decode(&mut deserializer); + let api_group = >::sse_decode(&mut deserializer); deserializer.end(); - move |context| { + move |context| async move { transform_result_sse::<_, flutter_rust_bridge::for_generated::anyhow::Error>( - (move || { - let output_ok = crate::api::api::from_poster(api_poster)?; + (move || async move { + let mut api_passwords_guard = None; + let decode_indices_ = + flutter_rust_bridge::for_generated::lockable_compute_decode_order( + vec![flutter_rust_bridge::for_generated::LockableOrderInfo::new( + &api_passwords, + 0, + false, + )], + ); + for i in decode_indices_ { + match i { + 0 => { + api_passwords_guard = + Some(api_passwords.lockable_decode_async_ref().await) + } + _ => unreachable!(), + } + } + let api_passwords_guard = api_passwords_guard.unwrap(); + let output_ok = crate::api::api::delete_passkey( + &*api_passwords_guard, + api_id, + api_group, + ) + .await?; Ok(output_ok) - })(), + })() + .await, ) } }, ) } -fn wire__crate__api__api__from_poster_save_impl( +fn wire__crate__api__api__delete_password_impl( port_: flutter_rust_bridge::for_generated::MessagePort, ptr_: flutter_rust_bridge::for_generated::PlatformGeneralizedUint8ListPtr, rust_vec_len_: i32, data_len_: i32, ) { - FLUTTER_RUST_BRIDGE_HANDLER.wrap_normal::( + FLUTTER_RUST_BRIDGE_HANDLER.wrap_async::( flutter_rust_bridge::for_generated::TaskInfo { - debug_name: "from_poster_save", + debug_name: "delete_password", port: Some(port_), mode: flutter_rust_bridge::for_generated::FfiCallMode::Normal, }, @@ -5383,28 +5166,59 @@ fn wire__crate__api__api__from_poster_save_impl( }; let mut deserializer = flutter_rust_bridge::for_generated::SseDeserializer::new(message); - let api_poster = >::sse_decode(&mut deserializer); + let api_passwords = >, + >, + >>::sse_decode(&mut deserializer); + let api_id = ::sse_decode(&mut deserializer); + let api_group = >::sse_decode(&mut deserializer); deserializer.end(); - move |context| { + move |context| async move { transform_result_sse::<_, flutter_rust_bridge::for_generated::anyhow::Error>( - (move || { - let output_ok = crate::api::api::from_poster_save(api_poster)?; + (move || async move { + let mut api_passwords_guard = None; + let decode_indices_ = + flutter_rust_bridge::for_generated::lockable_compute_decode_order( + vec![flutter_rust_bridge::for_generated::LockableOrderInfo::new( + &api_passwords, + 0, + false, + )], + ); + for i in decode_indices_ { + match i { + 0 => { + api_passwords_guard = + Some(api_passwords.lockable_decode_async_ref().await) + } + _ => unreachable!(), + } + } + let api_passwords_guard = api_passwords_guard.unwrap(); + let output_ok = crate::api::api::delete_password( + &*api_passwords_guard, + api_id, + api_group, + ) + .await?; Ok(output_ok) - })(), + })() + .await, ) } }, ) } -fn wire__crate__api__api__from_transcript_poster_save_impl( +fn wire__crate__api__api__delete_password_meta_impl( port_: flutter_rust_bridge::for_generated::MessagePort, ptr_: flutter_rust_bridge::for_generated::PlatformGeneralizedUint8ListPtr, rust_vec_len_: i32, data_len_: i32, ) { - FLUTTER_RUST_BRIDGE_HANDLER.wrap_normal::( + FLUTTER_RUST_BRIDGE_HANDLER.wrap_async::( flutter_rust_bridge::for_generated::TaskInfo { - debug_name: "from_transcript_poster_save", + debug_name: "delete_password_meta", port: Some(port_), mode: flutter_rust_bridge::for_generated::FfiCallMode::Normal, }, @@ -5418,20 +5232,51 @@ fn wire__crate__api__api__from_transcript_poster_save_impl( }; let mut deserializer = flutter_rust_bridge::for_generated::SseDeserializer::new(message); - let api_poster = >::sse_decode(&mut deserializer); + let api_passwords = >, + >, + >>::sse_decode(&mut deserializer); + let api_id = ::sse_decode(&mut deserializer); + let api_group = >::sse_decode(&mut deserializer); deserializer.end(); - move |context| { + move |context| async move { transform_result_sse::<_, flutter_rust_bridge::for_generated::anyhow::Error>( - (move || { - let output_ok = crate::api::api::from_transcript_poster_save(api_poster)?; + (move || async move { + let mut api_passwords_guard = None; + let decode_indices_ = + flutter_rust_bridge::for_generated::lockable_compute_decode_order( + vec![flutter_rust_bridge::for_generated::LockableOrderInfo::new( + &api_passwords, + 0, + false, + )], + ); + for i in decode_indices_ { + match i { + 0 => { + api_passwords_guard = + Some(api_passwords.lockable_decode_async_ref().await) + } + _ => unreachable!(), + } + } + let api_passwords_guard = api_passwords_guard.unwrap(); + let output_ok = crate::api::api::delete_password_meta( + &*api_passwords_guard, + api_id, + api_group, + ) + .await?; Ok(output_ok) - })(), + })() + .await, ) } }, ) } -fn wire__crate__api__api__ft_sessions_impl( +fn wire__crate__api__api__delete_wifi_password_impl( port_: flutter_rust_bridge::for_generated::MessagePort, ptr_: flutter_rust_bridge::for_generated::PlatformGeneralizedUint8ListPtr, rust_vec_len_: i32, @@ -5439,7 +5284,7 @@ fn wire__crate__api__api__ft_sessions_impl( ) { FLUTTER_RUST_BRIDGE_HANDLER.wrap_async::( flutter_rust_bridge::for_generated::TaskInfo { - debug_name: "ft_sessions", + debug_name: "delete_wifi_password", port: Some(port_), mode: flutter_rust_bridge::for_generated::FfiCallMode::Normal, }, @@ -5453,18 +5298,22 @@ fn wire__crate__api__api__ft_sessions_impl( }; let mut deserializer = flutter_rust_bridge::for_generated::SseDeserializer::new(message); - let api_facetime = >, + let api_passwords = >, + >, >>::sse_decode(&mut deserializer); + let api_id = ::sse_decode(&mut deserializer); + let api_group = >::sse_decode(&mut deserializer); deserializer.end(); move |context| async move { transform_result_sse::<_, flutter_rust_bridge::for_generated::anyhow::Error>( (move || async move { - let mut api_facetime_guard = None; + let mut api_passwords_guard = None; let decode_indices_ = flutter_rust_bridge::for_generated::lockable_compute_decode_order( vec![flutter_rust_bridge::for_generated::LockableOrderInfo::new( - &api_facetime, + &api_passwords, 0, false, )], @@ -5472,14 +5321,19 @@ fn wire__crate__api__api__ft_sessions_impl( for i in decode_indices_ { match i { 0 => { - api_facetime_guard = - Some(api_facetime.lockable_decode_async_ref().await) + api_passwords_guard = + Some(api_passwords.lockable_decode_async_ref().await) } _ => unreachable!(), } } - let api_facetime_guard = api_facetime_guard.unwrap(); - let output_ok = crate::api::api::ft_sessions(&*api_facetime_guard).await?; + let api_passwords_guard = api_passwords_guard.unwrap(); + let output_ok = crate::api::api::delete_wifi_password( + &*api_passwords_guard, + api_id, + api_group, + ) + .await?; Ok(output_ok) })() .await, @@ -5488,7 +5342,7 @@ fn wire__crate__api__api__ft_sessions_impl( }, ) } -fn wire__crate__api__api__generate_udid_impl( +fn wire__crate__api__api__do_first_time_init_impl( port_: flutter_rust_bridge::for_generated::MessagePort, ptr_: flutter_rust_bridge::for_generated::PlatformGeneralizedUint8ListPtr, rust_vec_len_: i32, @@ -5496,7 +5350,7 @@ fn wire__crate__api__api__generate_udid_impl( ) { FLUTTER_RUST_BRIDGE_HANDLER.wrap_normal::( flutter_rust_bridge::for_generated::TaskInfo { - debug_name: "generate_udid", + debug_name: "do_first_time_init", port: Some(port_), mode: flutter_rust_bridge::for_generated::FfiCallMode::Normal, }, @@ -5510,17 +5364,20 @@ fn wire__crate__api__api__generate_udid_impl( }; let mut deserializer = flutter_rust_bridge::for_generated::SseDeserializer::new(message); + let api_path = ::sse_decode(&mut deserializer); deserializer.end(); move |context| { transform_result_sse::<_, ()>((move || { - let output_ok = Result::<_, ()>::Ok(crate::api::api::generate_udid())?; + let output_ok = Result::<_, ()>::Ok({ + crate::api::api::do_first_time_init(api_path); + })?; Ok(output_ok) })()) } }, ) } -fn wire__crate__api__api__get_2fa_code_impl( +fn wire__crate__api__api__do_login_impl( port_: flutter_rust_bridge::for_generated::MessagePort, ptr_: flutter_rust_bridge::for_generated::PlatformGeneralizedUint8ListPtr, rust_vec_len_: i32, @@ -5528,7 +5385,7 @@ fn wire__crate__api__api__get_2fa_code_impl( ) { FLUTTER_RUST_BRIDGE_HANDLER.wrap_async::( flutter_rust_bridge::for_generated::TaskInfo { - debug_name: "get_2fa_code", + debug_name: "do_login", port: Some(port_), mode: flutter_rust_bridge::for_generated::FfiCallMode::Normal, }, @@ -5542,35 +5399,60 @@ fn wire__crate__api__api__get_2fa_code_impl( }; let mut deserializer = flutter_rust_bridge::for_generated::SseDeserializer::new(message); - let api_anisette = ::sse_decode(&mut deserializer); + let api_account = , + Arc>>, >, >>::sse_decode(&mut deserializer); + let api_finish = + >::sse_decode(&mut deserializer); + let api_os_config = , + >>::sse_decode(&mut deserializer); deserializer.end(); move |context| async move { transform_result_sse::<_, flutter_rust_bridge::for_generated::anyhow::Error>( (move || async move { - let mut api_anisette_guard = None; + let mut api_account_guard = None; + let mut api_os_config_guard = None; let decode_indices_ = flutter_rust_bridge::for_generated::lockable_compute_decode_order( - vec![flutter_rust_bridge::for_generated::LockableOrderInfo::new( - &api_anisette, - 0, - false, - )], + vec![ + flutter_rust_bridge::for_generated::LockableOrderInfo::new( + &api_account, + 0, + false, + ), + flutter_rust_bridge::for_generated::LockableOrderInfo::new( + &api_os_config, + 1, + false, + ), + ], ); for i in decode_indices_ { match i { 0 => { - api_anisette_guard = - Some(api_anisette.lockable_decode_async_ref().await) + api_account_guard = + Some(api_account.lockable_decode_async_ref().await) + } + 1 => { + api_os_config_guard = + Some(api_os_config.lockable_decode_async_ref().await) } _ => unreachable!(), } } - let api_anisette_guard = api_anisette_guard.unwrap(); - let output_ok = crate::api::api::get_2fa_code(&*api_anisette_guard).await?; + let api_account_guard = api_account_guard.unwrap(); + let api_os_config_guard = api_os_config_guard.unwrap(); + let output_ok = crate::api::api::do_login( + api_path, + &*api_account_guard, + api_finish, + &*api_os_config_guard, + ) + .await?; Ok(output_ok) })() .await, @@ -5579,7 +5461,7 @@ fn wire__crate__api__api__get_2fa_code_impl( }, ) } -fn wire__crate__api__api__get_2fa_sms_opts_impl( +fn wire__crate__api__api__do_reregister_impl( port_: flutter_rust_bridge::for_generated::MessagePort, ptr_: flutter_rust_bridge::for_generated::PlatformGeneralizedUint8ListPtr, rust_vec_len_: i32, @@ -5587,7 +5469,7 @@ fn wire__crate__api__api__get_2fa_sms_opts_impl( ) { FLUTTER_RUST_BRIDGE_HANDLER.wrap_async::( flutter_rust_bridge::for_generated::TaskInfo { - debug_name: "get_2fa_sms_opts", + debug_name: "do_reregister", port: Some(port_), mode: flutter_rust_bridge::for_generated::FfiCallMode::Normal, }, @@ -5602,9 +5484,7 @@ fn wire__crate__api__api__get_2fa_sms_opts_impl( let mut deserializer = flutter_rust_bridge::for_generated::SseDeserializer::new(message); let api_state = >>, - >, + flutter_rust_bridge::for_generated::RustAutoOpaqueInner>, >>::sse_decode(&mut deserializer); deserializer.end(); move |context| async move { @@ -5627,8 +5507,7 @@ fn wire__crate__api__api__get_2fa_sms_opts_impl( } } let api_state_guard = api_state_guard.unwrap(); - let output_ok = - crate::api::api::get_2fa_sms_opts(&*api_state_guard).await?; + let output_ok = crate::api::api::do_reregister(&*api_state_guard).await?; Ok(output_ok) })() .await, @@ -5637,7 +5516,7 @@ fn wire__crate__api__api__get_2fa_sms_opts_impl( }, ) } -fn wire__crate__api__api__get_albums_impl( +fn wire__crate__api__api__download_attachment_impl( port_: flutter_rust_bridge::for_generated::MessagePort, ptr_: flutter_rust_bridge::for_generated::PlatformGeneralizedUint8ListPtr, rust_vec_len_: i32, @@ -5645,7 +5524,7 @@ fn wire__crate__api__api__get_albums_impl( ) { FLUTTER_RUST_BRIDGE_HANDLER.wrap_async::( flutter_rust_bridge::for_generated::TaskInfo { - debug_name: "get_albums", + debug_name: "download_attachment", port: Some(port_), mode: flutter_rust_bridge::for_generated::FfiCallMode::Normal, }, @@ -5659,35 +5538,44 @@ fn wire__crate__api__api__get_albums_impl( }; let mut deserializer = flutter_rust_bridge::for_generated::SseDeserializer::new(message); - let api_lock = , - >, + let api_sink = >::sse_decode(&mut deserializer); - let api_refresh = ::sse_decode(&mut deserializer); + let api_aps = , + >>::sse_decode(&mut deserializer); + let api_attachment = ::sse_decode(&mut deserializer); + let api_path = ::sse_decode(&mut deserializer); deserializer.end(); move |context| async move { - transform_result_sse::<_, flutter_rust_bridge::for_generated::anyhow::Error>( + transform_result_sse::<_, ()>( (move || async move { - let mut api_lock_guard = None; + let mut api_aps_guard = None; let decode_indices_ = flutter_rust_bridge::for_generated::lockable_compute_decode_order( vec![flutter_rust_bridge::for_generated::LockableOrderInfo::new( - &api_lock, 0, false, + &api_aps, 0, false, )], ); for i in decode_indices_ { match i { 0 => { - api_lock_guard = - Some(api_lock.lockable_decode_async_ref().await) + api_aps_guard = Some(api_aps.lockable_decode_async_ref().await) } _ => unreachable!(), } } - let api_lock_guard = api_lock_guard.unwrap(); - let output_ok = - crate::api::api::get_albums(&*api_lock_guard, api_refresh).await?; + let api_aps_guard = api_aps_guard.unwrap(); + let output_ok = Result::<_, ()>::Ok({ + crate::api::api::download_attachment( + api_sink, + &*api_aps_guard, + api_attachment, + api_path, + ) + .await; + })?; Ok(output_ok) })() .await, @@ -5696,7 +5584,7 @@ fn wire__crate__api__api__get_albums_impl( }, ) } -fn wire__crate__api__api__get_anisette_headers_impl( +fn wire__crate__api__api__download_cloud_attachments_impl( port_: flutter_rust_bridge::for_generated::MessagePort, ptr_: flutter_rust_bridge::for_generated::PlatformGeneralizedUint8ListPtr, rust_vec_len_: i32, @@ -5704,7 +5592,7 @@ fn wire__crate__api__api__get_anisette_headers_impl( ) { FLUTTER_RUST_BRIDGE_HANDLER.wrap_async::( flutter_rust_bridge::for_generated::TaskInfo { - debug_name: "get_anisette_headers", + debug_name: "download_cloud_attachments", port: Some(port_), mode: flutter_rust_bridge::for_generated::FfiCallMode::Normal, }, @@ -5718,51 +5606,40 @@ fn wire__crate__api__api__get_anisette_headers_impl( }; let mut deserializer = flutter_rust_bridge::for_generated::SseDeserializer::new(message); - let api_state = , + Arc>, >, >>::sse_decode(&mut deserializer); - let api_config = , - >>::sse_decode(&mut deserializer); + let api_files = >::sse_decode(&mut deserializer); deserializer.end(); move |context| async move { transform_result_sse::<_, flutter_rust_bridge::for_generated::anyhow::Error>( (move || async move { - let mut api_state_guard = None; - let mut api_config_guard = None; + let mut api_cloud_messages_client_guard = None; let decode_indices_ = flutter_rust_bridge::for_generated::lockable_compute_decode_order( - vec![ - flutter_rust_bridge::for_generated::LockableOrderInfo::new( - &api_state, 0, false, - ), - flutter_rust_bridge::for_generated::LockableOrderInfo::new( - &api_config, - 1, - false, - ), - ], + vec![flutter_rust_bridge::for_generated::LockableOrderInfo::new( + &api_cloud_messages_client, + 0, + false, + )], ); for i in decode_indices_ { match i { 0 => { - api_state_guard = - Some(api_state.lockable_decode_async_ref().await) - } - 1 => { - api_config_guard = - Some(api_config.lockable_decode_async_ref().await) + api_cloud_messages_client_guard = Some( + api_cloud_messages_client.lockable_decode_async_ref().await, + ) } _ => unreachable!(), } } - let api_state_guard = api_state_guard.unwrap(); - let api_config_guard = api_config_guard.unwrap(); - let output_ok = crate::api::api::get_anisette_headers( - &*api_state_guard, - &*api_config_guard, + let api_cloud_messages_client_guard = + api_cloud_messages_client_guard.unwrap(); + let output_ok = crate::api::api::download_cloud_attachments( + &*api_cloud_messages_client_guard, + api_files, ) .await?; Ok(output_ok) @@ -5773,37 +5650,7 @@ fn wire__crate__api__api__get_anisette_headers_impl( }, ) } -fn wire__crate__api__api__get_available_user_impl( - ptr_: flutter_rust_bridge::for_generated::PlatformGeneralizedUint8ListPtr, - rust_vec_len_: i32, - data_len_: i32, -) -> flutter_rust_bridge::for_generated::WireSyncRust2DartSse { - FLUTTER_RUST_BRIDGE_HANDLER.wrap_sync::( - flutter_rust_bridge::for_generated::TaskInfo { - debug_name: "get_available_user", - port: None, - mode: flutter_rust_bridge::for_generated::FfiCallMode::Sync, - }, - move || { - let message = unsafe { - flutter_rust_bridge::for_generated::Dart2RustMessageSse::from_wire( - ptr_, - rust_vec_len_, - data_len_, - ) - }; - let mut deserializer = - flutter_rust_bridge::for_generated::SseDeserializer::new(message); - let api_path = ::sse_decode(&mut deserializer); - deserializer.end(); - transform_result_sse::<_, ()>((move || { - let output_ok = Result::<_, ()>::Ok(crate::api::api::get_available_user(api_path))?; - Ok(output_ok) - })()) - }, - ) -} -fn wire__crate__api__api__get_background_following_impl( +fn wire__crate__api__api__download_cloud_group_photos_impl( port_: flutter_rust_bridge::for_generated::MessagePort, ptr_: flutter_rust_bridge::for_generated::PlatformGeneralizedUint8ListPtr, rust_vec_len_: i32, @@ -5811,7 +5658,7 @@ fn wire__crate__api__api__get_background_following_impl( ) { FLUTTER_RUST_BRIDGE_HANDLER.wrap_async::( flutter_rust_bridge::for_generated::TaskInfo { - debug_name: "get_background_following", + debug_name: "download_cloud_group_photos", port: Some(port_), mode: flutter_rust_bridge::for_generated::FfiCallMode::Normal, }, @@ -5825,35 +5672,42 @@ fn wire__crate__api__api__get_background_following_impl( }; let mut deserializer = flutter_rust_bridge::for_generated::SseDeserializer::new(message); - let api_fmfd = >, + Arc>, >, >>::sse_decode(&mut deserializer); + let api_files = >::sse_decode(&mut deserializer); deserializer.end(); move |context| async move { - transform_result_sse::<_, ()>( + transform_result_sse::<_, flutter_rust_bridge::for_generated::anyhow::Error>( (move || async move { - let mut api_fmfd_guard = None; + let mut api_cloud_messages_client_guard = None; let decode_indices_ = flutter_rust_bridge::for_generated::lockable_compute_decode_order( vec![flutter_rust_bridge::for_generated::LockableOrderInfo::new( - &api_fmfd, 0, false, + &api_cloud_messages_client, + 0, + false, )], ); for i in decode_indices_ { match i { 0 => { - api_fmfd_guard = - Some(api_fmfd.lockable_decode_async_ref().await) + api_cloud_messages_client_guard = Some( + api_cloud_messages_client.lockable_decode_async_ref().await, + ) } _ => unreachable!(), } } - let api_fmfd_guard = api_fmfd_guard.unwrap(); - let output_ok = Result::<_, ()>::Ok( - crate::api::api::get_background_following(&*api_fmfd_guard).await, - )?; + let api_cloud_messages_client_guard = + api_cloud_messages_client_guard.unwrap(); + let output_ok = crate::api::api::download_cloud_group_photos( + &*api_cloud_messages_client_guard, + api_files, + ) + .await?; Ok(output_ok) })() .await, @@ -5862,7 +5716,7 @@ fn wire__crate__api__api__get_background_following_impl( }, ) } -fn wire__crate__api__api__get_beacon_items_impl( +fn wire__crate__api__api__download_mmcs_impl( port_: flutter_rust_bridge::for_generated::MessagePort, ptr_: flutter_rust_bridge::for_generated::PlatformGeneralizedUint8ListPtr, rust_vec_len_: i32, @@ -5870,7 +5724,7 @@ fn wire__crate__api__api__get_beacon_items_impl( ) { FLUTTER_RUST_BRIDGE_HANDLER.wrap_async::( flutter_rust_bridge::for_generated::TaskInfo { - debug_name: "get_beacon_items", + debug_name: "download_mmcs", port: Some(port_), mode: flutter_rust_bridge::for_generated::FfiCallMode::Normal, }, @@ -5884,34 +5738,44 @@ fn wire__crate__api__api__get_beacon_items_impl( }; let mut deserializer = flutter_rust_bridge::for_generated::SseDeserializer::new(message); - let api_items = >, - >, + let api_sink = >::sse_decode(&mut deserializer); + let api_aps = , >>::sse_decode(&mut deserializer); + let api_attachment = ::sse_decode(&mut deserializer); + let api_path = ::sse_decode(&mut deserializer); deserializer.end(); move |context| async move { - transform_result_sse::<_, flutter_rust_bridge::for_generated::anyhow::Error>( + transform_result_sse::<_, ()>( (move || async move { - let mut api_items_guard = None; + let mut api_aps_guard = None; let decode_indices_ = flutter_rust_bridge::for_generated::lockable_compute_decode_order( vec![flutter_rust_bridge::for_generated::LockableOrderInfo::new( - &api_items, 0, false, + &api_aps, 0, false, )], ); for i in decode_indices_ { match i { 0 => { - api_items_guard = - Some(api_items.lockable_decode_async_ref().await) + api_aps_guard = Some(api_aps.lockable_decode_async_ref().await) } _ => unreachable!(), } } - let api_items_guard = api_items_guard.unwrap(); - let output_ok = - crate::api::api::get_beacon_items(&*api_items_guard).await?; + let api_aps_guard = api_aps_guard.unwrap(); + let output_ok = Result::<_, ()>::Ok({ + crate::api::api::download_mmcs( + api_sink, + &*api_aps_guard, + api_attachment, + api_path, + ) + .await; + })?; Ok(output_ok) })() .await, @@ -5920,17 +5784,16 @@ fn wire__crate__api__api__get_beacon_items_impl( }, ) } -fn wire__crate__api__api__get_bottles_impl( - port_: flutter_rust_bridge::for_generated::MessagePort, +fn wire__crate__api__api__dup_daemon_desk_impl( ptr_: flutter_rust_bridge::for_generated::PlatformGeneralizedUint8ListPtr, rust_vec_len_: i32, data_len_: i32, -) { - FLUTTER_RUST_BRIDGE_HANDLER.wrap_async::( +) -> flutter_rust_bridge::for_generated::WireSyncRust2DartSse { + FLUTTER_RUST_BRIDGE_HANDLER.wrap_sync::( flutter_rust_bridge::for_generated::TaskInfo { - debug_name: "get_bottles", - port: Some(port_), - mode: flutter_rust_bridge::for_generated::FfiCallMode::Normal, + debug_name: "dup_daemon_desk", + port: None, + mode: flutter_rust_bridge::for_generated::FfiCallMode::Sync, }, move || { let message = unsafe { @@ -5942,54 +5805,25 @@ fn wire__crate__api__api__get_bottles_impl( }; let mut deserializer = flutter_rust_bridge::for_generated::SseDeserializer::new(message); - let api_keychain = >, - >, - >>::sse_decode(&mut deserializer); + let api_state = ::sse_decode(&mut deserializer); deserializer.end(); - move |context| async move { - transform_result_sse::<_, flutter_rust_bridge::for_generated::anyhow::Error>( - (move || async move { - let mut api_keychain_guard = None; - let decode_indices_ = - flutter_rust_bridge::for_generated::lockable_compute_decode_order( - vec![flutter_rust_bridge::for_generated::LockableOrderInfo::new( - &api_keychain, - 0, - false, - )], - ); - for i in decode_indices_ { - match i { - 0 => { - api_keychain_guard = - Some(api_keychain.lockable_decode_async_ref().await) - } - _ => unreachable!(), - } - } - let api_keychain_guard = api_keychain_guard.unwrap(); - let output_ok = crate::api::api::get_bottles(&*api_keychain_guard).await?; - Ok(output_ok) - })() - .await, - ) - } + transform_result_sse::<_, ()>((move || { + let output_ok = Result::<_, ()>::Ok(crate::api::api::dup_daemon_desk(api_state))?; + Ok(output_ok) + })()) }, ) } -fn wire__crate__api__api__get_contacts_headers_impl( - port_: flutter_rust_bridge::for_generated::MessagePort, +fn wire__crate__api__api__duplicate_user_impl( ptr_: flutter_rust_bridge::for_generated::PlatformGeneralizedUint8ListPtr, rust_vec_len_: i32, data_len_: i32, -) { - FLUTTER_RUST_BRIDGE_HANDLER.wrap_async::( +) -> flutter_rust_bridge::for_generated::WireSyncRust2DartSse { + FLUTTER_RUST_BRIDGE_HANDLER.wrap_sync::( flutter_rust_bridge::for_generated::TaskInfo { - debug_name: "get_contacts_headers", - port: Some(port_), - mode: flutter_rust_bridge::for_generated::FfiCallMode::Normal, + debug_name: "duplicate_user", + port: None, + mode: flutter_rust_bridge::for_generated::FfiCallMode::Sync, }, move || { let message = unsafe { @@ -6001,91 +5835,42 @@ fn wire__crate__api__api__get_contacts_headers_impl( }; let mut deserializer = flutter_rust_bridge::for_generated::SseDeserializer::new(message); - let api_path = ::sse_decode(&mut deserializer); - let api_state = , - >, - >>::sse_decode(&mut deserializer); - let api_token_provider = >, - >, - >>::sse_decode(&mut deserializer); - let api_config = , + let api_user = , >>::sse_decode(&mut deserializer); deserializer.end(); - move |context| async move { - transform_result_sse::<_, flutter_rust_bridge::for_generated::anyhow::Error>( - (move || async move { - let mut api_state_guard = None; - let mut api_token_provider_guard = None; - let mut api_config_guard = None; - let decode_indices_ = - flutter_rust_bridge::for_generated::lockable_compute_decode_order( - vec![ - flutter_rust_bridge::for_generated::LockableOrderInfo::new( - &api_state, 0, false, - ), - flutter_rust_bridge::for_generated::LockableOrderInfo::new( - &api_token_provider, - 1, - false, - ), - flutter_rust_bridge::for_generated::LockableOrderInfo::new( - &api_config, - 2, - false, - ), - ], - ); - for i in decode_indices_ { - match i { - 0 => { - api_state_guard = - Some(api_state.lockable_decode_async_ref().await) - } - 1 => { - api_token_provider_guard = - Some(api_token_provider.lockable_decode_async_ref().await) - } - 2 => { - api_config_guard = - Some(api_config.lockable_decode_async_ref().await) - } - _ => unreachable!(), - } - } - let api_state_guard = api_state_guard.unwrap(); - let api_token_provider_guard = api_token_provider_guard.unwrap(); - let api_config_guard = api_config_guard.unwrap(); - let output_ok = crate::api::api::get_contacts_headers( - api_path, - &*api_state_guard, - &*api_token_provider_guard, - &*api_config_guard, - ) - .await?; - Ok(output_ok) - })() - .await, - ) - } + transform_result_sse::<_, ()>((move || { + let mut api_user_guard = None; + let decode_indices_ = + flutter_rust_bridge::for_generated::lockable_compute_decode_order(vec![ + flutter_rust_bridge::for_generated::LockableOrderInfo::new( + &api_user, 0, false, + ), + ]); + for i in decode_indices_ { + match i { + 0 => api_user_guard = Some(api_user.lockable_decode_sync_ref()), + _ => unreachable!(), + } + } + let api_user_guard = api_user_guard.unwrap(); + let output_ok = + Result::<_, ()>::Ok(crate::api::api::duplicate_user(&*api_user_guard))?; + Ok(output_ok) + })()) }, ) } -fn wire__crate__api__api__get_device_info_impl( - port_: flutter_rust_bridge::for_generated::MessagePort, +fn wire__crate__api__api__encode_attachmentmeta_impl( ptr_: flutter_rust_bridge::for_generated::PlatformGeneralizedUint8ListPtr, rust_vec_len_: i32, data_len_: i32, -) { - FLUTTER_RUST_BRIDGE_HANDLER.wrap_normal::( +) -> flutter_rust_bridge::for_generated::WireSyncRust2DartSse { + FLUTTER_RUST_BRIDGE_HANDLER.wrap_sync::( flutter_rust_bridge::for_generated::TaskInfo { - debug_name: "get_device_info", - port: Some(port_), - mode: flutter_rust_bridge::for_generated::FfiCallMode::Normal, + debug_name: "encode_attachmentmeta", + port: None, + mode: flutter_rust_bridge::for_generated::FfiCallMode::Sync, }, move || { let message = unsafe { @@ -6097,48 +5882,28 @@ fn wire__crate__api__api__get_device_info_impl( }; let mut deserializer = flutter_rust_bridge::for_generated::SseDeserializer::new(message); - let api_config = , - >>::sse_decode(&mut deserializer); + let api_attachmentmeta = + ::sse_decode(&mut deserializer); deserializer.end(); - move |context| { - transform_result_sse::<_, flutter_rust_bridge::for_generated::anyhow::Error>( - (move || { - let mut api_config_guard = None; - let decode_indices_ = - flutter_rust_bridge::for_generated::lockable_compute_decode_order( - vec![flutter_rust_bridge::for_generated::LockableOrderInfo::new( - &api_config, - 0, - false, - )], - ); - for i in decode_indices_ { - match i { - 0 => api_config_guard = Some(api_config.lockable_decode_sync_ref()), - _ => unreachable!(), - } - } - let api_config_guard = api_config_guard.unwrap(); - let output_ok = crate::api::api::get_device_info(&*api_config_guard)?; - Ok(output_ok) - })(), - ) - } + transform_result_sse::<_, ()>((move || { + let output_ok = Result::<_, ()>::Ok(crate::api::api::encode_attachmentmeta( + &api_attachmentmeta, + ))?; + Ok(output_ok) + })()) }, ) } -fn wire__crate__api__api__get_devices_impl( - port_: flutter_rust_bridge::for_generated::MessagePort, +fn wire__crate__api__api__encode_chatproto_impl( ptr_: flutter_rust_bridge::for_generated::PlatformGeneralizedUint8ListPtr, rust_vec_len_: i32, data_len_: i32, -) { - FLUTTER_RUST_BRIDGE_HANDLER.wrap_async::( +) -> flutter_rust_bridge::for_generated::WireSyncRust2DartSse { + FLUTTER_RUST_BRIDGE_HANDLER.wrap_sync::( flutter_rust_bridge::for_generated::TaskInfo { - debug_name: "get_devices", - port: Some(port_), - mode: flutter_rust_bridge::for_generated::FfiCallMode::Normal, + debug_name: "encode_chatproto", + port: None, + mode: flutter_rust_bridge::for_generated::FfiCallMode::Sync, }, move || { let message = unsafe { @@ -6150,54 +5915,56 @@ fn wire__crate__api__api__get_devices_impl( }; let mut deserializer = flutter_rust_bridge::for_generated::SseDeserializer::new(message); - let api_client = , - >, - >>::sse_decode(&mut deserializer); + let api_chat = ::sse_decode(&mut deserializer); deserializer.end(); - move |context| async move { - transform_result_sse::<_, ()>( - (move || async move { - let mut api_client_guard = None; - let decode_indices_ = - flutter_rust_bridge::for_generated::lockable_compute_decode_order( - vec![flutter_rust_bridge::for_generated::LockableOrderInfo::new( - &api_client, - 0, - true, - )], - ); - for i in decode_indices_ { - match i { - 0 => { - api_client_guard = - Some(api_client.lockable_decode_async_ref_mut().await) - } - _ => unreachable!(), - } - } - let mut api_client_guard = api_client_guard.unwrap(); - let output_ok = Result::<_, ()>::Ok( - crate::api::api::get_devices(&mut *api_client_guard).await, - )?; - Ok(output_ok) - })() - .await, + transform_result_sse::<_, ()>((move || { + let output_ok = Result::<_, ()>::Ok(crate::api::api::encode_chatproto(&api_chat))?; + Ok(output_ok) + })()) + }, + ) +} +fn wire__crate__api__api__encode_extension_app_impl( + ptr_: flutter_rust_bridge::for_generated::PlatformGeneralizedUint8ListPtr, + rust_vec_len_: i32, + data_len_: i32, +) -> flutter_rust_bridge::for_generated::WireSyncRust2DartSse { + FLUTTER_RUST_BRIDGE_HANDLER.wrap_sync::( + flutter_rust_bridge::for_generated::TaskInfo { + debug_name: "encode_extension_app", + port: None, + mode: flutter_rust_bridge::for_generated::FfiCallMode::Sync, + }, + move || { + let message = unsafe { + flutter_rust_bridge::for_generated::Dart2RustMessageSse::from_wire( + ptr_, + rust_vec_len_, + data_len_, ) - } + }; + let mut deserializer = + flutter_rust_bridge::for_generated::SseDeserializer::new(message); + let api_app = ::sse_decode(&mut deserializer); + deserializer.end(); + transform_result_sse::<_, flutter_rust_bridge::for_generated::anyhow::Error>( + (move || { + let output_ok = crate::api::api::encode_extension_app(&api_app)?; + Ok(output_ok) + })(), + ) }, ) } -fn wire__crate__api__api__get_entitlements_impl( +fn wire__crate__api__api__encode_hex_impl( port_: flutter_rust_bridge::for_generated::MessagePort, ptr_: flutter_rust_bridge::for_generated::PlatformGeneralizedUint8ListPtr, rust_vec_len_: i32, data_len_: i32, ) { - FLUTTER_RUST_BRIDGE_HANDLER.wrap_async::( + FLUTTER_RUST_BRIDGE_HANDLER.wrap_normal::( flutter_rust_bridge::for_generated::TaskInfo { - debug_name: "get_entitlements", + debug_name: "encode_hex", port: Some(port_), mode: flutter_rust_bridge::for_generated::FfiCallMode::Normal, }, @@ -6211,80 +5978,27 @@ fn wire__crate__api__api__get_entitlements_impl( }; let mut deserializer = flutter_rust_bridge::for_generated::SseDeserializer::new(message); - let api_config = , - >>::sse_decode(&mut deserializer); - let api_conn = , - >>::sse_decode(&mut deserializer); - let api_mccmnc = ::sse_decode(&mut deserializer); - let api_subscriber = ::sse_decode(&mut deserializer); - let api_imei = ::sse_decode(&mut deserializer); - let api_process_challenge = decode_DartFn_Inputs_String_Output_String_AnyhowException( - ::sse_decode(&mut deserializer), - ); + let api_bytes = >::sse_decode(&mut deserializer); deserializer.end(); - move |context| async move { - transform_result_sse::<_, flutter_rust_bridge::for_generated::anyhow::Error>( - (move || async move { - let mut api_config_guard = None; - let mut api_conn_guard = None; - let decode_indices_ = - flutter_rust_bridge::for_generated::lockable_compute_decode_order( - vec![ - flutter_rust_bridge::for_generated::LockableOrderInfo::new( - &api_config, - 0, - false, - ), - flutter_rust_bridge::for_generated::LockableOrderInfo::new( - &api_conn, 1, false, - ), - ], - ); - for i in decode_indices_ { - match i { - 0 => { - api_config_guard = - Some(api_config.lockable_decode_async_ref().await) - } - 1 => { - api_conn_guard = - Some(api_conn.lockable_decode_async_ref().await) - } - _ => unreachable!(), - } - } - let api_config_guard = api_config_guard.unwrap(); - let api_conn_guard = api_conn_guard.unwrap(); - let output_ok = crate::api::api::get_entitlements( - &*api_config_guard, - &*api_conn_guard, - api_mccmnc, - api_subscriber, - api_imei, - api_process_challenge, - ) - .await?; - Ok(output_ok) - })() - .await, - ) + move |context| { + transform_result_sse::<_, ()>((move || { + let output_ok = Result::<_, ()>::Ok(crate::api::api::encode_hex(&api_bytes))?; + Ok(output_ok) + })()) } }, ) } -fn wire__crate__api__api__get_following_impl( - port_: flutter_rust_bridge::for_generated::MessagePort, +fn wire__crate__api__api__encode_message_info_impl( ptr_: flutter_rust_bridge::for_generated::PlatformGeneralizedUint8ListPtr, rust_vec_len_: i32, data_len_: i32, -) { - FLUTTER_RUST_BRIDGE_HANDLER.wrap_async::( +) -> flutter_rust_bridge::for_generated::WireSyncRust2DartSse { + FLUTTER_RUST_BRIDGE_HANDLER.wrap_sync::( flutter_rust_bridge::for_generated::TaskInfo { - debug_name: "get_following", - port: Some(port_), - mode: flutter_rust_bridge::for_generated::FfiCallMode::Normal, + debug_name: "encode_message_info", + port: None, + mode: flutter_rust_bridge::for_generated::FfiCallMode::Sync, }, move || { let message = unsafe { @@ -6296,54 +6010,149 @@ fn wire__crate__api__api__get_following_impl( }; let mut deserializer = flutter_rust_bridge::for_generated::SseDeserializer::new(message); - let api_client = , - >, - >>::sse_decode(&mut deserializer); + let api_info = ::sse_decode(&mut deserializer); deserializer.end(); - move |context| async move { - transform_result_sse::<_, ()>( - (move || async move { - let mut api_client_guard = None; - let decode_indices_ = - flutter_rust_bridge::for_generated::lockable_compute_decode_order( - vec![flutter_rust_bridge::for_generated::LockableOrderInfo::new( - &api_client, - 0, - true, - )], - ); - for i in decode_indices_ { - match i { - 0 => { - api_client_guard = - Some(api_client.lockable_decode_async_ref_mut().await) - } - _ => unreachable!(), - } - } - let mut api_client_guard = api_client_guard.unwrap(); - let output_ok = Result::<_, ()>::Ok( - crate::api::api::get_following(&mut *api_client_guard).await, - )?; - Ok(output_ok) - })() - .await, + transform_result_sse::<_, ()>((move || { + let output_ok = + Result::<_, ()>::Ok(crate::api::api::encode_message_info(&api_info))?; + Ok(output_ok) + })()) + }, + ) +} +fn wire__crate__api__api__encode_messageproto_impl( + ptr_: flutter_rust_bridge::for_generated::PlatformGeneralizedUint8ListPtr, + rust_vec_len_: i32, + data_len_: i32, +) -> flutter_rust_bridge::for_generated::WireSyncRust2DartSse { + FLUTTER_RUST_BRIDGE_HANDLER.wrap_sync::( + flutter_rust_bridge::for_generated::TaskInfo { + debug_name: "encode_messageproto", + port: None, + mode: flutter_rust_bridge::for_generated::FfiCallMode::Sync, + }, + move || { + let message = unsafe { + flutter_rust_bridge::for_generated::Dart2RustMessageSse::from_wire( + ptr_, + rust_vec_len_, + data_len_, ) - } + }; + let mut deserializer = + flutter_rust_bridge::for_generated::SseDeserializer::new(message); + let api_messageproto = ::sse_decode(&mut deserializer); + deserializer.end(); + transform_result_sse::<_, ()>((move || { + let output_ok = + Result::<_, ()>::Ok(crate::api::api::encode_messageproto(&api_messageproto))?; + Ok(output_ok) + })()) }, ) } -fn wire__crate__api__api__get_ft_link_impl( +fn wire__crate__api__api__encode_messageproto2_impl( + ptr_: flutter_rust_bridge::for_generated::PlatformGeneralizedUint8ListPtr, + rust_vec_len_: i32, + data_len_: i32, +) -> flutter_rust_bridge::for_generated::WireSyncRust2DartSse { + FLUTTER_RUST_BRIDGE_HANDLER.wrap_sync::( + flutter_rust_bridge::for_generated::TaskInfo { + debug_name: "encode_messageproto2", + port: None, + mode: flutter_rust_bridge::for_generated::FfiCallMode::Sync, + }, + move || { + let message = unsafe { + flutter_rust_bridge::for_generated::Dart2RustMessageSse::from_wire( + ptr_, + rust_vec_len_, + data_len_, + ) + }; + let mut deserializer = + flutter_rust_bridge::for_generated::SseDeserializer::new(message); + let api_messageproto2 = ::sse_decode(&mut deserializer); + deserializer.end(); + transform_result_sse::<_, ()>((move || { + let output_ok = + Result::<_, ()>::Ok(crate::api::api::encode_messageproto2(&api_messageproto2))?; + Ok(output_ok) + })()) + }, + ) +} +fn wire__crate__api__api__encode_messageproto3_impl( + ptr_: flutter_rust_bridge::for_generated::PlatformGeneralizedUint8ListPtr, + rust_vec_len_: i32, + data_len_: i32, +) -> flutter_rust_bridge::for_generated::WireSyncRust2DartSse { + FLUTTER_RUST_BRIDGE_HANDLER.wrap_sync::( + flutter_rust_bridge::for_generated::TaskInfo { + debug_name: "encode_messageproto3", + port: None, + mode: flutter_rust_bridge::for_generated::FfiCallMode::Sync, + }, + move || { + let message = unsafe { + flutter_rust_bridge::for_generated::Dart2RustMessageSse::from_wire( + ptr_, + rust_vec_len_, + data_len_, + ) + }; + let mut deserializer = + flutter_rust_bridge::for_generated::SseDeserializer::new(message); + let api_messageproto3 = ::sse_decode(&mut deserializer); + deserializer.end(); + transform_result_sse::<_, ()>((move || { + let output_ok = + Result::<_, ()>::Ok(crate::api::api::encode_messageproto3(&api_messageproto3))?; + Ok(output_ok) + })()) + }, + ) +} +fn wire__crate__api__api__encode_messageproto4_impl( + ptr_: flutter_rust_bridge::for_generated::PlatformGeneralizedUint8ListPtr, + rust_vec_len_: i32, + data_len_: i32, +) -> flutter_rust_bridge::for_generated::WireSyncRust2DartSse { + FLUTTER_RUST_BRIDGE_HANDLER.wrap_sync::( + flutter_rust_bridge::for_generated::TaskInfo { + debug_name: "encode_messageproto4", + port: None, + mode: flutter_rust_bridge::for_generated::FfiCallMode::Sync, + }, + move || { + let message = unsafe { + flutter_rust_bridge::for_generated::Dart2RustMessageSse::from_wire( + ptr_, + rust_vec_len_, + data_len_, + ) + }; + let mut deserializer = + flutter_rust_bridge::for_generated::SseDeserializer::new(message); + let api_messageproto4 = ::sse_decode(&mut deserializer); + deserializer.end(); + transform_result_sse::<_, ()>((move || { + let output_ok = + Result::<_, ()>::Ok(crate::api::api::encode_messageproto4(&api_messageproto4))?; + Ok(output_ok) + })()) + }, + ) +} +fn wire__crate__api__api__encode_profile_message_impl( port_: flutter_rust_bridge::for_generated::MessagePort, ptr_: flutter_rust_bridge::for_generated::PlatformGeneralizedUint8ListPtr, rust_vec_len_: i32, data_len_: i32, ) { - FLUTTER_RUST_BRIDGE_HANDLER.wrap_async::( + FLUTTER_RUST_BRIDGE_HANDLER.wrap_normal::( flutter_rust_bridge::for_generated::TaskInfo { - debug_name: "get_ft_link", + debug_name: "encode_profile_message", port: Some(port_), mode: flutter_rust_bridge::for_generated::FfiCallMode::Normal, }, @@ -6357,44 +6166,53 @@ fn wire__crate__api__api__get_ft_link_impl( }; let mut deserializer = flutter_rust_bridge::for_generated::SseDeserializer::new(message); - let api_facetime = >, - >>::sse_decode(&mut deserializer); - let api_usage = ::sse_decode(&mut deserializer); + let api_p = ::sse_decode(&mut deserializer); deserializer.end(); - move |context| async move { - transform_result_sse::<_, flutter_rust_bridge::for_generated::anyhow::Error>( - (move || async move { - let mut api_facetime_guard = None; - let decode_indices_ = - flutter_rust_bridge::for_generated::lockable_compute_decode_order( - vec![flutter_rust_bridge::for_generated::LockableOrderInfo::new( - &api_facetime, - 0, - false, - )], - ); - for i in decode_indices_ { - match i { - 0 => { - api_facetime_guard = - Some(api_facetime.lockable_decode_async_ref().await) - } - _ => unreachable!(), - } - } - let api_facetime_guard = api_facetime_guard.unwrap(); - let output_ok = - crate::api::api::get_ft_link(&*api_facetime_guard, api_usage).await?; - Ok(output_ok) - })() - .await, + move |context| { + transform_result_sse::<_, ()>((move || { + let output_ok = + Result::<_, ()>::Ok(crate::api::api::encode_profile_message(&api_p))?; + Ok(output_ok) + })()) + } + }, + ) +} +fn wire__crate__api__api__encode_summary_info_impl( + port_: flutter_rust_bridge::for_generated::MessagePort, + ptr_: flutter_rust_bridge::for_generated::PlatformGeneralizedUint8ListPtr, + rust_vec_len_: i32, + data_len_: i32, +) { + FLUTTER_RUST_BRIDGE_HANDLER.wrap_normal::( + flutter_rust_bridge::for_generated::TaskInfo { + debug_name: "encode_summary_info", + port: Some(port_), + mode: flutter_rust_bridge::for_generated::FfiCallMode::Normal, + }, + move || { + let message = unsafe { + flutter_rust_bridge::for_generated::Dart2RustMessageSse::from_wire( + ptr_, + rust_vec_len_, + data_len_, ) + }; + let mut deserializer = + flutter_rust_bridge::for_generated::SseDeserializer::new(message); + let api_info = ::sse_decode(&mut deserializer); + deserializer.end(); + move |context| { + transform_result_sse::<_, ()>((move || { + let output_ok = + Result::<_, ()>::Ok(crate::api::api::encode_summary_info(&api_info))?; + Ok(output_ok) + })()) } }, ) } -fn wire__crate__api__api__get_groups_impl( +fn wire__crate__api__api__fetch_profile_impl( port_: flutter_rust_bridge::for_generated::MessagePort, ptr_: flutter_rust_bridge::for_generated::PlatformGeneralizedUint8ListPtr, rust_vec_len_: i32, @@ -6402,7 +6220,7 @@ fn wire__crate__api__api__get_groups_impl( ) { FLUTTER_RUST_BRIDGE_HANDLER.wrap_async::( flutter_rust_bridge::for_generated::TaskInfo { - debug_name: "get_groups", + debug_name: "fetch_profile", port: Some(port_), mode: flutter_rust_bridge::for_generated::FfiCallMode::Normal, }, @@ -6416,20 +6234,21 @@ fn wire__crate__api__api__get_groups_impl( }; let mut deserializer = flutter_rust_bridge::for_generated::SseDeserializer::new(message); - let api_passwords = >, + Arc>, >, >>::sse_decode(&mut deserializer); + let api_message = ::sse_decode(&mut deserializer); deserializer.end(); move |context| async move { transform_result_sse::<_, flutter_rust_bridge::for_generated::anyhow::Error>( (move || async move { - let mut api_passwords_guard = None; + let mut api_profiles_guard = None; let decode_indices_ = flutter_rust_bridge::for_generated::lockable_compute_decode_order( vec![flutter_rust_bridge::for_generated::LockableOrderInfo::new( - &api_passwords, + &api_profiles, 0, false, )], @@ -6437,14 +6256,16 @@ fn wire__crate__api__api__get_groups_impl( for i in decode_indices_ { match i { 0 => { - api_passwords_guard = - Some(api_passwords.lockable_decode_async_ref().await) + api_profiles_guard = + Some(api_profiles.lockable_decode_async_ref().await) } _ => unreachable!(), } } - let api_passwords_guard = api_passwords_guard.unwrap(); - let output_ok = crate::api::api::get_groups(&*api_passwords_guard).await?; + let api_profiles_guard = api_profiles_guard.unwrap(); + let output_ok = + crate::api::api::fetch_profile(&*api_profiles_guard, &api_message) + .await?; Ok(output_ok) })() .await, @@ -6453,15 +6274,15 @@ fn wire__crate__api__api__get_groups_impl( }, ) } -fn wire__crate__api__api__get_handles_impl( +fn wire__crate__api__api__ffi_file_packager_default_impl( port_: flutter_rust_bridge::for_generated::MessagePort, ptr_: flutter_rust_bridge::for_generated::PlatformGeneralizedUint8ListPtr, rust_vec_len_: i32, data_len_: i32, ) { - FLUTTER_RUST_BRIDGE_HANDLER.wrap_async::( + FLUTTER_RUST_BRIDGE_HANDLER.wrap_normal::( flutter_rust_bridge::for_generated::TaskInfo { - debug_name: "get_handles", + debug_name: "ffi_file_packager_default", port: Some(port_), mode: flutter_rust_bridge::for_generated::FfiCallMode::Normal, }, @@ -6475,48 +6296,62 @@ fn wire__crate__api__api__get_handles_impl( }; let mut deserializer = flutter_rust_bridge::for_generated::SseDeserializer::new(message); - let api_state = >, - >>::sse_decode(&mut deserializer); deserializer.end(); - move |context| async move { + move |context| { + transform_result_sse::<_, ()>((move || { + let output_ok = + Result::<_, ()>::Ok(crate::api::api::FFIFilePackager::default())?; + Ok(output_ok) + })()) + } + }, + ) +} +fn wire__crate__api__api__from_poster_impl( + port_: flutter_rust_bridge::for_generated::MessagePort, + ptr_: flutter_rust_bridge::for_generated::PlatformGeneralizedUint8ListPtr, + rust_vec_len_: i32, + data_len_: i32, +) { + FLUTTER_RUST_BRIDGE_HANDLER.wrap_normal::( + flutter_rust_bridge::for_generated::TaskInfo { + debug_name: "from_poster", + port: Some(port_), + mode: flutter_rust_bridge::for_generated::FfiCallMode::Normal, + }, + move || { + let message = unsafe { + flutter_rust_bridge::for_generated::Dart2RustMessageSse::from_wire( + ptr_, + rust_vec_len_, + data_len_, + ) + }; + let mut deserializer = + flutter_rust_bridge::for_generated::SseDeserializer::new(message); + let api_poster = + ::sse_decode(&mut deserializer); + deserializer.end(); + move |context| { transform_result_sse::<_, flutter_rust_bridge::for_generated::anyhow::Error>( - (move || async move { - let mut api_state_guard = None; - let decode_indices_ = - flutter_rust_bridge::for_generated::lockable_compute_decode_order( - vec![flutter_rust_bridge::for_generated::LockableOrderInfo::new( - &api_state, 0, false, - )], - ); - for i in decode_indices_ { - match i { - 0 => { - api_state_guard = - Some(api_state.lockable_decode_async_ref().await) - } - _ => unreachable!(), - } - } - let api_state_guard = api_state_guard.unwrap(); - let output_ok = crate::api::api::get_handles(&*api_state_guard).await?; + (move || { + let output_ok = crate::api::api::from_poster(api_poster)?; Ok(output_ok) - })() - .await, + })(), ) } }, ) } -fn wire__crate__api__api__get_my_phone_handles_impl( +fn wire__crate__api__api__from_poster_save_impl( port_: flutter_rust_bridge::for_generated::MessagePort, ptr_: flutter_rust_bridge::for_generated::PlatformGeneralizedUint8ListPtr, rust_vec_len_: i32, data_len_: i32, ) { - FLUTTER_RUST_BRIDGE_HANDLER.wrap_async::( + FLUTTER_RUST_BRIDGE_HANDLER.wrap_normal::( flutter_rust_bridge::for_generated::TaskInfo { - debug_name: "get_my_phone_handles", + debug_name: "from_poster_save", port: Some(port_), mode: flutter_rust_bridge::for_generated::FfiCallMode::Normal, }, @@ -6530,49 +6365,28 @@ fn wire__crate__api__api__get_my_phone_handles_impl( }; let mut deserializer = flutter_rust_bridge::for_generated::SseDeserializer::new(message); - let api_state = >, - >>::sse_decode(&mut deserializer); + let api_poster = >::sse_decode(&mut deserializer); deserializer.end(); - move |context| async move { + move |context| { transform_result_sse::<_, flutter_rust_bridge::for_generated::anyhow::Error>( - (move || async move { - let mut api_state_guard = None; - let decode_indices_ = - flutter_rust_bridge::for_generated::lockable_compute_decode_order( - vec![flutter_rust_bridge::for_generated::LockableOrderInfo::new( - &api_state, 0, false, - )], - ); - for i in decode_indices_ { - match i { - 0 => { - api_state_guard = - Some(api_state.lockable_decode_async_ref().await) - } - _ => unreachable!(), - } - } - let api_state_guard = api_state_guard.unwrap(); - let output_ok = - crate::api::api::get_my_phone_handles(&*api_state_guard).await?; + (move || { + let output_ok = crate::api::api::from_poster_save(api_poster)?; Ok(output_ok) - })() - .await, + })(), ) } }, ) } -fn wire__crate__api__api__get_passkeys_impl( +fn wire__crate__api__api__from_transcript_poster_save_impl( port_: flutter_rust_bridge::for_generated::MessagePort, ptr_: flutter_rust_bridge::for_generated::PlatformGeneralizedUint8ListPtr, rust_vec_len_: i32, data_len_: i32, ) { - FLUTTER_RUST_BRIDGE_HANDLER.wrap_async::( + FLUTTER_RUST_BRIDGE_HANDLER.wrap_normal::( flutter_rust_bridge::for_generated::TaskInfo { - debug_name: "get_passkeys", + debug_name: "from_transcript_poster_save", port: Some(port_), mode: flutter_rust_bridge::for_generated::FfiCallMode::Normal, }, @@ -6586,46 +6400,20 @@ fn wire__crate__api__api__get_passkeys_impl( }; let mut deserializer = flutter_rust_bridge::for_generated::SseDeserializer::new(message); - let api_passwords = >, - >, - >>::sse_decode(&mut deserializer); + let api_poster = >::sse_decode(&mut deserializer); deserializer.end(); - move |context| async move { - transform_result_sse::<_, ()>( - (move || async move { - let mut api_passwords_guard = None; - let decode_indices_ = - flutter_rust_bridge::for_generated::lockable_compute_decode_order( - vec![flutter_rust_bridge::for_generated::LockableOrderInfo::new( - &api_passwords, - 0, - false, - )], - ); - for i in decode_indices_ { - match i { - 0 => { - api_passwords_guard = - Some(api_passwords.lockable_decode_async_ref().await) - } - _ => unreachable!(), - } - } - let api_passwords_guard = api_passwords_guard.unwrap(); - let output_ok = Result::<_, ()>::Ok( - crate::api::api::get_passkeys(&*api_passwords_guard).await, - )?; + move |context| { + transform_result_sse::<_, flutter_rust_bridge::for_generated::anyhow::Error>( + (move || { + let output_ok = crate::api::api::from_transcript_poster_save(api_poster)?; Ok(output_ok) - })() - .await, + })(), ) } }, ) } -fn wire__crate__api__api__get_passwords_impl( +fn wire__crate__api__api__ft_sessions_impl( port_: flutter_rust_bridge::for_generated::MessagePort, ptr_: flutter_rust_bridge::for_generated::PlatformGeneralizedUint8ListPtr, rust_vec_len_: i32, @@ -6633,7 +6421,7 @@ fn wire__crate__api__api__get_passwords_impl( ) { FLUTTER_RUST_BRIDGE_HANDLER.wrap_async::( flutter_rust_bridge::for_generated::TaskInfo { - debug_name: "get_passwords", + debug_name: "ft_sessions", port: Some(port_), mode: flutter_rust_bridge::for_generated::FfiCallMode::Normal, }, @@ -6647,20 +6435,18 @@ fn wire__crate__api__api__get_passwords_impl( }; let mut deserializer = flutter_rust_bridge::for_generated::SseDeserializer::new(message); - let api_passwords = >, - >, + let api_facetime = >, >>::sse_decode(&mut deserializer); deserializer.end(); move |context| async move { - transform_result_sse::<_, ()>( + transform_result_sse::<_, flutter_rust_bridge::for_generated::anyhow::Error>( (move || async move { - let mut api_passwords_guard = None; + let mut api_facetime_guard = None; let decode_indices_ = flutter_rust_bridge::for_generated::lockable_compute_decode_order( vec![flutter_rust_bridge::for_generated::LockableOrderInfo::new( - &api_passwords, + &api_facetime, 0, false, )], @@ -6668,16 +6454,14 @@ fn wire__crate__api__api__get_passwords_impl( for i in decode_indices_ { match i { 0 => { - api_passwords_guard = - Some(api_passwords.lockable_decode_async_ref().await) + api_facetime_guard = + Some(api_facetime.lockable_decode_async_ref().await) } _ => unreachable!(), } } - let api_passwords_guard = api_passwords_guard.unwrap(); - let output_ok = Result::<_, ()>::Ok( - crate::api::api::get_passwords(&*api_passwords_guard).await, - )?; + let api_facetime_guard = api_facetime_guard.unwrap(); + let output_ok = crate::api::api::ft_sessions(&*api_facetime_guard).await?; Ok(output_ok) })() .await, @@ -6686,15 +6470,15 @@ fn wire__crate__api__api__get_passwords_impl( }, ) } -fn wire__crate__api__api__get_passwords_meta_impl( +fn wire__crate__api__api__generate_udid_impl( port_: flutter_rust_bridge::for_generated::MessagePort, ptr_: flutter_rust_bridge::for_generated::PlatformGeneralizedUint8ListPtr, rust_vec_len_: i32, data_len_: i32, ) { - FLUTTER_RUST_BRIDGE_HANDLER.wrap_async::( + FLUTTER_RUST_BRIDGE_HANDLER.wrap_normal::( flutter_rust_bridge::for_generated::TaskInfo { - debug_name: "get_passwords_meta", + debug_name: "generate_udid", port: Some(port_), mode: flutter_rust_bridge::for_generated::FfiCallMode::Normal, }, @@ -6708,46 +6492,17 @@ fn wire__crate__api__api__get_passwords_meta_impl( }; let mut deserializer = flutter_rust_bridge::for_generated::SseDeserializer::new(message); - let api_passwords = >, - >, - >>::sse_decode(&mut deserializer); deserializer.end(); - move |context| async move { - transform_result_sse::<_, ()>( - (move || async move { - let mut api_passwords_guard = None; - let decode_indices_ = - flutter_rust_bridge::for_generated::lockable_compute_decode_order( - vec![flutter_rust_bridge::for_generated::LockableOrderInfo::new( - &api_passwords, - 0, - false, - )], - ); - for i in decode_indices_ { - match i { - 0 => { - api_passwords_guard = - Some(api_passwords.lockable_decode_async_ref().await) - } - _ => unreachable!(), - } - } - let api_passwords_guard = api_passwords_guard.unwrap(); - let output_ok = Result::<_, ()>::Ok( - crate::api::api::get_passwords_meta(&*api_passwords_guard).await, - )?; - Ok(output_ok) - })() - .await, - ) + move |context| { + transform_result_sse::<_, ()>((move || { + let output_ok = Result::<_, ()>::Ok(crate::api::api::generate_udid())?; + Ok(output_ok) + })()) } }, ) } -fn wire__crate__api__api__get_quota_info_impl( +fn wire__crate__api__api__get_2fa_code_impl( port_: flutter_rust_bridge::for_generated::MessagePort, ptr_: flutter_rust_bridge::for_generated::PlatformGeneralizedUint8ListPtr, rust_vec_len_: i32, @@ -6755,7 +6510,7 @@ fn wire__crate__api__api__get_quota_info_impl( ) { FLUTTER_RUST_BRIDGE_HANDLER.wrap_async::( flutter_rust_bridge::for_generated::TaskInfo { - debug_name: "get_quota_info", + debug_name: "get_2fa_code", port: Some(port_), mode: flutter_rust_bridge::for_generated::FfiCallMode::Normal, }, @@ -6769,33 +6524,35 @@ fn wire__crate__api__api__get_quota_info_impl( }; let mut deserializer = flutter_rust_bridge::for_generated::SseDeserializer::new(message); - let api_info = >, + ArcAnisetteClient, >, >>::sse_decode(&mut deserializer); deserializer.end(); move |context| async move { transform_result_sse::<_, flutter_rust_bridge::for_generated::anyhow::Error>( (move || async move { - let mut api_info_guard = None; + let mut api_anisette_guard = None; let decode_indices_ = flutter_rust_bridge::for_generated::lockable_compute_decode_order( vec![flutter_rust_bridge::for_generated::LockableOrderInfo::new( - &api_info, 0, false, + &api_anisette, + 0, + false, )], ); for i in decode_indices_ { match i { 0 => { - api_info_guard = - Some(api_info.lockable_decode_async_ref().await) + api_anisette_guard = + Some(api_anisette.lockable_decode_async_ref().await) } _ => unreachable!(), } } - let api_info_guard = api_info_guard.unwrap(); - let output_ok = crate::api::api::get_quota_info(&*api_info_guard).await?; + let api_anisette_guard = api_anisette_guard.unwrap(); + let output_ok = crate::api::api::get_2fa_code(&*api_anisette_guard).await?; Ok(output_ok) })() .await, @@ -6804,7 +6561,7 @@ fn wire__crate__api__api__get_quota_info_impl( }, ) } -fn wire__crate__api__api__get_regstate_impl( +fn wire__crate__api__api__get_2fa_sms_opts_impl( port_: flutter_rust_bridge::for_generated::MessagePort, ptr_: flutter_rust_bridge::for_generated::PlatformGeneralizedUint8ListPtr, rust_vec_len_: i32, @@ -6812,7 +6569,7 @@ fn wire__crate__api__api__get_regstate_impl( ) { FLUTTER_RUST_BRIDGE_HANDLER.wrap_async::( flutter_rust_bridge::for_generated::TaskInfo { - debug_name: "get_regstate", + debug_name: "get_2fa_sms_opts", port: Some(port_), mode: flutter_rust_bridge::for_generated::FfiCallMode::Normal, }, @@ -6827,7 +6584,9 @@ fn wire__crate__api__api__get_regstate_impl( let mut deserializer = flutter_rust_bridge::for_generated::SseDeserializer::new(message); let api_state = >, + flutter_rust_bridge::for_generated::RustAutoOpaqueInner< + Arc>>, + >, >>::sse_decode(&mut deserializer); deserializer.end(); move |context| async move { @@ -6850,7 +6609,8 @@ fn wire__crate__api__api__get_regstate_impl( } } let api_state_guard = api_state_guard.unwrap(); - let output_ok = crate::api::api::get_regstate(&*api_state_guard).await?; + let output_ok = + crate::api::api::get_2fa_sms_opts(&*api_state_guard).await?; Ok(output_ok) })() .await, @@ -6859,7 +6619,7 @@ fn wire__crate__api__api__get_regstate_impl( }, ) } -fn wire__crate__api__api__get_sms_targets_impl( +fn wire__crate__api__api__get_albums_impl( port_: flutter_rust_bridge::for_generated::MessagePort, ptr_: flutter_rust_bridge::for_generated::PlatformGeneralizedUint8ListPtr, rust_vec_len_: i32, @@ -6867,7 +6627,7 @@ fn wire__crate__api__api__get_sms_targets_impl( ) { FLUTTER_RUST_BRIDGE_HANDLER.wrap_async::( flutter_rust_bridge::for_generated::TaskInfo { - debug_name: "get_sms_targets", + debug_name: "get_albums", port: Some(port_), mode: flutter_rust_bridge::for_generated::FfiCallMode::Normal, }, @@ -6881,38 +6641,35 @@ fn wire__crate__api__api__get_sms_targets_impl( }; let mut deserializer = flutter_rust_bridge::for_generated::SseDeserializer::new(message); - let api_state = >, + let api_lock = , + >, >>::sse_decode(&mut deserializer); - let api_handle = ::sse_decode(&mut deserializer); let api_refresh = ::sse_decode(&mut deserializer); deserializer.end(); move |context| async move { transform_result_sse::<_, flutter_rust_bridge::for_generated::anyhow::Error>( (move || async move { - let mut api_state_guard = None; + let mut api_lock_guard = None; let decode_indices_ = flutter_rust_bridge::for_generated::lockable_compute_decode_order( vec![flutter_rust_bridge::for_generated::LockableOrderInfo::new( - &api_state, 0, false, + &api_lock, 0, false, )], ); for i in decode_indices_ { match i { 0 => { - api_state_guard = - Some(api_state.lockable_decode_async_ref().await) + api_lock_guard = + Some(api_lock.lockable_decode_async_ref().await) } _ => unreachable!(), } } - let api_state_guard = api_state_guard.unwrap(); - let output_ok = crate::api::api::get_sms_targets( - &*api_state_guard, - api_handle, - api_refresh, - ) - .await?; + let api_lock_guard = api_lock_guard.unwrap(); + let output_ok = + crate::api::api::get_albums(&*api_lock_guard, api_refresh).await?; Ok(output_ok) })() .await, @@ -6921,7 +6678,7 @@ fn wire__crate__api__api__get_sms_targets_impl( }, ) } -fn wire__crate__api__api__get_syncstatus_impl( +fn wire__crate__api__api__get_anisette_headers_impl( port_: flutter_rust_bridge::for_generated::MessagePort, ptr_: flutter_rust_bridge::for_generated::PlatformGeneralizedUint8ListPtr, rust_vec_len_: i32, @@ -6929,7 +6686,7 @@ fn wire__crate__api__api__get_syncstatus_impl( ) { FLUTTER_RUST_BRIDGE_HANDLER.wrap_async::( flutter_rust_bridge::for_generated::TaskInfo { - debug_name: "get_syncstatus", + debug_name: "get_anisette_headers", port: Some(port_), mode: flutter_rust_bridge::for_generated::FfiCallMode::Normal, }, @@ -6943,33 +6700,53 @@ fn wire__crate__api__api__get_syncstatus_impl( }; let mut deserializer = flutter_rust_bridge::for_generated::SseDeserializer::new(message); - let api_lock = , + ArcAnisetteClient, >, >>::sse_decode(&mut deserializer); + let api_config = , + >>::sse_decode(&mut deserializer); deserializer.end(); move |context| async move { transform_result_sse::<_, flutter_rust_bridge::for_generated::anyhow::Error>( (move || async move { - let mut api_lock_guard = None; + let mut api_state_guard = None; + let mut api_config_guard = None; let decode_indices_ = flutter_rust_bridge::for_generated::lockable_compute_decode_order( - vec![flutter_rust_bridge::for_generated::LockableOrderInfo::new( - &api_lock, 0, false, - )], + vec![ + flutter_rust_bridge::for_generated::LockableOrderInfo::new( + &api_state, 0, false, + ), + flutter_rust_bridge::for_generated::LockableOrderInfo::new( + &api_config, + 1, + false, + ), + ], ); for i in decode_indices_ { match i { 0 => { - api_lock_guard = - Some(api_lock.lockable_decode_async_ref().await) + api_state_guard = + Some(api_state.lockable_decode_async_ref().await) + } + 1 => { + api_config_guard = + Some(api_config.lockable_decode_async_ref().await) } _ => unreachable!(), } } - let api_lock_guard = api_lock_guard.unwrap(); - let output_ok = crate::api::api::get_syncstatus(&*api_lock_guard).await?; + let api_state_guard = api_state_guard.unwrap(); + let api_config_guard = api_config_guard.unwrap(); + let output_ok = crate::api::api::get_anisette_headers( + &*api_state_guard, + &*api_config_guard, + ) + .await?; Ok(output_ok) })() .await, @@ -6978,7 +6755,7 @@ fn wire__crate__api__api__get_syncstatus_impl( }, ) } -fn wire__crate__api__api__get_token_impl( +fn wire__crate__api__api__get_aps_connection_status_impl( port_: flutter_rust_bridge::for_generated::MessagePort, ptr_: flutter_rust_bridge::for_generated::PlatformGeneralizedUint8ListPtr, rust_vec_len_: i32, @@ -6986,7 +6763,7 @@ fn wire__crate__api__api__get_token_impl( ) { FLUTTER_RUST_BRIDGE_HANDLER.wrap_async::( flutter_rust_bridge::for_generated::TaskInfo { - debug_name: "get_token", + debug_name: "get_aps_connection_status", port: Some(port_), mode: flutter_rust_bridge::for_generated::FfiCallMode::Normal, }, @@ -7000,32 +6777,31 @@ fn wire__crate__api__api__get_token_impl( }; let mut deserializer = flutter_rust_bridge::for_generated::SseDeserializer::new(message); - let api_state = , >>::sse_decode(&mut deserializer); deserializer.end(); move |context| async move { transform_result_sse::<_, ()>( (move || async move { - let mut api_state_guard = None; + let mut api_aps_guard = None; let decode_indices_ = flutter_rust_bridge::for_generated::lockable_compute_decode_order( vec![flutter_rust_bridge::for_generated::LockableOrderInfo::new( - &api_state, 0, false, + &api_aps, 0, false, )], ); for i in decode_indices_ { match i { 0 => { - api_state_guard = - Some(api_state.lockable_decode_async_ref().await) + api_aps_guard = Some(api_aps.lockable_decode_async_ref().await) } _ => unreachable!(), } } - let api_state_guard = api_state_guard.unwrap(); + let api_aps_guard = api_aps_guard.unwrap(); let output_ok = Result::<_, ()>::Ok( - crate::api::api::get_token(&*api_state_guard).await, + crate::api::api::get_aps_connection_status(&*api_aps_guard).await, )?; Ok(output_ok) })() @@ -7035,7 +6811,37 @@ fn wire__crate__api__api__get_token_impl( }, ) } -fn wire__crate__api__api__get_user_name_impl( +fn wire__crate__api__api__get_available_user_impl( + ptr_: flutter_rust_bridge::for_generated::PlatformGeneralizedUint8ListPtr, + rust_vec_len_: i32, + data_len_: i32, +) -> flutter_rust_bridge::for_generated::WireSyncRust2DartSse { + FLUTTER_RUST_BRIDGE_HANDLER.wrap_sync::( + flutter_rust_bridge::for_generated::TaskInfo { + debug_name: "get_available_user", + port: None, + mode: flutter_rust_bridge::for_generated::FfiCallMode::Sync, + }, + move || { + let message = unsafe { + flutter_rust_bridge::for_generated::Dart2RustMessageSse::from_wire( + ptr_, + rust_vec_len_, + data_len_, + ) + }; + let mut deserializer = + flutter_rust_bridge::for_generated::SseDeserializer::new(message); + let api_path = ::sse_decode(&mut deserializer); + deserializer.end(); + transform_result_sse::<_, ()>((move || { + let output_ok = Result::<_, ()>::Ok(crate::api::api::get_available_user(api_path))?; + Ok(output_ok) + })()) + }, + ) +} +fn wire__crate__api__api__get_background_following_impl( port_: flutter_rust_bridge::for_generated::MessagePort, ptr_: flutter_rust_bridge::for_generated::PlatformGeneralizedUint8ListPtr, rust_vec_len_: i32, @@ -7043,7 +6849,7 @@ fn wire__crate__api__api__get_user_name_impl( ) { FLUTTER_RUST_BRIDGE_HANDLER.wrap_async::( flutter_rust_bridge::for_generated::TaskInfo { - debug_name: "get_user_name", + debug_name: "get_background_following", port: Some(port_), mode: flutter_rust_bridge::for_generated::FfiCallMode::Normal, }, @@ -7057,33 +6863,35 @@ fn wire__crate__api__api__get_user_name_impl( }; let mut deserializer = flutter_rust_bridge::for_generated::SseDeserializer::new(message); - let api_state = >>, + Arc>, >, >>::sse_decode(&mut deserializer); deserializer.end(); move |context| async move { - transform_result_sse::<_, flutter_rust_bridge::for_generated::anyhow::Error>( + transform_result_sse::<_, ()>( (move || async move { - let mut api_state_guard = None; + let mut api_fmfd_guard = None; let decode_indices_ = flutter_rust_bridge::for_generated::lockable_compute_decode_order( vec![flutter_rust_bridge::for_generated::LockableOrderInfo::new( - &api_state, 0, false, + &api_fmfd, 0, false, )], ); for i in decode_indices_ { match i { 0 => { - api_state_guard = - Some(api_state.lockable_decode_async_ref().await) + api_fmfd_guard = + Some(api_fmfd.lockable_decode_async_ref().await) } _ => unreachable!(), } } - let api_state_guard = api_state_guard.unwrap(); - let output_ok = crate::api::api::get_user_name(&*api_state_guard).await?; + let api_fmfd_guard = api_fmfd_guard.unwrap(); + let output_ok = Result::<_, ()>::Ok( + crate::api::api::get_background_following(&*api_fmfd_guard).await, + )?; Ok(output_ok) })() .await, @@ -7092,7 +6900,7 @@ fn wire__crate__api__api__get_user_name_impl( }, ) } -fn wire__crate__api__api__get_wifi_passwords_impl( +fn wire__crate__api__api__get_beacon_items_impl( port_: flutter_rust_bridge::for_generated::MessagePort, ptr_: flutter_rust_bridge::for_generated::PlatformGeneralizedUint8ListPtr, rust_vec_len_: i32, @@ -7100,7 +6908,7 @@ fn wire__crate__api__api__get_wifi_passwords_impl( ) { FLUTTER_RUST_BRIDGE_HANDLER.wrap_async::( flutter_rust_bridge::for_generated::TaskInfo { - debug_name: "get_wifi_passwords", + debug_name: "get_beacon_items", port: Some(port_), mode: flutter_rust_bridge::for_generated::FfiCallMode::Normal, }, @@ -7114,37 +6922,34 @@ fn wire__crate__api__api__get_wifi_passwords_impl( }; let mut deserializer = flutter_rust_bridge::for_generated::SseDeserializer::new(message); - let api_passwords = >, + Arc>, >, >>::sse_decode(&mut deserializer); deserializer.end(); move |context| async move { - transform_result_sse::<_, ()>( + transform_result_sse::<_, flutter_rust_bridge::for_generated::anyhow::Error>( (move || async move { - let mut api_passwords_guard = None; + let mut api_items_guard = None; let decode_indices_ = flutter_rust_bridge::for_generated::lockable_compute_decode_order( vec![flutter_rust_bridge::for_generated::LockableOrderInfo::new( - &api_passwords, - 0, - false, + &api_items, 0, false, )], ); for i in decode_indices_ { match i { 0 => { - api_passwords_guard = - Some(api_passwords.lockable_decode_async_ref().await) + api_items_guard = + Some(api_items.lockable_decode_async_ref().await) } _ => unreachable!(), } } - let api_passwords_guard = api_passwords_guard.unwrap(); - let output_ok = Result::<_, ()>::Ok( - crate::api::api::get_wifi_passwords(&*api_passwords_guard).await, - )?; + let api_items_guard = api_items_guard.unwrap(); + let output_ok = + crate::api::api::get_beacon_items(&*api_items_guard).await?; Ok(output_ok) })() .await, @@ -7153,59 +6958,7 @@ fn wire__crate__api__api__get_wifi_passwords_impl( }, ) } -fn wire__crate__api__api__import_watcher_impl( - ptr_: flutter_rust_bridge::for_generated::PlatformGeneralizedUint8ListPtr, - rust_vec_len_: i32, - data_len_: i32, -) -> flutter_rust_bridge::for_generated::WireSyncRust2DartSse { - FLUTTER_RUST_BRIDGE_HANDLER.wrap_sync::( - flutter_rust_bridge::for_generated::TaskInfo { - debug_name: "import_watcher", - port: None, - mode: flutter_rust_bridge::for_generated::FfiCallMode::Sync, - }, - move || { - let message = unsafe { - flutter_rust_bridge::for_generated::Dart2RustMessageSse::from_wire( - ptr_, - rust_vec_len_, - data_len_, - ) - }; - let mut deserializer = - flutter_rust_bridge::for_generated::SseDeserializer::new(message); - let api_queue = >::sse_decode(&mut deserializer); - let api_client = >, - >>::sse_decode(&mut deserializer); - deserializer.end(); - transform_result_sse::<_, ()>((move || { - let mut api_client_guard = None; - let decode_indices_ = - flutter_rust_bridge::for_generated::lockable_compute_decode_order(vec![ - flutter_rust_bridge::for_generated::LockableOrderInfo::new( - &api_client, - 0, - false, - ), - ]); - for i in decode_indices_ { - match i { - 0 => api_client_guard = Some(api_client.lockable_decode_sync_ref()), - _ => unreachable!(), - } - } - let api_client_guard = api_client_guard.unwrap(); - let output_ok = Result::<_, ()>::Ok(crate::api::api::import_watcher( - api_queue, - &*api_client_guard, - ))?; - Ok(output_ok) - })()) - }, - ) -} -fn wire__crate__api__api__invalidate_id_cache_impl( +fn wire__crate__api__api__get_bottles_impl( port_: flutter_rust_bridge::for_generated::MessagePort, ptr_: flutter_rust_bridge::for_generated::PlatformGeneralizedUint8ListPtr, rust_vec_len_: i32, @@ -7213,7 +6966,7 @@ fn wire__crate__api__api__invalidate_id_cache_impl( ) { FLUTTER_RUST_BRIDGE_HANDLER.wrap_async::( flutter_rust_bridge::for_generated::TaskInfo { - debug_name: "invalidate_id_cache", + debug_name: "get_bottles", port: Some(port_), mode: flutter_rust_bridge::for_generated::FfiCallMode::Normal, }, @@ -7227,18 +6980,20 @@ fn wire__crate__api__api__invalidate_id_cache_impl( }; let mut deserializer = flutter_rust_bridge::for_generated::SseDeserializer::new(message); - let api_client = >, + let api_keychain = >, + >, >>::sse_decode(&mut deserializer); deserializer.end(); move |context| async move { transform_result_sse::<_, flutter_rust_bridge::for_generated::anyhow::Error>( (move || async move { - let mut api_client_guard = None; + let mut api_keychain_guard = None; let decode_indices_ = flutter_rust_bridge::for_generated::lockable_compute_decode_order( vec![flutter_rust_bridge::for_generated::LockableOrderInfo::new( - &api_client, + &api_keychain, 0, false, )], @@ -7246,15 +7001,14 @@ fn wire__crate__api__api__invalidate_id_cache_impl( for i in decode_indices_ { match i { 0 => { - api_client_guard = - Some(api_client.lockable_decode_async_ref().await) + api_keychain_guard = + Some(api_keychain.lockable_decode_async_ref().await) } _ => unreachable!(), } } - let api_client_guard = api_client_guard.unwrap(); - let output_ok = - crate::api::api::invalidate_id_cache(&*api_client_guard).await?; + let api_keychain_guard = api_keychain_guard.unwrap(); + let output_ok = crate::api::api::get_bottles(&*api_keychain_guard).await?; Ok(output_ok) })() .await, @@ -7263,7 +7017,7 @@ fn wire__crate__api__api__invalidate_id_cache_impl( }, ) } -fn wire__crate__api__api__invite_to_channel_impl( +fn wire__crate__api__api__get_contacts_headers_impl( port_: flutter_rust_bridge::for_generated::MessagePort, ptr_: flutter_rust_bridge::for_generated::PlatformGeneralizedUint8ListPtr, rust_vec_len_: i32, @@ -7271,7 +7025,7 @@ fn wire__crate__api__api__invite_to_channel_impl( ) { FLUTTER_RUST_BRIDGE_HANDLER.wrap_async::( flutter_rust_bridge::for_generated::TaskInfo { - debug_name: "invite_to_channel", + debug_name: "get_contacts_headers", port: Some(port_), mode: flutter_rust_bridge::for_generated::FfiCallMode::Normal, }, @@ -7285,43 +7039,70 @@ fn wire__crate__api__api__invite_to_channel_impl( }; let mut deserializer = flutter_rust_bridge::for_generated::SseDeserializer::new(message); - let api_status = ::sse_decode(&mut deserializer); + let api_state = >, + ArcAnisetteClient, >, >>::sse_decode(&mut deserializer); - let api_handle = ::sse_decode(&mut deserializer); - let api_to = >, + >, + >>::sse_decode(&mut deserializer); + let api_config = , >>::sse_decode(&mut deserializer); deserializer.end(); move |context| async move { transform_result_sse::<_, flutter_rust_bridge::for_generated::anyhow::Error>( (move || async move { - let mut api_status_guard = None; + let mut api_state_guard = None; + let mut api_token_provider_guard = None; + let mut api_config_guard = None; let decode_indices_ = flutter_rust_bridge::for_generated::lockable_compute_decode_order( - vec![flutter_rust_bridge::for_generated::LockableOrderInfo::new( - &api_status, - 0, - false, - )], + vec![ + flutter_rust_bridge::for_generated::LockableOrderInfo::new( + &api_state, 0, false, + ), + flutter_rust_bridge::for_generated::LockableOrderInfo::new( + &api_token_provider, + 1, + false, + ), + flutter_rust_bridge::for_generated::LockableOrderInfo::new( + &api_config, + 2, + false, + ), + ], ); for i in decode_indices_ { match i { 0 => { - api_status_guard = - Some(api_status.lockable_decode_async_ref().await) + api_state_guard = + Some(api_state.lockable_decode_async_ref().await) + } + 1 => { + api_token_provider_guard = + Some(api_token_provider.lockable_decode_async_ref().await) + } + 2 => { + api_config_guard = + Some(api_config.lockable_decode_async_ref().await) } _ => unreachable!(), } } - let api_status_guard = api_status_guard.unwrap(); - let output_ok = crate::api::api::invite_to_channel( - &*api_status_guard, - api_handle, - api_to, + let api_state_guard = api_state_guard.unwrap(); + let api_token_provider_guard = api_token_provider_guard.unwrap(); + let api_config_guard = api_config_guard.unwrap(); + let output_ok = crate::api::api::get_contacts_headers( + api_path, + &*api_state_guard, + &*api_token_provider_guard, + &*api_config_guard, ) .await?; Ok(output_ok) @@ -7332,15 +7113,15 @@ fn wire__crate__api__api__invite_to_channel_impl( }, ) } -fn wire__crate__api__api__invite_user_impl( +fn wire__crate__api__api__get_device_info_impl( port_: flutter_rust_bridge::for_generated::MessagePort, ptr_: flutter_rust_bridge::for_generated::PlatformGeneralizedUint8ListPtr, rust_vec_len_: i32, data_len_: i32, ) { - FLUTTER_RUST_BRIDGE_HANDLER.wrap_async::( + FLUTTER_RUST_BRIDGE_HANDLER.wrap_normal::( flutter_rust_bridge::for_generated::TaskInfo { - debug_name: "invite_user", + debug_name: "get_device_info", port: Some(port_), mode: flutter_rust_bridge::for_generated::FfiCallMode::Normal, }, @@ -7354,51 +7135,38 @@ fn wire__crate__api__api__invite_user_impl( }; let mut deserializer = flutter_rust_bridge::for_generated::SseDeserializer::new(message); - let api_passwords = >, - >, + let api_config = , >>::sse_decode(&mut deserializer); - let api_gid = ::sse_decode(&mut deserializer); - let api_handle = ::sse_decode(&mut deserializer); deserializer.end(); - move |context| async move { + move |context| { transform_result_sse::<_, flutter_rust_bridge::for_generated::anyhow::Error>( - (move || async move { - let mut api_passwords_guard = None; + (move || { + let mut api_config_guard = None; let decode_indices_ = flutter_rust_bridge::for_generated::lockable_compute_decode_order( vec![flutter_rust_bridge::for_generated::LockableOrderInfo::new( - &api_passwords, + &api_config, 0, false, )], ); for i in decode_indices_ { match i { - 0 => { - api_passwords_guard = - Some(api_passwords.lockable_decode_async_ref().await) - } + 0 => api_config_guard = Some(api_config.lockable_decode_sync_ref()), _ => unreachable!(), } } - let api_passwords_guard = api_passwords_guard.unwrap(); - let output_ok = crate::api::api::invite_user( - &*api_passwords_guard, - api_gid, - api_handle, - ) - .await?; + let api_config_guard = api_config_guard.unwrap(); + let output_ok = crate::api::api::get_device_info(&*api_config_guard)?; Ok(output_ok) - })() - .await, + })(), ) } }, ) } -fn wire__crate__api__api__is_in_clique_impl( +fn wire__crate__api__api__get_devices_impl( port_: flutter_rust_bridge::for_generated::MessagePort, ptr_: flutter_rust_bridge::for_generated::PlatformGeneralizedUint8ListPtr, rust_vec_len_: i32, @@ -7406,7 +7174,7 @@ fn wire__crate__api__api__is_in_clique_impl( ) { FLUTTER_RUST_BRIDGE_HANDLER.wrap_async::( flutter_rust_bridge::for_generated::TaskInfo { - debug_name: "is_in_clique", + debug_name: "get_devices", port: Some(port_), mode: flutter_rust_bridge::for_generated::FfiCallMode::Normal, }, @@ -7420,36 +7188,36 @@ fn wire__crate__api__api__is_in_clique_impl( }; let mut deserializer = flutter_rust_bridge::for_generated::SseDeserializer::new(message); - let api_keychain = >, + FindMyPhoneClient, >, >>::sse_decode(&mut deserializer); deserializer.end(); move |context| async move { transform_result_sse::<_, ()>( (move || async move { - let mut api_keychain_guard = None; + let mut api_client_guard = None; let decode_indices_ = flutter_rust_bridge::for_generated::lockable_compute_decode_order( vec![flutter_rust_bridge::for_generated::LockableOrderInfo::new( - &api_keychain, + &api_client, 0, - false, + true, )], ); for i in decode_indices_ { match i { 0 => { - api_keychain_guard = - Some(api_keychain.lockable_decode_async_ref().await) + api_client_guard = + Some(api_client.lockable_decode_async_ref_mut().await) } _ => unreachable!(), } } - let api_keychain_guard = api_keychain_guard.unwrap(); + let mut api_client_guard = api_client_guard.unwrap(); let output_ok = Result::<_, ()>::Ok( - crate::api::api::is_in_clique(&*api_keychain_guard).await, + crate::api::api::get_devices(&mut *api_client_guard).await, )?; Ok(output_ok) })() @@ -7459,7 +7227,7 @@ fn wire__crate__api__api__is_in_clique_impl( }, ) } -fn wire__crate__api__api__join_clique_with_bottle_impl( +fn wire__crate__api__api__get_entitlements_impl( port_: flutter_rust_bridge::for_generated::MessagePort, ptr_: flutter_rust_bridge::for_generated::PlatformGeneralizedUint8ListPtr, rust_vec_len_: i32, @@ -7467,7 +7235,7 @@ fn wire__crate__api__api__join_clique_with_bottle_impl( ) { FLUTTER_RUST_BRIDGE_HANDLER.wrap_async::( flutter_rust_bridge::for_generated::TaskInfo { - debug_name: "join_clique_with_bottle", + debug_name: "get_entitlements", port: Some(port_), mode: flutter_rust_bridge::for_generated::FfiCallMode::Normal, }, @@ -7481,57 +7249,59 @@ fn wire__crate__api__api__join_clique_with_bottle_impl( }; let mut deserializer = flutter_rust_bridge::for_generated::SseDeserializer::new(message); - let api_keychain = >, - >, + let api_config = , >>::sse_decode(&mut deserializer); - let api_bottle = , + let api_conn = , >>::sse_decode(&mut deserializer); - let api_password = ::sse_decode(&mut deserializer); - let api_device_password = ::sse_decode(&mut deserializer); + let api_mccmnc = ::sse_decode(&mut deserializer); + let api_subscriber = ::sse_decode(&mut deserializer); + let api_imei = ::sse_decode(&mut deserializer); + let api_process_challenge = decode_DartFn_Inputs_String_Output_String_AnyhowException( + ::sse_decode(&mut deserializer), + ); deserializer.end(); move |context| async move { transform_result_sse::<_, flutter_rust_bridge::for_generated::anyhow::Error>( (move || async move { - let mut api_keychain_guard = None; - let mut api_bottle_guard = None; + let mut api_config_guard = None; + let mut api_conn_guard = None; let decode_indices_ = flutter_rust_bridge::for_generated::lockable_compute_decode_order( vec![ flutter_rust_bridge::for_generated::LockableOrderInfo::new( - &api_keychain, + &api_config, 0, false, ), flutter_rust_bridge::for_generated::LockableOrderInfo::new( - &api_bottle, - 1, - false, + &api_conn, 1, false, ), ], ); for i in decode_indices_ { match i { 0 => { - api_keychain_guard = - Some(api_keychain.lockable_decode_async_ref().await) + api_config_guard = + Some(api_config.lockable_decode_async_ref().await) } 1 => { - api_bottle_guard = - Some(api_bottle.lockable_decode_async_ref().await) + api_conn_guard = + Some(api_conn.lockable_decode_async_ref().await) } _ => unreachable!(), } } - let api_keychain_guard = api_keychain_guard.unwrap(); - let api_bottle_guard = api_bottle_guard.unwrap(); - let output_ok = crate::api::api::join_clique_with_bottle( - &*api_keychain_guard, - &*api_bottle_guard, - api_password, - api_device_password, + let api_config_guard = api_config_guard.unwrap(); + let api_conn_guard = api_conn_guard.unwrap(); + let output_ok = crate::api::api::get_entitlements( + &*api_config_guard, + &*api_conn_guard, + api_mccmnc, + api_subscriber, + api_imei, + api_process_challenge, ) .await?; Ok(output_ok) @@ -7542,7 +7312,7 @@ fn wire__crate__api__api__join_clique_with_bottle_impl( }, ) } -fn wire__crate__api__api__make_anisette_impl( +fn wire__crate__api__api__get_following_impl( port_: flutter_rust_bridge::for_generated::MessagePort, ptr_: flutter_rust_bridge::for_generated::PlatformGeneralizedUint8ListPtr, rust_vec_len_: i32, @@ -7550,7 +7320,7 @@ fn wire__crate__api__api__make_anisette_impl( ) { FLUTTER_RUST_BRIDGE_HANDLER.wrap_async::( flutter_rust_bridge::for_generated::TaskInfo { - debug_name: "make_anisette", + debug_name: "get_following", port: Some(port_), mode: flutter_rust_bridge::for_generated::FfiCallMode::Normal, }, @@ -7564,54 +7334,36 @@ fn wire__crate__api__api__make_anisette_impl( }; let mut deserializer = flutter_rust_bridge::for_generated::SseDeserializer::new(message); - let api_path = ::sse_decode(&mut deserializer); - let api_config = , - >>::sse_decode(&mut deserializer); - let api_conn = , + let api_client = , + >, >>::sse_decode(&mut deserializer); deserializer.end(); move |context| async move { transform_result_sse::<_, ()>( (move || async move { - let mut api_config_guard = None; - let mut api_conn_guard = None; + let mut api_client_guard = None; let decode_indices_ = flutter_rust_bridge::for_generated::lockable_compute_decode_order( - vec![ - flutter_rust_bridge::for_generated::LockableOrderInfo::new( - &api_config, - 0, - false, - ), - flutter_rust_bridge::for_generated::LockableOrderInfo::new( - &api_conn, 1, false, - ), - ], + vec![flutter_rust_bridge::for_generated::LockableOrderInfo::new( + &api_client, + 0, + true, + )], ); for i in decode_indices_ { match i { 0 => { - api_config_guard = - Some(api_config.lockable_decode_async_ref().await) - } - 1 => { - api_conn_guard = - Some(api_conn.lockable_decode_async_ref().await) + api_client_guard = + Some(api_client.lockable_decode_async_ref_mut().await) } _ => unreachable!(), } } - let api_config_guard = api_config_guard.unwrap(); - let api_conn_guard = api_conn_guard.unwrap(); + let mut api_client_guard = api_client_guard.unwrap(); let output_ok = Result::<_, ()>::Ok( - crate::api::api::make_anisette( - api_path, - &*api_config_guard, - &*api_conn_guard, - ) - .await, + crate::api::api::get_following(&mut *api_client_guard).await, )?; Ok(output_ok) })() @@ -7621,16 +7373,17 @@ fn wire__crate__api__api__make_anisette_impl( }, ) } -fn wire__crate__api__api__make_circle_sessions_impl( +fn wire__crate__api__api__get_ft_link_impl( + port_: flutter_rust_bridge::for_generated::MessagePort, ptr_: flutter_rust_bridge::for_generated::PlatformGeneralizedUint8ListPtr, rust_vec_len_: i32, data_len_: i32, -) -> flutter_rust_bridge::for_generated::WireSyncRust2DartSse { - FLUTTER_RUST_BRIDGE_HANDLER.wrap_sync::( +) { + FLUTTER_RUST_BRIDGE_HANDLER.wrap_async::( flutter_rust_bridge::for_generated::TaskInfo { - debug_name: "make_circle_sessions", - port: None, - mode: flutter_rust_bridge::for_generated::FfiCallMode::Sync, + debug_name: "get_ft_link", + port: Some(port_), + mode: flutter_rust_bridge::for_generated::FfiCallMode::Normal, }, move || { let message = unsafe { @@ -7642,24 +7395,54 @@ fn wire__crate__api__api__make_circle_sessions_impl( }; let mut deserializer = flutter_rust_bridge::for_generated::SseDeserializer::new(message); + let api_facetime = >, + >>::sse_decode(&mut deserializer); + let api_usage = ::sse_decode(&mut deserializer); deserializer.end(); - transform_result_sse::<_, ()>((move || { - let output_ok = Result::<_, ()>::Ok(crate::api::api::make_circle_sessions())?; - Ok(output_ok) - })()) - }, - ) -} -fn wire__crate__api__api__make_client_session_impl( - ptr_: flutter_rust_bridge::for_generated::PlatformGeneralizedUint8ListPtr, - rust_vec_len_: i32, - data_len_: i32, -) -> flutter_rust_bridge::for_generated::WireSyncRust2DartSse { - FLUTTER_RUST_BRIDGE_HANDLER.wrap_sync::( - flutter_rust_bridge::for_generated::TaskInfo { - debug_name: "make_client_session", - port: None, - mode: flutter_rust_bridge::for_generated::FfiCallMode::Sync, + move |context| async move { + transform_result_sse::<_, flutter_rust_bridge::for_generated::anyhow::Error>( + (move || async move { + let mut api_facetime_guard = None; + let decode_indices_ = + flutter_rust_bridge::for_generated::lockable_compute_decode_order( + vec![flutter_rust_bridge::for_generated::LockableOrderInfo::new( + &api_facetime, + 0, + false, + )], + ); + for i in decode_indices_ { + match i { + 0 => { + api_facetime_guard = + Some(api_facetime.lockable_decode_async_ref().await) + } + _ => unreachable!(), + } + } + let api_facetime_guard = api_facetime_guard.unwrap(); + let output_ok = + crate::api::api::get_ft_link(&*api_facetime_guard, api_usage).await?; + Ok(output_ok) + })() + .await, + ) + } + }, + ) +} +fn wire__crate__api__api__get_groups_impl( + port_: flutter_rust_bridge::for_generated::MessagePort, + ptr_: flutter_rust_bridge::for_generated::PlatformGeneralizedUint8ListPtr, + rust_vec_len_: i32, + data_len_: i32, +) { + FLUTTER_RUST_BRIDGE_HANDLER.wrap_async::( + flutter_rust_bridge::for_generated::TaskInfo { + debug_name: "get_groups", + port: Some(port_), + mode: flutter_rust_bridge::for_generated::FfiCallMode::Normal, }, move || { let message = unsafe { @@ -7671,28 +7454,54 @@ fn wire__crate__api__api__make_client_session_impl( }; let mut deserializer = flutter_rust_bridge::for_generated::SseDeserializer::new(message); - let api_circle = >>::sse_decode( - &mut deserializer, - ); + let api_passwords = >, + >, + >>::sse_decode(&mut deserializer); deserializer.end(); - transform_result_sse::<_, ()>((move || { - let output_ok = - Result::<_, ()>::Ok(crate::api::api::make_client_session(api_circle))?; - Ok(output_ok) - })()) + move |context| async move { + transform_result_sse::<_, flutter_rust_bridge::for_generated::anyhow::Error>( + (move || async move { + let mut api_passwords_guard = None; + let decode_indices_ = + flutter_rust_bridge::for_generated::lockable_compute_decode_order( + vec![flutter_rust_bridge::for_generated::LockableOrderInfo::new( + &api_passwords, + 0, + false, + )], + ); + for i in decode_indices_ { + match i { + 0 => { + api_passwords_guard = + Some(api_passwords.lockable_decode_async_ref().await) + } + _ => unreachable!(), + } + } + let api_passwords_guard = api_passwords_guard.unwrap(); + let output_ok = crate::api::api::get_groups(&*api_passwords_guard).await?; + Ok(output_ok) + })() + .await, + ) + } }, ) } -fn wire__crate__api__api__make_cloud_messages_client_impl( +fn wire__crate__api__api__get_handles_impl( + port_: flutter_rust_bridge::for_generated::MessagePort, ptr_: flutter_rust_bridge::for_generated::PlatformGeneralizedUint8ListPtr, rust_vec_len_: i32, data_len_: i32, -) -> flutter_rust_bridge::for_generated::WireSyncRust2DartSse { - FLUTTER_RUST_BRIDGE_HANDLER.wrap_sync::( +) { + FLUTTER_RUST_BRIDGE_HANDLER.wrap_async::( flutter_rust_bridge::for_generated::TaskInfo { - debug_name: "make_cloud_messages_client", - port: None, - mode: flutter_rust_bridge::for_generated::FfiCallMode::Sync, + debug_name: "get_handles", + port: Some(port_), + mode: flutter_rust_bridge::for_generated::FfiCallMode::Normal, }, move || { let message = unsafe { @@ -7704,52 +7513,40 @@ fn wire__crate__api__api__make_cloud_messages_client_impl( }; let mut deserializer = flutter_rust_bridge::for_generated::SseDeserializer::new(message); - let api_cloudkit = >, - >, - >>::sse_decode(&mut deserializer); - let api_keychain = >, - >, + let api_state = >, >>::sse_decode(&mut deserializer); deserializer.end(); - transform_result_sse::<_, ()>((move || { - let mut api_cloudkit_guard = None; - let mut api_keychain_guard = None; - let decode_indices_ = - flutter_rust_bridge::for_generated::lockable_compute_decode_order(vec![ - flutter_rust_bridge::for_generated::LockableOrderInfo::new( - &api_cloudkit, - 0, - false, - ), - flutter_rust_bridge::for_generated::LockableOrderInfo::new( - &api_keychain, - 1, - false, - ), - ]); - for i in decode_indices_ { - match i { - 0 => api_cloudkit_guard = Some(api_cloudkit.lockable_decode_sync_ref()), - 1 => api_keychain_guard = Some(api_keychain.lockable_decode_sync_ref()), - _ => unreachable!(), - } - } - let api_cloudkit_guard = api_cloudkit_guard.unwrap(); - let api_keychain_guard = api_keychain_guard.unwrap(); - let output_ok = Result::<_, ()>::Ok(crate::api::api::make_cloud_messages_client( - &*api_cloudkit_guard, - &*api_keychain_guard, - ))?; - Ok(output_ok) - })()) + move |context| async move { + transform_result_sse::<_, flutter_rust_bridge::for_generated::anyhow::Error>( + (move || async move { + let mut api_state_guard = None; + let decode_indices_ = + flutter_rust_bridge::for_generated::lockable_compute_decode_order( + vec![flutter_rust_bridge::for_generated::LockableOrderInfo::new( + &api_state, 0, false, + )], + ); + for i in decode_indices_ { + match i { + 0 => { + api_state_guard = + Some(api_state.lockable_decode_async_ref().await) + } + _ => unreachable!(), + } + } + let api_state_guard = api_state_guard.unwrap(); + let output_ok = crate::api::api::get_handles(&*api_state_guard).await?; + Ok(output_ok) + })() + .await, + ) + } }, ) } -fn wire__crate__api__api__make_cloudkit_impl( +fn wire__crate__api__api__get_my_phone_handles_impl( port_: flutter_rust_bridge::for_generated::MessagePort, ptr_: flutter_rust_bridge::for_generated::PlatformGeneralizedUint8ListPtr, rust_vec_len_: i32, @@ -7757,7 +7554,7 @@ fn wire__crate__api__api__make_cloudkit_impl( ) { FLUTTER_RUST_BRIDGE_HANDLER.wrap_async::( flutter_rust_bridge::for_generated::TaskInfo { - debug_name: "make_cloudkit", + debug_name: "get_my_phone_handles", port: Some(port_), mode: flutter_rust_bridge::for_generated::FfiCallMode::Normal, }, @@ -7771,76 +7568,32 @@ fn wire__crate__api__api__make_cloudkit_impl( }; let mut deserializer = flutter_rust_bridge::for_generated::SseDeserializer::new(message); - let api_path = ::sse_decode(&mut deserializer); - let api_anisette = , - >, - >>::sse_decode(&mut deserializer); - let api_config = , - >>::sse_decode(&mut deserializer); - let api_token_provider = >, - >, + let api_state = >, >>::sse_decode(&mut deserializer); deserializer.end(); move |context| async move { - transform_result_sse::<_, ()>( + transform_result_sse::<_, flutter_rust_bridge::for_generated::anyhow::Error>( (move || async move { - let mut api_anisette_guard = None; - let mut api_config_guard = None; - let mut api_token_provider_guard = None; + let mut api_state_guard = None; let decode_indices_ = flutter_rust_bridge::for_generated::lockable_compute_decode_order( - vec![ - flutter_rust_bridge::for_generated::LockableOrderInfo::new( - &api_anisette, - 0, - false, - ), - flutter_rust_bridge::for_generated::LockableOrderInfo::new( - &api_config, - 1, - false, - ), - flutter_rust_bridge::for_generated::LockableOrderInfo::new( - &api_token_provider, - 2, - false, - ), - ], + vec![flutter_rust_bridge::for_generated::LockableOrderInfo::new( + &api_state, 0, false, + )], ); for i in decode_indices_ { match i { 0 => { - api_anisette_guard = - Some(api_anisette.lockable_decode_async_ref().await) - } - 1 => { - api_config_guard = - Some(api_config.lockable_decode_async_ref().await) - } - 2 => { - api_token_provider_guard = - Some(api_token_provider.lockable_decode_async_ref().await) + api_state_guard = + Some(api_state.lockable_decode_async_ref().await) } _ => unreachable!(), } } - let api_anisette_guard = api_anisette_guard.unwrap(); - let api_config_guard = api_config_guard.unwrap(); - let api_token_provider_guard = api_token_provider_guard.unwrap(); - let output_ok = Result::<_, ()>::Ok( - crate::api::api::make_cloudkit( - api_path, - &*api_anisette_guard, - &*api_config_guard, - &*api_token_provider_guard, - ) - .await, - )?; + let api_state_guard = api_state_guard.unwrap(); + let output_ok = + crate::api::api::get_my_phone_handles(&*api_state_guard).await?; Ok(output_ok) })() .await, @@ -7849,7 +7602,7 @@ fn wire__crate__api__api__make_cloudkit_impl( }, ) } -fn wire__crate__api__api__make_facetime_impl( +fn wire__crate__api__api__get_passkeys_impl( port_: flutter_rust_bridge::for_generated::MessagePort, ptr_: flutter_rust_bridge::for_generated::PlatformGeneralizedUint8ListPtr, rust_vec_len_: i32, @@ -7857,7 +7610,7 @@ fn wire__crate__api__api__make_facetime_impl( ) { FLUTTER_RUST_BRIDGE_HANDLER.wrap_async::( flutter_rust_bridge::for_generated::TaskInfo { - debug_name: "make_facetime", + debug_name: "get_passkeys", port: Some(port_), mode: flutter_rust_bridge::for_generated::FfiCallMode::Normal, }, @@ -7871,54 +7624,36 @@ fn wire__crate__api__api__make_facetime_impl( }; let mut deserializer = flutter_rust_bridge::for_generated::SseDeserializer::new(message); - let api_path = ::sse_decode(&mut deserializer); - let api_conn = , - >>::sse_decode(&mut deserializer); - let api_client = >, + let api_passwords = >, + >, >>::sse_decode(&mut deserializer); deserializer.end(); move |context| async move { transform_result_sse::<_, ()>( (move || async move { - let mut api_conn_guard = None; - let mut api_client_guard = None; + let mut api_passwords_guard = None; let decode_indices_ = flutter_rust_bridge::for_generated::lockable_compute_decode_order( - vec![ - flutter_rust_bridge::for_generated::LockableOrderInfo::new( - &api_conn, 0, false, - ), - flutter_rust_bridge::for_generated::LockableOrderInfo::new( - &api_client, - 1, - false, - ), - ], + vec![flutter_rust_bridge::for_generated::LockableOrderInfo::new( + &api_passwords, + 0, + false, + )], ); for i in decode_indices_ { match i { 0 => { - api_conn_guard = - Some(api_conn.lockable_decode_async_ref().await) - } - 1 => { - api_client_guard = - Some(api_client.lockable_decode_async_ref().await) + api_passwords_guard = + Some(api_passwords.lockable_decode_async_ref().await) } _ => unreachable!(), } } - let api_conn_guard = api_conn_guard.unwrap(); - let api_client_guard = api_client_guard.unwrap(); + let api_passwords_guard = api_passwords_guard.unwrap(); let output_ok = Result::<_, ()>::Ok( - crate::api::api::make_facetime( - api_path, - &*api_conn_guard, - &*api_client_guard, - ) - .await, + crate::api::api::get_passkeys(&*api_passwords_guard).await, )?; Ok(output_ok) })() @@ -7928,7 +7663,7 @@ fn wire__crate__api__api__make_facetime_impl( }, ) } -fn wire__crate__api__api__make_find_my_friends_impl( +fn wire__crate__api__api__get_passwords_impl( port_: flutter_rust_bridge::for_generated::MessagePort, ptr_: flutter_rust_bridge::for_generated::PlatformGeneralizedUint8ListPtr, rust_vec_len_: i32, @@ -7936,7 +7671,7 @@ fn wire__crate__api__api__make_find_my_friends_impl( ) { FLUTTER_RUST_BRIDGE_HANDLER.wrap_async::( flutter_rust_bridge::for_generated::TaskInfo { - debug_name: "make_find_my_friends", + debug_name: "get_passwords", port: Some(port_), mode: flutter_rust_bridge::for_generated::FfiCallMode::Normal, }, @@ -7950,86 +7685,37 @@ fn wire__crate__api__api__make_find_my_friends_impl( }; let mut deserializer = flutter_rust_bridge::for_generated::SseDeserializer::new(message); - let api_path = ::sse_decode(&mut deserializer); - let api_config = , - >>::sse_decode(&mut deserializer); - let api_aps = , - >>::sse_decode(&mut deserializer); - let api_anisette = , - >, - >>::sse_decode(&mut deserializer); - let api_provider = >, + Arc>, >, >>::sse_decode(&mut deserializer); deserializer.end(); move |context| async move { - transform_result_sse::<_, flutter_rust_bridge::for_generated::anyhow::Error>( + transform_result_sse::<_, ()>( (move || async move { - let mut api_config_guard = None; - let mut api_aps_guard = None; - let mut api_anisette_guard = None; - let mut api_provider_guard = None; + let mut api_passwords_guard = None; let decode_indices_ = flutter_rust_bridge::for_generated::lockable_compute_decode_order( - vec![ - flutter_rust_bridge::for_generated::LockableOrderInfo::new( - &api_config, - 0, - false, - ), - flutter_rust_bridge::for_generated::LockableOrderInfo::new( - &api_aps, 1, false, - ), - flutter_rust_bridge::for_generated::LockableOrderInfo::new( - &api_anisette, - 2, - false, - ), - flutter_rust_bridge::for_generated::LockableOrderInfo::new( - &api_provider, - 3, - false, - ), - ], + vec![flutter_rust_bridge::for_generated::LockableOrderInfo::new( + &api_passwords, + 0, + false, + )], ); for i in decode_indices_ { match i { 0 => { - api_config_guard = - Some(api_config.lockable_decode_async_ref().await) - } - 1 => { - api_aps_guard = Some(api_aps.lockable_decode_async_ref().await) - } - 2 => { - api_anisette_guard = - Some(api_anisette.lockable_decode_async_ref().await) - } - 3 => { - api_provider_guard = - Some(api_provider.lockable_decode_async_ref().await) + api_passwords_guard = + Some(api_passwords.lockable_decode_async_ref().await) } _ => unreachable!(), } } - let api_config_guard = api_config_guard.unwrap(); - let api_aps_guard = api_aps_guard.unwrap(); - let api_anisette_guard = api_anisette_guard.unwrap(); - let api_provider_guard = api_provider_guard.unwrap(); - let output_ok = crate::api::api::make_find_my_friends( - api_path, - &*api_config_guard, - &*api_aps_guard, - &*api_anisette_guard, - &*api_provider_guard, - ) - .await?; + let api_passwords_guard = api_passwords_guard.unwrap(); + let output_ok = Result::<_, ()>::Ok( + crate::api::api::get_passwords(&*api_passwords_guard).await, + )?; Ok(output_ok) })() .await, @@ -8038,7 +7724,7 @@ fn wire__crate__api__api__make_find_my_friends_impl( }, ) } -fn wire__crate__api__api__make_find_my_phone_impl( +fn wire__crate__api__api__get_passwords_meta_impl( port_: flutter_rust_bridge::for_generated::MessagePort, ptr_: flutter_rust_bridge::for_generated::PlatformGeneralizedUint8ListPtr, rust_vec_len_: i32, @@ -8046,7 +7732,7 @@ fn wire__crate__api__api__make_find_my_phone_impl( ) { FLUTTER_RUST_BRIDGE_HANDLER.wrap_async::( flutter_rust_bridge::for_generated::TaskInfo { - debug_name: "make_find_my_phone", + debug_name: "get_passwords_meta", port: Some(port_), mode: flutter_rust_bridge::for_generated::FfiCallMode::Normal, }, @@ -8060,86 +7746,37 @@ fn wire__crate__api__api__make_find_my_phone_impl( }; let mut deserializer = flutter_rust_bridge::for_generated::SseDeserializer::new(message); - let api_path = ::sse_decode(&mut deserializer); - let api_config = , - >>::sse_decode(&mut deserializer); - let api_aps = , - >>::sse_decode(&mut deserializer); - let api_anisette = , - >, - >>::sse_decode(&mut deserializer); - let api_provider = >, + Arc>, >, >>::sse_decode(&mut deserializer); deserializer.end(); move |context| async move { - transform_result_sse::<_, flutter_rust_bridge::for_generated::anyhow::Error>( + transform_result_sse::<_, ()>( (move || async move { - let mut api_config_guard = None; - let mut api_aps_guard = None; - let mut api_anisette_guard = None; - let mut api_provider_guard = None; + let mut api_passwords_guard = None; let decode_indices_ = flutter_rust_bridge::for_generated::lockable_compute_decode_order( - vec![ - flutter_rust_bridge::for_generated::LockableOrderInfo::new( - &api_config, - 0, - false, - ), - flutter_rust_bridge::for_generated::LockableOrderInfo::new( - &api_aps, 1, false, - ), - flutter_rust_bridge::for_generated::LockableOrderInfo::new( - &api_anisette, - 2, - false, - ), - flutter_rust_bridge::for_generated::LockableOrderInfo::new( - &api_provider, - 3, - false, - ), - ], + vec![flutter_rust_bridge::for_generated::LockableOrderInfo::new( + &api_passwords, + 0, + false, + )], ); for i in decode_indices_ { match i { 0 => { - api_config_guard = - Some(api_config.lockable_decode_async_ref().await) - } - 1 => { - api_aps_guard = Some(api_aps.lockable_decode_async_ref().await) - } - 2 => { - api_anisette_guard = - Some(api_anisette.lockable_decode_async_ref().await) - } - 3 => { - api_provider_guard = - Some(api_provider.lockable_decode_async_ref().await) + api_passwords_guard = + Some(api_passwords.lockable_decode_async_ref().await) } _ => unreachable!(), } } - let api_config_guard = api_config_guard.unwrap(); - let api_aps_guard = api_aps_guard.unwrap(); - let api_anisette_guard = api_anisette_guard.unwrap(); - let api_provider_guard = api_provider_guard.unwrap(); - let output_ok = crate::api::api::make_find_my_phone( - api_path, - &*api_config_guard, - &*api_aps_guard, - &*api_anisette_guard, - &*api_provider_guard, - ) - .await?; + let api_passwords_guard = api_passwords_guard.unwrap(); + let output_ok = Result::<_, ()>::Ok( + crate::api::api::get_passwords_meta(&*api_passwords_guard).await, + )?; Ok(output_ok) })() .await, @@ -8148,7 +7785,7 @@ fn wire__crate__api__api__make_find_my_phone_impl( }, ) } -fn wire__crate__api__api__make_findmy_impl( +fn wire__crate__api__api__get_quota_info_impl( port_: flutter_rust_bridge::for_generated::MessagePort, ptr_: flutter_rust_bridge::for_generated::PlatformGeneralizedUint8ListPtr, rust_vec_len_: i32, @@ -8156,7 +7793,7 @@ fn wire__crate__api__api__make_findmy_impl( ) { FLUTTER_RUST_BRIDGE_HANDLER.wrap_async::( flutter_rust_bridge::for_generated::TaskInfo { - debug_name: "make_findmy", + debug_name: "get_quota_info", port: Some(port_), mode: flutter_rust_bridge::for_generated::FfiCallMode::Normal, }, @@ -8170,138 +7807,33 @@ fn wire__crate__api__api__make_findmy_impl( }; let mut deserializer = flutter_rust_bridge::for_generated::SseDeserializer::new(message); - let api_path = ::sse_decode(&mut deserializer); - let api_token_provider = >, >, >>::sse_decode(&mut deserializer); - let api_conn = , - >>::sse_decode(&mut deserializer); - let api_cloudkit = >, - >, - >>::sse_decode(&mut deserializer); - let api_keychain = >, - >, - >>::sse_decode(&mut deserializer); - let api_anisette = , - >, - >>::sse_decode(&mut deserializer); - let api_config = , - >>::sse_decode(&mut deserializer); - let api_client = >, - >>::sse_decode(&mut deserializer); deserializer.end(); move |context| async move { - transform_result_sse::<_, ()>( + transform_result_sse::<_, flutter_rust_bridge::for_generated::anyhow::Error>( (move || async move { - let mut api_token_provider_guard = None; - let mut api_conn_guard = None; - let mut api_cloudkit_guard = None; - let mut api_keychain_guard = None; - let mut api_anisette_guard = None; - let mut api_config_guard = None; - let mut api_client_guard = None; + let mut api_info_guard = None; let decode_indices_ = flutter_rust_bridge::for_generated::lockable_compute_decode_order( - vec![ - flutter_rust_bridge::for_generated::LockableOrderInfo::new( - &api_token_provider, - 0, - false, - ), - flutter_rust_bridge::for_generated::LockableOrderInfo::new( - &api_conn, 1, false, - ), - flutter_rust_bridge::for_generated::LockableOrderInfo::new( - &api_cloudkit, - 2, - false, - ), - flutter_rust_bridge::for_generated::LockableOrderInfo::new( - &api_keychain, - 3, - false, - ), - flutter_rust_bridge::for_generated::LockableOrderInfo::new( - &api_anisette, - 4, - false, - ), - flutter_rust_bridge::for_generated::LockableOrderInfo::new( - &api_config, - 5, - false, - ), - flutter_rust_bridge::for_generated::LockableOrderInfo::new( - &api_client, - 6, - false, - ), - ], + vec![flutter_rust_bridge::for_generated::LockableOrderInfo::new( + &api_info, 0, false, + )], ); for i in decode_indices_ { match i { 0 => { - api_token_provider_guard = - Some(api_token_provider.lockable_decode_async_ref().await) - } - 1 => { - api_conn_guard = - Some(api_conn.lockable_decode_async_ref().await) - } - 2 => { - api_cloudkit_guard = - Some(api_cloudkit.lockable_decode_async_ref().await) - } - 3 => { - api_keychain_guard = - Some(api_keychain.lockable_decode_async_ref().await) - } - 4 => { - api_anisette_guard = - Some(api_anisette.lockable_decode_async_ref().await) - } - 5 => { - api_config_guard = - Some(api_config.lockable_decode_async_ref().await) - } - 6 => { - api_client_guard = - Some(api_client.lockable_decode_async_ref().await) + api_info_guard = + Some(api_info.lockable_decode_async_ref().await) } _ => unreachable!(), } } - let api_token_provider_guard = api_token_provider_guard.unwrap(); - let api_conn_guard = api_conn_guard.unwrap(); - let api_cloudkit_guard = api_cloudkit_guard.unwrap(); - let api_keychain_guard = api_keychain_guard.unwrap(); - let api_anisette_guard = api_anisette_guard.unwrap(); - let api_config_guard = api_config_guard.unwrap(); - let api_client_guard = api_client_guard.unwrap(); - let output_ok = Result::<_, ()>::Ok( - crate::api::api::make_findmy( - api_path, - &*api_token_provider_guard, - &*api_conn_guard, - &*api_cloudkit_guard, - &*api_keychain_guard, - &*api_anisette_guard, - &*api_config_guard, - &*api_client_guard, - ) - .await, - )?; + let api_info_guard = api_info_guard.unwrap(); + let output_ok = crate::api::api::get_quota_info(&*api_info_guard).await?; Ok(output_ok) })() .await, @@ -8310,7 +7842,7 @@ fn wire__crate__api__api__make_findmy_impl( }, ) } -fn wire__crate__api__api__make_idms_impl( +fn wire__crate__api__api__get_regstate_impl( port_: flutter_rust_bridge::for_generated::MessagePort, ptr_: flutter_rust_bridge::for_generated::PlatformGeneralizedUint8ListPtr, rust_vec_len_: i32, @@ -8318,7 +7850,7 @@ fn wire__crate__api__api__make_idms_impl( ) { FLUTTER_RUST_BRIDGE_HANDLER.wrap_async::( flutter_rust_bridge::for_generated::TaskInfo { - debug_name: "make_idms", + debug_name: "get_regstate", port: Some(port_), mode: flutter_rust_bridge::for_generated::FfiCallMode::Normal, }, @@ -8332,33 +7864,31 @@ fn wire__crate__api__api__make_idms_impl( }; let mut deserializer = flutter_rust_bridge::for_generated::SseDeserializer::new(message); - let api_conn = , + let api_state = >, >>::sse_decode(&mut deserializer); deserializer.end(); move |context| async move { - transform_result_sse::<_, ()>( + transform_result_sse::<_, flutter_rust_bridge::for_generated::anyhow::Error>( (move || async move { - let mut api_conn_guard = None; + let mut api_state_guard = None; let decode_indices_ = flutter_rust_bridge::for_generated::lockable_compute_decode_order( vec![flutter_rust_bridge::for_generated::LockableOrderInfo::new( - &api_conn, 0, false, + &api_state, 0, false, )], ); for i in decode_indices_ { match i { 0 => { - api_conn_guard = - Some(api_conn.lockable_decode_async_ref().await) + api_state_guard = + Some(api_state.lockable_decode_async_ref().await) } _ => unreachable!(), } } - let api_conn_guard = api_conn_guard.unwrap(); - let output_ok = Result::<_, ()>::Ok( - crate::api::api::make_idms(&*api_conn_guard).await, - )?; + let api_state_guard = api_state_guard.unwrap(); + let output_ok = crate::api::api::get_regstate(&*api_state_guard).await?; Ok(output_ok) })() .await, @@ -8367,7 +7897,7 @@ fn wire__crate__api__api__make_idms_impl( }, ) } -fn wire__crate__api__api__make_imclient_impl( +fn wire__crate__api__api__get_sms_targets_impl( port_: flutter_rust_bridge::for_generated::MessagePort, ptr_: flutter_rust_bridge::for_generated::PlatformGeneralizedUint8ListPtr, rust_vec_len_: i32, @@ -8375,7 +7905,7 @@ fn wire__crate__api__api__make_imclient_impl( ) { FLUTTER_RUST_BRIDGE_HANDLER.wrap_async::( flutter_rust_bridge::for_generated::TaskInfo { - debug_name: "make_imclient", + debug_name: "get_sms_targets", port: Some(port_), mode: flutter_rust_bridge::for_generated::FfiCallMode::Normal, }, @@ -8389,57 +7919,38 @@ fn wire__crate__api__api__make_imclient_impl( }; let mut deserializer = flutter_rust_bridge::for_generated::SseDeserializer::new(message); - let api_path = ::sse_decode(&mut deserializer); - let api_conn = , - >>::sse_decode(&mut deserializer); - let api_users = >::sse_decode(&mut deserializer); - let api_identity = , + let api_state = >, >>::sse_decode(&mut deserializer); + let api_handle = ::sse_decode(&mut deserializer); + let api_refresh = ::sse_decode(&mut deserializer); deserializer.end(); move |context| async move { - transform_result_sse::<_, ()>( + transform_result_sse::<_, flutter_rust_bridge::for_generated::anyhow::Error>( (move || async move { - let mut api_conn_guard = None; - let mut api_identity_guard = None; + let mut api_state_guard = None; let decode_indices_ = flutter_rust_bridge::for_generated::lockable_compute_decode_order( - vec![ - flutter_rust_bridge::for_generated::LockableOrderInfo::new( - &api_conn, 0, false, - ), - flutter_rust_bridge::for_generated::LockableOrderInfo::new( - &api_identity, - 1, - false, - ), - ], + vec![flutter_rust_bridge::for_generated::LockableOrderInfo::new( + &api_state, 0, false, + )], ); for i in decode_indices_ { match i { 0 => { - api_conn_guard = - Some(api_conn.lockable_decode_async_ref().await) - } - 1 => { - api_identity_guard = - Some(api_identity.lockable_decode_async_ref().await) + api_state_guard = + Some(api_state.lockable_decode_async_ref().await) } _ => unreachable!(), } } - let api_conn_guard = api_conn_guard.unwrap(); - let api_identity_guard = api_identity_guard.unwrap(); - let output_ok = Result::<_, ()>::Ok( - crate::api::api::make_imclient( - api_path, - &*api_conn_guard, - &api_users, - &*api_identity_guard, - ) - .await, - )?; + let api_state_guard = api_state_guard.unwrap(); + let output_ok = crate::api::api::get_sms_targets( + &*api_state_guard, + api_handle, + api_refresh, + ) + .await?; Ok(output_ok) })() .await, @@ -8448,16 +7959,17 @@ fn wire__crate__api__api__make_imclient_impl( }, ) } -fn wire__crate__api__api__make_keychain_impl( +fn wire__crate__api__api__get_syncstatus_impl( + port_: flutter_rust_bridge::for_generated::MessagePort, ptr_: flutter_rust_bridge::for_generated::PlatformGeneralizedUint8ListPtr, rust_vec_len_: i32, data_len_: i32, -) -> flutter_rust_bridge::for_generated::WireSyncRust2DartSse { - FLUTTER_RUST_BRIDGE_HANDLER.wrap_sync::( +) { + FLUTTER_RUST_BRIDGE_HANDLER.wrap_async::( flutter_rust_bridge::for_generated::TaskInfo { - debug_name: "make_keychain", - port: None, - mode: flutter_rust_bridge::for_generated::FfiCallMode::Sync, + debug_name: "get_syncstatus", + port: Some(port_), + mode: flutter_rust_bridge::for_generated::FfiCallMode::Normal, }, move || { let message = unsafe { @@ -8469,83 +7981,42 @@ fn wire__crate__api__api__make_keychain_impl( }; let mut deserializer = flutter_rust_bridge::for_generated::SseDeserializer::new(message); - let api_path = ::sse_decode(&mut deserializer); - let api_cloudkit = >, - >, - >>::sse_decode(&mut deserializer); - let api_anisette = , - >, - >>::sse_decode(&mut deserializer); - let api_config = , - >>::sse_decode(&mut deserializer); - let api_token_provider = >, + SyncManager, >, >>::sse_decode(&mut deserializer); deserializer.end(); - transform_result_sse::<_, ()>((move || { - let mut api_cloudkit_guard = None; - let mut api_anisette_guard = None; - let mut api_config_guard = None; - let mut api_token_provider_guard = None; - let decode_indices_ = - flutter_rust_bridge::for_generated::lockable_compute_decode_order(vec![ - flutter_rust_bridge::for_generated::LockableOrderInfo::new( - &api_cloudkit, - 0, - false, - ), - flutter_rust_bridge::for_generated::LockableOrderInfo::new( - &api_anisette, - 1, - false, - ), - flutter_rust_bridge::for_generated::LockableOrderInfo::new( - &api_config, - 2, - false, - ), - flutter_rust_bridge::for_generated::LockableOrderInfo::new( - &api_token_provider, - 3, - false, - ), - ]); - for i in decode_indices_ { - match i { - 0 => api_cloudkit_guard = Some(api_cloudkit.lockable_decode_sync_ref()), - 1 => api_anisette_guard = Some(api_anisette.lockable_decode_sync_ref()), - 2 => api_config_guard = Some(api_config.lockable_decode_sync_ref()), - 3 => { - api_token_provider_guard = - Some(api_token_provider.lockable_decode_sync_ref()) + move |context| async move { + transform_result_sse::<_, flutter_rust_bridge::for_generated::anyhow::Error>( + (move || async move { + let mut api_lock_guard = None; + let decode_indices_ = + flutter_rust_bridge::for_generated::lockable_compute_decode_order( + vec![flutter_rust_bridge::for_generated::LockableOrderInfo::new( + &api_lock, 0, false, + )], + ); + for i in decode_indices_ { + match i { + 0 => { + api_lock_guard = + Some(api_lock.lockable_decode_async_ref().await) + } + _ => unreachable!(), + } } - _ => unreachable!(), - } - } - let api_cloudkit_guard = api_cloudkit_guard.unwrap(); - let api_anisette_guard = api_anisette_guard.unwrap(); - let api_config_guard = api_config_guard.unwrap(); - let api_token_provider_guard = api_token_provider_guard.unwrap(); - let output_ok = Result::<_, ()>::Ok(crate::api::api::make_keychain( - api_path, - &*api_cloudkit_guard, - &*api_anisette_guard, - &*api_config_guard, - &*api_token_provider_guard, - ))?; - Ok(output_ok) - })()) + let api_lock_guard = api_lock_guard.unwrap(); + let output_ok = crate::api::api::get_syncstatus(&*api_lock_guard).await?; + Ok(output_ok) + })() + .await, + ) + } }, ) } -fn wire__crate__api__api__make_passwords_impl( +fn wire__crate__api__api__get_token_impl( port_: flutter_rust_bridge::for_generated::MessagePort, ptr_: flutter_rust_bridge::for_generated::PlatformGeneralizedUint8ListPtr, rust_vec_len_: i32, @@ -8553,7 +8024,7 @@ fn wire__crate__api__api__make_passwords_impl( ) { FLUTTER_RUST_BRIDGE_HANDLER.wrap_async::( flutter_rust_bridge::for_generated::TaskInfo { - debug_name: "make_passwords", + debug_name: "get_token", port: Some(port_), mode: flutter_rust_bridge::for_generated::FfiCallMode::Normal, }, @@ -8567,88 +8038,32 @@ fn wire__crate__api__api__make_passwords_impl( }; let mut deserializer = flutter_rust_bridge::for_generated::SseDeserializer::new(message); - let api_path = ::sse_decode(&mut deserializer); - let api_keychain = >, - >, - >>::sse_decode(&mut deserializer); - let api_cloudkit = >, - >, - >>::sse_decode(&mut deserializer); - let api_client = >, - >>::sse_decode(&mut deserializer); - let api_conn = , >>::sse_decode(&mut deserializer); deserializer.end(); move |context| async move { transform_result_sse::<_, ()>( (move || async move { - let mut api_keychain_guard = None; - let mut api_cloudkit_guard = None; - let mut api_client_guard = None; - let mut api_conn_guard = None; + let mut api_state_guard = None; let decode_indices_ = flutter_rust_bridge::for_generated::lockable_compute_decode_order( - vec![ - flutter_rust_bridge::for_generated::LockableOrderInfo::new( - &api_keychain, - 0, - false, - ), - flutter_rust_bridge::for_generated::LockableOrderInfo::new( - &api_cloudkit, - 1, - false, - ), - flutter_rust_bridge::for_generated::LockableOrderInfo::new( - &api_client, - 2, - false, - ), - flutter_rust_bridge::for_generated::LockableOrderInfo::new( - &api_conn, 3, false, - ), - ], + vec![flutter_rust_bridge::for_generated::LockableOrderInfo::new( + &api_state, 0, false, + )], ); for i in decode_indices_ { match i { 0 => { - api_keychain_guard = - Some(api_keychain.lockable_decode_async_ref().await) - } - 1 => { - api_cloudkit_guard = - Some(api_cloudkit.lockable_decode_async_ref().await) - } - 2 => { - api_client_guard = - Some(api_client.lockable_decode_async_ref().await) - } - 3 => { - api_conn_guard = - Some(api_conn.lockable_decode_async_ref().await) + api_state_guard = + Some(api_state.lockable_decode_async_ref().await) } _ => unreachable!(), } } - let api_keychain_guard = api_keychain_guard.unwrap(); - let api_cloudkit_guard = api_cloudkit_guard.unwrap(); - let api_client_guard = api_client_guard.unwrap(); - let api_conn_guard = api_conn_guard.unwrap(); + let api_state_guard = api_state_guard.unwrap(); let output_ok = Result::<_, ()>::Ok( - crate::api::api::make_passwords( - api_path, - &*api_keychain_guard, - &*api_cloudkit_guard, - &*api_client_guard, - &*api_conn_guard, - ) - .await, + crate::api::api::get_token(&*api_state_guard).await, )?; Ok(output_ok) })() @@ -8658,7 +8073,7 @@ fn wire__crate__api__api__make_passwords_impl( }, ) } -fn wire__crate__api__api__make_profiles_impl( +fn wire__crate__api__api__get_user_name_impl( port_: flutter_rust_bridge::for_generated::MessagePort, ptr_: flutter_rust_bridge::for_generated::PlatformGeneralizedUint8ListPtr, rust_vec_len_: i32, @@ -8666,7 +8081,7 @@ fn wire__crate__api__api__make_profiles_impl( ) { FLUTTER_RUST_BRIDGE_HANDLER.wrap_async::( flutter_rust_bridge::for_generated::TaskInfo { - debug_name: "make_profiles", + debug_name: "get_user_name", port: Some(port_), mode: flutter_rust_bridge::for_generated::FfiCallMode::Normal, }, @@ -8680,37 +8095,33 @@ fn wire__crate__api__api__make_profiles_impl( }; let mut deserializer = flutter_rust_bridge::for_generated::SseDeserializer::new(message); - let api_cloudkit = >, + Arc>>, >, >>::sse_decode(&mut deserializer); deserializer.end(); move |context| async move { - transform_result_sse::<_, ()>( + transform_result_sse::<_, flutter_rust_bridge::for_generated::anyhow::Error>( (move || async move { - let mut api_cloudkit_guard = None; + let mut api_state_guard = None; let decode_indices_ = flutter_rust_bridge::for_generated::lockable_compute_decode_order( vec![flutter_rust_bridge::for_generated::LockableOrderInfo::new( - &api_cloudkit, - 0, - false, + &api_state, 0, false, )], ); for i in decode_indices_ { match i { 0 => { - api_cloudkit_guard = - Some(api_cloudkit.lockable_decode_async_ref().await) + api_state_guard = + Some(api_state.lockable_decode_async_ref().await) } _ => unreachable!(), } } - let api_cloudkit_guard = api_cloudkit_guard.unwrap(); - let output_ok = Result::<_, ()>::Ok( - crate::api::api::make_profiles(&*api_cloudkit_guard).await, - )?; + let api_state_guard = api_state_guard.unwrap(); + let output_ok = crate::api::api::get_user_name(&*api_state_guard).await?; Ok(output_ok) })() .await, @@ -8719,7 +8130,7 @@ fn wire__crate__api__api__make_profiles_impl( }, ) } -fn wire__crate__api__api__make_shared_streams_impl( +fn wire__crate__api__api__get_wifi_passwords_impl( port_: flutter_rust_bridge::for_generated::MessagePort, ptr_: flutter_rust_bridge::for_generated::PlatformGeneralizedUint8ListPtr, rust_vec_len_: i32, @@ -8727,7 +8138,7 @@ fn wire__crate__api__api__make_shared_streams_impl( ) { FLUTTER_RUST_BRIDGE_HANDLER.wrap_async::( flutter_rust_bridge::for_generated::TaskInfo { - debug_name: "make_shared_streams", + debug_name: "get_wifi_passwords", port: Some(port_), mode: flutter_rust_bridge::for_generated::FfiCallMode::Normal, }, @@ -8741,86 +8152,36 @@ fn wire__crate__api__api__make_shared_streams_impl( }; let mut deserializer = flutter_rust_bridge::for_generated::SseDeserializer::new(message); - let api_path = ::sse_decode(&mut deserializer); - let api_conn = , - >>::sse_decode(&mut deserializer); - let api_anisette = , - >, - >>::sse_decode(&mut deserializer); - let api_config = , - >>::sse_decode(&mut deserializer); - let api_token = >, + Arc>, >, >>::sse_decode(&mut deserializer); deserializer.end(); move |context| async move { transform_result_sse::<_, ()>( (move || async move { - let mut api_conn_guard = None; - let mut api_anisette_guard = None; - let mut api_config_guard = None; - let mut api_token_guard = None; + let mut api_passwords_guard = None; let decode_indices_ = flutter_rust_bridge::for_generated::lockable_compute_decode_order( - vec![ - flutter_rust_bridge::for_generated::LockableOrderInfo::new( - &api_conn, 0, false, - ), - flutter_rust_bridge::for_generated::LockableOrderInfo::new( - &api_anisette, - 1, - false, - ), - flutter_rust_bridge::for_generated::LockableOrderInfo::new( - &api_config, - 2, - false, - ), - flutter_rust_bridge::for_generated::LockableOrderInfo::new( - &api_token, 3, false, - ), - ], + vec![flutter_rust_bridge::for_generated::LockableOrderInfo::new( + &api_passwords, + 0, + false, + )], ); for i in decode_indices_ { match i { 0 => { - api_conn_guard = - Some(api_conn.lockable_decode_async_ref().await) - } - 1 => { - api_anisette_guard = - Some(api_anisette.lockable_decode_async_ref().await) - } - 2 => { - api_config_guard = - Some(api_config.lockable_decode_async_ref().await) - } - 3 => { - api_token_guard = - Some(api_token.lockable_decode_async_ref().await) + api_passwords_guard = + Some(api_passwords.lockable_decode_async_ref().await) } _ => unreachable!(), } } - let api_conn_guard = api_conn_guard.unwrap(); - let api_anisette_guard = api_anisette_guard.unwrap(); - let api_config_guard = api_config_guard.unwrap(); - let api_token_guard = api_token_guard.unwrap(); + let api_passwords_guard = api_passwords_guard.unwrap(); let output_ok = Result::<_, ()>::Ok( - crate::api::api::make_shared_streams( - api_path, - &*api_conn_guard, - &*api_anisette_guard, - &*api_config_guard, - &*api_token_guard, - ) - .await, + crate::api::api::get_wifi_passwords(&*api_passwords_guard).await, )?; Ok(output_ok) })() @@ -8830,7 +8191,59 @@ fn wire__crate__api__api__make_shared_streams_impl( }, ) } -fn wire__crate__api__api__make_statuskit_impl( +fn wire__crate__api__api__import_watcher_impl( + ptr_: flutter_rust_bridge::for_generated::PlatformGeneralizedUint8ListPtr, + rust_vec_len_: i32, + data_len_: i32, +) -> flutter_rust_bridge::for_generated::WireSyncRust2DartSse { + FLUTTER_RUST_BRIDGE_HANDLER.wrap_sync::( + flutter_rust_bridge::for_generated::TaskInfo { + debug_name: "import_watcher", + port: None, + mode: flutter_rust_bridge::for_generated::FfiCallMode::Sync, + }, + move || { + let message = unsafe { + flutter_rust_bridge::for_generated::Dart2RustMessageSse::from_wire( + ptr_, + rust_vec_len_, + data_len_, + ) + }; + let mut deserializer = + flutter_rust_bridge::for_generated::SseDeserializer::new(message); + let api_queue = >::sse_decode(&mut deserializer); + let api_client = >, + >>::sse_decode(&mut deserializer); + deserializer.end(); + transform_result_sse::<_, ()>((move || { + let mut api_client_guard = None; + let decode_indices_ = + flutter_rust_bridge::for_generated::lockable_compute_decode_order(vec![ + flutter_rust_bridge::for_generated::LockableOrderInfo::new( + &api_client, + 0, + false, + ), + ]); + for i in decode_indices_ { + match i { + 0 => api_client_guard = Some(api_client.lockable_decode_sync_ref()), + _ => unreachable!(), + } + } + let api_client_guard = api_client_guard.unwrap(); + let output_ok = Result::<_, ()>::Ok(crate::api::api::import_watcher( + api_queue, + &*api_client_guard, + ))?; + Ok(output_ok) + })()) + }, + ) +} +fn wire__crate__api__api__invalidate_id_cache_impl( port_: flutter_rust_bridge::for_generated::MessagePort, ptr_: flutter_rust_bridge::for_generated::PlatformGeneralizedUint8ListPtr, rust_vec_len_: i32, @@ -8838,7 +8251,7 @@ fn wire__crate__api__api__make_statuskit_impl( ) { FLUTTER_RUST_BRIDGE_HANDLER.wrap_async::( flutter_rust_bridge::for_generated::TaskInfo { - debug_name: "make_statuskit", + debug_name: "invalidate_id_cache", port: Some(port_), mode: flutter_rust_bridge::for_generated::FfiCallMode::Normal, }, @@ -8852,87 +8265,34 @@ fn wire__crate__api__api__make_statuskit_impl( }; let mut deserializer = flutter_rust_bridge::for_generated::SseDeserializer::new(message); - let api_path = ::sse_decode(&mut deserializer); - let api_provider = >, - >, - >>::sse_decode(&mut deserializer); - let api_conn = , - >>::sse_decode(&mut deserializer); - let api_config = , - >>::sse_decode(&mut deserializer); let api_client = >, >>::sse_decode(&mut deserializer); deserializer.end(); move |context| async move { - transform_result_sse::<_, ()>( + transform_result_sse::<_, flutter_rust_bridge::for_generated::anyhow::Error>( (move || async move { - let mut api_provider_guard = None; - let mut api_conn_guard = None; - let mut api_config_guard = None; let mut api_client_guard = None; let decode_indices_ = flutter_rust_bridge::for_generated::lockable_compute_decode_order( - vec![ - flutter_rust_bridge::for_generated::LockableOrderInfo::new( - &api_provider, - 0, - false, - ), - flutter_rust_bridge::for_generated::LockableOrderInfo::new( - &api_conn, 1, false, - ), - flutter_rust_bridge::for_generated::LockableOrderInfo::new( - &api_config, - 2, - false, - ), - flutter_rust_bridge::for_generated::LockableOrderInfo::new( - &api_client, - 3, - false, - ), - ], + vec![flutter_rust_bridge::for_generated::LockableOrderInfo::new( + &api_client, + 0, + false, + )], ); for i in decode_indices_ { match i { 0 => { - api_provider_guard = - Some(api_provider.lockable_decode_async_ref().await) - } - 1 => { - api_conn_guard = - Some(api_conn.lockable_decode_async_ref().await) - } - 2 => { - api_config_guard = - Some(api_config.lockable_decode_async_ref().await) - } - 3 => { api_client_guard = Some(api_client.lockable_decode_async_ref().await) } _ => unreachable!(), } } - let api_provider_guard = api_provider_guard.unwrap(); - let api_conn_guard = api_conn_guard.unwrap(); - let api_config_guard = api_config_guard.unwrap(); let api_client_guard = api_client_guard.unwrap(); - let output_ok = Result::<_, ()>::Ok( - crate::api::api::make_statuskit( - api_path, - &*api_provider_guard, - &*api_conn_guard, - &*api_config_guard, - &*api_client_guard, - ) - .await, - )?; + let output_ok = + crate::api::api::invalidate_id_cache(&*api_client_guard).await?; Ok(output_ok) })() .await, @@ -8941,16 +8301,17 @@ fn wire__crate__api__api__make_statuskit_impl( }, ) } -fn wire__crate__api__api__make_token_provider_impl( +fn wire__crate__api__api__invite_to_channel_impl( + port_: flutter_rust_bridge::for_generated::MessagePort, ptr_: flutter_rust_bridge::for_generated::PlatformGeneralizedUint8ListPtr, rust_vec_len_: i32, data_len_: i32, -) -> flutter_rust_bridge::for_generated::WireSyncRust2DartSse { - FLUTTER_RUST_BRIDGE_HANDLER.wrap_sync::( +) { + FLUTTER_RUST_BRIDGE_HANDLER.wrap_async::( flutter_rust_bridge::for_generated::TaskInfo { - debug_name: "make_token_provider", - port: None, - mode: flutter_rust_bridge::for_generated::FfiCallMode::Sync, + debug_name: "invite_to_channel", + port: Some(port_), + mode: flutter_rust_bridge::for_generated::FfiCallMode::Normal, }, move || { let message = unsafe { @@ -8962,58 +8323,62 @@ fn wire__crate__api__api__make_token_provider_impl( }; let mut deserializer = flutter_rust_bridge::for_generated::SseDeserializer::new(message); - let api_account = >>, + Arc>, >, >>::sse_decode(&mut deserializer); - let api_config = , + let api_handle = ::sse_decode(&mut deserializer); + let api_to = >::sse_decode(&mut deserializer); deserializer.end(); - transform_result_sse::<_, ()>((move || { - let mut api_account_guard = None; - let mut api_config_guard = None; - let decode_indices_ = - flutter_rust_bridge::for_generated::lockable_compute_decode_order(vec![ - flutter_rust_bridge::for_generated::LockableOrderInfo::new( - &api_account, - 0, - false, - ), - flutter_rust_bridge::for_generated::LockableOrderInfo::new( - &api_config, - 1, - false, - ), - ]); - for i in decode_indices_ { - match i { - 0 => api_account_guard = Some(api_account.lockable_decode_sync_ref()), - 1 => api_config_guard = Some(api_config.lockable_decode_sync_ref()), - _ => unreachable!(), - } - } - let api_account_guard = api_account_guard.unwrap(); - let api_config_guard = api_config_guard.unwrap(); - let output_ok = Result::<_, ()>::Ok(crate::api::api::make_token_provider( - &*api_account_guard, - &*api_config_guard, - ))?; - Ok(output_ok) - })()) + move |context| async move { + transform_result_sse::<_, flutter_rust_bridge::for_generated::anyhow::Error>( + (move || async move { + let mut api_status_guard = None; + let decode_indices_ = + flutter_rust_bridge::for_generated::lockable_compute_decode_order( + vec![flutter_rust_bridge::for_generated::LockableOrderInfo::new( + &api_status, + 0, + false, + )], + ); + for i in decode_indices_ { + match i { + 0 => { + api_status_guard = + Some(api_status.lockable_decode_async_ref().await) + } + _ => unreachable!(), + } + } + let api_status_guard = api_status_guard.unwrap(); + let output_ok = crate::api::api::invite_to_channel( + &*api_status_guard, + api_handle, + api_to, + ) + .await?; + Ok(output_ok) + })() + .await, + ) + } }, ) } -fn wire__crate__api__api__message_parts_raw_text_impl( +fn wire__crate__api__api__invite_user_impl( port_: flutter_rust_bridge::for_generated::MessagePort, ptr_: flutter_rust_bridge::for_generated::PlatformGeneralizedUint8ListPtr, rust_vec_len_: i32, data_len_: i32, ) { - FLUTTER_RUST_BRIDGE_HANDLER.wrap_normal::( + FLUTTER_RUST_BRIDGE_HANDLER.wrap_async::( flutter_rust_bridge::for_generated::TaskInfo { - debug_name: "message_parts_raw_text", + debug_name: "invite_user", port: Some(port_), mode: flutter_rust_bridge::for_generated::FfiCallMode::Normal, }, @@ -9027,28 +8392,61 @@ fn wire__crate__api__api__message_parts_raw_text_impl( }; let mut deserializer = flutter_rust_bridge::for_generated::SseDeserializer::new(message); - let api_that = ::sse_decode(&mut deserializer); + let api_passwords = >, + >, + >>::sse_decode(&mut deserializer); + let api_gid = ::sse_decode(&mut deserializer); + let api_handle = ::sse_decode(&mut deserializer); deserializer.end(); - move |context| { - transform_result_sse::<_, ()>((move || { - let output_ok = - Result::<_, ()>::Ok(crate::api::api::MessageParts::raw_text(&api_that))?; - Ok(output_ok) - })()) + move |context| async move { + transform_result_sse::<_, flutter_rust_bridge::for_generated::anyhow::Error>( + (move || async move { + let mut api_passwords_guard = None; + let decode_indices_ = + flutter_rust_bridge::for_generated::lockable_compute_decode_order( + vec![flutter_rust_bridge::for_generated::LockableOrderInfo::new( + &api_passwords, + 0, + false, + )], + ); + for i in decode_indices_ { + match i { + 0 => { + api_passwords_guard = + Some(api_passwords.lockable_decode_async_ref().await) + } + _ => unreachable!(), + } + } + let api_passwords_guard = api_passwords_guard.unwrap(); + let output_ok = crate::api::api::invite_user( + &*api_passwords_guard, + api_gid, + api_handle, + ) + .await?; + Ok(output_ok) + })() + .await, + ) } }, ) } -fn wire__crate__api__api__ms_to_date_impl( +fn wire__crate__api__api__is_in_clique_impl( + port_: flutter_rust_bridge::for_generated::MessagePort, ptr_: flutter_rust_bridge::for_generated::PlatformGeneralizedUint8ListPtr, rust_vec_len_: i32, data_len_: i32, -) -> flutter_rust_bridge::for_generated::WireSyncRust2DartSse { - FLUTTER_RUST_BRIDGE_HANDLER.wrap_sync::( +) { + FLUTTER_RUST_BRIDGE_HANDLER.wrap_async::( flutter_rust_bridge::for_generated::TaskInfo { - debug_name: "ms_to_date", - port: None, - mode: flutter_rust_bridge::for_generated::FfiCallMode::Sync, + debug_name: "is_in_clique", + port: Some(port_), + mode: flutter_rust_bridge::for_generated::FfiCallMode::Normal, }, move || { let message = unsafe { @@ -9060,24 +8458,54 @@ fn wire__crate__api__api__ms_to_date_impl( }; let mut deserializer = flutter_rust_bridge::for_generated::SseDeserializer::new(message); - let api_ms = ::sse_decode(&mut deserializer); + let api_keychain = >, + >, + >>::sse_decode(&mut deserializer); deserializer.end(); - transform_result_sse::<_, ()>((move || { - let output_ok = Result::<_, ()>::Ok(crate::api::api::ms_to_date(api_ms))?; - Ok(output_ok) - })()) + move |context| async move { + transform_result_sse::<_, ()>( + (move || async move { + let mut api_keychain_guard = None; + let decode_indices_ = + flutter_rust_bridge::for_generated::lockable_compute_decode_order( + vec![flutter_rust_bridge::for_generated::LockableOrderInfo::new( + &api_keychain, + 0, + false, + )], + ); + for i in decode_indices_ { + match i { + 0 => { + api_keychain_guard = + Some(api_keychain.lockable_decode_async_ref().await) + } + _ => unreachable!(), + } + } + let api_keychain_guard = api_keychain_guard.unwrap(); + let output_ok = Result::<_, ()>::Ok( + crate::api::api::is_in_clique(&*api_keychain_guard).await, + )?; + Ok(output_ok) + })() + .await, + ) + } }, ) } -fn wire__crate__api__api__my_async_runtime_default_impl( +fn wire__crate__api__api__join_clique_with_bottle_impl( port_: flutter_rust_bridge::for_generated::MessagePort, ptr_: flutter_rust_bridge::for_generated::PlatformGeneralizedUint8ListPtr, rust_vec_len_: i32, data_len_: i32, ) { - FLUTTER_RUST_BRIDGE_HANDLER.wrap_normal::( + FLUTTER_RUST_BRIDGE_HANDLER.wrap_async::( flutter_rust_bridge::for_generated::TaskInfo { - debug_name: "my_async_runtime_default", + debug_name: "join_clique_with_bottle", port: Some(port_), mode: flutter_rust_bridge::for_generated::FfiCallMode::Normal, }, @@ -9091,18 +8519,68 @@ fn wire__crate__api__api__my_async_runtime_default_impl( }; let mut deserializer = flutter_rust_bridge::for_generated::SseDeserializer::new(message); + let api_keychain = >, + >, + >>::sse_decode(&mut deserializer); + let api_bottle = , + >>::sse_decode(&mut deserializer); + let api_password = ::sse_decode(&mut deserializer); + let api_device_password = ::sse_decode(&mut deserializer); deserializer.end(); - move |context| { - transform_result_sse::<_, ()>((move || { - let output_ok = - Result::<_, ()>::Ok(crate::api::api::MyAsyncRuntime::default())?; - Ok(output_ok) - })()) + move |context| async move { + transform_result_sse::<_, flutter_rust_bridge::for_generated::anyhow::Error>( + (move || async move { + let mut api_keychain_guard = None; + let mut api_bottle_guard = None; + let decode_indices_ = + flutter_rust_bridge::for_generated::lockable_compute_decode_order( + vec![ + flutter_rust_bridge::for_generated::LockableOrderInfo::new( + &api_keychain, + 0, + false, + ), + flutter_rust_bridge::for_generated::LockableOrderInfo::new( + &api_bottle, + 1, + false, + ), + ], + ); + for i in decode_indices_ { + match i { + 0 => { + api_keychain_guard = + Some(api_keychain.lockable_decode_async_ref().await) + } + 1 => { + api_bottle_guard = + Some(api_bottle.lockable_decode_async_ref().await) + } + _ => unreachable!(), + } + } + let api_keychain_guard = api_keychain_guard.unwrap(); + let api_bottle_guard = api_bottle_guard.unwrap(); + let output_ok = crate::api::api::join_clique_with_bottle( + &*api_keychain_guard, + &*api_bottle_guard, + api_password, + api_device_password, + ) + .await?; + Ok(output_ok) + })() + .await, + ) } }, ) } -fn wire__crate__api__api__new_msg_impl( +fn wire__crate__api__api__make_anisette_impl( port_: flutter_rust_bridge::for_generated::MessagePort, ptr_: flutter_rust_bridge::for_generated::PlatformGeneralizedUint8ListPtr, rust_vec_len_: i32, @@ -9110,7 +8588,7 @@ fn wire__crate__api__api__new_msg_impl( ) { FLUTTER_RUST_BRIDGE_HANDLER.wrap_async::( flutter_rust_bridge::for_generated::TaskInfo { - debug_name: "new_msg", + debug_name: "make_anisette", port: Some(port_), mode: flutter_rust_bridge::for_generated::FfiCallMode::Normal, }, @@ -9124,17 +8602,54 @@ fn wire__crate__api__api__new_msg_impl( }; let mut deserializer = flutter_rust_bridge::for_generated::SseDeserializer::new(message); - let api_conversation = - ::sse_decode(&mut deserializer); - let api_sender = ::sse_decode(&mut deserializer); - let api_message = ::sse_decode(&mut deserializer); + let api_path = ::sse_decode(&mut deserializer); + let api_config = , + >>::sse_decode(&mut deserializer); + let api_conn = , + >>::sse_decode(&mut deserializer); deserializer.end(); move |context| async move { transform_result_sse::<_, ()>( (move || async move { + let mut api_config_guard = None; + let mut api_conn_guard = None; + let decode_indices_ = + flutter_rust_bridge::for_generated::lockable_compute_decode_order( + vec![ + flutter_rust_bridge::for_generated::LockableOrderInfo::new( + &api_config, + 0, + false, + ), + flutter_rust_bridge::for_generated::LockableOrderInfo::new( + &api_conn, 1, false, + ), + ], + ); + for i in decode_indices_ { + match i { + 0 => { + api_config_guard = + Some(api_config.lockable_decode_async_ref().await) + } + 1 => { + api_conn_guard = + Some(api_conn.lockable_decode_async_ref().await) + } + _ => unreachable!(), + } + } + let api_config_guard = api_config_guard.unwrap(); + let api_conn_guard = api_conn_guard.unwrap(); let output_ok = Result::<_, ()>::Ok( - crate::api::api::new_msg(api_conversation, api_sender, api_message) - .await, + crate::api::api::make_anisette( + api_path, + &*api_config_guard, + &*api_conn_guard, + ) + .await, )?; Ok(output_ok) })() @@ -9144,45 +8659,14 @@ fn wire__crate__api__api__new_msg_impl( }, ) } -fn wire__crate__api__api__new_ngm_identity_impl( - ptr_: flutter_rust_bridge::for_generated::PlatformGeneralizedUint8ListPtr, - rust_vec_len_: i32, - data_len_: i32, -) -> flutter_rust_bridge::for_generated::WireSyncRust2DartSse { - FLUTTER_RUST_BRIDGE_HANDLER.wrap_sync::( - flutter_rust_bridge::for_generated::TaskInfo { - debug_name: "new_ngm_identity", - port: None, - mode: flutter_rust_bridge::for_generated::FfiCallMode::Sync, - }, - move || { - let message = unsafe { - flutter_rust_bridge::for_generated::Dart2RustMessageSse::from_wire( - ptr_, - rust_vec_len_, - data_len_, - ) - }; - let mut deserializer = - flutter_rust_bridge::for_generated::SseDeserializer::new(message); - deserializer.end(); - transform_result_sse::<_, flutter_rust_bridge::for_generated::anyhow::Error>( - (move || { - let output_ok = crate::api::api::new_ngm_identity()?; - Ok(output_ok) - })(), - ) - }, - ) -} -fn wire__crate__api__api__ns_attributed_string_decode_impl( +fn wire__crate__api__api__make_circle_sessions_impl( ptr_: flutter_rust_bridge::for_generated::PlatformGeneralizedUint8ListPtr, rust_vec_len_: i32, data_len_: i32, ) -> flutter_rust_bridge::for_generated::WireSyncRust2DartSse { FLUTTER_RUST_BRIDGE_HANDLER.wrap_sync::( flutter_rust_bridge::for_generated::TaskInfo { - debug_name: "ns_attributed_string_decode", + debug_name: "make_circle_sessions", port: None, mode: flutter_rust_bridge::for_generated::FfiCallMode::Sync, }, @@ -9196,41 +8680,22 @@ fn wire__crate__api__api__ns_attributed_string_decode_impl( }; let mut deserializer = flutter_rust_bridge::for_generated::SseDeserializer::new(message); - let api_val = , - >>::sse_decode(&mut deserializer); deserializer.end(); transform_result_sse::<_, ()>((move || { - let mut api_val_guard = None; - let decode_indices_ = - flutter_rust_bridge::for_generated::lockable_compute_decode_order(vec![ - flutter_rust_bridge::for_generated::LockableOrderInfo::new( - &api_val, 0, false, - ), - ]); - for i in decode_indices_ { - match i { - 0 => api_val_guard = Some(api_val.lockable_decode_sync_ref()), - _ => unreachable!(), - } - } - let api_val_guard = api_val_guard.unwrap(); - let output_ok = Result::<_, ()>::Ok(crate::api::api::NSAttributedString::decode( - &*api_val_guard, - ))?; + let output_ok = Result::<_, ()>::Ok(crate::api::api::make_circle_sessions())?; Ok(output_ok) })()) }, ) } -fn wire__crate__api__api__ns_attributed_string_encode_impl( +fn wire__crate__api__api__make_client_session_impl( ptr_: flutter_rust_bridge::for_generated::PlatformGeneralizedUint8ListPtr, rust_vec_len_: i32, data_len_: i32, ) -> flutter_rust_bridge::for_generated::WireSyncRust2DartSse { FLUTTER_RUST_BRIDGE_HANDLER.wrap_sync::( flutter_rust_bridge::for_generated::TaskInfo { - debug_name: "ns_attributed_string_encode", + debug_name: "make_client_session", port: None, mode: flutter_rust_bridge::for_generated::FfiCallMode::Sync, }, @@ -9244,24 +8709,26 @@ fn wire__crate__api__api__ns_attributed_string_encode_impl( }; let mut deserializer = flutter_rust_bridge::for_generated::SseDeserializer::new(message); - let api_that = ::sse_decode(&mut deserializer); + let api_circle = >>::sse_decode( + &mut deserializer, + ); deserializer.end(); transform_result_sse::<_, ()>((move || { let output_ok = - Result::<_, ()>::Ok(crate::api::api::NSAttributedString::encode(&api_that))?; + Result::<_, ()>::Ok(crate::api::api::make_client_session(api_circle))?; Ok(output_ok) })()) }, ) } -fn wire__crate__api__api__ns_null_impl( +fn wire__crate__api__api__make_cloud_messages_client_impl( ptr_: flutter_rust_bridge::for_generated::PlatformGeneralizedUint8ListPtr, rust_vec_len_: i32, data_len_: i32, ) -> flutter_rust_bridge::for_generated::WireSyncRust2DartSse { FLUTTER_RUST_BRIDGE_HANDLER.wrap_sync::( flutter_rust_bridge::for_generated::TaskInfo { - debug_name: "ns_null", + debug_name: "make_cloud_messages_client", port: None, mode: flutter_rust_bridge::for_generated::FfiCallMode::Sync, }, @@ -9275,24 +8742,62 @@ fn wire__crate__api__api__ns_null_impl( }; let mut deserializer = flutter_rust_bridge::for_generated::SseDeserializer::new(message); + let api_cloudkit = >, + >, + >>::sse_decode(&mut deserializer); + let api_keychain = >, + >, + >>::sse_decode(&mut deserializer); deserializer.end(); transform_result_sse::<_, ()>((move || { - let output_ok = Result::<_, ()>::Ok(crate::api::api::ns_null())?; + let mut api_cloudkit_guard = None; + let mut api_keychain_guard = None; + let decode_indices_ = + flutter_rust_bridge::for_generated::lockable_compute_decode_order(vec![ + flutter_rust_bridge::for_generated::LockableOrderInfo::new( + &api_cloudkit, + 0, + false, + ), + flutter_rust_bridge::for_generated::LockableOrderInfo::new( + &api_keychain, + 1, + false, + ), + ]); + for i in decode_indices_ { + match i { + 0 => api_cloudkit_guard = Some(api_cloudkit.lockable_decode_sync_ref()), + 1 => api_keychain_guard = Some(api_keychain.lockable_decode_sync_ref()), + _ => unreachable!(), + } + } + let api_cloudkit_guard = api_cloudkit_guard.unwrap(); + let api_keychain_guard = api_keychain_guard.unwrap(); + let output_ok = Result::<_, ()>::Ok(crate::api::api::make_cloud_messages_client( + &*api_cloudkit_guard, + &*api_keychain_guard, + ))?; Ok(output_ok) })()) }, ) } -fn wire__crate__api__api__ns_number_decode_impl( +fn wire__crate__api__api__make_cloudkit_impl( + port_: flutter_rust_bridge::for_generated::MessagePort, ptr_: flutter_rust_bridge::for_generated::PlatformGeneralizedUint8ListPtr, rust_vec_len_: i32, data_len_: i32, -) -> flutter_rust_bridge::for_generated::WireSyncRust2DartSse { - FLUTTER_RUST_BRIDGE_HANDLER.wrap_sync::( +) { + FLUTTER_RUST_BRIDGE_HANDLER.wrap_async::( flutter_rust_bridge::for_generated::TaskInfo { - debug_name: "ns_number_decode", - port: None, - mode: flutter_rust_bridge::for_generated::FfiCallMode::Sync, + debug_name: "make_cloudkit", + port: Some(port_), + mode: flutter_rust_bridge::for_generated::FfiCallMode::Normal, }, move || { let message = unsafe { @@ -9304,208 +8809,93 @@ fn wire__crate__api__api__ns_number_decode_impl( }; let mut deserializer = flutter_rust_bridge::for_generated::SseDeserializer::new(message); - let api_val = , + let api_path = ::sse_decode(&mut deserializer); + let api_anisette = , + >, + >>::sse_decode(&mut deserializer); + let api_config = , + >>::sse_decode(&mut deserializer); + let api_token_provider = >, + >, >>::sse_decode(&mut deserializer); deserializer.end(); - transform_result_sse::<_, ()>((move || { - let mut api_val_guard = None; - let decode_indices_ = - flutter_rust_bridge::for_generated::lockable_compute_decode_order(vec![ - flutter_rust_bridge::for_generated::LockableOrderInfo::new( - &api_val, 0, false, - ), - ]); - for i in decode_indices_ { - match i { - 0 => api_val_guard = Some(api_val.lockable_decode_sync_ref()), - _ => unreachable!(), - } - } - let api_val_guard = api_val_guard.unwrap(); - let output_ok = - Result::<_, ()>::Ok(crate::api::api::NSNumber::decode(&*api_val_guard))?; - Ok(output_ok) - })()) - }, - ) -} -fn wire__crate__api__api__ns_number_encode_impl( - ptr_: flutter_rust_bridge::for_generated::PlatformGeneralizedUint8ListPtr, - rust_vec_len_: i32, - data_len_: i32, -) -> flutter_rust_bridge::for_generated::WireSyncRust2DartSse { - FLUTTER_RUST_BRIDGE_HANDLER.wrap_sync::( - flutter_rust_bridge::for_generated::TaskInfo { - debug_name: "ns_number_encode", - port: None, - mode: flutter_rust_bridge::for_generated::FfiCallMode::Sync, - }, - move || { - let message = unsafe { - flutter_rust_bridge::for_generated::Dart2RustMessageSse::from_wire( - ptr_, - rust_vec_len_, - data_len_, - ) - }; - let mut deserializer = - flutter_rust_bridge::for_generated::SseDeserializer::new(message); - let api_that = ::sse_decode(&mut deserializer); - deserializer.end(); - transform_result_sse::<_, ()>((move || { - let output_ok = Result::<_, ()>::Ok(crate::api::api::NSNumber::encode(&api_that))?; - Ok(output_ok) - })()) - }, - ) -} -fn wire__crate__api__api__ns_string_decode_impl( - ptr_: flutter_rust_bridge::for_generated::PlatformGeneralizedUint8ListPtr, - rust_vec_len_: i32, - data_len_: i32, -) -> flutter_rust_bridge::for_generated::WireSyncRust2DartSse { - FLUTTER_RUST_BRIDGE_HANDLER.wrap_sync::( - flutter_rust_bridge::for_generated::TaskInfo { - debug_name: "ns_string_decode", - port: None, - mode: flutter_rust_bridge::for_generated::FfiCallMode::Sync, - }, - move || { - let message = unsafe { - flutter_rust_bridge::for_generated::Dart2RustMessageSse::from_wire( - ptr_, - rust_vec_len_, - data_len_, - ) - }; - let mut deserializer = - flutter_rust_bridge::for_generated::SseDeserializer::new(message); - let api_val = , - >>::sse_decode(&mut deserializer); - deserializer.end(); - transform_result_sse::<_, ()>((move || { - let mut api_val_guard = None; - let decode_indices_ = - flutter_rust_bridge::for_generated::lockable_compute_decode_order(vec![ - flutter_rust_bridge::for_generated::LockableOrderInfo::new( - &api_val, 0, false, - ), - ]); - for i in decode_indices_ { - match i { - 0 => api_val_guard = Some(api_val.lockable_decode_sync_ref()), - _ => unreachable!(), - } - } - let api_val_guard = api_val_guard.unwrap(); - let output_ok = - Result::<_, ()>::Ok(crate::api::api::NSString::decode(&*api_val_guard))?; - Ok(output_ok) - })()) - }, - ) -} -fn wire__crate__api__api__ns_string_encode_impl( - ptr_: flutter_rust_bridge::for_generated::PlatformGeneralizedUint8ListPtr, - rust_vec_len_: i32, - data_len_: i32, -) -> flutter_rust_bridge::for_generated::WireSyncRust2DartSse { - FLUTTER_RUST_BRIDGE_HANDLER.wrap_sync::( - flutter_rust_bridge::for_generated::TaskInfo { - debug_name: "ns_string_encode", - port: None, - mode: flutter_rust_bridge::for_generated::FfiCallMode::Sync, - }, - move || { - let message = unsafe { - flutter_rust_bridge::for_generated::Dart2RustMessageSse::from_wire( - ptr_, - rust_vec_len_, - data_len_, - ) - }; - let mut deserializer = - flutter_rust_bridge::for_generated::SseDeserializer::new(message); - let api_that = ::sse_decode(&mut deserializer); - deserializer.end(); - transform_result_sse::<_, ()>((move || { - let output_ok = Result::<_, ()>::Ok(crate::api::api::NSString::encode(&api_that))?; - Ok(output_ok) - })()) - }, - ) -} -fn wire__crate__api__api__nscoder_decode_impl( - ptr_: flutter_rust_bridge::for_generated::PlatformGeneralizedUint8ListPtr, - rust_vec_len_: i32, - data_len_: i32, -) -> flutter_rust_bridge::for_generated::WireSyncRust2DartSse { - FLUTTER_RUST_BRIDGE_HANDLER.wrap_sync::( - flutter_rust_bridge::for_generated::TaskInfo { - debug_name: "nscoder_decode", - port: None, - mode: flutter_rust_bridge::for_generated::FfiCallMode::Sync, - }, - move || { - let message = unsafe { - flutter_rust_bridge::for_generated::Dart2RustMessageSse::from_wire( - ptr_, - rust_vec_len_, - data_len_, - ) - }; - let mut deserializer = - flutter_rust_bridge::for_generated::SseDeserializer::new(message); - let api_data = >::sse_decode(&mut deserializer); - deserializer.end(); - transform_result_sse::<_, ()>((move || { - let output_ok = Result::<_, ()>::Ok(crate::api::api::nscoder_decode(&api_data))?; - Ok(output_ok) - })()) - }, - ) -} -fn wire__crate__api__api__nscoder_encode_impl( - ptr_: flutter_rust_bridge::for_generated::PlatformGeneralizedUint8ListPtr, - rust_vec_len_: i32, - data_len_: i32, -) -> flutter_rust_bridge::for_generated::WireSyncRust2DartSse { - FLUTTER_RUST_BRIDGE_HANDLER.wrap_sync::( - flutter_rust_bridge::for_generated::TaskInfo { - debug_name: "nscoder_encode", - port: None, - mode: flutter_rust_bridge::for_generated::FfiCallMode::Sync, - }, - move || { - let message = unsafe { - flutter_rust_bridge::for_generated::Dart2RustMessageSse::from_wire( - ptr_, - rust_vec_len_, - data_len_, + move |context| async move { + transform_result_sse::<_, ()>( + (move || async move { + let mut api_anisette_guard = None; + let mut api_config_guard = None; + let mut api_token_provider_guard = None; + let decode_indices_ = + flutter_rust_bridge::for_generated::lockable_compute_decode_order( + vec![ + flutter_rust_bridge::for_generated::LockableOrderInfo::new( + &api_anisette, + 0, + false, + ), + flutter_rust_bridge::for_generated::LockableOrderInfo::new( + &api_config, + 1, + false, + ), + flutter_rust_bridge::for_generated::LockableOrderInfo::new( + &api_token_provider, + 2, + false, + ), + ], + ); + for i in decode_indices_ { + match i { + 0 => { + api_anisette_guard = + Some(api_anisette.lockable_decode_async_ref().await) + } + 1 => { + api_config_guard = + Some(api_config.lockable_decode_async_ref().await) + } + 2 => { + api_token_provider_guard = + Some(api_token_provider.lockable_decode_async_ref().await) + } + _ => unreachable!(), + } + } + let api_anisette_guard = api_anisette_guard.unwrap(); + let api_config_guard = api_config_guard.unwrap(); + let api_token_provider_guard = api_token_provider_guard.unwrap(); + let output_ok = Result::<_, ()>::Ok( + crate::api::api::make_cloudkit( + api_path, + &*api_anisette_guard, + &*api_config_guard, + &*api_token_provider_guard, + ) + .await, + )?; + Ok(output_ok) + })() + .await, ) - }; - let mut deserializer = - flutter_rust_bridge::for_generated::SseDeserializer::new(message); - let api_value = >::sse_decode(&mut deserializer); - deserializer.end(); - transform_result_sse::<_, ()>((move || { - let output_ok = Result::<_, ()>::Ok(crate::api::api::nscoder_encode(&api_value))?; - Ok(output_ok) - })()) + } }, ) } -fn wire__crate__api__api__pack_transcript_poster_impl( +fn wire__crate__api__api__make_facetime_impl( port_: flutter_rust_bridge::for_generated::MessagePort, ptr_: flutter_rust_bridge::for_generated::PlatformGeneralizedUint8ListPtr, rust_vec_len_: i32, data_len_: i32, ) { - FLUTTER_RUST_BRIDGE_HANDLER.wrap_normal::( + FLUTTER_RUST_BRIDGE_HANDLER.wrap_async::( flutter_rust_bridge::for_generated::TaskInfo { - debug_name: "pack_transcript_poster", + debug_name: "make_facetime", port: Some(port_), mode: flutter_rust_bridge::for_generated::FfiCallMode::Normal, }, @@ -9519,29 +8909,72 @@ fn wire__crate__api__api__pack_transcript_poster_impl( }; let mut deserializer = flutter_rust_bridge::for_generated::SseDeserializer::new(message); - let api_payload = - ::sse_decode(&mut deserializer); + let api_path = ::sse_decode(&mut deserializer); + let api_conn = , + >>::sse_decode(&mut deserializer); + let api_client = >, + >>::sse_decode(&mut deserializer); deserializer.end(); - move |context| { - transform_result_sse::<_, flutter_rust_bridge::for_generated::anyhow::Error>( - (move || { - let output_ok = crate::api::api::pack_transcript_poster(api_payload)?; + move |context| async move { + transform_result_sse::<_, ()>( + (move || async move { + let mut api_conn_guard = None; + let mut api_client_guard = None; + let decode_indices_ = + flutter_rust_bridge::for_generated::lockable_compute_decode_order( + vec![ + flutter_rust_bridge::for_generated::LockableOrderInfo::new( + &api_conn, 0, false, + ), + flutter_rust_bridge::for_generated::LockableOrderInfo::new( + &api_client, + 1, + false, + ), + ], + ); + for i in decode_indices_ { + match i { + 0 => { + api_conn_guard = + Some(api_conn.lockable_decode_async_ref().await) + } + 1 => { + api_client_guard = + Some(api_client.lockable_decode_async_ref().await) + } + _ => unreachable!(), + } + } + let api_conn_guard = api_conn_guard.unwrap(); + let api_client_guard = api_client_guard.unwrap(); + let output_ok = Result::<_, ()>::Ok( + crate::api::api::make_facetime( + api_path, + &*api_conn_guard, + &*api_client_guard, + ) + .await, + )?; Ok(output_ok) - })(), + })() + .await, ) } }, ) } -fn wire__crate__api__api__parse_poster_impl( +fn wire__crate__api__api__make_find_my_friends_impl( port_: flutter_rust_bridge::for_generated::MessagePort, ptr_: flutter_rust_bridge::for_generated::PlatformGeneralizedUint8ListPtr, rust_vec_len_: i32, data_len_: i32, ) { - FLUTTER_RUST_BRIDGE_HANDLER.wrap_normal::( + FLUTTER_RUST_BRIDGE_HANDLER.wrap_async::( flutter_rust_bridge::for_generated::TaskInfo { - debug_name: "parse_poster", + debug_name: "make_find_my_friends", port: Some(port_), mode: flutter_rust_bridge::for_generated::FfiCallMode::Normal, }, @@ -9555,28 +8988,103 @@ fn wire__crate__api__api__parse_poster_impl( }; let mut deserializer = flutter_rust_bridge::for_generated::SseDeserializer::new(message); - let api_poster = ::sse_decode(&mut deserializer); + let api_path = ::sse_decode(&mut deserializer); + let api_config = , + >>::sse_decode(&mut deserializer); + let api_aps = , + >>::sse_decode(&mut deserializer); + let api_anisette = , + >, + >>::sse_decode(&mut deserializer); + let api_provider = >, + >, + >>::sse_decode(&mut deserializer); deserializer.end(); - move |context| { + move |context| async move { transform_result_sse::<_, flutter_rust_bridge::for_generated::anyhow::Error>( - (move || { - let output_ok = crate::api::api::parse_poster(api_poster)?; + (move || async move { + let mut api_config_guard = None; + let mut api_aps_guard = None; + let mut api_anisette_guard = None; + let mut api_provider_guard = None; + let decode_indices_ = + flutter_rust_bridge::for_generated::lockable_compute_decode_order( + vec![ + flutter_rust_bridge::for_generated::LockableOrderInfo::new( + &api_config, + 0, + false, + ), + flutter_rust_bridge::for_generated::LockableOrderInfo::new( + &api_aps, 1, false, + ), + flutter_rust_bridge::for_generated::LockableOrderInfo::new( + &api_anisette, + 2, + false, + ), + flutter_rust_bridge::for_generated::LockableOrderInfo::new( + &api_provider, + 3, + false, + ), + ], + ); + for i in decode_indices_ { + match i { + 0 => { + api_config_guard = + Some(api_config.lockable_decode_async_ref().await) + } + 1 => { + api_aps_guard = Some(api_aps.lockable_decode_async_ref().await) + } + 2 => { + api_anisette_guard = + Some(api_anisette.lockable_decode_async_ref().await) + } + 3 => { + api_provider_guard = + Some(api_provider.lockable_decode_async_ref().await) + } + _ => unreachable!(), + } + } + let api_config_guard = api_config_guard.unwrap(); + let api_aps_guard = api_aps_guard.unwrap(); + let api_anisette_guard = api_anisette_guard.unwrap(); + let api_provider_guard = api_provider_guard.unwrap(); + let output_ok = crate::api::api::make_find_my_friends( + api_path, + &*api_config_guard, + &*api_aps_guard, + &*api_anisette_guard, + &*api_provider_guard, + ) + .await?; Ok(output_ok) - })(), + })() + .await, ) } }, ) } -fn wire__crate__api__api__parse_poster_save_impl( +fn wire__crate__api__api__make_find_my_phone_impl( port_: flutter_rust_bridge::for_generated::MessagePort, ptr_: flutter_rust_bridge::for_generated::PlatformGeneralizedUint8ListPtr, rust_vec_len_: i32, data_len_: i32, ) { - FLUTTER_RUST_BRIDGE_HANDLER.wrap_normal::( + FLUTTER_RUST_BRIDGE_HANDLER.wrap_async::( flutter_rust_bridge::for_generated::TaskInfo { - debug_name: "parse_poster_save", + debug_name: "make_find_my_phone", port: Some(port_), mode: flutter_rust_bridge::for_generated::FfiCallMode::Normal, }, @@ -9590,29 +9098,103 @@ fn wire__crate__api__api__parse_poster_save_impl( }; let mut deserializer = flutter_rust_bridge::for_generated::SseDeserializer::new(message); - let api_poster = - ::sse_decode(&mut deserializer); + let api_path = ::sse_decode(&mut deserializer); + let api_config = , + >>::sse_decode(&mut deserializer); + let api_aps = , + >>::sse_decode(&mut deserializer); + let api_anisette = , + >, + >>::sse_decode(&mut deserializer); + let api_provider = >, + >, + >>::sse_decode(&mut deserializer); deserializer.end(); - move |context| { + move |context| async move { transform_result_sse::<_, flutter_rust_bridge::for_generated::anyhow::Error>( - (move || { - let output_ok = crate::api::api::parse_poster_save(api_poster)?; + (move || async move { + let mut api_config_guard = None; + let mut api_aps_guard = None; + let mut api_anisette_guard = None; + let mut api_provider_guard = None; + let decode_indices_ = + flutter_rust_bridge::for_generated::lockable_compute_decode_order( + vec![ + flutter_rust_bridge::for_generated::LockableOrderInfo::new( + &api_config, + 0, + false, + ), + flutter_rust_bridge::for_generated::LockableOrderInfo::new( + &api_aps, 1, false, + ), + flutter_rust_bridge::for_generated::LockableOrderInfo::new( + &api_anisette, + 2, + false, + ), + flutter_rust_bridge::for_generated::LockableOrderInfo::new( + &api_provider, + 3, + false, + ), + ], + ); + for i in decode_indices_ { + match i { + 0 => { + api_config_guard = + Some(api_config.lockable_decode_async_ref().await) + } + 1 => { + api_aps_guard = Some(api_aps.lockable_decode_async_ref().await) + } + 2 => { + api_anisette_guard = + Some(api_anisette.lockable_decode_async_ref().await) + } + 3 => { + api_provider_guard = + Some(api_provider.lockable_decode_async_ref().await) + } + _ => unreachable!(), + } + } + let api_config_guard = api_config_guard.unwrap(); + let api_aps_guard = api_aps_guard.unwrap(); + let api_anisette_guard = api_anisette_guard.unwrap(); + let api_provider_guard = api_provider_guard.unwrap(); + let output_ok = crate::api::api::make_find_my_phone( + api_path, + &*api_config_guard, + &*api_aps_guard, + &*api_anisette_guard, + &*api_provider_guard, + ) + .await?; Ok(output_ok) - })(), + })() + .await, ) } }, ) } -fn wire__crate__api__api__parse_transcript_poster_impl( +fn wire__crate__api__api__make_findmy_impl( port_: flutter_rust_bridge::for_generated::MessagePort, ptr_: flutter_rust_bridge::for_generated::PlatformGeneralizedUint8ListPtr, rust_vec_len_: i32, data_len_: i32, ) { - FLUTTER_RUST_BRIDGE_HANDLER.wrap_normal::( + FLUTTER_RUST_BRIDGE_HANDLER.wrap_async::( flutter_rust_bridge::for_generated::TaskInfo { - debug_name: "parse_transcript_poster", + debug_name: "make_findmy", port: Some(port_), mode: flutter_rust_bridge::for_generated::FfiCallMode::Normal, }, @@ -9626,144 +9208,147 @@ fn wire__crate__api__api__parse_transcript_poster_impl( }; let mut deserializer = flutter_rust_bridge::for_generated::SseDeserializer::new(message); - let api_payload = >::sse_decode(&mut deserializer); - deserializer.end(); - move |context| { - transform_result_sse::<_, flutter_rust_bridge::for_generated::anyhow::Error>( - (move || { - let output_ok = crate::api::api::parse_transcript_poster(api_payload)?; - Ok(output_ok) - })(), - ) - } - }, - ) -} -fn wire__crate__api__api__password_manager_meta_get_data_impl( - ptr_: flutter_rust_bridge::for_generated::PlatformGeneralizedUint8ListPtr, - rust_vec_len_: i32, - data_len_: i32, -) -> flutter_rust_bridge::for_generated::WireSyncRust2DartSse { - FLUTTER_RUST_BRIDGE_HANDLER.wrap_sync::( - flutter_rust_bridge::for_generated::TaskInfo { - debug_name: "password_manager_meta_get_data", - port: None, - mode: flutter_rust_bridge::for_generated::FfiCallMode::Sync, - }, - move || { - let message = unsafe { - flutter_rust_bridge::for_generated::Dart2RustMessageSse::from_wire( - ptr_, - rust_vec_len_, - data_len_, - ) - }; - let mut deserializer = - flutter_rust_bridge::for_generated::SseDeserializer::new(message); - let api_data = - ::sse_decode(&mut deserializer); - deserializer.end(); - transform_result_sse::<_, PushError>((move || { - let output_ok = crate::api::api::PasswordManagerMeta::get_data(&api_data)?; - Ok(output_ok) - })()) - }, - ) -} -fn wire__crate__api__api__password_manager_meta_get_password_data_impl( - ptr_: flutter_rust_bridge::for_generated::PlatformGeneralizedUint8ListPtr, - rust_vec_len_: i32, - data_len_: i32, -) -> flutter_rust_bridge::for_generated::WireSyncRust2DartSse { - FLUTTER_RUST_BRIDGE_HANDLER.wrap_sync::( - flutter_rust_bridge::for_generated::TaskInfo { - debug_name: "password_manager_meta_get_password_data", - port: None, - mode: flutter_rust_bridge::for_generated::FfiCallMode::Sync, - }, - move || { - let message = unsafe { - flutter_rust_bridge::for_generated::Dart2RustMessageSse::from_wire( - ptr_, - rust_vec_len_, - data_len_, - ) - }; - let mut deserializer = - flutter_rust_bridge::for_generated::SseDeserializer::new(message); - let api_that = ::sse_decode(&mut deserializer); - deserializer.end(); - transform_result_sse::<_, PushError>((move || { - let output_ok = crate::api::api::PasswordManagerMeta::get_password_data(&api_that)?; - Ok(output_ok) - })()) - }, - ) -} -fn wire__crate__api__api__password_manager_totp_generate_otp_impl( - ptr_: flutter_rust_bridge::for_generated::PlatformGeneralizedUint8ListPtr, - rust_vec_len_: i32, - data_len_: i32, -) -> flutter_rust_bridge::for_generated::WireSyncRust2DartSse { - FLUTTER_RUST_BRIDGE_HANDLER.wrap_sync::( - flutter_rust_bridge::for_generated::TaskInfo { - debug_name: "password_manager_totp_generate_otp", - port: None, - mode: flutter_rust_bridge::for_generated::FfiCallMode::Sync, - }, - move || { - let message = unsafe { - flutter_rust_bridge::for_generated::Dart2RustMessageSse::from_wire( - ptr_, - rust_vec_len_, - data_len_, - ) - }; - let mut deserializer = - flutter_rust_bridge::for_generated::SseDeserializer::new(message); - let api_that = ::sse_decode(&mut deserializer); + let api_path = ::sse_decode(&mut deserializer); + let api_token_provider = >, + >, + >>::sse_decode(&mut deserializer); + let api_conn = , + >>::sse_decode(&mut deserializer); + let api_cloudkit = >, + >, + >>::sse_decode(&mut deserializer); + let api_keychain = >, + >, + >>::sse_decode(&mut deserializer); + let api_anisette = , + >, + >>::sse_decode(&mut deserializer); + let api_config = , + >>::sse_decode(&mut deserializer); + let api_client = >, + >>::sse_decode(&mut deserializer); deserializer.end(); - transform_result_sse::<_, PushError>((move || { - let output_ok = crate::api::api::PasswordManagerTotp::generate_otp(&api_that)?; - Ok(output_ok) - })()) - }, - ) -} -fn wire__crate__api__api__provisioned_flavor_default_impl( - port_: flutter_rust_bridge::for_generated::MessagePort, - ptr_: flutter_rust_bridge::for_generated::PlatformGeneralizedUint8ListPtr, - rust_vec_len_: i32, - data_len_: i32, -) { - FLUTTER_RUST_BRIDGE_HANDLER.wrap_normal::( - flutter_rust_bridge::for_generated::TaskInfo { - debug_name: "provisioned_flavor_default", - port: Some(port_), - mode: flutter_rust_bridge::for_generated::FfiCallMode::Normal, - }, - move || { - let message = unsafe { - flutter_rust_bridge::for_generated::Dart2RustMessageSse::from_wire( - ptr_, - rust_vec_len_, - data_len_, + move |context| async move { + transform_result_sse::<_, ()>( + (move || async move { + let mut api_token_provider_guard = None; + let mut api_conn_guard = None; + let mut api_cloudkit_guard = None; + let mut api_keychain_guard = None; + let mut api_anisette_guard = None; + let mut api_config_guard = None; + let mut api_client_guard = None; + let decode_indices_ = + flutter_rust_bridge::for_generated::lockable_compute_decode_order( + vec![ + flutter_rust_bridge::for_generated::LockableOrderInfo::new( + &api_token_provider, + 0, + false, + ), + flutter_rust_bridge::for_generated::LockableOrderInfo::new( + &api_conn, 1, false, + ), + flutter_rust_bridge::for_generated::LockableOrderInfo::new( + &api_cloudkit, + 2, + false, + ), + flutter_rust_bridge::for_generated::LockableOrderInfo::new( + &api_keychain, + 3, + false, + ), + flutter_rust_bridge::for_generated::LockableOrderInfo::new( + &api_anisette, + 4, + false, + ), + flutter_rust_bridge::for_generated::LockableOrderInfo::new( + &api_config, + 5, + false, + ), + flutter_rust_bridge::for_generated::LockableOrderInfo::new( + &api_client, + 6, + false, + ), + ], + ); + for i in decode_indices_ { + match i { + 0 => { + api_token_provider_guard = + Some(api_token_provider.lockable_decode_async_ref().await) + } + 1 => { + api_conn_guard = + Some(api_conn.lockable_decode_async_ref().await) + } + 2 => { + api_cloudkit_guard = + Some(api_cloudkit.lockable_decode_async_ref().await) + } + 3 => { + api_keychain_guard = + Some(api_keychain.lockable_decode_async_ref().await) + } + 4 => { + api_anisette_guard = + Some(api_anisette.lockable_decode_async_ref().await) + } + 5 => { + api_config_guard = + Some(api_config.lockable_decode_async_ref().await) + } + 6 => { + api_client_guard = + Some(api_client.lockable_decode_async_ref().await) + } + _ => unreachable!(), + } + } + let api_token_provider_guard = api_token_provider_guard.unwrap(); + let api_conn_guard = api_conn_guard.unwrap(); + let api_cloudkit_guard = api_cloudkit_guard.unwrap(); + let api_keychain_guard = api_keychain_guard.unwrap(); + let api_anisette_guard = api_anisette_guard.unwrap(); + let api_config_guard = api_config_guard.unwrap(); + let api_client_guard = api_client_guard.unwrap(); + let output_ok = Result::<_, ()>::Ok( + crate::api::api::make_findmy( + api_path, + &*api_token_provider_guard, + &*api_conn_guard, + &*api_cloudkit_guard, + &*api_keychain_guard, + &*api_anisette_guard, + &*api_config_guard, + &*api_client_guard, + ) + .await, + )?; + Ok(output_ok) + })() + .await, ) - }; - let mut deserializer = - flutter_rust_bridge::for_generated::SseDeserializer::new(message); - deserializer.end(); - move |context| { - transform_result_sse::<_, ()>((move || { - let output_ok = - Result::<_, ()>::Ok(crate::api::api::ProvisionedFlavor::default())?; - Ok(output_ok) - })()) } }, ) } -fn wire__crate__api__api__ptr_to_dart_impl( +fn wire__crate__api__api__make_idms_impl( port_: flutter_rust_bridge::for_generated::MessagePort, ptr_: flutter_rust_bridge::for_generated::PlatformGeneralizedUint8ListPtr, rust_vec_len_: i32, @@ -9771,7 +9356,7 @@ fn wire__crate__api__api__ptr_to_dart_impl( ) { FLUTTER_RUST_BRIDGE_HANDLER.wrap_async::( flutter_rust_bridge::for_generated::TaskInfo { - debug_name: "ptr_to_dart", + debug_name: "make_idms", port: Some(port_), mode: flutter_rust_bridge::for_generated::FfiCallMode::Normal, }, @@ -9785,13 +9370,33 @@ fn wire__crate__api__api__ptr_to_dart_impl( }; let mut deserializer = flutter_rust_bridge::for_generated::SseDeserializer::new(message); - let api_ptr = ::sse_decode(&mut deserializer); + let api_conn = , + >>::sse_decode(&mut deserializer); deserializer.end(); move |context| async move { transform_result_sse::<_, ()>( (move || async move { - let output_ok = - Result::<_, ()>::Ok(crate::api::api::ptr_to_dart(api_ptr).await)?; + let mut api_conn_guard = None; + let decode_indices_ = + flutter_rust_bridge::for_generated::lockable_compute_decode_order( + vec![flutter_rust_bridge::for_generated::LockableOrderInfo::new( + &api_conn, 0, false, + )], + ); + for i in decode_indices_ { + match i { + 0 => { + api_conn_guard = + Some(api_conn.lockable_decode_async_ref().await) + } + _ => unreachable!(), + } + } + let api_conn_guard = api_conn_guard.unwrap(); + let output_ok = Result::<_, ()>::Ok( + crate::api::api::make_idms(&*api_conn_guard).await, + )?; Ok(output_ok) })() .await, @@ -9800,7 +9405,7 @@ fn wire__crate__api__api__ptr_to_dart_impl( }, ) } -fn wire__crate__api__api__query_handle_impl( +fn wire__crate__api__api__make_imclient_impl( port_: flutter_rust_bridge::for_generated::MessagePort, ptr_: flutter_rust_bridge::for_generated::PlatformGeneralizedUint8ListPtr, rust_vec_len_: i32, @@ -9808,7 +9413,7 @@ fn wire__crate__api__api__query_handle_impl( ) { FLUTTER_RUST_BRIDGE_HANDLER.wrap_async::( flutter_rust_bridge::for_generated::TaskInfo { - debug_name: "query_handle", + debug_name: "make_imclient", port: Some(port_), mode: flutter_rust_bridge::for_generated::FfiCallMode::Normal, }, @@ -9822,38 +9427,57 @@ fn wire__crate__api__api__query_handle_impl( }; let mut deserializer = flutter_rust_bridge::for_generated::SseDeserializer::new(message); - let api_passwords = >, - >, + let api_path = ::sse_decode(&mut deserializer); + let api_conn = , + >>::sse_decode(&mut deserializer); + let api_users = >::sse_decode(&mut deserializer); + let api_identity = , >>::sse_decode(&mut deserializer); - let api_handle = ::sse_decode(&mut deserializer); deserializer.end(); move |context| async move { - transform_result_sse::<_, flutter_rust_bridge::for_generated::anyhow::Error>( + transform_result_sse::<_, ()>( (move || async move { - let mut api_passwords_guard = None; + let mut api_conn_guard = None; + let mut api_identity_guard = None; let decode_indices_ = flutter_rust_bridge::for_generated::lockable_compute_decode_order( - vec![flutter_rust_bridge::for_generated::LockableOrderInfo::new( - &api_passwords, - 0, - false, - )], + vec![ + flutter_rust_bridge::for_generated::LockableOrderInfo::new( + &api_conn, 0, false, + ), + flutter_rust_bridge::for_generated::LockableOrderInfo::new( + &api_identity, + 1, + false, + ), + ], ); for i in decode_indices_ { match i { 0 => { - api_passwords_guard = - Some(api_passwords.lockable_decode_async_ref().await) + api_conn_guard = + Some(api_conn.lockable_decode_async_ref().await) + } + 1 => { + api_identity_guard = + Some(api_identity.lockable_decode_async_ref().await) } _ => unreachable!(), } } - let api_passwords_guard = api_passwords_guard.unwrap(); - let output_ok = - crate::api::api::query_handle(&*api_passwords_guard, api_handle) - .await?; + let api_conn_guard = api_conn_guard.unwrap(); + let api_identity_guard = api_identity_guard.unwrap(); + let output_ok = Result::<_, ()>::Ok( + crate::api::api::make_imclient( + api_path, + &*api_conn_guard, + &api_users, + &*api_identity_guard, + ) + .await, + )?; Ok(output_ok) })() .await, @@ -9862,14 +9486,14 @@ fn wire__crate__api__api__query_handle_impl( }, ) } -fn wire__crate__api__api__read_hardware_impl( +fn wire__crate__api__api__make_keychain_impl( ptr_: flutter_rust_bridge::for_generated::PlatformGeneralizedUint8ListPtr, rust_vec_len_: i32, data_len_: i32, ) -> flutter_rust_bridge::for_generated::WireSyncRust2DartSse { FLUTTER_RUST_BRIDGE_HANDLER.wrap_sync::( flutter_rust_bridge::for_generated::TaskInfo { - debug_name: "read_hardware", + debug_name: "make_keychain", port: None, mode: flutter_rust_bridge::for_generated::FfiCallMode::Sync, }, @@ -9884,15 +9508,82 @@ fn wire__crate__api__api__read_hardware_impl( let mut deserializer = flutter_rust_bridge::for_generated::SseDeserializer::new(message); let api_path = ::sse_decode(&mut deserializer); + let api_cloudkit = >, + >, + >>::sse_decode(&mut deserializer); + let api_anisette = , + >, + >>::sse_decode(&mut deserializer); + let api_config = , + >>::sse_decode(&mut deserializer); + let api_token_provider = >, + >, + >>::sse_decode(&mut deserializer); deserializer.end(); transform_result_sse::<_, ()>((move || { - let output_ok = Result::<_, ()>::Ok(crate::api::api::read_hardware(api_path))?; + let mut api_cloudkit_guard = None; + let mut api_anisette_guard = None; + let mut api_config_guard = None; + let mut api_token_provider_guard = None; + let decode_indices_ = + flutter_rust_bridge::for_generated::lockable_compute_decode_order(vec![ + flutter_rust_bridge::for_generated::LockableOrderInfo::new( + &api_cloudkit, + 0, + false, + ), + flutter_rust_bridge::for_generated::LockableOrderInfo::new( + &api_anisette, + 1, + false, + ), + flutter_rust_bridge::for_generated::LockableOrderInfo::new( + &api_config, + 2, + false, + ), + flutter_rust_bridge::for_generated::LockableOrderInfo::new( + &api_token_provider, + 3, + false, + ), + ]); + for i in decode_indices_ { + match i { + 0 => api_cloudkit_guard = Some(api_cloudkit.lockable_decode_sync_ref()), + 1 => api_anisette_guard = Some(api_anisette.lockable_decode_sync_ref()), + 2 => api_config_guard = Some(api_config.lockable_decode_sync_ref()), + 3 => { + api_token_provider_guard = + Some(api_token_provider.lockable_decode_sync_ref()) + } + _ => unreachable!(), + } + } + let api_cloudkit_guard = api_cloudkit_guard.unwrap(); + let api_anisette_guard = api_anisette_guard.unwrap(); + let api_config_guard = api_config_guard.unwrap(); + let api_token_provider_guard = api_token_provider_guard.unwrap(); + let output_ok = Result::<_, ()>::Ok(crate::api::api::make_keychain( + api_path, + &*api_cloudkit_guard, + &*api_anisette_guard, + &*api_config_guard, + &*api_token_provider_guard, + ))?; Ok(output_ok) })()) }, ) } -fn wire__crate__api__api__recv_wait_impl( +fn wire__crate__api__api__make_passwords_impl( port_: flutter_rust_bridge::for_generated::MessagePort, ptr_: flutter_rust_bridge::for_generated::PlatformGeneralizedUint8ListPtr, rust_vec_len_: i32, @@ -9900,7 +9591,7 @@ fn wire__crate__api__api__recv_wait_impl( ) { FLUTTER_RUST_BRIDGE_HANDLER.wrap_async::( flutter_rust_bridge::for_generated::TaskInfo { - debug_name: "recv_wait", + debug_name: "make_passwords", port: Some(port_), mode: flutter_rust_bridge::for_generated::FfiCallMode::Normal, }, @@ -9914,49 +9605,88 @@ fn wire__crate__api__api__recv_wait_impl( }; let mut deserializer = flutter_rust_bridge::for_generated::SseDeserializer::new(message); - let api_watcher = , + let api_path = ::sse_decode(&mut deserializer); + let api_keychain = >, + >, >>::sse_decode(&mut deserializer); - let api_state = >, + let api_cloudkit = >, + >, + >>::sse_decode(&mut deserializer); + let api_client = >, + >>::sse_decode(&mut deserializer); + let api_conn = , >>::sse_decode(&mut deserializer); deserializer.end(); move |context| async move { transform_result_sse::<_, ()>( (move || async move { - let mut api_watcher_guard = None; - let mut api_state_guard = None; + let mut api_keychain_guard = None; + let mut api_cloudkit_guard = None; + let mut api_client_guard = None; + let mut api_conn_guard = None; let decode_indices_ = flutter_rust_bridge::for_generated::lockable_compute_decode_order( vec![ flutter_rust_bridge::for_generated::LockableOrderInfo::new( - &api_watcher, + &api_keychain, 0, - true, + false, ), flutter_rust_bridge::for_generated::LockableOrderInfo::new( - &api_state, 1, false, + &api_cloudkit, + 1, + false, + ), + flutter_rust_bridge::for_generated::LockableOrderInfo::new( + &api_client, + 2, + false, + ), + flutter_rust_bridge::for_generated::LockableOrderInfo::new( + &api_conn, 3, false, ), ], ); for i in decode_indices_ { match i { 0 => { - api_watcher_guard = - Some(api_watcher.lockable_decode_async_ref_mut().await) + api_keychain_guard = + Some(api_keychain.lockable_decode_async_ref().await) } 1 => { - api_state_guard = - Some(api_state.lockable_decode_async_ref().await) + api_cloudkit_guard = + Some(api_cloudkit.lockable_decode_async_ref().await) + } + 2 => { + api_client_guard = + Some(api_client.lockable_decode_async_ref().await) + } + 3 => { + api_conn_guard = + Some(api_conn.lockable_decode_async_ref().await) } _ => unreachable!(), } } - let mut api_watcher_guard = api_watcher_guard.unwrap(); - let api_state_guard = api_state_guard.unwrap(); + let api_keychain_guard = api_keychain_guard.unwrap(); + let api_cloudkit_guard = api_cloudkit_guard.unwrap(); + let api_client_guard = api_client_guard.unwrap(); + let api_conn_guard = api_conn_guard.unwrap(); let output_ok = Result::<_, ()>::Ok( - crate::api::api::recv_wait(&mut *api_watcher_guard, &*api_state_guard) - .await, + crate::api::api::make_passwords( + api_path, + &*api_keychain_guard, + &*api_cloudkit_guard, + &*api_client_guard, + &*api_conn_guard, + ) + .await, )?; Ok(output_ok) })() @@ -9966,7 +9696,7 @@ fn wire__crate__api__api__recv_wait_impl( }, ) } -fn wire__crate__api__api__refresh_background_following_impl( +fn wire__crate__api__api__make_profiles_impl( port_: flutter_rust_bridge::for_generated::MessagePort, ptr_: flutter_rust_bridge::for_generated::PlatformGeneralizedUint8ListPtr, rust_vec_len_: i32, @@ -9974,7 +9704,7 @@ fn wire__crate__api__api__refresh_background_following_impl( ) { FLUTTER_RUST_BRIDGE_HANDLER.wrap_async::( flutter_rust_bridge::for_generated::TaskInfo { - debug_name: "refresh_background_following", + debug_name: "make_profiles", port: Some(port_), mode: flutter_rust_bridge::for_generated::FfiCallMode::Normal, }, @@ -9988,53 +9718,37 @@ fn wire__crate__api__api__refresh_background_following_impl( }; let mut deserializer = flutter_rust_bridge::for_generated::SseDeserializer::new(message); - let api_state = >, + Arc>, >, >>::sse_decode(&mut deserializer); - let api_config = , - >>::sse_decode(&mut deserializer); deserializer.end(); move |context| async move { - transform_result_sse::<_, flutter_rust_bridge::for_generated::anyhow::Error>( + transform_result_sse::<_, ()>( (move || async move { - let mut api_state_guard = None; - let mut api_config_guard = None; + let mut api_cloudkit_guard = None; let decode_indices_ = flutter_rust_bridge::for_generated::lockable_compute_decode_order( - vec![ - flutter_rust_bridge::for_generated::LockableOrderInfo::new( - &api_state, 0, false, - ), - flutter_rust_bridge::for_generated::LockableOrderInfo::new( - &api_config, - 1, - false, - ), - ], - ); - for i in decode_indices_ { - match i { + vec![flutter_rust_bridge::for_generated::LockableOrderInfo::new( + &api_cloudkit, + 0, + false, + )], + ); + for i in decode_indices_ { + match i { 0 => { - api_state_guard = - Some(api_state.lockable_decode_async_ref().await) - } - 1 => { - api_config_guard = - Some(api_config.lockable_decode_async_ref().await) + api_cloudkit_guard = + Some(api_cloudkit.lockable_decode_async_ref().await) } _ => unreachable!(), } } - let api_state_guard = api_state_guard.unwrap(); - let api_config_guard = api_config_guard.unwrap(); - let output_ok = crate::api::api::refresh_background_following( - &*api_state_guard, - &*api_config_guard, - ) - .await?; + let api_cloudkit_guard = api_cloudkit_guard.unwrap(); + let output_ok = Result::<_, ()>::Ok( + crate::api::api::make_profiles(&*api_cloudkit_guard).await, + )?; Ok(output_ok) })() .await, @@ -10043,7 +9757,7 @@ fn wire__crate__api__api__refresh_background_following_impl( }, ) } -fn wire__crate__api__api__refresh_devices_impl( +fn wire__crate__api__api__make_shared_streams_impl( port_: flutter_rust_bridge::for_generated::MessagePort, ptr_: flutter_rust_bridge::for_generated::PlatformGeneralizedUint8ListPtr, rust_vec_len_: i32, @@ -10051,7 +9765,7 @@ fn wire__crate__api__api__refresh_devices_impl( ) { FLUTTER_RUST_BRIDGE_HANDLER.wrap_async::( flutter_rust_bridge::for_generated::TaskInfo { - debug_name: "refresh_devices", + debug_name: "make_shared_streams", port: Some(port_), mode: flutter_rust_bridge::for_generated::FfiCallMode::Normal, }, @@ -10065,55 +9779,87 @@ fn wire__crate__api__api__refresh_devices_impl( }; let mut deserializer = flutter_rust_bridge::for_generated::SseDeserializer::new(message); + let api_path = ::sse_decode(&mut deserializer); + let api_conn = , + >>::sse_decode(&mut deserializer); + let api_anisette = , + >, + >>::sse_decode(&mut deserializer); let api_config = , >>::sse_decode(&mut deserializer); - let api_client = , + Arc>, >, >>::sse_decode(&mut deserializer); deserializer.end(); move |context| async move { - transform_result_sse::<_, flutter_rust_bridge::for_generated::anyhow::Error>( + transform_result_sse::<_, ()>( (move || async move { + let mut api_conn_guard = None; + let mut api_anisette_guard = None; let mut api_config_guard = None; - let mut api_client_guard = None; + let mut api_token_guard = None; let decode_indices_ = flutter_rust_bridge::for_generated::lockable_compute_decode_order( vec![ + flutter_rust_bridge::for_generated::LockableOrderInfo::new( + &api_conn, 0, false, + ), + flutter_rust_bridge::for_generated::LockableOrderInfo::new( + &api_anisette, + 1, + false, + ), flutter_rust_bridge::for_generated::LockableOrderInfo::new( &api_config, - 0, + 2, false, ), flutter_rust_bridge::for_generated::LockableOrderInfo::new( - &api_client, - 1, - true, + &api_token, 3, false, ), ], ); for i in decode_indices_ { match i { 0 => { + api_conn_guard = + Some(api_conn.lockable_decode_async_ref().await) + } + 1 => { + api_anisette_guard = + Some(api_anisette.lockable_decode_async_ref().await) + } + 2 => { api_config_guard = Some(api_config.lockable_decode_async_ref().await) } - 1 => { - api_client_guard = - Some(api_client.lockable_decode_async_ref_mut().await) + 3 => { + api_token_guard = + Some(api_token.lockable_decode_async_ref().await) } _ => unreachable!(), } } + let api_conn_guard = api_conn_guard.unwrap(); + let api_anisette_guard = api_anisette_guard.unwrap(); let api_config_guard = api_config_guard.unwrap(); - let mut api_client_guard = api_client_guard.unwrap(); - let output_ok = crate::api::api::refresh_devices( - &*api_config_guard, - &mut *api_client_guard, - ) - .await?; + let api_token_guard = api_token_guard.unwrap(); + let output_ok = Result::<_, ()>::Ok( + crate::api::api::make_shared_streams( + api_path, + &*api_conn_guard, + &*api_anisette_guard, + &*api_config_guard, + &*api_token_guard, + ) + .await, + )?; Ok(output_ok) })() .await, @@ -10122,7 +9868,7 @@ fn wire__crate__api__api__refresh_devices_impl( }, ) } -fn wire__crate__api__api__refresh_following_impl( +fn wire__crate__api__api__make_statuskit_impl( port_: flutter_rust_bridge::for_generated::MessagePort, ptr_: flutter_rust_bridge::for_generated::PlatformGeneralizedUint8ListPtr, rust_vec_len_: i32, @@ -10130,7 +9876,7 @@ fn wire__crate__api__api__refresh_following_impl( ) { FLUTTER_RUST_BRIDGE_HANDLER.wrap_async::( flutter_rust_bridge::for_generated::TaskInfo { - debug_name: "refresh_following", + debug_name: "make_statuskit", port: Some(port_), mode: flutter_rust_bridge::for_generated::FfiCallMode::Normal, }, @@ -10144,55 +9890,87 @@ fn wire__crate__api__api__refresh_following_impl( }; let mut deserializer = flutter_rust_bridge::for_generated::SseDeserializer::new(message); + let api_path = ::sse_decode(&mut deserializer); + let api_provider = >, + >, + >>::sse_decode(&mut deserializer); + let api_conn = , + >>::sse_decode(&mut deserializer); let api_config = , >>::sse_decode(&mut deserializer); let api_client = , - >, + flutter_rust_bridge::for_generated::RustAutoOpaqueInner>, >>::sse_decode(&mut deserializer); deserializer.end(); move |context| async move { - transform_result_sse::<_, flutter_rust_bridge::for_generated::anyhow::Error>( + transform_result_sse::<_, ()>( (move || async move { + let mut api_provider_guard = None; + let mut api_conn_guard = None; let mut api_config_guard = None; let mut api_client_guard = None; let decode_indices_ = flutter_rust_bridge::for_generated::lockable_compute_decode_order( vec![ flutter_rust_bridge::for_generated::LockableOrderInfo::new( - &api_config, + &api_provider, 0, false, ), + flutter_rust_bridge::for_generated::LockableOrderInfo::new( + &api_conn, 1, false, + ), + flutter_rust_bridge::for_generated::LockableOrderInfo::new( + &api_config, + 2, + false, + ), flutter_rust_bridge::for_generated::LockableOrderInfo::new( &api_client, - 1, - true, + 3, + false, ), ], ); for i in decode_indices_ { match i { 0 => { + api_provider_guard = + Some(api_provider.lockable_decode_async_ref().await) + } + 1 => { + api_conn_guard = + Some(api_conn.lockable_decode_async_ref().await) + } + 2 => { api_config_guard = Some(api_config.lockable_decode_async_ref().await) } - 1 => { + 3 => { api_client_guard = - Some(api_client.lockable_decode_async_ref_mut().await) + Some(api_client.lockable_decode_async_ref().await) } _ => unreachable!(), } } + let api_provider_guard = api_provider_guard.unwrap(); + let api_conn_guard = api_conn_guard.unwrap(); let api_config_guard = api_config_guard.unwrap(); - let mut api_client_guard = api_client_guard.unwrap(); - let output_ok = crate::api::api::refresh_following( - &*api_config_guard, - &mut *api_client_guard, - ) - .await?; + let api_client_guard = api_client_guard.unwrap(); + let output_ok = Result::<_, ()>::Ok( + crate::api::api::make_statuskit( + api_path, + &*api_provider_guard, + &*api_conn_guard, + &*api_config_guard, + &*api_client_guard, + ) + .await, + )?; Ok(output_ok) })() .await, @@ -10201,17 +9979,16 @@ fn wire__crate__api__api__refresh_following_impl( }, ) } -fn wire__crate__api__api__register_ids_impl( - port_: flutter_rust_bridge::for_generated::MessagePort, +fn wire__crate__api__api__make_token_provider_impl( ptr_: flutter_rust_bridge::for_generated::PlatformGeneralizedUint8ListPtr, rust_vec_len_: i32, data_len_: i32, -) { - FLUTTER_RUST_BRIDGE_HANDLER.wrap_async::( +) -> flutter_rust_bridge::for_generated::WireSyncRust2DartSse { + FLUTTER_RUST_BRIDGE_HANDLER.wrap_sync::( flutter_rust_bridge::for_generated::TaskInfo { - debug_name: "register_ids", - port: Some(port_), - mode: flutter_rust_bridge::for_generated::FfiCallMode::Normal, + debug_name: "make_token_provider", + port: None, + mode: flutter_rust_bridge::for_generated::FfiCallMode::Sync, }, move || { let message = unsafe { @@ -10223,86 +10000,58 @@ fn wire__crate__api__api__register_ids_impl( }; let mut deserializer = flutter_rust_bridge::for_generated::SseDeserializer::new(message); - let api_path = ::sse_decode(&mut deserializer); + let api_account = >>, + >, + >>::sse_decode(&mut deserializer); let api_config = , >>::sse_decode(&mut deserializer); - let api_aps = , - >>::sse_decode(&mut deserializer); - let api_identity = , - >>::sse_decode(&mut deserializer); - let api_users = >::sse_decode(&mut deserializer); deserializer.end(); - move |context| async move { - transform_result_sse::<_, flutter_rust_bridge::for_generated::anyhow::Error>( - (move || async move { - let mut api_config_guard = None; - let mut api_aps_guard = None; - let mut api_identity_guard = None; - let decode_indices_ = - flutter_rust_bridge::for_generated::lockable_compute_decode_order( - vec![ - flutter_rust_bridge::for_generated::LockableOrderInfo::new( - &api_config, - 0, - false, - ), - flutter_rust_bridge::for_generated::LockableOrderInfo::new( - &api_aps, 1, false, - ), - flutter_rust_bridge::for_generated::LockableOrderInfo::new( - &api_identity, - 2, - false, - ), - ], - ); - for i in decode_indices_ { - match i { - 0 => { - api_config_guard = - Some(api_config.lockable_decode_async_ref().await) - } - 1 => { - api_aps_guard = Some(api_aps.lockable_decode_async_ref().await) - } - 2 => { - api_identity_guard = - Some(api_identity.lockable_decode_async_ref().await) - } - _ => unreachable!(), - } - } - let api_config_guard = api_config_guard.unwrap(); - let api_aps_guard = api_aps_guard.unwrap(); - let api_identity_guard = api_identity_guard.unwrap(); - let output_ok = crate::api::api::register_ids( - api_path, - &*api_config_guard, - &*api_aps_guard, - &*api_identity_guard, - api_users, - ) - .await?; - Ok(output_ok) - })() - .await, - ) - } + transform_result_sse::<_, ()>((move || { + let mut api_account_guard = None; + let mut api_config_guard = None; + let decode_indices_ = + flutter_rust_bridge::for_generated::lockable_compute_decode_order(vec![ + flutter_rust_bridge::for_generated::LockableOrderInfo::new( + &api_account, + 0, + false, + ), + flutter_rust_bridge::for_generated::LockableOrderInfo::new( + &api_config, + 1, + false, + ), + ]); + for i in decode_indices_ { + match i { + 0 => api_account_guard = Some(api_account.lockable_decode_sync_ref()), + 1 => api_config_guard = Some(api_config.lockable_decode_sync_ref()), + _ => unreachable!(), + } + } + let api_account_guard = api_account_guard.unwrap(); + let api_config_guard = api_config_guard.unwrap(); + let output_ok = Result::<_, ()>::Ok(crate::api::api::make_token_provider( + &*api_account_guard, + &*api_config_guard, + ))?; + Ok(output_ok) + })()) }, ) } -fn wire__crate__api__api__remove_album_impl( +fn wire__crate__api__api__message_parts_raw_text_impl( port_: flutter_rust_bridge::for_generated::MessagePort, ptr_: flutter_rust_bridge::for_generated::PlatformGeneralizedUint8ListPtr, rust_vec_len_: i32, data_len_: i32, ) { - FLUTTER_RUST_BRIDGE_HANDLER.wrap_async::( + FLUTTER_RUST_BRIDGE_HANDLER.wrap_normal::( flutter_rust_bridge::for_generated::TaskInfo { - debug_name: "remove_album", + debug_name: "message_parts_raw_text", port: Some(port_), mode: flutter_rust_bridge::for_generated::FfiCallMode::Normal, }, @@ -10316,54 +10065,28 @@ fn wire__crate__api__api__remove_album_impl( }; let mut deserializer = flutter_rust_bridge::for_generated::SseDeserializer::new(message); - let api_lock = , - >, - >>::sse_decode(&mut deserializer); - let api_guid = ::sse_decode(&mut deserializer); + let api_that = ::sse_decode(&mut deserializer); deserializer.end(); - move |context| async move { - transform_result_sse::<_, flutter_rust_bridge::for_generated::anyhow::Error>( - (move || async move { - let mut api_lock_guard = None; - let decode_indices_ = - flutter_rust_bridge::for_generated::lockable_compute_decode_order( - vec![flutter_rust_bridge::for_generated::LockableOrderInfo::new( - &api_lock, 0, false, - )], - ); - for i in decode_indices_ { - match i { - 0 => { - api_lock_guard = - Some(api_lock.lockable_decode_async_ref().await) - } - _ => unreachable!(), - } - } - let api_lock_guard = api_lock_guard.unwrap(); - let output_ok = - crate::api::api::remove_album(&*api_lock_guard, api_guid).await?; - Ok(output_ok) - })() - .await, - ) + move |context| { + transform_result_sse::<_, ()>((move || { + let output_ok = + Result::<_, ()>::Ok(crate::api::api::MessageParts::raw_text(&api_that))?; + Ok(output_ok) + })()) } }, ) } -fn wire__crate__api__api__remove_user_impl( - port_: flutter_rust_bridge::for_generated::MessagePort, +fn wire__crate__api__api__ms_to_date_impl( ptr_: flutter_rust_bridge::for_generated::PlatformGeneralizedUint8ListPtr, rust_vec_len_: i32, data_len_: i32, -) { - FLUTTER_RUST_BRIDGE_HANDLER.wrap_async::( +) -> flutter_rust_bridge::for_generated::WireSyncRust2DartSse { + FLUTTER_RUST_BRIDGE_HANDLER.wrap_sync::( flutter_rust_bridge::for_generated::TaskInfo { - debug_name: "remove_user", - port: Some(port_), - mode: flutter_rust_bridge::for_generated::FfiCallMode::Normal, + debug_name: "ms_to_date", + port: None, + mode: flutter_rust_bridge::for_generated::FfiCallMode::Sync, }, move || { let message = unsafe { @@ -10375,59 +10098,24 @@ fn wire__crate__api__api__remove_user_impl( }; let mut deserializer = flutter_rust_bridge::for_generated::SseDeserializer::new(message); - let api_passwords = >, - >, - >>::sse_decode(&mut deserializer); - let api_gid = ::sse_decode(&mut deserializer); - let api_handle = ::sse_decode(&mut deserializer); + let api_ms = ::sse_decode(&mut deserializer); deserializer.end(); - move |context| async move { - transform_result_sse::<_, flutter_rust_bridge::for_generated::anyhow::Error>( - (move || async move { - let mut api_passwords_guard = None; - let decode_indices_ = - flutter_rust_bridge::for_generated::lockable_compute_decode_order( - vec![flutter_rust_bridge::for_generated::LockableOrderInfo::new( - &api_passwords, - 0, - false, - )], - ); - for i in decode_indices_ { - match i { - 0 => { - api_passwords_guard = - Some(api_passwords.lockable_decode_async_ref().await) - } - _ => unreachable!(), - } - } - let api_passwords_guard = api_passwords_guard.unwrap(); - let output_ok = crate::api::api::remove_user( - &*api_passwords_guard, - api_gid, - api_handle, - ) - .await?; - Ok(output_ok) - })() - .await, - ) - } + transform_result_sse::<_, ()>((move || { + let output_ok = Result::<_, ()>::Ok(crate::api::api::ms_to_date(api_ms))?; + Ok(output_ok) + })()) }, ) } -fn wire__crate__api__api__rename_group_impl( +fn wire__crate__api__api__my_async_runtime_default_impl( port_: flutter_rust_bridge::for_generated::MessagePort, ptr_: flutter_rust_bridge::for_generated::PlatformGeneralizedUint8ListPtr, rust_vec_len_: i32, data_len_: i32, ) { - FLUTTER_RUST_BRIDGE_HANDLER.wrap_async::( + FLUTTER_RUST_BRIDGE_HANDLER.wrap_normal::( flutter_rust_bridge::for_generated::TaskInfo { - debug_name: "rename_group", + debug_name: "my_async_runtime_default", port: Some(port_), mode: flutter_rust_bridge::for_generated::FfiCallMode::Normal, }, @@ -10441,51 +10129,18 @@ fn wire__crate__api__api__rename_group_impl( }; let mut deserializer = flutter_rust_bridge::for_generated::SseDeserializer::new(message); - let api_passwords = >, - >, - >>::sse_decode(&mut deserializer); - let api_gid = ::sse_decode(&mut deserializer); - let api_newname = ::sse_decode(&mut deserializer); deserializer.end(); - move |context| async move { - transform_result_sse::<_, flutter_rust_bridge::for_generated::anyhow::Error>( - (move || async move { - let mut api_passwords_guard = None; - let decode_indices_ = - flutter_rust_bridge::for_generated::lockable_compute_decode_order( - vec![flutter_rust_bridge::for_generated::LockableOrderInfo::new( - &api_passwords, - 0, - false, - )], - ); - for i in decode_indices_ { - match i { - 0 => { - api_passwords_guard = - Some(api_passwords.lockable_decode_async_ref().await) - } - _ => unreachable!(), - } - } - let api_passwords_guard = api_passwords_guard.unwrap(); - let output_ok = crate::api::api::rename_group( - &*api_passwords_guard, - api_gid, - api_newname, - ) - .await?; - Ok(output_ok) - })() - .await, - ) + move |context| { + transform_result_sse::<_, ()>((move || { + let output_ok = + Result::<_, ()>::Ok(crate::api::api::MyAsyncRuntime::default())?; + Ok(output_ok) + })()) } }, ) } -fn wire__crate__api__api__report_messages_impl( +fn wire__crate__api__api__new_msg_impl( port_: flutter_rust_bridge::for_generated::MessagePort, ptr_: flutter_rust_bridge::for_generated::PlatformGeneralizedUint8ListPtr, rust_vec_len_: i32, @@ -10493,7 +10148,7 @@ fn wire__crate__api__api__report_messages_impl( ) { FLUTTER_RUST_BRIDGE_HANDLER.wrap_async::( flutter_rust_bridge::for_generated::TaskInfo { - debug_name: "report_messages", + debug_name: "new_msg", port: Some(port_), mode: flutter_rust_bridge::for_generated::FfiCallMode::Normal, }, @@ -10507,38 +10162,18 @@ fn wire__crate__api__api__report_messages_impl( }; let mut deserializer = flutter_rust_bridge::for_generated::SseDeserializer::new(message); - let api_state = >, - >>::sse_decode(&mut deserializer); - let api_handle = ::sse_decode(&mut deserializer); - let api_messages = >::sse_decode(&mut deserializer); + let api_conversation = + ::sse_decode(&mut deserializer); + let api_sender = ::sse_decode(&mut deserializer); + let api_message = ::sse_decode(&mut deserializer); deserializer.end(); move |context| async move { - transform_result_sse::<_, flutter_rust_bridge::for_generated::anyhow::Error>( + transform_result_sse::<_, ()>( (move || async move { - let mut api_state_guard = None; - let decode_indices_ = - flutter_rust_bridge::for_generated::lockable_compute_decode_order( - vec![flutter_rust_bridge::for_generated::LockableOrderInfo::new( - &api_state, 0, false, - )], - ); - for i in decode_indices_ { - match i { - 0 => { - api_state_guard = - Some(api_state.lockable_decode_async_ref().await) - } - _ => unreachable!(), - } - } - let api_state_guard = api_state_guard.unwrap(); - let output_ok = crate::api::api::report_messages( - &*api_state_guard, - api_handle, - api_messages, - ) - .await?; + let output_ok = Result::<_, ()>::Ok( + crate::api::api::new_msg(api_conversation, api_sender, api_message) + .await, + )?; Ok(output_ok) })() .await, @@ -10547,17 +10182,16 @@ fn wire__crate__api__api__report_messages_impl( }, ) } -fn wire__crate__api__api__request_handles_impl( - port_: flutter_rust_bridge::for_generated::MessagePort, +fn wire__crate__api__api__new_ngm_identity_impl( ptr_: flutter_rust_bridge::for_generated::PlatformGeneralizedUint8ListPtr, rust_vec_len_: i32, data_len_: i32, -) { - FLUTTER_RUST_BRIDGE_HANDLER.wrap_async::( +) -> flutter_rust_bridge::for_generated::WireSyncRust2DartSse { + FLUTTER_RUST_BRIDGE_HANDLER.wrap_sync::( flutter_rust_bridge::for_generated::TaskInfo { - debug_name: "request_handles", - port: Some(port_), - mode: flutter_rust_bridge::for_generated::FfiCallMode::Normal, + debug_name: "new_ngm_identity", + port: None, + mode: flutter_rust_bridge::for_generated::FfiCallMode::Sync, }, move || { let message = unsafe { @@ -10569,53 +10203,24 @@ fn wire__crate__api__api__request_handles_impl( }; let mut deserializer = flutter_rust_bridge::for_generated::SseDeserializer::new(message); - let api_status = >, - >, - >>::sse_decode(&mut deserializer); - let api_to = >::sse_decode(&mut deserializer); deserializer.end(); - move |context| async move { - transform_result_sse::<_, flutter_rust_bridge::for_generated::anyhow::Error>( - (move || async move { - let mut api_status_guard = None; - let decode_indices_ = - flutter_rust_bridge::for_generated::lockable_compute_decode_order( - vec![flutter_rust_bridge::for_generated::LockableOrderInfo::new( - &api_status, - 0, - false, - )], - ); - for i in decode_indices_ { - match i { - 0 => { - api_status_guard = - Some(api_status.lockable_decode_async_ref().await) - } - _ => unreachable!(), - } - } - let api_status_guard = api_status_guard.unwrap(); - let output_ok = - crate::api::api::request_handles(&*api_status_guard, api_to).await?; - Ok(output_ok) - })() - .await, - ) - } + transform_result_sse::<_, flutter_rust_bridge::for_generated::anyhow::Error>( + (move || { + let output_ok = crate::api::api::new_ngm_identity()?; + Ok(output_ok) + })(), + ) }, ) } -fn wire__crate__api__api__reset_anisette_impl( +fn wire__crate__api__api__ns_attributed_string_decode_impl( ptr_: flutter_rust_bridge::for_generated::PlatformGeneralizedUint8ListPtr, rust_vec_len_: i32, data_len_: i32, ) -> flutter_rust_bridge::for_generated::WireSyncRust2DartSse { FLUTTER_RUST_BRIDGE_HANDLER.wrap_sync::( flutter_rust_bridge::for_generated::TaskInfo { - debug_name: "reset_anisette", + debug_name: "ns_attributed_string_decode", port: None, mode: flutter_rust_bridge::for_generated::FfiCallMode::Sync, }, @@ -10629,28 +10234,43 @@ fn wire__crate__api__api__reset_anisette_impl( }; let mut deserializer = flutter_rust_bridge::for_generated::SseDeserializer::new(message); - let api_path = ::sse_decode(&mut deserializer); + let api_val = , + >>::sse_decode(&mut deserializer); deserializer.end(); transform_result_sse::<_, ()>((move || { - let output_ok = Result::<_, ()>::Ok({ - crate::api::api::reset_anisette(api_path); - })?; + let mut api_val_guard = None; + let decode_indices_ = + flutter_rust_bridge::for_generated::lockable_compute_decode_order(vec![ + flutter_rust_bridge::for_generated::LockableOrderInfo::new( + &api_val, 0, false, + ), + ]); + for i in decode_indices_ { + match i { + 0 => api_val_guard = Some(api_val.lockable_decode_sync_ref()), + _ => unreachable!(), + } + } + let api_val_guard = api_val_guard.unwrap(); + let output_ok = Result::<_, ()>::Ok(crate::api::api::NSAttributedString::decode( + &*api_val_guard, + ))?; Ok(output_ok) })()) }, ) } -fn wire__crate__api__api__reset_channel_keys_impl( - port_: flutter_rust_bridge::for_generated::MessagePort, +fn wire__crate__api__api__ns_attributed_string_encode_impl( ptr_: flutter_rust_bridge::for_generated::PlatformGeneralizedUint8ListPtr, rust_vec_len_: i32, data_len_: i32, -) { - FLUTTER_RUST_BRIDGE_HANDLER.wrap_async::( +) -> flutter_rust_bridge::for_generated::WireSyncRust2DartSse { + FLUTTER_RUST_BRIDGE_HANDLER.wrap_sync::( flutter_rust_bridge::for_generated::TaskInfo { - debug_name: "reset_channel_keys", - port: Some(port_), - mode: flutter_rust_bridge::for_generated::FfiCallMode::Normal, + debug_name: "ns_attributed_string_encode", + port: None, + mode: flutter_rust_bridge::for_generated::FfiCallMode::Sync, }, move || { let message = unsafe { @@ -10662,55 +10282,26 @@ fn wire__crate__api__api__reset_channel_keys_impl( }; let mut deserializer = flutter_rust_bridge::for_generated::SseDeserializer::new(message); - let api_status = >, - >, - >>::sse_decode(&mut deserializer); + let api_that = ::sse_decode(&mut deserializer); deserializer.end(); - move |context| async move { - transform_result_sse::<_, flutter_rust_bridge::for_generated::anyhow::Error>( - (move || async move { - let mut api_status_guard = None; - let decode_indices_ = - flutter_rust_bridge::for_generated::lockable_compute_decode_order( - vec![flutter_rust_bridge::for_generated::LockableOrderInfo::new( - &api_status, - 0, - false, - )], - ); - for i in decode_indices_ { - match i { - 0 => { - api_status_guard = - Some(api_status.lockable_decode_async_ref().await) - } - _ => unreachable!(), - } - } - let api_status_guard = api_status_guard.unwrap(); - let output_ok = - crate::api::api::reset_channel_keys(&*api_status_guard).await?; - Ok(output_ok) - })() - .await, - ) - } + transform_result_sse::<_, ()>((move || { + let output_ok = + Result::<_, ()>::Ok(crate::api::api::NSAttributedString::encode(&api_that))?; + Ok(output_ok) + })()) }, ) } -fn wire__crate__api__api__reset_clique_impl( - port_: flutter_rust_bridge::for_generated::MessagePort, +fn wire__crate__api__api__ns_null_impl( ptr_: flutter_rust_bridge::for_generated::PlatformGeneralizedUint8ListPtr, rust_vec_len_: i32, data_len_: i32, -) { - FLUTTER_RUST_BRIDGE_HANDLER.wrap_async::( +) -> flutter_rust_bridge::for_generated::WireSyncRust2DartSse { + FLUTTER_RUST_BRIDGE_HANDLER.wrap_sync::( flutter_rust_bridge::for_generated::TaskInfo { - debug_name: "reset_clique", - port: Some(port_), - mode: flutter_rust_bridge::for_generated::FfiCallMode::Normal, + debug_name: "ns_null", + port: None, + mode: flutter_rust_bridge::for_generated::FfiCallMode::Sync, }, move || { let message = unsafe { @@ -10722,78 +10313,24 @@ fn wire__crate__api__api__reset_clique_impl( }; let mut deserializer = flutter_rust_bridge::for_generated::SseDeserializer::new(message); - let api_keychain = >, - >, - >>::sse_decode(&mut deserializer); - let api_cloud_messages = >, - >, - >>::sse_decode(&mut deserializer); - let api_device_password = ::sse_decode(&mut deserializer); deserializer.end(); - move |context| async move { - transform_result_sse::<_, flutter_rust_bridge::for_generated::anyhow::Error>( - (move || async move { - let mut api_keychain_guard = None; - let mut api_cloud_messages_guard = None; - let decode_indices_ = - flutter_rust_bridge::for_generated::lockable_compute_decode_order( - vec![ - flutter_rust_bridge::for_generated::LockableOrderInfo::new( - &api_keychain, - 0, - false, - ), - flutter_rust_bridge::for_generated::LockableOrderInfo::new( - &api_cloud_messages, - 1, - false, - ), - ], - ); - for i in decode_indices_ { - match i { - 0 => { - api_keychain_guard = - Some(api_keychain.lockable_decode_async_ref().await) - } - 1 => { - api_cloud_messages_guard = - Some(api_cloud_messages.lockable_decode_async_ref().await) - } - _ => unreachable!(), - } - } - let api_keychain_guard = api_keychain_guard.unwrap(); - let api_cloud_messages_guard = api_cloud_messages_guard.unwrap(); - let output_ok = crate::api::api::reset_clique( - &*api_keychain_guard, - &*api_cloud_messages_guard, - api_device_password, - ) - .await?; - Ok(output_ok) - })() - .await, - ) - } + transform_result_sse::<_, ()>((move || { + let output_ok = Result::<_, ()>::Ok(crate::api::api::ns_null())?; + Ok(output_ok) + })()) }, ) } -fn wire__crate__api__api__reset_state_impl( - port_: flutter_rust_bridge::for_generated::MessagePort, +fn wire__crate__api__api__ns_number_decode_impl( ptr_: flutter_rust_bridge::for_generated::PlatformGeneralizedUint8ListPtr, rust_vec_len_: i32, data_len_: i32, -) { - FLUTTER_RUST_BRIDGE_HANDLER.wrap_async::( +) -> flutter_rust_bridge::for_generated::WireSyncRust2DartSse { + FLUTTER_RUST_BRIDGE_HANDLER.wrap_sync::( flutter_rust_bridge::for_generated::TaskInfo { - debug_name: "reset_state", - port: Some(port_), - mode: flutter_rust_bridge::for_generated::FfiCallMode::Normal, + debug_name: "ns_number_decode", + port: None, + mode: flutter_rust_bridge::for_generated::FfiCallMode::Sync, }, move || { let message = unsafe { @@ -10805,95 +10342,42 @@ fn wire__crate__api__api__reset_state_impl( }; let mut deserializer = flutter_rust_bridge::for_generated::SseDeserializer::new(message); - let api_cancel = >, - >>::sse_decode(&mut deserializer); - let api_path = ::sse_decode(&mut deserializer); - let api_config = , - >>::sse_decode(&mut deserializer); - let api_aps = , + let api_val = , >>::sse_decode(&mut deserializer); - let api_account = - >>>>::sse_decode( - &mut deserializer, - ); - let api_reset_hw = ::sse_decode(&mut deserializer); - let api_logout = ::sse_decode(&mut deserializer); deserializer.end(); - move |context| async move { - transform_result_sse::<_, flutter_rust_bridge::for_generated::anyhow::Error>( - (move || async move { - let mut api_cancel_guard = None; - let mut api_config_guard = None; - let mut api_aps_guard = None; - let decode_indices_ = - flutter_rust_bridge::for_generated::lockable_compute_decode_order( - vec![ - flutter_rust_bridge::for_generated::LockableOrderInfo::new( - &api_cancel, - 0, - false, - ), - flutter_rust_bridge::for_generated::LockableOrderInfo::new( - &api_config, - 1, - false, - ), - flutter_rust_bridge::for_generated::LockableOrderInfo::new( - &api_aps, 2, false, - ), - ], - ); - for i in decode_indices_ { - match i { - 0 => { - api_cancel_guard = - Some(api_cancel.lockable_decode_async_ref().await) - } - 1 => { - api_config_guard = - Some(api_config.lockable_decode_async_ref().await) - } - 2 => { - api_aps_guard = Some(api_aps.lockable_decode_async_ref().await) - } - _ => unreachable!(), - } - } - let api_cancel_guard = api_cancel_guard.unwrap(); - let api_config_guard = api_config_guard.unwrap(); - let api_aps_guard = api_aps_guard.unwrap(); - let output_ok = crate::api::api::reset_state( - &*api_cancel_guard, - api_path, - &*api_config_guard, - &*api_aps_guard, - api_account, - api_reset_hw, - api_logout, - ) - .await?; - Ok(output_ok) - })() - .await, - ) - } + transform_result_sse::<_, ()>((move || { + let mut api_val_guard = None; + let decode_indices_ = + flutter_rust_bridge::for_generated::lockable_compute_decode_order(vec![ + flutter_rust_bridge::for_generated::LockableOrderInfo::new( + &api_val, 0, false, + ), + ]); + for i in decode_indices_ { + match i { + 0 => api_val_guard = Some(api_val.lockable_decode_sync_ref()), + _ => unreachable!(), + } + } + let api_val_guard = api_val_guard.unwrap(); + let output_ok = + Result::<_, ()>::Ok(crate::api::api::NSNumber::decode(&*api_val_guard))?; + Ok(output_ok) + })()) }, ) } -fn wire__crate__api__api__restore_account_impl( - port_: flutter_rust_bridge::for_generated::MessagePort, +fn wire__crate__api__api__ns_number_encode_impl( ptr_: flutter_rust_bridge::for_generated::PlatformGeneralizedUint8ListPtr, rust_vec_len_: i32, data_len_: i32, -) { - FLUTTER_RUST_BRIDGE_HANDLER.wrap_async::( +) -> flutter_rust_bridge::for_generated::WireSyncRust2DartSse { + FLUTTER_RUST_BRIDGE_HANDLER.wrap_sync::( flutter_rust_bridge::for_generated::TaskInfo { - debug_name: "restore_account", - port: Some(port_), - mode: flutter_rust_bridge::for_generated::FfiCallMode::Normal, + debug_name: "ns_number_encode", + port: None, + mode: flutter_rust_bridge::for_generated::FfiCallMode::Sync, }, move || { let message = unsafe { @@ -10905,88 +10389,23 @@ fn wire__crate__api__api__restore_account_impl( }; let mut deserializer = flutter_rust_bridge::for_generated::SseDeserializer::new(message); - let api_path = ::sse_decode(&mut deserializer); - let api_anisette = , - >, - >>::sse_decode(&mut deserializer); - let api_config = , - >>::sse_decode(&mut deserializer); - let api_conn = , - >>::sse_decode(&mut deserializer); + let api_that = ::sse_decode(&mut deserializer); deserializer.end(); - move |context| async move { - transform_result_sse::<_, ()>( - (move || async move { - let mut api_anisette_guard = None; - let mut api_config_guard = None; - let mut api_conn_guard = None; - let decode_indices_ = - flutter_rust_bridge::for_generated::lockable_compute_decode_order( - vec![ - flutter_rust_bridge::for_generated::LockableOrderInfo::new( - &api_anisette, - 0, - false, - ), - flutter_rust_bridge::for_generated::LockableOrderInfo::new( - &api_config, - 1, - false, - ), - flutter_rust_bridge::for_generated::LockableOrderInfo::new( - &api_conn, 2, false, - ), - ], - ); - for i in decode_indices_ { - match i { - 0 => { - api_anisette_guard = - Some(api_anisette.lockable_decode_async_ref().await) - } - 1 => { - api_config_guard = - Some(api_config.lockable_decode_async_ref().await) - } - 2 => { - api_conn_guard = - Some(api_conn.lockable_decode_async_ref().await) - } - _ => unreachable!(), - } - } - let api_anisette_guard = api_anisette_guard.unwrap(); - let api_config_guard = api_config_guard.unwrap(); - let api_conn_guard = api_conn_guard.unwrap(); - let output_ok = Result::<_, ()>::Ok( - crate::api::api::restore_account( - api_path, - &*api_anisette_guard, - &*api_config_guard, - &*api_conn_guard, - ) - .await, - )?; - Ok(output_ok) - })() - .await, - ) - } + transform_result_sse::<_, ()>((move || { + let output_ok = Result::<_, ()>::Ok(crate::api::api::NSNumber::encode(&api_that))?; + Ok(output_ok) + })()) }, ) } -fn wire__crate__api__api__restore_attachment_impl( +fn wire__crate__api__api__ns_string_decode_impl( ptr_: flutter_rust_bridge::for_generated::PlatformGeneralizedUint8ListPtr, rust_vec_len_: i32, data_len_: i32, ) -> flutter_rust_bridge::for_generated::WireSyncRust2DartSse { FLUTTER_RUST_BRIDGE_HANDLER.wrap_sync::( flutter_rust_bridge::for_generated::TaskInfo { - debug_name: "restore_attachment", + debug_name: "ns_string_decode", port: None, mode: flutter_rust_bridge::for_generated::FfiCallMode::Sync, }, @@ -11000,23 +10419,40 @@ fn wire__crate__api__api__restore_attachment_impl( }; let mut deserializer = flutter_rust_bridge::for_generated::SseDeserializer::new(message); - let api_data = ::sse_decode(&mut deserializer); + let api_val = , + >>::sse_decode(&mut deserializer); deserializer.end(); transform_result_sse::<_, ()>((move || { - let output_ok = Result::<_, ()>::Ok(crate::api::api::restore_attachment(api_data))?; + let mut api_val_guard = None; + let decode_indices_ = + flutter_rust_bridge::for_generated::lockable_compute_decode_order(vec![ + flutter_rust_bridge::for_generated::LockableOrderInfo::new( + &api_val, 0, false, + ), + ]); + for i in decode_indices_ { + match i { + 0 => api_val_guard = Some(api_val.lockable_decode_sync_ref()), + _ => unreachable!(), + } + } + let api_val_guard = api_val_guard.unwrap(); + let output_ok = + Result::<_, ()>::Ok(crate::api::api::NSString::decode(&*api_val_guard))?; Ok(output_ok) })()) }, ) } -fn wire__crate__api__api__restore_cloud_chat_impl( +fn wire__crate__api__api__ns_string_encode_impl( ptr_: flutter_rust_bridge::for_generated::PlatformGeneralizedUint8ListPtr, rust_vec_len_: i32, data_len_: i32, ) -> flutter_rust_bridge::for_generated::WireSyncRust2DartSse { FLUTTER_RUST_BRIDGE_HANDLER.wrap_sync::( flutter_rust_bridge::for_generated::TaskInfo { - debug_name: "restore_cloud_chat", + debug_name: "ns_string_encode", port: None, mode: flutter_rust_bridge::for_generated::FfiCallMode::Sync, }, @@ -11030,27 +10466,25 @@ fn wire__crate__api__api__restore_cloud_chat_impl( }; let mut deserializer = flutter_rust_bridge::for_generated::SseDeserializer::new(message); - let api_data = >::sse_decode(&mut deserializer); + let api_that = ::sse_decode(&mut deserializer); deserializer.end(); transform_result_sse::<_, ()>((move || { - let output_ok = - Result::<_, ()>::Ok(crate::api::api::restore_cloud_chat(&api_data))?; + let output_ok = Result::<_, ()>::Ok(crate::api::api::NSString::encode(&api_that))?; Ok(output_ok) })()) }, ) } -fn wire__crate__api__api__restore_user_impl( - port_: flutter_rust_bridge::for_generated::MessagePort, +fn wire__crate__api__api__nscoder_decode_impl( ptr_: flutter_rust_bridge::for_generated::PlatformGeneralizedUint8ListPtr, rust_vec_len_: i32, data_len_: i32, -) { - FLUTTER_RUST_BRIDGE_HANDLER.wrap_normal::( +) -> flutter_rust_bridge::for_generated::WireSyncRust2DartSse { + FLUTTER_RUST_BRIDGE_HANDLER.wrap_sync::( flutter_rust_bridge::for_generated::TaskInfo { - debug_name: "restore_user", - port: Some(port_), - mode: flutter_rust_bridge::for_generated::FfiCallMode::Normal, + debug_name: "nscoder_decode", + port: None, + mode: flutter_rust_bridge::for_generated::FfiCallMode::Sync, }, move || { let message = unsafe { @@ -11062,27 +10496,23 @@ fn wire__crate__api__api__restore_user_impl( }; let mut deserializer = flutter_rust_bridge::for_generated::SseDeserializer::new(message); - let api_user = ::sse_decode(&mut deserializer); + let api_data = >::sse_decode(&mut deserializer); deserializer.end(); - move |context| { - transform_result_sse::<_, flutter_rust_bridge::for_generated::anyhow::Error>( - (move || { - let output_ok = crate::api::api::restore_user(api_user)?; - Ok(output_ok) - })(), - ) - } + transform_result_sse::<_, ()>((move || { + let output_ok = Result::<_, ()>::Ok(crate::api::api::nscoder_decode(&api_data))?; + Ok(output_ok) + })()) }, ) } -fn wire__crate__api__api__restore_users_impl( +fn wire__crate__api__api__nscoder_encode_impl( ptr_: flutter_rust_bridge::for_generated::PlatformGeneralizedUint8ListPtr, rust_vec_len_: i32, data_len_: i32, ) -> flutter_rust_bridge::for_generated::WireSyncRust2DartSse { FLUTTER_RUST_BRIDGE_HANDLER.wrap_sync::( flutter_rust_bridge::for_generated::TaskInfo { - debug_name: "restore_users", + debug_name: "nscoder_encode", port: None, mode: flutter_rust_bridge::for_generated::FfiCallMode::Sync, }, @@ -11096,16 +10526,16 @@ fn wire__crate__api__api__restore_users_impl( }; let mut deserializer = flutter_rust_bridge::for_generated::SseDeserializer::new(message); - let api_path = ::sse_decode(&mut deserializer); + let api_value = >::sse_decode(&mut deserializer); deserializer.end(); transform_result_sse::<_, ()>((move || { - let output_ok = Result::<_, ()>::Ok(crate::api::api::restore_users(api_path))?; + let output_ok = Result::<_, ()>::Ok(crate::api::api::nscoder_encode(&api_value))?; Ok(output_ok) })()) }, ) } -fn wire__crate__api__api__save_attachment_impl( +fn wire__crate__api__api__pack_transcript_poster_impl( port_: flutter_rust_bridge::for_generated::MessagePort, ptr_: flutter_rust_bridge::for_generated::PlatformGeneralizedUint8ListPtr, rust_vec_len_: i32, @@ -11113,7 +10543,7 @@ fn wire__crate__api__api__save_attachment_impl( ) { FLUTTER_RUST_BRIDGE_HANDLER.wrap_normal::( flutter_rust_bridge::for_generated::TaskInfo { - debug_name: "save_attachment", + debug_name: "pack_transcript_poster", port: Some(port_), mode: flutter_rust_bridge::for_generated::FfiCallMode::Normal, }, @@ -11127,27 +10557,29 @@ fn wire__crate__api__api__save_attachment_impl( }; let mut deserializer = flutter_rust_bridge::for_generated::SseDeserializer::new(message); - let api_att = ::sse_decode(&mut deserializer); + let api_payload = + ::sse_decode(&mut deserializer); deserializer.end(); move |context| { - transform_result_sse::<_, ()>((move || { - let output_ok = - Result::<_, ()>::Ok(crate::api::api::save_attachment(&api_att))?; - Ok(output_ok) - })()) + transform_result_sse::<_, flutter_rust_bridge::for_generated::anyhow::Error>( + (move || { + let output_ok = crate::api::api::pack_transcript_poster(api_payload)?; + Ok(output_ok) + })(), + ) } }, ) } -fn wire__crate__api__api__save_attachments_impl( +fn wire__crate__api__api__parse_poster_impl( port_: flutter_rust_bridge::for_generated::MessagePort, ptr_: flutter_rust_bridge::for_generated::PlatformGeneralizedUint8ListPtr, rust_vec_len_: i32, data_len_: i32, ) { - FLUTTER_RUST_BRIDGE_HANDLER.wrap_async::( + FLUTTER_RUST_BRIDGE_HANDLER.wrap_normal::( flutter_rust_bridge::for_generated::TaskInfo { - debug_name: "save_attachments", + debug_name: "parse_poster", port: Some(port_), mode: flutter_rust_bridge::for_generated::FfiCallMode::Normal, }, @@ -11161,62 +10593,28 @@ fn wire__crate__api__api__save_attachments_impl( }; let mut deserializer = flutter_rust_bridge::for_generated::SseDeserializer::new(message); - let api_cloud_messages_client = >, - >, - >>::sse_decode(&mut deserializer); - let api_attachments = >::sse_decode(&mut deserializer); + let api_poster = ::sse_decode(&mut deserializer); deserializer.end(); - move |context| async move { + move |context| { transform_result_sse::<_, flutter_rust_bridge::for_generated::anyhow::Error>( - (move || async move { - let mut api_cloud_messages_client_guard = None; - let decode_indices_ = - flutter_rust_bridge::for_generated::lockable_compute_decode_order( - vec![flutter_rust_bridge::for_generated::LockableOrderInfo::new( - &api_cloud_messages_client, - 0, - false, - )], - ); - for i in decode_indices_ { - match i { - 0 => { - api_cloud_messages_client_guard = Some( - api_cloud_messages_client.lockable_decode_async_ref().await, - ) - } - _ => unreachable!(), - } - } - let api_cloud_messages_client_guard = - api_cloud_messages_client_guard.unwrap(); - let output_ok = crate::api::api::save_attachments( - &*api_cloud_messages_client_guard, - api_attachments, - ) - .await?; + (move || { + let output_ok = crate::api::api::parse_poster(api_poster)?; Ok(output_ok) - })() - .await, + })(), ) } }, ) } -fn wire__crate__api__api__save_chats_impl( +fn wire__crate__api__api__parse_poster_save_impl( port_: flutter_rust_bridge::for_generated::MessagePort, ptr_: flutter_rust_bridge::for_generated::PlatformGeneralizedUint8ListPtr, rust_vec_len_: i32, data_len_: i32, ) { - FLUTTER_RUST_BRIDGE_HANDLER.wrap_async::( + FLUTTER_RUST_BRIDGE_HANDLER.wrap_normal::( flutter_rust_bridge::for_generated::TaskInfo { - debug_name: "save_chats", + debug_name: "parse_poster_save", port: Some(port_), mode: flutter_rust_bridge::for_generated::FfiCallMode::Normal, }, @@ -11230,61 +10628,63 @@ fn wire__crate__api__api__save_chats_impl( }; let mut deserializer = flutter_rust_bridge::for_generated::SseDeserializer::new(message); - let api_cloud_messages_client = >, - >, - >>::sse_decode(&mut deserializer); - let api_chats = - >::sse_decode( - &mut deserializer, - ); + let api_poster = + ::sse_decode(&mut deserializer); deserializer.end(); - move |context| async move { + move |context| { transform_result_sse::<_, flutter_rust_bridge::for_generated::anyhow::Error>( - (move || async move { - let mut api_cloud_messages_client_guard = None; - let decode_indices_ = - flutter_rust_bridge::for_generated::lockable_compute_decode_order( - vec![flutter_rust_bridge::for_generated::LockableOrderInfo::new( - &api_cloud_messages_client, - 0, - false, - )], - ); - for i in decode_indices_ { - match i { - 0 => { - api_cloud_messages_client_guard = Some( - api_cloud_messages_client.lockable_decode_async_ref().await, - ) - } - _ => unreachable!(), - } - } - let api_cloud_messages_client_guard = - api_cloud_messages_client_guard.unwrap(); - let output_ok = crate::api::api::save_chats( - &*api_cloud_messages_client_guard, - api_chats, - ) - .await?; + (move || { + let output_ok = crate::api::api::parse_poster_save(api_poster)?; Ok(output_ok) - })() - .await, + })(), ) } }, ) } -fn wire__crate__api__api__save_cloud_chat_impl( +fn wire__crate__api__api__parse_transcript_poster_impl( + port_: flutter_rust_bridge::for_generated::MessagePort, + ptr_: flutter_rust_bridge::for_generated::PlatformGeneralizedUint8ListPtr, + rust_vec_len_: i32, + data_len_: i32, +) { + FLUTTER_RUST_BRIDGE_HANDLER.wrap_normal::( + flutter_rust_bridge::for_generated::TaskInfo { + debug_name: "parse_transcript_poster", + port: Some(port_), + mode: flutter_rust_bridge::for_generated::FfiCallMode::Normal, + }, + move || { + let message = unsafe { + flutter_rust_bridge::for_generated::Dart2RustMessageSse::from_wire( + ptr_, + rust_vec_len_, + data_len_, + ) + }; + let mut deserializer = + flutter_rust_bridge::for_generated::SseDeserializer::new(message); + let api_payload = >::sse_decode(&mut deserializer); + deserializer.end(); + move |context| { + transform_result_sse::<_, flutter_rust_bridge::for_generated::anyhow::Error>( + (move || { + let output_ok = crate::api::api::parse_transcript_poster(api_payload)?; + Ok(output_ok) + })(), + ) + } + }, + ) +} +fn wire__crate__api__api__password_manager_meta_get_data_impl( ptr_: flutter_rust_bridge::for_generated::PlatformGeneralizedUint8ListPtr, rust_vec_len_: i32, data_len_: i32, ) -> flutter_rust_bridge::for_generated::WireSyncRust2DartSse { FLUTTER_RUST_BRIDGE_HANDLER.wrap_sync::( flutter_rust_bridge::for_generated::TaskInfo { - debug_name: "save_cloud_chat", + debug_name: "password_manager_meta_get_data", port: None, mode: flutter_rust_bridge::for_generated::FfiCallMode::Sync, }, @@ -11298,16 +10698,77 @@ fn wire__crate__api__api__save_cloud_chat_impl( }; let mut deserializer = flutter_rust_bridge::for_generated::SseDeserializer::new(message); - let api_value = ::sse_decode(&mut deserializer); + let api_data = + ::sse_decode(&mut deserializer); deserializer.end(); - transform_result_sse::<_, ()>((move || { - let output_ok = Result::<_, ()>::Ok(crate::api::api::save_cloud_chat(&api_value))?; + transform_result_sse::<_, PushError>((move || { + let output_ok = crate::api::api::PasswordManagerMeta::get_data(&api_data)?; Ok(output_ok) })()) }, ) } -fn wire__crate__api__api__save_messages_impl( +fn wire__crate__api__api__password_manager_meta_get_password_data_impl( + ptr_: flutter_rust_bridge::for_generated::PlatformGeneralizedUint8ListPtr, + rust_vec_len_: i32, + data_len_: i32, +) -> flutter_rust_bridge::for_generated::WireSyncRust2DartSse { + FLUTTER_RUST_BRIDGE_HANDLER.wrap_sync::( + flutter_rust_bridge::for_generated::TaskInfo { + debug_name: "password_manager_meta_get_password_data", + port: None, + mode: flutter_rust_bridge::for_generated::FfiCallMode::Sync, + }, + move || { + let message = unsafe { + flutter_rust_bridge::for_generated::Dart2RustMessageSse::from_wire( + ptr_, + rust_vec_len_, + data_len_, + ) + }; + let mut deserializer = + flutter_rust_bridge::for_generated::SseDeserializer::new(message); + let api_that = ::sse_decode(&mut deserializer); + deserializer.end(); + transform_result_sse::<_, PushError>((move || { + let output_ok = crate::api::api::PasswordManagerMeta::get_password_data(&api_that)?; + Ok(output_ok) + })()) + }, + ) +} +fn wire__crate__api__api__password_manager_totp_generate_otp_impl( + ptr_: flutter_rust_bridge::for_generated::PlatformGeneralizedUint8ListPtr, + rust_vec_len_: i32, + data_len_: i32, +) -> flutter_rust_bridge::for_generated::WireSyncRust2DartSse { + FLUTTER_RUST_BRIDGE_HANDLER.wrap_sync::( + flutter_rust_bridge::for_generated::TaskInfo { + debug_name: "password_manager_totp_generate_otp", + port: None, + mode: flutter_rust_bridge::for_generated::FfiCallMode::Sync, + }, + move || { + let message = unsafe { + flutter_rust_bridge::for_generated::Dart2RustMessageSse::from_wire( + ptr_, + rust_vec_len_, + data_len_, + ) + }; + let mut deserializer = + flutter_rust_bridge::for_generated::SseDeserializer::new(message); + let api_that = ::sse_decode(&mut deserializer); + deserializer.end(); + transform_result_sse::<_, PushError>((move || { + let output_ok = crate::api::api::PasswordManagerTotp::generate_otp(&api_that)?; + Ok(output_ok) + })()) + }, + ) +} +fn wire__crate__api__api__play_find_my_sound_impl( port_: flutter_rust_bridge::for_generated::MessagePort, ptr_: flutter_rust_bridge::for_generated::PlatformGeneralizedUint8ListPtr, rust_vec_len_: i32, @@ -11315,7 +10776,7 @@ fn wire__crate__api__api__save_messages_impl( ) { FLUTTER_RUST_BRIDGE_HANDLER.wrap_async::( flutter_rust_bridge::for_generated::TaskInfo { - debug_name: "save_messages", + debug_name: "play_find_my_sound", port: Some(port_), mode: flutter_rust_bridge::for_generated::FfiCallMode::Normal, }, @@ -11329,43 +10790,55 @@ fn wire__crate__api__api__save_messages_impl( }; let mut deserializer = flutter_rust_bridge::for_generated::SseDeserializer::new(message); - let api_cloud_messages_client = , + >>::sse_decode(&mut deserializer); + let api_client = >, + FindMyPhoneClient, >, >>::sse_decode(&mut deserializer); - let api_messages = - >::sse_decode( - &mut deserializer, - ); + let api_device_id = ::sse_decode(&mut deserializer); deserializer.end(); move |context| async move { transform_result_sse::<_, flutter_rust_bridge::for_generated::anyhow::Error>( (move || async move { - let mut api_cloud_messages_client_guard = None; + let mut api_config_guard = None; + let mut api_client_guard = None; let decode_indices_ = flutter_rust_bridge::for_generated::lockable_compute_decode_order( - vec![flutter_rust_bridge::for_generated::LockableOrderInfo::new( - &api_cloud_messages_client, - 0, - false, - )], + vec![ + flutter_rust_bridge::for_generated::LockableOrderInfo::new( + &api_config, + 0, + false, + ), + flutter_rust_bridge::for_generated::LockableOrderInfo::new( + &api_client, + 1, + true, + ), + ], ); for i in decode_indices_ { match i { 0 => { - api_cloud_messages_client_guard = Some( - api_cloud_messages_client.lockable_decode_async_ref().await, - ) + api_config_guard = + Some(api_config.lockable_decode_async_ref().await) + } + 1 => { + api_client_guard = + Some(api_client.lockable_decode_async_ref_mut().await) } _ => unreachable!(), } } - let api_cloud_messages_client_guard = - api_cloud_messages_client_guard.unwrap(); - let output_ok = crate::api::api::save_messages( - &*api_cloud_messages_client_guard, - api_messages, + let api_config_guard = api_config_guard.unwrap(); + let mut api_client_guard = api_client_guard.unwrap(); + let output_ok = crate::api::api::play_find_my_sound( + &*api_config_guard, + &mut *api_client_guard, + api_device_id, ) .await?; Ok(output_ok) @@ -11376,15 +10849,15 @@ fn wire__crate__api__api__save_messages_impl( }, ) } -fn wire__crate__api__api__save_passkey_impl( +fn wire__crate__api__api__provisioned_flavor_default_impl( port_: flutter_rust_bridge::for_generated::MessagePort, ptr_: flutter_rust_bridge::for_generated::PlatformGeneralizedUint8ListPtr, rust_vec_len_: i32, data_len_: i32, ) { - FLUTTER_RUST_BRIDGE_HANDLER.wrap_async::( + FLUTTER_RUST_BRIDGE_HANDLER.wrap_normal::( flutter_rust_bridge::for_generated::TaskInfo { - debug_name: "save_passkey", + debug_name: "provisioned_flavor_default", port: Some(port_), mode: flutter_rust_bridge::for_generated::FfiCallMode::Normal, }, @@ -11398,53 +10871,18 @@ fn wire__crate__api__api__save_passkey_impl( }; let mut deserializer = flutter_rust_bridge::for_generated::SseDeserializer::new(message); - let api_passwords = >, - >, - >>::sse_decode(&mut deserializer); - let api_id = ::sse_decode(&mut deserializer); - let api_entry = ::sse_decode(&mut deserializer); - let api_group = >::sse_decode(&mut deserializer); deserializer.end(); - move |context| async move { - transform_result_sse::<_, flutter_rust_bridge::for_generated::anyhow::Error>( - (move || async move { - let mut api_passwords_guard = None; - let decode_indices_ = - flutter_rust_bridge::for_generated::lockable_compute_decode_order( - vec![flutter_rust_bridge::for_generated::LockableOrderInfo::new( - &api_passwords, - 0, - false, - )], - ); - for i in decode_indices_ { - match i { - 0 => { - api_passwords_guard = - Some(api_passwords.lockable_decode_async_ref().await) - } - _ => unreachable!(), - } - } - let api_passwords_guard = api_passwords_guard.unwrap(); - let output_ok = crate::api::api::save_passkey( - &*api_passwords_guard, - api_id, - &api_entry, - api_group, - ) - .await?; - Ok(output_ok) - })() - .await, - ) + move |context| { + transform_result_sse::<_, ()>((move || { + let output_ok = + Result::<_, ()>::Ok(crate::api::api::ProvisionedFlavor::default())?; + Ok(output_ok) + })()) } }, ) } -fn wire__crate__api__api__save_password_impl( +fn wire__crate__api__api__ptr_to_dart_impl( port_: flutter_rust_bridge::for_generated::MessagePort, ptr_: flutter_rust_bridge::for_generated::PlatformGeneralizedUint8ListPtr, rust_vec_len_: i32, @@ -11452,7 +10890,7 @@ fn wire__crate__api__api__save_password_impl( ) { FLUTTER_RUST_BRIDGE_HANDLER.wrap_async::( flutter_rust_bridge::for_generated::TaskInfo { - debug_name: "save_password", + debug_name: "ptr_to_dart", port: Some(port_), mode: flutter_rust_bridge::for_generated::FfiCallMode::Normal, }, @@ -11466,44 +10904,13 @@ fn wire__crate__api__api__save_password_impl( }; let mut deserializer = flutter_rust_bridge::for_generated::SseDeserializer::new(message); - let api_passwords = >, - >, - >>::sse_decode(&mut deserializer); - let api_id = ::sse_decode(&mut deserializer); - let api_entry = ::sse_decode(&mut deserializer); - let api_group = >::sse_decode(&mut deserializer); + let api_ptr = ::sse_decode(&mut deserializer); deserializer.end(); move |context| async move { - transform_result_sse::<_, flutter_rust_bridge::for_generated::anyhow::Error>( + transform_result_sse::<_, ()>( (move || async move { - let mut api_passwords_guard = None; - let decode_indices_ = - flutter_rust_bridge::for_generated::lockable_compute_decode_order( - vec![flutter_rust_bridge::for_generated::LockableOrderInfo::new( - &api_passwords, - 0, - false, - )], - ); - for i in decode_indices_ { - match i { - 0 => { - api_passwords_guard = - Some(api_passwords.lockable_decode_async_ref().await) - } - _ => unreachable!(), - } - } - let api_passwords_guard = api_passwords_guard.unwrap(); - let output_ok = crate::api::api::save_password( - &*api_passwords_guard, - api_id, - &api_entry, - api_group, - ) - .await?; + let output_ok = + Result::<_, ()>::Ok(crate::api::api::ptr_to_dart(api_ptr).await)?; Ok(output_ok) })() .await, @@ -11512,7 +10919,7 @@ fn wire__crate__api__api__save_password_impl( }, ) } -fn wire__crate__api__api__save_password_meta_impl( +fn wire__crate__api__api__query_handle_impl( port_: flutter_rust_bridge::for_generated::MessagePort, ptr_: flutter_rust_bridge::for_generated::PlatformGeneralizedUint8ListPtr, rust_vec_len_: i32, @@ -11520,7 +10927,7 @@ fn wire__crate__api__api__save_password_meta_impl( ) { FLUTTER_RUST_BRIDGE_HANDLER.wrap_async::( flutter_rust_bridge::for_generated::TaskInfo { - debug_name: "save_password_meta", + debug_name: "query_handle", port: Some(port_), mode: flutter_rust_bridge::for_generated::FfiCallMode::Normal, }, @@ -11539,9 +10946,7 @@ fn wire__crate__api__api__save_password_meta_impl( Arc>, >, >>::sse_decode(&mut deserializer); - let api_id = ::sse_decode(&mut deserializer); - let api_entry = ::sse_decode(&mut deserializer); - let api_group = >::sse_decode(&mut deserializer); + let api_handle = ::sse_decode(&mut deserializer); deserializer.end(); move |context| async move { transform_result_sse::<_, flutter_rust_bridge::for_generated::anyhow::Error>( @@ -11565,13 +10970,9 @@ fn wire__crate__api__api__save_password_meta_impl( } } let api_passwords_guard = api_passwords_guard.unwrap(); - let output_ok = crate::api::api::save_password_meta( - &*api_passwords_guard, - api_id, - &api_entry, - api_group, - ) - .await?; + let output_ok = + crate::api::api::query_handle(&*api_passwords_guard, api_handle) + .await?; Ok(output_ok) })() .await, @@ -11580,17 +10981,16 @@ fn wire__crate__api__api__save_password_meta_impl( }, ) } -fn wire__crate__api__api__save_user_impl( - port_: flutter_rust_bridge::for_generated::MessagePort, +fn wire__crate__api__api__read_hardware_impl( ptr_: flutter_rust_bridge::for_generated::PlatformGeneralizedUint8ListPtr, rust_vec_len_: i32, data_len_: i32, -) { - FLUTTER_RUST_BRIDGE_HANDLER.wrap_normal::( +) -> flutter_rust_bridge::for_generated::WireSyncRust2DartSse { + FLUTTER_RUST_BRIDGE_HANDLER.wrap_sync::( flutter_rust_bridge::for_generated::TaskInfo { - debug_name: "save_user", - port: Some(port_), - mode: flutter_rust_bridge::for_generated::FfiCallMode::Normal, + debug_name: "read_hardware", + port: None, + mode: flutter_rust_bridge::for_generated::FfiCallMode::Sync, }, move || { let message = unsafe { @@ -11602,45 +11002,26 @@ fn wire__crate__api__api__save_user_impl( }; let mut deserializer = flutter_rust_bridge::for_generated::SseDeserializer::new(message); - let api_user = , - >>::sse_decode(&mut deserializer); + let api_path = ::sse_decode(&mut deserializer); deserializer.end(); - move |context| { - transform_result_sse::<_, flutter_rust_bridge::for_generated::anyhow::Error>( - (move || { - let mut api_user_guard = None; - let decode_indices_ = - flutter_rust_bridge::for_generated::lockable_compute_decode_order( - vec![flutter_rust_bridge::for_generated::LockableOrderInfo::new( - &api_user, 0, false, - )], - ); - for i in decode_indices_ { - match i { - 0 => api_user_guard = Some(api_user.lockable_decode_sync_ref()), - _ => unreachable!(), - } - } - let api_user_guard = api_user_guard.unwrap(); - let output_ok = crate::api::api::save_user(&*api_user_guard)?; - Ok(output_ok) - })(), - ) - } + transform_result_sse::<_, ()>((move || { + let output_ok = Result::<_, ()>::Ok(crate::api::api::read_hardware(api_path))?; + Ok(output_ok) + })()) }, ) } -fn wire__crate__api__api__save_users_impl( +fn wire__crate__api__api__recv_wait_impl( + port_: flutter_rust_bridge::for_generated::MessagePort, ptr_: flutter_rust_bridge::for_generated::PlatformGeneralizedUint8ListPtr, rust_vec_len_: i32, data_len_: i32, -) -> flutter_rust_bridge::for_generated::WireSyncRust2DartSse { - FLUTTER_RUST_BRIDGE_HANDLER.wrap_sync::( +) { + FLUTTER_RUST_BRIDGE_HANDLER.wrap_async::( flutter_rust_bridge::for_generated::TaskInfo { - debug_name: "save_users", - port: None, - mode: flutter_rust_bridge::for_generated::FfiCallMode::Sync, + debug_name: "recv_wait", + port: Some(port_), + mode: flutter_rust_bridge::for_generated::FfiCallMode::Normal, }, move || { let message = unsafe { @@ -11652,19 +11033,59 @@ fn wire__crate__api__api__save_users_impl( }; let mut deserializer = flutter_rust_bridge::for_generated::SseDeserializer::new(message); - let api_users = >::sse_decode(&mut deserializer); - let api_path = ::sse_decode(&mut deserializer); + let api_watcher = , + >>::sse_decode(&mut deserializer); + let api_state = >, + >>::sse_decode(&mut deserializer); deserializer.end(); - transform_result_sse::<_, ()>((move || { - let output_ok = Result::<_, ()>::Ok({ - crate::api::api::save_users(&api_users, api_path); - })?; - Ok(output_ok) - })()) + move |context| async move { + transform_result_sse::<_, ()>( + (move || async move { + let mut api_watcher_guard = None; + let mut api_state_guard = None; + let decode_indices_ = + flutter_rust_bridge::for_generated::lockable_compute_decode_order( + vec![ + flutter_rust_bridge::for_generated::LockableOrderInfo::new( + &api_watcher, + 0, + true, + ), + flutter_rust_bridge::for_generated::LockableOrderInfo::new( + &api_state, 1, false, + ), + ], + ); + for i in decode_indices_ { + match i { + 0 => { + api_watcher_guard = + Some(api_watcher.lockable_decode_async_ref_mut().await) + } + 1 => { + api_state_guard = + Some(api_state.lockable_decode_async_ref().await) + } + _ => unreachable!(), + } + } + let mut api_watcher_guard = api_watcher_guard.unwrap(); + let api_state_guard = api_state_guard.unwrap(); + let output_ok = Result::<_, ()>::Ok( + crate::api::api::recv_wait(&mut *api_watcher_guard, &*api_state_guard) + .await, + )?; + Ok(output_ok) + })() + .await, + ) + } }, ) } -fn wire__crate__api__api__save_wifi_password_impl( +fn wire__crate__api__api__refresh_aps_connection_impl( port_: flutter_rust_bridge::for_generated::MessagePort, ptr_: flutter_rust_bridge::for_generated::PlatformGeneralizedUint8ListPtr, rust_vec_len_: i32, @@ -11672,7 +11093,7 @@ fn wire__crate__api__api__save_wifi_password_impl( ) { FLUTTER_RUST_BRIDGE_HANDLER.wrap_async::( flutter_rust_bridge::for_generated::TaskInfo { - debug_name: "save_wifi_password", + debug_name: "refresh_aps_connection", port: Some(port_), mode: flutter_rust_bridge::for_generated::FfiCallMode::Normal, }, @@ -11686,44 +11107,31 @@ fn wire__crate__api__api__save_wifi_password_impl( }; let mut deserializer = flutter_rust_bridge::for_generated::SseDeserializer::new(message); - let api_passwords = >, - >, + let api_aps = , >>::sse_decode(&mut deserializer); - let api_id = ::sse_decode(&mut deserializer); - let api_entry = ::sse_decode(&mut deserializer); - let api_group = >::sse_decode(&mut deserializer); deserializer.end(); move |context| async move { transform_result_sse::<_, flutter_rust_bridge::for_generated::anyhow::Error>( (move || async move { - let mut api_passwords_guard = None; + let mut api_aps_guard = None; let decode_indices_ = flutter_rust_bridge::for_generated::lockable_compute_decode_order( vec![flutter_rust_bridge::for_generated::LockableOrderInfo::new( - &api_passwords, - 0, - false, + &api_aps, 0, false, )], ); for i in decode_indices_ { match i { 0 => { - api_passwords_guard = - Some(api_passwords.lockable_decode_async_ref().await) + api_aps_guard = Some(api_aps.lockable_decode_async_ref().await) } _ => unreachable!(), } } - let api_passwords_guard = api_passwords_guard.unwrap(); - let output_ok = crate::api::api::save_wifi_password( - &*api_passwords_guard, - api_id, - &api_entry, - api_group, - ) - .await?; + let api_aps_guard = api_aps_guard.unwrap(); + let output_ok = + crate::api::api::refresh_aps_connection(&*api_aps_guard).await?; Ok(output_ok) })() .await, @@ -11732,7 +11140,7 @@ fn wire__crate__api__api__save_wifi_password_impl( }, ) } -fn wire__crate__api__api__select_background_friend_impl( +fn wire__crate__api__api__refresh_background_following_impl( port_: flutter_rust_bridge::for_generated::MessagePort, ptr_: flutter_rust_bridge::for_generated::PlatformGeneralizedUint8ListPtr, rust_vec_len_: i32, @@ -11740,7 +11148,7 @@ fn wire__crate__api__api__select_background_friend_impl( ) { FLUTTER_RUST_BRIDGE_HANDLER.wrap_async::( flutter_rust_bridge::for_generated::TaskInfo { - debug_name: "select_background_friend", + debug_name: "refresh_background_following", port: Some(port_), mode: flutter_rust_bridge::for_generated::FfiCallMode::Normal, }, @@ -11754,36 +11162,53 @@ fn wire__crate__api__api__select_background_friend_impl( }; let mut deserializer = flutter_rust_bridge::for_generated::SseDeserializer::new(message); - let api_fmfd = >, >, >>::sse_decode(&mut deserializer); - let api_friend = >::sse_decode(&mut deserializer); + let api_config = , + >>::sse_decode(&mut deserializer); deserializer.end(); move |context| async move { transform_result_sse::<_, flutter_rust_bridge::for_generated::anyhow::Error>( (move || async move { - let mut api_fmfd_guard = None; + let mut api_state_guard = None; + let mut api_config_guard = None; let decode_indices_ = flutter_rust_bridge::for_generated::lockable_compute_decode_order( - vec![flutter_rust_bridge::for_generated::LockableOrderInfo::new( - &api_fmfd, 0, false, - )], + vec![ + flutter_rust_bridge::for_generated::LockableOrderInfo::new( + &api_state, 0, false, + ), + flutter_rust_bridge::for_generated::LockableOrderInfo::new( + &api_config, + 1, + false, + ), + ], ); for i in decode_indices_ { match i { 0 => { - api_fmfd_guard = - Some(api_fmfd.lockable_decode_async_ref().await) + api_state_guard = + Some(api_state.lockable_decode_async_ref().await) + } + 1 => { + api_config_guard = + Some(api_config.lockable_decode_async_ref().await) } _ => unreachable!(), } } - let api_fmfd_guard = api_fmfd_guard.unwrap(); - let output_ok = - crate::api::api::select_background_friend(&*api_fmfd_guard, api_friend) - .await?; + let api_state_guard = api_state_guard.unwrap(); + let api_config_guard = api_config_guard.unwrap(); + let output_ok = crate::api::api::refresh_background_following( + &*api_state_guard, + &*api_config_guard, + ) + .await?; Ok(output_ok) })() .await, @@ -11792,7 +11217,7 @@ fn wire__crate__api__api__select_background_friend_impl( }, ) } -fn wire__crate__api__api__select_friend_impl( +fn wire__crate__api__api__refresh_devices_impl( port_: flutter_rust_bridge::for_generated::MessagePort, ptr_: flutter_rust_bridge::for_generated::PlatformGeneralizedUint8ListPtr, rust_vec_len_: i32, @@ -11800,7 +11225,7 @@ fn wire__crate__api__api__select_friend_impl( ) { FLUTTER_RUST_BRIDGE_HANDLER.wrap_async::( flutter_rust_bridge::for_generated::TaskInfo { - debug_name: "select_friend", + debug_name: "refresh_devices", port: Some(port_), mode: flutter_rust_bridge::for_generated::FfiCallMode::Normal, }, @@ -11819,10 +11244,9 @@ fn wire__crate__api__api__select_friend_impl( >>::sse_decode(&mut deserializer); let api_client = , + FindMyPhoneClient, >, >>::sse_decode(&mut deserializer); - let api_friend = >::sse_decode(&mut deserializer); deserializer.end(); move |context| async move { transform_result_sse::<_, flutter_rust_bridge::for_generated::anyhow::Error>( @@ -11859,10 +11283,9 @@ fn wire__crate__api__api__select_friend_impl( } let api_config_guard = api_config_guard.unwrap(); let mut api_client_guard = api_client_guard.unwrap(); - let output_ok = crate::api::api::select_friend( + let output_ok = crate::api::api::refresh_devices( &*api_config_guard, &mut *api_client_guard, - api_friend, ) .await?; Ok(output_ok) @@ -11873,7 +11296,7 @@ fn wire__crate__api__api__select_friend_impl( }, ) } -fn wire__crate__api__api__send_impl( +fn wire__crate__api__api__refresh_following_impl( port_: flutter_rust_bridge::for_generated::MessagePort, ptr_: flutter_rust_bridge::for_generated::PlatformGeneralizedUint8ListPtr, rust_vec_len_: i32, @@ -11881,7 +11304,7 @@ fn wire__crate__api__api__send_impl( ) { FLUTTER_RUST_BRIDGE_HANDLER.wrap_async::( flutter_rust_bridge::for_generated::TaskInfo { - debug_name: "send", + debug_name: "refresh_following", port: Some(port_), mode: flutter_rust_bridge::for_generated::FfiCallMode::Normal, }, @@ -11895,48 +11318,55 @@ fn wire__crate__api__api__send_impl( }; let mut deserializer = flutter_rust_bridge::for_generated::SseDeserializer::new(message); - let api_state = >, + let api_config = , >>::sse_decode(&mut deserializer); - let api_local = >>, + let api_client = , + >, >>::sse_decode(&mut deserializer); - let api_msg = ::sse_decode(&mut deserializer); deserializer.end(); move |context| async move { transform_result_sse::<_, flutter_rust_bridge::for_generated::anyhow::Error>( (move || async move { - let mut api_state_guard = None; - let mut api_local_guard = None; + let mut api_config_guard = None; + let mut api_client_guard = None; let decode_indices_ = flutter_rust_bridge::for_generated::lockable_compute_decode_order( vec![ flutter_rust_bridge::for_generated::LockableOrderInfo::new( - &api_state, 0, false, + &api_config, + 0, + false, ), flutter_rust_bridge::for_generated::LockableOrderInfo::new( - &api_local, 1, false, + &api_client, + 1, + true, ), ], ); for i in decode_indices_ { match i { 0 => { - api_state_guard = - Some(api_state.lockable_decode_async_ref().await) + api_config_guard = + Some(api_config.lockable_decode_async_ref().await) } 1 => { - api_local_guard = - Some(api_local.lockable_decode_async_ref().await) + api_client_guard = + Some(api_client.lockable_decode_async_ref_mut().await) } _ => unreachable!(), } } - let api_state_guard = api_state_guard.unwrap(); - let api_local_guard = api_local_guard.unwrap(); - let output_ok = - crate::api::api::send(&*api_state_guard, &*api_local_guard, api_msg) - .await?; + let api_config_guard = api_config_guard.unwrap(); + let mut api_client_guard = api_client_guard.unwrap(); + let output_ok = crate::api::api::refresh_following( + &*api_config_guard, + &mut *api_client_guard, + ) + .await?; Ok(output_ok) })() .await, @@ -11945,7 +11375,7 @@ fn wire__crate__api__api__send_impl( }, ) } -fn wire__crate__api__api__send_2fa_sms_impl( +fn wire__crate__api__api__register_ids_impl( port_: flutter_rust_bridge::for_generated::MessagePort, ptr_: flutter_rust_bridge::for_generated::PlatformGeneralizedUint8ListPtr, rust_vec_len_: i32, @@ -11953,7 +11383,7 @@ fn wire__crate__api__api__send_2fa_sms_impl( ) { FLUTTER_RUST_BRIDGE_HANDLER.wrap_async::( flutter_rust_bridge::for_generated::TaskInfo { - debug_name: "send_2fa_sms", + debug_name: "register_ids", port: Some(port_), mode: flutter_rust_bridge::for_generated::FfiCallMode::Normal, }, @@ -11967,42 +11397,67 @@ fn wire__crate__api__api__send_2fa_sms_impl( }; let mut deserializer = flutter_rust_bridge::for_generated::SseDeserializer::new(message); - let api_locked = >>::sse_decode( - &mut deserializer, - ); - let api_account = >>, - >, + let api_path = ::sse_decode(&mut deserializer); + let api_config = , >>::sse_decode(&mut deserializer); - let api_phone_id = ::sse_decode(&mut deserializer); + let api_aps = , + >>::sse_decode(&mut deserializer); + let api_identity = , + >>::sse_decode(&mut deserializer); + let api_users = >::sse_decode(&mut deserializer); deserializer.end(); move |context| async move { transform_result_sse::<_, flutter_rust_bridge::for_generated::anyhow::Error>( (move || async move { - let mut api_account_guard = None; + let mut api_config_guard = None; + let mut api_aps_guard = None; + let mut api_identity_guard = None; let decode_indices_ = flutter_rust_bridge::for_generated::lockable_compute_decode_order( - vec![flutter_rust_bridge::for_generated::LockableOrderInfo::new( - &api_account, - 0, - false, - )], + vec![ + flutter_rust_bridge::for_generated::LockableOrderInfo::new( + &api_config, + 0, + false, + ), + flutter_rust_bridge::for_generated::LockableOrderInfo::new( + &api_aps, 1, false, + ), + flutter_rust_bridge::for_generated::LockableOrderInfo::new( + &api_identity, + 2, + false, + ), + ], ); for i in decode_indices_ { match i { 0 => { - api_account_guard = - Some(api_account.lockable_decode_async_ref().await) + api_config_guard = + Some(api_config.lockable_decode_async_ref().await) + } + 1 => { + api_aps_guard = Some(api_aps.lockable_decode_async_ref().await) + } + 2 => { + api_identity_guard = + Some(api_identity.lockable_decode_async_ref().await) } _ => unreachable!(), } } - let api_account_guard = api_account_guard.unwrap(); - let output_ok = crate::api::api::send_2fa_sms( - api_locked, - &*api_account_guard, - api_phone_id, + let api_config_guard = api_config_guard.unwrap(); + let api_aps_guard = api_aps_guard.unwrap(); + let api_identity_guard = api_identity_guard.unwrap(); + let output_ok = crate::api::api::register_ids( + api_path, + &*api_config_guard, + &*api_aps_guard, + &*api_identity_guard, + api_users, ) .await?; Ok(output_ok) @@ -12013,7 +11468,7 @@ fn wire__crate__api__api__send_2fa_sms_impl( }, ) } -fn wire__crate__api__api__send_2fa_to_devices_impl( +fn wire__crate__api__api__remove_album_impl( port_: flutter_rust_bridge::for_generated::MessagePort, ptr_: flutter_rust_bridge::for_generated::PlatformGeneralizedUint8ListPtr, rust_vec_len_: i32, @@ -12021,7 +11476,7 @@ fn wire__crate__api__api__send_2fa_to_devices_impl( ) { FLUTTER_RUST_BRIDGE_HANDLER.wrap_async::( flutter_rust_bridge::for_generated::TaskInfo { - debug_name: "send_2fa_to_devices", + debug_name: "remove_album", port: Some(port_), mode: flutter_rust_bridge::for_generated::FfiCallMode::Normal, }, @@ -12035,51 +11490,35 @@ fn wire__crate__api__api__send_2fa_to_devices_impl( }; let mut deserializer = flutter_rust_bridge::for_generated::SseDeserializer::new(message); - let api_state = >>, + SyncManager, >, >>::sse_decode(&mut deserializer); - let api_conn = , - >>::sse_decode(&mut deserializer); + let api_guid = ::sse_decode(&mut deserializer); deserializer.end(); move |context| async move { transform_result_sse::<_, flutter_rust_bridge::for_generated::anyhow::Error>( (move || async move { - let mut api_state_guard = None; - let mut api_conn_guard = None; + let mut api_lock_guard = None; let decode_indices_ = flutter_rust_bridge::for_generated::lockable_compute_decode_order( - vec![ - flutter_rust_bridge::for_generated::LockableOrderInfo::new( - &api_state, 0, false, - ), - flutter_rust_bridge::for_generated::LockableOrderInfo::new( - &api_conn, 1, false, - ), - ], + vec![flutter_rust_bridge::for_generated::LockableOrderInfo::new( + &api_lock, 0, false, + )], ); for i in decode_indices_ { match i { 0 => { - api_state_guard = - Some(api_state.lockable_decode_async_ref().await) - } - 1 => { - api_conn_guard = - Some(api_conn.lockable_decode_async_ref().await) + api_lock_guard = + Some(api_lock.lockable_decode_async_ref().await) } _ => unreachable!(), } } - let api_state_guard = api_state_guard.unwrap(); - let api_conn_guard = api_conn_guard.unwrap(); - let output_ok = crate::api::api::send_2fa_to_devices( - &*api_state_guard, - &*api_conn_guard, - ) - .await?; + let api_lock_guard = api_lock_guard.unwrap(); + let output_ok = + crate::api::api::remove_album(&*api_lock_guard, api_guid).await?; Ok(output_ok) })() .await, @@ -12088,16 +11527,17 @@ fn wire__crate__api__api__send_2fa_to_devices_impl( }, ) } -fn wire__crate__api__api__send_daemon_impl( +fn wire__crate__api__api__remove_user_impl( + port_: flutter_rust_bridge::for_generated::MessagePort, ptr_: flutter_rust_bridge::for_generated::PlatformGeneralizedUint8ListPtr, rust_vec_len_: i32, data_len_: i32, -) -> flutter_rust_bridge::for_generated::WireSyncRust2DartSse { - FLUTTER_RUST_BRIDGE_HANDLER.wrap_sync::( +) { + FLUTTER_RUST_BRIDGE_HANDLER.wrap_async::( flutter_rust_bridge::for_generated::TaskInfo { - debug_name: "send_daemon", - port: None, - mode: flutter_rust_bridge::for_generated::FfiCallMode::Sync, + debug_name: "remove_user", + port: Some(port_), + mode: flutter_rust_bridge::for_generated::FfiCallMode::Normal, }, move || { let message = unsafe { @@ -12109,26 +11549,59 @@ fn wire__crate__api__api__send_daemon_impl( }; let mut deserializer = flutter_rust_bridge::for_generated::SseDeserializer::new(message); - let api_state = ::sse_decode(&mut deserializer); - let api_watcher = ::sse_decode(&mut deserializer); + let api_passwords = >, + >, + >>::sse_decode(&mut deserializer); + let api_gid = ::sse_decode(&mut deserializer); + let api_handle = ::sse_decode(&mut deserializer); deserializer.end(); - transform_result_sse::<_, ()>((move || { - let output_ok = - Result::<_, ()>::Ok(crate::api::api::send_daemon(api_state, api_watcher))?; - Ok(output_ok) - })()) + move |context| async move { + transform_result_sse::<_, flutter_rust_bridge::for_generated::anyhow::Error>( + (move || async move { + let mut api_passwords_guard = None; + let decode_indices_ = + flutter_rust_bridge::for_generated::lockable_compute_decode_order( + vec![flutter_rust_bridge::for_generated::LockableOrderInfo::new( + &api_passwords, + 0, + false, + )], + ); + for i in decode_indices_ { + match i { + 0 => { + api_passwords_guard = + Some(api_passwords.lockable_decode_async_ref().await) + } + _ => unreachable!(), + } + } + let api_passwords_guard = api_passwords_guard.unwrap(); + let output_ok = crate::api::api::remove_user( + &*api_passwords_guard, + api_gid, + api_handle, + ) + .await?; + Ok(output_ok) + })() + .await, + ) + } }, ) } -fn wire__crate__api__api__service_from_ptr_impl( +fn wire__crate__api__api__rename_group_impl( port_: flutter_rust_bridge::for_generated::MessagePort, ptr_: flutter_rust_bridge::for_generated::PlatformGeneralizedUint8ListPtr, rust_vec_len_: i32, data_len_: i32, ) { - FLUTTER_RUST_BRIDGE_HANDLER.wrap_normal::( + FLUTTER_RUST_BRIDGE_HANDLER.wrap_async::( flutter_rust_bridge::for_generated::TaskInfo { - debug_name: "service_from_ptr", + debug_name: "rename_group", port: Some(port_), mode: flutter_rust_bridge::for_generated::FfiCallMode::Normal, }, @@ -12142,19 +11615,51 @@ fn wire__crate__api__api__service_from_ptr_impl( }; let mut deserializer = flutter_rust_bridge::for_generated::SseDeserializer::new(message); - let api_ptr = ::sse_decode(&mut deserializer); + let api_passwords = >, + >, + >>::sse_decode(&mut deserializer); + let api_gid = ::sse_decode(&mut deserializer); + let api_newname = ::sse_decode(&mut deserializer); deserializer.end(); - move |context| { - transform_result_sse::<_, ()>((move || { - let output_ok = - Result::<_, ()>::Ok(crate::api::api::service_from_ptr(api_ptr))?; - Ok(output_ok) - })()) + move |context| async move { + transform_result_sse::<_, flutter_rust_bridge::for_generated::anyhow::Error>( + (move || async move { + let mut api_passwords_guard = None; + let decode_indices_ = + flutter_rust_bridge::for_generated::lockable_compute_decode_order( + vec![flutter_rust_bridge::for_generated::LockableOrderInfo::new( + &api_passwords, + 0, + false, + )], + ); + for i in decode_indices_ { + match i { + 0 => { + api_passwords_guard = + Some(api_passwords.lockable_decode_async_ref().await) + } + _ => unreachable!(), + } + } + let api_passwords_guard = api_passwords_guard.unwrap(); + let output_ok = crate::api::api::rename_group( + &*api_passwords_guard, + api_gid, + api_newname, + ) + .await?; + Ok(output_ok) + })() + .await, + ) } }, ) } -fn wire__crate__api__api__set_identity_impl( +fn wire__crate__api__api__report_messages_impl( port_: flutter_rust_bridge::for_generated::MessagePort, ptr_: flutter_rust_bridge::for_generated::PlatformGeneralizedUint8ListPtr, rust_vec_len_: i32, @@ -12162,7 +11667,7 @@ fn wire__crate__api__api__set_identity_impl( ) { FLUTTER_RUST_BRIDGE_HANDLER.wrap_async::( flutter_rust_bridge::for_generated::TaskInfo { - debug_name: "set_identity", + debug_name: "report_messages", port: Some(port_), mode: flutter_rust_bridge::for_generated::FfiCallMode::Normal, }, @@ -12176,57 +11681,38 @@ fn wire__crate__api__api__set_identity_impl( }; let mut deserializer = flutter_rust_bridge::for_generated::SseDeserializer::new(message); - let api_state_path = ::sse_decode(&mut deserializer); - let api_config = , - >>::sse_decode(&mut deserializer); - let api_identity = , + let api_state = >, >>::sse_decode(&mut deserializer); + let api_handle = ::sse_decode(&mut deserializer); + let api_messages = >::sse_decode(&mut deserializer); deserializer.end(); move |context| async move { - transform_result_sse::<_, ()>( + transform_result_sse::<_, flutter_rust_bridge::for_generated::anyhow::Error>( (move || async move { - let mut api_config_guard = None; - let mut api_identity_guard = None; + let mut api_state_guard = None; let decode_indices_ = flutter_rust_bridge::for_generated::lockable_compute_decode_order( - vec![ - flutter_rust_bridge::for_generated::LockableOrderInfo::new( - &api_config, - 0, - false, - ), - flutter_rust_bridge::for_generated::LockableOrderInfo::new( - &api_identity, - 1, - false, - ), - ], + vec![flutter_rust_bridge::for_generated::LockableOrderInfo::new( + &api_state, 0, false, + )], ); for i in decode_indices_ { match i { 0 => { - api_config_guard = - Some(api_config.lockable_decode_async_ref().await) - } - 1 => { - api_identity_guard = - Some(api_identity.lockable_decode_async_ref().await) + api_state_guard = + Some(api_state.lockable_decode_async_ref().await) } _ => unreachable!(), } } - let api_config_guard = api_config_guard.unwrap(); - let api_identity_guard = api_identity_guard.unwrap(); - let output_ok = Result::<_, ()>::Ok({ - crate::api::api::set_identity( - api_state_path, - &*api_config_guard, - &*api_identity_guard, - ) - .await; - })?; + let api_state_guard = api_state_guard.unwrap(); + let output_ok = crate::api::api::report_messages( + &*api_state_guard, + api_handle, + api_messages, + ) + .await?; Ok(output_ok) })() .await, @@ -12235,7 +11721,7 @@ fn wire__crate__api__api__set_identity_impl( }, ) } -fn wire__crate__api__api__set_profile_impl( +fn wire__crate__api__api__request_handles_impl( port_: flutter_rust_bridge::for_generated::MessagePort, ptr_: flutter_rust_bridge::for_generated::PlatformGeneralizedUint8ListPtr, rust_vec_len_: i32, @@ -12243,7 +11729,7 @@ fn wire__crate__api__api__set_profile_impl( ) { FLUTTER_RUST_BRIDGE_HANDLER.wrap_async::( flutter_rust_bridge::for_generated::TaskInfo { - debug_name: "set_profile", + debug_name: "request_handles", port: Some(port_), mode: flutter_rust_bridge::for_generated::FfiCallMode::Normal, }, @@ -12257,24 +11743,21 @@ fn wire__crate__api__api__set_profile_impl( }; let mut deserializer = flutter_rust_bridge::for_generated::SseDeserializer::new(message); - let api_profiles = >, + Arc>, >, >>::sse_decode(&mut deserializer); - let api_record = - ::sse_decode(&mut deserializer); - let api_existing = - >::sse_decode(&mut deserializer); + let api_to = >::sse_decode(&mut deserializer); deserializer.end(); move |context| async move { transform_result_sse::<_, flutter_rust_bridge::for_generated::anyhow::Error>( (move || async move { - let mut api_profiles_guard = None; + let mut api_status_guard = None; let decode_indices_ = flutter_rust_bridge::for_generated::lockable_compute_decode_order( vec![flutter_rust_bridge::for_generated::LockableOrderInfo::new( - &api_profiles, + &api_status, 0, false, )], @@ -12282,19 +11765,15 @@ fn wire__crate__api__api__set_profile_impl( for i in decode_indices_ { match i { 0 => { - api_profiles_guard = - Some(api_profiles.lockable_decode_async_ref().await) + api_status_guard = + Some(api_status.lockable_decode_async_ref().await) } _ => unreachable!(), } } - let api_profiles_guard = api_profiles_guard.unwrap(); - let output_ok = crate::api::api::set_profile( - &*api_profiles_guard, - api_record, - api_existing, - ) - .await?; + let api_status_guard = api_status_guard.unwrap(); + let output_ok = + crate::api::api::request_handles(&*api_status_guard, api_to).await?; Ok(output_ok) })() .await, @@ -12303,7 +11782,39 @@ fn wire__crate__api__api__set_profile_impl( }, ) } -fn wire__crate__api__api__set_status_impl( +fn wire__crate__api__api__reset_anisette_impl( + ptr_: flutter_rust_bridge::for_generated::PlatformGeneralizedUint8ListPtr, + rust_vec_len_: i32, + data_len_: i32, +) -> flutter_rust_bridge::for_generated::WireSyncRust2DartSse { + FLUTTER_RUST_BRIDGE_HANDLER.wrap_sync::( + flutter_rust_bridge::for_generated::TaskInfo { + debug_name: "reset_anisette", + port: None, + mode: flutter_rust_bridge::for_generated::FfiCallMode::Sync, + }, + move || { + let message = unsafe { + flutter_rust_bridge::for_generated::Dart2RustMessageSse::from_wire( + ptr_, + rust_vec_len_, + data_len_, + ) + }; + let mut deserializer = + flutter_rust_bridge::for_generated::SseDeserializer::new(message); + let api_path = ::sse_decode(&mut deserializer); + deserializer.end(); + transform_result_sse::<_, ()>((move || { + let output_ok = Result::<_, ()>::Ok({ + crate::api::api::reset_anisette(api_path); + })?; + Ok(output_ok) + })()) + }, + ) +} +fn wire__crate__api__api__reset_channel_keys_impl( port_: flutter_rust_bridge::for_generated::MessagePort, ptr_: flutter_rust_bridge::for_generated::PlatformGeneralizedUint8ListPtr, rust_vec_len_: i32, @@ -12311,7 +11822,7 @@ fn wire__crate__api__api__set_status_impl( ) { FLUTTER_RUST_BRIDGE_HANDLER.wrap_async::( flutter_rust_bridge::for_generated::TaskInfo { - debug_name: "set_status", + debug_name: "reset_channel_keys", port: Some(port_), mode: flutter_rust_bridge::for_generated::FfiCallMode::Normal, }, @@ -12330,7 +11841,6 @@ fn wire__crate__api__api__set_status_impl( Arc>, >, >>::sse_decode(&mut deserializer); - let api_new_status = >::sse_decode(&mut deserializer); deserializer.end(); move |context| async move { transform_result_sse::<_, flutter_rust_bridge::for_generated::anyhow::Error>( @@ -12355,7 +11865,7 @@ fn wire__crate__api__api__set_status_impl( } let api_status_guard = api_status_guard.unwrap(); let output_ok = - crate::api::api::set_status(&*api_status_guard, api_new_status).await?; + crate::api::api::reset_channel_keys(&*api_status_guard).await?; Ok(output_ok) })() .await, @@ -12364,7 +11874,7 @@ fn wire__crate__api__api__set_status_impl( }, ) } -fn wire__crate__api__api__setup_push_impl( +fn wire__crate__api__api__reset_clique_impl( port_: flutter_rust_bridge::for_generated::MessagePort, ptr_: flutter_rust_bridge::for_generated::PlatformGeneralizedUint8ListPtr, rust_vec_len_: i32, @@ -12372,7 +11882,7 @@ fn wire__crate__api__api__setup_push_impl( ) { FLUTTER_RUST_BRIDGE_HANDLER.wrap_async::( flutter_rust_bridge::for_generated::TaskInfo { - debug_name: "setup_push", + debug_name: "reset_clique", port: Some(port_), mode: flutter_rust_bridge::for_generated::FfiCallMode::Normal, }, @@ -12386,30 +11896,33 @@ fn wire__crate__api__api__setup_push_impl( }; let mut deserializer = flutter_rust_bridge::for_generated::SseDeserializer::new(message); - let api_config = , + let api_keychain = >, + >, >>::sse_decode(&mut deserializer); - let api_identity = , + let api_cloud_messages = >, + >, >>::sse_decode(&mut deserializer); - let api_state = >::sse_decode(&mut deserializer); - let api_state_path = ::sse_decode(&mut deserializer); + let api_device_password = ::sse_decode(&mut deserializer); deserializer.end(); move |context| async move { - transform_result_sse::<_, ()>( + transform_result_sse::<_, flutter_rust_bridge::for_generated::anyhow::Error>( (move || async move { - let mut api_config_guard = None; - let mut api_identity_guard = None; + let mut api_keychain_guard = None; + let mut api_cloud_messages_guard = None; let decode_indices_ = flutter_rust_bridge::for_generated::lockable_compute_decode_order( vec![ flutter_rust_bridge::for_generated::LockableOrderInfo::new( - &api_config, + &api_keychain, 0, false, ), flutter_rust_bridge::for_generated::LockableOrderInfo::new( - &api_identity, + &api_cloud_messages, 1, false, ), @@ -12418,27 +11931,24 @@ fn wire__crate__api__api__setup_push_impl( for i in decode_indices_ { match i { 0 => { - api_config_guard = - Some(api_config.lockable_decode_async_ref().await) + api_keychain_guard = + Some(api_keychain.lockable_decode_async_ref().await) } 1 => { - api_identity_guard = - Some(api_identity.lockable_decode_async_ref().await) + api_cloud_messages_guard = + Some(api_cloud_messages.lockable_decode_async_ref().await) } _ => unreachable!(), } } - let api_config_guard = api_config_guard.unwrap(); - let api_identity_guard = api_identity_guard.unwrap(); - let output_ok = Result::<_, ()>::Ok( - crate::api::api::setup_push( - &*api_config_guard, - &*api_identity_guard, - api_state, - api_state_path, - ) - .await, - )?; + let api_keychain_guard = api_keychain_guard.unwrap(); + let api_cloud_messages_guard = api_cloud_messages_guard.unwrap(); + let output_ok = crate::api::api::reset_clique( + &*api_keychain_guard, + &*api_cloud_messages_guard, + api_device_password, + ) + .await?; Ok(output_ok) })() .await, @@ -12447,7 +11957,7 @@ fn wire__crate__api__api__setup_push_impl( }, ) } -fn wire__crate__api__api__shared_push_state_restore_impl( +fn wire__crate__api__api__reset_state_impl( port_: flutter_rust_bridge::for_generated::MessagePort, ptr_: flutter_rust_bridge::for_generated::PlatformGeneralizedUint8ListPtr, rust_vec_len_: i32, @@ -12455,7 +11965,7 @@ fn wire__crate__api__api__shared_push_state_restore_impl( ) { FLUTTER_RUST_BRIDGE_HANDLER.wrap_async::( flutter_rust_bridge::for_generated::TaskInfo { - debug_name: "shared_push_state_restore", + debug_name: "reset_state", port: Some(port_), mode: flutter_rust_bridge::for_generated::FfiCallMode::Normal, }, @@ -12469,73 +11979,172 @@ fn wire__crate__api__api__shared_push_state_restore_impl( }; let mut deserializer = flutter_rust_bridge::for_generated::SseDeserializer::new(message); + let api_cancel = >, + >>::sse_decode(&mut deserializer); let api_path = ::sse_decode(&mut deserializer); + let api_config = , + >>::sse_decode(&mut deserializer); + let api_aps = , + >>::sse_decode(&mut deserializer); + let api_account = + >>>>::sse_decode( + &mut deserializer, + ); + let api_reset_hw = ::sse_decode(&mut deserializer); + let api_logout = ::sse_decode(&mut deserializer); deserializer.end(); move |context| async move { - transform_result_sse::<_, ()>( + transform_result_sse::<_, flutter_rust_bridge::for_generated::anyhow::Error>( (move || async move { - let output_ok = Result::<_, ()>::Ok( - crate::api::api::SharedPushState::restore(api_path).await, - )?; - Ok(output_ok) - })() - .await, - ) - } - }, - ) -} -fn wire__crate__api__api__subscribe_impl( - port_: flutter_rust_bridge::for_generated::MessagePort, - ptr_: flutter_rust_bridge::for_generated::PlatformGeneralizedUint8ListPtr, - rust_vec_len_: i32, - data_len_: i32, -) { - FLUTTER_RUST_BRIDGE_HANDLER.wrap_async::( - flutter_rust_bridge::for_generated::TaskInfo { - debug_name: "subscribe", - port: Some(port_), - mode: flutter_rust_bridge::for_generated::FfiCallMode::Normal, - }, - move || { - let message = unsafe { - flutter_rust_bridge::for_generated::Dart2RustMessageSse::from_wire( - ptr_, - rust_vec_len_, - data_len_, - ) - }; - let mut deserializer = - flutter_rust_bridge::for_generated::SseDeserializer::new(message); - let api_lock = , + let mut api_cancel_guard = None; + let mut api_config_guard = None; + let mut api_aps_guard = None; + let decode_indices_ = + flutter_rust_bridge::for_generated::lockable_compute_decode_order( + vec![ + flutter_rust_bridge::for_generated::LockableOrderInfo::new( + &api_cancel, + 0, + false, + ), + flutter_rust_bridge::for_generated::LockableOrderInfo::new( + &api_config, + 1, + false, + ), + flutter_rust_bridge::for_generated::LockableOrderInfo::new( + &api_aps, 2, false, + ), + ], + ); + for i in decode_indices_ { + match i { + 0 => { + api_cancel_guard = + Some(api_cancel.lockable_decode_async_ref().await) + } + 1 => { + api_config_guard = + Some(api_config.lockable_decode_async_ref().await) + } + 2 => { + api_aps_guard = Some(api_aps.lockable_decode_async_ref().await) + } + _ => unreachable!(), + } + } + let api_cancel_guard = api_cancel_guard.unwrap(); + let api_config_guard = api_config_guard.unwrap(); + let api_aps_guard = api_aps_guard.unwrap(); + let output_ok = crate::api::api::reset_state( + &*api_cancel_guard, + api_path, + &*api_config_guard, + &*api_aps_guard, + api_account, + api_reset_hw, + api_logout, + ) + .await?; + Ok(output_ok) + })() + .await, + ) + } + }, + ) +} +fn wire__crate__api__api__restore_account_impl( + port_: flutter_rust_bridge::for_generated::MessagePort, + ptr_: flutter_rust_bridge::for_generated::PlatformGeneralizedUint8ListPtr, + rust_vec_len_: i32, + data_len_: i32, +) { + FLUTTER_RUST_BRIDGE_HANDLER.wrap_async::( + flutter_rust_bridge::for_generated::TaskInfo { + debug_name: "restore_account", + port: Some(port_), + mode: flutter_rust_bridge::for_generated::FfiCallMode::Normal, + }, + move || { + let message = unsafe { + flutter_rust_bridge::for_generated::Dart2RustMessageSse::from_wire( + ptr_, + rust_vec_len_, + data_len_, + ) + }; + let mut deserializer = + flutter_rust_bridge::for_generated::SseDeserializer::new(message); + let api_path = ::sse_decode(&mut deserializer); + let api_anisette = , >, >>::sse_decode(&mut deserializer); - let api_guid = ::sse_decode(&mut deserializer); + let api_config = , + >>::sse_decode(&mut deserializer); + let api_conn = , + >>::sse_decode(&mut deserializer); deserializer.end(); move |context| async move { - transform_result_sse::<_, flutter_rust_bridge::for_generated::anyhow::Error>( + transform_result_sse::<_, ()>( (move || async move { - let mut api_lock_guard = None; + let mut api_anisette_guard = None; + let mut api_config_guard = None; + let mut api_conn_guard = None; let decode_indices_ = flutter_rust_bridge::for_generated::lockable_compute_decode_order( - vec![flutter_rust_bridge::for_generated::LockableOrderInfo::new( - &api_lock, 0, false, - )], + vec![ + flutter_rust_bridge::for_generated::LockableOrderInfo::new( + &api_anisette, + 0, + false, + ), + flutter_rust_bridge::for_generated::LockableOrderInfo::new( + &api_config, + 1, + false, + ), + flutter_rust_bridge::for_generated::LockableOrderInfo::new( + &api_conn, 2, false, + ), + ], ); for i in decode_indices_ { match i { 0 => { - api_lock_guard = - Some(api_lock.lockable_decode_async_ref().await) + api_anisette_guard = + Some(api_anisette.lockable_decode_async_ref().await) + } + 1 => { + api_config_guard = + Some(api_config.lockable_decode_async_ref().await) + } + 2 => { + api_conn_guard = + Some(api_conn.lockable_decode_async_ref().await) } _ => unreachable!(), } } - let api_lock_guard = api_lock_guard.unwrap(); - let output_ok = - crate::api::api::subscribe(&*api_lock_guard, api_guid).await?; + let api_anisette_guard = api_anisette_guard.unwrap(); + let api_config_guard = api_config_guard.unwrap(); + let api_conn_guard = api_conn_guard.unwrap(); + let output_ok = Result::<_, ()>::Ok( + crate::api::api::restore_account( + api_path, + &*api_anisette_guard, + &*api_config_guard, + &*api_conn_guard, + ) + .await, + )?; Ok(output_ok) })() .await, @@ -12544,14 +12153,14 @@ fn wire__crate__api__api__subscribe_impl( }, ) } -fn wire__crate__api__api__subscribe_conn_impl( +fn wire__crate__api__api__restore_attachment_impl( ptr_: flutter_rust_bridge::for_generated::PlatformGeneralizedUint8ListPtr, rust_vec_len_: i32, data_len_: i32, ) -> flutter_rust_bridge::for_generated::WireSyncRust2DartSse { FLUTTER_RUST_BRIDGE_HANDLER.wrap_sync::( flutter_rust_bridge::for_generated::TaskInfo { - debug_name: "subscribe_conn", + debug_name: "restore_attachment", port: None, mode: flutter_rust_bridge::for_generated::FfiCallMode::Sync, }, @@ -12565,41 +12174,55 @@ fn wire__crate__api__api__subscribe_conn_impl( }; let mut deserializer = flutter_rust_bridge::for_generated::SseDeserializer::new(message); - let api_conn = , - >>::sse_decode(&mut deserializer); + let api_data = ::sse_decode(&mut deserializer); + deserializer.end(); + transform_result_sse::<_, ()>((move || { + let output_ok = Result::<_, ()>::Ok(crate::api::api::restore_attachment(api_data))?; + Ok(output_ok) + })()) + }, + ) +} +fn wire__crate__api__api__restore_cloud_chat_impl( + ptr_: flutter_rust_bridge::for_generated::PlatformGeneralizedUint8ListPtr, + rust_vec_len_: i32, + data_len_: i32, +) -> flutter_rust_bridge::for_generated::WireSyncRust2DartSse { + FLUTTER_RUST_BRIDGE_HANDLER.wrap_sync::( + flutter_rust_bridge::for_generated::TaskInfo { + debug_name: "restore_cloud_chat", + port: None, + mode: flutter_rust_bridge::for_generated::FfiCallMode::Sync, + }, + move || { + let message = unsafe { + flutter_rust_bridge::for_generated::Dart2RustMessageSse::from_wire( + ptr_, + rust_vec_len_, + data_len_, + ) + }; + let mut deserializer = + flutter_rust_bridge::for_generated::SseDeserializer::new(message); + let api_data = >::sse_decode(&mut deserializer); deserializer.end(); transform_result_sse::<_, ()>((move || { - let mut api_conn_guard = None; - let decode_indices_ = - flutter_rust_bridge::for_generated::lockable_compute_decode_order(vec![ - flutter_rust_bridge::for_generated::LockableOrderInfo::new( - &api_conn, 0, false, - ), - ]); - for i in decode_indices_ { - match i { - 0 => api_conn_guard = Some(api_conn.lockable_decode_sync_ref()), - _ => unreachable!(), - } - } - let api_conn_guard = api_conn_guard.unwrap(); let output_ok = - Result::<_, ()>::Ok(crate::api::api::subscribe_conn(&*api_conn_guard))?; + Result::<_, ()>::Ok(crate::api::api::restore_cloud_chat(&api_data))?; Ok(output_ok) })()) }, ) } -fn wire__crate__api__api__subscribe_token_impl( +fn wire__crate__api__api__restore_user_impl( port_: flutter_rust_bridge::for_generated::MessagePort, ptr_: flutter_rust_bridge::for_generated::PlatformGeneralizedUint8ListPtr, rust_vec_len_: i32, data_len_: i32, ) { - FLUTTER_RUST_BRIDGE_HANDLER.wrap_async::( + FLUTTER_RUST_BRIDGE_HANDLER.wrap_normal::( flutter_rust_bridge::for_generated::TaskInfo { - debug_name: "subscribe_token", + debug_name: "restore_user", port: Some(port_), mode: flutter_rust_bridge::for_generated::FfiCallMode::Normal, }, @@ -12613,44 +12236,84 @@ fn wire__crate__api__api__subscribe_token_impl( }; let mut deserializer = flutter_rust_bridge::for_generated::SseDeserializer::new(message); - let api_lock = , - >, - >>::sse_decode(&mut deserializer); - let api_token = ::sse_decode(&mut deserializer); + let api_user = ::sse_decode(&mut deserializer); deserializer.end(); - move |context| async move { + move |context| { transform_result_sse::<_, flutter_rust_bridge::for_generated::anyhow::Error>( - (move || async move { - let mut api_lock_guard = None; - let decode_indices_ = - flutter_rust_bridge::for_generated::lockable_compute_decode_order( - vec![flutter_rust_bridge::for_generated::LockableOrderInfo::new( - &api_lock, 0, false, - )], - ); - for i in decode_indices_ { - match i { - 0 => { - api_lock_guard = - Some(api_lock.lockable_decode_async_ref().await) - } - _ => unreachable!(), - } - } - let api_lock_guard = api_lock_guard.unwrap(); - let output_ok = - crate::api::api::subscribe_token(&*api_lock_guard, api_token).await?; + (move || { + let output_ok = crate::api::api::restore_user(api_user)?; Ok(output_ok) - })() - .await, + })(), ) } }, ) } -fn wire__crate__api__api__sync_attachments_impl( +fn wire__crate__api__api__restore_users_impl( + ptr_: flutter_rust_bridge::for_generated::PlatformGeneralizedUint8ListPtr, + rust_vec_len_: i32, + data_len_: i32, +) -> flutter_rust_bridge::for_generated::WireSyncRust2DartSse { + FLUTTER_RUST_BRIDGE_HANDLER.wrap_sync::( + flutter_rust_bridge::for_generated::TaskInfo { + debug_name: "restore_users", + port: None, + mode: flutter_rust_bridge::for_generated::FfiCallMode::Sync, + }, + move || { + let message = unsafe { + flutter_rust_bridge::for_generated::Dart2RustMessageSse::from_wire( + ptr_, + rust_vec_len_, + data_len_, + ) + }; + let mut deserializer = + flutter_rust_bridge::for_generated::SseDeserializer::new(message); + let api_path = ::sse_decode(&mut deserializer); + deserializer.end(); + transform_result_sse::<_, ()>((move || { + let output_ok = Result::<_, ()>::Ok(crate::api::api::restore_users(api_path))?; + Ok(output_ok) + })()) + }, + ) +} +fn wire__crate__api__api__save_attachment_impl( + port_: flutter_rust_bridge::for_generated::MessagePort, + ptr_: flutter_rust_bridge::for_generated::PlatformGeneralizedUint8ListPtr, + rust_vec_len_: i32, + data_len_: i32, +) { + FLUTTER_RUST_BRIDGE_HANDLER.wrap_normal::( + flutter_rust_bridge::for_generated::TaskInfo { + debug_name: "save_attachment", + port: Some(port_), + mode: flutter_rust_bridge::for_generated::FfiCallMode::Normal, + }, + move || { + let message = unsafe { + flutter_rust_bridge::for_generated::Dart2RustMessageSse::from_wire( + ptr_, + rust_vec_len_, + data_len_, + ) + }; + let mut deserializer = + flutter_rust_bridge::for_generated::SseDeserializer::new(message); + let api_att = ::sse_decode(&mut deserializer); + deserializer.end(); + move |context| { + transform_result_sse::<_, ()>((move || { + let output_ok = + Result::<_, ()>::Ok(crate::api::api::save_attachment(&api_att))?; + Ok(output_ok) + })()) + } + }, + ) +} +fn wire__crate__api__api__save_attachments_impl( port_: flutter_rust_bridge::for_generated::MessagePort, ptr_: flutter_rust_bridge::for_generated::PlatformGeneralizedUint8ListPtr, rust_vec_len_: i32, @@ -12658,7 +12321,7 @@ fn wire__crate__api__api__sync_attachments_impl( ) { FLUTTER_RUST_BRIDGE_HANDLER.wrap_async::( flutter_rust_bridge::for_generated::TaskInfo { - debug_name: "sync_attachments", + debug_name: "save_attachments", port: Some(port_), mode: flutter_rust_bridge::for_generated::FfiCallMode::Normal, }, @@ -12677,7 +12340,10 @@ fn wire__crate__api__api__sync_attachments_impl( Arc>, >, >>::sse_decode(&mut deserializer); - let api_continuation_token = >>::sse_decode(&mut deserializer); + let api_attachments = >::sse_decode(&mut deserializer); deserializer.end(); move |context| async move { transform_result_sse::<_, flutter_rust_bridge::for_generated::anyhow::Error>( @@ -12703,9 +12369,9 @@ fn wire__crate__api__api__sync_attachments_impl( } let api_cloud_messages_client_guard = api_cloud_messages_client_guard.unwrap(); - let output_ok = crate::api::api::sync_attachments( + let output_ok = crate::api::api::save_attachments( &*api_cloud_messages_client_guard, - api_continuation_token, + api_attachments, ) .await?; Ok(output_ok) @@ -12716,7 +12382,7 @@ fn wire__crate__api__api__sync_attachments_impl( }, ) } -fn wire__crate__api__api__sync_chats_impl( +fn wire__crate__api__api__save_chats_impl( port_: flutter_rust_bridge::for_generated::MessagePort, ptr_: flutter_rust_bridge::for_generated::PlatformGeneralizedUint8ListPtr, rust_vec_len_: i32, @@ -12724,7 +12390,7 @@ fn wire__crate__api__api__sync_chats_impl( ) { FLUTTER_RUST_BRIDGE_HANDLER.wrap_async::( flutter_rust_bridge::for_generated::TaskInfo { - debug_name: "sync_chats", + debug_name: "save_chats", port: Some(port_), mode: flutter_rust_bridge::for_generated::FfiCallMode::Normal, }, @@ -12743,7 +12409,10 @@ fn wire__crate__api__api__sync_chats_impl( Arc>, >, >>::sse_decode(&mut deserializer); - let api_continuation_token = >>::sse_decode(&mut deserializer); + let api_chats = + >::sse_decode( + &mut deserializer, + ); deserializer.end(); move |context| async move { transform_result_sse::<_, flutter_rust_bridge::for_generated::anyhow::Error>( @@ -12769,9 +12438,9 @@ fn wire__crate__api__api__sync_chats_impl( } let api_cloud_messages_client_guard = api_cloud_messages_client_guard.unwrap(); - let output_ok = crate::api::api::sync_chats( + let output_ok = crate::api::api::save_chats( &*api_cloud_messages_client_guard, - api_continuation_token, + api_chats, ) .await?; Ok(output_ok) @@ -12782,7 +12451,37 @@ fn wire__crate__api__api__sync_chats_impl( }, ) } -fn wire__crate__api__api__sync_messages_impl( +fn wire__crate__api__api__save_cloud_chat_impl( + ptr_: flutter_rust_bridge::for_generated::PlatformGeneralizedUint8ListPtr, + rust_vec_len_: i32, + data_len_: i32, +) -> flutter_rust_bridge::for_generated::WireSyncRust2DartSse { + FLUTTER_RUST_BRIDGE_HANDLER.wrap_sync::( + flutter_rust_bridge::for_generated::TaskInfo { + debug_name: "save_cloud_chat", + port: None, + mode: flutter_rust_bridge::for_generated::FfiCallMode::Sync, + }, + move || { + let message = unsafe { + flutter_rust_bridge::for_generated::Dart2RustMessageSse::from_wire( + ptr_, + rust_vec_len_, + data_len_, + ) + }; + let mut deserializer = + flutter_rust_bridge::for_generated::SseDeserializer::new(message); + let api_value = ::sse_decode(&mut deserializer); + deserializer.end(); + transform_result_sse::<_, ()>((move || { + let output_ok = Result::<_, ()>::Ok(crate::api::api::save_cloud_chat(&api_value))?; + Ok(output_ok) + })()) + }, + ) +} +fn wire__crate__api__api__save_messages_impl( port_: flutter_rust_bridge::for_generated::MessagePort, ptr_: flutter_rust_bridge::for_generated::PlatformGeneralizedUint8ListPtr, rust_vec_len_: i32, @@ -12790,7 +12489,7 @@ fn wire__crate__api__api__sync_messages_impl( ) { FLUTTER_RUST_BRIDGE_HANDLER.wrap_async::( flutter_rust_bridge::for_generated::TaskInfo { - debug_name: "sync_messages", + debug_name: "save_messages", port: Some(port_), mode: flutter_rust_bridge::for_generated::FfiCallMode::Normal, }, @@ -12809,7 +12508,10 @@ fn wire__crate__api__api__sync_messages_impl( Arc>, >, >>::sse_decode(&mut deserializer); - let api_continuation_token = >>::sse_decode(&mut deserializer); + let api_messages = + >::sse_decode( + &mut deserializer, + ); deserializer.end(); move |context| async move { transform_result_sse::<_, flutter_rust_bridge::for_generated::anyhow::Error>( @@ -12835,9 +12537,9 @@ fn wire__crate__api__api__sync_messages_impl( } let api_cloud_messages_client_guard = api_cloud_messages_client_guard.unwrap(); - let output_ok = crate::api::api::sync_messages( + let output_ok = crate::api::api::save_messages( &*api_cloud_messages_client_guard, - api_continuation_token, + api_messages, ) .await?; Ok(output_ok) @@ -12848,7 +12550,7 @@ fn wire__crate__api__api__sync_messages_impl( }, ) } -fn wire__crate__api__api__sync_now_impl( +fn wire__crate__api__api__save_passkey_impl( port_: flutter_rust_bridge::for_generated::MessagePort, ptr_: flutter_rust_bridge::for_generated::PlatformGeneralizedUint8ListPtr, rust_vec_len_: i32, @@ -12856,7 +12558,7 @@ fn wire__crate__api__api__sync_now_impl( ) { FLUTTER_RUST_BRIDGE_HANDLER.wrap_async::( flutter_rust_bridge::for_generated::TaskInfo { - debug_name: "sync_now", + debug_name: "save_passkey", port: Some(port_), mode: flutter_rust_bridge::for_generated::FfiCallMode::Normal, }, @@ -12870,33 +12572,44 @@ fn wire__crate__api__api__sync_now_impl( }; let mut deserializer = flutter_rust_bridge::for_generated::SseDeserializer::new(message); - let api_lock = , + Arc>, >, >>::sse_decode(&mut deserializer); + let api_id = ::sse_decode(&mut deserializer); + let api_entry = ::sse_decode(&mut deserializer); + let api_group = >::sse_decode(&mut deserializer); deserializer.end(); move |context| async move { transform_result_sse::<_, flutter_rust_bridge::for_generated::anyhow::Error>( (move || async move { - let mut api_lock_guard = None; + let mut api_passwords_guard = None; let decode_indices_ = flutter_rust_bridge::for_generated::lockable_compute_decode_order( vec![flutter_rust_bridge::for_generated::LockableOrderInfo::new( - &api_lock, 0, false, + &api_passwords, + 0, + false, )], ); for i in decode_indices_ { match i { 0 => { - api_lock_guard = - Some(api_lock.lockable_decode_async_ref().await) + api_passwords_guard = + Some(api_passwords.lockable_decode_async_ref().await) } _ => unreachable!(), } } - let api_lock_guard = api_lock_guard.unwrap(); - let output_ok = crate::api::api::sync_now(&*api_lock_guard).await?; + let api_passwords_guard = api_passwords_guard.unwrap(); + let output_ok = crate::api::api::save_passkey( + &*api_passwords_guard, + api_id, + &api_entry, + api_group, + ) + .await?; Ok(output_ok) })() .await, @@ -12905,7 +12618,7 @@ fn wire__crate__api__api__sync_now_impl( }, ) } -fn wire__crate__api__api__sync_passwords_impl( +fn wire__crate__api__api__save_password_impl( port_: flutter_rust_bridge::for_generated::MessagePort, ptr_: flutter_rust_bridge::for_generated::PlatformGeneralizedUint8ListPtr, rust_vec_len_: i32, @@ -12913,7 +12626,7 @@ fn wire__crate__api__api__sync_passwords_impl( ) { FLUTTER_RUST_BRIDGE_HANDLER.wrap_async::( flutter_rust_bridge::for_generated::TaskInfo { - debug_name: "sync_passwords", + debug_name: "save_password", port: Some(port_), mode: flutter_rust_bridge::for_generated::FfiCallMode::Normal, }, @@ -12932,27 +12645,21 @@ fn wire__crate__api__api__sync_passwords_impl( Arc>, >, >>::sse_decode(&mut deserializer); - let api_conn = , - >>::sse_decode(&mut deserializer); + let api_id = ::sse_decode(&mut deserializer); + let api_entry = ::sse_decode(&mut deserializer); + let api_group = >::sse_decode(&mut deserializer); deserializer.end(); move |context| async move { transform_result_sse::<_, flutter_rust_bridge::for_generated::anyhow::Error>( (move || async move { let mut api_passwords_guard = None; - let mut api_conn_guard = None; let decode_indices_ = flutter_rust_bridge::for_generated::lockable_compute_decode_order( - vec![ - flutter_rust_bridge::for_generated::LockableOrderInfo::new( - &api_passwords, - 0, - false, - ), - flutter_rust_bridge::for_generated::LockableOrderInfo::new( - &api_conn, 1, false, - ), - ], + vec![flutter_rust_bridge::for_generated::LockableOrderInfo::new( + &api_passwords, + 0, + false, + )], ); for i in decode_indices_ { match i { @@ -12960,18 +12667,15 @@ fn wire__crate__api__api__sync_passwords_impl( api_passwords_guard = Some(api_passwords.lockable_decode_async_ref().await) } - 1 => { - api_conn_guard = - Some(api_conn.lockable_decode_async_ref().await) - } _ => unreachable!(), } } let api_passwords_guard = api_passwords_guard.unwrap(); - let api_conn_guard = api_conn_guard.unwrap(); - let output_ok = crate::api::api::sync_passwords( + let output_ok = crate::api::api::save_password( &*api_passwords_guard, - &*api_conn_guard, + api_id, + &api_entry, + api_group, ) .await?; Ok(output_ok) @@ -12982,7 +12686,7 @@ fn wire__crate__api__api__sync_passwords_impl( }, ) } -fn wire__crate__api__api__sync_wifi_passwords_impl( +fn wire__crate__api__api__save_password_meta_impl( port_: flutter_rust_bridge::for_generated::MessagePort, ptr_: flutter_rust_bridge::for_generated::PlatformGeneralizedUint8ListPtr, rust_vec_len_: i32, @@ -12990,7 +12694,7 @@ fn wire__crate__api__api__sync_wifi_passwords_impl( ) { FLUTTER_RUST_BRIDGE_HANDLER.wrap_async::( flutter_rust_bridge::for_generated::TaskInfo { - debug_name: "sync_wifi_passwords", + debug_name: "save_password_meta", port: Some(port_), mode: flutter_rust_bridge::for_generated::FfiCallMode::Normal, }, @@ -13004,21 +12708,23 @@ fn wire__crate__api__api__sync_wifi_passwords_impl( }; let mut deserializer = flutter_rust_bridge::for_generated::SseDeserializer::new(message); - let api_manager = >, >, >>::sse_decode(&mut deserializer); - let api_user_approve = ::sse_decode(&mut deserializer); + let api_id = ::sse_decode(&mut deserializer); + let api_entry = ::sse_decode(&mut deserializer); + let api_group = >::sse_decode(&mut deserializer); deserializer.end(); move |context| async move { - transform_result_sse::<_, ()>( + transform_result_sse::<_, flutter_rust_bridge::for_generated::anyhow::Error>( (move || async move { - let mut api_manager_guard = None; + let mut api_passwords_guard = None; let decode_indices_ = flutter_rust_bridge::for_generated::lockable_compute_decode_order( vec![flutter_rust_bridge::for_generated::LockableOrderInfo::new( - &api_manager, + &api_passwords, 0, false, )], @@ -13026,20 +12732,20 @@ fn wire__crate__api__api__sync_wifi_passwords_impl( for i in decode_indices_ { match i { 0 => { - api_manager_guard = - Some(api_manager.lockable_decode_async_ref().await) + api_passwords_guard = + Some(api_passwords.lockable_decode_async_ref().await) } _ => unreachable!(), } } - let api_manager_guard = api_manager_guard.unwrap(); - let output_ok = Result::<_, ()>::Ok({ - crate::api::api::sync_wifi_passwords( - &*api_manager_guard, - api_user_approve, - ) - .await; - })?; + let api_passwords_guard = api_passwords_guard.unwrap(); + let output_ok = crate::api::api::save_password_meta( + &*api_passwords_guard, + api_id, + &api_entry, + api_group, + ) + .await?; Ok(output_ok) })() .await, @@ -13048,46 +12754,15 @@ fn wire__crate__api__api__sync_wifi_passwords_impl( }, ) } -fn wire__crate__api__api__systemtime_to_millis_impl( - ptr_: flutter_rust_bridge::for_generated::PlatformGeneralizedUint8ListPtr, - rust_vec_len_: i32, - data_len_: i32, -) -> flutter_rust_bridge::for_generated::WireSyncRust2DartSse { - FLUTTER_RUST_BRIDGE_HANDLER.wrap_sync::( - flutter_rust_bridge::for_generated::TaskInfo { - debug_name: "systemtime_to_millis", - port: None, - mode: flutter_rust_bridge::for_generated::FfiCallMode::Sync, - }, - move || { - let message = unsafe { - flutter_rust_bridge::for_generated::Dart2RustMessageSse::from_wire( - ptr_, - rust_vec_len_, - data_len_, - ) - }; - let mut deserializer = - flutter_rust_bridge::for_generated::SseDeserializer::new(message); - let api_time = ::sse_decode(&mut deserializer); - deserializer.end(); - transform_result_sse::<_, ()>((move || { - let output_ok = - Result::<_, ()>::Ok(crate::api::api::systemtime_to_millis(api_time))?; - Ok(output_ok) - })()) - }, - ) -} -fn wire__crate__api__api__teardown_2fa_impl( +fn wire__crate__api__api__save_user_impl( port_: flutter_rust_bridge::for_generated::MessagePort, ptr_: flutter_rust_bridge::for_generated::PlatformGeneralizedUint8ListPtr, rust_vec_len_: i32, data_len_: i32, ) { - FLUTTER_RUST_BRIDGE_HANDLER.wrap_async::( + FLUTTER_RUST_BRIDGE_HANDLER.wrap_normal::( flutter_rust_bridge::for_generated::TaskInfo { - debug_name: "teardown_2fa", + debug_name: "save_user", port: Some(port_), mode: flutter_rust_bridge::for_generated::FfiCallMode::Normal, }, @@ -13101,59 +12776,77 @@ fn wire__crate__api__api__teardown_2fa_impl( }; let mut deserializer = flutter_rust_bridge::for_generated::SseDeserializer::new(message); - let api_account = >>, - >, + let api_user = , >>::sse_decode(&mut deserializer); - let api_action = ::sse_decode(&mut deserializer); - let api_txnid = ::sse_decode(&mut deserializer); deserializer.end(); - move |context| async move { + move |context| { transform_result_sse::<_, flutter_rust_bridge::for_generated::anyhow::Error>( - (move || async move { - let mut api_account_guard = None; + (move || { + let mut api_user_guard = None; let decode_indices_ = flutter_rust_bridge::for_generated::lockable_compute_decode_order( vec![flutter_rust_bridge::for_generated::LockableOrderInfo::new( - &api_account, - 0, - false, + &api_user, 0, false, )], ); for i in decode_indices_ { match i { - 0 => { - api_account_guard = - Some(api_account.lockable_decode_async_ref().await) - } + 0 => api_user_guard = Some(api_user.lockable_decode_sync_ref()), _ => unreachable!(), } } - let api_account_guard = api_account_guard.unwrap(); - let output_ok = crate::api::api::teardown_2fa( - &*api_account_guard, - api_action, - api_txnid, - ) - .await?; + let api_user_guard = api_user_guard.unwrap(); + let output_ok = crate::api::api::save_user(&*api_user_guard)?; Ok(output_ok) - })() - .await, + })(), ) } }, ) } -fn wire__crate__api__api__transcript_poster_save_impl( +fn wire__crate__api__api__save_users_impl( + ptr_: flutter_rust_bridge::for_generated::PlatformGeneralizedUint8ListPtr, + rust_vec_len_: i32, + data_len_: i32, +) -> flutter_rust_bridge::for_generated::WireSyncRust2DartSse { + FLUTTER_RUST_BRIDGE_HANDLER.wrap_sync::( + flutter_rust_bridge::for_generated::TaskInfo { + debug_name: "save_users", + port: None, + mode: flutter_rust_bridge::for_generated::FfiCallMode::Sync, + }, + move || { + let message = unsafe { + flutter_rust_bridge::for_generated::Dart2RustMessageSse::from_wire( + ptr_, + rust_vec_len_, + data_len_, + ) + }; + let mut deserializer = + flutter_rust_bridge::for_generated::SseDeserializer::new(message); + let api_users = >::sse_decode(&mut deserializer); + let api_path = ::sse_decode(&mut deserializer); + deserializer.end(); + transform_result_sse::<_, ()>((move || { + let output_ok = Result::<_, ()>::Ok({ + crate::api::api::save_users(&api_users, api_path); + })?; + Ok(output_ok) + })()) + }, + ) +} +fn wire__crate__api__api__save_wifi_password_impl( port_: flutter_rust_bridge::for_generated::MessagePort, ptr_: flutter_rust_bridge::for_generated::PlatformGeneralizedUint8ListPtr, rust_vec_len_: i32, data_len_: i32, ) { - FLUTTER_RUST_BRIDGE_HANDLER.wrap_normal::( + FLUTTER_RUST_BRIDGE_HANDLER.wrap_async::( flutter_rust_bridge::for_generated::TaskInfo { - debug_name: "transcript_poster_save", + debug_name: "save_wifi_password", port: Some(port_), mode: flutter_rust_bridge::for_generated::FfiCallMode::Normal, }, @@ -13167,21 +12860,53 @@ fn wire__crate__api__api__transcript_poster_save_impl( }; let mut deserializer = flutter_rust_bridge::for_generated::SseDeserializer::new(message); - let api_poster = - ::sse_decode(&mut deserializer); + let api_passwords = >, + >, + >>::sse_decode(&mut deserializer); + let api_id = ::sse_decode(&mut deserializer); + let api_entry = ::sse_decode(&mut deserializer); + let api_group = >::sse_decode(&mut deserializer); deserializer.end(); - move |context| { + move |context| async move { transform_result_sse::<_, flutter_rust_bridge::for_generated::anyhow::Error>( - (move || { - let output_ok = crate::api::api::transcript_poster_save(api_poster)?; + (move || async move { + let mut api_passwords_guard = None; + let decode_indices_ = + flutter_rust_bridge::for_generated::lockable_compute_decode_order( + vec![flutter_rust_bridge::for_generated::LockableOrderInfo::new( + &api_passwords, + 0, + false, + )], + ); + for i in decode_indices_ { + match i { + 0 => { + api_passwords_guard = + Some(api_passwords.lockable_decode_async_ref().await) + } + _ => unreachable!(), + } + } + let api_passwords_guard = api_passwords_guard.unwrap(); + let output_ok = crate::api::api::save_wifi_password( + &*api_passwords_guard, + api_id, + &api_entry, + api_group, + ) + .await?; Ok(output_ok) - })(), + })() + .await, ) } }, ) } -fn wire__crate__api__api__try_auth_impl( +fn wire__crate__api__api__select_background_friend_impl( port_: flutter_rust_bridge::for_generated::MessagePort, ptr_: flutter_rust_bridge::for_generated::PlatformGeneralizedUint8ListPtr, rust_vec_len_: i32, @@ -13189,7 +12914,7 @@ fn wire__crate__api__api__try_auth_impl( ) { FLUTTER_RUST_BRIDGE_HANDLER.wrap_async::( flutter_rust_bridge::for_generated::TaskInfo { - debug_name: "try_auth", + debug_name: "select_background_friend", port: Some(port_), mode: flutter_rust_bridge::for_generated::FfiCallMode::Normal, }, @@ -13203,70 +12928,36 @@ fn wire__crate__api__api__try_auth_impl( }; let mut deserializer = flutter_rust_bridge::for_generated::SseDeserializer::new(message); - let api_path = ::sse_decode(&mut deserializer); - let api_conf = , - >>::sse_decode(&mut deserializer); - let api_conn = , - >>::sse_decode(&mut deserializer); - let api_anisette = , + Arc>, >, >>::sse_decode(&mut deserializer); - let api_creds = >::sse_decode(&mut deserializer); + let api_friend = >::sse_decode(&mut deserializer); deserializer.end(); move |context| async move { transform_result_sse::<_, flutter_rust_bridge::for_generated::anyhow::Error>( (move || async move { - let mut api_conf_guard = None; - let mut api_conn_guard = None; - let mut api_anisette_guard = None; + let mut api_fmfd_guard = None; let decode_indices_ = flutter_rust_bridge::for_generated::lockable_compute_decode_order( - vec![ - flutter_rust_bridge::for_generated::LockableOrderInfo::new( - &api_conf, 0, false, - ), - flutter_rust_bridge::for_generated::LockableOrderInfo::new( - &api_conn, 1, false, - ), - flutter_rust_bridge::for_generated::LockableOrderInfo::new( - &api_anisette, - 2, - false, - ), - ], + vec![flutter_rust_bridge::for_generated::LockableOrderInfo::new( + &api_fmfd, 0, false, + )], ); for i in decode_indices_ { match i { 0 => { - api_conf_guard = - Some(api_conf.lockable_decode_async_ref().await) - } - 1 => { - api_conn_guard = - Some(api_conn.lockable_decode_async_ref().await) - } - 2 => { - api_anisette_guard = - Some(api_anisette.lockable_decode_async_ref().await) + api_fmfd_guard = + Some(api_fmfd.lockable_decode_async_ref().await) } _ => unreachable!(), } } - let api_conf_guard = api_conf_guard.unwrap(); - let api_conn_guard = api_conn_guard.unwrap(); - let api_anisette_guard = api_anisette_guard.unwrap(); - let output_ok = crate::api::api::try_auth( - api_path, - &*api_conf_guard, - &*api_conn_guard, - &*api_anisette_guard, - api_creds, - ) - .await?; + let api_fmfd_guard = api_fmfd_guard.unwrap(); + let output_ok = + crate::api::api::select_background_friend(&*api_fmfd_guard, api_friend) + .await?; Ok(output_ok) })() .await, @@ -13275,7 +12966,7 @@ fn wire__crate__api__api__try_auth_impl( }, ) } -fn wire__crate__api__api__try_icloud_login_impl( +fn wire__crate__api__api__select_friend_impl( port_: flutter_rust_bridge::for_generated::MessagePort, ptr_: flutter_rust_bridge::for_generated::PlatformGeneralizedUint8ListPtr, rust_vec_len_: i32, @@ -13283,7 +12974,7 @@ fn wire__crate__api__api__try_icloud_login_impl( ) { FLUTTER_RUST_BRIDGE_HANDLER.wrap_async::( flutter_rust_bridge::for_generated::TaskInfo { - debug_name: "try_icloud_login", + debug_name: "select_friend", port: Some(port_), mode: flutter_rust_bridge::for_generated::FfiCallMode::Normal, }, @@ -13297,53 +12988,55 @@ fn wire__crate__api__api__try_icloud_login_impl( }; let mut deserializer = flutter_rust_bridge::for_generated::SseDeserializer::new(message); - let api_path = ::sse_decode(&mut deserializer); - let api_conf = , >>::sse_decode(&mut deserializer); - let api_account = >>, + FindMyFriendsClient, >, >>::sse_decode(&mut deserializer); + let api_friend = >::sse_decode(&mut deserializer); deserializer.end(); move |context| async move { transform_result_sse::<_, flutter_rust_bridge::for_generated::anyhow::Error>( (move || async move { - let mut api_conf_guard = None; - let mut api_account_guard = None; + let mut api_config_guard = None; + let mut api_client_guard = None; let decode_indices_ = flutter_rust_bridge::for_generated::lockable_compute_decode_order( vec![ flutter_rust_bridge::for_generated::LockableOrderInfo::new( - &api_conf, 0, false, + &api_config, + 0, + false, ), flutter_rust_bridge::for_generated::LockableOrderInfo::new( - &api_account, + &api_client, 1, - false, + true, ), ], ); for i in decode_indices_ { match i { 0 => { - api_conf_guard = - Some(api_conf.lockable_decode_async_ref().await) + api_config_guard = + Some(api_config.lockable_decode_async_ref().await) } 1 => { - api_account_guard = - Some(api_account.lockable_decode_async_ref().await) + api_client_guard = + Some(api_client.lockable_decode_async_ref_mut().await) } _ => unreachable!(), } } - let api_conf_guard = api_conf_guard.unwrap(); - let api_account_guard = api_account_guard.unwrap(); - let output_ok = crate::api::api::try_icloud_login( - api_path, - &*api_conf_guard, - &*api_account_guard, + let api_config_guard = api_config_guard.unwrap(); + let mut api_client_guard = api_client_guard.unwrap(); + let output_ok = crate::api::api::select_friend( + &*api_config_guard, + &mut *api_client_guard, + api_friend, ) .await?; Ok(output_ok) @@ -13354,7 +13047,7 @@ fn wire__crate__api__api__try_icloud_login_impl( }, ) } -fn wire__crate__api__api__unsubscribe_impl( +fn wire__crate__api__api__send_impl( port_: flutter_rust_bridge::for_generated::MessagePort, ptr_: flutter_rust_bridge::for_generated::PlatformGeneralizedUint8ListPtr, rust_vec_len_: i32, @@ -13362,7 +13055,7 @@ fn wire__crate__api__api__unsubscribe_impl( ) { FLUTTER_RUST_BRIDGE_HANDLER.wrap_async::( flutter_rust_bridge::for_generated::TaskInfo { - debug_name: "unsubscribe", + debug_name: "send", port: Some(port_), mode: flutter_rust_bridge::for_generated::FfiCallMode::Normal, }, @@ -13376,35 +13069,48 @@ fn wire__crate__api__api__unsubscribe_impl( }; let mut deserializer = flutter_rust_bridge::for_generated::SseDeserializer::new(message); - let api_lock = , - >, + let api_state = >, >>::sse_decode(&mut deserializer); - let api_guid = ::sse_decode(&mut deserializer); + let api_local = >>, + >>::sse_decode(&mut deserializer); + let api_msg = ::sse_decode(&mut deserializer); deserializer.end(); move |context| async move { transform_result_sse::<_, flutter_rust_bridge::for_generated::anyhow::Error>( (move || async move { - let mut api_lock_guard = None; + let mut api_state_guard = None; + let mut api_local_guard = None; let decode_indices_ = flutter_rust_bridge::for_generated::lockable_compute_decode_order( - vec![flutter_rust_bridge::for_generated::LockableOrderInfo::new( - &api_lock, 0, false, - )], + vec![ + flutter_rust_bridge::for_generated::LockableOrderInfo::new( + &api_state, 0, false, + ), + flutter_rust_bridge::for_generated::LockableOrderInfo::new( + &api_local, 1, false, + ), + ], ); for i in decode_indices_ { match i { 0 => { - api_lock_guard = - Some(api_lock.lockable_decode_async_ref().await) + api_state_guard = + Some(api_state.lockable_decode_async_ref().await) + } + 1 => { + api_local_guard = + Some(api_local.lockable_decode_async_ref().await) } _ => unreachable!(), } } - let api_lock_guard = api_lock_guard.unwrap(); + let api_state_guard = api_state_guard.unwrap(); + let api_local_guard = api_local_guard.unwrap(); let output_ok = - crate::api::api::unsubscribe(&*api_lock_guard, api_guid).await?; + crate::api::api::send(&*api_state_guard, &*api_local_guard, api_msg) + .await?; Ok(output_ok) })() .await, @@ -13413,7 +13119,7 @@ fn wire__crate__api__api__unsubscribe_impl( }, ) } -fn wire__crate__api__api__update_account_headers_impl( +fn wire__crate__api__api__send_2fa_sms_impl( port_: flutter_rust_bridge::for_generated::MessagePort, ptr_: flutter_rust_bridge::for_generated::PlatformGeneralizedUint8ListPtr, rust_vec_len_: i32, @@ -13421,7 +13127,7 @@ fn wire__crate__api__api__update_account_headers_impl( ) { FLUTTER_RUST_BRIDGE_HANDLER.wrap_async::( flutter_rust_bridge::for_generated::TaskInfo { - debug_name: "update_account_headers", + debug_name: "send_2fa_sms", port: Some(port_), mode: flutter_rust_bridge::for_generated::FfiCallMode::Normal, }, @@ -13435,34 +13141,27 @@ fn wire__crate__api__api__update_account_headers_impl( }; let mut deserializer = flutter_rust_bridge::for_generated::SseDeserializer::new(message); + let api_locked = >>::sse_decode( + &mut deserializer, + ); let api_account = >>, >, >>::sse_decode(&mut deserializer); - let api_config = , - >>::sse_decode(&mut deserializer); + let api_phone_id = ::sse_decode(&mut deserializer); deserializer.end(); move |context| async move { transform_result_sse::<_, flutter_rust_bridge::for_generated::anyhow::Error>( (move || async move { let mut api_account_guard = None; - let mut api_config_guard = None; let decode_indices_ = flutter_rust_bridge::for_generated::lockable_compute_decode_order( - vec![ - flutter_rust_bridge::for_generated::LockableOrderInfo::new( - &api_account, - 0, - false, - ), - flutter_rust_bridge::for_generated::LockableOrderInfo::new( - &api_config, - 1, - false, - ), - ], + vec![flutter_rust_bridge::for_generated::LockableOrderInfo::new( + &api_account, + 0, + false, + )], ); for i in decode_indices_ { match i { @@ -13470,18 +13169,14 @@ fn wire__crate__api__api__update_account_headers_impl( api_account_guard = Some(api_account.lockable_decode_async_ref().await) } - 1 => { - api_config_guard = - Some(api_config.lockable_decode_async_ref().await) - } _ => unreachable!(), } } let api_account_guard = api_account_guard.unwrap(); - let api_config_guard = api_config_guard.unwrap(); - let output_ok = crate::api::api::update_account_headers( + let output_ok = crate::api::api::send_2fa_sms( + api_locked, &*api_account_guard, - &*api_config_guard, + api_phone_id, ) .await?; Ok(output_ok) @@ -13492,7 +13187,7 @@ fn wire__crate__api__api__update_account_headers_impl( }, ) } -fn wire__crate__api__api__update_beacon_name_impl( +fn wire__crate__api__api__send_2fa_to_devices_impl( port_: flutter_rust_bridge::for_generated::MessagePort, ptr_: flutter_rust_bridge::for_generated::PlatformGeneralizedUint8ListPtr, rust_vec_len_: i32, @@ -13500,7 +13195,7 @@ fn wire__crate__api__api__update_beacon_name_impl( ) { FLUTTER_RUST_BRIDGE_HANDLER.wrap_async::( flutter_rust_bridge::for_generated::TaskInfo { - debug_name: "update_beacon_name", + debug_name: "send_2fa_to_devices", port: Some(port_), mode: flutter_rust_bridge::for_generated::FfiCallMode::Normal, }, @@ -13514,37 +13209,49 @@ fn wire__crate__api__api__update_beacon_name_impl( }; let mut deserializer = flutter_rust_bridge::for_generated::SseDeserializer::new(message); - let api_items = >, + Arc>>, >, >>::sse_decode(&mut deserializer); - let api_naming_record = - ::sse_decode(&mut deserializer); + let api_conn = , + >>::sse_decode(&mut deserializer); deserializer.end(); move |context| async move { transform_result_sse::<_, flutter_rust_bridge::for_generated::anyhow::Error>( (move || async move { - let mut api_items_guard = None; + let mut api_state_guard = None; + let mut api_conn_guard = None; let decode_indices_ = flutter_rust_bridge::for_generated::lockable_compute_decode_order( - vec![flutter_rust_bridge::for_generated::LockableOrderInfo::new( - &api_items, 0, false, - )], + vec![ + flutter_rust_bridge::for_generated::LockableOrderInfo::new( + &api_state, 0, false, + ), + flutter_rust_bridge::for_generated::LockableOrderInfo::new( + &api_conn, 1, false, + ), + ], ); for i in decode_indices_ { match i { 0 => { - api_items_guard = - Some(api_items.lockable_decode_async_ref().await) + api_state_guard = + Some(api_state.lockable_decode_async_ref().await) + } + 1 => { + api_conn_guard = + Some(api_conn.lockable_decode_async_ref().await) } _ => unreachable!(), } } - let api_items_guard = api_items_guard.unwrap(); - let output_ok = crate::api::api::update_beacon_name( - &*api_items_guard, - &api_naming_record, + let api_state_guard = api_state_guard.unwrap(); + let api_conn_guard = api_conn_guard.unwrap(); + let output_ok = crate::api::api::send_2fa_to_devices( + &*api_state_guard, + &*api_conn_guard, ) .await?; Ok(output_ok) @@ -13555,7 +13262,73 @@ fn wire__crate__api__api__update_beacon_name_impl( }, ) } -fn wire__crate__api__api__upload_attachment_impl( +fn wire__crate__api__api__send_daemon_impl( + ptr_: flutter_rust_bridge::for_generated::PlatformGeneralizedUint8ListPtr, + rust_vec_len_: i32, + data_len_: i32, +) -> flutter_rust_bridge::for_generated::WireSyncRust2DartSse { + FLUTTER_RUST_BRIDGE_HANDLER.wrap_sync::( + flutter_rust_bridge::for_generated::TaskInfo { + debug_name: "send_daemon", + port: None, + mode: flutter_rust_bridge::for_generated::FfiCallMode::Sync, + }, + move || { + let message = unsafe { + flutter_rust_bridge::for_generated::Dart2RustMessageSse::from_wire( + ptr_, + rust_vec_len_, + data_len_, + ) + }; + let mut deserializer = + flutter_rust_bridge::for_generated::SseDeserializer::new(message); + let api_state = ::sse_decode(&mut deserializer); + let api_watcher = ::sse_decode(&mut deserializer); + deserializer.end(); + transform_result_sse::<_, ()>((move || { + let output_ok = + Result::<_, ()>::Ok(crate::api::api::send_daemon(api_state, api_watcher))?; + Ok(output_ok) + })()) + }, + ) +} +fn wire__crate__api__api__service_from_ptr_impl( + port_: flutter_rust_bridge::for_generated::MessagePort, + ptr_: flutter_rust_bridge::for_generated::PlatformGeneralizedUint8ListPtr, + rust_vec_len_: i32, + data_len_: i32, +) { + FLUTTER_RUST_BRIDGE_HANDLER.wrap_normal::( + flutter_rust_bridge::for_generated::TaskInfo { + debug_name: "service_from_ptr", + port: Some(port_), + mode: flutter_rust_bridge::for_generated::FfiCallMode::Normal, + }, + move || { + let message = unsafe { + flutter_rust_bridge::for_generated::Dart2RustMessageSse::from_wire( + ptr_, + rust_vec_len_, + data_len_, + ) + }; + let mut deserializer = + flutter_rust_bridge::for_generated::SseDeserializer::new(message); + let api_ptr = ::sse_decode(&mut deserializer); + deserializer.end(); + move |context| { + transform_result_sse::<_, ()>((move || { + let output_ok = + Result::<_, ()>::Ok(crate::api::api::service_from_ptr(api_ptr))?; + Ok(output_ok) + })()) + } + }, + ) +} +fn wire__crate__api__api__set_identity_impl( port_: flutter_rust_bridge::for_generated::MessagePort, ptr_: flutter_rust_bridge::for_generated::PlatformGeneralizedUint8ListPtr, rust_vec_len_: i32, @@ -13563,7 +13336,7 @@ fn wire__crate__api__api__upload_attachment_impl( ) { FLUTTER_RUST_BRIDGE_HANDLER.wrap_async::( flutter_rust_bridge::for_generated::TaskInfo { - debug_name: "upload_attachment", + debug_name: "set_identity", port: Some(port_), mode: flutter_rust_bridge::for_generated::FfiCallMode::Normal, }, @@ -13577,45 +13350,54 @@ fn wire__crate__api__api__upload_attachment_impl( }; let mut deserializer = flutter_rust_bridge::for_generated::SseDeserializer::new(message); - let api_sink = ::sse_decode(&mut deserializer); + let api_config = , >>::sse_decode(&mut deserializer); - let api_aps = , + let api_identity = , >>::sse_decode(&mut deserializer); - let api_path = ::sse_decode(&mut deserializer); - let api_mime = ::sse_decode(&mut deserializer); - let api_uti = ::sse_decode(&mut deserializer); - let api_name = ::sse_decode(&mut deserializer); deserializer.end(); move |context| async move { transform_result_sse::<_, ()>( (move || async move { - let mut api_aps_guard = None; + let mut api_config_guard = None; + let mut api_identity_guard = None; let decode_indices_ = flutter_rust_bridge::for_generated::lockable_compute_decode_order( - vec![flutter_rust_bridge::for_generated::LockableOrderInfo::new( - &api_aps, 0, false, - )], + vec![ + flutter_rust_bridge::for_generated::LockableOrderInfo::new( + &api_config, + 0, + false, + ), + flutter_rust_bridge::for_generated::LockableOrderInfo::new( + &api_identity, + 1, + false, + ), + ], ); for i in decode_indices_ { match i { 0 => { - api_aps_guard = Some(api_aps.lockable_decode_async_ref().await) + api_config_guard = + Some(api_config.lockable_decode_async_ref().await) + } + 1 => { + api_identity_guard = + Some(api_identity.lockable_decode_async_ref().await) } _ => unreachable!(), } } - let api_aps_guard = api_aps_guard.unwrap(); + let api_config_guard = api_config_guard.unwrap(); + let api_identity_guard = api_identity_guard.unwrap(); let output_ok = Result::<_, ()>::Ok({ - crate::api::api::upload_attachment( - api_sink, - &*api_aps_guard, - api_path, - api_mime, - api_uti, - api_name, + crate::api::api::set_identity( + api_state_path, + &*api_config_guard, + &*api_identity_guard, ) .await; })?; @@ -13627,7 +13409,7 @@ fn wire__crate__api__api__upload_attachment_impl( }, ) } -fn wire__crate__api__api__upload_cloud_attachments_impl( +fn wire__crate__api__api__set_profile_impl( port_: flutter_rust_bridge::for_generated::MessagePort, ptr_: flutter_rust_bridge::for_generated::PlatformGeneralizedUint8ListPtr, rust_vec_len_: i32, @@ -13635,7 +13417,7 @@ fn wire__crate__api__api__upload_cloud_attachments_impl( ) { FLUTTER_RUST_BRIDGE_HANDLER.wrap_async::( flutter_rust_bridge::for_generated::TaskInfo { - debug_name: "upload_cloud_attachments", + debug_name: "set_profile", port: Some(port_), mode: flutter_rust_bridge::for_generated::FfiCallMode::Normal, }, @@ -13649,21 +13431,24 @@ fn wire__crate__api__api__upload_cloud_attachments_impl( }; let mut deserializer = flutter_rust_bridge::for_generated::SseDeserializer::new(message); - let api_cloud_messages_client = >, + Arc>, >, >>::sse_decode(&mut deserializer); - let api_files = >::sse_decode(&mut deserializer); + let api_record = + ::sse_decode(&mut deserializer); + let api_existing = + >::sse_decode(&mut deserializer); deserializer.end(); move |context| async move { transform_result_sse::<_, flutter_rust_bridge::for_generated::anyhow::Error>( (move || async move { - let mut api_cloud_messages_client_guard = None; + let mut api_profiles_guard = None; let decode_indices_ = flutter_rust_bridge::for_generated::lockable_compute_decode_order( vec![flutter_rust_bridge::for_generated::LockableOrderInfo::new( - &api_cloud_messages_client, + &api_profiles, 0, false, )], @@ -13671,18 +13456,17 @@ fn wire__crate__api__api__upload_cloud_attachments_impl( for i in decode_indices_ { match i { 0 => { - api_cloud_messages_client_guard = Some( - api_cloud_messages_client.lockable_decode_async_ref().await, - ) + api_profiles_guard = + Some(api_profiles.lockable_decode_async_ref().await) } _ => unreachable!(), } } - let api_cloud_messages_client_guard = - api_cloud_messages_client_guard.unwrap(); - let output_ok = crate::api::api::upload_cloud_attachments( - &*api_cloud_messages_client_guard, - api_files, + let api_profiles_guard = api_profiles_guard.unwrap(); + let output_ok = crate::api::api::set_profile( + &*api_profiles_guard, + api_record, + api_existing, ) .await?; Ok(output_ok) @@ -13693,7 +13477,7 @@ fn wire__crate__api__api__upload_cloud_attachments_impl( }, ) } -fn wire__crate__api__api__upload_group_photo_impl( +fn wire__crate__api__api__set_status_impl( port_: flutter_rust_bridge::for_generated::MessagePort, ptr_: flutter_rust_bridge::for_generated::PlatformGeneralizedUint8ListPtr, rust_vec_len_: i32, @@ -13701,7 +13485,7 @@ fn wire__crate__api__api__upload_group_photo_impl( ) { FLUTTER_RUST_BRIDGE_HANDLER.wrap_async::( flutter_rust_bridge::for_generated::TaskInfo { - debug_name: "upload_group_photo", + debug_name: "set_status", port: Some(port_), mode: flutter_rust_bridge::for_generated::FfiCallMode::Normal, }, @@ -13715,21 +13499,21 @@ fn wire__crate__api__api__upload_group_photo_impl( }; let mut deserializer = flutter_rust_bridge::for_generated::SseDeserializer::new(message); - let api_cloud_messages_client = >, + Arc>, >, >>::sse_decode(&mut deserializer); - let api_files = >::sse_decode(&mut deserializer); + let api_new_status = >::sse_decode(&mut deserializer); deserializer.end(); move |context| async move { transform_result_sse::<_, flutter_rust_bridge::for_generated::anyhow::Error>( (move || async move { - let mut api_cloud_messages_client_guard = None; + let mut api_status_guard = None; let decode_indices_ = flutter_rust_bridge::for_generated::lockable_compute_decode_order( vec![flutter_rust_bridge::for_generated::LockableOrderInfo::new( - &api_cloud_messages_client, + &api_status, 0, false, )], @@ -13737,20 +13521,15 @@ fn wire__crate__api__api__upload_group_photo_impl( for i in decode_indices_ { match i { 0 => { - api_cloud_messages_client_guard = Some( - api_cloud_messages_client.lockable_decode_async_ref().await, - ) + api_status_guard = + Some(api_status.lockable_decode_async_ref().await) } _ => unreachable!(), } } - let api_cloud_messages_client_guard = - api_cloud_messages_client_guard.unwrap(); - let output_ok = crate::api::api::upload_group_photo( - &*api_cloud_messages_client_guard, - api_files, - ) - .await?; + let api_status_guard = api_status_guard.unwrap(); + let output_ok = + crate::api::api::set_status(&*api_status_guard, api_new_status).await?; Ok(output_ok) })() .await, @@ -13759,7 +13538,7 @@ fn wire__crate__api__api__upload_group_photo_impl( }, ) } -fn wire__crate__api__api__upload_mmcs_impl( +fn wire__crate__api__api__setup_push_impl( port_: flutter_rust_bridge::for_generated::MessagePort, ptr_: flutter_rust_bridge::for_generated::PlatformGeneralizedUint8ListPtr, rust_vec_len_: i32, @@ -13767,7 +13546,7 @@ fn wire__crate__api__api__upload_mmcs_impl( ) { FLUTTER_RUST_BRIDGE_HANDLER.wrap_async::( flutter_rust_bridge::for_generated::TaskInfo { - debug_name: "upload_mmcs", + debug_name: "setup_push", port: Some(port_), mode: flutter_rust_bridge::for_generated::FfiCallMode::Normal, }, @@ -13781,37 +13560,59 @@ fn wire__crate__api__api__upload_mmcs_impl( }; let mut deserializer = flutter_rust_bridge::for_generated::SseDeserializer::new(message); - let api_sink = , >>::sse_decode(&mut deserializer); - let api_aps = , + let api_identity = , >>::sse_decode(&mut deserializer); - let api_path = ::sse_decode(&mut deserializer); + let api_state = >::sse_decode(&mut deserializer); + let api_state_path = ::sse_decode(&mut deserializer); deserializer.end(); move |context| async move { transform_result_sse::<_, ()>( (move || async move { - let mut api_aps_guard = None; + let mut api_config_guard = None; + let mut api_identity_guard = None; let decode_indices_ = flutter_rust_bridge::for_generated::lockable_compute_decode_order( - vec![flutter_rust_bridge::for_generated::LockableOrderInfo::new( - &api_aps, 0, false, - )], + vec![ + flutter_rust_bridge::for_generated::LockableOrderInfo::new( + &api_config, + 0, + false, + ), + flutter_rust_bridge::for_generated::LockableOrderInfo::new( + &api_identity, + 1, + false, + ), + ], ); for i in decode_indices_ { match i { 0 => { - api_aps_guard = Some(api_aps.lockable_decode_async_ref().await) + api_config_guard = + Some(api_config.lockable_decode_async_ref().await) + } + 1 => { + api_identity_guard = + Some(api_identity.lockable_decode_async_ref().await) } _ => unreachable!(), } } - let api_aps_guard = api_aps_guard.unwrap(); - let output_ok = Result::<_, ()>::Ok({ - crate::api::api::upload_mmcs(api_sink, &*api_aps_guard, api_path).await; - })?; + let api_config_guard = api_config_guard.unwrap(); + let api_identity_guard = api_identity_guard.unwrap(); + let output_ok = Result::<_, ()>::Ok( + crate::api::api::setup_push( + &*api_config_guard, + &*api_identity_guard, + api_state, + api_state_path, + ) + .await, + )?; Ok(output_ok) })() .await, @@ -13820,7 +13621,7 @@ fn wire__crate__api__api__upload_mmcs_impl( }, ) } -fn wire__crate__api__api__use_link_for_impl( +fn wire__crate__api__api__shared_push_state_restore_impl( port_: flutter_rust_bridge::for_generated::MessagePort, ptr_: flutter_rust_bridge::for_generated::PlatformGeneralizedUint8ListPtr, rust_vec_len_: i32, @@ -13828,7 +13629,7 @@ fn wire__crate__api__api__use_link_for_impl( ) { FLUTTER_RUST_BRIDGE_HANDLER.wrap_async::( flutter_rust_bridge::for_generated::TaskInfo { - debug_name: "use_link_for", + debug_name: "shared_push_state_restore", port: Some(port_), mode: flutter_rust_bridge::for_generated::FfiCallMode::Normal, }, @@ -13842,40 +13643,73 @@ fn wire__crate__api__api__use_link_for_impl( }; let mut deserializer = flutter_rust_bridge::for_generated::SseDeserializer::new(message); - let api_facetime = >, + let api_path = ::sse_decode(&mut deserializer); + deserializer.end(); + move |context| async move { + transform_result_sse::<_, ()>( + (move || async move { + let output_ok = Result::<_, ()>::Ok( + crate::api::api::SharedPushState::restore(api_path).await, + )?; + Ok(output_ok) + })() + .await, + ) + } + }, + ) +} +fn wire__crate__api__api__subscribe_impl( + port_: flutter_rust_bridge::for_generated::MessagePort, + ptr_: flutter_rust_bridge::for_generated::PlatformGeneralizedUint8ListPtr, + rust_vec_len_: i32, + data_len_: i32, +) { + FLUTTER_RUST_BRIDGE_HANDLER.wrap_async::( + flutter_rust_bridge::for_generated::TaskInfo { + debug_name: "subscribe", + port: Some(port_), + mode: flutter_rust_bridge::for_generated::FfiCallMode::Normal, + }, + move || { + let message = unsafe { + flutter_rust_bridge::for_generated::Dart2RustMessageSse::from_wire( + ptr_, + rust_vec_len_, + data_len_, + ) + }; + let mut deserializer = + flutter_rust_bridge::for_generated::SseDeserializer::new(message); + let api_lock = , + >, >>::sse_decode(&mut deserializer); - let api_old_usage = ::sse_decode(&mut deserializer); - let api_usage = ::sse_decode(&mut deserializer); + let api_guid = ::sse_decode(&mut deserializer); deserializer.end(); move |context| async move { transform_result_sse::<_, flutter_rust_bridge::for_generated::anyhow::Error>( (move || async move { - let mut api_facetime_guard = None; + let mut api_lock_guard = None; let decode_indices_ = flutter_rust_bridge::for_generated::lockable_compute_decode_order( vec![flutter_rust_bridge::for_generated::LockableOrderInfo::new( - &api_facetime, - 0, - false, + &api_lock, 0, false, )], ); for i in decode_indices_ { match i { 0 => { - api_facetime_guard = - Some(api_facetime.lockable_decode_async_ref().await) + api_lock_guard = + Some(api_lock.lockable_decode_async_ref().await) } _ => unreachable!(), } } - let api_facetime_guard = api_facetime_guard.unwrap(); - let output_ok = crate::api::api::use_link_for( - &*api_facetime_guard, - api_old_usage, - api_usage, - ) - .await?; + let api_lock_guard = api_lock_guard.unwrap(); + let output_ok = + crate::api::api::subscribe(&*api_lock_guard, api_guid).await?; Ok(output_ok) })() .await, @@ -13884,14 +13718,14 @@ fn wire__crate__api__api__use_link_for_impl( }, ) } -fn wire__crate__api__api__utm_now_impl( +fn wire__crate__api__api__subscribe_conn_impl( ptr_: flutter_rust_bridge::for_generated::PlatformGeneralizedUint8ListPtr, rust_vec_len_: i32, data_len_: i32, ) -> flutter_rust_bridge::for_generated::WireSyncRust2DartSse { FLUTTER_RUST_BRIDGE_HANDLER.wrap_sync::( flutter_rust_bridge::for_generated::TaskInfo { - debug_name: "utm_now", + debug_name: "subscribe_conn", port: None, mode: flutter_rust_bridge::for_generated::FfiCallMode::Sync, }, @@ -13905,15 +13739,33 @@ fn wire__crate__api__api__utm_now_impl( }; let mut deserializer = flutter_rust_bridge::for_generated::SseDeserializer::new(message); + let api_conn = , + >>::sse_decode(&mut deserializer); deserializer.end(); transform_result_sse::<_, ()>((move || { - let output_ok = Result::<_, ()>::Ok(crate::api::api::utm_now())?; + let mut api_conn_guard = None; + let decode_indices_ = + flutter_rust_bridge::for_generated::lockable_compute_decode_order(vec![ + flutter_rust_bridge::for_generated::LockableOrderInfo::new( + &api_conn, 0, false, + ), + ]); + for i in decode_indices_ { + match i { + 0 => api_conn_guard = Some(api_conn.lockable_decode_sync_ref()), + _ => unreachable!(), + } + } + let api_conn_guard = api_conn_guard.unwrap(); + let output_ok = + Result::<_, ()>::Ok(crate::api::api::subscribe_conn(&*api_conn_guard))?; Ok(output_ok) })()) }, ) } -fn wire__crate__api__api__validate_cert_impl( +fn wire__crate__api__api__subscribe_token_impl( port_: flutter_rust_bridge::for_generated::MessagePort, ptr_: flutter_rust_bridge::for_generated::PlatformGeneralizedUint8ListPtr, rust_vec_len_: i32, @@ -13921,7 +13773,7 @@ fn wire__crate__api__api__validate_cert_impl( ) { FLUTTER_RUST_BRIDGE_HANDLER.wrap_async::( flutter_rust_bridge::for_generated::TaskInfo { - debug_name: "validate_cert", + debug_name: "subscribe_token", port: Some(port_), mode: flutter_rust_bridge::for_generated::FfiCallMode::Normal, }, @@ -13935,47 +13787,35 @@ fn wire__crate__api__api__validate_cert_impl( }; let mut deserializer = flutter_rust_bridge::for_generated::SseDeserializer::new(message); - let api_conn = , - >>::sse_decode(&mut deserializer); - let api_user = , + let api_lock = , + >, >>::sse_decode(&mut deserializer); + let api_token = ::sse_decode(&mut deserializer); deserializer.end(); move |context| async move { transform_result_sse::<_, flutter_rust_bridge::for_generated::anyhow::Error>( (move || async move { - let mut api_conn_guard = None; - let mut api_user_guard = None; + let mut api_lock_guard = None; let decode_indices_ = flutter_rust_bridge::for_generated::lockable_compute_decode_order( - vec![ - flutter_rust_bridge::for_generated::LockableOrderInfo::new( - &api_conn, 0, false, - ), - flutter_rust_bridge::for_generated::LockableOrderInfo::new( - &api_user, 1, false, - ), - ], + vec![flutter_rust_bridge::for_generated::LockableOrderInfo::new( + &api_lock, 0, false, + )], ); for i in decode_indices_ { match i { 0 => { - api_conn_guard = - Some(api_conn.lockable_decode_async_ref().await) - } - 1 => { - api_user_guard = - Some(api_user.lockable_decode_async_ref().await) + api_lock_guard = + Some(api_lock.lockable_decode_async_ref().await) } _ => unreachable!(), } } - let api_conn_guard = api_conn_guard.unwrap(); - let api_user_guard = api_user_guard.unwrap(); + let api_lock_guard = api_lock_guard.unwrap(); let output_ok = - crate::api::api::validate_cert(&*api_conn_guard, &*api_user_guard) - .await?; + crate::api::api::subscribe_token(&*api_lock_guard, api_token).await?; Ok(output_ok) })() .await, @@ -13984,7 +13824,7 @@ fn wire__crate__api__api__validate_cert_impl( }, ) } -fn wire__crate__api__api__validate_relay_impl( +fn wire__crate__api__api__sync_attachments_impl( port_: flutter_rust_bridge::for_generated::MessagePort, ptr_: flutter_rust_bridge::for_generated::PlatformGeneralizedUint8ListPtr, rust_vec_len_: i32, @@ -13992,7 +13832,7 @@ fn wire__crate__api__api__validate_relay_impl( ) { FLUTTER_RUST_BRIDGE_HANDLER.wrap_async::( flutter_rust_bridge::for_generated::TaskInfo { - debug_name: "validate_relay", + debug_name: "sync_attachments", port: Some(port_), mode: flutter_rust_bridge::for_generated::FfiCallMode::Normal, }, @@ -14006,18 +13846,21 @@ fn wire__crate__api__api__validate_relay_impl( }; let mut deserializer = flutter_rust_bridge::for_generated::SseDeserializer::new(message); - let api_config_ref = , + let api_cloud_messages_client = >, + >, >>::sse_decode(&mut deserializer); + let api_continuation_token = >>::sse_decode(&mut deserializer); deserializer.end(); move |context| async move { transform_result_sse::<_, flutter_rust_bridge::for_generated::anyhow::Error>( (move || async move { - let mut api_config_ref_guard = None; + let mut api_cloud_messages_client_guard = None; let decode_indices_ = flutter_rust_bridge::for_generated::lockable_compute_decode_order( vec![flutter_rust_bridge::for_generated::LockableOrderInfo::new( - &api_config_ref, + &api_cloud_messages_client, 0, false, )], @@ -14025,15 +13868,20 @@ fn wire__crate__api__api__validate_relay_impl( for i in decode_indices_ { match i { 0 => { - api_config_ref_guard = - Some(api_config_ref.lockable_decode_async_ref().await) + api_cloud_messages_client_guard = Some( + api_cloud_messages_client.lockable_decode_async_ref().await, + ) } _ => unreachable!(), } } - let api_config_ref_guard = api_config_ref_guard.unwrap(); - let output_ok = - crate::api::api::validate_relay(&*api_config_ref_guard).await?; + let api_cloud_messages_client_guard = + api_cloud_messages_client_guard.unwrap(); + let output_ok = crate::api::api::sync_attachments( + &*api_cloud_messages_client_guard, + api_continuation_token, + ) + .await?; Ok(output_ok) })() .await, @@ -14042,7 +13890,7 @@ fn wire__crate__api__api__validate_relay_impl( }, ) } -fn wire__crate__api__api__validate_targets_impl( +fn wire__crate__api__api__sync_chats_impl( port_: flutter_rust_bridge::for_generated::MessagePort, ptr_: flutter_rust_bridge::for_generated::PlatformGeneralizedUint8ListPtr, rust_vec_len_: i32, @@ -14050,7 +13898,7 @@ fn wire__crate__api__api__validate_targets_impl( ) { FLUTTER_RUST_BRIDGE_HANDLER.wrap_async::( flutter_rust_bridge::for_generated::TaskInfo { - debug_name: "validate_targets", + debug_name: "sync_chats", port: Some(port_), mode: flutter_rust_bridge::for_generated::FfiCallMode::Normal, }, @@ -14064,36 +13912,40 @@ fn wire__crate__api__api__validate_targets_impl( }; let mut deserializer = flutter_rust_bridge::for_generated::SseDeserializer::new(message); - let api_state = >, + let api_cloud_messages_client = >, + >, >>::sse_decode(&mut deserializer); - let api_targets = >::sse_decode(&mut deserializer); - let api_sender = ::sse_decode(&mut deserializer); + let api_continuation_token = >>::sse_decode(&mut deserializer); deserializer.end(); move |context| async move { transform_result_sse::<_, flutter_rust_bridge::for_generated::anyhow::Error>( (move || async move { - let mut api_state_guard = None; + let mut api_cloud_messages_client_guard = None; let decode_indices_ = flutter_rust_bridge::for_generated::lockable_compute_decode_order( vec![flutter_rust_bridge::for_generated::LockableOrderInfo::new( - &api_state, 0, false, + &api_cloud_messages_client, + 0, + false, )], ); for i in decode_indices_ { match i { 0 => { - api_state_guard = - Some(api_state.lockable_decode_async_ref().await) + api_cloud_messages_client_guard = Some( + api_cloud_messages_client.lockable_decode_async_ref().await, + ) } _ => unreachable!(), } } - let api_state_guard = api_state_guard.unwrap(); - let output_ok = crate::api::api::validate_targets( - &*api_state_guard, - api_targets, - api_sender, + let api_cloud_messages_client_guard = + api_cloud_messages_client_guard.unwrap(); + let output_ok = crate::api::api::sync_chats( + &*api_cloud_messages_client_guard, + api_continuation_token, ) .await?; Ok(output_ok) @@ -14104,7 +13956,7 @@ fn wire__crate__api__api__validate_targets_impl( }, ) } -fn wire__crate__api__api__validate_targets_facetime_impl( +fn wire__crate__api__api__sync_messages_impl( port_: flutter_rust_bridge::for_generated::MessagePort, ptr_: flutter_rust_bridge::for_generated::PlatformGeneralizedUint8ListPtr, rust_vec_len_: i32, @@ -14112,7 +13964,7 @@ fn wire__crate__api__api__validate_targets_facetime_impl( ) { FLUTTER_RUST_BRIDGE_HANDLER.wrap_async::( flutter_rust_bridge::for_generated::TaskInfo { - debug_name: "validate_targets_facetime", + debug_name: "sync_messages", port: Some(port_), mode: flutter_rust_bridge::for_generated::FfiCallMode::Normal, }, @@ -14126,36 +13978,40 @@ fn wire__crate__api__api__validate_targets_facetime_impl( }; let mut deserializer = flutter_rust_bridge::for_generated::SseDeserializer::new(message); - let api_state = >, + let api_cloud_messages_client = >, + >, >>::sse_decode(&mut deserializer); - let api_targets = >::sse_decode(&mut deserializer); - let api_sender = ::sse_decode(&mut deserializer); + let api_continuation_token = >>::sse_decode(&mut deserializer); deserializer.end(); move |context| async move { transform_result_sse::<_, flutter_rust_bridge::for_generated::anyhow::Error>( (move || async move { - let mut api_state_guard = None; + let mut api_cloud_messages_client_guard = None; let decode_indices_ = flutter_rust_bridge::for_generated::lockable_compute_decode_order( vec![flutter_rust_bridge::for_generated::LockableOrderInfo::new( - &api_state, 0, false, + &api_cloud_messages_client, + 0, + false, )], ); for i in decode_indices_ { match i { 0 => { - api_state_guard = - Some(api_state.lockable_decode_async_ref().await) + api_cloud_messages_client_guard = Some( + api_cloud_messages_client.lockable_decode_async_ref().await, + ) } _ => unreachable!(), } } - let api_state_guard = api_state_guard.unwrap(); - let output_ok = crate::api::api::validate_targets_facetime( - &*api_state_guard, - api_targets, - api_sender, + let api_cloud_messages_client_guard = + api_cloud_messages_client_guard.unwrap(); + let output_ok = crate::api::api::sync_messages( + &*api_cloud_messages_client_guard, + api_continuation_token, ) .await?; Ok(output_ok) @@ -14166,7 +14022,7 @@ fn wire__crate__api__api__validate_targets_facetime_impl( }, ) } -fn wire__crate__api__api__verify_2fa_impl( +fn wire__crate__api__api__sync_now_impl( port_: flutter_rust_bridge::for_generated::MessagePort, ptr_: flutter_rust_bridge::for_generated::PlatformGeneralizedUint8ListPtr, rust_vec_len_: i32, @@ -14174,7 +14030,7 @@ fn wire__crate__api__api__verify_2fa_impl( ) { FLUTTER_RUST_BRIDGE_HANDLER.wrap_async::( flutter_rust_bridge::for_generated::TaskInfo { - debug_name: "verify_2fa", + debug_name: "sync_now", port: Some(port_), mode: flutter_rust_bridge::for_generated::FfiCallMode::Normal, }, @@ -14188,121 +14044,33 @@ fn wire__crate__api__api__verify_2fa_impl( }; let mut deserializer = flutter_rust_bridge::for_generated::SseDeserializer::new(message); - let api_path = ::sse_decode(&mut deserializer); - let api_client = , - >, - >>::sse_decode(&mut deserializer); - let api_anisette = , - >, - >>::sse_decode(&mut deserializer); - let api_os_config = , - >>::sse_decode(&mut deserializer); - let api_account = >>, + SyncManager, >, >>::sse_decode(&mut deserializer); - let api_watcher = >, - >>::sse_decode(&mut deserializer); - let api_idms = >, - >>::sse_decode(&mut deserializer); - let api_code = ::sse_decode(&mut deserializer); deserializer.end(); move |context| async move { transform_result_sse::<_, flutter_rust_bridge::for_generated::anyhow::Error>( (move || async move { - let mut api_client_guard = None; - let mut api_anisette_guard = None; - let mut api_os_config_guard = None; - let mut api_account_guard = None; - let mut api_watcher_guard = None; - let mut api_idms_guard = None; + let mut api_lock_guard = None; let decode_indices_ = flutter_rust_bridge::for_generated::lockable_compute_decode_order( - vec![ - flutter_rust_bridge::for_generated::LockableOrderInfo::new( - &api_client, - 0, - true, - ), - flutter_rust_bridge::for_generated::LockableOrderInfo::new( - &api_anisette, - 1, - false, - ), - flutter_rust_bridge::for_generated::LockableOrderInfo::new( - &api_os_config, - 2, - false, - ), - flutter_rust_bridge::for_generated::LockableOrderInfo::new( - &api_account, - 3, - false, - ), - flutter_rust_bridge::for_generated::LockableOrderInfo::new( - &api_watcher, - 4, - true, - ), - flutter_rust_bridge::for_generated::LockableOrderInfo::new( - &api_idms, 5, false, - ), - ], + vec![flutter_rust_bridge::for_generated::LockableOrderInfo::new( + &api_lock, 0, false, + )], ); for i in decode_indices_ { match i { 0 => { - api_client_guard = - Some(api_client.lockable_decode_async_ref_mut().await) - } - 1 => { - api_anisette_guard = - Some(api_anisette.lockable_decode_async_ref().await) - } - 2 => { - api_os_config_guard = - Some(api_os_config.lockable_decode_async_ref().await) - } - 3 => { - api_account_guard = - Some(api_account.lockable_decode_async_ref().await) - } - 4 => { - api_watcher_guard = - Some(api_watcher.lockable_decode_async_ref_mut().await) - } - 5 => { - api_idms_guard = - Some(api_idms.lockable_decode_async_ref().await) + api_lock_guard = + Some(api_lock.lockable_decode_async_ref().await) } _ => unreachable!(), } } - let mut api_client_guard = api_client_guard.unwrap(); - let api_anisette_guard = api_anisette_guard.unwrap(); - let api_os_config_guard = api_os_config_guard.unwrap(); - let api_account_guard = api_account_guard.unwrap(); - let mut api_watcher_guard = api_watcher_guard.unwrap(); - let api_idms_guard = api_idms_guard.unwrap(); - let output_ok = crate::api::api::verify_2fa( - api_path, - &mut *api_client_guard, - &*api_anisette_guard, - &*api_os_config_guard, - &*api_account_guard, - &mut *api_watcher_guard, - &*api_idms_guard, - api_code, - ) - .await?; + let api_lock_guard = api_lock_guard.unwrap(); + let output_ok = crate::api::api::sync_now(&*api_lock_guard).await?; Ok(output_ok) })() .await, @@ -14311,7 +14079,7 @@ fn wire__crate__api__api__verify_2fa_impl( }, ) } -fn wire__crate__api__api__verify_2fa_sms_impl( +fn wire__crate__api__api__sync_passwords_impl( port_: flutter_rust_bridge::for_generated::MessagePort, ptr_: flutter_rust_bridge::for_generated::PlatformGeneralizedUint8ListPtr, rust_vec_len_: i32, @@ -14319,7 +14087,7 @@ fn wire__crate__api__api__verify_2fa_sms_impl( ) { FLUTTER_RUST_BRIDGE_HANDLER.wrap_async::( flutter_rust_bridge::for_generated::TaskInfo { - debug_name: "verify_2fa_sms", + debug_name: "sync_passwords", port: Some(port_), mode: flutter_rust_bridge::for_generated::FfiCallMode::Normal, }, @@ -14333,87 +14101,51 @@ fn wire__crate__api__api__verify_2fa_sms_impl( }; let mut deserializer = flutter_rust_bridge::for_generated::SseDeserializer::new(message); - let api_path = ::sse_decode(&mut deserializer); - let api_account_mut = >>, - >, - >>::sse_decode(&mut deserializer); - let api_anisette = , + Arc>, >, >>::sse_decode(&mut deserializer); - let api_config = , - >>::sse_decode(&mut deserializer); - let api_body = , + let api_conn = , >>::sse_decode(&mut deserializer); - let api_code = ::sse_decode(&mut deserializer); deserializer.end(); move |context| async move { transform_result_sse::<_, flutter_rust_bridge::for_generated::anyhow::Error>( (move || async move { - let mut api_account_mut_guard = None; - let mut api_anisette_guard = None; - let mut api_config_guard = None; - let mut api_body_guard = None; + let mut api_passwords_guard = None; + let mut api_conn_guard = None; let decode_indices_ = flutter_rust_bridge::for_generated::lockable_compute_decode_order( vec![ flutter_rust_bridge::for_generated::LockableOrderInfo::new( - &api_account_mut, + &api_passwords, 0, false, ), flutter_rust_bridge::for_generated::LockableOrderInfo::new( - &api_anisette, - 1, - false, - ), - flutter_rust_bridge::for_generated::LockableOrderInfo::new( - &api_config, - 2, - false, - ), - flutter_rust_bridge::for_generated::LockableOrderInfo::new( - &api_body, 3, false, + &api_conn, 1, false, ), ], ); for i in decode_indices_ { match i { 0 => { - api_account_mut_guard = - Some(api_account_mut.lockable_decode_async_ref().await) + api_passwords_guard = + Some(api_passwords.lockable_decode_async_ref().await) } 1 => { - api_anisette_guard = - Some(api_anisette.lockable_decode_async_ref().await) - } - 2 => { - api_config_guard = - Some(api_config.lockable_decode_async_ref().await) - } - 3 => { - api_body_guard = - Some(api_body.lockable_decode_async_ref().await) + api_conn_guard = + Some(api_conn.lockable_decode_async_ref().await) } _ => unreachable!(), } } - let api_account_mut_guard = api_account_mut_guard.unwrap(); - let api_anisette_guard = api_anisette_guard.unwrap(); - let api_config_guard = api_config_guard.unwrap(); - let api_body_guard = api_body_guard.unwrap(); - let output_ok = crate::api::api::verify_2fa_sms( - api_path, - &*api_account_mut_guard, - &*api_anisette_guard, - &*api_config_guard, - &*api_body_guard, - api_code, + let api_passwords_guard = api_passwords_guard.unwrap(); + let api_conn_guard = api_conn_guard.unwrap(); + let output_ok = crate::api::api::sync_passwords( + &*api_passwords_guard, + &*api_conn_guard, ) .await?; Ok(output_ok) @@ -14424,4044 +14156,10220 @@ fn wire__crate__api__api__verify_2fa_sms_impl( }, ) } - -// Section: static_checks - -#[allow(clippy::unnecessary_literal_unwrap)] -const _: fn() = || { - { - let Address = None::.unwrap(); - let _: Option = Address.administrative_area; - let _: String = Address.country; - let _: String = Address.country_code; - let _: Option> = Address.formatted_address_lines; - let _: Option = Address.locality; - let _: Option = Address.state_code; +fn wire__crate__api__api__sync_wifi_passwords_impl( + port_: flutter_rust_bridge::for_generated::MessagePort, + ptr_: flutter_rust_bridge::for_generated::PlatformGeneralizedUint8ListPtr, + rust_vec_len_: i32, + data_len_: i32, +) { + FLUTTER_RUST_BRIDGE_HANDLER.wrap_async::( + flutter_rust_bridge::for_generated::TaskInfo { + debug_name: "sync_wifi_passwords", + port: Some(port_), + mode: flutter_rust_bridge::for_generated::FfiCallMode::Normal, + }, + move || { + let message = unsafe { + flutter_rust_bridge::for_generated::Dart2RustMessageSse::from_wire( + ptr_, + rust_vec_len_, + data_len_, + ) + }; + let mut deserializer = + flutter_rust_bridge::for_generated::SseDeserializer::new(message); + let api_manager = >, + >, + >>::sse_decode(&mut deserializer); + let api_user_approve = ::sse_decode(&mut deserializer); + deserializer.end(); + move |context| async move { + transform_result_sse::<_, ()>( + (move || async move { + let mut api_manager_guard = None; + let decode_indices_ = + flutter_rust_bridge::for_generated::lockable_compute_decode_order( + vec![flutter_rust_bridge::for_generated::LockableOrderInfo::new( + &api_manager, + 0, + false, + )], + ); + for i in decode_indices_ { + match i { + 0 => { + api_manager_guard = + Some(api_manager.lockable_decode_async_ref().await) + } + _ => unreachable!(), + } + } + let api_manager_guard = api_manager_guard.unwrap(); + let output_ok = Result::<_, ()>::Ok({ + crate::api::api::sync_wifi_passwords( + &*api_manager_guard, + api_user_approve, + ) + .await; + })?; + Ok(output_ok) + })() + .await, + ) + } + }, + ) +} +fn wire__crate__api__api__systemtime_to_millis_impl( + ptr_: flutter_rust_bridge::for_generated::PlatformGeneralizedUint8ListPtr, + rust_vec_len_: i32, + data_len_: i32, +) -> flutter_rust_bridge::for_generated::WireSyncRust2DartSse { + FLUTTER_RUST_BRIDGE_HANDLER.wrap_sync::( + flutter_rust_bridge::for_generated::TaskInfo { + debug_name: "systemtime_to_millis", + port: None, + mode: flutter_rust_bridge::for_generated::FfiCallMode::Sync, + }, + move || { + let message = unsafe { + flutter_rust_bridge::for_generated::Dart2RustMessageSse::from_wire( + ptr_, + rust_vec_len_, + data_len_, + ) + }; + let mut deserializer = + flutter_rust_bridge::for_generated::SseDeserializer::new(message); + let api_time = ::sse_decode(&mut deserializer); + deserializer.end(); + transform_result_sse::<_, ()>((move || { + let output_ok = + Result::<_, ()>::Ok(crate::api::api::systemtime_to_millis(api_time))?; + Ok(output_ok) + })()) + }, + ) +} +fn wire__crate__api__api__teardown_2fa_impl( + port_: flutter_rust_bridge::for_generated::MessagePort, + ptr_: flutter_rust_bridge::for_generated::PlatformGeneralizedUint8ListPtr, + rust_vec_len_: i32, + data_len_: i32, +) { + FLUTTER_RUST_BRIDGE_HANDLER.wrap_async::( + flutter_rust_bridge::for_generated::TaskInfo { + debug_name: "teardown_2fa", + port: Some(port_), + mode: flutter_rust_bridge::for_generated::FfiCallMode::Normal, + }, + move || { + let message = unsafe { + flutter_rust_bridge::for_generated::Dart2RustMessageSse::from_wire( + ptr_, + rust_vec_len_, + data_len_, + ) + }; + let mut deserializer = + flutter_rust_bridge::for_generated::SseDeserializer::new(message); + let api_account = >>, + >, + >>::sse_decode(&mut deserializer); + let api_action = ::sse_decode(&mut deserializer); + let api_txnid = ::sse_decode(&mut deserializer); + deserializer.end(); + move |context| async move { + transform_result_sse::<_, flutter_rust_bridge::for_generated::anyhow::Error>( + (move || async move { + let mut api_account_guard = None; + let decode_indices_ = + flutter_rust_bridge::for_generated::lockable_compute_decode_order( + vec![flutter_rust_bridge::for_generated::LockableOrderInfo::new( + &api_account, + 0, + false, + )], + ); + for i in decode_indices_ { + match i { + 0 => { + api_account_guard = + Some(api_account.lockable_decode_async_ref().await) + } + _ => unreachable!(), + } + } + let api_account_guard = api_account_guard.unwrap(); + let output_ok = crate::api::api::teardown_2fa( + &*api_account_guard, + api_action, + api_txnid, + ) + .await?; + Ok(output_ok) + })() + .await, + ) + } + }, + ) +} +fn wire__crate__api__api__transcript_poster_save_impl( + port_: flutter_rust_bridge::for_generated::MessagePort, + ptr_: flutter_rust_bridge::for_generated::PlatformGeneralizedUint8ListPtr, + rust_vec_len_: i32, + data_len_: i32, +) { + FLUTTER_RUST_BRIDGE_HANDLER.wrap_normal::( + flutter_rust_bridge::for_generated::TaskInfo { + debug_name: "transcript_poster_save", + port: Some(port_), + mode: flutter_rust_bridge::for_generated::FfiCallMode::Normal, + }, + move || { + let message = unsafe { + flutter_rust_bridge::for_generated::Dart2RustMessageSse::from_wire( + ptr_, + rust_vec_len_, + data_len_, + ) + }; + let mut deserializer = + flutter_rust_bridge::for_generated::SseDeserializer::new(message); + let api_poster = + ::sse_decode(&mut deserializer); + deserializer.end(); + move |context| { + transform_result_sse::<_, flutter_rust_bridge::for_generated::anyhow::Error>( + (move || { + let output_ok = crate::api::api::transcript_poster_save(api_poster)?; + Ok(output_ok) + })(), + ) + } + }, + ) +} +fn wire__crate__api__api__try_auth_impl( + port_: flutter_rust_bridge::for_generated::MessagePort, + ptr_: flutter_rust_bridge::for_generated::PlatformGeneralizedUint8ListPtr, + rust_vec_len_: i32, + data_len_: i32, +) { + FLUTTER_RUST_BRIDGE_HANDLER.wrap_async::( + flutter_rust_bridge::for_generated::TaskInfo { + debug_name: "try_auth", + port: Some(port_), + mode: flutter_rust_bridge::for_generated::FfiCallMode::Normal, + }, + move || { + let message = unsafe { + flutter_rust_bridge::for_generated::Dart2RustMessageSse::from_wire( + ptr_, + rust_vec_len_, + data_len_, + ) + }; + let mut deserializer = + flutter_rust_bridge::for_generated::SseDeserializer::new(message); + let api_path = ::sse_decode(&mut deserializer); + let api_conf = , + >>::sse_decode(&mut deserializer); + let api_conn = , + >>::sse_decode(&mut deserializer); + let api_anisette = , + >, + >>::sse_decode(&mut deserializer); + let api_creds = >::sse_decode(&mut deserializer); + deserializer.end(); + move |context| async move { + transform_result_sse::<_, flutter_rust_bridge::for_generated::anyhow::Error>( + (move || async move { + let mut api_conf_guard = None; + let mut api_conn_guard = None; + let mut api_anisette_guard = None; + let decode_indices_ = + flutter_rust_bridge::for_generated::lockable_compute_decode_order( + vec![ + flutter_rust_bridge::for_generated::LockableOrderInfo::new( + &api_conf, 0, false, + ), + flutter_rust_bridge::for_generated::LockableOrderInfo::new( + &api_conn, 1, false, + ), + flutter_rust_bridge::for_generated::LockableOrderInfo::new( + &api_anisette, + 2, + false, + ), + ], + ); + for i in decode_indices_ { + match i { + 0 => { + api_conf_guard = + Some(api_conf.lockable_decode_async_ref().await) + } + 1 => { + api_conn_guard = + Some(api_conn.lockable_decode_async_ref().await) + } + 2 => { + api_anisette_guard = + Some(api_anisette.lockable_decode_async_ref().await) + } + _ => unreachable!(), + } + } + let api_conf_guard = api_conf_guard.unwrap(); + let api_conn_guard = api_conn_guard.unwrap(); + let api_anisette_guard = api_anisette_guard.unwrap(); + let output_ok = crate::api::api::try_auth( + api_path, + &*api_conf_guard, + &*api_conn_guard, + &*api_anisette_guard, + api_creds, + ) + .await?; + Ok(output_ok) + })() + .await, + ) + } + }, + ) +} +fn wire__crate__api__api__try_icloud_login_impl( + port_: flutter_rust_bridge::for_generated::MessagePort, + ptr_: flutter_rust_bridge::for_generated::PlatformGeneralizedUint8ListPtr, + rust_vec_len_: i32, + data_len_: i32, +) { + FLUTTER_RUST_BRIDGE_HANDLER.wrap_async::( + flutter_rust_bridge::for_generated::TaskInfo { + debug_name: "try_icloud_login", + port: Some(port_), + mode: flutter_rust_bridge::for_generated::FfiCallMode::Normal, + }, + move || { + let message = unsafe { + flutter_rust_bridge::for_generated::Dart2RustMessageSse::from_wire( + ptr_, + rust_vec_len_, + data_len_, + ) + }; + let mut deserializer = + flutter_rust_bridge::for_generated::SseDeserializer::new(message); + let api_path = ::sse_decode(&mut deserializer); + let api_conf = , + >>::sse_decode(&mut deserializer); + let api_account = >>, + >, + >>::sse_decode(&mut deserializer); + deserializer.end(); + move |context| async move { + transform_result_sse::<_, flutter_rust_bridge::for_generated::anyhow::Error>( + (move || async move { + let mut api_conf_guard = None; + let mut api_account_guard = None; + let decode_indices_ = + flutter_rust_bridge::for_generated::lockable_compute_decode_order( + vec![ + flutter_rust_bridge::for_generated::LockableOrderInfo::new( + &api_conf, 0, false, + ), + flutter_rust_bridge::for_generated::LockableOrderInfo::new( + &api_account, + 1, + false, + ), + ], + ); + for i in decode_indices_ { + match i { + 0 => { + api_conf_guard = + Some(api_conf.lockable_decode_async_ref().await) + } + 1 => { + api_account_guard = + Some(api_account.lockable_decode_async_ref().await) + } + _ => unreachable!(), + } + } + let api_conf_guard = api_conf_guard.unwrap(); + let api_account_guard = api_account_guard.unwrap(); + let output_ok = crate::api::api::try_icloud_login( + api_path, + &*api_conf_guard, + &*api_account_guard, + ) + .await?; + Ok(output_ok) + })() + .await, + ) + } + }, + ) +} +fn wire__crate__api__api__unsubscribe_impl( + port_: flutter_rust_bridge::for_generated::MessagePort, + ptr_: flutter_rust_bridge::for_generated::PlatformGeneralizedUint8ListPtr, + rust_vec_len_: i32, + data_len_: i32, +) { + FLUTTER_RUST_BRIDGE_HANDLER.wrap_async::( + flutter_rust_bridge::for_generated::TaskInfo { + debug_name: "unsubscribe", + port: Some(port_), + mode: flutter_rust_bridge::for_generated::FfiCallMode::Normal, + }, + move || { + let message = unsafe { + flutter_rust_bridge::for_generated::Dart2RustMessageSse::from_wire( + ptr_, + rust_vec_len_, + data_len_, + ) + }; + let mut deserializer = + flutter_rust_bridge::for_generated::SseDeserializer::new(message); + let api_lock = , + >, + >>::sse_decode(&mut deserializer); + let api_guid = ::sse_decode(&mut deserializer); + deserializer.end(); + move |context| async move { + transform_result_sse::<_, flutter_rust_bridge::for_generated::anyhow::Error>( + (move || async move { + let mut api_lock_guard = None; + let decode_indices_ = + flutter_rust_bridge::for_generated::lockable_compute_decode_order( + vec![flutter_rust_bridge::for_generated::LockableOrderInfo::new( + &api_lock, 0, false, + )], + ); + for i in decode_indices_ { + match i { + 0 => { + api_lock_guard = + Some(api_lock.lockable_decode_async_ref().await) + } + _ => unreachable!(), + } + } + let api_lock_guard = api_lock_guard.unwrap(); + let output_ok = + crate::api::api::unsubscribe(&*api_lock_guard, api_guid).await?; + Ok(output_ok) + })() + .await, + ) + } + }, + ) +} +fn wire__crate__api__api__update_account_headers_impl( + port_: flutter_rust_bridge::for_generated::MessagePort, + ptr_: flutter_rust_bridge::for_generated::PlatformGeneralizedUint8ListPtr, + rust_vec_len_: i32, + data_len_: i32, +) { + FLUTTER_RUST_BRIDGE_HANDLER.wrap_async::( + flutter_rust_bridge::for_generated::TaskInfo { + debug_name: "update_account_headers", + port: Some(port_), + mode: flutter_rust_bridge::for_generated::FfiCallMode::Normal, + }, + move || { + let message = unsafe { + flutter_rust_bridge::for_generated::Dart2RustMessageSse::from_wire( + ptr_, + rust_vec_len_, + data_len_, + ) + }; + let mut deserializer = + flutter_rust_bridge::for_generated::SseDeserializer::new(message); + let api_account = >>, + >, + >>::sse_decode(&mut deserializer); + let api_config = , + >>::sse_decode(&mut deserializer); + deserializer.end(); + move |context| async move { + transform_result_sse::<_, flutter_rust_bridge::for_generated::anyhow::Error>( + (move || async move { + let mut api_account_guard = None; + let mut api_config_guard = None; + let decode_indices_ = + flutter_rust_bridge::for_generated::lockable_compute_decode_order( + vec![ + flutter_rust_bridge::for_generated::LockableOrderInfo::new( + &api_account, + 0, + false, + ), + flutter_rust_bridge::for_generated::LockableOrderInfo::new( + &api_config, + 1, + false, + ), + ], + ); + for i in decode_indices_ { + match i { + 0 => { + api_account_guard = + Some(api_account.lockable_decode_async_ref().await) + } + 1 => { + api_config_guard = + Some(api_config.lockable_decode_async_ref().await) + } + _ => unreachable!(), + } + } + let api_account_guard = api_account_guard.unwrap(); + let api_config_guard = api_config_guard.unwrap(); + let output_ok = crate::api::api::update_account_headers( + &*api_account_guard, + &*api_config_guard, + ) + .await?; + Ok(output_ok) + })() + .await, + ) + } + }, + ) +} +fn wire__crate__api__api__update_beacon_name_impl( + port_: flutter_rust_bridge::for_generated::MessagePort, + ptr_: flutter_rust_bridge::for_generated::PlatformGeneralizedUint8ListPtr, + rust_vec_len_: i32, + data_len_: i32, +) { + FLUTTER_RUST_BRIDGE_HANDLER.wrap_async::( + flutter_rust_bridge::for_generated::TaskInfo { + debug_name: "update_beacon_name", + port: Some(port_), + mode: flutter_rust_bridge::for_generated::FfiCallMode::Normal, + }, + move || { + let message = unsafe { + flutter_rust_bridge::for_generated::Dart2RustMessageSse::from_wire( + ptr_, + rust_vec_len_, + data_len_, + ) + }; + let mut deserializer = + flutter_rust_bridge::for_generated::SseDeserializer::new(message); + let api_items = >, + >, + >>::sse_decode(&mut deserializer); + let api_naming_record = + ::sse_decode(&mut deserializer); + deserializer.end(); + move |context| async move { + transform_result_sse::<_, flutter_rust_bridge::for_generated::anyhow::Error>( + (move || async move { + let mut api_items_guard = None; + let decode_indices_ = + flutter_rust_bridge::for_generated::lockable_compute_decode_order( + vec![flutter_rust_bridge::for_generated::LockableOrderInfo::new( + &api_items, 0, false, + )], + ); + for i in decode_indices_ { + match i { + 0 => { + api_items_guard = + Some(api_items.lockable_decode_async_ref().await) + } + _ => unreachable!(), + } + } + let api_items_guard = api_items_guard.unwrap(); + let output_ok = crate::api::api::update_beacon_name( + &*api_items_guard, + &api_naming_record, + ) + .await?; + Ok(output_ok) + })() + .await, + ) + } + }, + ) +} +fn wire__crate__api__api__upload_attachment_impl( + port_: flutter_rust_bridge::for_generated::MessagePort, + ptr_: flutter_rust_bridge::for_generated::PlatformGeneralizedUint8ListPtr, + rust_vec_len_: i32, + data_len_: i32, +) { + FLUTTER_RUST_BRIDGE_HANDLER.wrap_async::( + flutter_rust_bridge::for_generated::TaskInfo { + debug_name: "upload_attachment", + port: Some(port_), + mode: flutter_rust_bridge::for_generated::FfiCallMode::Normal, + }, + move || { + let message = unsafe { + flutter_rust_bridge::for_generated::Dart2RustMessageSse::from_wire( + ptr_, + rust_vec_len_, + data_len_, + ) + }; + let mut deserializer = + flutter_rust_bridge::for_generated::SseDeserializer::new(message); + let api_sink = >::sse_decode(&mut deserializer); + let api_aps = , + >>::sse_decode(&mut deserializer); + let api_path = ::sse_decode(&mut deserializer); + let api_mime = ::sse_decode(&mut deserializer); + let api_uti = ::sse_decode(&mut deserializer); + let api_name = ::sse_decode(&mut deserializer); + deserializer.end(); + move |context| async move { + transform_result_sse::<_, ()>( + (move || async move { + let mut api_aps_guard = None; + let decode_indices_ = + flutter_rust_bridge::for_generated::lockable_compute_decode_order( + vec![flutter_rust_bridge::for_generated::LockableOrderInfo::new( + &api_aps, 0, false, + )], + ); + for i in decode_indices_ { + match i { + 0 => { + api_aps_guard = Some(api_aps.lockable_decode_async_ref().await) + } + _ => unreachable!(), + } + } + let api_aps_guard = api_aps_guard.unwrap(); + let output_ok = Result::<_, ()>::Ok({ + crate::api::api::upload_attachment( + api_sink, + &*api_aps_guard, + api_path, + api_mime, + api_uti, + api_name, + ) + .await; + })?; + Ok(output_ok) + })() + .await, + ) + } + }, + ) +} +fn wire__crate__api__api__upload_cloud_attachments_impl( + port_: flutter_rust_bridge::for_generated::MessagePort, + ptr_: flutter_rust_bridge::for_generated::PlatformGeneralizedUint8ListPtr, + rust_vec_len_: i32, + data_len_: i32, +) { + FLUTTER_RUST_BRIDGE_HANDLER.wrap_async::( + flutter_rust_bridge::for_generated::TaskInfo { + debug_name: "upload_cloud_attachments", + port: Some(port_), + mode: flutter_rust_bridge::for_generated::FfiCallMode::Normal, + }, + move || { + let message = unsafe { + flutter_rust_bridge::for_generated::Dart2RustMessageSse::from_wire( + ptr_, + rust_vec_len_, + data_len_, + ) + }; + let mut deserializer = + flutter_rust_bridge::for_generated::SseDeserializer::new(message); + let api_cloud_messages_client = >, + >, + >>::sse_decode(&mut deserializer); + let api_files = >::sse_decode(&mut deserializer); + deserializer.end(); + move |context| async move { + transform_result_sse::<_, flutter_rust_bridge::for_generated::anyhow::Error>( + (move || async move { + let mut api_cloud_messages_client_guard = None; + let decode_indices_ = + flutter_rust_bridge::for_generated::lockable_compute_decode_order( + vec![flutter_rust_bridge::for_generated::LockableOrderInfo::new( + &api_cloud_messages_client, + 0, + false, + )], + ); + for i in decode_indices_ { + match i { + 0 => { + api_cloud_messages_client_guard = Some( + api_cloud_messages_client.lockable_decode_async_ref().await, + ) + } + _ => unreachable!(), + } + } + let api_cloud_messages_client_guard = + api_cloud_messages_client_guard.unwrap(); + let output_ok = crate::api::api::upload_cloud_attachments( + &*api_cloud_messages_client_guard, + api_files, + ) + .await?; + Ok(output_ok) + })() + .await, + ) + } + }, + ) +} +fn wire__crate__api__api__upload_group_photo_impl( + port_: flutter_rust_bridge::for_generated::MessagePort, + ptr_: flutter_rust_bridge::for_generated::PlatformGeneralizedUint8ListPtr, + rust_vec_len_: i32, + data_len_: i32, +) { + FLUTTER_RUST_BRIDGE_HANDLER.wrap_async::( + flutter_rust_bridge::for_generated::TaskInfo { + debug_name: "upload_group_photo", + port: Some(port_), + mode: flutter_rust_bridge::for_generated::FfiCallMode::Normal, + }, + move || { + let message = unsafe { + flutter_rust_bridge::for_generated::Dart2RustMessageSse::from_wire( + ptr_, + rust_vec_len_, + data_len_, + ) + }; + let mut deserializer = + flutter_rust_bridge::for_generated::SseDeserializer::new(message); + let api_cloud_messages_client = >, + >, + >>::sse_decode(&mut deserializer); + let api_files = >::sse_decode(&mut deserializer); + deserializer.end(); + move |context| async move { + transform_result_sse::<_, flutter_rust_bridge::for_generated::anyhow::Error>( + (move || async move { + let mut api_cloud_messages_client_guard = None; + let decode_indices_ = + flutter_rust_bridge::for_generated::lockable_compute_decode_order( + vec![flutter_rust_bridge::for_generated::LockableOrderInfo::new( + &api_cloud_messages_client, + 0, + false, + )], + ); + for i in decode_indices_ { + match i { + 0 => { + api_cloud_messages_client_guard = Some( + api_cloud_messages_client.lockable_decode_async_ref().await, + ) + } + _ => unreachable!(), + } + } + let api_cloud_messages_client_guard = + api_cloud_messages_client_guard.unwrap(); + let output_ok = crate::api::api::upload_group_photo( + &*api_cloud_messages_client_guard, + api_files, + ) + .await?; + Ok(output_ok) + })() + .await, + ) + } + }, + ) +} +fn wire__crate__api__api__upload_mmcs_impl( + port_: flutter_rust_bridge::for_generated::MessagePort, + ptr_: flutter_rust_bridge::for_generated::PlatformGeneralizedUint8ListPtr, + rust_vec_len_: i32, + data_len_: i32, +) { + FLUTTER_RUST_BRIDGE_HANDLER.wrap_async::( + flutter_rust_bridge::for_generated::TaskInfo { + debug_name: "upload_mmcs", + port: Some(port_), + mode: flutter_rust_bridge::for_generated::FfiCallMode::Normal, + }, + move || { + let message = unsafe { + flutter_rust_bridge::for_generated::Dart2RustMessageSse::from_wire( + ptr_, + rust_vec_len_, + data_len_, + ) + }; + let mut deserializer = + flutter_rust_bridge::for_generated::SseDeserializer::new(message); + let api_sink = >::sse_decode(&mut deserializer); + let api_aps = , + >>::sse_decode(&mut deserializer); + let api_path = ::sse_decode(&mut deserializer); + deserializer.end(); + move |context| async move { + transform_result_sse::<_, ()>( + (move || async move { + let mut api_aps_guard = None; + let decode_indices_ = + flutter_rust_bridge::for_generated::lockable_compute_decode_order( + vec![flutter_rust_bridge::for_generated::LockableOrderInfo::new( + &api_aps, 0, false, + )], + ); + for i in decode_indices_ { + match i { + 0 => { + api_aps_guard = Some(api_aps.lockable_decode_async_ref().await) + } + _ => unreachable!(), + } + } + let api_aps_guard = api_aps_guard.unwrap(); + let output_ok = Result::<_, ()>::Ok({ + crate::api::api::upload_mmcs(api_sink, &*api_aps_guard, api_path).await; + })?; + Ok(output_ok) + })() + .await, + ) + } + }, + ) +} +fn wire__crate__api__api__use_link_for_impl( + port_: flutter_rust_bridge::for_generated::MessagePort, + ptr_: flutter_rust_bridge::for_generated::PlatformGeneralizedUint8ListPtr, + rust_vec_len_: i32, + data_len_: i32, +) { + FLUTTER_RUST_BRIDGE_HANDLER.wrap_async::( + flutter_rust_bridge::for_generated::TaskInfo { + debug_name: "use_link_for", + port: Some(port_), + mode: flutter_rust_bridge::for_generated::FfiCallMode::Normal, + }, + move || { + let message = unsafe { + flutter_rust_bridge::for_generated::Dart2RustMessageSse::from_wire( + ptr_, + rust_vec_len_, + data_len_, + ) + }; + let mut deserializer = + flutter_rust_bridge::for_generated::SseDeserializer::new(message); + let api_facetime = >, + >>::sse_decode(&mut deserializer); + let api_old_usage = ::sse_decode(&mut deserializer); + let api_usage = ::sse_decode(&mut deserializer); + deserializer.end(); + move |context| async move { + transform_result_sse::<_, flutter_rust_bridge::for_generated::anyhow::Error>( + (move || async move { + let mut api_facetime_guard = None; + let decode_indices_ = + flutter_rust_bridge::for_generated::lockable_compute_decode_order( + vec![flutter_rust_bridge::for_generated::LockableOrderInfo::new( + &api_facetime, + 0, + false, + )], + ); + for i in decode_indices_ { + match i { + 0 => { + api_facetime_guard = + Some(api_facetime.lockable_decode_async_ref().await) + } + _ => unreachable!(), + } + } + let api_facetime_guard = api_facetime_guard.unwrap(); + let output_ok = crate::api::api::use_link_for( + &*api_facetime_guard, + api_old_usage, + api_usage, + ) + .await?; + Ok(output_ok) + })() + .await, + ) + } + }, + ) +} +fn wire__crate__api__api__utm_now_impl( + ptr_: flutter_rust_bridge::for_generated::PlatformGeneralizedUint8ListPtr, + rust_vec_len_: i32, + data_len_: i32, +) -> flutter_rust_bridge::for_generated::WireSyncRust2DartSse { + FLUTTER_RUST_BRIDGE_HANDLER.wrap_sync::( + flutter_rust_bridge::for_generated::TaskInfo { + debug_name: "utm_now", + port: None, + mode: flutter_rust_bridge::for_generated::FfiCallMode::Sync, + }, + move || { + let message = unsafe { + flutter_rust_bridge::for_generated::Dart2RustMessageSse::from_wire( + ptr_, + rust_vec_len_, + data_len_, + ) + }; + let mut deserializer = + flutter_rust_bridge::for_generated::SseDeserializer::new(message); + deserializer.end(); + transform_result_sse::<_, ()>((move || { + let output_ok = Result::<_, ()>::Ok(crate::api::api::utm_now())?; + Ok(output_ok) + })()) + }, + ) +} +fn wire__crate__api__api__validate_cert_impl( + port_: flutter_rust_bridge::for_generated::MessagePort, + ptr_: flutter_rust_bridge::for_generated::PlatformGeneralizedUint8ListPtr, + rust_vec_len_: i32, + data_len_: i32, +) { + FLUTTER_RUST_BRIDGE_HANDLER.wrap_async::( + flutter_rust_bridge::for_generated::TaskInfo { + debug_name: "validate_cert", + port: Some(port_), + mode: flutter_rust_bridge::for_generated::FfiCallMode::Normal, + }, + move || { + let message = unsafe { + flutter_rust_bridge::for_generated::Dart2RustMessageSse::from_wire( + ptr_, + rust_vec_len_, + data_len_, + ) + }; + let mut deserializer = + flutter_rust_bridge::for_generated::SseDeserializer::new(message); + let api_conn = , + >>::sse_decode(&mut deserializer); + let api_user = , + >>::sse_decode(&mut deserializer); + deserializer.end(); + move |context| async move { + transform_result_sse::<_, flutter_rust_bridge::for_generated::anyhow::Error>( + (move || async move { + let mut api_conn_guard = None; + let mut api_user_guard = None; + let decode_indices_ = + flutter_rust_bridge::for_generated::lockable_compute_decode_order( + vec![ + flutter_rust_bridge::for_generated::LockableOrderInfo::new( + &api_conn, 0, false, + ), + flutter_rust_bridge::for_generated::LockableOrderInfo::new( + &api_user, 1, false, + ), + ], + ); + for i in decode_indices_ { + match i { + 0 => { + api_conn_guard = + Some(api_conn.lockable_decode_async_ref().await) + } + 1 => { + api_user_guard = + Some(api_user.lockable_decode_async_ref().await) + } + _ => unreachable!(), + } + } + let api_conn_guard = api_conn_guard.unwrap(); + let api_user_guard = api_user_guard.unwrap(); + let output_ok = + crate::api::api::validate_cert(&*api_conn_guard, &*api_user_guard) + .await?; + Ok(output_ok) + })() + .await, + ) + } + }, + ) +} +fn wire__crate__api__api__validate_relay_impl( + port_: flutter_rust_bridge::for_generated::MessagePort, + ptr_: flutter_rust_bridge::for_generated::PlatformGeneralizedUint8ListPtr, + rust_vec_len_: i32, + data_len_: i32, +) { + FLUTTER_RUST_BRIDGE_HANDLER.wrap_async::( + flutter_rust_bridge::for_generated::TaskInfo { + debug_name: "validate_relay", + port: Some(port_), + mode: flutter_rust_bridge::for_generated::FfiCallMode::Normal, + }, + move || { + let message = unsafe { + flutter_rust_bridge::for_generated::Dart2RustMessageSse::from_wire( + ptr_, + rust_vec_len_, + data_len_, + ) + }; + let mut deserializer = + flutter_rust_bridge::for_generated::SseDeserializer::new(message); + let api_config_ref = , + >>::sse_decode(&mut deserializer); + deserializer.end(); + move |context| async move { + transform_result_sse::<_, flutter_rust_bridge::for_generated::anyhow::Error>( + (move || async move { + let mut api_config_ref_guard = None; + let decode_indices_ = + flutter_rust_bridge::for_generated::lockable_compute_decode_order( + vec![flutter_rust_bridge::for_generated::LockableOrderInfo::new( + &api_config_ref, + 0, + false, + )], + ); + for i in decode_indices_ { + match i { + 0 => { + api_config_ref_guard = + Some(api_config_ref.lockable_decode_async_ref().await) + } + _ => unreachable!(), + } + } + let api_config_ref_guard = api_config_ref_guard.unwrap(); + let output_ok = + crate::api::api::validate_relay(&*api_config_ref_guard).await?; + Ok(output_ok) + })() + .await, + ) + } + }, + ) +} +fn wire__crate__api__api__validate_targets_impl( + port_: flutter_rust_bridge::for_generated::MessagePort, + ptr_: flutter_rust_bridge::for_generated::PlatformGeneralizedUint8ListPtr, + rust_vec_len_: i32, + data_len_: i32, +) { + FLUTTER_RUST_BRIDGE_HANDLER.wrap_async::( + flutter_rust_bridge::for_generated::TaskInfo { + debug_name: "validate_targets", + port: Some(port_), + mode: flutter_rust_bridge::for_generated::FfiCallMode::Normal, + }, + move || { + let message = unsafe { + flutter_rust_bridge::for_generated::Dart2RustMessageSse::from_wire( + ptr_, + rust_vec_len_, + data_len_, + ) + }; + let mut deserializer = + flutter_rust_bridge::for_generated::SseDeserializer::new(message); + let api_state = >, + >>::sse_decode(&mut deserializer); + let api_targets = >::sse_decode(&mut deserializer); + let api_sender = ::sse_decode(&mut deserializer); + deserializer.end(); + move |context| async move { + transform_result_sse::<_, flutter_rust_bridge::for_generated::anyhow::Error>( + (move || async move { + let mut api_state_guard = None; + let decode_indices_ = + flutter_rust_bridge::for_generated::lockable_compute_decode_order( + vec![flutter_rust_bridge::for_generated::LockableOrderInfo::new( + &api_state, 0, false, + )], + ); + for i in decode_indices_ { + match i { + 0 => { + api_state_guard = + Some(api_state.lockable_decode_async_ref().await) + } + _ => unreachable!(), + } + } + let api_state_guard = api_state_guard.unwrap(); + let output_ok = crate::api::api::validate_targets( + &*api_state_guard, + api_targets, + api_sender, + ) + .await?; + Ok(output_ok) + })() + .await, + ) + } + }, + ) +} +fn wire__crate__api__api__validate_targets_facetime_impl( + port_: flutter_rust_bridge::for_generated::MessagePort, + ptr_: flutter_rust_bridge::for_generated::PlatformGeneralizedUint8ListPtr, + rust_vec_len_: i32, + data_len_: i32, +) { + FLUTTER_RUST_BRIDGE_HANDLER.wrap_async::( + flutter_rust_bridge::for_generated::TaskInfo { + debug_name: "validate_targets_facetime", + port: Some(port_), + mode: flutter_rust_bridge::for_generated::FfiCallMode::Normal, + }, + move || { + let message = unsafe { + flutter_rust_bridge::for_generated::Dart2RustMessageSse::from_wire( + ptr_, + rust_vec_len_, + data_len_, + ) + }; + let mut deserializer = + flutter_rust_bridge::for_generated::SseDeserializer::new(message); + let api_state = >, + >>::sse_decode(&mut deserializer); + let api_targets = >::sse_decode(&mut deserializer); + let api_sender = ::sse_decode(&mut deserializer); + deserializer.end(); + move |context| async move { + transform_result_sse::<_, flutter_rust_bridge::for_generated::anyhow::Error>( + (move || async move { + let mut api_state_guard = None; + let decode_indices_ = + flutter_rust_bridge::for_generated::lockable_compute_decode_order( + vec![flutter_rust_bridge::for_generated::LockableOrderInfo::new( + &api_state, 0, false, + )], + ); + for i in decode_indices_ { + match i { + 0 => { + api_state_guard = + Some(api_state.lockable_decode_async_ref().await) + } + _ => unreachable!(), + } + } + let api_state_guard = api_state_guard.unwrap(); + let output_ok = crate::api::api::validate_targets_facetime( + &*api_state_guard, + api_targets, + api_sender, + ) + .await?; + Ok(output_ok) + })() + .await, + ) + } + }, + ) +} +fn wire__crate__api__api__verify_2fa_impl( + port_: flutter_rust_bridge::for_generated::MessagePort, + ptr_: flutter_rust_bridge::for_generated::PlatformGeneralizedUint8ListPtr, + rust_vec_len_: i32, + data_len_: i32, +) { + FLUTTER_RUST_BRIDGE_HANDLER.wrap_async::( + flutter_rust_bridge::for_generated::TaskInfo { + debug_name: "verify_2fa", + port: Some(port_), + mode: flutter_rust_bridge::for_generated::FfiCallMode::Normal, + }, + move || { + let message = unsafe { + flutter_rust_bridge::for_generated::Dart2RustMessageSse::from_wire( + ptr_, + rust_vec_len_, + data_len_, + ) + }; + let mut deserializer = + flutter_rust_bridge::for_generated::SseDeserializer::new(message); + let api_path = ::sse_decode(&mut deserializer); + let api_client = , + >, + >>::sse_decode(&mut deserializer); + let api_anisette = , + >, + >>::sse_decode(&mut deserializer); + let api_os_config = , + >>::sse_decode(&mut deserializer); + let api_account = >>, + >, + >>::sse_decode(&mut deserializer); + let api_watcher = >, + >>::sse_decode(&mut deserializer); + let api_idms = >, + >>::sse_decode(&mut deserializer); + let api_code = ::sse_decode(&mut deserializer); + deserializer.end(); + move |context| async move { + transform_result_sse::<_, flutter_rust_bridge::for_generated::anyhow::Error>( + (move || async move { + let mut api_client_guard = None; + let mut api_anisette_guard = None; + let mut api_os_config_guard = None; + let mut api_account_guard = None; + let mut api_watcher_guard = None; + let mut api_idms_guard = None; + let decode_indices_ = + flutter_rust_bridge::for_generated::lockable_compute_decode_order( + vec![ + flutter_rust_bridge::for_generated::LockableOrderInfo::new( + &api_client, + 0, + true, + ), + flutter_rust_bridge::for_generated::LockableOrderInfo::new( + &api_anisette, + 1, + false, + ), + flutter_rust_bridge::for_generated::LockableOrderInfo::new( + &api_os_config, + 2, + false, + ), + flutter_rust_bridge::for_generated::LockableOrderInfo::new( + &api_account, + 3, + false, + ), + flutter_rust_bridge::for_generated::LockableOrderInfo::new( + &api_watcher, + 4, + true, + ), + flutter_rust_bridge::for_generated::LockableOrderInfo::new( + &api_idms, 5, false, + ), + ], + ); + for i in decode_indices_ { + match i { + 0 => { + api_client_guard = + Some(api_client.lockable_decode_async_ref_mut().await) + } + 1 => { + api_anisette_guard = + Some(api_anisette.lockable_decode_async_ref().await) + } + 2 => { + api_os_config_guard = + Some(api_os_config.lockable_decode_async_ref().await) + } + 3 => { + api_account_guard = + Some(api_account.lockable_decode_async_ref().await) + } + 4 => { + api_watcher_guard = + Some(api_watcher.lockable_decode_async_ref_mut().await) + } + 5 => { + api_idms_guard = + Some(api_idms.lockable_decode_async_ref().await) + } + _ => unreachable!(), + } + } + let mut api_client_guard = api_client_guard.unwrap(); + let api_anisette_guard = api_anisette_guard.unwrap(); + let api_os_config_guard = api_os_config_guard.unwrap(); + let api_account_guard = api_account_guard.unwrap(); + let mut api_watcher_guard = api_watcher_guard.unwrap(); + let api_idms_guard = api_idms_guard.unwrap(); + let output_ok = crate::api::api::verify_2fa( + api_path, + &mut *api_client_guard, + &*api_anisette_guard, + &*api_os_config_guard, + &*api_account_guard, + &mut *api_watcher_guard, + &*api_idms_guard, + api_code, + ) + .await?; + Ok(output_ok) + })() + .await, + ) + } + }, + ) +} +fn wire__crate__api__api__verify_2fa_sms_impl( + port_: flutter_rust_bridge::for_generated::MessagePort, + ptr_: flutter_rust_bridge::for_generated::PlatformGeneralizedUint8ListPtr, + rust_vec_len_: i32, + data_len_: i32, +) { + FLUTTER_RUST_BRIDGE_HANDLER.wrap_async::( + flutter_rust_bridge::for_generated::TaskInfo { + debug_name: "verify_2fa_sms", + port: Some(port_), + mode: flutter_rust_bridge::for_generated::FfiCallMode::Normal, + }, + move || { + let message = unsafe { + flutter_rust_bridge::for_generated::Dart2RustMessageSse::from_wire( + ptr_, + rust_vec_len_, + data_len_, + ) + }; + let mut deserializer = + flutter_rust_bridge::for_generated::SseDeserializer::new(message); + let api_path = ::sse_decode(&mut deserializer); + let api_account_mut = >>, + >, + >>::sse_decode(&mut deserializer); + let api_anisette = , + >, + >>::sse_decode(&mut deserializer); + let api_config = , + >>::sse_decode(&mut deserializer); + let api_body = , + >>::sse_decode(&mut deserializer); + let api_code = ::sse_decode(&mut deserializer); + deserializer.end(); + move |context| async move { + transform_result_sse::<_, flutter_rust_bridge::for_generated::anyhow::Error>( + (move || async move { + let mut api_account_mut_guard = None; + let mut api_anisette_guard = None; + let mut api_config_guard = None; + let mut api_body_guard = None; + let decode_indices_ = + flutter_rust_bridge::for_generated::lockable_compute_decode_order( + vec![ + flutter_rust_bridge::for_generated::LockableOrderInfo::new( + &api_account_mut, + 0, + false, + ), + flutter_rust_bridge::for_generated::LockableOrderInfo::new( + &api_anisette, + 1, + false, + ), + flutter_rust_bridge::for_generated::LockableOrderInfo::new( + &api_config, + 2, + false, + ), + flutter_rust_bridge::for_generated::LockableOrderInfo::new( + &api_body, 3, false, + ), + ], + ); + for i in decode_indices_ { + match i { + 0 => { + api_account_mut_guard = + Some(api_account_mut.lockable_decode_async_ref().await) + } + 1 => { + api_anisette_guard = + Some(api_anisette.lockable_decode_async_ref().await) + } + 2 => { + api_config_guard = + Some(api_config.lockable_decode_async_ref().await) + } + 3 => { + api_body_guard = + Some(api_body.lockable_decode_async_ref().await) + } + _ => unreachable!(), + } + } + let api_account_mut_guard = api_account_mut_guard.unwrap(); + let api_anisette_guard = api_anisette_guard.unwrap(); + let api_config_guard = api_config_guard.unwrap(); + let api_body_guard = api_body_guard.unwrap(); + let output_ok = crate::api::api::verify_2fa_sms( + api_path, + &*api_account_mut_guard, + &*api_anisette_guard, + &*api_config_guard, + &*api_body_guard, + api_code, + ) + .await?; + Ok(output_ok) + })() + .await, + ) + } + }, + ) +} + +// Section: static_checks + +#[allow(clippy::unnecessary_literal_unwrap)] +const _: fn() = || { + { + let Address = None::.unwrap(); + let _: Option = Address.administrative_area; + let _: String = Address.country; + let _: String = Address.country_code; + let _: Option> = Address.formatted_address_lines; + let _: Option = Address.locality; + let _: Option = Address.state_code; let _: Option = Address.street_address; let _: Option = Address.street_name; } - { - let AkData = None::.unwrap(); - let _: f32 = AkData.lat; - let _: f32 = AkData.lng; + { + let AkData = None::.unwrap(); + let _: f32 = AkData.lat; + let _: f32 = AkData.lng; + } + { + let ApsAlert = None::.unwrap(); + let _: String = ApsAlert.title; + let _: String = ApsAlert.body; + let _: String = ApsAlert.sbdy; + let _: String = ApsAlert.defbtn; + let _: String = ApsAlert.albtn; + } + { + let ApsData = None::.unwrap(); + let _: crate::api::api::ApsAlert = ApsData.alert; + } + { + let Attachment = None::.unwrap(); + let _: crate::api::api::AttachmentType = Attachment.a_type; + let _: u64 = Attachment.part; + let _: String = Attachment.uti_type; + let _: String = Attachment.mime; + let _: String = Attachment.name; + let _: bool = Attachment.iris; + } + { + let AttachmentMeta = None::.unwrap(); + let _: Option = AttachmentMeta.mime_type; + let _: i64 = AttachmentMeta.start_date; + let _: i64 = AttachmentMeta.total_bytes; + let _: i32 = AttachmentMeta.transfer_state; + let _: bool = AttachmentMeta.is_sticker; + let _: String = AttachmentMeta.guid; + let _: bool = AttachmentMeta.hide_attachment; + let _: Option = AttachmentMeta.user_info; + let _: Option = AttachmentMeta.filename; + let _: Option = AttachmentMeta.extras; + let _: bool = AttachmentMeta.is_outgoing; + let _: Option = AttachmentMeta.transfer_name; + let _: i32 = AttachmentMeta.version; + let _: Option = AttachmentMeta.uti; + let _: i64 = AttachmentMeta.created_date; + let _: Option = AttachmentMeta.pathc; + let _: Option = AttachmentMeta.md5; + } + { + let AttachmentMetaExtra = None::.unwrap(); + let _: Option = AttachmentMetaExtra.preview_generation_state; + } + match None::.unwrap() { + crate::api::api::AttachmentType::Inline(field0) => { + let _: Vec = field0; + } + crate::api::api::AttachmentType::MMCS(field0) => { + let _: crate::api::api::MMCSFile = field0; + } + } + { + let Balloon = None::.unwrap(); + let _: String = Balloon.url; + let _: Option = Balloon.session; + let _: Option = Balloon.layout; + let _: Option = Balloon.ld_text; + let _: bool = Balloon.is_live; + let _: Option> = Balloon.icon; + } + match None::.unwrap() { + crate::api::api::BalloonLayout::TemplateLayout { + image_subtitle, + image_title, + caption, + secondary_subcaption, + tertiary_subcaption, + subcaption, + class, + } => { + let _: String = image_subtitle; + let _: String = image_title; + let _: String = caption; + let _: String = secondary_subcaption; + let _: String = tertiary_subcaption; + let _: String = subcaption; + let _: crate::api::api::NSDictionaryClass = class; + } + } + { + let BeaconAttributes = None::.unwrap(); + let _: String = BeaconAttributes.name; + let _: i64 = BeaconAttributes.role_id; + let _: String = BeaconAttributes.emoji; + let _: String = BeaconAttributes.system_version; + let _: String = BeaconAttributes.serial_number; + } + { + let BeaconNamingRecord = None::.unwrap(); + let _: String = BeaconNamingRecord.emoji; + let _: String = BeaconNamingRecord.name; + let _: String = BeaconNamingRecord.associated_beacon; + let _: i64 = BeaconNamingRecord.role_id; + } + { + let CertifiedContext = None::.unwrap(); + let _: u32 = CertifiedContext.version; + let _: Vec = CertifiedContext.receipt; + let _: String = CertifiedContext.sender; + let _: String = CertifiedContext.target; + let _: Vec = CertifiedContext.uuid; + let _: Vec = CertifiedContext.token; + } + { + let ChangeParticipantMessage = None::.unwrap(); + let _: Vec = ChangeParticipantMessage.new_participants; + let _: u64 = ChangeParticipantMessage.group_version; + } + { + let ChatProto = None::.unwrap(); + let _: Option = ChatProto.unk1; + } + { + let CloudAttachment = None::.unwrap(); + let _: GZipWrapper = CloudAttachment.cm; + let _: Asset = CloudAttachment.lqa; + } + { + let CloudChat = None::.unwrap(); + let _: i64 = CloudChat.style; + let _: i64 = CloudChat.is_filtered; + let _: i64 = CloudChat.successful_query; + let _: i64 = CloudChat.state; + let _: String = CloudChat.chat_identifier; + let _: String = CloudChat.group_id; + let _: String = CloudChat.service_name; + let _: String = CloudChat.original_group_id; + let _: Option = CloudChat.properties; + let _: Vec = CloudChat.participants; + let _: crate::api::api::CloudProp001 = CloudChat.prop001; + let _: i64 = CloudChat.last_read_message_timestamp; + let _: String = CloudChat.last_addressed_handle; + let _: String = CloudChat.guid; + let _: Option = CloudChat.display_name; + let _: Option> = CloudChat.proto001; + let _: Option = CloudChat.group_photo_guid; + let _: Option = CloudChat.group_photo; + } + { + let CloudMessage = None::.unwrap(); + let _: Option = CloudMessage.utm; + let _: i64 = CloudMessage.r#type; + let _: i64 = CloudMessage.error; + let _: String = CloudMessage.chat_id; + let _: String = CloudMessage.sender; + let _: i64 = CloudMessage.time; + let _: Option> = CloudMessage.msg_proto_2; + let _: String = CloudMessage.destination_caller_id; + let _: GZipWrapper = CloudMessage.msg_proto; + let _: MessageFlags = CloudMessage.flags; + let _: String = CloudMessage.guid; + let _: Option> = CloudMessage.msg_proto_3; + let _: String = CloudMessage.service; + let _: Option> = CloudMessage.msg_proto_4; + } + { + let CloudMessageSummary = None::.unwrap(); + let _: Vec = CloudMessageSummary.messages_summary; + let _: Vec = CloudMessageSummary.chat_summary; + let _: Vec = CloudMessageSummary.attachment_summary; + } + { + let CloudParticipant = None::.unwrap(); + let _: String = CloudParticipant.uri; + } + { + let CloudProp = None::.unwrap(); + let _: Option = CloudProp.gpufc; + let _: Option = CloudProp.pv; + let _: Option = CloudProp.number_of_times_respondedto_thread; + let _: Option = CloudProp.should_force_to_sms; + let _: Option = CloudProp.last_seen_message_guid; + let _: Option = CloudProp.message_handshake_state; + let _: Vec = CloudProp.legacy_group_identifiers; + let _: Option = CloudProp.group_photo_guid; + let _: Option = CloudProp.last_modification_date; + } + { + let CloudProp001 = None::.unwrap(); + let _: u32 = CloudProp001.syndication_type; + } + { + let ConversationData = None::.unwrap(); + let _: Vec = ConversationData.participants; + let _: Option = ConversationData.cv_name; + let _: Option = ConversationData.sender_guid; + let _: Option = ConversationData.after_guid; + } + match None::.unwrap() { + crate::api::api::DeleteTarget::Chat(field0) => { + let _: crate::api::api::OperatedChat = field0; + } + crate::api::api::DeleteTarget::Messages(field0) => { + let _: Vec = field0; + } + } + { + let EditMessage = None::.unwrap(); + let _: String = EditMessage.tuuid; + let _: u64 = EditMessage.edit_part; + let _: crate::api::api::MessageParts = EditMessage.new_parts; + } + { + let ErrorMessage = None::.unwrap(); + let _: String = ErrorMessage.for_uuid; + let _: u64 = ErrorMessage.status; + let _: String = ErrorMessage.status_str; + } + { + let ExtensionApp = None::.unwrap(); + let _: String = ExtensionApp.name; + let _: Option = ExtensionApp.app_id; + let _: String = ExtensionApp.bundle_id; + let _: Option = ExtensionApp.balloon; + } + { + let Follow = None::.unwrap(); + let _: i64 = Follow.create_timestamp; + let _: i64 = Follow.expires; + let _: String = Follow.id; + let _: Vec = Follow.invitation_accepted_handles; + let _: Vec = Follow.invitation_from_handles; + let _: bool = Follow.is_from_messages; + let _: Option = Follow.offer_id; + let _: bool = Follow.only_in_event; + let _: String = Follow.person_id_hash; + let _: bool = Follow.secure_locations_capable; + let _: bool = Follow.shallow_or_live_secure_locations_capable; + let _: String = Follow.source; + let _: bool = Follow.tk_permission; + let _: i64 = Follow.update_timestamp; + let _: Option = Follow.fallback_to_legacy_allowed; + let _: Option = Follow.opted_not_to_share; + let _: Option = Follow.last_location; + let _: bool = Follow.locate_in_progress; + } + { + let FoundDevice = None::.unwrap(); + let _: Option = FoundDevice.device_model; + let _: Option = FoundDevice.low_power_mode; + let _: Option = FoundDevice.passcode_length; + let _: Option = FoundDevice.id; + let _: Option = FoundDevice.battery_status; + let _: Option = FoundDevice.lost_mode_capable; + let _: Option = FoundDevice.battery_level; + let _: Option = FoundDevice.location_enabled; + let _: Option = FoundDevice.is_considered_accessory; + let _: Option = FoundDevice.location; + let _: Option = FoundDevice.model_display_name; + let _: Option = FoundDevice.device_color; + let _: Option = FoundDevice.activation_locked; + let _: Option = FoundDevice.rm2_state; + let _: Option = FoundDevice.loc_found_enabled; + let _: Option = FoundDevice.nwd; + let _: Option = FoundDevice.device_status; + let _: Option = FoundDevice.fmly_share; + let _: std::collections::HashMap = FoundDevice.features; + let _: Option = FoundDevice.this_device; + let _: Option = FoundDevice.lost_mode_enabled; + let _: Option = FoundDevice.device_display_name; + let _: Option = FoundDevice.name; + let _: Option = FoundDevice.can_wipe_after_lock; + let _: Option = FoundDevice.is_mac; + let _: Option = FoundDevice.raw_device_model; + let _: Option = FoundDevice.ba_uuid; + let _: Option = FoundDevice.device_discovery_id; + let _: Option = FoundDevice.scd; + let _: Option = FoundDevice.location_capable; + let _: Option = FoundDevice.wipe_in_progress; + let _: Option = FoundDevice.dark_wake; + let _: Option = FoundDevice.device_with_you; + let _: Option = FoundDevice.max_msg_char; + let _: Option = FoundDevice.device_class; + } + { + let FTMember = None::.unwrap(); + let _: Option = FTMember.nickname; + let _: String = FTMember.handle; + } + match None::.unwrap() { + crate::api::api::FTMessage::LetMeInRequest(field0) => { + let _: crate::api::api::LetMeInRequest = field0; + } + crate::api::api::FTMessage::LinkChanged { guid } => { + let _: String = guid; + } + crate::api::api::FTMessage::JoinEvent { + guid, + participant, + handle, + ring, + } => { + let _: String = guid; + let _: u64 = participant; + let _: String = handle; + let _: bool = ring; + } + crate::api::api::FTMessage::AddMembers { + guid, + members, + ring, + } => { + let _: String = guid; + let _: std::collections::HashSet = members; + let _: bool = ring; + } + crate::api::api::FTMessage::RemoveMembers { guid, members } => { + let _: String = guid; + let _: std::collections::HashSet = members; + } + crate::api::api::FTMessage::LeaveEvent { + guid, + participant, + handle, + } => { + let _: String = guid; + let _: u64 = participant; + let _: String = handle; + } + crate::api::api::FTMessage::Ring { guid } => { + let _: String = guid; + } + crate::api::api::FTMessage::Decline { guid } => { + let _: String = guid; + } + crate::api::api::FTMessage::RespondedElsewhere { guid } => { + let _: String = guid; + } + } + { + let FTParticipant = None::.unwrap(); + let _: Option = FTParticipant.token; + let _: String = FTParticipant.handle; + let _: u64 = FTParticipant.participant_id; + let _: Option = FTParticipant.last_join_date; + let _: Option = FTParticipant.active; + } + { + let FTSession = None::.unwrap(); + let _: String = FTSession.group_id; + let _: Vec = FTSession.my_handles; + let _: std::collections::HashMap = + FTSession.participants; + let _: Option = FTSession.link; + let _: std::collections::HashSet = FTSession.members; + let _: String = FTSession.report_id; + let _: Option = FTSession.start_time; + let _: Option = FTSession.last_rekey; + let _: bool = FTSession.is_propped; + let _: bool = FTSession.is_ringing_inaccurate; + let _: Option = FTSession.mode; + let _: std::collections::HashMap = FTSession.recent_member_adds; + } + { + let IMessageNameRecord = None::.unwrap(); + let _: String = IMessageNameRecord.name; + let _: String = IMessageNameRecord.first; + let _: String = IMessageNameRecord.last; + } + { + let IMessageNicknameRecord = None::.unwrap(); + let _: crate::api::api::IMessageNameRecord = IMessageNicknameRecord.name; + let _: Option> = IMessageNicknameRecord.image; + let _: Option = IMessageNicknameRecord.poster; + } + { + let IMessagePosterRecord = None::.unwrap(); + let _: Vec = IMessagePosterRecord.low_res_poster; + let _: Vec = IMessagePosterRecord.package; + let _: Vec = IMessagePosterRecord.meta; + } + { + let IconChangeMessage = None::.unwrap(); + let _: Option = IconChangeMessage.file; + let _: u64 = IconChangeMessage.group_version; + } + { + let IdmsCircleMessage = None::.unwrap(); + let _: u32 = IdmsCircleMessage.step; + let _: String = IdmsCircleMessage.atxnid; + let _: Option = IdmsCircleMessage.pake; + let _: Option = IdmsCircleMessage.ec; + let _: String = IdmsCircleMessage.idmsdata; + } + match None::.unwrap() { + crate::api::api::IdmsMessage::RequestedSignIn(field0) => { + let _: crate::api::api::IdmsRequestedSignIn = field0; + } + crate::api::api::IdmsMessage::TeardownSignIn(field0) => { + let _: crate::api::api::TeardownSignIn = field0; + } + crate::api::api::IdmsMessage::CircleRequest(field0, field1) => { + let _: crate::api::api::IdmsCircleMessage = field0; + let _: Option = field1; + } + } + { + let IdmsRequestedSignIn = None::.unwrap(); + let _: crate::api::api::ApsData = IdmsRequestedSignIn.aps; + let _: String = IdmsRequestedSignIn.txnid; + let _: crate::api::api::AkData = IdmsRequestedSignIn.akdata; + let _: String = IdmsRequestedSignIn.adsid; + } + { + let IndexedMessagePart = None::.unwrap(); + let _: crate::api::api::MessagePart = IndexedMessagePart.part; + let _: Option = IndexedMessagePart.idx; + let _: Option = IndexedMessagePart.ext; + } + { + let LetMeInRequest = None::.unwrap(); + let _: Vec = LetMeInRequest.shared_secret; + let _: String = LetMeInRequest.pseud; + let _: String = LetMeInRequest.requestor; + let _: Option = LetMeInRequest.nickname; + let _: Vec = LetMeInRequest.token; + let _: Option = LetMeInRequest.delegation_uuid; + let _: Option = LetMeInRequest.usage; + } + { + let LinkMeta = None::.unwrap(); + let _: crate::api::api::LPLinkMetadata = LinkMeta.data; + let _: Vec> = LinkMeta.attachments; + } + { + let Location = None::.unwrap(); + let _: Option = Location.address; + let _: f64 = Location.altitude; + let _: i64 = Location.floor_level; + let _: f64 = Location.horizontal_accuracy; + let _: bool = Location.is_inaccurate; + let _: f64 = Location.latitude; + let _: Option = Location.location_id; + let _: Option = Location.location_timestamp; + let _: f64 = Location.longitude; + let _: i64 = Location.secure_location_ts; + let _: i64 = Location.timestamp; + let _: f64 = Location.vertical_accuracy; + let _: Option = Location.position_type; + let _: Option = Location.is_old; + let _: Option = Location.location_finished; + } + match None::.unwrap() { + crate::api::api::LoginState::LoggedIn => {} + crate::api::api::LoginState::NeedsDevice2FA => {} + crate::api::api::LoginState::Needs2FAVerification => {} + crate::api::api::LoginState::NeedsSMS2FA => {} + crate::api::api::LoginState::NeedsSMS2FAVerification(field0) => { + let _: VerifyBody = field0; + } + crate::api::api::LoginState::NeedsExtraStep(field0) => { + let _: String = field0; + } + crate::api::api::LoginState::NeedsLogin => {} + } + { + let LPIconMetadata = None::.unwrap(); + let _: crate::api::api::NSURL = LPIconMetadata.url; + let _: u8 = LPIconMetadata.version; + } + { + let LPImageMetadata = None::.unwrap(); + let _: String = LPImageMetadata.size; + let _: crate::api::api::NSURL = LPImageMetadata.url; + let _: u8 = LPImageMetadata.version; + } + { + let LPLinkMetadata = None::.unwrap(); + let _: Option = LPLinkMetadata.image_metadata; + let _: u8 = LPLinkMetadata.version; + let _: Option = LPLinkMetadata.icon_metadata; + let _: Option = LPLinkMetadata.original_url; + let _: Option = LPLinkMetadata.url; + let _: Option = LPLinkMetadata.title; + let _: Option = LPLinkMetadata.summary; + let _: Option = LPLinkMetadata.image; + let _: Option = LPLinkMetadata.icon; + let _: Option> = LPLinkMetadata.images; + let _: Option> = LPLinkMetadata.icons; + let _: Option = LPLinkMetadata.is_incomplete; + let _: Option = LPLinkMetadata.uses_activity_pub; + let _: Option = LPLinkMetadata.is_encoded_for_local_use; + let _: Option = LPLinkMetadata.collaboration_type; + let _: Option = LPLinkMetadata.specialization2; + } + match None::.unwrap() { + crate::api::api::LPSpecializationMetadata::LPPasswordsInviteMetadata { + group_name, + url_parameters, + } => { + let _: String = group_name; + let _: String = url_parameters; + } + } + { + let MemojiData = None::.unwrap(); + let _: crate::api::api::PosterColor = MemojiData.background_color_description; + let _: Vec = MemojiData.avatar_record_data; + let _: Vec = MemojiData.avatar_pose_data; + let _: bool = MemojiData.has_body; + let _: Vec = MemojiData.avatar_image_data; + } + match None::.unwrap() { + crate::api::api::Message::Message(field0) => { + let _: crate::api::api::NormalMessage = field0; + } + crate::api::api::Message::RenameMessage(field0) => { + let _: crate::api::api::RenameMessage = field0; + } + crate::api::api::Message::ChangeParticipants(field0) => { + let _: crate::api::api::ChangeParticipantMessage = field0; + } + crate::api::api::Message::React(field0) => { + let _: crate::api::api::ReactMessage = field0; + } + crate::api::api::Message::Delivered => {} + crate::api::api::Message::Read => {} + crate::api::api::Message::Typing(field0, field1) => { + let _: bool = field0; + let _: Option = field1; + } + crate::api::api::Message::Unsend(field0) => { + let _: crate::api::api::UnsendMessage = field0; + } + crate::api::api::Message::Edit(field0) => { + let _: crate::api::api::EditMessage = field0; + } + crate::api::api::Message::IconChange(field0) => { + let _: crate::api::api::IconChangeMessage = field0; + } + crate::api::api::Message::EnableSmsActivation(field0) => { + let _: bool = field0; + } + crate::api::api::Message::MessageReadOnDevice => {} + crate::api::api::Message::SmsConfirmSent(field0) => { + let _: bool = field0; + } + crate::api::api::Message::MarkUnread => {} + crate::api::api::Message::PeerCacheInvalidate => {} + crate::api::api::Message::UpdateExtension(field0) => { + let _: crate::api::api::UpdateExtensionMessage = field0; + } + crate::api::api::Message::Error(field0) => { + let _: crate::api::api::ErrorMessage = field0; + } + crate::api::api::Message::MoveToRecycleBin(field0) => { + let _: crate::api::api::MoveToRecycleBinMessage = field0; + } + crate::api::api::Message::RecoverChat(field0) => { + let _: crate::api::api::OperatedChat = field0; + } + crate::api::api::Message::PermanentDelete(field0) => { + let _: crate::api::api::PermanentDeleteMessage = field0; + } + crate::api::api::Message::Unschedule => {} + crate::api::api::Message::UpdateProfile(field0) => { + let _: crate::api::api::UpdateProfileMessage = field0; + } + crate::api::api::Message::UpdateProfileSharing(field0) => { + let _: crate::api::api::UpdateProfileSharingMessage = field0; + } + crate::api::api::Message::ShareProfile(field0) => { + let _: crate::api::api::ShareProfileMessage = field0; + } + crate::api::api::Message::NotifyAnyways => {} + crate::api::api::Message::SetTranscriptBackground(field0) => { + let _: crate::api::api::SetTranscriptBackgroundMessage = field0; + } + } + { + let MessageEdit = None::.unwrap(); + let _: Vec = MessageEdit.t; + let _: f64 = MessageEdit.d; + let _: Option = MessageEdit.bcg; + } + { + let MessageEditRange = None::.unwrap(); + let _: u32 = MessageEditRange.lo; + let _: u32 = MessageEditRange.le; + } + { + let MessageInst = None::.unwrap(); + let _: String = MessageInst.id; + let _: Option = MessageInst.sender; + let _: Option = MessageInst.conversation; + let _: crate::api::api::Message = MessageInst.message; + let _: u64 = MessageInst.sent_timestamp; + let _: Option> = MessageInst.target; + let _: bool = MessageInst.send_delivered; + let _: bool = MessageInst.verification_failed; + let _: Option = MessageInst.certified_context; + } + match None::.unwrap() { + crate::api::api::MessagePart::Text(field0, field1) => { + let _: String = field0; + let _: crate::api::api::TextFormat = field1; + } + crate::api::api::MessagePart::Attachment(field0) => { + let _: crate::api::api::Attachment = field0; + } + crate::api::api::MessagePart::Mention(field0, field1) => { + let _: String = field0; + let _: String = field1; + } + crate::api::api::MessagePart::Object(field0) => { + let _: String = field0; + } + } + { + let MessageParts_ = None::.unwrap(); + let _: Vec = MessageParts_.0; + } + { + let MessageProto = None::.unwrap(); + let _: u32 = MessageProto.unk1; + let _: Option = MessageProto.subject; + let _: Option = MessageProto.text; + let _: Option> = MessageProto.attributed_body; + let _: Option = MessageProto.balloon_bundle_id; + let _: Option> = MessageProto.payload_data; + let _: Option> = MessageProto.message_summary_info; + let _: Option = MessageProto.effect; + let _: Option = MessageProto.date_read; + let _: Option = MessageProto.unk10; + let _: Option = MessageProto.unk11; + let _: Option = MessageProto.date_delivered; + let _: Option = MessageProto.unk14; + let _: Option = MessageProto.associated_message_type; + let _: Option = MessageProto.associated_message_guid; + let _: Option = MessageProto.associated_message_range_location; + let _: Option = MessageProto.associated_message_range_length; + } + { + let MessageProto2 = None::.unwrap(); + let _: Option = MessageProto2.reply; + } + { + let MessageProto3 = None::.unwrap(); + let _: Option = MessageProto3.unk2; + let _: Option = MessageProto3.unk3; + } + { + let MessageProto4 = None::.unwrap(); + let _: Option = MessageProto4.associated_message_emoji; + let _: Option = MessageProto4.service; + let _: Option = MessageProto4.schedule_type; + let _: Option = MessageProto4.schedule_state; + let _: Option = MessageProto4.group_id; + let _: Option = MessageProto4.sent_or_received_off_grid; + } + { + let MessageSummaryInfo = None::.unwrap(); + let _: Option = MessageSummaryInfo.ams; + let _: Option> = MessageSummaryInfo.ampt; + let _: Option = MessageSummaryInfo.amc; + let _: Option = MessageSummaryInfo.amb; + let _: Option = MessageSummaryInfo.amd; + let _: std::collections::HashMap> = + MessageSummaryInfo.ec; + let _: Vec = MessageSummaryInfo.ep; + let _: std::collections::HashMap = + MessageSummaryInfo.otr; + let _: Option = MessageSummaryInfo.ust; + let _: Vec = MessageSummaryInfo.rp; + let _: Option = MessageSummaryInfo.hbr; + let _: Option = MessageSummaryInfo.oui; + let _: Option = MessageSummaryInfo.osn; + let _: Vec = MessageSummaryInfo.euh; + } + match None::.unwrap() { + crate::api::api::MessageTarget::Token(field0) => { + let _: Vec = field0; + } + crate::api::api::MessageTarget::Uuid(field0) => { + let _: String = field0; + } + } + match None::.unwrap() { + crate::api::api::MessageType::IMessage => {} + crate::api::api::MessageType::SMS { + is_phone, + using_number, + from_handle, + } => { + let _: bool = is_phone; + let _: String = using_number; + let _: Option = from_handle; + } + } + { + let MMCSAttachmentMeta = None::.unwrap(); + let _: Option = MMCSAttachmentMeta.mmcs_signature_hex; + let _: Option = MMCSAttachmentMeta.mmcs_owner; + let _: Option = MMCSAttachmentMeta.mmcs_url; + let _: Option = MMCSAttachmentMeta.decryption_key; + let _: Option = MMCSAttachmentMeta.inline_attachment; + let _: Option = MMCSAttachmentMeta.message_part; + let _: Option = MMCSAttachmentMeta.file_size; + let _: Option = MMCSAttachmentMeta.uti_type; + let _: Option = MMCSAttachmentMeta.mime_type; + let _: Option = MMCSAttachmentMeta.name; + } + { + let MMCSFile = None::.unwrap(); + let _: Vec = MMCSFile.signature; + let _: String = MMCSFile.object; + let _: String = MMCSFile.url; + let _: Vec = MMCSFile.key; + let _: usize = MMCSFile.size; + } + { + let MonogramData = None::.unwrap(); + let _: crate::api::api::PosterColor = MonogramData.top_background_color_description; + let _: crate::api::api::PosterColor = MonogramData.background_color_description; + let _: String = MonogramData.initials; + let _: bool = MonogramData.monogram_supported_for_name; + } + { + let MoveToRecycleBinMessage = None::.unwrap(); + let _: crate::api::api::DeleteTarget = MoveToRecycleBinMessage.target; + let _: u64 = MoveToRecycleBinMessage.recoverable_delete_date; + } + { + let NormalMessage = None::.unwrap(); + let _: crate::api::api::MessageParts = NormalMessage.parts; + let _: Option = NormalMessage.effect; + let _: Option = NormalMessage.reply_guid; + let _: Option = NormalMessage.reply_part; + let _: crate::api::api::MessageType = NormalMessage.service; + let _: Option = NormalMessage.subject; + let _: Option = NormalMessage.app; + let _: Option = NormalMessage.link_meta; + let _: bool = NormalMessage.voice; + let _: Option = NormalMessage.scheduled; + let _: Option = NormalMessage.embedded_profile; + } + { + let NSAttributedString = None::.unwrap(); + let _: String = NSAttributedString.text; + let _: Vec<(u32, crate::api::api::NSDictionaryTypedCoder)> = NSAttributedString.ranges; + } + { + let NSDictionaryTypedCoder_ = None::.unwrap(); + let _: std::collections::HashMap = NSDictionaryTypedCoder_.0; + } + { + let NSNumber_ = None::.unwrap(); + let _: u32 = NSNumber_.0; + } + { + let NSString_ = None::.unwrap(); + let _: String = NSString_.0; + } + { + let NSURL = None::.unwrap(); + let _: String = NSURL.base; + let _: String = NSURL.relative; + } + match None::.unwrap() { + crate::api::api::NumOrString::Num(field0) => { + let _: u32 = field0; + } + crate::api::api::NumOrString::String(field0) => { + let _: String = field0; + } + crate::api::api::NumOrString::Bool(field0) => { + let _: bool = field0; + } + } + { + let OperatedChat = None::.unwrap(); + let _: Vec = OperatedChat.participants; + let _: String = OperatedChat.group_id; + let _: String = OperatedChat.guid; + let _: Option = OperatedChat.delete_incoming_messages; + let _: Option = OperatedChat.was_reported_as_junk; + } + match None::.unwrap() { + crate::api::api::PartExtension::Sticker { + msg_width, + rotation, + sai, + scale, + update, + sli, + normalized_x, + normalized_y, + version, + hash, + safi, + effect_type, + sticker_id, + } => { + let _: f64 = msg_width; + let _: f64 = rotation; + let _: u64 = sai; + let _: f64 = scale; + let _: Option = update; + let _: u64 = sli; + let _: f64 = normalized_x; + let _: f64 = normalized_y; + let _: u64 = version; + let _: String = hash; + let _: u64 = safi; + let _: i64 = effect_type; + let _: String = sticker_id; + } + } + { + let Passkey = None::.unwrap(); + let _: u64 = Passkey.cdat; + let _: u64 = Passkey.mdat; + let _: String = Passkey.agrp; + let _: String = Passkey.labl; + let _: Vec = Passkey.data; + let _: Vec = Passkey.atag; + let _: Vec = Passkey.klbl; + } + { + let PasswordManagerAltDomain = None::.unwrap(); + let _: String = PasswordManagerAltDomain.domain; + } + { + let PasswordManagerMeta = None::.unwrap(); + let _: u64 = PasswordManagerMeta.cdat; + let _: u64 = PasswordManagerMeta.mdat; + let _: String = PasswordManagerMeta.srvr; + let _: String = PasswordManagerMeta.acct; + let _: String = PasswordManagerMeta.agrp; + let _: Vec = PasswordManagerMeta.data; + } + { + let PasswordManagerMetaChange = None::.unwrap(); + let _: u64 = PasswordManagerMetaChange.date; + let _: Option = PasswordManagerMetaChange.password; + let _: Option = PasswordManagerMetaChange.old_password; + let _: Option = PasswordManagerMetaChange.group_name; + let _: Option = PasswordManagerMetaChange.group_id; + let _: Option = PasswordManagerMetaChange.share_type; + let _: String = PasswordManagerMetaChange.id; + let _: String = PasswordManagerMetaChange.typ; + } + { + let PasswordManagerMetaData = None::.unwrap(); + let _: Vec = PasswordManagerMetaData.history; + let _: Vec = PasswordManagerMetaData.alt_domains; + let _: Option = PasswordManagerMetaData.totp; + let _: std::collections::HashMap = + PasswordManagerMetaData.ctxt; + let _: Option> = PasswordManagerMetaData.title; + let _: Option> = PasswordManagerMetaData.notes; + let _: Option = + PasswordManagerMetaData.formerly_shared; + let _: Option> = PasswordManagerMetaData.ocpid; + } + { + let PasswordManagerMetaDataCtx = + None::.unwrap(); + let _: f64 = PasswordManagerMetaDataCtx.last_used; + } + { + let PasswordManagerMetaDataFormerlyShared = + None::.unwrap(); + let _: Option = PasswordManagerMetaDataFormerlyShared.group_name; + let _: Option = + PasswordManagerMetaDataFormerlyShared.password_manager_credential_identifier; + } + { + let PasswordManagerTotp = None::.unwrap(); + let _: Vec = PasswordManagerTotp.secret; + let _: u32 = PasswordManagerTotp.digits; + let _: Option = PasswordManagerTotp.issuer; + let _: u32 = PasswordManagerTotp.period; + let _: u64 = PasswordManagerTotp.initial_date; + let _: u32 = PasswordManagerTotp.algorithm; + let _: Option = PasswordManagerTotp.account_name; + let _: Option = PasswordManagerTotp.original_url; + } + { + let PasswordRawEntry = None::.unwrap(); + let _: u64 = PasswordRawEntry.cdat; + let _: u64 = PasswordRawEntry.mdat; + let _: String = PasswordRawEntry.srvr; + let _: String = PasswordRawEntry.acct; + let _: String = PasswordRawEntry.agrp; + let _: Vec = PasswordRawEntry.data; + } + { + let PermanentDeleteMessage = None::.unwrap(); + let _: crate::api::api::DeleteTarget = PermanentDeleteMessage.target; + let _: bool = PermanentDeleteMessage.is_scheduled; + } + { + let PhotoPosterContents = None::.unwrap(); + let _: u32 = PhotoPosterContents.version; + let _: Vec = PhotoPosterContents.layers; + let _: crate::api::api::PhotoPosterProperties = PhotoPosterContents.properties; + } + { + let PhotoPosterContentsFrame = None::.unwrap(); + let _: f64 = PhotoPosterContentsFrame.width; + let _: f64 = PhotoPosterContentsFrame.height; + let _: f64 = PhotoPosterContentsFrame.x; + let _: f64 = PhotoPosterContentsFrame.y; + } + { + let PhotoPosterContentsSize = None::.unwrap(); + let _: f64 = PhotoPosterContentsSize.width; + let _: f64 = PhotoPosterContentsSize.height; + } + { + let PhotoPosterLayer = None::.unwrap(); + let _: crate::api::api::PhotoPosterContentsFrame = PhotoPosterLayer.frame; + let _: String = PhotoPosterLayer.filename; + let _: f32 = PhotoPosterLayer.z_position; + let _: String = PhotoPosterLayer.identifier; + } + { + let PhotoPosterLayout = None::.unwrap(); + let _: u32 = PhotoPosterLayout.clock_intersection; + let _: crate::api::api::PhotoPosterContentsSize = PhotoPosterLayout.device_resolution; + let _: crate::api::api::PhotoPosterContentsFrame = PhotoPosterLayout.visible_frame; + let _: crate::api::api::PhotoPosterContentsFrame = PhotoPosterLayout.time_frame; + let _: String = PhotoPosterLayout.clock_layer_order; + let _: bool = PhotoPosterLayout.has_top_edge_contact; + let _: crate::api::api::PhotoPosterContentsFrame = PhotoPosterLayout.inactive_frame; + let _: crate::api::api::PhotoPosterContentsSize = PhotoPosterLayout.image_size; + let _: crate::api::api::PhotoPosterContentsSize = PhotoPosterLayout.parallax_padding; + } + { + let PhotoPosterProperties = None::.unwrap(); + let _: crate::api::api::PhotoPosterLayout = PhotoPosterProperties.portrait_layout; + let _: bool = PhotoPosterProperties.settling_effect_enabled; + let _: bool = PhotoPosterProperties.depth_enabled; + let _: f64 = PhotoPosterProperties.clock_area_luminance; + let _: bool = PhotoPosterProperties.parallax_disabled; + } + { + let PosterAsset = None::.unwrap(); + let _: crate::api::api::PhotoPosterContents = PosterAsset.contents; + let _: std::collections::HashMap> = PosterAsset.files; + let _: String = PosterAsset.uuid; + } + { + let PosterColor = None::.unwrap(); + let _: f64 = PosterColor.alpha; + let _: f64 = PosterColor.blue; + let _: f64 = PosterColor.green; + let _: f64 = PosterColor.red; + } + match None::.unwrap() { + crate::api::api::PosterType::Photo { assets } => { + let _: Vec = assets; + } + crate::api::api::PosterType::Monogram { data, background } => { + let _: crate::api::api::MonogramData = data; + let _: crate::api::api::PosterColor = background; + } + crate::api::api::PosterType::Memoji { data, background } => { + let _: crate::api::api::MemojiData = data; + let _: crate::api::api::PosterColor = background; + } + crate::api::api::PosterType::TranscriptDynamic { data } => { + let _: crate::api::api::TranscriptDynamicUserData = data; + } + crate::api::api::PosterType::TranscriptGradient { colors } => { + let _: Vec = colors; + } + } + { + let PRPosterColor = None::.unwrap(); + let _: u32 = PRPosterColor.preferred_style; + let _: String = PRPosterColor.identifier; + let _: bool = PRPosterColor.suggested; + let _: crate::api::api::UIColor = PRPosterColor.color; + } + match None::.unwrap() { + crate::api::api::PRPosterContentMaterialStyle::PRPosterContentDiscreteColorsStyle { + variation, + colors, + vibrant, + supports_variation, + needs_to_resolve_variation, + } => { + let _: f32 = variation; + let _: Vec = colors; + let _: bool = vibrant; + let _: bool = supports_variation; + let _: bool = needs_to_resolve_variation; + } + crate::api::api::PRPosterContentMaterialStyle::PRPosterContentVibrantMaterialStyle => {} + crate::api::api::PRPosterContentMaterialStyle::PRPosterContentGradientStyle { + gradient_type, + colors, + start_point, + locations, + end_point, + } => { + let _: u32 = gradient_type; + let _: Vec = colors; + let _: String = start_point; + let _: Vec = locations; + let _: String = end_point; + } + } + { + let PRPosterSystemTimeFontConfiguration = + None::.unwrap(); + let _: bool = PRPosterSystemTimeFontConfiguration.is_system_item; + let _: String = PRPosterSystemTimeFontConfiguration.time_font_identifier; + let _: f64 = PRPosterSystemTimeFontConfiguration.weight; + } + { + let PRPosterTitleStyleConfiguration = + None::.unwrap(); + let _: bool = PRPosterTitleStyleConfiguration.alternate_date_enabled; + let _: f64 = PRPosterTitleStyleConfiguration.contents_luminence; + let _: String = PRPosterTitleStyleConfiguration.group_name; + let _: u32 = PRPosterTitleStyleConfiguration.preferred_title_alignment; + let _: u32 = PRPosterTitleStyleConfiguration.preferred_title_layout; + let _: crate::api::api::PRPosterSystemTimeFontConfiguration = + PRPosterTitleStyleConfiguration.time_font_configuration; + let _: Option> = PRPosterTitleStyleConfiguration.time_numbering_system; + let _: crate::api::api::PRPosterColor = PRPosterTitleStyleConfiguration.title_color; + let _: Vec = PRPosterTitleStyleConfiguration.title_content_style; + let _: bool = PRPosterTitleStyleConfiguration.user_configured; + let _: Option = + PRPosterTitleStyleConfiguration.title_style; + } + { + let PrivateDeviceInfo = None::.unwrap(); + let _: Option = PrivateDeviceInfo.uuid; + let _: Option = PrivateDeviceInfo.device_name; + let _: Vec = PrivateDeviceInfo.token; + let _: bool = PrivateDeviceInfo.is_hsa_trusted; + let _: Vec = PrivateDeviceInfo.identites; + let _: Vec = PrivateDeviceInfo.sub_services; + } + { + let ReactMessage = None::.unwrap(); + let _: String = ReactMessage.to_uuid; + let _: Option = ReactMessage.to_part; + let _: crate::api::api::ReactMessageType = ReactMessage.reaction; + let _: String = ReactMessage.to_text; + let _: Option = ReactMessage.embedded_profile; + } + match None::.unwrap() { + crate::api::api::ReactMessageType::React { reaction, enable } => { + let _: crate::api::api::Reaction = reaction; + let _: bool = enable; + } + crate::api::api::ReactMessageType::Extension { + spec, + body, + is_meta, + } => { + let _: crate::api::api::ExtensionApp = spec; + let _: crate::api::api::MessageParts = body; + let _: bool = is_meta; + } + } + match None::.unwrap() { + crate::api::api::Reaction::Heart => {} + crate::api::api::Reaction::Like => {} + crate::api::api::Reaction::Dislike => {} + crate::api::api::Reaction::Laugh => {} + crate::api::api::Reaction::Emphasize => {} + crate::api::api::Reaction::Question => {} + crate::api::api::Reaction::Emoji(field0) => { + let _: String = field0; + } + crate::api::api::Reaction::Sticker { spec, body } => { + let _: Option = spec; + let _: crate::api::api::MessageParts = body; + } + } + { + let RenameMessage = None::.unwrap(); + let _: String = RenameMessage.new_name; + } + { + let ReportMessage = None::.unwrap(); + let _: String = ReportMessage.guid; + let _: String = ReportMessage.sender; + let _: u32 = ReportMessage.conversation_size; + let _: crate::api::api::MessageParts = ReportMessage.parts; + let _: f64 = ReportMessage.time_of_message; + } + { + let RichLinkImageAttachmentSubstitute = + None::.unwrap(); + let _: String = RichLinkImageAttachmentSubstitute.mime_type; + let _: u64 = RichLinkImageAttachmentSubstitute.rich_link_image_attachment_substitute_index; + } + { + let ScheduleMode = None::.unwrap(); + let _: u64 = ScheduleMode.ms; + let _: bool = ScheduleMode.schedule; + } + match None::.unwrap() { + crate::api::api::SetTranscriptBackgroundMessage::Remove { + aid, + bid, + chat_id, + remove, + } => { + let _: u32 = aid; + let _: u64 = bid; + let _: Option = chat_id; + let _: bool = remove; + } + crate::api::api::SetTranscriptBackgroundMessage::Set { + aid, + bid, + chat_id, + object_id, + payload_version, + background_id, + url, + signature, + key, + file_size, + } => { + let _: u32 = aid; + let _: u64 = bid; + let _: Option = chat_id; + let _: String = object_id; + let _: u32 = payload_version; + let _: String = background_id; + let _: String = url; + let _: String = signature; + let _: String = key; + let _: usize = file_size; + } + } + { + let ShareInviteContentData = None::.unwrap(); + let _: Vec = ShareInviteContentData.invitation_token; + let _: String = ShareInviteContentData.group_id; + let _: Date = ShareInviteContentData.sent_time; + let _: String = ShareInviteContentData.group_name; + let _: String = ShareInviteContentData.share_url; + let _: String = ShareInviteContentData.invitee_handle; + } + { + let ShareProfileMessage = None::.unwrap(); + let _: Vec = ShareProfileMessage.cloud_kit_decryption_record_key; + let _: String = ShareProfileMessage.cloud_kit_record_key; + let _: Option = ShareProfileMessage.poster; + } + { + let SharedAlbum = None::.unwrap(); + let _: Option = SharedAlbum.name; + let _: Option = SharedAlbum.fullname; + let _: Option = SharedAlbum.email; + let _: String = SharedAlbum.albumguid; + let _: String = SharedAlbum.sharingtype; + let _: Option = SharedAlbum.subscriptiondate; + let _: Option = SharedAlbum.albumlocation; + let _: Vec = SharedAlbum.assets; + let _: Option = SharedAlbum.delete; + } + { + let SharedPoster = None::.unwrap(); + let _: Vec = SharedPoster.low_res_wallpaper_tag; + let _: Vec = SharedPoster.wallpaper_tag; + let _: Vec = SharedPoster.message_tag; + } + { + let SimplifiedIncomingCallPoster = + None::.unwrap(); + let _: crate::api::api::SimplifiedPoster = SimplifiedIncomingCallPoster.poster; + let _: crate::api::api::WallpaperMetadata = SimplifiedIncomingCallPoster.text_metadata; + let _: Vec = SimplifiedIncomingCallPoster.low_res; + } + { + let SimplifiedPoster = None::.unwrap(); + let _: crate::api::api::PRPosterTitleStyleConfiguration = + SimplifiedPoster.title_configuration; + let _: crate::api::api::PosterType = SimplifiedPoster.r#type; + let _: crate::api::api::PosterRole = SimplifiedPoster.role; + } + { + let SimplifiedTranscriptPoster = + None::.unwrap(); + let _: crate::api::api::WatchBackground = SimplifiedTranscriptPoster.watch; + let _: crate::api::api::SimplifiedPoster = SimplifiedTranscriptPoster.poster; + } + match None::.unwrap() { + crate::api::api::StatusKitMessage::StatusChanged { + user, + mode, + allowed, + } => { + let _: String = user; + let _: Option = mode; + let _: bool = allowed; + } + } + { + let StatusKitPersonalConfig = None::.unwrap(); + let _: Vec = StatusKitPersonalConfig.allowed_modes; + } + { + let SupportAction = None::.unwrap(); + let _: String = SupportAction.url; + let _: String = SupportAction.button; + } + { + let SupportAlert = None::.unwrap(); + let _: String = SupportAlert.title; + let _: String = SupportAlert.body; + let _: Option = SupportAlert.action; + } + match None::.unwrap() { + crate::api::api::SyncStatus::Synced => {} + crate::api::api::SyncStatus::Downloading { progress, total } => { + let _: usize = progress; + let _: usize = total; + } + crate::api::api::SyncStatus::Uploading { progress, total } => { + let _: usize = progress; + let _: usize = total; + } + crate::api::api::SyncStatus::Syncing => {} + } + { + let TeardownSignIn = None::.unwrap(); + let _: String = TeardownSignIn.prevtxnid; + } + { + let TextFlags = None::.unwrap(); + let _: bool = TextFlags.bold; + let _: bool = TextFlags.italic; + let _: bool = TextFlags.underline; + let _: bool = TextFlags.strikethrough; + } + match None::.unwrap() { + crate::api::api::TextFormat::Flags(field0) => { + let _: crate::api::api::TextFlags = field0; + } + crate::api::api::TextFormat::Effect(field0) => { + let _: crate::api::api::TextEffect = field0; + } + } + { + let TranscriptDynamicUserData = None::.unwrap(); + let _: String = TranscriptDynamicUserData.identifier; + } + { + let TrustedPhoneNumber = None::.unwrap(); + let _: String = TrustedPhoneNumber.number_with_dial_code; + let _: String = TrustedPhoneNumber.last_two_digits; + let _: String = TrustedPhoneNumber.push_mode; + let _: u32 = TrustedPhoneNumber.id; + } + { + let TypingApp = None::.unwrap(); + let _: String = TypingApp.bundle_id; + let _: Vec = TypingApp.icon; + } + match None::.unwrap() { + crate::api::api::UIColor::RGBAColorSpace { + color_components, + green, + blue, + red, + green_dbl, + blue_dbl, + red_dbl, + alpha_dbl, + alpha, + rgb, + color_space, + class, + } => { + let _: u32 = color_components; + let _: f64 = green; + let _: f64 = blue; + let _: f64 = red; + let _: Option = green_dbl; + let _: Option = blue_dbl; + let _: Option = red_dbl; + let _: Option = alpha_dbl; + let _: f64 = alpha; + let _: Vec = rgb; + let _: u32 = color_space; + let _: String = class; + } + crate::api::api::UIColor::GrayscaleAlphaColorSpace { + color_components, + white, + alpha, + bin, + color_space, + class, + } => { + let _: u32 = color_components; + let _: f64 = white; + let _: f64 = alpha; + let _: Vec = bin; + let _: u32 = color_space; + let _: String = class; + } + } + { + let UnsendMessage = None::.unwrap(); + let _: String = UnsendMessage.tuuid; + let _: u64 = UnsendMessage.edit_part; + } + match None::.unwrap() { + crate::api::api::UpdateAccountFinish::MacOS => {} + crate::api::api::UpdateAccountFinish::IOS { url } => { + let _: String = url; + } + } + { + let UpdateExtensionMessage = None::.unwrap(); + let _: String = UpdateExtensionMessage.for_uuid; + let _: crate::api::api::PartExtension = UpdateExtensionMessage.ext; + } + { + let UpdateProfileMessage = None::.unwrap(); + let _: Option = UpdateProfileMessage.profile; + let _: bool = UpdateProfileMessage.share_contacts; + } + { + let UpdateProfileSharingMessage = + None::.unwrap(); + let _: Vec = UpdateProfileSharingMessage.shared_dismissed; + let _: Vec = UpdateProfileSharingMessage.shared_all; + let _: u64 = UpdateProfileSharingMessage.version; + } + { + let WallpaperMetadata = None::.unwrap(); + let _: Option = WallpaperMetadata.background_color_key; + let _: crate::api::api::PosterColor = WallpaperMetadata.font_color_key; + let _: String = WallpaperMetadata.font_name_key; + let _: f32 = WallpaperMetadata.font_size_key; + let _: f32 = WallpaperMetadata.font_weight_key; + let _: bool = WallpaperMetadata.is_vertical_key; + let _: String = WallpaperMetadata.type_key; + } + { + let WatchBackground = None::.unwrap(); + let _: bool = WatchBackground.is_high_key; + let _: f64 = WatchBackground.luminance; + let _: Vec = WatchBackground.background_image_data; + let _: String = WatchBackground.extension_identifier; + } + { + let WifiPassword = None::.unwrap(); + let _: u64 = WifiPassword.cdat; + let _: u64 = WifiPassword.mdat; + let _: String = WifiPassword.acct; + let _: String = WifiPassword.svce; + let _: Vec = WifiPassword.data; + } +}; + +// Section: related_funcs + +fn decode_DartFn_Inputs_String_Output_String_AnyhowException( + dart_opaque: flutter_rust_bridge::DartOpaque, +) -> impl Fn(String) -> flutter_rust_bridge::DartFnFuture { + use flutter_rust_bridge::IntoDart; + + async fn body(dart_opaque: flutter_rust_bridge::DartOpaque, arg0: String) -> String { + let args = vec![arg0.into_into_dart().into_dart()]; + let message = FLUTTER_RUST_BRIDGE_HANDLER + .dart_fn_invoke(dart_opaque, args) + .await; + + let mut deserializer = flutter_rust_bridge::for_generated::SseDeserializer::new(message); + let action = deserializer.cursor.read_u8().unwrap(); + let ans = match action { + 0 => std::result::Result::Ok(::sse_decode(&mut deserializer)), + 1 => std::result::Result::Err( + ::sse_decode(&mut deserializer), + ), + _ => unreachable!(), + }; + deserializer.end(); + let ans = ans.expect("Dart throws exception but Rust side assume it is not failable"); + ans + } + + move |arg0: String| { + flutter_rust_bridge::for_generated::convert_into_dart_fn_future(body( + dart_opaque.clone(), + arg0, + )) + } +} +flutter_rust_bridge::frb_generated_moi_arc_impl_value!( + flutter_rust_bridge::for_generated::RustAutoOpaqueInner +); +flutter_rust_bridge::frb_generated_moi_arc_impl_value!( + flutter_rust_bridge::for_generated::RustAutoOpaqueInner +); +flutter_rust_bridge::frb_generated_moi_arc_impl_value!( + flutter_rust_bridge::for_generated::RustAutoOpaqueInner +); +flutter_rust_bridge::frb_generated_moi_arc_impl_value!( + flutter_rust_bridge::for_generated::RustAutoOpaqueInner< + ArcAnisetteClient, + > +); +flutter_rust_bridge::frb_generated_moi_arc_impl_value!( + flutter_rust_bridge::for_generated::RustAutoOpaqueInner< + Arc>, + > +); +flutter_rust_bridge::frb_generated_moi_arc_impl_value!( + flutter_rust_bridge::for_generated::RustAutoOpaqueInner< + Arc>, + > +); +flutter_rust_bridge::frb_generated_moi_arc_impl_value!( + flutter_rust_bridge::for_generated::RustAutoOpaqueInner> +); +flutter_rust_bridge::frb_generated_moi_arc_impl_value!( + flutter_rust_bridge::for_generated::RustAutoOpaqueInner< + Arc>, + > +); +flutter_rust_bridge::frb_generated_moi_arc_impl_value!( + flutter_rust_bridge::for_generated::RustAutoOpaqueInner> +); +flutter_rust_bridge::frb_generated_moi_arc_impl_value!( + flutter_rust_bridge::for_generated::RustAutoOpaqueInner> +); +flutter_rust_bridge::frb_generated_moi_arc_impl_value!( + flutter_rust_bridge::for_generated::RustAutoOpaqueInner< + Arc>, + > +); +flutter_rust_bridge::frb_generated_moi_arc_impl_value!( + flutter_rust_bridge::for_generated::RustAutoOpaqueInner< + Arc>>, + > +); +flutter_rust_bridge::frb_generated_moi_arc_impl_value!( + flutter_rust_bridge::for_generated::RustAutoOpaqueInner< + Arc>>>, + > +); +flutter_rust_bridge::frb_generated_moi_arc_impl_value!( + flutter_rust_bridge::for_generated::RustAutoOpaqueInner>>> +); +flutter_rust_bridge::frb_generated_moi_arc_impl_value!( + flutter_rust_bridge::for_generated::RustAutoOpaqueInner< + Arc>, + > +); +flutter_rust_bridge::frb_generated_moi_arc_impl_value!( + flutter_rust_bridge::for_generated::RustAutoOpaqueInner< + Arc>, + > +); +flutter_rust_bridge::frb_generated_moi_arc_impl_value!( + flutter_rust_bridge::for_generated::RustAutoOpaqueInner>> +); +flutter_rust_bridge::frb_generated_moi_arc_impl_value!( + flutter_rust_bridge::for_generated::RustAutoOpaqueInner> +); +flutter_rust_bridge::frb_generated_moi_arc_impl_value!( + flutter_rust_bridge::for_generated::RustAutoOpaqueInner< + Arc>, + > +); +flutter_rust_bridge::frb_generated_moi_arc_impl_value!( + flutter_rust_bridge::for_generated::RustAutoOpaqueInner< + Arc>, + > +); +flutter_rust_bridge::frb_generated_moi_arc_impl_value!( + flutter_rust_bridge::for_generated::RustAutoOpaqueInner +); +flutter_rust_bridge::frb_generated_moi_arc_impl_value!( + flutter_rust_bridge::for_generated::RustAutoOpaqueInner +); +flutter_rust_bridge::frb_generated_moi_arc_impl_value!( + flutter_rust_bridge::for_generated::RustAutoOpaqueInner< + CircleClientSession, + > +); +flutter_rust_bridge::frb_generated_moi_arc_impl_value!( + flutter_rust_bridge::for_generated::RustAutoOpaqueInner +); +flutter_rust_bridge::frb_generated_moi_arc_impl_value!( + flutter_rust_bridge::for_generated::RustAutoOpaqueInner +); +flutter_rust_bridge::frb_generated_moi_arc_impl_value!( + flutter_rust_bridge::for_generated::RustAutoOpaqueInner +); +flutter_rust_bridge::frb_generated_moi_arc_impl_value!( + flutter_rust_bridge::for_generated::RustAutoOpaqueInner +); +flutter_rust_bridge::frb_generated_moi_arc_impl_value!( + flutter_rust_bridge::for_generated::RustAutoOpaqueInner +); +flutter_rust_bridge::frb_generated_moi_arc_impl_value!( + flutter_rust_bridge::for_generated::RustAutoOpaqueInner< + FindMyFriendsClient, + > +); +flutter_rust_bridge::frb_generated_moi_arc_impl_value!( + flutter_rust_bridge::for_generated::RustAutoOpaqueInner< + FindMyPhoneClient, + > +); +flutter_rust_bridge::frb_generated_moi_arc_impl_value!( + flutter_rust_bridge::for_generated::RustAutoOpaqueInner> +); +flutter_rust_bridge::frb_generated_moi_arc_impl_value!( + flutter_rust_bridge::for_generated::RustAutoOpaqueInner> +); +flutter_rust_bridge::frb_generated_moi_arc_impl_value!( + flutter_rust_bridge::for_generated::RustAutoOpaqueInner> +); +flutter_rust_bridge::frb_generated_moi_arc_impl_value!( + flutter_rust_bridge::for_generated::RustAutoOpaqueInner> +); +flutter_rust_bridge::frb_generated_moi_arc_impl_value!( + flutter_rust_bridge::for_generated::RustAutoOpaqueInner> +); +flutter_rust_bridge::frb_generated_moi_arc_impl_value!( + flutter_rust_bridge::for_generated::RustAutoOpaqueInner> +); +flutter_rust_bridge::frb_generated_moi_arc_impl_value!( + flutter_rust_bridge::for_generated::RustAutoOpaqueInner +); +flutter_rust_bridge::frb_generated_moi_arc_impl_value!( + flutter_rust_bridge::for_generated::RustAutoOpaqueInner +); +flutter_rust_bridge::frb_generated_moi_arc_impl_value!( + flutter_rust_bridge::for_generated::RustAutoOpaqueInner +); +flutter_rust_bridge::frb_generated_moi_arc_impl_value!( + flutter_rust_bridge::for_generated::RustAutoOpaqueInner +); +flutter_rust_bridge::frb_generated_moi_arc_impl_value!( + flutter_rust_bridge::for_generated::RustAutoOpaqueInner +); +flutter_rust_bridge::frb_generated_moi_arc_impl_value!( + flutter_rust_bridge::for_generated::RustAutoOpaqueInner> +); +flutter_rust_bridge::frb_generated_moi_arc_impl_value!( + flutter_rust_bridge::for_generated::RustAutoOpaqueInner> +); +flutter_rust_bridge::frb_generated_moi_arc_impl_value!( + flutter_rust_bridge::for_generated::RustAutoOpaqueInner +); +flutter_rust_bridge::frb_generated_moi_arc_impl_value!( + flutter_rust_bridge::for_generated::RustAutoOpaqueInner> +); +flutter_rust_bridge::frb_generated_moi_arc_impl_value!( + flutter_rust_bridge::for_generated::RustAutoOpaqueInner +); +flutter_rust_bridge::frb_generated_moi_arc_impl_value!( + flutter_rust_bridge::for_generated::RustAutoOpaqueInner> +); +flutter_rust_bridge::frb_generated_moi_arc_impl_value!( + flutter_rust_bridge::for_generated::RustAutoOpaqueInner +); +flutter_rust_bridge::frb_generated_moi_arc_impl_value!( + flutter_rust_bridge::for_generated::RustAutoOpaqueInner< + SyncManager, + > +); +flutter_rust_bridge::frb_generated_moi_arc_impl_value!( + flutter_rust_bridge::for_generated::RustAutoOpaqueInner +); +flutter_rust_bridge::frb_generated_moi_arc_impl_value!( + flutter_rust_bridge::for_generated::RustAutoOpaqueInner +); +flutter_rust_bridge::frb_generated_moi_arc_impl_value!( + flutter_rust_bridge::for_generated::RustAutoOpaqueInner +); + +// Section: dart2rust + +impl SseDecode for flutter_rust_bridge::for_generated::anyhow::Error { + // Codec=Sse (Serialization based), see doc to use other codecs + fn sse_decode(deserializer: &mut flutter_rust_bridge::for_generated::SseDeserializer) -> Self { + let mut inner = ::sse_decode(deserializer); + return flutter_rust_bridge::for_generated::anyhow::anyhow!("{}", inner); + } +} + +impl SseDecode for APSConnection { + // Codec=Sse (Serialization based), see doc to use other codecs + fn sse_decode(deserializer: &mut flutter_rust_bridge::for_generated::SseDeserializer) -> Self { + let mut inner = , + >>::sse_decode(deserializer); + return flutter_rust_bridge::for_generated::rust_auto_opaque_decode_owned(inner); + } +} + +impl SseDecode for APSState { + // Codec=Sse (Serialization based), see doc to use other codecs + fn sse_decode(deserializer: &mut flutter_rust_bridge::for_generated::SseDeserializer) -> Self { + let mut inner = , + >>::sse_decode(deserializer); + return flutter_rust_bridge::for_generated::rust_auto_opaque_decode_owned(inner); + } +} + +impl SseDecode for APSWatcher { + // Codec=Sse (Serialization based), see doc to use other codecs + fn sse_decode(deserializer: &mut flutter_rust_bridge::for_generated::SseDeserializer) -> Self { + let mut inner = , + >>::sse_decode(deserializer); + return flutter_rust_bridge::for_generated::rust_auto_opaque_decode_owned(inner); + } +} + +impl SseDecode for ArcAnisetteClient { + // Codec=Sse (Serialization based), see doc to use other codecs + fn sse_decode(deserializer: &mut flutter_rust_bridge::for_generated::SseDeserializer) -> Self { + let mut inner = , + >, + >>::sse_decode(deserializer); + return flutter_rust_bridge::for_generated::rust_auto_opaque_decode_owned(inner); + } +} + +impl SseDecode for Arc> { + // Codec=Sse (Serialization based), see doc to use other codecs + fn sse_decode(deserializer: &mut flutter_rust_bridge::for_generated::SseDeserializer) -> Self { + let mut inner = >, + >, + >>::sse_decode(deserializer); + return flutter_rust_bridge::for_generated::rust_auto_opaque_decode_owned(inner); + } +} + +impl SseDecode for Arc> { + // Codec=Sse (Serialization based), see doc to use other codecs + fn sse_decode(deserializer: &mut flutter_rust_bridge::for_generated::SseDeserializer) -> Self { + let mut inner = >, + >, + >>::sse_decode(deserializer); + return flutter_rust_bridge::for_generated::rust_auto_opaque_decode_owned(inner); + } +} + +impl SseDecode for Arc { + // Codec=Sse (Serialization based), see doc to use other codecs + fn sse_decode(deserializer: &mut flutter_rust_bridge::for_generated::SseDeserializer) -> Self { + let mut inner = >, + >>::sse_decode(deserializer); + return flutter_rust_bridge::for_generated::rust_auto_opaque_decode_owned(inner); + } +} + +impl SseDecode for Arc> { + // Codec=Sse (Serialization based), see doc to use other codecs + fn sse_decode(deserializer: &mut flutter_rust_bridge::for_generated::SseDeserializer) -> Self { + let mut inner = >, + >, + >>::sse_decode(deserializer); + return flutter_rust_bridge::for_generated::rust_auto_opaque_decode_owned(inner); + } +} + +impl SseDecode for Arc { + // Codec=Sse (Serialization based), see doc to use other codecs + fn sse_decode(deserializer: &mut flutter_rust_bridge::for_generated::SseDeserializer) -> Self { + let mut inner = >, + >>::sse_decode(deserializer); + return flutter_rust_bridge::for_generated::rust_auto_opaque_decode_owned(inner); + } +} + +impl SseDecode for Arc { + // Codec=Sse (Serialization based), see doc to use other codecs + fn sse_decode(deserializer: &mut flutter_rust_bridge::for_generated::SseDeserializer) -> Self { + let mut inner = >, + >>::sse_decode(deserializer); + return flutter_rust_bridge::for_generated::rust_auto_opaque_decode_owned(inner); + } +} + +impl SseDecode for Arc> { + // Codec=Sse (Serialization based), see doc to use other codecs + fn sse_decode(deserializer: &mut flutter_rust_bridge::for_generated::SseDeserializer) -> Self { + let mut inner = >, + >, + >>::sse_decode(deserializer); + return flutter_rust_bridge::for_generated::rust_auto_opaque_decode_owned(inner); + } +} + +impl SseDecode for Arc>> { + // Codec=Sse (Serialization based), see doc to use other codecs + fn sse_decode(deserializer: &mut flutter_rust_bridge::for_generated::SseDeserializer) -> Self { + let mut inner = >>, + >, + >>::sse_decode(deserializer); + return flutter_rust_bridge::for_generated::rust_auto_opaque_decode_owned(inner); + } +} + +impl SseDecode for Arc>>> { + // Codec=Sse (Serialization based), see doc to use other codecs + fn sse_decode(deserializer: &mut flutter_rust_bridge::for_generated::SseDeserializer) -> Self { + let mut inner = >>>, + >, + >>::sse_decode(deserializer); + return flutter_rust_bridge::for_generated::rust_auto_opaque_decode_owned(inner); + } +} + +impl SseDecode for Arc>> { + // Codec=Sse (Serialization based), see doc to use other codecs + fn sse_decode(deserializer: &mut flutter_rust_bridge::for_generated::SseDeserializer) -> Self { + let mut inner = >>, + >, + >>::sse_decode(deserializer); + return flutter_rust_bridge::for_generated::rust_auto_opaque_decode_owned(inner); + } +} + +impl SseDecode for Arc> { + // Codec=Sse (Serialization based), see doc to use other codecs + fn sse_decode(deserializer: &mut flutter_rust_bridge::for_generated::SseDeserializer) -> Self { + let mut inner = >, + >, + >>::sse_decode(deserializer); + return flutter_rust_bridge::for_generated::rust_auto_opaque_decode_owned(inner); + } +} + +impl SseDecode for Arc> { + // Codec=Sse (Serialization based), see doc to use other codecs + fn sse_decode(deserializer: &mut flutter_rust_bridge::for_generated::SseDeserializer) -> Self { + let mut inner = >, + >, + >>::sse_decode(deserializer); + return flutter_rust_bridge::for_generated::rust_auto_opaque_decode_owned(inner); + } +} + +impl SseDecode for Arc> { + // Codec=Sse (Serialization based), see doc to use other codecs + fn sse_decode(deserializer: &mut flutter_rust_bridge::for_generated::SseDeserializer) -> Self { + let mut inner = >>, + >>::sse_decode(deserializer); + return flutter_rust_bridge::for_generated::rust_auto_opaque_decode_owned(inner); + } +} + +impl SseDecode for Arc { + // Codec=Sse (Serialization based), see doc to use other codecs + fn sse_decode(deserializer: &mut flutter_rust_bridge::for_generated::SseDeserializer) -> Self { + let mut inner = >, + >>::sse_decode(deserializer); + return flutter_rust_bridge::for_generated::rust_auto_opaque_decode_owned(inner); + } +} + +impl SseDecode for Arc> { + // Codec=Sse (Serialization based), see doc to use other codecs + fn sse_decode(deserializer: &mut flutter_rust_bridge::for_generated::SseDeserializer) -> Self { + let mut inner = >, + >, + >>::sse_decode(deserializer); + return flutter_rust_bridge::for_generated::rust_auto_opaque_decode_owned(inner); + } +} + +impl SseDecode for Arc> { + // Codec=Sse (Serialization based), see doc to use other codecs + fn sse_decode(deserializer: &mut flutter_rust_bridge::for_generated::SseDeserializer) -> Self { + let mut inner = >, + >, + >>::sse_decode(deserializer); + return flutter_rust_bridge::for_generated::rust_auto_opaque_decode_owned(inner); + } +} + +impl SseDecode for Asset { + // Codec=Sse (Serialization based), see doc to use other codecs + fn sse_decode(deserializer: &mut flutter_rust_bridge::for_generated::SseDeserializer) -> Self { + let mut inner = , + >>::sse_decode(deserializer); + return flutter_rust_bridge::for_generated::rust_auto_opaque_decode_owned(inner); + } +} + +impl SseDecode for ChannelInterestToken { + // Codec=Sse (Serialization based), see doc to use other codecs + fn sse_decode(deserializer: &mut flutter_rust_bridge::for_generated::SseDeserializer) -> Self { + let mut inner = , + >>::sse_decode(deserializer); + return flutter_rust_bridge::for_generated::rust_auto_opaque_decode_owned(inner); + } +} + +impl SseDecode for CircleClientSession { + // Codec=Sse (Serialization based), see doc to use other codecs + fn sse_decode(deserializer: &mut flutter_rust_bridge::for_generated::SseDeserializer) -> Self { + let mut inner = , + >, + >>::sse_decode(deserializer); + return flutter_rust_bridge::for_generated::rust_auto_opaque_decode_owned(inner); + } +} + +impl SseDecode for CloudSyncPreparedMessageCreateHandle { + // Codec=Sse (Serialization based), see doc to use other codecs + fn sse_decode(deserializer: &mut flutter_rust_bridge::for_generated::SseDeserializer) -> Self { + let mut inner = , + >>::sse_decode(deserializer); + return flutter_rust_bridge::for_generated::rust_auto_opaque_decode_owned(inner); + } +} + +impl SseDecode for ConversationLink { + // Codec=Sse (Serialization based), see doc to use other codecs + fn sse_decode(deserializer: &mut flutter_rust_bridge::for_generated::SseDeserializer) -> Self { + let mut inner = , + >>::sse_decode(deserializer); + return flutter_rust_bridge::for_generated::rust_auto_opaque_decode_owned(inner); + } +} + +impl SseDecode for ConversationParticipant { + // Codec=Sse (Serialization based), see doc to use other codecs + fn sse_decode(deserializer: &mut flutter_rust_bridge::for_generated::SseDeserializer) -> Self { + let mut inner = , + >>::sse_decode(deserializer); + return flutter_rust_bridge::for_generated::rust_auto_opaque_decode_owned(inner); + } +} + +impl SseDecode for Date { + // Codec=Sse (Serialization based), see doc to use other codecs + fn sse_decode(deserializer: &mut flutter_rust_bridge::for_generated::SseDeserializer) -> Self { + let mut inner = , + >>::sse_decode(deserializer); + return flutter_rust_bridge::for_generated::rust_auto_opaque_decode_owned(inner); + } +} + +impl SseDecode for EscrowData { + // Codec=Sse (Serialization based), see doc to use other codecs + fn sse_decode(deserializer: &mut flutter_rust_bridge::for_generated::SseDeserializer) -> Self { + let mut inner = , + >>::sse_decode(deserializer); + return flutter_rust_bridge::for_generated::rust_auto_opaque_decode_owned(inner); + } +} + +impl SseDecode for FindMyFriendsClient { + // Codec=Sse (Serialization based), see doc to use other codecs + fn sse_decode(deserializer: &mut flutter_rust_bridge::for_generated::SseDeserializer) -> Self { + let mut inner = , + >, + >>::sse_decode(deserializer); + return flutter_rust_bridge::for_generated::rust_auto_opaque_decode_owned(inner); + } +} + +impl SseDecode for FindMyPhoneClient { + // Codec=Sse (Serialization based), see doc to use other codecs + fn sse_decode(deserializer: &mut flutter_rust_bridge::for_generated::SseDeserializer) -> Self { + let mut inner = , + >, + >>::sse_decode(deserializer); + return flutter_rust_bridge::for_generated::rust_auto_opaque_decode_owned(inner); + } +} + +impl SseDecode for GZipWrapper { + // Codec=Sse (Serialization based), see doc to use other codecs + fn sse_decode(deserializer: &mut flutter_rust_bridge::for_generated::SseDeserializer) -> Self { + let mut inner = >, + >>::sse_decode(deserializer); + return flutter_rust_bridge::for_generated::rust_auto_opaque_decode_owned(inner); + } +} + +impl SseDecode for GZipWrapper { + // Codec=Sse (Serialization based), see doc to use other codecs + fn sse_decode(deserializer: &mut flutter_rust_bridge::for_generated::SseDeserializer) -> Self { + let mut inner = >, + >>::sse_decode(deserializer); + return flutter_rust_bridge::for_generated::rust_auto_opaque_decode_owned(inner); + } +} + +impl SseDecode for GZipWrapper { + // Codec=Sse (Serialization based), see doc to use other codecs + fn sse_decode(deserializer: &mut flutter_rust_bridge::for_generated::SseDeserializer) -> Self { + let mut inner = >, + >>::sse_decode(deserializer); + return flutter_rust_bridge::for_generated::rust_auto_opaque_decode_owned(inner); + } +} + +impl SseDecode for GZipWrapper { + // Codec=Sse (Serialization based), see doc to use other codecs + fn sse_decode(deserializer: &mut flutter_rust_bridge::for_generated::SseDeserializer) -> Self { + let mut inner = >, + >>::sse_decode(deserializer); + return flutter_rust_bridge::for_generated::rust_auto_opaque_decode_owned(inner); + } +} + +impl SseDecode for GZipWrapper { + // Codec=Sse (Serialization based), see doc to use other codecs + fn sse_decode(deserializer: &mut flutter_rust_bridge::for_generated::SseDeserializer) -> Self { + let mut inner = >, + >>::sse_decode(deserializer); + return flutter_rust_bridge::for_generated::rust_auto_opaque_decode_owned(inner); + } +} + +impl SseDecode for GZipWrapper { + // Codec=Sse (Serialization based), see doc to use other codecs + fn sse_decode(deserializer: &mut flutter_rust_bridge::for_generated::SseDeserializer) -> Self { + let mut inner = >, + >>::sse_decode(deserializer); + return flutter_rust_bridge::for_generated::rust_auto_opaque_decode_owned(inner); + } +} + +impl SseDecode for IDSNGMIdentity { + // Codec=Sse (Serialization based), see doc to use other codecs + fn sse_decode(deserializer: &mut flutter_rust_bridge::for_generated::SseDeserializer) -> Self { + let mut inner = , + >>::sse_decode(deserializer); + return flutter_rust_bridge::for_generated::rust_auto_opaque_decode_owned(inner); + } +} + +impl SseDecode for IDSUser { + // Codec=Sse (Serialization based), see doc to use other codecs + fn sse_decode(deserializer: &mut flutter_rust_bridge::for_generated::SseDeserializer) -> Self { + let mut inner = , + >>::sse_decode(deserializer); + return flutter_rust_bridge::for_generated::rust_auto_opaque_decode_owned(inner); + } +} + +impl SseDecode for JoinedOSConfig { + // Codec=Sse (Serialization based), see doc to use other codecs + fn sse_decode(deserializer: &mut flutter_rust_bridge::for_generated::SseDeserializer) -> Self { + let mut inner = , + >>::sse_decode(deserializer); + return flutter_rust_bridge::for_generated::rust_auto_opaque_decode_owned(inner); + } +} + +impl SseDecode for LocationReport { + // Codec=Sse (Serialization based), see doc to use other codecs + fn sse_decode(deserializer: &mut flutter_rust_bridge::for_generated::SseDeserializer) -> Self { + let mut inner = , + >>::sse_decode(deserializer); + return flutter_rust_bridge::for_generated::rust_auto_opaque_decode_owned(inner); + } +} + +impl SseDecode for MessageFlags { + // Codec=Sse (Serialization based), see doc to use other codecs + fn sse_decode(deserializer: &mut flutter_rust_bridge::for_generated::SseDeserializer) -> Self { + let mut inner = , + >>::sse_decode(deserializer); + return flutter_rust_bridge::for_generated::rust_auto_opaque_decode_owned(inner); + } +} + +impl SseDecode for NSArray { + // Codec=Sse (Serialization based), see doc to use other codecs + fn sse_decode(deserializer: &mut flutter_rust_bridge::for_generated::SseDeserializer) -> Self { + let mut inner = >, + >>::sse_decode(deserializer); + return flutter_rust_bridge::for_generated::rust_auto_opaque_decode_owned(inner); + } +} + +impl SseDecode for NSArray { + // Codec=Sse (Serialization based), see doc to use other codecs + fn sse_decode(deserializer: &mut flutter_rust_bridge::for_generated::SseDeserializer) -> Self { + let mut inner = >, + >>::sse_decode(deserializer); + return flutter_rust_bridge::for_generated::rust_auto_opaque_decode_owned(inner); + } +} + +impl SseDecode for PushError { + // Codec=Sse (Serialization based), see doc to use other codecs + fn sse_decode(deserializer: &mut flutter_rust_bridge::for_generated::SseDeserializer) -> Self { + let mut inner = , + >>::sse_decode(deserializer); + return flutter_rust_bridge::for_generated::rust_auto_opaque_decode_owned(inner); + } +} + +impl SseDecode for Receiver { + // Codec=Sse (Serialization based), see doc to use other codecs + fn sse_decode(deserializer: &mut flutter_rust_bridge::for_generated::SseDeserializer) -> Self { + let mut inner = >, + >>::sse_decode(deserializer); + return flutter_rust_bridge::for_generated::rust_auto_opaque_decode_owned(inner); + } +} + +impl SseDecode for SavedHardwareState { + // Codec=Sse (Serialization based), see doc to use other codecs + fn sse_decode(deserializer: &mut flutter_rust_bridge::for_generated::SseDeserializer) -> Self { + let mut inner = , + >>::sse_decode(deserializer); + return flutter_rust_bridge::for_generated::rust_auto_opaque_decode_owned(inner); + } +} + +impl SseDecode for Sender<()> { + // Codec=Sse (Serialization based), see doc to use other codecs + fn sse_decode(deserializer: &mut flutter_rust_bridge::for_generated::SseDeserializer) -> Self { + let mut inner = >, + >>::sse_decode(deserializer); + return flutter_rust_bridge::for_generated::rust_auto_opaque_decode_owned(inner); + } +} + +impl SseDecode for StCollapsedValue { + // Codec=Sse (Serialization based), see doc to use other codecs + fn sse_decode(deserializer: &mut flutter_rust_bridge::for_generated::SseDeserializer) -> Self { + let mut inner = , + >>::sse_decode(deserializer); + return flutter_rust_bridge::for_generated::rust_auto_opaque_decode_owned(inner); + } +} + +impl SseDecode for SyncManager { + // Codec=Sse (Serialization based), see doc to use other codecs + fn sse_decode(deserializer: &mut flutter_rust_bridge::for_generated::SseDeserializer) -> Self { + let mut inner = , + >, + >>::sse_decode(deserializer); + return flutter_rust_bridge::for_generated::rust_auto_opaque_decode_owned(inner); + } +} + +impl SseDecode for SystemTime { + // Codec=Sse (Serialization based), see doc to use other codecs + fn sse_decode(deserializer: &mut flutter_rust_bridge::for_generated::SseDeserializer) -> Self { + let mut inner = , + >>::sse_decode(deserializer); + return flutter_rust_bridge::for_generated::rust_auto_opaque_decode_owned(inner); + } +} + +impl SseDecode for VerifyBody { + // Codec=Sse (Serialization based), see doc to use other codecs + fn sse_decode(deserializer: &mut flutter_rust_bridge::for_generated::SseDeserializer) -> Self { + let mut inner = , + >>::sse_decode(deserializer); + return flutter_rust_bridge::for_generated::rust_auto_opaque_decode_owned(inner); + } +} + +impl SseDecode for ViableBottle { + // Codec=Sse (Serialization based), see doc to use other codecs + fn sse_decode(deserializer: &mut flutter_rust_bridge::for_generated::SseDeserializer) -> Self { + let mut inner = , + >>::sse_decode(deserializer); + return flutter_rust_bridge::for_generated::rust_auto_opaque_decode_owned(inner); + } +} + +impl SseDecode for flutter_rust_bridge::DartOpaque { + // Codec=Sse (Serialization based), see doc to use other codecs + fn sse_decode(deserializer: &mut flutter_rust_bridge::for_generated::SseDeserializer) -> Self { + let mut inner = ::sse_decode(deserializer); + return unsafe { flutter_rust_bridge::for_generated::sse_decode_dart_opaque(inner) }; + } +} + +impl SseDecode for std::collections::HashMap { + // Codec=Sse (Serialization based), see doc to use other codecs + fn sse_decode(deserializer: &mut flutter_rust_bridge::for_generated::SseDeserializer) -> Self { + let mut inner = >::sse_decode(deserializer); + return inner.into_iter().collect(); + } +} + +impl SseDecode for std::collections::HashMap { + // Codec=Sse (Serialization based), see doc to use other codecs + fn sse_decode(deserializer: &mut flutter_rust_bridge::for_generated::SseDeserializer) -> Self { + let mut inner = >::sse_decode(deserializer); + return inner.into_iter().collect(); + } +} + +impl SseDecode for std::collections::HashMap { + // Codec=Sse (Serialization based), see doc to use other codecs + fn sse_decode(deserializer: &mut flutter_rust_bridge::for_generated::SseDeserializer) -> Self { + let mut inner = >::sse_decode(deserializer); + return inner.into_iter().collect(); + } +} + +impl SseDecode for std::collections::HashMap { + // Codec=Sse (Serialization based), see doc to use other codecs + fn sse_decode(deserializer: &mut flutter_rust_bridge::for_generated::SseDeserializer) -> Self { + let mut inner = >::sse_decode(deserializer); + return inner.into_iter().collect(); + } +} + +impl SseDecode for std::collections::HashMap { + // Codec=Sse (Serialization based), see doc to use other codecs + fn sse_decode(deserializer: &mut flutter_rust_bridge::for_generated::SseDeserializer) -> Self { + let mut inner = >::sse_decode(deserializer); + return inner.into_iter().collect(); + } +} + +impl SseDecode for std::collections::HashMap { + // Codec=Sse (Serialization based), see doc to use other codecs + fn sse_decode(deserializer: &mut flutter_rust_bridge::for_generated::SseDeserializer) -> Self { + let mut inner = >::sse_decode(deserializer); + return inner.into_iter().collect(); + } +} + +impl SseDecode for std::collections::HashMap { + // Codec=Sse (Serialization based), see doc to use other codecs + fn sse_decode(deserializer: &mut flutter_rust_bridge::for_generated::SseDeserializer) -> Self { + let mut inner = >::sse_decode(deserializer); + return inner.into_iter().collect(); + } +} + +impl SseDecode for std::collections::HashMap { + // Codec=Sse (Serialization based), see doc to use other codecs + fn sse_decode(deserializer: &mut flutter_rust_bridge::for_generated::SseDeserializer) -> Self { + let mut inner = >::sse_decode(deserializer); + return inner.into_iter().collect(); + } +} + +impl SseDecode for std::collections::HashMap { + // Codec=Sse (Serialization based), see doc to use other codecs + fn sse_decode(deserializer: &mut flutter_rust_bridge::for_generated::SseDeserializer) -> Self { + let mut inner = >::sse_decode(deserializer); + return inner.into_iter().collect(); + } +} + +impl SseDecode for std::collections::HashMap { + // Codec=Sse (Serialization based), see doc to use other codecs + fn sse_decode(deserializer: &mut flutter_rust_bridge::for_generated::SseDeserializer) -> Self { + let mut inner = >::sse_decode(deserializer); + return inner.into_iter().collect(); + } +} + +impl SseDecode for std::collections::HashMap> { + // Codec=Sse (Serialization based), see doc to use other codecs + fn sse_decode(deserializer: &mut flutter_rust_bridge::for_generated::SseDeserializer) -> Self { + let mut inner = + )>>::sse_decode(deserializer); + return inner.into_iter().collect(); + } +} + +impl SseDecode for std::collections::HashMap> { + // Codec=Sse (Serialization based), see doc to use other codecs + fn sse_decode(deserializer: &mut flutter_rust_bridge::for_generated::SseDeserializer) -> Self { + let mut inner = )>>::sse_decode(deserializer); + return inner.into_iter().collect(); + } +} + +impl SseDecode for std::collections::HashMap { + // Codec=Sse (Serialization based), see doc to use other codecs + fn sse_decode(deserializer: &mut flutter_rust_bridge::for_generated::SseDeserializer) -> Self { + let mut inner = + >::sse_decode(deserializer); + return inner.into_iter().collect(); + } +} + +impl SseDecode for std::collections::HashMap> { + // Codec=Sse (Serialization based), see doc to use other codecs + fn sse_decode(deserializer: &mut flutter_rust_bridge::for_generated::SseDeserializer) -> Self { + let mut inner = + )>>::sse_decode(deserializer); + return inner.into_iter().collect(); + } +} + +impl SseDecode for std::collections::HashMap> { + // Codec=Sse (Serialization based), see doc to use other codecs + fn sse_decode(deserializer: &mut flutter_rust_bridge::for_generated::SseDeserializer) -> Self { + let mut inner = + )>>::sse_decode(deserializer); + return inner.into_iter().collect(); + } +} + +impl SseDecode for std::collections::HashMap> { + // Codec=Sse (Serialization based), see doc to use other codecs + fn sse_decode(deserializer: &mut flutter_rust_bridge::for_generated::SseDeserializer) -> Self { + let mut inner = + )>>::sse_decode(deserializer); + return inner.into_iter().collect(); + } +} + +impl SseDecode for std::collections::HashMap { + // Codec=Sse (Serialization based), see doc to use other codecs + fn sse_decode(deserializer: &mut flutter_rust_bridge::for_generated::SseDeserializer) -> Self { + let mut inner = + >::sse_decode(deserializer); + return inner.into_iter().collect(); + } +} + +impl SseDecode for std::collections::HashMap, crate::api::api::Passkey)> { + // Codec=Sse (Serialization based), see doc to use other codecs + fn sse_decode(deserializer: &mut flutter_rust_bridge::for_generated::SseDeserializer) -> Self { + let mut inner = + , crate::api::api::Passkey))>>::sse_decode(deserializer); + return inner.into_iter().collect(); + } +} + +impl SseDecode + for std::collections::HashMap, crate::api::api::PasswordManagerMeta)> +{ + // Codec=Sse (Serialization based), see doc to use other codecs + fn sse_decode(deserializer: &mut flutter_rust_bridge::for_generated::SseDeserializer) -> Self { + let mut inner = , crate::api::api::PasswordManagerMeta), + )>>::sse_decode(deserializer); + return inner.into_iter().collect(); + } +} + +impl SseDecode + for std::collections::HashMap, crate::api::api::PasswordRawEntry)> +{ + // Codec=Sse (Serialization based), see doc to use other codecs + fn sse_decode(deserializer: &mut flutter_rust_bridge::for_generated::SseDeserializer) -> Self { + let mut inner = + , crate::api::api::PasswordRawEntry))>>::sse_decode( + deserializer, + ); + return inner.into_iter().collect(); + } +} + +impl SseDecode + for std::collections::HashMap, crate::api::api::WifiPassword)> +{ + // Codec=Sse (Serialization based), see doc to use other codecs + fn sse_decode(deserializer: &mut flutter_rust_bridge::for_generated::SseDeserializer) -> Self { + let mut inner = + , crate::api::api::WifiPassword))>>::sse_decode( + deserializer, + ); + return inner.into_iter().collect(); + } +} + +impl SseDecode for std::collections::HashMap { + // Codec=Sse (Serialization based), see doc to use other codecs + fn sse_decode(deserializer: &mut flutter_rust_bridge::for_generated::SseDeserializer) -> Self { + let mut inner = + >::sse_decode(deserializer); + return inner.into_iter().collect(); + } +} + +impl SseDecode for std::collections::HashMap { + // Codec=Sse (Serialization based), see doc to use other codecs + fn sse_decode(deserializer: &mut flutter_rust_bridge::for_generated::SseDeserializer) -> Self { + let mut inner = + >::sse_decode(deserializer); + return inner.into_iter().collect(); + } +} + +impl SseDecode for std::collections::HashMap { + // Codec=Sse (Serialization based), see doc to use other codecs + fn sse_decode(deserializer: &mut flutter_rust_bridge::for_generated::SseDeserializer) -> Self { + let mut inner = >::sse_decode(deserializer); + return inner.into_iter().collect(); + } +} + +impl SseDecode + for RustOpaqueMoi> +{ + // Codec=Sse (Serialization based), see doc to use other codecs + fn sse_decode(deserializer: &mut flutter_rust_bridge::for_generated::SseDeserializer) -> Self { + let mut inner = ::sse_decode(deserializer); + return decode_rust_opaque_moi(inner); + } +} + +impl SseDecode + for RustOpaqueMoi> +{ + // Codec=Sse (Serialization based), see doc to use other codecs + fn sse_decode(deserializer: &mut flutter_rust_bridge::for_generated::SseDeserializer) -> Self { + let mut inner = ::sse_decode(deserializer); + return decode_rust_opaque_moi(inner); + } +} + +impl SseDecode + for RustOpaqueMoi> +{ + // Codec=Sse (Serialization based), see doc to use other codecs + fn sse_decode(deserializer: &mut flutter_rust_bridge::for_generated::SseDeserializer) -> Self { + let mut inner = ::sse_decode(deserializer); + return decode_rust_opaque_moi(inner); + } +} + +impl SseDecode + for RustOpaqueMoi< + flutter_rust_bridge::for_generated::RustAutoOpaqueInner< + ArcAnisetteClient, + >, + > +{ + // Codec=Sse (Serialization based), see doc to use other codecs + fn sse_decode(deserializer: &mut flutter_rust_bridge::for_generated::SseDeserializer) -> Self { + let mut inner = ::sse_decode(deserializer); + return decode_rust_opaque_moi(inner); + } +} + +impl SseDecode + for RustOpaqueMoi< + flutter_rust_bridge::for_generated::RustAutoOpaqueInner< + Arc>, + >, + > +{ + // Codec=Sse (Serialization based), see doc to use other codecs + fn sse_decode(deserializer: &mut flutter_rust_bridge::for_generated::SseDeserializer) -> Self { + let mut inner = ::sse_decode(deserializer); + return decode_rust_opaque_moi(inner); + } +} + +impl SseDecode + for RustOpaqueMoi< + flutter_rust_bridge::for_generated::RustAutoOpaqueInner< + Arc>, + >, + > +{ + // Codec=Sse (Serialization based), see doc to use other codecs + fn sse_decode(deserializer: &mut flutter_rust_bridge::for_generated::SseDeserializer) -> Self { + let mut inner = ::sse_decode(deserializer); + return decode_rust_opaque_moi(inner); + } +} + +impl SseDecode + for RustOpaqueMoi>> +{ + // Codec=Sse (Serialization based), see doc to use other codecs + fn sse_decode(deserializer: &mut flutter_rust_bridge::for_generated::SseDeserializer) -> Self { + let mut inner = ::sse_decode(deserializer); + return decode_rust_opaque_moi(inner); + } +} + +impl SseDecode + for RustOpaqueMoi< + flutter_rust_bridge::for_generated::RustAutoOpaqueInner< + Arc>, + >, + > +{ + // Codec=Sse (Serialization based), see doc to use other codecs + fn sse_decode(deserializer: &mut flutter_rust_bridge::for_generated::SseDeserializer) -> Self { + let mut inner = ::sse_decode(deserializer); + return decode_rust_opaque_moi(inner); + } +} + +impl SseDecode + for RustOpaqueMoi>> +{ + // Codec=Sse (Serialization based), see doc to use other codecs + fn sse_decode(deserializer: &mut flutter_rust_bridge::for_generated::SseDeserializer) -> Self { + let mut inner = ::sse_decode(deserializer); + return decode_rust_opaque_moi(inner); + } +} + +impl SseDecode + for RustOpaqueMoi< + flutter_rust_bridge::for_generated::RustAutoOpaqueInner>, + > +{ + // Codec=Sse (Serialization based), see doc to use other codecs + fn sse_decode(deserializer: &mut flutter_rust_bridge::for_generated::SseDeserializer) -> Self { + let mut inner = ::sse_decode(deserializer); + return decode_rust_opaque_moi(inner); + } +} + +impl SseDecode + for RustOpaqueMoi< + flutter_rust_bridge::for_generated::RustAutoOpaqueInner< + Arc>, + >, + > +{ + // Codec=Sse (Serialization based), see doc to use other codecs + fn sse_decode(deserializer: &mut flutter_rust_bridge::for_generated::SseDeserializer) -> Self { + let mut inner = ::sse_decode(deserializer); + return decode_rust_opaque_moi(inner); + } +} + +impl SseDecode + for RustOpaqueMoi< + flutter_rust_bridge::for_generated::RustAutoOpaqueInner< + Arc>>, + >, + > +{ + // Codec=Sse (Serialization based), see doc to use other codecs + fn sse_decode(deserializer: &mut flutter_rust_bridge::for_generated::SseDeserializer) -> Self { + let mut inner = ::sse_decode(deserializer); + return decode_rust_opaque_moi(inner); + } +} + +impl SseDecode + for RustOpaqueMoi< + flutter_rust_bridge::for_generated::RustAutoOpaqueInner< + Arc>>>, + >, + > +{ + // Codec=Sse (Serialization based), see doc to use other codecs + fn sse_decode(deserializer: &mut flutter_rust_bridge::for_generated::SseDeserializer) -> Self { + let mut inner = ::sse_decode(deserializer); + return decode_rust_opaque_moi(inner); + } +} + +impl SseDecode + for RustOpaqueMoi< + flutter_rust_bridge::for_generated::RustAutoOpaqueInner< + Arc>>, + >, + > +{ + // Codec=Sse (Serialization based), see doc to use other codecs + fn sse_decode(deserializer: &mut flutter_rust_bridge::for_generated::SseDeserializer) -> Self { + let mut inner = ::sse_decode(deserializer); + return decode_rust_opaque_moi(inner); + } +} + +impl SseDecode + for RustOpaqueMoi< + flutter_rust_bridge::for_generated::RustAutoOpaqueInner< + Arc>, + >, + > +{ + // Codec=Sse (Serialization based), see doc to use other codecs + fn sse_decode(deserializer: &mut flutter_rust_bridge::for_generated::SseDeserializer) -> Self { + let mut inner = ::sse_decode(deserializer); + return decode_rust_opaque_moi(inner); + } +} + +impl SseDecode + for RustOpaqueMoi< + flutter_rust_bridge::for_generated::RustAutoOpaqueInner< + Arc>, + >, + > +{ + // Codec=Sse (Serialization based), see doc to use other codecs + fn sse_decode(deserializer: &mut flutter_rust_bridge::for_generated::SseDeserializer) -> Self { + let mut inner = ::sse_decode(deserializer); + return decode_rust_opaque_moi(inner); + } +} + +impl SseDecode + for RustOpaqueMoi< + flutter_rust_bridge::for_generated::RustAutoOpaqueInner>>, + > +{ + // Codec=Sse (Serialization based), see doc to use other codecs + fn sse_decode(deserializer: &mut flutter_rust_bridge::for_generated::SseDeserializer) -> Self { + let mut inner = ::sse_decode(deserializer); + return decode_rust_opaque_moi(inner); + } +} + +impl SseDecode + for RustOpaqueMoi>> +{ + // Codec=Sse (Serialization based), see doc to use other codecs + fn sse_decode(deserializer: &mut flutter_rust_bridge::for_generated::SseDeserializer) -> Self { + let mut inner = ::sse_decode(deserializer); + return decode_rust_opaque_moi(inner); + } +} + +impl SseDecode + for RustOpaqueMoi< + flutter_rust_bridge::for_generated::RustAutoOpaqueInner< + Arc>, + >, + > +{ + // Codec=Sse (Serialization based), see doc to use other codecs + fn sse_decode(deserializer: &mut flutter_rust_bridge::for_generated::SseDeserializer) -> Self { + let mut inner = ::sse_decode(deserializer); + return decode_rust_opaque_moi(inner); + } +} + +impl SseDecode + for RustOpaqueMoi< + flutter_rust_bridge::for_generated::RustAutoOpaqueInner< + Arc>, + >, + > +{ + // Codec=Sse (Serialization based), see doc to use other codecs + fn sse_decode(deserializer: &mut flutter_rust_bridge::for_generated::SseDeserializer) -> Self { + let mut inner = ::sse_decode(deserializer); + return decode_rust_opaque_moi(inner); + } +} + +impl SseDecode for RustOpaqueMoi> { + // Codec=Sse (Serialization based), see doc to use other codecs + fn sse_decode(deserializer: &mut flutter_rust_bridge::for_generated::SseDeserializer) -> Self { + let mut inner = ::sse_decode(deserializer); + return decode_rust_opaque_moi(inner); + } +} + +impl SseDecode + for RustOpaqueMoi> +{ + // Codec=Sse (Serialization based), see doc to use other codecs + fn sse_decode(deserializer: &mut flutter_rust_bridge::for_generated::SseDeserializer) -> Self { + let mut inner = ::sse_decode(deserializer); + return decode_rust_opaque_moi(inner); + } +} + +impl SseDecode + for RustOpaqueMoi< + flutter_rust_bridge::for_generated::RustAutoOpaqueInner< + CircleClientSession, + >, + > +{ + // Codec=Sse (Serialization based), see doc to use other codecs + fn sse_decode(deserializer: &mut flutter_rust_bridge::for_generated::SseDeserializer) -> Self { + let mut inner = ::sse_decode(deserializer); + return decode_rust_opaque_moi(inner); + } +} + +impl SseDecode + for RustOpaqueMoi< + flutter_rust_bridge::for_generated::RustAutoOpaqueInner< + CloudSyncPreparedMessageCreateHandle, + >, + > +{ + // Codec=Sse (Serialization based), see doc to use other codecs + fn sse_decode(deserializer: &mut flutter_rust_bridge::for_generated::SseDeserializer) -> Self { + let mut inner = ::sse_decode(deserializer); + return decode_rust_opaque_moi(inner); + } +} + +impl SseDecode + for RustOpaqueMoi> +{ + // Codec=Sse (Serialization based), see doc to use other codecs + fn sse_decode(deserializer: &mut flutter_rust_bridge::for_generated::SseDeserializer) -> Self { + let mut inner = ::sse_decode(deserializer); + return decode_rust_opaque_moi(inner); + } +} + +impl SseDecode + for RustOpaqueMoi< + flutter_rust_bridge::for_generated::RustAutoOpaqueInner, + > +{ + // Codec=Sse (Serialization based), see doc to use other codecs + fn sse_decode(deserializer: &mut flutter_rust_bridge::for_generated::SseDeserializer) -> Self { + let mut inner = ::sse_decode(deserializer); + return decode_rust_opaque_moi(inner); + } +} + +impl SseDecode for RustOpaqueMoi> { + // Codec=Sse (Serialization based), see doc to use other codecs + fn sse_decode(deserializer: &mut flutter_rust_bridge::for_generated::SseDeserializer) -> Self { + let mut inner = ::sse_decode(deserializer); + return decode_rust_opaque_moi(inner); + } +} + +impl SseDecode + for RustOpaqueMoi> +{ + // Codec=Sse (Serialization based), see doc to use other codecs + fn sse_decode(deserializer: &mut flutter_rust_bridge::for_generated::SseDeserializer) -> Self { + let mut inner = ::sse_decode(deserializer); + return decode_rust_opaque_moi(inner); + } +} + +impl SseDecode + for RustOpaqueMoi< + flutter_rust_bridge::for_generated::RustAutoOpaqueInner< + FindMyFriendsClient, + >, + > +{ + // Codec=Sse (Serialization based), see doc to use other codecs + fn sse_decode(deserializer: &mut flutter_rust_bridge::for_generated::SseDeserializer) -> Self { + let mut inner = ::sse_decode(deserializer); + return decode_rust_opaque_moi(inner); + } +} + +impl SseDecode + for RustOpaqueMoi< + flutter_rust_bridge::for_generated::RustAutoOpaqueInner< + FindMyPhoneClient, + >, + > +{ + // Codec=Sse (Serialization based), see doc to use other codecs + fn sse_decode(deserializer: &mut flutter_rust_bridge::for_generated::SseDeserializer) -> Self { + let mut inner = ::sse_decode(deserializer); + return decode_rust_opaque_moi(inner); + } +} + +impl SseDecode + for RustOpaqueMoi< + flutter_rust_bridge::for_generated::RustAutoOpaqueInner>, + > +{ + // Codec=Sse (Serialization based), see doc to use other codecs + fn sse_decode(deserializer: &mut flutter_rust_bridge::for_generated::SseDeserializer) -> Self { + let mut inner = ::sse_decode(deserializer); + return decode_rust_opaque_moi(inner); + } +} + +impl SseDecode + for RustOpaqueMoi< + flutter_rust_bridge::for_generated::RustAutoOpaqueInner>, + > +{ + // Codec=Sse (Serialization based), see doc to use other codecs + fn sse_decode(deserializer: &mut flutter_rust_bridge::for_generated::SseDeserializer) -> Self { + let mut inner = ::sse_decode(deserializer); + return decode_rust_opaque_moi(inner); + } +} + +impl SseDecode + for RustOpaqueMoi< + flutter_rust_bridge::for_generated::RustAutoOpaqueInner>, + > +{ + // Codec=Sse (Serialization based), see doc to use other codecs + fn sse_decode(deserializer: &mut flutter_rust_bridge::for_generated::SseDeserializer) -> Self { + let mut inner = ::sse_decode(deserializer); + return decode_rust_opaque_moi(inner); + } +} + +impl SseDecode + for RustOpaqueMoi< + flutter_rust_bridge::for_generated::RustAutoOpaqueInner>, + > +{ + // Codec=Sse (Serialization based), see doc to use other codecs + fn sse_decode(deserializer: &mut flutter_rust_bridge::for_generated::SseDeserializer) -> Self { + let mut inner = ::sse_decode(deserializer); + return decode_rust_opaque_moi(inner); + } +} + +impl SseDecode + for RustOpaqueMoi< + flutter_rust_bridge::for_generated::RustAutoOpaqueInner>, + > +{ + // Codec=Sse (Serialization based), see doc to use other codecs + fn sse_decode(deserializer: &mut flutter_rust_bridge::for_generated::SseDeserializer) -> Self { + let mut inner = ::sse_decode(deserializer); + return decode_rust_opaque_moi(inner); + } +} + +impl SseDecode + for RustOpaqueMoi< + flutter_rust_bridge::for_generated::RustAutoOpaqueInner>, + > +{ + // Codec=Sse (Serialization based), see doc to use other codecs + fn sse_decode(deserializer: &mut flutter_rust_bridge::for_generated::SseDeserializer) -> Self { + let mut inner = ::sse_decode(deserializer); + return decode_rust_opaque_moi(inner); + } +} + +impl SseDecode + for RustOpaqueMoi> +{ + // Codec=Sse (Serialization based), see doc to use other codecs + fn sse_decode(deserializer: &mut flutter_rust_bridge::for_generated::SseDeserializer) -> Self { + let mut inner = ::sse_decode(deserializer); + return decode_rust_opaque_moi(inner); } - { - let ApsAlert = None::.unwrap(); - let _: String = ApsAlert.title; - let _: String = ApsAlert.body; - let _: String = ApsAlert.sbdy; - let _: String = ApsAlert.defbtn; - let _: String = ApsAlert.albtn; +} + +impl SseDecode for RustOpaqueMoi> { + // Codec=Sse (Serialization based), see doc to use other codecs + fn sse_decode(deserializer: &mut flutter_rust_bridge::for_generated::SseDeserializer) -> Self { + let mut inner = ::sse_decode(deserializer); + return decode_rust_opaque_moi(inner); } - { - let ApsData = None::.unwrap(); - let _: crate::api::api::ApsAlert = ApsData.alert; +} + +impl SseDecode + for RustOpaqueMoi> +{ + // Codec=Sse (Serialization based), see doc to use other codecs + fn sse_decode(deserializer: &mut flutter_rust_bridge::for_generated::SseDeserializer) -> Self { + let mut inner = ::sse_decode(deserializer); + return decode_rust_opaque_moi(inner); } - { - let Attachment = None::.unwrap(); - let _: crate::api::api::AttachmentType = Attachment.a_type; - let _: u64 = Attachment.part; - let _: String = Attachment.uti_type; - let _: String = Attachment.mime; - let _: String = Attachment.name; - let _: bool = Attachment.iris; +} + +impl SseDecode + for RustOpaqueMoi> +{ + // Codec=Sse (Serialization based), see doc to use other codecs + fn sse_decode(deserializer: &mut flutter_rust_bridge::for_generated::SseDeserializer) -> Self { + let mut inner = ::sse_decode(deserializer); + return decode_rust_opaque_moi(inner); } - { - let AttachmentMeta = None::.unwrap(); - let _: Option = AttachmentMeta.mime_type; - let _: i64 = AttachmentMeta.start_date; - let _: i64 = AttachmentMeta.total_bytes; - let _: i32 = AttachmentMeta.transfer_state; - let _: bool = AttachmentMeta.is_sticker; - let _: String = AttachmentMeta.guid; - let _: bool = AttachmentMeta.hide_attachment; - let _: Option = AttachmentMeta.user_info; - let _: Option = AttachmentMeta.filename; - let _: Option = AttachmentMeta.extras; - let _: bool = AttachmentMeta.is_outgoing; - let _: Option = AttachmentMeta.transfer_name; - let _: i32 = AttachmentMeta.version; - let _: Option = AttachmentMeta.uti; - let _: i64 = AttachmentMeta.created_date; - let _: Option = AttachmentMeta.pathc; - let _: Option = AttachmentMeta.md5; +} + +impl SseDecode + for RustOpaqueMoi> +{ + // Codec=Sse (Serialization based), see doc to use other codecs + fn sse_decode(deserializer: &mut flutter_rust_bridge::for_generated::SseDeserializer) -> Self { + let mut inner = ::sse_decode(deserializer); + return decode_rust_opaque_moi(inner); } - { - let AttachmentMetaExtra = None::.unwrap(); - let _: Option = AttachmentMetaExtra.preview_generation_state; +} + +impl SseDecode + for RustOpaqueMoi< + flutter_rust_bridge::for_generated::RustAutoOpaqueInner>, + > +{ + // Codec=Sse (Serialization based), see doc to use other codecs + fn sse_decode(deserializer: &mut flutter_rust_bridge::for_generated::SseDeserializer) -> Self { + let mut inner = ::sse_decode(deserializer); + return decode_rust_opaque_moi(inner); } - match None::.unwrap() { - crate::api::api::AttachmentType::Inline(field0) => { - let _: Vec = field0; +} + +impl SseDecode + for RustOpaqueMoi< + flutter_rust_bridge::for_generated::RustAutoOpaqueInner>, + > +{ + // Codec=Sse (Serialization based), see doc to use other codecs + fn sse_decode(deserializer: &mut flutter_rust_bridge::for_generated::SseDeserializer) -> Self { + let mut inner = ::sse_decode(deserializer); + return decode_rust_opaque_moi(inner); + } +} + +impl SseDecode + for RustOpaqueMoi> +{ + // Codec=Sse (Serialization based), see doc to use other codecs + fn sse_decode(deserializer: &mut flutter_rust_bridge::for_generated::SseDeserializer) -> Self { + let mut inner = ::sse_decode(deserializer); + return decode_rust_opaque_moi(inner); + } +} + +impl SseDecode + for RustOpaqueMoi>> +{ + // Codec=Sse (Serialization based), see doc to use other codecs + fn sse_decode(deserializer: &mut flutter_rust_bridge::for_generated::SseDeserializer) -> Self { + let mut inner = ::sse_decode(deserializer); + return decode_rust_opaque_moi(inner); + } +} + +impl SseDecode + for RustOpaqueMoi> +{ + // Codec=Sse (Serialization based), see doc to use other codecs + fn sse_decode(deserializer: &mut flutter_rust_bridge::for_generated::SseDeserializer) -> Self { + let mut inner = ::sse_decode(deserializer); + return decode_rust_opaque_moi(inner); + } +} + +impl SseDecode + for RustOpaqueMoi>> +{ + // Codec=Sse (Serialization based), see doc to use other codecs + fn sse_decode(deserializer: &mut flutter_rust_bridge::for_generated::SseDeserializer) -> Self { + let mut inner = ::sse_decode(deserializer); + return decode_rust_opaque_moi(inner); + } +} + +impl SseDecode + for RustOpaqueMoi> +{ + // Codec=Sse (Serialization based), see doc to use other codecs + fn sse_decode(deserializer: &mut flutter_rust_bridge::for_generated::SseDeserializer) -> Self { + let mut inner = ::sse_decode(deserializer); + return decode_rust_opaque_moi(inner); + } +} + +impl SseDecode + for RustOpaqueMoi< + flutter_rust_bridge::for_generated::RustAutoOpaqueInner< + SyncManager, + >, + > +{ + // Codec=Sse (Serialization based), see doc to use other codecs + fn sse_decode(deserializer: &mut flutter_rust_bridge::for_generated::SseDeserializer) -> Self { + let mut inner = ::sse_decode(deserializer); + return decode_rust_opaque_moi(inner); + } +} + +impl SseDecode + for RustOpaqueMoi> +{ + // Codec=Sse (Serialization based), see doc to use other codecs + fn sse_decode(deserializer: &mut flutter_rust_bridge::for_generated::SseDeserializer) -> Self { + let mut inner = ::sse_decode(deserializer); + return decode_rust_opaque_moi(inner); + } +} + +impl SseDecode + for RustOpaqueMoi> +{ + // Codec=Sse (Serialization based), see doc to use other codecs + fn sse_decode(deserializer: &mut flutter_rust_bridge::for_generated::SseDeserializer) -> Self { + let mut inner = ::sse_decode(deserializer); + return decode_rust_opaque_moi(inner); + } +} + +impl SseDecode + for RustOpaqueMoi> +{ + // Codec=Sse (Serialization based), see doc to use other codecs + fn sse_decode(deserializer: &mut flutter_rust_bridge::for_generated::SseDeserializer) -> Self { + let mut inner = ::sse_decode(deserializer); + return decode_rust_opaque_moi(inner); + } +} + +impl SseDecode for std::collections::HashSet { + // Codec=Sse (Serialization based), see doc to use other codecs + fn sse_decode(deserializer: &mut flutter_rust_bridge::for_generated::SseDeserializer) -> Self { + let mut inner = >::sse_decode(deserializer); + return inner.into_iter().collect(); + } +} + +impl SseDecode + for StreamSink< + crate::api::api::MMCSTransferProgress, + flutter_rust_bridge::for_generated::SseCodec, + > +{ + // Codec=Sse (Serialization based), see doc to use other codecs + fn sse_decode(deserializer: &mut flutter_rust_bridge::for_generated::SseDeserializer) -> Self { + let mut inner = ::sse_decode(deserializer); + return StreamSink::deserialize(inner); + } +} + +impl SseDecode + for StreamSink +{ + // Codec=Sse (Serialization based), see doc to use other codecs + fn sse_decode(deserializer: &mut flutter_rust_bridge::for_generated::SseDeserializer) -> Self { + let mut inner = ::sse_decode(deserializer); + return StreamSink::deserialize(inner); + } +} + +impl SseDecode for String { + // Codec=Sse (Serialization based), see doc to use other codecs + fn sse_decode(deserializer: &mut flutter_rust_bridge::for_generated::SseDeserializer) -> Self { + let mut inner = >::sse_decode(deserializer); + return String::from_utf8(inner).unwrap(); + } +} + +impl SseDecode for crate::api::api::Address { + // Codec=Sse (Serialization based), see doc to use other codecs + fn sse_decode(deserializer: &mut flutter_rust_bridge::for_generated::SseDeserializer) -> Self { + let mut var_administrativeArea = >::sse_decode(deserializer); + let mut var_country = ::sse_decode(deserializer); + let mut var_countryCode = ::sse_decode(deserializer); + let mut var_formattedAddressLines = >>::sse_decode(deserializer); + let mut var_locality = >::sse_decode(deserializer); + let mut var_stateCode = >::sse_decode(deserializer); + let mut var_streetAddress = >::sse_decode(deserializer); + let mut var_streetName = >::sse_decode(deserializer); + return crate::api::api::Address { + administrative_area: var_administrativeArea, + country: var_country, + country_code: var_countryCode, + formatted_address_lines: var_formattedAddressLines, + locality: var_locality, + state_code: var_stateCode, + street_address: var_streetAddress, + street_name: var_streetName, + }; + } +} + +impl SseDecode for crate::api::api::AkData { + // Codec=Sse (Serialization based), see doc to use other codecs + fn sse_decode(deserializer: &mut flutter_rust_bridge::for_generated::SseDeserializer) -> Self { + let mut var_lat = ::sse_decode(deserializer); + let mut var_lng = ::sse_decode(deserializer); + return crate::api::api::AkData { + lat: var_lat, + lng: var_lng, + }; + } +} + +impl SseDecode for crate::api::api::ApsAlert { + // Codec=Sse (Serialization based), see doc to use other codecs + fn sse_decode(deserializer: &mut flutter_rust_bridge::for_generated::SseDeserializer) -> Self { + let mut var_title = ::sse_decode(deserializer); + let mut var_body = ::sse_decode(deserializer); + let mut var_sbdy = ::sse_decode(deserializer); + let mut var_defbtn = ::sse_decode(deserializer); + let mut var_albtn = ::sse_decode(deserializer); + return crate::api::api::ApsAlert { + title: var_title, + body: var_body, + sbdy: var_sbdy, + defbtn: var_defbtn, + albtn: var_albtn, + }; + } +} + +impl SseDecode for crate::api::api::ApsConnectionStatus { + // Codec=Sse (Serialization based), see doc to use other codecs + fn sse_decode(deserializer: &mut flutter_rust_bridge::for_generated::SseDeserializer) -> Self { + let mut var_state = ::sse_decode(deserializer); + let mut var_activePort = >::sse_decode(deserializer); + let mut var_error = >::sse_decode(deserializer); + let mut var_retryWaitSeconds = >::sse_decode(deserializer); + return crate::api::api::ApsConnectionStatus { + state: var_state, + active_port: var_activePort, + error: var_error, + retry_wait_seconds: var_retryWaitSeconds, + }; + } +} + +impl SseDecode for crate::api::api::ApsData { + // Codec=Sse (Serialization based), see doc to use other codecs + fn sse_decode(deserializer: &mut flutter_rust_bridge::for_generated::SseDeserializer) -> Self { + let mut var_alert = ::sse_decode(deserializer); + return crate::api::api::ApsData { alert: var_alert }; + } +} + +impl SseDecode for crate::api::api::Attachment { + // Codec=Sse (Serialization based), see doc to use other codecs + fn sse_decode(deserializer: &mut flutter_rust_bridge::for_generated::SseDeserializer) -> Self { + let mut var_aType = ::sse_decode(deserializer); + let mut var_part_ = ::sse_decode(deserializer); + let mut var_utiType = ::sse_decode(deserializer); + let mut var_mime = ::sse_decode(deserializer); + let mut var_name = ::sse_decode(deserializer); + let mut var_iris = ::sse_decode(deserializer); + return crate::api::api::Attachment { + a_type: var_aType, + part: var_part_, + uti_type: var_utiType, + mime: var_mime, + name: var_name, + iris: var_iris, + }; + } +} + +impl SseDecode for crate::api::api::AttachmentMeta { + // Codec=Sse (Serialization based), see doc to use other codecs + fn sse_decode(deserializer: &mut flutter_rust_bridge::for_generated::SseDeserializer) -> Self { + let mut var_mimeType = >::sse_decode(deserializer); + let mut var_startDate = ::sse_decode(deserializer); + let mut var_totalBytes = ::sse_decode(deserializer); + let mut var_transferState = ::sse_decode(deserializer); + let mut var_isSticker = ::sse_decode(deserializer); + let mut var_guid = ::sse_decode(deserializer); + let mut var_hideAttachment = ::sse_decode(deserializer); + let mut var_userInfo = + >::sse_decode(deserializer); + let mut var_filename = >::sse_decode(deserializer); + let mut var_extras = + >::sse_decode(deserializer); + let mut var_isOutgoing = ::sse_decode(deserializer); + let mut var_transferName = >::sse_decode(deserializer); + let mut var_version = ::sse_decode(deserializer); + let mut var_uti = >::sse_decode(deserializer); + let mut var_createdDate = ::sse_decode(deserializer); + let mut var_pathc = >::sse_decode(deserializer); + let mut var_md5 = >::sse_decode(deserializer); + return crate::api::api::AttachmentMeta { + mime_type: var_mimeType, + start_date: var_startDate, + total_bytes: var_totalBytes, + transfer_state: var_transferState, + is_sticker: var_isSticker, + guid: var_guid, + hide_attachment: var_hideAttachment, + user_info: var_userInfo, + filename: var_filename, + extras: var_extras, + is_outgoing: var_isOutgoing, + transfer_name: var_transferName, + version: var_version, + uti: var_uti, + created_date: var_createdDate, + pathc: var_pathc, + md5: var_md5, + }; + } +} + +impl SseDecode for crate::api::api::AttachmentMetaExtra { + // Codec=Sse (Serialization based), see doc to use other codecs + fn sse_decode(deserializer: &mut flutter_rust_bridge::for_generated::SseDeserializer) -> Self { + let mut var_previewGenerationState = + >::sse_decode(deserializer); + return crate::api::api::AttachmentMetaExtra { + preview_generation_state: var_previewGenerationState, + }; + } +} + +impl SseDecode for crate::api::api::AttachmentType { + // Codec=Sse (Serialization based), see doc to use other codecs + fn sse_decode(deserializer: &mut flutter_rust_bridge::for_generated::SseDeserializer) -> Self { + let mut tag_ = ::sse_decode(deserializer); + match tag_ { + 0 => { + let mut var_field0 = >::sse_decode(deserializer); + return crate::api::api::AttachmentType::Inline(var_field0); + } + 1 => { + let mut var_field0 = ::sse_decode(deserializer); + return crate::api::api::AttachmentType::MMCS(var_field0); + } + _ => { + unimplemented!(""); + } } - crate::api::api::AttachmentType::MMCS(field0) => { - let _: crate::api::api::MMCSFile = field0; + } +} + +impl SseDecode for crate::api::api::Balloon { + // Codec=Sse (Serialization based), see doc to use other codecs + fn sse_decode(deserializer: &mut flutter_rust_bridge::for_generated::SseDeserializer) -> Self { + let mut var_url = ::sse_decode(deserializer); + let mut var_session = >::sse_decode(deserializer); + let mut var_layout = >::sse_decode(deserializer); + let mut var_ldText = >::sse_decode(deserializer); + let mut var_isLive = ::sse_decode(deserializer); + let mut var_icon = >>::sse_decode(deserializer); + return crate::api::api::Balloon { + url: var_url, + session: var_session, + layout: var_layout, + ld_text: var_ldText, + is_live: var_isLive, + icon: var_icon, + }; + } +} + +impl SseDecode for crate::api::api::BalloonLayout { + // Codec=Sse (Serialization based), see doc to use other codecs + fn sse_decode(deserializer: &mut flutter_rust_bridge::for_generated::SseDeserializer) -> Self { + let mut tag_ = ::sse_decode(deserializer); + match tag_ { + 0 => { + let mut var_imageSubtitle = ::sse_decode(deserializer); + let mut var_imageTitle = ::sse_decode(deserializer); + let mut var_caption = ::sse_decode(deserializer); + let mut var_secondarySubcaption = ::sse_decode(deserializer); + let mut var_tertiarySubcaption = ::sse_decode(deserializer); + let mut var_subcaption = ::sse_decode(deserializer); + let mut var_class_ = ::sse_decode(deserializer); + return crate::api::api::BalloonLayout::TemplateLayout { + image_subtitle: var_imageSubtitle, + image_title: var_imageTitle, + caption: var_caption, + secondary_subcaption: var_secondarySubcaption, + tertiary_subcaption: var_tertiarySubcaption, + subcaption: var_subcaption, + class: var_class_, + }; + } + _ => { + unimplemented!(""); + } } } - { - let Balloon = None::.unwrap(); - let _: String = Balloon.url; - let _: Option = Balloon.session; - let _: Option = Balloon.layout; - let _: Option = Balloon.ld_text; - let _: bool = Balloon.is_live; - let _: Option> = Balloon.icon; +} + +impl SseDecode for crate::api::api::BeaconAttributes { + // Codec=Sse (Serialization based), see doc to use other codecs + fn sse_decode(deserializer: &mut flutter_rust_bridge::for_generated::SseDeserializer) -> Self { + let mut var_name = ::sse_decode(deserializer); + let mut var_roleId = ::sse_decode(deserializer); + let mut var_emoji = ::sse_decode(deserializer); + let mut var_systemVersion = ::sse_decode(deserializer); + let mut var_serialNumber = ::sse_decode(deserializer); + return crate::api::api::BeaconAttributes { + name: var_name, + role_id: var_roleId, + emoji: var_emoji, + system_version: var_systemVersion, + serial_number: var_serialNumber, + }; + } +} + +impl SseDecode for crate::api::api::BeaconNamingRecord { + // Codec=Sse (Serialization based), see doc to use other codecs + fn sse_decode(deserializer: &mut flutter_rust_bridge::for_generated::SseDeserializer) -> Self { + let mut var_emoji = ::sse_decode(deserializer); + let mut var_name = ::sse_decode(deserializer); + let mut var_associatedBeacon = ::sse_decode(deserializer); + let mut var_roleId = ::sse_decode(deserializer); + return crate::api::api::BeaconNamingRecord { + emoji: var_emoji, + name: var_name, + associated_beacon: var_associatedBeacon, + role_id: var_roleId, + }; + } +} + +impl SseDecode for bool { + // Codec=Sse (Serialization based), see doc to use other codecs + fn sse_decode(deserializer: &mut flutter_rust_bridge::for_generated::SseDeserializer) -> Self { + deserializer.cursor.read_u8().unwrap() != 0 + } +} + +impl SseDecode for crate::api::api::CertifiedContext { + // Codec=Sse (Serialization based), see doc to use other codecs + fn sse_decode(deserializer: &mut flutter_rust_bridge::for_generated::SseDeserializer) -> Self { + let mut var_version = ::sse_decode(deserializer); + let mut var_receipt = >::sse_decode(deserializer); + let mut var_sender = ::sse_decode(deserializer); + let mut var_target = ::sse_decode(deserializer); + let mut var_uuid = >::sse_decode(deserializer); + let mut var_token = >::sse_decode(deserializer); + return crate::api::api::CertifiedContext { + version: var_version, + receipt: var_receipt, + sender: var_sender, + target: var_target, + uuid: var_uuid, + token: var_token, + }; + } +} + +impl SseDecode for crate::api::api::ChangeParticipantMessage { + // Codec=Sse (Serialization based), see doc to use other codecs + fn sse_decode(deserializer: &mut flutter_rust_bridge::for_generated::SseDeserializer) -> Self { + let mut var_newParticipants = >::sse_decode(deserializer); + let mut var_groupVersion = ::sse_decode(deserializer); + return crate::api::api::ChangeParticipantMessage { + new_participants: var_newParticipants, + group_version: var_groupVersion, + }; } - match None::.unwrap() { - crate::api::api::BalloonLayout::TemplateLayout { - image_subtitle, - image_title, - caption, - secondary_subcaption, - tertiary_subcaption, - subcaption, - class, - } => { - let _: String = image_subtitle; - let _: String = image_title; - let _: String = caption; - let _: String = secondary_subcaption; - let _: String = tertiary_subcaption; - let _: String = subcaption; - let _: crate::api::api::NSDictionaryClass = class; - } +} + +impl SseDecode for crate::api::api::ChatProto { + // Codec=Sse (Serialization based), see doc to use other codecs + fn sse_decode(deserializer: &mut flutter_rust_bridge::for_generated::SseDeserializer) -> Self { + let mut var_unk1 = >::sse_decode(deserializer); + return crate::api::api::ChatProto { unk1: var_unk1 }; } - { - let BeaconAttributes = None::.unwrap(); - let _: String = BeaconAttributes.name; - let _: i64 = BeaconAttributes.role_id; - let _: String = BeaconAttributes.emoji; - let _: String = BeaconAttributes.system_version; - let _: String = BeaconAttributes.serial_number; +} + +impl SseDecode for crate::api::api::CloudAttachment { + // Codec=Sse (Serialization based), see doc to use other codecs + fn sse_decode(deserializer: &mut flutter_rust_bridge::for_generated::SseDeserializer) -> Self { + let mut var_cm = >::sse_decode(deserializer); + let mut var_lqa = ::sse_decode(deserializer); + return crate::api::api::CloudAttachment { + cm: var_cm, + lqa: var_lqa, + }; } - { - let BeaconNamingRecord = None::.unwrap(); - let _: String = BeaconNamingRecord.emoji; - let _: String = BeaconNamingRecord.name; - let _: String = BeaconNamingRecord.associated_beacon; - let _: i64 = BeaconNamingRecord.role_id; +} + +impl SseDecode for crate::api::api::CloudChat { + // Codec=Sse (Serialization based), see doc to use other codecs + fn sse_decode(deserializer: &mut flutter_rust_bridge::for_generated::SseDeserializer) -> Self { + let mut var_style = ::sse_decode(deserializer); + let mut var_isFiltered = ::sse_decode(deserializer); + let mut var_successfulQuery = ::sse_decode(deserializer); + let mut var_state = ::sse_decode(deserializer); + let mut var_chatIdentifier = ::sse_decode(deserializer); + let mut var_groupId = ::sse_decode(deserializer); + let mut var_serviceName = ::sse_decode(deserializer); + let mut var_originalGroupId = ::sse_decode(deserializer); + let mut var_properties = >::sse_decode(deserializer); + let mut var_participants = + >::sse_decode(deserializer); + let mut var_prop001 = ::sse_decode(deserializer); + let mut var_lastReadMessageTimestamp = ::sse_decode(deserializer); + let mut var_lastAddressedHandle = ::sse_decode(deserializer); + let mut var_guid = ::sse_decode(deserializer); + let mut var_displayName = >::sse_decode(deserializer); + let mut var_proto001 = >>::sse_decode(deserializer); + let mut var_groupPhotoGuid = >::sse_decode(deserializer); + let mut var_groupPhoto = >::sse_decode(deserializer); + return crate::api::api::CloudChat { + style: var_style, + is_filtered: var_isFiltered, + successful_query: var_successfulQuery, + state: var_state, + chat_identifier: var_chatIdentifier, + group_id: var_groupId, + service_name: var_serviceName, + original_group_id: var_originalGroupId, + properties: var_properties, + participants: var_participants, + prop001: var_prop001, + last_read_message_timestamp: var_lastReadMessageTimestamp, + last_addressed_handle: var_lastAddressedHandle, + guid: var_guid, + display_name: var_displayName, + proto001: var_proto001, + group_photo_guid: var_groupPhotoGuid, + group_photo: var_groupPhoto, + }; } - { - let CertifiedContext = None::.unwrap(); - let _: u32 = CertifiedContext.version; - let _: Vec = CertifiedContext.receipt; - let _: String = CertifiedContext.sender; - let _: String = CertifiedContext.target; - let _: Vec = CertifiedContext.uuid; - let _: Vec = CertifiedContext.token; +} + +impl SseDecode for crate::api::api::CloudMessage { + // Codec=Sse (Serialization based), see doc to use other codecs + fn sse_decode(deserializer: &mut flutter_rust_bridge::for_generated::SseDeserializer) -> Self { + let mut var_utm = >::sse_decode(deserializer); + let mut var_type = ::sse_decode(deserializer); + let mut var_error = ::sse_decode(deserializer); + let mut var_chatId = ::sse_decode(deserializer); + let mut var_sender = ::sse_decode(deserializer); + let mut var_time = ::sse_decode(deserializer); + let mut var_msgProto2 = >>::sse_decode(deserializer); + let mut var_destinationCallerId = ::sse_decode(deserializer); + let mut var_msgProto = >::sse_decode(deserializer); + let mut var_flags = ::sse_decode(deserializer); + let mut var_guid = ::sse_decode(deserializer); + let mut var_msgProto3 = >>::sse_decode(deserializer); + let mut var_service = ::sse_decode(deserializer); + let mut var_msgProto4 = >>::sse_decode(deserializer); + return crate::api::api::CloudMessage { + utm: var_utm, + r#type: var_type, + error: var_error, + chat_id: var_chatId, + sender: var_sender, + time: var_time, + msg_proto_2: var_msgProto2, + destination_caller_id: var_destinationCallerId, + msg_proto: var_msgProto, + flags: var_flags, + guid: var_guid, + msg_proto_3: var_msgProto3, + service: var_service, + msg_proto_4: var_msgProto4, + }; } - { - let ChangeParticipantMessage = None::.unwrap(); - let _: Vec = ChangeParticipantMessage.new_participants; - let _: u64 = ChangeParticipantMessage.group_version; +} + +impl SseDecode for crate::api::api::CloudMessageSummary { + // Codec=Sse (Serialization based), see doc to use other codecs + fn sse_decode(deserializer: &mut flutter_rust_bridge::for_generated::SseDeserializer) -> Self { + let mut var_messagesSummary = >::sse_decode(deserializer); + let mut var_chatSummary = >::sse_decode(deserializer); + let mut var_attachmentSummary = >::sse_decode(deserializer); + return crate::api::api::CloudMessageSummary { + messages_summary: var_messagesSummary, + chat_summary: var_chatSummary, + attachment_summary: var_attachmentSummary, + }; } - { - let ChatProto = None::.unwrap(); - let _: Option = ChatProto.unk1; +} + +impl SseDecode for crate::api::api::CloudParticipant { + // Codec=Sse (Serialization based), see doc to use other codecs + fn sse_decode(deserializer: &mut flutter_rust_bridge::for_generated::SseDeserializer) -> Self { + let mut var_uri = ::sse_decode(deserializer); + return crate::api::api::CloudParticipant { uri: var_uri }; } - { - let CloudAttachment = None::.unwrap(); - let _: GZipWrapper = CloudAttachment.cm; - let _: Asset = CloudAttachment.lqa; +} + +impl SseDecode for crate::api::api::CloudProp { + // Codec=Sse (Serialization based), see doc to use other codecs + fn sse_decode(deserializer: &mut flutter_rust_bridge::for_generated::SseDeserializer) -> Self { + let mut var_gpufc = >::sse_decode(deserializer); + let mut var_pv = >::sse_decode(deserializer); + let mut var_numberOfTimesRespondedtoThread = >::sse_decode(deserializer); + let mut var_shouldForceToSms = >::sse_decode(deserializer); + let mut var_lastSeenMessageGuid = >::sse_decode(deserializer); + let mut var_messageHandshakeState = >::sse_decode(deserializer); + let mut var_legacyGroupIdentifiers = >::sse_decode(deserializer); + let mut var_groupPhotoGuid = >::sse_decode(deserializer); + let mut var_lastModificationDate = >::sse_decode(deserializer); + return crate::api::api::CloudProp { + gpufc: var_gpufc, + pv: var_pv, + number_of_times_respondedto_thread: var_numberOfTimesRespondedtoThread, + should_force_to_sms: var_shouldForceToSms, + last_seen_message_guid: var_lastSeenMessageGuid, + message_handshake_state: var_messageHandshakeState, + legacy_group_identifiers: var_legacyGroupIdentifiers, + group_photo_guid: var_groupPhotoGuid, + last_modification_date: var_lastModificationDate, + }; } - { - let CloudChat = None::.unwrap(); - let _: i64 = CloudChat.style; - let _: i64 = CloudChat.is_filtered; - let _: i64 = CloudChat.successful_query; - let _: i64 = CloudChat.state; - let _: String = CloudChat.chat_identifier; - let _: String = CloudChat.group_id; - let _: String = CloudChat.service_name; - let _: String = CloudChat.original_group_id; - let _: Option = CloudChat.properties; - let _: Vec = CloudChat.participants; - let _: crate::api::api::CloudProp001 = CloudChat.prop001; - let _: i64 = CloudChat.last_read_message_timestamp; - let _: String = CloudChat.last_addressed_handle; - let _: String = CloudChat.guid; - let _: Option = CloudChat.display_name; - let _: Option> = CloudChat.proto001; - let _: Option = CloudChat.group_photo_guid; - let _: Option = CloudChat.group_photo; +} + +impl SseDecode for crate::api::api::CloudProp001 { + // Codec=Sse (Serialization based), see doc to use other codecs + fn sse_decode(deserializer: &mut flutter_rust_bridge::for_generated::SseDeserializer) -> Self { + let mut var_syndicationType = ::sse_decode(deserializer); + return crate::api::api::CloudProp001 { + syndication_type: var_syndicationType, + }; } - { - let CloudMessage = None::.unwrap(); - let _: Option = CloudMessage.utm; - let _: i64 = CloudMessage.r#type; - let _: i64 = CloudMessage.error; - let _: String = CloudMessage.chat_id; - let _: String = CloudMessage.sender; - let _: i64 = CloudMessage.time; - let _: Option> = CloudMessage.msg_proto_2; - let _: String = CloudMessage.destination_caller_id; - let _: GZipWrapper = CloudMessage.msg_proto; - let _: MessageFlags = CloudMessage.flags; - let _: String = CloudMessage.guid; - let _: Option> = CloudMessage.msg_proto_3; - let _: String = CloudMessage.service; - let _: Option> = CloudMessage.msg_proto_4; +} + +impl SseDecode for crate::api::api::CloudSyncNativeAuthMetadata { + // Codec=Sse (Serialization based), see doc to use other codecs + fn sse_decode(deserializer: &mut flutter_rust_bridge::for_generated::SseDeserializer) -> Self { + let mut var_nativeSessionId = ::sse_decode(deserializer); + let mut var_accountFingerprint = ::sse_decode(deserializer); + let mut var_protectedStoreIdentity = ::sse_decode(deserializer); + return crate::api::api::CloudSyncNativeAuthMetadata { + native_session_id: var_nativeSessionId, + account_fingerprint: var_accountFingerprint, + protected_store_identity: var_protectedStoreIdentity, + }; } - { - let CloudMessageSummary = None::.unwrap(); - let _: Vec = CloudMessageSummary.messages_summary; - let _: Vec = CloudMessageSummary.chat_summary; - let _: Vec = CloudMessageSummary.attachment_summary; +} + +impl SseDecode for crate::api::api::CloudSyncOutboundConsumeResult { + // Codec=Sse (Serialization based), see doc to use other codecs + fn sse_decode(deserializer: &mut flutter_rust_bridge::for_generated::SseDeserializer) -> Self { + let mut var_outcomes = + >::sse_decode(deserializer); + let mut var_failure = + >::sse_decode(deserializer); + return crate::api::api::CloudSyncOutboundConsumeResult { + outcomes: var_outcomes, + failure: var_failure, + }; } - { - let CloudParticipant = None::.unwrap(); - let _: String = CloudParticipant.uri; +} + +impl SseDecode for crate::api::api::CloudSyncOutboundFailureClass { + // Codec=Sse (Serialization based), see doc to use other codecs + fn sse_decode(deserializer: &mut flutter_rust_bridge::for_generated::SseDeserializer) -> Self { + let mut inner = ::sse_decode(deserializer); + return match inner { + 0 => crate::api::api::CloudSyncOutboundFailureClass::Throttled, + 1 => crate::api::api::CloudSyncOutboundFailureClass::TransientServer, + 2 => crate::api::api::CloudSyncOutboundFailureClass::Authentication, + 3 => crate::api::api::CloudSyncOutboundFailureClass::Conflict, + 4 => crate::api::api::CloudSyncOutboundFailureClass::ResetRequired, + 5 => crate::api::api::CloudSyncOutboundFailureClass::Permanent, + 6 => crate::api::api::CloudSyncOutboundFailureClass::Unknown, + _ => unreachable!( + "Invalid variant for CloudSyncOutboundFailureClass: {}", + inner + ), + }; } - { - let CloudProp = None::.unwrap(); - let _: Option = CloudProp.gpufc; - let _: Option = CloudProp.pv; - let _: Option = CloudProp.number_of_times_respondedto_thread; - let _: Option = CloudProp.should_force_to_sms; - let _: Option = CloudProp.last_seen_message_guid; - let _: Option = CloudProp.message_handshake_state; - let _: Vec = CloudProp.legacy_group_identifiers; - let _: Option = CloudProp.group_photo_guid; - let _: Option = CloudProp.last_modification_date; +} + +impl SseDecode for crate::api::api::CloudSyncOutboundReconcileDisposition { + // Codec=Sse (Serialization based), see doc to use other codecs + fn sse_decode(deserializer: &mut flutter_rust_bridge::for_generated::SseDeserializer) -> Self { + let mut inner = ::sse_decode(deserializer); + return match inner { + 0 => crate::api::api::CloudSyncOutboundReconcileDisposition::Committed, + 1 => crate::api::api::CloudSyncOutboundReconcileDisposition::NotApplied, + 2 => crate::api::api::CloudSyncOutboundReconcileDisposition::Diverged, + 3 => crate::api::api::CloudSyncOutboundReconcileDisposition::Unresolved, + _ => unreachable!( + "Invalid variant for CloudSyncOutboundReconcileDisposition: {}", + inner + ), + }; } - { - let CloudProp001 = None::.unwrap(); - let _: u32 = CloudProp001.syndication_type; +} + +impl SseDecode for crate::api::api::CloudSyncOutboundReconcileResult { + // Codec=Sse (Serialization based), see doc to use other codecs + fn sse_decode(deserializer: &mut flutter_rust_bridge::for_generated::SseDeserializer) -> Self { + let mut var_disposition = + >::sse_decode( + deserializer, + ); + let mut var_protectedProofReference = >::sse_decode(deserializer); + let mut var_failureClass = + >::sse_decode(deserializer); + let mut var_retryAfterSeconds = >::sse_decode(deserializer); + let mut var_failure = + >::sse_decode(deserializer); + return crate::api::api::CloudSyncOutboundReconcileResult { + disposition: var_disposition, + protected_proof_reference: var_protectedProofReference, + failure_class: var_failureClass, + retry_after_seconds: var_retryAfterSeconds, + failure: var_failure, + }; } - { - let ConversationData = None::.unwrap(); - let _: Vec = ConversationData.participants; - let _: Option = ConversationData.cv_name; - let _: Option = ConversationData.sender_guid; - let _: Option = ConversationData.after_guid; +} + +impl SseDecode for crate::api::api::CloudSyncOutboundSafeCode { + // Codec=Sse (Serialization based), see doc to use other codecs + fn sse_decode(deserializer: &mut flutter_rust_bridge::for_generated::SseDeserializer) -> Self { + let mut inner = ::sse_decode(deserializer); + return match inner { + 0 => crate::api::api::CloudSyncOutboundSafeCode::InvalidScope, + 1 => crate::api::api::CloudSyncOutboundSafeCode::InvalidRequest, + 2 => crate::api::api::CloudSyncOutboundSafeCode::UnsupportedMessage, + 3 => crate::api::api::CloudSyncOutboundSafeCode::MalformedMessage, + 4 => crate::api::api::CloudSyncOutboundSafeCode::OversizedMessage, + 5 => crate::api::api::CloudSyncOutboundSafeCode::ProtectedStorage, + 6 => crate::api::api::CloudSyncOutboundSafeCode::BindingMismatch, + 7 => crate::api::api::CloudSyncOutboundSafeCode::NativeAuthUnavailable, + 8 => crate::api::api::CloudSyncOutboundSafeCode::NativePrepareFailed, + 9 => crate::api::api::CloudSyncOutboundSafeCode::AlreadyConsumed, + 10 => crate::api::api::CloudSyncOutboundSafeCode::CorrelationMismatch, + _ => unreachable!("Invalid variant for CloudSyncOutboundSafeCode: {}", inner), + }; } - match None::.unwrap() { - crate::api::api::DeleteTarget::Chat(field0) => { - let _: crate::api::api::OperatedChat = field0; - } - crate::api::api::DeleteTarget::Messages(field0) => { - let _: Vec = field0; - } +} + +impl SseDecode for crate::api::api::CloudSyncOutboundSaveDisposition { + // Codec=Sse (Serialization based), see doc to use other codecs + fn sse_decode(deserializer: &mut flutter_rust_bridge::for_generated::SseDeserializer) -> Self { + let mut inner = ::sse_decode(deserializer); + return match inner { + 0 => crate::api::api::CloudSyncOutboundSaveDisposition::Succeeded, + 1 => crate::api::api::CloudSyncOutboundSaveDisposition::UnknownOutcome, + 2 => crate::api::api::CloudSyncOutboundSaveDisposition::Failed, + _ => unreachable!( + "Invalid variant for CloudSyncOutboundSaveDisposition: {}", + inner + ), + }; } - { - let EditMessage = None::.unwrap(); - let _: String = EditMessage.tuuid; - let _: u64 = EditMessage.edit_part; - let _: crate::api::api::MessageParts = EditMessage.new_parts; +} + +impl SseDecode for crate::api::api::CloudSyncOutboundSaveOutcome { + // Codec=Sse (Serialization based), see doc to use other codecs + fn sse_decode(deserializer: &mut flutter_rust_bridge::for_generated::SseDeserializer) -> Self { + let mut var_localOperationId = ::sse_decode(deserializer); + let mut var_appleOperationUuid = ::sse_decode(deserializer); + let mut var_disposition = + ::sse_decode(deserializer); + let mut var_failureClass = + >::sse_decode(deserializer); + let mut var_retryAfterSeconds = >::sse_decode(deserializer); + return crate::api::api::CloudSyncOutboundSaveOutcome { + local_operation_id: var_localOperationId, + apple_operation_uuid: var_appleOperationUuid, + disposition: var_disposition, + failure_class: var_failureClass, + retry_after_seconds: var_retryAfterSeconds, + }; } - { - let ErrorMessage = None::.unwrap(); - let _: String = ErrorMessage.for_uuid; - let _: u64 = ErrorMessage.status; - let _: String = ErrorMessage.status_str; +} + +impl SseDecode for crate::api::api::CloudSyncPreparedMessageCreateInput { + // Codec=Sse (Serialization based), see doc to use other codecs + fn sse_decode(deserializer: &mut flutter_rust_bridge::for_generated::SseDeserializer) -> Self { + let mut var_localOperationId = ::sse_decode(deserializer); + let mut var_logicalEntityKeyHash = ::sse_decode(deserializer); + let mut var_protectedLeaseReference = ::sse_decode(deserializer); + let mut var_protectedPayloadReference = ::sse_decode(deserializer); + let mut var_payloadSha256 = ::sse_decode(deserializer); + let mut var_protectedServerRecordReference = ::sse_decode(deserializer); + let mut var_serverRecordIdHash = ::sse_decode(deserializer); + let mut var_appleOperationUuid = ::sse_decode(deserializer); + return crate::api::api::CloudSyncPreparedMessageCreateInput { + local_operation_id: var_localOperationId, + logical_entity_key_hash: var_logicalEntityKeyHash, + protected_lease_reference: var_protectedLeaseReference, + protected_payload_reference: var_protectedPayloadReference, + payload_sha256: var_payloadSha256, + protected_server_record_reference: var_protectedServerRecordReference, + server_record_id_hash: var_serverRecordIdHash, + apple_operation_uuid: var_appleOperationUuid, + }; } - { - let ExtensionApp = None::.unwrap(); - let _: String = ExtensionApp.name; - let _: Option = ExtensionApp.app_id; - let _: String = ExtensionApp.bundle_id; - let _: Option = ExtensionApp.balloon; +} + +impl SseDecode for crate::api::api::CloudSyncPreparedMessageCreateResult { + // Codec=Sse (Serialization based), see doc to use other codecs + fn sse_decode(deserializer: &mut flutter_rust_bridge::for_generated::SseDeserializer) -> Self { + let mut var_handle = + >::sse_decode(deserializer); + let mut var_failure = + >::sse_decode(deserializer); + return crate::api::api::CloudSyncPreparedMessageCreateResult { + handle: var_handle, + failure: var_failure, + }; } - { - let Follow = None::.unwrap(); - let _: i64 = Follow.create_timestamp; - let _: i64 = Follow.expires; - let _: String = Follow.id; - let _: Vec = Follow.invitation_accepted_handles; - let _: Vec = Follow.invitation_from_handles; - let _: bool = Follow.is_from_messages; - let _: Option = Follow.offer_id; - let _: bool = Follow.only_in_event; - let _: String = Follow.person_id_hash; - let _: bool = Follow.secure_locations_capable; - let _: bool = Follow.shallow_or_live_secure_locations_capable; - let _: String = Follow.source; - let _: bool = Follow.tk_permission; - let _: i64 = Follow.update_timestamp; - let _: Option = Follow.fallback_to_legacy_allowed; - let _: Option = Follow.opted_not_to_share; - let _: Option = Follow.last_location; - let _: bool = Follow.locate_in_progress; +} + +impl SseDecode for crate::api::api::CloudSyncProtectedChange { + // Codec=Sse (Serialization based), see doc to use other codecs + fn sse_decode(deserializer: &mut flutter_rust_bridge::for_generated::SseDeserializer) -> Self { + let mut var_changeId = ::sse_decode(deserializer); + let mut var_recordIdHash = ::sse_decode(deserializer); + let mut var_etagHash = >::sse_decode(deserializer); + let mut var_kind = + ::sse_decode(deserializer); + let mut var_payloadSha256 = ::sse_decode(deserializer); + let mut var_payloadLength = ::sse_decode(deserializer); + let mut var_protectedRecordIdentityReference = ::sse_decode(deserializer); + let mut var_protectedRawEnvelopeReference = ::sse_decode(deserializer); + let mut var_serverModifiedAtMillis = >::sse_decode(deserializer); + let mut var_preflightCode = + >::sse_decode(deserializer); + let mut var_isTombstone = ::sse_decode(deserializer); + return crate::api::api::CloudSyncProtectedChange { + change_id: var_changeId, + record_id_hash: var_recordIdHash, + etag_hash: var_etagHash, + kind: var_kind, + payload_sha256: var_payloadSha256, + payload_length: var_payloadLength, + protected_record_identity_reference: var_protectedRecordIdentityReference, + protected_raw_envelope_reference: var_protectedRawEnvelopeReference, + server_modified_at_millis: var_serverModifiedAtMillis, + preflight_code: var_preflightCode, + is_tombstone: var_isTombstone, + }; } - { - let FoundDevice = None::.unwrap(); - let _: Option = FoundDevice.device_model; - let _: Option = FoundDevice.low_power_mode; - let _: Option = FoundDevice.passcode_length; - let _: Option = FoundDevice.id; - let _: Option = FoundDevice.battery_status; - let _: Option = FoundDevice.lost_mode_capable; - let _: Option = FoundDevice.battery_level; - let _: Option = FoundDevice.location_enabled; - let _: Option = FoundDevice.is_considered_accessory; - let _: Option = FoundDevice.location; - let _: Option = FoundDevice.model_display_name; - let _: Option = FoundDevice.device_color; - let _: Option = FoundDevice.activation_locked; - let _: Option = FoundDevice.rm2_state; - let _: Option = FoundDevice.loc_found_enabled; - let _: Option = FoundDevice.nwd; - let _: Option = FoundDevice.device_status; - let _: Option = FoundDevice.fmly_share; - let _: std::collections::HashMap = FoundDevice.features; - let _: Option = FoundDevice.this_device; - let _: Option = FoundDevice.lost_mode_enabled; - let _: Option = FoundDevice.device_display_name; - let _: Option = FoundDevice.name; - let _: Option = FoundDevice.can_wipe_after_lock; - let _: Option = FoundDevice.is_mac; - let _: Option = FoundDevice.raw_device_model; - let _: Option = FoundDevice.ba_uuid; - let _: Option = FoundDevice.device_discovery_id; - let _: Option = FoundDevice.scd; - let _: Option = FoundDevice.location_capable; - let _: Option = FoundDevice.wipe_in_progress; - let _: Option = FoundDevice.dark_wake; - let _: Option = FoundDevice.device_with_you; - let _: Option = FoundDevice.max_msg_char; - let _: Option = FoundDevice.device_class; +} + +impl SseDecode for crate::api::api::CloudSyncProtectedChangeKind { + // Codec=Sse (Serialization based), see doc to use other codecs + fn sse_decode(deserializer: &mut flutter_rust_bridge::for_generated::SseDeserializer) -> Self { + let mut inner = ::sse_decode(deserializer); + return match inner { + 0 => crate::api::api::CloudSyncProtectedChangeKind::Save, + 1 => crate::api::api::CloudSyncProtectedChangeKind::Delete, + 2 => crate::api::api::CloudSyncProtectedChangeKind::Quarantined, + _ => unreachable!( + "Invalid variant for CloudSyncProtectedChangeKind: {}", + inner + ), + }; } - { - let FTMember = None::.unwrap(); - let _: Option = FTMember.nickname; - let _: String = FTMember.handle; +} + +impl SseDecode for crate::api::api::CloudSyncProtectedFailure { + // Codec=Sse (Serialization based), see doc to use other codecs + fn sse_decode(deserializer: &mut flutter_rust_bridge::for_generated::SseDeserializer) -> Self { + let mut var_category = + ::sse_decode(deserializer); + let mut var_safeCode = + ::sse_decode(deserializer); + let mut var_retryAfterSeconds = >::sse_decode(deserializer); + return crate::api::api::CloudSyncProtectedFailure { + category: var_category, + safe_code: var_safeCode, + retry_after_seconds: var_retryAfterSeconds, + }; } - match None::.unwrap() { - crate::api::api::FTMessage::LetMeInRequest(field0) => { - let _: crate::api::api::LetMeInRequest = field0; - } - crate::api::api::FTMessage::LinkChanged { guid } => { - let _: String = guid; - } - crate::api::api::FTMessage::JoinEvent { - guid, - participant, - handle, - ring, - } => { - let _: String = guid; - let _: u64 = participant; - let _: String = handle; - let _: bool = ring; - } - crate::api::api::FTMessage::AddMembers { - guid, - members, - ring, - } => { - let _: String = guid; - let _: std::collections::HashSet = members; - let _: bool = ring; - } - crate::api::api::FTMessage::RemoveMembers { guid, members } => { - let _: String = guid; - let _: std::collections::HashSet = members; - } - crate::api::api::FTMessage::LeaveEvent { - guid, - participant, - handle, - } => { - let _: String = guid; - let _: u64 = participant; - let _: String = handle; - } - crate::api::api::FTMessage::Ring { guid } => { - let _: String = guid; - } - crate::api::api::FTMessage::Decline { guid } => { - let _: String = guid; - } - crate::api::api::FTMessage::RespondedElsewhere { guid } => { - let _: String = guid; - } +} + +impl SseDecode for crate::api::api::CloudSyncProtectedFailureCategory { + // Codec=Sse (Serialization based), see doc to use other codecs + fn sse_decode(deserializer: &mut flutter_rust_bridge::for_generated::SseDeserializer) -> Self { + let mut inner = ::sse_decode(deserializer); + return match inner { + 0 => crate::api::api::CloudSyncProtectedFailureCategory::Network, + 1 => crate::api::api::CloudSyncProtectedFailureCategory::Throttled, + 2 => crate::api::api::CloudSyncProtectedFailureCategory::Server, + 3 => crate::api::api::CloudSyncProtectedFailureCategory::Authorization, + 4 => crate::api::api::CloudSyncProtectedFailureCategory::PcsUnavailable, + 5 => crate::api::api::CloudSyncProtectedFailureCategory::MalformedRecord, + 6 => crate::api::api::CloudSyncProtectedFailureCategory::Conflict, + 7 => crate::api::api::CloudSyncProtectedFailureCategory::LocalStorage, + 8 => crate::api::api::CloudSyncProtectedFailureCategory::Unknown, + _ => unreachable!( + "Invalid variant for CloudSyncProtectedFailureCategory: {}", + inner + ), + }; } - { - let FTParticipant = None::.unwrap(); - let _: Option = FTParticipant.token; - let _: String = FTParticipant.handle; - let _: u64 = FTParticipant.participant_id; - let _: Option = FTParticipant.last_join_date; - let _: Option = FTParticipant.active; +} + +impl SseDecode for crate::api::api::CloudSyncProtectedFetchResult { + // Codec=Sse (Serialization based), see doc to use other codecs + fn sse_decode(deserializer: &mut flutter_rust_bridge::for_generated::SseDeserializer) -> Self { + let mut var_page = + >::sse_decode(deserializer); + let mut var_failure = + >::sse_decode(deserializer); + return crate::api::api::CloudSyncProtectedFetchResult { + page: var_page, + failure: var_failure, + }; } - { - let FTSession = None::.unwrap(); - let _: String = FTSession.group_id; - let _: Vec = FTSession.my_handles; - let _: std::collections::HashMap = - FTSession.participants; - let _: Option = FTSession.link; - let _: std::collections::HashSet = FTSession.members; - let _: String = FTSession.report_id; - let _: Option = FTSession.start_time; - let _: Option = FTSession.last_rekey; - let _: bool = FTSession.is_propped; - let _: bool = FTSession.is_ringing_inaccurate; - let _: Option = FTSession.mode; - let _: std::collections::HashMap = FTSession.recent_member_adds; +} + +impl SseDecode for crate::api::api::CloudSyncProtectedGarbageCollection { + // Codec=Sse (Serialization based), see doc to use other codecs + fn sse_decode(deserializer: &mut flutter_rust_bridge::for_generated::SseDeserializer) -> Self { + let mut var_scannedCount = ::sse_decode(deserializer); + let mut var_firstObservedCount = ::sse_decode(deserializer); + let mut var_deletedCount = ::sse_decode(deserializer); + let mut var_preservedLiveCount = ::sse_decode(deserializer); + let mut var_preservedActiveLeaseCount = ::sse_decode(deserializer); + let mut var_hasMore = ::sse_decode(deserializer); + return crate::api::api::CloudSyncProtectedGarbageCollection { + scanned_count: var_scannedCount, + first_observed_count: var_firstObservedCount, + deleted_count: var_deletedCount, + preserved_live_count: var_preservedLiveCount, + preserved_active_lease_count: var_preservedActiveLeaseCount, + has_more: var_hasMore, + }; } - { - let IMessageNameRecord = None::.unwrap(); - let _: String = IMessageNameRecord.name; - let _: String = IMessageNameRecord.first; - let _: String = IMessageNameRecord.last; +} + +impl SseDecode for crate::api::api::CloudSyncProtectedGarbageCollectionResult { + // Codec=Sse (Serialization based), see doc to use other codecs + fn sse_decode(deserializer: &mut flutter_rust_bridge::for_generated::SseDeserializer) -> Self { + let mut var_collection = + >::sse_decode( + deserializer, + ); + let mut var_failure = + >::sse_decode(deserializer); + return crate::api::api::CloudSyncProtectedGarbageCollectionResult { + collection: var_collection, + failure: var_failure, + }; } - { - let IMessageNicknameRecord = None::.unwrap(); - let _: crate::api::api::IMessageNameRecord = IMessageNicknameRecord.name; - let _: Option> = IMessageNicknameRecord.image; - let _: Option = IMessageNicknameRecord.poster; +} + +impl SseDecode for crate::api::api::CloudSyncProtectedLeaseResult { + // Codec=Sse (Serialization based), see doc to use other codecs + fn sse_decode(deserializer: &mut flutter_rust_bridge::for_generated::SseDeserializer) -> Self { + let mut var_failure = + >::sse_decode(deserializer); + return crate::api::api::CloudSyncProtectedLeaseResult { + failure: var_failure, + }; } - { - let IMessagePosterRecord = None::.unwrap(); - let _: Vec = IMessagePosterRecord.low_res_poster; - let _: Vec = IMessagePosterRecord.package; - let _: Vec = IMessagePosterRecord.meta; +} + +impl SseDecode for crate::api::api::CloudSyncProtectedOutboundStage { + // Codec=Sse (Serialization based), see doc to use other codecs + fn sse_decode(deserializer: &mut flutter_rust_bridge::for_generated::SseDeserializer) -> Self { + let mut var_logicalEntityKeyHash = ::sse_decode(deserializer); + let mut var_protectedPayloadReference = ::sse_decode(deserializer); + let mut var_payloadSha256 = ::sse_decode(deserializer); + let mut var_payloadLength = ::sse_decode(deserializer); + let mut var_protectedServerRecordReference = ::sse_decode(deserializer); + let mut var_serverRecordIdHash = ::sse_decode(deserializer); + let mut var_leaseReference = ::sse_decode(deserializer); + return crate::api::api::CloudSyncProtectedOutboundStage { + logical_entity_key_hash: var_logicalEntityKeyHash, + protected_payload_reference: var_protectedPayloadReference, + payload_sha256: var_payloadSha256, + payload_length: var_payloadLength, + protected_server_record_reference: var_protectedServerRecordReference, + server_record_id_hash: var_serverRecordIdHash, + lease_reference: var_leaseReference, + }; } - { - let IconChangeMessage = None::.unwrap(); - let _: Option = IconChangeMessage.file; - let _: u64 = IconChangeMessage.group_version; +} + +impl SseDecode for crate::api::api::CloudSyncProtectedOutboundStageResult { + // Codec=Sse (Serialization based), see doc to use other codecs + fn sse_decode(deserializer: &mut flutter_rust_bridge::for_generated::SseDeserializer) -> Self { + let mut var_stage = + >::sse_decode(deserializer); + let mut var_failure = + >::sse_decode(deserializer); + return crate::api::api::CloudSyncProtectedOutboundStageResult { + stage: var_stage, + failure: var_failure, + }; } - { - let IdmsCircleMessage = None::.unwrap(); - let _: u32 = IdmsCircleMessage.step; - let _: String = IdmsCircleMessage.atxnid; - let _: Option = IdmsCircleMessage.pake; - let _: Option = IdmsCircleMessage.ec; - let _: String = IdmsCircleMessage.idmsdata; +} + +impl SseDecode for crate::api::api::CloudSyncProtectedPage { + // Codec=Sse (Serialization based), see doc to use other codecs + fn sse_decode(deserializer: &mut flutter_rust_bridge::for_generated::SseDeserializer) -> Self { + let mut var_changes = + >::sse_decode(deserializer); + let mut var_batchId = ::sse_decode(deserializer); + let mut var_generation = ::sse_decode(deserializer); + let mut var_pageLeaseReference = ::sse_decode(deserializer); + let mut var_protectedNextCheckpointReference = >::sse_decode(deserializer); + let mut var_complete = ::sse_decode(deserializer); + let mut var_admittedRawBytes = ::sse_decode(deserializer); + return crate::api::api::CloudSyncProtectedPage { + changes: var_changes, + batch_id: var_batchId, + generation: var_generation, + page_lease_reference: var_pageLeaseReference, + protected_next_checkpoint_reference: var_protectedNextCheckpointReference, + complete: var_complete, + admitted_raw_bytes: var_admittedRawBytes, + }; } - match None::.unwrap() { - crate::api::api::IdmsMessage::RequestedSignIn(field0) => { - let _: crate::api::api::IdmsRequestedSignIn = field0; - } - crate::api::api::IdmsMessage::TeardownSignIn(field0) => { - let _: crate::api::api::TeardownSignIn = field0; - } - crate::api::api::IdmsMessage::CircleRequest(field0, field1) => { - let _: crate::api::api::IdmsCircleMessage = field0; - let _: Option = field1; - } +} + +impl SseDecode for crate::api::api::CloudSyncProtectedPreflightCode { + // Codec=Sse (Serialization based), see doc to use other codecs + fn sse_decode(deserializer: &mut flutter_rust_bridge::for_generated::SseDeserializer) -> Self { + let mut inner = ::sse_decode(deserializer); + return match inner { + 0 => crate::api::api::CloudSyncProtectedPreflightCode::UnsupportedRecordType, + 1 => crate::api::api::CloudSyncProtectedPreflightCode::MalformedMetadata, + 2 => crate::api::api::CloudSyncProtectedPreflightCode::OversizedRecord, + 3 => crate::api::api::CloudSyncProtectedPreflightCode::InvalidChangeShape, + _ => unreachable!( + "Invalid variant for CloudSyncProtectedPreflightCode: {}", + inner + ), + }; } - { - let IdmsRequestedSignIn = None::.unwrap(); - let _: crate::api::api::ApsData = IdmsRequestedSignIn.aps; - let _: String = IdmsRequestedSignIn.txnid; - let _: crate::api::api::AkData = IdmsRequestedSignIn.akdata; - let _: String = IdmsRequestedSignIn.adsid; +} + +impl SseDecode for crate::api::api::CloudSyncProtectedRecovery { + // Codec=Sse (Serialization based), see doc to use other codecs + fn sse_decode(deserializer: &mut flutter_rust_bridge::for_generated::SseDeserializer) -> Self { + let mut var_finalizedAdoptedLeaseReferences = >::sse_decode(deserializer); + let mut var_absentAdoptedLeaseReferences = >::sse_decode(deserializer); + let mut var_rolledBackCount = ::sse_decode(deserializer); + let mut var_removedTemporaryFilesCount = ::sse_decode(deserializer); + let mut var_hasMore = ::sse_decode(deserializer); + return crate::api::api::CloudSyncProtectedRecovery { + finalized_adopted_lease_references: var_finalizedAdoptedLeaseReferences, + absent_adopted_lease_references: var_absentAdoptedLeaseReferences, + rolled_back_count: var_rolledBackCount, + removed_temporary_files_count: var_removedTemporaryFilesCount, + has_more: var_hasMore, + }; } - { - let IndexedMessagePart = None::.unwrap(); - let _: crate::api::api::MessagePart = IndexedMessagePart.part; - let _: Option = IndexedMessagePart.idx; - let _: Option = IndexedMessagePart.ext; +} + +impl SseDecode for crate::api::api::CloudSyncProtectedRecoveryResult { + // Codec=Sse (Serialization based), see doc to use other codecs + fn sse_decode(deserializer: &mut flutter_rust_bridge::for_generated::SseDeserializer) -> Self { + let mut var_recovery = + >::sse_decode(deserializer); + let mut var_failure = + >::sse_decode(deserializer); + return crate::api::api::CloudSyncProtectedRecoveryResult { + recovery: var_recovery, + failure: var_failure, + }; } - { - let LetMeInRequest = None::.unwrap(); - let _: Vec = LetMeInRequest.shared_secret; - let _: String = LetMeInRequest.pseud; - let _: String = LetMeInRequest.requestor; - let _: Option = LetMeInRequest.nickname; - let _: Vec = LetMeInRequest.token; - let _: Option = LetMeInRequest.delegation_uuid; - let _: Option = LetMeInRequest.usage; +} + +impl SseDecode for crate::api::api::CloudSyncProtectedRetirementResult { + // Codec=Sse (Serialization based), see doc to use other codecs + fn sse_decode(deserializer: &mut flutter_rust_bridge::for_generated::SseDeserializer) -> Self { + let mut var_retiredCount = ::sse_decode(deserializer); + let mut var_failure = + >::sse_decode(deserializer); + return crate::api::api::CloudSyncProtectedRetirementResult { + retired_count: var_retiredCount, + failure: var_failure, + }; } - { - let LinkMeta = None::.unwrap(); - let _: crate::api::api::LPLinkMetadata = LinkMeta.data; - let _: Vec> = LinkMeta.attachments; +} + +impl SseDecode for crate::api::api::CloudSyncProtectedSafeCode { + // Codec=Sse (Serialization based), see doc to use other codecs + fn sse_decode(deserializer: &mut flutter_rust_bridge::for_generated::SseDeserializer) -> Self { + let mut inner = ::sse_decode(deserializer); + return match inner { + 0 => crate::api::api::CloudSyncProtectedSafeCode::InvalidScope, + 1 => crate::api::api::CloudSyncProtectedSafeCode::InvalidRequest, + 2 => crate::api::api::CloudSyncProtectedSafeCode::InvalidCheckpoint, + 3 => crate::api::api::CloudSyncProtectedSafeCode::CheckpointContextMismatch, + 4 => crate::api::api::CloudSyncProtectedSafeCode::OversizedPage, + 5 => crate::api::api::CloudSyncProtectedSafeCode::OversizedRecord, + 6 => crate::api::api::CloudSyncProtectedSafeCode::ProtectionFailed, + 7 => crate::api::api::CloudSyncProtectedSafeCode::LocalStoreFailed, + 8 => crate::api::api::CloudSyncProtectedSafeCode::FetchDeadline, + 9 => crate::api::api::CloudSyncProtectedSafeCode::Network, + 10 => crate::api::api::CloudSyncProtectedSafeCode::CloudKitThrottled, + 11 => crate::api::api::CloudSyncProtectedSafeCode::CloudKitServer, + 12 => crate::api::api::CloudSyncProtectedSafeCode::CloudKitAuthorization, + 13 => crate::api::api::CloudSyncProtectedSafeCode::CloudKitConflict, + 14 => crate::api::api::CloudSyncProtectedSafeCode::CloudKitResetRequired, + 15 => crate::api::api::CloudSyncProtectedSafeCode::CloudKitPermanent, + 16 => crate::api::api::CloudSyncProtectedSafeCode::CloudKitUnknown, + 17 => crate::api::api::CloudSyncProtectedSafeCode::HttpAuthorization, + 18 => crate::api::api::CloudSyncProtectedSafeCode::HttpTimeout, + 19 => crate::api::api::CloudSyncProtectedSafeCode::HttpThrottled, + 20 => crate::api::api::CloudSyncProtectedSafeCode::HttpServer, + 21 => crate::api::api::CloudSyncProtectedSafeCode::HttpUnknown, + 22 => crate::api::api::CloudSyncProtectedSafeCode::PcsUnavailable, + 23 => crate::api::api::CloudSyncProtectedSafeCode::MalformedResponse, + 24 => crate::api::api::CloudSyncProtectedSafeCode::ContinuationNoProgress, + 25 => crate::api::api::CloudSyncProtectedSafeCode::NativeAuthUnavailable, + 26 => crate::api::api::CloudSyncProtectedSafeCode::Unknown, + _ => unreachable!("Invalid variant for CloudSyncProtectedSafeCode: {}", inner), + }; } - { - let Location = None::.unwrap(); - let _: Option = Location.address; - let _: f64 = Location.altitude; - let _: i64 = Location.floor_level; - let _: f64 = Location.horizontal_accuracy; - let _: bool = Location.is_inaccurate; - let _: f64 = Location.latitude; - let _: Option = Location.location_id; - let _: Option = Location.location_timestamp; - let _: f64 = Location.longitude; - let _: i64 = Location.secure_location_ts; - let _: i64 = Location.timestamp; - let _: f64 = Location.vertical_accuracy; - let _: Option = Location.position_type; - let _: Option = Location.is_old; - let _: Option = Location.location_finished; +} + +impl SseDecode for crate::api::api::CloudSyncRawChange { + // Codec=Sse (Serialization based), see doc to use other codecs + fn sse_decode(deserializer: &mut flutter_rust_bridge::for_generated::SseDeserializer) -> Self { + let mut var_recordName = >::sse_decode(deserializer); + let mut var_recordType = >::sse_decode(deserializer); + let mut var_changeType = >::sse_decode(deserializer); + let mut var_systemFields = + >::sse_decode(deserializer); + let mut var_encryptedRecord = >>::sse_decode(deserializer); + let mut var_tombstonePayload = >>::sse_decode(deserializer); + let mut var_kind = ::sse_decode(deserializer); + return crate::api::api::CloudSyncRawChange { + record_name: var_recordName, + record_type: var_recordType, + change_type: var_changeType, + system_fields: var_systemFields, + encrypted_record: var_encryptedRecord, + tombstone_payload: var_tombstonePayload, + kind: var_kind, + }; } - match None::.unwrap() { - crate::api::api::LoginState::LoggedIn => {} - crate::api::api::LoginState::NeedsDevice2FA => {} - crate::api::api::LoginState::Needs2FAVerification => {} - crate::api::api::LoginState::NeedsSMS2FA => {} - crate::api::api::LoginState::NeedsSMS2FAVerification(field0) => { - let _: VerifyBody = field0; - } - crate::api::api::LoginState::NeedsExtraStep(field0) => { - let _: String = field0; - } - crate::api::api::LoginState::NeedsLogin => {} +} + +impl SseDecode for crate::api::api::CloudSyncRawFailure { + // Codec=Sse (Serialization based), see doc to use other codecs + fn sse_decode(deserializer: &mut flutter_rust_bridge::for_generated::SseDeserializer) -> Self { + let mut var_category = + ::sse_decode(deserializer); + let mut var_retryAfterSeconds = >::sse_decode(deserializer); + let mut var_safeCode = ::sse_decode(deserializer); + return crate::api::api::CloudSyncRawFailure { + category: var_category, + retry_after_seconds: var_retryAfterSeconds, + safe_code: var_safeCode, + }; } - { - let LPIconMetadata = None::.unwrap(); - let _: crate::api::api::NSURL = LPIconMetadata.url; - let _: u8 = LPIconMetadata.version; +} + +impl SseDecode for crate::api::api::CloudSyncRawFailureCategory { + // Codec=Sse (Serialization based), see doc to use other codecs + fn sse_decode(deserializer: &mut flutter_rust_bridge::for_generated::SseDeserializer) -> Self { + let mut inner = ::sse_decode(deserializer); + return match inner { + 0 => crate::api::api::CloudSyncRawFailureCategory::Network, + 1 => crate::api::api::CloudSyncRawFailureCategory::Throttled, + 2 => crate::api::api::CloudSyncRawFailureCategory::Server, + 3 => crate::api::api::CloudSyncRawFailureCategory::Authorization, + 4 => crate::api::api::CloudSyncRawFailureCategory::PcsUnavailable, + 5 => crate::api::api::CloudSyncRawFailureCategory::MalformedRecord, + 6 => crate::api::api::CloudSyncRawFailureCategory::Conflict, + 7 => crate::api::api::CloudSyncRawFailureCategory::LocalStorage, + 8 => crate::api::api::CloudSyncRawFailureCategory::Unknown, + _ => unreachable!("Invalid variant for CloudSyncRawFailureCategory: {}", inner), + }; } - { - let LPImageMetadata = None::.unwrap(); - let _: String = LPImageMetadata.size; - let _: crate::api::api::NSURL = LPImageMetadata.url; - let _: u8 = LPImageMetadata.version; +} + +impl SseDecode for crate::api::api::CloudSyncRawFetchResult { + // Codec=Sse (Serialization based), see doc to use other codecs + fn sse_decode(deserializer: &mut flutter_rust_bridge::for_generated::SseDeserializer) -> Self { + let mut var_page = >::sse_decode(deserializer); + let mut var_failure = + >::sse_decode(deserializer); + return crate::api::api::CloudSyncRawFetchResult { + page: var_page, + failure: var_failure, + }; } - { - let LPLinkMetadata = None::.unwrap(); - let _: Option = LPLinkMetadata.image_metadata; - let _: u8 = LPLinkMetadata.version; - let _: Option = LPLinkMetadata.icon_metadata; - let _: Option = LPLinkMetadata.original_url; - let _: Option = LPLinkMetadata.url; - let _: Option = LPLinkMetadata.title; - let _: Option = LPLinkMetadata.summary; - let _: Option = LPLinkMetadata.image; - let _: Option = LPLinkMetadata.icon; - let _: Option> = LPLinkMetadata.images; - let _: Option> = LPLinkMetadata.icons; - let _: Option = LPLinkMetadata.is_incomplete; - let _: Option = LPLinkMetadata.uses_activity_pub; - let _: Option = LPLinkMetadata.is_encoded_for_local_use; - let _: Option = LPLinkMetadata.collaboration_type; - let _: Option = LPLinkMetadata.specialization2; +} + +impl SseDecode for crate::api::api::CloudSyncRawPage { + // Codec=Sse (Serialization based), see doc to use other codecs + fn sse_decode(deserializer: &mut flutter_rust_bridge::for_generated::SseDeserializer) -> Self { + let mut var_changes = >::sse_decode(deserializer); + let mut var_nextToken = >>::sse_decode(deserializer); + let mut var_status = ::sse_decode(deserializer); + let mut var_complete = ::sse_decode(deserializer); + return crate::api::api::CloudSyncRawPage { + changes: var_changes, + next_token: var_nextToken, + status: var_status, + complete: var_complete, + }; } - match None::.unwrap() { - crate::api::api::LPSpecializationMetadata::LPPasswordsInviteMetadata { - group_name, - url_parameters, - } => { - let _: String = group_name; - let _: String = url_parameters; - } +} + +impl SseDecode for crate::api::api::CloudSyncRawRecordKind { + // Codec=Sse (Serialization based), see doc to use other codecs + fn sse_decode(deserializer: &mut flutter_rust_bridge::for_generated::SseDeserializer) -> Self { + let mut inner = ::sse_decode(deserializer); + return match inner { + 0 => crate::api::api::CloudSyncRawRecordKind::EncryptedUpsert, + 1 => crate::api::api::CloudSyncRawRecordKind::Tombstone, + 2 => crate::api::api::CloudSyncRawRecordKind::UnsupportedRecordType, + 3 => crate::api::api::CloudSyncRawRecordKind::MalformedMetadata, + _ => unreachable!("Invalid variant for CloudSyncRawRecordKind: {}", inner), + }; } - { - let MemojiData = None::.unwrap(); - let _: crate::api::api::PosterColor = MemojiData.background_color_description; - let _: Vec = MemojiData.avatar_record_data; - let _: Vec = MemojiData.avatar_pose_data; - let _: bool = MemojiData.has_body; - let _: Vec = MemojiData.avatar_image_data; +} + +impl SseDecode for crate::api::api::CloudSyncRawSystemFields { + // Codec=Sse (Serialization based), see doc to use other codecs + fn sse_decode(deserializer: &mut flutter_rust_bridge::for_generated::SseDeserializer) -> Self { + let mut var_etag = >::sse_decode(deserializer); + let mut var_createdAt = >::sse_decode(deserializer); + let mut var_modifiedAt = >::sse_decode(deserializer); + let mut var_permission = >::sse_decode(deserializer); + return crate::api::api::CloudSyncRawSystemFields { + etag: var_etag, + created_at: var_createdAt, + modified_at: var_modifiedAt, + permission: var_permission, + }; } - match None::.unwrap() { - crate::api::api::Message::Message(field0) => { - let _: crate::api::api::NormalMessage = field0; - } - crate::api::api::Message::RenameMessage(field0) => { - let _: crate::api::api::RenameMessage = field0; - } - crate::api::api::Message::ChangeParticipants(field0) => { - let _: crate::api::api::ChangeParticipantMessage = field0; - } - crate::api::api::Message::React(field0) => { - let _: crate::api::api::ReactMessage = field0; - } - crate::api::api::Message::Delivered => {} - crate::api::api::Message::Read => {} - crate::api::api::Message::Typing(field0, field1) => { - let _: bool = field0; - let _: Option = field1; - } - crate::api::api::Message::Unsend(field0) => { - let _: crate::api::api::UnsendMessage = field0; - } - crate::api::api::Message::Edit(field0) => { - let _: crate::api::api::EditMessage = field0; - } - crate::api::api::Message::IconChange(field0) => { - let _: crate::api::api::IconChangeMessage = field0; - } - crate::api::api::Message::EnableSmsActivation(field0) => { - let _: bool = field0; - } - crate::api::api::Message::MessageReadOnDevice => {} - crate::api::api::Message::SmsConfirmSent(field0) => { - let _: bool = field0; - } - crate::api::api::Message::MarkUnread => {} - crate::api::api::Message::PeerCacheInvalidate => {} - crate::api::api::Message::UpdateExtension(field0) => { - let _: crate::api::api::UpdateExtensionMessage = field0; - } - crate::api::api::Message::Error(field0) => { - let _: crate::api::api::ErrorMessage = field0; - } - crate::api::api::Message::MoveToRecycleBin(field0) => { - let _: crate::api::api::MoveToRecycleBinMessage = field0; - } - crate::api::api::Message::RecoverChat(field0) => { - let _: crate::api::api::OperatedChat = field0; - } - crate::api::api::Message::PermanentDelete(field0) => { - let _: crate::api::api::PermanentDeleteMessage = field0; - } - crate::api::api::Message::Unschedule => {} - crate::api::api::Message::UpdateProfile(field0) => { - let _: crate::api::api::UpdateProfileMessage = field0; - } - crate::api::api::Message::UpdateProfileSharing(field0) => { - let _: crate::api::api::UpdateProfileSharingMessage = field0; - } - crate::api::api::Message::ShareProfile(field0) => { - let _: crate::api::api::ShareProfileMessage = field0; - } - crate::api::api::Message::NotifyAnyways => {} - crate::api::api::Message::SetTranscriptBackground(field0) => { - let _: crate::api::api::SetTranscriptBackgroundMessage = field0; - } +} + +impl SseDecode for crate::api::api::CloudSyncTransientAssociationKind { + // Codec=Sse (Serialization based), see doc to use other codecs + fn sse_decode(deserializer: &mut flutter_rust_bridge::for_generated::SseDeserializer) -> Self { + let mut inner = ::sse_decode(deserializer); + return match inner { + 0 => crate::api::api::CloudSyncTransientAssociationKind::None, + 1 => crate::api::api::CloudSyncTransientAssociationKind::Sticker, + 2 => crate::api::api::CloudSyncTransientAssociationKind::ReactionAdd, + 3 => crate::api::api::CloudSyncTransientAssociationKind::ReactionRemove, + _ => unreachable!( + "Invalid variant for CloudSyncTransientAssociationKind: {}", + inner + ), + }; } - { - let MessageEdit = None::.unwrap(); - let _: Vec = MessageEdit.t; - let _: f64 = MessageEdit.d; - let _: Option = MessageEdit.bcg; +} + +impl SseDecode for crate::api::api::CloudSyncTransientAttachmentPayload { + // Codec=Sse (Serialization based), see doc to use other codecs + fn sse_decode(deserializer: &mut flutter_rust_bridge::for_generated::SseDeserializer) -> Self { + let mut var_logicalEntityKeyHash = ::sse_decode(deserializer); + let mut var_canonicalGuid = ::sse_decode(deserializer); + let mut var_ownerLogicalKeyHash = >::sse_decode(deserializer); + let mut var_ownerCanonicalGuid = >::sse_decode(deserializer); + let mut var_ownerPart = >::sse_decode(deserializer); + let mut var_utiState = + ::sse_decode(deserializer); + let mut var_uti = >::sse_decode(deserializer); + let mut var_fileNameState = + ::sse_decode(deserializer); + let mut var_fileName = >::sse_decode(deserializer); + let mut var_mimeTypeState = + ::sse_decode(deserializer); + let mut var_mimeType = >::sse_decode(deserializer); + let mut var_totalBytesState = + ::sse_decode(deserializer); + let mut var_totalBytes = >::sse_decode(deserializer); + let mut var_isOutgoingState = + ::sse_decode(deserializer); + let mut var_isOutgoing = >::sse_decode(deserializer); + let mut var_protectedLocalReferenceState = + ::sse_decode(deserializer); + let mut var_protectedLocalReference = >::sse_decode(deserializer); + return crate::api::api::CloudSyncTransientAttachmentPayload { + logical_entity_key_hash: var_logicalEntityKeyHash, + canonical_guid: var_canonicalGuid, + owner_logical_key_hash: var_ownerLogicalKeyHash, + owner_canonical_guid: var_ownerCanonicalGuid, + owner_part: var_ownerPart, + uti_state: var_utiState, + uti: var_uti, + file_name_state: var_fileNameState, + file_name: var_fileName, + mime_type_state: var_mimeTypeState, + mime_type: var_mimeType, + total_bytes_state: var_totalBytesState, + total_bytes: var_totalBytes, + is_outgoing_state: var_isOutgoingState, + is_outgoing: var_isOutgoing, + protected_local_reference_state: var_protectedLocalReferenceState, + protected_local_reference: var_protectedLocalReference, + }; } - { - let MessageEditRange = None::.unwrap(); - let _: u32 = MessageEditRange.lo; - let _: u32 = MessageEditRange.le; +} + +impl SseDecode for crate::api::api::CloudSyncTransientAttributedBody { + // Codec=Sse (Serialization based), see doc to use other codecs + fn sse_decode(deserializer: &mut flutter_rust_bridge::for_generated::SseDeserializer) -> Self { + let mut var_text = ::sse_decode(deserializer); + let mut var_runs = + >::sse_decode(deserializer); + return crate::api::api::CloudSyncTransientAttributedBody { + text: var_text, + runs: var_runs, + }; } - { - let MessageInst = None::.unwrap(); - let _: String = MessageInst.id; - let _: Option = MessageInst.sender; - let _: Option = MessageInst.conversation; - let _: crate::api::api::Message = MessageInst.message; - let _: u64 = MessageInst.sent_timestamp; - let _: Option> = MessageInst.target; - let _: bool = MessageInst.send_delivered; - let _: bool = MessageInst.verification_failed; - let _: Option = MessageInst.certified_context; +} + +impl SseDecode for crate::api::api::CloudSyncTransientChatPayload { + // Codec=Sse (Serialization based), see doc to use other codecs + fn sse_decode(deserializer: &mut flutter_rust_bridge::for_generated::SseDeserializer) -> Self { + let mut var_logicalEntityKeyHash = ::sse_decode(deserializer); + let mut var_canonicalGuid = ::sse_decode(deserializer); + let mut var_chatIdentifier = ::sse_decode(deserializer); + let mut var_groupId = ::sse_decode(deserializer); + let mut var_originalGroupId = ::sse_decode(deserializer); + let mut var_service = + ::sse_decode(deserializer); + let mut var_style = + ::sse_decode(deserializer); + let mut var_participantHandles = >::sse_decode(deserializer); + let mut var_displayNameState = + ::sse_decode(deserializer); + let mut var_displayName = >::sse_decode(deserializer); + let mut var_lastAddressedHandleState = + ::sse_decode(deserializer); + let mut var_lastAddressedHandle = >::sse_decode(deserializer); + let mut var_groupVersionState = + ::sse_decode(deserializer); + let mut var_groupVersion = >::sse_decode(deserializer); + let mut var_lastSeenMessageGuidState = + ::sse_decode(deserializer); + let mut var_lastSeenMessageGuid = >::sse_decode(deserializer); + let mut var_groupPhotoGuidState = + ::sse_decode(deserializer); + let mut var_groupPhotoGuid = >::sse_decode(deserializer); + return crate::api::api::CloudSyncTransientChatPayload { + logical_entity_key_hash: var_logicalEntityKeyHash, + canonical_guid: var_canonicalGuid, + chat_identifier: var_chatIdentifier, + group_id: var_groupId, + original_group_id: var_originalGroupId, + service: var_service, + style: var_style, + participant_handles: var_participantHandles, + display_name_state: var_displayNameState, + display_name: var_displayName, + last_addressed_handle_state: var_lastAddressedHandleState, + last_addressed_handle: var_lastAddressedHandle, + group_version_state: var_groupVersionState, + group_version: var_groupVersion, + last_seen_message_guid_state: var_lastSeenMessageGuidState, + last_seen_message_guid: var_lastSeenMessageGuid, + group_photo_guid_state: var_groupPhotoGuidState, + group_photo_guid: var_groupPhotoGuid, + }; } - match None::.unwrap() { - crate::api::api::MessagePart::Text(field0, field1) => { - let _: String = field0; - let _: crate::api::api::TextFormat = field1; - } - crate::api::api::MessagePart::Attachment(field0) => { - let _: crate::api::api::Attachment = field0; - } - crate::api::api::MessagePart::Mention(field0, field1) => { - let _: String = field0; - let _: String = field1; - } - crate::api::api::MessagePart::Object(field0) => { - let _: String = field0; - } +} + +impl SseDecode for crate::api::api::CloudSyncTransientChatStyle { + // Codec=Sse (Serialization based), see doc to use other codecs + fn sse_decode(deserializer: &mut flutter_rust_bridge::for_generated::SseDeserializer) -> Self { + let mut inner = ::sse_decode(deserializer); + return match inner { + 0 => crate::api::api::CloudSyncTransientChatStyle::Direct, + 1 => crate::api::api::CloudSyncTransientChatStyle::Group, + _ => unreachable!("Invalid variant for CloudSyncTransientChatStyle: {}", inner), + }; } - { - let MessageParts_ = None::.unwrap(); - let _: Vec = MessageParts_.0; +} + +impl SseDecode for crate::api::api::CloudSyncTransientDecodeResult { + // Codec=Sse (Serialization based), see doc to use other codecs + fn sse_decode(deserializer: &mut flutter_rust_bridge::for_generated::SseDeserializer) -> Self { + let mut var_protectedSourceReference = >::sse_decode(deserializer); + let mut var_generation = ::sse_decode(deserializer); + let mut var_changeId = >::sse_decode(deserializer); + let mut var_entityKind = + >::sse_decode(deserializer); + let mut var_mutationKind = + >::sse_decode(deserializer); + let mut var_snapshot = + >::sse_decode(deserializer); + let mut var_payload = + >::sse_decode(deserializer); + let mut var_tombstone = + >::sse_decode(deserializer); + let mut var_deferredReason = + >::sse_decode(deserializer); + let mut var_quarantineReason = + >::sse_decode(deserializer); + let mut var_failureCode = + >::sse_decode(deserializer); + return crate::api::api::CloudSyncTransientDecodeResult { + protected_source_reference: var_protectedSourceReference, + generation: var_generation, + change_id: var_changeId, + entity_kind: var_entityKind, + mutation_kind: var_mutationKind, + snapshot: var_snapshot, + payload: var_payload, + tombstone: var_tombstone, + deferred_reason: var_deferredReason, + quarantine_reason: var_quarantineReason, + failure_code: var_failureCode, + }; } - { - let MessageProto = None::.unwrap(); - let _: u32 = MessageProto.unk1; - let _: Option = MessageProto.subject; - let _: Option = MessageProto.text; - let _: Option> = MessageProto.attributed_body; - let _: Option = MessageProto.balloon_bundle_id; - let _: Option> = MessageProto.payload_data; - let _: Option> = MessageProto.message_summary_info; - let _: Option = MessageProto.effect; - let _: Option = MessageProto.date_read; - let _: Option = MessageProto.unk10; - let _: Option = MessageProto.unk11; - let _: Option = MessageProto.date_delivered; - let _: Option = MessageProto.unk14; - let _: Option = MessageProto.associated_message_type; - let _: Option = MessageProto.associated_message_guid; - let _: Option = MessageProto.associated_message_range_location; - let _: Option = MessageProto.associated_message_range_length; +} + +impl SseDecode for crate::api::api::CloudSyncTransientDeferredReason { + // Codec=Sse (Serialization based), see doc to use other codecs + fn sse_decode(deserializer: &mut flutter_rust_bridge::for_generated::SseDeserializer) -> Self { + let mut inner = ::sse_decode(deserializer); + return match inner { + 0 => crate::api::api::CloudSyncTransientDeferredReason::NestedPresenceUnavailable, + 1 => crate::api::api::CloudSyncTransientDeferredReason::UnprovenEditTimestamp, + 2 => crate::api::api::CloudSyncTransientDeferredReason::UnsupportedExtensionPayload, + 3 => crate::api::api::CloudSyncTransientDeferredReason::UnsupportedMediaCredentials, + 4 => crate::api::api::CloudSyncTransientDeferredReason::UnsupportedGroupPhoto, + 5 => crate::api::api::CloudSyncTransientDeferredReason::UnsupportedSticker, + 6 => crate::api::api::CloudSyncTransientDeferredReason::UnsupportedScheduling, + 7 => crate::api::api::CloudSyncTransientDeferredReason::UnsupportedOffGridMetadata, + 8 => { + crate::api::api::CloudSyncTransientDeferredReason::UnsupportedNegativeAttachmentSize + } + _ => unreachable!( + "Invalid variant for CloudSyncTransientDeferredReason: {}", + inner + ), + }; } - { - let MessageProto2 = None::.unwrap(); - let _: Option = MessageProto2.reply; +} + +impl SseDecode for crate::api::api::CloudSyncTransientEditPart { + // Codec=Sse (Serialization based), see doc to use other codecs + fn sse_decode(deserializer: &mut flutter_rust_bridge::for_generated::SseDeserializer) -> Self { + let mut var_partKeyHash = ::sse_decode(deserializer); + let mut var_revision = ::sse_decode(deserializer); + let mut var_contentDigest = ::sse_decode(deserializer); + let mut var_modifiedAtMillis = ::sse_decode(deserializer); + return crate::api::api::CloudSyncTransientEditPart { + part_key_hash: var_partKeyHash, + revision: var_revision, + content_digest: var_contentDigest, + modified_at_millis: var_modifiedAtMillis, + }; } - { - let MessageProto3 = None::.unwrap(); - let _: Option = MessageProto3.unk2; - let _: Option = MessageProto3.unk3; +} + +impl SseDecode for crate::api::api::CloudSyncTransientEntityKind { + // Codec=Sse (Serialization based), see doc to use other codecs + fn sse_decode(deserializer: &mut flutter_rust_bridge::for_generated::SseDeserializer) -> Self { + let mut inner = ::sse_decode(deserializer); + return match inner { + 0 => crate::api::api::CloudSyncTransientEntityKind::Chat, + 1 => crate::api::api::CloudSyncTransientEntityKind::Message, + 2 => crate::api::api::CloudSyncTransientEntityKind::Reaction, + 3 => crate::api::api::CloudSyncTransientEntityKind::Attachment, + 4 => crate::api::api::CloudSyncTransientEntityKind::GroupPhoto, + _ => unreachable!( + "Invalid variant for CloudSyncTransientEntityKind: {}", + inner + ), + }; } - { - let MessageProto4 = None::.unwrap(); - let _: Option = MessageProto4.associated_message_emoji; - let _: Option = MessageProto4.service; - let _: Option = MessageProto4.schedule_type; - let _: Option = MessageProto4.schedule_state; - let _: Option = MessageProto4.group_id; - let _: Option = MessageProto4.sent_or_received_off_grid; +} + +impl SseDecode for crate::api::api::CloudSyncTransientFailureCode { + // Codec=Sse (Serialization based), see doc to use other codecs + fn sse_decode(deserializer: &mut flutter_rust_bridge::for_generated::SseDeserializer) -> Self { + let mut inner = ::sse_decode(deserializer); + return match inner { + 0 => crate::api::api::CloudSyncTransientFailureCode::InvalidRequest, + 1 => crate::api::api::CloudSyncTransientFailureCode::ActiveAccountMismatch, + 2 => crate::api::api::CloudSyncTransientFailureCode::ScopeMismatch, + 3 => crate::api::api::CloudSyncTransientFailureCode::GenerationMismatch, + 4 => crate::api::api::CloudSyncTransientFailureCode::StoreIdentityMismatch, + 5 => crate::api::api::CloudSyncTransientFailureCode::ProtectedReferenceMismatch, + 6 => crate::api::api::CloudSyncTransientFailureCode::MalformedRecord, + 7 => crate::api::api::CloudSyncTransientFailureCode::OversizedRecord, + 8 => crate::api::api::CloudSyncTransientFailureCode::PcsUnavailable, + 9 => crate::api::api::CloudSyncTransientFailureCode::RetryableUpstream, + 10 => crate::api::api::CloudSyncTransientFailureCode::DecoderFailure, + _ => unreachable!( + "Invalid variant for CloudSyncTransientFailureCode: {}", + inner + ), + }; + } +} + +impl SseDecode for crate::api::api::CloudSyncTransientFieldState { + // Codec=Sse (Serialization based), see doc to use other codecs + fn sse_decode(deserializer: &mut flutter_rust_bridge::for_generated::SseDeserializer) -> Self { + let mut inner = ::sse_decode(deserializer); + return match inner { + 0 => crate::api::api::CloudSyncTransientFieldState::Absent, + 1 => crate::api::api::CloudSyncTransientFieldState::Value, + 2 => crate::api::api::CloudSyncTransientFieldState::ExplicitClear, + _ => unreachable!( + "Invalid variant for CloudSyncTransientFieldState: {}", + inner + ), + }; + } +} + +impl SseDecode for crate::api::api::CloudSyncTransientGroupPhotoPayload { + // Codec=Sse (Serialization based), see doc to use other codecs + fn sse_decode(deserializer: &mut flutter_rust_bridge::for_generated::SseDeserializer) -> Self { + let mut var_logicalEntityKeyHash = ::sse_decode(deserializer); + let mut var_ownerLogicalKeyHash = ::sse_decode(deserializer); + let mut var_photoGuid = ::sse_decode(deserializer); + let mut var_protectedLocalReference = ::sse_decode(deserializer); + return crate::api::api::CloudSyncTransientGroupPhotoPayload { + logical_entity_key_hash: var_logicalEntityKeyHash, + owner_logical_key_hash: var_ownerLogicalKeyHash, + photo_guid: var_photoGuid, + protected_local_reference: var_protectedLocalReference, + }; + } +} + +impl SseDecode for crate::api::api::CloudSyncTransientKnownMessageFlags { + // Codec=Sse (Serialization based), see doc to use other codecs + fn sse_decode(deserializer: &mut flutter_rust_bridge::for_generated::SseDeserializer) -> Self { + let mut var_fromMe = ::sse_decode(deserializer); + let mut var_delivered = ::sse_decode(deserializer); + let mut var_read = ::sse_decode(deserializer); + let mut var_hasDataDetectorResults = ::sse_decode(deserializer); + let mut var_deliveredQuietly = ::sse_decode(deserializer); + let mut var_didNotifyRecipient = ::sse_decode(deserializer); + return crate::api::api::CloudSyncTransientKnownMessageFlags { + from_me: var_fromMe, + delivered: var_delivered, + read: var_read, + has_data_detector_results: var_hasDataDetectorResults, + delivered_quietly: var_deliveredQuietly, + did_notify_recipient: var_didNotifyRecipient, + }; } - { - let MessageSummaryInfo = None::.unwrap(); - let _: Option = MessageSummaryInfo.ams; - let _: Option> = MessageSummaryInfo.ampt; - let _: Option = MessageSummaryInfo.amc; - let _: Option = MessageSummaryInfo.amb; - let _: Option = MessageSummaryInfo.amd; - let _: std::collections::HashMap> = - MessageSummaryInfo.ec; - let _: Vec = MessageSummaryInfo.ep; - let _: std::collections::HashMap = - MessageSummaryInfo.otr; - let _: Option = MessageSummaryInfo.ust; - let _: Vec = MessageSummaryInfo.rp; - let _: Option = MessageSummaryInfo.hbr; - let _: Option = MessageSummaryInfo.oui; - let _: Option = MessageSummaryInfo.osn; - let _: Vec = MessageSummaryInfo.euh; +} + +impl SseDecode for crate::api::api::CloudSyncTransientMessageEdit { + // Codec=Sse (Serialization based), see doc to use other codecs + fn sse_decode(deserializer: &mut flutter_rust_bridge::for_generated::SseDeserializer) -> Self { + let mut var_part_ = ::sse_decode(deserializer); + let mut var_revision = ::sse_decode(deserializer); + let mut var_bodies = + >::sse_decode(deserializer); + let mut var_modifiedAtMillis = ::sse_decode(deserializer); + let mut var_originalRangeLocation = >::sse_decode(deserializer); + let mut var_originalRangeLength = >::sse_decode(deserializer); + return crate::api::api::CloudSyncTransientMessageEdit { + part: var_part_, + revision: var_revision, + bodies: var_bodies, + modified_at_millis: var_modifiedAtMillis, + original_range_location: var_originalRangeLocation, + original_range_length: var_originalRangeLength, + }; } - match None::.unwrap() { - crate::api::api::MessageTarget::Token(field0) => { - let _: Vec = field0; - } - crate::api::api::MessageTarget::Uuid(field0) => { - let _: String = field0; - } +} + +impl SseDecode for crate::api::api::CloudSyncTransientMessagePayload { + // Codec=Sse (Serialization based), see doc to use other codecs + fn sse_decode(deserializer: &mut flutter_rust_bridge::for_generated::SseDeserializer) -> Self { + let mut var_logicalEntityKeyHash = ::sse_decode(deserializer); + let mut var_canonicalGuid = ::sse_decode(deserializer); + let mut var_chatAliasKeyHash = ::sse_decode(deserializer); + let mut var_chatIdentifier = ::sse_decode(deserializer); + let mut var_senderHandle = ::sse_decode(deserializer); + let mut var_createdAtMillis = ::sse_decode(deserializer); + let mut var_error = ::sse_decode(deserializer); + let mut var_service = + ::sse_decode(deserializer); + let mut var_subjectState = + ::sse_decode(deserializer); + let mut var_subject = >::sse_decode(deserializer); + let mut var_bodyState = + ::sse_decode(deserializer); + let mut var_body = >::sse_decode(deserializer); + let mut var_attributedBodiesState = + ::sse_decode(deserializer); + let mut var_attributedBodies = + >::sse_decode(deserializer); + let mut var_balloonBundleIdState = + ::sse_decode(deserializer); + let mut var_balloonBundleId = >::sse_decode(deserializer); + let mut var_effectState = + ::sse_decode(deserializer); + let mut var_effect = >::sse_decode(deserializer); + let mut var_readAtMillisState = + ::sse_decode(deserializer); + let mut var_readAtMillis = >::sse_decode(deserializer); + let mut var_deliveredAtMillisState = + ::sse_decode(deserializer); + let mut var_deliveredAtMillis = >::sse_decode(deserializer); + let mut var_knownFlags = + ::sse_decode(deserializer); + let mut var_associationKind = + ::sse_decode(deserializer); + let mut var_reactionKind = + >::sse_decode(deserializer); + let mut var_reactionRemoved = ::sse_decode(deserializer); + let mut var_reactionParentLogicalKeyHash = >::sse_decode(deserializer); + let mut var_reactionParentCanonicalGuid = >::sse_decode(deserializer); + let mut var_reactionParentPart = >::sse_decode(deserializer); + let mut var_associatedRangeLocation = >::sse_decode(deserializer); + let mut var_associatedRangeLength = >::sse_decode(deserializer); + let mut var_replyParentLogicalKeyHash = >::sse_decode(deserializer); + let mut var_replyParentCanonicalGuid = >::sse_decode(deserializer); + let mut var_replyParentPart = >::sse_decode(deserializer); + let mut var_editsState = + ::sse_decode(deserializer); + let mut var_edits = + >::sse_decode(deserializer); + let mut var_retractedPartsState = + ::sse_decode(deserializer); + let mut var_retractedParts = >::sse_decode(deserializer); + let mut var_associatedEmojiState = + ::sse_decode(deserializer); + let mut var_associatedEmoji = >::sse_decode(deserializer); + return crate::api::api::CloudSyncTransientMessagePayload { + logical_entity_key_hash: var_logicalEntityKeyHash, + canonical_guid: var_canonicalGuid, + chat_alias_key_hash: var_chatAliasKeyHash, + chat_identifier: var_chatIdentifier, + sender_handle: var_senderHandle, + created_at_millis: var_createdAtMillis, + error: var_error, + service: var_service, + subject_state: var_subjectState, + subject: var_subject, + body_state: var_bodyState, + body: var_body, + attributed_bodies_state: var_attributedBodiesState, + attributed_bodies: var_attributedBodies, + balloon_bundle_id_state: var_balloonBundleIdState, + balloon_bundle_id: var_balloonBundleId, + effect_state: var_effectState, + effect: var_effect, + read_at_millis_state: var_readAtMillisState, + read_at_millis: var_readAtMillis, + delivered_at_millis_state: var_deliveredAtMillisState, + delivered_at_millis: var_deliveredAtMillis, + known_flags: var_knownFlags, + association_kind: var_associationKind, + reaction_kind: var_reactionKind, + reaction_removed: var_reactionRemoved, + reaction_parent_logical_key_hash: var_reactionParentLogicalKeyHash, + reaction_parent_canonical_guid: var_reactionParentCanonicalGuid, + reaction_parent_part: var_reactionParentPart, + associated_range_location: var_associatedRangeLocation, + associated_range_length: var_associatedRangeLength, + reply_parent_logical_key_hash: var_replyParentLogicalKeyHash, + reply_parent_canonical_guid: var_replyParentCanonicalGuid, + reply_parent_part: var_replyParentPart, + edits_state: var_editsState, + edits: var_edits, + retracted_parts_state: var_retractedPartsState, + retracted_parts: var_retractedParts, + associated_emoji_state: var_associatedEmojiState, + associated_emoji: var_associatedEmoji, + }; } - match None::.unwrap() { - crate::api::api::MessageType::IMessage => {} - crate::api::api::MessageType::SMS { - is_phone, - using_number, - from_handle, - } => { - let _: bool = is_phone; - let _: String = using_number; - let _: Option = from_handle; - } +} + +impl SseDecode for crate::api::api::CloudSyncTransientMutationKind { + // Codec=Sse (Serialization based), see doc to use other codecs + fn sse_decode(deserializer: &mut flutter_rust_bridge::for_generated::SseDeserializer) -> Self { + let mut inner = ::sse_decode(deserializer); + return match inner { + 0 => crate::api::api::CloudSyncTransientMutationKind::Upsert, + 1 => crate::api::api::CloudSyncTransientMutationKind::Tombstone, + _ => unreachable!( + "Invalid variant for CloudSyncTransientMutationKind: {}", + inner + ), + }; } - { - let MMCSAttachmentMeta = None::.unwrap(); - let _: Option = MMCSAttachmentMeta.mmcs_signature_hex; - let _: Option = MMCSAttachmentMeta.mmcs_owner; - let _: Option = MMCSAttachmentMeta.mmcs_url; - let _: Option = MMCSAttachmentMeta.decryption_key; - let _: Option = MMCSAttachmentMeta.inline_attachment; - let _: Option = MMCSAttachmentMeta.message_part; - let _: Option = MMCSAttachmentMeta.file_size; - let _: Option = MMCSAttachmentMeta.uti_type; - let _: Option = MMCSAttachmentMeta.mime_type; - let _: Option = MMCSAttachmentMeta.name; +} + +impl SseDecode for crate::api::api::CloudSyncTransientPayload { + // Codec=Sse (Serialization based), see doc to use other codecs + fn sse_decode(deserializer: &mut flutter_rust_bridge::for_generated::SseDeserializer) -> Self { + let mut var_chat = + >::sse_decode(deserializer); + let mut var_message = + >::sse_decode(deserializer); + let mut var_attachment = + >::sse_decode( + deserializer, + ); + let mut var_groupPhoto = + >::sse_decode( + deserializer, + ); + return crate::api::api::CloudSyncTransientPayload { + chat: var_chat, + message: var_message, + attachment: var_attachment, + group_photo: var_groupPhoto, + }; } - { - let MMCSFile = None::.unwrap(); - let _: Vec = MMCSFile.signature; - let _: String = MMCSFile.object; - let _: String = MMCSFile.url; - let _: Vec = MMCSFile.key; - let _: usize = MMCSFile.size; +} + +impl SseDecode for crate::api::api::CloudSyncTransientQuarantineReason { + // Codec=Sse (Serialization based), see doc to use other codecs + fn sse_decode(deserializer: &mut flutter_rust_bridge::for_generated::SseDeserializer) -> Self { + let mut inner = ::sse_decode(deserializer); + return match inner { + 0 => crate::api::api::CloudSyncTransientQuarantineReason::MalformedRequiredIdentity, + 1 => crate::api::api::CloudSyncTransientQuarantineReason::FieldPresenceMismatch, + 2 => crate::api::api::CloudSyncTransientQuarantineReason::UnsupportedService, + 3 => crate::api::api::CloudSyncTransientQuarantineReason::UnsupportedChatStyle, + 4 => crate::api::api::CloudSyncTransientQuarantineReason::UnsupportedMessageType, + 5 => crate::api::api::CloudSyncTransientQuarantineReason::UnsupportedAssociationType, + 6 => crate::api::api::CloudSyncTransientQuarantineReason::MalformedParent, + 7 => crate::api::api::CloudSyncTransientQuarantineReason::AmbiguousReply, + 8 => crate::api::api::CloudSyncTransientQuarantineReason::MalformedAttributedBody, + 9 => crate::api::api::CloudSyncTransientQuarantineReason::MalformedMessageSummary, + 10 => crate::api::api::CloudSyncTransientQuarantineReason::ConflictingEditAndRetraction, + 11 => crate::api::api::CloudSyncTransientQuarantineReason::OversizedContent, + 12 => crate::api::api::CloudSyncTransientQuarantineReason::InvalidCanonicalPayload, + 13 => crate::api::api::CloudSyncTransientQuarantineReason::MalformedRecord, + _ => unreachable!( + "Invalid variant for CloudSyncTransientQuarantineReason: {}", + inner + ), + }; } - { - let MonogramData = None::.unwrap(); - let _: crate::api::api::PosterColor = MonogramData.top_background_color_description; - let _: crate::api::api::PosterColor = MonogramData.background_color_description; - let _: String = MonogramData.initials; - let _: bool = MonogramData.monogram_supported_for_name; +} + +impl SseDecode for crate::api::api::CloudSyncTransientReactionKind { + // Codec=Sse (Serialization based), see doc to use other codecs + fn sse_decode(deserializer: &mut flutter_rust_bridge::for_generated::SseDeserializer) -> Self { + let mut inner = ::sse_decode(deserializer); + return match inner { + 0 => crate::api::api::CloudSyncTransientReactionKind::Heart, + 1 => crate::api::api::CloudSyncTransientReactionKind::Like, + 2 => crate::api::api::CloudSyncTransientReactionKind::Dislike, + 3 => crate::api::api::CloudSyncTransientReactionKind::Laugh, + 4 => crate::api::api::CloudSyncTransientReactionKind::Emphasize, + 5 => crate::api::api::CloudSyncTransientReactionKind::Question, + 6 => crate::api::api::CloudSyncTransientReactionKind::Emoji, + 7 => crate::api::api::CloudSyncTransientReactionKind::StickerBack, + _ => unreachable!( + "Invalid variant for CloudSyncTransientReactionKind: {}", + inner + ), + }; } - { - let MoveToRecycleBinMessage = None::.unwrap(); - let _: crate::api::api::DeleteTarget = MoveToRecycleBinMessage.target; - let _: u64 = MoveToRecycleBinMessage.recoverable_delete_date; +} + +impl SseDecode for crate::api::api::CloudSyncTransientService { + // Codec=Sse (Serialization based), see doc to use other codecs + fn sse_decode(deserializer: &mut flutter_rust_bridge::for_generated::SseDeserializer) -> Self { + let mut inner = ::sse_decode(deserializer); + return match inner { + 0 => crate::api::api::CloudSyncTransientService::IMessage, + _ => unreachable!("Invalid variant for CloudSyncTransientService: {}", inner), + }; } - { - let NormalMessage = None::.unwrap(); - let _: crate::api::api::MessageParts = NormalMessage.parts; - let _: Option = NormalMessage.effect; - let _: Option = NormalMessage.reply_guid; - let _: Option = NormalMessage.reply_part; - let _: crate::api::api::MessageType = NormalMessage.service; - let _: Option = NormalMessage.subject; - let _: Option = NormalMessage.app; - let _: Option = NormalMessage.link_meta; - let _: bool = NormalMessage.voice; - let _: Option = NormalMessage.scheduled; - let _: Option = NormalMessage.embedded_profile; +} + +impl SseDecode for crate::api::api::CloudSyncTransientSnapshot { + // Codec=Sse (Serialization based), see doc to use other codecs + fn sse_decode(deserializer: &mut flutter_rust_bridge::for_generated::SseDeserializer) -> Self { + let mut var_entityKind = + ::sse_decode(deserializer); + let mut var_logicalEntityKeyHash = ::sse_decode(deserializer); + let mut var_parentLogicalKeyHash = >::sse_decode(deserializer); + let mut var_immutableContentDigest = >::sse_decode(deserializer); + let mut var_createdAtMillis = >::sse_decode(deserializer); + let mut var_readAtMillis = >::sse_decode(deserializer); + let mut var_deliveredAtMillis = >::sse_decode(deserializer); + let mut var_editParts = + >::sse_decode(deserializer); + let mut var_retractedAtMillis = >::sse_decode(deserializer); + let mut var_groupVersion = >::sse_decode(deserializer); + let mut var_groupMetadataDigest = >::sse_decode(deserializer); + let mut var_etagHash = >::sse_decode(deserializer); + let mut var_protectedSourceReference = ::sse_decode(deserializer); + return crate::api::api::CloudSyncTransientSnapshot { + entity_kind: var_entityKind, + logical_entity_key_hash: var_logicalEntityKeyHash, + parent_logical_key_hash: var_parentLogicalKeyHash, + immutable_content_digest: var_immutableContentDigest, + created_at_millis: var_createdAtMillis, + read_at_millis: var_readAtMillis, + delivered_at_millis: var_deliveredAtMillis, + edit_parts: var_editParts, + retracted_at_millis: var_retractedAtMillis, + group_version: var_groupVersion, + group_metadata_digest: var_groupMetadataDigest, + etag_hash: var_etagHash, + protected_source_reference: var_protectedSourceReference, + }; } - { - let NSAttributedString = None::.unwrap(); - let _: String = NSAttributedString.text; - let _: Vec<(u32, crate::api::api::NSDictionaryTypedCoder)> = NSAttributedString.ranges; +} + +impl SseDecode for crate::api::api::CloudSyncTransientTextRun { + // Codec=Sse (Serialization based), see doc to use other codecs + fn sse_decode(deserializer: &mut flutter_rust_bridge::for_generated::SseDeserializer) -> Self { + let mut var_startUtf16 = ::sse_decode(deserializer); + let mut var_lengthUtf16 = ::sse_decode(deserializer); + let mut var_messagePart = >::sse_decode(deserializer); + let mut var_attachmentCanonicalGuid = >::sse_decode(deserializer); + let mut var_attachmentLogicalKeyHash = >::sse_decode(deserializer); + let mut var_mentionHandle = >::sse_decode(deserializer); + let mut var_audioTranscript = >::sse_decode(deserializer); + let mut var_textEffect = >::sse_decode(deserializer); + let mut var_bold = >::sse_decode(deserializer); + let mut var_italic = >::sse_decode(deserializer); + let mut var_strikethrough = >::sse_decode(deserializer); + let mut var_underline = >::sse_decode(deserializer); + return crate::api::api::CloudSyncTransientTextRun { + start_utf16: var_startUtf16, + length_utf16: var_lengthUtf16, + message_part: var_messagePart, + attachment_canonical_guid: var_attachmentCanonicalGuid, + attachment_logical_key_hash: var_attachmentLogicalKeyHash, + mention_handle: var_mentionHandle, + audio_transcript: var_audioTranscript, + text_effect: var_textEffect, + bold: var_bold, + italic: var_italic, + strikethrough: var_strikethrough, + underline: var_underline, + }; } - { - let NSDictionaryTypedCoder_ = None::.unwrap(); - let _: std::collections::HashMap = NSDictionaryTypedCoder_.0; +} + +impl SseDecode for crate::api::api::CloudSyncTransientTombstone { + // Codec=Sse (Serialization based), see doc to use other codecs + fn sse_decode(deserializer: &mut flutter_rust_bridge::for_generated::SseDeserializer) -> Self { + let mut var_entityKind = + ::sse_decode(deserializer); + let mut var_logicalEntityKeyHash = ::sse_decode(deserializer); + let mut var_deletedAtMillis = >::sse_decode(deserializer); + let mut var_serverConfirmed = ::sse_decode(deserializer); + return crate::api::api::CloudSyncTransientTombstone { + entity_kind: var_entityKind, + logical_entity_key_hash: var_logicalEntityKeyHash, + deleted_at_millis: var_deletedAtMillis, + server_confirmed: var_serverConfirmed, + }; } - { - let NSNumber_ = None::.unwrap(); - let _: u32 = NSNumber_.0; +} + +impl SseDecode for crate::api::api::ConversationData { + // Codec=Sse (Serialization based), see doc to use other codecs + fn sse_decode(deserializer: &mut flutter_rust_bridge::for_generated::SseDeserializer) -> Self { + let mut var_participants = >::sse_decode(deserializer); + let mut var_cvName = >::sse_decode(deserializer); + let mut var_senderGuid = >::sse_decode(deserializer); + let mut var_afterGuid = >::sse_decode(deserializer); + return crate::api::api::ConversationData { + participants: var_participants, + cv_name: var_cvName, + sender_guid: var_senderGuid, + after_guid: var_afterGuid, + }; } - { - let NSString_ = None::.unwrap(); - let _: String = NSString_.0; +} + +impl SseDecode for crate::api::api::DartBeacon { + // Codec=Sse (Serialization based), see doc to use other codecs + fn sse_decode(deserializer: &mut flutter_rust_bridge::for_generated::SseDeserializer) -> Self { + let mut var_naming = ::sse_decode(deserializer); + let mut var_lastReport = >::sse_decode(deserializer); + let mut var_productId = ::sse_decode(deserializer); + let mut var_batteryLevel = >::sse_decode(deserializer); + let mut var_vendorId = ::sse_decode(deserializer); + let mut var_model = ::sse_decode(deserializer); + let mut var_systemVersion = ::sse_decode(deserializer); + let mut var_id = ::sse_decode(deserializer); + let mut var_shared = + >::sse_decode(deserializer); + return crate::api::api::DartBeacon { + naming: var_naming, + last_report: var_lastReport, + product_id: var_productId, + battery_level: var_batteryLevel, + vendor_id: var_vendorId, + model: var_model, + system_version: var_systemVersion, + id: var_id, + shared: var_shared, + }; } - { - let NSURL = None::.unwrap(); - let _: String = NSURL.base; - let _: String = NSURL.relative; +} + +impl SseDecode for crate::api::api::DartBeaconShareInfo { + // Codec=Sse (Serialization based), see doc to use other codecs + fn sse_decode(deserializer: &mut flutter_rust_bridge::for_generated::SseDeserializer) -> Self { + let mut var_shareId = ::sse_decode(deserializer); + let mut var_acceptanceState = ::sse_decode(deserializer); + let mut var_ownerHandle = ::sse_decode(deserializer); + return crate::api::api::DartBeaconShareInfo { + share_id: var_shareId, + acceptance_state: var_acceptanceState, + owner_handle: var_ownerHandle, + }; } - match None::.unwrap() { - crate::api::api::NumOrString::Num(field0) => { - let _: u32 = field0; - } - crate::api::api::NumOrString::String(field0) => { - let _: String = field0; - } - crate::api::api::NumOrString::Bool(field0) => { - let _: bool = field0; +} + +impl SseDecode for crate::api::api::DeleteTarget { + // Codec=Sse (Serialization based), see doc to use other codecs + fn sse_decode(deserializer: &mut flutter_rust_bridge::for_generated::SseDeserializer) -> Self { + let mut tag_ = ::sse_decode(deserializer); + match tag_ { + 0 => { + let mut var_field0 = ::sse_decode(deserializer); + return crate::api::api::DeleteTarget::Chat(var_field0); + } + 1 => { + let mut var_field0 = >::sse_decode(deserializer); + return crate::api::api::DeleteTarget::Messages(var_field0); + } + _ => { + unimplemented!(""); + } } } - { - let OperatedChat = None::.unwrap(); - let _: Vec = OperatedChat.participants; - let _: String = OperatedChat.group_id; - let _: String = OperatedChat.guid; - let _: Option = OperatedChat.delete_incoming_messages; - let _: Option = OperatedChat.was_reported_as_junk; +} + +impl SseDecode for crate::api::api::DeviceInfo { + // Codec=Sse (Serialization based), see doc to use other codecs + fn sse_decode(deserializer: &mut flutter_rust_bridge::for_generated::SseDeserializer) -> Self { + let mut var_name = ::sse_decode(deserializer); + let mut var_serial = ::sse_decode(deserializer); + let mut var_osVersion = ::sse_decode(deserializer); + let mut var_encodedData = >>::sse_decode(deserializer); + return crate::api::api::DeviceInfo { + name: var_name, + serial: var_serial, + os_version: var_osVersion, + encoded_data: var_encodedData, + }; } - match None::.unwrap() { - crate::api::api::PartExtension::Sticker { - msg_width, - rotation, - sai, - scale, - update, - sli, - normalized_x, - normalized_y, - version, - hash, - safi, - effect_type, - sticker_id, - } => { - let _: f64 = msg_width; - let _: f64 = rotation; - let _: u64 = sai; - let _: f64 = scale; - let _: Option = update; - let _: u64 = sli; - let _: f64 = normalized_x; - let _: f64 = normalized_y; - let _: u64 = version; - let _: String = hash; - let _: u64 = safi; - let _: i64 = effect_type; - let _: String = sticker_id; - } +} + +impl SseDecode for crate::api::api::EditMessage { + // Codec=Sse (Serialization based), see doc to use other codecs + fn sse_decode(deserializer: &mut flutter_rust_bridge::for_generated::SseDeserializer) -> Self { + let mut var_tuuid = ::sse_decode(deserializer); + let mut var_editPart = ::sse_decode(deserializer); + let mut var_newParts = ::sse_decode(deserializer); + return crate::api::api::EditMessage { + tuuid: var_tuuid, + edit_part: var_editPart, + new_parts: var_newParts, + }; } - { - let Passkey = None::.unwrap(); - let _: u64 = Passkey.cdat; - let _: u64 = Passkey.mdat; - let _: String = Passkey.agrp; - let _: String = Passkey.labl; - let _: Vec = Passkey.data; - let _: Vec = Passkey.atag; - let _: Vec = Passkey.klbl; +} + +impl SseDecode for crate::api::api::ErrorMessage { + // Codec=Sse (Serialization based), see doc to use other codecs + fn sse_decode(deserializer: &mut flutter_rust_bridge::for_generated::SseDeserializer) -> Self { + let mut var_forUuid = ::sse_decode(deserializer); + let mut var_status = ::sse_decode(deserializer); + let mut var_statusStr = ::sse_decode(deserializer); + return crate::api::api::ErrorMessage { + for_uuid: var_forUuid, + status: var_status, + status_str: var_statusStr, + }; } - { - let PasswordManagerAltDomain = None::.unwrap(); - let _: String = PasswordManagerAltDomain.domain; +} + +impl SseDecode for crate::api::api::ExtensionApp { + // Codec=Sse (Serialization based), see doc to use other codecs + fn sse_decode(deserializer: &mut flutter_rust_bridge::for_generated::SseDeserializer) -> Self { + let mut var_name = ::sse_decode(deserializer); + let mut var_appId = >::sse_decode(deserializer); + let mut var_bundleId = ::sse_decode(deserializer); + let mut var_balloon = >::sse_decode(deserializer); + return crate::api::api::ExtensionApp { + name: var_name, + app_id: var_appId, + bundle_id: var_bundleId, + balloon: var_balloon, + }; } - { - let PasswordManagerMeta = None::.unwrap(); - let _: u64 = PasswordManagerMeta.cdat; - let _: u64 = PasswordManagerMeta.mdat; - let _: String = PasswordManagerMeta.srvr; - let _: String = PasswordManagerMeta.acct; - let _: String = PasswordManagerMeta.agrp; - let _: Vec = PasswordManagerMeta.data; +} + +impl SseDecode for f32 { + // Codec=Sse (Serialization based), see doc to use other codecs + fn sse_decode(deserializer: &mut flutter_rust_bridge::for_generated::SseDeserializer) -> Self { + deserializer.cursor.read_f32::().unwrap() } - { - let PasswordManagerMetaChange = None::.unwrap(); - let _: u64 = PasswordManagerMetaChange.date; - let _: Option = PasswordManagerMetaChange.password; - let _: Option = PasswordManagerMetaChange.old_password; - let _: Option = PasswordManagerMetaChange.group_name; - let _: Option = PasswordManagerMetaChange.group_id; - let _: Option = PasswordManagerMetaChange.share_type; - let _: String = PasswordManagerMetaChange.id; - let _: String = PasswordManagerMetaChange.typ; +} + +impl SseDecode for f64 { + // Codec=Sse (Serialization based), see doc to use other codecs + fn sse_decode(deserializer: &mut flutter_rust_bridge::for_generated::SseDeserializer) -> Self { + deserializer.cursor.read_f64::().unwrap() } - { - let PasswordManagerMetaData = None::.unwrap(); - let _: Vec = PasswordManagerMetaData.history; - let _: Vec = PasswordManagerMetaData.alt_domains; - let _: Option = PasswordManagerMetaData.totp; - let _: std::collections::HashMap = - PasswordManagerMetaData.ctxt; - let _: Option> = PasswordManagerMetaData.title; - let _: Option> = PasswordManagerMetaData.notes; - let _: Option = - PasswordManagerMetaData.formerly_shared; - let _: Option> = PasswordManagerMetaData.ocpid; +} + +impl SseDecode for crate::api::api::FFIFilePackager { + // Codec=Sse (Serialization based), see doc to use other codecs + fn sse_decode(deserializer: &mut flutter_rust_bridge::for_generated::SseDeserializer) -> Self { + return crate::api::api::FFIFilePackager {}; + } +} + +impl SseDecode for crate::api::api::Follow { + // Codec=Sse (Serialization based), see doc to use other codecs + fn sse_decode(deserializer: &mut flutter_rust_bridge::for_generated::SseDeserializer) -> Self { + let mut var_createTimestamp = ::sse_decode(deserializer); + let mut var_expires = ::sse_decode(deserializer); + let mut var_id = ::sse_decode(deserializer); + let mut var_invitationAcceptedHandles = >::sse_decode(deserializer); + let mut var_invitationFromHandles = >::sse_decode(deserializer); + let mut var_isFromMessages = ::sse_decode(deserializer); + let mut var_offerId = >::sse_decode(deserializer); + let mut var_onlyInEvent = ::sse_decode(deserializer); + let mut var_personIdHash = ::sse_decode(deserializer); + let mut var_secureLocationsCapable = ::sse_decode(deserializer); + let mut var_shallowOrLiveSecureLocationsCapable = ::sse_decode(deserializer); + let mut var_source = ::sse_decode(deserializer); + let mut var_tkPermission = ::sse_decode(deserializer); + let mut var_updateTimestamp = ::sse_decode(deserializer); + let mut var_fallbackToLegacyAllowed = >::sse_decode(deserializer); + let mut var_optedNotToShare = >::sse_decode(deserializer); + let mut var_lastLocation = >::sse_decode(deserializer); + let mut var_locateInProgress = ::sse_decode(deserializer); + return crate::api::api::Follow { + create_timestamp: var_createTimestamp, + expires: var_expires, + id: var_id, + invitation_accepted_handles: var_invitationAcceptedHandles, + invitation_from_handles: var_invitationFromHandles, + is_from_messages: var_isFromMessages, + offer_id: var_offerId, + only_in_event: var_onlyInEvent, + person_id_hash: var_personIdHash, + secure_locations_capable: var_secureLocationsCapable, + shallow_or_live_secure_locations_capable: var_shallowOrLiveSecureLocationsCapable, + source: var_source, + tk_permission: var_tkPermission, + update_timestamp: var_updateTimestamp, + fallback_to_legacy_allowed: var_fallbackToLegacyAllowed, + opted_not_to_share: var_optedNotToShare, + last_location: var_lastLocation, + locate_in_progress: var_locateInProgress, + }; + } +} + +impl SseDecode for crate::api::api::FoundDevice { + // Codec=Sse (Serialization based), see doc to use other codecs + fn sse_decode(deserializer: &mut flutter_rust_bridge::for_generated::SseDeserializer) -> Self { + let mut var_deviceModel = >::sse_decode(deserializer); + let mut var_lowPowerMode = >::sse_decode(deserializer); + let mut var_passcodeLength = >::sse_decode(deserializer); + let mut var_id = >::sse_decode(deserializer); + let mut var_batteryStatus = >::sse_decode(deserializer); + let mut var_lostModeCapable = >::sse_decode(deserializer); + let mut var_batteryLevel = >::sse_decode(deserializer); + let mut var_locationEnabled = >::sse_decode(deserializer); + let mut var_isConsideredAccessory = >::sse_decode(deserializer); + let mut var_location = >::sse_decode(deserializer); + let mut var_modelDisplayName = >::sse_decode(deserializer); + let mut var_deviceColor = >::sse_decode(deserializer); + let mut var_activationLocked = >::sse_decode(deserializer); + let mut var_rm2State = >::sse_decode(deserializer); + let mut var_locFoundEnabled = >::sse_decode(deserializer); + let mut var_nwd = >::sse_decode(deserializer); + let mut var_deviceStatus = >::sse_decode(deserializer); + let mut var_fmlyShare = >::sse_decode(deserializer); + let mut var_features = >::sse_decode(deserializer); + let mut var_thisDevice = >::sse_decode(deserializer); + let mut var_lostModeEnabled = >::sse_decode(deserializer); + let mut var_deviceDisplayName = >::sse_decode(deserializer); + let mut var_name = >::sse_decode(deserializer); + let mut var_canWipeAfterLock = >::sse_decode(deserializer); + let mut var_isMac = >::sse_decode(deserializer); + let mut var_rawDeviceModel = >::sse_decode(deserializer); + let mut var_baUuid = >::sse_decode(deserializer); + let mut var_deviceDiscoveryId = >::sse_decode(deserializer); + let mut var_scd = >::sse_decode(deserializer); + let mut var_locationCapable = >::sse_decode(deserializer); + let mut var_wipeInProgress = >::sse_decode(deserializer); + let mut var_darkWake = >::sse_decode(deserializer); + let mut var_deviceWithYou = >::sse_decode(deserializer); + let mut var_maxMsgChar = >::sse_decode(deserializer); + let mut var_deviceClass = >::sse_decode(deserializer); + return crate::api::api::FoundDevice { + device_model: var_deviceModel, + low_power_mode: var_lowPowerMode, + passcode_length: var_passcodeLength, + id: var_id, + battery_status: var_batteryStatus, + lost_mode_capable: var_lostModeCapable, + battery_level: var_batteryLevel, + location_enabled: var_locationEnabled, + is_considered_accessory: var_isConsideredAccessory, + location: var_location, + model_display_name: var_modelDisplayName, + device_color: var_deviceColor, + activation_locked: var_activationLocked, + rm2_state: var_rm2State, + loc_found_enabled: var_locFoundEnabled, + nwd: var_nwd, + device_status: var_deviceStatus, + fmly_share: var_fmlyShare, + features: var_features, + this_device: var_thisDevice, + lost_mode_enabled: var_lostModeEnabled, + device_display_name: var_deviceDisplayName, + name: var_name, + can_wipe_after_lock: var_canWipeAfterLock, + is_mac: var_isMac, + raw_device_model: var_rawDeviceModel, + ba_uuid: var_baUuid, + device_discovery_id: var_deviceDiscoveryId, + scd: var_scd, + location_capable: var_locationCapable, + wipe_in_progress: var_wipeInProgress, + dark_wake: var_darkWake, + device_with_you: var_deviceWithYou, + max_msg_char: var_maxMsgChar, + device_class: var_deviceClass, + }; } - { - let PasswordManagerMetaDataCtx = - None::.unwrap(); - let _: f64 = PasswordManagerMetaDataCtx.last_used; +} + +impl SseDecode for crate::api::api::FTMember { + // Codec=Sse (Serialization based), see doc to use other codecs + fn sse_decode(deserializer: &mut flutter_rust_bridge::for_generated::SseDeserializer) -> Self { + let mut var_nickname = >::sse_decode(deserializer); + let mut var_handle = ::sse_decode(deserializer); + return crate::api::api::FTMember { + nickname: var_nickname, + handle: var_handle, + }; } - { - let PasswordManagerMetaDataFormerlyShared = - None::.unwrap(); - let _: Option = PasswordManagerMetaDataFormerlyShared.group_name; - let _: Option = - PasswordManagerMetaDataFormerlyShared.password_manager_credential_identifier; +} + +impl SseDecode for crate::api::api::FTMessage { + // Codec=Sse (Serialization based), see doc to use other codecs + fn sse_decode(deserializer: &mut flutter_rust_bridge::for_generated::SseDeserializer) -> Self { + let mut tag_ = ::sse_decode(deserializer); + match tag_ { + 0 => { + let mut var_field0 = ::sse_decode(deserializer); + return crate::api::api::FTMessage::LetMeInRequest(var_field0); + } + 1 => { + let mut var_guid = ::sse_decode(deserializer); + return crate::api::api::FTMessage::LinkChanged { guid: var_guid }; + } + 2 => { + let mut var_guid = ::sse_decode(deserializer); + let mut var_participant = ::sse_decode(deserializer); + let mut var_handle = ::sse_decode(deserializer); + let mut var_ring = ::sse_decode(deserializer); + return crate::api::api::FTMessage::JoinEvent { + guid: var_guid, + participant: var_participant, + handle: var_handle, + ring: var_ring, + }; + } + 3 => { + let mut var_guid = ::sse_decode(deserializer); + let mut var_members = + >::sse_decode( + deserializer, + ); + let mut var_ring = ::sse_decode(deserializer); + return crate::api::api::FTMessage::AddMembers { + guid: var_guid, + members: var_members, + ring: var_ring, + }; + } + 4 => { + let mut var_guid = ::sse_decode(deserializer); + let mut var_members = + >::sse_decode( + deserializer, + ); + return crate::api::api::FTMessage::RemoveMembers { + guid: var_guid, + members: var_members, + }; + } + 5 => { + let mut var_guid = ::sse_decode(deserializer); + let mut var_participant = ::sse_decode(deserializer); + let mut var_handle = ::sse_decode(deserializer); + return crate::api::api::FTMessage::LeaveEvent { + guid: var_guid, + participant: var_participant, + handle: var_handle, + }; + } + 6 => { + let mut var_guid = ::sse_decode(deserializer); + return crate::api::api::FTMessage::Ring { guid: var_guid }; + } + 7 => { + let mut var_guid = ::sse_decode(deserializer); + return crate::api::api::FTMessage::Decline { guid: var_guid }; + } + 8 => { + let mut var_guid = ::sse_decode(deserializer); + return crate::api::api::FTMessage::RespondedElsewhere { guid: var_guid }; + } + _ => { + unimplemented!(""); + } + } } - { - let PasswordManagerTotp = None::.unwrap(); - let _: Vec = PasswordManagerTotp.secret; - let _: u32 = PasswordManagerTotp.digits; - let _: Option = PasswordManagerTotp.issuer; - let _: u32 = PasswordManagerTotp.period; - let _: u64 = PasswordManagerTotp.initial_date; - let _: u32 = PasswordManagerTotp.algorithm; - let _: Option = PasswordManagerTotp.account_name; - let _: Option = PasswordManagerTotp.original_url; +} + +impl SseDecode for crate::api::api::FTMode { + // Codec=Sse (Serialization based), see doc to use other codecs + fn sse_decode(deserializer: &mut flutter_rust_bridge::for_generated::SseDeserializer) -> Self { + let mut inner = ::sse_decode(deserializer); + return match inner { + 0 => crate::api::api::FTMode::Outgoing, + 1 => crate::api::api::FTMode::Incoming, + 2 => crate::api::api::FTMode::Missed, + 3 => crate::api::api::FTMode::MissedOutgoing, + _ => unreachable!("Invalid variant for FTMode: {}", inner), + }; } - { - let PasswordRawEntry = None::.unwrap(); - let _: u64 = PasswordRawEntry.cdat; - let _: u64 = PasswordRawEntry.mdat; - let _: String = PasswordRawEntry.srvr; - let _: String = PasswordRawEntry.acct; - let _: String = PasswordRawEntry.agrp; - let _: Vec = PasswordRawEntry.data; +} + +impl SseDecode for crate::api::api::FTParticipant { + // Codec=Sse (Serialization based), see doc to use other codecs + fn sse_decode(deserializer: &mut flutter_rust_bridge::for_generated::SseDeserializer) -> Self { + let mut var_token = >::sse_decode(deserializer); + let mut var_handle = ::sse_decode(deserializer); + let mut var_participantId = ::sse_decode(deserializer); + let mut var_lastJoinDate = >::sse_decode(deserializer); + let mut var_active = >::sse_decode(deserializer); + return crate::api::api::FTParticipant { + token: var_token, + handle: var_handle, + participant_id: var_participantId, + last_join_date: var_lastJoinDate, + active: var_active, + }; } - { - let PermanentDeleteMessage = None::.unwrap(); - let _: crate::api::api::DeleteTarget = PermanentDeleteMessage.target; - let _: bool = PermanentDeleteMessage.is_scheduled; +} + +impl SseDecode for crate::api::api::FTSession { + // Codec=Sse (Serialization based), see doc to use other codecs + fn sse_decode(deserializer: &mut flutter_rust_bridge::for_generated::SseDeserializer) -> Self { + let mut var_groupId = ::sse_decode(deserializer); + let mut var_myHandles = >::sse_decode(deserializer); + let mut var_participants = >::sse_decode(deserializer); + let mut var_link = >::sse_decode(deserializer); + let mut var_members = + >::sse_decode(deserializer); + let mut var_reportId = ::sse_decode(deserializer); + let mut var_startTime = >::sse_decode(deserializer); + let mut var_lastRekey = >::sse_decode(deserializer); + let mut var_isPropped = ::sse_decode(deserializer); + let mut var_isRingingInaccurate = ::sse_decode(deserializer); + let mut var_mode = >::sse_decode(deserializer); + let mut var_recentMemberAdds = + >::sse_decode(deserializer); + return crate::api::api::FTSession { + group_id: var_groupId, + my_handles: var_myHandles, + participants: var_participants, + link: var_link, + members: var_members, + report_id: var_reportId, + start_time: var_startTime, + last_rekey: var_lastRekey, + is_propped: var_isPropped, + is_ringing_inaccurate: var_isRingingInaccurate, + mode: var_mode, + recent_member_adds: var_recentMemberAdds, + }; } - { - let PhotoPosterContents = None::.unwrap(); - let _: u32 = PhotoPosterContents.version; - let _: Vec = PhotoPosterContents.layers; - let _: crate::api::api::PhotoPosterProperties = PhotoPosterContents.properties; +} + +impl SseDecode for crate::api::api::GroupSummary { + // Codec=Sse (Serialization based), see doc to use other codecs + fn sse_decode(deserializer: &mut flutter_rust_bridge::for_generated::SseDeserializer) -> Self { + let mut var_displayName = ::sse_decode(deserializer); + let mut var_isOwner = ::sse_decode(deserializer); + let mut var_members = >::sse_decode(deserializer); + return crate::api::api::GroupSummary { + display_name: var_displayName, + is_owner: var_isOwner, + members: var_members, + }; } - { - let PhotoPosterContentsFrame = None::.unwrap(); - let _: f64 = PhotoPosterContentsFrame.width; - let _: f64 = PhotoPosterContentsFrame.height; - let _: f64 = PhotoPosterContentsFrame.x; - let _: f64 = PhotoPosterContentsFrame.y; +} + +impl SseDecode for crate::api::api::GroupSummaryMember { + // Codec=Sse (Serialization based), see doc to use other codecs + fn sse_decode(deserializer: &mut flutter_rust_bridge::for_generated::SseDeserializer) -> Self { + let mut var_name = >::sse_decode(deserializer); + let mut var_handle = ::sse_decode(deserializer); + let mut var_userId = >::sse_decode(deserializer); + let mut var_isJoined = ::sse_decode(deserializer); + return crate::api::api::GroupSummaryMember { + name: var_name, + handle: var_handle, + user_id: var_userId, + is_joined: var_isJoined, + }; } - { - let PhotoPosterContentsSize = None::.unwrap(); - let _: f64 = PhotoPosterContentsSize.width; - let _: f64 = PhotoPosterContentsSize.height; +} + +impl SseDecode for crate::api::api::HwExtra { + // Codec=Sse (Serialization based), see doc to use other codecs + fn sse_decode(deserializer: &mut flutter_rust_bridge::for_generated::SseDeserializer) -> Self { + let mut var_version = ::sse_decode(deserializer); + let mut var_protocolVersion = ::sse_decode(deserializer); + let mut var_deviceId = ::sse_decode(deserializer); + let mut var_icloudUa = ::sse_decode(deserializer); + let mut var_aoskitVersion = ::sse_decode(deserializer); + return crate::api::api::HwExtra { + version: var_version, + protocol_version: var_protocolVersion, + device_id: var_deviceId, + icloud_ua: var_icloudUa, + aoskit_version: var_aoskitVersion, + }; } - { - let PhotoPosterLayer = None::.unwrap(); - let _: crate::api::api::PhotoPosterContentsFrame = PhotoPosterLayer.frame; - let _: String = PhotoPosterLayer.filename; - let _: f32 = PhotoPosterLayer.z_position; - let _: String = PhotoPosterLayer.identifier; +} + +impl SseDecode for i32 { + // Codec=Sse (Serialization based), see doc to use other codecs + fn sse_decode(deserializer: &mut flutter_rust_bridge::for_generated::SseDeserializer) -> Self { + deserializer.cursor.read_i32::().unwrap() } - { - let PhotoPosterLayout = None::.unwrap(); - let _: u32 = PhotoPosterLayout.clock_intersection; - let _: crate::api::api::PhotoPosterContentsSize = PhotoPosterLayout.device_resolution; - let _: crate::api::api::PhotoPosterContentsFrame = PhotoPosterLayout.visible_frame; - let _: crate::api::api::PhotoPosterContentsFrame = PhotoPosterLayout.time_frame; - let _: String = PhotoPosterLayout.clock_layer_order; - let _: bool = PhotoPosterLayout.has_top_edge_contact; - let _: crate::api::api::PhotoPosterContentsFrame = PhotoPosterLayout.inactive_frame; - let _: crate::api::api::PhotoPosterContentsSize = PhotoPosterLayout.image_size; - let _: crate::api::api::PhotoPosterContentsSize = PhotoPosterLayout.parallax_padding; +} + +impl SseDecode for i64 { + // Codec=Sse (Serialization based), see doc to use other codecs + fn sse_decode(deserializer: &mut flutter_rust_bridge::for_generated::SseDeserializer) -> Self { + deserializer.cursor.read_i64::().unwrap() } - { - let PhotoPosterProperties = None::.unwrap(); - let _: crate::api::api::PhotoPosterLayout = PhotoPosterProperties.portrait_layout; - let _: bool = PhotoPosterProperties.settling_effect_enabled; - let _: bool = PhotoPosterProperties.depth_enabled; - let _: f64 = PhotoPosterProperties.clock_area_luminance; - let _: bool = PhotoPosterProperties.parallax_disabled; +} + +impl SseDecode for crate::api::api::IMessageNameRecord { + // Codec=Sse (Serialization based), see doc to use other codecs + fn sse_decode(deserializer: &mut flutter_rust_bridge::for_generated::SseDeserializer) -> Self { + let mut var_name = ::sse_decode(deserializer); + let mut var_first = ::sse_decode(deserializer); + let mut var_last = ::sse_decode(deserializer); + return crate::api::api::IMessageNameRecord { + name: var_name, + first: var_first, + last: var_last, + }; } - { - let PosterAsset = None::.unwrap(); - let _: crate::api::api::PhotoPosterContents = PosterAsset.contents; - let _: std::collections::HashMap> = PosterAsset.files; - let _: String = PosterAsset.uuid; +} + +impl SseDecode for crate::api::api::IMessageNicknameRecord { + // Codec=Sse (Serialization based), see doc to use other codecs + fn sse_decode(deserializer: &mut flutter_rust_bridge::for_generated::SseDeserializer) -> Self { + let mut var_name = ::sse_decode(deserializer); + let mut var_image = >>::sse_decode(deserializer); + let mut var_poster = + >::sse_decode(deserializer); + return crate::api::api::IMessageNicknameRecord { + name: var_name, + image: var_image, + poster: var_poster, + }; } - { - let PosterColor = None::.unwrap(); - let _: f64 = PosterColor.alpha; - let _: f64 = PosterColor.blue; - let _: f64 = PosterColor.green; - let _: f64 = PosterColor.red; +} + +impl SseDecode for crate::api::api::IMessagePosterRecord { + // Codec=Sse (Serialization based), see doc to use other codecs + fn sse_decode(deserializer: &mut flutter_rust_bridge::for_generated::SseDeserializer) -> Self { + let mut var_lowResPoster = >::sse_decode(deserializer); + let mut var_package = >::sse_decode(deserializer); + let mut var_meta = >::sse_decode(deserializer); + return crate::api::api::IMessagePosterRecord { + low_res_poster: var_lowResPoster, + package: var_package, + meta: var_meta, + }; } - match None::.unwrap() { - crate::api::api::PosterType::Photo { assets } => { - let _: Vec = assets; - } - crate::api::api::PosterType::Monogram { data, background } => { - let _: crate::api::api::MonogramData = data; - let _: crate::api::api::PosterColor = background; - } - crate::api::api::PosterType::Memoji { data, background } => { - let _: crate::api::api::MemojiData = data; - let _: crate::api::api::PosterColor = background; - } - crate::api::api::PosterType::TranscriptDynamic { data } => { - let _: crate::api::api::TranscriptDynamicUserData = data; - } - crate::api::api::PosterType::TranscriptGradient { colors } => { - let _: Vec = colors; - } +} + +impl SseDecode for crate::api::api::IconChangeMessage { + // Codec=Sse (Serialization based), see doc to use other codecs + fn sse_decode(deserializer: &mut flutter_rust_bridge::for_generated::SseDeserializer) -> Self { + let mut var_file = >::sse_decode(deserializer); + let mut var_groupVersion = ::sse_decode(deserializer); + return crate::api::api::IconChangeMessage { + file: var_file, + group_version: var_groupVersion, + }; } - { - let PRPosterColor = None::.unwrap(); - let _: u32 = PRPosterColor.preferred_style; - let _: String = PRPosterColor.identifier; - let _: bool = PRPosterColor.suggested; - let _: crate::api::api::UIColor = PRPosterColor.color; +} + +impl SseDecode for crate::api::api::IdmsCircleMessage { + // Codec=Sse (Serialization based), see doc to use other codecs + fn sse_decode(deserializer: &mut flutter_rust_bridge::for_generated::SseDeserializer) -> Self { + let mut var_step = ::sse_decode(deserializer); + let mut var_atxnid = ::sse_decode(deserializer); + let mut var_pake = >::sse_decode(deserializer); + let mut var_ec = >::sse_decode(deserializer); + let mut var_idmsdata = ::sse_decode(deserializer); + return crate::api::api::IdmsCircleMessage { + step: var_step, + atxnid: var_atxnid, + pake: var_pake, + ec: var_ec, + idmsdata: var_idmsdata, + }; } - match None::.unwrap() { - crate::api::api::PRPosterContentMaterialStyle::PRPosterContentDiscreteColorsStyle { - variation, - colors, - vibrant, - supports_variation, - needs_to_resolve_variation, - } => { - let _: f32 = variation; - let _: Vec = colors; - let _: bool = vibrant; - let _: bool = supports_variation; - let _: bool = needs_to_resolve_variation; - } - crate::api::api::PRPosterContentMaterialStyle::PRPosterContentVibrantMaterialStyle => {} - crate::api::api::PRPosterContentMaterialStyle::PRPosterContentGradientStyle { - gradient_type, - colors, - start_point, - locations, - end_point, - } => { - let _: u32 = gradient_type; - let _: Vec = colors; - let _: String = start_point; - let _: Vec = locations; - let _: String = end_point; +} + +impl SseDecode for crate::api::api::IdmsMessage { + // Codec=Sse (Serialization based), see doc to use other codecs + fn sse_decode(deserializer: &mut flutter_rust_bridge::for_generated::SseDeserializer) -> Self { + let mut tag_ = ::sse_decode(deserializer); + match tag_ { + 0 => { + let mut var_field0 = + ::sse_decode(deserializer); + return crate::api::api::IdmsMessage::RequestedSignIn(var_field0); + } + 1 => { + let mut var_field0 = ::sse_decode(deserializer); + return crate::api::api::IdmsMessage::TeardownSignIn(var_field0); + } + 2 => { + let mut var_field0 = ::sse_decode(deserializer); + let mut var_field1 = + >::sse_decode(deserializer); + return crate::api::api::IdmsMessage::CircleRequest(var_field0, var_field1); + } + _ => { + unimplemented!(""); + } } } - { - let PRPosterSystemTimeFontConfiguration = - None::.unwrap(); - let _: bool = PRPosterSystemTimeFontConfiguration.is_system_item; - let _: String = PRPosterSystemTimeFontConfiguration.time_font_identifier; - let _: f64 = PRPosterSystemTimeFontConfiguration.weight; +} + +impl SseDecode for crate::api::api::IdmsRequestedSignIn { + // Codec=Sse (Serialization based), see doc to use other codecs + fn sse_decode(deserializer: &mut flutter_rust_bridge::for_generated::SseDeserializer) -> Self { + let mut var_aps = ::sse_decode(deserializer); + let mut var_txnid = ::sse_decode(deserializer); + let mut var_akdata = ::sse_decode(deserializer); + let mut var_adsid = ::sse_decode(deserializer); + return crate::api::api::IdmsRequestedSignIn { + aps: var_aps, + txnid: var_txnid, + akdata: var_akdata, + adsid: var_adsid, + }; } - { - let PRPosterTitleStyleConfiguration = - None::.unwrap(); - let _: bool = PRPosterTitleStyleConfiguration.alternate_date_enabled; - let _: f64 = PRPosterTitleStyleConfiguration.contents_luminence; - let _: String = PRPosterTitleStyleConfiguration.group_name; - let _: u32 = PRPosterTitleStyleConfiguration.preferred_title_alignment; - let _: u32 = PRPosterTitleStyleConfiguration.preferred_title_layout; - let _: crate::api::api::PRPosterSystemTimeFontConfiguration = - PRPosterTitleStyleConfiguration.time_font_configuration; - let _: Option> = PRPosterTitleStyleConfiguration.time_numbering_system; - let _: crate::api::api::PRPosterColor = PRPosterTitleStyleConfiguration.title_color; - let _: Vec = PRPosterTitleStyleConfiguration.title_content_style; - let _: bool = PRPosterTitleStyleConfiguration.user_configured; - let _: Option = - PRPosterTitleStyleConfiguration.title_style; +} + +impl SseDecode for crate::api::api::IndexedMessagePart { + // Codec=Sse (Serialization based), see doc to use other codecs + fn sse_decode(deserializer: &mut flutter_rust_bridge::for_generated::SseDeserializer) -> Self { + let mut var_part_ = ::sse_decode(deserializer); + let mut var_idx = >::sse_decode(deserializer); + let mut var_ext = >::sse_decode(deserializer); + return crate::api::api::IndexedMessagePart { + part: var_part_, + idx: var_idx, + ext: var_ext, + }; } - { - let PrivateDeviceInfo = None::.unwrap(); - let _: Option = PrivateDeviceInfo.uuid; - let _: Option = PrivateDeviceInfo.device_name; - let _: Vec = PrivateDeviceInfo.token; - let _: bool = PrivateDeviceInfo.is_hsa_trusted; - let _: Vec = PrivateDeviceInfo.identites; - let _: Vec = PrivateDeviceInfo.sub_services; +} + +impl SseDecode for crate::api::api::LetMeInRequest { + // Codec=Sse (Serialization based), see doc to use other codecs + fn sse_decode(deserializer: &mut flutter_rust_bridge::for_generated::SseDeserializer) -> Self { + let mut var_sharedSecret = >::sse_decode(deserializer); + let mut var_pseud = ::sse_decode(deserializer); + let mut var_requestor = ::sse_decode(deserializer); + let mut var_nickname = >::sse_decode(deserializer); + let mut var_token = >::sse_decode(deserializer); + let mut var_delegationUuid = >::sse_decode(deserializer); + let mut var_usage = >::sse_decode(deserializer); + return crate::api::api::LetMeInRequest { + shared_secret: var_sharedSecret, + pseud: var_pseud, + requestor: var_requestor, + nickname: var_nickname, + token: var_token, + delegation_uuid: var_delegationUuid, + usage: var_usage, + }; } - { - let ReactMessage = None::.unwrap(); - let _: String = ReactMessage.to_uuid; - let _: Option = ReactMessage.to_part; - let _: crate::api::api::ReactMessageType = ReactMessage.reaction; - let _: String = ReactMessage.to_text; - let _: Option = ReactMessage.embedded_profile; +} + +impl SseDecode for crate::api::api::LinkMeta { + // Codec=Sse (Serialization based), see doc to use other codecs + fn sse_decode(deserializer: &mut flutter_rust_bridge::for_generated::SseDeserializer) -> Self { + let mut var_data = ::sse_decode(deserializer); + let mut var_attachments = >>::sse_decode(deserializer); + return crate::api::api::LinkMeta { + data: var_data, + attachments: var_attachments, + }; } - match None::.unwrap() { - crate::api::api::ReactMessageType::React { reaction, enable } => { - let _: crate::api::api::Reaction = reaction; - let _: bool = enable; +} + +impl SseDecode for Vec { + // Codec=Sse (Serialization based), see doc to use other codecs + fn sse_decode(deserializer: &mut flutter_rust_bridge::for_generated::SseDeserializer) -> Self { + let mut len_ = ::sse_decode(deserializer); + let mut ans_ = vec![]; + for idx_ in 0..len_ { + ans_.push(::sse_decode(deserializer)); } - crate::api::api::ReactMessageType::Extension { - spec, - body, - is_meta, - } => { - let _: crate::api::api::ExtensionApp = spec; - let _: crate::api::api::MessageParts = body; - let _: bool = is_meta; + return ans_; + } +} + +impl SseDecode for Vec { + // Codec=Sse (Serialization based), see doc to use other codecs + fn sse_decode(deserializer: &mut flutter_rust_bridge::for_generated::SseDeserializer) -> Self { + let mut len_ = ::sse_decode(deserializer); + let mut ans_ = vec![]; + for idx_ in 0..len_ { + ans_.push(::sse_decode(deserializer)); } + return ans_; } - match None::.unwrap() { - crate::api::api::Reaction::Heart => {} - crate::api::api::Reaction::Like => {} - crate::api::api::Reaction::Dislike => {} - crate::api::api::Reaction::Laugh => {} - crate::api::api::Reaction::Emphasize => {} - crate::api::api::Reaction::Question => {} - crate::api::api::Reaction::Emoji(field0) => { - let _: String = field0; +} + +impl SseDecode for Vec { + // Codec=Sse (Serialization based), see doc to use other codecs + fn sse_decode(deserializer: &mut flutter_rust_bridge::for_generated::SseDeserializer) -> Self { + let mut len_ = ::sse_decode(deserializer); + let mut ans_ = vec![]; + for idx_ in 0..len_ { + ans_.push(::sse_decode(deserializer)); } - crate::api::api::Reaction::Sticker { spec, body } => { - let _: Option = spec; - let _: crate::api::api::MessageParts = body; + return ans_; + } +} + +impl SseDecode for Vec { + // Codec=Sse (Serialization based), see doc to use other codecs + fn sse_decode(deserializer: &mut flutter_rust_bridge::for_generated::SseDeserializer) -> Self { + let mut len_ = ::sse_decode(deserializer); + let mut ans_ = vec![]; + for idx_ in 0..len_ { + ans_.push(::sse_decode(deserializer)); } + return ans_; } - { - let RenameMessage = None::.unwrap(); - let _: String = RenameMessage.new_name; +} + +impl SseDecode for Vec { + // Codec=Sse (Serialization based), see doc to use other codecs + fn sse_decode(deserializer: &mut flutter_rust_bridge::for_generated::SseDeserializer) -> Self { + let mut len_ = ::sse_decode(deserializer); + let mut ans_ = vec![]; + for idx_ in 0..len_ { + ans_.push(::sse_decode( + deserializer, + )); + } + return ans_; } - { - let ReportMessage = None::.unwrap(); - let _: String = ReportMessage.guid; - let _: String = ReportMessage.sender; - let _: u32 = ReportMessage.conversation_size; - let _: crate::api::api::MessageParts = ReportMessage.parts; - let _: f64 = ReportMessage.time_of_message; +} + +impl SseDecode for Vec { + // Codec=Sse (Serialization based), see doc to use other codecs + fn sse_decode(deserializer: &mut flutter_rust_bridge::for_generated::SseDeserializer) -> Self { + let mut len_ = ::sse_decode(deserializer); + let mut ans_ = vec![]; + for idx_ in 0..len_ { + ans_.push(::sse_decode( + deserializer, + )); + } + return ans_; } - { - let RichLinkImageAttachmentSubstitute = - None::.unwrap(); - let _: String = RichLinkImageAttachmentSubstitute.mime_type; - let _: u64 = RichLinkImageAttachmentSubstitute.rich_link_image_attachment_substitute_index; +} + +impl SseDecode for Vec { + // Codec=Sse (Serialization based), see doc to use other codecs + fn sse_decode(deserializer: &mut flutter_rust_bridge::for_generated::SseDeserializer) -> Self { + let mut len_ = ::sse_decode(deserializer); + let mut ans_ = vec![]; + for idx_ in 0..len_ { + ans_.push( + ::sse_decode(deserializer), + ); + } + return ans_; } - { - let ScheduleMode = None::.unwrap(); - let _: u64 = ScheduleMode.ms; - let _: bool = ScheduleMode.schedule; +} + +impl SseDecode for Vec { + // Codec=Sse (Serialization based), see doc to use other codecs + fn sse_decode(deserializer: &mut flutter_rust_bridge::for_generated::SseDeserializer) -> Self { + let mut len_ = ::sse_decode(deserializer); + let mut ans_ = vec![]; + for idx_ in 0..len_ { + ans_.push(::sse_decode( + deserializer, + )); + } + return ans_; } - match None::.unwrap() { - crate::api::api::SetTranscriptBackgroundMessage::Remove { - aid, - bid, - chat_id, - remove, - } => { - let _: u32 = aid; - let _: u64 = bid; - let _: Option = chat_id; - let _: bool = remove; +} + +impl SseDecode for Vec { + // Codec=Sse (Serialization based), see doc to use other codecs + fn sse_decode(deserializer: &mut flutter_rust_bridge::for_generated::SseDeserializer) -> Self { + let mut len_ = ::sse_decode(deserializer); + let mut ans_ = vec![]; + for idx_ in 0..len_ { + ans_.push(::sse_decode( + deserializer, + )); } - crate::api::api::SetTranscriptBackgroundMessage::Set { - aid, - bid, - chat_id, - object_id, - payload_version, - background_id, - url, - signature, - key, - file_size, - } => { - let _: u32 = aid; - let _: u64 = bid; - let _: Option = chat_id; - let _: String = object_id; - let _: u32 = payload_version; - let _: String = background_id; - let _: String = url; - let _: String = signature; - let _: String = key; - let _: usize = file_size; + return ans_; + } +} + +impl SseDecode for Vec { + // Codec=Sse (Serialization based), see doc to use other codecs + fn sse_decode(deserializer: &mut flutter_rust_bridge::for_generated::SseDeserializer) -> Self { + let mut len_ = ::sse_decode(deserializer); + let mut ans_ = vec![]; + for idx_ in 0..len_ { + ans_.push( + ::sse_decode(deserializer), + ); } + return ans_; } - { - let ShareInviteContentData = None::.unwrap(); - let _: Vec = ShareInviteContentData.invitation_token; - let _: String = ShareInviteContentData.group_id; - let _: Date = ShareInviteContentData.sent_time; - let _: String = ShareInviteContentData.group_name; - let _: String = ShareInviteContentData.share_url; - let _: String = ShareInviteContentData.invitee_handle; +} + +impl SseDecode for Vec { + // Codec=Sse (Serialization based), see doc to use other codecs + fn sse_decode(deserializer: &mut flutter_rust_bridge::for_generated::SseDeserializer) -> Self { + let mut len_ = ::sse_decode(deserializer); + let mut ans_ = vec![]; + for idx_ in 0..len_ { + ans_.push(::sse_decode( + deserializer, + )); + } + return ans_; } - { - let ShareProfileMessage = None::.unwrap(); - let _: Vec = ShareProfileMessage.cloud_kit_decryption_record_key; - let _: String = ShareProfileMessage.cloud_kit_record_key; - let _: Option = ShareProfileMessage.poster; +} + +impl SseDecode for Vec { + // Codec=Sse (Serialization based), see doc to use other codecs + fn sse_decode(deserializer: &mut flutter_rust_bridge::for_generated::SseDeserializer) -> Self { + let mut len_ = ::sse_decode(deserializer); + let mut ans_ = vec![]; + for idx_ in 0..len_ { + ans_.push(::sse_decode(deserializer)); + } + return ans_; } - { - let SharedAlbum = None::.unwrap(); - let _: Option = SharedAlbum.name; - let _: Option = SharedAlbum.fullname; - let _: Option = SharedAlbum.email; - let _: String = SharedAlbum.albumguid; - let _: String = SharedAlbum.sharingtype; - let _: Option = SharedAlbum.subscriptiondate; - let _: Option = SharedAlbum.albumlocation; - let _: Vec = SharedAlbum.assets; - let _: Option = SharedAlbum.delete; +} + +impl SseDecode for Vec { + // Codec=Sse (Serialization based), see doc to use other codecs + fn sse_decode(deserializer: &mut flutter_rust_bridge::for_generated::SseDeserializer) -> Self { + let mut len_ = ::sse_decode(deserializer); + let mut ans_ = vec![]; + for idx_ in 0..len_ { + ans_.push(::sse_decode( + deserializer, + )); + } + return ans_; } - { - let SharedPoster = None::.unwrap(); - let _: Vec = SharedPoster.low_res_wallpaper_tag; - let _: Vec = SharedPoster.wallpaper_tag; - let _: Vec = SharedPoster.message_tag; +} + +impl SseDecode for Vec { + // Codec=Sse (Serialization based), see doc to use other codecs + fn sse_decode(deserializer: &mut flutter_rust_bridge::for_generated::SseDeserializer) -> Self { + let mut len_ = ::sse_decode(deserializer); + let mut ans_ = vec![]; + for idx_ in 0..len_ { + ans_.push(::sse_decode(deserializer)); + } + return ans_; } - { - let SimplifiedIncomingCallPoster = - None::.unwrap(); - let _: crate::api::api::SimplifiedPoster = SimplifiedIncomingCallPoster.poster; - let _: crate::api::api::WallpaperMetadata = SimplifiedIncomingCallPoster.text_metadata; - let _: Vec = SimplifiedIncomingCallPoster.low_res; +} + +impl SseDecode for Vec { + // Codec=Sse (Serialization based), see doc to use other codecs + fn sse_decode(deserializer: &mut flutter_rust_bridge::for_generated::SseDeserializer) -> Self { + let mut len_ = ::sse_decode(deserializer); + let mut ans_ = vec![]; + for idx_ in 0..len_ { + ans_.push(::sse_decode(deserializer)); + } + return ans_; } - { - let SimplifiedPoster = None::.unwrap(); - let _: crate::api::api::PRPosterTitleStyleConfiguration = - SimplifiedPoster.title_configuration; - let _: crate::api::api::PosterType = SimplifiedPoster.r#type; - let _: crate::api::api::PosterRole = SimplifiedPoster.role; +} + +impl SseDecode for Vec { + // Codec=Sse (Serialization based), see doc to use other codecs + fn sse_decode(deserializer: &mut flutter_rust_bridge::for_generated::SseDeserializer) -> Self { + let mut len_ = ::sse_decode(deserializer); + let mut ans_ = vec![]; + for idx_ in 0..len_ { + ans_.push(::sse_decode(deserializer)); + } + return ans_; } - { - let SimplifiedTranscriptPoster = - None::.unwrap(); - let _: crate::api::api::WatchBackground = SimplifiedTranscriptPoster.watch; - let _: crate::api::api::SimplifiedPoster = SimplifiedTranscriptPoster.poster; +} + +impl SseDecode for Vec { + // Codec=Sse (Serialization based), see doc to use other codecs + fn sse_decode(deserializer: &mut flutter_rust_bridge::for_generated::SseDeserializer) -> Self { + let mut len_ = ::sse_decode(deserializer); + let mut ans_ = vec![]; + for idx_ in 0..len_ { + ans_.push(::sse_decode(deserializer)); + } + return ans_; } - match None::.unwrap() { - crate::api::api::StatusKitMessage::StatusChanged { - user, - mode, - allowed, - } => { - let _: String = user; - let _: Option = mode; - let _: bool = allowed; +} + +impl SseDecode for Vec { + // Codec=Sse (Serialization based), see doc to use other codecs + fn sse_decode(deserializer: &mut flutter_rust_bridge::for_generated::SseDeserializer) -> Self { + let mut len_ = ::sse_decode(deserializer); + let mut ans_ = vec![]; + for idx_ in 0..len_ { + ans_.push(::sse_decode(deserializer)); } + return ans_; } - { - let StatusKitPersonalConfig = None::.unwrap(); - let _: Vec = StatusKitPersonalConfig.allowed_modes; +} + +impl SseDecode for Vec { + // Codec=Sse (Serialization based), see doc to use other codecs + fn sse_decode(deserializer: &mut flutter_rust_bridge::for_generated::SseDeserializer) -> Self { + let mut len_ = ::sse_decode(deserializer); + let mut ans_ = vec![]; + for idx_ in 0..len_ { + ans_.push(::sse_decode( + deserializer, + )); + } + return ans_; } - { - let SupportAction = None::.unwrap(); - let _: String = SupportAction.url; - let _: String = SupportAction.button; +} + +impl SseDecode for Vec { + // Codec=Sse (Serialization based), see doc to use other codecs + fn sse_decode(deserializer: &mut flutter_rust_bridge::for_generated::SseDeserializer) -> Self { + let mut len_ = ::sse_decode(deserializer); + let mut ans_ = vec![]; + for idx_ in 0..len_ { + ans_.push(::sse_decode( + deserializer, + )); + } + return ans_; } - { - let SupportAlert = None::.unwrap(); - let _: String = SupportAlert.title; - let _: String = SupportAlert.body; - let _: Option = SupportAlert.action; +} + +impl SseDecode for Vec> { + // Codec=Sse (Serialization based), see doc to use other codecs + fn sse_decode(deserializer: &mut flutter_rust_bridge::for_generated::SseDeserializer) -> Self { + let mut len_ = ::sse_decode(deserializer); + let mut ans_ = vec![]; + for idx_ in 0..len_ { + ans_.push(>::sse_decode(deserializer)); + } + return ans_; } - match None::.unwrap() { - crate::api::api::SyncStatus::Synced => {} - crate::api::api::SyncStatus::Downloading { progress, total } => { - let _: usize = progress; - let _: usize = total; +} + +impl SseDecode for Vec { + // Codec=Sse (Serialization based), see doc to use other codecs + fn sse_decode(deserializer: &mut flutter_rust_bridge::for_generated::SseDeserializer) -> Self { + let mut len_ = ::sse_decode(deserializer); + let mut ans_ = vec![]; + for idx_ in 0..len_ { + ans_.push(::sse_decode(deserializer)); } - crate::api::api::SyncStatus::Uploading { progress, total } => { - let _: usize = progress; - let _: usize = total; + return ans_; + } +} + +impl SseDecode for Vec { + // Codec=Sse (Serialization based), see doc to use other codecs + fn sse_decode(deserializer: &mut flutter_rust_bridge::for_generated::SseDeserializer) -> Self { + let mut len_ = ::sse_decode(deserializer); + let mut ans_ = vec![]; + for idx_ in 0..len_ { + ans_.push(::sse_decode(deserializer)); } - crate::api::api::SyncStatus::Syncing => {} + return ans_; } - { - let TeardownSignIn = None::.unwrap(); - let _: String = TeardownSignIn.prevtxnid; +} + +impl SseDecode for Vec { + // Codec=Sse (Serialization based), see doc to use other codecs + fn sse_decode(deserializer: &mut flutter_rust_bridge::for_generated::SseDeserializer) -> Self { + let mut len_ = ::sse_decode(deserializer); + let mut ans_ = vec![]; + for idx_ in 0..len_ { + ans_.push(::sse_decode( + deserializer, + )); + } + return ans_; } - { - let TextFlags = None::.unwrap(); - let _: bool = TextFlags.bold; - let _: bool = TextFlags.italic; - let _: bool = TextFlags.underline; - let _: bool = TextFlags.strikethrough; +} + +impl SseDecode for Vec { + // Codec=Sse (Serialization based), see doc to use other codecs + fn sse_decode(deserializer: &mut flutter_rust_bridge::for_generated::SseDeserializer) -> Self { + let mut len_ = ::sse_decode(deserializer); + let mut ans_ = vec![]; + for idx_ in 0..len_ { + ans_.push(::sse_decode( + deserializer, + )); + } + return ans_; } - match None::.unwrap() { - crate::api::api::TextFormat::Flags(field0) => { - let _: crate::api::api::TextFlags = field0; +} + +impl SseDecode for Vec { + // Codec=Sse (Serialization based), see doc to use other codecs + fn sse_decode(deserializer: &mut flutter_rust_bridge::for_generated::SseDeserializer) -> Self { + let mut len_ = ::sse_decode(deserializer); + let mut ans_ = vec![]; + for idx_ in 0..len_ { + ans_.push(::sse_decode( + deserializer, + )); } - crate::api::api::TextFormat::Effect(field0) => { - let _: crate::api::api::TextEffect = field0; + return ans_; + } +} + +impl SseDecode for Vec { + // Codec=Sse (Serialization based), see doc to use other codecs + fn sse_decode(deserializer: &mut flutter_rust_bridge::for_generated::SseDeserializer) -> Self { + let mut len_ = ::sse_decode(deserializer); + let mut ans_ = vec![]; + for idx_ in 0..len_ { + ans_.push(::sse_decode(deserializer)); } + return ans_; } - { - let TranscriptDynamicUserData = None::.unwrap(); - let _: String = TranscriptDynamicUserData.identifier; - } - { - let TrustedPhoneNumber = None::.unwrap(); - let _: String = TrustedPhoneNumber.number_with_dial_code; - let _: String = TrustedPhoneNumber.last_two_digits; - let _: String = TrustedPhoneNumber.push_mode; - let _: u32 = TrustedPhoneNumber.id; +} + +impl SseDecode for Vec { + // Codec=Sse (Serialization based), see doc to use other codecs + fn sse_decode(deserializer: &mut flutter_rust_bridge::for_generated::SseDeserializer) -> Self { + let mut len_ = ::sse_decode(deserializer); + let mut ans_ = vec![]; + for idx_ in 0..len_ { + ans_.push(::sse_decode(deserializer)); + } + return ans_; } - { - let TypingApp = None::.unwrap(); - let _: String = TypingApp.bundle_id; - let _: Vec = TypingApp.icon; +} + +impl SseDecode for Vec { + // Codec=Sse (Serialization based), see doc to use other codecs + fn sse_decode(deserializer: &mut flutter_rust_bridge::for_generated::SseDeserializer) -> Self { + let mut len_ = ::sse_decode(deserializer); + let mut ans_ = vec![]; + for idx_ in 0..len_ { + ans_.push(::sse_decode(deserializer)); + } + return ans_; } - match None::.unwrap() { - crate::api::api::UIColor::RGBAColorSpace { - color_components, - green, - blue, - red, - green_dbl, - blue_dbl, - red_dbl, - alpha_dbl, - alpha, - rgb, - color_space, - class, - } => { - let _: u32 = color_components; - let _: f64 = green; - let _: f64 = blue; - let _: f64 = red; - let _: Option = green_dbl; - let _: Option = blue_dbl; - let _: Option = red_dbl; - let _: Option = alpha_dbl; - let _: f64 = alpha; - let _: Vec = rgb; - let _: u32 = color_space; - let _: String = class; +} + +impl SseDecode for Vec { + // Codec=Sse (Serialization based), see doc to use other codecs + fn sse_decode(deserializer: &mut flutter_rust_bridge::for_generated::SseDeserializer) -> Self { + let mut len_ = ::sse_decode(deserializer); + let mut ans_ = vec![]; + for idx_ in 0..len_ { + ans_.push(::sse_decode(deserializer)); } - crate::api::api::UIColor::GrayscaleAlphaColorSpace { - color_components, - white, - alpha, - bin, - color_space, - class, - } => { - let _: u32 = color_components; - let _: f64 = white; - let _: f64 = alpha; - let _: Vec = bin; - let _: u32 = color_space; - let _: String = class; + return ans_; + } +} + +impl SseDecode for Vec { + // Codec=Sse (Serialization based), see doc to use other codecs + fn sse_decode(deserializer: &mut flutter_rust_bridge::for_generated::SseDeserializer) -> Self { + let mut len_ = ::sse_decode(deserializer); + let mut ans_ = vec![]; + for idx_ in 0..len_ { + ans_.push(::sse_decode(deserializer)); } + return ans_; } - { - let UnsendMessage = None::.unwrap(); - let _: String = UnsendMessage.tuuid; - let _: u64 = UnsendMessage.edit_part; +} + +impl SseDecode for Vec { + // Codec=Sse (Serialization based), see doc to use other codecs + fn sse_decode(deserializer: &mut flutter_rust_bridge::for_generated::SseDeserializer) -> Self { + let mut len_ = ::sse_decode(deserializer); + let mut ans_ = vec![]; + for idx_ in 0..len_ { + ans_.push(::sse_decode(deserializer)); + } + return ans_; } - match None::.unwrap() { - crate::api::api::UpdateAccountFinish::MacOS => {} - crate::api::api::UpdateAccountFinish::IOS { url } => { - let _: String = url; +} + +impl SseDecode for Vec { + // Codec=Sse (Serialization based), see doc to use other codecs + fn sse_decode(deserializer: &mut flutter_rust_bridge::for_generated::SseDeserializer) -> Self { + let mut len_ = ::sse_decode(deserializer); + let mut ans_ = vec![]; + for idx_ in 0..len_ { + ans_.push(::sse_decode( + deserializer, + )); } + return ans_; } - { - let UpdateExtensionMessage = None::.unwrap(); - let _: String = UpdateExtensionMessage.for_uuid; - let _: crate::api::api::PartExtension = UpdateExtensionMessage.ext; +} + +impl SseDecode for Vec<(String, Asset)> { + // Codec=Sse (Serialization based), see doc to use other codecs + fn sse_decode(deserializer: &mut flutter_rust_bridge::for_generated::SseDeserializer) -> Self { + let mut len_ = ::sse_decode(deserializer); + let mut ans_ = vec![]; + for idx_ in 0..len_ { + ans_.push(<(String, Asset)>::sse_decode(deserializer)); + } + return ans_; } - { - let UpdateProfileMessage = None::.unwrap(); - let _: Option = UpdateProfileMessage.profile; - let _: bool = UpdateProfileMessage.share_contacts; +} + +impl SseDecode for Vec<(String, StCollapsedValue)> { + // Codec=Sse (Serialization based), see doc to use other codecs + fn sse_decode(deserializer: &mut flutter_rust_bridge::for_generated::SseDeserializer) -> Self { + let mut len_ = ::sse_decode(deserializer); + let mut ans_ = vec![]; + for idx_ in 0..len_ { + ans_.push(<(String, StCollapsedValue)>::sse_decode(deserializer)); + } + return ans_; } - { - let UpdateProfileSharingMessage = - None::.unwrap(); - let _: Vec = UpdateProfileSharingMessage.shared_dismissed; - let _: Vec = UpdateProfileSharingMessage.shared_all; - let _: u64 = UpdateProfileSharingMessage.version; +} + +impl SseDecode for Vec<(String, bool)> { + // Codec=Sse (Serialization based), see doc to use other codecs + fn sse_decode(deserializer: &mut flutter_rust_bridge::for_generated::SseDeserializer) -> Self { + let mut len_ = ::sse_decode(deserializer); + let mut ans_ = vec![]; + for idx_ in 0..len_ { + ans_.push(<(String, bool)>::sse_decode(deserializer)); + } + return ans_; } - { - let WallpaperMetadata = None::.unwrap(); - let _: Option = WallpaperMetadata.background_color_key; - let _: crate::api::api::PosterColor = WallpaperMetadata.font_color_key; - let _: String = WallpaperMetadata.font_name_key; - let _: f32 = WallpaperMetadata.font_size_key; - let _: f32 = WallpaperMetadata.font_weight_key; - let _: bool = WallpaperMetadata.is_vertical_key; - let _: String = WallpaperMetadata.type_key; +} + +impl SseDecode for Vec<(String, u64)> { + // Codec=Sse (Serialization based), see doc to use other codecs + fn sse_decode(deserializer: &mut flutter_rust_bridge::for_generated::SseDeserializer) -> Self { + let mut len_ = ::sse_decode(deserializer); + let mut ans_ = vec![]; + for idx_ in 0..len_ { + ans_.push(<(String, u64)>::sse_decode(deserializer)); + } + return ans_; } - { - let WatchBackground = None::.unwrap(); - let _: bool = WatchBackground.is_high_key; - let _: f64 = WatchBackground.luminance; - let _: Vec = WatchBackground.background_image_data; - let _: String = WatchBackground.extension_identifier; +} + +impl SseDecode for Vec<(String, crate::api::api::CloudAttachment)> { + // Codec=Sse (Serialization based), see doc to use other codecs + fn sse_decode(deserializer: &mut flutter_rust_bridge::for_generated::SseDeserializer) -> Self { + let mut len_ = ::sse_decode(deserializer); + let mut ans_ = vec![]; + for idx_ in 0..len_ { + ans_.push(<(String, crate::api::api::CloudAttachment)>::sse_decode( + deserializer, + )); + } + return ans_; } - { - let WifiPassword = None::.unwrap(); - let _: u64 = WifiPassword.cdat; - let _: u64 = WifiPassword.mdat; - let _: String = WifiPassword.acct; - let _: String = WifiPassword.svce; - let _: Vec = WifiPassword.data; +} + +impl SseDecode for Vec<(String, crate::api::api::CloudChat)> { + // Codec=Sse (Serialization based), see doc to use other codecs + fn sse_decode(deserializer: &mut flutter_rust_bridge::for_generated::SseDeserializer) -> Self { + let mut len_ = ::sse_decode(deserializer); + let mut ans_ = vec![]; + for idx_ in 0..len_ { + ans_.push(<(String, crate::api::api::CloudChat)>::sse_decode( + deserializer, + )); + } + return ans_; } -}; +} -// Section: related_funcs +impl SseDecode for Vec<(String, crate::api::api::CloudMessage)> { + // Codec=Sse (Serialization based), see doc to use other codecs + fn sse_decode(deserializer: &mut flutter_rust_bridge::for_generated::SseDeserializer) -> Self { + let mut len_ = ::sse_decode(deserializer); + let mut ans_ = vec![]; + for idx_ in 0..len_ { + ans_.push(<(String, crate::api::api::CloudMessage)>::sse_decode( + deserializer, + )); + } + return ans_; + } +} -fn decode_DartFn_Inputs_String_Output_String_AnyhowException( - dart_opaque: flutter_rust_bridge::DartOpaque, -) -> impl Fn(String) -> flutter_rust_bridge::DartFnFuture { - use flutter_rust_bridge::IntoDart; +impl SseDecode for Vec<(String, crate::api::api::FTParticipant)> { + // Codec=Sse (Serialization based), see doc to use other codecs + fn sse_decode(deserializer: &mut flutter_rust_bridge::for_generated::SseDeserializer) -> Self { + let mut len_ = ::sse_decode(deserializer); + let mut ans_ = vec![]; + for idx_ in 0..len_ { + ans_.push(<(String, crate::api::api::FTParticipant)>::sse_decode( + deserializer, + )); + } + return ans_; + } +} - async fn body(dart_opaque: flutter_rust_bridge::DartOpaque, arg0: String) -> String { - let args = vec![arg0.into_into_dart().into_dart()]; - let message = FLUTTER_RUST_BRIDGE_HANDLER - .dart_fn_invoke(dart_opaque, args) - .await; +impl SseDecode for Vec<(String, crate::api::api::GroupSummary)> { + // Codec=Sse (Serialization based), see doc to use other codecs + fn sse_decode(deserializer: &mut flutter_rust_bridge::for_generated::SseDeserializer) -> Self { + let mut len_ = ::sse_decode(deserializer); + let mut ans_ = vec![]; + for idx_ in 0..len_ { + ans_.push(<(String, crate::api::api::GroupSummary)>::sse_decode( + deserializer, + )); + } + return ans_; + } +} - let mut deserializer = flutter_rust_bridge::for_generated::SseDeserializer::new(message); - let action = deserializer.cursor.read_u8().unwrap(); - let ans = match action { - 0 => std::result::Result::Ok(::sse_decode(&mut deserializer)), - 1 => std::result::Result::Err( - ::sse_decode(&mut deserializer), - ), - _ => unreachable!(), - }; - deserializer.end(); - let ans = ans.expect("Dart throws exception but Rust side assume it is not failable"); - ans +impl SseDecode for Vec<(String, Vec)> { + // Codec=Sse (Serialization based), see doc to use other codecs + fn sse_decode(deserializer: &mut flutter_rust_bridge::for_generated::SseDeserializer) -> Self { + let mut len_ = ::sse_decode(deserializer); + let mut ans_ = vec![]; + for idx_ in 0..len_ { + ans_.push(<(String, Vec)>::sse_decode( + deserializer, + )); + } + return ans_; } +} - move |arg0: String| { - flutter_rust_bridge::for_generated::convert_into_dart_fn_future(body( - dart_opaque.clone(), - arg0, - )) +impl SseDecode for Vec<(String, Vec)> { + // Codec=Sse (Serialization based), see doc to use other codecs + fn sse_decode(deserializer: &mut flutter_rust_bridge::for_generated::SseDeserializer) -> Self { + let mut len_ = ::sse_decode(deserializer); + let mut ans_ = vec![]; + for idx_ in 0..len_ { + ans_.push(<(String, Vec)>::sse_decode(deserializer)); + } + return ans_; + } +} + +impl SseDecode for Vec<(String, crate::api::api::MessageEditRange)> { + // Codec=Sse (Serialization based), see doc to use other codecs + fn sse_decode(deserializer: &mut flutter_rust_bridge::for_generated::SseDeserializer) -> Self { + let mut len_ = ::sse_decode(deserializer); + let mut ans_ = vec![]; + for idx_ in 0..len_ { + ans_.push(<(String, crate::api::api::MessageEditRange)>::sse_decode( + deserializer, + )); + } + return ans_; } } -flutter_rust_bridge::frb_generated_moi_arc_impl_value!( - flutter_rust_bridge::for_generated::RustAutoOpaqueInner -); -flutter_rust_bridge::frb_generated_moi_arc_impl_value!( - flutter_rust_bridge::for_generated::RustAutoOpaqueInner -); -flutter_rust_bridge::frb_generated_moi_arc_impl_value!( - flutter_rust_bridge::for_generated::RustAutoOpaqueInner -); -flutter_rust_bridge::frb_generated_moi_arc_impl_value!( - flutter_rust_bridge::for_generated::RustAutoOpaqueInner< - ArcAnisetteClient, - > -); -flutter_rust_bridge::frb_generated_moi_arc_impl_value!( - flutter_rust_bridge::for_generated::RustAutoOpaqueInner< - Arc>, - > -); -flutter_rust_bridge::frb_generated_moi_arc_impl_value!( - flutter_rust_bridge::for_generated::RustAutoOpaqueInner< - Arc>, - > -); -flutter_rust_bridge::frb_generated_moi_arc_impl_value!( - flutter_rust_bridge::for_generated::RustAutoOpaqueInner> -); -flutter_rust_bridge::frb_generated_moi_arc_impl_value!( - flutter_rust_bridge::for_generated::RustAutoOpaqueInner< - Arc>, - > -); -flutter_rust_bridge::frb_generated_moi_arc_impl_value!( - flutter_rust_bridge::for_generated::RustAutoOpaqueInner> -); -flutter_rust_bridge::frb_generated_moi_arc_impl_value!( - flutter_rust_bridge::for_generated::RustAutoOpaqueInner> -); -flutter_rust_bridge::frb_generated_moi_arc_impl_value!( - flutter_rust_bridge::for_generated::RustAutoOpaqueInner< - Arc>, - > -); -flutter_rust_bridge::frb_generated_moi_arc_impl_value!( - flutter_rust_bridge::for_generated::RustAutoOpaqueInner< - Arc>>, - > -); -flutter_rust_bridge::frb_generated_moi_arc_impl_value!( - flutter_rust_bridge::for_generated::RustAutoOpaqueInner< - Arc>>>, - > -); -flutter_rust_bridge::frb_generated_moi_arc_impl_value!( - flutter_rust_bridge::for_generated::RustAutoOpaqueInner>>> -); -flutter_rust_bridge::frb_generated_moi_arc_impl_value!( - flutter_rust_bridge::for_generated::RustAutoOpaqueInner< - Arc>, - > -); -flutter_rust_bridge::frb_generated_moi_arc_impl_value!( - flutter_rust_bridge::for_generated::RustAutoOpaqueInner< - Arc>, - > -); -flutter_rust_bridge::frb_generated_moi_arc_impl_value!( - flutter_rust_bridge::for_generated::RustAutoOpaqueInner>> -); -flutter_rust_bridge::frb_generated_moi_arc_impl_value!( - flutter_rust_bridge::for_generated::RustAutoOpaqueInner> -); -flutter_rust_bridge::frb_generated_moi_arc_impl_value!( - flutter_rust_bridge::for_generated::RustAutoOpaqueInner< - Arc>, - > -); -flutter_rust_bridge::frb_generated_moi_arc_impl_value!( - flutter_rust_bridge::for_generated::RustAutoOpaqueInner< - Arc>, - > -); -flutter_rust_bridge::frb_generated_moi_arc_impl_value!( - flutter_rust_bridge::for_generated::RustAutoOpaqueInner -); -flutter_rust_bridge::frb_generated_moi_arc_impl_value!( - flutter_rust_bridge::for_generated::RustAutoOpaqueInner -); -flutter_rust_bridge::frb_generated_moi_arc_impl_value!( - flutter_rust_bridge::for_generated::RustAutoOpaqueInner< - CircleClientSession, - > -); -flutter_rust_bridge::frb_generated_moi_arc_impl_value!( - flutter_rust_bridge::for_generated::RustAutoOpaqueInner -); -flutter_rust_bridge::frb_generated_moi_arc_impl_value!( - flutter_rust_bridge::for_generated::RustAutoOpaqueInner -); -flutter_rust_bridge::frb_generated_moi_arc_impl_value!( - flutter_rust_bridge::for_generated::RustAutoOpaqueInner -); -flutter_rust_bridge::frb_generated_moi_arc_impl_value!( - flutter_rust_bridge::for_generated::RustAutoOpaqueInner -); -flutter_rust_bridge::frb_generated_moi_arc_impl_value!( - flutter_rust_bridge::for_generated::RustAutoOpaqueInner< - FindMyFriendsClient, - > -); -flutter_rust_bridge::frb_generated_moi_arc_impl_value!( - flutter_rust_bridge::for_generated::RustAutoOpaqueInner< - FindMyPhoneClient, - > -); -flutter_rust_bridge::frb_generated_moi_arc_impl_value!( - flutter_rust_bridge::for_generated::RustAutoOpaqueInner> -); -flutter_rust_bridge::frb_generated_moi_arc_impl_value!( - flutter_rust_bridge::for_generated::RustAutoOpaqueInner> -); -flutter_rust_bridge::frb_generated_moi_arc_impl_value!( - flutter_rust_bridge::for_generated::RustAutoOpaqueInner> -); -flutter_rust_bridge::frb_generated_moi_arc_impl_value!( - flutter_rust_bridge::for_generated::RustAutoOpaqueInner> -); -flutter_rust_bridge::frb_generated_moi_arc_impl_value!( - flutter_rust_bridge::for_generated::RustAutoOpaqueInner> -); -flutter_rust_bridge::frb_generated_moi_arc_impl_value!( - flutter_rust_bridge::for_generated::RustAutoOpaqueInner> -); -flutter_rust_bridge::frb_generated_moi_arc_impl_value!( - flutter_rust_bridge::for_generated::RustAutoOpaqueInner -); -flutter_rust_bridge::frb_generated_moi_arc_impl_value!( - flutter_rust_bridge::for_generated::RustAutoOpaqueInner -); -flutter_rust_bridge::frb_generated_moi_arc_impl_value!( - flutter_rust_bridge::for_generated::RustAutoOpaqueInner -); -flutter_rust_bridge::frb_generated_moi_arc_impl_value!( - flutter_rust_bridge::for_generated::RustAutoOpaqueInner -); -flutter_rust_bridge::frb_generated_moi_arc_impl_value!( - flutter_rust_bridge::for_generated::RustAutoOpaqueInner -); -flutter_rust_bridge::frb_generated_moi_arc_impl_value!( - flutter_rust_bridge::for_generated::RustAutoOpaqueInner> -); -flutter_rust_bridge::frb_generated_moi_arc_impl_value!( - flutter_rust_bridge::for_generated::RustAutoOpaqueInner> -); -flutter_rust_bridge::frb_generated_moi_arc_impl_value!( - flutter_rust_bridge::for_generated::RustAutoOpaqueInner -); -flutter_rust_bridge::frb_generated_moi_arc_impl_value!( - flutter_rust_bridge::for_generated::RustAutoOpaqueInner> -); -flutter_rust_bridge::frb_generated_moi_arc_impl_value!( - flutter_rust_bridge::for_generated::RustAutoOpaqueInner -); -flutter_rust_bridge::frb_generated_moi_arc_impl_value!( - flutter_rust_bridge::for_generated::RustAutoOpaqueInner> -); -flutter_rust_bridge::frb_generated_moi_arc_impl_value!( - flutter_rust_bridge::for_generated::RustAutoOpaqueInner -); -flutter_rust_bridge::frb_generated_moi_arc_impl_value!( - flutter_rust_bridge::for_generated::RustAutoOpaqueInner< - SyncManager, - > -); -flutter_rust_bridge::frb_generated_moi_arc_impl_value!( - flutter_rust_bridge::for_generated::RustAutoOpaqueInner -); -flutter_rust_bridge::frb_generated_moi_arc_impl_value!( - flutter_rust_bridge::for_generated::RustAutoOpaqueInner -); -flutter_rust_bridge::frb_generated_moi_arc_impl_value!( - flutter_rust_bridge::for_generated::RustAutoOpaqueInner -); -// Section: dart2rust +impl SseDecode for Vec<(String, Option)> { + // Codec=Sse (Serialization based), see doc to use other codecs + fn sse_decode(deserializer: &mut flutter_rust_bridge::for_generated::SseDeserializer) -> Self { + let mut len_ = ::sse_decode(deserializer); + let mut ans_ = vec![]; + for idx_ in 0..len_ { + ans_.push( + <(String, Option)>::sse_decode(deserializer), + ); + } + return ans_; + } +} -impl SseDecode for flutter_rust_bridge::for_generated::anyhow::Error { +impl SseDecode for Vec<(String, Option)> { // Codec=Sse (Serialization based), see doc to use other codecs fn sse_decode(deserializer: &mut flutter_rust_bridge::for_generated::SseDeserializer) -> Self { - let mut inner = ::sse_decode(deserializer); - return flutter_rust_bridge::for_generated::anyhow::anyhow!("{}", inner); + let mut len_ = ::sse_decode(deserializer); + let mut ans_ = vec![]; + for idx_ in 0..len_ { + ans_.push(<(String, Option)>::sse_decode( + deserializer, + )); + } + return ans_; } } -impl SseDecode for APSConnection { +impl SseDecode for Vec<(String, Option)> { // Codec=Sse (Serialization based), see doc to use other codecs fn sse_decode(deserializer: &mut flutter_rust_bridge::for_generated::SseDeserializer) -> Self { - let mut inner = , - >>::sse_decode(deserializer); - return flutter_rust_bridge::for_generated::rust_auto_opaque_decode_owned(inner); + let mut len_ = ::sse_decode(deserializer); + let mut ans_ = vec![]; + for idx_ in 0..len_ { + ans_.push(<(String, Option)>::sse_decode(deserializer)); + } + return ans_; } } -impl SseDecode for APSState { +impl SseDecode for Vec<(String, crate::api::api::PasswordManagerMetaDataCtx)> { // Codec=Sse (Serialization based), see doc to use other codecs fn sse_decode(deserializer: &mut flutter_rust_bridge::for_generated::SseDeserializer) -> Self { - let mut inner = , - >>::sse_decode(deserializer); - return flutter_rust_bridge::for_generated::rust_auto_opaque_decode_owned(inner); + let mut len_ = ::sse_decode(deserializer); + let mut ans_ = vec![]; + for idx_ in 0..len_ { + ans_.push( + <(String, crate::api::api::PasswordManagerMetaDataCtx)>::sse_decode(deserializer), + ); + } + return ans_; } } -impl SseDecode for APSWatcher { +impl SseDecode for Vec<(String, (Option, crate::api::api::Passkey))> { // Codec=Sse (Serialization based), see doc to use other codecs fn sse_decode(deserializer: &mut flutter_rust_bridge::for_generated::SseDeserializer) -> Self { - let mut inner = , - >>::sse_decode(deserializer); - return flutter_rust_bridge::for_generated::rust_auto_opaque_decode_owned(inner); + let mut len_ = ::sse_decode(deserializer); + let mut ans_ = vec![]; + for idx_ in 0..len_ { + ans_.push( + <(String, (Option, crate::api::api::Passkey))>::sse_decode(deserializer), + ); + } + return ans_; } } -impl SseDecode for ArcAnisetteClient { +impl SseDecode + for Vec<( + String, + (Option, crate::api::api::PasswordManagerMeta), + )> +{ // Codec=Sse (Serialization based), see doc to use other codecs fn sse_decode(deserializer: &mut flutter_rust_bridge::for_generated::SseDeserializer) -> Self { - let mut inner = , - >, - >>::sse_decode(deserializer); - return flutter_rust_bridge::for_generated::rust_auto_opaque_decode_owned(inner); + let mut len_ = ::sse_decode(deserializer); + let mut ans_ = vec![]; + for idx_ in 0..len_ { + ans_.push(<( + String, + (Option, crate::api::api::PasswordManagerMeta), + )>::sse_decode(deserializer)); + } + return ans_; } } -impl SseDecode for Arc> { +impl SseDecode for Vec<(String, (Option, crate::api::api::PasswordRawEntry))> { // Codec=Sse (Serialization based), see doc to use other codecs fn sse_decode(deserializer: &mut flutter_rust_bridge::for_generated::SseDeserializer) -> Self { - let mut inner = >, - >, - >>::sse_decode(deserializer); - return flutter_rust_bridge::for_generated::rust_auto_opaque_decode_owned(inner); + let mut len_ = ::sse_decode(deserializer); + let mut ans_ = vec![]; + for idx_ in 0..len_ { + ans_.push(<( + String, + (Option, crate::api::api::PasswordRawEntry), + )>::sse_decode(deserializer)); + } + return ans_; } } -impl SseDecode for Arc> { +impl SseDecode for Vec<(String, (Option, crate::api::api::WifiPassword))> { // Codec=Sse (Serialization based), see doc to use other codecs fn sse_decode(deserializer: &mut flutter_rust_bridge::for_generated::SseDeserializer) -> Self { - let mut inner = >, - >, - >>::sse_decode(deserializer); - return flutter_rust_bridge::for_generated::rust_auto_opaque_decode_owned(inner); + let mut len_ = ::sse_decode(deserializer); + let mut ans_ = vec![]; + for idx_ in 0..len_ { + ans_.push( + <(String, (Option, crate::api::api::WifiPassword))>::sse_decode( + deserializer, + ), + ); + } + return ans_; } } -impl SseDecode for Arc { +impl SseDecode for Vec<(String, crate::api::api::ShareInviteContentData)> { // Codec=Sse (Serialization based), see doc to use other codecs fn sse_decode(deserializer: &mut flutter_rust_bridge::for_generated::SseDeserializer) -> Self { - let mut inner = >, - >>::sse_decode(deserializer); - return flutter_rust_bridge::for_generated::rust_auto_opaque_decode_owned(inner); + let mut len_ = ::sse_decode(deserializer); + let mut ans_ = vec![]; + for idx_ in 0..len_ { + ans_.push( + <(String, crate::api::api::ShareInviteContentData)>::sse_decode(deserializer), + ); + } + return ans_; } } -impl SseDecode for Arc> { +impl SseDecode for Vec<(String, crate::api::api::StatusKitPersonalConfig)> { // Codec=Sse (Serialization based), see doc to use other codecs fn sse_decode(deserializer: &mut flutter_rust_bridge::for_generated::SseDeserializer) -> Self { - let mut inner = >, - >, - >>::sse_decode(deserializer); - return flutter_rust_bridge::for_generated::rust_auto_opaque_decode_owned(inner); + let mut len_ = ::sse_decode(deserializer); + let mut ans_ = vec![]; + for idx_ in 0..len_ { + ans_.push( + <(String, crate::api::api::StatusKitPersonalConfig)>::sse_decode(deserializer), + ); + } + return ans_; } } -impl SseDecode for Arc { +impl SseDecode for Vec<(String, String)> { // Codec=Sse (Serialization based), see doc to use other codecs fn sse_decode(deserializer: &mut flutter_rust_bridge::for_generated::SseDeserializer) -> Self { - let mut inner = >, - >>::sse_decode(deserializer); - return flutter_rust_bridge::for_generated::rust_auto_opaque_decode_owned(inner); + let mut len_ = ::sse_decode(deserializer); + let mut ans_ = vec![]; + for idx_ in 0..len_ { + ans_.push(<(String, String)>::sse_decode(deserializer)); + } + return ans_; } } -impl SseDecode for Arc { +impl SseDecode for Vec<(String, crate::api::api::SyncStatus)> { // Codec=Sse (Serialization based), see doc to use other codecs fn sse_decode(deserializer: &mut flutter_rust_bridge::for_generated::SseDeserializer) -> Self { - let mut inner = >, - >>::sse_decode(deserializer); - return flutter_rust_bridge::for_generated::rust_auto_opaque_decode_owned(inner); + let mut len_ = ::sse_decode(deserializer); + let mut ans_ = vec![]; + for idx_ in 0..len_ { + ans_.push(<(String, crate::api::api::SyncStatus)>::sse_decode( + deserializer, + )); + } + return ans_; } } -impl SseDecode for Arc> { +impl SseDecode for Vec<(u32, crate::api::api::NSDictionaryTypedCoder)> { // Codec=Sse (Serialization based), see doc to use other codecs fn sse_decode(deserializer: &mut flutter_rust_bridge::for_generated::SseDeserializer) -> Self { - let mut inner = >, - >, - >>::sse_decode(deserializer); - return flutter_rust_bridge::for_generated::rust_auto_opaque_decode_owned(inner); + let mut len_ = ::sse_decode(deserializer); + let mut ans_ = vec![]; + for idx_ in 0..len_ { + ans_.push(<(u32, crate::api::api::NSDictionaryTypedCoder)>::sse_decode(deserializer)); + } + return ans_; } } -impl SseDecode for Arc>> { +impl SseDecode for Vec { // Codec=Sse (Serialization based), see doc to use other codecs fn sse_decode(deserializer: &mut flutter_rust_bridge::for_generated::SseDeserializer) -> Self { - let mut inner = >>, - >, - >>::sse_decode(deserializer); - return flutter_rust_bridge::for_generated::rust_auto_opaque_decode_owned(inner); + let mut len_ = ::sse_decode(deserializer); + let mut ans_ = vec![]; + for idx_ in 0..len_ { + ans_.push(::sse_decode(deserializer)); + } + return ans_; } } -impl SseDecode for Arc>>> { +impl SseDecode for Vec { // Codec=Sse (Serialization based), see doc to use other codecs fn sse_decode(deserializer: &mut flutter_rust_bridge::for_generated::SseDeserializer) -> Self { - let mut inner = >>>, - >, - >>::sse_decode(deserializer); - return flutter_rust_bridge::for_generated::rust_auto_opaque_decode_owned(inner); + let mut len_ = ::sse_decode(deserializer); + let mut ans_ = vec![]; + for idx_ in 0..len_ { + ans_.push(::sse_decode(deserializer)); + } + return ans_; } } -impl SseDecode for Arc>> { +impl SseDecode for Vec { // Codec=Sse (Serialization based), see doc to use other codecs fn sse_decode(deserializer: &mut flutter_rust_bridge::for_generated::SseDeserializer) -> Self { - let mut inner = >>, - >, - >>::sse_decode(deserializer); - return flutter_rust_bridge::for_generated::rust_auto_opaque_decode_owned(inner); + let mut len_ = ::sse_decode(deserializer); + let mut ans_ = vec![]; + for idx_ in 0..len_ { + ans_.push(::sse_decode( + deserializer, + )); + } + return ans_; } } -impl SseDecode for Arc> { +impl SseDecode for Vec { // Codec=Sse (Serialization based), see doc to use other codecs fn sse_decode(deserializer: &mut flutter_rust_bridge::for_generated::SseDeserializer) -> Self { - let mut inner = >, - >, - >>::sse_decode(deserializer); - return flutter_rust_bridge::for_generated::rust_auto_opaque_decode_owned(inner); + let mut len_ = ::sse_decode(deserializer); + let mut ans_ = vec![]; + for idx_ in 0..len_ { + ans_.push(::sse_decode(deserializer)); + } + return ans_; } } -impl SseDecode for Arc> { +impl SseDecode for crate::api::api::Location { // Codec=Sse (Serialization based), see doc to use other codecs fn sse_decode(deserializer: &mut flutter_rust_bridge::for_generated::SseDeserializer) -> Self { - let mut inner = >, - >, - >>::sse_decode(deserializer); - return flutter_rust_bridge::for_generated::rust_auto_opaque_decode_owned(inner); + let mut var_address = >::sse_decode(deserializer); + let mut var_altitude = ::sse_decode(deserializer); + let mut var_floorLevel = ::sse_decode(deserializer); + let mut var_horizontalAccuracy = ::sse_decode(deserializer); + let mut var_isInaccurate = ::sse_decode(deserializer); + let mut var_latitude = ::sse_decode(deserializer); + let mut var_locationId = >::sse_decode(deserializer); + let mut var_locationTimestamp = >::sse_decode(deserializer); + let mut var_longitude = ::sse_decode(deserializer); + let mut var_secureLocationTs = ::sse_decode(deserializer); + let mut var_timestamp = ::sse_decode(deserializer); + let mut var_verticalAccuracy = ::sse_decode(deserializer); + let mut var_positionType = >::sse_decode(deserializer); + let mut var_isOld = >::sse_decode(deserializer); + let mut var_locationFinished = >::sse_decode(deserializer); + return crate::api::api::Location { + address: var_address, + altitude: var_altitude, + floor_level: var_floorLevel, + horizontal_accuracy: var_horizontalAccuracy, + is_inaccurate: var_isInaccurate, + latitude: var_latitude, + location_id: var_locationId, + location_timestamp: var_locationTimestamp, + longitude: var_longitude, + secure_location_ts: var_secureLocationTs, + timestamp: var_timestamp, + vertical_accuracy: var_verticalAccuracy, + position_type: var_positionType, + is_old: var_isOld, + location_finished: var_locationFinished, + }; } } -impl SseDecode for Arc> { +impl SseDecode for crate::api::api::LoginState { // Codec=Sse (Serialization based), see doc to use other codecs fn sse_decode(deserializer: &mut flutter_rust_bridge::for_generated::SseDeserializer) -> Self { - let mut inner = >>, - >>::sse_decode(deserializer); - return flutter_rust_bridge::for_generated::rust_auto_opaque_decode_owned(inner); + let mut tag_ = ::sse_decode(deserializer); + match tag_ { + 0 => { + return crate::api::api::LoginState::LoggedIn; + } + 1 => { + return crate::api::api::LoginState::NeedsDevice2FA; + } + 2 => { + return crate::api::api::LoginState::Needs2FAVerification; + } + 3 => { + return crate::api::api::LoginState::NeedsSMS2FA; + } + 4 => { + let mut var_field0 = ::sse_decode(deserializer); + return crate::api::api::LoginState::NeedsSMS2FAVerification(var_field0); + } + 5 => { + let mut var_field0 = ::sse_decode(deserializer); + return crate::api::api::LoginState::NeedsExtraStep(var_field0); + } + 6 => { + return crate::api::api::LoginState::NeedsLogin; + } + _ => { + unimplemented!(""); + } + } } } -impl SseDecode for Arc { +impl SseDecode for crate::api::api::LPIconMetadata { // Codec=Sse (Serialization based), see doc to use other codecs fn sse_decode(deserializer: &mut flutter_rust_bridge::for_generated::SseDeserializer) -> Self { - let mut inner = >, - >>::sse_decode(deserializer); - return flutter_rust_bridge::for_generated::rust_auto_opaque_decode_owned(inner); + let mut var_url = ::sse_decode(deserializer); + let mut var_version = ::sse_decode(deserializer); + return crate::api::api::LPIconMetadata { + url: var_url, + version: var_version, + }; } } -impl SseDecode for Arc> { +impl SseDecode for crate::api::api::LPImageMetadata { // Codec=Sse (Serialization based), see doc to use other codecs fn sse_decode(deserializer: &mut flutter_rust_bridge::for_generated::SseDeserializer) -> Self { - let mut inner = >, - >, - >>::sse_decode(deserializer); - return flutter_rust_bridge::for_generated::rust_auto_opaque_decode_owned(inner); + let mut var_size = ::sse_decode(deserializer); + let mut var_url = ::sse_decode(deserializer); + let mut var_version = ::sse_decode(deserializer); + return crate::api::api::LPImageMetadata { + size: var_size, + url: var_url, + version: var_version, + }; } } -impl SseDecode for Arc> { +impl SseDecode for crate::api::api::LPLinkMetadata { // Codec=Sse (Serialization based), see doc to use other codecs fn sse_decode(deserializer: &mut flutter_rust_bridge::for_generated::SseDeserializer) -> Self { - let mut inner = >, - >, - >>::sse_decode(deserializer); - return flutter_rust_bridge::for_generated::rust_auto_opaque_decode_owned(inner); + let mut var_imageMetadata = + >::sse_decode(deserializer); + let mut var_version = ::sse_decode(deserializer); + let mut var_iconMetadata = + >::sse_decode(deserializer); + let mut var_originalUrl = >::sse_decode(deserializer); + let mut var_url = >::sse_decode(deserializer); + let mut var_title = >::sse_decode(deserializer); + let mut var_summary = >::sse_decode(deserializer); + let mut var_image = + >::sse_decode(deserializer); + let mut var_icon = + >::sse_decode(deserializer); + let mut var_images = >>::sse_decode(deserializer); + let mut var_icons = >>::sse_decode(deserializer); + let mut var_isIncomplete = >::sse_decode(deserializer); + let mut var_usesActivityPub = >::sse_decode(deserializer); + let mut var_isEncodedForLocalUse = >::sse_decode(deserializer); + let mut var_collaborationType = >::sse_decode(deserializer); + let mut var_specialization2 = + >::sse_decode(deserializer); + return crate::api::api::LPLinkMetadata { + image_metadata: var_imageMetadata, + version: var_version, + icon_metadata: var_iconMetadata, + original_url: var_originalUrl, + url: var_url, + title: var_title, + summary: var_summary, + image: var_image, + icon: var_icon, + images: var_images, + icons: var_icons, + is_incomplete: var_isIncomplete, + uses_activity_pub: var_usesActivityPub, + is_encoded_for_local_use: var_isEncodedForLocalUse, + collaboration_type: var_collaborationType, + specialization2: var_specialization2, + }; } } -impl SseDecode for Asset { +impl SseDecode for crate::api::api::LPSpecializationMetadata { // Codec=Sse (Serialization based), see doc to use other codecs fn sse_decode(deserializer: &mut flutter_rust_bridge::for_generated::SseDeserializer) -> Self { - let mut inner = , - >>::sse_decode(deserializer); - return flutter_rust_bridge::for_generated::rust_auto_opaque_decode_owned(inner); + let mut tag_ = ::sse_decode(deserializer); + match tag_ { + 0 => { + let mut var_groupName = ::sse_decode(deserializer); + let mut var_urlParameters = ::sse_decode(deserializer); + return crate::api::api::LPSpecializationMetadata::LPPasswordsInviteMetadata { + group_name: var_groupName, + url_parameters: var_urlParameters, + }; + } + _ => { + unimplemented!(""); + } + } } } -impl SseDecode for ChannelInterestToken { +impl SseDecode for crate::api::api::MemojiData { // Codec=Sse (Serialization based), see doc to use other codecs fn sse_decode(deserializer: &mut flutter_rust_bridge::for_generated::SseDeserializer) -> Self { - let mut inner = , - >>::sse_decode(deserializer); - return flutter_rust_bridge::for_generated::rust_auto_opaque_decode_owned(inner); + let mut var_backgroundColorDescription = + ::sse_decode(deserializer); + let mut var_avatarRecordData = >::sse_decode(deserializer); + let mut var_avatarPoseData = >::sse_decode(deserializer); + let mut var_hasBody = ::sse_decode(deserializer); + let mut var_avatarImageData = >::sse_decode(deserializer); + return crate::api::api::MemojiData { + background_color_description: var_backgroundColorDescription, + avatar_record_data: var_avatarRecordData, + avatar_pose_data: var_avatarPoseData, + has_body: var_hasBody, + avatar_image_data: var_avatarImageData, + }; } } -impl SseDecode for CircleClientSession { +impl SseDecode for crate::api::api::Message { // Codec=Sse (Serialization based), see doc to use other codecs fn sse_decode(deserializer: &mut flutter_rust_bridge::for_generated::SseDeserializer) -> Self { - let mut inner = , - >, - >>::sse_decode(deserializer); - return flutter_rust_bridge::for_generated::rust_auto_opaque_decode_owned(inner); + let mut tag_ = ::sse_decode(deserializer); + match tag_ { + 0 => { + let mut var_field0 = ::sse_decode(deserializer); + return crate::api::api::Message::Message(var_field0); + } + 1 => { + let mut var_field0 = ::sse_decode(deserializer); + return crate::api::api::Message::RenameMessage(var_field0); + } + 2 => { + let mut var_field0 = + ::sse_decode(deserializer); + return crate::api::api::Message::ChangeParticipants(var_field0); + } + 3 => { + let mut var_field0 = ::sse_decode(deserializer); + return crate::api::api::Message::React(var_field0); + } + 4 => { + return crate::api::api::Message::Delivered; + } + 5 => { + return crate::api::api::Message::Read; + } + 6 => { + let mut var_field0 = ::sse_decode(deserializer); + let mut var_field1 = >::sse_decode(deserializer); + return crate::api::api::Message::Typing(var_field0, var_field1); + } + 7 => { + let mut var_field0 = ::sse_decode(deserializer); + return crate::api::api::Message::Unsend(var_field0); + } + 8 => { + let mut var_field0 = ::sse_decode(deserializer); + return crate::api::api::Message::Edit(var_field0); + } + 9 => { + let mut var_field0 = ::sse_decode(deserializer); + return crate::api::api::Message::IconChange(var_field0); + } + 10 => { + let mut var_field0 = ::sse_decode(deserializer); + return crate::api::api::Message::EnableSmsActivation(var_field0); + } + 11 => { + return crate::api::api::Message::MessageReadOnDevice; + } + 12 => { + let mut var_field0 = ::sse_decode(deserializer); + return crate::api::api::Message::SmsConfirmSent(var_field0); + } + 13 => { + return crate::api::api::Message::MarkUnread; + } + 14 => { + return crate::api::api::Message::PeerCacheInvalidate; + } + 15 => { + let mut var_field0 = + ::sse_decode(deserializer); + return crate::api::api::Message::UpdateExtension(var_field0); + } + 16 => { + let mut var_field0 = ::sse_decode(deserializer); + return crate::api::api::Message::Error(var_field0); + } + 17 => { + let mut var_field0 = + ::sse_decode(deserializer); + return crate::api::api::Message::MoveToRecycleBin(var_field0); + } + 18 => { + let mut var_field0 = ::sse_decode(deserializer); + return crate::api::api::Message::RecoverChat(var_field0); + } + 19 => { + let mut var_field0 = + ::sse_decode(deserializer); + return crate::api::api::Message::PermanentDelete(var_field0); + } + 20 => { + return crate::api::api::Message::Unschedule; + } + 21 => { + let mut var_field0 = + ::sse_decode(deserializer); + return crate::api::api::Message::UpdateProfile(var_field0); + } + 22 => { + let mut var_field0 = + ::sse_decode(deserializer); + return crate::api::api::Message::UpdateProfileSharing(var_field0); + } + 23 => { + let mut var_field0 = + ::sse_decode(deserializer); + return crate::api::api::Message::ShareProfile(var_field0); + } + 24 => { + return crate::api::api::Message::NotifyAnyways; + } + 25 => { + let mut var_field0 = + ::sse_decode(deserializer); + return crate::api::api::Message::SetTranscriptBackground(var_field0); + } + _ => { + unimplemented!(""); + } + } } } -impl SseDecode for ConversationLink { +impl SseDecode for crate::api::api::MessageEdit { // Codec=Sse (Serialization based), see doc to use other codecs fn sse_decode(deserializer: &mut flutter_rust_bridge::for_generated::SseDeserializer) -> Self { - let mut inner = , - >>::sse_decode(deserializer); - return flutter_rust_bridge::for_generated::rust_auto_opaque_decode_owned(inner); + let mut var_t = >::sse_decode(deserializer); + let mut var_d = ::sse_decode(deserializer); + let mut var_bcg = >::sse_decode(deserializer); + return crate::api::api::MessageEdit { + t: var_t, + d: var_d, + bcg: var_bcg, + }; } } -impl SseDecode for ConversationParticipant { +impl SseDecode for crate::api::api::MessageEditRange { // Codec=Sse (Serialization based), see doc to use other codecs fn sse_decode(deserializer: &mut flutter_rust_bridge::for_generated::SseDeserializer) -> Self { - let mut inner = , - >>::sse_decode(deserializer); - return flutter_rust_bridge::for_generated::rust_auto_opaque_decode_owned(inner); + let mut var_lo = ::sse_decode(deserializer); + let mut var_le = ::sse_decode(deserializer); + return crate::api::api::MessageEditRange { + lo: var_lo, + le: var_le, + }; } } -impl SseDecode for Date { +impl SseDecode for crate::api::api::MessageInst { // Codec=Sse (Serialization based), see doc to use other codecs fn sse_decode(deserializer: &mut flutter_rust_bridge::for_generated::SseDeserializer) -> Self { - let mut inner = , - >>::sse_decode(deserializer); - return flutter_rust_bridge::for_generated::rust_auto_opaque_decode_owned(inner); + let mut var_id = ::sse_decode(deserializer); + let mut var_sender = >::sse_decode(deserializer); + let mut var_conversation = + >::sse_decode(deserializer); + let mut var_message = ::sse_decode(deserializer); + let mut var_sentTimestamp = ::sse_decode(deserializer); + let mut var_target = + >>::sse_decode(deserializer); + let mut var_sendDelivered = ::sse_decode(deserializer); + let mut var_verificationFailed = ::sse_decode(deserializer); + let mut var_certifiedContext = + >::sse_decode(deserializer); + return crate::api::api::MessageInst { + id: var_id, + sender: var_sender, + conversation: var_conversation, + message: var_message, + sent_timestamp: var_sentTimestamp, + target: var_target, + send_delivered: var_sendDelivered, + verification_failed: var_verificationFailed, + certified_context: var_certifiedContext, + }; } } -impl SseDecode for EscrowData { +impl SseDecode for crate::api::api::MessagePart { // Codec=Sse (Serialization based), see doc to use other codecs fn sse_decode(deserializer: &mut flutter_rust_bridge::for_generated::SseDeserializer) -> Self { - let mut inner = , - >>::sse_decode(deserializer); - return flutter_rust_bridge::for_generated::rust_auto_opaque_decode_owned(inner); + let mut tag_ = ::sse_decode(deserializer); + match tag_ { + 0 => { + let mut var_field0 = ::sse_decode(deserializer); + let mut var_field1 = ::sse_decode(deserializer); + return crate::api::api::MessagePart::Text(var_field0, var_field1); + } + 1 => { + let mut var_field0 = ::sse_decode(deserializer); + return crate::api::api::MessagePart::Attachment(var_field0); + } + 2 => { + let mut var_field0 = ::sse_decode(deserializer); + let mut var_field1 = ::sse_decode(deserializer); + return crate::api::api::MessagePart::Mention(var_field0, var_field1); + } + 3 => { + let mut var_field0 = ::sse_decode(deserializer); + return crate::api::api::MessagePart::Object(var_field0); + } + _ => { + unimplemented!(""); + } + } } } -impl SseDecode for FindMyFriendsClient { +impl SseDecode for crate::api::api::MessageParts { // Codec=Sse (Serialization based), see doc to use other codecs fn sse_decode(deserializer: &mut flutter_rust_bridge::for_generated::SseDeserializer) -> Self { - let mut inner = , - >, - >>::sse_decode(deserializer); - return flutter_rust_bridge::for_generated::rust_auto_opaque_decode_owned(inner); + let mut var_field0 = >::sse_decode(deserializer); + return crate::api::api::MessageParts(var_field0); } } -impl SseDecode for FindMyPhoneClient { +impl SseDecode for crate::api::api::MessageProto { // Codec=Sse (Serialization based), see doc to use other codecs fn sse_decode(deserializer: &mut flutter_rust_bridge::for_generated::SseDeserializer) -> Self { - let mut inner = , - >, - >>::sse_decode(deserializer); - return flutter_rust_bridge::for_generated::rust_auto_opaque_decode_owned(inner); + let mut var_unk1 = ::sse_decode(deserializer); + let mut var_subject = >::sse_decode(deserializer); + let mut var_text = >::sse_decode(deserializer); + let mut var_attributedBody = >>::sse_decode(deserializer); + let mut var_balloonBundleId = >::sse_decode(deserializer); + let mut var_payloadData = >>::sse_decode(deserializer); + let mut var_messageSummaryInfo = >>::sse_decode(deserializer); + let mut var_effect = >::sse_decode(deserializer); + let mut var_dateRead = >::sse_decode(deserializer); + let mut var_unk10 = >::sse_decode(deserializer); + let mut var_unk11 = >::sse_decode(deserializer); + let mut var_dateDelivered = >::sse_decode(deserializer); + let mut var_unk14 = >::sse_decode(deserializer); + let mut var_associatedMessageType = >::sse_decode(deserializer); + let mut var_associatedMessageGuid = >::sse_decode(deserializer); + let mut var_associatedMessageRangeLocation = >::sse_decode(deserializer); + let mut var_associatedMessageRangeLength = >::sse_decode(deserializer); + return crate::api::api::MessageProto { + unk1: var_unk1, + subject: var_subject, + text: var_text, + attributed_body: var_attributedBody, + balloon_bundle_id: var_balloonBundleId, + payload_data: var_payloadData, + message_summary_info: var_messageSummaryInfo, + effect: var_effect, + date_read: var_dateRead, + unk10: var_unk10, + unk11: var_unk11, + date_delivered: var_dateDelivered, + unk14: var_unk14, + associated_message_type: var_associatedMessageType, + associated_message_guid: var_associatedMessageGuid, + associated_message_range_location: var_associatedMessageRangeLocation, + associated_message_range_length: var_associatedMessageRangeLength, + }; } } -impl SseDecode for GZipWrapper { +impl SseDecode for crate::api::api::MessageProto2 { // Codec=Sse (Serialization based), see doc to use other codecs fn sse_decode(deserializer: &mut flutter_rust_bridge::for_generated::SseDeserializer) -> Self { - let mut inner = >, - >>::sse_decode(deserializer); - return flutter_rust_bridge::for_generated::rust_auto_opaque_decode_owned(inner); + let mut var_reply = >::sse_decode(deserializer); + return crate::api::api::MessageProto2 { reply: var_reply }; } } -impl SseDecode for GZipWrapper { +impl SseDecode for crate::api::api::MessageProto3 { // Codec=Sse (Serialization based), see doc to use other codecs fn sse_decode(deserializer: &mut flutter_rust_bridge::for_generated::SseDeserializer) -> Self { - let mut inner = >, - >>::sse_decode(deserializer); - return flutter_rust_bridge::for_generated::rust_auto_opaque_decode_owned(inner); + let mut var_unk2 = >::sse_decode(deserializer); + let mut var_unk3 = >::sse_decode(deserializer); + return crate::api::api::MessageProto3 { + unk2: var_unk2, + unk3: var_unk3, + }; } } -impl SseDecode for GZipWrapper { +impl SseDecode for crate::api::api::MessageProto4 { // Codec=Sse (Serialization based), see doc to use other codecs fn sse_decode(deserializer: &mut flutter_rust_bridge::for_generated::SseDeserializer) -> Self { - let mut inner = >, - >>::sse_decode(deserializer); - return flutter_rust_bridge::for_generated::rust_auto_opaque_decode_owned(inner); + let mut var_associatedMessageEmoji = >::sse_decode(deserializer); + let mut var_service = >::sse_decode(deserializer); + let mut var_scheduleType = >::sse_decode(deserializer); + let mut var_scheduleState = >::sse_decode(deserializer); + let mut var_groupId = >::sse_decode(deserializer); + let mut var_sentOrReceivedOffGrid = >::sse_decode(deserializer); + return crate::api::api::MessageProto4 { + associated_message_emoji: var_associatedMessageEmoji, + service: var_service, + schedule_type: var_scheduleType, + schedule_state: var_scheduleState, + group_id: var_groupId, + sent_or_received_off_grid: var_sentOrReceivedOffGrid, + }; } } -impl SseDecode for GZipWrapper { +impl SseDecode for crate::api::api::MessageSummaryInfo { // Codec=Sse (Serialization based), see doc to use other codecs fn sse_decode(deserializer: &mut flutter_rust_bridge::for_generated::SseDeserializer) -> Self { - let mut inner = >, - >>::sse_decode(deserializer); - return flutter_rust_bridge::for_generated::rust_auto_opaque_decode_owned(inner); + let mut var_ams = >::sse_decode(deserializer); + let mut var_ampt = >>::sse_decode(deserializer); + let mut var_amc = >::sse_decode(deserializer); + let mut var_amb = >::sse_decode(deserializer); + let mut var_amd = >::sse_decode(deserializer); + let mut var_ec = + >>::sse_decode( + deserializer, + ); + let mut var_ep = >::sse_decode(deserializer); + let mut var_otr = + >::sse_decode( + deserializer, + ); + let mut var_ust = >::sse_decode(deserializer); + let mut var_rp = >::sse_decode(deserializer); + let mut var_hbr = >::sse_decode(deserializer); + let mut var_oui = >::sse_decode(deserializer); + let mut var_osn = >::sse_decode(deserializer); + let mut var_euh = >::sse_decode(deserializer); + return crate::api::api::MessageSummaryInfo { + ams: var_ams, + ampt: var_ampt, + amc: var_amc, + amb: var_amb, + amd: var_amd, + ec: var_ec, + ep: var_ep, + otr: var_otr, + ust: var_ust, + rp: var_rp, + hbr: var_hbr, + oui: var_oui, + osn: var_osn, + euh: var_euh, + }; } } -impl SseDecode for GZipWrapper { +impl SseDecode for crate::api::api::MessageTarget { // Codec=Sse (Serialization based), see doc to use other codecs fn sse_decode(deserializer: &mut flutter_rust_bridge::for_generated::SseDeserializer) -> Self { - let mut inner = >, - >>::sse_decode(deserializer); - return flutter_rust_bridge::for_generated::rust_auto_opaque_decode_owned(inner); + let mut tag_ = ::sse_decode(deserializer); + match tag_ { + 0 => { + let mut var_field0 = >::sse_decode(deserializer); + return crate::api::api::MessageTarget::Token(var_field0); + } + 1 => { + let mut var_field0 = ::sse_decode(deserializer); + return crate::api::api::MessageTarget::Uuid(var_field0); + } + _ => { + unimplemented!(""); + } + } } } -impl SseDecode for GZipWrapper { +impl SseDecode for crate::api::api::MessageType { // Codec=Sse (Serialization based), see doc to use other codecs fn sse_decode(deserializer: &mut flutter_rust_bridge::for_generated::SseDeserializer) -> Self { - let mut inner = >, - >>::sse_decode(deserializer); - return flutter_rust_bridge::for_generated::rust_auto_opaque_decode_owned(inner); + let mut tag_ = ::sse_decode(deserializer); + match tag_ { + 0 => { + return crate::api::api::MessageType::IMessage; + } + 1 => { + let mut var_isPhone = ::sse_decode(deserializer); + let mut var_usingNumber = ::sse_decode(deserializer); + let mut var_fromHandle = >::sse_decode(deserializer); + return crate::api::api::MessageType::SMS { + is_phone: var_isPhone, + using_number: var_usingNumber, + from_handle: var_fromHandle, + }; + } + _ => { + unimplemented!(""); + } + } } } -impl SseDecode for IDSNGMIdentity { +impl SseDecode for crate::api::api::MMCSAttachmentMeta { // Codec=Sse (Serialization based), see doc to use other codecs fn sse_decode(deserializer: &mut flutter_rust_bridge::for_generated::SseDeserializer) -> Self { - let mut inner = , - >>::sse_decode(deserializer); - return flutter_rust_bridge::for_generated::rust_auto_opaque_decode_owned(inner); + let mut var_mmcsSignatureHex = >::sse_decode(deserializer); + let mut var_mmcsOwner = >::sse_decode(deserializer); + let mut var_mmcsUrl = >::sse_decode(deserializer); + let mut var_decryptionKey = >::sse_decode(deserializer); + let mut var_inlineAttachment = >::sse_decode(deserializer); + let mut var_messagePart = >::sse_decode(deserializer); + let mut var_fileSize = >::sse_decode(deserializer); + let mut var_utiType = >::sse_decode(deserializer); + let mut var_mimeType = >::sse_decode(deserializer); + let mut var_name = >::sse_decode(deserializer); + return crate::api::api::MMCSAttachmentMeta { + mmcs_signature_hex: var_mmcsSignatureHex, + mmcs_owner: var_mmcsOwner, + mmcs_url: var_mmcsUrl, + decryption_key: var_decryptionKey, + inline_attachment: var_inlineAttachment, + message_part: var_messagePart, + file_size: var_fileSize, + uti_type: var_utiType, + mime_type: var_mimeType, + name: var_name, + }; } } -impl SseDecode for IDSUser { +impl SseDecode for crate::api::api::MMCSFile { // Codec=Sse (Serialization based), see doc to use other codecs fn sse_decode(deserializer: &mut flutter_rust_bridge::for_generated::SseDeserializer) -> Self { - let mut inner = , - >>::sse_decode(deserializer); - return flutter_rust_bridge::for_generated::rust_auto_opaque_decode_owned(inner); + let mut var_signature = >::sse_decode(deserializer); + let mut var_object = ::sse_decode(deserializer); + let mut var_url = ::sse_decode(deserializer); + let mut var_key = >::sse_decode(deserializer); + let mut var_size = ::sse_decode(deserializer); + return crate::api::api::MMCSFile { + signature: var_signature, + object: var_object, + url: var_url, + key: var_key, + size: var_size, + }; } } -impl SseDecode for JoinedOSConfig { +impl SseDecode for crate::api::api::MMCSTransferProgress { // Codec=Sse (Serialization based), see doc to use other codecs fn sse_decode(deserializer: &mut flutter_rust_bridge::for_generated::SseDeserializer) -> Self { - let mut inner = , - >>::sse_decode(deserializer); - return flutter_rust_bridge::for_generated::rust_auto_opaque_decode_owned(inner); + let mut var_prog = ::sse_decode(deserializer); + let mut var_total = ::sse_decode(deserializer); + let mut var_file = >::sse_decode(deserializer); + return crate::api::api::MMCSTransferProgress { + prog: var_prog, + total: var_total, + file: var_file, + }; } } -impl SseDecode for LocationReport { +impl SseDecode for crate::api::api::MonogramData { // Codec=Sse (Serialization based), see doc to use other codecs fn sse_decode(deserializer: &mut flutter_rust_bridge::for_generated::SseDeserializer) -> Self { - let mut inner = , - >>::sse_decode(deserializer); - return flutter_rust_bridge::for_generated::rust_auto_opaque_decode_owned(inner); + let mut var_topBackgroundColorDescription = + ::sse_decode(deserializer); + let mut var_backgroundColorDescription = + ::sse_decode(deserializer); + let mut var_initials = ::sse_decode(deserializer); + let mut var_monogramSupportedForName = ::sse_decode(deserializer); + return crate::api::api::MonogramData { + top_background_color_description: var_topBackgroundColorDescription, + background_color_description: var_backgroundColorDescription, + initials: var_initials, + monogram_supported_for_name: var_monogramSupportedForName, + }; } } -impl SseDecode for MessageFlags { +impl SseDecode for crate::api::api::MoveToRecycleBinMessage { // Codec=Sse (Serialization based), see doc to use other codecs fn sse_decode(deserializer: &mut flutter_rust_bridge::for_generated::SseDeserializer) -> Self { - let mut inner = , - >>::sse_decode(deserializer); - return flutter_rust_bridge::for_generated::rust_auto_opaque_decode_owned(inner); + let mut var_target = ::sse_decode(deserializer); + let mut var_recoverableDeleteDate = ::sse_decode(deserializer); + return crate::api::api::MoveToRecycleBinMessage { + target: var_target, + recoverable_delete_date: var_recoverableDeleteDate, + }; } } -impl SseDecode for NSArray { +impl SseDecode for crate::api::api::MyAsyncRuntime { // Codec=Sse (Serialization based), see doc to use other codecs fn sse_decode(deserializer: &mut flutter_rust_bridge::for_generated::SseDeserializer) -> Self { - let mut inner = >, - >>::sse_decode(deserializer); - return flutter_rust_bridge::for_generated::rust_auto_opaque_decode_owned(inner); + return crate::api::api::MyAsyncRuntime(); } } -impl SseDecode for NSArray { +impl SseDecode for crate::api::api::NormalMessage { // Codec=Sse (Serialization based), see doc to use other codecs fn sse_decode(deserializer: &mut flutter_rust_bridge::for_generated::SseDeserializer) -> Self { - let mut inner = >, - >>::sse_decode(deserializer); - return flutter_rust_bridge::for_generated::rust_auto_opaque_decode_owned(inner); + let mut var_parts = ::sse_decode(deserializer); + let mut var_effect = >::sse_decode(deserializer); + let mut var_replyGuid = >::sse_decode(deserializer); + let mut var_replyPart = >::sse_decode(deserializer); + let mut var_service = ::sse_decode(deserializer); + let mut var_subject = >::sse_decode(deserializer); + let mut var_app = >::sse_decode(deserializer); + let mut var_linkMeta = >::sse_decode(deserializer); + let mut var_voice = ::sse_decode(deserializer); + let mut var_scheduled = >::sse_decode(deserializer); + let mut var_embeddedProfile = + >::sse_decode(deserializer); + return crate::api::api::NormalMessage { + parts: var_parts, + effect: var_effect, + reply_guid: var_replyGuid, + reply_part: var_replyPart, + service: var_service, + subject: var_subject, + app: var_app, + link_meta: var_linkMeta, + voice: var_voice, + scheduled: var_scheduled, + embedded_profile: var_embeddedProfile, + }; } } -impl SseDecode for PushError { +impl SseDecode for crate::api::api::NSAttributedString { // Codec=Sse (Serialization based), see doc to use other codecs fn sse_decode(deserializer: &mut flutter_rust_bridge::for_generated::SseDeserializer) -> Self { - let mut inner = , - >>::sse_decode(deserializer); - return flutter_rust_bridge::for_generated::rust_auto_opaque_decode_owned(inner); + let mut var_text = ::sse_decode(deserializer); + let mut var_ranges = + >::sse_decode(deserializer); + return crate::api::api::NSAttributedString { + text: var_text, + ranges: var_ranges, + }; } } -impl SseDecode for Receiver { +impl SseDecode for crate::api::api::NSDictionaryClass { // Codec=Sse (Serialization based), see doc to use other codecs fn sse_decode(deserializer: &mut flutter_rust_bridge::for_generated::SseDeserializer) -> Self { - let mut inner = >, - >>::sse_decode(deserializer); - return flutter_rust_bridge::for_generated::rust_auto_opaque_decode_owned(inner); + let mut inner = ::sse_decode(deserializer); + return match inner { + 0 => crate::api::api::NSDictionaryClass::NSDictionary, + 1 => crate::api::api::NSDictionaryClass::NSMutableDictionary, + _ => unreachable!("Invalid variant for NSDictionaryClass: {}", inner), + }; } } -impl SseDecode for SavedHardwareState { +impl SseDecode for crate::api::api::NSDictionaryTypedCoder { // Codec=Sse (Serialization based), see doc to use other codecs fn sse_decode(deserializer: &mut flutter_rust_bridge::for_generated::SseDeserializer) -> Self { - let mut inner = , - >>::sse_decode(deserializer); - return flutter_rust_bridge::for_generated::rust_auto_opaque_decode_owned(inner); + let mut var_field0 = + >::sse_decode(deserializer); + return crate::api::api::NSDictionaryTypedCoder(var_field0); } } -impl SseDecode for Sender<()> { +impl SseDecode for crate::api::api::NSNumber { // Codec=Sse (Serialization based), see doc to use other codecs fn sse_decode(deserializer: &mut flutter_rust_bridge::for_generated::SseDeserializer) -> Self { - let mut inner = >, - >>::sse_decode(deserializer); - return flutter_rust_bridge::for_generated::rust_auto_opaque_decode_owned(inner); + let mut var_field0 = ::sse_decode(deserializer); + return crate::api::api::NSNumber(var_field0); } } -impl SseDecode for StCollapsedValue { +impl SseDecode for crate::api::api::NSString { // Codec=Sse (Serialization based), see doc to use other codecs fn sse_decode(deserializer: &mut flutter_rust_bridge::for_generated::SseDeserializer) -> Self { - let mut inner = , - >>::sse_decode(deserializer); - return flutter_rust_bridge::for_generated::rust_auto_opaque_decode_owned(inner); + let mut var_field0 = ::sse_decode(deserializer); + return crate::api::api::NSString(var_field0); } } -impl SseDecode for SyncManager { +impl SseDecode for crate::api::api::NSURL { // Codec=Sse (Serialization based), see doc to use other codecs fn sse_decode(deserializer: &mut flutter_rust_bridge::for_generated::SseDeserializer) -> Self { - let mut inner = , - >, - >>::sse_decode(deserializer); - return flutter_rust_bridge::for_generated::rust_auto_opaque_decode_owned(inner); + let mut var_base = ::sse_decode(deserializer); + let mut var_relative = ::sse_decode(deserializer); + return crate::api::api::NSURL { + base: var_base, + relative: var_relative, + }; } } -impl SseDecode for SystemTime { +impl SseDecode for crate::api::api::NumOrString { // Codec=Sse (Serialization based), see doc to use other codecs fn sse_decode(deserializer: &mut flutter_rust_bridge::for_generated::SseDeserializer) -> Self { - let mut inner = , - >>::sse_decode(deserializer); - return flutter_rust_bridge::for_generated::rust_auto_opaque_decode_owned(inner); + let mut tag_ = ::sse_decode(deserializer); + match tag_ { + 0 => { + let mut var_field0 = ::sse_decode(deserializer); + return crate::api::api::NumOrString::Num(var_field0); + } + 1 => { + let mut var_field0 = ::sse_decode(deserializer); + return crate::api::api::NumOrString::String(var_field0); + } + 2 => { + let mut var_field0 = ::sse_decode(deserializer); + return crate::api::api::NumOrString::Bool(var_field0); + } + _ => { + unimplemented!(""); + } + } } } -impl SseDecode for VerifyBody { +impl SseDecode for crate::api::api::OperatedChat { // Codec=Sse (Serialization based), see doc to use other codecs fn sse_decode(deserializer: &mut flutter_rust_bridge::for_generated::SseDeserializer) -> Self { - let mut inner = , - >>::sse_decode(deserializer); - return flutter_rust_bridge::for_generated::rust_auto_opaque_decode_owned(inner); + let mut var_participants = >::sse_decode(deserializer); + let mut var_groupId = ::sse_decode(deserializer); + let mut var_guid = ::sse_decode(deserializer); + let mut var_deleteIncomingMessages = >::sse_decode(deserializer); + let mut var_wasReportedAsJunk = >::sse_decode(deserializer); + return crate::api::api::OperatedChat { + participants: var_participants, + group_id: var_groupId, + guid: var_guid, + delete_incoming_messages: var_deleteIncomingMessages, + was_reported_as_junk: var_wasReportedAsJunk, + }; } } -impl SseDecode for ViableBottle { +impl SseDecode for Option { // Codec=Sse (Serialization based), see doc to use other codecs fn sse_decode(deserializer: &mut flutter_rust_bridge::for_generated::SseDeserializer) -> Self { - let mut inner = , - >>::sse_decode(deserializer); - return flutter_rust_bridge::for_generated::rust_auto_opaque_decode_owned(inner); + if (::sse_decode(deserializer)) { + return Some(::sse_decode(deserializer)); + } else { + return None; + } } } -impl SseDecode for flutter_rust_bridge::DartOpaque { +impl SseDecode for Option { // Codec=Sse (Serialization based), see doc to use other codecs fn sse_decode(deserializer: &mut flutter_rust_bridge::for_generated::SseDeserializer) -> Self { - let mut inner = ::sse_decode(deserializer); - return unsafe { flutter_rust_bridge::for_generated::sse_decode_dart_opaque(inner) }; + if (::sse_decode(deserializer)) { + return Some(::sse_decode(deserializer)); + } else { + return None; + } } } -impl SseDecode for std::collections::HashMap { +impl SseDecode for Option { // Codec=Sse (Serialization based), see doc to use other codecs fn sse_decode(deserializer: &mut flutter_rust_bridge::for_generated::SseDeserializer) -> Self { - let mut inner = >::sse_decode(deserializer); - return inner.into_iter().collect(); + if (::sse_decode(deserializer)) { + return Some(::sse_decode(deserializer)); + } else { + return None; + } } } -impl SseDecode for std::collections::HashMap { +impl SseDecode for Option { // Codec=Sse (Serialization based), see doc to use other codecs fn sse_decode(deserializer: &mut flutter_rust_bridge::for_generated::SseDeserializer) -> Self { - let mut inner = >::sse_decode(deserializer); - return inner.into_iter().collect(); + if (::sse_decode(deserializer)) { + return Some(::sse_decode(deserializer)); + } else { + return None; + } } } -impl SseDecode for std::collections::HashMap { +impl SseDecode for Option { // Codec=Sse (Serialization based), see doc to use other codecs fn sse_decode(deserializer: &mut flutter_rust_bridge::for_generated::SseDeserializer) -> Self { - let mut inner = >::sse_decode(deserializer); - return inner.into_iter().collect(); + if (::sse_decode(deserializer)) { + return Some(::sse_decode(deserializer)); + } else { + return None; + } } } -impl SseDecode for std::collections::HashMap { +impl SseDecode for Option>> { // Codec=Sse (Serialization based), see doc to use other codecs fn sse_decode(deserializer: &mut flutter_rust_bridge::for_generated::SseDeserializer) -> Self { - let mut inner = >::sse_decode(deserializer); - return inner.into_iter().collect(); + if (::sse_decode(deserializer)) { + return Some(>>::sse_decode( + deserializer, + )); + } else { + return None; + } } } -impl SseDecode for std::collections::HashMap { +impl SseDecode for Option>> { // Codec=Sse (Serialization based), see doc to use other codecs fn sse_decode(deserializer: &mut flutter_rust_bridge::for_generated::SseDeserializer) -> Self { - let mut inner = >::sse_decode(deserializer); - return inner.into_iter().collect(); + if (::sse_decode(deserializer)) { + return Some( + >>::sse_decode(deserializer), + ); + } else { + return None; + } } } -impl SseDecode for std::collections::HashMap { +impl SseDecode for Option>> { // Codec=Sse (Serialization based), see doc to use other codecs fn sse_decode(deserializer: &mut flutter_rust_bridge::for_generated::SseDeserializer) -> Self { - let mut inner = >::sse_decode(deserializer); - return inner.into_iter().collect(); + if (::sse_decode(deserializer)) { + return Some(>>::sse_decode( + deserializer, + )); + } else { + return None; + } } } -impl SseDecode for std::collections::HashMap { +impl SseDecode for Option>> { // Codec=Sse (Serialization based), see doc to use other codecs fn sse_decode(deserializer: &mut flutter_rust_bridge::for_generated::SseDeserializer) -> Self { - let mut inner = >::sse_decode(deserializer); - return inner.into_iter().collect(); + if (::sse_decode(deserializer)) { + return Some(>>::sse_decode( + deserializer, + )); + } else { + return None; + } } } -impl SseDecode for std::collections::HashMap { +impl SseDecode for Option>>> { // Codec=Sse (Serialization based), see doc to use other codecs fn sse_decode(deserializer: &mut flutter_rust_bridge::for_generated::SseDeserializer) -> Self { - let mut inner = >::sse_decode(deserializer); - return inner.into_iter().collect(); + if (::sse_decode(deserializer)) { + return Some( + >>>::sse_decode(deserializer), + ); + } else { + return None; + } } } -impl SseDecode for std::collections::HashMap { +impl SseDecode for Option>> { // Codec=Sse (Serialization based), see doc to use other codecs fn sse_decode(deserializer: &mut flutter_rust_bridge::for_generated::SseDeserializer) -> Self { - let mut inner = >::sse_decode(deserializer); - return inner.into_iter().collect(); + if (::sse_decode(deserializer)) { + return Some(>>::sse_decode( + deserializer, + )); + } else { + return None; + } } } -impl SseDecode for std::collections::HashMap { +impl SseDecode for Option { // Codec=Sse (Serialization based), see doc to use other codecs fn sse_decode(deserializer: &mut flutter_rust_bridge::for_generated::SseDeserializer) -> Self { - let mut inner = >::sse_decode(deserializer); - return inner.into_iter().collect(); + if (::sse_decode(deserializer)) { + return Some(::sse_decode(deserializer)); + } else { + return None; + } } } -impl SseDecode for std::collections::HashMap> { +impl SseDecode for Option { // Codec=Sse (Serialization based), see doc to use other codecs fn sse_decode(deserializer: &mut flutter_rust_bridge::for_generated::SseDeserializer) -> Self { - let mut inner = - )>>::sse_decode(deserializer); - return inner.into_iter().collect(); + if (::sse_decode(deserializer)) { + return Some(::sse_decode(deserializer)); + } else { + return None; + } } } -impl SseDecode for std::collections::HashMap> { +impl SseDecode for Option> { // Codec=Sse (Serialization based), see doc to use other codecs fn sse_decode(deserializer: &mut flutter_rust_bridge::for_generated::SseDeserializer) -> Self { - let mut inner = )>>::sse_decode(deserializer); - return inner.into_iter().collect(); + if (::sse_decode(deserializer)) { + return Some(>::sse_decode( + deserializer, + )); + } else { + return None; + } } } -impl SseDecode for std::collections::HashMap { +impl SseDecode for Option { // Codec=Sse (Serialization based), see doc to use other codecs fn sse_decode(deserializer: &mut flutter_rust_bridge::for_generated::SseDeserializer) -> Self { - let mut inner = - >::sse_decode(deserializer); - return inner.into_iter().collect(); + if (::sse_decode(deserializer)) { + return Some(::sse_decode( + deserializer, + )); + } else { + return None; + } } } -impl SseDecode for std::collections::HashMap> { +impl SseDecode for Option { // Codec=Sse (Serialization based), see doc to use other codecs fn sse_decode(deserializer: &mut flutter_rust_bridge::for_generated::SseDeserializer) -> Self { - let mut inner = - )>>::sse_decode(deserializer); - return inner.into_iter().collect(); + if (::sse_decode(deserializer)) { + return Some(::sse_decode(deserializer)); + } else { + return None; + } } } -impl SseDecode for std::collections::HashMap> { +impl SseDecode for Option { // Codec=Sse (Serialization based), see doc to use other codecs fn sse_decode(deserializer: &mut flutter_rust_bridge::for_generated::SseDeserializer) -> Self { - let mut inner = - )>>::sse_decode(deserializer); - return inner.into_iter().collect(); + if (::sse_decode(deserializer)) { + return Some(::sse_decode(deserializer)); + } else { + return None; + } } } -impl SseDecode for std::collections::HashMap> { +impl SseDecode for Option { // Codec=Sse (Serialization based), see doc to use other codecs fn sse_decode(deserializer: &mut flutter_rust_bridge::for_generated::SseDeserializer) -> Self { - let mut inner = - )>>::sse_decode(deserializer); - return inner.into_iter().collect(); + if (::sse_decode(deserializer)) { + return Some(::sse_decode(deserializer)); + } else { + return None; + } } } -impl SseDecode for std::collections::HashMap { +impl SseDecode for Option> { // Codec=Sse (Serialization based), see doc to use other codecs fn sse_decode(deserializer: &mut flutter_rust_bridge::for_generated::SseDeserializer) -> Self { - let mut inner = - >::sse_decode(deserializer); - return inner.into_iter().collect(); + if (::sse_decode(deserializer)) { + return Some(>::sse_decode(deserializer)); + } else { + return None; + } } } -impl SseDecode for std::collections::HashMap, crate::api::api::Passkey)> { +impl SseDecode for Option> { // Codec=Sse (Serialization based), see doc to use other codecs fn sse_decode(deserializer: &mut flutter_rust_bridge::for_generated::SseDeserializer) -> Self { - let mut inner = - , crate::api::api::Passkey))>>::sse_decode(deserializer); - return inner.into_iter().collect(); + if (::sse_decode(deserializer)) { + return Some(>::sse_decode(deserializer)); + } else { + return None; + } } } -impl SseDecode - for std::collections::HashMap, crate::api::api::PasswordManagerMeta)> -{ +impl SseDecode for Option> { // Codec=Sse (Serialization based), see doc to use other codecs fn sse_decode(deserializer: &mut flutter_rust_bridge::for_generated::SseDeserializer) -> Self { - let mut inner = , crate::api::api::PasswordManagerMeta), - )>>::sse_decode(deserializer); - return inner.into_iter().collect(); + if (::sse_decode(deserializer)) { + return Some(>::sse_decode(deserializer)); + } else { + return None; + } } } -impl SseDecode - for std::collections::HashMap, crate::api::api::PasswordRawEntry)> -{ +impl SseDecode for Option> { // Codec=Sse (Serialization based), see doc to use other codecs fn sse_decode(deserializer: &mut flutter_rust_bridge::for_generated::SseDeserializer) -> Self { - let mut inner = - , crate::api::api::PasswordRawEntry))>>::sse_decode( - deserializer, - ); - return inner.into_iter().collect(); + if (::sse_decode(deserializer)) { + return Some(>::sse_decode(deserializer)); + } else { + return None; + } } } -impl SseDecode - for std::collections::HashMap, crate::api::api::WifiPassword)> -{ +impl SseDecode for Option { // Codec=Sse (Serialization based), see doc to use other codecs fn sse_decode(deserializer: &mut flutter_rust_bridge::for_generated::SseDeserializer) -> Self { - let mut inner = - , crate::api::api::WifiPassword))>>::sse_decode( - deserializer, - ); - return inner.into_iter().collect(); + if (::sse_decode(deserializer)) { + return Some(::sse_decode(deserializer)); + } else { + return None; + } } } -impl SseDecode for std::collections::HashMap { +impl SseDecode for Option { // Codec=Sse (Serialization based), see doc to use other codecs fn sse_decode(deserializer: &mut flutter_rust_bridge::for_generated::SseDeserializer) -> Self { - let mut inner = - >::sse_decode(deserializer); - return inner.into_iter().collect(); + if (::sse_decode(deserializer)) { + return Some(::sse_decode(deserializer)); + } else { + return None; + } } } -impl SseDecode for std::collections::HashMap { +impl SseDecode for Option> { // Codec=Sse (Serialization based), see doc to use other codecs fn sse_decode(deserializer: &mut flutter_rust_bridge::for_generated::SseDeserializer) -> Self { - let mut inner = - >::sse_decode(deserializer); - return inner.into_iter().collect(); + if (::sse_decode(deserializer)) { + return Some(>::sse_decode(deserializer)); + } else { + return None; + } } } -impl SseDecode for std::collections::HashMap { +impl SseDecode for Option> { // Codec=Sse (Serialization based), see doc to use other codecs fn sse_decode(deserializer: &mut flutter_rust_bridge::for_generated::SseDeserializer) -> Self { - let mut inner = >::sse_decode(deserializer); - return inner.into_iter().collect(); + if (::sse_decode(deserializer)) { + return Some(>::sse_decode(deserializer)); + } else { + return None; + } } } -impl SseDecode - for RustOpaqueMoi> -{ +impl SseDecode for Option { // Codec=Sse (Serialization based), see doc to use other codecs fn sse_decode(deserializer: &mut flutter_rust_bridge::for_generated::SseDeserializer) -> Self { - let mut inner = ::sse_decode(deserializer); - return decode_rust_opaque_moi(inner); + if (::sse_decode(deserializer)) { + return Some(::sse_decode(deserializer)); + } else { + return None; + } } } -impl SseDecode - for RustOpaqueMoi> -{ +impl SseDecode for Option { // Codec=Sse (Serialization based), see doc to use other codecs fn sse_decode(deserializer: &mut flutter_rust_bridge::for_generated::SseDeserializer) -> Self { - let mut inner = ::sse_decode(deserializer); - return decode_rust_opaque_moi(inner); + if (::sse_decode(deserializer)) { + return Some(::sse_decode(deserializer)); + } else { + return None; + } } } -impl SseDecode - for RustOpaqueMoi> -{ +impl SseDecode for Option> { // Codec=Sse (Serialization based), see doc to use other codecs fn sse_decode(deserializer: &mut flutter_rust_bridge::for_generated::SseDeserializer) -> Self { - let mut inner = ::sse_decode(deserializer); - return decode_rust_opaque_moi(inner); + if (::sse_decode(deserializer)) { + return Some( + >::sse_decode(deserializer), + ); + } else { + return None; + } } } -impl SseDecode - for RustOpaqueMoi< - flutter_rust_bridge::for_generated::RustAutoOpaqueInner< - ArcAnisetteClient, - >, - > -{ +impl SseDecode for Option { // Codec=Sse (Serialization based), see doc to use other codecs fn sse_decode(deserializer: &mut flutter_rust_bridge::for_generated::SseDeserializer) -> Self { - let mut inner = ::sse_decode(deserializer); - return decode_rust_opaque_moi(inner); + if (::sse_decode(deserializer)) { + return Some(::sse_decode(deserializer)); + } else { + return None; + } } } -impl SseDecode - for RustOpaqueMoi< - flutter_rust_bridge::for_generated::RustAutoOpaqueInner< - Arc>, - >, - > -{ +impl SseDecode for Option { // Codec=Sse (Serialization based), see doc to use other codecs fn sse_decode(deserializer: &mut flutter_rust_bridge::for_generated::SseDeserializer) -> Self { - let mut inner = ::sse_decode(deserializer); - return decode_rust_opaque_moi(inner); + if (::sse_decode(deserializer)) { + return Some(::sse_decode(deserializer)); + } else { + return None; + } } } -impl SseDecode - for RustOpaqueMoi< - flutter_rust_bridge::for_generated::RustAutoOpaqueInner< - Arc>, - >, - > -{ +impl SseDecode for Option { // Codec=Sse (Serialization based), see doc to use other codecs fn sse_decode(deserializer: &mut flutter_rust_bridge::for_generated::SseDeserializer) -> Self { - let mut inner = ::sse_decode(deserializer); - return decode_rust_opaque_moi(inner); + if (::sse_decode(deserializer)) { + return Some(::sse_decode(deserializer)); + } else { + return None; + } } } -impl SseDecode - for RustOpaqueMoi>> -{ +impl SseDecode for Option { // Codec=Sse (Serialization based), see doc to use other codecs fn sse_decode(deserializer: &mut flutter_rust_bridge::for_generated::SseDeserializer) -> Self { - let mut inner = ::sse_decode(deserializer); - return decode_rust_opaque_moi(inner); + if (::sse_decode(deserializer)) { + return Some(::sse_decode( + deserializer, + )); + } else { + return None; + } } } -impl SseDecode - for RustOpaqueMoi< - flutter_rust_bridge::for_generated::RustAutoOpaqueInner< - Arc>, - >, - > -{ +impl SseDecode for Option { // Codec=Sse (Serialization based), see doc to use other codecs fn sse_decode(deserializer: &mut flutter_rust_bridge::for_generated::SseDeserializer) -> Self { - let mut inner = ::sse_decode(deserializer); - return decode_rust_opaque_moi(inner); + if (::sse_decode(deserializer)) { + return Some(::sse_decode(deserializer)); + } else { + return None; + } } } -impl SseDecode - for RustOpaqueMoi>> -{ +impl SseDecode for Option { // Codec=Sse (Serialization based), see doc to use other codecs fn sse_decode(deserializer: &mut flutter_rust_bridge::for_generated::SseDeserializer) -> Self { - let mut inner = ::sse_decode(deserializer); - return decode_rust_opaque_moi(inner); + if (::sse_decode(deserializer)) { + return Some(::sse_decode(deserializer)); + } else { + return None; + } } } -impl SseDecode - for RustOpaqueMoi< - flutter_rust_bridge::for_generated::RustAutoOpaqueInner>, - > -{ +impl SseDecode for Option { // Codec=Sse (Serialization based), see doc to use other codecs fn sse_decode(deserializer: &mut flutter_rust_bridge::for_generated::SseDeserializer) -> Self { - let mut inner = ::sse_decode(deserializer); - return decode_rust_opaque_moi(inner); + if (::sse_decode(deserializer)) { + return Some(::sse_decode(deserializer)); + } else { + return None; + } } } -impl SseDecode - for RustOpaqueMoi< - flutter_rust_bridge::for_generated::RustAutoOpaqueInner< - Arc>, - >, - > -{ +impl SseDecode for Option { // Codec=Sse (Serialization based), see doc to use other codecs fn sse_decode(deserializer: &mut flutter_rust_bridge::for_generated::SseDeserializer) -> Self { - let mut inner = ::sse_decode(deserializer); - return decode_rust_opaque_moi(inner); + if (::sse_decode(deserializer)) { + return Some(::sse_decode( + deserializer, + )); + } else { + return None; + } } } -impl SseDecode - for RustOpaqueMoi< - flutter_rust_bridge::for_generated::RustAutoOpaqueInner< - Arc>>, - >, - > -{ +impl SseDecode for Option { // Codec=Sse (Serialization based), see doc to use other codecs fn sse_decode(deserializer: &mut flutter_rust_bridge::for_generated::SseDeserializer) -> Self { - let mut inner = ::sse_decode(deserializer); - return decode_rust_opaque_moi(inner); + if (::sse_decode(deserializer)) { + return Some(::sse_decode(deserializer)); + } else { + return None; + } } } -impl SseDecode - for RustOpaqueMoi< - flutter_rust_bridge::for_generated::RustAutoOpaqueInner< - Arc>>>, - >, - > -{ +impl SseDecode for Option { // Codec=Sse (Serialization based), see doc to use other codecs fn sse_decode(deserializer: &mut flutter_rust_bridge::for_generated::SseDeserializer) -> Self { - let mut inner = ::sse_decode(deserializer); - return decode_rust_opaque_moi(inner); + if (::sse_decode(deserializer)) { + return Some(::sse_decode(deserializer)); + } else { + return None; + } } } -impl SseDecode - for RustOpaqueMoi< - flutter_rust_bridge::for_generated::RustAutoOpaqueInner< - Arc>>, - >, - > -{ +impl SseDecode for Option { // Codec=Sse (Serialization based), see doc to use other codecs fn sse_decode(deserializer: &mut flutter_rust_bridge::for_generated::SseDeserializer) -> Self { - let mut inner = ::sse_decode(deserializer); - return decode_rust_opaque_moi(inner); + if (::sse_decode(deserializer)) { + return Some(::sse_decode(deserializer)); + } else { + return None; + } } } -impl SseDecode - for RustOpaqueMoi< - flutter_rust_bridge::for_generated::RustAutoOpaqueInner< - Arc>, - >, - > -{ +impl SseDecode for Option { // Codec=Sse (Serialization based), see doc to use other codecs fn sse_decode(deserializer: &mut flutter_rust_bridge::for_generated::SseDeserializer) -> Self { - let mut inner = ::sse_decode(deserializer); - return decode_rust_opaque_moi(inner); + if (::sse_decode(deserializer)) { + return Some(::sse_decode(deserializer)); + } else { + return None; + } } } -impl SseDecode - for RustOpaqueMoi< - flutter_rust_bridge::for_generated::RustAutoOpaqueInner< - Arc>, - >, - > -{ +impl SseDecode for Option { // Codec=Sse (Serialization based), see doc to use other codecs fn sse_decode(deserializer: &mut flutter_rust_bridge::for_generated::SseDeserializer) -> Self { - let mut inner = ::sse_decode(deserializer); - return decode_rust_opaque_moi(inner); + if (::sse_decode(deserializer)) { + return Some( + ::sse_decode(deserializer), + ); + } else { + return None; + } } } -impl SseDecode - for RustOpaqueMoi< - flutter_rust_bridge::for_generated::RustAutoOpaqueInner>>, - > -{ +impl SseDecode for Option { // Codec=Sse (Serialization based), see doc to use other codecs fn sse_decode(deserializer: &mut flutter_rust_bridge::for_generated::SseDeserializer) -> Self { - let mut inner = ::sse_decode(deserializer); - return decode_rust_opaque_moi(inner); + if (::sse_decode(deserializer)) { + return Some( + ::sse_decode(deserializer), + ); + } else { + return None; + } } } -impl SseDecode - for RustOpaqueMoi>> -{ +impl SseDecode for Option { // Codec=Sse (Serialization based), see doc to use other codecs fn sse_decode(deserializer: &mut flutter_rust_bridge::for_generated::SseDeserializer) -> Self { - let mut inner = ::sse_decode(deserializer); - return decode_rust_opaque_moi(inner); + if (::sse_decode(deserializer)) { + return Some(::sse_decode( + deserializer, + )); + } else { + return None; + } } } -impl SseDecode - for RustOpaqueMoi< - flutter_rust_bridge::for_generated::RustAutoOpaqueInner< - Arc>, - >, - > -{ +impl SseDecode for Option { // Codec=Sse (Serialization based), see doc to use other codecs fn sse_decode(deserializer: &mut flutter_rust_bridge::for_generated::SseDeserializer) -> Self { - let mut inner = ::sse_decode(deserializer); - return decode_rust_opaque_moi(inner); + if (::sse_decode(deserializer)) { + return Some(::sse_decode( + deserializer, + )); + } else { + return None; + } } } -impl SseDecode - for RustOpaqueMoi< - flutter_rust_bridge::for_generated::RustAutoOpaqueInner< - Arc>, - >, - > -{ +impl SseDecode for Option { // Codec=Sse (Serialization based), see doc to use other codecs fn sse_decode(deserializer: &mut flutter_rust_bridge::for_generated::SseDeserializer) -> Self { - let mut inner = ::sse_decode(deserializer); - return decode_rust_opaque_moi(inner); + if (::sse_decode(deserializer)) { + return Some( + ::sse_decode(deserializer), + ); + } else { + return None; + } } } -impl SseDecode for RustOpaqueMoi> { +impl SseDecode for Option { // Codec=Sse (Serialization based), see doc to use other codecs fn sse_decode(deserializer: &mut flutter_rust_bridge::for_generated::SseDeserializer) -> Self { - let mut inner = ::sse_decode(deserializer); - return decode_rust_opaque_moi(inner); + if (::sse_decode(deserializer)) { + return Some( + ::sse_decode(deserializer), + ); + } else { + return None; + } } } -impl SseDecode - for RustOpaqueMoi> -{ +impl SseDecode for Option { // Codec=Sse (Serialization based), see doc to use other codecs fn sse_decode(deserializer: &mut flutter_rust_bridge::for_generated::SseDeserializer) -> Self { - let mut inner = ::sse_decode(deserializer); - return decode_rust_opaque_moi(inner); + if (::sse_decode(deserializer)) { + return Some(::sse_decode( + deserializer, + )); + } else { + return None; + } } } -impl SseDecode - for RustOpaqueMoi< - flutter_rust_bridge::for_generated::RustAutoOpaqueInner< - CircleClientSession, - >, - > -{ +impl SseDecode for Option { // Codec=Sse (Serialization based), see doc to use other codecs fn sse_decode(deserializer: &mut flutter_rust_bridge::for_generated::SseDeserializer) -> Self { - let mut inner = ::sse_decode(deserializer); - return decode_rust_opaque_moi(inner); + if (::sse_decode(deserializer)) { + return Some( + ::sse_decode(deserializer), + ); + } else { + return None; + } } } -impl SseDecode - for RustOpaqueMoi> -{ +impl SseDecode for Option { // Codec=Sse (Serialization based), see doc to use other codecs fn sse_decode(deserializer: &mut flutter_rust_bridge::for_generated::SseDeserializer) -> Self { - let mut inner = ::sse_decode(deserializer); - return decode_rust_opaque_moi(inner); + if (::sse_decode(deserializer)) { + return Some(::sse_decode( + deserializer, + )); + } else { + return None; + } } } -impl SseDecode - for RustOpaqueMoi< - flutter_rust_bridge::for_generated::RustAutoOpaqueInner, - > -{ +impl SseDecode for Option { // Codec=Sse (Serialization based), see doc to use other codecs fn sse_decode(deserializer: &mut flutter_rust_bridge::for_generated::SseDeserializer) -> Self { - let mut inner = ::sse_decode(deserializer); - return decode_rust_opaque_moi(inner); + if (::sse_decode(deserializer)) { + return Some(::sse_decode( + deserializer, + )); + } else { + return None; + } } } -impl SseDecode for RustOpaqueMoi> { +impl SseDecode for Option { // Codec=Sse (Serialization based), see doc to use other codecs fn sse_decode(deserializer: &mut flutter_rust_bridge::for_generated::SseDeserializer) -> Self { - let mut inner = ::sse_decode(deserializer); - return decode_rust_opaque_moi(inner); + if (::sse_decode(deserializer)) { + return Some(::sse_decode( + deserializer, + )); + } else { + return None; + } } } -impl SseDecode - for RustOpaqueMoi> -{ +impl SseDecode for Option { // Codec=Sse (Serialization based), see doc to use other codecs fn sse_decode(deserializer: &mut flutter_rust_bridge::for_generated::SseDeserializer) -> Self { - let mut inner = ::sse_decode(deserializer); - return decode_rust_opaque_moi(inner); + if (::sse_decode(deserializer)) { + return Some(::sse_decode( + deserializer, + )); + } else { + return None; + } } } -impl SseDecode - for RustOpaqueMoi< - flutter_rust_bridge::for_generated::RustAutoOpaqueInner< - FindMyFriendsClient, - >, - > -{ +impl SseDecode for Option { // Codec=Sse (Serialization based), see doc to use other codecs fn sse_decode(deserializer: &mut flutter_rust_bridge::for_generated::SseDeserializer) -> Self { - let mut inner = ::sse_decode(deserializer); - return decode_rust_opaque_moi(inner); + if (::sse_decode(deserializer)) { + return Some( + ::sse_decode(deserializer), + ); + } else { + return None; + } } } -impl SseDecode - for RustOpaqueMoi< - flutter_rust_bridge::for_generated::RustAutoOpaqueInner< - FindMyPhoneClient, - >, - > -{ +impl SseDecode for Option { // Codec=Sse (Serialization based), see doc to use other codecs fn sse_decode(deserializer: &mut flutter_rust_bridge::for_generated::SseDeserializer) -> Self { - let mut inner = ::sse_decode(deserializer); - return decode_rust_opaque_moi(inner); + if (::sse_decode(deserializer)) { + return Some( + ::sse_decode(deserializer), + ); + } else { + return None; + } } } -impl SseDecode - for RustOpaqueMoi< - flutter_rust_bridge::for_generated::RustAutoOpaqueInner>, - > -{ +impl SseDecode for Option { // Codec=Sse (Serialization based), see doc to use other codecs fn sse_decode(deserializer: &mut flutter_rust_bridge::for_generated::SseDeserializer) -> Self { - let mut inner = ::sse_decode(deserializer); - return decode_rust_opaque_moi(inner); + if (::sse_decode(deserializer)) { + return Some( + ::sse_decode(deserializer), + ); + } else { + return None; + } } } -impl SseDecode - for RustOpaqueMoi< - flutter_rust_bridge::for_generated::RustAutoOpaqueInner>, - > -{ +impl SseDecode for Option { // Codec=Sse (Serialization based), see doc to use other codecs fn sse_decode(deserializer: &mut flutter_rust_bridge::for_generated::SseDeserializer) -> Self { - let mut inner = ::sse_decode(deserializer); - return decode_rust_opaque_moi(inner); + if (::sse_decode(deserializer)) { + return Some(::sse_decode( + deserializer, + )); + } else { + return None; + } } } -impl SseDecode - for RustOpaqueMoi< - flutter_rust_bridge::for_generated::RustAutoOpaqueInner>, - > -{ +impl SseDecode for Option { // Codec=Sse (Serialization based), see doc to use other codecs fn sse_decode(deserializer: &mut flutter_rust_bridge::for_generated::SseDeserializer) -> Self { - let mut inner = ::sse_decode(deserializer); - return decode_rust_opaque_moi(inner); + if (::sse_decode(deserializer)) { + return Some( + ::sse_decode(deserializer), + ); + } else { + return None; + } } } -impl SseDecode - for RustOpaqueMoi< - flutter_rust_bridge::for_generated::RustAutoOpaqueInner>, - > -{ +impl SseDecode for Option { // Codec=Sse (Serialization based), see doc to use other codecs fn sse_decode(deserializer: &mut flutter_rust_bridge::for_generated::SseDeserializer) -> Self { - let mut inner = ::sse_decode(deserializer); - return decode_rust_opaque_moi(inner); + if (::sse_decode(deserializer)) { + return Some( + ::sse_decode(deserializer), + ); + } else { + return None; + } } } -impl SseDecode - for RustOpaqueMoi< - flutter_rust_bridge::for_generated::RustAutoOpaqueInner>, - > -{ +impl SseDecode for Option { // Codec=Sse (Serialization based), see doc to use other codecs fn sse_decode(deserializer: &mut flutter_rust_bridge::for_generated::SseDeserializer) -> Self { - let mut inner = ::sse_decode(deserializer); - return decode_rust_opaque_moi(inner); + if (::sse_decode(deserializer)) { + return Some( + ::sse_decode(deserializer), + ); + } else { + return None; + } } } -impl SseDecode - for RustOpaqueMoi< - flutter_rust_bridge::for_generated::RustAutoOpaqueInner>, - > -{ +impl SseDecode for Option { // Codec=Sse (Serialization based), see doc to use other codecs fn sse_decode(deserializer: &mut flutter_rust_bridge::for_generated::SseDeserializer) -> Self { - let mut inner = ::sse_decode(deserializer); - return decode_rust_opaque_moi(inner); + if (::sse_decode(deserializer)) { + return Some( + ::sse_decode(deserializer), + ); + } else { + return None; + } } } -impl SseDecode - for RustOpaqueMoi> -{ +impl SseDecode for Option { // Codec=Sse (Serialization based), see doc to use other codecs fn sse_decode(deserializer: &mut flutter_rust_bridge::for_generated::SseDeserializer) -> Self { - let mut inner = ::sse_decode(deserializer); - return decode_rust_opaque_moi(inner); + if (::sse_decode(deserializer)) { + return Some(::sse_decode( + deserializer, + )); + } else { + return None; + } } } -impl SseDecode for RustOpaqueMoi> { +impl SseDecode for Option { // Codec=Sse (Serialization based), see doc to use other codecs fn sse_decode(deserializer: &mut flutter_rust_bridge::for_generated::SseDeserializer) -> Self { - let mut inner = ::sse_decode(deserializer); - return decode_rust_opaque_moi(inner); + if (::sse_decode(deserializer)) { + return Some( + ::sse_decode(deserializer), + ); + } else { + return None; + } } } -impl SseDecode - for RustOpaqueMoi> -{ +impl SseDecode for Option { // Codec=Sse (Serialization based), see doc to use other codecs fn sse_decode(deserializer: &mut flutter_rust_bridge::for_generated::SseDeserializer) -> Self { - let mut inner = ::sse_decode(deserializer); - return decode_rust_opaque_moi(inner); + if (::sse_decode(deserializer)) { + return Some( + ::sse_decode(deserializer), + ); + } else { + return None; + } } } -impl SseDecode - for RustOpaqueMoi> -{ +impl SseDecode for Option { // Codec=Sse (Serialization based), see doc to use other codecs fn sse_decode(deserializer: &mut flutter_rust_bridge::for_generated::SseDeserializer) -> Self { - let mut inner = ::sse_decode(deserializer); - return decode_rust_opaque_moi(inner); + if (::sse_decode(deserializer)) { + return Some(::sse_decode( + deserializer, + )); + } else { + return None; + } } } -impl SseDecode - for RustOpaqueMoi> -{ +impl SseDecode for Option { // Codec=Sse (Serialization based), see doc to use other codecs fn sse_decode(deserializer: &mut flutter_rust_bridge::for_generated::SseDeserializer) -> Self { - let mut inner = ::sse_decode(deserializer); - return decode_rust_opaque_moi(inner); + if (::sse_decode(deserializer)) { + return Some(::sse_decode( + deserializer, + )); + } else { + return None; + } } } -impl SseDecode - for RustOpaqueMoi< - flutter_rust_bridge::for_generated::RustAutoOpaqueInner>, - > -{ +impl SseDecode for Option { // Codec=Sse (Serialization based), see doc to use other codecs fn sse_decode(deserializer: &mut flutter_rust_bridge::for_generated::SseDeserializer) -> Self { - let mut inner = ::sse_decode(deserializer); - return decode_rust_opaque_moi(inner); + if (::sse_decode(deserializer)) { + return Some(::sse_decode( + deserializer, + )); + } else { + return None; + } } } -impl SseDecode - for RustOpaqueMoi< - flutter_rust_bridge::for_generated::RustAutoOpaqueInner>, - > -{ +impl SseDecode for Option { // Codec=Sse (Serialization based), see doc to use other codecs fn sse_decode(deserializer: &mut flutter_rust_bridge::for_generated::SseDeserializer) -> Self { - let mut inner = ::sse_decode(deserializer); - return decode_rust_opaque_moi(inner); + if (::sse_decode(deserializer)) { + return Some(::sse_decode( + deserializer, + )); + } else { + return None; + } } } -impl SseDecode - for RustOpaqueMoi> -{ +impl SseDecode for Option { // Codec=Sse (Serialization based), see doc to use other codecs fn sse_decode(deserializer: &mut flutter_rust_bridge::for_generated::SseDeserializer) -> Self { - let mut inner = ::sse_decode(deserializer); - return decode_rust_opaque_moi(inner); + if (::sse_decode(deserializer)) { + return Some(::sse_decode(deserializer)); + } else { + return None; + } } } -impl SseDecode - for RustOpaqueMoi>> -{ +impl SseDecode for Option { // Codec=Sse (Serialization based), see doc to use other codecs fn sse_decode(deserializer: &mut flutter_rust_bridge::for_generated::SseDeserializer) -> Self { - let mut inner = ::sse_decode(deserializer); - return decode_rust_opaque_moi(inner); + if (::sse_decode(deserializer)) { + return Some(::sse_decode(deserializer)); + } else { + return None; + } } } -impl SseDecode - for RustOpaqueMoi> -{ +impl SseDecode for Option { // Codec=Sse (Serialization based), see doc to use other codecs fn sse_decode(deserializer: &mut flutter_rust_bridge::for_generated::SseDeserializer) -> Self { - let mut inner = ::sse_decode(deserializer); - return decode_rust_opaque_moi(inner); + if (::sse_decode(deserializer)) { + return Some(::sse_decode(deserializer)); + } else { + return None; + } } } -impl SseDecode - for RustOpaqueMoi>> -{ +impl SseDecode for Option { // Codec=Sse (Serialization based), see doc to use other codecs fn sse_decode(deserializer: &mut flutter_rust_bridge::for_generated::SseDeserializer) -> Self { - let mut inner = ::sse_decode(deserializer); - return decode_rust_opaque_moi(inner); + if (::sse_decode(deserializer)) { + return Some(::sse_decode(deserializer)); + } else { + return None; + } } } -impl SseDecode - for RustOpaqueMoi> -{ + +impl SseDecode for Option { // Codec=Sse (Serialization based), see doc to use other codecs fn sse_decode(deserializer: &mut flutter_rust_bridge::for_generated::SseDeserializer) -> Self { - let mut inner = ::sse_decode(deserializer); - return decode_rust_opaque_moi(inner); + if (::sse_decode(deserializer)) { + return Some(::sse_decode( + deserializer, + )); + } else { + return None; + } } } -impl SseDecode - for RustOpaqueMoi< - flutter_rust_bridge::for_generated::RustAutoOpaqueInner< - SyncManager, - >, - > -{ +impl SseDecode for Option { // Codec=Sse (Serialization based), see doc to use other codecs fn sse_decode(deserializer: &mut flutter_rust_bridge::for_generated::SseDeserializer) -> Self { - let mut inner = ::sse_decode(deserializer); - return decode_rust_opaque_moi(inner); + if (::sse_decode(deserializer)) { + return Some(::sse_decode( + deserializer, + )); + } else { + return None; + } } } -impl SseDecode - for RustOpaqueMoi> -{ +impl SseDecode for Option { // Codec=Sse (Serialization based), see doc to use other codecs fn sse_decode(deserializer: &mut flutter_rust_bridge::for_generated::SseDeserializer) -> Self { - let mut inner = ::sse_decode(deserializer); - return decode_rust_opaque_moi(inner); + if (::sse_decode(deserializer)) { + return Some(::sse_decode(deserializer)); + } else { + return None; + } } } -impl SseDecode - for RustOpaqueMoi> -{ +impl SseDecode for Option { // Codec=Sse (Serialization based), see doc to use other codecs fn sse_decode(deserializer: &mut flutter_rust_bridge::for_generated::SseDeserializer) -> Self { - let mut inner = ::sse_decode(deserializer); - return decode_rust_opaque_moi(inner); + if (::sse_decode(deserializer)) { + return Some(::sse_decode(deserializer)); + } else { + return None; + } } } -impl SseDecode - for RustOpaqueMoi> -{ +impl SseDecode for Option { // Codec=Sse (Serialization based), see doc to use other codecs fn sse_decode(deserializer: &mut flutter_rust_bridge::for_generated::SseDeserializer) -> Self { - let mut inner = ::sse_decode(deserializer); - return decode_rust_opaque_moi(inner); + if (::sse_decode(deserializer)) { + return Some(::sse_decode(deserializer)); + } else { + return None; + } } } -impl SseDecode for std::collections::HashSet { +impl SseDecode for Option { // Codec=Sse (Serialization based), see doc to use other codecs fn sse_decode(deserializer: &mut flutter_rust_bridge::for_generated::SseDeserializer) -> Self { - let mut inner = >::sse_decode(deserializer); - return inner.into_iter().collect(); + if (::sse_decode(deserializer)) { + return Some(::sse_decode(deserializer)); + } else { + return None; + } } } -impl SseDecode - for StreamSink< - crate::api::api::MMCSTransferProgress, - flutter_rust_bridge::for_generated::SseCodec, - > -{ +impl SseDecode for Option { // Codec=Sse (Serialization based), see doc to use other codecs fn sse_decode(deserializer: &mut flutter_rust_bridge::for_generated::SseDeserializer) -> Self { - let mut inner = ::sse_decode(deserializer); - return StreamSink::deserialize(inner); + if (::sse_decode(deserializer)) { + return Some(::sse_decode(deserializer)); + } else { + return None; + } } } -impl SseDecode - for StreamSink -{ +impl SseDecode for Option { // Codec=Sse (Serialization based), see doc to use other codecs fn sse_decode(deserializer: &mut flutter_rust_bridge::for_generated::SseDeserializer) -> Self { - let mut inner = ::sse_decode(deserializer); - return StreamSink::deserialize(inner); + if (::sse_decode(deserializer)) { + return Some(::sse_decode( + deserializer, + )); + } else { + return None; + } } } -impl SseDecode for String { +impl SseDecode for Option { // Codec=Sse (Serialization based), see doc to use other codecs fn sse_decode(deserializer: &mut flutter_rust_bridge::for_generated::SseDeserializer) -> Self { - let mut inner = >::sse_decode(deserializer); - return String::from_utf8(inner).unwrap(); + if (::sse_decode(deserializer)) { + return Some(::sse_decode( + deserializer, + )); + } else { + return None; + } } } -impl SseDecode for crate::api::api::Address { +impl SseDecode for Option { // Codec=Sse (Serialization based), see doc to use other codecs fn sse_decode(deserializer: &mut flutter_rust_bridge::for_generated::SseDeserializer) -> Self { - let mut var_administrativeArea = >::sse_decode(deserializer); - let mut var_country = ::sse_decode(deserializer); - let mut var_countryCode = ::sse_decode(deserializer); - let mut var_formattedAddressLines = >>::sse_decode(deserializer); - let mut var_locality = >::sse_decode(deserializer); - let mut var_stateCode = >::sse_decode(deserializer); - let mut var_streetAddress = >::sse_decode(deserializer); - let mut var_streetName = >::sse_decode(deserializer); - return crate::api::api::Address { - administrative_area: var_administrativeArea, - country: var_country, - country_code: var_countryCode, - formatted_address_lines: var_formattedAddressLines, - locality: var_locality, - state_code: var_stateCode, - street_address: var_streetAddress, - street_name: var_streetName, - }; + if (::sse_decode(deserializer)) { + return Some(::sse_decode(deserializer)); + } else { + return None; + } } } -impl SseDecode for crate::api::api::AkData { +impl SseDecode for Option { // Codec=Sse (Serialization based), see doc to use other codecs fn sse_decode(deserializer: &mut flutter_rust_bridge::for_generated::SseDeserializer) -> Self { - let mut var_lat = ::sse_decode(deserializer); - let mut var_lng = ::sse_decode(deserializer); - return crate::api::api::AkData { - lat: var_lat, - lng: var_lng, - }; + if (::sse_decode(deserializer)) { + return Some(::sse_decode(deserializer)); + } else { + return None; + } } } -impl SseDecode for crate::api::api::ApsAlert { +impl SseDecode for Option { // Codec=Sse (Serialization based), see doc to use other codecs fn sse_decode(deserializer: &mut flutter_rust_bridge::for_generated::SseDeserializer) -> Self { - let mut var_title = ::sse_decode(deserializer); - let mut var_body = ::sse_decode(deserializer); - let mut var_sbdy = ::sse_decode(deserializer); - let mut var_defbtn = ::sse_decode(deserializer); - let mut var_albtn = ::sse_decode(deserializer); - return crate::api::api::ApsAlert { - title: var_title, - body: var_body, - sbdy: var_sbdy, - defbtn: var_defbtn, - albtn: var_albtn, - }; + if (::sse_decode(deserializer)) { + return Some(::sse_decode(deserializer)); + } else { + return None; + } } } -impl SseDecode for crate::api::api::ApsData { +impl SseDecode for Option { // Codec=Sse (Serialization based), see doc to use other codecs fn sse_decode(deserializer: &mut flutter_rust_bridge::for_generated::SseDeserializer) -> Self { - let mut var_alert = ::sse_decode(deserializer); - return crate::api::api::ApsData { alert: var_alert }; + if (::sse_decode(deserializer)) { + return Some(::sse_decode(deserializer)); + } else { + return None; + } } } -impl SseDecode for crate::api::api::Attachment { +impl SseDecode for Option { // Codec=Sse (Serialization based), see doc to use other codecs fn sse_decode(deserializer: &mut flutter_rust_bridge::for_generated::SseDeserializer) -> Self { - let mut var_aType = ::sse_decode(deserializer); - let mut var_part_ = ::sse_decode(deserializer); - let mut var_utiType = ::sse_decode(deserializer); - let mut var_mime = ::sse_decode(deserializer); - let mut var_name = ::sse_decode(deserializer); - let mut var_iris = ::sse_decode(deserializer); - return crate::api::api::Attachment { - a_type: var_aType, - part: var_part_, - uti_type: var_utiType, - mime: var_mime, - name: var_name, - iris: var_iris, - }; + if (::sse_decode(deserializer)) { + return Some( + ::sse_decode(deserializer), + ); + } else { + return None; + } } } -impl SseDecode for crate::api::api::AttachmentMeta { +impl SseDecode for Option { // Codec=Sse (Serialization based), see doc to use other codecs fn sse_decode(deserializer: &mut flutter_rust_bridge::for_generated::SseDeserializer) -> Self { - let mut var_mimeType = >::sse_decode(deserializer); - let mut var_startDate = ::sse_decode(deserializer); - let mut var_totalBytes = ::sse_decode(deserializer); - let mut var_transferState = ::sse_decode(deserializer); - let mut var_isSticker = ::sse_decode(deserializer); - let mut var_guid = ::sse_decode(deserializer); - let mut var_hideAttachment = ::sse_decode(deserializer); - let mut var_userInfo = - >::sse_decode(deserializer); - let mut var_filename = >::sse_decode(deserializer); - let mut var_extras = - >::sse_decode(deserializer); - let mut var_isOutgoing = ::sse_decode(deserializer); - let mut var_transferName = >::sse_decode(deserializer); - let mut var_version = ::sse_decode(deserializer); - let mut var_uti = >::sse_decode(deserializer); - let mut var_createdDate = ::sse_decode(deserializer); - let mut var_pathc = >::sse_decode(deserializer); - let mut var_md5 = >::sse_decode(deserializer); - return crate::api::api::AttachmentMeta { - mime_type: var_mimeType, - start_date: var_startDate, - total_bytes: var_totalBytes, - transfer_state: var_transferState, - is_sticker: var_isSticker, - guid: var_guid, - hide_attachment: var_hideAttachment, - user_info: var_userInfo, - filename: var_filename, - extras: var_extras, - is_outgoing: var_isOutgoing, - transfer_name: var_transferName, - version: var_version, - uti: var_uti, - created_date: var_createdDate, - pathc: var_pathc, - md5: var_md5, - }; + if (::sse_decode(deserializer)) { + return Some(::sse_decode( + deserializer, + )); + } else { + return None; + } } } -impl SseDecode for crate::api::api::AttachmentMetaExtra { +impl SseDecode for Option { // Codec=Sse (Serialization based), see doc to use other codecs fn sse_decode(deserializer: &mut flutter_rust_bridge::for_generated::SseDeserializer) -> Self { - let mut var_previewGenerationState = - >::sse_decode(deserializer); - return crate::api::api::AttachmentMetaExtra { - preview_generation_state: var_previewGenerationState, - }; + if (::sse_decode(deserializer)) { + return Some(::sse_decode(deserializer)); + } else { + return None; + } } } -impl SseDecode for crate::api::api::AttachmentType { +impl SseDecode for Option { // Codec=Sse (Serialization based), see doc to use other codecs fn sse_decode(deserializer: &mut flutter_rust_bridge::for_generated::SseDeserializer) -> Self { - let mut tag_ = ::sse_decode(deserializer); - match tag_ { - 0 => { - let mut var_field0 = >::sse_decode(deserializer); - return crate::api::api::AttachmentType::Inline(var_field0); - } - 1 => { - let mut var_field0 = ::sse_decode(deserializer); - return crate::api::api::AttachmentType::MMCS(var_field0); - } - _ => { - unimplemented!(""); - } + if (::sse_decode(deserializer)) { + return Some(::sse_decode( + deserializer, + )); + } else { + return None; } } } -impl SseDecode for crate::api::api::Balloon { +impl SseDecode for Option { // Codec=Sse (Serialization based), see doc to use other codecs fn sse_decode(deserializer: &mut flutter_rust_bridge::for_generated::SseDeserializer) -> Self { - let mut var_url = ::sse_decode(deserializer); - let mut var_session = >::sse_decode(deserializer); - let mut var_layout = >::sse_decode(deserializer); - let mut var_ldText = >::sse_decode(deserializer); - let mut var_isLive = ::sse_decode(deserializer); - let mut var_icon = >>::sse_decode(deserializer); - return crate::api::api::Balloon { - url: var_url, - session: var_session, - layout: var_layout, - ld_text: var_ldText, - is_live: var_isLive, - icon: var_icon, - }; + if (::sse_decode(deserializer)) { + return Some(::sse_decode(deserializer)); + } else { + return None; + } } } -impl SseDecode for crate::api::api::BalloonLayout { +impl SseDecode for Option<(crate::api::api::SharedPushState, APSWatcher)> { // Codec=Sse (Serialization based), see doc to use other codecs fn sse_decode(deserializer: &mut flutter_rust_bridge::for_generated::SseDeserializer) -> Self { - let mut tag_ = ::sse_decode(deserializer); - match tag_ { - 0 => { - let mut var_imageSubtitle = ::sse_decode(deserializer); - let mut var_imageTitle = ::sse_decode(deserializer); - let mut var_caption = ::sse_decode(deserializer); - let mut var_secondarySubcaption = ::sse_decode(deserializer); - let mut var_tertiarySubcaption = ::sse_decode(deserializer); - let mut var_subcaption = ::sse_decode(deserializer); - let mut var_class_ = ::sse_decode(deserializer); - return crate::api::api::BalloonLayout::TemplateLayout { - image_subtitle: var_imageSubtitle, - image_title: var_imageTitle, - caption: var_caption, - secondary_subcaption: var_secondarySubcaption, - tertiary_subcaption: var_tertiarySubcaption, - subcaption: var_subcaption, - class: var_class_, - }; - } - _ => { - unimplemented!(""); - } + if (::sse_decode(deserializer)) { + return Some( + <(crate::api::api::SharedPushState, APSWatcher)>::sse_decode(deserializer), + ); + } else { + return None; } } } -impl SseDecode for crate::api::api::BeaconAttributes { +impl SseDecode for Option<(String, String)> { // Codec=Sse (Serialization based), see doc to use other codecs fn sse_decode(deserializer: &mut flutter_rust_bridge::for_generated::SseDeserializer) -> Self { - let mut var_name = ::sse_decode(deserializer); - let mut var_roleId = ::sse_decode(deserializer); - let mut var_emoji = ::sse_decode(deserializer); - let mut var_systemVersion = ::sse_decode(deserializer); - let mut var_serialNumber = ::sse_decode(deserializer); - return crate::api::api::BeaconAttributes { - name: var_name, - role_id: var_roleId, - emoji: var_emoji, - system_version: var_systemVersion, - serial_number: var_serialNumber, - }; + if (::sse_decode(deserializer)) { + return Some(<(String, String)>::sse_decode(deserializer)); + } else { + return None; + } } } -impl SseDecode for crate::api::api::BeaconNamingRecord { +impl SseDecode for Option<(String, u64)> { // Codec=Sse (Serialization based), see doc to use other codecs fn sse_decode(deserializer: &mut flutter_rust_bridge::for_generated::SseDeserializer) -> Self { - let mut var_emoji = ::sse_decode(deserializer); - let mut var_name = ::sse_decode(deserializer); - let mut var_associatedBeacon = ::sse_decode(deserializer); - let mut var_roleId = ::sse_decode(deserializer); - return crate::api::api::BeaconNamingRecord { - emoji: var_emoji, - name: var_name, - associated_beacon: var_associatedBeacon, - role_id: var_roleId, - }; + if (::sse_decode(deserializer)) { + return Some(<(String, u64)>::sse_decode(deserializer)); + } else { + return None; + } } } -impl SseDecode for bool { +impl SseDecode for Option { // Codec=Sse (Serialization based), see doc to use other codecs fn sse_decode(deserializer: &mut flutter_rust_bridge::for_generated::SseDeserializer) -> Self { - deserializer.cursor.read_u8().unwrap() != 0 + if (::sse_decode(deserializer)) { + return Some( + ::sse_decode(deserializer), + ); + } else { + return None; + } } } -impl SseDecode for crate::api::api::CertifiedContext { +impl SseDecode for Option { // Codec=Sse (Serialization based), see doc to use other codecs fn sse_decode(deserializer: &mut flutter_rust_bridge::for_generated::SseDeserializer) -> Self { - let mut var_version = ::sse_decode(deserializer); - let mut var_receipt = >::sse_decode(deserializer); - let mut var_sender = ::sse_decode(deserializer); - let mut var_target = ::sse_decode(deserializer); - let mut var_uuid = >::sse_decode(deserializer); - let mut var_token = >::sse_decode(deserializer); - return crate::api::api::CertifiedContext { - version: var_version, - receipt: var_receipt, - sender: var_sender, - target: var_target, - uuid: var_uuid, - token: var_token, - }; + if (::sse_decode(deserializer)) { + return Some(::sse_decode(deserializer)); + } else { + return None; + } } } -impl SseDecode for crate::api::api::ChangeParticipantMessage { +impl SseDecode for Option { // Codec=Sse (Serialization based), see doc to use other codecs fn sse_decode(deserializer: &mut flutter_rust_bridge::for_generated::SseDeserializer) -> Self { - let mut var_newParticipants = >::sse_decode(deserializer); - let mut var_groupVersion = ::sse_decode(deserializer); - return crate::api::api::ChangeParticipantMessage { - new_participants: var_newParticipants, - group_version: var_groupVersion, - }; + if (::sse_decode(deserializer)) { + return Some(::sse_decode( + deserializer, + )); + } else { + return None; + } } } -impl SseDecode for crate::api::api::ChatProto { +impl SseDecode for Option { // Codec=Sse (Serialization based), see doc to use other codecs fn sse_decode(deserializer: &mut flutter_rust_bridge::for_generated::SseDeserializer) -> Self { - let mut var_unk1 = >::sse_decode(deserializer); - return crate::api::api::ChatProto { unk1: var_unk1 }; + if (::sse_decode(deserializer)) { + return Some(::sse_decode( + deserializer, + )); + } else { + return None; + } } } -impl SseDecode for crate::api::api::CloudAttachment { +impl SseDecode for Option { // Codec=Sse (Serialization based), see doc to use other codecs fn sse_decode(deserializer: &mut flutter_rust_bridge::for_generated::SseDeserializer) -> Self { - let mut var_cm = >::sse_decode(deserializer); - let mut var_lqa = ::sse_decode(deserializer); - return crate::api::api::CloudAttachment { - cm: var_cm, - lqa: var_lqa, - }; + if (::sse_decode(deserializer)) { + return Some(::sse_decode(deserializer)); + } else { + return None; + } } } -impl SseDecode for crate::api::api::CloudChat { +impl SseDecode for Option { // Codec=Sse (Serialization based), see doc to use other codecs fn sse_decode(deserializer: &mut flutter_rust_bridge::for_generated::SseDeserializer) -> Self { - let mut var_style = ::sse_decode(deserializer); - let mut var_isFiltered = ::sse_decode(deserializer); - let mut var_successfulQuery = ::sse_decode(deserializer); - let mut var_state = ::sse_decode(deserializer); - let mut var_chatIdentifier = ::sse_decode(deserializer); - let mut var_groupId = ::sse_decode(deserializer); - let mut var_serviceName = ::sse_decode(deserializer); - let mut var_originalGroupId = ::sse_decode(deserializer); - let mut var_properties = >::sse_decode(deserializer); - let mut var_participants = - >::sse_decode(deserializer); - let mut var_prop001 = ::sse_decode(deserializer); - let mut var_lastReadMessageTimestamp = ::sse_decode(deserializer); - let mut var_lastAddressedHandle = ::sse_decode(deserializer); - let mut var_guid = ::sse_decode(deserializer); - let mut var_displayName = >::sse_decode(deserializer); - let mut var_proto001 = >>::sse_decode(deserializer); - let mut var_groupPhotoGuid = >::sse_decode(deserializer); - let mut var_groupPhoto = >::sse_decode(deserializer); - return crate::api::api::CloudChat { - style: var_style, - is_filtered: var_isFiltered, - successful_query: var_successfulQuery, - state: var_state, - chat_identifier: var_chatIdentifier, - group_id: var_groupId, - service_name: var_serviceName, - original_group_id: var_originalGroupId, - properties: var_properties, - participants: var_participants, - prop001: var_prop001, - last_read_message_timestamp: var_lastReadMessageTimestamp, - last_addressed_handle: var_lastAddressedHandle, - guid: var_guid, - display_name: var_displayName, - proto001: var_proto001, - group_photo_guid: var_groupPhotoGuid, - group_photo: var_groupPhoto, - }; + if (::sse_decode(deserializer)) { + return Some(::sse_decode(deserializer)); + } else { + return None; + } } } -impl SseDecode for crate::api::api::CloudMessage { +impl SseDecode for Option { // Codec=Sse (Serialization based), see doc to use other codecs fn sse_decode(deserializer: &mut flutter_rust_bridge::for_generated::SseDeserializer) -> Self { - let mut var_utm = >::sse_decode(deserializer); - let mut var_type = ::sse_decode(deserializer); - let mut var_error = ::sse_decode(deserializer); - let mut var_chatId = ::sse_decode(deserializer); - let mut var_sender = ::sse_decode(deserializer); - let mut var_time = ::sse_decode(deserializer); - let mut var_msgProto2 = >>::sse_decode(deserializer); - let mut var_destinationCallerId = ::sse_decode(deserializer); - let mut var_msgProto = >::sse_decode(deserializer); - let mut var_flags = ::sse_decode(deserializer); - let mut var_guid = ::sse_decode(deserializer); - let mut var_msgProto3 = >>::sse_decode(deserializer); - let mut var_service = ::sse_decode(deserializer); - let mut var_msgProto4 = >>::sse_decode(deserializer); - return crate::api::api::CloudMessage { - utm: var_utm, - r#type: var_type, - error: var_error, - chat_id: var_chatId, - sender: var_sender, - time: var_time, - msg_proto_2: var_msgProto2, - destination_caller_id: var_destinationCallerId, - msg_proto: var_msgProto, - flags: var_flags, - guid: var_guid, - msg_proto_3: var_msgProto3, - service: var_service, - msg_proto_4: var_msgProto4, - }; + if (::sse_decode(deserializer)) { + return Some(::sse_decode(deserializer)); + } else { + return None; + } } } -impl SseDecode for crate::api::api::CloudMessageSummary { +impl SseDecode for Option { // Codec=Sse (Serialization based), see doc to use other codecs fn sse_decode(deserializer: &mut flutter_rust_bridge::for_generated::SseDeserializer) -> Self { - let mut var_messagesSummary = >::sse_decode(deserializer); - let mut var_chatSummary = >::sse_decode(deserializer); - let mut var_attachmentSummary = >::sse_decode(deserializer); - return crate::api::api::CloudMessageSummary { - messages_summary: var_messagesSummary, - chat_summary: var_chatSummary, - attachment_summary: var_attachmentSummary, - }; + if (::sse_decode(deserializer)) { + return Some(::sse_decode(deserializer)); + } else { + return None; + } } } -impl SseDecode for crate::api::api::CloudParticipant { +impl SseDecode for Option { // Codec=Sse (Serialization based), see doc to use other codecs fn sse_decode(deserializer: &mut flutter_rust_bridge::for_generated::SseDeserializer) -> Self { - let mut var_uri = ::sse_decode(deserializer); - return crate::api::api::CloudParticipant { uri: var_uri }; + if (::sse_decode(deserializer)) { + return Some(::sse_decode(deserializer)); + } else { + return None; + } } } -impl SseDecode for crate::api::api::CloudProp { +impl SseDecode for Option { // Codec=Sse (Serialization based), see doc to use other codecs fn sse_decode(deserializer: &mut flutter_rust_bridge::for_generated::SseDeserializer) -> Self { - let mut var_gpufc = >::sse_decode(deserializer); - let mut var_pv = >::sse_decode(deserializer); - let mut var_numberOfTimesRespondedtoThread = >::sse_decode(deserializer); - let mut var_shouldForceToSms = >::sse_decode(deserializer); - let mut var_lastSeenMessageGuid = >::sse_decode(deserializer); - let mut var_messageHandshakeState = >::sse_decode(deserializer); - let mut var_legacyGroupIdentifiers = >::sse_decode(deserializer); - let mut var_groupPhotoGuid = >::sse_decode(deserializer); - let mut var_lastModificationDate = >::sse_decode(deserializer); - return crate::api::api::CloudProp { - gpufc: var_gpufc, - pv: var_pv, - number_of_times_respondedto_thread: var_numberOfTimesRespondedtoThread, - should_force_to_sms: var_shouldForceToSms, - last_seen_message_guid: var_lastSeenMessageGuid, - message_handshake_state: var_messageHandshakeState, - legacy_group_identifiers: var_legacyGroupIdentifiers, - group_photo_guid: var_groupPhotoGuid, - last_modification_date: var_lastModificationDate, - }; + if (::sse_decode(deserializer)) { + return Some(::sse_decode(deserializer)); + } else { + return None; + } } } -impl SseDecode for crate::api::api::CloudProp001 { +impl SseDecode for Option { // Codec=Sse (Serialization based), see doc to use other codecs fn sse_decode(deserializer: &mut flutter_rust_bridge::for_generated::SseDeserializer) -> Self { - let mut var_syndicationType = ::sse_decode(deserializer); - return crate::api::api::CloudProp001 { - syndication_type: var_syndicationType, - }; + if (::sse_decode(deserializer)) { + return Some(::sse_decode(deserializer)); + } else { + return None; + } } } -impl SseDecode for crate::api::api::ConversationData { - // Codec=Sse (Serialization based), see doc to use other codecs - fn sse_decode(deserializer: &mut flutter_rust_bridge::for_generated::SseDeserializer) -> Self { - let mut var_participants = >::sse_decode(deserializer); - let mut var_cvName = >::sse_decode(deserializer); - let mut var_senderGuid = >::sse_decode(deserializer); - let mut var_afterGuid = >::sse_decode(deserializer); - return crate::api::api::ConversationData { - participants: var_participants, - cv_name: var_cvName, - sender_guid: var_senderGuid, - after_guid: var_afterGuid, - }; - } -} -impl SseDecode for crate::api::api::DartBeacon { +impl SseDecode for Option { // Codec=Sse (Serialization based), see doc to use other codecs fn sse_decode(deserializer: &mut flutter_rust_bridge::for_generated::SseDeserializer) -> Self { - let mut var_naming = ::sse_decode(deserializer); - let mut var_lastReport = >::sse_decode(deserializer); - let mut var_productId = ::sse_decode(deserializer); - let mut var_batteryLevel = >::sse_decode(deserializer); - let mut var_vendorId = ::sse_decode(deserializer); - let mut var_model = ::sse_decode(deserializer); - let mut var_systemVersion = ::sse_decode(deserializer); - let mut var_id = ::sse_decode(deserializer); - let mut var_shared = - >::sse_decode(deserializer); - return crate::api::api::DartBeacon { - naming: var_naming, - last_report: var_lastReport, - product_id: var_productId, - battery_level: var_batteryLevel, - vendor_id: var_vendorId, - model: var_model, - system_version: var_systemVersion, - id: var_id, - shared: var_shared, - }; + if (::sse_decode(deserializer)) { + return Some(::sse_decode( + deserializer, + )); + } else { + return None; + } } } -impl SseDecode for crate::api::api::DartBeaconShareInfo { +impl SseDecode for Option> { // Codec=Sse (Serialization based), see doc to use other codecs fn sse_decode(deserializer: &mut flutter_rust_bridge::for_generated::SseDeserializer) -> Self { - let mut var_shareId = ::sse_decode(deserializer); - let mut var_acceptanceState = ::sse_decode(deserializer); - let mut var_ownerHandle = ::sse_decode(deserializer); - return crate::api::api::DartBeaconShareInfo { - share_id: var_shareId, - acceptance_state: var_acceptanceState, - owner_handle: var_ownerHandle, - }; + if (::sse_decode(deserializer)) { + return Some(>::sse_decode(deserializer)); + } else { + return None; + } } } -impl SseDecode for crate::api::api::DeleteTarget { +impl SseDecode for Option> { // Codec=Sse (Serialization based), see doc to use other codecs fn sse_decode(deserializer: &mut flutter_rust_bridge::for_generated::SseDeserializer) -> Self { - let mut tag_ = ::sse_decode(deserializer); - match tag_ { - 0 => { - let mut var_field0 = ::sse_decode(deserializer); - return crate::api::api::DeleteTarget::Chat(var_field0); - } - 1 => { - let mut var_field0 = >::sse_decode(deserializer); - return crate::api::api::DeleteTarget::Messages(var_field0); - } - _ => { - unimplemented!(""); - } + if (::sse_decode(deserializer)) { + return Some(>::sse_decode(deserializer)); + } else { + return None; } } } -impl SseDecode for crate::api::api::DeviceInfo { +impl SseDecode for Option> { // Codec=Sse (Serialization based), see doc to use other codecs fn sse_decode(deserializer: &mut flutter_rust_bridge::for_generated::SseDeserializer) -> Self { - let mut var_name = ::sse_decode(deserializer); - let mut var_serial = ::sse_decode(deserializer); - let mut var_osVersion = ::sse_decode(deserializer); - let mut var_encodedData = >>::sse_decode(deserializer); - return crate::api::api::DeviceInfo { - name: var_name, - serial: var_serial, - os_version: var_osVersion, - encoded_data: var_encodedData, - }; + if (::sse_decode(deserializer)) { + return Some(>::sse_decode( + deserializer, + )); + } else { + return None; + } } } -impl SseDecode for crate::api::api::EditMessage { +impl SseDecode for Option> { // Codec=Sse (Serialization based), see doc to use other codecs fn sse_decode(deserializer: &mut flutter_rust_bridge::for_generated::SseDeserializer) -> Self { - let mut var_tuuid = ::sse_decode(deserializer); - let mut var_editPart = ::sse_decode(deserializer); - let mut var_newParts = ::sse_decode(deserializer); - return crate::api::api::EditMessage { - tuuid: var_tuuid, - edit_part: var_editPart, - new_parts: var_newParts, - }; + if (::sse_decode(deserializer)) { + return Some(>::sse_decode(deserializer)); + } else { + return None; + } } } -impl SseDecode for crate::api::api::ErrorMessage { +impl SseDecode for crate::api::api::PartExtension { // Codec=Sse (Serialization based), see doc to use other codecs fn sse_decode(deserializer: &mut flutter_rust_bridge::for_generated::SseDeserializer) -> Self { - let mut var_forUuid = ::sse_decode(deserializer); - let mut var_status = ::sse_decode(deserializer); - let mut var_statusStr = ::sse_decode(deserializer); - return crate::api::api::ErrorMessage { - for_uuid: var_forUuid, - status: var_status, - status_str: var_statusStr, - }; + let mut tag_ = ::sse_decode(deserializer); + match tag_ { + 0 => { + let mut var_msgWidth = ::sse_decode(deserializer); + let mut var_rotation = ::sse_decode(deserializer); + let mut var_sai = ::sse_decode(deserializer); + let mut var_scale = ::sse_decode(deserializer); + let mut var_update = >::sse_decode(deserializer); + let mut var_sli = ::sse_decode(deserializer); + let mut var_normalizedX = ::sse_decode(deserializer); + let mut var_normalizedY = ::sse_decode(deserializer); + let mut var_version = ::sse_decode(deserializer); + let mut var_hash = ::sse_decode(deserializer); + let mut var_safi = ::sse_decode(deserializer); + let mut var_effectType = ::sse_decode(deserializer); + let mut var_stickerId = ::sse_decode(deserializer); + return crate::api::api::PartExtension::Sticker { + msg_width: var_msgWidth, + rotation: var_rotation, + sai: var_sai, + scale: var_scale, + update: var_update, + sli: var_sli, + normalized_x: var_normalizedX, + normalized_y: var_normalizedY, + version: var_version, + hash: var_hash, + safi: var_safi, + effect_type: var_effectType, + sticker_id: var_stickerId, + }; + } + _ => { + unimplemented!(""); + } + } } } -impl SseDecode for crate::api::api::ExtensionApp { +impl SseDecode for crate::api::api::Passkey { // Codec=Sse (Serialization based), see doc to use other codecs fn sse_decode(deserializer: &mut flutter_rust_bridge::for_generated::SseDeserializer) -> Self { - let mut var_name = ::sse_decode(deserializer); - let mut var_appId = >::sse_decode(deserializer); - let mut var_bundleId = ::sse_decode(deserializer); - let mut var_balloon = >::sse_decode(deserializer); - return crate::api::api::ExtensionApp { - name: var_name, - app_id: var_appId, - bundle_id: var_bundleId, - balloon: var_balloon, + let mut var_cdat = ::sse_decode(deserializer); + let mut var_mdat = ::sse_decode(deserializer); + let mut var_agrp = ::sse_decode(deserializer); + let mut var_labl = ::sse_decode(deserializer); + let mut var_data = >::sse_decode(deserializer); + let mut var_atag = >::sse_decode(deserializer); + let mut var_klbl = >::sse_decode(deserializer); + return crate::api::api::Passkey { + cdat: var_cdat, + mdat: var_mdat, + agrp: var_agrp, + labl: var_labl, + data: var_data, + atag: var_atag, + klbl: var_klbl, }; } } -impl SseDecode for f32 { +impl SseDecode for crate::api::api::PasswordManagerAltDomain { // Codec=Sse (Serialization based), see doc to use other codecs fn sse_decode(deserializer: &mut flutter_rust_bridge::for_generated::SseDeserializer) -> Self { - deserializer.cursor.read_f32::().unwrap() + let mut var_domain = ::sse_decode(deserializer); + return crate::api::api::PasswordManagerAltDomain { domain: var_domain }; } } -impl SseDecode for f64 { +impl SseDecode for crate::api::api::PasswordManagerMeta { // Codec=Sse (Serialization based), see doc to use other codecs fn sse_decode(deserializer: &mut flutter_rust_bridge::for_generated::SseDeserializer) -> Self { - deserializer.cursor.read_f64::().unwrap() + let mut var_cdat = ::sse_decode(deserializer); + let mut var_mdat = ::sse_decode(deserializer); + let mut var_srvr = ::sse_decode(deserializer); + let mut var_acct = ::sse_decode(deserializer); + let mut var_agrp = ::sse_decode(deserializer); + let mut var_data = >::sse_decode(deserializer); + return crate::api::api::PasswordManagerMeta { + cdat: var_cdat, + mdat: var_mdat, + srvr: var_srvr, + acct: var_acct, + agrp: var_agrp, + data: var_data, + }; } } -impl SseDecode for crate::api::api::FFIFilePackager { +impl SseDecode for crate::api::api::PasswordManagerMetaChange { // Codec=Sse (Serialization based), see doc to use other codecs fn sse_decode(deserializer: &mut flutter_rust_bridge::for_generated::SseDeserializer) -> Self { - return crate::api::api::FFIFilePackager {}; + let mut var_date = ::sse_decode(deserializer); + let mut var_password = >::sse_decode(deserializer); + let mut var_oldPassword = >::sse_decode(deserializer); + let mut var_groupName = >::sse_decode(deserializer); + let mut var_groupId = >::sse_decode(deserializer); + let mut var_shareType = >::sse_decode(deserializer); + let mut var_id = ::sse_decode(deserializer); + let mut var_typ = ::sse_decode(deserializer); + return crate::api::api::PasswordManagerMetaChange { + date: var_date, + password: var_password, + old_password: var_oldPassword, + group_name: var_groupName, + group_id: var_groupId, + share_type: var_shareType, + id: var_id, + typ: var_typ, + }; } } -impl SseDecode for crate::api::api::Follow { +impl SseDecode for crate::api::api::PasswordManagerMetaData { // Codec=Sse (Serialization based), see doc to use other codecs fn sse_decode(deserializer: &mut flutter_rust_bridge::for_generated::SseDeserializer) -> Self { - let mut var_createTimestamp = ::sse_decode(deserializer); - let mut var_expires = ::sse_decode(deserializer); - let mut var_id = ::sse_decode(deserializer); - let mut var_invitationAcceptedHandles = >::sse_decode(deserializer); - let mut var_invitationFromHandles = >::sse_decode(deserializer); - let mut var_isFromMessages = ::sse_decode(deserializer); - let mut var_offerId = >::sse_decode(deserializer); - let mut var_onlyInEvent = ::sse_decode(deserializer); - let mut var_personIdHash = ::sse_decode(deserializer); - let mut var_secureLocationsCapable = ::sse_decode(deserializer); - let mut var_shallowOrLiveSecureLocationsCapable = ::sse_decode(deserializer); - let mut var_source = ::sse_decode(deserializer); - let mut var_tkPermission = ::sse_decode(deserializer); - let mut var_updateTimestamp = ::sse_decode(deserializer); - let mut var_fallbackToLegacyAllowed = >::sse_decode(deserializer); - let mut var_optedNotToShare = >::sse_decode(deserializer); - let mut var_lastLocation = >::sse_decode(deserializer); - let mut var_locateInProgress = ::sse_decode(deserializer); - return crate::api::api::Follow { - create_timestamp: var_createTimestamp, - expires: var_expires, - id: var_id, - invitation_accepted_handles: var_invitationAcceptedHandles, - invitation_from_handles: var_invitationFromHandles, - is_from_messages: var_isFromMessages, - offer_id: var_offerId, - only_in_event: var_onlyInEvent, - person_id_hash: var_personIdHash, - secure_locations_capable: var_secureLocationsCapable, - shallow_or_live_secure_locations_capable: var_shallowOrLiveSecureLocationsCapable, - source: var_source, - tk_permission: var_tkPermission, - update_timestamp: var_updateTimestamp, - fallback_to_legacy_allowed: var_fallbackToLegacyAllowed, - opted_not_to_share: var_optedNotToShare, - last_location: var_lastLocation, - locate_in_progress: var_locateInProgress, + let mut var_history = + >::sse_decode(deserializer); + let mut var_altDomains = + >::sse_decode(deserializer); + let mut var_totp = >::sse_decode(deserializer); + let mut var_ctxt = >::sse_decode(deserializer); + let mut var_title = >>::sse_decode(deserializer); + let mut var_notes = >>::sse_decode(deserializer); + let mut var_formerlyShared = + >::sse_decode( + deserializer, + ); + let mut var_ocpid = >>::sse_decode(deserializer); + return crate::api::api::PasswordManagerMetaData { + history: var_history, + alt_domains: var_altDomains, + totp: var_totp, + ctxt: var_ctxt, + title: var_title, + notes: var_notes, + formerly_shared: var_formerlyShared, + ocpid: var_ocpid, }; } } -impl SseDecode for crate::api::api::FoundDevice { +impl SseDecode for crate::api::api::PasswordManagerMetaDataCtx { // Codec=Sse (Serialization based), see doc to use other codecs fn sse_decode(deserializer: &mut flutter_rust_bridge::for_generated::SseDeserializer) -> Self { - let mut var_deviceModel = >::sse_decode(deserializer); - let mut var_lowPowerMode = >::sse_decode(deserializer); - let mut var_passcodeLength = >::sse_decode(deserializer); - let mut var_id = >::sse_decode(deserializer); - let mut var_batteryStatus = >::sse_decode(deserializer); - let mut var_lostModeCapable = >::sse_decode(deserializer); - let mut var_batteryLevel = >::sse_decode(deserializer); - let mut var_locationEnabled = >::sse_decode(deserializer); - let mut var_isConsideredAccessory = >::sse_decode(deserializer); - let mut var_location = >::sse_decode(deserializer); - let mut var_modelDisplayName = >::sse_decode(deserializer); - let mut var_deviceColor = >::sse_decode(deserializer); - let mut var_activationLocked = >::sse_decode(deserializer); - let mut var_rm2State = >::sse_decode(deserializer); - let mut var_locFoundEnabled = >::sse_decode(deserializer); - let mut var_nwd = >::sse_decode(deserializer); - let mut var_deviceStatus = >::sse_decode(deserializer); - let mut var_fmlyShare = >::sse_decode(deserializer); - let mut var_features = >::sse_decode(deserializer); - let mut var_thisDevice = >::sse_decode(deserializer); - let mut var_lostModeEnabled = >::sse_decode(deserializer); - let mut var_deviceDisplayName = >::sse_decode(deserializer); - let mut var_name = >::sse_decode(deserializer); - let mut var_canWipeAfterLock = >::sse_decode(deserializer); - let mut var_isMac = >::sse_decode(deserializer); - let mut var_rawDeviceModel = >::sse_decode(deserializer); - let mut var_baUuid = >::sse_decode(deserializer); - let mut var_deviceDiscoveryId = >::sse_decode(deserializer); - let mut var_scd = >::sse_decode(deserializer); - let mut var_locationCapable = >::sse_decode(deserializer); - let mut var_wipeInProgress = >::sse_decode(deserializer); - let mut var_darkWake = >::sse_decode(deserializer); - let mut var_deviceWithYou = >::sse_decode(deserializer); - let mut var_maxMsgChar = >::sse_decode(deserializer); - let mut var_deviceClass = >::sse_decode(deserializer); - return crate::api::api::FoundDevice { - device_model: var_deviceModel, - low_power_mode: var_lowPowerMode, - passcode_length: var_passcodeLength, - id: var_id, - battery_status: var_batteryStatus, - lost_mode_capable: var_lostModeCapable, - battery_level: var_batteryLevel, - location_enabled: var_locationEnabled, - is_considered_accessory: var_isConsideredAccessory, - location: var_location, - model_display_name: var_modelDisplayName, - device_color: var_deviceColor, - activation_locked: var_activationLocked, - rm2_state: var_rm2State, - loc_found_enabled: var_locFoundEnabled, - nwd: var_nwd, - device_status: var_deviceStatus, - fmly_share: var_fmlyShare, - features: var_features, - this_device: var_thisDevice, - lost_mode_enabled: var_lostModeEnabled, - device_display_name: var_deviceDisplayName, - name: var_name, - can_wipe_after_lock: var_canWipeAfterLock, - is_mac: var_isMac, - raw_device_model: var_rawDeviceModel, - ba_uuid: var_baUuid, - device_discovery_id: var_deviceDiscoveryId, - scd: var_scd, - location_capable: var_locationCapable, - wipe_in_progress: var_wipeInProgress, - dark_wake: var_darkWake, - device_with_you: var_deviceWithYou, - max_msg_char: var_maxMsgChar, - device_class: var_deviceClass, + let mut var_lastUsed = ::sse_decode(deserializer); + return crate::api::api::PasswordManagerMetaDataCtx { + last_used: var_lastUsed, }; } } -impl SseDecode for crate::api::api::FTMember { +impl SseDecode for crate::api::api::PasswordManagerMetaDataFormerlyShared { // Codec=Sse (Serialization based), see doc to use other codecs fn sse_decode(deserializer: &mut flutter_rust_bridge::for_generated::SseDeserializer) -> Self { - let mut var_nickname = >::sse_decode(deserializer); - let mut var_handle = ::sse_decode(deserializer); - return crate::api::api::FTMember { - nickname: var_nickname, - handle: var_handle, + let mut var_groupName = >::sse_decode(deserializer); + let mut var_passwordManagerCredentialIdentifier = + >::sse_decode(deserializer); + return crate::api::api::PasswordManagerMetaDataFormerlyShared { + group_name: var_groupName, + password_manager_credential_identifier: var_passwordManagerCredentialIdentifier, }; } } -impl SseDecode for crate::api::api::FTMessage { +impl SseDecode for crate::api::api::PasswordManagerTotp { // Codec=Sse (Serialization based), see doc to use other codecs fn sse_decode(deserializer: &mut flutter_rust_bridge::for_generated::SseDeserializer) -> Self { - let mut tag_ = ::sse_decode(deserializer); - match tag_ { - 0 => { - let mut var_field0 = ::sse_decode(deserializer); - return crate::api::api::FTMessage::LetMeInRequest(var_field0); - } - 1 => { - let mut var_guid = ::sse_decode(deserializer); - return crate::api::api::FTMessage::LinkChanged { guid: var_guid }; - } - 2 => { - let mut var_guid = ::sse_decode(deserializer); - let mut var_participant = ::sse_decode(deserializer); - let mut var_handle = ::sse_decode(deserializer); - let mut var_ring = ::sse_decode(deserializer); - return crate::api::api::FTMessage::JoinEvent { - guid: var_guid, - participant: var_participant, - handle: var_handle, - ring: var_ring, - }; - } - 3 => { - let mut var_guid = ::sse_decode(deserializer); - let mut var_members = - >::sse_decode( - deserializer, - ); - let mut var_ring = ::sse_decode(deserializer); - return crate::api::api::FTMessage::AddMembers { - guid: var_guid, - members: var_members, - ring: var_ring, - }; - } - 4 => { - let mut var_guid = ::sse_decode(deserializer); - let mut var_members = - >::sse_decode( - deserializer, - ); - return crate::api::api::FTMessage::RemoveMembers { - guid: var_guid, - members: var_members, - }; - } - 5 => { - let mut var_guid = ::sse_decode(deserializer); - let mut var_participant = ::sse_decode(deserializer); - let mut var_handle = ::sse_decode(deserializer); - return crate::api::api::FTMessage::LeaveEvent { - guid: var_guid, - participant: var_participant, - handle: var_handle, - }; - } - 6 => { - let mut var_guid = ::sse_decode(deserializer); - return crate::api::api::FTMessage::Ring { guid: var_guid }; - } - 7 => { - let mut var_guid = ::sse_decode(deserializer); - return crate::api::api::FTMessage::Decline { guid: var_guid }; - } - 8 => { - let mut var_guid = ::sse_decode(deserializer); - return crate::api::api::FTMessage::RespondedElsewhere { guid: var_guid }; - } - _ => { - unimplemented!(""); - } - } + let mut var_secret = >::sse_decode(deserializer); + let mut var_digits = ::sse_decode(deserializer); + let mut var_issuer = >::sse_decode(deserializer); + let mut var_period = ::sse_decode(deserializer); + let mut var_initialDate = ::sse_decode(deserializer); + let mut var_algorithm = ::sse_decode(deserializer); + let mut var_accountName = >::sse_decode(deserializer); + let mut var_originalUrl = >::sse_decode(deserializer); + return crate::api::api::PasswordManagerTotp { + secret: var_secret, + digits: var_digits, + issuer: var_issuer, + period: var_period, + initial_date: var_initialDate, + algorithm: var_algorithm, + account_name: var_accountName, + original_url: var_originalUrl, + }; } } -impl SseDecode for crate::api::api::FTMode { +impl SseDecode for crate::api::api::PasswordRawEntry { // Codec=Sse (Serialization based), see doc to use other codecs fn sse_decode(deserializer: &mut flutter_rust_bridge::for_generated::SseDeserializer) -> Self { - let mut inner = ::sse_decode(deserializer); - return match inner { - 0 => crate::api::api::FTMode::Outgoing, - 1 => crate::api::api::FTMode::Incoming, - 2 => crate::api::api::FTMode::Missed, - 3 => crate::api::api::FTMode::MissedOutgoing, - _ => unreachable!("Invalid variant for FTMode: {}", inner), + let mut var_cdat = ::sse_decode(deserializer); + let mut var_mdat = ::sse_decode(deserializer); + let mut var_srvr = ::sse_decode(deserializer); + let mut var_acct = ::sse_decode(deserializer); + let mut var_agrp = ::sse_decode(deserializer); + let mut var_data = >::sse_decode(deserializer); + return crate::api::api::PasswordRawEntry { + cdat: var_cdat, + mdat: var_mdat, + srvr: var_srvr, + acct: var_acct, + agrp: var_agrp, + data: var_data, }; } } -impl SseDecode for crate::api::api::FTParticipant { +impl SseDecode for crate::api::api::PermanentDeleteMessage { // Codec=Sse (Serialization based), see doc to use other codecs fn sse_decode(deserializer: &mut flutter_rust_bridge::for_generated::SseDeserializer) -> Self { - let mut var_token = >::sse_decode(deserializer); - let mut var_handle = ::sse_decode(deserializer); - let mut var_participantId = ::sse_decode(deserializer); - let mut var_lastJoinDate = >::sse_decode(deserializer); - let mut var_active = >::sse_decode(deserializer); - return crate::api::api::FTParticipant { - token: var_token, - handle: var_handle, - participant_id: var_participantId, - last_join_date: var_lastJoinDate, - active: var_active, + let mut var_target = ::sse_decode(deserializer); + let mut var_isScheduled = ::sse_decode(deserializer); + return crate::api::api::PermanentDeleteMessage { + target: var_target, + is_scheduled: var_isScheduled, }; } } -impl SseDecode for crate::api::api::FTSession { +impl SseDecode for crate::api::api::PhotoPosterContents { // Codec=Sse (Serialization based), see doc to use other codecs fn sse_decode(deserializer: &mut flutter_rust_bridge::for_generated::SseDeserializer) -> Self { - let mut var_groupId = ::sse_decode(deserializer); - let mut var_myHandles = >::sse_decode(deserializer); - let mut var_participants = >::sse_decode(deserializer); - let mut var_link = >::sse_decode(deserializer); - let mut var_members = - >::sse_decode(deserializer); - let mut var_reportId = ::sse_decode(deserializer); - let mut var_startTime = >::sse_decode(deserializer); - let mut var_lastRekey = >::sse_decode(deserializer); - let mut var_isPropped = ::sse_decode(deserializer); - let mut var_isRingingInaccurate = ::sse_decode(deserializer); - let mut var_mode = >::sse_decode(deserializer); - let mut var_recentMemberAdds = - >::sse_decode(deserializer); - return crate::api::api::FTSession { - group_id: var_groupId, - my_handles: var_myHandles, - participants: var_participants, - link: var_link, - members: var_members, - report_id: var_reportId, - start_time: var_startTime, - last_rekey: var_lastRekey, - is_propped: var_isPropped, - is_ringing_inaccurate: var_isRingingInaccurate, - mode: var_mode, - recent_member_adds: var_recentMemberAdds, + let mut var_version = ::sse_decode(deserializer); + let mut var_layers = >::sse_decode(deserializer); + let mut var_properties = ::sse_decode(deserializer); + return crate::api::api::PhotoPosterContents { + version: var_version, + layers: var_layers, + properties: var_properties, + }; + } +} + +impl SseDecode for crate::api::api::PhotoPosterContentsFrame { + // Codec=Sse (Serialization based), see doc to use other codecs + fn sse_decode(deserializer: &mut flutter_rust_bridge::for_generated::SseDeserializer) -> Self { + let mut var_width = ::sse_decode(deserializer); + let mut var_height = ::sse_decode(deserializer); + let mut var_x = ::sse_decode(deserializer); + let mut var_y = ::sse_decode(deserializer); + return crate::api::api::PhotoPosterContentsFrame { + width: var_width, + height: var_height, + x: var_x, + y: var_y, }; } } -impl SseDecode for crate::api::api::GroupSummary { +impl SseDecode for crate::api::api::PhotoPosterContentsSize { // Codec=Sse (Serialization based), see doc to use other codecs fn sse_decode(deserializer: &mut flutter_rust_bridge::for_generated::SseDeserializer) -> Self { - let mut var_displayName = ::sse_decode(deserializer); - let mut var_isOwner = ::sse_decode(deserializer); - let mut var_members = >::sse_decode(deserializer); - return crate::api::api::GroupSummary { - display_name: var_displayName, - is_owner: var_isOwner, - members: var_members, + let mut var_width = ::sse_decode(deserializer); + let mut var_height = ::sse_decode(deserializer); + return crate::api::api::PhotoPosterContentsSize { + width: var_width, + height: var_height, }; } } -impl SseDecode for crate::api::api::GroupSummaryMember { +impl SseDecode for crate::api::api::PhotoPosterLayer { // Codec=Sse (Serialization based), see doc to use other codecs fn sse_decode(deserializer: &mut flutter_rust_bridge::for_generated::SseDeserializer) -> Self { - let mut var_name = >::sse_decode(deserializer); - let mut var_handle = ::sse_decode(deserializer); - let mut var_userId = >::sse_decode(deserializer); - let mut var_isJoined = ::sse_decode(deserializer); - return crate::api::api::GroupSummaryMember { - name: var_name, - handle: var_handle, - user_id: var_userId, - is_joined: var_isJoined, + let mut var_frame = ::sse_decode(deserializer); + let mut var_filename = ::sse_decode(deserializer); + let mut var_zPosition = ::sse_decode(deserializer); + let mut var_identifier = ::sse_decode(deserializer); + return crate::api::api::PhotoPosterLayer { + frame: var_frame, + filename: var_filename, + z_position: var_zPosition, + identifier: var_identifier, }; } } -impl SseDecode for crate::api::api::HwExtra { +impl SseDecode for crate::api::api::PhotoPosterLayout { // Codec=Sse (Serialization based), see doc to use other codecs fn sse_decode(deserializer: &mut flutter_rust_bridge::for_generated::SseDeserializer) -> Self { - let mut var_version = ::sse_decode(deserializer); - let mut var_protocolVersion = ::sse_decode(deserializer); - let mut var_deviceId = ::sse_decode(deserializer); - let mut var_icloudUa = ::sse_decode(deserializer); - let mut var_aoskitVersion = ::sse_decode(deserializer); - return crate::api::api::HwExtra { - version: var_version, - protocol_version: var_protocolVersion, - device_id: var_deviceId, - icloud_ua: var_icloudUa, - aoskit_version: var_aoskitVersion, + let mut var_clockIntersection = ::sse_decode(deserializer); + let mut var_deviceResolution = + ::sse_decode(deserializer); + let mut var_visibleFrame = + ::sse_decode(deserializer); + let mut var_timeFrame = + ::sse_decode(deserializer); + let mut var_clockLayerOrder = ::sse_decode(deserializer); + let mut var_hasTopEdgeContact = ::sse_decode(deserializer); + let mut var_inactiveFrame = + ::sse_decode(deserializer); + let mut var_imageSize = + ::sse_decode(deserializer); + let mut var_parallaxPadding = + ::sse_decode(deserializer); + return crate::api::api::PhotoPosterLayout { + clock_intersection: var_clockIntersection, + device_resolution: var_deviceResolution, + visible_frame: var_visibleFrame, + time_frame: var_timeFrame, + clock_layer_order: var_clockLayerOrder, + has_top_edge_contact: var_hasTopEdgeContact, + inactive_frame: var_inactiveFrame, + image_size: var_imageSize, + parallax_padding: var_parallaxPadding, }; } } -impl SseDecode for i32 { +impl SseDecode for crate::api::api::PhotoPosterProperties { // Codec=Sse (Serialization based), see doc to use other codecs fn sse_decode(deserializer: &mut flutter_rust_bridge::for_generated::SseDeserializer) -> Self { - deserializer.cursor.read_i32::().unwrap() + let mut var_portraitLayout = ::sse_decode(deserializer); + let mut var_settlingEffectEnabled = ::sse_decode(deserializer); + let mut var_depthEnabled = ::sse_decode(deserializer); + let mut var_clockAreaLuminance = ::sse_decode(deserializer); + let mut var_parallaxDisabled = ::sse_decode(deserializer); + return crate::api::api::PhotoPosterProperties { + portrait_layout: var_portraitLayout, + settling_effect_enabled: var_settlingEffectEnabled, + depth_enabled: var_depthEnabled, + clock_area_luminance: var_clockAreaLuminance, + parallax_disabled: var_parallaxDisabled, + }; } } -impl SseDecode for i64 { +impl SseDecode for crate::api::api::PollResult { // Codec=Sse (Serialization based), see doc to use other codecs fn sse_decode(deserializer: &mut flutter_rust_bridge::for_generated::SseDeserializer) -> Self { - deserializer.cursor.read_i64::().unwrap() + let mut tag_ = ::sse_decode(deserializer); + match tag_ { + 0 => { + return crate::api::api::PollResult::Stop; + } + 1 => { + let mut var_field0 = + >::sse_decode(deserializer); + return crate::api::api::PollResult::Cont(var_field0); + } + _ => { + unimplemented!(""); + } + } } } -impl SseDecode for crate::api::api::IMessageNameRecord { +impl SseDecode for crate::api::api::PosterAsset { // Codec=Sse (Serialization based), see doc to use other codecs fn sse_decode(deserializer: &mut flutter_rust_bridge::for_generated::SseDeserializer) -> Self { - let mut var_name = ::sse_decode(deserializer); - let mut var_first = ::sse_decode(deserializer); - let mut var_last = ::sse_decode(deserializer); - return crate::api::api::IMessageNameRecord { - name: var_name, - first: var_first, - last: var_last, + let mut var_contents = ::sse_decode(deserializer); + let mut var_files = >>::sse_decode(deserializer); + let mut var_uuid = ::sse_decode(deserializer); + return crate::api::api::PosterAsset { + contents: var_contents, + files: var_files, + uuid: var_uuid, }; } } -impl SseDecode for crate::api::api::IMessageNicknameRecord { +impl SseDecode for crate::api::api::PosterColor { // Codec=Sse (Serialization based), see doc to use other codecs fn sse_decode(deserializer: &mut flutter_rust_bridge::for_generated::SseDeserializer) -> Self { - let mut var_name = ::sse_decode(deserializer); - let mut var_image = >>::sse_decode(deserializer); - let mut var_poster = - >::sse_decode(deserializer); - return crate::api::api::IMessageNicknameRecord { - name: var_name, - image: var_image, - poster: var_poster, + let mut var_alpha = ::sse_decode(deserializer); + let mut var_blue = ::sse_decode(deserializer); + let mut var_green = ::sse_decode(deserializer); + let mut var_red = ::sse_decode(deserializer); + return crate::api::api::PosterColor { + alpha: var_alpha, + blue: var_blue, + green: var_green, + red: var_red, }; } } -impl SseDecode for crate::api::api::IMessagePosterRecord { +impl SseDecode for crate::api::api::PosterRole { // Codec=Sse (Serialization based), see doc to use other codecs fn sse_decode(deserializer: &mut flutter_rust_bridge::for_generated::SseDeserializer) -> Self { - let mut var_lowResPoster = >::sse_decode(deserializer); - let mut var_package = >::sse_decode(deserializer); - let mut var_meta = >::sse_decode(deserializer); - return crate::api::api::IMessagePosterRecord { - low_res_poster: var_lowResPoster, - package: var_package, - meta: var_meta, + let mut inner = ::sse_decode(deserializer); + return match inner { + 0 => crate::api::api::PosterRole::PRPosterRoleBackdrop, + 1 => crate::api::api::PosterRole::PRPosterRoleIncomingCall, + _ => unreachable!("Invalid variant for PosterRole: {}", inner), }; } } -impl SseDecode for crate::api::api::IconChangeMessage { +impl SseDecode for crate::api::api::PosterType { // Codec=Sse (Serialization based), see doc to use other codecs fn sse_decode(deserializer: &mut flutter_rust_bridge::for_generated::SseDeserializer) -> Self { - let mut var_file = >::sse_decode(deserializer); - let mut var_groupVersion = ::sse_decode(deserializer); - return crate::api::api::IconChangeMessage { - file: var_file, - group_version: var_groupVersion, - }; + let mut tag_ = ::sse_decode(deserializer); + match tag_ { + 0 => { + let mut var_assets = >::sse_decode(deserializer); + return crate::api::api::PosterType::Photo { assets: var_assets }; + } + 1 => { + let mut var_data = ::sse_decode(deserializer); + let mut var_background = ::sse_decode(deserializer); + return crate::api::api::PosterType::Monogram { + data: var_data, + background: var_background, + }; + } + 2 => { + let mut var_data = ::sse_decode(deserializer); + let mut var_background = ::sse_decode(deserializer); + return crate::api::api::PosterType::Memoji { + data: var_data, + background: var_background, + }; + } + 3 => { + let mut var_data = + ::sse_decode(deserializer); + return crate::api::api::PosterType::TranscriptDynamic { data: var_data }; + } + 4 => { + let mut var_colors = >::sse_decode(deserializer); + return crate::api::api::PosterType::TranscriptGradient { colors: var_colors }; + } + _ => { + unimplemented!(""); + } + } } } -impl SseDecode for crate::api::api::IdmsCircleMessage { +impl SseDecode for crate::api::api::PRPosterColor { // Codec=Sse (Serialization based), see doc to use other codecs fn sse_decode(deserializer: &mut flutter_rust_bridge::for_generated::SseDeserializer) -> Self { - let mut var_step = ::sse_decode(deserializer); - let mut var_atxnid = ::sse_decode(deserializer); - let mut var_pake = >::sse_decode(deserializer); - let mut var_ec = >::sse_decode(deserializer); - let mut var_idmsdata = ::sse_decode(deserializer); - return crate::api::api::IdmsCircleMessage { - step: var_step, - atxnid: var_atxnid, - pake: var_pake, - ec: var_ec, - idmsdata: var_idmsdata, + let mut var_preferredStyle = ::sse_decode(deserializer); + let mut var_identifier = ::sse_decode(deserializer); + let mut var_suggested = ::sse_decode(deserializer); + let mut var_color = ::sse_decode(deserializer); + return crate::api::api::PRPosterColor { + preferred_style: var_preferredStyle, + identifier: var_identifier, + suggested: var_suggested, + color: var_color, }; } } -impl SseDecode for crate::api::api::IdmsMessage { +impl SseDecode for crate::api::api::PRPosterContentMaterialStyle { // Codec=Sse (Serialization based), see doc to use other codecs fn sse_decode(deserializer: &mut flutter_rust_bridge::for_generated::SseDeserializer) -> Self { let mut tag_ = ::sse_decode(deserializer); match tag_ { 0 => { - let mut var_field0 = - ::sse_decode(deserializer); - return crate::api::api::IdmsMessage::RequestedSignIn(var_field0); + let mut var_variation = ::sse_decode(deserializer); + let mut var_colors = >::sse_decode(deserializer); + let mut var_vibrant = ::sse_decode(deserializer); + let mut var_supportsVariation = ::sse_decode(deserializer); + let mut var_needsToResolveVariation = ::sse_decode(deserializer); + return crate::api::api::PRPosterContentMaterialStyle::PRPosterContentDiscreteColorsStyle{variation: var_variation, colors: var_colors, vibrant: var_vibrant, supports_variation: var_supportsVariation, needs_to_resolve_variation: var_needsToResolveVariation}; } 1 => { - let mut var_field0 = ::sse_decode(deserializer); - return crate::api::api::IdmsMessage::TeardownSignIn(var_field0); + return crate::api::api::PRPosterContentMaterialStyle::PRPosterContentVibrantMaterialStyle; } 2 => { - let mut var_field0 = ::sse_decode(deserializer); - let mut var_field1 = - >::sse_decode(deserializer); - return crate::api::api::IdmsMessage::CircleRequest(var_field0, var_field1); + let mut var_gradientType = ::sse_decode(deserializer); + let mut var_colors = >::sse_decode(deserializer); + let mut var_startPoint = ::sse_decode(deserializer); + let mut var_locations = >::sse_decode(deserializer); + let mut var_endPoint = ::sse_decode(deserializer); + return crate::api::api::PRPosterContentMaterialStyle::PRPosterContentGradientStyle{gradient_type: var_gradientType, colors: var_colors, start_point: var_startPoint, locations: var_locations, end_point: var_endPoint}; } _ => { unimplemented!(""); @@ -18470,842 +24378,884 @@ impl SseDecode for crate::api::api::IdmsMessage { } } -impl SseDecode for crate::api::api::IdmsRequestedSignIn { +impl SseDecode for crate::api::api::PRPosterSystemTimeFontConfiguration { // Codec=Sse (Serialization based), see doc to use other codecs fn sse_decode(deserializer: &mut flutter_rust_bridge::for_generated::SseDeserializer) -> Self { - let mut var_aps = ::sse_decode(deserializer); - let mut var_txnid = ::sse_decode(deserializer); - let mut var_akdata = ::sse_decode(deserializer); - let mut var_adsid = ::sse_decode(deserializer); - return crate::api::api::IdmsRequestedSignIn { - aps: var_aps, - txnid: var_txnid, - akdata: var_akdata, - adsid: var_adsid, + let mut var_isSystemItem = ::sse_decode(deserializer); + let mut var_timeFontIdentifier = ::sse_decode(deserializer); + let mut var_weight = ::sse_decode(deserializer); + return crate::api::api::PRPosterSystemTimeFontConfiguration { + is_system_item: var_isSystemItem, + time_font_identifier: var_timeFontIdentifier, + weight: var_weight, }; } } -impl SseDecode for crate::api::api::IndexedMessagePart { +impl SseDecode for crate::api::api::PRPosterTitleStyleConfiguration { // Codec=Sse (Serialization based), see doc to use other codecs fn sse_decode(deserializer: &mut flutter_rust_bridge::for_generated::SseDeserializer) -> Self { - let mut var_part_ = ::sse_decode(deserializer); - let mut var_idx = >::sse_decode(deserializer); - let mut var_ext = >::sse_decode(deserializer); - return crate::api::api::IndexedMessagePart { - part: var_part_, - idx: var_idx, - ext: var_ext, + let mut var_alternateDateEnabled = ::sse_decode(deserializer); + let mut var_contentsLuminence = ::sse_decode(deserializer); + let mut var_groupName = ::sse_decode(deserializer); + let mut var_preferredTitleAlignment = ::sse_decode(deserializer); + let mut var_preferredTitleLayout = ::sse_decode(deserializer); + let mut var_timeFontConfiguration = + ::sse_decode(deserializer); + let mut var_timeNumberingSystem = >>::sse_decode(deserializer); + let mut var_titleColor = ::sse_decode(deserializer); + let mut var_titleContentStyle = >::sse_decode(deserializer); + let mut var_userConfigured = ::sse_decode(deserializer); + let mut var_titleStyle = + >::sse_decode(deserializer); + return crate::api::api::PRPosterTitleStyleConfiguration { + alternate_date_enabled: var_alternateDateEnabled, + contents_luminence: var_contentsLuminence, + group_name: var_groupName, + preferred_title_alignment: var_preferredTitleAlignment, + preferred_title_layout: var_preferredTitleLayout, + time_font_configuration: var_timeFontConfiguration, + time_numbering_system: var_timeNumberingSystem, + title_color: var_titleColor, + title_content_style: var_titleContentStyle, + user_configured: var_userConfigured, + title_style: var_titleStyle, }; } } -impl SseDecode for crate::api::api::LetMeInRequest { +impl SseDecode for crate::api::api::PrivateDeviceInfo { // Codec=Sse (Serialization based), see doc to use other codecs fn sse_decode(deserializer: &mut flutter_rust_bridge::for_generated::SseDeserializer) -> Self { - let mut var_sharedSecret = >::sse_decode(deserializer); - let mut var_pseud = ::sse_decode(deserializer); - let mut var_requestor = ::sse_decode(deserializer); - let mut var_nickname = >::sse_decode(deserializer); + let mut var_uuid = >::sse_decode(deserializer); + let mut var_deviceName = >::sse_decode(deserializer); let mut var_token = >::sse_decode(deserializer); - let mut var_delegationUuid = >::sse_decode(deserializer); - let mut var_usage = >::sse_decode(deserializer); - return crate::api::api::LetMeInRequest { - shared_secret: var_sharedSecret, - pseud: var_pseud, - requestor: var_requestor, - nickname: var_nickname, + let mut var_isHsaTrusted = ::sse_decode(deserializer); + let mut var_identites = >::sse_decode(deserializer); + let mut var_subServices = >::sse_decode(deserializer); + return crate::api::api::PrivateDeviceInfo { + uuid: var_uuid, + device_name: var_deviceName, token: var_token, - delegation_uuid: var_delegationUuid, - usage: var_usage, + is_hsa_trusted: var_isHsaTrusted, + identites: var_identites, + sub_services: var_subServices, }; } } -impl SseDecode for crate::api::api::LinkMeta { +impl SseDecode for crate::api::api::ProvisionedFlavor { // Codec=Sse (Serialization based), see doc to use other codecs fn sse_decode(deserializer: &mut flutter_rust_bridge::for_generated::SseDeserializer) -> Self { - let mut var_data = ::sse_decode(deserializer); - let mut var_attachments = >>::sse_decode(deserializer); - return crate::api::api::LinkMeta { - data: var_data, - attachments: var_attachments, + let mut inner = ::sse_decode(deserializer); + return match inner { + 0 => crate::api::api::ProvisionedFlavor::Mac, + 1 => crate::api::api::ProvisionedFlavor::IOS, + _ => unreachable!("Invalid variant for ProvisionedFlavor: {}", inner), }; } } -impl SseDecode for Vec { +impl SseDecode for crate::api::api::PushMessage { // Codec=Sse (Serialization based), see doc to use other codecs fn sse_decode(deserializer: &mut flutter_rust_bridge::for_generated::SseDeserializer) -> Self { - let mut len_ = ::sse_decode(deserializer); - let mut ans_ = vec![]; - for idx_ in 0..len_ { - ans_.push(::sse_decode(deserializer)); + let mut tag_ = ::sse_decode(deserializer); + match tag_ { + 0 => { + let mut var_field0 = ::sse_decode(deserializer); + return crate::api::api::PushMessage::IMessage(var_field0); + } + 1 => { + let mut var_uuid = ::sse_decode(deserializer); + let mut var_error = >::sse_decode(deserializer); + return crate::api::api::PushMessage::SendConfirm { + uuid: var_uuid, + error: var_error, + }; + } + 2 => { + let mut var_field0 = ::sse_decode(deserializer); + return crate::api::api::PushMessage::RegistrationState(var_field0); + } + 3 => { + let mut var_field0 = ::sse_decode(deserializer); + return crate::api::api::PushMessage::NewPhotostream(var_field0); + } + 4 => { + let mut var_field0 = ::sse_decode(deserializer); + return crate::api::api::PushMessage::FaceTime(var_field0); + } + 5 => { + let mut var_field0 = ::sse_decode(deserializer); + return crate::api::api::PushMessage::StatusUpdate(var_field0); + } + 6 => { + let mut var_field0 = ::sse_decode(deserializer); + return crate::api::api::PushMessage::Idms(var_field0); + } + 7 => { + let mut var_field0 = ::sse_decode(deserializer); + return crate::api::api::PushMessage::TwoFaAuthEvent(var_field0); + } + 8 => { + return crate::api::api::PushMessage::CircleFinishEvent; + } + 9 => { + let mut var_sender = ::sse_decode(deserializer); + let mut var_beacon = ::sse_decode(deserializer); + let mut var_attributes = + ::sse_decode(deserializer); + return crate::api::api::PushMessage::BeaconShared { + sender: var_sender, + beacon: var_beacon, + attributes: var_attributes, + }; + } + _ => { + unimplemented!(""); + } } - return ans_; } } -impl SseDecode for Vec { +impl SseDecode for crate::api::api::QuotaInfo { // Codec=Sse (Serialization based), see doc to use other codecs fn sse_decode(deserializer: &mut flutter_rust_bridge::for_generated::SseDeserializer) -> Self { - let mut len_ = ::sse_decode(deserializer); - let mut ans_ = vec![]; - for idx_ in 0..len_ { - ans_.push(::sse_decode(deserializer)); + let mut var_totalBytes = ::sse_decode(deserializer); + let mut var_availableBytes = ::sse_decode(deserializer); + let mut var_messagesBytes = ::sse_decode(deserializer); + return crate::api::api::QuotaInfo { + total_bytes: var_totalBytes, + available_bytes: var_availableBytes, + messages_bytes: var_messagesBytes, + }; + } +} + +impl SseDecode for crate::api::api::ReactMessage { + // Codec=Sse (Serialization based), see doc to use other codecs + fn sse_decode(deserializer: &mut flutter_rust_bridge::for_generated::SseDeserializer) -> Self { + let mut var_toUuid = ::sse_decode(deserializer); + let mut var_toPart = >::sse_decode(deserializer); + let mut var_reaction = ::sse_decode(deserializer); + let mut var_toText = ::sse_decode(deserializer); + let mut var_embeddedProfile = + >::sse_decode(deserializer); + return crate::api::api::ReactMessage { + to_uuid: var_toUuid, + to_part: var_toPart, + reaction: var_reaction, + to_text: var_toText, + embedded_profile: var_embeddedProfile, + }; + } +} + +impl SseDecode for crate::api::api::ReactMessageType { + // Codec=Sse (Serialization based), see doc to use other codecs + fn sse_decode(deserializer: &mut flutter_rust_bridge::for_generated::SseDeserializer) -> Self { + let mut tag_ = ::sse_decode(deserializer); + match tag_ { + 0 => { + let mut var_reaction = ::sse_decode(deserializer); + let mut var_enable = ::sse_decode(deserializer); + return crate::api::api::ReactMessageType::React { + reaction: var_reaction, + enable: var_enable, + }; + } + 1 => { + let mut var_spec = ::sse_decode(deserializer); + let mut var_body = ::sse_decode(deserializer); + let mut var_isMeta = ::sse_decode(deserializer); + return crate::api::api::ReactMessageType::Extension { + spec: var_spec, + body: var_body, + is_meta: var_isMeta, + }; + } + _ => { + unimplemented!(""); + } + } + } +} + +impl SseDecode for crate::api::api::Reaction { + // Codec=Sse (Serialization based), see doc to use other codecs + fn sse_decode(deserializer: &mut flutter_rust_bridge::for_generated::SseDeserializer) -> Self { + let mut tag_ = ::sse_decode(deserializer); + match tag_ { + 0 => { + return crate::api::api::Reaction::Heart; + } + 1 => { + return crate::api::api::Reaction::Like; + } + 2 => { + return crate::api::api::Reaction::Dislike; + } + 3 => { + return crate::api::api::Reaction::Laugh; + } + 4 => { + return crate::api::api::Reaction::Emphasize; + } + 5 => { + return crate::api::api::Reaction::Question; + } + 6 => { + let mut var_field0 = ::sse_decode(deserializer); + return crate::api::api::Reaction::Emoji(var_field0); + } + 7 => { + let mut var_spec = + >::sse_decode(deserializer); + let mut var_body = ::sse_decode(deserializer); + return crate::api::api::Reaction::Sticker { + spec: var_spec, + body: var_body, + }; + } + _ => { + unimplemented!(""); + } } - return ans_; } } -impl SseDecode for Vec { +impl SseDecode for (APSConnection, Option) { // Codec=Sse (Serialization based), see doc to use other codecs fn sse_decode(deserializer: &mut flutter_rust_bridge::for_generated::SseDeserializer) -> Self { - let mut len_ = ::sse_decode(deserializer); - let mut ans_ = vec![]; - for idx_ in 0..len_ { - ans_.push(::sse_decode(deserializer)); - } - return ans_; + let mut var_field0 = ::sse_decode(deserializer); + let mut var_field1 = >::sse_decode(deserializer); + return (var_field0, var_field1); } } -impl SseDecode for Vec { +impl SseDecode + for ( + Arc>>, + crate::api::api::LoginState, + ) +{ // Codec=Sse (Serialization based), see doc to use other codecs fn sse_decode(deserializer: &mut flutter_rust_bridge::for_generated::SseDeserializer) -> Self { - let mut len_ = ::sse_decode(deserializer); - let mut ans_ = vec![]; - for idx_ in 0..len_ { - ans_.push(::sse_decode(deserializer)); - } - return ans_; + let mut var_field0 = + >>>::sse_decode(deserializer); + let mut var_field1 = ::sse_decode(deserializer); + return (var_field0, var_field1); } } -impl SseDecode for Vec { +impl SseDecode for (Arc, crate::api::api::SharedPushState) { // Codec=Sse (Serialization based), see doc to use other codecs fn sse_decode(deserializer: &mut flutter_rust_bridge::for_generated::SseDeserializer) -> Self { - let mut len_ = ::sse_decode(deserializer); - let mut ans_ = vec![]; - for idx_ in 0..len_ { - ans_.push(::sse_decode( - deserializer, - )); - } - return ans_; + let mut var_field0 = >::sse_decode(deserializer); + let mut var_field1 = ::sse_decode(deserializer); + return (var_field0, var_field1); } } -impl SseDecode for Vec { +impl SseDecode + for ( + CircleClientSession, + crate::api::api::LoginState, + Option, + ) +{ // Codec=Sse (Serialization based), see doc to use other codecs fn sse_decode(deserializer: &mut flutter_rust_bridge::for_generated::SseDeserializer) -> Self { - let mut len_ = ::sse_decode(deserializer); - let mut ans_ = vec![]; - for idx_ in 0..len_ { - ans_.push(::sse_decode(deserializer)); - } - return ans_; + let mut var_field0 = + >::sse_decode(deserializer); + let mut var_field1 = ::sse_decode(deserializer); + let mut var_field2 = >::sse_decode(deserializer); + return (var_field0, var_field1, var_field2); } } -impl SseDecode for Vec { +impl SseDecode for (Sender<()>, Arc>, APSWatcher) { // Codec=Sse (Serialization based), see doc to use other codecs fn sse_decode(deserializer: &mut flutter_rust_bridge::for_generated::SseDeserializer) -> Self { - let mut len_ = ::sse_decode(deserializer); - let mut ans_ = vec![]; - for idx_ in 0..len_ { - ans_.push(::sse_decode(deserializer)); - } - return ans_; + let mut var_field0 = >::sse_decode(deserializer); + let mut var_field1 = >>::sse_decode(deserializer); + let mut var_field2 = ::sse_decode(deserializer); + return (var_field0, var_field1, var_field2); } } -impl SseDecode for Vec { +impl SseDecode + for ( + Vec, + std::collections::HashMap>, + i32, + ) +{ // Codec=Sse (Serialization based), see doc to use other codecs fn sse_decode(deserializer: &mut flutter_rust_bridge::for_generated::SseDeserializer) -> Self { - let mut len_ = ::sse_decode(deserializer); - let mut ans_ = vec![]; - for idx_ in 0..len_ { - ans_.push(::sse_decode(deserializer)); - } - return ans_; + let mut var_field0 = >::sse_decode(deserializer); + let mut var_field1 = , + >>::sse_decode(deserializer); + let mut var_field2 = ::sse_decode(deserializer); + return (var_field0, var_field1, var_field2); } } -impl SseDecode for Vec { +impl SseDecode + for ( + Vec, + std::collections::HashMap>, + i32, + ) +{ // Codec=Sse (Serialization based), see doc to use other codecs fn sse_decode(deserializer: &mut flutter_rust_bridge::for_generated::SseDeserializer) -> Self { - let mut len_ = ::sse_decode(deserializer); - let mut ans_ = vec![]; - for idx_ in 0..len_ { - ans_.push(::sse_decode(deserializer)); - } - return ans_; + let mut var_field0 = >::sse_decode(deserializer); + let mut var_field1 = + >>::sse_decode( + deserializer, + ); + let mut var_field2 = ::sse_decode(deserializer); + return (var_field0, var_field1, var_field2); } } -impl SseDecode for Vec { +impl SseDecode + for ( + Vec, + std::collections::HashMap>, + i32, + ) +{ // Codec=Sse (Serialization based), see doc to use other codecs fn sse_decode(deserializer: &mut flutter_rust_bridge::for_generated::SseDeserializer) -> Self { - let mut len_ = ::sse_decode(deserializer); - let mut ans_ = vec![]; - for idx_ in 0..len_ { - ans_.push(::sse_decode(deserializer)); - } - return ans_; + let mut var_field0 = >::sse_decode(deserializer); + let mut var_field1 = , + >>::sse_decode(deserializer); + let mut var_field2 = ::sse_decode(deserializer); + return (var_field0, var_field1, var_field2); } } -impl SseDecode for Vec { +impl SseDecode for (Vec, Option>) { // Codec=Sse (Serialization based), see doc to use other codecs fn sse_decode(deserializer: &mut flutter_rust_bridge::for_generated::SseDeserializer) -> Self { - let mut len_ = ::sse_decode(deserializer); - let mut ans_ = vec![]; - for idx_ in 0..len_ { - ans_.push(::sse_decode( - deserializer, - )); - } - return ans_; + let mut var_field0 = >::sse_decode(deserializer); + let mut var_field1 = >>::sse_decode(deserializer); + return (var_field0, var_field1); } } -impl SseDecode for Vec { +impl SseDecode for (Vec, Vec) { // Codec=Sse (Serialization based), see doc to use other codecs fn sse_decode(deserializer: &mut flutter_rust_bridge::for_generated::SseDeserializer) -> Self { - let mut len_ = ::sse_decode(deserializer); - let mut ans_ = vec![]; - for idx_ in 0..len_ { - ans_.push(::sse_decode( - deserializer, - )); - } - return ans_; + let mut var_field0 = >::sse_decode(deserializer); + let mut var_field1 = >::sse_decode(deserializer); + return (var_field0, var_field1); } } -impl SseDecode for Vec> { +impl SseDecode + for ( + Vec, + Option, + ) +{ // Codec=Sse (Serialization based), see doc to use other codecs fn sse_decode(deserializer: &mut flutter_rust_bridge::for_generated::SseDeserializer) -> Self { - let mut len_ = ::sse_decode(deserializer); - let mut ans_ = vec![]; - for idx_ in 0..len_ { - ans_.push(>::sse_decode(deserializer)); - } - return ans_; + let mut var_field0 = >::sse_decode(deserializer); + let mut var_field1 = >::sse_decode(deserializer); + return (var_field0, var_field1); } } -impl SseDecode for Vec { +impl SseDecode for (crate::api::api::LoginState, Option) { // Codec=Sse (Serialization based), see doc to use other codecs fn sse_decode(deserializer: &mut flutter_rust_bridge::for_generated::SseDeserializer) -> Self { - let mut len_ = ::sse_decode(deserializer); - let mut ans_ = vec![]; - for idx_ in 0..len_ { - ans_.push(::sse_decode(deserializer)); - } - return ans_; + let mut var_field0 = ::sse_decode(deserializer); + let mut var_field1 = >::sse_decode(deserializer); + return (var_field0, var_field1); } } -impl SseDecode for Vec { +impl SseDecode + for ( + std::collections::HashMap, + Option<(String, u64)>, + ) +{ // Codec=Sse (Serialization based), see doc to use other codecs fn sse_decode(deserializer: &mut flutter_rust_bridge::for_generated::SseDeserializer) -> Self { - let mut len_ = ::sse_decode(deserializer); - let mut ans_ = vec![]; - for idx_ in 0..len_ { - ans_.push(::sse_decode(deserializer)); - } - return ans_; + let mut var_field0 = + >::sse_decode( + deserializer, + ); + let mut var_field1 = >::sse_decode(deserializer); + return (var_field0, var_field1); } } -impl SseDecode for Vec { +impl SseDecode for (Option>, Option) { // Codec=Sse (Serialization based), see doc to use other codecs fn sse_decode(deserializer: &mut flutter_rust_bridge::for_generated::SseDeserializer) -> Self { - let mut len_ = ::sse_decode(deserializer); - let mut ans_ = vec![]; - for idx_ in 0..len_ { - ans_.push(::sse_decode( - deserializer, - )); - } - return ans_; + let mut var_field0 = >>::sse_decode(deserializer); + let mut var_field1 = >::sse_decode(deserializer); + return (var_field0, var_field1); } } -impl SseDecode for Vec { +impl SseDecode for (Option, crate::api::api::Passkey) { // Codec=Sse (Serialization based), see doc to use other codecs fn sse_decode(deserializer: &mut flutter_rust_bridge::for_generated::SseDeserializer) -> Self { - let mut len_ = ::sse_decode(deserializer); - let mut ans_ = vec![]; - for idx_ in 0..len_ { - ans_.push(::sse_decode( - deserializer, - )); - } - return ans_; + let mut var_field0 = >::sse_decode(deserializer); + let mut var_field1 = ::sse_decode(deserializer); + return (var_field0, var_field1); } } -impl SseDecode for Vec { +impl SseDecode for (Option, crate::api::api::PasswordManagerMeta) { // Codec=Sse (Serialization based), see doc to use other codecs fn sse_decode(deserializer: &mut flutter_rust_bridge::for_generated::SseDeserializer) -> Self { - let mut len_ = ::sse_decode(deserializer); - let mut ans_ = vec![]; - for idx_ in 0..len_ { - ans_.push(::sse_decode( - deserializer, - )); - } - return ans_; + let mut var_field0 = >::sse_decode(deserializer); + let mut var_field1 = ::sse_decode(deserializer); + return (var_field0, var_field1); } } -impl SseDecode for Vec { +impl SseDecode for (Option, crate::api::api::PasswordRawEntry) { // Codec=Sse (Serialization based), see doc to use other codecs fn sse_decode(deserializer: &mut flutter_rust_bridge::for_generated::SseDeserializer) -> Self { - let mut len_ = ::sse_decode(deserializer); - let mut ans_ = vec![]; - for idx_ in 0..len_ { - ans_.push(::sse_decode(deserializer)); - } - return ans_; + let mut var_field0 = >::sse_decode(deserializer); + let mut var_field1 = ::sse_decode(deserializer); + return (var_field0, var_field1); } } -impl SseDecode for Vec { +impl SseDecode for (Option, crate::api::api::WifiPassword) { // Codec=Sse (Serialization based), see doc to use other codecs fn sse_decode(deserializer: &mut flutter_rust_bridge::for_generated::SseDeserializer) -> Self { - let mut len_ = ::sse_decode(deserializer); - let mut ans_ = vec![]; - for idx_ in 0..len_ { - ans_.push(::sse_decode(deserializer)); - } - return ans_; + let mut var_field0 = >::sse_decode(deserializer); + let mut var_field1 = ::sse_decode(deserializer); + return (var_field0, var_field1); } } -impl SseDecode for Vec { +impl SseDecode for (crate::api::api::SharedPushState, APSWatcher) { // Codec=Sse (Serialization based), see doc to use other codecs fn sse_decode(deserializer: &mut flutter_rust_bridge::for_generated::SseDeserializer) -> Self { - let mut len_ = ::sse_decode(deserializer); - let mut ans_ = vec![]; - for idx_ in 0..len_ { - ans_.push(::sse_decode(deserializer)); - } - return ans_; + let mut var_field0 = ::sse_decode(deserializer); + let mut var_field1 = ::sse_decode(deserializer); + return (var_field0, var_field1); } } -impl SseDecode for Vec { +impl SseDecode for (String, Asset) { // Codec=Sse (Serialization based), see doc to use other codecs fn sse_decode(deserializer: &mut flutter_rust_bridge::for_generated::SseDeserializer) -> Self { - let mut len_ = ::sse_decode(deserializer); - let mut ans_ = vec![]; - for idx_ in 0..len_ { - ans_.push(::sse_decode(deserializer)); - } - return ans_; + let mut var_field0 = ::sse_decode(deserializer); + let mut var_field1 = ::sse_decode(deserializer); + return (var_field0, var_field1); } } -impl SseDecode for Vec { +impl SseDecode for (String, StCollapsedValue) { // Codec=Sse (Serialization based), see doc to use other codecs fn sse_decode(deserializer: &mut flutter_rust_bridge::for_generated::SseDeserializer) -> Self { - let mut len_ = ::sse_decode(deserializer); - let mut ans_ = vec![]; - for idx_ in 0..len_ { - ans_.push(::sse_decode(deserializer)); - } - return ans_; + let mut var_field0 = ::sse_decode(deserializer); + let mut var_field1 = ::sse_decode(deserializer); + return (var_field0, var_field1); } } -impl SseDecode for Vec { +impl SseDecode for (String, bool) { // Codec=Sse (Serialization based), see doc to use other codecs fn sse_decode(deserializer: &mut flutter_rust_bridge::for_generated::SseDeserializer) -> Self { - let mut len_ = ::sse_decode(deserializer); - let mut ans_ = vec![]; - for idx_ in 0..len_ { - ans_.push(::sse_decode(deserializer)); - } - return ans_; + let mut var_field0 = ::sse_decode(deserializer); + let mut var_field1 = ::sse_decode(deserializer); + return (var_field0, var_field1); } } -impl SseDecode for Vec { +impl SseDecode for (String, u64) { // Codec=Sse (Serialization based), see doc to use other codecs fn sse_decode(deserializer: &mut flutter_rust_bridge::for_generated::SseDeserializer) -> Self { - let mut len_ = ::sse_decode(deserializer); - let mut ans_ = vec![]; - for idx_ in 0..len_ { - ans_.push(::sse_decode( - deserializer, - )); - } - return ans_; + let mut var_field0 = ::sse_decode(deserializer); + let mut var_field1 = ::sse_decode(deserializer); + return (var_field0, var_field1); } } -impl SseDecode for Vec<(String, Asset)> { +impl SseDecode for (String, crate::api::api::CloudAttachment) { // Codec=Sse (Serialization based), see doc to use other codecs fn sse_decode(deserializer: &mut flutter_rust_bridge::for_generated::SseDeserializer) -> Self { - let mut len_ = ::sse_decode(deserializer); - let mut ans_ = vec![]; - for idx_ in 0..len_ { - ans_.push(<(String, Asset)>::sse_decode(deserializer)); - } - return ans_; + let mut var_field0 = ::sse_decode(deserializer); + let mut var_field1 = ::sse_decode(deserializer); + return (var_field0, var_field1); } } -impl SseDecode for Vec<(String, StCollapsedValue)> { +impl SseDecode for (String, crate::api::api::CloudChat) { // Codec=Sse (Serialization based), see doc to use other codecs fn sse_decode(deserializer: &mut flutter_rust_bridge::for_generated::SseDeserializer) -> Self { - let mut len_ = ::sse_decode(deserializer); - let mut ans_ = vec![]; - for idx_ in 0..len_ { - ans_.push(<(String, StCollapsedValue)>::sse_decode(deserializer)); - } - return ans_; + let mut var_field0 = ::sse_decode(deserializer); + let mut var_field1 = ::sse_decode(deserializer); + return (var_field0, var_field1); } } -impl SseDecode for Vec<(String, bool)> { +impl SseDecode for (String, crate::api::api::CloudMessage) { // Codec=Sse (Serialization based), see doc to use other codecs fn sse_decode(deserializer: &mut flutter_rust_bridge::for_generated::SseDeserializer) -> Self { - let mut len_ = ::sse_decode(deserializer); - let mut ans_ = vec![]; - for idx_ in 0..len_ { - ans_.push(<(String, bool)>::sse_decode(deserializer)); - } - return ans_; + let mut var_field0 = ::sse_decode(deserializer); + let mut var_field1 = ::sse_decode(deserializer); + return (var_field0, var_field1); } } -impl SseDecode for Vec<(String, u64)> { +impl SseDecode for (String, crate::api::api::FTParticipant) { // Codec=Sse (Serialization based), see doc to use other codecs fn sse_decode(deserializer: &mut flutter_rust_bridge::for_generated::SseDeserializer) -> Self { - let mut len_ = ::sse_decode(deserializer); - let mut ans_ = vec![]; - for idx_ in 0..len_ { - ans_.push(<(String, u64)>::sse_decode(deserializer)); - } - return ans_; + let mut var_field0 = ::sse_decode(deserializer); + let mut var_field1 = ::sse_decode(deserializer); + return (var_field0, var_field1); } } -impl SseDecode for Vec<(String, crate::api::api::CloudAttachment)> { +impl SseDecode for (String, crate::api::api::GroupSummary) { // Codec=Sse (Serialization based), see doc to use other codecs fn sse_decode(deserializer: &mut flutter_rust_bridge::for_generated::SseDeserializer) -> Self { - let mut len_ = ::sse_decode(deserializer); - let mut ans_ = vec![]; - for idx_ in 0..len_ { - ans_.push(<(String, crate::api::api::CloudAttachment)>::sse_decode( - deserializer, - )); - } - return ans_; + let mut var_field0 = ::sse_decode(deserializer); + let mut var_field1 = ::sse_decode(deserializer); + return (var_field0, var_field1); } } -impl SseDecode for Vec<(String, crate::api::api::CloudChat)> { +impl SseDecode for (String, Vec) { // Codec=Sse (Serialization based), see doc to use other codecs fn sse_decode(deserializer: &mut flutter_rust_bridge::for_generated::SseDeserializer) -> Self { - let mut len_ = ::sse_decode(deserializer); - let mut ans_ = vec![]; - for idx_ in 0..len_ { - ans_.push(<(String, crate::api::api::CloudChat)>::sse_decode( - deserializer, - )); - } - return ans_; + let mut var_field0 = ::sse_decode(deserializer); + let mut var_field1 = >::sse_decode(deserializer); + return (var_field0, var_field1); } } -impl SseDecode for Vec<(String, crate::api::api::CloudMessage)> { +impl SseDecode for (String, Vec) { // Codec=Sse (Serialization based), see doc to use other codecs fn sse_decode(deserializer: &mut flutter_rust_bridge::for_generated::SseDeserializer) -> Self { - let mut len_ = ::sse_decode(deserializer); - let mut ans_ = vec![]; - for idx_ in 0..len_ { - ans_.push(<(String, crate::api::api::CloudMessage)>::sse_decode( - deserializer, - )); - } - return ans_; + let mut var_field0 = ::sse_decode(deserializer); + let mut var_field1 = >::sse_decode(deserializer); + return (var_field0, var_field1); } } -impl SseDecode for Vec<(String, crate::api::api::FTParticipant)> { +impl SseDecode + for ( + String, + std::collections::HashMap, + std::collections::HashMap, + ) +{ // Codec=Sse (Serialization based), see doc to use other codecs fn sse_decode(deserializer: &mut flutter_rust_bridge::for_generated::SseDeserializer) -> Self { - let mut len_ = ::sse_decode(deserializer); - let mut ans_ = vec![]; - for idx_ in 0..len_ { - ans_.push(<(String, crate::api::api::FTParticipant)>::sse_decode( + let mut var_field0 = ::sse_decode(deserializer); + let mut var_field1 = + >::sse_decode( deserializer, - )); - } - return ans_; + ); + let mut var_field2 = >::sse_decode(deserializer); + return (var_field0, var_field1, var_field2); } } -impl SseDecode for Vec<(String, crate::api::api::GroupSummary)> { +impl SseDecode for (String, crate::api::api::MessageEditRange) { // Codec=Sse (Serialization based), see doc to use other codecs fn sse_decode(deserializer: &mut flutter_rust_bridge::for_generated::SseDeserializer) -> Self { - let mut len_ = ::sse_decode(deserializer); - let mut ans_ = vec![]; - for idx_ in 0..len_ { - ans_.push(<(String, crate::api::api::GroupSummary)>::sse_decode( - deserializer, - )); - } - return ans_; + let mut var_field0 = ::sse_decode(deserializer); + let mut var_field1 = ::sse_decode(deserializer); + return (var_field0, var_field1); } } -impl SseDecode for Vec<(String, Vec)> { +impl SseDecode for (String, Option) { // Codec=Sse (Serialization based), see doc to use other codecs fn sse_decode(deserializer: &mut flutter_rust_bridge::for_generated::SseDeserializer) -> Self { - let mut len_ = ::sse_decode(deserializer); - let mut ans_ = vec![]; - for idx_ in 0..len_ { - ans_.push(<(String, Vec)>::sse_decode( - deserializer, - )); - } - return ans_; + let mut var_field0 = ::sse_decode(deserializer); + let mut var_field1 = >::sse_decode(deserializer); + return (var_field0, var_field1); } } -impl SseDecode for Vec<(String, Vec)> { +impl SseDecode for (String, Option) { // Codec=Sse (Serialization based), see doc to use other codecs fn sse_decode(deserializer: &mut flutter_rust_bridge::for_generated::SseDeserializer) -> Self { - let mut len_ = ::sse_decode(deserializer); - let mut ans_ = vec![]; - for idx_ in 0..len_ { - ans_.push(<(String, Vec)>::sse_decode(deserializer)); - } - return ans_; + let mut var_field0 = ::sse_decode(deserializer); + let mut var_field1 = >::sse_decode(deserializer); + return (var_field0, var_field1); } } -impl SseDecode for Vec<(String, crate::api::api::MessageEditRange)> { +impl SseDecode for (String, Option) { // Codec=Sse (Serialization based), see doc to use other codecs fn sse_decode(deserializer: &mut flutter_rust_bridge::for_generated::SseDeserializer) -> Self { - let mut len_ = ::sse_decode(deserializer); - let mut ans_ = vec![]; - for idx_ in 0..len_ { - ans_.push(<(String, crate::api::api::MessageEditRange)>::sse_decode( - deserializer, - )); - } - return ans_; + let mut var_field0 = ::sse_decode(deserializer); + let mut var_field1 = >::sse_decode(deserializer); + return (var_field0, var_field1); } } -impl SseDecode for Vec<(String, Option)> { +impl SseDecode for (String, crate::api::api::PasswordManagerMetaDataCtx) { // Codec=Sse (Serialization based), see doc to use other codecs fn sse_decode(deserializer: &mut flutter_rust_bridge::for_generated::SseDeserializer) -> Self { - let mut len_ = ::sse_decode(deserializer); - let mut ans_ = vec![]; - for idx_ in 0..len_ { - ans_.push( - <(String, Option)>::sse_decode(deserializer), - ); - } - return ans_; + let mut var_field0 = ::sse_decode(deserializer); + let mut var_field1 = + ::sse_decode(deserializer); + return (var_field0, var_field1); } } -impl SseDecode for Vec<(String, Option)> { +impl SseDecode for (String, (Option, crate::api::api::Passkey)) { // Codec=Sse (Serialization based), see doc to use other codecs fn sse_decode(deserializer: &mut flutter_rust_bridge::for_generated::SseDeserializer) -> Self { - let mut len_ = ::sse_decode(deserializer); - let mut ans_ = vec![]; - for idx_ in 0..len_ { - ans_.push(<(String, Option)>::sse_decode( - deserializer, - )); - } - return ans_; + let mut var_field0 = ::sse_decode(deserializer); + let mut var_field1 = <(Option, crate::api::api::Passkey)>::sse_decode(deserializer); + return (var_field0, var_field1); } } -impl SseDecode for Vec<(String, Option)> { +impl SseDecode + for ( + String, + (Option, crate::api::api::PasswordManagerMeta), + ) +{ // Codec=Sse (Serialization based), see doc to use other codecs fn sse_decode(deserializer: &mut flutter_rust_bridge::for_generated::SseDeserializer) -> Self { - let mut len_ = ::sse_decode(deserializer); - let mut ans_ = vec![]; - for idx_ in 0..len_ { - ans_.push(<(String, Option)>::sse_decode(deserializer)); - } - return ans_; + let mut var_field0 = ::sse_decode(deserializer); + let mut var_field1 = + <(Option, crate::api::api::PasswordManagerMeta)>::sse_decode(deserializer); + return (var_field0, var_field1); } } -impl SseDecode for Vec<(String, crate::api::api::PasswordManagerMetaDataCtx)> { +impl SseDecode for (String, (Option, crate::api::api::PasswordRawEntry)) { // Codec=Sse (Serialization based), see doc to use other codecs fn sse_decode(deserializer: &mut flutter_rust_bridge::for_generated::SseDeserializer) -> Self { - let mut len_ = ::sse_decode(deserializer); - let mut ans_ = vec![]; - for idx_ in 0..len_ { - ans_.push( - <(String, crate::api::api::PasswordManagerMetaDataCtx)>::sse_decode(deserializer), - ); - } - return ans_; + let mut var_field0 = ::sse_decode(deserializer); + let mut var_field1 = + <(Option, crate::api::api::PasswordRawEntry)>::sse_decode(deserializer); + return (var_field0, var_field1); } } -impl SseDecode for Vec<(String, (Option, crate::api::api::Passkey))> { +impl SseDecode for (String, (Option, crate::api::api::WifiPassword)) { // Codec=Sse (Serialization based), see doc to use other codecs fn sse_decode(deserializer: &mut flutter_rust_bridge::for_generated::SseDeserializer) -> Self { - let mut len_ = ::sse_decode(deserializer); - let mut ans_ = vec![]; - for idx_ in 0..len_ { - ans_.push( - <(String, (Option, crate::api::api::Passkey))>::sse_decode(deserializer), - ); - } - return ans_; + let mut var_field0 = ::sse_decode(deserializer); + let mut var_field1 = + <(Option, crate::api::api::WifiPassword)>::sse_decode(deserializer); + return (var_field0, var_field1); } } -impl SseDecode - for Vec<( - String, - (Option, crate::api::api::PasswordManagerMeta), - )> -{ +impl SseDecode for (String, crate::api::api::ShareInviteContentData) { // Codec=Sse (Serialization based), see doc to use other codecs fn sse_decode(deserializer: &mut flutter_rust_bridge::for_generated::SseDeserializer) -> Self { - let mut len_ = ::sse_decode(deserializer); - let mut ans_ = vec![]; - for idx_ in 0..len_ { - ans_.push(<( - String, - (Option, crate::api::api::PasswordManagerMeta), - )>::sse_decode(deserializer)); - } - return ans_; + let mut var_field0 = ::sse_decode(deserializer); + let mut var_field1 = ::sse_decode(deserializer); + return (var_field0, var_field1); } } -impl SseDecode for Vec<(String, (Option, crate::api::api::PasswordRawEntry))> { +impl SseDecode for (String, crate::api::api::SharedPushState) { // Codec=Sse (Serialization based), see doc to use other codecs fn sse_decode(deserializer: &mut flutter_rust_bridge::for_generated::SseDeserializer) -> Self { - let mut len_ = ::sse_decode(deserializer); - let mut ans_ = vec![]; - for idx_ in 0..len_ { - ans_.push(<( - String, - (Option, crate::api::api::PasswordRawEntry), - )>::sse_decode(deserializer)); - } - return ans_; + let mut var_field0 = ::sse_decode(deserializer); + let mut var_field1 = ::sse_decode(deserializer); + return (var_field0, var_field1); } } -impl SseDecode for Vec<(String, (Option, crate::api::api::WifiPassword))> { +impl SseDecode for (String, crate::api::api::StatusKitPersonalConfig) { // Codec=Sse (Serialization based), see doc to use other codecs fn sse_decode(deserializer: &mut flutter_rust_bridge::for_generated::SseDeserializer) -> Self { - let mut len_ = ::sse_decode(deserializer); - let mut ans_ = vec![]; - for idx_ in 0..len_ { - ans_.push( - <(String, (Option, crate::api::api::WifiPassword))>::sse_decode( - deserializer, - ), - ); - } - return ans_; + let mut var_field0 = ::sse_decode(deserializer); + let mut var_field1 = ::sse_decode(deserializer); + return (var_field0, var_field1); } } -impl SseDecode for Vec<(String, crate::api::api::ShareInviteContentData)> { +impl SseDecode for (String, String) { // Codec=Sse (Serialization based), see doc to use other codecs fn sse_decode(deserializer: &mut flutter_rust_bridge::for_generated::SseDeserializer) -> Self { - let mut len_ = ::sse_decode(deserializer); - let mut ans_ = vec![]; - for idx_ in 0..len_ { - ans_.push( - <(String, crate::api::api::ShareInviteContentData)>::sse_decode(deserializer), - ); - } - return ans_; + let mut var_field0 = ::sse_decode(deserializer); + let mut var_field1 = ::sse_decode(deserializer); + return (var_field0, var_field1); } } -impl SseDecode for Vec<(String, crate::api::api::StatusKitPersonalConfig)> { +impl SseDecode for (String, crate::api::api::SyncStatus) { // Codec=Sse (Serialization based), see doc to use other codecs fn sse_decode(deserializer: &mut flutter_rust_bridge::for_generated::SseDeserializer) -> Self { - let mut len_ = ::sse_decode(deserializer); - let mut ans_ = vec![]; - for idx_ in 0..len_ { - ans_.push( - <(String, crate::api::api::StatusKitPersonalConfig)>::sse_decode(deserializer), - ); - } - return ans_; + let mut var_field0 = ::sse_decode(deserializer); + let mut var_field1 = ::sse_decode(deserializer); + return (var_field0, var_field1); } } -impl SseDecode for Vec<(String, String)> { + +impl SseDecode for (String, crate::api::api::UpdateAccountFinish) { // Codec=Sse (Serialization based), see doc to use other codecs fn sse_decode(deserializer: &mut flutter_rust_bridge::for_generated::SseDeserializer) -> Self { - let mut len_ = ::sse_decode(deserializer); - let mut ans_ = vec![]; - for idx_ in 0..len_ { - ans_.push(<(String, String)>::sse_decode(deserializer)); - } - return ans_; + let mut var_field0 = ::sse_decode(deserializer); + let mut var_field1 = ::sse_decode(deserializer); + return (var_field0, var_field1); } } -impl SseDecode for Vec<(String, crate::api::api::SyncStatus)> { +impl SseDecode for (u32, crate::api::api::NSDictionaryTypedCoder) { // Codec=Sse (Serialization based), see doc to use other codecs fn sse_decode(deserializer: &mut flutter_rust_bridge::for_generated::SseDeserializer) -> Self { - let mut len_ = ::sse_decode(deserializer); - let mut ans_ = vec![]; - for idx_ in 0..len_ { - ans_.push(<(String, crate::api::api::SyncStatus)>::sse_decode( - deserializer, - )); - } - return ans_; + let mut var_field0 = ::sse_decode(deserializer); + let mut var_field1 = ::sse_decode(deserializer); + return (var_field0, var_field1); } } -impl SseDecode for Vec<(u32, crate::api::api::NSDictionaryTypedCoder)> { +impl SseDecode for (u32, u64) { // Codec=Sse (Serialization based), see doc to use other codecs fn sse_decode(deserializer: &mut flutter_rust_bridge::for_generated::SseDeserializer) -> Self { - let mut len_ = ::sse_decode(deserializer); - let mut ans_ = vec![]; - for idx_ in 0..len_ { - ans_.push(<(u32, crate::api::api::NSDictionaryTypedCoder)>::sse_decode(deserializer)); - } - return ans_; + let mut var_field0 = ::sse_decode(deserializer); + let mut var_field1 = ::sse_decode(deserializer); + return (var_field0, var_field1); } } -impl SseDecode for Vec { +impl SseDecode for crate::api::api::RegisterState { // Codec=Sse (Serialization based), see doc to use other codecs fn sse_decode(deserializer: &mut flutter_rust_bridge::for_generated::SseDeserializer) -> Self { - let mut len_ = ::sse_decode(deserializer); - let mut ans_ = vec![]; - for idx_ in 0..len_ { - ans_.push(::sse_decode(deserializer)); + let mut tag_ = ::sse_decode(deserializer); + match tag_ { + 0 => { + let mut var_nextS = ::sse_decode(deserializer); + return crate::api::api::RegisterState::Registered { next_s: var_nextS }; + } + 1 => { + return crate::api::api::RegisterState::Registering; + } + 2 => { + let mut var_retryWait = >::sse_decode(deserializer); + let mut var_error = ::sse_decode(deserializer); + return crate::api::api::RegisterState::Failed { + retry_wait: var_retryWait, + error: var_error, + }; + } + _ => { + unimplemented!(""); + } } - return ans_; } } -impl SseDecode for Vec { +impl SseDecode for crate::api::api::RenameMessage { // Codec=Sse (Serialization based), see doc to use other codecs fn sse_decode(deserializer: &mut flutter_rust_bridge::for_generated::SseDeserializer) -> Self { - let mut len_ = ::sse_decode(deserializer); - let mut ans_ = vec![]; - for idx_ in 0..len_ { - ans_.push(::sse_decode(deserializer)); - } - return ans_; + let mut var_newName = ::sse_decode(deserializer); + return crate::api::api::RenameMessage { + new_name: var_newName, + }; } } -impl SseDecode for Vec { +impl SseDecode for crate::api::api::ReportMessage { // Codec=Sse (Serialization based), see doc to use other codecs fn sse_decode(deserializer: &mut flutter_rust_bridge::for_generated::SseDeserializer) -> Self { - let mut len_ = ::sse_decode(deserializer); - let mut ans_ = vec![]; - for idx_ in 0..len_ { - ans_.push(::sse_decode( - deserializer, - )); - } - return ans_; + let mut var_guid = ::sse_decode(deserializer); + let mut var_sender = ::sse_decode(deserializer); + let mut var_conversationSize = ::sse_decode(deserializer); + let mut var_parts = ::sse_decode(deserializer); + let mut var_timeOfMessage = ::sse_decode(deserializer); + return crate::api::api::ReportMessage { + guid: var_guid, + sender: var_sender, + conversation_size: var_conversationSize, + parts: var_parts, + time_of_message: var_timeOfMessage, + }; } } -impl SseDecode for Vec { +impl SseDecode for crate::api::api::RichLinkImageAttachmentSubstitute { // Codec=Sse (Serialization based), see doc to use other codecs fn sse_decode(deserializer: &mut flutter_rust_bridge::for_generated::SseDeserializer) -> Self { - let mut len_ = ::sse_decode(deserializer); - let mut ans_ = vec![]; - for idx_ in 0..len_ { - ans_.push(::sse_decode(deserializer)); - } - return ans_; + let mut var_mimeType = ::sse_decode(deserializer); + let mut var_richLinkImageAttachmentSubstituteIndex = ::sse_decode(deserializer); + return crate::api::api::RichLinkImageAttachmentSubstitute { + mime_type: var_mimeType, + rich_link_image_attachment_substitute_index: var_richLinkImageAttachmentSubstituteIndex, + }; } } -impl SseDecode for crate::api::api::Location { +impl SseDecode for crate::api::api::ScheduleMode { // Codec=Sse (Serialization based), see doc to use other codecs fn sse_decode(deserializer: &mut flutter_rust_bridge::for_generated::SseDeserializer) -> Self { - let mut var_address = >::sse_decode(deserializer); - let mut var_altitude = ::sse_decode(deserializer); - let mut var_floorLevel = ::sse_decode(deserializer); - let mut var_horizontalAccuracy = ::sse_decode(deserializer); - let mut var_isInaccurate = ::sse_decode(deserializer); - let mut var_latitude = ::sse_decode(deserializer); - let mut var_locationId = >::sse_decode(deserializer); - let mut var_locationTimestamp = >::sse_decode(deserializer); - let mut var_longitude = ::sse_decode(deserializer); - let mut var_secureLocationTs = ::sse_decode(deserializer); - let mut var_timestamp = ::sse_decode(deserializer); - let mut var_verticalAccuracy = ::sse_decode(deserializer); - let mut var_positionType = >::sse_decode(deserializer); - let mut var_isOld = >::sse_decode(deserializer); - let mut var_locationFinished = >::sse_decode(deserializer); - return crate::api::api::Location { - address: var_address, - altitude: var_altitude, - floor_level: var_floorLevel, - horizontal_accuracy: var_horizontalAccuracy, - is_inaccurate: var_isInaccurate, - latitude: var_latitude, - location_id: var_locationId, - location_timestamp: var_locationTimestamp, - longitude: var_longitude, - secure_location_ts: var_secureLocationTs, - timestamp: var_timestamp, - vertical_accuracy: var_verticalAccuracy, - position_type: var_positionType, - is_old: var_isOld, - location_finished: var_locationFinished, + let mut var_ms = ::sse_decode(deserializer); + let mut var_schedule = ::sse_decode(deserializer); + return crate::api::api::ScheduleMode { + ms: var_ms, + schedule: var_schedule, }; } } -impl SseDecode for crate::api::api::LoginState { +impl SseDecode for crate::api::api::SetTranscriptBackgroundMessage { // Codec=Sse (Serialization based), see doc to use other codecs fn sse_decode(deserializer: &mut flutter_rust_bridge::for_generated::SseDeserializer) -> Self { let mut tag_ = ::sse_decode(deserializer); match tag_ { 0 => { - return crate::api::api::LoginState::LoggedIn; + let mut var_aid = ::sse_decode(deserializer); + let mut var_bid = ::sse_decode(deserializer); + let mut var_chatId = >::sse_decode(deserializer); + let mut var_remove = ::sse_decode(deserializer); + return crate::api::api::SetTranscriptBackgroundMessage::Remove { + aid: var_aid, + bid: var_bid, + chat_id: var_chatId, + remove: var_remove, + }; } 1 => { - return crate::api::api::LoginState::NeedsDevice2FA; - } - 2 => { - return crate::api::api::LoginState::Needs2FAVerification; - } - 3 => { - return crate::api::api::LoginState::NeedsSMS2FA; - } - 4 => { - let mut var_field0 = ::sse_decode(deserializer); - return crate::api::api::LoginState::NeedsSMS2FAVerification(var_field0); - } - 5 => { - let mut var_field0 = ::sse_decode(deserializer); - return crate::api::api::LoginState::NeedsExtraStep(var_field0); - } - 6 => { - return crate::api::api::LoginState::NeedsLogin; + let mut var_aid = ::sse_decode(deserializer); + let mut var_bid = ::sse_decode(deserializer); + let mut var_chatId = >::sse_decode(deserializer); + let mut var_objectId = ::sse_decode(deserializer); + let mut var_payloadVersion = ::sse_decode(deserializer); + let mut var_backgroundId = ::sse_decode(deserializer); + let mut var_url = ::sse_decode(deserializer); + let mut var_signature = ::sse_decode(deserializer); + let mut var_key = ::sse_decode(deserializer); + let mut var_fileSize = ::sse_decode(deserializer); + return crate::api::api::SetTranscriptBackgroundMessage::Set { + aid: var_aid, + bid: var_bid, + chat_id: var_chatId, + object_id: var_objectId, + payload_version: var_payloadVersion, + background_id: var_backgroundId, + url: var_url, + signature: var_signature, + key: var_key, + file_size: var_fileSize, + }; } _ => { unimplemented!(""); @@ -19314,88 +25264,211 @@ impl SseDecode for crate::api::api::LoginState { } } -impl SseDecode for crate::api::api::LPIconMetadata { +impl SseDecode for crate::api::api::ShareInviteContentData { // Codec=Sse (Serialization based), see doc to use other codecs fn sse_decode(deserializer: &mut flutter_rust_bridge::for_generated::SseDeserializer) -> Self { - let mut var_url = ::sse_decode(deserializer); - let mut var_version = ::sse_decode(deserializer); - return crate::api::api::LPIconMetadata { - url: var_url, - version: var_version, + let mut var_invitationToken = >::sse_decode(deserializer); + let mut var_groupId = ::sse_decode(deserializer); + let mut var_sentTime = ::sse_decode(deserializer); + let mut var_groupName = ::sse_decode(deserializer); + let mut var_shareUrl = ::sse_decode(deserializer); + let mut var_inviteeHandle = ::sse_decode(deserializer); + return crate::api::api::ShareInviteContentData { + invitation_token: var_invitationToken, + group_id: var_groupId, + sent_time: var_sentTime, + group_name: var_groupName, + share_url: var_shareUrl, + invitee_handle: var_inviteeHandle, }; } } -impl SseDecode for crate::api::api::LPImageMetadata { +impl SseDecode for crate::api::api::ShareProfileMessage { // Codec=Sse (Serialization based), see doc to use other codecs fn sse_decode(deserializer: &mut flutter_rust_bridge::for_generated::SseDeserializer) -> Self { - let mut var_size = ::sse_decode(deserializer); - let mut var_url = ::sse_decode(deserializer); - let mut var_version = ::sse_decode(deserializer); - return crate::api::api::LPImageMetadata { - size: var_size, - url: var_url, - version: var_version, + let mut var_cloudKitDecryptionRecordKey = >::sse_decode(deserializer); + let mut var_cloudKitRecordKey = ::sse_decode(deserializer); + let mut var_poster = >::sse_decode(deserializer); + return crate::api::api::ShareProfileMessage { + cloud_kit_decryption_record_key: var_cloudKitDecryptionRecordKey, + cloud_kit_record_key: var_cloudKitRecordKey, + poster: var_poster, }; } } -impl SseDecode for crate::api::api::LPLinkMetadata { +impl SseDecode for crate::api::api::SharedAlbum { // Codec=Sse (Serialization based), see doc to use other codecs fn sse_decode(deserializer: &mut flutter_rust_bridge::for_generated::SseDeserializer) -> Self { - let mut var_imageMetadata = - >::sse_decode(deserializer); - let mut var_version = ::sse_decode(deserializer); - let mut var_iconMetadata = - >::sse_decode(deserializer); - let mut var_originalUrl = >::sse_decode(deserializer); - let mut var_url = >::sse_decode(deserializer); - let mut var_title = >::sse_decode(deserializer); - let mut var_summary = >::sse_decode(deserializer); - let mut var_image = - >::sse_decode(deserializer); - let mut var_icon = - >::sse_decode(deserializer); - let mut var_images = >>::sse_decode(deserializer); - let mut var_icons = >>::sse_decode(deserializer); - let mut var_isIncomplete = >::sse_decode(deserializer); - let mut var_usesActivityPub = >::sse_decode(deserializer); - let mut var_isEncodedForLocalUse = >::sse_decode(deserializer); - let mut var_collaborationType = >::sse_decode(deserializer); - let mut var_specialization2 = - >::sse_decode(deserializer); - return crate::api::api::LPLinkMetadata { - image_metadata: var_imageMetadata, - version: var_version, - icon_metadata: var_iconMetadata, - original_url: var_originalUrl, - url: var_url, - title: var_title, - summary: var_summary, - image: var_image, - icon: var_icon, - images: var_images, - icons: var_icons, - is_incomplete: var_isIncomplete, - uses_activity_pub: var_usesActivityPub, - is_encoded_for_local_use: var_isEncodedForLocalUse, - collaboration_type: var_collaborationType, - specialization2: var_specialization2, + let mut var_name = >::sse_decode(deserializer); + let mut var_fullname = >::sse_decode(deserializer); + let mut var_email = >::sse_decode(deserializer); + let mut var_albumguid = ::sse_decode(deserializer); + let mut var_sharingtype = ::sse_decode(deserializer); + let mut var_subscriptiondate = >::sse_decode(deserializer); + let mut var_albumlocation = >::sse_decode(deserializer); + let mut var_assets = >::sse_decode(deserializer); + let mut var_delete = >::sse_decode(deserializer); + return crate::api::api::SharedAlbum { + name: var_name, + fullname: var_fullname, + email: var_email, + albumguid: var_albumguid, + sharingtype: var_sharingtype, + subscriptiondate: var_subscriptiondate, + albumlocation: var_albumlocation, + assets: var_assets, + delete: var_delete, + }; + } +} + +impl SseDecode for crate::api::api::SharedICloudServices { + // Codec=Sse (Serialization based), see doc to use other codecs + fn sse_decode(deserializer: &mut flutter_rust_bridge::for_generated::SseDeserializer) -> Self { + let mut var_account = + >>>::sse_decode(deserializer); + let mut var_tokenProvider = + >>::sse_decode(deserializer); + let mut var_cloudkitClient = + >>>::sse_decode(deserializer); + let mut var_keychain = + >>>::sse_decode(deserializer); + let mut var_passwords = + >>>::sse_decode(deserializer); + let mut var_profilesClient = + >>::sse_decode(deserializer); + let mut var_fmfd = + >>>::sse_decode(deserializer); + let mut var_sharedstreams = + >>::sse_decode( + deserializer, + ); + let mut var_cloudMessagesClient = + >>>::sse_decode(deserializer); + let mut var_statuskitClient = + >>::sse_decode(deserializer); + return crate::api::api::SharedICloudServices { + account: var_account, + token_provider: var_tokenProvider, + cloudkit_client: var_cloudkitClient, + keychain: var_keychain, + passwords: var_passwords, + profiles_client: var_profilesClient, + fmfd: var_fmfd, + sharedstreams: var_sharedstreams, + cloud_messages_client: var_cloudMessagesClient, + statuskit_client: var_statuskitClient, + }; + } +} + +impl SseDecode for crate::api::api::SharedPoster { + // Codec=Sse (Serialization based), see doc to use other codecs + fn sse_decode(deserializer: &mut flutter_rust_bridge::for_generated::SseDeserializer) -> Self { + let mut var_lowResWallpaperTag = >::sse_decode(deserializer); + let mut var_wallpaperTag = >::sse_decode(deserializer); + let mut var_messageTag = >::sse_decode(deserializer); + return crate::api::api::SharedPoster { + low_res_wallpaper_tag: var_lowResWallpaperTag, + wallpaper_tag: var_wallpaperTag, + message_tag: var_messageTag, + }; + } +} + +impl SseDecode for crate::api::api::SharedPushState { + // Codec=Sse (Serialization based), see doc to use other codecs + fn sse_decode(deserializer: &mut flutter_rust_bridge::for_generated::SseDeserializer) -> Self { + let mut var_osConfig = ::sse_decode(deserializer); + let mut var_cancelPoll = >::sse_decode(deserializer); + let mut var_confDir = ::sse_decode(deserializer); + let mut var_localBroadcast = >>::sse_decode(deserializer); + let mut var_anisette = + >::sse_decode(deserializer); + let mut var_conn = ::sse_decode(deserializer); + let mut var_icloudServices = + >::sse_decode(deserializer); + let mut var_client = >::sse_decode(deserializer); + let mut var_ftClient = >::sse_decode(deserializer); + let mut var_idmsClient = >::sse_decode(deserializer); + let mut var_activeCircleSessions = + >>>::sse_decode(deserializer); + let mut var_clientSession = >>, + >>::sse_decode(deserializer); + return crate::api::api::SharedPushState { + os_config: var_osConfig, + cancel_poll: var_cancelPoll, + conf_dir: var_confDir, + local_broadcast: var_localBroadcast, + anisette: var_anisette, + conn: var_conn, + icloud_services: var_icloudServices, + client: var_client, + ft_client: var_ftClient, + idms_client: var_idmsClient, + active_circle_sessions: var_activeCircleSessions, + client_session: var_clientSession, + }; + } +} + +impl SseDecode for crate::api::api::SimplifiedIncomingCallPoster { + // Codec=Sse (Serialization based), see doc to use other codecs + fn sse_decode(deserializer: &mut flutter_rust_bridge::for_generated::SseDeserializer) -> Self { + let mut var_poster = ::sse_decode(deserializer); + let mut var_textMetadata = ::sse_decode(deserializer); + let mut var_lowRes = >::sse_decode(deserializer); + return crate::api::api::SimplifiedIncomingCallPoster { + poster: var_poster, + text_metadata: var_textMetadata, + low_res: var_lowRes, }; } } -impl SseDecode for crate::api::api::LPSpecializationMetadata { +impl SseDecode for crate::api::api::SimplifiedPoster { + // Codec=Sse (Serialization based), see doc to use other codecs + fn sse_decode(deserializer: &mut flutter_rust_bridge::for_generated::SseDeserializer) -> Self { + let mut var_titleConfiguration = + ::sse_decode(deserializer); + let mut var_type = ::sse_decode(deserializer); + let mut var_role = ::sse_decode(deserializer); + return crate::api::api::SimplifiedPoster { + title_configuration: var_titleConfiguration, + r#type: var_type, + role: var_role, + }; + } +} + +impl SseDecode for crate::api::api::SimplifiedTranscriptPoster { + // Codec=Sse (Serialization based), see doc to use other codecs + fn sse_decode(deserializer: &mut flutter_rust_bridge::for_generated::SseDeserializer) -> Self { + let mut var_watch = ::sse_decode(deserializer); + let mut var_poster = ::sse_decode(deserializer); + return crate::api::api::SimplifiedTranscriptPoster { + watch: var_watch, + poster: var_poster, + }; + } +} + +impl SseDecode for crate::api::api::StatusKitMessage { // Codec=Sse (Serialization based), see doc to use other codecs fn sse_decode(deserializer: &mut flutter_rust_bridge::for_generated::SseDeserializer) -> Self { let mut tag_ = ::sse_decode(deserializer); match tag_ { 0 => { - let mut var_groupName = ::sse_decode(deserializer); - let mut var_urlParameters = ::sse_decode(deserializer); - return crate::api::api::LPSpecializationMetadata::LPPasswordsInviteMetadata { - group_name: var_groupName, - url_parameters: var_urlParameters, + let mut var_user = ::sse_decode(deserializer); + let mut var_mode = >::sse_decode(deserializer); + let mut var_allowed = ::sse_decode(deserializer); + return crate::api::api::StatusKitMessage::StatusChanged { + user: var_user, + mode: var_mode, + allowed: var_allowed, }; } _ => { @@ -19405,135 +25478,68 @@ impl SseDecode for crate::api::api::LPSpecializationMetadata { } } -impl SseDecode for crate::api::api::MemojiData { +impl SseDecode for crate::api::api::StatusKitPersonalConfig { // Codec=Sse (Serialization based), see doc to use other codecs fn sse_decode(deserializer: &mut flutter_rust_bridge::for_generated::SseDeserializer) -> Self { - let mut var_backgroundColorDescription = - ::sse_decode(deserializer); - let mut var_avatarRecordData = >::sse_decode(deserializer); - let mut var_avatarPoseData = >::sse_decode(deserializer); - let mut var_hasBody = ::sse_decode(deserializer); - let mut var_avatarImageData = >::sse_decode(deserializer); - return crate::api::api::MemojiData { - background_color_description: var_backgroundColorDescription, - avatar_record_data: var_avatarRecordData, - avatar_pose_data: var_avatarPoseData, - has_body: var_hasBody, - avatar_image_data: var_avatarImageData, + let mut var_allowedModes = >::sse_decode(deserializer); + return crate::api::api::StatusKitPersonalConfig { + allowed_modes: var_allowedModes, }; } } -impl SseDecode for crate::api::api::Message { +impl SseDecode for crate::api::api::SupportAction { + // Codec=Sse (Serialization based), see doc to use other codecs + fn sse_decode(deserializer: &mut flutter_rust_bridge::for_generated::SseDeserializer) -> Self { + let mut var_url = ::sse_decode(deserializer); + let mut var_button = ::sse_decode(deserializer); + return crate::api::api::SupportAction { + url: var_url, + button: var_button, + }; + } +} + +impl SseDecode for crate::api::api::SupportAlert { + // Codec=Sse (Serialization based), see doc to use other codecs + fn sse_decode(deserializer: &mut flutter_rust_bridge::for_generated::SseDeserializer) -> Self { + let mut var_title = ::sse_decode(deserializer); + let mut var_body = ::sse_decode(deserializer); + let mut var_action = >::sse_decode(deserializer); + return crate::api::api::SupportAlert { + title: var_title, + body: var_body, + action: var_action, + }; + } +} + +impl SseDecode for crate::api::api::SyncStatus { // Codec=Sse (Serialization based), see doc to use other codecs fn sse_decode(deserializer: &mut flutter_rust_bridge::for_generated::SseDeserializer) -> Self { let mut tag_ = ::sse_decode(deserializer); match tag_ { 0 => { - let mut var_field0 = ::sse_decode(deserializer); - return crate::api::api::Message::Message(var_field0); + return crate::api::api::SyncStatus::Synced; } 1 => { - let mut var_field0 = ::sse_decode(deserializer); - return crate::api::api::Message::RenameMessage(var_field0); + let mut var_progress = ::sse_decode(deserializer); + let mut var_total = ::sse_decode(deserializer); + return crate::api::api::SyncStatus::Downloading { + progress: var_progress, + total: var_total, + }; } 2 => { - let mut var_field0 = - ::sse_decode(deserializer); - return crate::api::api::Message::ChangeParticipants(var_field0); + let mut var_progress = ::sse_decode(deserializer); + let mut var_total = ::sse_decode(deserializer); + return crate::api::api::SyncStatus::Uploading { + progress: var_progress, + total: var_total, + }; } 3 => { - let mut var_field0 = ::sse_decode(deserializer); - return crate::api::api::Message::React(var_field0); - } - 4 => { - return crate::api::api::Message::Delivered; - } - 5 => { - return crate::api::api::Message::Read; - } - 6 => { - let mut var_field0 = ::sse_decode(deserializer); - let mut var_field1 = >::sse_decode(deserializer); - return crate::api::api::Message::Typing(var_field0, var_field1); - } - 7 => { - let mut var_field0 = ::sse_decode(deserializer); - return crate::api::api::Message::Unsend(var_field0); - } - 8 => { - let mut var_field0 = ::sse_decode(deserializer); - return crate::api::api::Message::Edit(var_field0); - } - 9 => { - let mut var_field0 = ::sse_decode(deserializer); - return crate::api::api::Message::IconChange(var_field0); - } - 10 => { - let mut var_field0 = ::sse_decode(deserializer); - return crate::api::api::Message::EnableSmsActivation(var_field0); - } - 11 => { - return crate::api::api::Message::MessageReadOnDevice; - } - 12 => { - let mut var_field0 = ::sse_decode(deserializer); - return crate::api::api::Message::SmsConfirmSent(var_field0); - } - 13 => { - return crate::api::api::Message::MarkUnread; - } - 14 => { - return crate::api::api::Message::PeerCacheInvalidate; - } - 15 => { - let mut var_field0 = - ::sse_decode(deserializer); - return crate::api::api::Message::UpdateExtension(var_field0); - } - 16 => { - let mut var_field0 = ::sse_decode(deserializer); - return crate::api::api::Message::Error(var_field0); - } - 17 => { - let mut var_field0 = - ::sse_decode(deserializer); - return crate::api::api::Message::MoveToRecycleBin(var_field0); - } - 18 => { - let mut var_field0 = ::sse_decode(deserializer); - return crate::api::api::Message::RecoverChat(var_field0); - } - 19 => { - let mut var_field0 = - ::sse_decode(deserializer); - return crate::api::api::Message::PermanentDelete(var_field0); - } - 20 => { - return crate::api::api::Message::Unschedule; - } - 21 => { - let mut var_field0 = - ::sse_decode(deserializer); - return crate::api::api::Message::UpdateProfile(var_field0); - } - 22 => { - let mut var_field0 = - ::sse_decode(deserializer); - return crate::api::api::Message::UpdateProfileSharing(var_field0); - } - 23 => { - let mut var_field0 = - ::sse_decode(deserializer); - return crate::api::api::Message::ShareProfile(var_field0); - } - 24 => { - return crate::api::api::Message::NotifyAnyways; - } - 25 => { - let mut var_field0 = - ::sse_decode(deserializer); - return crate::api::api::Message::SetTranscriptBackground(var_field0); + return crate::api::api::SyncStatus::Syncing; } _ => { unimplemented!(""); @@ -19542,83 +25548,62 @@ impl SseDecode for crate::api::api::Message { } } -impl SseDecode for crate::api::api::MessageEdit { +impl SseDecode for crate::api::api::TeardownSignIn { // Codec=Sse (Serialization based), see doc to use other codecs fn sse_decode(deserializer: &mut flutter_rust_bridge::for_generated::SseDeserializer) -> Self { - let mut var_t = >::sse_decode(deserializer); - let mut var_d = ::sse_decode(deserializer); - let mut var_bcg = >::sse_decode(deserializer); - return crate::api::api::MessageEdit { - t: var_t, - d: var_d, - bcg: var_bcg, + let mut var_prevtxnid = ::sse_decode(deserializer); + return crate::api::api::TeardownSignIn { + prevtxnid: var_prevtxnid, }; } } -impl SseDecode for crate::api::api::MessageEditRange { +impl SseDecode for crate::api::api::TextEffect { // Codec=Sse (Serialization based), see doc to use other codecs fn sse_decode(deserializer: &mut flutter_rust_bridge::for_generated::SseDeserializer) -> Self { - let mut var_lo = ::sse_decode(deserializer); - let mut var_le = ::sse_decode(deserializer); - return crate::api::api::MessageEditRange { - lo: var_lo, - le: var_le, + let mut inner = ::sse_decode(deserializer); + return match inner { + 0 => crate::api::api::TextEffect::Big, + 1 => crate::api::api::TextEffect::Small, + 2 => crate::api::api::TextEffect::Shake, + 3 => crate::api::api::TextEffect::Nod, + 4 => crate::api::api::TextEffect::Explode, + 5 => crate::api::api::TextEffect::Ripple, + 6 => crate::api::api::TextEffect::Bloom, + 7 => crate::api::api::TextEffect::Jitter, + _ => unreachable!("Invalid variant for TextEffect: {}", inner), }; } } -impl SseDecode for crate::api::api::MessageInst { +impl SseDecode for crate::api::api::TextFlags { // Codec=Sse (Serialization based), see doc to use other codecs fn sse_decode(deserializer: &mut flutter_rust_bridge::for_generated::SseDeserializer) -> Self { - let mut var_id = ::sse_decode(deserializer); - let mut var_sender = >::sse_decode(deserializer); - let mut var_conversation = - >::sse_decode(deserializer); - let mut var_message = ::sse_decode(deserializer); - let mut var_sentTimestamp = ::sse_decode(deserializer); - let mut var_target = - >>::sse_decode(deserializer); - let mut var_sendDelivered = ::sse_decode(deserializer); - let mut var_verificationFailed = ::sse_decode(deserializer); - let mut var_certifiedContext = - >::sse_decode(deserializer); - return crate::api::api::MessageInst { - id: var_id, - sender: var_sender, - conversation: var_conversation, - message: var_message, - sent_timestamp: var_sentTimestamp, - target: var_target, - send_delivered: var_sendDelivered, - verification_failed: var_verificationFailed, - certified_context: var_certifiedContext, + let mut var_bold = ::sse_decode(deserializer); + let mut var_italic = ::sse_decode(deserializer); + let mut var_underline = ::sse_decode(deserializer); + let mut var_strikethrough = ::sse_decode(deserializer); + return crate::api::api::TextFlags { + bold: var_bold, + italic: var_italic, + underline: var_underline, + strikethrough: var_strikethrough, }; } } -impl SseDecode for crate::api::api::MessagePart { +impl SseDecode for crate::api::api::TextFormat { // Codec=Sse (Serialization based), see doc to use other codecs fn sse_decode(deserializer: &mut flutter_rust_bridge::for_generated::SseDeserializer) -> Self { let mut tag_ = ::sse_decode(deserializer); match tag_ { 0 => { - let mut var_field0 = ::sse_decode(deserializer); - let mut var_field1 = ::sse_decode(deserializer); - return crate::api::api::MessagePart::Text(var_field0, var_field1); + let mut var_field0 = ::sse_decode(deserializer); + return crate::api::api::TextFormat::Flags(var_field0); } 1 => { - let mut var_field0 = ::sse_decode(deserializer); - return crate::api::api::MessagePart::Attachment(var_field0); - } - 2 => { - let mut var_field0 = ::sse_decode(deserializer); - let mut var_field1 = ::sse_decode(deserializer); - return crate::api::api::MessagePart::Mention(var_field0, var_field1); - } - 3 => { - let mut var_field0 = ::sse_decode(deserializer); - return crate::api::api::MessagePart::Object(var_field0); + let mut var_field0 = ::sse_decode(deserializer); + return crate::api::api::TextFormat::Effect(var_field0); } _ => { unimplemented!(""); @@ -19627,4924 +25612,4876 @@ impl SseDecode for crate::api::api::MessagePart { } } -impl SseDecode for crate::api::api::MessageParts { +impl SseDecode for crate::api::api::TranscriptDynamicUserData { // Codec=Sse (Serialization based), see doc to use other codecs fn sse_decode(deserializer: &mut flutter_rust_bridge::for_generated::SseDeserializer) -> Self { - let mut var_field0 = >::sse_decode(deserializer); - return crate::api::api::MessageParts(var_field0); + let mut var_identifier = ::sse_decode(deserializer); + return crate::api::api::TranscriptDynamicUserData { + identifier: var_identifier, + }; } } -impl SseDecode for crate::api::api::MessageProto { +impl SseDecode for crate::api::api::TransferProgress { // Codec=Sse (Serialization based), see doc to use other codecs fn sse_decode(deserializer: &mut flutter_rust_bridge::for_generated::SseDeserializer) -> Self { - let mut var_unk1 = ::sse_decode(deserializer); - let mut var_subject = >::sse_decode(deserializer); - let mut var_text = >::sse_decode(deserializer); - let mut var_attributedBody = >>::sse_decode(deserializer); - let mut var_balloonBundleId = >::sse_decode(deserializer); - let mut var_payloadData = >>::sse_decode(deserializer); - let mut var_messageSummaryInfo = >>::sse_decode(deserializer); - let mut var_effect = >::sse_decode(deserializer); - let mut var_dateRead = >::sse_decode(deserializer); - let mut var_unk10 = >::sse_decode(deserializer); - let mut var_unk11 = >::sse_decode(deserializer); - let mut var_dateDelivered = >::sse_decode(deserializer); - let mut var_unk14 = >::sse_decode(deserializer); - let mut var_associatedMessageType = >::sse_decode(deserializer); - let mut var_associatedMessageGuid = >::sse_decode(deserializer); - let mut var_associatedMessageRangeLocation = >::sse_decode(deserializer); - let mut var_associatedMessageRangeLength = >::sse_decode(deserializer); - return crate::api::api::MessageProto { - unk1: var_unk1, - subject: var_subject, - text: var_text, - attributed_body: var_attributedBody, - balloon_bundle_id: var_balloonBundleId, - payload_data: var_payloadData, - message_summary_info: var_messageSummaryInfo, - effect: var_effect, - date_read: var_dateRead, - unk10: var_unk10, - unk11: var_unk11, - date_delivered: var_dateDelivered, - unk14: var_unk14, - associated_message_type: var_associatedMessageType, - associated_message_guid: var_associatedMessageGuid, - associated_message_range_location: var_associatedMessageRangeLocation, - associated_message_range_length: var_associatedMessageRangeLength, + let mut var_prog = ::sse_decode(deserializer); + let mut var_total = ::sse_decode(deserializer); + let mut var_attachment = >::sse_decode(deserializer); + return crate::api::api::TransferProgress { + prog: var_prog, + total: var_total, + attachment: var_attachment, }; } } -impl SseDecode for crate::api::api::MessageProto2 { +impl SseDecode for crate::api::api::TrustedPhoneNumber { // Codec=Sse (Serialization based), see doc to use other codecs fn sse_decode(deserializer: &mut flutter_rust_bridge::for_generated::SseDeserializer) -> Self { - let mut var_reply = >::sse_decode(deserializer); - return crate::api::api::MessageProto2 { reply: var_reply }; + let mut var_numberWithDialCode = ::sse_decode(deserializer); + let mut var_lastTwoDigits = ::sse_decode(deserializer); + let mut var_pushMode = ::sse_decode(deserializer); + let mut var_id = ::sse_decode(deserializer); + return crate::api::api::TrustedPhoneNumber { + number_with_dial_code: var_numberWithDialCode, + last_two_digits: var_lastTwoDigits, + push_mode: var_pushMode, + id: var_id, + }; } } -impl SseDecode for crate::api::api::MessageProto3 { +impl SseDecode for crate::api::api::TypingApp { // Codec=Sse (Serialization based), see doc to use other codecs fn sse_decode(deserializer: &mut flutter_rust_bridge::for_generated::SseDeserializer) -> Self { - let mut var_unk2 = >::sse_decode(deserializer); - let mut var_unk3 = >::sse_decode(deserializer); - return crate::api::api::MessageProto3 { - unk2: var_unk2, - unk3: var_unk3, + let mut var_bundleId = ::sse_decode(deserializer); + let mut var_icon = >::sse_decode(deserializer); + return crate::api::api::TypingApp { + bundle_id: var_bundleId, + icon: var_icon, }; } } -impl SseDecode for crate::api::api::MessageProto4 { +impl SseDecode for u16 { // Codec=Sse (Serialization based), see doc to use other codecs fn sse_decode(deserializer: &mut flutter_rust_bridge::for_generated::SseDeserializer) -> Self { - let mut var_associatedMessageEmoji = >::sse_decode(deserializer); - let mut var_service = >::sse_decode(deserializer); - let mut var_scheduleType = >::sse_decode(deserializer); - let mut var_scheduleState = >::sse_decode(deserializer); - let mut var_groupId = >::sse_decode(deserializer); - let mut var_sentOrReceivedOffGrid = >::sse_decode(deserializer); - return crate::api::api::MessageProto4 { - associated_message_emoji: var_associatedMessageEmoji, - service: var_service, - schedule_type: var_scheduleType, - schedule_state: var_scheduleState, - group_id: var_groupId, - sent_or_received_off_grid: var_sentOrReceivedOffGrid, - }; + deserializer.cursor.read_u16::().unwrap() } } -impl SseDecode for crate::api::api::MessageSummaryInfo { +impl SseDecode for u32 { // Codec=Sse (Serialization based), see doc to use other codecs fn sse_decode(deserializer: &mut flutter_rust_bridge::for_generated::SseDeserializer) -> Self { - let mut var_ams = >::sse_decode(deserializer); - let mut var_ampt = >>::sse_decode(deserializer); - let mut var_amc = >::sse_decode(deserializer); - let mut var_amb = >::sse_decode(deserializer); - let mut var_amd = >::sse_decode(deserializer); - let mut var_ec = - >>::sse_decode( - deserializer, - ); - let mut var_ep = >::sse_decode(deserializer); - let mut var_otr = - >::sse_decode( - deserializer, - ); - let mut var_ust = >::sse_decode(deserializer); - let mut var_rp = >::sse_decode(deserializer); - let mut var_hbr = >::sse_decode(deserializer); - let mut var_oui = >::sse_decode(deserializer); - let mut var_osn = >::sse_decode(deserializer); - let mut var_euh = >::sse_decode(deserializer); - return crate::api::api::MessageSummaryInfo { - ams: var_ams, - ampt: var_ampt, - amc: var_amc, - amb: var_amb, - amd: var_amd, - ec: var_ec, - ep: var_ep, - otr: var_otr, - ust: var_ust, - rp: var_rp, - hbr: var_hbr, - oui: var_oui, - osn: var_osn, - euh: var_euh, - }; + deserializer.cursor.read_u32::().unwrap() } } -impl SseDecode for crate::api::api::MessageTarget { +impl SseDecode for u64 { // Codec=Sse (Serialization based), see doc to use other codecs fn sse_decode(deserializer: &mut flutter_rust_bridge::for_generated::SseDeserializer) -> Self { - let mut tag_ = ::sse_decode(deserializer); - match tag_ { - 0 => { - let mut var_field0 = >::sse_decode(deserializer); - return crate::api::api::MessageTarget::Token(var_field0); - } - 1 => { - let mut var_field0 = ::sse_decode(deserializer); - return crate::api::api::MessageTarget::Uuid(var_field0); - } - _ => { - unimplemented!(""); - } - } + deserializer.cursor.read_u64::().unwrap() } } -impl SseDecode for crate::api::api::MessageType { +impl SseDecode for u8 { // Codec=Sse (Serialization based), see doc to use other codecs fn sse_decode(deserializer: &mut flutter_rust_bridge::for_generated::SseDeserializer) -> Self { - let mut tag_ = ::sse_decode(deserializer); - match tag_ { - 0 => { - return crate::api::api::MessageType::IMessage; - } - 1 => { - let mut var_isPhone = ::sse_decode(deserializer); - let mut var_usingNumber = ::sse_decode(deserializer); - let mut var_fromHandle = >::sse_decode(deserializer); - return crate::api::api::MessageType::SMS { - is_phone: var_isPhone, - using_number: var_usingNumber, - from_handle: var_fromHandle, - }; - } - _ => { - unimplemented!(""); - } - } + deserializer.cursor.read_u8().unwrap() } } -impl SseDecode for crate::api::api::MMCSAttachmentMeta { +impl SseDecode for crate::api::api::UIColor { // Codec=Sse (Serialization based), see doc to use other codecs fn sse_decode(deserializer: &mut flutter_rust_bridge::for_generated::SseDeserializer) -> Self { - let mut var_mmcsSignatureHex = >::sse_decode(deserializer); - let mut var_mmcsOwner = >::sse_decode(deserializer); - let mut var_mmcsUrl = >::sse_decode(deserializer); - let mut var_decryptionKey = >::sse_decode(deserializer); - let mut var_inlineAttachment = >::sse_decode(deserializer); - let mut var_messagePart = >::sse_decode(deserializer); - let mut var_fileSize = >::sse_decode(deserializer); - let mut var_utiType = >::sse_decode(deserializer); - let mut var_mimeType = >::sse_decode(deserializer); - let mut var_name = >::sse_decode(deserializer); - return crate::api::api::MMCSAttachmentMeta { - mmcs_signature_hex: var_mmcsSignatureHex, - mmcs_owner: var_mmcsOwner, - mmcs_url: var_mmcsUrl, - decryption_key: var_decryptionKey, - inline_attachment: var_inlineAttachment, - message_part: var_messagePart, - file_size: var_fileSize, - uti_type: var_utiType, - mime_type: var_mimeType, - name: var_name, - }; + let mut tag_ = ::sse_decode(deserializer); + match tag_ { + 0 => { + let mut var_colorComponents = ::sse_decode(deserializer); + let mut var_green = ::sse_decode(deserializer); + let mut var_blue = ::sse_decode(deserializer); + let mut var_red = ::sse_decode(deserializer); + let mut var_greenDbl = >::sse_decode(deserializer); + let mut var_blueDbl = >::sse_decode(deserializer); + let mut var_redDbl = >::sse_decode(deserializer); + let mut var_alphaDbl = >::sse_decode(deserializer); + let mut var_alpha = ::sse_decode(deserializer); + let mut var_rgb = >::sse_decode(deserializer); + let mut var_colorSpace = ::sse_decode(deserializer); + let mut var_class_ = ::sse_decode(deserializer); + return crate::api::api::UIColor::RGBAColorSpace { + color_components: var_colorComponents, + green: var_green, + blue: var_blue, + red: var_red, + green_dbl: var_greenDbl, + blue_dbl: var_blueDbl, + red_dbl: var_redDbl, + alpha_dbl: var_alphaDbl, + alpha: var_alpha, + rgb: var_rgb, + color_space: var_colorSpace, + class: var_class_, + }; + } + 1 => { + let mut var_colorComponents = ::sse_decode(deserializer); + let mut var_white = ::sse_decode(deserializer); + let mut var_alpha = ::sse_decode(deserializer); + let mut var_bin = >::sse_decode(deserializer); + let mut var_colorSpace = ::sse_decode(deserializer); + let mut var_class_ = ::sse_decode(deserializer); + return crate::api::api::UIColor::GrayscaleAlphaColorSpace { + color_components: var_colorComponents, + white: var_white, + alpha: var_alpha, + bin: var_bin, + color_space: var_colorSpace, + class: var_class_, + }; + } + _ => { + unimplemented!(""); + } + } } } -impl SseDecode for crate::api::api::MMCSFile { +impl SseDecode for () { // Codec=Sse (Serialization based), see doc to use other codecs - fn sse_decode(deserializer: &mut flutter_rust_bridge::for_generated::SseDeserializer) -> Self { - let mut var_signature = >::sse_decode(deserializer); - let mut var_object = ::sse_decode(deserializer); - let mut var_url = ::sse_decode(deserializer); - let mut var_key = >::sse_decode(deserializer); - let mut var_size = ::sse_decode(deserializer); - return crate::api::api::MMCSFile { - signature: var_signature, - object: var_object, - url: var_url, - key: var_key, - size: var_size, - }; - } + fn sse_decode(deserializer: &mut flutter_rust_bridge::for_generated::SseDeserializer) -> Self {} } -impl SseDecode for crate::api::api::MMCSTransferProgress { +impl SseDecode for crate::api::api::UnsendMessage { // Codec=Sse (Serialization based), see doc to use other codecs fn sse_decode(deserializer: &mut flutter_rust_bridge::for_generated::SseDeserializer) -> Self { - let mut var_prog = ::sse_decode(deserializer); - let mut var_total = ::sse_decode(deserializer); - let mut var_file = >::sse_decode(deserializer); - return crate::api::api::MMCSTransferProgress { - prog: var_prog, - total: var_total, - file: var_file, + let mut var_tuuid = ::sse_decode(deserializer); + let mut var_editPart = ::sse_decode(deserializer); + return crate::api::api::UnsendMessage { + tuuid: var_tuuid, + edit_part: var_editPart, }; } } -impl SseDecode for crate::api::api::MonogramData { +impl SseDecode for crate::api::api::UpdateAccountFinish { // Codec=Sse (Serialization based), see doc to use other codecs fn sse_decode(deserializer: &mut flutter_rust_bridge::for_generated::SseDeserializer) -> Self { - let mut var_topBackgroundColorDescription = - ::sse_decode(deserializer); - let mut var_backgroundColorDescription = - ::sse_decode(deserializer); - let mut var_initials = ::sse_decode(deserializer); - let mut var_monogramSupportedForName = ::sse_decode(deserializer); - return crate::api::api::MonogramData { - top_background_color_description: var_topBackgroundColorDescription, - background_color_description: var_backgroundColorDescription, - initials: var_initials, - monogram_supported_for_name: var_monogramSupportedForName, - }; + let mut tag_ = ::sse_decode(deserializer); + match tag_ { + 0 => { + return crate::api::api::UpdateAccountFinish::MacOS; + } + 1 => { + let mut var_url = ::sse_decode(deserializer); + return crate::api::api::UpdateAccountFinish::IOS { url: var_url }; + } + _ => { + unimplemented!(""); + } + } } } -impl SseDecode for crate::api::api::MoveToRecycleBinMessage { +impl SseDecode for crate::api::api::UpdateExtensionMessage { // Codec=Sse (Serialization based), see doc to use other codecs fn sse_decode(deserializer: &mut flutter_rust_bridge::for_generated::SseDeserializer) -> Self { - let mut var_target = ::sse_decode(deserializer); - let mut var_recoverableDeleteDate = ::sse_decode(deserializer); - return crate::api::api::MoveToRecycleBinMessage { - target: var_target, - recoverable_delete_date: var_recoverableDeleteDate, + let mut var_forUuid = ::sse_decode(deserializer); + let mut var_ext = ::sse_decode(deserializer); + return crate::api::api::UpdateExtensionMessage { + for_uuid: var_forUuid, + ext: var_ext, }; } } -impl SseDecode for crate::api::api::MyAsyncRuntime { - // Codec=Sse (Serialization based), see doc to use other codecs - fn sse_decode(deserializer: &mut flutter_rust_bridge::for_generated::SseDeserializer) -> Self { - return crate::api::api::MyAsyncRuntime(); - } -} - -impl SseDecode for crate::api::api::NormalMessage { +impl SseDecode for crate::api::api::UpdateProfileMessage { // Codec=Sse (Serialization based), see doc to use other codecs fn sse_decode(deserializer: &mut flutter_rust_bridge::for_generated::SseDeserializer) -> Self { - let mut var_parts = ::sse_decode(deserializer); - let mut var_effect = >::sse_decode(deserializer); - let mut var_replyGuid = >::sse_decode(deserializer); - let mut var_replyPart = >::sse_decode(deserializer); - let mut var_service = ::sse_decode(deserializer); - let mut var_subject = >::sse_decode(deserializer); - let mut var_app = >::sse_decode(deserializer); - let mut var_linkMeta = >::sse_decode(deserializer); - let mut var_voice = ::sse_decode(deserializer); - let mut var_scheduled = >::sse_decode(deserializer); - let mut var_embeddedProfile = + let mut var_profile = >::sse_decode(deserializer); - return crate::api::api::NormalMessage { - parts: var_parts, - effect: var_effect, - reply_guid: var_replyGuid, - reply_part: var_replyPart, - service: var_service, - subject: var_subject, - app: var_app, - link_meta: var_linkMeta, - voice: var_voice, - scheduled: var_scheduled, - embedded_profile: var_embeddedProfile, + let mut var_shareContacts = ::sse_decode(deserializer); + return crate::api::api::UpdateProfileMessage { + profile: var_profile, + share_contacts: var_shareContacts, }; } } -impl SseDecode for crate::api::api::NSAttributedString { +impl SseDecode for crate::api::api::UpdateProfileSharingMessage { // Codec=Sse (Serialization based), see doc to use other codecs fn sse_decode(deserializer: &mut flutter_rust_bridge::for_generated::SseDeserializer) -> Self { - let mut var_text = ::sse_decode(deserializer); - let mut var_ranges = - >::sse_decode(deserializer); - return crate::api::api::NSAttributedString { - text: var_text, - ranges: var_ranges, + let mut var_sharedDismissed = >::sse_decode(deserializer); + let mut var_sharedAll = >::sse_decode(deserializer); + let mut var_version = ::sse_decode(deserializer); + return crate::api::api::UpdateProfileSharingMessage { + shared_dismissed: var_sharedDismissed, + shared_all: var_sharedAll, + version: var_version, }; } } -impl SseDecode for crate::api::api::NSDictionaryClass { +impl SseDecode for usize { // Codec=Sse (Serialization based), see doc to use other codecs fn sse_decode(deserializer: &mut flutter_rust_bridge::for_generated::SseDeserializer) -> Self { - let mut inner = ::sse_decode(deserializer); - return match inner { - 0 => crate::api::api::NSDictionaryClass::NSDictionary, - 1 => crate::api::api::NSDictionaryClass::NSMutableDictionary, - _ => unreachable!("Invalid variant for NSDictionaryClass: {}", inner), - }; + deserializer.cursor.read_u64::().unwrap() as _ } } -impl SseDecode for crate::api::api::NSDictionaryTypedCoder { +impl SseDecode for crate::api::api::WallpaperMetadata { // Codec=Sse (Serialization based), see doc to use other codecs fn sse_decode(deserializer: &mut flutter_rust_bridge::for_generated::SseDeserializer) -> Self { - let mut var_field0 = - >::sse_decode(deserializer); - return crate::api::api::NSDictionaryTypedCoder(var_field0); + let mut var_backgroundColorKey = + >::sse_decode(deserializer); + let mut var_fontColorKey = ::sse_decode(deserializer); + let mut var_fontNameKey = ::sse_decode(deserializer); + let mut var_fontSizeKey = ::sse_decode(deserializer); + let mut var_fontWeightKey = ::sse_decode(deserializer); + let mut var_isVerticalKey = ::sse_decode(deserializer); + let mut var_typeKey = ::sse_decode(deserializer); + return crate::api::api::WallpaperMetadata { + background_color_key: var_backgroundColorKey, + font_color_key: var_fontColorKey, + font_name_key: var_fontNameKey, + font_size_key: var_fontSizeKey, + font_weight_key: var_fontWeightKey, + is_vertical_key: var_isVerticalKey, + type_key: var_typeKey, + }; } } -impl SseDecode for crate::api::api::NSNumber { +impl SseDecode for crate::api::api::WatchBackground { // Codec=Sse (Serialization based), see doc to use other codecs fn sse_decode(deserializer: &mut flutter_rust_bridge::for_generated::SseDeserializer) -> Self { - let mut var_field0 = ::sse_decode(deserializer); - return crate::api::api::NSNumber(var_field0); + let mut var_isHighKey = ::sse_decode(deserializer); + let mut var_luminance = ::sse_decode(deserializer); + let mut var_backgroundImageData = >::sse_decode(deserializer); + let mut var_extensionIdentifier = ::sse_decode(deserializer); + return crate::api::api::WatchBackground { + is_high_key: var_isHighKey, + luminance: var_luminance, + background_image_data: var_backgroundImageData, + extension_identifier: var_extensionIdentifier, + }; } } -impl SseDecode for crate::api::api::NSString { +impl SseDecode for crate::api::api::WifiPassword { // Codec=Sse (Serialization based), see doc to use other codecs fn sse_decode(deserializer: &mut flutter_rust_bridge::for_generated::SseDeserializer) -> Self { - let mut var_field0 = ::sse_decode(deserializer); - return crate::api::api::NSString(var_field0); + let mut var_cdat = ::sse_decode(deserializer); + let mut var_mdat = ::sse_decode(deserializer); + let mut var_acct = ::sse_decode(deserializer); + let mut var_svce = ::sse_decode(deserializer); + let mut var_data = >::sse_decode(deserializer); + return crate::api::api::WifiPassword { + cdat: var_cdat, + mdat: var_mdat, + acct: var_acct, + svce: var_svce, + data: var_data, + }; } } -impl SseDecode for crate::api::api::NSURL { - // Codec=Sse (Serialization based), see doc to use other codecs - fn sse_decode(deserializer: &mut flutter_rust_bridge::for_generated::SseDeserializer) -> Self { - let mut var_base = ::sse_decode(deserializer); - let mut var_relative = ::sse_decode(deserializer); - return crate::api::api::NSURL { - base: var_base, - relative: var_relative, - }; +fn pde_ffi_dispatcher_primary_impl( + func_id: i32, + port: flutter_rust_bridge::for_generated::MessagePort, + ptr: flutter_rust_bridge::for_generated::PlatformGeneralizedUint8ListPtr, + rust_vec_len: i32, + data_len: i32, +) { + // Codec=Pde (Serialization + dispatch), see doc to use other codecs + match func_id { + 31 => wire__crate__api__api__accept_beacon_share_impl(port, ptr, rust_vec_len, data_len), + 32 => wire__crate__api__api__accept_invite_impl(port, ptr, rust_vec_len, data_len), + 33 => wire__crate__api__api__add_album_impl(port, ptr, rust_vec_len, data_len), + 34 => wire__crate__api__api__answer_ft_request_impl(port, ptr, rust_vec_len, data_len), + 35 => wire__crate__api__api__approve_circle_impl(port, ptr, rust_vec_len, data_len), + 36 => wire__crate__api__api__attachment_get_size_impl(port, ptr, rust_vec_len, data_len), + 38 => wire__crate__api__api__auth_phone_impl(port, ptr, rust_vec_len, data_len), + 40 => wire__crate__api__api__cancel_facetime_impl(port, ptr, rust_vec_len, data_len), + 42 => wire__crate__api__api__certify_delivery_impl(port, ptr, rust_vec_len, data_len), + 43 => wire__crate__api__api__change_escrow_password_impl(port, ptr, rust_vec_len, data_len), + 44 => wire__crate__api__api__circle_setup_clique_impl(port, ptr, rust_vec_len, data_len), + 45 => wire__crate__api__api__clear_links_impl(port, ptr, rust_vec_len, data_len), + 52 => wire__crate__api__api__cloud_sync_capture_auth_snapshot_impl( + port, + ptr, + rust_vec_len, + data_len, + ), + 55 => wire__crate__api__api__cloud_sync_consume_prepared_message_create_impl( + port, + ptr, + rust_vec_len, + data_len, + ), + 56 => wire__crate__api__api__cloud_sync_decode_protected_change_impl( + port, + ptr, + rust_vec_len, + data_len, + ), + 57 => wire__crate__api__api__cloud_sync_fetch_protected_page_impl( + port, + ptr, + rust_vec_len, + data_len, + ), + 58 => { + wire__crate__api__api__cloud_sync_fetch_raw_page_impl(port, ptr, rust_vec_len, data_len) + } + 60 => wire__crate__api__api__cloud_sync_prepare_message_create_impl( + port, + ptr, + rust_vec_len, + data_len, + ), + 62 => wire__crate__api__api__cloud_sync_reconcile_message_create_impl( + port, + ptr, + rust_vec_len, + data_len, + ), + 66 => wire__crate__api__api__cloud_sync_stage_outbound_message_impl( + port, + ptr, + rust_vec_len, + data_len, + ), + 68 => wire__crate__api__api__complete_msg_impl(port, ptr, rust_vec_len, data_len), + 69 => wire__crate__api__api__config_from_encoded_impl(port, ptr, rust_vec_len, data_len), + 70 => wire__crate__api__api__config_from_relay_impl(port, ptr, rust_vec_len, data_len), + 71 => wire__crate__api__api__config_from_validation_data_impl( + port, + ptr, + rust_vec_len, + data_len, + ), + 72 => wire__crate__api__api__configure_app_review_impl(port, ptr, rust_vec_len, data_len), + 73 => wire__crate__api__api__convert_token_to_uuid_impl(port, ptr, rust_vec_len, data_len), + 74 => wire__crate__api__api__count_records_impl(port, ptr, rust_vec_len, data_len), + 75 => wire__crate__api__api__create_facetime_impl(port, ptr, rust_vec_len, data_len), + 76 => wire__crate__api__api__create_group_impl(port, ptr, rust_vec_len, data_len), + 77 => wire__crate__api__api__create_icon_array_impl(port, ptr, rust_vec_len, data_len), + 78 => wire__crate__api__api__create_image_array_impl(port, ptr, rust_vec_len, data_len), + 81 => wire__crate__api__api__decline_facetime_impl(port, ptr, rust_vec_len, data_len), + 82 => wire__crate__api__api__decline_invite_impl(port, ptr, rust_vec_len, data_len), + 92 => wire__crate__api__api__decode_profile_message_impl(port, ptr, rust_vec_len, data_len), + 93 => wire__crate__api__api__decode_summary_info_impl(port, ptr, rust_vec_len, data_len), + 94 => wire__crate__api__api__delete_attachments_impl(port, ptr, rust_vec_len, data_len), + 95 => wire__crate__api__api__delete_beacon_share_impl(port, ptr, rust_vec_len, data_len), + 96 => wire__crate__api__api__delete_chats_impl(port, ptr, rust_vec_len, data_len), + 97 => wire__crate__api__api__delete_group_impl(port, ptr, rust_vec_len, data_len), + 98 => wire__crate__api__api__delete_messages_impl(port, ptr, rust_vec_len, data_len), + 99 => wire__crate__api__api__delete_passkey_impl(port, ptr, rust_vec_len, data_len), + 100 => wire__crate__api__api__delete_password_impl(port, ptr, rust_vec_len, data_len), + 101 => wire__crate__api__api__delete_password_meta_impl(port, ptr, rust_vec_len, data_len), + 102 => wire__crate__api__api__delete_wifi_password_impl(port, ptr, rust_vec_len, data_len), + 103 => wire__crate__api__api__do_first_time_init_impl(port, ptr, rust_vec_len, data_len), + 104 => wire__crate__api__api__do_login_impl(port, ptr, rust_vec_len, data_len), + 105 => wire__crate__api__api__do_reregister_impl(port, ptr, rust_vec_len, data_len), + 106 => wire__crate__api__api__download_attachment_impl(port, ptr, rust_vec_len, data_len), + 107 => wire__crate__api__api__download_cloud_attachments_impl( + port, + ptr, + rust_vec_len, + data_len, + ), + 108 => wire__crate__api__api__download_cloud_group_photos_impl( + port, + ptr, + rust_vec_len, + data_len, + ), + 109 => wire__crate__api__api__download_mmcs_impl(port, ptr, rust_vec_len, data_len), + 115 => wire__crate__api__api__encode_hex_impl(port, ptr, rust_vec_len, data_len), + 121 => { + wire__crate__api__api__encode_profile_message_impl(port, ptr, rust_vec_len, data_len) + } + 122 => wire__crate__api__api__encode_summary_info_impl(port, ptr, rust_vec_len, data_len), + 123 => wire__crate__api__api__fetch_profile_impl(port, ptr, rust_vec_len, data_len), + 124 => { + wire__crate__api__api__ffi_file_packager_default_impl(port, ptr, rust_vec_len, data_len) + } + 125 => wire__crate__api__api__from_poster_impl(port, ptr, rust_vec_len, data_len), + 126 => wire__crate__api__api__from_poster_save_impl(port, ptr, rust_vec_len, data_len), + 127 => wire__crate__api__api__from_transcript_poster_save_impl( + port, + ptr, + rust_vec_len, + data_len, + ), + 128 => wire__crate__api__api__ft_sessions_impl(port, ptr, rust_vec_len, data_len), + 129 => wire__crate__api__api__generate_udid_impl(port, ptr, rust_vec_len, data_len), + 130 => wire__crate__api__api__get_2fa_code_impl(port, ptr, rust_vec_len, data_len), + 131 => wire__crate__api__api__get_2fa_sms_opts_impl(port, ptr, rust_vec_len, data_len), + 132 => wire__crate__api__api__get_albums_impl(port, ptr, rust_vec_len, data_len), + 133 => wire__crate__api__api__get_anisette_headers_impl(port, ptr, rust_vec_len, data_len), + 134 => { + wire__crate__api__api__get_aps_connection_status_impl(port, ptr, rust_vec_len, data_len) + } + 136 => { + wire__crate__api__api__get_background_following_impl(port, ptr, rust_vec_len, data_len) + } + 137 => wire__crate__api__api__get_beacon_items_impl(port, ptr, rust_vec_len, data_len), + 138 => wire__crate__api__api__get_bottles_impl(port, ptr, rust_vec_len, data_len), + 139 => wire__crate__api__api__get_contacts_headers_impl(port, ptr, rust_vec_len, data_len), + 140 => wire__crate__api__api__get_device_info_impl(port, ptr, rust_vec_len, data_len), + 141 => wire__crate__api__api__get_devices_impl(port, ptr, rust_vec_len, data_len), + 142 => wire__crate__api__api__get_entitlements_impl(port, ptr, rust_vec_len, data_len), + 143 => wire__crate__api__api__get_following_impl(port, ptr, rust_vec_len, data_len), + 144 => wire__crate__api__api__get_ft_link_impl(port, ptr, rust_vec_len, data_len), + 145 => wire__crate__api__api__get_groups_impl(port, ptr, rust_vec_len, data_len), + 146 => wire__crate__api__api__get_handles_impl(port, ptr, rust_vec_len, data_len), + 147 => wire__crate__api__api__get_my_phone_handles_impl(port, ptr, rust_vec_len, data_len), + 148 => wire__crate__api__api__get_passkeys_impl(port, ptr, rust_vec_len, data_len), + 149 => wire__crate__api__api__get_passwords_impl(port, ptr, rust_vec_len, data_len), + 150 => wire__crate__api__api__get_passwords_meta_impl(port, ptr, rust_vec_len, data_len), + 151 => wire__crate__api__api__get_quota_info_impl(port, ptr, rust_vec_len, data_len), + 152 => wire__crate__api__api__get_regstate_impl(port, ptr, rust_vec_len, data_len), + 153 => wire__crate__api__api__get_sms_targets_impl(port, ptr, rust_vec_len, data_len), + 154 => wire__crate__api__api__get_syncstatus_impl(port, ptr, rust_vec_len, data_len), + 155 => wire__crate__api__api__get_token_impl(port, ptr, rust_vec_len, data_len), + 156 => wire__crate__api__api__get_user_name_impl(port, ptr, rust_vec_len, data_len), + 157 => wire__crate__api__api__get_wifi_passwords_impl(port, ptr, rust_vec_len, data_len), + 159 => wire__crate__api__api__invalidate_id_cache_impl(port, ptr, rust_vec_len, data_len), + 160 => wire__crate__api__api__invite_to_channel_impl(port, ptr, rust_vec_len, data_len), + 161 => wire__crate__api__api__invite_user_impl(port, ptr, rust_vec_len, data_len), + 162 => wire__crate__api__api__is_in_clique_impl(port, ptr, rust_vec_len, data_len), + 163 => { + wire__crate__api__api__join_clique_with_bottle_impl(port, ptr, rust_vec_len, data_len) + } + 164 => wire__crate__api__api__make_anisette_impl(port, ptr, rust_vec_len, data_len), + 168 => wire__crate__api__api__make_cloudkit_impl(port, ptr, rust_vec_len, data_len), + 169 => wire__crate__api__api__make_facetime_impl(port, ptr, rust_vec_len, data_len), + 170 => wire__crate__api__api__make_find_my_friends_impl(port, ptr, rust_vec_len, data_len), + 171 => wire__crate__api__api__make_find_my_phone_impl(port, ptr, rust_vec_len, data_len), + 172 => wire__crate__api__api__make_findmy_impl(port, ptr, rust_vec_len, data_len), + 173 => wire__crate__api__api__make_idms_impl(port, ptr, rust_vec_len, data_len), + 174 => wire__crate__api__api__make_imclient_impl(port, ptr, rust_vec_len, data_len), + 176 => wire__crate__api__api__make_passwords_impl(port, ptr, rust_vec_len, data_len), + 177 => wire__crate__api__api__make_profiles_impl(port, ptr, rust_vec_len, data_len), + 178 => wire__crate__api__api__make_shared_streams_impl(port, ptr, rust_vec_len, data_len), + 179 => wire__crate__api__api__make_statuskit_impl(port, ptr, rust_vec_len, data_len), + 181 => { + wire__crate__api__api__message_parts_raw_text_impl(port, ptr, rust_vec_len, data_len) + } + 183 => { + wire__crate__api__api__my_async_runtime_default_impl(port, ptr, rust_vec_len, data_len) + } + 184 => wire__crate__api__api__new_msg_impl(port, ptr, rust_vec_len, data_len), + 195 => { + wire__crate__api__api__pack_transcript_poster_impl(port, ptr, rust_vec_len, data_len) + } + 196 => wire__crate__api__api__parse_poster_impl(port, ptr, rust_vec_len, data_len), + 197 => wire__crate__api__api__parse_poster_save_impl(port, ptr, rust_vec_len, data_len), + 198 => { + wire__crate__api__api__parse_transcript_poster_impl(port, ptr, rust_vec_len, data_len) + } + 202 => wire__crate__api__api__play_find_my_sound_impl(port, ptr, rust_vec_len, data_len), + 203 => wire__crate__api__api__provisioned_flavor_default_impl( + port, + ptr, + rust_vec_len, + data_len, + ), + 204 => wire__crate__api__api__ptr_to_dart_impl(port, ptr, rust_vec_len, data_len), + 205 => wire__crate__api__api__query_handle_impl(port, ptr, rust_vec_len, data_len), + 207 => wire__crate__api__api__recv_wait_impl(port, ptr, rust_vec_len, data_len), + 208 => { + wire__crate__api__api__refresh_aps_connection_impl(port, ptr, rust_vec_len, data_len) + } + 209 => wire__crate__api__api__refresh_background_following_impl( + port, + ptr, + rust_vec_len, + data_len, + ), + 210 => wire__crate__api__api__refresh_devices_impl(port, ptr, rust_vec_len, data_len), + 211 => wire__crate__api__api__refresh_following_impl(port, ptr, rust_vec_len, data_len), + 212 => wire__crate__api__api__register_ids_impl(port, ptr, rust_vec_len, data_len), + 213 => wire__crate__api__api__remove_album_impl(port, ptr, rust_vec_len, data_len), + 214 => wire__crate__api__api__remove_user_impl(port, ptr, rust_vec_len, data_len), + 215 => wire__crate__api__api__rename_group_impl(port, ptr, rust_vec_len, data_len), + 216 => wire__crate__api__api__report_messages_impl(port, ptr, rust_vec_len, data_len), + 217 => wire__crate__api__api__request_handles_impl(port, ptr, rust_vec_len, data_len), + 219 => wire__crate__api__api__reset_channel_keys_impl(port, ptr, rust_vec_len, data_len), + 220 => wire__crate__api__api__reset_clique_impl(port, ptr, rust_vec_len, data_len), + 221 => wire__crate__api__api__reset_state_impl(port, ptr, rust_vec_len, data_len), + 222 => wire__crate__api__api__restore_account_impl(port, ptr, rust_vec_len, data_len), + 225 => wire__crate__api__api__restore_user_impl(port, ptr, rust_vec_len, data_len), + 227 => wire__crate__api__api__save_attachment_impl(port, ptr, rust_vec_len, data_len), + 228 => wire__crate__api__api__save_attachments_impl(port, ptr, rust_vec_len, data_len), + 229 => wire__crate__api__api__save_chats_impl(port, ptr, rust_vec_len, data_len), + 231 => wire__crate__api__api__save_messages_impl(port, ptr, rust_vec_len, data_len), + 232 => wire__crate__api__api__save_passkey_impl(port, ptr, rust_vec_len, data_len), + 233 => wire__crate__api__api__save_password_impl(port, ptr, rust_vec_len, data_len), + 234 => wire__crate__api__api__save_password_meta_impl(port, ptr, rust_vec_len, data_len), + 235 => wire__crate__api__api__save_user_impl(port, ptr, rust_vec_len, data_len), + 237 => wire__crate__api__api__save_wifi_password_impl(port, ptr, rust_vec_len, data_len), + 238 => { + wire__crate__api__api__select_background_friend_impl(port, ptr, rust_vec_len, data_len) + } + 239 => wire__crate__api__api__select_friend_impl(port, ptr, rust_vec_len, data_len), + 240 => wire__crate__api__api__send_impl(port, ptr, rust_vec_len, data_len), + 241 => wire__crate__api__api__send_2fa_sms_impl(port, ptr, rust_vec_len, data_len), + 242 => wire__crate__api__api__send_2fa_to_devices_impl(port, ptr, rust_vec_len, data_len), + 244 => wire__crate__api__api__service_from_ptr_impl(port, ptr, rust_vec_len, data_len), + 245 => wire__crate__api__api__set_identity_impl(port, ptr, rust_vec_len, data_len), + 246 => wire__crate__api__api__set_profile_impl(port, ptr, rust_vec_len, data_len), + 247 => wire__crate__api__api__set_status_impl(port, ptr, rust_vec_len, data_len), + 248 => wire__crate__api__api__setup_push_impl(port, ptr, rust_vec_len, data_len), + 249 => { + wire__crate__api__api__shared_push_state_restore_impl(port, ptr, rust_vec_len, data_len) + } + 250 => wire__crate__api__api__subscribe_impl(port, ptr, rust_vec_len, data_len), + 252 => wire__crate__api__api__subscribe_token_impl(port, ptr, rust_vec_len, data_len), + 253 => wire__crate__api__api__sync_attachments_impl(port, ptr, rust_vec_len, data_len), + 254 => wire__crate__api__api__sync_chats_impl(port, ptr, rust_vec_len, data_len), + 255 => wire__crate__api__api__sync_messages_impl(port, ptr, rust_vec_len, data_len), + 256 => wire__crate__api__api__sync_now_impl(port, ptr, rust_vec_len, data_len), + 257 => wire__crate__api__api__sync_passwords_impl(port, ptr, rust_vec_len, data_len), + 258 => wire__crate__api__api__sync_wifi_passwords_impl(port, ptr, rust_vec_len, data_len), + 260 => wire__crate__api__api__teardown_2fa_impl(port, ptr, rust_vec_len, data_len), + 261 => { + wire__crate__api__api__transcript_poster_save_impl(port, ptr, rust_vec_len, data_len) + } + 262 => wire__crate__api__api__try_auth_impl(port, ptr, rust_vec_len, data_len), + 263 => wire__crate__api__api__try_icloud_login_impl(port, ptr, rust_vec_len, data_len), + 264 => wire__crate__api__api__unsubscribe_impl(port, ptr, rust_vec_len, data_len), + 265 => { + wire__crate__api__api__update_account_headers_impl(port, ptr, rust_vec_len, data_len) + } + 266 => wire__crate__api__api__update_beacon_name_impl(port, ptr, rust_vec_len, data_len), + 267 => wire__crate__api__api__upload_attachment_impl(port, ptr, rust_vec_len, data_len), + 268 => { + wire__crate__api__api__upload_cloud_attachments_impl(port, ptr, rust_vec_len, data_len) + } + 269 => wire__crate__api__api__upload_group_photo_impl(port, ptr, rust_vec_len, data_len), + 270 => wire__crate__api__api__upload_mmcs_impl(port, ptr, rust_vec_len, data_len), + 271 => wire__crate__api__api__use_link_for_impl(port, ptr, rust_vec_len, data_len), + 273 => wire__crate__api__api__validate_cert_impl(port, ptr, rust_vec_len, data_len), + 274 => wire__crate__api__api__validate_relay_impl(port, ptr, rust_vec_len, data_len), + 275 => wire__crate__api__api__validate_targets_impl(port, ptr, rust_vec_len, data_len), + 276 => { + wire__crate__api__api__validate_targets_facetime_impl(port, ptr, rust_vec_len, data_len) + } + 277 => wire__crate__api__api__verify_2fa_impl(port, ptr, rust_vec_len, data_len), + 278 => wire__crate__api__api__verify_2fa_sms_impl(port, ptr, rust_vec_len, data_len), + _ => unreachable!(), } } -impl SseDecode for crate::api::api::NumOrString { - // Codec=Sse (Serialization based), see doc to use other codecs - fn sse_decode(deserializer: &mut flutter_rust_bridge::for_generated::SseDeserializer) -> Self { - let mut tag_ = ::sse_decode(deserializer); - match tag_ { - 0 => { - let mut var_field0 = ::sse_decode(deserializer); - return crate::api::api::NumOrString::Num(var_field0); - } - 1 => { - let mut var_field0 = ::sse_decode(deserializer); - return crate::api::api::NumOrString::String(var_field0); - } - 2 => { - let mut var_field0 = ::sse_decode(deserializer); - return crate::api::api::NumOrString::Bool(var_field0); - } - _ => { - unimplemented!(""); - } +fn pde_ffi_dispatcher_sync_impl( + func_id: i32, + ptr: flutter_rust_bridge::for_generated::PlatformGeneralizedUint8ListPtr, + rust_vec_len: i32, + data_len: i32, +) -> flutter_rust_bridge::for_generated::WireSyncRust2DartSse { + // Codec=Pde (Serialization + dispatch), see doc to use other codecs + match func_id { + 1 => wire__crate__api__api__LocationReport_auto_accessor_get_confidence_impl( + ptr, + rust_vec_len, + data_len, + ), + 2 => wire__crate__api__api__LocationReport_auto_accessor_get_horizontal_accuracy_impl( + ptr, + rust_vec_len, + data_len, + ), + 3 => wire__crate__api__api__LocationReport_auto_accessor_get_key_index_impl( + ptr, + rust_vec_len, + data_len, + ), + 4 => wire__crate__api__api__LocationReport_auto_accessor_get_lat_impl( + ptr, + rust_vec_len, + data_len, + ), + 5 => wire__crate__api__api__LocationReport_auto_accessor_get_long_impl( + ptr, + rust_vec_len, + data_len, + ), + 6 => wire__crate__api__api__LocationReport_auto_accessor_get_status_impl( + ptr, + rust_vec_len, + data_len, + ), + 7 => wire__crate__api__api__LocationReport_auto_accessor_get_timestamp_impl( + ptr, + rust_vec_len, + data_len, + ), + 8 => wire__crate__api__api__LocationReport_auto_accessor_set_confidence_impl( + ptr, + rust_vec_len, + data_len, + ), + 9 => wire__crate__api__api__LocationReport_auto_accessor_set_horizontal_accuracy_impl( + ptr, + rust_vec_len, + data_len, + ), + 10 => wire__crate__api__api__LocationReport_auto_accessor_set_key_index_impl( + ptr, + rust_vec_len, + data_len, + ), + 11 => wire__crate__api__api__LocationReport_auto_accessor_set_lat_impl( + ptr, + rust_vec_len, + data_len, + ), + 12 => wire__crate__api__api__LocationReport_auto_accessor_set_long_impl( + ptr, + rust_vec_len, + data_len, + ), + 13 => wire__crate__api__api__LocationReport_auto_accessor_set_status_impl( + ptr, + rust_vec_len, + data_len, + ), + 14 => wire__crate__api__api__LocationReport_auto_accessor_set_timestamp_impl( + ptr, + rust_vec_len, + data_len, + ), + 15 => wire__crate__api__api__MessageFlags_bits_impl(ptr, rust_vec_len, data_len), + 16 => { + wire__crate__api__api__MessageFlags_from_bits_truncate_impl(ptr, rust_vec_len, data_len) + } + 17 => wire__crate__api__api__SavedHardwareState_auto_accessor_get_identity_impl( + ptr, + rust_vec_len, + data_len, + ), + 18 => wire__crate__api__api__SavedHardwareState_auto_accessor_get_os_config_impl( + ptr, + rust_vec_len, + data_len, + ), + 19 => wire__crate__api__api__SavedHardwareState_auto_accessor_get_push_impl( + ptr, + rust_vec_len, + data_len, + ), + 20 => wire__crate__api__api__SavedHardwareState_auto_accessor_set_identity_impl( + ptr, + rust_vec_len, + data_len, + ), + 21 => wire__crate__api__api__SavedHardwareState_auto_accessor_set_os_config_impl( + ptr, + rust_vec_len, + data_len, + ), + 22 => wire__crate__api__api__SavedHardwareState_auto_accessor_set_push_impl( + ptr, + rust_vec_len, + data_len, + ), + 23 => wire__crate__api__api__ViableBottle_auto_accessor_get_device_name_impl( + ptr, + rust_vec_len, + data_len, + ), + 24 => wire__crate__api__api__ViableBottle_auto_accessor_get_escrow_impl( + ptr, + rust_vec_len, + data_len, + ), + 25 => wire__crate__api__api__ViableBottle_auto_accessor_get_model_class_impl( + ptr, + rust_vec_len, + data_len, + ), + 26 => wire__crate__api__api__ViableBottle_auto_accessor_get_numeric_length_impl( + ptr, + rust_vec_len, + data_len, + ), + 27 => wire__crate__api__api__ViableBottle_auto_accessor_set_device_name_impl( + ptr, + rust_vec_len, + data_len, + ), + 28 => wire__crate__api__api__ViableBottle_auto_accessor_set_escrow_impl( + ptr, + rust_vec_len, + data_len, + ), + 29 => wire__crate__api__api__ViableBottle_auto_accessor_set_model_class_impl( + ptr, + rust_vec_len, + data_len, + ), + 30 => wire__crate__api__api__ViableBottle_auto_accessor_set_numeric_length_impl( + ptr, + rust_vec_len, + data_len, + ), + 37 => wire__crate__api__api__attachment_to_cloud_impl(ptr, rust_vec_len, data_len), + 39 => wire__crate__api__api__build_watcher_impl(ptr, rust_vec_len, data_len), + 41 => wire__crate__api__api__cancel_poll_impl(ptr, rust_vec_len, data_len), + 46 => wire__crate__api__api__clone_poster_impl(ptr, rust_vec_len, data_len), + 47 => wire__crate__api__api__clone_transcript_poster_impl(ptr, rust_vec_len, data_len), + 48 => wire__crate__api__api__close_aps_impl(ptr, rust_vec_len, data_len), + 49 => wire__crate__api__api__close_client_impl(ptr, rust_vec_len, data_len), + 50 => wire__crate__api__api__close_syncmanager_impl(ptr, rust_vec_len, data_len), + 51 => wire__crate__api__api__cloud_sync_acknowledge_committed_page_lease_impl( + ptr, + rust_vec_len, + data_len, + ), + 53 => wire__crate__api__api__cloud_sync_collect_protected_garbage_impl( + ptr, + rust_vec_len, + data_len, + ), + 54 => wire__crate__api__api__cloud_sync_commit_protected_page_lease_impl( + ptr, + rust_vec_len, + data_len, + ), + 59 => { + wire__crate__api__api__cloud_sync_fingerprint_account_impl(ptr, rust_vec_len, data_len) + } + 61 => wire__crate__api__api__cloud_sync_protect_impl(ptr, rust_vec_len, data_len), + 63 => wire__crate__api__api__cloud_sync_recover_abandoned_page_leases_impl( + ptr, + rust_vec_len, + data_len, + ), + 64 => wire__crate__api__api__cloud_sync_retire_protected_references_impl( + ptr, + rust_vec_len, + data_len, + ), + 65 => wire__crate__api__api__cloud_sync_rollback_protected_page_lease_impl( + ptr, + rust_vec_len, + data_len, + ), + 67 => wire__crate__api__api__cloud_sync_unprotect_impl(ptr, rust_vec_len, data_len), + 79 => wire__crate__api__api__date_now_impl(ptr, rust_vec_len, data_len), + 80 => wire__crate__api__api__date_to_ms_impl(ptr, rust_vec_len, data_len), + 83 => wire__crate__api__api__decode_attachmentmeta_impl(ptr, rust_vec_len, data_len), + 84 => wire__crate__api__api__decode_chatproto_impl(ptr, rust_vec_len, data_len), + 85 => wire__crate__api__api__decode_extension_app_impl(ptr, rust_vec_len, data_len), + 86 => wire__crate__api__api__decode_identity_impl(ptr, rust_vec_len, data_len), + 87 => wire__crate__api__api__decode_message_info_impl(ptr, rust_vec_len, data_len), + 88 => wire__crate__api__api__decode_messageproto_impl(ptr, rust_vec_len, data_len), + 89 => wire__crate__api__api__decode_messageproto2_impl(ptr, rust_vec_len, data_len), + 90 => wire__crate__api__api__decode_messageproto3_impl(ptr, rust_vec_len, data_len), + 91 => wire__crate__api__api__decode_messageproto4_impl(ptr, rust_vec_len, data_len), + 110 => wire__crate__api__api__dup_daemon_desk_impl(ptr, rust_vec_len, data_len), + 111 => wire__crate__api__api__duplicate_user_impl(ptr, rust_vec_len, data_len), + 112 => wire__crate__api__api__encode_attachmentmeta_impl(ptr, rust_vec_len, data_len), + 113 => wire__crate__api__api__encode_chatproto_impl(ptr, rust_vec_len, data_len), + 114 => wire__crate__api__api__encode_extension_app_impl(ptr, rust_vec_len, data_len), + 116 => wire__crate__api__api__encode_message_info_impl(ptr, rust_vec_len, data_len), + 117 => wire__crate__api__api__encode_messageproto_impl(ptr, rust_vec_len, data_len), + 118 => wire__crate__api__api__encode_messageproto2_impl(ptr, rust_vec_len, data_len), + 119 => wire__crate__api__api__encode_messageproto3_impl(ptr, rust_vec_len, data_len), + 120 => wire__crate__api__api__encode_messageproto4_impl(ptr, rust_vec_len, data_len), + 135 => wire__crate__api__api__get_available_user_impl(ptr, rust_vec_len, data_len), + 158 => wire__crate__api__api__import_watcher_impl(ptr, rust_vec_len, data_len), + 165 => wire__crate__api__api__make_circle_sessions_impl(ptr, rust_vec_len, data_len), + 166 => wire__crate__api__api__make_client_session_impl(ptr, rust_vec_len, data_len), + 167 => wire__crate__api__api__make_cloud_messages_client_impl(ptr, rust_vec_len, data_len), + 175 => wire__crate__api__api__make_keychain_impl(ptr, rust_vec_len, data_len), + 180 => wire__crate__api__api__make_token_provider_impl(ptr, rust_vec_len, data_len), + 182 => wire__crate__api__api__ms_to_date_impl(ptr, rust_vec_len, data_len), + 185 => wire__crate__api__api__new_ngm_identity_impl(ptr, rust_vec_len, data_len), + 186 => wire__crate__api__api__ns_attributed_string_decode_impl(ptr, rust_vec_len, data_len), + 187 => wire__crate__api__api__ns_attributed_string_encode_impl(ptr, rust_vec_len, data_len), + 188 => wire__crate__api__api__ns_null_impl(ptr, rust_vec_len, data_len), + 189 => wire__crate__api__api__ns_number_decode_impl(ptr, rust_vec_len, data_len), + 190 => wire__crate__api__api__ns_number_encode_impl(ptr, rust_vec_len, data_len), + 191 => wire__crate__api__api__ns_string_decode_impl(ptr, rust_vec_len, data_len), + 192 => wire__crate__api__api__ns_string_encode_impl(ptr, rust_vec_len, data_len), + 193 => wire__crate__api__api__nscoder_decode_impl(ptr, rust_vec_len, data_len), + 194 => wire__crate__api__api__nscoder_encode_impl(ptr, rust_vec_len, data_len), + 199 => { + wire__crate__api__api__password_manager_meta_get_data_impl(ptr, rust_vec_len, data_len) } + 200 => wire__crate__api__api__password_manager_meta_get_password_data_impl( + ptr, + rust_vec_len, + data_len, + ), + 201 => wire__crate__api__api__password_manager_totp_generate_otp_impl( + ptr, + rust_vec_len, + data_len, + ), + 206 => wire__crate__api__api__read_hardware_impl(ptr, rust_vec_len, data_len), + 218 => wire__crate__api__api__reset_anisette_impl(ptr, rust_vec_len, data_len), + 223 => wire__crate__api__api__restore_attachment_impl(ptr, rust_vec_len, data_len), + 224 => wire__crate__api__api__restore_cloud_chat_impl(ptr, rust_vec_len, data_len), + 226 => wire__crate__api__api__restore_users_impl(ptr, rust_vec_len, data_len), + 230 => wire__crate__api__api__save_cloud_chat_impl(ptr, rust_vec_len, data_len), + 236 => wire__crate__api__api__save_users_impl(ptr, rust_vec_len, data_len), + 243 => wire__crate__api__api__send_daemon_impl(ptr, rust_vec_len, data_len), + 251 => wire__crate__api__api__subscribe_conn_impl(ptr, rust_vec_len, data_len), + 259 => wire__crate__api__api__systemtime_to_millis_impl(ptr, rust_vec_len, data_len), + 272 => wire__crate__api__api__utm_now_impl(ptr, rust_vec_len, data_len), + _ => unreachable!(), } } -impl SseDecode for crate::api::api::OperatedChat { - // Codec=Sse (Serialization based), see doc to use other codecs - fn sse_decode(deserializer: &mut flutter_rust_bridge::for_generated::SseDeserializer) -> Self { - let mut var_participants = >::sse_decode(deserializer); - let mut var_groupId = ::sse_decode(deserializer); - let mut var_guid = ::sse_decode(deserializer); - let mut var_deleteIncomingMessages = >::sse_decode(deserializer); - let mut var_wasReportedAsJunk = >::sse_decode(deserializer); - return crate::api::api::OperatedChat { - participants: var_participants, - group_id: var_groupId, - guid: var_guid, - delete_incoming_messages: var_deleteIncomingMessages, - was_reported_as_junk: var_wasReportedAsJunk, - }; - } -} +// Section: rust2dart -impl SseDecode for Option { - // Codec=Sse (Serialization based), see doc to use other codecs - fn sse_decode(deserializer: &mut flutter_rust_bridge::for_generated::SseDeserializer) -> Self { - if (::sse_decode(deserializer)) { - return Some(::sse_decode(deserializer)); - } else { - return None; - } +// Codec=Dco (DartCObject based), see doc to use other codecs +impl flutter_rust_bridge::IntoDart for FrbWrapper { + fn into_dart(self) -> flutter_rust_bridge::for_generated::DartAbi { + flutter_rust_bridge::for_generated::rust_auto_opaque_encode::<_, MoiArc<_>>(self.0) + .into_dart() } } +impl flutter_rust_bridge::for_generated::IntoDartExceptPrimitive for FrbWrapper {} -impl SseDecode for Option { - // Codec=Sse (Serialization based), see doc to use other codecs - fn sse_decode(deserializer: &mut flutter_rust_bridge::for_generated::SseDeserializer) -> Self { - if (::sse_decode(deserializer)) { - return Some(::sse_decode(deserializer)); - } else { - return None; - } +impl flutter_rust_bridge::IntoIntoDart> for APSConnection { + fn into_into_dart(self) -> FrbWrapper { + self.into() } } -impl SseDecode for Option { - // Codec=Sse (Serialization based), see doc to use other codecs - fn sse_decode(deserializer: &mut flutter_rust_bridge::for_generated::SseDeserializer) -> Self { - if (::sse_decode(deserializer)) { - return Some(::sse_decode(deserializer)); - } else { - return None; - } +// Codec=Dco (DartCObject based), see doc to use other codecs +impl flutter_rust_bridge::IntoDart for FrbWrapper { + fn into_dart(self) -> flutter_rust_bridge::for_generated::DartAbi { + flutter_rust_bridge::for_generated::rust_auto_opaque_encode::<_, MoiArc<_>>(self.0) + .into_dart() } } +impl flutter_rust_bridge::for_generated::IntoDartExceptPrimitive for FrbWrapper {} -impl SseDecode for Option { - // Codec=Sse (Serialization based), see doc to use other codecs - fn sse_decode(deserializer: &mut flutter_rust_bridge::for_generated::SseDeserializer) -> Self { - if (::sse_decode(deserializer)) { - return Some(::sse_decode(deserializer)); - } else { - return None; - } +impl flutter_rust_bridge::IntoIntoDart> for APSState { + fn into_into_dart(self) -> FrbWrapper { + self.into() } } -impl SseDecode for Option { - // Codec=Sse (Serialization based), see doc to use other codecs - fn sse_decode(deserializer: &mut flutter_rust_bridge::for_generated::SseDeserializer) -> Self { - if (::sse_decode(deserializer)) { - return Some(::sse_decode(deserializer)); - } else { - return None; - } +// Codec=Dco (DartCObject based), see doc to use other codecs +impl flutter_rust_bridge::IntoDart for FrbWrapper { + fn into_dart(self) -> flutter_rust_bridge::for_generated::DartAbi { + flutter_rust_bridge::for_generated::rust_auto_opaque_encode::<_, MoiArc<_>>(self.0) + .into_dart() } } +impl flutter_rust_bridge::for_generated::IntoDartExceptPrimitive for FrbWrapper {} -impl SseDecode for Option>> { - // Codec=Sse (Serialization based), see doc to use other codecs - fn sse_decode(deserializer: &mut flutter_rust_bridge::for_generated::SseDeserializer) -> Self { - if (::sse_decode(deserializer)) { - return Some(>>::sse_decode( - deserializer, - )); - } else { - return None; - } +impl flutter_rust_bridge::IntoIntoDart> for APSWatcher { + fn into_into_dart(self) -> FrbWrapper { + self.into() } } -impl SseDecode for Option>> { - // Codec=Sse (Serialization based), see doc to use other codecs - fn sse_decode(deserializer: &mut flutter_rust_bridge::for_generated::SseDeserializer) -> Self { - if (::sse_decode(deserializer)) { - return Some( - >>::sse_decode(deserializer), - ); - } else { - return None; - } +// Codec=Dco (DartCObject based), see doc to use other codecs +impl flutter_rust_bridge::IntoDart for FrbWrapper> { + fn into_dart(self) -> flutter_rust_bridge::for_generated::DartAbi { + flutter_rust_bridge::for_generated::rust_auto_opaque_encode::<_, MoiArc<_>>(self.0) + .into_dart() } } - -impl SseDecode for Option>> { - // Codec=Sse (Serialization based), see doc to use other codecs - fn sse_decode(deserializer: &mut flutter_rust_bridge::for_generated::SseDeserializer) -> Self { - if (::sse_decode(deserializer)) { - return Some(>>::sse_decode( - deserializer, - )); - } else { - return None; - } - } +impl flutter_rust_bridge::for_generated::IntoDartExceptPrimitive + for FrbWrapper> +{ } -impl SseDecode for Option>> { - // Codec=Sse (Serialization based), see doc to use other codecs - fn sse_decode(deserializer: &mut flutter_rust_bridge::for_generated::SseDeserializer) -> Self { - if (::sse_decode(deserializer)) { - return Some(>>::sse_decode( - deserializer, - )); - } else { - return None; - } +impl flutter_rust_bridge::IntoIntoDart>> + for ArcAnisetteClient +{ + fn into_into_dart(self) -> FrbWrapper> { + self.into() } } -impl SseDecode for Option>>> { - // Codec=Sse (Serialization based), see doc to use other codecs - fn sse_decode(deserializer: &mut flutter_rust_bridge::for_generated::SseDeserializer) -> Self { - if (::sse_decode(deserializer)) { - return Some( - >>>::sse_decode(deserializer), - ); - } else { - return None; - } +// Codec=Dco (DartCObject based), see doc to use other codecs +impl flutter_rust_bridge::IntoDart for FrbWrapper>> { + fn into_dart(self) -> flutter_rust_bridge::for_generated::DartAbi { + flutter_rust_bridge::for_generated::rust_auto_opaque_encode::<_, MoiArc<_>>(self.0) + .into_dart() } } - -impl SseDecode for Option>> { - // Codec=Sse (Serialization based), see doc to use other codecs - fn sse_decode(deserializer: &mut flutter_rust_bridge::for_generated::SseDeserializer) -> Self { - if (::sse_decode(deserializer)) { - return Some(>>::sse_decode( - deserializer, - )); - } else { - return None; - } - } +impl flutter_rust_bridge::for_generated::IntoDartExceptPrimitive + for FrbWrapper>> +{ } -impl SseDecode for Option { - // Codec=Sse (Serialization based), see doc to use other codecs - fn sse_decode(deserializer: &mut flutter_rust_bridge::for_generated::SseDeserializer) -> Self { - if (::sse_decode(deserializer)) { - return Some(::sse_decode(deserializer)); - } else { - return None; - } +impl flutter_rust_bridge::IntoIntoDart>>> + for Arc> +{ + fn into_into_dart(self) -> FrbWrapper>> { + self.into() } } -impl SseDecode for Option { - // Codec=Sse (Serialization based), see doc to use other codecs - fn sse_decode(deserializer: &mut flutter_rust_bridge::for_generated::SseDeserializer) -> Self { - if (::sse_decode(deserializer)) { - return Some(::sse_decode(deserializer)); - } else { - return None; - } +// Codec=Dco (DartCObject based), see doc to use other codecs +impl flutter_rust_bridge::IntoDart + for FrbWrapper>> +{ + fn into_dart(self) -> flutter_rust_bridge::for_generated::DartAbi { + flutter_rust_bridge::for_generated::rust_auto_opaque_encode::<_, MoiArc<_>>(self.0) + .into_dart() } } - -impl SseDecode for Option> { - // Codec=Sse (Serialization based), see doc to use other codecs - fn sse_decode(deserializer: &mut flutter_rust_bridge::for_generated::SseDeserializer) -> Self { - if (::sse_decode(deserializer)) { - return Some(>::sse_decode( - deserializer, - )); - } else { - return None; - } - } +impl flutter_rust_bridge::for_generated::IntoDartExceptPrimitive + for FrbWrapper>> +{ } -impl SseDecode for Option { - // Codec=Sse (Serialization based), see doc to use other codecs - fn sse_decode(deserializer: &mut flutter_rust_bridge::for_generated::SseDeserializer) -> Self { - if (::sse_decode(deserializer)) { - return Some(::sse_decode(deserializer)); - } else { - return None; - } +impl + flutter_rust_bridge::IntoIntoDart>>> + for Arc> +{ + fn into_into_dart(self) -> FrbWrapper>> { + self.into() } } -impl SseDecode for Option { - // Codec=Sse (Serialization based), see doc to use other codecs - fn sse_decode(deserializer: &mut flutter_rust_bridge::for_generated::SseDeserializer) -> Self { - if (::sse_decode(deserializer)) { - return Some(::sse_decode(deserializer)); - } else { - return None; - } +// Codec=Dco (DartCObject based), see doc to use other codecs +impl flutter_rust_bridge::IntoDart for FrbWrapper> { + fn into_dart(self) -> flutter_rust_bridge::for_generated::DartAbi { + flutter_rust_bridge::for_generated::rust_auto_opaque_encode::<_, MoiArc<_>>(self.0) + .into_dart() } } +impl flutter_rust_bridge::for_generated::IntoDartExceptPrimitive for FrbWrapper> {} -impl SseDecode for Option { - // Codec=Sse (Serialization based), see doc to use other codecs - fn sse_decode(deserializer: &mut flutter_rust_bridge::for_generated::SseDeserializer) -> Self { - if (::sse_decode(deserializer)) { - return Some(::sse_decode(deserializer)); - } else { - return None; - } +impl flutter_rust_bridge::IntoIntoDart>> for Arc { + fn into_into_dart(self) -> FrbWrapper> { + self.into() } } -impl SseDecode for Option> { - // Codec=Sse (Serialization based), see doc to use other codecs - fn sse_decode(deserializer: &mut flutter_rust_bridge::for_generated::SseDeserializer) -> Self { - if (::sse_decode(deserializer)) { - return Some(>::sse_decode(deserializer)); - } else { - return None; - } +// Codec=Dco (DartCObject based), see doc to use other codecs +impl flutter_rust_bridge::IntoDart for FrbWrapper>> { + fn into_dart(self) -> flutter_rust_bridge::for_generated::DartAbi { + flutter_rust_bridge::for_generated::rust_auto_opaque_encode::<_, MoiArc<_>>(self.0) + .into_dart() } } - -impl SseDecode for Option> { - // Codec=Sse (Serialization based), see doc to use other codecs - fn sse_decode(deserializer: &mut flutter_rust_bridge::for_generated::SseDeserializer) -> Self { - if (::sse_decode(deserializer)) { - return Some(>::sse_decode(deserializer)); - } else { - return None; - } - } +impl flutter_rust_bridge::for_generated::IntoDartExceptPrimitive + for FrbWrapper>> +{ } -impl SseDecode for Option> { - // Codec=Sse (Serialization based), see doc to use other codecs - fn sse_decode(deserializer: &mut flutter_rust_bridge::for_generated::SseDeserializer) -> Self { - if (::sse_decode(deserializer)) { - return Some(>::sse_decode(deserializer)); - } else { - return None; - } +impl flutter_rust_bridge::IntoIntoDart>>> + for Arc> +{ + fn into_into_dart(self) -> FrbWrapper>> { + self.into() } } -impl SseDecode for Option> { - // Codec=Sse (Serialization based), see doc to use other codecs - fn sse_decode(deserializer: &mut flutter_rust_bridge::for_generated::SseDeserializer) -> Self { - if (::sse_decode(deserializer)) { - return Some(>::sse_decode(deserializer)); - } else { - return None; - } +// Codec=Dco (DartCObject based), see doc to use other codecs +impl flutter_rust_bridge::IntoDart for FrbWrapper> { + fn into_dart(self) -> flutter_rust_bridge::for_generated::DartAbi { + flutter_rust_bridge::for_generated::rust_auto_opaque_encode::<_, MoiArc<_>>(self.0) + .into_dart() } } +impl flutter_rust_bridge::for_generated::IntoDartExceptPrimitive for FrbWrapper> {} -impl SseDecode for Option { - // Codec=Sse (Serialization based), see doc to use other codecs - fn sse_decode(deserializer: &mut flutter_rust_bridge::for_generated::SseDeserializer) -> Self { - if (::sse_decode(deserializer)) { - return Some(::sse_decode(deserializer)); - } else { - return None; - } +impl flutter_rust_bridge::IntoIntoDart>> for Arc { + fn into_into_dart(self) -> FrbWrapper> { + self.into() } } -impl SseDecode for Option { - // Codec=Sse (Serialization based), see doc to use other codecs - fn sse_decode(deserializer: &mut flutter_rust_bridge::for_generated::SseDeserializer) -> Self { - if (::sse_decode(deserializer)) { - return Some(::sse_decode(deserializer)); - } else { - return None; - } +// Codec=Dco (DartCObject based), see doc to use other codecs +impl flutter_rust_bridge::IntoDart for FrbWrapper> { + fn into_dart(self) -> flutter_rust_bridge::for_generated::DartAbi { + flutter_rust_bridge::for_generated::rust_auto_opaque_encode::<_, MoiArc<_>>(self.0) + .into_dart() } } - -impl SseDecode for Option> { - // Codec=Sse (Serialization based), see doc to use other codecs - fn sse_decode(deserializer: &mut flutter_rust_bridge::for_generated::SseDeserializer) -> Self { - if (::sse_decode(deserializer)) { - return Some(>::sse_decode(deserializer)); - } else { - return None; - } - } +impl flutter_rust_bridge::for_generated::IntoDartExceptPrimitive + for FrbWrapper> +{ } -impl SseDecode for Option> { - // Codec=Sse (Serialization based), see doc to use other codecs - fn sse_decode(deserializer: &mut flutter_rust_bridge::for_generated::SseDeserializer) -> Self { - if (::sse_decode(deserializer)) { - return Some(>::sse_decode(deserializer)); - } else { - return None; - } +impl flutter_rust_bridge::IntoIntoDart>> + for Arc +{ + fn into_into_dart(self) -> FrbWrapper> { + self.into() } } -impl SseDecode for Option { - // Codec=Sse (Serialization based), see doc to use other codecs - fn sse_decode(deserializer: &mut flutter_rust_bridge::for_generated::SseDeserializer) -> Self { - if (::sse_decode(deserializer)) { - return Some(::sse_decode(deserializer)); - } else { - return None; - } +// Codec=Dco (DartCObject based), see doc to use other codecs +impl flutter_rust_bridge::IntoDart for FrbWrapper>> { + fn into_dart(self) -> flutter_rust_bridge::for_generated::DartAbi { + flutter_rust_bridge::for_generated::rust_auto_opaque_encode::<_, MoiArc<_>>(self.0) + .into_dart() } } - -impl SseDecode for Option { - // Codec=Sse (Serialization based), see doc to use other codecs - fn sse_decode(deserializer: &mut flutter_rust_bridge::for_generated::SseDeserializer) -> Self { - if (::sse_decode(deserializer)) { - return Some(::sse_decode(deserializer)); - } else { - return None; - } - } +impl flutter_rust_bridge::for_generated::IntoDartExceptPrimitive + for FrbWrapper>> +{ } -impl SseDecode for Option> { - // Codec=Sse (Serialization based), see doc to use other codecs - fn sse_decode(deserializer: &mut flutter_rust_bridge::for_generated::SseDeserializer) -> Self { - if (::sse_decode(deserializer)) { - return Some( - >::sse_decode(deserializer), - ); - } else { - return None; - } +impl flutter_rust_bridge::IntoIntoDart>>> + for Arc> +{ + fn into_into_dart(self) -> FrbWrapper>> { + self.into() } } -impl SseDecode for Option { - // Codec=Sse (Serialization based), see doc to use other codecs - fn sse_decode(deserializer: &mut flutter_rust_bridge::for_generated::SseDeserializer) -> Self { - if (::sse_decode(deserializer)) { - return Some(::sse_decode(deserializer)); - } else { - return None; - } +// Codec=Dco (DartCObject based), see doc to use other codecs +impl flutter_rust_bridge::IntoDart + for FrbWrapper>>> +{ + fn into_dart(self) -> flutter_rust_bridge::for_generated::DartAbi { + flutter_rust_bridge::for_generated::rust_auto_opaque_encode::<_, MoiArc<_>>(self.0) + .into_dart() } } - -impl SseDecode for Option { - // Codec=Sse (Serialization based), see doc to use other codecs - fn sse_decode(deserializer: &mut flutter_rust_bridge::for_generated::SseDeserializer) -> Self { - if (::sse_decode(deserializer)) { - return Some(::sse_decode(deserializer)); - } else { - return None; - } - } +impl flutter_rust_bridge::for_generated::IntoDartExceptPrimitive + for FrbWrapper>>> +{ } -impl SseDecode for Option { - // Codec=Sse (Serialization based), see doc to use other codecs - fn sse_decode(deserializer: &mut flutter_rust_bridge::for_generated::SseDeserializer) -> Self { - if (::sse_decode(deserializer)) { - return Some(::sse_decode(deserializer)); - } else { - return None; - } +impl + flutter_rust_bridge::IntoIntoDart>>>> + for Arc>> +{ + fn into_into_dart(self) -> FrbWrapper>>> { + self.into() } } -impl SseDecode for Option { - // Codec=Sse (Serialization based), see doc to use other codecs - fn sse_decode(deserializer: &mut flutter_rust_bridge::for_generated::SseDeserializer) -> Self { - if (::sse_decode(deserializer)) { - return Some(::sse_decode( - deserializer, - )); - } else { - return None; - } +// Codec=Dco (DartCObject based), see doc to use other codecs +impl flutter_rust_bridge::IntoDart + for FrbWrapper>>>> +{ + fn into_dart(self) -> flutter_rust_bridge::for_generated::DartAbi { + flutter_rust_bridge::for_generated::rust_auto_opaque_encode::<_, MoiArc<_>>(self.0) + .into_dart() } } +impl flutter_rust_bridge::for_generated::IntoDartExceptPrimitive + for FrbWrapper>>>> +{ +} -impl SseDecode for Option { - // Codec=Sse (Serialization based), see doc to use other codecs - fn sse_decode(deserializer: &mut flutter_rust_bridge::for_generated::SseDeserializer) -> Self { - if (::sse_decode(deserializer)) { - return Some(::sse_decode(deserializer)); - } else { - return None; - } +impl + flutter_rust_bridge::IntoIntoDart< + FrbWrapper>>>>, + > for Arc>>> +{ + fn into_into_dart( + self, + ) -> FrbWrapper>>>> { + self.into() } } -impl SseDecode for Option { - // Codec=Sse (Serialization based), see doc to use other codecs - fn sse_decode(deserializer: &mut flutter_rust_bridge::for_generated::SseDeserializer) -> Self { - if (::sse_decode(deserializer)) { - return Some(::sse_decode(deserializer)); - } else { - return None; - } +// Codec=Dco (DartCObject based), see doc to use other codecs +impl flutter_rust_bridge::IntoDart for FrbWrapper>>> { + fn into_dart(self) -> flutter_rust_bridge::for_generated::DartAbi { + flutter_rust_bridge::for_generated::rust_auto_opaque_encode::<_, MoiArc<_>>(self.0) + .into_dart() } } - -impl SseDecode for Option { - // Codec=Sse (Serialization based), see doc to use other codecs - fn sse_decode(deserializer: &mut flutter_rust_bridge::for_generated::SseDeserializer) -> Self { - if (::sse_decode(deserializer)) { - return Some(::sse_decode(deserializer)); - } else { - return None; - } - } +impl flutter_rust_bridge::for_generated::IntoDartExceptPrimitive + for FrbWrapper>>> +{ } -impl SseDecode for Option { - // Codec=Sse (Serialization based), see doc to use other codecs - fn sse_decode(deserializer: &mut flutter_rust_bridge::for_generated::SseDeserializer) -> Self { - if (::sse_decode(deserializer)) { - return Some(::sse_decode( - deserializer, - )); - } else { - return None; - } +impl flutter_rust_bridge::IntoIntoDart>>>> + for Arc>> +{ + fn into_into_dart(self) -> FrbWrapper>>> { + self.into() } } -impl SseDecode for Option { - // Codec=Sse (Serialization based), see doc to use other codecs - fn sse_decode(deserializer: &mut flutter_rust_bridge::for_generated::SseDeserializer) -> Self { - if (::sse_decode(deserializer)) { - return Some(::sse_decode(deserializer)); - } else { - return None; - } +// Codec=Dco (DartCObject based), see doc to use other codecs +impl flutter_rust_bridge::IntoDart for FrbWrapper>> { + fn into_dart(self) -> flutter_rust_bridge::for_generated::DartAbi { + flutter_rust_bridge::for_generated::rust_auto_opaque_encode::<_, MoiArc<_>>(self.0) + .into_dart() } } +impl flutter_rust_bridge::for_generated::IntoDartExceptPrimitive + for FrbWrapper>> +{ +} -impl SseDecode for Option { - // Codec=Sse (Serialization based), see doc to use other codecs - fn sse_decode(deserializer: &mut flutter_rust_bridge::for_generated::SseDeserializer) -> Self { - if (::sse_decode(deserializer)) { - return Some(::sse_decode(deserializer)); - } else { - return None; - } +impl flutter_rust_bridge::IntoIntoDart>>> + for Arc> +{ + fn into_into_dart(self) -> FrbWrapper>> { + self.into() } } -impl SseDecode for Option { - // Codec=Sse (Serialization based), see doc to use other codecs - fn sse_decode(deserializer: &mut flutter_rust_bridge::for_generated::SseDeserializer) -> Self { - if (::sse_decode(deserializer)) { - return Some(::sse_decode(deserializer)); - } else { - return None; - } +// Codec=Dco (DartCObject based), see doc to use other codecs +impl flutter_rust_bridge::IntoDart for FrbWrapper>> { + fn into_dart(self) -> flutter_rust_bridge::for_generated::DartAbi { + flutter_rust_bridge::for_generated::rust_auto_opaque_encode::<_, MoiArc<_>>(self.0) + .into_dart() } } +impl flutter_rust_bridge::for_generated::IntoDartExceptPrimitive + for FrbWrapper>> +{ +} -impl SseDecode for Option { - // Codec=Sse (Serialization based), see doc to use other codecs - fn sse_decode(deserializer: &mut flutter_rust_bridge::for_generated::SseDeserializer) -> Self { - if (::sse_decode(deserializer)) { - return Some(::sse_decode(deserializer)); - } else { - return None; - } +impl flutter_rust_bridge::IntoIntoDart>>> + for Arc> +{ + fn into_into_dart(self) -> FrbWrapper>> { + self.into() } } -impl SseDecode for Option { - // Codec=Sse (Serialization based), see doc to use other codecs - fn sse_decode(deserializer: &mut flutter_rust_bridge::for_generated::SseDeserializer) -> Self { - if (::sse_decode(deserializer)) { - return Some(::sse_decode( - deserializer, - )); - } else { - return None; - } +// Codec=Dco (DartCObject based), see doc to use other codecs +impl flutter_rust_bridge::IntoDart for FrbWrapper>> { + fn into_dart(self) -> flutter_rust_bridge::for_generated::DartAbi { + flutter_rust_bridge::for_generated::rust_auto_opaque_encode::<_, MoiArc<_>>(self.0) + .into_dart() } } +impl flutter_rust_bridge::for_generated::IntoDartExceptPrimitive + for FrbWrapper>> +{ +} -impl SseDecode for Option { - // Codec=Sse (Serialization based), see doc to use other codecs - fn sse_decode(deserializer: &mut flutter_rust_bridge::for_generated::SseDeserializer) -> Self { - if (::sse_decode(deserializer)) { - return Some(::sse_decode( - deserializer, - )); - } else { - return None; - } +impl flutter_rust_bridge::IntoIntoDart>>> + for Arc> +{ + fn into_into_dart(self) -> FrbWrapper>> { + self.into() } } -impl SseDecode for Option { - // Codec=Sse (Serialization based), see doc to use other codecs - fn sse_decode(deserializer: &mut flutter_rust_bridge::for_generated::SseDeserializer) -> Self { - if (::sse_decode(deserializer)) { - return Some(::sse_decode(deserializer)); - } else { - return None; - } +// Codec=Dco (DartCObject based), see doc to use other codecs +impl flutter_rust_bridge::IntoDart for FrbWrapper> { + fn into_dart(self) -> flutter_rust_bridge::for_generated::DartAbi { + flutter_rust_bridge::for_generated::rust_auto_opaque_encode::<_, MoiArc<_>>(self.0) + .into_dart() } } +impl flutter_rust_bridge::for_generated::IntoDartExceptPrimitive + for FrbWrapper> +{ +} -impl SseDecode for Option { - // Codec=Sse (Serialization based), see doc to use other codecs - fn sse_decode(deserializer: &mut flutter_rust_bridge::for_generated::SseDeserializer) -> Self { - if (::sse_decode(deserializer)) { - return Some(::sse_decode(deserializer)); - } else { - return None; - } +impl flutter_rust_bridge::IntoIntoDart>> for Arc { + fn into_into_dart(self) -> FrbWrapper> { + self.into() } } -impl SseDecode for Option { - // Codec=Sse (Serialization based), see doc to use other codecs - fn sse_decode(deserializer: &mut flutter_rust_bridge::for_generated::SseDeserializer) -> Self { - if (::sse_decode(deserializer)) { - return Some(::sse_decode(deserializer)); - } else { - return None; - } +// Codec=Dco (DartCObject based), see doc to use other codecs +impl flutter_rust_bridge::IntoDart for FrbWrapper>> { + fn into_dart(self) -> flutter_rust_bridge::for_generated::DartAbi { + flutter_rust_bridge::for_generated::rust_auto_opaque_encode::<_, MoiArc<_>>(self.0) + .into_dart() } } +impl flutter_rust_bridge::for_generated::IntoDartExceptPrimitive + for FrbWrapper>> +{ +} -impl SseDecode for Option { - // Codec=Sse (Serialization based), see doc to use other codecs - fn sse_decode(deserializer: &mut flutter_rust_bridge::for_generated::SseDeserializer) -> Self { - if (::sse_decode(deserializer)) { - return Some(::sse_decode(deserializer)); - } else { - return None; - } +impl flutter_rust_bridge::IntoIntoDart>>> + for Arc> +{ + fn into_into_dart(self) -> FrbWrapper>> { + self.into() } } -impl SseDecode for Option { - // Codec=Sse (Serialization based), see doc to use other codecs - fn sse_decode(deserializer: &mut flutter_rust_bridge::for_generated::SseDeserializer) -> Self { - if (::sse_decode(deserializer)) { - return Some(::sse_decode( - deserializer, - )); - } else { - return None; - } +// Codec=Dco (DartCObject based), see doc to use other codecs +impl flutter_rust_bridge::IntoDart for FrbWrapper>> { + fn into_dart(self) -> flutter_rust_bridge::for_generated::DartAbi { + flutter_rust_bridge::for_generated::rust_auto_opaque_encode::<_, MoiArc<_>>(self.0) + .into_dart() } } +impl flutter_rust_bridge::for_generated::IntoDartExceptPrimitive + for FrbWrapper>> +{ +} -impl SseDecode for Option { - // Codec=Sse (Serialization based), see doc to use other codecs - fn sse_decode(deserializer: &mut flutter_rust_bridge::for_generated::SseDeserializer) -> Self { - if (::sse_decode(deserializer)) { - return Some(::sse_decode( - deserializer, - )); - } else { - return None; - } +impl flutter_rust_bridge::IntoIntoDart>>> + for Arc> +{ + fn into_into_dart(self) -> FrbWrapper>> { + self.into() } } -impl SseDecode for Option { - // Codec=Sse (Serialization based), see doc to use other codecs - fn sse_decode(deserializer: &mut flutter_rust_bridge::for_generated::SseDeserializer) -> Self { - if (::sse_decode(deserializer)) { - return Some(::sse_decode(deserializer)); - } else { - return None; - } +// Codec=Dco (DartCObject based), see doc to use other codecs +impl flutter_rust_bridge::IntoDart for FrbWrapper { + fn into_dart(self) -> flutter_rust_bridge::for_generated::DartAbi { + flutter_rust_bridge::for_generated::rust_auto_opaque_encode::<_, MoiArc<_>>(self.0) + .into_dart() } } +impl flutter_rust_bridge::for_generated::IntoDartExceptPrimitive for FrbWrapper {} -impl SseDecode for Option { - // Codec=Sse (Serialization based), see doc to use other codecs - fn sse_decode(deserializer: &mut flutter_rust_bridge::for_generated::SseDeserializer) -> Self { - if (::sse_decode(deserializer)) { - return Some(::sse_decode(deserializer)); - } else { - return None; - } +impl flutter_rust_bridge::IntoIntoDart> for Asset { + fn into_into_dart(self) -> FrbWrapper { + self.into() } } -impl SseDecode for Option { - // Codec=Sse (Serialization based), see doc to use other codecs - fn sse_decode(deserializer: &mut flutter_rust_bridge::for_generated::SseDeserializer) -> Self { - if (::sse_decode(deserializer)) { - return Some(::sse_decode(deserializer)); - } else { - return None; - } +// Codec=Dco (DartCObject based), see doc to use other codecs +impl flutter_rust_bridge::IntoDart for FrbWrapper { + fn into_dart(self) -> flutter_rust_bridge::for_generated::DartAbi { + flutter_rust_bridge::for_generated::rust_auto_opaque_encode::<_, MoiArc<_>>(self.0) + .into_dart() } } +impl flutter_rust_bridge::for_generated::IntoDartExceptPrimitive + for FrbWrapper +{ +} -impl SseDecode for Option { - // Codec=Sse (Serialization based), see doc to use other codecs - fn sse_decode(deserializer: &mut flutter_rust_bridge::for_generated::SseDeserializer) -> Self { - if (::sse_decode(deserializer)) { - return Some(::sse_decode(deserializer)); - } else { - return None; - } +impl flutter_rust_bridge::IntoIntoDart> for ChannelInterestToken { + fn into_into_dart(self) -> FrbWrapper { + self.into() } } -impl SseDecode for Option { - // Codec=Sse (Serialization based), see doc to use other codecs - fn sse_decode(deserializer: &mut flutter_rust_bridge::for_generated::SseDeserializer) -> Self { - if (::sse_decode(deserializer)) { - return Some(::sse_decode(deserializer)); - } else { - return None; - } +// Codec=Dco (DartCObject based), see doc to use other codecs +impl flutter_rust_bridge::IntoDart for FrbWrapper> { + fn into_dart(self) -> flutter_rust_bridge::for_generated::DartAbi { + flutter_rust_bridge::for_generated::rust_auto_opaque_encode::<_, MoiArc<_>>(self.0) + .into_dart() } } +impl flutter_rust_bridge::for_generated::IntoDartExceptPrimitive + for FrbWrapper> +{ +} -impl SseDecode for Option { - // Codec=Sse (Serialization based), see doc to use other codecs - fn sse_decode(deserializer: &mut flutter_rust_bridge::for_generated::SseDeserializer) -> Self { - if (::sse_decode(deserializer)) { - return Some(::sse_decode( - deserializer, - )); - } else { - return None; - } +impl flutter_rust_bridge::IntoIntoDart>> + for CircleClientSession +{ + fn into_into_dart(self) -> FrbWrapper> { + self.into() } } -impl SseDecode for Option { - // Codec=Sse (Serialization based), see doc to use other codecs - fn sse_decode(deserializer: &mut flutter_rust_bridge::for_generated::SseDeserializer) -> Self { - if (::sse_decode(deserializer)) { - return Some(::sse_decode( - deserializer, - )); - } else { - return None; - } +// Codec=Dco (DartCObject based), see doc to use other codecs +impl flutter_rust_bridge::IntoDart for FrbWrapper { + fn into_dart(self) -> flutter_rust_bridge::for_generated::DartAbi { + flutter_rust_bridge::for_generated::rust_auto_opaque_encode::<_, MoiArc<_>>(self.0) + .into_dart() } } +impl flutter_rust_bridge::for_generated::IntoDartExceptPrimitive + for FrbWrapper +{ +} -impl SseDecode for Option { - // Codec=Sse (Serialization based), see doc to use other codecs - fn sse_decode(deserializer: &mut flutter_rust_bridge::for_generated::SseDeserializer) -> Self { - if (::sse_decode(deserializer)) { - return Some(::sse_decode(deserializer)); - } else { - return None; - } +impl flutter_rust_bridge::IntoIntoDart> + for CloudSyncPreparedMessageCreateHandle +{ + fn into_into_dart(self) -> FrbWrapper { + self.into() } } -impl SseDecode for Option { - // Codec=Sse (Serialization based), see doc to use other codecs - fn sse_decode(deserializer: &mut flutter_rust_bridge::for_generated::SseDeserializer) -> Self { - if (::sse_decode(deserializer)) { - return Some(::sse_decode(deserializer)); - } else { - return None; - } +// Codec=Dco (DartCObject based), see doc to use other codecs +impl flutter_rust_bridge::IntoDart for FrbWrapper { + fn into_dart(self) -> flutter_rust_bridge::for_generated::DartAbi { + flutter_rust_bridge::for_generated::rust_auto_opaque_encode::<_, MoiArc<_>>(self.0) + .into_dart() } } +impl flutter_rust_bridge::for_generated::IntoDartExceptPrimitive for FrbWrapper {} -impl SseDecode for Option { - // Codec=Sse (Serialization based), see doc to use other codecs - fn sse_decode(deserializer: &mut flutter_rust_bridge::for_generated::SseDeserializer) -> Self { - if (::sse_decode(deserializer)) { - return Some(::sse_decode(deserializer)); - } else { - return None; - } +impl flutter_rust_bridge::IntoIntoDart> for ConversationLink { + fn into_into_dart(self) -> FrbWrapper { + self.into() } } -impl SseDecode for Option { - // Codec=Sse (Serialization based), see doc to use other codecs - fn sse_decode(deserializer: &mut flutter_rust_bridge::for_generated::SseDeserializer) -> Self { - if (::sse_decode(deserializer)) { - return Some(::sse_decode(deserializer)); - } else { - return None; - } +// Codec=Dco (DartCObject based), see doc to use other codecs +impl flutter_rust_bridge::IntoDart for FrbWrapper { + fn into_dart(self) -> flutter_rust_bridge::for_generated::DartAbi { + flutter_rust_bridge::for_generated::rust_auto_opaque_encode::<_, MoiArc<_>>(self.0) + .into_dart() } } +impl flutter_rust_bridge::for_generated::IntoDartExceptPrimitive + for FrbWrapper +{ +} -impl SseDecode for Option { - // Codec=Sse (Serialization based), see doc to use other codecs - fn sse_decode(deserializer: &mut flutter_rust_bridge::for_generated::SseDeserializer) -> Self { - if (::sse_decode(deserializer)) { - return Some( - ::sse_decode(deserializer), - ); - } else { - return None; - } +impl flutter_rust_bridge::IntoIntoDart> + for ConversationParticipant +{ + fn into_into_dart(self) -> FrbWrapper { + self.into() } } -impl SseDecode for Option { - // Codec=Sse (Serialization based), see doc to use other codecs - fn sse_decode(deserializer: &mut flutter_rust_bridge::for_generated::SseDeserializer) -> Self { - if (::sse_decode(deserializer)) { - return Some(::sse_decode( - deserializer, - )); - } else { - return None; - } +// Codec=Dco (DartCObject based), see doc to use other codecs +impl flutter_rust_bridge::IntoDart for FrbWrapper { + fn into_dart(self) -> flutter_rust_bridge::for_generated::DartAbi { + flutter_rust_bridge::for_generated::rust_auto_opaque_encode::<_, MoiArc<_>>(self.0) + .into_dart() } } +impl flutter_rust_bridge::for_generated::IntoDartExceptPrimitive for FrbWrapper {} -impl SseDecode for Option { - // Codec=Sse (Serialization based), see doc to use other codecs - fn sse_decode(deserializer: &mut flutter_rust_bridge::for_generated::SseDeserializer) -> Self { - if (::sse_decode(deserializer)) { - return Some(::sse_decode(deserializer)); - } else { - return None; - } +impl flutter_rust_bridge::IntoIntoDart> for Date { + fn into_into_dart(self) -> FrbWrapper { + self.into() } } -impl SseDecode for Option { - // Codec=Sse (Serialization based), see doc to use other codecs - fn sse_decode(deserializer: &mut flutter_rust_bridge::for_generated::SseDeserializer) -> Self { - if (::sse_decode(deserializer)) { - return Some(::sse_decode( - deserializer, - )); - } else { - return None; - } +// Codec=Dco (DartCObject based), see doc to use other codecs +impl flutter_rust_bridge::IntoDart for FrbWrapper { + fn into_dart(self) -> flutter_rust_bridge::for_generated::DartAbi { + flutter_rust_bridge::for_generated::rust_auto_opaque_encode::<_, MoiArc<_>>(self.0) + .into_dart() } } +impl flutter_rust_bridge::for_generated::IntoDartExceptPrimitive for FrbWrapper {} -impl SseDecode for Option { - // Codec=Sse (Serialization based), see doc to use other codecs - fn sse_decode(deserializer: &mut flutter_rust_bridge::for_generated::SseDeserializer) -> Self { - if (::sse_decode(deserializer)) { - return Some(::sse_decode(deserializer)); - } else { - return None; - } +impl flutter_rust_bridge::IntoIntoDart> for EscrowData { + fn into_into_dart(self) -> FrbWrapper { + self.into() } } -impl SseDecode for Option<(crate::api::api::SharedPushState, APSWatcher)> { - // Codec=Sse (Serialization based), see doc to use other codecs - fn sse_decode(deserializer: &mut flutter_rust_bridge::for_generated::SseDeserializer) -> Self { - if (::sse_decode(deserializer)) { - return Some( - <(crate::api::api::SharedPushState, APSWatcher)>::sse_decode(deserializer), - ); - } else { - return None; - } +// Codec=Dco (DartCObject based), see doc to use other codecs +impl flutter_rust_bridge::IntoDart for FrbWrapper> { + fn into_dart(self) -> flutter_rust_bridge::for_generated::DartAbi { + flutter_rust_bridge::for_generated::rust_auto_opaque_encode::<_, MoiArc<_>>(self.0) + .into_dart() } } +impl flutter_rust_bridge::for_generated::IntoDartExceptPrimitive + for FrbWrapper> +{ +} -impl SseDecode for Option<(String, String)> { - // Codec=Sse (Serialization based), see doc to use other codecs - fn sse_decode(deserializer: &mut flutter_rust_bridge::for_generated::SseDeserializer) -> Self { - if (::sse_decode(deserializer)) { - return Some(<(String, String)>::sse_decode(deserializer)); - } else { - return None; - } +impl flutter_rust_bridge::IntoIntoDart>> + for FindMyFriendsClient +{ + fn into_into_dart(self) -> FrbWrapper> { + self.into() } } -impl SseDecode for Option<(String, u64)> { - // Codec=Sse (Serialization based), see doc to use other codecs - fn sse_decode(deserializer: &mut flutter_rust_bridge::for_generated::SseDeserializer) -> Self { - if (::sse_decode(deserializer)) { - return Some(<(String, u64)>::sse_decode(deserializer)); - } else { - return None; - } +// Codec=Dco (DartCObject based), see doc to use other codecs +impl flutter_rust_bridge::IntoDart for FrbWrapper> { + fn into_dart(self) -> flutter_rust_bridge::for_generated::DartAbi { + flutter_rust_bridge::for_generated::rust_auto_opaque_encode::<_, MoiArc<_>>(self.0) + .into_dart() } } +impl flutter_rust_bridge::for_generated::IntoDartExceptPrimitive + for FrbWrapper> +{ +} -impl SseDecode for Option { - // Codec=Sse (Serialization based), see doc to use other codecs - fn sse_decode(deserializer: &mut flutter_rust_bridge::for_generated::SseDeserializer) -> Self { - if (::sse_decode(deserializer)) { - return Some( - ::sse_decode(deserializer), - ); - } else { - return None; - } +impl flutter_rust_bridge::IntoIntoDart>> + for FindMyPhoneClient +{ + fn into_into_dart(self) -> FrbWrapper> { + self.into() } } -impl SseDecode for Option { - // Codec=Sse (Serialization based), see doc to use other codecs - fn sse_decode(deserializer: &mut flutter_rust_bridge::for_generated::SseDeserializer) -> Self { - if (::sse_decode(deserializer)) { - return Some(::sse_decode(deserializer)); - } else { - return None; - } +// Codec=Dco (DartCObject based), see doc to use other codecs +impl flutter_rust_bridge::IntoDart for FrbWrapper> { + fn into_dart(self) -> flutter_rust_bridge::for_generated::DartAbi { + flutter_rust_bridge::for_generated::rust_auto_opaque_encode::<_, MoiArc<_>>(self.0) + .into_dart() } } - -impl SseDecode for Option { - // Codec=Sse (Serialization based), see doc to use other codecs - fn sse_decode(deserializer: &mut flutter_rust_bridge::for_generated::SseDeserializer) -> Self { - if (::sse_decode(deserializer)) { - return Some(::sse_decode( - deserializer, - )); - } else { - return None; - } - } +impl flutter_rust_bridge::for_generated::IntoDartExceptPrimitive + for FrbWrapper> +{ } -impl SseDecode for Option { - // Codec=Sse (Serialization based), see doc to use other codecs - fn sse_decode(deserializer: &mut flutter_rust_bridge::for_generated::SseDeserializer) -> Self { - if (::sse_decode(deserializer)) { - return Some(::sse_decode( - deserializer, - )); - } else { - return None; - } +impl flutter_rust_bridge::IntoIntoDart>> + for GZipWrapper +{ + fn into_into_dart(self) -> FrbWrapper> { + self.into() } } -impl SseDecode for Option { - // Codec=Sse (Serialization based), see doc to use other codecs - fn sse_decode(deserializer: &mut flutter_rust_bridge::for_generated::SseDeserializer) -> Self { - if (::sse_decode(deserializer)) { - return Some(::sse_decode(deserializer)); - } else { - return None; - } +// Codec=Dco (DartCObject based), see doc to use other codecs +impl flutter_rust_bridge::IntoDart for FrbWrapper> { + fn into_dart(self) -> flutter_rust_bridge::for_generated::DartAbi { + flutter_rust_bridge::for_generated::rust_auto_opaque_encode::<_, MoiArc<_>>(self.0) + .into_dart() } } +impl flutter_rust_bridge::for_generated::IntoDartExceptPrimitive + for FrbWrapper> +{ +} -impl SseDecode for Option { - // Codec=Sse (Serialization based), see doc to use other codecs - fn sse_decode(deserializer: &mut flutter_rust_bridge::for_generated::SseDeserializer) -> Self { - if (::sse_decode(deserializer)) { - return Some(::sse_decode(deserializer)); - } else { - return None; - } +impl flutter_rust_bridge::IntoIntoDart>> + for GZipWrapper +{ + fn into_into_dart(self) -> FrbWrapper> { + self.into() } } -impl SseDecode for Option { - // Codec=Sse (Serialization based), see doc to use other codecs - fn sse_decode(deserializer: &mut flutter_rust_bridge::for_generated::SseDeserializer) -> Self { - if (::sse_decode(deserializer)) { - return Some(::sse_decode(deserializer)); - } else { - return None; - } +// Codec=Dco (DartCObject based), see doc to use other codecs +impl flutter_rust_bridge::IntoDart for FrbWrapper> { + fn into_dart(self) -> flutter_rust_bridge::for_generated::DartAbi { + flutter_rust_bridge::for_generated::rust_auto_opaque_encode::<_, MoiArc<_>>(self.0) + .into_dart() } } +impl flutter_rust_bridge::for_generated::IntoDartExceptPrimitive + for FrbWrapper> +{ +} -impl SseDecode for Option { - // Codec=Sse (Serialization based), see doc to use other codecs - fn sse_decode(deserializer: &mut flutter_rust_bridge::for_generated::SseDeserializer) -> Self { - if (::sse_decode(deserializer)) { - return Some(::sse_decode(deserializer)); - } else { - return None; - } +impl flutter_rust_bridge::IntoIntoDart>> + for GZipWrapper +{ + fn into_into_dart(self) -> FrbWrapper> { + self.into() } } -impl SseDecode for Option { - // Codec=Sse (Serialization based), see doc to use other codecs - fn sse_decode(deserializer: &mut flutter_rust_bridge::for_generated::SseDeserializer) -> Self { - if (::sse_decode(deserializer)) { - return Some(::sse_decode(deserializer)); - } else { - return None; - } +// Codec=Dco (DartCObject based), see doc to use other codecs +impl flutter_rust_bridge::IntoDart for FrbWrapper> { + fn into_dart(self) -> flutter_rust_bridge::for_generated::DartAbi { + flutter_rust_bridge::for_generated::rust_auto_opaque_encode::<_, MoiArc<_>>(self.0) + .into_dart() } } +impl flutter_rust_bridge::for_generated::IntoDartExceptPrimitive + for FrbWrapper> +{ +} -impl SseDecode for Option { - // Codec=Sse (Serialization based), see doc to use other codecs - fn sse_decode(deserializer: &mut flutter_rust_bridge::for_generated::SseDeserializer) -> Self { - if (::sse_decode(deserializer)) { - return Some(::sse_decode(deserializer)); - } else { - return None; - } +impl flutter_rust_bridge::IntoIntoDart>> + for GZipWrapper +{ + fn into_into_dart(self) -> FrbWrapper> { + self.into() } } -impl SseDecode for Option { - // Codec=Sse (Serialization based), see doc to use other codecs - fn sse_decode(deserializer: &mut flutter_rust_bridge::for_generated::SseDeserializer) -> Self { - if (::sse_decode(deserializer)) { - return Some(::sse_decode( - deserializer, - )); - } else { - return None; - } +// Codec=Dco (DartCObject based), see doc to use other codecs +impl flutter_rust_bridge::IntoDart for FrbWrapper> { + fn into_dart(self) -> flutter_rust_bridge::for_generated::DartAbi { + flutter_rust_bridge::for_generated::rust_auto_opaque_encode::<_, MoiArc<_>>(self.0) + .into_dart() } } +impl flutter_rust_bridge::for_generated::IntoDartExceptPrimitive + for FrbWrapper> +{ +} -impl SseDecode for Option> { - // Codec=Sse (Serialization based), see doc to use other codecs - fn sse_decode(deserializer: &mut flutter_rust_bridge::for_generated::SseDeserializer) -> Self { - if (::sse_decode(deserializer)) { - return Some(>::sse_decode(deserializer)); - } else { - return None; - } +impl flutter_rust_bridge::IntoIntoDart>> + for GZipWrapper +{ + fn into_into_dart(self) -> FrbWrapper> { + self.into() } } -impl SseDecode for Option> { - // Codec=Sse (Serialization based), see doc to use other codecs - fn sse_decode(deserializer: &mut flutter_rust_bridge::for_generated::SseDeserializer) -> Self { - if (::sse_decode(deserializer)) { - return Some(>::sse_decode(deserializer)); - } else { - return None; - } +// Codec=Dco (DartCObject based), see doc to use other codecs +impl flutter_rust_bridge::IntoDart for FrbWrapper> { + fn into_dart(self) -> flutter_rust_bridge::for_generated::DartAbi { + flutter_rust_bridge::for_generated::rust_auto_opaque_encode::<_, MoiArc<_>>(self.0) + .into_dart() } } +impl flutter_rust_bridge::for_generated::IntoDartExceptPrimitive + for FrbWrapper> +{ +} -impl SseDecode for Option> { - // Codec=Sse (Serialization based), see doc to use other codecs - fn sse_decode(deserializer: &mut flutter_rust_bridge::for_generated::SseDeserializer) -> Self { - if (::sse_decode(deserializer)) { - return Some(>::sse_decode( - deserializer, - )); - } else { - return None; - } +impl flutter_rust_bridge::IntoIntoDart>> + for GZipWrapper +{ + fn into_into_dart(self) -> FrbWrapper> { + self.into() } } -impl SseDecode for Option> { - // Codec=Sse (Serialization based), see doc to use other codecs - fn sse_decode(deserializer: &mut flutter_rust_bridge::for_generated::SseDeserializer) -> Self { - if (::sse_decode(deserializer)) { - return Some(>::sse_decode(deserializer)); - } else { - return None; - } +// Codec=Dco (DartCObject based), see doc to use other codecs +impl flutter_rust_bridge::IntoDart for FrbWrapper { + fn into_dart(self) -> flutter_rust_bridge::for_generated::DartAbi { + flutter_rust_bridge::for_generated::rust_auto_opaque_encode::<_, MoiArc<_>>(self.0) + .into_dart() } } +impl flutter_rust_bridge::for_generated::IntoDartExceptPrimitive for FrbWrapper {} -impl SseDecode for crate::api::api::PartExtension { - // Codec=Sse (Serialization based), see doc to use other codecs - fn sse_decode(deserializer: &mut flutter_rust_bridge::for_generated::SseDeserializer) -> Self { - let mut tag_ = ::sse_decode(deserializer); - match tag_ { - 0 => { - let mut var_msgWidth = ::sse_decode(deserializer); - let mut var_rotation = ::sse_decode(deserializer); - let mut var_sai = ::sse_decode(deserializer); - let mut var_scale = ::sse_decode(deserializer); - let mut var_update = >::sse_decode(deserializer); - let mut var_sli = ::sse_decode(deserializer); - let mut var_normalizedX = ::sse_decode(deserializer); - let mut var_normalizedY = ::sse_decode(deserializer); - let mut var_version = ::sse_decode(deserializer); - let mut var_hash = ::sse_decode(deserializer); - let mut var_safi = ::sse_decode(deserializer); - let mut var_effectType = ::sse_decode(deserializer); - let mut var_stickerId = ::sse_decode(deserializer); - return crate::api::api::PartExtension::Sticker { - msg_width: var_msgWidth, - rotation: var_rotation, - sai: var_sai, - scale: var_scale, - update: var_update, - sli: var_sli, - normalized_x: var_normalizedX, - normalized_y: var_normalizedY, - version: var_version, - hash: var_hash, - safi: var_safi, - effect_type: var_effectType, - sticker_id: var_stickerId, - }; - } - _ => { - unimplemented!(""); - } - } +impl flutter_rust_bridge::IntoIntoDart> for IDSNGMIdentity { + fn into_into_dart(self) -> FrbWrapper { + self.into() } } -impl SseDecode for crate::api::api::Passkey { - // Codec=Sse (Serialization based), see doc to use other codecs - fn sse_decode(deserializer: &mut flutter_rust_bridge::for_generated::SseDeserializer) -> Self { - let mut var_cdat = ::sse_decode(deserializer); - let mut var_mdat = ::sse_decode(deserializer); - let mut var_agrp = ::sse_decode(deserializer); - let mut var_labl = ::sse_decode(deserializer); - let mut var_data = >::sse_decode(deserializer); - let mut var_atag = >::sse_decode(deserializer); - let mut var_klbl = >::sse_decode(deserializer); - return crate::api::api::Passkey { - cdat: var_cdat, - mdat: var_mdat, - agrp: var_agrp, - labl: var_labl, - data: var_data, - atag: var_atag, - klbl: var_klbl, - }; +// Codec=Dco (DartCObject based), see doc to use other codecs +impl flutter_rust_bridge::IntoDart for FrbWrapper { + fn into_dart(self) -> flutter_rust_bridge::for_generated::DartAbi { + flutter_rust_bridge::for_generated::rust_auto_opaque_encode::<_, MoiArc<_>>(self.0) + .into_dart() } } +impl flutter_rust_bridge::for_generated::IntoDartExceptPrimitive for FrbWrapper {} -impl SseDecode for crate::api::api::PasswordManagerAltDomain { - // Codec=Sse (Serialization based), see doc to use other codecs - fn sse_decode(deserializer: &mut flutter_rust_bridge::for_generated::SseDeserializer) -> Self { - let mut var_domain = ::sse_decode(deserializer); - return crate::api::api::PasswordManagerAltDomain { domain: var_domain }; +impl flutter_rust_bridge::IntoIntoDart> for IDSUser { + fn into_into_dart(self) -> FrbWrapper { + self.into() } } -impl SseDecode for crate::api::api::PasswordManagerMeta { - // Codec=Sse (Serialization based), see doc to use other codecs - fn sse_decode(deserializer: &mut flutter_rust_bridge::for_generated::SseDeserializer) -> Self { - let mut var_cdat = ::sse_decode(deserializer); - let mut var_mdat = ::sse_decode(deserializer); - let mut var_srvr = ::sse_decode(deserializer); - let mut var_acct = ::sse_decode(deserializer); - let mut var_agrp = ::sse_decode(deserializer); - let mut var_data = >::sse_decode(deserializer); - return crate::api::api::PasswordManagerMeta { - cdat: var_cdat, - mdat: var_mdat, - srvr: var_srvr, - acct: var_acct, - agrp: var_agrp, - data: var_data, - }; +// Codec=Dco (DartCObject based), see doc to use other codecs +impl flutter_rust_bridge::IntoDart for FrbWrapper { + fn into_dart(self) -> flutter_rust_bridge::for_generated::DartAbi { + flutter_rust_bridge::for_generated::rust_auto_opaque_encode::<_, MoiArc<_>>(self.0) + .into_dart() } } +impl flutter_rust_bridge::for_generated::IntoDartExceptPrimitive for FrbWrapper {} -impl SseDecode for crate::api::api::PasswordManagerMetaChange { - // Codec=Sse (Serialization based), see doc to use other codecs - fn sse_decode(deserializer: &mut flutter_rust_bridge::for_generated::SseDeserializer) -> Self { - let mut var_date = ::sse_decode(deserializer); - let mut var_password = >::sse_decode(deserializer); - let mut var_oldPassword = >::sse_decode(deserializer); - let mut var_groupName = >::sse_decode(deserializer); - let mut var_groupId = >::sse_decode(deserializer); - let mut var_shareType = >::sse_decode(deserializer); - let mut var_id = ::sse_decode(deserializer); - let mut var_typ = ::sse_decode(deserializer); - return crate::api::api::PasswordManagerMetaChange { - date: var_date, - password: var_password, - old_password: var_oldPassword, - group_name: var_groupName, - group_id: var_groupId, - share_type: var_shareType, - id: var_id, - typ: var_typ, - }; +impl flutter_rust_bridge::IntoIntoDart> for JoinedOSConfig { + fn into_into_dart(self) -> FrbWrapper { + self.into() } } -impl SseDecode for crate::api::api::PasswordManagerMetaData { - // Codec=Sse (Serialization based), see doc to use other codecs - fn sse_decode(deserializer: &mut flutter_rust_bridge::for_generated::SseDeserializer) -> Self { - let mut var_history = - >::sse_decode(deserializer); - let mut var_altDomains = - >::sse_decode(deserializer); - let mut var_totp = >::sse_decode(deserializer); - let mut var_ctxt = >::sse_decode(deserializer); - let mut var_title = >>::sse_decode(deserializer); - let mut var_notes = >>::sse_decode(deserializer); - let mut var_formerlyShared = - >::sse_decode( - deserializer, - ); - let mut var_ocpid = >>::sse_decode(deserializer); - return crate::api::api::PasswordManagerMetaData { - history: var_history, - alt_domains: var_altDomains, - totp: var_totp, - ctxt: var_ctxt, - title: var_title, - notes: var_notes, - formerly_shared: var_formerlyShared, - ocpid: var_ocpid, - }; +// Codec=Dco (DartCObject based), see doc to use other codecs +impl flutter_rust_bridge::IntoDart for FrbWrapper { + fn into_dart(self) -> flutter_rust_bridge::for_generated::DartAbi { + flutter_rust_bridge::for_generated::rust_auto_opaque_encode::<_, MoiArc<_>>(self.0) + .into_dart() } } +impl flutter_rust_bridge::for_generated::IntoDartExceptPrimitive for FrbWrapper {} -impl SseDecode for crate::api::api::PasswordManagerMetaDataCtx { - // Codec=Sse (Serialization based), see doc to use other codecs - fn sse_decode(deserializer: &mut flutter_rust_bridge::for_generated::SseDeserializer) -> Self { - let mut var_lastUsed = ::sse_decode(deserializer); - return crate::api::api::PasswordManagerMetaDataCtx { - last_used: var_lastUsed, - }; +impl flutter_rust_bridge::IntoIntoDart> for LocationReport { + fn into_into_dart(self) -> FrbWrapper { + self.into() } } -impl SseDecode for crate::api::api::PasswordManagerMetaDataFormerlyShared { - // Codec=Sse (Serialization based), see doc to use other codecs - fn sse_decode(deserializer: &mut flutter_rust_bridge::for_generated::SseDeserializer) -> Self { - let mut var_groupName = >::sse_decode(deserializer); - let mut var_passwordManagerCredentialIdentifier = - >::sse_decode(deserializer); - return crate::api::api::PasswordManagerMetaDataFormerlyShared { - group_name: var_groupName, - password_manager_credential_identifier: var_passwordManagerCredentialIdentifier, - }; +// Codec=Dco (DartCObject based), see doc to use other codecs +impl flutter_rust_bridge::IntoDart for FrbWrapper { + fn into_dart(self) -> flutter_rust_bridge::for_generated::DartAbi { + flutter_rust_bridge::for_generated::rust_auto_opaque_encode::<_, MoiArc<_>>(self.0) + .into_dart() } } +impl flutter_rust_bridge::for_generated::IntoDartExceptPrimitive for FrbWrapper {} -impl SseDecode for crate::api::api::PasswordManagerTotp { - // Codec=Sse (Serialization based), see doc to use other codecs - fn sse_decode(deserializer: &mut flutter_rust_bridge::for_generated::SseDeserializer) -> Self { - let mut var_secret = >::sse_decode(deserializer); - let mut var_digits = ::sse_decode(deserializer); - let mut var_issuer = >::sse_decode(deserializer); - let mut var_period = ::sse_decode(deserializer); - let mut var_initialDate = ::sse_decode(deserializer); - let mut var_algorithm = ::sse_decode(deserializer); - let mut var_accountName = >::sse_decode(deserializer); - let mut var_originalUrl = >::sse_decode(deserializer); - return crate::api::api::PasswordManagerTotp { - secret: var_secret, - digits: var_digits, - issuer: var_issuer, - period: var_period, - initial_date: var_initialDate, - algorithm: var_algorithm, - account_name: var_accountName, - original_url: var_originalUrl, - }; +impl flutter_rust_bridge::IntoIntoDart> for MessageFlags { + fn into_into_dart(self) -> FrbWrapper { + self.into() } } -impl SseDecode for crate::api::api::PasswordRawEntry { - // Codec=Sse (Serialization based), see doc to use other codecs - fn sse_decode(deserializer: &mut flutter_rust_bridge::for_generated::SseDeserializer) -> Self { - let mut var_cdat = ::sse_decode(deserializer); - let mut var_mdat = ::sse_decode(deserializer); - let mut var_srvr = ::sse_decode(deserializer); - let mut var_acct = ::sse_decode(deserializer); - let mut var_agrp = ::sse_decode(deserializer); - let mut var_data = >::sse_decode(deserializer); - return crate::api::api::PasswordRawEntry { - cdat: var_cdat, - mdat: var_mdat, - srvr: var_srvr, - acct: var_acct, - agrp: var_agrp, - data: var_data, - }; +// Codec=Dco (DartCObject based), see doc to use other codecs +impl flutter_rust_bridge::IntoDart for FrbWrapper> { + fn into_dart(self) -> flutter_rust_bridge::for_generated::DartAbi { + flutter_rust_bridge::for_generated::rust_auto_opaque_encode::<_, MoiArc<_>>(self.0) + .into_dart() } } +impl flutter_rust_bridge::for_generated::IntoDartExceptPrimitive + for FrbWrapper> +{ +} -impl SseDecode for crate::api::api::PermanentDeleteMessage { - // Codec=Sse (Serialization based), see doc to use other codecs - fn sse_decode(deserializer: &mut flutter_rust_bridge::for_generated::SseDeserializer) -> Self { - let mut var_target = ::sse_decode(deserializer); - let mut var_isScheduled = ::sse_decode(deserializer); - return crate::api::api::PermanentDeleteMessage { - target: var_target, - is_scheduled: var_isScheduled, - }; +impl flutter_rust_bridge::IntoIntoDart>> + for NSArray +{ + fn into_into_dart(self) -> FrbWrapper> { + self.into() } } -impl SseDecode for crate::api::api::PhotoPosterContents { - // Codec=Sse (Serialization based), see doc to use other codecs - fn sse_decode(deserializer: &mut flutter_rust_bridge::for_generated::SseDeserializer) -> Self { - let mut var_version = ::sse_decode(deserializer); - let mut var_layers = >::sse_decode(deserializer); - let mut var_properties = ::sse_decode(deserializer); - return crate::api::api::PhotoPosterContents { - version: var_version, - layers: var_layers, - properties: var_properties, - }; +// Codec=Dco (DartCObject based), see doc to use other codecs +impl flutter_rust_bridge::IntoDart for FrbWrapper> { + fn into_dart(self) -> flutter_rust_bridge::for_generated::DartAbi { + flutter_rust_bridge::for_generated::rust_auto_opaque_encode::<_, MoiArc<_>>(self.0) + .into_dart() } } +impl flutter_rust_bridge::for_generated::IntoDartExceptPrimitive + for FrbWrapper> +{ +} -impl SseDecode for crate::api::api::PhotoPosterContentsFrame { - // Codec=Sse (Serialization based), see doc to use other codecs - fn sse_decode(deserializer: &mut flutter_rust_bridge::for_generated::SseDeserializer) -> Self { - let mut var_width = ::sse_decode(deserializer); - let mut var_height = ::sse_decode(deserializer); - let mut var_x = ::sse_decode(deserializer); - let mut var_y = ::sse_decode(deserializer); - return crate::api::api::PhotoPosterContentsFrame { - width: var_width, - height: var_height, - x: var_x, - y: var_y, - }; +impl flutter_rust_bridge::IntoIntoDart>> + for NSArray +{ + fn into_into_dart(self) -> FrbWrapper> { + self.into() } } -impl SseDecode for crate::api::api::PhotoPosterContentsSize { - // Codec=Sse (Serialization based), see doc to use other codecs - fn sse_decode(deserializer: &mut flutter_rust_bridge::for_generated::SseDeserializer) -> Self { - let mut var_width = ::sse_decode(deserializer); - let mut var_height = ::sse_decode(deserializer); - return crate::api::api::PhotoPosterContentsSize { - width: var_width, - height: var_height, - }; +// Codec=Dco (DartCObject based), see doc to use other codecs +impl flutter_rust_bridge::IntoDart for FrbWrapper { + fn into_dart(self) -> flutter_rust_bridge::for_generated::DartAbi { + flutter_rust_bridge::for_generated::rust_auto_opaque_encode::<_, MoiArc<_>>(self.0) + .into_dart() } } +impl flutter_rust_bridge::for_generated::IntoDartExceptPrimitive for FrbWrapper {} -impl SseDecode for crate::api::api::PhotoPosterLayer { - // Codec=Sse (Serialization based), see doc to use other codecs - fn sse_decode(deserializer: &mut flutter_rust_bridge::for_generated::SseDeserializer) -> Self { - let mut var_frame = ::sse_decode(deserializer); - let mut var_filename = ::sse_decode(deserializer); - let mut var_zPosition = ::sse_decode(deserializer); - let mut var_identifier = ::sse_decode(deserializer); - return crate::api::api::PhotoPosterLayer { - frame: var_frame, - filename: var_filename, - z_position: var_zPosition, - identifier: var_identifier, - }; +impl flutter_rust_bridge::IntoIntoDart> for PushError { + fn into_into_dart(self) -> FrbWrapper { + self.into() } } -impl SseDecode for crate::api::api::PhotoPosterLayout { - // Codec=Sse (Serialization based), see doc to use other codecs - fn sse_decode(deserializer: &mut flutter_rust_bridge::for_generated::SseDeserializer) -> Self { - let mut var_clockIntersection = ::sse_decode(deserializer); - let mut var_deviceResolution = - ::sse_decode(deserializer); - let mut var_visibleFrame = - ::sse_decode(deserializer); - let mut var_timeFrame = - ::sse_decode(deserializer); - let mut var_clockLayerOrder = ::sse_decode(deserializer); - let mut var_hasTopEdgeContact = ::sse_decode(deserializer); - let mut var_inactiveFrame = - ::sse_decode(deserializer); - let mut var_imageSize = - ::sse_decode(deserializer); - let mut var_parallaxPadding = - ::sse_decode(deserializer); - return crate::api::api::PhotoPosterLayout { - clock_intersection: var_clockIntersection, - device_resolution: var_deviceResolution, - visible_frame: var_visibleFrame, - time_frame: var_timeFrame, - clock_layer_order: var_clockLayerOrder, - has_top_edge_contact: var_hasTopEdgeContact, - inactive_frame: var_inactiveFrame, - image_size: var_imageSize, - parallax_padding: var_parallaxPadding, - }; +// Codec=Dco (DartCObject based), see doc to use other codecs +impl flutter_rust_bridge::IntoDart for FrbWrapper> { + fn into_dart(self) -> flutter_rust_bridge::for_generated::DartAbi { + flutter_rust_bridge::for_generated::rust_auto_opaque_encode::<_, MoiArc<_>>(self.0) + .into_dart() } } +impl flutter_rust_bridge::for_generated::IntoDartExceptPrimitive + for FrbWrapper> +{ +} -impl SseDecode for crate::api::api::PhotoPosterProperties { - // Codec=Sse (Serialization based), see doc to use other codecs - fn sse_decode(deserializer: &mut flutter_rust_bridge::for_generated::SseDeserializer) -> Self { - let mut var_portraitLayout = ::sse_decode(deserializer); - let mut var_settlingEffectEnabled = ::sse_decode(deserializer); - let mut var_depthEnabled = ::sse_decode(deserializer); - let mut var_clockAreaLuminance = ::sse_decode(deserializer); - let mut var_parallaxDisabled = ::sse_decode(deserializer); - return crate::api::api::PhotoPosterProperties { - portrait_layout: var_portraitLayout, - settling_effect_enabled: var_settlingEffectEnabled, - depth_enabled: var_depthEnabled, - clock_area_luminance: var_clockAreaLuminance, - parallax_disabled: var_parallaxDisabled, - }; +impl flutter_rust_bridge::IntoIntoDart>> for Receiver { + fn into_into_dart(self) -> FrbWrapper> { + self.into() } } -impl SseDecode for crate::api::api::PollResult { - // Codec=Sse (Serialization based), see doc to use other codecs - fn sse_decode(deserializer: &mut flutter_rust_bridge::for_generated::SseDeserializer) -> Self { - let mut tag_ = ::sse_decode(deserializer); - match tag_ { - 0 => { - return crate::api::api::PollResult::Stop; - } - 1 => { - let mut var_field0 = - >::sse_decode(deserializer); - return crate::api::api::PollResult::Cont(var_field0); - } - _ => { - unimplemented!(""); - } - } +// Codec=Dco (DartCObject based), see doc to use other codecs +impl flutter_rust_bridge::IntoDart for FrbWrapper { + fn into_dart(self) -> flutter_rust_bridge::for_generated::DartAbi { + flutter_rust_bridge::for_generated::rust_auto_opaque_encode::<_, MoiArc<_>>(self.0) + .into_dart() } } +impl flutter_rust_bridge::for_generated::IntoDartExceptPrimitive + for FrbWrapper +{ +} -impl SseDecode for crate::api::api::PosterAsset { - // Codec=Sse (Serialization based), see doc to use other codecs - fn sse_decode(deserializer: &mut flutter_rust_bridge::for_generated::SseDeserializer) -> Self { - let mut var_contents = ::sse_decode(deserializer); - let mut var_files = >>::sse_decode(deserializer); - let mut var_uuid = ::sse_decode(deserializer); - return crate::api::api::PosterAsset { - contents: var_contents, - files: var_files, - uuid: var_uuid, - }; +impl flutter_rust_bridge::IntoIntoDart> for SavedHardwareState { + fn into_into_dart(self) -> FrbWrapper { + self.into() } } -impl SseDecode for crate::api::api::PosterColor { - // Codec=Sse (Serialization based), see doc to use other codecs - fn sse_decode(deserializer: &mut flutter_rust_bridge::for_generated::SseDeserializer) -> Self { - let mut var_alpha = ::sse_decode(deserializer); - let mut var_blue = ::sse_decode(deserializer); - let mut var_green = ::sse_decode(deserializer); - let mut var_red = ::sse_decode(deserializer); - return crate::api::api::PosterColor { - alpha: var_alpha, - blue: var_blue, - green: var_green, - red: var_red, - }; +// Codec=Dco (DartCObject based), see doc to use other codecs +impl flutter_rust_bridge::IntoDart for FrbWrapper> { + fn into_dart(self) -> flutter_rust_bridge::for_generated::DartAbi { + flutter_rust_bridge::for_generated::rust_auto_opaque_encode::<_, MoiArc<_>>(self.0) + .into_dart() } } +impl flutter_rust_bridge::for_generated::IntoDartExceptPrimitive for FrbWrapper> {} -impl SseDecode for crate::api::api::PosterRole { - // Codec=Sse (Serialization based), see doc to use other codecs - fn sse_decode(deserializer: &mut flutter_rust_bridge::for_generated::SseDeserializer) -> Self { - let mut inner = ::sse_decode(deserializer); - return match inner { - 0 => crate::api::api::PosterRole::PRPosterRoleBackdrop, - 1 => crate::api::api::PosterRole::PRPosterRoleIncomingCall, - _ => unreachable!("Invalid variant for PosterRole: {}", inner), - }; +impl flutter_rust_bridge::IntoIntoDart>> for Sender<()> { + fn into_into_dart(self) -> FrbWrapper> { + self.into() } } -impl SseDecode for crate::api::api::PosterType { - // Codec=Sse (Serialization based), see doc to use other codecs - fn sse_decode(deserializer: &mut flutter_rust_bridge::for_generated::SseDeserializer) -> Self { - let mut tag_ = ::sse_decode(deserializer); - match tag_ { - 0 => { - let mut var_assets = >::sse_decode(deserializer); - return crate::api::api::PosterType::Photo { assets: var_assets }; - } - 1 => { - let mut var_data = ::sse_decode(deserializer); - let mut var_background = ::sse_decode(deserializer); - return crate::api::api::PosterType::Monogram { - data: var_data, - background: var_background, - }; - } - 2 => { - let mut var_data = ::sse_decode(deserializer); - let mut var_background = ::sse_decode(deserializer); - return crate::api::api::PosterType::Memoji { - data: var_data, - background: var_background, - }; - } - 3 => { - let mut var_data = - ::sse_decode(deserializer); - return crate::api::api::PosterType::TranscriptDynamic { data: var_data }; - } - 4 => { - let mut var_colors = >::sse_decode(deserializer); - return crate::api::api::PosterType::TranscriptGradient { colors: var_colors }; - } - _ => { - unimplemented!(""); - } - } +// Codec=Dco (DartCObject based), see doc to use other codecs +impl flutter_rust_bridge::IntoDart for FrbWrapper { + fn into_dart(self) -> flutter_rust_bridge::for_generated::DartAbi { + flutter_rust_bridge::for_generated::rust_auto_opaque_encode::<_, MoiArc<_>>(self.0) + .into_dart() } } +impl flutter_rust_bridge::for_generated::IntoDartExceptPrimitive for FrbWrapper {} -impl SseDecode for crate::api::api::PRPosterColor { - // Codec=Sse (Serialization based), see doc to use other codecs - fn sse_decode(deserializer: &mut flutter_rust_bridge::for_generated::SseDeserializer) -> Self { - let mut var_preferredStyle = ::sse_decode(deserializer); - let mut var_identifier = ::sse_decode(deserializer); - let mut var_suggested = ::sse_decode(deserializer); - let mut var_color = ::sse_decode(deserializer); - return crate::api::api::PRPosterColor { - preferred_style: var_preferredStyle, - identifier: var_identifier, - suggested: var_suggested, - color: var_color, - }; +impl flutter_rust_bridge::IntoIntoDart> for StCollapsedValue { + fn into_into_dart(self) -> FrbWrapper { + self.into() } } -impl SseDecode for crate::api::api::PRPosterContentMaterialStyle { - // Codec=Sse (Serialization based), see doc to use other codecs - fn sse_decode(deserializer: &mut flutter_rust_bridge::for_generated::SseDeserializer) -> Self { - let mut tag_ = ::sse_decode(deserializer); - match tag_ { - 0 => { - let mut var_variation = ::sse_decode(deserializer); - let mut var_colors = >::sse_decode(deserializer); - let mut var_vibrant = ::sse_decode(deserializer); - let mut var_supportsVariation = ::sse_decode(deserializer); - let mut var_needsToResolveVariation = ::sse_decode(deserializer); - return crate::api::api::PRPosterContentMaterialStyle::PRPosterContentDiscreteColorsStyle{variation: var_variation, colors: var_colors, vibrant: var_vibrant, supports_variation: var_supportsVariation, needs_to_resolve_variation: var_needsToResolveVariation}; - } - 1 => { - return crate::api::api::PRPosterContentMaterialStyle::PRPosterContentVibrantMaterialStyle; - } - 2 => { - let mut var_gradientType = ::sse_decode(deserializer); - let mut var_colors = >::sse_decode(deserializer); - let mut var_startPoint = ::sse_decode(deserializer); - let mut var_locations = >::sse_decode(deserializer); - let mut var_endPoint = ::sse_decode(deserializer); - return crate::api::api::PRPosterContentMaterialStyle::PRPosterContentGradientStyle{gradient_type: var_gradientType, colors: var_colors, start_point: var_startPoint, locations: var_locations, end_point: var_endPoint}; - } - _ => { - unimplemented!(""); - } - } +// Codec=Dco (DartCObject based), see doc to use other codecs +impl flutter_rust_bridge::IntoDart + for FrbWrapper> +{ + fn into_dart(self) -> flutter_rust_bridge::for_generated::DartAbi { + flutter_rust_bridge::for_generated::rust_auto_opaque_encode::<_, MoiArc<_>>(self.0) + .into_dart() } } +impl flutter_rust_bridge::for_generated::IntoDartExceptPrimitive + for FrbWrapper> +{ +} -impl SseDecode for crate::api::api::PRPosterSystemTimeFontConfiguration { - // Codec=Sse (Serialization based), see doc to use other codecs - fn sse_decode(deserializer: &mut flutter_rust_bridge::for_generated::SseDeserializer) -> Self { - let mut var_isSystemItem = ::sse_decode(deserializer); - let mut var_timeFontIdentifier = ::sse_decode(deserializer); - let mut var_weight = ::sse_decode(deserializer); - return crate::api::api::PRPosterSystemTimeFontConfiguration { - is_system_item: var_isSystemItem, - time_font_identifier: var_timeFontIdentifier, - weight: var_weight, - }; +impl + flutter_rust_bridge::IntoIntoDart< + FrbWrapper>, + > for SyncManager +{ + fn into_into_dart(self) -> FrbWrapper> { + self.into() } } -impl SseDecode for crate::api::api::PRPosterTitleStyleConfiguration { - // Codec=Sse (Serialization based), see doc to use other codecs - fn sse_decode(deserializer: &mut flutter_rust_bridge::for_generated::SseDeserializer) -> Self { - let mut var_alternateDateEnabled = ::sse_decode(deserializer); - let mut var_contentsLuminence = ::sse_decode(deserializer); - let mut var_groupName = ::sse_decode(deserializer); - let mut var_preferredTitleAlignment = ::sse_decode(deserializer); - let mut var_preferredTitleLayout = ::sse_decode(deserializer); - let mut var_timeFontConfiguration = - ::sse_decode(deserializer); - let mut var_timeNumberingSystem = >>::sse_decode(deserializer); - let mut var_titleColor = ::sse_decode(deserializer); - let mut var_titleContentStyle = >::sse_decode(deserializer); - let mut var_userConfigured = ::sse_decode(deserializer); - let mut var_titleStyle = - >::sse_decode(deserializer); - return crate::api::api::PRPosterTitleStyleConfiguration { - alternate_date_enabled: var_alternateDateEnabled, - contents_luminence: var_contentsLuminence, - group_name: var_groupName, - preferred_title_alignment: var_preferredTitleAlignment, - preferred_title_layout: var_preferredTitleLayout, - time_font_configuration: var_timeFontConfiguration, - time_numbering_system: var_timeNumberingSystem, - title_color: var_titleColor, - title_content_style: var_titleContentStyle, - user_configured: var_userConfigured, - title_style: var_titleStyle, - }; +// Codec=Dco (DartCObject based), see doc to use other codecs +impl flutter_rust_bridge::IntoDart for FrbWrapper { + fn into_dart(self) -> flutter_rust_bridge::for_generated::DartAbi { + flutter_rust_bridge::for_generated::rust_auto_opaque_encode::<_, MoiArc<_>>(self.0) + .into_dart() } } +impl flutter_rust_bridge::for_generated::IntoDartExceptPrimitive for FrbWrapper {} -impl SseDecode for crate::api::api::PrivateDeviceInfo { - // Codec=Sse (Serialization based), see doc to use other codecs - fn sse_decode(deserializer: &mut flutter_rust_bridge::for_generated::SseDeserializer) -> Self { - let mut var_uuid = >::sse_decode(deserializer); - let mut var_deviceName = >::sse_decode(deserializer); - let mut var_token = >::sse_decode(deserializer); - let mut var_isHsaTrusted = ::sse_decode(deserializer); - let mut var_identites = >::sse_decode(deserializer); - let mut var_subServices = >::sse_decode(deserializer); - return crate::api::api::PrivateDeviceInfo { - uuid: var_uuid, - device_name: var_deviceName, - token: var_token, - is_hsa_trusted: var_isHsaTrusted, - identites: var_identites, - sub_services: var_subServices, - }; +impl flutter_rust_bridge::IntoIntoDart> for SystemTime { + fn into_into_dart(self) -> FrbWrapper { + self.into() } } -impl SseDecode for crate::api::api::ProvisionedFlavor { - // Codec=Sse (Serialization based), see doc to use other codecs - fn sse_decode(deserializer: &mut flutter_rust_bridge::for_generated::SseDeserializer) -> Self { - let mut inner = ::sse_decode(deserializer); - return match inner { - 0 => crate::api::api::ProvisionedFlavor::Mac, - 1 => crate::api::api::ProvisionedFlavor::IOS, - _ => unreachable!("Invalid variant for ProvisionedFlavor: {}", inner), - }; +// Codec=Dco (DartCObject based), see doc to use other codecs +impl flutter_rust_bridge::IntoDart for FrbWrapper { + fn into_dart(self) -> flutter_rust_bridge::for_generated::DartAbi { + flutter_rust_bridge::for_generated::rust_auto_opaque_encode::<_, MoiArc<_>>(self.0) + .into_dart() } } +impl flutter_rust_bridge::for_generated::IntoDartExceptPrimitive for FrbWrapper {} -impl SseDecode for crate::api::api::PushMessage { - // Codec=Sse (Serialization based), see doc to use other codecs - fn sse_decode(deserializer: &mut flutter_rust_bridge::for_generated::SseDeserializer) -> Self { - let mut tag_ = ::sse_decode(deserializer); - match tag_ { - 0 => { - let mut var_field0 = ::sse_decode(deserializer); - return crate::api::api::PushMessage::IMessage(var_field0); - } - 1 => { - let mut var_uuid = ::sse_decode(deserializer); - let mut var_error = >::sse_decode(deserializer); - return crate::api::api::PushMessage::SendConfirm { - uuid: var_uuid, - error: var_error, - }; - } - 2 => { - let mut var_field0 = ::sse_decode(deserializer); - return crate::api::api::PushMessage::RegistrationState(var_field0); - } - 3 => { - let mut var_field0 = ::sse_decode(deserializer); - return crate::api::api::PushMessage::NewPhotostream(var_field0); - } - 4 => { - let mut var_field0 = ::sse_decode(deserializer); - return crate::api::api::PushMessage::FaceTime(var_field0); - } - 5 => { - let mut var_field0 = ::sse_decode(deserializer); - return crate::api::api::PushMessage::StatusUpdate(var_field0); - } - 6 => { - let mut var_field0 = ::sse_decode(deserializer); - return crate::api::api::PushMessage::Idms(var_field0); - } - 7 => { - let mut var_field0 = ::sse_decode(deserializer); - return crate::api::api::PushMessage::TwoFaAuthEvent(var_field0); - } - 8 => { - return crate::api::api::PushMessage::CircleFinishEvent; - } - 9 => { - let mut var_sender = ::sse_decode(deserializer); - let mut var_beacon = ::sse_decode(deserializer); - let mut var_attributes = - ::sse_decode(deserializer); - return crate::api::api::PushMessage::BeaconShared { - sender: var_sender, - beacon: var_beacon, - attributes: var_attributes, - }; - } - _ => { - unimplemented!(""); - } - } +impl flutter_rust_bridge::IntoIntoDart> for VerifyBody { + fn into_into_dart(self) -> FrbWrapper { + self.into() } } -impl SseDecode for crate::api::api::QuotaInfo { - // Codec=Sse (Serialization based), see doc to use other codecs - fn sse_decode(deserializer: &mut flutter_rust_bridge::for_generated::SseDeserializer) -> Self { - let mut var_totalBytes = ::sse_decode(deserializer); - let mut var_availableBytes = ::sse_decode(deserializer); - let mut var_messagesBytes = ::sse_decode(deserializer); - return crate::api::api::QuotaInfo { - total_bytes: var_totalBytes, - available_bytes: var_availableBytes, - messages_bytes: var_messagesBytes, - }; +// Codec=Dco (DartCObject based), see doc to use other codecs +impl flutter_rust_bridge::IntoDart for FrbWrapper { + fn into_dart(self) -> flutter_rust_bridge::for_generated::DartAbi { + flutter_rust_bridge::for_generated::rust_auto_opaque_encode::<_, MoiArc<_>>(self.0) + .into_dart() } } +impl flutter_rust_bridge::for_generated::IntoDartExceptPrimitive for FrbWrapper {} -impl SseDecode for crate::api::api::ReactMessage { - // Codec=Sse (Serialization based), see doc to use other codecs - fn sse_decode(deserializer: &mut flutter_rust_bridge::for_generated::SseDeserializer) -> Self { - let mut var_toUuid = ::sse_decode(deserializer); - let mut var_toPart = >::sse_decode(deserializer); - let mut var_reaction = ::sse_decode(deserializer); - let mut var_toText = ::sse_decode(deserializer); - let mut var_embeddedProfile = - >::sse_decode(deserializer); - return crate::api::api::ReactMessage { - to_uuid: var_toUuid, - to_part: var_toPart, - reaction: var_reaction, - to_text: var_toText, - embedded_profile: var_embeddedProfile, - }; +impl flutter_rust_bridge::IntoIntoDart> for ViableBottle { + fn into_into_dart(self) -> FrbWrapper { + self.into() } } -impl SseDecode for crate::api::api::ReactMessageType { - // Codec=Sse (Serialization based), see doc to use other codecs - fn sse_decode(deserializer: &mut flutter_rust_bridge::for_generated::SseDeserializer) -> Self { - let mut tag_ = ::sse_decode(deserializer); - match tag_ { - 0 => { - let mut var_reaction = ::sse_decode(deserializer); - let mut var_enable = ::sse_decode(deserializer); - return crate::api::api::ReactMessageType::React { - reaction: var_reaction, - enable: var_enable, - }; - } - 1 => { - let mut var_spec = ::sse_decode(deserializer); - let mut var_body = ::sse_decode(deserializer); - let mut var_isMeta = ::sse_decode(deserializer); - return crate::api::api::ReactMessageType::Extension { - spec: var_spec, - body: var_body, - is_meta: var_isMeta, - }; - } - _ => { - unimplemented!(""); - } - } +// Codec=Dco (DartCObject based), see doc to use other codecs +impl flutter_rust_bridge::IntoDart for FrbWrapper { + fn into_dart(self) -> flutter_rust_bridge::for_generated::DartAbi { + [ + self.0.administrative_area.into_into_dart().into_dart(), + self.0.country.into_into_dart().into_dart(), + self.0.country_code.into_into_dart().into_dart(), + self.0.formatted_address_lines.into_into_dart().into_dart(), + self.0.locality.into_into_dart().into_dart(), + self.0.state_code.into_into_dart().into_dart(), + self.0.street_address.into_into_dart().into_dart(), + self.0.street_name.into_into_dart().into_dart(), + ] + .into_dart() } } - -impl SseDecode for crate::api::api::Reaction { - // Codec=Sse (Serialization based), see doc to use other codecs - fn sse_decode(deserializer: &mut flutter_rust_bridge::for_generated::SseDeserializer) -> Self { - let mut tag_ = ::sse_decode(deserializer); - match tag_ { - 0 => { - return crate::api::api::Reaction::Heart; - } - 1 => { - return crate::api::api::Reaction::Like; - } - 2 => { - return crate::api::api::Reaction::Dislike; - } - 3 => { - return crate::api::api::Reaction::Laugh; - } - 4 => { - return crate::api::api::Reaction::Emphasize; - } - 5 => { - return crate::api::api::Reaction::Question; - } - 6 => { - let mut var_field0 = ::sse_decode(deserializer); - return crate::api::api::Reaction::Emoji(var_field0); - } - 7 => { - let mut var_spec = - >::sse_decode(deserializer); - let mut var_body = ::sse_decode(deserializer); - return crate::api::api::Reaction::Sticker { - spec: var_spec, - body: var_body, - }; - } - _ => { - unimplemented!(""); - } - } +impl flutter_rust_bridge::for_generated::IntoDartExceptPrimitive + for FrbWrapper +{ +} +impl flutter_rust_bridge::IntoIntoDart> + for crate::api::api::Address +{ + fn into_into_dart(self) -> FrbWrapper { + self.into() } } - -impl SseDecode for (APSConnection, Option) { - // Codec=Sse (Serialization based), see doc to use other codecs - fn sse_decode(deserializer: &mut flutter_rust_bridge::for_generated::SseDeserializer) -> Self { - let mut var_field0 = ::sse_decode(deserializer); - let mut var_field1 = >::sse_decode(deserializer); - return (var_field0, var_field1); +// Codec=Dco (DartCObject based), see doc to use other codecs +impl flutter_rust_bridge::IntoDart for FrbWrapper { + fn into_dart(self) -> flutter_rust_bridge::for_generated::DartAbi { + [ + self.0.lat.into_into_dart().into_dart(), + self.0.lng.into_into_dart().into_dart(), + ] + .into_dart() } } - -impl SseDecode - for ( - Arc>>, - crate::api::api::LoginState, - ) +impl flutter_rust_bridge::for_generated::IntoDartExceptPrimitive + for FrbWrapper { - // Codec=Sse (Serialization based), see doc to use other codecs - fn sse_decode(deserializer: &mut flutter_rust_bridge::for_generated::SseDeserializer) -> Self { - let mut var_field0 = - >>>::sse_decode(deserializer); - let mut var_field1 = ::sse_decode(deserializer); - return (var_field0, var_field1); +} +impl flutter_rust_bridge::IntoIntoDart> + for crate::api::api::AkData +{ + fn into_into_dart(self) -> FrbWrapper { + self.into() } } - -impl SseDecode for (Arc, crate::api::api::SharedPushState) { - // Codec=Sse (Serialization based), see doc to use other codecs - fn sse_decode(deserializer: &mut flutter_rust_bridge::for_generated::SseDeserializer) -> Self { - let mut var_field0 = >::sse_decode(deserializer); - let mut var_field1 = ::sse_decode(deserializer); - return (var_field0, var_field1); +// Codec=Dco (DartCObject based), see doc to use other codecs +impl flutter_rust_bridge::IntoDart for FrbWrapper { + fn into_dart(self) -> flutter_rust_bridge::for_generated::DartAbi { + [ + self.0.title.into_into_dart().into_dart(), + self.0.body.into_into_dart().into_dart(), + self.0.sbdy.into_into_dart().into_dart(), + self.0.defbtn.into_into_dart().into_dart(), + self.0.albtn.into_into_dart().into_dart(), + ] + .into_dart() } } - -impl SseDecode - for ( - CircleClientSession, - crate::api::api::LoginState, - Option, - ) +impl flutter_rust_bridge::for_generated::IntoDartExceptPrimitive + for FrbWrapper { - // Codec=Sse (Serialization based), see doc to use other codecs - fn sse_decode(deserializer: &mut flutter_rust_bridge::for_generated::SseDeserializer) -> Self { - let mut var_field0 = - >::sse_decode(deserializer); - let mut var_field1 = ::sse_decode(deserializer); - let mut var_field2 = >::sse_decode(deserializer); - return (var_field0, var_field1, var_field2); +} +impl flutter_rust_bridge::IntoIntoDart> + for crate::api::api::ApsAlert +{ + fn into_into_dart(self) -> FrbWrapper { + self.into() } } - -impl SseDecode for (Sender<()>, Arc>, APSWatcher) { - // Codec=Sse (Serialization based), see doc to use other codecs - fn sse_decode(deserializer: &mut flutter_rust_bridge::for_generated::SseDeserializer) -> Self { - let mut var_field0 = >::sse_decode(deserializer); - let mut var_field1 = >>::sse_decode(deserializer); - let mut var_field2 = ::sse_decode(deserializer); - return (var_field0, var_field1, var_field2); +// Codec=Dco (DartCObject based), see doc to use other codecs +impl flutter_rust_bridge::IntoDart for crate::api::api::ApsConnectionStatus { + fn into_dart(self) -> flutter_rust_bridge::for_generated::DartAbi { + [ + self.state.into_into_dart().into_dart(), + self.active_port.into_into_dart().into_dart(), + self.error.into_into_dart().into_dart(), + self.retry_wait_seconds.into_into_dart().into_dart(), + ] + .into_dart() } } - -impl SseDecode - for ( - Vec, - std::collections::HashMap>, - i32, - ) +impl flutter_rust_bridge::for_generated::IntoDartExceptPrimitive + for crate::api::api::ApsConnectionStatus { - // Codec=Sse (Serialization based), see doc to use other codecs - fn sse_decode(deserializer: &mut flutter_rust_bridge::for_generated::SseDeserializer) -> Self { - let mut var_field0 = >::sse_decode(deserializer); - let mut var_field1 = , - >>::sse_decode(deserializer); - let mut var_field2 = ::sse_decode(deserializer); - return (var_field0, var_field1, var_field2); +} +impl flutter_rust_bridge::IntoIntoDart + for crate::api::api::ApsConnectionStatus +{ + fn into_into_dart(self) -> crate::api::api::ApsConnectionStatus { + self } } - -impl SseDecode - for ( - Vec, - std::collections::HashMap>, - i32, - ) +// Codec=Dco (DartCObject based), see doc to use other codecs +impl flutter_rust_bridge::IntoDart for FrbWrapper { + fn into_dart(self) -> flutter_rust_bridge::for_generated::DartAbi { + [self.0.alert.into_into_dart().into_dart()].into_dart() + } +} +impl flutter_rust_bridge::for_generated::IntoDartExceptPrimitive + for FrbWrapper { - // Codec=Sse (Serialization based), see doc to use other codecs - fn sse_decode(deserializer: &mut flutter_rust_bridge::for_generated::SseDeserializer) -> Self { - let mut var_field0 = >::sse_decode(deserializer); - let mut var_field1 = - >>::sse_decode( - deserializer, - ); - let mut var_field2 = ::sse_decode(deserializer); - return (var_field0, var_field1, var_field2); +} +impl flutter_rust_bridge::IntoIntoDart> + for crate::api::api::ApsData +{ + fn into_into_dart(self) -> FrbWrapper { + self.into() } } - -impl SseDecode - for ( - Vec, - std::collections::HashMap>, - i32, - ) +// Codec=Dco (DartCObject based), see doc to use other codecs +impl flutter_rust_bridge::IntoDart for FrbWrapper { + fn into_dart(self) -> flutter_rust_bridge::for_generated::DartAbi { + [ + self.0.a_type.into_into_dart().into_dart(), + self.0.part.into_into_dart().into_dart(), + self.0.uti_type.into_into_dart().into_dart(), + self.0.mime.into_into_dart().into_dart(), + self.0.name.into_into_dart().into_dart(), + self.0.iris.into_into_dart().into_dart(), + ] + .into_dart() + } +} +impl flutter_rust_bridge::for_generated::IntoDartExceptPrimitive + for FrbWrapper { - // Codec=Sse (Serialization based), see doc to use other codecs - fn sse_decode(deserializer: &mut flutter_rust_bridge::for_generated::SseDeserializer) -> Self { - let mut var_field0 = >::sse_decode(deserializer); - let mut var_field1 = , - >>::sse_decode(deserializer); - let mut var_field2 = ::sse_decode(deserializer); - return (var_field0, var_field1, var_field2); +} +impl flutter_rust_bridge::IntoIntoDart> + for crate::api::api::Attachment +{ + fn into_into_dart(self) -> FrbWrapper { + self.into() } } - -impl SseDecode for (Vec, Option>) { - // Codec=Sse (Serialization based), see doc to use other codecs - fn sse_decode(deserializer: &mut flutter_rust_bridge::for_generated::SseDeserializer) -> Self { - let mut var_field0 = >::sse_decode(deserializer); - let mut var_field1 = >>::sse_decode(deserializer); - return (var_field0, var_field1); +// Codec=Dco (DartCObject based), see doc to use other codecs +impl flutter_rust_bridge::IntoDart for FrbWrapper { + fn into_dart(self) -> flutter_rust_bridge::for_generated::DartAbi { + [ + self.0.mime_type.into_into_dart().into_dart(), + self.0.start_date.into_into_dart().into_dart(), + self.0.total_bytes.into_into_dart().into_dart(), + self.0.transfer_state.into_into_dart().into_dart(), + self.0.is_sticker.into_into_dart().into_dart(), + self.0.guid.into_into_dart().into_dart(), + self.0.hide_attachment.into_into_dart().into_dart(), + self.0.user_info.into_into_dart().into_dart(), + self.0.filename.into_into_dart().into_dart(), + self.0.extras.into_into_dart().into_dart(), + self.0.is_outgoing.into_into_dart().into_dart(), + self.0.transfer_name.into_into_dart().into_dart(), + self.0.version.into_into_dart().into_dart(), + self.0.uti.into_into_dart().into_dart(), + self.0.created_date.into_into_dart().into_dart(), + self.0.pathc.into_into_dart().into_dart(), + self.0.md5.into_into_dart().into_dart(), + ] + .into_dart() } } - -impl SseDecode for (Vec, Vec) { - // Codec=Sse (Serialization based), see doc to use other codecs - fn sse_decode(deserializer: &mut flutter_rust_bridge::for_generated::SseDeserializer) -> Self { - let mut var_field0 = >::sse_decode(deserializer); - let mut var_field1 = >::sse_decode(deserializer); - return (var_field0, var_field1); +impl flutter_rust_bridge::for_generated::IntoDartExceptPrimitive + for FrbWrapper +{ +} +impl flutter_rust_bridge::IntoIntoDart> + for crate::api::api::AttachmentMeta +{ + fn into_into_dart(self) -> FrbWrapper { + self.into() } } - -impl SseDecode - for ( - Vec, - Option, - ) +// Codec=Dco (DartCObject based), see doc to use other codecs +impl flutter_rust_bridge::IntoDart for FrbWrapper { + fn into_dart(self) -> flutter_rust_bridge::for_generated::DartAbi { + [self.0.preview_generation_state.into_into_dart().into_dart()].into_dart() + } +} +impl flutter_rust_bridge::for_generated::IntoDartExceptPrimitive + for FrbWrapper { - // Codec=Sse (Serialization based), see doc to use other codecs - fn sse_decode(deserializer: &mut flutter_rust_bridge::for_generated::SseDeserializer) -> Self { - let mut var_field0 = >::sse_decode(deserializer); - let mut var_field1 = >::sse_decode(deserializer); - return (var_field0, var_field1); +} +impl flutter_rust_bridge::IntoIntoDart> + for crate::api::api::AttachmentMetaExtra +{ + fn into_into_dart(self) -> FrbWrapper { + self.into() } } - -impl SseDecode for (crate::api::api::LoginState, Option) { - // Codec=Sse (Serialization based), see doc to use other codecs - fn sse_decode(deserializer: &mut flutter_rust_bridge::for_generated::SseDeserializer) -> Self { - let mut var_field0 = ::sse_decode(deserializer); - let mut var_field1 = >::sse_decode(deserializer); - return (var_field0, var_field1); +// Codec=Dco (DartCObject based), see doc to use other codecs +impl flutter_rust_bridge::IntoDart for FrbWrapper { + fn into_dart(self) -> flutter_rust_bridge::for_generated::DartAbi { + match self.0 { + crate::api::api::AttachmentType::Inline(field0) => { + [0.into_dart(), field0.into_into_dart().into_dart()].into_dart() + } + crate::api::api::AttachmentType::MMCS(field0) => { + [1.into_dart(), field0.into_into_dart().into_dart()].into_dart() + } + _ => { + unimplemented!(""); + } + } } } - -impl SseDecode - for ( - std::collections::HashMap, - Option<(String, u64)>, - ) +impl flutter_rust_bridge::for_generated::IntoDartExceptPrimitive + for FrbWrapper { - // Codec=Sse (Serialization based), see doc to use other codecs - fn sse_decode(deserializer: &mut flutter_rust_bridge::for_generated::SseDeserializer) -> Self { - let mut var_field0 = - >::sse_decode( - deserializer, - ); - let mut var_field1 = >::sse_decode(deserializer); - return (var_field0, var_field1); +} +impl flutter_rust_bridge::IntoIntoDart> + for crate::api::api::AttachmentType +{ + fn into_into_dart(self) -> FrbWrapper { + self.into() } } - -impl SseDecode for (Option>, Option) { - // Codec=Sse (Serialization based), see doc to use other codecs - fn sse_decode(deserializer: &mut flutter_rust_bridge::for_generated::SseDeserializer) -> Self { - let mut var_field0 = >>::sse_decode(deserializer); - let mut var_field1 = >::sse_decode(deserializer); - return (var_field0, var_field1); +// Codec=Dco (DartCObject based), see doc to use other codecs +impl flutter_rust_bridge::IntoDart for FrbWrapper { + fn into_dart(self) -> flutter_rust_bridge::for_generated::DartAbi { + [ + self.0.url.into_into_dart().into_dart(), + self.0.session.into_into_dart().into_dart(), + self.0.layout.into_into_dart().into_dart(), + self.0.ld_text.into_into_dart().into_dart(), + self.0.is_live.into_into_dart().into_dart(), + self.0.icon.into_into_dart().into_dart(), + ] + .into_dart() } } - -impl SseDecode for (Option, crate::api::api::Passkey) { - // Codec=Sse (Serialization based), see doc to use other codecs - fn sse_decode(deserializer: &mut flutter_rust_bridge::for_generated::SseDeserializer) -> Self { - let mut var_field0 = >::sse_decode(deserializer); - let mut var_field1 = ::sse_decode(deserializer); - return (var_field0, var_field1); +impl flutter_rust_bridge::for_generated::IntoDartExceptPrimitive + for FrbWrapper +{ +} +impl flutter_rust_bridge::IntoIntoDart> + for crate::api::api::Balloon +{ + fn into_into_dart(self) -> FrbWrapper { + self.into() } } - -impl SseDecode for (Option, crate::api::api::PasswordManagerMeta) { - // Codec=Sse (Serialization based), see doc to use other codecs - fn sse_decode(deserializer: &mut flutter_rust_bridge::for_generated::SseDeserializer) -> Self { - let mut var_field0 = >::sse_decode(deserializer); - let mut var_field1 = ::sse_decode(deserializer); - return (var_field0, var_field1); +// Codec=Dco (DartCObject based), see doc to use other codecs +impl flutter_rust_bridge::IntoDart for FrbWrapper { + fn into_dart(self) -> flutter_rust_bridge::for_generated::DartAbi { + match self.0 { + crate::api::api::BalloonLayout::TemplateLayout { + image_subtitle, + image_title, + caption, + secondary_subcaption, + tertiary_subcaption, + subcaption, + class, + } => [ + 0.into_dart(), + image_subtitle.into_into_dart().into_dart(), + image_title.into_into_dart().into_dart(), + caption.into_into_dart().into_dart(), + secondary_subcaption.into_into_dart().into_dart(), + tertiary_subcaption.into_into_dart().into_dart(), + subcaption.into_into_dart().into_dart(), + class.into_into_dart().into_dart(), + ] + .into_dart(), + _ => { + unimplemented!(""); + } + } } } - -impl SseDecode for (Option, crate::api::api::PasswordRawEntry) { - // Codec=Sse (Serialization based), see doc to use other codecs - fn sse_decode(deserializer: &mut flutter_rust_bridge::for_generated::SseDeserializer) -> Self { - let mut var_field0 = >::sse_decode(deserializer); - let mut var_field1 = ::sse_decode(deserializer); - return (var_field0, var_field1); +impl flutter_rust_bridge::for_generated::IntoDartExceptPrimitive + for FrbWrapper +{ +} +impl flutter_rust_bridge::IntoIntoDart> + for crate::api::api::BalloonLayout +{ + fn into_into_dart(self) -> FrbWrapper { + self.into() } } - -impl SseDecode for (Option, crate::api::api::WifiPassword) { - // Codec=Sse (Serialization based), see doc to use other codecs - fn sse_decode(deserializer: &mut flutter_rust_bridge::for_generated::SseDeserializer) -> Self { - let mut var_field0 = >::sse_decode(deserializer); - let mut var_field1 = ::sse_decode(deserializer); - return (var_field0, var_field1); +// Codec=Dco (DartCObject based), see doc to use other codecs +impl flutter_rust_bridge::IntoDart for FrbWrapper { + fn into_dart(self) -> flutter_rust_bridge::for_generated::DartAbi { + [ + self.0.name.into_into_dart().into_dart(), + self.0.role_id.into_into_dart().into_dart(), + self.0.emoji.into_into_dart().into_dart(), + self.0.system_version.into_into_dart().into_dart(), + self.0.serial_number.into_into_dart().into_dart(), + ] + .into_dart() } } - -impl SseDecode for (crate::api::api::SharedPushState, APSWatcher) { - // Codec=Sse (Serialization based), see doc to use other codecs - fn sse_decode(deserializer: &mut flutter_rust_bridge::for_generated::SseDeserializer) -> Self { - let mut var_field0 = ::sse_decode(deserializer); - let mut var_field1 = ::sse_decode(deserializer); - return (var_field0, var_field1); +impl flutter_rust_bridge::for_generated::IntoDartExceptPrimitive + for FrbWrapper +{ +} +impl flutter_rust_bridge::IntoIntoDart> + for crate::api::api::BeaconAttributes +{ + fn into_into_dart(self) -> FrbWrapper { + self.into() } } - -impl SseDecode for (String, Asset) { - // Codec=Sse (Serialization based), see doc to use other codecs - fn sse_decode(deserializer: &mut flutter_rust_bridge::for_generated::SseDeserializer) -> Self { - let mut var_field0 = ::sse_decode(deserializer); - let mut var_field1 = ::sse_decode(deserializer); - return (var_field0, var_field1); +// Codec=Dco (DartCObject based), see doc to use other codecs +impl flutter_rust_bridge::IntoDart for FrbWrapper { + fn into_dart(self) -> flutter_rust_bridge::for_generated::DartAbi { + [ + self.0.emoji.into_into_dart().into_dart(), + self.0.name.into_into_dart().into_dart(), + self.0.associated_beacon.into_into_dart().into_dart(), + self.0.role_id.into_into_dart().into_dart(), + ] + .into_dart() } } - -impl SseDecode for (String, StCollapsedValue) { - // Codec=Sse (Serialization based), see doc to use other codecs - fn sse_decode(deserializer: &mut flutter_rust_bridge::for_generated::SseDeserializer) -> Self { - let mut var_field0 = ::sse_decode(deserializer); - let mut var_field1 = ::sse_decode(deserializer); - return (var_field0, var_field1); +impl flutter_rust_bridge::for_generated::IntoDartExceptPrimitive + for FrbWrapper +{ +} +impl flutter_rust_bridge::IntoIntoDart> + for crate::api::api::BeaconNamingRecord +{ + fn into_into_dart(self) -> FrbWrapper { + self.into() } } - -impl SseDecode for (String, bool) { - // Codec=Sse (Serialization based), see doc to use other codecs - fn sse_decode(deserializer: &mut flutter_rust_bridge::for_generated::SseDeserializer) -> Self { - let mut var_field0 = ::sse_decode(deserializer); - let mut var_field1 = ::sse_decode(deserializer); - return (var_field0, var_field1); +// Codec=Dco (DartCObject based), see doc to use other codecs +impl flutter_rust_bridge::IntoDart for FrbWrapper { + fn into_dart(self) -> flutter_rust_bridge::for_generated::DartAbi { + [ + self.0.version.into_into_dart().into_dart(), + self.0.receipt.into_into_dart().into_dart(), + self.0.sender.into_into_dart().into_dart(), + self.0.target.into_into_dart().into_dart(), + self.0.uuid.into_into_dart().into_dart(), + self.0.token.into_into_dart().into_dart(), + ] + .into_dart() } } - -impl SseDecode for (String, u64) { - // Codec=Sse (Serialization based), see doc to use other codecs - fn sse_decode(deserializer: &mut flutter_rust_bridge::for_generated::SseDeserializer) -> Self { - let mut var_field0 = ::sse_decode(deserializer); - let mut var_field1 = ::sse_decode(deserializer); - return (var_field0, var_field1); +impl flutter_rust_bridge::for_generated::IntoDartExceptPrimitive + for FrbWrapper +{ +} +impl flutter_rust_bridge::IntoIntoDart> + for crate::api::api::CertifiedContext +{ + fn into_into_dart(self) -> FrbWrapper { + self.into() } } - -impl SseDecode for (String, crate::api::api::CloudAttachment) { - // Codec=Sse (Serialization based), see doc to use other codecs - fn sse_decode(deserializer: &mut flutter_rust_bridge::for_generated::SseDeserializer) -> Self { - let mut var_field0 = ::sse_decode(deserializer); - let mut var_field1 = ::sse_decode(deserializer); - return (var_field0, var_field1); +// Codec=Dco (DartCObject based), see doc to use other codecs +impl flutter_rust_bridge::IntoDart for FrbWrapper { + fn into_dart(self) -> flutter_rust_bridge::for_generated::DartAbi { + [ + self.0.new_participants.into_into_dart().into_dart(), + self.0.group_version.into_into_dart().into_dart(), + ] + .into_dart() } } - -impl SseDecode for (String, crate::api::api::CloudChat) { - // Codec=Sse (Serialization based), see doc to use other codecs - fn sse_decode(deserializer: &mut flutter_rust_bridge::for_generated::SseDeserializer) -> Self { - let mut var_field0 = ::sse_decode(deserializer); - let mut var_field1 = ::sse_decode(deserializer); - return (var_field0, var_field1); +impl flutter_rust_bridge::for_generated::IntoDartExceptPrimitive + for FrbWrapper +{ +} +impl flutter_rust_bridge::IntoIntoDart> + for crate::api::api::ChangeParticipantMessage +{ + fn into_into_dart(self) -> FrbWrapper { + self.into() } } - -impl SseDecode for (String, crate::api::api::CloudMessage) { - // Codec=Sse (Serialization based), see doc to use other codecs - fn sse_decode(deserializer: &mut flutter_rust_bridge::for_generated::SseDeserializer) -> Self { - let mut var_field0 = ::sse_decode(deserializer); - let mut var_field1 = ::sse_decode(deserializer); - return (var_field0, var_field1); +// Codec=Dco (DartCObject based), see doc to use other codecs +impl flutter_rust_bridge::IntoDart for FrbWrapper { + fn into_dart(self) -> flutter_rust_bridge::for_generated::DartAbi { + [self.0.unk1.into_into_dart().into_dart()].into_dart() } } - -impl SseDecode for (String, crate::api::api::FTParticipant) { - // Codec=Sse (Serialization based), see doc to use other codecs - fn sse_decode(deserializer: &mut flutter_rust_bridge::for_generated::SseDeserializer) -> Self { - let mut var_field0 = ::sse_decode(deserializer); - let mut var_field1 = ::sse_decode(deserializer); - return (var_field0, var_field1); +impl flutter_rust_bridge::for_generated::IntoDartExceptPrimitive + for FrbWrapper +{ +} +impl flutter_rust_bridge::IntoIntoDart> + for crate::api::api::ChatProto +{ + fn into_into_dart(self) -> FrbWrapper { + self.into() } } - -impl SseDecode for (String, crate::api::api::GroupSummary) { - // Codec=Sse (Serialization based), see doc to use other codecs - fn sse_decode(deserializer: &mut flutter_rust_bridge::for_generated::SseDeserializer) -> Self { - let mut var_field0 = ::sse_decode(deserializer); - let mut var_field1 = ::sse_decode(deserializer); - return (var_field0, var_field1); +// Codec=Dco (DartCObject based), see doc to use other codecs +impl flutter_rust_bridge::IntoDart for FrbWrapper { + fn into_dart(self) -> flutter_rust_bridge::for_generated::DartAbi { + [ + self.0.cm.into_into_dart().into_dart(), + self.0.lqa.into_into_dart().into_dart(), + ] + .into_dart() } } - -impl SseDecode for (String, Vec) { - // Codec=Sse (Serialization based), see doc to use other codecs - fn sse_decode(deserializer: &mut flutter_rust_bridge::for_generated::SseDeserializer) -> Self { - let mut var_field0 = ::sse_decode(deserializer); - let mut var_field1 = >::sse_decode(deserializer); - return (var_field0, var_field1); +impl flutter_rust_bridge::for_generated::IntoDartExceptPrimitive + for FrbWrapper +{ +} +impl flutter_rust_bridge::IntoIntoDart> + for crate::api::api::CloudAttachment +{ + fn into_into_dart(self) -> FrbWrapper { + self.into() } } - -impl SseDecode for (String, Vec) { - // Codec=Sse (Serialization based), see doc to use other codecs - fn sse_decode(deserializer: &mut flutter_rust_bridge::for_generated::SseDeserializer) -> Self { - let mut var_field0 = ::sse_decode(deserializer); - let mut var_field1 = >::sse_decode(deserializer); - return (var_field0, var_field1); +// Codec=Dco (DartCObject based), see doc to use other codecs +impl flutter_rust_bridge::IntoDart for FrbWrapper { + fn into_dart(self) -> flutter_rust_bridge::for_generated::DartAbi { + [ + self.0.style.into_into_dart().into_dart(), + self.0.is_filtered.into_into_dart().into_dart(), + self.0.successful_query.into_into_dart().into_dart(), + self.0.state.into_into_dart().into_dart(), + self.0.chat_identifier.into_into_dart().into_dart(), + self.0.group_id.into_into_dart().into_dart(), + self.0.service_name.into_into_dart().into_dart(), + self.0.original_group_id.into_into_dart().into_dart(), + self.0.properties.into_into_dart().into_dart(), + self.0.participants.into_into_dart().into_dart(), + self.0.prop001.into_into_dart().into_dart(), + self.0 + .last_read_message_timestamp + .into_into_dart() + .into_dart(), + self.0.last_addressed_handle.into_into_dart().into_dart(), + self.0.guid.into_into_dart().into_dart(), + self.0.display_name.into_into_dart().into_dart(), + self.0.proto001.into_into_dart().into_dart(), + self.0.group_photo_guid.into_into_dart().into_dart(), + self.0.group_photo.into_into_dart().into_dart(), + ] + .into_dart() } } - -impl SseDecode - for ( - String, - std::collections::HashMap, - std::collections::HashMap, - ) +impl flutter_rust_bridge::for_generated::IntoDartExceptPrimitive + for FrbWrapper { - // Codec=Sse (Serialization based), see doc to use other codecs - fn sse_decode(deserializer: &mut flutter_rust_bridge::for_generated::SseDeserializer) -> Self { - let mut var_field0 = ::sse_decode(deserializer); - let mut var_field1 = - >::sse_decode( - deserializer, - ); - let mut var_field2 = >::sse_decode(deserializer); - return (var_field0, var_field1, var_field2); - } } - -impl SseDecode for (String, crate::api::api::MessageEditRange) { - // Codec=Sse (Serialization based), see doc to use other codecs - fn sse_decode(deserializer: &mut flutter_rust_bridge::for_generated::SseDeserializer) -> Self { - let mut var_field0 = ::sse_decode(deserializer); - let mut var_field1 = ::sse_decode(deserializer); - return (var_field0, var_field1); +impl flutter_rust_bridge::IntoIntoDart> + for crate::api::api::CloudChat +{ + fn into_into_dart(self) -> FrbWrapper { + self.into() } } - -impl SseDecode for (String, Option) { - // Codec=Sse (Serialization based), see doc to use other codecs - fn sse_decode(deserializer: &mut flutter_rust_bridge::for_generated::SseDeserializer) -> Self { - let mut var_field0 = ::sse_decode(deserializer); - let mut var_field1 = >::sse_decode(deserializer); - return (var_field0, var_field1); +// Codec=Dco (DartCObject based), see doc to use other codecs +impl flutter_rust_bridge::IntoDart for FrbWrapper { + fn into_dart(self) -> flutter_rust_bridge::for_generated::DartAbi { + [ + self.0.utm.into_into_dart().into_dart(), + self.0.r#type.into_into_dart().into_dart(), + self.0.error.into_into_dart().into_dart(), + self.0.chat_id.into_into_dart().into_dart(), + self.0.sender.into_into_dart().into_dart(), + self.0.time.into_into_dart().into_dart(), + self.0.msg_proto_2.into_into_dart().into_dart(), + self.0.destination_caller_id.into_into_dart().into_dart(), + self.0.msg_proto.into_into_dart().into_dart(), + self.0.flags.into_into_dart().into_dart(), + self.0.guid.into_into_dart().into_dart(), + self.0.msg_proto_3.into_into_dart().into_dart(), + self.0.service.into_into_dart().into_dart(), + self.0.msg_proto_4.into_into_dart().into_dart(), + ] + .into_dart() } } - -impl SseDecode for (String, Option) { - // Codec=Sse (Serialization based), see doc to use other codecs - fn sse_decode(deserializer: &mut flutter_rust_bridge::for_generated::SseDeserializer) -> Self { - let mut var_field0 = ::sse_decode(deserializer); - let mut var_field1 = >::sse_decode(deserializer); - return (var_field0, var_field1); +impl flutter_rust_bridge::for_generated::IntoDartExceptPrimitive + for FrbWrapper +{ +} +impl flutter_rust_bridge::IntoIntoDart> + for crate::api::api::CloudMessage +{ + fn into_into_dart(self) -> FrbWrapper { + self.into() } } - -impl SseDecode for (String, Option) { - // Codec=Sse (Serialization based), see doc to use other codecs - fn sse_decode(deserializer: &mut flutter_rust_bridge::for_generated::SseDeserializer) -> Self { - let mut var_field0 = ::sse_decode(deserializer); - let mut var_field1 = >::sse_decode(deserializer); - return (var_field0, var_field1); +// Codec=Dco (DartCObject based), see doc to use other codecs +impl flutter_rust_bridge::IntoDart for FrbWrapper { + fn into_dart(self) -> flutter_rust_bridge::for_generated::DartAbi { + [ + self.0.messages_summary.into_into_dart().into_dart(), + self.0.chat_summary.into_into_dart().into_dart(), + self.0.attachment_summary.into_into_dart().into_dart(), + ] + .into_dart() } } - -impl SseDecode for (String, crate::api::api::PasswordManagerMetaDataCtx) { - // Codec=Sse (Serialization based), see doc to use other codecs - fn sse_decode(deserializer: &mut flutter_rust_bridge::for_generated::SseDeserializer) -> Self { - let mut var_field0 = ::sse_decode(deserializer); - let mut var_field1 = - ::sse_decode(deserializer); - return (var_field0, var_field1); +impl flutter_rust_bridge::for_generated::IntoDartExceptPrimitive + for FrbWrapper +{ +} +impl flutter_rust_bridge::IntoIntoDart> + for crate::api::api::CloudMessageSummary +{ + fn into_into_dart(self) -> FrbWrapper { + self.into() } } - -impl SseDecode for (String, (Option, crate::api::api::Passkey)) { - // Codec=Sse (Serialization based), see doc to use other codecs - fn sse_decode(deserializer: &mut flutter_rust_bridge::for_generated::SseDeserializer) -> Self { - let mut var_field0 = ::sse_decode(deserializer); - let mut var_field1 = <(Option, crate::api::api::Passkey)>::sse_decode(deserializer); - return (var_field0, var_field1); +// Codec=Dco (DartCObject based), see doc to use other codecs +impl flutter_rust_bridge::IntoDart for FrbWrapper { + fn into_dart(self) -> flutter_rust_bridge::for_generated::DartAbi { + [self.0.uri.into_into_dart().into_dart()].into_dart() } } - -impl SseDecode - for ( - String, - (Option, crate::api::api::PasswordManagerMeta), - ) +impl flutter_rust_bridge::for_generated::IntoDartExceptPrimitive + for FrbWrapper { - // Codec=Sse (Serialization based), see doc to use other codecs - fn sse_decode(deserializer: &mut flutter_rust_bridge::for_generated::SseDeserializer) -> Self { - let mut var_field0 = ::sse_decode(deserializer); - let mut var_field1 = - <(Option, crate::api::api::PasswordManagerMeta)>::sse_decode(deserializer); - return (var_field0, var_field1); +} +impl flutter_rust_bridge::IntoIntoDart> + for crate::api::api::CloudParticipant +{ + fn into_into_dart(self) -> FrbWrapper { + self.into() } } - -impl SseDecode for (String, (Option, crate::api::api::PasswordRawEntry)) { - // Codec=Sse (Serialization based), see doc to use other codecs - fn sse_decode(deserializer: &mut flutter_rust_bridge::for_generated::SseDeserializer) -> Self { - let mut var_field0 = ::sse_decode(deserializer); - let mut var_field1 = - <(Option, crate::api::api::PasswordRawEntry)>::sse_decode(deserializer); - return (var_field0, var_field1); +// Codec=Dco (DartCObject based), see doc to use other codecs +impl flutter_rust_bridge::IntoDart for FrbWrapper { + fn into_dart(self) -> flutter_rust_bridge::for_generated::DartAbi { + [ + self.0.gpufc.into_into_dart().into_dart(), + self.0.pv.into_into_dart().into_dart(), + self.0 + .number_of_times_respondedto_thread + .into_into_dart() + .into_dart(), + self.0.should_force_to_sms.into_into_dart().into_dart(), + self.0.last_seen_message_guid.into_into_dart().into_dart(), + self.0.message_handshake_state.into_into_dart().into_dart(), + self.0.legacy_group_identifiers.into_into_dart().into_dart(), + self.0.group_photo_guid.into_into_dart().into_dart(), + self.0.last_modification_date.into_into_dart().into_dart(), + ] + .into_dart() } } - -impl SseDecode for (String, (Option, crate::api::api::WifiPassword)) { - // Codec=Sse (Serialization based), see doc to use other codecs - fn sse_decode(deserializer: &mut flutter_rust_bridge::for_generated::SseDeserializer) -> Self { - let mut var_field0 = ::sse_decode(deserializer); - let mut var_field1 = - <(Option, crate::api::api::WifiPassword)>::sse_decode(deserializer); - return (var_field0, var_field1); +impl flutter_rust_bridge::for_generated::IntoDartExceptPrimitive + for FrbWrapper +{ +} +impl flutter_rust_bridge::IntoIntoDart> + for crate::api::api::CloudProp +{ + fn into_into_dart(self) -> FrbWrapper { + self.into() } } - -impl SseDecode for (String, crate::api::api::ShareInviteContentData) { - // Codec=Sse (Serialization based), see doc to use other codecs - fn sse_decode(deserializer: &mut flutter_rust_bridge::for_generated::SseDeserializer) -> Self { - let mut var_field0 = ::sse_decode(deserializer); - let mut var_field1 = ::sse_decode(deserializer); - return (var_field0, var_field1); +// Codec=Dco (DartCObject based), see doc to use other codecs +impl flutter_rust_bridge::IntoDart for FrbWrapper { + fn into_dart(self) -> flutter_rust_bridge::for_generated::DartAbi { + [self.0.syndication_type.into_into_dart().into_dart()].into_dart() } } - -impl SseDecode for (String, crate::api::api::SharedPushState) { - // Codec=Sse (Serialization based), see doc to use other codecs - fn sse_decode(deserializer: &mut flutter_rust_bridge::for_generated::SseDeserializer) -> Self { - let mut var_field0 = ::sse_decode(deserializer); - let mut var_field1 = ::sse_decode(deserializer); - return (var_field0, var_field1); +impl flutter_rust_bridge::for_generated::IntoDartExceptPrimitive + for FrbWrapper +{ +} +impl flutter_rust_bridge::IntoIntoDart> + for crate::api::api::CloudProp001 +{ + fn into_into_dart(self) -> FrbWrapper { + self.into() } } - -impl SseDecode for (String, crate::api::api::StatusKitPersonalConfig) { - // Codec=Sse (Serialization based), see doc to use other codecs - fn sse_decode(deserializer: &mut flutter_rust_bridge::for_generated::SseDeserializer) -> Self { - let mut var_field0 = ::sse_decode(deserializer); - let mut var_field1 = ::sse_decode(deserializer); - return (var_field0, var_field1); +// Codec=Dco (DartCObject based), see doc to use other codecs +impl flutter_rust_bridge::IntoDart for crate::api::api::CloudSyncNativeAuthMetadata { + fn into_dart(self) -> flutter_rust_bridge::for_generated::DartAbi { + [ + self.native_session_id.into_into_dart().into_dart(), + self.account_fingerprint.into_into_dart().into_dart(), + self.protected_store_identity.into_into_dart().into_dart(), + ] + .into_dart() } } - -impl SseDecode for (String, String) { - // Codec=Sse (Serialization based), see doc to use other codecs - fn sse_decode(deserializer: &mut flutter_rust_bridge::for_generated::SseDeserializer) -> Self { - let mut var_field0 = ::sse_decode(deserializer); - let mut var_field1 = ::sse_decode(deserializer); - return (var_field0, var_field1); +impl flutter_rust_bridge::for_generated::IntoDartExceptPrimitive + for crate::api::api::CloudSyncNativeAuthMetadata +{ +} +impl flutter_rust_bridge::IntoIntoDart + for crate::api::api::CloudSyncNativeAuthMetadata +{ + fn into_into_dart(self) -> crate::api::api::CloudSyncNativeAuthMetadata { + self } } - -impl SseDecode for (String, crate::api::api::SyncStatus) { - // Codec=Sse (Serialization based), see doc to use other codecs - fn sse_decode(deserializer: &mut flutter_rust_bridge::for_generated::SseDeserializer) -> Self { - let mut var_field0 = ::sse_decode(deserializer); - let mut var_field1 = ::sse_decode(deserializer); - return (var_field0, var_field1); +// Codec=Dco (DartCObject based), see doc to use other codecs +impl flutter_rust_bridge::IntoDart for crate::api::api::CloudSyncOutboundConsumeResult { + fn into_dart(self) -> flutter_rust_bridge::for_generated::DartAbi { + [ + self.outcomes.into_into_dart().into_dart(), + self.failure.into_into_dart().into_dart(), + ] + .into_dart() } } - -impl SseDecode for (String, crate::api::api::UpdateAccountFinish) { - // Codec=Sse (Serialization based), see doc to use other codecs - fn sse_decode(deserializer: &mut flutter_rust_bridge::for_generated::SseDeserializer) -> Self { - let mut var_field0 = ::sse_decode(deserializer); - let mut var_field1 = ::sse_decode(deserializer); - return (var_field0, var_field1); +impl flutter_rust_bridge::for_generated::IntoDartExceptPrimitive + for crate::api::api::CloudSyncOutboundConsumeResult +{ +} +impl flutter_rust_bridge::IntoIntoDart + for crate::api::api::CloudSyncOutboundConsumeResult +{ + fn into_into_dart(self) -> crate::api::api::CloudSyncOutboundConsumeResult { + self } } - -impl SseDecode for (u32, crate::api::api::NSDictionaryTypedCoder) { - // Codec=Sse (Serialization based), see doc to use other codecs - fn sse_decode(deserializer: &mut flutter_rust_bridge::for_generated::SseDeserializer) -> Self { - let mut var_field0 = ::sse_decode(deserializer); - let mut var_field1 = ::sse_decode(deserializer); - return (var_field0, var_field1); +// Codec=Dco (DartCObject based), see doc to use other codecs +impl flutter_rust_bridge::IntoDart for crate::api::api::CloudSyncOutboundFailureClass { + fn into_dart(self) -> flutter_rust_bridge::for_generated::DartAbi { + match self { + Self::Throttled => 0.into_dart(), + Self::TransientServer => 1.into_dart(), + Self::Authentication => 2.into_dart(), + Self::Conflict => 3.into_dart(), + Self::ResetRequired => 4.into_dart(), + Self::Permanent => 5.into_dart(), + Self::Unknown => 6.into_dart(), + _ => unreachable!(), + } } } - -impl SseDecode for (u32, u64) { - // Codec=Sse (Serialization based), see doc to use other codecs - fn sse_decode(deserializer: &mut flutter_rust_bridge::for_generated::SseDeserializer) -> Self { - let mut var_field0 = ::sse_decode(deserializer); - let mut var_field1 = ::sse_decode(deserializer); - return (var_field0, var_field1); +impl flutter_rust_bridge::for_generated::IntoDartExceptPrimitive + for crate::api::api::CloudSyncOutboundFailureClass +{ +} +impl flutter_rust_bridge::IntoIntoDart + for crate::api::api::CloudSyncOutboundFailureClass +{ + fn into_into_dart(self) -> crate::api::api::CloudSyncOutboundFailureClass { + self } } - -impl SseDecode for crate::api::api::RegisterState { - // Codec=Sse (Serialization based), see doc to use other codecs - fn sse_decode(deserializer: &mut flutter_rust_bridge::for_generated::SseDeserializer) -> Self { - let mut tag_ = ::sse_decode(deserializer); - match tag_ { - 0 => { - let mut var_nextS = ::sse_decode(deserializer); - return crate::api::api::RegisterState::Registered { next_s: var_nextS }; - } - 1 => { - return crate::api::api::RegisterState::Registering; - } - 2 => { - let mut var_retryWait = >::sse_decode(deserializer); - let mut var_error = ::sse_decode(deserializer); - return crate::api::api::RegisterState::Failed { - retry_wait: var_retryWait, - error: var_error, - }; - } - _ => { - unimplemented!(""); - } +// Codec=Dco (DartCObject based), see doc to use other codecs +impl flutter_rust_bridge::IntoDart for crate::api::api::CloudSyncOutboundReconcileDisposition { + fn into_dart(self) -> flutter_rust_bridge::for_generated::DartAbi { + match self { + Self::Committed => 0.into_dart(), + Self::NotApplied => 1.into_dart(), + Self::Diverged => 2.into_dart(), + Self::Unresolved => 3.into_dart(), + _ => unreachable!(), } } } - -impl SseDecode for crate::api::api::RenameMessage { - // Codec=Sse (Serialization based), see doc to use other codecs - fn sse_decode(deserializer: &mut flutter_rust_bridge::for_generated::SseDeserializer) -> Self { - let mut var_newName = ::sse_decode(deserializer); - return crate::api::api::RenameMessage { - new_name: var_newName, - }; - } +impl flutter_rust_bridge::for_generated::IntoDartExceptPrimitive + for crate::api::api::CloudSyncOutboundReconcileDisposition +{ } - -impl SseDecode for crate::api::api::ReportMessage { - // Codec=Sse (Serialization based), see doc to use other codecs - fn sse_decode(deserializer: &mut flutter_rust_bridge::for_generated::SseDeserializer) -> Self { - let mut var_guid = ::sse_decode(deserializer); - let mut var_sender = ::sse_decode(deserializer); - let mut var_conversationSize = ::sse_decode(deserializer); - let mut var_parts = ::sse_decode(deserializer); - let mut var_timeOfMessage = ::sse_decode(deserializer); - return crate::api::api::ReportMessage { - guid: var_guid, - sender: var_sender, - conversation_size: var_conversationSize, - parts: var_parts, - time_of_message: var_timeOfMessage, - }; +impl flutter_rust_bridge::IntoIntoDart + for crate::api::api::CloudSyncOutboundReconcileDisposition +{ + fn into_into_dart(self) -> crate::api::api::CloudSyncOutboundReconcileDisposition { + self } } - -impl SseDecode for crate::api::api::RichLinkImageAttachmentSubstitute { - // Codec=Sse (Serialization based), see doc to use other codecs - fn sse_decode(deserializer: &mut flutter_rust_bridge::for_generated::SseDeserializer) -> Self { - let mut var_mimeType = ::sse_decode(deserializer); - let mut var_richLinkImageAttachmentSubstituteIndex = ::sse_decode(deserializer); - return crate::api::api::RichLinkImageAttachmentSubstitute { - mime_type: var_mimeType, - rich_link_image_attachment_substitute_index: var_richLinkImageAttachmentSubstituteIndex, - }; +// Codec=Dco (DartCObject based), see doc to use other codecs +impl flutter_rust_bridge::IntoDart for crate::api::api::CloudSyncOutboundReconcileResult { + fn into_dart(self) -> flutter_rust_bridge::for_generated::DartAbi { + [ + self.disposition.into_into_dart().into_dart(), + self.protected_proof_reference.into_into_dart().into_dart(), + self.failure_class.into_into_dart().into_dart(), + self.retry_after_seconds.into_into_dart().into_dart(), + self.failure.into_into_dart().into_dart(), + ] + .into_dart() } } - -impl SseDecode for crate::api::api::ScheduleMode { - // Codec=Sse (Serialization based), see doc to use other codecs - fn sse_decode(deserializer: &mut flutter_rust_bridge::for_generated::SseDeserializer) -> Self { - let mut var_ms = ::sse_decode(deserializer); - let mut var_schedule = ::sse_decode(deserializer); - return crate::api::api::ScheduleMode { - ms: var_ms, - schedule: var_schedule, - }; +impl flutter_rust_bridge::for_generated::IntoDartExceptPrimitive + for crate::api::api::CloudSyncOutboundReconcileResult +{ +} +impl flutter_rust_bridge::IntoIntoDart + for crate::api::api::CloudSyncOutboundReconcileResult +{ + fn into_into_dart(self) -> crate::api::api::CloudSyncOutboundReconcileResult { + self } } - -impl SseDecode for crate::api::api::SetTranscriptBackgroundMessage { - // Codec=Sse (Serialization based), see doc to use other codecs - fn sse_decode(deserializer: &mut flutter_rust_bridge::for_generated::SseDeserializer) -> Self { - let mut tag_ = ::sse_decode(deserializer); - match tag_ { - 0 => { - let mut var_aid = ::sse_decode(deserializer); - let mut var_bid = ::sse_decode(deserializer); - let mut var_chatId = >::sse_decode(deserializer); - let mut var_remove = ::sse_decode(deserializer); - return crate::api::api::SetTranscriptBackgroundMessage::Remove { - aid: var_aid, - bid: var_bid, - chat_id: var_chatId, - remove: var_remove, - }; - } - 1 => { - let mut var_aid = ::sse_decode(deserializer); - let mut var_bid = ::sse_decode(deserializer); - let mut var_chatId = >::sse_decode(deserializer); - let mut var_objectId = ::sse_decode(deserializer); - let mut var_payloadVersion = ::sse_decode(deserializer); - let mut var_backgroundId = ::sse_decode(deserializer); - let mut var_url = ::sse_decode(deserializer); - let mut var_signature = ::sse_decode(deserializer); - let mut var_key = ::sse_decode(deserializer); - let mut var_fileSize = ::sse_decode(deserializer); - return crate::api::api::SetTranscriptBackgroundMessage::Set { - aid: var_aid, - bid: var_bid, - chat_id: var_chatId, - object_id: var_objectId, - payload_version: var_payloadVersion, - background_id: var_backgroundId, - url: var_url, - signature: var_signature, - key: var_key, - file_size: var_fileSize, - }; - } - _ => { - unimplemented!(""); - } +// Codec=Dco (DartCObject based), see doc to use other codecs +impl flutter_rust_bridge::IntoDart for crate::api::api::CloudSyncOutboundSafeCode { + fn into_dart(self) -> flutter_rust_bridge::for_generated::DartAbi { + match self { + Self::InvalidScope => 0.into_dart(), + Self::InvalidRequest => 1.into_dart(), + Self::UnsupportedMessage => 2.into_dart(), + Self::MalformedMessage => 3.into_dart(), + Self::OversizedMessage => 4.into_dart(), + Self::ProtectedStorage => 5.into_dart(), + Self::BindingMismatch => 6.into_dart(), + Self::NativeAuthUnavailable => 7.into_dart(), + Self::NativePrepareFailed => 8.into_dart(), + Self::AlreadyConsumed => 9.into_dart(), + Self::CorrelationMismatch => 10.into_dart(), + _ => unreachable!(), } } } - -impl SseDecode for crate::api::api::ShareInviteContentData { - // Codec=Sse (Serialization based), see doc to use other codecs - fn sse_decode(deserializer: &mut flutter_rust_bridge::for_generated::SseDeserializer) -> Self { - let mut var_invitationToken = >::sse_decode(deserializer); - let mut var_groupId = ::sse_decode(deserializer); - let mut var_sentTime = ::sse_decode(deserializer); - let mut var_groupName = ::sse_decode(deserializer); - let mut var_shareUrl = ::sse_decode(deserializer); - let mut var_inviteeHandle = ::sse_decode(deserializer); - return crate::api::api::ShareInviteContentData { - invitation_token: var_invitationToken, - group_id: var_groupId, - sent_time: var_sentTime, - group_name: var_groupName, - share_url: var_shareUrl, - invitee_handle: var_inviteeHandle, - }; +impl flutter_rust_bridge::for_generated::IntoDartExceptPrimitive + for crate::api::api::CloudSyncOutboundSafeCode +{ +} +impl flutter_rust_bridge::IntoIntoDart + for crate::api::api::CloudSyncOutboundSafeCode +{ + fn into_into_dart(self) -> crate::api::api::CloudSyncOutboundSafeCode { + self } } - -impl SseDecode for crate::api::api::ShareProfileMessage { - // Codec=Sse (Serialization based), see doc to use other codecs - fn sse_decode(deserializer: &mut flutter_rust_bridge::for_generated::SseDeserializer) -> Self { - let mut var_cloudKitDecryptionRecordKey = >::sse_decode(deserializer); - let mut var_cloudKitRecordKey = ::sse_decode(deserializer); - let mut var_poster = >::sse_decode(deserializer); - return crate::api::api::ShareProfileMessage { - cloud_kit_decryption_record_key: var_cloudKitDecryptionRecordKey, - cloud_kit_record_key: var_cloudKitRecordKey, - poster: var_poster, - }; +// Codec=Dco (DartCObject based), see doc to use other codecs +impl flutter_rust_bridge::IntoDart for crate::api::api::CloudSyncOutboundSaveDisposition { + fn into_dart(self) -> flutter_rust_bridge::for_generated::DartAbi { + match self { + Self::Succeeded => 0.into_dart(), + Self::UnknownOutcome => 1.into_dart(), + Self::Failed => 2.into_dart(), + _ => unreachable!(), + } } } - -impl SseDecode for crate::api::api::SharedAlbum { - // Codec=Sse (Serialization based), see doc to use other codecs - fn sse_decode(deserializer: &mut flutter_rust_bridge::for_generated::SseDeserializer) -> Self { - let mut var_name = >::sse_decode(deserializer); - let mut var_fullname = >::sse_decode(deserializer); - let mut var_email = >::sse_decode(deserializer); - let mut var_albumguid = ::sse_decode(deserializer); - let mut var_sharingtype = ::sse_decode(deserializer); - let mut var_subscriptiondate = >::sse_decode(deserializer); - let mut var_albumlocation = >::sse_decode(deserializer); - let mut var_assets = >::sse_decode(deserializer); - let mut var_delete = >::sse_decode(deserializer); - return crate::api::api::SharedAlbum { - name: var_name, - fullname: var_fullname, - email: var_email, - albumguid: var_albumguid, - sharingtype: var_sharingtype, - subscriptiondate: var_subscriptiondate, - albumlocation: var_albumlocation, - assets: var_assets, - delete: var_delete, - }; +impl flutter_rust_bridge::for_generated::IntoDartExceptPrimitive + for crate::api::api::CloudSyncOutboundSaveDisposition +{ +} +impl flutter_rust_bridge::IntoIntoDart + for crate::api::api::CloudSyncOutboundSaveDisposition +{ + fn into_into_dart(self) -> crate::api::api::CloudSyncOutboundSaveDisposition { + self } } - -impl SseDecode for crate::api::api::SharedICloudServices { - // Codec=Sse (Serialization based), see doc to use other codecs - fn sse_decode(deserializer: &mut flutter_rust_bridge::for_generated::SseDeserializer) -> Self { - let mut var_account = - >>>::sse_decode(deserializer); - let mut var_tokenProvider = - >>::sse_decode(deserializer); - let mut var_cloudkitClient = - >>>::sse_decode(deserializer); - let mut var_keychain = - >>>::sse_decode(deserializer); - let mut var_passwords = - >>>::sse_decode(deserializer); - let mut var_profilesClient = - >>::sse_decode(deserializer); - let mut var_fmfd = - >>>::sse_decode(deserializer); - let mut var_sharedstreams = - >>::sse_decode( - deserializer, - ); - let mut var_cloudMessagesClient = - >>>::sse_decode(deserializer); - let mut var_statuskitClient = - >>::sse_decode(deserializer); - return crate::api::api::SharedICloudServices { - account: var_account, - token_provider: var_tokenProvider, - cloudkit_client: var_cloudkitClient, - keychain: var_keychain, - passwords: var_passwords, - profiles_client: var_profilesClient, - fmfd: var_fmfd, - sharedstreams: var_sharedstreams, - cloud_messages_client: var_cloudMessagesClient, - statuskit_client: var_statuskitClient, - }; +// Codec=Dco (DartCObject based), see doc to use other codecs +impl flutter_rust_bridge::IntoDart for crate::api::api::CloudSyncOutboundSaveOutcome { + fn into_dart(self) -> flutter_rust_bridge::for_generated::DartAbi { + [ + self.local_operation_id.into_into_dart().into_dart(), + self.apple_operation_uuid.into_into_dart().into_dart(), + self.disposition.into_into_dart().into_dart(), + self.failure_class.into_into_dart().into_dart(), + self.retry_after_seconds.into_into_dart().into_dart(), + ] + .into_dart() } } - -impl SseDecode for crate::api::api::SharedPoster { - // Codec=Sse (Serialization based), see doc to use other codecs - fn sse_decode(deserializer: &mut flutter_rust_bridge::for_generated::SseDeserializer) -> Self { - let mut var_lowResWallpaperTag = >::sse_decode(deserializer); - let mut var_wallpaperTag = >::sse_decode(deserializer); - let mut var_messageTag = >::sse_decode(deserializer); - return crate::api::api::SharedPoster { - low_res_wallpaper_tag: var_lowResWallpaperTag, - wallpaper_tag: var_wallpaperTag, - message_tag: var_messageTag, - }; +impl flutter_rust_bridge::for_generated::IntoDartExceptPrimitive + for crate::api::api::CloudSyncOutboundSaveOutcome +{ +} +impl flutter_rust_bridge::IntoIntoDart + for crate::api::api::CloudSyncOutboundSaveOutcome +{ + fn into_into_dart(self) -> crate::api::api::CloudSyncOutboundSaveOutcome { + self } } - -impl SseDecode for crate::api::api::SharedPushState { - // Codec=Sse (Serialization based), see doc to use other codecs - fn sse_decode(deserializer: &mut flutter_rust_bridge::for_generated::SseDeserializer) -> Self { - let mut var_osConfig = ::sse_decode(deserializer); - let mut var_cancelPoll = >::sse_decode(deserializer); - let mut var_confDir = ::sse_decode(deserializer); - let mut var_localBroadcast = >>::sse_decode(deserializer); - let mut var_anisette = - >::sse_decode(deserializer); - let mut var_conn = ::sse_decode(deserializer); - let mut var_icloudServices = - >::sse_decode(deserializer); - let mut var_client = >::sse_decode(deserializer); - let mut var_ftClient = >::sse_decode(deserializer); - let mut var_idmsClient = >::sse_decode(deserializer); - let mut var_activeCircleSessions = - >>>::sse_decode(deserializer); - let mut var_clientSession = >>, - >>::sse_decode(deserializer); - return crate::api::api::SharedPushState { - os_config: var_osConfig, - cancel_poll: var_cancelPoll, - conf_dir: var_confDir, - local_broadcast: var_localBroadcast, - anisette: var_anisette, - conn: var_conn, - icloud_services: var_icloudServices, - client: var_client, - ft_client: var_ftClient, - idms_client: var_idmsClient, - active_circle_sessions: var_activeCircleSessions, - client_session: var_clientSession, - }; +// Codec=Dco (DartCObject based), see doc to use other codecs +impl flutter_rust_bridge::IntoDart for crate::api::api::CloudSyncPreparedMessageCreateInput { + fn into_dart(self) -> flutter_rust_bridge::for_generated::DartAbi { + [ + self.local_operation_id.into_into_dart().into_dart(), + self.logical_entity_key_hash.into_into_dart().into_dart(), + self.protected_lease_reference.into_into_dart().into_dart(), + self.protected_payload_reference + .into_into_dart() + .into_dart(), + self.payload_sha256.into_into_dart().into_dart(), + self.protected_server_record_reference + .into_into_dart() + .into_dart(), + self.server_record_id_hash.into_into_dart().into_dart(), + self.apple_operation_uuid.into_into_dart().into_dart(), + ] + .into_dart() } } - -impl SseDecode for crate::api::api::SimplifiedIncomingCallPoster { - // Codec=Sse (Serialization based), see doc to use other codecs - fn sse_decode(deserializer: &mut flutter_rust_bridge::for_generated::SseDeserializer) -> Self { - let mut var_poster = ::sse_decode(deserializer); - let mut var_textMetadata = ::sse_decode(deserializer); - let mut var_lowRes = >::sse_decode(deserializer); - return crate::api::api::SimplifiedIncomingCallPoster { - poster: var_poster, - text_metadata: var_textMetadata, - low_res: var_lowRes, - }; +impl flutter_rust_bridge::for_generated::IntoDartExceptPrimitive + for crate::api::api::CloudSyncPreparedMessageCreateInput +{ +} +impl flutter_rust_bridge::IntoIntoDart + for crate::api::api::CloudSyncPreparedMessageCreateInput +{ + fn into_into_dart(self) -> crate::api::api::CloudSyncPreparedMessageCreateInput { + self } } - -impl SseDecode for crate::api::api::SimplifiedPoster { - // Codec=Sse (Serialization based), see doc to use other codecs - fn sse_decode(deserializer: &mut flutter_rust_bridge::for_generated::SseDeserializer) -> Self { - let mut var_titleConfiguration = - ::sse_decode(deserializer); - let mut var_type = ::sse_decode(deserializer); - let mut var_role = ::sse_decode(deserializer); - return crate::api::api::SimplifiedPoster { - title_configuration: var_titleConfiguration, - r#type: var_type, - role: var_role, - }; +// Codec=Dco (DartCObject based), see doc to use other codecs +impl flutter_rust_bridge::IntoDart for crate::api::api::CloudSyncPreparedMessageCreateResult { + fn into_dart(self) -> flutter_rust_bridge::for_generated::DartAbi { + [ + self.handle.into_into_dart().into_dart(), + self.failure.into_into_dart().into_dart(), + ] + .into_dart() } } - -impl SseDecode for crate::api::api::SimplifiedTranscriptPoster { - // Codec=Sse (Serialization based), see doc to use other codecs - fn sse_decode(deserializer: &mut flutter_rust_bridge::for_generated::SseDeserializer) -> Self { - let mut var_watch = ::sse_decode(deserializer); - let mut var_poster = ::sse_decode(deserializer); - return crate::api::api::SimplifiedTranscriptPoster { - watch: var_watch, - poster: var_poster, - }; +impl flutter_rust_bridge::for_generated::IntoDartExceptPrimitive + for crate::api::api::CloudSyncPreparedMessageCreateResult +{ +} +impl flutter_rust_bridge::IntoIntoDart + for crate::api::api::CloudSyncPreparedMessageCreateResult +{ + fn into_into_dart(self) -> crate::api::api::CloudSyncPreparedMessageCreateResult { + self } } - -impl SseDecode for crate::api::api::StatusKitMessage { - // Codec=Sse (Serialization based), see doc to use other codecs - fn sse_decode(deserializer: &mut flutter_rust_bridge::for_generated::SseDeserializer) -> Self { - let mut tag_ = ::sse_decode(deserializer); - match tag_ { - 0 => { - let mut var_user = ::sse_decode(deserializer); - let mut var_mode = >::sse_decode(deserializer); - let mut var_allowed = ::sse_decode(deserializer); - return crate::api::api::StatusKitMessage::StatusChanged { - user: var_user, - mode: var_mode, - allowed: var_allowed, - }; - } - _ => { - unimplemented!(""); - } +// Codec=Dco (DartCObject based), see doc to use other codecs +impl flutter_rust_bridge::IntoDart for crate::api::api::CloudSyncProtectedChange { + fn into_dart(self) -> flutter_rust_bridge::for_generated::DartAbi { + [ + self.change_id.into_into_dart().into_dart(), + self.record_id_hash.into_into_dart().into_dart(), + self.etag_hash.into_into_dart().into_dart(), + self.kind.into_into_dart().into_dart(), + self.payload_sha256.into_into_dart().into_dart(), + self.payload_length.into_into_dart().into_dart(), + self.protected_record_identity_reference + .into_into_dart() + .into_dart(), + self.protected_raw_envelope_reference + .into_into_dart() + .into_dart(), + self.server_modified_at_millis.into_into_dart().into_dart(), + self.preflight_code.into_into_dart().into_dart(), + self.is_tombstone.into_into_dart().into_dart(), + ] + .into_dart() + } +} +impl flutter_rust_bridge::for_generated::IntoDartExceptPrimitive + for crate::api::api::CloudSyncProtectedChange +{ +} +impl flutter_rust_bridge::IntoIntoDart + for crate::api::api::CloudSyncProtectedChange +{ + fn into_into_dart(self) -> crate::api::api::CloudSyncProtectedChange { + self + } +} +// Codec=Dco (DartCObject based), see doc to use other codecs +impl flutter_rust_bridge::IntoDart for crate::api::api::CloudSyncProtectedChangeKind { + fn into_dart(self) -> flutter_rust_bridge::for_generated::DartAbi { + match self { + Self::Save => 0.into_dart(), + Self::Delete => 1.into_dart(), + Self::Quarantined => 2.into_dart(), + _ => unreachable!(), } } } - -impl SseDecode for crate::api::api::StatusKitPersonalConfig { - // Codec=Sse (Serialization based), see doc to use other codecs - fn sse_decode(deserializer: &mut flutter_rust_bridge::for_generated::SseDeserializer) -> Self { - let mut var_allowedModes = >::sse_decode(deserializer); - return crate::api::api::StatusKitPersonalConfig { - allowed_modes: var_allowedModes, - }; +impl flutter_rust_bridge::for_generated::IntoDartExceptPrimitive + for crate::api::api::CloudSyncProtectedChangeKind +{ +} +impl flutter_rust_bridge::IntoIntoDart + for crate::api::api::CloudSyncProtectedChangeKind +{ + fn into_into_dart(self) -> crate::api::api::CloudSyncProtectedChangeKind { + self } } - -impl SseDecode for crate::api::api::SupportAction { - // Codec=Sse (Serialization based), see doc to use other codecs - fn sse_decode(deserializer: &mut flutter_rust_bridge::for_generated::SseDeserializer) -> Self { - let mut var_url = ::sse_decode(deserializer); - let mut var_button = ::sse_decode(deserializer); - return crate::api::api::SupportAction { - url: var_url, - button: var_button, - }; +// Codec=Dco (DartCObject based), see doc to use other codecs +impl flutter_rust_bridge::IntoDart for crate::api::api::CloudSyncProtectedFailure { + fn into_dart(self) -> flutter_rust_bridge::for_generated::DartAbi { + [ + self.category.into_into_dart().into_dart(), + self.safe_code.into_into_dart().into_dart(), + self.retry_after_seconds.into_into_dart().into_dart(), + ] + .into_dart() } } - -impl SseDecode for crate::api::api::SupportAlert { - // Codec=Sse (Serialization based), see doc to use other codecs - fn sse_decode(deserializer: &mut flutter_rust_bridge::for_generated::SseDeserializer) -> Self { - let mut var_title = ::sse_decode(deserializer); - let mut var_body = ::sse_decode(deserializer); - let mut var_action = >::sse_decode(deserializer); - return crate::api::api::SupportAlert { - title: var_title, - body: var_body, - action: var_action, - }; +impl flutter_rust_bridge::for_generated::IntoDartExceptPrimitive + for crate::api::api::CloudSyncProtectedFailure +{ +} +impl flutter_rust_bridge::IntoIntoDart + for crate::api::api::CloudSyncProtectedFailure +{ + fn into_into_dart(self) -> crate::api::api::CloudSyncProtectedFailure { + self } } - -impl SseDecode for crate::api::api::SyncStatus { - // Codec=Sse (Serialization based), see doc to use other codecs - fn sse_decode(deserializer: &mut flutter_rust_bridge::for_generated::SseDeserializer) -> Self { - let mut tag_ = ::sse_decode(deserializer); - match tag_ { - 0 => { - return crate::api::api::SyncStatus::Synced; - } - 1 => { - let mut var_progress = ::sse_decode(deserializer); - let mut var_total = ::sse_decode(deserializer); - return crate::api::api::SyncStatus::Downloading { - progress: var_progress, - total: var_total, - }; - } - 2 => { - let mut var_progress = ::sse_decode(deserializer); - let mut var_total = ::sse_decode(deserializer); - return crate::api::api::SyncStatus::Uploading { - progress: var_progress, - total: var_total, - }; - } - 3 => { - return crate::api::api::SyncStatus::Syncing; - } - _ => { - unimplemented!(""); - } +// Codec=Dco (DartCObject based), see doc to use other codecs +impl flutter_rust_bridge::IntoDart for crate::api::api::CloudSyncProtectedFailureCategory { + fn into_dart(self) -> flutter_rust_bridge::for_generated::DartAbi { + match self { + Self::Network => 0.into_dart(), + Self::Throttled => 1.into_dart(), + Self::Server => 2.into_dart(), + Self::Authorization => 3.into_dart(), + Self::PcsUnavailable => 4.into_dart(), + Self::MalformedRecord => 5.into_dart(), + Self::Conflict => 6.into_dart(), + Self::LocalStorage => 7.into_dart(), + Self::Unknown => 8.into_dart(), + _ => unreachable!(), } } } - -impl SseDecode for crate::api::api::TeardownSignIn { - // Codec=Sse (Serialization based), see doc to use other codecs - fn sse_decode(deserializer: &mut flutter_rust_bridge::for_generated::SseDeserializer) -> Self { - let mut var_prevtxnid = ::sse_decode(deserializer); - return crate::api::api::TeardownSignIn { - prevtxnid: var_prevtxnid, - }; +impl flutter_rust_bridge::for_generated::IntoDartExceptPrimitive + for crate::api::api::CloudSyncProtectedFailureCategory +{ +} +impl flutter_rust_bridge::IntoIntoDart + for crate::api::api::CloudSyncProtectedFailureCategory +{ + fn into_into_dart(self) -> crate::api::api::CloudSyncProtectedFailureCategory { + self } } - -impl SseDecode for crate::api::api::TextEffect { - // Codec=Sse (Serialization based), see doc to use other codecs - fn sse_decode(deserializer: &mut flutter_rust_bridge::for_generated::SseDeserializer) -> Self { - let mut inner = ::sse_decode(deserializer); - return match inner { - 0 => crate::api::api::TextEffect::Big, - 1 => crate::api::api::TextEffect::Small, - 2 => crate::api::api::TextEffect::Shake, - 3 => crate::api::api::TextEffect::Nod, - 4 => crate::api::api::TextEffect::Explode, - 5 => crate::api::api::TextEffect::Ripple, - 6 => crate::api::api::TextEffect::Bloom, - 7 => crate::api::api::TextEffect::Jitter, - _ => unreachable!("Invalid variant for TextEffect: {}", inner), - }; +// Codec=Dco (DartCObject based), see doc to use other codecs +impl flutter_rust_bridge::IntoDart for crate::api::api::CloudSyncProtectedFetchResult { + fn into_dart(self) -> flutter_rust_bridge::for_generated::DartAbi { + [ + self.page.into_into_dart().into_dart(), + self.failure.into_into_dart().into_dart(), + ] + .into_dart() } } - -impl SseDecode for crate::api::api::TextFlags { - // Codec=Sse (Serialization based), see doc to use other codecs - fn sse_decode(deserializer: &mut flutter_rust_bridge::for_generated::SseDeserializer) -> Self { - let mut var_bold = ::sse_decode(deserializer); - let mut var_italic = ::sse_decode(deserializer); - let mut var_underline = ::sse_decode(deserializer); - let mut var_strikethrough = ::sse_decode(deserializer); - return crate::api::api::TextFlags { - bold: var_bold, - italic: var_italic, - underline: var_underline, - strikethrough: var_strikethrough, - }; +impl flutter_rust_bridge::for_generated::IntoDartExceptPrimitive + for crate::api::api::CloudSyncProtectedFetchResult +{ +} +impl flutter_rust_bridge::IntoIntoDart + for crate::api::api::CloudSyncProtectedFetchResult +{ + fn into_into_dart(self) -> crate::api::api::CloudSyncProtectedFetchResult { + self } } - -impl SseDecode for crate::api::api::TextFormat { - // Codec=Sse (Serialization based), see doc to use other codecs - fn sse_decode(deserializer: &mut flutter_rust_bridge::for_generated::SseDeserializer) -> Self { - let mut tag_ = ::sse_decode(deserializer); - match tag_ { - 0 => { - let mut var_field0 = ::sse_decode(deserializer); - return crate::api::api::TextFormat::Flags(var_field0); - } - 1 => { - let mut var_field0 = ::sse_decode(deserializer); - return crate::api::api::TextFormat::Effect(var_field0); - } - _ => { - unimplemented!(""); - } - } +// Codec=Dco (DartCObject based), see doc to use other codecs +impl flutter_rust_bridge::IntoDart for crate::api::api::CloudSyncProtectedGarbageCollection { + fn into_dart(self) -> flutter_rust_bridge::for_generated::DartAbi { + [ + self.scanned_count.into_into_dart().into_dart(), + self.first_observed_count.into_into_dart().into_dart(), + self.deleted_count.into_into_dart().into_dart(), + self.preserved_live_count.into_into_dart().into_dart(), + self.preserved_active_lease_count + .into_into_dart() + .into_dart(), + self.has_more.into_into_dart().into_dart(), + ] + .into_dart() } } - -impl SseDecode for crate::api::api::TranscriptDynamicUserData { - // Codec=Sse (Serialization based), see doc to use other codecs - fn sse_decode(deserializer: &mut flutter_rust_bridge::for_generated::SseDeserializer) -> Self { - let mut var_identifier = ::sse_decode(deserializer); - return crate::api::api::TranscriptDynamicUserData { - identifier: var_identifier, - }; +impl flutter_rust_bridge::for_generated::IntoDartExceptPrimitive + for crate::api::api::CloudSyncProtectedGarbageCollection +{ +} +impl flutter_rust_bridge::IntoIntoDart + for crate::api::api::CloudSyncProtectedGarbageCollection +{ + fn into_into_dart(self) -> crate::api::api::CloudSyncProtectedGarbageCollection { + self } } - -impl SseDecode for crate::api::api::TransferProgress { - // Codec=Sse (Serialization based), see doc to use other codecs - fn sse_decode(deserializer: &mut flutter_rust_bridge::for_generated::SseDeserializer) -> Self { - let mut var_prog = ::sse_decode(deserializer); - let mut var_total = ::sse_decode(deserializer); - let mut var_attachment = >::sse_decode(deserializer); - return crate::api::api::TransferProgress { - prog: var_prog, - total: var_total, - attachment: var_attachment, - }; +// Codec=Dco (DartCObject based), see doc to use other codecs +impl flutter_rust_bridge::IntoDart for crate::api::api::CloudSyncProtectedGarbageCollectionResult { + fn into_dart(self) -> flutter_rust_bridge::for_generated::DartAbi { + [ + self.collection.into_into_dart().into_dart(), + self.failure.into_into_dart().into_dart(), + ] + .into_dart() } } - -impl SseDecode for crate::api::api::TrustedPhoneNumber { - // Codec=Sse (Serialization based), see doc to use other codecs - fn sse_decode(deserializer: &mut flutter_rust_bridge::for_generated::SseDeserializer) -> Self { - let mut var_numberWithDialCode = ::sse_decode(deserializer); - let mut var_lastTwoDigits = ::sse_decode(deserializer); - let mut var_pushMode = ::sse_decode(deserializer); - let mut var_id = ::sse_decode(deserializer); - return crate::api::api::TrustedPhoneNumber { - number_with_dial_code: var_numberWithDialCode, - last_two_digits: var_lastTwoDigits, - push_mode: var_pushMode, - id: var_id, - }; +impl flutter_rust_bridge::for_generated::IntoDartExceptPrimitive + for crate::api::api::CloudSyncProtectedGarbageCollectionResult +{ +} +impl flutter_rust_bridge::IntoIntoDart + for crate::api::api::CloudSyncProtectedGarbageCollectionResult +{ + fn into_into_dart(self) -> crate::api::api::CloudSyncProtectedGarbageCollectionResult { + self } } - -impl SseDecode for crate::api::api::TypingApp { - // Codec=Sse (Serialization based), see doc to use other codecs - fn sse_decode(deserializer: &mut flutter_rust_bridge::for_generated::SseDeserializer) -> Self { - let mut var_bundleId = ::sse_decode(deserializer); - let mut var_icon = >::sse_decode(deserializer); - return crate::api::api::TypingApp { - bundle_id: var_bundleId, - icon: var_icon, - }; +// Codec=Dco (DartCObject based), see doc to use other codecs +impl flutter_rust_bridge::IntoDart for crate::api::api::CloudSyncProtectedLeaseResult { + fn into_dart(self) -> flutter_rust_bridge::for_generated::DartAbi { + [self.failure.into_into_dart().into_dart()].into_dart() + } +} +impl flutter_rust_bridge::for_generated::IntoDartExceptPrimitive + for crate::api::api::CloudSyncProtectedLeaseResult +{ +} +impl flutter_rust_bridge::IntoIntoDart + for crate::api::api::CloudSyncProtectedLeaseResult +{ + fn into_into_dart(self) -> crate::api::api::CloudSyncProtectedLeaseResult { + self + } +} +// Codec=Dco (DartCObject based), see doc to use other codecs +impl flutter_rust_bridge::IntoDart for crate::api::api::CloudSyncProtectedOutboundStage { + fn into_dart(self) -> flutter_rust_bridge::for_generated::DartAbi { + [ + self.logical_entity_key_hash.into_into_dart().into_dart(), + self.protected_payload_reference + .into_into_dart() + .into_dart(), + self.payload_sha256.into_into_dart().into_dart(), + self.payload_length.into_into_dart().into_dart(), + self.protected_server_record_reference + .into_into_dart() + .into_dart(), + self.server_record_id_hash.into_into_dart().into_dart(), + self.lease_reference.into_into_dart().into_dart(), + ] + .into_dart() + } +} +impl flutter_rust_bridge::for_generated::IntoDartExceptPrimitive + for crate::api::api::CloudSyncProtectedOutboundStage +{ +} +impl flutter_rust_bridge::IntoIntoDart + for crate::api::api::CloudSyncProtectedOutboundStage +{ + fn into_into_dart(self) -> crate::api::api::CloudSyncProtectedOutboundStage { + self } } - -impl SseDecode for u32 { - // Codec=Sse (Serialization based), see doc to use other codecs - fn sse_decode(deserializer: &mut flutter_rust_bridge::for_generated::SseDeserializer) -> Self { - deserializer.cursor.read_u32::().unwrap() +// Codec=Dco (DartCObject based), see doc to use other codecs +impl flutter_rust_bridge::IntoDart for crate::api::api::CloudSyncProtectedOutboundStageResult { + fn into_dart(self) -> flutter_rust_bridge::for_generated::DartAbi { + [ + self.stage.into_into_dart().into_dart(), + self.failure.into_into_dart().into_dart(), + ] + .into_dart() } } - -impl SseDecode for u64 { - // Codec=Sse (Serialization based), see doc to use other codecs - fn sse_decode(deserializer: &mut flutter_rust_bridge::for_generated::SseDeserializer) -> Self { - deserializer.cursor.read_u64::().unwrap() - } +impl flutter_rust_bridge::for_generated::IntoDartExceptPrimitive + for crate::api::api::CloudSyncProtectedOutboundStageResult +{ } - -impl SseDecode for u8 { - // Codec=Sse (Serialization based), see doc to use other codecs - fn sse_decode(deserializer: &mut flutter_rust_bridge::for_generated::SseDeserializer) -> Self { - deserializer.cursor.read_u8().unwrap() +impl flutter_rust_bridge::IntoIntoDart + for crate::api::api::CloudSyncProtectedOutboundStageResult +{ + fn into_into_dart(self) -> crate::api::api::CloudSyncProtectedOutboundStageResult { + self } } - -impl SseDecode for crate::api::api::UIColor { - // Codec=Sse (Serialization based), see doc to use other codecs - fn sse_decode(deserializer: &mut flutter_rust_bridge::for_generated::SseDeserializer) -> Self { - let mut tag_ = ::sse_decode(deserializer); - match tag_ { - 0 => { - let mut var_colorComponents = ::sse_decode(deserializer); - let mut var_green = ::sse_decode(deserializer); - let mut var_blue = ::sse_decode(deserializer); - let mut var_red = ::sse_decode(deserializer); - let mut var_greenDbl = >::sse_decode(deserializer); - let mut var_blueDbl = >::sse_decode(deserializer); - let mut var_redDbl = >::sse_decode(deserializer); - let mut var_alphaDbl = >::sse_decode(deserializer); - let mut var_alpha = ::sse_decode(deserializer); - let mut var_rgb = >::sse_decode(deserializer); - let mut var_colorSpace = ::sse_decode(deserializer); - let mut var_class_ = ::sse_decode(deserializer); - return crate::api::api::UIColor::RGBAColorSpace { - color_components: var_colorComponents, - green: var_green, - blue: var_blue, - red: var_red, - green_dbl: var_greenDbl, - blue_dbl: var_blueDbl, - red_dbl: var_redDbl, - alpha_dbl: var_alphaDbl, - alpha: var_alpha, - rgb: var_rgb, - color_space: var_colorSpace, - class: var_class_, - }; - } - 1 => { - let mut var_colorComponents = ::sse_decode(deserializer); - let mut var_white = ::sse_decode(deserializer); - let mut var_alpha = ::sse_decode(deserializer); - let mut var_bin = >::sse_decode(deserializer); - let mut var_colorSpace = ::sse_decode(deserializer); - let mut var_class_ = ::sse_decode(deserializer); - return crate::api::api::UIColor::GrayscaleAlphaColorSpace { - color_components: var_colorComponents, - white: var_white, - alpha: var_alpha, - bin: var_bin, - color_space: var_colorSpace, - class: var_class_, - }; - } - _ => { - unimplemented!(""); - } - } +// Codec=Dco (DartCObject based), see doc to use other codecs +impl flutter_rust_bridge::IntoDart for crate::api::api::CloudSyncProtectedPage { + fn into_dart(self) -> flutter_rust_bridge::for_generated::DartAbi { + [ + self.changes.into_into_dart().into_dart(), + self.batch_id.into_into_dart().into_dart(), + self.generation.into_into_dart().into_dart(), + self.page_lease_reference.into_into_dart().into_dart(), + self.protected_next_checkpoint_reference + .into_into_dart() + .into_dart(), + self.complete.into_into_dart().into_dart(), + self.admitted_raw_bytes.into_into_dart().into_dart(), + ] + .into_dart() } } - -impl SseDecode for () { - // Codec=Sse (Serialization based), see doc to use other codecs - fn sse_decode(deserializer: &mut flutter_rust_bridge::for_generated::SseDeserializer) -> Self {} +impl flutter_rust_bridge::for_generated::IntoDartExceptPrimitive + for crate::api::api::CloudSyncProtectedPage +{ } - -impl SseDecode for crate::api::api::UnsendMessage { - // Codec=Sse (Serialization based), see doc to use other codecs - fn sse_decode(deserializer: &mut flutter_rust_bridge::for_generated::SseDeserializer) -> Self { - let mut var_tuuid = ::sse_decode(deserializer); - let mut var_editPart = ::sse_decode(deserializer); - return crate::api::api::UnsendMessage { - tuuid: var_tuuid, - edit_part: var_editPart, - }; +impl flutter_rust_bridge::IntoIntoDart + for crate::api::api::CloudSyncProtectedPage +{ + fn into_into_dart(self) -> crate::api::api::CloudSyncProtectedPage { + self } } - -impl SseDecode for crate::api::api::UpdateAccountFinish { - // Codec=Sse (Serialization based), see doc to use other codecs - fn sse_decode(deserializer: &mut flutter_rust_bridge::for_generated::SseDeserializer) -> Self { - let mut tag_ = ::sse_decode(deserializer); - match tag_ { - 0 => { - return crate::api::api::UpdateAccountFinish::MacOS; - } - 1 => { - let mut var_url = ::sse_decode(deserializer); - return crate::api::api::UpdateAccountFinish::IOS { url: var_url }; - } - _ => { - unimplemented!(""); - } +// Codec=Dco (DartCObject based), see doc to use other codecs +impl flutter_rust_bridge::IntoDart for crate::api::api::CloudSyncProtectedPreflightCode { + fn into_dart(self) -> flutter_rust_bridge::for_generated::DartAbi { + match self { + Self::UnsupportedRecordType => 0.into_dart(), + Self::MalformedMetadata => 1.into_dart(), + Self::OversizedRecord => 2.into_dart(), + Self::InvalidChangeShape => 3.into_dart(), + _ => unreachable!(), } } } - -impl SseDecode for crate::api::api::UpdateExtensionMessage { - // Codec=Sse (Serialization based), see doc to use other codecs - fn sse_decode(deserializer: &mut flutter_rust_bridge::for_generated::SseDeserializer) -> Self { - let mut var_forUuid = ::sse_decode(deserializer); - let mut var_ext = ::sse_decode(deserializer); - return crate::api::api::UpdateExtensionMessage { - for_uuid: var_forUuid, - ext: var_ext, - }; +impl flutter_rust_bridge::for_generated::IntoDartExceptPrimitive + for crate::api::api::CloudSyncProtectedPreflightCode +{ +} +impl flutter_rust_bridge::IntoIntoDart + for crate::api::api::CloudSyncProtectedPreflightCode +{ + fn into_into_dart(self) -> crate::api::api::CloudSyncProtectedPreflightCode { + self } } - -impl SseDecode for crate::api::api::UpdateProfileMessage { - // Codec=Sse (Serialization based), see doc to use other codecs - fn sse_decode(deserializer: &mut flutter_rust_bridge::for_generated::SseDeserializer) -> Self { - let mut var_profile = - >::sse_decode(deserializer); - let mut var_shareContacts = ::sse_decode(deserializer); - return crate::api::api::UpdateProfileMessage { - profile: var_profile, - share_contacts: var_shareContacts, - }; +// Codec=Dco (DartCObject based), see doc to use other codecs +impl flutter_rust_bridge::IntoDart for crate::api::api::CloudSyncProtectedRecovery { + fn into_dart(self) -> flutter_rust_bridge::for_generated::DartAbi { + [ + self.finalized_adopted_lease_references + .into_into_dart() + .into_dart(), + self.absent_adopted_lease_references + .into_into_dart() + .into_dart(), + self.rolled_back_count.into_into_dart().into_dart(), + self.removed_temporary_files_count + .into_into_dart() + .into_dart(), + self.has_more.into_into_dart().into_dart(), + ] + .into_dart() } } - -impl SseDecode for crate::api::api::UpdateProfileSharingMessage { - // Codec=Sse (Serialization based), see doc to use other codecs - fn sse_decode(deserializer: &mut flutter_rust_bridge::for_generated::SseDeserializer) -> Self { - let mut var_sharedDismissed = >::sse_decode(deserializer); - let mut var_sharedAll = >::sse_decode(deserializer); - let mut var_version = ::sse_decode(deserializer); - return crate::api::api::UpdateProfileSharingMessage { - shared_dismissed: var_sharedDismissed, - shared_all: var_sharedAll, - version: var_version, - }; +impl flutter_rust_bridge::for_generated::IntoDartExceptPrimitive + for crate::api::api::CloudSyncProtectedRecovery +{ +} +impl flutter_rust_bridge::IntoIntoDart + for crate::api::api::CloudSyncProtectedRecovery +{ + fn into_into_dart(self) -> crate::api::api::CloudSyncProtectedRecovery { + self } } - -impl SseDecode for usize { - // Codec=Sse (Serialization based), see doc to use other codecs - fn sse_decode(deserializer: &mut flutter_rust_bridge::for_generated::SseDeserializer) -> Self { - deserializer.cursor.read_u64::().unwrap() as _ +// Codec=Dco (DartCObject based), see doc to use other codecs +impl flutter_rust_bridge::IntoDart for crate::api::api::CloudSyncProtectedRecoveryResult { + fn into_dart(self) -> flutter_rust_bridge::for_generated::DartAbi { + [ + self.recovery.into_into_dart().into_dart(), + self.failure.into_into_dart().into_dart(), + ] + .into_dart() } } - -impl SseDecode for crate::api::api::WallpaperMetadata { - // Codec=Sse (Serialization based), see doc to use other codecs - fn sse_decode(deserializer: &mut flutter_rust_bridge::for_generated::SseDeserializer) -> Self { - let mut var_backgroundColorKey = - >::sse_decode(deserializer); - let mut var_fontColorKey = ::sse_decode(deserializer); - let mut var_fontNameKey = ::sse_decode(deserializer); - let mut var_fontSizeKey = ::sse_decode(deserializer); - let mut var_fontWeightKey = ::sse_decode(deserializer); - let mut var_isVerticalKey = ::sse_decode(deserializer); - let mut var_typeKey = ::sse_decode(deserializer); - return crate::api::api::WallpaperMetadata { - background_color_key: var_backgroundColorKey, - font_color_key: var_fontColorKey, - font_name_key: var_fontNameKey, - font_size_key: var_fontSizeKey, - font_weight_key: var_fontWeightKey, - is_vertical_key: var_isVerticalKey, - type_key: var_typeKey, - }; +impl flutter_rust_bridge::for_generated::IntoDartExceptPrimitive + for crate::api::api::CloudSyncProtectedRecoveryResult +{ +} +impl flutter_rust_bridge::IntoIntoDart + for crate::api::api::CloudSyncProtectedRecoveryResult +{ + fn into_into_dart(self) -> crate::api::api::CloudSyncProtectedRecoveryResult { + self } } - -impl SseDecode for crate::api::api::WatchBackground { - // Codec=Sse (Serialization based), see doc to use other codecs - fn sse_decode(deserializer: &mut flutter_rust_bridge::for_generated::SseDeserializer) -> Self { - let mut var_isHighKey = ::sse_decode(deserializer); - let mut var_luminance = ::sse_decode(deserializer); - let mut var_backgroundImageData = >::sse_decode(deserializer); - let mut var_extensionIdentifier = ::sse_decode(deserializer); - return crate::api::api::WatchBackground { - is_high_key: var_isHighKey, - luminance: var_luminance, - background_image_data: var_backgroundImageData, - extension_identifier: var_extensionIdentifier, - }; +// Codec=Dco (DartCObject based), see doc to use other codecs +impl flutter_rust_bridge::IntoDart for crate::api::api::CloudSyncProtectedRetirementResult { + fn into_dart(self) -> flutter_rust_bridge::for_generated::DartAbi { + [ + self.retired_count.into_into_dart().into_dart(), + self.failure.into_into_dart().into_dart(), + ] + .into_dart() } } - -impl SseDecode for crate::api::api::WifiPassword { - // Codec=Sse (Serialization based), see doc to use other codecs - fn sse_decode(deserializer: &mut flutter_rust_bridge::for_generated::SseDeserializer) -> Self { - let mut var_cdat = ::sse_decode(deserializer); - let mut var_mdat = ::sse_decode(deserializer); - let mut var_acct = ::sse_decode(deserializer); - let mut var_svce = ::sse_decode(deserializer); - let mut var_data = >::sse_decode(deserializer); - return crate::api::api::WifiPassword { - cdat: var_cdat, - mdat: var_mdat, - acct: var_acct, - svce: var_svce, - data: var_data, - }; +impl flutter_rust_bridge::for_generated::IntoDartExceptPrimitive + for crate::api::api::CloudSyncProtectedRetirementResult +{ +} +impl flutter_rust_bridge::IntoIntoDart + for crate::api::api::CloudSyncProtectedRetirementResult +{ + fn into_into_dart(self) -> crate::api::api::CloudSyncProtectedRetirementResult { + self } } - -fn pde_ffi_dispatcher_primary_impl( - func_id: i32, - port: flutter_rust_bridge::for_generated::MessagePort, - ptr: flutter_rust_bridge::for_generated::PlatformGeneralizedUint8ListPtr, - rust_vec_len: i32, - data_len: i32, -) { - // Codec=Pde (Serialization + dispatch), see doc to use other codecs - match func_id { - 31 => wire__crate__api__api__accept_beacon_share_impl(port, ptr, rust_vec_len, data_len), - 32 => wire__crate__api__api__accept_invite_impl(port, ptr, rust_vec_len, data_len), - 33 => wire__crate__api__api__add_album_impl(port, ptr, rust_vec_len, data_len), - 34 => wire__crate__api__api__answer_ft_request_impl(port, ptr, rust_vec_len, data_len), - 35 => wire__crate__api__api__approve_circle_impl(port, ptr, rust_vec_len, data_len), - 36 => wire__crate__api__api__attachment_get_size_impl(port, ptr, rust_vec_len, data_len), - 38 => wire__crate__api__api__auth_phone_impl(port, ptr, rust_vec_len, data_len), - 40 => wire__crate__api__api__cancel_facetime_impl(port, ptr, rust_vec_len, data_len), - 42 => wire__crate__api__api__certify_delivery_impl(port, ptr, rust_vec_len, data_len), - 43 => wire__crate__api__api__change_escrow_password_impl(port, ptr, rust_vec_len, data_len), - 44 => wire__crate__api__api__circle_setup_clique_impl(port, ptr, rust_vec_len, data_len), - 45 => wire__crate__api__api__clear_links_impl(port, ptr, rust_vec_len, data_len), - 51 => wire__crate__api__api__complete_msg_impl(port, ptr, rust_vec_len, data_len), - 52 => wire__crate__api__api__config_from_encoded_impl(port, ptr, rust_vec_len, data_len), - 53 => wire__crate__api__api__config_from_relay_impl(port, ptr, rust_vec_len, data_len), - 54 => wire__crate__api__api__config_from_validation_data_impl( - port, - ptr, - rust_vec_len, - data_len, - ), - 55 => wire__crate__api__api__configure_app_review_impl(port, ptr, rust_vec_len, data_len), - 56 => wire__crate__api__api__convert_token_to_uuid_impl(port, ptr, rust_vec_len, data_len), - 57 => wire__crate__api__api__count_records_impl(port, ptr, rust_vec_len, data_len), - 58 => wire__crate__api__api__create_facetime_impl(port, ptr, rust_vec_len, data_len), - 59 => wire__crate__api__api__create_group_impl(port, ptr, rust_vec_len, data_len), - 60 => wire__crate__api__api__create_icon_array_impl(port, ptr, rust_vec_len, data_len), - 61 => wire__crate__api__api__create_image_array_impl(port, ptr, rust_vec_len, data_len), - 64 => wire__crate__api__api__decline_facetime_impl(port, ptr, rust_vec_len, data_len), - 65 => wire__crate__api__api__decline_invite_impl(port, ptr, rust_vec_len, data_len), - 75 => wire__crate__api__api__decode_profile_message_impl(port, ptr, rust_vec_len, data_len), - 76 => wire__crate__api__api__decode_summary_info_impl(port, ptr, rust_vec_len, data_len), - 77 => wire__crate__api__api__delete_attachments_impl(port, ptr, rust_vec_len, data_len), - 78 => wire__crate__api__api__delete_beacon_share_impl(port, ptr, rust_vec_len, data_len), - 79 => wire__crate__api__api__delete_chats_impl(port, ptr, rust_vec_len, data_len), - 80 => wire__crate__api__api__delete_group_impl(port, ptr, rust_vec_len, data_len), - 81 => wire__crate__api__api__delete_messages_impl(port, ptr, rust_vec_len, data_len), - 82 => wire__crate__api__api__delete_passkey_impl(port, ptr, rust_vec_len, data_len), - 83 => wire__crate__api__api__delete_password_impl(port, ptr, rust_vec_len, data_len), - 84 => wire__crate__api__api__delete_password_meta_impl(port, ptr, rust_vec_len, data_len), - 85 => wire__crate__api__api__delete_wifi_password_impl(port, ptr, rust_vec_len, data_len), - 86 => wire__crate__api__api__do_first_time_init_impl(port, ptr, rust_vec_len, data_len), - 87 => wire__crate__api__api__do_login_impl(port, ptr, rust_vec_len, data_len), - 88 => wire__crate__api__api__do_reregister_impl(port, ptr, rust_vec_len, data_len), - 89 => wire__crate__api__api__download_attachment_impl(port, ptr, rust_vec_len, data_len), - 90 => wire__crate__api__api__download_cloud_attachments_impl( - port, - ptr, - rust_vec_len, - data_len, - ), - 91 => wire__crate__api__api__download_cloud_group_photos_impl( - port, - ptr, - rust_vec_len, - data_len, - ), - 92 => wire__crate__api__api__download_mmcs_impl(port, ptr, rust_vec_len, data_len), - 98 => wire__crate__api__api__encode_hex_impl(port, ptr, rust_vec_len, data_len), - 104 => { - wire__crate__api__api__encode_profile_message_impl(port, ptr, rust_vec_len, data_len) - } - 105 => wire__crate__api__api__encode_summary_info_impl(port, ptr, rust_vec_len, data_len), - 106 => wire__crate__api__api__fetch_profile_impl(port, ptr, rust_vec_len, data_len), - 107 => { - wire__crate__api__api__ffi_file_packager_default_impl(port, ptr, rust_vec_len, data_len) - } - 108 => wire__crate__api__api__from_poster_impl(port, ptr, rust_vec_len, data_len), - 109 => wire__crate__api__api__from_poster_save_impl(port, ptr, rust_vec_len, data_len), - 110 => wire__crate__api__api__from_transcript_poster_save_impl( - port, - ptr, - rust_vec_len, - data_len, - ), - 111 => wire__crate__api__api__ft_sessions_impl(port, ptr, rust_vec_len, data_len), - 112 => wire__crate__api__api__generate_udid_impl(port, ptr, rust_vec_len, data_len), - 113 => wire__crate__api__api__get_2fa_code_impl(port, ptr, rust_vec_len, data_len), - 114 => wire__crate__api__api__get_2fa_sms_opts_impl(port, ptr, rust_vec_len, data_len), - 115 => wire__crate__api__api__get_albums_impl(port, ptr, rust_vec_len, data_len), - 116 => wire__crate__api__api__get_anisette_headers_impl(port, ptr, rust_vec_len, data_len), - 118 => { - wire__crate__api__api__get_background_following_impl(port, ptr, rust_vec_len, data_len) - } - 119 => wire__crate__api__api__get_beacon_items_impl(port, ptr, rust_vec_len, data_len), - 120 => wire__crate__api__api__get_bottles_impl(port, ptr, rust_vec_len, data_len), - 121 => wire__crate__api__api__get_contacts_headers_impl(port, ptr, rust_vec_len, data_len), - 122 => wire__crate__api__api__get_device_info_impl(port, ptr, rust_vec_len, data_len), - 123 => wire__crate__api__api__get_devices_impl(port, ptr, rust_vec_len, data_len), - 124 => wire__crate__api__api__get_entitlements_impl(port, ptr, rust_vec_len, data_len), - 125 => wire__crate__api__api__get_following_impl(port, ptr, rust_vec_len, data_len), - 126 => wire__crate__api__api__get_ft_link_impl(port, ptr, rust_vec_len, data_len), - 127 => wire__crate__api__api__get_groups_impl(port, ptr, rust_vec_len, data_len), - 128 => wire__crate__api__api__get_handles_impl(port, ptr, rust_vec_len, data_len), - 129 => wire__crate__api__api__get_my_phone_handles_impl(port, ptr, rust_vec_len, data_len), - 130 => wire__crate__api__api__get_passkeys_impl(port, ptr, rust_vec_len, data_len), - 131 => wire__crate__api__api__get_passwords_impl(port, ptr, rust_vec_len, data_len), - 132 => wire__crate__api__api__get_passwords_meta_impl(port, ptr, rust_vec_len, data_len), - 133 => wire__crate__api__api__get_quota_info_impl(port, ptr, rust_vec_len, data_len), - 134 => wire__crate__api__api__get_regstate_impl(port, ptr, rust_vec_len, data_len), - 135 => wire__crate__api__api__get_sms_targets_impl(port, ptr, rust_vec_len, data_len), - 136 => wire__crate__api__api__get_syncstatus_impl(port, ptr, rust_vec_len, data_len), - 137 => wire__crate__api__api__get_token_impl(port, ptr, rust_vec_len, data_len), - 138 => wire__crate__api__api__get_user_name_impl(port, ptr, rust_vec_len, data_len), - 139 => wire__crate__api__api__get_wifi_passwords_impl(port, ptr, rust_vec_len, data_len), - 141 => wire__crate__api__api__invalidate_id_cache_impl(port, ptr, rust_vec_len, data_len), - 142 => wire__crate__api__api__invite_to_channel_impl(port, ptr, rust_vec_len, data_len), - 143 => wire__crate__api__api__invite_user_impl(port, ptr, rust_vec_len, data_len), - 144 => wire__crate__api__api__is_in_clique_impl(port, ptr, rust_vec_len, data_len), - 145 => { - wire__crate__api__api__join_clique_with_bottle_impl(port, ptr, rust_vec_len, data_len) - } - 146 => wire__crate__api__api__make_anisette_impl(port, ptr, rust_vec_len, data_len), - 150 => wire__crate__api__api__make_cloudkit_impl(port, ptr, rust_vec_len, data_len), - 151 => wire__crate__api__api__make_facetime_impl(port, ptr, rust_vec_len, data_len), - 152 => wire__crate__api__api__make_find_my_friends_impl(port, ptr, rust_vec_len, data_len), - 153 => wire__crate__api__api__make_find_my_phone_impl(port, ptr, rust_vec_len, data_len), - 154 => wire__crate__api__api__make_findmy_impl(port, ptr, rust_vec_len, data_len), - 155 => wire__crate__api__api__make_idms_impl(port, ptr, rust_vec_len, data_len), - 156 => wire__crate__api__api__make_imclient_impl(port, ptr, rust_vec_len, data_len), - 158 => wire__crate__api__api__make_passwords_impl(port, ptr, rust_vec_len, data_len), - 159 => wire__crate__api__api__make_profiles_impl(port, ptr, rust_vec_len, data_len), - 160 => wire__crate__api__api__make_shared_streams_impl(port, ptr, rust_vec_len, data_len), - 161 => wire__crate__api__api__make_statuskit_impl(port, ptr, rust_vec_len, data_len), - 163 => { - wire__crate__api__api__message_parts_raw_text_impl(port, ptr, rust_vec_len, data_len) - } - 165 => { - wire__crate__api__api__my_async_runtime_default_impl(port, ptr, rust_vec_len, data_len) - } - 166 => wire__crate__api__api__new_msg_impl(port, ptr, rust_vec_len, data_len), - 177 => { - wire__crate__api__api__pack_transcript_poster_impl(port, ptr, rust_vec_len, data_len) - } - 178 => wire__crate__api__api__parse_poster_impl(port, ptr, rust_vec_len, data_len), - 179 => wire__crate__api__api__parse_poster_save_impl(port, ptr, rust_vec_len, data_len), - 180 => { - wire__crate__api__api__parse_transcript_poster_impl(port, ptr, rust_vec_len, data_len) - } - 184 => wire__crate__api__api__provisioned_flavor_default_impl( - port, - ptr, - rust_vec_len, - data_len, - ), - 185 => wire__crate__api__api__ptr_to_dart_impl(port, ptr, rust_vec_len, data_len), - 186 => wire__crate__api__api__query_handle_impl(port, ptr, rust_vec_len, data_len), - 188 => wire__crate__api__api__recv_wait_impl(port, ptr, rust_vec_len, data_len), - 189 => wire__crate__api__api__refresh_background_following_impl( - port, - ptr, - rust_vec_len, - data_len, - ), - 190 => wire__crate__api__api__refresh_devices_impl(port, ptr, rust_vec_len, data_len), - 191 => wire__crate__api__api__refresh_following_impl(port, ptr, rust_vec_len, data_len), - 192 => wire__crate__api__api__register_ids_impl(port, ptr, rust_vec_len, data_len), - 193 => wire__crate__api__api__remove_album_impl(port, ptr, rust_vec_len, data_len), - 194 => wire__crate__api__api__remove_user_impl(port, ptr, rust_vec_len, data_len), - 195 => wire__crate__api__api__rename_group_impl(port, ptr, rust_vec_len, data_len), - 196 => wire__crate__api__api__report_messages_impl(port, ptr, rust_vec_len, data_len), - 197 => wire__crate__api__api__request_handles_impl(port, ptr, rust_vec_len, data_len), - 199 => wire__crate__api__api__reset_channel_keys_impl(port, ptr, rust_vec_len, data_len), - 200 => wire__crate__api__api__reset_clique_impl(port, ptr, rust_vec_len, data_len), - 201 => wire__crate__api__api__reset_state_impl(port, ptr, rust_vec_len, data_len), - 202 => wire__crate__api__api__restore_account_impl(port, ptr, rust_vec_len, data_len), - 205 => wire__crate__api__api__restore_user_impl(port, ptr, rust_vec_len, data_len), - 207 => wire__crate__api__api__save_attachment_impl(port, ptr, rust_vec_len, data_len), - 208 => wire__crate__api__api__save_attachments_impl(port, ptr, rust_vec_len, data_len), - 209 => wire__crate__api__api__save_chats_impl(port, ptr, rust_vec_len, data_len), - 211 => wire__crate__api__api__save_messages_impl(port, ptr, rust_vec_len, data_len), - 212 => wire__crate__api__api__save_passkey_impl(port, ptr, rust_vec_len, data_len), - 213 => wire__crate__api__api__save_password_impl(port, ptr, rust_vec_len, data_len), - 214 => wire__crate__api__api__save_password_meta_impl(port, ptr, rust_vec_len, data_len), - 215 => wire__crate__api__api__save_user_impl(port, ptr, rust_vec_len, data_len), - 217 => wire__crate__api__api__save_wifi_password_impl(port, ptr, rust_vec_len, data_len), - 218 => { - wire__crate__api__api__select_background_friend_impl(port, ptr, rust_vec_len, data_len) - } - 219 => wire__crate__api__api__select_friend_impl(port, ptr, rust_vec_len, data_len), - 220 => wire__crate__api__api__send_impl(port, ptr, rust_vec_len, data_len), - 221 => wire__crate__api__api__send_2fa_sms_impl(port, ptr, rust_vec_len, data_len), - 222 => wire__crate__api__api__send_2fa_to_devices_impl(port, ptr, rust_vec_len, data_len), - 224 => wire__crate__api__api__service_from_ptr_impl(port, ptr, rust_vec_len, data_len), - 225 => wire__crate__api__api__set_identity_impl(port, ptr, rust_vec_len, data_len), - 226 => wire__crate__api__api__set_profile_impl(port, ptr, rust_vec_len, data_len), - 227 => wire__crate__api__api__set_status_impl(port, ptr, rust_vec_len, data_len), - 228 => wire__crate__api__api__setup_push_impl(port, ptr, rust_vec_len, data_len), - 229 => { - wire__crate__api__api__shared_push_state_restore_impl(port, ptr, rust_vec_len, data_len) - } - 230 => wire__crate__api__api__subscribe_impl(port, ptr, rust_vec_len, data_len), - 232 => wire__crate__api__api__subscribe_token_impl(port, ptr, rust_vec_len, data_len), - 233 => wire__crate__api__api__sync_attachments_impl(port, ptr, rust_vec_len, data_len), - 234 => wire__crate__api__api__sync_chats_impl(port, ptr, rust_vec_len, data_len), - 235 => wire__crate__api__api__sync_messages_impl(port, ptr, rust_vec_len, data_len), - 236 => wire__crate__api__api__sync_now_impl(port, ptr, rust_vec_len, data_len), - 237 => wire__crate__api__api__sync_passwords_impl(port, ptr, rust_vec_len, data_len), - 238 => wire__crate__api__api__sync_wifi_passwords_impl(port, ptr, rust_vec_len, data_len), - 240 => wire__crate__api__api__teardown_2fa_impl(port, ptr, rust_vec_len, data_len), - 241 => { - wire__crate__api__api__transcript_poster_save_impl(port, ptr, rust_vec_len, data_len) - } - 242 => wire__crate__api__api__try_auth_impl(port, ptr, rust_vec_len, data_len), - 243 => wire__crate__api__api__try_icloud_login_impl(port, ptr, rust_vec_len, data_len), - 244 => wire__crate__api__api__unsubscribe_impl(port, ptr, rust_vec_len, data_len), - 245 => { - wire__crate__api__api__update_account_headers_impl(port, ptr, rust_vec_len, data_len) - } - 246 => wire__crate__api__api__update_beacon_name_impl(port, ptr, rust_vec_len, data_len), - 247 => wire__crate__api__api__upload_attachment_impl(port, ptr, rust_vec_len, data_len), - 248 => { - wire__crate__api__api__upload_cloud_attachments_impl(port, ptr, rust_vec_len, data_len) - } - 249 => wire__crate__api__api__upload_group_photo_impl(port, ptr, rust_vec_len, data_len), - 250 => wire__crate__api__api__upload_mmcs_impl(port, ptr, rust_vec_len, data_len), - 251 => wire__crate__api__api__use_link_for_impl(port, ptr, rust_vec_len, data_len), - 253 => wire__crate__api__api__validate_cert_impl(port, ptr, rust_vec_len, data_len), - 254 => wire__crate__api__api__validate_relay_impl(port, ptr, rust_vec_len, data_len), - 255 => wire__crate__api__api__validate_targets_impl(port, ptr, rust_vec_len, data_len), - 256 => { - wire__crate__api__api__validate_targets_facetime_impl(port, ptr, rust_vec_len, data_len) +// Codec=Dco (DartCObject based), see doc to use other codecs +impl flutter_rust_bridge::IntoDart for crate::api::api::CloudSyncProtectedSafeCode { + fn into_dart(self) -> flutter_rust_bridge::for_generated::DartAbi { + match self { + Self::InvalidScope => 0.into_dart(), + Self::InvalidRequest => 1.into_dart(), + Self::InvalidCheckpoint => 2.into_dart(), + Self::CheckpointContextMismatch => 3.into_dart(), + Self::OversizedPage => 4.into_dart(), + Self::OversizedRecord => 5.into_dart(), + Self::ProtectionFailed => 6.into_dart(), + Self::LocalStoreFailed => 7.into_dart(), + Self::FetchDeadline => 8.into_dart(), + Self::Network => 9.into_dart(), + Self::CloudKitThrottled => 10.into_dart(), + Self::CloudKitServer => 11.into_dart(), + Self::CloudKitAuthorization => 12.into_dart(), + Self::CloudKitConflict => 13.into_dart(), + Self::CloudKitResetRequired => 14.into_dart(), + Self::CloudKitPermanent => 15.into_dart(), + Self::CloudKitUnknown => 16.into_dart(), + Self::HttpAuthorization => 17.into_dart(), + Self::HttpTimeout => 18.into_dart(), + Self::HttpThrottled => 19.into_dart(), + Self::HttpServer => 20.into_dart(), + Self::HttpUnknown => 21.into_dart(), + Self::PcsUnavailable => 22.into_dart(), + Self::MalformedResponse => 23.into_dart(), + Self::ContinuationNoProgress => 24.into_dart(), + Self::NativeAuthUnavailable => 25.into_dart(), + Self::Unknown => 26.into_dart(), + _ => unreachable!(), } - 257 => wire__crate__api__api__verify_2fa_impl(port, ptr, rust_vec_len, data_len), - 258 => wire__crate__api__api__verify_2fa_sms_impl(port, ptr, rust_vec_len, data_len), - _ => unreachable!(), } } - -fn pde_ffi_dispatcher_sync_impl( - func_id: i32, - ptr: flutter_rust_bridge::for_generated::PlatformGeneralizedUint8ListPtr, - rust_vec_len: i32, - data_len: i32, -) -> flutter_rust_bridge::for_generated::WireSyncRust2DartSse { - // Codec=Pde (Serialization + dispatch), see doc to use other codecs - match func_id { - 1 => wire__crate__api__api__LocationReport_auto_accessor_get_confidence_impl( - ptr, - rust_vec_len, - data_len, - ), - 2 => wire__crate__api__api__LocationReport_auto_accessor_get_horizontal_accuracy_impl( - ptr, - rust_vec_len, - data_len, - ), - 3 => wire__crate__api__api__LocationReport_auto_accessor_get_key_index_impl( - ptr, - rust_vec_len, - data_len, - ), - 4 => wire__crate__api__api__LocationReport_auto_accessor_get_lat_impl( - ptr, - rust_vec_len, - data_len, - ), - 5 => wire__crate__api__api__LocationReport_auto_accessor_get_long_impl( - ptr, - rust_vec_len, - data_len, - ), - 6 => wire__crate__api__api__LocationReport_auto_accessor_get_status_impl( - ptr, - rust_vec_len, - data_len, - ), - 7 => wire__crate__api__api__LocationReport_auto_accessor_get_timestamp_impl( - ptr, - rust_vec_len, - data_len, - ), - 8 => wire__crate__api__api__LocationReport_auto_accessor_set_confidence_impl( - ptr, - rust_vec_len, - data_len, - ), - 9 => wire__crate__api__api__LocationReport_auto_accessor_set_horizontal_accuracy_impl( - ptr, - rust_vec_len, - data_len, - ), - 10 => wire__crate__api__api__LocationReport_auto_accessor_set_key_index_impl( - ptr, - rust_vec_len, - data_len, - ), - 11 => wire__crate__api__api__LocationReport_auto_accessor_set_lat_impl( - ptr, - rust_vec_len, - data_len, - ), - 12 => wire__crate__api__api__LocationReport_auto_accessor_set_long_impl( - ptr, - rust_vec_len, - data_len, - ), - 13 => wire__crate__api__api__LocationReport_auto_accessor_set_status_impl( - ptr, - rust_vec_len, - data_len, - ), - 14 => wire__crate__api__api__LocationReport_auto_accessor_set_timestamp_impl( - ptr, - rust_vec_len, - data_len, - ), - 15 => wire__crate__api__api__MessageFlags_bits_impl(ptr, rust_vec_len, data_len), - 16 => { - wire__crate__api__api__MessageFlags_from_bits_truncate_impl(ptr, rust_vec_len, data_len) - } - 17 => wire__crate__api__api__SavedHardwareState_auto_accessor_get_identity_impl( - ptr, - rust_vec_len, - data_len, - ), - 18 => wire__crate__api__api__SavedHardwareState_auto_accessor_get_os_config_impl( - ptr, - rust_vec_len, - data_len, - ), - 19 => wire__crate__api__api__SavedHardwareState_auto_accessor_get_push_impl( - ptr, - rust_vec_len, - data_len, - ), - 20 => wire__crate__api__api__SavedHardwareState_auto_accessor_set_identity_impl( - ptr, - rust_vec_len, - data_len, - ), - 21 => wire__crate__api__api__SavedHardwareState_auto_accessor_set_os_config_impl( - ptr, - rust_vec_len, - data_len, - ), - 22 => wire__crate__api__api__SavedHardwareState_auto_accessor_set_push_impl( - ptr, - rust_vec_len, - data_len, - ), - 23 => wire__crate__api__api__ViableBottle_auto_accessor_get_device_name_impl( - ptr, - rust_vec_len, - data_len, - ), - 24 => wire__crate__api__api__ViableBottle_auto_accessor_get_escrow_impl( - ptr, - rust_vec_len, - data_len, - ), - 25 => wire__crate__api__api__ViableBottle_auto_accessor_get_model_class_impl( - ptr, - rust_vec_len, - data_len, - ), - 26 => wire__crate__api__api__ViableBottle_auto_accessor_get_numeric_length_impl( - ptr, - rust_vec_len, - data_len, - ), - 27 => wire__crate__api__api__ViableBottle_auto_accessor_set_device_name_impl( - ptr, - rust_vec_len, - data_len, - ), - 28 => wire__crate__api__api__ViableBottle_auto_accessor_set_escrow_impl( - ptr, - rust_vec_len, - data_len, - ), - 29 => wire__crate__api__api__ViableBottle_auto_accessor_set_model_class_impl( - ptr, - rust_vec_len, - data_len, - ), - 30 => wire__crate__api__api__ViableBottle_auto_accessor_set_numeric_length_impl( - ptr, - rust_vec_len, - data_len, - ), - 37 => wire__crate__api__api__attachment_to_cloud_impl(ptr, rust_vec_len, data_len), - 39 => wire__crate__api__api__build_watcher_impl(ptr, rust_vec_len, data_len), - 41 => wire__crate__api__api__cancel_poll_impl(ptr, rust_vec_len, data_len), - 46 => wire__crate__api__api__clone_poster_impl(ptr, rust_vec_len, data_len), - 47 => wire__crate__api__api__clone_transcript_poster_impl(ptr, rust_vec_len, data_len), - 48 => wire__crate__api__api__close_aps_impl(ptr, rust_vec_len, data_len), - 49 => wire__crate__api__api__close_client_impl(ptr, rust_vec_len, data_len), - 50 => wire__crate__api__api__close_syncmanager_impl(ptr, rust_vec_len, data_len), - 62 => wire__crate__api__api__date_now_impl(ptr, rust_vec_len, data_len), - 63 => wire__crate__api__api__date_to_ms_impl(ptr, rust_vec_len, data_len), - 66 => wire__crate__api__api__decode_attachmentmeta_impl(ptr, rust_vec_len, data_len), - 67 => wire__crate__api__api__decode_chatproto_impl(ptr, rust_vec_len, data_len), - 68 => wire__crate__api__api__decode_extension_app_impl(ptr, rust_vec_len, data_len), - 69 => wire__crate__api__api__decode_identity_impl(ptr, rust_vec_len, data_len), - 70 => wire__crate__api__api__decode_message_info_impl(ptr, rust_vec_len, data_len), - 71 => wire__crate__api__api__decode_messageproto_impl(ptr, rust_vec_len, data_len), - 72 => wire__crate__api__api__decode_messageproto2_impl(ptr, rust_vec_len, data_len), - 73 => wire__crate__api__api__decode_messageproto3_impl(ptr, rust_vec_len, data_len), - 74 => wire__crate__api__api__decode_messageproto4_impl(ptr, rust_vec_len, data_len), - 93 => wire__crate__api__api__dup_daemon_desk_impl(ptr, rust_vec_len, data_len), - 94 => wire__crate__api__api__duplicate_user_impl(ptr, rust_vec_len, data_len), - 95 => wire__crate__api__api__encode_attachmentmeta_impl(ptr, rust_vec_len, data_len), - 96 => wire__crate__api__api__encode_chatproto_impl(ptr, rust_vec_len, data_len), - 97 => wire__crate__api__api__encode_extension_app_impl(ptr, rust_vec_len, data_len), - 99 => wire__crate__api__api__encode_message_info_impl(ptr, rust_vec_len, data_len), - 100 => wire__crate__api__api__encode_messageproto_impl(ptr, rust_vec_len, data_len), - 101 => wire__crate__api__api__encode_messageproto2_impl(ptr, rust_vec_len, data_len), - 102 => wire__crate__api__api__encode_messageproto3_impl(ptr, rust_vec_len, data_len), - 103 => wire__crate__api__api__encode_messageproto4_impl(ptr, rust_vec_len, data_len), - 117 => wire__crate__api__api__get_available_user_impl(ptr, rust_vec_len, data_len), - 140 => wire__crate__api__api__import_watcher_impl(ptr, rust_vec_len, data_len), - 147 => wire__crate__api__api__make_circle_sessions_impl(ptr, rust_vec_len, data_len), - 148 => wire__crate__api__api__make_client_session_impl(ptr, rust_vec_len, data_len), - 149 => wire__crate__api__api__make_cloud_messages_client_impl(ptr, rust_vec_len, data_len), - 157 => wire__crate__api__api__make_keychain_impl(ptr, rust_vec_len, data_len), - 162 => wire__crate__api__api__make_token_provider_impl(ptr, rust_vec_len, data_len), - 164 => wire__crate__api__api__ms_to_date_impl(ptr, rust_vec_len, data_len), - 167 => wire__crate__api__api__new_ngm_identity_impl(ptr, rust_vec_len, data_len), - 168 => wire__crate__api__api__ns_attributed_string_decode_impl(ptr, rust_vec_len, data_len), - 169 => wire__crate__api__api__ns_attributed_string_encode_impl(ptr, rust_vec_len, data_len), - 170 => wire__crate__api__api__ns_null_impl(ptr, rust_vec_len, data_len), - 171 => wire__crate__api__api__ns_number_decode_impl(ptr, rust_vec_len, data_len), - 172 => wire__crate__api__api__ns_number_encode_impl(ptr, rust_vec_len, data_len), - 173 => wire__crate__api__api__ns_string_decode_impl(ptr, rust_vec_len, data_len), - 174 => wire__crate__api__api__ns_string_encode_impl(ptr, rust_vec_len, data_len), - 175 => wire__crate__api__api__nscoder_decode_impl(ptr, rust_vec_len, data_len), - 176 => wire__crate__api__api__nscoder_encode_impl(ptr, rust_vec_len, data_len), - 181 => { - wire__crate__api__api__password_manager_meta_get_data_impl(ptr, rust_vec_len, data_len) +impl flutter_rust_bridge::for_generated::IntoDartExceptPrimitive + for crate::api::api::CloudSyncProtectedSafeCode +{ +} +impl flutter_rust_bridge::IntoIntoDart + for crate::api::api::CloudSyncProtectedSafeCode +{ + fn into_into_dart(self) -> crate::api::api::CloudSyncProtectedSafeCode { + self + } +} +// Codec=Dco (DartCObject based), see doc to use other codecs +impl flutter_rust_bridge::IntoDart for crate::api::api::CloudSyncRawChange { + fn into_dart(self) -> flutter_rust_bridge::for_generated::DartAbi { + [ + self.record_name.into_into_dart().into_dart(), + self.record_type.into_into_dart().into_dart(), + self.change_type.into_into_dart().into_dart(), + self.system_fields.into_into_dart().into_dart(), + self.encrypted_record.into_into_dart().into_dart(), + self.tombstone_payload.into_into_dart().into_dart(), + self.kind.into_into_dart().into_dart(), + ] + .into_dart() + } +} +impl flutter_rust_bridge::for_generated::IntoDartExceptPrimitive + for crate::api::api::CloudSyncRawChange +{ +} +impl flutter_rust_bridge::IntoIntoDart + for crate::api::api::CloudSyncRawChange +{ + fn into_into_dart(self) -> crate::api::api::CloudSyncRawChange { + self + } +} +// Codec=Dco (DartCObject based), see doc to use other codecs +impl flutter_rust_bridge::IntoDart for crate::api::api::CloudSyncRawFailure { + fn into_dart(self) -> flutter_rust_bridge::for_generated::DartAbi { + [ + self.category.into_into_dart().into_dart(), + self.retry_after_seconds.into_into_dart().into_dart(), + self.safe_code.into_into_dart().into_dart(), + ] + .into_dart() + } +} +impl flutter_rust_bridge::for_generated::IntoDartExceptPrimitive + for crate::api::api::CloudSyncRawFailure +{ +} +impl flutter_rust_bridge::IntoIntoDart + for crate::api::api::CloudSyncRawFailure +{ + fn into_into_dart(self) -> crate::api::api::CloudSyncRawFailure { + self + } +} +// Codec=Dco (DartCObject based), see doc to use other codecs +impl flutter_rust_bridge::IntoDart for crate::api::api::CloudSyncRawFailureCategory { + fn into_dart(self) -> flutter_rust_bridge::for_generated::DartAbi { + match self { + Self::Network => 0.into_dart(), + Self::Throttled => 1.into_dart(), + Self::Server => 2.into_dart(), + Self::Authorization => 3.into_dart(), + Self::PcsUnavailable => 4.into_dart(), + Self::MalformedRecord => 5.into_dart(), + Self::Conflict => 6.into_dart(), + Self::LocalStorage => 7.into_dart(), + Self::Unknown => 8.into_dart(), + _ => unreachable!(), } - 182 => wire__crate__api__api__password_manager_meta_get_password_data_impl( - ptr, - rust_vec_len, - data_len, - ), - 183 => wire__crate__api__api__password_manager_totp_generate_otp_impl( - ptr, - rust_vec_len, - data_len, - ), - 187 => wire__crate__api__api__read_hardware_impl(ptr, rust_vec_len, data_len), - 198 => wire__crate__api__api__reset_anisette_impl(ptr, rust_vec_len, data_len), - 203 => wire__crate__api__api__restore_attachment_impl(ptr, rust_vec_len, data_len), - 204 => wire__crate__api__api__restore_cloud_chat_impl(ptr, rust_vec_len, data_len), - 206 => wire__crate__api__api__restore_users_impl(ptr, rust_vec_len, data_len), - 210 => wire__crate__api__api__save_cloud_chat_impl(ptr, rust_vec_len, data_len), - 216 => wire__crate__api__api__save_users_impl(ptr, rust_vec_len, data_len), - 223 => wire__crate__api__api__send_daemon_impl(ptr, rust_vec_len, data_len), - 231 => wire__crate__api__api__subscribe_conn_impl(ptr, rust_vec_len, data_len), - 239 => wire__crate__api__api__systemtime_to_millis_impl(ptr, rust_vec_len, data_len), - 252 => wire__crate__api__api__utm_now_impl(ptr, rust_vec_len, data_len), - _ => unreachable!(), } } - -// Section: rust2dart - +impl flutter_rust_bridge::for_generated::IntoDartExceptPrimitive + for crate::api::api::CloudSyncRawFailureCategory +{ +} +impl flutter_rust_bridge::IntoIntoDart + for crate::api::api::CloudSyncRawFailureCategory +{ + fn into_into_dart(self) -> crate::api::api::CloudSyncRawFailureCategory { + self + } +} // Codec=Dco (DartCObject based), see doc to use other codecs -impl flutter_rust_bridge::IntoDart for FrbWrapper { +impl flutter_rust_bridge::IntoDart for crate::api::api::CloudSyncRawFetchResult { fn into_dart(self) -> flutter_rust_bridge::for_generated::DartAbi { - flutter_rust_bridge::for_generated::rust_auto_opaque_encode::<_, MoiArc<_>>(self.0) - .into_dart() + [ + self.page.into_into_dart().into_dart(), + self.failure.into_into_dart().into_dart(), + ] + .into_dart() } } -impl flutter_rust_bridge::for_generated::IntoDartExceptPrimitive for FrbWrapper {} - -impl flutter_rust_bridge::IntoIntoDart> for APSConnection { - fn into_into_dart(self) -> FrbWrapper { - self.into() +impl flutter_rust_bridge::for_generated::IntoDartExceptPrimitive + for crate::api::api::CloudSyncRawFetchResult +{ +} +impl flutter_rust_bridge::IntoIntoDart + for crate::api::api::CloudSyncRawFetchResult +{ + fn into_into_dart(self) -> crate::api::api::CloudSyncRawFetchResult { + self } } - // Codec=Dco (DartCObject based), see doc to use other codecs -impl flutter_rust_bridge::IntoDart for FrbWrapper { +impl flutter_rust_bridge::IntoDart for crate::api::api::CloudSyncRawPage { fn into_dart(self) -> flutter_rust_bridge::for_generated::DartAbi { - flutter_rust_bridge::for_generated::rust_auto_opaque_encode::<_, MoiArc<_>>(self.0) - .into_dart() + [ + self.changes.into_into_dart().into_dart(), + self.next_token.into_into_dart().into_dart(), + self.status.into_into_dart().into_dart(), + self.complete.into_into_dart().into_dart(), + ] + .into_dart() } } -impl flutter_rust_bridge::for_generated::IntoDartExceptPrimitive for FrbWrapper {} - -impl flutter_rust_bridge::IntoIntoDart> for APSState { - fn into_into_dart(self) -> FrbWrapper { - self.into() +impl flutter_rust_bridge::for_generated::IntoDartExceptPrimitive + for crate::api::api::CloudSyncRawPage +{ +} +impl flutter_rust_bridge::IntoIntoDart + for crate::api::api::CloudSyncRawPage +{ + fn into_into_dart(self) -> crate::api::api::CloudSyncRawPage { + self } } - // Codec=Dco (DartCObject based), see doc to use other codecs -impl flutter_rust_bridge::IntoDart for FrbWrapper { +impl flutter_rust_bridge::IntoDart for crate::api::api::CloudSyncRawRecordKind { fn into_dart(self) -> flutter_rust_bridge::for_generated::DartAbi { - flutter_rust_bridge::for_generated::rust_auto_opaque_encode::<_, MoiArc<_>>(self.0) - .into_dart() + match self { + Self::EncryptedUpsert => 0.into_dart(), + Self::Tombstone => 1.into_dart(), + Self::UnsupportedRecordType => 2.into_dart(), + Self::MalformedMetadata => 3.into_dart(), + _ => unreachable!(), + } } } -impl flutter_rust_bridge::for_generated::IntoDartExceptPrimitive for FrbWrapper {} - -impl flutter_rust_bridge::IntoIntoDart> for APSWatcher { - fn into_into_dart(self) -> FrbWrapper { - self.into() +impl flutter_rust_bridge::for_generated::IntoDartExceptPrimitive + for crate::api::api::CloudSyncRawRecordKind +{ +} +impl flutter_rust_bridge::IntoIntoDart + for crate::api::api::CloudSyncRawRecordKind +{ + fn into_into_dart(self) -> crate::api::api::CloudSyncRawRecordKind { + self } } - // Codec=Dco (DartCObject based), see doc to use other codecs -impl flutter_rust_bridge::IntoDart for FrbWrapper> { +impl flutter_rust_bridge::IntoDart for crate::api::api::CloudSyncRawSystemFields { fn into_dart(self) -> flutter_rust_bridge::for_generated::DartAbi { - flutter_rust_bridge::for_generated::rust_auto_opaque_encode::<_, MoiArc<_>>(self.0) - .into_dart() + [ + self.etag.into_into_dart().into_dart(), + self.created_at.into_into_dart().into_dart(), + self.modified_at.into_into_dart().into_dart(), + self.permission.into_into_dart().into_dart(), + ] + .into_dart() } } impl flutter_rust_bridge::for_generated::IntoDartExceptPrimitive - for FrbWrapper> + for crate::api::api::CloudSyncRawSystemFields { } - -impl flutter_rust_bridge::IntoIntoDart>> - for ArcAnisetteClient +impl flutter_rust_bridge::IntoIntoDart + for crate::api::api::CloudSyncRawSystemFields { - fn into_into_dart(self) -> FrbWrapper> { - self.into() + fn into_into_dart(self) -> crate::api::api::CloudSyncRawSystemFields { + self } } - // Codec=Dco (DartCObject based), see doc to use other codecs -impl flutter_rust_bridge::IntoDart for FrbWrapper>> { +impl flutter_rust_bridge::IntoDart for crate::api::api::CloudSyncTransientAssociationKind { fn into_dart(self) -> flutter_rust_bridge::for_generated::DartAbi { - flutter_rust_bridge::for_generated::rust_auto_opaque_encode::<_, MoiArc<_>>(self.0) - .into_dart() + match self { + Self::None => 0.into_dart(), + Self::Sticker => 1.into_dart(), + Self::ReactionAdd => 2.into_dart(), + Self::ReactionRemove => 3.into_dart(), + _ => unreachable!(), + } } } impl flutter_rust_bridge::for_generated::IntoDartExceptPrimitive - for FrbWrapper>> + for crate::api::api::CloudSyncTransientAssociationKind { } - -impl flutter_rust_bridge::IntoIntoDart>>> - for Arc> +impl flutter_rust_bridge::IntoIntoDart + for crate::api::api::CloudSyncTransientAssociationKind { - fn into_into_dart(self) -> FrbWrapper>> { - self.into() + fn into_into_dart(self) -> crate::api::api::CloudSyncTransientAssociationKind { + self } } - // Codec=Dco (DartCObject based), see doc to use other codecs -impl flutter_rust_bridge::IntoDart - for FrbWrapper>> +impl flutter_rust_bridge::IntoDart for crate::api::api::CloudSyncTransientAttachmentPayload { + fn into_dart(self) -> flutter_rust_bridge::for_generated::DartAbi { + [ + self.logical_entity_key_hash.into_into_dart().into_dart(), + self.canonical_guid.into_into_dart().into_dart(), + self.owner_logical_key_hash.into_into_dart().into_dart(), + self.owner_canonical_guid.into_into_dart().into_dart(), + self.owner_part.into_into_dart().into_dart(), + self.uti_state.into_into_dart().into_dart(), + self.uti.into_into_dart().into_dart(), + self.file_name_state.into_into_dart().into_dart(), + self.file_name.into_into_dart().into_dart(), + self.mime_type_state.into_into_dart().into_dart(), + self.mime_type.into_into_dart().into_dart(), + self.total_bytes_state.into_into_dart().into_dart(), + self.total_bytes.into_into_dart().into_dart(), + self.is_outgoing_state.into_into_dart().into_dart(), + self.is_outgoing.into_into_dart().into_dart(), + self.protected_local_reference_state + .into_into_dart() + .into_dart(), + self.protected_local_reference.into_into_dart().into_dart(), + ] + .into_dart() + } +} +impl flutter_rust_bridge::for_generated::IntoDartExceptPrimitive + for crate::api::api::CloudSyncTransientAttachmentPayload { +} +impl flutter_rust_bridge::IntoIntoDart + for crate::api::api::CloudSyncTransientAttachmentPayload +{ + fn into_into_dart(self) -> crate::api::api::CloudSyncTransientAttachmentPayload { + self + } +} +// Codec=Dco (DartCObject based), see doc to use other codecs +impl flutter_rust_bridge::IntoDart for crate::api::api::CloudSyncTransientAttributedBody { fn into_dart(self) -> flutter_rust_bridge::for_generated::DartAbi { - flutter_rust_bridge::for_generated::rust_auto_opaque_encode::<_, MoiArc<_>>(self.0) - .into_dart() + [ + self.text.into_into_dart().into_dart(), + self.runs.into_into_dart().into_dart(), + ] + .into_dart() } } impl flutter_rust_bridge::for_generated::IntoDartExceptPrimitive - for FrbWrapper>> + for crate::api::api::CloudSyncTransientAttributedBody { } - -impl - flutter_rust_bridge::IntoIntoDart>>> - for Arc> +impl flutter_rust_bridge::IntoIntoDart + for crate::api::api::CloudSyncTransientAttributedBody { - fn into_into_dart(self) -> FrbWrapper>> { - self.into() + fn into_into_dart(self) -> crate::api::api::CloudSyncTransientAttributedBody { + self } } - // Codec=Dco (DartCObject based), see doc to use other codecs -impl flutter_rust_bridge::IntoDart for FrbWrapper> { +impl flutter_rust_bridge::IntoDart for crate::api::api::CloudSyncTransientChatPayload { fn into_dart(self) -> flutter_rust_bridge::for_generated::DartAbi { - flutter_rust_bridge::for_generated::rust_auto_opaque_encode::<_, MoiArc<_>>(self.0) - .into_dart() + [ + self.logical_entity_key_hash.into_into_dart().into_dart(), + self.canonical_guid.into_into_dart().into_dart(), + self.chat_identifier.into_into_dart().into_dart(), + self.group_id.into_into_dart().into_dart(), + self.original_group_id.into_into_dart().into_dart(), + self.service.into_into_dart().into_dart(), + self.style.into_into_dart().into_dart(), + self.participant_handles.into_into_dart().into_dart(), + self.display_name_state.into_into_dart().into_dart(), + self.display_name.into_into_dart().into_dart(), + self.last_addressed_handle_state + .into_into_dart() + .into_dart(), + self.last_addressed_handle.into_into_dart().into_dart(), + self.group_version_state.into_into_dart().into_dart(), + self.group_version.into_into_dart().into_dart(), + self.last_seen_message_guid_state + .into_into_dart() + .into_dart(), + self.last_seen_message_guid.into_into_dart().into_dart(), + self.group_photo_guid_state.into_into_dart().into_dart(), + self.group_photo_guid.into_into_dart().into_dart(), + ] + .into_dart() } } -impl flutter_rust_bridge::for_generated::IntoDartExceptPrimitive for FrbWrapper> {} - -impl flutter_rust_bridge::IntoIntoDart>> for Arc { - fn into_into_dart(self) -> FrbWrapper> { - self.into() +impl flutter_rust_bridge::for_generated::IntoDartExceptPrimitive + for crate::api::api::CloudSyncTransientChatPayload +{ +} +impl flutter_rust_bridge::IntoIntoDart + for crate::api::api::CloudSyncTransientChatPayload +{ + fn into_into_dart(self) -> crate::api::api::CloudSyncTransientChatPayload { + self } } - // Codec=Dco (DartCObject based), see doc to use other codecs -impl flutter_rust_bridge::IntoDart for FrbWrapper>> { +impl flutter_rust_bridge::IntoDart for crate::api::api::CloudSyncTransientChatStyle { fn into_dart(self) -> flutter_rust_bridge::for_generated::DartAbi { - flutter_rust_bridge::for_generated::rust_auto_opaque_encode::<_, MoiArc<_>>(self.0) - .into_dart() + match self { + Self::Direct => 0.into_dart(), + Self::Group => 1.into_dart(), + _ => unreachable!(), + } } } impl flutter_rust_bridge::for_generated::IntoDartExceptPrimitive - for FrbWrapper>> + for crate::api::api::CloudSyncTransientChatStyle { } - -impl flutter_rust_bridge::IntoIntoDart>>> - for Arc> +impl flutter_rust_bridge::IntoIntoDart + for crate::api::api::CloudSyncTransientChatStyle { - fn into_into_dart(self) -> FrbWrapper>> { - self.into() + fn into_into_dart(self) -> crate::api::api::CloudSyncTransientChatStyle { + self } } - // Codec=Dco (DartCObject based), see doc to use other codecs -impl flutter_rust_bridge::IntoDart for FrbWrapper> { +impl flutter_rust_bridge::IntoDart for crate::api::api::CloudSyncTransientDecodeResult { fn into_dart(self) -> flutter_rust_bridge::for_generated::DartAbi { - flutter_rust_bridge::for_generated::rust_auto_opaque_encode::<_, MoiArc<_>>(self.0) - .into_dart() + [ + self.protected_source_reference.into_into_dart().into_dart(), + self.generation.into_into_dart().into_dart(), + self.change_id.into_into_dart().into_dart(), + self.entity_kind.into_into_dart().into_dart(), + self.mutation_kind.into_into_dart().into_dart(), + self.snapshot.into_into_dart().into_dart(), + self.payload.into_into_dart().into_dart(), + self.tombstone.into_into_dart().into_dart(), + self.deferred_reason.into_into_dart().into_dart(), + self.quarantine_reason.into_into_dart().into_dart(), + self.failure_code.into_into_dart().into_dart(), + ] + .into_dart() } } -impl flutter_rust_bridge::for_generated::IntoDartExceptPrimitive for FrbWrapper> {} - -impl flutter_rust_bridge::IntoIntoDart>> for Arc { - fn into_into_dart(self) -> FrbWrapper> { - self.into() +impl flutter_rust_bridge::for_generated::IntoDartExceptPrimitive + for crate::api::api::CloudSyncTransientDecodeResult +{ +} +impl flutter_rust_bridge::IntoIntoDart + for crate::api::api::CloudSyncTransientDecodeResult +{ + fn into_into_dart(self) -> crate::api::api::CloudSyncTransientDecodeResult { + self } } - // Codec=Dco (DartCObject based), see doc to use other codecs -impl flutter_rust_bridge::IntoDart for FrbWrapper> { +impl flutter_rust_bridge::IntoDart for crate::api::api::CloudSyncTransientDeferredReason { fn into_dart(self) -> flutter_rust_bridge::for_generated::DartAbi { - flutter_rust_bridge::for_generated::rust_auto_opaque_encode::<_, MoiArc<_>>(self.0) - .into_dart() + match self { + Self::NestedPresenceUnavailable => 0.into_dart(), + Self::UnprovenEditTimestamp => 1.into_dart(), + Self::UnsupportedExtensionPayload => 2.into_dart(), + Self::UnsupportedMediaCredentials => 3.into_dart(), + Self::UnsupportedGroupPhoto => 4.into_dart(), + Self::UnsupportedSticker => 5.into_dart(), + Self::UnsupportedScheduling => 6.into_dart(), + Self::UnsupportedOffGridMetadata => 7.into_dart(), + Self::UnsupportedNegativeAttachmentSize => 8.into_dart(), + _ => unreachable!(), + } } } impl flutter_rust_bridge::for_generated::IntoDartExceptPrimitive - for FrbWrapper> + for crate::api::api::CloudSyncTransientDeferredReason { } - -impl flutter_rust_bridge::IntoIntoDart>> - for Arc +impl flutter_rust_bridge::IntoIntoDart + for crate::api::api::CloudSyncTransientDeferredReason { - fn into_into_dart(self) -> FrbWrapper> { - self.into() + fn into_into_dart(self) -> crate::api::api::CloudSyncTransientDeferredReason { + self } } - // Codec=Dco (DartCObject based), see doc to use other codecs -impl flutter_rust_bridge::IntoDart for FrbWrapper>> { +impl flutter_rust_bridge::IntoDart for crate::api::api::CloudSyncTransientEditPart { fn into_dart(self) -> flutter_rust_bridge::for_generated::DartAbi { - flutter_rust_bridge::for_generated::rust_auto_opaque_encode::<_, MoiArc<_>>(self.0) - .into_dart() + [ + self.part_key_hash.into_into_dart().into_dart(), + self.revision.into_into_dart().into_dart(), + self.content_digest.into_into_dart().into_dart(), + self.modified_at_millis.into_into_dart().into_dart(), + ] + .into_dart() } } impl flutter_rust_bridge::for_generated::IntoDartExceptPrimitive - for FrbWrapper>> + for crate::api::api::CloudSyncTransientEditPart { } - -impl flutter_rust_bridge::IntoIntoDart>>> - for Arc> +impl flutter_rust_bridge::IntoIntoDart + for crate::api::api::CloudSyncTransientEditPart { - fn into_into_dart(self) -> FrbWrapper>> { - self.into() + fn into_into_dart(self) -> crate::api::api::CloudSyncTransientEditPart { + self } } - // Codec=Dco (DartCObject based), see doc to use other codecs -impl flutter_rust_bridge::IntoDart - for FrbWrapper>>> +impl flutter_rust_bridge::IntoDart for crate::api::api::CloudSyncTransientEntityKind { + fn into_dart(self) -> flutter_rust_bridge::for_generated::DartAbi { + match self { + Self::Chat => 0.into_dart(), + Self::Message => 1.into_dart(), + Self::Reaction => 2.into_dart(), + Self::Attachment => 3.into_dart(), + Self::GroupPhoto => 4.into_dart(), + _ => unreachable!(), + } + } +} +impl flutter_rust_bridge::for_generated::IntoDartExceptPrimitive + for crate::api::api::CloudSyncTransientEntityKind +{ +} +impl flutter_rust_bridge::IntoIntoDart + for crate::api::api::CloudSyncTransientEntityKind +{ + fn into_into_dart(self) -> crate::api::api::CloudSyncTransientEntityKind { + self + } +} +// Codec=Dco (DartCObject based), see doc to use other codecs +impl flutter_rust_bridge::IntoDart for crate::api::api::CloudSyncTransientFailureCode { + fn into_dart(self) -> flutter_rust_bridge::for_generated::DartAbi { + match self { + Self::InvalidRequest => 0.into_dart(), + Self::ActiveAccountMismatch => 1.into_dart(), + Self::ScopeMismatch => 2.into_dart(), + Self::GenerationMismatch => 3.into_dart(), + Self::StoreIdentityMismatch => 4.into_dart(), + Self::ProtectedReferenceMismatch => 5.into_dart(), + Self::MalformedRecord => 6.into_dart(), + Self::OversizedRecord => 7.into_dart(), + Self::PcsUnavailable => 8.into_dart(), + Self::RetryableUpstream => 9.into_dart(), + Self::DecoderFailure => 10.into_dart(), + _ => unreachable!(), + } + } +} +impl flutter_rust_bridge::for_generated::IntoDartExceptPrimitive + for crate::api::api::CloudSyncTransientFailureCode { +} +impl flutter_rust_bridge::IntoIntoDart + for crate::api::api::CloudSyncTransientFailureCode +{ + fn into_into_dart(self) -> crate::api::api::CloudSyncTransientFailureCode { + self + } +} +// Codec=Dco (DartCObject based), see doc to use other codecs +impl flutter_rust_bridge::IntoDart for crate::api::api::CloudSyncTransientFieldState { fn into_dart(self) -> flutter_rust_bridge::for_generated::DartAbi { - flutter_rust_bridge::for_generated::rust_auto_opaque_encode::<_, MoiArc<_>>(self.0) - .into_dart() + match self { + Self::Absent => 0.into_dart(), + Self::Value => 1.into_dart(), + Self::ExplicitClear => 2.into_dart(), + _ => unreachable!(), + } } } impl flutter_rust_bridge::for_generated::IntoDartExceptPrimitive - for FrbWrapper>>> + for crate::api::api::CloudSyncTransientFieldState { } - -impl - flutter_rust_bridge::IntoIntoDart>>>> - for Arc>> +impl flutter_rust_bridge::IntoIntoDart + for crate::api::api::CloudSyncTransientFieldState { - fn into_into_dart(self) -> FrbWrapper>>> { - self.into() + fn into_into_dart(self) -> crate::api::api::CloudSyncTransientFieldState { + self } } - // Codec=Dco (DartCObject based), see doc to use other codecs -impl flutter_rust_bridge::IntoDart - for FrbWrapper>>>> +impl flutter_rust_bridge::IntoDart for crate::api::api::CloudSyncTransientGroupPhotoPayload { + fn into_dart(self) -> flutter_rust_bridge::for_generated::DartAbi { + [ + self.logical_entity_key_hash.into_into_dart().into_dart(), + self.owner_logical_key_hash.into_into_dart().into_dart(), + self.photo_guid.into_into_dart().into_dart(), + self.protected_local_reference.into_into_dart().into_dart(), + ] + .into_dart() + } +} +impl flutter_rust_bridge::for_generated::IntoDartExceptPrimitive + for crate::api::api::CloudSyncTransientGroupPhotoPayload +{ +} +impl flutter_rust_bridge::IntoIntoDart + for crate::api::api::CloudSyncTransientGroupPhotoPayload { + fn into_into_dart(self) -> crate::api::api::CloudSyncTransientGroupPhotoPayload { + self + } +} +// Codec=Dco (DartCObject based), see doc to use other codecs +impl flutter_rust_bridge::IntoDart for crate::api::api::CloudSyncTransientKnownMessageFlags { fn into_dart(self) -> flutter_rust_bridge::for_generated::DartAbi { - flutter_rust_bridge::for_generated::rust_auto_opaque_encode::<_, MoiArc<_>>(self.0) - .into_dart() + [ + self.from_me.into_into_dart().into_dart(), + self.delivered.into_into_dart().into_dart(), + self.read.into_into_dart().into_dart(), + self.has_data_detector_results.into_into_dart().into_dart(), + self.delivered_quietly.into_into_dart().into_dart(), + self.did_notify_recipient.into_into_dart().into_dart(), + ] + .into_dart() } } impl flutter_rust_bridge::for_generated::IntoDartExceptPrimitive - for FrbWrapper>>>> + for crate::api::api::CloudSyncTransientKnownMessageFlags { } - -impl - flutter_rust_bridge::IntoIntoDart< - FrbWrapper>>>>, - > for Arc>>> +impl flutter_rust_bridge::IntoIntoDart + for crate::api::api::CloudSyncTransientKnownMessageFlags { - fn into_into_dart( - self, - ) -> FrbWrapper>>>> { - self.into() + fn into_into_dart(self) -> crate::api::api::CloudSyncTransientKnownMessageFlags { + self } } - // Codec=Dco (DartCObject based), see doc to use other codecs -impl flutter_rust_bridge::IntoDart for FrbWrapper>>> { +impl flutter_rust_bridge::IntoDart for crate::api::api::CloudSyncTransientMessageEdit { fn into_dart(self) -> flutter_rust_bridge::for_generated::DartAbi { - flutter_rust_bridge::for_generated::rust_auto_opaque_encode::<_, MoiArc<_>>(self.0) - .into_dart() + [ + self.part.into_into_dart().into_dart(), + self.revision.into_into_dart().into_dart(), + self.bodies.into_into_dart().into_dart(), + self.modified_at_millis.into_into_dart().into_dart(), + self.original_range_location.into_into_dart().into_dart(), + self.original_range_length.into_into_dart().into_dart(), + ] + .into_dart() } } impl flutter_rust_bridge::for_generated::IntoDartExceptPrimitive - for FrbWrapper>>> + for crate::api::api::CloudSyncTransientMessageEdit { } - -impl flutter_rust_bridge::IntoIntoDart>>>> - for Arc>> +impl flutter_rust_bridge::IntoIntoDart + for crate::api::api::CloudSyncTransientMessageEdit { - fn into_into_dart(self) -> FrbWrapper>>> { - self.into() + fn into_into_dart(self) -> crate::api::api::CloudSyncTransientMessageEdit { + self } } - // Codec=Dco (DartCObject based), see doc to use other codecs -impl flutter_rust_bridge::IntoDart for FrbWrapper>> { +impl flutter_rust_bridge::IntoDart for crate::api::api::CloudSyncTransientMessagePayload { fn into_dart(self) -> flutter_rust_bridge::for_generated::DartAbi { - flutter_rust_bridge::for_generated::rust_auto_opaque_encode::<_, MoiArc<_>>(self.0) - .into_dart() + [ + self.logical_entity_key_hash.into_into_dart().into_dart(), + self.canonical_guid.into_into_dart().into_dart(), + self.chat_alias_key_hash.into_into_dart().into_dart(), + self.chat_identifier.into_into_dart().into_dart(), + self.sender_handle.into_into_dart().into_dart(), + self.created_at_millis.into_into_dart().into_dart(), + self.error.into_into_dart().into_dart(), + self.service.into_into_dart().into_dart(), + self.subject_state.into_into_dart().into_dart(), + self.subject.into_into_dart().into_dart(), + self.body_state.into_into_dart().into_dart(), + self.body.into_into_dart().into_dart(), + self.attributed_bodies_state.into_into_dart().into_dart(), + self.attributed_bodies.into_into_dart().into_dart(), + self.balloon_bundle_id_state.into_into_dart().into_dart(), + self.balloon_bundle_id.into_into_dart().into_dart(), + self.effect_state.into_into_dart().into_dart(), + self.effect.into_into_dart().into_dart(), + self.read_at_millis_state.into_into_dart().into_dart(), + self.read_at_millis.into_into_dart().into_dart(), + self.delivered_at_millis_state.into_into_dart().into_dart(), + self.delivered_at_millis.into_into_dart().into_dart(), + self.known_flags.into_into_dart().into_dart(), + self.association_kind.into_into_dart().into_dart(), + self.reaction_kind.into_into_dart().into_dart(), + self.reaction_removed.into_into_dart().into_dart(), + self.reaction_parent_logical_key_hash + .into_into_dart() + .into_dart(), + self.reaction_parent_canonical_guid + .into_into_dart() + .into_dart(), + self.reaction_parent_part.into_into_dart().into_dart(), + self.associated_range_location.into_into_dart().into_dart(), + self.associated_range_length.into_into_dart().into_dart(), + self.reply_parent_logical_key_hash + .into_into_dart() + .into_dart(), + self.reply_parent_canonical_guid + .into_into_dart() + .into_dart(), + self.reply_parent_part.into_into_dart().into_dart(), + self.edits_state.into_into_dart().into_dart(), + self.edits.into_into_dart().into_dart(), + self.retracted_parts_state.into_into_dart().into_dart(), + self.retracted_parts.into_into_dart().into_dart(), + self.associated_emoji_state.into_into_dart().into_dart(), + self.associated_emoji.into_into_dart().into_dart(), + ] + .into_dart() } } impl flutter_rust_bridge::for_generated::IntoDartExceptPrimitive - for FrbWrapper>> + for crate::api::api::CloudSyncTransientMessagePayload { } - -impl flutter_rust_bridge::IntoIntoDart>>> - for Arc> +impl flutter_rust_bridge::IntoIntoDart + for crate::api::api::CloudSyncTransientMessagePayload { - fn into_into_dart(self) -> FrbWrapper>> { - self.into() + fn into_into_dart(self) -> crate::api::api::CloudSyncTransientMessagePayload { + self } } - // Codec=Dco (DartCObject based), see doc to use other codecs -impl flutter_rust_bridge::IntoDart for FrbWrapper>> { +impl flutter_rust_bridge::IntoDart for crate::api::api::CloudSyncTransientMutationKind { fn into_dart(self) -> flutter_rust_bridge::for_generated::DartAbi { - flutter_rust_bridge::for_generated::rust_auto_opaque_encode::<_, MoiArc<_>>(self.0) - .into_dart() + match self { + Self::Upsert => 0.into_dart(), + Self::Tombstone => 1.into_dart(), + _ => unreachable!(), + } } } impl flutter_rust_bridge::for_generated::IntoDartExceptPrimitive - for FrbWrapper>> + for crate::api::api::CloudSyncTransientMutationKind { } - -impl flutter_rust_bridge::IntoIntoDart>>> - for Arc> +impl flutter_rust_bridge::IntoIntoDart + for crate::api::api::CloudSyncTransientMutationKind { - fn into_into_dart(self) -> FrbWrapper>> { - self.into() + fn into_into_dart(self) -> crate::api::api::CloudSyncTransientMutationKind { + self } } - // Codec=Dco (DartCObject based), see doc to use other codecs -impl flutter_rust_bridge::IntoDart for FrbWrapper>> { +impl flutter_rust_bridge::IntoDart for crate::api::api::CloudSyncTransientPayload { fn into_dart(self) -> flutter_rust_bridge::for_generated::DartAbi { - flutter_rust_bridge::for_generated::rust_auto_opaque_encode::<_, MoiArc<_>>(self.0) - .into_dart() + [ + self.chat.into_into_dart().into_dart(), + self.message.into_into_dart().into_dart(), + self.attachment.into_into_dart().into_dart(), + self.group_photo.into_into_dart().into_dart(), + ] + .into_dart() } } impl flutter_rust_bridge::for_generated::IntoDartExceptPrimitive - for FrbWrapper>> + for crate::api::api::CloudSyncTransientPayload { } - -impl flutter_rust_bridge::IntoIntoDart>>> - for Arc> +impl flutter_rust_bridge::IntoIntoDart + for crate::api::api::CloudSyncTransientPayload { - fn into_into_dart(self) -> FrbWrapper>> { - self.into() + fn into_into_dart(self) -> crate::api::api::CloudSyncTransientPayload { + self } } - // Codec=Dco (DartCObject based), see doc to use other codecs -impl flutter_rust_bridge::IntoDart for FrbWrapper> { +impl flutter_rust_bridge::IntoDart for crate::api::api::CloudSyncTransientQuarantineReason { fn into_dart(self) -> flutter_rust_bridge::for_generated::DartAbi { - flutter_rust_bridge::for_generated::rust_auto_opaque_encode::<_, MoiArc<_>>(self.0) - .into_dart() + match self { + Self::MalformedRequiredIdentity => 0.into_dart(), + Self::FieldPresenceMismatch => 1.into_dart(), + Self::UnsupportedService => 2.into_dart(), + Self::UnsupportedChatStyle => 3.into_dart(), + Self::UnsupportedMessageType => 4.into_dart(), + Self::UnsupportedAssociationType => 5.into_dart(), + Self::MalformedParent => 6.into_dart(), + Self::AmbiguousReply => 7.into_dart(), + Self::MalformedAttributedBody => 8.into_dart(), + Self::MalformedMessageSummary => 9.into_dart(), + Self::ConflictingEditAndRetraction => 10.into_dart(), + Self::OversizedContent => 11.into_dart(), + Self::InvalidCanonicalPayload => 12.into_dart(), + Self::MalformedRecord => 13.into_dart(), + _ => unreachable!(), + } } } impl flutter_rust_bridge::for_generated::IntoDartExceptPrimitive - for FrbWrapper> + for crate::api::api::CloudSyncTransientQuarantineReason { } - -impl flutter_rust_bridge::IntoIntoDart>> for Arc { - fn into_into_dart(self) -> FrbWrapper> { - self.into() +impl flutter_rust_bridge::IntoIntoDart + for crate::api::api::CloudSyncTransientQuarantineReason +{ + fn into_into_dart(self) -> crate::api::api::CloudSyncTransientQuarantineReason { + self } } - // Codec=Dco (DartCObject based), see doc to use other codecs -impl flutter_rust_bridge::IntoDart for FrbWrapper>> { +impl flutter_rust_bridge::IntoDart for crate::api::api::CloudSyncTransientReactionKind { fn into_dart(self) -> flutter_rust_bridge::for_generated::DartAbi { - flutter_rust_bridge::for_generated::rust_auto_opaque_encode::<_, MoiArc<_>>(self.0) - .into_dart() + match self { + Self::Heart => 0.into_dart(), + Self::Like => 1.into_dart(), + Self::Dislike => 2.into_dart(), + Self::Laugh => 3.into_dart(), + Self::Emphasize => 4.into_dart(), + Self::Question => 5.into_dart(), + Self::Emoji => 6.into_dart(), + Self::StickerBack => 7.into_dart(), + _ => unreachable!(), + } } } impl flutter_rust_bridge::for_generated::IntoDartExceptPrimitive - for FrbWrapper>> + for crate::api::api::CloudSyncTransientReactionKind { } - -impl flutter_rust_bridge::IntoIntoDart>>> - for Arc> +impl flutter_rust_bridge::IntoIntoDart + for crate::api::api::CloudSyncTransientReactionKind { - fn into_into_dart(self) -> FrbWrapper>> { - self.into() + fn into_into_dart(self) -> crate::api::api::CloudSyncTransientReactionKind { + self } } - // Codec=Dco (DartCObject based), see doc to use other codecs -impl flutter_rust_bridge::IntoDart for FrbWrapper>> { +impl flutter_rust_bridge::IntoDart for crate::api::api::CloudSyncTransientService { fn into_dart(self) -> flutter_rust_bridge::for_generated::DartAbi { - flutter_rust_bridge::for_generated::rust_auto_opaque_encode::<_, MoiArc<_>>(self.0) - .into_dart() + match self { + Self::IMessage => 0.into_dart(), + _ => unreachable!(), + } } } impl flutter_rust_bridge::for_generated::IntoDartExceptPrimitive - for FrbWrapper>> + for crate::api::api::CloudSyncTransientService { } - -impl flutter_rust_bridge::IntoIntoDart>>> - for Arc> +impl flutter_rust_bridge::IntoIntoDart + for crate::api::api::CloudSyncTransientService { - fn into_into_dart(self) -> FrbWrapper>> { - self.into() + fn into_into_dart(self) -> crate::api::api::CloudSyncTransientService { + self } } - // Codec=Dco (DartCObject based), see doc to use other codecs -impl flutter_rust_bridge::IntoDart for FrbWrapper { +impl flutter_rust_bridge::IntoDart for crate::api::api::CloudSyncTransientSnapshot { fn into_dart(self) -> flutter_rust_bridge::for_generated::DartAbi { - flutter_rust_bridge::for_generated::rust_auto_opaque_encode::<_, MoiArc<_>>(self.0) - .into_dart() + [ + self.entity_kind.into_into_dart().into_dart(), + self.logical_entity_key_hash.into_into_dart().into_dart(), + self.parent_logical_key_hash.into_into_dart().into_dart(), + self.immutable_content_digest.into_into_dart().into_dart(), + self.created_at_millis.into_into_dart().into_dart(), + self.read_at_millis.into_into_dart().into_dart(), + self.delivered_at_millis.into_into_dart().into_dart(), + self.edit_parts.into_into_dart().into_dart(), + self.retracted_at_millis.into_into_dart().into_dart(), + self.group_version.into_into_dart().into_dart(), + self.group_metadata_digest.into_into_dart().into_dart(), + self.etag_hash.into_into_dart().into_dart(), + self.protected_source_reference.into_into_dart().into_dart(), + ] + .into_dart() } } -impl flutter_rust_bridge::for_generated::IntoDartExceptPrimitive for FrbWrapper {} - -impl flutter_rust_bridge::IntoIntoDart> for Asset { - fn into_into_dart(self) -> FrbWrapper { +impl flutter_rust_bridge::for_generated::IntoDartExceptPrimitive + for crate::api::api::CloudSyncTransientSnapshot +{ +} +impl flutter_rust_bridge::IntoIntoDart + for crate::api::api::CloudSyncTransientSnapshot +{ + fn into_into_dart(self) -> crate::api::api::CloudSyncTransientSnapshot { + self + } +} +// Codec=Dco (DartCObject based), see doc to use other codecs +impl flutter_rust_bridge::IntoDart for crate::api::api::CloudSyncTransientTextRun { + fn into_dart(self) -> flutter_rust_bridge::for_generated::DartAbi { + [ + self.start_utf16.into_into_dart().into_dart(), + self.length_utf16.into_into_dart().into_dart(), + self.message_part.into_into_dart().into_dart(), + self.attachment_canonical_guid.into_into_dart().into_dart(), + self.attachment_logical_key_hash + .into_into_dart() + .into_dart(), + self.mention_handle.into_into_dart().into_dart(), + self.audio_transcript.into_into_dart().into_dart(), + self.text_effect.into_into_dart().into_dart(), + self.bold.into_into_dart().into_dart(), + self.italic.into_into_dart().into_dart(), + self.strikethrough.into_into_dart().into_dart(), + self.underline.into_into_dart().into_dart(), + ] + .into_dart() + } +} +impl flutter_rust_bridge::for_generated::IntoDartExceptPrimitive + for crate::api::api::CloudSyncTransientTextRun +{ +} +impl flutter_rust_bridge::IntoIntoDart + for crate::api::api::CloudSyncTransientTextRun +{ + fn into_into_dart(self) -> crate::api::api::CloudSyncTransientTextRun { + self + } +} +// Codec=Dco (DartCObject based), see doc to use other codecs +impl flutter_rust_bridge::IntoDart for crate::api::api::CloudSyncTransientTombstone { + fn into_dart(self) -> flutter_rust_bridge::for_generated::DartAbi { + [ + self.entity_kind.into_into_dart().into_dart(), + self.logical_entity_key_hash.into_into_dart().into_dart(), + self.deleted_at_millis.into_into_dart().into_dart(), + self.server_confirmed.into_into_dart().into_dart(), + ] + .into_dart() + } +} +impl flutter_rust_bridge::for_generated::IntoDartExceptPrimitive + for crate::api::api::CloudSyncTransientTombstone +{ +} +impl flutter_rust_bridge::IntoIntoDart + for crate::api::api::CloudSyncTransientTombstone +{ + fn into_into_dart(self) -> crate::api::api::CloudSyncTransientTombstone { + self + } +} +// Codec=Dco (DartCObject based), see doc to use other codecs +impl flutter_rust_bridge::IntoDart for FrbWrapper { + fn into_dart(self) -> flutter_rust_bridge::for_generated::DartAbi { + [ + self.0.participants.into_into_dart().into_dart(), + self.0.cv_name.into_into_dart().into_dart(), + self.0.sender_guid.into_into_dart().into_dart(), + self.0.after_guid.into_into_dart().into_dart(), + ] + .into_dart() + } +} +impl flutter_rust_bridge::for_generated::IntoDartExceptPrimitive + for FrbWrapper +{ +} +impl flutter_rust_bridge::IntoIntoDart> + for crate::api::api::ConversationData +{ + fn into_into_dart(self) -> FrbWrapper { self.into() } } - // Codec=Dco (DartCObject based), see doc to use other codecs -impl flutter_rust_bridge::IntoDart for FrbWrapper { +impl flutter_rust_bridge::IntoDart for crate::api::api::DartBeacon { + fn into_dart(self) -> flutter_rust_bridge::for_generated::DartAbi { + [ + self.naming.into_into_dart().into_dart(), + self.last_report.into_into_dart().into_dart(), + self.product_id.into_into_dart().into_dart(), + self.battery_level.into_into_dart().into_dart(), + self.vendor_id.into_into_dart().into_dart(), + self.model.into_into_dart().into_dart(), + self.system_version.into_into_dart().into_dart(), + self.id.into_into_dart().into_dart(), + self.shared.into_into_dart().into_dart(), + ] + .into_dart() + } +} +impl flutter_rust_bridge::for_generated::IntoDartExceptPrimitive for crate::api::api::DartBeacon {} +impl flutter_rust_bridge::IntoIntoDart + for crate::api::api::DartBeacon +{ + fn into_into_dart(self) -> crate::api::api::DartBeacon { + self + } +} +// Codec=Dco (DartCObject based), see doc to use other codecs +impl flutter_rust_bridge::IntoDart for crate::api::api::DartBeaconShareInfo { fn into_dart(self) -> flutter_rust_bridge::for_generated::DartAbi { - flutter_rust_bridge::for_generated::rust_auto_opaque_encode::<_, MoiArc<_>>(self.0) - .into_dart() + [ + self.share_id.into_into_dart().into_dart(), + self.acceptance_state.into_into_dart().into_dart(), + self.owner_handle.into_into_dart().into_dart(), + ] + .into_dart() } } impl flutter_rust_bridge::for_generated::IntoDartExceptPrimitive - for FrbWrapper + for crate::api::api::DartBeaconShareInfo { } - -impl flutter_rust_bridge::IntoIntoDart> for ChannelInterestToken { - fn into_into_dart(self) -> FrbWrapper { - self.into() +impl flutter_rust_bridge::IntoIntoDart + for crate::api::api::DartBeaconShareInfo +{ + fn into_into_dart(self) -> crate::api::api::DartBeaconShareInfo { + self } } - // Codec=Dco (DartCObject based), see doc to use other codecs -impl flutter_rust_bridge::IntoDart for FrbWrapper> { +impl flutter_rust_bridge::IntoDart for FrbWrapper { fn into_dart(self) -> flutter_rust_bridge::for_generated::DartAbi { - flutter_rust_bridge::for_generated::rust_auto_opaque_encode::<_, MoiArc<_>>(self.0) - .into_dart() + match self.0 { + crate::api::api::DeleteTarget::Chat(field0) => { + [0.into_dart(), field0.into_into_dart().into_dart()].into_dart() + } + crate::api::api::DeleteTarget::Messages(field0) => { + [1.into_dart(), field0.into_into_dart().into_dart()].into_dart() + } + _ => { + unimplemented!(""); + } + } } } impl flutter_rust_bridge::for_generated::IntoDartExceptPrimitive - for FrbWrapper> + for FrbWrapper { } - -impl flutter_rust_bridge::IntoIntoDart>> - for CircleClientSession +impl flutter_rust_bridge::IntoIntoDart> + for crate::api::api::DeleteTarget { - fn into_into_dart(self) -> FrbWrapper> { + fn into_into_dart(self) -> FrbWrapper { self.into() } } - // Codec=Dco (DartCObject based), see doc to use other codecs -impl flutter_rust_bridge::IntoDart for FrbWrapper { +impl flutter_rust_bridge::IntoDart for crate::api::api::DeviceInfo { fn into_dart(self) -> flutter_rust_bridge::for_generated::DartAbi { - flutter_rust_bridge::for_generated::rust_auto_opaque_encode::<_, MoiArc<_>>(self.0) - .into_dart() + [ + self.name.into_into_dart().into_dart(), + self.serial.into_into_dart().into_dart(), + self.os_version.into_into_dart().into_dart(), + self.encoded_data.into_into_dart().into_dart(), + ] + .into_dart() } } -impl flutter_rust_bridge::for_generated::IntoDartExceptPrimitive for FrbWrapper {} - -impl flutter_rust_bridge::IntoIntoDart> for ConversationLink { - fn into_into_dart(self) -> FrbWrapper { - self.into() +impl flutter_rust_bridge::for_generated::IntoDartExceptPrimitive for crate::api::api::DeviceInfo {} +impl flutter_rust_bridge::IntoIntoDart + for crate::api::api::DeviceInfo +{ + fn into_into_dart(self) -> crate::api::api::DeviceInfo { + self } } - // Codec=Dco (DartCObject based), see doc to use other codecs -impl flutter_rust_bridge::IntoDart for FrbWrapper { +impl flutter_rust_bridge::IntoDart for FrbWrapper { fn into_dart(self) -> flutter_rust_bridge::for_generated::DartAbi { - flutter_rust_bridge::for_generated::rust_auto_opaque_encode::<_, MoiArc<_>>(self.0) - .into_dart() + [ + self.0.tuuid.into_into_dart().into_dart(), + self.0.edit_part.into_into_dart().into_dart(), + self.0.new_parts.into_into_dart().into_dart(), + ] + .into_dart() } } impl flutter_rust_bridge::for_generated::IntoDartExceptPrimitive - for FrbWrapper + for FrbWrapper { } - -impl flutter_rust_bridge::IntoIntoDart> - for ConversationParticipant +impl flutter_rust_bridge::IntoIntoDart> + for crate::api::api::EditMessage { - fn into_into_dart(self) -> FrbWrapper { + fn into_into_dart(self) -> FrbWrapper { self.into() } } - // Codec=Dco (DartCObject based), see doc to use other codecs -impl flutter_rust_bridge::IntoDart for FrbWrapper { +impl flutter_rust_bridge::IntoDart for FrbWrapper { fn into_dart(self) -> flutter_rust_bridge::for_generated::DartAbi { - flutter_rust_bridge::for_generated::rust_auto_opaque_encode::<_, MoiArc<_>>(self.0) - .into_dart() - } -} -impl flutter_rust_bridge::for_generated::IntoDartExceptPrimitive for FrbWrapper {} - -impl flutter_rust_bridge::IntoIntoDart> for Date { - fn into_into_dart(self) -> FrbWrapper { - self.into() + [ + self.0.for_uuid.into_into_dart().into_dart(), + self.0.status.into_into_dart().into_dart(), + self.0.status_str.into_into_dart().into_dart(), + ] + .into_dart() } } - -// Codec=Dco (DartCObject based), see doc to use other codecs -impl flutter_rust_bridge::IntoDart for FrbWrapper { - fn into_dart(self) -> flutter_rust_bridge::for_generated::DartAbi { - flutter_rust_bridge::for_generated::rust_auto_opaque_encode::<_, MoiArc<_>>(self.0) - .into_dart() - } +impl flutter_rust_bridge::for_generated::IntoDartExceptPrimitive + for FrbWrapper +{ } -impl flutter_rust_bridge::for_generated::IntoDartExceptPrimitive for FrbWrapper {} - -impl flutter_rust_bridge::IntoIntoDart> for EscrowData { - fn into_into_dart(self) -> FrbWrapper { +impl flutter_rust_bridge::IntoIntoDart> + for crate::api::api::ErrorMessage +{ + fn into_into_dart(self) -> FrbWrapper { self.into() } } - // Codec=Dco (DartCObject based), see doc to use other codecs -impl flutter_rust_bridge::IntoDart for FrbWrapper> { +impl flutter_rust_bridge::IntoDart for FrbWrapper { fn into_dart(self) -> flutter_rust_bridge::for_generated::DartAbi { - flutter_rust_bridge::for_generated::rust_auto_opaque_encode::<_, MoiArc<_>>(self.0) - .into_dart() + [ + self.0.name.into_into_dart().into_dart(), + self.0.app_id.into_into_dart().into_dart(), + self.0.bundle_id.into_into_dart().into_dart(), + self.0.balloon.into_into_dart().into_dart(), + ] + .into_dart() } } impl flutter_rust_bridge::for_generated::IntoDartExceptPrimitive - for FrbWrapper> + for FrbWrapper { } - -impl flutter_rust_bridge::IntoIntoDart>> - for FindMyFriendsClient +impl flutter_rust_bridge::IntoIntoDart> + for crate::api::api::ExtensionApp { - fn into_into_dart(self) -> FrbWrapper> { + fn into_into_dart(self) -> FrbWrapper { self.into() } } - // Codec=Dco (DartCObject based), see doc to use other codecs -impl flutter_rust_bridge::IntoDart for FrbWrapper> { +impl flutter_rust_bridge::IntoDart for crate::api::api::FFIFilePackager { fn into_dart(self) -> flutter_rust_bridge::for_generated::DartAbi { - flutter_rust_bridge::for_generated::rust_auto_opaque_encode::<_, MoiArc<_>>(self.0) - .into_dart() + Vec::::new().into_dart() } } impl flutter_rust_bridge::for_generated::IntoDartExceptPrimitive - for FrbWrapper> + for crate::api::api::FFIFilePackager { } - -impl flutter_rust_bridge::IntoIntoDart>> - for FindMyPhoneClient +impl flutter_rust_bridge::IntoIntoDart + for crate::api::api::FFIFilePackager { - fn into_into_dart(self) -> FrbWrapper> { - self.into() + fn into_into_dart(self) -> crate::api::api::FFIFilePackager { + self } } - // Codec=Dco (DartCObject based), see doc to use other codecs -impl flutter_rust_bridge::IntoDart for FrbWrapper> { +impl flutter_rust_bridge::IntoDart for FrbWrapper { fn into_dart(self) -> flutter_rust_bridge::for_generated::DartAbi { - flutter_rust_bridge::for_generated::rust_auto_opaque_encode::<_, MoiArc<_>>(self.0) - .into_dart() + [ + self.0.create_timestamp.into_into_dart().into_dart(), + self.0.expires.into_into_dart().into_dart(), + self.0.id.into_into_dart().into_dart(), + self.0 + .invitation_accepted_handles + .into_into_dart() + .into_dart(), + self.0.invitation_from_handles.into_into_dart().into_dart(), + self.0.is_from_messages.into_into_dart().into_dart(), + self.0.offer_id.into_into_dart().into_dart(), + self.0.only_in_event.into_into_dart().into_dart(), + self.0.person_id_hash.into_into_dart().into_dart(), + self.0.secure_locations_capable.into_into_dart().into_dart(), + self.0 + .shallow_or_live_secure_locations_capable + .into_into_dart() + .into_dart(), + self.0.source.into_into_dart().into_dart(), + self.0.tk_permission.into_into_dart().into_dart(), + self.0.update_timestamp.into_into_dart().into_dart(), + self.0 + .fallback_to_legacy_allowed + .into_into_dart() + .into_dart(), + self.0.opted_not_to_share.into_into_dart().into_dart(), + self.0.last_location.into_into_dart().into_dart(), + self.0.locate_in_progress.into_into_dart().into_dart(), + ] + .into_dart() } } impl flutter_rust_bridge::for_generated::IntoDartExceptPrimitive - for FrbWrapper> + for FrbWrapper { } - -impl flutter_rust_bridge::IntoIntoDart>> - for GZipWrapper +impl flutter_rust_bridge::IntoIntoDart> + for crate::api::api::Follow { - fn into_into_dart(self) -> FrbWrapper> { + fn into_into_dart(self) -> FrbWrapper { self.into() } } - // Codec=Dco (DartCObject based), see doc to use other codecs -impl flutter_rust_bridge::IntoDart for FrbWrapper> { +impl flutter_rust_bridge::IntoDart for FrbWrapper { fn into_dart(self) -> flutter_rust_bridge::for_generated::DartAbi { - flutter_rust_bridge::for_generated::rust_auto_opaque_encode::<_, MoiArc<_>>(self.0) - .into_dart() + [ + self.0.device_model.into_into_dart().into_dart(), + self.0.low_power_mode.into_into_dart().into_dart(), + self.0.passcode_length.into_into_dart().into_dart(), + self.0.id.into_into_dart().into_dart(), + self.0.battery_status.into_into_dart().into_dart(), + self.0.lost_mode_capable.into_into_dart().into_dart(), + self.0.battery_level.into_into_dart().into_dart(), + self.0.location_enabled.into_into_dart().into_dart(), + self.0.is_considered_accessory.into_into_dart().into_dart(), + self.0.location.into_into_dart().into_dart(), + self.0.model_display_name.into_into_dart().into_dart(), + self.0.device_color.into_into_dart().into_dart(), + self.0.activation_locked.into_into_dart().into_dart(), + self.0.rm2_state.into_into_dart().into_dart(), + self.0.loc_found_enabled.into_into_dart().into_dart(), + self.0.nwd.into_into_dart().into_dart(), + self.0.device_status.into_into_dart().into_dart(), + self.0.fmly_share.into_into_dart().into_dart(), + self.0.features.into_into_dart().into_dart(), + self.0.this_device.into_into_dart().into_dart(), + self.0.lost_mode_enabled.into_into_dart().into_dart(), + self.0.device_display_name.into_into_dart().into_dart(), + self.0.name.into_into_dart().into_dart(), + self.0.can_wipe_after_lock.into_into_dart().into_dart(), + self.0.is_mac.into_into_dart().into_dart(), + self.0.raw_device_model.into_into_dart().into_dart(), + self.0.ba_uuid.into_into_dart().into_dart(), + self.0.device_discovery_id.into_into_dart().into_dart(), + self.0.scd.into_into_dart().into_dart(), + self.0.location_capable.into_into_dart().into_dart(), + self.0.wipe_in_progress.into_into_dart().into_dart(), + self.0.dark_wake.into_into_dart().into_dart(), + self.0.device_with_you.into_into_dart().into_dart(), + self.0.max_msg_char.into_into_dart().into_dart(), + self.0.device_class.into_into_dart().into_dart(), + ] + .into_dart() } } impl flutter_rust_bridge::for_generated::IntoDartExceptPrimitive - for FrbWrapper> + for FrbWrapper { } - -impl flutter_rust_bridge::IntoIntoDart>> - for GZipWrapper +impl flutter_rust_bridge::IntoIntoDart> + for crate::api::api::FoundDevice { - fn into_into_dart(self) -> FrbWrapper> { + fn into_into_dart(self) -> FrbWrapper { self.into() } } - // Codec=Dco (DartCObject based), see doc to use other codecs -impl flutter_rust_bridge::IntoDart for FrbWrapper> { +impl flutter_rust_bridge::IntoDart for FrbWrapper { fn into_dart(self) -> flutter_rust_bridge::for_generated::DartAbi { - flutter_rust_bridge::for_generated::rust_auto_opaque_encode::<_, MoiArc<_>>(self.0) - .into_dart() + [ + self.0.nickname.into_into_dart().into_dart(), + self.0.handle.into_into_dart().into_dart(), + ] + .into_dart() } } impl flutter_rust_bridge::for_generated::IntoDartExceptPrimitive - for FrbWrapper> + for FrbWrapper { } - -impl flutter_rust_bridge::IntoIntoDart>> - for GZipWrapper +impl flutter_rust_bridge::IntoIntoDart> + for crate::api::api::FTMember { - fn into_into_dart(self) -> FrbWrapper> { + fn into_into_dart(self) -> FrbWrapper { self.into() } } - // Codec=Dco (DartCObject based), see doc to use other codecs -impl flutter_rust_bridge::IntoDart for FrbWrapper> { +impl flutter_rust_bridge::IntoDart for FrbWrapper { fn into_dart(self) -> flutter_rust_bridge::for_generated::DartAbi { - flutter_rust_bridge::for_generated::rust_auto_opaque_encode::<_, MoiArc<_>>(self.0) - .into_dart() + match self.0 { + crate::api::api::FTMessage::LetMeInRequest(field0) => { + [0.into_dart(), field0.into_into_dart().into_dart()].into_dart() + } + crate::api::api::FTMessage::LinkChanged { guid } => { + [1.into_dart(), guid.into_into_dart().into_dart()].into_dart() + } + crate::api::api::FTMessage::JoinEvent { + guid, + participant, + handle, + ring, + } => [ + 2.into_dart(), + guid.into_into_dart().into_dart(), + participant.into_into_dart().into_dart(), + handle.into_into_dart().into_dart(), + ring.into_into_dart().into_dart(), + ] + .into_dart(), + crate::api::api::FTMessage::AddMembers { + guid, + members, + ring, + } => [ + 3.into_dart(), + guid.into_into_dart().into_dart(), + members.into_into_dart().into_dart(), + ring.into_into_dart().into_dart(), + ] + .into_dart(), + crate::api::api::FTMessage::RemoveMembers { guid, members } => [ + 4.into_dart(), + guid.into_into_dart().into_dart(), + members.into_into_dart().into_dart(), + ] + .into_dart(), + crate::api::api::FTMessage::LeaveEvent { + guid, + participant, + handle, + } => [ + 5.into_dart(), + guid.into_into_dart().into_dart(), + participant.into_into_dart().into_dart(), + handle.into_into_dart().into_dart(), + ] + .into_dart(), + crate::api::api::FTMessage::Ring { guid } => { + [6.into_dart(), guid.into_into_dart().into_dart()].into_dart() + } + crate::api::api::FTMessage::Decline { guid } => { + [7.into_dart(), guid.into_into_dart().into_dart()].into_dart() + } + crate::api::api::FTMessage::RespondedElsewhere { guid } => { + [8.into_dart(), guid.into_into_dart().into_dart()].into_dart() + } + _ => { + unimplemented!(""); + } + } } } impl flutter_rust_bridge::for_generated::IntoDartExceptPrimitive - for FrbWrapper> + for FrbWrapper { } - -impl flutter_rust_bridge::IntoIntoDart>> - for GZipWrapper +impl flutter_rust_bridge::IntoIntoDart> + for crate::api::api::FTMessage { - fn into_into_dart(self) -> FrbWrapper> { + fn into_into_dart(self) -> FrbWrapper { self.into() } } - // Codec=Dco (DartCObject based), see doc to use other codecs -impl flutter_rust_bridge::IntoDart for FrbWrapper> { +impl flutter_rust_bridge::IntoDart for FrbWrapper { fn into_dart(self) -> flutter_rust_bridge::for_generated::DartAbi { - flutter_rust_bridge::for_generated::rust_auto_opaque_encode::<_, MoiArc<_>>(self.0) - .into_dart() + match self.0 { + crate::api::api::FTMode::Outgoing => 0.into_dart(), + crate::api::api::FTMode::Incoming => 1.into_dart(), + crate::api::api::FTMode::Missed => 2.into_dart(), + crate::api::api::FTMode::MissedOutgoing => 3.into_dart(), + _ => unreachable!(), + } } } impl flutter_rust_bridge::for_generated::IntoDartExceptPrimitive - for FrbWrapper> + for FrbWrapper { } - -impl flutter_rust_bridge::IntoIntoDart>> - for GZipWrapper +impl flutter_rust_bridge::IntoIntoDart> + for crate::api::api::FTMode { - fn into_into_dart(self) -> FrbWrapper> { + fn into_into_dart(self) -> FrbWrapper { self.into() } } - // Codec=Dco (DartCObject based), see doc to use other codecs -impl flutter_rust_bridge::IntoDart for FrbWrapper> { +impl flutter_rust_bridge::IntoDart for FrbWrapper { fn into_dart(self) -> flutter_rust_bridge::for_generated::DartAbi { - flutter_rust_bridge::for_generated::rust_auto_opaque_encode::<_, MoiArc<_>>(self.0) - .into_dart() + [ + self.0.token.into_into_dart().into_dart(), + self.0.handle.into_into_dart().into_dart(), + self.0.participant_id.into_into_dart().into_dart(), + self.0.last_join_date.into_into_dart().into_dart(), + self.0.active.into_into_dart().into_dart(), + ] + .into_dart() } } impl flutter_rust_bridge::for_generated::IntoDartExceptPrimitive - for FrbWrapper> + for FrbWrapper { } - -impl flutter_rust_bridge::IntoIntoDart>> - for GZipWrapper +impl flutter_rust_bridge::IntoIntoDart> + for crate::api::api::FTParticipant { - fn into_into_dart(self) -> FrbWrapper> { + fn into_into_dart(self) -> FrbWrapper { self.into() } } - // Codec=Dco (DartCObject based), see doc to use other codecs -impl flutter_rust_bridge::IntoDart for FrbWrapper { +impl flutter_rust_bridge::IntoDart for FrbWrapper { fn into_dart(self) -> flutter_rust_bridge::for_generated::DartAbi { - flutter_rust_bridge::for_generated::rust_auto_opaque_encode::<_, MoiArc<_>>(self.0) - .into_dart() - } -} -impl flutter_rust_bridge::for_generated::IntoDartExceptPrimitive for FrbWrapper {} - -impl flutter_rust_bridge::IntoIntoDart> for IDSNGMIdentity { - fn into_into_dart(self) -> FrbWrapper { - self.into() + [ + self.0.group_id.into_into_dart().into_dart(), + self.0.my_handles.into_into_dart().into_dart(), + self.0.participants.into_into_dart().into_dart(), + self.0.link.into_into_dart().into_dart(), + self.0.members.into_into_dart().into_dart(), + self.0.report_id.into_into_dart().into_dart(), + self.0.start_time.into_into_dart().into_dart(), + self.0.last_rekey.into_into_dart().into_dart(), + self.0.is_propped.into_into_dart().into_dart(), + self.0.is_ringing_inaccurate.into_into_dart().into_dart(), + self.0.mode.into_into_dart().into_dart(), + self.0.recent_member_adds.into_into_dart().into_dart(), + ] + .into_dart() } } - -// Codec=Dco (DartCObject based), see doc to use other codecs -impl flutter_rust_bridge::IntoDart for FrbWrapper { - fn into_dart(self) -> flutter_rust_bridge::for_generated::DartAbi { - flutter_rust_bridge::for_generated::rust_auto_opaque_encode::<_, MoiArc<_>>(self.0) - .into_dart() - } +impl flutter_rust_bridge::for_generated::IntoDartExceptPrimitive + for FrbWrapper +{ } -impl flutter_rust_bridge::for_generated::IntoDartExceptPrimitive for FrbWrapper {} - -impl flutter_rust_bridge::IntoIntoDart> for IDSUser { - fn into_into_dart(self) -> FrbWrapper { +impl flutter_rust_bridge::IntoIntoDart> + for crate::api::api::FTSession +{ + fn into_into_dart(self) -> FrbWrapper { self.into() } } - // Codec=Dco (DartCObject based), see doc to use other codecs -impl flutter_rust_bridge::IntoDart for FrbWrapper { +impl flutter_rust_bridge::IntoDart for crate::api::api::GroupSummary { fn into_dart(self) -> flutter_rust_bridge::for_generated::DartAbi { - flutter_rust_bridge::for_generated::rust_auto_opaque_encode::<_, MoiArc<_>>(self.0) - .into_dart() + [ + self.display_name.into_into_dart().into_dart(), + self.is_owner.into_into_dart().into_dart(), + self.members.into_into_dart().into_dart(), + ] + .into_dart() } } -impl flutter_rust_bridge::for_generated::IntoDartExceptPrimitive for FrbWrapper {} - -impl flutter_rust_bridge::IntoIntoDart> for JoinedOSConfig { - fn into_into_dart(self) -> FrbWrapper { - self.into() +impl flutter_rust_bridge::for_generated::IntoDartExceptPrimitive for crate::api::api::GroupSummary {} +impl flutter_rust_bridge::IntoIntoDart + for crate::api::api::GroupSummary +{ + fn into_into_dart(self) -> crate::api::api::GroupSummary { + self } } - // Codec=Dco (DartCObject based), see doc to use other codecs -impl flutter_rust_bridge::IntoDart for FrbWrapper { +impl flutter_rust_bridge::IntoDart for crate::api::api::GroupSummaryMember { fn into_dart(self) -> flutter_rust_bridge::for_generated::DartAbi { - flutter_rust_bridge::for_generated::rust_auto_opaque_encode::<_, MoiArc<_>>(self.0) - .into_dart() + [ + self.name.into_into_dart().into_dart(), + self.handle.into_into_dart().into_dart(), + self.user_id.into_into_dart().into_dart(), + self.is_joined.into_into_dart().into_dart(), + ] + .into_dart() } } -impl flutter_rust_bridge::for_generated::IntoDartExceptPrimitive for FrbWrapper {} - -impl flutter_rust_bridge::IntoIntoDart> for LocationReport { - fn into_into_dart(self) -> FrbWrapper { - self.into() +impl flutter_rust_bridge::for_generated::IntoDartExceptPrimitive + for crate::api::api::GroupSummaryMember +{ +} +impl flutter_rust_bridge::IntoIntoDart + for crate::api::api::GroupSummaryMember +{ + fn into_into_dart(self) -> crate::api::api::GroupSummaryMember { + self } } - // Codec=Dco (DartCObject based), see doc to use other codecs -impl flutter_rust_bridge::IntoDart for FrbWrapper { +impl flutter_rust_bridge::IntoDart for crate::api::api::HwExtra { fn into_dart(self) -> flutter_rust_bridge::for_generated::DartAbi { - flutter_rust_bridge::for_generated::rust_auto_opaque_encode::<_, MoiArc<_>>(self.0) - .into_dart() - } -} -impl flutter_rust_bridge::for_generated::IntoDartExceptPrimitive for FrbWrapper {} - -impl flutter_rust_bridge::IntoIntoDart> for MessageFlags { - fn into_into_dart(self) -> FrbWrapper { - self.into() + [ + self.version.into_into_dart().into_dart(), + self.protocol_version.into_into_dart().into_dart(), + self.device_id.into_into_dart().into_dart(), + self.icloud_ua.into_into_dart().into_dart(), + self.aoskit_version.into_into_dart().into_dart(), + ] + .into_dart() + } +} +impl flutter_rust_bridge::for_generated::IntoDartExceptPrimitive for crate::api::api::HwExtra {} +impl flutter_rust_bridge::IntoIntoDart for crate::api::api::HwExtra { + fn into_into_dart(self) -> crate::api::api::HwExtra { + self } } - // Codec=Dco (DartCObject based), see doc to use other codecs -impl flutter_rust_bridge::IntoDart for FrbWrapper> { +impl flutter_rust_bridge::IntoDart for FrbWrapper { fn into_dart(self) -> flutter_rust_bridge::for_generated::DartAbi { - flutter_rust_bridge::for_generated::rust_auto_opaque_encode::<_, MoiArc<_>>(self.0) - .into_dart() + [ + self.0.name.into_into_dart().into_dart(), + self.0.first.into_into_dart().into_dart(), + self.0.last.into_into_dart().into_dart(), + ] + .into_dart() } } impl flutter_rust_bridge::for_generated::IntoDartExceptPrimitive - for FrbWrapper> + for FrbWrapper { } - -impl flutter_rust_bridge::IntoIntoDart>> - for NSArray +impl flutter_rust_bridge::IntoIntoDart> + for crate::api::api::IMessageNameRecord { - fn into_into_dart(self) -> FrbWrapper> { + fn into_into_dart(self) -> FrbWrapper { self.into() } } - // Codec=Dco (DartCObject based), see doc to use other codecs -impl flutter_rust_bridge::IntoDart for FrbWrapper> { +impl flutter_rust_bridge::IntoDart for FrbWrapper { fn into_dart(self) -> flutter_rust_bridge::for_generated::DartAbi { - flutter_rust_bridge::for_generated::rust_auto_opaque_encode::<_, MoiArc<_>>(self.0) - .into_dart() + [ + self.0.name.into_into_dart().into_dart(), + self.0.image.into_into_dart().into_dart(), + self.0.poster.into_into_dart().into_dart(), + ] + .into_dart() } } impl flutter_rust_bridge::for_generated::IntoDartExceptPrimitive - for FrbWrapper> + for FrbWrapper { } - -impl flutter_rust_bridge::IntoIntoDart>> - for NSArray +impl flutter_rust_bridge::IntoIntoDart> + for crate::api::api::IMessageNicknameRecord { - fn into_into_dart(self) -> FrbWrapper> { + fn into_into_dart(self) -> FrbWrapper { self.into() } } - // Codec=Dco (DartCObject based), see doc to use other codecs -impl flutter_rust_bridge::IntoDart for FrbWrapper { +impl flutter_rust_bridge::IntoDart for FrbWrapper { fn into_dart(self) -> flutter_rust_bridge::for_generated::DartAbi { - flutter_rust_bridge::for_generated::rust_auto_opaque_encode::<_, MoiArc<_>>(self.0) - .into_dart() + [ + self.0.low_res_poster.into_into_dart().into_dart(), + self.0.package.into_into_dart().into_dart(), + self.0.meta.into_into_dart().into_dart(), + ] + .into_dart() } } -impl flutter_rust_bridge::for_generated::IntoDartExceptPrimitive for FrbWrapper {} - -impl flutter_rust_bridge::IntoIntoDart> for PushError { - fn into_into_dart(self) -> FrbWrapper { +impl flutter_rust_bridge::for_generated::IntoDartExceptPrimitive + for FrbWrapper +{ +} +impl flutter_rust_bridge::IntoIntoDart> + for crate::api::api::IMessagePosterRecord +{ + fn into_into_dart(self) -> FrbWrapper { self.into() } } - // Codec=Dco (DartCObject based), see doc to use other codecs -impl flutter_rust_bridge::IntoDart for FrbWrapper> { +impl flutter_rust_bridge::IntoDart for FrbWrapper { fn into_dart(self) -> flutter_rust_bridge::for_generated::DartAbi { - flutter_rust_bridge::for_generated::rust_auto_opaque_encode::<_, MoiArc<_>>(self.0) - .into_dart() + [ + self.0.file.into_into_dart().into_dart(), + self.0.group_version.into_into_dart().into_dart(), + ] + .into_dart() } } impl flutter_rust_bridge::for_generated::IntoDartExceptPrimitive - for FrbWrapper> + for FrbWrapper { } - -impl flutter_rust_bridge::IntoIntoDart>> for Receiver { - fn into_into_dart(self) -> FrbWrapper> { +impl flutter_rust_bridge::IntoIntoDart> + for crate::api::api::IconChangeMessage +{ + fn into_into_dart(self) -> FrbWrapper { self.into() } } - // Codec=Dco (DartCObject based), see doc to use other codecs -impl flutter_rust_bridge::IntoDart for FrbWrapper { +impl flutter_rust_bridge::IntoDart for FrbWrapper { fn into_dart(self) -> flutter_rust_bridge::for_generated::DartAbi { - flutter_rust_bridge::for_generated::rust_auto_opaque_encode::<_, MoiArc<_>>(self.0) - .into_dart() + [ + self.0.step.into_into_dart().into_dart(), + self.0.atxnid.into_into_dart().into_dart(), + self.0.pake.into_into_dart().into_dart(), + self.0.ec.into_into_dart().into_dart(), + self.0.idmsdata.into_into_dart().into_dart(), + ] + .into_dart() } } impl flutter_rust_bridge::for_generated::IntoDartExceptPrimitive - for FrbWrapper + for FrbWrapper { } - -impl flutter_rust_bridge::IntoIntoDart> for SavedHardwareState { - fn into_into_dart(self) -> FrbWrapper { +impl flutter_rust_bridge::IntoIntoDart> + for crate::api::api::IdmsCircleMessage +{ + fn into_into_dart(self) -> FrbWrapper { self.into() } } - // Codec=Dco (DartCObject based), see doc to use other codecs -impl flutter_rust_bridge::IntoDart for FrbWrapper> { +impl flutter_rust_bridge::IntoDart for FrbWrapper { fn into_dart(self) -> flutter_rust_bridge::for_generated::DartAbi { - flutter_rust_bridge::for_generated::rust_auto_opaque_encode::<_, MoiArc<_>>(self.0) - .into_dart() - } -} -impl flutter_rust_bridge::for_generated::IntoDartExceptPrimitive for FrbWrapper> {} - -impl flutter_rust_bridge::IntoIntoDart>> for Sender<()> { - fn into_into_dart(self) -> FrbWrapper> { - self.into() + match self.0 { + crate::api::api::IdmsMessage::RequestedSignIn(field0) => { + [0.into_dart(), field0.into_into_dart().into_dart()].into_dart() + } + crate::api::api::IdmsMessage::TeardownSignIn(field0) => { + [1.into_dart(), field0.into_into_dart().into_dart()].into_dart() + } + crate::api::api::IdmsMessage::CircleRequest(field0, field1) => [ + 2.into_dart(), + field0.into_into_dart().into_dart(), + field1.into_into_dart().into_dart(), + ] + .into_dart(), + _ => { + unimplemented!(""); + } + } } } - -// Codec=Dco (DartCObject based), see doc to use other codecs -impl flutter_rust_bridge::IntoDart for FrbWrapper { - fn into_dart(self) -> flutter_rust_bridge::for_generated::DartAbi { - flutter_rust_bridge::for_generated::rust_auto_opaque_encode::<_, MoiArc<_>>(self.0) - .into_dart() - } +impl flutter_rust_bridge::for_generated::IntoDartExceptPrimitive + for FrbWrapper +{ } -impl flutter_rust_bridge::for_generated::IntoDartExceptPrimitive for FrbWrapper {} - -impl flutter_rust_bridge::IntoIntoDart> for StCollapsedValue { - fn into_into_dart(self) -> FrbWrapper { +impl flutter_rust_bridge::IntoIntoDart> + for crate::api::api::IdmsMessage +{ + fn into_into_dart(self) -> FrbWrapper { self.into() } } - // Codec=Dco (DartCObject based), see doc to use other codecs -impl flutter_rust_bridge::IntoDart - for FrbWrapper> -{ +impl flutter_rust_bridge::IntoDart for FrbWrapper { fn into_dart(self) -> flutter_rust_bridge::for_generated::DartAbi { - flutter_rust_bridge::for_generated::rust_auto_opaque_encode::<_, MoiArc<_>>(self.0) - .into_dart() + [ + self.0.aps.into_into_dart().into_dart(), + self.0.txnid.into_into_dart().into_dart(), + self.0.akdata.into_into_dart().into_dart(), + self.0.adsid.into_into_dart().into_dart(), + ] + .into_dart() } } impl flutter_rust_bridge::for_generated::IntoDartExceptPrimitive - for FrbWrapper> + for FrbWrapper { } - -impl - flutter_rust_bridge::IntoIntoDart< - FrbWrapper>, - > for SyncManager +impl flutter_rust_bridge::IntoIntoDart> + for crate::api::api::IdmsRequestedSignIn { - fn into_into_dart(self) -> FrbWrapper> { + fn into_into_dart(self) -> FrbWrapper { self.into() } } - // Codec=Dco (DartCObject based), see doc to use other codecs -impl flutter_rust_bridge::IntoDart for FrbWrapper { +impl flutter_rust_bridge::IntoDart for FrbWrapper { fn into_dart(self) -> flutter_rust_bridge::for_generated::DartAbi { - flutter_rust_bridge::for_generated::rust_auto_opaque_encode::<_, MoiArc<_>>(self.0) - .into_dart() + [ + self.0.part.into_into_dart().into_dart(), + self.0.idx.into_into_dart().into_dart(), + self.0.ext.into_into_dart().into_dart(), + ] + .into_dart() } } -impl flutter_rust_bridge::for_generated::IntoDartExceptPrimitive for FrbWrapper {} - -impl flutter_rust_bridge::IntoIntoDart> for SystemTime { - fn into_into_dart(self) -> FrbWrapper { +impl flutter_rust_bridge::for_generated::IntoDartExceptPrimitive + for FrbWrapper +{ +} +impl flutter_rust_bridge::IntoIntoDart> + for crate::api::api::IndexedMessagePart +{ + fn into_into_dart(self) -> FrbWrapper { self.into() } } - // Codec=Dco (DartCObject based), see doc to use other codecs -impl flutter_rust_bridge::IntoDart for FrbWrapper { +impl flutter_rust_bridge::IntoDart for FrbWrapper { fn into_dart(self) -> flutter_rust_bridge::for_generated::DartAbi { - flutter_rust_bridge::for_generated::rust_auto_opaque_encode::<_, MoiArc<_>>(self.0) - .into_dart() + [ + self.0.shared_secret.into_into_dart().into_dart(), + self.0.pseud.into_into_dart().into_dart(), + self.0.requestor.into_into_dart().into_dart(), + self.0.nickname.into_into_dart().into_dart(), + self.0.token.into_into_dart().into_dart(), + self.0.delegation_uuid.into_into_dart().into_dart(), + self.0.usage.into_into_dart().into_dart(), + ] + .into_dart() } } -impl flutter_rust_bridge::for_generated::IntoDartExceptPrimitive for FrbWrapper {} - -impl flutter_rust_bridge::IntoIntoDart> for VerifyBody { - fn into_into_dart(self) -> FrbWrapper { +impl flutter_rust_bridge::for_generated::IntoDartExceptPrimitive + for FrbWrapper +{ +} +impl flutter_rust_bridge::IntoIntoDart> + for crate::api::api::LetMeInRequest +{ + fn into_into_dart(self) -> FrbWrapper { self.into() } } - // Codec=Dco (DartCObject based), see doc to use other codecs -impl flutter_rust_bridge::IntoDart for FrbWrapper { +impl flutter_rust_bridge::IntoDart for FrbWrapper { fn into_dart(self) -> flutter_rust_bridge::for_generated::DartAbi { - flutter_rust_bridge::for_generated::rust_auto_opaque_encode::<_, MoiArc<_>>(self.0) - .into_dart() + [ + self.0.data.into_into_dart().into_dart(), + self.0.attachments.into_into_dart().into_dart(), + ] + .into_dart() } } -impl flutter_rust_bridge::for_generated::IntoDartExceptPrimitive for FrbWrapper {} - -impl flutter_rust_bridge::IntoIntoDart> for ViableBottle { - fn into_into_dart(self) -> FrbWrapper { +impl flutter_rust_bridge::for_generated::IntoDartExceptPrimitive + for FrbWrapper +{ +} +impl flutter_rust_bridge::IntoIntoDart> + for crate::api::api::LinkMeta +{ + fn into_into_dart(self) -> FrbWrapper { self.into() } } - // Codec=Dco (DartCObject based), see doc to use other codecs -impl flutter_rust_bridge::IntoDart for FrbWrapper { +impl flutter_rust_bridge::IntoDart for FrbWrapper { fn into_dart(self) -> flutter_rust_bridge::for_generated::DartAbi { [ - self.0.administrative_area.into_into_dart().into_dart(), - self.0.country.into_into_dart().into_dart(), - self.0.country_code.into_into_dart().into_dart(), - self.0.formatted_address_lines.into_into_dart().into_dart(), - self.0.locality.into_into_dart().into_dart(), - self.0.state_code.into_into_dart().into_dart(), - self.0.street_address.into_into_dart().into_dart(), - self.0.street_name.into_into_dart().into_dart(), + self.0.address.into_into_dart().into_dart(), + self.0.altitude.into_into_dart().into_dart(), + self.0.floor_level.into_into_dart().into_dart(), + self.0.horizontal_accuracy.into_into_dart().into_dart(), + self.0.is_inaccurate.into_into_dart().into_dart(), + self.0.latitude.into_into_dart().into_dart(), + self.0.location_id.into_into_dart().into_dart(), + self.0.location_timestamp.into_into_dart().into_dart(), + self.0.longitude.into_into_dart().into_dart(), + self.0.secure_location_ts.into_into_dart().into_dart(), + self.0.timestamp.into_into_dart().into_dart(), + self.0.vertical_accuracy.into_into_dart().into_dart(), + self.0.position_type.into_into_dart().into_dart(), + self.0.is_old.into_into_dart().into_dart(), + self.0.location_finished.into_into_dart().into_dart(), ] .into_dart() } } impl flutter_rust_bridge::for_generated::IntoDartExceptPrimitive - for FrbWrapper + for FrbWrapper { } -impl flutter_rust_bridge::IntoIntoDart> - for crate::api::api::Address +impl flutter_rust_bridge::IntoIntoDart> + for crate::api::api::Location { - fn into_into_dart(self) -> FrbWrapper { + fn into_into_dart(self) -> FrbWrapper { self.into() } } // Codec=Dco (DartCObject based), see doc to use other codecs -impl flutter_rust_bridge::IntoDart for FrbWrapper { +impl flutter_rust_bridge::IntoDart for FrbWrapper { fn into_dart(self) -> flutter_rust_bridge::for_generated::DartAbi { - [ - self.0.lat.into_into_dart().into_dart(), - self.0.lng.into_into_dart().into_dart(), - ] - .into_dart() + match self.0 { + crate::api::api::LoginState::LoggedIn => [0.into_dart()].into_dart(), + crate::api::api::LoginState::NeedsDevice2FA => [1.into_dart()].into_dart(), + crate::api::api::LoginState::Needs2FAVerification => [2.into_dart()].into_dart(), + crate::api::api::LoginState::NeedsSMS2FA => [3.into_dart()].into_dart(), + crate::api::api::LoginState::NeedsSMS2FAVerification(field0) => { + [4.into_dart(), field0.into_into_dart().into_dart()].into_dart() + } + crate::api::api::LoginState::NeedsExtraStep(field0) => { + [5.into_dart(), field0.into_into_dart().into_dart()].into_dart() + } + crate::api::api::LoginState::NeedsLogin => [6.into_dart()].into_dart(), + _ => { + unimplemented!(""); + } + } } } impl flutter_rust_bridge::for_generated::IntoDartExceptPrimitive - for FrbWrapper + for FrbWrapper { } -impl flutter_rust_bridge::IntoIntoDart> - for crate::api::api::AkData +impl flutter_rust_bridge::IntoIntoDart> + for crate::api::api::LoginState { - fn into_into_dart(self) -> FrbWrapper { + fn into_into_dart(self) -> FrbWrapper { self.into() } } // Codec=Dco (DartCObject based), see doc to use other codecs -impl flutter_rust_bridge::IntoDart for FrbWrapper { +impl flutter_rust_bridge::IntoDart for FrbWrapper { fn into_dart(self) -> flutter_rust_bridge::for_generated::DartAbi { [ - self.0.title.into_into_dart().into_dart(), - self.0.body.into_into_dart().into_dart(), - self.0.sbdy.into_into_dart().into_dart(), - self.0.defbtn.into_into_dart().into_dart(), - self.0.albtn.into_into_dart().into_dart(), + self.0.url.into_into_dart().into_dart(), + self.0.version.into_into_dart().into_dart(), ] .into_dart() } } impl flutter_rust_bridge::for_generated::IntoDartExceptPrimitive - for FrbWrapper + for FrbWrapper { } -impl flutter_rust_bridge::IntoIntoDart> - for crate::api::api::ApsAlert +impl flutter_rust_bridge::IntoIntoDart> + for crate::api::api::LPIconMetadata { - fn into_into_dart(self) -> FrbWrapper { + fn into_into_dart(self) -> FrbWrapper { self.into() } } // Codec=Dco (DartCObject based), see doc to use other codecs -impl flutter_rust_bridge::IntoDart for FrbWrapper { +impl flutter_rust_bridge::IntoDart for FrbWrapper { fn into_dart(self) -> flutter_rust_bridge::for_generated::DartAbi { - [self.0.alert.into_into_dart().into_dart()].into_dart() + [ + self.0.size.into_into_dart().into_dart(), + self.0.url.into_into_dart().into_dart(), + self.0.version.into_into_dart().into_dart(), + ] + .into_dart() } } impl flutter_rust_bridge::for_generated::IntoDartExceptPrimitive - for FrbWrapper + for FrbWrapper { } -impl flutter_rust_bridge::IntoIntoDart> - for crate::api::api::ApsData +impl flutter_rust_bridge::IntoIntoDart> + for crate::api::api::LPImageMetadata { - fn into_into_dart(self) -> FrbWrapper { + fn into_into_dart(self) -> FrbWrapper { self.into() } } // Codec=Dco (DartCObject based), see doc to use other codecs -impl flutter_rust_bridge::IntoDart for FrbWrapper { +impl flutter_rust_bridge::IntoDart for FrbWrapper { fn into_dart(self) -> flutter_rust_bridge::for_generated::DartAbi { [ - self.0.a_type.into_into_dart().into_dart(), - self.0.part.into_into_dart().into_dart(), - self.0.uti_type.into_into_dart().into_dart(), - self.0.mime.into_into_dart().into_dart(), - self.0.name.into_into_dart().into_dart(), - self.0.iris.into_into_dart().into_dart(), + self.0.image_metadata.into_into_dart().into_dart(), + self.0.version.into_into_dart().into_dart(), + self.0.icon_metadata.into_into_dart().into_dart(), + self.0.original_url.into_into_dart().into_dart(), + self.0.url.into_into_dart().into_dart(), + self.0.title.into_into_dart().into_dart(), + self.0.summary.into_into_dart().into_dart(), + self.0.image.into_into_dart().into_dart(), + self.0.icon.into_into_dart().into_dart(), + self.0.images.into_into_dart().into_dart(), + self.0.icons.into_into_dart().into_dart(), + self.0.is_incomplete.into_into_dart().into_dart(), + self.0.uses_activity_pub.into_into_dart().into_dart(), + self.0.is_encoded_for_local_use.into_into_dart().into_dart(), + self.0.collaboration_type.into_into_dart().into_dart(), + self.0.specialization2.into_into_dart().into_dart(), ] .into_dart() } } impl flutter_rust_bridge::for_generated::IntoDartExceptPrimitive - for FrbWrapper + for FrbWrapper { } -impl flutter_rust_bridge::IntoIntoDart> - for crate::api::api::Attachment +impl flutter_rust_bridge::IntoIntoDart> + for crate::api::api::LPLinkMetadata { - fn into_into_dart(self) -> FrbWrapper { + fn into_into_dart(self) -> FrbWrapper { self.into() } } // Codec=Dco (DartCObject based), see doc to use other codecs -impl flutter_rust_bridge::IntoDart for FrbWrapper { +impl flutter_rust_bridge::IntoDart for FrbWrapper { fn into_dart(self) -> flutter_rust_bridge::for_generated::DartAbi { - [ - self.0.mime_type.into_into_dart().into_dart(), - self.0.start_date.into_into_dart().into_dart(), - self.0.total_bytes.into_into_dart().into_dart(), - self.0.transfer_state.into_into_dart().into_dart(), - self.0.is_sticker.into_into_dart().into_dart(), - self.0.guid.into_into_dart().into_dart(), - self.0.hide_attachment.into_into_dart().into_dart(), - self.0.user_info.into_into_dart().into_dart(), - self.0.filename.into_into_dart().into_dart(), - self.0.extras.into_into_dart().into_dart(), - self.0.is_outgoing.into_into_dart().into_dart(), - self.0.transfer_name.into_into_dart().into_dart(), - self.0.version.into_into_dart().into_dart(), - self.0.uti.into_into_dart().into_dart(), - self.0.created_date.into_into_dart().into_dart(), - self.0.pathc.into_into_dart().into_dart(), - self.0.md5.into_into_dart().into_dart(), - ] - .into_dart() + match self.0 { + crate::api::api::LPSpecializationMetadata::LPPasswordsInviteMetadata { + group_name, + url_parameters, + } => [ + 0.into_dart(), + group_name.into_into_dart().into_dart(), + url_parameters.into_into_dart().into_dart(), + ] + .into_dart(), + _ => { + unimplemented!(""); + } + } } } impl flutter_rust_bridge::for_generated::IntoDartExceptPrimitive - for FrbWrapper + for FrbWrapper { } -impl flutter_rust_bridge::IntoIntoDart> - for crate::api::api::AttachmentMeta +impl flutter_rust_bridge::IntoIntoDart> + for crate::api::api::LPSpecializationMetadata { - fn into_into_dart(self) -> FrbWrapper { + fn into_into_dart(self) -> FrbWrapper { self.into() } } // Codec=Dco (DartCObject based), see doc to use other codecs -impl flutter_rust_bridge::IntoDart for FrbWrapper { +impl flutter_rust_bridge::IntoDart for FrbWrapper { fn into_dart(self) -> flutter_rust_bridge::for_generated::DartAbi { - [self.0.preview_generation_state.into_into_dart().into_dart()].into_dart() + [ + self.0 + .background_color_description + .into_into_dart() + .into_dart(), + self.0.avatar_record_data.into_into_dart().into_dart(), + self.0.avatar_pose_data.into_into_dart().into_dart(), + self.0.has_body.into_into_dart().into_dart(), + self.0.avatar_image_data.into_into_dart().into_dart(), + ] + .into_dart() } } impl flutter_rust_bridge::for_generated::IntoDartExceptPrimitive - for FrbWrapper + for FrbWrapper { } -impl flutter_rust_bridge::IntoIntoDart> - for crate::api::api::AttachmentMetaExtra +impl flutter_rust_bridge::IntoIntoDart> + for crate::api::api::MemojiData { - fn into_into_dart(self) -> FrbWrapper { + fn into_into_dart(self) -> FrbWrapper { self.into() } } // Codec=Dco (DartCObject based), see doc to use other codecs -impl flutter_rust_bridge::IntoDart for FrbWrapper { +impl flutter_rust_bridge::IntoDart for FrbWrapper { fn into_dart(self) -> flutter_rust_bridge::for_generated::DartAbi { match self.0 { - crate::api::api::AttachmentType::Inline(field0) => { + crate::api::api::Message::Message(field0) => { [0.into_dart(), field0.into_into_dart().into_dart()].into_dart() } - crate::api::api::AttachmentType::MMCS(field0) => { - [1.into_dart(), field0.into_into_dart().into_dart()].into_dart() + crate::api::api::Message::RenameMessage(field0) => { + [1.into_dart(), field0.into_into_dart().into_dart()].into_dart() + } + crate::api::api::Message::ChangeParticipants(field0) => { + [2.into_dart(), field0.into_into_dart().into_dart()].into_dart() + } + crate::api::api::Message::React(field0) => { + [3.into_dart(), field0.into_into_dart().into_dart()].into_dart() + } + crate::api::api::Message::Delivered => [4.into_dart()].into_dart(), + crate::api::api::Message::Read => [5.into_dart()].into_dart(), + crate::api::api::Message::Typing(field0, field1) => [ + 6.into_dart(), + field0.into_into_dart().into_dart(), + field1.into_into_dart().into_dart(), + ] + .into_dart(), + crate::api::api::Message::Unsend(field0) => { + [7.into_dart(), field0.into_into_dart().into_dart()].into_dart() + } + crate::api::api::Message::Edit(field0) => { + [8.into_dart(), field0.into_into_dart().into_dart()].into_dart() + } + crate::api::api::Message::IconChange(field0) => { + [9.into_dart(), field0.into_into_dart().into_dart()].into_dart() + } + crate::api::api::Message::EnableSmsActivation(field0) => { + [10.into_dart(), field0.into_into_dart().into_dart()].into_dart() + } + crate::api::api::Message::MessageReadOnDevice => [11.into_dart()].into_dart(), + crate::api::api::Message::SmsConfirmSent(field0) => { + [12.into_dart(), field0.into_into_dart().into_dart()].into_dart() + } + crate::api::api::Message::MarkUnread => [13.into_dart()].into_dart(), + crate::api::api::Message::PeerCacheInvalidate => [14.into_dart()].into_dart(), + crate::api::api::Message::UpdateExtension(field0) => { + [15.into_dart(), field0.into_into_dart().into_dart()].into_dart() + } + crate::api::api::Message::Error(field0) => { + [16.into_dart(), field0.into_into_dart().into_dart()].into_dart() + } + crate::api::api::Message::MoveToRecycleBin(field0) => { + [17.into_dart(), field0.into_into_dart().into_dart()].into_dart() + } + crate::api::api::Message::RecoverChat(field0) => { + [18.into_dart(), field0.into_into_dart().into_dart()].into_dart() + } + crate::api::api::Message::PermanentDelete(field0) => { + [19.into_dart(), field0.into_into_dart().into_dart()].into_dart() + } + crate::api::api::Message::Unschedule => [20.into_dart()].into_dart(), + crate::api::api::Message::UpdateProfile(field0) => { + [21.into_dart(), field0.into_into_dart().into_dart()].into_dart() + } + crate::api::api::Message::UpdateProfileSharing(field0) => { + [22.into_dart(), field0.into_into_dart().into_dart()].into_dart() + } + crate::api::api::Message::ShareProfile(field0) => { + [23.into_dart(), field0.into_into_dart().into_dart()].into_dart() + } + crate::api::api::Message::NotifyAnyways => [24.into_dart()].into_dart(), + crate::api::api::Message::SetTranscriptBackground(field0) => { + [25.into_dart(), field0.into_into_dart().into_dart()].into_dart() } _ => { unimplemented!(""); @@ -24553,754 +30490,722 @@ impl flutter_rust_bridge::IntoDart for FrbWrapper + for FrbWrapper { } -impl flutter_rust_bridge::IntoIntoDart> - for crate::api::api::AttachmentType +impl flutter_rust_bridge::IntoIntoDart> + for crate::api::api::Message { - fn into_into_dart(self) -> FrbWrapper { + fn into_into_dart(self) -> FrbWrapper { self.into() } } // Codec=Dco (DartCObject based), see doc to use other codecs -impl flutter_rust_bridge::IntoDart for FrbWrapper { +impl flutter_rust_bridge::IntoDart for FrbWrapper { fn into_dart(self) -> flutter_rust_bridge::for_generated::DartAbi { [ - self.0.url.into_into_dart().into_dart(), - self.0.session.into_into_dart().into_dart(), - self.0.layout.into_into_dart().into_dart(), - self.0.ld_text.into_into_dart().into_dart(), - self.0.is_live.into_into_dart().into_dart(), - self.0.icon.into_into_dart().into_dart(), + self.0.t.into_into_dart().into_dart(), + self.0.d.into_into_dart().into_dart(), + self.0.bcg.into_into_dart().into_dart(), ] .into_dart() } } impl flutter_rust_bridge::for_generated::IntoDartExceptPrimitive - for FrbWrapper + for FrbWrapper { } -impl flutter_rust_bridge::IntoIntoDart> - for crate::api::api::Balloon +impl flutter_rust_bridge::IntoIntoDart> + for crate::api::api::MessageEdit { - fn into_into_dart(self) -> FrbWrapper { + fn into_into_dart(self) -> FrbWrapper { self.into() } } // Codec=Dco (DartCObject based), see doc to use other codecs -impl flutter_rust_bridge::IntoDart for FrbWrapper { +impl flutter_rust_bridge::IntoDart for FrbWrapper { fn into_dart(self) -> flutter_rust_bridge::for_generated::DartAbi { - match self.0 { - crate::api::api::BalloonLayout::TemplateLayout { - image_subtitle, - image_title, - caption, - secondary_subcaption, - tertiary_subcaption, - subcaption, - class, - } => [ - 0.into_dart(), - image_subtitle.into_into_dart().into_dart(), - image_title.into_into_dart().into_dart(), - caption.into_into_dart().into_dart(), - secondary_subcaption.into_into_dart().into_dart(), - tertiary_subcaption.into_into_dart().into_dart(), - subcaption.into_into_dart().into_dart(), - class.into_into_dart().into_dart(), - ] - .into_dart(), - _ => { - unimplemented!(""); - } - } + [ + self.0.lo.into_into_dart().into_dart(), + self.0.le.into_into_dart().into_dart(), + ] + .into_dart() } } impl flutter_rust_bridge::for_generated::IntoDartExceptPrimitive - for FrbWrapper + for FrbWrapper { } -impl flutter_rust_bridge::IntoIntoDart> - for crate::api::api::BalloonLayout +impl flutter_rust_bridge::IntoIntoDart> + for crate::api::api::MessageEditRange { - fn into_into_dart(self) -> FrbWrapper { + fn into_into_dart(self) -> FrbWrapper { self.into() } } // Codec=Dco (DartCObject based), see doc to use other codecs -impl flutter_rust_bridge::IntoDart for FrbWrapper { +impl flutter_rust_bridge::IntoDart for FrbWrapper { fn into_dart(self) -> flutter_rust_bridge::for_generated::DartAbi { [ - self.0.name.into_into_dart().into_dart(), - self.0.role_id.into_into_dart().into_dart(), - self.0.emoji.into_into_dart().into_dart(), - self.0.system_version.into_into_dart().into_dart(), - self.0.serial_number.into_into_dart().into_dart(), + self.0.id.into_into_dart().into_dart(), + self.0.sender.into_into_dart().into_dart(), + self.0.conversation.into_into_dart().into_dart(), + self.0.message.into_into_dart().into_dart(), + self.0.sent_timestamp.into_into_dart().into_dart(), + self.0.target.into_into_dart().into_dart(), + self.0.send_delivered.into_into_dart().into_dart(), + self.0.verification_failed.into_into_dart().into_dart(), + self.0.certified_context.into_into_dart().into_dart(), ] .into_dart() } } impl flutter_rust_bridge::for_generated::IntoDartExceptPrimitive - for FrbWrapper + for FrbWrapper { } -impl flutter_rust_bridge::IntoIntoDart> - for crate::api::api::BeaconAttributes +impl flutter_rust_bridge::IntoIntoDart> + for crate::api::api::MessageInst { - fn into_into_dart(self) -> FrbWrapper { + fn into_into_dart(self) -> FrbWrapper { self.into() } } // Codec=Dco (DartCObject based), see doc to use other codecs -impl flutter_rust_bridge::IntoDart for FrbWrapper { +impl flutter_rust_bridge::IntoDart for FrbWrapper { fn into_dart(self) -> flutter_rust_bridge::for_generated::DartAbi { - [ - self.0.emoji.into_into_dart().into_dart(), - self.0.name.into_into_dart().into_dart(), - self.0.associated_beacon.into_into_dart().into_dart(), - self.0.role_id.into_into_dart().into_dart(), - ] - .into_dart() + match self.0 { + crate::api::api::MessagePart::Text(field0, field1) => [ + 0.into_dart(), + field0.into_into_dart().into_dart(), + field1.into_into_dart().into_dart(), + ] + .into_dart(), + crate::api::api::MessagePart::Attachment(field0) => { + [1.into_dart(), field0.into_into_dart().into_dart()].into_dart() + } + crate::api::api::MessagePart::Mention(field0, field1) => [ + 2.into_dart(), + field0.into_into_dart().into_dart(), + field1.into_into_dart().into_dart(), + ] + .into_dart(), + crate::api::api::MessagePart::Object(field0) => { + [3.into_dart(), field0.into_into_dart().into_dart()].into_dart() + } + _ => { + unimplemented!(""); + } + } } } impl flutter_rust_bridge::for_generated::IntoDartExceptPrimitive - for FrbWrapper + for FrbWrapper { } -impl flutter_rust_bridge::IntoIntoDart> - for crate::api::api::BeaconNamingRecord +impl flutter_rust_bridge::IntoIntoDart> + for crate::api::api::MessagePart { - fn into_into_dart(self) -> FrbWrapper { + fn into_into_dart(self) -> FrbWrapper { self.into() } } // Codec=Dco (DartCObject based), see doc to use other codecs -impl flutter_rust_bridge::IntoDart for FrbWrapper { +impl flutter_rust_bridge::IntoDart for FrbWrapper { fn into_dart(self) -> flutter_rust_bridge::for_generated::DartAbi { - [ - self.0.version.into_into_dart().into_dart(), - self.0.receipt.into_into_dart().into_dart(), - self.0.sender.into_into_dart().into_dart(), - self.0.target.into_into_dart().into_dart(), - self.0.uuid.into_into_dart().into_dart(), - self.0.token.into_into_dart().into_dart(), - ] - .into_dart() + [self.0 .0.into_into_dart().into_dart()].into_dart() } } impl flutter_rust_bridge::for_generated::IntoDartExceptPrimitive - for FrbWrapper + for FrbWrapper { } -impl flutter_rust_bridge::IntoIntoDart> - for crate::api::api::CertifiedContext +impl flutter_rust_bridge::IntoIntoDart> + for crate::api::api::MessageParts { - fn into_into_dart(self) -> FrbWrapper { + fn into_into_dart(self) -> FrbWrapper { self.into() } } // Codec=Dco (DartCObject based), see doc to use other codecs -impl flutter_rust_bridge::IntoDart for FrbWrapper { +impl flutter_rust_bridge::IntoDart for FrbWrapper { fn into_dart(self) -> flutter_rust_bridge::for_generated::DartAbi { [ - self.0.new_participants.into_into_dart().into_dart(), - self.0.group_version.into_into_dart().into_dart(), + self.0.unk1.into_into_dart().into_dart(), + self.0.subject.into_into_dart().into_dart(), + self.0.text.into_into_dart().into_dart(), + self.0.attributed_body.into_into_dart().into_dart(), + self.0.balloon_bundle_id.into_into_dart().into_dart(), + self.0.payload_data.into_into_dart().into_dart(), + self.0.message_summary_info.into_into_dart().into_dart(), + self.0.effect.into_into_dart().into_dart(), + self.0.date_read.into_into_dart().into_dart(), + self.0.unk10.into_into_dart().into_dart(), + self.0.unk11.into_into_dart().into_dart(), + self.0.date_delivered.into_into_dart().into_dart(), + self.0.unk14.into_into_dart().into_dart(), + self.0.associated_message_type.into_into_dart().into_dart(), + self.0.associated_message_guid.into_into_dart().into_dart(), + self.0 + .associated_message_range_location + .into_into_dart() + .into_dart(), + self.0 + .associated_message_range_length + .into_into_dart() + .into_dart(), ] .into_dart() } } impl flutter_rust_bridge::for_generated::IntoDartExceptPrimitive - for FrbWrapper + for FrbWrapper { } -impl flutter_rust_bridge::IntoIntoDart> - for crate::api::api::ChangeParticipantMessage +impl flutter_rust_bridge::IntoIntoDart> + for crate::api::api::MessageProto { - fn into_into_dart(self) -> FrbWrapper { + fn into_into_dart(self) -> FrbWrapper { self.into() } } // Codec=Dco (DartCObject based), see doc to use other codecs -impl flutter_rust_bridge::IntoDart for FrbWrapper { +impl flutter_rust_bridge::IntoDart for FrbWrapper { fn into_dart(self) -> flutter_rust_bridge::for_generated::DartAbi { - [self.0.unk1.into_into_dart().into_dart()].into_dart() + [self.0.reply.into_into_dart().into_dart()].into_dart() } } impl flutter_rust_bridge::for_generated::IntoDartExceptPrimitive - for FrbWrapper + for FrbWrapper { } -impl flutter_rust_bridge::IntoIntoDart> - for crate::api::api::ChatProto +impl flutter_rust_bridge::IntoIntoDart> + for crate::api::api::MessageProto2 { - fn into_into_dart(self) -> FrbWrapper { + fn into_into_dart(self) -> FrbWrapper { self.into() } } // Codec=Dco (DartCObject based), see doc to use other codecs -impl flutter_rust_bridge::IntoDart for FrbWrapper { +impl flutter_rust_bridge::IntoDart for FrbWrapper { fn into_dart(self) -> flutter_rust_bridge::for_generated::DartAbi { [ - self.0.cm.into_into_dart().into_dart(), - self.0.lqa.into_into_dart().into_dart(), + self.0.unk2.into_into_dart().into_dart(), + self.0.unk3.into_into_dart().into_dart(), ] .into_dart() } } impl flutter_rust_bridge::for_generated::IntoDartExceptPrimitive - for FrbWrapper + for FrbWrapper { } -impl flutter_rust_bridge::IntoIntoDart> - for crate::api::api::CloudAttachment +impl flutter_rust_bridge::IntoIntoDart> + for crate::api::api::MessageProto3 { - fn into_into_dart(self) -> FrbWrapper { + fn into_into_dart(self) -> FrbWrapper { self.into() } } // Codec=Dco (DartCObject based), see doc to use other codecs -impl flutter_rust_bridge::IntoDart for FrbWrapper { +impl flutter_rust_bridge::IntoDart for FrbWrapper { fn into_dart(self) -> flutter_rust_bridge::for_generated::DartAbi { [ - self.0.style.into_into_dart().into_dart(), - self.0.is_filtered.into_into_dart().into_dart(), - self.0.successful_query.into_into_dart().into_dart(), - self.0.state.into_into_dart().into_dart(), - self.0.chat_identifier.into_into_dart().into_dart(), + self.0.associated_message_emoji.into_into_dart().into_dart(), + self.0.service.into_into_dart().into_dart(), + self.0.schedule_type.into_into_dart().into_dart(), + self.0.schedule_state.into_into_dart().into_dart(), self.0.group_id.into_into_dart().into_dart(), - self.0.service_name.into_into_dart().into_dart(), - self.0.original_group_id.into_into_dart().into_dart(), - self.0.properties.into_into_dart().into_dart(), - self.0.participants.into_into_dart().into_dart(), - self.0.prop001.into_into_dart().into_dart(), self.0 - .last_read_message_timestamp + .sent_or_received_off_grid .into_into_dart() .into_dart(), - self.0.last_addressed_handle.into_into_dart().into_dart(), - self.0.guid.into_into_dart().into_dart(), - self.0.display_name.into_into_dart().into_dart(), - self.0.proto001.into_into_dart().into_dart(), - self.0.group_photo_guid.into_into_dart().into_dart(), - self.0.group_photo.into_into_dart().into_dart(), ] .into_dart() } } impl flutter_rust_bridge::for_generated::IntoDartExceptPrimitive - for FrbWrapper + for FrbWrapper { } -impl flutter_rust_bridge::IntoIntoDart> - for crate::api::api::CloudChat +impl flutter_rust_bridge::IntoIntoDart> + for crate::api::api::MessageProto4 { - fn into_into_dart(self) -> FrbWrapper { + fn into_into_dart(self) -> FrbWrapper { self.into() } } // Codec=Dco (DartCObject based), see doc to use other codecs -impl flutter_rust_bridge::IntoDart for FrbWrapper { +impl flutter_rust_bridge::IntoDart for FrbWrapper { fn into_dart(self) -> flutter_rust_bridge::for_generated::DartAbi { [ - self.0.utm.into_into_dart().into_dart(), - self.0.r#type.into_into_dart().into_dart(), - self.0.error.into_into_dart().into_dart(), - self.0.chat_id.into_into_dart().into_dart(), - self.0.sender.into_into_dart().into_dart(), - self.0.time.into_into_dart().into_dart(), - self.0.msg_proto_2.into_into_dart().into_dart(), - self.0.destination_caller_id.into_into_dart().into_dart(), - self.0.msg_proto.into_into_dart().into_dart(), - self.0.flags.into_into_dart().into_dart(), - self.0.guid.into_into_dart().into_dart(), - self.0.msg_proto_3.into_into_dart().into_dart(), - self.0.service.into_into_dart().into_dart(), - self.0.msg_proto_4.into_into_dart().into_dart(), + self.0.ams.into_into_dart().into_dart(), + self.0.ampt.into_into_dart().into_dart(), + self.0.amc.into_into_dart().into_dart(), + self.0.amb.into_into_dart().into_dart(), + self.0.amd.into_into_dart().into_dart(), + self.0.ec.into_into_dart().into_dart(), + self.0.ep.into_into_dart().into_dart(), + self.0.otr.into_into_dart().into_dart(), + self.0.ust.into_into_dart().into_dart(), + self.0.rp.into_into_dart().into_dart(), + self.0.hbr.into_into_dart().into_dart(), + self.0.oui.into_into_dart().into_dart(), + self.0.osn.into_into_dart().into_dart(), + self.0.euh.into_into_dart().into_dart(), ] .into_dart() } } impl flutter_rust_bridge::for_generated::IntoDartExceptPrimitive - for FrbWrapper + for FrbWrapper { } -impl flutter_rust_bridge::IntoIntoDart> - for crate::api::api::CloudMessage +impl flutter_rust_bridge::IntoIntoDart> + for crate::api::api::MessageSummaryInfo { - fn into_into_dart(self) -> FrbWrapper { + fn into_into_dart(self) -> FrbWrapper { self.into() } } // Codec=Dco (DartCObject based), see doc to use other codecs -impl flutter_rust_bridge::IntoDart for FrbWrapper { +impl flutter_rust_bridge::IntoDart for FrbWrapper { fn into_dart(self) -> flutter_rust_bridge::for_generated::DartAbi { - [ - self.0.messages_summary.into_into_dart().into_dart(), - self.0.chat_summary.into_into_dart().into_dart(), - self.0.attachment_summary.into_into_dart().into_dart(), - ] - .into_dart() + match self.0 { + crate::api::api::MessageTarget::Token(field0) => { + [0.into_dart(), field0.into_into_dart().into_dart()].into_dart() + } + crate::api::api::MessageTarget::Uuid(field0) => { + [1.into_dart(), field0.into_into_dart().into_dart()].into_dart() + } + _ => { + unimplemented!(""); + } + } } } impl flutter_rust_bridge::for_generated::IntoDartExceptPrimitive - for FrbWrapper + for FrbWrapper { } -impl flutter_rust_bridge::IntoIntoDart> - for crate::api::api::CloudMessageSummary +impl flutter_rust_bridge::IntoIntoDart> + for crate::api::api::MessageTarget { - fn into_into_dart(self) -> FrbWrapper { + fn into_into_dart(self) -> FrbWrapper { self.into() } } // Codec=Dco (DartCObject based), see doc to use other codecs -impl flutter_rust_bridge::IntoDart for FrbWrapper { +impl flutter_rust_bridge::IntoDart for FrbWrapper { fn into_dart(self) -> flutter_rust_bridge::for_generated::DartAbi { - [self.0.uri.into_into_dart().into_dart()].into_dart() + match self.0 { + crate::api::api::MessageType::IMessage => [0.into_dart()].into_dart(), + crate::api::api::MessageType::SMS { + is_phone, + using_number, + from_handle, + } => [ + 1.into_dart(), + is_phone.into_into_dart().into_dart(), + using_number.into_into_dart().into_dart(), + from_handle.into_into_dart().into_dart(), + ] + .into_dart(), + _ => { + unimplemented!(""); + } + } } } impl flutter_rust_bridge::for_generated::IntoDartExceptPrimitive - for FrbWrapper + for FrbWrapper { } -impl flutter_rust_bridge::IntoIntoDart> - for crate::api::api::CloudParticipant +impl flutter_rust_bridge::IntoIntoDart> + for crate::api::api::MessageType { - fn into_into_dart(self) -> FrbWrapper { + fn into_into_dart(self) -> FrbWrapper { self.into() } } // Codec=Dco (DartCObject based), see doc to use other codecs -impl flutter_rust_bridge::IntoDart for FrbWrapper { +impl flutter_rust_bridge::IntoDart for FrbWrapper { fn into_dart(self) -> flutter_rust_bridge::for_generated::DartAbi { [ - self.0.gpufc.into_into_dart().into_dart(), - self.0.pv.into_into_dart().into_dart(), - self.0 - .number_of_times_respondedto_thread - .into_into_dart() - .into_dart(), - self.0.should_force_to_sms.into_into_dart().into_dart(), - self.0.last_seen_message_guid.into_into_dart().into_dart(), - self.0.message_handshake_state.into_into_dart().into_dart(), - self.0.legacy_group_identifiers.into_into_dart().into_dart(), - self.0.group_photo_guid.into_into_dart().into_dart(), - self.0.last_modification_date.into_into_dart().into_dart(), + self.0.mmcs_signature_hex.into_into_dart().into_dart(), + self.0.mmcs_owner.into_into_dart().into_dart(), + self.0.mmcs_url.into_into_dart().into_dart(), + self.0.decryption_key.into_into_dart().into_dart(), + self.0.inline_attachment.into_into_dart().into_dart(), + self.0.message_part.into_into_dart().into_dart(), + self.0.file_size.into_into_dart().into_dart(), + self.0.uti_type.into_into_dart().into_dart(), + self.0.mime_type.into_into_dart().into_dart(), + self.0.name.into_into_dart().into_dart(), ] .into_dart() } } impl flutter_rust_bridge::for_generated::IntoDartExceptPrimitive - for FrbWrapper + for FrbWrapper { } -impl flutter_rust_bridge::IntoIntoDart> - for crate::api::api::CloudProp +impl flutter_rust_bridge::IntoIntoDart> + for crate::api::api::MMCSAttachmentMeta { - fn into_into_dart(self) -> FrbWrapper { + fn into_into_dart(self) -> FrbWrapper { self.into() } } // Codec=Dco (DartCObject based), see doc to use other codecs -impl flutter_rust_bridge::IntoDart for FrbWrapper { +impl flutter_rust_bridge::IntoDart for FrbWrapper { fn into_dart(self) -> flutter_rust_bridge::for_generated::DartAbi { - [self.0.syndication_type.into_into_dart().into_dart()].into_dart() + [ + self.0.signature.into_into_dart().into_dart(), + self.0.object.into_into_dart().into_dart(), + self.0.url.into_into_dart().into_dart(), + self.0.key.into_into_dart().into_dart(), + self.0.size.into_into_dart().into_dart(), + ] + .into_dart() } } impl flutter_rust_bridge::for_generated::IntoDartExceptPrimitive - for FrbWrapper + for FrbWrapper { } -impl flutter_rust_bridge::IntoIntoDart> - for crate::api::api::CloudProp001 +impl flutter_rust_bridge::IntoIntoDart> + for crate::api::api::MMCSFile { - fn into_into_dart(self) -> FrbWrapper { + fn into_into_dart(self) -> FrbWrapper { self.into() } } // Codec=Dco (DartCObject based), see doc to use other codecs -impl flutter_rust_bridge::IntoDart for FrbWrapper { +impl flutter_rust_bridge::IntoDart for crate::api::api::MMCSTransferProgress { fn into_dart(self) -> flutter_rust_bridge::for_generated::DartAbi { [ - self.0.participants.into_into_dart().into_dart(), - self.0.cv_name.into_into_dart().into_dart(), - self.0.sender_guid.into_into_dart().into_dart(), - self.0.after_guid.into_into_dart().into_dart(), + self.prog.into_into_dart().into_dart(), + self.total.into_into_dart().into_dart(), + self.file.into_into_dart().into_dart(), ] .into_dart() } } impl flutter_rust_bridge::for_generated::IntoDartExceptPrimitive - for FrbWrapper + for crate::api::api::MMCSTransferProgress { } -impl flutter_rust_bridge::IntoIntoDart> - for crate::api::api::ConversationData +impl flutter_rust_bridge::IntoIntoDart + for crate::api::api::MMCSTransferProgress { - fn into_into_dart(self) -> FrbWrapper { - self.into() + fn into_into_dart(self) -> crate::api::api::MMCSTransferProgress { + self } } // Codec=Dco (DartCObject based), see doc to use other codecs -impl flutter_rust_bridge::IntoDart for crate::api::api::DartBeacon { +impl flutter_rust_bridge::IntoDart for FrbWrapper { fn into_dart(self) -> flutter_rust_bridge::for_generated::DartAbi { [ - self.naming.into_into_dart().into_dart(), - self.last_report.into_into_dart().into_dart(), - self.product_id.into_into_dart().into_dart(), - self.battery_level.into_into_dart().into_dart(), - self.vendor_id.into_into_dart().into_dart(), - self.model.into_into_dart().into_dart(), - self.system_version.into_into_dart().into_dart(), - self.id.into_into_dart().into_dart(), - self.shared.into_into_dart().into_dart(), + self.0 + .top_background_color_description + .into_into_dart() + .into_dart(), + self.0 + .background_color_description + .into_into_dart() + .into_dart(), + self.0.initials.into_into_dart().into_dart(), + self.0 + .monogram_supported_for_name + .into_into_dart() + .into_dart(), ] .into_dart() } } -impl flutter_rust_bridge::for_generated::IntoDartExceptPrimitive for crate::api::api::DartBeacon {} -impl flutter_rust_bridge::IntoIntoDart - for crate::api::api::DartBeacon +impl flutter_rust_bridge::for_generated::IntoDartExceptPrimitive + for FrbWrapper { - fn into_into_dart(self) -> crate::api::api::DartBeacon { - self +} +impl flutter_rust_bridge::IntoIntoDart> + for crate::api::api::MonogramData +{ + fn into_into_dart(self) -> FrbWrapper { + self.into() } } // Codec=Dco (DartCObject based), see doc to use other codecs -impl flutter_rust_bridge::IntoDart for crate::api::api::DartBeaconShareInfo { +impl flutter_rust_bridge::IntoDart for FrbWrapper { fn into_dart(self) -> flutter_rust_bridge::for_generated::DartAbi { [ - self.share_id.into_into_dart().into_dart(), - self.acceptance_state.into_into_dart().into_dart(), - self.owner_handle.into_into_dart().into_dart(), + self.0.target.into_into_dart().into_dart(), + self.0.recoverable_delete_date.into_into_dart().into_dart(), ] .into_dart() } } impl flutter_rust_bridge::for_generated::IntoDartExceptPrimitive - for crate::api::api::DartBeaconShareInfo + for FrbWrapper { } -impl flutter_rust_bridge::IntoIntoDart - for crate::api::api::DartBeaconShareInfo +impl flutter_rust_bridge::IntoIntoDart> + for crate::api::api::MoveToRecycleBinMessage { - fn into_into_dart(self) -> crate::api::api::DartBeaconShareInfo { + fn into_into_dart(self) -> FrbWrapper { + self.into() + } +} +// Codec=Dco (DartCObject based), see doc to use other codecs +impl flutter_rust_bridge::IntoDart for crate::api::api::MyAsyncRuntime { + fn into_dart(self) -> flutter_rust_bridge::for_generated::DartAbi { + Vec::::new().into_dart() + } +} +impl flutter_rust_bridge::for_generated::IntoDartExceptPrimitive + for crate::api::api::MyAsyncRuntime +{ +} +impl flutter_rust_bridge::IntoIntoDart + for crate::api::api::MyAsyncRuntime +{ + fn into_into_dart(self) -> crate::api::api::MyAsyncRuntime { self } } // Codec=Dco (DartCObject based), see doc to use other codecs -impl flutter_rust_bridge::IntoDart for FrbWrapper { +impl flutter_rust_bridge::IntoDart for FrbWrapper { fn into_dart(self) -> flutter_rust_bridge::for_generated::DartAbi { - match self.0 { - crate::api::api::DeleteTarget::Chat(field0) => { - [0.into_dart(), field0.into_into_dart().into_dart()].into_dart() - } - crate::api::api::DeleteTarget::Messages(field0) => { - [1.into_dart(), field0.into_into_dart().into_dart()].into_dart() - } - _ => { - unimplemented!(""); - } - } + [ + self.0.parts.into_into_dart().into_dart(), + self.0.effect.into_into_dart().into_dart(), + self.0.reply_guid.into_into_dart().into_dart(), + self.0.reply_part.into_into_dart().into_dart(), + self.0.service.into_into_dart().into_dart(), + self.0.subject.into_into_dart().into_dart(), + self.0.app.into_into_dart().into_dart(), + self.0.link_meta.into_into_dart().into_dart(), + self.0.voice.into_into_dart().into_dart(), + self.0.scheduled.into_into_dart().into_dart(), + self.0.embedded_profile.into_into_dart().into_dart(), + ] + .into_dart() } } impl flutter_rust_bridge::for_generated::IntoDartExceptPrimitive - for FrbWrapper + for FrbWrapper { } -impl flutter_rust_bridge::IntoIntoDart> - for crate::api::api::DeleteTarget +impl flutter_rust_bridge::IntoIntoDart> + for crate::api::api::NormalMessage { - fn into_into_dart(self) -> FrbWrapper { + fn into_into_dart(self) -> FrbWrapper { self.into() } } // Codec=Dco (DartCObject based), see doc to use other codecs -impl flutter_rust_bridge::IntoDart for crate::api::api::DeviceInfo { +impl flutter_rust_bridge::IntoDart for FrbWrapper { fn into_dart(self) -> flutter_rust_bridge::for_generated::DartAbi { [ - self.name.into_into_dart().into_dart(), - self.serial.into_into_dart().into_dart(), - self.os_version.into_into_dart().into_dart(), - self.encoded_data.into_into_dart().into_dart(), + self.0.text.into_into_dart().into_dart(), + self.0.ranges.into_into_dart().into_dart(), ] .into_dart() } } -impl flutter_rust_bridge::for_generated::IntoDartExceptPrimitive for crate::api::api::DeviceInfo {} -impl flutter_rust_bridge::IntoIntoDart - for crate::api::api::DeviceInfo +impl flutter_rust_bridge::for_generated::IntoDartExceptPrimitive + for FrbWrapper { - fn into_into_dart(self) -> crate::api::api::DeviceInfo { - self +} +impl flutter_rust_bridge::IntoIntoDart> + for crate::api::api::NSAttributedString +{ + fn into_into_dart(self) -> FrbWrapper { + self.into() } } // Codec=Dco (DartCObject based), see doc to use other codecs -impl flutter_rust_bridge::IntoDart for FrbWrapper { +impl flutter_rust_bridge::IntoDart for FrbWrapper { fn into_dart(self) -> flutter_rust_bridge::for_generated::DartAbi { - [ - self.0.tuuid.into_into_dart().into_dart(), - self.0.edit_part.into_into_dart().into_dart(), - self.0.new_parts.into_into_dart().into_dart(), - ] - .into_dart() + match self.0 { + crate::api::api::NSDictionaryClass::NSDictionary => 0.into_dart(), + crate::api::api::NSDictionaryClass::NSMutableDictionary => 1.into_dart(), + _ => unreachable!(), + } } } impl flutter_rust_bridge::for_generated::IntoDartExceptPrimitive - for FrbWrapper + for FrbWrapper { } -impl flutter_rust_bridge::IntoIntoDart> - for crate::api::api::EditMessage +impl flutter_rust_bridge::IntoIntoDart> + for crate::api::api::NSDictionaryClass { - fn into_into_dart(self) -> FrbWrapper { + fn into_into_dart(self) -> FrbWrapper { self.into() } } // Codec=Dco (DartCObject based), see doc to use other codecs -impl flutter_rust_bridge::IntoDart for FrbWrapper { +impl flutter_rust_bridge::IntoDart for FrbWrapper { fn into_dart(self) -> flutter_rust_bridge::for_generated::DartAbi { - [ - self.0.for_uuid.into_into_dart().into_dart(), - self.0.status.into_into_dart().into_dart(), - self.0.status_str.into_into_dart().into_dart(), - ] - .into_dart() + [self.0 .0.into_into_dart().into_dart()].into_dart() } } impl flutter_rust_bridge::for_generated::IntoDartExceptPrimitive - for FrbWrapper + for FrbWrapper { } -impl flutter_rust_bridge::IntoIntoDart> - for crate::api::api::ErrorMessage +impl flutter_rust_bridge::IntoIntoDart> + for crate::api::api::NSDictionaryTypedCoder { - fn into_into_dart(self) -> FrbWrapper { + fn into_into_dart(self) -> FrbWrapper { self.into() } } // Codec=Dco (DartCObject based), see doc to use other codecs -impl flutter_rust_bridge::IntoDart for FrbWrapper { +impl flutter_rust_bridge::IntoDart for FrbWrapper { fn into_dart(self) -> flutter_rust_bridge::for_generated::DartAbi { - [ - self.0.name.into_into_dart().into_dart(), - self.0.app_id.into_into_dart().into_dart(), - self.0.bundle_id.into_into_dart().into_dart(), - self.0.balloon.into_into_dart().into_dart(), - ] - .into_dart() + [self.0 .0.into_into_dart().into_dart()].into_dart() } } impl flutter_rust_bridge::for_generated::IntoDartExceptPrimitive - for FrbWrapper + for FrbWrapper { } -impl flutter_rust_bridge::IntoIntoDart> - for crate::api::api::ExtensionApp +impl flutter_rust_bridge::IntoIntoDart> + for crate::api::api::NSNumber { - fn into_into_dart(self) -> FrbWrapper { + fn into_into_dart(self) -> FrbWrapper { self.into() } } // Codec=Dco (DartCObject based), see doc to use other codecs -impl flutter_rust_bridge::IntoDart for crate::api::api::FFIFilePackager { +impl flutter_rust_bridge::IntoDart for FrbWrapper { fn into_dart(self) -> flutter_rust_bridge::for_generated::DartAbi { - Vec::::new().into_dart() + [self.0 .0.into_into_dart().into_dart()].into_dart() } } impl flutter_rust_bridge::for_generated::IntoDartExceptPrimitive - for crate::api::api::FFIFilePackager + for FrbWrapper { } -impl flutter_rust_bridge::IntoIntoDart - for crate::api::api::FFIFilePackager +impl flutter_rust_bridge::IntoIntoDart> + for crate::api::api::NSString { - fn into_into_dart(self) -> crate::api::api::FFIFilePackager { - self + fn into_into_dart(self) -> FrbWrapper { + self.into() } } // Codec=Dco (DartCObject based), see doc to use other codecs -impl flutter_rust_bridge::IntoDart for FrbWrapper { +impl flutter_rust_bridge::IntoDart for FrbWrapper { fn into_dart(self) -> flutter_rust_bridge::for_generated::DartAbi { [ - self.0.create_timestamp.into_into_dart().into_dart(), - self.0.expires.into_into_dart().into_dart(), - self.0.id.into_into_dart().into_dart(), - self.0 - .invitation_accepted_handles - .into_into_dart() - .into_dart(), - self.0.invitation_from_handles.into_into_dart().into_dart(), - self.0.is_from_messages.into_into_dart().into_dart(), - self.0.offer_id.into_into_dart().into_dart(), - self.0.only_in_event.into_into_dart().into_dart(), - self.0.person_id_hash.into_into_dart().into_dart(), - self.0.secure_locations_capable.into_into_dart().into_dart(), - self.0 - .shallow_or_live_secure_locations_capable - .into_into_dart() - .into_dart(), - self.0.source.into_into_dart().into_dart(), - self.0.tk_permission.into_into_dart().into_dart(), - self.0.update_timestamp.into_into_dart().into_dart(), - self.0 - .fallback_to_legacy_allowed - .into_into_dart() - .into_dart(), - self.0.opted_not_to_share.into_into_dart().into_dart(), - self.0.last_location.into_into_dart().into_dart(), - self.0.locate_in_progress.into_into_dart().into_dart(), + self.0.base.into_into_dart().into_dart(), + self.0.relative.into_into_dart().into_dart(), ] .into_dart() } } impl flutter_rust_bridge::for_generated::IntoDartExceptPrimitive - for FrbWrapper + for FrbWrapper { } -impl flutter_rust_bridge::IntoIntoDart> - for crate::api::api::Follow +impl flutter_rust_bridge::IntoIntoDart> + for crate::api::api::NSURL { - fn into_into_dart(self) -> FrbWrapper { + fn into_into_dart(self) -> FrbWrapper { self.into() } } // Codec=Dco (DartCObject based), see doc to use other codecs -impl flutter_rust_bridge::IntoDart for FrbWrapper { +impl flutter_rust_bridge::IntoDart for FrbWrapper { fn into_dart(self) -> flutter_rust_bridge::for_generated::DartAbi { - [ - self.0.device_model.into_into_dart().into_dart(), - self.0.low_power_mode.into_into_dart().into_dart(), - self.0.passcode_length.into_into_dart().into_dart(), - self.0.id.into_into_dart().into_dart(), - self.0.battery_status.into_into_dart().into_dart(), - self.0.lost_mode_capable.into_into_dart().into_dart(), - self.0.battery_level.into_into_dart().into_dart(), - self.0.location_enabled.into_into_dart().into_dart(), - self.0.is_considered_accessory.into_into_dart().into_dart(), - self.0.location.into_into_dart().into_dart(), - self.0.model_display_name.into_into_dart().into_dart(), - self.0.device_color.into_into_dart().into_dart(), - self.0.activation_locked.into_into_dart().into_dart(), - self.0.rm2_state.into_into_dart().into_dart(), - self.0.loc_found_enabled.into_into_dart().into_dart(), - self.0.nwd.into_into_dart().into_dart(), - self.0.device_status.into_into_dart().into_dart(), - self.0.fmly_share.into_into_dart().into_dart(), - self.0.features.into_into_dart().into_dart(), - self.0.this_device.into_into_dart().into_dart(), - self.0.lost_mode_enabled.into_into_dart().into_dart(), - self.0.device_display_name.into_into_dart().into_dart(), - self.0.name.into_into_dart().into_dart(), - self.0.can_wipe_after_lock.into_into_dart().into_dart(), - self.0.is_mac.into_into_dart().into_dart(), - self.0.raw_device_model.into_into_dart().into_dart(), - self.0.ba_uuid.into_into_dart().into_dart(), - self.0.device_discovery_id.into_into_dart().into_dart(), - self.0.scd.into_into_dart().into_dart(), - self.0.location_capable.into_into_dart().into_dart(), - self.0.wipe_in_progress.into_into_dart().into_dart(), - self.0.dark_wake.into_into_dart().into_dart(), - self.0.device_with_you.into_into_dart().into_dart(), - self.0.max_msg_char.into_into_dart().into_dart(), - self.0.device_class.into_into_dart().into_dart(), - ] - .into_dart() + match self.0 { + crate::api::api::NumOrString::Num(field0) => { + [0.into_dart(), field0.into_into_dart().into_dart()].into_dart() + } + crate::api::api::NumOrString::String(field0) => { + [1.into_dart(), field0.into_into_dart().into_dart()].into_dart() + } + crate::api::api::NumOrString::Bool(field0) => { + [2.into_dart(), field0.into_into_dart().into_dart()].into_dart() + } + _ => { + unimplemented!(""); + } + } } } impl flutter_rust_bridge::for_generated::IntoDartExceptPrimitive - for FrbWrapper + for FrbWrapper { } -impl flutter_rust_bridge::IntoIntoDart> - for crate::api::api::FoundDevice +impl flutter_rust_bridge::IntoIntoDart> + for crate::api::api::NumOrString { - fn into_into_dart(self) -> FrbWrapper { + fn into_into_dart(self) -> FrbWrapper { self.into() } } // Codec=Dco (DartCObject based), see doc to use other codecs -impl flutter_rust_bridge::IntoDart for FrbWrapper { +impl flutter_rust_bridge::IntoDart for FrbWrapper { fn into_dart(self) -> flutter_rust_bridge::for_generated::DartAbi { [ - self.0.nickname.into_into_dart().into_dart(), - self.0.handle.into_into_dart().into_dart(), + self.0.participants.into_into_dart().into_dart(), + self.0.group_id.into_into_dart().into_dart(), + self.0.guid.into_into_dart().into_dart(), + self.0.delete_incoming_messages.into_into_dart().into_dart(), + self.0.was_reported_as_junk.into_into_dart().into_dart(), ] .into_dart() } } impl flutter_rust_bridge::for_generated::IntoDartExceptPrimitive - for FrbWrapper + for FrbWrapper { } -impl flutter_rust_bridge::IntoIntoDart> - for crate::api::api::FTMember +impl flutter_rust_bridge::IntoIntoDart> + for crate::api::api::OperatedChat { - fn into_into_dart(self) -> FrbWrapper { + fn into_into_dart(self) -> FrbWrapper { self.into() } } // Codec=Dco (DartCObject based), see doc to use other codecs -impl flutter_rust_bridge::IntoDart for FrbWrapper { +impl flutter_rust_bridge::IntoDart for FrbWrapper { fn into_dart(self) -> flutter_rust_bridge::for_generated::DartAbi { match self.0 { - crate::api::api::FTMessage::LetMeInRequest(field0) => { - [0.into_dart(), field0.into_into_dart().into_dart()].into_dart() - } - crate::api::api::FTMessage::LinkChanged { guid } => { - [1.into_dart(), guid.into_into_dart().into_dart()].into_dart() - } - crate::api::api::FTMessage::JoinEvent { - guid, - participant, - handle, - ring, - } => [ - 2.into_dart(), - guid.into_into_dart().into_dart(), - participant.into_into_dart().into_dart(), - handle.into_into_dart().into_dart(), - ring.into_into_dart().into_dart(), - ] - .into_dart(), - crate::api::api::FTMessage::AddMembers { - guid, - members, - ring, - } => [ - 3.into_dart(), - guid.into_into_dart().into_dart(), - members.into_into_dart().into_dart(), - ring.into_into_dart().into_dart(), - ] - .into_dart(), - crate::api::api::FTMessage::RemoveMembers { guid, members } => [ - 4.into_dart(), - guid.into_into_dart().into_dart(), - members.into_into_dart().into_dart(), - ] - .into_dart(), - crate::api::api::FTMessage::LeaveEvent { - guid, - participant, - handle, + crate::api::api::PartExtension::Sticker { + msg_width, + rotation, + sai, + scale, + update, + sli, + normalized_x, + normalized_y, + version, + hash, + safi, + effect_type, + sticker_id, } => [ - 5.into_dart(), - guid.into_into_dart().into_dart(), - participant.into_into_dart().into_dart(), - handle.into_into_dart().into_dart(), + 0.into_dart(), + msg_width.into_into_dart().into_dart(), + rotation.into_into_dart().into_dart(), + sai.into_into_dart().into_dart(), + scale.into_into_dart().into_dart(), + update.into_into_dart().into_dart(), + sli.into_into_dart().into_dart(), + normalized_x.into_into_dart().into_dart(), + normalized_y.into_into_dart().into_dart(), + version.into_into_dart().into_dart(), + hash.into_into_dart().into_dart(), + safi.into_into_dart().into_dart(), + effect_type.into_into_dart().into_dart(), + sticker_id.into_into_dart().into_dart(), ] .into_dart(), - crate::api::api::FTMessage::Ring { guid } => { - [6.into_dart(), guid.into_into_dart().into_dart()].into_dart() - } - crate::api::api::FTMessage::Decline { guid } => { - [7.into_dart(), guid.into_into_dart().into_dart()].into_dart() - } - crate::api::api::FTMessage::RespondedElsewhere { guid } => { - [8.into_dart(), guid.into_into_dart().into_dart()].into_dart() - } _ => { unimplemented!(""); } @@ -25308,440 +31213,510 @@ impl flutter_rust_bridge::IntoDart for FrbWrapper { } } impl flutter_rust_bridge::for_generated::IntoDartExceptPrimitive - for FrbWrapper + for FrbWrapper { } -impl flutter_rust_bridge::IntoIntoDart> - for crate::api::api::FTMessage +impl flutter_rust_bridge::IntoIntoDart> + for crate::api::api::PartExtension { - fn into_into_dart(self) -> FrbWrapper { + fn into_into_dart(self) -> FrbWrapper { self.into() } } // Codec=Dco (DartCObject based), see doc to use other codecs -impl flutter_rust_bridge::IntoDart for FrbWrapper { +impl flutter_rust_bridge::IntoDart for FrbWrapper { fn into_dart(self) -> flutter_rust_bridge::for_generated::DartAbi { - match self.0 { - crate::api::api::FTMode::Outgoing => 0.into_dart(), - crate::api::api::FTMode::Incoming => 1.into_dart(), - crate::api::api::FTMode::Missed => 2.into_dart(), - crate::api::api::FTMode::MissedOutgoing => 3.into_dart(), - _ => unreachable!(), - } + [ + self.0.cdat.into_into_dart().into_dart(), + self.0.mdat.into_into_dart().into_dart(), + self.0.agrp.into_into_dart().into_dart(), + self.0.labl.into_into_dart().into_dart(), + self.0.data.into_into_dart().into_dart(), + self.0.atag.into_into_dart().into_dart(), + self.0.klbl.into_into_dart().into_dart(), + ] + .into_dart() } } impl flutter_rust_bridge::for_generated::IntoDartExceptPrimitive - for FrbWrapper + for FrbWrapper { } -impl flutter_rust_bridge::IntoIntoDart> - for crate::api::api::FTMode +impl flutter_rust_bridge::IntoIntoDart> + for crate::api::api::Passkey { - fn into_into_dart(self) -> FrbWrapper { + fn into_into_dart(self) -> FrbWrapper { self.into() } } // Codec=Dco (DartCObject based), see doc to use other codecs -impl flutter_rust_bridge::IntoDart for FrbWrapper { +impl flutter_rust_bridge::IntoDart for FrbWrapper { + fn into_dart(self) -> flutter_rust_bridge::for_generated::DartAbi { + [self.0.domain.into_into_dart().into_dart()].into_dart() + } +} +impl flutter_rust_bridge::for_generated::IntoDartExceptPrimitive + for FrbWrapper +{ +} +impl flutter_rust_bridge::IntoIntoDart> + for crate::api::api::PasswordManagerAltDomain +{ + fn into_into_dart(self) -> FrbWrapper { + self.into() + } +} +// Codec=Dco (DartCObject based), see doc to use other codecs +impl flutter_rust_bridge::IntoDart for FrbWrapper { fn into_dart(self) -> flutter_rust_bridge::for_generated::DartAbi { [ - self.0.token.into_into_dart().into_dart(), - self.0.handle.into_into_dart().into_dart(), - self.0.participant_id.into_into_dart().into_dart(), - self.0.last_join_date.into_into_dart().into_dart(), - self.0.active.into_into_dart().into_dart(), + self.0.cdat.into_into_dart().into_dart(), + self.0.mdat.into_into_dart().into_dart(), + self.0.srvr.into_into_dart().into_dart(), + self.0.acct.into_into_dart().into_dart(), + self.0.agrp.into_into_dart().into_dart(), + self.0.data.into_into_dart().into_dart(), ] .into_dart() } } impl flutter_rust_bridge::for_generated::IntoDartExceptPrimitive - for FrbWrapper + for FrbWrapper { } -impl flutter_rust_bridge::IntoIntoDart> - for crate::api::api::FTParticipant +impl flutter_rust_bridge::IntoIntoDart> + for crate::api::api::PasswordManagerMeta { - fn into_into_dart(self) -> FrbWrapper { + fn into_into_dart(self) -> FrbWrapper { self.into() } } // Codec=Dco (DartCObject based), see doc to use other codecs -impl flutter_rust_bridge::IntoDart for FrbWrapper { +impl flutter_rust_bridge::IntoDart for FrbWrapper { fn into_dart(self) -> flutter_rust_bridge::for_generated::DartAbi { [ + self.0.date.into_into_dart().into_dart(), + self.0.password.into_into_dart().into_dart(), + self.0.old_password.into_into_dart().into_dart(), + self.0.group_name.into_into_dart().into_dart(), self.0.group_id.into_into_dart().into_dart(), - self.0.my_handles.into_into_dart().into_dart(), - self.0.participants.into_into_dart().into_dart(), - self.0.link.into_into_dart().into_dart(), - self.0.members.into_into_dart().into_dart(), - self.0.report_id.into_into_dart().into_dart(), - self.0.start_time.into_into_dart().into_dart(), - self.0.last_rekey.into_into_dart().into_dart(), - self.0.is_propped.into_into_dart().into_dart(), - self.0.is_ringing_inaccurate.into_into_dart().into_dart(), - self.0.mode.into_into_dart().into_dart(), - self.0.recent_member_adds.into_into_dart().into_dart(), + self.0.share_type.into_into_dart().into_dart(), + self.0.id.into_into_dart().into_dart(), + self.0.typ.into_into_dart().into_dart(), ] .into_dart() } } impl flutter_rust_bridge::for_generated::IntoDartExceptPrimitive - for FrbWrapper + for FrbWrapper { } -impl flutter_rust_bridge::IntoIntoDart> - for crate::api::api::FTSession +impl flutter_rust_bridge::IntoIntoDart> + for crate::api::api::PasswordManagerMetaChange { - fn into_into_dart(self) -> FrbWrapper { + fn into_into_dart(self) -> FrbWrapper { self.into() } } // Codec=Dco (DartCObject based), see doc to use other codecs -impl flutter_rust_bridge::IntoDart for crate::api::api::GroupSummary { +impl flutter_rust_bridge::IntoDart for FrbWrapper { fn into_dart(self) -> flutter_rust_bridge::for_generated::DartAbi { [ - self.display_name.into_into_dart().into_dart(), - self.is_owner.into_into_dart().into_dart(), - self.members.into_into_dart().into_dart(), + self.0.history.into_into_dart().into_dart(), + self.0.alt_domains.into_into_dart().into_dart(), + self.0.totp.into_into_dart().into_dart(), + self.0.ctxt.into_into_dart().into_dart(), + self.0.title.into_into_dart().into_dart(), + self.0.notes.into_into_dart().into_dart(), + self.0.formerly_shared.into_into_dart().into_dart(), + self.0.ocpid.into_into_dart().into_dart(), ] .into_dart() } } -impl flutter_rust_bridge::for_generated::IntoDartExceptPrimitive for crate::api::api::GroupSummary {} -impl flutter_rust_bridge::IntoIntoDart - for crate::api::api::GroupSummary +impl flutter_rust_bridge::for_generated::IntoDartExceptPrimitive + for FrbWrapper { - fn into_into_dart(self) -> crate::api::api::GroupSummary { - self +} +impl flutter_rust_bridge::IntoIntoDart> + for crate::api::api::PasswordManagerMetaData +{ + fn into_into_dart(self) -> FrbWrapper { + self.into() } } // Codec=Dco (DartCObject based), see doc to use other codecs -impl flutter_rust_bridge::IntoDart for crate::api::api::GroupSummaryMember { +impl flutter_rust_bridge::IntoDart for FrbWrapper { + fn into_dart(self) -> flutter_rust_bridge::for_generated::DartAbi { + [self.0.last_used.into_into_dart().into_dart()].into_dart() + } +} +impl flutter_rust_bridge::for_generated::IntoDartExceptPrimitive + for FrbWrapper +{ +} +impl flutter_rust_bridge::IntoIntoDart> + for crate::api::api::PasswordManagerMetaDataCtx +{ + fn into_into_dart(self) -> FrbWrapper { + self.into() + } +} +// Codec=Dco (DartCObject based), see doc to use other codecs +impl flutter_rust_bridge::IntoDart + for FrbWrapper +{ fn into_dart(self) -> flutter_rust_bridge::for_generated::DartAbi { [ - self.name.into_into_dart().into_dart(), - self.handle.into_into_dart().into_dart(), - self.user_id.into_into_dart().into_dart(), - self.is_joined.into_into_dart().into_dart(), + self.0.group_name.into_into_dart().into_dart(), + self.0 + .password_manager_credential_identifier + .into_into_dart() + .into_dart(), ] .into_dart() } } impl flutter_rust_bridge::for_generated::IntoDartExceptPrimitive - for crate::api::api::GroupSummaryMember + for FrbWrapper { } -impl flutter_rust_bridge::IntoIntoDart - for crate::api::api::GroupSummaryMember +impl + flutter_rust_bridge::IntoIntoDart< + FrbWrapper, + > for crate::api::api::PasswordManagerMetaDataFormerlyShared { - fn into_into_dart(self) -> crate::api::api::GroupSummaryMember { - self + fn into_into_dart(self) -> FrbWrapper { + self.into() } } // Codec=Dco (DartCObject based), see doc to use other codecs -impl flutter_rust_bridge::IntoDart for crate::api::api::HwExtra { +impl flutter_rust_bridge::IntoDart for FrbWrapper { fn into_dart(self) -> flutter_rust_bridge::for_generated::DartAbi { [ - self.version.into_into_dart().into_dart(), - self.protocol_version.into_into_dart().into_dart(), - self.device_id.into_into_dart().into_dart(), - self.icloud_ua.into_into_dart().into_dart(), - self.aoskit_version.into_into_dart().into_dart(), + self.0.secret.into_into_dart().into_dart(), + self.0.digits.into_into_dart().into_dart(), + self.0.issuer.into_into_dart().into_dart(), + self.0.period.into_into_dart().into_dart(), + self.0.initial_date.into_into_dart().into_dart(), + self.0.algorithm.into_into_dart().into_dart(), + self.0.account_name.into_into_dart().into_dart(), + self.0.original_url.into_into_dart().into_dart(), ] .into_dart() } } -impl flutter_rust_bridge::for_generated::IntoDartExceptPrimitive for crate::api::api::HwExtra {} -impl flutter_rust_bridge::IntoIntoDart for crate::api::api::HwExtra { - fn into_into_dart(self) -> crate::api::api::HwExtra { - self +impl flutter_rust_bridge::for_generated::IntoDartExceptPrimitive + for FrbWrapper +{ +} +impl flutter_rust_bridge::IntoIntoDart> + for crate::api::api::PasswordManagerTotp +{ + fn into_into_dart(self) -> FrbWrapper { + self.into() } } // Codec=Dco (DartCObject based), see doc to use other codecs -impl flutter_rust_bridge::IntoDart for FrbWrapper { +impl flutter_rust_bridge::IntoDart for FrbWrapper { fn into_dart(self) -> flutter_rust_bridge::for_generated::DartAbi { [ - self.0.name.into_into_dart().into_dart(), - self.0.first.into_into_dart().into_dart(), - self.0.last.into_into_dart().into_dart(), + self.0.cdat.into_into_dart().into_dart(), + self.0.mdat.into_into_dart().into_dart(), + self.0.srvr.into_into_dart().into_dart(), + self.0.acct.into_into_dart().into_dart(), + self.0.agrp.into_into_dart().into_dart(), + self.0.data.into_into_dart().into_dart(), ] .into_dart() } } impl flutter_rust_bridge::for_generated::IntoDartExceptPrimitive - for FrbWrapper + for FrbWrapper { -} -impl flutter_rust_bridge::IntoIntoDart> - for crate::api::api::IMessageNameRecord +} +impl flutter_rust_bridge::IntoIntoDart> + for crate::api::api::PasswordRawEntry { - fn into_into_dart(self) -> FrbWrapper { + fn into_into_dart(self) -> FrbWrapper { self.into() } } // Codec=Dco (DartCObject based), see doc to use other codecs -impl flutter_rust_bridge::IntoDart for FrbWrapper { +impl flutter_rust_bridge::IntoDart for FrbWrapper { fn into_dart(self) -> flutter_rust_bridge::for_generated::DartAbi { [ - self.0.name.into_into_dart().into_dart(), - self.0.image.into_into_dart().into_dart(), - self.0.poster.into_into_dart().into_dart(), + self.0.target.into_into_dart().into_dart(), + self.0.is_scheduled.into_into_dart().into_dart(), ] .into_dart() } } impl flutter_rust_bridge::for_generated::IntoDartExceptPrimitive - for FrbWrapper + for FrbWrapper { } -impl flutter_rust_bridge::IntoIntoDart> - for crate::api::api::IMessageNicknameRecord +impl flutter_rust_bridge::IntoIntoDart> + for crate::api::api::PermanentDeleteMessage { - fn into_into_dart(self) -> FrbWrapper { + fn into_into_dart(self) -> FrbWrapper { self.into() } } // Codec=Dco (DartCObject based), see doc to use other codecs -impl flutter_rust_bridge::IntoDart for FrbWrapper { +impl flutter_rust_bridge::IntoDart for FrbWrapper { fn into_dart(self) -> flutter_rust_bridge::for_generated::DartAbi { [ - self.0.low_res_poster.into_into_dart().into_dart(), - self.0.package.into_into_dart().into_dart(), - self.0.meta.into_into_dart().into_dart(), + self.0.version.into_into_dart().into_dart(), + self.0.layers.into_into_dart().into_dart(), + self.0.properties.into_into_dart().into_dart(), ] .into_dart() } } impl flutter_rust_bridge::for_generated::IntoDartExceptPrimitive - for FrbWrapper + for FrbWrapper { } -impl flutter_rust_bridge::IntoIntoDart> - for crate::api::api::IMessagePosterRecord +impl flutter_rust_bridge::IntoIntoDart> + for crate::api::api::PhotoPosterContents { - fn into_into_dart(self) -> FrbWrapper { + fn into_into_dart(self) -> FrbWrapper { self.into() } } // Codec=Dco (DartCObject based), see doc to use other codecs -impl flutter_rust_bridge::IntoDart for FrbWrapper { +impl flutter_rust_bridge::IntoDart for FrbWrapper { fn into_dart(self) -> flutter_rust_bridge::for_generated::DartAbi { [ - self.0.file.into_into_dart().into_dart(), - self.0.group_version.into_into_dart().into_dart(), + self.0.width.into_into_dart().into_dart(), + self.0.height.into_into_dart().into_dart(), + self.0.x.into_into_dart().into_dart(), + self.0.y.into_into_dart().into_dart(), ] .into_dart() } } impl flutter_rust_bridge::for_generated::IntoDartExceptPrimitive - for FrbWrapper + for FrbWrapper { } -impl flutter_rust_bridge::IntoIntoDart> - for crate::api::api::IconChangeMessage +impl flutter_rust_bridge::IntoIntoDart> + for crate::api::api::PhotoPosterContentsFrame { - fn into_into_dart(self) -> FrbWrapper { + fn into_into_dart(self) -> FrbWrapper { self.into() } } // Codec=Dco (DartCObject based), see doc to use other codecs -impl flutter_rust_bridge::IntoDart for FrbWrapper { +impl flutter_rust_bridge::IntoDart for FrbWrapper { fn into_dart(self) -> flutter_rust_bridge::for_generated::DartAbi { [ - self.0.step.into_into_dart().into_dart(), - self.0.atxnid.into_into_dart().into_dart(), - self.0.pake.into_into_dart().into_dart(), - self.0.ec.into_into_dart().into_dart(), - self.0.idmsdata.into_into_dart().into_dart(), + self.0.width.into_into_dart().into_dart(), + self.0.height.into_into_dart().into_dart(), ] .into_dart() } } impl flutter_rust_bridge::for_generated::IntoDartExceptPrimitive - for FrbWrapper + for FrbWrapper { } -impl flutter_rust_bridge::IntoIntoDart> - for crate::api::api::IdmsCircleMessage +impl flutter_rust_bridge::IntoIntoDart> + for crate::api::api::PhotoPosterContentsSize { - fn into_into_dart(self) -> FrbWrapper { + fn into_into_dart(self) -> FrbWrapper { self.into() } } // Codec=Dco (DartCObject based), see doc to use other codecs -impl flutter_rust_bridge::IntoDart for FrbWrapper { +impl flutter_rust_bridge::IntoDart for FrbWrapper { fn into_dart(self) -> flutter_rust_bridge::for_generated::DartAbi { - match self.0 { - crate::api::api::IdmsMessage::RequestedSignIn(field0) => { - [0.into_dart(), field0.into_into_dart().into_dart()].into_dart() - } - crate::api::api::IdmsMessage::TeardownSignIn(field0) => { - [1.into_dart(), field0.into_into_dart().into_dart()].into_dart() - } - crate::api::api::IdmsMessage::CircleRequest(field0, field1) => [ - 2.into_dart(), - field0.into_into_dart().into_dart(), - field1.into_into_dart().into_dart(), - ] - .into_dart(), - _ => { - unimplemented!(""); - } - } + [ + self.0.frame.into_into_dart().into_dart(), + self.0.filename.into_into_dart().into_dart(), + self.0.z_position.into_into_dart().into_dart(), + self.0.identifier.into_into_dart().into_dart(), + ] + .into_dart() } } impl flutter_rust_bridge::for_generated::IntoDartExceptPrimitive - for FrbWrapper + for FrbWrapper { } -impl flutter_rust_bridge::IntoIntoDart> - for crate::api::api::IdmsMessage +impl flutter_rust_bridge::IntoIntoDart> + for crate::api::api::PhotoPosterLayer { - fn into_into_dart(self) -> FrbWrapper { + fn into_into_dart(self) -> FrbWrapper { self.into() } } // Codec=Dco (DartCObject based), see doc to use other codecs -impl flutter_rust_bridge::IntoDart for FrbWrapper { +impl flutter_rust_bridge::IntoDart for FrbWrapper { fn into_dart(self) -> flutter_rust_bridge::for_generated::DartAbi { [ - self.0.aps.into_into_dart().into_dart(), - self.0.txnid.into_into_dart().into_dart(), - self.0.akdata.into_into_dart().into_dart(), - self.0.adsid.into_into_dart().into_dart(), + self.0.clock_intersection.into_into_dart().into_dart(), + self.0.device_resolution.into_into_dart().into_dart(), + self.0.visible_frame.into_into_dart().into_dart(), + self.0.time_frame.into_into_dart().into_dart(), + self.0.clock_layer_order.into_into_dart().into_dart(), + self.0.has_top_edge_contact.into_into_dart().into_dart(), + self.0.inactive_frame.into_into_dart().into_dart(), + self.0.image_size.into_into_dart().into_dart(), + self.0.parallax_padding.into_into_dart().into_dart(), ] .into_dart() } } impl flutter_rust_bridge::for_generated::IntoDartExceptPrimitive - for FrbWrapper + for FrbWrapper { } -impl flutter_rust_bridge::IntoIntoDart> - for crate::api::api::IdmsRequestedSignIn +impl flutter_rust_bridge::IntoIntoDart> + for crate::api::api::PhotoPosterLayout { - fn into_into_dart(self) -> FrbWrapper { + fn into_into_dart(self) -> FrbWrapper { self.into() } } // Codec=Dco (DartCObject based), see doc to use other codecs -impl flutter_rust_bridge::IntoDart for FrbWrapper { +impl flutter_rust_bridge::IntoDart for FrbWrapper { fn into_dart(self) -> flutter_rust_bridge::for_generated::DartAbi { [ - self.0.part.into_into_dart().into_dart(), - self.0.idx.into_into_dart().into_dart(), - self.0.ext.into_into_dart().into_dart(), + self.0.portrait_layout.into_into_dart().into_dart(), + self.0.settling_effect_enabled.into_into_dart().into_dart(), + self.0.depth_enabled.into_into_dart().into_dart(), + self.0.clock_area_luminance.into_into_dart().into_dart(), + self.0.parallax_disabled.into_into_dart().into_dart(), ] .into_dart() } } impl flutter_rust_bridge::for_generated::IntoDartExceptPrimitive - for FrbWrapper + for FrbWrapper { } -impl flutter_rust_bridge::IntoIntoDart> - for crate::api::api::IndexedMessagePart +impl flutter_rust_bridge::IntoIntoDart> + for crate::api::api::PhotoPosterProperties { - fn into_into_dart(self) -> FrbWrapper { + fn into_into_dart(self) -> FrbWrapper { self.into() } } // Codec=Dco (DartCObject based), see doc to use other codecs -impl flutter_rust_bridge::IntoDart for FrbWrapper { +impl flutter_rust_bridge::IntoDart for crate::api::api::PollResult { + fn into_dart(self) -> flutter_rust_bridge::for_generated::DartAbi { + match self { + crate::api::api::PollResult::Stop => [0.into_dart()].into_dart(), + crate::api::api::PollResult::Cont(field0) => { + [1.into_dart(), field0.into_into_dart().into_dart()].into_dart() + } + _ => { + unimplemented!(""); + } + } + } +} +impl flutter_rust_bridge::for_generated::IntoDartExceptPrimitive for crate::api::api::PollResult {} +impl flutter_rust_bridge::IntoIntoDart + for crate::api::api::PollResult +{ + fn into_into_dart(self) -> crate::api::api::PollResult { + self + } +} +// Codec=Dco (DartCObject based), see doc to use other codecs +impl flutter_rust_bridge::IntoDart for FrbWrapper { fn into_dart(self) -> flutter_rust_bridge::for_generated::DartAbi { [ - self.0.shared_secret.into_into_dart().into_dart(), - self.0.pseud.into_into_dart().into_dart(), - self.0.requestor.into_into_dart().into_dart(), - self.0.nickname.into_into_dart().into_dart(), - self.0.token.into_into_dart().into_dart(), - self.0.delegation_uuid.into_into_dart().into_dart(), - self.0.usage.into_into_dart().into_dart(), + self.0.contents.into_into_dart().into_dart(), + self.0.files.into_into_dart().into_dart(), + self.0.uuid.into_into_dart().into_dart(), ] .into_dart() } } impl flutter_rust_bridge::for_generated::IntoDartExceptPrimitive - for FrbWrapper + for FrbWrapper { } -impl flutter_rust_bridge::IntoIntoDart> - for crate::api::api::LetMeInRequest +impl flutter_rust_bridge::IntoIntoDart> + for crate::api::api::PosterAsset { - fn into_into_dart(self) -> FrbWrapper { + fn into_into_dart(self) -> FrbWrapper { self.into() } } // Codec=Dco (DartCObject based), see doc to use other codecs -impl flutter_rust_bridge::IntoDart for FrbWrapper { +impl flutter_rust_bridge::IntoDart for FrbWrapper { fn into_dart(self) -> flutter_rust_bridge::for_generated::DartAbi { [ - self.0.data.into_into_dart().into_dart(), - self.0.attachments.into_into_dart().into_dart(), + self.0.alpha.into_into_dart().into_dart(), + self.0.blue.into_into_dart().into_dart(), + self.0.green.into_into_dart().into_dart(), + self.0.red.into_into_dart().into_dart(), ] .into_dart() } } impl flutter_rust_bridge::for_generated::IntoDartExceptPrimitive - for FrbWrapper + for FrbWrapper { } -impl flutter_rust_bridge::IntoIntoDart> - for crate::api::api::LinkMeta +impl flutter_rust_bridge::IntoIntoDart> + for crate::api::api::PosterColor { - fn into_into_dart(self) -> FrbWrapper { + fn into_into_dart(self) -> FrbWrapper { self.into() } } // Codec=Dco (DartCObject based), see doc to use other codecs -impl flutter_rust_bridge::IntoDart for FrbWrapper { +impl flutter_rust_bridge::IntoDart for FrbWrapper { fn into_dart(self) -> flutter_rust_bridge::for_generated::DartAbi { - [ - self.0.address.into_into_dart().into_dart(), - self.0.altitude.into_into_dart().into_dart(), - self.0.floor_level.into_into_dart().into_dart(), - self.0.horizontal_accuracy.into_into_dart().into_dart(), - self.0.is_inaccurate.into_into_dart().into_dart(), - self.0.latitude.into_into_dart().into_dart(), - self.0.location_id.into_into_dart().into_dart(), - self.0.location_timestamp.into_into_dart().into_dart(), - self.0.longitude.into_into_dart().into_dart(), - self.0.secure_location_ts.into_into_dart().into_dart(), - self.0.timestamp.into_into_dart().into_dart(), - self.0.vertical_accuracy.into_into_dart().into_dart(), - self.0.position_type.into_into_dart().into_dart(), - self.0.is_old.into_into_dart().into_dart(), - self.0.location_finished.into_into_dart().into_dart(), - ] - .into_dart() + match self.0 { + crate::api::api::PosterRole::PRPosterRoleBackdrop => 0.into_dart(), + crate::api::api::PosterRole::PRPosterRoleIncomingCall => 1.into_dart(), + _ => unreachable!(), + } } } impl flutter_rust_bridge::for_generated::IntoDartExceptPrimitive - for FrbWrapper + for FrbWrapper { } -impl flutter_rust_bridge::IntoIntoDart> - for crate::api::api::Location +impl flutter_rust_bridge::IntoIntoDart> + for crate::api::api::PosterRole { - fn into_into_dart(self) -> FrbWrapper { + fn into_into_dart(self) -> FrbWrapper { self.into() } } // Codec=Dco (DartCObject based), see doc to use other codecs -impl flutter_rust_bridge::IntoDart for FrbWrapper { +impl flutter_rust_bridge::IntoDart for FrbWrapper { fn into_dart(self) -> flutter_rust_bridge::for_generated::DartAbi { match self.0 { - crate::api::api::LoginState::LoggedIn => [0.into_dart()].into_dart(), - crate::api::api::LoginState::NeedsDevice2FA => [1.into_dart()].into_dart(), - crate::api::api::LoginState::Needs2FAVerification => [2.into_dart()].into_dart(), - crate::api::api::LoginState::NeedsSMS2FA => [3.into_dart()].into_dart(), - crate::api::api::LoginState::NeedsSMS2FAVerification(field0) => { - [4.into_dart(), field0.into_into_dart().into_dart()].into_dart() + crate::api::api::PosterType::Photo { assets } => { + [0.into_dart(), assets.into_into_dart().into_dart()].into_dart() } - crate::api::api::LoginState::NeedsExtraStep(field0) => { - [5.into_dart(), field0.into_into_dart().into_dart()].into_dart() + crate::api::api::PosterType::Monogram { data, background } => [ + 1.into_dart(), + data.into_into_dart().into_dart(), + background.into_into_dart().into_dart(), + ] + .into_dart(), + crate::api::api::PosterType::Memoji { data, background } => [ + 2.into_dart(), + data.into_into_dart().into_dart(), + background.into_into_dart().into_dart(), + ] + .into_dart(), + crate::api::api::PosterType::TranscriptDynamic { data } => { + [3.into_dart(), data.into_into_dart().into_dart()].into_dart() + } + crate::api::api::PosterType::TranscriptGradient { colors } => { + [4.into_dart(), colors.into_into_dart().into_dart()].into_dart() } - crate::api::api::LoginState::NeedsLogin => [6.into_dart()].into_dart(), _ => { unimplemented!(""); } @@ -25749,332 +31724,319 @@ impl flutter_rust_bridge::IntoDart for FrbWrapper { } } impl flutter_rust_bridge::for_generated::IntoDartExceptPrimitive - for FrbWrapper + for FrbWrapper { } -impl flutter_rust_bridge::IntoIntoDart> - for crate::api::api::LoginState +impl flutter_rust_bridge::IntoIntoDart> + for crate::api::api::PosterType { - fn into_into_dart(self) -> FrbWrapper { + fn into_into_dart(self) -> FrbWrapper { self.into() } } // Codec=Dco (DartCObject based), see doc to use other codecs -impl flutter_rust_bridge::IntoDart for FrbWrapper { +impl flutter_rust_bridge::IntoDart for FrbWrapper { fn into_dart(self) -> flutter_rust_bridge::for_generated::DartAbi { [ - self.0.url.into_into_dart().into_dart(), - self.0.version.into_into_dart().into_dart(), + self.0.preferred_style.into_into_dart().into_dart(), + self.0.identifier.into_into_dart().into_dart(), + self.0.suggested.into_into_dart().into_dart(), + self.0.color.into_into_dart().into_dart(), ] .into_dart() } } impl flutter_rust_bridge::for_generated::IntoDartExceptPrimitive - for FrbWrapper + for FrbWrapper { } -impl flutter_rust_bridge::IntoIntoDart> - for crate::api::api::LPIconMetadata +impl flutter_rust_bridge::IntoIntoDart> + for crate::api::api::PRPosterColor { - fn into_into_dart(self) -> FrbWrapper { + fn into_into_dart(self) -> FrbWrapper { self.into() } } // Codec=Dco (DartCObject based), see doc to use other codecs -impl flutter_rust_bridge::IntoDart for FrbWrapper { +impl flutter_rust_bridge::IntoDart for FrbWrapper { fn into_dart(self) -> flutter_rust_bridge::for_generated::DartAbi { - [ - self.0.size.into_into_dart().into_dart(), - self.0.url.into_into_dart().into_dart(), - self.0.version.into_into_dart().into_dart(), - ] - .into_dart() + match self.0 { + crate::api::api::PRPosterContentMaterialStyle::PRPosterContentDiscreteColorsStyle { + variation, + colors, + vibrant, + supports_variation, + needs_to_resolve_variation, + } => [ + 0.into_dart(), + variation.into_into_dart().into_dart(), + colors.into_into_dart().into_dart(), + vibrant.into_into_dart().into_dart(), + supports_variation.into_into_dart().into_dart(), + needs_to_resolve_variation.into_into_dart().into_dart(), + ] + .into_dart(), + crate::api::api::PRPosterContentMaterialStyle::PRPosterContentVibrantMaterialStyle => { + [1.into_dart()].into_dart() + } + crate::api::api::PRPosterContentMaterialStyle::PRPosterContentGradientStyle { + gradient_type, + colors, + start_point, + locations, + end_point, + } => [ + 2.into_dart(), + gradient_type.into_into_dart().into_dart(), + colors.into_into_dart().into_dart(), + start_point.into_into_dart().into_dart(), + locations.into_into_dart().into_dart(), + end_point.into_into_dart().into_dart(), + ] + .into_dart(), + _ => { + unimplemented!(""); + } + } } } impl flutter_rust_bridge::for_generated::IntoDartExceptPrimitive - for FrbWrapper + for FrbWrapper { } -impl flutter_rust_bridge::IntoIntoDart> - for crate::api::api::LPImageMetadata +impl flutter_rust_bridge::IntoIntoDart> + for crate::api::api::PRPosterContentMaterialStyle { - fn into_into_dart(self) -> FrbWrapper { + fn into_into_dart(self) -> FrbWrapper { self.into() } } // Codec=Dco (DartCObject based), see doc to use other codecs -impl flutter_rust_bridge::IntoDart for FrbWrapper { +impl flutter_rust_bridge::IntoDart + for FrbWrapper +{ fn into_dart(self) -> flutter_rust_bridge::for_generated::DartAbi { [ - self.0.image_metadata.into_into_dart().into_dart(), - self.0.version.into_into_dart().into_dart(), - self.0.icon_metadata.into_into_dart().into_dart(), - self.0.original_url.into_into_dart().into_dart(), - self.0.url.into_into_dart().into_dart(), - self.0.title.into_into_dart().into_dart(), - self.0.summary.into_into_dart().into_dart(), - self.0.image.into_into_dart().into_dart(), - self.0.icon.into_into_dart().into_dart(), - self.0.images.into_into_dart().into_dart(), - self.0.icons.into_into_dart().into_dart(), - self.0.is_incomplete.into_into_dart().into_dart(), - self.0.uses_activity_pub.into_into_dart().into_dart(), - self.0.is_encoded_for_local_use.into_into_dart().into_dart(), - self.0.collaboration_type.into_into_dart().into_dart(), - self.0.specialization2.into_into_dart().into_dart(), + self.0.is_system_item.into_into_dart().into_dart(), + self.0.time_font_identifier.into_into_dart().into_dart(), + self.0.weight.into_into_dart().into_dart(), ] .into_dart() } } impl flutter_rust_bridge::for_generated::IntoDartExceptPrimitive - for FrbWrapper + for FrbWrapper { } -impl flutter_rust_bridge::IntoIntoDart> - for crate::api::api::LPLinkMetadata +impl + flutter_rust_bridge::IntoIntoDart< + FrbWrapper, + > for crate::api::api::PRPosterSystemTimeFontConfiguration { - fn into_into_dart(self) -> FrbWrapper { + fn into_into_dart(self) -> FrbWrapper { self.into() } } // Codec=Dco (DartCObject based), see doc to use other codecs -impl flutter_rust_bridge::IntoDart for FrbWrapper { - fn into_dart(self) -> flutter_rust_bridge::for_generated::DartAbi { - match self.0 { - crate::api::api::LPSpecializationMetadata::LPPasswordsInviteMetadata { - group_name, - url_parameters, - } => [ - 0.into_dart(), - group_name.into_into_dart().into_dart(), - url_parameters.into_into_dart().into_dart(), - ] - .into_dart(), - _ => { - unimplemented!(""); - } - } - } -} -impl flutter_rust_bridge::for_generated::IntoDartExceptPrimitive - for FrbWrapper -{ -} -impl flutter_rust_bridge::IntoIntoDart> - for crate::api::api::LPSpecializationMetadata +impl flutter_rust_bridge::IntoDart + for FrbWrapper { - fn into_into_dart(self) -> FrbWrapper { - self.into() - } -} -// Codec=Dco (DartCObject based), see doc to use other codecs -impl flutter_rust_bridge::IntoDart for FrbWrapper { fn into_dart(self) -> flutter_rust_bridge::for_generated::DartAbi { [ + self.0.alternate_date_enabled.into_into_dart().into_dart(), + self.0.contents_luminence.into_into_dart().into_dart(), + self.0.group_name.into_into_dart().into_dart(), self.0 - .background_color_description + .preferred_title_alignment .into_into_dart() .into_dart(), - self.0.avatar_record_data.into_into_dart().into_dart(), - self.0.avatar_pose_data.into_into_dart().into_dart(), - self.0.has_body.into_into_dart().into_dart(), - self.0.avatar_image_data.into_into_dart().into_dart(), + self.0.preferred_title_layout.into_into_dart().into_dart(), + self.0.time_font_configuration.into_into_dart().into_dart(), + self.0.time_numbering_system.into_into_dart().into_dart(), + self.0.title_color.into_into_dart().into_dart(), + self.0.title_content_style.into_into_dart().into_dart(), + self.0.user_configured.into_into_dart().into_dart(), + self.0.title_style.into_into_dart().into_dart(), ] .into_dart() } } impl flutter_rust_bridge::for_generated::IntoDartExceptPrimitive - for FrbWrapper + for FrbWrapper { } -impl flutter_rust_bridge::IntoIntoDart> - for crate::api::api::MemojiData +impl flutter_rust_bridge::IntoIntoDart> + for crate::api::api::PRPosterTitleStyleConfiguration { - fn into_into_dart(self) -> FrbWrapper { + fn into_into_dart(self) -> FrbWrapper { self.into() } } // Codec=Dco (DartCObject based), see doc to use other codecs -impl flutter_rust_bridge::IntoDart for FrbWrapper { +impl flutter_rust_bridge::IntoDart for FrbWrapper { fn into_dart(self) -> flutter_rust_bridge::for_generated::DartAbi { - match self.0 { - crate::api::api::Message::Message(field0) => { - [0.into_dart(), field0.into_into_dart().into_dart()].into_dart() - } - crate::api::api::Message::RenameMessage(field0) => { - [1.into_dart(), field0.into_into_dart().into_dart()].into_dart() - } - crate::api::api::Message::ChangeParticipants(field0) => { - [2.into_dart(), field0.into_into_dart().into_dart()].into_dart() - } - crate::api::api::Message::React(field0) => { - [3.into_dart(), field0.into_into_dart().into_dart()].into_dart() - } - crate::api::api::Message::Delivered => [4.into_dart()].into_dart(), - crate::api::api::Message::Read => [5.into_dart()].into_dart(), - crate::api::api::Message::Typing(field0, field1) => [ - 6.into_dart(), - field0.into_into_dart().into_dart(), - field1.into_into_dart().into_dart(), - ] - .into_dart(), - crate::api::api::Message::Unsend(field0) => { - [7.into_dart(), field0.into_into_dart().into_dart()].into_dart() - } - crate::api::api::Message::Edit(field0) => { - [8.into_dart(), field0.into_into_dart().into_dart()].into_dart() - } - crate::api::api::Message::IconChange(field0) => { - [9.into_dart(), field0.into_into_dart().into_dart()].into_dart() - } - crate::api::api::Message::EnableSmsActivation(field0) => { - [10.into_dart(), field0.into_into_dart().into_dart()].into_dart() - } - crate::api::api::Message::MessageReadOnDevice => [11.into_dart()].into_dart(), - crate::api::api::Message::SmsConfirmSent(field0) => { - [12.into_dart(), field0.into_into_dart().into_dart()].into_dart() - } - crate::api::api::Message::MarkUnread => [13.into_dart()].into_dart(), - crate::api::api::Message::PeerCacheInvalidate => [14.into_dart()].into_dart(), - crate::api::api::Message::UpdateExtension(field0) => { - [15.into_dart(), field0.into_into_dart().into_dart()].into_dart() - } - crate::api::api::Message::Error(field0) => { - [16.into_dart(), field0.into_into_dart().into_dart()].into_dart() - } - crate::api::api::Message::MoveToRecycleBin(field0) => { - [17.into_dart(), field0.into_into_dart().into_dart()].into_dart() - } - crate::api::api::Message::RecoverChat(field0) => { - [18.into_dart(), field0.into_into_dart().into_dart()].into_dart() - } - crate::api::api::Message::PermanentDelete(field0) => { - [19.into_dart(), field0.into_into_dart().into_dart()].into_dart() - } - crate::api::api::Message::Unschedule => [20.into_dart()].into_dart(), - crate::api::api::Message::UpdateProfile(field0) => { - [21.into_dart(), field0.into_into_dart().into_dart()].into_dart() - } - crate::api::api::Message::UpdateProfileSharing(field0) => { - [22.into_dart(), field0.into_into_dart().into_dart()].into_dart() - } - crate::api::api::Message::ShareProfile(field0) => { - [23.into_dart(), field0.into_into_dart().into_dart()].into_dart() - } - crate::api::api::Message::NotifyAnyways => [24.into_dart()].into_dart(), - crate::api::api::Message::SetTranscriptBackground(field0) => { - [25.into_dart(), field0.into_into_dart().into_dart()].into_dart() - } - _ => { - unimplemented!(""); - } - } + [ + self.0.uuid.into_into_dart().into_dart(), + self.0.device_name.into_into_dart().into_dart(), + self.0.token.into_into_dart().into_dart(), + self.0.is_hsa_trusted.into_into_dart().into_dart(), + self.0.identites.into_into_dart().into_dart(), + self.0.sub_services.into_into_dart().into_dart(), + ] + .into_dart() } } impl flutter_rust_bridge::for_generated::IntoDartExceptPrimitive - for FrbWrapper + for FrbWrapper { } -impl flutter_rust_bridge::IntoIntoDart> - for crate::api::api::Message +impl flutter_rust_bridge::IntoIntoDart> + for crate::api::api::PrivateDeviceInfo { - fn into_into_dart(self) -> FrbWrapper { + fn into_into_dart(self) -> FrbWrapper { self.into() } } // Codec=Dco (DartCObject based), see doc to use other codecs -impl flutter_rust_bridge::IntoDart for FrbWrapper { +impl flutter_rust_bridge::IntoDart for crate::api::api::ProvisionedFlavor { fn into_dart(self) -> flutter_rust_bridge::for_generated::DartAbi { - [ - self.0.t.into_into_dart().into_dart(), - self.0.d.into_into_dart().into_dart(), - self.0.bcg.into_into_dart().into_dart(), - ] - .into_dart() + match self { + Self::Mac => 0.into_dart(), + Self::IOS => 1.into_dart(), + _ => unreachable!(), + } } } impl flutter_rust_bridge::for_generated::IntoDartExceptPrimitive - for FrbWrapper + for crate::api::api::ProvisionedFlavor { } -impl flutter_rust_bridge::IntoIntoDart> - for crate::api::api::MessageEdit +impl flutter_rust_bridge::IntoIntoDart + for crate::api::api::ProvisionedFlavor { - fn into_into_dart(self) -> FrbWrapper { - self.into() + fn into_into_dart(self) -> crate::api::api::ProvisionedFlavor { + self } } // Codec=Dco (DartCObject based), see doc to use other codecs -impl flutter_rust_bridge::IntoDart for FrbWrapper { +impl flutter_rust_bridge::IntoDart for crate::api::api::PushMessage { + fn into_dart(self) -> flutter_rust_bridge::for_generated::DartAbi { + match self { + crate::api::api::PushMessage::IMessage(field0) => { + [0.into_dart(), field0.into_into_dart().into_dart()].into_dart() + } + crate::api::api::PushMessage::SendConfirm { uuid, error } => [ + 1.into_dart(), + uuid.into_into_dart().into_dart(), + error.into_into_dart().into_dart(), + ] + .into_dart(), + crate::api::api::PushMessage::RegistrationState(field0) => { + [2.into_dart(), field0.into_into_dart().into_dart()].into_dart() + } + crate::api::api::PushMessage::NewPhotostream(field0) => { + [3.into_dart(), field0.into_into_dart().into_dart()].into_dart() + } + crate::api::api::PushMessage::FaceTime(field0) => { + [4.into_dart(), field0.into_into_dart().into_dart()].into_dart() + } + crate::api::api::PushMessage::StatusUpdate(field0) => { + [5.into_dart(), field0.into_into_dart().into_dart()].into_dart() + } + crate::api::api::PushMessage::Idms(field0) => { + [6.into_dart(), field0.into_into_dart().into_dart()].into_dart() + } + crate::api::api::PushMessage::TwoFaAuthEvent(field0) => { + [7.into_dart(), field0.into_into_dart().into_dart()].into_dart() + } + crate::api::api::PushMessage::CircleFinishEvent => [8.into_dart()].into_dart(), + crate::api::api::PushMessage::BeaconShared { + sender, + beacon, + attributes, + } => [ + 9.into_dart(), + sender.into_into_dart().into_dart(), + beacon.into_into_dart().into_dart(), + attributes.into_into_dart().into_dart(), + ] + .into_dart(), + _ => { + unimplemented!(""); + } + } + } +} +impl flutter_rust_bridge::for_generated::IntoDartExceptPrimitive for crate::api::api::PushMessage {} +impl flutter_rust_bridge::IntoIntoDart + for crate::api::api::PushMessage +{ + fn into_into_dart(self) -> crate::api::api::PushMessage { + self + } +} +// Codec=Dco (DartCObject based), see doc to use other codecs +impl flutter_rust_bridge::IntoDart for crate::api::api::QuotaInfo { fn into_dart(self) -> flutter_rust_bridge::for_generated::DartAbi { [ - self.0.lo.into_into_dart().into_dart(), - self.0.le.into_into_dart().into_dart(), + self.total_bytes.into_into_dart().into_dart(), + self.available_bytes.into_into_dart().into_dart(), + self.messages_bytes.into_into_dart().into_dart(), ] .into_dart() } } -impl flutter_rust_bridge::for_generated::IntoDartExceptPrimitive - for FrbWrapper -{ -} -impl flutter_rust_bridge::IntoIntoDart> - for crate::api::api::MessageEditRange -{ - fn into_into_dart(self) -> FrbWrapper { - self.into() +impl flutter_rust_bridge::for_generated::IntoDartExceptPrimitive for crate::api::api::QuotaInfo {} +impl flutter_rust_bridge::IntoIntoDart for crate::api::api::QuotaInfo { + fn into_into_dart(self) -> crate::api::api::QuotaInfo { + self } } // Codec=Dco (DartCObject based), see doc to use other codecs -impl flutter_rust_bridge::IntoDart for FrbWrapper { +impl flutter_rust_bridge::IntoDart for FrbWrapper { fn into_dart(self) -> flutter_rust_bridge::for_generated::DartAbi { [ - self.0.id.into_into_dart().into_dart(), - self.0.sender.into_into_dart().into_dart(), - self.0.conversation.into_into_dart().into_dart(), - self.0.message.into_into_dart().into_dart(), - self.0.sent_timestamp.into_into_dart().into_dart(), - self.0.target.into_into_dart().into_dart(), - self.0.send_delivered.into_into_dart().into_dart(), - self.0.verification_failed.into_into_dart().into_dart(), - self.0.certified_context.into_into_dart().into_dart(), + self.0.to_uuid.into_into_dart().into_dart(), + self.0.to_part.into_into_dart().into_dart(), + self.0.reaction.into_into_dart().into_dart(), + self.0.to_text.into_into_dart().into_dart(), + self.0.embedded_profile.into_into_dart().into_dart(), ] .into_dart() } } impl flutter_rust_bridge::for_generated::IntoDartExceptPrimitive - for FrbWrapper + for FrbWrapper { } -impl flutter_rust_bridge::IntoIntoDart> - for crate::api::api::MessageInst +impl flutter_rust_bridge::IntoIntoDart> + for crate::api::api::ReactMessage { - fn into_into_dart(self) -> FrbWrapper { + fn into_into_dart(self) -> FrbWrapper { self.into() } } // Codec=Dco (DartCObject based), see doc to use other codecs -impl flutter_rust_bridge::IntoDart for FrbWrapper { +impl flutter_rust_bridge::IntoDart for FrbWrapper { fn into_dart(self) -> flutter_rust_bridge::for_generated::DartAbi { match self.0 { - crate::api::api::MessagePart::Text(field0, field1) => [ + crate::api::api::ReactMessageType::React { reaction, enable } => [ 0.into_dart(), - field0.into_into_dart().into_dart(), - field1.into_into_dart().into_dart(), + reaction.into_into_dart().into_dart(), + enable.into_into_dart().into_dart(), ] .into_dart(), - crate::api::api::MessagePart::Attachment(field0) => { - [1.into_dart(), field0.into_into_dart().into_dart()].into_dart() - } - crate::api::api::MessagePart::Mention(field0, field1) => [ - 2.into_dart(), - field0.into_into_dart().into_dart(), - field1.into_into_dart().into_dart(), + crate::api::api::ReactMessageType::Extension { + spec, + body, + is_meta, + } => [ + 1.into_dart(), + spec.into_into_dart().into_dart(), + body.into_into_dart().into_dart(), + is_meta.into_into_dart().into_dart(), ] .into_dart(), - crate::api::api::MessagePart::Object(field0) => { - [3.into_dart(), field0.into_into_dart().into_dart()].into_dart() - } _ => { unimplemented!(""); } @@ -26082,124 +32044,133 @@ impl flutter_rust_bridge::IntoDart for FrbWrapper } } impl flutter_rust_bridge::for_generated::IntoDartExceptPrimitive - for FrbWrapper + for FrbWrapper { } -impl flutter_rust_bridge::IntoIntoDart> - for crate::api::api::MessagePart +impl flutter_rust_bridge::IntoIntoDart> + for crate::api::api::ReactMessageType { - fn into_into_dart(self) -> FrbWrapper { + fn into_into_dart(self) -> FrbWrapper { self.into() } } // Codec=Dco (DartCObject based), see doc to use other codecs -impl flutter_rust_bridge::IntoDart for FrbWrapper { +impl flutter_rust_bridge::IntoDart for FrbWrapper { fn into_dart(self) -> flutter_rust_bridge::for_generated::DartAbi { - [self.0 .0.into_into_dart().into_dart()].into_dart() + match self.0 { + crate::api::api::Reaction::Heart => [0.into_dart()].into_dart(), + crate::api::api::Reaction::Like => [1.into_dart()].into_dart(), + crate::api::api::Reaction::Dislike => [2.into_dart()].into_dart(), + crate::api::api::Reaction::Laugh => [3.into_dart()].into_dart(), + crate::api::api::Reaction::Emphasize => [4.into_dart()].into_dart(), + crate::api::api::Reaction::Question => [5.into_dart()].into_dart(), + crate::api::api::Reaction::Emoji(field0) => { + [6.into_dart(), field0.into_into_dart().into_dart()].into_dart() + } + crate::api::api::Reaction::Sticker { spec, body } => [ + 7.into_dart(), + spec.into_into_dart().into_dart(), + body.into_into_dart().into_dart(), + ] + .into_dart(), + _ => { + unimplemented!(""); + } + } } } impl flutter_rust_bridge::for_generated::IntoDartExceptPrimitive - for FrbWrapper + for FrbWrapper { } -impl flutter_rust_bridge::IntoIntoDart> - for crate::api::api::MessageParts +impl flutter_rust_bridge::IntoIntoDart> + for crate::api::api::Reaction { - fn into_into_dart(self) -> FrbWrapper { + fn into_into_dart(self) -> FrbWrapper { self.into() } } // Codec=Dco (DartCObject based), see doc to use other codecs -impl flutter_rust_bridge::IntoDart for FrbWrapper { +impl flutter_rust_bridge::IntoDart for crate::api::api::RegisterState { fn into_dart(self) -> flutter_rust_bridge::for_generated::DartAbi { - [ - self.0.unk1.into_into_dart().into_dart(), - self.0.subject.into_into_dart().into_dart(), - self.0.text.into_into_dart().into_dart(), - self.0.attributed_body.into_into_dart().into_dart(), - self.0.balloon_bundle_id.into_into_dart().into_dart(), - self.0.payload_data.into_into_dart().into_dart(), - self.0.message_summary_info.into_into_dart().into_dart(), - self.0.effect.into_into_dart().into_dart(), - self.0.date_read.into_into_dart().into_dart(), - self.0.unk10.into_into_dart().into_dart(), - self.0.unk11.into_into_dart().into_dart(), - self.0.date_delivered.into_into_dart().into_dart(), - self.0.unk14.into_into_dart().into_dart(), - self.0.associated_message_type.into_into_dart().into_dart(), - self.0.associated_message_guid.into_into_dart().into_dart(), - self.0 - .associated_message_range_location - .into_into_dart() - .into_dart(), - self.0 - .associated_message_range_length - .into_into_dart() - .into_dart(), - ] - .into_dart() + match self { + crate::api::api::RegisterState::Registered { next_s } => { + [0.into_dart(), next_s.into_into_dart().into_dart()].into_dart() + } + crate::api::api::RegisterState::Registering => [1.into_dart()].into_dart(), + crate::api::api::RegisterState::Failed { retry_wait, error } => [ + 2.into_dart(), + retry_wait.into_into_dart().into_dart(), + error.into_into_dart().into_dart(), + ] + .into_dart(), + _ => { + unimplemented!(""); + } + } } } impl flutter_rust_bridge::for_generated::IntoDartExceptPrimitive - for FrbWrapper + for crate::api::api::RegisterState { } -impl flutter_rust_bridge::IntoIntoDart> - for crate::api::api::MessageProto +impl flutter_rust_bridge::IntoIntoDart + for crate::api::api::RegisterState { - fn into_into_dart(self) -> FrbWrapper { - self.into() + fn into_into_dart(self) -> crate::api::api::RegisterState { + self } } // Codec=Dco (DartCObject based), see doc to use other codecs -impl flutter_rust_bridge::IntoDart for FrbWrapper { +impl flutter_rust_bridge::IntoDart for FrbWrapper { fn into_dart(self) -> flutter_rust_bridge::for_generated::DartAbi { - [self.0.reply.into_into_dart().into_dart()].into_dart() + [self.0.new_name.into_into_dart().into_dart()].into_dart() } } impl flutter_rust_bridge::for_generated::IntoDartExceptPrimitive - for FrbWrapper + for FrbWrapper { } -impl flutter_rust_bridge::IntoIntoDart> - for crate::api::api::MessageProto2 +impl flutter_rust_bridge::IntoIntoDart> + for crate::api::api::RenameMessage { - fn into_into_dart(self) -> FrbWrapper { + fn into_into_dart(self) -> FrbWrapper { self.into() } } // Codec=Dco (DartCObject based), see doc to use other codecs -impl flutter_rust_bridge::IntoDart for FrbWrapper { +impl flutter_rust_bridge::IntoDart for FrbWrapper { fn into_dart(self) -> flutter_rust_bridge::for_generated::DartAbi { [ - self.0.unk2.into_into_dart().into_dart(), - self.0.unk3.into_into_dart().into_dart(), + self.0.guid.into_into_dart().into_dart(), + self.0.sender.into_into_dart().into_dart(), + self.0.conversation_size.into_into_dart().into_dart(), + self.0.parts.into_into_dart().into_dart(), + self.0.time_of_message.into_into_dart().into_dart(), ] .into_dart() } } impl flutter_rust_bridge::for_generated::IntoDartExceptPrimitive - for FrbWrapper + for FrbWrapper { } -impl flutter_rust_bridge::IntoIntoDart> - for crate::api::api::MessageProto3 +impl flutter_rust_bridge::IntoIntoDart> + for crate::api::api::ReportMessage { - fn into_into_dart(self) -> FrbWrapper { + fn into_into_dart(self) -> FrbWrapper { self.into() } } // Codec=Dco (DartCObject based), see doc to use other codecs -impl flutter_rust_bridge::IntoDart for FrbWrapper { +impl flutter_rust_bridge::IntoDart + for FrbWrapper +{ fn into_dart(self) -> flutter_rust_bridge::for_generated::DartAbi { [ - self.0.associated_message_emoji.into_into_dart().into_dart(), - self.0.service.into_into_dart().into_dart(), - self.0.schedule_type.into_into_dart().into_dart(), - self.0.schedule_state.into_into_dart().into_dart(), - self.0.group_id.into_into_dart().into_dart(), + self.0.mime_type.into_into_dart().into_dart(), self.0 - .sent_or_received_off_grid + .rich_link_image_attachment_substitute_index .into_into_dart() .into_dart(), ] @@ -26207,90 +32178,79 @@ impl flutter_rust_bridge::IntoDart for FrbWrapper + for FrbWrapper { } -impl flutter_rust_bridge::IntoIntoDart> - for crate::api::api::MessageProto4 +impl + flutter_rust_bridge::IntoIntoDart< + FrbWrapper, + > for crate::api::api::RichLinkImageAttachmentSubstitute { - fn into_into_dart(self) -> FrbWrapper { + fn into_into_dart(self) -> FrbWrapper { self.into() } } // Codec=Dco (DartCObject based), see doc to use other codecs -impl flutter_rust_bridge::IntoDart for FrbWrapper { +impl flutter_rust_bridge::IntoDart for FrbWrapper { fn into_dart(self) -> flutter_rust_bridge::for_generated::DartAbi { [ - self.0.ams.into_into_dart().into_dart(), - self.0.ampt.into_into_dart().into_dart(), - self.0.amc.into_into_dart().into_dart(), - self.0.amb.into_into_dart().into_dart(), - self.0.amd.into_into_dart().into_dart(), - self.0.ec.into_into_dart().into_dart(), - self.0.ep.into_into_dart().into_dart(), - self.0.otr.into_into_dart().into_dart(), - self.0.ust.into_into_dart().into_dart(), - self.0.rp.into_into_dart().into_dart(), - self.0.hbr.into_into_dart().into_dart(), - self.0.oui.into_into_dart().into_dart(), - self.0.osn.into_into_dart().into_dart(), - self.0.euh.into_into_dart().into_dart(), + self.0.ms.into_into_dart().into_dart(), + self.0.schedule.into_into_dart().into_dart(), ] .into_dart() } } impl flutter_rust_bridge::for_generated::IntoDartExceptPrimitive - for FrbWrapper -{ -} -impl flutter_rust_bridge::IntoIntoDart> - for crate::api::api::MessageSummaryInfo -{ - fn into_into_dart(self) -> FrbWrapper { - self.into() - } -} -// Codec=Dco (DartCObject based), see doc to use other codecs -impl flutter_rust_bridge::IntoDart for FrbWrapper { - fn into_dart(self) -> flutter_rust_bridge::for_generated::DartAbi { - match self.0 { - crate::api::api::MessageTarget::Token(field0) => { - [0.into_dart(), field0.into_into_dart().into_dart()].into_dart() - } - crate::api::api::MessageTarget::Uuid(field0) => { - [1.into_dart(), field0.into_into_dart().into_dart()].into_dart() - } - _ => { - unimplemented!(""); - } - } - } -} -impl flutter_rust_bridge::for_generated::IntoDartExceptPrimitive - for FrbWrapper + for FrbWrapper { } -impl flutter_rust_bridge::IntoIntoDart> - for crate::api::api::MessageTarget +impl flutter_rust_bridge::IntoIntoDart> + for crate::api::api::ScheduleMode { - fn into_into_dart(self) -> FrbWrapper { + fn into_into_dart(self) -> FrbWrapper { self.into() } } // Codec=Dco (DartCObject based), see doc to use other codecs -impl flutter_rust_bridge::IntoDart for FrbWrapper { +impl flutter_rust_bridge::IntoDart for FrbWrapper { fn into_dart(self) -> flutter_rust_bridge::for_generated::DartAbi { match self.0 { - crate::api::api::MessageType::IMessage => [0.into_dart()].into_dart(), - crate::api::api::MessageType::SMS { - is_phone, - using_number, - from_handle, + crate::api::api::SetTranscriptBackgroundMessage::Remove { + aid, + bid, + chat_id, + remove, + } => [ + 0.into_dart(), + aid.into_into_dart().into_dart(), + bid.into_into_dart().into_dart(), + chat_id.into_into_dart().into_dart(), + remove.into_into_dart().into_dart(), + ] + .into_dart(), + crate::api::api::SetTranscriptBackgroundMessage::Set { + aid, + bid, + chat_id, + object_id, + payload_version, + background_id, + url, + signature, + key, + file_size, } => [ 1.into_dart(), - is_phone.into_into_dart().into_dart(), - using_number.into_into_dart().into_dart(), - from_handle.into_into_dart().into_dart(), + aid.into_into_dart().into_dart(), + bid.into_into_dart().into_dart(), + chat_id.into_into_dart().into_dart(), + object_id.into_into_dart().into_dart(), + payload_version.into_into_dart().into_dart(), + background_id.into_into_dart().into_dart(), + url.into_into_dart().into_dart(), + signature.into_into_dart().into_dart(), + key.into_into_dart().into_dart(), + file_size.into_into_dart().into_dart(), ] .into_dart(), _ => { @@ -26300,318 +32260,351 @@ impl flutter_rust_bridge::IntoDart for FrbWrapper } } impl flutter_rust_bridge::for_generated::IntoDartExceptPrimitive - for FrbWrapper + for FrbWrapper { } -impl flutter_rust_bridge::IntoIntoDart> - for crate::api::api::MessageType +impl flutter_rust_bridge::IntoIntoDart> + for crate::api::api::SetTranscriptBackgroundMessage { - fn into_into_dart(self) -> FrbWrapper { + fn into_into_dart(self) -> FrbWrapper { self.into() } } // Codec=Dco (DartCObject based), see doc to use other codecs -impl flutter_rust_bridge::IntoDart for FrbWrapper { +impl flutter_rust_bridge::IntoDart for FrbWrapper { fn into_dart(self) -> flutter_rust_bridge::for_generated::DartAbi { [ - self.0.mmcs_signature_hex.into_into_dart().into_dart(), - self.0.mmcs_owner.into_into_dart().into_dart(), - self.0.mmcs_url.into_into_dart().into_dart(), - self.0.decryption_key.into_into_dart().into_dart(), - self.0.inline_attachment.into_into_dart().into_dart(), - self.0.message_part.into_into_dart().into_dart(), - self.0.file_size.into_into_dart().into_dart(), - self.0.uti_type.into_into_dart().into_dart(), - self.0.mime_type.into_into_dart().into_dart(), - self.0.name.into_into_dart().into_dart(), + self.0.invitation_token.into_into_dart().into_dart(), + self.0.group_id.into_into_dart().into_dart(), + self.0.sent_time.into_into_dart().into_dart(), + self.0.group_name.into_into_dart().into_dart(), + self.0.share_url.into_into_dart().into_dart(), + self.0.invitee_handle.into_into_dart().into_dart(), ] .into_dart() } } impl flutter_rust_bridge::for_generated::IntoDartExceptPrimitive - for FrbWrapper + for FrbWrapper { } -impl flutter_rust_bridge::IntoIntoDart> - for crate::api::api::MMCSAttachmentMeta +impl flutter_rust_bridge::IntoIntoDart> + for crate::api::api::ShareInviteContentData { - fn into_into_dart(self) -> FrbWrapper { + fn into_into_dart(self) -> FrbWrapper { self.into() } } // Codec=Dco (DartCObject based), see doc to use other codecs -impl flutter_rust_bridge::IntoDart for FrbWrapper { +impl flutter_rust_bridge::IntoDart for FrbWrapper { fn into_dart(self) -> flutter_rust_bridge::for_generated::DartAbi { [ - self.0.signature.into_into_dart().into_dart(), - self.0.object.into_into_dart().into_dart(), - self.0.url.into_into_dart().into_dart(), - self.0.key.into_into_dart().into_dart(), - self.0.size.into_into_dart().into_dart(), + self.0 + .cloud_kit_decryption_record_key + .into_into_dart() + .into_dart(), + self.0.cloud_kit_record_key.into_into_dart().into_dart(), + self.0.poster.into_into_dart().into_dart(), ] .into_dart() } } impl flutter_rust_bridge::for_generated::IntoDartExceptPrimitive - for FrbWrapper + for FrbWrapper { } -impl flutter_rust_bridge::IntoIntoDart> - for crate::api::api::MMCSFile +impl flutter_rust_bridge::IntoIntoDart> + for crate::api::api::ShareProfileMessage { - fn into_into_dart(self) -> FrbWrapper { + fn into_into_dart(self) -> FrbWrapper { self.into() } } // Codec=Dco (DartCObject based), see doc to use other codecs -impl flutter_rust_bridge::IntoDart for crate::api::api::MMCSTransferProgress { +impl flutter_rust_bridge::IntoDart for FrbWrapper { fn into_dart(self) -> flutter_rust_bridge::for_generated::DartAbi { [ - self.prog.into_into_dart().into_dart(), - self.total.into_into_dart().into_dart(), - self.file.into_into_dart().into_dart(), + self.0.name.into_into_dart().into_dart(), + self.0.fullname.into_into_dart().into_dart(), + self.0.email.into_into_dart().into_dart(), + self.0.albumguid.into_into_dart().into_dart(), + self.0.sharingtype.into_into_dart().into_dart(), + self.0.subscriptiondate.into_into_dart().into_dart(), + self.0.albumlocation.into_into_dart().into_dart(), + self.0.assets.into_into_dart().into_dart(), + self.0.delete.into_into_dart().into_dart(), ] .into_dart() } } impl flutter_rust_bridge::for_generated::IntoDartExceptPrimitive - for crate::api::api::MMCSTransferProgress + for FrbWrapper { } -impl flutter_rust_bridge::IntoIntoDart - for crate::api::api::MMCSTransferProgress +impl flutter_rust_bridge::IntoIntoDart> + for crate::api::api::SharedAlbum { - fn into_into_dart(self) -> crate::api::api::MMCSTransferProgress { - self + fn into_into_dart(self) -> FrbWrapper { + self.into() } } // Codec=Dco (DartCObject based), see doc to use other codecs -impl flutter_rust_bridge::IntoDart for FrbWrapper { +impl flutter_rust_bridge::IntoDart for crate::api::api::SharedICloudServices { fn into_dart(self) -> flutter_rust_bridge::for_generated::DartAbi { [ - self.0 - .top_background_color_description - .into_into_dart() - .into_dart(), - self.0 - .background_color_description - .into_into_dart() - .into_dart(), - self.0.initials.into_into_dart().into_dart(), - self.0 - .monogram_supported_for_name - .into_into_dart() - .into_dart(), + self.account.into_into_dart().into_dart(), + self.token_provider.into_into_dart().into_dart(), + self.cloudkit_client.into_into_dart().into_dart(), + self.keychain.into_into_dart().into_dart(), + self.passwords.into_into_dart().into_dart(), + self.profiles_client.into_into_dart().into_dart(), + self.fmfd.into_into_dart().into_dart(), + self.sharedstreams.into_into_dart().into_dart(), + self.cloud_messages_client.into_into_dart().into_dart(), + self.statuskit_client.into_into_dart().into_dart(), ] .into_dart() } } impl flutter_rust_bridge::for_generated::IntoDartExceptPrimitive - for FrbWrapper + for crate::api::api::SharedICloudServices { } -impl flutter_rust_bridge::IntoIntoDart> - for crate::api::api::MonogramData +impl flutter_rust_bridge::IntoIntoDart + for crate::api::api::SharedICloudServices { - fn into_into_dart(self) -> FrbWrapper { - self.into() + fn into_into_dart(self) -> crate::api::api::SharedICloudServices { + self } } // Codec=Dco (DartCObject based), see doc to use other codecs -impl flutter_rust_bridge::IntoDart for FrbWrapper { +impl flutter_rust_bridge::IntoDart for FrbWrapper { fn into_dart(self) -> flutter_rust_bridge::for_generated::DartAbi { [ - self.0.target.into_into_dart().into_dart(), - self.0.recoverable_delete_date.into_into_dart().into_dart(), + self.0.low_res_wallpaper_tag.into_into_dart().into_dart(), + self.0.wallpaper_tag.into_into_dart().into_dart(), + self.0.message_tag.into_into_dart().into_dart(), ] .into_dart() } } impl flutter_rust_bridge::for_generated::IntoDartExceptPrimitive - for FrbWrapper + for FrbWrapper { } -impl flutter_rust_bridge::IntoIntoDart> - for crate::api::api::MoveToRecycleBinMessage +impl flutter_rust_bridge::IntoIntoDart> + for crate::api::api::SharedPoster { - fn into_into_dart(self) -> FrbWrapper { + fn into_into_dart(self) -> FrbWrapper { self.into() } } // Codec=Dco (DartCObject based), see doc to use other codecs -impl flutter_rust_bridge::IntoDart for crate::api::api::MyAsyncRuntime { +impl flutter_rust_bridge::IntoDart for crate::api::api::SharedPushState { fn into_dart(self) -> flutter_rust_bridge::for_generated::DartAbi { - Vec::::new().into_dart() + [ + self.os_config.into_into_dart().into_dart(), + self.cancel_poll.into_into_dart().into_dart(), + self.conf_dir.into_into_dart().into_dart(), + self.local_broadcast.into_into_dart().into_dart(), + self.anisette.into_into_dart().into_dart(), + self.conn.into_into_dart().into_dart(), + self.icloud_services.into_into_dart().into_dart(), + self.client.into_into_dart().into_dart(), + self.ft_client.into_into_dart().into_dart(), + self.idms_client.into_into_dart().into_dart(), + self.active_circle_sessions.into_into_dart().into_dart(), + self.client_session.into_into_dart().into_dart(), + ] + .into_dart() } } impl flutter_rust_bridge::for_generated::IntoDartExceptPrimitive - for crate::api::api::MyAsyncRuntime + for crate::api::api::SharedPushState { } -impl flutter_rust_bridge::IntoIntoDart - for crate::api::api::MyAsyncRuntime +impl flutter_rust_bridge::IntoIntoDart + for crate::api::api::SharedPushState { - fn into_into_dart(self) -> crate::api::api::MyAsyncRuntime { + fn into_into_dart(self) -> crate::api::api::SharedPushState { self } } // Codec=Dco (DartCObject based), see doc to use other codecs -impl flutter_rust_bridge::IntoDart for FrbWrapper { +impl flutter_rust_bridge::IntoDart for FrbWrapper { fn into_dart(self) -> flutter_rust_bridge::for_generated::DartAbi { [ - self.0.parts.into_into_dart().into_dart(), - self.0.effect.into_into_dart().into_dart(), - self.0.reply_guid.into_into_dart().into_dart(), - self.0.reply_part.into_into_dart().into_dart(), - self.0.service.into_into_dart().into_dart(), - self.0.subject.into_into_dart().into_dart(), - self.0.app.into_into_dart().into_dart(), - self.0.link_meta.into_into_dart().into_dart(), - self.0.voice.into_into_dart().into_dart(), - self.0.scheduled.into_into_dart().into_dart(), - self.0.embedded_profile.into_into_dart().into_dart(), + self.0.poster.into_into_dart().into_dart(), + self.0.text_metadata.into_into_dart().into_dart(), + self.0.low_res.into_into_dart().into_dart(), ] .into_dart() } } impl flutter_rust_bridge::for_generated::IntoDartExceptPrimitive - for FrbWrapper + for FrbWrapper { } -impl flutter_rust_bridge::IntoIntoDart> - for crate::api::api::NormalMessage +impl flutter_rust_bridge::IntoIntoDart> + for crate::api::api::SimplifiedIncomingCallPoster { - fn into_into_dart(self) -> FrbWrapper { + fn into_into_dart(self) -> FrbWrapper { self.into() } } // Codec=Dco (DartCObject based), see doc to use other codecs -impl flutter_rust_bridge::IntoDart for FrbWrapper { +impl flutter_rust_bridge::IntoDart for FrbWrapper { fn into_dart(self) -> flutter_rust_bridge::for_generated::DartAbi { [ - self.0.text.into_into_dart().into_dart(), - self.0.ranges.into_into_dart().into_dart(), + self.0.title_configuration.into_into_dart().into_dart(), + self.0.r#type.into_into_dart().into_dart(), + self.0.role.into_into_dart().into_dart(), ] .into_dart() } } impl flutter_rust_bridge::for_generated::IntoDartExceptPrimitive - for FrbWrapper + for FrbWrapper { } -impl flutter_rust_bridge::IntoIntoDart> - for crate::api::api::NSAttributedString +impl flutter_rust_bridge::IntoIntoDart> + for crate::api::api::SimplifiedPoster { - fn into_into_dart(self) -> FrbWrapper { + fn into_into_dart(self) -> FrbWrapper { self.into() } } // Codec=Dco (DartCObject based), see doc to use other codecs -impl flutter_rust_bridge::IntoDart for FrbWrapper { +impl flutter_rust_bridge::IntoDart for FrbWrapper { fn into_dart(self) -> flutter_rust_bridge::for_generated::DartAbi { - match self.0 { - crate::api::api::NSDictionaryClass::NSDictionary => 0.into_dart(), - crate::api::api::NSDictionaryClass::NSMutableDictionary => 1.into_dart(), - _ => unreachable!(), - } + [ + self.0.watch.into_into_dart().into_dart(), + self.0.poster.into_into_dart().into_dart(), + ] + .into_dart() } } impl flutter_rust_bridge::for_generated::IntoDartExceptPrimitive - for FrbWrapper + for FrbWrapper { } -impl flutter_rust_bridge::IntoIntoDart> - for crate::api::api::NSDictionaryClass +impl flutter_rust_bridge::IntoIntoDart> + for crate::api::api::SimplifiedTranscriptPoster { - fn into_into_dart(self) -> FrbWrapper { + fn into_into_dart(self) -> FrbWrapper { self.into() } } // Codec=Dco (DartCObject based), see doc to use other codecs -impl flutter_rust_bridge::IntoDart for FrbWrapper { +impl flutter_rust_bridge::IntoDart for FrbWrapper { fn into_dart(self) -> flutter_rust_bridge::for_generated::DartAbi { - [self.0 .0.into_into_dart().into_dart()].into_dart() + match self.0 { + crate::api::api::StatusKitMessage::StatusChanged { + user, + mode, + allowed, + } => [ + 0.into_dart(), + user.into_into_dart().into_dart(), + mode.into_into_dart().into_dart(), + allowed.into_into_dart().into_dart(), + ] + .into_dart(), + _ => { + unimplemented!(""); + } + } } } impl flutter_rust_bridge::for_generated::IntoDartExceptPrimitive - for FrbWrapper + for FrbWrapper { } -impl flutter_rust_bridge::IntoIntoDart> - for crate::api::api::NSDictionaryTypedCoder +impl flutter_rust_bridge::IntoIntoDart> + for crate::api::api::StatusKitMessage { - fn into_into_dart(self) -> FrbWrapper { + fn into_into_dart(self) -> FrbWrapper { self.into() } } // Codec=Dco (DartCObject based), see doc to use other codecs -impl flutter_rust_bridge::IntoDart for FrbWrapper { +impl flutter_rust_bridge::IntoDart for FrbWrapper { fn into_dart(self) -> flutter_rust_bridge::for_generated::DartAbi { - [self.0 .0.into_into_dart().into_dart()].into_dart() + [self.0.allowed_modes.into_into_dart().into_dart()].into_dart() } } impl flutter_rust_bridge::for_generated::IntoDartExceptPrimitive - for FrbWrapper + for FrbWrapper { } -impl flutter_rust_bridge::IntoIntoDart> - for crate::api::api::NSNumber +impl flutter_rust_bridge::IntoIntoDart> + for crate::api::api::StatusKitPersonalConfig { - fn into_into_dart(self) -> FrbWrapper { + fn into_into_dart(self) -> FrbWrapper { self.into() } } // Codec=Dco (DartCObject based), see doc to use other codecs -impl flutter_rust_bridge::IntoDart for FrbWrapper { +impl flutter_rust_bridge::IntoDart for FrbWrapper { fn into_dart(self) -> flutter_rust_bridge::for_generated::DartAbi { - [self.0 .0.into_into_dart().into_dart()].into_dart() + [ + self.0.url.into_into_dart().into_dart(), + self.0.button.into_into_dart().into_dart(), + ] + .into_dart() } } impl flutter_rust_bridge::for_generated::IntoDartExceptPrimitive - for FrbWrapper + for FrbWrapper { } -impl flutter_rust_bridge::IntoIntoDart> - for crate::api::api::NSString +impl flutter_rust_bridge::IntoIntoDart> + for crate::api::api::SupportAction { - fn into_into_dart(self) -> FrbWrapper { + fn into_into_dart(self) -> FrbWrapper { self.into() } } // Codec=Dco (DartCObject based), see doc to use other codecs -impl flutter_rust_bridge::IntoDart for FrbWrapper { +impl flutter_rust_bridge::IntoDart for FrbWrapper { fn into_dart(self) -> flutter_rust_bridge::for_generated::DartAbi { [ - self.0.base.into_into_dart().into_dart(), - self.0.relative.into_into_dart().into_dart(), + self.0.title.into_into_dart().into_dart(), + self.0.body.into_into_dart().into_dart(), + self.0.action.into_into_dart().into_dart(), ] .into_dart() } } impl flutter_rust_bridge::for_generated::IntoDartExceptPrimitive - for FrbWrapper + for FrbWrapper { } -impl flutter_rust_bridge::IntoIntoDart> - for crate::api::api::NSURL +impl flutter_rust_bridge::IntoIntoDart> + for crate::api::api::SupportAlert { - fn into_into_dart(self) -> FrbWrapper { + fn into_into_dart(self) -> FrbWrapper { self.into() } } // Codec=Dco (DartCObject based), see doc to use other codecs -impl flutter_rust_bridge::IntoDart for FrbWrapper { +impl flutter_rust_bridge::IntoDart for FrbWrapper { fn into_dart(self) -> flutter_rust_bridge::for_generated::DartAbi { match self.0 { - crate::api::api::NumOrString::Num(field0) => { - [0.into_dart(), field0.into_into_dart().into_dart()].into_dart() - } - crate::api::api::NumOrString::String(field0) => { - [1.into_dart(), field0.into_into_dart().into_dart()].into_dart() - } - crate::api::api::NumOrString::Bool(field0) => { - [2.into_dart(), field0.into_into_dart().into_dart()].into_dart() - } + crate::api::api::SyncStatus::Synced => [0.into_dart()].into_dart(), + crate::api::api::SyncStatus::Downloading { progress, total } => [ + 1.into_dart(), + progress.into_into_dart().into_dart(), + total.into_into_dart().into_dart(), + ] + .into_dart(), + crate::api::api::SyncStatus::Uploading { progress, total } => [ + 2.into_dart(), + progress.into_into_dart().into_dart(), + total.into_into_dart().into_dart(), + ] + .into_dart(), + crate::api::api::SyncStatus::Syncing => [3.into_dart()].into_dart(), _ => { unimplemented!(""); } @@ -26619,3717 +32612,4354 @@ impl flutter_rust_bridge::IntoDart for FrbWrapper } } impl flutter_rust_bridge::for_generated::IntoDartExceptPrimitive - for FrbWrapper + for FrbWrapper { } -impl flutter_rust_bridge::IntoIntoDart> - for crate::api::api::NumOrString +impl flutter_rust_bridge::IntoIntoDart> + for crate::api::api::SyncStatus { - fn into_into_dart(self) -> FrbWrapper { + fn into_into_dart(self) -> FrbWrapper { self.into() } } // Codec=Dco (DartCObject based), see doc to use other codecs -impl flutter_rust_bridge::IntoDart for FrbWrapper { +impl flutter_rust_bridge::IntoDart for FrbWrapper { fn into_dart(self) -> flutter_rust_bridge::for_generated::DartAbi { - [ - self.0.participants.into_into_dart().into_dart(), - self.0.group_id.into_into_dart().into_dart(), - self.0.guid.into_into_dart().into_dart(), - self.0.delete_incoming_messages.into_into_dart().into_dart(), - self.0.was_reported_as_junk.into_into_dart().into_dart(), - ] - .into_dart() + [self.0.prevtxnid.into_into_dart().into_dart()].into_dart() } } impl flutter_rust_bridge::for_generated::IntoDartExceptPrimitive - for FrbWrapper + for FrbWrapper { } -impl flutter_rust_bridge::IntoIntoDart> - for crate::api::api::OperatedChat +impl flutter_rust_bridge::IntoIntoDart> + for crate::api::api::TeardownSignIn { - fn into_into_dart(self) -> FrbWrapper { + fn into_into_dart(self) -> FrbWrapper { self.into() } } // Codec=Dco (DartCObject based), see doc to use other codecs -impl flutter_rust_bridge::IntoDart for FrbWrapper { +impl flutter_rust_bridge::IntoDart for FrbWrapper { fn into_dart(self) -> flutter_rust_bridge::for_generated::DartAbi { match self.0 { - crate::api::api::PartExtension::Sticker { - msg_width, - rotation, - sai, - scale, - update, - sli, - normalized_x, - normalized_y, - version, - hash, - safi, - effect_type, - sticker_id, - } => [ - 0.into_dart(), - msg_width.into_into_dart().into_dart(), - rotation.into_into_dart().into_dart(), - sai.into_into_dart().into_dart(), - scale.into_into_dart().into_dart(), - update.into_into_dart().into_dart(), - sli.into_into_dart().into_dart(), - normalized_x.into_into_dart().into_dart(), - normalized_y.into_into_dart().into_dart(), - version.into_into_dart().into_dart(), - hash.into_into_dart().into_dart(), - safi.into_into_dart().into_dart(), - effect_type.into_into_dart().into_dart(), - sticker_id.into_into_dart().into_dart(), - ] - .into_dart(), - _ => { - unimplemented!(""); - } + crate::api::api::TextEffect::Big => 0.into_dart(), + crate::api::api::TextEffect::Small => 1.into_dart(), + crate::api::api::TextEffect::Shake => 2.into_dart(), + crate::api::api::TextEffect::Nod => 3.into_dart(), + crate::api::api::TextEffect::Explode => 4.into_dart(), + crate::api::api::TextEffect::Ripple => 5.into_dart(), + crate::api::api::TextEffect::Bloom => 6.into_dart(), + crate::api::api::TextEffect::Jitter => 7.into_dart(), + _ => unreachable!(), } } } impl flutter_rust_bridge::for_generated::IntoDartExceptPrimitive - for FrbWrapper + for FrbWrapper { } -impl flutter_rust_bridge::IntoIntoDart> - for crate::api::api::PartExtension +impl flutter_rust_bridge::IntoIntoDart> + for crate::api::api::TextEffect { - fn into_into_dart(self) -> FrbWrapper { + fn into_into_dart(self) -> FrbWrapper { self.into() } } // Codec=Dco (DartCObject based), see doc to use other codecs -impl flutter_rust_bridge::IntoDart for FrbWrapper { +impl flutter_rust_bridge::IntoDart for FrbWrapper { fn into_dart(self) -> flutter_rust_bridge::for_generated::DartAbi { [ - self.0.cdat.into_into_dart().into_dart(), - self.0.mdat.into_into_dart().into_dart(), - self.0.agrp.into_into_dart().into_dart(), - self.0.labl.into_into_dart().into_dart(), - self.0.data.into_into_dart().into_dart(), - self.0.atag.into_into_dart().into_dart(), - self.0.klbl.into_into_dart().into_dart(), + self.0.bold.into_into_dart().into_dart(), + self.0.italic.into_into_dart().into_dart(), + self.0.underline.into_into_dart().into_dart(), + self.0.strikethrough.into_into_dart().into_dart(), ] .into_dart() } } impl flutter_rust_bridge::for_generated::IntoDartExceptPrimitive - for FrbWrapper + for FrbWrapper { } -impl flutter_rust_bridge::IntoIntoDart> - for crate::api::api::Passkey +impl flutter_rust_bridge::IntoIntoDart> + for crate::api::api::TextFlags { - fn into_into_dart(self) -> FrbWrapper { + fn into_into_dart(self) -> FrbWrapper { self.into() } } // Codec=Dco (DartCObject based), see doc to use other codecs -impl flutter_rust_bridge::IntoDart for FrbWrapper { +impl flutter_rust_bridge::IntoDart for FrbWrapper { fn into_dart(self) -> flutter_rust_bridge::for_generated::DartAbi { - [self.0.domain.into_into_dart().into_dart()].into_dart() + match self.0 { + crate::api::api::TextFormat::Flags(field0) => { + [0.into_dart(), field0.into_into_dart().into_dart()].into_dart() + } + crate::api::api::TextFormat::Effect(field0) => { + [1.into_dart(), field0.into_into_dart().into_dart()].into_dart() + } + _ => { + unimplemented!(""); + } + } } } impl flutter_rust_bridge::for_generated::IntoDartExceptPrimitive - for FrbWrapper + for FrbWrapper { } -impl flutter_rust_bridge::IntoIntoDart> - for crate::api::api::PasswordManagerAltDomain +impl flutter_rust_bridge::IntoIntoDart> + for crate::api::api::TextFormat { - fn into_into_dart(self) -> FrbWrapper { + fn into_into_dart(self) -> FrbWrapper { self.into() } } // Codec=Dco (DartCObject based), see doc to use other codecs -impl flutter_rust_bridge::IntoDart for FrbWrapper { +impl flutter_rust_bridge::IntoDart for FrbWrapper { fn into_dart(self) -> flutter_rust_bridge::for_generated::DartAbi { - [ - self.0.cdat.into_into_dart().into_dart(), - self.0.mdat.into_into_dart().into_dart(), - self.0.srvr.into_into_dart().into_dart(), - self.0.acct.into_into_dart().into_dart(), - self.0.agrp.into_into_dart().into_dart(), - self.0.data.into_into_dart().into_dart(), - ] - .into_dart() + [self.0.identifier.into_into_dart().into_dart()].into_dart() } } impl flutter_rust_bridge::for_generated::IntoDartExceptPrimitive - for FrbWrapper + for FrbWrapper { } -impl flutter_rust_bridge::IntoIntoDart> - for crate::api::api::PasswordManagerMeta +impl flutter_rust_bridge::IntoIntoDart> + for crate::api::api::TranscriptDynamicUserData { - fn into_into_dart(self) -> FrbWrapper { + fn into_into_dart(self) -> FrbWrapper { self.into() } } // Codec=Dco (DartCObject based), see doc to use other codecs -impl flutter_rust_bridge::IntoDart for FrbWrapper { +impl flutter_rust_bridge::IntoDart for crate::api::api::TransferProgress { fn into_dart(self) -> flutter_rust_bridge::for_generated::DartAbi { [ - self.0.date.into_into_dart().into_dart(), - self.0.password.into_into_dart().into_dart(), - self.0.old_password.into_into_dart().into_dart(), - self.0.group_name.into_into_dart().into_dart(), - self.0.group_id.into_into_dart().into_dart(), - self.0.share_type.into_into_dart().into_dart(), - self.0.id.into_into_dart().into_dart(), - self.0.typ.into_into_dart().into_dart(), + self.prog.into_into_dart().into_dart(), + self.total.into_into_dart().into_dart(), + self.attachment.into_into_dart().into_dart(), ] .into_dart() } } impl flutter_rust_bridge::for_generated::IntoDartExceptPrimitive - for FrbWrapper + for crate::api::api::TransferProgress { } -impl flutter_rust_bridge::IntoIntoDart> - for crate::api::api::PasswordManagerMetaChange +impl flutter_rust_bridge::IntoIntoDart + for crate::api::api::TransferProgress { - fn into_into_dart(self) -> FrbWrapper { - self.into() + fn into_into_dart(self) -> crate::api::api::TransferProgress { + self } } // Codec=Dco (DartCObject based), see doc to use other codecs -impl flutter_rust_bridge::IntoDart for FrbWrapper { +impl flutter_rust_bridge::IntoDart for FrbWrapper { fn into_dart(self) -> flutter_rust_bridge::for_generated::DartAbi { [ - self.0.history.into_into_dart().into_dart(), - self.0.alt_domains.into_into_dart().into_dart(), - self.0.totp.into_into_dart().into_dart(), - self.0.ctxt.into_into_dart().into_dart(), - self.0.title.into_into_dart().into_dart(), - self.0.notes.into_into_dart().into_dart(), - self.0.formerly_shared.into_into_dart().into_dart(), - self.0.ocpid.into_into_dart().into_dart(), + self.0.number_with_dial_code.into_into_dart().into_dart(), + self.0.last_two_digits.into_into_dart().into_dart(), + self.0.push_mode.into_into_dart().into_dart(), + self.0.id.into_into_dart().into_dart(), ] .into_dart() } } impl flutter_rust_bridge::for_generated::IntoDartExceptPrimitive - for FrbWrapper + for FrbWrapper { } -impl flutter_rust_bridge::IntoIntoDart> - for crate::api::api::PasswordManagerMetaData +impl flutter_rust_bridge::IntoIntoDart> + for crate::api::api::TrustedPhoneNumber { - fn into_into_dart(self) -> FrbWrapper { + fn into_into_dart(self) -> FrbWrapper { self.into() } } // Codec=Dco (DartCObject based), see doc to use other codecs -impl flutter_rust_bridge::IntoDart for FrbWrapper { +impl flutter_rust_bridge::IntoDart for FrbWrapper { fn into_dart(self) -> flutter_rust_bridge::for_generated::DartAbi { - [self.0.last_used.into_into_dart().into_dart()].into_dart() + [ + self.0.bundle_id.into_into_dart().into_dart(), + self.0.icon.into_into_dart().into_dart(), + ] + .into_dart() } } impl flutter_rust_bridge::for_generated::IntoDartExceptPrimitive - for FrbWrapper + for FrbWrapper { } -impl flutter_rust_bridge::IntoIntoDart> - for crate::api::api::PasswordManagerMetaDataCtx +impl flutter_rust_bridge::IntoIntoDart> + for crate::api::api::TypingApp { - fn into_into_dart(self) -> FrbWrapper { + fn into_into_dart(self) -> FrbWrapper { self.into() } } // Codec=Dco (DartCObject based), see doc to use other codecs -impl flutter_rust_bridge::IntoDart - for FrbWrapper -{ +impl flutter_rust_bridge::IntoDart for FrbWrapper { fn into_dart(self) -> flutter_rust_bridge::for_generated::DartAbi { - [ - self.0.group_name.into_into_dart().into_dart(), - self.0 - .password_manager_credential_identifier - .into_into_dart() - .into_dart(), - ] - .into_dart() + match self.0 { + crate::api::api::UIColor::RGBAColorSpace { + color_components, + green, + blue, + red, + green_dbl, + blue_dbl, + red_dbl, + alpha_dbl, + alpha, + rgb, + color_space, + class, + } => [ + 0.into_dart(), + color_components.into_into_dart().into_dart(), + green.into_into_dart().into_dart(), + blue.into_into_dart().into_dart(), + red.into_into_dart().into_dart(), + green_dbl.into_into_dart().into_dart(), + blue_dbl.into_into_dart().into_dart(), + red_dbl.into_into_dart().into_dart(), + alpha_dbl.into_into_dart().into_dart(), + alpha.into_into_dart().into_dart(), + rgb.into_into_dart().into_dart(), + color_space.into_into_dart().into_dart(), + class.into_into_dart().into_dart(), + ] + .into_dart(), + crate::api::api::UIColor::GrayscaleAlphaColorSpace { + color_components, + white, + alpha, + bin, + color_space, + class, + } => [ + 1.into_dart(), + color_components.into_into_dart().into_dart(), + white.into_into_dart().into_dart(), + alpha.into_into_dart().into_dart(), + bin.into_into_dart().into_dart(), + color_space.into_into_dart().into_dart(), + class.into_into_dart().into_dart(), + ] + .into_dart(), + _ => { + unimplemented!(""); + } + } } } impl flutter_rust_bridge::for_generated::IntoDartExceptPrimitive - for FrbWrapper + for FrbWrapper { } -impl - flutter_rust_bridge::IntoIntoDart< - FrbWrapper, - > for crate::api::api::PasswordManagerMetaDataFormerlyShared +impl flutter_rust_bridge::IntoIntoDart> + for crate::api::api::UIColor { - fn into_into_dart(self) -> FrbWrapper { + fn into_into_dart(self) -> FrbWrapper { self.into() } } // Codec=Dco (DartCObject based), see doc to use other codecs -impl flutter_rust_bridge::IntoDart for FrbWrapper { +impl flutter_rust_bridge::IntoDart for FrbWrapper { fn into_dart(self) -> flutter_rust_bridge::for_generated::DartAbi { [ - self.0.secret.into_into_dart().into_dart(), - self.0.digits.into_into_dart().into_dart(), - self.0.issuer.into_into_dart().into_dart(), - self.0.period.into_into_dart().into_dart(), - self.0.initial_date.into_into_dart().into_dart(), - self.0.algorithm.into_into_dart().into_dart(), - self.0.account_name.into_into_dart().into_dart(), - self.0.original_url.into_into_dart().into_dart(), + self.0.tuuid.into_into_dart().into_dart(), + self.0.edit_part.into_into_dart().into_dart(), ] .into_dart() } } impl flutter_rust_bridge::for_generated::IntoDartExceptPrimitive - for FrbWrapper + for FrbWrapper { } -impl flutter_rust_bridge::IntoIntoDart> - for crate::api::api::PasswordManagerTotp +impl flutter_rust_bridge::IntoIntoDart> + for crate::api::api::UnsendMessage { - fn into_into_dart(self) -> FrbWrapper { + fn into_into_dart(self) -> FrbWrapper { self.into() } } // Codec=Dco (DartCObject based), see doc to use other codecs -impl flutter_rust_bridge::IntoDart for FrbWrapper { +impl flutter_rust_bridge::IntoDart for FrbWrapper { fn into_dart(self) -> flutter_rust_bridge::for_generated::DartAbi { - [ - self.0.cdat.into_into_dart().into_dart(), - self.0.mdat.into_into_dart().into_dart(), - self.0.srvr.into_into_dart().into_dart(), - self.0.acct.into_into_dart().into_dart(), - self.0.agrp.into_into_dart().into_dart(), - self.0.data.into_into_dart().into_dart(), - ] - .into_dart() + match self.0 { + crate::api::api::UpdateAccountFinish::MacOS => [0.into_dart()].into_dart(), + crate::api::api::UpdateAccountFinish::IOS { url } => { + [1.into_dart(), url.into_into_dart().into_dart()].into_dart() + } + _ => { + unimplemented!(""); + } + } } } impl flutter_rust_bridge::for_generated::IntoDartExceptPrimitive - for FrbWrapper + for FrbWrapper { } -impl flutter_rust_bridge::IntoIntoDart> - for crate::api::api::PasswordRawEntry +impl flutter_rust_bridge::IntoIntoDart> + for crate::api::api::UpdateAccountFinish { - fn into_into_dart(self) -> FrbWrapper { + fn into_into_dart(self) -> FrbWrapper { self.into() } } // Codec=Dco (DartCObject based), see doc to use other codecs -impl flutter_rust_bridge::IntoDart for FrbWrapper { +impl flutter_rust_bridge::IntoDart for FrbWrapper { fn into_dart(self) -> flutter_rust_bridge::for_generated::DartAbi { [ - self.0.target.into_into_dart().into_dart(), - self.0.is_scheduled.into_into_dart().into_dart(), + self.0.for_uuid.into_into_dart().into_dart(), + self.0.ext.into_into_dart().into_dart(), ] .into_dart() } } impl flutter_rust_bridge::for_generated::IntoDartExceptPrimitive - for FrbWrapper + for FrbWrapper { } -impl flutter_rust_bridge::IntoIntoDart> - for crate::api::api::PermanentDeleteMessage +impl flutter_rust_bridge::IntoIntoDart> + for crate::api::api::UpdateExtensionMessage { - fn into_into_dart(self) -> FrbWrapper { + fn into_into_dart(self) -> FrbWrapper { self.into() } } // Codec=Dco (DartCObject based), see doc to use other codecs -impl flutter_rust_bridge::IntoDart for FrbWrapper { +impl flutter_rust_bridge::IntoDart for FrbWrapper { fn into_dart(self) -> flutter_rust_bridge::for_generated::DartAbi { [ - self.0.version.into_into_dart().into_dart(), - self.0.layers.into_into_dart().into_dart(), - self.0.properties.into_into_dart().into_dart(), + self.0.profile.into_into_dart().into_dart(), + self.0.share_contacts.into_into_dart().into_dart(), ] .into_dart() } } impl flutter_rust_bridge::for_generated::IntoDartExceptPrimitive - for FrbWrapper + for FrbWrapper { } -impl flutter_rust_bridge::IntoIntoDart> - for crate::api::api::PhotoPosterContents +impl flutter_rust_bridge::IntoIntoDart> + for crate::api::api::UpdateProfileMessage { - fn into_into_dart(self) -> FrbWrapper { + fn into_into_dart(self) -> FrbWrapper { self.into() } } // Codec=Dco (DartCObject based), see doc to use other codecs -impl flutter_rust_bridge::IntoDart for FrbWrapper { +impl flutter_rust_bridge::IntoDart for FrbWrapper { fn into_dart(self) -> flutter_rust_bridge::for_generated::DartAbi { [ - self.0.width.into_into_dart().into_dart(), - self.0.height.into_into_dart().into_dart(), - self.0.x.into_into_dart().into_dart(), - self.0.y.into_into_dart().into_dart(), + self.0.shared_dismissed.into_into_dart().into_dart(), + self.0.shared_all.into_into_dart().into_dart(), + self.0.version.into_into_dart().into_dart(), ] .into_dart() } } impl flutter_rust_bridge::for_generated::IntoDartExceptPrimitive - for FrbWrapper + for FrbWrapper { } -impl flutter_rust_bridge::IntoIntoDart> - for crate::api::api::PhotoPosterContentsFrame +impl flutter_rust_bridge::IntoIntoDart> + for crate::api::api::UpdateProfileSharingMessage { - fn into_into_dart(self) -> FrbWrapper { + fn into_into_dart(self) -> FrbWrapper { self.into() } } // Codec=Dco (DartCObject based), see doc to use other codecs -impl flutter_rust_bridge::IntoDart for FrbWrapper { +impl flutter_rust_bridge::IntoDart for FrbWrapper { fn into_dart(self) -> flutter_rust_bridge::for_generated::DartAbi { [ - self.0.width.into_into_dart().into_dart(), - self.0.height.into_into_dart().into_dart(), + self.0.background_color_key.into_into_dart().into_dart(), + self.0.font_color_key.into_into_dart().into_dart(), + self.0.font_name_key.into_into_dart().into_dart(), + self.0.font_size_key.into_into_dart().into_dart(), + self.0.font_weight_key.into_into_dart().into_dart(), + self.0.is_vertical_key.into_into_dart().into_dart(), + self.0.type_key.into_into_dart().into_dart(), ] .into_dart() } } impl flutter_rust_bridge::for_generated::IntoDartExceptPrimitive - for FrbWrapper + for FrbWrapper { } -impl flutter_rust_bridge::IntoIntoDart> - for crate::api::api::PhotoPosterContentsSize +impl flutter_rust_bridge::IntoIntoDart> + for crate::api::api::WallpaperMetadata { - fn into_into_dart(self) -> FrbWrapper { + fn into_into_dart(self) -> FrbWrapper { self.into() } } // Codec=Dco (DartCObject based), see doc to use other codecs -impl flutter_rust_bridge::IntoDart for FrbWrapper { +impl flutter_rust_bridge::IntoDart for FrbWrapper { fn into_dart(self) -> flutter_rust_bridge::for_generated::DartAbi { [ - self.0.frame.into_into_dart().into_dart(), - self.0.filename.into_into_dart().into_dart(), - self.0.z_position.into_into_dart().into_dart(), - self.0.identifier.into_into_dart().into_dart(), + self.0.is_high_key.into_into_dart().into_dart(), + self.0.luminance.into_into_dart().into_dart(), + self.0.background_image_data.into_into_dart().into_dart(), + self.0.extension_identifier.into_into_dart().into_dart(), ] .into_dart() } } impl flutter_rust_bridge::for_generated::IntoDartExceptPrimitive - for FrbWrapper + for FrbWrapper { } -impl flutter_rust_bridge::IntoIntoDart> - for crate::api::api::PhotoPosterLayer +impl flutter_rust_bridge::IntoIntoDart> + for crate::api::api::WatchBackground { - fn into_into_dart(self) -> FrbWrapper { + fn into_into_dart(self) -> FrbWrapper { self.into() } } // Codec=Dco (DartCObject based), see doc to use other codecs -impl flutter_rust_bridge::IntoDart for FrbWrapper { +impl flutter_rust_bridge::IntoDart for FrbWrapper { fn into_dart(self) -> flutter_rust_bridge::for_generated::DartAbi { [ - self.0.clock_intersection.into_into_dart().into_dart(), - self.0.device_resolution.into_into_dart().into_dart(), - self.0.visible_frame.into_into_dart().into_dart(), - self.0.time_frame.into_into_dart().into_dart(), - self.0.clock_layer_order.into_into_dart().into_dart(), - self.0.has_top_edge_contact.into_into_dart().into_dart(), - self.0.inactive_frame.into_into_dart().into_dart(), - self.0.image_size.into_into_dart().into_dart(), - self.0.parallax_padding.into_into_dart().into_dart(), + self.0.cdat.into_into_dart().into_dart(), + self.0.mdat.into_into_dart().into_dart(), + self.0.acct.into_into_dart().into_dart(), + self.0.svce.into_into_dart().into_dart(), + self.0.data.into_into_dart().into_dart(), ] .into_dart() } } impl flutter_rust_bridge::for_generated::IntoDartExceptPrimitive - for FrbWrapper + for FrbWrapper { } -impl flutter_rust_bridge::IntoIntoDart> - for crate::api::api::PhotoPosterLayout +impl flutter_rust_bridge::IntoIntoDart> + for crate::api::api::WifiPassword { - fn into_into_dart(self) -> FrbWrapper { + fn into_into_dart(self) -> FrbWrapper { self.into() } } -// Codec=Dco (DartCObject based), see doc to use other codecs -impl flutter_rust_bridge::IntoDart for FrbWrapper { - fn into_dart(self) -> flutter_rust_bridge::for_generated::DartAbi { - [ - self.0.portrait_layout.into_into_dart().into_dart(), - self.0.settling_effect_enabled.into_into_dart().into_dart(), - self.0.depth_enabled.into_into_dart().into_dart(), - self.0.clock_area_luminance.into_into_dart().into_dart(), - self.0.parallax_disabled.into_into_dart().into_dart(), - ] - .into_dart() + +impl SseEncode for flutter_rust_bridge::for_generated::anyhow::Error { + // Codec=Sse (Serialization based), see doc to use other codecs + fn sse_encode(self, serializer: &mut flutter_rust_bridge::for_generated::SseSerializer) { + ::sse_encode(format!("{:?}", self), serializer); } } -impl flutter_rust_bridge::for_generated::IntoDartExceptPrimitive - for FrbWrapper -{ + +impl SseEncode for APSConnection { + // Codec=Sse (Serialization based), see doc to use other codecs + fn sse_encode(self, serializer: &mut flutter_rust_bridge::for_generated::SseSerializer) { + >>::sse_encode(flutter_rust_bridge::for_generated::rust_auto_opaque_encode::<_, MoiArc<_>>(self), serializer); + } } -impl flutter_rust_bridge::IntoIntoDart> - for crate::api::api::PhotoPosterProperties -{ - fn into_into_dart(self) -> FrbWrapper { - self.into() + +impl SseEncode for APSState { + // Codec=Sse (Serialization based), see doc to use other codecs + fn sse_encode(self, serializer: &mut flutter_rust_bridge::for_generated::SseSerializer) { + >>::sse_encode(flutter_rust_bridge::for_generated::rust_auto_opaque_encode::<_, MoiArc<_>>(self), serializer); } } -// Codec=Dco (DartCObject based), see doc to use other codecs -impl flutter_rust_bridge::IntoDart for crate::api::api::PollResult { - fn into_dart(self) -> flutter_rust_bridge::for_generated::DartAbi { - match self { - crate::api::api::PollResult::Stop => [0.into_dart()].into_dart(), - crate::api::api::PollResult::Cont(field0) => { - [1.into_dart(), field0.into_into_dart().into_dart()].into_dart() - } - _ => { - unimplemented!(""); - } - } + +impl SseEncode for APSWatcher { + // Codec=Sse (Serialization based), see doc to use other codecs + fn sse_encode(self, serializer: &mut flutter_rust_bridge::for_generated::SseSerializer) { + >>::sse_encode(flutter_rust_bridge::for_generated::rust_auto_opaque_encode::<_, MoiArc<_>>(self), serializer); } } -impl flutter_rust_bridge::for_generated::IntoDartExceptPrimitive for crate::api::api::PollResult {} -impl flutter_rust_bridge::IntoIntoDart - for crate::api::api::PollResult -{ - fn into_into_dart(self) -> crate::api::api::PollResult { - self + +impl SseEncode for ArcAnisetteClient { + // Codec=Sse (Serialization based), see doc to use other codecs + fn sse_encode(self, serializer: &mut flutter_rust_bridge::for_generated::SseSerializer) { + , + >, + >>::sse_encode( + flutter_rust_bridge::for_generated::rust_auto_opaque_encode::<_, MoiArc<_>>(self), + serializer, + ); } } -// Codec=Dco (DartCObject based), see doc to use other codecs -impl flutter_rust_bridge::IntoDart for FrbWrapper { - fn into_dart(self) -> flutter_rust_bridge::for_generated::DartAbi { - [ - self.0.contents.into_into_dart().into_dart(), - self.0.files.into_into_dart().into_dart(), - self.0.uuid.into_into_dart().into_dart(), - ] - .into_dart() + +impl SseEncode for Arc> { + // Codec=Sse (Serialization based), see doc to use other codecs + fn sse_encode(self, serializer: &mut flutter_rust_bridge::for_generated::SseSerializer) { + >, + >, + >>::sse_encode( + flutter_rust_bridge::for_generated::rust_auto_opaque_encode::<_, MoiArc<_>>(self), + serializer, + ); } } -impl flutter_rust_bridge::for_generated::IntoDartExceptPrimitive - for FrbWrapper -{ + +impl SseEncode for Arc> { + // Codec=Sse (Serialization based), see doc to use other codecs + fn sse_encode(self, serializer: &mut flutter_rust_bridge::for_generated::SseSerializer) { + >, + >, + >>::sse_encode( + flutter_rust_bridge::for_generated::rust_auto_opaque_encode::<_, MoiArc<_>>(self), + serializer, + ); + } } -impl flutter_rust_bridge::IntoIntoDart> - for crate::api::api::PosterAsset -{ - fn into_into_dart(self) -> FrbWrapper { - self.into() + +impl SseEncode for Arc { + // Codec=Sse (Serialization based), see doc to use other codecs + fn sse_encode(self, serializer: &mut flutter_rust_bridge::for_generated::SseSerializer) { + >>>::sse_encode(flutter_rust_bridge::for_generated::rust_auto_opaque_encode::<_, MoiArc<_>>(self), serializer); } } -// Codec=Dco (DartCObject based), see doc to use other codecs -impl flutter_rust_bridge::IntoDart for FrbWrapper { - fn into_dart(self) -> flutter_rust_bridge::for_generated::DartAbi { - [ - self.0.alpha.into_into_dart().into_dart(), - self.0.blue.into_into_dart().into_dart(), - self.0.green.into_into_dart().into_dart(), - self.0.red.into_into_dart().into_dart(), - ] - .into_dart() + +impl SseEncode for Arc> { + // Codec=Sse (Serialization based), see doc to use other codecs + fn sse_encode(self, serializer: &mut flutter_rust_bridge::for_generated::SseSerializer) { + >, + >, + >>::sse_encode( + flutter_rust_bridge::for_generated::rust_auto_opaque_encode::<_, MoiArc<_>>(self), + serializer, + ); } } -impl flutter_rust_bridge::for_generated::IntoDartExceptPrimitive - for FrbWrapper -{ + +impl SseEncode for Arc { + // Codec=Sse (Serialization based), see doc to use other codecs + fn sse_encode(self, serializer: &mut flutter_rust_bridge::for_generated::SseSerializer) { + >>>::sse_encode(flutter_rust_bridge::for_generated::rust_auto_opaque_encode::<_, MoiArc<_>>(self), serializer); + } } -impl flutter_rust_bridge::IntoIntoDart> - for crate::api::api::PosterColor -{ - fn into_into_dart(self) -> FrbWrapper { - self.into() + +impl SseEncode for Arc { + // Codec=Sse (Serialization based), see doc to use other codecs + fn sse_encode(self, serializer: &mut flutter_rust_bridge::for_generated::SseSerializer) { + >, + >>::sse_encode( + flutter_rust_bridge::for_generated::rust_auto_opaque_encode::<_, MoiArc<_>>(self), + serializer, + ); } } -// Codec=Dco (DartCObject based), see doc to use other codecs -impl flutter_rust_bridge::IntoDart for FrbWrapper { - fn into_dart(self) -> flutter_rust_bridge::for_generated::DartAbi { - match self.0 { - crate::api::api::PosterRole::PRPosterRoleBackdrop => 0.into_dart(), - crate::api::api::PosterRole::PRPosterRoleIncomingCall => 1.into_dart(), - _ => unreachable!(), - } + +impl SseEncode for Arc> { + // Codec=Sse (Serialization based), see doc to use other codecs + fn sse_encode(self, serializer: &mut flutter_rust_bridge::for_generated::SseSerializer) { + >, + >, + >>::sse_encode( + flutter_rust_bridge::for_generated::rust_auto_opaque_encode::<_, MoiArc<_>>(self), + serializer, + ); } } -impl flutter_rust_bridge::for_generated::IntoDartExceptPrimitive - for FrbWrapper -{ + +impl SseEncode for Arc>> { + // Codec=Sse (Serialization based), see doc to use other codecs + fn sse_encode(self, serializer: &mut flutter_rust_bridge::for_generated::SseSerializer) { + >>, + >, + >>::sse_encode( + flutter_rust_bridge::for_generated::rust_auto_opaque_encode::<_, MoiArc<_>>(self), + serializer, + ); + } } -impl flutter_rust_bridge::IntoIntoDart> - for crate::api::api::PosterRole -{ - fn into_into_dart(self) -> FrbWrapper { - self.into() + +impl SseEncode for Arc>>> { + // Codec=Sse (Serialization based), see doc to use other codecs + fn sse_encode(self, serializer: &mut flutter_rust_bridge::for_generated::SseSerializer) { + >>>, + >, + >>::sse_encode( + flutter_rust_bridge::for_generated::rust_auto_opaque_encode::<_, MoiArc<_>>(self), + serializer, + ); } } -// Codec=Dco (DartCObject based), see doc to use other codecs -impl flutter_rust_bridge::IntoDart for FrbWrapper { - fn into_dart(self) -> flutter_rust_bridge::for_generated::DartAbi { - match self.0 { - crate::api::api::PosterType::Photo { assets } => { - [0.into_dart(), assets.into_into_dart().into_dart()].into_dart() - } - crate::api::api::PosterType::Monogram { data, background } => [ - 1.into_dart(), - data.into_into_dart().into_dart(), - background.into_into_dart().into_dart(), - ] - .into_dart(), - crate::api::api::PosterType::Memoji { data, background } => [ - 2.into_dart(), - data.into_into_dart().into_dart(), - background.into_into_dart().into_dart(), - ] - .into_dart(), - crate::api::api::PosterType::TranscriptDynamic { data } => { - [3.into_dart(), data.into_into_dart().into_dart()].into_dart() - } - crate::api::api::PosterType::TranscriptGradient { colors } => { - [4.into_dart(), colors.into_into_dart().into_dart()].into_dart() - } - _ => { - unimplemented!(""); - } - } + +impl SseEncode for Arc>> { + // Codec=Sse (Serialization based), see doc to use other codecs + fn sse_encode(self, serializer: &mut flutter_rust_bridge::for_generated::SseSerializer) { + >>, + >, + >>::sse_encode( + flutter_rust_bridge::for_generated::rust_auto_opaque_encode::<_, MoiArc<_>>(self), + serializer, + ); } } -impl flutter_rust_bridge::for_generated::IntoDartExceptPrimitive - for FrbWrapper -{ + +impl SseEncode for Arc> { + // Codec=Sse (Serialization based), see doc to use other codecs + fn sse_encode(self, serializer: &mut flutter_rust_bridge::for_generated::SseSerializer) { + >, + >, + >>::sse_encode( + flutter_rust_bridge::for_generated::rust_auto_opaque_encode::<_, MoiArc<_>>(self), + serializer, + ); + } } -impl flutter_rust_bridge::IntoIntoDart> - for crate::api::api::PosterType -{ - fn into_into_dart(self) -> FrbWrapper { - self.into() + +impl SseEncode for Arc> { + // Codec=Sse (Serialization based), see doc to use other codecs + fn sse_encode(self, serializer: &mut flutter_rust_bridge::for_generated::SseSerializer) { + >, + >, + >>::sse_encode( + flutter_rust_bridge::for_generated::rust_auto_opaque_encode::<_, MoiArc<_>>(self), + serializer, + ); } } -// Codec=Dco (DartCObject based), see doc to use other codecs -impl flutter_rust_bridge::IntoDart for FrbWrapper { - fn into_dart(self) -> flutter_rust_bridge::for_generated::DartAbi { - [ - self.0.preferred_style.into_into_dart().into_dart(), - self.0.identifier.into_into_dart().into_dart(), - self.0.suggested.into_into_dart().into_dart(), - self.0.color.into_into_dart().into_dart(), - ] - .into_dart() + +impl SseEncode for Arc> { + // Codec=Sse (Serialization based), see doc to use other codecs + fn sse_encode(self, serializer: &mut flutter_rust_bridge::for_generated::SseSerializer) { + >>, + >>::sse_encode( + flutter_rust_bridge::for_generated::rust_auto_opaque_encode::<_, MoiArc<_>>(self), + serializer, + ); } } -impl flutter_rust_bridge::for_generated::IntoDartExceptPrimitive - for FrbWrapper -{ + +impl SseEncode for Arc { + // Codec=Sse (Serialization based), see doc to use other codecs + fn sse_encode(self, serializer: &mut flutter_rust_bridge::for_generated::SseSerializer) { + >, + >>::sse_encode( + flutter_rust_bridge::for_generated::rust_auto_opaque_encode::<_, MoiArc<_>>(self), + serializer, + ); + } } -impl flutter_rust_bridge::IntoIntoDart> - for crate::api::api::PRPosterColor -{ - fn into_into_dart(self) -> FrbWrapper { - self.into() + +impl SseEncode for Arc> { + // Codec=Sse (Serialization based), see doc to use other codecs + fn sse_encode(self, serializer: &mut flutter_rust_bridge::for_generated::SseSerializer) { + >, + >, + >>::sse_encode( + flutter_rust_bridge::for_generated::rust_auto_opaque_encode::<_, MoiArc<_>>(self), + serializer, + ); } } -// Codec=Dco (DartCObject based), see doc to use other codecs -impl flutter_rust_bridge::IntoDart for FrbWrapper { - fn into_dart(self) -> flutter_rust_bridge::for_generated::DartAbi { - match self.0 { - crate::api::api::PRPosterContentMaterialStyle::PRPosterContentDiscreteColorsStyle { - variation, - colors, - vibrant, - supports_variation, - needs_to_resolve_variation, - } => [ - 0.into_dart(), - variation.into_into_dart().into_dart(), - colors.into_into_dart().into_dart(), - vibrant.into_into_dart().into_dart(), - supports_variation.into_into_dart().into_dart(), - needs_to_resolve_variation.into_into_dart().into_dart(), - ] - .into_dart(), - crate::api::api::PRPosterContentMaterialStyle::PRPosterContentVibrantMaterialStyle => { - [1.into_dart()].into_dart() - } - crate::api::api::PRPosterContentMaterialStyle::PRPosterContentGradientStyle { - gradient_type, - colors, - start_point, - locations, - end_point, - } => [ - 2.into_dart(), - gradient_type.into_into_dart().into_dart(), - colors.into_into_dart().into_dart(), - start_point.into_into_dart().into_dart(), - locations.into_into_dart().into_dart(), - end_point.into_into_dart().into_dart(), - ] - .into_dart(), - _ => { - unimplemented!(""); - } - } + +impl SseEncode for Arc> { + // Codec=Sse (Serialization based), see doc to use other codecs + fn sse_encode(self, serializer: &mut flutter_rust_bridge::for_generated::SseSerializer) { + >, + >, + >>::sse_encode( + flutter_rust_bridge::for_generated::rust_auto_opaque_encode::<_, MoiArc<_>>(self), + serializer, + ); } } -impl flutter_rust_bridge::for_generated::IntoDartExceptPrimitive - for FrbWrapper -{ -} -impl flutter_rust_bridge::IntoIntoDart> - for crate::api::api::PRPosterContentMaterialStyle -{ - fn into_into_dart(self) -> FrbWrapper { - self.into() + +impl SseEncode for Asset { + // Codec=Sse (Serialization based), see doc to use other codecs + fn sse_encode(self, serializer: &mut flutter_rust_bridge::for_generated::SseSerializer) { + >>::sse_encode( + flutter_rust_bridge::for_generated::rust_auto_opaque_encode::<_, MoiArc<_>>(self), + serializer, + ); } } -// Codec=Dco (DartCObject based), see doc to use other codecs -impl flutter_rust_bridge::IntoDart - for FrbWrapper -{ - fn into_dart(self) -> flutter_rust_bridge::for_generated::DartAbi { - [ - self.0.is_system_item.into_into_dart().into_dart(), - self.0.time_font_identifier.into_into_dart().into_dart(), - self.0.weight.into_into_dart().into_dart(), - ] - .into_dart() + +impl SseEncode for ChannelInterestToken { + // Codec=Sse (Serialization based), see doc to use other codecs + fn sse_encode(self, serializer: &mut flutter_rust_bridge::for_generated::SseSerializer) { + , + >>::sse_encode( + flutter_rust_bridge::for_generated::rust_auto_opaque_encode::<_, MoiArc<_>>(self), + serializer, + ); } } -impl flutter_rust_bridge::for_generated::IntoDartExceptPrimitive - for FrbWrapper -{ -} -impl - flutter_rust_bridge::IntoIntoDart< - FrbWrapper, - > for crate::api::api::PRPosterSystemTimeFontConfiguration -{ - fn into_into_dart(self) -> FrbWrapper { - self.into() + +impl SseEncode for CircleClientSession { + // Codec=Sse (Serialization based), see doc to use other codecs + fn sse_encode(self, serializer: &mut flutter_rust_bridge::for_generated::SseSerializer) { + , + >, + >>::sse_encode( + flutter_rust_bridge::for_generated::rust_auto_opaque_encode::<_, MoiArc<_>>(self), + serializer, + ); } } -// Codec=Dco (DartCObject based), see doc to use other codecs -impl flutter_rust_bridge::IntoDart - for FrbWrapper -{ - fn into_dart(self) -> flutter_rust_bridge::for_generated::DartAbi { - [ - self.0.alternate_date_enabled.into_into_dart().into_dart(), - self.0.contents_luminence.into_into_dart().into_dart(), - self.0.group_name.into_into_dart().into_dart(), - self.0 - .preferred_title_alignment - .into_into_dart() - .into_dart(), - self.0.preferred_title_layout.into_into_dart().into_dart(), - self.0.time_font_configuration.into_into_dart().into_dart(), - self.0.time_numbering_system.into_into_dart().into_dart(), - self.0.title_color.into_into_dart().into_dart(), - self.0.title_content_style.into_into_dart().into_dart(), - self.0.user_configured.into_into_dart().into_dart(), - self.0.title_style.into_into_dart().into_dart(), - ] - .into_dart() + +impl SseEncode for CloudSyncPreparedMessageCreateHandle { + // Codec=Sse (Serialization based), see doc to use other codecs + fn sse_encode(self, serializer: &mut flutter_rust_bridge::for_generated::SseSerializer) { + , + >>::sse_encode( + flutter_rust_bridge::for_generated::rust_auto_opaque_encode::<_, MoiArc<_>>(self), + serializer, + ); } } -impl flutter_rust_bridge::for_generated::IntoDartExceptPrimitive - for FrbWrapper -{ -} -impl flutter_rust_bridge::IntoIntoDart> - for crate::api::api::PRPosterTitleStyleConfiguration -{ - fn into_into_dart(self) -> FrbWrapper { - self.into() + +impl SseEncode for ConversationLink { + // Codec=Sse (Serialization based), see doc to use other codecs + fn sse_encode(self, serializer: &mut flutter_rust_bridge::for_generated::SseSerializer) { + >>::sse_encode(flutter_rust_bridge::for_generated::rust_auto_opaque_encode::<_, MoiArc<_>>(self), serializer); } } -// Codec=Dco (DartCObject based), see doc to use other codecs -impl flutter_rust_bridge::IntoDart for FrbWrapper { - fn into_dart(self) -> flutter_rust_bridge::for_generated::DartAbi { - [ - self.0.uuid.into_into_dart().into_dart(), - self.0.device_name.into_into_dart().into_dart(), - self.0.token.into_into_dart().into_dart(), - self.0.is_hsa_trusted.into_into_dart().into_dart(), - self.0.identites.into_into_dart().into_dart(), - self.0.sub_services.into_into_dart().into_dart(), - ] - .into_dart() + +impl SseEncode for ConversationParticipant { + // Codec=Sse (Serialization based), see doc to use other codecs + fn sse_encode(self, serializer: &mut flutter_rust_bridge::for_generated::SseSerializer) { + , + >>::sse_encode( + flutter_rust_bridge::for_generated::rust_auto_opaque_encode::<_, MoiArc<_>>(self), + serializer, + ); } } -impl flutter_rust_bridge::for_generated::IntoDartExceptPrimitive - for FrbWrapper -{ -} -impl flutter_rust_bridge::IntoIntoDart> - for crate::api::api::PrivateDeviceInfo -{ - fn into_into_dart(self) -> FrbWrapper { - self.into() + +impl SseEncode for Date { + // Codec=Sse (Serialization based), see doc to use other codecs + fn sse_encode(self, serializer: &mut flutter_rust_bridge::for_generated::SseSerializer) { + >>::sse_encode( + flutter_rust_bridge::for_generated::rust_auto_opaque_encode::<_, MoiArc<_>>(self), + serializer, + ); } } -// Codec=Dco (DartCObject based), see doc to use other codecs -impl flutter_rust_bridge::IntoDart for crate::api::api::ProvisionedFlavor { - fn into_dart(self) -> flutter_rust_bridge::for_generated::DartAbi { - match self { - Self::Mac => 0.into_dart(), - Self::IOS => 1.into_dart(), - _ => unreachable!(), - } + +impl SseEncode for EscrowData { + // Codec=Sse (Serialization based), see doc to use other codecs + fn sse_encode(self, serializer: &mut flutter_rust_bridge::for_generated::SseSerializer) { + >>::sse_encode(flutter_rust_bridge::for_generated::rust_auto_opaque_encode::<_, MoiArc<_>>(self), serializer); } } -impl flutter_rust_bridge::for_generated::IntoDartExceptPrimitive - for crate::api::api::ProvisionedFlavor -{ -} -impl flutter_rust_bridge::IntoIntoDart - for crate::api::api::ProvisionedFlavor -{ - fn into_into_dart(self) -> crate::api::api::ProvisionedFlavor { - self + +impl SseEncode for FindMyFriendsClient { + // Codec=Sse (Serialization based), see doc to use other codecs + fn sse_encode(self, serializer: &mut flutter_rust_bridge::for_generated::SseSerializer) { + , + >, + >>::sse_encode( + flutter_rust_bridge::for_generated::rust_auto_opaque_encode::<_, MoiArc<_>>(self), + serializer, + ); } } -// Codec=Dco (DartCObject based), see doc to use other codecs -impl flutter_rust_bridge::IntoDart for crate::api::api::PushMessage { - fn into_dart(self) -> flutter_rust_bridge::for_generated::DartAbi { - match self { - crate::api::api::PushMessage::IMessage(field0) => { - [0.into_dart(), field0.into_into_dart().into_dart()].into_dart() - } - crate::api::api::PushMessage::SendConfirm { uuid, error } => [ - 1.into_dart(), - uuid.into_into_dart().into_dart(), - error.into_into_dart().into_dart(), - ] - .into_dart(), - crate::api::api::PushMessage::RegistrationState(field0) => { - [2.into_dart(), field0.into_into_dart().into_dart()].into_dart() - } - crate::api::api::PushMessage::NewPhotostream(field0) => { - [3.into_dart(), field0.into_into_dart().into_dart()].into_dart() - } - crate::api::api::PushMessage::FaceTime(field0) => { - [4.into_dart(), field0.into_into_dart().into_dart()].into_dart() - } - crate::api::api::PushMessage::StatusUpdate(field0) => { - [5.into_dart(), field0.into_into_dart().into_dart()].into_dart() - } - crate::api::api::PushMessage::Idms(field0) => { - [6.into_dart(), field0.into_into_dart().into_dart()].into_dart() - } - crate::api::api::PushMessage::TwoFaAuthEvent(field0) => { - [7.into_dart(), field0.into_into_dart().into_dart()].into_dart() - } - crate::api::api::PushMessage::CircleFinishEvent => [8.into_dart()].into_dart(), - crate::api::api::PushMessage::BeaconShared { - sender, - beacon, - attributes, - } => [ - 9.into_dart(), - sender.into_into_dart().into_dart(), - beacon.into_into_dart().into_dart(), - attributes.into_into_dart().into_dart(), - ] - .into_dart(), - _ => { - unimplemented!(""); - } - } + +impl SseEncode for FindMyPhoneClient { + // Codec=Sse (Serialization based), see doc to use other codecs + fn sse_encode(self, serializer: &mut flutter_rust_bridge::for_generated::SseSerializer) { + , + >, + >>::sse_encode( + flutter_rust_bridge::for_generated::rust_auto_opaque_encode::<_, MoiArc<_>>(self), + serializer, + ); } } -impl flutter_rust_bridge::for_generated::IntoDartExceptPrimitive for crate::api::api::PushMessage {} -impl flutter_rust_bridge::IntoIntoDart - for crate::api::api::PushMessage -{ - fn into_into_dart(self) -> crate::api::api::PushMessage { - self + +impl SseEncode for GZipWrapper { + // Codec=Sse (Serialization based), see doc to use other codecs + fn sse_encode(self, serializer: &mut flutter_rust_bridge::for_generated::SseSerializer) { + >, + >>::sse_encode( + flutter_rust_bridge::for_generated::rust_auto_opaque_encode::<_, MoiArc<_>>(self), + serializer, + ); } } -// Codec=Dco (DartCObject based), see doc to use other codecs -impl flutter_rust_bridge::IntoDart for crate::api::api::QuotaInfo { - fn into_dart(self) -> flutter_rust_bridge::for_generated::DartAbi { - [ - self.total_bytes.into_into_dart().into_dart(), - self.available_bytes.into_into_dart().into_dart(), - self.messages_bytes.into_into_dart().into_dart(), - ] - .into_dart() + +impl SseEncode for GZipWrapper { + // Codec=Sse (Serialization based), see doc to use other codecs + fn sse_encode(self, serializer: &mut flutter_rust_bridge::for_generated::SseSerializer) { + >, + >>::sse_encode( + flutter_rust_bridge::for_generated::rust_auto_opaque_encode::<_, MoiArc<_>>(self), + serializer, + ); } } -impl flutter_rust_bridge::for_generated::IntoDartExceptPrimitive for crate::api::api::QuotaInfo {} -impl flutter_rust_bridge::IntoIntoDart for crate::api::api::QuotaInfo { - fn into_into_dart(self) -> crate::api::api::QuotaInfo { - self + +impl SseEncode for GZipWrapper { + // Codec=Sse (Serialization based), see doc to use other codecs + fn sse_encode(self, serializer: &mut flutter_rust_bridge::for_generated::SseSerializer) { + >, + >>::sse_encode( + flutter_rust_bridge::for_generated::rust_auto_opaque_encode::<_, MoiArc<_>>(self), + serializer, + ); } } -// Codec=Dco (DartCObject based), see doc to use other codecs -impl flutter_rust_bridge::IntoDart for FrbWrapper { - fn into_dart(self) -> flutter_rust_bridge::for_generated::DartAbi { - [ - self.0.to_uuid.into_into_dart().into_dart(), - self.0.to_part.into_into_dart().into_dart(), - self.0.reaction.into_into_dart().into_dart(), - self.0.to_text.into_into_dart().into_dart(), - self.0.embedded_profile.into_into_dart().into_dart(), - ] - .into_dart() + +impl SseEncode for GZipWrapper { + // Codec=Sse (Serialization based), see doc to use other codecs + fn sse_encode(self, serializer: &mut flutter_rust_bridge::for_generated::SseSerializer) { + >, + >>::sse_encode( + flutter_rust_bridge::for_generated::rust_auto_opaque_encode::<_, MoiArc<_>>(self), + serializer, + ); } } -impl flutter_rust_bridge::for_generated::IntoDartExceptPrimitive - for FrbWrapper -{ -} -impl flutter_rust_bridge::IntoIntoDart> - for crate::api::api::ReactMessage -{ - fn into_into_dart(self) -> FrbWrapper { - self.into() + +impl SseEncode for GZipWrapper { + // Codec=Sse (Serialization based), see doc to use other codecs + fn sse_encode(self, serializer: &mut flutter_rust_bridge::for_generated::SseSerializer) { + >, + >>::sse_encode( + flutter_rust_bridge::for_generated::rust_auto_opaque_encode::<_, MoiArc<_>>(self), + serializer, + ); } } -// Codec=Dco (DartCObject based), see doc to use other codecs -impl flutter_rust_bridge::IntoDart for FrbWrapper { - fn into_dart(self) -> flutter_rust_bridge::for_generated::DartAbi { - match self.0 { - crate::api::api::ReactMessageType::React { reaction, enable } => [ - 0.into_dart(), - reaction.into_into_dart().into_dart(), - enable.into_into_dart().into_dart(), - ] - .into_dart(), - crate::api::api::ReactMessageType::Extension { - spec, - body, - is_meta, - } => [ - 1.into_dart(), - spec.into_into_dart().into_dart(), - body.into_into_dart().into_dart(), - is_meta.into_into_dart().into_dart(), - ] - .into_dart(), - _ => { - unimplemented!(""); - } - } + +impl SseEncode for GZipWrapper { + // Codec=Sse (Serialization based), see doc to use other codecs + fn sse_encode(self, serializer: &mut flutter_rust_bridge::for_generated::SseSerializer) { + >, + >>::sse_encode( + flutter_rust_bridge::for_generated::rust_auto_opaque_encode::<_, MoiArc<_>>(self), + serializer, + ); } } -impl flutter_rust_bridge::for_generated::IntoDartExceptPrimitive - for FrbWrapper -{ + +impl SseEncode for IDSNGMIdentity { + // Codec=Sse (Serialization based), see doc to use other codecs + fn sse_encode(self, serializer: &mut flutter_rust_bridge::for_generated::SseSerializer) { + >>::sse_encode(flutter_rust_bridge::for_generated::rust_auto_opaque_encode::<_, MoiArc<_>>(self), serializer); + } } -impl flutter_rust_bridge::IntoIntoDart> - for crate::api::api::ReactMessageType -{ - fn into_into_dart(self) -> FrbWrapper { - self.into() + +impl SseEncode for IDSUser { + // Codec=Sse (Serialization based), see doc to use other codecs + fn sse_encode(self, serializer: &mut flutter_rust_bridge::for_generated::SseSerializer) { + >>::sse_encode(flutter_rust_bridge::for_generated::rust_auto_opaque_encode::<_, MoiArc<_>>(self), serializer); } } -// Codec=Dco (DartCObject based), see doc to use other codecs -impl flutter_rust_bridge::IntoDart for FrbWrapper { - fn into_dart(self) -> flutter_rust_bridge::for_generated::DartAbi { - match self.0 { - crate::api::api::Reaction::Heart => [0.into_dart()].into_dart(), - crate::api::api::Reaction::Like => [1.into_dart()].into_dart(), - crate::api::api::Reaction::Dislike => [2.into_dart()].into_dart(), - crate::api::api::Reaction::Laugh => [3.into_dart()].into_dart(), - crate::api::api::Reaction::Emphasize => [4.into_dart()].into_dart(), - crate::api::api::Reaction::Question => [5.into_dart()].into_dart(), - crate::api::api::Reaction::Emoji(field0) => { - [6.into_dart(), field0.into_into_dart().into_dart()].into_dart() - } - crate::api::api::Reaction::Sticker { spec, body } => [ - 7.into_dart(), - spec.into_into_dart().into_dart(), - body.into_into_dart().into_dart(), - ] - .into_dart(), - _ => { - unimplemented!(""); - } - } + +impl SseEncode for JoinedOSConfig { + // Codec=Sse (Serialization based), see doc to use other codecs + fn sse_encode(self, serializer: &mut flutter_rust_bridge::for_generated::SseSerializer) { + >>::sse_encode(flutter_rust_bridge::for_generated::rust_auto_opaque_encode::<_, MoiArc<_>>(self), serializer); } } -impl flutter_rust_bridge::for_generated::IntoDartExceptPrimitive - for FrbWrapper -{ + +impl SseEncode for LocationReport { + // Codec=Sse (Serialization based), see doc to use other codecs + fn sse_encode(self, serializer: &mut flutter_rust_bridge::for_generated::SseSerializer) { + >>::sse_encode(flutter_rust_bridge::for_generated::rust_auto_opaque_encode::<_, MoiArc<_>>(self), serializer); + } } -impl flutter_rust_bridge::IntoIntoDart> - for crate::api::api::Reaction -{ - fn into_into_dart(self) -> FrbWrapper { - self.into() + +impl SseEncode for MessageFlags { + // Codec=Sse (Serialization based), see doc to use other codecs + fn sse_encode(self, serializer: &mut flutter_rust_bridge::for_generated::SseSerializer) { + >>::sse_encode(flutter_rust_bridge::for_generated::rust_auto_opaque_encode::<_, MoiArc<_>>(self), serializer); } } -// Codec=Dco (DartCObject based), see doc to use other codecs -impl flutter_rust_bridge::IntoDart for crate::api::api::RegisterState { - fn into_dart(self) -> flutter_rust_bridge::for_generated::DartAbi { - match self { - crate::api::api::RegisterState::Registered { next_s } => { - [0.into_dart(), next_s.into_into_dart().into_dart()].into_dart() - } - crate::api::api::RegisterState::Registering => [1.into_dart()].into_dart(), - crate::api::api::RegisterState::Failed { retry_wait, error } => [ - 2.into_dart(), - retry_wait.into_into_dart().into_dart(), - error.into_into_dart().into_dart(), - ] - .into_dart(), - _ => { - unimplemented!(""); - } - } + +impl SseEncode for NSArray { + // Codec=Sse (Serialization based), see doc to use other codecs + fn sse_encode(self, serializer: &mut flutter_rust_bridge::for_generated::SseSerializer) { + >, + >>::sse_encode( + flutter_rust_bridge::for_generated::rust_auto_opaque_encode::<_, MoiArc<_>>(self), + serializer, + ); } } -impl flutter_rust_bridge::for_generated::IntoDartExceptPrimitive - for crate::api::api::RegisterState -{ + +impl SseEncode for NSArray { + // Codec=Sse (Serialization based), see doc to use other codecs + fn sse_encode(self, serializer: &mut flutter_rust_bridge::for_generated::SseSerializer) { + >, + >>::sse_encode( + flutter_rust_bridge::for_generated::rust_auto_opaque_encode::<_, MoiArc<_>>(self), + serializer, + ); + } } -impl flutter_rust_bridge::IntoIntoDart - for crate::api::api::RegisterState -{ - fn into_into_dart(self) -> crate::api::api::RegisterState { - self + +impl SseEncode for PushError { + // Codec=Sse (Serialization based), see doc to use other codecs + fn sse_encode(self, serializer: &mut flutter_rust_bridge::for_generated::SseSerializer) { + >>::sse_encode(flutter_rust_bridge::for_generated::rust_auto_opaque_encode::<_, MoiArc<_>>(self), serializer); } } -// Codec=Dco (DartCObject based), see doc to use other codecs -impl flutter_rust_bridge::IntoDart for FrbWrapper { - fn into_dart(self) -> flutter_rust_bridge::for_generated::DartAbi { - [self.0.new_name.into_into_dart().into_dart()].into_dart() + +impl SseEncode for Receiver { + // Codec=Sse (Serialization based), see doc to use other codecs + fn sse_encode(self, serializer: &mut flutter_rust_bridge::for_generated::SseSerializer) { + >, + >>::sse_encode( + flutter_rust_bridge::for_generated::rust_auto_opaque_encode::<_, MoiArc<_>>(self), + serializer, + ); } } -impl flutter_rust_bridge::for_generated::IntoDartExceptPrimitive - for FrbWrapper -{ + +impl SseEncode for SavedHardwareState { + // Codec=Sse (Serialization based), see doc to use other codecs + fn sse_encode(self, serializer: &mut flutter_rust_bridge::for_generated::SseSerializer) { + >>::sse_encode(flutter_rust_bridge::for_generated::rust_auto_opaque_encode::<_, MoiArc<_>>(self), serializer); + } } -impl flutter_rust_bridge::IntoIntoDart> - for crate::api::api::RenameMessage -{ - fn into_into_dart(self) -> FrbWrapper { - self.into() + +impl SseEncode for Sender<()> { + // Codec=Sse (Serialization based), see doc to use other codecs + fn sse_encode(self, serializer: &mut flutter_rust_bridge::for_generated::SseSerializer) { + >>>::sse_encode(flutter_rust_bridge::for_generated::rust_auto_opaque_encode::<_, MoiArc<_>>(self), serializer); } } -// Codec=Dco (DartCObject based), see doc to use other codecs -impl flutter_rust_bridge::IntoDart for FrbWrapper { - fn into_dart(self) -> flutter_rust_bridge::for_generated::DartAbi { - [ - self.0.guid.into_into_dart().into_dart(), - self.0.sender.into_into_dart().into_dart(), - self.0.conversation_size.into_into_dart().into_dart(), - self.0.parts.into_into_dart().into_dart(), - self.0.time_of_message.into_into_dart().into_dart(), - ] - .into_dart() + +impl SseEncode for StCollapsedValue { + // Codec=Sse (Serialization based), see doc to use other codecs + fn sse_encode(self, serializer: &mut flutter_rust_bridge::for_generated::SseSerializer) { + >>::sse_encode(flutter_rust_bridge::for_generated::rust_auto_opaque_encode::<_, MoiArc<_>>(self), serializer); } } -impl flutter_rust_bridge::for_generated::IntoDartExceptPrimitive - for FrbWrapper -{ -} -impl flutter_rust_bridge::IntoIntoDart> - for crate::api::api::ReportMessage -{ - fn into_into_dart(self) -> FrbWrapper { - self.into() + +impl SseEncode for SyncManager { + // Codec=Sse (Serialization based), see doc to use other codecs + fn sse_encode(self, serializer: &mut flutter_rust_bridge::for_generated::SseSerializer) { + , + >, + >>::sse_encode( + flutter_rust_bridge::for_generated::rust_auto_opaque_encode::<_, MoiArc<_>>(self), + serializer, + ); } } -// Codec=Dco (DartCObject based), see doc to use other codecs -impl flutter_rust_bridge::IntoDart - for FrbWrapper -{ - fn into_dart(self) -> flutter_rust_bridge::for_generated::DartAbi { - [ - self.0.mime_type.into_into_dart().into_dart(), - self.0 - .rich_link_image_attachment_substitute_index - .into_into_dart() - .into_dart(), - ] - .into_dart() + +impl SseEncode for SystemTime { + // Codec=Sse (Serialization based), see doc to use other codecs + fn sse_encode(self, serializer: &mut flutter_rust_bridge::for_generated::SseSerializer) { + >>::sse_encode(flutter_rust_bridge::for_generated::rust_auto_opaque_encode::<_, MoiArc<_>>(self), serializer); } } -impl flutter_rust_bridge::for_generated::IntoDartExceptPrimitive - for FrbWrapper -{ + +impl SseEncode for VerifyBody { + // Codec=Sse (Serialization based), see doc to use other codecs + fn sse_encode(self, serializer: &mut flutter_rust_bridge::for_generated::SseSerializer) { + >>::sse_encode(flutter_rust_bridge::for_generated::rust_auto_opaque_encode::<_, MoiArc<_>>(self), serializer); + } } -impl - flutter_rust_bridge::IntoIntoDart< - FrbWrapper, - > for crate::api::api::RichLinkImageAttachmentSubstitute -{ - fn into_into_dart(self) -> FrbWrapper { - self.into() + +impl SseEncode for ViableBottle { + // Codec=Sse (Serialization based), see doc to use other codecs + fn sse_encode(self, serializer: &mut flutter_rust_bridge::for_generated::SseSerializer) { + >>::sse_encode(flutter_rust_bridge::for_generated::rust_auto_opaque_encode::<_, MoiArc<_>>(self), serializer); } } -// Codec=Dco (DartCObject based), see doc to use other codecs -impl flutter_rust_bridge::IntoDart for FrbWrapper { - fn into_dart(self) -> flutter_rust_bridge::for_generated::DartAbi { - [ - self.0.ms.into_into_dart().into_dart(), - self.0.schedule.into_into_dart().into_dart(), - ] - .into_dart() + +impl SseEncode for flutter_rust_bridge::DartOpaque { + // Codec=Sse (Serialization based), see doc to use other codecs + fn sse_encode(self, serializer: &mut flutter_rust_bridge::for_generated::SseSerializer) { + ::sse_encode(self.encode(), serializer); } } -impl flutter_rust_bridge::for_generated::IntoDartExceptPrimitive - for FrbWrapper -{ + +impl SseEncode for std::collections::HashMap { + // Codec=Sse (Serialization based), see doc to use other codecs + fn sse_encode(self, serializer: &mut flutter_rust_bridge::for_generated::SseSerializer) { + >::sse_encode(self.into_iter().collect(), serializer); + } } -impl flutter_rust_bridge::IntoIntoDart> - for crate::api::api::ScheduleMode -{ - fn into_into_dart(self) -> FrbWrapper { - self.into() + +impl SseEncode for std::collections::HashMap { + // Codec=Sse (Serialization based), see doc to use other codecs + fn sse_encode(self, serializer: &mut flutter_rust_bridge::for_generated::SseSerializer) { + >::sse_encode(self.into_iter().collect(), serializer); } } -// Codec=Dco (DartCObject based), see doc to use other codecs -impl flutter_rust_bridge::IntoDart for FrbWrapper { - fn into_dart(self) -> flutter_rust_bridge::for_generated::DartAbi { - match self.0 { - crate::api::api::SetTranscriptBackgroundMessage::Remove { - aid, - bid, - chat_id, - remove, - } => [ - 0.into_dart(), - aid.into_into_dart().into_dart(), - bid.into_into_dart().into_dart(), - chat_id.into_into_dart().into_dart(), - remove.into_into_dart().into_dart(), - ] - .into_dart(), - crate::api::api::SetTranscriptBackgroundMessage::Set { - aid, - bid, - chat_id, - object_id, - payload_version, - background_id, - url, - signature, - key, - file_size, - } => [ - 1.into_dart(), - aid.into_into_dart().into_dart(), - bid.into_into_dart().into_dart(), - chat_id.into_into_dart().into_dart(), - object_id.into_into_dart().into_dart(), - payload_version.into_into_dart().into_dart(), - background_id.into_into_dart().into_dart(), - url.into_into_dart().into_dart(), - signature.into_into_dart().into_dart(), - key.into_into_dart().into_dart(), - file_size.into_into_dart().into_dart(), - ] - .into_dart(), - _ => { - unimplemented!(""); - } - } + +impl SseEncode for std::collections::HashMap { + // Codec=Sse (Serialization based), see doc to use other codecs + fn sse_encode(self, serializer: &mut flutter_rust_bridge::for_generated::SseSerializer) { + >::sse_encode(self.into_iter().collect(), serializer); } } -impl flutter_rust_bridge::for_generated::IntoDartExceptPrimitive - for FrbWrapper -{ + +impl SseEncode for std::collections::HashMap { + // Codec=Sse (Serialization based), see doc to use other codecs + fn sse_encode(self, serializer: &mut flutter_rust_bridge::for_generated::SseSerializer) { + >::sse_encode(self.into_iter().collect(), serializer); + } } -impl flutter_rust_bridge::IntoIntoDart> - for crate::api::api::SetTranscriptBackgroundMessage -{ - fn into_into_dart(self) -> FrbWrapper { - self.into() + +impl SseEncode for std::collections::HashMap { + // Codec=Sse (Serialization based), see doc to use other codecs + fn sse_encode(self, serializer: &mut flutter_rust_bridge::for_generated::SseSerializer) { + >::sse_encode(self.into_iter().collect(), serializer); } } -// Codec=Dco (DartCObject based), see doc to use other codecs -impl flutter_rust_bridge::IntoDart for FrbWrapper { - fn into_dart(self) -> flutter_rust_bridge::for_generated::DartAbi { - [ - self.0.invitation_token.into_into_dart().into_dart(), - self.0.group_id.into_into_dart().into_dart(), - self.0.sent_time.into_into_dart().into_dart(), - self.0.group_name.into_into_dart().into_dart(), - self.0.share_url.into_into_dart().into_dart(), - self.0.invitee_handle.into_into_dart().into_dart(), - ] - .into_dart() + +impl SseEncode for std::collections::HashMap { + // Codec=Sse (Serialization based), see doc to use other codecs + fn sse_encode(self, serializer: &mut flutter_rust_bridge::for_generated::SseSerializer) { + >::sse_encode( + self.into_iter().collect(), + serializer, + ); } } -impl flutter_rust_bridge::for_generated::IntoDartExceptPrimitive - for FrbWrapper -{ + +impl SseEncode for std::collections::HashMap { + // Codec=Sse (Serialization based), see doc to use other codecs + fn sse_encode(self, serializer: &mut flutter_rust_bridge::for_generated::SseSerializer) { + >::sse_encode( + self.into_iter().collect(), + serializer, + ); + } } -impl flutter_rust_bridge::IntoIntoDart> - for crate::api::api::ShareInviteContentData -{ - fn into_into_dart(self) -> FrbWrapper { - self.into() + +impl SseEncode for std::collections::HashMap { + // Codec=Sse (Serialization based), see doc to use other codecs + fn sse_encode(self, serializer: &mut flutter_rust_bridge::for_generated::SseSerializer) { + >::sse_encode( + self.into_iter().collect(), + serializer, + ); } } -// Codec=Dco (DartCObject based), see doc to use other codecs -impl flutter_rust_bridge::IntoDart for FrbWrapper { - fn into_dart(self) -> flutter_rust_bridge::for_generated::DartAbi { - [ - self.0 - .cloud_kit_decryption_record_key - .into_into_dart() - .into_dart(), - self.0.cloud_kit_record_key.into_into_dart().into_dart(), - self.0.poster.into_into_dart().into_dart(), - ] - .into_dart() + +impl SseEncode for std::collections::HashMap { + // Codec=Sse (Serialization based), see doc to use other codecs + fn sse_encode(self, serializer: &mut flutter_rust_bridge::for_generated::SseSerializer) { + >::sse_encode( + self.into_iter().collect(), + serializer, + ); } } -impl flutter_rust_bridge::for_generated::IntoDartExceptPrimitive - for FrbWrapper -{ + +impl SseEncode for std::collections::HashMap { + // Codec=Sse (Serialization based), see doc to use other codecs + fn sse_encode(self, serializer: &mut flutter_rust_bridge::for_generated::SseSerializer) { + >::sse_encode( + self.into_iter().collect(), + serializer, + ); + } } -impl flutter_rust_bridge::IntoIntoDart> - for crate::api::api::ShareProfileMessage -{ - fn into_into_dart(self) -> FrbWrapper { - self.into() + +impl SseEncode for std::collections::HashMap> { + // Codec=Sse (Serialization based), see doc to use other codecs + fn sse_encode(self, serializer: &mut flutter_rust_bridge::for_generated::SseSerializer) { + )>>::sse_encode( + self.into_iter().collect(), + serializer, + ); } } -// Codec=Dco (DartCObject based), see doc to use other codecs -impl flutter_rust_bridge::IntoDart for FrbWrapper { - fn into_dart(self) -> flutter_rust_bridge::for_generated::DartAbi { - [ - self.0.name.into_into_dart().into_dart(), - self.0.fullname.into_into_dart().into_dart(), - self.0.email.into_into_dart().into_dart(), - self.0.albumguid.into_into_dart().into_dart(), - self.0.sharingtype.into_into_dart().into_dart(), - self.0.subscriptiondate.into_into_dart().into_dart(), - self.0.albumlocation.into_into_dart().into_dart(), - self.0.assets.into_into_dart().into_dart(), - self.0.delete.into_into_dart().into_dart(), - ] - .into_dart() + +impl SseEncode for std::collections::HashMap> { + // Codec=Sse (Serialization based), see doc to use other codecs + fn sse_encode(self, serializer: &mut flutter_rust_bridge::for_generated::SseSerializer) { + )>>::sse_encode(self.into_iter().collect(), serializer); } } -impl flutter_rust_bridge::for_generated::IntoDartExceptPrimitive - for FrbWrapper -{ + +impl SseEncode for std::collections::HashMap { + // Codec=Sse (Serialization based), see doc to use other codecs + fn sse_encode(self, serializer: &mut flutter_rust_bridge::for_generated::SseSerializer) { + >::sse_encode( + self.into_iter().collect(), + serializer, + ); + } } -impl flutter_rust_bridge::IntoIntoDart> - for crate::api::api::SharedAlbum -{ - fn into_into_dart(self) -> FrbWrapper { - self.into() + +impl SseEncode for std::collections::HashMap> { + // Codec=Sse (Serialization based), see doc to use other codecs + fn sse_encode(self, serializer: &mut flutter_rust_bridge::for_generated::SseSerializer) { + )>>::sse_encode( + self.into_iter().collect(), + serializer, + ); } } -// Codec=Dco (DartCObject based), see doc to use other codecs -impl flutter_rust_bridge::IntoDart for crate::api::api::SharedICloudServices { - fn into_dart(self) -> flutter_rust_bridge::for_generated::DartAbi { - [ - self.account.into_into_dart().into_dart(), - self.token_provider.into_into_dart().into_dart(), - self.cloudkit_client.into_into_dart().into_dart(), - self.keychain.into_into_dart().into_dart(), - self.passwords.into_into_dart().into_dart(), - self.profiles_client.into_into_dart().into_dart(), - self.fmfd.into_into_dart().into_dart(), - self.sharedstreams.into_into_dart().into_dart(), - self.cloud_messages_client.into_into_dart().into_dart(), - self.statuskit_client.into_into_dart().into_dart(), - ] - .into_dart() + +impl SseEncode for std::collections::HashMap> { + // Codec=Sse (Serialization based), see doc to use other codecs + fn sse_encode(self, serializer: &mut flutter_rust_bridge::for_generated::SseSerializer) { + )>>::sse_encode( + self.into_iter().collect(), + serializer, + ); } } -impl flutter_rust_bridge::for_generated::IntoDartExceptPrimitive - for crate::api::api::SharedICloudServices -{ + +impl SseEncode for std::collections::HashMap> { + // Codec=Sse (Serialization based), see doc to use other codecs + fn sse_encode(self, serializer: &mut flutter_rust_bridge::for_generated::SseSerializer) { + )>>::sse_encode( + self.into_iter().collect(), + serializer, + ); + } } -impl flutter_rust_bridge::IntoIntoDart - for crate::api::api::SharedICloudServices -{ - fn into_into_dart(self) -> crate::api::api::SharedICloudServices { - self + +impl SseEncode for std::collections::HashMap { + // Codec=Sse (Serialization based), see doc to use other codecs + fn sse_encode(self, serializer: &mut flutter_rust_bridge::for_generated::SseSerializer) { + >::sse_encode( + self.into_iter().collect(), + serializer, + ); } } -// Codec=Dco (DartCObject based), see doc to use other codecs -impl flutter_rust_bridge::IntoDart for FrbWrapper { - fn into_dart(self) -> flutter_rust_bridge::for_generated::DartAbi { - [ - self.0.low_res_wallpaper_tag.into_into_dart().into_dart(), - self.0.wallpaper_tag.into_into_dart().into_dart(), - self.0.message_tag.into_into_dart().into_dart(), - ] - .into_dart() + +impl SseEncode for std::collections::HashMap, crate::api::api::Passkey)> { + // Codec=Sse (Serialization based), see doc to use other codecs + fn sse_encode(self, serializer: &mut flutter_rust_bridge::for_generated::SseSerializer) { + , crate::api::api::Passkey))>>::sse_encode( + self.into_iter().collect(), + serializer, + ); } } -impl flutter_rust_bridge::for_generated::IntoDartExceptPrimitive - for FrbWrapper + +impl SseEncode + for std::collections::HashMap, crate::api::api::PasswordManagerMeta)> { + // Codec=Sse (Serialization based), see doc to use other codecs + fn sse_encode(self, serializer: &mut flutter_rust_bridge::for_generated::SseSerializer) { + , crate::api::api::PasswordManagerMeta), + )>>::sse_encode(self.into_iter().collect(), serializer); + } } -impl flutter_rust_bridge::IntoIntoDart> - for crate::api::api::SharedPoster + +impl SseEncode + for std::collections::HashMap, crate::api::api::PasswordRawEntry)> { - fn into_into_dart(self) -> FrbWrapper { - self.into() + // Codec=Sse (Serialization based), see doc to use other codecs + fn sse_encode(self, serializer: &mut flutter_rust_bridge::for_generated::SseSerializer) { + , crate::api::api::PasswordRawEntry))>>::sse_encode( + self.into_iter().collect(), + serializer, + ); } } -// Codec=Dco (DartCObject based), see doc to use other codecs -impl flutter_rust_bridge::IntoDart for crate::api::api::SharedPushState { - fn into_dart(self) -> flutter_rust_bridge::for_generated::DartAbi { - [ - self.os_config.into_into_dart().into_dart(), - self.cancel_poll.into_into_dart().into_dart(), - self.conf_dir.into_into_dart().into_dart(), - self.local_broadcast.into_into_dart().into_dart(), - self.anisette.into_into_dart().into_dart(), - self.conn.into_into_dart().into_dart(), - self.icloud_services.into_into_dart().into_dart(), - self.client.into_into_dart().into_dart(), - self.ft_client.into_into_dart().into_dart(), - self.idms_client.into_into_dart().into_dart(), - self.active_circle_sessions.into_into_dart().into_dart(), - self.client_session.into_into_dart().into_dart(), - ] - .into_dart() + +impl SseEncode + for std::collections::HashMap, crate::api::api::WifiPassword)> +{ + // Codec=Sse (Serialization based), see doc to use other codecs + fn sse_encode(self, serializer: &mut flutter_rust_bridge::for_generated::SseSerializer) { + , crate::api::api::WifiPassword))>>::sse_encode( + self.into_iter().collect(), + serializer, + ); } } -impl flutter_rust_bridge::for_generated::IntoDartExceptPrimitive - for crate::api::api::SharedPushState -{ + +impl SseEncode for std::collections::HashMap { + // Codec=Sse (Serialization based), see doc to use other codecs + fn sse_encode(self, serializer: &mut flutter_rust_bridge::for_generated::SseSerializer) { + >::sse_encode( + self.into_iter().collect(), + serializer, + ); + } } -impl flutter_rust_bridge::IntoIntoDart - for crate::api::api::SharedPushState -{ - fn into_into_dart(self) -> crate::api::api::SharedPushState { - self + +impl SseEncode for std::collections::HashMap { + // Codec=Sse (Serialization based), see doc to use other codecs + fn sse_encode(self, serializer: &mut flutter_rust_bridge::for_generated::SseSerializer) { + >::sse_encode( + self.into_iter().collect(), + serializer, + ); } } -// Codec=Dco (DartCObject based), see doc to use other codecs -impl flutter_rust_bridge::IntoDart for FrbWrapper { - fn into_dart(self) -> flutter_rust_bridge::for_generated::DartAbi { - [ - self.0.poster.into_into_dart().into_dart(), - self.0.text_metadata.into_into_dart().into_dart(), - self.0.low_res.into_into_dart().into_dart(), - ] - .into_dart() + +impl SseEncode for std::collections::HashMap { + // Codec=Sse (Serialization based), see doc to use other codecs + fn sse_encode(self, serializer: &mut flutter_rust_bridge::for_generated::SseSerializer) { + >::sse_encode( + self.into_iter().collect(), + serializer, + ); } } -impl flutter_rust_bridge::for_generated::IntoDartExceptPrimitive - for FrbWrapper + +impl SseEncode + for RustOpaqueMoi> { + // Codec=Sse (Serialization based), see doc to use other codecs + fn sse_encode(self, serializer: &mut flutter_rust_bridge::for_generated::SseSerializer) { + let (ptr, size) = self.sse_encode_raw(); + ::sse_encode(ptr, serializer); + ::sse_encode(size, serializer); + } } -impl flutter_rust_bridge::IntoIntoDart> - for crate::api::api::SimplifiedIncomingCallPoster + +impl SseEncode + for RustOpaqueMoi> { - fn into_into_dart(self) -> FrbWrapper { - self.into() + // Codec=Sse (Serialization based), see doc to use other codecs + fn sse_encode(self, serializer: &mut flutter_rust_bridge::for_generated::SseSerializer) { + let (ptr, size) = self.sse_encode_raw(); + ::sse_encode(ptr, serializer); + ::sse_encode(size, serializer); } } -// Codec=Dco (DartCObject based), see doc to use other codecs -impl flutter_rust_bridge::IntoDart for FrbWrapper { - fn into_dart(self) -> flutter_rust_bridge::for_generated::DartAbi { - [ - self.0.title_configuration.into_into_dart().into_dart(), - self.0.r#type.into_into_dart().into_dart(), - self.0.role.into_into_dart().into_dart(), - ] - .into_dart() + +impl SseEncode + for RustOpaqueMoi> +{ + // Codec=Sse (Serialization based), see doc to use other codecs + fn sse_encode(self, serializer: &mut flutter_rust_bridge::for_generated::SseSerializer) { + let (ptr, size) = self.sse_encode_raw(); + ::sse_encode(ptr, serializer); + ::sse_encode(size, serializer); } } -impl flutter_rust_bridge::for_generated::IntoDartExceptPrimitive - for FrbWrapper + +impl SseEncode + for RustOpaqueMoi< + flutter_rust_bridge::for_generated::RustAutoOpaqueInner< + ArcAnisetteClient, + >, + > { + // Codec=Sse (Serialization based), see doc to use other codecs + fn sse_encode(self, serializer: &mut flutter_rust_bridge::for_generated::SseSerializer) { + let (ptr, size) = self.sse_encode_raw(); + ::sse_encode(ptr, serializer); + ::sse_encode(size, serializer); + } } -impl flutter_rust_bridge::IntoIntoDart> - for crate::api::api::SimplifiedPoster + +impl SseEncode + for RustOpaqueMoi< + flutter_rust_bridge::for_generated::RustAutoOpaqueInner< + Arc>, + >, + > { - fn into_into_dart(self) -> FrbWrapper { - self.into() + // Codec=Sse (Serialization based), see doc to use other codecs + fn sse_encode(self, serializer: &mut flutter_rust_bridge::for_generated::SseSerializer) { + let (ptr, size) = self.sse_encode_raw(); + ::sse_encode(ptr, serializer); + ::sse_encode(size, serializer); } } -// Codec=Dco (DartCObject based), see doc to use other codecs -impl flutter_rust_bridge::IntoDart for FrbWrapper { - fn into_dart(self) -> flutter_rust_bridge::for_generated::DartAbi { - [ - self.0.watch.into_into_dart().into_dart(), - self.0.poster.into_into_dart().into_dart(), - ] - .into_dart() + +impl SseEncode + for RustOpaqueMoi< + flutter_rust_bridge::for_generated::RustAutoOpaqueInner< + Arc>, + >, + > +{ + // Codec=Sse (Serialization based), see doc to use other codecs + fn sse_encode(self, serializer: &mut flutter_rust_bridge::for_generated::SseSerializer) { + let (ptr, size) = self.sse_encode_raw(); + ::sse_encode(ptr, serializer); + ::sse_encode(size, serializer); } } -impl flutter_rust_bridge::for_generated::IntoDartExceptPrimitive - for FrbWrapper + +impl SseEncode + for RustOpaqueMoi>> { + // Codec=Sse (Serialization based), see doc to use other codecs + fn sse_encode(self, serializer: &mut flutter_rust_bridge::for_generated::SseSerializer) { + let (ptr, size) = self.sse_encode_raw(); + ::sse_encode(ptr, serializer); + ::sse_encode(size, serializer); + } } -impl flutter_rust_bridge::IntoIntoDart> - for crate::api::api::SimplifiedTranscriptPoster + +impl SseEncode + for RustOpaqueMoi< + flutter_rust_bridge::for_generated::RustAutoOpaqueInner< + Arc>, + >, + > { - fn into_into_dart(self) -> FrbWrapper { - self.into() + // Codec=Sse (Serialization based), see doc to use other codecs + fn sse_encode(self, serializer: &mut flutter_rust_bridge::for_generated::SseSerializer) { + let (ptr, size) = self.sse_encode_raw(); + ::sse_encode(ptr, serializer); + ::sse_encode(size, serializer); } } -// Codec=Dco (DartCObject based), see doc to use other codecs -impl flutter_rust_bridge::IntoDart for FrbWrapper { - fn into_dart(self) -> flutter_rust_bridge::for_generated::DartAbi { - match self.0 { - crate::api::api::StatusKitMessage::StatusChanged { - user, - mode, - allowed, - } => [ - 0.into_dart(), - user.into_into_dart().into_dart(), - mode.into_into_dart().into_dart(), - allowed.into_into_dart().into_dart(), - ] - .into_dart(), - _ => { - unimplemented!(""); - } - } + +impl SseEncode + for RustOpaqueMoi>> +{ + // Codec=Sse (Serialization based), see doc to use other codecs + fn sse_encode(self, serializer: &mut flutter_rust_bridge::for_generated::SseSerializer) { + let (ptr, size) = self.sse_encode_raw(); + ::sse_encode(ptr, serializer); + ::sse_encode(size, serializer); } } -impl flutter_rust_bridge::for_generated::IntoDartExceptPrimitive - for FrbWrapper + +impl SseEncode + for RustOpaqueMoi< + flutter_rust_bridge::for_generated::RustAutoOpaqueInner>, + > { + // Codec=Sse (Serialization based), see doc to use other codecs + fn sse_encode(self, serializer: &mut flutter_rust_bridge::for_generated::SseSerializer) { + let (ptr, size) = self.sse_encode_raw(); + ::sse_encode(ptr, serializer); + ::sse_encode(size, serializer); + } } -impl flutter_rust_bridge::IntoIntoDart> - for crate::api::api::StatusKitMessage + +impl SseEncode + for RustOpaqueMoi< + flutter_rust_bridge::for_generated::RustAutoOpaqueInner< + Arc>, + >, + > { - fn into_into_dart(self) -> FrbWrapper { - self.into() + // Codec=Sse (Serialization based), see doc to use other codecs + fn sse_encode(self, serializer: &mut flutter_rust_bridge::for_generated::SseSerializer) { + let (ptr, size) = self.sse_encode_raw(); + ::sse_encode(ptr, serializer); + ::sse_encode(size, serializer); } } -// Codec=Dco (DartCObject based), see doc to use other codecs -impl flutter_rust_bridge::IntoDart for FrbWrapper { - fn into_dart(self) -> flutter_rust_bridge::for_generated::DartAbi { - [self.0.allowed_modes.into_into_dart().into_dart()].into_dart() + +impl SseEncode + for RustOpaqueMoi< + flutter_rust_bridge::for_generated::RustAutoOpaqueInner< + Arc>>, + >, + > +{ + // Codec=Sse (Serialization based), see doc to use other codecs + fn sse_encode(self, serializer: &mut flutter_rust_bridge::for_generated::SseSerializer) { + let (ptr, size) = self.sse_encode_raw(); + ::sse_encode(ptr, serializer); + ::sse_encode(size, serializer); } } -impl flutter_rust_bridge::for_generated::IntoDartExceptPrimitive - for FrbWrapper + +impl SseEncode + for RustOpaqueMoi< + flutter_rust_bridge::for_generated::RustAutoOpaqueInner< + Arc>>>, + >, + > { + // Codec=Sse (Serialization based), see doc to use other codecs + fn sse_encode(self, serializer: &mut flutter_rust_bridge::for_generated::SseSerializer) { + let (ptr, size) = self.sse_encode_raw(); + ::sse_encode(ptr, serializer); + ::sse_encode(size, serializer); + } } -impl flutter_rust_bridge::IntoIntoDart> - for crate::api::api::StatusKitPersonalConfig + +impl SseEncode + for RustOpaqueMoi< + flutter_rust_bridge::for_generated::RustAutoOpaqueInner< + Arc>>, + >, + > { - fn into_into_dart(self) -> FrbWrapper { - self.into() + // Codec=Sse (Serialization based), see doc to use other codecs + fn sse_encode(self, serializer: &mut flutter_rust_bridge::for_generated::SseSerializer) { + let (ptr, size) = self.sse_encode_raw(); + ::sse_encode(ptr, serializer); + ::sse_encode(size, serializer); } } -// Codec=Dco (DartCObject based), see doc to use other codecs -impl flutter_rust_bridge::IntoDart for FrbWrapper { - fn into_dart(self) -> flutter_rust_bridge::for_generated::DartAbi { - [ - self.0.url.into_into_dart().into_dart(), - self.0.button.into_into_dart().into_dart(), - ] - .into_dart() + +impl SseEncode + for RustOpaqueMoi< + flutter_rust_bridge::for_generated::RustAutoOpaqueInner< + Arc>, + >, + > +{ + // Codec=Sse (Serialization based), see doc to use other codecs + fn sse_encode(self, serializer: &mut flutter_rust_bridge::for_generated::SseSerializer) { + let (ptr, size) = self.sse_encode_raw(); + ::sse_encode(ptr, serializer); + ::sse_encode(size, serializer); } } -impl flutter_rust_bridge::for_generated::IntoDartExceptPrimitive - for FrbWrapper + +impl SseEncode + for RustOpaqueMoi< + flutter_rust_bridge::for_generated::RustAutoOpaqueInner< + Arc>, + >, + > { + // Codec=Sse (Serialization based), see doc to use other codecs + fn sse_encode(self, serializer: &mut flutter_rust_bridge::for_generated::SseSerializer) { + let (ptr, size) = self.sse_encode_raw(); + ::sse_encode(ptr, serializer); + ::sse_encode(size, serializer); + } } -impl flutter_rust_bridge::IntoIntoDart> - for crate::api::api::SupportAction + +impl SseEncode + for RustOpaqueMoi< + flutter_rust_bridge::for_generated::RustAutoOpaqueInner>>, + > { - fn into_into_dart(self) -> FrbWrapper { - self.into() + // Codec=Sse (Serialization based), see doc to use other codecs + fn sse_encode(self, serializer: &mut flutter_rust_bridge::for_generated::SseSerializer) { + let (ptr, size) = self.sse_encode_raw(); + ::sse_encode(ptr, serializer); + ::sse_encode(size, serializer); } } -// Codec=Dco (DartCObject based), see doc to use other codecs -impl flutter_rust_bridge::IntoDart for FrbWrapper { - fn into_dart(self) -> flutter_rust_bridge::for_generated::DartAbi { - [ - self.0.title.into_into_dart().into_dart(), - self.0.body.into_into_dart().into_dart(), - self.0.action.into_into_dart().into_dart(), - ] - .into_dart() + +impl SseEncode + for RustOpaqueMoi>> +{ + // Codec=Sse (Serialization based), see doc to use other codecs + fn sse_encode(self, serializer: &mut flutter_rust_bridge::for_generated::SseSerializer) { + let (ptr, size) = self.sse_encode_raw(); + ::sse_encode(ptr, serializer); + ::sse_encode(size, serializer); } } -impl flutter_rust_bridge::for_generated::IntoDartExceptPrimitive - for FrbWrapper + +impl SseEncode + for RustOpaqueMoi< + flutter_rust_bridge::for_generated::RustAutoOpaqueInner< + Arc>, + >, + > { + // Codec=Sse (Serialization based), see doc to use other codecs + fn sse_encode(self, serializer: &mut flutter_rust_bridge::for_generated::SseSerializer) { + let (ptr, size) = self.sse_encode_raw(); + ::sse_encode(ptr, serializer); + ::sse_encode(size, serializer); + } } -impl flutter_rust_bridge::IntoIntoDart> - for crate::api::api::SupportAlert + +impl SseEncode + for RustOpaqueMoi< + flutter_rust_bridge::for_generated::RustAutoOpaqueInner< + Arc>, + >, + > { - fn into_into_dart(self) -> FrbWrapper { - self.into() + // Codec=Sse (Serialization based), see doc to use other codecs + fn sse_encode(self, serializer: &mut flutter_rust_bridge::for_generated::SseSerializer) { + let (ptr, size) = self.sse_encode_raw(); + ::sse_encode(ptr, serializer); + ::sse_encode(size, serializer); } } -// Codec=Dco (DartCObject based), see doc to use other codecs -impl flutter_rust_bridge::IntoDart for FrbWrapper { - fn into_dart(self) -> flutter_rust_bridge::for_generated::DartAbi { - match self.0 { - crate::api::api::SyncStatus::Synced => [0.into_dart()].into_dart(), - crate::api::api::SyncStatus::Downloading { progress, total } => [ - 1.into_dart(), - progress.into_into_dart().into_dart(), - total.into_into_dart().into_dart(), - ] - .into_dart(), - crate::api::api::SyncStatus::Uploading { progress, total } => [ - 2.into_dart(), - progress.into_into_dart().into_dart(), - total.into_into_dart().into_dart(), - ] - .into_dart(), - crate::api::api::SyncStatus::Syncing => [3.into_dart()].into_dart(), - _ => { - unimplemented!(""); - } - } + +impl SseEncode for RustOpaqueMoi> { + // Codec=Sse (Serialization based), see doc to use other codecs + fn sse_encode(self, serializer: &mut flutter_rust_bridge::for_generated::SseSerializer) { + let (ptr, size) = self.sse_encode_raw(); + ::sse_encode(ptr, serializer); + ::sse_encode(size, serializer); } } -impl flutter_rust_bridge::for_generated::IntoDartExceptPrimitive - for FrbWrapper + +impl SseEncode + for RustOpaqueMoi> { + // Codec=Sse (Serialization based), see doc to use other codecs + fn sse_encode(self, serializer: &mut flutter_rust_bridge::for_generated::SseSerializer) { + let (ptr, size) = self.sse_encode_raw(); + ::sse_encode(ptr, serializer); + ::sse_encode(size, serializer); + } } -impl flutter_rust_bridge::IntoIntoDart> - for crate::api::api::SyncStatus + +impl SseEncode + for RustOpaqueMoi< + flutter_rust_bridge::for_generated::RustAutoOpaqueInner< + CircleClientSession, + >, + > { - fn into_into_dart(self) -> FrbWrapper { - self.into() + // Codec=Sse (Serialization based), see doc to use other codecs + fn sse_encode(self, serializer: &mut flutter_rust_bridge::for_generated::SseSerializer) { + let (ptr, size) = self.sse_encode_raw(); + ::sse_encode(ptr, serializer); + ::sse_encode(size, serializer); } } -// Codec=Dco (DartCObject based), see doc to use other codecs -impl flutter_rust_bridge::IntoDart for FrbWrapper { - fn into_dart(self) -> flutter_rust_bridge::for_generated::DartAbi { - [self.0.prevtxnid.into_into_dart().into_dart()].into_dart() + +impl SseEncode + for RustOpaqueMoi< + flutter_rust_bridge::for_generated::RustAutoOpaqueInner< + CloudSyncPreparedMessageCreateHandle, + >, + > +{ + // Codec=Sse (Serialization based), see doc to use other codecs + fn sse_encode(self, serializer: &mut flutter_rust_bridge::for_generated::SseSerializer) { + let (ptr, size) = self.sse_encode_raw(); + ::sse_encode(ptr, serializer); + ::sse_encode(size, serializer); } } -impl flutter_rust_bridge::for_generated::IntoDartExceptPrimitive - for FrbWrapper + +impl SseEncode + for RustOpaqueMoi> { + // Codec=Sse (Serialization based), see doc to use other codecs + fn sse_encode(self, serializer: &mut flutter_rust_bridge::for_generated::SseSerializer) { + let (ptr, size) = self.sse_encode_raw(); + ::sse_encode(ptr, serializer); + ::sse_encode(size, serializer); + } } -impl flutter_rust_bridge::IntoIntoDart> - for crate::api::api::TeardownSignIn + +impl SseEncode + for RustOpaqueMoi< + flutter_rust_bridge::for_generated::RustAutoOpaqueInner, + > { - fn into_into_dart(self) -> FrbWrapper { - self.into() + // Codec=Sse (Serialization based), see doc to use other codecs + fn sse_encode(self, serializer: &mut flutter_rust_bridge::for_generated::SseSerializer) { + let (ptr, size) = self.sse_encode_raw(); + ::sse_encode(ptr, serializer); + ::sse_encode(size, serializer); } } -// Codec=Dco (DartCObject based), see doc to use other codecs -impl flutter_rust_bridge::IntoDart for FrbWrapper { - fn into_dart(self) -> flutter_rust_bridge::for_generated::DartAbi { - match self.0 { - crate::api::api::TextEffect::Big => 0.into_dart(), - crate::api::api::TextEffect::Small => 1.into_dart(), - crate::api::api::TextEffect::Shake => 2.into_dart(), - crate::api::api::TextEffect::Nod => 3.into_dart(), - crate::api::api::TextEffect::Explode => 4.into_dart(), - crate::api::api::TextEffect::Ripple => 5.into_dart(), - crate::api::api::TextEffect::Bloom => 6.into_dart(), - crate::api::api::TextEffect::Jitter => 7.into_dart(), - _ => unreachable!(), - } + +impl SseEncode for RustOpaqueMoi> { + // Codec=Sse (Serialization based), see doc to use other codecs + fn sse_encode(self, serializer: &mut flutter_rust_bridge::for_generated::SseSerializer) { + let (ptr, size) = self.sse_encode_raw(); + ::sse_encode(ptr, serializer); + ::sse_encode(size, serializer); } } -impl flutter_rust_bridge::for_generated::IntoDartExceptPrimitive - for FrbWrapper -{ -} -impl flutter_rust_bridge::IntoIntoDart> - for crate::api::api::TextEffect + +impl SseEncode + for RustOpaqueMoi> { - fn into_into_dart(self) -> FrbWrapper { - self.into() + // Codec=Sse (Serialization based), see doc to use other codecs + fn sse_encode(self, serializer: &mut flutter_rust_bridge::for_generated::SseSerializer) { + let (ptr, size) = self.sse_encode_raw(); + ::sse_encode(ptr, serializer); + ::sse_encode(size, serializer); } } -// Codec=Dco (DartCObject based), see doc to use other codecs -impl flutter_rust_bridge::IntoDart for FrbWrapper { - fn into_dart(self) -> flutter_rust_bridge::for_generated::DartAbi { - [ - self.0.bold.into_into_dart().into_dart(), - self.0.italic.into_into_dart().into_dart(), - self.0.underline.into_into_dart().into_dart(), - self.0.strikethrough.into_into_dart().into_dart(), - ] - .into_dart() + +impl SseEncode + for RustOpaqueMoi< + flutter_rust_bridge::for_generated::RustAutoOpaqueInner< + FindMyFriendsClient, + >, + > +{ + // Codec=Sse (Serialization based), see doc to use other codecs + fn sse_encode(self, serializer: &mut flutter_rust_bridge::for_generated::SseSerializer) { + let (ptr, size) = self.sse_encode_raw(); + ::sse_encode(ptr, serializer); + ::sse_encode(size, serializer); } } -impl flutter_rust_bridge::for_generated::IntoDartExceptPrimitive - for FrbWrapper + +impl SseEncode + for RustOpaqueMoi< + flutter_rust_bridge::for_generated::RustAutoOpaqueInner< + FindMyPhoneClient, + >, + > { + // Codec=Sse (Serialization based), see doc to use other codecs + fn sse_encode(self, serializer: &mut flutter_rust_bridge::for_generated::SseSerializer) { + let (ptr, size) = self.sse_encode_raw(); + ::sse_encode(ptr, serializer); + ::sse_encode(size, serializer); + } } -impl flutter_rust_bridge::IntoIntoDart> - for crate::api::api::TextFlags + +impl SseEncode + for RustOpaqueMoi< + flutter_rust_bridge::for_generated::RustAutoOpaqueInner>, + > { - fn into_into_dart(self) -> FrbWrapper { - self.into() + // Codec=Sse (Serialization based), see doc to use other codecs + fn sse_encode(self, serializer: &mut flutter_rust_bridge::for_generated::SseSerializer) { + let (ptr, size) = self.sse_encode_raw(); + ::sse_encode(ptr, serializer); + ::sse_encode(size, serializer); } } -// Codec=Dco (DartCObject based), see doc to use other codecs -impl flutter_rust_bridge::IntoDart for FrbWrapper { - fn into_dart(self) -> flutter_rust_bridge::for_generated::DartAbi { - match self.0 { - crate::api::api::TextFormat::Flags(field0) => { - [0.into_dart(), field0.into_into_dart().into_dart()].into_dart() - } - crate::api::api::TextFormat::Effect(field0) => { - [1.into_dart(), field0.into_into_dart().into_dart()].into_dart() - } - _ => { - unimplemented!(""); - } - } + +impl SseEncode + for RustOpaqueMoi< + flutter_rust_bridge::for_generated::RustAutoOpaqueInner>, + > +{ + // Codec=Sse (Serialization based), see doc to use other codecs + fn sse_encode(self, serializer: &mut flutter_rust_bridge::for_generated::SseSerializer) { + let (ptr, size) = self.sse_encode_raw(); + ::sse_encode(ptr, serializer); + ::sse_encode(size, serializer); } } -impl flutter_rust_bridge::for_generated::IntoDartExceptPrimitive - for FrbWrapper + +impl SseEncode + for RustOpaqueMoi< + flutter_rust_bridge::for_generated::RustAutoOpaqueInner>, + > { + // Codec=Sse (Serialization based), see doc to use other codecs + fn sse_encode(self, serializer: &mut flutter_rust_bridge::for_generated::SseSerializer) { + let (ptr, size) = self.sse_encode_raw(); + ::sse_encode(ptr, serializer); + ::sse_encode(size, serializer); + } } -impl flutter_rust_bridge::IntoIntoDart> - for crate::api::api::TextFormat + +impl SseEncode + for RustOpaqueMoi< + flutter_rust_bridge::for_generated::RustAutoOpaqueInner>, + > { - fn into_into_dart(self) -> FrbWrapper { - self.into() + // Codec=Sse (Serialization based), see doc to use other codecs + fn sse_encode(self, serializer: &mut flutter_rust_bridge::for_generated::SseSerializer) { + let (ptr, size) = self.sse_encode_raw(); + ::sse_encode(ptr, serializer); + ::sse_encode(size, serializer); } } -// Codec=Dco (DartCObject based), see doc to use other codecs -impl flutter_rust_bridge::IntoDart for FrbWrapper { - fn into_dart(self) -> flutter_rust_bridge::for_generated::DartAbi { - [self.0.identifier.into_into_dart().into_dart()].into_dart() + +impl SseEncode + for RustOpaqueMoi< + flutter_rust_bridge::for_generated::RustAutoOpaqueInner>, + > +{ + // Codec=Sse (Serialization based), see doc to use other codecs + fn sse_encode(self, serializer: &mut flutter_rust_bridge::for_generated::SseSerializer) { + let (ptr, size) = self.sse_encode_raw(); + ::sse_encode(ptr, serializer); + ::sse_encode(size, serializer); } } -impl flutter_rust_bridge::for_generated::IntoDartExceptPrimitive - for FrbWrapper + +impl SseEncode + for RustOpaqueMoi< + flutter_rust_bridge::for_generated::RustAutoOpaqueInner>, + > { + // Codec=Sse (Serialization based), see doc to use other codecs + fn sse_encode(self, serializer: &mut flutter_rust_bridge::for_generated::SseSerializer) { + let (ptr, size) = self.sse_encode_raw(); + ::sse_encode(ptr, serializer); + ::sse_encode(size, serializer); + } } -impl flutter_rust_bridge::IntoIntoDart> - for crate::api::api::TranscriptDynamicUserData + +impl SseEncode + for RustOpaqueMoi> { - fn into_into_dart(self) -> FrbWrapper { - self.into() + // Codec=Sse (Serialization based), see doc to use other codecs + fn sse_encode(self, serializer: &mut flutter_rust_bridge::for_generated::SseSerializer) { + let (ptr, size) = self.sse_encode_raw(); + ::sse_encode(ptr, serializer); + ::sse_encode(size, serializer); } } -// Codec=Dco (DartCObject based), see doc to use other codecs -impl flutter_rust_bridge::IntoDart for crate::api::api::TransferProgress { - fn into_dart(self) -> flutter_rust_bridge::for_generated::DartAbi { - [ - self.prog.into_into_dart().into_dart(), - self.total.into_into_dart().into_dart(), - self.attachment.into_into_dart().into_dart(), - ] - .into_dart() + +impl SseEncode for RustOpaqueMoi> { + // Codec=Sse (Serialization based), see doc to use other codecs + fn sse_encode(self, serializer: &mut flutter_rust_bridge::for_generated::SseSerializer) { + let (ptr, size) = self.sse_encode_raw(); + ::sse_encode(ptr, serializer); + ::sse_encode(size, serializer); } } -impl flutter_rust_bridge::for_generated::IntoDartExceptPrimitive - for crate::api::api::TransferProgress + +impl SseEncode + for RustOpaqueMoi> { + // Codec=Sse (Serialization based), see doc to use other codecs + fn sse_encode(self, serializer: &mut flutter_rust_bridge::for_generated::SseSerializer) { + let (ptr, size) = self.sse_encode_raw(); + ::sse_encode(ptr, serializer); + ::sse_encode(size, serializer); + } } -impl flutter_rust_bridge::IntoIntoDart - for crate::api::api::TransferProgress + +impl SseEncode + for RustOpaqueMoi> { - fn into_into_dart(self) -> crate::api::api::TransferProgress { - self + // Codec=Sse (Serialization based), see doc to use other codecs + fn sse_encode(self, serializer: &mut flutter_rust_bridge::for_generated::SseSerializer) { + let (ptr, size) = self.sse_encode_raw(); + ::sse_encode(ptr, serializer); + ::sse_encode(size, serializer); } } -// Codec=Dco (DartCObject based), see doc to use other codecs -impl flutter_rust_bridge::IntoDart for FrbWrapper { - fn into_dart(self) -> flutter_rust_bridge::for_generated::DartAbi { - [ - self.0.number_with_dial_code.into_into_dart().into_dart(), - self.0.last_two_digits.into_into_dart().into_dart(), - self.0.push_mode.into_into_dart().into_dart(), - self.0.id.into_into_dart().into_dart(), - ] - .into_dart() + +impl SseEncode + for RustOpaqueMoi> +{ + // Codec=Sse (Serialization based), see doc to use other codecs + fn sse_encode(self, serializer: &mut flutter_rust_bridge::for_generated::SseSerializer) { + let (ptr, size) = self.sse_encode_raw(); + ::sse_encode(ptr, serializer); + ::sse_encode(size, serializer); } } -impl flutter_rust_bridge::for_generated::IntoDartExceptPrimitive - for FrbWrapper + +impl SseEncode + for RustOpaqueMoi< + flutter_rust_bridge::for_generated::RustAutoOpaqueInner>, + > { + // Codec=Sse (Serialization based), see doc to use other codecs + fn sse_encode(self, serializer: &mut flutter_rust_bridge::for_generated::SseSerializer) { + let (ptr, size) = self.sse_encode_raw(); + ::sse_encode(ptr, serializer); + ::sse_encode(size, serializer); + } } -impl flutter_rust_bridge::IntoIntoDart> - for crate::api::api::TrustedPhoneNumber + +impl SseEncode + for RustOpaqueMoi< + flutter_rust_bridge::for_generated::RustAutoOpaqueInner>, + > { - fn into_into_dart(self) -> FrbWrapper { - self.into() + // Codec=Sse (Serialization based), see doc to use other codecs + fn sse_encode(self, serializer: &mut flutter_rust_bridge::for_generated::SseSerializer) { + let (ptr, size) = self.sse_encode_raw(); + ::sse_encode(ptr, serializer); + ::sse_encode(size, serializer); } } -// Codec=Dco (DartCObject based), see doc to use other codecs -impl flutter_rust_bridge::IntoDart for FrbWrapper { - fn into_dart(self) -> flutter_rust_bridge::for_generated::DartAbi { - [ - self.0.bundle_id.into_into_dart().into_dart(), - self.0.icon.into_into_dart().into_dart(), - ] - .into_dart() + +impl SseEncode + for RustOpaqueMoi> +{ + // Codec=Sse (Serialization based), see doc to use other codecs + fn sse_encode(self, serializer: &mut flutter_rust_bridge::for_generated::SseSerializer) { + let (ptr, size) = self.sse_encode_raw(); + ::sse_encode(ptr, serializer); + ::sse_encode(size, serializer); } } -impl flutter_rust_bridge::for_generated::IntoDartExceptPrimitive - for FrbWrapper + +impl SseEncode + for RustOpaqueMoi>> { + // Codec=Sse (Serialization based), see doc to use other codecs + fn sse_encode(self, serializer: &mut flutter_rust_bridge::for_generated::SseSerializer) { + let (ptr, size) = self.sse_encode_raw(); + ::sse_encode(ptr, serializer); + ::sse_encode(size, serializer); + } } -impl flutter_rust_bridge::IntoIntoDart> - for crate::api::api::TypingApp + +impl SseEncode + for RustOpaqueMoi> { - fn into_into_dart(self) -> FrbWrapper { - self.into() + // Codec=Sse (Serialization based), see doc to use other codecs + fn sse_encode(self, serializer: &mut flutter_rust_bridge::for_generated::SseSerializer) { + let (ptr, size) = self.sse_encode_raw(); + ::sse_encode(ptr, serializer); + ::sse_encode(size, serializer); } } -// Codec=Dco (DartCObject based), see doc to use other codecs -impl flutter_rust_bridge::IntoDart for FrbWrapper { - fn into_dart(self) -> flutter_rust_bridge::for_generated::DartAbi { - match self.0 { - crate::api::api::UIColor::RGBAColorSpace { - color_components, - green, - blue, - red, - green_dbl, - blue_dbl, - red_dbl, - alpha_dbl, - alpha, - rgb, - color_space, - class, - } => [ - 0.into_dart(), - color_components.into_into_dart().into_dart(), - green.into_into_dart().into_dart(), - blue.into_into_dart().into_dart(), - red.into_into_dart().into_dart(), - green_dbl.into_into_dart().into_dart(), - blue_dbl.into_into_dart().into_dart(), - red_dbl.into_into_dart().into_dart(), - alpha_dbl.into_into_dart().into_dart(), - alpha.into_into_dart().into_dart(), - rgb.into_into_dart().into_dart(), - color_space.into_into_dart().into_dart(), - class.into_into_dart().into_dart(), - ] - .into_dart(), - crate::api::api::UIColor::GrayscaleAlphaColorSpace { - color_components, - white, - alpha, - bin, - color_space, - class, - } => [ - 1.into_dart(), - color_components.into_into_dart().into_dart(), - white.into_into_dart().into_dart(), - alpha.into_into_dart().into_dart(), - bin.into_into_dart().into_dart(), - color_space.into_into_dart().into_dart(), - class.into_into_dart().into_dart(), - ] - .into_dart(), - _ => { - unimplemented!(""); - } - } + +impl SseEncode + for RustOpaqueMoi>> +{ + // Codec=Sse (Serialization based), see doc to use other codecs + fn sse_encode(self, serializer: &mut flutter_rust_bridge::for_generated::SseSerializer) { + let (ptr, size) = self.sse_encode_raw(); + ::sse_encode(ptr, serializer); + ::sse_encode(size, serializer); } } -impl flutter_rust_bridge::for_generated::IntoDartExceptPrimitive - for FrbWrapper + +impl SseEncode + for RustOpaqueMoi> { + // Codec=Sse (Serialization based), see doc to use other codecs + fn sse_encode(self, serializer: &mut flutter_rust_bridge::for_generated::SseSerializer) { + let (ptr, size) = self.sse_encode_raw(); + ::sse_encode(ptr, serializer); + ::sse_encode(size, serializer); + } } -impl flutter_rust_bridge::IntoIntoDart> - for crate::api::api::UIColor + +impl SseEncode + for RustOpaqueMoi< + flutter_rust_bridge::for_generated::RustAutoOpaqueInner< + SyncManager, + >, + > { - fn into_into_dart(self) -> FrbWrapper { - self.into() + // Codec=Sse (Serialization based), see doc to use other codecs + fn sse_encode(self, serializer: &mut flutter_rust_bridge::for_generated::SseSerializer) { + let (ptr, size) = self.sse_encode_raw(); + ::sse_encode(ptr, serializer); + ::sse_encode(size, serializer); } } -// Codec=Dco (DartCObject based), see doc to use other codecs -impl flutter_rust_bridge::IntoDart for FrbWrapper { - fn into_dart(self) -> flutter_rust_bridge::for_generated::DartAbi { - [ - self.0.tuuid.into_into_dart().into_dart(), - self.0.edit_part.into_into_dart().into_dart(), - ] - .into_dart() + +impl SseEncode + for RustOpaqueMoi> +{ + // Codec=Sse (Serialization based), see doc to use other codecs + fn sse_encode(self, serializer: &mut flutter_rust_bridge::for_generated::SseSerializer) { + let (ptr, size) = self.sse_encode_raw(); + ::sse_encode(ptr, serializer); + ::sse_encode(size, serializer); } } -impl flutter_rust_bridge::for_generated::IntoDartExceptPrimitive - for FrbWrapper + +impl SseEncode + for RustOpaqueMoi> { + // Codec=Sse (Serialization based), see doc to use other codecs + fn sse_encode(self, serializer: &mut flutter_rust_bridge::for_generated::SseSerializer) { + let (ptr, size) = self.sse_encode_raw(); + ::sse_encode(ptr, serializer); + ::sse_encode(size, serializer); + } } -impl flutter_rust_bridge::IntoIntoDart> - for crate::api::api::UnsendMessage + +impl SseEncode + for RustOpaqueMoi> { - fn into_into_dart(self) -> FrbWrapper { - self.into() + // Codec=Sse (Serialization based), see doc to use other codecs + fn sse_encode(self, serializer: &mut flutter_rust_bridge::for_generated::SseSerializer) { + let (ptr, size) = self.sse_encode_raw(); + ::sse_encode(ptr, serializer); + ::sse_encode(size, serializer); } } -// Codec=Dco (DartCObject based), see doc to use other codecs -impl flutter_rust_bridge::IntoDart for FrbWrapper { - fn into_dart(self) -> flutter_rust_bridge::for_generated::DartAbi { - match self.0 { - crate::api::api::UpdateAccountFinish::MacOS => [0.into_dart()].into_dart(), - crate::api::api::UpdateAccountFinish::IOS { url } => { - [1.into_dart(), url.into_into_dart().into_dart()].into_dart() - } - _ => { - unimplemented!(""); - } - } + +impl SseEncode for std::collections::HashSet { + // Codec=Sse (Serialization based), see doc to use other codecs + fn sse_encode(self, serializer: &mut flutter_rust_bridge::for_generated::SseSerializer) { + >::sse_encode(self.into_iter().collect(), serializer); } } -impl flutter_rust_bridge::for_generated::IntoDartExceptPrimitive - for FrbWrapper + +impl SseEncode + for StreamSink< + crate::api::api::MMCSTransferProgress, + flutter_rust_bridge::for_generated::SseCodec, + > { + // Codec=Sse (Serialization based), see doc to use other codecs + fn sse_encode(self, serializer: &mut flutter_rust_bridge::for_generated::SseSerializer) { + unimplemented!("") + } } -impl flutter_rust_bridge::IntoIntoDart> - for crate::api::api::UpdateAccountFinish + +impl SseEncode + for StreamSink { - fn into_into_dart(self) -> FrbWrapper { - self.into() + // Codec=Sse (Serialization based), see doc to use other codecs + fn sse_encode(self, serializer: &mut flutter_rust_bridge::for_generated::SseSerializer) { + unimplemented!("") } } -// Codec=Dco (DartCObject based), see doc to use other codecs -impl flutter_rust_bridge::IntoDart for FrbWrapper { - fn into_dart(self) -> flutter_rust_bridge::for_generated::DartAbi { - [ - self.0.for_uuid.into_into_dart().into_dart(), - self.0.ext.into_into_dart().into_dart(), - ] - .into_dart() + +impl SseEncode for String { + // Codec=Sse (Serialization based), see doc to use other codecs + fn sse_encode(self, serializer: &mut flutter_rust_bridge::for_generated::SseSerializer) { + >::sse_encode(self.into_bytes(), serializer); } } -impl flutter_rust_bridge::for_generated::IntoDartExceptPrimitive - for FrbWrapper -{ -} -impl flutter_rust_bridge::IntoIntoDart> - for crate::api::api::UpdateExtensionMessage -{ - fn into_into_dart(self) -> FrbWrapper { - self.into() + +impl SseEncode for crate::api::api::Address { + // Codec=Sse (Serialization based), see doc to use other codecs + fn sse_encode(self, serializer: &mut flutter_rust_bridge::for_generated::SseSerializer) { + >::sse_encode(self.administrative_area, serializer); + ::sse_encode(self.country, serializer); + ::sse_encode(self.country_code, serializer); + >>::sse_encode(self.formatted_address_lines, serializer); + >::sse_encode(self.locality, serializer); + >::sse_encode(self.state_code, serializer); + >::sse_encode(self.street_address, serializer); + >::sse_encode(self.street_name, serializer); } } -// Codec=Dco (DartCObject based), see doc to use other codecs -impl flutter_rust_bridge::IntoDart for FrbWrapper { - fn into_dart(self) -> flutter_rust_bridge::for_generated::DartAbi { - [ - self.0.profile.into_into_dart().into_dart(), - self.0.share_contacts.into_into_dart().into_dart(), - ] - .into_dart() + +impl SseEncode for crate::api::api::AkData { + // Codec=Sse (Serialization based), see doc to use other codecs + fn sse_encode(self, serializer: &mut flutter_rust_bridge::for_generated::SseSerializer) { + ::sse_encode(self.lat, serializer); + ::sse_encode(self.lng, serializer); } } -impl flutter_rust_bridge::for_generated::IntoDartExceptPrimitive - for FrbWrapper -{ + +impl SseEncode for crate::api::api::ApsAlert { + // Codec=Sse (Serialization based), see doc to use other codecs + fn sse_encode(self, serializer: &mut flutter_rust_bridge::for_generated::SseSerializer) { + ::sse_encode(self.title, serializer); + ::sse_encode(self.body, serializer); + ::sse_encode(self.sbdy, serializer); + ::sse_encode(self.defbtn, serializer); + ::sse_encode(self.albtn, serializer); + } } -impl flutter_rust_bridge::IntoIntoDart> - for crate::api::api::UpdateProfileMessage -{ - fn into_into_dart(self) -> FrbWrapper { - self.into() + +impl SseEncode for crate::api::api::ApsConnectionStatus { + // Codec=Sse (Serialization based), see doc to use other codecs + fn sse_encode(self, serializer: &mut flutter_rust_bridge::for_generated::SseSerializer) { + ::sse_encode(self.state, serializer); + >::sse_encode(self.active_port, serializer); + >::sse_encode(self.error, serializer); + >::sse_encode(self.retry_wait_seconds, serializer); } } -// Codec=Dco (DartCObject based), see doc to use other codecs -impl flutter_rust_bridge::IntoDart for FrbWrapper { - fn into_dart(self) -> flutter_rust_bridge::for_generated::DartAbi { - [ - self.0.shared_dismissed.into_into_dart().into_dart(), - self.0.shared_all.into_into_dart().into_dart(), - self.0.version.into_into_dart().into_dart(), - ] - .into_dart() + +impl SseEncode for crate::api::api::ApsData { + // Codec=Sse (Serialization based), see doc to use other codecs + fn sse_encode(self, serializer: &mut flutter_rust_bridge::for_generated::SseSerializer) { + ::sse_encode(self.alert, serializer); } } -impl flutter_rust_bridge::for_generated::IntoDartExceptPrimitive - for FrbWrapper -{ + +impl SseEncode for crate::api::api::Attachment { + // Codec=Sse (Serialization based), see doc to use other codecs + fn sse_encode(self, serializer: &mut flutter_rust_bridge::for_generated::SseSerializer) { + ::sse_encode(self.a_type, serializer); + ::sse_encode(self.part, serializer); + ::sse_encode(self.uti_type, serializer); + ::sse_encode(self.mime, serializer); + ::sse_encode(self.name, serializer); + ::sse_encode(self.iris, serializer); + } } -impl flutter_rust_bridge::IntoIntoDart> - for crate::api::api::UpdateProfileSharingMessage -{ - fn into_into_dart(self) -> FrbWrapper { - self.into() + +impl SseEncode for crate::api::api::AttachmentMeta { + // Codec=Sse (Serialization based), see doc to use other codecs + fn sse_encode(self, serializer: &mut flutter_rust_bridge::for_generated::SseSerializer) { + >::sse_encode(self.mime_type, serializer); + ::sse_encode(self.start_date, serializer); + ::sse_encode(self.total_bytes, serializer); + ::sse_encode(self.transfer_state, serializer); + ::sse_encode(self.is_sticker, serializer); + ::sse_encode(self.guid, serializer); + ::sse_encode(self.hide_attachment, serializer); + >::sse_encode(self.user_info, serializer); + >::sse_encode(self.filename, serializer); + >::sse_encode(self.extras, serializer); + ::sse_encode(self.is_outgoing, serializer); + >::sse_encode(self.transfer_name, serializer); + ::sse_encode(self.version, serializer); + >::sse_encode(self.uti, serializer); + ::sse_encode(self.created_date, serializer); + >::sse_encode(self.pathc, serializer); + >::sse_encode(self.md5, serializer); } } -// Codec=Dco (DartCObject based), see doc to use other codecs -impl flutter_rust_bridge::IntoDart for FrbWrapper { - fn into_dart(self) -> flutter_rust_bridge::for_generated::DartAbi { - [ - self.0.background_color_key.into_into_dart().into_dart(), - self.0.font_color_key.into_into_dart().into_dart(), - self.0.font_name_key.into_into_dart().into_dart(), - self.0.font_size_key.into_into_dart().into_dart(), - self.0.font_weight_key.into_into_dart().into_dart(), - self.0.is_vertical_key.into_into_dart().into_dart(), - self.0.type_key.into_into_dart().into_dart(), - ] - .into_dart() + +impl SseEncode for crate::api::api::AttachmentMetaExtra { + // Codec=Sse (Serialization based), see doc to use other codecs + fn sse_encode(self, serializer: &mut flutter_rust_bridge::for_generated::SseSerializer) { + >::sse_encode( + self.preview_generation_state, + serializer, + ); } } -impl flutter_rust_bridge::for_generated::IntoDartExceptPrimitive - for FrbWrapper -{ + +impl SseEncode for crate::api::api::AttachmentType { + // Codec=Sse (Serialization based), see doc to use other codecs + fn sse_encode(self, serializer: &mut flutter_rust_bridge::for_generated::SseSerializer) { + match self { + crate::api::api::AttachmentType::Inline(field0) => { + ::sse_encode(0, serializer); + >::sse_encode(field0, serializer); + } + crate::api::api::AttachmentType::MMCS(field0) => { + ::sse_encode(1, serializer); + ::sse_encode(field0, serializer); + } + _ => { + unimplemented!(""); + } + } + } } -impl flutter_rust_bridge::IntoIntoDart> - for crate::api::api::WallpaperMetadata -{ - fn into_into_dart(self) -> FrbWrapper { - self.into() + +impl SseEncode for crate::api::api::Balloon { + // Codec=Sse (Serialization based), see doc to use other codecs + fn sse_encode(self, serializer: &mut flutter_rust_bridge::for_generated::SseSerializer) { + ::sse_encode(self.url, serializer); + >::sse_encode(self.session, serializer); + >::sse_encode(self.layout, serializer); + >::sse_encode(self.ld_text, serializer); + ::sse_encode(self.is_live, serializer); + >>::sse_encode(self.icon, serializer); } } -// Codec=Dco (DartCObject based), see doc to use other codecs -impl flutter_rust_bridge::IntoDart for FrbWrapper { - fn into_dart(self) -> flutter_rust_bridge::for_generated::DartAbi { - [ - self.0.is_high_key.into_into_dart().into_dart(), - self.0.luminance.into_into_dart().into_dart(), - self.0.background_image_data.into_into_dart().into_dart(), - self.0.extension_identifier.into_into_dart().into_dart(), - ] - .into_dart() + +impl SseEncode for crate::api::api::BalloonLayout { + // Codec=Sse (Serialization based), see doc to use other codecs + fn sse_encode(self, serializer: &mut flutter_rust_bridge::for_generated::SseSerializer) { + match self { + crate::api::api::BalloonLayout::TemplateLayout { + image_subtitle, + image_title, + caption, + secondary_subcaption, + tertiary_subcaption, + subcaption, + class, + } => { + ::sse_encode(0, serializer); + ::sse_encode(image_subtitle, serializer); + ::sse_encode(image_title, serializer); + ::sse_encode(caption, serializer); + ::sse_encode(secondary_subcaption, serializer); + ::sse_encode(tertiary_subcaption, serializer); + ::sse_encode(subcaption, serializer); + ::sse_encode(class, serializer); + } + _ => { + unimplemented!(""); + } + } } } -impl flutter_rust_bridge::for_generated::IntoDartExceptPrimitive - for FrbWrapper -{ + +impl SseEncode for crate::api::api::BeaconAttributes { + // Codec=Sse (Serialization based), see doc to use other codecs + fn sse_encode(self, serializer: &mut flutter_rust_bridge::for_generated::SseSerializer) { + ::sse_encode(self.name, serializer); + ::sse_encode(self.role_id, serializer); + ::sse_encode(self.emoji, serializer); + ::sse_encode(self.system_version, serializer); + ::sse_encode(self.serial_number, serializer); + } } -impl flutter_rust_bridge::IntoIntoDart> - for crate::api::api::WatchBackground -{ - fn into_into_dart(self) -> FrbWrapper { - self.into() + +impl SseEncode for crate::api::api::BeaconNamingRecord { + // Codec=Sse (Serialization based), see doc to use other codecs + fn sse_encode(self, serializer: &mut flutter_rust_bridge::for_generated::SseSerializer) { + ::sse_encode(self.emoji, serializer); + ::sse_encode(self.name, serializer); + ::sse_encode(self.associated_beacon, serializer); + ::sse_encode(self.role_id, serializer); } } -// Codec=Dco (DartCObject based), see doc to use other codecs -impl flutter_rust_bridge::IntoDart for FrbWrapper { - fn into_dart(self) -> flutter_rust_bridge::for_generated::DartAbi { - [ - self.0.cdat.into_into_dart().into_dart(), - self.0.mdat.into_into_dart().into_dart(), - self.0.acct.into_into_dart().into_dart(), - self.0.svce.into_into_dart().into_dart(), - self.0.data.into_into_dart().into_dart(), - ] - .into_dart() + +impl SseEncode for bool { + // Codec=Sse (Serialization based), see doc to use other codecs + fn sse_encode(self, serializer: &mut flutter_rust_bridge::for_generated::SseSerializer) { + serializer.cursor.write_u8(self as _).unwrap(); } } -impl flutter_rust_bridge::for_generated::IntoDartExceptPrimitive - for FrbWrapper -{ + +impl SseEncode for crate::api::api::CertifiedContext { + // Codec=Sse (Serialization based), see doc to use other codecs + fn sse_encode(self, serializer: &mut flutter_rust_bridge::for_generated::SseSerializer) { + ::sse_encode(self.version, serializer); + >::sse_encode(self.receipt, serializer); + ::sse_encode(self.sender, serializer); + ::sse_encode(self.target, serializer); + >::sse_encode(self.uuid, serializer); + >::sse_encode(self.token, serializer); + } } -impl flutter_rust_bridge::IntoIntoDart> - for crate::api::api::WifiPassword -{ - fn into_into_dart(self) -> FrbWrapper { - self.into() + +impl SseEncode for crate::api::api::ChangeParticipantMessage { + // Codec=Sse (Serialization based), see doc to use other codecs + fn sse_encode(self, serializer: &mut flutter_rust_bridge::for_generated::SseSerializer) { + >::sse_encode(self.new_participants, serializer); + ::sse_encode(self.group_version, serializer); } } -impl SseEncode for flutter_rust_bridge::for_generated::anyhow::Error { +impl SseEncode for crate::api::api::ChatProto { // Codec=Sse (Serialization based), see doc to use other codecs fn sse_encode(self, serializer: &mut flutter_rust_bridge::for_generated::SseSerializer) { - ::sse_encode(format!("{:?}", self), serializer); + >::sse_encode(self.unk1, serializer); } } -impl SseEncode for APSConnection { +impl SseEncode for crate::api::api::CloudAttachment { // Codec=Sse (Serialization based), see doc to use other codecs fn sse_encode(self, serializer: &mut flutter_rust_bridge::for_generated::SseSerializer) { - >>::sse_encode(flutter_rust_bridge::for_generated::rust_auto_opaque_encode::<_, MoiArc<_>>(self), serializer); + >::sse_encode(self.cm, serializer); + ::sse_encode(self.lqa, serializer); } } -impl SseEncode for APSState { +impl SseEncode for crate::api::api::CloudChat { // Codec=Sse (Serialization based), see doc to use other codecs fn sse_encode(self, serializer: &mut flutter_rust_bridge::for_generated::SseSerializer) { - >>::sse_encode(flutter_rust_bridge::for_generated::rust_auto_opaque_encode::<_, MoiArc<_>>(self), serializer); + ::sse_encode(self.style, serializer); + ::sse_encode(self.is_filtered, serializer); + ::sse_encode(self.successful_query, serializer); + ::sse_encode(self.state, serializer); + ::sse_encode(self.chat_identifier, serializer); + ::sse_encode(self.group_id, serializer); + ::sse_encode(self.service_name, serializer); + ::sse_encode(self.original_group_id, serializer); + >::sse_encode(self.properties, serializer); + >::sse_encode(self.participants, serializer); + ::sse_encode(self.prop001, serializer); + ::sse_encode(self.last_read_message_timestamp, serializer); + ::sse_encode(self.last_addressed_handle, serializer); + ::sse_encode(self.guid, serializer); + >::sse_encode(self.display_name, serializer); + >>::sse_encode(self.proto001, serializer); + >::sse_encode(self.group_photo_guid, serializer); + >::sse_encode(self.group_photo, serializer); } } -impl SseEncode for APSWatcher { +impl SseEncode for crate::api::api::CloudMessage { // Codec=Sse (Serialization based), see doc to use other codecs fn sse_encode(self, serializer: &mut flutter_rust_bridge::for_generated::SseSerializer) { - >>::sse_encode(flutter_rust_bridge::for_generated::rust_auto_opaque_encode::<_, MoiArc<_>>(self), serializer); + >::sse_encode(self.utm, serializer); + ::sse_encode(self.r#type, serializer); + ::sse_encode(self.error, serializer); + ::sse_encode(self.chat_id, serializer); + ::sse_encode(self.sender, serializer); + ::sse_encode(self.time, serializer); + >>::sse_encode(self.msg_proto_2, serializer); + ::sse_encode(self.destination_caller_id, serializer); + >::sse_encode(self.msg_proto, serializer); + ::sse_encode(self.flags, serializer); + ::sse_encode(self.guid, serializer); + >>::sse_encode(self.msg_proto_3, serializer); + ::sse_encode(self.service, serializer); + >>::sse_encode(self.msg_proto_4, serializer); } } -impl SseEncode for ArcAnisetteClient { +impl SseEncode for crate::api::api::CloudMessageSummary { // Codec=Sse (Serialization based), see doc to use other codecs fn sse_encode(self, serializer: &mut flutter_rust_bridge::for_generated::SseSerializer) { - , - >, - >>::sse_encode( - flutter_rust_bridge::for_generated::rust_auto_opaque_encode::<_, MoiArc<_>>(self), - serializer, - ); + >::sse_encode(self.messages_summary, serializer); + >::sse_encode(self.chat_summary, serializer); + >::sse_encode(self.attachment_summary, serializer); } } -impl SseEncode for Arc> { +impl SseEncode for crate::api::api::CloudParticipant { // Codec=Sse (Serialization based), see doc to use other codecs fn sse_encode(self, serializer: &mut flutter_rust_bridge::for_generated::SseSerializer) { - >, - >, - >>::sse_encode( - flutter_rust_bridge::for_generated::rust_auto_opaque_encode::<_, MoiArc<_>>(self), - serializer, - ); + ::sse_encode(self.uri, serializer); } } -impl SseEncode for Arc> { +impl SseEncode for crate::api::api::CloudProp { // Codec=Sse (Serialization based), see doc to use other codecs fn sse_encode(self, serializer: &mut flutter_rust_bridge::for_generated::SseSerializer) { - >, - >, - >>::sse_encode( - flutter_rust_bridge::for_generated::rust_auto_opaque_encode::<_, MoiArc<_>>(self), - serializer, - ); + >::sse_encode(self.gpufc, serializer); + >::sse_encode(self.pv, serializer); + >::sse_encode(self.number_of_times_respondedto_thread, serializer); + >::sse_encode(self.should_force_to_sms, serializer); + >::sse_encode(self.last_seen_message_guid, serializer); + >::sse_encode(self.message_handshake_state, serializer); + >::sse_encode(self.legacy_group_identifiers, serializer); + >::sse_encode(self.group_photo_guid, serializer); + >::sse_encode(self.last_modification_date, serializer); } } -impl SseEncode for Arc { +impl SseEncode for crate::api::api::CloudProp001 { // Codec=Sse (Serialization based), see doc to use other codecs fn sse_encode(self, serializer: &mut flutter_rust_bridge::for_generated::SseSerializer) { - >>>::sse_encode(flutter_rust_bridge::for_generated::rust_auto_opaque_encode::<_, MoiArc<_>>(self), serializer); + ::sse_encode(self.syndication_type, serializer); } } -impl SseEncode for Arc> { +impl SseEncode for crate::api::api::CloudSyncNativeAuthMetadata { // Codec=Sse (Serialization based), see doc to use other codecs fn sse_encode(self, serializer: &mut flutter_rust_bridge::for_generated::SseSerializer) { - >, - >, - >>::sse_encode( - flutter_rust_bridge::for_generated::rust_auto_opaque_encode::<_, MoiArc<_>>(self), - serializer, - ); + ::sse_encode(self.native_session_id, serializer); + ::sse_encode(self.account_fingerprint, serializer); + ::sse_encode(self.protected_store_identity, serializer); } } -impl SseEncode for Arc { +impl SseEncode for crate::api::api::CloudSyncOutboundConsumeResult { // Codec=Sse (Serialization based), see doc to use other codecs fn sse_encode(self, serializer: &mut flutter_rust_bridge::for_generated::SseSerializer) { - >>>::sse_encode(flutter_rust_bridge::for_generated::rust_auto_opaque_encode::<_, MoiArc<_>>(self), serializer); + >::sse_encode(self.outcomes, serializer); + >::sse_encode(self.failure, serializer); } } -impl SseEncode for Arc { +impl SseEncode for crate::api::api::CloudSyncOutboundFailureClass { // Codec=Sse (Serialization based), see doc to use other codecs fn sse_encode(self, serializer: &mut flutter_rust_bridge::for_generated::SseSerializer) { - >, - >>::sse_encode( - flutter_rust_bridge::for_generated::rust_auto_opaque_encode::<_, MoiArc<_>>(self), + ::sse_encode( + match self { + crate::api::api::CloudSyncOutboundFailureClass::Throttled => 0, + crate::api::api::CloudSyncOutboundFailureClass::TransientServer => 1, + crate::api::api::CloudSyncOutboundFailureClass::Authentication => 2, + crate::api::api::CloudSyncOutboundFailureClass::Conflict => 3, + crate::api::api::CloudSyncOutboundFailureClass::ResetRequired => 4, + crate::api::api::CloudSyncOutboundFailureClass::Permanent => 5, + crate::api::api::CloudSyncOutboundFailureClass::Unknown => 6, + _ => { + unimplemented!(""); + } + }, serializer, ); } } -impl SseEncode for Arc> { +impl SseEncode for crate::api::api::CloudSyncOutboundReconcileDisposition { // Codec=Sse (Serialization based), see doc to use other codecs fn sse_encode(self, serializer: &mut flutter_rust_bridge::for_generated::SseSerializer) { - >, - >, - >>::sse_encode( - flutter_rust_bridge::for_generated::rust_auto_opaque_encode::<_, MoiArc<_>>(self), + ::sse_encode( + match self { + crate::api::api::CloudSyncOutboundReconcileDisposition::Committed => 0, + crate::api::api::CloudSyncOutboundReconcileDisposition::NotApplied => 1, + crate::api::api::CloudSyncOutboundReconcileDisposition::Diverged => 2, + crate::api::api::CloudSyncOutboundReconcileDisposition::Unresolved => 3, + _ => { + unimplemented!(""); + } + }, serializer, ); } } -impl SseEncode for Arc>> { +impl SseEncode for crate::api::api::CloudSyncOutboundReconcileResult { // Codec=Sse (Serialization based), see doc to use other codecs fn sse_encode(self, serializer: &mut flutter_rust_bridge::for_generated::SseSerializer) { - >>, - >, - >>::sse_encode( - flutter_rust_bridge::for_generated::rust_auto_opaque_encode::<_, MoiArc<_>>(self), + >::sse_encode( + self.disposition, + serializer, + ); + >::sse_encode(self.protected_proof_reference, serializer); + >::sse_encode( + self.failure_class, serializer, ); + >::sse_encode(self.retry_after_seconds, serializer); + >::sse_encode(self.failure, serializer); } } -impl SseEncode for Arc>>> { +impl SseEncode for crate::api::api::CloudSyncOutboundSafeCode { // Codec=Sse (Serialization based), see doc to use other codecs fn sse_encode(self, serializer: &mut flutter_rust_bridge::for_generated::SseSerializer) { - >>>, - >, - >>::sse_encode( - flutter_rust_bridge::for_generated::rust_auto_opaque_encode::<_, MoiArc<_>>(self), + ::sse_encode( + match self { + crate::api::api::CloudSyncOutboundSafeCode::InvalidScope => 0, + crate::api::api::CloudSyncOutboundSafeCode::InvalidRequest => 1, + crate::api::api::CloudSyncOutboundSafeCode::UnsupportedMessage => 2, + crate::api::api::CloudSyncOutboundSafeCode::MalformedMessage => 3, + crate::api::api::CloudSyncOutboundSafeCode::OversizedMessage => 4, + crate::api::api::CloudSyncOutboundSafeCode::ProtectedStorage => 5, + crate::api::api::CloudSyncOutboundSafeCode::BindingMismatch => 6, + crate::api::api::CloudSyncOutboundSafeCode::NativeAuthUnavailable => 7, + crate::api::api::CloudSyncOutboundSafeCode::NativePrepareFailed => 8, + crate::api::api::CloudSyncOutboundSafeCode::AlreadyConsumed => 9, + crate::api::api::CloudSyncOutboundSafeCode::CorrelationMismatch => 10, + _ => { + unimplemented!(""); + } + }, serializer, ); } } -impl SseEncode for Arc>> { +impl SseEncode for crate::api::api::CloudSyncOutboundSaveDisposition { // Codec=Sse (Serialization based), see doc to use other codecs fn sse_encode(self, serializer: &mut flutter_rust_bridge::for_generated::SseSerializer) { - >>, - >, - >>::sse_encode( - flutter_rust_bridge::for_generated::rust_auto_opaque_encode::<_, MoiArc<_>>(self), + ::sse_encode( + match self { + crate::api::api::CloudSyncOutboundSaveDisposition::Succeeded => 0, + crate::api::api::CloudSyncOutboundSaveDisposition::UnknownOutcome => 1, + crate::api::api::CloudSyncOutboundSaveDisposition::Failed => 2, + _ => { + unimplemented!(""); + } + }, serializer, ); } } -impl SseEncode for Arc> { +impl SseEncode for crate::api::api::CloudSyncOutboundSaveOutcome { // Codec=Sse (Serialization based), see doc to use other codecs fn sse_encode(self, serializer: &mut flutter_rust_bridge::for_generated::SseSerializer) { - >, - >, - >>::sse_encode( - flutter_rust_bridge::for_generated::rust_auto_opaque_encode::<_, MoiArc<_>>(self), + ::sse_encode(self.local_operation_id, serializer); + ::sse_encode(self.apple_operation_uuid, serializer); + ::sse_encode( + self.disposition, serializer, ); + >::sse_encode( + self.failure_class, + serializer, + ); + >::sse_encode(self.retry_after_seconds, serializer); } } -impl SseEncode for Arc> { +impl SseEncode for crate::api::api::CloudSyncPreparedMessageCreateInput { // Codec=Sse (Serialization based), see doc to use other codecs fn sse_encode(self, serializer: &mut flutter_rust_bridge::for_generated::SseSerializer) { - >, - >, - >>::sse_encode( - flutter_rust_bridge::for_generated::rust_auto_opaque_encode::<_, MoiArc<_>>(self), - serializer, - ); + ::sse_encode(self.local_operation_id, serializer); + ::sse_encode(self.logical_entity_key_hash, serializer); + ::sse_encode(self.protected_lease_reference, serializer); + ::sse_encode(self.protected_payload_reference, serializer); + ::sse_encode(self.payload_sha256, serializer); + ::sse_encode(self.protected_server_record_reference, serializer); + ::sse_encode(self.server_record_id_hash, serializer); + ::sse_encode(self.apple_operation_uuid, serializer); } } -impl SseEncode for Arc> { +impl SseEncode for crate::api::api::CloudSyncPreparedMessageCreateResult { // Codec=Sse (Serialization based), see doc to use other codecs fn sse_encode(self, serializer: &mut flutter_rust_bridge::for_generated::SseSerializer) { - >>, - >>::sse_encode( - flutter_rust_bridge::for_generated::rust_auto_opaque_encode::<_, MoiArc<_>>(self), - serializer, - ); + >::sse_encode(self.handle, serializer); + >::sse_encode(self.failure, serializer); } } -impl SseEncode for Arc { +impl SseEncode for crate::api::api::CloudSyncProtectedChange { // Codec=Sse (Serialization based), see doc to use other codecs fn sse_encode(self, serializer: &mut flutter_rust_bridge::for_generated::SseSerializer) { - >, - >>::sse_encode( - flutter_rust_bridge::for_generated::rust_auto_opaque_encode::<_, MoiArc<_>>(self), + ::sse_encode(self.change_id, serializer); + ::sse_encode(self.record_id_hash, serializer); + >::sse_encode(self.etag_hash, serializer); + ::sse_encode(self.kind, serializer); + ::sse_encode(self.payload_sha256, serializer); + ::sse_encode(self.payload_length, serializer); + ::sse_encode(self.protected_record_identity_reference, serializer); + ::sse_encode(self.protected_raw_envelope_reference, serializer); + >::sse_encode(self.server_modified_at_millis, serializer); + >::sse_encode( + self.preflight_code, serializer, ); + ::sse_encode(self.is_tombstone, serializer); } } -impl SseEncode for Arc> { +impl SseEncode for crate::api::api::CloudSyncProtectedChangeKind { // Codec=Sse (Serialization based), see doc to use other codecs fn sse_encode(self, serializer: &mut flutter_rust_bridge::for_generated::SseSerializer) { - >, - >, - >>::sse_encode( - flutter_rust_bridge::for_generated::rust_auto_opaque_encode::<_, MoiArc<_>>(self), + ::sse_encode( + match self { + crate::api::api::CloudSyncProtectedChangeKind::Save => 0, + crate::api::api::CloudSyncProtectedChangeKind::Delete => 1, + crate::api::api::CloudSyncProtectedChangeKind::Quarantined => 2, + _ => { + unimplemented!(""); + } + }, serializer, ); } } -impl SseEncode for Arc> { +impl SseEncode for crate::api::api::CloudSyncProtectedFailure { // Codec=Sse (Serialization based), see doc to use other codecs fn sse_encode(self, serializer: &mut flutter_rust_bridge::for_generated::SseSerializer) { - >, - >, - >>::sse_encode( - flutter_rust_bridge::for_generated::rust_auto_opaque_encode::<_, MoiArc<_>>(self), - serializer, - ); + ::sse_encode(self.category, serializer); + ::sse_encode(self.safe_code, serializer); + >::sse_encode(self.retry_after_seconds, serializer); } } -impl SseEncode for Asset { +impl SseEncode for crate::api::api::CloudSyncProtectedFailureCategory { // Codec=Sse (Serialization based), see doc to use other codecs fn sse_encode(self, serializer: &mut flutter_rust_bridge::for_generated::SseSerializer) { - >>::sse_encode( - flutter_rust_bridge::for_generated::rust_auto_opaque_encode::<_, MoiArc<_>>(self), + ::sse_encode( + match self { + crate::api::api::CloudSyncProtectedFailureCategory::Network => 0, + crate::api::api::CloudSyncProtectedFailureCategory::Throttled => 1, + crate::api::api::CloudSyncProtectedFailureCategory::Server => 2, + crate::api::api::CloudSyncProtectedFailureCategory::Authorization => 3, + crate::api::api::CloudSyncProtectedFailureCategory::PcsUnavailable => 4, + crate::api::api::CloudSyncProtectedFailureCategory::MalformedRecord => 5, + crate::api::api::CloudSyncProtectedFailureCategory::Conflict => 6, + crate::api::api::CloudSyncProtectedFailureCategory::LocalStorage => 7, + crate::api::api::CloudSyncProtectedFailureCategory::Unknown => 8, + _ => { + unimplemented!(""); + } + }, serializer, ); } } -impl SseEncode for ChannelInterestToken { +impl SseEncode for crate::api::api::CloudSyncProtectedFetchResult { // Codec=Sse (Serialization based), see doc to use other codecs fn sse_encode(self, serializer: &mut flutter_rust_bridge::for_generated::SseSerializer) { - , - >>::sse_encode( - flutter_rust_bridge::for_generated::rust_auto_opaque_encode::<_, MoiArc<_>>(self), - serializer, - ); + >::sse_encode(self.page, serializer); + >::sse_encode(self.failure, serializer); } } -impl SseEncode for CircleClientSession { +impl SseEncode for crate::api::api::CloudSyncProtectedGarbageCollection { // Codec=Sse (Serialization based), see doc to use other codecs fn sse_encode(self, serializer: &mut flutter_rust_bridge::for_generated::SseSerializer) { - , - >, - >>::sse_encode( - flutter_rust_bridge::for_generated::rust_auto_opaque_encode::<_, MoiArc<_>>(self), + ::sse_encode(self.scanned_count, serializer); + ::sse_encode(self.first_observed_count, serializer); + ::sse_encode(self.deleted_count, serializer); + ::sse_encode(self.preserved_live_count, serializer); + ::sse_encode(self.preserved_active_lease_count, serializer); + ::sse_encode(self.has_more, serializer); + } +} + +impl SseEncode for crate::api::api::CloudSyncProtectedGarbageCollectionResult { + // Codec=Sse (Serialization based), see doc to use other codecs + fn sse_encode(self, serializer: &mut flutter_rust_bridge::for_generated::SseSerializer) { + >::sse_encode( + self.collection, serializer, ); + >::sse_encode(self.failure, serializer); } } -impl SseEncode for ConversationLink { +impl SseEncode for crate::api::api::CloudSyncProtectedLeaseResult { // Codec=Sse (Serialization based), see doc to use other codecs fn sse_encode(self, serializer: &mut flutter_rust_bridge::for_generated::SseSerializer) { - >>::sse_encode(flutter_rust_bridge::for_generated::rust_auto_opaque_encode::<_, MoiArc<_>>(self), serializer); + >::sse_encode(self.failure, serializer); } } -impl SseEncode for ConversationParticipant { +impl SseEncode for crate::api::api::CloudSyncProtectedOutboundStage { // Codec=Sse (Serialization based), see doc to use other codecs fn sse_encode(self, serializer: &mut flutter_rust_bridge::for_generated::SseSerializer) { - , - >>::sse_encode( - flutter_rust_bridge::for_generated::rust_auto_opaque_encode::<_, MoiArc<_>>(self), - serializer, - ); + ::sse_encode(self.logical_entity_key_hash, serializer); + ::sse_encode(self.protected_payload_reference, serializer); + ::sse_encode(self.payload_sha256, serializer); + ::sse_encode(self.payload_length, serializer); + ::sse_encode(self.protected_server_record_reference, serializer); + ::sse_encode(self.server_record_id_hash, serializer); + ::sse_encode(self.lease_reference, serializer); } } -impl SseEncode for Date { +impl SseEncode for crate::api::api::CloudSyncProtectedOutboundStageResult { // Codec=Sse (Serialization based), see doc to use other codecs fn sse_encode(self, serializer: &mut flutter_rust_bridge::for_generated::SseSerializer) { - >>::sse_encode( - flutter_rust_bridge::for_generated::rust_auto_opaque_encode::<_, MoiArc<_>>(self), - serializer, + >::sse_encode( + self.stage, serializer, ); + >::sse_encode(self.failure, serializer); } } -impl SseEncode for EscrowData { +impl SseEncode for crate::api::api::CloudSyncProtectedPage { // Codec=Sse (Serialization based), see doc to use other codecs fn sse_encode(self, serializer: &mut flutter_rust_bridge::for_generated::SseSerializer) { - >>::sse_encode(flutter_rust_bridge::for_generated::rust_auto_opaque_encode::<_, MoiArc<_>>(self), serializer); + >::sse_encode(self.changes, serializer); + ::sse_encode(self.batch_id, serializer); + ::sse_encode(self.generation, serializer); + ::sse_encode(self.page_lease_reference, serializer); + >::sse_encode(self.protected_next_checkpoint_reference, serializer); + ::sse_encode(self.complete, serializer); + ::sse_encode(self.admitted_raw_bytes, serializer); } } -impl SseEncode for FindMyFriendsClient { +impl SseEncode for crate::api::api::CloudSyncProtectedPreflightCode { // Codec=Sse (Serialization based), see doc to use other codecs fn sse_encode(self, serializer: &mut flutter_rust_bridge::for_generated::SseSerializer) { - , - >, - >>::sse_encode( - flutter_rust_bridge::for_generated::rust_auto_opaque_encode::<_, MoiArc<_>>(self), + ::sse_encode( + match self { + crate::api::api::CloudSyncProtectedPreflightCode::UnsupportedRecordType => 0, + crate::api::api::CloudSyncProtectedPreflightCode::MalformedMetadata => 1, + crate::api::api::CloudSyncProtectedPreflightCode::OversizedRecord => 2, + crate::api::api::CloudSyncProtectedPreflightCode::InvalidChangeShape => 3, + _ => { + unimplemented!(""); + } + }, serializer, ); } } -impl SseEncode for FindMyPhoneClient { +impl SseEncode for crate::api::api::CloudSyncProtectedRecovery { // Codec=Sse (Serialization based), see doc to use other codecs fn sse_encode(self, serializer: &mut flutter_rust_bridge::for_generated::SseSerializer) { - , - >, - >>::sse_encode( - flutter_rust_bridge::for_generated::rust_auto_opaque_encode::<_, MoiArc<_>>(self), - serializer, - ); + >::sse_encode(self.finalized_adopted_lease_references, serializer); + >::sse_encode(self.absent_adopted_lease_references, serializer); + ::sse_encode(self.rolled_back_count, serializer); + ::sse_encode(self.removed_temporary_files_count, serializer); + ::sse_encode(self.has_more, serializer); } } -impl SseEncode for GZipWrapper { +impl SseEncode for crate::api::api::CloudSyncProtectedRecoveryResult { // Codec=Sse (Serialization based), see doc to use other codecs fn sse_encode(self, serializer: &mut flutter_rust_bridge::for_generated::SseSerializer) { - >, - >>::sse_encode( - flutter_rust_bridge::for_generated::rust_auto_opaque_encode::<_, MoiArc<_>>(self), + >::sse_encode( + self.recovery, serializer, ); + >::sse_encode(self.failure, serializer); } } -impl SseEncode for GZipWrapper { +impl SseEncode for crate::api::api::CloudSyncProtectedRetirementResult { // Codec=Sse (Serialization based), see doc to use other codecs fn sse_encode(self, serializer: &mut flutter_rust_bridge::for_generated::SseSerializer) { - >, - >>::sse_encode( - flutter_rust_bridge::for_generated::rust_auto_opaque_encode::<_, MoiArc<_>>(self), - serializer, - ); + ::sse_encode(self.retired_count, serializer); + >::sse_encode(self.failure, serializer); } } -impl SseEncode for GZipWrapper { +impl SseEncode for crate::api::api::CloudSyncProtectedSafeCode { // Codec=Sse (Serialization based), see doc to use other codecs fn sse_encode(self, serializer: &mut flutter_rust_bridge::for_generated::SseSerializer) { - >, - >>::sse_encode( - flutter_rust_bridge::for_generated::rust_auto_opaque_encode::<_, MoiArc<_>>(self), + ::sse_encode( + match self { + crate::api::api::CloudSyncProtectedSafeCode::InvalidScope => 0, + crate::api::api::CloudSyncProtectedSafeCode::InvalidRequest => 1, + crate::api::api::CloudSyncProtectedSafeCode::InvalidCheckpoint => 2, + crate::api::api::CloudSyncProtectedSafeCode::CheckpointContextMismatch => 3, + crate::api::api::CloudSyncProtectedSafeCode::OversizedPage => 4, + crate::api::api::CloudSyncProtectedSafeCode::OversizedRecord => 5, + crate::api::api::CloudSyncProtectedSafeCode::ProtectionFailed => 6, + crate::api::api::CloudSyncProtectedSafeCode::LocalStoreFailed => 7, + crate::api::api::CloudSyncProtectedSafeCode::FetchDeadline => 8, + crate::api::api::CloudSyncProtectedSafeCode::Network => 9, + crate::api::api::CloudSyncProtectedSafeCode::CloudKitThrottled => 10, + crate::api::api::CloudSyncProtectedSafeCode::CloudKitServer => 11, + crate::api::api::CloudSyncProtectedSafeCode::CloudKitAuthorization => 12, + crate::api::api::CloudSyncProtectedSafeCode::CloudKitConflict => 13, + crate::api::api::CloudSyncProtectedSafeCode::CloudKitResetRequired => 14, + crate::api::api::CloudSyncProtectedSafeCode::CloudKitPermanent => 15, + crate::api::api::CloudSyncProtectedSafeCode::CloudKitUnknown => 16, + crate::api::api::CloudSyncProtectedSafeCode::HttpAuthorization => 17, + crate::api::api::CloudSyncProtectedSafeCode::HttpTimeout => 18, + crate::api::api::CloudSyncProtectedSafeCode::HttpThrottled => 19, + crate::api::api::CloudSyncProtectedSafeCode::HttpServer => 20, + crate::api::api::CloudSyncProtectedSafeCode::HttpUnknown => 21, + crate::api::api::CloudSyncProtectedSafeCode::PcsUnavailable => 22, + crate::api::api::CloudSyncProtectedSafeCode::MalformedResponse => 23, + crate::api::api::CloudSyncProtectedSafeCode::ContinuationNoProgress => 24, + crate::api::api::CloudSyncProtectedSafeCode::NativeAuthUnavailable => 25, + crate::api::api::CloudSyncProtectedSafeCode::Unknown => 26, + _ => { + unimplemented!(""); + } + }, serializer, ); } } -impl SseEncode for GZipWrapper { +impl SseEncode for crate::api::api::CloudSyncRawChange { // Codec=Sse (Serialization based), see doc to use other codecs fn sse_encode(self, serializer: &mut flutter_rust_bridge::for_generated::SseSerializer) { - >, - >>::sse_encode( - flutter_rust_bridge::for_generated::rust_auto_opaque_encode::<_, MoiArc<_>>(self), + >::sse_encode(self.record_name, serializer); + >::sse_encode(self.record_type, serializer); + >::sse_encode(self.change_type, serializer); + >::sse_encode( + self.system_fields, serializer, ); + >>::sse_encode(self.encrypted_record, serializer); + >>::sse_encode(self.tombstone_payload, serializer); + ::sse_encode(self.kind, serializer); } } -impl SseEncode for GZipWrapper { +impl SseEncode for crate::api::api::CloudSyncRawFailure { // Codec=Sse (Serialization based), see doc to use other codecs fn sse_encode(self, serializer: &mut flutter_rust_bridge::for_generated::SseSerializer) { - >, - >>::sse_encode( - flutter_rust_bridge::for_generated::rust_auto_opaque_encode::<_, MoiArc<_>>(self), - serializer, - ); + ::sse_encode(self.category, serializer); + >::sse_encode(self.retry_after_seconds, serializer); + ::sse_encode(self.safe_code, serializer); } } -impl SseEncode for GZipWrapper { +impl SseEncode for crate::api::api::CloudSyncRawFailureCategory { // Codec=Sse (Serialization based), see doc to use other codecs fn sse_encode(self, serializer: &mut flutter_rust_bridge::for_generated::SseSerializer) { - >, - >>::sse_encode( - flutter_rust_bridge::for_generated::rust_auto_opaque_encode::<_, MoiArc<_>>(self), + ::sse_encode( + match self { + crate::api::api::CloudSyncRawFailureCategory::Network => 0, + crate::api::api::CloudSyncRawFailureCategory::Throttled => 1, + crate::api::api::CloudSyncRawFailureCategory::Server => 2, + crate::api::api::CloudSyncRawFailureCategory::Authorization => 3, + crate::api::api::CloudSyncRawFailureCategory::PcsUnavailable => 4, + crate::api::api::CloudSyncRawFailureCategory::MalformedRecord => 5, + crate::api::api::CloudSyncRawFailureCategory::Conflict => 6, + crate::api::api::CloudSyncRawFailureCategory::LocalStorage => 7, + crate::api::api::CloudSyncRawFailureCategory::Unknown => 8, + _ => { + unimplemented!(""); + } + }, serializer, ); } } -impl SseEncode for IDSNGMIdentity { +impl SseEncode for crate::api::api::CloudSyncRawFetchResult { // Codec=Sse (Serialization based), see doc to use other codecs fn sse_encode(self, serializer: &mut flutter_rust_bridge::for_generated::SseSerializer) { - >>::sse_encode(flutter_rust_bridge::for_generated::rust_auto_opaque_encode::<_, MoiArc<_>>(self), serializer); + >::sse_encode(self.page, serializer); + >::sse_encode(self.failure, serializer); } } -impl SseEncode for IDSUser { +impl SseEncode for crate::api::api::CloudSyncRawPage { // Codec=Sse (Serialization based), see doc to use other codecs fn sse_encode(self, serializer: &mut flutter_rust_bridge::for_generated::SseSerializer) { - >>::sse_encode(flutter_rust_bridge::for_generated::rust_auto_opaque_encode::<_, MoiArc<_>>(self), serializer); + >::sse_encode(self.changes, serializer); + >>::sse_encode(self.next_token, serializer); + ::sse_encode(self.status, serializer); + ::sse_encode(self.complete, serializer); } } -impl SseEncode for JoinedOSConfig { +impl SseEncode for crate::api::api::CloudSyncRawRecordKind { // Codec=Sse (Serialization based), see doc to use other codecs fn sse_encode(self, serializer: &mut flutter_rust_bridge::for_generated::SseSerializer) { - >>::sse_encode(flutter_rust_bridge::for_generated::rust_auto_opaque_encode::<_, MoiArc<_>>(self), serializer); + ::sse_encode( + match self { + crate::api::api::CloudSyncRawRecordKind::EncryptedUpsert => 0, + crate::api::api::CloudSyncRawRecordKind::Tombstone => 1, + crate::api::api::CloudSyncRawRecordKind::UnsupportedRecordType => 2, + crate::api::api::CloudSyncRawRecordKind::MalformedMetadata => 3, + _ => { + unimplemented!(""); + } + }, + serializer, + ); } } -impl SseEncode for LocationReport { +impl SseEncode for crate::api::api::CloudSyncRawSystemFields { // Codec=Sse (Serialization based), see doc to use other codecs fn sse_encode(self, serializer: &mut flutter_rust_bridge::for_generated::SseSerializer) { - >>::sse_encode(flutter_rust_bridge::for_generated::rust_auto_opaque_encode::<_, MoiArc<_>>(self), serializer); + >::sse_encode(self.etag, serializer); + >::sse_encode(self.created_at, serializer); + >::sse_encode(self.modified_at, serializer); + >::sse_encode(self.permission, serializer); } } -impl SseEncode for MessageFlags { +impl SseEncode for crate::api::api::CloudSyncTransientAssociationKind { // Codec=Sse (Serialization based), see doc to use other codecs fn sse_encode(self, serializer: &mut flutter_rust_bridge::for_generated::SseSerializer) { - >>::sse_encode(flutter_rust_bridge::for_generated::rust_auto_opaque_encode::<_, MoiArc<_>>(self), serializer); + ::sse_encode( + match self { + crate::api::api::CloudSyncTransientAssociationKind::None => 0, + crate::api::api::CloudSyncTransientAssociationKind::Sticker => 1, + crate::api::api::CloudSyncTransientAssociationKind::ReactionAdd => 2, + crate::api::api::CloudSyncTransientAssociationKind::ReactionRemove => 3, + _ => { + unimplemented!(""); + } + }, + serializer, + ); } } -impl SseEncode for NSArray { +impl SseEncode for crate::api::api::CloudSyncTransientAttachmentPayload { // Codec=Sse (Serialization based), see doc to use other codecs fn sse_encode(self, serializer: &mut flutter_rust_bridge::for_generated::SseSerializer) { - >, - >>::sse_encode( - flutter_rust_bridge::for_generated::rust_auto_opaque_encode::<_, MoiArc<_>>(self), + ::sse_encode(self.logical_entity_key_hash, serializer); + ::sse_encode(self.canonical_guid, serializer); + >::sse_encode(self.owner_logical_key_hash, serializer); + >::sse_encode(self.owner_canonical_guid, serializer); + >::sse_encode(self.owner_part, serializer); + ::sse_encode(self.uti_state, serializer); + >::sse_encode(self.uti, serializer); + ::sse_encode( + self.file_name_state, serializer, ); + >::sse_encode(self.file_name, serializer); + ::sse_encode( + self.mime_type_state, + serializer, + ); + >::sse_encode(self.mime_type, serializer); + ::sse_encode( + self.total_bytes_state, + serializer, + ); + >::sse_encode(self.total_bytes, serializer); + ::sse_encode( + self.is_outgoing_state, + serializer, + ); + >::sse_encode(self.is_outgoing, serializer); + ::sse_encode( + self.protected_local_reference_state, + serializer, + ); + >::sse_encode(self.protected_local_reference, serializer); } } -impl SseEncode for NSArray { +impl SseEncode for crate::api::api::CloudSyncTransientAttributedBody { // Codec=Sse (Serialization based), see doc to use other codecs fn sse_encode(self, serializer: &mut flutter_rust_bridge::for_generated::SseSerializer) { - >, - >>::sse_encode( - flutter_rust_bridge::for_generated::rust_auto_opaque_encode::<_, MoiArc<_>>(self), + ::sse_encode(self.text, serializer); + >::sse_encode(self.runs, serializer); + } +} + +impl SseEncode for crate::api::api::CloudSyncTransientChatPayload { + // Codec=Sse (Serialization based), see doc to use other codecs + fn sse_encode(self, serializer: &mut flutter_rust_bridge::for_generated::SseSerializer) { + ::sse_encode(self.logical_entity_key_hash, serializer); + ::sse_encode(self.canonical_guid, serializer); + ::sse_encode(self.chat_identifier, serializer); + ::sse_encode(self.group_id, serializer); + ::sse_encode(self.original_group_id, serializer); + ::sse_encode(self.service, serializer); + ::sse_encode(self.style, serializer); + >::sse_encode(self.participant_handles, serializer); + ::sse_encode( + self.display_name_state, + serializer, + ); + >::sse_encode(self.display_name, serializer); + ::sse_encode( + self.last_addressed_handle_state, + serializer, + ); + >::sse_encode(self.last_addressed_handle, serializer); + ::sse_encode( + self.group_version_state, + serializer, + ); + >::sse_encode(self.group_version, serializer); + ::sse_encode( + self.last_seen_message_guid_state, + serializer, + ); + >::sse_encode(self.last_seen_message_guid, serializer); + ::sse_encode( + self.group_photo_guid_state, serializer, ); + >::sse_encode(self.group_photo_guid, serializer); } } -impl SseEncode for PushError { - // Codec=Sse (Serialization based), see doc to use other codecs - fn sse_encode(self, serializer: &mut flutter_rust_bridge::for_generated::SseSerializer) { - >>::sse_encode(flutter_rust_bridge::for_generated::rust_auto_opaque_encode::<_, MoiArc<_>>(self), serializer); - } -} - -impl SseEncode for Receiver { +impl SseEncode for crate::api::api::CloudSyncTransientChatStyle { // Codec=Sse (Serialization based), see doc to use other codecs fn sse_encode(self, serializer: &mut flutter_rust_bridge::for_generated::SseSerializer) { - >, - >>::sse_encode( - flutter_rust_bridge::for_generated::rust_auto_opaque_encode::<_, MoiArc<_>>(self), + ::sse_encode( + match self { + crate::api::api::CloudSyncTransientChatStyle::Direct => 0, + crate::api::api::CloudSyncTransientChatStyle::Group => 1, + _ => { + unimplemented!(""); + } + }, serializer, ); } } -impl SseEncode for SavedHardwareState { +impl SseEncode for crate::api::api::CloudSyncTransientDecodeResult { // Codec=Sse (Serialization based), see doc to use other codecs fn sse_encode(self, serializer: &mut flutter_rust_bridge::for_generated::SseSerializer) { - >>::sse_encode(flutter_rust_bridge::for_generated::rust_auto_opaque_encode::<_, MoiArc<_>>(self), serializer); + >::sse_encode(self.protected_source_reference, serializer); + ::sse_encode(self.generation, serializer); + >::sse_encode(self.change_id, serializer); + >::sse_encode( + self.entity_kind, + serializer, + ); + >::sse_encode( + self.mutation_kind, + serializer, + ); + >::sse_encode( + self.snapshot, + serializer, + ); + >::sse_encode(self.payload, serializer); + >::sse_encode( + self.tombstone, + serializer, + ); + >::sse_encode( + self.deferred_reason, + serializer, + ); + >::sse_encode( + self.quarantine_reason, + serializer, + ); + >::sse_encode( + self.failure_code, + serializer, + ); } } -impl SseEncode for Sender<()> { +impl SseEncode for crate::api::api::CloudSyncTransientDeferredReason { // Codec=Sse (Serialization based), see doc to use other codecs fn sse_encode(self, serializer: &mut flutter_rust_bridge::for_generated::SseSerializer) { - >>>::sse_encode(flutter_rust_bridge::for_generated::rust_auto_opaque_encode::<_, MoiArc<_>>(self), serializer); + ::sse_encode(match self {crate::api::api::CloudSyncTransientDeferredReason::NestedPresenceUnavailable => { 0 } +crate::api::api::CloudSyncTransientDeferredReason::UnprovenEditTimestamp => { 1 } +crate::api::api::CloudSyncTransientDeferredReason::UnsupportedExtensionPayload => { 2 } +crate::api::api::CloudSyncTransientDeferredReason::UnsupportedMediaCredentials => { 3 } +crate::api::api::CloudSyncTransientDeferredReason::UnsupportedGroupPhoto => { 4 } +crate::api::api::CloudSyncTransientDeferredReason::UnsupportedSticker => { 5 } +crate::api::api::CloudSyncTransientDeferredReason::UnsupportedScheduling => { 6 } +crate::api::api::CloudSyncTransientDeferredReason::UnsupportedOffGridMetadata => { 7 } +crate::api::api::CloudSyncTransientDeferredReason::UnsupportedNegativeAttachmentSize => { 8 } + _ => { unimplemented!(""); }}, serializer); } } -impl SseEncode for StCollapsedValue { +impl SseEncode for crate::api::api::CloudSyncTransientEditPart { // Codec=Sse (Serialization based), see doc to use other codecs fn sse_encode(self, serializer: &mut flutter_rust_bridge::for_generated::SseSerializer) { - >>::sse_encode(flutter_rust_bridge::for_generated::rust_auto_opaque_encode::<_, MoiArc<_>>(self), serializer); + ::sse_encode(self.part_key_hash, serializer); + ::sse_encode(self.revision, serializer); + ::sse_encode(self.content_digest, serializer); + ::sse_encode(self.modified_at_millis, serializer); } } -impl SseEncode for SyncManager { +impl SseEncode for crate::api::api::CloudSyncTransientEntityKind { // Codec=Sse (Serialization based), see doc to use other codecs fn sse_encode(self, serializer: &mut flutter_rust_bridge::for_generated::SseSerializer) { - , - >, - >>::sse_encode( - flutter_rust_bridge::for_generated::rust_auto_opaque_encode::<_, MoiArc<_>>(self), + ::sse_encode( + match self { + crate::api::api::CloudSyncTransientEntityKind::Chat => 0, + crate::api::api::CloudSyncTransientEntityKind::Message => 1, + crate::api::api::CloudSyncTransientEntityKind::Reaction => 2, + crate::api::api::CloudSyncTransientEntityKind::Attachment => 3, + crate::api::api::CloudSyncTransientEntityKind::GroupPhoto => 4, + _ => { + unimplemented!(""); + } + }, serializer, ); } } -impl SseEncode for SystemTime { +impl SseEncode for crate::api::api::CloudSyncTransientFailureCode { // Codec=Sse (Serialization based), see doc to use other codecs fn sse_encode(self, serializer: &mut flutter_rust_bridge::for_generated::SseSerializer) { - >>::sse_encode(flutter_rust_bridge::for_generated::rust_auto_opaque_encode::<_, MoiArc<_>>(self), serializer); + ::sse_encode( + match self { + crate::api::api::CloudSyncTransientFailureCode::InvalidRequest => 0, + crate::api::api::CloudSyncTransientFailureCode::ActiveAccountMismatch => 1, + crate::api::api::CloudSyncTransientFailureCode::ScopeMismatch => 2, + crate::api::api::CloudSyncTransientFailureCode::GenerationMismatch => 3, + crate::api::api::CloudSyncTransientFailureCode::StoreIdentityMismatch => 4, + crate::api::api::CloudSyncTransientFailureCode::ProtectedReferenceMismatch => 5, + crate::api::api::CloudSyncTransientFailureCode::MalformedRecord => 6, + crate::api::api::CloudSyncTransientFailureCode::OversizedRecord => 7, + crate::api::api::CloudSyncTransientFailureCode::PcsUnavailable => 8, + crate::api::api::CloudSyncTransientFailureCode::RetryableUpstream => 9, + crate::api::api::CloudSyncTransientFailureCode::DecoderFailure => 10, + _ => { + unimplemented!(""); + } + }, + serializer, + ); } } -impl SseEncode for VerifyBody { +impl SseEncode for crate::api::api::CloudSyncTransientFieldState { // Codec=Sse (Serialization based), see doc to use other codecs fn sse_encode(self, serializer: &mut flutter_rust_bridge::for_generated::SseSerializer) { - >>::sse_encode(flutter_rust_bridge::for_generated::rust_auto_opaque_encode::<_, MoiArc<_>>(self), serializer); + ::sse_encode( + match self { + crate::api::api::CloudSyncTransientFieldState::Absent => 0, + crate::api::api::CloudSyncTransientFieldState::Value => 1, + crate::api::api::CloudSyncTransientFieldState::ExplicitClear => 2, + _ => { + unimplemented!(""); + } + }, + serializer, + ); } } -impl SseEncode for ViableBottle { +impl SseEncode for crate::api::api::CloudSyncTransientGroupPhotoPayload { // Codec=Sse (Serialization based), see doc to use other codecs fn sse_encode(self, serializer: &mut flutter_rust_bridge::for_generated::SseSerializer) { - >>::sse_encode(flutter_rust_bridge::for_generated::rust_auto_opaque_encode::<_, MoiArc<_>>(self), serializer); + ::sse_encode(self.logical_entity_key_hash, serializer); + ::sse_encode(self.owner_logical_key_hash, serializer); + ::sse_encode(self.photo_guid, serializer); + ::sse_encode(self.protected_local_reference, serializer); } } -impl SseEncode for flutter_rust_bridge::DartOpaque { +impl SseEncode for crate::api::api::CloudSyncTransientKnownMessageFlags { // Codec=Sse (Serialization based), see doc to use other codecs fn sse_encode(self, serializer: &mut flutter_rust_bridge::for_generated::SseSerializer) { - ::sse_encode(self.encode(), serializer); + ::sse_encode(self.from_me, serializer); + ::sse_encode(self.delivered, serializer); + ::sse_encode(self.read, serializer); + ::sse_encode(self.has_data_detector_results, serializer); + ::sse_encode(self.delivered_quietly, serializer); + ::sse_encode(self.did_notify_recipient, serializer); } } -impl SseEncode for std::collections::HashMap { +impl SseEncode for crate::api::api::CloudSyncTransientMessageEdit { // Codec=Sse (Serialization based), see doc to use other codecs fn sse_encode(self, serializer: &mut flutter_rust_bridge::for_generated::SseSerializer) { - >::sse_encode(self.into_iter().collect(), serializer); + ::sse_encode(self.part, serializer); + ::sse_encode(self.revision, serializer); + >::sse_encode( + self.bodies, + serializer, + ); + ::sse_encode(self.modified_at_millis, serializer); + >::sse_encode(self.original_range_location, serializer); + >::sse_encode(self.original_range_length, serializer); } } -impl SseEncode for std::collections::HashMap { +impl SseEncode for crate::api::api::CloudSyncTransientMessagePayload { // Codec=Sse (Serialization based), see doc to use other codecs fn sse_encode(self, serializer: &mut flutter_rust_bridge::for_generated::SseSerializer) { - >::sse_encode(self.into_iter().collect(), serializer); + ::sse_encode(self.logical_entity_key_hash, serializer); + ::sse_encode(self.canonical_guid, serializer); + ::sse_encode(self.chat_alias_key_hash, serializer); + ::sse_encode(self.chat_identifier, serializer); + ::sse_encode(self.sender_handle, serializer); + ::sse_encode(self.created_at_millis, serializer); + ::sse_encode(self.error, serializer); + ::sse_encode(self.service, serializer); + ::sse_encode(self.subject_state, serializer); + >::sse_encode(self.subject, serializer); + ::sse_encode(self.body_state, serializer); + >::sse_encode(self.body, serializer); + ::sse_encode( + self.attributed_bodies_state, + serializer, + ); + >::sse_encode( + self.attributed_bodies, + serializer, + ); + ::sse_encode( + self.balloon_bundle_id_state, + serializer, + ); + >::sse_encode(self.balloon_bundle_id, serializer); + ::sse_encode(self.effect_state, serializer); + >::sse_encode(self.effect, serializer); + ::sse_encode( + self.read_at_millis_state, + serializer, + ); + >::sse_encode(self.read_at_millis, serializer); + ::sse_encode( + self.delivered_at_millis_state, + serializer, + ); + >::sse_encode(self.delivered_at_millis, serializer); + ::sse_encode( + self.known_flags, + serializer, + ); + ::sse_encode( + self.association_kind, + serializer, + ); + >::sse_encode( + self.reaction_kind, + serializer, + ); + ::sse_encode(self.reaction_removed, serializer); + >::sse_encode(self.reaction_parent_logical_key_hash, serializer); + >::sse_encode(self.reaction_parent_canonical_guid, serializer); + >::sse_encode(self.reaction_parent_part, serializer); + >::sse_encode(self.associated_range_location, serializer); + >::sse_encode(self.associated_range_length, serializer); + >::sse_encode(self.reply_parent_logical_key_hash, serializer); + >::sse_encode(self.reply_parent_canonical_guid, serializer); + >::sse_encode(self.reply_parent_part, serializer); + ::sse_encode(self.edits_state, serializer); + >::sse_encode(self.edits, serializer); + ::sse_encode( + self.retracted_parts_state, + serializer, + ); + >::sse_encode(self.retracted_parts, serializer); + ::sse_encode( + self.associated_emoji_state, + serializer, + ); + >::sse_encode(self.associated_emoji, serializer); } } -impl SseEncode for std::collections::HashMap { +impl SseEncode for crate::api::api::CloudSyncTransientMutationKind { // Codec=Sse (Serialization based), see doc to use other codecs fn sse_encode(self, serializer: &mut flutter_rust_bridge::for_generated::SseSerializer) { - >::sse_encode(self.into_iter().collect(), serializer); + ::sse_encode( + match self { + crate::api::api::CloudSyncTransientMutationKind::Upsert => 0, + crate::api::api::CloudSyncTransientMutationKind::Tombstone => 1, + _ => { + unimplemented!(""); + } + }, + serializer, + ); } } -impl SseEncode for std::collections::HashMap { +impl SseEncode for crate::api::api::CloudSyncTransientPayload { // Codec=Sse (Serialization based), see doc to use other codecs fn sse_encode(self, serializer: &mut flutter_rust_bridge::for_generated::SseSerializer) { - >::sse_encode(self.into_iter().collect(), serializer); + >::sse_encode(self.chat, serializer); + >::sse_encode( + self.message, + serializer, + ); + >::sse_encode( + self.attachment, + serializer, + ); + >::sse_encode( + self.group_photo, + serializer, + ); } } -impl SseEncode for std::collections::HashMap { +impl SseEncode for crate::api::api::CloudSyncTransientQuarantineReason { // Codec=Sse (Serialization based), see doc to use other codecs fn sse_encode(self, serializer: &mut flutter_rust_bridge::for_generated::SseSerializer) { - >::sse_encode(self.into_iter().collect(), serializer); + ::sse_encode(match self {crate::api::api::CloudSyncTransientQuarantineReason::MalformedRequiredIdentity => { 0 } +crate::api::api::CloudSyncTransientQuarantineReason::FieldPresenceMismatch => { 1 } +crate::api::api::CloudSyncTransientQuarantineReason::UnsupportedService => { 2 } +crate::api::api::CloudSyncTransientQuarantineReason::UnsupportedChatStyle => { 3 } +crate::api::api::CloudSyncTransientQuarantineReason::UnsupportedMessageType => { 4 } +crate::api::api::CloudSyncTransientQuarantineReason::UnsupportedAssociationType => { 5 } +crate::api::api::CloudSyncTransientQuarantineReason::MalformedParent => { 6 } +crate::api::api::CloudSyncTransientQuarantineReason::AmbiguousReply => { 7 } +crate::api::api::CloudSyncTransientQuarantineReason::MalformedAttributedBody => { 8 } +crate::api::api::CloudSyncTransientQuarantineReason::MalformedMessageSummary => { 9 } +crate::api::api::CloudSyncTransientQuarantineReason::ConflictingEditAndRetraction => { 10 } +crate::api::api::CloudSyncTransientQuarantineReason::OversizedContent => { 11 } +crate::api::api::CloudSyncTransientQuarantineReason::InvalidCanonicalPayload => { 12 } +crate::api::api::CloudSyncTransientQuarantineReason::MalformedRecord => { 13 } + _ => { unimplemented!(""); }}, serializer); } } -impl SseEncode for std::collections::HashMap { +impl SseEncode for crate::api::api::CloudSyncTransientReactionKind { // Codec=Sse (Serialization based), see doc to use other codecs fn sse_encode(self, serializer: &mut flutter_rust_bridge::for_generated::SseSerializer) { - >::sse_encode( - self.into_iter().collect(), + ::sse_encode( + match self { + crate::api::api::CloudSyncTransientReactionKind::Heart => 0, + crate::api::api::CloudSyncTransientReactionKind::Like => 1, + crate::api::api::CloudSyncTransientReactionKind::Dislike => 2, + crate::api::api::CloudSyncTransientReactionKind::Laugh => 3, + crate::api::api::CloudSyncTransientReactionKind::Emphasize => 4, + crate::api::api::CloudSyncTransientReactionKind::Question => 5, + crate::api::api::CloudSyncTransientReactionKind::Emoji => 6, + crate::api::api::CloudSyncTransientReactionKind::StickerBack => 7, + _ => { + unimplemented!(""); + } + }, serializer, ); } } -impl SseEncode for std::collections::HashMap { +impl SseEncode for crate::api::api::CloudSyncTransientService { // Codec=Sse (Serialization based), see doc to use other codecs fn sse_encode(self, serializer: &mut flutter_rust_bridge::for_generated::SseSerializer) { - >::sse_encode( - self.into_iter().collect(), + ::sse_encode( + match self { + crate::api::api::CloudSyncTransientService::IMessage => 0, + _ => { + unimplemented!(""); + } + }, serializer, ); } } -impl SseEncode for std::collections::HashMap { +impl SseEncode for crate::api::api::CloudSyncTransientSnapshot { // Codec=Sse (Serialization based), see doc to use other codecs fn sse_encode(self, serializer: &mut flutter_rust_bridge::for_generated::SseSerializer) { - >::sse_encode( - self.into_iter().collect(), - serializer, - ); + ::sse_encode(self.entity_kind, serializer); + ::sse_encode(self.logical_entity_key_hash, serializer); + >::sse_encode(self.parent_logical_key_hash, serializer); + >::sse_encode(self.immutable_content_digest, serializer); + >::sse_encode(self.created_at_millis, serializer); + >::sse_encode(self.read_at_millis, serializer); + >::sse_encode(self.delivered_at_millis, serializer); + >::sse_encode(self.edit_parts, serializer); + >::sse_encode(self.retracted_at_millis, serializer); + >::sse_encode(self.group_version, serializer); + >::sse_encode(self.group_metadata_digest, serializer); + >::sse_encode(self.etag_hash, serializer); + ::sse_encode(self.protected_source_reference, serializer); } } -impl SseEncode for std::collections::HashMap { +impl SseEncode for crate::api::api::CloudSyncTransientTextRun { // Codec=Sse (Serialization based), see doc to use other codecs fn sse_encode(self, serializer: &mut flutter_rust_bridge::for_generated::SseSerializer) { - >::sse_encode( - self.into_iter().collect(), - serializer, - ); + ::sse_encode(self.start_utf16, serializer); + ::sse_encode(self.length_utf16, serializer); + >::sse_encode(self.message_part, serializer); + >::sse_encode(self.attachment_canonical_guid, serializer); + >::sse_encode(self.attachment_logical_key_hash, serializer); + >::sse_encode(self.mention_handle, serializer); + >::sse_encode(self.audio_transcript, serializer); + >::sse_encode(self.text_effect, serializer); + >::sse_encode(self.bold, serializer); + >::sse_encode(self.italic, serializer); + >::sse_encode(self.strikethrough, serializer); + >::sse_encode(self.underline, serializer); } } -impl SseEncode for std::collections::HashMap { +impl SseEncode for crate::api::api::CloudSyncTransientTombstone { // Codec=Sse (Serialization based), see doc to use other codecs fn sse_encode(self, serializer: &mut flutter_rust_bridge::for_generated::SseSerializer) { - >::sse_encode( - self.into_iter().collect(), - serializer, - ); + ::sse_encode(self.entity_kind, serializer); + ::sse_encode(self.logical_entity_key_hash, serializer); + >::sse_encode(self.deleted_at_millis, serializer); + ::sse_encode(self.server_confirmed, serializer); } } -impl SseEncode for std::collections::HashMap> { +impl SseEncode for crate::api::api::ConversationData { // Codec=Sse (Serialization based), see doc to use other codecs fn sse_encode(self, serializer: &mut flutter_rust_bridge::for_generated::SseSerializer) { - )>>::sse_encode( - self.into_iter().collect(), - serializer, - ); + >::sse_encode(self.participants, serializer); + >::sse_encode(self.cv_name, serializer); + >::sse_encode(self.sender_guid, serializer); + >::sse_encode(self.after_guid, serializer); } } -impl SseEncode for std::collections::HashMap> { +impl SseEncode for crate::api::api::DartBeacon { // Codec=Sse (Serialization based), see doc to use other codecs fn sse_encode(self, serializer: &mut flutter_rust_bridge::for_generated::SseSerializer) { - )>>::sse_encode(self.into_iter().collect(), serializer); + ::sse_encode(self.naming, serializer); + >::sse_encode(self.last_report, serializer); + ::sse_encode(self.product_id, serializer); + >::sse_encode(self.battery_level, serializer); + ::sse_encode(self.vendor_id, serializer); + ::sse_encode(self.model, serializer); + ::sse_encode(self.system_version, serializer); + ::sse_encode(self.id, serializer); + >::sse_encode(self.shared, serializer); } } -impl SseEncode for std::collections::HashMap { +impl SseEncode for crate::api::api::DartBeaconShareInfo { // Codec=Sse (Serialization based), see doc to use other codecs fn sse_encode(self, serializer: &mut flutter_rust_bridge::for_generated::SseSerializer) { - >::sse_encode( - self.into_iter().collect(), - serializer, - ); + ::sse_encode(self.share_id, serializer); + ::sse_encode(self.acceptance_state, serializer); + ::sse_encode(self.owner_handle, serializer); } } -impl SseEncode for std::collections::HashMap> { +impl SseEncode for crate::api::api::DeleteTarget { // Codec=Sse (Serialization based), see doc to use other codecs fn sse_encode(self, serializer: &mut flutter_rust_bridge::for_generated::SseSerializer) { - )>>::sse_encode( - self.into_iter().collect(), - serializer, - ); + match self { + crate::api::api::DeleteTarget::Chat(field0) => { + ::sse_encode(0, serializer); + ::sse_encode(field0, serializer); + } + crate::api::api::DeleteTarget::Messages(field0) => { + ::sse_encode(1, serializer); + >::sse_encode(field0, serializer); + } + _ => { + unimplemented!(""); + } + } } } -impl SseEncode for std::collections::HashMap> { +impl SseEncode for crate::api::api::DeviceInfo { // Codec=Sse (Serialization based), see doc to use other codecs fn sse_encode(self, serializer: &mut flutter_rust_bridge::for_generated::SseSerializer) { - )>>::sse_encode( - self.into_iter().collect(), - serializer, - ); + ::sse_encode(self.name, serializer); + ::sse_encode(self.serial, serializer); + ::sse_encode(self.os_version, serializer); + >>::sse_encode(self.encoded_data, serializer); } } -impl SseEncode for std::collections::HashMap> { +impl SseEncode for crate::api::api::EditMessage { // Codec=Sse (Serialization based), see doc to use other codecs fn sse_encode(self, serializer: &mut flutter_rust_bridge::for_generated::SseSerializer) { - )>>::sse_encode( - self.into_iter().collect(), - serializer, - ); + ::sse_encode(self.tuuid, serializer); + ::sse_encode(self.edit_part, serializer); + ::sse_encode(self.new_parts, serializer); } } -impl SseEncode for std::collections::HashMap { +impl SseEncode for crate::api::api::ErrorMessage { // Codec=Sse (Serialization based), see doc to use other codecs fn sse_encode(self, serializer: &mut flutter_rust_bridge::for_generated::SseSerializer) { - >::sse_encode( - self.into_iter().collect(), - serializer, - ); + ::sse_encode(self.for_uuid, serializer); + ::sse_encode(self.status, serializer); + ::sse_encode(self.status_str, serializer); } } -impl SseEncode for std::collections::HashMap, crate::api::api::Passkey)> { +impl SseEncode for crate::api::api::ExtensionApp { // Codec=Sse (Serialization based), see doc to use other codecs fn sse_encode(self, serializer: &mut flutter_rust_bridge::for_generated::SseSerializer) { - , crate::api::api::Passkey))>>::sse_encode( - self.into_iter().collect(), - serializer, - ); + ::sse_encode(self.name, serializer); + >::sse_encode(self.app_id, serializer); + ::sse_encode(self.bundle_id, serializer); + >::sse_encode(self.balloon, serializer); } } -impl SseEncode - for std::collections::HashMap, crate::api::api::PasswordManagerMeta)> -{ +impl SseEncode for f32 { // Codec=Sse (Serialization based), see doc to use other codecs fn sse_encode(self, serializer: &mut flutter_rust_bridge::for_generated::SseSerializer) { - , crate::api::api::PasswordManagerMeta), - )>>::sse_encode(self.into_iter().collect(), serializer); + serializer.cursor.write_f32::(self).unwrap(); } } -impl SseEncode - for std::collections::HashMap, crate::api::api::PasswordRawEntry)> -{ +impl SseEncode for f64 { // Codec=Sse (Serialization based), see doc to use other codecs fn sse_encode(self, serializer: &mut flutter_rust_bridge::for_generated::SseSerializer) { - , crate::api::api::PasswordRawEntry))>>::sse_encode( - self.into_iter().collect(), - serializer, - ); + serializer.cursor.write_f64::(self).unwrap(); } } -impl SseEncode - for std::collections::HashMap, crate::api::api::WifiPassword)> -{ +impl SseEncode for crate::api::api::FFIFilePackager { // Codec=Sse (Serialization based), see doc to use other codecs - fn sse_encode(self, serializer: &mut flutter_rust_bridge::for_generated::SseSerializer) { - , crate::api::api::WifiPassword))>>::sse_encode( - self.into_iter().collect(), - serializer, - ); - } + fn sse_encode(self, serializer: &mut flutter_rust_bridge::for_generated::SseSerializer) {} } -impl SseEncode for std::collections::HashMap { +impl SseEncode for crate::api::api::Follow { // Codec=Sse (Serialization based), see doc to use other codecs fn sse_encode(self, serializer: &mut flutter_rust_bridge::for_generated::SseSerializer) { - >::sse_encode( - self.into_iter().collect(), - serializer, - ); + ::sse_encode(self.create_timestamp, serializer); + ::sse_encode(self.expires, serializer); + ::sse_encode(self.id, serializer); + >::sse_encode(self.invitation_accepted_handles, serializer); + >::sse_encode(self.invitation_from_handles, serializer); + ::sse_encode(self.is_from_messages, serializer); + >::sse_encode(self.offer_id, serializer); + ::sse_encode(self.only_in_event, serializer); + ::sse_encode(self.person_id_hash, serializer); + ::sse_encode(self.secure_locations_capable, serializer); + ::sse_encode(self.shallow_or_live_secure_locations_capable, serializer); + ::sse_encode(self.source, serializer); + ::sse_encode(self.tk_permission, serializer); + ::sse_encode(self.update_timestamp, serializer); + >::sse_encode(self.fallback_to_legacy_allowed, serializer); + >::sse_encode(self.opted_not_to_share, serializer); + >::sse_encode(self.last_location, serializer); + ::sse_encode(self.locate_in_progress, serializer); } } -impl SseEncode for std::collections::HashMap { +impl SseEncode for crate::api::api::FoundDevice { // Codec=Sse (Serialization based), see doc to use other codecs fn sse_encode(self, serializer: &mut flutter_rust_bridge::for_generated::SseSerializer) { - >::sse_encode( - self.into_iter().collect(), - serializer, - ); + >::sse_encode(self.device_model, serializer); + >::sse_encode(self.low_power_mode, serializer); + >::sse_encode(self.passcode_length, serializer); + >::sse_encode(self.id, serializer); + >::sse_encode(self.battery_status, serializer); + >::sse_encode(self.lost_mode_capable, serializer); + >::sse_encode(self.battery_level, serializer); + >::sse_encode(self.location_enabled, serializer); + >::sse_encode(self.is_considered_accessory, serializer); + >::sse_encode(self.location, serializer); + >::sse_encode(self.model_display_name, serializer); + >::sse_encode(self.device_color, serializer); + >::sse_encode(self.activation_locked, serializer); + >::sse_encode(self.rm2_state, serializer); + >::sse_encode(self.loc_found_enabled, serializer); + >::sse_encode(self.nwd, serializer); + >::sse_encode(self.device_status, serializer); + >::sse_encode(self.fmly_share, serializer); + >::sse_encode(self.features, serializer); + >::sse_encode(self.this_device, serializer); + >::sse_encode(self.lost_mode_enabled, serializer); + >::sse_encode(self.device_display_name, serializer); + >::sse_encode(self.name, serializer); + >::sse_encode(self.can_wipe_after_lock, serializer); + >::sse_encode(self.is_mac, serializer); + >::sse_encode(self.raw_device_model, serializer); + >::sse_encode(self.ba_uuid, serializer); + >::sse_encode(self.device_discovery_id, serializer); + >::sse_encode(self.scd, serializer); + >::sse_encode(self.location_capable, serializer); + >::sse_encode(self.wipe_in_progress, serializer); + >::sse_encode(self.dark_wake, serializer); + >::sse_encode(self.device_with_you, serializer); + >::sse_encode(self.max_msg_char, serializer); + >::sse_encode(self.device_class, serializer); } } -impl SseEncode for std::collections::HashMap { +impl SseEncode for crate::api::api::FTMember { // Codec=Sse (Serialization based), see doc to use other codecs fn sse_encode(self, serializer: &mut flutter_rust_bridge::for_generated::SseSerializer) { - >::sse_encode( - self.into_iter().collect(), - serializer, - ); + >::sse_encode(self.nickname, serializer); + ::sse_encode(self.handle, serializer); } } -impl SseEncode - for RustOpaqueMoi> -{ +impl SseEncode for crate::api::api::FTMessage { // Codec=Sse (Serialization based), see doc to use other codecs fn sse_encode(self, serializer: &mut flutter_rust_bridge::for_generated::SseSerializer) { - let (ptr, size) = self.sse_encode_raw(); - ::sse_encode(ptr, serializer); - ::sse_encode(size, serializer); + match self { + crate::api::api::FTMessage::LetMeInRequest(field0) => { + ::sse_encode(0, serializer); + ::sse_encode(field0, serializer); + } + crate::api::api::FTMessage::LinkChanged { guid } => { + ::sse_encode(1, serializer); + ::sse_encode(guid, serializer); + } + crate::api::api::FTMessage::JoinEvent { + guid, + participant, + handle, + ring, + } => { + ::sse_encode(2, serializer); + ::sse_encode(guid, serializer); + ::sse_encode(participant, serializer); + ::sse_encode(handle, serializer); + ::sse_encode(ring, serializer); + } + crate::api::api::FTMessage::AddMembers { + guid, + members, + ring, + } => { + ::sse_encode(3, serializer); + ::sse_encode(guid, serializer); + >::sse_encode( + members, serializer, + ); + ::sse_encode(ring, serializer); + } + crate::api::api::FTMessage::RemoveMembers { guid, members } => { + ::sse_encode(4, serializer); + ::sse_encode(guid, serializer); + >::sse_encode( + members, serializer, + ); + } + crate::api::api::FTMessage::LeaveEvent { + guid, + participant, + handle, + } => { + ::sse_encode(5, serializer); + ::sse_encode(guid, serializer); + ::sse_encode(participant, serializer); + ::sse_encode(handle, serializer); + } + crate::api::api::FTMessage::Ring { guid } => { + ::sse_encode(6, serializer); + ::sse_encode(guid, serializer); + } + crate::api::api::FTMessage::Decline { guid } => { + ::sse_encode(7, serializer); + ::sse_encode(guid, serializer); + } + crate::api::api::FTMessage::RespondedElsewhere { guid } => { + ::sse_encode(8, serializer); + ::sse_encode(guid, serializer); + } + _ => { + unimplemented!(""); + } + } } } -impl SseEncode - for RustOpaqueMoi> -{ +impl SseEncode for crate::api::api::FTMode { // Codec=Sse (Serialization based), see doc to use other codecs fn sse_encode(self, serializer: &mut flutter_rust_bridge::for_generated::SseSerializer) { - let (ptr, size) = self.sse_encode_raw(); - ::sse_encode(ptr, serializer); - ::sse_encode(size, serializer); + ::sse_encode( + match self { + crate::api::api::FTMode::Outgoing => 0, + crate::api::api::FTMode::Incoming => 1, + crate::api::api::FTMode::Missed => 2, + crate::api::api::FTMode::MissedOutgoing => 3, + _ => { + unimplemented!(""); + } + }, + serializer, + ); } } -impl SseEncode - for RustOpaqueMoi> -{ +impl SseEncode for crate::api::api::FTParticipant { // Codec=Sse (Serialization based), see doc to use other codecs fn sse_encode(self, serializer: &mut flutter_rust_bridge::for_generated::SseSerializer) { - let (ptr, size) = self.sse_encode_raw(); - ::sse_encode(ptr, serializer); - ::sse_encode(size, serializer); + >::sse_encode(self.token, serializer); + ::sse_encode(self.handle, serializer); + ::sse_encode(self.participant_id, serializer); + >::sse_encode(self.last_join_date, serializer); + >::sse_encode(self.active, serializer); } } -impl SseEncode - for RustOpaqueMoi< - flutter_rust_bridge::for_generated::RustAutoOpaqueInner< - ArcAnisetteClient, - >, - > -{ +impl SseEncode for crate::api::api::FTSession { // Codec=Sse (Serialization based), see doc to use other codecs fn sse_encode(self, serializer: &mut flutter_rust_bridge::for_generated::SseSerializer) { - let (ptr, size) = self.sse_encode_raw(); - ::sse_encode(ptr, serializer); - ::sse_encode(size, serializer); + ::sse_encode(self.group_id, serializer); + >::sse_encode(self.my_handles, serializer); + >::sse_encode( + self.participants, + serializer, + ); + >::sse_encode(self.link, serializer); + >::sse_encode( + self.members, + serializer, + ); + ::sse_encode(self.report_id, serializer); + >::sse_encode(self.start_time, serializer); + >::sse_encode(self.last_rekey, serializer); + ::sse_encode(self.is_propped, serializer); + ::sse_encode(self.is_ringing_inaccurate, serializer); + >::sse_encode(self.mode, serializer); + >::sse_encode(self.recent_member_adds, serializer); } } -impl SseEncode - for RustOpaqueMoi< - flutter_rust_bridge::for_generated::RustAutoOpaqueInner< - Arc>, - >, - > -{ +impl SseEncode for crate::api::api::GroupSummary { // Codec=Sse (Serialization based), see doc to use other codecs fn sse_encode(self, serializer: &mut flutter_rust_bridge::for_generated::SseSerializer) { - let (ptr, size) = self.sse_encode_raw(); - ::sse_encode(ptr, serializer); - ::sse_encode(size, serializer); + ::sse_encode(self.display_name, serializer); + ::sse_encode(self.is_owner, serializer); + >::sse_encode(self.members, serializer); } } -impl SseEncode - for RustOpaqueMoi< - flutter_rust_bridge::for_generated::RustAutoOpaqueInner< - Arc>, - >, - > -{ +impl SseEncode for crate::api::api::GroupSummaryMember { + // Codec=Sse (Serialization based), see doc to use other codecs + fn sse_encode(self, serializer: &mut flutter_rust_bridge::for_generated::SseSerializer) { + >::sse_encode(self.name, serializer); + ::sse_encode(self.handle, serializer); + >::sse_encode(self.user_id, serializer); + ::sse_encode(self.is_joined, serializer); + } +} + +impl SseEncode for crate::api::api::HwExtra { // Codec=Sse (Serialization based), see doc to use other codecs fn sse_encode(self, serializer: &mut flutter_rust_bridge::for_generated::SseSerializer) { - let (ptr, size) = self.sse_encode_raw(); - ::sse_encode(ptr, serializer); - ::sse_encode(size, serializer); + ::sse_encode(self.version, serializer); + ::sse_encode(self.protocol_version, serializer); + ::sse_encode(self.device_id, serializer); + ::sse_encode(self.icloud_ua, serializer); + ::sse_encode(self.aoskit_version, serializer); } } -impl SseEncode - for RustOpaqueMoi>> -{ +impl SseEncode for i32 { // Codec=Sse (Serialization based), see doc to use other codecs fn sse_encode(self, serializer: &mut flutter_rust_bridge::for_generated::SseSerializer) { - let (ptr, size) = self.sse_encode_raw(); - ::sse_encode(ptr, serializer); - ::sse_encode(size, serializer); + serializer.cursor.write_i32::(self).unwrap(); } } -impl SseEncode - for RustOpaqueMoi< - flutter_rust_bridge::for_generated::RustAutoOpaqueInner< - Arc>, - >, - > -{ +impl SseEncode for i64 { // Codec=Sse (Serialization based), see doc to use other codecs fn sse_encode(self, serializer: &mut flutter_rust_bridge::for_generated::SseSerializer) { - let (ptr, size) = self.sse_encode_raw(); - ::sse_encode(ptr, serializer); - ::sse_encode(size, serializer); + serializer.cursor.write_i64::(self).unwrap(); } } -impl SseEncode - for RustOpaqueMoi>> -{ +impl SseEncode for crate::api::api::IMessageNameRecord { // Codec=Sse (Serialization based), see doc to use other codecs fn sse_encode(self, serializer: &mut flutter_rust_bridge::for_generated::SseSerializer) { - let (ptr, size) = self.sse_encode_raw(); - ::sse_encode(ptr, serializer); - ::sse_encode(size, serializer); + ::sse_encode(self.name, serializer); + ::sse_encode(self.first, serializer); + ::sse_encode(self.last, serializer); } } -impl SseEncode - for RustOpaqueMoi< - flutter_rust_bridge::for_generated::RustAutoOpaqueInner>, - > -{ +impl SseEncode for crate::api::api::IMessageNicknameRecord { // Codec=Sse (Serialization based), see doc to use other codecs fn sse_encode(self, serializer: &mut flutter_rust_bridge::for_generated::SseSerializer) { - let (ptr, size) = self.sse_encode_raw(); - ::sse_encode(ptr, serializer); - ::sse_encode(size, serializer); + ::sse_encode(self.name, serializer); + >>::sse_encode(self.image, serializer); + >::sse_encode(self.poster, serializer); } } -impl SseEncode - for RustOpaqueMoi< - flutter_rust_bridge::for_generated::RustAutoOpaqueInner< - Arc>, - >, - > -{ +impl SseEncode for crate::api::api::IMessagePosterRecord { // Codec=Sse (Serialization based), see doc to use other codecs fn sse_encode(self, serializer: &mut flutter_rust_bridge::for_generated::SseSerializer) { - let (ptr, size) = self.sse_encode_raw(); - ::sse_encode(ptr, serializer); - ::sse_encode(size, serializer); + >::sse_encode(self.low_res_poster, serializer); + >::sse_encode(self.package, serializer); + >::sse_encode(self.meta, serializer); } } -impl SseEncode - for RustOpaqueMoi< - flutter_rust_bridge::for_generated::RustAutoOpaqueInner< - Arc>>, - >, - > -{ +impl SseEncode for crate::api::api::IconChangeMessage { // Codec=Sse (Serialization based), see doc to use other codecs fn sse_encode(self, serializer: &mut flutter_rust_bridge::for_generated::SseSerializer) { - let (ptr, size) = self.sse_encode_raw(); - ::sse_encode(ptr, serializer); - ::sse_encode(size, serializer); + >::sse_encode(self.file, serializer); + ::sse_encode(self.group_version, serializer); } } -impl SseEncode - for RustOpaqueMoi< - flutter_rust_bridge::for_generated::RustAutoOpaqueInner< - Arc>>>, - >, - > -{ +impl SseEncode for crate::api::api::IdmsCircleMessage { // Codec=Sse (Serialization based), see doc to use other codecs fn sse_encode(self, serializer: &mut flutter_rust_bridge::for_generated::SseSerializer) { - let (ptr, size) = self.sse_encode_raw(); - ::sse_encode(ptr, serializer); - ::sse_encode(size, serializer); + ::sse_encode(self.step, serializer); + ::sse_encode(self.atxnid, serializer); + >::sse_encode(self.pake, serializer); + >::sse_encode(self.ec, serializer); + ::sse_encode(self.idmsdata, serializer); } } -impl SseEncode - for RustOpaqueMoi< - flutter_rust_bridge::for_generated::RustAutoOpaqueInner< - Arc>>, - >, - > -{ +impl SseEncode for crate::api::api::IdmsMessage { // Codec=Sse (Serialization based), see doc to use other codecs fn sse_encode(self, serializer: &mut flutter_rust_bridge::for_generated::SseSerializer) { - let (ptr, size) = self.sse_encode_raw(); - ::sse_encode(ptr, serializer); - ::sse_encode(size, serializer); + match self { + crate::api::api::IdmsMessage::RequestedSignIn(field0) => { + ::sse_encode(0, serializer); + ::sse_encode(field0, serializer); + } + crate::api::api::IdmsMessage::TeardownSignIn(field0) => { + ::sse_encode(1, serializer); + ::sse_encode(field0, serializer); + } + crate::api::api::IdmsMessage::CircleRequest(field0, field1) => { + ::sse_encode(2, serializer); + ::sse_encode(field0, serializer); + >::sse_encode(field1, serializer); + } + _ => { + unimplemented!(""); + } + } } } -impl SseEncode - for RustOpaqueMoi< - flutter_rust_bridge::for_generated::RustAutoOpaqueInner< - Arc>, - >, - > -{ +impl SseEncode for crate::api::api::IdmsRequestedSignIn { // Codec=Sse (Serialization based), see doc to use other codecs fn sse_encode(self, serializer: &mut flutter_rust_bridge::for_generated::SseSerializer) { - let (ptr, size) = self.sse_encode_raw(); - ::sse_encode(ptr, serializer); - ::sse_encode(size, serializer); + ::sse_encode(self.aps, serializer); + ::sse_encode(self.txnid, serializer); + ::sse_encode(self.akdata, serializer); + ::sse_encode(self.adsid, serializer); } } -impl SseEncode - for RustOpaqueMoi< - flutter_rust_bridge::for_generated::RustAutoOpaqueInner< - Arc>, - >, - > -{ +impl SseEncode for crate::api::api::IndexedMessagePart { // Codec=Sse (Serialization based), see doc to use other codecs fn sse_encode(self, serializer: &mut flutter_rust_bridge::for_generated::SseSerializer) { - let (ptr, size) = self.sse_encode_raw(); - ::sse_encode(ptr, serializer); - ::sse_encode(size, serializer); + ::sse_encode(self.part, serializer); + >::sse_encode(self.idx, serializer); + >::sse_encode(self.ext, serializer); } } -impl SseEncode - for RustOpaqueMoi< - flutter_rust_bridge::for_generated::RustAutoOpaqueInner>>, - > -{ +impl SseEncode for crate::api::api::LetMeInRequest { // Codec=Sse (Serialization based), see doc to use other codecs fn sse_encode(self, serializer: &mut flutter_rust_bridge::for_generated::SseSerializer) { - let (ptr, size) = self.sse_encode_raw(); - ::sse_encode(ptr, serializer); - ::sse_encode(size, serializer); + >::sse_encode(self.shared_secret, serializer); + ::sse_encode(self.pseud, serializer); + ::sse_encode(self.requestor, serializer); + >::sse_encode(self.nickname, serializer); + >::sse_encode(self.token, serializer); + >::sse_encode(self.delegation_uuid, serializer); + >::sse_encode(self.usage, serializer); } } -impl SseEncode - for RustOpaqueMoi>> -{ +impl SseEncode for crate::api::api::LinkMeta { // Codec=Sse (Serialization based), see doc to use other codecs fn sse_encode(self, serializer: &mut flutter_rust_bridge::for_generated::SseSerializer) { - let (ptr, size) = self.sse_encode_raw(); - ::sse_encode(ptr, serializer); - ::sse_encode(size, serializer); + ::sse_encode(self.data, serializer); + >>::sse_encode(self.attachments, serializer); } } -impl SseEncode - for RustOpaqueMoi< - flutter_rust_bridge::for_generated::RustAutoOpaqueInner< - Arc>, - >, - > -{ +impl SseEncode for Vec { // Codec=Sse (Serialization based), see doc to use other codecs fn sse_encode(self, serializer: &mut flutter_rust_bridge::for_generated::SseSerializer) { - let (ptr, size) = self.sse_encode_raw(); - ::sse_encode(ptr, serializer); - ::sse_encode(size, serializer); + ::sse_encode(self.len() as _, serializer); + for item in self { + ::sse_encode(item, serializer); + } } } -impl SseEncode - for RustOpaqueMoi< - flutter_rust_bridge::for_generated::RustAutoOpaqueInner< - Arc>, - >, - > -{ +impl SseEncode for Vec { // Codec=Sse (Serialization based), see doc to use other codecs fn sse_encode(self, serializer: &mut flutter_rust_bridge::for_generated::SseSerializer) { - let (ptr, size) = self.sse_encode_raw(); - ::sse_encode(ptr, serializer); - ::sse_encode(size, serializer); + ::sse_encode(self.len() as _, serializer); + for item in self { + ::sse_encode(item, serializer); + } } } -impl SseEncode for RustOpaqueMoi> { +impl SseEncode for Vec { // Codec=Sse (Serialization based), see doc to use other codecs fn sse_encode(self, serializer: &mut flutter_rust_bridge::for_generated::SseSerializer) { - let (ptr, size) = self.sse_encode_raw(); - ::sse_encode(ptr, serializer); - ::sse_encode(size, serializer); + ::sse_encode(self.len() as _, serializer); + for item in self { + ::sse_encode(item, serializer); + } } } -impl SseEncode - for RustOpaqueMoi> -{ +impl SseEncode for Vec { // Codec=Sse (Serialization based), see doc to use other codecs fn sse_encode(self, serializer: &mut flutter_rust_bridge::for_generated::SseSerializer) { - let (ptr, size) = self.sse_encode_raw(); - ::sse_encode(ptr, serializer); - ::sse_encode(size, serializer); + ::sse_encode(self.len() as _, serializer); + for item in self { + ::sse_encode(item, serializer); + } } } -impl SseEncode - for RustOpaqueMoi< - flutter_rust_bridge::for_generated::RustAutoOpaqueInner< - CircleClientSession, - >, - > -{ +impl SseEncode for Vec { // Codec=Sse (Serialization based), see doc to use other codecs fn sse_encode(self, serializer: &mut flutter_rust_bridge::for_generated::SseSerializer) { - let (ptr, size) = self.sse_encode_raw(); - ::sse_encode(ptr, serializer); - ::sse_encode(size, serializer); + ::sse_encode(self.len() as _, serializer); + for item in self { + ::sse_encode(item, serializer); + } } } -impl SseEncode - for RustOpaqueMoi> -{ +impl SseEncode for Vec { // Codec=Sse (Serialization based), see doc to use other codecs fn sse_encode(self, serializer: &mut flutter_rust_bridge::for_generated::SseSerializer) { - let (ptr, size) = self.sse_encode_raw(); - ::sse_encode(ptr, serializer); - ::sse_encode(size, serializer); + ::sse_encode(self.len() as _, serializer); + for item in self { + ::sse_encode(item, serializer); + } } } -impl SseEncode - for RustOpaqueMoi< - flutter_rust_bridge::for_generated::RustAutoOpaqueInner, - > -{ +impl SseEncode for Vec { // Codec=Sse (Serialization based), see doc to use other codecs fn sse_encode(self, serializer: &mut flutter_rust_bridge::for_generated::SseSerializer) { - let (ptr, size) = self.sse_encode_raw(); - ::sse_encode(ptr, serializer); - ::sse_encode(size, serializer); + ::sse_encode(self.len() as _, serializer); + for item in self { + ::sse_encode(item, serializer); + } } } -impl SseEncode for RustOpaqueMoi> { +impl SseEncode for Vec { // Codec=Sse (Serialization based), see doc to use other codecs fn sse_encode(self, serializer: &mut flutter_rust_bridge::for_generated::SseSerializer) { - let (ptr, size) = self.sse_encode_raw(); - ::sse_encode(ptr, serializer); - ::sse_encode(size, serializer); + ::sse_encode(self.len() as _, serializer); + for item in self { + ::sse_encode(item, serializer); + } } } -impl SseEncode - for RustOpaqueMoi> -{ +impl SseEncode for Vec { // Codec=Sse (Serialization based), see doc to use other codecs fn sse_encode(self, serializer: &mut flutter_rust_bridge::for_generated::SseSerializer) { - let (ptr, size) = self.sse_encode_raw(); - ::sse_encode(ptr, serializer); - ::sse_encode(size, serializer); + ::sse_encode(self.len() as _, serializer); + for item in self { + ::sse_encode(item, serializer); + } } } -impl SseEncode - for RustOpaqueMoi< - flutter_rust_bridge::for_generated::RustAutoOpaqueInner< - FindMyFriendsClient, - >, - > -{ +impl SseEncode for Vec { // Codec=Sse (Serialization based), see doc to use other codecs fn sse_encode(self, serializer: &mut flutter_rust_bridge::for_generated::SseSerializer) { - let (ptr, size) = self.sse_encode_raw(); - ::sse_encode(ptr, serializer); - ::sse_encode(size, serializer); + ::sse_encode(self.len() as _, serializer); + for item in self { + ::sse_encode(item, serializer); + } } } -impl SseEncode - for RustOpaqueMoi< - flutter_rust_bridge::for_generated::RustAutoOpaqueInner< - FindMyPhoneClient, - >, - > -{ +impl SseEncode for Vec { // Codec=Sse (Serialization based), see doc to use other codecs fn sse_encode(self, serializer: &mut flutter_rust_bridge::for_generated::SseSerializer) { - let (ptr, size) = self.sse_encode_raw(); - ::sse_encode(ptr, serializer); - ::sse_encode(size, serializer); + ::sse_encode(self.len() as _, serializer); + for item in self { + ::sse_encode(item, serializer); + } } } -impl SseEncode - for RustOpaqueMoi< - flutter_rust_bridge::for_generated::RustAutoOpaqueInner>, - > -{ +impl SseEncode for Vec { // Codec=Sse (Serialization based), see doc to use other codecs fn sse_encode(self, serializer: &mut flutter_rust_bridge::for_generated::SseSerializer) { - let (ptr, size) = self.sse_encode_raw(); - ::sse_encode(ptr, serializer); - ::sse_encode(size, serializer); + ::sse_encode(self.len() as _, serializer); + for item in self { + ::sse_encode(item, serializer); + } } } -impl SseEncode - for RustOpaqueMoi< - flutter_rust_bridge::for_generated::RustAutoOpaqueInner>, - > -{ +impl SseEncode for Vec { // Codec=Sse (Serialization based), see doc to use other codecs fn sse_encode(self, serializer: &mut flutter_rust_bridge::for_generated::SseSerializer) { - let (ptr, size) = self.sse_encode_raw(); - ::sse_encode(ptr, serializer); - ::sse_encode(size, serializer); + ::sse_encode(self.len() as _, serializer); + for item in self { + ::sse_encode(item, serializer); + } } } -impl SseEncode - for RustOpaqueMoi< - flutter_rust_bridge::for_generated::RustAutoOpaqueInner>, - > -{ +impl SseEncode for Vec { // Codec=Sse (Serialization based), see doc to use other codecs fn sse_encode(self, serializer: &mut flutter_rust_bridge::for_generated::SseSerializer) { - let (ptr, size) = self.sse_encode_raw(); - ::sse_encode(ptr, serializer); - ::sse_encode(size, serializer); + ::sse_encode(self.len() as _, serializer); + for item in self { + ::sse_encode(item, serializer); + } } } -impl SseEncode - for RustOpaqueMoi< - flutter_rust_bridge::for_generated::RustAutoOpaqueInner>, - > -{ +impl SseEncode for Vec { // Codec=Sse (Serialization based), see doc to use other codecs fn sse_encode(self, serializer: &mut flutter_rust_bridge::for_generated::SseSerializer) { - let (ptr, size) = self.sse_encode_raw(); - ::sse_encode(ptr, serializer); - ::sse_encode(size, serializer); + ::sse_encode(self.len() as _, serializer); + for item in self { + ::sse_encode(item, serializer); + } } } -impl SseEncode - for RustOpaqueMoi< - flutter_rust_bridge::for_generated::RustAutoOpaqueInner>, - > -{ +impl SseEncode for Vec { // Codec=Sse (Serialization based), see doc to use other codecs fn sse_encode(self, serializer: &mut flutter_rust_bridge::for_generated::SseSerializer) { - let (ptr, size) = self.sse_encode_raw(); - ::sse_encode(ptr, serializer); - ::sse_encode(size, serializer); + ::sse_encode(self.len() as _, serializer); + for item in self { + ::sse_encode(item, serializer); + } } } -impl SseEncode - for RustOpaqueMoi< - flutter_rust_bridge::for_generated::RustAutoOpaqueInner>, - > -{ +impl SseEncode for Vec { // Codec=Sse (Serialization based), see doc to use other codecs fn sse_encode(self, serializer: &mut flutter_rust_bridge::for_generated::SseSerializer) { - let (ptr, size) = self.sse_encode_raw(); - ::sse_encode(ptr, serializer); - ::sse_encode(size, serializer); + ::sse_encode(self.len() as _, serializer); + for item in self { + ::sse_encode(item, serializer); + } } } -impl SseEncode - for RustOpaqueMoi> -{ +impl SseEncode for Vec { // Codec=Sse (Serialization based), see doc to use other codecs fn sse_encode(self, serializer: &mut flutter_rust_bridge::for_generated::SseSerializer) { - let (ptr, size) = self.sse_encode_raw(); - ::sse_encode(ptr, serializer); - ::sse_encode(size, serializer); + ::sse_encode(self.len() as _, serializer); + for item in self { + ::sse_encode(item, serializer); + } } } -impl SseEncode for RustOpaqueMoi> { +impl SseEncode for Vec { // Codec=Sse (Serialization based), see doc to use other codecs fn sse_encode(self, serializer: &mut flutter_rust_bridge::for_generated::SseSerializer) { - let (ptr, size) = self.sse_encode_raw(); - ::sse_encode(ptr, serializer); - ::sse_encode(size, serializer); + ::sse_encode(self.len() as _, serializer); + for item in self { + ::sse_encode(item, serializer); + } } } -impl SseEncode - for RustOpaqueMoi> -{ +impl SseEncode for Vec { // Codec=Sse (Serialization based), see doc to use other codecs fn sse_encode(self, serializer: &mut flutter_rust_bridge::for_generated::SseSerializer) { - let (ptr, size) = self.sse_encode_raw(); - ::sse_encode(ptr, serializer); - ::sse_encode(size, serializer); + ::sse_encode(self.len() as _, serializer); + for item in self { + ::sse_encode(item, serializer); + } } } -impl SseEncode - for RustOpaqueMoi> -{ +impl SseEncode for Vec> { // Codec=Sse (Serialization based), see doc to use other codecs fn sse_encode(self, serializer: &mut flutter_rust_bridge::for_generated::SseSerializer) { - let (ptr, size) = self.sse_encode_raw(); - ::sse_encode(ptr, serializer); - ::sse_encode(size, serializer); + ::sse_encode(self.len() as _, serializer); + for item in self { + >::sse_encode(item, serializer); + } } } -impl SseEncode - for RustOpaqueMoi> -{ +impl SseEncode for Vec { // Codec=Sse (Serialization based), see doc to use other codecs fn sse_encode(self, serializer: &mut flutter_rust_bridge::for_generated::SseSerializer) { - let (ptr, size) = self.sse_encode_raw(); - ::sse_encode(ptr, serializer); - ::sse_encode(size, serializer); + ::sse_encode(self.len() as _, serializer); + for item in self { + ::sse_encode(item, serializer); + } } } -impl SseEncode - for RustOpaqueMoi< - flutter_rust_bridge::for_generated::RustAutoOpaqueInner>, - > -{ +impl SseEncode for Vec { // Codec=Sse (Serialization based), see doc to use other codecs fn sse_encode(self, serializer: &mut flutter_rust_bridge::for_generated::SseSerializer) { - let (ptr, size) = self.sse_encode_raw(); - ::sse_encode(ptr, serializer); - ::sse_encode(size, serializer); + ::sse_encode(self.len() as _, serializer); + for item in self { + ::sse_encode(item, serializer); + } } } -impl SseEncode - for RustOpaqueMoi< - flutter_rust_bridge::for_generated::RustAutoOpaqueInner>, - > -{ +impl SseEncode for Vec { // Codec=Sse (Serialization based), see doc to use other codecs fn sse_encode(self, serializer: &mut flutter_rust_bridge::for_generated::SseSerializer) { - let (ptr, size) = self.sse_encode_raw(); - ::sse_encode(ptr, serializer); - ::sse_encode(size, serializer); + ::sse_encode(self.len() as _, serializer); + for item in self { + ::sse_encode(item, serializer); + } } } -impl SseEncode - for RustOpaqueMoi> -{ +impl SseEncode for Vec { // Codec=Sse (Serialization based), see doc to use other codecs fn sse_encode(self, serializer: &mut flutter_rust_bridge::for_generated::SseSerializer) { - let (ptr, size) = self.sse_encode_raw(); - ::sse_encode(ptr, serializer); - ::sse_encode(size, serializer); + ::sse_encode(self.len() as _, serializer); + for item in self { + ::sse_encode(item, serializer); + } } } -impl SseEncode - for RustOpaqueMoi>> -{ +impl SseEncode for Vec { // Codec=Sse (Serialization based), see doc to use other codecs fn sse_encode(self, serializer: &mut flutter_rust_bridge::for_generated::SseSerializer) { - let (ptr, size) = self.sse_encode_raw(); - ::sse_encode(ptr, serializer); - ::sse_encode(size, serializer); + ::sse_encode(self.len() as _, serializer); + for item in self { + ::sse_encode(item, serializer); + } } } -impl SseEncode - for RustOpaqueMoi> -{ +impl SseEncode for Vec { // Codec=Sse (Serialization based), see doc to use other codecs fn sse_encode(self, serializer: &mut flutter_rust_bridge::for_generated::SseSerializer) { - let (ptr, size) = self.sse_encode_raw(); - ::sse_encode(ptr, serializer); - ::sse_encode(size, serializer); + ::sse_encode(self.len() as _, serializer); + for item in self { + ::sse_encode(item, serializer); + } } } -impl SseEncode - for RustOpaqueMoi>> -{ +impl SseEncode for Vec { // Codec=Sse (Serialization based), see doc to use other codecs fn sse_encode(self, serializer: &mut flutter_rust_bridge::for_generated::SseSerializer) { - let (ptr, size) = self.sse_encode_raw(); - ::sse_encode(ptr, serializer); - ::sse_encode(size, serializer); + ::sse_encode(self.len() as _, serializer); + for item in self { + ::sse_encode(item, serializer); + } } } -impl SseEncode - for RustOpaqueMoi> -{ +impl SseEncode for Vec { // Codec=Sse (Serialization based), see doc to use other codecs - fn sse_encode(self, serializer: &mut flutter_rust_bridge::for_generated::SseSerializer) { - let (ptr, size) = self.sse_encode_raw(); - ::sse_encode(ptr, serializer); - ::sse_encode(size, serializer); + fn sse_encode(self, serializer: &mut flutter_rust_bridge::for_generated::SseSerializer) { + ::sse_encode(self.len() as _, serializer); + for item in self { + ::sse_encode(item, serializer); + } } } -impl SseEncode - for RustOpaqueMoi< - flutter_rust_bridge::for_generated::RustAutoOpaqueInner< - SyncManager, - >, - > -{ +impl SseEncode for Vec { // Codec=Sse (Serialization based), see doc to use other codecs fn sse_encode(self, serializer: &mut flutter_rust_bridge::for_generated::SseSerializer) { - let (ptr, size) = self.sse_encode_raw(); - ::sse_encode(ptr, serializer); - ::sse_encode(size, serializer); + ::sse_encode(self.len() as _, serializer); + for item in self { + ::sse_encode(item, serializer); + } } } -impl SseEncode - for RustOpaqueMoi> -{ +impl SseEncode for Vec { // Codec=Sse (Serialization based), see doc to use other codecs fn sse_encode(self, serializer: &mut flutter_rust_bridge::for_generated::SseSerializer) { - let (ptr, size) = self.sse_encode_raw(); - ::sse_encode(ptr, serializer); - ::sse_encode(size, serializer); + ::sse_encode(self.len() as _, serializer); + for item in self { + ::sse_encode(item, serializer); + } } } -impl SseEncode - for RustOpaqueMoi> -{ +impl SseEncode for Vec { // Codec=Sse (Serialization based), see doc to use other codecs fn sse_encode(self, serializer: &mut flutter_rust_bridge::for_generated::SseSerializer) { - let (ptr, size) = self.sse_encode_raw(); - ::sse_encode(ptr, serializer); - ::sse_encode(size, serializer); + ::sse_encode(self.len() as _, serializer); + for item in self { + ::sse_encode(item, serializer); + } } } -impl SseEncode - for RustOpaqueMoi> -{ +impl SseEncode for Vec { // Codec=Sse (Serialization based), see doc to use other codecs fn sse_encode(self, serializer: &mut flutter_rust_bridge::for_generated::SseSerializer) { - let (ptr, size) = self.sse_encode_raw(); - ::sse_encode(ptr, serializer); - ::sse_encode(size, serializer); + ::sse_encode(self.len() as _, serializer); + for item in self { + ::sse_encode(item, serializer); + } } } -impl SseEncode for std::collections::HashSet { +impl SseEncode for Vec<(String, Asset)> { // Codec=Sse (Serialization based), see doc to use other codecs fn sse_encode(self, serializer: &mut flutter_rust_bridge::for_generated::SseSerializer) { - >::sse_encode(self.into_iter().collect(), serializer); + ::sse_encode(self.len() as _, serializer); + for item in self { + <(String, Asset)>::sse_encode(item, serializer); + } } } -impl SseEncode - for StreamSink< - crate::api::api::MMCSTransferProgress, - flutter_rust_bridge::for_generated::SseCodec, - > -{ +impl SseEncode for Vec<(String, StCollapsedValue)> { // Codec=Sse (Serialization based), see doc to use other codecs fn sse_encode(self, serializer: &mut flutter_rust_bridge::for_generated::SseSerializer) { - unimplemented!("") + ::sse_encode(self.len() as _, serializer); + for item in self { + <(String, StCollapsedValue)>::sse_encode(item, serializer); + } } } -impl SseEncode - for StreamSink -{ +impl SseEncode for Vec<(String, bool)> { // Codec=Sse (Serialization based), see doc to use other codecs fn sse_encode(self, serializer: &mut flutter_rust_bridge::for_generated::SseSerializer) { - unimplemented!("") + ::sse_encode(self.len() as _, serializer); + for item in self { + <(String, bool)>::sse_encode(item, serializer); + } } } -impl SseEncode for String { +impl SseEncode for Vec<(String, u64)> { // Codec=Sse (Serialization based), see doc to use other codecs fn sse_encode(self, serializer: &mut flutter_rust_bridge::for_generated::SseSerializer) { - >::sse_encode(self.into_bytes(), serializer); + ::sse_encode(self.len() as _, serializer); + for item in self { + <(String, u64)>::sse_encode(item, serializer); + } } } -impl SseEncode for crate::api::api::Address { +impl SseEncode for Vec<(String, crate::api::api::CloudAttachment)> { // Codec=Sse (Serialization based), see doc to use other codecs fn sse_encode(self, serializer: &mut flutter_rust_bridge::for_generated::SseSerializer) { - >::sse_encode(self.administrative_area, serializer); - ::sse_encode(self.country, serializer); - ::sse_encode(self.country_code, serializer); - >>::sse_encode(self.formatted_address_lines, serializer); - >::sse_encode(self.locality, serializer); - >::sse_encode(self.state_code, serializer); - >::sse_encode(self.street_address, serializer); - >::sse_encode(self.street_name, serializer); + ::sse_encode(self.len() as _, serializer); + for item in self { + <(String, crate::api::api::CloudAttachment)>::sse_encode(item, serializer); + } } } -impl SseEncode for crate::api::api::AkData { +impl SseEncode for Vec<(String, crate::api::api::CloudChat)> { // Codec=Sse (Serialization based), see doc to use other codecs fn sse_encode(self, serializer: &mut flutter_rust_bridge::for_generated::SseSerializer) { - ::sse_encode(self.lat, serializer); - ::sse_encode(self.lng, serializer); + ::sse_encode(self.len() as _, serializer); + for item in self { + <(String, crate::api::api::CloudChat)>::sse_encode(item, serializer); + } } } -impl SseEncode for crate::api::api::ApsAlert { +impl SseEncode for Vec<(String, crate::api::api::CloudMessage)> { // Codec=Sse (Serialization based), see doc to use other codecs fn sse_encode(self, serializer: &mut flutter_rust_bridge::for_generated::SseSerializer) { - ::sse_encode(self.title, serializer); - ::sse_encode(self.body, serializer); - ::sse_encode(self.sbdy, serializer); - ::sse_encode(self.defbtn, serializer); - ::sse_encode(self.albtn, serializer); + ::sse_encode(self.len() as _, serializer); + for item in self { + <(String, crate::api::api::CloudMessage)>::sse_encode(item, serializer); + } } } -impl SseEncode for crate::api::api::ApsData { +impl SseEncode for Vec<(String, crate::api::api::FTParticipant)> { // Codec=Sse (Serialization based), see doc to use other codecs fn sse_encode(self, serializer: &mut flutter_rust_bridge::for_generated::SseSerializer) { - ::sse_encode(self.alert, serializer); + ::sse_encode(self.len() as _, serializer); + for item in self { + <(String, crate::api::api::FTParticipant)>::sse_encode(item, serializer); + } } } -impl SseEncode for crate::api::api::Attachment { +impl SseEncode for Vec<(String, crate::api::api::GroupSummary)> { // Codec=Sse (Serialization based), see doc to use other codecs fn sse_encode(self, serializer: &mut flutter_rust_bridge::for_generated::SseSerializer) { - ::sse_encode(self.a_type, serializer); - ::sse_encode(self.part, serializer); - ::sse_encode(self.uti_type, serializer); - ::sse_encode(self.mime, serializer); - ::sse_encode(self.name, serializer); - ::sse_encode(self.iris, serializer); + ::sse_encode(self.len() as _, serializer); + for item in self { + <(String, crate::api::api::GroupSummary)>::sse_encode(item, serializer); + } } } -impl SseEncode for crate::api::api::AttachmentMeta { +impl SseEncode for Vec<(String, Vec)> { // Codec=Sse (Serialization based), see doc to use other codecs fn sse_encode(self, serializer: &mut flutter_rust_bridge::for_generated::SseSerializer) { - >::sse_encode(self.mime_type, serializer); - ::sse_encode(self.start_date, serializer); - ::sse_encode(self.total_bytes, serializer); - ::sse_encode(self.transfer_state, serializer); - ::sse_encode(self.is_sticker, serializer); - ::sse_encode(self.guid, serializer); - ::sse_encode(self.hide_attachment, serializer); - >::sse_encode(self.user_info, serializer); - >::sse_encode(self.filename, serializer); - >::sse_encode(self.extras, serializer); - ::sse_encode(self.is_outgoing, serializer); - >::sse_encode(self.transfer_name, serializer); - ::sse_encode(self.version, serializer); - >::sse_encode(self.uti, serializer); - ::sse_encode(self.created_date, serializer); - >::sse_encode(self.pathc, serializer); - >::sse_encode(self.md5, serializer); + ::sse_encode(self.len() as _, serializer); + for item in self { + <(String, Vec)>::sse_encode(item, serializer); + } } } -impl SseEncode for crate::api::api::AttachmentMetaExtra { +impl SseEncode for Vec<(String, Vec)> { // Codec=Sse (Serialization based), see doc to use other codecs fn sse_encode(self, serializer: &mut flutter_rust_bridge::for_generated::SseSerializer) { - >::sse_encode( - self.preview_generation_state, - serializer, - ); + ::sse_encode(self.len() as _, serializer); + for item in self { + <(String, Vec)>::sse_encode(item, serializer); + } } } -impl SseEncode for crate::api::api::AttachmentType { +impl SseEncode for Vec<(String, crate::api::api::MessageEditRange)> { // Codec=Sse (Serialization based), see doc to use other codecs fn sse_encode(self, serializer: &mut flutter_rust_bridge::for_generated::SseSerializer) { - match self { - crate::api::api::AttachmentType::Inline(field0) => { - ::sse_encode(0, serializer); - >::sse_encode(field0, serializer); - } - crate::api::api::AttachmentType::MMCS(field0) => { - ::sse_encode(1, serializer); - ::sse_encode(field0, serializer); - } - _ => { - unimplemented!(""); - } + ::sse_encode(self.len() as _, serializer); + for item in self { + <(String, crate::api::api::MessageEditRange)>::sse_encode(item, serializer); } } } -impl SseEncode for crate::api::api::Balloon { +impl SseEncode for Vec<(String, Option)> { // Codec=Sse (Serialization based), see doc to use other codecs fn sse_encode(self, serializer: &mut flutter_rust_bridge::for_generated::SseSerializer) { - ::sse_encode(self.url, serializer); - >::sse_encode(self.session, serializer); - >::sse_encode(self.layout, serializer); - >::sse_encode(self.ld_text, serializer); - ::sse_encode(self.is_live, serializer); - >>::sse_encode(self.icon, serializer); + ::sse_encode(self.len() as _, serializer); + for item in self { + <(String, Option)>::sse_encode(item, serializer); + } } } -impl SseEncode for crate::api::api::BalloonLayout { +impl SseEncode for Vec<(String, Option)> { // Codec=Sse (Serialization based), see doc to use other codecs fn sse_encode(self, serializer: &mut flutter_rust_bridge::for_generated::SseSerializer) { - match self { - crate::api::api::BalloonLayout::TemplateLayout { - image_subtitle, - image_title, - caption, - secondary_subcaption, - tertiary_subcaption, - subcaption, - class, - } => { - ::sse_encode(0, serializer); - ::sse_encode(image_subtitle, serializer); - ::sse_encode(image_title, serializer); - ::sse_encode(caption, serializer); - ::sse_encode(secondary_subcaption, serializer); - ::sse_encode(tertiary_subcaption, serializer); - ::sse_encode(subcaption, serializer); - ::sse_encode(class, serializer); - } - _ => { - unimplemented!(""); - } + ::sse_encode(self.len() as _, serializer); + for item in self { + <(String, Option)>::sse_encode(item, serializer); } } } -impl SseEncode for crate::api::api::BeaconAttributes { +impl SseEncode for Vec<(String, Option)> { // Codec=Sse (Serialization based), see doc to use other codecs fn sse_encode(self, serializer: &mut flutter_rust_bridge::for_generated::SseSerializer) { - ::sse_encode(self.name, serializer); - ::sse_encode(self.role_id, serializer); - ::sse_encode(self.emoji, serializer); - ::sse_encode(self.system_version, serializer); - ::sse_encode(self.serial_number, serializer); + ::sse_encode(self.len() as _, serializer); + for item in self { + <(String, Option)>::sse_encode(item, serializer); + } } } -impl SseEncode for crate::api::api::BeaconNamingRecord { +impl SseEncode for Vec<(String, crate::api::api::PasswordManagerMetaDataCtx)> { // Codec=Sse (Serialization based), see doc to use other codecs fn sse_encode(self, serializer: &mut flutter_rust_bridge::for_generated::SseSerializer) { - ::sse_encode(self.emoji, serializer); - ::sse_encode(self.name, serializer); - ::sse_encode(self.associated_beacon, serializer); - ::sse_encode(self.role_id, serializer); + ::sse_encode(self.len() as _, serializer); + for item in self { + <(String, crate::api::api::PasswordManagerMetaDataCtx)>::sse_encode(item, serializer); + } } } -impl SseEncode for bool { +impl SseEncode for Vec<(String, (Option, crate::api::api::Passkey))> { // Codec=Sse (Serialization based), see doc to use other codecs fn sse_encode(self, serializer: &mut flutter_rust_bridge::for_generated::SseSerializer) { - serializer.cursor.write_u8(self as _).unwrap(); + ::sse_encode(self.len() as _, serializer); + for item in self { + <(String, (Option, crate::api::api::Passkey))>::sse_encode(item, serializer); + } } } -impl SseEncode for crate::api::api::CertifiedContext { +impl SseEncode + for Vec<( + String, + (Option, crate::api::api::PasswordManagerMeta), + )> +{ // Codec=Sse (Serialization based), see doc to use other codecs fn sse_encode(self, serializer: &mut flutter_rust_bridge::for_generated::SseSerializer) { - ::sse_encode(self.version, serializer); - >::sse_encode(self.receipt, serializer); - ::sse_encode(self.sender, serializer); - ::sse_encode(self.target, serializer); - >::sse_encode(self.uuid, serializer); - >::sse_encode(self.token, serializer); + ::sse_encode(self.len() as _, serializer); + for item in self { + <( + String, + (Option, crate::api::api::PasswordManagerMeta), + )>::sse_encode(item, serializer); + } } } -impl SseEncode for crate::api::api::ChangeParticipantMessage { +impl SseEncode for Vec<(String, (Option, crate::api::api::PasswordRawEntry))> { // Codec=Sse (Serialization based), see doc to use other codecs fn sse_encode(self, serializer: &mut flutter_rust_bridge::for_generated::SseSerializer) { - >::sse_encode(self.new_participants, serializer); - ::sse_encode(self.group_version, serializer); + ::sse_encode(self.len() as _, serializer); + for item in self { + <(String, (Option, crate::api::api::PasswordRawEntry))>::sse_encode( + item, serializer, + ); + } } } -impl SseEncode for crate::api::api::ChatProto { +impl SseEncode for Vec<(String, (Option, crate::api::api::WifiPassword))> { // Codec=Sse (Serialization based), see doc to use other codecs fn sse_encode(self, serializer: &mut flutter_rust_bridge::for_generated::SseSerializer) { - >::sse_encode(self.unk1, serializer); + ::sse_encode(self.len() as _, serializer); + for item in self { + <(String, (Option, crate::api::api::WifiPassword))>::sse_encode( + item, serializer, + ); + } } } -impl SseEncode for crate::api::api::CloudAttachment { +impl SseEncode for Vec<(String, crate::api::api::ShareInviteContentData)> { // Codec=Sse (Serialization based), see doc to use other codecs fn sse_encode(self, serializer: &mut flutter_rust_bridge::for_generated::SseSerializer) { - >::sse_encode(self.cm, serializer); - ::sse_encode(self.lqa, serializer); + ::sse_encode(self.len() as _, serializer); + for item in self { + <(String, crate::api::api::ShareInviteContentData)>::sse_encode(item, serializer); + } } } -impl SseEncode for crate::api::api::CloudChat { +impl SseEncode for Vec<(String, crate::api::api::StatusKitPersonalConfig)> { // Codec=Sse (Serialization based), see doc to use other codecs fn sse_encode(self, serializer: &mut flutter_rust_bridge::for_generated::SseSerializer) { - ::sse_encode(self.style, serializer); - ::sse_encode(self.is_filtered, serializer); - ::sse_encode(self.successful_query, serializer); - ::sse_encode(self.state, serializer); - ::sse_encode(self.chat_identifier, serializer); - ::sse_encode(self.group_id, serializer); - ::sse_encode(self.service_name, serializer); - ::sse_encode(self.original_group_id, serializer); - >::sse_encode(self.properties, serializer); - >::sse_encode(self.participants, serializer); - ::sse_encode(self.prop001, serializer); - ::sse_encode(self.last_read_message_timestamp, serializer); - ::sse_encode(self.last_addressed_handle, serializer); - ::sse_encode(self.guid, serializer); - >::sse_encode(self.display_name, serializer); - >>::sse_encode(self.proto001, serializer); - >::sse_encode(self.group_photo_guid, serializer); - >::sse_encode(self.group_photo, serializer); + ::sse_encode(self.len() as _, serializer); + for item in self { + <(String, crate::api::api::StatusKitPersonalConfig)>::sse_encode(item, serializer); + } } } -impl SseEncode for crate::api::api::CloudMessage { +impl SseEncode for Vec<(String, String)> { // Codec=Sse (Serialization based), see doc to use other codecs fn sse_encode(self, serializer: &mut flutter_rust_bridge::for_generated::SseSerializer) { - >::sse_encode(self.utm, serializer); - ::sse_encode(self.r#type, serializer); - ::sse_encode(self.error, serializer); - ::sse_encode(self.chat_id, serializer); - ::sse_encode(self.sender, serializer); - ::sse_encode(self.time, serializer); - >>::sse_encode(self.msg_proto_2, serializer); - ::sse_encode(self.destination_caller_id, serializer); - >::sse_encode(self.msg_proto, serializer); - ::sse_encode(self.flags, serializer); - ::sse_encode(self.guid, serializer); - >>::sse_encode(self.msg_proto_3, serializer); - ::sse_encode(self.service, serializer); - >>::sse_encode(self.msg_proto_4, serializer); + ::sse_encode(self.len() as _, serializer); + for item in self { + <(String, String)>::sse_encode(item, serializer); + } } } -impl SseEncode for crate::api::api::CloudMessageSummary { +impl SseEncode for Vec<(String, crate::api::api::SyncStatus)> { // Codec=Sse (Serialization based), see doc to use other codecs fn sse_encode(self, serializer: &mut flutter_rust_bridge::for_generated::SseSerializer) { - >::sse_encode(self.messages_summary, serializer); - >::sse_encode(self.chat_summary, serializer); - >::sse_encode(self.attachment_summary, serializer); + ::sse_encode(self.len() as _, serializer); + for item in self { + <(String, crate::api::api::SyncStatus)>::sse_encode(item, serializer); + } } } -impl SseEncode for crate::api::api::CloudParticipant { +impl SseEncode for Vec<(u32, crate::api::api::NSDictionaryTypedCoder)> { // Codec=Sse (Serialization based), see doc to use other codecs fn sse_encode(self, serializer: &mut flutter_rust_bridge::for_generated::SseSerializer) { - ::sse_encode(self.uri, serializer); + ::sse_encode(self.len() as _, serializer); + for item in self { + <(u32, crate::api::api::NSDictionaryTypedCoder)>::sse_encode(item, serializer); + } } } -impl SseEncode for crate::api::api::CloudProp { +impl SseEncode for Vec { // Codec=Sse (Serialization based), see doc to use other codecs fn sse_encode(self, serializer: &mut flutter_rust_bridge::for_generated::SseSerializer) { - >::sse_encode(self.gpufc, serializer); - >::sse_encode(self.pv, serializer); - >::sse_encode(self.number_of_times_respondedto_thread, serializer); - >::sse_encode(self.should_force_to_sms, serializer); - >::sse_encode(self.last_seen_message_guid, serializer); - >::sse_encode(self.message_handshake_state, serializer); - >::sse_encode(self.legacy_group_identifiers, serializer); - >::sse_encode(self.group_photo_guid, serializer); - >::sse_encode(self.last_modification_date, serializer); + ::sse_encode(self.len() as _, serializer); + for item in self { + ::sse_encode(item, serializer); + } } } -impl SseEncode for crate::api::api::CloudProp001 { +impl SseEncode for Vec { // Codec=Sse (Serialization based), see doc to use other codecs fn sse_encode(self, serializer: &mut flutter_rust_bridge::for_generated::SseSerializer) { - ::sse_encode(self.syndication_type, serializer); + ::sse_encode(self.len() as _, serializer); + for item in self { + ::sse_encode(item, serializer); + } } } -impl SseEncode for crate::api::api::ConversationData { +impl SseEncode for Vec { // Codec=Sse (Serialization based), see doc to use other codecs fn sse_encode(self, serializer: &mut flutter_rust_bridge::for_generated::SseSerializer) { - >::sse_encode(self.participants, serializer); - >::sse_encode(self.cv_name, serializer); - >::sse_encode(self.sender_guid, serializer); - >::sse_encode(self.after_guid, serializer); + ::sse_encode(self.len() as _, serializer); + for item in self { + ::sse_encode(item, serializer); + } } } -impl SseEncode for crate::api::api::DartBeacon { +impl SseEncode for Vec { // Codec=Sse (Serialization based), see doc to use other codecs fn sse_encode(self, serializer: &mut flutter_rust_bridge::for_generated::SseSerializer) { - ::sse_encode(self.naming, serializer); - >::sse_encode(self.last_report, serializer); - ::sse_encode(self.product_id, serializer); - >::sse_encode(self.battery_level, serializer); - ::sse_encode(self.vendor_id, serializer); - ::sse_encode(self.model, serializer); - ::sse_encode(self.system_version, serializer); - ::sse_encode(self.id, serializer); - >::sse_encode(self.shared, serializer); + ::sse_encode(self.len() as _, serializer); + for item in self { + ::sse_encode(item, serializer); + } } } -impl SseEncode for crate::api::api::DartBeaconShareInfo { +impl SseEncode for crate::api::api::Location { // Codec=Sse (Serialization based), see doc to use other codecs fn sse_encode(self, serializer: &mut flutter_rust_bridge::for_generated::SseSerializer) { - ::sse_encode(self.share_id, serializer); - ::sse_encode(self.acceptance_state, serializer); - ::sse_encode(self.owner_handle, serializer); + >::sse_encode(self.address, serializer); + ::sse_encode(self.altitude, serializer); + ::sse_encode(self.floor_level, serializer); + ::sse_encode(self.horizontal_accuracy, serializer); + ::sse_encode(self.is_inaccurate, serializer); + ::sse_encode(self.latitude, serializer); + >::sse_encode(self.location_id, serializer); + >::sse_encode(self.location_timestamp, serializer); + ::sse_encode(self.longitude, serializer); + ::sse_encode(self.secure_location_ts, serializer); + ::sse_encode(self.timestamp, serializer); + ::sse_encode(self.vertical_accuracy, serializer); + >::sse_encode(self.position_type, serializer); + >::sse_encode(self.is_old, serializer); + >::sse_encode(self.location_finished, serializer); } } -impl SseEncode for crate::api::api::DeleteTarget { +impl SseEncode for crate::api::api::LoginState { // Codec=Sse (Serialization based), see doc to use other codecs fn sse_encode(self, serializer: &mut flutter_rust_bridge::for_generated::SseSerializer) { match self { - crate::api::api::DeleteTarget::Chat(field0) => { + crate::api::api::LoginState::LoggedIn => { ::sse_encode(0, serializer); - ::sse_encode(field0, serializer); } - crate::api::api::DeleteTarget::Messages(field0) => { + crate::api::api::LoginState::NeedsDevice2FA => { ::sse_encode(1, serializer); - >::sse_encode(field0, serializer); + } + crate::api::api::LoginState::Needs2FAVerification => { + ::sse_encode(2, serializer); + } + crate::api::api::LoginState::NeedsSMS2FA => { + ::sse_encode(3, serializer); + } + crate::api::api::LoginState::NeedsSMS2FAVerification(field0) => { + ::sse_encode(4, serializer); + ::sse_encode(field0, serializer); + } + crate::api::api::LoginState::NeedsExtraStep(field0) => { + ::sse_encode(5, serializer); + ::sse_encode(field0, serializer); + } + crate::api::api::LoginState::NeedsLogin => { + ::sse_encode(6, serializer); } _ => { unimplemented!(""); @@ -30338,200 +36968,244 @@ impl SseEncode for crate::api::api::DeleteTarget { } } -impl SseEncode for crate::api::api::DeviceInfo { +impl SseEncode for crate::api::api::LPIconMetadata { // Codec=Sse (Serialization based), see doc to use other codecs fn sse_encode(self, serializer: &mut flutter_rust_bridge::for_generated::SseSerializer) { - ::sse_encode(self.name, serializer); - ::sse_encode(self.serial, serializer); - ::sse_encode(self.os_version, serializer); - >>::sse_encode(self.encoded_data, serializer); + ::sse_encode(self.url, serializer); + ::sse_encode(self.version, serializer); } } -impl SseEncode for crate::api::api::EditMessage { +impl SseEncode for crate::api::api::LPImageMetadata { // Codec=Sse (Serialization based), see doc to use other codecs fn sse_encode(self, serializer: &mut flutter_rust_bridge::for_generated::SseSerializer) { - ::sse_encode(self.tuuid, serializer); - ::sse_encode(self.edit_part, serializer); - ::sse_encode(self.new_parts, serializer); + ::sse_encode(self.size, serializer); + ::sse_encode(self.url, serializer); + ::sse_encode(self.version, serializer); } } -impl SseEncode for crate::api::api::ErrorMessage { +impl SseEncode for crate::api::api::LPLinkMetadata { // Codec=Sse (Serialization based), see doc to use other codecs fn sse_encode(self, serializer: &mut flutter_rust_bridge::for_generated::SseSerializer) { - ::sse_encode(self.for_uuid, serializer); - ::sse_encode(self.status, serializer); - ::sse_encode(self.status_str, serializer); + >::sse_encode(self.image_metadata, serializer); + ::sse_encode(self.version, serializer); + >::sse_encode(self.icon_metadata, serializer); + >::sse_encode(self.original_url, serializer); + >::sse_encode(self.url, serializer); + >::sse_encode(self.title, serializer); + >::sse_encode(self.summary, serializer); + >::sse_encode( + self.image, serializer, + ); + >::sse_encode( + self.icon, serializer, + ); + >>::sse_encode(self.images, serializer); + >>::sse_encode(self.icons, serializer); + >::sse_encode(self.is_incomplete, serializer); + >::sse_encode(self.uses_activity_pub, serializer); + >::sse_encode(self.is_encoded_for_local_use, serializer); + >::sse_encode(self.collaboration_type, serializer); + >::sse_encode( + self.specialization2, + serializer, + ); } } -impl SseEncode for crate::api::api::ExtensionApp { +impl SseEncode for crate::api::api::LPSpecializationMetadata { // Codec=Sse (Serialization based), see doc to use other codecs fn sse_encode(self, serializer: &mut flutter_rust_bridge::for_generated::SseSerializer) { - ::sse_encode(self.name, serializer); - >::sse_encode(self.app_id, serializer); - ::sse_encode(self.bundle_id, serializer); - >::sse_encode(self.balloon, serializer); + match self { + crate::api::api::LPSpecializationMetadata::LPPasswordsInviteMetadata { + group_name, + url_parameters, + } => { + ::sse_encode(0, serializer); + ::sse_encode(group_name, serializer); + ::sse_encode(url_parameters, serializer); + } + _ => { + unimplemented!(""); + } + } } } -impl SseEncode for f32 { +impl SseEncode for crate::api::api::MemojiData { // Codec=Sse (Serialization based), see doc to use other codecs fn sse_encode(self, serializer: &mut flutter_rust_bridge::for_generated::SseSerializer) { - serializer.cursor.write_f32::(self).unwrap(); + ::sse_encode(self.background_color_description, serializer); + >::sse_encode(self.avatar_record_data, serializer); + >::sse_encode(self.avatar_pose_data, serializer); + ::sse_encode(self.has_body, serializer); + >::sse_encode(self.avatar_image_data, serializer); } } -impl SseEncode for f64 { +impl SseEncode for crate::api::api::Message { // Codec=Sse (Serialization based), see doc to use other codecs fn sse_encode(self, serializer: &mut flutter_rust_bridge::for_generated::SseSerializer) { - serializer.cursor.write_f64::(self).unwrap(); + match self { + crate::api::api::Message::Message(field0) => { + ::sse_encode(0, serializer); + ::sse_encode(field0, serializer); + } + crate::api::api::Message::RenameMessage(field0) => { + ::sse_encode(1, serializer); + ::sse_encode(field0, serializer); + } + crate::api::api::Message::ChangeParticipants(field0) => { + ::sse_encode(2, serializer); + ::sse_encode(field0, serializer); + } + crate::api::api::Message::React(field0) => { + ::sse_encode(3, serializer); + ::sse_encode(field0, serializer); + } + crate::api::api::Message::Delivered => { + ::sse_encode(4, serializer); + } + crate::api::api::Message::Read => { + ::sse_encode(5, serializer); + } + crate::api::api::Message::Typing(field0, field1) => { + ::sse_encode(6, serializer); + ::sse_encode(field0, serializer); + >::sse_encode(field1, serializer); + } + crate::api::api::Message::Unsend(field0) => { + ::sse_encode(7, serializer); + ::sse_encode(field0, serializer); + } + crate::api::api::Message::Edit(field0) => { + ::sse_encode(8, serializer); + ::sse_encode(field0, serializer); + } + crate::api::api::Message::IconChange(field0) => { + ::sse_encode(9, serializer); + ::sse_encode(field0, serializer); + } + crate::api::api::Message::EnableSmsActivation(field0) => { + ::sse_encode(10, serializer); + ::sse_encode(field0, serializer); + } + crate::api::api::Message::MessageReadOnDevice => { + ::sse_encode(11, serializer); + } + crate::api::api::Message::SmsConfirmSent(field0) => { + ::sse_encode(12, serializer); + ::sse_encode(field0, serializer); + } + crate::api::api::Message::MarkUnread => { + ::sse_encode(13, serializer); + } + crate::api::api::Message::PeerCacheInvalidate => { + ::sse_encode(14, serializer); + } + crate::api::api::Message::UpdateExtension(field0) => { + ::sse_encode(15, serializer); + ::sse_encode(field0, serializer); + } + crate::api::api::Message::Error(field0) => { + ::sse_encode(16, serializer); + ::sse_encode(field0, serializer); + } + crate::api::api::Message::MoveToRecycleBin(field0) => { + ::sse_encode(17, serializer); + ::sse_encode(field0, serializer); + } + crate::api::api::Message::RecoverChat(field0) => { + ::sse_encode(18, serializer); + ::sse_encode(field0, serializer); + } + crate::api::api::Message::PermanentDelete(field0) => { + ::sse_encode(19, serializer); + ::sse_encode(field0, serializer); + } + crate::api::api::Message::Unschedule => { + ::sse_encode(20, serializer); + } + crate::api::api::Message::UpdateProfile(field0) => { + ::sse_encode(21, serializer); + ::sse_encode(field0, serializer); + } + crate::api::api::Message::UpdateProfileSharing(field0) => { + ::sse_encode(22, serializer); + ::sse_encode(field0, serializer); + } + crate::api::api::Message::ShareProfile(field0) => { + ::sse_encode(23, serializer); + ::sse_encode(field0, serializer); + } + crate::api::api::Message::NotifyAnyways => { + ::sse_encode(24, serializer); + } + crate::api::api::Message::SetTranscriptBackground(field0) => { + ::sse_encode(25, serializer); + ::sse_encode(field0, serializer); + } + _ => { + unimplemented!(""); + } + } } } -impl SseEncode for crate::api::api::FFIFilePackager { - // Codec=Sse (Serialization based), see doc to use other codecs - fn sse_encode(self, serializer: &mut flutter_rust_bridge::for_generated::SseSerializer) {} -} - -impl SseEncode for crate::api::api::Follow { +impl SseEncode for crate::api::api::MessageEdit { // Codec=Sse (Serialization based), see doc to use other codecs fn sse_encode(self, serializer: &mut flutter_rust_bridge::for_generated::SseSerializer) { - ::sse_encode(self.create_timestamp, serializer); - ::sse_encode(self.expires, serializer); - ::sse_encode(self.id, serializer); - >::sse_encode(self.invitation_accepted_handles, serializer); - >::sse_encode(self.invitation_from_handles, serializer); - ::sse_encode(self.is_from_messages, serializer); - >::sse_encode(self.offer_id, serializer); - ::sse_encode(self.only_in_event, serializer); - ::sse_encode(self.person_id_hash, serializer); - ::sse_encode(self.secure_locations_capable, serializer); - ::sse_encode(self.shallow_or_live_secure_locations_capable, serializer); - ::sse_encode(self.source, serializer); - ::sse_encode(self.tk_permission, serializer); - ::sse_encode(self.update_timestamp, serializer); - >::sse_encode(self.fallback_to_legacy_allowed, serializer); - >::sse_encode(self.opted_not_to_share, serializer); - >::sse_encode(self.last_location, serializer); - ::sse_encode(self.locate_in_progress, serializer); + >::sse_encode(self.t, serializer); + ::sse_encode(self.d, serializer); + >::sse_encode(self.bcg, serializer); } } -impl SseEncode for crate::api::api::FoundDevice { +impl SseEncode for crate::api::api::MessageEditRange { // Codec=Sse (Serialization based), see doc to use other codecs fn sse_encode(self, serializer: &mut flutter_rust_bridge::for_generated::SseSerializer) { - >::sse_encode(self.device_model, serializer); - >::sse_encode(self.low_power_mode, serializer); - >::sse_encode(self.passcode_length, serializer); - >::sse_encode(self.id, serializer); - >::sse_encode(self.battery_status, serializer); - >::sse_encode(self.lost_mode_capable, serializer); - >::sse_encode(self.battery_level, serializer); - >::sse_encode(self.location_enabled, serializer); - >::sse_encode(self.is_considered_accessory, serializer); - >::sse_encode(self.location, serializer); - >::sse_encode(self.model_display_name, serializer); - >::sse_encode(self.device_color, serializer); - >::sse_encode(self.activation_locked, serializer); - >::sse_encode(self.rm2_state, serializer); - >::sse_encode(self.loc_found_enabled, serializer); - >::sse_encode(self.nwd, serializer); - >::sse_encode(self.device_status, serializer); - >::sse_encode(self.fmly_share, serializer); - >::sse_encode(self.features, serializer); - >::sse_encode(self.this_device, serializer); - >::sse_encode(self.lost_mode_enabled, serializer); - >::sse_encode(self.device_display_name, serializer); - >::sse_encode(self.name, serializer); - >::sse_encode(self.can_wipe_after_lock, serializer); - >::sse_encode(self.is_mac, serializer); - >::sse_encode(self.raw_device_model, serializer); - >::sse_encode(self.ba_uuid, serializer); - >::sse_encode(self.device_discovery_id, serializer); - >::sse_encode(self.scd, serializer); - >::sse_encode(self.location_capable, serializer); - >::sse_encode(self.wipe_in_progress, serializer); - >::sse_encode(self.dark_wake, serializer); - >::sse_encode(self.device_with_you, serializer); - >::sse_encode(self.max_msg_char, serializer); - >::sse_encode(self.device_class, serializer); + ::sse_encode(self.lo, serializer); + ::sse_encode(self.le, serializer); } } -impl SseEncode for crate::api::api::FTMember { +impl SseEncode for crate::api::api::MessageInst { // Codec=Sse (Serialization based), see doc to use other codecs fn sse_encode(self, serializer: &mut flutter_rust_bridge::for_generated::SseSerializer) { - >::sse_encode(self.nickname, serializer); - ::sse_encode(self.handle, serializer); + ::sse_encode(self.id, serializer); + >::sse_encode(self.sender, serializer); + >::sse_encode(self.conversation, serializer); + ::sse_encode(self.message, serializer); + ::sse_encode(self.sent_timestamp, serializer); + >>::sse_encode(self.target, serializer); + ::sse_encode(self.send_delivered, serializer); + ::sse_encode(self.verification_failed, serializer); + >::sse_encode(self.certified_context, serializer); } } -impl SseEncode for crate::api::api::FTMessage { +impl SseEncode for crate::api::api::MessagePart { // Codec=Sse (Serialization based), see doc to use other codecs fn sse_encode(self, serializer: &mut flutter_rust_bridge::for_generated::SseSerializer) { match self { - crate::api::api::FTMessage::LetMeInRequest(field0) => { + crate::api::api::MessagePart::Text(field0, field1) => { ::sse_encode(0, serializer); - ::sse_encode(field0, serializer); + ::sse_encode(field0, serializer); + ::sse_encode(field1, serializer); } - crate::api::api::FTMessage::LinkChanged { guid } => { + crate::api::api::MessagePart::Attachment(field0) => { ::sse_encode(1, serializer); - ::sse_encode(guid, serializer); + ::sse_encode(field0, serializer); } - crate::api::api::FTMessage::JoinEvent { - guid, - participant, - handle, - ring, - } => { + crate::api::api::MessagePart::Mention(field0, field1) => { ::sse_encode(2, serializer); - ::sse_encode(guid, serializer); - ::sse_encode(participant, serializer); - ::sse_encode(handle, serializer); - ::sse_encode(ring, serializer); + ::sse_encode(field0, serializer); + ::sse_encode(field1, serializer); } - crate::api::api::FTMessage::AddMembers { - guid, - members, - ring, - } => { + crate::api::api::MessagePart::Object(field0) => { ::sse_encode(3, serializer); - ::sse_encode(guid, serializer); - >::sse_encode( - members, serializer, - ); - ::sse_encode(ring, serializer); - } - crate::api::api::FTMessage::RemoveMembers { guid, members } => { - ::sse_encode(4, serializer); - ::sse_encode(guid, serializer); - >::sse_encode( - members, serializer, - ); - } - crate::api::api::FTMessage::LeaveEvent { - guid, - participant, - handle, - } => { - ::sse_encode(5, serializer); - ::sse_encode(guid, serializer); - ::sse_encode(participant, serializer); - ::sse_encode(handle, serializer); - } - crate::api::api::FTMessage::Ring { guid } => { - ::sse_encode(6, serializer); - ::sse_encode(guid, serializer); - } - crate::api::api::FTMessage::Decline { guid } => { - ::sse_encode(7, serializer); - ::sse_encode(guid, serializer); - } - crate::api::api::FTMessage::RespondedElsewhere { guid } => { - ::sse_encode(8, serializer); - ::sse_encode(guid, serializer); + ::sse_encode(field0, serializer); } _ => { unimplemented!(""); @@ -30540,2212 +37214,2417 @@ impl SseEncode for crate::api::api::FTMessage { } } -impl SseEncode for crate::api::api::FTMode { +impl SseEncode for crate::api::api::MessageParts { // Codec=Sse (Serialization based), see doc to use other codecs fn sse_encode(self, serializer: &mut flutter_rust_bridge::for_generated::SseSerializer) { - ::sse_encode( - match self { - crate::api::api::FTMode::Outgoing => 0, - crate::api::api::FTMode::Incoming => 1, - crate::api::api::FTMode::Missed => 2, - crate::api::api::FTMode::MissedOutgoing => 3, - _ => { - unimplemented!(""); - } - }, - serializer, - ); + >::sse_encode(self.0, serializer); } } -impl SseEncode for crate::api::api::FTParticipant { +impl SseEncode for crate::api::api::MessageProto { // Codec=Sse (Serialization based), see doc to use other codecs fn sse_encode(self, serializer: &mut flutter_rust_bridge::for_generated::SseSerializer) { - >::sse_encode(self.token, serializer); - ::sse_encode(self.handle, serializer); - ::sse_encode(self.participant_id, serializer); - >::sse_encode(self.last_join_date, serializer); - >::sse_encode(self.active, serializer); + ::sse_encode(self.unk1, serializer); + >::sse_encode(self.subject, serializer); + >::sse_encode(self.text, serializer); + >>::sse_encode(self.attributed_body, serializer); + >::sse_encode(self.balloon_bundle_id, serializer); + >>::sse_encode(self.payload_data, serializer); + >>::sse_encode(self.message_summary_info, serializer); + >::sse_encode(self.effect, serializer); + >::sse_encode(self.date_read, serializer); + >::sse_encode(self.unk10, serializer); + >::sse_encode(self.unk11, serializer); + >::sse_encode(self.date_delivered, serializer); + >::sse_encode(self.unk14, serializer); + >::sse_encode(self.associated_message_type, serializer); + >::sse_encode(self.associated_message_guid, serializer); + >::sse_encode(self.associated_message_range_location, serializer); + >::sse_encode(self.associated_message_range_length, serializer); } } -impl SseEncode for crate::api::api::FTSession { +impl SseEncode for crate::api::api::MessageProto2 { // Codec=Sse (Serialization based), see doc to use other codecs fn sse_encode(self, serializer: &mut flutter_rust_bridge::for_generated::SseSerializer) { - ::sse_encode(self.group_id, serializer); - >::sse_encode(self.my_handles, serializer); - >::sse_encode( - self.participants, - serializer, - ); - >::sse_encode(self.link, serializer); - >::sse_encode( - self.members, - serializer, - ); - ::sse_encode(self.report_id, serializer); - >::sse_encode(self.start_time, serializer); - >::sse_encode(self.last_rekey, serializer); - ::sse_encode(self.is_propped, serializer); - ::sse_encode(self.is_ringing_inaccurate, serializer); - >::sse_encode(self.mode, serializer); - >::sse_encode(self.recent_member_adds, serializer); + >::sse_encode(self.reply, serializer); } } -impl SseEncode for crate::api::api::GroupSummary { +impl SseEncode for crate::api::api::MessageProto3 { // Codec=Sse (Serialization based), see doc to use other codecs fn sse_encode(self, serializer: &mut flutter_rust_bridge::for_generated::SseSerializer) { - ::sse_encode(self.display_name, serializer); - ::sse_encode(self.is_owner, serializer); - >::sse_encode(self.members, serializer); + >::sse_encode(self.unk2, serializer); + >::sse_encode(self.unk3, serializer); } } -impl SseEncode for crate::api::api::GroupSummaryMember { +impl SseEncode for crate::api::api::MessageProto4 { // Codec=Sse (Serialization based), see doc to use other codecs fn sse_encode(self, serializer: &mut flutter_rust_bridge::for_generated::SseSerializer) { - >::sse_encode(self.name, serializer); - ::sse_encode(self.handle, serializer); - >::sse_encode(self.user_id, serializer); - ::sse_encode(self.is_joined, serializer); + >::sse_encode(self.associated_message_emoji, serializer); + >::sse_encode(self.service, serializer); + >::sse_encode(self.schedule_type, serializer); + >::sse_encode(self.schedule_state, serializer); + >::sse_encode(self.group_id, serializer); + >::sse_encode(self.sent_or_received_off_grid, serializer); } } -impl SseEncode for crate::api::api::HwExtra { +impl SseEncode for crate::api::api::MessageSummaryInfo { // Codec=Sse (Serialization based), see doc to use other codecs fn sse_encode(self, serializer: &mut flutter_rust_bridge::for_generated::SseSerializer) { - ::sse_encode(self.version, serializer); - ::sse_encode(self.protocol_version, serializer); - ::sse_encode(self.device_id, serializer); - ::sse_encode(self.icloud_ua, serializer); - ::sse_encode(self.aoskit_version, serializer); + >::sse_encode(self.ams, serializer); + >>::sse_encode(self.ampt, serializer); + >::sse_encode(self.amc, serializer); + >::sse_encode(self.amb, serializer); + >::sse_encode(self.amd, serializer); + >>::sse_encode( + self.ec, serializer, + ); + >::sse_encode(self.ep, serializer); + >::sse_encode( + self.otr, serializer, + ); + >::sse_encode(self.ust, serializer); + >::sse_encode(self.rp, serializer); + >::sse_encode(self.hbr, serializer); + >::sse_encode(self.oui, serializer); + >::sse_encode(self.osn, serializer); + >::sse_encode(self.euh, serializer); } } -impl SseEncode for i32 { +impl SseEncode for crate::api::api::MessageTarget { // Codec=Sse (Serialization based), see doc to use other codecs fn sse_encode(self, serializer: &mut flutter_rust_bridge::for_generated::SseSerializer) { - serializer.cursor.write_i32::(self).unwrap(); + match self { + crate::api::api::MessageTarget::Token(field0) => { + ::sse_encode(0, serializer); + >::sse_encode(field0, serializer); + } + crate::api::api::MessageTarget::Uuid(field0) => { + ::sse_encode(1, serializer); + ::sse_encode(field0, serializer); + } + _ => { + unimplemented!(""); + } + } } } -impl SseEncode for i64 { +impl SseEncode for crate::api::api::MessageType { // Codec=Sse (Serialization based), see doc to use other codecs fn sse_encode(self, serializer: &mut flutter_rust_bridge::for_generated::SseSerializer) { - serializer.cursor.write_i64::(self).unwrap(); + match self { + crate::api::api::MessageType::IMessage => { + ::sse_encode(0, serializer); + } + crate::api::api::MessageType::SMS { + is_phone, + using_number, + from_handle, + } => { + ::sse_encode(1, serializer); + ::sse_encode(is_phone, serializer); + ::sse_encode(using_number, serializer); + >::sse_encode(from_handle, serializer); + } + _ => { + unimplemented!(""); + } + } } } -impl SseEncode for crate::api::api::IMessageNameRecord { +impl SseEncode for crate::api::api::MMCSAttachmentMeta { // Codec=Sse (Serialization based), see doc to use other codecs fn sse_encode(self, serializer: &mut flutter_rust_bridge::for_generated::SseSerializer) { - ::sse_encode(self.name, serializer); - ::sse_encode(self.first, serializer); - ::sse_encode(self.last, serializer); + >::sse_encode(self.mmcs_signature_hex, serializer); + >::sse_encode(self.mmcs_owner, serializer); + >::sse_encode(self.mmcs_url, serializer); + >::sse_encode(self.decryption_key, serializer); + >::sse_encode(self.inline_attachment, serializer); + >::sse_encode(self.message_part, serializer); + >::sse_encode(self.file_size, serializer); + >::sse_encode(self.uti_type, serializer); + >::sse_encode(self.mime_type, serializer); + >::sse_encode(self.name, serializer); } } -impl SseEncode for crate::api::api::IMessageNicknameRecord { +impl SseEncode for crate::api::api::MMCSFile { // Codec=Sse (Serialization based), see doc to use other codecs fn sse_encode(self, serializer: &mut flutter_rust_bridge::for_generated::SseSerializer) { - ::sse_encode(self.name, serializer); - >>::sse_encode(self.image, serializer); - >::sse_encode(self.poster, serializer); + >::sse_encode(self.signature, serializer); + ::sse_encode(self.object, serializer); + ::sse_encode(self.url, serializer); + >::sse_encode(self.key, serializer); + ::sse_encode(self.size, serializer); } } -impl SseEncode for crate::api::api::IMessagePosterRecord { +impl SseEncode for crate::api::api::MMCSTransferProgress { // Codec=Sse (Serialization based), see doc to use other codecs fn sse_encode(self, serializer: &mut flutter_rust_bridge::for_generated::SseSerializer) { - >::sse_encode(self.low_res_poster, serializer); - >::sse_encode(self.package, serializer); - >::sse_encode(self.meta, serializer); + ::sse_encode(self.prog, serializer); + ::sse_encode(self.total, serializer); + >::sse_encode(self.file, serializer); } } -impl SseEncode for crate::api::api::IconChangeMessage { +impl SseEncode for crate::api::api::MonogramData { // Codec=Sse (Serialization based), see doc to use other codecs fn sse_encode(self, serializer: &mut flutter_rust_bridge::for_generated::SseSerializer) { - >::sse_encode(self.file, serializer); - ::sse_encode(self.group_version, serializer); + ::sse_encode( + self.top_background_color_description, + serializer, + ); + ::sse_encode(self.background_color_description, serializer); + ::sse_encode(self.initials, serializer); + ::sse_encode(self.monogram_supported_for_name, serializer); } } -impl SseEncode for crate::api::api::IdmsCircleMessage { +impl SseEncode for crate::api::api::MoveToRecycleBinMessage { // Codec=Sse (Serialization based), see doc to use other codecs fn sse_encode(self, serializer: &mut flutter_rust_bridge::for_generated::SseSerializer) { - ::sse_encode(self.step, serializer); - ::sse_encode(self.atxnid, serializer); - >::sse_encode(self.pake, serializer); - >::sse_encode(self.ec, serializer); - ::sse_encode(self.idmsdata, serializer); + ::sse_encode(self.target, serializer); + ::sse_encode(self.recoverable_delete_date, serializer); } } -impl SseEncode for crate::api::api::IdmsMessage { +impl SseEncode for crate::api::api::MyAsyncRuntime { // Codec=Sse (Serialization based), see doc to use other codecs - fn sse_encode(self, serializer: &mut flutter_rust_bridge::for_generated::SseSerializer) { - match self { - crate::api::api::IdmsMessage::RequestedSignIn(field0) => { - ::sse_encode(0, serializer); - ::sse_encode(field0, serializer); - } - crate::api::api::IdmsMessage::TeardownSignIn(field0) => { - ::sse_encode(1, serializer); - ::sse_encode(field0, serializer); - } - crate::api::api::IdmsMessage::CircleRequest(field0, field1) => { - ::sse_encode(2, serializer); - ::sse_encode(field0, serializer); - >::sse_encode(field1, serializer); - } - _ => { - unimplemented!(""); - } - } - } + fn sse_encode(self, serializer: &mut flutter_rust_bridge::for_generated::SseSerializer) {} } -impl SseEncode for crate::api::api::IdmsRequestedSignIn { +impl SseEncode for crate::api::api::NormalMessage { // Codec=Sse (Serialization based), see doc to use other codecs fn sse_encode(self, serializer: &mut flutter_rust_bridge::for_generated::SseSerializer) { - ::sse_encode(self.aps, serializer); - ::sse_encode(self.txnid, serializer); - ::sse_encode(self.akdata, serializer); - ::sse_encode(self.adsid, serializer); + ::sse_encode(self.parts, serializer); + >::sse_encode(self.effect, serializer); + >::sse_encode(self.reply_guid, serializer); + >::sse_encode(self.reply_part, serializer); + ::sse_encode(self.service, serializer); + >::sse_encode(self.subject, serializer); + >::sse_encode(self.app, serializer); + >::sse_encode(self.link_meta, serializer); + ::sse_encode(self.voice, serializer); + >::sse_encode(self.scheduled, serializer); + >::sse_encode( + self.embedded_profile, + serializer, + ); } } -impl SseEncode for crate::api::api::IndexedMessagePart { +impl SseEncode for crate::api::api::NSAttributedString { // Codec=Sse (Serialization based), see doc to use other codecs fn sse_encode(self, serializer: &mut flutter_rust_bridge::for_generated::SseSerializer) { - ::sse_encode(self.part, serializer); - >::sse_encode(self.idx, serializer); - >::sse_encode(self.ext, serializer); + ::sse_encode(self.text, serializer); + >::sse_encode(self.ranges, serializer); } } -impl SseEncode for crate::api::api::LetMeInRequest { +impl SseEncode for crate::api::api::NSDictionaryClass { // Codec=Sse (Serialization based), see doc to use other codecs fn sse_encode(self, serializer: &mut flutter_rust_bridge::for_generated::SseSerializer) { - >::sse_encode(self.shared_secret, serializer); - ::sse_encode(self.pseud, serializer); - ::sse_encode(self.requestor, serializer); - >::sse_encode(self.nickname, serializer); - >::sse_encode(self.token, serializer); - >::sse_encode(self.delegation_uuid, serializer); - >::sse_encode(self.usage, serializer); + ::sse_encode( + match self { + crate::api::api::NSDictionaryClass::NSDictionary => 0, + crate::api::api::NSDictionaryClass::NSMutableDictionary => 1, + _ => { + unimplemented!(""); + } + }, + serializer, + ); } } -impl SseEncode for crate::api::api::LinkMeta { +impl SseEncode for crate::api::api::NSDictionaryTypedCoder { // Codec=Sse (Serialization based), see doc to use other codecs fn sse_encode(self, serializer: &mut flutter_rust_bridge::for_generated::SseSerializer) { - ::sse_encode(self.data, serializer); - >>::sse_encode(self.attachments, serializer); + >::sse_encode(self.0, serializer); } } -impl SseEncode for Vec { +impl SseEncode for crate::api::api::NSNumber { // Codec=Sse (Serialization based), see doc to use other codecs fn sse_encode(self, serializer: &mut flutter_rust_bridge::for_generated::SseSerializer) { - ::sse_encode(self.len() as _, serializer); - for item in self { - ::sse_encode(item, serializer); - } + ::sse_encode(self.0, serializer); } } -impl SseEncode for Vec { +impl SseEncode for crate::api::api::NSString { // Codec=Sse (Serialization based), see doc to use other codecs fn sse_encode(self, serializer: &mut flutter_rust_bridge::for_generated::SseSerializer) { - ::sse_encode(self.len() as _, serializer); - for item in self { - ::sse_encode(item, serializer); - } + ::sse_encode(self.0, serializer); } } -impl SseEncode for Vec { +impl SseEncode for crate::api::api::NSURL { // Codec=Sse (Serialization based), see doc to use other codecs fn sse_encode(self, serializer: &mut flutter_rust_bridge::for_generated::SseSerializer) { - ::sse_encode(self.len() as _, serializer); - for item in self { - ::sse_encode(item, serializer); - } + ::sse_encode(self.base, serializer); + ::sse_encode(self.relative, serializer); } } -impl SseEncode for Vec { +impl SseEncode for crate::api::api::NumOrString { // Codec=Sse (Serialization based), see doc to use other codecs fn sse_encode(self, serializer: &mut flutter_rust_bridge::for_generated::SseSerializer) { - ::sse_encode(self.len() as _, serializer); - for item in self { - ::sse_encode(item, serializer); + match self { + crate::api::api::NumOrString::Num(field0) => { + ::sse_encode(0, serializer); + ::sse_encode(field0, serializer); + } + crate::api::api::NumOrString::String(field0) => { + ::sse_encode(1, serializer); + ::sse_encode(field0, serializer); + } + crate::api::api::NumOrString::Bool(field0) => { + ::sse_encode(2, serializer); + ::sse_encode(field0, serializer); + } + _ => { + unimplemented!(""); + } } } } -impl SseEncode for Vec { +impl SseEncode for crate::api::api::OperatedChat { // Codec=Sse (Serialization based), see doc to use other codecs fn sse_encode(self, serializer: &mut flutter_rust_bridge::for_generated::SseSerializer) { - ::sse_encode(self.len() as _, serializer); - for item in self { - ::sse_encode(item, serializer); - } + >::sse_encode(self.participants, serializer); + ::sse_encode(self.group_id, serializer); + ::sse_encode(self.guid, serializer); + >::sse_encode(self.delete_incoming_messages, serializer); + >::sse_encode(self.was_reported_as_junk, serializer); } } -impl SseEncode for Vec { +impl SseEncode for Option { // Codec=Sse (Serialization based), see doc to use other codecs fn sse_encode(self, serializer: &mut flutter_rust_bridge::for_generated::SseSerializer) { - ::sse_encode(self.len() as _, serializer); - for item in self { - ::sse_encode(item, serializer); + ::sse_encode(self.is_some(), serializer); + if let Some(value) = self { + ::sse_encode(value, serializer); } } } -impl SseEncode for Vec { +impl SseEncode for Option { // Codec=Sse (Serialization based), see doc to use other codecs fn sse_encode(self, serializer: &mut flutter_rust_bridge::for_generated::SseSerializer) { - ::sse_encode(self.len() as _, serializer); - for item in self { - ::sse_encode(item, serializer); + ::sse_encode(self.is_some(), serializer); + if let Some(value) = self { + ::sse_encode(value, serializer); } } } -impl SseEncode for Vec { +impl SseEncode for Option { // Codec=Sse (Serialization based), see doc to use other codecs fn sse_encode(self, serializer: &mut flutter_rust_bridge::for_generated::SseSerializer) { - ::sse_encode(self.len() as _, serializer); - for item in self { - ::sse_encode(item, serializer); + ::sse_encode(self.is_some(), serializer); + if let Some(value) = self { + ::sse_encode(value, serializer); } } } -impl SseEncode for Vec { +impl SseEncode for Option { // Codec=Sse (Serialization based), see doc to use other codecs fn sse_encode(self, serializer: &mut flutter_rust_bridge::for_generated::SseSerializer) { - ::sse_encode(self.len() as _, serializer); - for item in self { - ::sse_encode(item, serializer); + ::sse_encode(self.is_some(), serializer); + if let Some(value) = self { + ::sse_encode(value, serializer); } } } -impl SseEncode for Vec { +impl SseEncode for Option { // Codec=Sse (Serialization based), see doc to use other codecs fn sse_encode(self, serializer: &mut flutter_rust_bridge::for_generated::SseSerializer) { - ::sse_encode(self.len() as _, serializer); - for item in self { - ::sse_encode(item, serializer); + ::sse_encode(self.is_some(), serializer); + if let Some(value) = self { + ::sse_encode(value, serializer); } } } -impl SseEncode for Vec { +impl SseEncode for Option>> { // Codec=Sse (Serialization based), see doc to use other codecs fn sse_encode(self, serializer: &mut flutter_rust_bridge::for_generated::SseSerializer) { - ::sse_encode(self.len() as _, serializer); - for item in self { - ::sse_encode(item, serializer); + ::sse_encode(self.is_some(), serializer); + if let Some(value) = self { + >>::sse_encode(value, serializer); } } } -impl SseEncode for Vec { +impl SseEncode for Option>> { // Codec=Sse (Serialization based), see doc to use other codecs fn sse_encode(self, serializer: &mut flutter_rust_bridge::for_generated::SseSerializer) { - ::sse_encode(self.len() as _, serializer); - for item in self { - ::sse_encode(item, serializer); + ::sse_encode(self.is_some(), serializer); + if let Some(value) = self { + >>::sse_encode(value, serializer); } } } -impl SseEncode for Vec> { +impl SseEncode for Option>> { // Codec=Sse (Serialization based), see doc to use other codecs fn sse_encode(self, serializer: &mut flutter_rust_bridge::for_generated::SseSerializer) { - ::sse_encode(self.len() as _, serializer); - for item in self { - >::sse_encode(item, serializer); + ::sse_encode(self.is_some(), serializer); + if let Some(value) = self { + >>::sse_encode(value, serializer); } } } -impl SseEncode for Vec { +impl SseEncode for Option>> { // Codec=Sse (Serialization based), see doc to use other codecs fn sse_encode(self, serializer: &mut flutter_rust_bridge::for_generated::SseSerializer) { - ::sse_encode(self.len() as _, serializer); - for item in self { - ::sse_encode(item, serializer); + ::sse_encode(self.is_some(), serializer); + if let Some(value) = self { + >>::sse_encode(value, serializer); } } } -impl SseEncode for Vec { +impl SseEncode for Option>>> { // Codec=Sse (Serialization based), see doc to use other codecs fn sse_encode(self, serializer: &mut flutter_rust_bridge::for_generated::SseSerializer) { - ::sse_encode(self.len() as _, serializer); - for item in self { - ::sse_encode(item, serializer); + ::sse_encode(self.is_some(), serializer); + if let Some(value) = self { + >>>::sse_encode(value, serializer); } } } -impl SseEncode for Vec { +impl SseEncode for Option>> { // Codec=Sse (Serialization based), see doc to use other codecs fn sse_encode(self, serializer: &mut flutter_rust_bridge::for_generated::SseSerializer) { - ::sse_encode(self.len() as _, serializer); - for item in self { - ::sse_encode(item, serializer); + ::sse_encode(self.is_some(), serializer); + if let Some(value) = self { + >>::sse_encode(value, serializer); } } } -impl SseEncode for Vec { +impl SseEncode for Option { // Codec=Sse (Serialization based), see doc to use other codecs fn sse_encode(self, serializer: &mut flutter_rust_bridge::for_generated::SseSerializer) { - ::sse_encode(self.len() as _, serializer); - for item in self { - ::sse_encode(item, serializer); + ::sse_encode(self.is_some(), serializer); + if let Some(value) = self { + ::sse_encode(value, serializer); } } } -impl SseEncode for Vec { +impl SseEncode for Option { // Codec=Sse (Serialization based), see doc to use other codecs fn sse_encode(self, serializer: &mut flutter_rust_bridge::for_generated::SseSerializer) { - ::sse_encode(self.len() as _, serializer); - for item in self { - ::sse_encode(item, serializer); + ::sse_encode(self.is_some(), serializer); + if let Some(value) = self { + ::sse_encode(value, serializer); } } } -impl SseEncode for Vec { +impl SseEncode for Option> { // Codec=Sse (Serialization based), see doc to use other codecs fn sse_encode(self, serializer: &mut flutter_rust_bridge::for_generated::SseSerializer) { - ::sse_encode(self.len() as _, serializer); - for item in self { - ::sse_encode(item, serializer); + ::sse_encode(self.is_some(), serializer); + if let Some(value) = self { + >::sse_encode(value, serializer); } } } -impl SseEncode for Vec { +impl SseEncode for Option { // Codec=Sse (Serialization based), see doc to use other codecs fn sse_encode(self, serializer: &mut flutter_rust_bridge::for_generated::SseSerializer) { - ::sse_encode(self.len() as _, serializer); - for item in self { - ::sse_encode(item, serializer); + ::sse_encode(self.is_some(), serializer); + if let Some(value) = self { + ::sse_encode(value, serializer); } } } -impl SseEncode for Vec { +impl SseEncode for Option { // Codec=Sse (Serialization based), see doc to use other codecs fn sse_encode(self, serializer: &mut flutter_rust_bridge::for_generated::SseSerializer) { - ::sse_encode(self.len() as _, serializer); - for item in self { - ::sse_encode(item, serializer); + ::sse_encode(self.is_some(), serializer); + if let Some(value) = self { + ::sse_encode(value, serializer); } } } -impl SseEncode for Vec { +impl SseEncode for Option { // Codec=Sse (Serialization based), see doc to use other codecs fn sse_encode(self, serializer: &mut flutter_rust_bridge::for_generated::SseSerializer) { - ::sse_encode(self.len() as _, serializer); - for item in self { - ::sse_encode(item, serializer); + ::sse_encode(self.is_some(), serializer); + if let Some(value) = self { + ::sse_encode(value, serializer); } } } -impl SseEncode for Vec { +impl SseEncode for Option { // Codec=Sse (Serialization based), see doc to use other codecs fn sse_encode(self, serializer: &mut flutter_rust_bridge::for_generated::SseSerializer) { - ::sse_encode(self.len() as _, serializer); - for item in self { - ::sse_encode(item, serializer); + ::sse_encode(self.is_some(), serializer); + if let Some(value) = self { + ::sse_encode(value, serializer); } } } -impl SseEncode for Vec { +impl SseEncode for Option> { // Codec=Sse (Serialization based), see doc to use other codecs fn sse_encode(self, serializer: &mut flutter_rust_bridge::for_generated::SseSerializer) { - ::sse_encode(self.len() as _, serializer); - for item in self { - ::sse_encode(item, serializer); + ::sse_encode(self.is_some(), serializer); + if let Some(value) = self { + >::sse_encode(value, serializer); } } } -impl SseEncode for Vec { +impl SseEncode for Option> { // Codec=Sse (Serialization based), see doc to use other codecs fn sse_encode(self, serializer: &mut flutter_rust_bridge::for_generated::SseSerializer) { - ::sse_encode(self.len() as _, serializer); - for item in self { - ::sse_encode(item, serializer); + ::sse_encode(self.is_some(), serializer); + if let Some(value) = self { + >::sse_encode(value, serializer); } } } -impl SseEncode for Vec<(String, Asset)> { +impl SseEncode for Option> { // Codec=Sse (Serialization based), see doc to use other codecs fn sse_encode(self, serializer: &mut flutter_rust_bridge::for_generated::SseSerializer) { - ::sse_encode(self.len() as _, serializer); - for item in self { - <(String, Asset)>::sse_encode(item, serializer); + ::sse_encode(self.is_some(), serializer); + if let Some(value) = self { + >::sse_encode(value, serializer); } } } -impl SseEncode for Vec<(String, StCollapsedValue)> { +impl SseEncode for Option> { // Codec=Sse (Serialization based), see doc to use other codecs fn sse_encode(self, serializer: &mut flutter_rust_bridge::for_generated::SseSerializer) { - ::sse_encode(self.len() as _, serializer); - for item in self { - <(String, StCollapsedValue)>::sse_encode(item, serializer); + ::sse_encode(self.is_some(), serializer); + if let Some(value) = self { + >::sse_encode(value, serializer); } } } -impl SseEncode for Vec<(String, bool)> { +impl SseEncode for Option { // Codec=Sse (Serialization based), see doc to use other codecs fn sse_encode(self, serializer: &mut flutter_rust_bridge::for_generated::SseSerializer) { - ::sse_encode(self.len() as _, serializer); - for item in self { - <(String, bool)>::sse_encode(item, serializer); + ::sse_encode(self.is_some(), serializer); + if let Some(value) = self { + ::sse_encode(value, serializer); } } } -impl SseEncode for Vec<(String, u64)> { +impl SseEncode for Option { // Codec=Sse (Serialization based), see doc to use other codecs fn sse_encode(self, serializer: &mut flutter_rust_bridge::for_generated::SseSerializer) { - ::sse_encode(self.len() as _, serializer); - for item in self { - <(String, u64)>::sse_encode(item, serializer); + ::sse_encode(self.is_some(), serializer); + if let Some(value) = self { + ::sse_encode(value, serializer); } } } -impl SseEncode for Vec<(String, crate::api::api::CloudAttachment)> { +impl SseEncode for Option> { // Codec=Sse (Serialization based), see doc to use other codecs fn sse_encode(self, serializer: &mut flutter_rust_bridge::for_generated::SseSerializer) { - ::sse_encode(self.len() as _, serializer); - for item in self { - <(String, crate::api::api::CloudAttachment)>::sse_encode(item, serializer); + ::sse_encode(self.is_some(), serializer); + if let Some(value) = self { + >::sse_encode(value, serializer); } } } -impl SseEncode for Vec<(String, crate::api::api::CloudChat)> { +impl SseEncode for Option> { // Codec=Sse (Serialization based), see doc to use other codecs fn sse_encode(self, serializer: &mut flutter_rust_bridge::for_generated::SseSerializer) { - ::sse_encode(self.len() as _, serializer); - for item in self { - <(String, crate::api::api::CloudChat)>::sse_encode(item, serializer); + ::sse_encode(self.is_some(), serializer); + if let Some(value) = self { + >::sse_encode(value, serializer); } } } -impl SseEncode for Vec<(String, crate::api::api::CloudMessage)> { +impl SseEncode for Option { // Codec=Sse (Serialization based), see doc to use other codecs fn sse_encode(self, serializer: &mut flutter_rust_bridge::for_generated::SseSerializer) { - ::sse_encode(self.len() as _, serializer); - for item in self { - <(String, crate::api::api::CloudMessage)>::sse_encode(item, serializer); + ::sse_encode(self.is_some(), serializer); + if let Some(value) = self { + ::sse_encode(value, serializer); } } } -impl SseEncode for Vec<(String, crate::api::api::FTParticipant)> { +impl SseEncode for Option { // Codec=Sse (Serialization based), see doc to use other codecs fn sse_encode(self, serializer: &mut flutter_rust_bridge::for_generated::SseSerializer) { - ::sse_encode(self.len() as _, serializer); - for item in self { - <(String, crate::api::api::FTParticipant)>::sse_encode(item, serializer); + ::sse_encode(self.is_some(), serializer); + if let Some(value) = self { + ::sse_encode(value, serializer); } } } -impl SseEncode for Vec<(String, crate::api::api::GroupSummary)> { +impl SseEncode for Option> { // Codec=Sse (Serialization based), see doc to use other codecs fn sse_encode(self, serializer: &mut flutter_rust_bridge::for_generated::SseSerializer) { - ::sse_encode(self.len() as _, serializer); - for item in self { - <(String, crate::api::api::GroupSummary)>::sse_encode(item, serializer); + ::sse_encode(self.is_some(), serializer); + if let Some(value) = self { + >::sse_encode(value, serializer); } } } -impl SseEncode for Vec<(String, Vec)> { +impl SseEncode for Option { // Codec=Sse (Serialization based), see doc to use other codecs fn sse_encode(self, serializer: &mut flutter_rust_bridge::for_generated::SseSerializer) { - ::sse_encode(self.len() as _, serializer); - for item in self { - <(String, Vec)>::sse_encode(item, serializer); + ::sse_encode(self.is_some(), serializer); + if let Some(value) = self { + ::sse_encode(value, serializer); } } } -impl SseEncode for Vec<(String, Vec)> { +impl SseEncode for Option { // Codec=Sse (Serialization based), see doc to use other codecs fn sse_encode(self, serializer: &mut flutter_rust_bridge::for_generated::SseSerializer) { - ::sse_encode(self.len() as _, serializer); - for item in self { - <(String, Vec)>::sse_encode(item, serializer); + ::sse_encode(self.is_some(), serializer); + if let Some(value) = self { + ::sse_encode(value, serializer); } } } -impl SseEncode for Vec<(String, crate::api::api::MessageEditRange)> { +impl SseEncode for Option { // Codec=Sse (Serialization based), see doc to use other codecs fn sse_encode(self, serializer: &mut flutter_rust_bridge::for_generated::SseSerializer) { - ::sse_encode(self.len() as _, serializer); - for item in self { - <(String, crate::api::api::MessageEditRange)>::sse_encode(item, serializer); + ::sse_encode(self.is_some(), serializer); + if let Some(value) = self { + ::sse_encode(value, serializer); } } } -impl SseEncode for Vec<(String, Option)> { +impl SseEncode for Option { // Codec=Sse (Serialization based), see doc to use other codecs fn sse_encode(self, serializer: &mut flutter_rust_bridge::for_generated::SseSerializer) { - ::sse_encode(self.len() as _, serializer); - for item in self { - <(String, Option)>::sse_encode(item, serializer); + ::sse_encode(self.is_some(), serializer); + if let Some(value) = self { + ::sse_encode(value, serializer); } } } -impl SseEncode for Vec<(String, Option)> { +impl SseEncode for Option { // Codec=Sse (Serialization based), see doc to use other codecs fn sse_encode(self, serializer: &mut flutter_rust_bridge::for_generated::SseSerializer) { - ::sse_encode(self.len() as _, serializer); - for item in self { - <(String, Option)>::sse_encode(item, serializer); + ::sse_encode(self.is_some(), serializer); + if let Some(value) = self { + ::sse_encode(value, serializer); } } } -impl SseEncode for Vec<(String, Option)> { +impl SseEncode for Option { // Codec=Sse (Serialization based), see doc to use other codecs fn sse_encode(self, serializer: &mut flutter_rust_bridge::for_generated::SseSerializer) { - ::sse_encode(self.len() as _, serializer); - for item in self { - <(String, Option)>::sse_encode(item, serializer); + ::sse_encode(self.is_some(), serializer); + if let Some(value) = self { + ::sse_encode(value, serializer); } } } -impl SseEncode for Vec<(String, crate::api::api::PasswordManagerMetaDataCtx)> { +impl SseEncode for Option { // Codec=Sse (Serialization based), see doc to use other codecs fn sse_encode(self, serializer: &mut flutter_rust_bridge::for_generated::SseSerializer) { - ::sse_encode(self.len() as _, serializer); - for item in self { - <(String, crate::api::api::PasswordManagerMetaDataCtx)>::sse_encode(item, serializer); + ::sse_encode(self.is_some(), serializer); + if let Some(value) = self { + ::sse_encode(value, serializer); } } } -impl SseEncode for Vec<(String, (Option, crate::api::api::Passkey))> { +impl SseEncode for Option { // Codec=Sse (Serialization based), see doc to use other codecs fn sse_encode(self, serializer: &mut flutter_rust_bridge::for_generated::SseSerializer) { - ::sse_encode(self.len() as _, serializer); - for item in self { - <(String, (Option, crate::api::api::Passkey))>::sse_encode(item, serializer); + ::sse_encode(self.is_some(), serializer); + if let Some(value) = self { + ::sse_encode(value, serializer); } } } -impl SseEncode - for Vec<( - String, - (Option, crate::api::api::PasswordManagerMeta), - )> -{ +impl SseEncode for Option { // Codec=Sse (Serialization based), see doc to use other codecs fn sse_encode(self, serializer: &mut flutter_rust_bridge::for_generated::SseSerializer) { - ::sse_encode(self.len() as _, serializer); - for item in self { - <( - String, - (Option, crate::api::api::PasswordManagerMeta), - )>::sse_encode(item, serializer); + ::sse_encode(self.is_some(), serializer); + if let Some(value) = self { + ::sse_encode(value, serializer); } } } -impl SseEncode for Vec<(String, (Option, crate::api::api::PasswordRawEntry))> { +impl SseEncode for Option { // Codec=Sse (Serialization based), see doc to use other codecs fn sse_encode(self, serializer: &mut flutter_rust_bridge::for_generated::SseSerializer) { - ::sse_encode(self.len() as _, serializer); - for item in self { - <(String, (Option, crate::api::api::PasswordRawEntry))>::sse_encode( - item, serializer, - ); + ::sse_encode(self.is_some(), serializer); + if let Some(value) = self { + ::sse_encode(value, serializer); } } } -impl SseEncode for Vec<(String, (Option, crate::api::api::WifiPassword))> { +impl SseEncode for Option { // Codec=Sse (Serialization based), see doc to use other codecs fn sse_encode(self, serializer: &mut flutter_rust_bridge::for_generated::SseSerializer) { - ::sse_encode(self.len() as _, serializer); - for item in self { - <(String, (Option, crate::api::api::WifiPassword))>::sse_encode( - item, serializer, - ); + ::sse_encode(self.is_some(), serializer); + if let Some(value) = self { + ::sse_encode(value, serializer); } } } -impl SseEncode for Vec<(String, crate::api::api::ShareInviteContentData)> { +impl SseEncode for Option { // Codec=Sse (Serialization based), see doc to use other codecs fn sse_encode(self, serializer: &mut flutter_rust_bridge::for_generated::SseSerializer) { - ::sse_encode(self.len() as _, serializer); - for item in self { - <(String, crate::api::api::ShareInviteContentData)>::sse_encode(item, serializer); + ::sse_encode(self.is_some(), serializer); + if let Some(value) = self { + ::sse_encode(value, serializer); } } } -impl SseEncode for Vec<(String, crate::api::api::StatusKitPersonalConfig)> { +impl SseEncode for Option { // Codec=Sse (Serialization based), see doc to use other codecs fn sse_encode(self, serializer: &mut flutter_rust_bridge::for_generated::SseSerializer) { - ::sse_encode(self.len() as _, serializer); - for item in self { - <(String, crate::api::api::StatusKitPersonalConfig)>::sse_encode(item, serializer); + ::sse_encode(self.is_some(), serializer); + if let Some(value) = self { + ::sse_encode(value, serializer); } } } -impl SseEncode for Vec<(String, String)> { +impl SseEncode for Option { // Codec=Sse (Serialization based), see doc to use other codecs fn sse_encode(self, serializer: &mut flutter_rust_bridge::for_generated::SseSerializer) { - ::sse_encode(self.len() as _, serializer); - for item in self { - <(String, String)>::sse_encode(item, serializer); + ::sse_encode(self.is_some(), serializer); + if let Some(value) = self { + ::sse_encode(value, serializer); } } } -impl SseEncode for Vec<(String, crate::api::api::SyncStatus)> { +impl SseEncode for Option { // Codec=Sse (Serialization based), see doc to use other codecs fn sse_encode(self, serializer: &mut flutter_rust_bridge::for_generated::SseSerializer) { - ::sse_encode(self.len() as _, serializer); - for item in self { - <(String, crate::api::api::SyncStatus)>::sse_encode(item, serializer); + ::sse_encode(self.is_some(), serializer); + if let Some(value) = self { + ::sse_encode(value, serializer); } } } -impl SseEncode for Vec<(u32, crate::api::api::NSDictionaryTypedCoder)> { +impl SseEncode for Option { // Codec=Sse (Serialization based), see doc to use other codecs fn sse_encode(self, serializer: &mut flutter_rust_bridge::for_generated::SseSerializer) { - ::sse_encode(self.len() as _, serializer); - for item in self { - <(u32, crate::api::api::NSDictionaryTypedCoder)>::sse_encode(item, serializer); + ::sse_encode(self.is_some(), serializer); + if let Some(value) = self { + ::sse_encode(value, serializer); } } } -impl SseEncode for Vec { +impl SseEncode for Option { // Codec=Sse (Serialization based), see doc to use other codecs fn sse_encode(self, serializer: &mut flutter_rust_bridge::for_generated::SseSerializer) { - ::sse_encode(self.len() as _, serializer); - for item in self { - ::sse_encode(item, serializer); + ::sse_encode(self.is_some(), serializer); + if let Some(value) = self { + ::sse_encode(value, serializer); } } } -impl SseEncode for Vec { +impl SseEncode for Option { // Codec=Sse (Serialization based), see doc to use other codecs fn sse_encode(self, serializer: &mut flutter_rust_bridge::for_generated::SseSerializer) { - ::sse_encode(self.len() as _, serializer); - for item in self { - ::sse_encode(item, serializer); + ::sse_encode(self.is_some(), serializer); + if let Some(value) = self { + ::sse_encode(value, serializer); } } } -impl SseEncode for Vec { +impl SseEncode for Option { // Codec=Sse (Serialization based), see doc to use other codecs fn sse_encode(self, serializer: &mut flutter_rust_bridge::for_generated::SseSerializer) { - ::sse_encode(self.len() as _, serializer); - for item in self { - ::sse_encode(item, serializer); + ::sse_encode(self.is_some(), serializer); + if let Some(value) = self { + ::sse_encode(value, serializer); } } } -impl SseEncode for Vec { +impl SseEncode for Option { // Codec=Sse (Serialization based), see doc to use other codecs fn sse_encode(self, serializer: &mut flutter_rust_bridge::for_generated::SseSerializer) { - ::sse_encode(self.len() as _, serializer); - for item in self { - ::sse_encode(item, serializer); + ::sse_encode(self.is_some(), serializer); + if let Some(value) = self { + ::sse_encode(value, serializer); } } } -impl SseEncode for crate::api::api::Location { +impl SseEncode for Option { // Codec=Sse (Serialization based), see doc to use other codecs fn sse_encode(self, serializer: &mut flutter_rust_bridge::for_generated::SseSerializer) { - >::sse_encode(self.address, serializer); - ::sse_encode(self.altitude, serializer); - ::sse_encode(self.floor_level, serializer); - ::sse_encode(self.horizontal_accuracy, serializer); - ::sse_encode(self.is_inaccurate, serializer); - ::sse_encode(self.latitude, serializer); - >::sse_encode(self.location_id, serializer); - >::sse_encode(self.location_timestamp, serializer); - ::sse_encode(self.longitude, serializer); - ::sse_encode(self.secure_location_ts, serializer); - ::sse_encode(self.timestamp, serializer); - ::sse_encode(self.vertical_accuracy, serializer); - >::sse_encode(self.position_type, serializer); - >::sse_encode(self.is_old, serializer); - >::sse_encode(self.location_finished, serializer); + ::sse_encode(self.is_some(), serializer); + if let Some(value) = self { + ::sse_encode(value, serializer); + } } } -impl SseEncode for crate::api::api::LoginState { +impl SseEncode for Option { // Codec=Sse (Serialization based), see doc to use other codecs fn sse_encode(self, serializer: &mut flutter_rust_bridge::for_generated::SseSerializer) { - match self { - crate::api::api::LoginState::LoggedIn => { - ::sse_encode(0, serializer); - } - crate::api::api::LoginState::NeedsDevice2FA => { - ::sse_encode(1, serializer); - } - crate::api::api::LoginState::Needs2FAVerification => { - ::sse_encode(2, serializer); - } - crate::api::api::LoginState::NeedsSMS2FA => { - ::sse_encode(3, serializer); - } - crate::api::api::LoginState::NeedsSMS2FAVerification(field0) => { - ::sse_encode(4, serializer); - ::sse_encode(field0, serializer); - } - crate::api::api::LoginState::NeedsExtraStep(field0) => { - ::sse_encode(5, serializer); - ::sse_encode(field0, serializer); - } - crate::api::api::LoginState::NeedsLogin => { - ::sse_encode(6, serializer); - } - _ => { - unimplemented!(""); - } + ::sse_encode(self.is_some(), serializer); + if let Some(value) = self { + ::sse_encode(value, serializer); + } + } +} + +impl SseEncode for Option { + // Codec=Sse (Serialization based), see doc to use other codecs + fn sse_encode(self, serializer: &mut flutter_rust_bridge::for_generated::SseSerializer) { + ::sse_encode(self.is_some(), serializer); + if let Some(value) = self { + ::sse_encode(value, serializer); } } } -impl SseEncode for crate::api::api::LPIconMetadata { +impl SseEncode for Option { // Codec=Sse (Serialization based), see doc to use other codecs fn sse_encode(self, serializer: &mut flutter_rust_bridge::for_generated::SseSerializer) { - ::sse_encode(self.url, serializer); - ::sse_encode(self.version, serializer); + ::sse_encode(self.is_some(), serializer); + if let Some(value) = self { + ::sse_encode(value, serializer); + } } } -impl SseEncode for crate::api::api::LPImageMetadata { +impl SseEncode for Option { // Codec=Sse (Serialization based), see doc to use other codecs fn sse_encode(self, serializer: &mut flutter_rust_bridge::for_generated::SseSerializer) { - ::sse_encode(self.size, serializer); - ::sse_encode(self.url, serializer); - ::sse_encode(self.version, serializer); + ::sse_encode(self.is_some(), serializer); + if let Some(value) = self { + ::sse_encode(value, serializer); + } } } -impl SseEncode for crate::api::api::LPLinkMetadata { +impl SseEncode for Option { // Codec=Sse (Serialization based), see doc to use other codecs fn sse_encode(self, serializer: &mut flutter_rust_bridge::for_generated::SseSerializer) { - >::sse_encode(self.image_metadata, serializer); - ::sse_encode(self.version, serializer); - >::sse_encode(self.icon_metadata, serializer); - >::sse_encode(self.original_url, serializer); - >::sse_encode(self.url, serializer); - >::sse_encode(self.title, serializer); - >::sse_encode(self.summary, serializer); - >::sse_encode( - self.image, serializer, - ); - >::sse_encode( - self.icon, serializer, - ); - >>::sse_encode(self.images, serializer); - >>::sse_encode(self.icons, serializer); - >::sse_encode(self.is_incomplete, serializer); - >::sse_encode(self.uses_activity_pub, serializer); - >::sse_encode(self.is_encoded_for_local_use, serializer); - >::sse_encode(self.collaboration_type, serializer); - >::sse_encode( - self.specialization2, - serializer, - ); + ::sse_encode(self.is_some(), serializer); + if let Some(value) = self { + ::sse_encode(value, serializer); + } } } -impl SseEncode for crate::api::api::LPSpecializationMetadata { +impl SseEncode for Option { // Codec=Sse (Serialization based), see doc to use other codecs fn sse_encode(self, serializer: &mut flutter_rust_bridge::for_generated::SseSerializer) { - match self { - crate::api::api::LPSpecializationMetadata::LPPasswordsInviteMetadata { - group_name, - url_parameters, - } => { - ::sse_encode(0, serializer); - ::sse_encode(group_name, serializer); - ::sse_encode(url_parameters, serializer); - } - _ => { - unimplemented!(""); - } + ::sse_encode(self.is_some(), serializer); + if let Some(value) = self { + ::sse_encode(value, serializer); } } } -impl SseEncode for crate::api::api::MemojiData { +impl SseEncode for Option { // Codec=Sse (Serialization based), see doc to use other codecs fn sse_encode(self, serializer: &mut flutter_rust_bridge::for_generated::SseSerializer) { - ::sse_encode(self.background_color_description, serializer); - >::sse_encode(self.avatar_record_data, serializer); - >::sse_encode(self.avatar_pose_data, serializer); - ::sse_encode(self.has_body, serializer); - >::sse_encode(self.avatar_image_data, serializer); + ::sse_encode(self.is_some(), serializer); + if let Some(value) = self { + ::sse_encode(value, serializer); + } } } -impl SseEncode for crate::api::api::Message { +impl SseEncode for Option { // Codec=Sse (Serialization based), see doc to use other codecs fn sse_encode(self, serializer: &mut flutter_rust_bridge::for_generated::SseSerializer) { - match self { - crate::api::api::Message::Message(field0) => { - ::sse_encode(0, serializer); - ::sse_encode(field0, serializer); - } - crate::api::api::Message::RenameMessage(field0) => { - ::sse_encode(1, serializer); - ::sse_encode(field0, serializer); - } - crate::api::api::Message::ChangeParticipants(field0) => { - ::sse_encode(2, serializer); - ::sse_encode(field0, serializer); - } - crate::api::api::Message::React(field0) => { - ::sse_encode(3, serializer); - ::sse_encode(field0, serializer); - } - crate::api::api::Message::Delivered => { - ::sse_encode(4, serializer); - } - crate::api::api::Message::Read => { - ::sse_encode(5, serializer); - } - crate::api::api::Message::Typing(field0, field1) => { - ::sse_encode(6, serializer); - ::sse_encode(field0, serializer); - >::sse_encode(field1, serializer); - } - crate::api::api::Message::Unsend(field0) => { - ::sse_encode(7, serializer); - ::sse_encode(field0, serializer); - } - crate::api::api::Message::Edit(field0) => { - ::sse_encode(8, serializer); - ::sse_encode(field0, serializer); - } - crate::api::api::Message::IconChange(field0) => { - ::sse_encode(9, serializer); - ::sse_encode(field0, serializer); - } - crate::api::api::Message::EnableSmsActivation(field0) => { - ::sse_encode(10, serializer); - ::sse_encode(field0, serializer); - } - crate::api::api::Message::MessageReadOnDevice => { - ::sse_encode(11, serializer); - } - crate::api::api::Message::SmsConfirmSent(field0) => { - ::sse_encode(12, serializer); - ::sse_encode(field0, serializer); - } - crate::api::api::Message::MarkUnread => { - ::sse_encode(13, serializer); - } - crate::api::api::Message::PeerCacheInvalidate => { - ::sse_encode(14, serializer); - } - crate::api::api::Message::UpdateExtension(field0) => { - ::sse_encode(15, serializer); - ::sse_encode(field0, serializer); - } - crate::api::api::Message::Error(field0) => { - ::sse_encode(16, serializer); - ::sse_encode(field0, serializer); - } - crate::api::api::Message::MoveToRecycleBin(field0) => { - ::sse_encode(17, serializer); - ::sse_encode(field0, serializer); - } - crate::api::api::Message::RecoverChat(field0) => { - ::sse_encode(18, serializer); - ::sse_encode(field0, serializer); - } - crate::api::api::Message::PermanentDelete(field0) => { - ::sse_encode(19, serializer); - ::sse_encode(field0, serializer); - } - crate::api::api::Message::Unschedule => { - ::sse_encode(20, serializer); - } - crate::api::api::Message::UpdateProfile(field0) => { - ::sse_encode(21, serializer); - ::sse_encode(field0, serializer); - } - crate::api::api::Message::UpdateProfileSharing(field0) => { - ::sse_encode(22, serializer); - ::sse_encode(field0, serializer); - } - crate::api::api::Message::ShareProfile(field0) => { - ::sse_encode(23, serializer); - ::sse_encode(field0, serializer); - } - crate::api::api::Message::NotifyAnyways => { - ::sse_encode(24, serializer); - } - crate::api::api::Message::SetTranscriptBackground(field0) => { - ::sse_encode(25, serializer); - ::sse_encode(field0, serializer); - } - _ => { - unimplemented!(""); - } + ::sse_encode(self.is_some(), serializer); + if let Some(value) = self { + ::sse_encode(value, serializer); } } } -impl SseEncode for crate::api::api::MessageEdit { +impl SseEncode for Option { // Codec=Sse (Serialization based), see doc to use other codecs fn sse_encode(self, serializer: &mut flutter_rust_bridge::for_generated::SseSerializer) { - >::sse_encode(self.t, serializer); - ::sse_encode(self.d, serializer); - >::sse_encode(self.bcg, serializer); + ::sse_encode(self.is_some(), serializer); + if let Some(value) = self { + ::sse_encode(value, serializer); + } } } -impl SseEncode for crate::api::api::MessageEditRange { +impl SseEncode for Option { // Codec=Sse (Serialization based), see doc to use other codecs fn sse_encode(self, serializer: &mut flutter_rust_bridge::for_generated::SseSerializer) { - ::sse_encode(self.lo, serializer); - ::sse_encode(self.le, serializer); + ::sse_encode(self.is_some(), serializer); + if let Some(value) = self { + ::sse_encode(value, serializer); + } } } -impl SseEncode for crate::api::api::MessageInst { +impl SseEncode for Option { // Codec=Sse (Serialization based), see doc to use other codecs fn sse_encode(self, serializer: &mut flutter_rust_bridge::for_generated::SseSerializer) { - ::sse_encode(self.id, serializer); - >::sse_encode(self.sender, serializer); - >::sse_encode(self.conversation, serializer); - ::sse_encode(self.message, serializer); - ::sse_encode(self.sent_timestamp, serializer); - >>::sse_encode(self.target, serializer); - ::sse_encode(self.send_delivered, serializer); - ::sse_encode(self.verification_failed, serializer); - >::sse_encode(self.certified_context, serializer); + ::sse_encode(self.is_some(), serializer); + if let Some(value) = self { + ::sse_encode(value, serializer); + } } } -impl SseEncode for crate::api::api::MessagePart { +impl SseEncode for Option { // Codec=Sse (Serialization based), see doc to use other codecs fn sse_encode(self, serializer: &mut flutter_rust_bridge::for_generated::SseSerializer) { - match self { - crate::api::api::MessagePart::Text(field0, field1) => { - ::sse_encode(0, serializer); - ::sse_encode(field0, serializer); - ::sse_encode(field1, serializer); - } - crate::api::api::MessagePart::Attachment(field0) => { - ::sse_encode(1, serializer); - ::sse_encode(field0, serializer); - } - crate::api::api::MessagePart::Mention(field0, field1) => { - ::sse_encode(2, serializer); - ::sse_encode(field0, serializer); - ::sse_encode(field1, serializer); - } - crate::api::api::MessagePart::Object(field0) => { - ::sse_encode(3, serializer); - ::sse_encode(field0, serializer); - } - _ => { - unimplemented!(""); - } + ::sse_encode(self.is_some(), serializer); + if let Some(value) = self { + ::sse_encode(value, serializer); } } } -impl SseEncode for crate::api::api::MessageParts { +impl SseEncode for Option { // Codec=Sse (Serialization based), see doc to use other codecs fn sse_encode(self, serializer: &mut flutter_rust_bridge::for_generated::SseSerializer) { - >::sse_encode(self.0, serializer); + ::sse_encode(self.is_some(), serializer); + if let Some(value) = self { + ::sse_encode(value, serializer); + } } } -impl SseEncode for crate::api::api::MessageProto { +impl SseEncode for Option { // Codec=Sse (Serialization based), see doc to use other codecs fn sse_encode(self, serializer: &mut flutter_rust_bridge::for_generated::SseSerializer) { - ::sse_encode(self.unk1, serializer); - >::sse_encode(self.subject, serializer); - >::sse_encode(self.text, serializer); - >>::sse_encode(self.attributed_body, serializer); - >::sse_encode(self.balloon_bundle_id, serializer); - >>::sse_encode(self.payload_data, serializer); - >>::sse_encode(self.message_summary_info, serializer); - >::sse_encode(self.effect, serializer); - >::sse_encode(self.date_read, serializer); - >::sse_encode(self.unk10, serializer); - >::sse_encode(self.unk11, serializer); - >::sse_encode(self.date_delivered, serializer); - >::sse_encode(self.unk14, serializer); - >::sse_encode(self.associated_message_type, serializer); - >::sse_encode(self.associated_message_guid, serializer); - >::sse_encode(self.associated_message_range_location, serializer); - >::sse_encode(self.associated_message_range_length, serializer); + ::sse_encode(self.is_some(), serializer); + if let Some(value) = self { + ::sse_encode(value, serializer); + } } } -impl SseEncode for crate::api::api::MessageProto2 { +impl SseEncode for Option { // Codec=Sse (Serialization based), see doc to use other codecs fn sse_encode(self, serializer: &mut flutter_rust_bridge::for_generated::SseSerializer) { - >::sse_encode(self.reply, serializer); + ::sse_encode(self.is_some(), serializer); + if let Some(value) = self { + ::sse_encode(value, serializer); + } } } -impl SseEncode for crate::api::api::MessageProto3 { +impl SseEncode for Option { // Codec=Sse (Serialization based), see doc to use other codecs fn sse_encode(self, serializer: &mut flutter_rust_bridge::for_generated::SseSerializer) { - >::sse_encode(self.unk2, serializer); - >::sse_encode(self.unk3, serializer); + ::sse_encode(self.is_some(), serializer); + if let Some(value) = self { + ::sse_encode(value, serializer); + } } } -impl SseEncode for crate::api::api::MessageProto4 { +impl SseEncode for Option { // Codec=Sse (Serialization based), see doc to use other codecs fn sse_encode(self, serializer: &mut flutter_rust_bridge::for_generated::SseSerializer) { - >::sse_encode(self.associated_message_emoji, serializer); - >::sse_encode(self.service, serializer); - >::sse_encode(self.schedule_type, serializer); - >::sse_encode(self.schedule_state, serializer); - >::sse_encode(self.group_id, serializer); - >::sse_encode(self.sent_or_received_off_grid, serializer); + ::sse_encode(self.is_some(), serializer); + if let Some(value) = self { + ::sse_encode(value, serializer); + } } } -impl SseEncode for crate::api::api::MessageSummaryInfo { +impl SseEncode for Option { // Codec=Sse (Serialization based), see doc to use other codecs fn sse_encode(self, serializer: &mut flutter_rust_bridge::for_generated::SseSerializer) { - >::sse_encode(self.ams, serializer); - >>::sse_encode(self.ampt, serializer); - >::sse_encode(self.amc, serializer); - >::sse_encode(self.amb, serializer); - >::sse_encode(self.amd, serializer); - >>::sse_encode( - self.ec, serializer, - ); - >::sse_encode(self.ep, serializer); - >::sse_encode( - self.otr, serializer, - ); - >::sse_encode(self.ust, serializer); - >::sse_encode(self.rp, serializer); - >::sse_encode(self.hbr, serializer); - >::sse_encode(self.oui, serializer); - >::sse_encode(self.osn, serializer); - >::sse_encode(self.euh, serializer); + ::sse_encode(self.is_some(), serializer); + if let Some(value) = self { + ::sse_encode(value, serializer); + } } } -impl SseEncode for crate::api::api::MessageTarget { +impl SseEncode for Option { // Codec=Sse (Serialization based), see doc to use other codecs fn sse_encode(self, serializer: &mut flutter_rust_bridge::for_generated::SseSerializer) { - match self { - crate::api::api::MessageTarget::Token(field0) => { - ::sse_encode(0, serializer); - >::sse_encode(field0, serializer); - } - crate::api::api::MessageTarget::Uuid(field0) => { - ::sse_encode(1, serializer); - ::sse_encode(field0, serializer); - } - _ => { - unimplemented!(""); - } + ::sse_encode(self.is_some(), serializer); + if let Some(value) = self { + ::sse_encode(value, serializer); } } } -impl SseEncode for crate::api::api::MessageType { +impl SseEncode for Option { // Codec=Sse (Serialization based), see doc to use other codecs fn sse_encode(self, serializer: &mut flutter_rust_bridge::for_generated::SseSerializer) { - match self { - crate::api::api::MessageType::IMessage => { - ::sse_encode(0, serializer); - } - crate::api::api::MessageType::SMS { - is_phone, - using_number, - from_handle, - } => { - ::sse_encode(1, serializer); - ::sse_encode(is_phone, serializer); - ::sse_encode(using_number, serializer); - >::sse_encode(from_handle, serializer); - } - _ => { - unimplemented!(""); - } + ::sse_encode(self.is_some(), serializer); + if let Some(value) = self { + ::sse_encode(value, serializer); } } } -impl SseEncode for crate::api::api::MMCSAttachmentMeta { +impl SseEncode for Option { // Codec=Sse (Serialization based), see doc to use other codecs fn sse_encode(self, serializer: &mut flutter_rust_bridge::for_generated::SseSerializer) { - >::sse_encode(self.mmcs_signature_hex, serializer); - >::sse_encode(self.mmcs_owner, serializer); - >::sse_encode(self.mmcs_url, serializer); - >::sse_encode(self.decryption_key, serializer); - >::sse_encode(self.inline_attachment, serializer); - >::sse_encode(self.message_part, serializer); - >::sse_encode(self.file_size, serializer); - >::sse_encode(self.uti_type, serializer); - >::sse_encode(self.mime_type, serializer); - >::sse_encode(self.name, serializer); + ::sse_encode(self.is_some(), serializer); + if let Some(value) = self { + ::sse_encode(value, serializer); + } } } -impl SseEncode for crate::api::api::MMCSFile { +impl SseEncode for Option { // Codec=Sse (Serialization based), see doc to use other codecs fn sse_encode(self, serializer: &mut flutter_rust_bridge::for_generated::SseSerializer) { - >::sse_encode(self.signature, serializer); - ::sse_encode(self.object, serializer); - ::sse_encode(self.url, serializer); - >::sse_encode(self.key, serializer); - ::sse_encode(self.size, serializer); + ::sse_encode(self.is_some(), serializer); + if let Some(value) = self { + ::sse_encode(value, serializer); + } } } -impl SseEncode for crate::api::api::MMCSTransferProgress { + +impl SseEncode for Option { // Codec=Sse (Serialization based), see doc to use other codecs fn sse_encode(self, serializer: &mut flutter_rust_bridge::for_generated::SseSerializer) { - ::sse_encode(self.prog, serializer); - ::sse_encode(self.total, serializer); - >::sse_encode(self.file, serializer); + ::sse_encode(self.is_some(), serializer); + if let Some(value) = self { + ::sse_encode(value, serializer); + } } } -impl SseEncode for crate::api::api::MonogramData { +impl SseEncode for Option { // Codec=Sse (Serialization based), see doc to use other codecs fn sse_encode(self, serializer: &mut flutter_rust_bridge::for_generated::SseSerializer) { - ::sse_encode( - self.top_background_color_description, - serializer, - ); - ::sse_encode(self.background_color_description, serializer); - ::sse_encode(self.initials, serializer); - ::sse_encode(self.monogram_supported_for_name, serializer); + ::sse_encode(self.is_some(), serializer); + if let Some(value) = self { + ::sse_encode(value, serializer); + } } } -impl SseEncode for crate::api::api::MoveToRecycleBinMessage { +impl SseEncode for Option { // Codec=Sse (Serialization based), see doc to use other codecs fn sse_encode(self, serializer: &mut flutter_rust_bridge::for_generated::SseSerializer) { - ::sse_encode(self.target, serializer); - ::sse_encode(self.recoverable_delete_date, serializer); + ::sse_encode(self.is_some(), serializer); + if let Some(value) = self { + ::sse_encode(value, serializer); + } } } -impl SseEncode for crate::api::api::MyAsyncRuntime { +impl SseEncode for Option { // Codec=Sse (Serialization based), see doc to use other codecs - fn sse_encode(self, serializer: &mut flutter_rust_bridge::for_generated::SseSerializer) {} + fn sse_encode(self, serializer: &mut flutter_rust_bridge::for_generated::SseSerializer) { + ::sse_encode(self.is_some(), serializer); + if let Some(value) = self { + ::sse_encode(value, serializer); + } + } } -impl SseEncode for crate::api::api::NormalMessage { +impl SseEncode for Option { // Codec=Sse (Serialization based), see doc to use other codecs fn sse_encode(self, serializer: &mut flutter_rust_bridge::for_generated::SseSerializer) { - ::sse_encode(self.parts, serializer); - >::sse_encode(self.effect, serializer); - >::sse_encode(self.reply_guid, serializer); - >::sse_encode(self.reply_part, serializer); - ::sse_encode(self.service, serializer); - >::sse_encode(self.subject, serializer); - >::sse_encode(self.app, serializer); - >::sse_encode(self.link_meta, serializer); - ::sse_encode(self.voice, serializer); - >::sse_encode(self.scheduled, serializer); - >::sse_encode( - self.embedded_profile, - serializer, - ); + ::sse_encode(self.is_some(), serializer); + if let Some(value) = self { + ::sse_encode(value, serializer); + } } } -impl SseEncode for crate::api::api::NSAttributedString { +impl SseEncode for Option { // Codec=Sse (Serialization based), see doc to use other codecs fn sse_encode(self, serializer: &mut flutter_rust_bridge::for_generated::SseSerializer) { - ::sse_encode(self.text, serializer); - >::sse_encode(self.ranges, serializer); + ::sse_encode(self.is_some(), serializer); + if let Some(value) = self { + ::sse_encode(value, serializer); + } } } -impl SseEncode for crate::api::api::NSDictionaryClass { +impl SseEncode for Option { // Codec=Sse (Serialization based), see doc to use other codecs fn sse_encode(self, serializer: &mut flutter_rust_bridge::for_generated::SseSerializer) { - ::sse_encode( - match self { - crate::api::api::NSDictionaryClass::NSDictionary => 0, - crate::api::api::NSDictionaryClass::NSMutableDictionary => 1, - _ => { - unimplemented!(""); - } - }, - serializer, - ); + ::sse_encode(self.is_some(), serializer); + if let Some(value) = self { + ::sse_encode(value, serializer); + } } } -impl SseEncode for crate::api::api::NSDictionaryTypedCoder { +impl SseEncode for Option { // Codec=Sse (Serialization based), see doc to use other codecs fn sse_encode(self, serializer: &mut flutter_rust_bridge::for_generated::SseSerializer) { - >::sse_encode(self.0, serializer); + ::sse_encode(self.is_some(), serializer); + if let Some(value) = self { + ::sse_encode(value, serializer); + } } } -impl SseEncode for crate::api::api::NSNumber { +impl SseEncode for Option { // Codec=Sse (Serialization based), see doc to use other codecs fn sse_encode(self, serializer: &mut flutter_rust_bridge::for_generated::SseSerializer) { - ::sse_encode(self.0, serializer); + ::sse_encode(self.is_some(), serializer); + if let Some(value) = self { + ::sse_encode(value, serializer); + } } } -impl SseEncode for crate::api::api::NSString { +impl SseEncode for Option { // Codec=Sse (Serialization based), see doc to use other codecs fn sse_encode(self, serializer: &mut flutter_rust_bridge::for_generated::SseSerializer) { - ::sse_encode(self.0, serializer); + ::sse_encode(self.is_some(), serializer); + if let Some(value) = self { + ::sse_encode(value, serializer); + } } } -impl SseEncode for crate::api::api::NSURL { +impl SseEncode for Option { // Codec=Sse (Serialization based), see doc to use other codecs fn sse_encode(self, serializer: &mut flutter_rust_bridge::for_generated::SseSerializer) { - ::sse_encode(self.base, serializer); - ::sse_encode(self.relative, serializer); + ::sse_encode(self.is_some(), serializer); + if let Some(value) = self { + ::sse_encode(value, serializer); + } } } -impl SseEncode for crate::api::api::NumOrString { +impl SseEncode for Option { // Codec=Sse (Serialization based), see doc to use other codecs fn sse_encode(self, serializer: &mut flutter_rust_bridge::for_generated::SseSerializer) { - match self { - crate::api::api::NumOrString::Num(field0) => { - ::sse_encode(0, serializer); - ::sse_encode(field0, serializer); - } - crate::api::api::NumOrString::String(field0) => { - ::sse_encode(1, serializer); - ::sse_encode(field0, serializer); - } - crate::api::api::NumOrString::Bool(field0) => { - ::sse_encode(2, serializer); - ::sse_encode(field0, serializer); - } - _ => { - unimplemented!(""); - } + ::sse_encode(self.is_some(), serializer); + if let Some(value) = self { + ::sse_encode(value, serializer); } } } -impl SseEncode for crate::api::api::OperatedChat { +impl SseEncode for Option { // Codec=Sse (Serialization based), see doc to use other codecs fn sse_encode(self, serializer: &mut flutter_rust_bridge::for_generated::SseSerializer) { - >::sse_encode(self.participants, serializer); - ::sse_encode(self.group_id, serializer); - ::sse_encode(self.guid, serializer); - >::sse_encode(self.delete_incoming_messages, serializer); - >::sse_encode(self.was_reported_as_junk, serializer); + ::sse_encode(self.is_some(), serializer); + if let Some(value) = self { + ::sse_encode(value, serializer); + } } } -impl SseEncode for Option { +impl SseEncode for Option { // Codec=Sse (Serialization based), see doc to use other codecs fn sse_encode(self, serializer: &mut flutter_rust_bridge::for_generated::SseSerializer) { ::sse_encode(self.is_some(), serializer); if let Some(value) = self { - ::sse_encode(value, serializer); + ::sse_encode(value, serializer); } } } -impl SseEncode for Option { +impl SseEncode for Option { // Codec=Sse (Serialization based), see doc to use other codecs fn sse_encode(self, serializer: &mut flutter_rust_bridge::for_generated::SseSerializer) { ::sse_encode(self.is_some(), serializer); if let Some(value) = self { - ::sse_encode(value, serializer); + ::sse_encode(value, serializer); } } } -impl SseEncode for Option { +impl SseEncode for Option { // Codec=Sse (Serialization based), see doc to use other codecs fn sse_encode(self, serializer: &mut flutter_rust_bridge::for_generated::SseSerializer) { ::sse_encode(self.is_some(), serializer); if let Some(value) = self { - ::sse_encode(value, serializer); + ::sse_encode(value, serializer); } } } -impl SseEncode for Option { +impl SseEncode for Option { // Codec=Sse (Serialization based), see doc to use other codecs fn sse_encode(self, serializer: &mut flutter_rust_bridge::for_generated::SseSerializer) { ::sse_encode(self.is_some(), serializer); if let Some(value) = self { - ::sse_encode(value, serializer); + ::sse_encode(value, serializer); } } } -impl SseEncode for Option { +impl SseEncode for Option { // Codec=Sse (Serialization based), see doc to use other codecs fn sse_encode(self, serializer: &mut flutter_rust_bridge::for_generated::SseSerializer) { ::sse_encode(self.is_some(), serializer); if let Some(value) = self { - ::sse_encode(value, serializer); + ::sse_encode(value, serializer); } } } -impl SseEncode for Option>> { +impl SseEncode for Option<(crate::api::api::SharedPushState, APSWatcher)> { // Codec=Sse (Serialization based), see doc to use other codecs fn sse_encode(self, serializer: &mut flutter_rust_bridge::for_generated::SseSerializer) { ::sse_encode(self.is_some(), serializer); if let Some(value) = self { - >>::sse_encode(value, serializer); + <(crate::api::api::SharedPushState, APSWatcher)>::sse_encode(value, serializer); } } } -impl SseEncode for Option>> { +impl SseEncode for Option<(String, String)> { // Codec=Sse (Serialization based), see doc to use other codecs fn sse_encode(self, serializer: &mut flutter_rust_bridge::for_generated::SseSerializer) { ::sse_encode(self.is_some(), serializer); if let Some(value) = self { - >>::sse_encode(value, serializer); + <(String, String)>::sse_encode(value, serializer); } } } -impl SseEncode for Option>> { +impl SseEncode for Option<(String, u64)> { // Codec=Sse (Serialization based), see doc to use other codecs fn sse_encode(self, serializer: &mut flutter_rust_bridge::for_generated::SseSerializer) { ::sse_encode(self.is_some(), serializer); if let Some(value) = self { - >>::sse_encode(value, serializer); + <(String, u64)>::sse_encode(value, serializer); } } } -impl SseEncode for Option>> { +impl SseEncode for Option { // Codec=Sse (Serialization based), see doc to use other codecs fn sse_encode(self, serializer: &mut flutter_rust_bridge::for_generated::SseSerializer) { ::sse_encode(self.is_some(), serializer); if let Some(value) = self { - >>::sse_encode(value, serializer); + ::sse_encode(value, serializer); } } } -impl SseEncode for Option>>> { +impl SseEncode for Option { // Codec=Sse (Serialization based), see doc to use other codecs fn sse_encode(self, serializer: &mut flutter_rust_bridge::for_generated::SseSerializer) { ::sse_encode(self.is_some(), serializer); if let Some(value) = self { - >>>::sse_encode(value, serializer); + ::sse_encode(value, serializer); } } } -impl SseEncode for Option>> { +impl SseEncode for Option { // Codec=Sse (Serialization based), see doc to use other codecs fn sse_encode(self, serializer: &mut flutter_rust_bridge::for_generated::SseSerializer) { ::sse_encode(self.is_some(), serializer); if let Some(value) = self { - >>::sse_encode(value, serializer); + ::sse_encode(value, serializer); } } } -impl SseEncode for Option { +impl SseEncode for Option { // Codec=Sse (Serialization based), see doc to use other codecs fn sse_encode(self, serializer: &mut flutter_rust_bridge::for_generated::SseSerializer) { ::sse_encode(self.is_some(), serializer); if let Some(value) = self { - ::sse_encode(value, serializer); + ::sse_encode(value, serializer); } } } -impl SseEncode for Option { +impl SseEncode for Option { // Codec=Sse (Serialization based), see doc to use other codecs fn sse_encode(self, serializer: &mut flutter_rust_bridge::for_generated::SseSerializer) { ::sse_encode(self.is_some(), serializer); if let Some(value) = self { - ::sse_encode(value, serializer); + ::sse_encode(value, serializer); } } } -impl SseEncode for Option> { +impl SseEncode for Option { // Codec=Sse (Serialization based), see doc to use other codecs fn sse_encode(self, serializer: &mut flutter_rust_bridge::for_generated::SseSerializer) { ::sse_encode(self.is_some(), serializer); if let Some(value) = self { - >::sse_encode(value, serializer); + ::sse_encode(value, serializer); } } } -impl SseEncode for Option { +impl SseEncode for Option { // Codec=Sse (Serialization based), see doc to use other codecs fn sse_encode(self, serializer: &mut flutter_rust_bridge::for_generated::SseSerializer) { ::sse_encode(self.is_some(), serializer); if let Some(value) = self { - ::sse_encode(value, serializer); + ::sse_encode(value, serializer); } } } -impl SseEncode for Option { +impl SseEncode for Option { // Codec=Sse (Serialization based), see doc to use other codecs fn sse_encode(self, serializer: &mut flutter_rust_bridge::for_generated::SseSerializer) { ::sse_encode(self.is_some(), serializer); if let Some(value) = self { - ::sse_encode(value, serializer); + ::sse_encode(value, serializer); } } } -impl SseEncode for Option { +impl SseEncode for Option { // Codec=Sse (Serialization based), see doc to use other codecs fn sse_encode(self, serializer: &mut flutter_rust_bridge::for_generated::SseSerializer) { ::sse_encode(self.is_some(), serializer); if let Some(value) = self { - ::sse_encode(value, serializer); + ::sse_encode(value, serializer); } } } -impl SseEncode for Option> { +impl SseEncode for Option { // Codec=Sse (Serialization based), see doc to use other codecs fn sse_encode(self, serializer: &mut flutter_rust_bridge::for_generated::SseSerializer) { ::sse_encode(self.is_some(), serializer); if let Some(value) = self { - >::sse_encode(value, serializer); + ::sse_encode(value, serializer); } } } -impl SseEncode for Option> { +impl SseEncode for Option { // Codec=Sse (Serialization based), see doc to use other codecs fn sse_encode(self, serializer: &mut flutter_rust_bridge::for_generated::SseSerializer) { ::sse_encode(self.is_some(), serializer); if let Some(value) = self { - >::sse_encode(value, serializer); + ::sse_encode(value, serializer); } } } -impl SseEncode for Option> { + +impl SseEncode for Option { // Codec=Sse (Serialization based), see doc to use other codecs fn sse_encode(self, serializer: &mut flutter_rust_bridge::for_generated::SseSerializer) { ::sse_encode(self.is_some(), serializer); if let Some(value) = self { - >::sse_encode(value, serializer); + ::sse_encode(value, serializer); } } } -impl SseEncode for Option> { +impl SseEncode for Option> { // Codec=Sse (Serialization based), see doc to use other codecs fn sse_encode(self, serializer: &mut flutter_rust_bridge::for_generated::SseSerializer) { ::sse_encode(self.is_some(), serializer); if let Some(value) = self { - >::sse_encode(value, serializer); + >::sse_encode(value, serializer); } } } -impl SseEncode for Option { +impl SseEncode for Option> { // Codec=Sse (Serialization based), see doc to use other codecs fn sse_encode(self, serializer: &mut flutter_rust_bridge::for_generated::SseSerializer) { ::sse_encode(self.is_some(), serializer); if let Some(value) = self { - ::sse_encode(value, serializer); + >::sse_encode(value, serializer); } } } -impl SseEncode for Option { +impl SseEncode for Option> { // Codec=Sse (Serialization based), see doc to use other codecs fn sse_encode(self, serializer: &mut flutter_rust_bridge::for_generated::SseSerializer) { ::sse_encode(self.is_some(), serializer); if let Some(value) = self { - ::sse_encode(value, serializer); + >::sse_encode(value, serializer); } } } -impl SseEncode for Option> { +impl SseEncode for Option> { // Codec=Sse (Serialization based), see doc to use other codecs fn sse_encode(self, serializer: &mut flutter_rust_bridge::for_generated::SseSerializer) { ::sse_encode(self.is_some(), serializer); if let Some(value) = self { - >::sse_encode(value, serializer); + >::sse_encode(value, serializer); } } } -impl SseEncode for Option> { +impl SseEncode for crate::api::api::PartExtension { // Codec=Sse (Serialization based), see doc to use other codecs fn sse_encode(self, serializer: &mut flutter_rust_bridge::for_generated::SseSerializer) { - ::sse_encode(self.is_some(), serializer); - if let Some(value) = self { - >::sse_encode(value, serializer); + match self { + crate::api::api::PartExtension::Sticker { + msg_width, + rotation, + sai, + scale, + update, + sli, + normalized_x, + normalized_y, + version, + hash, + safi, + effect_type, + sticker_id, + } => { + ::sse_encode(0, serializer); + ::sse_encode(msg_width, serializer); + ::sse_encode(rotation, serializer); + ::sse_encode(sai, serializer); + ::sse_encode(scale, serializer); + >::sse_encode(update, serializer); + ::sse_encode(sli, serializer); + ::sse_encode(normalized_x, serializer); + ::sse_encode(normalized_y, serializer); + ::sse_encode(version, serializer); + ::sse_encode(hash, serializer); + ::sse_encode(safi, serializer); + ::sse_encode(effect_type, serializer); + ::sse_encode(sticker_id, serializer); + } + _ => { + unimplemented!(""); + } } } } -impl SseEncode for Option { +impl SseEncode for crate::api::api::Passkey { // Codec=Sse (Serialization based), see doc to use other codecs fn sse_encode(self, serializer: &mut flutter_rust_bridge::for_generated::SseSerializer) { - ::sse_encode(self.is_some(), serializer); - if let Some(value) = self { - ::sse_encode(value, serializer); - } + ::sse_encode(self.cdat, serializer); + ::sse_encode(self.mdat, serializer); + ::sse_encode(self.agrp, serializer); + ::sse_encode(self.labl, serializer); + >::sse_encode(self.data, serializer); + >::sse_encode(self.atag, serializer); + >::sse_encode(self.klbl, serializer); } } -impl SseEncode for Option { +impl SseEncode for crate::api::api::PasswordManagerAltDomain { // Codec=Sse (Serialization based), see doc to use other codecs fn sse_encode(self, serializer: &mut flutter_rust_bridge::for_generated::SseSerializer) { - ::sse_encode(self.is_some(), serializer); - if let Some(value) = self { - ::sse_encode(value, serializer); + ::sse_encode(self.domain, serializer); + } +} + +impl SseEncode for crate::api::api::PasswordManagerMeta { + // Codec=Sse (Serialization based), see doc to use other codecs + fn sse_encode(self, serializer: &mut flutter_rust_bridge::for_generated::SseSerializer) { + ::sse_encode(self.cdat, serializer); + ::sse_encode(self.mdat, serializer); + ::sse_encode(self.srvr, serializer); + ::sse_encode(self.acct, serializer); + ::sse_encode(self.agrp, serializer); + >::sse_encode(self.data, serializer); + } +} + +impl SseEncode for crate::api::api::PasswordManagerMetaChange { + // Codec=Sse (Serialization based), see doc to use other codecs + fn sse_encode(self, serializer: &mut flutter_rust_bridge::for_generated::SseSerializer) { + ::sse_encode(self.date, serializer); + >::sse_encode(self.password, serializer); + >::sse_encode(self.old_password, serializer); + >::sse_encode(self.group_name, serializer); + >::sse_encode(self.group_id, serializer); + >::sse_encode(self.share_type, serializer); + ::sse_encode(self.id, serializer); + ::sse_encode(self.typ, serializer); + } +} + +impl SseEncode for crate::api::api::PasswordManagerMetaData { + // Codec=Sse (Serialization based), see doc to use other codecs + fn sse_encode(self, serializer: &mut flutter_rust_bridge::for_generated::SseSerializer) { + >::sse_encode(self.history, serializer); + >::sse_encode(self.alt_domains, serializer); + >::sse_encode(self.totp, serializer); + >::sse_encode(self.ctxt, serializer); + >>::sse_encode(self.title, serializer); + >>::sse_encode(self.notes, serializer); + >::sse_encode( + self.formerly_shared, + serializer, + ); + >>::sse_encode(self.ocpid, serializer); + } +} + +impl SseEncode for crate::api::api::PasswordManagerMetaDataCtx { + // Codec=Sse (Serialization based), see doc to use other codecs + fn sse_encode(self, serializer: &mut flutter_rust_bridge::for_generated::SseSerializer) { + ::sse_encode(self.last_used, serializer); + } +} + +impl SseEncode for crate::api::api::PasswordManagerMetaDataFormerlyShared { + // Codec=Sse (Serialization based), see doc to use other codecs + fn sse_encode(self, serializer: &mut flutter_rust_bridge::for_generated::SseSerializer) { + >::sse_encode(self.group_name, serializer); + >::sse_encode(self.password_manager_credential_identifier, serializer); + } +} + +impl SseEncode for crate::api::api::PasswordManagerTotp { + // Codec=Sse (Serialization based), see doc to use other codecs + fn sse_encode(self, serializer: &mut flutter_rust_bridge::for_generated::SseSerializer) { + >::sse_encode(self.secret, serializer); + ::sse_encode(self.digits, serializer); + >::sse_encode(self.issuer, serializer); + ::sse_encode(self.period, serializer); + ::sse_encode(self.initial_date, serializer); + ::sse_encode(self.algorithm, serializer); + >::sse_encode(self.account_name, serializer); + >::sse_encode(self.original_url, serializer); + } +} + +impl SseEncode for crate::api::api::PasswordRawEntry { + // Codec=Sse (Serialization based), see doc to use other codecs + fn sse_encode(self, serializer: &mut flutter_rust_bridge::for_generated::SseSerializer) { + ::sse_encode(self.cdat, serializer); + ::sse_encode(self.mdat, serializer); + ::sse_encode(self.srvr, serializer); + ::sse_encode(self.acct, serializer); + ::sse_encode(self.agrp, serializer); + >::sse_encode(self.data, serializer); + } +} + +impl SseEncode for crate::api::api::PermanentDeleteMessage { + // Codec=Sse (Serialization based), see doc to use other codecs + fn sse_encode(self, serializer: &mut flutter_rust_bridge::for_generated::SseSerializer) { + ::sse_encode(self.target, serializer); + ::sse_encode(self.is_scheduled, serializer); + } +} + +impl SseEncode for crate::api::api::PhotoPosterContents { + // Codec=Sse (Serialization based), see doc to use other codecs + fn sse_encode(self, serializer: &mut flutter_rust_bridge::for_generated::SseSerializer) { + ::sse_encode(self.version, serializer); + >::sse_encode(self.layers, serializer); + ::sse_encode(self.properties, serializer); + } +} + +impl SseEncode for crate::api::api::PhotoPosterContentsFrame { + // Codec=Sse (Serialization based), see doc to use other codecs + fn sse_encode(self, serializer: &mut flutter_rust_bridge::for_generated::SseSerializer) { + ::sse_encode(self.width, serializer); + ::sse_encode(self.height, serializer); + ::sse_encode(self.x, serializer); + ::sse_encode(self.y, serializer); + } +} + +impl SseEncode for crate::api::api::PhotoPosterContentsSize { + // Codec=Sse (Serialization based), see doc to use other codecs + fn sse_encode(self, serializer: &mut flutter_rust_bridge::for_generated::SseSerializer) { + ::sse_encode(self.width, serializer); + ::sse_encode(self.height, serializer); + } +} + +impl SseEncode for crate::api::api::PhotoPosterLayer { + // Codec=Sse (Serialization based), see doc to use other codecs + fn sse_encode(self, serializer: &mut flutter_rust_bridge::for_generated::SseSerializer) { + ::sse_encode(self.frame, serializer); + ::sse_encode(self.filename, serializer); + ::sse_encode(self.z_position, serializer); + ::sse_encode(self.identifier, serializer); + } +} + +impl SseEncode for crate::api::api::PhotoPosterLayout { + // Codec=Sse (Serialization based), see doc to use other codecs + fn sse_encode(self, serializer: &mut flutter_rust_bridge::for_generated::SseSerializer) { + ::sse_encode(self.clock_intersection, serializer); + ::sse_encode(self.device_resolution, serializer); + ::sse_encode(self.visible_frame, serializer); + ::sse_encode(self.time_frame, serializer); + ::sse_encode(self.clock_layer_order, serializer); + ::sse_encode(self.has_top_edge_contact, serializer); + ::sse_encode(self.inactive_frame, serializer); + ::sse_encode(self.image_size, serializer); + ::sse_encode(self.parallax_padding, serializer); + } +} + +impl SseEncode for crate::api::api::PhotoPosterProperties { + // Codec=Sse (Serialization based), see doc to use other codecs + fn sse_encode(self, serializer: &mut flutter_rust_bridge::for_generated::SseSerializer) { + ::sse_encode(self.portrait_layout, serializer); + ::sse_encode(self.settling_effect_enabled, serializer); + ::sse_encode(self.depth_enabled, serializer); + ::sse_encode(self.clock_area_luminance, serializer); + ::sse_encode(self.parallax_disabled, serializer); + } +} + +impl SseEncode for crate::api::api::PollResult { + // Codec=Sse (Serialization based), see doc to use other codecs + fn sse_encode(self, serializer: &mut flutter_rust_bridge::for_generated::SseSerializer) { + match self { + crate::api::api::PollResult::Stop => { + ::sse_encode(0, serializer); + } + crate::api::api::PollResult::Cont(field0) => { + ::sse_encode(1, serializer); + >::sse_encode(field0, serializer); + } + _ => { + unimplemented!(""); + } } } } -impl SseEncode for Option> { +impl SseEncode for crate::api::api::PosterAsset { // Codec=Sse (Serialization based), see doc to use other codecs fn sse_encode(self, serializer: &mut flutter_rust_bridge::for_generated::SseSerializer) { - ::sse_encode(self.is_some(), serializer); - if let Some(value) = self { - >::sse_encode(value, serializer); + ::sse_encode(self.contents, serializer); + >>::sse_encode(self.files, serializer); + ::sse_encode(self.uuid, serializer); + } +} + +impl SseEncode for crate::api::api::PosterColor { + // Codec=Sse (Serialization based), see doc to use other codecs + fn sse_encode(self, serializer: &mut flutter_rust_bridge::for_generated::SseSerializer) { + ::sse_encode(self.alpha, serializer); + ::sse_encode(self.blue, serializer); + ::sse_encode(self.green, serializer); + ::sse_encode(self.red, serializer); + } +} + +impl SseEncode for crate::api::api::PosterRole { + // Codec=Sse (Serialization based), see doc to use other codecs + fn sse_encode(self, serializer: &mut flutter_rust_bridge::for_generated::SseSerializer) { + ::sse_encode( + match self { + crate::api::api::PosterRole::PRPosterRoleBackdrop => 0, + crate::api::api::PosterRole::PRPosterRoleIncomingCall => 1, + _ => { + unimplemented!(""); + } + }, + serializer, + ); + } +} + +impl SseEncode for crate::api::api::PosterType { + // Codec=Sse (Serialization based), see doc to use other codecs + fn sse_encode(self, serializer: &mut flutter_rust_bridge::for_generated::SseSerializer) { + match self { + crate::api::api::PosterType::Photo { assets } => { + ::sse_encode(0, serializer); + >::sse_encode(assets, serializer); + } + crate::api::api::PosterType::Monogram { data, background } => { + ::sse_encode(1, serializer); + ::sse_encode(data, serializer); + ::sse_encode(background, serializer); + } + crate::api::api::PosterType::Memoji { data, background } => { + ::sse_encode(2, serializer); + ::sse_encode(data, serializer); + ::sse_encode(background, serializer); + } + crate::api::api::PosterType::TranscriptDynamic { data } => { + ::sse_encode(3, serializer); + ::sse_encode(data, serializer); + } + crate::api::api::PosterType::TranscriptGradient { colors } => { + ::sse_encode(4, serializer); + >::sse_encode(colors, serializer); + } + _ => { + unimplemented!(""); + } } } } -impl SseEncode for Option { +impl SseEncode for crate::api::api::PRPosterColor { // Codec=Sse (Serialization based), see doc to use other codecs fn sse_encode(self, serializer: &mut flutter_rust_bridge::for_generated::SseSerializer) { - ::sse_encode(self.is_some(), serializer); - if let Some(value) = self { - ::sse_encode(value, serializer); + ::sse_encode(self.preferred_style, serializer); + ::sse_encode(self.identifier, serializer); + ::sse_encode(self.suggested, serializer); + ::sse_encode(self.color, serializer); + } +} + +impl SseEncode for crate::api::api::PRPosterContentMaterialStyle { + // Codec=Sse (Serialization based), see doc to use other codecs + fn sse_encode(self, serializer: &mut flutter_rust_bridge::for_generated::SseSerializer) { + match self { + crate::api::api::PRPosterContentMaterialStyle::PRPosterContentDiscreteColorsStyle { + variation, + colors, + vibrant, + supports_variation, + needs_to_resolve_variation, + } => { + ::sse_encode(0, serializer); + ::sse_encode(variation, serializer); + >::sse_encode(colors, serializer); + ::sse_encode(vibrant, serializer); + ::sse_encode(supports_variation, serializer); + ::sse_encode(needs_to_resolve_variation, serializer); + } + crate::api::api::PRPosterContentMaterialStyle::PRPosterContentVibrantMaterialStyle => { + ::sse_encode(1, serializer); + } + crate::api::api::PRPosterContentMaterialStyle::PRPosterContentGradientStyle { + gradient_type, + colors, + start_point, + locations, + end_point, + } => { + ::sse_encode(2, serializer); + ::sse_encode(gradient_type, serializer); + >::sse_encode(colors, serializer); + ::sse_encode(start_point, serializer); + >::sse_encode(locations, serializer); + ::sse_encode(end_point, serializer); + } + _ => { + unimplemented!(""); + } } } } -impl SseEncode for Option { +impl SseEncode for crate::api::api::PRPosterSystemTimeFontConfiguration { // Codec=Sse (Serialization based), see doc to use other codecs fn sse_encode(self, serializer: &mut flutter_rust_bridge::for_generated::SseSerializer) { - ::sse_encode(self.is_some(), serializer); - if let Some(value) = self { - ::sse_encode(value, serializer); + ::sse_encode(self.is_system_item, serializer); + ::sse_encode(self.time_font_identifier, serializer); + ::sse_encode(self.weight, serializer); + } +} + +impl SseEncode for crate::api::api::PRPosterTitleStyleConfiguration { + // Codec=Sse (Serialization based), see doc to use other codecs + fn sse_encode(self, serializer: &mut flutter_rust_bridge::for_generated::SseSerializer) { + ::sse_encode(self.alternate_date_enabled, serializer); + ::sse_encode(self.contents_luminence, serializer); + ::sse_encode(self.group_name, serializer); + ::sse_encode(self.preferred_title_alignment, serializer); + ::sse_encode(self.preferred_title_layout, serializer); + ::sse_encode( + self.time_font_configuration, + serializer, + ); + >>::sse_encode(self.time_numbering_system, serializer); + ::sse_encode(self.title_color, serializer); + >::sse_encode(self.title_content_style, serializer); + ::sse_encode(self.user_configured, serializer); + >::sse_encode( + self.title_style, + serializer, + ); + } +} + +impl SseEncode for crate::api::api::PrivateDeviceInfo { + // Codec=Sse (Serialization based), see doc to use other codecs + fn sse_encode(self, serializer: &mut flutter_rust_bridge::for_generated::SseSerializer) { + >::sse_encode(self.uuid, serializer); + >::sse_encode(self.device_name, serializer); + >::sse_encode(self.token, serializer); + ::sse_encode(self.is_hsa_trusted, serializer); + >::sse_encode(self.identites, serializer); + >::sse_encode(self.sub_services, serializer); + } +} + +impl SseEncode for crate::api::api::ProvisionedFlavor { + // Codec=Sse (Serialization based), see doc to use other codecs + fn sse_encode(self, serializer: &mut flutter_rust_bridge::for_generated::SseSerializer) { + ::sse_encode( + match self { + crate::api::api::ProvisionedFlavor::Mac => 0, + crate::api::api::ProvisionedFlavor::IOS => 1, + _ => { + unimplemented!(""); + } + }, + serializer, + ); + } +} + +impl SseEncode for crate::api::api::PushMessage { + // Codec=Sse (Serialization based), see doc to use other codecs + fn sse_encode(self, serializer: &mut flutter_rust_bridge::for_generated::SseSerializer) { + match self { + crate::api::api::PushMessage::IMessage(field0) => { + ::sse_encode(0, serializer); + ::sse_encode(field0, serializer); + } + crate::api::api::PushMessage::SendConfirm { uuid, error } => { + ::sse_encode(1, serializer); + ::sse_encode(uuid, serializer); + >::sse_encode(error, serializer); + } + crate::api::api::PushMessage::RegistrationState(field0) => { + ::sse_encode(2, serializer); + ::sse_encode(field0, serializer); + } + crate::api::api::PushMessage::NewPhotostream(field0) => { + ::sse_encode(3, serializer); + ::sse_encode(field0, serializer); + } + crate::api::api::PushMessage::FaceTime(field0) => { + ::sse_encode(4, serializer); + ::sse_encode(field0, serializer); + } + crate::api::api::PushMessage::StatusUpdate(field0) => { + ::sse_encode(5, serializer); + ::sse_encode(field0, serializer); + } + crate::api::api::PushMessage::Idms(field0) => { + ::sse_encode(6, serializer); + ::sse_encode(field0, serializer); + } + crate::api::api::PushMessage::TwoFaAuthEvent(field0) => { + ::sse_encode(7, serializer); + ::sse_encode(field0, serializer); + } + crate::api::api::PushMessage::CircleFinishEvent => { + ::sse_encode(8, serializer); + } + crate::api::api::PushMessage::BeaconShared { + sender, + beacon, + attributes, + } => { + ::sse_encode(9, serializer); + ::sse_encode(sender, serializer); + ::sse_encode(beacon, serializer); + ::sse_encode(attributes, serializer); + } + _ => { + unimplemented!(""); + } } } } -impl SseEncode for Option { +impl SseEncode for crate::api::api::QuotaInfo { // Codec=Sse (Serialization based), see doc to use other codecs fn sse_encode(self, serializer: &mut flutter_rust_bridge::for_generated::SseSerializer) { - ::sse_encode(self.is_some(), serializer); - if let Some(value) = self { - ::sse_encode(value, serializer); - } + ::sse_encode(self.total_bytes, serializer); + ::sse_encode(self.available_bytes, serializer); + ::sse_encode(self.messages_bytes, serializer); } } -impl SseEncode for Option { +impl SseEncode for crate::api::api::ReactMessage { // Codec=Sse (Serialization based), see doc to use other codecs fn sse_encode(self, serializer: &mut flutter_rust_bridge::for_generated::SseSerializer) { - ::sse_encode(self.is_some(), serializer); - if let Some(value) = self { - ::sse_encode(value, serializer); - } + ::sse_encode(self.to_uuid, serializer); + >::sse_encode(self.to_part, serializer); + ::sse_encode(self.reaction, serializer); + ::sse_encode(self.to_text, serializer); + >::sse_encode( + self.embedded_profile, + serializer, + ); } } -impl SseEncode for Option { +impl SseEncode for crate::api::api::ReactMessageType { // Codec=Sse (Serialization based), see doc to use other codecs fn sse_encode(self, serializer: &mut flutter_rust_bridge::for_generated::SseSerializer) { - ::sse_encode(self.is_some(), serializer); - if let Some(value) = self { - ::sse_encode(value, serializer); + match self { + crate::api::api::ReactMessageType::React { reaction, enable } => { + ::sse_encode(0, serializer); + ::sse_encode(reaction, serializer); + ::sse_encode(enable, serializer); + } + crate::api::api::ReactMessageType::Extension { + spec, + body, + is_meta, + } => { + ::sse_encode(1, serializer); + ::sse_encode(spec, serializer); + ::sse_encode(body, serializer); + ::sse_encode(is_meta, serializer); + } + _ => { + unimplemented!(""); + } } } } -impl SseEncode for Option { +impl SseEncode for crate::api::api::Reaction { // Codec=Sse (Serialization based), see doc to use other codecs fn sse_encode(self, serializer: &mut flutter_rust_bridge::for_generated::SseSerializer) { - ::sse_encode(self.is_some(), serializer); - if let Some(value) = self { - ::sse_encode(value, serializer); + match self { + crate::api::api::Reaction::Heart => { + ::sse_encode(0, serializer); + } + crate::api::api::Reaction::Like => { + ::sse_encode(1, serializer); + } + crate::api::api::Reaction::Dislike => { + ::sse_encode(2, serializer); + } + crate::api::api::Reaction::Laugh => { + ::sse_encode(3, serializer); + } + crate::api::api::Reaction::Emphasize => { + ::sse_encode(4, serializer); + } + crate::api::api::Reaction::Question => { + ::sse_encode(5, serializer); + } + crate::api::api::Reaction::Emoji(field0) => { + ::sse_encode(6, serializer); + ::sse_encode(field0, serializer); + } + crate::api::api::Reaction::Sticker { spec, body } => { + ::sse_encode(7, serializer); + >::sse_encode(spec, serializer); + ::sse_encode(body, serializer); + } + _ => { + unimplemented!(""); + } } } } -impl SseEncode for Option { +impl SseEncode for (APSConnection, Option) { // Codec=Sse (Serialization based), see doc to use other codecs fn sse_encode(self, serializer: &mut flutter_rust_bridge::for_generated::SseSerializer) { - ::sse_encode(self.is_some(), serializer); - if let Some(value) = self { - ::sse_encode(value, serializer); - } + ::sse_encode(self.0, serializer); + >::sse_encode(self.1, serializer); } } -impl SseEncode for Option { +impl SseEncode + for ( + Arc>>, + crate::api::api::LoginState, + ) +{ // Codec=Sse (Serialization based), see doc to use other codecs fn sse_encode(self, serializer: &mut flutter_rust_bridge::for_generated::SseSerializer) { - ::sse_encode(self.is_some(), serializer); - if let Some(value) = self { - ::sse_encode(value, serializer); - } + >>>::sse_encode(self.0, serializer); + ::sse_encode(self.1, serializer); } } -impl SseEncode for Option { +impl SseEncode for (Arc, crate::api::api::SharedPushState) { // Codec=Sse (Serialization based), see doc to use other codecs fn sse_encode(self, serializer: &mut flutter_rust_bridge::for_generated::SseSerializer) { - ::sse_encode(self.is_some(), serializer); - if let Some(value) = self { - ::sse_encode(value, serializer); - } + >::sse_encode(self.0, serializer); + ::sse_encode(self.1, serializer); } } -impl SseEncode for Option { +impl SseEncode + for ( + CircleClientSession, + crate::api::api::LoginState, + Option, + ) +{ // Codec=Sse (Serialization based), see doc to use other codecs fn sse_encode(self, serializer: &mut flutter_rust_bridge::for_generated::SseSerializer) { - ::sse_encode(self.is_some(), serializer); - if let Some(value) = self { - ::sse_encode(value, serializer); - } + >::sse_encode(self.0, serializer); + ::sse_encode(self.1, serializer); + >::sse_encode(self.2, serializer); } } -impl SseEncode for Option { +impl SseEncode for (Sender<()>, Arc>, APSWatcher) { // Codec=Sse (Serialization based), see doc to use other codecs fn sse_encode(self, serializer: &mut flutter_rust_bridge::for_generated::SseSerializer) { - ::sse_encode(self.is_some(), serializer); - if let Some(value) = self { - ::sse_encode(value, serializer); - } + >::sse_encode(self.0, serializer); + >>::sse_encode(self.1, serializer); + ::sse_encode(self.2, serializer); } } -impl SseEncode for Option { +impl SseEncode + for ( + Vec, + std::collections::HashMap>, + i32, + ) +{ // Codec=Sse (Serialization based), see doc to use other codecs fn sse_encode(self, serializer: &mut flutter_rust_bridge::for_generated::SseSerializer) { - ::sse_encode(self.is_some(), serializer); - if let Some(value) = self { - ::sse_encode(value, serializer); - } + >::sse_encode(self.0, serializer); + >>::sse_encode( + self.1, serializer, + ); + ::sse_encode(self.2, serializer); } } -impl SseEncode for Option { +impl SseEncode + for ( + Vec, + std::collections::HashMap>, + i32, + ) +{ // Codec=Sse (Serialization based), see doc to use other codecs fn sse_encode(self, serializer: &mut flutter_rust_bridge::for_generated::SseSerializer) { - ::sse_encode(self.is_some(), serializer); - if let Some(value) = self { - ::sse_encode(value, serializer); - } + >::sse_encode(self.0, serializer); + >>::sse_encode( + self.1, serializer, + ); + ::sse_encode(self.2, serializer); } } -impl SseEncode for Option { +impl SseEncode + for ( + Vec, + std::collections::HashMap>, + i32, + ) +{ // Codec=Sse (Serialization based), see doc to use other codecs fn sse_encode(self, serializer: &mut flutter_rust_bridge::for_generated::SseSerializer) { - ::sse_encode(self.is_some(), serializer); - if let Some(value) = self { - ::sse_encode(value, serializer); - } + >::sse_encode(self.0, serializer); + >>::sse_encode( + self.1, serializer, + ); + ::sse_encode(self.2, serializer); } } -impl SseEncode for Option { +impl SseEncode for (Vec, Option>) { // Codec=Sse (Serialization based), see doc to use other codecs fn sse_encode(self, serializer: &mut flutter_rust_bridge::for_generated::SseSerializer) { - ::sse_encode(self.is_some(), serializer); - if let Some(value) = self { - ::sse_encode(value, serializer); - } + >::sse_encode(self.0, serializer); + >>::sse_encode(self.1, serializer); } } -impl SseEncode for Option { +impl SseEncode for (Vec, Vec) { // Codec=Sse (Serialization based), see doc to use other codecs fn sse_encode(self, serializer: &mut flutter_rust_bridge::for_generated::SseSerializer) { - ::sse_encode(self.is_some(), serializer); - if let Some(value) = self { - ::sse_encode(value, serializer); - } + >::sse_encode(self.0, serializer); + >::sse_encode(self.1, serializer); } } -impl SseEncode for Option { +impl SseEncode + for ( + Vec, + Option, + ) +{ // Codec=Sse (Serialization based), see doc to use other codecs fn sse_encode(self, serializer: &mut flutter_rust_bridge::for_generated::SseSerializer) { - ::sse_encode(self.is_some(), serializer); - if let Some(value) = self { - ::sse_encode(value, serializer); - } + >::sse_encode(self.0, serializer); + >::sse_encode(self.1, serializer); } } -impl SseEncode for Option { +impl SseEncode for (crate::api::api::LoginState, Option) { // Codec=Sse (Serialization based), see doc to use other codecs fn sse_encode(self, serializer: &mut flutter_rust_bridge::for_generated::SseSerializer) { - ::sse_encode(self.is_some(), serializer); - if let Some(value) = self { - ::sse_encode(value, serializer); - } + ::sse_encode(self.0, serializer); + >::sse_encode(self.1, serializer); } } -impl SseEncode for Option { +impl SseEncode + for ( + std::collections::HashMap, + Option<(String, u64)>, + ) +{ // Codec=Sse (Serialization based), see doc to use other codecs fn sse_encode(self, serializer: &mut flutter_rust_bridge::for_generated::SseSerializer) { - ::sse_encode(self.is_some(), serializer); - if let Some(value) = self { - ::sse_encode(value, serializer); - } + >::sse_encode( + self.0, serializer, + ); + >::sse_encode(self.1, serializer); } } -impl SseEncode for Option { +impl SseEncode for (Option>, Option) { // Codec=Sse (Serialization based), see doc to use other codecs fn sse_encode(self, serializer: &mut flutter_rust_bridge::for_generated::SseSerializer) { - ::sse_encode(self.is_some(), serializer); - if let Some(value) = self { - ::sse_encode(value, serializer); - } + >>::sse_encode(self.0, serializer); + >::sse_encode(self.1, serializer); } } -impl SseEncode for Option { +impl SseEncode for (Option, crate::api::api::Passkey) { // Codec=Sse (Serialization based), see doc to use other codecs fn sse_encode(self, serializer: &mut flutter_rust_bridge::for_generated::SseSerializer) { - ::sse_encode(self.is_some(), serializer); - if let Some(value) = self { - ::sse_encode(value, serializer); - } + >::sse_encode(self.0, serializer); + ::sse_encode(self.1, serializer); } } -impl SseEncode for Option { +impl SseEncode for (Option, crate::api::api::PasswordManagerMeta) { // Codec=Sse (Serialization based), see doc to use other codecs fn sse_encode(self, serializer: &mut flutter_rust_bridge::for_generated::SseSerializer) { - ::sse_encode(self.is_some(), serializer); - if let Some(value) = self { - ::sse_encode(value, serializer); - } + >::sse_encode(self.0, serializer); + ::sse_encode(self.1, serializer); } } -impl SseEncode for Option { +impl SseEncode for (Option, crate::api::api::PasswordRawEntry) { // Codec=Sse (Serialization based), see doc to use other codecs fn sse_encode(self, serializer: &mut flutter_rust_bridge::for_generated::SseSerializer) { - ::sse_encode(self.is_some(), serializer); - if let Some(value) = self { - ::sse_encode(value, serializer); - } + >::sse_encode(self.0, serializer); + ::sse_encode(self.1, serializer); } } -impl SseEncode for Option { +impl SseEncode for (Option, crate::api::api::WifiPassword) { // Codec=Sse (Serialization based), see doc to use other codecs fn sse_encode(self, serializer: &mut flutter_rust_bridge::for_generated::SseSerializer) { - ::sse_encode(self.is_some(), serializer); - if let Some(value) = self { - ::sse_encode(value, serializer); - } + >::sse_encode(self.0, serializer); + ::sse_encode(self.1, serializer); } } -impl SseEncode for Option { +impl SseEncode for (crate::api::api::SharedPushState, APSWatcher) { // Codec=Sse (Serialization based), see doc to use other codecs fn sse_encode(self, serializer: &mut flutter_rust_bridge::for_generated::SseSerializer) { - ::sse_encode(self.is_some(), serializer); - if let Some(value) = self { - ::sse_encode(value, serializer); - } + ::sse_encode(self.0, serializer); + ::sse_encode(self.1, serializer); } } -impl SseEncode for Option { +impl SseEncode for (String, Asset) { // Codec=Sse (Serialization based), see doc to use other codecs fn sse_encode(self, serializer: &mut flutter_rust_bridge::for_generated::SseSerializer) { - ::sse_encode(self.is_some(), serializer); - if let Some(value) = self { - ::sse_encode(value, serializer); - } + ::sse_encode(self.0, serializer); + ::sse_encode(self.1, serializer); } } -impl SseEncode for Option { +impl SseEncode for (String, StCollapsedValue) { // Codec=Sse (Serialization based), see doc to use other codecs fn sse_encode(self, serializer: &mut flutter_rust_bridge::for_generated::SseSerializer) { - ::sse_encode(self.is_some(), serializer); - if let Some(value) = self { - ::sse_encode(value, serializer); - } + ::sse_encode(self.0, serializer); + ::sse_encode(self.1, serializer); } } -impl SseEncode for Option { +impl SseEncode for (String, bool) { // Codec=Sse (Serialization based), see doc to use other codecs fn sse_encode(self, serializer: &mut flutter_rust_bridge::for_generated::SseSerializer) { - ::sse_encode(self.is_some(), serializer); - if let Some(value) = self { - ::sse_encode(value, serializer); - } + ::sse_encode(self.0, serializer); + ::sse_encode(self.1, serializer); } } -impl SseEncode for Option { +impl SseEncode for (String, u64) { // Codec=Sse (Serialization based), see doc to use other codecs fn sse_encode(self, serializer: &mut flutter_rust_bridge::for_generated::SseSerializer) { - ::sse_encode(self.is_some(), serializer); - if let Some(value) = self { - ::sse_encode(value, serializer); - } + ::sse_encode(self.0, serializer); + ::sse_encode(self.1, serializer); } } -impl SseEncode for Option { +impl SseEncode for (String, crate::api::api::CloudAttachment) { // Codec=Sse (Serialization based), see doc to use other codecs fn sse_encode(self, serializer: &mut flutter_rust_bridge::for_generated::SseSerializer) { - ::sse_encode(self.is_some(), serializer); - if let Some(value) = self { - ::sse_encode(value, serializer); - } + ::sse_encode(self.0, serializer); + ::sse_encode(self.1, serializer); } } -impl SseEncode for Option { +impl SseEncode for (String, crate::api::api::CloudChat) { // Codec=Sse (Serialization based), see doc to use other codecs fn sse_encode(self, serializer: &mut flutter_rust_bridge::for_generated::SseSerializer) { - ::sse_encode(self.is_some(), serializer); - if let Some(value) = self { - ::sse_encode(value, serializer); - } + ::sse_encode(self.0, serializer); + ::sse_encode(self.1, serializer); } } -impl SseEncode for Option { +impl SseEncode for (String, crate::api::api::CloudMessage) { // Codec=Sse (Serialization based), see doc to use other codecs fn sse_encode(self, serializer: &mut flutter_rust_bridge::for_generated::SseSerializer) { - ::sse_encode(self.is_some(), serializer); - if let Some(value) = self { - ::sse_encode(value, serializer); - } + ::sse_encode(self.0, serializer); + ::sse_encode(self.1, serializer); } } -impl SseEncode for Option { +impl SseEncode for (String, crate::api::api::FTParticipant) { // Codec=Sse (Serialization based), see doc to use other codecs fn sse_encode(self, serializer: &mut flutter_rust_bridge::for_generated::SseSerializer) { - ::sse_encode(self.is_some(), serializer); - if let Some(value) = self { - ::sse_encode(value, serializer); - } + ::sse_encode(self.0, serializer); + ::sse_encode(self.1, serializer); } } -impl SseEncode for Option { +impl SseEncode for (String, crate::api::api::GroupSummary) { // Codec=Sse (Serialization based), see doc to use other codecs fn sse_encode(self, serializer: &mut flutter_rust_bridge::for_generated::SseSerializer) { - ::sse_encode(self.is_some(), serializer); - if let Some(value) = self { - ::sse_encode(value, serializer); - } + ::sse_encode(self.0, serializer); + ::sse_encode(self.1, serializer); } } -impl SseEncode for Option { +impl SseEncode for (String, Vec) { // Codec=Sse (Serialization based), see doc to use other codecs fn sse_encode(self, serializer: &mut flutter_rust_bridge::for_generated::SseSerializer) { - ::sse_encode(self.is_some(), serializer); - if let Some(value) = self { - ::sse_encode(value, serializer); - } + ::sse_encode(self.0, serializer); + >::sse_encode(self.1, serializer); } } -impl SseEncode for Option { +impl SseEncode for (String, Vec) { // Codec=Sse (Serialization based), see doc to use other codecs fn sse_encode(self, serializer: &mut flutter_rust_bridge::for_generated::SseSerializer) { - ::sse_encode(self.is_some(), serializer); - if let Some(value) = self { - ::sse_encode(value, serializer); - } + ::sse_encode(self.0, serializer); + >::sse_encode(self.1, serializer); } } -impl SseEncode for Option<(crate::api::api::SharedPushState, APSWatcher)> { +impl SseEncode + for ( + String, + std::collections::HashMap, + std::collections::HashMap, + ) +{ // Codec=Sse (Serialization based), see doc to use other codecs fn sse_encode(self, serializer: &mut flutter_rust_bridge::for_generated::SseSerializer) { - ::sse_encode(self.is_some(), serializer); - if let Some(value) = self { - <(crate::api::api::SharedPushState, APSWatcher)>::sse_encode(value, serializer); - } + ::sse_encode(self.0, serializer); + >::sse_encode( + self.1, serializer, + ); + >::sse_encode( + self.2, serializer, + ); } } -impl SseEncode for Option<(String, String)> { +impl SseEncode for (String, crate::api::api::MessageEditRange) { // Codec=Sse (Serialization based), see doc to use other codecs fn sse_encode(self, serializer: &mut flutter_rust_bridge::for_generated::SseSerializer) { - ::sse_encode(self.is_some(), serializer); - if let Some(value) = self { - <(String, String)>::sse_encode(value, serializer); - } + ::sse_encode(self.0, serializer); + ::sse_encode(self.1, serializer); } } -impl SseEncode for Option<(String, u64)> { +impl SseEncode for (String, Option) { // Codec=Sse (Serialization based), see doc to use other codecs fn sse_encode(self, serializer: &mut flutter_rust_bridge::for_generated::SseSerializer) { - ::sse_encode(self.is_some(), serializer); - if let Some(value) = self { - <(String, u64)>::sse_encode(value, serializer); - } + ::sse_encode(self.0, serializer); + >::sse_encode(self.1, serializer); } } -impl SseEncode for Option { +impl SseEncode for (String, Option) { // Codec=Sse (Serialization based), see doc to use other codecs fn sse_encode(self, serializer: &mut flutter_rust_bridge::for_generated::SseSerializer) { - ::sse_encode(self.is_some(), serializer); - if let Some(value) = self { - ::sse_encode(value, serializer); - } + ::sse_encode(self.0, serializer); + >::sse_encode(self.1, serializer); } } -impl SseEncode for Option { +impl SseEncode for (String, Option) { // Codec=Sse (Serialization based), see doc to use other codecs fn sse_encode(self, serializer: &mut flutter_rust_bridge::for_generated::SseSerializer) { - ::sse_encode(self.is_some(), serializer); - if let Some(value) = self { - ::sse_encode(value, serializer); - } + ::sse_encode(self.0, serializer); + >::sse_encode(self.1, serializer); } } -impl SseEncode for Option { +impl SseEncode for (String, crate::api::api::PasswordManagerMetaDataCtx) { // Codec=Sse (Serialization based), see doc to use other codecs fn sse_encode(self, serializer: &mut flutter_rust_bridge::for_generated::SseSerializer) { - ::sse_encode(self.is_some(), serializer); - if let Some(value) = self { - ::sse_encode(value, serializer); - } + ::sse_encode(self.0, serializer); + ::sse_encode(self.1, serializer); } } -impl SseEncode for Option { +impl SseEncode for (String, (Option, crate::api::api::Passkey)) { // Codec=Sse (Serialization based), see doc to use other codecs fn sse_encode(self, serializer: &mut flutter_rust_bridge::for_generated::SseSerializer) { - ::sse_encode(self.is_some(), serializer); - if let Some(value) = self { - ::sse_encode(value, serializer); - } + ::sse_encode(self.0, serializer); + <(Option, crate::api::api::Passkey)>::sse_encode(self.1, serializer); } } -impl SseEncode for Option { +impl SseEncode + for ( + String, + (Option, crate::api::api::PasswordManagerMeta), + ) +{ // Codec=Sse (Serialization based), see doc to use other codecs fn sse_encode(self, serializer: &mut flutter_rust_bridge::for_generated::SseSerializer) { - ::sse_encode(self.is_some(), serializer); - if let Some(value) = self { - ::sse_encode(value, serializer); - } + ::sse_encode(self.0, serializer); + <(Option, crate::api::api::PasswordManagerMeta)>::sse_encode(self.1, serializer); } } -impl SseEncode for Option { +impl SseEncode for (String, (Option, crate::api::api::PasswordRawEntry)) { // Codec=Sse (Serialization based), see doc to use other codecs fn sse_encode(self, serializer: &mut flutter_rust_bridge::for_generated::SseSerializer) { - ::sse_encode(self.is_some(), serializer); - if let Some(value) = self { - ::sse_encode(value, serializer); - } + ::sse_encode(self.0, serializer); + <(Option, crate::api::api::PasswordRawEntry)>::sse_encode(self.1, serializer); } } -impl SseEncode for Option { +impl SseEncode for (String, (Option, crate::api::api::WifiPassword)) { // Codec=Sse (Serialization based), see doc to use other codecs fn sse_encode(self, serializer: &mut flutter_rust_bridge::for_generated::SseSerializer) { - ::sse_encode(self.is_some(), serializer); - if let Some(value) = self { - ::sse_encode(value, serializer); - } + ::sse_encode(self.0, serializer); + <(Option, crate::api::api::WifiPassword)>::sse_encode(self.1, serializer); } } -impl SseEncode for Option { +impl SseEncode for (String, crate::api::api::ShareInviteContentData) { // Codec=Sse (Serialization based), see doc to use other codecs fn sse_encode(self, serializer: &mut flutter_rust_bridge::for_generated::SseSerializer) { - ::sse_encode(self.is_some(), serializer); - if let Some(value) = self { - ::sse_encode(value, serializer); - } + ::sse_encode(self.0, serializer); + ::sse_encode(self.1, serializer); } } -impl SseEncode for Option { +impl SseEncode for (String, crate::api::api::SharedPushState) { // Codec=Sse (Serialization based), see doc to use other codecs fn sse_encode(self, serializer: &mut flutter_rust_bridge::for_generated::SseSerializer) { - ::sse_encode(self.is_some(), serializer); - if let Some(value) = self { - ::sse_encode(value, serializer); - } + ::sse_encode(self.0, serializer); + ::sse_encode(self.1, serializer); } } -impl SseEncode for Option { +impl SseEncode for (String, crate::api::api::StatusKitPersonalConfig) { // Codec=Sse (Serialization based), see doc to use other codecs fn sse_encode(self, serializer: &mut flutter_rust_bridge::for_generated::SseSerializer) { - ::sse_encode(self.is_some(), serializer); - if let Some(value) = self { - ::sse_encode(value, serializer); - } + ::sse_encode(self.0, serializer); + ::sse_encode(self.1, serializer); } } -impl SseEncode for Option { +impl SseEncode for (String, String) { // Codec=Sse (Serialization based), see doc to use other codecs fn sse_encode(self, serializer: &mut flutter_rust_bridge::for_generated::SseSerializer) { - ::sse_encode(self.is_some(), serializer); - if let Some(value) = self { - ::sse_encode(value, serializer); - } + ::sse_encode(self.0, serializer); + ::sse_encode(self.1, serializer); } } -impl SseEncode for Option> { +impl SseEncode for (String, crate::api::api::SyncStatus) { // Codec=Sse (Serialization based), see doc to use other codecs fn sse_encode(self, serializer: &mut flutter_rust_bridge::for_generated::SseSerializer) { - ::sse_encode(self.is_some(), serializer); - if let Some(value) = self { - >::sse_encode(value, serializer); - } + ::sse_encode(self.0, serializer); + ::sse_encode(self.1, serializer); } } -impl SseEncode for Option> { + +impl SseEncode for (String, crate::api::api::UpdateAccountFinish) { // Codec=Sse (Serialization based), see doc to use other codecs fn sse_encode(self, serializer: &mut flutter_rust_bridge::for_generated::SseSerializer) { - ::sse_encode(self.is_some(), serializer); - if let Some(value) = self { - >::sse_encode(value, serializer); - } + ::sse_encode(self.0, serializer); + ::sse_encode(self.1, serializer); } } -impl SseEncode for Option> { +impl SseEncode for (u32, crate::api::api::NSDictionaryTypedCoder) { // Codec=Sse (Serialization based), see doc to use other codecs fn sse_encode(self, serializer: &mut flutter_rust_bridge::for_generated::SseSerializer) { - ::sse_encode(self.is_some(), serializer); - if let Some(value) = self { - >::sse_encode(value, serializer); - } + ::sse_encode(self.0, serializer); + ::sse_encode(self.1, serializer); } } -impl SseEncode for Option> { +impl SseEncode for (u32, u64) { // Codec=Sse (Serialization based), see doc to use other codecs fn sse_encode(self, serializer: &mut flutter_rust_bridge::for_generated::SseSerializer) { - ::sse_encode(self.is_some(), serializer); - if let Some(value) = self { - >::sse_encode(value, serializer); - } + ::sse_encode(self.0, serializer); + ::sse_encode(self.1, serializer); } } -impl SseEncode for crate::api::api::PartExtension { +impl SseEncode for crate::api::api::RegisterState { // Codec=Sse (Serialization based), see doc to use other codecs fn sse_encode(self, serializer: &mut flutter_rust_bridge::for_generated::SseSerializer) { match self { - crate::api::api::PartExtension::Sticker { - msg_width, - rotation, - sai, - scale, - update, - sli, - normalized_x, - normalized_y, - version, - hash, - safi, - effect_type, - sticker_id, - } => { + crate::api::api::RegisterState::Registered { next_s } => { ::sse_encode(0, serializer); - ::sse_encode(msg_width, serializer); - ::sse_encode(rotation, serializer); - ::sse_encode(sai, serializer); - ::sse_encode(scale, serializer); - >::sse_encode(update, serializer); - ::sse_encode(sli, serializer); - ::sse_encode(normalized_x, serializer); - ::sse_encode(normalized_y, serializer); - ::sse_encode(version, serializer); - ::sse_encode(hash, serializer); - ::sse_encode(safi, serializer); - ::sse_encode(effect_type, serializer); - ::sse_encode(sticker_id, serializer); + ::sse_encode(next_s, serializer); + } + crate::api::api::RegisterState::Registering => { + ::sse_encode(1, serializer); + } + crate::api::api::RegisterState::Failed { retry_wait, error } => { + ::sse_encode(2, serializer); + >::sse_encode(retry_wait, serializer); + ::sse_encode(error, serializer); } _ => { unimplemented!(""); @@ -32754,191 +39633,235 @@ impl SseEncode for crate::api::api::PartExtension { } } -impl SseEncode for crate::api::api::Passkey { - // Codec=Sse (Serialization based), see doc to use other codecs - fn sse_encode(self, serializer: &mut flutter_rust_bridge::for_generated::SseSerializer) { - ::sse_encode(self.cdat, serializer); - ::sse_encode(self.mdat, serializer); - ::sse_encode(self.agrp, serializer); - ::sse_encode(self.labl, serializer); - >::sse_encode(self.data, serializer); - >::sse_encode(self.atag, serializer); - >::sse_encode(self.klbl, serializer); - } -} - -impl SseEncode for crate::api::api::PasswordManagerAltDomain { - // Codec=Sse (Serialization based), see doc to use other codecs - fn sse_encode(self, serializer: &mut flutter_rust_bridge::for_generated::SseSerializer) { - ::sse_encode(self.domain, serializer); - } -} - -impl SseEncode for crate::api::api::PasswordManagerMeta { +impl SseEncode for crate::api::api::RenameMessage { // Codec=Sse (Serialization based), see doc to use other codecs fn sse_encode(self, serializer: &mut flutter_rust_bridge::for_generated::SseSerializer) { - ::sse_encode(self.cdat, serializer); - ::sse_encode(self.mdat, serializer); - ::sse_encode(self.srvr, serializer); - ::sse_encode(self.acct, serializer); - ::sse_encode(self.agrp, serializer); - >::sse_encode(self.data, serializer); + ::sse_encode(self.new_name, serializer); } } -impl SseEncode for crate::api::api::PasswordManagerMetaChange { +impl SseEncode for crate::api::api::ReportMessage { // Codec=Sse (Serialization based), see doc to use other codecs fn sse_encode(self, serializer: &mut flutter_rust_bridge::for_generated::SseSerializer) { - ::sse_encode(self.date, serializer); - >::sse_encode(self.password, serializer); - >::sse_encode(self.old_password, serializer); - >::sse_encode(self.group_name, serializer); - >::sse_encode(self.group_id, serializer); - >::sse_encode(self.share_type, serializer); - ::sse_encode(self.id, serializer); - ::sse_encode(self.typ, serializer); + ::sse_encode(self.guid, serializer); + ::sse_encode(self.sender, serializer); + ::sse_encode(self.conversation_size, serializer); + ::sse_encode(self.parts, serializer); + ::sse_encode(self.time_of_message, serializer); } } -impl SseEncode for crate::api::api::PasswordManagerMetaData { +impl SseEncode for crate::api::api::RichLinkImageAttachmentSubstitute { // Codec=Sse (Serialization based), see doc to use other codecs fn sse_encode(self, serializer: &mut flutter_rust_bridge::for_generated::SseSerializer) { - >::sse_encode(self.history, serializer); - >::sse_encode(self.alt_domains, serializer); - >::sse_encode(self.totp, serializer); - >::sse_encode(self.ctxt, serializer); - >>::sse_encode(self.title, serializer); - >>::sse_encode(self.notes, serializer); - >::sse_encode( - self.formerly_shared, - serializer, - ); - >>::sse_encode(self.ocpid, serializer); + ::sse_encode(self.mime_type, serializer); + ::sse_encode(self.rich_link_image_attachment_substitute_index, serializer); } } -impl SseEncode for crate::api::api::PasswordManagerMetaDataCtx { +impl SseEncode for crate::api::api::ScheduleMode { // Codec=Sse (Serialization based), see doc to use other codecs fn sse_encode(self, serializer: &mut flutter_rust_bridge::for_generated::SseSerializer) { - ::sse_encode(self.last_used, serializer); + ::sse_encode(self.ms, serializer); + ::sse_encode(self.schedule, serializer); } } -impl SseEncode for crate::api::api::PasswordManagerMetaDataFormerlyShared { +impl SseEncode for crate::api::api::SetTranscriptBackgroundMessage { // Codec=Sse (Serialization based), see doc to use other codecs fn sse_encode(self, serializer: &mut flutter_rust_bridge::for_generated::SseSerializer) { - >::sse_encode(self.group_name, serializer); - >::sse_encode(self.password_manager_credential_identifier, serializer); + match self { + crate::api::api::SetTranscriptBackgroundMessage::Remove { + aid, + bid, + chat_id, + remove, + } => { + ::sse_encode(0, serializer); + ::sse_encode(aid, serializer); + ::sse_encode(bid, serializer); + >::sse_encode(chat_id, serializer); + ::sse_encode(remove, serializer); + } + crate::api::api::SetTranscriptBackgroundMessage::Set { + aid, + bid, + chat_id, + object_id, + payload_version, + background_id, + url, + signature, + key, + file_size, + } => { + ::sse_encode(1, serializer); + ::sse_encode(aid, serializer); + ::sse_encode(bid, serializer); + >::sse_encode(chat_id, serializer); + ::sse_encode(object_id, serializer); + ::sse_encode(payload_version, serializer); + ::sse_encode(background_id, serializer); + ::sse_encode(url, serializer); + ::sse_encode(signature, serializer); + ::sse_encode(key, serializer); + ::sse_encode(file_size, serializer); + } + _ => { + unimplemented!(""); + } + } } } -impl SseEncode for crate::api::api::PasswordManagerTotp { +impl SseEncode for crate::api::api::ShareInviteContentData { // Codec=Sse (Serialization based), see doc to use other codecs fn sse_encode(self, serializer: &mut flutter_rust_bridge::for_generated::SseSerializer) { - >::sse_encode(self.secret, serializer); - ::sse_encode(self.digits, serializer); - >::sse_encode(self.issuer, serializer); - ::sse_encode(self.period, serializer); - ::sse_encode(self.initial_date, serializer); - ::sse_encode(self.algorithm, serializer); - >::sse_encode(self.account_name, serializer); - >::sse_encode(self.original_url, serializer); + >::sse_encode(self.invitation_token, serializer); + ::sse_encode(self.group_id, serializer); + ::sse_encode(self.sent_time, serializer); + ::sse_encode(self.group_name, serializer); + ::sse_encode(self.share_url, serializer); + ::sse_encode(self.invitee_handle, serializer); } } -impl SseEncode for crate::api::api::PasswordRawEntry { +impl SseEncode for crate::api::api::ShareProfileMessage { // Codec=Sse (Serialization based), see doc to use other codecs fn sse_encode(self, serializer: &mut flutter_rust_bridge::for_generated::SseSerializer) { - ::sse_encode(self.cdat, serializer); - ::sse_encode(self.mdat, serializer); - ::sse_encode(self.srvr, serializer); - ::sse_encode(self.acct, serializer); - ::sse_encode(self.agrp, serializer); - >::sse_encode(self.data, serializer); + >::sse_encode(self.cloud_kit_decryption_record_key, serializer); + ::sse_encode(self.cloud_kit_record_key, serializer); + >::sse_encode(self.poster, serializer); } } -impl SseEncode for crate::api::api::PermanentDeleteMessage { +impl SseEncode for crate::api::api::SharedAlbum { // Codec=Sse (Serialization based), see doc to use other codecs fn sse_encode(self, serializer: &mut flutter_rust_bridge::for_generated::SseSerializer) { - ::sse_encode(self.target, serializer); - ::sse_encode(self.is_scheduled, serializer); + >::sse_encode(self.name, serializer); + >::sse_encode(self.fullname, serializer); + >::sse_encode(self.email, serializer); + ::sse_encode(self.albumguid, serializer); + ::sse_encode(self.sharingtype, serializer); + >::sse_encode(self.subscriptiondate, serializer); + >::sse_encode(self.albumlocation, serializer); + >::sse_encode(self.assets, serializer); + >::sse_encode(self.delete, serializer); } } -impl SseEncode for crate::api::api::PhotoPosterContents { +impl SseEncode for crate::api::api::SharedICloudServices { // Codec=Sse (Serialization based), see doc to use other codecs fn sse_encode(self, serializer: &mut flutter_rust_bridge::for_generated::SseSerializer) { - ::sse_encode(self.version, serializer); - >::sse_encode(self.layers, serializer); - ::sse_encode(self.properties, serializer); + >>>::sse_encode(self.account, serializer); + >>::sse_encode(self.token_provider, serializer); + >>>::sse_encode( + self.cloudkit_client, + serializer, + ); + >>>::sse_encode( + self.keychain, + serializer, + ); + >>>::sse_encode( + self.passwords, + serializer, + ); + >>::sse_encode( + self.profiles_client, + serializer, + ); + >>>::sse_encode(self.fmfd, serializer); + >>::sse_encode( + self.sharedstreams, + serializer, + ); + >>>::sse_encode( + self.cloud_messages_client, + serializer, + ); + >>::sse_encode( + self.statuskit_client, + serializer, + ); } } -impl SseEncode for crate::api::api::PhotoPosterContentsFrame { +impl SseEncode for crate::api::api::SharedPoster { // Codec=Sse (Serialization based), see doc to use other codecs fn sse_encode(self, serializer: &mut flutter_rust_bridge::for_generated::SseSerializer) { - ::sse_encode(self.width, serializer); - ::sse_encode(self.height, serializer); - ::sse_encode(self.x, serializer); - ::sse_encode(self.y, serializer); + >::sse_encode(self.low_res_wallpaper_tag, serializer); + >::sse_encode(self.wallpaper_tag, serializer); + >::sse_encode(self.message_tag, serializer); } } -impl SseEncode for crate::api::api::PhotoPosterContentsSize { +impl SseEncode for crate::api::api::SharedPushState { // Codec=Sse (Serialization based), see doc to use other codecs fn sse_encode(self, serializer: &mut flutter_rust_bridge::for_generated::SseSerializer) { - ::sse_encode(self.width, serializer); - ::sse_encode(self.height, serializer); + ::sse_encode(self.os_config, serializer); + >::sse_encode(self.cancel_poll, serializer); + ::sse_encode(self.conf_dir, serializer); + >>::sse_encode(self.local_broadcast, serializer); + >::sse_encode(self.anisette, serializer); + ::sse_encode(self.conn, serializer); + >::sse_encode( + self.icloud_services, + serializer, + ); + >::sse_encode(self.client, serializer); + >::sse_encode(self.ft_client, serializer); + >::sse_encode(self.idms_client, serializer); + >>>::sse_encode(self.active_circle_sessions, serializer); + >>>>::sse_encode( + self.client_session, + serializer, + ); } } -impl SseEncode for crate::api::api::PhotoPosterLayer { +impl SseEncode for crate::api::api::SimplifiedIncomingCallPoster { // Codec=Sse (Serialization based), see doc to use other codecs fn sse_encode(self, serializer: &mut flutter_rust_bridge::for_generated::SseSerializer) { - ::sse_encode(self.frame, serializer); - ::sse_encode(self.filename, serializer); - ::sse_encode(self.z_position, serializer); - ::sse_encode(self.identifier, serializer); + ::sse_encode(self.poster, serializer); + ::sse_encode(self.text_metadata, serializer); + >::sse_encode(self.low_res, serializer); } } -impl SseEncode for crate::api::api::PhotoPosterLayout { +impl SseEncode for crate::api::api::SimplifiedPoster { // Codec=Sse (Serialization based), see doc to use other codecs fn sse_encode(self, serializer: &mut flutter_rust_bridge::for_generated::SseSerializer) { - ::sse_encode(self.clock_intersection, serializer); - ::sse_encode(self.device_resolution, serializer); - ::sse_encode(self.visible_frame, serializer); - ::sse_encode(self.time_frame, serializer); - ::sse_encode(self.clock_layer_order, serializer); - ::sse_encode(self.has_top_edge_contact, serializer); - ::sse_encode(self.inactive_frame, serializer); - ::sse_encode(self.image_size, serializer); - ::sse_encode(self.parallax_padding, serializer); + ::sse_encode( + self.title_configuration, + serializer, + ); + ::sse_encode(self.r#type, serializer); + ::sse_encode(self.role, serializer); } } -impl SseEncode for crate::api::api::PhotoPosterProperties { +impl SseEncode for crate::api::api::SimplifiedTranscriptPoster { // Codec=Sse (Serialization based), see doc to use other codecs fn sse_encode(self, serializer: &mut flutter_rust_bridge::for_generated::SseSerializer) { - ::sse_encode(self.portrait_layout, serializer); - ::sse_encode(self.settling_effect_enabled, serializer); - ::sse_encode(self.depth_enabled, serializer); - ::sse_encode(self.clock_area_luminance, serializer); - ::sse_encode(self.parallax_disabled, serializer); + ::sse_encode(self.watch, serializer); + ::sse_encode(self.poster, serializer); } } -impl SseEncode for crate::api::api::PollResult { +impl SseEncode for crate::api::api::StatusKitMessage { // Codec=Sse (Serialization based), see doc to use other codecs fn sse_encode(self, serializer: &mut flutter_rust_bridge::for_generated::SseSerializer) { match self { - crate::api::api::PollResult::Stop => { + crate::api::api::StatusKitMessage::StatusChanged { + user, + mode, + allowed, + } => { ::sse_encode(0, serializer); - } - crate::api::api::PollResult::Cont(field0) => { - ::sse_encode(1, serializer); - >::sse_encode(field0, serializer); + ::sse_encode(user, serializer); + >::sse_encode(mode, serializer); + ::sse_encode(allowed, serializer); } _ => { unimplemented!(""); @@ -32947,177 +39870,77 @@ impl SseEncode for crate::api::api::PollResult { } } -impl SseEncode for crate::api::api::PosterAsset { +impl SseEncode for crate::api::api::StatusKitPersonalConfig { // Codec=Sse (Serialization based), see doc to use other codecs fn sse_encode(self, serializer: &mut flutter_rust_bridge::for_generated::SseSerializer) { - ::sse_encode(self.contents, serializer); - >>::sse_encode(self.files, serializer); - ::sse_encode(self.uuid, serializer); + >::sse_encode(self.allowed_modes, serializer); } } -impl SseEncode for crate::api::api::PosterColor { +impl SseEncode for crate::api::api::SupportAction { // Codec=Sse (Serialization based), see doc to use other codecs fn sse_encode(self, serializer: &mut flutter_rust_bridge::for_generated::SseSerializer) { - ::sse_encode(self.alpha, serializer); - ::sse_encode(self.blue, serializer); - ::sse_encode(self.green, serializer); - ::sse_encode(self.red, serializer); + ::sse_encode(self.url, serializer); + ::sse_encode(self.button, serializer); } } -impl SseEncode for crate::api::api::PosterRole { +impl SseEncode for crate::api::api::SupportAlert { // Codec=Sse (Serialization based), see doc to use other codecs fn sse_encode(self, serializer: &mut flutter_rust_bridge::for_generated::SseSerializer) { - ::sse_encode( - match self { - crate::api::api::PosterRole::PRPosterRoleBackdrop => 0, - crate::api::api::PosterRole::PRPosterRoleIncomingCall => 1, - _ => { - unimplemented!(""); - } - }, - serializer, - ); + ::sse_encode(self.title, serializer); + ::sse_encode(self.body, serializer); + >::sse_encode(self.action, serializer); } } -impl SseEncode for crate::api::api::PosterType { +impl SseEncode for crate::api::api::SyncStatus { // Codec=Sse (Serialization based), see doc to use other codecs fn sse_encode(self, serializer: &mut flutter_rust_bridge::for_generated::SseSerializer) { match self { - crate::api::api::PosterType::Photo { assets } => { + crate::api::api::SyncStatus::Synced => { ::sse_encode(0, serializer); - >::sse_encode(assets, serializer); } - crate::api::api::PosterType::Monogram { data, background } => { + crate::api::api::SyncStatus::Downloading { progress, total } => { ::sse_encode(1, serializer); - ::sse_encode(data, serializer); - ::sse_encode(background, serializer); + ::sse_encode(progress, serializer); + ::sse_encode(total, serializer); } - crate::api::api::PosterType::Memoji { data, background } => { + crate::api::api::SyncStatus::Uploading { progress, total } => { ::sse_encode(2, serializer); - ::sse_encode(data, serializer); - ::sse_encode(background, serializer); + ::sse_encode(progress, serializer); + ::sse_encode(total, serializer); } - crate::api::api::PosterType::TranscriptDynamic { data } => { + crate::api::api::SyncStatus::Syncing => { ::sse_encode(3, serializer); - ::sse_encode(data, serializer); - } - crate::api::api::PosterType::TranscriptGradient { colors } => { - ::sse_encode(4, serializer); - >::sse_encode(colors, serializer); - } - _ => { - unimplemented!(""); - } - } - } -} - -impl SseEncode for crate::api::api::PRPosterColor { - // Codec=Sse (Serialization based), see doc to use other codecs - fn sse_encode(self, serializer: &mut flutter_rust_bridge::for_generated::SseSerializer) { - ::sse_encode(self.preferred_style, serializer); - ::sse_encode(self.identifier, serializer); - ::sse_encode(self.suggested, serializer); - ::sse_encode(self.color, serializer); - } -} - -impl SseEncode for crate::api::api::PRPosterContentMaterialStyle { - // Codec=Sse (Serialization based), see doc to use other codecs - fn sse_encode(self, serializer: &mut flutter_rust_bridge::for_generated::SseSerializer) { - match self { - crate::api::api::PRPosterContentMaterialStyle::PRPosterContentDiscreteColorsStyle { - variation, - colors, - vibrant, - supports_variation, - needs_to_resolve_variation, - } => { - ::sse_encode(0, serializer); - ::sse_encode(variation, serializer); - >::sse_encode(colors, serializer); - ::sse_encode(vibrant, serializer); - ::sse_encode(supports_variation, serializer); - ::sse_encode(needs_to_resolve_variation, serializer); - } - crate::api::api::PRPosterContentMaterialStyle::PRPosterContentVibrantMaterialStyle => { - ::sse_encode(1, serializer); - } - crate::api::api::PRPosterContentMaterialStyle::PRPosterContentGradientStyle { - gradient_type, - colors, - start_point, - locations, - end_point, - } => { - ::sse_encode(2, serializer); - ::sse_encode(gradient_type, serializer); - >::sse_encode(colors, serializer); - ::sse_encode(start_point, serializer); - >::sse_encode(locations, serializer); - ::sse_encode(end_point, serializer); } _ => { unimplemented!(""); - } - } - } -} - -impl SseEncode for crate::api::api::PRPosterSystemTimeFontConfiguration { - // Codec=Sse (Serialization based), see doc to use other codecs - fn sse_encode(self, serializer: &mut flutter_rust_bridge::for_generated::SseSerializer) { - ::sse_encode(self.is_system_item, serializer); - ::sse_encode(self.time_font_identifier, serializer); - ::sse_encode(self.weight, serializer); - } -} - -impl SseEncode for crate::api::api::PRPosterTitleStyleConfiguration { - // Codec=Sse (Serialization based), see doc to use other codecs - fn sse_encode(self, serializer: &mut flutter_rust_bridge::for_generated::SseSerializer) { - ::sse_encode(self.alternate_date_enabled, serializer); - ::sse_encode(self.contents_luminence, serializer); - ::sse_encode(self.group_name, serializer); - ::sse_encode(self.preferred_title_alignment, serializer); - ::sse_encode(self.preferred_title_layout, serializer); - ::sse_encode( - self.time_font_configuration, - serializer, - ); - >>::sse_encode(self.time_numbering_system, serializer); - ::sse_encode(self.title_color, serializer); - >::sse_encode(self.title_content_style, serializer); - ::sse_encode(self.user_configured, serializer); - >::sse_encode( - self.title_style, - serializer, - ); + } + } } } -impl SseEncode for crate::api::api::PrivateDeviceInfo { +impl SseEncode for crate::api::api::TeardownSignIn { // Codec=Sse (Serialization based), see doc to use other codecs fn sse_encode(self, serializer: &mut flutter_rust_bridge::for_generated::SseSerializer) { - >::sse_encode(self.uuid, serializer); - >::sse_encode(self.device_name, serializer); - >::sse_encode(self.token, serializer); - ::sse_encode(self.is_hsa_trusted, serializer); - >::sse_encode(self.identites, serializer); - >::sse_encode(self.sub_services, serializer); + ::sse_encode(self.prevtxnid, serializer); } } -impl SseEncode for crate::api::api::ProvisionedFlavor { +impl SseEncode for crate::api::api::TextEffect { // Codec=Sse (Serialization based), see doc to use other codecs fn sse_encode(self, serializer: &mut flutter_rust_bridge::for_generated::SseSerializer) { ::sse_encode( match self { - crate::api::api::ProvisionedFlavor::Mac => 0, - crate::api::api::ProvisionedFlavor::IOS => 1, + crate::api::api::TextEffect::Big => 0, + crate::api::api::TextEffect::Small => 1, + crate::api::api::TextEffect::Shake => 2, + crate::api::api::TextEffect::Nod => 3, + crate::api::api::TextEffect::Explode => 4, + crate::api::api::TextEffect::Ripple => 5, + crate::api::api::TextEffect::Bloom => 6, + crate::api::api::TextEffect::Jitter => 7, _ => { unimplemented!(""); } @@ -33127,55 +39950,27 @@ impl SseEncode for crate::api::api::ProvisionedFlavor { } } -impl SseEncode for crate::api::api::PushMessage { +impl SseEncode for crate::api::api::TextFlags { + // Codec=Sse (Serialization based), see doc to use other codecs + fn sse_encode(self, serializer: &mut flutter_rust_bridge::for_generated::SseSerializer) { + ::sse_encode(self.bold, serializer); + ::sse_encode(self.italic, serializer); + ::sse_encode(self.underline, serializer); + ::sse_encode(self.strikethrough, serializer); + } +} + +impl SseEncode for crate::api::api::TextFormat { // Codec=Sse (Serialization based), see doc to use other codecs fn sse_encode(self, serializer: &mut flutter_rust_bridge::for_generated::SseSerializer) { match self { - crate::api::api::PushMessage::IMessage(field0) => { + crate::api::api::TextFormat::Flags(field0) => { ::sse_encode(0, serializer); - ::sse_encode(field0, serializer); + ::sse_encode(field0, serializer); } - crate::api::api::PushMessage::SendConfirm { uuid, error } => { + crate::api::api::TextFormat::Effect(field0) => { ::sse_encode(1, serializer); - ::sse_encode(uuid, serializer); - >::sse_encode(error, serializer); - } - crate::api::api::PushMessage::RegistrationState(field0) => { - ::sse_encode(2, serializer); - ::sse_encode(field0, serializer); - } - crate::api::api::PushMessage::NewPhotostream(field0) => { - ::sse_encode(3, serializer); - ::sse_encode(field0, serializer); - } - crate::api::api::PushMessage::FaceTime(field0) => { - ::sse_encode(4, serializer); - ::sse_encode(field0, serializer); - } - crate::api::api::PushMessage::StatusUpdate(field0) => { - ::sse_encode(5, serializer); - ::sse_encode(field0, serializer); - } - crate::api::api::PushMessage::Idms(field0) => { - ::sse_encode(6, serializer); - ::sse_encode(field0, serializer); - } - crate::api::api::PushMessage::TwoFaAuthEvent(field0) => { - ::sse_encode(7, serializer); - ::sse_encode(field0, serializer); - } - crate::api::api::PushMessage::CircleFinishEvent => { - ::sse_encode(8, serializer); - } - crate::api::api::PushMessage::BeaconShared { - sender, - beacon, - attributes, - } => { - ::sse_encode(9, serializer); - ::sse_encode(sender, serializer); - ::sse_encode(beacon, serializer); - ::sse_encode(attributes, serializer); + ::sse_encode(field0, serializer); } _ => { unimplemented!(""); @@ -33184,47 +39979,115 @@ impl SseEncode for crate::api::api::PushMessage { } } -impl SseEncode for crate::api::api::QuotaInfo { +impl SseEncode for crate::api::api::TranscriptDynamicUserData { // Codec=Sse (Serialization based), see doc to use other codecs fn sse_encode(self, serializer: &mut flutter_rust_bridge::for_generated::SseSerializer) { - ::sse_encode(self.total_bytes, serializer); - ::sse_encode(self.available_bytes, serializer); - ::sse_encode(self.messages_bytes, serializer); + ::sse_encode(self.identifier, serializer); } } -impl SseEncode for crate::api::api::ReactMessage { +impl SseEncode for crate::api::api::TransferProgress { // Codec=Sse (Serialization based), see doc to use other codecs fn sse_encode(self, serializer: &mut flutter_rust_bridge::for_generated::SseSerializer) { - ::sse_encode(self.to_uuid, serializer); - >::sse_encode(self.to_part, serializer); - ::sse_encode(self.reaction, serializer); - ::sse_encode(self.to_text, serializer); - >::sse_encode( - self.embedded_profile, - serializer, - ); + ::sse_encode(self.prog, serializer); + ::sse_encode(self.total, serializer); + >::sse_encode(self.attachment, serializer); } } -impl SseEncode for crate::api::api::ReactMessageType { +impl SseEncode for crate::api::api::TrustedPhoneNumber { + // Codec=Sse (Serialization based), see doc to use other codecs + fn sse_encode(self, serializer: &mut flutter_rust_bridge::for_generated::SseSerializer) { + ::sse_encode(self.number_with_dial_code, serializer); + ::sse_encode(self.last_two_digits, serializer); + ::sse_encode(self.push_mode, serializer); + ::sse_encode(self.id, serializer); + } +} + +impl SseEncode for crate::api::api::TypingApp { + // Codec=Sse (Serialization based), see doc to use other codecs + fn sse_encode(self, serializer: &mut flutter_rust_bridge::for_generated::SseSerializer) { + ::sse_encode(self.bundle_id, serializer); + >::sse_encode(self.icon, serializer); + } +} + +impl SseEncode for u16 { + // Codec=Sse (Serialization based), see doc to use other codecs + fn sse_encode(self, serializer: &mut flutter_rust_bridge::for_generated::SseSerializer) { + serializer.cursor.write_u16::(self).unwrap(); + } +} + +impl SseEncode for u32 { + // Codec=Sse (Serialization based), see doc to use other codecs + fn sse_encode(self, serializer: &mut flutter_rust_bridge::for_generated::SseSerializer) { + serializer.cursor.write_u32::(self).unwrap(); + } +} + +impl SseEncode for u64 { + // Codec=Sse (Serialization based), see doc to use other codecs + fn sse_encode(self, serializer: &mut flutter_rust_bridge::for_generated::SseSerializer) { + serializer.cursor.write_u64::(self).unwrap(); + } +} + +impl SseEncode for u8 { + // Codec=Sse (Serialization based), see doc to use other codecs + fn sse_encode(self, serializer: &mut flutter_rust_bridge::for_generated::SseSerializer) { + serializer.cursor.write_u8(self).unwrap(); + } +} + +impl SseEncode for crate::api::api::UIColor { // Codec=Sse (Serialization based), see doc to use other codecs fn sse_encode(self, serializer: &mut flutter_rust_bridge::for_generated::SseSerializer) { match self { - crate::api::api::ReactMessageType::React { reaction, enable } => { + crate::api::api::UIColor::RGBAColorSpace { + color_components, + green, + blue, + red, + green_dbl, + blue_dbl, + red_dbl, + alpha_dbl, + alpha, + rgb, + color_space, + class, + } => { ::sse_encode(0, serializer); - ::sse_encode(reaction, serializer); - ::sse_encode(enable, serializer); + ::sse_encode(color_components, serializer); + ::sse_encode(green, serializer); + ::sse_encode(blue, serializer); + ::sse_encode(red, serializer); + >::sse_encode(green_dbl, serializer); + >::sse_encode(blue_dbl, serializer); + >::sse_encode(red_dbl, serializer); + >::sse_encode(alpha_dbl, serializer); + ::sse_encode(alpha, serializer); + >::sse_encode(rgb, serializer); + ::sse_encode(color_space, serializer); + ::sse_encode(class, serializer); } - crate::api::api::ReactMessageType::Extension { - spec, - body, - is_meta, + crate::api::api::UIColor::GrayscaleAlphaColorSpace { + color_components, + white, + alpha, + bin, + color_space, + class, } => { ::sse_encode(1, serializer); - ::sse_encode(spec, serializer); - ::sse_encode(body, serializer); - ::sse_encode(is_meta, serializer); + ::sse_encode(color_components, serializer); + ::sse_encode(white, serializer); + ::sse_encode(alpha, serializer); + >::sse_encode(bin, serializer); + ::sse_encode(color_space, serializer); + ::sse_encode(class, serializer); } _ => { unimplemented!(""); @@ -33233,36 +40096,29 @@ impl SseEncode for crate::api::api::ReactMessageType { } } -impl SseEncode for crate::api::api::Reaction { +impl SseEncode for () { + // Codec=Sse (Serialization based), see doc to use other codecs + fn sse_encode(self, serializer: &mut flutter_rust_bridge::for_generated::SseSerializer) {} +} + +impl SseEncode for crate::api::api::UnsendMessage { + // Codec=Sse (Serialization based), see doc to use other codecs + fn sse_encode(self, serializer: &mut flutter_rust_bridge::for_generated::SseSerializer) { + ::sse_encode(self.tuuid, serializer); + ::sse_encode(self.edit_part, serializer); + } +} + +impl SseEncode for crate::api::api::UpdateAccountFinish { // Codec=Sse (Serialization based), see doc to use other codecs fn sse_encode(self, serializer: &mut flutter_rust_bridge::for_generated::SseSerializer) { match self { - crate::api::api::Reaction::Heart => { + crate::api::api::UpdateAccountFinish::MacOS => { ::sse_encode(0, serializer); } - crate::api::api::Reaction::Like => { + crate::api::api::UpdateAccountFinish::IOS { url } => { ::sse_encode(1, serializer); - } - crate::api::api::Reaction::Dislike => { - ::sse_encode(2, serializer); - } - crate::api::api::Reaction::Laugh => { - ::sse_encode(3, serializer); - } - crate::api::api::Reaction::Emphasize => { - ::sse_encode(4, serializer); - } - crate::api::api::Reaction::Question => { - ::sse_encode(5, serializer); - } - crate::api::api::Reaction::Emoji(field0) => { - ::sse_encode(6, serializer); - ::sse_encode(field0, serializer); - } - crate::api::api::Reaction::Sticker { spec, body } => { - ::sse_encode(7, serializer); - >::sse_encode(spec, serializer); - ::sse_encode(body, serializer); + ::sse_encode(url, serializer); } _ => { unimplemented!(""); @@ -33271,1039 +40127,969 @@ impl SseEncode for crate::api::api::Reaction { } } -impl SseEncode for (APSConnection, Option) { +impl SseEncode for crate::api::api::UpdateExtensionMessage { // Codec=Sse (Serialization based), see doc to use other codecs fn sse_encode(self, serializer: &mut flutter_rust_bridge::for_generated::SseSerializer) { - ::sse_encode(self.0, serializer); - >::sse_encode(self.1, serializer); + ::sse_encode(self.for_uuid, serializer); + ::sse_encode(self.ext, serializer); } } -impl SseEncode - for ( - Arc>>, - crate::api::api::LoginState, - ) -{ +impl SseEncode for crate::api::api::UpdateProfileMessage { // Codec=Sse (Serialization based), see doc to use other codecs fn sse_encode(self, serializer: &mut flutter_rust_bridge::for_generated::SseSerializer) { - >>>::sse_encode(self.0, serializer); - ::sse_encode(self.1, serializer); + >::sse_encode(self.profile, serializer); + ::sse_encode(self.share_contacts, serializer); } } -impl SseEncode for (Arc, crate::api::api::SharedPushState) { +impl SseEncode for crate::api::api::UpdateProfileSharingMessage { // Codec=Sse (Serialization based), see doc to use other codecs fn sse_encode(self, serializer: &mut flutter_rust_bridge::for_generated::SseSerializer) { - >::sse_encode(self.0, serializer); - ::sse_encode(self.1, serializer); + >::sse_encode(self.shared_dismissed, serializer); + >::sse_encode(self.shared_all, serializer); + ::sse_encode(self.version, serializer); } } -impl SseEncode - for ( - CircleClientSession, - crate::api::api::LoginState, - Option, - ) -{ +impl SseEncode for usize { // Codec=Sse (Serialization based), see doc to use other codecs fn sse_encode(self, serializer: &mut flutter_rust_bridge::for_generated::SseSerializer) { - >::sse_encode(self.0, serializer); - ::sse_encode(self.1, serializer); - >::sse_encode(self.2, serializer); + serializer + .cursor + .write_u64::(self as _) + .unwrap(); } } -impl SseEncode for (Sender<()>, Arc>, APSWatcher) { +impl SseEncode for crate::api::api::WallpaperMetadata { // Codec=Sse (Serialization based), see doc to use other codecs fn sse_encode(self, serializer: &mut flutter_rust_bridge::for_generated::SseSerializer) { - >::sse_encode(self.0, serializer); - >>::sse_encode(self.1, serializer); - ::sse_encode(self.2, serializer); + >::sse_encode(self.background_color_key, serializer); + ::sse_encode(self.font_color_key, serializer); + ::sse_encode(self.font_name_key, serializer); + ::sse_encode(self.font_size_key, serializer); + ::sse_encode(self.font_weight_key, serializer); + ::sse_encode(self.is_vertical_key, serializer); + ::sse_encode(self.type_key, serializer); } } -impl SseEncode - for ( - Vec, - std::collections::HashMap>, - i32, - ) -{ +impl SseEncode for crate::api::api::WatchBackground { // Codec=Sse (Serialization based), see doc to use other codecs fn sse_encode(self, serializer: &mut flutter_rust_bridge::for_generated::SseSerializer) { - >::sse_encode(self.0, serializer); - >>::sse_encode( - self.1, serializer, - ); - ::sse_encode(self.2, serializer); + ::sse_encode(self.is_high_key, serializer); + ::sse_encode(self.luminance, serializer); + >::sse_encode(self.background_image_data, serializer); + ::sse_encode(self.extension_identifier, serializer); } } -impl SseEncode - for ( - Vec, - std::collections::HashMap>, - i32, - ) -{ +impl SseEncode for crate::api::api::WifiPassword { // Codec=Sse (Serialization based), see doc to use other codecs fn sse_encode(self, serializer: &mut flutter_rust_bridge::for_generated::SseSerializer) { - >::sse_encode(self.0, serializer); - >>::sse_encode( - self.1, serializer, - ); - ::sse_encode(self.2, serializer); + ::sse_encode(self.cdat, serializer); + ::sse_encode(self.mdat, serializer); + ::sse_encode(self.acct, serializer); + ::sse_encode(self.svce, serializer); + >::sse_encode(self.data, serializer); + } +} + +#[cfg(not(target_family = "wasm"))] +mod io { + // This file is automatically generated, so please do not edit it. + // Generated by `flutter_rust_bridge`@ 2.3.0. + + // Section: imports + + use super::*; + use crate::api::api::*; + use crate::*; + use flutter_rust_bridge::for_generated::byteorder::{ + NativeEndian, ReadBytesExt, WriteBytesExt, + }; + use flutter_rust_bridge::for_generated::{transform_result_dco, Lifetimeable, Lockable}; + use flutter_rust_bridge::{Handler, IntoIntoDart}; + + // Section: boilerplate + + flutter_rust_bridge::frb_generated_boilerplate_io!(); + + #[no_mangle] + pub extern "C" fn frbgen_bluebubbles_rust_arc_increment_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerAPSConnection( + ptr: *const std::ffi::c_void, + ) { + MoiArc::>::increment_strong_count(ptr as _); + } + + #[no_mangle] + pub extern "C" fn frbgen_bluebubbles_rust_arc_decrement_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerAPSConnection( + ptr: *const std::ffi::c_void, + ) { + MoiArc::>::decrement_strong_count(ptr as _); + } + + #[no_mangle] + pub extern "C" fn frbgen_bluebubbles_rust_arc_increment_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerAPSState( + ptr: *const std::ffi::c_void, + ) { + MoiArc::>::increment_strong_count(ptr as _); + } + + #[no_mangle] + pub extern "C" fn frbgen_bluebubbles_rust_arc_decrement_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerAPSState( + ptr: *const std::ffi::c_void, + ) { + MoiArc::>::decrement_strong_count(ptr as _); + } + + #[no_mangle] + pub extern "C" fn frbgen_bluebubbles_rust_arc_increment_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerAPSWatcher( + ptr: *const std::ffi::c_void, + ) { + MoiArc::>::increment_strong_count(ptr as _); + } + + #[no_mangle] + pub extern "C" fn frbgen_bluebubbles_rust_arc_decrement_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerAPSWatcher( + ptr: *const std::ffi::c_void, + ) { + MoiArc::>::decrement_strong_count(ptr as _); + } + + #[no_mangle] + pub extern "C" fn frbgen_bluebubbles_rust_arc_increment_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcAnisetteClientDefaultAnisetteProvider( + ptr: *const std::ffi::c_void, + ) { + MoiArc::< + flutter_rust_bridge::for_generated::RustAutoOpaqueInner< + ArcAnisetteClient, + >, + >::increment_strong_count(ptr as _); + } + + #[no_mangle] + pub extern "C" fn frbgen_bluebubbles_rust_arc_decrement_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcAnisetteClientDefaultAnisetteProvider( + ptr: *const std::ffi::c_void, + ) { + MoiArc::< + flutter_rust_bridge::for_generated::RustAutoOpaqueInner< + ArcAnisetteClient, + >, + >::decrement_strong_count(ptr as _); + } + + #[no_mangle] + pub extern "C" fn frbgen_bluebubbles_rust_arc_increment_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcCloudKitClientDefaultAnisetteProvider( + ptr: *const std::ffi::c_void, + ) { + MoiArc::< + flutter_rust_bridge::for_generated::RustAutoOpaqueInner< + Arc>, + >, + >::increment_strong_count(ptr as _); + } + + #[no_mangle] + pub extern "C" fn frbgen_bluebubbles_rust_arc_decrement_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcCloudKitClientDefaultAnisetteProvider( + ptr: *const std::ffi::c_void, + ) { + MoiArc::< + flutter_rust_bridge::for_generated::RustAutoOpaqueInner< + Arc>, + >, + >::decrement_strong_count(ptr as _); + } + + #[no_mangle] + pub extern "C" fn frbgen_bluebubbles_rust_arc_increment_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcCloudMessagesClientDefaultAnisetteProvider( + ptr: *const std::ffi::c_void, + ) { + MoiArc::< + flutter_rust_bridge::for_generated::RustAutoOpaqueInner< + Arc>, + >, + >::increment_strong_count(ptr as _); + } + + #[no_mangle] + pub extern "C" fn frbgen_bluebubbles_rust_arc_decrement_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcCloudMessagesClientDefaultAnisetteProvider( + ptr: *const std::ffi::c_void, + ) { + MoiArc::< + flutter_rust_bridge::for_generated::RustAutoOpaqueInner< + Arc>, + >, + >::decrement_strong_count(ptr as _); + } + + #[no_mangle] + pub extern "C" fn frbgen_bluebubbles_rust_arc_increment_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcFTClient( + ptr: *const std::ffi::c_void, + ) { + MoiArc::>>::increment_strong_count(ptr as _); + } + + #[no_mangle] + pub extern "C" fn frbgen_bluebubbles_rust_arc_decrement_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcFTClient( + ptr: *const std::ffi::c_void, + ) { + MoiArc::>>::decrement_strong_count(ptr as _); + } + + #[no_mangle] + pub extern "C" fn frbgen_bluebubbles_rust_arc_increment_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcFindMyClientDefaultAnisetteProvider( + ptr: *const std::ffi::c_void, + ) { + MoiArc::< + flutter_rust_bridge::for_generated::RustAutoOpaqueInner< + Arc>, + >, + >::increment_strong_count(ptr as _); + } + + #[no_mangle] + pub extern "C" fn frbgen_bluebubbles_rust_arc_decrement_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcFindMyClientDefaultAnisetteProvider( + ptr: *const std::ffi::c_void, + ) { + MoiArc::< + flutter_rust_bridge::for_generated::RustAutoOpaqueInner< + Arc>, + >, + >::decrement_strong_count(ptr as _); + } + + #[no_mangle] + pub extern "C" fn frbgen_bluebubbles_rust_arc_increment_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcIMClient( + ptr: *const std::ffi::c_void, + ) { + MoiArc::>>::increment_strong_count(ptr as _); + } + + #[no_mangle] + pub extern "C" fn frbgen_bluebubbles_rust_arc_decrement_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcIMClient( + ptr: *const std::ffi::c_void, + ) { + MoiArc::>>::decrement_strong_count(ptr as _); + } + + #[no_mangle] + pub extern "C" fn frbgen_bluebubbles_rust_arc_increment_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcIdmsAuthListener( + ptr: *const std::ffi::c_void, + ) { + MoiArc::>>::increment_strong_count(ptr as _); + } + + #[no_mangle] + pub extern "C" fn frbgen_bluebubbles_rust_arc_decrement_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcIdmsAuthListener( + ptr: *const std::ffi::c_void, + ) { + MoiArc::>>::decrement_strong_count(ptr as _); } -} -impl SseEncode - for ( - Vec, - std::collections::HashMap>, - i32, - ) -{ - // Codec=Sse (Serialization based), see doc to use other codecs - fn sse_encode(self, serializer: &mut flutter_rust_bridge::for_generated::SseSerializer) { - >::sse_encode(self.0, serializer); - >>::sse_encode( - self.1, serializer, - ); - ::sse_encode(self.2, serializer); + #[no_mangle] + pub extern "C" fn frbgen_bluebubbles_rust_arc_increment_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcKeychainClientDefaultAnisetteProvider( + ptr: *const std::ffi::c_void, + ) { + MoiArc::< + flutter_rust_bridge::for_generated::RustAutoOpaqueInner< + Arc>, + >, + >::increment_strong_count(ptr as _); } -} -impl SseEncode for (Vec, Option>) { - // Codec=Sse (Serialization based), see doc to use other codecs - fn sse_encode(self, serializer: &mut flutter_rust_bridge::for_generated::SseSerializer) { - >::sse_encode(self.0, serializer); - >>::sse_encode(self.1, serializer); + #[no_mangle] + pub extern "C" fn frbgen_bluebubbles_rust_arc_decrement_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcKeychainClientDefaultAnisetteProvider( + ptr: *const std::ffi::c_void, + ) { + MoiArc::< + flutter_rust_bridge::for_generated::RustAutoOpaqueInner< + Arc>, + >, + >::decrement_strong_count(ptr as _); } -} -impl SseEncode for (Vec, Vec) { - // Codec=Sse (Serialization based), see doc to use other codecs - fn sse_encode(self, serializer: &mut flutter_rust_bridge::for_generated::SseSerializer) { - >::sse_encode(self.0, serializer); - >::sse_encode(self.1, serializer); + #[no_mangle] + pub extern "C" fn frbgen_bluebubbles_rust_arc_increment_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcMutexAppleAccountDefaultAnisetteProvider( + ptr: *const std::ffi::c_void, + ) { + MoiArc::< + flutter_rust_bridge::for_generated::RustAutoOpaqueInner< + Arc>>, + >, + >::increment_strong_count(ptr as _); } -} -impl SseEncode - for ( - Vec, - Option, - ) -{ - // Codec=Sse (Serialization based), see doc to use other codecs - fn sse_encode(self, serializer: &mut flutter_rust_bridge::for_generated::SseSerializer) { - >::sse_encode(self.0, serializer); - >::sse_encode(self.1, serializer); + #[no_mangle] + pub extern "C" fn frbgen_bluebubbles_rust_arc_decrement_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcMutexAppleAccountDefaultAnisetteProvider( + ptr: *const std::ffi::c_void, + ) { + MoiArc::< + flutter_rust_bridge::for_generated::RustAutoOpaqueInner< + Arc>>, + >, + >::decrement_strong_count(ptr as _); } -} -impl SseEncode for (crate::api::api::LoginState, Option) { - // Codec=Sse (Serialization based), see doc to use other codecs - fn sse_encode(self, serializer: &mut flutter_rust_bridge::for_generated::SseSerializer) { - ::sse_encode(self.0, serializer); - >::sse_encode(self.1, serializer); + #[no_mangle] + pub extern "C" fn frbgen_bluebubbles_rust_arc_increment_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcMutexOptionCircleClientSessionDefaultAnisetteProvider( + ptr: *const std::ffi::c_void, + ) { + MoiArc::< + flutter_rust_bridge::for_generated::RustAutoOpaqueInner< + Arc>>>, + >, + >::increment_strong_count(ptr as _); } -} -impl SseEncode - for ( - std::collections::HashMap, - Option<(String, u64)>, - ) -{ - // Codec=Sse (Serialization based), see doc to use other codecs - fn sse_encode(self, serializer: &mut flutter_rust_bridge::for_generated::SseSerializer) { - >::sse_encode( - self.0, serializer, - ); - >::sse_encode(self.1, serializer); + #[no_mangle] + pub extern "C" fn frbgen_bluebubbles_rust_arc_decrement_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcMutexOptionCircleClientSessionDefaultAnisetteProvider( + ptr: *const std::ffi::c_void, + ) { + MoiArc::< + flutter_rust_bridge::for_generated::RustAutoOpaqueInner< + Arc>>>, + >, + >::decrement_strong_count(ptr as _); } -} -impl SseEncode for (Option>, Option) { - // Codec=Sse (Serialization based), see doc to use other codecs - fn sse_encode(self, serializer: &mut flutter_rust_bridge::for_generated::SseSerializer) { - >>::sse_encode(self.0, serializer); - >::sse_encode(self.1, serializer); + #[no_mangle] + pub extern "C" fn frbgen_bluebubbles_rust_arc_increment_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcMutexVecActiveCircleSession( + ptr: *const std::ffi::c_void, + ) { + MoiArc::< + flutter_rust_bridge::for_generated::RustAutoOpaqueInner< + Arc>>, + >, + >::increment_strong_count(ptr as _); } -} -impl SseEncode for (Option, crate::api::api::Passkey) { - // Codec=Sse (Serialization based), see doc to use other codecs - fn sse_encode(self, serializer: &mut flutter_rust_bridge::for_generated::SseSerializer) { - >::sse_encode(self.0, serializer); - ::sse_encode(self.1, serializer); + #[no_mangle] + pub extern "C" fn frbgen_bluebubbles_rust_arc_decrement_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcMutexVecActiveCircleSession( + ptr: *const std::ffi::c_void, + ) { + MoiArc::< + flutter_rust_bridge::for_generated::RustAutoOpaqueInner< + Arc>>, + >, + >::decrement_strong_count(ptr as _); } -} -impl SseEncode for (Option, crate::api::api::PasswordManagerMeta) { - // Codec=Sse (Serialization based), see doc to use other codecs - fn sse_encode(self, serializer: &mut flutter_rust_bridge::for_generated::SseSerializer) { - >::sse_encode(self.0, serializer); - ::sse_encode(self.1, serializer); + #[no_mangle] + pub extern "C" fn frbgen_bluebubbles_rust_arc_increment_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcPasswordManagerDefaultAnisetteProvider( + ptr: *const std::ffi::c_void, + ) { + MoiArc::< + flutter_rust_bridge::for_generated::RustAutoOpaqueInner< + Arc>, + >, + >::increment_strong_count(ptr as _); } -} -impl SseEncode for (Option, crate::api::api::PasswordRawEntry) { - // Codec=Sse (Serialization based), see doc to use other codecs - fn sse_encode(self, serializer: &mut flutter_rust_bridge::for_generated::SseSerializer) { - >::sse_encode(self.0, serializer); - ::sse_encode(self.1, serializer); + #[no_mangle] + pub extern "C" fn frbgen_bluebubbles_rust_arc_decrement_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcPasswordManagerDefaultAnisetteProvider( + ptr: *const std::ffi::c_void, + ) { + MoiArc::< + flutter_rust_bridge::for_generated::RustAutoOpaqueInner< + Arc>, + >, + >::decrement_strong_count(ptr as _); } -} -impl SseEncode for (Option, crate::api::api::WifiPassword) { - // Codec=Sse (Serialization based), see doc to use other codecs - fn sse_encode(self, serializer: &mut flutter_rust_bridge::for_generated::SseSerializer) { - >::sse_encode(self.0, serializer); - ::sse_encode(self.1, serializer); + #[no_mangle] + pub extern "C" fn frbgen_bluebubbles_rust_arc_increment_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcProfilesClientDefaultAnisetteProvider( + ptr: *const std::ffi::c_void, + ) { + MoiArc::< + flutter_rust_bridge::for_generated::RustAutoOpaqueInner< + Arc>, + >, + >::increment_strong_count(ptr as _); } -} -impl SseEncode for (crate::api::api::SharedPushState, APSWatcher) { - // Codec=Sse (Serialization based), see doc to use other codecs - fn sse_encode(self, serializer: &mut flutter_rust_bridge::for_generated::SseSerializer) { - ::sse_encode(self.0, serializer); - ::sse_encode(self.1, serializer); + #[no_mangle] + pub extern "C" fn frbgen_bluebubbles_rust_arc_decrement_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcProfilesClientDefaultAnisetteProvider( + ptr: *const std::ffi::c_void, + ) { + MoiArc::< + flutter_rust_bridge::for_generated::RustAutoOpaqueInner< + Arc>, + >, + >::decrement_strong_count(ptr as _); } -} -impl SseEncode for (String, Asset) { - // Codec=Sse (Serialization based), see doc to use other codecs - fn sse_encode(self, serializer: &mut flutter_rust_bridge::for_generated::SseSerializer) { - ::sse_encode(self.0, serializer); - ::sse_encode(self.1, serializer); + #[no_mangle] + pub extern "C" fn frbgen_bluebubbles_rust_arc_increment_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcSenderPushMessage( + ptr: *const std::ffi::c_void, + ) { + MoiArc:: >>>::increment_strong_count(ptr as _); } -} -impl SseEncode for (String, StCollapsedValue) { - // Codec=Sse (Serialization based), see doc to use other codecs - fn sse_encode(self, serializer: &mut flutter_rust_bridge::for_generated::SseSerializer) { - ::sse_encode(self.0, serializer); - ::sse_encode(self.1, serializer); + #[no_mangle] + pub extern "C" fn frbgen_bluebubbles_rust_arc_decrement_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcSenderPushMessage( + ptr: *const std::ffi::c_void, + ) { + MoiArc:: >>>::decrement_strong_count(ptr as _); } -} -impl SseEncode for (String, bool) { - // Codec=Sse (Serialization based), see doc to use other codecs - fn sse_encode(self, serializer: &mut flutter_rust_bridge::for_generated::SseSerializer) { - ::sse_encode(self.0, serializer); - ::sse_encode(self.1, serializer); + #[no_mangle] + pub extern "C" fn frbgen_bluebubbles_rust_arc_increment_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcSharedPushState( + ptr: *const std::ffi::c_void, + ) { + MoiArc::>>::increment_strong_count(ptr as _); } -} -impl SseEncode for (String, u64) { - // Codec=Sse (Serialization based), see doc to use other codecs - fn sse_encode(self, serializer: &mut flutter_rust_bridge::for_generated::SseSerializer) { - ::sse_encode(self.0, serializer); - ::sse_encode(self.1, serializer); + #[no_mangle] + pub extern "C" fn frbgen_bluebubbles_rust_arc_decrement_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcSharedPushState( + ptr: *const std::ffi::c_void, + ) { + MoiArc::>>::decrement_strong_count(ptr as _); } -} -impl SseEncode for (String, crate::api::api::CloudAttachment) { - // Codec=Sse (Serialization based), see doc to use other codecs - fn sse_encode(self, serializer: &mut flutter_rust_bridge::for_generated::SseSerializer) { - ::sse_encode(self.0, serializer); - ::sse_encode(self.1, serializer); + #[no_mangle] + pub extern "C" fn frbgen_bluebubbles_rust_arc_increment_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcStatusKitClientDefaultAnisetteProvider( + ptr: *const std::ffi::c_void, + ) { + MoiArc::< + flutter_rust_bridge::for_generated::RustAutoOpaqueInner< + Arc>, + >, + >::increment_strong_count(ptr as _); } -} -impl SseEncode for (String, crate::api::api::CloudChat) { - // Codec=Sse (Serialization based), see doc to use other codecs - fn sse_encode(self, serializer: &mut flutter_rust_bridge::for_generated::SseSerializer) { - ::sse_encode(self.0, serializer); - ::sse_encode(self.1, serializer); + #[no_mangle] + pub extern "C" fn frbgen_bluebubbles_rust_arc_decrement_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcStatusKitClientDefaultAnisetteProvider( + ptr: *const std::ffi::c_void, + ) { + MoiArc::< + flutter_rust_bridge::for_generated::RustAutoOpaqueInner< + Arc>, + >, + >::decrement_strong_count(ptr as _); } -} -impl SseEncode for (String, crate::api::api::CloudMessage) { - // Codec=Sse (Serialization based), see doc to use other codecs - fn sse_encode(self, serializer: &mut flutter_rust_bridge::for_generated::SseSerializer) { - ::sse_encode(self.0, serializer); - ::sse_encode(self.1, serializer); + #[no_mangle] + pub extern "C" fn frbgen_bluebubbles_rust_arc_increment_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcTokenProviderDefaultAnisetteProvider( + ptr: *const std::ffi::c_void, + ) { + MoiArc::< + flutter_rust_bridge::for_generated::RustAutoOpaqueInner< + Arc>, + >, + >::increment_strong_count(ptr as _); } -} -impl SseEncode for (String, crate::api::api::FTParticipant) { - // Codec=Sse (Serialization based), see doc to use other codecs - fn sse_encode(self, serializer: &mut flutter_rust_bridge::for_generated::SseSerializer) { - ::sse_encode(self.0, serializer); - ::sse_encode(self.1, serializer); + #[no_mangle] + pub extern "C" fn frbgen_bluebubbles_rust_arc_decrement_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcTokenProviderDefaultAnisetteProvider( + ptr: *const std::ffi::c_void, + ) { + MoiArc::< + flutter_rust_bridge::for_generated::RustAutoOpaqueInner< + Arc>, + >, + >::decrement_strong_count(ptr as _); } -} -impl SseEncode for (String, crate::api::api::GroupSummary) { - // Codec=Sse (Serialization based), see doc to use other codecs - fn sse_encode(self, serializer: &mut flutter_rust_bridge::for_generated::SseSerializer) { - ::sse_encode(self.0, serializer); - ::sse_encode(self.1, serializer); + #[no_mangle] + pub extern "C" fn frbgen_bluebubbles_rust_arc_increment_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerAsset( + ptr: *const std::ffi::c_void, + ) { + MoiArc::>::increment_strong_count(ptr as _); } -} -impl SseEncode for (String, Vec) { - // Codec=Sse (Serialization based), see doc to use other codecs - fn sse_encode(self, serializer: &mut flutter_rust_bridge::for_generated::SseSerializer) { - ::sse_encode(self.0, serializer); - >::sse_encode(self.1, serializer); + #[no_mangle] + pub extern "C" fn frbgen_bluebubbles_rust_arc_decrement_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerAsset( + ptr: *const std::ffi::c_void, + ) { + MoiArc::>::decrement_strong_count(ptr as _); } -} -impl SseEncode for (String, Vec) { - // Codec=Sse (Serialization based), see doc to use other codecs - fn sse_encode(self, serializer: &mut flutter_rust_bridge::for_generated::SseSerializer) { - ::sse_encode(self.0, serializer); - >::sse_encode(self.1, serializer); + #[no_mangle] + pub extern "C" fn frbgen_bluebubbles_rust_arc_increment_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerChannelInterestToken( + ptr: *const std::ffi::c_void, + ) { + MoiArc::>::increment_strong_count(ptr as _); } -} -impl SseEncode - for ( - String, - std::collections::HashMap, - std::collections::HashMap, - ) -{ - // Codec=Sse (Serialization based), see doc to use other codecs - fn sse_encode(self, serializer: &mut flutter_rust_bridge::for_generated::SseSerializer) { - ::sse_encode(self.0, serializer); - >::sse_encode( - self.1, serializer, - ); - >::sse_encode( - self.2, serializer, - ); + #[no_mangle] + pub extern "C" fn frbgen_bluebubbles_rust_arc_decrement_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerChannelInterestToken( + ptr: *const std::ffi::c_void, + ) { + MoiArc::>::decrement_strong_count(ptr as _); } -} -impl SseEncode for (String, crate::api::api::MessageEditRange) { - // Codec=Sse (Serialization based), see doc to use other codecs - fn sse_encode(self, serializer: &mut flutter_rust_bridge::for_generated::SseSerializer) { - ::sse_encode(self.0, serializer); - ::sse_encode(self.1, serializer); + #[no_mangle] + pub extern "C" fn frbgen_bluebubbles_rust_arc_increment_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerCircleClientSessionDefaultAnisetteProvider( + ptr: *const std::ffi::c_void, + ) { + MoiArc::< + flutter_rust_bridge::for_generated::RustAutoOpaqueInner< + CircleClientSession, + >, + >::increment_strong_count(ptr as _); } -} -impl SseEncode for (String, Option) { - // Codec=Sse (Serialization based), see doc to use other codecs - fn sse_encode(self, serializer: &mut flutter_rust_bridge::for_generated::SseSerializer) { - ::sse_encode(self.0, serializer); - >::sse_encode(self.1, serializer); + #[no_mangle] + pub extern "C" fn frbgen_bluebubbles_rust_arc_decrement_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerCircleClientSessionDefaultAnisetteProvider( + ptr: *const std::ffi::c_void, + ) { + MoiArc::< + flutter_rust_bridge::for_generated::RustAutoOpaqueInner< + CircleClientSession, + >, + >::decrement_strong_count(ptr as _); } -} -impl SseEncode for (String, Option) { - // Codec=Sse (Serialization based), see doc to use other codecs - fn sse_encode(self, serializer: &mut flutter_rust_bridge::for_generated::SseSerializer) { - ::sse_encode(self.0, serializer); - >::sse_encode(self.1, serializer); + #[no_mangle] + pub extern "C" fn frbgen_bluebubbles_rust_arc_increment_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerCloudSyncPreparedMessageCreateHandle( + ptr: *const std::ffi::c_void, + ) { + MoiArc::< + flutter_rust_bridge::for_generated::RustAutoOpaqueInner< + CloudSyncPreparedMessageCreateHandle, + >, + >::increment_strong_count(ptr as _); } -} -impl SseEncode for (String, Option) { - // Codec=Sse (Serialization based), see doc to use other codecs - fn sse_encode(self, serializer: &mut flutter_rust_bridge::for_generated::SseSerializer) { - ::sse_encode(self.0, serializer); - >::sse_encode(self.1, serializer); + #[no_mangle] + pub extern "C" fn frbgen_bluebubbles_rust_arc_decrement_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerCloudSyncPreparedMessageCreateHandle( + ptr: *const std::ffi::c_void, + ) { + MoiArc::< + flutter_rust_bridge::for_generated::RustAutoOpaqueInner< + CloudSyncPreparedMessageCreateHandle, + >, + >::decrement_strong_count(ptr as _); } -} -impl SseEncode for (String, crate::api::api::PasswordManagerMetaDataCtx) { - // Codec=Sse (Serialization based), see doc to use other codecs - fn sse_encode(self, serializer: &mut flutter_rust_bridge::for_generated::SseSerializer) { - ::sse_encode(self.0, serializer); - ::sse_encode(self.1, serializer); + #[no_mangle] + pub extern "C" fn frbgen_bluebubbles_rust_arc_increment_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerConversationLink( + ptr: *const std::ffi::c_void, + ) { + MoiArc::>::increment_strong_count(ptr as _); } -} -impl SseEncode for (String, (Option, crate::api::api::Passkey)) { - // Codec=Sse (Serialization based), see doc to use other codecs - fn sse_encode(self, serializer: &mut flutter_rust_bridge::for_generated::SseSerializer) { - ::sse_encode(self.0, serializer); - <(Option, crate::api::api::Passkey)>::sse_encode(self.1, serializer); + #[no_mangle] + pub extern "C" fn frbgen_bluebubbles_rust_arc_decrement_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerConversationLink( + ptr: *const std::ffi::c_void, + ) { + MoiArc::>::decrement_strong_count(ptr as _); } -} -impl SseEncode - for ( - String, - (Option, crate::api::api::PasswordManagerMeta), - ) -{ - // Codec=Sse (Serialization based), see doc to use other codecs - fn sse_encode(self, serializer: &mut flutter_rust_bridge::for_generated::SseSerializer) { - ::sse_encode(self.0, serializer); - <(Option, crate::api::api::PasswordManagerMeta)>::sse_encode(self.1, serializer); + #[no_mangle] + pub extern "C" fn frbgen_bluebubbles_rust_arc_increment_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerConversationParticipant( + ptr: *const std::ffi::c_void, + ) { + MoiArc::>::increment_strong_count(ptr as _); } -} -impl SseEncode for (String, (Option, crate::api::api::PasswordRawEntry)) { - // Codec=Sse (Serialization based), see doc to use other codecs - fn sse_encode(self, serializer: &mut flutter_rust_bridge::for_generated::SseSerializer) { - ::sse_encode(self.0, serializer); - <(Option, crate::api::api::PasswordRawEntry)>::sse_encode(self.1, serializer); + #[no_mangle] + pub extern "C" fn frbgen_bluebubbles_rust_arc_decrement_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerConversationParticipant( + ptr: *const std::ffi::c_void, + ) { + MoiArc::>::decrement_strong_count(ptr as _); } -} -impl SseEncode for (String, (Option, crate::api::api::WifiPassword)) { - // Codec=Sse (Serialization based), see doc to use other codecs - fn sse_encode(self, serializer: &mut flutter_rust_bridge::for_generated::SseSerializer) { - ::sse_encode(self.0, serializer); - <(Option, crate::api::api::WifiPassword)>::sse_encode(self.1, serializer); + #[no_mangle] + pub extern "C" fn frbgen_bluebubbles_rust_arc_increment_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerDate( + ptr: *const std::ffi::c_void, + ) { + MoiArc::>::increment_strong_count(ptr as _); } -} -impl SseEncode for (String, crate::api::api::ShareInviteContentData) { - // Codec=Sse (Serialization based), see doc to use other codecs - fn sse_encode(self, serializer: &mut flutter_rust_bridge::for_generated::SseSerializer) { - ::sse_encode(self.0, serializer); - ::sse_encode(self.1, serializer); + #[no_mangle] + pub extern "C" fn frbgen_bluebubbles_rust_arc_decrement_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerDate( + ptr: *const std::ffi::c_void, + ) { + MoiArc::>::decrement_strong_count(ptr as _); } -} -impl SseEncode for (String, crate::api::api::SharedPushState) { - // Codec=Sse (Serialization based), see doc to use other codecs - fn sse_encode(self, serializer: &mut flutter_rust_bridge::for_generated::SseSerializer) { - ::sse_encode(self.0, serializer); - ::sse_encode(self.1, serializer); + #[no_mangle] + pub extern "C" fn frbgen_bluebubbles_rust_arc_increment_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerEscrowData( + ptr: *const std::ffi::c_void, + ) { + MoiArc::>::increment_strong_count(ptr as _); } -} -impl SseEncode for (String, crate::api::api::StatusKitPersonalConfig) { - // Codec=Sse (Serialization based), see doc to use other codecs - fn sse_encode(self, serializer: &mut flutter_rust_bridge::for_generated::SseSerializer) { - ::sse_encode(self.0, serializer); - ::sse_encode(self.1, serializer); + #[no_mangle] + pub extern "C" fn frbgen_bluebubbles_rust_arc_decrement_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerEscrowData( + ptr: *const std::ffi::c_void, + ) { + MoiArc::>::decrement_strong_count(ptr as _); } -} -impl SseEncode for (String, String) { - // Codec=Sse (Serialization based), see doc to use other codecs - fn sse_encode(self, serializer: &mut flutter_rust_bridge::for_generated::SseSerializer) { - ::sse_encode(self.0, serializer); - ::sse_encode(self.1, serializer); + #[no_mangle] + pub extern "C" fn frbgen_bluebubbles_rust_arc_increment_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerFindMyFriendsClientDefaultAnisetteProvider( + ptr: *const std::ffi::c_void, + ) { + MoiArc::< + flutter_rust_bridge::for_generated::RustAutoOpaqueInner< + FindMyFriendsClient, + >, + >::increment_strong_count(ptr as _); } -} -impl SseEncode for (String, crate::api::api::SyncStatus) { - // Codec=Sse (Serialization based), see doc to use other codecs - fn sse_encode(self, serializer: &mut flutter_rust_bridge::for_generated::SseSerializer) { - ::sse_encode(self.0, serializer); - ::sse_encode(self.1, serializer); + #[no_mangle] + pub extern "C" fn frbgen_bluebubbles_rust_arc_decrement_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerFindMyFriendsClientDefaultAnisetteProvider( + ptr: *const std::ffi::c_void, + ) { + MoiArc::< + flutter_rust_bridge::for_generated::RustAutoOpaqueInner< + FindMyFriendsClient, + >, + >::decrement_strong_count(ptr as _); } -} -impl SseEncode for (String, crate::api::api::UpdateAccountFinish) { - // Codec=Sse (Serialization based), see doc to use other codecs - fn sse_encode(self, serializer: &mut flutter_rust_bridge::for_generated::SseSerializer) { - ::sse_encode(self.0, serializer); - ::sse_encode(self.1, serializer); + #[no_mangle] + pub extern "C" fn frbgen_bluebubbles_rust_arc_increment_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerFindMyPhoneClientDefaultAnisetteProvider( + ptr: *const std::ffi::c_void, + ) { + MoiArc::< + flutter_rust_bridge::for_generated::RustAutoOpaqueInner< + FindMyPhoneClient, + >, + >::increment_strong_count(ptr as _); } -} -impl SseEncode for (u32, crate::api::api::NSDictionaryTypedCoder) { - // Codec=Sse (Serialization based), see doc to use other codecs - fn sse_encode(self, serializer: &mut flutter_rust_bridge::for_generated::SseSerializer) { - ::sse_encode(self.0, serializer); - ::sse_encode(self.1, serializer); + #[no_mangle] + pub extern "C" fn frbgen_bluebubbles_rust_arc_decrement_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerFindMyPhoneClientDefaultAnisetteProvider( + ptr: *const std::ffi::c_void, + ) { + MoiArc::< + flutter_rust_bridge::for_generated::RustAutoOpaqueInner< + FindMyPhoneClient, + >, + >::decrement_strong_count(ptr as _); } -} -impl SseEncode for (u32, u64) { - // Codec=Sse (Serialization based), see doc to use other codecs - fn sse_encode(self, serializer: &mut flutter_rust_bridge::for_generated::SseSerializer) { - ::sse_encode(self.0, serializer); - ::sse_encode(self.1, serializer); + #[no_mangle] + pub extern "C" fn frbgen_bluebubbles_rust_arc_increment_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerGZipWrapperAttachmentMeta( + ptr: *const std::ffi::c_void, + ) { + MoiArc::< + flutter_rust_bridge::for_generated::RustAutoOpaqueInner>, + >::increment_strong_count(ptr as _); } -} -impl SseEncode for crate::api::api::RegisterState { - // Codec=Sse (Serialization based), see doc to use other codecs - fn sse_encode(self, serializer: &mut flutter_rust_bridge::for_generated::SseSerializer) { - match self { - crate::api::api::RegisterState::Registered { next_s } => { - ::sse_encode(0, serializer); - ::sse_encode(next_s, serializer); - } - crate::api::api::RegisterState::Registering => { - ::sse_encode(1, serializer); - } - crate::api::api::RegisterState::Failed { retry_wait, error } => { - ::sse_encode(2, serializer); - >::sse_encode(retry_wait, serializer); - ::sse_encode(error, serializer); - } - _ => { - unimplemented!(""); - } - } + #[no_mangle] + pub extern "C" fn frbgen_bluebubbles_rust_arc_decrement_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerGZipWrapperAttachmentMeta( + ptr: *const std::ffi::c_void, + ) { + MoiArc::< + flutter_rust_bridge::for_generated::RustAutoOpaqueInner>, + >::decrement_strong_count(ptr as _); } -} -impl SseEncode for crate::api::api::RenameMessage { - // Codec=Sse (Serialization based), see doc to use other codecs - fn sse_encode(self, serializer: &mut flutter_rust_bridge::for_generated::SseSerializer) { - ::sse_encode(self.new_name, serializer); + #[no_mangle] + pub extern "C" fn frbgen_bluebubbles_rust_arc_increment_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerGZipWrapperChatProto( + ptr: *const std::ffi::c_void, + ) { + MoiArc::>>::increment_strong_count(ptr as _); } -} -impl SseEncode for crate::api::api::ReportMessage { - // Codec=Sse (Serialization based), see doc to use other codecs - fn sse_encode(self, serializer: &mut flutter_rust_bridge::for_generated::SseSerializer) { - ::sse_encode(self.guid, serializer); - ::sse_encode(self.sender, serializer); - ::sse_encode(self.conversation_size, serializer); - ::sse_encode(self.parts, serializer); - ::sse_encode(self.time_of_message, serializer); + #[no_mangle] + pub extern "C" fn frbgen_bluebubbles_rust_arc_decrement_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerGZipWrapperChatProto( + ptr: *const std::ffi::c_void, + ) { + MoiArc::>>::decrement_strong_count(ptr as _); } -} -impl SseEncode for crate::api::api::RichLinkImageAttachmentSubstitute { - // Codec=Sse (Serialization based), see doc to use other codecs - fn sse_encode(self, serializer: &mut flutter_rust_bridge::for_generated::SseSerializer) { - ::sse_encode(self.mime_type, serializer); - ::sse_encode(self.rich_link_image_attachment_substitute_index, serializer); + #[no_mangle] + pub extern "C" fn frbgen_bluebubbles_rust_arc_increment_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerGZipWrapperMessageProto( + ptr: *const std::ffi::c_void, + ) { + MoiArc::>>::increment_strong_count(ptr as _); } -} -impl SseEncode for crate::api::api::ScheduleMode { - // Codec=Sse (Serialization based), see doc to use other codecs - fn sse_encode(self, serializer: &mut flutter_rust_bridge::for_generated::SseSerializer) { - ::sse_encode(self.ms, serializer); - ::sse_encode(self.schedule, serializer); + #[no_mangle] + pub extern "C" fn frbgen_bluebubbles_rust_arc_decrement_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerGZipWrapperMessageProto( + ptr: *const std::ffi::c_void, + ) { + MoiArc::>>::decrement_strong_count(ptr as _); } -} -impl SseEncode for crate::api::api::SetTranscriptBackgroundMessage { - // Codec=Sse (Serialization based), see doc to use other codecs - fn sse_encode(self, serializer: &mut flutter_rust_bridge::for_generated::SseSerializer) { - match self { - crate::api::api::SetTranscriptBackgroundMessage::Remove { - aid, - bid, - chat_id, - remove, - } => { - ::sse_encode(0, serializer); - ::sse_encode(aid, serializer); - ::sse_encode(bid, serializer); - >::sse_encode(chat_id, serializer); - ::sse_encode(remove, serializer); - } - crate::api::api::SetTranscriptBackgroundMessage::Set { - aid, - bid, - chat_id, - object_id, - payload_version, - background_id, - url, - signature, - key, - file_size, - } => { - ::sse_encode(1, serializer); - ::sse_encode(aid, serializer); - ::sse_encode(bid, serializer); - >::sse_encode(chat_id, serializer); - ::sse_encode(object_id, serializer); - ::sse_encode(payload_version, serializer); - ::sse_encode(background_id, serializer); - ::sse_encode(url, serializer); - ::sse_encode(signature, serializer); - ::sse_encode(key, serializer); - ::sse_encode(file_size, serializer); - } - _ => { - unimplemented!(""); - } - } + #[no_mangle] + pub extern "C" fn frbgen_bluebubbles_rust_arc_increment_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerGZipWrapperMessageProto2( + ptr: *const std::ffi::c_void, + ) { + MoiArc::>>::increment_strong_count(ptr as _); } -} -impl SseEncode for crate::api::api::ShareInviteContentData { - // Codec=Sse (Serialization based), see doc to use other codecs - fn sse_encode(self, serializer: &mut flutter_rust_bridge::for_generated::SseSerializer) { - >::sse_encode(self.invitation_token, serializer); - ::sse_encode(self.group_id, serializer); - ::sse_encode(self.sent_time, serializer); - ::sse_encode(self.group_name, serializer); - ::sse_encode(self.share_url, serializer); - ::sse_encode(self.invitee_handle, serializer); + #[no_mangle] + pub extern "C" fn frbgen_bluebubbles_rust_arc_decrement_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerGZipWrapperMessageProto2( + ptr: *const std::ffi::c_void, + ) { + MoiArc::>>::decrement_strong_count(ptr as _); } -} -impl SseEncode for crate::api::api::ShareProfileMessage { - // Codec=Sse (Serialization based), see doc to use other codecs - fn sse_encode(self, serializer: &mut flutter_rust_bridge::for_generated::SseSerializer) { - >::sse_encode(self.cloud_kit_decryption_record_key, serializer); - ::sse_encode(self.cloud_kit_record_key, serializer); - >::sse_encode(self.poster, serializer); + #[no_mangle] + pub extern "C" fn frbgen_bluebubbles_rust_arc_increment_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerGZipWrapperMessageProto3( + ptr: *const std::ffi::c_void, + ) { + MoiArc::>>::increment_strong_count(ptr as _); } -} -impl SseEncode for crate::api::api::SharedAlbum { - // Codec=Sse (Serialization based), see doc to use other codecs - fn sse_encode(self, serializer: &mut flutter_rust_bridge::for_generated::SseSerializer) { - >::sse_encode(self.name, serializer); - >::sse_encode(self.fullname, serializer); - >::sse_encode(self.email, serializer); - ::sse_encode(self.albumguid, serializer); - ::sse_encode(self.sharingtype, serializer); - >::sse_encode(self.subscriptiondate, serializer); - >::sse_encode(self.albumlocation, serializer); - >::sse_encode(self.assets, serializer); - >::sse_encode(self.delete, serializer); + #[no_mangle] + pub extern "C" fn frbgen_bluebubbles_rust_arc_decrement_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerGZipWrapperMessageProto3( + ptr: *const std::ffi::c_void, + ) { + MoiArc::>>::decrement_strong_count(ptr as _); } -} -impl SseEncode for crate::api::api::SharedICloudServices { - // Codec=Sse (Serialization based), see doc to use other codecs - fn sse_encode(self, serializer: &mut flutter_rust_bridge::for_generated::SseSerializer) { - >>>::sse_encode(self.account, serializer); - >>::sse_encode(self.token_provider, serializer); - >>>::sse_encode( - self.cloudkit_client, - serializer, - ); - >>>::sse_encode( - self.keychain, - serializer, - ); - >>>::sse_encode( - self.passwords, - serializer, - ); - >>::sse_encode( - self.profiles_client, - serializer, - ); - >>>::sse_encode(self.fmfd, serializer); - >>::sse_encode( - self.sharedstreams, - serializer, - ); - >>>::sse_encode( - self.cloud_messages_client, - serializer, - ); - >>::sse_encode( - self.statuskit_client, - serializer, - ); + #[no_mangle] + pub extern "C" fn frbgen_bluebubbles_rust_arc_increment_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerGZipWrapperMessageProto4( + ptr: *const std::ffi::c_void, + ) { + MoiArc::>>::increment_strong_count(ptr as _); } -} -impl SseEncode for crate::api::api::SharedPoster { - // Codec=Sse (Serialization based), see doc to use other codecs - fn sse_encode(self, serializer: &mut flutter_rust_bridge::for_generated::SseSerializer) { - >::sse_encode(self.low_res_wallpaper_tag, serializer); - >::sse_encode(self.wallpaper_tag, serializer); - >::sse_encode(self.message_tag, serializer); + #[no_mangle] + pub extern "C" fn frbgen_bluebubbles_rust_arc_decrement_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerGZipWrapperMessageProto4( + ptr: *const std::ffi::c_void, + ) { + MoiArc::>>::decrement_strong_count(ptr as _); } -} -impl SseEncode for crate::api::api::SharedPushState { - // Codec=Sse (Serialization based), see doc to use other codecs - fn sse_encode(self, serializer: &mut flutter_rust_bridge::for_generated::SseSerializer) { - ::sse_encode(self.os_config, serializer); - >::sse_encode(self.cancel_poll, serializer); - ::sse_encode(self.conf_dir, serializer); - >>::sse_encode(self.local_broadcast, serializer); - >::sse_encode(self.anisette, serializer); - ::sse_encode(self.conn, serializer); - >::sse_encode( - self.icloud_services, - serializer, - ); - >::sse_encode(self.client, serializer); - >::sse_encode(self.ft_client, serializer); - >::sse_encode(self.idms_client, serializer); - >>>::sse_encode(self.active_circle_sessions, serializer); - >>>>::sse_encode( - self.client_session, - serializer, - ); + #[no_mangle] + pub extern "C" fn frbgen_bluebubbles_rust_arc_increment_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerIDSNGMIdentity( + ptr: *const std::ffi::c_void, + ) { + MoiArc::>::increment_strong_count(ptr as _); } -} -impl SseEncode for crate::api::api::SimplifiedIncomingCallPoster { - // Codec=Sse (Serialization based), see doc to use other codecs - fn sse_encode(self, serializer: &mut flutter_rust_bridge::for_generated::SseSerializer) { - ::sse_encode(self.poster, serializer); - ::sse_encode(self.text_metadata, serializer); - >::sse_encode(self.low_res, serializer); + #[no_mangle] + pub extern "C" fn frbgen_bluebubbles_rust_arc_decrement_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerIDSNGMIdentity( + ptr: *const std::ffi::c_void, + ) { + MoiArc::>::decrement_strong_count(ptr as _); } -} -impl SseEncode for crate::api::api::SimplifiedPoster { - // Codec=Sse (Serialization based), see doc to use other codecs - fn sse_encode(self, serializer: &mut flutter_rust_bridge::for_generated::SseSerializer) { - ::sse_encode( - self.title_configuration, - serializer, - ); - ::sse_encode(self.r#type, serializer); - ::sse_encode(self.role, serializer); + #[no_mangle] + pub extern "C" fn frbgen_bluebubbles_rust_arc_increment_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerIDSUser( + ptr: *const std::ffi::c_void, + ) { + MoiArc::>::increment_strong_count(ptr as _); } -} -impl SseEncode for crate::api::api::SimplifiedTranscriptPoster { - // Codec=Sse (Serialization based), see doc to use other codecs - fn sse_encode(self, serializer: &mut flutter_rust_bridge::for_generated::SseSerializer) { - ::sse_encode(self.watch, serializer); - ::sse_encode(self.poster, serializer); + #[no_mangle] + pub extern "C" fn frbgen_bluebubbles_rust_arc_decrement_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerIDSUser( + ptr: *const std::ffi::c_void, + ) { + MoiArc::>::decrement_strong_count(ptr as _); } -} -impl SseEncode for crate::api::api::StatusKitMessage { - // Codec=Sse (Serialization based), see doc to use other codecs - fn sse_encode(self, serializer: &mut flutter_rust_bridge::for_generated::SseSerializer) { - match self { - crate::api::api::StatusKitMessage::StatusChanged { - user, - mode, - allowed, - } => { - ::sse_encode(0, serializer); - ::sse_encode(user, serializer); - >::sse_encode(mode, serializer); - ::sse_encode(allowed, serializer); - } - _ => { - unimplemented!(""); - } - } + #[no_mangle] + pub extern "C" fn frbgen_bluebubbles_rust_arc_increment_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerJoinedOSConfig( + ptr: *const std::ffi::c_void, + ) { + MoiArc::>::increment_strong_count(ptr as _); } -} -impl SseEncode for crate::api::api::StatusKitPersonalConfig { - // Codec=Sse (Serialization based), see doc to use other codecs - fn sse_encode(self, serializer: &mut flutter_rust_bridge::for_generated::SseSerializer) { - >::sse_encode(self.allowed_modes, serializer); + #[no_mangle] + pub extern "C" fn frbgen_bluebubbles_rust_arc_decrement_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerJoinedOSConfig( + ptr: *const std::ffi::c_void, + ) { + MoiArc::>::decrement_strong_count(ptr as _); } -} -impl SseEncode for crate::api::api::SupportAction { - // Codec=Sse (Serialization based), see doc to use other codecs - fn sse_encode(self, serializer: &mut flutter_rust_bridge::for_generated::SseSerializer) { - ::sse_encode(self.url, serializer); - ::sse_encode(self.button, serializer); + #[no_mangle] + pub extern "C" fn frbgen_bluebubbles_rust_arc_increment_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerLocationReport( + ptr: *const std::ffi::c_void, + ) { + MoiArc::>::increment_strong_count(ptr as _); } -} -impl SseEncode for crate::api::api::SupportAlert { - // Codec=Sse (Serialization based), see doc to use other codecs - fn sse_encode(self, serializer: &mut flutter_rust_bridge::for_generated::SseSerializer) { - ::sse_encode(self.title, serializer); - ::sse_encode(self.body, serializer); - >::sse_encode(self.action, serializer); + #[no_mangle] + pub extern "C" fn frbgen_bluebubbles_rust_arc_decrement_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerLocationReport( + ptr: *const std::ffi::c_void, + ) { + MoiArc::>::decrement_strong_count(ptr as _); } -} -impl SseEncode for crate::api::api::SyncStatus { - // Codec=Sse (Serialization based), see doc to use other codecs - fn sse_encode(self, serializer: &mut flutter_rust_bridge::for_generated::SseSerializer) { - match self { - crate::api::api::SyncStatus::Synced => { - ::sse_encode(0, serializer); - } - crate::api::api::SyncStatus::Downloading { progress, total } => { - ::sse_encode(1, serializer); - ::sse_encode(progress, serializer); - ::sse_encode(total, serializer); - } - crate::api::api::SyncStatus::Uploading { progress, total } => { - ::sse_encode(2, serializer); - ::sse_encode(progress, serializer); - ::sse_encode(total, serializer); - } - crate::api::api::SyncStatus::Syncing => { - ::sse_encode(3, serializer); - } - _ => { - unimplemented!(""); - } - } + #[no_mangle] + pub extern "C" fn frbgen_bluebubbles_rust_arc_increment_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerMessageFlags( + ptr: *const std::ffi::c_void, + ) { + MoiArc::>::increment_strong_count(ptr as _); } -} -impl SseEncode for crate::api::api::TeardownSignIn { - // Codec=Sse (Serialization based), see doc to use other codecs - fn sse_encode(self, serializer: &mut flutter_rust_bridge::for_generated::SseSerializer) { - ::sse_encode(self.prevtxnid, serializer); + #[no_mangle] + pub extern "C" fn frbgen_bluebubbles_rust_arc_decrement_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerMessageFlags( + ptr: *const std::ffi::c_void, + ) { + MoiArc::>::decrement_strong_count(ptr as _); } -} -impl SseEncode for crate::api::api::TextEffect { - // Codec=Sse (Serialization based), see doc to use other codecs - fn sse_encode(self, serializer: &mut flutter_rust_bridge::for_generated::SseSerializer) { - ::sse_encode( - match self { - crate::api::api::TextEffect::Big => 0, - crate::api::api::TextEffect::Small => 1, - crate::api::api::TextEffect::Shake => 2, - crate::api::api::TextEffect::Nod => 3, - crate::api::api::TextEffect::Explode => 4, - crate::api::api::TextEffect::Ripple => 5, - crate::api::api::TextEffect::Bloom => 6, - crate::api::api::TextEffect::Jitter => 7, - _ => { - unimplemented!(""); - } - }, - serializer, - ); + #[no_mangle] + pub extern "C" fn frbgen_bluebubbles_rust_arc_increment_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerNSArrayLPIconMetadata( + ptr: *const std::ffi::c_void, + ) { + MoiArc::>>::increment_strong_count(ptr as _); } -} -impl SseEncode for crate::api::api::TextFlags { - // Codec=Sse (Serialization based), see doc to use other codecs - fn sse_encode(self, serializer: &mut flutter_rust_bridge::for_generated::SseSerializer) { - ::sse_encode(self.bold, serializer); - ::sse_encode(self.italic, serializer); - ::sse_encode(self.underline, serializer); - ::sse_encode(self.strikethrough, serializer); + #[no_mangle] + pub extern "C" fn frbgen_bluebubbles_rust_arc_decrement_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerNSArrayLPIconMetadata( + ptr: *const std::ffi::c_void, + ) { + MoiArc::>>::decrement_strong_count(ptr as _); } -} -impl SseEncode for crate::api::api::TextFormat { - // Codec=Sse (Serialization based), see doc to use other codecs - fn sse_encode(self, serializer: &mut flutter_rust_bridge::for_generated::SseSerializer) { - match self { - crate::api::api::TextFormat::Flags(field0) => { - ::sse_encode(0, serializer); - ::sse_encode(field0, serializer); - } - crate::api::api::TextFormat::Effect(field0) => { - ::sse_encode(1, serializer); - ::sse_encode(field0, serializer); - } - _ => { - unimplemented!(""); - } - } + #[no_mangle] + pub extern "C" fn frbgen_bluebubbles_rust_arc_increment_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerNSArrayLPImageMetadata( + ptr: *const std::ffi::c_void, + ) { + MoiArc::>>::increment_strong_count(ptr as _); } -} -impl SseEncode for crate::api::api::TranscriptDynamicUserData { - // Codec=Sse (Serialization based), see doc to use other codecs - fn sse_encode(self, serializer: &mut flutter_rust_bridge::for_generated::SseSerializer) { - ::sse_encode(self.identifier, serializer); + #[no_mangle] + pub extern "C" fn frbgen_bluebubbles_rust_arc_decrement_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerNSArrayLPImageMetadata( + ptr: *const std::ffi::c_void, + ) { + MoiArc::>>::decrement_strong_count(ptr as _); } -} -impl SseEncode for crate::api::api::TransferProgress { - // Codec=Sse (Serialization based), see doc to use other codecs - fn sse_encode(self, serializer: &mut flutter_rust_bridge::for_generated::SseSerializer) { - ::sse_encode(self.prog, serializer); - ::sse_encode(self.total, serializer); - >::sse_encode(self.attachment, serializer); + #[no_mangle] + pub extern "C" fn frbgen_bluebubbles_rust_arc_increment_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerPushError( + ptr: *const std::ffi::c_void, + ) { + MoiArc::>::increment_strong_count(ptr as _); } -} -impl SseEncode for crate::api::api::TrustedPhoneNumber { - // Codec=Sse (Serialization based), see doc to use other codecs - fn sse_encode(self, serializer: &mut flutter_rust_bridge::for_generated::SseSerializer) { - ::sse_encode(self.number_with_dial_code, serializer); - ::sse_encode(self.last_two_digits, serializer); - ::sse_encode(self.push_mode, serializer); - ::sse_encode(self.id, serializer); + #[no_mangle] + pub extern "C" fn frbgen_bluebubbles_rust_arc_decrement_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerPushError( + ptr: *const std::ffi::c_void, + ) { + MoiArc::>::decrement_strong_count(ptr as _); } -} -impl SseEncode for crate::api::api::TypingApp { - // Codec=Sse (Serialization based), see doc to use other codecs - fn sse_encode(self, serializer: &mut flutter_rust_bridge::for_generated::SseSerializer) { - ::sse_encode(self.bundle_id, serializer); - >::sse_encode(self.icon, serializer); + #[no_mangle] + pub extern "C" fn frbgen_bluebubbles_rust_arc_increment_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerReceiverAPSMessage( + ptr: *const std::ffi::c_void, + ) { + MoiArc::>>::increment_strong_count(ptr as _); } -} -impl SseEncode for u32 { - // Codec=Sse (Serialization based), see doc to use other codecs - fn sse_encode(self, serializer: &mut flutter_rust_bridge::for_generated::SseSerializer) { - serializer.cursor.write_u32::(self).unwrap(); + #[no_mangle] + pub extern "C" fn frbgen_bluebubbles_rust_arc_decrement_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerReceiverAPSMessage( + ptr: *const std::ffi::c_void, + ) { + MoiArc::>>::decrement_strong_count(ptr as _); } -} -impl SseEncode for u64 { - // Codec=Sse (Serialization based), see doc to use other codecs - fn sse_encode(self, serializer: &mut flutter_rust_bridge::for_generated::SseSerializer) { - serializer.cursor.write_u64::(self).unwrap(); + #[no_mangle] + pub extern "C" fn frbgen_bluebubbles_rust_arc_increment_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerSavedHardwareState( + ptr: *const std::ffi::c_void, + ) { + MoiArc::>::increment_strong_count(ptr as _); } -} -impl SseEncode for u8 { - // Codec=Sse (Serialization based), see doc to use other codecs - fn sse_encode(self, serializer: &mut flutter_rust_bridge::for_generated::SseSerializer) { - serializer.cursor.write_u8(self).unwrap(); + #[no_mangle] + pub extern "C" fn frbgen_bluebubbles_rust_arc_decrement_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerSavedHardwareState( + ptr: *const std::ffi::c_void, + ) { + MoiArc::>::decrement_strong_count(ptr as _); } -} -impl SseEncode for crate::api::api::UIColor { - // Codec=Sse (Serialization based), see doc to use other codecs - fn sse_encode(self, serializer: &mut flutter_rust_bridge::for_generated::SseSerializer) { - match self { - crate::api::api::UIColor::RGBAColorSpace { - color_components, - green, - blue, - red, - green_dbl, - blue_dbl, - red_dbl, - alpha_dbl, - alpha, - rgb, - color_space, - class, - } => { - ::sse_encode(0, serializer); - ::sse_encode(color_components, serializer); - ::sse_encode(green, serializer); - ::sse_encode(blue, serializer); - ::sse_encode(red, serializer); - >::sse_encode(green_dbl, serializer); - >::sse_encode(blue_dbl, serializer); - >::sse_encode(red_dbl, serializer); - >::sse_encode(alpha_dbl, serializer); - ::sse_encode(alpha, serializer); - >::sse_encode(rgb, serializer); - ::sse_encode(color_space, serializer); - ::sse_encode(class, serializer); - } - crate::api::api::UIColor::GrayscaleAlphaColorSpace { - color_components, - white, - alpha, - bin, - color_space, - class, - } => { - ::sse_encode(1, serializer); - ::sse_encode(color_components, serializer); - ::sse_encode(white, serializer); - ::sse_encode(alpha, serializer); - >::sse_encode(bin, serializer); - ::sse_encode(color_space, serializer); - ::sse_encode(class, serializer); - } - _ => { - unimplemented!(""); - } - } + #[no_mangle] + pub extern "C" fn frbgen_bluebubbles_rust_arc_increment_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerSender( + ptr: *const std::ffi::c_void, + ) { + MoiArc::>>::increment_strong_count(ptr as _); } -} -impl SseEncode for () { - // Codec=Sse (Serialization based), see doc to use other codecs - fn sse_encode(self, serializer: &mut flutter_rust_bridge::for_generated::SseSerializer) {} -} + #[no_mangle] + pub extern "C" fn frbgen_bluebubbles_rust_arc_decrement_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerSender( + ptr: *const std::ffi::c_void, + ) { + MoiArc::>>::decrement_strong_count(ptr as _); + } -impl SseEncode for crate::api::api::UnsendMessage { - // Codec=Sse (Serialization based), see doc to use other codecs - fn sse_encode(self, serializer: &mut flutter_rust_bridge::for_generated::SseSerializer) { - ::sse_encode(self.tuuid, serializer); - ::sse_encode(self.edit_part, serializer); + #[no_mangle] + pub extern "C" fn frbgen_bluebubbles_rust_arc_increment_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerStCollapsedValue( + ptr: *const std::ffi::c_void, + ) { + MoiArc::>::increment_strong_count(ptr as _); } -} -impl SseEncode for crate::api::api::UpdateAccountFinish { - // Codec=Sse (Serialization based), see doc to use other codecs - fn sse_encode(self, serializer: &mut flutter_rust_bridge::for_generated::SseSerializer) { - match self { - crate::api::api::UpdateAccountFinish::MacOS => { - ::sse_encode(0, serializer); - } - crate::api::api::UpdateAccountFinish::IOS { url } => { - ::sse_encode(1, serializer); - ::sse_encode(url, serializer); - } - _ => { - unimplemented!(""); - } - } + #[no_mangle] + pub extern "C" fn frbgen_bluebubbles_rust_arc_decrement_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerStCollapsedValue( + ptr: *const std::ffi::c_void, + ) { + MoiArc::>::decrement_strong_count(ptr as _); } -} -impl SseEncode for crate::api::api::UpdateExtensionMessage { - // Codec=Sse (Serialization based), see doc to use other codecs - fn sse_encode(self, serializer: &mut flutter_rust_bridge::for_generated::SseSerializer) { - ::sse_encode(self.for_uuid, serializer); - ::sse_encode(self.ext, serializer); + #[no_mangle] + pub extern "C" fn frbgen_bluebubbles_rust_arc_increment_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerSyncManagerDefaultAnisetteProviderMyFilePackager( + ptr: *const std::ffi::c_void, + ) { + MoiArc::< + flutter_rust_bridge::for_generated::RustAutoOpaqueInner< + SyncManager, + >, + >::increment_strong_count(ptr as _); } -} -impl SseEncode for crate::api::api::UpdateProfileMessage { - // Codec=Sse (Serialization based), see doc to use other codecs - fn sse_encode(self, serializer: &mut flutter_rust_bridge::for_generated::SseSerializer) { - >::sse_encode(self.profile, serializer); - ::sse_encode(self.share_contacts, serializer); + #[no_mangle] + pub extern "C" fn frbgen_bluebubbles_rust_arc_decrement_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerSyncManagerDefaultAnisetteProviderMyFilePackager( + ptr: *const std::ffi::c_void, + ) { + MoiArc::< + flutter_rust_bridge::for_generated::RustAutoOpaqueInner< + SyncManager, + >, + >::decrement_strong_count(ptr as _); } -} -impl SseEncode for crate::api::api::UpdateProfileSharingMessage { - // Codec=Sse (Serialization based), see doc to use other codecs - fn sse_encode(self, serializer: &mut flutter_rust_bridge::for_generated::SseSerializer) { - >::sse_encode(self.shared_dismissed, serializer); - >::sse_encode(self.shared_all, serializer); - ::sse_encode(self.version, serializer); + #[no_mangle] + pub extern "C" fn frbgen_bluebubbles_rust_arc_increment_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerSystemTime( + ptr: *const std::ffi::c_void, + ) { + MoiArc::>::increment_strong_count(ptr as _); } -} -impl SseEncode for usize { - // Codec=Sse (Serialization based), see doc to use other codecs - fn sse_encode(self, serializer: &mut flutter_rust_bridge::for_generated::SseSerializer) { - serializer - .cursor - .write_u64::(self as _) - .unwrap(); + #[no_mangle] + pub extern "C" fn frbgen_bluebubbles_rust_arc_decrement_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerSystemTime( + ptr: *const std::ffi::c_void, + ) { + MoiArc::>::decrement_strong_count(ptr as _); } -} -impl SseEncode for crate::api::api::WallpaperMetadata { - // Codec=Sse (Serialization based), see doc to use other codecs - fn sse_encode(self, serializer: &mut flutter_rust_bridge::for_generated::SseSerializer) { - >::sse_encode(self.background_color_key, serializer); - ::sse_encode(self.font_color_key, serializer); - ::sse_encode(self.font_name_key, serializer); - ::sse_encode(self.font_size_key, serializer); - ::sse_encode(self.font_weight_key, serializer); - ::sse_encode(self.is_vertical_key, serializer); - ::sse_encode(self.type_key, serializer); + #[no_mangle] + pub extern "C" fn frbgen_bluebubbles_rust_arc_increment_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerVerifyBody( + ptr: *const std::ffi::c_void, + ) { + MoiArc::>::increment_strong_count(ptr as _); } -} -impl SseEncode for crate::api::api::WatchBackground { - // Codec=Sse (Serialization based), see doc to use other codecs - fn sse_encode(self, serializer: &mut flutter_rust_bridge::for_generated::SseSerializer) { - ::sse_encode(self.is_high_key, serializer); - ::sse_encode(self.luminance, serializer); - >::sse_encode(self.background_image_data, serializer); - ::sse_encode(self.extension_identifier, serializer); + #[no_mangle] + pub extern "C" fn frbgen_bluebubbles_rust_arc_decrement_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerVerifyBody( + ptr: *const std::ffi::c_void, + ) { + MoiArc::>::decrement_strong_count(ptr as _); } -} -impl SseEncode for crate::api::api::WifiPassword { - // Codec=Sse (Serialization based), see doc to use other codecs - fn sse_encode(self, serializer: &mut flutter_rust_bridge::for_generated::SseSerializer) { - ::sse_encode(self.cdat, serializer); - ::sse_encode(self.mdat, serializer); - ::sse_encode(self.acct, serializer); - ::sse_encode(self.svce, serializer); - >::sse_encode(self.data, serializer); + #[no_mangle] + pub extern "C" fn frbgen_bluebubbles_rust_arc_increment_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerViableBottle( + ptr: *const std::ffi::c_void, + ) { + MoiArc::>::increment_strong_count(ptr as _); } -} + #[no_mangle] + pub extern "C" fn frbgen_bluebubbles_rust_arc_decrement_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerViableBottle( + ptr: *const std::ffi::c_void, + ) { + MoiArc::>::decrement_strong_count(ptr as _); + } +} #[cfg(not(target_family = "wasm"))] -mod io { +pub use io::*; + +/// cbindgen:ignore +#[cfg(target_family = "wasm")] +mod web { // This file is automatically generated, so please do not edit it. // Generated by `flutter_rust_bridge`@ 2.3.0. @@ -34315,57 +41101,59 @@ mod io { use flutter_rust_bridge::for_generated::byteorder::{ NativeEndian, ReadBytesExt, WriteBytesExt, }; + use flutter_rust_bridge::for_generated::wasm_bindgen; + use flutter_rust_bridge::for_generated::wasm_bindgen::prelude::*; use flutter_rust_bridge::for_generated::{transform_result_dco, Lifetimeable, Lockable}; use flutter_rust_bridge::{Handler, IntoIntoDart}; // Section: boilerplate - flutter_rust_bridge::frb_generated_boilerplate_io!(); + flutter_rust_bridge::frb_generated_boilerplate_web!(); - #[no_mangle] - pub extern "C" fn frbgen_bluebubbles_rust_arc_increment_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerAPSConnection( + #[wasm_bindgen] + pub fn rust_arc_increment_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerAPSConnection( ptr: *const std::ffi::c_void, ) { MoiArc::>::increment_strong_count(ptr as _); } - #[no_mangle] - pub extern "C" fn frbgen_bluebubbles_rust_arc_decrement_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerAPSConnection( + #[wasm_bindgen] + pub fn rust_arc_decrement_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerAPSConnection( ptr: *const std::ffi::c_void, ) { MoiArc::>::decrement_strong_count(ptr as _); } - #[no_mangle] - pub extern "C" fn frbgen_bluebubbles_rust_arc_increment_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerAPSState( + #[wasm_bindgen] + pub fn rust_arc_increment_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerAPSState( ptr: *const std::ffi::c_void, ) { MoiArc::>::increment_strong_count(ptr as _); } - #[no_mangle] - pub extern "C" fn frbgen_bluebubbles_rust_arc_decrement_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerAPSState( + #[wasm_bindgen] + pub fn rust_arc_decrement_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerAPSState( ptr: *const std::ffi::c_void, ) { MoiArc::>::decrement_strong_count(ptr as _); } - #[no_mangle] - pub extern "C" fn frbgen_bluebubbles_rust_arc_increment_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerAPSWatcher( + #[wasm_bindgen] + pub fn rust_arc_increment_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerAPSWatcher( ptr: *const std::ffi::c_void, ) { MoiArc::>::increment_strong_count(ptr as _); } - #[no_mangle] - pub extern "C" fn frbgen_bluebubbles_rust_arc_decrement_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerAPSWatcher( + #[wasm_bindgen] + pub fn rust_arc_decrement_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerAPSWatcher( ptr: *const std::ffi::c_void, ) { MoiArc::>::decrement_strong_count(ptr as _); } - #[no_mangle] - pub extern "C" fn frbgen_bluebubbles_rust_arc_increment_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcAnisetteClientDefaultAnisetteProvider( + #[wasm_bindgen] + pub fn rust_arc_increment_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcAnisetteClientDefaultAnisetteProvider( ptr: *const std::ffi::c_void, ) { MoiArc::< @@ -34375,8 +41163,8 @@ mod io { >::increment_strong_count(ptr as _); } - #[no_mangle] - pub extern "C" fn frbgen_bluebubbles_rust_arc_decrement_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcAnisetteClientDefaultAnisetteProvider( + #[wasm_bindgen] + pub fn rust_arc_decrement_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcAnisetteClientDefaultAnisetteProvider( ptr: *const std::ffi::c_void, ) { MoiArc::< @@ -34386,8 +41174,8 @@ mod io { >::decrement_strong_count(ptr as _); } - #[no_mangle] - pub extern "C" fn frbgen_bluebubbles_rust_arc_increment_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcCloudKitClientDefaultAnisetteProvider( + #[wasm_bindgen] + pub fn rust_arc_increment_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcCloudKitClientDefaultAnisetteProvider( ptr: *const std::ffi::c_void, ) { MoiArc::< @@ -34397,8 +41185,8 @@ mod io { >::increment_strong_count(ptr as _); } - #[no_mangle] - pub extern "C" fn frbgen_bluebubbles_rust_arc_decrement_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcCloudKitClientDefaultAnisetteProvider( + #[wasm_bindgen] + pub fn rust_arc_decrement_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcCloudKitClientDefaultAnisetteProvider( ptr: *const std::ffi::c_void, ) { MoiArc::< @@ -34408,8 +41196,8 @@ mod io { >::decrement_strong_count(ptr as _); } - #[no_mangle] - pub extern "C" fn frbgen_bluebubbles_rust_arc_increment_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcCloudMessagesClientDefaultAnisetteProvider( + #[wasm_bindgen] + pub fn rust_arc_increment_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcCloudMessagesClientDefaultAnisetteProvider( ptr: *const std::ffi::c_void, ) { MoiArc::< @@ -34419,8 +41207,8 @@ mod io { >::increment_strong_count(ptr as _); } - #[no_mangle] - pub extern "C" fn frbgen_bluebubbles_rust_arc_decrement_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcCloudMessagesClientDefaultAnisetteProvider( + #[wasm_bindgen] + pub fn rust_arc_decrement_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcCloudMessagesClientDefaultAnisetteProvider( ptr: *const std::ffi::c_void, ) { MoiArc::< @@ -34430,22 +41218,22 @@ mod io { >::decrement_strong_count(ptr as _); } - #[no_mangle] - pub extern "C" fn frbgen_bluebubbles_rust_arc_increment_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcFTClient( + #[wasm_bindgen] + pub fn rust_arc_increment_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcFTClient( ptr: *const std::ffi::c_void, ) { MoiArc::>>::increment_strong_count(ptr as _); } - #[no_mangle] - pub extern "C" fn frbgen_bluebubbles_rust_arc_decrement_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcFTClient( + #[wasm_bindgen] + pub fn rust_arc_decrement_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcFTClient( ptr: *const std::ffi::c_void, ) { MoiArc::>>::decrement_strong_count(ptr as _); } - #[no_mangle] - pub extern "C" fn frbgen_bluebubbles_rust_arc_increment_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcFindMyClientDefaultAnisetteProvider( + #[wasm_bindgen] + pub fn rust_arc_increment_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcFindMyClientDefaultAnisetteProvider( ptr: *const std::ffi::c_void, ) { MoiArc::< @@ -34455,8 +41243,8 @@ mod io { >::increment_strong_count(ptr as _); } - #[no_mangle] - pub extern "C" fn frbgen_bluebubbles_rust_arc_decrement_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcFindMyClientDefaultAnisetteProvider( + #[wasm_bindgen] + pub fn rust_arc_decrement_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcFindMyClientDefaultAnisetteProvider( ptr: *const std::ffi::c_void, ) { MoiArc::< @@ -34466,36 +41254,36 @@ mod io { >::decrement_strong_count(ptr as _); } - #[no_mangle] - pub extern "C" fn frbgen_bluebubbles_rust_arc_increment_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcIMClient( + #[wasm_bindgen] + pub fn rust_arc_increment_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcIMClient( ptr: *const std::ffi::c_void, ) { MoiArc::>>::increment_strong_count(ptr as _); } - #[no_mangle] - pub extern "C" fn frbgen_bluebubbles_rust_arc_decrement_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcIMClient( + #[wasm_bindgen] + pub fn rust_arc_decrement_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcIMClient( ptr: *const std::ffi::c_void, ) { MoiArc::>>::decrement_strong_count(ptr as _); } - #[no_mangle] - pub extern "C" fn frbgen_bluebubbles_rust_arc_increment_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcIdmsAuthListener( + #[wasm_bindgen] + pub fn rust_arc_increment_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcIdmsAuthListener( ptr: *const std::ffi::c_void, ) { MoiArc::>>::increment_strong_count(ptr as _); } - #[no_mangle] - pub extern "C" fn frbgen_bluebubbles_rust_arc_decrement_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcIdmsAuthListener( + #[wasm_bindgen] + pub fn rust_arc_decrement_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcIdmsAuthListener( ptr: *const std::ffi::c_void, ) { MoiArc::>>::decrement_strong_count(ptr as _); } - #[no_mangle] - pub extern "C" fn frbgen_bluebubbles_rust_arc_increment_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcKeychainClientDefaultAnisetteProvider( + #[wasm_bindgen] + pub fn rust_arc_increment_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcKeychainClientDefaultAnisetteProvider( ptr: *const std::ffi::c_void, ) { MoiArc::< @@ -34505,8 +41293,8 @@ mod io { >::increment_strong_count(ptr as _); } - #[no_mangle] - pub extern "C" fn frbgen_bluebubbles_rust_arc_decrement_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcKeychainClientDefaultAnisetteProvider( + #[wasm_bindgen] + pub fn rust_arc_decrement_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcKeychainClientDefaultAnisetteProvider( ptr: *const std::ffi::c_void, ) { MoiArc::< @@ -34516,8 +41304,8 @@ mod io { >::decrement_strong_count(ptr as _); } - #[no_mangle] - pub extern "C" fn frbgen_bluebubbles_rust_arc_increment_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcMutexAppleAccountDefaultAnisetteProvider( + #[wasm_bindgen] + pub fn rust_arc_increment_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcMutexAppleAccountDefaultAnisetteProvider( ptr: *const std::ffi::c_void, ) { MoiArc::< @@ -34527,8 +41315,8 @@ mod io { >::increment_strong_count(ptr as _); } - #[no_mangle] - pub extern "C" fn frbgen_bluebubbles_rust_arc_decrement_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcMutexAppleAccountDefaultAnisetteProvider( + #[wasm_bindgen] + pub fn rust_arc_decrement_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcMutexAppleAccountDefaultAnisetteProvider( ptr: *const std::ffi::c_void, ) { MoiArc::< @@ -34538,8 +41326,8 @@ mod io { >::decrement_strong_count(ptr as _); } - #[no_mangle] - pub extern "C" fn frbgen_bluebubbles_rust_arc_increment_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcMutexOptionCircleClientSessionDefaultAnisetteProvider( + #[wasm_bindgen] + pub fn rust_arc_increment_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcMutexOptionCircleClientSessionDefaultAnisetteProvider( ptr: *const std::ffi::c_void, ) { MoiArc::< @@ -34549,8 +41337,8 @@ mod io { >::increment_strong_count(ptr as _); } - #[no_mangle] - pub extern "C" fn frbgen_bluebubbles_rust_arc_decrement_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcMutexOptionCircleClientSessionDefaultAnisetteProvider( + #[wasm_bindgen] + pub fn rust_arc_decrement_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcMutexOptionCircleClientSessionDefaultAnisetteProvider( ptr: *const std::ffi::c_void, ) { MoiArc::< @@ -34560,8 +41348,8 @@ mod io { >::decrement_strong_count(ptr as _); } - #[no_mangle] - pub extern "C" fn frbgen_bluebubbles_rust_arc_increment_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcMutexVecActiveCircleSession( + #[wasm_bindgen] + pub fn rust_arc_increment_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcMutexVecActiveCircleSession( ptr: *const std::ffi::c_void, ) { MoiArc::< @@ -34571,8 +41359,8 @@ mod io { >::increment_strong_count(ptr as _); } - #[no_mangle] - pub extern "C" fn frbgen_bluebubbles_rust_arc_decrement_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcMutexVecActiveCircleSession( + #[wasm_bindgen] + pub fn rust_arc_decrement_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcMutexVecActiveCircleSession( ptr: *const std::ffi::c_void, ) { MoiArc::< @@ -34582,8 +41370,8 @@ mod io { >::decrement_strong_count(ptr as _); } - #[no_mangle] - pub extern "C" fn frbgen_bluebubbles_rust_arc_increment_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcPasswordManagerDefaultAnisetteProvider( + #[wasm_bindgen] + pub fn rust_arc_increment_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcPasswordManagerDefaultAnisetteProvider( ptr: *const std::ffi::c_void, ) { MoiArc::< @@ -34593,8 +41381,8 @@ mod io { >::increment_strong_count(ptr as _); } - #[no_mangle] - pub extern "C" fn frbgen_bluebubbles_rust_arc_decrement_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcPasswordManagerDefaultAnisetteProvider( + #[wasm_bindgen] + pub fn rust_arc_decrement_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcPasswordManagerDefaultAnisetteProvider( ptr: *const std::ffi::c_void, ) { MoiArc::< @@ -34604,8 +41392,8 @@ mod io { >::decrement_strong_count(ptr as _); } - #[no_mangle] - pub extern "C" fn frbgen_bluebubbles_rust_arc_increment_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcProfilesClientDefaultAnisetteProvider( + #[wasm_bindgen] + pub fn rust_arc_increment_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcProfilesClientDefaultAnisetteProvider( ptr: *const std::ffi::c_void, ) { MoiArc::< @@ -34615,8 +41403,8 @@ mod io { >::increment_strong_count(ptr as _); } - #[no_mangle] - pub extern "C" fn frbgen_bluebubbles_rust_arc_decrement_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcProfilesClientDefaultAnisetteProvider( + #[wasm_bindgen] + pub fn rust_arc_decrement_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcProfilesClientDefaultAnisetteProvider( ptr: *const std::ffi::c_void, ) { MoiArc::< @@ -34626,36 +41414,36 @@ mod io { >::decrement_strong_count(ptr as _); } - #[no_mangle] - pub extern "C" fn frbgen_bluebubbles_rust_arc_increment_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcSenderPushMessage( + #[wasm_bindgen] + pub fn rust_arc_increment_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcSenderPushMessage( ptr: *const std::ffi::c_void, ) { MoiArc:: >>>::increment_strong_count(ptr as _); } - #[no_mangle] - pub extern "C" fn frbgen_bluebubbles_rust_arc_decrement_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcSenderPushMessage( + #[wasm_bindgen] + pub fn rust_arc_decrement_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcSenderPushMessage( ptr: *const std::ffi::c_void, ) { MoiArc:: >>>::decrement_strong_count(ptr as _); } - #[no_mangle] - pub extern "C" fn frbgen_bluebubbles_rust_arc_increment_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcSharedPushState( + #[wasm_bindgen] + pub fn rust_arc_increment_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcSharedPushState( ptr: *const std::ffi::c_void, ) { MoiArc::>>::increment_strong_count(ptr as _); } - #[no_mangle] - pub extern "C" fn frbgen_bluebubbles_rust_arc_decrement_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcSharedPushState( + #[wasm_bindgen] + pub fn rust_arc_decrement_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcSharedPushState( ptr: *const std::ffi::c_void, ) { MoiArc::>>::decrement_strong_count(ptr as _); } - #[no_mangle] - pub extern "C" fn frbgen_bluebubbles_rust_arc_increment_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcStatusKitClientDefaultAnisetteProvider( + #[wasm_bindgen] + pub fn rust_arc_increment_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcStatusKitClientDefaultAnisetteProvider( ptr: *const std::ffi::c_void, ) { MoiArc::< @@ -34665,8 +41453,8 @@ mod io { >::increment_strong_count(ptr as _); } - #[no_mangle] - pub extern "C" fn frbgen_bluebubbles_rust_arc_decrement_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcStatusKitClientDefaultAnisetteProvider( + #[wasm_bindgen] + pub fn rust_arc_decrement_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcStatusKitClientDefaultAnisetteProvider( ptr: *const std::ffi::c_void, ) { MoiArc::< @@ -34676,8 +41464,8 @@ mod io { >::decrement_strong_count(ptr as _); } - #[no_mangle] - pub extern "C" fn frbgen_bluebubbles_rust_arc_increment_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcTokenProviderDefaultAnisetteProvider( + #[wasm_bindgen] + pub fn rust_arc_increment_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcTokenProviderDefaultAnisetteProvider( ptr: *const std::ffi::c_void, ) { MoiArc::< @@ -34687,8 +41475,8 @@ mod io { >::increment_strong_count(ptr as _); } - #[no_mangle] - pub extern "C" fn frbgen_bluebubbles_rust_arc_decrement_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcTokenProviderDefaultAnisetteProvider( + #[wasm_bindgen] + pub fn rust_arc_decrement_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerArcTokenProviderDefaultAnisetteProvider( ptr: *const std::ffi::c_void, ) { MoiArc::< @@ -34698,36 +41486,36 @@ mod io { >::decrement_strong_count(ptr as _); } - #[no_mangle] - pub extern "C" fn frbgen_bluebubbles_rust_arc_increment_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerAsset( + #[wasm_bindgen] + pub fn rust_arc_increment_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerAsset( ptr: *const std::ffi::c_void, ) { MoiArc::>::increment_strong_count(ptr as _); } - #[no_mangle] - pub extern "C" fn frbgen_bluebubbles_rust_arc_decrement_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerAsset( + #[wasm_bindgen] + pub fn rust_arc_decrement_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerAsset( ptr: *const std::ffi::c_void, ) { MoiArc::>::decrement_strong_count(ptr as _); } - #[no_mangle] - pub extern "C" fn frbgen_bluebubbles_rust_arc_increment_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerChannelInterestToken( + #[wasm_bindgen] + pub fn rust_arc_increment_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerChannelInterestToken( ptr: *const std::ffi::c_void, ) { MoiArc::>::increment_strong_count(ptr as _); } - #[no_mangle] - pub extern "C" fn frbgen_bluebubbles_rust_arc_decrement_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerChannelInterestToken( + #[wasm_bindgen] + pub fn rust_arc_decrement_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerChannelInterestToken( ptr: *const std::ffi::c_void, ) { MoiArc::>::decrement_strong_count(ptr as _); } - #[no_mangle] - pub extern "C" fn frbgen_bluebubbles_rust_arc_increment_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerCircleClientSessionDefaultAnisetteProvider( + #[wasm_bindgen] + pub fn rust_arc_increment_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerCircleClientSessionDefaultAnisetteProvider( ptr: *const std::ffi::c_void, ) { MoiArc::< @@ -34737,8 +41525,8 @@ mod io { >::increment_strong_count(ptr as _); } - #[no_mangle] - pub extern "C" fn frbgen_bluebubbles_rust_arc_decrement_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerCircleClientSessionDefaultAnisetteProvider( + #[wasm_bindgen] + pub fn rust_arc_decrement_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerCircleClientSessionDefaultAnisetteProvider( ptr: *const std::ffi::c_void, ) { MoiArc::< @@ -34748,64 +41536,86 @@ mod io { >::decrement_strong_count(ptr as _); } - #[no_mangle] - pub extern "C" fn frbgen_bluebubbles_rust_arc_increment_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerConversationLink( + #[wasm_bindgen] + pub fn rust_arc_increment_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerCloudSyncPreparedMessageCreateHandle( + ptr: *const std::ffi::c_void, + ) { + MoiArc::< + flutter_rust_bridge::for_generated::RustAutoOpaqueInner< + CloudSyncPreparedMessageCreateHandle, + >, + >::increment_strong_count(ptr as _); + } + + #[wasm_bindgen] + pub fn rust_arc_decrement_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerCloudSyncPreparedMessageCreateHandle( + ptr: *const std::ffi::c_void, + ) { + MoiArc::< + flutter_rust_bridge::for_generated::RustAutoOpaqueInner< + CloudSyncPreparedMessageCreateHandle, + >, + >::decrement_strong_count(ptr as _); + } + + #[wasm_bindgen] + pub fn rust_arc_increment_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerConversationLink( ptr: *const std::ffi::c_void, ) { MoiArc::>::increment_strong_count(ptr as _); } - #[no_mangle] - pub extern "C" fn frbgen_bluebubbles_rust_arc_decrement_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerConversationLink( + #[wasm_bindgen] + pub fn rust_arc_decrement_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerConversationLink( ptr: *const std::ffi::c_void, ) { MoiArc::>::decrement_strong_count(ptr as _); } - #[no_mangle] - pub extern "C" fn frbgen_bluebubbles_rust_arc_increment_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerConversationParticipant( + #[wasm_bindgen] + pub fn rust_arc_increment_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerConversationParticipant( ptr: *const std::ffi::c_void, ) { MoiArc::>::increment_strong_count(ptr as _); } - #[no_mangle] - pub extern "C" fn frbgen_bluebubbles_rust_arc_decrement_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerConversationParticipant( + #[wasm_bindgen] + pub fn rust_arc_decrement_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerConversationParticipant( ptr: *const std::ffi::c_void, ) { MoiArc::>::decrement_strong_count(ptr as _); } - #[no_mangle] - pub extern "C" fn frbgen_bluebubbles_rust_arc_increment_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerDate( + #[wasm_bindgen] + pub fn rust_arc_increment_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerDate( ptr: *const std::ffi::c_void, ) { MoiArc::>::increment_strong_count(ptr as _); } - #[no_mangle] - pub extern "C" fn frbgen_bluebubbles_rust_arc_decrement_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerDate( + #[wasm_bindgen] + pub fn rust_arc_decrement_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerDate( ptr: *const std::ffi::c_void, ) { MoiArc::>::decrement_strong_count(ptr as _); } - #[no_mangle] - pub extern "C" fn frbgen_bluebubbles_rust_arc_increment_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerEscrowData( + #[wasm_bindgen] + pub fn rust_arc_increment_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerEscrowData( ptr: *const std::ffi::c_void, ) { MoiArc::>::increment_strong_count(ptr as _); } - #[no_mangle] - pub extern "C" fn frbgen_bluebubbles_rust_arc_decrement_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerEscrowData( + #[wasm_bindgen] + pub fn rust_arc_decrement_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerEscrowData( ptr: *const std::ffi::c_void, ) { MoiArc::>::decrement_strong_count(ptr as _); } - #[no_mangle] - pub extern "C" fn frbgen_bluebubbles_rust_arc_increment_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerFindMyFriendsClientDefaultAnisetteProvider( + #[wasm_bindgen] + pub fn rust_arc_increment_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerFindMyFriendsClientDefaultAnisetteProvider( ptr: *const std::ffi::c_void, ) { MoiArc::< @@ -34815,8 +41625,8 @@ mod io { >::increment_strong_count(ptr as _); } - #[no_mangle] - pub extern "C" fn frbgen_bluebubbles_rust_arc_decrement_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerFindMyFriendsClientDefaultAnisetteProvider( + #[wasm_bindgen] + pub fn rust_arc_decrement_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerFindMyFriendsClientDefaultAnisetteProvider( ptr: *const std::ffi::c_void, ) { MoiArc::< @@ -34826,8 +41636,8 @@ mod io { >::decrement_strong_count(ptr as _); } - #[no_mangle] - pub extern "C" fn frbgen_bluebubbles_rust_arc_increment_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerFindMyPhoneClientDefaultAnisetteProvider( + #[wasm_bindgen] + pub fn rust_arc_increment_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerFindMyPhoneClientDefaultAnisetteProvider( ptr: *const std::ffi::c_void, ) { MoiArc::< @@ -34837,8 +41647,8 @@ mod io { >::increment_strong_count(ptr as _); } - #[no_mangle] - pub extern "C" fn frbgen_bluebubbles_rust_arc_decrement_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerFindMyPhoneClientDefaultAnisetteProvider( + #[wasm_bindgen] + pub fn rust_arc_decrement_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerFindMyPhoneClientDefaultAnisetteProvider( ptr: *const std::ffi::c_void, ) { MoiArc::< @@ -34848,8 +41658,8 @@ mod io { >::decrement_strong_count(ptr as _); } - #[no_mangle] - pub extern "C" fn frbgen_bluebubbles_rust_arc_increment_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerGZipWrapperAttachmentMeta( + #[wasm_bindgen] + pub fn rust_arc_increment_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerGZipWrapperAttachmentMeta( ptr: *const std::ffi::c_void, ) { MoiArc::< @@ -34857,8 +41667,8 @@ mod io { >::increment_strong_count(ptr as _); } - #[no_mangle] - pub extern "C" fn frbgen_bluebubbles_rust_arc_decrement_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerGZipWrapperAttachmentMeta( + #[wasm_bindgen] + pub fn rust_arc_decrement_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerGZipWrapperAttachmentMeta( ptr: *const std::ffi::c_void, ) { MoiArc::< @@ -34866,246 +41676,246 @@ mod io { >::decrement_strong_count(ptr as _); } - #[no_mangle] - pub extern "C" fn frbgen_bluebubbles_rust_arc_increment_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerGZipWrapperChatProto( + #[wasm_bindgen] + pub fn rust_arc_increment_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerGZipWrapperChatProto( ptr: *const std::ffi::c_void, ) { MoiArc::>>::increment_strong_count(ptr as _); } - #[no_mangle] - pub extern "C" fn frbgen_bluebubbles_rust_arc_decrement_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerGZipWrapperChatProto( + #[wasm_bindgen] + pub fn rust_arc_decrement_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerGZipWrapperChatProto( ptr: *const std::ffi::c_void, ) { MoiArc::>>::decrement_strong_count(ptr as _); } - #[no_mangle] - pub extern "C" fn frbgen_bluebubbles_rust_arc_increment_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerGZipWrapperMessageProto( + #[wasm_bindgen] + pub fn rust_arc_increment_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerGZipWrapperMessageProto( ptr: *const std::ffi::c_void, ) { MoiArc::>>::increment_strong_count(ptr as _); } - #[no_mangle] - pub extern "C" fn frbgen_bluebubbles_rust_arc_decrement_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerGZipWrapperMessageProto( + #[wasm_bindgen] + pub fn rust_arc_decrement_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerGZipWrapperMessageProto( ptr: *const std::ffi::c_void, ) { MoiArc::>>::decrement_strong_count(ptr as _); } - #[no_mangle] - pub extern "C" fn frbgen_bluebubbles_rust_arc_increment_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerGZipWrapperMessageProto2( + #[wasm_bindgen] + pub fn rust_arc_increment_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerGZipWrapperMessageProto2( ptr: *const std::ffi::c_void, ) { MoiArc::>>::increment_strong_count(ptr as _); } - #[no_mangle] - pub extern "C" fn frbgen_bluebubbles_rust_arc_decrement_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerGZipWrapperMessageProto2( + #[wasm_bindgen] + pub fn rust_arc_decrement_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerGZipWrapperMessageProto2( ptr: *const std::ffi::c_void, ) { MoiArc::>>::decrement_strong_count(ptr as _); } - #[no_mangle] - pub extern "C" fn frbgen_bluebubbles_rust_arc_increment_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerGZipWrapperMessageProto3( + #[wasm_bindgen] + pub fn rust_arc_increment_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerGZipWrapperMessageProto3( ptr: *const std::ffi::c_void, ) { MoiArc::>>::increment_strong_count(ptr as _); } - #[no_mangle] - pub extern "C" fn frbgen_bluebubbles_rust_arc_decrement_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerGZipWrapperMessageProto3( + #[wasm_bindgen] + pub fn rust_arc_decrement_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerGZipWrapperMessageProto3( ptr: *const std::ffi::c_void, ) { MoiArc::>>::decrement_strong_count(ptr as _); } - #[no_mangle] - pub extern "C" fn frbgen_bluebubbles_rust_arc_increment_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerGZipWrapperMessageProto4( + #[wasm_bindgen] + pub fn rust_arc_increment_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerGZipWrapperMessageProto4( ptr: *const std::ffi::c_void, ) { MoiArc::>>::increment_strong_count(ptr as _); } - #[no_mangle] - pub extern "C" fn frbgen_bluebubbles_rust_arc_decrement_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerGZipWrapperMessageProto4( + #[wasm_bindgen] + pub fn rust_arc_decrement_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerGZipWrapperMessageProto4( ptr: *const std::ffi::c_void, ) { MoiArc::>>::decrement_strong_count(ptr as _); } - #[no_mangle] - pub extern "C" fn frbgen_bluebubbles_rust_arc_increment_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerIDSNGMIdentity( + #[wasm_bindgen] + pub fn rust_arc_increment_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerIDSNGMIdentity( ptr: *const std::ffi::c_void, ) { MoiArc::>::increment_strong_count(ptr as _); } - #[no_mangle] - pub extern "C" fn frbgen_bluebubbles_rust_arc_decrement_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerIDSNGMIdentity( + #[wasm_bindgen] + pub fn rust_arc_decrement_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerIDSNGMIdentity( ptr: *const std::ffi::c_void, ) { MoiArc::>::decrement_strong_count(ptr as _); } - #[no_mangle] - pub extern "C" fn frbgen_bluebubbles_rust_arc_increment_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerIDSUser( + #[wasm_bindgen] + pub fn rust_arc_increment_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerIDSUser( ptr: *const std::ffi::c_void, ) { MoiArc::>::increment_strong_count(ptr as _); } - #[no_mangle] - pub extern "C" fn frbgen_bluebubbles_rust_arc_decrement_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerIDSUser( + #[wasm_bindgen] + pub fn rust_arc_decrement_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerIDSUser( ptr: *const std::ffi::c_void, ) { MoiArc::>::decrement_strong_count(ptr as _); } - #[no_mangle] - pub extern "C" fn frbgen_bluebubbles_rust_arc_increment_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerJoinedOSConfig( + #[wasm_bindgen] + pub fn rust_arc_increment_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerJoinedOSConfig( ptr: *const std::ffi::c_void, ) { MoiArc::>::increment_strong_count(ptr as _); } - #[no_mangle] - pub extern "C" fn frbgen_bluebubbles_rust_arc_decrement_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerJoinedOSConfig( + #[wasm_bindgen] + pub fn rust_arc_decrement_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerJoinedOSConfig( ptr: *const std::ffi::c_void, ) { MoiArc::>::decrement_strong_count(ptr as _); } - #[no_mangle] - pub extern "C" fn frbgen_bluebubbles_rust_arc_increment_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerLocationReport( + #[wasm_bindgen] + pub fn rust_arc_increment_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerLocationReport( ptr: *const std::ffi::c_void, ) { MoiArc::>::increment_strong_count(ptr as _); } - #[no_mangle] - pub extern "C" fn frbgen_bluebubbles_rust_arc_decrement_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerLocationReport( + #[wasm_bindgen] + pub fn rust_arc_decrement_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerLocationReport( ptr: *const std::ffi::c_void, ) { MoiArc::>::decrement_strong_count(ptr as _); } - #[no_mangle] - pub extern "C" fn frbgen_bluebubbles_rust_arc_increment_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerMessageFlags( + #[wasm_bindgen] + pub fn rust_arc_increment_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerMessageFlags( ptr: *const std::ffi::c_void, ) { MoiArc::>::increment_strong_count(ptr as _); } - #[no_mangle] - pub extern "C" fn frbgen_bluebubbles_rust_arc_decrement_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerMessageFlags( + #[wasm_bindgen] + pub fn rust_arc_decrement_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerMessageFlags( ptr: *const std::ffi::c_void, ) { MoiArc::>::decrement_strong_count(ptr as _); } - #[no_mangle] - pub extern "C" fn frbgen_bluebubbles_rust_arc_increment_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerNSArrayLPIconMetadata( + #[wasm_bindgen] + pub fn rust_arc_increment_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerNSArrayLPIconMetadata( ptr: *const std::ffi::c_void, ) { MoiArc::>>::increment_strong_count(ptr as _); } - #[no_mangle] - pub extern "C" fn frbgen_bluebubbles_rust_arc_decrement_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerNSArrayLPIconMetadata( + #[wasm_bindgen] + pub fn rust_arc_decrement_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerNSArrayLPIconMetadata( ptr: *const std::ffi::c_void, ) { MoiArc::>>::decrement_strong_count(ptr as _); } - #[no_mangle] - pub extern "C" fn frbgen_bluebubbles_rust_arc_increment_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerNSArrayLPImageMetadata( + #[wasm_bindgen] + pub fn rust_arc_increment_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerNSArrayLPImageMetadata( ptr: *const std::ffi::c_void, ) { MoiArc::>>::increment_strong_count(ptr as _); } - #[no_mangle] - pub extern "C" fn frbgen_bluebubbles_rust_arc_decrement_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerNSArrayLPImageMetadata( + #[wasm_bindgen] + pub fn rust_arc_decrement_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerNSArrayLPImageMetadata( ptr: *const std::ffi::c_void, ) { MoiArc::>>::decrement_strong_count(ptr as _); } - #[no_mangle] - pub extern "C" fn frbgen_bluebubbles_rust_arc_increment_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerPushError( + #[wasm_bindgen] + pub fn rust_arc_increment_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerPushError( ptr: *const std::ffi::c_void, ) { MoiArc::>::increment_strong_count(ptr as _); } - #[no_mangle] - pub extern "C" fn frbgen_bluebubbles_rust_arc_decrement_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerPushError( + #[wasm_bindgen] + pub fn rust_arc_decrement_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerPushError( ptr: *const std::ffi::c_void, ) { MoiArc::>::decrement_strong_count(ptr as _); } - #[no_mangle] - pub extern "C" fn frbgen_bluebubbles_rust_arc_increment_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerReceiverAPSMessage( + #[wasm_bindgen] + pub fn rust_arc_increment_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerReceiverAPSMessage( ptr: *const std::ffi::c_void, ) { MoiArc::>>::increment_strong_count(ptr as _); } - #[no_mangle] - pub extern "C" fn frbgen_bluebubbles_rust_arc_decrement_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerReceiverAPSMessage( + #[wasm_bindgen] + pub fn rust_arc_decrement_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerReceiverAPSMessage( ptr: *const std::ffi::c_void, ) { MoiArc::>>::decrement_strong_count(ptr as _); } - #[no_mangle] - pub extern "C" fn frbgen_bluebubbles_rust_arc_increment_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerSavedHardwareState( + #[wasm_bindgen] + pub fn rust_arc_increment_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerSavedHardwareState( ptr: *const std::ffi::c_void, ) { MoiArc::>::increment_strong_count(ptr as _); } - #[no_mangle] - pub extern "C" fn frbgen_bluebubbles_rust_arc_decrement_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerSavedHardwareState( + #[wasm_bindgen] + pub fn rust_arc_decrement_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerSavedHardwareState( ptr: *const std::ffi::c_void, ) { MoiArc::>::decrement_strong_count(ptr as _); } - #[no_mangle] - pub extern "C" fn frbgen_bluebubbles_rust_arc_increment_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerSender( + #[wasm_bindgen] + pub fn rust_arc_increment_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerSender( ptr: *const std::ffi::c_void, ) { MoiArc::>>::increment_strong_count(ptr as _); } - #[no_mangle] - pub extern "C" fn frbgen_bluebubbles_rust_arc_decrement_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerSender( + #[wasm_bindgen] + pub fn rust_arc_decrement_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerSender( ptr: *const std::ffi::c_void, ) { MoiArc::>>::decrement_strong_count(ptr as _); } - #[no_mangle] - pub extern "C" fn frbgen_bluebubbles_rust_arc_increment_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerStCollapsedValue( + #[wasm_bindgen] + pub fn rust_arc_increment_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerStCollapsedValue( ptr: *const std::ffi::c_void, ) { MoiArc::>::increment_strong_count(ptr as _); } - #[no_mangle] - pub extern "C" fn frbgen_bluebubbles_rust_arc_decrement_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerStCollapsedValue( + #[wasm_bindgen] + pub fn rust_arc_decrement_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerStCollapsedValue( ptr: *const std::ffi::c_void, ) { MoiArc::>::decrement_strong_count(ptr as _); } - #[no_mangle] - pub extern "C" fn frbgen_bluebubbles_rust_arc_increment_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerSyncManagerDefaultAnisetteProviderMyFilePackager( + #[wasm_bindgen] + pub fn rust_arc_increment_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerSyncManagerDefaultAnisetteProviderMyFilePackager( ptr: *const std::ffi::c_void, ) { MoiArc::< @@ -35115,8 +41925,8 @@ mod io { >::increment_strong_count(ptr as _); } - #[no_mangle] - pub extern "C" fn frbgen_bluebubbles_rust_arc_decrement_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerSyncManagerDefaultAnisetteProviderMyFilePackager( + #[wasm_bindgen] + pub fn rust_arc_decrement_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerSyncManagerDefaultAnisetteProviderMyFilePackager( ptr: *const std::ffi::c_void, ) { MoiArc::< @@ -35126,47 +41936,47 @@ mod io { >::decrement_strong_count(ptr as _); } - #[no_mangle] - pub extern "C" fn frbgen_bluebubbles_rust_arc_increment_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerSystemTime( + #[wasm_bindgen] + pub fn rust_arc_increment_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerSystemTime( ptr: *const std::ffi::c_void, ) { MoiArc::>::increment_strong_count(ptr as _); } - #[no_mangle] - pub extern "C" fn frbgen_bluebubbles_rust_arc_decrement_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerSystemTime( + #[wasm_bindgen] + pub fn rust_arc_decrement_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerSystemTime( ptr: *const std::ffi::c_void, ) { MoiArc::>::decrement_strong_count(ptr as _); } - #[no_mangle] - pub extern "C" fn frbgen_bluebubbles_rust_arc_increment_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerVerifyBody( + #[wasm_bindgen] + pub fn rust_arc_increment_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerVerifyBody( ptr: *const std::ffi::c_void, ) { MoiArc::>::increment_strong_count(ptr as _); } - #[no_mangle] - pub extern "C" fn frbgen_bluebubbles_rust_arc_decrement_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerVerifyBody( + #[wasm_bindgen] + pub fn rust_arc_decrement_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerVerifyBody( ptr: *const std::ffi::c_void, ) { MoiArc::>::decrement_strong_count(ptr as _); } - #[no_mangle] - pub extern "C" fn frbgen_bluebubbles_rust_arc_increment_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerViableBottle( + #[wasm_bindgen] + pub fn rust_arc_increment_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerViableBottle( ptr: *const std::ffi::c_void, ) { MoiArc::>::increment_strong_count(ptr as _); } - #[no_mangle] - pub extern "C" fn frbgen_bluebubbles_rust_arc_decrement_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerViableBottle( + #[wasm_bindgen] + pub fn rust_arc_decrement_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerViableBottle( ptr: *const std::ffi::c_void, ) { MoiArc::>::decrement_strong_count(ptr as _); } } -#[cfg(not(target_family = "wasm"))] -pub use io::*; +#[cfg(target_family = "wasm")] +pub use web::*; diff --git a/rust/src/keystore.rs b/rust/src/keystore.rs index 08eda2e73b..cb4eae0f15 100644 --- a/rust/src/keystore.rs +++ b/rust/src/keystore.rs @@ -1,14 +1,37 @@ -use std::{collections::BTreeSet, fmt::{Debug, Display}, path::PathBuf, sync::{Arc, RwLock}}; +#[cfg(target_os = "android")] +use std::sync::OnceLock; +use std::{ + collections::BTreeSet, + fmt::{Debug, Display}, + path::PathBuf, + sync::{Arc, RwLock}, +}; use aes_gcm::{AeadInPlace, Aes256Gcm, KeyInit, Nonce}; -use keystore::{EcCurve, EcKeystoreKey, EncryptMode, KeyType, Keystore, KeystoreAccessRules, KeystoreDeriveKey, KeystoreDigest, KeystoreError, KeystorePadding, backup::{BackupKeystore, BackupKeystoreState}, init_keystore, keystore, software::{SoftwareKeystore, SoftwareKeystoreState}}; -use openssl::{bn::BigNumContext, ec::{EcGroup, EcKey, EcPoint, PointConversionForm}, encrypt::Encrypter, hash::MessageDigest, nid::Nid, pkey::{PKey, Public}, rsa::{Padding, Rsa}}; +use keystore::{ + backup::{BackupKeystore, BackupKeystoreState}, + init_keystore, keystore, + software::{SoftwareKeystore, SoftwareKeystoreState}, + EcCurve, EcKeystoreKey, EncryptMode, KeyType, Keystore, KeystoreAccessRules, KeystoreDeriveKey, + KeystoreDigest, KeystoreError, KeystorePadding, +}; +use log::{debug, error, info, warn}; +use openssl::{ + bn::BigNumContext, + ec::{EcGroup, EcKey, EcPoint, PointConversionForm}, + encrypt::Encrypter, + hash::MessageDigest, + nid::Nid, + pkey::{PKey, Public}, + rsa::{Padding, Rsa}, +}; +use rasn::{ + types::{Any, GeneralizedTime, SequenceOf, SetOf}, + AsnType, Decode, Encode, +}; use rustpush::cloudkit_proto::base64_encode; -use uniffi::UnexpectedUniFFICallbackError; use std::str::FromStr; -use rasn::{types::{Any, GeneralizedTime, SequenceOf, SetOf}, AsnType, Decode, Encode}; -use log::{debug, error, info, warn}; - +use uniffi::UnexpectedUniFFICallbackError; #[uniffi::remote(Enum)] pub enum EcCurve { @@ -30,12 +53,12 @@ pub enum KeystorePadding { md: KeystoreDigest, mgf1: KeystoreDigest, }, - None + None, } #[uniffi::remote(Enum)] pub enum EncryptMode { - Rsa (KeystorePadding), + Rsa(KeystorePadding), Gcm, } @@ -62,13 +85,23 @@ pub struct KeystoreAccessRules { #[derive(uniffi::Error, Debug)] pub enum NativeKeystoreError { - NativeError(String) + NativeError(String), +} + +#[cfg(target_os = "android")] +static ANDROID_NATIVE_KEYSTORE: OnceLock> = OnceLock::new(); + +/// Returns the raw Android Keystore callback rather than the software or +/// backup wrapper selected for the legacy rustpush keystore. +#[cfg(target_os = "android")] +pub(crate) fn android_native_keystore() -> Option<&'static Arc> { + ANDROID_NATIVE_KEYSTORE.get() } impl Display for NativeKeystoreError { fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { match self { - Self::NativeError(native) => write!(f, "{native}") + Self::NativeError(native) => write!(f, "{native}"), } } } @@ -89,7 +122,11 @@ impl From for NativeKeystoreError { #[uniffi::export] pub fn finish_unlock() { - keystore().as_lockable().expect("WHAT NOT LOCKABLE??").unlock().expect("unlocking failed!") + keystore() + .as_lockable() + .expect("WHAT NOT LOCKABLE??") + .unlock() + .expect("unlocking failed!") } #[uniffi::export] @@ -116,33 +153,50 @@ pub fn recover_keychain() { } pub fn supports_import(keystore: &NativeKeystoreHolder) -> Result { - if !keystore.keystore.supports_import().map_err(|e| >::into(e))? { - return Ok(false) + if !keystore + .keystore + .supports_import() + .map_err(|e| >::into(e))? + { + return Ok(false); } let enc = Rsa::generate(1024)?; let key = PKey::from_rsa(enc)?; keystore.destroy_key("test:import")?; - keystore.import_key("test:import", KeyType::Rsa(1024), &key.private_key_to_der()?, KeystoreAccessRules { - signature_padding: vec![KeystorePadding::PKCS1], - digests: vec![KeystoreDigest::Sha1], - can_sign: true, - ..Default::default() - })?; + keystore.import_key( + "test:import", + KeyType::Rsa(1024), + &key.private_key_to_der()?, + KeystoreAccessRules { + signature_padding: vec![KeystorePadding::PKCS1], + digests: vec![KeystoreDigest::Sha1], + can_sign: true, + ..Default::default() + }, + )?; // this was added in android 12, make sure our keymaster supports it keystore.destroy_key("test:ec")?; let curve = EcGroup::from_curve_name(Nid::SECP384R1)?; let test_ec = EcKey::generate(&curve)?; - keystore.import_key("test:ec", KeyType::Ec(EcCurve::P384), &test_ec.private_key_to_der()?, KeystoreAccessRules { - can_agree: true, - digests: vec![KeystoreDigest::Sha384, KeystoreDigest::Sha256], - ..Default::default() - })?; + keystore.import_key( + "test:ec", + KeyType::Ec(EcCurve::P384), + &test_ec.private_key_to_der()?, + KeystoreAccessRules { + can_agree: true, + digests: vec![KeystoreDigest::Sha384, KeystoreDigest::Sha256], + ..Default::default() + }, + )?; let other_key = EcKey::generate(&curve)?; let mut context = BigNumContext::new()?; - let ephermeral_sender = other_key.public_key().to_bytes(&curve, PointConversionForm::UNCOMPRESSED, &mut context)?; + let ephermeral_sender = + other_key + .public_key() + .to_bytes(&curve, PointConversionForm::UNCOMPRESSED, &mut context)?; keystore.derive("test:ec", &ephermeral_sender)?; keystore.destroy_key("test:ec")?; @@ -157,9 +211,10 @@ pub fn setup_keystore(dir: String, keystore: Arc) { let keystore_path = dir.join("keystore.plist"); let soft_keystore = dir.join("keystore_s.plist"); - let keystore = NativeKeystoreHolder { - keystore, - }; + #[cfg(target_os = "android")] + let _ = ANDROID_NATIVE_KEYSTORE.set(keystore.clone()); + + let keystore = NativeKeystoreHolder { keystore }; let has_support = if keystore_path.exists() { true @@ -177,7 +232,8 @@ pub fn setup_keystore(dir: String, keystore: Arc) { let (state, key) = if let Ok(existing) = plist::from_file(&keystore_path) { (existing, None) } else { - let (keystore, key) = BackupKeystoreState::new(&keystore).expect("Failed to initialize keystore!"); + let (keystore, key) = + BackupKeystoreState::new(&keystore).expect("Failed to initialize keystore!"); (keystore, Some(key)) }; @@ -205,25 +261,59 @@ pub fn setup_keystore(dir: String, keystore: Arc) { pub trait NativeKeystore: Send + Sync + Debug + 'static { fn supports_import(&self) -> Result; - fn create_key(&self, alias: String, r#type: KeyType, access_rules: KeystoreAccessRules) -> Result<(), NativeKeystoreError>; + fn create_key( + &self, + alias: String, + r#type: KeyType, + access_rules: KeystoreAccessRules, + ) -> Result<(), NativeKeystoreError>; fn destroy_key(&self, alias: String) -> Result<(), NativeKeystoreError>; fn list_keys(&self) -> Result, NativeKeystoreError>; // priv key can be EC private key in DER, raw AES key bytes // or a DER RSA private key. - fn import_key(&self, alias: String, r#type: KeyType, wrapped_key: Vec, access_rules: KeystoreAccessRules) -> Result<(), NativeKeystoreError>; + fn import_key( + &self, + alias: String, + r#type: KeyType, + wrapped_key: Vec, + access_rules: KeystoreAccessRules, + ) -> Result<(), NativeKeystoreError>; fn get_import_wrap_key(&self) -> Result, NativeKeystoreError>; fn get_key_type(&self, alias: String) -> Result, NativeKeystoreError>; - - fn sign(&self, alias: String, digest: KeystoreDigest, padding: KeystorePadding, data: Vec) -> Result, NativeKeystoreError>; - fn verify(&self, alias: String, digest: KeystoreDigest, padding: KeystorePadding, data: Vec, sig: Vec) -> Result; + + fn sign( + &self, + alias: String, + digest: KeystoreDigest, + padding: KeystorePadding, + data: Vec, + ) -> Result, NativeKeystoreError>; + fn verify( + &self, + alias: String, + digest: KeystoreDigest, + padding: KeystorePadding, + data: Vec, + sig: Vec, + ) -> Result; // returns in DER fn get_public_key(&self, alias: String) -> Result, NativeKeystoreError>; // peer is a EC public key starting with 02, 03, or 04 fn derive(&self, alias: String, peer: Vec) -> Result, NativeKeystoreError>; - fn encrypt(&self, alias: String, plaintext: Vec, mode: EncryptMode) -> Result, NativeKeystoreError>; - fn decrypt(&self, alias: String, ciphertext: Vec, mode: EncryptMode) -> Result, NativeKeystoreError>; + fn encrypt( + &self, + alias: String, + plaintext: Vec, + mode: EncryptMode, + ) -> Result, NativeKeystoreError>; + fn decrypt( + &self, + alias: String, + ciphertext: Vec, + mode: EncryptMode, + ) -> Result, NativeKeystoreError>; } #[derive(AsnType, Encode, Decode, Default)] @@ -398,34 +488,87 @@ impl AuthorizationList { KeyType::Ec(EcCurve::P384) => 384, KeyType::Rsa(k) => k, } as u32), - block_mode: if rules.block_modes.is_empty() { None } else { Some(rules.block_modes.iter().map(|m| match m { - EncryptMode::Gcm => BlockMode::Gcm, - EncryptMode::Rsa(_) => BlockMode::Ecb, - _ => panic!("Bad block mode!") - } as u32).collect()) }, - digest: if rules.digests.is_empty() { None } else { - Some(rules.digests.iter().map(|m| Digest::from_keystore(m) as u32).collect()) + block_mode: if rules.block_modes.is_empty() { + None + } else { + Some( + rules + .block_modes + .iter() + .map(|m| match m { + EncryptMode::Gcm => BlockMode::Gcm, + EncryptMode::Rsa(_) => BlockMode::Ecb, + _ => panic!("Bad block mode!"), + } as u32) + .collect(), + ) + }, + digest: if rules.digests.is_empty() { + None + } else { + Some( + rules + .digests + .iter() + .map(|m| Digest::from_keystore(m) as u32) + .collect(), + ) }, - min_mac_length: if rules.block_modes.iter().any(|b| matches!(b, EncryptMode::Gcm)) { Some(128) } else { None }, - padding: if rules.signature_padding.is_empty() && rules.encryption_paddings.is_empty() { Some(std::iter::once(PaddingMode::None as u32).collect()) } else { - Some(rules.signature_padding.iter().map(|m| match m { - KeystorePadding::None => PaddingMode::None, - KeystorePadding::OAEP { .. } => PaddingMode::RsaOaep, - KeystorePadding::PKCS1 => PaddingMode::RsaPkcs1Sign, - } as u32).chain(rules.encryption_paddings.iter().map(|m| match m { - KeystorePadding::None => PaddingMode::None, - KeystorePadding::OAEP { .. } => PaddingMode::RsaOaep, - KeystorePadding::PKCS1 => PaddingMode::RsaPkcs1Encrypt, - } as u32)).collect()) + min_mac_length: if rules + .block_modes + .iter() + .any(|b| matches!(b, EncryptMode::Gcm)) + { + Some(128) + } else { + None + }, + padding: if rules.signature_padding.is_empty() && rules.encryption_paddings.is_empty() { + Some(std::iter::once(PaddingMode::None as u32).collect()) + } else { + Some( + rules + .signature_padding + .iter() + .map(|m| match m { + KeystorePadding::None => PaddingMode::None, + KeystorePadding::OAEP { .. } => PaddingMode::RsaOaep, + KeystorePadding::PKCS1 => PaddingMode::RsaPkcs1Sign, + } as u32) + .chain(rules.encryption_paddings.iter().map(|m| match m { + KeystorePadding::None => PaddingMode::None, + KeystorePadding::OAEP { .. } => PaddingMode::RsaOaep, + KeystorePadding::PKCS1 => PaddingMode::RsaPkcs1Encrypt, + } + as u32)) + .collect(), + ) }, ec_curve: match r#type { KeyType::Ec(EcCurve::P256) => Some(AndroidEcCurve::P256 as u32), KeyType::Ec(EcCurve::P384) => Some(AndroidEcCurve::P384 as u32), - _ => None + _ => None, + }, + mgf_digest: if rules.mgf1_digests.is_empty() { + None + } else { + Some( + rules + .mgf1_digests + .iter() + .map(|m| Digest::from_keystore(m) as u32) + .collect(), + ) }, - mgf_digest: if rules.mgf1_digests.is_empty() { None } else { Some(rules.mgf1_digests.iter().map(|m| Digest::from_keystore(m) as u32).collect()) }, no_auth_required: if rules.require_user { None } else { Some(()) }, - user_auth_type: if rules.require_user { Some(HardwareAuthenticatorType::PASSWORD as u32 ^ HardwareAuthenticatorType::FINGERPRINT as u32) } else { None }, + user_auth_type: if rules.require_user { + Some( + HardwareAuthenticatorType::PASSWORD as u32 + ^ HardwareAuthenticatorType::FINGERPRINT as u32, + ) + } else { + None + }, auth_timeout: if rules.require_user { Some(0) } else { None }, } } @@ -434,7 +577,7 @@ impl AuthorizationList { #[derive(AsnType, Encode, Decode, Default)] struct KeyDescription { key_format: u32, - key_params: AuthorizationList + key_params: AuthorizationList, } #[derive(AsnType, Encode, Decode, Default)] @@ -447,7 +590,12 @@ struct KeyWrapper { tag: rasn::types::OctetString, } -fn wrap_import_key(r#type: KeyType, pub_key: Rsa, priv_key: &[u8], access_rules: &KeystoreAccessRules) -> Result, KeystoreError> { +fn wrap_import_key( + r#type: KeyType, + pub_key: Rsa, + priv_key: &[u8], + access_rules: &KeystoreAccessRules, +) -> Result, KeystoreError> { let desc = KeyDescription { key_format: match r#type { KeyType::Aes(_) => KeyFormat::RAW, @@ -463,11 +611,11 @@ fn wrap_import_key(r#type: KeyType, pub_key: Rsa, priv_key: &[u8], acces KeyType::Ec(_) => { let priv_key = PKey::from_ec_key(EcKey::private_key_from_der(priv_key)?)?; priv_key.private_key_to_pkcs8()? - }, + } KeyType::Rsa(_) => { let priv_key = PKey::from_rsa(Rsa::private_key_from_der(priv_key)?)?; priv_key.private_key_to_pkcs8()? - }, + } }; let aes_key: [u8; 32] = rand::random(); @@ -488,7 +636,13 @@ fn wrap_import_key(r#type: KeyType, pub_key: Rsa, priv_key: &[u8], acces let mut priv_encrypted = priv_key.to_vec(); let gcm = Aes256Gcm::new_from_slice(&aes_key).expect("Failed to bulild gcm"); - let tag = gcm.encrypt_in_place_detached(&Nonce::from_slice(&iv), &rasn::der::encode(&desc).expect("Failed to encode?"), &mut priv_encrypted).expect("Failed to encrypt"); + let tag = gcm + .encrypt_in_place_detached( + &Nonce::from_slice(&iv), + &rasn::der::encode(&desc).expect("Failed to encode?"), + &mut priv_encrypted, + ) + .expect("Failed to encrypt"); let wrapper = KeyWrapper { version: 0, @@ -503,18 +657,27 @@ fn wrap_import_key(r#type: KeyType, pub_key: Rsa, priv_key: &[u8], acces } pub struct NativeKeystoreHolder { - keystore: Arc + keystore: Arc, } impl Keystore for NativeKeystoreHolder { - fn create_key(&self, alias: &str, r#type: KeyType, access_rules: KeystoreAccessRules) -> Result<(), keystore::KeystoreError> { + fn create_key( + &self, + alias: &str, + r#type: KeyType, + access_rules: KeystoreAccessRules, + ) -> Result<(), keystore::KeystoreError> { info!("Keystore creating key {alias}"); - self.keystore.create_key(alias.to_owned(), r#type, access_rules).map_err(|e| e.into()) + self.keystore + .create_key(alias.to_owned(), r#type, access_rules) + .map_err(|e| e.into()) } fn destroy_key(&self, alias: &str) -> Result<(), KeystoreError> { info!("Keystore destroying key {alias}"); - self.keystore.destroy_key(alias.to_owned()).map_err(|e| e.into()) + self.keystore + .destroy_key(alias.to_owned()) + .map_err(|e| e.into()) } fn list_keys(&self) -> Result, KeystoreError> { @@ -533,32 +696,73 @@ impl Keystore for NativeKeystoreHolder { Err(KeystoreError::NotSupported) } - fn import_key(&self, alias: &str, r#type: KeyType, priv_key: &[u8], access_rules: KeystoreAccessRules) -> Result<(), KeystoreError> { - info!("Keystore importing alias {alias}"); - let rsa = Rsa::public_key_from_der(&self.keystore.get_import_wrap_key().map_err(|e| >::into(e))?)?; + fn import_key( + &self, + alias: &str, + r#type: KeyType, + priv_key: &[u8], + access_rules: KeystoreAccessRules, + ) -> Result<(), KeystoreError> { + info!("Keystore importing protected key"); + let rsa = Rsa::public_key_from_der( + &self + .keystore + .get_import_wrap_key() + .map_err(|e| >::into(e))?, + )?; let wrapped = wrap_import_key(r#type, rsa, priv_key, &access_rules)?; - info!("wrapped asn.1 {}", base64_encode(&wrapped)); + info!("Prepared wrapped key material (bytes={})", wrapped.len()); - self.keystore.import_key(alias.to_owned(), r#type, wrapped, access_rules).map_err(|e| e.into()) + self.keystore + .import_key(alias.to_owned(), r#type, wrapped, access_rules) + .map_err(|e| e.into()) } fn get_key_type(&self, alias: &str) -> Result, KeystoreError> { - let res = self.keystore.get_key_type(alias.to_owned()).map_err(|e| e.into()); + let res = self + .keystore + .get_key_type(alias.to_owned()) + .map_err(|e| e.into()); info!("sitch {alias} {res:?}"); res } - fn sign(&self, alias: &str, digest: KeystoreDigest, padding: KeystorePadding, data: &[u8]) -> Result, KeystoreError> { - self.keystore.sign(alias.to_owned(), digest, padding, data.to_vec()).map_err(|e| e.into()) + fn sign( + &self, + alias: &str, + digest: KeystoreDigest, + padding: KeystorePadding, + data: &[u8], + ) -> Result, KeystoreError> { + self.keystore + .sign(alias.to_owned(), digest, padding, data.to_vec()) + .map_err(|e| e.into()) } - fn verify(&self, alias: &str, digest: KeystoreDigest, padding: KeystorePadding, data: &[u8], sig: &[u8]) -> Result { - self.keystore.verify(alias.to_owned(), digest, padding, data.to_vec(), sig.to_vec()).map_err(|e| e.into()) + fn verify( + &self, + alias: &str, + digest: KeystoreDigest, + padding: KeystorePadding, + data: &[u8], + sig: &[u8], + ) -> Result { + self.keystore + .verify( + alias.to_owned(), + digest, + padding, + data.to_vec(), + sig.to_vec(), + ) + .map_err(|e| e.into()) } fn get_public_key(&self, alias: &str) -> Result, KeystoreError> { - self.keystore.get_public_key(alias.to_owned()).map_err(|e| e.into()) + self.keystore + .get_public_key(alias.to_owned()) + .map_err(|e| e.into()) } fn derive(&self, alias: &str, peer: &[u8]) -> Result, KeystoreError> { @@ -571,15 +775,31 @@ impl Keystore for NativeKeystoreHolder { let mut num_context_ref = BigNumContext::new()?; let point = EcPoint::from_bytes(&group, peer, &mut num_context_ref)?; let pub_key = EcKey::from_public_key(&group, &point)?; - - self.keystore.derive(alias.to_owned(), pub_key.public_key_to_der()?).map_err(|e| e.into()) + + self.keystore + .derive(alias.to_owned(), pub_key.public_key_to_der()?) + .map_err(|e| e.into()) } - fn encrypt(&self, alias: &str, plaintext: &[u8], mode: &mut EncryptMode) -> Result, KeystoreError> { - self.keystore.encrypt(alias.to_owned(), plaintext.to_vec(), *mode).map_err(|e| e.into()) + fn encrypt( + &self, + alias: &str, + plaintext: &[u8], + mode: &mut EncryptMode, + ) -> Result, KeystoreError> { + self.keystore + .encrypt(alias.to_owned(), plaintext.to_vec(), *mode) + .map_err(|e| e.into()) } - fn decrypt(&self, alias: &str, ciphertext: &[u8], mode: &EncryptMode) -> Result, KeystoreError> { - self.keystore.decrypt(alias.to_owned(), ciphertext.to_vec(), *mode).map_err(|e| e.into()) + fn decrypt( + &self, + alias: &str, + ciphertext: &[u8], + mode: &EncryptMode, + ) -> Result, KeystoreError> { + self.keystore + .decrypt(alias.to_owned(), ciphertext.to_vec(), *mode) + .map_err(|e| e.into()) } } diff --git a/rust/src/lib.rs b/rust/src/lib.rs index 53c697f975..0f348d0d85 100644 --- a/rust/src/lib.rs +++ b/rust/src/lib.rs @@ -1,20 +1,89 @@ -use std::{path::Path, sync::{LazyLock, OnceLock}}; +use std::{ + path::Path, + sync::{LazyLock, OnceLock}, +}; use flexi_logger::{opt_format, Age, Cleanup, Criterion, FileSpec, Logger, Naming, WriteMode}; -use tokio::runtime::Runtime; use log::info; +use tokio::runtime::Runtime; static LOGGER_INITIALIZED: OnceLock<()> = OnceLock::new(); uniffi::setup_scaffolding!(); +#[cfg(target_os = "android")] +struct SensitiveLogFilter { + inner: Box, +} + +#[cfg(target_os = "android")] +impl SensitiveLogFilter { + fn new(inner: Box) -> Self { + Self { inner } + } +} + +#[cfg(target_os = "android")] +impl log::Log for SensitiveLogFilter { + fn enabled(&self, metadata: &log::Metadata<'_>) -> bool { + metadata.level() <= log::Level::Warn && self.inner.enabled(metadata) + } + + fn log(&self, record: &log::Record<'_>) { + if !self.enabled(record.metadata()) { + return; + } + + let message = record.args().to_string(); + if contains_sensitive_log_material(&message) { + return; + } + + self.inner.log(record); + } + + fn flush(&self) { + self.inner.flush(); + } +} + +fn contains_sensitive_log_material(message: &str) -> bool { + let message = message.to_ascii_lowercase(); + const SENSITIVE_MARKERS: &[&str] = &[ + "authorization", + "auth response", + "cookie", + "credential", + "decoded_spd", + "device-key", + "mailto:", + "password data", + "plist", + "private-key", + "pseud:", + "push-token", + "raw connect response", + "register response", + "security code failed, response", + "sending apns query", + "session-token", + "tel:+", + "xml body", + ]; + + SENSITIVE_MARKERS + .iter() + .any(|marker| message.contains(marker)) +} + pub static RUNTIME: LazyLock = LazyLock::new(|| { info!("creating runner"); tokio::runtime::Builder::new_multi_thread() .worker_threads(1) .thread_name("tokio-rustpush") .enable_all() - .build().unwrap() + .build() + .unwrap() }); pub mod bbhwinfo { @@ -23,35 +92,109 @@ pub mod bbhwinfo { pub fn init_logger(path: &Path) { LOGGER_INITIALIZED.get_or_init(|| { - #[cfg(target_os = "android")] - let system = android_logger::AndroidLogger::new( - android_logger::Config::default().with_max_level(log::LevelFilter::Debug), - ); - #[cfg(not(target_os = "android"))] - let system = { - if let Err(_) = std::env::var("RUST_LOG") { - std::env::set_var("RUST_LOG", "debug"); - } - pretty_env_logger::formatted_builder() + #[cfg(target_os = "android")] + let system = android_logger::AndroidLogger::new( + android_logger::Config::default().with_max_level(log::LevelFilter::Warn), + ); + #[cfg(not(target_os = "android"))] + let system = { + if let Err(_) = std::env::var("RUST_LOG") { + std::env::set_var("RUST_LOG", "debug"); + } + pretty_env_logger::formatted_builder().build() + }; + + #[cfg(target_os = "android")] + let log_spec = "warn"; + #[cfg(not(target_os = "android"))] + let log_spec = "debug"; + + let (logger, _) = Logger::try_with_str(log_spec) + .expect("No logger?") + .log_to_file( + FileSpec::default() + .directory(path.join("logs")) + .suppress_timestamp(), + ) + .append() + .format(opt_format) + .cleanup_in_background_thread(false) + .rotate( + Criterion::AgeOrSize(Age::Day, 1024 * 1024 * 10 /* 10 MB */), + Naming::Numbers, + Cleanup::KeepLogFiles(1), + ) + .write_mode(WriteMode::BufferAndFlush) .build() - }; - - let (logger, _) = Logger::try_with_str("debug").expect("No logger?") - .log_to_file(FileSpec::default().directory(path.join("logs")).suppress_timestamp()) - .append() - .format(opt_format) - .cleanup_in_background_thread(false) - .rotate(Criterion::AgeOrSize(Age::Day, 1024 * 1024 * 10 /* 10 MB */), Naming::Numbers, Cleanup::KeepLogFiles(1)) - .write_mode(WriteMode::BufferAndFlush) - .build().unwrap(); - + .unwrap(); + // Logging is process-global. Background isolates can call this entry // point again, so repeated initialization must be harmless. - let _ = multi_log::MultiLogger::init(vec![Box::new(system), logger], log::Level::Trace); + #[cfg(target_os = "android")] + let outputs: Vec> = vec![ + Box::new(SensitiveLogFilter::new(Box::new(system))), + Box::new(SensitiveLogFilter::new(logger)), + ]; + #[cfg(not(target_os = "android"))] + let outputs: Vec> = vec![Box::new(system), logger]; + + #[cfg(target_os = "android")] + let max_level = log::Level::Warn; + #[cfg(not(target_os = "android"))] + let max_level = log::Level::Trace; + + let _ = multi_log::MultiLogger::init(outputs, max_level); }); } -mod native; +#[cfg(test)] +mod tests { + use super::contains_sensitive_log_material; + + #[test] + fn suppresses_ids_secrets_and_raw_responses() { + assert!(contains_sensitive_log_material( + r#"session-token": Data([1, 2, 3])"# + )); + assert!(contains_sensitive_log_material( + r#"push-token": Data([4, 5, 6])"# + )); + assert!(contains_sensitive_log_material( + "Got auth response YWJjZA==" + )); + assert!(contains_sensitive_log_material( + "raw connect response [1, 2, 3]" + )); + assert!(contains_sensitive_log_material( + "Validating pseudonym pseud:example for handle mailto:user@example.com" + )); + assert!(contains_sensitive_log_material( + "Registering handle tel:+15555550100" + )); + } + + #[test] + fn preserves_actionable_transport_diagnostics() { + assert!(!contains_sensitive_log_material( + "APS connection closed with status 503" + )); + assert!(!contains_sensitive_log_material( + "Failed to read from APS socket" + )); + } +} + pub mod api; +mod cloud_sync_canonical_converter; +mod cloud_sync_canonical_dto; +mod cloud_sync_native_fetch; +mod cloud_sync_outbound; +mod cloud_sync_protector; +mod cloud_sync_semantic_decoder; +mod cloud_sync_semantic_identity; +mod cloud_sync_transient_bridge; +mod frb_generated; mod keystore; -mod frb_generated; /* AUTO INJECTED BY flutter_rust_bridge. This line may not be accurate, and you can change it according to your needs. */ +mod native; +#[cfg(target_os = "windows")] +pub mod windows_secret_storage; /* AUTO INJECTED BY flutter_rust_bridge. This line may not be accurate, and you can change it according to your needs. */ diff --git a/rust/src/native.rs b/rust/src/native.rs index f4b45322b0..034b7ecfc9 100644 --- a/rust/src/native.rs +++ b/rust/src/native.rs @@ -1,16 +1,41 @@ -use std::{collections::{BTreeMap, HashMap}, fmt::Debug, io::Cursor, sync::{Arc, LazyLock, OnceLock, RwLock, Weak}, time::{Duration, SystemTime}}; +use std::{ + collections::{BTreeMap, HashMap}, + fmt::Debug, + io::Cursor, + sync::{Arc, LazyLock, OnceLock, RwLock, Weak}, + time::{Duration, SystemTime}, +}; use flexi_logger::{FileSpec, Logger, WriteMode}; use log::{error, info, warn}; use openssl::{ec::EcKey, pkey::PKey}; -use rustpush::{EntitlementAuthState, GenerateVerificationTokenRequest, PushError, get_gateways_for_mccmnc, passwords::{Passkey, PasskeyCriteria, PasswordCriteria, PasswordManager, PasswordManagerMeta, PasswordManagerMetaChange, PasswordManagerMetaData, PasswordManagerMetaDataCtx, PasswordRawEntry}}; -use tokio::{runtime::{Handle, Runtime}, sync::Mutex}; - +use rustpush::{ + get_gateways_for_mccmnc, + passwords::{ + Passkey, PasskeyCriteria, PasswordCriteria, PasswordManager, PasswordManagerMeta, + PasswordManagerMetaChange, PasswordManagerMetaData, PasswordManagerMetaDataCtx, + PasswordRawEntry, + }, + EntitlementAuthState, GenerateVerificationTokenRequest, PushError, +}; +use tokio::{ + runtime::{Handle, Runtime}, + sync::Mutex, +}; + +use crate::{ + api::api::{ + approve_circle, decline_facetime, do_first_time_init, get_2fa_code, get_entitlements, + recv_wait, set_status, teardown_2fa, APSWatcher, DaemonData, PollResult, PushMessage, + SharedPushState, + }, + frb_generated::FLUTTER_RUST_BRIDGE_HANDLER, + init_logger, RUNTIME, +}; use futures::FutureExt; use uuid::Uuid; -use crate::{RUNTIME, api::api::{APSWatcher, DaemonData, PollResult, PushMessage, SharedPushState, approve_circle, decline_facetime, do_first_time_init, get_2fa_code, get_entitlements, recv_wait, set_status, teardown_2fa}, frb_generated::FLUTTER_RUST_BRIDGE_HANDLER, init_logger}; -#[derive(uniffi::Record)] +#[derive(uniffi::Record)] pub struct FileInfo { pub duration: Option, pub width: u32, @@ -88,14 +113,18 @@ pub trait HandleWifiNetworksCallback: Send + Sync + Debug { fn handle_wifi_networks(&self, networks: HashMap, user_approve: bool); } -#[derive(uniffi::Object)] +#[derive(uniffi::Object)] pub struct NativePushState { state: Arc, watcher: Mutex, } #[uniffi::export] -pub fn start(dir: String, packager: Arc, wifi: Arc) { +pub fn start( + dir: String, + packager: Arc, + wifi: Arc, +) { let _ = PACKAGER_LOCK.set(packager); let _ = HANDLE_WIFI_NETWORKS.set(wifi); do_first_time_init(dir); @@ -116,10 +145,12 @@ pub fn init_native(dir: String, handle: Option, handler: Arc, mccmnc: String) { }); } - - pub fn plist_to_buf(value: &T) -> Result, plist::Error> { let mut buf: Vec = Vec::new(); let writer = Cursor::new(&mut buf); @@ -151,8 +180,8 @@ pub fn plist_to_string(value: &T) -> Result)>> = LazyLock::new(|| Mutex::new((0, HashMap::new()))); +pub static QUEUED_MESSAGES: LazyLock)>> = + LazyLock::new(|| Mutex::new((0, HashMap::new()))); fn is_terminal_poll_panic(message: &str) -> bool { let message = message.to_ascii_lowercase(); @@ -180,13 +209,15 @@ mod tests { #[uniffi::export] impl NativePushState { - pub fn start_loop(self: Arc, handler: Arc) { RUNTIME.spawn(async move { let mut watcher = self.watcher.lock().await; let mut panic_backoff_ms = 250u64; loop { - match std::panic::AssertUnwindSafe(recv_wait(&mut watcher, &self.state)).catch_unwind().await { + match std::panic::AssertUnwindSafe(recv_wait(&mut watcher, &self.state)) + .catch_unwind() + .await + { Ok(yes) => { panic_backoff_ms = 250; match yes { @@ -223,11 +254,11 @@ impl NativePushState { info!("emitting pointer {key}"); handler.receieved_msg(key, 0); - }, + } PollResult::Cont(None) => continue, - PollResult::Stop => break + PollResult::Stop => break, } - }, + } Err(payload) => { let panic = match payload.downcast_ref::<&'static str>() { Some(msg) => Some(*msg), @@ -238,7 +269,10 @@ impl NativePushState { }, }; if panic.map(is_terminal_poll_panic).unwrap_or(false) { - warn!("Stopping APS receive loop after terminal watcher panic: {:?}", panic); + warn!( + "Stopping APS receive loop after terminal watcher panic: {:?}", + panic + ); break; } @@ -254,87 +288,187 @@ impl NativePushState { } pub fn get_available_groups(&self, groups_callback: Arc) { - let passwords = self.state.icloud_services.as_ref().and_then(|i| i.passwords.clone()).expect("no icloud"); + let passwords = self + .state + .icloud_services + .as_ref() + .and_then(|i| i.passwords.clone()) + .expect("no icloud"); RUNTIME.spawn(async move { let state = passwords.state.read().await; - let result = state.groups.iter().filter_map(|g| Some((g.1.share.as_ref()?.display_name.clone(), g.0.clone()))).collect::>(); + let result = state + .groups + .iter() + .filter_map(|g| Some((g.1.share.as_ref()?.display_name.clone(), g.0.clone()))) + .collect::>(); groups_callback.groups(result); }); } - pub fn keychain_password_insert(&self, site: String, user: String, password: String, callback: Arc, group: Option) { - let passwords = self.state.icloud_services.as_ref().and_then(|i| i.passwords.clone()).expect("no icloud"); + pub fn keychain_password_insert( + &self, + site: String, + user: String, + password: String, + callback: Arc, + group: Option, + ) { + let passwords = self + .state + .icloud_services + .as_ref() + .and_then(|i| i.passwords.clone()) + .expect("no icloud"); RUNTIME.spawn(async move { let criteria = PasswordCriteria { site, account: user, }; - let a = passwords.modify_password_entry::(&criteria, |pw| { - pw.data = password.as_bytes().to_vec(); - }, group.clone()).await.err(); - let b = passwords.modify_password_entry::(&criteria, |pw| { - let mut data = pw.get_password_data().expect("Failed to get data?"); - data.set_last_used(SystemTime::now()); - data.change_password(password); - }, group.clone()).await.err(); + let a = passwords + .modify_password_entry::( + &criteria, + |pw| { + pw.data = password.as_bytes().to_vec(); + }, + group.clone(), + ) + .await + .err(); + let b = passwords + .modify_password_entry::( + &criteria, + |pw| { + let mut data = pw.get_password_data().expect("Failed to get data?"); + data.set_last_used(SystemTime::now()); + data.change_password(password); + }, + group.clone(), + ) + .await + .err(); let e = a.or(b); callback.done(e.map(|e| format!("{e}"))); }); } - pub fn keychain_passkey_insert(&self, site: String, record_id: String, id: Vec, tag: Vec, key: Vec, callback: Arc, group: Option) { - let passwords = self.state.icloud_services.as_ref().and_then(|i| i.passwords.clone()).expect("no icloud"); + pub fn keychain_passkey_insert( + &self, + site: String, + record_id: String, + id: Vec, + tag: Vec, + key: Vec, + callback: Arc, + group: Option, + ) { + let passwords = self + .state + .icloud_services + .as_ref() + .and_then(|i| i.passwords.clone()) + .expect("no icloud"); RUNTIME.spawn(async move { // techincally this may insert into wrong group, but does anyone really ever update a passkey with the same ID?? // and if they do, damn right it may go into the wrong group. Not my issue at this time lol - let result = passwords.insert_password_entry(&record_id, &Passkey { - cdat: SystemTime::now().duration_since(SystemTime::UNIX_EPOCH).unwrap().as_millis() as u64, - mdat: SystemTime::now().duration_since(SystemTime::UNIX_EPOCH).unwrap().as_millis() as u64, - agrp: "com.apple.webkit.webauthn".to_string(), - labl: site, - atag: tag, - data: Passkey::encode_key(PKey::private_key_from_pkcs8(&key).expect("Invalid EC key??").ec_key().expect("not ec key??")), - klbl: id, - }, group.clone()).await.err(); + let result = passwords + .insert_password_entry( + &record_id, + &Passkey { + cdat: SystemTime::now() + .duration_since(SystemTime::UNIX_EPOCH) + .unwrap() + .as_millis() as u64, + mdat: SystemTime::now() + .duration_since(SystemTime::UNIX_EPOCH) + .unwrap() + .as_millis() as u64, + agrp: "com.apple.webkit.webauthn".to_string(), + labl: site, + atag: tag, + data: Passkey::encode_key( + PKey::private_key_from_pkcs8(&key) + .expect("Invalid EC key??") + .ec_key() + .expect("not ec key??"), + ), + klbl: id, + }, + group.clone(), + ) + .await + .err(); callback.done(result.map(|e| format!("{e}"))); }); } pub fn get_site_config(&self, site: String, callback: Arc) { - let passwords = self.state.icloud_services.as_ref().and_then(|i| i.passwords.clone()).expect("no icloud"); + let passwords = self + .state + .icloud_services + .as_ref() + .and_then(|i| i.passwords.clone()) + .expect("no icloud"); RUNTIME.spawn(async move { let passwords = passwords.get_password_for_site(site).await; - callback.keys(passwords.passwords.into_iter().map(|(k, p)| SavedPassword { - cred_id: k, - username: p.acct.clone(), - password: String::from_utf8(p.data.clone()).expect("password not utf8??"), - otp: passwords.passwords_meta.values().find_map(|m| { - if p.acct != m.acct { return None } - let totp = m.get_password_data().ok()?.totp?; - Some(totp.generate_otp().ok()?.0) - }) - }).collect(), passwords.passkeys.into_iter().map(|(k, p)| SavedPasskey { - cred_id: k, - id: p.klbl.clone(), - tag: p.atag.clone(), - key: PKey::from_ec_key(p.get_key()).unwrap().private_key_to_pkcs8().unwrap(), - }).collect()); + callback.keys( + passwords + .passwords + .into_iter() + .map(|(k, p)| SavedPassword { + cred_id: k, + username: p.acct.clone(), + password: String::from_utf8(p.data.clone()).expect("password not utf8??"), + otp: passwords.passwords_meta.values().find_map(|m| { + if p.acct != m.acct { + return None; + } + let totp = m.get_password_data().ok()?.totp?; + Some(totp.generate_otp().ok()?.0) + }), + }) + .collect(), + passwords + .passkeys + .into_iter() + .map(|(k, p)| SavedPasskey { + cred_id: k, + id: p.klbl.clone(), + tag: p.atag.clone(), + key: PKey::from_ec_key(p.get_key()) + .unwrap() + .private_key_to_pkcs8() + .unwrap(), + }) + .collect(), + ); }); } - pub fn do_special_apple_auth(&self, client_data_hash: String, callback: Arc) { - let token = self.state.icloud_services.as_ref().map(|i| i.token_provider.clone()).expect("no token"); + pub fn do_special_apple_auth( + &self, + client_data_hash: String, + callback: Arc, + ) { + let token = self + .state + .icloud_services + .as_ref() + .map(|i| i.token_provider.clone()) + .expect("no token"); RUNTIME.spawn(async move { - let result = std::panic::AssertUnwindSafe(token.generate_verification_token(GenerateVerificationTokenRequest::Passkey { - client_data_hash, - })).catch_unwind().await; + let result = std::panic::AssertUnwindSafe(token.generate_verification_token( + GenerateVerificationTokenRequest::Passkey { client_data_hash }, + )) + .catch_unwind() + .await; match result { Ok(Ok(success)) => { let (key, value) = success.split_once(":").expect("Bad token form??"); - callback.got_verification(HashMap::from_iter([ - (key.to_string(), value.to_string()) - ]), None); - }, + callback.got_verification( + HashMap::from_iter([(key.to_string(), value.to_string())]), + None, + ); + } Ok(Err(e)) => { callback.got_verification(HashMap::new(), Some(format!("{e}"))); } @@ -370,7 +504,13 @@ impl NativePushState { } pub fn teardown_2fa(&self, action: String, txnid: String) { - let state_ref = self.state.icloud_services.as_ref().expect("no icloud!").account.clone(); + let state_ref = self + .state + .icloud_services + .as_ref() + .expect("no icloud!") + .account + .clone(); RUNTIME.spawn(async move { if let Err(e) = teardown_2fa(&state_ref, action, txnid).await { warn!("Failed to teardown 2fa {e}"); @@ -392,9 +532,15 @@ impl NativePushState { } }) } - + pub fn publish_status(&self, guid: Option) { - let state_ref = self.state.icloud_services.as_ref().expect("no icloud!").statuskit_client.clone(); + let state_ref = self + .state + .icloud_services + .as_ref() + .expect("no icloud!") + .statuskit_client + .clone(); RUNTIME.spawn(async move { if let Err(e) = set_status(&state_ref, guid).await { warn!("Failed to decline publish status {e}"); diff --git a/rust/src/windows_secret_storage.rs b/rust/src/windows_secret_storage.rs new file mode 100644 index 0000000000..37d4d1bea6 --- /dev/null +++ b/rust/src/windows_secret_storage.rs @@ -0,0 +1,1172 @@ +//! Windows-only protected storage primitives for Cloud Sync V2. +//! +//! Production callers use [`open_windows_keystore`], which acquires a +//! profile-wide lifetime lock before it inspects, creates, or migrates state. +//! Lower-level migration helpers remain path-free for deterministic tests. + +use std::{ + ffi::OsStr, + fs::{self, File, OpenOptions}, + io::{self, Read, Write}, + os::windows::{ffi::OsStrExt, fs::OpenOptionsExt, io::AsRawHandle}, + path::{Path, PathBuf}, + ptr, + sync::Arc, + thread, + time::Duration, +}; + +use keystore::{ + software::{SoftwareEncryptor, SoftwareKeystoreState}, + KeystoreError, +}; +use plist::Data; +use serde::{Deserialize, Serialize}; +use thiserror::Error; +use windows_sys::Win32::{ + Foundation::{LocalFree, HANDLE}, + Security::Cryptography::{ + CryptProtectData, CryptUnprotectData, CRYPTPROTECT_UI_FORBIDDEN, CRYPT_INTEGER_BLOB, + }, + Storage::FileSystem::{FlushFileBuffers, ReplaceFileW}, +}; + +pub const WINDOWS_KEYSTORE_FORMAT_VERSION: u32 = 2; +pub const CLOUD_SYNC_INSTALL_SECRET_FORMAT_VERSION: u32 = 1; +const MASTER_KEY_LENGTH: usize = 32; +const LEGACY_WINDOWS_KEY: [u8; MASTER_KEY_LENGTH] = *b"desktopisinsecureyoushouldn'tber"; +const MAX_ENVELOPE_BYTES: u64 = 64 * 1024 * 1024; +const SECRET_OPEN_RETRY_ATTEMPTS: usize = 100; +const SECRET_OPEN_RETRY_DELAY: Duration = Duration::from_millis(10); + +#[derive(Debug, Error)] +pub enum WindowsSecretStorageError { + #[error("Windows secret-storage I/O failed")] + Io(#[from] io::Error), + + #[error("Windows DPAPI {operation} failed")] + Dpapi { + operation: &'static str, + #[source] + source: io::Error, + }, + + #[error("Windows DPAPI returned an invalid result")] + InvalidDpapiResult, + + #[error("Protected master key has an invalid length")] + InvalidMasterKeyLength, + + #[error("Protected keystore envelope is invalid")] + InvalidEnvelope, + + #[error("Unsupported protected keystore format version {0}")] + UnsupportedFormatVersion(u32), + + #[error("Protected keystore envelope exceeds the size limit")] + EnvelopeTooLarge, + + #[error("Software keystore validation failed")] + Keystore(#[from] KeystoreError), + + #[error("Atomic replacement target does not exist")] + MissingReplacementTarget, + + #[error("Atomic replacement backup already exists")] + BackupAlreadyExists, + + #[error("Atomic replacement paths must share one directory")] + PathsMustShareDirectory, + + #[error("Atomic replacement verification failed")] + ReplacementVerificationFailed, + + #[error("Cloud Sync installation secret initialization did not settle")] + SecretInitializationRace, + + #[error("Windows keystore profile is already open")] + ProfileLocked, + + #[error("Windows keystore recovery backup requires explicit recovery")] + RecoveryBackupPresent, +} + +/// Versioned, architecture-neutral representation of the Windows software +/// keystore. The master key is protected with current-user DPAPI. Individual +/// keystore entries remain authenticated with the keystore crate's AES-GCM +/// `SoftwareEncryptor`. +#[derive(Serialize, Deserialize)] +pub struct WindowsProtectedKeystoreEnvelope { + format_version: u32, + protected_master_key: Data, + state: SoftwareKeystoreState, +} + +/// Unlocked state plus the profile-wide lock and protected persistence writer. +/// +/// Keep [writer] alive for the lifetime of the process keystore. Its exclusive +/// lock prevents another OpenBubbles process or architecture from opening and +/// migrating the same profile concurrently. +pub struct WindowsOpenedKeystore { + pub state: SoftwareKeystoreState, + pub encryptor: SoftwareEncryptor, + pub writer: WindowsProtectedKeystoreWriter, +} + +pub struct WindowsProtectedKeystoreWriter { + target: PathBuf, + protected_master_key: Vec, + _profile_lock: Arc, +} + +struct WindowsProfileLock { + _file: File, +} + +/// Small current-user protected secret used for account-fingerprint HMACs and +/// Cloud Sync local journal key derivation. +/// +/// The format contains no architecture-sized values, so x64 and ARM64 builds +/// share the same file contract for one Windows user profile. +#[derive(Serialize, Deserialize)] +struct CloudSyncInstallSecretEnvelope { + format_version: u32, + protected_secret: Data, +} + +impl WindowsProtectedKeystoreEnvelope { + pub fn format_version(&self) -> u32 { + self.format_version + } + + /// Authenticates the DPAPI master and every encrypted software-keystore + /// entry without exposing their contents. + pub fn validate(&self) -> Result<(), WindowsSecretStorageError> { + let encryptor = self.unlock_encryptor()?; + self.state.validate(&encryptor)?; + Ok(()) + } + + /// Consumes a validated envelope for integration with `SoftwareKeystore`. + pub fn into_unlocked( + self, + ) -> Result<(SoftwareKeystoreState, SoftwareEncryptor), WindowsSecretStorageError> { + let encryptor = self.unlock_encryptor()?; + self.state.validate(&encryptor)?; + Ok((self.state, encryptor)) + } + + fn unlock_encryptor(&self) -> Result { + if self.format_version != WINDOWS_KEYSTORE_FORMAT_VERSION { + return Err(WindowsSecretStorageError::UnsupportedFormatVersion( + self.format_version, + )); + } + + let master = unprotect_current_user(self.protected_master_key.as_ref())?; + let master: [u8; MASTER_KEY_LENGTH] = master + .try_into() + .map_err(|_| WindowsSecretStorageError::InvalidMasterKeyLength)?; + Ok(SoftwareEncryptor(master)) + } +} + +/// Re-wraps a strictly decoded legacy state with a fresh random master and +/// protects that master for the current Windows user. +/// +/// This helper is intentionally state-to-state. It never discovers, reads, +/// replaces, or deletes a live profile. +pub fn migrate_legacy_state( + legacy_state: &SoftwareKeystoreState, + legacy_key: [u8; MASTER_KEY_LENGTH], +) -> Result { + let legacy_encryptor = SoftwareEncryptor(legacy_key); + let new_encryptor = SoftwareEncryptor::new(); + let state = legacy_state.rewrap(&legacy_encryptor, &new_encryptor)?; + state.validate(&new_encryptor)?; + + let protected_master_key = protect_current_user(&new_encryptor.0)?; + let envelope = WindowsProtectedKeystoreEnvelope { + format_version: WINDOWS_KEYSTORE_FORMAT_VERSION, + protected_master_key: protected_master_key.into(), + state, + }; + envelope.validate()?; + Ok(envelope) +} + +pub fn encode_envelope( + envelope: &WindowsProtectedKeystoreEnvelope, +) -> Result, WindowsSecretStorageError> { + envelope.validate()?; + let mut encoded = Vec::new(); + plist::to_writer_binary(&mut encoded, envelope) + .map_err(|_| WindowsSecretStorageError::InvalidEnvelope)?; + if encoded.is_empty() || encoded.len() as u64 > MAX_ENVELOPE_BYTES { + return Err(WindowsSecretStorageError::EnvelopeTooLarge); + } + Ok(encoded) +} + +pub fn decode_envelope( + encoded: &[u8], +) -> Result { + if encoded.is_empty() || encoded.len() as u64 > MAX_ENVELOPE_BYTES { + return Err(WindowsSecretStorageError::InvalidEnvelope); + } + let envelope: WindowsProtectedKeystoreEnvelope = + plist::from_bytes(encoded).map_err(|_| WindowsSecretStorageError::InvalidEnvelope)?; + envelope.validate()?; + Ok(envelope) +} + +pub fn read_envelope( + path: &Path, +) -> Result { + decode_envelope(&read_bounded(path)?) +} + +/// Opens a protected profile, creates a protected new profile, or migrates one +/// strictly validated legacy profile while holding an exclusive lifetime lock. +pub fn open_windows_keystore( + target: &Path, +) -> Result { + let parent = target + .parent() + .ok_or(WindowsSecretStorageError::PathsMustShareDirectory)?; + fs::create_dir_all(parent)?; + let profile_lock = Arc::new(acquire_profile_lock( + &parent.join(".openbubbles-keystore.lock"), + )?); + let backup = parent.join(format!( + "{}.dpapi-v2-legacy-backup", + target + .file_name() + .ok_or(WindowsSecretStorageError::InvalidEnvelope)? + .to_string_lossy() + )); + + if !target.exists() { + if backup.exists() { + return Err(WindowsSecretStorageError::RecoveryBackupPresent); + } + let state = SoftwareKeystoreState::default(); + let encryptor = SoftwareEncryptor::new(); + let protected_master_key = protect_current_user(&encryptor.0)?; + let envelope = WindowsProtectedKeystoreEnvelope { + format_version: WINDOWS_KEYSTORE_FORMAT_VERSION, + protected_master_key: protected_master_key.clone().into(), + state, + }; + create_new_envelope(target, &envelope)?; + } else { + let encoded = read_bounded(target)?; + match decode_envelope(&encoded) { + Ok(_) => {} + Err(protected_error) => { + if looks_like_protected_envelope(&encoded) { + return Err(protected_error); + } + let legacy_state = decode_legacy_state_strict(&encoded, LEGACY_WINDOWS_KEY)?; + let envelope = migrate_legacy_state(&legacy_state, LEGACY_WINDOWS_KEY)?; + replace_existing_envelope_atomic(target, &backup, &envelope)?; + } + } + } + + let envelope = read_envelope(target)?; + let protected_master_key = envelope.protected_master_key.as_ref().to_vec(); + let (state, encryptor) = envelope.into_unlocked()?; + Ok(WindowsOpenedKeystore { + state, + encryptor, + writer: WindowsProtectedKeystoreWriter { + target: target.to_path_buf(), + protected_master_key, + _profile_lock: profile_lock, + }, + }) +} + +impl WindowsProtectedKeystoreWriter { + /// Persists a complete state through a flushed same-directory replacement. + /// The lifetime profile lock is still held by this writer. + pub fn write_state( + &self, + state: &SoftwareKeystoreState, + ) -> Result<(), WindowsSecretStorageError> { + let envelope = WindowsProtectedKeystoreEnvelope { + format_version: WINDOWS_KEYSTORE_FORMAT_VERSION, + protected_master_key: self.protected_master_key.clone().into(), + state: strict_clone_state(state)?, + }; + let encoded = encode_envelope(&envelope)?; + replace_existing_bytes_atomic(&self.target, &encoded)?; + read_envelope(&self.target)?.validate() + } +} + +fn acquire_profile_lock(path: &Path) -> Result { + let mut options = OpenOptions::new(); + options.read(true).write(true).create(true).share_mode(0); + match options.open(path) { + Ok(file) => Ok(WindowsProfileLock { _file: file }), + Err(error) if is_transient_share_error(&error) => { + Err(WindowsSecretStorageError::ProfileLocked) + } + Err(error) => Err(WindowsSecretStorageError::Io(error)), + } +} + +fn create_new_envelope( + target: &Path, + envelope: &WindowsProtectedKeystoreEnvelope, +) -> Result<(), WindowsSecretStorageError> { + let encoded = encode_envelope(envelope)?; + let mut file = OpenOptions::new() + .write(true) + .create_new(true) + .share_mode(0) + .open(target)?; + file.write_all(&encoded)?; + file.flush()?; + flush_file_buffers(&file)?; + drop(file); + let installed = read_bounded(target)?; + decode_envelope(&installed)?; + Ok(()) +} + +fn looks_like_protected_envelope(encoded: &[u8]) -> bool { + let Ok(plist::Value::Dictionary(dictionary)) = plist::from_bytes(encoded) else { + return false; + }; + dictionary.contains_key("format_version") + || dictionary.contains_key("protected_master_key") + || dictionary.contains_key("state") +} + +fn decode_legacy_state_strict( + encoded: &[u8], + legacy_key: [u8; MASTER_KEY_LENGTH], +) -> Result { + let value: plist::Value = + plist::from_bytes(encoded).map_err(|_| WindowsSecretStorageError::InvalidEnvelope)?; + let plist::Value::Dictionary(dictionary) = value else { + return Err(WindowsSecretStorageError::InvalidEnvelope); + }; + if dictionary.len() != 2 + || !matches!(dictionary.get("keys"), Some(plist::Value::Dictionary(_))) + || !matches!(dictionary.get("secrets"), Some(plist::Value::Dictionary(_))) + { + return Err(WindowsSecretStorageError::InvalidEnvelope); + } + let state: SoftwareKeystoreState = + plist::from_bytes(encoded).map_err(|_| WindowsSecretStorageError::InvalidEnvelope)?; + state.validate(&SoftwareEncryptor(legacy_key))?; + Ok(state) +} + +fn strict_clone_state( + state: &SoftwareKeystoreState, +) -> Result { + let mut encoded = Vec::new(); + plist::to_writer_binary(&mut encoded, state) + .map_err(|_| WindowsSecretStorageError::InvalidEnvelope)?; + plist::from_bytes(&encoded).map_err(|_| WindowsSecretStorageError::InvalidEnvelope) +} + +fn replace_existing_bytes_atomic( + target: &Path, + encoded: &[u8], +) -> Result<(), WindowsSecretStorageError> { + let parent = target + .parent() + .ok_or(WindowsSecretStorageError::PathsMustShareDirectory)?; + if !target.is_file() { + return Err(WindowsSecretStorageError::MissingReplacementTarget); + } + let target_name = target + .file_name() + .ok_or(WindowsSecretStorageError::InvalidEnvelope)?; + let mut temp_name = OsStr::new(".").to_os_string(); + temp_name.push(target_name); + temp_name.push(format!(".{}.dpapi-v2.tmp", uuid::Uuid::new_v4())); + let temp = parent.join(temp_name); + + let result = (|| { + let mut file = OpenOptions::new() + .write(true) + .create_new(true) + .share_mode(0) + .open(&temp)?; + file.write_all(encoded)?; + file.flush()?; + flush_file_buffers(&file)?; + drop(file); + replace_file_without_backup(target, &temp)?; + let installed = read_bounded(target)?; + if installed != encoded { + return Err(WindowsSecretStorageError::ReplacementVerificationFailed); + } + Ok(()) + })(); + if temp.exists() { + let _ = fs::remove_file(&temp); + } + result +} + +/// Opens the existing 32-byte per-install Cloud Sync secret, or creates it once. +/// +/// `create_new` on the final path is the race arbiter. The winning writer holds +/// the file without sharing until the bytes are flushed with +/// `FlushFileBuffers`. Losing callers retry the strict reader and return the +/// exact same key. Existing corrupt or truncated files are never regenerated. +pub fn load_or_create_cloud_sync_install_secret( + path: &Path, +) -> Result<[u8; MASTER_KEY_LENGTH], WindowsSecretStorageError> { + match read_cloud_sync_install_secret(path) { + Ok(secret) => return Ok(secret), + Err(WindowsSecretStorageError::Io(error)) if error.kind() == io::ErrorKind::NotFound => {} + Err(WindowsSecretStorageError::Io(error)) if is_transient_share_error(&error) => { + return read_cloud_sync_install_secret_after_race(path); + } + Err(error) => return Err(error), + } + + let secret: [u8; MASTER_KEY_LENGTH] = rand::random(); + let encoded = encode_cloud_sync_install_secret(&secret)?; + let mut options = OpenOptions::new(); + options.write(true).create_new(true).share_mode(0); + match options.open(path) { + Ok(mut file) => { + let write_result = (|| { + file.write_all(&encoded)?; + file.flush()?; + flush_file_buffers(&file)?; + Ok::<(), WindowsSecretStorageError>(()) + })(); + drop(file); + write_result?; + + let installed = read_cloud_sync_install_secret(path)?; + if installed != secret { + return Err(WindowsSecretStorageError::ReplacementVerificationFailed); + } + Ok(installed) + } + Err(error) if error.kind() == io::ErrorKind::AlreadyExists => { + read_cloud_sync_install_secret_after_race(path) + } + Err(error) => Err(WindowsSecretStorageError::Io(error)), + } +} + +/// Strictly reads an existing Cloud Sync installation secret. Invalid +/// versions, DPAPI failures, truncation, and wrong plaintext lengths all fail +/// closed. +pub fn read_cloud_sync_install_secret( + path: &Path, +) -> Result<[u8; MASTER_KEY_LENGTH], WindowsSecretStorageError> { + let encoded = read_bounded(path)?; + let envelope: CloudSyncInstallSecretEnvelope = + plist::from_bytes(&encoded).map_err(|_| WindowsSecretStorageError::InvalidEnvelope)?; + if envelope.format_version != CLOUD_SYNC_INSTALL_SECRET_FORMAT_VERSION { + return Err(WindowsSecretStorageError::UnsupportedFormatVersion( + envelope.format_version, + )); + } + let secret = unprotect_current_user(envelope.protected_secret.as_ref())?; + secret + .try_into() + .map_err(|_| WindowsSecretStorageError::InvalidMasterKeyLength) +} + +/// Replaces an existing file using a flushed, same-directory temporary file +/// and `ReplaceFileW` with flags set to zero. +/// +/// The caller supplies a non-existing backup path in the same directory. The +/// old target remains there after success. A post-replacement failure returns +/// an error and leaves that backup intact for explicit recovery. +pub fn replace_existing_envelope_atomic( + target: &Path, + backup: &Path, + envelope: &WindowsProtectedKeystoreEnvelope, +) -> Result<(), WindowsSecretStorageError> { + let target_parent = target + .parent() + .ok_or(WindowsSecretStorageError::PathsMustShareDirectory)?; + if backup.parent() != Some(target_parent) { + return Err(WindowsSecretStorageError::PathsMustShareDirectory); + } + if !target.is_file() { + return Err(WindowsSecretStorageError::MissingReplacementTarget); + } + if backup.exists() { + return Err(WindowsSecretStorageError::BackupAlreadyExists); + } + + let encoded = encode_envelope(envelope)?; + let target_name = target + .file_name() + .ok_or(WindowsSecretStorageError::InvalidEnvelope)?; + let mut temp_name = OsStr::new(".").to_os_string(); + temp_name.push(target_name); + temp_name.push(format!(".{}.cloudsync-v2.tmp", uuid::Uuid::new_v4())); + let temp = target_parent.join(temp_name); + + let result = (|| { + let mut file = OpenOptions::new() + .write(true) + .create_new(true) + .open(&temp)?; + file.write_all(&encoded)?; + file.flush()?; + flush_file_buffers(&file)?; + drop(file); + + replace_file(target, &temp, backup)?; + + let installed = read_bounded(target)?; + if installed != encoded { + return Err(WindowsSecretStorageError::ReplacementVerificationFailed); + } + decode_envelope(&installed)?; + Ok(()) + })(); + + if temp.exists() { + let _ = fs::remove_file(&temp); + } + result +} + +pub fn protect_current_user(plaintext: &[u8]) -> Result, WindowsSecretStorageError> { + if plaintext.is_empty() { + return Err(WindowsSecretStorageError::InvalidMasterKeyLength); + } + let input = input_blob(plaintext)?; + let mut output = empty_blob(); + let succeeded = unsafe { + CryptProtectData( + &input, + ptr::null(), + ptr::null(), + ptr::null(), + ptr::null(), + CRYPTPROTECT_UI_FORBIDDEN, + &mut output, + ) + }; + if succeeded == 0 { + return Err(WindowsSecretStorageError::Dpapi { + operation: "protect", + source: io::Error::last_os_error(), + }); + } + copy_and_free_blob(output) +} + +pub fn unprotect_current_user(protected: &[u8]) -> Result, WindowsSecretStorageError> { + if protected.is_empty() { + return Err(WindowsSecretStorageError::InvalidDpapiResult); + } + let input = input_blob(protected)?; + let mut output = empty_blob(); + let succeeded = unsafe { + CryptUnprotectData( + &input, + ptr::null_mut(), + ptr::null(), + ptr::null(), + ptr::null(), + CRYPTPROTECT_UI_FORBIDDEN, + &mut output, + ) + }; + if succeeded == 0 { + return Err(WindowsSecretStorageError::Dpapi { + operation: "unprotect", + source: io::Error::last_os_error(), + }); + } + copy_and_free_blob(output) +} + +fn input_blob(data: &[u8]) -> Result { + let len = u32::try_from(data.len()).map_err(|_| WindowsSecretStorageError::EnvelopeTooLarge)?; + Ok(CRYPT_INTEGER_BLOB { + cbData: len, + pbData: data.as_ptr().cast_mut(), + }) +} + +fn empty_blob() -> CRYPT_INTEGER_BLOB { + CRYPT_INTEGER_BLOB { + cbData: 0, + pbData: ptr::null_mut(), + } +} + +fn copy_and_free_blob(blob: CRYPT_INTEGER_BLOB) -> Result, WindowsSecretStorageError> { + if blob.cbData == 0 || blob.pbData.is_null() { + if !blob.pbData.is_null() { + unsafe { + LocalFree(blob.pbData.cast()); + } + } + return Err(WindowsSecretStorageError::InvalidDpapiResult); + } + + let bytes = unsafe { + std::slice::from_raw_parts(blob.pbData.cast_const(), blob.cbData as usize).to_vec() + }; + let allocation = blob.pbData.cast(); + let not_freed = unsafe { LocalFree(allocation) }; + if !not_freed.is_null() { + return Err(WindowsSecretStorageError::InvalidDpapiResult); + } + Ok(bytes) +} + +fn read_bounded(path: &Path) -> Result, WindowsSecretStorageError> { + let file = File::open(path)?; + let metadata = file.metadata()?; + if metadata.len() == 0 { + return Err(WindowsSecretStorageError::InvalidEnvelope); + } + if metadata.len() > MAX_ENVELOPE_BYTES { + return Err(WindowsSecretStorageError::EnvelopeTooLarge); + } + + let mut bytes = Vec::with_capacity(metadata.len() as usize); + file.take(MAX_ENVELOPE_BYTES + 1).read_to_end(&mut bytes)?; + if bytes.len() as u64 > MAX_ENVELOPE_BYTES { + return Err(WindowsSecretStorageError::EnvelopeTooLarge); + } + Ok(bytes) +} + +fn flush_file_buffers(file: &File) -> Result<(), WindowsSecretStorageError> { + let handle = file.as_raw_handle() as HANDLE; + let succeeded = unsafe { FlushFileBuffers(handle) }; + if succeeded == 0 { + return Err(WindowsSecretStorageError::Io(io::Error::last_os_error())); + } + Ok(()) +} + +fn replace_file( + target: &Path, + replacement: &Path, + backup: &Path, +) -> Result<(), WindowsSecretStorageError> { + let target = wide_null(target); + let replacement = wide_null(replacement); + let backup = wide_null(backup); + let succeeded = unsafe { + ReplaceFileW( + target.as_ptr(), + replacement.as_ptr(), + backup.as_ptr(), + 0, + ptr::null(), + ptr::null(), + ) + }; + if succeeded == 0 { + return Err(WindowsSecretStorageError::Io(io::Error::last_os_error())); + } + Ok(()) +} + +fn replace_file_without_backup( + target: &Path, + replacement: &Path, +) -> Result<(), WindowsSecretStorageError> { + let target = wide_null(target); + let replacement = wide_null(replacement); + let succeeded = unsafe { + ReplaceFileW( + target.as_ptr(), + replacement.as_ptr(), + ptr::null(), + 0, + ptr::null(), + ptr::null(), + ) + }; + if succeeded == 0 { + return Err(WindowsSecretStorageError::Io(io::Error::last_os_error())); + } + Ok(()) +} + +fn wide_null(path: &Path) -> Vec { + path.as_os_str().encode_wide().chain(Some(0)).collect() +} + +fn encode_cloud_sync_install_secret( + secret: &[u8; MASTER_KEY_LENGTH], +) -> Result, WindowsSecretStorageError> { + let envelope = CloudSyncInstallSecretEnvelope { + format_version: CLOUD_SYNC_INSTALL_SECRET_FORMAT_VERSION, + protected_secret: protect_current_user(secret)?.into(), + }; + let mut encoded = Vec::new(); + plist::to_writer_binary(&mut encoded, &envelope) + .map_err(|_| WindowsSecretStorageError::InvalidEnvelope)?; + if encoded.is_empty() || encoded.len() as u64 > MAX_ENVELOPE_BYTES { + return Err(WindowsSecretStorageError::EnvelopeTooLarge); + } + Ok(encoded) +} + +fn read_cloud_sync_install_secret_after_race( + path: &Path, +) -> Result<[u8; MASTER_KEY_LENGTH], WindowsSecretStorageError> { + for _ in 0..SECRET_OPEN_RETRY_ATTEMPTS { + match read_cloud_sync_install_secret(path) { + Ok(secret) => return Ok(secret), + Err(WindowsSecretStorageError::Io(error)) + if error.kind() == io::ErrorKind::NotFound || is_transient_share_error(&error) => + { + thread::sleep(SECRET_OPEN_RETRY_DELAY); + } + Err(error) => return Err(error), + } + } + Err(WindowsSecretStorageError::SecretInitializationRace) +} + +fn is_transient_share_error(error: &io::Error) -> bool { + error.kind() == io::ErrorKind::PermissionDenied || error.raw_os_error() == Some(32) +} + +#[cfg(test)] +mod tests { + use std::sync::{Arc, Barrier, RwLock}; + + use keystore::{ + software::{SoftwareEncryptor, SoftwareKeystore, SoftwareKeystoreState}, + KeyType, Keystore, KeystoreAccessRules, + }; + + use super::*; + + const LEGACY_KEY: [u8; 32] = *b"desktopisinsecureyoushouldn'tber"; + + fn legacy_state() -> SoftwareKeystoreState { + let store = SoftwareKeystore { + state: RwLock::new(SoftwareKeystoreState::default()), + update_state: Box::new(|_| {}), + encryptor: SoftwareEncryptor(LEGACY_KEY), + }; + store + .set_secret("test:secret", b"not written to diagnostics") + .expect("legacy test secret should be stored"); + store + .create_key( + "test:key", + KeyType::Aes(256), + KeystoreAccessRules::default(), + ) + .expect("legacy test key should be stored"); + + let SoftwareKeystore { state, .. } = store; + state + .into_inner() + .expect("test lock should not be poisoned") + } + + fn write_legacy(path: &Path, state: &SoftwareKeystoreState) { + let mut encoded = Vec::new(); + plist::to_writer_xml(&mut encoded, state).expect("legacy fixture should encode"); + fs::write(path, encoded).expect("legacy fixture should be written"); + } + + #[test] + fn dpapi_current_user_round_trip() { + let plaintext = b"cloud-sync-v2-current-user-test"; + let protected = protect_current_user(plaintext).expect("DPAPI protection should succeed"); + assert_ne!(protected, plaintext); + let recovered = + unprotect_current_user(&protected).expect("DPAPI unprotection should succeed"); + assert_eq!(recovered, plaintext); + } + + #[test] + fn dpapi_rejects_tampered_and_truncated_blobs() { + let mut protected = + protect_current_user(b"authenticated test value").expect("DPAPI should protect"); + let midpoint = protected.len() / 2; + protected[midpoint] ^= 0x80; + assert!(unprotect_current_user(&protected).is_err()); + + let protected = + protect_current_user(b"second authenticated value").expect("DPAPI should protect"); + assert!(unprotect_current_user(&protected[..protected.len() / 2]).is_err()); + } + + #[test] + fn synthetic_migration_rewraps_keys_and_secrets() { + let envelope = + migrate_legacy_state(&legacy_state(), LEGACY_KEY).expect("migration should succeed"); + assert_eq!(envelope.format_version(), WINDOWS_KEYSTORE_FORMAT_VERSION); + + let (state, encryptor) = envelope + .into_unlocked() + .expect("migrated envelope should unlock"); + let store = SoftwareKeystore { + state: RwLock::new(state), + update_state: Box::new(|_| {}), + encryptor, + }; + assert_eq!( + store + .get_secret("test:secret") + .expect("secret lookup should succeed") + .expect("secret should exist"), + b"not written to diagnostics" + ); + assert!(matches!( + store + .get_key_type("test:key") + .expect("key lookup should succeed"), + Some(KeyType::Aes(256)) + )); + } + + #[test] + fn envelope_rejects_tampering_and_truncation() { + let envelope = + migrate_legacy_state(&legacy_state(), LEGACY_KEY).expect("migration should succeed"); + let encoded = encode_envelope(&envelope).expect("encoding should succeed"); + assert!(decode_envelope(&encoded[..encoded.len() / 2]).is_err()); + + let mut decoded: WindowsProtectedKeystoreEnvelope = + plist::from_bytes(&encoded).expect("test envelope should decode"); + let mut protected = decoded.protected_master_key.as_ref().to_vec(); + let midpoint = protected.len() / 2; + protected[midpoint] ^= 0x40; + decoded.protected_master_key = protected.into(); + assert!(decoded.validate().is_err()); + } + + #[test] + fn atomic_replace_flushes_backs_up_and_reopens() { + let directory = tempfile::tempdir().expect("temporary directory should be created"); + let target = directory.path().join("keystore.plist"); + let backup = directory.path().join("keystore.plist.legacy-backup"); + let old_bytes = b"synthetic legacy file"; + fs::write(&target, old_bytes).expect("legacy fixture should be written"); + + let envelope = + migrate_legacy_state(&legacy_state(), LEGACY_KEY).expect("migration should succeed"); + replace_existing_envelope_atomic(&target, &backup, &envelope) + .expect("atomic replacement should succeed"); + + read_envelope(&target) + .expect("installed envelope should reopen") + .validate() + .expect("installed envelope should validate"); + assert_eq!( + fs::read(&backup).expect("backup should be readable"), + old_bytes + ); + } + + #[test] + fn atomic_replace_requires_existing_target_and_fresh_backup() { + let directory = tempfile::tempdir().expect("temporary directory should be created"); + let target = directory.path().join("keystore.plist"); + let backup = directory.path().join("keystore.plist.backup"); + let envelope = + migrate_legacy_state(&legacy_state(), LEGACY_KEY).expect("migration should succeed"); + + assert!(matches!( + replace_existing_envelope_atomic(&target, &backup, &envelope), + Err(WindowsSecretStorageError::MissingReplacementTarget) + )); + + fs::write(&target, b"old").expect("target fixture should be written"); + fs::write(&backup, b"preserve").expect("backup fixture should be written"); + assert!(matches!( + replace_existing_envelope_atomic(&target, &backup, &envelope), + Err(WindowsSecretStorageError::BackupAlreadyExists) + )); + assert_eq!( + fs::read(&backup).expect("backup should remain readable"), + b"preserve" + ); + } + + #[test] + fn new_profile_starts_protected_and_reopens_idempotently() { + let directory = tempfile::tempdir().expect("temporary directory should be created"); + let target = directory.path().join("keystore.plist"); + + let opened = open_windows_keystore(&target).expect("new profile should open"); + assert!(target.is_file()); + read_envelope(&target).expect("new profile must be protected"); + assert!(matches!( + open_windows_keystore(&target), + Err(WindowsSecretStorageError::ProfileLocked) + )); + drop(opened); + + let reopened = open_windows_keystore(&target).expect("protected profile should reopen"); + read_envelope(&target) + .expect("reopened profile should remain protected") + .validate() + .expect("reopened profile should validate"); + drop(reopened); + } + + #[test] + fn legacy_profile_migrates_once_and_preserves_recovery_backup() { + let directory = tempfile::tempdir().expect("temporary directory should be created"); + let target = directory.path().join("keystore.plist"); + let backup = directory + .path() + .join("keystore.plist.dpapi-v2-legacy-backup"); + let legacy = legacy_state(); + write_legacy(&target, &legacy); + let original = fs::read(&target).expect("legacy fixture should read"); + + let opened = open_windows_keystore(&target).expect("legacy profile should migrate"); + assert_eq!( + fs::read(&backup).expect("recovery backup should remain"), + original + ); + let store = SoftwareKeystore { + state: RwLock::new(opened.state), + update_state: Box::new(|_| {}), + encryptor: opened.encryptor, + }; + assert_eq!( + store + .get_secret("test:secret") + .expect("secret read should succeed") + .expect("secret should survive migration"), + b"not written to diagnostics" + ); + drop(store); + drop(opened.writer); + + let reopened = open_windows_keystore(&target).expect("repeat open should be idempotent"); + assert_eq!( + fs::read(&backup).expect("original backup should remain unchanged"), + original + ); + drop(reopened); + } + + #[test] + fn corrupt_truncated_and_recovery_only_profiles_fail_closed() { + let directory = tempfile::tempdir().expect("temporary directory should be created"); + let target = directory.path().join("keystore.plist"); + fs::write(&target, b"not a plist").expect("corrupt fixture should write"); + assert!(matches!( + open_windows_keystore(&target), + Err(WindowsSecretStorageError::InvalidEnvelope) + )); + assert_eq!( + fs::read(&target).expect("corrupt target must remain"), + b"not a plist" + ); + + fs::remove_file(&target).expect("corrupt fixture should remove"); + let backup = directory + .path() + .join("keystore.plist.dpapi-v2-legacy-backup"); + fs::write(&backup, b"recovery").expect("recovery fixture should write"); + assert!(matches!( + open_windows_keystore(&target), + Err(WindowsSecretStorageError::RecoveryBackupPresent) + )); + assert!(!target.exists()); + assert_eq!( + fs::read(&backup).expect("recovery backup must remain readable"), + b"recovery" + ); + } + + #[test] + fn startup_uses_valid_target_and_never_guesses_from_orphan_files() { + let directory = tempfile::tempdir().expect("temporary directory should be created"); + let target = directory.path().join("keystore.plist"); + let opened = open_windows_keystore(&target).expect("new profile should open"); + drop(opened); + let installed = fs::read(&target).expect("protected target should read"); + let orphan = directory.path().join(".keystore.plist.crash.dpapi-v2.tmp"); + fs::write(&orphan, b"partial replacement").expect("orphan fixture should write"); + let backup = directory + .path() + .join("keystore.plist.dpapi-v2-legacy-backup"); + fs::write(&backup, b"preserved old profile").expect("backup fixture should write"); + + let reopened = open_windows_keystore(&target) + .expect("valid installed target must remain authoritative"); + assert_eq!( + fs::read(&target).expect("target should remain readable"), + installed + ); + assert_eq!( + fs::read(&orphan).expect("orphan should be preserved for diagnosis"), + b"partial replacement" + ); + assert_eq!( + fs::read(&backup).expect("backup should remain preserved"), + b"preserved old profile" + ); + drop(reopened); + } + + #[test] + fn legacy_target_with_existing_backup_requires_explicit_recovery() { + let directory = tempfile::tempdir().expect("temporary directory should be created"); + let target = directory.path().join("keystore.plist"); + let backup = directory + .path() + .join("keystore.plist.dpapi-v2-legacy-backup"); + write_legacy(&target, &legacy_state()); + let original = fs::read(&target).expect("legacy fixture should read"); + fs::write(&backup, b"previous recovery").expect("backup fixture should write"); + + assert!(matches!( + open_windows_keystore(&target), + Err(WindowsSecretStorageError::BackupAlreadyExists) + )); + assert_eq!( + fs::read(&target).expect("legacy target must remain unchanged"), + original + ); + assert_eq!( + fs::read(&backup).expect("backup must remain unchanged"), + b"previous recovery" + ); + } + + #[test] + fn locked_writer_persists_updates_and_blocks_concurrent_open() { + let directory = tempfile::tempdir().expect("temporary directory should be created"); + let target = directory.path().join("keystore.plist"); + let opened = open_windows_keystore(&target).expect("new profile should open"); + let writer = opened.writer; + let store = SoftwareKeystore { + state: RwLock::new(opened.state), + update_state: Box::new(|_| {}), + encryptor: opened.encryptor, + }; + store + .set_secret("persisted:test", b"persisted value") + .expect("secret should be stored"); + let SoftwareKeystore { state, .. } = store; + let state = state + .into_inner() + .expect("state lock should not be poisoned"); + writer + .write_state(&state) + .expect("protected update should be atomic"); + assert!(matches!( + open_windows_keystore(&target), + Err(WindowsSecretStorageError::ProfileLocked) + )); + drop(writer); + + let reopened = open_windows_keystore(&target).expect("updated profile should reopen"); + let store = SoftwareKeystore { + state: RwLock::new(reopened.state), + update_state: Box::new(|_| {}), + encryptor: reopened.encryptor, + }; + assert_eq!( + store + .get_secret("persisted:test") + .expect("secret read should succeed") + .expect("persisted secret should exist"), + b"persisted value" + ); + drop(store); + drop(reopened.writer); + } + + #[test] + fn rejects_unknown_format_version() { + let mut envelope = + migrate_legacy_state(&legacy_state(), LEGACY_KEY).expect("migration should succeed"); + envelope.format_version = WINDOWS_KEYSTORE_FORMAT_VERSION + 1; + assert!(matches!( + envelope.validate(), + Err(WindowsSecretStorageError::UnsupportedFormatVersion(_)) + )); + } + + #[test] + fn concurrent_install_secret_openers_return_one_key() { + let directory = tempfile::tempdir().expect("temporary directory should be created"); + let path = directory.path().join("cloud-sync.install-secret"); + let barrier = Arc::new(Barrier::new(8)); + let mut threads = Vec::new(); + for _ in 0..8 { + let barrier = Arc::clone(&barrier); + let path = path.clone(); + threads.push(thread::spawn(move || { + barrier.wait(); + load_or_create_cloud_sync_install_secret(&path) + })); + } + + let mut results = threads.into_iter().map(|handle| { + handle + .join() + .expect("secret opener thread should not panic") + .expect("secret opener should succeed") + }); + let expected = results.next().expect("at least one result should exist"); + assert!(results.all(|secret| secret == expected)); + assert_eq!( + read_cloud_sync_install_secret(&path).expect("stored secret should reopen"), + expected + ); + } + + #[test] + fn install_secret_tampering_and_truncation_fail_closed() { + let tamper_directory = tempfile::tempdir().expect("temporary directory should be created"); + let tamper_path = tamper_directory.path().join("cloud-sync.install-secret"); + load_or_create_cloud_sync_install_secret(&tamper_path) + .expect("initial secret creation should succeed"); + let encoded = fs::read(&tamper_path).expect("secret envelope should be readable"); + let mut envelope: CloudSyncInstallSecretEnvelope = + plist::from_bytes(&encoded).expect("secret envelope should decode"); + let mut protected = envelope.protected_secret.as_ref().to_vec(); + let midpoint = protected.len() / 2; + protected[midpoint] ^= 0x20; + envelope.protected_secret = protected.into(); + let mut tampered = Vec::new(); + plist::to_writer_binary(&mut tampered, &envelope).expect("tampered fixture should encode"); + fs::write(&tamper_path, &tampered).expect("tampered fixture should be written"); + assert!(load_or_create_cloud_sync_install_secret(&tamper_path).is_err()); + assert_eq!( + fs::read(&tamper_path).expect("tampered file should remain"), + tampered + ); + + let truncate_directory = + tempfile::tempdir().expect("temporary directory should be created"); + let truncate_path = truncate_directory.path().join("cloud-sync.install-secret"); + load_or_create_cloud_sync_install_secret(&truncate_path) + .expect("initial secret creation should succeed"); + let encoded = fs::read(&truncate_path).expect("secret envelope should be readable"); + fs::write(&truncate_path, &encoded[..encoded.len() / 2]) + .expect("truncated fixture should be written"); + assert!(load_or_create_cloud_sync_install_secret(&truncate_path).is_err()); + assert_eq!( + fs::read(&truncate_path).expect("truncated file should remain"), + &encoded[..encoded.len() / 2] + ); + } +} diff --git a/rust/uniffi-bindgen.rs b/rust/uniffi-bindgen.rs index d96eac70f9..f6cff6cf1d 100644 --- a/rust/uniffi-bindgen.rs +++ b/rust/uniffi-bindgen.rs @@ -1,3 +1,3 @@ fn main() { uniffi::uniffi_bindgen_main() -} \ No newline at end of file +} diff --git a/rust_builder/cargokit/cmake/cargokit.cmake b/rust_builder/cargokit/cmake/cargokit.cmake index 88326005e9..8ea199ff24 100644 --- a/rust_builder/cargokit/cmake/cargokit.cmake +++ b/rust_builder/cargokit/cmake/cargokit.cmake @@ -25,7 +25,17 @@ function(apply_cargokit target manifest_dir lib_name any_symbol_name) set(CARGOKIT_OUTPUT_DIR "${CMAKE_CURRENT_BINARY_DIR}") set(OUTPUT_LIB "${CMAKE_CURRENT_BINARY_DIR}/${CARGOKIT_LIB_FULL_NAME}") endif() - set(CARGOKIT_TEMP_DIR "${CMAKE_CURRENT_BINARY_DIR}/cargokit_build") + if ( + DEFINED ENV{CARGOKIT_TARGET_TEMP_DIR_OVERRIDE} + AND NOT "$ENV{CARGOKIT_TARGET_TEMP_DIR_OVERRIDE}" STREQUAL "" + ) + set( + CARGOKIT_TEMP_DIR + "$ENV{CARGOKIT_TARGET_TEMP_DIR_OVERRIDE}/${CARGOKIT_LIB_NAME}" + ) + else() + set(CARGOKIT_TEMP_DIR "${CMAKE_CURRENT_BINARY_DIR}/cargokit_build") + endif() if (FLUTTER_TARGET_PLATFORM) set(CARGOKIT_TARGET_PLATFORM "${FLUTTER_TARGET_PLATFORM}") @@ -94,4 +104,4 @@ function(apply_cargokit target manifest_dir lib_name any_symbol_name) # Allow adding the output library to plugin bundled libraries set("${target}_cargokit_lib" ${OUTPUT_LIB} PARENT_SCOPE) -endfunction() \ No newline at end of file +endfunction() diff --git a/rust_builder/cargokit/gradle/plugin.gradle b/rust_builder/cargokit/gradle/plugin.gradle index 28636e9811..54e04d69f8 100644 --- a/rust_builder/cargokit/gradle/plugin.gradle +++ b/rust_builder/cargokit/gradle/plugin.gradle @@ -82,39 +82,71 @@ class CargoKitPlugin implements Plugin { static String file; - private Plugin findFlutterPlugin(Project rootProject) { - _findFlutterPlugin(rootProject.childProjects) + // Returns the Project that Flutter's Gradle plugin is applied to, not the + // plugin instance. + // + // CargoKit used to keep the plugin and reach through `plugin.project`. That + // worked against the Groovy plugin, where the field was reachable. Flutter + // 3.44.8's Kotlin rewrite declares `private var project: Project? = null` + // and dropped `getTargetPlatforms()` entirely, moving it to + // FlutterPluginUtils. Holding the plugin therefore buys nothing and every + // call through it throws once per variant. + private Project findFlutterProject(Project rootProject) { + _findFlutterProject(rootProject.childProjects) } - private Plugin _findFlutterPlugin(Map projects) { + private Project _findFlutterProject(Map projects) { for (project in projects) { for (plugin in project.value.getPlugins()) { - if (plugin.class.name == "FlutterPlugin") { - return plugin; + // Flutter's Groovy Gradle plugin lived in the default package. + // The Kotlin rewrite moved it to com.flutter.gradle, so match + // the class name itself rather than the fully qualified name. + // Getting this wrong silently skips the whole Rust build and + // ships a package with no native library in it. + def pluginClassName = plugin.class.name + if (pluginClassName == "FlutterPlugin" || + pluginClassName.endsWith(".FlutterPlugin")) { + return project.value; } } - def plugin = _findFlutterPlugin(project.value.childProjects); - if (plugin != null) { - return plugin; + def found = _findFlutterProject(project.value.childProjects); + if (found != null) { + return found; } } return null; } + // Mirrors FlutterPluginUtils.getTargetPlatforms, which is Kotlin-internal + // and not callable from Groovy. Flutter passes -Ptarget-platform on the + // command line; when it is absent this is the same default the Flutter + // plugin itself applies. + private static List flutterTargetPlatforms(Project flutterProject) { + if (flutterProject.hasProperty("target-platform")) { + return flutterProject + .property("target-platform") + .toString() + .split(",") + .collect { it.trim() } + .findAll { !it.isEmpty() } + } + return ["android-arm", "android-arm64", "android-x64"] + } + @Override void apply(Project project) { - def plugin = findFlutterPlugin(project.rootProject); + def flutterProject = findFlutterProject(project.rootProject); project.extensions.create("cargokit", CargoKitExtension) - if (plugin == null) { - print("Flutter plugin not found, CargoKit plugin will not be applied.") + if (flutterProject == null) { + println("Flutter plugin not found, CargoKit plugin will not be applied.") return; } def cargoBuildDir = "${project.buildDir}/build" - plugin.project.android.applicationVariants.all { variant -> + flutterProject.android.applicationVariants.all { variant -> final buildType = variant.buildType.name @@ -122,7 +154,7 @@ class CargoKitPlugin implements Plugin { def jniLibs = project.android.sourceSets.maybeCreate(buildType).jniLibs; jniLibs.srcDir(new File(cargoOutputDir)) - def platforms = plugin.getTargetPlatforms().collect() + def platforms = flutterTargetPlatforms(flutterProject).collect() // Same thing addFlutterDependencies does in flutter.gradle if (buildType == "debug") { @@ -139,7 +171,7 @@ class CargoKitPlugin implements Plugin { return } - if (plugin.project.android.ndkVersion == null) { + if (flutterProject.android.ndkVersion == null) { throw new GradleException("Please set 'android.ndkVersion' in 'app/build.gradle'.") } @@ -147,10 +179,10 @@ class CargoKitPlugin implements Plugin { buildMode = variant.buildType.name buildDir = cargoBuildDir outputDir = cargoOutputDir - ndkVersion = plugin.project.android.ndkVersion - sdkDirectory = plugin.project.android.sdkDirectory - minSdkVersion = plugin.project.android.defaultConfig.minSdkVersion.apiLevel as int - compileSdkVersion = plugin.project.android.compileSdkVersion.substring(8) as int + ndkVersion = flutterProject.android.ndkVersion + sdkDirectory = flutterProject.android.sdkDirectory + minSdkVersion = flutterProject.android.defaultConfig.minSdkVersion.apiLevel as int + compileSdkVersion = flutterProject.android.compileSdkVersion.substring(8) as int targetPlatforms = platforms pluginFile = CargoKitPlugin.file } diff --git a/rustpush b/rustpush index e5e76919ce..0fd6ce99b6 160000 --- a/rustpush +++ b/rustpush @@ -1 +1 @@ -Subproject commit e5e76919ceb9bf6e2fc05c8ad641430ffcfeb588 +Subproject commit 0fd6ce99b644f0adba568b5e530b2d2fc711b233 diff --git a/test/components/custom_text_editing_controllers_test.dart b/test/components/custom_text_editing_controllers_test.dart new file mode 100644 index 0000000000..33dbdeb1b3 --- /dev/null +++ b/test/components/custom_text_editing_controllers_test.dart @@ -0,0 +1,58 @@ +import 'package:bluebubbles/app/components/custom_text_editing_controllers.dart'; +import 'package:bluebubbles/database/global/message_part.dart'; +import 'package:flutter_test/flutter_test.dart'; + +void main() { + group('normalizeComposerAnnotationCoverage', () { + test('fills a transient gap without discarding valid formatting', () { + final annotations = [ + Annotation(range: [0, 3], bold: true), + Annotation(range: [5, 8], italic: true), + ]; + + normalizeComposerAnnotationCoverage(annotations, 10); + + expect(annotations.map((annotation) => annotation.range), [ + [0, 3], + [3, 5], + [5, 8], + [8, 10], + ]); + expect(annotations.first.bold, isTrue); + expect(annotations[2].italic, isTrue); + }); + + test('clips overlaps into a single complete partition', () { + final annotations = [ + Annotation(range: [-2, 4], bold: true), + Annotation(range: [2, 8], italic: true), + Annotation(range: [8, 20]), + ]; + + normalizeComposerAnnotationCoverage(annotations, 10); + + expect(annotations.map((annotation) => annotation.range), [ + [0, 4], + [4, 8], + [8, 10], + ]); + expect(annotations.first.bold, isTrue); + expect(annotations[1].italic, isTrue); + }); + + test('merges adjacent plain ranges and clears empty text', () { + final annotations = [ + Annotation(range: [0, 2]), + Annotation(range: [2, 4]), + ]; + + normalizeComposerAnnotationCoverage(annotations, 4); + expect(annotations.map((annotation) => annotation.range), [ + [0, 4], + ]); + + normalizeComposerAnnotationCoverage(annotations, 0); + expect(annotations, isEmpty); + }); + }); +} diff --git a/test/findmy_play_sound_test.dart b/test/findmy_play_sound_test.dart new file mode 100644 index 0000000000..5ceb8d6f36 --- /dev/null +++ b/test/findmy_play_sound_test.dart @@ -0,0 +1,80 @@ +import 'dart:async'; + +import 'package:bluebubbles/app/layouts/findmy/findmy_page.dart'; +import 'package:flutter_test/flutter_test.dart'; + +void main() { + group('Find My Play Sound eligibility', () { + test('allows Apple-account devices with a non-empty identifier', () { + expect( + canPlayFindMySound(deviceId: 'device-id', isCloudManaged: true), + isTrue, + ); + }); + + test('rejects missing and empty identifiers', () { + expect(canPlayFindMySound(deviceId: null, isCloudManaged: true), isFalse); + expect(canPlayFindMySound(deviceId: '', isCloudManaged: true), isFalse); + }); + + test('keeps beacon-backed accessories out of the cloud command', () { + expect( + canPlayFindMySound(deviceId: 'airtag-id', isCloudManaged: false), + isFalse, + ); + }); + + test('allows cloud-managed accessories such as AirPods', () { + expect( + canPlayFindMySound(deviceId: 'airpods-id', isCloudManaged: true), + isTrue, + ); + }); + + test('allows nearby accessory sound only on Android', () { + expect( + canPlayNearbyFindMySound(isAccessory: true, isAndroid: true), + isTrue, + ); + expect( + canPlayNearbyFindMySound(isAccessory: true, isAndroid: false), + isFalse, + ); + expect( + canPlayNearbyFindMySound(isAccessory: false, isAndroid: true), + isFalse, + ); + }); + + test('keeps the standalone nearby scan available without a cloud item', () { + expect(canScanNearbyFindMyTrackers(isAndroid: true), isTrue); + expect(canScanNearbyFindMyTrackers(isAndroid: false), isFalse); + }); + + test('shows exact signal strength when the Android scan provides RSSI', () { + expect( + nearbyTrackerSignalLabel({'signal': 'strong', 'rssi': -47}), + 'Strong signal (-47 dBm)', + ); + expect(nearbyTrackerSignalLabel({'signal': 'weak'}), 'Weak signal'); + }); + + test('explains an offline relay without exposing the bridge exception', () { + expect( + findMyCloudFailureMessage(Exception('Relay device offline!')), + 'Your relay device is offline. Cloud Find My will resume when it reconnects.', + ); + }); + + test('distinguishes cloud timeouts from other failures', () { + expect( + findMyCloudFailureMessage(TimeoutException('Future not completed')), + 'Cloud Find My timed out. Check the relay connection and try again.', + ); + expect( + findMyCloudFailureMessage(Exception('unexpected')), + 'Cloud Find My is unavailable right now.', + ); + }); + }); +} diff --git a/test/helpers/chat_messages_test.dart b/test/helpers/chat_messages_test.dart index c769fce9de..25dad3d8f0 100644 --- a/test/helpers/chat_messages_test.dart +++ b/test/helpers/chat_messages_test.dart @@ -34,6 +34,28 @@ void main() { expect(base.associatedMessages.single, same(reaction)); }); + test('replaces the cached reaction when an updated event is replayed', () { + final messages = ChatMessages(); + final base = Message(guid: 'base-updated-reaction', text: 'hello'); + final original = Message( + guid: 'reaction-update', + associatedMessageGuid: base.guid, + associatedMessageType: 'like', + ); + final updated = Message( + guid: original.guid, + associatedMessageGuid: base.guid, + associatedMessageType: '-like', + ); + + messages.addMessages([base, original]); + messages.addMessages([updated]); + + expect(base.associatedMessages, hasLength(1)); + expect(base.associatedMessages.single, same(updated)); + expect(base.associatedMessages.single.associatedMessageType, '-like'); + }); + test('includes the originator when it is loaded before its replies', () { final messages = ChatMessages(); final originator = Message(guid: 'thread-1', text: 'originator'); diff --git a/test/helpers/message_edit_history_test.dart b/test/helpers/message_edit_history_test.dart new file mode 100644 index 0000000000..e8c0c3f07e --- /dev/null +++ b/test/helpers/message_edit_history_test.dart @@ -0,0 +1,48 @@ +import 'package:bluebubbles/database/models.dart'; +import 'package:flutter_test/flutter_test.dart'; + +void main() { + test('buildMessageParts retains the original and prior edited versions', () { + final original = AttributedBody.raw('Original message'); + final firstEdit = AttributedBody.raw('First edit'); + final current = AttributedBody.raw('Current edit'); + final message = Message( + guid: 'edit-history-message', + text: current.string, + attributedBody: [current], + messageSummaryInfo: [ + MessageSummaryInfo( + retractedParts: [], + editedContent: { + '0': [ + EditedContent( + text: Content(values: [original]), + date: 1, + ), + EditedContent( + text: Content(values: [firstEdit]), + date: 2, + ), + EditedContent( + text: Content(values: [current]), + date: 3, + ), + ], + }, + originalTextRange: const {}, + editedParts: [0], + ), + ], + ); + + final parts = message.buildMessageParts(); + + expect(parts, hasLength(1)); + expect(parts.single.text, current.string); + expect(parts.single.isEdited, isTrue); + expect( + parts.single.edits.map((edit) => edit.text).toList(), + [original.string, firstEdit.string], + ); + }); +} diff --git a/test/helpers/message_widget_helpers_test.dart b/test/helpers/message_widget_helpers_test.dart index 0978b0db48..f93d3fcb58 100644 --- a/test/helpers/message_widget_helpers_test.dart +++ b/test/helpers/message_widget_helpers_test.dart @@ -1,5 +1,7 @@ import 'package:bluebubbles/helpers/ui/message_widget_helpers.dart'; +import 'package:bluebubbles/database/global/message_part.dart'; import 'package:flutter_test/flutter_test.dart'; +import 'package:tuple/tuple.dart'; void main() { group('safeMessageSubstring', () { @@ -20,4 +22,67 @@ void main() { expect(safeMessageSubstring('hello world', [6, 11]), 'world'); }); }); + + group('messageUrlMatches', () { + test('keeps characters after a literal plus in the clickable URL', () { + const url = 'https://example.com/path?query=alpha+beta&next=1'; + + final matches = messageUrlMatches('Open $url please'); + + expect(matches, hasLength(1)); + expect(matches.single.group(0), url); + }); + + test('keeps separate same-host URLs intact when both contain pluses', () { + const first = 'https://example.com/a?value=one+two'; + const second = 'https://example.com/b?value=three+four'; + + final matches = messageUrlMatches('$first and $second'); + + expect(matches.map((match) => match.group(0)), [first, second]); + }); + + test('keeps all standard URI sub-delimiters inside the link', () { + const url = + r"https://example.com/path!$&'()*+,;=value?q=one+two%2Bthree"; + + final matches = messageUrlMatches('Open $url please'); + + expect(matches, hasLength(1)); + expect(matches.single.group(0), url); + }); + + test('accepts modern top-level domains longer than six characters', () { + const url = 'https://example.technology/path'; + + final matches = messageUrlMatches(url); + + expect(matches, hasLength(1)); + expect(matches.single.group(0), url); + }); + + test('keeps the full URL clickable when ML Kit returns a shorter range', + () { + const url = 'https://example.com/path?query=alpha+beta&next=1'; + final plusIndex = url.indexOf('+'); + final annotations = [Annotation(range: [0, url.length])]; + + markEnrichedMessageRange( + annotations, const Tuple3('link', [0, url.length], null)); + markEnrichedMessageRange( + annotations, Tuple3('link', [0, plusIndex], null)); + annotations.sort((a, b) => a.range[0].compareTo(b.range[0])); + + expect(annotations.map((annotation) => annotation.range), [ + [0, plusIndex], + [plusIndex, url.length], + ]); + expect( + annotations.every( + (annotation) => annotation.renderExtras.first.item1 == 'link', + ), + isTrue, + ); + }); + }); } diff --git a/test/helpers/metadata_helper_test.dart b/test/helpers/metadata_helper_test.dart new file mode 100644 index 0000000000..a7e56eec0c --- /dev/null +++ b/test/helpers/metadata_helper_test.dart @@ -0,0 +1,22 @@ +import 'package:bluebubbles/database/models.dart'; +import 'package:bluebubbles/helpers/network/metadata_helper.dart'; +import 'package:flutter_test/flutter_test.dart'; + +void main() { + test('fetchMetadata fails closed when the message has no URL', () async { + final result = await MetadataHelper.fetchMetadata( + Message(guid: 'metadata-no-url', text: 'This is not a link'), + ); + + expect(result, isNull); + }); + + test('fetchMetadata does not treat a multi-link body as one URL', () async { + final result = await MetadataHelper.fetchMetadata( + Message(guid: 'metadata-multi-link-body'), + previewUrl: 'https://example.com/one https://example.com/two', + ); + + expect(result, isNull); + }); +} diff --git a/test/helpers/reaction_helpers_test.dart b/test/helpers/reaction_helpers_test.dart new file mode 100644 index 0000000000..02493d9402 --- /dev/null +++ b/test/helpers/reaction_helpers_test.dart @@ -0,0 +1,82 @@ +import 'package:bluebubbles/helpers/ui/reaction_helpers.dart'; +import 'package:bluebubbles/database/io/message.dart'; +import 'package:flutter_test/flutter_test.dart'; + +void main() { + group('ReactionTypes.fromAssociatedMessageType', () { + test('maps every applied reaction index', () { + final names = ReactionTypes.toList(); + for (var index = 0; index < names.length; index++) { + expect( + ReactionTypes.fromAssociatedMessageType(2000 + index), + names[index], + ); + } + }); + + test('maps every removed reaction index with a leading dash', () { + final names = ReactionTypes.toList(); + for (var index = 0; index < names.length; index++) { + expect( + ReactionTypes.fromAssociatedMessageType(3000 + index), + '-${names[index]}', + ); + } + }); + + test('returns null instead of throwing on an unknown type', () { + // Indexing ReactionTypes.toList() directly raised a RangeError for these, + // which aborted the CloudKit download of the whole message. + for (final associatedMessageType in [ + 2000 + 8, + 2999, + 3000 + 8, + 3999, + 0, + 1, + 1999, + 4000, + ]) { + expect( + ReactionTypes.fromAssociatedMessageType(associatedMessageType), + isNull, + reason: 'expected $associatedMessageType to have no reaction name', + ); + } + }); + + test('covers the full 2000-3999 range without throwing', () { + for (var type = 2000; type < 4000; type++) { + expect( + () => ReactionTypes.fromAssociatedMessageType(type), + returnsNormally, + reason: 'associatedMessageType $type threw', + ); + } + }); + }); + + group('getUniqueReactionMessages', () { + test('ignores legacy rows with an unknown reaction type', () { + final messages = [ + Message( + guid: 'unknown-reaction', + dateCreated: DateTime.utc(2026), + isFromMe: true, + ), + Message( + guid: 'known-reaction', + dateCreated: DateTime.utc(2026, 1, 2), + isFromMe: false, + handleId: 1, + associatedMessageType: ReactionTypes.LIKE, + ), + ]; + + expect( + getUniqueReactionMessages(messages).map((message) => message.guid), + ['known-reaction'], + ); + }); + }); +} diff --git a/test/helpers/ui_helpers_test.dart b/test/helpers/ui_helpers_test.dart new file mode 100644 index 0000000000..fc0985d1f7 --- /dev/null +++ b/test/helpers/ui_helpers_test.dart @@ -0,0 +1,73 @@ +import 'package:bluebubbles/helpers/ui/ui_helpers.dart'; +import 'package:flutter/material.dart'; +import 'package:flutter_test/flutter_test.dart'; +import 'package:get/get.dart'; + +void main() { + tearDown(() async { + if (Get.isSnackbarOpen) Get.closeAllSnackbars(); + Get.rootController.scaffoldMessengerKey.currentState?.clearSnackBars(); + await Future.delayed(Duration.zero); + }); + + testWidgets('shows a snackbar when resumed with a root overlay', ( + tester, + ) async { + final navigatorKey = GlobalKey(); + tester.binding.handleAppLifecycleStateChanged(AppLifecycleState.resumed); + await tester.pumpWidget( + GetMaterialApp( + navigatorKey: navigatorKey, + home: const Scaffold(body: SizedBox.shrink()), + ), + ); + await tester.pumpAndSettle(); + + expect(tester.binding.lifecycleState, AppLifecycleState.resumed); + expect(Get.key, same(navigatorKey)); + expect(Get.key.currentState?.overlay, isNotNull); + + showSnackbar('Visible title', 'Visible message', durationMs: 1000); + await tester.pump(); + + expect(find.text('Visible title'), findsOneWidget); + expect(find.text('Visible message'), findsOneWidget); + }); + + testWidgets('skips a snackbar while the app is backgrounded', (tester) async { + final navigatorKey = GlobalKey(); + await tester.pumpWidget( + GetMaterialApp( + navigatorKey: navigatorKey, + home: const Scaffold(body: SizedBox.shrink()), + ), + ); + await tester.pump(); + + for (final state in [ + AppLifecycleState.hidden, + AppLifecycleState.paused, + AppLifecycleState.detached, + ]) { + tester.binding.handleAppLifecycleStateChanged(state); + showSnackbar('Hidden title', 'Hidden message'); + await tester.pump(); + + expect(find.text('Hidden title'), findsNothing); + expect(find.text('Hidden message'), findsNothing); + expect(Get.isSnackbarOpen, isFalse); + } + }); + + testWidgets('skips a snackbar when the root overlay is unavailable', ( + tester, + ) async { + tester.binding.handleAppLifecycleStateChanged(AppLifecycleState.resumed); + showSnackbar('Unavailable title', 'Unavailable message'); + await tester.pump(); + + expect(find.text('Unavailable title'), findsNothing); + expect(find.text('Unavailable message'), findsNothing); + expect(Get.isSnackbarOpen, isFalse); + }); +} diff --git a/test/layouts/conversation_view/conversation_keyboard_policy_test.dart b/test/layouts/conversation_view/conversation_keyboard_policy_test.dart new file mode 100644 index 0000000000..cc4656f916 --- /dev/null +++ b/test/layouts/conversation_view/conversation_keyboard_policy_test.dart @@ -0,0 +1,28 @@ +import 'package:bluebubbles/app/layouts/conversation_view/pages/conversation_keyboard_policy.dart'; +import 'package:flutter_test/flutter_test.dart'; + +void main() { + test('an active inline edit owns transcript keyboard input', () { + expect( + shouldDismissKeyboardFromTranscript( + hasActiveMessageEdit: true, + keyboardOpen: true, + composerHasFocus: false, + subjectHasFocus: false, + ), + isFalse, + ); + }); + + test('the transcript still dismisses the regular composer keyboard', () { + expect( + shouldDismissKeyboardFromTranscript( + hasActiveMessageEdit: false, + keyboardOpen: true, + composerHasFocus: true, + subjectHasFocus: false, + ), + isTrue, + ); + }); +} diff --git a/test/layouts/conversation_view/message_edit_tap_surface_test.dart b/test/layouts/conversation_view/message_edit_tap_surface_test.dart new file mode 100644 index 0000000000..d11a93be97 --- /dev/null +++ b/test/layouts/conversation_view/message_edit_tap_surface_test.dart @@ -0,0 +1,91 @@ +import 'package:bluebubbles/app/layouts/conversation_view/widgets/message/message_edit_tap_surface.dart'; +import 'package:flutter/material.dart'; +import 'package:flutter_test/flutter_test.dart'; + +void main() { + testWidgets('empty edit-bubble space focuses the editor', (tester) async { + final focusNode = FocusNode(); + final textController = TextEditingController(text: 'Message to edit'); + addTearDown(focusNode.dispose); + addTearDown(textController.dispose); + + await tester.pumpWidget( + MaterialApp( + home: Scaffold( + body: Center( + child: SizedBox( + width: 240, + height: 120, + child: MessageEditTapSurface( + focusNode: focusNode, + child: Align( + alignment: Alignment.topLeft, + child: SizedBox( + width: 120, + height: 48, + child: TextField( + focusNode: focusNode, + controller: textController, + ), + ), + ), + ), + ), + ), + ), + ), + ); + + final surface = tester.getRect(find.byType(MessageEditTapSurface)); + await tester.tapAt(surface.bottomRight - const Offset(8, 8)); + await tester.pump(); + + expect(focusNode.hasFocus, isTrue); + }); + + testWidgets('tapping edit-bubble padding preserves an existing cursor', + (tester) async { + final focusNode = FocusNode(); + final textController = TextEditingController(text: 'Message to edit'); + addTearDown(focusNode.dispose); + addTearDown(textController.dispose); + + await tester.pumpWidget( + MaterialApp( + home: Scaffold( + body: Center( + child: SizedBox( + width: 240, + height: 120, + child: MessageEditTapSurface( + focusNode: focusNode, + child: Align( + alignment: Alignment.topLeft, + child: SizedBox( + width: 120, + height: 48, + child: TextField( + focusNode: focusNode, + controller: textController, + ), + ), + ), + ), + ), + ), + ), + ), + ); + + focusNode.requestFocus(); + textController.selection = const TextSelection.collapsed(offset: 4); + await tester.pump(); + + final surface = tester.getRect(find.byType(MessageEditTapSurface)); + await tester.tapAt(surface.bottomRight - const Offset(8, 8)); + await tester.pump(); + + expect(focusNode.hasFocus, isTrue); + expect(textController.selection, const TextSelection.collapsed(offset: 4)); + }); +} diff --git a/test/layouts/conversation_view/transcript_pagination_test.dart b/test/layouts/conversation_view/transcript_pagination_test.dart new file mode 100644 index 0000000000..df3150ca9d --- /dev/null +++ b/test/layouts/conversation_view/transcript_pagination_test.dart @@ -0,0 +1,84 @@ +import 'package:bluebubbles/app/layouts/conversation_view/pages/transcript_pagination.dart'; +import 'package:flutter_test/flutter_test.dart'; + +List applyInsertions( + List previous, + List> insertions, +) { + final rendered = List.from(previous); + for (final insertion in insertions) { + rendered.insert(insertion.index, insertion.item); + } + return rendered; +} + +void main() { + test( + 'older page items append at sorted indices without shifting the visible anchor', + () { + const previous = ['newest', 'anchor', 'loaded-boundary']; + const next = [ + 'newest', + 'anchor', + 'loaded-boundary', + 'older-1', + 'older-2', + ]; + + final insertions = transcriptInsertions( + previous: previous, + next: next, + identityOf: (item) => item, + ); + + expect(insertions.map((insertion) => insertion.index), [3, 4]); + expect( + insertions.map((insertion) => insertion.item), ['older-1', 'older-2']); + expect(applyInsertions(previous, insertions), next); + expect(next.indexOf('anchor'), previous.indexOf('anchor')); + }); + + test( + 'interleaved timestamps use authoritative indices and preserve message order', + () { + const previous = ['message-50', 'message-40', 'message-30']; + const next = [ + 'message-50', + 'message-45', + 'message-40', + 'message-30', + 'message-20', + ]; + + final insertions = transcriptInsertions( + previous: previous, + next: next, + identityOf: (item) => item, + ); + + expect(insertions.map((insertion) => insertion.index), [1, 4]); + expect(applyInsertions(previous, insertions), next); + }); + + test('an existing identity with refreshed data is not inserted twice', () { + const previous = [ + (id: 'message-2', revision: 1), + (id: 'message-1', revision: 1), + ]; + const next = [ + (id: 'message-2', revision: 2), + (id: 'message-1', revision: 1), + (id: 'message-0', revision: 1), + ]; + + final insertions = transcriptInsertions<({String id, int revision})>( + previous: previous, + next: next, + identityOf: (item) => item.id, + ); + + expect(insertions, hasLength(1)); + expect(insertions.single.index, 2); + expect(insertions.single.item.id, 'message-0'); + }); +} diff --git a/test/layouts/fullscreen_media/fullscreen_media_list_test.dart b/test/layouts/fullscreen_media/fullscreen_media_list_test.dart new file mode 100644 index 0000000000..0c5ed8f75b --- /dev/null +++ b/test/layouts/fullscreen_media/fullscreen_media_list_test.dart @@ -0,0 +1,51 @@ +import 'package:bluebubbles/app/layouts/fullscreen_media/fullscreen_media_list.dart'; +import 'package:bluebubbles/database/models.dart'; +import 'package:flutter_test/flutter_test.dart'; + +Attachment attachment(String guid, String? mimeType) => Attachment( + guid: guid, + mimeType: mimeType, + transferName: '$guid.dat', + totalBytes: 1, + ); + +void main() { + test('keeps ordered media, removes duplicate GUIDs, and filters documents', () { + final image = attachment('image', 'image/jpeg'); + final video = attachment('video', 'video/mp4'); + final document = attachment('document', 'application/pdf'); + + final result = buildFullscreenMediaList( + [image, document, image, video], + image, + ); + + expect(result.map((item) => item.guid), ['image', 'video']); + }); + + test('adds the selected media when it is outside the loaded candidates', () { + final loaded = attachment('loaded', 'image/jpeg'); + final selected = attachment('selected', 'image/png'); + + final result = buildFullscreenMediaList([loaded], selected); + + expect(result.map((item) => item.guid), ['loaded', 'selected']); + }); + + test('retains a selected attachment whose MIME type is not hydrated yet', () { + final selected = attachment('selected', null); + + final result = buildFullscreenMediaList(const [], selected); + + expect(result, [selected]); + }); + + test('does not confuse different attachments with missing GUIDs', () { + final loaded = attachment('loaded', 'image/jpeg')..guid = null; + final selected = attachment('selected', null)..guid = null; + + final result = buildFullscreenMediaList([loaded], selected); + + expect(result, [loaded, selected]); + }); +} diff --git a/test/layouts/fullscreen_media/fullscreen_media_operation_gate_test.dart b/test/layouts/fullscreen_media/fullscreen_media_operation_gate_test.dart new file mode 100644 index 0000000000..dbc437b79b --- /dev/null +++ b/test/layouts/fullscreen_media/fullscreen_media_operation_gate_test.dart @@ -0,0 +1,60 @@ +import 'dart:async'; + +import 'package:bluebubbles/app/layouts/fullscreen_media/fullscreen_media_operation_gate.dart'; +import 'package:flutter_test/flutter_test.dart'; + +void main() { + test('an older image load cannot overwrite a newer generation', () async { + final gate = FullscreenMediaOperationGate(); + final older = Completer(); + final newer = Completer(); + String? visibleValue; + + Future applyWhenCurrent(Future result, int generation) async { + final value = await result; + if (gate.isCurrent(generation)) { + visibleValue = value; + } + } + + final olderResult = applyWhenCurrent(older.future, gate.begin()); + final newerResult = applyWhenCurrent(newer.future, gate.begin()); + + newer.complete('newer'); + await newerResult; + older.complete('older'); + await olderResult; + + expect(visibleValue, 'newer'); + }); + + test('navigation prevents an off-page download from rebuilding visible state', () async { + final gate = FullscreenMediaOperationGate(); + final completion = Completer(); + var visiblePage = 'first'; + var rebuilds = 0; + final generation = gate.begin(); + + final pending = completion.future.then((_) { + if (gate.isCurrent(generation) && visiblePage == 'first') { + rebuilds++; + } + }); + + visiblePage = 'second'; + completion.complete(); + await pending; + + expect(rebuilds, 0); + }); + + test('dispose rejects late completions and future generations', () { + final gate = FullscreenMediaOperationGate(); + final activeGeneration = gate.begin(); + + gate.dispose(); + + expect(gate.isCurrent(activeGeneration), isFalse); + expect(gate.isCurrent(gate.begin()), isFalse); + }); +} diff --git a/test/layouts/fullscreen_media/fullscreen_video_page_swipe_test.dart b/test/layouts/fullscreen_media/fullscreen_video_page_swipe_test.dart new file mode 100644 index 0000000000..f09795d1d3 --- /dev/null +++ b/test/layouts/fullscreen_media/fullscreen_video_page_swipe_test.dart @@ -0,0 +1,181 @@ +import 'package:bluebubbles/app/layouts/fullscreen_media/fullscreen_video_page_swipe.dart'; +import 'package:flutter/material.dart'; +import 'package:flutter_test/flutter_test.dart'; + +Widget harness({ + required ValueChanged onPageSwipe, + ValueChanged? onChildDrag, +}) { + return MaterialApp( + home: Scaffold( + body: Center( + child: SizedBox( + key: const Key('surface'), + width: 320, + height: 500, + child: FullscreenVideoPageSwipeSurface( + onPageSwipe: onPageSwipe, + child: GestureDetector( + behavior: HitTestBehavior.opaque, + onHorizontalDragUpdate: onChildDrag ?? (_) {}, + child: const ColoredBox(color: Colors.black), + ), + ), + ), + ), + ), + ); +} + +void main() { + test('maps physical swipes through the configured PageView direction', () { + expect( + fullscreenVideoPageDelta( + FullscreenVideoPageSwipeDirection.left, + reverse: false, + ), + 1, + ); + expect( + fullscreenVideoPageDelta( + FullscreenVideoPageSwipeDirection.right, + reverse: false, + ), + -1, + ); + expect( + fullscreenVideoPageDelta( + FullscreenVideoPageSwipeDirection.left, + reverse: true, + ), + -1, + ); + expect( + fullscreenVideoPageDelta( + FullscreenVideoPageSwipeDirection.right, + reverse: true, + ), + 1, + ); + }); + + testWidgets( + 'reports a page swipe even when video controls own horizontal drag', + (tester) async { + final swipes = []; + var childDragUpdates = 0; + await tester.pumpWidget( + harness( + onPageSwipe: swipes.add, + onChildDrag: (_) => childDragUpdates++, + ), + ); + + final rect = tester.getRect(find.byKey(const Key('surface'))); + await tester.dragFrom( + Offset(rect.right - 30, rect.center.dy), + const Offset(-180, 0), + ); + await tester.pump(); + + expect(swipes, [FullscreenVideoPageSwipeDirection.left]); + expect(childDragUpdates, greaterThan(0)); + }); + + testWidgets('keeps the bottom transport and seek controls exclusive', + (tester) async { + final swipes = []; + var childDragUpdates = 0; + await tester.pumpWidget( + harness( + onPageSwipe: swipes.add, + onChildDrag: (_) => childDragUpdates++, + ), + ); + + final rect = tester.getRect(find.byKey(const Key('surface'))); + await tester.dragFrom( + Offset(rect.right - 30, rect.bottom - 20), + const Offset(-180, 0), + ); + await tester.pump(); + + expect(swipes, isEmpty); + expect(childDragUpdates, greaterThan(0)); + }); + + testWidgets('exclusive video paging advances exactly one media item', + (tester) async { + final controller = PageController(); + await tester.pumpWidget( + MaterialApp( + home: Scaffold( + body: PageView( + controller: controller, + physics: const NeverScrollableScrollPhysics(), + children: [ + FullscreenVideoPageSwipeSurface( + onPageSwipe: (_) { + controller.animateToPage( + 1, + duration: const Duration(milliseconds: 260), + curve: Curves.easeOutCubic, + ); + }, + child: const ColoredBox( + key: Key('video-page'), + color: Colors.black, + ), + ), + const ColoredBox(key: Key('next-page'), color: Colors.blue), + const ColoredBox(key: Key('skipped-page'), color: Colors.red), + ], + ), + ), + ), + ); + + final rect = tester.getRect(find.byKey(const Key('video-page'))); + await tester.dragFrom( + Offset(rect.right - 30, rect.center.dy), + const Offset(-180, 0), + ); + await tester.pumpAndSettle(); + + expect(controller.page, 1); + + await tester.pumpWidget(const SizedBox.shrink()); + controller.dispose(); + }); + + testWidgets('does not turn a vertical controls gesture into paging', + (tester) async { + final swipes = []; + await tester.pumpWidget(harness(onPageSwipe: swipes.add)); + + final rect = tester.getRect(find.byKey(const Key('surface'))); + await tester.dragFrom( + Offset(rect.center.dx, rect.center.dy - 80), + const Offset(20, 180), + ); + await tester.pump(); + + expect(swipes, isEmpty); + }); + + testWidgets('canceled pointer sequences cannot page after disposal', + (tester) async { + final swipes = []; + await tester.pumpWidget(harness(onPageSwipe: swipes.add)); + + final rect = tester.getRect(find.byKey(const Key('surface'))); + final gesture = + await tester.startGesture(Offset(rect.right - 30, rect.center.dy)); + await gesture.moveBy(const Offset(-180, 0)); + await gesture.cancel(); + await tester.pumpWidget(const SizedBox.shrink()); + await tester.pump(); + + expect(swipes, isEmpty); + }); +} diff --git a/test/services/action_handler_message_refresh_test.dart b/test/services/action_handler_message_refresh_test.dart new file mode 100644 index 0000000000..01f88733f4 --- /dev/null +++ b/test/services/action_handler_message_refresh_test.dart @@ -0,0 +1,62 @@ +import 'package:bluebubbles/database/models.dart'; +import 'package:bluebubbles/services/backend/action_handler.dart'; +import 'package:bluebubbles/services/ui/message/messages_service.dart'; +import 'package:flutter_test/flutter_test.dart'; +import 'package:get/get.dart'; + +void main() { + const chatGuid = 'iMessage;-;edit-refresh-test'; + + tearDown(() { + Get.reset(); + }); + + test('refreshActiveMessage replaces a loaded text-only edit', () { + final service = MessagesService(chatGuid); + final original = Message( + guid: 'edit-refresh-message', + text: 'Before edit', + isFromMe: true, + dateCreated: DateTime.utc(2026, 8, 1), + ); + final edited = Message( + guid: original.guid, + text: 'After edit', + isFromMe: true, + dateCreated: original.dateCreated, + dateEdited: DateTime.utc(2026, 8, 1, 0, 1), + ); + Message? renderedMessage; + + service.struct.addMessages([original]); + service.updateFunc = (message, {oldGuid}) { + renderedMessage = message; + }; + Get.put(service, tag: chatGuid); + + ActionHandler().refreshActiveMessage( + Chat(guid: chatGuid), + edited, + ); + + expect(renderedMessage, isNotNull); + expect(renderedMessage!.text, 'After edit'); + expect(service.struct.getMessage(original.guid!)!.text, 'After edit'); + }); + + test('refreshActiveMessage is a no-op when the conversation is not loaded', + () { + expect( + () => ActionHandler().refreshActiveMessage( + Chat(guid: chatGuid), + Message( + guid: 'not-loaded-message', + text: 'Edited text', + isFromMe: true, + ), + ), + returnsNormally, + ); + expect(Get.isRegistered(tag: chatGuid), isFalse); + }); +} diff --git a/test/services/apple_network_health_test.dart b/test/services/apple_network_health_test.dart new file mode 100644 index 0000000000..7eea5291eb --- /dev/null +++ b/test/services/apple_network_health_test.dart @@ -0,0 +1,37 @@ +import 'package:bluebubbles/services/rustpush/apple_network_health.dart'; +import 'package:flutter_test/flutter_test.dart'; + +void main() { + test('distinguishes normal and HTTPS fallback APNs transports', () { + expect( + classifyAppleNetworkHealth('connected', 5223), + AppleNetworkHealth.connected, + ); + expect( + classifyAppleNetworkHealth('connected', 443), + AppleNetworkHealth.fallback, + ); + }); + + test('maps failed and closed transports to a blocked-network warning', () { + expect( + classifyAppleNetworkHealth('blocked', null), + AppleNetworkHealth.blocked, + ); + expect( + classifyAppleNetworkHealth('closed', null), + AppleNetworkHealth.blocked, + ); + }); + + test('keeps reconnecting distinct from a confirmed block', () { + expect( + classifyAppleNetworkHealth('reconnecting', null), + AppleNetworkHealth.reconnecting, + ); + expect( + classifyAppleNetworkHealth('unexpected', null), + AppleNetworkHealth.unknown, + ); + }); +} diff --git a/test/services/cloud_message_upload_state_test.dart b/test/services/cloud_message_upload_state_test.dart new file mode 100644 index 0000000000..10c530af72 --- /dev/null +++ b/test/services/cloud_message_upload_state_test.dart @@ -0,0 +1,90 @@ +import 'dart:async'; + +import 'package:bluebubbles/services/rustpush/cloud_message_upload_state.dart'; +import 'package:flutter_test/flutter_test.dart'; + +void main() { + test('serializes desktop sync and manual attachment operations', () async { + final coordinator = CloudKitOperationCoordinator(); + final firstStarted = Completer(); + final releaseFirst = Completer(); + final events = []; + + final first = coordinator.run(() async { + events.add('first-start'); + firstStarted.complete(); + await releaseFirst.future; + events.add('first-end'); + }); + await firstStarted.future; + + final second = coordinator.run(() async { + events.add('second-start'); + }); + await Future.delayed(Duration.zero); + + expect(events, ['first-start']); + + releaseFirst.complete(); + await Future.wait([first, second]); + + expect(events, ['first-start', 'first-end', 'second-start']); + }); + + test('only explicit CloudKit successes are confirmed', () { + final result = CloudMessageSaveOutcome.fromResponse( + attemptedRecordIds: const ['saved', 'failed'], + response: const { + 'saved': true, + 'failed': false, + }, + ); + + expect(result.confirmedRecordIds, {'saved'}); + expect(result.retryableRecordIds, {'failed'}); + }); + + test('missing and unrelated response records never suppress retries', () { + final result = CloudMessageSaveOutcome.fromResponse( + attemptedRecordIds: const ['saved', 'missing'], + response: const { + 'saved': true, + 'unrelated': true, + }, + ); + + expect(result.confirmedRecordIds, {'saved'}); + expect(result.retryableRecordIds, {'missing'}); + }); + + test('failed attachment records keep their owning messages retryable', () { + final result = CloudAttachmentSaveOutcome.fromResponse( + attemptedRecordIds: const ['saved-attachment', 'failed-attachment'], + response: const { + 'saved-attachment': true, + 'failed-attachment': false, + }, + messageRecordIdByAttachmentRecordId: const { + 'saved-attachment': 'saved-message', + 'failed-attachment': 'retry-message', + }, + ); + + expect(result.confirmedRecordIds, {'saved-attachment'}); + expect(result.retryableRecordIds, {'failed-attachment'}); + expect(result.retryableMessageRecordIds, {'retry-message'}); + }); + + test('missing attachment results are retryable without inventing an owner', () { + final result = CloudAttachmentSaveOutcome.fromResponse( + attemptedRecordIds: const ['owned', 'chat-photo'], + response: const {}, + messageRecordIdByAttachmentRecordId: const { + 'owned': 'message', + }, + ); + + expect(result.retryableRecordIds, {'owned', 'chat-photo'}); + expect(result.retryableMessageRecordIds, {'message'}); + }); +} diff --git a/test/services/cloud_sync/cloud_associated_message_parent_reference_test.dart b/test/services/cloud_sync/cloud_associated_message_parent_reference_test.dart new file mode 100644 index 0000000000..e331533cbd --- /dev/null +++ b/test/services/cloud_sync/cloud_associated_message_parent_reference_test.dart @@ -0,0 +1,140 @@ +import 'package:bluebubbles/services/rustpush/cloud_sync/cloud_sync.dart'; +import 'package:flutter_test/flutter_test.dart'; + +void main() { + test('normalizes an exact parent reference to local GUID and numeric part', () { + final reference = CloudAssociatedMessageParentReference.parse( + 'p:3/ABCDEF12-3456-7890-ABCD-EF1234567890', + ); + + expect(reference.part, 3); + expect(reference.localMessageGuid, 'ABCDEF12-3456-7890-ABCD-EF1234567890'); + }); + + test('accepts the bubble/tapback bp: spelling', () { + // The app's own JSON ingestion path strips `bp:`, so it is a real shape. + // Rejecting it dropped the association entirely. + final reference = CloudAssociatedMessageParentReference.parse( + 'bp:2/ABCDEF12-3456-7890-ABCD-EF1234567890', + ); + + expect(reference.part, 2); + expect(reference.localMessageGuid, 'ABCDEF12-3456-7890-ABCD-EF1234567890'); + }); + + test('accepts a bare GUID as the partless form', () { + // Apple drops the wrapper when a reaction targets no particular part. + // Requiring the prefix quarantined every partless reaction. + final reference = CloudAssociatedMessageParentReference.parse( + 'ABCDEF12-3456-7890-ABCD-EF1234567890', + ); + + expect(reference.part, isNull); + expect(reference.localMessageGuid, 'ABCDEF12-3456-7890-ABCD-EF1234567890'); + }); + + test('rejects an empty reference', () { + expect( + () => CloudAssociatedMessageParentReference.parse(''), + throwsA(isA()), + ); + }); + + test('rejects a non-canonical part spelling', () { + // The native parser rejects leading zeros. Accepting them here made the + // same wire value convert on one side of the bridge and quarantine on the + // other. + for (final value in [ + 'p:0003/message-guid', + 'p:00/message-guid', + 'p:01/message-guid', + ]) { + expectInvalid(value); + } + }); + + test('rejects wrappers and structured values that are not bare GUIDs', () { + for (final value in [ + 'bpdi:0/message-guid', + '0/message-guid', + 'P:0/message-guid', + 'r:0:message-guid', + 'message-guid/extra', + 'message-guid:extra', + ]) { + expectInvalid(value); + } + }); + + test('rejects missing negative and non-numeric parts', () { + for (final value in [ + 'p:/message-guid', + 'p:-1/message-guid', + 'p:+1/message-guid', + 'p:1.0/message-guid', + 'p:one/message-guid', + 'p:0message-guid', + ]) { + expectInvalid(value); + } + }); + + test('rejects empty unsafe oversized and extra-separator GUIDs', () { + for (final value in [ + 'p:0/', + 'p:0/message/guid', + 'p:0/message-guid\nsecret', + 'p:0/message-guid\u0000secret', + 'p:0/message-guid\u007fsecret', + 'p:0/ leading-space', + 'p:0/trailing-space ', + 'p:0/${'g' * (CloudAssociatedMessageParentReference.maximumGuidCodeUnits + 1)}', + ]) { + expectInvalid(value); + } + }); + + test('toString and parse errors never reveal the input', () { + const secret = 'SECRET-PARENT-GUID'; + final valid = CloudAssociatedMessageParentReference.parse('p:7/$secret'); + + expect(valid.toString(), contains('redacted')); + expect(valid.toString(), isNot(contains(secret))); + expect(valid.toString(), isNot(contains('7'))); + + Object? caught; + try { + CloudAssociatedMessageParentReference.parse('bpdi:7/$secret'); + } catch (error) { + caught = error; + } + expect(caught, isA()); + expect(caught.toString(), isNot(contains(secret))); + expect(caught.toString(), isNot(contains('bpdi'))); + expect( + caught.toString(), + contains(CloudAssociatedMessageParentReferenceFormatException.safeCode), + ); + + final formatError = caught as FormatException; + expect(formatError.source, isNull); + expect(formatError.offset, isNull); + expect(formatError.message, isNot(contains(secret))); + }); +} + +void expectInvalid(String value) { + Object? caught; + try { + CloudAssociatedMessageParentReference.parse(value); + } catch (error) { + caught = error; + } + + expect( + caught, + isA(), + reason: 'Rejected inputs must use the redacted parser error', + ); + expect(caught.toString(), isNot(contains(value))); +} diff --git a/test/services/cloud_sync/cloud_association_import_test.dart b/test/services/cloud_sync/cloud_association_import_test.dart new file mode 100644 index 0000000000..093c5b98a4 --- /dev/null +++ b/test/services/cloud_sync/cloud_association_import_test.dart @@ -0,0 +1,99 @@ +import 'package:bluebubbles/database/io/message.dart'; +import 'package:flutter_test/flutter_test.dart'; + +void main() { + const parentGuid = 'ABCDEF12-3456-7890-ABCD-EF1234567890'; + + test('ordinary messages have no association', () { + expect( + parseCloudAssociation( + associatedMessageType: null, + associatedMessageGuid: null, + ), + isNull, + ); + }); + + test('known reactions retain their normalized parent and part', () { + final association = parseCloudAssociation( + associatedMessageType: 2001, + associatedMessageGuid: 'p:3/$parentGuid', + ); + + expect(association!.type, 'like'); + expect(association.parent.localMessageGuid, parentGuid); + expect(association.parent.part, 3); + }); + + test('sticker associations are accepted', () { + final association = parseCloudAssociation( + associatedMessageType: 2, + associatedMessageGuid: parentGuid, + ); + + expect(association!.type, 'sticker'); + expect(association.parent.localMessageGuid, parentGuid); + expect(association.parent.part, isNull); + }); + + test('unknown association types fail closed without a RangeError', () { + expect( + () => parseCloudAssociation( + associatedMessageType: 2008, + associatedMessageGuid: 'p:0/$parentGuid', + ), + throwsA( + isA().having( + (error) => error.failure, + 'failure', + CloudAssociationImportFailure.unknownType, + ), + ), + ); + }); + + test('known associations require a valid parent', () { + expect( + () => parseCloudAssociation( + associatedMessageType: 2000, + associatedMessageGuid: null, + ), + throwsA( + isA().having( + (error) => error.failure, + 'failure', + CloudAssociationImportFailure.missingParent, + ), + ), + ); + + expect( + () => parseCloudAssociation( + associatedMessageType: 2000, + associatedMessageGuid: 'bpdi:0/$parentGuid', + ), + throwsA( + isA().having( + (error) => error.failure, + 'failure', + CloudAssociationImportFailure.malformedParent, + ), + ), + ); + }); + + test('association failures never include the parent GUID', () { + Object? caught; + try { + parseCloudAssociation( + associatedMessageType: 2000, + associatedMessageGuid: 'bpdi:0/$parentGuid', + ); + } catch (error) { + caught = error; + } + + expect(caught, isA()); + expect(caught.toString(), isNot(contains(parentGuid))); + }); +} diff --git a/test/services/cloud_sync/cloud_attachment_materialization_store_test.dart b/test/services/cloud_sync/cloud_attachment_materialization_store_test.dart new file mode 100644 index 0000000000..db3ac1ee1f --- /dev/null +++ b/test/services/cloud_sync/cloud_attachment_materialization_store_test.dart @@ -0,0 +1,143 @@ +import 'dart:io'; + +import 'package:bluebubbles/database/models.dart'; +import 'package:bluebubbles/services/rustpush/cloud_sync/cloud_attachment_materialization.dart'; +import 'package:bluebubbles/services/rustpush/cloud_sync/cloud_attachment_materialization_store.dart'; +import 'package:bluebubbles/services/rustpush/cloud_sync/cloud_sync_models.dart'; +import 'package:flutter_test/flutter_test.dart'; + +import 'cloud_sync_test_helpers.dart'; + +void main() { + final scope = CloudSyncScope( + accountFingerprint: testAccountFingerprintA, + container: 'com.apple.messages.cloud', + database: 'private', + zone: 'attachmentManateeZone', + ); + final now = DateTime.utc(2026, 8, 1); + late Directory directory; + late Store objectBox; + late ObjectBoxCloudAttachmentMaterializationStore store; + + CloudAttachmentMaterialization metadata() => + CloudAttachmentMaterialization.metadata( + scope: scope, + generation: 3, + logicalEntityKeyHash: 'attachment-key-hash', + expectedBytes: 10, + expectedIntegrityTagHash: 'integrity-tag-hash', + updatedAt: now, + ); + + setUp(() async { + directory = await Directory.systemTemp.createTemp( + 'openbubbles-cloud-attachment-state-', + ); + objectBox = await openStore(directory: directory.path); + store = ObjectBoxCloudAttachmentMaterializationStore(store: objectBox); + }); + + tearDown(() async { + objectBox.close(); + if (directory.existsSync()) await directory.delete(recursive: true); + }); + + test('persists protected state and restores it after reopen', () async { + final initial = metadata(); + expect(await store.create(initial), isTrue); + final streaming = initial.beginStreaming( + activeGeneration: 3, + protectedTempReference: 'protected-temp', + protectedResumeManifestReference: 'protected-manifest', + now: now.add(const Duration(seconds: 1)), + ); + expect( + await store.compareAndSwap(expected: initial, next: streaming), + isTrue, + ); + + objectBox.close(); + objectBox = await openStore(directory: directory.path); + store = ObjectBoxCloudAttachmentMaterializationStore(store: objectBox); + final restored = await store.read( + scope: scope, + generation: 3, + logicalEntityKeyHash: 'attachment-key-hash', + ); + + expect(restored!.stage, CloudAttachmentMaterializationStage.tempStreaming); + expect(restored.protectedTempReference, 'protected-temp'); + }); + + test( + 'stale compare-and-swap cannot overwrite a newer verified boundary', + () async { + final initial = metadata(); + await store.create(initial); + final streaming = initial.beginStreaming( + activeGeneration: 3, + protectedTempReference: 'protected-temp', + protectedResumeManifestReference: 'protected-manifest-0', + now: now.add(const Duration(seconds: 1)), + ); + await store.compareAndSwap(expected: initial, next: streaming); + final advanced = streaming.recordVerifiedBoundary( + activeGeneration: 3, + cumulativeVerifiedBytes: 5, + protectedResumeManifestReference: 'protected-manifest-1', + now: now.add(const Duration(seconds: 2)), + ); + expect( + await store.compareAndSwap(expected: streaming, next: advanced), + isTrue, + ); + + final staleAdvance = streaming.recordVerifiedBoundary( + activeGeneration: 3, + cumulativeVerifiedBytes: 4, + protectedResumeManifestReference: 'stale-manifest', + now: now.add(const Duration(seconds: 3)), + ); + expect( + await store.compareAndSwap(expected: streaming, next: staleAdvance), + isFalse, + ); + expect( + (await store.read( + scope: scope, + generation: 3, + logicalEntityKeyHash: 'attachment-key-hash', + ))!.verifiedBytes, + 5, + ); + }, + ); + + test('account scope and generation cannot bleed', () async { + await store.create(metadata()); + final other = CloudSyncScope( + accountFingerprint: testAccountFingerprintB, + container: 'com.apple.messages.cloud', + database: 'private', + zone: 'attachmentManateeZone', + ); + + expect( + await store.read( + scope: other, + generation: 3, + logicalEntityKeyHash: 'attachment-key-hash', + ), + isNull, + ); + expect( + await store.read( + scope: scope, + generation: 4, + logicalEntityKeyHash: 'attachment-key-hash', + ), + isNull, + ); + }); +} diff --git a/test/services/cloud_sync/cloud_attachment_materialization_test.dart b/test/services/cloud_sync/cloud_attachment_materialization_test.dart new file mode 100644 index 0000000000..5efa4b9603 --- /dev/null +++ b/test/services/cloud_sync/cloud_attachment_materialization_test.dart @@ -0,0 +1,230 @@ +import 'package:bluebubbles/services/rustpush/cloud_sync/cloud_attachment_materialization.dart'; +import 'package:bluebubbles/services/rustpush/cloud_sync/cloud_sync_models.dart'; +import 'package:flutter_test/flutter_test.dart'; + +import 'cloud_sync_test_helpers.dart'; + +void main() { + final scope = CloudSyncScope( + accountFingerprint: testAccountFingerprintA, + container: 'com.apple.messages.cloud', + database: 'private', + zone: 'attachmentManateeZone', + ); + final now = DateTime.utc(2026, 8, 1); + + CloudAttachmentMaterialization metadata({int expectedBytes = 10}) => + CloudAttachmentMaterialization.metadata( + scope: scope, + generation: 4, + logicalEntityKeyHash: 'attachment-key-hash', + expectedBytes: expectedBytes, + expectedIntegrityTagHash: 'integrity-tag-hash', + updatedAt: now, + ); + + CloudAttachmentMaterialization streaming({int expectedBytes = 10}) => + metadata(expectedBytes: expectedBytes).beginStreaming( + activeGeneration: 4, + protectedTempReference: 'protected-temp', + protectedResumeManifestReference: 'protected-manifest-0', + now: now, + ); + + test('advances only through verified placement and reference stages', () { + final chunkOne = streaming().recordVerifiedBoundary( + activeGeneration: 4, + cumulativeVerifiedBytes: 4, + protectedResumeManifestReference: 'protected-manifest-1', + now: now, + ); + final chunkTwo = chunkOne.recordVerifiedBoundary( + activeGeneration: 4, + cumulativeVerifiedBytes: 10, + protectedResumeManifestReference: 'protected-manifest-2', + now: now, + ); + final verified = chunkTwo.markContentVerified( + activeGeneration: 4, + protectedContentVerificationReference: 'protected-verification', + now: now, + ); + final placed = verified.markFilePlaced( + activeGeneration: 4, + protectedFinalReference: 'protected-final', + now: now, + ); + final referenced = placed.markReferenced(activeGeneration: 4, now: now); + + expect(referenced.stage, CloudAttachmentMaterializationStage.referenced); + expect(referenced.verifiedBytes, 10); + expect(referenced.toString(), contains('redacted')); + expect(referenced.toString(), isNot(contains('attachment-key-hash'))); + }); + + test('cannot verify content before every expected byte is verified', () { + final partial = streaming().recordVerifiedBoundary( + activeGeneration: 4, + cumulativeVerifiedBytes: 9, + protectedResumeManifestReference: 'protected-manifest-1', + now: now, + ); + + expect( + () => partial.markContentVerified( + activeGeneration: 4, + protectedContentVerificationReference: 'protected-verification', + now: now, + ), + throwsA( + isA().having( + (error) => error.code, + 'code', + CloudAttachmentMaterializationFailureCode.sizeMismatch, + ), + ), + ); + }); + + test('verified offsets are contiguous monotonic boundaries', () { + final first = streaming().recordVerifiedBoundary( + activeGeneration: 4, + cumulativeVerifiedBytes: 6, + protectedResumeManifestReference: 'protected-manifest-1', + now: now, + ); + + expect( + () => first.recordVerifiedBoundary( + activeGeneration: 4, + cumulativeVerifiedBytes: 5, + protectedResumeManifestReference: 'protected-manifest-2', + now: now, + ), + throwsA( + isA().having( + (error) => error.code, + 'code', + CloudAttachmentMaterializationFailureCode.invalidBoundary, + ), + ), + ); + }); + + test('idempotent repeats require exactly the same protected reference', () { + final first = streaming().recordVerifiedBoundary( + activeGeneration: 4, + cumulativeVerifiedBytes: 6, + protectedResumeManifestReference: 'protected-manifest-1', + now: now, + ); + + expect( + first.recordVerifiedBoundary( + activeGeneration: 4, + cumulativeVerifiedBytes: 6, + protectedResumeManifestReference: 'protected-manifest-1', + now: now, + ), + same(first), + ); + expect( + () => first.recordVerifiedBoundary( + activeGeneration: 4, + cumulativeVerifiedBytes: 6, + protectedResumeManifestReference: 'different-manifest', + now: now, + ), + throwsA(isA()), + ); + }); + + test('crash tail is truncated to the last verified boundary', () { + final partial = streaming().recordVerifiedBoundary( + activeGeneration: 4, + cumulativeVerifiedBytes: 6, + protectedResumeManifestReference: 'protected-manifest-1', + now: now, + ); + final plan = partial.recoveryPlan( + activeGeneration: 4, + temporaryFileBytes: 8, + finalFileExists: false, + ); + + expect( + plan.action, + CloudAttachmentRecoveryAction.resumeFromVerifiedBoundary, + ); + expect(plan.resumeOffset, 6); + expect(plan.truncateTempToBytes, 6); + }); + + test('missing verified prefix restarts instead of trusting a short file', () { + final partial = streaming().recordVerifiedBoundary( + activeGeneration: 4, + cumulativeVerifiedBytes: 6, + protectedResumeManifestReference: 'protected-manifest-1', + now: now, + ); + final plan = partial.recoveryPlan( + activeGeneration: 4, + temporaryFileBytes: 5, + finalFileExists: false, + ); + + expect(plan.action, CloudAttachmentRecoveryAction.startFromZero); + expect(plan.resumeOffset, 0); + expect(plan.truncateTempToBytes, 0); + }); + + test('placed file is referenced only after filesystem confirmation', () { + final placed = streaming(expectedBytes: 0) + .markContentVerified( + activeGeneration: 4, + protectedContentVerificationReference: 'protected-verification', + now: now, + ) + .markFilePlaced( + activeGeneration: 4, + protectedFinalReference: 'protected-final', + now: now, + ); + + final missingPlan = placed.recoveryPlan( + activeGeneration: 4, + temporaryFileBytes: 0, + finalFileExists: false, + ); + final presentPlan = placed.recoveryPlan( + activeGeneration: 4, + temporaryFileBytes: null, + finalFileExists: true, + ); + + expect(missingPlan.action, CloudAttachmentRecoveryAction.verifyThenPlace); + expect( + presentPlan.action, + CloudAttachmentRecoveryAction.referencePlacedFile, + ); + }); + + test('generation mismatch fails every recovery or transition closed', () { + final state = streaming(); + + expect( + () => state.recoveryPlan( + activeGeneration: 5, + temporaryFileBytes: 0, + finalFileExists: false, + ), + throwsA( + isA().having( + (error) => error.code, + 'code', + CloudAttachmentMaterializationFailureCode.generationMismatch, + ), + ), + ); + }); +} diff --git a/test/services/cloud_sync/cloud_inbox_applier_test.dart b/test/services/cloud_sync/cloud_inbox_applier_test.dart new file mode 100644 index 0000000000..d9d9934146 --- /dev/null +++ b/test/services/cloud_sync/cloud_inbox_applier_test.dart @@ -0,0 +1,896 @@ +import 'dart:convert'; + +import 'package:bluebubbles/services/rustpush/cloud_sync/cloud_inbox_applier.dart'; +import 'package:bluebubbles/services/rustpush/cloud_sync/cloud_merge_policy.dart'; +import 'package:bluebubbles/services/rustpush/cloud_sync/cloud_sync_models.dart'; +import 'package:bluebubbles/services/rustpush/cloud_sync/cloud_sync_store.dart'; +import 'package:flutter_test/flutter_test.dart'; + +import 'cloud_sync_test_helpers.dart'; + +const _testLeaseFence = CloudCoordinatorLeaseFence( + ownerId: 'semantic-applier-test', + generation: 1, +); + +Future _apply( + TransactionalCloudInboxApplier applier, + CloudInboxEntry entry, +) => applier.apply(entry, leaseFence: _testLeaseFence); + +void main() { + final epoch = DateTime.utc(2026, 8, 1); + late CloudSyncScope scope; + late _MemorySemanticStore store; + late _Decoder decoder; + late TransactionalCloudInboxApplier applier; + + CloudInboxEntry entry(int sequence, {bool tombstone = false}) { + return CloudInboxEntry( + scope: scope, + sequence: sequence, + change: testChange(sequence, tombstone: tombstone), + status: CloudInboxStatus.pending, + attemptCount: 0, + createdAt: epoch, + batchId: 'batch-a', + generation: 3, + ); + } + + CloudSemanticSnapshot message({ + String key = 'message-key', + String? parentKey, + String content = 'content-a', + DateTime? createdAt, + DateTime? deliveredAt, + DateTime? readAt, + DateTime? retractedAt, + Map edits = const {}, + String etag = 'etag-a', + }) { + return CloudSemanticSnapshot( + kind: CloudEntityKind.message, + logicalEntityKeyHash: key, + parentLogicalKeyHash: parentKey, + immutableContentDigest: content, + createdAt: createdAt, + deliveredAt: deliveredAt, + readAt: readAt, + retractedAt: retractedAt, + editParts: edits, + etagHash: etag, + encryptedRawRecordReference: 'protected:$etag', + ); + } + + CloudSemanticEntityPayload payloadFor(CloudSemanticSnapshot snapshot) { + return switch (snapshot.kind) { + CloudEntityKind.message => CloudMessageEntityPayload( + logicalEntityKeyHash: snapshot.logicalEntityKeyHash, + canonicalGuid: 'message-guid', + chatAliasKeyHash: 'chat-key', + chatIdentifier: 'iMessage;-;chat', + body: 'renderable body', + senderHandle: 'sender@example.invalid', + ), + CloudEntityKind.chat => CloudChatEntityPayload( + logicalEntityKeyHash: snapshot.logicalEntityKeyHash, + canonicalGuid: 'chat-guid', + chatIdentifier: 'iMessage;-;chat', + displayName: 'Renderable chat', + participantHandles: const ['participant@example.invalid'], + ), + CloudEntityKind.reaction => CloudReactionEntityPayload( + logicalEntityKeyHash: snapshot.logicalEntityKeyHash, + canonicalGuid: 'reaction-guid', + parentLogicalKeyHash: snapshot.parentLogicalKeyHash!, + parentCanonicalGuid: 'parent-message-guid', + parentPart: 0, + senderHandle: 'sender@example.invalid', + reactionType: 'like', + ), + CloudEntityKind.attachment => CloudAttachmentEntityPayload( + logicalEntityKeyHash: snapshot.logicalEntityKeyHash, + canonicalGuid: 'attachment-guid', + ownerLogicalKeyHash: snapshot.parentLogicalKeyHash!, + ownerCanonicalGuid: 'owner-message-guid', + ownerPart: 0, + fileName: 'attachment.bin', + mimeType: 'application/octet-stream', + protectedLocalReference: 'protected:attachment', + ), + CloudEntityKind.sharedProfile => CloudProfileEntityPayload( + logicalEntityKeyHash: snapshot.logicalEntityKeyHash, + displayName: 'Renderable profile', + handle: 'profile@example.invalid', + ), + CloudEntityKind.groupPhoto => CloudGroupPhotoEntityPayload( + logicalEntityKeyHash: snapshot.logicalEntityKeyHash, + ownerLogicalKeyHash: snapshot.parentLogicalKeyHash!, + photoGuid: 'group-photo-guid', + protectedLocalReference: 'protected:group-photo', + ), + }; + } + + void decodeUpsert( + CloudInboxEntry inbox, + CloudSemanticSnapshot snapshot, { + CloudSemanticEntityPayload? payload, + }) { + decoder.values[inbox.change.changeId] = CloudDecodedMutation.upsert( + scope: scope, + generation: inbox.generation, + changeId: inbox.change.changeId, + snapshot: snapshot, + payload: payload ?? payloadFor(snapshot), + ); + } + + setUp(() { + scope = testScope(); + store = _MemorySemanticStore(scope: scope, generation: 3); + store.transaction.existingEntities.add((CloudEntityKind.chat, 'chat-key')); + decoder = _Decoder(); + applier = TransactionalCloudInboxApplier(decoder: decoder, store: store); + }); + + test( + 'replayed change is idempotent inside the semantic transaction', + () async { + final inbox = entry(1); + decodeUpsert(inbox, message()); + + expect( + (await _apply(applier, inbox)).disposition, + CloudInboxApplyDisposition.applied, + ); + expect( + (await _apply(applier, inbox)).disposition, + CloudInboxApplyDisposition.applied, + ); + expect(store.transaction.entityApplyCount, 1); + expect(store.transaction.appliedChanges, {inbox.change.changeId}); + }, + ); + + test( + 'immutable content conflict is quarantined without replacing local', + () async { + final inbox = entry(1); + store.transaction.put(message()); + decodeUpsert(inbox, message(content: 'content-b', etag: 'etag-b')); + + final result = await _apply(applier, inbox); + + expect(result.disposition, CloudInboxApplyDisposition.quarantined); + expect( + store.transaction.snapshot('message-key')!.immutableContentDigest, + 'content-a', + ); + expect( + store.transaction.quarantines[inbox.change.changeId], + 'immutable_content_mismatch', + ); + expect(store.transaction.appliedChanges, isEmpty); + expect(store.transaction.entityApplyCount, 0); + }, + ); + + test('edit histories converge by part revision', () async { + final inbox = entry(1); + store.transaction.put( + message( + edits: { + 'part-a': CloudEditPart( + partKeyHash: 'part-a', + revision: 1, + contentDigest: 'edit-a1', + modifiedAt: epoch, + ), + }, + ), + ); + decodeUpsert( + inbox, + message( + etag: 'etag-b', + edits: { + 'part-a': CloudEditPart( + partKeyHash: 'part-a', + revision: 2, + contentDigest: 'edit-a2', + modifiedAt: epoch.add(const Duration(minutes: 2)), + ), + 'part-b': CloudEditPart( + partKeyHash: 'part-b', + revision: 1, + contentDigest: 'edit-b1', + modifiedAt: epoch.add(const Duration(minutes: 1)), + ), + }, + ), + ); + + expect( + (await _apply(applier, inbox)).disposition, + CloudInboxApplyDisposition.applied, + ); + final edits = store.transaction.snapshot('message-key')!.editParts; + expect(edits['part-a']!.revision, 2); + expect(edits['part-b']!.contentDigest, 'edit-b1'); + }); + + test('equal edit revision with different content is quarantined', () async { + final inbox = entry(1); + store.transaction.put( + message( + edits: { + 'part-a': CloudEditPart( + partKeyHash: 'part-a', + revision: 2, + contentDigest: 'edit-a', + modifiedAt: epoch, + ), + }, + ), + ); + decodeUpsert( + inbox, + message( + etag: 'etag-b', + edits: { + 'part-a': CloudEditPart( + partKeyHash: 'part-a', + revision: 2, + contentDigest: 'edit-b', + modifiedAt: epoch.add(const Duration(minutes: 1)), + ), + }, + ), + ); + + expect( + (await _apply(applier, inbox)).disposition, + CloudInboxApplyDisposition.quarantined, + ); + expect( + store.transaction.quarantines[inbox.change.changeId], + 'edit_revision_mismatch', + ); + }); + + test('retractions and delivered/read timestamps remain monotonic', () async { + final inbox = entry(1); + store.transaction.put( + message( + deliveredAt: epoch.add(const Duration(minutes: 5)), + readAt: epoch.add(const Duration(minutes: 8)), + retractedAt: epoch.add(const Duration(minutes: 7)), + ), + ); + decodeUpsert( + inbox, + message( + deliveredAt: epoch.add(const Duration(minutes: 9)), + readAt: epoch.add(const Duration(minutes: 3)), + retractedAt: epoch.add(const Duration(minutes: 2)), + etag: 'etag-b', + ), + ); + + await _apply(applier, inbox); + final merged = store.transaction.snapshot('message-key')!; + expect(merged.deliveredAt, epoch.add(const Duration(minutes: 9))); + expect(merged.readAt, epoch.add(const Duration(minutes: 8))); + expect(merged.retractedAt, epoch.add(const Duration(minutes: 7))); + }); + + test('reaction is deferred until its parent exists', () async { + final inbox = entry(1); + decodeUpsert( + inbox, + CloudSemanticSnapshot( + kind: CloudEntityKind.reaction, + logicalEntityKeyHash: 'reaction-key', + parentLogicalKeyHash: 'missing-parent', + immutableContentDigest: 'reaction-digest', + ), + ); + + expect( + (await _apply(applier, inbox)).disposition, + CloudInboxApplyDisposition.deferred, + ); + expect(store.transaction.appliedChanges, isEmpty); + expect(store.transaction.entityApplyCount, 0); + }); + + test('reply message requires a message parent, not a chat parent', () async { + final inbox = entry(1); + final snapshot = message(parentKey: 'reply-parent-key'); + decodeUpsert( + inbox, + snapshot, + payload: CloudMessageEntityPayload( + logicalEntityKeyHash: snapshot.logicalEntityKeyHash, + canonicalGuid: 'reply-message-guid', + chatAliasKeyHash: 'chat-key', + chatIdentifier: 'iMessage;-;chat', + body: 'reply body', + senderHandle: 'sender@example.invalid', + replyParentLogicalKeyHash: 'reply-parent-key', + replyParentCanonicalGuid: 'parent-message-guid', + replyParentPart: '0', + ), + ); + + expect( + (await _apply(applier, inbox)).disposition, + CloudInboxApplyDisposition.deferred, + ); + + store.transaction.existingEntities.add(( + CloudEntityKind.message, + 'reply-parent-key', + )); + expect( + (await _apply(applier, inbox)).disposition, + CloudInboxApplyDisposition.applied, + ); + }); + + test('equal group-version conflict retains local server base', () async { + final inbox = entry(1); + CloudSemanticSnapshot chat(String metadata, String etag) => + CloudSemanticSnapshot( + kind: CloudEntityKind.chat, + logicalEntityKeyHash: 'chat-key', + groupVersion: 4, + groupMetadataDigest: metadata, + etagHash: etag, + encryptedRawRecordReference: 'protected:$etag', + ); + store.transaction.put(chat('metadata-a', 'etag-a')); + decodeUpsert(inbox, chat('metadata-b', 'etag-b')); + + expect( + (await _apply(applier, inbox)).disposition, + CloudInboxApplyDisposition.applied, + ); + final retained = store.transaction.snapshot('chat-key')!; + expect(retained.groupMetadataDigest, 'metadata-a'); + expect(retained.etagHash, 'etag-a'); + expect( + store.transaction.conflicts[inbox.change.changeId], + 'equal_group_version_mismatch', + ); + }); + + test('higher group version replaces the local group base', () async { + final inbox = entry(1); + CloudSemanticSnapshot chat(int version, String metadata, String etag) => + CloudSemanticSnapshot( + kind: CloudEntityKind.chat, + logicalEntityKeyHash: 'chat-key', + groupVersion: version, + groupMetadataDigest: metadata, + etagHash: etag, + encryptedRawRecordReference: 'protected:$etag', + ); + store.transaction.put(chat(3, 'metadata-a', 'etag-a')); + decodeUpsert(inbox, chat(4, 'metadata-b', 'etag-b')); + + expect( + (await _apply(applier, inbox)).disposition, + CloudInboxApplyDisposition.applied, + ); + final merged = store.transaction.snapshot('chat-key')!; + expect(merged.groupVersion, 4); + expect(merged.groupMetadataDigest, 'metadata-b'); + }); + + test( + 'confirmed tombstone applies while unconfirmed tombstone quarantines', + () async { + applier = TransactionalCloudInboxApplier( + decoder: decoder, + store: store, + allowTombstones: true, + ); + final confirmed = entry(1, tombstone: true); + decoder.values[confirmed.change.changeId] = + CloudDecodedMutation.tombstone( + scope: scope, + generation: 3, + changeId: confirmed.change.changeId, + tombstone: CloudSemanticTombstone( + kind: CloudEntityKind.message, + logicalEntityKeyHash: 'message-key', + deletedAt: epoch.add(const Duration(hours: 1)), + serverConfirmed: true, + ), + ); + store.transaction.put(message(createdAt: epoch)); + + expect( + (await _apply(applier, confirmed)).disposition, + CloudInboxApplyDisposition.applied, + ); + expect(store.transaction.snapshot('message-key'), isNull); + expect(store.transaction.entityApplyCount, 0); + + final unconfirmed = entry(2, tombstone: true); + decoder.values[unconfirmed.change.changeId] = + CloudDecodedMutation.tombstone( + scope: scope, + generation: 3, + changeId: unconfirmed.change.changeId, + tombstone: CloudSemanticTombstone( + kind: CloudEntityKind.message, + logicalEntityKeyHash: 'other-key', + deletedAt: epoch, + serverConfirmed: false, + ), + ); + expect( + (await _apply(applier, unconfirmed)).disposition, + CloudInboxApplyDisposition.quarantined, + ); + }, + ); + + test('stale tombstone cannot erase newer local semantic state', () async { + applier = TransactionalCloudInboxApplier( + decoder: decoder, + store: store, + allowTombstones: true, + ); + final inbox = entry(1, tombstone: true); + store.transaction.put( + message(createdAt: epoch, readAt: epoch.add(const Duration(hours: 2))), + ); + decoder.values[inbox.change.changeId] = CloudDecodedMutation.tombstone( + scope: scope, + generation: 3, + changeId: inbox.change.changeId, + tombstone: CloudSemanticTombstone( + kind: CloudEntityKind.message, + logicalEntityKeyHash: 'message-key', + deletedAt: epoch.add(const Duration(hours: 1)), + serverConfirmed: true, + ), + ); + + expect( + (await _apply(applier, inbox)).disposition, + CloudInboxApplyDisposition.applied, + ); + expect(store.transaction.snapshot('message-key'), isNotNull); + expect( + store.transaction.conflicts[inbox.change.changeId], + 'stale_tombstone', + ); + }); + + test( + 'disabled tombstones quarantine without deleting or opening a transaction', + () async { + final inbox = entry(1, tombstone: true); + decoder.values[inbox.change.changeId] = CloudDecodedMutation.tombstone( + scope: scope, + generation: 3, + changeId: inbox.change.changeId, + tombstone: CloudSemanticTombstone( + kind: CloudEntityKind.message, + logicalEntityKeyHash: 'message-key', + deletedAt: epoch, + serverConfirmed: true, + ), + ); + store.transaction.put(message(createdAt: epoch)); + + expect( + (await _apply(applier, inbox)).disposition, + CloudInboxApplyDisposition.quarantined, + ); + expect(store.transactionCount, 0); + expect(store.transaction.snapshot('message-key'), isNotNull); + }, + ); + + test( + 'enabled tombstone without server time defers without deleting', + () async { + applier = TransactionalCloudInboxApplier( + decoder: decoder, + store: store, + allowTombstones: true, + ); + final inbox = entry(1, tombstone: true); + decoder.values[inbox.change.changeId] = CloudDecodedMutation.tombstone( + scope: scope, + generation: 3, + changeId: inbox.change.changeId, + tombstone: CloudSemanticTombstone( + kind: CloudEntityKind.message, + logicalEntityKeyHash: 'message-key', + deletedAt: null, + serverConfirmed: true, + ), + ); + store.transaction.put(message(createdAt: epoch)); + + expect( + (await _apply(applier, inbox)).disposition, + CloudInboxApplyDisposition.deferred, + ); + expect(store.transaction.snapshot('message-key'), isNotNull); + expect(store.transaction.appliedChanges, isEmpty); + }, + ); + + test('decoded account or generation mismatch fails closed', () async { + final accountMismatch = entry(1); + decoder.values[accountMismatch.change.changeId] = + CloudDecodedMutation.upsert( + scope: testScope(account: testAccountFingerprintB), + generation: 3, + changeId: accountMismatch.change.changeId, + snapshot: message(), + payload: payloadFor(message()), + ); + expect( + (await _apply(applier, accountMismatch)).disposition, + CloudInboxApplyDisposition.quarantined, + ); + + final generationMismatch = entry(2); + decoder.values[generationMismatch.change.changeId] = + CloudDecodedMutation.upsert( + scope: scope, + generation: 2, + changeId: generationMismatch.change.changeId, + snapshot: message(), + payload: payloadFor(message()), + ); + expect( + (await _apply(applier, generationMismatch)).disposition, + CloudInboxApplyDisposition.quarantined, + ); + expect(store.transaction.entityApplyCount, 0); + }); + + test('active transaction scope and generation are revalidated', () async { + final inbox = entry(1); + decodeUpsert(inbox, message()); + store.transaction.activeGenerationOverride = 4; + + expect( + (await _apply(applier, inbox)).disposition, + CloudInboxApplyDisposition.quarantined, + ); + expect(store.transaction.entityApplyCount, 0); + }); + + test('active native account is revalidated immediately before write', + () async { + final inbox = entry(1); + decodeUpsert(inbox, message()); + applier = TransactionalCloudInboxApplier( + decoder: decoder, + store: store, + activeScopeRevalidator: () async => false, + ); + + final result = await _apply(applier, inbox); + + expect(result.disposition, CloudInboxApplyDisposition.quarantined); + expect(result.failureCategory, CloudFailureCategory.conflict); + expect(store.transactionCount, 0); + }); + + test('native account revalidation failure remains retryable', () async { + final inbox = entry(1); + decodeUpsert(inbox, message()); + applier = TransactionalCloudInboxApplier( + decoder: decoder, + store: store, + activeScopeRevalidator: () async => throw StateError('unavailable'), + ); + + final result = await _apply(applier, inbox); + + expect(result.disposition, CloudInboxApplyDisposition.retryable); + expect(result.failureCategory, CloudFailureCategory.authorization); + expect(store.transactionCount, 0); + }); + + test( + 'typed decoder failure quarantines without opening a transaction', + () async { + final inbox = entry(1); + decoder.failures[inbox.change.changeId] = + const CloudSemanticDecodeFailure( + CloudFailureCategory.malformedRecord, + ); + + final result = await _apply(applier, inbox); + + expect(result.disposition, CloudInboxApplyDisposition.quarantined); + expect(result.failureCategory, CloudFailureCategory.malformedRecord); + expect(store.transactionCount, 0); + }, + ); + + test('typed retryable decoder failures remain retryable', () async { + final inbox = entry(1); + const retryableCategories = [ + CloudFailureCategory.network, + CloudFailureCategory.throttled, + CloudFailureCategory.server, + CloudFailureCategory.authorization, + CloudFailureCategory.pcsUnavailable, + CloudFailureCategory.dependency, + CloudFailureCategory.localStorage, + ]; + + for (final category in retryableCategories) { + decoder.failures[inbox.change.changeId] = CloudSemanticDecodeFailure( + category, + ); + final result = await _apply(applier, inbox); + expect( + result.disposition, + CloudInboxApplyDisposition.retryable, + reason: category.name, + ); + expect(result.failureCategory, category, reason: category.name); + } + expect(store.transactionCount, 0); + }); + + test( + 'typed unknown decoder failure is left for bounded engine policy', + () async { + final inbox = entry(1); + decoder.failures[inbox.change.changeId] = + const CloudSemanticDecodeFailure(CloudFailureCategory.unknown); + + final result = await _apply(applier, inbox); + + expect(result.disposition, CloudInboxApplyDisposition.quarantined); + expect(result.failureCategory, CloudFailureCategory.unknown); + expect(store.transactionCount, 0); + }, + ); + + test('untyped decoder failure is classified as bounded unknown', () async { + final inbox = entry(1); + + final result = await _apply(applier, inbox); + + expect(result.disposition, CloudInboxApplyDisposition.quarantined); + expect(result.failureCategory, CloudFailureCategory.unknown); + expect(store.transactionCount, 0); + }); + + test( + 'only confirmed permanent decoder categories quarantine immediately', + () async { + final inbox = entry(1); + const permanentCategories = [ + CloudFailureCategory.malformedRecord, + CloudFailureCategory.conflict, + CloudFailureCategory.cancelled, + ]; + + for (final category in permanentCategories) { + decoder.failures[inbox.change.changeId] = CloudSemanticDecodeFailure( + category, + ); + final result = await _apply(applier, inbox); + expect( + result.disposition, + CloudInboxApplyDisposition.quarantined, + reason: category.name, + ); + expect(result.failureCategory, category, reason: category.name); + } + expect(store.transactionCount, 0); + }, + ); + + test( + 'create and update apply transient payload to the canonical entity', + () async { + final create = entry(1); + final firstPayload = CloudMessageEntityPayload( + logicalEntityKeyHash: 'message-key', + canonicalGuid: 'message-guid', + chatAliasKeyHash: 'chat-key', + chatIdentifier: 'iMessage;-;chat', + body: 'first plaintext body', + senderHandle: 'first@example.invalid', + ); + decodeUpsert(create, message(), payload: firstPayload); + await _apply(applier, create); + + final update = entry(2); + final secondPayload = CloudMessageEntityPayload( + logicalEntityKeyHash: 'message-key', + canonicalGuid: 'message-guid', + chatAliasKeyHash: 'chat-key', + chatIdentifier: 'iMessage;-;chat', + body: 'edited plaintext body', + senderHandle: 'first@example.invalid', + ); + decodeUpsert( + update, + message( + etag: 'etag-b', + edits: { + 'part-a': CloudEditPart( + partKeyHash: 'part-a', + revision: 1, + contentDigest: 'edit-digest', + modifiedAt: epoch, + ), + }, + ), + payload: secondPayload, + ); + await _apply(applier, update); + + expect(store.transaction.appliedPayloads, [firstPayload, secondPayload]); + expect(store.transaction.entityApplyCount, 2); + }, + ); + + test('payload and decoded envelope string output are always redacted', () { + const secretBody = 'secret-message-body-8472'; + const secretHandle = 'private-handle@example.invalid'; + final payload = CloudMessageEntityPayload( + logicalEntityKeyHash: 'message-key', + canonicalGuid: 'private-message-guid', + chatAliasKeyHash: 'chat-key', + chatIdentifier: 'iMessage;-;private-chat', + body: secretBody, + senderHandle: secretHandle, + ); + final decoded = CloudDecodedMutation.upsert( + scope: scope, + generation: 3, + changeId: 'change-digest', + snapshot: message(), + payload: payload, + ); + + expect(payload.toString(), isNot(contains(secretBody))); + expect(payload.toString(), isNot(contains(secretHandle))); + expect(decoded.toString(), isNot(contains(secretBody))); + expect(decoded.toString(), isNot(contains(secretHandle))); + expect(decoded.toString(), contains('redacted')); + expect( + () => jsonEncode(payload), + throwsA(isA()), + ); + }); +} + +class _Decoder implements CloudSemanticDecoder { + final values = {}; + final failures = {}; + + @override + Future decode(CloudInboxEntry entry) async { + final failure = failures[entry.change.changeId]; + if (failure != null) throw failure; + return values[entry.change.changeId]!; + } +} + +class _MemorySemanticStore implements CloudSemanticStoreGateway { + _MemorySemanticStore({required CloudSyncScope scope, required int generation}) + : transaction = _MemoryTransaction(scope, generation); + + final _MemoryTransaction transaction; + int transactionCount = 0; + + @override + Future writeTransaction({ + required CloudInboxEntry entry, + required CloudCoordinatorLeaseFence leaseFence, + required T Function(CloudSemanticStoreTransaction transaction) action, + }) async { + transactionCount++; + return action(transaction); + } +} + +class _MemoryTransaction implements CloudSemanticStoreTransaction { + _MemoryTransaction(this.activeScope, this._activeGeneration); + + @override + final CloudSyncScope activeScope; + final int _activeGeneration; + int? activeGenerationOverride; + final snapshots = {}; + final appliedChanges = {}; + final quarantines = {}; + final conflicts = {}; + final appliedPayloads = []; + final boundLogicalEntityKeyHashes = []; + final existingEntities = <(CloudEntityKind, String)>{}; + int entityApplyCount = 0; + + @override + int get activeGeneration => activeGenerationOverride ?? _activeGeneration; + + void put(CloudSemanticSnapshot snapshot) { + snapshots[snapshot.logicalEntityKeyHash] = snapshot; + } + + CloudSemanticSnapshot? snapshot(String key) => snapshots[key]; + + @override + void applyTombstone(CloudSemanticTombstone tombstone) { + snapshots.remove(tombstone.logicalEntityKeyHash); + } + + @override + bool entityExists({ + required CloudEntityKind kind, + required String logicalEntityKeyHash, + }) { + final snapshot = snapshots[logicalEntityKeyHash]; + return snapshot?.kind == kind || + existingEntities.contains((kind, logicalEntityKeyHash)); + } + + @override + void bindRecordIdentity({ + required String logicalEntityKeyHash, + String? encryptedRawRecordReference, + }) { + boundLogicalEntityKeyHashes.add(logicalEntityKeyHash); + } + + @override + bool hasAppliedChange(String changeId) => appliedChanges.contains(changeId); + + @override + void markChangeApplied(String changeId) { + appliedChanges.add(changeId); + } + + @override + void quarantineChange(String changeId, String safeCode) { + quarantines[changeId] = safeCode; + } + + @override + CloudSemanticSnapshot? readSnapshot({ + required CloudEntityKind kind, + required String logicalEntityKeyHash, + }) { + final snapshot = snapshots[logicalEntityKeyHash]; + return snapshot?.kind == kind ? snapshot : null; + } + + @override + void recordConflict(String changeId, String safeCode) { + conflicts[changeId] = safeCode; + } + + @override + void applyEntity({ + required CloudSemanticEntityPayload payload, + required CloudSemanticSnapshot snapshot, + }) { + entityApplyCount++; + appliedPayloads.add(payload); + snapshots[snapshot.logicalEntityKeyHash] = snapshot; + } +} diff --git a/test/services/cloud_sync/cloud_merge_policy_test.dart b/test/services/cloud_sync/cloud_merge_policy_test.dart new file mode 100644 index 0000000000..40c936be7d --- /dev/null +++ b/test/services/cloud_sync/cloud_merge_policy_test.dart @@ -0,0 +1,214 @@ +import 'package:bluebubbles/services/rustpush/cloud_sync/cloud_merge_policy.dart'; +import 'package:bluebubbles/services/rustpush/cloud_sync/cloud_sync_models.dart'; +import 'package:flutter_test/flutter_test.dart'; + +void main() { + const policy = CloudMergePolicy(); + final baseTime = DateTime.utc(2026, 7, 31); + + CloudSemanticSnapshot message({ + String content = 'content-digest-a', + DateTime? readAt, + DateTime? deliveredAt, + Map edits = const {}, + DateTime? retractedAt, + String etag = 'etag-a', + }) { + return CloudSemanticSnapshot( + kind: CloudEntityKind.message, + logicalEntityKeyHash: 'message-key-digest', + immutableContentDigest: content, + readAt: readAt, + deliveredAt: deliveredAt, + editParts: edits, + retractedAt: retractedAt, + etagHash: etag, + encryptedRawRecordReference: 'protected:$etag', + ); + } + + test('creates an absent entity without exposing content', () { + final incoming = message(); + final result = policy.merge(local: null, incoming: incoming); + + expect(result.action, CloudMergeAction.create); + expect(result.snapshot, same(incoming)); + }); + + test('quarantines conflicting immutable content', () { + final result = policy.merge( + local: message(), + incoming: message(content: 'content-digest-b'), + ); + + expect(result.action, CloudMergeAction.quarantine); + expect( + result.conflicts, + contains(CloudMergeConflict.immutableContentMismatch), + ); + }); + + test('fills missing canonical digest without replacing a valid one', () { + final local = CloudSemanticSnapshot( + kind: CloudEntityKind.message, + logicalEntityKeyHash: 'message-key-digest', + etagHash: 'etag-a', + ); + final incoming = message(); + + final result = policy.merge(local: local, incoming: incoming); + + expect(result.action, CloudMergeAction.update); + expect(result.snapshot!.immutableContentDigest, 'content-digest-a'); + }); + + test('read and delivery timestamps move monotonically forward', () { + final result = policy.merge( + local: message( + readAt: baseTime.add(const Duration(minutes: 5)), + deliveredAt: baseTime.add(const Duration(minutes: 3)), + ), + incoming: message( + readAt: baseTime.add(const Duration(minutes: 2)), + deliveredAt: baseTime.add(const Duration(minutes: 9)), + etag: 'etag-b', + ), + ); + + expect(result.action, CloudMergeAction.update); + expect(result.snapshot!.readAt, baseTime.add(const Duration(minutes: 5))); + expect( + result.snapshot!.deliveredAt, + baseTime.add(const Duration(minutes: 9)), + ); + }); + + test('unions edits by revision and flags equal-revision conflicts', () { + final localPart = CloudEditPart( + partKeyHash: 'part-digest', + revision: 2, + contentDigest: 'edit-a', + modifiedAt: baseTime, + ); + final incomingPart = CloudEditPart( + partKeyHash: 'part-digest', + revision: 2, + contentDigest: 'edit-b', + modifiedAt: baseTime.add(const Duration(minutes: 1)), + ); + final result = policy.merge( + local: message(edits: {'part-digest': localPart}), + incoming: message(edits: {'part-digest': incomingPart}, etag: 'etag-b'), + ); + + expect(result.snapshot!.editParts['part-digest']!.contentDigest, 'edit-a'); + expect(result.conflicts, contains(CloudMergeConflict.editRevisionMismatch)); + }); + + test('newer retraction wins and older retraction cannot undo it', () { + final currentRetraction = baseTime.add(const Duration(minutes: 5)); + final result = policy.merge( + local: message(retractedAt: currentRetraction), + incoming: message(retractedAt: baseTime.add(const Duration(minutes: 2))), + ); + + expect(result.snapshot!.retractedAt, currentRetraction); + }); + + test('higher group version wins while equal conflict retains local base', () { + CloudSemanticSnapshot chat(int version, String metadata, String etag) { + return CloudSemanticSnapshot( + kind: CloudEntityKind.chat, + logicalEntityKeyHash: 'chat-key-digest', + groupVersion: version, + groupMetadataDigest: metadata, + etagHash: etag, + encryptedRawRecordReference: 'protected:$etag', + ); + } + + final higher = policy.merge( + local: chat(3, 'metadata-a', 'etag-a'), + incoming: chat(4, 'metadata-b', 'etag-b'), + ); + expect(higher.snapshot!.groupVersion, 4); + expect(higher.snapshot!.groupMetadataDigest, 'metadata-b'); + + final equalConflict = policy.merge( + local: chat(4, 'metadata-b', 'etag-b'), + incoming: chat(4, 'metadata-c', 'etag-c'), + ); + expect(equalConflict.snapshot!.groupMetadataDigest, 'metadata-b'); + expect( + equalConflict.conflicts, + contains(CloudMergeConflict.equalGroupVersionMismatch), + ); + }); + + test('reaction is deferred until its parent exists', () { + final reaction = CloudSemanticSnapshot( + kind: CloudEntityKind.reaction, + logicalEntityKeyHash: 'reaction-key-digest', + parentLogicalKeyHash: 'parent-key-digest', + immutableContentDigest: 'reaction-content-digest', + ); + + final result = policy.merge( + local: null, + incoming: reaction, + parentExists: false, + ); + + expect(result.action, CloudMergeAction.defer); + }); + + test('snapshot timestamps normalize to UTC millisecond precision', () { + final localTime = DateTime.parse('2026-07-31T09:10:11.123456-07:00'); + final snapshot = CloudSemanticSnapshot( + kind: CloudEntityKind.message, + logicalEntityKeyHash: 'message-key-digest', + createdAt: localTime, + editParts: { + 'part-digest': CloudEditPart( + partKeyHash: 'part-digest', + revision: 1, + contentDigest: 'content-digest', + modifiedAt: localTime, + ), + }, + ); + + expect(snapshot.createdAt!.isUtc, isTrue); + expect(snapshot.createdAt!.microsecond, 0); + expect(snapshot.createdAt!.millisecond, 123); + expect(snapshot.editParts['part-digest']!.modifiedAt.isUtc, isTrue); + expect(snapshot.editParts['part-digest']!.modifiedAt.microsecond, 0); + }); + + test('copyWith supports an explicit clear without conflating omission', () { + final original = message(readAt: baseTime, deliveredAt: baseTime); + + final omitted = original.copyWith(); + final cleared = original.copyWith( + clearReadAt: true, + clearEtagHash: true, + clearEncryptedRawRecordReference: true, + ); + + expect(omitted.readAt, baseTime); + expect(omitted.etagHash, 'etag-a'); + expect(cleared.readAt, isNull); + expect(cleared.etagHash, isNull); + expect(cleared.encryptedRawRecordReference, isNull); + expect( + () => original.copyWith(readAt: baseTime, clearReadAt: true), + throwsA( + isA().having( + (error) => error.message, + 'message', + 'cloud_semantic_snapshot_clear_conflict', + ), + ), + ); + }); +} diff --git a/test/services/cloud_sync/cloud_protected_page_lease_lifecycle_test.dart b/test/services/cloud_sync/cloud_protected_page_lease_lifecycle_test.dart new file mode 100644 index 0000000000..e0dc2b99f3 --- /dev/null +++ b/test/services/cloud_sync/cloud_protected_page_lease_lifecycle_test.dart @@ -0,0 +1,714 @@ +import 'package:bluebubbles/services/rustpush/cloud_sync/cloud_sync.dart'; +import 'package:flutter_test/flutter_test.dart'; + +const _leaseA = 'obcs2.lease.aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa'; +const _leaseB = 'obcs2.lease.bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb'; +const _storeIdentity = + 'obcs2.store.AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA'; + +void main() { + late List timeline; + late _AdoptionStore store; + late _LeaseTransport transport; + late CloudProtectedPageLeaseLifecycle lifecycle; + + setUp(() { + CloudProtectedPageLeaseLifecycle.resetRecoveryStateForTests(); + timeline = []; + store = _AdoptionStore({_leaseA, _leaseB}, timeline: timeline); + transport = _LeaseTransport(timeline: timeline); + lifecycle = CloudProtectedPageLeaseLifecycle( + store: store, + transport: transport, + ); + }); + + tearDown(CloudProtectedPageLeaseLifecycle.resetRecoveryStateForTests); + + test( + 'startup recovery supplies the complete set before releasing markers', + () async { + await lifecycle.ensureRecoveredBeforeFetch(); + + expect(transport.recoverySets, [ + {_leaseA, _leaseB}, + ]); + expect(store.adopted, isEmpty); + expect(store.events, [ + 'read', + 'read-live', + 'release:${[_leaseA, _leaseB].join(',')}', + ]); + }, + ); + + test('failed startup recovery retains markers and may retry', () async { + transport.recoveryFailuresRemaining = 1; + + await expectLater( + lifecycle.ensureRecoveredBeforeFetch(), + throwsA(isA()), + ); + expect(store.adopted, {_leaseA, _leaseB}); + + await lifecycle.ensureRecoveredBeforeFetch(); + expect(transport.recoverySets, [ + {_leaseA, _leaseB}, + {_leaseA, _leaseB}, + ]); + expect(store.adopted, isEmpty); + }); + + test( + 'separate wrappers for one native store share process recovery', + () async { + final secondTransport = _LeaseTransport(timeline: timeline); + final secondLifecycle = CloudProtectedPageLeaseLifecycle( + store: store, + transport: secondTransport, + ); + + await Future.wait([ + lifecycle.ensureRecoveredBeforeFetch(), + secondLifecycle.ensureRecoveredBeforeFetch(), + ]); + + expect(transport.recoverySets, hasLength(1)); + expect(secondTransport.recoverySets, isEmpty); + }, + ); + + test( + 'recovery beyond one native page releases only finalized leases', + () async { + final leases = { + for (var index = 0; index < 65; index++) + 'obcs2.lease.${index.toRadixString(16).padLeft(32, '0')}', + }; + store = _AdoptionStore(leases, timeline: timeline); + transport = _LeaseTransport(timeline: timeline) + ..maximumRecoveryPageSize = 64; + lifecycle = CloudProtectedPageLeaseLifecycle( + store: store, + transport: transport, + ); + + await lifecycle.ensureRecoveredBeforeFetch(); + + expect(transport.recoverySets, hasLength(2)); + expect(transport.recoverySets.first, hasLength(65)); + expect(transport.recoverySets.last, hasLength(1)); + expect(store.adopted, isEmpty); + }, + ); + + test( + 'stale marker is released only when native reports its manifest absent', + () async { + transport.absentRecoveryReferences.add(_leaseA); + + await lifecycle.ensureRecoveredBeforeFetch(); + + expect(store.adopted, isEmpty); + expect(transport.recoverySets, [ + {_leaseA, _leaseB}, + ]); + }, + ); + + test( + 'outbound receipts participate in recovery but page cleanup never acknowledges them', + () async { + store = _AdoptionStore( + {_leaseA}, + outboundAdopted: {_leaseB}, + timeline: timeline, + ); + lifecycle = CloudProtectedPageLeaseLifecycle( + store: store, + transport: transport, + ); + + await lifecycle.ensureRecoveredBeforeFetch(); + + expect(transport.recoverySets.single, {_leaseA, _leaseB}); + expect(store.adopted, isEmpty); + expect(store.outboundAdopted, {_leaseB}); + expect(transport.events.where((event) => event.startsWith('ack:')), [ + 'ack:$_leaseA', + ]); + }, + ); + + test( + 'missing outbound receipt fails closed without releasing adoption', + () async { + store = _AdoptionStore( + const {}, + outboundAdopted: {_leaseB}, + timeline: timeline, + ); + transport.absentRecoveryReferences.add(_leaseB); + lifecycle = CloudProtectedPageLeaseLifecycle( + store: store, + transport: transport, + ); + + await expectLater( + lifecycle.ensureRecoveredBeforeFetch(), + throwsA( + isA().having( + (failure) => failure.safeCode, + 'safeCode', + 'protected_outbound_lease_missing', + ), + ), + ); + expect(store.outboundAdopted, {_leaseB}); + expect( + transport.events.where((event) => event.startsWith('ack:')), + isEmpty, + ); + }, + ); + + test( + 'page and outbound lease namespace collision fails before native recovery', + () async { + store = _AdoptionStore( + {_leaseA}, + outboundAdopted: {_leaseA}, + timeline: timeline, + ); + lifecycle = CloudProtectedPageLeaseLifecycle( + store: store, + transport: transport, + ); + + await expectLater( + lifecycle.ensureRecoveredBeforeFetch(), + throwsA( + isA().having( + (failure) => failure.safeCode, + 'safeCode', + 'protected_lease_namespace_collision', + ), + ), + ); + expect(transport.recoverySets, isEmpty); + expect(store.adopted, {_leaseA}); + expect(store.outboundAdopted, {_leaseA}); + }, + ); + + test( + 'rolling back more than one page of unadopted manifests is progress', + () async { + store = _AdoptionStore({}, timeline: timeline); + transport = _LeaseTransport(timeline: timeline) + ..maximumRecoveryPageSize = 64 + ..unadoptedManifestsRemaining = 65; + lifecycle = CloudProtectedPageLeaseLifecycle( + store: store, + transport: transport, + ); + + await lifecycle.ensureRecoveredBeforeFetch(); + + expect(transport.recoverySets, hasLength(2)); + expect(transport.unadoptedManifestsRemaining, 0); + }, + ); + + test( + 'removing more than one native page of temporary files is progress', + () async { + store = _AdoptionStore({}, timeline: timeline); + transport = _LeaseTransport(timeline: timeline) + ..maximumRecoveryPageSize = 64 + ..temporaryFilesRemaining = 65; + lifecycle = CloudProtectedPageLeaseLifecycle( + store: store, + transport: transport, + ); + + await lifecycle.ensureRecoveredBeforeFetch(); + + expect(transport.recoverySets, hasLength(2)); + expect(transport.temporaryFilesRemaining, 0); + }, + ); + + test('journaled page releases adoption only after native commit', () async { + store.adopted + ..clear() + ..add(_leaseA); + + await lifecycle.commitJournaledPage( + _batch(_leaseA), + previousCheckpointReference: null, + ); + + expect(transport.events, ['commit:$_leaseA:', 'ack:$_leaseA']); + expect(store.adopted, isEmpty); + }); + + test('failed native commit retains the durable adoption marker', () async { + store.adopted + ..clear() + ..add(_leaseA); + transport.commitFailure = StateError('commit failed'); + + await expectLater( + lifecycle.commitJournaledPage( + _batch(_leaseA), + previousCheckpointReference: null, + ), + throwsA(isA()), + ); + + expect(store.adopted, {_leaseA}); + }); + + test( + 'commit failure invalidates a completed process recovery for retry', + () async { + await lifecycle.ensureRecoveredBeforeFetch(); + store.adopted.add(_leaseA); + transport.commitFailure = StateError('commit failed'); + + await expectLater( + lifecycle.commitJournaledPage( + _batch(_leaseA), + previousCheckpointReference: null, + ), + throwsA(isA()), + ); + + transport.commitFailure = null; + await lifecycle.ensureRecoveredBeforeFetch(); + expect(transport.recoverySets, hasLength(2)); + expect(transport.recoverySets.last, {_leaseA}); + expect(store.adopted, isEmpty); + }, + ); + + test( + 'unjournaled page rolls back without touching adoption markers', + () async { + await lifecycle.rollbackUnjournaledPage(_batch(_leaseA)); + + expect(transport.events, ['rollback:$_leaseA']); + expect(store.adopted, {_leaseA, _leaseB}); + }, + ); + + test( + 'all-duplicate page retains only the newly committed checkpoint', + () async { + final duplicateA = _reference('A'); + final duplicateB = _reference('B'); + final duplicateC = _reference('C'); + final nextCheckpoint = _reference('N'); + store.adopted + ..clear() + ..add(_leaseA); + store.liveReferences = {nextCheckpoint}; + + await lifecycle.commitJournaledPage( + _batch( + _leaseA, + changes: [ + _change( + serverReference: duplicateA, + systemFieldsReference: duplicateB, + payloadReference: duplicateC, + ), + ], + nextToken: nextCheckpoint, + ), + previousCheckpointReference: _reference('O'), + ); + + expect(transport.retainedSets.single, {nextCheckpoint}); + }, + ); + + test( + 'mixed duplicate and new page retains only ObjectBox-live page references', + () async { + final duplicate = [_reference('A'), _reference('B'), _reference('C')]; + final inserted = [_reference('D'), _reference('E'), _reference('F')]; + final nextCheckpoint = _reference('N'); + store.adopted + ..clear() + ..add(_leaseA); + store.liveReferences = {...inserted, nextCheckpoint}; + + await lifecycle.commitJournaledPage( + _batch( + _leaseA, + changes: [ + _change( + serverReference: duplicate[0], + systemFieldsReference: duplicate[1], + payloadReference: duplicate[2], + ), + _change( + changeId: 'new-change', + serverReference: inserted[0], + systemFieldsReference: inserted[1], + payloadReference: inserted[2], + ), + ], + nextToken: nextCheckpoint, + ), + previousCheckpointReference: null, + ); + + expect(transport.retainedSets.single, {...inserted, nextCheckpoint}); + }, + ); + + test( + 'checkpoint replacement retires the prior capability after commit and marker release', + () async { + final oldCheckpoint = _reference('O'); + final nextCheckpoint = _reference('N'); + store.adopted + ..clear() + ..add(_leaseA); + store.liveReferences = {nextCheckpoint}; + + await lifecycle.commitJournaledPage( + _batch(_leaseA, nextToken: nextCheckpoint), + previousCheckpointReference: oldCheckpoint, + ); + + expect( + timeline.where( + (event) => + event.startsWith('commit:') || + event.startsWith('release:') || + event.startsWith('ack:') || + event.startsWith('retire:'), + ), + [ + 'commit:$_leaseA:$nextCheckpoint', + 'release:$_leaseA', + 'ack:$_leaseA', + 'retire:$oldCheckpoint', + ], + ); + }, + ); + + test( + 'marker-release failure invalidates cached recovery in the same process', + () async { + store.adopted.clear(); + await lifecycle.ensureRecoveredBeforeFetch(); + store.adopted.add(_leaseA); + store.releaseFailuresRemaining = 1; + + await expectLater( + lifecycle.commitJournaledPage( + _batch(_leaseA), + previousCheckpointReference: null, + ), + throwsA(isA()), + ); + expect(store.adopted, {_leaseA}); + expect(transport.retainedSets, [{}]); + + await lifecycle.ensureRecoveredBeforeFetch(); + + expect(store.adopted, isEmpty); + expect(transport.recoverySets.last, {_leaseA}); + }, + ); + + test( + 'failed receipt acknowledgement schedules bounded cleanup in the same process', + () async { + store.adopted.clear(); + await lifecycle.ensureRecoveredBeforeFetch(); + store.adopted.add(_leaseA); + transport.acknowledgementFailuresRemaining = 1; + + await lifecycle.commitJournaledPage( + _batch(_leaseA), + previousCheckpointReference: null, + ); + expect(store.adopted, isEmpty); + expect(transport.recoverySets, [{}]); + + await lifecycle.ensureRecoveredBeforeFetch(); + + expect(transport.recoverySets, [{}, {}]); + }, + ); + + test( + 'incomplete live-reference enumeration fails closed before commit or GC', + () async { + store.adopted + ..clear() + ..add(_leaseA); + store.liveComplete = false; + + await expectLater( + lifecycle.commitJournaledPage( + _batch(_leaseA), + previousCheckpointReference: null, + ), + throwsA( + isA().having( + (failure) => failure.safeCode, + 'safeCode', + 'protected_reference_enumeration_incomplete', + ), + ), + ); + await expectLater( + lifecycle.collectOneProtectedGarbagePage(), + throwsA(isA()), + ); + expect(transport.retainedSets, isEmpty); + expect(transport.garbageCollectionCalls, 0); + expect(store.adopted, {_leaseA}); + }, + ); +} + +CloudFetchBatch _batch( + String leaseReference, { + Iterable changes = const [], + String? nextToken, +}) { + return CloudFetchBatch( + scope: CloudSyncScope( + accountFingerprint: List.filled(43, 'A').join(), + container: 'com.apple.messages.cloud', + database: 'private', + zone: 'messageManateeZone', + streamKind: CloudSyncStreamKind.messages, + schemaVersion: 2, + ), + changes: changes, + batchId: 'batch', + generation: 1, + nextToken: nextToken, + hasMore: false, + protectedPageLeaseReference: leaseReference, + ); +} + +CloudFetchedChange _change({ + String changeId = 'change', + required String serverReference, + required String systemFieldsReference, + required String payloadReference, +}) { + return CloudFetchedChange( + changeId: changeId, + recordIdHash: List.filled(43, 'R').join(), + type: CloudChangeType.save, + encryptedServerRecordId: serverReference, + protectedSystemFieldsReference: systemFieldsReference, + encryptedPayloadReference: payloadReference, + payloadSha256: List.filled(64, 'a').join(), + ); +} + +String _reference(String character) => + 'obcs2.ref.${List.filled(43, character).join()}'; + +final class _AdoptionStore + implements + CloudProtectedPageLeaseAdoptionStore, + CloudProtectedOutboundLeaseAdoptionStore { + _AdoptionStore( + Set adopted, { + Set outboundAdopted = const {}, + required this.timeline, + }) : adopted = {...adopted}, + outboundAdopted = {...outboundAdopted}; + + final Set adopted; + final Set outboundAdopted; + final List timeline; + final List events = []; + Set liveReferences = {}; + bool liveComplete = true; + int releaseFailuresRemaining = 0; + + @override + Future> readAdoptedProtectedPageLeaseReferences({ + required int maximumCount, + }) async { + events.add('read'); + timeline.add('read-adopted'); + if (adopted.length > maximumCount) throw StateError('bounded'); + return Set.unmodifiable(adopted); + } + + @override + Future> readNonterminalProtectedOutboundLeaseReferences({ + required int maximumCount, + }) async { + if (outboundAdopted.length > maximumCount) throw StateError('bounded'); + return Set.unmodifiable(outboundAdopted); + } + + @override + Future readLiveProtectedReferences({ + required int maximumCount, + }) async { + events.add('read-live'); + timeline.add('read-live'); + if (liveReferences.length > maximumCount) { + return CloudProtectedReferenceSnapshot( + references: const [], + isComplete: false, + ); + } + return CloudProtectedReferenceSnapshot( + references: liveReferences, + isComplete: liveComplete, + ); + } + + @override + Future releaseAdoptedProtectedPageLeaseReferences( + Iterable leaseReferences, + ) async { + final sorted = leaseReferences.toList()..sort(); + events.add('release:${sorted.join(',')}'); + timeline.add('release:${sorted.join(',')}'); + if (releaseFailuresRemaining > 0) { + releaseFailuresRemaining--; + throw StateError('release failed'); + } + adopted.removeAll(sorted); + } +} + +final class _LeaseTransport implements CloudProtectedPageLeaseTransport { + _LeaseTransport({required this.timeline}); + + final List timeline; + final List> recoverySets = []; + final List> recoveryLiveSets = []; + final List> retainedSets = []; + final List events = []; + int recoveryFailuresRemaining = 0; + int maximumRecoveryPageSize = 4096; + Object? commitFailure; + Object? rollbackFailure; + final absentRecoveryReferences = {}; + int unadoptedManifestsRemaining = 0; + int temporaryFilesRemaining = 0; + int garbageCollectionCalls = 0; + int acknowledgementFailuresRemaining = 0; + + @override + String get protectedPageLeaseRecoveryIdentity => _storeIdentity; + + @override + Future runProtectedStoreExclusive(Future Function() action) => + action(); + + @override + Future recoverProtectedPageLeases( + Set adoptedLeaseReferences, + CloudProtectedReferenceSnapshot liveReferences, + ) async { + recoverySets.add({...adoptedLeaseReferences}); + recoveryLiveSets.add({...liveReferences.references}); + if (recoveryFailuresRemaining > 0) { + recoveryFailuresRemaining--; + throw StateError('recovery failed'); + } + final absent = adoptedLeaseReferences + .where(absentRecoveryReferences.contains) + .toSet(); + final finalized = adoptedLeaseReferences + .where((reference) => !absent.contains(reference)) + .take(maximumRecoveryPageSize) + .toSet(); + final rolledBack = unadoptedManifestsRemaining > maximumRecoveryPageSize + ? maximumRecoveryPageSize + : unadoptedManifestsRemaining; + unadoptedManifestsRemaining -= rolledBack; + final removedTemporaryFiles = + temporaryFilesRemaining > maximumRecoveryPageSize + ? maximumRecoveryPageSize + : temporaryFilesRemaining; + temporaryFilesRemaining -= removedTemporaryFiles; + return CloudProtectedPageLeaseRecoveryResult( + finalizedAdoptedLeaseReferences: finalized, + absentAdoptedLeaseReferences: absent, + rolledBackCount: rolledBack, + removedTemporaryFilesCount: removedTemporaryFiles, + hasMore: + adoptedLeaseReferences.length > finalized.length + absent.length || + unadoptedManifestsRemaining > 0 || + temporaryFilesRemaining > 0, + ); + } + + @override + Future commitProtectedPageLease( + String leaseReference, + Set retainedReferences, + ) async { + final retained = retainedReferences.toList()..sort(); + retainedSets.add({...retainedReferences}); + events.add('commit:$leaseReference:${retained.join(',')}'); + timeline.add('commit:$leaseReference:${retained.join(',')}'); + final failure = commitFailure; + if (failure != null) throw failure; + } + + @override + Future acknowledgeCommittedPageLease(String leaseReference) async { + events.add('ack:$leaseReference'); + timeline.add('ack:$leaseReference'); + if (acknowledgementFailuresRemaining > 0) { + acknowledgementFailuresRemaining--; + throw StateError('acknowledgement failed'); + } + } + + @override + Future collectProtectedGarbage( + CloudProtectedReferenceSnapshot liveReferences, + ) async { + garbageCollectionCalls++; + return const CloudProtectedGarbageCollectionResult( + scannedCount: 0, + firstObservedCount: 0, + deletedCount: 0, + preservedLiveCount: 0, + preservedActiveLeaseCount: 0, + hasMore: false, + ); + } + + @override + Future retireProtectedReferences(Set references) async { + final sorted = references.toList()..sort(); + events.add('retire:${sorted.join(',')}'); + timeline.add('retire:${sorted.join(',')}'); + return references.length; + } + + @override + Future rollbackProtectedPageLease(String leaseReference) async { + events.add('rollback:$leaseReference'); + timeline.add('rollback:$leaseReference'); + final failure = rollbackFailure; + if (failure != null) throw failure; + } +} diff --git a/test/services/cloud_sync/cloud_shadow_journal_budget_test.dart b/test/services/cloud_sync/cloud_shadow_journal_budget_test.dart new file mode 100644 index 0000000000..27f4acd9ec --- /dev/null +++ b/test/services/cloud_sync/cloud_shadow_journal_budget_test.dart @@ -0,0 +1,274 @@ +import 'package:bluebubbles/services/rustpush/cloud_sync/cloud_shadow_journal_budget.dart'; +import 'package:bluebubbles/services/rustpush/cloud_sync/cloud_sync_models.dart'; +import 'package:bluebubbles/services/rustpush/cloud_sync/cloud_sync_store.dart'; +import 'package:bluebubbles/services/rustpush/cloud_sync/in_memory_cloud_sync_store.dart'; +import 'package:flutter_test/flutter_test.dart'; + +import 'cloud_sync_test_helpers.dart'; + +void main() { + late InMemoryCloudSyncStore store; + late CloudSyncScope scope; + final fences = {}; + + setUp(() { + store = InMemoryCloudSyncStore(); + scope = testScope(); + fences.clear(); + }); + + Future journalShadow( + CloudFetchBatch value, { + required DateTime now, + required CloudShadowJournalBudget budget, + }) async { + final scoped = value.scope; + final fence = fences[scoped.storageKey] ??= (await store + .tryAcquireCoordinatorLease( + scoped, + ownerId: 'budget-test-${scoped.accountFingerprint}', + now: now, + leaseDuration: const Duration(days: 1), + ))!; + final checkpoint = await store.readCheckpoint(scoped); + return store.journalShadowFetchedBatch( + value, + now: now, + budget: budget, + leaseFence: fence, + expectedGeneration: checkpoint.generation, + expectedFetchedToken: checkpoint.fetchedToken, + ); + } + + Future journalGeneral( + CloudFetchBatch value, { + required DateTime now, + }) async { + final scoped = value.scope; + final fence = fences[scoped.storageKey] ??= (await store + .tryAcquireCoordinatorLease( + scoped, + ownerId: 'budget-test-${scoped.accountFingerprint}', + now: now, + leaseDuration: const Duration(days: 1), + ))!; + final checkpoint = await store.readCheckpoint(scoped); + return store.journalFetchedBatch( + value, + now: now, + leaseFence: fence, + expectedGeneration: checkpoint.generation, + expectedFetchedToken: checkpoint.fetchedToken, + ); + } + + CloudFetchBatch batch({ + required String id, + required String? token, + required List changes, + CloudSyncScope? scoped, + }) { + return CloudFetchBatch( + scope: scoped ?? scope, + changes: changes, + batchId: id, + generation: 1, + nextToken: token, + hasMore: false, + ); + } + + test( + 'accepts exact entry and byte boundaries, then blocks without mutation', + () async { + final estimator = CloudShadowJournalBudget(); + final change = testChange(1); + const batchId = 'exact-boundary'; + final exactBytes = estimator.estimateEntryBytes( + scope: scope, + batchId: batchId, + change: change, + ); + final budget = CloudShadowJournalBudget( + maximumEntriesPerScope: 1, + maximumEstimatedBytesPerScope: exactBytes, + ); + + final accepted = await journalShadow( + batch(id: batchId, token: 'token-1', changes: [change]), + now: testEpoch, + budget: budget, + ); + expect(accepted.admitted, isTrue); + expect(accepted.usage.pendingEntries, 1); + expect(accepted.usage.estimatedBytes, exactBytes); + + final blocked = await journalShadow( + batch( + id: 'must-not-commit', + token: 'token-2', + changes: [testChange(2)], + ), + now: testEpoch, + budget: budget, + ); + expect(blocked.blockReason, CloudShadowJournalBlockReason.maximumEntries); + expect((await store.readCheckpoint(scope)).fetchedToken, 'token-1'); + expect(await store.inboxEntries(scope), hasLength(1)); + }, + ); + + test( + 'rejects a page that would cross the entry boundary atomically', + () async { + final budget = CloudShadowJournalBudget( + maximumEntriesPerScope: 1, + maximumEstimatedBytesPerScope: 1024 * 1024, + ); + + final admission = await journalShadow( + batch( + id: 'oversized-page', + token: 'must-not-commit', + changes: [testChange(1), testChange(2)], + ), + now: testEpoch, + budget: budget, + ); + + expect( + admission.blockReason, + CloudShadowJournalBlockReason.maximumEntries, + ); + expect(admission.rejectedEntries, 2); + expect(await store.inboxEntries(scope), isEmpty); + expect((await store.readCheckpoint(scope)).fetchedToken, isNull); + expect((await store.readCheckpoint(scope)).fetchedSequence, 0); + }, + ); + + test('rejects one byte over the deterministic estimate boundary', () async { + final estimator = CloudShadowJournalBudget(); + final change = testChange(1); + const batchId = 'byte-boundary'; + final estimated = estimator.estimateEntryBytes( + scope: scope, + batchId: batchId, + change: change, + ); + final budget = CloudShadowJournalBudget( + maximumEstimatedBytesPerScope: estimated - 1, + ); + + final admission = await journalShadow( + batch(id: batchId, token: 'must-not-commit', changes: [change]), + now: testEpoch, + budget: budget, + ); + + expect( + admission.blockReason, + CloudShadowJournalBlockReason.maximumEstimatedBytes, + ); + expect(admission.rejectedEntries, 1); + expect(await store.inboxEntries(scope), isEmpty); + expect((await store.readCheckpoint(scope)).fetchedToken, isNull); + }); + + test('age boundary is deterministic and never prunes pending data', () async { + await journalGeneral( + batch(id: 'legacy-page', token: 'legacy-token', changes: [testChange(1)]), + now: testEpoch, + ); + final budget = CloudShadowJournalBudget( + maximumPendingAge: const Duration(days: 1), + ); + final usage = await store.readShadowJournalUsage(scope, budget: budget); + + expect( + budget.blockReasonForCurrentUsage( + usage, + now: testEpoch.add(const Duration(days: 1)), + ), + isNull, + ); + expect( + budget.blockReasonForCurrentUsage( + usage, + now: testEpoch.add(const Duration(days: 1, microseconds: 1)), + ), + CloudShadowJournalBlockReason.maximumAge, + ); + expect(await store.inboxEntries(scope), hasLength(1)); + expect((await store.readCheckpoint(scope)).fetchedToken, 'legacy-token'); + }); + + test( + 'usage and admission limits are isolated by full account scope', + () async { + final other = testScope(account: testAccountFingerprintB); + final budget = CloudShadowJournalBudget(maximumEntriesPerScope: 1); + await journalShadow( + batch(id: 'scope-a', token: 'token-a', changes: [testChange(1)]), + now: testEpoch, + budget: budget, + ); + + final otherAdmission = await journalShadow( + batch( + id: 'scope-b', + token: 'token-b', + changes: [testChange(2)], + scoped: other, + ), + now: testEpoch, + budget: budget, + ); + + expect(otherAdmission.admitted, isTrue); + expect( + (await store.readShadowJournalUsage( + scope, + budget: budget, + )).pendingEntries, + 1, + ); + expect( + (await store.readShadowJournalUsage( + other, + budget: budget, + )).pendingEntries, + 1, + ); + }, + ); + + test( + 'applied records are retained but no longer consume pending budget', + () async { + final budget = CloudShadowJournalBudget(maximumEntriesPerScope: 1); + await journalShadow( + batch(id: 'applied-page', token: 'token-1', changes: [testChange(1)]), + now: testEpoch, + budget: budget, + ); + await store.markInboxApplied( + scope, + sequence: 1, + now: testEpoch, + leaseFence: fences[scope.storageKey]!, + ); + + final usage = await store.readShadowJournalUsage(scope, budget: budget); + expect(usage.pendingEntries, 0); + expect(usage.estimatedBytes, 0); + expect(usage.oldestPendingAt, isNull); + expect(await store.inboxEntries(scope), hasLength(1)); + expect( + (await store.inboxEntries(scope)).single.status, + CloudInboxStatus.applied, + ); + }, + ); +} diff --git a/test/services/cloud_sync/cloud_sync_android_work_policy_test.dart b/test/services/cloud_sync/cloud_sync_android_work_policy_test.dart new file mode 100644 index 0000000000..164478e940 --- /dev/null +++ b/test/services/cloud_sync/cloud_sync_android_work_policy_test.dart @@ -0,0 +1,58 @@ +import 'package:bluebubbles/services/rustpush/cloud_sync/cloud_sync_android_work_policy.dart'; +import 'package:flutter_test/flutter_test.dart'; + +void main() { + test( + 'metadata work is battery safe and delays coalesced work by 15 seconds', + () { + final policy = CloudSyncAndroidWorkPolicy.forKind( + CloudSyncAndroidWorkKind.metadata, + ); + + expect( + policy.networkRequirement, + CloudSyncAndroidNetworkRequirement.connected, + ); + expect(policy.requiresBatteryNotLow, isTrue); + expect(policy.requiresStorageNotLow, isTrue); + expect(policy.coalescingDelay, const Duration(seconds: 15)); + expect(policy.requestsExpeditedExecution, isFalse); + }, + ); + + test('automatic media is deferred to unmetered network', () { + final policy = CloudSyncAndroidWorkPolicy.forKind( + CloudSyncAndroidWorkKind.automaticMedia, + ); + + expect( + policy.networkRequirement, + CloudSyncAndroidNetworkRequirement.unmetered, + ); + expect(policy.requiresBatteryNotLow, isTrue); + expect(policy.requiresStorageNotLow, isTrue); + expect(policy.requestsExpeditedExecution, isFalse); + }); + + test('a user-visible event is modeled but not silently expedited', () { + final policy = CloudSyncAndroidWorkPolicy.forKind( + CloudSyncAndroidWorkKind.userVisibleManual, + ); + + expect(policy.requestsExpeditedExecution, isFalse); + }); + + test('unique work names require a complete scope hash', () { + const hash = + '0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef'; + + expect( + CloudSyncAndroidWorkPolicy.uniqueWorkNameForScopeHash(hash), + 'cloud-sync-v2/$hash', + ); + expect( + () => CloudSyncAndroidWorkPolicy.uniqueWorkNameForScopeHash('account-a'), + throwsArgumentError, + ); + }); +} diff --git a/test/services/cloud_sync/cloud_sync_engine_test.dart b/test/services/cloud_sync/cloud_sync_engine_test.dart new file mode 100644 index 0000000000..b5a41c9eb8 --- /dev/null +++ b/test/services/cloud_sync/cloud_sync_engine_test.dart @@ -0,0 +1,2441 @@ +import 'dart:async'; + +import 'package:bluebubbles/services/rustpush/cloud_sync/cloud_sync_backoff.dart'; +import 'package:bluebubbles/services/rustpush/cloud_sync/cloud_sync_cancellation.dart'; +import 'package:bluebubbles/services/rustpush/cloud_sync/cloud_sync_engine.dart'; +import 'package:bluebubbles/services/rustpush/cloud_sync/cloud_sync_models.dart'; +import 'package:bluebubbles/services/rustpush/cloud_sync/cloud_sync_observability.dart'; +import 'package:bluebubbles/services/rustpush/cloud_sync/cloud_sync_store.dart'; +import 'package:bluebubbles/services/rustpush/cloud_sync/cloud_shadow_journal_budget.dart'; +import 'package:bluebubbles/services/rustpush/cloud_sync/cloud_sync_testing.dart'; +import 'package:bluebubbles/services/rustpush/cloud_sync/cloud_sync_transport.dart'; +import 'package:bluebubbles/services/rustpush/cloud_sync/cloud_sync_write_transport.dart'; +import 'package:bluebubbles/services/rustpush/cloud_sync/cloud_sync_writer_authority.dart'; +import 'package:bluebubbles/services/rustpush/cloud_sync/cloudkit_operation_interlock.dart'; +import 'package:bluebubbles/services/rustpush/cloud_sync/cloud_sync_shadow_transport.dart'; +import 'package:bluebubbles/services/rustpush/cloud_sync/in_memory_cloud_sync_store.dart'; +import 'package:bluebubbles/services/rustpush/cloud_sync/shadow_only_cloud_sync_store.dart'; +import 'package:flutter_test/flutter_test.dart'; + +import 'cloud_sync_test_helpers.dart'; + +void main() { + late CloudSyncScope scope; + late InMemoryCloudSyncStore store; + late FakeCloudSyncTransport transport; + late FakeCloudInboxApplier applier; + late FakeCloudSyncWriterAuthority writerAuthority; + late FakeCloudKitOperationExclusion writerExclusion; + late MutableTestClock clock; + + CloudSyncEngine engine({ + CloudSyncFeatureFlags flags = const CloudSyncFeatureFlags( + readOnlyFetch: true, + semanticApply: true, + saves: true, + ), + int batchSize = 256, + int maximumInboxEntriesPerRun = 512, + int maximumOutboxBatches = 8, + Duration fetchOperationTimeout = const Duration(seconds: 45), + Duration writeOperationTimeout = const Duration(seconds: 45), + int maximumDeferredAttempts = 8, + Duration maximumDeferredAge = const Duration(days: 3), + Duration pausedRetryDelay = const Duration(hours: 6), + Duration coordinatorLeaseDuration = const Duration(minutes: 5), + Duration outboxLeaseDuration = const Duration(minutes: 2), + MemoryCloudSyncObserver? observer, + String coordinatorId = 'coordinator-a', + CloudShadowJournalBudget? shadowJournalBudget, + CloudSyncWriterAuthority? writerAuthorityOverride, + }) { + return CloudSyncEngine( + scope: scope, + coordinatorId: coordinatorId, + store: store, + transport: transport, + inboxApplier: applier, + writerAuthority: flags.saves + ? writerAuthorityOverride ?? writerAuthority + : null, + writerExclusion: flags.saves ? writerExclusion : null, + backoff: CloudSyncBackoffPolicy( + baseDelay: const Duration(seconds: 10), + maximumDelay: const Duration(minutes: 1), + randomUnit: () => 1, + ), + observer: observer ?? MemoryCloudSyncObserver(), + clock: clock.call, + config: CloudSyncEngineConfig( + maximumBatchSize: batchSize, + maximumInboxEntriesPerRun: maximumInboxEntriesPerRun, + maximumOutboxBatchesPerRun: maximumOutboxBatches, + fetchOperationTimeout: fetchOperationTimeout, + writeOperationTimeout: writeOperationTimeout, + maximumDeferredAttempts: maximumDeferredAttempts, + maximumDeferredAge: maximumDeferredAge, + pausedRetryDelay: pausedRetryDelay, + coordinatorLeaseDuration: coordinatorLeaseDuration, + outboxLeaseDuration: outboxLeaseDuration, + shadowJournalBudget: shadowJournalBudget ?? CloudShadowJournalBudget(), + flags: flags, + ), + ); + } + + setUp(() { + scope = testScope(); + store = InMemoryCloudSyncStore(); + transport = FakeCloudSyncTransport(); + applier = FakeCloudInboxApplier(); + writerAuthority = FakeCloudSyncWriterAuthority(); + writerExclusion = FakeCloudKitOperationExclusion(); + clock = MutableTestClock(testEpoch); + }); + + Future seedGeneralJournal( + CloudFetchBatch batch, { + required DateTime now, + }) async { + const ownerId = 'engine-test-seed'; + final fence = (await store.tryAcquireCoordinatorLease( + batch.scope, + ownerId: ownerId, + now: now, + leaseDuration: const Duration(minutes: 5), + ))!; + final checkpoint = await store.readCheckpoint(batch.scope); + try { + await store.journalFetchedBatch( + batch, + now: now, + leaseFence: fence, + expectedGeneration: checkpoint.generation, + expectedFetchedToken: checkpoint.fetchedToken, + ); + } finally { + await store.releaseCoordinatorLease(batch.scope, leaseFence: fence); + } + } + + Future seedPausedOutbox( + CloudOutboxOperation operation, { + required CloudFailureCategory category, + }) async { + await store.enqueueOutbox(operation); + final leased = await store.leaseEligibleOutbox( + operation.scope, + now: clock.value, + limit: 1, + leaseId: 'seed-lease-${operation.operationId}', + leaseDuration: const Duration(minutes: 2), + allowedActions: {operation.action}, + ); + expect(leased.single.operationId, operation.operationId); + await store.applyOutboxTransitions( + operation.scope, + leaseId: 'seed-lease-${operation.operationId}', + transitions: [ + CloudOutboxTransition.paused(operation.operationId, category: category), + ], + now: clock.value, + ); + } + + Future seedAmbiguousOutbox(int index) async { + final operation = testOutboxOperation(scope, index); + await store.enqueueOutbox(operation); + transport.enqueuePushResult( + CloudPushBatchResult( + outcomes: [ + CloudPushOutcome( + operationId: operation.operationId, + disposition: CloudPushDisposition.unknownOutcome, + failureCategory: CloudFailureCategory.unknown, + ), + ], + ), + ); + await engine( + flags: const CloudSyncFeatureFlags(readOnlyFetch: false, saves: true), + maximumOutboxBatches: 1, + ).synchronize(trigger: CloudSyncTrigger.localOutbox); + expect( + (await store.outboxEntries(scope)).single.status, + CloudOutboxStatus.unknownOutcome, + ); + return (await store.outboxEntries(scope)).single; + } + + CloudUnknownOutcomeProof proofFor( + CloudOutboxOperation operation, { + String? operationId, + String? appleRequestUuid, + String? appleOperationUuid, + String? protectedProofReference, + }) { + return CloudUnknownOutcomeProof( + operationId: operationId ?? operation.operationId, + appleRequestUuid: appleRequestUuid ?? operation.appleRequestUuid!, + appleOperationUuid: appleOperationUuid ?? operation.appleOperationUuid!, + scopeStorageKey: operation.scope.storageKey, + checkpointGeneration: operation.checkpointGeneration, + logicalEntityKeyHash: operation.logicalEntityKeyHash, + serverRecordIdHash: operation.serverRecordIdHash!, + action: operation.action, + expectedPayloadSha256: operation.payloadSha256, + protectedProofReference: + protectedProofReference ?? operation.encryptedPayloadReference!, + observedEtagHash: 'test-observed-etag-hash', + ); + } + + test('fetches, journals, applies, and advances checkpoint', () async { + transport.enqueueFetchBatch( + CloudFetchBatch( + scope: scope, + changes: [testChange(1), testChange(2)], + batchId: 'batch-1', + generation: 1, + nextToken: 'opaque-token', + hasMore: false, + ), + ); + + final result = await engine().synchronize(trigger: CloudSyncTrigger.manual); + + expect(result.status, CloudSyncRunStatus.completed); + expect(writerExclusion.runCallCount, 1); + expect(writerExclusion.observedKinds, [CloudKitOperationKind.v2ReadWrite]); + expect(result.counters.fetched, 2); + expect(result.counters.applied, 2); + expect(applier.appliedLeaseFences, hasLength(2)); + expect( + applier.appliedLeaseFences.every( + (fence) => fence.ownerId.isNotEmpty && fence.generation > 0, + ), + isTrue, + ); + final checkpoint = await store.readCheckpoint(scope); + expect(checkpoint.fetchedToken, 'opaque-token'); + expect(checkpoint.lastAppliedSequence, 2); + expect(store.runs, hasLength(1)); + expect(store.runs.single.architectureName, 'generic'); + expect(store.runs.single.modeName, 'durable-saves/completed'); + }); + + test( + 'semantic startup applies existing inbox before transport fetch', + () async { + await seedGeneralJournal( + CloudFetchBatch( + scope: scope, + changes: [testChange(1)], + batchId: 'batch-preexisting', + generation: 1, + nextToken: 'preexisting-token', + hasMore: false, + ), + now: clock.value, + ); + transport.fetchHandler = (scope, previousToken, generation, limit) async { + expect(previousToken, 'preexisting-token'); + expect(applier.appliedSequences, [1]); + return CloudFetchBatch( + scope: scope, + changes: const [], + batchId: 'batch-after-startup-apply', + generation: generation, + nextToken: 'post-startup-token', + hasMore: false, + ); + }; + + final result = await engine().synchronize( + trigger: CloudSyncTrigger.startup, + ); + + expect(result.status, CloudSyncRunStatus.completed); + expect(result.counters.applied, 1); + expect(applier.appliedSequences, [1]); + expect(transport.fetchCallCount, 1); + expect((await store.readCheckpoint(scope)).lastAppliedSequence, 1); + }, + ); + + test( + 'semantic rows fetched in this run apply after transport fetch', + () async { + var fetchCompleted = false; + transport.fetchHandler = (scope, previousToken, generation, limit) async { + expect(applier.appliedSequences, isEmpty); + fetchCompleted = true; + return CloudFetchBatch( + scope: scope, + changes: [testChange(1)], + batchId: 'batch-newly-fetched', + generation: generation, + nextToken: 'newly-fetched-token', + hasMore: false, + ); + }; + applier.handler = (entry) async { + expect(fetchCompleted, isTrue); + return const CloudInboxApplyResult.applied(); + }; + + final result = await engine().synchronize( + trigger: CloudSyncTrigger.manual, + ); + + expect(result.status, CloudSyncRunStatus.completed); + expect(result.counters.fetched, 1); + expect(result.counters.applied, 1); + expect(applier.appliedSequences, [1]); + }, + ); + + test( + 'semantic inbox cap is shared across startup and post-fetch phases', + () async { + await seedGeneralJournal( + CloudFetchBatch( + scope: scope, + changes: [testChange(1)], + batchId: 'batch-cap-preexisting', + generation: 1, + nextToken: 'cap-preexisting-token', + hasMore: false, + ), + now: clock.value, + ); + transport.enqueueFetchBatch( + CloudFetchBatch( + scope: scope, + changes: [testChange(2), testChange(3)], + batchId: 'batch-cap-new', + generation: 1, + nextToken: 'cap-new-token', + hasMore: false, + ), + ); + final observer = MemoryCloudSyncObserver(); + + final result = await engine( + maximumInboxEntriesPerRun: 2, + observer: observer, + ).synchronize(trigger: CloudSyncTrigger.manual); + + expect(result.status, CloudSyncRunStatus.completed); + expect(result.counters.applied, 2); + expect(applier.appliedSequences, [1, 2]); + expect(transport.fetchCallCount, 1); + final entries = await store.inboxEntries(scope); + expect(entries.map((entry) => entry.status), [ + CloudInboxStatus.applied, + CloudInboxStatus.applied, + CloudInboxStatus.pending, + ]); + final inboxEvents = observer.events + .where((event) => event.type == CloudSyncEventType.inboxApplied) + .toList(); + expect(inboxEvents, hasLength(1)); + expect(inboxEvents.single.count, 2); + }, + ); + + test('semanticApply false keeps fetch-only behavior unchanged', () async { + await seedGeneralJournal( + CloudFetchBatch( + scope: scope, + changes: [testChange(1)], + batchId: 'batch-semantic-disabled-existing', + generation: 1, + nextToken: 'semantic-disabled-token', + hasMore: false, + ), + now: clock.value, + ); + transport.enqueueFetchBatch( + CloudFetchBatch( + scope: scope, + changes: [testChange(2)], + batchId: 'batch-semantic-disabled-new', + generation: 1, + nextToken: 'semantic-disabled-new-token', + hasMore: false, + ), + ); + const flags = CloudSyncFeatureFlags( + readOnlyFetch: true, + semanticApply: false, + saves: false, + deletions: false, + profiles: false, + notificationHints: false, + ); + + final result = await engine( + flags: flags, + ).synchronize(trigger: CloudSyncTrigger.startup); + + expect(result.status, CloudSyncRunStatus.completed); + expect(result.counters.fetched, 1); + expect(result.counters.applied, 0); + expect(applier.appliedSequences, isEmpty); + expect( + (await store.inboxEntries( + scope, + )).every((entry) => entry.status == CloudInboxStatus.pending), + isTrue, + ); + }); + + test('read-only shadow does not recover or inspect outbox leases', () async { + final trackingStore = _RecoveryTrackingStore(); + final shadowEngine = CloudSyncEngine( + scope: scope, + coordinatorId: 'shadow-coordinator', + store: trackingStore, + transport: transport, + inboxApplier: applier, + clock: clock.call, + config: CloudSyncEngineConfig( + maximumFetchPagesPerRun: 1, + maximumBatchSize: 50, + flags: const CloudSyncFeatureFlags( + readOnlyFetch: true, + semanticApply: false, + saves: false, + deletions: false, + profiles: false, + notificationHints: false, + ), + ), + ); + + final result = await shadowEngine.synchronize( + trigger: CloudSyncTrigger.manual, + ); + + expect(result.status, CloudSyncRunStatus.completed); + expect(trackingStore.recoverExpiredOutboxLeaseCalls, 0); + expect(transport.pushCallCount, 0); + expect(applier.appliedSequences, isEmpty); + }); + + test('save-enabled engine requires an explicit writer authority', () { + expect( + () => CloudSyncEngine( + scope: scope, + coordinatorId: 'missing-writer-authority', + store: store, + transport: transport, + inboxApplier: applier, + config: CloudSyncEngineConfig( + flags: const CloudSyncFeatureFlags(readOnlyFetch: false, saves: true), + ), + ), + throwsArgumentError, + ); + }); + + test('save-enabled engine requires unknown-outcome leasing support', () { + expect( + () => CloudSyncEngine( + scope: scope, + coordinatorId: 'missing-unknown-outcome-store', + store: ShadowOnlyCloudSyncStore(store), + transport: transport, + inboxApplier: applier, + writerAuthority: writerAuthority, + writerExclusion: writerExclusion, + config: CloudSyncEngineConfig( + flags: const CloudSyncFeatureFlags(readOnlyFetch: false, saves: true), + ), + ), + throwsArgumentError, + ); + }); + + test('save-enabled engine requires the cross-process writer exclusion', () { + expect( + () => CloudSyncEngine( + scope: scope, + coordinatorId: 'missing-writer-exclusion', + store: store, + transport: transport, + inboxApplier: applier, + writerAuthority: writerAuthority, + config: CloudSyncEngineConfig( + flags: const CloudSyncFeatureFlags(readOnlyFetch: false, saves: true), + ), + ), + throwsArgumentError, + ); + }); + + test('save-enabled engine requires native operation quiescence', () { + final transportWithoutQuiescence = AccountBoundShadowTransport( + delegate: transport, + readActiveFingerprint: () async => scope.accountFingerprint, + expectedFingerprint: scope.accountFingerprint, + ); + + expect( + () => CloudSyncEngine( + scope: scope, + coordinatorId: 'missing-native-quiescence', + store: store, + transport: transportWithoutQuiescence, + inboxApplier: applier, + writerAuthority: writerAuthority, + writerExclusion: writerExclusion, + config: CloudSyncEngineConfig( + flags: const CloudSyncFeatureFlags(readOnlyFetch: false, saves: true), + ), + ), + throwsA( + isA().having( + (error) => error.message, + 'message', + 'cloud_sync_native_operation_quiescence_required', + ), + ), + ); + }); + + test('save-enabled protected writer requires durable recovery stores', () { + transport = _RecoveryOrderedProtectedWriteTransport(events: []); + + expect( + () => engine( + flags: const CloudSyncFeatureFlags(readOnlyFetch: false, saves: true), + ), + throwsA( + isA().having( + (error) => error.message, + 'message', + 'cloud_sync_native_protected_writer_recovery_required', + ), + ), + ); + }); + + test( + 'local outbox recovers protected store before reconcile and preflight', + () async { + store = _ProtectedRecoveryTrackingStore(); + final events = []; + transport = _RecoveryOrderedProtectedWriteTransport(events: events); + + // Prime the process-wide startup cache before creating the adopted + // outbound rows. The write run must still perform a fresh pass. + await engine( + flags: const CloudSyncFeatureFlags(readOnlyFetch: true, saves: false), + ).synchronize(trigger: CloudSyncTrigger.startup); + events.clear(); + + final ambiguous = await seedAmbiguousOutbox(711); + final ready = testOutboxOperation(scope, 712); + await store.enqueueOutbox(ready); + (store as _ProtectedRecoveryTrackingStore).outboundLeaseReferences.addAll( + [ambiguous.protectedLeaseReference!, ready.protectedLeaseReference!], + ); + events.clear(); + + final result = await engine( + flags: const CloudSyncFeatureFlags(readOnlyFetch: false, saves: true), + maximumOutboxBatches: 1, + ).synchronize(trigger: CloudSyncTrigger.localOutbox); + + expect(result.status, CloudSyncRunStatus.completed); + expect(events, ['recover', 'reconcile', 'prepare']); + }, + ); + + test('write operation timeout is bounded and positive', () { + expect( + () => CloudSyncEngineConfig(writeOperationTimeout: Duration.zero), + throwsA( + isA().having( + (error) => error.message, + 'message', + 'cloud_sync_config_write_timeout_invalid', + ), + ), + ); + expect( + () => CloudSyncEngineConfig( + writeOperationTimeout: const Duration(minutes: 5, microseconds: 1), + ), + throwsA( + isA().having( + (error) => error.message, + 'message', + 'cloud_sync_config_write_timeout_invalid', + ), + ), + ); + }); + + test('revoked V2 permit blocks transport immediately before push', () async { + await store.enqueueOutbox(testOutboxOperation(scope, 700)); + writerAuthority.verifyHandler = (call) async { + if (call == 2) writerAuthority.allowVerify = false; + }; + + final result = await engine( + flags: const CloudSyncFeatureFlags(readOnlyFetch: false, saves: true), + maximumOutboxBatches: 1, + ).synchronize(trigger: CloudSyncTrigger.localOutbox); + + expect(result.status, CloudSyncRunStatus.failed); + expect(result.failureCategory, CloudFailureCategory.authorization); + expect(writerAuthority.issueCallCount, 1); + expect(writerAuthority.verifyCallCount, 2); + expect(transport.pushCallCount, 0); + }); + + test( + 'permit revocation after submission freezes the ambiguous operation', + () async { + final operation = testOutboxOperation(scope, 701); + await store.enqueueOutbox(operation); + writerAuthority.verifyHandler = (call) async { + if (call == 5) writerAuthority.allowVerify = false; + }; + transport.enqueuePushResult( + CloudPushBatchResult( + outcomes: [ + CloudPushOutcome( + operationId: operation.operationId, + disposition: CloudPushDisposition.confirmed, + ), + ], + ), + ); + + final result = await engine( + flags: const CloudSyncFeatureFlags(readOnlyFetch: false, saves: true), + maximumOutboxBatches: 1, + ).synchronize(trigger: CloudSyncTrigger.localOutbox); + + expect(result.counters.confirmed, 0); + expect(transport.pushCallCount, 1); + expect(writerAuthority.verifyCallCount, 5); + expect( + (await store.outboxEntries(scope)).single.status, + CloudOutboxStatus.unknownOutcome, + ); + + writerAuthority + ..allowVerify = true + ..verifyHandler = null; + clock.advance(const Duration(minutes: 3)); + await engine( + flags: const CloudSyncFeatureFlags(readOnlyFetch: false, saves: true), + maximumOutboxBatches: 1, + ).synchronize(trigger: CloudSyncTrigger.localOutbox); + expect(transport.pushCallCount, 1); + }, + ); + + test('failed write preflight never marks or sends the operation', () async { + final operation = testOutboxOperation(scope, 702); + await store.enqueueOutbox(operation); + transport.writePreflightHandler = (_, _, _) async => throw CloudSyncFailure( + category: CloudFailureCategory.authorization, + safeCode: 'simulated_write_preflight_failure', + ); + + final result = await engine( + flags: const CloudSyncFeatureFlags(readOnlyFetch: false, saves: true), + maximumOutboxBatches: 1, + ).synchronize(trigger: CloudSyncTrigger.localOutbox); + + final stored = (await store.outboxEntries(scope)).single; + expect(result.status, CloudSyncRunStatus.completed); + expect(stored.status, CloudOutboxStatus.paused); + expect(stored.appleRequestUuid, isNull); + expect(stored.appleOperationUuid, isNull); + expect(transport.prepareSubmissionCallCount, 1); + expect(transport.consumePreparedSubmissionCallCount, 0); + expect(transport.pushCallCount, 0); + }); + + test('permit revocation at consume freezes without sending', () async { + final operation = testOutboxOperation(scope, 704); + await store.enqueueOutbox(operation); + writerAuthority.verifyHandler = (call) async { + if (call == 4) writerAuthority.allowVerify = false; + }; + + final result = await engine( + flags: const CloudSyncFeatureFlags(readOnlyFetch: false, saves: true), + maximumOutboxBatches: 1, + ).synchronize(trigger: CloudSyncTrigger.localOutbox); + + final stored = (await store.outboxEntries(scope)).single; + expect(result.status, CloudSyncRunStatus.completed); + expect(stored.status, CloudOutboxStatus.unknownOutcome); + expect(stored.appleRequestUuid, isNotNull); + expect(stored.appleOperationUuid, isNotNull); + expect(transport.prepareSubmissionCallCount, 1); + expect(transport.consumePreparedSubmissionCallCount, 0); + expect(transport.pushCallCount, 0); + }); + + test('failed submission marker drops the prepared request unsent', () async { + store = _FailingSubmissionMarkerStore(); + final operation = testOutboxOperation(scope, 703); + await store.enqueueOutbox(operation); + transport.writePreflightHandler = (_, _, operations) async { + expect(() => operations.clear(), throwsUnsupportedError); + }; + + final result = await engine( + flags: const CloudSyncFeatureFlags(readOnlyFetch: false, saves: true), + maximumOutboxBatches: 1, + ).synchronize(trigger: CloudSyncTrigger.localOutbox); + + final stored = (await store.outboxEntries(scope)).single; + expect(result.status, CloudSyncRunStatus.failed); + expect(result.failureCategory, CloudFailureCategory.localStorage); + expect(stored.appleRequestUuid, isNull); + expect(stored.appleOperationUuid, isNull); + expect(transport.prepareSubmissionCallCount, 1); + expect(transport.consumePreparedSubmissionCallCount, 0); + expect(transport.pushCallCount, 0); + }); + + test( + 'terminal quarantine advances the floor without dropping later data', + () async { + transport.enqueueFetchBatch( + CloudFetchBatch( + scope: scope, + changes: [testChange(1), testChange(2)], + batchId: 'batch-1', + generation: 1, + nextToken: 'opaque-token', + hasMore: false, + ), + ); + applier.resultsBySequence[1] = const CloudInboxApplyResult.quarantined( + failureCategory: CloudFailureCategory.malformedRecord, + ); + + final result = await engine().synchronize( + trigger: CloudSyncTrigger.manual, + ); + + expect(result.counters.quarantined, 1); + expect(result.counters.applied, 1); + expect((await store.readCheckpoint(scope)).lastAppliedSequence, 2); + final entries = await store.inboxEntries(scope); + expect(entries[0].status, CloudInboxStatus.quarantined); + expect(entries[1].status, CloudInboxStatus.applied); + }, + ); + + test( + 'deferred predecessor blocks later sequence until it succeeds', + () async { + await seedGeneralJournal( + CloudFetchBatch( + scope: scope, + changes: [testChange(1), testChange(2)], + batchId: 'batch-contiguous-deferred', + generation: 1, + nextToken: 'opaque-token', + hasMore: false, + ), + now: clock.value, + ); + expect( + (await store.readEligibleInbox( + scope, + now: clock.value, + limit: 256, + )).map((entry) => entry.sequence), + [1], + ); + + applier.resultsBySequence[1] = const CloudInboxApplyResult.deferred(); + const readOnlySemanticFlags = CloudSyncFeatureFlags( + readOnlyFetch: true, + semanticApply: true, + saves: false, + deletions: false, + profiles: false, + notificationHints: false, + ); + final first = await engine( + flags: readOnlySemanticFlags, + ).synchronize(trigger: CloudSyncTrigger.manual); + + expect(first.counters.deferred, 1); + expect(applier.appliedSequences, [1]); + expect((await store.readCheckpoint(scope)).lastAppliedSequence, 0); + + applier.resultsBySequence[1] = const CloudInboxApplyResult.applied(); + clock.advance(const Duration(seconds: 10)); + final second = await engine( + flags: readOnlySemanticFlags, + ).synchronize(trigger: CloudSyncTrigger.manual); + + expect(second.counters.applied, 2); + expect(applier.appliedSequences, [1, 1, 2]); + expect((await store.readCheckpoint(scope)).lastAppliedSequence, 2); + }, + ); + + test( + 'retryable predecessor also blocks later sequence until it succeeds', + () async { + await seedGeneralJournal( + CloudFetchBatch( + scope: scope, + changes: [testChange(1), testChange(2)], + batchId: 'batch-contiguous-retryable', + generation: 1, + nextToken: 'opaque-token', + hasMore: false, + ), + now: clock.value, + ); + applier.resultsBySequence[1] = const CloudInboxApplyResult.retryable( + failureCategory: CloudFailureCategory.network, + ); + + const readOnlySemanticFlags = CloudSyncFeatureFlags( + readOnlyFetch: true, + semanticApply: true, + saves: false, + deletions: false, + profiles: false, + notificationHints: false, + ); + final first = await engine( + flags: readOnlySemanticFlags, + ).synchronize(trigger: CloudSyncTrigger.manual); + + expect(first.counters.retried, 1); + expect(applier.appliedSequences, [1]); + expect((await store.readCheckpoint(scope)).lastAppliedSequence, 0); + + applier.resultsBySequence[1] = const CloudInboxApplyResult.applied(); + clock.advance(const Duration(seconds: 10)); + final second = await engine( + flags: readOnlySemanticFlags, + ).synchronize(trigger: CloudSyncTrigger.manual); + + expect(second.counters.applied, 2); + expect(applier.appliedSequences, [1, 1, 2]); + expect((await store.readCheckpoint(scope)).lastAppliedSequence, 2); + }, + ); + + test( + 'preflight failure quarantines raw record without invoking decoder', + () async { + transport.enqueueFetchBatch( + CloudFetchBatch( + scope: scope, + changes: [ + testChange( + 1, + preflightFailure: CloudFailureCategory.malformedRecord, + ), + ], + batchId: 'batch-preflight-quarantine', + generation: 1, + nextToken: 'opaque-token', + hasMore: false, + ), + ); + + final result = await engine().synchronize( + trigger: CloudSyncTrigger.manual, + ); + + expect(result.counters.quarantined, 1); + expect(applier.appliedSequences, isEmpty); + final entries = await store.inboxEntries(scope); + expect(entries.single.status, CloudInboxStatus.quarantined); + expect(entries.single.lastFailure, CloudFailureCategory.malformedRecord); + }, + ); + + test( + 'deferred inbox entries quarantine only after age and attempt thresholds', + () async { + transport.enqueueFetchBatch( + CloudFetchBatch( + scope: scope, + changes: [testChange(1)], + batchId: 'batch-deferred-parent', + generation: 1, + nextToken: 'opaque-token', + hasMore: false, + ), + ); + applier.resultsBySequence[1] = const CloudInboxApplyResult.deferred(); + final syncEngine = engine( + maximumDeferredAttempts: 1, + maximumDeferredAge: const Duration(seconds: 1), + ); + + final first = await syncEngine.synchronize( + trigger: CloudSyncTrigger.manual, + ); + + expect(first.counters.deferred, 1); + expect(first.counters.quarantined, 0); + var entries = await store.inboxEntries(scope); + expect(entries.single.status, CloudInboxStatus.pending); + expect(entries.single.attemptCount, 1); + expect(entries.single.lastFailure, CloudFailureCategory.dependency); + + clock.advance(const Duration(seconds: 10)); + final second = await syncEngine.synchronize( + trigger: CloudSyncTrigger.manual, + ); + + expect(second.counters.deferred, 0); + expect(second.counters.quarantined, 1); + entries = await store.inboxEntries(scope); + expect(entries.single.status, CloudInboxStatus.quarantined); + expect(entries.single.attemptCount, 2); + expect(entries.single.lastFailure, CloudFailureCategory.dependency); + }, + ); + + test( + 'retryable inbox failures do not use the deferred terminal bound', + () async { + transport.enqueueFetchBatch( + CloudFetchBatch( + scope: scope, + changes: [testChange(1)], + batchId: 'batch-retryable-network', + generation: 1, + nextToken: 'opaque-token', + hasMore: false, + ), + ); + applier.resultsBySequence[1] = const CloudInboxApplyResult.retryable( + failureCategory: CloudFailureCategory.network, + ); + final syncEngine = engine( + maximumDeferredAttempts: 1, + maximumDeferredAge: const Duration(seconds: 1), + ); + + await syncEngine.synchronize(trigger: CloudSyncTrigger.manual); + clock.advance(const Duration(seconds: 10)); + final second = await syncEngine.synchronize( + trigger: CloudSyncTrigger.manual, + ); + + final stored = (await store.inboxEntries(scope)).single; + expect(second.counters.retried, 1); + expect(second.counters.quarantined, 0); + expect(stored.status, CloudInboxStatus.pending); + expect(stored.lastFailure, CloudFailureCategory.network); + }, + ); + + test( + 'persistent dependency failures dead-letter after attempt and age bounds', + () async { + transport.enqueueFetchBatch( + CloudFetchBatch( + scope: scope, + changes: [testChange(1)], + batchId: 'batch-retryable-dependency', + generation: 1, + nextToken: 'opaque-token', + hasMore: false, + ), + ); + applier.resultsBySequence[1] = const CloudInboxApplyResult.retryable( + failureCategory: CloudFailureCategory.dependency, + ); + final syncEngine = engine( + maximumDeferredAttempts: 1, + maximumDeferredAge: const Duration(seconds: 1), + ); + + await syncEngine.synchronize(trigger: CloudSyncTrigger.manual); + clock.advance(const Duration(seconds: 10)); + final second = await syncEngine.synchronize( + trigger: CloudSyncTrigger.manual, + ); + + final stored = (await store.inboxEntries(scope)).single; + expect(second.counters.quarantined, 1); + expect(second.counters.retried, 0); + expect(stored.status, CloudInboxStatus.quarantined); + expect(stored.lastFailure, CloudFailureCategory.dependency); + }, + ); + + test('persists pull backoff and suppresses restart retry storm', () async { + transport.enqueueFetchFailure( + CloudSyncFailure(category: CloudFailureCategory.network), + ); + final first = await engine().synchronize(trigger: CloudSyncTrigger.startup); + expect(first.status, CloudSyncRunStatus.degraded); + expect(first.failureCategory, CloudFailureCategory.network); + expect(transport.fetchCallCount, 1); + + final checkpoint = await store.readCheckpoint(scope); + expect(checkpoint.consecutivePullFailures, 1); + expect( + checkpoint.nextPullEligibleAt, + testEpoch.add(const Duration(seconds: 10)), + ); + + final restarted = engine(coordinatorId: 'coordinator-after-restart'); + await restarted.synchronize(trigger: CloudSyncTrigger.startup); + expect(transport.fetchCallCount, 1); + }); + + test( + 'bounds a stalled read-only fetch and persists network backoff', + () async { + final fetchStarted = Completer(); + transport.fetchHandler = + (requestedScope, token, generation, limit) async { + fetchStarted.complete(); + return Completer().future; + }; + + final run = engine( + flags: const CloudSyncFeatureFlags( + readOnlyFetch: true, + semanticApply: false, + ), + fetchOperationTimeout: const Duration(milliseconds: 20), + ).synchronize(trigger: CloudSyncTrigger.manual); + await fetchStarted.future; + + final result = await run.timeout(const Duration(seconds: 1)); + + expect(result.status, CloudSyncRunStatus.degraded); + expect(result.failureCategory, CloudFailureCategory.network); + expect(transport.fetchCallCount, 1); + final checkpoint = await store.readCheckpoint(scope); + expect(checkpoint.consecutivePullFailures, 1); + expect( + checkpoint.nextPullEligibleAt, + testEpoch.add(const Duration(seconds: 10)), + ); + }, + ); + + test( + 'local and durable coordinator guards reject overlapping runs', + () async { + final fetchStarted = Completer(); + final releaseFetch = Completer(); + transport.fetchHandler = + (requestedScope, token, generation, limit) async { + fetchStarted.complete(); + await releaseFetch.future; + return CloudFetchBatch( + scope: requestedScope, + changes: const [], + batchId: 'overlap-batch', + generation: 1, + nextToken: token, + hasMore: false, + ); + }; + final firstEngine = engine(); + final firstRun = firstEngine.synchronize( + trigger: CloudSyncTrigger.manual, + ); + await fetchStarted.future; + + final localOverlap = await firstEngine.synchronize( + trigger: CloudSyncTrigger.manual, + ); + expect(localOverlap.status, CloudSyncRunStatus.skipped); + expect(localOverlap.skipReason, CloudSyncSkipReason.localRunActive); + + final otherEngine = engine(coordinatorId: 'coordinator-b'); + final durableOverlap = await otherEngine.synchronize( + trigger: CloudSyncTrigger.manual, + ); + expect(durableOverlap.status, CloudSyncRunStatus.skipped); + expect( + durableOverlap.skipReason, + CloudSyncSkipReason.coordinatorLeaseUnavailable, + ); + + releaseFetch.complete(); + await firstRun; + }, + ); + + test( + 'cancellation after fetch still journals token and payload reference', + () async { + final fetchStarted = Completer(); + final releaseFetch = Completer(); + transport.fetchHandler = + (requestedScope, token, generation, limit) async { + fetchStarted.complete(); + await releaseFetch.future; + return CloudFetchBatch( + scope: requestedScope, + changes: [testChange(1)], + batchId: 'cancelled-batch', + generation: 1, + nextToken: 'opaque-token-after-cancel', + hasMore: false, + ); + }; + final cancellation = CloudSyncCancellationToken(); + final run = engine().synchronize( + trigger: CloudSyncTrigger.manual, + cancellationToken: cancellation, + ); + await fetchStarted.future; + cancellation.cancel(); + releaseFetch.complete(); + + final result = await run; + expect(result.status, CloudSyncRunStatus.cancelled); + expect( + (await store.readCheckpoint(scope)).fetchedToken, + 'opaque-token-after-cancel', + ); + expect(await store.inboxEntries(scope), hasLength(1)); + expect(applier.appliedSequences, isEmpty); + }, + ); + + test( + 'read-only shadow rejects an oversized page without advancing token', + () async { + final observer = MemoryCloudSyncObserver(); + transport.enqueueFetchBatch( + CloudFetchBatch( + scope: scope, + changes: [testChange(1), testChange(2)], + batchId: 'shadow-over-budget', + generation: 1, + nextToken: 'must-not-commit', + hasMore: false, + ), + ); + + final result = await engine( + flags: const CloudSyncFeatureFlags( + readOnlyFetch: true, + semanticApply: false, + ), + shadowJournalBudget: CloudShadowJournalBudget( + maximumEntriesPerScope: 1, + ), + observer: observer, + ).synchronize(trigger: CloudSyncTrigger.manual); + + expect(result.status, CloudSyncRunStatus.degraded); + expect( + result.shadowJournalBlockReason, + CloudShadowJournalBlockReason.maximumEntries, + ); + expect(result.counters.fetched, 0); + expect(result.counters.shadowJournalRejectedEntries, 2); + expect((await store.readCheckpoint(scope)).fetchedToken, isNull); + expect(await store.inboxEntries(scope), isEmpty); + final blocked = observer.events.singleWhere( + (event) => event.type == CloudSyncEventType.shadowJournalBlocked, + ); + expect( + blocked.shadowJournalBlockReason, + CloudShadowJournalBlockReason.maximumEntries, + ); + expect(blocked.toString(), isNot(contains('must-not-commit'))); + }, + ); + + test( + 'migrated stale pending journal blocks before the network request', + () async { + await seedGeneralJournal( + CloudFetchBatch( + scope: scope, + changes: [testChange(1)], + batchId: 'pre-budget-shadow-page', + generation: 1, + nextToken: 'preserved-token', + hasMore: false, + ), + now: testEpoch.subtract(const Duration(days: 2)), + ); + final observer = MemoryCloudSyncObserver(); + + final result = await engine( + flags: const CloudSyncFeatureFlags( + readOnlyFetch: true, + semanticApply: false, + ), + shadowJournalBudget: CloudShadowJournalBudget( + maximumPendingAge: const Duration(days: 1), + ), + observer: observer, + ).synchronize(trigger: CloudSyncTrigger.manual); + + expect(transport.fetchCallCount, 0); + expect(result.status, CloudSyncRunStatus.degraded); + expect( + result.shadowJournalBlockReason, + CloudShadowJournalBlockReason.maximumAge, + ); + expect(result.counters.shadowJournalEntries, 1); + expect(result.counters.shadowJournalEstimatedBytes, greaterThan(0)); + expect( + (await store.readCheckpoint(scope)).fetchedToken, + 'preserved-token', + ); + expect(await store.inboxEntries(scope), hasLength(1)); + }, + ); + + test('missing upload outcome rejects the complete batch', () async { + final confirmed = testOutboxOperation(scope, 1); + final omitted = testOutboxOperation(scope, 2); + await store.enqueueOutbox(confirmed); + await store.enqueueOutbox(omitted); + transport.enqueuePushResult( + CloudPushBatchResult( + outcomes: [ + CloudPushOutcome( + operationId: confirmed.operationId, + disposition: CloudPushDisposition.confirmed, + ), + ], + ), + ); + + final result = await engine( + flags: const CloudSyncFeatureFlags(readOnlyFetch: false, saves: true), + maximumOutboxBatches: 1, + ).synchronize(trigger: CloudSyncTrigger.localOutbox); + + expect(result.counters.confirmed, 0); + expect(result.counters.retried, 0); + final outbox = await store.outboxEntries(scope); + for (final operation in outbox) { + expect(operation.status, CloudOutboxStatus.unknownOutcome); + expect(operation.attemptCount, 1); + expect(operation.lastFailure, CloudFailureCategory.unknown); + } + }); + + test( + 'timed-out push remains unknown until native operations quiesce', + () async { + final operation = testOutboxOperation(scope, 807); + await store.enqueueOutbox(operation); + final pushEntered = Completer(); + final quiescenceStarted = Completer(); + final nativePushResult = Completer(); + transport.pushHandler = (_, operations) { + pushEntered.complete(); + return nativePushResult.future; + }; + transport.quiescenceHandler = () async { + quiescenceStarted.complete(); + await nativePushResult.future; + }; + + final run = engine( + flags: const CloudSyncFeatureFlags(readOnlyFetch: false, saves: true), + maximumOutboxBatches: 1, + writeOperationTimeout: const Duration(milliseconds: 5), + ).synchronize(trigger: CloudSyncTrigger.localOutbox); + var runReturned = false; + final completion = run.then((_) { + runReturned = true; + }); + + await pushEntered.future; + await quiescenceStarted.future; + await Future.delayed(const Duration(milliseconds: 20)); + expect(runReturned, isFalse); + expect(transport.quiescenceCallCount, 1); + expect( + (await store.outboxEntries(scope)).single.status, + CloudOutboxStatus.unknownOutcome, + ); + + nativePushResult.complete( + CloudPushBatchResult( + outcomes: [ + CloudPushOutcome( + operationId: operation.operationId, + disposition: CloudPushDisposition.confirmed, + ), + ], + ), + ); + await completion; + expect( + (await store.outboxEntries(scope)).single.status, + CloudOutboxStatus.unknownOutcome, + ); + }, + ); + + test( + 'thrown transport failure is frozen before it can be replayed', + () async { + final operation = testOutboxOperation(scope, 3); + await store.enqueueOutbox(operation); + transport.pushHandler = (_, _) async => throw StateError('response lost'); + + await engine( + flags: const CloudSyncFeatureFlags(readOnlyFetch: false, saves: true), + maximumOutboxBatches: 1, + ).synchronize(trigger: CloudSyncTrigger.localOutbox); + + var stored = (await store.outboxEntries(scope)).single; + expect(stored.status, CloudOutboxStatus.unknownOutcome); + expect(stored.lastFailure, CloudFailureCategory.unknown); + expect(transport.pushCallCount, 1); + + clock.advance(const Duration(minutes: 3)); + await engine( + flags: const CloudSyncFeatureFlags(readOnlyFetch: false, saves: true), + maximumOutboxBatches: 1, + ).synchronize(trigger: CloudSyncTrigger.localOutbox); + stored = (await store.outboxEntries(scope)).single; + expect(stored.status, CloudOutboxStatus.unknownOutcome); + expect(transport.pushCallCount, 1); + }, + ); + + test('thrown conflict is ambiguous and cannot enter merge retry', () async { + final operation = testOutboxOperation(scope, 4); + await store.enqueueOutbox(operation); + transport.pushHandler = (_, _) async => throw CloudSyncFailure( + category: CloudFailureCategory.conflict, + safeCode: 'simulated_unproven_conflict', + ); + + await engine( + flags: const CloudSyncFeatureFlags(readOnlyFetch: false, saves: true), + maximumOutboxBatches: 1, + ).synchronize(trigger: CloudSyncTrigger.localOutbox); + + expect( + (await store.outboxEntries(scope)).single.status, + CloudOutboxStatus.unknownOutcome, + ); + expect(transport.pushCallCount, 1); + expect(transport.conflictCallCount, 0); + + clock.advance(const Duration(minutes: 3)); + await engine( + flags: const CloudSyncFeatureFlags(readOnlyFetch: false, saves: true), + maximumOutboxBatches: 1, + ).synchronize(trigger: CloudSyncTrigger.localOutbox); + expect(transport.pushCallCount, 1); + expect(transport.conflictCallCount, 0); + }); + + test( + 'thrown authorization failure cannot clear submission identity', + () async { + final operation = testOutboxOperation(scope, 5); + await store.enqueueOutbox(operation); + transport.pushHandler = (_, _) async => throw CloudSyncFailure( + category: CloudFailureCategory.authorization, + safeCode: 'simulated_unproven_authorization_failure', + ); + + await engine( + flags: const CloudSyncFeatureFlags(readOnlyFetch: false, saves: true), + maximumOutboxBatches: 1, + ).synchronize(trigger: CloudSyncTrigger.localOutbox); + + final stored = (await store.outboxEntries(scope)).single; + expect(stored.status, CloudOutboxStatus.unknownOutcome); + expect(stored.lastFailure, CloudFailureCategory.unknown); + expect(stored.appleRequestUuid, isNotNull); + expect(stored.appleOperationUuid, isNotNull); + expect(transport.authenticationRefreshCallCount, 0); + expect(transport.pushCallCount, 1); + }, + ); + + test('thrown PCS failure cannot clear submission identity', () async { + final operation = testOutboxOperation(scope, 7); + await store.enqueueOutbox(operation); + transport.pushHandler = (_, _) async => throw CloudSyncFailure( + category: CloudFailureCategory.pcsUnavailable, + safeCode: 'simulated_unproven_pcs_failure', + ); + + await engine( + flags: const CloudSyncFeatureFlags(readOnlyFetch: false, saves: true), + maximumOutboxBatches: 1, + ).synchronize(trigger: CloudSyncTrigger.localOutbox); + + final stored = (await store.outboxEntries(scope)).single; + expect(stored.status, CloudOutboxStatus.unknownOutcome); + expect(stored.lastFailure, CloudFailureCategory.unknown); + expect(stored.appleRequestUuid, isNotNull); + expect(stored.appleOperationUuid, isNotNull); + expect(transport.pcsRefreshCallCount, 0); + expect(transport.pushCallCount, 1); + }); + + test( + 'generic retryable result remains frozen with its exact identity', + () async { + final operation = testOutboxOperation(scope, 6); + await store.enqueueOutbox(operation); + transport.enqueuePushResult( + CloudPushBatchResult( + outcomes: [ + CloudPushOutcome( + operationId: operation.operationId, + disposition: CloudPushDisposition.retryable, + failureCategory: CloudFailureCategory.server, + ), + ], + ), + ); + + await engine( + flags: const CloudSyncFeatureFlags(readOnlyFetch: false, saves: true), + maximumOutboxBatches: 1, + ).synchronize(trigger: CloudSyncTrigger.localOutbox); + + final stored = (await store.outboxEntries(scope)).single; + expect(stored.status, CloudOutboxStatus.unknownOutcome); + expect(stored.appleRequestUuid, isNotNull); + expect(stored.appleOperationUuid, isNotNull); + expect(transport.pushCallCount, 1); + }, + ); + + test('unknown upload outcome rejects the complete batch', () async { + final first = testOutboxOperation(scope, 1); + final second = testOutboxOperation(scope, 2); + final unknown = testOutboxOperation(scope, 99); + await store.enqueueOutbox(first); + await store.enqueueOutbox(second); + transport.enqueuePushResult( + CloudPushBatchResult( + outcomes: [ + CloudPushOutcome( + operationId: first.operationId, + disposition: CloudPushDisposition.confirmed, + ), + CloudPushOutcome( + operationId: second.operationId, + disposition: CloudPushDisposition.confirmed, + ), + CloudPushOutcome( + operationId: unknown.operationId, + disposition: CloudPushDisposition.confirmed, + ), + ], + ), + ); + + final result = await engine( + flags: const CloudSyncFeatureFlags(readOnlyFetch: false, saves: true), + maximumOutboxBatches: 1, + ).synchronize(trigger: CloudSyncTrigger.localOutbox); + + expect(result.counters.confirmed, 0); + expect(result.counters.retried, 0); + for (final operation in await store.outboxEntries(scope)) { + expect(operation.status, CloudOutboxStatus.unknownOutcome); + expect(operation.attemptCount, 1); + expect(operation.lastFailure, CloudFailureCategory.unknown); + } + }); + + test('server read confirms an ambiguous write without replay', () async { + await seedAmbiguousOutbox(801); + transport.unknownOutcomeHandler = (_, operation) async => + CloudUnknownOutcomeResolution.committed(proof: proofFor(operation)); + + final result = await engine( + flags: const CloudSyncFeatureFlags(readOnlyFetch: false, saves: true), + maximumOutboxBatches: 1, + ).synchronize(trigger: CloudSyncTrigger.localOutbox); + + expect(result.counters.confirmed, 1); + expect(transport.unknownOutcomeCallCount, 1); + expect(transport.pushCallCount, 1); + expect( + (await store.outboxEntries(scope)).single.status, + CloudOutboxStatus.confirmed, + ); + }); + + test('reconciliation timeout never replays the write', () async { + await seedAmbiguousOutbox(808); + final storedOperation = (await store.outboxEntries(scope)).single; + final nativeResolution = Completer(); + final quiescenceStarted = Completer(); + transport.unknownOutcomeHandler = (_, _) => nativeResolution.future; + transport.quiescenceHandler = () async { + quiescenceStarted.complete(); + await nativeResolution.future; + }; + + final run = engine( + flags: const CloudSyncFeatureFlags(readOnlyFetch: false, saves: true), + maximumOutboxBatches: 1, + writeOperationTimeout: const Duration(milliseconds: 5), + ).synchronize(trigger: CloudSyncTrigger.localOutbox); + var runReturned = false; + final completion = run.then((_) { + runReturned = true; + }); + + await quiescenceStarted.future; + await Future.delayed(const Duration(milliseconds: 20)); + expect(runReturned, isFalse); + expect(transport.pushCallCount, 1); + + nativeResolution.complete( + CloudUnknownOutcomeResolution.committed(proof: proofFor(storedOperation)), + ); + await completion; + expect(transport.unknownOutcomeCallCount, 1); + expect(transport.pushCallCount, 1); + expect( + (await store.outboxEntries(scope)).single.status, + CloudOutboxStatus.unknownOutcome, + ); + + clock.advance(const Duration(minutes: 1)); + transport.quiescenceHandler = null; + transport.unknownOutcomeHandler = (_, _) async => + const CloudUnknownOutcomeResolution.unresolved( + failureCategory: CloudFailureCategory.network, + ); + await engine( + flags: const CloudSyncFeatureFlags(readOnlyFetch: false, saves: true), + maximumOutboxBatches: 1, + writeOperationTimeout: const Duration(milliseconds: 5), + ).synchronize(trigger: CloudSyncTrigger.localOutbox); + expect(transport.pushCallCount, 1); + expect( + (await store.outboxEntries(scope)).single.status, + CloudOutboxStatus.unknownOutcome, + ); + }); + + test('mismatched reconciliation proof cannot confirm or replay', () async { + await seedAmbiguousOutbox(806); + transport.unknownOutcomeHandler = (_, operation) async => + CloudUnknownOutcomeResolution.committed( + proof: proofFor( + operation, + appleRequestUuid: '99999999-2222-4ABC-8DEF-555555555555', + ), + ); + + await engine( + flags: const CloudSyncFeatureFlags(readOnlyFetch: false, saves: true), + maximumOutboxBatches: 1, + ).synchronize(trigger: CloudSyncTrigger.localOutbox); + + expect( + (await store.outboxEntries(scope)).single.status, + CloudOutboxStatus.unknownOutcome, + ); + expect(transport.pushCallCount, 1); + }); + + test('mismatched operation UUID proof cannot confirm or replay', () async { + await seedAmbiguousOutbox(807); + transport.unknownOutcomeHandler = (_, operation) async => + CloudUnknownOutcomeResolution.committed( + proof: proofFor( + operation, + appleOperationUuid: 'AAAAAAAA-BBBB-4CCC-8DDD-999999999999', + ), + ); + + await engine( + flags: const CloudSyncFeatureFlags(readOnlyFetch: false, saves: true), + maximumOutboxBatches: 1, + ).synchronize(trigger: CloudSyncTrigger.localOutbox); + + final stored = (await store.outboxEntries(scope)).single; + expect(stored.status, CloudOutboxStatus.unknownOutcome); + expect(stored.appleRequestUuid, isNotNull); + expect(stored.appleOperationUuid, isNotNull); + expect(transport.pushCallCount, 1); + }); + + test('mismatched protected proof cannot confirm or replay', () async { + await seedAmbiguousOutbox(811); + transport.unknownOutcomeHandler = (_, operation) async => + CloudUnknownOutcomeResolution.committed( + proof: proofFor( + operation, + protectedProofReference: testProtectedReference('Z'), + ), + ); + + await engine( + flags: const CloudSyncFeatureFlags(readOnlyFetch: false, saves: true), + maximumOutboxBatches: 1, + ).synchronize(trigger: CloudSyncTrigger.localOutbox); + + expect( + (await store.outboxEntries(scope)).single.status, + CloudOutboxStatus.unknownOutcome, + ); + expect(transport.pushCallCount, 1); + }); + + test( + 'server-proven absence requires a later run before one resubmission', + () async { + final operation = await seedAmbiguousOutbox(802); + transport.unknownOutcomeHandler = (_, operation) async => + CloudUnknownOutcomeResolution.notApplied(proof: proofFor(operation)); + transport.enqueuePushResult( + CloudPushBatchResult( + outcomes: [ + CloudPushOutcome( + operationId: operation.operationId, + disposition: CloudPushDisposition.confirmed, + ), + ], + ), + ); + + final first = await engine( + flags: const CloudSyncFeatureFlags(readOnlyFetch: false, saves: true), + maximumOutboxBatches: 1, + ).synchronize(trigger: CloudSyncTrigger.localOutbox); + + expect(first.counters.retried, 1); + expect(first.counters.confirmed, 0); + expect(transport.unknownOutcomeCallCount, 1); + expect(transport.pushCallCount, 1); + expect( + (await store.outboxEntries(scope)).single.status, + CloudOutboxStatus.pending, + ); + + final second = await engine( + flags: const CloudSyncFeatureFlags(readOnlyFetch: false, saves: true), + maximumOutboxBatches: 1, + ).synchronize(trigger: CloudSyncTrigger.localOutbox); + + expect(second.counters.retried, 0); + expect(second.counters.confirmed, 1); + expect(transport.pushCallCount, 2); + expect( + (await store.outboxEntries(scope)).single.status, + CloudOutboxStatus.confirmed, + ); + }, + ); + + test( + 'unresolved server read backs off without replaying the write', + () async { + await seedAmbiguousOutbox(803); + transport.unknownOutcomeHandler = (_, _) async => + const CloudUnknownOutcomeResolution.unresolved( + failureCategory: CloudFailureCategory.network, + retryAfter: Duration(seconds: 30), + ); + + await engine( + flags: const CloudSyncFeatureFlags(readOnlyFetch: false, saves: true), + maximumOutboxBatches: 1, + ).synchronize(trigger: CloudSyncTrigger.localOutbox); + var stored = (await store.outboxEntries(scope)).single; + expect(stored.status, CloudOutboxStatus.unknownOutcome); + expect(stored.attemptCount, 2); + expect( + stored.nextEligibleAt, + clock.value.add(const Duration(seconds: 30)), + ); + expect(transport.pushCallCount, 1); + expect(transport.unknownOutcomeCallCount, 1); + + await engine( + flags: const CloudSyncFeatureFlags(readOnlyFetch: false, saves: true), + maximumOutboxBatches: 1, + ).synchronize(trigger: CloudSyncTrigger.localOutbox); + expect(transport.unknownOutcomeCallCount, 1); + expect(transport.pushCallCount, 1); + + clock.advance(const Duration(seconds: 30)); + await engine( + flags: const CloudSyncFeatureFlags(readOnlyFetch: false, saves: true), + maximumOutboxBatches: 1, + ).synchronize(trigger: CloudSyncTrigger.localOutbox); + stored = (await store.outboxEntries(scope)).single; + expect(stored.status, CloudOutboxStatus.unknownOutcome); + expect(transport.unknownOutcomeCallCount, 2); + expect(transport.pushCallCount, 1); + }, + ); + + test( + 'divergent server state merges but waits for a later submission run', + () async { + final operation = await seedAmbiguousOutbox(804); + transport.unknownOutcomeHandler = (_, operation) async => + CloudUnknownOutcomeResolution.serverRecordChanged( + proof: proofFor(operation), + ); + transport.conflictHandler = (_, leasedOperation) async { + return CloudServerConflictResolution.mergedForRetry( + encryptedPayloadReference: testProtectedReference('M'), + payloadSha256: testSha256('a'), + serverRecordIdHash: leasedOperation.serverRecordIdHash!, + encryptedRawRecordReference: 'protected:ambiguous-server-record', + ); + }; + transport.enqueuePushResult( + CloudPushBatchResult( + outcomes: [ + CloudPushOutcome( + operationId: operation.operationId, + disposition: CloudPushDisposition.confirmed, + ), + ], + ), + ); + + await engine( + flags: const CloudSyncFeatureFlags(readOnlyFetch: false, saves: true), + maximumOutboxBatches: 1, + ).synchronize(trigger: CloudSyncTrigger.localOutbox); + + expect(transport.unknownOutcomeCallCount, 1); + expect(transport.conflictCallCount, 1); + expect(transport.pushCallCount, 1); + expect( + (await store.outboxEntries(scope)).single.status, + CloudOutboxStatus.pending, + ); + + await engine( + flags: const CloudSyncFeatureFlags(readOnlyFetch: false, saves: true), + maximumOutboxBatches: 1, + ).synchronize(trigger: CloudSyncTrigger.localOutbox); + + expect(transport.pushCallCount, 2); + expect( + (await store.outboxEntries(scope)).single.status, + CloudOutboxStatus.confirmed, + ); + }, + ); + + test('retryable conflict reconciliation stays unknown', () async { + await seedAmbiguousOutbox(809); + transport.unknownOutcomeHandler = (_, operation) async => + CloudUnknownOutcomeResolution.serverRecordChanged( + proof: proofFor(operation), + ); + transport.conflictHandler = (_, _) async => + const CloudServerConflictResolution.retryable( + failureCategory: CloudFailureCategory.network, + ); + + await engine( + flags: const CloudSyncFeatureFlags(readOnlyFetch: false, saves: true), + maximumOutboxBatches: 1, + ).synchronize(trigger: CloudSyncTrigger.localOutbox); + + final stored = (await store.outboxEntries(scope)).single; + expect(stored.status, CloudOutboxStatus.unknownOutcome); + expect(stored.appleRequestUuid, isNotNull); + expect(stored.appleOperationUuid, isNotNull); + expect(transport.conflictCallCount, 1); + expect(transport.pushCallCount, 1); + }); + + test('retryable conflict quarantine stays unknown', () async { + await seedAmbiguousOutbox(810); + transport.unknownOutcomeHandler = (_, operation) async => + CloudUnknownOutcomeResolution.serverRecordChanged( + proof: proofFor(operation), + ); + transport.conflictHandler = (_, _) async => + const CloudServerConflictResolution.quarantined( + failureCategory: CloudFailureCategory.throttled, + ); + + await engine( + flags: const CloudSyncFeatureFlags(readOnlyFetch: false, saves: true), + maximumOutboxBatches: 1, + ).synchronize(trigger: CloudSyncTrigger.localOutbox); + + final stored = (await store.outboxEntries(scope)).single; + expect(stored.status, CloudOutboxStatus.unknownOutcome); + expect(stored.appleRequestUuid, isNotNull); + expect(stored.appleOperationUuid, isNotNull); + expect(transport.conflictCallCount, 1); + expect(transport.pushCallCount, 1); + }); + + test('terminal reconciliation failure quarantines without replay', () async { + await seedAmbiguousOutbox(805); + transport.unknownOutcomeHandler = (_, _) async => + const CloudUnknownOutcomeResolution.quarantined( + failureCategory: CloudFailureCategory.malformedRecord, + ); + + final result = await engine( + flags: const CloudSyncFeatureFlags(readOnlyFetch: false, saves: true), + maximumOutboxBatches: 1, + ).synchronize(trigger: CloudSyncTrigger.localOutbox); + + expect(result.counters.quarantined, 1); + expect(transport.pushCallCount, 1); + expect( + (await store.outboxEntries(scope)).single.status, + CloudOutboxStatus.quarantined, + ); + }); + + test( + 'lost coordinator lease during push cannot confirm the outbox', + () async { + store = _RejectingCoordinatorRenewalStore(); + final operation = testOutboxOperation(scope, 1); + await store.enqueueOutbox(operation); + transport.pushHandler = (scope, operations) async { + await Future.delayed(const Duration(milliseconds: 80)); + return CloudPushBatchResult( + outcomes: [ + CloudPushOutcome( + operationId: operations.single.operationId, + disposition: CloudPushDisposition.confirmed, + ), + ], + ); + }; + + final result = await engine( + flags: const CloudSyncFeatureFlags(readOnlyFetch: false, saves: true), + maximumOutboxBatches: 1, + coordinatorLeaseDuration: const Duration(milliseconds: 60), + outboxLeaseDuration: const Duration(seconds: 1), + ).synchronize(trigger: CloudSyncTrigger.localOutbox); + + expect(result.status, CloudSyncRunStatus.failed); + expect(result.failureCategory, CloudFailureCategory.localStorage); + final stored = (await store.outboxEntries(scope)).single; + expect(stored.status, CloudOutboxStatus.unknownOutcome); + expect(stored.confirmedAt, isNull); + }, + ); + + test('generation advance cannot overtake an in-flight remote push', () async { + final operation = testOutboxOperation(scope, 44); + await store.enqueueOutbox(operation); + final pushStarted = Completer(); + final releasePush = Completer(); + transport.pushHandler = (requestedScope, operations) async { + pushStarted.complete(); + await releasePush.future; + return CloudPushBatchResult( + outcomes: [ + CloudPushOutcome( + operationId: operations.single.operationId, + disposition: CloudPushDisposition.confirmed, + ), + ], + ); + }; + + final run = engine( + flags: const CloudSyncFeatureFlags(readOnlyFetch: false, saves: true), + ).synchronize(trigger: CloudSyncTrigger.localOutbox); + await pushStarted.future; + + await expectLater( + store.advanceOutboxGeneration(scope, now: clock.value), + throwsA( + isA().having( + (failure) => failure.safeCode, + 'safeCode', + 'generation_advance_coordinator_active', + ), + ), + ); + expect((await store.readCheckpoint(scope)).generation, 1); + + releasePush.complete(); + await run; + expect( + (await store.outboxEntries(scope)).single.status, + CloudOutboxStatus.confirmed, + ); + expect( + (await store.advanceOutboxGeneration(scope, now: clock.value)).generation, + 2, + ); + }); + + test( + 'authorization response pauses before a later refreshed attempt', + () async { + final operation = testOutboxOperation(scope, 1); + await store.enqueueOutbox(operation); + transport.enqueuePushResult( + CloudPushBatchResult( + outcomes: [ + CloudPushOutcome( + operationId: operation.operationId, + disposition: CloudPushDisposition.unauthorized, + failureCategory: CloudFailureCategory.authorization, + ), + ], + ), + ); + transport.enqueuePushResult( + CloudPushBatchResult( + outcomes: [ + CloudPushOutcome( + operationId: operation.operationId, + disposition: CloudPushDisposition.confirmed, + ), + ], + ), + ); + transport.authenticationRefreshHandler = (_) async => true; + + final syncEngine = engine( + flags: const CloudSyncFeatureFlags(readOnlyFetch: false, saves: true), + pausedRetryDelay: const Duration(hours: 6), + ); + final first = await syncEngine.synchronize( + trigger: CloudSyncTrigger.localOutbox, + ); + + expect(first.counters.confirmed, 0); + expect(transport.authenticationRefreshCallCount, 0); + expect(transport.pushCallCount, 1); + expect( + (await store.outboxEntries(scope)).single.status, + CloudOutboxStatus.paused, + ); + + clock.advance(const Duration(hours: 6)); + final second = await syncEngine.synchronize( + trigger: CloudSyncTrigger.localOutbox, + ); + expect(second.counters.confirmed, 1); + expect(transport.authenticationRefreshCallCount, 1); + expect(transport.pushCallCount, 2); + expect(transport.observedAppleRequestUuids[0].single, isNotNull); + expect(transport.observedAppleOperationUuids[0].single, isNotNull); + expect( + transport.observedAppleRequestUuids[1].single, + isNot(transport.observedAppleRequestUuids[0].single), + ); + expect( + transport.observedAppleOperationUuids[1].single, + isNot(transport.observedAppleOperationUuids[0].single), + ); + }, + ); + + test('authorization response cannot trigger a same-run replay', () async { + final operation = testOutboxOperation(scope, 1); + await store.enqueueOutbox(operation); + transport.enqueuePushResult( + CloudPushBatchResult( + outcomes: [ + CloudPushOutcome( + operationId: operation.operationId, + disposition: CloudPushDisposition.unauthorized, + failureCategory: CloudFailureCategory.authorization, + ), + ], + ), + ); + transport.authenticationRefreshHandler = (_) async => true; + + final result = await engine( + flags: const CloudSyncFeatureFlags(readOnlyFetch: false, saves: true), + maximumOutboxBatches: 1, + ).synchronize(trigger: CloudSyncTrigger.localOutbox); + + expect(result.counters.confirmed, 0); + expect(result.counters.retried, 0); + expect(transport.authenticationRefreshCallCount, 0); + expect(transport.pushCallCount, 1); + final stored = (await store.outboxEntries(scope)).single; + expect(stored.status, CloudOutboxStatus.paused); + expect(stored.lastFailure, CloudFailureCategory.authorization); + expect(stored.appleRequestUuid, isNull); + expect(stored.appleOperationUuid, isNull); + }); + + test('uploads attachment dependency before its owning message', () async { + final attachment = testOutboxOperation(scope, 1); + final message = testOutboxOperation( + scope, + 2, + dependencies: [attachment.operationId], + ); + await store.enqueueOutbox(message); + await store.enqueueOutbox(attachment); + transport.pushHandler = (requestedScope, operations) async { + return CloudPushBatchResult( + outcomes: operations.map( + (operation) => CloudPushOutcome( + operationId: operation.operationId, + disposition: CloudPushDisposition.confirmed, + ), + ), + ); + }; + + final result = await engine( + flags: const CloudSyncFeatureFlags(readOnlyFetch: false, saves: true), + ).synchronize(trigger: CloudSyncTrigger.localOutbox); + + expect(result.counters.confirmed, 2); + expect(transport.observedPushOperationIds, [ + [attachment.operationId], + [message.operationId], + ]); + }); + + test('bounds each upload batch and total batches', () async { + for (var index = 0; index < 5; index++) { + await store.enqueueOutbox(testOutboxOperation(scope, index)); + } + transport.pushHandler = (requestedScope, operations) async { + return CloudPushBatchResult( + outcomes: operations.map( + (operation) => CloudPushOutcome( + operationId: operation.operationId, + disposition: CloudPushDisposition.confirmed, + ), + ), + ); + }; + + final result = await engine( + flags: const CloudSyncFeatureFlags(readOnlyFetch: false, saves: true), + batchSize: 2, + maximumOutboxBatches: 2, + ).synchronize(trigger: CloudSyncTrigger.localOutbox); + + expect(result.counters.confirmed, 4); + expect( + transport.observedPushOperationIds.every((batch) => batch.length <= 2), + isTrue, + ); + expect( + (await store.outboxEntries( + scope, + )).where((operation) => operation.status == CloudOutboxStatus.pending), + hasLength(1), + ); + }); + + test( + 'authorization refresh sends an all-paused outbox without a pull', + () async { + final paused = testOutboxOperation(scope, 1); + await seedPausedOutbox( + paused, + category: CloudFailureCategory.authorization, + ); + transport.enqueuePushResult( + CloudPushBatchResult( + outcomes: [ + CloudPushOutcome( + operationId: paused.operationId, + disposition: CloudPushDisposition.confirmed, + ), + ], + ), + ); + transport.authenticationRefreshHandler = (_) async => true; + + await engine( + flags: const CloudSyncFeatureFlags(readOnlyFetch: false, saves: true), + maximumOutboxBatches: 1, + ).synchronize(trigger: CloudSyncTrigger.localOutbox); + + final entries = await store.outboxEntries(scope); + expect(transport.authenticationRefreshCallCount, 1); + expect(transport.pushCallCount, 1); + expect(entries.single.status, CloudOutboxStatus.confirmed); + expect(entries.single.lastFailure, isNull); + }, + ); + + test('PCS refresh sends an all-paused outbox without a pull', () async { + final paused = testOutboxOperation(scope, 1); + await seedPausedOutbox( + paused, + category: CloudFailureCategory.pcsUnavailable, + ); + transport.enqueuePushResult( + CloudPushBatchResult( + outcomes: [ + CloudPushOutcome( + operationId: paused.operationId, + disposition: CloudPushDisposition.confirmed, + ), + ], + ), + ); + transport.pcsRefreshHandler = (_) async => true; + + await engine( + flags: const CloudSyncFeatureFlags(readOnlyFetch: false, saves: true), + maximumOutboxBatches: 1, + ).synchronize(trigger: CloudSyncTrigger.localOutbox); + + final entries = await store.outboxEntries(scope); + expect(transport.pcsRefreshCallCount, 1); + expect(transport.pushCallCount, 1); + expect(entries.single.status, CloudOutboxStatus.confirmed); + expect(entries.single.lastFailure, isNull); + }); + + test('failed push-only refresh leaves paused work untouched', () async { + final paused = testOutboxOperation(scope, 1); + await seedPausedOutbox( + paused, + category: CloudFailureCategory.authorization, + ); + transport.authenticationRefreshHandler = (_) async => false; + + await engine( + flags: const CloudSyncFeatureFlags(readOnlyFetch: false, saves: true), + ).synchronize(trigger: CloudSyncTrigger.localOutbox); + + final stored = (await store.outboxEntries(scope)).single; + expect(transport.authenticationRefreshCallCount, 1); + expect(transport.pushCallCount, 0); + expect(stored.status, CloudOutboxStatus.paused); + expect(stored.lastFailure, CloudFailureCategory.authorization); + expect(stored.nextEligibleAt, testEpoch.add(const Duration(hours: 6))); + + await engine( + flags: const CloudSyncFeatureFlags(readOnlyFetch: false, saves: true), + ).synchronize(trigger: CloudSyncTrigger.localOutbox); + + expect(transport.authenticationRefreshCallCount, 1); + }); + + test( + 'paused authorization refresh respects its durable retry delay', + () async { + final operation = testOutboxOperation(scope, 1); + await store.enqueueOutbox(operation); + transport.enqueuePushResult( + CloudPushBatchResult( + outcomes: [ + CloudPushOutcome( + operationId: operation.operationId, + disposition: CloudPushDisposition.unauthorized, + failureCategory: CloudFailureCategory.authorization, + ), + ], + ), + ); + transport.authenticationRefreshHandler = (_) async => false; + final syncEngine = engine( + flags: const CloudSyncFeatureFlags(readOnlyFetch: false, saves: true), + pausedRetryDelay: const Duration(hours: 6), + ); + + await syncEngine.synchronize(trigger: CloudSyncTrigger.localOutbox); + await syncEngine.synchronize(trigger: CloudSyncTrigger.localOutbox); + + final stored = (await store.outboxEntries(scope)).single; + expect(transport.authenticationRefreshCallCount, 0); + expect(transport.pushCallCount, 1); + expect(stored.status, CloudOutboxStatus.paused); + expect(stored.nextEligibleAt, testEpoch.add(const Duration(hours: 6))); + }, + ); + + test('server-record-changed fetches, merges, and retries', () async { + final operation = testOutboxOperation(scope, 1); + await store.enqueueOutbox(operation); + transport.enqueuePushResult( + CloudPushBatchResult( + outcomes: [ + CloudPushOutcome( + operationId: operation.operationId, + disposition: CloudPushDisposition.serverRecordChanged, + failureCategory: CloudFailureCategory.conflict, + ), + ], + ), + ); + transport.enqueuePushResult( + CloudPushBatchResult( + outcomes: [ + CloudPushOutcome( + operationId: operation.operationId, + disposition: CloudPushDisposition.confirmed, + ), + ], + ), + ); + transport.conflictHandler = (requestedScope, leasedOperation) async { + return CloudServerConflictResolution.mergedForRetry( + encryptedPayloadReference: testProtectedReference('N'), + payloadSha256: testSha256('b'), + serverRecordIdHash: leasedOperation.serverRecordIdHash!, + encryptedRawRecordReference: 'protected:merged-raw-record', + etagHash: 'merged-etag-digest', + ); + }; + + final result = await engine( + flags: const CloudSyncFeatureFlags(readOnlyFetch: false, saves: true), + ).synchronize(trigger: CloudSyncTrigger.localOutbox); + + final stored = (await store.outboxEntries(scope)).single; + expect(transport.conflictCallCount, 1); + expect(transport.pushCallCount, 2); + expect(result.counters.confirmed, 1); + expect(stored.status, CloudOutboxStatus.confirmed); + expect(stored.payloadSha256, testSha256('b')); + expect( + (await store.readRecordMap( + scope, + logicalEntityKeyHash: operation.logicalEntityKeyHash, + generation: operation.checkpointGeneration, + ))!.encryptedRawRecordReference, + 'protected:merged-raw-record', + ); + }); + + test('unknown upload failures freeze without automatic replay', () async { + final operation = testOutboxOperation(scope, 1); + await store.enqueueOutbox(operation); + transport.pushHandler = (requestedScope, operations) async { + return CloudPushBatchResult( + outcomes: operations.map( + (item) => CloudPushOutcome( + operationId: item.operationId, + disposition: CloudPushDisposition.quarantined, + failureCategory: CloudFailureCategory.unknown, + ), + ), + ); + }; + final syncEngine = engine( + flags: const CloudSyncFeatureFlags(readOnlyFetch: false, saves: true), + ); + + await syncEngine.synchronize(trigger: CloudSyncTrigger.localOutbox); + expect( + (await store.outboxEntries(scope)).single.status, + CloudOutboxStatus.unknownOutcome, + ); + clock.advance(const Duration(seconds: 10)); + await syncEngine.synchronize(trigger: CloudSyncTrigger.localOutbox); + final stored = (await store.outboxEntries(scope)).single; + expect(stored.status, CloudOutboxStatus.unknownOutcome); + expect(stored.attemptCount, 2); + expect(transport.recordMappingCallCount, 1); + expect(transport.pushCallCount, 1); + expect(transport.unknownOutcomeCallCount, 1); + }); + + test( + 'profile stream is inert until its independent flag is enabled', + () async { + scope = testScope(streamKind: CloudSyncStreamKind.profiles); + final result = await engine( + flags: const CloudSyncFeatureFlags( + readOnlyFetch: true, + profiles: false, + ), + ).synchronize(trigger: CloudSyncTrigger.manual); + + expect(result.status, CloudSyncRunStatus.skipped); + expect(result.skipReason, CloudSyncSkipReason.featureDisabled); + expect(transport.fetchCallCount, 0); + expect(transport.pushCallCount, 0); + }, + ); +} + +class _RecoveryTrackingStore extends InMemoryCloudSyncStore { + int recoverExpiredOutboxLeaseCalls = 0; + + @override + Future recoverExpiredOutboxLeases( + CloudSyncScope scope, { + required DateTime now, + }) { + recoverExpiredOutboxLeaseCalls++; + return super.recoverExpiredOutboxLeases(scope, now: now); + } +} + +class _ProtectedRecoveryTrackingStore extends InMemoryCloudSyncStore + implements + CloudProtectedPageLeaseAdoptionStore, + CloudProtectedOutboundLeaseAdoptionStore { + final Set outboundLeaseReferences = {}; + + @override + Future> readAdoptedProtectedPageLeaseReferences({ + required int maximumCount, + }) async => {}; + + @override + Future readLiveProtectedReferences({ + required int maximumCount, + }) async => + CloudProtectedReferenceSnapshot(references: const {}, isComplete: true); + + @override + Future releaseAdoptedProtectedPageLeaseReferences( + Iterable leaseReferences, + ) async {} + + @override + Future> readNonterminalProtectedOutboundLeaseReferences({ + required int maximumCount, + }) async => Set.unmodifiable(outboundLeaseReferences); +} + +class _RecoveryOrderedProtectedWriteTransport extends FakeCloudSyncTransport + implements CloudProtectedPageLeaseTransport { + _RecoveryOrderedProtectedWriteTransport({required this.events}); + + final List events; + + @override + String get protectedPageLeaseRecoveryIdentity => + 'obcs2.store.${List.filled(43, 'R').join()}'; + + @override + Future runProtectedStoreExclusive(Future Function() action) => + action(); + + @override + Future recoverProtectedPageLeases( + Set adoptedLeaseReferences, + CloudProtectedReferenceSnapshot liveReferences, + ) async { + events.add('recover'); + return CloudProtectedPageLeaseRecoveryResult( + finalizedAdoptedLeaseReferences: const {}, + hasMore: false, + ); + } + + @override + Future commitProtectedPageLease( + String leaseReference, + Set retainedReferences, + ) async {} + + @override + Future acknowledgeCommittedPageLease(String leaseReference) async {} + + @override + Future rollbackProtectedPageLease(String leaseReference) async {} + + @override + Future retireProtectedReferences(Set references) async => 0; + + @override + Future collectProtectedGarbage( + CloudProtectedReferenceSnapshot liveReferences, + ) async => const CloudProtectedGarbageCollectionResult( + scannedCount: 0, + firstObservedCount: 0, + deletedCount: 0, + preservedLiveCount: 0, + preservedActiveLeaseCount: 0, + hasMore: false, + ); + + @override + Future reconcileUnknownOutcome( + CloudSyncScope scope, { + required CloudOutboxOperation operation, + }) { + events.add('reconcile'); + return super.reconcileUnknownOutcome(scope, operation: operation); + } + + @override + Future prepareSubmission( + CloudSyncScope scope, { + required CloudOutboxSubmissionIdentity submissionIdentity, + required List operations, + }) { + events.add('prepare'); + return super.prepareSubmission( + scope, + submissionIdentity: submissionIdentity, + operations: operations, + ); + } +} + +class _RejectingCoordinatorRenewalStore extends InMemoryCloudSyncStore { + int renewalCalls = 0; + + @override + Future renewCoordinatorLease( + CloudSyncScope scope, { + required CloudCoordinatorLeaseFence leaseFence, + required DateTime now, + required Duration leaseDuration, + }) { + renewalCalls++; + if (renewalCalls > 3) return Future.value(false); + return super.renewCoordinatorLease( + scope, + leaseFence: leaseFence, + now: now, + leaseDuration: leaseDuration, + ); + } +} + +class _FailingSubmissionMarkerStore extends InMemoryCloudSyncStore { + @override + Future> markOutboxSubmissionStarted( + CloudSyncScope scope, { + required String leaseId, + required CloudOutboxSubmissionIdentity submissionIdentity, + required DateTime now, + }) { + throw CloudSyncFailure( + category: CloudFailureCategory.localStorage, + safeCode: 'simulated_submission_marker_failure', + ); + } +} diff --git a/test/services/cloud_sync/cloud_sync_manual_outbound_canary_test.dart b/test/services/cloud_sync/cloud_sync_manual_outbound_canary_test.dart new file mode 100644 index 0000000000..25b4376938 --- /dev/null +++ b/test/services/cloud_sync/cloud_sync_manual_outbound_canary_test.dart @@ -0,0 +1,747 @@ +import 'package:bluebubbles/services/rustpush/cloud_sync/cloud_sync_dev_gate.dart'; +import 'package:bluebubbles/services/rustpush/cloud_sync/cloud_sync_engine.dart'; +import 'package:bluebubbles/services/rustpush/cloud_sync/cloud_sync_manual_outbound_canary.dart'; +import 'package:bluebubbles/services/rustpush/cloud_sync/cloud_sync_manual_shadow_sampler.dart'; +import 'package:bluebubbles/services/rustpush/cloud_sync/cloud_sync_models.dart'; +import 'package:bluebubbles/services/rustpush/cloud_sync/cloud_operation_identity.dart'; +import 'package:bluebubbles/services/rustpush/cloud_sync/cloudkit_writer_ownership.dart'; +import 'package:bluebubbles/src/rust/api/api.dart' as frb_api; +import 'package:flutter_test/flutter_test.dart'; + +import 'cloud_sync_test_helpers.dart'; + +const _fingerprintA = 'AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA'; +const _fingerprintB = 'BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB'; + +final _clientA = Object(); +final _clientB = Object(); + +void main() { + test('ordinary builds keep the outbound canary disabled by default', () { + expect(CloudSyncDevGate.manualOutboundCanaryEnabled, isFalse); + expect(CloudKitWriterOwnership.v2MutationsEnabled, isFalse); + }); + + test( + 'explicit gate overrides fail closed and never touch dependencies', + () async { + final disabled = _CanaryFixture(); + final disabledCanary = disabled.build(compileGate: false); + await _expectStateError( + disabledCanary.armConfirmed( + message: _FakeCloudMessage(), + createdAt: testEpoch, + ), + 'cloud_sync_outbound_canary_disabled', + ); + expect(disabled.preflight.calls, 0); + + final writerDisabled = _CanaryFixture(); + final writerDisabledCanary = writerDisabled.build(writerGate: false); + await _expectStateError( + writerDisabledCanary.armConfirmed( + message: _FakeCloudMessage(), + createdAt: testEpoch, + ), + 'cloud_sync_outbound_canary_writer_disabled', + ); + expect(writerDisabled.preflight.calls, 0); + }, + ); + + test('one confirmation only arms memory and admits nothing', () async { + final fixture = _CanaryFixture(); + final canary = fixture.build(); + + final confirmation = await canary.armConfirmed( + message: _FakeCloudMessage(), + createdAt: testEpoch, + ); + + expect( + confirmation.toString(), + 'CloudSyncOutboundCanaryConfirmation(redacted)', + ); + expect(fixture.sessionFactoryCalls, 0); + expect(fixture.session.admitCalls, 0); + expect(fixture.preflight.outboxCounts, [0]); + }); + + test('double confirmation succeeds in the exact message scope', () async { + final fixture = _CanaryFixture( + preflightStates: [ + _readyState(), + _readyState(), + _readyState(outboxCount: 1), + ], + result: _result(const CloudSyncRunCounters(confirmed: 1)), + ); + final canary = fixture.build(); + final confirmation = await canary.armConfirmed( + message: fixture.message, + createdAt: testEpoch, + ); + + final report = await canary.runDoubleConfirmed(confirmation); + + expect(report.status, CloudSyncRunStatus.completed); + expect(report.confirmed, 1); + expect(report.outboxStatus, CloudOutboxStatus.confirmed); + expect(report.recovery, isFalse); + expect(report.terminal, isTrue); + expect(fixture.sessionFactoryCalls, 1); + expect(fixture.session.admitCalls, 1); + expect(fixture.session.flushCalls, 1); + expect(fixture.session.receivedMessage, same(fixture.message)); + expect(fixture.scopes, [fixture.expectedScope]); + expect(fixture.session.operation.scope, fixture.expectedScope); + expect(fixture.session.operation.action, CloudOutboxAction.save); + expect(fixture.session.operation.status, CloudOutboxStatus.pending); + expect(fixture.preflight.outboxCounts, [0, 0, 1]); + expect(fixture.session.quiesceCalls, 1); + expect(canary.isActive, isFalse); + }); + + test('confirmation tokens are single-use', () async { + final fixture = _CanaryFixture( + preflightStates: [ + _readyState(), + _readyState(), + _readyState(outboxCount: 1), + ], + ); + final canary = fixture.build(); + final confirmation = await canary.armConfirmed( + message: fixture.message, + createdAt: testEpoch, + ); + + await canary.runDoubleConfirmed(confirmation); + await _expectStateError( + canary.runDoubleConfirmed(confirmation), + 'cloud_sync_outbound_canary_confirmation_invalid', + ); + expect(fixture.session.admitCalls, 1); + expect(fixture.session.flushCalls, 1); + expect(fixture.session.quiesceCalls, 1); + }); + + test( + 'a confirmation from another canary is rejected without consuming the real token', + () async { + final first = _CanaryFixture(); + final second = _CanaryFixture(); + final firstCanary = first.build(); + final secondCanary = second.build(); + final firstConfirmation = await firstCanary.armConfirmed( + message: first.message, + createdAt: testEpoch, + ); + final wrongConfirmation = await secondCanary.armConfirmed( + message: second.message, + createdAt: testEpoch, + ); + + await _expectStateError( + firstCanary.runDoubleConfirmed(wrongConfirmation), + 'cloud_sync_outbound_canary_confirmation_invalid', + ); + expect(first.sessionFactoryCalls, 0); + expect(first.session.admitCalls, 0); + + await firstCanary.runDoubleConfirmed(firstConfirmation); + expect(first.session.admitCalls, 1); + }, + ); + + test( + 'expired confirmation is consumed before any session is created', + () async { + final clock = MutableTestClock(testEpoch); + final fixture = _CanaryFixture(); + final canary = fixture.build(clock: clock); + final confirmation = await canary.armConfirmed( + message: fixture.message, + createdAt: testEpoch, + ); + + clock.advance(CloudSyncManualOutboundCanary.confirmationLifetime); + clock.advance(const Duration(microseconds: 1)); + await _expectStateError( + canary.runDoubleConfirmed(confirmation), + 'cloud_sync_outbound_canary_confirmation_expired', + ); + expect(fixture.sessionFactoryCalls, 0); + expect(fixture.session.admitCalls, 0); + expect(canary.isActive, isFalse); + }, + ); + + test('account replacement blocks admission', () async { + final fixture = _CanaryFixture( + authSnapshots: [ + _auth('session-a', _fingerprintA, _clientA), + _auth('session-b', _fingerprintB, _clientB), + ], + ); + final canary = fixture.build(); + final confirmation = await canary.armConfirmed( + message: fixture.message, + createdAt: testEpoch, + ); + + await _expectStateError( + canary.runDoubleConfirmed(confirmation), + 'account_changed', + ); + expect(fixture.sessionFactoryCalls, 0); + expect(fixture.session.admitCalls, 0); + expect(canary.isActive, isFalse); + }); + + test('every preflight blocker is checked before admission', () async { + final blockers = + <({String expected, CloudSyncShadowPreflightState Function() state})>[ + ( + expected: 'unsupported_platform', + state: () => _readyState(platformSupported: false), + ), + ( + expected: 'not_ui_isolate', + state: () => _readyState(uiIsolate: false), + ), + ( + expected: 'rustpush_not_ready', + state: () => _readyState(rustPushReady: false), + ), + ( + expected: 'objectbox_not_ready', + state: () => _readyState(objectBoxReady: false), + ), + ( + expected: 'storage_unavailable', + state: () => _readyState(privateStorageExists: false), + ), + ( + expected: 'logout_active', + state: () => _readyState(logoutActive: true), + ), + ( + expected: 'legacy_sync_active', + state: () => _readyState(legacySyncEnabled: true), + ), + ( + expected: 'legacy_sync_active', + state: () => _readyState(legacySyncActive: true), + ), + ( + expected: 'coordinator_active', + state: () => _readyState(coordinatorLeaseActive: true), + ), + ( + expected: 'cloud_sync_outbound_canary_outbox_invalid', + state: () => _readyState(outboxCount: 1), + ), + ( + expected: 'protector_unavailable', + state: () => _readyState(protectorSentinelValid: false), + ), + ]; + + for (final blocker in blockers) { + final fixture = _CanaryFixture(preflightStates: [blocker.state()]); + final canary = fixture.build(); + + await _expectStateError( + canary.armConfirmed(message: fixture.message, createdAt: testEpoch), + blocker.expected, + ); + expect(fixture.sessionFactoryCalls, 0, reason: blocker.expected); + expect(fixture.session.admitCalls, 0, reason: blocker.expected); + } + }); + + test('invalid admission is rejected and the session is quiesced', () async { + final fixture = _CanaryFixture( + operation: _validOperation(_scope(_fingerprintB)), + preflightStates: [_readyState(), _readyState()], + ); + final canary = fixture.build(); + final confirmation = await canary.armConfirmed( + message: fixture.message, + createdAt: testEpoch, + ); + + await _expectStateError( + canary.runDoubleConfirmed(confirmation), + 'cloud_sync_outbound_canary_admission_invalid', + ); + expect(fixture.session.admitCalls, 1); + expect(fixture.session.flushCalls, 0); + expect(fixture.session.quiesceCalls, 1); + expect(canary.isActive, isFalse); + }); + + test('delete admission is rejected even when its scope is correct', () async { + final fixture = _CanaryFixture( + operation: testOutboxOperation( + _scope(_fingerprintA), + 1, + action: CloudOutboxAction.delete, + ), + preflightStates: [_readyState(), _readyState()], + ); + final canary = fixture.build(); + final confirmation = await canary.armConfirmed( + message: fixture.message, + createdAt: testEpoch, + ); + + await _expectStateError( + canary.runDoubleConfirmed(confirmation), + 'cloud_sync_outbound_canary_admission_invalid', + ); + expect(fixture.session.quiesceCalls, 1); + }); + + test('a well-formed but unrelated operation identity is rejected', () async { + final fixture = _CanaryFixture( + operation: _validOperation( + _scope(_fingerprintA), + operationId: 'op1:${List.filled(64, 'f').join()}', + ), + preflightStates: [_readyState(), _readyState()], + ); + final canary = fixture.build(); + final confirmation = await canary.armConfirmed( + message: fixture.message, + createdAt: testEpoch, + ); + + await _expectStateError( + canary.runDoubleConfirmed(confirmation), + 'cloud_sync_outbound_canary_admission_invalid', + ); + expect(fixture.session.flushCalls, 0); + expect(fixture.session.quiesceCalls, 1); + }); + + test( + 'double-confirmed recovery advances one row without admitting another', + () async { + final fixture = _CanaryFixture( + preflightStates: [ + _readyState(outboxCount: 1), + _readyState(outboxCount: 1), + _readyState(outboxCount: 1), + ], + ); + final canary = fixture.build(); + + final confirmation = await canary.armRecoveryConfirmed(); + expect(fixture.sessionFactoryCalls, 0); + expect(fixture.session.admitCalls, 0); + + final report = await canary.runDoubleConfirmed(confirmation); + + expect(report.recovery, isTrue); + expect(report.outboxStatus, CloudOutboxStatus.confirmed); + expect(report.terminal, isTrue); + expect(fixture.sessionFactoryCalls, 1); + expect(fixture.session.admitCalls, 0); + expect(fixture.session.flushCalls, 1); + expect(fixture.session.readOutboxCalls, 2); + expect(fixture.session.quiesceCalls, 1); + }, + ); + + test( + 'recovery rejects a leased, wrong-scope, or multiple-row outbox', + () async { + final valid = _validOperation(_scope(_fingerprintA)); + final invalidRows = >[ + [valid.copyWith(status: CloudOutboxStatus.leased)], + [_validOperation(_scope(_fingerprintB))], + [valid, valid], + ]; + + for (final rows in invalidRows) { + final fixture = _CanaryFixture( + preflightStates: [ + _readyState(outboxCount: 1), + _readyState(outboxCount: 1), + ], + outboxReads: [rows], + ); + final canary = fixture.build(); + final confirmation = await canary.armRecoveryConfirmed(); + + await _expectStateError( + canary.runDoubleConfirmed(confirmation), + 'cloud_sync_outbound_canary_recovery_invalid', + ); + expect(fixture.session.admitCalls, 0); + expect(fixture.session.flushCalls, 0); + expect(fixture.session.quiesceCalls, 1); + } + }, + ); + + test('postflight requires the same exact durable operation', () async { + final operation = _validOperation(_scope(_fingerprintA)); + final fixture = _CanaryFixture( + preflightStates: [ + _readyState(), + _readyState(), + _readyState(outboxCount: 1), + ], + operation: operation, + outboxReads: [ + [ + operation.copyWith( + status: CloudOutboxStatus.confirmed, + payloadSha256: List.filled(64, 'c').join(), + ), + ], + ], + ); + final canary = fixture.build(); + final confirmation = await canary.armConfirmed( + message: fixture.message, + createdAt: testEpoch, + ); + + await _expectStateError( + canary.runDoubleConfirmed(confirmation), + 'cloud_sync_outbound_canary_postflight_invalid', + ); + expect(fixture.session.flushCalls, 1); + expect(fixture.session.quiesceCalls, 1); + }); + + test( + 'an ambiguous native outcome remains resumable and is reported', + () async { + final fixture = _CanaryFixture( + preflightStates: [ + _readyState(), + _readyState(), + _readyState(outboxCount: 1), + ], + result: _result(const CloudSyncRunCounters()), + ); + final canary = fixture.build(); + final confirmation = await canary.armConfirmed( + message: fixture.message, + createdAt: testEpoch, + ); + + final report = await canary.runDoubleConfirmed(confirmation); + + expect(report.outboxStatus, CloudOutboxStatus.unknownOutcome); + expect(report.terminal, isFalse); + expect(report.toJson()['outboxStatus'], 'unknownOutcome'); + expect(fixture.session.quiesceCalls, 1); + }, + ); + + test( + 'run tripwires reject fetch, apply, and multiple outbound results', + () async { + final cases = { + 'fetch': const CloudSyncRunCounters(fetched: 1), + 'apply': const CloudSyncRunCounters(applied: 1), + 'multiple outbound': const CloudSyncRunCounters(confirmed: 2), + }; + + for (final entry in cases.entries) { + final fixture = _CanaryFixture( + result: _result(entry.value), + preflightStates: [_readyState(), _readyState()], + ); + final canary = fixture.build(); + final confirmation = await canary.armConfirmed( + message: fixture.message, + createdAt: testEpoch, + ); + + await _expectStateError( + canary.runDoubleConfirmed(confirmation), + 'cloud_sync_outbound_canary_tripwire', + ); + expect(fixture.session.flushCalls, 1, reason: entry.key); + expect(fixture.session.quiesceCalls, 1, reason: entry.key); + expect(canary.isActive, isFalse, reason: entry.key); + } + }, + ); + + test( + 'flush failures also quiesce the session and clear active state', + () async { + final fixture = _CanaryFixture( + preflightStates: [_readyState(), _readyState()], + flushError: StateError('fake flush failure'), + ); + final canary = fixture.build(); + final confirmation = await canary.armConfirmed( + message: fixture.message, + createdAt: testEpoch, + ); + + await _expectStateError( + canary.runDoubleConfirmed(confirmation), + 'fake flush failure', + ); + expect(fixture.session.quiesceCalls, 1); + expect(canary.isActive, isFalse); + }, + ); +} + +Future _expectStateError(Future future, String message) async { + await expectLater( + future, + throwsA( + isA().having((error) => error.message, 'message', message), + ), + ); +} + +CloudSyncShadowPreflightState _readyState({ + bool platformSupported = true, + bool uiIsolate = true, + bool rustPushReady = true, + bool objectBoxReady = true, + bool privateStorageExists = true, + bool logoutActive = false, + bool legacySyncEnabled = false, + bool legacySyncActive = false, + bool coordinatorLeaseActive = false, + int outboxCount = 0, + bool protectorSentinelValid = true, +}) => CloudSyncShadowPreflightState( + platformSupported: platformSupported, + uiIsolate: uiIsolate, + rustPushReady: rustPushReady, + objectBoxReady: objectBoxReady, + privateStorageExists: privateStorageExists, + logoutActive: logoutActive, + legacySyncEnabled: legacySyncEnabled, + legacySyncActive: legacySyncActive, + coordinatorLeaseActive: coordinatorLeaseActive, + outboxCount: outboxCount, + protectorSentinelValid: protectorSentinelValid, +); + +CloudSyncScope _scope(String account) => CloudSyncScope( + accountFingerprint: account, + container: CloudSyncManualOutboundCanary.container, + database: CloudSyncManualOutboundCanary.database, + zone: CloudSyncManualOutboundCanary.zone, + streamKind: CloudSyncStreamKind.messages, + schemaVersion: 2, +); + +CloudSyncNativeAuthSnapshot _auth( + String session, + String fingerprint, + Object client, +) => CloudSyncNativeAuthSnapshot.fromNative( + nativeSessionId: session, + accountFingerprint: fingerprint, + protectedStoreIdentity: + 'obcs2.store.${List.filled(43, fingerprint.substring(0, 1)).join()}', + cloudMessagesClient: client, +); + +CloudSyncRunResult _result(CloudSyncRunCounters counters) { + final now = testEpoch; + return CloudSyncRunResult( + status: CloudSyncRunStatus.completed, + counters: counters, + startedAt: now, + finishedAt: now, + ); +} + +CloudOutboxOperation _validOperation( + CloudSyncScope scope, { + String? operationId, +}) { + final logicalEntityKeyHash = List.filled(43, 'L').join(); + return CloudOutboxOperation( + scope: scope, + operationId: + operationId ?? + CloudOperationIdentity.forInitialCreate( + scope: scope, + logicalEntityKeyHash: logicalEntityKeyHash, + payloadVersion: 1, + ), + logicalEntityKeyHash: logicalEntityKeyHash, + action: CloudOutboxAction.save, + payloadVersion: 1, + mutationRevision: 1, + checkpointGeneration: 1, + encryptedPayloadReference: 'obcs2.ref.${List.filled(43, 'P').join()}', + payloadSha256: List.filled(64, 'a').join(), + serverRecordIdHash: List.filled(43, 'S').join(), + protectedLeaseReference: 'obcs2.lease.${List.filled(32, '0').join()}', + dependencyOperationIds: const [], + createdAt: testEpoch, + ); +} + +final class _CanaryFixture { + _CanaryFixture({ + Iterable? preflightStates, + Iterable? authSnapshots, + CloudOutboxOperation? operation, + CloudSyncRunResult? result, + Iterable>? outboxReads, + this.flushError, + }) : preflight = _PreflightFake( + preflightStates ?? + [_readyState(), _readyState(), _readyState(outboxCount: 1)], + ), + auth = _AuthFake( + authSnapshots ?? [_auth('session-a', _fingerprintA, _clientA)], + ), + session = _SessionFake( + operation ?? _validOperation(_scope(_fingerprintA)), + result ?? _result(const CloudSyncRunCounters(confirmed: 1)), + outboxReads: outboxReads, + flushError: flushError, + ); + + final _PreflightFake preflight; + final _AuthFake auth; + final _SessionFake session; + final Object? flushError; + final message = _FakeCloudMessage(); + final scopes = []; + int sessionFactoryCalls = 0; + + CloudSyncScope get expectedScope => _scope(_fingerprintA); + + CloudSyncManualOutboundCanary build({ + bool? compileGate, + bool? writerGate, + MutableTestClock? clock, + }) => CloudSyncManualOutboundCanary( + readPreflight: preflight.read, + readAuthSnapshot: auth.read, + createSession: (snapshot, scope) async { + sessionFactoryCalls++; + scopes.add(scope); + return session; + }, + compileGateOverrideForTest: compileGate ?? true, + v2WriterOverrideForTest: writerGate ?? true, + clock: (clock ?? MutableTestClock(testEpoch)).call, + ); +} + +final class _PreflightFake { + _PreflightFake(Iterable states) + : _states = states.toList(growable: false); + + final List _states; + int calls = 0; + final outboxCounts = []; + + Future read() async { + final state = _states.length > 1 && calls < _states.length + ? _states[calls] + : _states.last; + calls++; + outboxCounts.add(state.outboxCount); + return state; + } +} + +final class _AuthFake { + _AuthFake(Iterable snapshots) + : _snapshots = snapshots.toList(growable: false); + + final List _snapshots; + int calls = 0; + + Future read() async { + final snapshot = _snapshots.length > 1 && calls < _snapshots.length + ? _snapshots[calls] + : _snapshots.last; + calls++; + return snapshot; + } +} + +final class _SessionFake implements CloudSyncOutboundCanarySession { + _SessionFake( + this.operation, + this.result, { + Iterable>? outboxReads, + this.flushError, + }) : _outboxReads = outboxReads?.toList(growable: false); + + final CloudOutboxOperation operation; + final CloudSyncRunResult result; + final Object? flushError; + final List>? _outboxReads; + int admitCalls = 0; + int flushCalls = 0; + int quiesceCalls = 0; + int readOutboxCalls = 0; + frb_api.CloudMessage? receivedMessage; + + @override + Future admitMessage({ + required frb_api.CloudMessage message, + required DateTime createdAt, + }) async { + admitCalls++; + receivedMessage = message; + return operation; + } + + @override + Future flushOneBatch() async { + flushCalls++; + if (flushError != null) throw flushError!; + return result; + } + + @override + Future> readOutbox() async { + final custom = _outboxReads; + if (custom != null && custom.isNotEmpty) { + final index = readOutboxCalls < custom.length + ? readOutboxCalls + : custom.length - 1; + readOutboxCalls++; + return custom[index]; + } + readOutboxCalls++; + final status = flushCalls == 0 + ? operation.status + : result.counters.confirmed > 0 + ? CloudOutboxStatus.confirmed + : result.counters.quarantined > 0 + ? CloudOutboxStatus.quarantined + : result.counters.retried > 0 + ? CloudOutboxStatus.pending + : CloudOutboxStatus.unknownOutcome; + return [operation.copyWith(status: status)]; + } + + @override + Future quiesce() async { + quiesceCalls++; + } +} + +final class _FakeCloudMessage implements frb_api.CloudMessage { + @override + dynamic noSuchMethod(Invocation invocation) => super.noSuchMethod(invocation); +} diff --git a/test/services/cloud_sync/cloud_sync_manual_semantic_pull_sampler_test.dart b/test/services/cloud_sync/cloud_sync_manual_semantic_pull_sampler_test.dart new file mode 100644 index 0000000000..517bb0096b --- /dev/null +++ b/test/services/cloud_sync/cloud_sync_manual_semantic_pull_sampler_test.dart @@ -0,0 +1,547 @@ +import 'dart:async'; + +import 'package:bluebubbles/services/rustpush/cloud_sync/cloud_sync_manual_semantic_pull_sampler.dart'; +import 'package:bluebubbles/services/rustpush/cloud_sync/cloud_sync_manual_shadow_sampler.dart'; +import 'package:bluebubbles/services/rustpush/cloud_sync/cloud_sync_engine.dart'; +import 'package:bluebubbles/services/rustpush/cloud_sync/cloud_sync_models.dart'; +import 'package:bluebubbles/services/rustpush/cloud_sync/cloud_sync_observability.dart'; +import 'package:bluebubbles/services/rustpush/cloud_sync/cloud_sync_store.dart'; +import 'package:bluebubbles/services/rustpush/cloud_sync/cloud_sync_testing.dart'; +import 'package:bluebubbles/services/rustpush/cloud_sync/cloud_sync_transport.dart'; +import 'package:bluebubbles/services/rustpush/cloud_sync/cloudkit_operation_interlock.dart'; +import 'package:bluebubbles/services/rustpush/cloud_sync/in_memory_cloud_sync_store.dart'; +import 'package:flutter_test/flutter_test.dart'; +import 'package:universal_io/io.dart'; + +const _accountFingerprintA = 'AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA'; +const _accountFingerprintB = 'BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB'; +final _nativeClientA = Object(); +final _nativeClientB = Object(); + +CloudSyncShadowPreflightState _readyState({int outboxCount = 0}) => + CloudSyncShadowPreflightState( + platformSupported: true, + uiIsolate: true, + rustPushReady: true, + objectBoxReady: true, + privateStorageExists: true, + logoutActive: false, + legacySyncEnabled: false, + legacySyncActive: false, + coordinatorLeaseActive: false, + outboxCount: outboxCount, + protectorSentinelValid: true, + ); + +CloudSyncNativeAuthSnapshot _auth({ + String session = 'session-a', + String fingerprint = _accountFingerprintA, + Object? client, +}) => CloudSyncNativeAuthSnapshot.fromNative( + nativeSessionId: session, + accountFingerprint: fingerprint, + protectedStoreIdentity: + 'obcs2.store.AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA', + cloudMessagesClient: client ?? _nativeClientA, +); + +CloudFetchedChange _change(String id) => CloudFetchedChange( + changeId: id, + recordIdHash: 'record-$id', + type: CloudChangeType.save, + etagHash: 'etag-$id', + encryptedServerRecordId: 'protected:server-$id', + protectedSystemFieldsReference: 'protected:system-$id', + encryptedPayloadReference: 'protected:payload-$id', + payloadSha256: 'payload-$id', +); + +CloudSyncManualSemanticPullSampler _sampler({ + required Directory privateStorageDirectory, + required CloudSyncShadowPreflightReader readPreflight, + required CloudSyncNativeAuthSnapshotReader readAuthSnapshot, + required CloudSyncSemanticStoreFactory createStore, + required CloudSyncSemanticRawTransportFactory createRawTransport, + required CloudSyncSemanticInboxApplierFactory createInboxApplier, + required CloudSyncStore operationFenceStore, + bool enabled = true, + Duration? fetchTimeout, + CloudSyncObserverFactory? observerFactory, +}) => CloudSyncManualSemanticPullSampler( + readPreflight: readPreflight, + readAuthSnapshot: readAuthSnapshot, + createStore: createStore, + createRawTransport: createRawTransport, + createInboxApplier: createInboxApplier, + operationFenceStore: operationFenceStore, + privateStorageDirectory: privateStorageDirectory.path, + platform: 'windows', + architecture: 'arm64', + buildCommit: 'test-commit', + compileGateOverrideForTest: enabled, + fetchTimeoutOverrideForTest: fetchTimeout, + observerFactory: observerFactory, +); + +void main() { + late Directory privateStorageDirectory; + + setUp(() { + privateStorageDirectory = Directory.systemTemp.createTempSync( + 'cloud-sync-semantic-pull-sampler-', + ); + }); + + tearDown(() { + privateStorageDirectory.deleteSync(recursive: true); + }); + + test( + 'disabled compile gate performs no work and starts no background run', + () async { + var preflightCalls = 0; + var authCalls = 0; + var storeCalls = 0; + var transportCalls = 0; + var applierCalls = 0; + final sampler = _sampler( + privateStorageDirectory: privateStorageDirectory, + operationFenceStore: InMemoryCloudSyncStore(), + enabled: false, + readPreflight: () async { + preflightCalls++; + throw StateError('disabled sampler performed preflight'); + }, + readAuthSnapshot: () async { + authCalls++; + throw StateError('disabled sampler read auth'); + }, + createStore: (scope) async { + storeCalls++; + throw StateError('disabled sampler created store'); + }, + createRawTransport: (auth, scope) async { + transportCalls++; + throw StateError('disabled sampler created transport'); + }, + createInboxApplier: (auth, scope, generation) async { + applierCalls++; + throw StateError('disabled sampler created applier'); + }, + ); + + await expectLater(sampler.runConfirmed(), throwsStateError); + await Future.delayed(const Duration(milliseconds: 20)); + + expect(sampler.isActive, isFalse); + expect(preflightCalls, 0); + expect(authCalls, 0); + expect(storeCalls, 0); + expect(transportCalls, 0); + expect(applierCalls, 0); + }, + ); + + test( + 'runs only on explicit confirmation in exact zone order with read-only flags', + () async { + final scopes = []; + final transports = {}; + final appliers = {}; + final applied = []; + final stores = {}; + final preflightStates = []; + final observers = {}; + + final sampler = _sampler( + privateStorageDirectory: privateStorageDirectory, + operationFenceStore: InMemoryCloudSyncStore(), + readPreflight: () async { + final state = _readyState(); + preflightStates.add(state); + return state; + }, + readAuthSnapshot: () async => _auth(), + createStore: (scope) async { + scopes.add(scope.zone); + final store = InMemoryCloudSyncStore(); + stores[scope.zone] = store; + return store; + }, + createRawTransport: (auth, scope) async { + final transport = FakeCloudSyncTransport(); + transport.fetchHandler = (scope, token, generation, limit) async => + CloudFetchBatch( + scope: scope, + changes: [_change('change-${scope.zone}')], + batchId: 'batch-${scope.zone}', + generation: generation, + nextToken: 'token-${scope.zone}', + hasMore: false, + ); + transports[scope.zone] = transport; + return transport; + }, + createInboxApplier: (auth, scope, generation) async { + final applier = FakeCloudInboxApplier(); + applier.handler = (entry) async { + applied.add('${scope.zone}:${entry.sequence}'); + return const CloudInboxApplyResult.applied(); + }; + appliers[scope.zone] = applier; + return applier; + }, + observerFactory: (scope) async => + observers[scope.zone] = _RecordingFlushableObserver(), + ); + + expect(scopes, isEmpty); + expect(transports, isEmpty); + expect(appliers, isEmpty); + await Future.delayed(const Duration(milliseconds: 20)); + expect(scopes, isEmpty); + + final report = await sampler.runConfirmed(); + + expect(scopes, CloudSyncManualSemanticPullSampler.zones); + expect(report.zones.map((zone) => zone.zoneLabel), const [ + 'chats', + 'messages', + 'attachments', + ]); + expect(report.zones.map((zone) => zone.fetched), [1, 1, 1]); + expect(report.zones.map((zone) => zone.applied), [1, 1, 1]); + expect(applied, const [ + 'chatManateeZone:1', + 'messageManateeZone:1', + 'attachmentManateeZone:1', + ]); + + expect(sampler.debugFlags.readOnlyFetch, isTrue); + expect(sampler.debugFlags.semanticApply, isTrue); + expect(sampler.debugFlags.saves, isFalse); + expect(sampler.debugFlags.deletions, isFalse); + expect(sampler.debugFlags.profiles, isFalse); + expect(sampler.debugFlags.notificationHints, isFalse); + + expect(report.outboxCountBefore, 0); + expect(report.outboxCountAfter, 0); + expect(preflightStates.map((state) => state.outboxCount), [0, 0]); + expect(report.remoteWriteTripwiresIntact, isTrue); + expect(observers.keys, CloudSyncManualSemanticPullSampler.zones); + expect(observers.values.every((observer) => observer.flushed), isTrue); + expect( + observers.values.every((observer) => observer.events.isNotEmpty), + isTrue, + ); + expect(transports.values.map((transport) => transport.fetchCallCount), [ + 1, + 1, + 1, + ]); + expect(transports.values.map((transport) => transport.pushCallCount), [ + 0, + 0, + 0, + ]); + expect( + transports.values.every( + (transport) => + transport.authenticationRefreshCallCount == 0 && + transport.pcsRefreshCallCount == 0 && + transport.recordMappingCallCount == 0 && + transport.conflictCallCount == 0, + ), + isTrue, + ); + expect( + stores.values.every( + (store) => store.runs.single.counters.confirmed == 0, + ), + isTrue, + ); + + final countsAfterRun = [ + ...transports.values.map((transport) => transport.fetchCallCount), + ]; + await Future.delayed(const Duration(milliseconds: 20)); + expect( + transports.values.map((transport) => transport.fetchCallCount), + countsAfterRun, + ); + }, + ); + + test( + 'provided applier is the only semantic application path and confirmation remains unreachable', + () async { + final transports = []; + final appliers = []; + final sampler = _sampler( + privateStorageDirectory: privateStorageDirectory, + operationFenceStore: InMemoryCloudSyncStore(), + readPreflight: () async => _readyState(), + readAuthSnapshot: () async => _auth(), + createStore: (scope) async => InMemoryCloudSyncStore(), + createRawTransport: (auth, scope) async { + final transport = FakeCloudSyncTransport(); + transport.pushHandler = (scope, operations) async => + CloudPushBatchResult( + outcomes: operations.map( + (operation) => CloudPushOutcome( + operationId: operation.operationId, + disposition: CloudPushDisposition.confirmed, + ), + ), + ); + transport.fetchHandler = (scope, token, generation, limit) async => + CloudFetchBatch( + scope: scope, + changes: [_change('tripwire-${scope.zone}')], + batchId: 'tripwire-batch-${scope.zone}', + generation: generation, + nextToken: null, + hasMore: false, + ); + transports.add(transport); + return transport; + }, + createInboxApplier: (auth, scope, generation) async { + final applier = FakeCloudInboxApplier(); + appliers.add(applier); + return applier; + }, + ); + + final report = await sampler.runConfirmed(); + + expect(appliers, hasLength(3)); + expect( + appliers.every( + (applier) => + applier.appliedSequences.length == 1 && + applier.appliedSequences.single == 1, + ), + isTrue, + ); + expect( + transports.every((transport) => transport.pushCallCount == 0), + isTrue, + ); + expect(report.zones.every((zone) => zone.applied == 1), isTrue); + expect( + report.zones.every( + (zone) => zone.status == CloudSyncRunStatus.completed, + ), + isTrue, + ); + }, + ); + + test( + 'account replacement fails closed before journaling or applying the page', + () async { + var current = _auth(); + final stores = {}; + final transports = []; + final applied = []; + final sampler = _sampler( + privateStorageDirectory: privateStorageDirectory, + operationFenceStore: InMemoryCloudSyncStore(), + readPreflight: () async => _readyState(), + readAuthSnapshot: () async => current, + createStore: (scope) async { + final store = InMemoryCloudSyncStore(); + stores[scope.zone] = store; + return store; + }, + createRawTransport: (auth, scope) async { + final transport = FakeCloudSyncTransport(); + transport.fetchHandler = (scope, token, generation, limit) async { + current = _auth( + session: 'session-b', + fingerprint: _accountFingerprintB, + client: _nativeClientB, + ); + return CloudFetchBatch( + scope: scope, + changes: [_change('stale-${scope.zone}')], + batchId: 'stale-batch-${scope.zone}', + generation: generation, + nextToken: 'must-not-commit', + hasMore: false, + ); + }; + transports.add(transport); + return transport; + }, + createInboxApplier: (auth, scope, generation) async { + final applier = FakeCloudInboxApplier(); + applier.handler = (entry) async { + applied.add(entry.sequence); + return const CloudInboxApplyResult.applied(); + }; + return applier; + }, + ); + + await expectLater( + sampler.runConfirmed(), + throwsA( + isA().having( + (error) => error.message, + 'message', + 'account_changed', + ), + ), + ); + + expect(transports, hasLength(1)); + expect(transports.single.fetchCallCount, 1); + expect(applied, isEmpty); + final store = stores.values.single; + final scope = CloudSyncScope( + accountFingerprint: _accountFingerprintA, + container: CloudSyncManualSemanticPullSampler.container, + database: CloudSyncManualSemanticPullSampler.database, + zone: CloudSyncManualSemanticPullSampler.zones.first, + ); + expect((await store.readCheckpoint(scope)).fetchedToken, isNull); + expect(await store.inboxEntries(scope), isEmpty); + expect(transports.single.pushCallCount, 0); + expect(sampler.isActive, isFalse); + }, + ); + + test( + 'fetch timeout waits for native quiescence before releasing the interlock', + () async { + final nativeFetch = Completer(); + final nativeFetchEntered = Completer(); + final fenceStore = InMemoryCloudSyncStore(); + final stores = {}; + var transportIndex = 0; + var quiesceStarted = false; + var quiesceCompleted = false; + final sampler = _sampler( + privateStorageDirectory: privateStorageDirectory, + operationFenceStore: fenceStore, + fetchTimeout: const Duration(milliseconds: 5), + readPreflight: () async => _readyState(), + readAuthSnapshot: () async => _auth(), + createStore: (scope) async { + final store = InMemoryCloudSyncStore(); + stores[scope.zone] = store; + return store; + }, + createRawTransport: (auth, scope) async { + if (transportIndex++ == 0) { + return _JoinableTransport( + fetchHandler: (scope, token, generation, limit) { + nativeFetchEntered.complete(); + return nativeFetch.future; + }, + quiesce: () async { + quiesceStarted = true; + await nativeFetch.future; + quiesceCompleted = true; + }, + ); + } + return FakeCloudSyncTransport(); + }, + createInboxApplier: (auth, scope, generation) async => + FakeCloudInboxApplier(), + ); + + final run = sampler.runConfirmed(); + await nativeFetchEntered.future; + await Future.delayed(const Duration(milliseconds: 20)); + expect(quiesceStarted, isTrue); + expect(quiesceCompleted, isFalse); + expect(sampler.isActive, isTrue); + + final competingInterlock = CloudKitOperationInterlock( + privateStorageDirectory: privateStorageDirectory.path, + fenceStore: fenceStore, + ); + await expectLater( + competingInterlock.runExclusive( + kind: CloudKitOperationKind.legacyReadWrite, + action: () async {}, + ), + throwsA( + isA().having( + (error) => error.safeCode, + 'safeCode', + 'cloudkit_interlock_busy', + ), + ), + ); + + nativeFetch.complete( + CloudFetchBatch( + scope: CloudSyncScope( + accountFingerprint: _accountFingerprintA, + container: CloudSyncManualSemanticPullSampler.container, + database: CloudSyncManualSemanticPullSampler.database, + zone: CloudSyncManualSemanticPullSampler.zones.first, + ), + changes: const [], + batchId: 'late-native-page', + generation: 1, + nextToken: 'late-token', + hasMore: false, + ), + ); + + final report = await run; + expect(quiesceCompleted, isTrue); + expect(sampler.isActive, isFalse); + expect(report.zones.first.status, CloudSyncRunStatus.degraded); + expect(report.zones.first.failureCategory, CloudFailureCategory.network); + final firstScope = CloudSyncScope( + accountFingerprint: _accountFingerprintA, + container: CloudSyncManualSemanticPullSampler.container, + database: CloudSyncManualSemanticPullSampler.database, + zone: CloudSyncManualSemanticPullSampler.zones.first, + ); + expect( + (await stores[firstScope.zone]!.readCheckpoint( + firstScope, + )).fetchedToken, + isNull, + ); + await competingInterlock.runExclusive( + kind: CloudKitOperationKind.legacyReadWrite, + action: () async {}, + ); + }, + ); +} + +final class _RecordingFlushableObserver implements FlushableCloudSyncObserver { + final List events = []; + bool flushed = false; + + @override + void onEvent(CloudSyncEvent event) => events.add(event); + + @override + Future flush() async => flushed = true; +} + +final class _JoinableTransport extends FakeCloudSyncTransport + implements CloudSyncNativeOperationQuiescence { + _JoinableTransport({ + required CloudFetchHandler fetchHandler, + required this.quiesce, + }) { + this.fetchHandler = fetchHandler; + } + + final Future Function() quiesce; + + @override + Future quiesceNativeOperations() => quiesce(); +} diff --git a/test/services/cloud_sync/cloud_sync_manual_shadow_controller_test.dart b/test/services/cloud_sync/cloud_sync_manual_shadow_controller_test.dart new file mode 100644 index 0000000000..b368fe674c --- /dev/null +++ b/test/services/cloud_sync/cloud_sync_manual_shadow_controller_test.dart @@ -0,0 +1,127 @@ +import 'dart:async'; + +import 'package:bluebubbles/services/rustpush/cloud_sync/cloud_sync_engine.dart'; +import 'package:bluebubbles/services/rustpush/cloud_sync/cloud_sync_manual_shadow_controller.dart'; +import 'package:bluebubbles/services/rustpush/cloud_sync/cloud_sync_shadow_report.dart'; +import 'package:flutter_test/flutter_test.dart'; + +void main() { + CloudSyncShadowReport report() => CloudSyncShadowReport( + runId: 'shadow-test', + correlationTag: 'ephemeral', + timestampUtc: DateTime.utc(2026, 8, 2), + platform: 'android', + architecture: 'arm64', + buildCommit: 'test', + legacySyncEnabled: false, + pageLimit: 1, + changeLimit: 50, + tripwiresArmed: true, + outboxCountBefore: 0, + outboxCountAfter: 0, + zones: const [ + CloudSyncShadowZoneReport( + zoneLabel: 'messages', + status: CloudSyncRunStatus.completed, + fetched: 0, + journaled: 0, + rejected: 0, + estimatedBytes: 0, + elapsedMilliseconds: 1, + ), + ], + ); + + test('returns only after the redacted report is persisted', () async { + final events = []; + final controller = CloudSyncManualShadowController( + runConfirmed: () async { + events.add('run'); + return report(); + }, + persistReport: (value) async { + events.add('persist:${value.runId}'); + return Object(); + }, + ); + + expect((await controller.runConfirmedAndPersist()).runId, 'shadow-test'); + expect(events, ['run', 'persist:shadow-test']); + expect(controller.isActive, isFalse); + }); + + test('rejects concurrent manual runs', () async { + final release = Completer(); + final controller = CloudSyncManualShadowController( + runConfirmed: () async { + await release.future; + return report(); + }, + persistReport: (_) async => Object(), + ); + + final first = controller.runConfirmedAndPersist(); + expect( + controller.runConfirmedAndPersist, + throwsA( + isA().having( + (error) => error.message, + 'message', + 'cloud_sync_shadow_controller_active', + ), + ), + ); + release.complete(); + await first; + }); + + test('dispose closes admission and waits for the current run', () async { + final entered = Completer(); + final release = Completer(); + final controller = CloudSyncManualShadowController( + runConfirmed: () async { + entered.complete(); + await release.future; + return report(); + }, + persistReport: (_) async => Object(), + ); + + final running = controller.runConfirmedAndPersist(); + await entered.future; + var disposed = false; + final disposal = controller.dispose().then((_) => disposed = true); + await Future.delayed(Duration.zero); + expect(disposed, isFalse); + expect(controller.isDisposed, isTrue); + expect( + controller.runConfirmedAndPersist, + throwsA( + isA().having( + (error) => error.message, + 'message', + 'cloud_sync_shadow_controller_disposed', + ), + ), + ); + + release.complete(); + await running; + await disposal; + expect(disposed, isTrue); + }); + + test('dispose is idempotent and absorbs an in-flight failure', () async { + final controller = CloudSyncManualShadowController( + runConfirmed: () async => throw StateError('expected-run-failure'), + persistReport: (_) async => Object(), + ); + + final running = controller.runConfirmedAndPersist(); + final first = controller.dispose(); + final second = controller.dispose(); + await expectLater(running, throwsStateError); + await first; + await second; + }); +} diff --git a/test/services/cloud_sync/cloud_sync_manual_shadow_owner_test.dart b/test/services/cloud_sync/cloud_sync_manual_shadow_owner_test.dart new file mode 100644 index 0000000000..387c4cbf26 --- /dev/null +++ b/test/services/cloud_sync/cloud_sync_manual_shadow_owner_test.dart @@ -0,0 +1,168 @@ +import 'dart:async'; + +import 'package:bluebubbles/services/rustpush/cloud_sync/cloud_sync_engine.dart'; +import 'package:bluebubbles/services/rustpush/cloud_sync/cloud_sync_manual_shadow_controller.dart'; +import 'package:bluebubbles/services/rustpush/cloud_sync/cloud_sync_manual_shadow_owner.dart'; +import 'package:bluebubbles/services/rustpush/cloud_sync/cloud_sync_shadow_report.dart'; +import 'package:flutter_test/flutter_test.dart'; + +void main() { + test('builds lazily and reuses one account controller', () async { + var builds = 0; + final owner = CloudSyncManualShadowOwner( + buildController: () async { + builds++; + return controller(report: report('run-$builds')); + }, + ); + + expect(builds, 0); + expect((await owner.runConfirmedAndPersist()).runId, 'run-1'); + expect((await owner.runConfirmedAndPersist()).runId, 'run-1'); + expect(builds, 1); + }); + + test('account quiescence waits for an active run', () async { + final runStarted = Completer(); + final finishRun = Completer(); + final owner = CloudSyncManualShadowOwner( + buildController: () async => CloudSyncManualShadowController( + runConfirmed: () { + runStarted.complete(); + return finishRun.future; + }, + persistReport: (_) async => Object(), + ), + ); + + final run = owner.runConfirmedAndPersist(); + await runStarted.future; + var quiesced = false; + final quiesce = owner.quiesceForAccountTransition().then((_) { + quiesced = true; + }); + await Future.delayed(Duration.zero); + expect(quiesced, isFalse); + await expectLater( + owner.runConfirmedAndPersist(), + throwsA( + isA().having( + (error) => error.message, + 'message', + 'cloud_sync_shadow_owner_quiescing', + ), + ), + ); + + finishRun.complete(report('active')); + await run; + await quiesce; + expect(quiesced, isTrue); + }); + + test( + 'a construction race is superseded and its controller is disposed', + () async { + final buildStarted = Completer(); + final finishBuild = Completer(); + final owner = CloudSyncManualShadowOwner( + buildController: () { + buildStarted.complete(); + return finishBuild.future; + }, + ); + + final run = owner.runConfirmedAndPersist(); + await buildStarted.future; + final quiesce = owner.quiesceForAccountTransition(); + final candidate = controller(report: report('superseded')); + finishBuild.complete(candidate); + + await expectLater( + run, + throwsA( + isA().having( + (error) => error.message, + 'message', + 'cloud_sync_shadow_owner_superseded', + ), + ), + ); + await quiesce; + expect(candidate.isDisposed, isTrue); + }, + ); + + test('resume creates a fresh controller for the next account', () async { + var builds = 0; + final owner = CloudSyncManualShadowOwner( + buildController: () async { + builds++; + return controller(report: report('run-$builds')); + }, + ); + + expect((await owner.runConfirmedAndPersist()).runId, 'run-1'); + await owner.quiesceForAccountTransition(); + await owner.resumeAfterAccountTransition(); + expect((await owner.runConfirmedAndPersist()).runId, 'run-2'); + expect(builds, 2); + }); + + test('dispose is idempotent and permanently closes admission', () async { + final owner = CloudSyncManualShadowOwner( + buildController: () async => controller(report: report('unused')), + ); + + await owner.dispose(); + await owner.dispose(); + expect(owner.isDisposed, isTrue); + await expectLater( + owner.runConfirmedAndPersist(), + throwsA( + isA().having( + (error) => error.message, + 'message', + 'cloud_sync_shadow_owner_disposed', + ), + ), + ); + }); +} + +CloudSyncManualShadowController controller({ + required CloudSyncShadowReport report, +}) { + return CloudSyncManualShadowController( + runConfirmed: () async => report, + persistReport: (_) async => Object(), + ); +} + +CloudSyncShadowReport report(String runId) { + return CloudSyncShadowReport( + runId: runId, + correlationTag: 'ephemeral', + timestampUtc: DateTime.utc(2026, 8, 2), + platform: 'android', + architecture: 'arm64', + buildCommit: 'test', + legacySyncEnabled: false, + pageLimit: 1, + changeLimit: 50, + tripwiresArmed: true, + outboxCountBefore: 0, + outboxCountAfter: 0, + zones: const [ + CloudSyncShadowZoneReport( + zoneLabel: 'messages', + status: CloudSyncRunStatus.completed, + fetched: 0, + journaled: 0, + rejected: 0, + estimatedBytes: 0, + elapsedMilliseconds: 1, + ), + ], + ); +} diff --git a/test/services/cloud_sync/cloud_sync_manual_shadow_sampler_test.dart b/test/services/cloud_sync/cloud_sync_manual_shadow_sampler_test.dart new file mode 100644 index 0000000000..9eaf332743 --- /dev/null +++ b/test/services/cloud_sync/cloud_sync_manual_shadow_sampler_test.dart @@ -0,0 +1,427 @@ +import 'dart:async'; + +import 'package:bluebubbles/services/rustpush/cloud_sync/cloud_sync_manual_shadow_sampler.dart'; +import 'package:bluebubbles/services/rustpush/cloud_sync/cloud_sync_manual_shadow_controller.dart'; +import 'package:bluebubbles/services/rustpush/cloud_sync/cloud_sync_manual_shadow_owner.dart'; +import 'package:bluebubbles/services/rustpush/cloud_sync/cloud_sync_models.dart'; +import 'package:bluebubbles/services/rustpush/cloud_sync/cloud_sync_observability.dart'; +import 'package:bluebubbles/services/rustpush/cloud_sync/cloud_sync_transport.dart'; +import 'package:bluebubbles/services/rustpush/cloud_sync/cloud_sync_testing.dart'; +import 'package:bluebubbles/services/rustpush/cloud_sync/cloudkit_operation_interlock.dart'; +import 'package:bluebubbles/services/rustpush/cloud_sync/in_memory_cloud_sync_store.dart'; +import 'package:flutter_test/flutter_test.dart'; +import 'package:universal_io/io.dart'; + +CloudSyncShadowPreflightState readyState({ + bool legacySyncEnabled = false, + int outboxCount = 0, +}) => CloudSyncShadowPreflightState( + platformSupported: true, + uiIsolate: true, + rustPushReady: true, + objectBoxReady: true, + privateStorageExists: true, + logoutActive: false, + legacySyncEnabled: legacySyncEnabled, + legacySyncActive: false, + coordinatorLeaseActive: false, + outboxCount: outboxCount, + protectorSentinelValid: true, +); + +final testCloudMessagesClient = Object(); + +CloudSyncNativeAuthSnapshot auth( + String session, [ + String fp = 'FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF', + Object? client, +]) => CloudSyncNativeAuthSnapshot.fromNative( + nativeSessionId: session, + accountFingerprint: fp, + protectedStoreIdentity: + 'obcs2.store.AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA', + cloudMessagesClient: client ?? testCloudMessagesClient, +); + +void main() { + late Directory privateStorageDirectory; + + setUp(() { + privateStorageDirectory = Directory.systemTemp.createTempSync( + 'cloud-sync-sampler-', + ); + }); + + tearDown(() { + privateStorageDirectory.deleteSync(recursive: true); + }); + + test('native auth snapshot rejects non-HMAC account identifiers', () { + expect( + () => CloudSyncNativeAuthSnapshot.fromNative( + nativeSessionId: 'session', + accountFingerprint: 'raw-account@example.com', + protectedStoreIdentity: + 'obcs2.store.AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA', + cloudMessagesClient: Object(), + ), + throwsArgumentError, + ); + }); + + test( + 'disabled gate performs no preflight, store, or transport work', + () async { + var preflightCalls = 0; + var storeCalls = 0; + var transportCalls = 0; + final sampler = CloudSyncManualShadowSampler( + readPreflight: () async { + preflightCalls++; + return readyState(); + }, + readAuthSnapshot: () async => auth('session-a'), + createStore: (scope) async { + storeCalls++; + return InMemoryCloudSyncStore(); + }, + createRawTransport: (snapshot, scope) async { + transportCalls++; + return FakeCloudSyncTransport(); + }, + operationFenceStore: InMemoryCloudSyncStore(), + privateStorageDirectory: privateStorageDirectory.path, + platform: 'windows', + architecture: 'arm64', + buildCommit: 'test', + compileGateOverrideForTest: false, + ); + + await expectLater(sampler.runConfirmed(), throwsStateError); + expect(preflightCalls, 0); + expect(storeCalls, 0); + expect(transportCalls, 0); + }, + ); + + test( + 'owns exact bounded read-only composition for all fixed zones', + () async { + final transports = []; + final scopes = []; + final observers = {}; + final sampler = CloudSyncManualShadowSampler( + readPreflight: () async => readyState(), + readAuthSnapshot: () async => auth('session-a'), + createStore: (scope) async { + scopes.add(scope); + return InMemoryCloudSyncStore(); + }, + createRawTransport: (snapshot, scope) async { + final transport = FakeCloudSyncTransport(); + transports.add(transport); + return transport; + }, + operationFenceStore: InMemoryCloudSyncStore(), + privateStorageDirectory: privateStorageDirectory.path, + platform: 'windows', + architecture: 'arm64', + buildCommit: 'test', + observerFactory: (scope) async => + observers[scope.zone] = _RecordingFlushableObserver(), + compileGateOverrideForTest: true, + ); + + final report = await sampler.runConfirmed(); + + expect( + scopes.map((scope) => scope.zone), + CloudSyncManualShadowSampler.zones, + ); + expect(transports.map((transport) => transport.fetchCallCount), [ + 1, + 1, + 1, + 1, + 1, + 1, + 1, + ]); + expect(transports.map((transport) => transport.pushCallCount), [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + ]); + expect(report.zones.map((zone) => zone.zoneLabel), const [ + 'chats', + 'messages', + 'attachments', + 'message updates', + 'recoverable deletes', + 'scheduled messages', + 'chat1 manatee', + ]); + expect(report.pageLimit, 1); + expect(report.changeLimit, 50); + expect(report.toJson(), isNot(contains('fingerprintPrefix'))); + expect(report.correlationTag, hasLength(16)); + expect(report.isValidReadOnlySuccess, isTrue); + expect(observers.keys, CloudSyncManualShadowSampler.zones); + expect(observers.values.every((observer) => observer.flushed), isTrue); + expect( + observers.values.every((observer) => observer.events.isNotEmpty), + isTrue, + ); + expect(sampler.debugFlags.readOnlyFetch, isTrue); + expect(sampler.debugFlags.semanticApply, isFalse); + expect(sampler.debugFlags.saves, isFalse); + expect(sampler.debugFlags.deletions, isFalse); + expect(sampler.debugFlags.profiles, isFalse); + expect(sampler.debugFlags.notificationHints, isFalse); + }, + ); + + test('account switch during fetch cannot journal the stale page', () async { + var current = auth('session-a'); + late InMemoryCloudSyncStore store; + final sampler = CloudSyncManualShadowSampler( + readPreflight: () async => readyState(), + readAuthSnapshot: () async => current, + createStore: (scope) async => store = InMemoryCloudSyncStore(), + createRawTransport: (snapshot, scope) async { + final transport = FakeCloudSyncTransport(); + transport.fetchHandler = (scope, token, generation, limit) async { + current = auth( + 'session-b', + 'OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO', + ); + return CloudFetchBatch( + scope: scope, + changes: const [], + batchId: 'stale-page', + generation: generation, + nextToken: 'must-not-commit', + hasMore: false, + ); + }; + return transport; + }, + operationFenceStore: InMemoryCloudSyncStore(), + privateStorageDirectory: privateStorageDirectory.path, + platform: 'android', + architecture: 'arm64', + buildCommit: 'test', + compileGateOverrideForTest: true, + ); + + await expectLater(sampler.runConfirmed(), throwsStateError); + final scope = CloudSyncScope( + accountFingerprint: 'FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF', + container: CloudSyncManualShadowSampler.container, + database: CloudSyncManualShadowSampler.database, + zone: CloudSyncManualShadowSampler.zones.first, + ); + expect((await store.readCheckpoint(scope)).fetchedToken, isNull); + }); + + test('late fetch completion after timeout cannot journal', () async { + final fetch = Completer(); + late InMemoryCloudSyncStore store; + late CloudSyncScope observedScope; + final sampler = CloudSyncManualShadowSampler( + readPreflight: () async => readyState(), + readAuthSnapshot: () async => auth('session-a'), + createStore: (scope) async { + observedScope = scope; + return store = InMemoryCloudSyncStore(); + }, + createRawTransport: (snapshot, scope) async { + final transport = FakeCloudSyncTransport() + ..fetchHandler = (scope, token, generation, limit) => fetch.future; + return transport; + }, + operationFenceStore: InMemoryCloudSyncStore(), + privateStorageDirectory: privateStorageDirectory.path, + platform: 'windows', + architecture: 'x64', + buildCommit: 'test', + compileGateOverrideForTest: true, + fetchTimeoutOverrideForTest: const Duration(milliseconds: 10), + ); + + final report = await sampler.runConfirmed(); + expect(report.zones.first.status.name, 'degraded'); + fetch.complete( + CloudFetchBatch( + scope: observedScope, + changes: const [], + batchId: 'late', + generation: 1, + nextToken: 'late-token', + hasMore: false, + ), + ); + await Future.delayed(const Duration(milliseconds: 10)); + expect((await store.readCheckpoint(observedScope)).fetchedToken, isNull); + }); + + test( + 'timeout keeps owner and interlock fenced until native quiescence joins', + () async { + final nativeFetch = Completer(); + final nativeFetchEntered = Completer(); + final fenceStore = InMemoryCloudSyncStore(); + var transportIndex = 0; + final sampler = CloudSyncManualShadowSampler( + readPreflight: () async => readyState(), + readAuthSnapshot: () async => auth('session-a'), + createStore: (scope) async => InMemoryCloudSyncStore(), + createRawTransport: (snapshot, scope) async { + if (transportIndex++ > 0) return FakeCloudSyncTransport(); + return _JoinableFakeCloudSyncTransport( + fetchHandler: (scope, token, generation, limit) { + nativeFetchEntered.complete(); + return nativeFetch.future; + }, + join: () async { + try { + await nativeFetch.future; + } catch (_) { + // The native completion itself is the credential boundary. + } + }, + ); + }, + operationFenceStore: fenceStore, + privateStorageDirectory: privateStorageDirectory.path, + platform: 'windows', + architecture: 'arm64', + buildCommit: 'test', + compileGateOverrideForTest: true, + fetchTimeoutOverrideForTest: const Duration(milliseconds: 5), + ); + final controller = CloudSyncManualShadowController( + runConfirmed: sampler.runConfirmed, + persistReport: (_) async => Object(), + ); + final owner = CloudSyncManualShadowOwner( + buildController: () async => controller, + ); + + final run = owner.runConfirmedAndPersist(); + await nativeFetchEntered.future; + var quiesced = false; + final ownerQuiescence = owner.quiesceForAccountTransition().then((_) { + quiesced = true; + }); + await Future.delayed(const Duration(milliseconds: 20)); + expect(quiesced, isFalse); + + final conflicting = CloudKitOperationInterlock( + privateStorageDirectory: privateStorageDirectory.path, + fenceStore: fenceStore, + ); + await expectLater( + conflicting.runExclusive( + kind: CloudKitOperationKind.legacyReadWrite, + action: () async {}, + ), + throwsA( + isA().having( + (error) => error.safeCode, + 'safeCode', + 'cloudkit_interlock_busy', + ), + ), + ); + + nativeFetch.complete( + CloudFetchBatch( + scope: CloudSyncScope( + accountFingerprint: 'FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF', + container: CloudSyncManualShadowSampler.container, + database: CloudSyncManualShadowSampler.database, + zone: CloudSyncManualShadowSampler.zones.first, + ), + changes: const [], + batchId: 'late-native-page', + generation: 1, + nextToken: null, + hasMore: false, + ), + ); + await run; + await ownerQuiescence; + expect(quiesced, isTrue); + await conflicting.runExclusive( + kind: CloudKitOperationKind.legacyReadWrite, + action: () async {}, + ); + }, + ); + + test('legacy sync and concurrent runs fail closed', () async { + final blocker = Completer(); + var legacy = true; + final sampler = CloudSyncManualShadowSampler( + readPreflight: () async => readyState(legacySyncEnabled: legacy), + readAuthSnapshot: () async => auth('session-a'), + createStore: (scope) async { + await blocker.future; + return InMemoryCloudSyncStore(); + }, + createRawTransport: (snapshot, scope) async => FakeCloudSyncTransport(), + operationFenceStore: InMemoryCloudSyncStore(), + privateStorageDirectory: privateStorageDirectory.path, + platform: 'windows', + architecture: 'arm64', + buildCommit: 'test', + compileGateOverrideForTest: true, + ); + + await expectLater(sampler.runConfirmed(), throwsStateError); + legacy = false; + final first = sampler.runConfirmed(); + await Future.delayed(Duration.zero); + await expectLater(sampler.runConfirmed(), throwsStateError); + blocker.complete(); + await first; + expect(sampler.isActive, isFalse); + }); +} + +final class _RecordingFlushableObserver implements FlushableCloudSyncObserver { + final List events = []; + bool flushed = false; + + @override + void onEvent(CloudSyncEvent event) => events.add(event); + + @override + Future flush() async => flushed = true; +} + +final class _JoinableFakeCloudSyncTransport extends FakeCloudSyncTransport + implements CloudSyncNativeOperationQuiescence { + _JoinableFakeCloudSyncTransport({ + required Future Function( + CloudSyncScope scope, + String? token, + int generation, + int limit, + ) + fetchHandler, + required this._join, + }) { + this.fetchHandler = fetchHandler; + } + + final Future Function() _join; + + @override + Future quiesceNativeOperations() => _join(); +} diff --git a/test/services/cloud_sync/cloud_sync_outbound_admission_test.dart b/test/services/cloud_sync/cloud_sync_outbound_admission_test.dart new file mode 100644 index 0000000000..6bcc543826 --- /dev/null +++ b/test/services/cloud_sync/cloud_sync_outbound_admission_test.dart @@ -0,0 +1,251 @@ +import 'dart:async'; +import 'dart:convert'; +import 'dart:io'; + +import 'package:bluebubbles/database/models.dart'; +import 'package:bluebubbles/services/rustpush/cloud_sync/cloud_sync.dart'; +import 'package:bluebubbles/services/rustpush/cloud_sync/objectbox_cloud_sync_store.dart'; +import 'package:bluebubbles/src/rust/api/api.dart' as frb_api; +import 'package:crypto/crypto.dart'; +import 'package:flutter_test/flutter_test.dart'; + +import 'cloud_sync_test_helpers.dart'; + +void main() { + late Directory directory; + late Store objectBox; + late ObjectBoxCloudSyncStore store; + late _StagingTransport transport; + late List timeline; + late CloudSyncOutboundAdmissionCoordinator coordinator; + + setUp(() async { + directory = await Directory.systemTemp.createTemp( + 'openbubbles-cloud-sync-outbound-admission-', + ); + objectBox = await openStore(directory: directory.path); + store = ObjectBoxCloudSyncStore( + store: objectBox, + protector: _Protector(), + clock: () => testEpoch, + ); + timeline = []; + transport = _StagingTransport(timeline); + coordinator = CloudSyncOutboundAdmissionCoordinator( + store: store, + transport: transport, + ensureProtectedStoreRecovered: () async { + timeline.add('recover'); + }, + ); + }); + + tearDown(() async { + objectBox.close(); + if (directory.existsSync()) await directory.delete(recursive: true); + }); + + test('persists adoption before committing the exact native lease', () async { + final stage = _stage('a', 'P', 'L', 'S'); + transport.stages.add(stage); + + final operation = await coordinator.admitMessage( + testScope(), + message: _FakeCloudMessage(), + createdAt: testEpoch, + ); + + expect(timeline, ['recover', 'stage', 'commit:${stage.leaseReference}']); + expect(operation.protectedLeaseReference, stage.leaseReference); + expect( + await store.readNonterminalProtectedOutboundLeaseReferences( + maximumCount: 4096, + ), + {stage.leaseReference}, + ); + final mapping = await store.readRecordMap( + testScope(), + logicalEntityKeyHash: stage.logicalEntityKeyHash, + generation: 1, + ); + expect(mapping?.encryptedServerRecordId, stage.protectedEnvelopeReference); + }); + + test( + 'restaged retry keeps the durable identity and rolls back only the new lease', + () async { + final first = _stage('a', 'P', 'L', 'S'); + final retry = _stage('b', 'Q', 'L', 'T'); + transport.stages.addAll([first, retry]); + final initial = await coordinator.admitMessage( + testScope(), + message: _FakeCloudMessage(), + createdAt: testEpoch, + ); + final repeated = await coordinator.admitMessage( + testScope(), + message: _FakeCloudMessage(), + createdAt: testEpoch.add(const Duration(seconds: 1)), + ); + + expect(repeated.operationId, initial.operationId); + expect(repeated.protectedLeaseReference, first.leaseReference); + expect(transport.committed, [first.leaseReference]); + expect(transport.rolledBack, [retry.leaseReference]); + }, + ); + + test('commit failure preserves adopted data for startup recovery', () async { + final stage = _stage('a', 'P', 'L', 'S'); + transport + ..stages.add(stage) + ..commitFailure = StateError('commit failed'); + + await expectLater( + coordinator.admitMessage( + testScope(), + message: _FakeCloudMessage(), + createdAt: testEpoch, + ), + throwsStateError, + ); + + expect(transport.rolledBack, isEmpty); + expect( + await store.readNonterminalProtectedOutboundLeaseReferences( + maximumCount: 4096, + ), + {stage.leaseReference}, + ); + }); + + test( + 'recovery cannot enter between native stage and durable adoption', + () async { + final stage = _stage('a', 'P', 'L', 'S'); + final stageEntered = Completer(); + final releaseStage = Completer(); + transport + ..stages.add(stage) + ..stageEntered = stageEntered + ..releaseStage = releaseStage; + + final admission = coordinator.admitMessage( + testScope(), + message: _FakeCloudMessage(), + createdAt: testEpoch, + ); + await stageEntered.future; + final concurrentRecovery = transport.runOutboundAdmissionExclusive( + () async { + timeline.add('concurrent-recovery'); + }, + ); + await Future.delayed(Duration.zero); + expect(timeline, ['recover', 'stage']); + + releaseStage.complete(); + await admission; + await concurrentRecovery; + expect(timeline, [ + 'recover', + 'stage', + 'commit:${stage.leaseReference}', + 'concurrent-recovery', + ]); + }, + ); +} + +CloudSyncProtectedOutboundStageData _stage( + String leaseCharacter, + String referenceCharacter, + String logicalCharacter, + String serverCharacter, +) => CloudSyncProtectedOutboundStageData( + logicalEntityKeyHash: List.filled(43, logicalCharacter).join(), + protectedEnvelopeReference: testProtectedReference(referenceCharacter), + payloadSha256: testSha256('a'), + serverRecordIdHash: List.filled(43, serverCharacter).join(), + leaseReference: testProtectedLeaseReference(leaseCharacter), +); + +final class _FakeCloudMessage implements frb_api.CloudMessage { + @override + dynamic noSuchMethod(Invocation invocation) => super.noSuchMethod(invocation); +} + +final class _StagingTransport implements CloudSyncOutboundStagingTransport { + _StagingTransport(this.timeline); + + final List timeline; + final List stages = []; + final List committed = []; + final List rolledBack = []; + Object? commitFailure; + Completer? stageEntered; + Completer? releaseStage; + Future _exclusiveTail = Future.value(); + + @override + Future runOutboundAdmissionExclusive( + Future Function() action, + ) async { + final previous = _exclusiveTail; + final released = Completer(); + _exclusiveTail = previous.then((_) => released.future); + await previous; + try { + return await action(); + } finally { + released.complete(); + } + } + + @override + Future stageOutboundMessage( + CloudSyncScope scope, { + required frb_api.CloudMessage message, + }) async { + timeline.add('stage'); + stageEntered?.complete(); + await releaseStage?.future; + return stages.removeAt(0); + } + + @override + Future commitOutboundLease( + String leaseReference, + String protectedEnvelopeReference, + ) async { + timeline.add('commit:$leaseReference'); + if (commitFailure case final failure?) throw failure; + committed.add(leaseReference); + } + + @override + Future rollbackOutboundLease(String leaseReference) async { + timeline.add('rollback:$leaseReference'); + rolledBack.add(leaseReference); + } +} + +final class _Protector implements CloudSyncProtector { + @override + Future fingerprintAccount(String rawAccountIdentifier) async => + sha256.convert(utf8.encode(rawAccountIdentifier)).toString(); + + @override + Future protect({ + required CloudSyncScope scope, + required CloudSyncProtectedValueKind kind, + required String plaintext, + }) async => 'protected:$plaintext'; + + @override + Future unprotect({ + required CloudSyncScope scope, + required CloudSyncProtectedValueKind kind, + required String ciphertext, + }) async => ciphertext.substring('protected:'.length); +} diff --git a/test/services/cloud_sync/cloud_sync_outbound_canary_candidate_test.dart b/test/services/cloud_sync/cloud_sync_outbound_canary_candidate_test.dart new file mode 100644 index 0000000000..006782a8b5 --- /dev/null +++ b/test/services/cloud_sync/cloud_sync_outbound_canary_candidate_test.dart @@ -0,0 +1,408 @@ +import 'dart:io'; + +import 'package:bluebubbles/database/global/payload_data.dart' as payload_data; +import 'package:bluebubbles/database/models.dart'; +import 'package:bluebubbles/helpers/types/constants.dart' as constants; +import 'package:bluebubbles/services/rustpush/cloud_sync/cloud_sync_outbound_canary_candidate.dart'; +import 'package:bluebubbles/src/rust/api/api.dart' as api; +import 'package:flutter_test/flutter_test.dart'; + +final _now = DateTime.utc(2026, 8, 22, 12); +const _opaqueCloudMessage = _FakeCloudMessage(); + +void main() { + test('selects the newest eligible one-to-one text', () { + final older = _ordinaryMessage( + guid: 'older-message', + text: 'older text', + createdAt: _now.subtract(const Duration(minutes: 2)), + ); + final newest = _ordinaryMessage( + guid: 'newest-message', + text: 'newest text', + createdAt: _now.subtract(const Duration(minutes: 1)), + ); + final encoded = []; + + final candidate = CloudSyncOutboundCanaryCandidateSelector( + reader: _Reader([older, newest]), + encoder: (message) { + encoded.add(message); + return _opaqueCloudMessage; + }, + clock: () => _now, + ).selectNewest(); + + expect(candidate, isNotNull); + expect(encoded, [newest]); + expect(candidate!.cloudMessage, same(_opaqueCloudMessage)); + expect(candidate.characterCount, 'newest text'.runes.length); + expect(candidate.createdAtUtc, newest.dateCreated!.toUtc()); + expect(candidate.guidHash, 'f094c2d57a312a52'); + }); + + test('returns only redacted diagnostics', () { + final candidate = CloudSyncOutboundCanaryCandidateSelector( + reader: _Reader([ + _ordinaryMessage( + guid: 'redaction-guid', + text: 'THIS MUST NEVER APPEAR IN DIAGNOSTICS', + ), + ]), + encoder: (_) => _opaqueCloudMessage, + clock: () => _now, + ).selectNewest()!; + + final diagnostic = '${candidate.toString()} ${candidate.toJson()}'; + expect(diagnostic, contains('guidHash')); + expect(diagnostic, contains('characterCount')); + expect(diagnostic, isNot(contains('THIS MUST NEVER APPEAR'))); + expect(diagnostic, isNot(contains('person@example.com'))); + expect(diagnostic, isNot(contains('redaction-guid'))); + }); + + test('never falls back when the newest outgoing row is unsafe', () { + final older = _ordinaryMessage( + guid: 'older-safe-message', + createdAt: _now.subtract(const Duration(minutes: 2)), + ); + final newest = _ordinaryMessage( + guid: 'newest-unsafe-message', + createdAt: _now.subtract(const Duration(minutes: 1)), + hasAttachments: true, + ); + var conversions = 0; + + final candidate = CloudSyncOutboundCanaryCandidateSelector( + reader: _Reader([older, newest]), + encoder: (_) { + conversions++; + return _opaqueCloudMessage; + }, + clock: () => _now, + ).selectNewest(); + + expect(candidate, isNull); + expect(conversions, 0); + }); + + test('never falls back after newest-row conversion failure', () { + final older = _ordinaryMessage( + guid: 'older-safe-message', + createdAt: _now.subtract(const Duration(minutes: 2)), + ); + final newest = _ordinaryMessage( + guid: 'newest-conversion-failure', + createdAt: _now.subtract(const Duration(minutes: 1)), + ); + final encoded = []; + + final candidate = CloudSyncOutboundCanaryCandidateSelector( + reader: _Reader([older, newest]), + encoder: (message) { + encoded.add(message); + throw StateError('conversion_failed'); + }, + clock: () => _now, + ).selectNewest(); + + expect(candidate, isNull); + expect(encoded, [newest]); + }); + + test('rejects a candidate older than the short operator-intent window', () { + final candidate = CloudSyncOutboundCanaryCandidateSelector( + reader: _Reader([ + _ordinaryMessage( + createdAt: _now.subtract( + CloudSyncOutboundCanaryCandidateSelector.maximumCandidateAge + + const Duration(seconds: 1), + ), + ), + ]), + encoder: (_) => _opaqueCloudMessage, + clock: () => _now, + ).selectNewest(); + + expect(candidate, isNull); + }); + + for (final entry in { + 'incoming': () => _ordinaryMessage(isFromMe: false), + 'missing guid': () => _ordinaryMessage(guid: null), + 'empty text': () => _ordinaryMessage(text: ' '), + 'missing date': () => _ordinaryMessage(missingDate: true), + 'attachments flag': () => _ordinaryMessage(hasAttachments: true), + 'attachment list': () => + _ordinaryMessage(attachments: [Attachment(guid: 'attachment-guid')]), + 'attachment run': () => _ordinaryMessage( + runAttributes: Attributes( + messagePart: 0, + attachmentGuid: 'attachment-guid', + ), + ), + 'reaction association': () => + _ordinaryMessage(associatedMessageGuid: 'parent-guid'), + 'sticker association': () => + _ordinaryMessage(associatedMessageType: 'sticker'), + 'reply association': () => + _ordinaryMessage(threadOriginatorGuid: 'parent-guid'), + 'scheduled': () => _ordinaryMessage(dateScheduled: _now), + 'deleted': () => _ordinaryMessage(dateDeleted: _now), + 'staging': () => _ordinaryMessage(stagingGuid: 'staging-guid'), + 'sending error': () => _ordinaryMessage(error: 1), + 'sending service': () => _ordinaryMessage(sendingServiceId: 'iMessage'), + 'effect': () => _ordinaryMessage(expressiveSendStyleId: 'com.apple.effect'), + 'balloon': () => _ordinaryMessage(balloonBundleId: 'bundle'), + 'payload': () => _ordinaryMessage( + payloadData: payload_data.PayloadData(type: constants.PayloadType.url), + ), + 'apple payload marker': () => _ordinaryMessage(hasApplePayloadData: true), + 'edit metadata': () => + _ordinaryMessage(messageSummaryInfo: [MessageSummaryInfo.empty()]), + 'generic metadata': () => _ordinaryMessage(metadata: {}), + 'scheduled record already has CloudKit id': () => + _ordinaryMessage(ckRecordId: 'record-id'), + 'already crawled': () => _ordinaryMessage(ckSyncState: true), + 'subject': () => _ordinaryMessage(subject: 'subject'), + 'multiple attributed bodies': () => _ordinaryMessage( + attributedBody: [ + AttributedBody.raw('message'), + AttributedBody.raw('second'), + ], + ), + 'malformed attributed range': () => _ordinaryMessage(runRange: [1, 7]), + 'mention': () => _ordinaryMessage( + runAttributes: Attributes(messagePart: 0, mention: 'person@example.com'), + ), + 'audio transcript': () => _ordinaryMessage( + runAttributes: Attributes(messagePart: 0, audioTranscript: 'audio'), + ), + 'styled text': () => + _ordinaryMessage(runAttributes: Attributes(messagePart: 0, bold: true)), + }.entries) { + test('skips ${entry.key}', () { + var conversions = 0; + final candidate = CloudSyncOutboundCanaryCandidateSelector( + reader: _Reader([entry.value()]), + encoder: (_) { + conversions++; + return _opaqueCloudMessage; + }, + clock: () => _now, + ).selectNewest(); + + expect(candidate, isNull, reason: entry.key); + expect(conversions, 0, reason: 'conversion must happen after validation'); + }); + } + + test('skips SMS, RCS, and group conversations', () { + final sms = _ordinaryMessage(chat: _chat(isRpSms: true)); + final rcs = _ordinaryMessage(chat: _chat(participantService: 'RCS')); + final group = _ordinaryMessage( + chat: _chat( + participants: [ + _handle('person@example.com'), + _handle('second@example.com'), + ], + ), + ); + final styleGroup = _ordinaryMessage(chat: _chat(style: 43)); + + for (final message in [sms, rcs, group, styleGroup]) { + var conversions = 0; + final candidate = CloudSyncOutboundCanaryCandidateSelector( + reader: _Reader([message]), + encoder: (_) { + conversions++; + return _opaqueCloudMessage; + }, + clock: () => _now, + ).selectNewest(); + expect(candidate, isNull); + expect(conversions, 0); + } + }); + + test('does not mutate a valid message while converting it', () { + final message = _ordinaryMessage(text: 'unchanged text'); + final body = message.attributedBody.single; + final originalGuid = message.guid; + final originalText = message.text; + final originalBody = message.attributedBody; + + final candidate = CloudSyncOutboundCanaryCandidateSelector( + reader: _Reader([message]), + encoder: (value) { + expect(value, same(message)); + return _opaqueCloudMessage; + }, + clock: () => _now, + ).selectNewest(); + + expect(candidate, isNotNull); + expect(message.guid, originalGuid); + expect(message.text, originalText); + expect(identical(message.attributedBody, originalBody), isTrue); + expect(body.string, 'unchanged text'); + expect(body.runs.single.range, [0, 'unchanged text'.length]); + expect(body.runs.single.attributes!.messagePart, 0); + expect(body.runs.single.attributes!.attachmentGuid, isNull); + expect(body.runs.single.attributes!.mention, isNull); + }); + + test( + 'ObjectBox reader is query-only and returns the newest eligible row', + () async { + final directory = await Directory.systemTemp.createTemp( + 'openbubbles-cloud-sync-canary-candidate-', + ); + final objectBox = await openStore(directory: directory.path); + try { + final handles = objectBox.box(); + final chats = objectBox.box(); + final messages = objectBox.box(); + final handle = _handle('person@example.com'); + handles.put(handle); + final chat = _chat(); + chat.handles.add(handle); + chats.put(chat); + final message = _ordinaryMessage( + guid: 'objectbox-message', + text: 'objectbox text', + createdAt: _now.subtract(const Duration(minutes: 1)), + chat: chat, + ); + final id = messages.put(message); + final countBefore = messages.count(); + + final candidate = CloudSyncOutboundCanaryCandidateSelector( + reader: ObjectBoxCloudSyncOutboundCanaryMessageReader( + messages: messages, + ), + encoder: (_) => _opaqueCloudMessage, + clock: () => _now, + ).selectNewest(); + + expect(candidate, isNotNull); + expect(messages.count(), countBefore); + expect(messages.get(id)!.guid, 'objectbox-message'); + expect(messages.get(id)!.text, 'objectbox text'); + } finally { + objectBox.close(); + if (directory.existsSync()) { + await directory.delete(recursive: true); + } + } + }, + ); +} + +final class _Reader implements CloudSyncOutboundCanaryMessageReader { + _Reader(this.messages); + + final List messages; + + @override + List readMessages() => List.of(messages); +} + +Message _ordinaryMessage({ + String? guid = 'message-guid', + String? text = 'ordinary text', + DateTime? createdAt, + bool missingDate = false, + bool isFromMe = true, + Chat? chat, + bool hasAttachments = false, + List attachments = const [], + List? attributedBody, + Attributes? runAttributes, + List? runRange, + String? associatedMessageGuid, + String? associatedMessageType, + String? threadOriginatorGuid, + DateTime? dateScheduled, + DateTime? dateDeleted, + String? stagingGuid, + String? sendingServiceId, + int error = 0, + String? expressiveSendStyleId, + String? balloonBundleId, + PayloadData? payloadData, + bool hasApplePayloadData = false, + List messageSummaryInfo = const [], + Map? metadata, + String? ckRecordId, + bool ckSyncState = false, + String? subject, +}) { + final actualText = text ?? 'ordinary text'; + final body = AttributedBody( + string: actualText, + runs: [ + Run( + range: runRange ?? [0, actualText.length], + attributes: runAttributes ?? Attributes(messagePart: 0), + ), + ], + ); + final message = Message( + guid: guid, + text: text, + dateCreated: missingDate ? null : (createdAt ?? _now), + isFromMe: isFromMe, + hasAttachments: hasAttachments, + attachments: attachments, + attributedBody: attributedBody ?? [body], + associatedMessageGuid: associatedMessageGuid, + associatedMessageType: associatedMessageType, + threadOriginatorGuid: threadOriginatorGuid, + dateScheduled: dateScheduled, + dateDeleted: dateDeleted, + stagingGuid: stagingGuid, + sendingServiceId: sendingServiceId, + error: error, + expressiveSendStyleId: expressiveSendStyleId, + balloonBundleId: balloonBundleId, + payloadData: payloadData, + hasApplePayloadData: hasApplePayloadData, + messageSummaryInfo: messageSummaryInfo, + metadata: metadata, + ckRecordId: ckRecordId, + subject: subject, + )..ckSyncState = ckSyncState; + message.chat.target = chat ?? _chat(); + return message; +} + +Chat _chat({ + bool isRpSms = false, + int? style = 45, + String participantService = 'iMessage', + List? participants, +}) { + return Chat( + guid: 'iMessage;-;person@example.com', + chatIdentifier: 'person@example.com', + usingHandle: 'me@example.com', + isRpSms: isRpSms, + style: style, + participants: + participants ?? [_handle('person@example.com', participantService)], + ); +} + +Handle _handle(String address, [String service = 'iMessage']) => Handle( + address: address, + service: service, + uniqueAddressAndService: '$address/$service', +); + +final class _FakeCloudMessage implements api.CloudMessage { + const _FakeCloudMessage(); + + @override + dynamic noSuchMethod(Invocation invocation) => super.noSuchMethod(invocation); +} diff --git a/test/services/cloud_sync/cloud_sync_platform_test.dart b/test/services/cloud_sync/cloud_sync_platform_test.dart new file mode 100644 index 0000000000..1c557f68da --- /dev/null +++ b/test/services/cloud_sync/cloud_sync_platform_test.dart @@ -0,0 +1,191 @@ +import 'dart:async'; + +import 'package:bluebubbles/services/rustpush/cloud_sync/cloud_sync_engine.dart'; +import 'package:bluebubbles/services/rustpush/cloud_sync/cloud_sync_platform.dart'; +import 'package:bluebubbles/services/rustpush/cloud_sync/cloud_sync_runtime.dart'; +import 'package:bluebubbles/services/rustpush/cloud_sync/cloud_sync_testing.dart'; +import 'package:bluebubbles/services/rustpush/cloud_sync/in_memory_cloud_sync_store.dart'; +import 'package:flutter_test/flutter_test.dart'; + +import 'cloud_sync_test_helpers.dart'; + +void main() { + CloudSyncPlatformContext context({ + String account = testAccountFingerprintA, + String storage = r'C:\private\openbubbles', + }) { + return CloudSyncPlatformContext( + platform: CloudSyncPlatformKind.windows, + architecture: CloudSyncArchitecture.arm64, + accountFingerprint: account, + privateStorageDirectory: storage, + ); + } + + (CloudSyncPlatformAdapter, FakeCloudSyncTransport) adapterFor( + CloudSyncPlatformContext platformContext, { + bool manualSamplerEnabled = false, + CloudSyncPlatformTriggerPolicy triggerPolicy = + const CloudSyncPlatformTriggerPolicy(), + bool automaticTriggerRolloutEnabled = false, + }) { + final transport = FakeCloudSyncTransport(); + final scope = testScope(account: platformContext.accountFingerprint); + final engine = CloudSyncEngine( + scope: scope, + coordinatorId: 'platform-${platformContext.accountFingerprint}', + store: InMemoryCloudSyncStore(), + transport: transport, + inboxApplier: FakeCloudInboxApplier(), + config: CloudSyncEngineConfig( + flags: const CloudSyncFeatureFlags( + readOnlyFetch: true, + semanticApply: false, + saves: false, + deletions: false, + profiles: false, + notificationHints: false, + ), + ), + ); + return ( + CloudSyncPlatformAdapter( + context: platformContext, + runtime: CloudSyncShadowRuntime( + engines: [engine], + debounce: Duration.zero, + automaticTriggersEnabled: false, + ), + triggerPolicy: triggerPolicy, + manualSamplerEnabled: manualSamplerEnabled, + automaticTriggerRolloutEnabled: automaticTriggerRolloutEnabled, + ), + transport, + ); + } + + test('validates account and private storage boundaries', () { + expect(() => context(account: ' '), throwsArgumentError); + expect(() => context(storage: r'C:\'), throwsArgumentError); + expect(() => context(storage: 'relative/path'), throwsArgumentError); + expect( + context(storage: '/data/user/0/app/files').privateStorageDirectory, + '/data/user/0/app/files', + ); + }); + + test('all future platform wake sources remain inert by default', () async { + final (adapter, transport) = adapterFor(context()); + + adapter.onAndroidApnsWake(); + adapter.onAndroidWorkManagerWake(); + adapter.onWindowsStartup(); + adapter.onWindowsResume(); + adapter.onNetworkReconnect(); + await Future.delayed(Duration.zero); + + expect(transport.fetchCallCount, 0); + await adapter.dispose(); + }); + + test( + 'automatic wake stays inert even when source policy is staged', + () async { + final (adapter, transport) = adapterFor( + context(), + triggerPolicy: const CloudSyncPlatformTriggerPolicy( + androidApnsWake: true, + androidWorkManagerWake: true, + windowsStartup: true, + windowsResume: true, + networkReconnect: true, + ), + automaticTriggerRolloutEnabled: true, + ); + + adapter.onAndroidApnsWake(); + adapter.onAndroidWorkManagerWake(); + adapter.onWindowsStartup(); + adapter.onWindowsResume(); + adapter.onNetworkReconnect(); + await Future.delayed(Duration.zero); + + // The owned shadow runtime is also required to remain dormant. + expect(transport.fetchCallCount, 0); + await adapter.dispose(); + }, + ); + + test('manual sampler requires an explicit composition gate', () async { + final (disabled, disabledTransport) = adapterFor(context()); + expect(disabled.synchronizeNow, throwsStateError); + expect(disabledTransport.fetchCallCount, 0); + await disabled.dispose(); + + final (enabled, enabledTransport) = adapterFor( + context(), + manualSamplerEnabled: true, + ); + final results = await enabled.synchronizeNow(); + expect(results, hasLength(1)); + expect(enabledTransport.fetchCallCount, 1); + await enabled.dispose(); + }); + + test( + 'account switch disposes old runtime before installing new one', + () async { + final host = CloudSyncPlatformHost(); + final firstContext = context(account: testAccountFingerprintA); + final secondContext = context(account: testAccountFingerprintB); + final (first, _) = adapterFor(firstContext); + final (second, _) = adapterFor(secondContext); + + await host.activate(context: firstContext, build: (_) async => first); + await host.activate(context: secondContext, build: (_) async => second); + + expect(first.isDisposed, isTrue); + expect(host.active, same(second)); + expect(host.active!.context.accountFingerprint, testAccountFingerprintB); + await host.dispose(); + expect(second.isDisposed, isTrue); + }, + ); + + test('rejects a builder that returns another account context', () async { + final host = CloudSyncPlatformHost(); + final requested = context(account: testAccountFingerprintA); + final (wrong, _) = adapterFor(context(account: testAccountFingerprintB)); + + await expectLater( + host.activate(context: requested, build: (_) async => wrong), + throwsStateError, + ); + expect(wrong.isDisposed, isTrue); + expect(host.active, isNull); + }); + + test('a newer activation supersedes and disposes a delayed build', () async { + final host = CloudSyncPlatformHost(); + final firstContext = context(account: testAccountFingerprintA); + final secondContext = context(account: testAccountFingerprintB); + final (first, _) = adapterFor(firstContext); + final (second, _) = adapterFor(secondContext); + final releaseFirst = Completer(); + + final delayed = host.activate( + context: firstContext, + build: (_) async { + await releaseFirst.future; + return first; + }, + ); + await host.activate(context: secondContext, build: (_) async => second); + releaseFirst.complete(); + + await expectLater(delayed, throwsStateError); + expect(first.isDisposed, isTrue); + expect(host.active, same(second)); + await host.dispose(); + }); +} diff --git a/test/services/cloud_sync/cloud_sync_production_composition_contract_test.dart b/test/services/cloud_sync/cloud_sync_production_composition_contract_test.dart new file mode 100644 index 0000000000..9c71dce7f1 --- /dev/null +++ b/test/services/cloud_sync/cloud_sync_production_composition_contract_test.dart @@ -0,0 +1,353 @@ +import 'dart:io'; + +import 'package:bluebubbles/services/rustpush/cloud_sync/cloud_sync_dev_gate.dart'; +import 'package:flutter_test/flutter_test.dart'; + +void main() { + test('ordinary builds keep the manual production sampler absent', () { + expect(CloudSyncDevGate.manualShadowSamplerEnabled, isFalse); + expect(CloudSyncDevGate.manualSemanticPullEnabled, isFalse); + expect(CloudSyncDevGate.manualOutboundCanaryEnabled, isFalse); + expect(CloudSyncDevGate.protocolEvidenceAvailable, isFalse); + }); + + test('evidence canary is a distinct read-only Android artifact', () { + final workflow = File('.github/workflows/build.yml').readAsStringSync(); + final gradle = File('android/app/build.gradle').readAsStringSync(); + final betaStart = workflow.indexOf( + 'Build Beta Debug APK with the Cloud Sync V2 sampler', + ); + final canaryStart = workflow.indexOf( + 'Build developer-only CloudKit V2 Evidence Canary APK', + ); + expect(betaStart, greaterThanOrEqualTo(0)); + expect(canaryStart, greaterThan(betaStart)); + final betaBuild = workflow.substring(betaStart, canaryStart); + expect(betaBuild, isNot(contains('OPENBUBBLES_CLOUDKIT_WRITER_OWNER'))); + expect( + betaBuild, + isNot(contains('OPENBUBBLES_CLOUD_SYNC_V2_OUTBOUND_CANARY')), + ); + expect(betaBuild, isNot(contains('OPENBUBBLES_CLOUD_SYNC_V2_EVIDENCE'))); + final canaryBuild = workflow.substring(canaryStart); + expect(canaryBuild, isNot(contains('OPENBUBBLES_CLOUDKIT_WRITER_OWNER'))); + expect( + canaryBuild, + isNot(contains('OPENBUBBLES_CLOUD_SYNC_V2_OUTBOUND_CANARY')), + ); + expect( + canaryBuild, + contains('--dart-define=OPENBUBBLES_CLOUD_SYNC_V2_SAMPLER=true'), + ); + expect( + canaryBuild, + contains('--dart-define=OPENBUBBLES_CLOUD_SYNC_V2_SEMANTIC_PULL=true'), + ); + expect( + canaryBuild, + contains('--dart-define=OPENBUBBLES_CLOUD_SYNC_V2_EVIDENCE=true'), + ); + expect(canaryBuild, contains('app-canary-debug.apk')); + expect( + gradle, + contains('applicationId "com.bluebubbles.messaging.cloudkitcanary"'), + ); + expect(gradle, contains('applicationId "com.bluebubbles.messaging.beta"')); + expect(gradle, contains('applicationId "com.bluebubbles.messaging.alpha"')); + }); + + test('outbound runtime requires V2 ownership and blocks the legacy path', () { + final source = File( + 'lib/services/rustpush/rustpush_service.dart', + ).readAsStringSync(); + final availability = source.indexOf( + 'bool get cloudSyncV2ManualOutboundAvailable', + ); + final legacy = source.indexOf('_runLegacyCloudKitOperation'); + expect(availability, greaterThanOrEqualTo(0)); + expect(legacy, greaterThan(availability)); + final outbound = source.substring(availability, legacy); + expect(outbound, contains('CloudSyncDevGate.manualOutboundCanaryEnabled')); + expect(outbound, contains('CloudKitWriterOwnership.v2MutationsEnabled')); + expect(outbound, contains('prepareCloudSyncV2OutboundWriter')); + expect(outbound, contains('armCloudSyncV2OutboundConfirmed')); + expect(outbound, contains('armCloudSyncV2OutboundRecoveryConfirmed')); + expect(outbound, contains('runCloudSyncV2OutboundDoubleConfirmed')); + expect(outbound, contains('pendingCountForScope')); + expect(outbound, contains("lookupPortByName('bg_sync')")); + + final legacyEnd = source.indexOf('_runCloudKitDestructiveReset', legacy); + final legacyBlock = source.substring(legacy, legacyEnd); + expect(legacyBlock, contains('CloudKitWriterOwner.v2')); + expect(legacyBlock, contains('legacy_cloudkit_blocked_by_v2_writer')); + }); + + test('beta sampler CI explicitly enables both independent canary gates', () { + final workflow = File('.github/workflows/build.yml').readAsStringSync(); + expect( + workflow, + contains('--dart-define=OPENBUBBLES_CLOUD_SYNC_V2_SAMPLER=true'), + ); + expect( + workflow, + contains('--dart-define=OPENBUBBLES_CLOUD_SYNC_V2_SEMANTIC_PULL=true'), + ); + }); + + test('production entry point requires both developer safety gates', () { + final source = File( + 'lib/services/rustpush/rustpush_service.dart', + ).readAsStringSync(); + final methodStart = source.indexOf('runCloudSyncV2ManualShadowConfirmed()'); + final methodEnd = source.indexOf( + 'CloudSyncManualShadowOwner _cloudSyncV2Owner()', + methodStart, + ); + + expect(methodStart, greaterThanOrEqualTo(0)); + expect(methodEnd, greaterThan(methodStart)); + final method = source.substring(methodStart, methodEnd); + expect(method, contains('CloudSyncDevGate.manualShadowSamplerEnabled')); + expect(method, contains('_cloudSyncV2DeveloperRuntimeAllowed')); + expect(method, contains('ss.settings.developerEnabled.value')); + expect(method, isNot(contains('Platform.isWindows ||'))); + expect(method, contains('runConfirmedAndPersist()')); + }); + + test('semantic production entry point is separately gated and bounded', () { + final source = File( + 'lib/services/rustpush/rustpush_service.dart', + ).readAsStringSync(); + final methodStart = source.indexOf( + 'runCloudSyncV2ManualSemanticPullConfirmed()', + ); + final methodEnd = source.indexOf( + '_runCloudSyncV2ManualSemanticPull() async', + methodStart, + ); + + expect(methodStart, greaterThanOrEqualTo(0)); + expect(methodEnd, greaterThan(methodStart)); + final method = source.substring(methodStart, methodEnd); + expect(method, contains('CloudSyncDevGate.manualSemanticPullEnabled')); + expect(method, contains('_cloudSyncV2DeveloperRuntimeAllowed')); + expect(method, contains('_cloudSyncV2SemanticPullQuiescing')); + expect(method, contains('_cloudSyncV2SemanticPullInFlight')); + expect(method, contains('cloud_sync_semantic_pull_disabled')); + expect(method, contains('cloud_sync_semantic_pull_active')); + }); + + test('manual shadow UI is developer-gated and serializes confirmations', () { + final source = File( + 'lib/app/layouts/settings/pages/misc/troubleshoot_panel.dart', + ).readAsStringSync(); + final sectionStart = source.indexOf('text: "Cloud Sync V2"'); + final sectionEnd = source.indexOf('SettingsHeader(', sectionStart + 1); + expect(sectionStart, greaterThanOrEqualTo(0)); + final section = source.substring( + sectionStart, + sectionEnd < 0 ? source.length : sectionEnd, + ); + + final wrapperStart = source.lastIndexOf( + 'if ((CloudSyncDevGate.manualShadowSamplerEnabled ||', + sectionStart, + ); + expect(wrapperStart, greaterThanOrEqualTo(0)); + expect( + source.substring(wrapperStart, sectionStart), + contains('ss.settings.developerEnabled.value'), + ); + expect( + source.substring(wrapperStart, sectionStart), + contains('CloudSyncDevGate.protocolEvidenceAvailable'), + ); + + final shadowStart = section.indexOf('title: "Run Read-only Shadow Sample"'); + final semanticGate = section.indexOf( + 'if (CloudSyncDevGate.manualSemanticPullEnabled)', + shadowStart, + ); + expect(shadowStart, greaterThanOrEqualTo(0)); + expect(semanticGate, greaterThan(shadowStart)); + final shadow = section.substring(shadowStart, semanticGate); + final confirmed = shadow.indexOf('if (confirmed != true) return;'); + final recheck = shadow.indexOf( + 'if (cloudSyncV2Running.value) return;', + confirmed, + ); + final claim = shadow.indexOf('cloudSyncV2Running.value = true;', confirmed); + final run = shadow.indexOf( + 'runCloudSyncV2ManualShadowConfirmed()', + confirmed, + ); + expect(confirmed, greaterThanOrEqualTo(0)); + expect(recheck, greaterThan(confirmed)); + expect(claim, greaterThan(recheck)); + expect(run, greaterThan(claim)); + expect(shadow, contains('protected local journal, checkpoint')); + expect(shadow, contains('No CloudKit writes or semantic applies')); + expect(shadow, contains('cloudSyncV2SafeFailureCode(error)')); + expect(shadow, isNot(contains('catch (_)'))); + + final semanticStart = section.indexOf('title: "Run Semantic Pull Canary"'); + final semantic = section.substring(semanticStart); + expect(semantic, contains('cloudSyncV2ManualSemanticPullAvailable')); + expect(semantic, contains('runCloudSyncV2ManualSemanticPullConfirmed()')); + expect(semantic, contains('Local canonical chats, messages, reactions')); + expect(semantic, contains('No CloudKit uploads or deletes')); + expect(semantic, contains('no local message deletes')); + expect(semantic, contains('tombstones are quarantined')); + expect(semantic, contains('CloudSyncRunStatus.completed')); + expect(semantic, contains('expectedZones')); + expect(semantic, contains('reportedZones.containsAll(expectedZones)')); + expect(semantic, contains('report.zones.length == expectedZones.length')); + expect(semantic, contains('final canaryPassed')); + expect(semantic, contains('deferred == 0')); + expect(semantic, contains('quarantined == 0')); + expect(semantic, contains('retried == 0')); + expect(semantic, isNot(contains('CloudSyncRunStatus.skipped'))); + expect(semantic, contains('remoteWriteTripwiresIntact')); + expect(semantic, contains('Incomplete records/zone')); + expect(semantic, contains('cloudSyncV2SafeFailureCode(error)')); + expect(semantic, isNot(contains('catch (_)'))); + expect( + semantic, + isNot(contains('title: "Upload One Existing Text Canary"')), + ); + expect( + semantic, + isNot(contains('title: "Recover One Interrupted Upload"')), + ); + expect(section, contains('title: "Record CloudKit protocol evidence"')); + expect(section, contains('CloudSyncDevGate.protocolEvidenceAvailable')); + expect(section, contains('cloudSyncV2EvidenceEnabled')); + expect(section, contains('Never records message text')); + }); + + test('protocol evidence preference is default-off and developer-bound', () { + final settings = File( + 'lib/database/global/settings.dart', + ).readAsStringSync(); + final panel = File( + 'lib/app/layouts/settings/pages/misc/troubleshoot_panel.dart', + ).readAsStringSync(); + + expect( + settings, + contains('final RxBool cloudSyncV2EvidenceEnabled = false.obs;'), + ); + expect( + settings, + contains( + "'cloudSyncV2EvidenceEnabled': cloudSyncV2EvidenceEnabled.value", + ), + ); + expect(settings, contains("map['cloudSyncV2EvidenceEnabled'] ?? false")); + expect( + panel, + contains('ss.settings.cloudSyncV2EvidenceEnabled.value = false'), + ); + expect(panel, contains("'cloudSyncV2EvidenceEnabled'")); + }); + + test('outbound UI remains absent until remote absence proof exists', () { + final source = File( + 'lib/app/layouts/settings/pages/misc/troubleshoot_panel.dart', + ).readAsStringSync(); + expect(source, isNot(contains('_runCloudSyncV2OutboundCanary'))); + expect(source, isNot(contains('_recoverCloudSyncV2OutboundCanary'))); + expect(source, isNot(contains('Upload One Existing Text Canary'))); + expect(source, isNot(contains('Recover One Interrupted Upload'))); + }); + + test('semantic sampler pins local-only flags and manual trigger', () { + final source = File( + 'lib/services/rustpush/cloud_sync/cloud_sync_manual_semantic_pull_sampler.dart', + ).readAsStringSync(); + final configStart = source.indexOf('CloudSyncEngineConfig _config()'); + final configEnd = source.indexOf('void _validatePreflight', configStart); + expect(configStart, greaterThanOrEqualTo(0)); + expect(configEnd, greaterThan(configStart)); + final config = source.substring(configStart, configEnd); + + expect(source, contains('trigger: CloudSyncTrigger.manual')); + expect(config, contains('readOnlyFetch: true')); + expect(config, contains('semanticApply: true')); + expect(config, contains('saves: false')); + expect(config, contains('deletions: false')); + expect(config, contains('profiles: false')); + expect(config, contains('notificationHints: false')); + expect(source, isNot(contains('Timer('))); + expect(source, isNot(contains('WorkManager'))); + expect(source, isNot(contains('onNetworkReconnect'))); + expect(source, isNot(contains('onIdsReconnect'))); + }); + + test('account teardown quiesces V2 before releasing Rust state', () { + final source = File( + 'lib/services/rustpush/rustpush_service.dart', + ).readAsStringSync(); + final resetStart = source.indexOf( + 'Future reset(bool hw, bool logout, bool setup)', + ); + final resetEnd = source.indexOf('void disposeState(', resetStart); + expect(resetStart, greaterThanOrEqualTo(0)); + expect(resetEnd, greaterThan(resetStart)); + + final reset = source.substring(resetStart, resetEnd); + final quiesce = reset.indexOf('_cloudSyncV2SemanticPullQuiescing = true;'); + final semanticWait = reset.indexOf('final semanticPull ='); + final awaitSemantic = reset.indexOf( + 'await semanticPull.timeout(', + semanticWait, + ); + final boundedWait = reset.indexOf( + '_cloudSyncV2SemanticPullQuiescenceTimeout', + awaitSemantic, + ); + final safeAbort = reset.indexOf( + 'cloud_sync_semantic_pull_quiescence_timeout', + boundedWait, + ); + final detachState = reset.indexOf('state = null'); + final outboundWait = reset.indexOf( + 'await outbound.timeout(_cloudSyncV2OutboundQuiescenceTimeout)', + ); + final nativeReset = reset.indexOf('api.resetState('); + final resume = reset.indexOf('resumeAfterAccountTransition()'); + + expect(quiesce, greaterThanOrEqualTo(0)); + expect(semanticWait, greaterThan(quiesce)); + expect(awaitSemantic, greaterThan(semanticWait)); + expect(boundedWait, greaterThan(awaitSemantic)); + expect(safeAbort, greaterThan(boundedWait)); + expect(outboundWait, greaterThan(safeAbort)); + expect(detachState, greaterThan(outboundWait)); + expect(nativeReset, greaterThan(detachState)); + expect(resume, greaterThan(nativeReset)); + expect(reset, contains('finally')); + }); + + test('production composition has no automatic V2 trigger wiring', () { + final source = File( + 'lib/services/rustpush/rustpush_service.dart', + ).readAsStringSync(); + final blockStart = source.indexOf('_buildCloudSyncV2ShadowController()'); + final blockEnd = source.indexOf( + '_runLegacyCloudKitOperation', + blockStart, + ); + expect(blockStart, greaterThanOrEqualTo(0)); + expect(blockEnd, greaterThan(blockStart)); + + final block = source.substring(blockStart, blockEnd); + expect(block, isNot(contains('Timer.'))); + expect(block, isNot(contains('WorkManager'))); + expect(block, isNot(contains('onNetworkReconnect'))); + expect(block, isNot(contains('onIdsReconnect'))); + expect(block, isNot(contains('semanticApply: true'))); + expect(block, isNot(contains('saves: true'))); + expect(block, isNot(contains('deletions: true'))); + }); +} diff --git a/test/services/cloud_sync/cloud_sync_production_preflight_test.dart b/test/services/cloud_sync/cloud_sync_production_preflight_test.dart new file mode 100644 index 0000000000..7be3859ef9 --- /dev/null +++ b/test/services/cloud_sync/cloud_sync_production_preflight_test.dart @@ -0,0 +1,151 @@ +import 'package:bluebubbles/services/rustpush/cloud_sync/cloud_sync_production_preflight.dart'; +import 'package:flutter_test/flutter_test.dart'; + +void main() { + CloudSyncProductionPreflightProbe readyProbe({ + Future Function()? protectorSentinelValid, + }) { + return CloudSyncProductionPreflightProbe( + platformSupported: () => true, + uiIsolate: () => true, + rustPushReady: () => true, + localState: () => const CloudSyncLocalPreflightState( + objectBoxReady: true, + coordinatorLeaseActive: false, + outboxCount: 0, + ), + privateStorageExists: () => true, + logoutActive: () => false, + legacySyncEnabled: () => false, + legacySyncActive: () => false, + protectorSentinelValid: protectorSentinelValid ?? () async => true, + ); + } + + test( + 'returns the exact ready state from synchronous and async probes', + () async { + final state = await readyProbe().read(); + + expect(state.platformSupported, isTrue); + expect(state.uiIsolate, isTrue); + expect(state.rustPushReady, isTrue); + expect(state.objectBoxReady, isTrue); + expect(state.privateStorageExists, isTrue); + expect(state.logoutActive, isFalse); + expect(state.legacySyncEnabled, isFalse); + expect(state.legacySyncActive, isFalse); + expect(state.coordinatorLeaseActive, isFalse); + expect(state.outboxCount, 0); + expect(state.protectorSentinelValid, isTrue); + }, + ); + + test('availability probe failures become blocking false values', () async { + final probe = CloudSyncProductionPreflightProbe( + platformSupported: () => throw StateError('secret-platform-detail'), + uiIsolate: () => throw StateError('secret-ui-detail'), + rustPushReady: () => throw StateError('secret-rust-detail'), + localState: () => throw StateError('secret-store-detail'), + privateStorageExists: () => throw StateError('secret-path-detail'), + logoutActive: () => false, + legacySyncEnabled: () => false, + legacySyncActive: () => false, + protectorSentinelValid: () => throw StateError('secret-key-detail'), + ); + + final state = await probe.read(); + expect(state.platformSupported, isFalse); + expect(state.uiIsolate, isFalse); + expect(state.rustPushReady, isFalse); + expect(state.objectBoxReady, isFalse); + expect(state.privateStorageExists, isFalse); + expect(state.protectorSentinelValid, isFalse); + }); + + test( + 'uncertain mutation or lifecycle state always blocks the sampler', + () async { + final probe = CloudSyncProductionPreflightProbe( + platformSupported: () => true, + uiIsolate: () => true, + rustPushReady: () => true, + localState: () => throw StateError('local-state-read-failed'), + privateStorageExists: () => true, + logoutActive: () => throw StateError('logout-read-failed'), + legacySyncEnabled: () => throw StateError('setting-read-failed'), + legacySyncActive: () => throw StateError('activity-read-failed'), + protectorSentinelValid: () => true, + ); + + final state = await probe.read(); + expect(state.logoutActive, isTrue); + expect(state.legacySyncEnabled, isTrue); + expect(state.legacySyncActive, isTrue); + expect(state.coordinatorLeaseActive, isTrue); + expect(state.outboxCount, -1); + }, + ); + + test( + 'negative outbox counts cannot be mistaken for an empty outbox', + () async { + final probe = CloudSyncProductionPreflightProbe( + platformSupported: () => true, + uiIsolate: () => true, + rustPushReady: () => true, + localState: () => const CloudSyncLocalPreflightState( + objectBoxReady: true, + coordinatorLeaseActive: false, + outboxCount: -500, + ), + privateStorageExists: () => true, + logoutActive: () => false, + legacySyncEnabled: () => false, + legacySyncActive: () => false, + protectorSentinelValid: () => true, + ); + + expect((await probe.read()).outboxCount, -1); + }, + ); + + test('every probe is evaluated once per immutable snapshot', () async { + var calls = 0; + bool boolean() { + calls++; + return true; + } + + final probe = CloudSyncProductionPreflightProbe( + platformSupported: boolean, + uiIsolate: boolean, + rustPushReady: boolean, + localState: () { + calls++; + return const CloudSyncLocalPreflightState( + objectBoxReady: true, + coordinatorLeaseActive: false, + outboxCount: 0, + ); + }, + privateStorageExists: boolean, + logoutActive: () { + calls++; + return false; + }, + legacySyncEnabled: () { + calls++; + return false; + }, + legacySyncActive: () { + calls++; + return false; + }, + protectorSentinelValid: boolean, + ); + + await probe.read(); + expect(calls, 9); + }); +} diff --git a/test/services/cloud_sync/cloud_sync_production_sampler_adapter_test.dart b/test/services/cloud_sync/cloud_sync_production_sampler_adapter_test.dart new file mode 100644 index 0000000000..f691152ec6 --- /dev/null +++ b/test/services/cloud_sync/cloud_sync_production_sampler_adapter_test.dart @@ -0,0 +1,103 @@ +import 'dart:async'; + +import 'package:bluebubbles/services/rustpush/cloud_sync/cloud_sync_production_sampler_adapter.dart'; +import 'package:flutter_test/flutter_test.dart'; + +void main() { + test('construction and capture expose no raw account input in Dart', () async { + final client = Object(); + final binding = _FakeNativeAuthBinding(); + final provider = CloudSyncProductionAuthSnapshotProvider( + readActiveClient: () => client, + nativeAuthBinding: binding, + privateStorageDirectory: 'private-storage', + ); + + expect(binding.calls, 0); + final snapshot = await provider.capture(); + + expect(binding.calls, 1); + expect(binding.clients.single, same(client)); + expect(snapshot!.cloudMessagesClient, same(client)); + expect(snapshot.accountFingerprint, _digest('F')); + expect(snapshot.nativeSessionId, _digest('N')); + expect( + snapshot.protectedStoreIdentity, + 'obcs2.store.AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA', + ); + }); + + test('client replacement during native capture fails closed', () async { + final first = Object(); + final second = Object(); + var active = first; + final blocker = Completer(); + final binding = _FakeNativeAuthBinding(blocker: blocker); + final provider = CloudSyncProductionAuthSnapshotProvider( + readActiveClient: () => active, + nativeAuthBinding: binding, + privateStorageDirectory: 'private-storage', + ); + + final pending = provider.capture(); + await Future.delayed(Duration.zero); + active = second; + blocker.complete(); + + expect(await pending, isNull); + }); + + test('missing active client performs no native call', () async { + final binding = _FakeNativeAuthBinding(); + final provider = CloudSyncProductionAuthSnapshotProvider( + readActiveClient: () => null, + nativeAuthBinding: binding, + privateStorageDirectory: 'private-storage', + ); + + expect(await provider.capture(), isNull); + expect(binding.calls, 0); + }); + + test('production binding rejects a non-FRB client before native access', () async { + final binding = FrbCloudSyncNativeAuthBinding(); + + await expectLater( + binding.capture(cloudMessagesClient: Object(), privateStorageDirectory: 'private-storage'), + throwsA( + isA().having( + (error) => error.message, + 'message', + contains('generated FRB Cloud Messages client'), + ), + ), + ); + }); +} + +final class _FakeNativeAuthBinding implements CloudSyncNativeAuthBinding { + _FakeNativeAuthBinding({this.blocker}); + + final Completer? blocker; + int calls = 0; + final List clients = []; + + @override + Future capture({ + required Object cloudMessagesClient, + required String privateStorageDirectory, + }) async { + calls++; + clients.add(cloudMessagesClient); + await blocker?.future; + return const CloudSyncNativeAuthMetadata( + nativeSessionId: _nativeSession, + accountFingerprint: _accountFingerprint, + protectedStoreIdentity: 'obcs2.store.AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA', + ); + } +} + +const _nativeSession = 'NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN'; +const _accountFingerprint = 'FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF'; +String _digest(String character) => List.filled(43, character).join(); diff --git a/test/services/cloud_sync/cloud_sync_protector_health_test.dart b/test/services/cloud_sync/cloud_sync_protector_health_test.dart new file mode 100644 index 0000000000..085fecee02 --- /dev/null +++ b/test/services/cloud_sync/cloud_sync_protector_health_test.dart @@ -0,0 +1,93 @@ +import 'package:bluebubbles/services/rustpush/cloud_sync/cloud_sync_models.dart'; +import 'package:bluebubbles/services/rustpush/cloud_sync/cloud_sync_protector.dart'; +import 'package:bluebubbles/services/rustpush/cloud_sync/cloud_sync_protector_health.dart'; +import 'package:flutter_test/flutter_test.dart'; + +void main() { + test('validates a non-persisted platform protector round trip', () async { + final protector = _HealthProtector(); + + expect( + await CloudSyncProtectorHealthProbe(protector: protector).read(), + isTrue, + ); + expect(protector.protectedPlaintext, isNotEmpty); + expect(protector.protectedPlaintext, protector.unprotectedPlaintext); + expect(protector.scope?.accountFingerprint, isNot(contains('@'))); + expect(protector.kind, CloudSyncProtectedValueKind.rawRecord); + }); + + test('rejects plaintext masquerading as ciphertext', () async { + final protector = _HealthProtector(returnPlaintextCiphertext: true); + + expect( + await CloudSyncProtectorHealthProbe(protector: protector).read(), + isFalse, + ); + expect(protector.unprotectCalls, 0); + }); + + test('rejects a mismatched round trip', () async { + final protector = _HealthProtector(roundTripOverride: 'wrong'); + + expect( + await CloudSyncProtectorHealthProbe(protector: protector).read(), + isFalse, + ); + }); + + test('converts platform protection failures to a blocking false', () async { + final protector = _HealthProtector(throwOnProtect: true); + + expect( + await CloudSyncProtectorHealthProbe(protector: protector).read(), + isFalse, + ); + }); +} + +final class _HealthProtector implements CloudSyncProtector { + _HealthProtector({ + this.returnPlaintextCiphertext = false, + this.roundTripOverride, + this.throwOnProtect = false, + }); + + final bool returnPlaintextCiphertext; + final String? roundTripOverride; + final bool throwOnProtect; + String? protectedPlaintext; + String? unprotectedPlaintext; + CloudSyncScope? scope; + CloudSyncProtectedValueKind? kind; + int unprotectCalls = 0; + + @override + Future protect({ + required CloudSyncScope scope, + required CloudSyncProtectedValueKind kind, + required String plaintext, + }) async { + if (throwOnProtect) throw StateError('secret platform failure'); + this.scope = scope; + this.kind = kind; + protectedPlaintext = plaintext; + return returnPlaintextCiphertext ? plaintext : 'opaque-ciphertext'; + } + + @override + Future unprotect({ + required CloudSyncScope scope, + required CloudSyncProtectedValueKind kind, + required String ciphertext, + }) async { + unprotectCalls++; + unprotectedPlaintext = protectedPlaintext; + return roundTripOverride ?? protectedPlaintext!; + } + + @override + Future fingerprintAccount(String rawAccountIdentifier) { + throw UnimplementedError(); + } +} diff --git a/test/services/cloud_sync/cloud_sync_protector_test.dart b/test/services/cloud_sync/cloud_sync_protector_test.dart new file mode 100644 index 0000000000..635e567a21 --- /dev/null +++ b/test/services/cloud_sync/cloud_sync_protector_test.dart @@ -0,0 +1,168 @@ +import 'package:bluebubbles/services/rustpush/cloud_sync/cloud_sync_models.dart'; +import 'package:bluebubbles/services/rustpush/cloud_sync/cloud_sync_protector.dart'; +import 'package:flutter_test/flutter_test.dart'; + +import 'cloud_sync_test_helpers.dart'; + +void main() { + final scope = CloudSyncScope( + accountFingerprint: testAccountFingerprintA, + container: 'com.apple.messages.cloudkit', + database: 'private', + zone: 'Messages', + streamKind: CloudSyncStreamKind.messages, + schemaVersion: 2, + ); + + test( + 'forwards every scope component and purpose to Rust protection', + () async { + final bindings = _RecordingBindings(); + final protector = RustCloudSyncProtector( + storageDirectory: r'C:\private-app-support', + bindings: bindings, + ); + + expect( + await protector.protect( + scope: scope, + kind: CloudSyncProtectedValueKind.systemFields, + plaintext: 'opaque-system-fields', + ), + 'protected', + ); + + expect(bindings.protectCall, { + 'storageDirectory': r'C:\private-app-support', + 'accountFingerprint': testAccountFingerprintA, + 'container': 'com.apple.messages.cloudkit', + 'database': 'private', + 'zone': 'Messages', + 'streamKind': 'messages', + 'schemaVersion': 2, + 'purpose': 'systemFields', + 'plaintext': 'opaque-system-fields', + }); + }, + ); + + test( + 'forwards the requested unprotect context without weakening it', + () async { + final bindings = _RecordingBindings(); + final protector = RustCloudSyncProtector( + storageDirectory: '/private/app-support', + bindings: bindings, + ); + + expect( + await protector.unprotect( + scope: scope, + kind: CloudSyncProtectedValueKind.checkpointToken, + ciphertext: 'obcs2.android.ciphertext', + ), + 'plaintext', + ); + expect(bindings.unprotectCall?['purpose'], 'checkpointToken'); + expect(bindings.unprotectCall?['zone'], 'Messages'); + expect(bindings.unprotectCall?['ciphertext'], 'obcs2.android.ciphertext'); + }, + ); + + test('passes a raw account identifier only to the HMAC boundary', () async { + final bindings = _RecordingBindings(); + final protector = RustCloudSyncProtector( + storageDirectory: '/private/app-support', + bindings: bindings, + ); + + expect( + await protector.fingerprintAccount('raw-dsid'), + testAccountFingerprintB, + ); + expect(bindings.fingerprintCall, { + 'storageDirectory': '/private/app-support', + 'rawAccountIdentifier': 'raw-dsid', + }); + }); + + test('rejects an empty storage directory before reaching native code', () { + expect( + () => RustCloudSyncProtector( + storageDirectory: ' ', + bindings: _RecordingBindings(), + ), + throwsArgumentError, + ); + }); +} + +final class _RecordingBindings implements RustCloudSyncProtectionBindings { + Map? protectCall; + Map? unprotectCall; + Map? fingerprintCall; + + @override + Future protect({ + required String storageDirectory, + required String accountFingerprint, + required String container, + required String database, + required String zone, + required String streamKind, + required int schemaVersion, + required String purpose, + required String plaintext, + }) async { + protectCall = { + 'storageDirectory': storageDirectory, + 'accountFingerprint': accountFingerprint, + 'container': container, + 'database': database, + 'zone': zone, + 'streamKind': streamKind, + 'schemaVersion': schemaVersion, + 'purpose': purpose, + 'plaintext': plaintext, + }; + return 'protected'; + } + + @override + Future unprotect({ + required String storageDirectory, + required String accountFingerprint, + required String container, + required String database, + required String zone, + required String streamKind, + required int schemaVersion, + required String purpose, + required String ciphertext, + }) async { + unprotectCall = { + 'storageDirectory': storageDirectory, + 'accountFingerprint': accountFingerprint, + 'container': container, + 'database': database, + 'zone': zone, + 'streamKind': streamKind, + 'schemaVersion': schemaVersion, + 'purpose': purpose, + 'ciphertext': ciphertext, + }; + return 'plaintext'; + } + + @override + Future fingerprintAccount({ + required String storageDirectory, + required String rawAccountIdentifier, + }) async { + fingerprintCall = { + 'storageDirectory': storageDirectory, + 'rawAccountIdentifier': rawAccountIdentifier, + }; + return testAccountFingerprintB; + } +} diff --git a/test/services/cloud_sync/cloud_sync_protocol_evidence_test.dart b/test/services/cloud_sync/cloud_sync_protocol_evidence_test.dart new file mode 100644 index 0000000000..0acebb87d4 --- /dev/null +++ b/test/services/cloud_sync/cloud_sync_protocol_evidence_test.dart @@ -0,0 +1,286 @@ +import 'dart:convert'; + +import 'package:flutter_test/flutter_test.dart'; +import 'package:path/path.dart' as path; +import 'package:universal_io/io.dart'; + +import 'package:bluebubbles/services/rustpush/cloud_sync/cloud_sync_observability.dart'; +import 'package:bluebubbles/services/rustpush/cloud_sync/cloud_sync_protocol_evidence.dart'; + +Directory? _testRoot; +Directory? _testEvidenceDirectory; + +void main() { + setUp(() async { + _testRoot = await Directory.systemTemp.createTemp( + 'cloud-sync-evidence-root-', + ); + _testEvidenceDirectory = Directory(path.join(_testRoot!.path, 'private')); + }); + + tearDown(() async { + if (await _testRoot!.exists()) await _testRoot!.delete(recursive: true); + }); + + test('uses the exact fixed JSON key allowlist and excludes scope', () { + final record = CloudSyncProtocolEvidenceRecord.fromEvent( + _event(scope: 'scope:SECRET-identifier'), + zoneLabel: 'messageManateeZone', + streamKindLabel: 'messages', + platform: 'android', + architecture: 'arm64', + buildCommit: 'abc123', + ); + + final json = jsonDecode(record.toJsonLine()) as Map; + expect(json.keys.toSet(), CloudSyncProtocolEvidenceRecord.jsonKeys); + expect(json['scopeDiagnosticKey'], isNull); + expect(json['eventType'], 'fetchCompleted'); + expect(json['trigger'], 'manual'); + expect(json['failure'], 'none'); + expect(json['timestampUtc'], '2026-08-22T12:00:00.000Z'); + expect(record.toJsonLine(), isNot(contains('SECRET'))); + expect(record.toJsonLine(), isNot(contains('message text'))); + }); + + test('rejects invalid metadata and numeric ranges with fixed safe codes', () { + CloudSyncProtocolEvidenceRecord build({ + String zone = 'messageManateeZone', + int count = 0, + int estimatedBytes = 0, + int attempt = 0, + int elapsedMilliseconds = 0, + }) { + return CloudSyncProtocolEvidenceRecord( + zoneLabel: zone, + streamKindLabel: 'messages', + platform: 'android', + architecture: 'arm64', + buildCommit: 'abc123', + eventType: 'fetchCompleted', + timestampUtc: DateTime.utc(2026, 8, 22), + count: count, + estimatedBytes: estimatedBytes, + attempt: attempt, + elapsedMilliseconds: elapsedMilliseconds, + ); + } + + expect( + () => build(zone: 'arbitrary-zone'), + throwsA(_safeCode('cloud_sync_protocol_evidence_zone_invalid')), + ); + expect( + () => build(count: -1), + throwsA(_safeCode('cloud_sync_protocol_evidence_count_invalid')), + ); + expect( + () => build(estimatedBytes: -1), + throwsA( + _safeCode('cloud_sync_protocol_evidence_estimated_bytes_invalid'), + ), + ); + expect( + () => build(attempt: CloudSyncProtocolEvidenceRecord.maximumAttempt + 1), + throwsA(_safeCode('cloud_sync_protocol_evidence_attempt_invalid')), + ); + expect( + () => build( + elapsedMilliseconds: + CloudSyncProtocolEvidenceRecord.maximumElapsedMilliseconds + 1, + ), + throwsA(_safeCode('cloud_sync_protocol_evidence_elapsed_ms_invalid')), + ); + expect( + () => CloudSyncProtocolEvidenceRecord( + zoneLabel: 'messageManateeZone', + streamKindLabel: 'messages', + platform: 'android', + architecture: 'arm64', + buildCommit: 'abc123', + eventType: 'fetchCompleted', + timestampUtc: DateTime(2026, 8, 22), + ), + throwsA(_safeCode('cloud_sync_protocol_evidence_timestamp_invalid')), + ); + }); + + test('observer preserves event order through append and flush', () async { + final writer = await _openWriter(); + final observer = CloudSyncProtocolEvidenceObserver( + writer: writer, + zoneLabel: 'messageManateeZone', + streamKindLabel: 'messages', + platform: 'android', + architecture: 'arm64', + buildCommit: 'abc123', + ); + + observer.onEvent(_event(type: CloudSyncEventType.runStarted)); + observer.onEvent(_event(type: CloudSyncEventType.fetchCompleted)); + observer.onEvent(_event(type: CloudSyncEventType.runCompleted)); + await observer.flush(); + + final lines = await _readLines(writer.currentFilePath); + expect(lines.map((line) => (jsonDecode(line) as Map)['eventType']), [ + 'runStarted', + 'fetchCompleted', + 'runCompleted', + ]); + }); + + test('append flushes and a reopened writer continues the file', () async { + var writer = await _openWriter(); + await writer.append(_record(count: 1)); + await writer.flush(); + writer = await _openWriter(); + await writer.append(_record(count: 2)); + await writer.flush(); + + final lines = await _readLines(writer.currentFilePath); + expect(lines, hasLength(2)); + expect((jsonDecode(lines[0]) as Map)['count'], 1); + expect((jsonDecode(lines[1]) as Map)['count'], 2); + }); + + test( + 'rotates at the hard size cap and retains unrelated files', + () async { + final unrelated = File( + path.join(_testEvidenceDirectory!.path, 'keep.txt'), + ); + await _testEvidenceDirectory!.create(recursive: true); + await unrelated.writeAsString('keep'); + final writer = await _openWriter(); + for (var index = 0; index < 2700; index++) { + await writer.append(_record(count: index)); + } + await writer.flush(); + + final owned = []; + for (var index = 0; index < 3; index++) { + final file = File( + path.join( + _testEvidenceDirectory!.path, + 'cloud-sync-v2-evidence-$index.jsonl', + ), + ); + if (await file.exists()) owned.add(file); + } + expect(owned, hasLength(3)); + for (final file in owned) { + expect(await file.length(), lessThanOrEqualTo(256 * 1024)); + } + expect(await unrelated.readAsString(), 'keep'); + }, + timeout: const Timeout(Duration(minutes: 2)), + ); + + test('rejects a private directory outside the trusted root', () async { + final outside = path.join( + _testRoot!.parent.path, + 'cloud-sync-evidence-outside', + ); + expect( + () => CloudSyncProtocolEvidenceWriter.open( + privateDirectory: outside, + trustedRoot: _testRoot!.path, + ), + throwsA(_safeCode('cloud_sync_protocol_evidence_path_escape')), + ); + }); + + test('recovers an incomplete final line on reopen', () async { + final writer = await _openWriter(); + await writer.append(_record(count: 1)); + final file = File(writer.currentFilePath); + final handle = await file.open(mode: FileMode.append); + await handle.writeFrom(utf8.encode('{"partial":')); + await handle.flush(); + await handle.close(); + + final reopened = await _openWriter(); + await reopened.append(_record(count: 2)); + await reopened.flush(); + final lines = await _readLines(reopened.currentFilePath); + expect(lines, hasLength(2)); + expect((jsonDecode(lines.last) as Map)['count'], 2); + }); + + test('fixed exceptions never include paths or arbitrary error text', () { + const error = CloudSyncProtocolEvidenceException( + 'cloud_sync_protocol_evidence_write_failed', + ); + expect(error.safeCode, 'cloud_sync_protocol_evidence_write_failed'); + expect( + error.toString(), + 'CloudSyncProtocolEvidenceException(cloud_sync_protocol_evidence_write_failed)', + ); + expect(error.toString(), isNot(contains(_testRoot!.path))); + expect(error.toString(), isNot(contains('secret message'))); + }); +} + +CloudSyncEvent _event({ + CloudSyncEventType type = CloudSyncEventType.fetchCompleted, + String scope = 'safe-scope', +}) { + return CloudSyncEvent( + type: type, + scopeDiagnosticKey: scope, + at: DateTime.utc(2026, 8, 22, 12), + trigger: CloudSyncTrigger.manual, + count: 4, + estimatedBytes: 128, + attempt: 2, + elapsed: const Duration(milliseconds: 18), + ); +} + +CloudSyncProtocolEvidenceRecord _record({int count = 0}) { + return CloudSyncProtocolEvidenceRecord.fromEvent( + _event(), + zoneLabel: 'messageManateeZone', + streamKindLabel: 'messages', + platform: 'android', + architecture: 'arm64', + buildCommit: 'abc123', + ).copyWithCountForTest(count); +} + +Future _openWriter() { + return CloudSyncProtocolEvidenceWriter.open( + privateDirectory: _testEvidenceDirectory!.path, + trustedRoot: _testRoot!.path, + ); +} + +Future> _readLines(String filePath) async { + final contents = await File(filePath).readAsString(); + return contents.split('\n').where((line) => line.isNotEmpty).toList(); +} + +Matcher _safeCode(String code) => isA() + .having((error) => error.safeCode, 'safeCode', code); + +extension on CloudSyncProtocolEvidenceRecord { + CloudSyncProtocolEvidenceRecord copyWithCountForTest(int value) { + return CloudSyncProtocolEvidenceRecord( + zoneLabel: zoneLabel, + streamKindLabel: streamKindLabel, + platform: platform, + architecture: architecture, + buildCommit: buildCommit, + eventType: eventType, + timestampUtc: timestampUtc, + triggerLabel: triggerLabel, + failureLabel: failureLabel, + skipLabel: skipLabel, + journalBlockLabel: journalBlockLabel, + count: value, + estimatedBytes: estimatedBytes, + attempt: attempt, + elapsedMilliseconds: elapsedMilliseconds, + ); + } +} diff --git a/test/services/cloud_sync/cloud_sync_release_validation_test.dart b/test/services/cloud_sync/cloud_sync_release_validation_test.dart new file mode 100644 index 0000000000..dbc5324049 --- /dev/null +++ b/test/services/cloud_sync/cloud_sync_release_validation_test.dart @@ -0,0 +1,414 @@ +import 'package:bluebubbles/services/rustpush/cloud_sync/cloud_inbox_applier.dart'; +import 'package:bluebubbles/services/rustpush/cloud_sync/cloud_merge_policy.dart'; +import 'package:bluebubbles/services/rustpush/cloud_sync/cloud_shadow_journal_budget.dart'; +import 'package:bluebubbles/services/rustpush/cloud_sync/cloud_sync_engine.dart'; +import 'package:bluebubbles/services/rustpush/cloud_sync/cloud_sync_models.dart'; +import 'package:bluebubbles/services/rustpush/cloud_sync/cloud_sync_observability.dart'; +import 'package:flutter_test/flutter_test.dart'; + +import 'cloud_sync_test_helpers.dart'; + +void main() { + CloudSyncScope scope() => CloudSyncScope( + accountFingerprint: testAccountFingerprintA, + container: 'container', + database: 'private', + zone: 'messages', + ); + + Matcher redactedArgument(String safeMessage, {String? secret}) { + return throwsA( + predicate((error) { + final rendered = error.toString(); + return rendered.contains(safeMessage) && + (secret == null || !rendered.contains(secret)); + }, 'fixed redacted ArgumentError'), + ); + } + + test('scope and fetched-change invariants survive release mode', () { + for (final invalidFingerprint in [ + '', + 'short', + 'raw-account@example.com', + '$testAccountFingerprintA=', + '${List.filled(42, 'A').join()}\u001f', + ]) { + expect( + () => CloudSyncScope( + accountFingerprint: invalidFingerprint, + container: 'container', + database: 'private', + zone: 'messages', + ), + redactedArgument( + 'cloud_sync_scope_account_fingerprint_invalid', + secret: invalidFingerprint.isEmpty ? null : invalidFingerprint, + ), + ); + } + expect( + () => CloudFetchedChange( + changeId: 'change', + recordIdHash: 'record', + type: CloudChangeType.delete, + ), + redactedArgument('cloud_fetched_tombstone_type_invalid'), + ); + expect( + () => CloudFetchedChange( + changeId: 'change', + recordIdHash: 'record', + type: CloudChangeType.save, + encryptedPayloadReference: '', + ), + redactedArgument('cloud_fetched_payload_reference_invalid'), + ); + expect( + () => CloudFetchBatch( + scope: scope(), + changes: const [], + batchId: 'batch', + generation: -1, + nextToken: null, + hasMore: false, + ), + redactedArgument('cloud_fetch_batch_generation_invalid'), + ); + expect( + () => CloudFetchBatch( + scope: scope(), + changes: const [], + batchId: 'batch', + generation: 0, + nextToken: null, + hasMore: false, + ), + redactedArgument('cloud_fetch_batch_generation_invalid'), + ); + }); + + test('failure diagnostic codes are allowlisted and never echo secrets', () { + const secret = 'server body: secret-token'; + expect( + () => CloudSyncFailure( + category: CloudFailureCategory.server, + safeCode: secret, + ), + redactedArgument('cloud_sync_failure_safe_code_invalid', secret: secret), + ); + expect( + () => CloudSyncFailure( + category: CloudFailureCategory.network, + retryAfter: const Duration(microseconds: -1), + ), + redactedArgument('cloud_sync_failure_retry_after_invalid'), + ); + + final valid = CloudSyncFailure( + category: CloudFailureCategory.network, + safeCode: 'network_retry-1', + ); + expect(valid.toString(), contains('network_retry-1')); + }); + + test('checkpoint and outbox counters reject invalid release values', () { + expect( + () => CloudSyncCheckpoint(scope: scope(), consecutivePullFailures: -1), + redactedArgument('cloud_checkpoint_pull_failures_invalid'), + ); + expect( + () => CloudSyncCheckpoint(scope: scope(), generation: 0), + redactedArgument('cloud_checkpoint_generation_invalid'), + ); + expect( + () => CloudInboxEntry( + scope: scope(), + sequence: 1, + change: CloudFetchedChange( + changeId: 'change', + recordIdHash: 'record', + type: CloudChangeType.save, + ), + status: CloudInboxStatus.pending, + attemptCount: 0, + createdAt: DateTime.utc(2026), + batchId: 'batch', + generation: 0, + ), + redactedArgument('cloud_inbox_generation_invalid'), + ); + expect( + () => CloudInboxEntry( + scope: scope(), + sequence: 1, + change: CloudFetchedChange( + changeId: 'change', + recordIdHash: 'record', + type: CloudChangeType.save, + ), + status: CloudInboxStatus.pending, + attemptCount: -1, + createdAt: DateTime.utc(2026), + batchId: 'batch', + generation: 1, + ), + redactedArgument('cloud_inbox_attempt_count_invalid'), + ); + expect( + () => CloudOutboxDraft( + scope: scope(), + logicalEntityKeyHash: 'logical-key', + action: CloudOutboxAction.save, + payloadVersion: 1, + dependencyOperationIds: const [], + createdAt: DateTime.utc(2026), + ), + redactedArgument('cloud_outbox_draft_save_payload_missing'), + ); + }); + + test('merge metadata validates identity and revisions', () { + expect( + () => CloudEditPart( + partKeyHash: 'part', + revision: -1, + contentDigest: 'digest', + modifiedAt: DateTime.utc(2026), + ), + redactedArgument('cloud_edit_part_revision_invalid'), + ); + + expect( + () => CloudSemanticSnapshot( + kind: CloudEntityKind.message, + logicalEntityKeyHash: '', + ), + redactedArgument('cloud_semantic_snapshot_logical_key_invalid'), + ); + expect( + () => CloudSemanticSnapshot( + kind: CloudEntityKind.chat, + logicalEntityKeyHash: 'logical-key', + groupVersion: -1, + ), + redactedArgument('cloud_semantic_snapshot_group_version_invalid'), + ); + }); + + test('semantic payload and mutation envelopes fail closed', () { + expect( + () => CloudAttachmentEntityPayload( + logicalEntityKeyHash: 'attachment-key', + canonicalGuid: 'attachment-guid', + ownerLogicalKeyHash: '', + ownerCanonicalGuid: 'owner-message-guid', + ownerPart: 0, + fileName: 'file', + mimeType: null, + protectedLocalReference: 'protected-ref', + ), + redactedArgument('cloud_attachment_payload_owner_key_invalid'), + ); + + final snapshot = CloudSemanticSnapshot( + kind: CloudEntityKind.message, + logicalEntityKeyHash: 'message-key', + ); + final mismatchedPayload = CloudChatEntityPayload( + logicalEntityKeyHash: 'message-key', + canonicalGuid: 'chat-guid', + chatIdentifier: 'iMessage;-;chat', + displayName: null, + participantHandles: const [], + ); + expect( + () => CloudDecodedMutation.upsert( + scope: scope(), + generation: 0, + changeId: 'change', + snapshot: snapshot, + payload: mismatchedPayload, + ), + redactedArgument('cloud_decoded_mutation_generation_invalid'), + ); + expect( + () => CloudDecodedMutation.upsert( + scope: scope(), + generation: 1, + changeId: 'change', + snapshot: snapshot, + payload: mismatchedPayload, + ), + redactedArgument('cloud_decoded_mutation_kind_mismatch'), + ); + expect( + () => CloudSemanticTombstone( + kind: CloudEntityKind.message, + logicalEntityKeyHash: '', + deletedAt: null, + serverConfirmed: true, + ), + redactedArgument('cloud_semantic_tombstone_logical_key_invalid'), + ); + }); + + test('transient canonical identities stay redacted from diagnostics', () { + const sentinels = [ + 'message-guid-sensitive', + 'chat-guid-sensitive', + 'iMessage;-;sensitive-chat', + 'attachment-guid-sensitive', + 'owner-message-guid-sensitive', + 'reaction-guid-sensitive', + 'parent-message-guid-sensitive', + 'group-photo-guid-sensitive', + ]; + final payloads = [ + CloudMessageEntityPayload( + logicalEntityKeyHash: 'message-key', + canonicalGuid: sentinels[0], + chatAliasKeyHash: 'chat-key', + chatIdentifier: sentinels[2], + body: 'body-sensitive', + senderHandle: 'sender-sensitive', + ), + CloudChatEntityPayload( + logicalEntityKeyHash: 'chat-key', + canonicalGuid: sentinels[1], + chatIdentifier: sentinels[2], + displayName: 'display-sensitive', + participantHandles: const ['participant-sensitive'], + ), + CloudAttachmentEntityPayload( + logicalEntityKeyHash: 'attachment-key', + canonicalGuid: sentinels[3], + ownerLogicalKeyHash: 'message-key', + ownerCanonicalGuid: sentinels[4], + ownerPart: 0, + fileName: 'file-sensitive.pdf', + mimeType: 'application/pdf', + protectedLocalReference: 'protected-reference-sensitive', + ), + CloudReactionEntityPayload( + logicalEntityKeyHash: 'reaction-key', + canonicalGuid: sentinels[5], + parentLogicalKeyHash: 'message-key', + parentCanonicalGuid: sentinels[6], + parentPart: 0, + senderHandle: 'sender-sensitive', + reactionType: 'like', + ), + CloudGroupPhotoEntityPayload( + logicalEntityKeyHash: 'group-photo-key', + ownerLogicalKeyHash: 'chat-key', + photoGuid: sentinels[7], + protectedLocalReference: 'group-photo-reference-sensitive', + ), + ]; + + for (final payload in payloads) { + final rendered = payload.toString(); + expect(rendered, contains('redacted')); + for (final sentinel in sentinels) { + expect(rendered, isNot(contains(sentinel))); + } + } + }); + + test('engine, observer, and journal budgets validate at construction', () { + expect( + () => CloudSyncEngineConfig(maximumBatchSize: 257), + redactedArgument('cloud_sync_config_batch_size_invalid'), + ); + expect( + () => CloudSyncEngineConfig(fetchOperationTimeout: Duration.zero), + redactedArgument('cloud_sync_config_fetch_timeout_invalid'), + ); + expect( + () => CloudSyncEngineConfig(maximumFetchPagesPerRun: 65), + redactedArgument('cloud_sync_config_fetch_pages_invalid'), + ); + expect( + () => CloudSyncEngineConfig(maximumInboxEntriesPerRun: 4097), + redactedArgument('cloud_sync_config_inbox_entries_invalid'), + ); + expect( + () => CloudSyncEngineConfig(maximumOutboxBatchesPerRun: 65), + redactedArgument('cloud_sync_config_outbox_batches_invalid'), + ); + expect( + () => CloudSyncEngineConfig(maximumUnknownAttempts: 17), + redactedArgument('cloud_sync_config_unknown_attempts_invalid'), + ); + expect( + () => CloudSyncEngineConfig( + fetchOperationTimeout: const Duration(minutes: 5, microseconds: 1), + ), + redactedArgument('cloud_sync_config_fetch_timeout_invalid'), + ); + expect( + () => CloudSyncEngineConfig( + coordinatorLeaseDuration: const Duration(minutes: 30, microseconds: 1), + ), + redactedArgument('cloud_sync_config_coordinator_lease_invalid'), + ); + expect( + () => CloudSyncEngineConfig( + outboxLeaseDuration: const Duration(minutes: 30, microseconds: 1), + ), + redactedArgument('cloud_sync_config_outbox_lease_invalid'), + ); + expect( + () => CloudSyncEngineConfig( + pausedRetryDelay: const Duration(days: 30, microseconds: 1), + ), + redactedArgument('cloud_sync_config_paused_retry_invalid'), + ); + expect( + () => MemoryCloudSyncObserver(maximumEvents: 0), + redactedArgument('cloud_sync_observer_capacity_invalid'), + ); + expect( + () => MemoryCloudSyncObserver(maximumEvents: 4097), + redactedArgument('cloud_sync_observer_capacity_invalid'), + ); + expect( + () => CloudShadowJournalBudget(maximumPendingAge: Duration.zero), + redactedArgument('cloud_shadow_budget_age_invalid'), + ); + expect( + () => CloudShadowJournalBudget(maximumEntriesPerScope: 16 * 1024 + 1), + redactedArgument('cloud_shadow_budget_entries_invalid'), + ); + expect( + () => CloudShadowJournalBudget( + maximumEstimatedBytesPerScope: 128 * 1024 * 1024 + 1, + ), + redactedArgument('cloud_shadow_budget_bytes_invalid'), + ); + expect( + () => CloudShadowJournalBudget( + maximumPendingAge: const Duration(days: 30, microseconds: 1), + ), + redactedArgument('cloud_shadow_budget_age_invalid'), + ); + expect( + () => CloudShadowJournalUsage( + pendingEntries: 0, + estimatedBytes: 0, + oldestPendingAt: DateTime.utc(2026), + ), + redactedArgument('cloud_shadow_usage_oldest_invalid'), + ); + expect( + () => CloudShadowJournalAdmission( + insertedEntries: 1, + rejectedEntries: 1, + usage: CloudShadowJournalUsage.empty, + blockReason: CloudShadowJournalBlockReason.maximumEntries, + ), + redactedArgument('cloud_shadow_admission_blocked_insert_invalid'), + ); + }); +} diff --git a/test/services/cloud_sync/cloud_sync_runtime_test.dart b/test/services/cloud_sync/cloud_sync_runtime_test.dart new file mode 100644 index 0000000000..6ee2f00093 --- /dev/null +++ b/test/services/cloud_sync/cloud_sync_runtime_test.dart @@ -0,0 +1,182 @@ +import 'dart:async'; + +import 'package:bluebubbles/services/rustpush/cloud_sync/cloud_sync_engine.dart'; +import 'package:bluebubbles/services/rustpush/cloud_sync/cloud_sync_models.dart'; +import 'package:bluebubbles/services/rustpush/cloud_sync/cloud_sync_runtime.dart'; +import 'package:bluebubbles/services/rustpush/cloud_sync/cloud_sync_testing.dart'; +import 'package:bluebubbles/services/rustpush/cloud_sync/in_memory_cloud_sync_store.dart'; +import 'package:flutter_test/flutter_test.dart'; + +import 'cloud_sync_test_helpers.dart'; + +void main() { + CloudSyncEngine engineFor({ + required String zone, + required FakeCloudSyncTransport transport, + CloudSyncFeatureFlags flags = const CloudSyncFeatureFlags(), + Duration? fetchDelay, + }) { + final baseScope = testScope(); + final scope = CloudSyncScope( + accountFingerprint: baseScope.accountFingerprint, + container: baseScope.container, + database: baseScope.database, + zone: zone, + streamKind: baseScope.streamKind, + schemaVersion: baseScope.schemaVersion, + ); + final scoped = CloudSyncEngine( + scope: scope, + coordinatorId: 'runtime-test-$zone', + store: InMemoryCloudSyncStore(), + transport: transport, + inboxApplier: FakeCloudInboxApplier(), + config: CloudSyncEngineConfig(flags: flags), + ); + if (fetchDelay != null) { + transport.fetchHandler = (scope, previousToken, generation, limit) async { + await Future.delayed(fetchDelay); + return emptyBatch(scope, previousToken); + }; + } + return scoped; + } + + test( + 'runs each read-only scope sequentially and exposes bounded results', + () async { + final first = FakeCloudSyncTransport(); + final second = FakeCloudSyncTransport(); + final runtime = CloudSyncShadowRuntime( + engines: [ + engineFor(zone: 'chat-zone', transport: first), + engineFor(zone: 'message-zone', transport: second), + ], + debounce: Duration.zero, + ); + + final results = await runtime.synchronizeNow(); + + expect(results, hasLength(2)); + expect(first.fetchCallCount, 1); + expect(second.fetchCallCount, 1); + expect(runtime.lastResults, hasLength(2)); + expect(runtime.isRunning, isFalse); + await runtime.dispose(); + }, + ); + + test('coalesces reconnect bursts into one shadow pass', () async { + final transport = FakeCloudSyncTransport(); + final runtime = CloudSyncShadowRuntime( + engines: [engineFor(zone: 'message-zone', transport: transport)], + debounce: const Duration(milliseconds: 20), + automaticTriggersEnabled: true, + ); + + runtime.onStartup(); + runtime.onNetworkReconnect(); + runtime.onIdsReconnect(); + await runtime.waitUntilIdle(); + + expect(transport.fetchCallCount, 1); + await runtime.dispose(); + }); + + test('automatic triggers stay dormant by default', () async { + final transport = FakeCloudSyncTransport(); + final runtime = CloudSyncShadowRuntime( + engines: [engineFor(zone: 'message-zone', transport: transport)], + debounce: Duration.zero, + ); + + runtime.onStartup(); + runtime.onNetworkReconnect(); + runtime.onIdsReconnect(); + runtime.onDetectedGap(); + await runtime.waitUntilIdle(); + + expect(runtime.automaticTriggersEnabled, isFalse); + expect(transport.fetchCallCount, 0); + + await runtime.synchronizeNow(); + expect(transport.fetchCallCount, 1); + await runtime.dispose(); + }); + + test('rejects any engine capable of mutating local or CloudKit state', () { + final dangerousFlags = [ + const CloudSyncFeatureFlags(readOnlyFetch: false), + const CloudSyncFeatureFlags(semanticApply: true), + const CloudSyncFeatureFlags(saves: true), + const CloudSyncFeatureFlags(deletions: true), + const CloudSyncFeatureFlags(profiles: true), + const CloudSyncFeatureFlags(notificationHints: true), + ]; + + for (final flags in dangerousFlags) { + expect( + () => CloudSyncShadowRuntime( + engines: [ + engineFor( + zone: 'message-zone', + transport: FakeCloudSyncTransport(), + flags: flags, + ), + ], + ), + throwsArgumentError, + ); + } + }); + + test( + 'dispose cancels the active scope and suppresses queued scopes', + () async { + final first = FakeCloudSyncTransport(); + final second = FakeCloudSyncTransport(); + final firstStarted = Completer(); + final releaseFirst = Completer(); + first.fetchHandler = (scope, previousToken, generation, limit) async { + firstStarted.complete(); + await releaseFirst.future; + return emptyBatch(scope, previousToken); + }; + final runtime = CloudSyncShadowRuntime( + engines: [ + engineFor(zone: 'chat-zone', transport: first), + engineFor(zone: 'message-zone', transport: second), + ], + debounce: Duration.zero, + automaticTriggersEnabled: true, + ); + + runtime.onStartup(); + await firstStarted.future; + final firstDispose = runtime.dispose(); + final repeatedDispose = runtime.dispose(); + + expect(identical(firstDispose, repeatedDispose), isTrue); + expect(runtime.isRunning, isTrue); + releaseFirst.complete(); + await repeatedDispose; + + expect(first.fetchCallCount, 1); + expect(second.fetchCallCount, 0); + expect(runtime.isDisposed, isTrue); + expect(runtime.isRunning, isFalse); + expect(runtime.hasPendingWork, isFalse); + }, + ); +} + +CloudFetchBatch emptyBatch(CloudSyncScope scope, String? token) { + return CloudFetchBatch( + scope: scope, + changes: const [], + batchId: 'runtime-empty-${scope.zone}', + generation: 1, + nextToken: token, + hasMore: false, + ); +} diff --git a/test/services/cloud_sync/cloud_sync_safe_failure_test.dart b/test/services/cloud_sync/cloud_sync_safe_failure_test.dart new file mode 100644 index 0000000000..bc5df9c008 --- /dev/null +++ b/test/services/cloud_sync/cloud_sync_safe_failure_test.dart @@ -0,0 +1,76 @@ +import 'package:bluebubbles/services/rustpush/cloud_sync/cloud_sync_safe_failure.dart'; +import 'package:bluebubbles/services/rustpush/cloud_sync/cloud_sync_shadow_report_file.dart'; +import 'package:bluebubbles/services/rustpush/cloud_sync/cloudkit_operation_interlock.dart'; +import 'package:bluebubbles/services/rustpush/cloud_sync/cloudkit_writer_authority.dart'; +import 'package:flutter_test/flutter_test.dart'; + +void main() { + test('exposes only reviewed state failure codes', () { + expect( + cloudSyncV2SafeFailureCode(StateError('legacy_sync_active')), + 'legacy_sync_active', + ); + expect( + cloudSyncV2SafeFailureCode( + StateError('account-secret@example.com should never be shown'), + ), + 'cloud_sync_unknown_failure', + ); + }); + + test('exposes reviewed report and interlock codes', () { + expect( + cloudSyncV2SafeFailureCode( + const CloudSyncShadowReportFileException( + 'cloud_sync_report_retention_failed', + ), + ), + 'cloud_sync_report_retention_failed', + ); + expect( + cloudSyncV2SafeFailureCode( + const CloudKitOperationInterlockException('cloudkit_interlock_busy'), + ), + 'cloudkit_interlock_busy', + ); + }); + + test('preserves a reviewed writer authority failure code', () { + expect( + cloudSyncV2SafeFailureCode( + const CloudKitWriterAuthorityFailure('cloudkit_writer_identity_changed'), + ), + 'cloudkit_writer_identity_changed', + ); + }); + + test('preserves reviewed outbound canary and candidate state codes', () { + expect( + cloudSyncV2SafeFailureCode( + StateError('cloud_sync_outbound_canary_recovery_invalid'), + ), + 'cloud_sync_outbound_canary_recovery_invalid', + ); + expect( + cloudSyncV2SafeFailureCode( + StateError('cloud_sync_outbound_canary_unavailable'), + ), + 'cloud_sync_outbound_canary_unavailable', + ); + expect( + cloudSyncV2SafeFailureCode( + StateError('cloud_sync_outbound_candidate_selection_failed'), + ), + 'cloud_sync_outbound_candidate_selection_failed', + ); + }); + + test('collapses arbitrary exception text', () { + expect( + cloudSyncV2SafeFailureCode( + Exception('token=private-value account=user@example.com'), + ), + 'cloud_sync_unknown_failure', + ); + }); +} diff --git a/test/services/cloud_sync/cloud_sync_scheduler_test.dart b/test/services/cloud_sync/cloud_sync_scheduler_test.dart new file mode 100644 index 0000000000..a8d4e382b0 --- /dev/null +++ b/test/services/cloud_sync/cloud_sync_scheduler_test.dart @@ -0,0 +1,125 @@ +import 'dart:async'; + +import 'package:bluebubbles/services/rustpush/cloud_sync/cloud_sync_cancellation.dart'; +import 'package:bluebubbles/services/rustpush/cloud_sync/cloud_sync_engine.dart'; +import 'package:bluebubbles/services/rustpush/cloud_sync/cloud_sync_models.dart'; +import 'package:bluebubbles/services/rustpush/cloud_sync/cloud_sync_observability.dart'; +import 'package:bluebubbles/services/rustpush/cloud_sync/cloud_sync_scheduler.dart'; +import 'package:flutter_test/flutter_test.dart'; + +void main() { + CloudSyncRunResult completedResult() { + final now = DateTime.utc(2026, 7, 31); + return CloudSyncRunResult( + status: CloudSyncRunStatus.completed, + counters: const CloudSyncRunCounters(), + startedAt: now, + finishedAt: now, + ); + } + + test( + 'coalesces a burst and retains the strongest integrity trigger', + () async { + final observed = []; + final scheduler = CloudSyncScheduler( + debounce: const Duration(milliseconds: 5), + run: (trigger, cancellation) async { + observed.add(trigger); + return completedResult(); + }, + ); + + scheduler.request(CloudSyncTrigger.notificationHint); + scheduler.request(CloudSyncTrigger.localOutbox); + scheduler.request(CloudSyncTrigger.networkReconnect); + await scheduler.waitUntilIdle(); + + expect(observed, [CloudSyncTrigger.networkReconnect]); + await scheduler.dispose(); + }, + ); + + test('a burst during an active run becomes one follow-up run', () async { + final firstStarted = Completer(); + final releaseFirst = Completer(); + final observed = []; + final scheduler = CloudSyncScheduler( + debounce: Duration.zero, + run: (trigger, cancellation) async { + observed.add(trigger); + if (observed.length == 1) { + firstStarted.complete(); + await releaseFirst.future; + } + return completedResult(); + }, + ); + + scheduler.request(CloudSyncTrigger.startup); + await firstStarted.future; + scheduler.request(CloudSyncTrigger.notificationHint); + scheduler.request(CloudSyncTrigger.localOutbox); + scheduler.request(CloudSyncTrigger.idsReconnect); + releaseFirst.complete(); + await scheduler.waitUntilIdle(); + + expect(observed, [CloudSyncTrigger.startup, CloudSyncTrigger.idsReconnect]); + await scheduler.dispose(); + }); + + test('dispose cancels an active run and ignores later triggers', () async { + final started = Completer(); + final cancelled = Completer(); + var runCount = 0; + final scheduler = CloudSyncScheduler( + debounce: Duration.zero, + run: + ( + CloudSyncTrigger trigger, + CloudSyncCancellationToken cancellation, + ) async { + runCount++; + started.complete(); + while (!cancellation.isCancelled) { + await Future.delayed(const Duration(milliseconds: 1)); + } + cancelled.complete(); + return completedResult(); + }, + ); + + scheduler.request(CloudSyncTrigger.manual); + await started.future; + final firstDispose = scheduler.dispose(); + final repeatedDispose = scheduler.dispose(); + + expect(identical(firstDispose, repeatedDispose), isTrue); + await repeatedDispose; + + expect(cancelled.isCompleted, isTrue); + expect(scheduler.isRunning, isFalse); + expect(scheduler.hasPendingWork, isFalse); + scheduler.request(CloudSyncTrigger.startup); + await Future.delayed(const Duration(milliseconds: 5)); + + expect(runCount, 1); + }); + + test('run errors are contained and scheduler becomes idle', () async { + final errors = []; + final scheduler = CloudSyncScheduler( + debounce: Duration.zero, + run: (trigger, cancellation) async => throw StateError('synthetic'), + onError: (error, stackTrace) => errors.add(error), + ); + + scheduler.request(CloudSyncTrigger.manual); + await scheduler.waitUntilIdle(); + + expect(errors.single, isA()); + expect(scheduler.isRunning, isFalse); + expect(scheduler.hasPendingWork, isFalse); + await scheduler.dispose(); + }); +} diff --git a/test/services/cloud_sync/cloud_sync_shadow_report_file_test.dart b/test/services/cloud_sync/cloud_sync_shadow_report_file_test.dart new file mode 100644 index 0000000000..0506b76eed --- /dev/null +++ b/test/services/cloud_sync/cloud_sync_shadow_report_file_test.dart @@ -0,0 +1,359 @@ +import 'dart:convert'; + +import 'package:bluebubbles/services/rustpush/cloud_sync/cloud_sync_engine.dart'; +import 'package:bluebubbles/services/rustpush/cloud_sync/cloud_sync_shadow_report.dart'; +import 'package:bluebubbles/services/rustpush/cloud_sync/cloud_sync_shadow_report_file.dart'; +import 'package:flutter_test/flutter_test.dart'; +import 'package:universal_io/io.dart'; + +void main() { + late Directory temporaryDirectory; + + setUp(() { + temporaryDirectory = Directory.systemTemp.createTempSync( + 'cloud-sync-shadow-report-', + ); + }); + + tearDown(() { + if (temporaryDirectory.existsSync()) { + temporaryDirectory.deleteSync(recursive: true); + } + }); + + CloudSyncShadowReport report({String runId = 'obcs2-shadow-20260802-1'}) { + return CloudSyncShadowReport( + runId: runId, + correlationTag: 'ephemeral-tag', + timestampUtc: DateTime.utc(2026, 8, 2), + platform: 'android', + architecture: 'arm64', + buildCommit: 'test-build', + legacySyncEnabled: false, + pageLimit: 1, + changeLimit: 50, + tripwiresArmed: true, + outboxCountBefore: 0, + outboxCountAfter: 0, + zones: const [ + CloudSyncShadowZoneReport( + zoneLabel: 'chats', + status: CloudSyncRunStatus.completed, + fetched: 0, + journaled: 0, + rejected: 0, + estimatedBytes: 0, + elapsedMilliseconds: 3, + ), + CloudSyncShadowZoneReport( + zoneLabel: 'messages', + status: CloudSyncRunStatus.completed, + fetched: 2, + journaled: 2, + rejected: 0, + estimatedBytes: 2048, + elapsedMilliseconds: 12, + ), + CloudSyncShadowZoneReport( + zoneLabel: 'attachments', + status: CloudSyncRunStatus.completed, + fetched: 0, + journaled: 0, + rejected: 0, + estimatedBytes: 0, + elapsedMilliseconds: 4, + ), + CloudSyncShadowZoneReport( + zoneLabel: 'message updates', + status: CloudSyncRunStatus.completed, + fetched: 0, + journaled: 0, + rejected: 0, + estimatedBytes: 0, + elapsedMilliseconds: 5, + ), + CloudSyncShadowZoneReport( + zoneLabel: 'recoverable deletes', + status: CloudSyncRunStatus.completed, + fetched: 0, + journaled: 0, + rejected: 0, + estimatedBytes: 0, + elapsedMilliseconds: 6, + ), + CloudSyncShadowZoneReport( + zoneLabel: 'scheduled messages', + status: CloudSyncRunStatus.completed, + fetched: 0, + journaled: 0, + rejected: 0, + estimatedBytes: 0, + elapsedMilliseconds: 7, + ), + CloudSyncShadowZoneReport( + zoneLabel: 'chat1 manatee', + status: CloudSyncRunStatus.completed, + fetched: 0, + journaled: 0, + rejected: 0, + estimatedBytes: 0, + elapsedMilliseconds: 8, + ), + ], + ); + } + + test('writes only the allowlisted redacted report contract', () async { + final writer = CloudSyncShadowReportFileWriter( + privateReportDirectory: temporaryDirectory.path, + ); + + final file = await writer.write(report()); + final decoded = + jsonDecode(await file.readAsString()) as Map; + + expect(decoded['runId'], 'obcs2-shadow-20260802-1'); + expect(decoded['mode'], 'manual-read-only'); + expect(decoded['automaticTriggersEnabled'], isFalse); + expect(decoded, isNot(contains('accountFingerprint'))); + expect(decoded, isNot(contains('continuationToken'))); + expect(decoded, isNot(contains('recordId'))); + expect( + temporaryDirectory.listSync().whereType().map( + (entry) => entry.path, + ), + everyElement(endsWith('.json')), + ); + }); + + test('will not overwrite an existing report', () async { + final writer = CloudSyncShadowReportFileWriter( + privateReportDirectory: temporaryDirectory.path, + ); + await writer.write(report()); + + await expectLater( + writer.write(report()), + throwsA( + isA().having( + (error) => error.safeCode, + 'safeCode', + 'cloud_sync_report_already_exists', + ), + ), + ); + }); + + test('retains a bounded number of owned reports', () async { + final writer = CloudSyncShadowReportFileWriter( + privateReportDirectory: temporaryDirectory.path, + maximumRetainedReports: 2, + ); + final first = await writer.write(report(runId: 'obcs2-shadow-1')); + await first.setLastModified(DateTime.utc(2026, 8, 2, 1)); + final second = await writer.write(report(runId: 'obcs2-shadow-2')); + await second.setLastModified(DateTime.utc(2026, 8, 2, 2)); + await writer.write(report(runId: 'obcs2-shadow-3')); + + final names = temporaryDirectory + .listSync() + .whereType() + .map((file) => file.uri.pathSegments.last) + .toSet(); + expect(names, {'obcs2-shadow-2.json', 'obcs2-shadow-3.json'}); + }); + + test('retention never deletes unrelated files', () async { + final unrelated = File( + '${temporaryDirectory.path}${Platform.pathSeparator}notes.txt', + )..writeAsStringSync('preserve'); + final unrelatedJson = File( + '${temporaryDirectory.path}${Platform.pathSeparator}notes.json', + )..writeAsStringSync('{"preserve":true}'); + final writer = CloudSyncShadowReportFileWriter( + privateReportDirectory: temporaryDirectory.path, + maximumRetainedReports: 1, + ); + await writer.write(report(runId: 'obcs2-shadow-1')); + await writer.write(report(runId: 'obcs2-shadow-2')); + + expect(unrelated.readAsStringSync(), 'preserve'); + expect(unrelatedJson.readAsStringSync(), '{"preserve":true}'); + expect( + temporaryDirectory.listSync().whereType().where( + (file) => + file.path.contains('obcs2-shadow-') && file.path.endsWith('.json'), + ), + hasLength(1), + ); + }); + + test('reclaims only old writer-owned temporary files', () async { + final now = DateTime.utc(2026, 8, 2, 12); + final oldOwned = File( + '${temporaryDirectory.path}${Platform.pathSeparator}' + '.obcs2-shadow-old.0123456789abcdef01234567.tmp', + )..writeAsStringSync('incomplete'); + final recentOwned = File( + '${temporaryDirectory.path}${Platform.pathSeparator}' + '.obcs2-shadow-recent.0123456789abcdef01234567.tmp', + )..writeAsStringSync('active'); + final unrelatedTemporary = File( + '${temporaryDirectory.path}${Platform.pathSeparator}.unrelated.tmp', + )..writeAsStringSync('preserve'); + oldOwned.setLastModifiedSync(now.subtract(const Duration(days: 2))); + recentOwned.setLastModifiedSync(now.subtract(const Duration(hours: 1))); + + final writer = CloudSyncShadowReportFileWriter( + privateReportDirectory: temporaryDirectory.path, + now: () => now, + ); + await writer.write(report(runId: 'obcs2-shadow-cleanup')); + + expect(oldOwned.existsSync(), isFalse); + expect(recentOwned.existsSync(), isTrue); + expect(unrelatedTemporary.readAsStringSync(), 'preserve'); + }); + + test( + 'rejects a report directory redirected outside trusted storage', + () async { + final outside = Directory.systemTemp.createTempSync( + 'cloud-sync-shadow-outside-', + ); + final linkedReports = Link( + '${temporaryDirectory.path}${Platform.pathSeparator}reports-link', + ); + try { + try { + await linkedReports.create(outside.path); + } on FileSystemException { + // Some Windows hosts do not permit symlink creation. Linux CI and + // developer-enabled Windows hosts exercise the rejection path. + return; + } + final writer = CloudSyncShadowReportFileWriter( + privateReportDirectory: linkedReports.path, + trustedStorageRoot: temporaryDirectory.path, + ); + + await expectLater( + writer.write(report(runId: 'obcs2-shadow-redirected')), + throwsA( + isA().having( + (error) => error.safeCode, + 'safeCode', + 'cloud_sync_report_directory_unsafe', + ), + ), + ); + expect(outside.listSync(), isEmpty); + } finally { + if (await linkedReports.exists()) await linkedReports.delete(); + if (outside.existsSync()) outside.deleteSync(recursive: true); + } + }, + ); + + test('rejects traversal and secret-bearing run identifiers', () async { + final writer = CloudSyncShadowReportFileWriter( + privateReportDirectory: temporaryDirectory.path, + ); + + for (final invalid in [ + '../outside', + r'..\outside', + 'raw-account@example.com', + 'contains whitespace', + 'shadow-missing-owned-prefix', + '', + ]) { + await expectLater( + writer.write(report(runId: invalid)), + throwsA( + isA().having( + (error) => error.safeCode, + 'safeCode', + 'cloud_sync_report_run_id_invalid', + ), + ), + ); + } + expect(temporaryDirectory.listSync(), isEmpty); + }); + + test('rejects non-allowlisted report strings before writing', () async { + final writer = CloudSyncShadowReportFileWriter( + privateReportDirectory: temporaryDirectory.path, + ); + final unsafe = CloudSyncShadowReport( + runId: 'obcs2-shadow-safe-name', + correlationTag: 'ephemeral-tag', + timestampUtc: DateTime.utc(2026, 8, 2), + platform: 'raw-account@example.com', + architecture: 'arm64', + buildCommit: 'test-build', + legacySyncEnabled: false, + pageLimit: 1, + changeLimit: 50, + tripwiresArmed: true, + outboxCountBefore: 0, + outboxCountAfter: 0, + zones: report().zones, + ); + + await expectLater( + writer.write(unsafe), + throwsA( + isA().having( + (error) => error.safeCode, + 'safeCode', + 'cloud_sync_report_contract_invalid', + ), + ), + ); + expect(temporaryDirectory.listSync(), isEmpty); + }); + + test('rejects incomplete or impossible zone counters', () async { + final writer = CloudSyncShadowReportFileWriter( + privateReportDirectory: temporaryDirectory.path, + ); + final invalid = CloudSyncShadowReport( + runId: 'obcs2-shadow-invalid-counts', + correlationTag: 'ephemeral-tag', + timestampUtc: DateTime.utc(2026, 8, 2), + platform: 'android', + architecture: 'arm64', + buildCommit: 'test-build', + legacySyncEnabled: false, + pageLimit: 1, + changeLimit: 50, + tripwiresArmed: true, + outboxCountBefore: 0, + outboxCountAfter: 0, + zones: const [ + CloudSyncShadowZoneReport( + zoneLabel: 'messages', + status: CloudSyncRunStatus.completed, + fetched: 51, + journaled: 0, + rejected: 0, + estimatedBytes: 0, + elapsedMilliseconds: 1, + ), + ], + ); + + await expectLater( + writer.write(invalid), + throwsA( + isA().having( + (error) => error.safeCode, + 'safeCode', + 'cloud_sync_report_contract_invalid', + ), + ), + ); + }); +} diff --git a/test/services/cloud_sync/cloud_sync_shadow_report_test.dart b/test/services/cloud_sync/cloud_sync_shadow_report_test.dart new file mode 100644 index 0000000000..77f163f72a --- /dev/null +++ b/test/services/cloud_sync/cloud_sync_shadow_report_test.dart @@ -0,0 +1,94 @@ +import 'dart:convert'; + +import 'package:bluebubbles/services/rustpush/cloud_sync/cloud_sync_engine.dart'; +import 'package:bluebubbles/services/rustpush/cloud_sync/cloud_sync_shadow_report.dart'; +import 'package:flutter_test/flutter_test.dart'; + +void main() { + test('report exposes only the explicit redacted contract', () { + const forbiddenFingerprint = '0123456789abcdef'; + final report = CloudSyncShadowReport( + runId: 'local-random-run', + correlationTag: 'ephemeral-run-tag', + timestampUtc: DateTime.utc(2026, 8, 1), + platform: 'windows', + architecture: 'arm64', + buildCommit: 'test-build', + legacySyncEnabled: false, + pageLimit: 1, + changeLimit: 50, + tripwiresArmed: true, + outboxCountBefore: 0, + outboxCountAfter: 0, + zones: const [ + CloudSyncShadowZoneReport( + zoneLabel: 'messages', + status: CloudSyncRunStatus.completed, + fetched: 2, + journaled: 2, + rejected: 0, + estimatedBytes: 4096, + elapsedMilliseconds: 25, + ), + ], + ); + + final encoded = jsonEncode(report.toJson()); + expect(encoded, contains('"correlationTag":"ephemeral-run-tag"')); + expect(encoded, isNot(contains(forbiddenFingerprint))); + expect(encoded, isNot(contains('token'))); + expect(encoded, isNot(contains('recordId'))); + expect(encoded, isNot(contains('etag'))); + expect(encoded, isNot(contains('ciphertext'))); + expect(report.isValidReadOnlySuccess, isTrue); + }); + + test( + 'report cannot claim success when legacy sync or tripwire is unsafe', + () { + CloudSyncShadowReport build({ + required bool legacySyncEnabled, + required bool tripwiresArmed, + }) => CloudSyncShadowReport( + runId: 'run', + correlationTag: 'ephemeral', + timestampUtc: DateTime.utc(2026), + platform: 'android', + architecture: 'arm64', + buildCommit: 'test', + legacySyncEnabled: legacySyncEnabled, + pageLimit: 1, + changeLimit: 50, + tripwiresArmed: tripwiresArmed, + outboxCountBefore: 0, + outboxCountAfter: 0, + zones: const [ + CloudSyncShadowZoneReport( + zoneLabel: 'messages', + status: CloudSyncRunStatus.completed, + fetched: 0, + journaled: 0, + rejected: 0, + estimatedBytes: 0, + elapsedMilliseconds: 1, + ), + ], + ); + + expect( + build( + legacySyncEnabled: true, + tripwiresArmed: true, + ).isValidReadOnlySuccess, + isFalse, + ); + expect( + build( + legacySyncEnabled: false, + tripwiresArmed: false, + ).isValidReadOnlySuccess, + isFalse, + ); + }, + ); +} diff --git a/test/services/cloud_sync/cloud_sync_shadow_transport_test.dart b/test/services/cloud_sync/cloud_sync_shadow_transport_test.dart new file mode 100644 index 0000000000..612b993d3a --- /dev/null +++ b/test/services/cloud_sync/cloud_sync_shadow_transport_test.dart @@ -0,0 +1,78 @@ +import 'package:bluebubbles/services/rustpush/cloud_sync/cloud_sync_models.dart'; +import 'package:bluebubbles/services/rustpush/cloud_sync/cloud_sync_shadow_transport.dart'; +import 'package:bluebubbles/services/rustpush/cloud_sync/cloud_sync_testing.dart'; +import 'package:flutter_test/flutter_test.dart'; + +import 'cloud_sync_test_helpers.dart'; + +void main() { + test( + 'account change after fetch rejects page before caller can journal it', + () async { + final scope = testScope(); + var activeFingerprint = scope.accountFingerprint; + final delegate = FakeCloudSyncTransport() + ..fetchHandler = (scope, token, generation, limit) async { + activeFingerprint = 'replacement-account'; + return CloudFetchBatch( + scope: scope, + changes: [testChange(1)], + batchId: 'batch', + generation: generation, + nextToken: 'token', + hasMore: false, + ); + }; + final transport = AccountBoundShadowTransport( + delegate: delegate, + readActiveFingerprint: () async => activeFingerprint, + expectedFingerprint: scope.accountFingerprint, + ); + + await expectLater( + transport.fetchChanges( + scope, + previousToken: null, + generation: 1, + limit: 50, + ), + throwsA( + isA().having( + (failure) => failure.safeCode, + 'safeCode', + 'account_changed', + ), + ), + ); + }, + ); + + test('all mutation and refresh routes fail through the tripwire', () async { + final scope = testScope(); + final transport = AccountBoundShadowTransport( + delegate: FakeCloudSyncTransport(), + readActiveFingerprint: () async => scope.accountFingerprint, + expectedFingerprint: scope.accountFingerprint, + ); + + await expectLater( + transport.pushOperations(scope, operations: const []), + throwsA(isA()), + ); + await expectLater( + transport.allocateServerRecordMapping( + scope, + logicalEntityKeyHash: 'logical', + ), + throwsA(isA()), + ); + await expectLater( + transport.refreshAuthentication(scope), + throwsA(isA()), + ); + await expectLater( + transport.refreshPcsAccess(scope), + throwsA(isA()), + ); + }); +} diff --git a/test/services/cloud_sync/cloud_sync_test_helpers.dart b/test/services/cloud_sync/cloud_sync_test_helpers.dart new file mode 100644 index 0000000000..c178f1f80c --- /dev/null +++ b/test/services/cloud_sync/cloud_sync_test_helpers.dart @@ -0,0 +1,121 @@ +import 'package:bluebubbles/services/rustpush/cloud_sync/cloud_operation_identity.dart'; +import 'package:bluebubbles/services/rustpush/cloud_sync/cloud_sync_models.dart'; + +final testEpoch = DateTime.utc(2026, 7, 31, 12); +const testAccountFingerprintA = 'AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA'; +const testAccountFingerprintB = 'BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB'; + +CloudSyncScope testScope({ + String account = testAccountFingerprintA, + CloudSyncStreamKind streamKind = CloudSyncStreamKind.messages, +}) { + return CloudSyncScope( + accountFingerprint: account, + container: 'messages-container', + database: 'private', + zone: 'message-zone', + streamKind: streamKind, + ); +} + +CloudFetchedChange testChange( + int index, { + bool tombstone = false, + CloudFailureCategory? preflightFailure, +}) { + final changeId = 'C${index.toString().padLeft(42, '0')}'; + return CloudFetchedChange( + changeId: changeId, + recordIdHash: 'record-digest-$index', + etagHash: tombstone ? null : 'etag-digest-$index', + type: tombstone ? CloudChangeType.delete : CloudChangeType.save, + encryptedServerRecordId: 'protected:server-record-$index', + protectedSystemFieldsReference: 'protected:system-fields-$index', + encryptedPayloadReference: tombstone ? null : 'protected:payload-$index', + payloadSha256: tombstone ? null : 'payload-digest-$index', + isTombstone: tombstone, + preflightFailure: preflightFailure, + ); +} + +CloudOutboxOperation testOutboxOperation( + CloudSyncScope scope, + int index, { + CloudOutboxAction action = CloudOutboxAction.save, + int revision = 1, + int checkpointGeneration = 1, + Iterable dependencies = const [], + DateTime? createdAt, +}) { + final logicalKeyHash = List.filled( + 43, + String.fromCharCode(65 + (index % 26)), + ).join(); + final payloadSha256 = action == CloudOutboxAction.save + ? '${index.toRadixString(16).padLeft(32, '0')}' + '${revision.toRadixString(16).padLeft(32, '0')}' + : null; + final protectedReferenceMarker = String.fromCharCode( + 65 + ((index + revision) % 26), + ); + return CloudOutboxOperation( + scope: scope, + operationId: CloudOperationIdentity.forMutation( + scope: scope, + logicalEntityKeyHash: logicalKeyHash, + action: action, + payloadVersion: 1, + mutationRevision: revision, + payloadSha256: payloadSha256, + ), + logicalEntityKeyHash: logicalKeyHash, + action: action, + payloadVersion: 1, + mutationRevision: revision, + checkpointGeneration: checkpointGeneration, + encryptedPayloadReference: action == CloudOutboxAction.save + ? 'obcs2.ref.${List.filled(43, protectedReferenceMarker).join()}' + : null, + payloadSha256: payloadSha256, + protectedLeaseReference: action == CloudOutboxAction.save + ? 'obcs2.lease.${index.toRadixString(16).padLeft(32, '0')}' + : null, + dependencyOperationIds: dependencies, + createdAt: createdAt ?? testEpoch.add(Duration(microseconds: revision)), + ); +} + +CloudOutboxSubmissionIdentity testSubmissionIdentity( + Iterable operationIds, +) { + final ids = operationIds.toList(growable: false); + return CloudOutboxSubmissionIdentity( + requestUuid: '11111111-2222-4ABC-8DEF-555555555555', + operationUuids: { + for (var index = 0; index < ids.length; index++) + ids[index]: + 'AAAAAAAA-BBBB-4CCC-8DDD-${(index + 1).toRadixString(16).padLeft(12, '0').toUpperCase()}', + }, + ); +} + +String testSha256(String hexadecimalCharacter) => + List.filled(64, hexadecimalCharacter).join(); + +String testProtectedReference(String urlSafeCharacter) => + 'obcs2.ref.${List.filled(43, urlSafeCharacter).join()}'; + +String testProtectedLeaseReference(String hexadecimalCharacter) => + 'obcs2.lease.${List.filled(32, hexadecimalCharacter).join()}'; + +class MutableTestClock { + MutableTestClock(this.value); + + DateTime value; + + DateTime call() => value; + + void advance(Duration duration) { + value = value.add(duration); + } +} diff --git a/test/services/cloud_sync/cloud_sync_value_types_test.dart b/test/services/cloud_sync/cloud_sync_value_types_test.dart new file mode 100644 index 0000000000..1bb2c382e8 --- /dev/null +++ b/test/services/cloud_sync/cloud_sync_value_types_test.dart @@ -0,0 +1,367 @@ +import 'package:bluebubbles/services/rustpush/cloud_sync/cloud_operation_identity.dart'; +import 'package:bluebubbles/services/rustpush/cloud_sync/cloud_sync_backoff.dart'; +import 'package:bluebubbles/services/rustpush/cloud_sync/cloud_sync_models.dart'; +import 'package:bluebubbles/services/rustpush/cloud_sync/cloud_sync_observability.dart'; +import 'package:bluebubbles/services/rustpush/cloud_sync/cloud_sync_write_transport.dart'; +import 'package:flutter_test/flutter_test.dart'; + +import 'cloud_sync_test_helpers.dart'; + +void main() { + test('operation identity is deterministic, scoped, and revision-aware', () { + final scope = testScope(); + String identity({CloudSyncScope? requestedScope, int revision = 1}) { + return CloudOperationIdentity.forMutation( + scope: requestedScope ?? scope, + logicalEntityKeyHash: 'logical-key-digest', + action: CloudOutboxAction.save, + payloadVersion: 1, + mutationRevision: revision, + payloadSha256: 'payload-digest-$revision', + ); + } + + expect(identity(), identity()); + expect(identity(), startsWith('op1:')); + expect(identity(revision: 2), isNot(identity())); + expect( + identity(requestedScope: testScope(account: testAccountFingerprintB)), + isNot(identity()), + ); + }); + + test('initial create identity is stable across restaging', () { + final scope = testScope(); + final logicalHash = List.filled(43, 'L').join(); + final identity = CloudOperationIdentity.forInitialCreate( + scope: scope, + logicalEntityKeyHash: logicalHash, + payloadVersion: 1, + ); + + expect( + CloudOperationIdentity.forInitialCreate( + scope: scope, + logicalEntityKeyHash: logicalHash, + payloadVersion: 1, + ), + identity, + ); + expect(identity, startsWith('op1:')); + expect( + CloudOperationIdentity.forInitialCreate( + scope: testScope(account: testAccountFingerprintB), + logicalEntityKeyHash: logicalHash, + payloadVersion: 1, + ), + isNot(identity), + ); + }); + + test('initial create identity matches the Rust cross-language fixture', () { + final scope = CloudSyncScope( + accountFingerprint: List.filled(43, 'A').join(), + container: 'com.apple.messages.cloud', + database: 'private', + zone: 'messageManateeZone', + streamKind: CloudSyncStreamKind.messages, + schemaVersion: 2, + ); + + expect( + CloudOperationIdentity.forInitialCreate( + scope: scope, + logicalEntityKeyHash: List.filled(43, 'L').join(), + payloadVersion: 1, + ), + 'op1:516a95310adb6de12787de0e51d654e05f40f2289991f76dcd8e1dac2bd865cb', + ); + }); + + test('delete identity and draft do not require an etag or payload', () { + final scope = testScope(); + final draft = CloudOutboxDraft( + scope: scope, + logicalEntityKeyHash: 'deleted-logical-key-digest', + action: CloudOutboxAction.delete, + payloadVersion: 1, + dependencyOperationIds: const [], + createdAt: testEpoch, + ); + final identity = CloudOperationIdentity.forMutation( + scope: scope, + logicalEntityKeyHash: draft.logicalEntityKeyHash, + action: draft.action, + payloadVersion: draft.payloadVersion, + mutationRevision: 1, + ); + + expect(draft.encryptedPayloadReference, isNull); + expect(draft.payloadSha256, isNull); + expect(identity, startsWith('op1:')); + }); + + test('submission identities require canonical distinct Apple UUIDs', () { + final operation = testOutboxOperation(testScope(), 1); + final identity = testSubmissionIdentity([operation.operationId]); + expect(identity.operationUuids, hasLength(1)); + expect( + () => CloudOutboxSubmissionIdentity( + requestUuid: identity.requestUuid.toLowerCase(), + operationUuids: identity.operationUuids, + ), + throwsArgumentError, + ); + expect( + () => CloudOutboxSubmissionIdentity( + requestUuid: identity.requestUuid, + operationUuids: {operation.operationId: identity.requestUuid}, + ), + throwsArgumentError, + ); + }); + + test('outbox state transitions preserve submission identities', () { + final operation = testOutboxOperation(testScope(), 1); + final identity = testSubmissionIdentity([operation.operationId]); + final submitted = operation.copyWith( + appleRequestUuid: identity.requestUuid, + appleOperationUuid: identity.operationUuids[operation.operationId], + status: CloudOutboxStatus.unknownOutcome, + ); + + final preserved = submitted.copyWith(status: CloudOutboxStatus.confirmed); + expect(preserved.appleRequestUuid, submitted.appleRequestUuid); + expect(preserved.appleOperationUuid, submitted.appleOperationUuid); + final provenNotApplied = submitted.copyWith( + status: CloudOutboxStatus.pending, + clearSubmissionIdentity: true, + ); + expect(provenNotApplied.appleRequestUuid, isNull); + expect(provenNotApplied.appleOperationUuid, isNull); + }); + + test('full-jitter exponential backoff honors retry-after', () { + final policy = CloudSyncBackoffPolicy( + baseDelay: const Duration(seconds: 2), + maximumDelay: const Duration(seconds: 20), + randomUnit: () => 0.5, + ); + + expect( + policy.delayFor(attempt: 1, category: CloudFailureCategory.network), + const Duration(seconds: 1), + ); + expect( + policy.delayFor( + attempt: 4, + category: CloudFailureCategory.throttled, + retryAfter: const Duration(seconds: 12), + ), + const Duration(seconds: 12), + ); + expect( + policy.delayFor(attempt: 20, category: CloudFailureCategory.server), + const Duration(seconds: 10), + ); + }); + + test('PCS pause has conservative floor and remains bounded', () { + final policy = CloudSyncBackoffPolicy( + baseDelay: const Duration(seconds: 2), + maximumDelay: const Duration(minutes: 15), + randomUnit: () => 0, + ); + + expect( + policy.delayFor( + attempt: 1, + category: CloudFailureCategory.pcsUnavailable, + ), + const Duration(seconds: 30), + ); + }); + + test('observer is bounded and its output cannot contain raw values', () { + final observer = MemoryCloudSyncObserver(maximumEvents: 2); + for (var index = 0; index < 3; index++) { + observer.onEvent( + CloudSyncEvent( + type: CloudSyncEventType.fetchCompleted, + scopeDiagnosticKey: testScope().diagnosticKey, + at: testEpoch, + count: index, + ), + ); + } + + expect(observer.events, hasLength(2)); + final rendered = observer.events.join('\n'); + expect(rendered, isNot(contains('opaque-token'))); + expect(rendered, isNot(contains('protected:payload'))); + expect(rendered, isNot(contains('messages-container'))); + expect(rendered, isNot(contains('message-zone'))); + }); + + test('scope diagnostic form exposes only bounded account prefix', () { + final scope = testScope( + account: '12345678AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA', + ); + expect(scope.toString(), contains('12345678')); + expect( + scope.toString(), + isNot(contains('AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA')), + ); + expect(scope.toString(), isNot(contains('messages-container'))); + }); + + test('message and profile streams never share a storage scope', () { + final messages = testScope(); + final profiles = testScope(streamKind: CloudSyncStreamKind.profiles); + + expect(messages.storageKey, isNot(profiles.storageKey)); + expect(messages.schemaVersion, 2); + }); + + test('push batch rejects duplicate outcome IDs without overwriting', () { + final operationId = testOutboxOperation(testScope(), 1).operationId; + final first = CloudPushOutcome( + operationId: operationId, + disposition: CloudPushDisposition.confirmed, + ); + final second = CloudPushOutcome( + operationId: operationId, + disposition: CloudPushDisposition.retryable, + failureCategory: CloudFailureCategory.network, + ); + + expect( + () => CloudPushBatchResult(outcomes: [first, second]), + throwsA( + isA().having( + (error) => error.toString(), + 'redacted message', + allOf( + contains('cloud_push_batch_duplicate_outcome_id'), + isNot(contains(operationId)), + ), + ), + ), + ); + }); + + test('push outcomes reject empty and unsafe operation IDs', () { + final invalidIds = [ + '', + 'raw/record/secret', + 'op1:${'a' * 63}', + 'op1:${'A' * 64}', + 'op1:${'a' * 64}\nsecret-tail', + ]; + + for (final invalidId in invalidIds) { + final redactedMessageMatcher = invalidId.isEmpty + ? contains('cloud_push_outcome_operation_id_invalid') + : allOf( + contains('cloud_push_outcome_operation_id_invalid'), + isNot(contains(invalidId)), + ); + expect( + () => CloudPushOutcome( + operationId: invalidId, + disposition: CloudPushDisposition.confirmed, + ), + throwsA( + isA().having( + (error) => error.toString(), + 'redacted message', + redactedMessageMatcher, + ), + ), + ); + } + }); + + test('push batch exposes a stable read-only map and redacted strings', () { + final operationId = testOutboxOperation(testScope(), 1).operationId; + final outcome = CloudPushOutcome( + operationId: operationId, + disposition: CloudPushDisposition.confirmed, + ); + final result = CloudPushBatchResult(outcomes: [outcome]); + + expect(result.outcomes, hasLength(1)); + expect(result.toString(), 'CloudPushBatchResult(count: 1)'); + expect(result.toString(), isNot(contains(operationId))); + expect(outcome.toString(), 'CloudPushOutcome(confirmed, redacted)'); + expect(outcome.toString(), isNot(contains(operationId))); + expect( + () => result.outcomes[operationId] = outcome, + throwsUnsupportedError, + ); + }); + + test('prepared submission is identity-bound and single-use', () { + final scope = testScope(); + final operation = testOutboxOperation( + scope, + 12, + ).copyWith(serverRecordIdHash: List.filled(43, 'R').join()); + final identity = testSubmissionIdentity([operation.operationId]); + final protectedOperation = CloudSyncProtectedWriteOperation.fromOutbox( + operation, + recordMapping: CloudRecordMapEntry( + scope: scope, + logicalEntityKeyHash: operation.logicalEntityKeyHash, + serverRecordIdHash: operation.serverRecordIdHash!, + encryptedServerRecordId: testProtectedReference('R'), + updatedAt: testEpoch, + ), + ); + final prepared = CloudSyncPreparedSubmission.fromProtectedPreflight( + scope: scope, + identity: identity, + operations: [protectedOperation], + ); + + final mismatchedOperation = CloudSyncProtectedWriteOperation( + operationId: operation.operationId, + logicalEntityKeyHash: protectedOperation.logicalEntityKeyHash, + action: operation.action, + protectedLeaseReference: protectedOperation.protectedLeaseReference, + protectedServerRecordIdReference: + protectedOperation.protectedServerRecordIdReference, + serverRecordIdHash: protectedOperation.serverRecordIdHash, + protectedPayloadReference: testProtectedReference('S'), + payloadSha256: testSha256('d'), + ); + expect( + () => prepared.claimForConsumption( + scope, + persistedIdentity: identity, + protectedOperations: [mismatchedOperation], + ), + throwsArgumentError, + ); + + prepared.claimForConsumption( + scope, + persistedIdentity: identity, + protectedOperations: [protectedOperation], + ); + expect( + () => prepared.claimForConsumption( + scope, + persistedIdentity: identity, + protectedOperations: [protectedOperation], + ), + throwsA( + isA().having( + (error) => error.message, + 'message', + 'cloud_sync_prepared_submission_already_consumed', + ), + ), + ); + }); +} diff --git a/test/services/cloud_sync/cloudkit_mutation_surface_contract_test.dart b/test/services/cloud_sync/cloudkit_mutation_surface_contract_test.dart new file mode 100644 index 0000000000..9e431d82be --- /dev/null +++ b/test/services/cloud_sync/cloudkit_mutation_surface_contract_test.dart @@ -0,0 +1,54 @@ +import 'dart:io'; + +import 'package:flutter_test/flutter_test.dart'; + +void main() { + const legacyMutationMethods = { + 'saveChats', + 'deleteChats', + 'saveMessages', + 'deleteMessages', + 'saveAttachments', + 'deleteAttachments', + 'uploadCloudAttachments', + 'uploadGroupPhoto', + 'resetClique', + }; + + test('legacy CloudKit mutation wrappers have one reviewed Dart caller', () { + final unexpected = []; + for (final entity in Directory('lib').listSync(recursive: true)) { + if (entity is! File || !entity.path.endsWith('.dart')) continue; + final normalized = entity.path.replaceAll('\\', '/'); + if (normalized.endsWith('/src/rust/api/api.dart') || + normalized.endsWith('/src/rust/frb_generated.dart') || + normalized.endsWith('/services/rustpush/rustpush_service.dart')) { + continue; + } + final source = entity.readAsStringSync(); + for (final method in legacyMutationMethods) { + if (source.contains('api.$method(')) { + unexpected.add('$normalized:$method'); + } + } + } + expect(unexpected, isEmpty); + }); + + test('reviewed legacy mutators are owner-gated and interlocked', () { + final source = File( + 'lib/services/rustpush/rustpush_service.dart', + ).readAsStringSync(); + + expect(source, contains('CloudKitWriterOwnership.legacyMutationsEnabled')); + expect(source, contains('_runLegacyCloudKitOperation(')); + expect(source, contains('CloudKitOperationKind.legacyReadWrite')); + expect(source, contains('CloudKitWriterMutationGuard(')); + expect(source, contains('owner: CloudKitWriterOwner.legacy')); + expect(source, contains('_runCloudKitDestructiveReset(')); + expect(source, contains('CloudKitOperationKind.destructiveReset')); + expect(source, isNot(contains('OPENBUBBLES_LEGACY_CLOUDKIT_MUTATIONS'))); + expect(source, isNot(contains('CloudKitWriterMutationGuard.forTest'))); + expect(source, isNot(contains('ObjectBoxCloudKitWriterAuthority.forTest'))); + }); +} diff --git a/test/services/cloud_sync/cloudkit_operation_interlock_test.dart b/test/services/cloud_sync/cloudkit_operation_interlock_test.dart new file mode 100644 index 0000000000..aee61a9a8b --- /dev/null +++ b/test/services/cloud_sync/cloudkit_operation_interlock_test.dart @@ -0,0 +1,233 @@ +import 'dart:async'; + +import 'package:bluebubbles/services/rustpush/cloud_sync/cloudkit_operation_interlock.dart'; +import 'package:bluebubbles/services/rustpush/cloud_sync/cloud_sync_models.dart'; +import 'package:bluebubbles/services/rustpush/cloud_sync/cloud_sync_store.dart'; +import 'package:bluebubbles/services/rustpush/cloud_sync/in_memory_cloud_sync_store.dart'; +import 'package:flutter_test/flutter_test.dart'; +import 'package:universal_io/io.dart'; + +void main() { + late Directory temporaryDirectory; + late CloudKitOperationInterlock interlock; + late InMemoryCloudSyncStore fenceStore; + + setUp(() { + temporaryDirectory = Directory.systemTemp.createTempSync( + 'cloudkit-interlock-', + ); + fenceStore = InMemoryCloudSyncStore(); + interlock = CloudKitOperationInterlock( + privateStorageDirectory: temporaryDirectory.path, + fenceStore: fenceStore, + ); + }); + + tearDown(() { + temporaryDirectory.deleteSync(recursive: true); + }); + + test('same-kind nested work reuses the active lease', () async { + final result = await interlock.runExclusive( + kind: CloudKitOperationKind.legacyReadWrite, + action: () => interlock.runExclusive( + kind: CloudKitOperationKind.legacyReadWrite, + action: () async => 'nested-complete', + ), + ); + + expect(result, 'nested-complete'); + }); + + test('different-kind nested work fails closed', () async { + await expectLater( + interlock.runExclusive( + kind: CloudKitOperationKind.v2ShadowRead, + action: () => interlock.runExclusive( + kind: CloudKitOperationKind.legacyReadWrite, + action: () async {}, + ), + ), + throwsA( + isA().having( + (error) => error.safeCode, + 'safeCode', + 'cloudkit_interlock_mode_violation', + ), + ), + ); + }); + + test( + 'destructive reset cannot nest inside another CloudKit operation', + () async { + await expectLater( + interlock.runExclusive( + kind: CloudKitOperationKind.legacyReadWrite, + action: () => interlock.runExclusive( + kind: CloudKitOperationKind.destructiveReset, + action: () async {}, + ), + ), + throwsA( + isA().having( + (error) => error.safeCode, + 'safeCode', + 'cloudkit_interlock_mode_violation', + ), + ), + ); + }, + ); + + test('a concurrent operation on the profile is rejected', () async { + final entered = Completer(); + final release = Completer(); + final first = interlock.runExclusive( + kind: CloudKitOperationKind.v2ShadowRead, + action: () async { + entered.complete(); + await release.future; + }, + ); + await entered.future; + + final secondInterlock = CloudKitOperationInterlock( + privateStorageDirectory: temporaryDirectory.path, + fenceStore: fenceStore, + ); + await expectLater( + secondInterlock.runExclusive( + kind: CloudKitOperationKind.legacyReadWrite, + action: () async {}, + ), + throwsA( + isA().having( + (error) => error.safeCode, + 'safeCode', + 'cloudkit_interlock_busy', + ), + ), + ); + + release.complete(); + await first; + }); + + test( + 'writer transition cannot overlap an in-flight legacy mutation', + () async { + final legacyEntered = Completer(); + final releaseLegacy = Completer(); + var transitionRuns = 0; + final legacyMutation = interlock.runExclusive( + kind: CloudKitOperationKind.legacyReadWrite, + action: () async { + legacyEntered.complete(); + await releaseLegacy.future; + }, + ); + await legacyEntered.future; + + final transitionInterlock = CloudKitOperationInterlock( + privateStorageDirectory: temporaryDirectory.path, + fenceStore: fenceStore, + ); + await expectLater( + transitionInterlock.runExclusive( + kind: CloudKitOperationKind.writerTransition, + action: () async { + transitionRuns += 1; + }, + ), + throwsA( + isA().having( + (error) => error.safeCode, + 'safeCode', + 'cloudkit_interlock_busy', + ), + ), + ); + expect(transitionRuns, 0); + + releaseLegacy.complete(); + await legacyMutation; + + await transitionInterlock.runExclusive( + kind: CloudKitOperationKind.writerTransition, + action: () async { + transitionRuns += 1; + }, + ); + expect(transitionRuns, 1); + }, + ); + + test('an action failure releases the lease', () async { + await expectLater( + interlock.runExclusive( + kind: CloudKitOperationKind.legacyReadWrite, + action: () async => throw StateError('expected-test-failure'), + ), + throwsStateError, + ); + + expect( + await interlock.runExclusive( + kind: CloudKitOperationKind.v2ShadowRead, + action: () async => 7, + ), + 7, + ); + }); + + test('a lost database fence fails the operation closed', () async { + final rejectingStore = _RejectingRenewalStore(); + final fencedInterlock = CloudKitOperationInterlock( + privateStorageDirectory: temporaryDirectory.path, + fenceStore: rejectingStore, + leaseDuration: const Duration(milliseconds: 100), + heartbeatInterval: const Duration(milliseconds: 5), + ); + + await expectLater( + fencedInterlock.runExclusive( + kind: CloudKitOperationKind.v2ShadowRead, + action: () async { + await Future.delayed(const Duration(milliseconds: 30)); + CloudKitOperationInterlock.throwIfActiveFenceLost(); + }, + ), + throwsA( + isA().having( + (error) => error.safeCode, + 'safeCode', + 'cloudkit_interlock_fence_lost', + ), + ), + ); + }); + + test('constructor rejects a missing storage directory', () { + final missing = + '${temporaryDirectory.path}${Platform.pathSeparator}missing'; + + expect( + () => CloudKitOperationInterlock( + privateStorageDirectory: missing, + fenceStore: fenceStore, + ), + throwsArgumentError, + ); + }); +} + +final class _RejectingRenewalStore extends InMemoryCloudSyncStore { + @override + Future renewCoordinatorLease( + CloudSyncScope scope, { + required CloudCoordinatorLeaseFence leaseFence, + required DateTime now, + required Duration leaseDuration, + }) async => false; +} diff --git a/test/services/cloud_sync/cloudkit_v2_writer_provisioner_test.dart b/test/services/cloud_sync/cloudkit_v2_writer_provisioner_test.dart new file mode 100644 index 0000000000..a59d4224aa --- /dev/null +++ b/test/services/cloud_sync/cloudkit_v2_writer_provisioner_test.dart @@ -0,0 +1,408 @@ +import 'dart:convert'; +import 'dart:io'; + +import 'package:bluebubbles/database/models.dart'; +import 'package:bluebubbles/services/rustpush/cloud_sync/cloud_sync_manual_shadow_sampler.dart'; +import 'package:bluebubbles/services/rustpush/cloud_sync/cloud_sync_models.dart'; +import 'package:bluebubbles/services/rustpush/cloud_sync/cloud_sync_protector.dart'; +import 'package:bluebubbles/services/rustpush/cloud_sync/cloudkit_operation_interlock.dart'; +import 'package:bluebubbles/services/rustpush/cloud_sync/cloudkit_writer_authority.dart'; +import 'package:bluebubbles/services/rustpush/cloud_sync/cloudkit_writer_ownership.dart'; +import 'package:bluebubbles/services/rustpush/cloud_sync/objectbox_cloud_sync_store.dart'; +import 'package:crypto/crypto.dart'; +import 'package:flutter_test/flutter_test.dart'; + +import 'cloud_sync_test_helpers.dart'; + +void main() { + late Directory objectBoxDirectory; + late Directory privateStorageDirectory; + late Store objectBox; + late ObjectBoxCloudSyncStore cloudSyncStore; + late ObjectBoxCloudKitWriterAuthority authority; + late CloudKitOperationInterlock interlock; + late CloudKitWriterScope writerScope; + late CloudSyncScope syncScope; + late CloudSyncNativeAuthSnapshot expectedAuth; + late CloudSyncNativeAuthSnapshot replacementAuth; + late CloudKitV2WriterProvisioner provisioner; + late Object expectedClient; + late Object replacementClient; + + CloudKitWriterProvisioningMeasurements? suppliedMeasurements; + var probeThrows = false; + var quarantineThrows = false; + var replaceAuthAfterFirstRead = false; + var authReadCount = 0; + + final clock = DateTime.utc(2026, 8, 22, 12); + const account = testAccountFingerprintA; + const replacementAccount = testAccountFingerprintB; + + setUp(() async { + objectBoxDirectory = await Directory.systemTemp.createTemp( + 'openbubbles-cloudkit-v2-provisioner-objectbox-', + ); + privateStorageDirectory = await Directory.systemTemp.createTemp( + 'openbubbles-cloudkit-v2-provisioner-private-', + ); + objectBox = await openStore(directory: objectBoxDirectory.path); + cloudSyncStore = ObjectBoxCloudSyncStore( + store: objectBox, + protector: TestCloudSyncProtector(), + clock: () => clock, + ); + authority = ObjectBoxCloudKitWriterAuthority.forTest( + store: objectBox, + buildDecision: CloudKitWriterOwnership.resolve('v2'), + ); + interlock = CloudKitOperationInterlock( + privateStorageDirectory: privateStorageDirectory.path, + fenceStore: cloudSyncStore, + leaseDuration: const Duration(seconds: 5), + heartbeatInterval: const Duration(seconds: 1), + ); + writerScope = CloudKitWriterScope(accountFingerprint: account); + syncScope = CloudSyncScope( + accountFingerprint: account, + container: 'messages-container', + database: 'private', + zone: 'message-zone', + streamKind: CloudSyncStreamKind.messages, + ); + + expectedClient = Object(); + replacementClient = Object(); + expectedAuth = CloudSyncNativeAuthSnapshot.fromNative( + nativeSessionId: 'session-a', + accountFingerprint: account, + protectedStoreIdentity: 'obcs2.store.${List.filled(43, 'A').join()}', + cloudMessagesClient: expectedClient, + ); + replacementAuth = CloudSyncNativeAuthSnapshot.fromNative( + nativeSessionId: 'session-b', + accountFingerprint: replacementAccount, + protectedStoreIdentity: 'obcs2.store.${List.filled(43, 'B').join()}', + cloudMessagesClient: replacementClient, + ); + + suppliedMeasurements = null; + probeThrows = false; + quarantineThrows = false; + replaceAuthAfterFirstRead = false; + authReadCount = 0; + + provisioner = CloudKitV2WriterProvisioner( + authority: authority, + interlock: interlock, + readAuthSnapshot: () async { + authReadCount++; + if (replaceAuthAfterFirstRead && authReadCount >= 2) { + return replacementAuth; + } + return expectedAuth; + }, + quarantineLegacyDeletionQueues: () { + if (quarantineThrows) { + throw StateError('injected quarantine failure'); + } + }, + readMeasurements: (scope) async { + if (probeThrows) { + throw StateError('injected probe failure'); + } + final supplied = suppliedMeasurements; + if (supplied != null) return supplied; + return CloudKitWriterProvisioningMeasurements( + objectBoxReady: true, + legacySyncEnabled: false, + legacySyncActive: false, + backgroundSyncActive: false, + coordinatorLeaseActive: false, + pendingLegacyDeletionIntents: 0, + legacyPreferenceQueueEntries: 0, + unsyncedLegacyMessages: 0, + unsyncedLegacyChats: 0, + existingV2OutboxOperations: (await cloudSyncStore.readOutboxEntries( + syncScope, + )).length, + ); + }, + clock: () => clock, + ); + }); + + tearDown(() async { + if (!objectBox.isClosed()) objectBox.close(); + if (objectBoxDirectory.existsSync()) { + await objectBoxDirectory.delete(recursive: true); + } + if (privateStorageDirectory.existsSync()) { + await privateStorageDirectory.delete(recursive: true); + } + }); + + test('fresh none to v2 persists epoch, readback, and permit', () async { + final result = await provisioner.ensureV2Owned(expectedAuth: expectedAuth); + + expect( + result.disposition, + CloudKitV2WriterProvisioningDisposition.provisioned, + ); + expect(result.snapshot.owner, CloudKitWriterOwner.v2); + expect(result.snapshot.state, CloudKitWriterAuthorityState.stable); + expect(result.snapshot.targetOwner, CloudKitWriterOwner.none); + expect(result.snapshot.epoch, 2); + expect(result.permit.owner, CloudKitWriterOwner.v2); + expect(result.permit.epoch, 2); + + final readback = authority.read(writerScope); + expect(readback?.owner, CloudKitWriterOwner.v2); + expect(readback?.state, CloudKitWriterAuthorityState.stable); + expect(readback?.epoch, 2); + expect(authReadCount, 4); + }); + + test( + 'already-v2 is idempotent and returns the same epoch-bound permit', + () async { + final first = await provisioner.ensureV2Owned(expectedAuth: expectedAuth); + final second = await provisioner.ensureV2Owned( + expectedAuth: expectedAuth, + ); + + expect( + second.disposition, + CloudKitV2WriterProvisioningDisposition.alreadyOwned, + ); + expect(second.snapshot.epoch, first.snapshot.epoch); + expect(second.permit.epoch, first.permit.epoch); + expect(second.snapshot.owner, CloudKitWriterOwner.v2); + }, + ); + + final failClosedCases = + < + ({ + String name, + String safeCode, + CloudKitWriterProvisioningMeasurements measurements, + }) + >[ + ( + name: 'legacy sync enabled', + safeCode: 'cloudkit_writer_transition_precondition_failed', + measurements: _measurements(legacySyncEnabled: true), + ), + ( + name: 'background sync active', + safeCode: 'cloudkit_writer_transition_precondition_failed', + measurements: _measurements(backgroundSyncActive: true), + ), + ( + name: 'ObjectBox is unavailable', + safeCode: 'cloudkit_writer_transition_precondition_failed', + measurements: _measurements(objectBoxReady: false), + ), + ( + name: 'another coordinator is active', + safeCode: 'cloudkit_writer_transition_precondition_failed', + measurements: _measurements(coordinatorLeaseActive: true), + ), + ( + name: 'pending deletion count', + safeCode: 'cloudkit_writer_transition_precondition_failed', + measurements: _measurements(pendingLegacyDeletionIntents: 1), + ), + ( + name: 'legacy preference queue entries', + safeCode: 'cloudkit_writer_transition_precondition_failed', + measurements: _measurements(legacyPreferenceQueueEntries: 1), + ), + ]; + + for (final failureCase in failClosedCases) { + test('fails closed when ${failureCase.name}', () async { + suppliedMeasurements = failureCase.measurements; + + await _expectFailure( + provisioner.ensureV2Owned(expectedAuth: expectedAuth), + failureCase.safeCode, + ); + expect(authority.read(writerScope)?.owner, CloudKitWriterOwner.none); + }); + } + + test( + 'unsynced markers stay diagnostic and inert under the V2-only build', + () async { + suppliedMeasurements = _measurements( + unsyncedLegacyMessages: 7, + unsyncedLegacyChats: 3, + ); + + final result = await provisioner.ensureV2Owned( + expectedAuth: expectedAuth, + ); + + expect( + result.disposition, + CloudKitV2WriterProvisioningDisposition.provisioned, + ); + expect(result.snapshot.owner, CloudKitWriterOwner.v2); + }, + ); + + test( + 'fails closed when an existing V2 outbox operation is present', + () async { + await cloudSyncStore.enqueueOutbox(testOutboxOperation(syncScope, 1)); + + await _expectFailure( + provisioner.ensureV2Owned(expectedAuth: expectedAuth), + 'cloudkit_writer_transition_precondition_failed', + ); + expect((await cloudSyncStore.readOutboxEntries(syncScope)), hasLength(1)); + expect(authority.read(writerScope)?.owner, CloudKitWriterOwner.none); + }, + ); + + test('fails closed on an invalid negative preflight count', () async { + suppliedMeasurements = _measurements(pendingLegacyDeletionIntents: -1); + + await _expectFailure( + provisioner.ensureV2Owned(expectedAuth: expectedAuth), + 'cloudkit_writer_provisioning_measurements_invalid', + ); + expect(authority.read(writerScope)?.owner, CloudKitWriterOwner.none); + }); + + test('fails closed when the preflight probe throws', () async { + probeThrows = true; + + await _expectFailure( + provisioner.ensureV2Owned(expectedAuth: expectedAuth), + 'cloudkit_writer_provisioning_probe_failed', + ); + expect(authority.read(writerScope)?.owner, CloudKitWriterOwner.none); + }); + + test('fails closed when legacy queue quarantine throws', () async { + quarantineThrows = true; + + await _expectFailure( + provisioner.ensureV2Owned(expectedAuth: expectedAuth), + 'cloudkit_writer_legacy_queue_quarantine_failed', + ); + expect(authority.read(writerScope)?.owner, CloudKitWriterOwner.none); + }); + + test('fails closed when the account or native client is replaced', () async { + replaceAuthAfterFirstRead = true; + + await _expectFailure( + provisioner.ensureV2Owned(expectedAuth: expectedAuth), + 'cloudkit_writer_identity_changed', + ); + expect(authReadCount, 2); + expect(authority.read(writerScope)?.owner, CloudKitWriterOwner.none); + }); + + test('requires manual recovery for a durable non-stable authority', () async { + await interlock.runExclusive( + kind: CloudKitOperationKind.writerTransition, + action: () async { + authority.initializeDisabled(writerScope, now: clock); + final entity = objectBox + .box() + .getAll() + .single; + entity + ..owner = 1 + ..state = 1 + ..targetOwner = 2 + ..transitionIdHash = testSha256('a') + ..epoch = 2; + objectBox.box().put(entity); + }, + ); + + await _expectFailure( + provisioner.ensureV2Owned(expectedAuth: expectedAuth), + 'cloudkit_writer_authority_requires_manual_recovery', + ); + expect( + authority.read(writerScope)?.state, + CloudKitWriterAuthorityState.migrationPrepared, + ); + }); +} + +CloudKitWriterProvisioningMeasurements _measurements({ + bool objectBoxReady = true, + bool legacySyncEnabled = false, + bool legacySyncActive = false, + bool backgroundSyncActive = false, + bool coordinatorLeaseActive = false, + int pendingLegacyDeletionIntents = 0, + int legacyPreferenceQueueEntries = 0, + int unsyncedLegacyMessages = 0, + int unsyncedLegacyChats = 0, + int existingV2OutboxOperations = 0, +}) => CloudKitWriterProvisioningMeasurements( + objectBoxReady: objectBoxReady, + legacySyncEnabled: legacySyncEnabled, + legacySyncActive: legacySyncActive, + backgroundSyncActive: backgroundSyncActive, + coordinatorLeaseActive: coordinatorLeaseActive, + pendingLegacyDeletionIntents: pendingLegacyDeletionIntents, + legacyPreferenceQueueEntries: legacyPreferenceQueueEntries, + unsyncedLegacyMessages: unsyncedLegacyMessages, + unsyncedLegacyChats: unsyncedLegacyChats, + existingV2OutboxOperations: existingV2OutboxOperations, +); + +Future _expectFailure(Future operation, String safeCode) async { + await expectLater( + operation, + throwsA( + isA().having( + (failure) => failure.safeCode, + 'safeCode', + safeCode, + ), + ), + ); +} + +final class TestCloudSyncProtector implements CloudSyncProtector { + @override + Future fingerprintAccount(String rawAccountIdentifier) async => sha256 + .convert(utf8.encode('test-hmac\u001f$rawAccountIdentifier')) + .toString(); + + @override + Future protect({ + required CloudSyncScope scope, + required CloudSyncProtectedValueKind kind, + required String plaintext, + }) async { + final bound = '${scope.storageKey}\u001f${kind.name}\u001f$plaintext'; + return 'test-v1:${base64UrlEncode(utf8.encode(bound))}'; + } + + @override + Future unprotect({ + required CloudSyncScope scope, + required CloudSyncProtectedValueKind kind, + required String ciphertext, + }) async { + if (!ciphertext.startsWith('test-v1:')) throw const FormatException(); + final decoded = utf8.decode( + base64Url.decode(ciphertext.substring('test-v1:'.length)), + ); + final prefix = '${scope.storageKey}\u001f${kind.name}\u001f'; + if (!decoded.startsWith(prefix)) throw const FormatException(); + return decoded.substring(prefix.length); + } +} diff --git a/test/services/cloud_sync/cloudkit_writer_authority_test.dart b/test/services/cloud_sync/cloudkit_writer_authority_test.dart new file mode 100644 index 0000000000..168d93ebb9 --- /dev/null +++ b/test/services/cloud_sync/cloudkit_writer_authority_test.dart @@ -0,0 +1,666 @@ +import 'dart:io'; + +import 'package:bluebubbles/database/models.dart'; +import 'package:bluebubbles/services/rustpush/cloud_sync/cloudkit_writer_authority.dart'; +import 'package:bluebubbles/services/rustpush/cloud_sync/cloudkit_writer_ownership.dart'; +import 'package:bluebubbles/services/rustpush/cloud_sync/cloudkit_operation_interlock.dart'; +import 'package:bluebubbles/services/rustpush/cloud_sync/cloud_sync_models.dart'; +import 'package:flutter_test/flutter_test.dart'; + +void main() { + late Directory directory; + late Store store; + + setUp(() async { + directory = await Directory.systemTemp.createTemp( + 'openbubbles-cloudkit-writer-authority-', + ); + store = await openStore(directory: directory.path); + }); + + tearDown(() async { + if (!store.isClosed()) store.close(); + if (directory.existsSync()) { + await directory.delete(recursive: true); + } + }); + + Future reopen() async { + store.close(); + store = await openStore(directory: directory.path); + } + + ObjectBoxCloudKitWriterAuthority authority(CloudKitWriterOwner owner) { + return ObjectBoxCloudKitWriterAuthority.forTest( + store: store, + buildDecision: CloudKitWriterOwnershipDecision( + owner: owner, + configurationValid: true, + ), + ); + } + + CloudKitWriterAuthoritySnapshot initialize({CloudKitWriterScope? scope}) { + scope ??= _scopeA; + return authority( + CloudKitWriterOwner.none, + ).initializeDisabled(scope, now: _time(0)); + } + + CloudKitWriterAuthoritySnapshot provision({ + CloudKitWriterScope? scope, + CloudKitWriterOwner owner = CloudKitWriterOwner.legacy, + }) { + scope ??= _scopeA; + final initial = initialize(scope: scope); + return authority(owner).provisionInitialOwner( + scope, + owner: owner, + expectedEpoch: initial.epoch, + evidence: _completeEvidence, + now: _time(1), + ); + } + + test( + 'disabled authority persists across reopen and issues no permit', + () async { + final initial = initialize(); + expect(initial.owner, CloudKitWriterOwner.none); + expect(initial.state, CloudKitWriterAuthorityState.stable); + expect(initial.epoch, 1); + + await reopen(); + final reopened = authority(CloudKitWriterOwner.none).read(_scopeA); + expect(reopened?.owner, CloudKitWriterOwner.none); + expect(reopened?.epoch, initial.epoch); + expect( + () => authority( + CloudKitWriterOwner.none, + ).issuePermit(_scopeA, expectedOwner: CloudKitWriterOwner.none), + throwsA(_failure('cloudkit_writer_build_owner_mismatch')), + ); + }, + ); + + test( + 'initial provisioning requires matching build and complete evidence', + () { + final initial = initialize(); + expect( + () => authority(CloudKitWriterOwner.v2).provisionInitialOwner( + _scopeA, + owner: CloudKitWriterOwner.legacy, + expectedEpoch: initial.epoch, + evidence: _completeEvidence, + now: _time(1), + ), + throwsA(_failure('cloudkit_writer_build_owner_mismatch')), + ); + expect( + () => authority(CloudKitWriterOwner.legacy).provisionInitialOwner( + _scopeA, + owner: CloudKitWriterOwner.legacy, + expectedEpoch: initial.epoch, + evidence: const CloudKitWriterTransitionEvidence.forTest( + operationsQuiesced: false, + activeIdentityRevalidated: true, + legacyMutationQueues: LegacyMutationQueueDisposition.quarantined, + ), + now: _time(1), + ), + throwsA(_failure('cloudkit_writer_transition_evidence_incomplete')), + ); + expect( + () => authority(CloudKitWriterOwner.legacy).provisionInitialOwner( + _scopeA, + owner: CloudKitWriterOwner.legacy, + expectedEpoch: initial.epoch, + evidence: const CloudKitWriterTransitionEvidence.forTest( + operationsQuiesced: true, + activeIdentityRevalidated: true, + legacyMutationQueues: LegacyMutationQueueDisposition.quarantined, + ), + now: _time(1), + ), + throwsA(_failure('cloudkit_writer_transition_evidence_incomplete')), + ); + + final snapshot = authority(CloudKitWriterOwner.legacy) + .provisionInitialOwner( + _scopeA, + owner: CloudKitWriterOwner.legacy, + expectedEpoch: initial.epoch, + evidence: _completeEvidence, + now: _time(2), + ); + expect(snapshot.owner, CloudKitWriterOwner.legacy); + expect(snapshot.epoch, initial.epoch + 1); + }, + ); + + test('production authority transitions require the shared interlock', () { + final production = ObjectBoxCloudKitWriterAuthority(store: store); + final initial = production.initializeDisabled(_scopeA, now: _time(0)); + expect( + () => production.provisionInitialOwner( + _scopeA, + owner: CloudKitWriterOwner.legacy, + expectedEpoch: initial.epoch, + evidence: _completeEvidence, + now: _time(1), + ), + throwsA( + isA().having( + (error) => error.safeCode, + 'safeCode', + 'cloudkit_interlock_required', + ), + ), + ); + }); + + test('stable owner issues only matching epoch-bound permit', () { + final snapshot = provision(); + final legacy = authority(CloudKitWriterOwner.legacy); + final permit = legacy.issuePermit( + _scopeA, + expectedOwner: CloudKitWriterOwner.legacy, + ); + expect(permit.owner, CloudKitWriterOwner.legacy); + expect(permit.epoch, snapshot.epoch); + expect(() => legacy.verifyPermit(permit), returnsNormally); + expect( + () => authority( + CloudKitWriterOwner.v2, + ).issuePermit(_scopeA, expectedOwner: CloudKitWriterOwner.v2), + throwsA(_failure('cloudkit_writer_owner_mismatch')), + ); + }); + + test( + 'ambiguous remote mutation durably revokes every writer permit', + () async { + provision(); + final legacy = authority(CloudKitWriterOwner.legacy); + final permit = legacy.issuePermit( + _scopeA, + expectedOwner: CloudKitWriterOwner.legacy, + ); + + legacy.markMutationUnknown(permit, now: _time(2)); + expect( + () => legacy.verifyPermit(permit), + throwsA(_failure('cloudkit_writer_authority_not_stable')), + ); + expect( + store.box().getAll().single.state, + 4, + ); + + await reopen(); + final snapshot = authority(CloudKitWriterOwner.legacy).read(_scopeA)!; + expect(snapshot.state, CloudKitWriterAuthorityState.mutationUnknown); + expect( + () => authority( + CloudKitWriterOwner.legacy, + ).issuePermit(_scopeA, expectedOwner: CloudKitWriterOwner.legacy), + throwsA(_failure('cloudkit_writer_authority_not_stable')), + ); + }, + ); + + test('migration prepare revokes old permit and survives reopen', () async { + final provisioned = provision(); + final legacy = authority(CloudKitWriterOwner.legacy); + final oldPermit = legacy.issuePermit( + _scopeA, + expectedOwner: CloudKitWriterOwner.legacy, + ); + final prepared = authority(CloudKitWriterOwner.v2).prepareMigration( + _scopeA, + from: CloudKitWriterOwner.legacy, + to: CloudKitWriterOwner.v2, + expectedEpoch: provisioned.epoch, + transitionIdHash: _migrationId, + evidence: _completeEvidence, + now: _time(2), + ); + expect(prepared.state, CloudKitWriterAuthorityState.migrationPrepared); + expect(prepared.targetOwner, CloudKitWriterOwner.v2); + expect(prepared.epoch, provisioned.epoch + 1); + expect( + () => legacy.verifyPermit(oldPermit), + throwsA(_failure('cloudkit_writer_authority_not_stable')), + ); + + await reopen(); + final v2 = authority(CloudKitWriterOwner.v2); + final reopened = v2.read(_scopeA)!; + expect(reopened.state, CloudKitWriterAuthorityState.migrationPrepared); + expect(reopened.targetOwner, CloudKitWriterOwner.v2); + expect( + () => v2.issuePermit(_scopeA, expectedOwner: CloudKitWriterOwner.v2), + throwsA(_failure('cloudkit_writer_authority_not_stable')), + ); + }); + + test('migration commit switches owner and fences preparation epoch', () { + final provisioned = provision(); + final v2 = authority(CloudKitWriterOwner.v2); + final prepared = v2.prepareMigration( + _scopeA, + from: CloudKitWriterOwner.legacy, + to: CloudKitWriterOwner.v2, + expectedEpoch: provisioned.epoch, + transitionIdHash: _migrationId, + evidence: _completeEvidence, + now: _time(2), + ); + expect( + () => v2.commitMigration( + _scopeA, + targetOwner: CloudKitWriterOwner.v2, + expectedEpoch: provisioned.epoch, + transitionIdHash: _migrationId, + now: _time(3), + ), + throwsA(_failure('cloudkit_writer_migration_commit_precondition_failed')), + ); + + final committed = v2.commitMigration( + _scopeA, + targetOwner: CloudKitWriterOwner.v2, + expectedEpoch: prepared.epoch, + transitionIdHash: _migrationId, + now: _time(3), + ); + expect(committed.owner, CloudKitWriterOwner.v2); + expect(committed.state, CloudKitWriterAuthorityState.stable); + expect(committed.targetOwner, CloudKitWriterOwner.none); + expect(committed.epoch, prepared.epoch + 1); + expect( + () => v2.issuePermit(_scopeA, expectedOwner: CloudKitWriterOwner.v2), + returnsNormally, + ); + }); + + test('migration abort restores old owner with a new epoch', () { + final provisioned = provision(); + final v2 = authority(CloudKitWriterOwner.v2); + final prepared = v2.prepareMigration( + _scopeA, + from: CloudKitWriterOwner.legacy, + to: CloudKitWriterOwner.v2, + expectedEpoch: provisioned.epoch, + transitionIdHash: _migrationId, + evidence: _completeEvidence, + now: _time(2), + ); + final aborted = v2.abortMigration( + _scopeA, + targetOwner: CloudKitWriterOwner.v2, + expectedEpoch: prepared.epoch, + transitionIdHash: _migrationId, + now: _time(3), + ); + expect(aborted.owner, CloudKitWriterOwner.legacy); + expect(aborted.state, CloudKitWriterAuthorityState.stable); + expect(aborted.targetOwner, CloudKitWriterOwner.none); + expect(aborted.epoch, prepared.epoch + 1); + expect( + () => v2.issuePermit(_scopeA, expectedOwner: CloudKitWriterOwner.v2), + throwsA(_failure('cloudkit_writer_owner_mismatch')), + ); + }); + + test('reset preparation revokes permit and successful finish re-enables', () { + provision(owner: CloudKitWriterOwner.v2); + final v2 = authority(CloudKitWriterOwner.v2); + final permit = v2.issuePermit( + _scopeA, + expectedOwner: CloudKitWriterOwner.v2, + ); + final fence = v2.prepareReset( + permit, + request: _resetRequest(), + now: _time(2), + ); + expect( + () => v2.verifyPermit(permit), + throwsA(_failure('cloudkit_writer_authority_not_stable')), + ); + final completed = v2.completeReset( + fence, + proof: _completionProof(), + now: _time(3), + ); + expect(completed.state, CloudKitWriterAuthorityState.stable); + expect(completed.owner, CloudKitWriterOwner.v2); + expect(completed.epoch, fence.epoch + 1); + expect( + () => v2.issuePermit(_scopeA, expectedOwner: CloudKitWriterOwner.v2), + returnsNormally, + ); + }); + + test( + 'unknown reset persists fail-closed until proven reconciliation', + () async { + provision(owner: CloudKitWriterOwner.v2); + final v2 = authority(CloudKitWriterOwner.v2); + final fence = v2.prepareReset( + v2.issuePermit(_scopeA, expectedOwner: CloudKitWriterOwner.v2), + request: _resetRequest(), + now: _time(2), + ); + final unknown = v2.markResetUnknown(fence, now: _time(3)); + expect(unknown.state, CloudKitWriterAuthorityState.resetUnknown); + + await reopen(); + final reopened = authority(CloudKitWriterOwner.v2); + final recoveredFence = reopened.recoverResetFence( + _scopeA, + syncScope: _resetScopeA, + )!; + expect(recoveredFence.epoch, fence.epoch); + expect(recoveredFence.transitionIdHash, _resetId); + expect( + () => reopened.issuePermit( + _scopeA, + expectedOwner: CloudKitWriterOwner.v2, + ), + throwsA(_failure('cloudkit_writer_authority_not_stable')), + ); + expect( + () => reopened.reconcileResetUnknown( + recoveredFence, + proof: _completionProof(), + now: _time(4), + ), + returnsNormally, + ); + expect( + reopened.read(_scopeA)?.state, + CloudKitWriterAuthorityState.stable, + ); + expect( + () => reopened.reconcileResetUnknown( + recoveredFence, + proof: _completionProof(), + now: _time(5), + ), + throwsA(_failure('cloudkit_writer_reset_finish_precondition_failed')), + ); + }, + ); + + test('reset completion rejects a proof from another scope or generation', () { + provision(owner: CloudKitWriterOwner.v2); + final v2 = authority(CloudKitWriterOwner.v2); + final fence = v2.prepareReset( + v2.issuePermit(_scopeA, expectedOwner: CloudKitWriterOwner.v2), + request: _resetRequest(), + now: _time(2), + ); + expect( + () => v2.completeReset( + fence, + proof: CloudSyncResetCompletionProof( + scope: _resetScopeA, + transitionIdHash: _resetId, + activeIdentityFingerprint: _scopeA.accountFingerprint, + previousGeneration: 2, + generation: 3, + protectedRemoteStateProofReference: _resetProofReference, + ), + now: _time(3), + ), + throwsA(_failure('cloudkit_writer_reset_completion_proof_mismatch')), + ); + }); + + test('reset completion rejects an unrelated protected proof reference', () { + provision(owner: CloudKitWriterOwner.v2); + final v2 = authority(CloudKitWriterOwner.v2); + final fence = v2.prepareReset( + v2.issuePermit(_scopeA, expectedOwner: CloudKitWriterOwner.v2), + request: _resetRequest(), + now: _time(2), + ); + expect( + () => v2.completeReset( + fence, + proof: CloudSyncResetCompletionProof( + scope: _resetScopeA, + transitionIdHash: _resetId, + activeIdentityFingerprint: _scopeA.accountFingerprint, + previousGeneration: 1, + generation: 2, + protectedRemoteStateProofReference: + 'obcs2.ref.BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB', + ), + now: _time(3), + ), + throwsA(_failure('cloudkit_writer_reset_completion_proof_mismatch')), + ); + }); + + test('authorities are isolated by complete account scope', () { + provision(scope: _scopeA, owner: CloudKitWriterOwner.v2); + initialize(scope: _scopeB); + final v2 = authority(CloudKitWriterOwner.v2); + expect( + () => v2.issuePermit(_scopeA, expectedOwner: CloudKitWriterOwner.v2), + returnsNormally, + ); + expect( + () => v2.issuePermit(_scopeB, expectedOwner: CloudKitWriterOwner.v2), + throwsA(_failure('cloudkit_writer_owner_mismatch')), + ); + }); + + test('active account coordinator blocks every ownership transition', () { + final provisioned = provision(); + store.box().put( + CloudSyncLeaseEntity( + leaseKey: 'active-writer-transition-test', + scopeKey: 'scope2:active-account-zone', + accountFingerprint: _scopeA.accountFingerprint, + ownerIdHash: 'owner-digest', + generation: 1, + acquiredAtMs: DateTime.now().millisecondsSinceEpoch, + expiresAtMs: DateTime.now() + .add(const Duration(minutes: 5)) + .millisecondsSinceEpoch, + ), + ); + + expect( + () => authority(CloudKitWriterOwner.v2).prepareMigration( + _scopeA, + from: CloudKitWriterOwner.legacy, + to: CloudKitWriterOwner.v2, + expectedEpoch: provisioned.epoch, + transitionIdHash: _migrationId, + evidence: _completeEvidence, + now: _time(2), + ), + throwsA(_failure('cloudkit_writer_transition_coordinator_active')), + ); + expect( + authority(CloudKitWriterOwner.legacy).read(_scopeA)?.epoch, + provisioned.epoch, + ); + }); + + test('malformed epoch is rejected before any mutator changes the row', () { + initialize(); + final box = store.box(); + final entity = box.getAll().single..epoch = 0; + box.put(entity); + + expect( + () => authority(CloudKitWriterOwner.legacy).provisionInitialOwner( + _scopeA, + owner: CloudKitWriterOwner.legacy, + expectedEpoch: 0, + evidence: _completeEvidence, + now: _time(1), + ), + throwsA(_failure('cloudkit_writer_authority_epoch_invalid')), + ); + final unchanged = box.get(entity.id)!; + expect(unchanged.epoch, 0); + expect(unchanged.owner, 0); + expect(unchanged.state, 0); + }); + + test('persisted owner and state codes are explicit and transition-bound', () { + final provisioned = provision(); + var entity = store.box().getAll().single; + expect(entity.owner, 1); + expect(entity.state, 0); + expect(entity.targetOwner, 0); + + final v2 = authority(CloudKitWriterOwner.v2); + final prepared = v2.prepareMigration( + _scopeA, + from: CloudKitWriterOwner.legacy, + to: CloudKitWriterOwner.v2, + expectedEpoch: provisioned.epoch, + transitionIdHash: _migrationId, + evidence: _completeEvidence, + now: _time(2), + ); + entity = store.box().get(entity.id)!; + expect(entity.owner, 1); + expect(entity.state, 1); + expect(entity.targetOwner, 2); + expect(entity.transitionIdHash, _migrationId); + + expect( + () => authority(CloudKitWriterOwner.legacy).abortMigration( + _scopeA, + targetOwner: CloudKitWriterOwner.v2, + expectedEpoch: prepared.epoch, + transitionIdHash: _migrationId, + now: _time(3), + ), + throwsA(_failure('cloudkit_writer_build_owner_mismatch')), + ); + expect( + v2.read(_scopeA)?.state, + CloudKitWriterAuthorityState.migrationPrepared, + ); + }); + + test('malformed durable state and scope collisions fail closed', () { + initialize(); + final box = store.box(); + final entity = box.getAll().single; + entity.state = 999; + box.put(entity); + expect( + () => authority(CloudKitWriterOwner.v2).read(_scopeA), + throwsA(_failure('cloudkit_writer_authority_state_invalid')), + ); + + entity + ..state = 0 + ..accountFingerprint = _scopeB.accountFingerprint; + box.put(entity); + expect( + () => authority(CloudKitWriterOwner.v2).read(_scopeA), + throwsA(_failure('cloudkit_writer_authority_scope_collision')), + ); + }); + + test('diagnostics never disclose account scope', () { + final snapshot = provision(owner: CloudKitWriterOwner.v2); + final permit = authority( + CloudKitWriterOwner.v2, + ).issuePermit(_scopeA, expectedOwner: CloudKitWriterOwner.v2); + for (final value in [ + _scopeA, + snapshot, + permit, + _completeEvidence, + ]) { + expect(value.toString(), isNot(contains(_scopeA.accountFingerprint))); + expect(value.toString(), isNot(contains(_scopeA.container))); + } + const failure = CloudKitWriterAuthorityFailure('safe_code'); + expect(failure.toString(), 'CloudKitWriterAuthorityFailure(safe_code)'); + }); + + test('scope validation rejects raw or malformed account identifiers', () { + for (final fingerprint in [ + '123456789', + 'person@example.com', + '${_scopeA.accountFingerprint}x', + ]) { + expect( + () => CloudKitWriterScope(accountFingerprint: fingerprint), + throwsArgumentError, + ); + } + expect( + () => CloudKitWriterScope( + accountFingerprint: _scopeA.accountFingerprint, + database: 'public', + ), + throwsArgumentError, + ); + }); +} + +Matcher _failure(String safeCode) => isA() + .having((value) => value.safeCode, 'safeCode', safeCode); + +DateTime _time(int seconds) => DateTime.utc(2026, 8, 22, 12, 0, seconds); + +const _completeEvidence = CloudKitWriterTransitionEvidence.forTest( + operationsQuiesced: true, + activeIdentityRevalidated: true, + legacyMutationQueues: LegacyMutationQueueDisposition.empty, +); +const _migrationId = + '1111111111111111111111111111111111111111111111111111111111111111'; +const _resetId = + '2222222222222222222222222222222222222222222222222222222222222222'; + +final _scopeA = CloudKitWriterScope( + accountFingerprint: 'AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA', +); +final _scopeB = CloudKitWriterScope( + accountFingerprint: 'BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB', +); + +final _resetScopeA = CloudSyncScope( + accountFingerprint: _scopeA.accountFingerprint, + container: _scopeA.container, + database: _scopeA.database, + zone: 'message-zone', +); +const _resetProofReference = + 'obcs2.ref.AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA'; + +CloudSyncResetRebootstrapRequest _resetRequest({int generation = 1}) => + CloudSyncResetRebootstrapRequest( + scope: _resetScopeA, + transitionIdHash: _resetId, + activeIdentityFingerprint: _scopeA.accountFingerprint, + expectedGeneration: generation, + protectedRemoteStateProofReference: _resetProofReference, + ); + +CloudSyncResetCompletionProof _completionProof({int generation = 2}) => + CloudSyncResetCompletionProof( + scope: _resetScopeA, + transitionIdHash: _resetId, + activeIdentityFingerprint: _scopeA.accountFingerprint, + previousGeneration: generation - 1, + generation: generation, + protectedRemoteStateProofReference: _resetProofReference, + ); diff --git a/test/services/cloud_sync/cloudkit_writer_mutation_guard_test.dart b/test/services/cloud_sync/cloudkit_writer_mutation_guard_test.dart new file mode 100644 index 0000000000..88ad886b2f --- /dev/null +++ b/test/services/cloud_sync/cloudkit_writer_mutation_guard_test.dart @@ -0,0 +1,260 @@ +import 'dart:io'; + +import 'package:bluebubbles/database/models.dart'; +import 'package:bluebubbles/services/rustpush/cloud_sync/cloud_sync_production_sampler_adapter.dart'; +import 'package:bluebubbles/services/rustpush/cloud_sync/cloudkit_operation_interlock.dart'; +import 'package:bluebubbles/services/rustpush/cloud_sync/cloudkit_writer_authority.dart'; +import 'package:bluebubbles/services/rustpush/cloud_sync/cloudkit_writer_mutation_guard.dart'; +import 'package:bluebubbles/services/rustpush/cloud_sync/cloudkit_writer_ownership.dart'; +import 'package:bluebubbles/services/rustpush/cloud_sync/in_memory_cloud_sync_store.dart'; +import 'package:flutter_test/flutter_test.dart'; + +void main() { + late Directory directory; + late Store store; + late Object activeClient; + late _FakeAuthBinding binding; + + setUp(() async { + directory = await Directory.systemTemp.createTemp( + 'openbubbles-cloudkit-writer-mutation-guard-', + ); + store = await openStore(directory: directory.path); + activeClient = Object(); + binding = _FakeAuthBinding(); + }); + + tearDown(() async { + if (!store.isClosed()) store.close(); + if (directory.existsSync()) { + await directory.delete(recursive: true); + } + }); + + CloudKitWriterOwnershipDecision decision(CloudKitWriterOwner owner) => + CloudKitWriterOwnershipDecision(owner: owner, configurationValid: true); + + ObjectBoxCloudKitWriterAuthority authority(CloudKitWriterOwner owner) => + ObjectBoxCloudKitWriterAuthority.forTest( + store: store, + buildDecision: decision(owner), + ); + + void provision(CloudKitWriterOwner owner) { + final adapter = authority(CloudKitWriterOwner.none); + final initial = adapter.initializeDisabled(_scope, now: _time(0)); + authority(owner).provisionInitialOwner( + _scope, + owner: owner, + expectedEpoch: initial.epoch, + evidence: _completeEvidence, + now: _time(1), + ); + } + + CloudKitWriterMutationGuard guard({ + CloudKitWriterOwner owner = CloudKitWriterOwner.legacy, + Object? Function()? reader, + }) => CloudKitWriterMutationGuard.forTest( + store: store, + readActiveClient: reader ?? () => activeClient, + privateStorageDirectory: 'protected-test-directory', + nativeAuthBinding: binding, + buildDecision: decision(owner), + ); + + Future runGuard({ + Object? Function()? reader, + required Future Function() action, + }) { + return CloudKitOperationInterlock( + privateStorageDirectory: directory.path, + fenceStore: InMemoryCloudSyncStore(), + ).runExclusive( + kind: CloudKitOperationKind.legacyReadWrite, + action: () => guard( + reader: reader, + ).run(owner: CloudKitWriterOwner.legacy, action: action), + ); + } + + test( + 'matching durable owner and native identity permit one mutation', + () async { + provision(CloudKitWriterOwner.legacy); + var actionCalls = 0; + final value = await runGuard( + action: () async { + actionCalls++; + return 42; + }, + ); + + expect(value, 42); + expect(actionCalls, 1); + expect(binding.captureCalls, 2); + }, + ); + + test( + 'mutation guard refuses to run outside the operation interlock', + () async { + provision(CloudKitWriterOwner.legacy); + var actionCalls = 0; + await expectLater( + guard().run( + owner: CloudKitWriterOwner.legacy, + action: () async => actionCalls++, + ), + throwsA( + isA().having( + (value) => value.safeCode, + 'safeCode', + 'cloudkit_interlock_required', + ), + ), + ); + expect(actionCalls, 0); + expect(binding.captureCalls, 0); + }, + ); + + test('missing authority fails before invoking the remote action', () async { + var actionCalls = 0; + await expectLater( + runGuard(action: () async => actionCalls++), + throwsA(_failure('cloudkit_writer_authority_missing')), + ); + expect(actionCalls, 0); + }); + + test('missing active client fails before native capture or action', () async { + var actionCalls = 0; + await expectLater( + runGuard(reader: () => null, action: () async => actionCalls++), + throwsA(_failure('cloudkit_writer_active_client_missing')), + ); + expect(binding.captureCalls, 0); + expect(actionCalls, 0); + }); + + test('client replacement during initial capture blocks the action', () async { + provision(CloudKitWriterOwner.legacy); + var actionCalls = 0; + binding.afterCapture = (call) { + if (call == 1) activeClient = Object(); + }; + await expectLater( + runGuard(action: () async => actionCalls++), + throwsA(_failure('cloudkit_writer_identity_changed_before_mutation')), + ); + expect(actionCalls, 0); + }); + + test('client replacement after action becomes an unknown outcome', () async { + provision(CloudKitWriterOwner.legacy); + await expectLater( + runGuard( + action: () async { + activeClient = Object(); + }, + ), + throwsA(_failure('cloudkit_writer_mutation_outcome_unknown')), + ); + }); + + test('native identity replacement after action becomes unknown', () async { + provision(CloudKitWriterOwner.legacy); + binding.metadataForCall = (call) => call == 1 + ? _metadataA + : const CloudSyncNativeAuthMetadata( + nativeSessionId: _digestB, + accountFingerprint: _fingerprintB, + protectedStoreIdentity: 'obcs2.store.$_digestB', + ); + await expectLater( + runGuard(action: () async {}), + throwsA(_failure('cloudkit_writer_mutation_outcome_unknown')), + ); + }); + + test('authority epoch replacement after action becomes unknown', () async { + provision(CloudKitWriterOwner.legacy); + await expectLater( + runGuard( + action: () async { + final current = authority(CloudKitWriterOwner.legacy).read(_scope)!; + authority(CloudKitWriterOwner.v2).prepareMigration( + _scope, + from: CloudKitWriterOwner.legacy, + to: CloudKitWriterOwner.v2, + expectedEpoch: current.epoch, + transitionIdHash: _migrationId, + evidence: _completeEvidence, + now: _time(2), + ); + }, + ), + throwsA(_failure('cloudkit_writer_mutation_outcome_unknown')), + ); + }); + + test( + 'remote action failure revokes authority as an unknown outcome', + () async { + provision(CloudKitWriterOwner.legacy); + await expectLater( + runGuard(action: () async => throw StateError('remote_failed')), + throwsA(_failure('cloudkit_writer_mutation_outcome_unknown')), + ); + expect(binding.captureCalls, 1); + final snapshot = authority(CloudKitWriterOwner.legacy).read(_scope)!; + expect(snapshot.state, CloudKitWriterAuthorityState.mutationUnknown); + expect( + () => authority( + CloudKitWriterOwner.legacy, + ).issuePermit(_scope, expectedOwner: CloudKitWriterOwner.legacy), + throwsA(_failure('cloudkit_writer_authority_not_stable')), + ); + }, + ); +} + +final class _FakeAuthBinding implements CloudSyncNativeAuthBinding { + int captureCalls = 0; + void Function(int call)? afterCapture; + CloudSyncNativeAuthMetadata Function(int call)? metadataForCall; + + @override + Future capture({ + required Object cloudMessagesClient, + required String privateStorageDirectory, + }) async { + captureCalls++; + final metadata = metadataForCall?.call(captureCalls) ?? _metadataA; + afterCapture?.call(captureCalls); + return metadata; + } +} + +Matcher _failure(String safeCode) => isA() + .having((value) => value.safeCode, 'safeCode', safeCode); + +DateTime _time(int seconds) => DateTime.utc(2026, 8, 22, 12, 0, seconds); + +const _digestA = 'AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA'; +const _digestB = 'BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB'; +const _fingerprintB = 'CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC'; +const _metadataA = CloudSyncNativeAuthMetadata( + nativeSessionId: _digestA, + accountFingerprint: _digestA, + protectedStoreIdentity: 'obcs2.store.$_digestA', +); +final _scope = CloudKitWriterScope(accountFingerprint: _digestA); +const _completeEvidence = CloudKitWriterTransitionEvidence.forTest( + operationsQuiesced: true, + activeIdentityRevalidated: true, + legacyMutationQueues: LegacyMutationQueueDisposition.empty, +); +const _migrationId = + '3333333333333333333333333333333333333333333333333333333333333333'; diff --git a/test/services/cloud_sync/cloudkit_writer_ownership_test.dart b/test/services/cloud_sync/cloudkit_writer_ownership_test.dart new file mode 100644 index 0000000000..dc11526d8c --- /dev/null +++ b/test/services/cloud_sync/cloudkit_writer_ownership_test.dart @@ -0,0 +1,96 @@ +import 'dart:io'; + +import 'package:bluebubbles/services/rustpush/cloud_sync/cloudkit_writer_ownership.dart'; +import 'package:flutter_test/flutter_test.dart'; + +void main() { + test('ordinary builds have no CloudKit writer', () { + expect(CloudKitWriterOwnership.decision.configurationValid, isTrue); + expect(CloudKitWriterOwnership.decision.owner, CloudKitWriterOwner.none); + expect(CloudKitWriterOwnership.legacyMutationsEnabled, isFalse); + expect(CloudKitWriterOwnership.v2MutationsEnabled, isFalse); + }); + + test( + 'the one selector can grant ownership to exactly one implementation', + () { + final legacy = CloudKitWriterOwnership.resolve('legacy'); + expect(legacy.legacyMutationsEnabled, isTrue); + expect(legacy.v2MutationsEnabled, isFalse); + + final v2 = CloudKitWriterOwnership.resolve('v2'); + expect(v2.legacyMutationsEnabled, isFalse); + expect(v2.v2MutationsEnabled, isTrue); + }, + ); + + test('unknown or non-canonical values fail closed without disclosure', () { + for (final value in [ + '', + 'LEGACY', + 'legacy,v2', + 'v2\nsecret-value', + ]) { + final decision = CloudKitWriterOwnership.resolve(value); + expect(decision.configurationValid, isFalse); + expect(decision.owner, CloudKitWriterOwner.none); + expect(decision.legacyMutationsEnabled, isFalse); + expect(decision.v2MutationsEnabled, isFalse); + expect( + decision.toString(), + 'CloudKitWriterOwnershipDecision(' + 'status=cloudkit_writer_configuration_invalid)', + ); + expect(decision.safeStatusCode, 'cloudkit_writer_configuration_invalid'); + } + }); + + test( + 'legacy mutations use the shared owner instead of an independent flag', + () { + final source = File( + 'lib/services/rustpush/rustpush_service.dart', + ).readAsStringSync(); + expect(source, isNot(contains('OPENBUBBLES_LEGACY_CLOUDKIT_MUTATIONS'))); + expect( + source, + contains('CloudKitWriterOwnership.legacyMutationsEnabled'), + ); + }, + ); + + test('beta canary does not select any CloudKit writer', () { + final workflow = File('.github/workflows/build.yml').readAsStringSync(); + final betaStart = workflow.indexOf( + 'Build Beta Debug APK with the Cloud Sync V2 sampler', + ); + final evidenceStart = workflow.indexOf( + 'Build developer-only CloudKit V2 Evidence Canary APK', + betaStart, + ); + expect(betaStart, greaterThanOrEqualTo(0)); + expect(evidenceStart, greaterThan(betaStart)); + final betaBuild = workflow.substring(betaStart, evidenceStart); + expect(betaBuild, isNot(contains('OPENBUBBLES_CLOUDKIT_WRITER_OWNER='))); + final evidenceBuild = workflow.substring(evidenceStart); + expect( + evidenceBuild, + isNot(contains('OPENBUBBLES_CLOUDKIT_WRITER_OWNER=')), + ); + }); + + test('encrypted-data reset uses the shared destructive interlock', () { + final source = File( + 'lib/services/rustpush/rustpush_service.dart', + ).readAsStringSync(); + final resetCall = source.indexOf('api.resetClique('); + expect(resetCall, greaterThanOrEqualTo(0)); + final wrapper = source.lastIndexOf( + '_runCloudKitDestructiveReset(', + resetCall, + ); + expect(wrapper, greaterThanOrEqualTo(0)); + expect(resetCall - wrapper, lessThan(200)); + expect(source, contains('kind: CloudKitOperationKind.destructiveReset')); + }); +} diff --git a/test/services/cloud_sync/in_memory_cloud_sync_store_test.dart b/test/services/cloud_sync/in_memory_cloud_sync_store_test.dart new file mode 100644 index 0000000000..b14c400fec --- /dev/null +++ b/test/services/cloud_sync/in_memory_cloud_sync_store_test.dart @@ -0,0 +1,1776 @@ +import 'package:bluebubbles/services/rustpush/cloud_sync/cloud_shadow_journal_budget.dart'; +import 'package:bluebubbles/services/rustpush/cloud_sync/cloud_sync_models.dart'; +import 'package:bluebubbles/services/rustpush/cloud_sync/cloud_sync_store.dart'; +import 'package:bluebubbles/services/rustpush/cloud_sync/in_memory_cloud_sync_store.dart'; +import 'package:flutter_test/flutter_test.dart'; + +import 'cloud_sync_test_helpers.dart'; + +void main() { + late InMemoryCloudSyncStore store; + late CloudSyncScope scope; + + setUp(() { + store = InMemoryCloudSyncStore(); + scope = testScope(); + }); + + test('unknown push outcomes require an unknown failure category', () { + final operationId = testOutboxOperation(scope, 1).operationId; + expect( + () => CloudPushOutcome( + operationId: operationId, + disposition: CloudPushDisposition.unknownOutcome, + ), + throwsArgumentError, + ); + expect( + CloudPushOutcome( + operationId: operationId, + disposition: CloudPushDisposition.unknownOutcome, + failureCategory: CloudFailureCategory.unknown, + ).failureCategory, + CloudFailureCategory.unknown, + ); + }); + + test( + 'journals page and token atomically while deduplicating replay', + () async { + final batch = CloudFetchBatch( + scope: scope, + changes: [testChange(1), testChange(2)], + batchId: 'batch-1', + generation: 1, + nextToken: 'opaque-token-1', + hasMore: false, + ); + + expect(await _journal(store, batch), 2); + expect(await _journal(store, batch), 0); + + final checkpoint = await store.readCheckpoint(scope); + final inbox = await store.inboxEntries(scope); + expect(checkpoint.fetchedToken, 'opaque-token-1'); + expect(checkpoint.fetchedSequence, 2); + expect(checkpoint.lastBatchId, 'batch-1'); + expect(inbox.map((entry) => entry.sequence), [1, 2]); + }, + ); + + test('journals a tombstone without inventing an etag or payload', () async { + await _journal( + store, + CloudFetchBatch( + scope: scope, + changes: [testChange(1, tombstone: true)], + batchId: 'tombstone-batch', + generation: 1, + nextToken: 'opaque-token', + hasMore: false, + ), + ); + + final entry = (await store.inboxEntries(scope)).single; + expect(entry.change.isTombstone, isTrue); + expect(entry.change.etagHash, isNull); + expect(entry.change.encryptedPayloadReference, isNull); + expect(entry.change.payloadSha256, isNull); + expect(entry.change.encryptedServerRecordId, isNotNull); + expect(entry.batchId, 'tombstone-batch'); + expect(entry.generation, 1); + }); + + test('rejects a fetched page from the wrong checkpoint generation', () async { + await expectLater( + _journal( + store, + CloudFetchBatch( + scope: scope, + changes: [testChange(1)], + batchId: 'stale-generation-batch', + generation: 2, + nextToken: 'opaque-token', + hasMore: false, + ), + ), + throwsA( + isA().having( + (error) => error.safeCode, + 'safeCode', + 'generation_mismatch', + ), + ), + ); + }); + + test( + 'terminal checkpoint advances through applied and quarantined rows', + () async { + await _journal( + store, + CloudFetchBatch( + scope: scope, + changes: [testChange(1), testChange(2), testChange(3)], + batchId: 'batch-1', + generation: 1, + nextToken: 'token', + hasMore: false, + ), + ); + + final fence = (await store.tryAcquireCoordinatorLease( + scope, + ownerId: 'inbox-transition-owner', + now: testEpoch, + leaseDuration: const Duration(minutes: 5), + ))!; + await store.markInboxApplied( + scope, + sequence: 2, + now: testEpoch, + leaseFence: fence, + ); + expect((await store.readCheckpoint(scope)).lastAppliedSequence, 0); + + await store.markInboxApplied( + scope, + sequence: 1, + now: testEpoch, + leaseFence: fence, + ); + expect((await store.readCheckpoint(scope)).lastAppliedSequence, 2); + + await store.quarantineInbox( + scope, + sequence: 3, + category: CloudFailureCategory.malformedRecord, + now: testEpoch, + leaseFence: fence, + ); + expect((await store.readCheckpoint(scope)).lastAppliedSequence, 3); + }, + ); + + test('retry fallback is monotonic and idempotent', () async { + await _journal( + store, + CloudFetchBatch( + scope: scope, + changes: [testChange(1)], + batchId: 'retry-fallback-page', + generation: 1, + nextToken: 'retry-token', + hasMore: false, + ), + ); + final fence = (await store.tryAcquireCoordinatorLease( + scope, + ownerId: 'retry-fallback-owner', + now: testEpoch, + leaseDuration: const Duration(minutes: 5), + ))!; + final later = testEpoch.add(const Duration(minutes: 10)); + for (final nextEligibleAt in [ + later, + later, + testEpoch.add(const Duration(minutes: 5)), + ]) { + await store.markInboxRetryable( + scope, + sequence: 1, + category: CloudFailureCategory.network, + now: testEpoch, + nextEligibleAt: nextEligibleAt, + leaseFence: fence, + ); + } + + final entry = (await store.inboxEntries(scope)).single; + expect(entry.attemptCount, 1); + expect(entry.nextEligibleAt, later); + }); + + test('account-scoped journals cannot bleed into another account', () async { + final otherScope = testScope(account: testAccountFingerprintB); + await _journal( + store, + CloudFetchBatch( + scope: scope, + changes: [testChange(1)], + batchId: 'batch-a', + generation: 1, + nextToken: 'token-a', + hasMore: false, + ), + ); + + expect(await store.inboxEntries(otherScope), isEmpty); + expect((await store.readCheckpoint(otherScope)).fetchedToken, isNull); + }); + + test( + 'coalesces pending saves by logical entity and keeps latest revision', + () async { + final first = testOutboxOperation(scope, 1, revision: 1); + final latest = testOutboxOperation(scope, 1, revision: 2); + await store.enqueueOutbox(first); + await store.enqueueOutbox(first); + await store.enqueueOutbox(latest); + + final entries = await store.outboxEntries(scope); + expect(entries, hasLength(1)); + expect(entries.single.operationId, latest.operationId); + expect( + entries.single.payloadSha256, + testOutboxOperation(scope, 1, revision: 2).payloadSha256, + ); + }, + ); + + test( + 'production enqueue allocates monotonic revisions despite clock rollback', + () async { + final first = await store.enqueueOutboxMutation( + CloudOutboxDraft( + scope: scope, + logicalEntityKeyHash: 'logical-key-digest', + action: CloudOutboxAction.save, + payloadVersion: 1, + encryptedPayloadReference: 'protected:first', + payloadSha256: 'payload-digest-first', + dependencyOperationIds: const [], + createdAt: testEpoch.add(const Duration(days: 1)), + ), + ); + final second = await store.enqueueOutboxMutation( + CloudOutboxDraft( + scope: scope, + logicalEntityKeyHash: 'logical-key-digest', + action: CloudOutboxAction.save, + payloadVersion: 1, + encryptedPayloadReference: 'protected:second', + payloadSha256: 'payload-digest-second', + dependencyOperationIds: const [], + createdAt: testEpoch.subtract(const Duration(days: 1)), + ), + ); + + expect(first.mutationRevision, 1); + expect(second.mutationRevision, 2); + expect((await store.readCheckpoint(scope)).mutationRevisionCounter, 2); + expect( + (await store.outboxEntries(scope)).single.operationId, + second.operationId, + ); + }, + ); + + test( + 'outbox enqueue is bound to the current checkpoint generation', + () async { + final admitted = await store.enqueueOutboxMutation( + CloudOutboxDraft( + scope: scope, + logicalEntityKeyHash: 'generation-bound-key', + action: CloudOutboxAction.save, + payloadVersion: 1, + encryptedPayloadReference: 'protected:generation-bound', + payloadSha256: 'payload-digest-generation-bound', + dependencyOperationIds: const [], + createdAt: testEpoch, + ), + ); + expect(admitted.checkpointGeneration, 1); + + await expectLater( + store.enqueueOutbox( + testOutboxOperation(scope, 2, checkpointGeneration: 2), + ), + throwsA( + isA().having( + (failure) => failure.safeCode, + 'safeCode', + 'outbox_generation_mismatch', + ), + ), + ); + expect(await store.outboxEntries(scope), hasLength(1)); + }, + ); + + test( + 'advance fences every stale outbox row and admits only new generation', + () async { + final leased = await store.enqueueOutboxMutation( + CloudOutboxDraft( + scope: scope, + logicalEntityKeyHash: 'leased-generation-key', + action: CloudOutboxAction.save, + payloadVersion: 1, + encryptedPayloadReference: 'protected:leased-generation', + payloadSha256: 'payload-digest-leased-generation', + dependencyOperationIds: const [], + createdAt: testEpoch, + ), + ); + final pending = await store.enqueueOutboxMutation( + CloudOutboxDraft( + scope: scope, + logicalEntityKeyHash: 'pending-generation-key', + action: CloudOutboxAction.save, + payloadVersion: 1, + encryptedPayloadReference: 'protected:pending-generation', + payloadSha256: 'payload-digest-pending-generation', + dependencyOperationIds: const [], + createdAt: testEpoch, + ), + ); + await store.leaseEligibleOutbox( + scope, + now: testEpoch, + limit: 1, + leaseId: 'generation-lease', + leaseDuration: const Duration(minutes: 1), + allowedActions: const {CloudOutboxAction.save}, + ); + + final advanced = await store.advanceOutboxGeneration( + scope, + now: testEpoch, + ); + expect(advanced.generation, 2); + final fenced = await store.outboxEntries(scope); + expect( + fenced + .where( + (row) => + row.operationId == leased.operationId || + row.operationId == pending.operationId, + ) + .map((row) => row.status), + everyElement(CloudOutboxStatus.quarantined), + ); + await expectLater( + store.applyOutboxTransitions( + scope, + leaseId: 'generation-lease', + transitions: [CloudOutboxTransition.confirmed(leased.operationId)], + now: testEpoch, + ), + throwsA( + isA().having( + (failure) => failure.safeCode, + 'safeCode', + 'stale_outbox_generation', + ), + ), + ); + + final fresh = await store.enqueueOutboxMutation( + CloudOutboxDraft( + scope: scope, + logicalEntityKeyHash: 'fresh-generation-key', + action: CloudOutboxAction.save, + payloadVersion: 1, + encryptedPayloadReference: 'protected:fresh-generation', + payloadSha256: 'payload-digest-fresh-generation', + dependencyOperationIds: const [], + createdAt: testEpoch, + ), + ); + expect(fresh.checkpointGeneration, 2); + expect( + (await store.leaseEligibleOutbox( + scope, + now: testEpoch, + limit: 1, + leaseId: 'fresh-generation-lease', + leaseDuration: const Duration(minutes: 1), + allowedActions: const {CloudOutboxAction.save}, + )).single.operationId, + fresh.operationId, + ); + }, + ); + + test( + 'reset rebootstrap clears the active in-memory generation state', + () async { + final scope = testScope(); + await _journal( + store, + CloudFetchBatch( + scope: scope, + changes: [testChange(1)], + batchId: 'reset-batch', + generation: 1, + nextToken: 'reset-token', + hasMore: false, + ), + ); + final oldOperation = await store.enqueueOutboxMutation( + CloudOutboxDraft( + scope: scope, + logicalEntityKeyHash: 'reset-old-operation', + action: CloudOutboxAction.save, + payloadVersion: 1, + encryptedPayloadReference: 'protected:reset-old', + payloadSha256: 'payload-digest-reset-old', + dependencyOperationIds: const [], + createdAt: testEpoch, + ), + ); + + final completion = await store.rebootstrapAfterReset( + CloudSyncResetRebootstrapRequest( + scope: scope, + transitionIdHash: + '2222222222222222222222222222222222222222222222222222222222222222', + activeIdentityFingerprint: scope.accountFingerprint, + expectedGeneration: 1, + protectedRemoteStateProofReference: + 'obcs2.ref.AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA', + ), + now: testEpoch.add(const Duration(seconds: 1)), + ); + expect(completion.previousGeneration, 1); + expect(completion.generation, 2); + expect((await store.readCheckpoint(scope)).fetchedToken, isNull); + expect((await store.readCheckpoint(scope)).fetchedSequence, 0); + expect(await store.inboxEntries(scope), isEmpty); + expect( + (await store.outboxEntries(scope)) + .singleWhere((row) => row.operationId == oldOperation.operationId) + .status, + CloudOutboxStatus.quarantined, + ); + }, + ); + + test('advancing one account scope does not fence another account', () async { + final otherScope = testScope(account: testAccountFingerprintB); + final first = await store.enqueueOutboxMutation( + CloudOutboxDraft( + scope: scope, + logicalEntityKeyHash: 'account-a-key', + action: CloudOutboxAction.save, + payloadVersion: 1, + encryptedPayloadReference: 'protected:account-a', + payloadSha256: 'payload-digest-account-a', + dependencyOperationIds: const [], + createdAt: testEpoch, + ), + ); + final second = await store.enqueueOutboxMutation( + CloudOutboxDraft( + scope: otherScope, + logicalEntityKeyHash: 'account-b-key', + action: CloudOutboxAction.save, + payloadVersion: 1, + encryptedPayloadReference: 'protected:account-b', + payloadSha256: 'payload-digest-account-b', + dependencyOperationIds: const [], + createdAt: testEpoch, + ), + ); + + await store.advanceOutboxGeneration(scope, now: testEpoch); + expect( + (await store.outboxEntries(scope)).single.status, + CloudOutboxStatus.quarantined, + ); + expect( + (await store.outboxEntries(otherScope)).single.checkpointGeneration, + 1, + ); + expect( + (await store.leaseEligibleOutbox( + otherScope, + now: testEpoch, + limit: 1, + leaseId: 'other-account-lease', + leaseDuration: const Duration(minutes: 1), + allowedActions: const {CloudOutboxAction.save}, + )).single.operationId, + second.operationId, + ); + expect(first.checkpointGeneration, 1); + }); + + test( + 'generation cannot advance while its coordinator may be writing', + () async { + final fence = (await store.tryAcquireCoordinatorLease( + scope, + ownerId: 'active-generation-writer', + now: testEpoch, + leaseDuration: const Duration(minutes: 1), + ))!; + + await expectLater( + store.advanceOutboxGeneration(scope, now: testEpoch), + throwsA( + isA().having( + (failure) => failure.safeCode, + 'safeCode', + 'generation_advance_coordinator_active', + ), + ), + ); + expect((await store.readCheckpoint(scope)).generation, 1); + + await store.releaseCoordinatorLease(scope, leaseFence: fence); + expect( + (await store.advanceOutboxGeneration(scope, now: testEpoch)).generation, + 2, + ); + }, + ); + + test('caller-supplied operation ID cannot collide across scopes', () async { + final first = testOutboxOperation(scope, 91); + final otherScope = testScope(account: testAccountFingerprintB); + final collision = CloudOutboxOperation( + scope: otherScope, + operationId: first.operationId, + logicalEntityKeyHash: first.logicalEntityKeyHash, + action: first.action, + payloadVersion: first.payloadVersion, + mutationRevision: first.mutationRevision, + checkpointGeneration: 1, + encryptedPayloadReference: first.encryptedPayloadReference, + payloadSha256: first.payloadSha256, + dependencyOperationIds: first.dependencyOperationIds, + createdAt: first.createdAt, + ); + await store.enqueueOutbox(first); + + await expectLater( + store.enqueueOutbox(collision), + throwsA( + isA().having( + (failure) => failure.safeCode, + 'safeCode', + 'outbox_operation_scope_collision', + ), + ), + ); + expect(await store.outboxEntries(otherScope), isEmpty); + }); + + test( + 'confirmed dependency from an older generation cannot unlock work', + () async { + final dependency = await store.enqueueOutboxMutation( + CloudOutboxDraft( + scope: scope, + logicalEntityKeyHash: 'old-generation-dependency', + action: CloudOutboxAction.save, + payloadVersion: 1, + encryptedPayloadReference: 'protected:old-generation-dependency', + payloadSha256: 'digest-old-generation-dependency', + dependencyOperationIds: const [], + createdAt: testEpoch, + ), + ); + await store.leaseEligibleOutbox( + scope, + now: testEpoch, + limit: 1, + leaseId: 'old-generation-lease', + leaseDuration: const Duration(minutes: 1), + allowedActions: const {CloudOutboxAction.save}, + ); + await store.applyOutboxTransitions( + scope, + leaseId: 'old-generation-lease', + transitions: [CloudOutboxTransition.confirmed(dependency.operationId)], + now: testEpoch, + ); + await store.advanceOutboxGeneration(scope, now: testEpoch); + await store.enqueueOutboxMutation( + CloudOutboxDraft( + scope: scope, + logicalEntityKeyHash: 'new-generation-dependent', + action: CloudOutboxAction.save, + payloadVersion: 1, + encryptedPayloadReference: 'protected:new-generation-dependent', + payloadSha256: 'digest-new-generation-dependent', + dependencyOperationIds: {dependency.operationId}, + createdAt: testEpoch, + ), + ); + + expect( + await store.leaseEligibleOutbox( + scope, + now: testEpoch, + limit: 1, + leaseId: 'new-generation-lease', + leaseDuration: const Duration(minutes: 1), + allowedActions: const {CloudOutboxAction.save}, + ), + isEmpty, + ); + }, + ); + + test('stale save cannot replace a newer save or strand dependents', () async { + final originalDependency = testOutboxOperation(scope, 1, revision: 1); + final dependentMessage = testOutboxOperation( + scope, + 2, + dependencies: [originalDependency.operationId], + ); + final newerDependency = testOutboxOperation(scope, 1, revision: 2); + final staleDependency = testOutboxOperation(scope, 1, revision: 0); + await store.enqueueOutbox(originalDependency); + await store.enqueueOutbox(dependentMessage); + await store.enqueueOutbox(newerDependency); + await store.enqueueOutbox(staleDependency); + + final entries = await store.outboxEntries(scope); + expect(entries, hasLength(2)); + expect( + entries.any((entry) => entry.operationId == newerDependency.operationId), + isTrue, + ); + expect( + entries + .singleWhere( + (entry) => entry.operationId == dependentMessage.operationId, + ) + .dependencyOperationIds, + {newerDependency.operationId}, + ); + }); + + test('dependencies and feature gates control outbox leasing', () async { + final attachment = testOutboxOperation(scope, 1); + final message = testOutboxOperation( + scope, + 2, + dependencies: [attachment.operationId], + ); + final deletion = testOutboxOperation( + scope, + 3, + action: CloudOutboxAction.delete, + ); + await store.enqueueOutbox(attachment); + await store.enqueueOutbox(message); + await store.enqueueOutbox(deletion); + + final firstLease = await store.leaseEligibleOutbox( + scope, + now: testEpoch, + limit: 256, + leaseId: 'lease-1', + leaseDuration: const Duration(minutes: 1), + allowedActions: const {CloudOutboxAction.save}, + ); + expect(firstLease.map((operation) => operation.operationId), [ + attachment.operationId, + ]); + + await store.applyOutboxTransitions( + scope, + leaseId: 'lease-1', + transitions: [CloudOutboxTransition.confirmed(attachment.operationId)], + now: testEpoch, + ); + final secondLease = await store.leaseEligibleOutbox( + scope, + now: testEpoch, + limit: 256, + leaseId: 'lease-2', + leaseDuration: const Duration(minutes: 1), + allowedActions: const {CloudOutboxAction.save}, + ); + expect(secondLease.map((operation) => operation.operationId), [ + message.operationId, + ]); + }); + + test( + 'newer delete waits behind a leased save and the batch keeps scanning', + () async { + final saveA = testOutboxOperation(scope, 1, revision: 1); + final deleteA = testOutboxOperation( + scope, + 1, + action: CloudOutboxAction.delete, + revision: 2, + createdAt: testEpoch.add(const Duration(microseconds: 1)), + ); + final saveB = testOutboxOperation( + scope, + 2, + revision: 3, + createdAt: testEpoch.add(const Duration(microseconds: 2)), + ); + await store.enqueueOutbox(saveA); + await store.enqueueOutbox(deleteA); + await store.enqueueOutbox(saveB); + + final firstLease = await store.leaseEligibleOutbox( + scope, + now: testEpoch, + limit: 1, + leaseId: 'lease-save-a', + leaseDuration: const Duration(minutes: 1), + allowedActions: CloudOutboxAction.values.toSet(), + ); + expect(firstLease.map((operation) => operation.operationId), [ + saveA.operationId, + ]); + + final secondLease = await store.leaseEligibleOutbox( + scope, + now: testEpoch, + limit: 1, + leaseId: 'lease-save-b', + leaseDuration: const Duration(minutes: 1), + allowedActions: CloudOutboxAction.values.toSet(), + ); + expect(secondLease.map((operation) => operation.operationId), [ + saveB.operationId, + ]); + + await store.applyOutboxTransitions( + scope, + leaseId: 'lease-save-a', + transitions: [CloudOutboxTransition.confirmed(saveA.operationId)], + now: testEpoch, + ); + + final thirdLease = await store.leaseEligibleOutbox( + scope, + now: testEpoch, + limit: 1, + leaseId: 'lease-delete-a', + leaseDuration: const Duration(minutes: 1), + allowedActions: CloudOutboxAction.values.toSet(), + ); + expect(thirdLease.map((operation) => operation.operationId), [ + deleteA.operationId, + ]); + }, + ); + + test('stale worker cannot confirm a newer lease', () async { + final operation = testOutboxOperation(scope, 1); + await store.enqueueOutbox(operation); + await store.leaseEligibleOutbox( + scope, + now: testEpoch, + limit: 1, + leaseId: 'old-lease', + leaseDuration: const Duration(seconds: 1), + allowedActions: CloudOutboxAction.values.toSet(), + ); + await store.recoverExpiredOutboxLeases( + scope, + now: testEpoch.add(const Duration(seconds: 2)), + ); + await store.leaseEligibleOutbox( + scope, + now: testEpoch.add(const Duration(seconds: 2)), + limit: 1, + leaseId: 'new-lease', + leaseDuration: const Duration(minutes: 1), + allowedActions: CloudOutboxAction.values.toSet(), + ); + + await expectLater( + store.applyOutboxTransitions( + scope, + leaseId: 'old-lease', + transitions: [CloudOutboxTransition.confirmed(operation.operationId)], + now: testEpoch, + ), + throwsA( + isA().having( + (error) => error.safeCode, + 'safeCode', + 'stale_outbox_lease', + ), + ), + ); + }); + + test('expired outbox lease cannot map or confirm before recovery', () async { + final operation = testOutboxOperation(scope, 1); + await store.enqueueOutbox(operation); + await store.leaseEligibleOutbox( + scope, + now: testEpoch, + limit: 1, + leaseId: 'expired-lease', + leaseDuration: const Duration(seconds: 1), + allowedActions: CloudOutboxAction.values.toSet(), + ); + + await expectLater( + store.attachOutboxRecordMapping( + scope, + leaseId: 'expired-lease', + operationId: operation.operationId, + serverRecordIdHash: 'server-record-hash', + now: testEpoch.add(const Duration(seconds: 1)), + ), + throwsA( + isA().having( + (error) => error.safeCode, + 'safeCode', + 'stale_outbox_lease', + ), + ), + ); + + await expectLater( + store.applyOutboxTransitions( + scope, + leaseId: 'expired-lease', + transitions: [CloudOutboxTransition.confirmed(operation.operationId)], + now: testEpoch.add(const Duration(seconds: 1)), + ), + throwsA( + isA().having( + (error) => error.safeCode, + 'safeCode', + 'stale_outbox_lease', + ), + ), + ); + }); + + test('resume keeps future paused rows behind their retry boundary', () async { + final eligible = testOutboxOperation(scope, 1); + final future = testOutboxOperation(scope, 2); + await store.enqueueOutbox(eligible); + await store.enqueueOutbox(future); + final leased = await store.leaseEligibleOutbox( + scope, + now: testEpoch, + limit: 2, + leaseId: 'pause-lease', + leaseDuration: const Duration(minutes: 1), + allowedActions: CloudOutboxAction.values.toSet(), + ); + expect(leased, hasLength(2)); + await store.applyOutboxTransitions( + scope, + leaseId: 'pause-lease', + transitions: [ + CloudOutboxTransition.paused( + eligible.operationId, + category: CloudFailureCategory.authorization, + nextEligibleAt: testEpoch, + ), + CloudOutboxTransition.paused( + future.operationId, + category: CloudFailureCategory.authorization, + nextEligibleAt: testEpoch.add(const Duration(hours: 1)), + ), + ], + now: testEpoch, + ); + + expect( + await store.resumePausedOutbox( + scope, + categories: const {CloudFailureCategory.authorization}, + now: testEpoch, + ), + 1, + ); + final rows = await store.outboxEntries(scope); + expect( + rows.singleWhere((row) => row.operationId == eligible.operationId).status, + CloudOutboxStatus.pending, + ); + expect( + rows.singleWhere((row) => row.operationId == future.operationId).status, + CloudOutboxStatus.paused, + ); + }); + + test('duplicate outbox transitions fail before mutation', () async { + final operation = testOutboxOperation(scope, 1); + await store.enqueueOutbox(operation); + await store.leaseEligibleOutbox( + scope, + now: testEpoch, + limit: 1, + leaseId: 'duplicate-transition-lease', + leaseDuration: const Duration(minutes: 1), + allowedActions: CloudOutboxAction.values.toSet(), + ); + + await expectLater( + store.applyOutboxTransitions( + scope, + leaseId: 'duplicate-transition-lease', + transitions: [ + CloudOutboxTransition.confirmed(operation.operationId), + CloudOutboxTransition.confirmed(operation.operationId), + ], + now: testEpoch, + ), + throwsA( + isA().having( + (error) => error.safeCode, + 'safeCode', + 'duplicate_outbox_transition', + ), + ), + ); + + final leased = await store.leaseEligibleOutbox( + scope, + now: testEpoch, + limit: 1, + leaseId: 'replacement-lease', + leaseDuration: const Duration(minutes: 1), + allowedActions: CloudOutboxAction.values.toSet(), + ); + expect(leased, isEmpty); + }); + + test( + 'submission marker makes a leased row unknown and non-leasable through recovery', + () async { + final operation = testOutboxOperation(scope, 1); + await store.enqueueOutbox(operation); + await store.leaseEligibleOutbox( + scope, + now: testEpoch, + limit: 1, + leaseId: 'submission-marker-lease', + leaseDuration: const Duration(seconds: 1), + allowedActions: const {CloudOutboxAction.save}, + ); + + final submitted = await store.markOutboxSubmissionStarted( + scope, + leaseId: 'submission-marker-lease', + submissionIdentity: testSubmissionIdentity([operation.operationId]), + now: testEpoch, + ); + expect(submitted.single.appleRequestUuid, isNotNull); + expect(submitted.single.appleOperationUuid, isNotNull); + + var marked = (await store.outboxEntries(scope)).single; + expect(marked.status, CloudOutboxStatus.unknownOutcome); + expect(marked.lastFailure, CloudFailureCategory.unknown); + expect(marked.appleRequestUuid, submitted.single.appleRequestUuid); + expect(marked.appleOperationUuid, submitted.single.appleOperationUuid); + expect(marked.attemptCount, 0); + expect(marked.leaseId, 'submission-marker-lease'); + expect( + await store.leaseEligibleOutbox( + scope, + now: testEpoch, + limit: 1, + leaseId: 'replay-lease', + leaseDuration: const Duration(minutes: 1), + allowedActions: const {CloudOutboxAction.save}, + ), + isEmpty, + ); + + expect( + await store.recoverExpiredOutboxLeases( + scope, + now: testEpoch.add(const Duration(seconds: 2)), + ), + 0, + ); + marked = (await store.outboxEntries(scope)).single; + expect(marked.status, CloudOutboxStatus.unknownOutcome); + expect( + await store.leaseEligibleOutbox( + scope, + now: testEpoch.add(const Duration(seconds: 2)), + limit: 1, + leaseId: 'replay-after-recovery-lease', + leaseDuration: const Duration(minutes: 1), + allowedActions: const {CloudOutboxAction.save}, + ), + isEmpty, + ); + }, + ); + + test('submission identity assignment is atomic across the batch', () async { + final first = testOutboxOperation(scope, 31); + final second = testOutboxOperation(scope, 32); + await store.enqueueOutbox(first); + await store.enqueueOutbox(second); + await store.leaseEligibleOutbox( + scope, + now: testEpoch, + limit: 2, + leaseId: 'atomic-submission-lease', + leaseDuration: const Duration(minutes: 1), + allowedActions: const {CloudOutboxAction.save}, + ); + + final invalid = CloudOutboxSubmissionIdentity( + requestUuid: '11111111-2222-4ABC-8DEF-555555555555', + operationUuids: { + first.operationId: 'AAAAAAAA-BBBB-4CCC-8DDD-000000000001', + 'missing-operation': 'AAAAAAAA-BBBB-4CCC-8DDD-000000000002', + }, + ); + await expectLater( + store.markOutboxSubmissionStarted( + scope, + leaseId: 'atomic-submission-lease', + submissionIdentity: invalid, + now: testEpoch, + ), + throwsA(isA()), + ); + + final rows = await store.outboxEntries(scope); + expect(rows.every((row) => row.status == CloudOutboxStatus.leased), isTrue); + expect(rows.every((row) => row.appleRequestUuid == null), isTrue); + expect(rows.every((row) => row.appleOperationUuid == null), isTrue); + }); + + test( + 'legacy unknown outcome without Apple identities stays frozen', + () async { + final legacy = testOutboxOperation( + scope, + 33, + ).copyWith(status: CloudOutboxStatus.unknownOutcome); + await store.enqueueOutbox(legacy); + + expect( + await store.leaseUnknownOutcomes( + scope, + now: testEpoch, + limit: 1, + leaseId: 'legacy-unknown-lease', + leaseDuration: const Duration(minutes: 1), + ), + isEmpty, + ); + }, + ); + + test( + 'marked submission can be resolved by a returned confirmation', + () async { + final operation = testOutboxOperation(scope, 2); + await store.enqueueOutbox(operation); + await store.leaseEligibleOutbox( + scope, + now: testEpoch, + limit: 1, + leaseId: 'submission-confirm-lease', + leaseDuration: const Duration(minutes: 1), + allowedActions: const {CloudOutboxAction.save}, + ); + await store.markOutboxSubmissionStarted( + scope, + leaseId: 'submission-confirm-lease', + submissionIdentity: testSubmissionIdentity([operation.operationId]), + now: testEpoch, + ); + + await store.applyOutboxTransitions( + scope, + leaseId: 'submission-confirm-lease', + transitions: [CloudOutboxTransition.confirmed(operation.operationId)], + now: testEpoch.add(const Duration(seconds: 1)), + ); + final resolved = (await store.outboxEntries(scope)).single; + expect(resolved.status, CloudOutboxStatus.confirmed); + expect(resolved.leaseId, isNull); + expect(resolved.attemptCount, 0); + }, + ); + + test( + 'explicit unknown transition clears the live lease and increments attempts', + () async { + final operation = testOutboxOperation(scope, 3); + await store.enqueueOutbox(operation); + await store.leaseEligibleOutbox( + scope, + now: testEpoch, + limit: 1, + leaseId: 'explicit-unknown-lease', + leaseDuration: const Duration(minutes: 1), + allowedActions: const {CloudOutboxAction.save}, + ); + await store.applyOutboxTransitions( + scope, + leaseId: 'explicit-unknown-lease', + transitions: [ + CloudOutboxTransition.unknownOutcome(operation.operationId), + ], + now: testEpoch, + ); + final unknown = (await store.outboxEntries(scope)).single; + expect(unknown.status, CloudOutboxStatus.unknownOutcome); + expect(unknown.lastFailure, CloudFailureCategory.unknown); + expect(unknown.attemptCount, 1); + expect(unknown.leaseId, isNull); + expect(unknown.nextEligibleAt, isNull); + }, + ); + + test( + 'unknown outcome blocks newer mutation for the same logical key', + () async { + const logicalKeyHash = 'shared-unknown-logical-key'; + + Future enqueue(int revision) { + return store.enqueueOutboxMutation( + CloudOutboxDraft( + scope: scope, + logicalEntityKeyHash: logicalKeyHash, + action: CloudOutboxAction.save, + payloadVersion: 1, + encryptedPayloadReference: 'protected:shared-$revision', + payloadSha256: 'digest:shared-$revision', + dependencyOperationIds: const [], + createdAt: testEpoch.add(Duration(seconds: revision)), + ), + ); + } + + final first = await enqueue(1); + expect(first.mutationRevision, 1); + await store.leaseEligibleOutbox( + scope, + now: testEpoch, + limit: 1, + leaseId: 'shared-unknown-lease', + leaseDuration: const Duration(minutes: 1), + allowedActions: const {CloudOutboxAction.save}, + ); + await store.applyOutboxTransitions( + scope, + leaseId: 'shared-unknown-lease', + transitions: [CloudOutboxTransition.unknownOutcome(first.operationId)], + now: testEpoch, + ); + final second = await enqueue(2); + expect(second.mutationRevision, 2); + + expect( + await store.leaseEligibleOutbox( + scope, + now: testEpoch, + limit: 1, + leaseId: 'shared-newer-lease', + leaseDuration: const Duration(minutes: 1), + allowedActions: const {CloudOutboxAction.save}, + ), + isEmpty, + ); + await store.advanceOutboxGeneration(scope, now: testEpoch); + expect( + (await store.outboxEntries(scope)) + .where( + (row) => + row.operationId == first.operationId || + row.operationId == second.operationId, + ) + .map((row) => row.status), + everyElement(CloudOutboxStatus.quarantined), + ); + }, + ); + + test('coordinator lease renews and cannot be stolen before expiry', () async { + final fence = await store.tryAcquireCoordinatorLease( + scope, + ownerId: 'owner-a', + now: testEpoch, + leaseDuration: const Duration(minutes: 1), + ); + expect(fence, isNotNull); + expect( + await store.renewCoordinatorLease( + scope, + leaseFence: fence!, + now: testEpoch.add(const Duration(seconds: 30)), + leaseDuration: const Duration(minutes: 1), + ), + isTrue, + ); + expect( + await store.tryAcquireCoordinatorLease( + scope, + ownerId: 'owner-b', + now: testEpoch.add(const Duration(seconds: 61)), + leaseDuration: const Duration(minutes: 1), + ), + isNull, + ); + final takeoverFence = await store.tryAcquireCoordinatorLease( + scope, + ownerId: 'owner-b', + now: testEpoch.add(const Duration(seconds: 91)), + leaseDuration: const Duration(minutes: 1), + ); + expect(takeoverFence, isNotNull); + await store.releaseCoordinatorLease(scope, leaseFence: fence); + expect( + await store.renewCoordinatorLease( + scope, + leaseFence: takeoverFence!, + now: testEpoch.add(const Duration(seconds: 92)), + leaseDuration: const Duration(minutes: 1), + ), + isTrue, + ); + }); + + test('stale coordinator cannot regress token after lease takeover', () async { + final firstFence = (await store.tryAcquireCoordinatorLease( + scope, + ownerId: 'owner-first', + now: testEpoch, + leaseDuration: const Duration(minutes: 1), + ))!; + final initial = await store.readCheckpoint(scope); + final secondFence = (await store.tryAcquireCoordinatorLease( + scope, + ownerId: 'owner-second', + now: testEpoch.add(const Duration(seconds: 61)), + leaseDuration: const Duration(minutes: 1), + ))!; + expect(secondFence.generation, greaterThan(firstFence.generation)); + + await store.journalShadowFetchedBatch( + CloudFetchBatch( + scope: scope, + changes: [testChange(2)], + batchId: 'second-owner-page', + generation: initial.generation, + nextToken: 'token-newer', + hasMore: false, + ), + now: testEpoch.add(const Duration(seconds: 61)), + budget: CloudShadowJournalBudget(), + leaseFence: secondFence, + expectedGeneration: initial.generation, + expectedFetchedToken: initial.fetchedToken, + ); + + await expectLater( + store.journalShadowFetchedBatch( + CloudFetchBatch( + scope: scope, + changes: [testChange(1)], + batchId: 'stale-first-owner-page', + generation: initial.generation, + nextToken: 'token-stale', + hasMore: false, + ), + now: testEpoch.add(const Duration(seconds: 62)), + budget: CloudShadowJournalBudget(), + leaseFence: firstFence, + expectedGeneration: initial.generation, + expectedFetchedToken: initial.fetchedToken, + ), + throwsA( + isA().having( + (failure) => failure.safeCode, + 'safeCode', + 'coordinator_lease_fence_lost', + ), + ), + ); + + expect((await store.readCheckpoint(scope)).fetchedToken, 'token-newer'); + expect(await store.inboxEntries(scope), hasLength(1)); + }); + + test( + 'same-owner takeover fences fallback inbox transitions and release', + () async { + await _journal( + store, + CloudFetchBatch( + scope: scope, + changes: [testChange(1)], + batchId: 'fallback-fence-page', + generation: 1, + nextToken: 'fallback-token', + hasMore: false, + ), + ); + final staleFence = (await store.tryAcquireCoordinatorLease( + scope, + ownerId: 'same-owner', + now: testEpoch, + leaseDuration: const Duration(minutes: 1), + ))!; + await store.releaseCoordinatorLease(scope, leaseFence: staleFence); + final currentFence = (await store.tryAcquireCoordinatorLease( + scope, + ownerId: 'same-owner', + now: testEpoch, + leaseDuration: const Duration(minutes: 1), + ))!; + + await expectLater( + store.markInboxApplied( + scope, + sequence: 1, + now: testEpoch, + leaseFence: staleFence, + ), + throwsA( + isA().having( + (failure) => failure.safeCode, + 'safeCode', + 'coordinator_lease_fence_lost', + ), + ), + ); + await store.releaseCoordinatorLease(scope, leaseFence: staleFence); + await store.markInboxApplied( + scope, + sequence: 1, + now: testEpoch, + leaseFence: currentFence, + ); + await store.markInboxApplied( + scope, + sequence: 1, + now: testEpoch, + leaseFence: currentFence, + ); + await expectLater( + store.quarantineInbox( + scope, + sequence: 1, + category: CloudFailureCategory.malformedRecord, + now: testEpoch, + leaseFence: currentFence, + ), + throwsA( + isA().having( + (failure) => failure.safeCode, + 'safeCode', + 'inbox_transition_not_pending', + ), + ), + ); + expect((await store.inboxEntries(scope)).single.attemptCount, 0); + }, + ); + + test('pull failure state survives a new engine instance', () async { + final nextTime = testEpoch.add(const Duration(minutes: 1)); + await store.recordPullFailure( + scope, + category: CloudFailureCategory.network, + nextEligibleAt: nextTime, + ); + + final checkpoint = await store.readCheckpoint(scope); + expect(checkpoint.consecutivePullFailures, 1); + expect(checkpoint.nextPullEligibleAt, nextTime); + + await store.recordPullSuccess(scope, now: nextTime); + final recovered = await store.readCheckpoint(scope); + expect(recovered.consecutivePullFailures, 0); + expect(recovered.nextPullEligibleAt, isNull); + }); + + test( + 'server record mapping is assigned once but metadata may advance', + () async { + final original = CloudRecordMapEntry( + scope: scope, + logicalEntityKeyHash: 'logical-key-digest', + serverRecordIdHash: 'server-record-hash', + encryptedServerRecordId: 'protected:server-record', + etagHash: 'etag-a', + updatedAt: testEpoch, + ); + await store.upsertRecordMap(original, generation: 1); + await store.upsertRecordMap( + CloudRecordMapEntry( + scope: scope, + logicalEntityKeyHash: 'logical-key-digest', + serverRecordIdHash: 'server-record-hash', + encryptedServerRecordId: 'protected:server-record', + etagHash: 'etag-b', + updatedAt: testEpoch.add(const Duration(minutes: 1)), + ), + generation: 1, + ); + expect( + (await store.readRecordMap( + scope, + logicalEntityKeyHash: 'logical-key-digest', + generation: 1, + ))!.etagHash, + 'etag-b', + ); + + await expectLater( + store.upsertRecordMap( + CloudRecordMapEntry( + scope: scope, + logicalEntityKeyHash: 'logical-key-digest', + serverRecordIdHash: 'different-server-record-hash', + encryptedServerRecordId: 'protected:different-server-record', + updatedAt: testEpoch, + ), + generation: 1, + ), + throwsA( + isA().having( + (error) => error.safeCode, + 'safeCode', + 'server_mapping_changed', + ), + ), + ); + }, + ); + + test('record mappings cannot cross a checkpoint generation', () async { + final generationOne = CloudRecordMapEntry( + scope: scope, + logicalEntityKeyHash: 'generation-bound-logical-key', + serverRecordIdHash: 'generation-one-server-record', + encryptedServerRecordId: 'protected:generation-one-record', + updatedAt: testEpoch, + ); + await store.upsertRecordMap(generationOne, generation: 1); + await store.advanceOutboxGeneration(scope, now: testEpoch); + + await expectLater( + store.readRecordMap( + scope, + logicalEntityKeyHash: generationOne.logicalEntityKeyHash, + generation: 1, + ), + throwsA( + isA().having( + (failure) => failure.safeCode, + 'safeCode', + 'record_map_generation_mismatch', + ), + ), + ); + expect( + await store.readRecordMap( + scope, + logicalEntityKeyHash: generationOne.logicalEntityKeyHash, + generation: 2, + ), + isNull, + ); + + final generationTwo = CloudRecordMapEntry( + scope: scope, + logicalEntityKeyHash: generationOne.logicalEntityKeyHash, + serverRecordIdHash: 'generation-two-server-record', + encryptedServerRecordId: 'protected:generation-two-record', + updatedAt: testEpoch, + ); + await store.upsertRecordMap(generationTwo, generation: 2); + expect( + (await store.readRecordMap( + scope, + logicalEntityKeyHash: generationOne.logicalEntityKeyHash, + generation: 2, + ))?.serverRecordIdHash, + generationTwo.serverRecordIdHash, + ); + }); + + test('leases only due unknown outcomes in deterministic order', () async { + Future makeUnknown( + CloudOutboxOperation operation, { + DateTime? nextEligibleAt, + }) async { + await store.enqueueOutbox(operation); + await store.leaseEligibleOutbox( + scope, + now: testEpoch, + limit: 1, + leaseId: 'seed-${operation.operationId}', + leaseDuration: const Duration(minutes: 1), + allowedActions: const {CloudOutboxAction.save}, + ); + await store.markOutboxSubmissionStarted( + scope, + leaseId: 'seed-${operation.operationId}', + submissionIdentity: testSubmissionIdentity([operation.operationId]), + now: testEpoch, + ); + await store.applyOutboxTransitions( + scope, + leaseId: 'seed-${operation.operationId}', + transitions: [ + CloudOutboxTransition.unknownOutcome( + operation.operationId, + nextEligibleAt: nextEligibleAt, + ), + ], + now: testEpoch, + ); + } + + final live = testOutboxOperation(scope, 102, revision: 2); + final expired = testOutboxOperation(scope, 105, revision: 5); + await makeUnknown(live); + await store.leaseUnknownOutcomes( + scope, + now: testEpoch, + limit: 1, + leaseId: 'live-unknown-lease', + leaseDuration: const Duration(hours: 1), + ); + + final backoff = testOutboxOperation(scope, 103, revision: 3); + final backoffUntil = testEpoch.add(const Duration(hours: 1)); + await makeUnknown(backoff, nextEligibleAt: backoffUntil); + await makeUnknown(expired); + await store.leaseUnknownOutcomes( + scope, + now: testEpoch, + limit: 1, + leaseId: 'expired-unknown-lease', + leaseDuration: const Duration(seconds: 1), + ); + final due = testOutboxOperation(scope, 101, revision: 1); + await makeUnknown(due); + final pending = testOutboxOperation(scope, 104, revision: 4); + await store.enqueueOutbox(pending); + + final takeoverAt = testEpoch.add(const Duration(seconds: 2)); + final leased = await store.leaseUnknownOutcomes( + scope, + now: takeoverAt, + limit: 10, + leaseId: 'reconcile-lease', + leaseDuration: const Duration(minutes: 1), + ); + + expect(leased.map((operation) => operation.operationId), [ + due.operationId, + expired.operationId, + ]); + expect( + leased, + everyElement( + isA() + .having( + (operation) => operation.status, + 'status', + CloudOutboxStatus.unknownOutcome, + ) + .having( + (operation) => operation.leaseId, + 'leaseId', + 'reconcile-lease', + ), + ), + ); + final rows = await store.outboxEntries(scope); + expect( + rows.singleWhere((row) => row.operationId == live.operationId).leaseId, + 'live-unknown-lease', + ); + expect( + rows.singleWhere((row) => row.operationId == backoff.operationId).leaseId, + isNull, + ); + expect( + rows.singleWhere((row) => row.operationId == pending.operationId).status, + CloudOutboxStatus.pending, + ); + }); + + test( + 'unknown transition persists reconciliation backoff and clears its lease', + () async { + final operation = testOutboxOperation(scope, 106); + await store.enqueueOutbox(operation); + await store.leaseEligibleOutbox( + scope, + now: testEpoch, + limit: 1, + leaseId: 'seed-backoff-lease', + leaseDuration: const Duration(minutes: 1), + allowedActions: const {CloudOutboxAction.save}, + ); + await store.markOutboxSubmissionStarted( + scope, + leaseId: 'seed-backoff-lease', + submissionIdentity: testSubmissionIdentity([operation.operationId]), + now: testEpoch, + ); + await store.applyOutboxTransitions( + scope, + leaseId: 'seed-backoff-lease', + transitions: [ + CloudOutboxTransition.unknownOutcome(operation.operationId), + ], + now: testEpoch, + ); + + final retryAt = testEpoch.add(const Duration(minutes: 5)); + await store.leaseUnknownOutcomes( + scope, + now: testEpoch, + limit: 1, + leaseId: 'reconcile-backoff-lease', + leaseDuration: const Duration(minutes: 1), + ); + await store.applyOutboxTransitions( + scope, + leaseId: 'reconcile-backoff-lease', + transitions: [ + CloudOutboxTransition.unknownOutcome( + operation.operationId, + nextEligibleAt: retryAt, + ), + ], + now: testEpoch, + ); + + var row = (await store.outboxEntries(scope)).single; + expect(row.status, CloudOutboxStatus.unknownOutcome); + expect(row.nextEligibleAt, retryAt); + expect(row.leaseId, isNull); + expect( + await store.leaseUnknownOutcomes( + scope, + now: retryAt.subtract(const Duration(seconds: 1)), + limit: 1, + leaseId: 'too-early-lease', + leaseDuration: const Duration(minutes: 1), + ), + isEmpty, + ); + final eligible = await store.leaseUnknownOutcomes( + scope, + now: retryAt, + limit: 1, + leaseId: 'due-again-lease', + leaseDuration: const Duration(minutes: 1), + ); + expect(eligible.single.operationId, operation.operationId); + row = (await store.outboxEntries(scope)).single; + expect(row.status, CloudOutboxStatus.unknownOutcome); + expect(row.leaseId, 'due-again-lease'); + }, + ); + + test('unknown-outcome leasing isolates account and generation', () async { + final otherScope = testScope(account: testAccountFingerprintB); + final other = testOutboxOperation(otherScope, 107); + await store.enqueueOutbox(other); + await store.leaseEligibleOutbox( + otherScope, + now: testEpoch, + limit: 1, + leaseId: 'other-seed-lease', + leaseDuration: const Duration(minutes: 1), + allowedActions: const {CloudOutboxAction.save}, + ); + await store.markOutboxSubmissionStarted( + otherScope, + leaseId: 'other-seed-lease', + submissionIdentity: testSubmissionIdentity([other.operationId]), + now: testEpoch, + ); + await store.applyOutboxTransitions( + otherScope, + leaseId: 'other-seed-lease', + transitions: [CloudOutboxTransition.unknownOutcome(other.operationId)], + now: testEpoch, + ); + + final stale = testOutboxOperation(scope, 108); + await store.enqueueOutbox(stale); + await store.leaseEligibleOutbox( + scope, + now: testEpoch, + limit: 1, + leaseId: 'stale-seed-lease', + leaseDuration: const Duration(minutes: 1), + allowedActions: const {CloudOutboxAction.save}, + ); + await store.markOutboxSubmissionStarted( + scope, + leaseId: 'stale-seed-lease', + submissionIdentity: testSubmissionIdentity([stale.operationId]), + now: testEpoch, + ); + await store.applyOutboxTransitions( + scope, + leaseId: 'stale-seed-lease', + transitions: [CloudOutboxTransition.unknownOutcome(stale.operationId)], + now: testEpoch, + ); + await store.advanceOutboxGeneration(scope, now: testEpoch); + + expect( + await store.leaseUnknownOutcomes( + scope, + now: testEpoch, + limit: 10, + leaseId: 'scope-lease', + leaseDuration: const Duration(minutes: 1), + ), + isEmpty, + ); + final otherLeased = await store.leaseUnknownOutcomes( + otherScope, + now: testEpoch, + limit: 1, + leaseId: 'other-reconcile-lease', + leaseDuration: const Duration(minutes: 1), + ); + expect(otherLeased.single.operationId, other.operationId); + expect( + (await store.outboxEntries(scope)).single.status, + CloudOutboxStatus.quarantined, + ); + }); +} + +Future _journal( + InMemoryCloudSyncStore store, + CloudFetchBatch batch, +) async { + const ownerId = 'general-journal-owner'; + final fence = (await store.tryAcquireCoordinatorLease( + batch.scope, + ownerId: ownerId, + now: testEpoch, + leaseDuration: const Duration(hours: 1), + ))!; + final checkpoint = await store.readCheckpoint(batch.scope); + try { + return await store.journalFetchedBatch( + batch, + now: testEpoch, + leaseFence: fence, + expectedGeneration: checkpoint.generation, + expectedFetchedToken: checkpoint.fetchedToken, + ); + } finally { + await store.releaseCoordinatorLease(batch.scope, leaseFence: fence); + } +} diff --git a/test/services/cloud_sync/legacy_cloudkit_deletion_intents_test.dart b/test/services/cloud_sync/legacy_cloudkit_deletion_intents_test.dart new file mode 100644 index 0000000000..e9ce54fc30 --- /dev/null +++ b/test/services/cloud_sync/legacy_cloudkit_deletion_intents_test.dart @@ -0,0 +1,298 @@ +import 'dart:io'; + +import 'package:bluebubbles/database/models.dart'; +import 'package:bluebubbles/services/rustpush/cloud_sync/cloudkit_writer_authority.dart'; +import 'package:bluebubbles/services/rustpush/cloud_sync/cloudkit_writer_ownership.dart'; +import 'package:bluebubbles/services/rustpush/cloud_sync/legacy_cloudkit_deletion_intents.dart'; +import 'package:flutter_test/flutter_test.dart'; +import 'package:shared_preferences/shared_preferences.dart'; + +void main() { + late Directory directory; + late Store objectBox; + late LegacyCloudKitDeletionIntentStore deletionStore; + late ObjectBoxCloudKitWriterAuthority authority; + + setUp(() async { + directory = await Directory.systemTemp.createTemp( + 'openbubbles-legacy-cloudkit-deletion-', + ); + objectBox = await openStore(directory: directory.path); + authority = ObjectBoxCloudKitWriterAuthority.forTest( + store: objectBox, + buildDecision: const CloudKitWriterOwnershipDecision( + owner: CloudKitWriterOwner.legacy, + configurationValid: true, + ), + ); + deletionStore = LegacyCloudKitDeletionIntentStore( + store: objectBox, + authority: authority, + ); + }); + + tearDown(() async { + if (!objectBox.isClosed()) objectBox.close(); + if (directory.existsSync()) { + await directory.delete(recursive: true); + } + }); + + CloudKitWriterAuthoritySnapshot provision(CloudKitWriterScope scope) { + final initial = ObjectBoxCloudKitWriterAuthority.forTest( + store: objectBox, + buildDecision: const CloudKitWriterOwnershipDecision( + owner: CloudKitWriterOwner.none, + configurationValid: true, + ), + ).initializeDisabled(scope, now: _time(0)); + return authority.provisionInitialOwner( + scope, + owner: CloudKitWriterOwner.legacy, + expectedEpoch: initial.epoch, + evidence: const CloudKitWriterTransitionEvidence.forTest( + operationsQuiesced: true, + activeIdentityRevalidated: true, + legacyMutationQueues: LegacyMutationQueueDisposition.empty, + ), + now: _time(1), + ); + } + + test('an intent admitted under account A cannot flush under account B', () { + final scopeA = _scope('A'); + final scopeB = _scope('B'); + final authorityA = provision(scopeA); + provision(scopeB); + + deletionStore.enqueue( + context: LegacyCloudKitDeletionContext( + scope: scopeA, + writerEpoch: authorityA.epoch, + ), + kind: LegacyCloudKitDeletionKind.message, + recordId: 'message-a', + now: _time(2), + ); + + expect( + deletionStore.pendingForFlush( + scope: scopeB, + writerEpoch: 2, + kind: LegacyCloudKitDeletionKind.message, + ), + isEmpty, + ); + expect( + deletionStore + .pendingForFlush( + scope: scopeA, + writerEpoch: authorityA.epoch, + kind: LegacyCloudKitDeletionKind.message, + ) + .map((intent) => intent.recordId), + ['message-a'], + ); + }); + + test('a stale writer epoch cannot flush and is quarantined', () { + final scope = _scope('A'); + final current = provision(scope); + + deletionStore.enqueue( + context: LegacyCloudKitDeletionContext( + scope: scope, + writerEpoch: current.epoch - 1, + ), + kind: LegacyCloudKitDeletionKind.attachment, + recordId: 'attachment-stale', + now: _time(2), + ); + + expect( + deletionStore.pendingForFlush( + scope: scope, + writerEpoch: current.epoch, + kind: LegacyCloudKitDeletionKind.attachment, + ), + isEmpty, + ); + final row = objectBox.box().getAll().single; + expect(row.state, 1); + expect(row.quarantineReason, 'writer_epoch_stale'); + }); + + test('a caller holding an old epoch cannot select a current intent', () { + final scope = _scope('A'); + final current = provision(scope); + deletionStore.enqueue( + context: LegacyCloudKitDeletionContext( + scope: scope, + writerEpoch: current.epoch, + ), + kind: LegacyCloudKitDeletionKind.chat, + recordId: 'chat-current', + now: _time(2), + ); + + expect( + deletionStore.pendingForFlush( + scope: scope, + writerEpoch: current.epoch - 1, + kind: LegacyCloudKitDeletionKind.chat, + ), + isEmpty, + ); + expect( + deletionStore + .pendingForFlush( + scope: scope, + writerEpoch: current.epoch, + kind: LegacyCloudKitDeletionKind.chat, + ) + .single + .recordId, + 'chat-current', + ); + }); + + test( + 'legacy preference values are durably quarantined and never pending', + () async { + SharedPreferences.setMockInitialValues({ + LegacyCloudKitDeletionIntentStore.legacyMessageKey: ['message-old'], + LegacyCloudKitDeletionIntentStore.legacyAttachmentKey: [ + 'attachment-old', + ], + LegacyCloudKitDeletionIntentStore.legacyChatKey: ['chat-old'], + }); + final prefs = await SharedPreferences.getInstance(); + + final inserted = await deletionStore + .quarantineLegacySharedPreferenceQueues(prefs, now: _time(2)); + + expect(inserted, 3); + expect(deletionStore.pendingCount, 0); + expect(deletionStore.quarantineEvidenceCount, 3); + expect( + prefs.get(LegacyCloudKitDeletionIntentStore.legacyMessageKey), + isNull, + ); + expect( + prefs.get(LegacyCloudKitDeletionIntentStore.legacyAttachmentKey), + isNull, + ); + expect( + prefs.get(LegacyCloudKitDeletionIntentStore.legacyChatKey), + isNull, + ); + }, + ); + + test( + 'legacy preference inventory counts entries and malformed values', + () async { + SharedPreferences.setMockInitialValues({ + LegacyCloudKitDeletionIntentStore.legacyMessageKey: [ + 'message-a', + 'message-b', + ], + LegacyCloudKitDeletionIntentStore.legacyAttachmentKey: 'malformed', + }); + final prefs = await SharedPreferences.getInstance(); + + expect(deletionStore.legacySharedPreferenceQueueEntryCount(prefs), 3); + }, + ); + + test('pending count matches the full scope across writer epochs', () { + final scope = _scope('A'); + deletionStore.enqueue( + context: LegacyCloudKitDeletionContext(scope: scope, writerEpoch: 1), + kind: LegacyCloudKitDeletionKind.message, + recordId: 'message-epoch-1', + now: _time(2), + ); + deletionStore.enqueue( + context: LegacyCloudKitDeletionContext(scope: scope, writerEpoch: 99), + kind: LegacyCloudKitDeletionKind.attachment, + recordId: 'attachment-epoch-99', + now: _time(3), + ); + + expect(deletionStore.pendingCountForScope(scope), 2); + }); + + test('pending count excludes another account and container', () { + final scope = _scope('A'); + deletionStore.enqueue( + context: LegacyCloudKitDeletionContext(scope: scope, writerEpoch: 1), + kind: LegacyCloudKitDeletionKind.message, + recordId: 'message-matching', + now: _time(2), + ); + deletionStore.enqueue( + context: LegacyCloudKitDeletionContext( + scope: _scope('B'), + writerEpoch: 1, + ), + kind: LegacyCloudKitDeletionKind.message, + recordId: 'message-other-account', + now: _time(3), + ); + deletionStore.enqueue( + context: LegacyCloudKitDeletionContext( + scope: _scope('A', container: 'com.example.other'), + writerEpoch: 1, + ), + kind: LegacyCloudKitDeletionKind.message, + recordId: 'message-other-container', + now: _time(4), + ); + + expect(deletionStore.pendingCountForScope(scope), 1); + }); + + test('pending count excludes quarantined rows in the same scope', () { + final scope = _scope('A'); + deletionStore.enqueue( + context: LegacyCloudKitDeletionContext(scope: scope, writerEpoch: 1), + kind: LegacyCloudKitDeletionKind.message, + recordId: 'message-quarantined', + now: _time(2), + ); + deletionStore.enqueue( + context: LegacyCloudKitDeletionContext(scope: scope, writerEpoch: 2), + kind: LegacyCloudKitDeletionKind.message, + recordId: 'message-pending', + now: _time(3), + ); + + expect( + deletionStore.quarantineStale( + scope: scope, + currentWriterEpoch: 2, + now: _time(4), + ), + 1, + ); + expect(deletionStore.pendingCountForScope(scope), 1); + }); + + test('pending count is zero when the scope has no pending rows', () { + expect(deletionStore.pendingCountForScope(_scope('A')), 0); + }); +} + +CloudKitWriterScope _scope( + String suffix, { + String container = 'com.apple.messages.cloud', +}) => CloudKitWriterScope( + accountFingerprint: suffix == 'A' + ? 'AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA' + : 'BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB', + container: container, +); + +DateTime _time(int seconds) => + DateTime.fromMillisecondsSinceEpoch(seconds * 1000, isUtc: true); diff --git a/test/services/cloud_sync/native_protected_bridge_source_contract_test.dart b/test/services/cloud_sync/native_protected_bridge_source_contract_test.dart new file mode 100644 index 0000000000..075948b7c1 --- /dev/null +++ b/test/services/cloud_sync/native_protected_bridge_source_contract_test.dart @@ -0,0 +1,80 @@ +import 'dart:io'; + +import 'package:flutter_test/flutter_test.dart'; + +void main() { + test('generated protected DTOs expose no raw CloudKit material', () { + final source = File('lib/src/rust/api/api.dart').readAsStringSync(); + final start = source.indexOf('class CloudSyncProtectedChange {'); + final end = source.indexOf('enum CloudSyncProtectedSafeCode {'); + expect(start, greaterThanOrEqualTo(0)); + expect(end, greaterThan(start)); + + final protectedSurface = source.substring(start, end); + final forbidden = [ + RegExp(r'\brecordName\b'), + RegExp(r'\betag\b'), + RegExp(r'\bcontinuationToken\b'), + RegExp(r'\bencryptedRecord\b'), + RegExp(r'\btombstonePayload\b'), + RegExp(r'\bcredentials\b'), + RegExp(r'\bplaintext\b'), + RegExp(r'\bstorageDirectory\b'), + RegExp(r'\bfilePath\b'), + ]; + + for (final pattern in forbidden) { + expect( + pattern.hasMatch(protectedSurface), + isFalse, + reason: 'generated protected DTO boundary exposed ${pattern.pattern}', + ); + } + }); + + test( + 'protected transport is constructed only by compile-gated canary adapters', + () { + final constructors = []; + const allowed = + 'lib/services/rustpush/cloud_sync/cloud_sync_production_sampler_adapter.dart'; + + for (final entity in Directory('lib').listSync(recursive: true)) { + if (entity is! File || !entity.path.endsWith('.dart')) continue; + final normalizedPath = entity.path.replaceAll(r'\', '/'); + if (normalizedPath.endsWith( + '/services/rustpush/cloud_sync/native_protected_cloud_sync_transport.dart', + )) { + continue; + } + if (entity.readAsStringSync().contains( + 'NativeProtectedCloudSyncTransport(', + )) { + constructors.add(entity.path); + } + } + + final normalized = constructors + .map((path) => path.replaceAll(r'\', '/')) + .toList(growable: false); + expect( + normalized, + [allowed], + reason: + 'only explicit compile-gated canary adapters may construct the protected transport', + ); + + final adapter = File(allowed).readAsStringSync(); + expect( + RegExp( + r'NativeProtectedCloudSyncTransport\(', + ).allMatches(adapter).length, + 3, + reason: + 'shadow, semantic pull, and one-text outbound are the only protected transport compositions', + ); + expect(adapter, contains('NativeProtectedCloudSyncBindings?')); + expect(adapter, isNot(contains('RustCloudSyncTransport('))); + }, + ); +} diff --git a/test/services/cloud_sync/native_protected_cloud_sync_transport_test.dart b/test/services/cloud_sync/native_protected_cloud_sync_transport_test.dart new file mode 100644 index 0000000000..fa641adca9 --- /dev/null +++ b/test/services/cloud_sync/native_protected_cloud_sync_transport_test.dart @@ -0,0 +1,1344 @@ +import 'dart:async'; + +import 'package:bluebubbles/services/rustpush/cloud_sync/cloud_sync.dart'; +import 'package:bluebubbles/services/rustpush/cloud_sync/cloud_sync_write_transport.dart'; +import 'package:bluebubbles/src/rust/api/api.dart' as frb_api; +import 'package:flutter_test/flutter_test.dart'; + +void main() { + late _FakeBindings bindings; + late NativeProtectedCloudSyncTransport transport; + late CloudSyncScope scope; + + setUp(() { + bindings = _FakeBindings(); + transport = NativeProtectedCloudSyncTransport( + cloudMessagesClient: Object(), + storageDirectory: 'private-storage', + protectedStoreIdentity: _storeIdentity, + bindings: bindings, + ); + scope = CloudSyncScope( + accountFingerprint: _hash('A'), + container: 'com.apple.messages.cloud', + database: 'private', + zone: 'messageManateeZone', + streamKind: CloudSyncStreamKind.messages, + schemaVersion: 2, + ); + }); + + test( + 'maps only native hashes and protected references into one batch', + () async { + bindings.fetchResult = NativeProtectedFetchResult( + page: NativeProtectedPage( + changes: [ + NativeProtectedChange( + changeId: _hash('C'), + recordIdHash: _hash('R'), + etagHash: _hash('E'), + kind: NativeProtectedChangeKind.save, + payloadSha256: _sha('a'), + payloadLength: 4, + protectedRecordIdentityReference: _reference('I'), + protectedRawEnvelopeReference: _reference('P'), + serverModifiedAtMillis: 1234, + isTombstone: false, + ), + ], + batchId: _hash('B'), + generation: 7, + pageLeaseReference: _lease('1'), + protectedNextCheckpointReference: _reference('N'), + complete: false, + admittedRawBytes: 512, + ), + ); + + final batch = await transport.fetchChanges( + scope, + previousToken: _reference('O'), + generation: 7, + limit: 500, + ); + + expect(bindings.maximumChanges, 200); + expect(bindings.expectedAccountFingerprint, _hash('A')); + expect(bindings.previousCheckpointReference, _reference('O')); + expect(batch.batchId, _hash('B')); + expect(batch.nextToken, _reference('N')); + expect(batch.protectedPageLeaseReference, _lease('1')); + expect(batch.hasMore, isTrue); + final change = batch.changes.single; + expect(change.changeId, _hash('C')); + expect(change.recordIdHash, _hash('R')); + expect(change.encryptedServerRecordId, _reference('I')); + expect(change.encryptedPayloadReference, _reference('P')); + expect(change.protectedSystemFieldsReference, isNull); + expect( + change.serverModifiedAt, + DateTime.fromMillisecondsSinceEpoch(1234, isUtc: true), + ); + expect(change.preflightFailure, isNull); + }, + ); + + test( + 'accepts the expanded protected-zone allowlist without remapping', + () async { + bindings.fetchResult = _validEmptyFetchResult(); + final cases = <(String zone, String stream)>[ + ('chatManateeZone', 'chats'), + ('messageManateeZone', 'messages'), + ('attachmentManateeZone', 'attachments'), + ('messageUpdateZone', 'messageUpdateZone'), + ('recoverableMessageDeleteZone', 'recoverableMessageDeleteZone'), + ('scheduledMessageZone', 'scheduledMessageZone'), + ('chat1ManateeZone', 'chat1ManateeZone'), + ]; + + for (final (zone, stream) in cases) { + final batch = await transport.fetchChanges( + CloudSyncScope( + accountFingerprint: _hash('A'), + container: 'com.apple.messages.cloud', + database: 'private', + zone: zone, + streamKind: CloudSyncStreamKind.messages, + schemaVersion: 2, + ), + previousToken: null, + generation: 1, + limit: 1, + ); + expect(batch.changes, isEmpty); + expect(bindings.stream, stream); + } + }, + ); + + test( + 'quarantined tombstone preserves delete shape without raw material', + () async { + bindings.fetchResult = NativeProtectedFetchResult( + page: NativeProtectedPage( + changes: [ + NativeProtectedChange( + changeId: _hash('C'), + recordIdHash: _hash('R'), + kind: NativeProtectedChangeKind.quarantined, + payloadSha256: _sha('b'), + payloadLength: 9 * 1024 * 1024, + protectedRecordIdentityReference: _reference('I'), + protectedRawEnvelopeReference: _reference('P'), + preflightCode: NativeProtectedPreflightCode.oversizedRecord, + isTombstone: true, + ), + ], + batchId: _hash('B'), + generation: 1, + pageLeaseReference: _lease('2'), + complete: true, + admittedRawBytes: 9 * 1024 * 1024, + ), + ); + + final batch = await transport.fetchChanges( + scope, + previousToken: null, + generation: 1, + limit: 20, + ); + + final change = batch.changes.single; + expect(change.type, CloudChangeType.delete); + expect(change.isTombstone, isTrue); + expect(change.preflightFailure, CloudFailureCategory.malformedRecord); + }, + ); + + test('typed native retry survives without server text', () async { + bindings.fetchResult = const NativeProtectedFetchResult( + failure: NativeProtectedFailure( + category: NativeProtectedFailureCategory.throttled, + safeCode: 'http_throttled', + retryAfterSeconds: 91, + ), + ); + + await expectLater( + transport.fetchChanges( + scope, + previousToken: null, + generation: 1, + limit: 20, + ), + throwsA( + isA() + .having((failure) => failure.safeCode, 'safeCode', 'http_throttled') + .having( + (failure) => failure.retryAfter, + 'retryAfter', + const Duration(seconds: 91), + ), + ), + ); + }); + + test('malformed native capability fails closed before journaling', () async { + bindings.fetchResult = NativeProtectedFetchResult( + page: NativeProtectedPage( + changes: [ + NativeProtectedChange( + changeId: _hash('C'), + recordIdHash: _hash('R'), + kind: NativeProtectedChangeKind.save, + payloadSha256: _sha('a'), + payloadLength: 1, + protectedRecordIdentityReference: 'raw/server/identifier', + protectedRawEnvelopeReference: _reference('P'), + isTombstone: false, + ), + ], + batchId: _hash('B'), + generation: 1, + pageLeaseReference: _lease('3'), + complete: true, + admittedRawBytes: 1, + ), + ); + + await expectLater( + transport.fetchChanges( + scope, + previousToken: null, + generation: 1, + limit: 20, + ), + throwsA( + isA().having( + (failure) => failure.safeCode, + 'safeCode', + 'invalid_protected_change', + ), + ), + ); + }); + + test('lease recovery accepts only exact adopted subsets', () async { + final leaseA = _lease('a'); + final leaseB = _lease('b'); + bindings.recoveryResult = NativeProtectedRecoveryResult( + recovery: NativeProtectedRecovery( + finalizedAdoptedLeaseReferences: [leaseA], + absentAdoptedLeaseReferences: [leaseB], + rolledBackCount: 0, + removedTemporaryFilesCount: 0, + hasMore: false, + ), + ); + + final recovery = await transport.recoverProtectedPageLeases( + {leaseB, leaseA}, + CloudProtectedReferenceSnapshot( + references: {_reference('B'), _reference('A')}, + isComplete: true, + ), + ); + + expect(bindings.adoptedLeaseReferences, [leaseA, leaseB]); + expect(bindings.liveReferences, [_reference('A'), _reference('B')]); + expect(bindings.liveReferenceEnumerationComplete, isTrue); + expect(recovery.finalizedAdoptedLeaseReferences, {leaseA}); + expect(recovery.absentAdoptedLeaseReferences, {leaseB}); + }); + + test('lease methods reject non-opaque values before native access', () async { + await expectLater( + transport.commitProtectedPageLease('C:/raw/protected/path', const {}), + throwsA( + isA().having( + (failure) => failure.safeCode, + 'safeCode', + 'invalid_lease_reference', + ), + ), + ); + expect(bindings.commitCalls, 0); + }); + + test('commit passes an exact sorted retained subset to native', () async { + await transport.commitProtectedPageLease(_lease('a'), { + _reference('C'), + _reference('A'), + }); + + expect(bindings.committedLeaseReference, _lease('a')); + expect(bindings.retainedReferences, [_reference('A'), _reference('C')]); + }); + + test( + 'incomplete reference enumeration fails closed before native recovery and GC', + () async { + final incomplete = CloudProtectedReferenceSnapshot( + references: {_reference('A')}, + isComplete: false, + ); + + await expectLater( + transport.recoverProtectedPageLeases({_lease('a')}, incomplete), + throwsA( + isA().having( + (failure) => failure.safeCode, + 'safeCode', + 'protected_reference_enumeration_incomplete', + ), + ), + ); + await expectLater( + transport.collectProtectedGarbage(incomplete), + throwsA(isA()), + ); + expect(bindings.recoveryCalls, 0); + expect(bindings.garbageCollectionCalls, 0); + }, + ); + + test( + 'bounded garbage collection result maps without exposing capabilities', + () async { + bindings.garbageCollectionResult = + const NativeProtectedGarbageCollectionResult( + collection: NativeProtectedGarbageCollection( + scannedCount: 64, + firstObservedCount: 20, + deletedCount: 10, + preservedLiveCount: 30, + preservedActiveLeaseCount: 4, + hasMore: true, + ), + ); + + final result = await transport.collectProtectedGarbage( + CloudProtectedReferenceSnapshot( + references: {_reference('B'), _reference('A')}, + isComplete: true, + ), + ); + + expect(bindings.garbageCollectionLiveReferences, [ + _reference('A'), + _reference('B'), + ]); + expect(result.scannedCount, 64); + expect(result.deletedCount, 10); + expect(result.hasMore, isTrue); + }, + ); + + test( + 'same store identity serializes every native operation across wrappers', + () async { + bindings.fetchResult = _validEmptyFetchResult(); + bindings.recoveryResult = const NativeProtectedRecoveryResult( + recovery: NativeProtectedRecovery( + finalizedAdoptedLeaseReferences: [], + absentAdoptedLeaseReferences: [], + rolledBackCount: 0, + removedTemporaryFilesCount: 0, + hasMore: false, + ), + ); + final secondTransport = NativeProtectedCloudSyncTransport( + cloudMessagesClient: Object(), + storageDirectory: 'same-private-storage', + protectedStoreIdentity: _storeIdentity, + bindings: bindings, + ); + final entered = []; + final releases = >{}; + bindings.beforeOperation = (operation) { + entered.add(operation); + final release = Completer(); + releases[operation] = release; + return release.future; + }; + + final operations = >[ + transport + .fetchChanges(scope, previousToken: null, generation: 1, limit: 1) + .then((_) => null), + secondTransport + .recoverProtectedPageLeases( + const {}, + CloudProtectedReferenceSnapshot(references: {}, isComplete: true), + ) + .then((_) => null), + transport + .commitProtectedPageLease(_lease('1'), const {}) + .then((_) => null), + secondTransport + .acknowledgeCommittedPageLease(_lease('2')) + .then((_) => null), + transport + .rollbackProtectedPageLease(_lease('3')) + .then((_) => null), + secondTransport + .retireProtectedReferences({_reference('R')}) + .then((_) => null), + transport + .collectProtectedGarbage( + CloudProtectedReferenceSnapshot(references: {}, isComplete: true), + ) + .then((_) => null), + ]; + + const expectedOrder = [ + 'fetch', + 'recover', + 'commit', + 'acknowledge', + 'rollback', + 'retire', + 'garbageCollection', + ]; + await _waitFor(() => entered.isNotEmpty); + expect(entered, ['fetch']); + for (var index = 0; index < expectedOrder.length; index++) { + final operation = expectedOrder[index]; + releases[operation]!.complete(); + if (index + 1 < expectedOrder.length) { + await _waitFor(() => entered.length == index + 2); + expect(entered, expectedOrder.take(index + 2)); + } + } + await Future.wait(operations); + expect(entered, expectedOrder); + }, + ); + + test('same identity nesting is reentrant and cannot deadlock', () async { + bindings.fetchResult = _validEmptyFetchResult(); + final entered = []; + bindings.beforeOperation = (operation) async { + entered.add(operation); + if (operation == 'fetch') { + await transport.acknowledgeCommittedPageLease(_lease('a')); + } + }; + + await transport + .runProtectedStoreExclusive( + () => transport.fetchChanges( + scope, + previousToken: null, + generation: 1, + limit: 1, + ), + ) + .timeout(const Duration(seconds: 1)); + + expect(entered, ['fetch', 'acknowledge']); + }); + + test( + 'recovery and GC cannot enter the fetch-to-commit crash window', + () async { + bindings.fetchResult = _validEmptyFetchResult(); + bindings.recoveryResult = const NativeProtectedRecoveryResult( + recovery: NativeProtectedRecovery( + finalizedAdoptedLeaseReferences: [], + absentAdoptedLeaseReferences: [], + rolledBackCount: 0, + removedTemporaryFilesCount: 0, + hasMore: false, + ), + ); + final entered = []; + bindings.beforeOperation = (operation) async { + entered.add(operation); + }; + final fetched = Completer(); + final allowCommit = Completer(); + final lifecycle = transport.runProtectedStoreExclusive(() async { + await transport.fetchChanges( + scope, + previousToken: null, + generation: 1, + limit: 1, + ); + fetched.complete(); + await allowCommit.future; + await transport.commitProtectedPageLease(_lease('f'), const {}); + }); + await fetched.future; + + final recovery = transport.recoverProtectedPageLeases( + const {}, + CloudProtectedReferenceSnapshot(references: const {}, isComplete: true), + ); + final garbageCollection = transport.collectProtectedGarbage( + CloudProtectedReferenceSnapshot(references: const {}, isComplete: true), + ); + await Future.delayed(Duration.zero); + expect(entered, ['fetch']); + + allowCommit.complete(); + await Future.wait([lifecycle, recovery, garbageCollection]); + expect(entered, ['fetch', 'commit', 'recover', 'garbageCollection']); + }, + ); + + test( + 'different protected store identities do not block each other', + () async { + final bindingsA = _FakeBindings()..fetchResult = _validEmptyFetchResult(); + final bindingsB = _FakeBindings()..fetchResult = _validEmptyFetchResult(); + final entered = []; + final release = Completer(); + bindingsA.beforeOperation = (operation) async { + entered.add('A:$operation'); + await release.future; + }; + bindingsB.beforeOperation = (operation) async { + entered.add('B:$operation'); + await release.future; + }; + final transportA = NativeProtectedCloudSyncTransport( + cloudMessagesClient: Object(), + storageDirectory: 'private-storage-a', + protectedStoreIdentity: 'obcs2.store.${_hash('A')}', + bindings: bindingsA, + ); + final transportB = NativeProtectedCloudSyncTransport( + cloudMessagesClient: Object(), + storageDirectory: 'private-storage-b', + protectedStoreIdentity: 'obcs2.store.${_hash('B')}', + bindings: bindingsB, + ); + + final fetchA = transportA.fetchChanges( + scope, + previousToken: null, + generation: 1, + limit: 1, + ); + final fetchB = transportB.fetchChanges( + scope, + previousToken: null, + generation: 1, + limit: 1, + ); + await _waitFor(() => entered.length == 2); + expect(entered.toSet(), {'A:fetch', 'B:fetch'}); + release.complete(); + await Future.wait([fetchA, fetchB]); + }, + ); + + test('same identity queue is bounded and fails closed', () async { + final release = Completer(); + bindings.beforeOperation = (_) => release.future; + final accepted = List>.generate( + 64, + (_) => transport.acknowledgeCommittedPageLease(_lease('a')), + ); + final overflow = transport.acknowledgeCommittedPageLease(_lease('b')); + + await expectLater( + overflow, + throwsA( + isA().having( + (failure) => failure.safeCode, + 'safeCode', + 'protected_store_operation_queue_bound_exceeded', + ), + ), + ); + release.complete(); + await Future.wait(accepted); + }); + + test( + 'quiesce joins the original native future after Dart timeout detaches', + () async { + bindings.fetchResult = _validEmptyFetchResult(); + final nativeRelease = Completer(); + bindings.beforeOperation = (operation) async { + if (operation == 'fetch') await nativeRelease.future; + }; + + final detached = transport + .fetchChanges(scope, previousToken: null, generation: 1, limit: 1) + .timeout(const Duration(milliseconds: 5)); + await expectLater(detached, throwsA(isA())); + + var quiesced = false; + final quiescence = transport.quiesceNativeOperations().then((_) { + quiesced = true; + }); + await Future.delayed(Duration.zero); + expect(quiesced, isFalse); + await expectLater( + transport.rollbackProtectedPageLease(_lease('a')), + throwsA( + isA().having( + (failure) => failure.safeCode, + 'safeCode', + 'protected_store_operation_admission_closed', + ), + ), + ); + + nativeRelease.complete(); + await quiescence; + expect(quiesced, isTrue); + }, + ); + + test('protected writer forwards one exact prepared create binding', () async { + final operation = _writeOperation(scope); + final protectedOperation = _protectedWriteOperation(operation); + final identity = _submissionIdentity(operation.operationId); + bindings.prepareResult = frb_api.CloudSyncPreparedMessageCreateResult( + handle: _FakePreparedHandle(), + ); + + final prepared = await transport.prepareSubmission( + scope, + submissionIdentity: identity, + operations: [protectedOperation], + ); + + expect(prepared.operationIds, [operation.operationId]); + expect(bindings.preparedRequestUuid, identity.requestUuid); + final input = bindings.preparedInputs.single; + expect(input.localOperationId, operation.operationId); + expect(input.logicalEntityKeyHash, operation.logicalEntityKeyHash); + expect(input.protectedLeaseReference, operation.protectedLeaseReference); + expect( + input.protectedPayloadReference, + operation.encryptedPayloadReference, + ); + expect( + input.protectedServerRecordReference, + operation.encryptedPayloadReference, + ); + expect(input.payloadSha256, operation.payloadSha256); + expect(input.serverRecordIdHash, operation.serverRecordIdHash); + expect( + input.appleOperationUuid, + identity.operationUuids[operation.operationId], + ); + }); + + test( + 'protected writer rejects a well-formed but wrong operation identity', + () async { + final operation = _writeOperation(scope); + final wrongOperationId = 'op1:${_sha('f')}'; + final protectedOperation = CloudSyncProtectedWriteOperation( + operationId: wrongOperationId, + logicalEntityKeyHash: operation.logicalEntityKeyHash, + action: operation.action, + protectedLeaseReference: operation.protectedLeaseReference, + protectedServerRecordIdReference: operation.encryptedPayloadReference!, + serverRecordIdHash: operation.serverRecordIdHash!, + protectedPayloadReference: operation.encryptedPayloadReference, + payloadSha256: operation.payloadSha256, + ); + + await expectLater( + transport.prepareSubmission( + scope, + submissionIdentity: _submissionIdentity(wrongOperationId), + operations: [protectedOperation], + ), + throwsA( + isA().having( + (failure) => failure.safeCode, + 'safeCode', + 'cloud_sync_outbound_create_only', + ), + ), + ); + expect(bindings.preparedInputs, isEmpty); + }, + ); + + test('protected writer rejects every non-message outbound zone', () async { + final wrongScope = CloudSyncScope( + accountFingerprint: scope.accountFingerprint, + container: scope.container, + database: scope.database, + zone: 'chatManateeZone', + streamKind: scope.streamKind, + schemaVersion: scope.schemaVersion, + ); + final operation = _writeOperation(wrongScope); + + await expectLater( + transport.prepareSubmission( + wrongScope, + submissionIdentity: _submissionIdentity(operation.operationId), + operations: [_protectedWriteOperation(operation)], + ), + throwsA( + isA().having( + (failure) => failure.safeCode, + 'safeCode', + 'unsupported_protected_outbound_scope', + ), + ), + ); + expect(bindings.preparedInputs, isEmpty); + }); + + test( + 'protected writer is single-use and bounds native retry-after', + () async { + final operation = _writeOperation(scope); + final protectedOperation = _protectedWriteOperation(operation); + final identity = _submissionIdentity(operation.operationId); + bindings.prepareResult = frb_api.CloudSyncPreparedMessageCreateResult( + handle: _FakePreparedHandle(), + ); + bindings.consumeResult = frb_api.CloudSyncOutboundConsumeResult( + outcomes: [ + frb_api.CloudSyncOutboundSaveOutcome( + localOperationId: operation.operationId, + appleOperationUuid: identity.operationUuids[operation.operationId]!, + disposition: + frb_api.CloudSyncOutboundSaveDisposition.unknownOutcome, + retryAfterSeconds: BigInt.parse('18446744073709551615'), + ), + ], + ); + final prepared = await transport.prepareSubmission( + scope, + submissionIdentity: identity, + operations: [protectedOperation], + ); + + final result = await transport.consumePreparedSubmission( + scope, + preparedSubmission: prepared, + persistedIdentity: identity, + protectedOperations: [protectedOperation], + operations: [operation], + ); + + expect( + result.outcomes.values.single.disposition, + CloudPushDisposition.unknownOutcome, + ); + expect(result.outcomes.values.single.retryAfter, const Duration(days: 7)); + expect(bindings.consumeCalls, 1); + await expectLater( + transport.consumePreparedSubmission( + scope, + preparedSubmission: prepared, + persistedIdentity: identity, + protectedOperations: [protectedOperation], + operations: [operation], + ), + throwsStateError, + ); + expect(bindings.consumeCalls, 1); + }, + ); + + test('reconciles committed only with the exact protected proof', () async { + final operation = _unknownOutcomeOperation(scope); + bindings.reconcileResult = frb_api.CloudSyncOutboundReconcileResult( + disposition: frb_api.CloudSyncOutboundReconcileDisposition.committed, + protectedProofReference: operation.encryptedPayloadReference, + ); + + final resolution = await transport.reconcileUnknownOutcome( + scope, + operation: operation, + ); + + expect(resolution.disposition, CloudUnknownOutcomeDisposition.committed); + expect(resolution.failureCategory, isNull); + expect(resolution.retryAfter, isNull); + expect(resolution.proof, isNotNull); + expect(resolution.proof!.binds(operation), isTrue); + expect( + resolution.proof!.protectedProofReference, + operation.encryptedPayloadReference, + ); + _expectReconcileCall(bindings, operation, scope); + }); + + test( + 'reconciles explicit notApplied only with the exact protected proof', + () async { + final operation = _unknownOutcomeOperation(scope); + bindings.reconcileResult = frb_api.CloudSyncOutboundReconcileResult( + disposition: frb_api.CloudSyncOutboundReconcileDisposition.notApplied, + protectedProofReference: operation.encryptedPayloadReference, + ); + + final resolution = await transport.reconcileUnknownOutcome( + scope, + operation: operation, + ); + + expect(resolution.disposition, CloudUnknownOutcomeDisposition.notApplied); + expect(resolution.failureCategory, isNull); + expect(resolution.retryAfter, isNull); + expect(resolution.proof, isNotNull); + expect(resolution.proof!.binds(operation), isTrue); + expect( + resolution.proof!.protectedProofReference, + operation.encryptedPayloadReference, + ); + _expectReconcileCall(bindings, operation, scope); + }, + ); + + test('maps diverged reconciliation to a quarantined conflict', () async { + final operation = _unknownOutcomeOperation(scope); + bindings.reconcileResult = frb_api.CloudSyncOutboundReconcileResult( + disposition: frb_api.CloudSyncOutboundReconcileDisposition.diverged, + protectedProofReference: operation.encryptedPayloadReference, + failureClass: frb_api.CloudSyncOutboundFailureClass.conflict, + ); + + final resolution = await transport.reconcileUnknownOutcome( + scope, + operation: operation, + ); + + expect(resolution.disposition, CloudUnknownOutcomeDisposition.quarantined); + expect(resolution.failureCategory, CloudFailureCategory.conflict); + expect(resolution.proof, isNull); + expect(resolution.retryAfter, isNull); + _expectReconcileCall(bindings, operation, scope); + }); + + test( + 'maps unresolved retry class and caps retry-after at seven days', + () async { + final operation = _unknownOutcomeOperation(scope); + bindings.reconcileResult = frb_api.CloudSyncOutboundReconcileResult( + disposition: frb_api.CloudSyncOutboundReconcileDisposition.unresolved, + failureClass: frb_api.CloudSyncOutboundFailureClass.transientServer, + retryAfterSeconds: BigInt.parse('18446744073709551615'), + ); + + final resolution = await transport.reconcileUnknownOutcome( + scope, + operation: operation, + ); + + expect(resolution.disposition, CloudUnknownOutcomeDisposition.unresolved); + expect(resolution.failureCategory, CloudFailureCategory.server); + expect(resolution.retryAfter, const Duration(days: 7)); + expect(resolution.proof, isNull); + _expectReconcileCall(bindings, operation, scope); + }, + ); + + test('malformed or swapped proof references fail closed', () async { + final operation = _unknownOutcomeOperation(scope); + for (final proofReference in [ + 'raw/proof-reference', + _reference('Q'), + ]) { + bindings.reconcileResult = frb_api.CloudSyncOutboundReconcileResult( + disposition: frb_api.CloudSyncOutboundReconcileDisposition.committed, + protectedProofReference: proofReference, + ); + + await expectLater( + transport.reconcileUnknownOutcome(scope, operation: operation), + throwsA( + isA().having( + (failure) => failure.safeCode, + 'safeCode', + 'cloud_sync_outbound_reconcile_envelope_invalid', + ), + ), + ); + } + expect(bindings.reconcileCalls, 2); + }); + + test( + 'malformed, cross-scope, non-unknown, and delete operations never reach native', + () async { + final otherScope = CloudSyncScope( + accountFingerprint: _hash('Z'), + container: scope.container, + database: scope.database, + zone: scope.zone, + streamKind: scope.streamKind, + schemaVersion: scope.schemaVersion, + ); + final invalidOperations = [ + _unknownOutcomeOperation( + scope, + payloadReference: 'raw/payload-reference', + ), + _unknownOutcomeOperation(otherScope), + _unknownOutcomeOperation(scope, status: CloudOutboxStatus.pending), + _unknownOutcomeOperation(scope, action: CloudOutboxAction.delete), + _unknownOutcomeOperation(scope, operationId: 'op1:${_sha('f')}'), + ]; + + for (final operation in invalidOperations) { + await expectLater( + transport.reconcileUnknownOutcome(scope, operation: operation), + throwsA( + isA().having( + (failure) => failure.safeCode, + 'safeCode', + 'cloud_sync_outbound_reconcile_operation_invalid', + ), + ), + ); + } + expect(bindings.reconcileCalls, 0); + }, + ); + + test( + 'terminal receipt acknowledgement validates scope and correlation', + () async { + final operation = _writeOperation(scope); + await transport.acknowledgeDurableTerminalOperations( + scope, + operations: [operation], + transitions: [CloudOutboxTransition.confirmed(operation.operationId)], + ); + expect(bindings.acknowledgedLeases, [operation.protectedLeaseReference]); + + final otherScope = CloudSyncScope( + accountFingerprint: _hash('Z'), + container: scope.container, + database: scope.database, + zone: scope.zone, + streamKind: scope.streamKind, + schemaVersion: scope.schemaVersion, + ); + await expectLater( + transport.acknowledgeDurableTerminalOperations( + otherScope, + operations: [operation], + transitions: [CloudOutboxTransition.confirmed(operation.operationId)], + ), + throwsA( + isA().having( + (failure) => failure.safeCode, + 'safeCode', + 'cloud_sync_outbound_receipt_scope_invalid', + ), + ), + ); + expect(bindings.acknowledgedLeases, [operation.protectedLeaseReference]); + }, + ); + + test( + 'outbound stage rejects independently swapped protected references', + () async { + bindings.stageResult = frb_api.CloudSyncProtectedOutboundStageResult( + stage: frb_api.CloudSyncProtectedOutboundStage( + logicalEntityKeyHash: _hash('L'), + protectedPayloadReference: _reference('P'), + payloadSha256: _sha('a'), + payloadLength: BigInt.one, + protectedServerRecordReference: _reference('Q'), + serverRecordIdHash: _hash('S'), + leaseReference: _lease('a'), + ), + ); + + await expectLater( + transport.stageOutboundMessage(scope, message: _FakeCloudMessage()), + throwsA( + isA().having( + (failure) => failure.safeCode, + 'safeCode', + 'cloud_sync_outbound_stage_invalid', + ), + ), + ); + }, + ); + + test('legacy write-side CloudKit method remains unavailable', () { + expect( + () => transport.pushOperations(scope, operations: const []), + throwsA( + isA().having( + (failure) => failure.safeCode, + 'safeCode', + 'cloud_sync_protected_read_only', + ), + ), + ); + }); +} + +CloudOutboxOperation _writeOperation(CloudSyncScope scope) { + final logicalEntityKeyHash = _hash('L'); + return CloudOutboxOperation( + scope: scope, + operationId: CloudOperationIdentity.forInitialCreate( + scope: scope, + logicalEntityKeyHash: logicalEntityKeyHash, + payloadVersion: 1, + ), + logicalEntityKeyHash: logicalEntityKeyHash, + action: CloudOutboxAction.save, + payloadVersion: 1, + mutationRevision: 1, + checkpointGeneration: 1, + encryptedPayloadReference: _reference('P'), + payloadSha256: _sha('b'), + serverRecordIdHash: _hash('S'), + protectedLeaseReference: _lease('a'), + dependencyOperationIds: const {}, + createdAt: DateTime.fromMillisecondsSinceEpoch(1, isUtc: true), + ); +} + +CloudOutboxOperation _unknownOutcomeOperation( + CloudSyncScope scope, { + CloudOutboxStatus status = CloudOutboxStatus.unknownOutcome, + CloudOutboxAction action = CloudOutboxAction.save, + String? payloadReference, + String? operationId, +}) { + final protectedPayloadReference = payloadReference ?? _reference('P'); + final logicalEntityKeyHash = _hash('L'); + return CloudOutboxOperation( + scope: scope, + operationId: + operationId ?? + CloudOperationIdentity.forInitialCreate( + scope: scope, + logicalEntityKeyHash: logicalEntityKeyHash, + payloadVersion: 1, + ), + logicalEntityKeyHash: logicalEntityKeyHash, + action: action, + payloadVersion: 1, + mutationRevision: 1, + checkpointGeneration: 1, + encryptedPayloadReference: protectedPayloadReference, + payloadSha256: _sha('b'), + serverRecordIdHash: _hash('S'), + protectedLeaseReference: _lease('a'), + appleRequestUuid: '11111111-2222-4ABC-8DEF-555555555555', + appleOperationUuid: 'AAAAAAAA-BBBB-4CCC-8DDD-000000000001', + dependencyOperationIds: const {}, + createdAt: DateTime.fromMillisecondsSinceEpoch(1, isUtc: true), + status: status, + attemptCount: 1, + ); +} + +void _expectReconcileCall( + _FakeBindings bindings, + CloudOutboxOperation operation, + CloudSyncScope scope, +) { + expect(bindings.reconcileCalls, 1); + expect(bindings.reconcileCloudMessagesClient, isNotNull); + expect(bindings.reconcileStorageDirectory, 'private-storage'); + expect( + bindings.reconcileExpectedAccountFingerprint, + scope.accountFingerprint, + ); + expect(bindings.reconcileExpectedProtectedStoreIdentity, _storeIdentity); + expect(bindings.reconcileRequestUuid, operation.appleRequestUuid); + final input = bindings.reconcileInput!; + expect(input.localOperationId, operation.operationId); + expect(input.logicalEntityKeyHash, operation.logicalEntityKeyHash); + expect(input.protectedLeaseReference, operation.protectedLeaseReference); + expect(input.protectedPayloadReference, operation.encryptedPayloadReference); + expect(input.payloadSha256, operation.payloadSha256); + expect( + input.protectedServerRecordReference, + operation.encryptedPayloadReference, + ); + expect(input.serverRecordIdHash, operation.serverRecordIdHash); + expect(input.appleOperationUuid, operation.appleOperationUuid); +} + +CloudSyncProtectedWriteOperation _protectedWriteOperation( + CloudOutboxOperation operation, +) { + return CloudSyncProtectedWriteOperation( + operationId: operation.operationId, + logicalEntityKeyHash: operation.logicalEntityKeyHash, + action: operation.action, + protectedLeaseReference: operation.protectedLeaseReference, + protectedServerRecordIdReference: operation.encryptedPayloadReference!, + serverRecordIdHash: operation.serverRecordIdHash!, + protectedPayloadReference: operation.encryptedPayloadReference, + payloadSha256: operation.payloadSha256, + ); +} + +CloudOutboxSubmissionIdentity _submissionIdentity(String operationId) { + return CloudOutboxSubmissionIdentity( + requestUuid: '11111111-2222-4ABC-8DEF-555555555555', + operationUuids: {operationId: 'AAAAAAAA-BBBB-4CCC-8DDD-000000000001'}, + ); +} + +String _repeat(String character, int count) => + List.filled(count, character).join(); +String _hash(String character) => _repeat(character, 43); +String _sha(String character) => _repeat(character, 64); +String _reference(String character) => 'obcs2.ref.${_hash(character)}'; +String _lease(String character) => 'obcs2.lease.${_repeat(character, 32)}'; +final String _storeIdentity = 'obcs2.store.${_hash('S')}'; + +NativeProtectedFetchResult _validEmptyFetchResult() => + NativeProtectedFetchResult( + page: NativeProtectedPage( + changes: const [], + batchId: _hash('B'), + generation: 1, + pageLeaseReference: _lease('f'), + complete: true, + admittedRawBytes: 0, + ), + ); + +Future _waitFor(bool Function() predicate) async { + for (var attempt = 0; attempt < 100; attempt++) { + if (predicate()) return; + await Future.delayed(const Duration(milliseconds: 1)); + } + fail('condition_not_reached'); +} + +final class _FakeBindings + implements + NativeProtectedCloudSyncBindings, + NativeProtectedCloudSyncWriteBindings { + NativeProtectedFetchResult fetchResult = const NativeProtectedFetchResult(); + NativeProtectedRecoveryResult recoveryResult = + const NativeProtectedRecoveryResult(); + NativeProtectedGarbageCollectionResult garbageCollectionResult = + const NativeProtectedGarbageCollectionResult( + collection: NativeProtectedGarbageCollection( + scannedCount: 0, + firstObservedCount: 0, + deletedCount: 0, + preservedLiveCount: 0, + preservedActiveLeaseCount: 0, + hasMore: false, + ), + ); + frb_api.CloudSyncProtectedOutboundStageResult stageResult = + const frb_api.CloudSyncProtectedOutboundStageResult( + failure: frb_api.CloudSyncOutboundSafeCode.invalidRequest, + ); + frb_api.CloudSyncPreparedMessageCreateResult prepareResult = + const frb_api.CloudSyncPreparedMessageCreateResult( + failure: frb_api.CloudSyncOutboundSafeCode.invalidRequest, + ); + frb_api.CloudSyncOutboundConsumeResult consumeResult = + const frb_api.CloudSyncOutboundConsumeResult( + outcomes: [], + failure: frb_api.CloudSyncOutboundSafeCode.invalidRequest, + ); + frb_api.CloudSyncOutboundReconcileResult reconcileResult = + const frb_api.CloudSyncOutboundReconcileResult( + failure: frb_api.CloudSyncOutboundSafeCode.invalidRequest, + ); + String? expectedAccountFingerprint; + String? stream; + String? previousCheckpointReference; + int? maximumChanges; + List? adoptedLeaseReferences; + List? liveReferences; + bool? liveReferenceEnumerationComplete; + String? committedLeaseReference; + List? retainedReferences; + List? garbageCollectionLiveReferences; + int commitCalls = 0; + int recoveryCalls = 0; + int garbageCollectionCalls = 0; + int consumeCalls = 0; + int reconcileCalls = 0; + String? preparedRequestUuid; + List preparedInputs = const []; + Object? reconcileCloudMessagesClient; + String? reconcileStorageDirectory; + String? reconcileExpectedAccountFingerprint; + String? reconcileExpectedProtectedStoreIdentity; + String? reconcileRequestUuid; + frb_api.CloudSyncPreparedMessageCreateInput? reconcileInput; + final List acknowledgedLeases = []; + Future Function(String operation)? beforeOperation; + + Future _before(String operation) async { + await beforeOperation?.call(operation); + } + + @override + Future fetchProtectedPage({ + required Object cloudMessagesClient, + required String storageDirectory, + required String expectedAccountFingerprint, + required String stream, + required int generation, + required String? previousCheckpointReference, + required int maximumChanges, + }) async { + await _before('fetch'); + this.expectedAccountFingerprint = expectedAccountFingerprint; + this.stream = stream; + this.previousCheckpointReference = previousCheckpointReference; + this.maximumChanges = maximumChanges; + return fetchResult; + } + + @override + Future commitProtectedPageLease({ + required String storageDirectory, + required String leaseReference, + required List retainedReferences, + }) async { + await _before('commit'); + commitCalls++; + committedLeaseReference = leaseReference; + this.retainedReferences = [...retainedReferences]; + return const NativeProtectedLeaseResult(); + } + + @override + Future acknowledgeCommittedPageLease({ + required String storageDirectory, + required String leaseReference, + }) async { + await _before('acknowledge'); + acknowledgedLeases.add(leaseReference); + return const NativeProtectedLeaseResult(); + } + + @override + Future stageOutboundMessage({ + required Object cloudMessagesClient, + required String storageDirectory, + required String expectedAccountFingerprint, + required String expectedProtectedStoreIdentity, + required frb_api.CloudMessage message, + }) async { + await _before('stageOutbound'); + return stageResult; + } + + @override + Future prepareMessageCreate({ + required Object cloudMessagesClient, + required String storageDirectory, + required String expectedAccountFingerprint, + required String expectedProtectedStoreIdentity, + required String requestUuid, + required Duration requestTimeout, + required List inputs, + }) async { + await _before('prepareOutbound'); + preparedRequestUuid = requestUuid; + preparedInputs = [...inputs]; + return prepareResult; + } + + @override + Future consumePreparedMessageCreate({ + required frb_api.CloudSyncPreparedMessageCreateHandle handle, + }) async { + await _before('consumeOutbound'); + consumeCalls++; + return consumeResult; + } + + @override + Future reconcileMessageCreate({ + required Object cloudMessagesClient, + required String storageDirectory, + required String expectedAccountFingerprint, + required String expectedProtectedStoreIdentity, + required String requestUuid, + required frb_api.CloudSyncPreparedMessageCreateInput input, + }) async { + await _before('reconcileOutbound'); + reconcileCalls++; + reconcileCloudMessagesClient = cloudMessagesClient; + reconcileStorageDirectory = storageDirectory; + reconcileExpectedAccountFingerprint = expectedAccountFingerprint; + reconcileExpectedProtectedStoreIdentity = expectedProtectedStoreIdentity; + reconcileRequestUuid = requestUuid; + reconcileInput = input; + return reconcileResult; + } + + @override + Future collectProtectedGarbage({ + required String storageDirectory, + required List liveReferences, + required bool liveReferenceEnumerationComplete, + }) async { + await _before('garbageCollection'); + garbageCollectionCalls++; + garbageCollectionLiveReferences = [...liveReferences]; + this.liveReferenceEnumerationComplete = liveReferenceEnumerationComplete; + return garbageCollectionResult; + } + + @override + Future recoverProtectedPageLeases({ + required String storageDirectory, + required List adoptedLeaseReferences, + required List liveReferences, + required bool liveReferenceEnumerationComplete, + }) async { + await _before('recover'); + recoveryCalls++; + this.adoptedLeaseReferences = [...adoptedLeaseReferences]; + this.liveReferences = [...liveReferences]; + this.liveReferenceEnumerationComplete = liveReferenceEnumerationComplete; + return recoveryResult; + } + + @override + Future retireProtectedReferences({ + required String storageDirectory, + required List references, + }) async { + await _before('retire'); + return NativeProtectedRetirementResult(retiredCount: references.length); + } + + @override + Future rollbackProtectedPageLease({ + required String storageDirectory, + required String leaseReference, + }) async { + await _before('rollback'); + return const NativeProtectedLeaseResult(); + } +} + +final class _FakePreparedHandle + implements frb_api.CloudSyncPreparedMessageCreateHandle { + @override + dynamic noSuchMethod(Invocation invocation) => super.noSuchMethod(invocation); +} + +final class _FakeCloudMessage implements frb_api.CloudMessage { + @override + dynamic noSuchMethod(Invocation invocation) => super.noSuchMethod(invocation); +} diff --git a/test/services/cloud_sync/objectbox_canonical_semantic_entity_adapter_test.dart b/test/services/cloud_sync/objectbox_canonical_semantic_entity_adapter_test.dart new file mode 100644 index 0000000000..c7f411c8a7 --- /dev/null +++ b/test/services/cloud_sync/objectbox_canonical_semantic_entity_adapter_test.dart @@ -0,0 +1,1862 @@ +import 'dart:io'; +import 'dart:typed_data'; + +import 'package:bluebubbles/database/models.dart'; +import 'package:bluebubbles/services/rustpush/cloud_sync/cloud_inbox_applier.dart'; +import 'package:bluebubbles/services/rustpush/cloud_sync/cloud_merge_policy.dart'; +import 'package:bluebubbles/services/rustpush/cloud_sync/cloud_sync_models.dart'; +import 'package:bluebubbles/services/rustpush/cloud_sync/objectbox_canonical_semantic_entity_adapter.dart'; +import 'package:bluebubbles/services/rustpush/cloud_sync/objectbox_cloud_semantic_store_gateway.dart'; +import 'package:flutter_test/flutter_test.dart'; + +import 'cloud_sync_test_helpers.dart'; + +const _defaultChatHash = 'chat-hash'; +const _defaultMessageHash = 'message-hash'; + +void main() { + final scope = CloudSyncScope( + accountFingerprint: testAccountFingerprintA, + container: 'container', + database: 'private', + zone: 'messageManateeZone', + ); + const generation = 4; + const chatHash = 'chat-hash'; + const messageHash = 'message-hash'; + late Directory directory; + late Store store; + late _Resolver resolver; + late CloudCanonicalActiveScope? activeScope; + + setUp(() async { + directory = await Directory.systemTemp.createTemp( + 'openbubbles-canonical-adapter-', + ); + store = await openStore(directory: directory.path); + resolver = _Resolver() + ..put( + scope: scope, + generation: generation, + kind: CloudEntityKind.chat, + logicalEntityKeyHash: chatHash, + canonicalGuid: 'chat-guid', + ) + ..put( + scope: scope, + generation: generation, + kind: CloudEntityKind.message, + logicalEntityKeyHash: messageHash, + canonicalGuid: 'message-guid', + ); + activeScope = CloudCanonicalActiveScope( + scope: scope, + generation: generation, + ); + }); + + tearDown(() async { + store.close(); + if (directory.existsSync()) await directory.delete(recursive: true); + }); + + test('is default-off even when the active scope and identity resolve', () { + store.box().put(Chat(guid: 'chat-guid')); + final adapter = _newAdapter( + store: store, + activeScopeProvider: () => activeScope, + resolver: resolver, + ); + + expect( + adapter.isActiveAccountScope(scope: scope, generation: generation), + isFalse, + ); + expect( + adapter.entityExists( + scope: scope, + generation: generation, + kind: CloudEntityKind.chat, + logicalEntityKeyHash: chatHash, + ), + isFalse, + ); + }); + + test( + 'uses exact scope, generation, kind, and resolved canonical identity', + () { + store.box().put(Chat(guid: 'chat-guid')); + final adapter = _newAdapter( + store: store, + activeScopeProvider: () => activeScope, + resolver: resolver, + semanticApplyEnabled: true, + ); + + expect( + adapter.entityExists( + scope: scope, + generation: generation, + kind: CloudEntityKind.chat, + logicalEntityKeyHash: chatHash, + ), + isTrue, + ); + expect( + adapter.entityExists( + scope: scope, + generation: generation + 1, + kind: CloudEntityKind.chat, + logicalEntityKeyHash: chatHash, + ), + isFalse, + ); + expect( + adapter.entityExists( + scope: scope, + generation: generation, + kind: CloudEntityKind.message, + logicalEntityKeyHash: chatHash, + ), + isFalse, + ); + activeScope = null; + expect( + adapter.entityExists( + scope: scope, + generation: generation, + kind: CloudEntityKind.chat, + logicalEntityKeyHash: chatHash, + ), + isFalse, + ); + }, + ); + + test('creates a chat and replays the same payload idempotently', () { + final adapter = _newAdapter( + store: store, + activeScopeProvider: () => activeScope, + resolver: resolver, + semanticApplyEnabled: true, + allowChatUpserts: true, + ); + final payload = _chatPayload( + logicalEntityKeyHash: chatHash, + canonicalGuid: 'chat-guid', + chatIdentifier: 'iMessage;-;chat-guid', + displayName: 'Created chat', + participantHandles: const [ + 'mailto:alice@example.com', + 'tel:+19492476163', + ], + groupVersion: 1, + ); + + expect( + adapter.applyEntity( + scope: scope, + generation: generation, + payload: payload, + snapshot: _snapshot(CloudEntityKind.chat, chatHash), + ), + CloudCanonicalSemanticMutationReceipt.committed, + ); + expect( + adapter.applyEntity( + scope: scope, + generation: generation, + payload: payload, + snapshot: _snapshot(CloudEntityKind.chat, chatHash), + ), + CloudCanonicalSemanticMutationReceipt.committed, + ); + + final chats = store.box().getAll(); + expect(chats, hasLength(1)); + expect(chats.single.guid, 'chat-guid'); + expect(chats.single.style, 45); + expect(chats.single.displayName, 'Created chat'); + expect(chats.single.groupVersion, 1); + expect(chats.single.handles.map((handle) => handle.address).toSet(), { + 'alice@example.com', + '+19492476163', + }); + expect(store.box().count(), 2); + }); + + test('rejects an exact chat-alias conflict without creating rows', () { + store.box().put( + Chat( + guid: 'different-chat-guid', + chatIdentifier: 'iMessage;-;shared-alias', + ), + ); + final adapter = _newAdapter( + store: store, + activeScopeProvider: () => activeScope, + resolver: resolver, + semanticApplyEnabled: true, + allowChatUpserts: true, + ); + + expect( + () => adapter.applyEntity( + scope: scope, + generation: generation, + payload: _chatPayload( + logicalEntityKeyHash: chatHash, + canonicalGuid: 'chat-guid', + chatIdentifier: 'iMessage;-;shared-alias', + ), + snapshot: _snapshot(CloudEntityKind.chat, chatHash), + ), + throwsA( + predicate( + (failure) => failure.safeCode == 'canonical_chat_alias_conflict', + ), + ), + ); + expect(store.box().count(), 1); + expect(store.box().count(), 0); + }); + + test('rejects a resolver canonical GUID mismatch without creating rows', () { + final adapter = _newAdapter( + store: store, + activeScopeProvider: () => activeScope, + resolver: resolver, + semanticApplyEnabled: true, + allowChatUpserts: true, + ); + + expect( + () => adapter.applyEntity( + scope: scope, + generation: generation, + payload: _chatPayload( + logicalEntityKeyHash: chatHash, + canonicalGuid: 'unresolved-chat-guid', + chatIdentifier: 'iMessage;-;mismatch', + ), + snapshot: _snapshot(CloudEntityKind.chat, chatHash), + ), + throwsA( + predicate( + (failure) => failure.safeCode == 'canonical_identity_mismatch', + ), + ), + ); + expect(store.box().count(), 0); + expect(store.box().count(), 0); + }); + + test('maps direct chats to style 45 and group chats to style 43', () { + const groupHash = 'group-chat-hash'; + resolver.put( + scope: scope, + generation: generation, + kind: CloudEntityKind.chat, + logicalEntityKeyHash: groupHash, + canonicalGuid: 'group-chat-guid', + ); + final adapter = _newAdapter( + store: store, + activeScopeProvider: () => activeScope, + resolver: resolver, + semanticApplyEnabled: true, + allowChatUpserts: true, + ); + + adapter.applyEntity( + scope: scope, + generation: generation, + payload: _chatPayload( + logicalEntityKeyHash: chatHash, + canonicalGuid: 'chat-guid', + chatIdentifier: 'iMessage;-;direct', + ), + snapshot: _snapshot(CloudEntityKind.chat, chatHash), + ); + adapter.applyEntity( + scope: scope, + generation: generation, + payload: _chatPayload( + logicalEntityKeyHash: groupHash, + canonicalGuid: 'group-chat-guid', + chatIdentifier: 'iMessage;+;group', + style: CloudSemanticChatStyle.group, + ), + snapshot: _snapshot(CloudEntityKind.chat, groupHash), + ); + + final chats = store.box().getAll(); + expect(chats.singleWhere((chat) => chat.guid == 'chat-guid').style, 45); + expect( + chats.singleWhere((chat) => chat.guid == 'group-chat-guid').style, + 43, + ); + }); + + test( + 'normalizes and deduplicates participant handles in the chat relation', + () { + const participantsHash = 'participants-chat-hash'; + resolver.put( + scope: scope, + generation: generation, + kind: CloudEntityKind.chat, + logicalEntityKeyHash: participantsHash, + canonicalGuid: 'participants-chat-guid', + ); + final adapter = _newAdapter( + store: store, + activeScopeProvider: () => activeScope, + resolver: resolver, + semanticApplyEnabled: true, + allowChatUpserts: true, + ); + + adapter.applyEntity( + scope: scope, + generation: generation, + payload: _chatPayload( + logicalEntityKeyHash: participantsHash, + canonicalGuid: 'participants-chat-guid', + chatIdentifier: 'iMessage;+;participants', + style: CloudSemanticChatStyle.group, + participantHandles: const [ + 'mailto:alice@example.com', + 'alice@example.com', + 'tel:+19492476163', + '+19492476163', + ], + ), + snapshot: _snapshot(CloudEntityKind.chat, participantsHash), + ); + + final chat = store.box().getAll().single; + expect(store.box().count(), 2); + expect(chat.handles, hasLength(2)); + expect(chat.handles.map((handle) => handle.address).toSet(), { + 'alice@example.com', + '+19492476163', + }); + expect( + chat.handles.map((handle) => handle.uniqueAddressAndService).toSet(), + {'alice@example.com/iMessage', '+19492476163/iMessage'}, + ); + }, + ); + + test('replaces participants only on create or a higher group version', () { + const versionedHash = 'versioned-chat-hash'; + resolver.put( + scope: scope, + generation: generation, + kind: CloudEntityKind.chat, + logicalEntityKeyHash: versionedHash, + canonicalGuid: 'versioned-chat-guid', + ); + final adapter = _newAdapter( + store: store, + activeScopeProvider: () => activeScope, + resolver: resolver, + semanticApplyEnabled: true, + allowChatUpserts: true, + ); + + void apply(int version, String participant) { + adapter.applyEntity( + scope: scope, + generation: generation, + payload: _chatPayload( + logicalEntityKeyHash: versionedHash, + canonicalGuid: 'versioned-chat-guid', + chatIdentifier: 'iMessage;+;versioned', + style: CloudSemanticChatStyle.group, + groupVersion: version, + participantHandles: [participant], + ), + snapshot: _snapshot(CloudEntityKind.chat, versionedHash), + ); + } + + apply(2, 'mailto:alice@example.com'); + apply(2, 'mailto:bob@example.com'); + expect( + store.box().getAll().single.handles.map((handle) => handle.address), + ['alice@example.com'], + ); + apply(1, 'mailto:charlie@example.com'); + expect( + store.box().getAll().single.handles.map((handle) => handle.address), + ['alice@example.com'], + ); + apply(3, 'mailto:bob@example.com'); + final chat = store.box().getAll().single; + expect(chat.groupVersion, 3); + expect(chat.handles.map((handle) => handle.address), ['bob@example.com']); + }); + + test('preserves a locally locked display name during a chat upsert', () { + store.box().put( + Chat( + guid: 'chat-guid', + chatIdentifier: 'iMessage;-;locked', + displayName: 'Local name', + lockChatName: true, + style: 45, + ), + ); + final adapter = _newAdapter( + store: store, + activeScopeProvider: () => activeScope, + resolver: resolver, + semanticApplyEnabled: true, + allowChatUpserts: true, + ); + + adapter.applyEntity( + scope: scope, + generation: generation, + payload: _chatPayload( + logicalEntityKeyHash: chatHash, + canonicalGuid: 'chat-guid', + chatIdentifier: 'iMessage;-;locked', + displayName: 'Cloud name', + ), + snapshot: _snapshot(CloudEntityKind.chat, chatHash), + ); + + expect(store.box().getAll().single.displayName, 'Local name'); + }); + + test('blocks explicit display-name clear unless its separate gate is on', () { + store.box().put( + Chat( + guid: 'chat-guid', + chatIdentifier: 'iMessage;-;clear', + displayName: 'Keep until verified', + style: 45, + ), + ); + final payload = _chatPayload( + logicalEntityKeyHash: chatHash, + canonicalGuid: 'chat-guid', + chatIdentifier: 'iMessage;-;clear', + displayName: null, + displayNameState: CloudSemanticFieldState.explicitClear, + ); + final adapter = _newAdapter( + store: store, + activeScopeProvider: () => activeScope, + resolver: resolver, + semanticApplyEnabled: true, + allowChatUpserts: true, + ); + + expect( + () => adapter.applyEntity( + scope: scope, + generation: generation, + payload: payload, + snapshot: _snapshot(CloudEntityKind.chat, chatHash), + ), + throwsA( + predicate( + (failure) => + failure.safeCode == + 'canonical_chat_display_name_clear_unverified', + ), + ), + ); + expect( + store.box().getAll().single.displayName, + 'Keep until verified', + ); + + final clearEnabledAdapter = _newAdapter( + store: store, + activeScopeProvider: () => activeScope, + resolver: resolver, + semanticApplyEnabled: true, + allowChatUpserts: true, + allowExistingChatDisplayNameClears: true, + ); + clearEnabledAdapter.applyEntity( + scope: scope, + generation: generation, + payload: payload, + snapshot: _snapshot(CloudEntityKind.chat, chatHash), + ); + expect(store.box().getAll().single.displayName, isNull); + }); + + test( + 'rolls back participant and chat rows when a participant is invalid', + () { + final adapter = _newAdapter( + store: store, + activeScopeProvider: () => activeScope, + resolver: resolver, + semanticApplyEnabled: true, + allowChatUpserts: true, + ); + + expect( + () => store.runInTransaction(TxMode.write, () { + adapter.applyEntity( + scope: scope, + generation: generation, + payload: _chatPayload( + logicalEntityKeyHash: chatHash, + canonicalGuid: 'chat-guid', + chatIdentifier: 'iMessage;+;invalid', + participantHandles: const [ + 'mailto:valid@example.com', + 'not a valid participant', + ], + ), + snapshot: _snapshot(CloudEntityKind.chat, chatHash), + ); + }), + throwsA( + predicate( + (failure) => + failure.safeCode == 'canonical_chat_participant_invalid', + ), + ), + ); + expect(store.box().count(), 0); + expect(store.box().count(), 0); + }, + ); + + test('creates and idempotently replays a message into its exact chat', () { + final chatId = store.box().put( + Chat( + guid: 'chat-guid', + chatIdentifier: 'iMessage;-;message-chat', + style: 45, + ), + ); + final adapter = _newAdapter( + store: store, + activeScopeProvider: () => activeScope, + resolver: resolver, + semanticApplyEnabled: true, + allowMessageUpserts: true, + ); + final createdAt = testEpoch.add(const Duration(milliseconds: 100)); + final readAt = createdAt.add(const Duration(milliseconds: 200)); + final deliveredAt = createdAt.add(const Duration(milliseconds: 100)); + final payload = _messagePayload( + logicalEntityKeyHash: messageHash, + canonicalGuid: 'message-guid', + chatIdentifier: 'iMessage;-;message-chat', + createdAt: createdAt, + subject: 'Subject', + body: 'A😀B', + senderHandle: 'mailto:sender@example.com', + readAt: readAt, + deliveredAt: deliveredAt, + effect: 'com.apple.messages.effect.CKConfettiEffect', + attributedBodies: [ + CloudSemanticAttributedBody( + text: 'A😀B', + runs: [ + CloudSemanticTextRun( + startUtf16: 1, + lengthUtf16: 2, + messagePart: 0, + attachmentCanonicalGuid: null, + attachmentLogicalKeyHash: null, + mentionHandle: null, + audioTranscript: null, + textEffect: null, + bold: true, + italic: null, + strikethrough: null, + underline: null, + ), + ], + ), + ], + knownFlags: _messageFlags( + fromMe: false, + delivered: true, + read: true, + hasDataDetectorResults: true, + deliveredQuietly: true, + didNotifyRecipient: true, + ), + ); + + expect( + adapter.applyEntity( + scope: scope, + generation: generation, + payload: payload, + snapshot: _snapshot(CloudEntityKind.message, messageHash), + ), + CloudCanonicalSemanticMutationReceipt.committed, + ); + expect( + adapter.applyEntity( + scope: scope, + generation: generation, + payload: payload, + snapshot: _snapshot(CloudEntityKind.message, messageHash), + ), + CloudCanonicalSemanticMutationReceipt.committed, + ); + + final chat = store.box().get(chatId)!; + final messages = store.box().getAll(); + expect(messages, hasLength(1)); + final message = messages.single; + expect(message.guid, 'message-guid'); + expect(message.chat.targetId, chat.id); + expect(message.text, 'A😀B'); + expect(message.subject, 'Subject'); + expect(message.isFromMe, isFalse); + expect(message.hasDdResults, isTrue); + expect(message.wasDeliveredQuietly, isTrue); + expect(message.didNotifyRecipient, isTrue); + expect(message.isDelivered, isTrue); + expect(message.dateRead?.toUtc(), readAt); + expect(message.dateDelivered?.toUtc(), deliveredAt); + expect( + message.expressiveSendStyleId, + 'com.apple.messages.effect.CKConfettiEffect', + ); + expect(message.attributedBody, hasLength(1)); + expect(message.attributedBody.single.string, 'A😀B'); + expect(message.attributedBody.single.runs.single.range, [1, 2]); + expect(message.attributedBody.single.runs.single.attributes?.bold, isTrue); + + final sender = + store + .box() + .query( + Handle_.uniqueAddressAndService.equals( + 'sender@example.com/iMessage', + ), + ) + .build() + ..limit = 1; + try { + final senderHandle = sender.findFirst(); + expect(senderHandle, isNotNull); + expect(message.handleId, senderHandle!.id); + } finally { + sender.close(); + } + }); + + test('preserves createdAt and monotonically merges message dates', () { + final chatId = store.box().put( + Chat( + guid: 'chat-guid', + chatIdentifier: 'iMessage;-;monotonic-chat', + style: 45, + ), + ); + final adapter = _newAdapter( + store: store, + activeScopeProvider: () => activeScope, + resolver: resolver, + semanticApplyEnabled: true, + allowMessageUpserts: true, + ); + final createdAt = testEpoch.add(const Duration(milliseconds: 500)); + final firstRead = createdAt.add(const Duration(seconds: 1)); + final firstDelivered = createdAt.add(const Duration(seconds: 2)); + final secondRead = createdAt.add(const Duration(seconds: 4)); + final secondDelivered = createdAt.add(const Duration(seconds: 5)); + + void apply({ + required String body, + required DateTime readAt, + required DateTime deliveredAt, + }) { + adapter.applyEntity( + scope: scope, + generation: generation, + payload: _messagePayload( + logicalEntityKeyHash: messageHash, + canonicalGuid: 'message-guid', + chatIdentifier: 'iMessage;-;monotonic-chat', + createdAt: createdAt, + body: body, + readAt: readAt, + deliveredAt: deliveredAt, + knownFlags: _messageFlags(fromMe: false, delivered: true, read: true), + ), + snapshot: _snapshot(CloudEntityKind.message, messageHash), + ); + } + + apply(body: 'first', readAt: firstRead, deliveredAt: firstDelivered); + final firstId = store.box().getAll().single.id; + apply(body: 'second', readAt: secondRead, deliveredAt: secondDelivered); + apply(body: 'older', readAt: firstRead, deliveredAt: firstDelivered); + + final chat = store.box().get(chatId)!; + final message = store.box().getAll().single; + expect(message.id, firstId); + expect(message.chat.targetId, chat.id); + expect(message.dateCreated?.toUtc(), createdAt); + expect(message.text, 'older'); + expect(message.dateRead?.toUtc(), secondRead); + expect(message.dateDelivered?.toUtc(), secondDelivered); + }); + + test('message replay cannot hide an already-linked attachment', () { + final chat = Chat( + guid: 'chat-guid', + chatIdentifier: 'iMessage;-;attachment-owner-chat', + style: 45, + ); + store.box().put(chat); + final message = Message( + guid: 'message-guid', + dateCreated: testEpoch, + isFromMe: false, + hasAttachments: true, + )..chat.target = chat; + final messageId = store.box().put(message); + final adapter = _newAdapter( + store: store, + activeScopeProvider: () => activeScope, + resolver: resolver, + semanticApplyEnabled: true, + allowMessageUpserts: true, + ); + + adapter.applyEntity( + scope: scope, + generation: generation, + payload: _messagePayload( + logicalEntityKeyHash: messageHash, + canonicalGuid: 'message-guid', + chatIdentifier: 'iMessage;-;attachment-owner-chat', + attributedBodiesState: CloudSemanticFieldState.absent, + knownFlags: _messageFlags(fromMe: false), + ), + snapshot: _snapshot(CloudEntityKind.message, messageHash), + ); + + expect(store.box().get(messageId)!.hasAttachments, isTrue); + }); + + test('rejects message chat and resolver mismatches without mutation', () { + final firstChatId = store.box().put( + Chat( + guid: 'first-chat-guid', + chatIdentifier: 'iMessage;-;first-chat', + style: 45, + ), + ); + store.box().put( + Chat( + guid: 'second-chat-guid', + chatIdentifier: 'iMessage;-;second-chat', + style: 45, + ), + ); + final existing = Message( + guid: 'message-guid', + dateCreated: testEpoch, + isFromMe: false, + text: 'original', + )..chat.targetId = firstChatId; + store.box().put(existing); + final adapter = _newAdapter( + store: store, + activeScopeProvider: () => activeScope, + resolver: resolver, + semanticApplyEnabled: true, + allowMessageUpserts: true, + ); + + expect( + () => store.runInTransaction(TxMode.write, () { + adapter.applyEntity( + scope: scope, + generation: generation, + payload: _messagePayload( + logicalEntityKeyHash: messageHash, + canonicalGuid: 'message-guid', + chatIdentifier: 'iMessage;-;second-chat', + createdAt: testEpoch, + senderHandle: 'mailto:new-sender@example.com', + knownFlags: _messageFlags(fromMe: false), + ), + snapshot: _snapshot(CloudEntityKind.message, messageHash), + ); + }), + throwsA( + predicate( + (failure) => failure.safeCode == 'canonical_message_chat_conflict', + ), + ), + ); + expect(store.box().count(), 1); + expect(store.box().count(), 0); + expect(store.box().getAll().single.text, 'original'); + expect(store.box().getAll().single.chat.targetId, firstChatId); + + expect( + () => adapter.applyEntity( + scope: scope, + generation: generation, + payload: _messagePayload( + logicalEntityKeyHash: messageHash, + canonicalGuid: 'wrong-message-guid', + chatIdentifier: 'iMessage;-;first-chat', + createdAt: testEpoch, + knownFlags: _messageFlags(fromMe: false), + ), + snapshot: _snapshot(CloudEntityKind.message, messageHash), + ), + throwsA( + predicate( + (failure) => failure.safeCode == 'canonical_identity_mismatch', + ), + ), + ); + expect(store.box().count(), 1); + expect(store.box().count(), 0); + }); + + test('rolls back a message and sender handle for a malformed text range', () { + final chatId = store.box().put( + Chat( + guid: 'chat-guid', + chatIdentifier: 'iMessage;-;range-chat', + style: 45, + ), + ); + final adapter = _newAdapter( + store: store, + activeScopeProvider: () => activeScope, + resolver: resolver, + semanticApplyEnabled: true, + allowMessageUpserts: true, + ); + final payload = _messagePayload( + logicalEntityKeyHash: messageHash, + canonicalGuid: 'message-guid', + chatIdentifier: 'iMessage;-;range-chat', + createdAt: testEpoch, + senderHandle: 'mailto:range-sender@example.com', + attributedBodies: [ + CloudSemanticAttributedBody( + text: 'Hi', + runs: [ + CloudSemanticTextRun( + startUtf16: 1, + lengthUtf16: 2, + messagePart: 0, + attachmentCanonicalGuid: null, + attachmentLogicalKeyHash: null, + mentionHandle: null, + audioTranscript: null, + textEffect: null, + bold: null, + italic: null, + strikethrough: null, + underline: null, + ), + ], + ), + ], + knownFlags: _messageFlags(fromMe: false), + ); + + expect( + () => store.runInTransaction(TxMode.write, () { + adapter.applyEntity( + scope: scope, + generation: generation, + payload: payload, + snapshot: _snapshot(CloudEntityKind.message, messageHash), + ); + }), + throwsA( + predicate( + (failure) => + failure.safeCode == 'canonical_message_text_range_invalid', + ), + ), + ); + expect(store.box().get(chatId), isNotNull); + expect(store.box().count(), 0); + expect(store.box().count(), 0); + }); + + test('blocks decoded extension values before message mutation', () { + store.box().put( + Chat( + guid: 'chat-guid', + chatIdentifier: 'iMessage;-;extension-chat', + style: 45, + ), + ); + final adapter = _newAdapter( + store: store, + activeScopeProvider: () => activeScope, + resolver: resolver, + semanticApplyEnabled: true, + allowMessageUpserts: true, + ); + + expect( + () => adapter.applyEntity( + scope: scope, + generation: generation, + payload: _messagePayload( + logicalEntityKeyHash: messageHash, + canonicalGuid: 'message-guid', + chatIdentifier: 'iMessage;-;extension-chat', + createdAt: testEpoch, + decodedExtensionPayload: Uint8List.fromList([1, 2, 3]), + knownFlags: _messageFlags(fromMe: false), + ), + snapshot: _snapshot(CloudEntityKind.message, messageHash), + ), + throwsA( + predicate( + (failure) => + failure.safeCode == 'canonical_message_extension_decode_required', + ), + ), + ); + expect(store.box().count(), 0); + expect(store.box().count(), 0); + }); + + test( + 'creates and idempotently attaches a reaction to its bare parent GUID', + () { + const reactionHash = 'reaction-hash'; + resolver.put( + scope: scope, + generation: generation, + kind: CloudEntityKind.reaction, + logicalEntityKeyHash: reactionHash, + canonicalGuid: 'reaction-guid', + ); + final chatId = store.box().put( + Chat( + guid: 'chat-guid', + chatIdentifier: 'iMessage;-;reaction-chat', + style: 45, + ), + ); + final parent = Message( + guid: 'message-guid', + dateCreated: testEpoch, + isFromMe: false, + )..chat.targetId = chatId; + final parentId = store.box().put(parent); + final adapter = _newAdapter( + store: store, + activeScopeProvider: () => activeScope, + resolver: resolver, + semanticApplyEnabled: true, + allowReactionUpserts: true, + ); + final payload = _reactionPayload( + logicalEntityKeyHash: reactionHash, + canonicalGuid: 'reaction-guid', + parentPart: 3, + parentCanonicalGuid: 'message-guid', + senderHandle: 'mailto:reactor@example.com', + reactionType: 'emoji', + associatedEmoji: '❤️', + knownFlags: _messageFlags(fromMe: false, delivered: true), + ); + + adapter.applyEntity( + scope: scope, + generation: generation, + payload: payload, + snapshot: _snapshot( + CloudEntityKind.reaction, + reactionHash, + parentLogicalKeyHash: messageHash, + ), + ); + adapter.applyEntity( + scope: scope, + generation: generation, + payload: payload, + snapshot: _snapshot( + CloudEntityKind.reaction, + reactionHash, + parentLogicalKeyHash: messageHash, + ), + ); + + final messages = store.box().getAll(); + expect(messages, hasLength(2)); + final reaction = messages.singleWhere( + (message) => message.guid == 'reaction-guid', + ); + final savedParent = store.box().get(parentId)!; + expect(reaction.chat.targetId, chatId); + expect(reaction.associatedMessageGuid, 'message-guid'); + expect(reaction.associatedMessagePart, 3); + expect(reaction.associatedMessageType, 'emoji'); + expect(reaction.associatedMessageEmoji, '❤️'); + expect(reaction.isDelivered, isTrue); + expect(savedParent.hasReactions, isTrue); + expect(store.box().count(), 1); + }, + ); + + test('preserves a negative removal reaction type', () { + const reactionHash = 'removal-reaction-hash'; + resolver.put( + scope: scope, + generation: generation, + kind: CloudEntityKind.reaction, + logicalEntityKeyHash: reactionHash, + canonicalGuid: 'removal-reaction-guid', + ); + final chatId = store.box().put( + Chat( + guid: 'chat-guid', + chatIdentifier: 'iMessage;-;removal-chat', + style: 45, + ), + ); + final parent = Message( + guid: 'message-guid', + dateCreated: testEpoch, + isFromMe: false, + )..chat.targetId = chatId; + store.box().put(parent); + final adapter = _newAdapter( + store: store, + activeScopeProvider: () => activeScope, + resolver: resolver, + semanticApplyEnabled: true, + allowReactionUpserts: true, + ); + + adapter.applyEntity( + scope: scope, + generation: generation, + payload: _reactionPayload( + logicalEntityKeyHash: reactionHash, + canonicalGuid: 'removal-reaction-guid', + parentCanonicalGuid: 'message-guid', + parentPart: 1, + reactionType: '-like', + associatedEmoji: null, + knownFlags: _messageFlags(fromMe: false), + ), + snapshot: _snapshot( + CloudEntityKind.reaction, + reactionHash, + parentLogicalKeyHash: messageHash, + ), + ); + + final reaction = store.box().getAll().singleWhere( + (message) => message.guid == 'removal-reaction-guid', + ); + expect(reaction.associatedMessageType, '-like'); + expect(reaction.associatedMessageEmoji, isNull); + }); + + test('rejects missing and mismatched reaction parents without an orphan', () { + const reactionHash = 'orphan-reaction-hash'; + resolver.put( + scope: scope, + generation: generation, + kind: CloudEntityKind.reaction, + logicalEntityKeyHash: reactionHash, + canonicalGuid: 'orphan-reaction-guid', + ); + final adapter = _newAdapter( + store: store, + activeScopeProvider: () => activeScope, + resolver: resolver, + semanticApplyEnabled: true, + allowReactionUpserts: true, + ); + + expect( + () => adapter.applyEntity( + scope: scope, + generation: generation, + payload: _reactionPayload( + logicalEntityKeyHash: reactionHash, + canonicalGuid: 'orphan-reaction-guid', + parentCanonicalGuid: 'message-guid', + knownFlags: _messageFlags(fromMe: false), + ), + snapshot: _snapshot( + CloudEntityKind.reaction, + reactionHash, + parentLogicalKeyHash: messageHash, + ), + ), + throwsA( + predicate( + (failure) => + failure.safeCode == 'canonical_reaction_parent_unavailable', + ), + ), + ); + expect(store.box().count(), 0); + expect(store.box().count(), 0); + + expect( + () => adapter.applyEntity( + scope: scope, + generation: generation, + payload: _reactionPayload( + logicalEntityKeyHash: reactionHash, + canonicalGuid: 'orphan-reaction-guid', + parentCanonicalGuid: 'wrong-parent-guid', + knownFlags: _messageFlags(fromMe: false), + ), + snapshot: _snapshot( + CloudEntityKind.reaction, + reactionHash, + parentLogicalKeyHash: messageHash, + ), + ), + throwsA( + predicate( + (failure) => failure.safeCode == 'canonical_identity_mismatch', + ), + ), + ); + expect(store.box().count(), 0); + expect(store.box().count(), 0); + }); + + test('creates and idempotently replays owned attachment metadata', () { + const ownerLogicalKeyHash = 'attachment-owner-message-hash'; + resolver.put( + scope: scope, + generation: generation, + kind: CloudEntityKind.message, + logicalEntityKeyHash: ownerLogicalKeyHash, + canonicalGuid: 'message_guid_with_underscores', + ); + resolver.put( + scope: scope, + generation: generation, + kind: CloudEntityKind.attachment, + logicalEntityKeyHash: 'attachment-hash', + canonicalGuid: 'message_guid_with_underscores_2', + ); + final owner = Message( + guid: 'message_guid_with_underscores', + dateCreated: testEpoch, + isFromMe: false, + ); + final ownerId = store.box().put(owner); + final adapter = _newAdapter( + store: store, + activeScopeProvider: () => activeScope, + resolver: resolver, + semanticApplyEnabled: true, + allowAttachmentMetadataUpserts: true, + ); + final payload = _attachmentPayload( + logicalEntityKeyHash: 'attachment-hash', + canonicalGuid: 'message_guid_with_underscores_2', + ownerLogicalKeyHash: ownerLogicalKeyHash, + ownerCanonicalGuid: 'message_guid_with_underscores', + ownerPart: 2, + utiState: CloudSemanticFieldState.value, + uti: 'public.data', + fileName: 'report.pdf', + mimeType: 'application/pdf', + totalBytesState: CloudSemanticFieldState.value, + totalBytes: 4096, + isOutgoingState: CloudSemanticFieldState.value, + isOutgoing: true, + protectedLocalReference: 'protected:must-not-persist', + ); + + expect( + adapter.applyEntity( + scope: scope, + generation: generation, + payload: payload, + snapshot: _snapshot( + CloudEntityKind.attachment, + 'attachment-hash', + parentLogicalKeyHash: ownerLogicalKeyHash, + ), + ), + CloudCanonicalSemanticMutationReceipt.committed, + ); + expect( + adapter.applyEntity( + scope: scope, + generation: generation, + payload: payload, + snapshot: _snapshot( + CloudEntityKind.attachment, + 'attachment-hash', + parentLogicalKeyHash: ownerLogicalKeyHash, + ), + ), + CloudCanonicalSemanticMutationReceipt.committed, + ); + + final attachments = store.box().getAll(); + expect(attachments, hasLength(1)); + final attachment = attachments.single; + expect(attachment.guid, 'message_guid_with_underscores_2'); + expect(attachment.uti, 'public.data'); + expect(attachment.transferName, 'report.pdf'); + expect(attachment.mimeType, 'application/pdf'); + expect(attachment.totalBytes, 4096); + expect(attachment.isOutgoing, isTrue); + expect(attachment.message.targetId, ownerId); + expect(store.box().get(ownerId)!.hasAttachments, isTrue); + expect(attachment.ckRecordId, isNull); + expect(attachment.metadata, isNull); + expect(attachment.bytes, isNull); + expect(attachment.sourcePath, isNull); + }); + + test('creates a standalone attachment without inventing an owner', () { + resolver.put( + scope: scope, + generation: generation, + kind: CloudEntityKind.attachment, + logicalEntityKeyHash: 'standalone-attachment-hash', + canonicalGuid: 'standalone_attachment_with_underscores', + ); + final adapter = _newAdapter( + store: store, + activeScopeProvider: () => activeScope, + resolver: resolver, + semanticApplyEnabled: true, + allowAttachmentMetadataUpserts: true, + ); + + adapter.applyEntity( + scope: scope, + generation: generation, + payload: _attachmentPayload( + logicalEntityKeyHash: 'standalone-attachment-hash', + canonicalGuid: 'standalone_attachment_with_underscores', + ownerLogicalKeyHash: null, + ownerCanonicalGuid: null, + ownerPart: null, + fileName: 'standalone.bin', + mimeType: 'application/octet-stream', + protectedLocalReference: 'protected:standalone', + ), + snapshot: _snapshot( + CloudEntityKind.attachment, + 'standalone-attachment-hash', + ), + ); + + final attachment = store.box().getAll().single; + expect(attachment.guid, 'standalone_attachment_with_underscores'); + expect(attachment.message.targetId, 0); + expect(store.box().count(), 0); + expect(attachment.ckRecordId, isNull); + expect(attachment.metadata, isNull); + }); + + test('rolls back owner and resolver identity mismatches', () { + resolver.put( + scope: scope, + generation: generation, + kind: CloudEntityKind.attachment, + logicalEntityKeyHash: 'attachment-mismatch-hash', + canonicalGuid: 'message-guid_3', + ); + store.box().put( + Message(guid: 'message-guid', dateCreated: testEpoch, isFromMe: false), + ); + final adapter = _newAdapter( + store: store, + activeScopeProvider: () => activeScope, + resolver: resolver, + semanticApplyEnabled: true, + allowAttachmentMetadataUpserts: true, + ); + + expect( + () => store.runInTransaction(TxMode.write, () { + adapter.applyEntity( + scope: scope, + generation: generation, + payload: _attachmentPayload( + logicalEntityKeyHash: 'attachment-mismatch-hash', + canonicalGuid: 'message-guid_3', + ownerLogicalKeyHash: messageHash, + ownerCanonicalGuid: 'message-guid', + ownerPart: 2, + protectedLocalReference: 'protected:owner-mismatch', + ), + snapshot: _snapshot( + CloudEntityKind.attachment, + 'attachment-mismatch-hash', + parentLogicalKeyHash: messageHash, + ), + ); + }), + throwsA( + predicate( + (failure) => + failure.safeCode == 'canonical_attachment_owner_conflict', + ), + ), + ); + expect(store.box().count(), 0); + expect(store.box().count(), 0); + + expect( + () => store.runInTransaction(TxMode.write, () { + adapter.applyEntity( + scope: scope, + generation: generation, + payload: _attachmentPayload( + logicalEntityKeyHash: 'attachment-mismatch-hash', + canonicalGuid: 'wrong-attachment-guid', + ownerLogicalKeyHash: messageHash, + ownerCanonicalGuid: 'message-guid', + ownerPart: 3, + protectedLocalReference: 'protected:resolver-mismatch', + ), + snapshot: _snapshot( + CloudEntityKind.attachment, + 'attachment-mismatch-hash', + parentLogicalKeyHash: messageHash, + ), + ); + }), + throwsA( + predicate( + (failure) => failure.safeCode == 'canonical_identity_mismatch', + ), + ), + ); + expect(store.box().count(), 0); + expect(store.box().count(), 0); + }); + + test('rejects an existing attachment relation conflict without mutation', () { + resolver.put( + scope: scope, + generation: generation, + kind: CloudEntityKind.attachment, + logicalEntityKeyHash: 'relation-conflict-hash', + canonicalGuid: 'message-guid_1', + ); + final firstOwnerId = store.box().put( + Message(guid: 'message-guid', dateCreated: testEpoch, isFromMe: false), + ); + final secondOwnerId = store.box().put( + Message( + guid: 'other-message-guid', + dateCreated: testEpoch, + isFromMe: false, + ), + ); + final existing = Attachment( + guid: 'message-guid_1', + transferName: 'existing.bin', + )..message.targetId = secondOwnerId; + final attachmentId = store.box().put(existing); + final adapter = _newAdapter( + store: store, + activeScopeProvider: () => activeScope, + resolver: resolver, + semanticApplyEnabled: true, + allowAttachmentMetadataUpserts: true, + ); + + expect( + () => adapter.applyEntity( + scope: scope, + generation: generation, + payload: _attachmentPayload( + logicalEntityKeyHash: 'relation-conflict-hash', + canonicalGuid: 'message-guid_1', + ownerLogicalKeyHash: messageHash, + ownerCanonicalGuid: 'message-guid', + ownerPart: 1, + fileName: 'replacement.bin', + protectedLocalReference: 'protected:relation-conflict', + ), + snapshot: _snapshot( + CloudEntityKind.attachment, + 'relation-conflict-hash', + parentLogicalKeyHash: messageHash, + ), + ), + throwsA( + predicate( + (failure) => + failure.safeCode == 'canonical_attachment_relation_conflict', + ), + ), + ); + final unchanged = store.box().get(attachmentId)!; + expect(unchanged.message.targetId, secondOwnerId); + expect(unchanged.transferName, 'existing.bin'); + expect(store.box().get(firstOwnerId)!.hasAttachments, isFalse); + }); + + test( + 'rolls back an invalid attachment size and keeps the gate default-off', + () { + resolver.put( + scope: scope, + generation: generation, + kind: CloudEntityKind.attachment, + logicalEntityKeyHash: 'invalid-size-hash', + canonicalGuid: 'message-guid_0', + ); + final payload = _attachmentPayload( + logicalEntityKeyHash: 'invalid-size-hash', + canonicalGuid: 'message-guid_0', + ownerLogicalKeyHash: messageHash, + ownerCanonicalGuid: 'message-guid', + ownerPart: 0, + totalBytes: -1, + totalBytesState: CloudSemanticFieldState.value, + protectedLocalReference: 'protected:invalid-size', + ); + final defaultOffAdapter = _newAdapter( + store: store, + activeScopeProvider: () => activeScope, + resolver: resolver, + semanticApplyEnabled: true, + ); + expect( + () => defaultOffAdapter.applyEntity( + scope: scope, + generation: generation, + payload: payload, + snapshot: _snapshot( + CloudEntityKind.attachment, + 'invalid-size-hash', + parentLogicalKeyHash: messageHash, + ), + ), + throwsA( + predicate( + (failure) => failure.safeCode == 'canonical_payload_dto_incomplete', + ), + ), + ); + expect(store.box().count(), 0); + + store.box().put( + Message(guid: 'message-guid', dateCreated: testEpoch, isFromMe: false), + ); + final enabledAdapter = _newAdapter( + store: store, + activeScopeProvider: () => activeScope, + resolver: resolver, + semanticApplyEnabled: true, + allowAttachmentMetadataUpserts: true, + ); + expect( + () => store.runInTransaction(TxMode.write, () { + enabledAdapter.applyEntity( + scope: scope, + generation: generation, + payload: payload, + snapshot: _snapshot( + CloudEntityKind.attachment, + 'invalid-size-hash', + parentLogicalKeyHash: messageHash, + ), + ); + }), + throwsA( + predicate( + (failure) => + failure.safeCode == 'canonical_attachment_size_invalid', + ), + ), + ); + expect(store.box().count(), 0); + expect(store.box().getAll().single.hasAttachments, isFalse); + }, + ); + + test('only updates an existing unlocked chat presentation field', () { + final id = store.box().put( + Chat( + guid: 'chat-guid', + chatIdentifier: 'preserve-this', + displayName: 'Old name', + lockChatName: false, + ), + ); + final adapter = _newAdapter( + store: store, + activeScopeProvider: () => activeScope, + resolver: resolver, + semanticApplyEnabled: true, + allowExistingChatPresentationUpdates: true, + ); + + expect( + adapter.applyEntity( + scope: scope, + generation: generation, + payload: CloudChatEntityPayload( + logicalEntityKeyHash: chatHash, + canonicalGuid: 'chat-guid', + chatIdentifier: 'preserve-this', + displayName: 'Updated name', + participantHandles: const ['should-not-be-written'], + ), + snapshot: _snapshot(CloudEntityKind.chat, chatHash), + ), + CloudCanonicalSemanticMutationReceipt.committed, + ); + + final updated = store.box().get(id)!; + expect(updated.displayName, 'Updated name'); + expect(updated.chatIdentifier, 'preserve-this'); + expect(updated.guidRefs, ['chat-guid']); + + updated.lockChatName = true; + store.box().put(updated); + adapter.applyEntity( + scope: scope, + generation: generation, + payload: CloudChatEntityPayload( + logicalEntityKeyHash: chatHash, + canonicalGuid: 'chat-guid', + chatIdentifier: 'preserve-this', + displayName: 'Must preserve local lock', + participantHandles: const [], + ), + snapshot: _snapshot(CloudEntityKind.chat, chatHash), + ); + expect(store.box().get(id)!.displayName, 'Updated name'); + }); + + test('refuses message creation until the native DTO is sufficient', () { + final adapter = _newAdapter( + store: store, + activeScopeProvider: () => activeScope, + resolver: resolver, + semanticApplyEnabled: true, + ); + + expect( + () => adapter.applyEntity( + scope: scope, + generation: generation, + payload: CloudMessageEntityPayload( + logicalEntityKeyHash: messageHash, + canonicalGuid: 'message-guid', + chatAliasKeyHash: chatHash, + chatIdentifier: 'iMessage;-;chat', + body: 'synthetic body', + senderHandle: 'synthetic@example.invalid', + ), + snapshot: _snapshot( + CloudEntityKind.message, + messageHash, + parentLogicalKeyHash: chatHash, + ), + ), + throwsA( + predicate( + (failure) => + failure.category == CloudFailureCategory.dependency && + failure.safeCode == 'canonical_payload_dto_incomplete', + ), + ), + ); + expect(store.box().count(), 0); + expect(store.box().count(), 0); + expect(store.box().count(), 0); + }); + + test('refuses a stale account fence without mutating canonical rows', () { + final id = store.box().put(Chat(guid: 'chat-guid')); + final adapter = _newAdapter( + store: store, + activeScopeProvider: () => activeScope, + resolver: resolver, + semanticApplyEnabled: true, + allowExistingChatPresentationUpdates: true, + ); + + expect( + () => adapter.applyEntity( + scope: scope, + generation: generation + 1, + payload: CloudChatEntityPayload( + logicalEntityKeyHash: chatHash, + canonicalGuid: 'chat-guid', + chatIdentifier: 'preserve-this', + displayName: 'Wrong generation', + participantHandles: const [], + ), + snapshot: _snapshot(CloudEntityKind.chat, chatHash), + ), + throwsA( + predicate( + (failure) => failure.safeCode == 'canonical_scope_fence_rejected', + ), + ), + ); + expect(store.box().get(id)!.displayName, isNull); + }); +} + +ObjectBoxCanonicalSemanticEntityAdapter _newAdapter({ + required Store store, + required CloudCanonicalActiveScope? Function() activeScopeProvider, + required CloudCanonicalIdentityResolver resolver, + bool semanticApplyEnabled = false, + bool allowExistingChatPresentationUpdates = false, + bool allowChatUpserts = false, + bool allowExistingChatDisplayNameClears = false, + bool allowMessageUpserts = false, + bool allowReactionUpserts = false, + bool allowAttachmentMetadataUpserts = false, +}) => ObjectBoxCanonicalSemanticEntityAdapter( + store: store, + activeScopeProvider: activeScopeProvider, + identityResolver: resolver, + semanticApplyEnabled: semanticApplyEnabled, + allowExistingChatPresentationUpdates: allowExistingChatPresentationUpdates, + allowChatUpserts: allowChatUpserts, + allowExistingChatDisplayNameClears: allowExistingChatDisplayNameClears, + allowMessageUpserts: allowMessageUpserts, + allowReactionUpserts: allowReactionUpserts, + allowAttachmentMetadataUpserts: allowAttachmentMetadataUpserts, +); + +CloudChatEntityPayload _chatPayload({ + required String logicalEntityKeyHash, + required String canonicalGuid, + required String chatIdentifier, + String? displayName = 'Cloud chat', + CloudSemanticFieldState? displayNameState, + Iterable participantHandles = const [], + CloudSemanticChatStyle style = CloudSemanticChatStyle.direct, + int? groupVersion, +}) => CloudChatEntityPayload( + logicalEntityKeyHash: logicalEntityKeyHash, + canonicalGuid: canonicalGuid, + chatIdentifier: chatIdentifier, + displayName: displayName, + displayNameState: displayNameState, + participantHandles: participantHandles, + service: CloudSemanticService.iMessage, + style: style, + groupVersionState: groupVersion == null + ? CloudSemanticFieldState.absent + : CloudSemanticFieldState.value, + groupVersion: groupVersion, +); + +CloudMessageEntityPayload _messagePayload({ + required String logicalEntityKeyHash, + required String canonicalGuid, + required String chatIdentifier, + DateTime? createdAt, + String? subject = 'Cloud subject', + String? body = 'Cloud body', + String senderHandle = 'mailto:sender@example.com', + CloudSemanticFieldState subjectState = CloudSemanticFieldState.value, + CloudSemanticFieldState bodyState = CloudSemanticFieldState.value, + DateTime? readAt, + DateTime? deliveredAt, + CloudSemanticFieldState? readAtState, + CloudSemanticFieldState? deliveredAtState, + String? effect, + CloudSemanticFieldState? effectState, + Iterable attributedBodies = const [], + CloudSemanticFieldState? attributedBodiesState, + Uint8List? decodedExtensionPayload, + CloudSemanticFieldState? decodedExtensionPayloadState, + CloudSemanticKnownMessageFlags? knownFlags, +}) => CloudMessageEntityPayload( + logicalEntityKeyHash: logicalEntityKeyHash, + canonicalGuid: canonicalGuid, + chatAliasKeyHash: _defaultChatHash, + chatIdentifier: chatIdentifier, + body: body, + senderHandle: senderHandle, + createdAt: createdAt ?? testEpoch, + service: CloudSemanticService.iMessage, + subjectState: subjectState, + subject: subject, + bodyState: bodyState, + attributedBodiesState: + attributedBodiesState ?? + (attributedBodies.isEmpty + ? CloudSemanticFieldState.absent + : CloudSemanticFieldState.value), + attributedBodies: attributedBodies, + decodedExtensionPayloadState: + decodedExtensionPayloadState ?? + (decodedExtensionPayload == null + ? CloudSemanticFieldState.absent + : CloudSemanticFieldState.value), + decodedExtensionPayload: decodedExtensionPayload, + effectState: + effectState ?? + (effect == null + ? CloudSemanticFieldState.absent + : CloudSemanticFieldState.value), + effect: effect, + readAtState: + readAtState ?? + (readAt == null + ? CloudSemanticFieldState.absent + : CloudSemanticFieldState.value), + readAt: readAt, + deliveredAtState: + deliveredAtState ?? + (deliveredAt == null + ? CloudSemanticFieldState.absent + : CloudSemanticFieldState.value), + deliveredAt: deliveredAt, + knownFlags: knownFlags ?? _messageFlags(fromMe: false), +); + +CloudSemanticKnownMessageFlags _messageFlags({ + required bool fromMe, + bool delivered = false, + bool read = false, + bool hasDataDetectorResults = false, + bool deliveredQuietly = false, + bool didNotifyRecipient = false, +}) => CloudSemanticKnownMessageFlags( + fromMe: fromMe, + delivered: delivered, + read: read, + hasDataDetectorResults: hasDataDetectorResults, + deliveredQuietly: deliveredQuietly, + didNotifyRecipient: didNotifyRecipient, +); + +CloudReactionEntityPayload _reactionPayload({ + required String logicalEntityKeyHash, + required String canonicalGuid, + String parentLogicalKeyHash = _defaultMessageHash, + String parentCanonicalGuid = 'message-guid', + int? parentPart = 0, + String senderHandle = 'mailto:reactor@example.com', + String reactionType = 'emoji', + String? associatedEmoji = '❤️', + DateTime? createdAt, + CloudSemanticKnownMessageFlags? knownFlags, +}) => CloudReactionEntityPayload( + logicalEntityKeyHash: logicalEntityKeyHash, + canonicalGuid: canonicalGuid, + parentLogicalKeyHash: parentLogicalKeyHash, + parentCanonicalGuid: parentCanonicalGuid, + parentPart: parentPart, + senderHandle: senderHandle, + reactionType: reactionType, + associatedEmoji: associatedEmoji, + createdAt: createdAt ?? testEpoch, + service: CloudSemanticService.iMessage, + knownFlags: knownFlags ?? _messageFlags(fromMe: false), +); + +CloudAttachmentEntityPayload _attachmentPayload({ + required String logicalEntityKeyHash, + required String canonicalGuid, + required String? ownerLogicalKeyHash, + required String? ownerCanonicalGuid, + required int? ownerPart, + String? uti, + CloudSemanticFieldState utiState = CloudSemanticFieldState.absent, + String? fileName = 'attachment.bin', + CloudSemanticFieldState fileNameState = CloudSemanticFieldState.value, + String? mimeType = 'application/octet-stream', + CloudSemanticFieldState? mimeTypeState, + int? totalBytes, + CloudSemanticFieldState totalBytesState = CloudSemanticFieldState.absent, + bool? isOutgoing, + CloudSemanticFieldState isOutgoingState = CloudSemanticFieldState.absent, + required String? protectedLocalReference, + CloudSemanticFieldState protectedLocalReferenceState = + CloudSemanticFieldState.value, +}) => CloudAttachmentEntityPayload( + logicalEntityKeyHash: logicalEntityKeyHash, + canonicalGuid: canonicalGuid, + ownerLogicalKeyHash: ownerLogicalKeyHash, + ownerCanonicalGuid: ownerCanonicalGuid, + ownerPart: ownerPart, + utiState: utiState, + uti: uti, + fileNameState: fileNameState, + fileName: fileName, + mimeTypeState: mimeTypeState, + mimeType: mimeType, + totalBytesState: totalBytesState, + totalBytes: totalBytes, + isOutgoingState: isOutgoingState, + isOutgoing: isOutgoing, + protectedLocalReferenceState: protectedLocalReferenceState, + protectedLocalReference: protectedLocalReference, +); + +CloudSemanticSnapshot _snapshot( + CloudEntityKind kind, + String logicalEntityKeyHash, { + String? parentLogicalKeyHash, +}) => CloudSemanticSnapshot( + kind: kind, + logicalEntityKeyHash: logicalEntityKeyHash, + parentLogicalKeyHash: parentLogicalKeyHash, + immutableContentDigest: 'content-digest', +); + +final class _Resolver implements CloudCanonicalIdentityResolver { + final Map _values = {}; + + void put({ + required CloudSyncScope scope, + required int generation, + required CloudEntityKind kind, + required String logicalEntityKeyHash, + required String canonicalGuid, + }) { + _values[_key(scope, generation, kind, logicalEntityKeyHash)] = + canonicalGuid; + } + + @override + String? resolveCanonicalGuid({ + required CloudSyncScope scope, + required int generation, + required CloudEntityKind kind, + required String logicalEntityKeyHash, + }) => _values[_key(scope, generation, kind, logicalEntityKeyHash)]; + + String _key( + CloudSyncScope scope, + int generation, + CloudEntityKind kind, + String logicalEntityKeyHash, + ) => '${scope.storageKey}:$generation:${kind.name}:$logicalEntityKeyHash'; +} diff --git a/test/services/cloud_sync/objectbox_cloud_semantic_store_gateway_test.dart b/test/services/cloud_sync/objectbox_cloud_semantic_store_gateway_test.dart new file mode 100644 index 0000000000..ca6088ef97 --- /dev/null +++ b/test/services/cloud_sync/objectbox_cloud_semantic_store_gateway_test.dart @@ -0,0 +1,1478 @@ +import 'dart:convert'; +import 'dart:io'; + +import 'package:bluebubbles/database/models.dart'; +import 'package:bluebubbles/services/rustpush/cloud_sync/cloud_sync.dart'; +import 'package:crypto/crypto.dart'; +import 'package:flutter_test/flutter_test.dart'; + +void main() { + final now = DateTime.utc(2026, 8, 1, 12); + final scope = _scope(); + const leaseFence = CloudCoordinatorLeaseFence( + ownerId: 'semantic-test-owner', + generation: 4, + ); + late Directory directory; + late Store objectBox; + late _ObjectBoxTestCanonicalAdapter adapter; + late ObjectBoxCloudSemanticStoreGateway gateway; + + setUp(() async { + directory = await Directory.systemTemp.createTemp( + 'openbubbles-cloud-semantic-gateway-', + ); + objectBox = await openStore(directory: directory.path); + adapter = _ObjectBoxTestCanonicalAdapter(objectBox) + ..activeScope = scope + ..activeGeneration = 7 + ..existingEntities.add((CloudEntityKind.chat, _digestValue('H'))); + gateway = ObjectBoxCloudSemanticStoreGateway( + store: objectBox, + canonicalAdapter: adapter, + clock: () => now, + ); + }); + + tearDown(() async { + objectBox.close(); + if (directory.existsSync()) await directory.delete(recursive: true); + }); + + test( + 'atomically commits canonical, snapshot, map, replay, and inbox', + () async { + final entry = _entry(scope: scope); + _seedDurableFence( + objectBox, + entry: entry, + leaseFence: leaseFence, + now: now, + ); + + final result = await gateway.writeTransaction( + entry: entry, + leaseFence: leaseFence, + action: (transaction) { + _applyMessage(transaction); + transaction.markChangeApplied(entry.change.changeId); + return const CloudInboxApplyResult.applied( + inboxStatusPersisted: true, + ); + }, + ); + + expect(result.inboxStatusPersisted, isTrue); + expect(adapter.entityApplyCalls, 1); + expect(objectBox.box().count(), 1); + expect(objectBox.box().count(), 1); + expect(objectBox.box().count(), 1); + expect(objectBox.box().count(), 1); + + final map = objectBox.box().getAll().single; + expect(map.logicalEntityKeyHash, _digestValue('L')); + expect(map.serverRecordIdHash, entry.change.recordIdHash); + expect(map.encryptedServerRecordId, _protectedReference('S')); + expect(map.encryptedRawRecordRef, _protectedReference('W')); + + final replay = objectBox.box().getAll().single; + expect(replay.terminalOutcome, 'applied'); + expect(replay.terminalSafeCode, isNull); + expect(replay.serverRecordIdHash, entry.change.recordIdHash); + expect(replay.logicalEntityKeyHash, _digestValue('L')); + expect(replay.payloadSha256, entry.change.payloadSha256); + expect(replay.inboxSequence, entry.sequence); + expect(replay.changeType, entry.change.type.name); + + final inbox = objectBox.box().getAll().single; + expect(inbox.status, CloudInboxStatus.applied.index); + expect(inbox.completedAtMs, now.millisecondsSinceEpoch); + final checkpoint = objectBox + .box() + .getAll() + .single; + expect(checkpoint.appliedSequence, 1); + }, + ); + + test('rejects legacy transport grammar before opening a transaction', () async { + final entry = _entry( + scope: scope, + changeId: + 'change2:aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa', + recordIdHash: + 'sha256:bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb', + etagHash: + 'sha256:cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc', + encryptedServerRecordId: _protectedReference('S'), + protectedSystemFieldsReference: null, + encryptedPayloadReference: _protectedReference('W'), + ); + _seedDurableFence( + objectBox, + entry: entry, + leaseFence: leaseFence, + now: now, + ); + + expect( + () => gateway.writeTransaction( + entry: entry, + leaseFence: leaseFence, + action: _applyAndMark(entry), + ), + throwsA(_failureCode('semantic_digest_invalid')), + ); + _expectNoSemanticMutation(objectBox, adapter); + }); + + test( + 'durable metadata never stores transient payload identity or content', + () async { + const secretBody = 'PRIVATE BODY 97213'; + const secretSender = 'private.sender@example.com'; + const secretMessageGuid = 'PRIVATE-MESSAGE-GUID-97213'; + const secretChatIdentifier = 'iMessage;-;PRIVATE-CHAT-97213'; + final entry = _entry(scope: scope); + _seedDurableFence( + objectBox, + entry: entry, + leaseFence: leaseFence, + now: now, + ); + + await gateway.writeTransaction( + entry: entry, + leaseFence: leaseFence, + action: (transaction) { + transaction.applyEntity( + payload: CloudMessageEntityPayload( + logicalEntityKeyHash: _digestValue('L'), + canonicalGuid: secretMessageGuid, + chatAliasKeyHash: _digestValue('H'), + chatIdentifier: secretChatIdentifier, + body: secretBody, + senderHandle: secretSender, + ), + snapshot: _snapshot(), + ); + transaction.markChangeApplied(entry.change.changeId); + }, + ); + + final durable = [ + ...objectBox.box().getAll().expand( + (row) => [ + row.snapshotKey, + row.scopeGenerationKey, + row.scopeKey, + row.accountFingerprint, + row.logicalEntityKeyHash, + row.editPartsJson, + ], + ), + ...objectBox.box().getAll().expand( + (row) => [ + row.replayKey, + row.scopeGenerationKey, + row.scopeKey, + row.accountFingerprint, + row.changeIdHash, + row.serverRecordIdHash, + row.logicalEntityKeyHash ?? '', + row.payloadSha256 ?? '', + row.terminalOutcome, + row.terminalSafeCode ?? '', + ], + ), + ...objectBox.box().getAll().expand( + (row) => [ + row.mapKey, + row.logicalEntityKeyHash, + row.serverRecordIdHash, + row.encryptedServerRecordId, + row.encryptedRawRecordRef ?? '', + ], + ), + ].join('\n'); + expect(durable, isNot(contains(secretBody))); + expect(durable, isNot(contains(secretSender))); + expect(durable, isNot(contains(secretMessageGuid))); + expect(durable, isNot(contains(secretChatIdentifier))); + }, + ); + + test('semantic metadata and protected record map survive reopen', () async { + final entry = _entry(scope: scope); + _seedDurableFence( + objectBox, + entry: entry, + leaseFence: leaseFence, + now: now, + ); + await gateway.writeTransaction( + entry: entry, + leaseFence: leaseFence, + action: _applyAndMark(entry), + ); + + objectBox.close(); + objectBox = await openStore(directory: directory.path); + adapter = _ObjectBoxTestCanonicalAdapter(objectBox) + ..activeScope = scope + ..activeGeneration = 7 + ..existingEntities.add((CloudEntityKind.chat, _digestValue('H'))); + gateway = ObjectBoxCloudSemanticStoreGateway( + store: objectBox, + canonicalAdapter: adapter, + clock: () => now, + ); + + final replay = objectBox.box().getAll().single; + final map = objectBox.box().getAll().single; + expect(replay.terminalOutcome, 'applied'); + expect(replay.logicalEntityKeyHash, _digestValue('L')); + expect(map.encryptedRawRecordRef, _protectedReference('W')); + }); + + test('lease takeover fails before canonical mutation', () async { + final entry = _entry(scope: scope); + _seedDurableFence( + objectBox, + entry: entry, + leaseFence: const CloudCoordinatorLeaseFence( + ownerId: 'new-owner', + generation: 5, + ), + now: now, + ); + + await expectLater( + gateway.writeTransaction( + entry: entry, + leaseFence: leaseFence, + action: _applyAndMark(entry), + ), + throwsA(_failureCode('semantic_coordinator_lease_fence_lost')), + ); + _expectNoSemanticMutation(objectBox, adapter); + }); + + test('expired lease fails before canonical mutation', () async { + final entry = _entry(scope: scope); + _seedDurableFence( + objectBox, + entry: entry, + leaseFence: leaseFence, + now: now, + expiresAt: now, + ); + + await expectLater( + gateway.writeTransaction( + entry: entry, + leaseFence: leaseFence, + action: _applyAndMark(entry), + ), + throwsA(_failureCode('semantic_coordinator_lease_fence_lost')), + ); + _expectNoSemanticMutation(objectBox, adapter); + }); + + test('account switch fails before canonical mutation', () async { + final entry = _entry(scope: scope); + _seedDurableFence( + objectBox, + entry: entry, + leaseFence: leaseFence, + now: now, + ); + adapter.activeScope = _scope(account: _digestValue('B')); + + await expectLater( + gateway.writeTransaction( + entry: entry, + leaseFence: leaseFence, + action: _applyAndMark(entry), + ), + throwsA(_failureCode('semantic_active_account_scope_changed')), + ); + _expectNoSemanticMutation(objectBox, adapter); + }); + + test('generation reset fails before canonical mutation', () async { + final entry = _entry(scope: scope); + _seedDurableFence( + objectBox, + entry: entry, + leaseFence: leaseFence, + now: now, + checkpointGeneration: 8, + ); + + await expectLater( + gateway.writeTransaction( + entry: entry, + leaseFence: leaseFence, + action: _applyAndMark(entry), + ), + throwsA(_failureCode('semantic_checkpoint_fence_lost')), + ); + _expectNoSemanticMutation(objectBox, adapter); + }); + + test('exact inbox digest and sequence are fenced', () async { + final entry = _entry(scope: scope); + _seedDurableFence( + objectBox, + entry: entry, + leaseFence: leaseFence, + now: now, + ); + final row = objectBox.box().getAll().single + ..payloadSha256 = _digestValue('X'); + objectBox.box().put(row); + + await expectLater( + gateway.writeTransaction( + entry: entry, + leaseFence: leaseFence, + action: _applyAndMark(entry), + ), + throwsA(_failureCode('semantic_inbox_fence_lost')), + ); + _expectNoSemanticMutation(objectBox, adapter); + }); + + test('captured transaction is inactive after callback returns', () async { + final entry = _entry(scope: scope); + _seedDurableFence( + objectBox, + entry: entry, + leaseFence: leaseFence, + now: now, + ); + late CloudSemanticStoreTransaction escaped; + + await gateway.writeTransaction( + entry: entry, + leaseFence: leaseFence, + action: (transaction) { + escaped = transaction; + }, + ); + + expect( + () => escaped.entityExists( + kind: CloudEntityKind.message, + logicalEntityKeyHash: _digestValue('L'), + ), + throwsA(_failureCode('semantic_transaction_inactive')), + ); + }); + + test('scheduled microtask cannot use a committed transaction', () async { + final entry = _entry(scope: scope); + _seedDurableFence( + objectBox, + entry: entry, + leaseFence: leaseFence, + now: now, + ); + late Future deferredUse; + + await gateway.writeTransaction( + entry: entry, + leaseFence: leaseFence, + action: (transaction) { + deferredUse = Future.microtask(() { + try { + transaction.entityExists( + kind: CloudEntityKind.message, + logicalEntityKeyHash: _digestValue('L'), + ); + return StateError('transaction unexpectedly remained active'); + } catch (error) { + return error; + } + }); + }, + ); + + final error = await deferredUse; + expect(error, _failureCode('semantic_transaction_inactive')); + }); + + test( + 'discarded nested gateway call aborts and rolls back outer transaction', + () async { + final entry = _entry(scope: scope); + _seedDurableFence( + objectBox, + entry: entry, + leaseFence: leaseFence, + now: now, + ); + + await expectLater( + gateway.writeTransaction( + entry: entry, + leaseFence: leaseFence, + action: (transaction) { + transaction.applyEntity(payload: _payload(), snapshot: _snapshot()); + gateway.writeTransaction( + entry: entry, + leaseFence: leaseFence, + action: (_) {}, + ); + }, + ), + throwsA(_failureCode('semantic_nested_transaction_forbidden')), + ); + _expectNoSemanticMutation(objectBox, adapter); + }, + ); + + test('missing terminal outcome rolls back canonical state', () async { + final entry = _entry(scope: scope); + _seedDurableFence( + objectBox, + entry: entry, + leaseFence: leaseFence, + now: now, + ); + + await expectLater( + gateway.writeTransaction( + entry: entry, + leaseFence: leaseFence, + action: (transaction) { + transaction.applyEntity(payload: _payload(), snapshot: _snapshot()); + }, + ), + throwsA(_failureCode('semantic_terminal_outcome_missing')), + ); + _expectNoSemanticMutation(objectBox, adapter); + }); + + test('record binding without a terminal outcome rolls back', () async { + final entry = _entry(scope: scope); + _seedDurableFence( + objectBox, + entry: entry, + leaseFence: leaseFence, + now: now, + ); + + await expectLater( + gateway.writeTransaction( + entry: entry, + leaseFence: leaseFence, + action: (transaction) { + transaction.bindRecordIdentity( + logicalEntityKeyHash: _digestValue('L'), + encryptedRawRecordReference: _protectedReference('W'), + ); + }, + ), + throwsA(_failureCode('semantic_terminal_outcome_missing')), + ); + _expectNoSemanticMutation(objectBox, adapter); + }); + + test( + 'quarantine after a canonical mutation is forbidden and rolls back', + () async { + final entry = _entry(scope: scope); + _seedDurableFence( + objectBox, + entry: entry, + leaseFence: leaseFence, + now: now, + ); + + await expectLater( + gateway.writeTransaction( + entry: entry, + leaseFence: leaseFence, + action: (transaction) { + _applyMessage(transaction); + transaction.quarantineChange( + entry.change.changeId, + 'late_quarantine', + ); + }, + ), + throwsA(_failureCode('semantic_quarantine_after_mutation_forbidden')), + ); + _expectNoSemanticMutation(objectBox, adapter); + }, + ); + + test( + 'a terminal transaction rejects any later mutation and rolls back', + () async { + final entry = _entry(scope: scope); + _seedDurableFence( + objectBox, + entry: entry, + leaseFence: leaseFence, + now: now, + ); + + await expectLater( + gateway.writeTransaction( + entry: entry, + leaseFence: leaseFence, + action: (transaction) { + transaction.bindRecordIdentity( + logicalEntityKeyHash: _digestValue('L'), + encryptedRawRecordReference: _protectedReference('W'), + ); + transaction.markChangeApplied(entry.change.changeId); + _applyMessage(transaction); + }, + ), + throwsA(_failureCode('semantic_transaction_terminal')), + ); + _expectNoSemanticMutation(objectBox, adapter); + }, + ); + + test('decoder raw-envelope or etag substitution rolls back', () async { + for (final snapshot in [ + _snapshot().copyWith( + encryptedRawRecordReference: _protectedReference('X'), + ), + _snapshot().copyWith(etagHash: _digestValue('X')), + ]) { + final entry = _entry( + scope: _scope( + account: snapshot.etagHash == _digestValue('X') + ? _digestValue('F') + : _digestValue('G'), + ), + ); + adapter.activeScope = entry.scope; + adapter.existingEntities.add((CloudEntityKind.chat, _digestValue('H'))); + _seedDurableFence( + objectBox, + entry: entry, + leaseFence: leaseFence, + now: now, + ); + await expectLater( + gateway.writeTransaction( + entry: entry, + leaseFence: leaseFence, + action: (transaction) { + transaction.applyEntity(payload: _payload(), snapshot: snapshot); + }, + ), + throwsA(_failureCode('semantic_snapshot_envelope_mismatch')), + ); + } + expect(objectBox.box().count(), 0); + expect(objectBox.box().count(), 0); + expect(objectBox.box().count(), 0); + expect(objectBox.box().count(), 0); + }); + + test( + 'ambiguous contiguous inbox sequence aborts checkpoint advancement', + () async { + final entry = _entry(scope: scope); + _seedDurableFence( + objectBox, + entry: entry, + leaseFence: leaseFence, + now: now, + ); + final original = objectBox.box().getAll().single; + objectBox.box().put( + _copyInbox(original, changeKey: 'duplicate:${_sha256('sequence-1')}'), + ); + + await expectLater( + gateway.writeTransaction( + entry: entry, + leaseFence: leaseFence, + action: _applyAndMark(entry), + ), + throwsA(_failureCode('semantic_inbox_sequence_ambiguous')), + ); + expect(objectBox.box().count(), 0); + expect(objectBox.box().count(), 0); + expect(objectBox.box().count(), 0); + expect(objectBox.box().count(), 0); + expect( + objectBox + .box() + .getAll() + .where((row) => row.changeKey == original.changeKey) + .single + .status, + CloudInboxStatus.pending.index, + ); + }, + ); + + test('checkpoint cannot claim an applied sequence beyond fetched', () async { + final entry = _entry(scope: scope); + _seedDurableFence( + objectBox, + entry: entry, + leaseFence: leaseFence, + now: now, + ); + final checkpoint = + objectBox.box().getAll().single + ..appliedSequence = 2; + objectBox.box().put(checkpoint); + + await expectLater( + gateway.writeTransaction( + entry: entry, + leaseFence: leaseFence, + action: _applyAndMark(entry), + ), + throwsA(_failureCode('semantic_checkpoint_fence_lost')), + ); + _expectNoSemanticMutation(objectBox, adapter); + }); + + test( + 'record-map conflict fails closed and rolls back canonical state', + () async { + final entry = _entry(scope: scope); + _seedDurableFence( + objectBox, + entry: entry, + leaseFence: leaseFence, + now: now, + ); + objectBox.box().put( + CloudRecordMapEntity( + mapKey: _recordMapKey(scope, _digestValue('L')), + scopeKey: _scopeKey(scope), + accountFingerprint: scope.accountFingerprint, + zone: scope.zone, + logicalEntityKeyHash: _digestValue('L'), + serverRecordIdHash: _digestValue('Z'), + encryptedServerRecordId: _protectedReference('O'), + updatedAtMs: now.millisecondsSinceEpoch, + ), + ); + + await expectLater( + gateway.writeTransaction( + entry: entry, + leaseFence: leaseFence, + action: _applyAndMark(entry), + ), + throwsA(_failureCode('semantic_record_mapping_conflict')), + ); + expect(objectBox.box().count(), 0); + expect(objectBox.box().count(), 0); + expect(objectBox.box().count(), 0); + expect(objectBox.box().count(), 1); + }, + ); + + test( + 'required payload parents must exactly match snapshot parents', + () async { + final cases = + < + ( + CloudSyncScope, + CloudSemanticEntityPayload, + CloudSemanticSnapshot, + String, + ) + >[ + ( + _scope(account: _digestValue('B'), zone: 'messageManateeZone'), + CloudMessageEntityPayload( + logicalEntityKeyHash: _digestValue('L'), + canonicalGuid: 'message-guid', + chatAliasKeyHash: _digestValue('P'), + chatIdentifier: 'iMessage;-;chat', + body: 'message', + senderHandle: 'sender', + ), + CloudSemanticSnapshot( + kind: CloudEntityKind.message, + logicalEntityKeyHash: _digestValue('L'), + parentLogicalKeyHash: _digestValue('Q'), + ), + 'semantic_parent_identity_invalid', + ), + ( + _scope(account: _digestValue('C'), zone: 'messageManateeZone'), + CloudReactionEntityPayload( + logicalEntityKeyHash: _digestValue('Y'), + canonicalGuid: 'reaction-guid', + parentLogicalKeyHash: _digestValue('P'), + parentCanonicalGuid: 'parent-message-guid', + parentPart: 0, + senderHandle: 'sender', + reactionType: 'like', + ), + CloudSemanticSnapshot( + kind: CloudEntityKind.reaction, + logicalEntityKeyHash: _digestValue('Y'), + ), + 'semantic_parent_identity_mismatch', + ), + ( + _scope(account: _digestValue('D'), zone: 'attachmentManateeZone'), + CloudAttachmentEntityPayload( + logicalEntityKeyHash: _digestValue('T'), + canonicalGuid: 'attachment-guid', + ownerLogicalKeyHash: _digestValue('P'), + ownerCanonicalGuid: 'owner-message-guid', + ownerPart: 0, + fileName: 'photo.jpg', + mimeType: 'image/jpeg', + protectedLocalReference: _protectedReference('A'), + ), + CloudSemanticSnapshot( + kind: CloudEntityKind.attachment, + logicalEntityKeyHash: _digestValue('T'), + parentLogicalKeyHash: _digestValue('Q'), + ), + 'semantic_parent_identity_mismatch', + ), + ( + _scope(account: _digestValue('E'), zone: 'chatManateeZone'), + CloudGroupPhotoEntityPayload( + logicalEntityKeyHash: _digestValue('G'), + ownerLogicalKeyHash: _digestValue('P'), + photoGuid: 'group-photo-guid', + protectedLocalReference: _protectedReference('G'), + ), + CloudSemanticSnapshot( + kind: CloudEntityKind.groupPhoto, + logicalEntityKeyHash: _digestValue('G'), + parentLogicalKeyHash: _digestValue('Q'), + ), + 'semantic_parent_identity_mismatch', + ), + ]; + + for (final (caseScope, payload, snapshot, safeCode) in cases) { + final entry = _entry(scope: caseScope); + adapter.activeScope = caseScope; + _seedDurableFence( + objectBox, + entry: entry, + leaseFence: leaseFence, + now: now, + ); + await expectLater( + gateway.writeTransaction( + entry: entry, + leaseFence: leaseFence, + action: (transaction) { + transaction.applyEntity(payload: payload, snapshot: snapshot); + }, + ), + throwsA(_failureCode(safeCode)), + ); + } + expect(objectBox.box().count(), 0); + expect(objectBox.box().count(), 0); + expect(objectBox.box().count(), 0); + expect(objectBox.box().count(), 0); + expect( + objectBox.box().getAll().every( + (row) => row.status == CloudInboxStatus.pending.index, + ), + isTrue, + ); + }, + ); + + test( + 'accepts a reply message with the exact existing snapshot parent', + () async { + final entry = _entry(scope: scope); + final parentKey = _digestValue('P'); + adapter.existingEntities.add((CloudEntityKind.message, parentKey)); + _seedDurableFence( + objectBox, + entry: entry, + leaseFence: leaseFence, + now: now, + ); + + await gateway.writeTransaction( + entry: entry, + leaseFence: leaseFence, + action: (transaction) { + transaction.applyEntity( + payload: CloudMessageEntityPayload( + logicalEntityKeyHash: _digestValue('L'), + canonicalGuid: 'reply-message-guid', + chatAliasKeyHash: _digestValue('H'), + chatIdentifier: 'iMessage;-;chat', + body: 'reply', + senderHandle: 'sender', + replyParentLogicalKeyHash: parentKey, + replyParentCanonicalGuid: 'parent-message-guid', + replyParentPart: '0', + ), + snapshot: CloudSemanticSnapshot( + kind: CloudEntityKind.message, + logicalEntityKeyHash: _digestValue('L'), + parentLogicalKeyHash: parentKey, + etagHash: entry.change.etagHash, + encryptedRawRecordReference: + entry.change.encryptedPayloadReference, + ), + ); + transaction.markChangeApplied(entry.change.changeId); + }, + ); + + expect(adapter.entityApplyCalls, 1); + expect(objectBox.box().count(), 1); + expect( + objectBox.box().getAll().single.status, + CloudInboxStatus.applied.index, + ); + }, + ); + + test('message and profile streams reject the wrong entity kinds', () async { + final entry = _entry(scope: scope); + _seedDurableFence( + objectBox, + entry: entry, + leaseFence: leaseFence, + now: now, + ); + + await expectLater( + gateway.writeTransaction( + entry: entry, + leaseFence: leaseFence, + action: (transaction) { + transaction.applyEntity( + payload: CloudProfileEntityPayload( + logicalEntityKeyHash: _digestValue('F'), + displayName: 'Profile', + handle: 'profile@example.com', + ), + snapshot: CloudSemanticSnapshot( + kind: CloudEntityKind.sharedProfile, + logicalEntityKeyHash: _digestValue('F'), + ), + ); + }, + ), + throwsA(_failureCode('semantic_stream_entity_mismatch')), + ); + _expectNoSemanticMutation(objectBox, adapter); + }); + + test( + 'replay outcome is bound to payload, record, generation, and sequence', + () async { + final entry = _entry(scope: scope); + _seedDurableFence( + objectBox, + entry: entry, + leaseFence: leaseFence, + now: now, + ); + await gateway.writeTransaction( + entry: entry, + leaseFence: leaseFence, + action: _applyAndMark(entry), + ); + + final inbox = objectBox.box().getAll().single + ..status = CloudInboxStatus.pending.index + ..payloadSha256 = _digestValue('X'); + objectBox.box().put(inbox); + final changedEntry = _entry( + scope: scope, + payloadSha256: _digestValue('X'), + ); + + await expectLater( + gateway.writeTransaction( + entry: changedEntry, + leaseFence: leaseFence, + action: (transaction) { + transaction.hasAppliedChange(changedEntry.change.changeId); + }, + ), + throwsA(_failureCode('semantic_replay_binding_mismatch')), + ); + expect(objectBox.box().count(), 1); + }, + ); + + test( + 'replay rejects a corrupted protected record-map binding after reopen', + () async { + final entry = _entry(scope: scope); + _seedDurableFence( + objectBox, + entry: entry, + leaseFence: leaseFence, + now: now, + ); + await gateway.writeTransaction( + entry: entry, + leaseFence: leaseFence, + action: _applyAndMark(entry), + ); + + final inbox = objectBox.box().getAll().single + ..status = CloudInboxStatus.pending.index; + objectBox.box().put(inbox); + final map = objectBox.box().getAll().single + ..encryptedRawRecordRef = _protectedReference('X'); + objectBox.box().put(map); + + objectBox.close(); + objectBox = await openStore(directory: directory.path); + adapter = _ObjectBoxTestCanonicalAdapter(objectBox) + ..activeScope = scope + ..activeGeneration = 7 + ..existingEntities.add((CloudEntityKind.chat, _digestValue('H'))); + gateway = ObjectBoxCloudSemanticStoreGateway( + store: objectBox, + canonicalAdapter: adapter, + clock: () => now, + ); + + await expectLater( + gateway.writeTransaction( + entry: entry, + leaseFence: leaseFence, + action: (transaction) { + transaction.hasAppliedChange(entry.change.changeId); + }, + ), + throwsA(_failureCode('semantic_replay_record_binding_mismatch')), + ); + }, + ); + + test('one explicit applied-with-conflict outcome is persisted', () async { + final entry = _entry(scope: scope); + _seedDurableFence( + objectBox, + entry: entry, + leaseFence: leaseFence, + now: now, + ); + + await gateway.writeTransaction( + entry: entry, + leaseFence: leaseFence, + action: (transaction) { + transaction.bindRecordIdentity( + logicalEntityKeyHash: _digestValue('L'), + encryptedRawRecordReference: _protectedReference('W'), + ); + transaction.recordConflict( + entry.change.changeId, + 'equal_group_version_mismatch', + ); + transaction.markChangeApplied(entry.change.changeId); + }, + ); + + final replay = objectBox.box().getAll().single; + expect(replay.terminalOutcome, 'appliedWithConflict'); + expect(replay.terminalSafeCode, 'equal_group_version_mismatch'); + expect( + objectBox.box().getAll().single.status, + CloudInboxStatus.applied.index, + ); + }); + + test('one explicit quarantined outcome is persisted', () async { + final entry = _entry(scope: scope); + _seedDurableFence( + objectBox, + entry: entry, + leaseFence: leaseFence, + now: now, + ); + + await gateway.writeTransaction( + entry: entry, + leaseFence: leaseFence, + action: (transaction) { + transaction.quarantineChange( + entry.change.changeId, + 'immutable_content_mismatch', + ); + }, + ); + + final replay = objectBox.box().getAll().single; + expect(replay.terminalOutcome, 'quarantined'); + expect(replay.terminalSafeCode, 'immutable_content_mismatch'); + expect( + objectBox.box().getAll().single.status, + CloudInboxStatus.quarantined.index, + ); + expect( + objectBox + .box() + .getAll() + .single + .appliedSequence, + 1, + ); + }); + + test( + 'raw email, GUID, body, uppercase hex, and delimiter scope are rejected', + () async { + expect(() => _scope(account: 'raw@example.com'), throwsArgumentError); + final validEntry = _entry(scope: scope); + _seedDurableFence( + objectBox, + entry: validEntry, + leaseFence: leaseFence, + now: now, + ); + for (final invalid in [ + '550e8400-e29b-41d4-a716-446655440000', + 'secret body text', + List.filled(64, 'A').join(), + ]) { + await expectLater( + gateway.writeTransaction( + entry: validEntry, + leaseFence: leaseFence, + action: (transaction) { + transaction.bindRecordIdentity(logicalEntityKeyHash: invalid); + }, + ), + throwsA(_failureCode('semantic_digest_invalid')), + ); + } + expect( + () => CloudSyncScope( + accountFingerprint: _digestValue('A'), + container: 'container\u001fcollision', + database: 'private', + zone: 'zone', + ), + throwsArgumentError, + ); + }, + ); + + test( + 'secret-bearing adapter exception is sanitized and fully rolled back', + () async { + const secret = 'TOP SECRET MESSAGE BODY'; + final entry = _entry(scope: scope); + _seedDurableFence( + objectBox, + entry: entry, + leaseFence: leaseFence, + now: now, + ); + adapter.throwAfterCanonicalWrite = Exception(secret); + + try { + await gateway.writeTransaction( + entry: entry, + leaseFence: leaseFence, + action: _applyAndMark(entry), + ); + fail('expected sanitized failure'); + } catch (error) { + expect(error, isA()); + expect(error.toString(), isNot(contains(secret))); + expect( + (error as CloudSyncFailure).safeCode, + 'semantic_canonical_write_failed', + ); + } + _expectNoSemanticMutation(objectBox, adapter); + }, + ); + + test('tombstones remain disabled in the durable gateway', () async { + final entry = _entry(scope: scope, tombstone: true); + _seedDurableFence( + objectBox, + entry: entry, + leaseFence: leaseFence, + now: now, + ); + + await expectLater( + gateway.writeTransaction( + entry: entry, + leaseFence: leaseFence, + action: (transaction) { + transaction.applyTombstone( + CloudSemanticTombstone( + kind: CloudEntityKind.message, + logicalEntityKeyHash: _digestValue('L'), + deletedAt: now, + serverConfirmed: true, + ), + ); + }, + ), + throwsA(_failureCode('semantic_tombstones_disabled')), + ); + _expectNoSemanticMutation(objectBox, adapter); + }); +} + +CloudSyncScope _scope({String? account, String zone = 'messageManateeZone'}) { + return CloudSyncScope( + accountFingerprint: account ?? _digestValue('A'), + container: 'com.apple.messages.cloud', + database: 'private', + zone: zone, + streamKind: CloudSyncStreamKind.messages, + schemaVersion: 2, + ); +} + +CloudInboxEntry _entry({ + required CloudSyncScope scope, + bool tombstone = false, + String? payloadSha256, + String? changeId, + String? recordIdHash, + String? etagHash, + String? encryptedServerRecordId, + String? protectedSystemFieldsReference, + String? encryptedPayloadReference, +}) { + final change = CloudFetchedChange( + changeId: changeId ?? _digestValue('C'), + recordIdHash: recordIdHash ?? _digestValue('R'), + etagHash: tombstone ? null : etagHash ?? _digestValue('E'), + type: tombstone ? CloudChangeType.delete : CloudChangeType.save, + encryptedServerRecordId: + encryptedServerRecordId ?? _protectedReference('S'), + protectedSystemFieldsReference: + protectedSystemFieldsReference ?? _protectedReference('F'), + encryptedPayloadReference: + encryptedPayloadReference ?? _protectedReference('W'), + payloadSha256: tombstone ? null : payloadSha256 ?? _sha256('payload'), + isTombstone: tombstone, + ); + return CloudInboxEntry( + scope: scope, + sequence: 1, + change: change, + status: CloudInboxStatus.pending, + attemptCount: 0, + createdAt: DateTime.utc(2026, 8, 1, 11), + batchId: 'batch-1', + generation: 7, + ); +} + +CloudSemanticSnapshot _snapshot() { + return CloudSemanticSnapshot( + kind: CloudEntityKind.message, + logicalEntityKeyHash: _digestValue('L'), + immutableContentDigest: _digestValue('I'), + createdAt: DateTime.utc(2026, 7, 31, 10), + readAt: DateTime.utc(2026, 7, 31, 11), + editParts: { + _digestValue('K'): CloudEditPart( + partKeyHash: _digestValue('K'), + revision: 1, + contentDigest: _digestValue('D'), + modifiedAt: DateTime.utc(2026, 7, 31, 11, 30), + ), + }, + etagHash: _digestValue('E'), + encryptedRawRecordReference: _protectedReference('W'), + ); +} + +CloudMessageEntityPayload _payload() { + return CloudMessageEntityPayload( + logicalEntityKeyHash: _digestValue('L'), + canonicalGuid: 'message-guid', + chatAliasKeyHash: _digestValue('H'), + chatIdentifier: 'iMessage;-;chat', + body: 'secret message body', + senderHandle: 'secret@example.com', + ); +} + +void _applyMessage(CloudSemanticStoreTransaction transaction) { + transaction.applyEntity(payload: _payload(), snapshot: _snapshot()); +} + +void Function(CloudSemanticStoreTransaction) _applyAndMark( + CloudInboxEntry entry, +) { + return (transaction) { + _applyMessage(transaction); + transaction.markChangeApplied(entry.change.changeId); + }; +} + +void _seedDurableFence( + Store store, { + required CloudInboxEntry entry, + required CloudCoordinatorLeaseFence leaseFence, + required DateTime now, + DateTime? expiresAt, + int? checkpointGeneration, +}) { + final scope = entry.scope; + final scopeKey = _scopeKey(scope); + store.runInTransaction(TxMode.write, () { + store.box().put( + CloudSyncCheckpointEntity( + checkpointKey: scopeKey, + accountFingerprint: scope.accountFingerprint, + container: scope.container, + database: scope.database, + zone: scope.zone, + streamKind: scope.streamKind.name, + schemaVersion: scope.schemaVersion, + generation: checkpointGeneration ?? entry.generation, + lastBatchId: entry.batchId, + fetchedSequence: entry.sequence, + updatedAtMs: now.millisecondsSinceEpoch, + ), + ); + store.box().put( + CloudSyncLeaseEntity( + leaseKey: _scopedDigest(scope, 'coordinator-lease', 'v1'), + scopeKey: scopeKey, + accountFingerprint: scope.accountFingerprint, + ownerIdHash: _sha256('coordinator-owner\u001f${leaseFence.ownerId}'), + generation: leaseFence.generation, + acquiredAtMs: now + .subtract(const Duration(seconds: 1)) + .millisecondsSinceEpoch, + expiresAtMs: (expiresAt ?? now.add(const Duration(minutes: 1))) + .millisecondsSinceEpoch, + ), + ); + final change = entry.change; + store.box().put( + CloudInboxChangeEntity( + changeKey: _scopedDigest(scope, 'change', change.changeId), + changeIdHash: change.changeId, + scopeKey: scopeKey, + accountFingerprint: scope.accountFingerprint, + zone: scope.zone, + serverRecordIdHash: change.recordIdHash, + etagHash: change.etagHash, + changeType: change.type.name, + encryptedServerRecordId: change.encryptedServerRecordId, + protectedSystemFieldsRef: change.protectedSystemFieldsReference, + encryptedPayloadRef: change.encryptedPayloadReference, + payloadSha256: change.payloadSha256, + batchId: entry.batchId, + generation: entry.generation, + fetchSequence: entry.sequence, + status: CloudInboxStatus.pending.index, + isTombstone: change.isTombstone, + createdAtMs: entry.createdAt.millisecondsSinceEpoch, + updatedAtMs: now.millisecondsSinceEpoch, + ), + ); + }); +} + +CloudInboxChangeEntity _copyInbox( + CloudInboxChangeEntity source, { + required String changeKey, +}) { + return CloudInboxChangeEntity( + changeKey: changeKey, + changeIdHash: source.changeIdHash, + scopeKey: source.scopeKey, + accountFingerprint: source.accountFingerprint, + zone: source.zone, + serverRecordIdHash: source.serverRecordIdHash, + etagHash: source.etagHash, + changeType: source.changeType, + encryptedServerRecordId: source.encryptedServerRecordId, + protectedSystemFieldsRef: source.protectedSystemFieldsRef, + encryptedPayloadRef: source.encryptedPayloadRef, + payloadSha256: source.payloadSha256, + batchId: source.batchId, + generation: source.generation, + fetchSequence: source.fetchSequence, + status: source.status, + isTombstone: source.isTombstone, + failureCategory: source.failureCategory, + retryCount: source.retryCount, + nextEligibleAtMs: source.nextEligibleAtMs, + serverModifiedAtMs: source.serverModifiedAtMs, + createdAtMs: source.createdAtMs, + updatedAtMs: source.updatedAtMs, + completedAtMs: source.completedAtMs, + ); +} + +void _expectNoSemanticMutation(Store store, _ObjectBoxTestCanonicalAdapter _) { + expect(store.box().count(), 0); + expect(store.box().count(), 0); + expect(store.box().count(), 0); + expect(store.box().count(), 0); + expect( + store.box().getAll().single.status, + CloudInboxStatus.pending.index, + ); +} + +Matcher _failureCode(String safeCode) { + return isA().having( + (failure) => failure.safeCode, + 'safeCode', + safeCode, + ); +} + +String _scopeKey(CloudSyncScope scope) => 'scope2:${_sha256(scope.storageKey)}'; + +String _recordMapKey(CloudSyncScope scope, String logicalEntityKeyHash) => + _scopedDigest(scope, 'record-map', logicalEntityKeyHash); + +String _scopedDigest(CloudSyncScope scope, String purpose, String value) => + '$purpose:${_sha256('${scope.storageKey}\u001f$purpose\u001f$value')}'; + +String _sha256(String value) => sha256.convert(utf8.encode(value)).toString(); + +String _digestValue(String character) => List.filled(43, character).join(); + +String _protectedReference(String character) => + 'obcs2.ref.${_digestValue(character)}'; + +final class _ObjectBoxTestCanonicalAdapter + implements CloudCanonicalSemanticEntityAdapter { + _ObjectBoxTestCanonicalAdapter(this.store) + : _canonical = store.box(); + + @override + final Store store; + final Box _canonical; + CloudSyncScope? activeScope; + int? activeGeneration; + int entityApplyCalls = 0; + int tombstoneCalls = 0; + Object? throwAfterCanonicalWrite; + final existingEntities = <(CloudEntityKind, String)>{}; + + @override + bool isActiveAccountScope({ + required CloudSyncScope scope, + required int generation, + }) => activeScope == scope && activeGeneration == generation; + + @override + bool entityExists({ + required CloudSyncScope scope, + required int generation, + required CloudEntityKind kind, + required String logicalEntityKeyHash, + }) => + existingEntities.contains((kind, logicalEntityKeyHash)) || + _find(scope, generation, kind, logicalEntityKeyHash) != null; + + @override + CloudCanonicalSemanticMutationReceipt applyEntity({ + required CloudSyncScope scope, + required int generation, + required CloudSemanticEntityPayload payload, + required CloudSemanticSnapshot snapshot, + }) { + entityApplyCalls++; + final existing = _find( + scope, + generation, + snapshot.kind, + snapshot.logicalEntityKeyHash, + ); + _canonical.put( + CloudSyncRunEntity( + id: existing?.id ?? 0, + runId: _key( + scope, + generation, + snapshot.kind, + snapshot.logicalEntityKeyHash, + ), + scopeKey: 'canonical-test-scope', + accountFingerprint: scope.accountFingerprint, + trigger: 'canonical-test', + architecture: 'test', + mode: 'semantic', + startedAtMs: 1, + ), + ); + final failure = throwAfterCanonicalWrite; + if (failure != null) throw failure; + return CloudCanonicalSemanticMutationReceipt.committed; + } + + @override + CloudCanonicalSemanticMutationReceipt applyTombstone({ + required CloudSyncScope scope, + required int generation, + required CloudSemanticTombstone tombstone, + }) { + tombstoneCalls++; + final existing = _find( + scope, + generation, + tombstone.kind, + tombstone.logicalEntityKeyHash, + ); + if (existing != null) _canonical.remove(existing.id); + return CloudCanonicalSemanticMutationReceipt.committed; + } + + CloudSyncRunEntity? _find( + CloudSyncScope scope, + int generation, + CloudEntityKind kind, + String logicalEntityKeyHash, + ) { + final query = + _canonical + .query( + CloudSyncRunEntity_.runId.equals( + _key(scope, generation, kind, logicalEntityKeyHash), + ), + ) + .build() + ..limit = 1; + try { + return query.findFirst(); + } finally { + query.close(); + } + } + + String _key( + CloudSyncScope scope, + int generation, + CloudEntityKind kind, + String logicalEntityKeyHash, + ) => + 'canonical-test:${scope.accountFingerprint}:$generation:' + '${kind.name}:$logicalEntityKeyHash'; +} diff --git a/test/services/cloud_sync/objectbox_cloud_sync_change_id_roundtrip_test.dart b/test/services/cloud_sync/objectbox_cloud_sync_change_id_roundtrip_test.dart new file mode 100644 index 0000000000..e0fa4fd41e --- /dev/null +++ b/test/services/cloud_sync/objectbox_cloud_sync_change_id_roundtrip_test.dart @@ -0,0 +1,226 @@ +import 'dart:convert'; +import 'dart:io'; + +import 'package:bluebubbles/database/models.dart'; +import 'package:bluebubbles/services/rustpush/cloud_sync/cloud_inbox_applier.dart'; +import 'package:bluebubbles/services/rustpush/cloud_sync/cloud_merge_policy.dart'; +import 'package:bluebubbles/services/rustpush/cloud_sync/cloud_sync_models.dart'; +import 'package:bluebubbles/services/rustpush/cloud_sync/cloud_sync_protector.dart'; +import 'package:bluebubbles/services/rustpush/cloud_sync/objectbox_cloud_semantic_store_gateway.dart'; +import 'package:bluebubbles/services/rustpush/cloud_sync/objectbox_cloud_sync_store.dart'; +import 'package:flutter_test/flutter_test.dart'; + +void main() { + final now = DateTime.utc(2026, 8, 2, 1); + final scope = CloudSyncScope( + accountFingerprint: _digest('A'), + container: 'messages-container', + database: 'private', + zone: 'messageManateeZone', + ); + final changeId = _digest('C'); + late Directory directory; + late Store objectBox; + late ObjectBoxCloudSyncStore journalStore; + + setUp(() async { + directory = await Directory.systemTemp.createTemp( + 'openbubbles-cloud-change-id-roundtrip-', + ); + objectBox = await openStore(directory: directory.path); + journalStore = ObjectBoxCloudSyncStore( + store: objectBox, + protector: const _RoundTripProtector(), + clock: () => now, + ); + }); + + tearDown(() async { + objectBox.close(); + if (directory.existsSync()) { + await directory.delete(recursive: true); + } + }); + + test( + 'native change ID survives journal, reopen, and semantic gateway handoff', + () async { + final fence = (await journalStore.tryAcquireCoordinatorLease( + scope, + ownerId: 'roundtrip-owner', + now: now, + leaseDuration: const Duration(hours: 1), + ))!; + final checkpoint = await journalStore.readCheckpoint(scope); + await journalStore.journalFetchedBatch( + CloudFetchBatch( + scope: scope, + changes: [ + CloudFetchedChange( + changeId: changeId, + recordIdHash: _digest('R'), + etagHash: _digest('E'), + type: CloudChangeType.save, + encryptedServerRecordId: _reference('S'), + protectedSystemFieldsReference: _reference('F'), + encryptedPayloadReference: _reference('P'), + payloadSha256: List.filled(64, 'a').join(), + ), + ], + batchId: _digest('B'), + generation: checkpoint.generation, + nextToken: _reference('T'), + hasMore: false, + ), + now: now, + leaseFence: fence, + expectedGeneration: checkpoint.generation, + expectedFetchedToken: checkpoint.fetchedToken, + ); + + final firstRead = (await journalStore.readEligibleInbox( + scope, + now: now, + limit: 1, + )).single; + expect(firstRead.change.changeId, changeId); + expect( + objectBox.box().getAll().single.changeIdHash, + changeId, + ); + + objectBox.close(); + objectBox = await openStore(directory: directory.path); + journalStore = ObjectBoxCloudSyncStore( + store: objectBox, + protector: const _RoundTripProtector(), + clock: () => now.add(const Duration(minutes: 1)), + ); + final reopenedEntry = (await journalStore.readEligibleInbox( + scope, + now: now.add(const Duration(minutes: 1)), + limit: 1, + )).single; + expect(reopenedEntry.change.changeId, changeId); + + final gateway = ObjectBoxCloudSemanticStoreGateway( + store: objectBox, + canonicalAdapter: _NoMutationCanonicalAdapter( + objectBox, + scope: scope, + generation: checkpoint.generation, + ), + clock: () => now.add(const Duration(minutes: 1)), + ); + await gateway.writeTransaction( + entry: reopenedEntry, + leaseFence: fence, + action: (transaction) { + transaction.quarantineChange(changeId, 'roundtrip_fixture'); + }, + ); + + final durableInbox = objectBox + .box() + .getAll() + .single; + expect(durableInbox.changeIdHash, changeId); + expect(durableInbox.status, CloudInboxStatus.quarantined.index); + expect( + objectBox + .box() + .getAll() + .single + .terminalOutcome, + 'quarantined', + ); + }, + ); +} + +String _digest(String character) => List.filled(43, character).join(); + +String _reference(String character) => 'obcs2.ref.${_digest(character)}'; + +final class _NoMutationCanonicalAdapter + implements CloudCanonicalSemanticEntityAdapter { + _NoMutationCanonicalAdapter( + this.store, { + required this.scope, + required this.generation, + }); + + @override + final Store store; + final CloudSyncScope scope; + final int generation; + + @override + bool isActiveAccountScope({ + required CloudSyncScope scope, + required int generation, + }) => scope == this.scope && generation == this.generation; + + @override + bool entityExists({ + required CloudSyncScope scope, + required int generation, + required CloudEntityKind kind, + required String logicalEntityKeyHash, + }) => false; + + @override + CloudCanonicalSemanticMutationReceipt applyEntity({ + required CloudSyncScope scope, + required int generation, + required CloudSemanticEntityPayload payload, + required CloudSemanticSnapshot snapshot, + }) { + throw StateError('canonical mutation is outside this fixture'); + } + + @override + CloudCanonicalSemanticMutationReceipt applyTombstone({ + required CloudSyncScope scope, + required int generation, + required CloudSemanticTombstone tombstone, + }) { + throw StateError('canonical tombstone is outside this fixture'); + } +} + +final class _RoundTripProtector implements CloudSyncProtector { + const _RoundTripProtector(); + + @override + Future fingerprintAccount(String rawAccountIdentifier) async { + return base64Url + .encode(utf8.encode(rawAccountIdentifier)) + .replaceAll('=', ''); + } + + @override + Future protect({ + required CloudSyncScope scope, + required CloudSyncProtectedValueKind kind, + required String plaintext, + }) async { + return base64Url.encode( + utf8.encode('${scope.storageKey}\u001f${kind.name}\u001f$plaintext'), + ); + } + + @override + Future unprotect({ + required CloudSyncScope scope, + required CloudSyncProtectedValueKind kind, + required String ciphertext, + }) async { + final decoded = utf8.decode(base64Url.decode(ciphertext)); + final prefix = '${scope.storageKey}\u001f${kind.name}\u001f'; + if (!decoded.startsWith(prefix)) { + throw const FormatException('fixture scope mismatch'); + } + return decoded.substring(prefix.length); + } +} diff --git a/test/services/cloud_sync/objectbox_cloud_sync_model_compatibility_test.dart b/test/services/cloud_sync/objectbox_cloud_sync_model_compatibility_test.dart new file mode 100644 index 0000000000..3cb9988e5a --- /dev/null +++ b/test/services/cloud_sync/objectbox_cloud_sync_model_compatibility_test.dart @@ -0,0 +1,71 @@ +import 'dart:convert'; +import 'dart:io'; + +import 'package:flutter_test/flutter_test.dart'; + +void main() { + test( + 'Cloud Sync entities extend rather than renumber the canonical model', + () { + final model = + jsonDecode(File('lib/objectbox-model.json').readAsStringSync()) + as Map; + final entities = { + for (final value in model['entities'] as List) + (value as Map)['name'] as String: + value['id'] as String, + }; + + expect(entities, containsPair('Attachment', '1:2065429213543838585')); + expect(entities, containsPair('Chat', '3:9017250848141753702')); + expect(entities, containsPair('FCMData', '6:5390756932993878582')); + expect(entities, containsPair('Handle', '7:1716592500251888002')); + expect(entities, containsPair('ThemeEntry', '10:7380334062783734091')); + expect(entities, containsPair('Message', '13:4148278195232901830')); + expect(entities, containsPair('ThemeObject', '15:7753273527865539946')); + expect(entities, containsPair('ThemeStruct', '16:1815690088052698449')); + expect(entities, containsPair('Contact', '17:2547083341603323785')); + + expect( + entities, + containsPair('CloudInboxChangeEntity', '18:6719772093493207335'), + ); + expect( + entities, + containsPair('CloudProtectedPageLeaseEntity', '27:4280538170716883312'), + ); + expect( + entities, + containsPair('CloudKitWriterAuthorityEntity', '28:889478301778181246'), + ); + expect( + entities, + containsPair('CloudKitDeletionIntentEntity', '29:3887662870209685934'), + ); + expect( + entities, + containsPair( + 'CloudKitDeletionQuarantineEntity', + '30:156682190547124916', + ), + ); + expect(model['lastEntityId'], '30:156682190547124916'); + expect(model['modelVersion'], 5); + expect(model['modelVersionParserMinimum'], 5); + + final outbox = (model['entities'] as List) + .cast>() + .singleWhere( + (entity) => entity['name'] == 'CloudOutboxOperationEntity', + ); + final properties = { + for (final value in outbox['properties'] as List) + (value as Map)['name'] as String: + value['id'] as String, + }; + expect(properties['checkpointGeneration'], '23:3453625028306797643'); + expect(properties['appleRequestUuid'], '24:2838853240019164046'); + expect(properties['appleOperationUuid'], '25:593864995002474100'); + }, + ); +} diff --git a/test/services/cloud_sync/objectbox_cloud_sync_preflight_test.dart b/test/services/cloud_sync/objectbox_cloud_sync_preflight_test.dart new file mode 100644 index 0000000000..fd164bdbd7 --- /dev/null +++ b/test/services/cloud_sync/objectbox_cloud_sync_preflight_test.dart @@ -0,0 +1,191 @@ +import 'package:bluebubbles/database/models.dart'; +import 'package:bluebubbles/services/rustpush/cloud_sync/cloud_sync_production_preflight.dart'; +import 'package:bluebubbles/services/rustpush/cloud_sync/cloud_sync_models.dart'; +import 'package:bluebubbles/services/rustpush/cloud_sync/cloud_sync_protector.dart'; +import 'package:bluebubbles/services/rustpush/cloud_sync/cloudkit_operation_interlock.dart'; +import 'package:bluebubbles/services/rustpush/cloud_sync/objectbox_cloud_sync_preflight.dart'; +import 'package:bluebubbles/services/rustpush/cloud_sync/objectbox_cloud_sync_store.dart'; +import 'package:flutter_test/flutter_test.dart'; +import 'package:universal_io/io.dart'; + +void main() { + late Directory temporaryDirectory; + late Store store; + late ObjectBoxCloudSyncPreflightReader reader; + final now = DateTime.utc(2026, 8, 2); + + setUp(() { + temporaryDirectory = Directory.systemTemp.createTempSync( + 'cloud-sync-preflight-objectbox-', + ); + store = Store(getObjectBoxModel(), directory: temporaryDirectory.path); + reader = ObjectBoxCloudSyncPreflightReader(store: store, now: () => now); + }); + + tearDown(() { + if (!store.isClosed()) store.close(); + if (temporaryDirectory.existsSync()) { + temporaryDirectory.deleteSync(recursive: true); + } + }); + + test('empty store is one coherent ready snapshot', () { + final state = reader.read(); + + expect(state.objectBoxReady, isTrue); + expect(state.coordinatorLeaseActive, isFalse); + expect(state.outboxCount, 0); + }); + + test('only an unexpired coordinator lease blocks the sampler', () { + final leases = store.box(); + leases.put( + CloudSyncLeaseEntity( + leaseKey: 'expired', + scopeKey: 'scope', + accountFingerprint: _fingerprint, + ownerIdHash: 'owner', + generation: 1, + acquiredAtMs: now + .subtract(const Duration(minutes: 2)) + .millisecondsSinceEpoch, + expiresAtMs: now + .subtract(const Duration(seconds: 1)) + .millisecondsSinceEpoch, + ), + ); + expect(reader.read().coordinatorLeaseActive, isFalse); + + leases.put( + CloudSyncLeaseEntity( + leaseKey: 'active', + scopeKey: 'scope', + accountFingerprint: _fingerprint, + ownerIdHash: 'owner', + generation: 2, + acquiredAtMs: now.millisecondsSinceEpoch, + expiresAtMs: now.add(const Duration(minutes: 1)).millisecondsSinceEpoch, + ), + ); + expect(reader.read().coordinatorLeaseActive, isTrue); + }); + + test('counts every durable V2 outbox row', () { + store.box().put( + CloudOutboxOperationEntity( + operationId: 'operation', + scopeKey: 'scope', + accountFingerprint: _fingerprint, + zone: 'messageManateeZone', + logicalEntityKeyHash: 'logical', + action: 0, + mutationRevision: 1, + createdAtMs: now.millisecondsSinceEpoch, + updatedAtMs: now.millisecondsSinceEpoch, + ), + ); + + expect(reader.read().outboxCount, 1); + }); + + test( + 'closed-store failure becomes a fully blocking production state', + () async { + store.close(); + final probe = CloudSyncProductionPreflightProbe( + platformSupported: () => true, + uiIsolate: () => true, + rustPushReady: () => true, + localState: reader.read, + privateStorageExists: () => true, + logoutActive: () => false, + legacySyncEnabled: () => false, + legacySyncActive: () => false, + protectorSentinelValid: () => true, + ); + + final state = await probe.read(); + expect(state.objectBoxReady, isFalse); + expect(state.coordinatorLeaseActive, isTrue); + expect(state.outboxCount, -1); + }, + ); + test( + 'the persisted operation fence does not block its own operation', + () async { + final cloudStore = ObjectBoxCloudSyncStore( + store: store, + protector: const _PassThroughProtector(), + ); + final interlock = CloudKitOperationInterlock( + privateStorageDirectory: temporaryDirectory.path, + fenceStore: cloudStore, + ); + + await interlock.runExclusive( + kind: CloudKitOperationKind.v2ShadowRead, + action: () async { + // Acquire through the real ObjectBox adapter so this test exercises + // the canonical persisted scope key rather than hand-writing a raw + // CloudSyncScope.storageKey. + expect(reader.read().coordinatorLeaseActive, isFalse); + }, + ); + }, + ); + + test('a real coordinator lease still blocks alongside the fence', () { + final leases = store.box(); + final expiresAtMs = now + .add(const Duration(minutes: 5)) + .millisecondsSinceEpoch; + leases.put( + CloudSyncLeaseEntity( + leaseKey: 'interlock-fence', + scopeKey: CloudKitOperationInterlock.fenceScopeKey, + accountFingerprint: _fingerprint, + ownerIdHash: 'owner', + generation: 1, + acquiredAtMs: now.millisecondsSinceEpoch, + expiresAtMs: expiresAtMs, + ), + ); + leases.put( + CloudSyncLeaseEntity( + leaseKey: 'real-coordinator', + scopeKey: 'some-other-account-scope', + accountFingerprint: _fingerprint, + ownerIdHash: 'owner', + generation: 1, + acquiredAtMs: now.millisecondsSinceEpoch, + expiresAtMs: expiresAtMs, + ), + ); + + expect(reader.read().coordinatorLeaseActive, isTrue); + }); +} + +const _fingerprint = 'AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA'; + +final class _PassThroughProtector implements CloudSyncProtector { + const _PassThroughProtector(); + + @override + Future protect({ + required CloudSyncScope scope, + required CloudSyncProtectedValueKind kind, + required String plaintext, + }) async => plaintext; + + @override + Future unprotect({ + required CloudSyncScope scope, + required CloudSyncProtectedValueKind kind, + required String ciphertext, + }) async => ciphertext; + + @override + Future fingerprintAccount(String rawAccountIdentifier) async => + _fingerprint; +} diff --git a/test/services/cloud_sync/objectbox_cloud_sync_store_test.dart b/test/services/cloud_sync/objectbox_cloud_sync_store_test.dart new file mode 100644 index 0000000000..28f5556278 --- /dev/null +++ b/test/services/cloud_sync/objectbox_cloud_sync_store_test.dart @@ -0,0 +1,2520 @@ +import 'dart:convert'; +import 'dart:io'; + +import 'package:bluebubbles/database/models.dart'; +import 'package:bluebubbles/services/rustpush/cloud_sync/cloud_shadow_journal_budget.dart'; +import 'package:bluebubbles/services/rustpush/cloud_sync/cloud_sync_models.dart'; +import 'package:bluebubbles/services/rustpush/cloud_sync/cloud_sync_protector.dart'; +import 'package:bluebubbles/services/rustpush/cloud_sync/cloud_sync_store.dart'; +import 'package:bluebubbles/services/rustpush/cloud_sync/objectbox_cloud_sync_store.dart'; +import 'package:crypto/crypto.dart'; +import 'package:flutter_test/flutter_test.dart'; + +import 'cloud_sync_test_helpers.dart'; + +void main() { + late Directory directory; + late Store objectBox; + late _TestCloudSyncProtector protector; + late ObjectBoxCloudSyncStore store; + late DateTime currentTime; + final coordinatorFences = {}; + + Future reopen() async { + objectBox.close(); + objectBox = await openStore(directory: directory.path); + store = ObjectBoxCloudSyncStore( + store: objectBox, + protector: protector, + clock: () => currentTime, + ); + } + + setUp(() async { + directory = await Directory.systemTemp.createTemp( + 'openbubbles-cloud-sync-v2-objectbox-', + ); + objectBox = await openStore(directory: directory.path); + protector = _TestCloudSyncProtector(); + currentTime = testEpoch; + store = ObjectBoxCloudSyncStore( + store: objectBox, + protector: protector, + clock: () => currentTime, + ); + coordinatorFences.clear(); + }); + + tearDown(() async { + objectBox.close(); + if (directory.existsSync()) { + await directory.delete(recursive: true); + } + }); + + CloudFetchBatch batch( + CloudSyncScope scope, { + int generation = 1, + String batchId = 'batch-digest-1', + String? token = 'opaque-token-1', + List? changes, + }) { + return CloudFetchBatch( + scope: scope, + changes: changes ?? [testChange(1), testChange(2)], + batchId: batchId, + generation: generation, + nextToken: token, + hasMore: false, + ); + } + + Future journalShadow( + CloudFetchBatch value, { + required DateTime now, + required CloudShadowJournalBudget budget, + }) async { + currentTime = now; + final scope = value.scope; + final fence = coordinatorFences[scope.storageKey] ??= (await store + .tryAcquireCoordinatorLease( + scope, + ownerId: 'objectbox-test-${scope.accountFingerprint}', + now: now, + leaseDuration: const Duration(days: 1), + ))!; + final checkpoint = await store.readCheckpoint(scope); + return store.journalShadowFetchedBatch( + value, + now: now, + budget: budget, + leaseFence: fence, + expectedGeneration: checkpoint.generation, + expectedFetchedToken: checkpoint.fetchedToken, + ); + } + + Future journal(CloudFetchBatch value, {DateTime? now}) async { + final journalNow = now ?? testEpoch; + currentTime = journalNow; + final scope = value.scope; + final fence = coordinatorFences[scope.storageKey] ??= (await store + .tryAcquireCoordinatorLease( + scope, + ownerId: 'objectbox-general-${scope.accountFingerprint}', + now: journalNow, + leaseDuration: const Duration(days: 1), + ))!; + final checkpoint = await store.readCheckpoint(scope); + return store.journalFetchedBatch( + value, + now: journalNow, + leaseFence: fence, + expectedGeneration: checkpoint.generation, + expectedFetchedToken: checkpoint.fetchedToken, + ); + } + + CloudOutboxDraft draft( + CloudSyncScope scope, + int index, { + CloudOutboxAction action = CloudOutboxAction.save, + DateTime? createdAt, + Set dependencies = const {}, + String? protectedLeaseReference, + }) { + final payloadSha256 = action == CloudOutboxAction.save + ? 'payload-digest-$index' + : null; + return CloudOutboxDraft( + scope: scope, + logicalEntityKeyHash: 'logical-key-digest-$index', + action: action, + payloadVersion: 1, + dependencyOperationIds: dependencies, + createdAt: createdAt ?? testEpoch, + encryptedPayloadReference: action == CloudOutboxAction.save + ? 'protected:payload-$index' + : null, + payloadSha256: payloadSha256, + protectedLeaseReference: protectedLeaseReference, + ); + } + + test( + 'propagates the protected outbound lease reference through models', + () async { + final scope = testScope(); + final reference = testProtectedLeaseReference('a'); + final value = draft(scope, 901, protectedLeaseReference: reference); + + expect(value.protectedLeaseReference, reference); + + final admitted = await store.enqueueOutboxMutation(value); + expect(admitted.protectedLeaseReference, reference); + expect( + await store.readNonterminalProtectedOutboundLeaseReferences( + maximumCount: 4096, + ), + {reference}, + ); + await reopen(); + expect( + await store.readNonterminalProtectedOutboundLeaseReferences( + maximumCount: 4096, + ), + {reference}, + ); + + final operation = testOutboxOperation( + scope, + 901, + ).copyWith(protectedLeaseReference: reference); + expect(operation.protectedLeaseReference, reference); + expect( + operation + .copyWith(clearProtectedLeaseReference: true) + .protectedLeaseReference, + isNull, + ); + }, + ); + + test('keeps the outbound lease field distinct on the ObjectBox entity', () { + final reference = testProtectedLeaseReference('b'); + final entity = CloudOutboxOperationEntity( + operationId: 'entity-protected-lease-test', + scopeKey: 'scope-protected-lease-test', + accountFingerprint: 'account-protected-lease-test', + zone: 'zone-protected-lease-test', + logicalEntityKeyHash: 'logical-protected-lease-test', + action: 0, + mutationRevision: 1, + protectedLeaseReference: reference, + createdAtMs: testEpoch.millisecondsSinceEpoch, + updatedAtMs: testEpoch.millisecondsSinceEpoch, + ); + + expect(entity.protectedLeaseReference, reference); + }); + + test( + 'protected create atomically persists outbox mapping and stable retry identity', + () async { + final scope = testScope(); + final first = CloudOutboxDraft( + scope: scope, + logicalEntityKeyHash: List.filled(43, 'L').join(), + action: CloudOutboxAction.save, + payloadVersion: 1, + dependencyOperationIds: const {}, + createdAt: testEpoch, + encryptedPayloadReference: testProtectedReference('P'), + payloadSha256: testSha256('a'), + serverRecordIdHash: List.filled(43, 'S').join(), + protectedLeaseReference: testProtectedLeaseReference('a'), + ); + final firstMapping = CloudRecordMapEntry( + scope: scope, + logicalEntityKeyHash: first.logicalEntityKeyHash, + serverRecordIdHash: first.serverRecordIdHash!, + encryptedServerRecordId: first.encryptedPayloadReference!, + updatedAt: testEpoch, + ); + + final admitted = await store.admitProtectedOutboundCreate( + draft: first, + recordMapping: firstMapping, + ); + await reopen(); + final mapping = await store.readRecordMap( + scope, + logicalEntityKeyHash: first.logicalEntityKeyHash, + generation: 1, + ); + expect(mapping?.encryptedServerRecordId, first.encryptedPayloadReference); + expect( + await store.readNonterminalProtectedOutboundLeaseReferences( + maximumCount: 4096, + ), + {first.protectedLeaseReference}, + ); + + final restaged = CloudOutboxDraft( + scope: scope, + logicalEntityKeyHash: first.logicalEntityKeyHash, + action: CloudOutboxAction.save, + payloadVersion: 1, + dependencyOperationIds: const {}, + createdAt: testEpoch.add(const Duration(seconds: 1)), + encryptedPayloadReference: testProtectedReference('Q'), + payloadSha256: first.payloadSha256, + serverRecordIdHash: List.filled(43, 'T').join(), + protectedLeaseReference: testProtectedLeaseReference('b'), + ); + final retried = await store.admitProtectedOutboundCreate( + draft: restaged, + recordMapping: CloudRecordMapEntry( + scope: scope, + logicalEntityKeyHash: restaged.logicalEntityKeyHash, + serverRecordIdHash: restaged.serverRecordIdHash!, + encryptedServerRecordId: restaged.encryptedPayloadReference!, + updatedAt: restaged.createdAt, + ), + ); + expect(retried.operationId, admitted.operationId); + expect(retried.mutationRevision, admitted.mutationRevision); + expect(retried.protectedLeaseReference, first.protectedLeaseReference); + }, + ); + + test( + 'protected create rejects reverse server mapping collisions atomically', + () async { + final scope = testScope(); + Future admit(String logical, String referenceChar) { + final draft = CloudOutboxDraft( + scope: scope, + logicalEntityKeyHash: List.filled(43, logical).join(), + action: CloudOutboxAction.save, + payloadVersion: 1, + dependencyOperationIds: const {}, + createdAt: testEpoch, + encryptedPayloadReference: testProtectedReference(referenceChar), + payloadSha256: testSha256(referenceChar.toLowerCase()), + serverRecordIdHash: List.filled(43, 'S').join(), + protectedLeaseReference: testProtectedLeaseReference( + referenceChar.toLowerCase(), + ), + ); + return store.admitProtectedOutboundCreate( + draft: draft, + recordMapping: CloudRecordMapEntry( + scope: scope, + logicalEntityKeyHash: draft.logicalEntityKeyHash, + serverRecordIdHash: draft.serverRecordIdHash!, + encryptedServerRecordId: draft.encryptedPayloadReference!, + updatedAt: draft.createdAt, + ), + ); + } + + await admit('L', 'a'); + await expectLater( + admit('M', 'b'), + throwsA( + isA().having( + (failure) => failure.safeCode, + 'safeCode', + 'server_mapping_reverse_collision', + ), + ), + ); + expect((await store.readCheckpoint(scope)).mutationRevisionCounter, 1); + }, + ); + + test( + 'protected create rejects malformed capabilities before mutation', + () async { + final scope = testScope(); + final invalid = CloudOutboxDraft( + scope: scope, + logicalEntityKeyHash: List.filled(43, 'L').join(), + action: CloudOutboxAction.save, + payloadVersion: 1, + dependencyOperationIds: const {}, + createdAt: testEpoch, + encryptedPayloadReference: 'obcs2.ref.not-a-capability', + payloadSha256: testSha256('a'), + serverRecordIdHash: List.filled(43, 'S').join(), + protectedLeaseReference: testProtectedLeaseReference('a'), + ); + + await expectLater( + store.admitProtectedOutboundCreate( + draft: invalid, + recordMapping: CloudRecordMapEntry( + scope: scope, + logicalEntityKeyHash: invalid.logicalEntityKeyHash, + serverRecordIdHash: invalid.serverRecordIdHash!, + encryptedServerRecordId: invalid.encryptedPayloadReference!, + updatedAt: testEpoch, + ), + ), + throwsA( + isA().having( + (failure) => failure.safeCode, + 'safeCode', + 'protected_outbound_admission_invalid', + ), + ), + ); + expect((await store.readCheckpoint(scope)).mutationRevisionCounter, 0); + }, + ); + + test( + 'atomically journals an ordered page and protects its token at rest', + () async { + final scope = testScope(); + expect(await journal(batch(scope)), 2); + + final persisted = objectBox + .box() + .getAll() + .single; + expect(persisted.fetchedTokenCiphertext, isNot('opaque-token-1')); + expect( + persisted.fetchedTokenCiphertext, + isNot(contains('opaque-token-1')), + ); + expect(persisted.checkpointKey, isNot(contains(scope.storageKey))); + + final checkpoint = await store.readCheckpoint(scope); + expect(checkpoint.fetchedToken, 'opaque-token-1'); + expect(checkpoint.fetchedSequence, 2); + expect( + (await store.readEligibleInbox( + scope, + now: testEpoch, + limit: 256, + )).map((entry) => entry.sequence), + [1], + ); + + await reopen(); + expect( + (await store.readCheckpoint(scope)).fetchedToken, + 'opaque-token-1', + ); + expect(await journal(batch(scope)), 0); + }, + ); + + test('duplicate inbox sequence lookup fails closed', () async { + final scope = testScope(); + await journal(batch(scope, changes: [testChange(1)])); + final original = objectBox.box().getAll().single; + objectBox.box().put( + CloudInboxChangeEntity( + changeKey: 'duplicate-${original.changeKey}', + changeIdHash: testChange(2).changeId, + scopeKey: original.scopeKey, + accountFingerprint: original.accountFingerprint, + zone: original.zone, + serverRecordIdHash: testChange(2).recordIdHash, + etagHash: original.etagHash, + changeType: original.changeType, + encryptedServerRecordId: original.encryptedServerRecordId, + protectedSystemFieldsRef: original.protectedSystemFieldsRef, + encryptedPayloadRef: original.encryptedPayloadRef, + payloadSha256: original.payloadSha256, + batchId: 'duplicate-sequence-batch', + generation: original.generation, + fetchSequence: original.fetchSequence, + status: original.status, + isTombstone: original.isTombstone, + createdAtMs: original.createdAtMs, + updatedAtMs: original.updatedAtMs, + ), + ); + + await expectLater( + store.markInboxApplied( + scope, + sequence: original.fetchSequence, + now: testEpoch, + leaseFence: coordinatorFences[scope.storageKey]!, + ), + throwsA( + isA().having( + (failure) => failure.safeCode, + 'safeCode', + 'inbox_sequence_ambiguous', + ), + ), + ); + }); + + test('retry fallback is monotonic and idempotent', () async { + final scope = testScope(); + await journal(batch(scope, changes: [testChange(1)])); + final later = testEpoch.add(const Duration(minutes: 10)); + for (final nextEligibleAt in [ + later, + later, + testEpoch.add(const Duration(minutes: 5)), + ]) { + await store.markInboxRetryable( + scope, + sequence: 1, + category: CloudFailureCategory.network, + now: testEpoch, + nextEligibleAt: nextEligibleAt, + leaseFence: coordinatorFences[scope.storageKey]!, + ); + } + + final row = objectBox.box().getAll().single; + expect(row.retryCount, 1); + expect(row.nextEligibleAtMs, later.millisecondsSinceEpoch); + }); + + test('generation mismatch rolls back both the page and checkpoint', () async { + final scope = testScope(); + await journal(batch(scope)); + + await expectLater( + journal( + batch( + scope, + generation: 2, + batchId: 'wrong-generation-page', + token: 'must-not-commit', + changes: [testChange(3)], + ), + ), + throwsA( + isA().having( + (failure) => failure.safeCode, + 'safeCode', + 'generation_mismatch', + ), + ), + ); + + expect(objectBox.box().count(), 2); + final checkpoint = await store.readCheckpoint(scope); + expect(checkpoint.fetchedToken, 'opaque-token-1'); + expect(checkpoint.fetchedSequence, 2); + }); + + test( + 'pre-budget journal migration blocks safely after reopen without pruning', + () async { + final scope = testScope(); + await journal( + batch( + scope, + batchId: 'legacy-unbounded-page', + token: 'legacy-token', + changes: [testChange(1), testChange(2)], + ), + ); + await reopen(); + protector.failProtection = true; + + final admission = await journalShadow( + batch( + scope, + batchId: 'must-not-commit', + token: 'must-not-protect', + changes: [testChange(3)], + ), + now: testEpoch, + budget: CloudShadowJournalBudget(maximumEntriesPerScope: 1), + ); + + expect( + admission.blockReason, + CloudShadowJournalBlockReason.maximumEntries, + ); + expect(objectBox.box().count(), 2); + protector.failProtection = false; + final checkpoint = await store.readCheckpoint(scope); + expect(checkpoint.fetchedToken, 'legacy-token'); + expect(checkpoint.fetchedSequence, 2); + }, + ); + + test( + 'checkpoint protection fault cannot partially admit a shadow page', + () async { + final scope = testScope(); + protector.failProtection = true; + + await expectLater( + journalShadow( + batch( + scope, + batchId: 'protection-fault-page', + token: 'must-not-commit', + changes: [testChange(1)], + ), + now: testEpoch, + budget: CloudShadowJournalBudget(), + ), + throwsA( + isA().having( + (failure) => failure.safeCode, + 'safeCode', + 'checkpoint_protect_failed', + ), + ), + ); + + expect(objectBox.box().count(), 0); + protector.failProtection = false; + final checkpoint = await store.readCheckpoint(scope); + expect(checkpoint.fetchedToken, isNull); + expect(checkpoint.fetchedSequence, 0); + }, + ); + + test( + 'general journal rejects a lease that expires during async protection', + () async { + final scope = testScope(); + final fence = (await store.tryAcquireCoordinatorLease( + scope, + ownerId: 'delayed-general-owner', + now: testEpoch, + leaseDuration: const Duration(seconds: 1), + ))!; + final checkpoint = await store.readCheckpoint(scope); + protector.beforeProtect = () async { + currentTime = testEpoch.add(const Duration(seconds: 2)); + }; + + await expectLater( + store.journalFetchedBatch( + batch( + scope, + batchId: 'must-not-commit-after-delay', + token: 'must-not-commit', + changes: [testChange(1)], + ), + now: testEpoch, + leaseFence: fence, + expectedGeneration: checkpoint.generation, + expectedFetchedToken: checkpoint.fetchedToken, + ), + throwsA( + isA().having( + (failure) => failure.safeCode, + 'safeCode', + 'coordinator_lease_fence_lost', + ), + ), + ); + + expect(objectBox.box().count(), 0); + expect((await store.readCheckpoint(scope)).fetchedToken, isNull); + }, + ); + + test( + 'general journal uses one post-protection transaction timestamp', + () async { + final scope = testScope(); + final fence = (await store.tryAcquireCoordinatorLease( + scope, + ownerId: 'transaction-clock-owner', + now: testEpoch, + leaseDuration: const Duration(minutes: 1), + ))!; + final checkpoint = await store.readCheckpoint(scope); + final transactionTime = testEpoch.add(const Duration(seconds: 5)); + protector.beforeProtect = () async { + currentTime = transactionTime; + }; + + await store.journalFetchedBatch( + batch( + scope, + batchId: 'transaction-clock-page', + token: 'transaction-clock-token', + changes: [testChange(1)], + ), + now: testEpoch, + leaseFence: fence, + expectedGeneration: checkpoint.generation, + expectedFetchedToken: checkpoint.fetchedToken, + ); + + final expectedMs = transactionTime.millisecondsSinceEpoch; + final inbox = objectBox.box().getAll().single; + final persistedCheckpoint = objectBox + .box() + .getAll() + .single; + expect(inbox.createdAtMs, expectedMs); + expect(inbox.updatedAtMs, expectedMs); + expect(persistedCheckpoint.lastAttemptAtMs, expectedMs); + expect(persistedCheckpoint.updatedAtMs, expectedMs); + }, + ); + + test( + 'shadow journal rejects a lease that expires during async protection', + () async { + final scope = testScope(); + final fence = (await store.tryAcquireCoordinatorLease( + scope, + ownerId: 'delayed-shadow-owner', + now: testEpoch, + leaseDuration: const Duration(seconds: 1), + ))!; + final checkpoint = await store.readCheckpoint(scope); + protector.beforeProtect = () async { + currentTime = testEpoch.add(const Duration(seconds: 2)); + }; + + await expectLater( + store.journalShadowFetchedBatch( + batch( + scope, + batchId: 'must-not-shadow-commit-after-delay', + token: 'must-not-commit', + changes: [testChange(1)], + ), + now: testEpoch, + budget: CloudShadowJournalBudget(), + leaseFence: fence, + expectedGeneration: checkpoint.generation, + expectedFetchedToken: checkpoint.fetchedToken, + ), + throwsA( + isA().having( + (failure) => failure.safeCode, + 'safeCode', + 'coordinator_lease_fence_lost', + ), + ), + ); + + expect(objectBox.box().count(), 0); + expect((await store.readCheckpoint(scope)).fetchedToken, isNull); + }, + ); + + test('tombstones persist without invented etag or payload', () async { + final scope = testScope(); + await journal(batch(scope, changes: [testChange(1, tombstone: true)])); + + final entry = (await store.readEligibleInbox( + scope, + now: testEpoch, + limit: 1, + )).single; + expect(entry.change.isTombstone, isTrue); + expect(entry.change.etagHash, isNull); + expect(entry.change.encryptedPayloadReference, isNull); + expect(entry.change.payloadSha256, isNull); + }); + + test('full scope prevents account, stream, or zone state bleed', () async { + final messages = testScope(); + final profiles = testScope(streamKind: CloudSyncStreamKind.profiles); + final otherAccount = testScope(account: testAccountFingerprintB); + await journal(batch(messages)); + + expect((await store.readCheckpoint(profiles)).fetchedToken, isNull); + expect((await store.readCheckpoint(otherAccount)).fetchedToken, isNull); + expect( + await store.readEligibleInbox(profiles, now: testEpoch, limit: 10), + isEmpty, + ); + }); + + test( + 'allocates monotonic revisions even when wall clock moves backward', + () async { + final scope = testScope(); + final first = await store.enqueueOutboxMutation( + draft(scope, 1, createdAt: testEpoch), + ); + final second = await store.enqueueOutboxMutation( + draft(scope, 1, createdAt: testEpoch.subtract(const Duration(days: 1))), + ); + + expect(first.mutationRevision, 1); + expect(second.mutationRevision, 2); + final rows = objectBox.box().getAll(); + expect(rows, hasLength(1)); + expect(rows.single.operationId, second.operationId); + expect(rows.single.mutationRevision, 2); + expect((await store.readCheckpoint(scope)).mutationRevisionCounter, 2); + }, + ); + + test( + 'outbox generation survives restart and rejects a stale direct row', + () async { + final scope = testScope(); + final admitted = await store.enqueueOutboxMutation(draft(scope, 1)); + expect(admitted.checkpointGeneration, 1); + await reopen(); + expect((await store.readCheckpoint(scope)).generation, 1); + expect( + objectBox + .box() + .getAll() + .single + .checkpointGeneration, + 1, + ); + await expectLater( + store.enqueueOutbox( + testOutboxOperation(scope, 2, checkpointGeneration: 2), + ), + throwsA( + isA().having( + (failure) => failure.safeCode, + 'safeCode', + 'outbox_generation_mismatch', + ), + ), + ); + }, + ); + + test( + 'advance persists and fences stale leased rows before map or transition', + () async { + final scope = testScope(); + final operation = await store.enqueueOutboxMutation(draft(scope, 1)); + await store.leaseEligibleOutbox( + scope, + now: testEpoch, + limit: 1, + leaseId: 'generation-lease', + leaseDuration: const Duration(minutes: 1), + allowedActions: const {CloudOutboxAction.save}, + ); + expect( + (await store.advanceOutboxGeneration(scope, now: testEpoch)).generation, + 2, + ); + await reopen(); + expect((await store.readCheckpoint(scope)).generation, 2); + final stale = objectBox.box().getAll().single; + expect(stale.state, 4); + expect(stale.leaseIdHash, isNull); + + await expectLater( + store.attachOutboxRecordMapping( + scope, + leaseId: 'generation-lease', + operationId: operation.operationId, + serverRecordIdHash: 'server-record-generation', + now: testEpoch, + ), + throwsA( + isA().having( + (failure) => failure.safeCode, + 'safeCode', + 'stale_outbox_generation', + ), + ), + ); + await expectLater( + store.applyOutboxTransitions( + scope, + leaseId: 'generation-lease', + transitions: [CloudOutboxTransition.confirmed(operation.operationId)], + now: testEpoch, + ), + throwsA( + isA().having( + (failure) => failure.safeCode, + 'safeCode', + 'stale_outbox_generation', + ), + ), + ); + + final fresh = await store.enqueueOutboxMutation(draft(scope, 2)); + expect(fresh.checkpointGeneration, 2); + }, + ); + + test( + 'reset rebootstrap atomically fences evidence and clears active state', + () async { + final scope = testScope(); + await journal(batch(scope, token: 'old-reset-token')); + final operation = await store.enqueueOutboxMutation(draft(scope, 77)); + await store.upsertRecordMap( + CloudRecordMapEntry( + scope: scope, + logicalEntityKeyHash: 'logical-key-digest-map-reset', + serverRecordIdHash: 'server-record-reset', + encryptedServerRecordId: + 'obcs2.ref.AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA', + updatedAt: testEpoch, + ), + generation: 1, + ); + await store.recordPullFailure( + scope, + category: CloudFailureCategory.network, + nextEligibleAt: testEpoch.add(const Duration(hours: 1)), + ); + await store.releaseCoordinatorLease( + scope, + leaseFence: coordinatorFences[scope.storageKey]!, + ); + + final completion = await store.rebootstrapAfterReset( + _resetRequest(scope), + now: testEpoch.add(const Duration(seconds: 1)), + ); + expect(completion.previousGeneration, 1); + expect(completion.generation, 2); + expect(completion.binds(_resetRequest(scope)), isTrue); + + final checkpoint = await store.readCheckpoint(scope); + expect(checkpoint.generation, 2); + expect(checkpoint.fetchedToken, isNull); + expect(checkpoint.lastBatchId, isNull); + expect(checkpoint.fetchedSequence, 0); + expect(checkpoint.lastAppliedSequence, 0); + expect(checkpoint.consecutivePullFailures, 0); + expect(checkpoint.nextPullEligibleAt, isNull); + expect(checkpoint.lastFailure, isNull); + + final oldOutbox = objectBox.box().getAll(); + expect(oldOutbox.single.operationId, operation.operationId); + expect(oldOutbox.single.state, 4); + expect(oldOutbox.single.leaseIdHash, isNull); + expect( + objectBox.box().getAll().single.generation, + 0, + ); + expect( + objectBox.box().getAll(), + everyElement( + predicate( + (row) => row.generation == 0 && row.status == 2, + ), + ), + ); + expect( + await store.readEligibleInbox(scope, now: testEpoch, limit: 1), + isEmpty, + ); + expect( + await store.readRecordMap( + scope, + logicalEntityKeyHash: 'logical-key-digest-map-reset', + generation: 2, + ), + isNull, + ); + + await reopen(); + expect((await store.readCheckpoint(scope)).generation, 2); + expect( + (await store.enqueueOutboxMutation( + draft(scope, 78), + )).checkpointGeneration, + 2, + ); + coordinatorFences.remove(scope.storageKey); + expect( + await journal( + batch( + scope, + generation: 2, + batchId: 'new-generation-page', + token: 'new-generation-token', + changes: [testChange(1)], + ), + ), + 1, + ); + }, + ); + + test( + 'legacy zero-generation outbox row is terminally fenced and never leased', + () async { + final scope = testScope(); + await store.enqueueOutboxMutation(draft(scope, 1)); + final legacy = objectBox.box().getAll().single + ..checkpointGeneration = 0 + ..state = 1 + ..leaseIdHash = 'legacy-lease-hash' + ..leaseExpiresAtMs = testEpoch + .subtract(const Duration(seconds: 1)) + .millisecondsSinceEpoch; + objectBox.box().put(legacy); + + expect(await store.recoverExpiredOutboxLeases(scope, now: testEpoch), 0); + expect( + await store.leaseEligibleOutbox( + scope, + now: testEpoch, + limit: 1, + leaseId: 'legacy-row-lease', + leaseDuration: const Duration(minutes: 1), + allowedActions: const {CloudOutboxAction.save}, + ), + isEmpty, + ); + final fenced = objectBox + .box() + .getAll() + .single; + expect(fenced.state, 4); + expect(fenced.leaseIdHash, isNull); + + fenced + ..checkpointGeneration = 0 + ..state = 3 + ..lastErrorCategory = CloudFailureCategory.authorization.name + ..nextEligibleAtMs = 0; + objectBox.box().put(fenced); + expect( + await store.resumePausedOutbox( + scope, + categories: const {CloudFailureCategory.authorization}, + now: testEpoch, + ), + 0, + ); + expect( + objectBox.box().getAll().single.state, + 4, + ); + + fenced + ..checkpointGeneration = 0 + ..state = 3 + ..lastErrorCategory = CloudFailureCategory.network.name + ..nextEligibleAtMs = 0; + objectBox.box().put(fenced); + expect( + await store.postponeEligiblePausedOutbox( + scope, + categories: const {CloudFailureCategory.network}, + now: testEpoch, + nextEligibleAt: testEpoch.add(const Duration(minutes: 1)), + ), + 0, + ); + expect( + objectBox.box().getAll().single.state, + 4, + ); + }, + ); + + test('generation advance is isolated to its full account scope', () async { + final firstScope = testScope(); + final secondScope = testScope(account: testAccountFingerprintB); + await store.enqueueOutboxMutation(draft(firstScope, 1)); + final second = await store.enqueueOutboxMutation(draft(secondScope, 2)); + + await store.advanceOutboxGeneration(firstScope, now: testEpoch); + expect((await store.readCheckpoint(firstScope)).generation, 2); + expect((await store.readCheckpoint(secondScope)).generation, 1); + expect( + (await store.leaseEligibleOutbox( + secondScope, + now: testEpoch, + limit: 1, + leaseId: 'scope-b-lease', + leaseDuration: const Duration(minutes: 1), + allowedActions: const {CloudOutboxAction.save}, + )).single.operationId, + second.operationId, + ); + }); + + test( + 'generation cannot advance while its coordinator may be writing', + () async { + final scope = testScope(); + final fence = (await store.tryAcquireCoordinatorLease( + scope, + ownerId: 'active-generation-writer', + now: testEpoch, + leaseDuration: const Duration(minutes: 1), + ))!; + + await expectLater( + store.advanceOutboxGeneration(scope, now: testEpoch), + throwsA( + isA().having( + (failure) => failure.safeCode, + 'safeCode', + 'generation_advance_coordinator_active', + ), + ), + ); + expect((await store.readCheckpoint(scope)).generation, 1); + + await store.releaseCoordinatorLease(scope, leaseFence: fence); + expect( + (await store.advanceOutboxGeneration(scope, now: testEpoch)).generation, + 2, + ); + }, + ); + + test('caller-supplied operation ID cannot collide across scopes', () async { + final firstScope = testScope(); + final first = testOutboxOperation(firstScope, 91); + final otherScope = testScope(account: testAccountFingerprintB); + final collision = CloudOutboxOperation( + scope: otherScope, + operationId: first.operationId, + logicalEntityKeyHash: first.logicalEntityKeyHash, + action: first.action, + payloadVersion: first.payloadVersion, + mutationRevision: first.mutationRevision, + checkpointGeneration: 1, + encryptedPayloadReference: first.encryptedPayloadReference, + payloadSha256: first.payloadSha256, + dependencyOperationIds: first.dependencyOperationIds, + createdAt: first.createdAt, + ); + await store.enqueueOutbox(first); + + await expectLater( + store.enqueueOutbox(collision), + throwsA( + isA().having( + (failure) => failure.safeCode, + 'safeCode', + 'outbox_operation_scope_collision', + ), + ), + ); + expect( + objectBox.box().getAll().where( + (entity) => entity.accountFingerprint == testAccountFingerprintB, + ), + isEmpty, + ); + }); + + test( + 'confirmed dependency from an older generation cannot unlock work', + () async { + final scope = testScope(); + final dependency = await store.enqueueOutboxMutation(draft(scope, 101)); + await store.leaseEligibleOutbox( + scope, + now: testEpoch, + limit: 1, + leaseId: 'old-generation-lease', + leaseDuration: const Duration(minutes: 1), + allowedActions: const {CloudOutboxAction.save}, + ); + await store.applyOutboxTransitions( + scope, + leaseId: 'old-generation-lease', + transitions: [CloudOutboxTransition.confirmed(dependency.operationId)], + now: testEpoch, + ); + await store.advanceOutboxGeneration(scope, now: testEpoch); + await store.enqueueOutboxMutation( + draft(scope, 102, dependencies: {dependency.operationId}), + ); + + expect( + await store.leaseEligibleOutbox( + scope, + now: testEpoch, + limit: 1, + leaseId: 'new-generation-lease', + leaseDuration: const Duration(minutes: 1), + allowedActions: const {CloudOutboxAction.save}, + ), + isEmpty, + ); + }, + ); + + test('stale worker cannot partially transition a newer lease', () async { + final scope = testScope(); + final first = await store.enqueueOutboxMutation(draft(scope, 1)); + final second = await store.enqueueOutboxMutation(draft(scope, 2)); + final leased = await store.leaseEligibleOutbox( + scope, + now: testEpoch, + limit: 2, + leaseId: 'lease-current', + leaseDuration: const Duration(minutes: 1), + allowedActions: const {CloudOutboxAction.save}, + ); + expect(leased, hasLength(2)); + + await expectLater( + store.applyOutboxTransitions( + scope, + leaseId: 'lease-current', + transitions: [ + CloudOutboxTransition.confirmed(first.operationId), + const CloudOutboxTransition.confirmed('missing-operation'), + ], + now: testEpoch, + ), + throwsA( + isA().having( + (failure) => failure.safeCode, + 'safeCode', + 'stale_outbox_lease', + ), + ), + ); + + final states = { + for (final row in objectBox.box().getAll()) + row.operationId: row.state, + }; + expect(states[first.operationId], 1); + expect(states[second.operationId], 1); + }); + + test('reports and resumes only paused outbox failure categories', () async { + final scope = testScope(); + final operation = await store.enqueueOutboxMutation(draft(scope, 1)); + await store.leaseEligibleOutbox( + scope, + now: testEpoch, + limit: 1, + leaseId: 'lease-paused', + leaseDuration: const Duration(minutes: 1), + allowedActions: const {CloudOutboxAction.save}, + ); + await store.applyOutboxTransitions( + scope, + leaseId: 'lease-paused', + transitions: [ + CloudOutboxTransition.paused( + operation.operationId, + category: CloudFailureCategory.authorization, + nextEligibleAt: testEpoch.add(const Duration(hours: 1)), + ), + ], + now: testEpoch, + ); + + expect( + await store.readPausedOutboxFailureCategories(scope, now: testEpoch), + isEmpty, + ); + final eligibleAt = testEpoch.add(const Duration(hours: 1)); + expect( + await store.readPausedOutboxFailureCategories(scope, now: eligibleAt), + {CloudFailureCategory.authorization}, + ); + final postponedUntil = eligibleAt.add(const Duration(hours: 6)); + expect( + await store.postponeEligiblePausedOutbox( + scope, + categories: const {CloudFailureCategory.authorization}, + now: eligibleAt, + nextEligibleAt: postponedUntil, + ), + 1, + ); + expect( + await store.readPausedOutboxFailureCategories(scope, now: eligibleAt), + isEmpty, + ); + expect( + await store.readPausedOutboxFailureCategories(scope, now: postponedUntil), + {CloudFailureCategory.authorization}, + ); + expect( + await store.resumePausedOutbox( + scope, + categories: const {CloudFailureCategory.pcsUnavailable}, + now: postponedUntil, + ), + 0, + ); + expect( + await store.readPausedOutboxFailureCategories(scope, now: postponedUntil), + {CloudFailureCategory.authorization}, + ); + expect( + await store.resumePausedOutbox( + scope, + categories: const {CloudFailureCategory.authorization}, + now: postponedUntil, + ), + 1, + ); + expect( + await store.readPausedOutboxFailureCategories(scope, now: postponedUntil), + isEmpty, + ); + }); + + test( + 'newer delete waits behind a leased save and the batch keeps scanning', + () async { + final scope = testScope(); + final saveA = await store.enqueueOutboxMutation(draft(scope, 1)); + final deleteA = await store.enqueueOutboxMutation( + draft( + scope, + 1, + action: CloudOutboxAction.delete, + createdAt: testEpoch.add(const Duration(microseconds: 1)), + ), + ); + final saveB = await store.enqueueOutboxMutation( + draft( + scope, + 2, + createdAt: testEpoch.add(const Duration(microseconds: 2)), + ), + ); + + final firstLease = await store.leaseEligibleOutbox( + scope, + now: testEpoch, + limit: 1, + leaseId: 'lease-save-a', + leaseDuration: const Duration(minutes: 1), + allowedActions: CloudOutboxAction.values.toSet(), + ); + expect(firstLease.map((operation) => operation.operationId), [ + saveA.operationId, + ]); + + final secondLease = await store.leaseEligibleOutbox( + scope, + now: testEpoch, + limit: 1, + leaseId: 'lease-save-b', + leaseDuration: const Duration(minutes: 1), + allowedActions: CloudOutboxAction.values.toSet(), + ); + expect(secondLease.map((operation) => operation.operationId), [ + saveB.operationId, + ]); + + await store.applyOutboxTransitions( + scope, + leaseId: 'lease-save-a', + transitions: [CloudOutboxTransition.confirmed(saveA.operationId)], + now: testEpoch, + ); + + final thirdLease = await store.leaseEligibleOutbox( + scope, + now: testEpoch, + limit: 1, + leaseId: 'lease-delete-a', + leaseDuration: const Duration(minutes: 1), + allowedActions: CloudOutboxAction.values.toSet(), + ); + expect(thirdLease.map((operation) => operation.operationId), [ + deleteA.operationId, + ]); + }, + ); + + test( + 'expired outbox lease can recover but old owner cannot confirm', + () async { + final scope = testScope(); + final operation = await store.enqueueOutboxMutation(draft(scope, 1)); + await store.leaseEligibleOutbox( + scope, + now: testEpoch, + limit: 1, + leaseId: 'lease-old', + leaseDuration: const Duration(seconds: 1), + allowedActions: const {CloudOutboxAction.save}, + ); + final recovered = await store.recoverExpiredOutboxLeases( + scope, + now: testEpoch.add(const Duration(seconds: 2)), + ); + expect(recovered, 1); + await store.leaseEligibleOutbox( + scope, + now: testEpoch.add(const Duration(seconds: 2)), + limit: 1, + leaseId: 'lease-new', + leaseDuration: const Duration(minutes: 1), + allowedActions: const {CloudOutboxAction.save}, + ); + + await expectLater( + store.applyOutboxTransitions( + scope, + leaseId: 'lease-old', + transitions: [CloudOutboxTransition.confirmed(operation.operationId)], + now: testEpoch, + ), + throwsA(isA()), + ); + await store.applyOutboxTransitions( + scope, + leaseId: 'lease-new', + transitions: [CloudOutboxTransition.confirmed(operation.operationId)], + now: testEpoch, + ); + expect( + objectBox.box().getAll().single.state, + 2, + ); + }, + ); + + test( + 'submission marker survives reopen and recovery without replay leasing', + () async { + final scope = testScope(); + final operation = await store.enqueueOutboxMutation(draft(scope, 20)); + await store.leaseEligibleOutbox( + scope, + now: testEpoch, + limit: 1, + leaseId: 'objectbox-submission-marker-lease', + leaseDuration: const Duration(seconds: 1), + allowedActions: const {CloudOutboxAction.save}, + ); + + final submitted = await store.markOutboxSubmissionStarted( + scope, + leaseId: 'objectbox-submission-marker-lease', + submissionIdentity: testSubmissionIdentity([operation.operationId]), + now: testEpoch, + ); + final markedEntity = objectBox + .box() + .getAll() + .single; + expect(markedEntity.state, 5); + expect(markedEntity.lastErrorCategory, CloudFailureCategory.unknown.name); + expect(markedEntity.attemptCount, 0); + expect(markedEntity.leaseIdHash, isNotNull); + expect(markedEntity.appleRequestUuid, submitted.single.appleRequestUuid); + expect( + markedEntity.appleOperationUuid, + submitted.single.appleOperationUuid, + ); + + await reopen(); + expect( + await store.recoverExpiredOutboxLeases( + scope, + now: testEpoch.add(const Duration(seconds: 2)), + ), + 0, + ); + expect( + await store.leaseEligibleOutbox( + scope, + now: testEpoch.add(const Duration(seconds: 2)), + limit: 1, + leaseId: 'objectbox-replay-lease', + leaseDuration: const Duration(minutes: 1), + allowedActions: const {CloudOutboxAction.save}, + ), + isEmpty, + ); + expect( + objectBox.box().getAll().single.state, + 5, + ); + final reopened = objectBox + .box() + .getAll() + .single; + expect(reopened.appleRequestUuid, submitted.single.appleRequestUuid); + expect(reopened.appleOperationUuid, submitted.single.appleOperationUuid); + }, + ); + + test( + 'marked submission can be resolved by a returned confirmation', + () async { + final scope = testScope(); + final operation = await store.enqueueOutboxMutation(draft(scope, 21)); + await store.leaseEligibleOutbox( + scope, + now: testEpoch, + limit: 1, + leaseId: 'objectbox-submission-confirm-lease', + leaseDuration: const Duration(minutes: 1), + allowedActions: const {CloudOutboxAction.save}, + ); + await store.markOutboxSubmissionStarted( + scope, + leaseId: 'objectbox-submission-confirm-lease', + submissionIdentity: testSubmissionIdentity([operation.operationId]), + now: testEpoch, + ); + + await store.applyOutboxTransitions( + scope, + leaseId: 'objectbox-submission-confirm-lease', + transitions: [CloudOutboxTransition.confirmed(operation.operationId)], + now: testEpoch.add(const Duration(seconds: 1)), + ); + final resolved = objectBox + .box() + .getAll() + .single; + expect(resolved.state, 2); + expect(resolved.leaseIdHash, isNull); + expect(resolved.attemptCount, 0); + }, + ); + + test('submission identity failure rolls back the complete batch', () async { + final scope = testScope(); + final first = await store.enqueueOutboxMutation(draft(scope, 31)); + await store.enqueueOutboxMutation(draft(scope, 32)); + await store.leaseEligibleOutbox( + scope, + now: testEpoch, + limit: 2, + leaseId: 'objectbox-atomic-submission-lease', + leaseDuration: const Duration(minutes: 1), + allowedActions: const {CloudOutboxAction.save}, + ); + final invalid = CloudOutboxSubmissionIdentity( + requestUuid: '11111111-2222-4ABC-8DEF-555555555555', + operationUuids: { + first.operationId: 'AAAAAAAA-BBBB-4CCC-8DDD-000000000001', + 'missing-operation': 'AAAAAAAA-BBBB-4CCC-8DDD-000000000002', + }, + ); + + await expectLater( + store.markOutboxSubmissionStarted( + scope, + leaseId: 'objectbox-atomic-submission-lease', + submissionIdentity: invalid, + now: testEpoch, + ), + throwsA(isA()), + ); + + final rows = objectBox.box().getAll(); + expect(rows.every((row) => row.state == 1), isTrue); + expect(rows.every((row) => row.appleRequestUuid == null), isTrue); + expect(rows.every((row) => row.appleOperationUuid == null), isTrue); + }); + + test( + 'legacy unknown outcome without Apple identities stays frozen', + () async { + final scope = testScope(); + final legacy = testOutboxOperation( + scope, + 33, + ).copyWith(status: CloudOutboxStatus.unknownOutcome); + await store.enqueueOutbox(legacy); + + expect( + await store.leaseUnknownOutcomes( + scope, + now: testEpoch, + limit: 1, + leaseId: 'objectbox-legacy-unknown-lease', + leaseDuration: const Duration(minutes: 1), + ), + isEmpty, + ); + }, + ); + + test( + 'explicit unknown transition clears the live lease and increments attempts', + () async { + final scope = testScope(); + final operation = await store.enqueueOutboxMutation(draft(scope, 22)); + await store.leaseEligibleOutbox( + scope, + now: testEpoch, + limit: 1, + leaseId: 'objectbox-explicit-unknown-lease', + leaseDuration: const Duration(minutes: 1), + allowedActions: const {CloudOutboxAction.save}, + ); + await store.applyOutboxTransitions( + scope, + leaseId: 'objectbox-explicit-unknown-lease', + transitions: [ + CloudOutboxTransition.unknownOutcome(operation.operationId), + ], + now: testEpoch, + ); + final unknown = objectBox + .box() + .getAll() + .single; + expect(unknown.state, 5); + expect(unknown.lastErrorCategory, CloudFailureCategory.unknown.name); + expect(unknown.attemptCount, 1); + expect(unknown.leaseIdHash, isNull); + expect(unknown.leaseExpiresAtMs, 0); + expect(unknown.nextEligibleAtMs, 0); + }, + ); + + test( + 'unknown outcome blocks newer mutation and is fenced on generation advance', + () async { + final scope = testScope(); + const logicalKeyHash = 'objectbox-shared-unknown-logical-key'; + + Future enqueue(int revision) { + return store.enqueueOutboxMutation( + CloudOutboxDraft( + scope: scope, + logicalEntityKeyHash: logicalKeyHash, + action: CloudOutboxAction.save, + payloadVersion: 1, + dependencyOperationIds: const [], + createdAt: testEpoch.add(Duration(seconds: revision)), + encryptedPayloadReference: 'protected:objectbox-shared-$revision', + payloadSha256: 'digest:objectbox-shared-$revision', + ), + ); + } + + final first = await enqueue(1); + await store.leaseEligibleOutbox( + scope, + now: testEpoch, + limit: 1, + leaseId: 'objectbox-shared-unknown-lease', + leaseDuration: const Duration(minutes: 1), + allowedActions: const {CloudOutboxAction.save}, + ); + await store.applyOutboxTransitions( + scope, + leaseId: 'objectbox-shared-unknown-lease', + transitions: [CloudOutboxTransition.unknownOutcome(first.operationId)], + now: testEpoch, + ); + final second = await enqueue(2); + + expect( + await store.leaseEligibleOutbox( + scope, + now: testEpoch, + limit: 1, + leaseId: 'objectbox-shared-newer-lease', + leaseDuration: const Duration(minutes: 1), + allowedActions: const {CloudOutboxAction.save}, + ), + isEmpty, + ); + + await store.advanceOutboxGeneration(scope, now: testEpoch); + final rows = objectBox.box().getAll(); + expect(rows, hasLength(2)); + expect(rows.map((row) => row.state), everyElement(4)); + expect( + rows.map((row) => row.operationId), + containsAll([first.operationId, second.operationId]), + ); + }, + ); + + test('expired outbox lease cannot map or confirm before recovery', () async { + final scope = testScope(); + final operation = await store.enqueueOutboxMutation(draft(scope, 1)); + await store.leaseEligibleOutbox( + scope, + now: testEpoch, + limit: 1, + leaseId: 'expired-lease', + leaseDuration: const Duration(seconds: 1), + allowedActions: const {CloudOutboxAction.save}, + ); + + await expectLater( + store.attachOutboxRecordMapping( + scope, + leaseId: 'expired-lease', + operationId: operation.operationId, + serverRecordIdHash: 'server-record-hash', + now: testEpoch.add(const Duration(seconds: 1)), + ), + throwsA( + isA().having( + (error) => error.safeCode, + 'safeCode', + 'stale_outbox_lease', + ), + ), + ); + + await expectLater( + store.applyOutboxTransitions( + scope, + leaseId: 'expired-lease', + transitions: [CloudOutboxTransition.confirmed(operation.operationId)], + now: testEpoch.add(const Duration(seconds: 1)), + ), + throwsA( + isA().having( + (error) => error.safeCode, + 'safeCode', + 'stale_outbox_lease', + ), + ), + ); + expect( + objectBox.box().getAll().single.state, + 1, + ); + }); + + test('resume keeps future paused rows behind their retry boundary', () async { + final scope = testScope(); + final eligible = await store.enqueueOutboxMutation(draft(scope, 1)); + final future = await store.enqueueOutboxMutation(draft(scope, 2)); + final leased = await store.leaseEligibleOutbox( + scope, + now: testEpoch, + limit: 2, + leaseId: 'pause-lease', + leaseDuration: const Duration(minutes: 1), + allowedActions: const {CloudOutboxAction.save}, + ); + expect(leased, hasLength(2)); + await store.applyOutboxTransitions( + scope, + leaseId: 'pause-lease', + transitions: [ + CloudOutboxTransition.paused( + eligible.operationId, + category: CloudFailureCategory.authorization, + nextEligibleAt: testEpoch, + ), + CloudOutboxTransition.paused( + future.operationId, + category: CloudFailureCategory.authorization, + nextEligibleAt: testEpoch.add(const Duration(hours: 1)), + ), + ], + now: testEpoch, + ); + + expect( + await store.resumePausedOutbox( + scope, + categories: const {CloudFailureCategory.authorization}, + now: testEpoch, + ), + 1, + ); + final rows = objectBox.box().getAll(); + expect( + rows.singleWhere((row) => row.operationId == eligible.operationId).state, + 0, + ); + expect( + rows.singleWhere((row) => row.operationId == future.operationId).state, + 3, + ); + }); + + test('duplicate outbox transitions fail before mutation', () async { + final scope = testScope(); + final operation = await store.enqueueOutboxMutation(draft(scope, 1)); + await store.leaseEligibleOutbox( + scope, + now: testEpoch, + limit: 1, + leaseId: 'duplicate-transition-lease', + leaseDuration: const Duration(minutes: 1), + allowedActions: const {CloudOutboxAction.save}, + ); + + await expectLater( + store.applyOutboxTransitions( + scope, + leaseId: 'duplicate-transition-lease', + transitions: [ + CloudOutboxTransition.confirmed(operation.operationId), + CloudOutboxTransition.confirmed(operation.operationId), + ], + now: testEpoch, + ), + throwsA( + isA().having( + (error) => error.safeCode, + 'safeCode', + 'duplicate_outbox_transition', + ), + ), + ); + expect( + objectBox.box().getAll().single.state, + 1, + ); + }); + + test('coordinator lease renews across adapter instances', () async { + final scope = testScope(); + final secondAdapter = ObjectBoxCloudSyncStore( + store: objectBox, + protector: protector, + clock: () => currentTime, + ); + final firstFence = await store.tryAcquireCoordinatorLease( + scope, + ownerId: 'owner-a', + now: testEpoch, + leaseDuration: const Duration(minutes: 1), + ); + expect(firstFence, isNotNull); + expect( + await secondAdapter.tryAcquireCoordinatorLease( + scope, + ownerId: 'owner-b', + now: testEpoch, + leaseDuration: const Duration(minutes: 1), + ), + isNull, + ); + expect( + await store.renewCoordinatorLease( + scope, + leaseFence: firstFence!, + now: testEpoch.add(const Duration(seconds: 30)), + leaseDuration: const Duration(minutes: 1), + ), + isTrue, + ); + expect( + await secondAdapter.tryAcquireCoordinatorLease( + scope, + ownerId: 'owner-b', + now: testEpoch.add(const Duration(seconds: 61)), + leaseDuration: const Duration(minutes: 1), + ), + isNull, + ); + expect( + await store.renewCoordinatorLease( + scope, + leaseFence: CloudCoordinatorLeaseFence( + ownerId: 'wrong-owner', + generation: firstFence.generation, + ), + now: testEpoch.add(const Duration(seconds: 40)), + leaseDuration: const Duration(minutes: 1), + ), + isFalse, + ); + await store.releaseCoordinatorLease(scope, leaseFence: firstFence); + expect( + await secondAdapter.tryAcquireCoordinatorLease( + scope, + ownerId: 'owner-b', + now: testEpoch.add(const Duration(seconds: 41)), + leaseDuration: const Duration(minutes: 1), + ), + isNotNull, + ); + }); + + test( + 'same-owner lease ABA cannot renew or release a newer generation', + () async { + final scope = testScope(); + final staleFence = (await store.tryAcquireCoordinatorLease( + scope, + ownerId: 'same-owner', + now: testEpoch, + leaseDuration: const Duration(minutes: 1), + ))!; + await store.releaseCoordinatorLease(scope, leaseFence: staleFence); + final currentFence = (await store.tryAcquireCoordinatorLease( + scope, + ownerId: 'same-owner', + now: testEpoch, + leaseDuration: const Duration(minutes: 1), + ))!; + expect(currentFence.generation, greaterThan(staleFence.generation)); + + expect( + await store.renewCoordinatorLease( + scope, + leaseFence: staleFence, + now: testEpoch.add(const Duration(seconds: 1)), + leaseDuration: const Duration(minutes: 1), + ), + isFalse, + ); + await store.releaseCoordinatorLease(scope, leaseFence: staleFence); + expect( + await store.renewCoordinatorLease( + scope, + leaseFence: currentFence, + now: testEpoch.add(const Duration(seconds: 1)), + leaseDuration: const Duration(minutes: 1), + ), + isTrue, + ); + }, + ); + + test( + 'takeover survives reopen and stale fallback cannot overwrite terminal inbox', + () async { + final scope = testScope(); + final firstFence = (await store.tryAcquireCoordinatorLease( + scope, + ownerId: 'same-worker-name', + now: testEpoch, + leaseDuration: const Duration(seconds: 1), + ))!; + final checkpoint = await store.readCheckpoint(scope); + await store.journalFetchedBatch( + batch( + scope, + batchId: 'takeover-page', + token: 'takeover-token', + changes: [testChange(1)], + ), + now: testEpoch, + leaseFence: firstFence, + expectedGeneration: checkpoint.generation, + expectedFetchedToken: checkpoint.fetchedToken, + ); + + currentTime = testEpoch.add(const Duration(seconds: 2)); + final secondAdapter = ObjectBoxCloudSyncStore( + store: objectBox, + protector: protector, + clock: () => currentTime, + ); + final currentFence = (await secondAdapter.tryAcquireCoordinatorLease( + scope, + ownerId: 'same-worker-name', + now: currentTime, + leaseDuration: const Duration(minutes: 1), + ))!; + expect(currentFence.generation, greaterThan(firstFence.generation)); + await reopen(); + + await expectLater( + store.markInboxApplied( + scope, + sequence: 1, + now: currentTime, + leaseFence: firstFence, + ), + throwsA( + isA().having( + (failure) => failure.safeCode, + 'safeCode', + 'coordinator_lease_fence_lost', + ), + ), + ); + await store.quarantineInbox( + scope, + sequence: 1, + category: CloudFailureCategory.malformedRecord, + now: currentTime, + leaseFence: currentFence, + ); + await store.quarantineInbox( + scope, + sequence: 1, + category: CloudFailureCategory.malformedRecord, + now: currentTime, + leaseFence: currentFence, + ); + await expectLater( + store.markInboxApplied( + scope, + sequence: 1, + now: currentTime, + leaseFence: currentFence, + ), + throwsA( + isA().having( + (failure) => failure.safeCode, + 'safeCode', + 'inbox_transition_not_pending', + ), + ), + ); + + final row = objectBox.box().getAll().single; + expect(row.status, CloudInboxStatus.quarantined.index); + expect(row.retryCount, 1); + }, + ); + + test('stale coordinator cannot regress token after lease takeover', () async { + final scope = testScope(); + final firstFence = (await store.tryAcquireCoordinatorLease( + scope, + ownerId: 'owner-first', + now: testEpoch, + leaseDuration: const Duration(minutes: 1), + ))!; + final initial = await store.readCheckpoint(scope); + final secondFence = (await store.tryAcquireCoordinatorLease( + scope, + ownerId: 'owner-second', + now: testEpoch.add(const Duration(seconds: 61)), + leaseDuration: const Duration(minutes: 1), + ))!; + expect(secondFence.generation, greaterThan(firstFence.generation)); + + await store.journalShadowFetchedBatch( + batch( + scope, + batchId: 'second-owner-page', + token: 'token-newer', + changes: [testChange(2)], + ), + now: testEpoch.add(const Duration(seconds: 61)), + budget: CloudShadowJournalBudget(), + leaseFence: secondFence, + expectedGeneration: initial.generation, + expectedFetchedToken: initial.fetchedToken, + ); + + await expectLater( + store.journalShadowFetchedBatch( + batch( + scope, + batchId: 'stale-first-owner-page', + token: 'token-stale', + changes: [testChange(1)], + ), + now: testEpoch.add(const Duration(seconds: 62)), + budget: CloudShadowJournalBudget(), + leaseFence: firstFence, + expectedGeneration: initial.generation, + expectedFetchedToken: initial.fetchedToken, + ), + throwsA( + isA().having( + (failure) => failure.safeCode, + 'safeCode', + 'coordinator_lease_fence_lost', + ), + ), + ); + + expect((await store.readCheckpoint(scope)).fetchedToken, 'token-newer'); + expect(objectBox.box().count(), 1); + }); + + test('server record mapping is single-assignment', () async { + final scope = testScope(); + final original = CloudRecordMapEntry( + scope: scope, + logicalEntityKeyHash: 'logical-key-digest', + serverRecordIdHash: 'server-record-hash-a', + encryptedServerRecordId: 'protected:server-record-a', + etagHash: 'etag-a', + encryptedRawRecordReference: 'protected:raw-a', + updatedAt: testEpoch, + ); + await store.upsertRecordMap(original, generation: 1); + await store.upsertRecordMap( + CloudRecordMapEntry( + scope: scope, + logicalEntityKeyHash: original.logicalEntityKeyHash, + serverRecordIdHash: original.serverRecordIdHash, + encryptedServerRecordId: 'protected:replacement-is-ignored', + etagHash: 'etag-b', + encryptedRawRecordReference: 'protected:raw-b', + updatedAt: testEpoch.add(const Duration(seconds: 1)), + ), + generation: 1, + ); + final updated = await store.readRecordMap( + scope, + logicalEntityKeyHash: original.logicalEntityKeyHash, + generation: 1, + ); + expect(updated!.encryptedServerRecordId, 'protected:server-record-a'); + expect(updated.etagHash, 'etag-b'); + + await expectLater( + store.upsertRecordMap( + CloudRecordMapEntry( + scope: scope, + logicalEntityKeyHash: original.logicalEntityKeyHash, + serverRecordIdHash: 'server-record-hash-b', + encryptedServerRecordId: 'protected:server-record-b', + updatedAt: testEpoch, + ), + generation: 1, + ), + throwsA( + isA().having( + (failure) => failure.safeCode, + 'safeCode', + 'server_mapping_changed', + ), + ), + ); + }); + + test('record mappings cannot cross a checkpoint generation', () async { + final scope = testScope(); + final generationOne = CloudRecordMapEntry( + scope: scope, + logicalEntityKeyHash: 'generation-bound-logical-key', + serverRecordIdHash: 'generation-one-server-record', + encryptedServerRecordId: 'protected:generation-one-record', + updatedAt: testEpoch, + ); + await store.upsertRecordMap(generationOne, generation: 1); + await store.advanceOutboxGeneration(scope, now: testEpoch); + await reopen(); + + await expectLater( + store.readRecordMap( + scope, + logicalEntityKeyHash: generationOne.logicalEntityKeyHash, + generation: 1, + ), + throwsA( + isA().having( + (failure) => failure.safeCode, + 'safeCode', + 'record_map_generation_mismatch', + ), + ), + ); + expect( + await store.readRecordMap( + scope, + logicalEntityKeyHash: generationOne.logicalEntityKeyHash, + generation: 2, + ), + isNull, + ); + + final generationTwo = CloudRecordMapEntry( + scope: scope, + logicalEntityKeyHash: generationOne.logicalEntityKeyHash, + serverRecordIdHash: 'generation-two-server-record', + encryptedServerRecordId: 'protected:generation-two-record', + updatedAt: testEpoch, + ); + await store.upsertRecordMap(generationTwo, generation: 2); + expect( + (await store.readRecordMap( + scope, + logicalEntityKeyHash: generationOne.logicalEntityKeyHash, + generation: 2, + ))?.serverRecordIdHash, + generationTwo.serverRecordIdHash, + ); + }); + + test( + 'live protected-reference scan preserves applied inbox rows and checkpoint', + () async { + final scope = testScope(); + final serverReference = _nativeReference('S'); + final systemFieldsReference = _nativeReference('F'); + final payloadReference = _nativeReference('P'); + final checkpointReference = _nativeReference('C'); + final change = CloudFetchedChange( + changeId: 'applied-live-change', + recordIdHash: 'applied-live-record', + type: CloudChangeType.save, + encryptedServerRecordId: serverReference, + protectedSystemFieldsReference: systemFieldsReference, + encryptedPayloadReference: payloadReference, + payloadSha256: 'applied-live-payload', + ); + await journal( + batch(scope, token: checkpointReference, changes: [change]), + ); + await store.markInboxApplied( + scope, + sequence: 1, + now: testEpoch, + leaseFence: coordinatorFences[scope.storageKey]!, + ); + + final snapshot = await store.readLiveProtectedReferences( + maximumCount: 16, + ); + + expect(snapshot.isComplete, isTrue); + expect(snapshot.references, { + serverReference, + systemFieldsReference, + payloadReference, + checkpointReference, + }); + expect( + objectBox.box().getAll().single.status, + 1, + reason: + 'applied terminal rows remain protected-reference roots until a ' + 'separately reviewed compaction policy exists', + ); + }, + ); + + test( + 'live protected-reference scan crosses the 1024-row page boundary', + () async { + final scope = testScope(); + final references = List.generate( + 1025, + (index) => _nativeReferenceForIndex(index), + ); + final changes = List.generate( + references.length, + (index) => CloudFetchedChange( + changeId: 'paged-live-change-$index', + recordIdHash: 'paged-live-record-$index', + type: CloudChangeType.save, + encryptedPayloadReference: references[index], + payloadSha256: 'paged-live-payload-$index', + ), + ); + + expect( + await journal(batch(scope, token: null, changes: changes)), + references.length, + ); + final bounded = await store.readLiveProtectedReferences( + maximumCount: 100, + ); + expect(bounded.isComplete, isFalse); + expect(bounded.references, isEmpty); + + final snapshot = await store.readLiveProtectedReferences( + maximumCount: 4096, + ); + + expect(snapshot.isComplete, isTrue); + expect(snapshot.references, references.toSet()); + }, + ); + + test('leases only due unknown outcomes in deterministic order', () async { + final scope = testScope(); + Future makeUnknown( + CloudSyncScope value, + int index, { + DateTime? nextEligibleAt, + }) async { + final operation = await store.enqueueOutboxMutation(draft(value, index)); + await store.leaseEligibleOutbox( + value, + now: testEpoch, + limit: 1, + leaseId: 'seed-$index', + leaseDuration: const Duration(minutes: 1), + allowedActions: const {CloudOutboxAction.save}, + ); + await store.markOutboxSubmissionStarted( + value, + leaseId: 'seed-$index', + submissionIdentity: testSubmissionIdentity([operation.operationId]), + now: testEpoch, + ); + await store.applyOutboxTransitions( + value, + leaseId: 'seed-$index', + transitions: [ + CloudOutboxTransition.unknownOutcome( + operation.operationId, + nextEligibleAt: nextEligibleAt, + ), + ], + now: testEpoch, + ); + return operation; + } + + final live = await makeUnknown(scope, 201); + await store.leaseUnknownOutcomes( + scope, + now: testEpoch, + limit: 1, + leaseId: 'live-unknown-lease', + leaseDuration: const Duration(hours: 1), + ); + await makeUnknown( + scope, + 202, + nextEligibleAt: testEpoch.add(const Duration(hours: 1)), + ); + final expired = await makeUnknown(scope, 204); + await store.leaseUnknownOutcomes( + scope, + now: testEpoch, + limit: 1, + leaseId: 'expired-unknown-lease', + leaseDuration: const Duration(seconds: 1), + ); + final due = await makeUnknown(scope, 205); + final pending = await store.enqueueOutboxMutation(draft(scope, 203)); + + final takeoverAt = testEpoch.add(const Duration(seconds: 2)); + final leased = await store.leaseUnknownOutcomes( + scope, + now: takeoverAt, + limit: 10, + leaseId: 'reconcile-lease', + leaseDuration: const Duration(minutes: 1), + ); + + expect(leased.map((operation) => operation.operationId), [ + expired.operationId, + due.operationId, + ]); + expect( + leased, + everyElement( + isA() + .having( + (operation) => operation.status, + 'status', + CloudOutboxStatus.unknownOutcome, + ) + .having( + (operation) => operation.leaseId, + 'leaseId', + 'reconcile-lease', + ), + ), + ); + final rows = objectBox.box().getAll(); + expect( + rows + .singleWhere((row) => row.operationId == live.operationId) + .leaseIdHash, + isNotNull, + ); + expect( + rows.singleWhere((row) => row.operationId == pending.operationId).state, + 0, + ); + expect(rows, hasLength(5)); + }); + + test( + 'unknown transition persists reconciliation backoff and clears its lease', + () async { + final scope = testScope(); + final operation = await store.enqueueOutboxMutation(draft(scope, 206)); + await store.leaseEligibleOutbox( + scope, + now: testEpoch, + limit: 1, + leaseId: 'seed-backoff-lease', + leaseDuration: const Duration(minutes: 1), + allowedActions: const {CloudOutboxAction.save}, + ); + await store.markOutboxSubmissionStarted( + scope, + leaseId: 'seed-backoff-lease', + submissionIdentity: testSubmissionIdentity([operation.operationId]), + now: testEpoch, + ); + await store.applyOutboxTransitions( + scope, + leaseId: 'seed-backoff-lease', + transitions: [ + CloudOutboxTransition.unknownOutcome(operation.operationId), + ], + now: testEpoch, + ); + + final retryAt = testEpoch.add(const Duration(minutes: 5)); + await store.leaseUnknownOutcomes( + scope, + now: testEpoch, + limit: 1, + leaseId: 'reconcile-backoff-lease', + leaseDuration: const Duration(minutes: 1), + ); + await store.applyOutboxTransitions( + scope, + leaseId: 'reconcile-backoff-lease', + transitions: [ + CloudOutboxTransition.unknownOutcome( + operation.operationId, + nextEligibleAt: retryAt, + ), + ], + now: testEpoch, + ); + + var row = objectBox.box().getAll().single; + expect(row.state, 5); + expect(row.nextEligibleAtMs, retryAt.millisecondsSinceEpoch); + expect(row.leaseIdHash, isNull); + expect( + await store.leaseUnknownOutcomes( + scope, + now: retryAt.subtract(const Duration(seconds: 1)), + limit: 1, + leaseId: 'too-early-lease', + leaseDuration: const Duration(minutes: 1), + ), + isEmpty, + ); + final eligible = await store.leaseUnknownOutcomes( + scope, + now: retryAt, + limit: 1, + leaseId: 'due-again-lease', + leaseDuration: const Duration(minutes: 1), + ); + expect(eligible.single.operationId, operation.operationId); + row = objectBox.box().getAll().single; + expect(row.state, 5); + expect(row.leaseIdHash, isNotNull); + }, + ); + + test('unknown-outcome leasing isolates account and generation', () async { + final scope = testScope(); + final otherScope = testScope(account: testAccountFingerprintB); + final other = await store.enqueueOutboxMutation(draft(otherScope, 207)); + await store.leaseEligibleOutbox( + otherScope, + now: testEpoch, + limit: 1, + leaseId: 'other-seed-lease', + leaseDuration: const Duration(minutes: 1), + allowedActions: const {CloudOutboxAction.save}, + ); + await store.markOutboxSubmissionStarted( + otherScope, + leaseId: 'other-seed-lease', + submissionIdentity: testSubmissionIdentity([other.operationId]), + now: testEpoch, + ); + await store.applyOutboxTransitions( + otherScope, + leaseId: 'other-seed-lease', + transitions: [CloudOutboxTransition.unknownOutcome(other.operationId)], + now: testEpoch, + ); + + final stale = await store.enqueueOutboxMutation(draft(scope, 208)); + await store.leaseEligibleOutbox( + scope, + now: testEpoch, + limit: 1, + leaseId: 'stale-seed-lease', + leaseDuration: const Duration(minutes: 1), + allowedActions: const {CloudOutboxAction.save}, + ); + await store.markOutboxSubmissionStarted( + scope, + leaseId: 'stale-seed-lease', + submissionIdentity: testSubmissionIdentity([stale.operationId]), + now: testEpoch, + ); + await store.applyOutboxTransitions( + scope, + leaseId: 'stale-seed-lease', + transitions: [CloudOutboxTransition.unknownOutcome(stale.operationId)], + now: testEpoch, + ); + await store.advanceOutboxGeneration(scope, now: testEpoch); + + expect( + await store.leaseUnknownOutcomes( + scope, + now: testEpoch, + limit: 10, + leaseId: 'scope-lease', + leaseDuration: const Duration(minutes: 1), + ), + isEmpty, + ); + final otherLeased = await store.leaseUnknownOutcomes( + otherScope, + now: testEpoch, + limit: 1, + leaseId: 'other-reconcile-lease', + leaseDuration: const Duration(minutes: 1), + ); + expect(otherLeased.single.operationId, other.operationId); + expect( + objectBox + .box() + .getAll() + .singleWhere((row) => row.operationId == stale.operationId) + .state, + 4, + ); + }); +} + +String _nativeReference(String character) => + 'obcs2.ref.${List.filled(43, character).join()}'; + +String _nativeReferenceForIndex(int index) { + final token = base64Url + .encode(sha256.convert(utf8.encode('protected-reference-$index')).bytes) + .replaceAll('=', ''); + return 'obcs2.ref.$token'; +} + +CloudSyncResetRebootstrapRequest _resetRequest( + CloudSyncScope scope, { + int expectedGeneration = 1, +}) => CloudSyncResetRebootstrapRequest( + scope: scope, + transitionIdHash: + '2222222222222222222222222222222222222222222222222222222222222222', + activeIdentityFingerprint: scope.accountFingerprint, + expectedGeneration: expectedGeneration, + protectedRemoteStateProofReference: _nativeReference('A'), +); + +class _TestCloudSyncProtector implements CloudSyncProtector { + bool failProtection = false; + Future Function()? beforeProtect; + + @override + Future fingerprintAccount(String rawAccountIdentifier) async { + return sha256 + .convert(utf8.encode('test-hmac\u001f$rawAccountIdentifier')) + .toString(); + } + + @override + Future protect({ + required CloudSyncScope scope, + required CloudSyncProtectedValueKind kind, + required String plaintext, + }) async { + await beforeProtect?.call(); + if (failProtection) throw StateError('injected protection failure'); + final bound = '${scope.storageKey}\u001f${kind.name}\u001f$plaintext'; + return 'test-v1:${base64UrlEncode(utf8.encode(bound))}'; + } + + @override + Future unprotect({ + required CloudSyncScope scope, + required CloudSyncProtectedValueKind kind, + required String ciphertext, + }) async { + if (!ciphertext.startsWith('test-v1:')) throw const FormatException(); + final decoded = utf8.decode( + base64Url.decode(ciphertext.substring('test-v1:'.length)), + ); + final prefix = '${scope.storageKey}\u001f${kind.name}\u001f'; + if (!decoded.startsWith(prefix)) throw const FormatException(); + return decoded.substring(prefix.length); + } +} diff --git a/test/services/cloud_sync/rust_cloud_semantic_decoder_test.dart b/test/services/cloud_sync/rust_cloud_semantic_decoder_test.dart new file mode 100644 index 0000000000..e0fcd46ec5 --- /dev/null +++ b/test/services/cloud_sync/rust_cloud_semantic_decoder_test.dart @@ -0,0 +1,1195 @@ +import 'dart:typed_data'; + +import 'package:bluebubbles/services/rustpush/cloud_sync/cloud_inbox_applier.dart'; +import 'package:bluebubbles/services/rustpush/cloud_sync/cloud_sync_manual_shadow_sampler.dart'; +import 'package:bluebubbles/services/rustpush/cloud_sync/cloud_sync_models.dart'; +import 'package:bluebubbles/services/rustpush/cloud_sync/rust_cloud_semantic_decoder.dart'; +import 'package:bluebubbles/src/rust/api/api.dart' as frb; +import 'package:flutter_test/flutter_test.dart'; + +void main() { + late Object client; + late CloudSyncNativeAuthSnapshot auth; + late CloudSyncNativeAuthSnapshot? currentAuth; + late _Bindings bindings; + + setUp(() { + client = Object(); + auth = _auth(client); + currentAuth = auth; + bindings = _Bindings(); + }); + + RustCloudSemanticDecoder decoder({ + CloudTombstoneIdentityResolver? tombstoneResolver, + }) => RustCloudSemanticDecoder( + readAuthSnapshot: () async => currentAuth, + storageDirectory: r'C:\private\cloud-sync', + bindings: bindings, + tombstoneIdentityResolver: tombstoneResolver, + ); + + test('maps a native message upsert and passes every source fence', () async { + final entry = _entry(); + bindings.result = _readyMessage(entry); + + final decoded = await decoder().decode(entry); + + expect(decoded.scope, same(entry.scope)); + expect(decoded.generation, entry.generation); + expect(decoded.changeId, entry.change.changeId); + expect(decoded.kind, CloudDecodedMutationKind.upsert); + expect(decoded.snapshot!.logicalEntityKeyHash, _messageHash); + expect(decoded.payload, isA()); + final request = bindings.requests.single; + expect(request.authSnapshot, same(auth)); + expect(request.protectedStoreIdentity, _storeIdentity); + expect(request.nativeStream, 'messages'); + expect(request.entry.change.recordIdHash, _recordHash); + expect(request.entry.change.payloadSha256, _payloadSha); + expect(request.entry.change.encryptedPayloadReference, _sourceReference); + }); + + test('maps every currently representable native payload lane', () async { + final entry = _entry(); + final cases = + < + ( + frb.CloudSyncTransientEntityKind, + String, + frb.CloudSyncTransientPayload, + Type, + ) + >[ + ( + frb.CloudSyncTransientEntityKind.chat, + _chatHash, + frb.CloudSyncTransientPayload( + chat: _chatPayload( + participantHandles: ['one@example.invalid'], + displayNameState: frb.CloudSyncTransientFieldState.value, + displayName: 'Transient title', + ), + ), + CloudChatEntityPayload, + ), + ( + frb.CloudSyncTransientEntityKind.reaction, + _reactionHash, + frb.CloudSyncTransientPayload( + message: _messagePayload( + logicalEntityKeyHash: _reactionHash, + canonicalGuid: 'reaction-guid', + associationKind: + frb.CloudSyncTransientAssociationKind.reactionAdd, + reactionKind: frb.CloudSyncTransientReactionKind.emoji, + reactionParentLogicalKeyHash: _messageHash, + reactionParentCanonicalGuid: 'message-guid', + reactionParentPart: 0, + bodyState: frb.CloudSyncTransientFieldState.absent, + body: null, + associatedEmojiState: frb.CloudSyncTransientFieldState.value, + associatedEmoji: '👍', + ), + ), + CloudReactionEntityPayload, + ), + ( + frb.CloudSyncTransientEntityKind.attachment, + _attachmentHash, + frb.CloudSyncTransientPayload(attachment: _attachmentPayload()), + CloudAttachmentEntityPayload, + ), + ( + frb.CloudSyncTransientEntityKind.groupPhoto, + _groupPhotoHash, + const frb.CloudSyncTransientPayload( + groupPhoto: frb.CloudSyncTransientGroupPhotoPayload( + logicalEntityKeyHash: _groupPhotoHash, + ownerLogicalKeyHash: _chatHash, + photoGuid: 'group-photo-guid', + protectedLocalReference: _attachmentReference, + ), + ), + CloudGroupPhotoEntityPayload, + ), + ]; + + for (final item in cases) { + bindings.result = frb.CloudSyncTransientDecodeResult( + protectedSourceReference: _sourceReference, + generation: BigInt.from(entry.generation), + changeId: entry.change.changeId, + entityKind: item.$1, + mutationKind: frb.CloudSyncTransientMutationKind.upsert, + snapshot: _snapshotFor(item.$1, item.$2), + payload: item.$3, + ); + final decoded = await decoder().decode(entry); + expect(decoded.payload.runtimeType, item.$4); + expect(decoded.payload!.toString(), isNot(contains('Transient'))); + } + }); + + test( + 'rejects a native source reference mismatch before projection', + () async { + final entry = _entry(); + bindings.result = frb.CloudSyncTransientDecodeResult( + protectedSourceReference: 'obcs2.ref.${'X' * 43}', + generation: BigInt.from(entry.generation), + changeId: entry.change.changeId, + entityKind: frb.CloudSyncTransientEntityKind.message, + mutationKind: frb.CloudSyncTransientMutationKind.upsert, + snapshot: _snapshot(), + payload: frb.CloudSyncTransientPayload(message: _messagePayload()), + ); + + await _expectFailure( + decoder().decode(entry), + CloudFailureCategory.conflict, + ); + }, + ); + + test('rejects a nested snapshot source reference mismatch', () async { + final entry = _entry(); + bindings.result = _readyMessage( + entry, + snapshot: _snapshotFor( + frb.CloudSyncTransientEntityKind.message, + _messageHash, + sourceReference: 'obcs2.ref.${'N' * 43}', + ), + ); + + await _expectFailure( + decoder().decode(entry), + CloudFailureCategory.malformedRecord, + ); + }); + + test('rejects an account session replacement after native decode', () async { + final entry = _entry(); + bindings.result = _readyMessage(entry); + bindings.afterDecode = () => currentAuth = _auth(Object()); + + await _expectFailure( + decoder().decode(entry), + CloudFailureCategory.conflict, + ); + }); + + test('maps native retry and terminal dispositions exhaustively', () async { + final entry = _entry(); + final cases = { + frb.CloudSyncTransientFailureCode.invalidRequest: + CloudFailureCategory.malformedRecord, + frb.CloudSyncTransientFailureCode.activeAccountMismatch: + CloudFailureCategory.authorization, + frb.CloudSyncTransientFailureCode.scopeMismatch: + CloudFailureCategory.conflict, + frb.CloudSyncTransientFailureCode.generationMismatch: + CloudFailureCategory.conflict, + frb.CloudSyncTransientFailureCode.storeIdentityMismatch: + CloudFailureCategory.conflict, + frb.CloudSyncTransientFailureCode.protectedReferenceMismatch: + CloudFailureCategory.conflict, + frb.CloudSyncTransientFailureCode.malformedRecord: + CloudFailureCategory.malformedRecord, + frb.CloudSyncTransientFailureCode.oversizedRecord: + CloudFailureCategory.malformedRecord, + frb.CloudSyncTransientFailureCode.pcsUnavailable: + CloudFailureCategory.pcsUnavailable, + frb.CloudSyncTransientFailureCode.retryableUpstream: + CloudFailureCategory.server, + frb.CloudSyncTransientFailureCode.decoderFailure: + CloudFailureCategory.unknown, + }; + for (final item in cases.entries) { + bindings.result = frb.CloudSyncTransientDecodeResult( + protectedSourceReference: _sourceReference, + generation: BigInt.from(entry.generation), + failureCode: item.key, + ); + await _expectFailure(decoder().decode(entry), item.value); + } + + for (final reason in frb.CloudSyncTransientDeferredReason.values) { + bindings.result = frb.CloudSyncTransientDecodeResult( + protectedSourceReference: _sourceReference, + generation: BigInt.from(entry.generation), + deferredReason: reason, + ); + await _expectFailure( + decoder().decode(entry), + CloudFailureCategory.malformedRecord, + ); + } + + bindings.result = frb.CloudSyncTransientDecodeResult( + protectedSourceReference: _sourceReference, + generation: BigInt.from(entry.generation), + quarantineReason: frb.CloudSyncTransientQuarantineReason.malformedRecord, + ); + await _expectFailure( + decoder().decode(entry), + CloudFailureCategory.malformedRecord, + ); + }); + + test('rejects mixed dispositions and malformed payload lanes', () async { + final entry = _entry(); + bindings.result = frb.CloudSyncTransientDecodeResult( + protectedSourceReference: _sourceReference, + generation: BigInt.from(entry.generation), + changeId: entry.change.changeId, + entityKind: frb.CloudSyncTransientEntityKind.message, + mutationKind: frb.CloudSyncTransientMutationKind.upsert, + snapshot: _snapshot(), + payload: frb.CloudSyncTransientPayload( + message: _messagePayload(), + chat: _chatPayload(), + ), + deferredReason: + frb.CloudSyncTransientDeferredReason.nestedPresenceUnavailable, + ); + + await _expectFailure( + decoder().decode(entry), + CloudFailureCategory.conflict, + ); + + bindings.result = _readyMessage( + entry, + payload: frb.CloudSyncTransientPayload( + message: _messagePayload(), + chat: _chatPayload(), + ), + ); + await _expectFailure( + decoder().decode(entry), + CloudFailureCategory.malformedRecord, + ); + }); + + test('maps absent message bodies without inventing content', () async { + final entry = _entry(); + bindings.result = _readyMessage( + entry, + payload: frb.CloudSyncTransientPayload( + message: _messagePayload( + bodyState: frb.CloudSyncTransientFieldState.absent, + body: null, + ), + ), + ); + + final payload = + (await decoder().decode(entry)).payload! as CloudMessageEntityPayload; + expect(payload.bodyState, CloudSemanticFieldState.absent); + expect(payload.body, isNull); + }); + + test( + 'maps every reaction kind and removal to application vocabulary', + () async { + final entry = _entry(); + final expected = { + frb.CloudSyncTransientReactionKind.heart: 'love', + frb.CloudSyncTransientReactionKind.like: 'like', + frb.CloudSyncTransientReactionKind.dislike: 'dislike', + frb.CloudSyncTransientReactionKind.laugh: 'laugh', + frb.CloudSyncTransientReactionKind.emphasize: 'emphasize', + frb.CloudSyncTransientReactionKind.question: 'question', + frb.CloudSyncTransientReactionKind.emoji: 'emoji', + frb.CloudSyncTransientReactionKind.stickerBack: 'stickerback', + }; + for (final item in expected.entries) { + for (final removed in [false, true]) { + final emoji = item.key == frb.CloudSyncTransientReactionKind.emoji + ? '👍' + : null; + bindings.result = _readyReaction( + entry, + reactionKind: item.key, + removed: removed, + emoji: emoji, + ); + final payload = + (await decoder().decode(entry)).payload! + as CloudReactionEntityPayload; + expect(payload.reactionType, removed ? '-${item.value}' : item.value); + expect(payload.associatedEmoji, emoji); + } + } + }, + ); + + test( + 'defers every incomplete attachment owner identity combination', + () async { + final entry = _entry(); + final incompleteOwners = <(String?, String?, int?)>[ + (null, null, null), + (_messageHash, null, null), + (null, 'message-guid', null), + (null, null, 0), + (_messageHash, 'message-guid', null), + (_messageHash, null, 0), + (null, 'message-guid', 0), + ]; + + for (final (ownerHash, ownerGuid, ownerPart) in incompleteOwners) { + bindings.result = frb.CloudSyncTransientDecodeResult( + protectedSourceReference: _sourceReference, + generation: BigInt.from(entry.generation), + changeId: entry.change.changeId, + entityKind: frb.CloudSyncTransientEntityKind.attachment, + mutationKind: frb.CloudSyncTransientMutationKind.upsert, + snapshot: _snapshotFor( + frb.CloudSyncTransientEntityKind.attachment, + _attachmentHash, + ), + payload: frb.CloudSyncTransientPayload( + attachment: _attachmentPayload( + ownerLogicalKeyHash: ownerHash, + ownerCanonicalGuid: ownerGuid, + ownerPart: ownerPart, + ), + ), + ); + + if (ownerHash == null && ownerGuid == null && ownerPart == null) { + final payload = + (await decoder().decode(entry)).payload! + as CloudAttachmentEntityPayload; + expect(payload.ownerLogicalKeyHash, isNull); + expect(payload.ownerCanonicalGuid, isNull); + expect(payload.ownerPart, isNull); + } else { + await _expectFailure( + decoder().decode(entry), + CloudFailureCategory.dependency, + ); + } + } + }, + ); + + test('preserves chat field states, including explicit clear', () async { + final entry = _entry(); + for (final (state, displayName) in [ + (frb.CloudSyncTransientFieldState.absent, null), + (frb.CloudSyncTransientFieldState.value, 'A title'), + (frb.CloudSyncTransientFieldState.explicitClear, null), + ]) { + bindings.result = _readyChat( + entry, + payload: frb.CloudSyncTransientPayload( + chat: _chatPayload(displayNameState: state, displayName: displayName), + ), + ); + + final payload = + (await decoder().decode(entry)).payload! as CloudChatEntityPayload; + expect(payload.displayNameState, _chatFieldState(state)); + expect(payload.displayName, displayName); + } + }); + + test('maps rich message fields into the domain payload', () async { + final entry = _entry(); + const attributedBody = frb.CloudSyncTransientAttributedBody( + text: 'hello', + runs: [ + frb.CloudSyncTransientTextRun( + startUtf16: 0, + lengthUtf16: 5, + mentionHandle: 'friend@example.invalid', + bold: true, + italic: false, + ), + ], + ); + const edit = frb.CloudSyncTransientMessageEdit( + part_: 1, + revision: 2, + bodies: [attributedBody], + modifiedAtMillis: 1787385604000, + originalRangeLocation: 3, + originalRangeLength: 2, + ); + bindings.result = _readyMessage( + entry, + payload: frb.CloudSyncTransientPayload( + message: _messagePayload( + subjectState: frb.CloudSyncTransientFieldState.value, + subject: 'Subject', + body: 'hello', + attributedBodiesState: frb.CloudSyncTransientFieldState.value, + attributedBodies: [attributedBody], + createdAtMillis: 1787385601000, + error: 7, + readAtMillisState: frb.CloudSyncTransientFieldState.value, + readAtMillis: 1787385602000, + deliveredAtMillisState: frb.CloudSyncTransientFieldState.value, + deliveredAtMillis: 1787385603000, + knownFlags: const frb.CloudSyncTransientKnownMessageFlags( + fromMe: true, + delivered: true, + read: true, + hasDataDetectorResults: true, + deliveredQuietly: false, + didNotifyRecipient: true, + ), + replyParentLogicalKeyHash: _messageHash, + replyParentCanonicalGuid: 'reply-guid', + replyParentPart: '0', + editsState: frb.CloudSyncTransientFieldState.value, + edits: [edit], + retractedPartsState: frb.CloudSyncTransientFieldState.value, + retractedParts: [2, 4], + ), + ), + ); + + final payload = + (await decoder().decode(entry)).payload! as CloudMessageEntityPayload; + expect(payload.subjectState, CloudSemanticFieldState.value); + expect(payload.subject, 'Subject'); + expect(payload.bodyState, CloudSemanticFieldState.value); + expect(payload.body, 'hello'); + expect( + payload.createdAt, + DateTime.fromMillisecondsSinceEpoch(1787385601000, isUtc: true), + ); + expect(payload.error, 7); + expect( + payload.readAt, + DateTime.fromMillisecondsSinceEpoch(1787385602000, isUtc: true), + ); + expect( + payload.deliveredAt, + DateTime.fromMillisecondsSinceEpoch(1787385603000, isUtc: true), + ); + expect(payload.knownFlags?.fromMe, isTrue); + expect(payload.knownFlags?.hasDataDetectorResults, isTrue); + expect(payload.replyParentCanonicalGuid, 'reply-guid'); + expect(payload.replyParentLogicalKeyHash, _messageHash); + expect(payload.replyParentPart, '0'); + expect(payload.attributedBodiesState, CloudSemanticFieldState.value); + expect(payload.attributedBodies.single.text, 'hello'); + expect(payload.attributedBodies.single.runs.single.startUtf16, 0); + expect(payload.attributedBodies.single.runs.single.lengthUtf16, 5); + expect( + payload.attributedBodies.single.runs.single.mentionHandle, + 'friend@example.invalid', + ); + expect(payload.attributedBodies.single.runs.single.bold, isTrue); + expect(payload.editsState, CloudSemanticFieldState.value); + expect(payload.edits.single.part, 1); + expect(payload.edits.single.revision, 2); + expect(payload.edits.single.originalRangeLocation, 3); + expect(payload.edits.single.originalRangeLength, 2); + expect(payload.retractedPartsState, CloudSemanticFieldState.value); + expect(payload.retractedParts, [2, 4]); + }); + + test('rejects malformed field-state and value combinations', () async { + final entry = _entry(); + final cases = [ + frb.CloudSyncTransientPayload( + chat: _chatPayload( + displayNameState: frb.CloudSyncTransientFieldState.value, + ), + ), + frb.CloudSyncTransientPayload( + message: _messagePayload( + subjectState: frb.CloudSyncTransientFieldState.value, + ), + ), + frb.CloudSyncTransientPayload( + attachment: _attachmentPayload( + totalBytesState: frb.CloudSyncTransientFieldState.value, + ), + ), + ]; + final kinds = [ + frb.CloudSyncTransientEntityKind.chat, + frb.CloudSyncTransientEntityKind.message, + frb.CloudSyncTransientEntityKind.attachment, + ]; + final hashes = [_chatHash, _messageHash, _attachmentHash]; + for (var i = 0; i < cases.length; i++) { + bindings.result = frb.CloudSyncTransientDecodeResult( + protectedSourceReference: _sourceReference, + generation: BigInt.from(entry.generation), + changeId: entry.change.changeId, + entityKind: kinds[i], + mutationKind: frb.CloudSyncTransientMutationKind.upsert, + snapshot: _snapshotFor(kinds[i], hashes[i]), + payload: cases[i], + ); + await _expectFailure( + decoder().decode(entry), + i == 0 + ? CloudFailureCategory.malformedRecord + : CloudFailureCategory.dependency, + ); + } + }); + + test('maps attachment states and defers oversized unsigned sizes', () async { + final entry = _entry(); + bindings.result = _readyAttachment( + entry, + payload: frb.CloudSyncTransientPayload( + attachment: _attachmentPayload( + utiState: frb.CloudSyncTransientFieldState.value, + uti: 'public.data', + totalBytesState: frb.CloudSyncTransientFieldState.value, + totalBytes: BigInt.from(42), + isOutgoingState: frb.CloudSyncTransientFieldState.value, + isOutgoing: true, + ), + ), + ); + final payload = + (await decoder().decode(entry)).payload! + as CloudAttachmentEntityPayload; + expect(payload.utiState, CloudSemanticFieldState.value); + expect(payload.uti, 'public.data'); + expect(payload.totalBytesState, CloudSemanticFieldState.value); + expect(payload.totalBytes, 42); + expect(payload.isOutgoingState, CloudSemanticFieldState.value); + expect(payload.isOutgoing, isTrue); + + bindings.result = _readyAttachment( + entry, + payload: frb.CloudSyncTransientPayload( + attachment: _attachmentPayload( + totalBytesState: frb.CloudSyncTransientFieldState.value, + totalBytes: BigInt.parse('9223372036854775808'), + ), + ), + ); + await _expectFailure( + decoder().decode(entry), + CloudFailureCategory.dependency, + ); + }); + + test('maps reaction association, range, and timestamps', () async { + final entry = _entry(); + bindings.result = _readyReaction( + entry, + reactionKind: frb.CloudSyncTransientReactionKind.heart, + removed: false, + associatedRangeLocation: 4, + associatedRangeLength: 2, + createdAtMillis: 1787385601000, + readAtMillisState: frb.CloudSyncTransientFieldState.value, + readAtMillis: 1787385602000, + deliveredAtMillisState: frb.CloudSyncTransientFieldState.value, + deliveredAtMillis: 1787385603000, + ); + final payload = + (await decoder().decode(entry)).payload! as CloudReactionEntityPayload; + expect(payload.reactionType, 'love'); + expect(payload.parentCanonicalGuid, 'message-guid'); + expect(payload.parentPart, 0); + expect(payload.associatedRangeLocation, 4); + expect(payload.associatedRangeLength, 2); + expect( + payload.createdAt, + DateTime.fromMillisecondsSinceEpoch(1787385601000, isUtc: true), + ); + expect(payload.readAtState, CloudSemanticFieldState.value); + expect( + payload.readAt, + DateTime.fromMillisecondsSinceEpoch(1787385602000, isUtc: true), + ); + expect(payload.deliveredAtState, CloudSemanticFieldState.value); + expect( + payload.deliveredAt, + DateTime.fromMillisecondsSinceEpoch(1787385603000, isUtc: true), + ); + }); + + test( + 'reduces edit history to the highest revision and rejects duplicates', + () async { + final entry = _entry(); + const partHash = 'PPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPP'; + const digest1 = + '1111111111111111111111111111111111111111111111111111111111111111'; + const digest2 = + '2222222222222222222222222222222222222222222222222222222222222222'; + final revisions = [ + const frb.CloudSyncTransientEditPart( + partKeyHash: partHash, + revision: 1, + contentDigest: digest1, + modifiedAtMillis: 1, + ), + const frb.CloudSyncTransientEditPart( + partKeyHash: partHash, + revision: 2, + contentDigest: digest2, + modifiedAtMillis: 2, + ), + ]; + bindings.result = _readyMessage( + entry, + snapshot: _snapshotFor( + frb.CloudSyncTransientEntityKind.message, + _messageHash, + editParts: revisions, + ), + ); + final decoded = await decoder().decode(entry); + expect(decoded.snapshot!.editParts[partHash]!.revision, 2); + + bindings.result = _readyMessage( + entry, + snapshot: _snapshotFor( + frb.CloudSyncTransientEntityKind.message, + _messageHash, + editParts: [revisions.first, revisions.first], + ), + ); + await _expectFailure( + decoder().decode(entry), + CloudFailureCategory.malformedRecord, + ); + }, + ); + + test( + 'requires a proven tombstone identity and maps it without a timestamp', + () async { + final entry = _entry(tombstone: true); + await _expectFailure( + decoder().decode(entry), + CloudFailureCategory.dependency, + ); + expect(bindings.requests, isEmpty); + + final resolver = _TombstoneResolver( + CloudTombstoneIdentity( + scope: entry.scope, + generation: entry.generation, + changeId: entry.change.changeId, + serverRecordIdHash: entry.change.recordIdHash, + kind: CloudEntityKind.message, + logicalEntityKeyHash: _messageHash, + ), + ); + bindings.result = frb.CloudSyncTransientDecodeResult( + protectedSourceReference: _sourceReference, + generation: BigInt.from(entry.generation), + changeId: entry.change.changeId, + entityKind: frb.CloudSyncTransientEntityKind.message, + mutationKind: frb.CloudSyncTransientMutationKind.tombstone, + tombstone: const frb.CloudSyncTransientTombstone( + entityKind: frb.CloudSyncTransientEntityKind.message, + logicalEntityKeyHash: _messageHash, + serverConfirmed: true, + ), + ); + + final decoded = await decoder(tombstoneResolver: resolver).decode(entry); + expect(decoded.kind, CloudDecodedMutationKind.tombstone); + expect(decoded.tombstone!.deletedAt, isNull); + expect(decoded.tombstone!.serverConfirmed, isTrue); + expect( + bindings.requests.single.tombstoneIdentity!.logicalEntityKeyHash, + _messageHash, + ); + + bindings.requests.clear(); + bindings.result = frb.CloudSyncTransientDecodeResult( + protectedSourceReference: _sourceReference, + generation: BigInt.from(entry.generation), + changeId: entry.change.changeId, + entityKind: frb.CloudSyncTransientEntityKind.message, + mutationKind: frb.CloudSyncTransientMutationKind.tombstone, + tombstone: const frb.CloudSyncTransientTombstone( + entityKind: frb.CloudSyncTransientEntityKind.message, + logicalEntityKeyHash: _reactionHash, + serverConfirmed: true, + ), + ); + await _expectFailure( + decoder(tombstoneResolver: resolver).decode(entry), + CloudFailureCategory.malformedRecord, + ); + }, + ); + + test( + 'rejects stale tombstone resolver output before native decode', + () async { + final entry = _entry(tombstone: true); + final resolver = _TombstoneResolver( + CloudTombstoneIdentity( + scope: entry.scope, + generation: entry.generation + 1, + changeId: entry.change.changeId, + serverRecordIdHash: entry.change.recordIdHash, + kind: CloudEntityKind.message, + logicalEntityKeyHash: _messageHash, + ), + ); + await _expectFailure( + decoder(tombstoneResolver: resolver).decode(entry), + CloudFailureCategory.dependency, + ); + expect(bindings.requests, isEmpty); + }, + ); + + test('rejects every auxiliary zone before native semantic decode', () async { + for (final zone in [ + 'messageUpdateZone', + 'recoverableMessageDeleteZone', + 'scheduledMessageZone', + 'chat1ManateeZone', + ]) { + final entry = _entry( + scope: CloudSyncScope( + accountFingerprint: _accountFingerprint, + container: 'com.apple.messages.cloud', + database: 'private', + zone: zone, + ), + ); + await _expectFailure( + decoder().decode(entry), + CloudFailureCategory.conflict, + ); + } + expect(bindings.requests, isEmpty); + }); + + test('rejects unsupported scope before calling native code', () async { + final entry = _entry( + scope: CloudSyncScope( + accountFingerprint: _accountFingerprint, + container: 'wrong-container', + database: 'private', + zone: 'messageManateeZone', + ), + ); + + await _expectFailure( + decoder().decode(entry), + CloudFailureCategory.conflict, + ); + expect(bindings.requests, isEmpty); + }); +} + +const _accountFingerprint = 'AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA'; +const _storeIdentity = + 'obcs2.store.BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB'; +const _sourceReference = + 'obcs2.ref.RRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRR'; +const _changeId = 'CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC'; +const _recordHash = 'DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD'; +const _messageHash = 'MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM'; +const _chatHash = 'HHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHH'; +const _reactionHash = 'QQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQ'; +const _attachmentHash = 'TTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTT'; +const _groupPhotoHash = 'GGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGG'; +const _attachmentReference = + 'obcs2.ref.LLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLL'; +const _payloadSha = + 'aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa'; + +CloudSyncNativeAuthSnapshot _auth(Object client) => + CloudSyncNativeAuthSnapshot.fromNative( + nativeSessionId: 'session', + accountFingerprint: _accountFingerprint, + protectedStoreIdentity: _storeIdentity, + cloudMessagesClient: client, + ); + +CloudInboxEntry _entry({bool tombstone = false, CloudSyncScope? scope}) { + final actualScope = + scope ?? + CloudSyncScope( + accountFingerprint: _accountFingerprint, + container: 'com.apple.messages.cloud', + database: 'private', + zone: 'messageManateeZone', + ); + return CloudInboxEntry( + scope: actualScope, + sequence: 1, + change: CloudFetchedChange( + changeId: _changeId, + recordIdHash: _recordHash, + type: tombstone ? CloudChangeType.delete : CloudChangeType.save, + etagHash: tombstone + ? null + : 'EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE', + encryptedServerRecordId: + 'obcs2.ref.IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII', + encryptedPayloadReference: _sourceReference, + payloadSha256: _payloadSha, + isTombstone: tombstone, + serverModifiedAt: DateTime.utc(2026, 8, 22), + ), + status: CloudInboxStatus.pending, + attemptCount: 0, + createdAt: DateTime.utc(2026, 8, 22), + batchId: 'batch', + generation: 7, + ); +} + +frb.CloudSyncTransientDecodeResult _readyMessage( + CloudInboxEntry entry, { + frb.CloudSyncTransientPayload? payload, + frb.CloudSyncTransientSnapshot? snapshot, +}) => frb.CloudSyncTransientDecodeResult( + protectedSourceReference: _sourceReference, + generation: BigInt.from(entry.generation), + changeId: entry.change.changeId, + entityKind: frb.CloudSyncTransientEntityKind.message, + mutationKind: frb.CloudSyncTransientMutationKind.upsert, + snapshot: snapshot ?? _snapshot(), + payload: payload ?? frb.CloudSyncTransientPayload(message: _messagePayload()), +); + +frb.CloudSyncTransientDecodeResult _readyChat( + CloudInboxEntry entry, { + frb.CloudSyncTransientPayload? payload, +}) => frb.CloudSyncTransientDecodeResult( + protectedSourceReference: _sourceReference, + generation: BigInt.from(entry.generation), + changeId: entry.change.changeId, + entityKind: frb.CloudSyncTransientEntityKind.chat, + mutationKind: frb.CloudSyncTransientMutationKind.upsert, + snapshot: _snapshotFor(frb.CloudSyncTransientEntityKind.chat, _chatHash), + payload: payload ?? frb.CloudSyncTransientPayload(chat: _chatPayload()), +); + +frb.CloudSyncTransientDecodeResult _readyAttachment( + CloudInboxEntry entry, { + frb.CloudSyncTransientPayload? payload, +}) => frb.CloudSyncTransientDecodeResult( + protectedSourceReference: _sourceReference, + generation: BigInt.from(entry.generation), + changeId: entry.change.changeId, + entityKind: frb.CloudSyncTransientEntityKind.attachment, + mutationKind: frb.CloudSyncTransientMutationKind.upsert, + snapshot: _snapshotFor( + frb.CloudSyncTransientEntityKind.attachment, + _attachmentHash, + ), + payload: + payload ?? + frb.CloudSyncTransientPayload(attachment: _attachmentPayload()), +); + +frb.CloudSyncTransientDecodeResult _readyReaction( + CloudInboxEntry entry, { + required frb.CloudSyncTransientReactionKind reactionKind, + required bool removed, + String? emoji, + int? associatedRangeLocation, + int? associatedRangeLength, + int createdAtMillis = 1787385600000, + frb.CloudSyncTransientFieldState readAtMillisState = + frb.CloudSyncTransientFieldState.absent, + int? readAtMillis, + frb.CloudSyncTransientFieldState deliveredAtMillisState = + frb.CloudSyncTransientFieldState.absent, + int? deliveredAtMillis, +}) => frb.CloudSyncTransientDecodeResult( + protectedSourceReference: _sourceReference, + generation: BigInt.from(entry.generation), + changeId: entry.change.changeId, + entityKind: frb.CloudSyncTransientEntityKind.reaction, + mutationKind: frb.CloudSyncTransientMutationKind.upsert, + snapshot: _snapshotFor( + frb.CloudSyncTransientEntityKind.reaction, + _reactionHash, + ), + payload: frb.CloudSyncTransientPayload( + message: _messagePayload( + logicalEntityKeyHash: _reactionHash, + canonicalGuid: 'reaction-guid', + createdAtMillis: createdAtMillis, + bodyState: frb.CloudSyncTransientFieldState.absent, + body: null, + associationKind: removed + ? frb.CloudSyncTransientAssociationKind.reactionRemove + : frb.CloudSyncTransientAssociationKind.reactionAdd, + reactionKind: reactionKind, + reactionRemoved: removed, + reactionParentLogicalKeyHash: _messageHash, + reactionParentCanonicalGuid: 'message-guid', + reactionParentPart: 0, + associatedRangeLocation: associatedRangeLocation, + associatedRangeLength: associatedRangeLength, + readAtMillisState: readAtMillisState, + readAtMillis: readAtMillis, + deliveredAtMillisState: deliveredAtMillisState, + deliveredAtMillis: deliveredAtMillis, + associatedEmojiState: emoji == null + ? frb.CloudSyncTransientFieldState.absent + : frb.CloudSyncTransientFieldState.value, + associatedEmoji: emoji, + ), + ), +); + +frb.CloudSyncTransientSnapshot _snapshot() => + _snapshotFor(frb.CloudSyncTransientEntityKind.message, _messageHash); + +frb.CloudSyncTransientSnapshot _snapshotFor( + frb.CloudSyncTransientEntityKind kind, + String logicalEntityKeyHash, { + String sourceReference = _sourceReference, + List editParts = const [], +}) => frb.CloudSyncTransientSnapshot( + entityKind: kind, + logicalEntityKeyHash: logicalEntityKeyHash, + parentLogicalKeyHash: _chatHash, + immutableContentDigest: _payloadSha, + createdAtMillis: 1787385600000, + editParts: editParts, + etagHash: 'EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE', + protectedSourceReference: sourceReference, +); + +frb.CloudSyncTransientMessagePayload _messagePayload({ + String logicalEntityKeyHash = _messageHash, + String canonicalGuid = 'message-guid', + int createdAtMillis = 1787385600000, + int error = 0, + frb.CloudSyncTransientFieldState subjectState = + frb.CloudSyncTransientFieldState.absent, + String? subject, + frb.CloudSyncTransientFieldState bodyState = + frb.CloudSyncTransientFieldState.value, + String? body = 'transient secret body', + frb.CloudSyncTransientFieldState attributedBodiesState = + frb.CloudSyncTransientFieldState.absent, + List attributedBodies = const [], + frb.CloudSyncTransientFieldState balloonBundleIdState = + frb.CloudSyncTransientFieldState.absent, + String? balloonBundleId, + frb.CloudSyncTransientFieldState effectState = + frb.CloudSyncTransientFieldState.absent, + String? effect, + frb.CloudSyncTransientFieldState readAtMillisState = + frb.CloudSyncTransientFieldState.absent, + int? readAtMillis, + frb.CloudSyncTransientFieldState deliveredAtMillisState = + frb.CloudSyncTransientFieldState.absent, + int? deliveredAtMillis, + frb.CloudSyncTransientKnownMessageFlags? knownFlags, + frb.CloudSyncTransientAssociationKind associationKind = + frb.CloudSyncTransientAssociationKind.none, + frb.CloudSyncTransientReactionKind? reactionKind, + bool reactionRemoved = false, + String? reactionParentLogicalKeyHash, + String? reactionParentCanonicalGuid, + int? reactionParentPart, + int? associatedRangeLocation, + int? associatedRangeLength, + String? replyParentLogicalKeyHash, + String? replyParentCanonicalGuid, + String? replyParentPart, + frb.CloudSyncTransientFieldState editsState = + frb.CloudSyncTransientFieldState.absent, + List edits = const [], + frb.CloudSyncTransientFieldState retractedPartsState = + frb.CloudSyncTransientFieldState.absent, + List retractedParts = const [], + frb.CloudSyncTransientFieldState associatedEmojiState = + frb.CloudSyncTransientFieldState.absent, + String? associatedEmoji, +}) => frb.CloudSyncTransientMessagePayload( + logicalEntityKeyHash: logicalEntityKeyHash, + canonicalGuid: canonicalGuid, + chatAliasKeyHash: _chatHash, + chatIdentifier: 'iMessage;-;chat', + senderHandle: 'sender@example.invalid', + createdAtMillis: createdAtMillis, + error: error, + service: frb.CloudSyncTransientService.iMessage, + subjectState: subjectState, + subject: subject, + bodyState: bodyState, + body: body, + attributedBodiesState: attributedBodiesState, + attributedBodies: attributedBodies, + balloonBundleIdState: balloonBundleIdState, + balloonBundleId: balloonBundleId, + effectState: effectState, + effect: effect, + readAtMillisState: readAtMillisState, + readAtMillis: readAtMillis, + deliveredAtMillisState: deliveredAtMillisState, + deliveredAtMillis: deliveredAtMillis, + knownFlags: knownFlags ?? _neutralFlags, + associationKind: associationKind, + reactionKind: reactionKind, + reactionRemoved: reactionRemoved, + reactionParentLogicalKeyHash: reactionParentLogicalKeyHash, + reactionParentCanonicalGuid: reactionParentCanonicalGuid, + reactionParentPart: reactionParentPart, + associatedRangeLocation: associatedRangeLocation, + associatedRangeLength: associatedRangeLength, + replyParentLogicalKeyHash: replyParentLogicalKeyHash, + replyParentCanonicalGuid: replyParentCanonicalGuid, + replyParentPart: replyParentPart, + editsState: editsState, + edits: edits, + retractedPartsState: retractedPartsState, + retractedParts: Uint32List.fromList(retractedParts), + associatedEmojiState: associatedEmojiState, + associatedEmoji: associatedEmoji, +); + +frb.CloudSyncTransientChatPayload _chatPayload({ + List participantHandles = const [], + frb.CloudSyncTransientFieldState displayNameState = + frb.CloudSyncTransientFieldState.absent, + String? displayName, + frb.CloudSyncTransientFieldState lastAddressedHandleState = + frb.CloudSyncTransientFieldState.absent, + String? lastAddressedHandle, + frb.CloudSyncTransientFieldState groupVersionState = + frb.CloudSyncTransientFieldState.absent, + int? groupVersion, + frb.CloudSyncTransientFieldState lastSeenMessageGuidState = + frb.CloudSyncTransientFieldState.absent, + String? lastSeenMessageGuid, + frb.CloudSyncTransientFieldState groupPhotoGuidState = + frb.CloudSyncTransientFieldState.absent, + String? groupPhotoGuid, +}) => frb.CloudSyncTransientChatPayload( + logicalEntityKeyHash: _chatHash, + canonicalGuid: 'chat-guid', + chatIdentifier: 'iMessage;-;chat', + groupId: 'group-id', + originalGroupId: 'original-group-id', + service: frb.CloudSyncTransientService.iMessage, + style: frb.CloudSyncTransientChatStyle.direct, + participantHandles: participantHandles, + displayNameState: displayNameState, + displayName: displayName, + lastAddressedHandleState: lastAddressedHandleState, + lastAddressedHandle: lastAddressedHandle, + groupVersionState: groupVersionState, + groupVersion: groupVersion, + lastSeenMessageGuidState: lastSeenMessageGuidState, + lastSeenMessageGuid: lastSeenMessageGuid, + groupPhotoGuidState: groupPhotoGuidState, + groupPhotoGuid: groupPhotoGuid, +); + +frb.CloudSyncTransientAttachmentPayload _attachmentPayload({ + String? ownerLogicalKeyHash = _messageHash, + String? ownerCanonicalGuid = 'message-guid', + int? ownerPart = 0, + frb.CloudSyncTransientFieldState utiState = + frb.CloudSyncTransientFieldState.absent, + String? uti, + frb.CloudSyncTransientFieldState fileNameState = + frb.CloudSyncTransientFieldState.value, + String? fileName = 'document.pdf', + frb.CloudSyncTransientFieldState mimeTypeState = + frb.CloudSyncTransientFieldState.absent, + String? mimeType, + frb.CloudSyncTransientFieldState totalBytesState = + frb.CloudSyncTransientFieldState.absent, + BigInt? totalBytes, + frb.CloudSyncTransientFieldState isOutgoingState = + frb.CloudSyncTransientFieldState.absent, + bool? isOutgoing, + frb.CloudSyncTransientFieldState protectedLocalReferenceState = + frb.CloudSyncTransientFieldState.value, + String? protectedLocalReference = _attachmentReference, +}) => frb.CloudSyncTransientAttachmentPayload( + logicalEntityKeyHash: _attachmentHash, + canonicalGuid: 'attachment-guid', + ownerLogicalKeyHash: ownerLogicalKeyHash, + ownerCanonicalGuid: ownerCanonicalGuid, + ownerPart: ownerPart, + utiState: utiState, + uti: uti, + fileNameState: fileNameState, + fileName: fileName, + mimeTypeState: mimeTypeState, + mimeType: mimeType, + totalBytesState: totalBytesState, + totalBytes: totalBytes, + isOutgoingState: isOutgoingState, + isOutgoing: isOutgoing, + protectedLocalReferenceState: protectedLocalReferenceState, + protectedLocalReference: protectedLocalReference, +); + +const _neutralFlags = frb.CloudSyncTransientKnownMessageFlags( + fromMe: false, + delivered: false, + read: false, + hasDataDetectorResults: false, + deliveredQuietly: false, + didNotifyRecipient: false, +); + +CloudSemanticFieldState _chatFieldState( + frb.CloudSyncTransientFieldState value, +) => switch (value) { + frb.CloudSyncTransientFieldState.absent => CloudSemanticFieldState.absent, + frb.CloudSyncTransientFieldState.value => CloudSemanticFieldState.value, + frb.CloudSyncTransientFieldState.explicitClear => + CloudSemanticFieldState.explicitClear, +}; + +Future _expectFailure( + Future future, + CloudFailureCategory category, +) => expectLater( + future, + throwsA( + isA().having( + (failure) => failure.category, + 'category', + category, + ), + ), +); + +final class _Bindings implements RustCloudSemanticDecodeBindings { + final requests = []; + late frb.CloudSyncTransientDecodeResult result; + void Function()? afterDecode; + + @override + Future decode( + RustCloudSemanticDecodeRequest request, + ) async { + requests.add(request); + afterDecode?.call(); + return result; + } +} + +final class _TombstoneResolver implements CloudTombstoneIdentityResolver { + const _TombstoneResolver(this.value); + + final CloudTombstoneIdentity? value; + + @override + Future resolve(CloudInboxEntry entry) async => value; +} diff --git a/test/services/cloud_sync/rust_cloud_sync_transport_test.dart b/test/services/cloud_sync/rust_cloud_sync_transport_test.dart new file mode 100644 index 0000000000..6dfe29e6d5 --- /dev/null +++ b/test/services/cloud_sync/rust_cloud_sync_transport_test.dart @@ -0,0 +1,485 @@ +import 'dart:convert'; +import 'dart:typed_data'; + +import 'package:bluebubbles/services/rustpush/cloud_sync/cloud_sync_models.dart'; +import 'package:bluebubbles/services/rustpush/cloud_sync/cloud_sync_protector.dart'; +import 'package:bluebubbles/services/rustpush/cloud_sync/rust_cloud_sync_transport.dart'; +import 'package:flutter_test/flutter_test.dart'; + +import 'cloud_sync_test_helpers.dart'; + +void main() { + late CloudSyncScope scope; + late _FakeBindings bindings; + late _FakeProtector protector; + late RustCloudSyncTransport transport; + + setUp(() { + scope = CloudSyncScope( + accountFingerprint: testAccountFingerprintA, + container: 'com.apple.messages.cloud', + database: 'private', + zone: 'messageManateeZone', + ); + bindings = _FakeBindings(); + protector = _FakeProtector(); + transport = RustCloudSyncTransport( + cloudMessagesClient: Object(), + protector: protector, + bindings: bindings, + ); + }); + + test( + 'maps and protects one ordered raw page without exposing identifiers', + () async { + bindings.result = RustCloudSyncRawFetchResult( + page: RustCloudSyncRawPage( + changes: [ + RustCloudSyncRawChange( + kind: RustCloudSyncRawRecordKind.encryptedUpsert, + recordName: 'server-record-secret', + recordType: 'Message', + changeType: 1, + systemFields: const RustCloudSyncRawSystemFields( + etag: 'etag-secret', + modifiedAt: 123, + ), + encryptedRecord: Uint8List.fromList([1, 2, 3, 4]), + ), + ], + nextToken: Uint8List.fromList([5, 6, 7]), + status: 3, + complete: true, + ), + ); + + final batch = await transport.fetchChanges( + scope, + previousToken: base64UrlEncode([9]).replaceAll('=', ''), + generation: 7, + limit: 999, + ); + + expect(bindings.stream, 'messages'); + expect(bindings.maximumChanges, 200); + expect(bindings.continuationToken, [9]); + expect(batch.generation, 7); + expect(batch.hasMore, isFalse); + expect(batch.nextToken, 'BQYH'); + expect(batch.changes, hasLength(1)); + final change = batch.changes.single; + expect(change.recordIdHash, isNot(contains('server-record-secret'))); + expect(change.etagHash, isNot(contains('etag-secret'))); + expect( + change.encryptedPayloadReference, + startsWith('protected:rawRecord:'), + ); + expect(change.preflightFailure, isNull); + expect(protector.plaintexts.single, contains('server-record-secret')); + expect(protector.plaintexts.single, contains('AQIDBA==')); + }, + ); + + test('unsupported records are preserved but preflight-quarantined', () async { + bindings.result = RustCloudSyncRawFetchResult( + page: RustCloudSyncRawPage( + changes: [ + RustCloudSyncRawChange( + kind: RustCloudSyncRawRecordKind.unsupportedRecordType, + recordName: 'unknown-record', + recordType: 'FutureAppleType', + encryptedRecord: Uint8List.fromList([8, 9]), + ), + ], + status: 3, + complete: true, + ), + ); + + final batch = await transport.fetchChanges( + scope, + previousToken: null, + generation: 1, + limit: 10, + ); + + expect( + batch.changes.single.preflightFailure, + CloudFailureCategory.malformedRecord, + ); + expect(batch.changes.single.encryptedPayloadReference, isNotNull); + }); + + test('accepts a raw page under the configured byte limit', () async { + transport = RustCloudSyncTransport( + cloudMessagesClient: Object(), + protector: protector, + bindings: bindings, + // 64 page + 2 * 128 changes + 5 opaque bytes = 325. + maximumRawPageBytes: 326, + ); + bindings.result = RustCloudSyncRawFetchResult( + page: RustCloudSyncRawPage( + changes: [ + RustCloudSyncRawChange( + kind: RustCloudSyncRawRecordKind.encryptedUpsert, + encryptedRecord: Uint8List.fromList([1, 2]), + ), + RustCloudSyncRawChange( + kind: RustCloudSyncRawRecordKind.tombstone, + tombstonePayload: Uint8List.fromList([3, 4]), + ), + ], + nextToken: Uint8List.fromList([5]), + status: 3, + complete: true, + ), + ); + + final batch = await transport.fetchChanges( + scope, + previousToken: null, + generation: 1, + limit: 10, + ); + + expect(batch.changes, hasLength(2)); + expect(protector.plaintexts, hasLength(2)); + }); + + test('accepts a raw page exactly at the configured byte limit', () async { + transport = RustCloudSyncTransport( + cloudMessagesClient: Object(), + protector: protector, + bindings: bindings, + // 64 page + 2 * 128 changes + 5 opaque bytes = 325. + maximumRawPageBytes: 325, + ); + bindings.result = RustCloudSyncRawFetchResult( + page: RustCloudSyncRawPage( + changes: [ + RustCloudSyncRawChange( + kind: RustCloudSyncRawRecordKind.encryptedUpsert, + encryptedRecord: Uint8List.fromList([1, 2]), + ), + RustCloudSyncRawChange( + kind: RustCloudSyncRawRecordKind.tombstone, + tombstonePayload: Uint8List.fromList([3, 4]), + ), + ], + nextToken: Uint8List.fromList([5]), + status: 3, + complete: true, + ), + ); + + final batch = await transport.fetchChanges( + scope, + previousToken: null, + generation: 1, + limit: 10, + ); + + expect(batch.changes, hasLength(2)); + expect(protector.plaintexts, hasLength(2)); + }); + + test('rejects a raw page over the configured byte limit', () async { + transport = RustCloudSyncTransport( + cloudMessagesClient: Object(), + protector: protector, + bindings: bindings, + // 64 page + 128 change + 4 opaque bytes = 196. + maximumRawPageBytes: 195, + ); + bindings.result = RustCloudSyncRawFetchResult( + page: RustCloudSyncRawPage( + changes: [ + RustCloudSyncRawChange( + kind: RustCloudSyncRawRecordKind.encryptedUpsert, + encryptedRecord: Uint8List.fromList([1, 2, 3, 4]), + ), + ], + status: 3, + complete: true, + ), + ); + + await expectLater( + () => transport.fetchChanges( + scope, + previousToken: null, + generation: 1, + limit: 10, + ), + throwsA( + isA().having( + (failure) => failure.safeCode, + 'safeCode', + 'oversized_raw_page', + ), + ), + ); + expect(protector.plaintexts, isEmpty); + }); + + test('rejects an oversized page before any partial protection', () async { + transport = RustCloudSyncTransport( + cloudMessagesClient: Object(), + protector: protector, + bindings: bindings, + // 64 page + 2 * 128 changes + 5 opaque bytes = 325. + maximumRawPageBytes: 324, + ); + bindings.result = RustCloudSyncRawFetchResult( + page: RustCloudSyncRawPage( + changes: [ + RustCloudSyncRawChange( + kind: RustCloudSyncRawRecordKind.encryptedUpsert, + encryptedRecord: Uint8List.fromList([1, 2, 3]), + ), + RustCloudSyncRawChange( + kind: RustCloudSyncRawRecordKind.encryptedUpsert, + encryptedRecord: Uint8List.fromList([4, 5]), + ), + ], + status: 3, + complete: true, + ), + ); + + await expectLater( + () => transport.fetchChanges( + scope, + previousToken: null, + generation: 1, + limit: 10, + ), + throwsA( + isA().having( + (failure) => failure.safeCode, + 'safeCode', + 'oversized_raw_page', + ), + ), + ); + + // No CloudFetchBatch is returned for the engine to persist, and even the + // first individually valid record never reaches the protector. + expect(protector.plaintexts, isEmpty); + }); + + test('rejects a page whose UTF-8 metadata alone exceeds the limit', () async { + transport = RustCloudSyncTransport( + cloudMessagesClient: Object(), + protector: protector, + bindings: bindings, + // 64 page + 128 change + 64 system + UTF-8 metadata (3 + 7 + 2) + // = 268 bytes, without any encrypted record or tombstone payload. + maximumRawPageBytes: 267, + ); + bindings.result = const RustCloudSyncRawFetchResult( + page: RustCloudSyncRawPage( + changes: [ + RustCloudSyncRawChange( + kind: RustCloudSyncRawRecordKind.encryptedUpsert, + recordName: '名', + recordType: 'Message', + systemFields: RustCloudSyncRawSystemFields(etag: 'é'), + ), + ], + status: 3, + complete: true, + ), + ); + + await expectLater( + () => transport.fetchChanges( + scope, + previousToken: null, + generation: 1, + limit: 10, + ), + throwsA( + isA().having( + (failure) => failure.safeCode, + 'safeCode', + 'oversized_raw_page', + ), + ), + ); + expect(protector.plaintexts, isEmpty); + }); + + test('rejects a non-positive raw page byte limit', () { + expect( + () => RustCloudSyncTransport( + cloudMessagesClient: Object(), + protector: protector, + bindings: bindings, + maximumRawPageBytes: 0, + ), + throwsArgumentError, + ); + }); + + test('maps typed retry metadata without parsing server text', () async { + bindings.result = const RustCloudSyncRawFetchResult( + failure: RustCloudSyncRawFailure( + category: RustCloudSyncRawFailureCategory.throttled, + safeCode: 'cloudkit-throttled', + retryAfterSeconds: 901, + ), + ); + + await expectLater( + () => transport.fetchChanges( + scope, + previousToken: null, + generation: 1, + limit: 10, + ), + throwsA( + isA() + .having( + (failure) => failure.category, + 'category', + CloudFailureCategory.throttled, + ) + .having( + (failure) => failure.retryAfter, + 'retryAfter', + const Duration(seconds: 901), + ) + .having( + (failure) => failure.safeCode, + 'safeCode', + 'cloudkit-throttled', + ), + ), + ); + }); + + test('rejects malformed result envelopes and unsupported zones', () async { + bindings.result = const RustCloudSyncRawFetchResult(); + await expectLater( + () => transport.fetchChanges( + scope, + previousToken: null, + generation: 1, + limit: 10, + ), + throwsA( + isA().having( + (failure) => failure.safeCode, + 'safeCode', + 'invalid_transport_envelope', + ), + ), + ); + + final unsupported = CloudSyncScope( + accountFingerprint: scope.accountFingerprint, + container: scope.container, + database: scope.database, + zone: 'futureZone', + ); + await expectLater( + () => transport.fetchChanges( + unsupported, + previousToken: null, + generation: 1, + limit: 10, + ), + throwsA( + isA().having( + (failure) => failure.safeCode, + 'safeCode', + 'unsupported_cloud_zone', + ), + ), + ); + }); + + test('accepts the expanded raw-zone allowlist without remapping', () async { + bindings.result = const RustCloudSyncRawFetchResult( + page: RustCloudSyncRawPage( + changes: [], + nextToken: null, + status: 3, + complete: true, + ), + ); + final cases = <(String zone, String stream)>[ + ('chatManateeZone', 'chats'), + ('messageManateeZone', 'messages'), + ('attachmentManateeZone', 'attachments'), + ('messageUpdateZone', 'messageUpdateZone'), + ('recoverableMessageDeleteZone', 'recoverableMessageDeleteZone'), + ('scheduledMessageZone', 'scheduledMessageZone'), + ('chat1ManateeZone', 'chat1ManateeZone'), + ]; + + for (final (zone, stream) in cases) { + final batch = await transport.fetchChanges( + CloudSyncScope( + accountFingerprint: testAccountFingerprintA, + container: 'com.apple.messages.cloud', + database: 'private', + zone: zone, + ), + previousToken: null, + generation: 1, + limit: 10, + ); + expect(batch.changes, isEmpty); + expect(bindings.stream, stream); + } + }); +} + +final class _FakeBindings implements RustCloudSyncTransportBindings { + RustCloudSyncRawFetchResult result = const RustCloudSyncRawFetchResult(); + String? stream; + Uint8List? continuationToken; + int? maximumChanges; + + @override + Future fetchRawPage({ + required Object cloudMessagesClient, + required String stream, + required Uint8List? continuationToken, + required int maximumChanges, + }) async { + this.stream = stream; + this.continuationToken = continuationToken; + this.maximumChanges = maximumChanges; + return result; + } +} + +final class _FakeProtector implements CloudSyncProtector { + final List plaintexts = []; + + @override + Future fingerprintAccount(String rawAccountIdentifier) async => + 'fingerprint'; + + @override + Future protect({ + required CloudSyncScope scope, + required CloudSyncProtectedValueKind kind, + required String plaintext, + }) async { + plaintexts.add(plaintext); + return 'protected:${kind.name}:${plaintext.length}'; + } + + @override + Future unprotect({ + required CloudSyncScope scope, + required CloudSyncProtectedValueKind kind, + required String ciphertext, + }) async => throw UnimplementedError(); +} diff --git a/test/services/cloud_sync/shadow_only_cloud_sync_store_test.dart b/test/services/cloud_sync/shadow_only_cloud_sync_store_test.dart new file mode 100644 index 0000000000..fa2791c4cc --- /dev/null +++ b/test/services/cloud_sync/shadow_only_cloud_sync_store_test.dart @@ -0,0 +1,124 @@ +import 'package:bluebubbles/services/rustpush/cloud_sync/cloud_shadow_journal_budget.dart'; +import 'package:bluebubbles/services/rustpush/cloud_sync/cloud_sync_models.dart'; +import 'package:bluebubbles/services/rustpush/cloud_sync/cloud_sync_store.dart'; +import 'package:bluebubbles/services/rustpush/cloud_sync/in_memory_cloud_sync_store.dart'; +import 'package:bluebubbles/services/rustpush/cloud_sync/shadow_only_cloud_sync_store.dart'; +import 'package:flutter_test/flutter_test.dart'; + +import 'cloud_sync_test_helpers.dart'; + +void main() { + final scope = testScope(); + final now = DateTime.utc(2026, 8, 1); + + test('delegates only shadow journal and checkpoint capabilities', () async { + final delegate = InMemoryCloudSyncStore(); + final store = ShadowOnlyCloudSyncStore(delegate); + final fence = await store.tryAcquireCoordinatorLease( + scope, + ownerId: 'shadow-owner', + now: now, + leaseDuration: const Duration(minutes: 5), + ); + expect(fence, isNotNull); + + final batch = CloudFetchBatch( + scope: scope, + changes: [testChange(1)], + batchId: 'shadow-batch-1', + generation: 1, + nextToken: 'token-1', + hasMore: false, + ); + final admission = await store.journalShadowFetchedBatch( + batch, + now: now, + budget: CloudShadowJournalBudget(), + leaseFence: fence!, + expectedGeneration: 1, + expectedFetchedToken: null, + ); + + expect(admission.insertedEntries, 1); + expect((await store.readCheckpoint(scope)).fetchedToken, 'token-1'); + await store.releaseCoordinatorLease(scope, leaseFence: fence); + }); + + test( + 'blocks the general journal even when the delegate supports it', + () async { + final store = ShadowOnlyCloudSyncStore(InMemoryCloudSyncStore()); + + await expectLater( + store.journalFetchedBatch( + CloudFetchBatch( + scope: scope, + changes: [testChange(1)], + batchId: 'general-batch-1', + generation: 1, + nextToken: 'token-1', + hasMore: false, + ), + now: now, + leaseFence: const CloudCoordinatorLeaseFence( + ownerId: 'blocked-owner', + generation: 1, + ), + expectedGeneration: 1, + expectedFetchedToken: null, + ), + throwsA(isA()), + ); + }, + ); + + test('blocks semantic inbox and record-map capabilities', () async { + final store = ShadowOnlyCloudSyncStore(InMemoryCloudSyncStore()); + + await expectLater( + store.readEligibleInbox(scope, now: now, limit: 1), + throwsA(isA()), + ); + await expectLater( + store.markInboxApplied( + scope, + sequence: 1, + now: now, + leaseFence: const CloudCoordinatorLeaseFence( + ownerId: 'blocked-owner', + generation: 1, + ), + ), + throwsA(isA()), + ); + await expectLater( + store.readRecordMap(scope, logicalEntityKeyHash: 'entity', generation: 1), + throwsA(isA()), + ); + }); + + test('blocks every outbox entry point', () async { + final store = ShadowOnlyCloudSyncStore(InMemoryCloudSyncStore()); + final operation = testOutboxOperation(scope, 1); + + await expectLater( + store.enqueueOutbox(operation), + throwsA(isA()), + ); + await expectLater( + store.leaseEligibleOutbox( + scope, + now: now, + limit: 1, + leaseId: 'lease', + leaseDuration: const Duration(minutes: 1), + allowedActions: const {CloudOutboxAction.save}, + ), + throwsA(isA()), + ); + await expectLater( + store.recoverExpiredOutboxLeases(scope, now: now), + throwsA(isA()), + ); + }); +} diff --git a/test/services/cloud_sync/transient_cloud_canonical_identity_registry_test.dart b/test/services/cloud_sync/transient_cloud_canonical_identity_registry_test.dart new file mode 100644 index 0000000000..86a98cc324 --- /dev/null +++ b/test/services/cloud_sync/transient_cloud_canonical_identity_registry_test.dart @@ -0,0 +1,433 @@ +import 'package:bluebubbles/services/rustpush/cloud_sync/cloud_inbox_applier.dart'; +import 'package:bluebubbles/services/rustpush/cloud_sync/cloud_merge_policy.dart'; +import 'package:bluebubbles/services/rustpush/cloud_sync/cloud_sync_models.dart'; +import 'package:bluebubbles/services/rustpush/cloud_sync/transient_cloud_canonical_identity_registry.dart'; +import 'package:flutter_test/flutter_test.dart'; + +final _scopeA = _makeScope(); +final _scopeB = _makeScope(zone: 'zone-b'); + +CloudSyncScope _makeScope({String zone = 'zone-a'}) { + return CloudSyncScope( + accountFingerprint: List.filled(43, 'a').join(), + container: 'com.apple.messages.cloud', + database: 'private', + zone: zone, + ); +} + +CloudSemanticSnapshot _snapshot(CloudSemanticEntityPayload payload) { + return CloudSemanticSnapshot( + kind: payload.kind, + logicalEntityKeyHash: payload.logicalEntityKeyHash, + ); +} + +CloudDecodedMutation _upsert( + CloudSemanticEntityPayload payload, { + CloudSyncScope? scope, + int generation = 7, +}) { + return CloudDecodedMutation.upsert( + scope: scope ?? _scopeA, + generation: generation, + changeId: 'change-${payload.logicalEntityKeyHash}', + snapshot: _snapshot(payload), + payload: payload, + ); +} + +CloudMessageEntityPayload _message({ + String logicalKey = 'message-key', + String canonicalGuid = 'message-guid', + String? replyKey = 'reply-key', + String? replyGuid = 'reply-guid', + String? associationKey, + String? associationGuid, +}) { + return CloudMessageEntityPayload( + logicalEntityKeyHash: logicalKey, + canonicalGuid: canonicalGuid, + chatAliasKeyHash: 'chat-key', + chatIdentifier: 'iMessage;-;chat', + body: 'message body', + senderHandle: 'sender@example.invalid', + replyParentLogicalKeyHash: replyKey, + replyParentCanonicalGuid: replyGuid, + replyParentPart: replyKey == null ? null : '0', + associationKind: associationKey == null + ? CloudSemanticAssociationKind.none + : CloudSemanticAssociationKind.reactionAdd, + associationParentLogicalKeyHash: associationKey, + associationParentCanonicalGuid: associationGuid, + associationParentPart: associationKey == null ? null : 0, + associatedRangeLocation: associationKey == null ? null : 0, + associatedRangeLength: associationKey == null ? null : 5, + ); +} + +CloudReactionEntityPayload _reaction() { + return CloudReactionEntityPayload( + logicalEntityKeyHash: 'reaction-key', + canonicalGuid: 'reaction-guid', + parentLogicalKeyHash: 'parent-message-key', + parentCanonicalGuid: 'parent-message-guid', + parentPart: 0, + senderHandle: 'sender@example.invalid', + reactionType: 'like', + ); +} + +CloudAttachmentEntityPayload _ownedAttachment() { + return CloudAttachmentEntityPayload( + logicalEntityKeyHash: 'attachment-key', + canonicalGuid: 'attachment-guid', + ownerLogicalKeyHash: 'owner-message-key', + ownerCanonicalGuid: 'owner-message-guid', + ownerPart: 0, + fileName: 'photo.jpg', + mimeType: 'image/jpeg', + protectedLocalReference: 'protected:attachment', + ); +} + +CloudChatEntityPayload _chat() { + return CloudChatEntityPayload( + logicalEntityKeyHash: 'chat-key', + canonicalGuid: 'chat-guid', + chatIdentifier: 'iMessage;-;chat', + displayName: 'Test chat', + participantHandles: const ['participant@example.invalid'], + ); +} + +void main() { + test('binds message, reply, and association parent identities', () { + final registry = TransientCloudCanonicalIdentityRegistry(); + final lease = registry.bind( + _upsert( + _message( + associationKey: 'associated-message-key', + associationGuid: 'associated-message-guid', + ), + ), + ); + + expect( + registry.resolveCanonicalGuid( + scope: _scopeA, + generation: 7, + kind: CloudEntityKind.message, + logicalEntityKeyHash: 'message-key', + ), + 'message-guid', + ); + expect( + registry.resolveCanonicalGuid( + scope: _scopeA, + generation: 7, + kind: CloudEntityKind.message, + logicalEntityKeyHash: 'reply-key', + ), + 'reply-guid', + ); + expect( + registry.resolveCanonicalGuid( + scope: _scopeA, + generation: 7, + kind: CloudEntityKind.message, + logicalEntityKeyHash: 'associated-message-key', + ), + 'associated-message-guid', + ); + + lease.release(); + expect( + registry.resolveCanonicalGuid( + scope: _scopeA, + generation: 7, + kind: CloudEntityKind.message, + logicalEntityKeyHash: 'message-key', + ), + isNull, + ); + expect( + registry.resolveCanonicalGuid( + scope: _scopeA, + generation: 7, + kind: CloudEntityKind.message, + logicalEntityKeyHash: 'reply-key', + ), + isNull, + ); + expect( + registry.resolveCanonicalGuid( + scope: _scopeA, + generation: 7, + kind: CloudEntityKind.message, + logicalEntityKeyHash: 'associated-message-key', + ), + isNull, + ); + }); + + test('binds reaction and its parent message identity', () { + final registry = TransientCloudCanonicalIdentityRegistry(); + final lease = registry.bind(_upsert(_reaction())); + + expect( + registry.resolveCanonicalGuid( + scope: _scopeA, + generation: 7, + kind: CloudEntityKind.reaction, + logicalEntityKeyHash: 'reaction-key', + ), + 'reaction-guid', + ); + expect( + registry.resolveCanonicalGuid( + scope: _scopeA, + generation: 7, + kind: CloudEntityKind.message, + logicalEntityKeyHash: 'parent-message-key', + ), + 'parent-message-guid', + ); + + lease.release(); + expect( + registry.resolveCanonicalGuid( + scope: _scopeA, + generation: 7, + kind: CloudEntityKind.reaction, + logicalEntityKeyHash: 'reaction-key', + ), + isNull, + ); + expect( + registry.resolveCanonicalGuid( + scope: _scopeA, + generation: 7, + kind: CloudEntityKind.message, + logicalEntityKeyHash: 'parent-message-key', + ), + isNull, + ); + }); + + test('binds an owned attachment and its owner message identity', () { + final registry = TransientCloudCanonicalIdentityRegistry(); + final lease = registry.bind(_upsert(_ownedAttachment())); + + expect( + registry.resolveCanonicalGuid( + scope: _scopeA, + generation: 7, + kind: CloudEntityKind.attachment, + logicalEntityKeyHash: 'attachment-key', + ), + 'attachment-guid', + ); + expect( + registry.resolveCanonicalGuid( + scope: _scopeA, + generation: 7, + kind: CloudEntityKind.message, + logicalEntityKeyHash: 'owner-message-key', + ), + 'owner-message-guid', + ); + + lease.release(); + expect( + registry.resolveCanonicalGuid( + scope: _scopeA, + generation: 7, + kind: CloudEntityKind.attachment, + logicalEntityKeyHash: 'attachment-key', + ), + isNull, + ); + expect( + registry.resolveCanonicalGuid( + scope: _scopeA, + generation: 7, + kind: CloudEntityKind.message, + logicalEntityKeyHash: 'owner-message-key', + ), + isNull, + ); + }); + + test('binds a chat identity', () { + final registry = TransientCloudCanonicalIdentityRegistry(); + final lease = registry.bind(_upsert(_chat())); + + expect( + registry.resolveCanonicalGuid( + scope: _scopeA, + generation: 7, + kind: CloudEntityKind.chat, + logicalEntityKeyHash: 'chat-key', + ), + 'chat-guid', + ); + + lease.release(); + expect( + registry.resolveCanonicalGuid( + scope: _scopeA, + generation: 7, + kind: CloudEntityKind.chat, + logicalEntityKeyHash: 'chat-key', + ), + isNull, + ); + }); + + test('fences every lookup by exact scope, generation, kind, and hash', () { + final registry = TransientCloudCanonicalIdentityRegistry(); + final lease = registry.bind(_upsert(_reaction())); + + String? resolve({ + CloudSyncScope? scope, + int generation = 7, + CloudEntityKind kind = CloudEntityKind.reaction, + String hash = 'reaction-key', + }) { + return registry.resolveCanonicalGuid( + scope: scope ?? _scopeA, + generation: generation, + kind: kind, + logicalEntityKeyHash: hash, + ); + } + + expect(resolve(), 'reaction-guid'); + expect(resolve(scope: _scopeB), isNull); + expect(resolve(generation: 8), isNull); + expect(resolve(kind: CloudEntityKind.message), isNull); + expect(resolve(hash: 'parent-message-key'), isNull); + expect( + registry.resolveCanonicalGuid( + scope: _scopeA, + generation: 7, + kind: CloudEntityKind.message, + logicalEntityKeyHash: 'parent-message-key', + ), + 'parent-message-guid', + ); + + lease.release(); + }); + + test('release clears every mapping and is idempotent', () { + final registry = TransientCloudCanonicalIdentityRegistry(); + final lease = registry.bind( + _upsert( + _message( + associationKey: 'associated-message-key', + associationGuid: 'associated-message-guid', + ), + ), + ); + + expect(registry.hasActiveLease, isTrue); + lease.release(); + lease.release(); + + expect(registry.hasActiveLease, isFalse); + for (final entry in const [ + (CloudEntityKind.message, 'message-key'), + (CloudEntityKind.message, 'reply-key'), + (CloudEntityKind.message, 'associated-message-key'), + ]) { + expect( + registry.resolveCanonicalGuid( + scope: _scopeA, + generation: 7, + kind: entry.$1, + logicalEntityKeyHash: entry.$2, + ), + isNull, + ); + } + }); + + test('overlapping bind fails closed and preserves the active lease', () { + final registry = TransientCloudCanonicalIdentityRegistry(); + final firstLease = registry.bind(_upsert(_message())); + + expect(() => registry.bind(_upsert(_chat())), throwsA(isA())); + expect(registry.hasActiveLease, isTrue); + expect( + registry.resolveCanonicalGuid( + scope: _scopeA, + generation: 7, + kind: CloudEntityKind.message, + logicalEntityKeyHash: 'message-key', + ), + 'message-guid', + ); + + firstLease.release(); + final secondLease = registry.bind(_upsert(_chat())); + expect(registry.hasActiveLease, isTrue); + secondLease.release(); + }); + + test('unsupported profile and tombstone leave no active state', () { + final registry = TransientCloudCanonicalIdentityRegistry(); + final profile = CloudProfileEntityPayload( + logicalEntityKeyHash: 'profile-key', + displayName: 'Profile', + handle: 'profile@example.invalid', + ); + + expect(() => registry.bind(_upsert(profile)), throwsA(isA())); + expect(registry.hasActiveLease, isFalse); + + final tombstone = CloudDecodedMutation.tombstone( + scope: _scopeA, + generation: 7, + changeId: 'tombstone-change', + tombstone: CloudSemanticTombstone( + kind: CloudEntityKind.message, + logicalEntityKeyHash: 'deleted-message-key', + deletedAt: DateTime.utc(2026, 8, 22), + serverConfirmed: true, + ), + ); + expect(() => registry.bind(tombstone), throwsA(isA())); + expect(registry.hasActiveLease, isFalse); + + final lease = registry.bind(_upsert(_chat())); + expect(registry.hasActiveLease, isTrue); + lease.release(); + }); + + test('conflicting duplicate logical mapping leaves no active state', () { + final registry = TransientCloudCanonicalIdentityRegistry(); + final conflicting = _message( + logicalKey: 'same-logical-key', + canonicalGuid: 'own-guid', + replyKey: 'same-logical-key', + replyGuid: 'different-parent-guid', + ); + + expect( + () => registry.bind(_upsert(conflicting)), + throwsA(isA()), + ); + expect(registry.hasActiveLease, isFalse); + expect( + registry.resolveCanonicalGuid( + scope: _scopeA, + generation: 7, + kind: CloudEntityKind.message, + logicalEntityKeyHash: 'same-logical-key', + ), + isNull, + ); + }); +} diff --git a/test/services/cloud_sync/windows_single_instance_runner_contract_test.dart b/test/services/cloud_sync/windows_single_instance_runner_contract_test.dart new file mode 100644 index 0000000000..212cd42007 --- /dev/null +++ b/test/services/cloud_sync/windows_single_instance_runner_contract_test.dart @@ -0,0 +1,99 @@ +import 'dart:io'; + +import 'package:flutter_test/flutter_test.dart'; + +void main() { + final runnerSource = File( + 'windows/runner/win32_window.cpp', + ).readAsStringSync(); + final runnerHeader = File('windows/runner/win32_window.h').readAsStringSync(); + + test('official runner claims the single-instance mutex atomically', () { + final methodStart = runnerSource.indexOf( + 'bool Win32Window::SendAppLinkToInstance', + ); + expect(methodStart, greaterThanOrEqualTo(0)); + final method = runnerSource.substring(methodStart); + + expect(method, isNot(contains('OpenMutex('))); + + final clearError = method.indexOf('SetLastError(ERROR_SUCCESS)'); + final createMutex = method.indexOf('CreateMutexW('); + final captureError = method.indexOf('GetLastError()', createMutex); + final existingDecision = method.indexOf( + 'create_error != ERROR_ALREADY_EXISTS', + captureError, + ); + final retainHandle = method.indexOf( + 'single_instance_mutex_ = candidate_mutex', + existingDecision, + ); + final secondaryClose = method.indexOf( + 'CloseHandle(candidate_mutex)', + retainHandle, + ); + + expect(clearError, greaterThanOrEqualTo(0)); + expect(createMutex, greaterThan(clearError)); + expect(captureError, greaterThan(createMutex)); + expect(existingDecision, greaterThan(captureError)); + expect(retainHandle, greaterThan(existingDecision)); + expect(secondaryClose, greaterThan(retainHandle)); + }); + + test('mutex is established before window and Flutter initialization', () { + final createStart = runnerSource.indexOf('bool Win32Window::Create('); + final createEnd = runnerSource.indexOf( + 'bool Win32Window::Show()', + createStart, + ); + expect(createStart, greaterThanOrEqualTo(0)); + expect(createEnd, greaterThan(createStart)); + + final createMethod = runnerSource.substring(createStart, createEnd); + final singleInstanceDecision = createMethod.indexOf( + 'SendAppLinkToInstance(title)', + ); + final createWindow = createMethod.indexOf('CreateWindow('); + final flutterInitialization = createMethod.indexOf('return OnCreate()'); + + expect(singleInstanceDecision, greaterThanOrEqualTo(0)); + expect(createWindow, greaterThan(singleInstanceDecision)); + expect(flutterInitialization, greaterThan(createWindow)); + }); + + test('first-instance handle lives until runner destruction', () { + expect(runnerHeader, contains('HANDLE single_instance_mutex_ = nullptr;')); + + final destructorStart = runnerSource.indexOf('Win32Window::~Win32Window()'); + final destructorEnd = runnerSource.indexOf( + 'bool Win32Window::Create(', + destructorStart, + ); + expect(destructorStart, greaterThanOrEqualTo(0)); + expect(destructorEnd, greaterThan(destructorStart)); + final destructor = runnerSource.substring(destructorStart, destructorEnd); + + expect(destructor, contains('CloseHandle(single_instance_mutex_)')); + expect(destructor, contains('single_instance_mutex_ = nullptr')); + }); + + test('secondary launch retains app-link forwarding behavior', () { + final methodStart = runnerSource.indexOf( + 'bool Win32Window::SendAppLinkToInstance', + ); + final method = runnerSource.substring(methodStart); + final secondaryClose = method.indexOf('CloseHandle(candidate_mutex)'); + final windowLookup = method.indexOf( + 'FindExistingInstanceWindow(title)', + secondaryClose, + ); + final sendAppLink = method.indexOf('SendAppLink(hwnd)', windowLookup); + final foreground = method.indexOf('SetForegroundWindow(hwnd)', sendAppLink); + + expect(secondaryClose, greaterThanOrEqualTo(0)); + expect(windowLookup, greaterThan(secondaryClose)); + expect(sendAppLink, greaterThan(windowLookup)); + expect(foreground, greaterThan(sendAppLink)); + }); +} diff --git a/test/services/conversation_media_pager_test.dart b/test/services/conversation_media_pager_test.dart new file mode 100644 index 0000000000..a4e19eaf71 --- /dev/null +++ b/test/services/conversation_media_pager_test.dart @@ -0,0 +1,160 @@ +import 'package:bluebubbles/database/models.dart'; +import 'package:bluebubbles/services/ui/media/conversation_media_pager.dart'; +import 'package:flutter_test/flutter_test.dart'; + +Attachment media( + String guid, + int messageId, + int milliseconds, { + String mimeType = 'image/jpeg', +}) { + final attachment = Attachment( + guid: guid, + mimeType: mimeType, + transferName: '$guid.dat', + totalBytes: 1, + ); + attachment.message.target = Message( + id: messageId, + guid: 'message-$messageId', + dateCreated: DateTime.fromMillisecondsSinceEpoch(milliseconds), + ); + return attachment; +} + +void main() { + late List<({ChatMediaDirection direction, ChatMediaCursor? cursor})> calls; + late Map> responses; + late ConversationMediaPager pager; + + setUp(() { + calls = []; + responses = { + ChatMediaDirection.older: [], + ChatMediaDirection.newer: [], + }; + pager = ConversationMediaPager( + chat: Chat(id: 1, guid: 'chat'), + pageSize: 2, + loader: ({ + required ChatMediaDirection direction, + ChatMediaCursor? cursor, + required int limit, + }) async { + calls.add((direction: direction, cursor: cursor)); + return responses[direction]!.removeAt(0); + }, + ); + }); + + tearDown(() => pager.dispose()); + + test('loads a bounded initial page and exposes its older cursor', () async { + responses[ChatMediaDirection.older]!.add( + ChatMediaPage( + items: [media('new', 20, 2000), media('old', 10, 1000)], + nextCursor: const ChatMediaCursor(dateMilliseconds: 1000, messageId: 10), + hasMore: true, + ), + ); + + await pager.loadInitial(); + + expect(pager.items.map((item) => item.guid), ['new', 'old']); + expect(pager.hasOlder, isTrue); + expect(pager.hasNewer, isFalse); + expect(calls.single.cursor, isNull); + }); + + test('appends older media, prepends newer media, and removes duplicates', () async { + final middle = media('middle', 20, 2000); + pager.seed([middle], hasNewer: true, hasOlder: true); + responses[ChatMediaDirection.older]!.add( + ChatMediaPage( + items: [middle, media('old', 10, 1000)], + nextCursor: const ChatMediaCursor(dateMilliseconds: 1000, messageId: 10), + hasMore: false, + ), + ); + responses[ChatMediaDirection.newer]!.add( + ChatMediaPage( + items: [media('new', 30, 3000), middle], + nextCursor: const ChatMediaCursor(dateMilliseconds: 3000, messageId: 30), + hasMore: false, + ), + ); + + await pager.loadOlder(); + await pager.loadNewer(); + + expect(pager.items.map((item) => item.guid), ['new', 'middle', 'old']); + expect(calls.first.cursor?.messageId, 20); + expect(calls.last.cursor?.messageId, 20); + }); + + test('filters non-media and keeps a selected item outside the seed', () { + final image = media('image', 20, 2000); + final document = media('document', 15, 1500, mimeType: 'application/pdf'); + final selected = media('selected', 10, 1000); + + pager.seed([image, document], selected: selected); + + expect(pager.items.map((item) => item.guid), ['image', 'selected']); + }); + + test('retains loaded data when a later page fails', () async { + final image = media('image', 20, 2000); + pager.dispose(); + pager = ConversationMediaPager( + chat: Chat(id: 1, guid: 'chat'), + loader: ({ + required ChatMediaDirection direction, + ChatMediaCursor? cursor, + required int limit, + }) async { + throw StateError('query failed'); + }, + )..seed([image], hasOlder: true); + + await pager.loadOlder(); + + expect(pager.items, [image]); + expect(pager.lastError, isA()); + }); + + test('skips bounded text-only scans until older media is found', () async { + pager.seed([media('new', 30, 3000)], hasOlder: true); + responses[ChatMediaDirection.older]!.addAll([ + const ChatMediaPage( + items: [], + nextCursor: ChatMediaCursor(dateMilliseconds: 2000, messageId: 20), + hasMore: true, + ), + ChatMediaPage( + items: [media('old', 10, 1000)], + nextCursor: const ChatMediaCursor(dateMilliseconds: 1000, messageId: 10), + hasMore: false, + ), + ]); + + await pager.loadOlder(); + + expect(pager.items.map((item) => item.guid), ['new', 'old']); + expect(calls, hasLength(2)); + expect(calls.last.cursor?.messageId, 20); + expect(pager.hasOlder, isFalse); + }); + + test('orders an unsorted seed newest first before deriving cursors', () { + pager.seed([ + media('old', 10, 1000), + media('new', 30, 3000), + media('middle', 20, 2000), + ]); + + expect( + pager.items.map((item) => item.guid), + ['new', 'middle', 'old'], + ); + }); +} diff --git a/test/services/conversation_view_controller_test.dart b/test/services/conversation_view_controller_test.dart index f278b29979..cb45812ddc 100644 --- a/test/services/conversation_view_controller_test.dart +++ b/test/services/conversation_view_controller_test.dart @@ -1,11 +1,62 @@ +import 'dart:async'; + import 'package:bluebubbles/database/models.dart'; -import 'package:bluebubbles/services/ui/chat/conversation_view_controller.dart'; +import 'package:bluebubbles/services/services.dart'; import 'package:flutter/material.dart'; import 'package:flutter_test/flutter_test.dart'; void main() { - testWidgets('dismissKeyboard releases the conversation composer focus', (tester) async { - final controller = ConversationViewController(Chat(guid: 'iMessage;-;keyboard-test')); + test('send waits for the composer handler to finish', () async { + final controller = + ConversationViewController(Chat(guid: 'iMessage;-;send-await-test')); + final handler = Completer(); + controller.sendFunc = (_, __, ___) => handler.future; + + var completed = false; + final sending = controller.send( + [], + AttributedBody.raw('https://example.com/one https://example.com/two'), + '', + null, + null, + null, + null, + false, + null, + ).then((_) => completed = true); + + await Future.delayed(Duration.zero); + expect(completed, isFalse); + + handler.complete(); + await sending; + expect(completed, isTrue); + }); + + test('send fails when the composer handler is not ready', () async { + final controller = + ConversationViewController(Chat(guid: 'iMessage;-;send-missing-test')); + + await expectLater( + controller.send( + [], + AttributedBody.raw('message'), + '', + null, + null, + null, + null, + false, + null, + ), + throwsStateError, + ); + }); + + testWidgets('dismissKeyboard releases the conversation composer focus', + (tester) async { + final controller = + ConversationViewController(Chat(guid: 'iMessage;-;keyboard-test')); await tester.pumpWidget( MaterialApp( @@ -23,4 +74,96 @@ void main() { expect(controller.focusNode.hasFocus, isFalse); }); + + testWidgets('dismissKeyboard releases an active inline edit focus', + (tester) async { + ss.settings = Settings(); + ss.settings.spellcheck.value = false; + final controller = + ConversationViewController(Chat(guid: 'iMessage;-;edit-keyboard-test')); + final message = Message(guid: 'message-edit-test', isFromMe: true); + final editController = controller.startEditing( + message, + MessagePart(part: 0, text: 'Message to edit'), + ); + + await tester.pumpWidget( + MaterialApp( + home: Scaffold( + body: TextField( + focusNode: editController.focusNode, + controller: editController, + ), + ), + ), + ); + await tester.pump(); + expect(editController.focusNode!.hasFocus, isTrue); + + controller.dismissKeyboard(); + await tester.pump(); + + expect(editController.focusNode!.hasFocus, isFalse); + controller.stopEditing(message.guid!, 0); + await tester.pumpWidget(const SizedBox.shrink()); + await tester.pump(); + }); + + testWidgets('submitting an inline edit leaves the composer unfocused', + (tester) async { + ss.settings = Settings(); + ss.settings.spellcheck.value = false; + final controller = + ConversationViewController(Chat(guid: 'iMessage;-;edit-submit-test')); + final message = Message(guid: 'message-edit-submit-test', isFromMe: true); + final editController = controller.startEditing( + message, + MessagePart(part: 0, text: 'Message to edit'), + ); + + await tester.pumpWidget( + MaterialApp( + home: Scaffold( + body: Column( + children: [ + TextField(focusNode: controller.focusNode), + TextField( + focusNode: editController.focusNode, + controller: editController, + ), + ], + ), + ), + ), + ); + await tester.pump(); + expect(editController.focusNode!.hasFocus, isTrue); + + controller.stopEditing(message.guid!, 0); + controller.dismissKeyboard(); + await tester.pump(); + + expect(controller.focusNode.hasFocus, isFalse); + expect(FocusManager.instance.primaryFocus, isNot(controller.focusNode)); + await tester.pumpWidget(const SizedBox.shrink()); + await tester.pump(); + }); + + test('closing a conversation disposes active inline edit resources', () { + ss.settings = Settings(); + ss.settings.spellcheck.value = false; + final controller = + ConversationViewController(Chat(guid: 'iMessage;-;edit-close-test')); + final editController = controller.startEditing( + Message(guid: 'message-edit-close-test', isFromMe: true), + MessagePart(part: 0, text: 'Message to edit'), + ); + final editFocusNode = editController.focusNode!; + + controller.onClose(); + + expect(controller.editing, isEmpty); + expect(() => editController.addListener(() {}), throwsFlutterError); + expect(() => editFocusNode.addListener(() {}), throwsFlutterError); + }); } diff --git a/test/services/desktop_notification_actions_test.dart b/test/services/desktop_notification_actions_test.dart new file mode 100644 index 0000000000..e1a1d25096 --- /dev/null +++ b/test/services/desktop_notification_actions_test.dart @@ -0,0 +1,63 @@ +import 'package:bluebubbles/services/backend/notifications/desktop_notification_actions.dart'; +import 'package:flutter_test/flutter_test.dart'; + +void main() { + const reactionEmojis = { + 'love': 'heart', + 'like': 'thumbs-up', + }; + + test('keeps mark read and maps supported selected reactions', () { + expect( + resolveDesktopNotificationActions( + actionList: const ['Mark Read', 'love', 'like'], + selectedIndices: const [0, 2], + privateApiEnabled: true, + sourceIsReaction: false, + sourceIsGroupEvent: false, + reactionEmojis: reactionEmojis, + ), + const ['Mark Read', 'thumbs-up'], + ); + }); + + test('ignores stale indices and unsupported custom actions', () { + expect( + resolveDesktopNotificationActions( + actionList: const ['Mark Read', 'custom', 'love'], + selectedIndices: const [-1, 0, 1, 9], + privateApiEnabled: true, + sourceIsReaction: false, + sourceIsGroupEvent: false, + reactionEmojis: reactionEmojis, + ), + const ['Mark Read'], + ); + }); + + test('only exposes mark read when tapbacks are unavailable', () { + expect( + resolveDesktopNotificationActions( + actionList: const ['Mark Read', 'love'], + selectedIndices: const [0, 1], + privateApiEnabled: false, + sourceIsReaction: false, + sourceIsGroupEvent: false, + reactionEmojis: reactionEmojis, + ), + const ['Mark Read'], + ); + + expect( + resolveDesktopNotificationActions( + actionList: const ['Mark Read', 'love'], + selectedIndices: const [0, 1], + privateApiEnabled: true, + sourceIsReaction: true, + sourceIsGroupEvent: false, + reactionEmojis: reactionEmojis, + ), + const ['Mark Read'], + ); + }); +} diff --git a/test/services/download_file_utils_test.dart b/test/services/download_file_utils_test.dart new file mode 100644 index 0000000000..d8d6692efe --- /dev/null +++ b/test/services/download_file_utils_test.dart @@ -0,0 +1,82 @@ +import 'dart:io'; +import 'dart:typed_data'; + +import 'package:bluebubbles/services/network/download_file_utils.dart'; +import 'package:flutter_test/flutter_test.dart'; + +void main() { + late Directory tempDirectory; + + setUp(() async { + tempDirectory = await Directory.systemTemp.createTemp( + 'openbubbles-download-test-', + ); + }); + + tearDown(() async { + if (await tempDirectory.exists()) { + await tempDirectory.delete(recursive: true); + } + }); + + test('writes byte-backed downloads before returning the destination', + () async { + final target = + File('${tempDirectory.path}${Platform.pathSeparator}photo.jpg'); + final result = await materializeDownloadedFile( + targetPath: target.path, + bytes: Uint8List.fromList([1, 2, 3, 4]), + ); + + expect(result.path, target.path); + expect(await target.readAsBytes(), [1, 2, 3, 4]); + expect( + tempDirectory + .listSync() + .whereType() + .where((file) => file.path.endsWith('.part')), + isEmpty, + ); + }); + + test('replaces a stale empty destination with the completed bytes', () async { + final target = + File('${tempDirectory.path}${Platform.pathSeparator}video.mov'); + await target.create(recursive: true); + + await materializeDownloadedFile( + targetPath: target.path, + bytes: Uint8List.fromList([9, 8, 7]), + ); + + expect(await target.readAsBytes(), [9, 8, 7]); + }); + + test('accepts a non-empty file written directly by the backend', () async { + final target = + File('${tempDirectory.path}${Platform.pathSeparator}voice.caf'); + await target.writeAsBytes([4, 5, 6], flush: true); + + final result = await materializeDownloadedFile( + targetPath: target.path, + sourcePath: target.path, + ); + + expect(result.path, target.path); + expect(await result.length(), 3); + }); + + test('rejects missing and zero-byte download results', () async { + final target = + File('${tempDirectory.path}${Platform.pathSeparator}empty.bin'); + + await expectLater( + materializeDownloadedFile( + targetPath: target.path, + bytes: Uint8List(0), + ), + throwsA(isA()), + ); + expect(await target.exists(), isFalse); + }); +} diff --git a/test/services/facetime/face_time_diagnostics_contract_test.dart b/test/services/facetime/face_time_diagnostics_contract_test.dart new file mode 100644 index 0000000000..e518032516 --- /dev/null +++ b/test/services/facetime/face_time_diagnostics_contract_test.dart @@ -0,0 +1,105 @@ +import 'dart:io'; + +import 'package:flutter_test/flutter_test.dart'; + +void main() { + test('FaceTime diagnostics default off and persist through settings maps', () { + final source = File('lib/database/global/settings.dart').readAsStringSync(); + + expect( + source, + contains('final RxBool faceTimeDiagnosticsEnabled = false.obs;'), + ); + expect( + RegExp( + "'faceTimeDiagnosticsEnabled': faceTimeDiagnosticsEnabled\\.value", + ).allMatches(source), + hasLength(1), + ); + expect( + RegExp( + r"faceTimeDiagnosticsEnabled\.value = map\['faceTimeDiagnosticsEnabled'\] \?\? false;", + ).allMatches(source), + hasLength(2), + ); + }); + + test('native preference gate requires developer mode and opt in', () { + final source = File( + 'android/app/src/main/kotlin/com/bluebubbles/messaging/services/facetime/FaceTimeDiagnostics.kt', + ).readAsStringSync(); + + expect(source, contains('"flutter.developerEnabled"')); + expect(source, contains('"flutter.faceTimeDiagnosticsEnabled"')); + expect(source, contains('developerModeEnabled && diagnosticsEnabled')); + }); + + test('disabling developer mode also clears FaceTime diagnostics', () { + final source = File( + 'lib/app/layouts/settings/pages/misc/troubleshoot_panel.dart', + ).readAsStringSync(); + final disableStart = source.indexOf('if (!val) {'); + final disableEnd = source.indexOf('} else {', disableStart); + + expect(disableStart, greaterThanOrEqualTo(0)); + expect(disableEnd, greaterThan(disableStart)); + final disablePath = source.substring(disableStart, disableEnd); + expect(disablePath, contains('faceTimeDiagnosticsEnabled.value = false')); + expect(disablePath, contains("'faceTimeDiagnosticsEnabled'")); + }); + + test('diagnostic gates do not wrap functional join or end-call paths', () { + final activity = File( + 'android/app/src/main/kotlin/com/bluebubbles/messaging/services/facetime/FaceTimeActivity.kt', + ).readAsStringSync(); + final cachedWebview = File( + 'android/app/src/main/kotlin/com/bluebubbles/messaging/services/facetime/CachedWebview.kt', + ).readAsStringSync(); + + final joinStart = activity.indexOf('private fun attemptJoin('); + final joinEnd = activity.indexOf('fun endCall()', joinStart); + final endStart = joinEnd; + final endEnd = activity.indexOf( + 'private fun hideControlsForPIP()', + endStart, + ); + + expect(joinStart, greaterThanOrEqualTo(0)); + expect(joinEnd, greaterThan(joinStart)); + expect(endEnd, greaterThan(endStart)); + expect( + activity.substring(joinStart, joinEnd), + contains('webView.evaluateJavascript(joinButtonScript)'), + ); + expect( + activity.substring(endStart, endEnd), + contains('webView.evaluateJavascript('), + ); + expect(cachedWebview, contains('message=')); + expect(cachedWebview, isNot(contains('consoleMessage.message()'))); + }); + + test('outgoing calls enter the same automatic admission loop', () { + final activity = File( + 'android/app/src/main/kotlin/com/bluebubbles/messaging/services/facetime/FaceTimeActivity.kt', + ).readAsStringSync(); + final start = activity.indexOf('private fun startOutgoingCall()'); + final end = activity.indexOf('override fun onCreate', start); + + expect(start, greaterThanOrEqualTo(0)); + expect(end, greaterThan(start)); + final outgoingPath = activity.substring(start, end); + expect(outgoingPath, contains('answered = true')); + expect(outgoingPath, contains('scheduleJoinAttempt("outgoing-ready")')); + + final configStart = activity.indexOf('private fun handleConfig('); + final configEnd = activity.indexOf( + 'private fun parseMediaEvidence', + configStart, + ); + expect( + activity.substring(configStart, configEnd), + contains('startOutgoingCall()'), + ); + }); +} diff --git a/test/services/facetime/face_time_incoming_admission_test.dart b/test/services/facetime/face_time_incoming_admission_test.dart new file mode 100644 index 0000000000..59652a744b --- /dev/null +++ b/test/services/facetime/face_time_incoming_admission_test.dart @@ -0,0 +1,287 @@ +import 'package:bluebubbles/services/rustpush/rustpush_service.dart'; +import 'package:flutter_test/flutter_test.dart'; + +void main() { + final receivedAt = DateTime.utc(2026, 8, 21, 12); + + FaceTimeIncomingAdmissionCorrelation pendingCall() => + FaceTimeIncomingAdmissionCorrelation( + callUuid: 'incoming-call-uuid', + receivedAt: receivedAt, + ); + + test('answers only an explicitly approved incoming admission', () { + expect( + shouldAnswerIncomingFaceTimeAdmission( + const FaceTimeIncomingAdmissionResult.approved('incoming-call-uuid'), + ), + isTrue, + ); + expect(shouldAnswerIncomingFaceTimeAdmission(null), isFalse); + + for (final status in FaceTimeIncomingAdmissionStatus.values.where( + (status) => status != FaceTimeIncomingAdmissionStatus.approved, + )) { + expect( + shouldAnswerIncomingFaceTimeAdmission( + FaceTimeIncomingAdmissionResult.rejected(status), + ), + isFalse, + reason: 'rejected admission $status must not send an answer', + ); + } + }); + + test( + 'rejected and missing incoming admissions never invoke the answer', + () async { + var answerCount = 0; + + Future answer(String? approvedGroup) async { + answerCount += 1; + } + + expect( + await answerFaceTimeAdmissionIfAllowed( + isIncomingAdmission: true, + incomingAdmission: null, + correlation: null, + fallbackApprovedGroup: 'must-not-be-used', + answer: answer, + ), + isFalse, + ); + for (final status in FaceTimeIncomingAdmissionStatus.values.where( + (status) => status != FaceTimeIncomingAdmissionStatus.approved, + )) { + expect( + await answerFaceTimeAdmissionIfAllowed( + isIncomingAdmission: true, + incomingAdmission: FaceTimeIncomingAdmissionResult.rejected(status), + correlation: null, + fallbackApprovedGroup: 'must-not-be-used', + answer: answer, + ), + isFalse, + ); + } + + expect(answerCount, 0); + }, + ); + + test( + 'approved incoming admission answers and completes its ticket', + () async { + final correlation = pendingCall(); + final admission = correlation.claim( + activeCallUuid: 'incoming-call-uuid', + now: receivedAt.add(const Duration(seconds: 10)), + ); + String? answeredGroup; + + expect( + await answerFaceTimeAdmissionIfAllowed( + isIncomingAdmission: true, + incomingAdmission: admission, + correlation: correlation, + fallbackApprovedGroup: 'must-not-be-used', + answer: (approvedGroup) async => answeredGroup = approvedGroup, + ), + isTrue, + ); + expect(answeredGroup, 'incoming-call-uuid'); + expect(correlation.isCompleted, isTrue); + }, + ); + + test('failed incoming answer releases the ticket for retry', () async { + final correlation = pendingCall(); + final admission = correlation.claim( + activeCallUuid: 'incoming-call-uuid', + now: receivedAt.add(const Duration(seconds: 10)), + ); + + await expectLater( + answerFaceTimeAdmissionIfAllowed( + isIncomingAdmission: true, + incomingAdmission: admission, + correlation: correlation, + fallbackApprovedGroup: null, + answer: (_) async => throw StateError('expected test failure'), + ), + throwsStateError, + ); + expect( + correlation + .claim( + activeCallUuid: 'incoming-call-uuid', + now: receivedAt.add(const Duration(seconds: 11)), + ) + .isApproved, + isTrue, + ); + }); + + test('non-incoming admission retains its fallback group behavior', () async { + String? answeredGroup; + + expect( + await answerFaceTimeAdmissionIfAllowed( + isIncomingAdmission: false, + incomingAdmission: null, + correlation: null, + fallbackApprovedGroup: 'chosen-room-guid', + answer: (approvedGroup) async => answeredGroup = approvedGroup, + ), + isTrue, + ); + expect(answeredGroup, 'chosen-room-guid'); + }); + + test('approves a current request whose active call UUID matches', () { + final admission = pendingCall(); + + final result = admission.claim( + activeCallUuid: 'incoming-call-uuid', + now: receivedAt.add(const Duration(seconds: 10)), + ); + + expect(result.status, FaceTimeIncomingAdmissionStatus.approved); + expect(result.approvedGroup, 'incoming-call-uuid'); + admission.complete(); + expect( + admission + .claim( + activeCallUuid: 'incoming-call-uuid', + now: receivedAt.add(const Duration(seconds: 11)), + ) + .status, + FaceTimeIncomingAdmissionStatus.approved, + ); + expect( + admission + .claim( + activeCallUuid: 'different-call-uuid', + now: receivedAt.add(const Duration(seconds: 12)), + ) + .status, + FaceTimeIncomingAdmissionStatus.mismatched, + ); + expect( + admission + .claim( + activeCallUuid: 'incoming-call-uuid', + now: receivedAt.add( + FaceTimeIncomingAdmissionCorrelation.maxAge + + const Duration(seconds: 1), + ), + ) + .status, + FaceTimeIncomingAdmissionStatus.stale, + ); + }); + + test('ignores a duplicate while the first admission is in flight', () { + final admission = pendingCall(); + + expect( + admission + .claim( + activeCallUuid: 'incoming-call-uuid', + now: receivedAt.add(const Duration(seconds: 10)), + ) + .status, + FaceTimeIncomingAdmissionStatus.approved, + ); + expect( + admission + .claim( + activeCallUuid: 'incoming-call-uuid', + now: receivedAt.add(const Duration(seconds: 11)), + ) + .status, + FaceTimeIncomingAdmissionStatus.alreadyClaimed, + ); + }); + + test('releases a failed in-flight response so the same call can retry', () { + final admission = pendingCall(); + + expect( + admission + .claim( + activeCallUuid: 'incoming-call-uuid', + now: receivedAt.add(const Duration(seconds: 10)), + ) + .status, + FaceTimeIncomingAdmissionStatus.approved, + ); + admission.release(); + expect( + admission + .claim( + activeCallUuid: 'incoming-call-uuid', + now: receivedAt.add(const Duration(seconds: 11)), + ) + .status, + FaceTimeIncomingAdmissionStatus.approved, + ); + }); + + test('does not consume the pending call when the active UUID is missing', () { + final admission = pendingCall(); + + final missing = admission.claim( + activeCallUuid: null, + now: receivedAt.add(const Duration(seconds: 10)), + ); + + expect(missing.status, FaceTimeIncomingAdmissionStatus.missingCallUuid); + expect( + admission + .claim( + activeCallUuid: 'incoming-call-uuid', + now: receivedAt.add(const Duration(seconds: 11)), + ) + .approvedGroup, + 'incoming-call-uuid', + ); + }); + + test('rejects a request after the bounded pending-call lifetime', () { + final admission = pendingCall(); + + final result = admission.claim( + activeCallUuid: 'incoming-call-uuid', + now: receivedAt.add( + FaceTimeIncomingAdmissionCorrelation.maxAge + + const Duration(seconds: 1), + ), + ); + + expect(result.status, FaceTimeIncomingAdmissionStatus.stale); + expect(result.approvedGroup, isNull); + }); + + test('rejects a mismatched active UUID without approving another call', () { + final admission = pendingCall(); + + final mismatch = admission.claim( + activeCallUuid: 'different-call-uuid', + now: receivedAt.add(const Duration(seconds: 10)), + ); + + expect(mismatch.status, FaceTimeIncomingAdmissionStatus.mismatched); + expect(mismatch.approvedGroup, isNull); + expect( + admission + .claim( + activeCallUuid: 'incoming-call-uuid', + now: receivedAt.add(const Duration(seconds: 11)), + ) + .approvedGroup, + 'incoming-call-uuid', + ); + }); +} diff --git a/test/services/registration_relay_secret_contract_test.dart b/test/services/registration_relay_secret_contract_test.dart new file mode 100644 index 0000000000..7f909be3ca --- /dev/null +++ b/test/services/registration_relay_secret_contract_test.dart @@ -0,0 +1,35 @@ +import 'dart:io'; + +import 'package:flutter_test/flutter_test.dart'; + +void main() { + test('registration relay bearer token is supplied only at build time', () { + final source = File( + 'lib/services/rustpush/rustpush_service.dart', + ).readAsStringSync(); + final workflow = File('.github/workflows/build.yml').readAsStringSync(); + + expect( + RegExp( + r"const registrationRelayAccessToken\s*=\s*String\.fromEnvironment\(\s*'OPENBUBBLES_REGISTRATION_RELAY_ACCESS_TOKEN',?\s*\);", + ).hasMatch(source), + isTrue, + ); + expect( + RegExp( + r'const registrationRelayAccessToken\s*=\s*["\x27][^"\x27]+', + ).hasMatch(source), + isFalse, + ); + expect(workflow, contains('secrets.REGISTRATION_RELAY_ACCESS_TOKEN')); + expect( + RegExp( + r'--dart-define=OPENBUBBLES_REGISTRATION_RELAY_ACCESS_TOKEN=', + ).allMatches(workflow).length, + 4, + reason: + 'Every Android artifact that initializes rustpush, including the ' + 'separate CloudKit canary, must receive the build-time relay secret.', + ); + }); +} diff --git a/test/services/rustpush/cloud_sync/legacy_cloudkit_page_guard_test.dart b/test/services/rustpush/cloud_sync/legacy_cloudkit_page_guard_test.dart new file mode 100644 index 0000000000..c0940899a1 --- /dev/null +++ b/test/services/rustpush/cloud_sync/legacy_cloudkit_page_guard_test.dart @@ -0,0 +1,76 @@ +import 'package:bluebubbles/services/rustpush/cloud_sync/legacy_cloudkit_page_guard.dart'; +import 'package:flutter_test/flutter_test.dart'; + +void main() { + group('LegacyCloudKitPageGuard', () { + test('returns the next token after a fully applied page', () { + expect( + LegacyCloudKitPageGuard.validate( + zone: 'messages', + previousToken: null, + nextToken: [1, 2, 3], + state: 1, + hadItemFailure: false, + page: 1, + ), + 'AQID', + ); + }); + + test('refuses to advance after any item failure', () { + expect( + () => LegacyCloudKitPageGuard.validate( + zone: 'messages', + previousToken: null, + nextToken: [1], + state: 1, + hadItemFailure: true, + page: 1, + ), + throwsStateError, + ); + }); + + test('detects a nonterminal page that makes no token progress', () { + expect( + () => LegacyCloudKitPageGuard.validate( + zone: 'messages', + previousToken: 'AQID', + nextToken: [1, 2, 3], + state: 1, + hadItemFailure: false, + page: 2, + ), + throwsStateError, + ); + }); + + test('permits a terminal page to repeat its token', () { + expect( + LegacyCloudKitPageGuard.validate( + zone: 'messages', + previousToken: 'AQID', + nextToken: [1, 2, 3], + state: 3, + hadItemFailure: false, + page: 2, + ), + 'AQID', + ); + }); + + test('caps a pathological zone traversal', () { + expect( + () => LegacyCloudKitPageGuard.validate( + zone: 'messages', + previousToken: null, + nextToken: [1], + state: 1, + hadItemFailure: false, + page: LegacyCloudKitPageGuard.maxPagesPerZone + 1, + ), + throwsStateError, + ); + }); + }); +} diff --git a/test/services/trusted_device_2fa_fallback_test.dart b/test/services/trusted_device_2fa_fallback_test.dart new file mode 100644 index 0000000000..8652d2ffc9 --- /dev/null +++ b/test/services/trusted_device_2fa_fallback_test.dart @@ -0,0 +1,27 @@ +import 'dart:io'; + +import 'package:flutter_test/flutter_test.dart'; + +void main() { + test('Android trusted-device 2FA falls back after proximity failure', () { + final source = File('rust/src/api/api.rs').readAsStringSync(); + + expect( + source, + contains('tokio::time::timeout(Duration::from_secs(10)'), + ); + expect( + source, + contains('Trusted-device 2FA proximity exchange failed'), + ); + expect( + source, + contains('Trusted-device 2FA proximity response timed out'), + ); + + final directVerificationCalls = RegExp( + r'account\.lock\(\)\.await\.verify_2fa\(code\)\.await\?', + ).allMatches(source); + expect(directVerificationCalls.length, greaterThanOrEqualTo(3)); + }); +} diff --git a/test/utils/attachment_guid_utils_test.dart b/test/utils/attachment_guid_utils_test.dart new file mode 100644 index 0000000000..5a3e0eb162 --- /dev/null +++ b/test/utils/attachment_guid_utils_test.dart @@ -0,0 +1,90 @@ +import 'package:bluebubbles/utils/attachment_guid_utils.dart'; +import 'package:flutter_test/flutter_test.dart'; + +void main() { + group('parseAppleOwnedAttachmentGuid', () { + test('keeps the entire remaining suffix as the message GUID', () { + final owned = parseAppleOwnedAttachmentGuid('at_12_GUID_WITH_UNDERSCORES'); + + expect(owned, isNotNull); + expect(owned!.part, '12'); + expect(owned.messageGuid, 'GUID_WITH_UNDERSCORES'); + }); + + test('parses a single-segment message GUID', () { + final owned = parseAppleOwnedAttachmentGuid('at_0_ABCD'); + + expect(owned!.part, '0'); + expect(owned.messageGuid, 'ABCD'); + }); + + test('returns null for shapes that are not owned attachments', () { + // A standalone attachment must never be given an invented owner. + for (final guid in [ + 'ABCD-1234', + 'atlas_1_ABCD', // "at" prefix without the separator + 'at_', + 'at_12', + 'at_12_', + 'at__ABCD', // empty part + 'at_x_ABCD', // non-decimal part + 'at_-1_ABCD', + 'at_007_ABCD', // non-canonical leading zero + ]) { + expect( + parseAppleOwnedAttachmentGuid(guid), + isNull, + reason: 'expected $guid to be rejected', + ); + } + }); + + test('does not throw on fewer than three underscore segments', () { + // The previous split("_")[2] implementation raised a RangeError here. + expect(() => parseAppleOwnedAttachmentGuid('at_12'), returnsNormally); + expect(() => convertAppleAttachmentGuid('at_12'), returnsNormally); + }); + }); + + group('convertAppleAttachmentGuid', () { + test('moves the part behind a GUID containing underscores', () { + expect( + convertAppleAttachmentGuid('at_12_GUID_WITH_UNDERSCORES'), + 'GUID_WITH_UNDERSCORES_12', + ); + }); + + test('leaves a non-owned identifier untouched', () { + expect(convertAppleAttachmentGuid('ABCD-1234'), 'ABCD-1234'); + expect(convertAppleAttachmentGuid('at_x_ABCD'), 'at_x_ABCD'); + }); + }); + + group('unconvertAppleAttachmentGuid', () { + test('restores Apple form from a GUID containing underscores', () { + expect( + unconvertAppleAttachmentGuid('GUID_WITH_UNDERSCORES_12'), + 'at_12_GUID_WITH_UNDERSCORES', + ); + }); + + test('round-trips both directions', () { + for (final apple in [ + 'at_0_ABCD', + 'at_12_GUID_WITH_UNDERSCORES', + 'at_3_A_B_C_D', + ]) { + expect( + unconvertAppleAttachmentGuid(convertAppleAttachmentGuid(apple)), + apple, + ); + } + }); + + test('leaves an identifier with no trailing decimal part untouched', () { + expect(unconvertAppleAttachmentGuid('ABCD'), 'ABCD'); + expect(unconvertAppleAttachmentGuid('ABCD_EFGH'), 'ABCD_EFGH'); + expect(unconvertAppleAttachmentGuid('ABCD_'), 'ABCD_'); + }); + }); +} diff --git a/test/utils/attachment_mime_utils_test.dart b/test/utils/attachment_mime_utils_test.dart new file mode 100644 index 0000000000..351b500421 --- /dev/null +++ b/test/utils/attachment_mime_utils_test.dart @@ -0,0 +1,20 @@ +import 'package:bluebubbles/utils/attachment_mime_utils.dart'; +import 'package:flutter_test/flutter_test.dart'; + +void main() { + group('resolveAttachmentMimeType', () { + test('uses the original filename when an Android cache path has no extension', () { + expect( + resolveAttachmentMimeType('medical-form.pdf', '/data/user/0/app/cache/file_picker/42'), + 'application/pdf', + ); + }); + + test('falls back to the path when the original filename has no extension', () { + expect( + resolveAttachmentMimeType('document', '/tmp/document.pdf'), + 'application/pdf', + ); + }); + }); +} diff --git a/test/utils/crypto_utils_test.dart b/test/utils/crypto_utils_test.dart new file mode 100644 index 0000000000..e63843ee9d --- /dev/null +++ b/test/utils/crypto_utils_test.dart @@ -0,0 +1,45 @@ +import 'dart:convert'; +import 'dart:typed_data'; + +import 'package:bluebubbles/utils/crypto_utils.dart'; +import 'package:flutter_test/flutter_test.dart'; + +void main() { + test( + 'decrypts ciphertext produced by encrypt 5.0.3 and PointyCastle 3.9.1', + () { + const legacyCiphertext = 'U2FsdGVkX18BAgMEBQYHCMKHfN98FBlrgpFZzZ/ppiE='; + + final plaintext = decryptAESCryptoJS( + legacyCiphertext, + 'migration-passphrase', + ); + + expect(utf8.decode(plaintext), 'Cloud Sync V2'); + }, + ); + + test('decrypts the existing CryptoJS and OpenSSL salted golden vector', () { + const legacyCiphertext = + 'U2FsdGVkX18BAgMEBQYHCFYcZ44sOba1yw50QCJrq2wgOdqrSkV9DGT+RexENXMJ'; + + final plaintext = decryptAESCryptoJS(legacyCiphertext, 'test-passphrase'); + + expect(utf8.decode(plaintext), 'OpenBubbles Cloud Sync V2'); + }); + + test( + 'PointyCastle 4 implementation round-trips the existing wire format', + () { + final plaintext = Uint8List.fromList( + utf8.encode('OpenBubbles ObjectBox 5 migration probe'), + ); + + final ciphertext = encryptAESCryptoJS(plaintext, 'probe-passphrase'); + final decrypted = decryptAESCryptoJS(ciphertext, 'probe-passphrase'); + + expect(decrypted, plaintext); + expect(base64Decode(ciphertext).sublist(0, 8), ascii.encode('Salted__')); + }, + ); +} diff --git a/test/utils/flat_buffers_regression_test.dart b/test/utils/flat_buffers_regression_test.dart new file mode 100644 index 0000000000..e16621c687 --- /dev/null +++ b/test/utils/flat_buffers_regression_test.dart @@ -0,0 +1,12 @@ +import 'package:flat_buffers/flex_buffers.dart'; +import 'package:flutter_test/flutter_test.dart'; + +void main() { + test('FlexBuffers grows beyond its 2048-byte default buffer', () { + final oversizedMetadata = { + 'payload': List.filled(3000, 'x').join(), + }; + + expect(() => Builder.buildFromObject(oversizedMetadata), returnsNormally); + }); +} diff --git a/test/utils/logger_compression_test.dart b/test/utils/logger_compression_test.dart new file mode 100644 index 0000000000..41dbcd2185 --- /dev/null +++ b/test/utils/logger_compression_test.dart @@ -0,0 +1,42 @@ +import 'dart:convert'; + +import 'package:archive/archive.dart'; +import 'package:bluebubbles/services/backend/filesystem/filesystem_service.dart'; +import 'package:bluebubbles/utils/logger/logger.dart'; +import 'package:flutter_test/flutter_test.dart'; +import 'package:universal_io/io.dart'; + +void main() { + test('compressLogs returns a complete readable archive before returning', () { + final root = Directory.systemTemp.createTempSync( + 'openbubbles-logger-compression-', + ); + addTearDown(() { + if (root.existsSync()) root.deleteSync(recursive: true); + }); + + fs.appDocDir = root; + final logDirectory = Directory('${root.path}/logs')..createSync(); + File('${logDirectory.path}/first.log').writeAsStringSync('first entry'); + File('${logDirectory.path}/second.log').writeAsStringSync('second entry'); + + final archivePath = BaseLogger().compressLogs(); + final archiveFile = File(archivePath); + expect(archiveFile.existsSync(), isTrue); + expect(archiveFile.lengthSync(), greaterThan(0)); + + final archive = ZipDecoder().decodeBytes(archiveFile.readAsBytesSync()); + final contents = { + for (final file in archive.files) + file.name: utf8.decode(file.readBytes()!), + }; + expect( + contents, + containsPair('first.log', 'first entry'), + ); + expect( + contents, + containsPair('second.log', 'second entry'), + ); + }); +} diff --git a/tooling/android/build_verified_alpha.ps1 b/tooling/android/build_verified_alpha.ps1 index afb67be743..9f3736b898 100644 --- a/tooling/android/build_verified_alpha.ps1 +++ b/tooling/android/build_verified_alpha.ps1 @@ -1,7 +1,8 @@ [CmdletBinding()] param( - [ValidateSet('profile', 'debug')] + [ValidateSet('release', 'profile', 'debug')] [string]$Mode = 'profile', + [switch]$SplitPerAbi, [string]$FlutterCommand = 'flutter', [string]$AndroidSdkRoot = $env:ANDROID_SDK_ROOT, [string]$CargoHome = $env:CARGO_HOME, @@ -64,7 +65,12 @@ function Convert-ToPosixUncPath { $repositoryRoot = (Resolve-Path (Join-Path $PSScriptRoot '..\..')).Path $flutter = Resolve-Tool -Value $FlutterCommand -DisplayName 'Flutter' -$apk = Join-Path $repositoryRoot "build\app\outputs\flutter-apk\app-alpha-$Mode.apk" +$apkName = if ($SplitPerAbi) { + "app-arm64-v8a-alpha-$Mode.apk" +} else { + "app-alpha-$Mode.apk" +} +$apk = Join-Path $repositoryRoot "build\app\outputs\flutter-apk\$apkName" if ([string]::IsNullOrWhiteSpace($AndroidSdkRoot)) { $AndroidSdkRoot = $env:ANDROID_HOME @@ -127,7 +133,19 @@ if (-not [string]::IsNullOrWhiteSpace($MakeExecutable)) { Push-Location $repositoryRoot try { - & $flutter build apk --flavor alpha "--$Mode" --target-platform android-arm64 + $flutterArguments = @( + 'build' + 'apk' + '--flavor' + 'alpha' + "--$Mode" + '--target-platform' + 'android-arm64' + ) + if ($SplitPerAbi) { + $flutterArguments += '--split-per-abi' + } + & $flutter @flutterArguments if ($LASTEXITCODE -ne 0) { throw "Flutter build failed with exit code $LASTEXITCODE" } @@ -143,17 +161,45 @@ Add-Type -AssemblyName System.IO.Compression.FileSystem $archive = [System.IO.Compression.ZipFile]::OpenRead($apk) $verificationError = $null try { - $requiredEntries = @( - 'lib/arm64-v8a/libflutter.so' - 'lib/arm64-v8a/libapp.so' - 'lib/arm64-v8a/librust_lib_bluebubbles.so' - ) + $requiredEntries = [System.Collections.Generic.List[string]]::new() + $requiredEntries.Add('lib/arm64-v8a/libflutter.so') + $requiredEntries.Add('lib/arm64-v8a/librust_lib_bluebubbles.so') + # libapp.so holds AOT-compiled Dart. A debug package runs the interpreter + # from the asset bundle instead, so requiring it there fails a good build. + if ($Mode -ne 'debug') { + $requiredEntries.Add('lib/arm64-v8a/libapp.so') + } foreach ($entryName in $requiredEntries) { $entry = $archive.GetEntry($entryName) if ($null -eq $entry -or $entry.Length -le 0) { throw "APK verification failed: missing native entry $entryName" } } + if ($SplitPerAbi) { + $unexpectedNativeEntries = @( + $archive.Entries | Where-Object { + $_.FullName.StartsWith( + 'lib/', + [System.StringComparison]::Ordinal + ) -and + -not $_.FullName.StartsWith( + 'lib/arm64-v8a/', + [System.StringComparison]::Ordinal + ) + } + ) + if ($unexpectedNativeEntries.Count -gt 0) { + $unexpectedArchitectures = @( + $unexpectedNativeEntries | + ForEach-Object { $_.FullName.Split('/')[1] } | + Sort-Object -Unique + ) + throw ( + 'APK verification failed: split ARM64 package contains ' + + "unexpected native architectures: $($unexpectedArchitectures -join ', ')" + ) + } + } } catch { $verificationError = $_ } finally { diff --git a/tooling/android/patch_pub_cache_cargokit.sh b/tooling/android/patch_pub_cache_cargokit.sh new file mode 100755 index 0000000000..9131a7b3ef --- /dev/null +++ b/tooling/android/patch_pub_cache_cargokit.sh @@ -0,0 +1,122 @@ +#!/usr/bin/env bash +# +# Teach the CargoKit copies vendored inside pub packages how to work with +# Flutter 3.44.8's Gradle plugin. +# +# Three packages in this project ship their own CargoKit: rust_builder (tracked +# in this repository and already fixed), irondash_engine_context, and +# super_native_extensions. The latter two live in the pub cache, are refetched +# by `flutter pub get`, and cannot be fixed by a committed edit, so they are +# patched here before every Android build. +# +# Two separate defects are addressed, and the second is why this matters: +# +# 1. CargoKit locates Flutter's plugin by comparing the class name to +# "FlutterPlugin". The Kotlin rewrite moved it to +# com.flutter.gradle.FlutterPlugin, so the match fails and the Rust build +# is skipped. The package then ships with no native library, and +# IrondashEngineContextPlugin's static initializer throws +# UnsatisfiedLinkError at startup. That throw happens inside +# GeneratedPluginRegistrant.registerWith, which aborts registration for +# EVERY plugin, so path_provider never registers and the app hangs during +# startup with an unrelated-looking channel error. +# +# 2. Simply fixing the match is not enough and is actively worse. Once +# CargoKit finds the Kotlin plugin it calls `plugin.project`, now a private +# field, and `plugin.getTargetPlatforms()`, which was moved to +# FlutterPluginUtils. Both throw once per variant. Gradle 8.9 then hands +# the pile to MultipleBuildFailuresExceptionAnalyser, whose +# DefaultFailureFactory recurses over the combined cause graph and never +# returns. The build hangs with no error output at all. +# +# So the patch does both: match the Kotlin class name, and stop reaching through +# the plugin instance entirely by resolving the Flutter Project directly. +# +# Idempotent. Safe to run repeatedly and on already-patched files. +set -euo pipefail + +patched=0 +skipped=0 +scanned=0 + +patch_file() { + local file="$1" + scanned=$((scanned + 1)) + + if grep -q "_findFlutterProject" "$file"; then + skipped=$((skipped + 1)) + return 0 + fi + + if ! grep -q "_findFlutterPlugin" "$file"; then + echo " ?? $file does not look like CargoKit's plugin.gradle; leaving it alone" >&2 + return 0 + fi + + # Rename the search so it yields the Project rather than the Plugin. The + # recursive call is rewritten as its own block first so the remaining bare + # `return plugin;` is unambiguously the one inside the plugin loop. + perl -0777 -pi -e ' + s/private Plugin findFlutterPlugin\(/private Project findFlutterProject(/; + s/private Plugin _findFlutterPlugin\(/private Project _findFlutterProject(/; + s/_findFlutterPlugin\(rootProject\.childProjects\)/_findFlutterProject(rootProject.childProjects)/; + s/def plugin = _findFlutterPlugin\(project\.value\.childProjects\);\s*\n(\s*)if \(plugin != null\) \{\s*\n\s*return plugin;\s*\n\s*\}/def found = _findFlutterProject(project.value.childProjects);\n$1if (found != null) {\n$1 return found;\n$1}/; + s/if \(plugin\.class\.name == "FlutterPlugin"\) \{\s*\n(\s*)return plugin;/if (plugin.class.name == "FlutterPlugin" ||\n$1 plugin.class.name.endsWith(".FlutterPlugin")) {\n$1 return project.value;/; + s/return plugin;/return project.value;/; + s/def plugin = findFlutterPlugin\(project\.rootProject\);/def flutterProject = findFlutterProject(project.rootProject);/; + s/if \(plugin == null\) \{/if (flutterProject == null) {/; + s/\bprint\("Flutter plugin not found/println("Flutter plugin not found/; + s/plugin\.getTargetPlatforms\(\)/flutterTargetPlatforms(flutterProject)/g; + s/plugin\.project\b/flutterProject/g; + ' "$file" + + # getTargetPlatforms moved into FlutterPluginUtils, which is Kotlin-internal + # and unreachable from Groovy. Flutter passes -Ptarget-platform; the + # fallback list matches the Flutter plugin's own default. + perl -0777 -pi -e ' + s/(\n \@Override\n void apply\(Project project\) \{)/\n private static List flutterTargetPlatforms(Project flutterProject) {\n if (flutterProject.hasProperty("target-platform")) {\n return flutterProject\n .property("target-platform")\n .toString()\n .split(",")\n .collect { it.trim() }\n .findAll { !it.isEmpty() }\n }\n return ["android-arm", "android-arm64", "android-x64"]\n }\n$1/; + ' "$file" + + if ! grep -q "flutterTargetPlatforms" "$file"; then + echo " !! $file: helper was not inserted; the file shape is unexpected" >&2 + return 1 + fi + + echo " patched $file" + patched=$((patched + 1)) +} + +roots=() +if [ "$#" -gt 0 ]; then + roots=("$@") +else + # Default pub cache locations, Windows first since that is the dev host. + for candidate in \ + "${PUB_CACHE:-}" \ + "$HOME/AppData/Local/Pub/Cache" \ + "$HOME/.pub-cache" + do + [ -n "$candidate" ] && [ -d "$candidate" ] && roots+=("$candidate") + done +fi + +if [ "${#roots[@]}" -eq 0 ]; then + echo "error: no pub cache found; CargoKit patch cannot be verified" >&2 + exit 1 +fi + +for root in "${roots[@]}"; do + while IFS= read -r file; do + patch_file "$file" + done < <(find "$root" -path "*cargokit/gradle/plugin.gradle" -type f 2>/dev/null) +done + +echo "cargokit pub-cache patch: ${patched} patched, ${skipped} already current, ${scanned} scanned" + +if [ "$scanned" -eq 0 ]; then + echo "error: no vendored CargoKit copies were found." >&2 + echo "If irondash_engine_context or super_native_extensions are still" >&2 + echo "dependencies, the Android build will produce an APK that hangs on" >&2 + echo "startup. Check that pub get has run." >&2 + exit 1 +fi diff --git a/tooling/cloud_sync/check_sensitive_rust_logs.ps1 b/tooling/cloud_sync/check_sensitive_rust_logs.ps1 new file mode 100644 index 0000000000..e108a5c07e --- /dev/null +++ b/tooling/cloud_sync/check_sensitive_rust_logs.ps1 @@ -0,0 +1,51 @@ +param( + [string]$RepositoryRoot = (Resolve-Path (Join-Path $PSScriptRoot "..\..")).Path +) + +$ErrorActionPreference = "Stop" + +$searchRoots = @( + (Join-Path $RepositoryRoot "rust\src"), + (Join-Path $RepositoryRoot "rustpush\src"), + (Join-Path $RepositoryRoot "rustpush\apple-private-apis\icloud-auth\src") +) + +$forbiddenPatterns = @( + '\b(?:trace|debug|info|warn|error|println)!\s*\([^\r\n]*(?:Got spd|spd \{?:\?|IDSUser|login_state|adsid.*\{|PET:|Got code \{|idms message \{data:\?|auth response \{|gsa auth extras \{|wrapped asn|Decoding with \{|response hex|ati:)', + '\b(?:trace|debug|info|warn|error|println)!\s*\([^\r\n]*(?:response|body|request|token)[^\r\n]*\{[^}]*:\?[^}]*\}', + '\b(?:trace|debug|info|warn|error|println)!\s*\([^\r\n]*(?:C -> S|S -> C)[^\r\n]*\{read:\?\}', + '\b(?:trace|debug|info|warn|error|println)!\s*\([^\r\n]*\{(?:path|file|folder)(?::\?)?\}', + '\b(?:trace|debug|info|warn|error|println)!\s*\([^\r\n]*,\s*(?:path|file|folder|state\.folder)\s*\)' +) + +$violations = @() +foreach ($root in $searchRoots) { + if (-not (Test-Path -LiteralPath $root)) { + continue + } + + foreach ($file in Get-ChildItem -LiteralPath $root -Recurse -File -Filter "*.rs") { + $lineNumber = 0 + foreach ($line in Get-Content -LiteralPath $file.FullName) { + $lineNumber++ + if ($line.TrimStart().StartsWith("//")) { + continue + } + foreach ($pattern in $forbiddenPatterns) { + if ($line -match $pattern) { + $relative = [System.IO.Path]::GetRelativePath($RepositoryRoot, $file.FullName) + $violations += "${relative}:${lineNumber}: $($line.Trim())" + break + } + } + } + } +} + +if ($violations.Count -gt 0) { + Write-Error ("Sensitive Rust logging patterns detected:`n" + ($violations -join "`n")) + exit 1 +} + +Write-Host "Sensitive Rust logging scan passed." +exit 0 diff --git a/tooling/cloud_sync/objectbox_upgrade_probe_test.dart b/tooling/cloud_sync/objectbox_upgrade_probe_test.dart new file mode 100644 index 0000000000..d31d3d8dba --- /dev/null +++ b/tooling/cloud_sync/objectbox_upgrade_probe_test.dart @@ -0,0 +1,68 @@ +import 'dart:io'; + +import 'package:bluebubbles/database/models.dart'; +import 'package:crypto/crypto.dart'; +import 'package:flutter_test/flutter_test.dart'; + +/// Opens a copied pre-V2 ObjectBox database with the current generated model. +/// +/// Invoke explicitly with `OPENBUBBLES_OBJECTBOX_UPGRADE_SOURCE` set to the +/// directory containing `data.mdb`. The source is hashed before and after and +/// is never opened directly. This probe reads only entity counts, never message +/// content, handles, attachment names, or other user data. +void main() { + test( + 'current model opens a copied legacy database without touching the source', + () async { + final sourceDirectory = + Platform.environment['OPENBUBBLES_OBJECTBOX_UPGRADE_SOURCE']; + if (sourceDirectory == null || sourceDirectory.isEmpty) { + fail('OPENBUBBLES_OBJECTBOX_UPGRADE_SOURCE is required'); + } + + final source = File('$sourceDirectory${Platform.pathSeparator}data.mdb'); + expect(source.existsSync(), isTrue, reason: 'legacy data.mdb is missing'); + final sourceDigestBefore = sha256.convert(await source.readAsBytes()); + + final temporary = await Directory.systemTemp.createTemp( + 'openbubbles-objectbox-upgrade-', + ); + addTearDown(() async { + final resolved = temporary.absolute.path; + final systemTemp = Directory.systemTemp.absolute.path; + if (!resolved.startsWith(systemTemp) || + !temporary.uri.pathSegments.any( + (segment) => segment.startsWith('openbubbles-objectbox-upgrade-'), + )) { + fail('refusing to remove an unexpected probe directory'); + } + if (temporary.existsSync()) await temporary.delete(recursive: true); + }); + + await source.copy('${temporary.path}${Platform.pathSeparator}data.mdb'); + final store = await openStore(directory: temporary.path); + try { + final canonicalCounts = { + 'chats': store.box().count(), + 'messages': store.box().count(), + 'attachments': store.box().count(), + }; + expect(canonicalCounts.values.every((count) => count >= 0), isTrue); + expect(store.box().count(), 0); + expect(store.box().count(), 0); + expect(store.box().count(), 0); + expect(store.box().count(), 0); + expect(store.box().count(), 0); + expect(store.box().count(), 0); + expect(store.box().count(), 0); + expect(store.box().count(), 0); + expect(store.box().count(), 0); + expect(store.box().count(), 0); + } finally { + store.close(); + } + + expect(sha256.convert(await source.readAsBytes()), sourceDigestBefore); + }, + ); +} diff --git a/tooling/cloud_sync/verify_foundation.ps1 b/tooling/cloud_sync/verify_foundation.ps1 new file mode 100644 index 0000000000..5341148d41 --- /dev/null +++ b/tooling/cloud_sync/verify_foundation.ps1 @@ -0,0 +1,380 @@ +[CmdletBinding()] +param( + [string]$FlutterCommand = "flutter", + [string]$ObjectBoxDllDirectory = "", + [string]$CargoCommand = "cargo", + [string]$CargoHome = "", + [string]$RustupHome = "", + [string]$CargoTargetDirectory = "", + [switch]$SkipAnalyze, + [switch]$SkipRust +) + +$ErrorActionPreference = "Stop" +$repoRoot = (Resolve-Path (Join-Path $PSScriptRoot "..\..")).Path +$cloudSyncSource = Join-Path $repoRoot "lib\services\rustpush\cloud_sync" +$cloudSyncTests = Join-Path $repoRoot "test\services\cloud_sync" +$harnessManifest = Join-Path $repoRoot "rust\cloud_sync_protector_harness\Cargo.toml" +$sensitiveRustLogScan = Join-Path $PSScriptRoot "check_sensitive_rust_logs.ps1" +$originalPath = $env:PATH +$hadCargoHome = Test-Path Env:CARGO_HOME +$originalCargoHome = $env:CARGO_HOME +$hadRustupHome = Test-Path Env:RUSTUP_HOME +$originalRustupHome = $env:RUSTUP_HOME +$hadCargoTargetDirectory = Test-Path Env:CARGO_TARGET_DIR +$originalCargoTargetDirectory = $env:CARGO_TARGET_DIR +$completedChecks = [System.Collections.Generic.List[string]]::new() +$skippedChecks = [System.Collections.Generic.List[string]]::new() + +function Invoke-Checked { + param( + [Parameter(Mandatory = $true)] + [string]$Label, + [Parameter(Mandatory = $true)] + [scriptblock]$Action + ) + + Write-Host "" + Write-Host "== $Label ==" + & $Action + if ($LASTEXITCODE -ne 0) { + throw "$Label failed with exit code $LASTEXITCODE" + } +} + +function Resolve-CommandPath { + param( + [Parameter(Mandatory = $true)] + [string]$Command + ) + + if (Test-Path -LiteralPath $Command -PathType Leaf) { + return (Resolve-Path -LiteralPath $Command).Path + } + $resolved = Get-Command $Command -ErrorAction Stop + return $resolved.Source +} + +function Get-PEMachineArchitecture { + param( + [Parameter(Mandatory = $true)] + [string]$Path + ) + + $stream = [System.IO.File]::OpenRead($Path) + try { + $reader = New-Object System.IO.BinaryReader($stream) + $stream.Position = 0x3C + $stream.Position = $reader.ReadInt32() + if ($reader.ReadUInt32() -ne 0x00004550) { + throw "Not a PE image: $Path" + } + switch ($reader.ReadUInt16()) { + 0x8664 { return "x64" } + 0xAA64 { return "arm64" } + default { return "unsupported" } + } + } + finally { + $stream.Dispose() + } +} + +function Get-ObjectBoxLibraryVersion { + param( + [Parameter(Mandatory = $true)] + [string]$Path + ) + + # The ObjectBox C library embeds its own "-" banner. Reading it + # here lets this script reject a stale library before Dart fails 60+ tests + # with an unrelated LateInitializationError. + $ascii = [System.Text.Encoding]::ASCII.GetString([System.IO.File]::ReadAllBytes($Path)) + $match = [regex]::Match($ascii, '(\d+)\.(\d+)\.(\d+)-\d{4}-\d{2}-\d{2}') + if (-not $match.Success) { + return $null + } + return [version]::new([int]$match.Groups[1].Value, [int]$match.Groups[2].Value, [int]$match.Groups[3].Value) +} + +function Get-RequiredObjectBoxVersion { + param( + [Parameter(Mandatory = $true)] + [string]$PubspecPath + ) + + $match = Select-String -LiteralPath $PubspecPath -Pattern '^\s{2}objectbox:\s*(\d+\.\d+\.\d+)\s*$' | + Select-Object -First 1 + if (-not $match) { + throw "Could not read the pinned objectbox version from $PubspecPath" + } + return [version]$match.Matches[0].Groups[1].Value +} + +Push-Location $repoRoot +try { + $flutter = Resolve-CommandPath $FlutterCommand + + # The Dart test host loads objectbox.dll by architecture, so the library must + # match the Flutter SDK's own dart.exe rather than the repository default. + $dartHost = Join-Path (Split-Path -Parent $flutter) "cache\dart-sdk\bin\dart.exe" + if (-not (Test-Path -LiteralPath $dartHost -PathType Leaf)) { + throw "Could not locate the Dart test host for $flutter" + } + $hostArchitecture = Get-PEMachineArchitecture $dartHost + if ($hostArchitecture -eq "unsupported") { + throw "Unsupported Flutter test host architecture for $dartHost" + } + $requiredObjectBox = Get-RequiredObjectBoxVersion (Join-Path $repoRoot "pubspec.yaml") + Write-Host "Flutter test host: $hostArchitecture ($dartHost)" + Write-Host "Required objectbox C library: $requiredObjectBox or newer" + + $explicitObjectBoxDirectory = -not [string]::IsNullOrWhiteSpace($ObjectBoxDllDirectory) + if ($explicitObjectBoxDirectory) { + $objectBoxCandidates = @($ObjectBoxDllDirectory) + } + else { + $reviewRoot = Split-Path -Parent $repoRoot + $objectBoxCandidates = @( + (Join-Path $repoRoot "build\windows\$hostArchitecture\runner\Release"), + (Join-Path $repoRoot "build-x64-verified3\windows\$hostArchitecture\runner\Release"), + (Join-Path $reviewRoot "cloudsync_objectbox5_sandbox\build\windows\$hostArchitecture\runner\Release"), + "C:\Codex\Toolchains\objectbox-windows-$hostArchitecture-v$requiredObjectBox\lib" + ) + } + + $ObjectBoxDllDirectory = "" + $rejectedObjectBoxLibraries = [System.Collections.Generic.List[string]]::new() + foreach ($candidate in $objectBoxCandidates) { + $candidateDll = Join-Path $candidate "objectbox.dll" + if (-not (Test-Path -LiteralPath $candidateDll -PathType Leaf)) { + continue + } + $candidateArchitecture = Get-PEMachineArchitecture $candidateDll + $candidateVersion = Get-ObjectBoxLibraryVersion $candidateDll + if ($candidateArchitecture -ne $hostArchitecture) { + $rejectedObjectBoxLibraries.Add("$candidateDll (architecture $candidateArchitecture, needs $hostArchitecture)") + continue + } + if ($null -eq $candidateVersion -or $candidateVersion -lt $requiredObjectBox) { + $reportedVersion = if ($null -eq $candidateVersion) { "unreadable" } else { $candidateVersion } + $rejectedObjectBoxLibraries.Add("$candidateDll (version $reportedVersion, needs $requiredObjectBox or newer)") + continue + } + $ObjectBoxDllDirectory = $candidate + Write-Host "Selected objectbox C library: $candidateDll ($candidateArchitecture $candidateVersion)" + break + } + + if ($rejectedObjectBoxLibraries.Count -gt 0) { + Write-Warning ("Rejected objectbox libraries:`n " + ($rejectedObjectBoxLibraries -join "`n ")) + } + if ([string]::IsNullOrWhiteSpace($ObjectBoxDllDirectory)) { + throw "No $hostArchitecture objectbox.dll at version $requiredObjectBox or newer was found for this Flutter test host. Pass -ObjectBoxDllDirectory explicitly." + } + $env:PATH = "$ObjectBoxDllDirectory;$env:PATH" + + $rustApi = Join-Path $repoRoot "rust\src\api\api.rs" + $dartApi = Join-Path $repoRoot "lib\src\rust\api\api.dart" + $runtime = Join-Path $cloudSyncSource "cloud_sync_runtime.dart" + $protectedTransport = Join-Path $cloudSyncSource "native_protected_cloud_sync_transport.dart" + $protectedLeaseLifecycle = Join-Path $cloudSyncSource "cloud_protected_page_lease_lifecycle.dart" + $productionPreflight = Join-Path $cloudSyncSource "cloud_sync_production_preflight.dart" + $productionOwner = Join-Path $cloudSyncSource "cloud_sync_manual_shadow_owner.dart" + $protectorHealth = Join-Path $cloudSyncSource "cloud_sync_protector_health.dart" + $reportWriter = Join-Path $cloudSyncSource "cloud_sync_shadow_report_file.dart" + $rustPushService = Join-Path $repoRoot "lib\services\rustpush\rustpush_service.dart" + foreach ($requiredFile in @( + $rustApi, + $dartApi, + $runtime, + $protectedTransport, + $protectedLeaseLifecycle, + $productionPreflight, + $productionOwner, + $protectorHealth, + $reportWriter, + $rustPushService, + $sensitiveRustLogScan + )) { + if (-not (Test-Path -LiteralPath $requiredFile -PathType Leaf)) { + throw "Required Cloud Sync source is missing: $requiredFile" + } + } + + # V2's reviewed boundary is the protected bridge. The legacy raw bridge may + # remain for compatibility, but it is not sufficient evidence for V2. + foreach ($rustProtectedSymbol in @( + "pub async fn cloud_sync_capture_auth_snapshot", + "pub async fn cloud_sync_fetch_protected_page", + "pub fn cloud_sync_commit_protected_page_lease", + "pub fn cloud_sync_acknowledge_committed_page_lease", + "pub fn cloud_sync_rollback_protected_page_lease", + "pub fn cloud_sync_recover_abandoned_page_leases", + "pub fn cloud_sync_retire_protected_references", + "pub fn cloud_sync_collect_protected_garbage" + )) { + if (-not (Select-String -LiteralPath $rustApi -SimpleMatch $rustProtectedSymbol)) { + throw "Rust protected-page bridge entry point is missing: $rustProtectedSymbol" + } + } + foreach ($dartProtectedSymbol in @( + "cloudSyncCaptureAuthSnapshot", + "cloudSyncFetchProtectedPage", + "cloudSyncCommitProtectedPageLease", + "cloudSyncAcknowledgeCommittedPageLease", + "cloudSyncRollbackProtectedPageLease", + "cloudSyncRecoverAbandonedPageLeases", + "cloudSyncRetireProtectedReferences", + "cloudSyncCollectProtectedGarbage" + )) { + if (-not (Select-String -LiteralPath $dartApi -SimpleMatch $dartProtectedSymbol)) { + throw "Generated Dart protected-page binding is missing: $dartProtectedSymbol" + } + } + foreach ($deadlineSymbol in @( + "CLOUD_SYNC_RAW_FETCH_DEADLINE", + "tokio::time::timeout(CLOUD_SYNC_RAW_FETCH_DEADLINE" + )) { + if (-not (Select-String -LiteralPath $rustApi -SimpleMatch $deadlineSymbol)) { + throw "Rust raw-page native cancellation boundary is missing: $deadlineSymbol" + } + } + foreach ($dartProtectionSymbol in @( + "cloudSyncProtect", + "cloudSyncUnprotect", + "cloudSyncFingerprintAccount" + )) { + if (-not (Select-String -LiteralPath $dartApi -SimpleMatch $dartProtectionSymbol)) { + throw "Generated Dart protection binding is missing: $dartProtectionSymbol" + } + } + foreach ($rustProtectionSymbol in @( + "pub fn cloud_sync_protect", + "pub fn cloud_sync_unprotect", + "pub fn cloud_sync_fingerprint_account" + )) { + if (-not (Select-String -LiteralPath $rustApi -SimpleMatch $rustProtectionSymbol)) { + throw "Rust protection bridge entry point is missing: $rustProtectionSymbol" + } + } + if (-not (Select-String -LiteralPath $runtime -SimpleMatch "!flags.readOnlyFetch")) { + throw "Shadow runtime does not explicitly require read-only fetch." + } + foreach ($protectedLifecycleSymbol in @( + "ensureRecoveredBeforeFetch", + "commitJournaledPage", + "rollbackUnjournaledPage", + "collectOneProtectedGarbagePage", + "retireProtectedReferences" + )) { + if (-not (Select-String -LiteralPath $protectedLeaseLifecycle -SimpleMatch $protectedLifecycleSymbol)) { + throw "Protected-page Dart lifecycle operation is missing: $protectedLifecycleSymbol" + } + } + if (-not (Select-String -LiteralPath $protectedTransport -SimpleMatch "NativeProtectedCloudSyncTransport")) { + throw "Protected native Cloud Sync transport is missing." + } + foreach ($productionSymbol in @( + "CloudSyncProductionPreflightProbe", + "CloudSyncManualShadowOwner", + "CloudSyncProtectorHealthProbe", + "CloudSyncShadowReportFileWriter" + )) { + if (-not (Select-String -Path @( + $productionPreflight, + $productionOwner, + $protectorHealth, + $reportWriter + ) -SimpleMatch $productionSymbol)) { + throw "Production manual-sampler safety boundary is missing: $productionSymbol" + } + } + foreach ($compositionSymbol in @( + "runCloudSyncV2ManualShadowConfirmed", + "quiesceForAccountTransition", + "resumeAfterAccountTransition", + "CloudSyncDevGate.manualShadowSamplerEnabled" + )) { + if (-not (Select-String -LiteralPath $rustPushService -SimpleMatch $compositionSymbol)) { + throw "Production manual-sampler composition is missing: $compositionSymbol" + } + } + $completedChecks.Add("protected bridge, recovery, retention, garbage collection, read-only invariant, and gated production lifecycle") + + Invoke-Checked "Sensitive Rust logging regression scan" { + & $sensitiveRustLogScan -RepositoryRoot $repoRoot + } + $completedChecks.Add("sensitive Rust logging regression scan") + + Invoke-Checked "Cloud Sync Dart and ObjectBox tests" { + & $flutter test --no-pub $cloudSyncTests + } + $completedChecks.Add("Dart and ObjectBox tests") + + if (-not $SkipAnalyze) { + Invoke-Checked "Focused Flutter analyzer" { + & $flutter analyze --no-pub $cloudSyncSource $cloudSyncTests + } + $completedChecks.Add("focused Flutter analyzer") + } + else { + $skippedChecks.Add("focused Flutter analyzer") + } + + if (-not $SkipRust) { + if (-not [string]::IsNullOrWhiteSpace($CargoHome)) { + $env:CARGO_HOME = $CargoHome + } + if (-not [string]::IsNullOrWhiteSpace($RustupHome)) { + $env:RUSTUP_HOME = $RustupHome + } + if ([string]::IsNullOrWhiteSpace($CargoTargetDirectory)) { + $reviewRoot = Split-Path -Parent $repoRoot + $CargoTargetDirectory = Join-Path $reviewRoot "build-cache\cloud-sync-protector-harness" + } + $null = New-Item -ItemType Directory -Path $CargoTargetDirectory -Force + $env:CARGO_TARGET_DIR = (Resolve-Path -LiteralPath $CargoTargetDirectory).Path + $cargo = Resolve-CommandPath $CargoCommand + Invoke-Checked "Native Cloud Sync protector harness" { + & $cargo test --locked --manifest-path $harnessManifest + } + $completedChecks.Add("native protector harness for the current Cargo target") + } + else { + $skippedChecks.Add("native protector harness") + } + + Write-Host "" + Write-Host "Passed checks: $($completedChecks -join '; ')." + if ($skippedChecks.Count -gt 0) { + Write-Warning "Partial verification only. Skipped: $($skippedChecks -join '; ')." + } + else { + Write-Host "Cloud Sync V2 offline foundation verification passed for the current native Cargo target." + } + Write-Host "APK/Windows package ABI inspection and the other Windows Rust architecture remain separate release gates." + Write-Host "No live CloudKit access, app installation, account mutation, or message send was performed." +} +finally { + $env:PATH = $originalPath + if ($hadCargoHome) { + $env:CARGO_HOME = $originalCargoHome + } + else { + Remove-Item Env:CARGO_HOME -ErrorAction SilentlyContinue + } + if ($hadRustupHome) { + $env:RUSTUP_HOME = $originalRustupHome + } + else { + Remove-Item Env:RUSTUP_HOME -ErrorAction SilentlyContinue + } + if ($hadCargoTargetDirectory) { + $env:CARGO_TARGET_DIR = $originalCargoTargetDirectory + } + else { + Remove-Item Env:CARGO_TARGET_DIR -ErrorAction SilentlyContinue + } + Pop-Location +} diff --git a/tooling/facetime/web_rtc_diagnostic_bootstrap.test.mjs b/tooling/facetime/web_rtc_diagnostic_bootstrap.test.mjs new file mode 100644 index 0000000000..ab45d4ef8e --- /dev/null +++ b/tooling/facetime/web_rtc_diagnostic_bootstrap.test.mjs @@ -0,0 +1,248 @@ +import test from "node:test"; +import assert from "node:assert/strict"; +import vm from "node:vm"; +import { + createWebRtcDiagnosticHarness, + loadProductionBootstrap, +} from "./web_rtc_diagnostic_harness.mjs"; + +test("the production WebRTC bootstrap remains JavaScript-parseable", () => { + const bootstrap = loadProductionBootstrap(); + assert.doesNotThrow(() => new vm.Script(bootstrap)); + assert.match(bootstrap, /RTCPeerConnection/); + assert.match(bootstrap, /__obFaceTimeDiagnostics/); +}); + +test("a stale connected peer does not mask the current failed peer", async () => { + const harness = await createWebRtcDiagnosticHarness([ + { iceConnectionState: "connected", stats: harnessStats(100) }, + { iceConnectionState: "failed", stats: harnessStats(0) }, + ]); + harness.peers[0].addRemoteTrack(harness.createTrack("stale-audio", "audio")); + + const snapshot = await harness.snapshot(); + + assert.equal(snapshot.iceState, "failed"); + assert.equal(snapshot.remoteAudioTracks, 0); + assert.equal(snapshot.mediaBytes, 0); +}); + +test("closed peers are removed from the active snapshot", async () => { + const harness = await createWebRtcDiagnosticHarness([ + { iceConnectionState: "connected", stats: harnessStats(100) }, + { iceConnectionState: "checking", stats: harnessStats(0) }, + ]); + harness.peers[0].addRemoteTrack(harness.createTrack("closed-video", "video")); + harness.peers[0].iceConnectionState = "closed"; + + const snapshot = await harness.snapshot(); + + assert.equal(snapshot.iceState, "checking"); + assert.equal(snapshot.remoteVideoTracks, 0); + assert.equal(snapshot.mediaBytes, 0); +}); + +test("ended remote tracks disappear from later snapshots", async () => { + const harness = await createWebRtcDiagnosticHarness([ + { iceConnectionState: "connected", stats: harnessStats(64) }, + ]); + const audio = harness.peers[0].addRemoteTrack(harness.createTrack("remote-audio", "audio")); + const video = harness.peers[0].addRemoteTrack(harness.createTrack("remote-video", "video")); + + assert.deepEqual(await harness.snapshot(), { + peerId: 1, + iceState: "connected", + remoteAudioTracks: 1, + remoteVideoTracks: 1, + mediaBytes: 64, + webLeaveVisible: false, + webControls: { + join: { visible: false, enabled: false, count: 0 }, + rejoin: { visible: false, enabled: false, count: 0 }, + leave: { visible: false, enabled: false, count: 0 }, + }, + }); + + audio.end(); + video.end(); + const snapshot = await harness.snapshot(); + assert.equal(snapshot.remoteAudioTracks, 0); + assert.equal(snapshot.remoteVideoTracks, 0); +}); + +test("remote tracks arriving after the initial snapshot replace by id without stale removal", async () => { + const harness = await createWebRtcDiagnosticHarness([ + { iceConnectionState: "connected", stats: harnessStats(64) }, + ]); + + assert.equal((await harness.snapshot()).remoteAudioTracks, 0); + + const original = harness.peers[0].addRemoteTrack( + harness.createTrack("remote-audio", "audio"), + ); + assert.equal((await harness.snapshot()).remoteAudioTracks, 1); + + const replacement = harness.peers[0].addRemoteTrack( + harness.createTrack("remote-audio", "audio"), + ); + assert.equal((await harness.snapshot()).remoteAudioTracks, 1); + + original.end(); + assert.equal((await harness.snapshot()).remoteAudioTracks, 1); + + replacement.end(); + assert.equal((await harness.snapshot()).remoteAudioTracks, 0); +}); + +test("local outbound bytes are excluded from inbound media evidence", async () => { + const harness = await createWebRtcDiagnosticHarness([ + { + iceConnectionState: "connected", + stats: [ + { type: "inbound-rtp", bytesReceived: 25 }, + { type: "outbound-rtp", bytesSent: 100000 }, + ], + }, + ]); + harness.peers[0].addRemoteTrack(harness.createTrack("remote-audio", "audio")); + + const snapshot = await harness.snapshot(); + + assert.equal(snapshot.mediaBytes, 25); +}); + +test("the current active peer is selected instead of aggregating every peer", async () => { + const harness = await createWebRtcDiagnosticHarness([ + { iceConnectionState: "connected", stats: harnessStats(100) }, + { iceConnectionState: "connected", stats: harnessStats(7) }, + ]); + harness.peers[0].addRemoteTrack(harness.createTrack("old-audio", "audio")); + harness.peers[1].addRemoteTrack(harness.createTrack("current-video", "video")); + + const snapshot = await harness.snapshot(); + + assert.equal(snapshot.remoteAudioTracks, 0); + assert.equal(snapshot.remoteVideoTracks, 1); + assert.equal(snapshot.mediaBytes, 7); + assert.equal(snapshot.peerId, 2); +}); + +test("advancing inbound media selects its peer without aggregating stale peers", async () => { + const harness = await createWebRtcDiagnosticHarness([ + { iceConnectionState: "connected", stats: harnessStats(100) }, + { iceConnectionState: "failed", stats: harnessStats(0) }, + ]); + harness.peers[0].addRemoteTrack(harness.createTrack("active-video", "video")); + + const first = await harness.snapshot(); + assert.equal(first.peerId, 2); + assert.equal(first.iceState, "failed"); + + harness.peers[0].stats = harnessStats(150); + const advancing = await harness.snapshot(); + assert.equal(advancing.peerId, 1); + assert.equal(advancing.iceState, "connected"); + assert.equal(advancing.mediaBytes, 150); + assert.equal(advancing.remoteVideoTracks, 1); +}); + +test("a reset counter is not considered advancing peer activity", async () => { + const harness = await createWebRtcDiagnosticHarness([ + { iceConnectionState: "connected", stats: harnessStats(100) }, + { iceConnectionState: "checking", stats: harnessStats(0) }, + ]); + await harness.snapshot(); + harness.peers[0].stats = harnessStats(1); + + const snapshot = await harness.snapshot(); + assert.equal(snapshot.peerId, 2); + assert.equal(snapshot.iceState, "checking"); +}); + +test("the DOM diagnostic distinguishes visible, hidden, and disabled Join/Rejoin/Leave controls", async () => { + const harness = await createWebRtcDiagnosticHarness([ + { iceConnectionState: "connected", stats: harnessStats(10) }, + ]); + const buttons = [ + button("Join", { offsetParent: {} }), + button("Rejoin", { offsetParent: null }), + button("Leave", { offsetParent: {}, disabled: true }), + button("end call", { offsetParent: {}, ariaDisabled: true }), + ]; + harness.window.document.querySelectorAll = () => buttons; + + const controls = (await harness.snapshot()).webControls; + + assert.deepEqual(controls, { + join: { visible: true, enabled: true, count: 1 }, + rejoin: { visible: false, enabled: false, count: 1 }, + leave: { visible: true, enabled: false, count: 2 }, + }); +}); + +test("the DOM diagnostic follows Join/Rejoin/Leave mutations between snapshots", async () => { + const harness = await createWebRtcDiagnosticHarness([ + { iceConnectionState: "connected", stats: harnessStats(10) }, + ]); + let buttons = [button("Join", { offsetParent: {} })]; + harness.window.document.querySelectorAll = () => buttons; + + assert.deepEqual((await harness.snapshot()).webControls, { + join: { visible: true, enabled: true, count: 1 }, + rejoin: { visible: false, enabled: false, count: 0 }, + leave: { visible: false, enabled: false, count: 0 }, + }); + + buttons = [ + button("Join", { offsetParent: null }), + button("Rejoin", { offsetParent: {} }), + button("Leave", { offsetParent: {} }), + ]; + assert.deepEqual((await harness.snapshot()).webControls, { + join: { visible: false, enabled: false, count: 1 }, + rejoin: { visible: true, enabled: true, count: 1 }, + leave: { visible: true, enabled: true, count: 1 }, + }); + + buttons = [button("Leave", { offsetParent: {}, disabled: true })]; + assert.deepEqual((await harness.snapshot()).webControls, { + join: { visible: false, enabled: false, count: 0 }, + rejoin: { visible: false, enabled: false, count: 0 }, + leave: { visible: true, enabled: false, count: 1 }, + }); +}); + +test("duplicate bootstrap installation does not double-wrap new peers", async () => { + const harness = await createWebRtcDiagnosticHarness(); + const diagnostics = harness.window.__obFaceTimeDiagnostics; + + harness.installBootstrap(); + assert.equal(harness.window.__obFaceTimeDiagnostics, diagnostics); + + const peer = new harness.window.RTCPeerConnection(); + peer.iceConnectionState = "connected"; + peer.connectionState = "connected"; + peer.stats = harnessStats(10); + + const snapshot = await harness.snapshot(); + assert.equal(snapshot.peerId, 1); +}); + +function harnessStats(inboundBytes) { + return [{ type: "inbound-rtp", bytesReceived: inboundBytes }]; +} + +function button(text, { offsetParent, disabled = false, ariaDisabled = false }) { + return { + innerText: text, + textContent: text, + offsetParent, + hidden: false, + disabled, + getAttribute(name) { + if (name === "aria-disabled") return ariaDisabled ? "true" : null; + if (name === "aria-hidden") return null; + return null; + }, + }; +} diff --git a/tooling/facetime/web_rtc_diagnostic_harness.mjs b/tooling/facetime/web_rtc_diagnostic_harness.mjs new file mode 100644 index 0000000000..b2316a0594 --- /dev/null +++ b/tooling/facetime/web_rtc_diagnostic_harness.mjs @@ -0,0 +1,119 @@ +import fs from "node:fs"; +import path from "node:path"; +import vm from "node:vm"; + +const cachedWebviewSource = path.resolve( + process.cwd(), + "android/app/src/main/kotlin/com/bluebubbles/messaging/services/facetime/CachedWebview.kt", +); + +function kotlinTrimIndent(value) { + const lines = value.replace(/\r\n/g, "\n").split("\n"); + while (lines.length > 0 && lines[0].trim() === "") lines.shift(); + while (lines.length > 0 && lines.at(-1).trim() === "") lines.pop(); + + const indentation = lines + .filter((line) => line.trim() !== "") + .map((line) => line.match(/^\s*/)[0].length); + const minimumIndent = indentation.length > 0 ? Math.min(...indentation) : 0; + return lines.map((line) => line.slice(Math.min(minimumIndent, line.length))).join("\n"); +} + +export function loadProductionBootstrap(sourcePath = cachedWebviewSource) { + const source = fs.readFileSync(sourcePath, "utf8"); + const match = source.match( + /private val webRtcDiagnosticBootstrap = """\r?\n([\s\S]*?)\r?\n\s*"""\.trimIndent\(\)/, + ); + if (!match) throw new Error("CachedWebview.kt no longer contains the embedded WebRTC bootstrap"); + return kotlinTrimIndent(match[1]); +} + +class FakeTrack { + constructor(id, kind) { + this.id = id; + this.kind = kind; + this.readyState = "live"; + this.listeners = new Map(); + } + + addEventListener(name, callback) { + const callbacks = this.listeners.get(name) ?? []; + callbacks.push(callback); + this.listeners.set(name, callbacks); + } + + end() { + this.readyState = "ended"; + for (const callback of this.listeners.get("ended") ?? []) callback(); + } +} + +class FakePeer { + static pendingConfigurations = []; + + constructor() { + const configuration = FakePeer.pendingConfigurations.shift() ?? {}; + this.iceConnectionState = configuration.iceConnectionState ?? "new"; + this.connectionState = configuration.connectionState ?? this.iceConnectionState; + this.stats = configuration.stats ?? []; + this.listeners = new Map(); + } + + addEventListener(name, callback) { + const callbacks = this.listeners.get(name) ?? []; + callbacks.push(callback); + this.listeners.set(name, callbacks); + } + + emit(name, event = {}) { + for (const callback of this.listeners.get(name) ?? []) callback(event); + } + + addRemoteTrack(track) { + this.emit("track", { track }); + return track; + } + + async getStats() { + const reports = [...this.stats]; + return { forEach: (callback) => reports.forEach(callback) }; + } +} + +function stats(bytesReceived = null, bytesSent = null) { + const reports = []; + if (bytesReceived !== null) reports.push({ type: "inbound-rtp", bytesReceived }); + if (bytesSent !== null) reports.push({ type: "outbound-rtp", bytesSent }); + return reports; +} + +export async function createWebRtcDiagnosticHarness(peerConfigurations = []) { + FakePeer.pendingConfigurations = peerConfigurations.map((configuration) => ({ ...configuration })); + const window = { + RTCPeerConnection: FakePeer, + setInterval: () => 1, + clearInterval: () => {}, + }; + const document = { querySelectorAll: () => [] }; + window.document = document; + const context = vm.createContext({ + window, + document, + console, + }); + const bootstrap = loadProductionBootstrap(); + new vm.Script(bootstrap, { filename: "CachedWebview.webRtcDiagnosticBootstrap.js" }).runInContext(context); + + const peers = peerConfigurations.map(() => new window.RTCPeerConnection()); + return { + bootstrap, + window, + peers, + stats, + createTrack: (id, kind) => new FakeTrack(id, kind), + installBootstrap: () => { + new vm.Script(bootstrap, { filename: "CachedWebview.webRtcDiagnosticBootstrap.js" }).runInContext(context); + }, + snapshot: () => window.__obFaceTimeDiagnostics.snapshot().then((raw) => JSON.parse(raw)), + }; +} diff --git a/tooling/frb/guard_generated_sse_impls.ps1 b/tooling/frb/guard_generated_sse_impls.ps1 new file mode 100644 index 0000000000..bcfcf540bf --- /dev/null +++ b/tooling/frb/guard_generated_sse_impls.ps1 @@ -0,0 +1,213 @@ +param( + [Parameter(Mandatory = $false)] + [ValidateSet('Deduplicate', 'Verify')] + [string]$Mode = 'Verify', + + [Parameter(Mandatory = $false)] + [string]$GeneratedRust, + + [Parameter(Mandatory = $false)] + [ValidateRange(0, 100)] + [int]$ExpectedRemovalCount = 6 +) + +$ErrorActionPreference = 'Stop' + +if ([string]::IsNullOrWhiteSpace($GeneratedRust)) { + $GeneratedRust = Join-Path $PSScriptRoot '..\..\rust\src\frb_generated.rs' +} +$GeneratedRust = [System.IO.Path]::GetFullPath($GeneratedRust) + +if (-not (Test-Path -LiteralPath $GeneratedRust -PathType Leaf)) { + throw "Generated Rust file not found: $GeneratedRust" +} + +function Get-Sha256 { + param( + [Parameter(Mandatory = $true)] + [string]$Value + ) + + $bytes = [System.Text.Encoding]::UTF8.GetBytes($Value) + $hash = [System.Security.Cryptography.SHA256]::HashData($bytes) + return [Convert]::ToHexString($hash).ToLowerInvariant() +} + +function Get-SseImplementations { + param( + [Parameter(Mandatory = $true)] + [string]$Source + ) + + # flutter_rust_bridge can wrap a long impl target after rustfmt. Match + # through its opening brace, then locate the matching closing brace. + $headerPattern = [regex]::new( + '(?ms)^[ \t]*impl[ \t]+(?SseDecode|SseEncode)[ \t]+for[ \t]+(?.*?)[ \t]*\{' + ) + + foreach ($match in $headerPattern.Matches($Source)) { + $openingBrace = $match.Index + $match.Value.LastIndexOf('{') + $depth = 0 + $closingBrace = -1 + + :braceScan for ($index = $openingBrace; $index -lt $Source.Length; $index++) { + switch ($Source[$index]) { + '{' { $depth += 1 } + '}' { + $depth -= 1 + if ($depth -eq 0) { + $closingBrace = $index + break braceScan + } + } + } + } + + if ($closingBrace -lt 0) { + throw "Unbalanced generated SSE impl beginning at offset $($match.Index)" + } + + $type = [regex]::Replace($match.Groups['type'].Value.Trim(), '\s+', ' ') + $body = $Source.Substring( + $openingBrace + 1, + $closingBrace - $openingBrace - 1 + ).Trim() + $endExclusive = $closingBrace + 1 + + if ( + $endExclusive + 1 -lt $Source.Length -and + $Source[$endExclusive] -eq "`r" -and + $Source[$endExclusive + 1] -eq "`n" + ) { + $endExclusive += 2 + } elseif ( + $endExclusive -lt $Source.Length -and + $Source[$endExclusive] -eq "`n" + ) { + $endExclusive += 1 + } + + [pscustomobject]@{ + Key = "$($match.Groups['trait'].Value) for $type" + Start = $match.Index + EndExclusive = $endExclusive + BodySha256 = Get-Sha256 -Value $body + } + } +} + +$rawBytes = [System.IO.File]::ReadAllBytes($GeneratedRust) +$hasUtf8Bom = ( + $rawBytes.Length -ge 3 -and + $rawBytes[0] -eq 0xef -and + $rawBytes[1] -eq 0xbb -and + $rawBytes[2] -eq 0xbf +) +$sourceOffset = if ($hasUtf8Bom) { 3 } else { 0 } +$utf8Strict = [System.Text.UTF8Encoding]::new($false, $true) +$source = $utf8Strict.GetString( + $rawBytes, + $sourceOffset, + $rawBytes.Length - $sourceOffset +) +$sourceSha256 = Get-Sha256 -Value $source + +$duplicateGroups = @( + Get-SseImplementations -Source $source | + Group-Object Key | + Where-Object Count -gt 1 | + Sort-Object Name +) + +$removals = [System.Collections.Generic.List[object]]::new() +foreach ($group in $duplicateGroups) { + $ordered = @($group.Group | Sort-Object Start) + $bodyHashes = @($ordered.BodySha256 | Select-Object -Unique) + + if ($bodyHashes.Count -ne 1) { + throw "Refusing to alter non-identical duplicate bodies for '$($group.Name)'" + } + + foreach ($duplicate in ($ordered | Select-Object -Skip 1)) { + $removals.Add($duplicate) + } +} + +if ($Mode -eq 'Verify') { + if ($removals.Count -ne 0) { + $keys = $duplicateGroups.Name -join ', ' + throw "Found $($removals.Count) duplicate SSE impl(s): $keys" + } + + [pscustomobject]@{ + GeneratedRust = $GeneratedRust + DuplicateGroupCount = 0 + DuplicateImplCount = 0 + Sha256 = $sourceSha256 + } | ConvertTo-Json + exit 0 +} + +if ($removals.Count -ne $ExpectedRemovalCount) { + throw "Expected exactly $ExpectedRemovalCount identical duplicate impl removal(s), found $($removals.Count)" +} + +$builder = [System.Text.StringBuilder]::new($source.Length) +$cursor = 0 +foreach ($removal in ($removals | Sort-Object Start)) { + if ($removal.Start -lt $cursor) { + throw "Overlapping generated-code removal ranges detected" + } + + [void]$builder.Append($source, $cursor, $removal.Start - $cursor) + $cursor = $removal.EndExclusive +} +[void]$builder.Append($source, $cursor, $source.Length - $cursor) +$deduplicated = $builder.ToString() + +if ( + @(Get-SseImplementations -Source $deduplicated | + Group-Object Key | + Where-Object Count -gt 1).Count -ne 0 +) { + throw 'Internal verification failed: duplicate SSE impl signatures remain' +} + +# Refuse to overwrite a concurrent regeneration. +$current = [System.IO.File]::ReadAllText($GeneratedRust) +if ((Get-Sha256 -Value $current) -ne $sourceSha256) { + throw 'Generated Rust changed during verification; refusing to overwrite it' +} + +$directory = [System.IO.Path]::GetDirectoryName($GeneratedRust) +$temporary = [System.IO.Path]::Combine( + $directory, + ".frb-generated-dedup-$([guid]::NewGuid().ToString('N')).tmp" +) +$outputEncoding = [System.Text.UTF8Encoding]::new($hasUtf8Bom) + +try { + [System.IO.File]::WriteAllText($temporary, $deduplicated, $outputEncoding) + [System.IO.File]::Move($temporary, $GeneratedRust, $true) +} finally { + if (Test-Path -LiteralPath $temporary) { + Remove-Item -LiteralPath $temporary -Force + } +} + +$written = [System.IO.File]::ReadAllText($GeneratedRust) +if ( + @(Get-SseImplementations -Source $written | + Group-Object Key | + Where-Object Count -gt 1).Count -ne 0 +) { + throw 'Post-write verification failed: duplicate SSE impl signatures remain' +} + +[pscustomobject]@{ + GeneratedRust = $GeneratedRust + RemovedImplCount = $removals.Count + DuplicateGroupCount = $duplicateGroups.Count + OriginalSha256 = $sourceSha256 + DeduplicatedSha256 = Get-Sha256 -Value $written +} | ConvertTo-Json diff --git a/tooling/windows/build_verified_native_media_runner.ps1 b/tooling/windows/build_verified_native_media_runner.ps1 new file mode 100644 index 0000000000..3c597ea52e --- /dev/null +++ b/tooling/windows/build_verified_native_media_runner.ps1 @@ -0,0 +1,288 @@ +[CmdletBinding()] +param( + [Parameter(Mandatory)] + [ValidateSet("x64", "arm64")] + [string] $Architecture, + + [Parameter(Mandatory)] + [string] $AngleBundleRoot, + + [string] $FlutterRoot, + + [string] $LibmpvArchivePath, + + [ValidateSet("debug", "profile", "release")] + [string] $Configuration = "release", + + [switch] $Offline, + + [switch] $SkipPubGet, + + [string] $RepoRoot = ( + Resolve-Path (Join-Path $PSScriptRoot "..\..") + ).Path +) + +$ErrorActionPreference = "Stop" +Set-StrictMode -Version Latest + +function Invoke-Checked { + param( + [Parameter(Mandatory)] + [string] $FilePath, + + [string[]] $ArgumentList = @() + ) + + & $FilePath @ArgumentList + if ($LASTEXITCODE -ne 0) { + throw "Command failed with exit code $LASTEXITCODE`: $FilePath $($ArgumentList -join ' ')" + } +} + +function Get-NormalizedPath { + param([Parameter(Mandatory)][string] $Path) + return [System.IO.Path]::GetFullPath($Path).TrimEnd('\', '/') +} + +$repo = Get-NormalizedPath -Path $RepoRoot +$package = Join-Path $repo "packages\media_kit_libs_windows_video" +$verificationModule = Join-Path $package "tool\NativeMediaVerification.psm1" +$bundleVerifier = Join-Path $package "tool\verify_native_media.ps1" +$runtimeSmoke = Join-Path $package "tool\runtime_smoke.ps1" +$librarySmoke = Join-Path $package "tool\smoke_library.dart" +$integrationVerifier = Join-Path $repo ( + "tooling\windows\verify_native_media_integration.ps1" +) + +if ($FlutterRoot) { + $flutter = Join-Path (Get-NormalizedPath -Path $FlutterRoot) "bin\flutter.bat" + $dart = Join-Path (Get-NormalizedPath -Path $FlutterRoot) "bin\dart.bat" +} +else { + $flutterCommand = Get-Command flutter.bat -ErrorAction SilentlyContinue + if (-not $flutterCommand) { + $flutterCommand = Get-Command flutter -ErrorAction Stop + } + $flutter = $flutterCommand.Source + $flutterHome = Split-Path (Split-Path $flutter -Parent) -Parent + $dart = Join-Path $flutterHome "bin\dart.bat" +} +foreach ($tool in @($flutter, $dart, $verificationModule, $bundleVerifier, + $runtimeSmoke, $librarySmoke, $integrationVerifier)) { + if (-not (Test-Path -LiteralPath $tool -PathType Leaf)) { + throw "Required build tool is missing: $tool" + } +} + +$angle = (Resolve-Path -LiteralPath $AngleBundleRoot -ErrorAction Stop).Path +$provenance = Join-Path $package "provenance\native-dependencies.json" +Invoke-Checked ` + -FilePath "pwsh" ` + -ArgumentList @( + "-NoLogo", "-NoProfile", "-File", $bundleVerifier, + "-Architecture", $Architecture, + "-BundleRoot", $angle, + "-ManifestPath", (Join-Path $angle "native-manifest.json"), + "-ProvenancePath", $provenance + ) + +$dartVersion = (& $dart --version 2>&1 | Out-String).Trim() +$expectedDartArch = if ($Architecture -eq "arm64") { + "windows_arm64" +} +else { + "windows_x64" +} +if ($dartVersion -notmatch [regex]::Escape($expectedDartArch)) { + throw "The Flutter toolchain must use $expectedDartArch Dart; got: $dartVersion" +} + +if ($LibmpvArchivePath) { + $libmpvArchive = ( + Resolve-Path -LiteralPath $LibmpvArchivePath -ErrorAction Stop + ).Path +} +else { + $libmpvArchive = $null +} + +$previousAngle = $env:MEDIA_KIT_OFFICIAL_ANGLE_ROOT +$previousArchive = $env:MEDIA_KIT_LIBMPV_ARCHIVE +try { + $env:MEDIA_KIT_OFFICIAL_ANGLE_ROOT = $angle + if ($libmpvArchive) { + $env:MEDIA_KIT_LIBMPV_ARCHIVE = $libmpvArchive + } + else { + Remove-Item Env:MEDIA_KIT_LIBMPV_ARCHIVE -ErrorAction SilentlyContinue + } + + Push-Location $repo + try { + Invoke-Checked ` + -FilePath $flutter ` + -ArgumentList @("config", "--enable-windows-desktop") + if (-not $SkipPubGet) { + $pubArguments = @("pub", "get") + if ($Offline) { + $pubArguments += "--offline" + } + Invoke-Checked -FilePath $flutter -ArgumentList $pubArguments + } + Invoke-Checked ` + -FilePath "pwsh" ` + -ArgumentList @( + "-NoLogo", "-NoProfile", "-File", $integrationVerifier, + "-RequireEphemeralSymlink" + ) + Invoke-Checked ` + -FilePath $flutter ` + -ArgumentList @( + "build", "windows", "--$Configuration", "--no-pub" + ) + } + finally { + Pop-Location + } +} +finally { + if ($null -eq $previousAngle) { + Remove-Item Env:MEDIA_KIT_OFFICIAL_ANGLE_ROOT -ErrorAction SilentlyContinue + } + else { + $env:MEDIA_KIT_OFFICIAL_ANGLE_ROOT = $previousAngle + } + if ($null -eq $previousArchive) { + Remove-Item Env:MEDIA_KIT_LIBMPV_ARCHIVE -ErrorAction SilentlyContinue + } + else { + $env:MEDIA_KIT_LIBMPV_ARCHIVE = $previousArchive + } +} + +$configurationDirectory = (Get-Culture).TextInfo.ToTitleCase($Configuration) +$bundle = Join-Path $repo ( + "build\windows\$Architecture\runner\$configurationDirectory" +) +if (-not (Test-Path -LiteralPath $bundle -PathType Container)) { + throw "Flutter did not produce the expected $Architecture bundle: $bundle" +} + +Import-Module $verificationModule -Force +$expectedMachine = if ($Architecture -eq "arm64") { "ARM64" } else { "X64" } +$peInventory = @( + Get-ChildItem -LiteralPath $bundle -File | + Where-Object { $_.Extension.ToLowerInvariant() -in @(".dll", ".exe") } | + Sort-Object Name | + ForEach-Object { + [pscustomobject]@{ + file_name = $_.Name + sha256 = Get-Sha256Hex -Path $_.FullName + pe_machine = Get-PEMachine -Path $_.FullName + } + } +) +if ($peInventory.Count -eq 0) { + throw "The Windows bundle contains no PE runtime files." +} +$wrongMachine = @( + $peInventory | + Where-Object { $_.pe_machine -ne $expectedMachine } +) +if ($wrongMachine.Count -gt 0) { + throw "Bundle contains wrong-architecture PE files: $($wrongMachine | ConvertTo-Json -Compress)" +} + +$evidenceRoot = Join-Path $bundle "data\native-media" +$requiredEvidence = @( + "native-media-package-evidence.json", + "angle-native-manifest.json", + "extraction-manifest.json", + "native-dependencies.json", + "THIRD_PARTY_NOTICES.md", + "angle-licenses\ANGLE-LICENSE.txt", + "angle-licenses\license-inventory.json" +) +foreach ($relative in $requiredEvidence) { + $required = Join-Path $evidenceRoot $relative + if (-not (Test-Path -LiteralPath $required -PathType Leaf)) { + throw "Runner bundle is missing required native-media evidence: $relative" + } +} + +$packageEvidencePath = Join-Path $evidenceRoot ( + "native-media-package-evidence.json" +) +$packageEvidenceRaw = Get-Content -LiteralPath $packageEvidencePath -Raw +if ($packageEvidenceRaw -match '(?i)(?nul 2>&1 && echo $marker && set" +if ($LASTEXITCODE -ne 0) { + throw "vcvarsall.bat $Arch failed with exit code $LASTEXITCODE" +} +$seenMarker = $false +foreach ($line in $captured) { + if (-not $seenMarker) { + # cmd echoes the marker with the trailing space that preceded `&&`. + if ($line.Trim() -eq $marker) { $seenMarker = $true } + continue + } + $split = $line.IndexOf('=') + if ($split -lt 1) { continue } + Set-Item -Path "Env:$($line.Substring(0, $split))" -Value $line.Substring($split + 1) +} +if (-not $seenMarker) { + throw "Could not capture the developer environment for $Arch" +} + +# `cc` honours these before it looks for cl.exe. A stale GNU value silently +# produces the wrong machine type or fails compiler detection outright. +foreach ($gnuOverride in @("CC", "CXX", "AR", "LD", "RANLIB", "CFLAGS", "CXXFLAGS")) { + Remove-Item -Path "Env:$gnuOverride" -ErrorAction SilentlyContinue +} +$env:PATH = (($env:PATH -split ';') | Where-Object { + $_ -and $_ -notmatch '(?i)\\Strawberry\\(c|perl)\\' +}) -join ';' + +# Perl is required by the OpenSSL build, but it must not drag in gcc/ninja from +# the same distribution, so re-add only its interpreter directory at the end. +$strawberryPerl = "C:\Strawberry\perl\bin" +if (Test-Path -LiteralPath $strawberryPerl) { + $env:PATH = "$env:PATH;$strawberryPerl" +} + +# `ring` assembles GNU-syntax .S sources that cl.exe cannot consume, so clang +# must be reachable for the aarch64-pc-windows-msvc target. Appended after the +# MSVC directories so cl/link/lib still resolve to Visual Studio. +$llvmBin = "C:\Codex\Toolchains\LLVM-22.1.8-woa64-portable\bin" +if (Test-Path -LiteralPath $llvmBin) { + $env:PATH = "$env:PATH;$llvmBin" +} + +foreach ($tool in @("cl", "link", "lib", "nmake", "perl", "clang")) { + $resolved = Get-Command $tool -ErrorAction SilentlyContinue + if (-not $resolved) { throw "Required native build tool is missing from PATH: $tool" } + Write-Host (" {0,-6} {1}" -f $tool, $resolved.Source) +} + +try { + & $Command[0] @($Command[1..($Command.Length - 1)]) + $commandExitCode = $LASTEXITCODE +} +finally { + # `$env:` writes are process-wide, so repeated invocations inside one + # session would otherwise stack vcvars directories until PATH overflows. + foreach ($name in $originalEnvironment.Keys) { + Set-Item -Path "Env:$name" -Value $originalEnvironment[$name] + } + foreach ($name in @(Get-ChildItem Env: | Select-Object -ExpandProperty Name)) { + if (-not $originalEnvironment.ContainsKey($name)) { + Remove-Item -Path "Env:$name" -ErrorAction SilentlyContinue + } + } +} +exit $commandExitCode diff --git a/tooling/windows/verify_native_media_integration.ps1 b/tooling/windows/verify_native_media_integration.ps1 new file mode 100644 index 0000000000..329f54fbd1 --- /dev/null +++ b/tooling/windows/verify_native_media_integration.ps1 @@ -0,0 +1,321 @@ +[CmdletBinding()] +param( + [string] $RepoRoot = ( + Resolve-Path (Join-Path $PSScriptRoot "..\..") + ).Path, + + [switch] $RequireEphemeralSymlink +) + +$ErrorActionPreference = "Stop" +Set-StrictMode -Version Latest + +$script:Assertions = 0 + +function Assert-True { + param( + [Parameter(Mandatory)] + [bool] $Condition, + + [Parameter(Mandatory)] + [string] $Message + ) + + if (-not $Condition) { + throw "Assertion failed: $Message" + } + $script:Assertions++ +} + +function Get-NormalizedPath { + param([Parameter(Mandatory)][string] $Path) + return [System.IO.Path]::GetFullPath($Path).TrimEnd('\', '/') +} + +$repo = Get-NormalizedPath -Path $RepoRoot +$package = Join-Path $repo "packages\media_kit_libs_windows_video" +$pubspecPath = Join-Path $repo "pubspec.yaml" +$lockPath = Join-Path $repo "pubspec.lock" +$packagePubspecPath = Join-Path $package "pubspec.yaml" +$pluginCmakePath = Join-Path $package "windows\CMakeLists.txt" +$rootCmakePath = Join-Path $repo "windows\CMakeLists.txt" +$generatedPluginsPath = Join-Path $repo "windows\flutter\generated_plugins.cmake" +$provenancePath = Join-Path $package "provenance\native-dependencies.json" +$noticesPath = Join-Path $package "THIRD_PARTY_NOTICES.md" +$verifiedBuildPath = Join-Path $repo ( + "tooling\windows\build_verified_native_media_runner.ps1" +) +$runtimeSmokePath = Join-Path $package "tool\runtime_smoke.ps1" +$workflowPath = Join-Path $repo ( + ".github\workflows\windows-arm64-native-media.yml" +) +$validationWorkflowPath = Join-Path $repo ( + ".github\workflows\windows-build.yml" +) + +foreach ($required in @( + $pubspecPath, + $lockPath, + $packagePubspecPath, + $pluginCmakePath, + $rootCmakePath, + $generatedPluginsPath, + $provenancePath, + $noticesPath, + $verifiedBuildPath, + $runtimeSmokePath, + $workflowPath, + $validationWorkflowPath +)) { + Assert-True ` + -Condition (Test-Path -LiteralPath $required -PathType Leaf) ` + -Message "required integration file must exist: $required" +} + +$pubspec = Get-Content -LiteralPath $pubspecPath -Raw +Assert-True ` + -Condition ($pubspec -match '(?ms)^dependency_overrides:\s*.*?^ media_kit_libs_windows_video:\s*\r?\n path: packages/media_kit_libs_windows_video\s*$') ` + -Message "root pubspec must override media_kit_libs_windows_video to the reviewed local package" + +$lock = Get-Content -LiteralPath $lockPath -Raw +$lockMatch = [regex]::Match( + $lock, + '(?m)^ media_kit_libs_windows_video:\s*\r?\n(?(?: {4}[^\r\n]*(?:\r?\n|$))+)(?=^ [a-zA-Z0-9_]+:)' +) +Assert-True ` + -Condition $lockMatch.Success ` + -Message "pubspec.lock must contain media_kit_libs_windows_video" +$lockBlock = $lockMatch.Groups["block"].Value +Assert-True ` + -Condition ($lockBlock -match '(?m)^ path: "packages/media_kit_libs_windows_video"\r?$') ` + -Message "lockfile must resolve the reviewed relative path" +Assert-True ` + -Condition ($lockBlock -match '(?m)^ source: path\r?$') ` + -Message "lockfile media package source must be path" +Assert-True ` + -Condition ($lockBlock -match '(?m)^ version: "1\.0\.11\+openbubbles\.1"\r?$') ` + -Message "lockfile must preserve the reviewed local package version" + +$packagePubspec = Get-Content -LiteralPath $packagePubspecPath -Raw +Assert-True ` + -Condition ($packagePubspec -match '(?m)^name: media_kit_libs_windows_video\r?$') ` + -Message "local package name must match the upstream plugin" +Assert-True ` + -Condition ($packagePubspec -match '(?m)^version: 1\.0\.11\+openbubbles\.1\r?$') ` + -Message "local package version must match the lockfile" +Assert-True ` + -Condition ($packagePubspec -match '(?m)^publish_to: none\r?$') ` + -Message "review package must not be publishable by accident" + +$packageConfigPath = Join-Path $repo ".dart_tool\package_config.json" +if (Test-Path -LiteralPath $packageConfigPath -PathType Leaf) { + $packageConfig = Get-Content -LiteralPath $packageConfigPath -Raw | + ConvertFrom-Json -ErrorAction Stop + $resolved = @( + $packageConfig.packages | + Where-Object { $_.name -eq "media_kit_libs_windows_video" } + ) + Assert-True ` + -Condition ($resolved.Count -eq 1) ` + -Message "Dart package config must resolve exactly one Windows media package" + $rootUri = [Uri]::new( + [Uri]::new((Split-Path $packageConfigPath -Parent) + "\"), + [string] $resolved[0].rootUri + ) + Assert-True ` + -Condition ((Get-NormalizedPath -Path $rootUri.LocalPath) -eq + (Get-NormalizedPath -Path $package)) ` + -Message "Dart package config must resolve the repo-local media package" +} + +$symlinkPath = Join-Path $repo ( + "windows\flutter\ephemeral\.plugin_symlinks\" + + "media_kit_libs_windows_video" +) +if ($RequireEphemeralSymlink -or (Test-Path -LiteralPath $symlinkPath)) { + $symlink = Get-Item -LiteralPath $symlinkPath -Force -ErrorAction Stop + Assert-True ` + -Condition ($symlink.LinkType -eq "SymbolicLink") ` + -Message "Flutter media plugin entry must be a symbolic link" + $target = @($symlink.Target)[0] + Assert-True ` + -Condition ((Get-NormalizedPath -Path $target) -eq + (Get-NormalizedPath -Path $package)) ` + -Message "Flutter plugin symlink must target the reviewed local package" +} + +$generatedPlugins = Get-Content -LiteralPath $generatedPluginsPath -Raw +Assert-True ` + -Condition ($generatedPlugins -match '(?m)^ media_kit_libs_windows_video\r?$') ` + -Message "Flutter generated plugin list must register the local media package" +Assert-True ` + -Condition ($generatedPlugins.Contains( + 'list(APPEND PLUGIN_BUNDLED_LIBRARIES ${${plugin}_bundled_libraries})' + )) ` + -Message "Flutter generated CMake must propagate plugin runtime libraries" + +$pluginCmake = Get-Content -LiteralPath $pluginCmakePath -Raw +foreach ($requiredText in @( + 'supports only Windows x64 and ARM64', + 'MEDIA_KIT_NATIVE_MEDIA_PORTABLE_EVIDENCE_FILES', + 'media_kit_libs_windows_video_portable_evidence_files', + 'media_kit_libs_windows_video_angle_license_directory', + 'PARENT_SCOPE' +)) { + Assert-True ` + -Condition $pluginCmake.Contains($requiredText) ` + -Message "plugin CMake must contain '$requiredText'" +} + +$rootCmake = Get-Content -LiteralPath $rootCmakePath -Raw +foreach ($requiredText in @( + 'media_kit_libs_windows_video_portable_evidence_files', + 'media_kit_libs_windows_video_angle_license_directory', + '${INSTALL_BUNDLE_DATA_DIR}/native-media', + '${INSTALL_BUNDLE_DATA_DIR}/native-media/angle-licenses', + 'install(FILES "${PLUGIN_BUNDLED_LIBRARIES}"' +)) { + Assert-True ` + -Condition $rootCmake.Contains($requiredText) ` + -Message "runner CMake must contain '$requiredText'" +} + +$verifiedBuild = Get-Content -LiteralPath $verifiedBuildPath -Raw +foreach ($requiredText in @( + 'The Flutter toolchain must use $expectedDartArch Dart', + 'Runner bundle is missing required native-media evidence', + 'Public redistribution gate must remain closed', + 'Runner native media hash mismatch', + 'Runner native media PE mismatch', + 'libmpv_toolchain_abi_load = "passed"' +)) { + Assert-True ` + -Condition $verifiedBuild.Contains($requiredText) ` + -Message "verified runner wrapper must contain '$requiredText'" +} + +$workflow = Get-Content -LiteralPath $workflowPath -Raw +foreach ($requiredText in @( + "if: github.event_name == 'workflow_dispatch'", + 'runner: windows-2025', + 'runner: windows-11-arm', + 'build_official_angle.ps1', + 'runtime_smoke.ps1', + 'build_verified_native_media_runner.ps1', + 'libmpv_binary_in_artifact = $false', + 'official-angle-${{ matrix.arch }}-${{ github.sha }}' +)) { + Assert-True ` + -Condition $workflow.Contains($requiredText) ` + -Message "native-media workflow must contain '$requiredText'" +} +Assert-True ` + -Condition ($workflow -notmatch + '(?ms)Upload short-lived engineering artifact.*?build[\\/]windows') ` + -Message "native-media workflow must not upload the blocked runner bundle" + +$validationWorkflow = Get-Content -LiteralPath $validationWorkflowPath -Raw +foreach ($requiredText in @( + 'name: Windows validation', + 'Verify architecture-aware native media integration', + 'Enforce public native-binary release gate', + '.github/workflows/windows-arm64-native-media.yml', + 'blocked_pending_transitive_license_inventory' +)) { + Assert-True ` + -Condition $validationWorkflow.Contains($requiredText) ` + -Message "Windows validation workflow must contain '$requiredText'" +} +foreach ($forbiddenText in @( + 'hard-codes an x86_64 libmpv', + 'flutter build windows', + 'Compress-Archive', + 'actions/upload-artifact@' +)) { + Assert-True ` + -Condition (-not $validationWorkflow.Contains($forbiddenText)) ` + -Message "Windows validation workflow must not contain '$forbiddenText'" +} + +foreach ($workflowSource in @($workflow, $validationWorkflow)) { + $actionReferences = [regex]::Matches( + $workflowSource, + '(?m)^\s*uses:\s*(?[^\s#]+)\s*$' + ) + foreach ($actionReference in $actionReferences) { + Assert-True ` + -Condition ($actionReference.Groups["reference"].Value -match + '@[0-9a-f]{40}$') ` + -Message ( + "GitHub Actions must be pinned to a full commit: " + + $actionReference.Groups["reference"].Value + ) + } +} + +$runtimeSmoke = Get-Content -LiteralPath $runtimeSmokePath -Raw +Assert-True ` + -Condition $runtimeSmoke.Contains( + 'Runtime smoke requires a native $expectedMachine PowerShell process' + ) ` + -Message "full DLL smoke must reject an emulated PowerShell process" + +$provenance = Get-Content -LiteralPath $provenancePath -Raw | + ConvertFrom-Json -ErrorAction Stop +Assert-True ` + -Condition ($provenance.schema_version -eq 1) ` + -Message "native dependency provenance schema must remain recognized" +foreach ($hash in @( + [string] $provenance.libmpv.artifacts.x64.sha256, + [string] $provenance.libmpv.artifacts.arm64.sha256 +)) { + Assert-True ` + -Condition ($hash -match '^[0-9a-f]{64}$') ` + -Message "each libmpv architecture must have a full lowercase SHA-256" +} +Assert-True ` + -Condition ($provenance.libmpv.license_mode_evidence.redistribution_status -eq + "blocked_pending_transitive_license_inventory") ` + -Message "public redistribution must fail closed until libmpv inventory is complete" + +$forbidden = @( + Get-ChildItem -LiteralPath $package -File -Recurse | + Where-Object { + $_.Extension.ToLowerInvariant() -in @( + ".dll", ".exe", ".7z", ".zip", ".msix", ".appx", ".pfx" + ) + } +) +Assert-True ` + -Condition ($forbidden.Count -eq 0) ` + -Message "no native binary, archive, installer, or signing key may be committed in the local package" + +$parseErrors = [System.Collections.Generic.List[string]]::new() +$scripts = @( + Get-ChildItem -LiteralPath (Join-Path $package "tool") -Filter "*.ps1" -File + Get-ChildItem -LiteralPath (Join-Path $repo "tooling\windows") -Filter "*.ps1" -File +) +foreach ($script in $scripts) { + $tokens = $null + $errors = $null + [System.Management.Automation.Language.Parser]::ParseFile( + $script.FullName, + [ref] $tokens, + [ref] $errors + ) | Out-Null + foreach ($error in @($errors)) { + $parseErrors.Add("$($script.Name): $($error.Message)") + } +} +Assert-True ` + -Condition ($parseErrors.Count -eq 0) ` + -Message "native-media PowerShell must parse: $($parseErrors -join '; ')" + +[pscustomobject]@{ + result = "passed" + assertions = $script:Assertions + package_root = $package + redistribution_status = ( + $provenance.libmpv.license_mode_evidence.redistribution_status + ) +} | ConvertTo-Json -Depth 4 diff --git a/windows/CMakeLists.txt b/windows/CMakeLists.txt index 1bd8cd03c5..db44c12980 100644 --- a/windows/CMakeLists.txt +++ b/windows/CMakeLists.txt @@ -3,6 +3,13 @@ project(bluebubbles_app LANGUAGES CXX) set(BINARY_NAME "bluebubbles_app") +# CMake reports the ARM64 host processor even when Visual Studio is generating +# an x64 target. Plugins such as ObjectBox use CMAKE_SYSTEM_PROCESSOR to select +# their runtime archive, so normalize it to the requested generator platform. +if(CMAKE_GENERATOR_PLATFORM STREQUAL "x64") + set(CMAKE_SYSTEM_PROCESSOR "AMD64") +endif() + cmake_policy(SET CMP0063 NEW) set(CMAKE_INSTALL_RPATH "$ORIGIN/lib") @@ -50,6 +57,34 @@ add_subdirectory("runner") # them to the application. include(flutter/generated_plugins.cmake) +# media_kit_libs_windows_video 1.0.10 bundles an isolated debug-runtime +# cluster from its ANGLE archive. None of these files is imported by libmpv, +# ANGLE, the media plugins, or the runner, and the debug files depend on the +# non-redistributable MSVCP140D runtime. Keep them out of release bundles. +set(OPENBUBBLES_UNUSED_MEDIA_RUNTIME_NAMES + "libc++.dll" + "zlib.dll" + "ucrtbased.dll" + "vccorlib140d.dll" + "vcruntime140d.dll" + "vcruntime140_1d.dll" +) +foreach(BUNDLED_LIBRARY IN LISTS PLUGIN_BUNDLED_LIBRARIES) + get_filename_component(BUNDLED_LIBRARY_NAME "${BUNDLED_LIBRARY}" NAME) + if(BUNDLED_LIBRARY_NAME IN_LIST OPENBUBBLES_UNUSED_MEDIA_RUNTIME_NAMES) + list(REMOVE_ITEM PLUGIN_BUNDLED_LIBRARIES "${BUNDLED_LIBRARY}") + endif() +endforeach() + +# The desktop OAuth and in-app WebView plugins link WebView2Loader.dll through +# NuGet targets, but neither declares it as a Flutter bundled library. The +# post-build copy reaches the normal runner directory but not an explicit +# install/package prefix, so add the target-architecture loader directly. +string(TOLOWER "${CMAKE_GENERATOR_PLATFORM}" WEBVIEW2_ARCH_DIRECTORY) +list(APPEND PLUGIN_BUNDLED_LIBRARIES + "${CMAKE_BINARY_DIR}/packages/Microsoft.Web.WebView2/build/native/${WEBVIEW2_ARCH_DIRECTORY}/WebView2Loader.dll" +) + # === Installation === # Support files are copied into place next to the executable, so that it can @@ -58,13 +93,40 @@ include(flutter/generated_plugins.cmake) set(BUILD_BUNDLE_DIR "$") # Make the "install" step default, as it's required to run. set(CMAKE_VS_INCLUDE_INSTALL_TO_DEFAULT_BUILD 1) -if(CMAKE_INSTALL_PREFIX_INITIALIZED_TO_DEFAULT) +# CMake 3.31 can leave INITIALIZED_TO_DEFAULT false while retaining this +# generated Visual Studio default. Treat only that exact path as the default; +# preserve any explicit custom install prefix. +if( + CMAKE_INSTALL_PREFIX_INITIALIZED_TO_DEFAULT + OR CMAKE_INSTALL_PREFIX STREQUAL "C:/Program Files/${PROJECT_NAME}" +) set(CMAKE_INSTALL_PREFIX "${BUILD_BUNDLE_DIR}" CACHE PATH "..." FORCE) endif() set(INSTALL_BUNDLE_DATA_DIR "${CMAKE_INSTALL_PREFIX}/data") set(INSTALL_BUNDLE_LIB_DIR "${CMAKE_INSTALL_PREFIX}") +if( + NOT media_kit_libs_windows_video_portable_evidence_files + OR NOT media_kit_libs_windows_video_angle_license_directory +) + message( + FATAL_ERROR + "The local architecture-aware media package did not expose its required " + "portable provenance and license inventory." + ) +endif() +install( + FILES ${media_kit_libs_windows_video_portable_evidence_files} + DESTINATION "${INSTALL_BUNDLE_DATA_DIR}/native-media" + COMPONENT Runtime +) +install( + DIRECTORY "${media_kit_libs_windows_video_angle_license_directory}/" + DESTINATION "${INSTALL_BUNDLE_DATA_DIR}/native-media/angle-licenses" + COMPONENT Runtime +) + install(TARGETS ${BINARY_NAME} RUNTIME DESTINATION "${CMAKE_INSTALL_PREFIX}" COMPONENT Runtime) diff --git a/windows/runner/win32_window.cpp b/windows/runner/win32_window.cpp index 29a2af7385..42f8f4a28a 100644 --- a/windows/runner/win32_window.cpp +++ b/windows/runner/win32_window.cpp @@ -19,6 +19,11 @@ namespace { constexpr const wchar_t kWindowClassName[] = L"FLUTTER_RUNNER_WIN32_WINDOW"; +// A simultaneous second launch can observe the mutex before the first launch +// has created its window. Retry briefly so app-link forwarding is not lost. +constexpr int kInstanceWindowLookupAttempts = 100; +constexpr DWORD kInstanceWindowLookupDelayMilliseconds = 50; + /// Registry key for app theme preference. /// /// A value of 0 indicates apps should use dark mode. A non-zero or missing @@ -38,6 +43,17 @@ int Scale(int source, double scale_factor) { return static_cast(source * scale_factor); } +HWND FindExistingInstanceWindow(const std::wstring& title) { + for (int attempt = 0; attempt < kInstanceWindowLookupAttempts; ++attempt) { + HWND window = FindWindowW(kWindowClassName, title.c_str()); + if (window != nullptr) { + return window; + } + Sleep(kInstanceWindowLookupDelayMilliseconds); + } + return nullptr; +} + // Dynamically loads the |EnableNonClientDpiScaling| from the User32 module. // This API is only needed for PerMonitor V1 awareness mode. void EnableFullDpiSupportIfAvailable(HWND hwnd) { @@ -119,6 +135,10 @@ Win32Window::Win32Window() { Win32Window::~Win32Window() { --g_active_window_count; Destroy(); + if (single_instance_mutex_ != nullptr) { + CloseHandle(single_instance_mutex_); + single_instance_mutex_ = nullptr; + } } bool Win32Window::Create(const std::wstring& title, @@ -294,28 +314,50 @@ void Win32Window::UpdateTheme(HWND const window) { } bool Win32Window::SendAppLinkToInstance(const std::wstring& title) { - HANDLE hMutex = OpenMutex(MUTEX_ALL_ACCESS, 0, title.c_str()); + if (single_instance_mutex_ != nullptr) { + return false; + } + + // CreateMutexW atomically creates or opens the named mutex. OpenMutex + // followed by CreateMutex leaves a race where two simultaneous processes can + // both decide they are first. + SetLastError(ERROR_SUCCESS); + HANDLE candidate_mutex = CreateMutexW(nullptr, FALSE, title.c_str()); + const DWORD create_error = GetLastError(); + + if (candidate_mutex == nullptr) { + // Fail closed. Starting without the guard could let two processes open the + // same ObjectBox profile. + OutputDebugStringW( + L"OpenBubbles could not establish its single-instance guard.\n"); + return true; + } - if (!hMutex) { - // Mutex doesn't exist. This is - // the first instance so create - // the mutex. - hMutex = CreateMutex(0, 0, title.c_str()); - } else { - // The mutex exists so this is the - // the second instance so return. + if (create_error != ERROR_ALREADY_EXISTS) { + // Retain the first instance's handle until destruction. The kernel mutex + // object ceases to be an ownership signal after the last handle closes. + single_instance_mutex_ = candidate_mutex; + return false; + } - // Find the window of First Instance - HWND hwnd = FindWindow(kWindowClassName, title.c_str()); + // A secondary instance only needs the handle long enough to make the atomic + // first/secondary decision. + CloseHandle(candidate_mutex); - // Dispatch new link to current window - SendAppLink(hwnd); + HWND hwnd = FindExistingInstanceWindow(title); + if (hwnd == nullptr) { + OutputDebugStringW( + L"OpenBubbles found its single-instance guard but not its window.\n"); + return true; + } - // (Optional) Restore our window to front in same state - WINDOWPLACEMENT place = { sizeof(WINDOWPLACEMENT) }; - GetWindowPlacement(hwnd, &place); + // Dispatch the new link to the first instance. + SendAppLink(hwnd); - switch(place.showCmd) { + // Restore the first instance's window to the foreground in the same state. + WINDOWPLACEMENT place = {sizeof(WINDOWPLACEMENT)}; + if (GetWindowPlacement(hwnd, &place)) { + switch (place.showCmd) { case SW_SHOWMAXIMIZED: ShowWindow(hwnd, SW_SHOWMAXIMIZED); break; @@ -326,12 +368,11 @@ bool Win32Window::SendAppLinkToInstance(const std::wstring& title) { ShowWindow(hwnd, SW_NORMAL); break; } - - SetWindowPos(0, HWND_TOP, 0, 0, 0, 0, SWP_SHOWWINDOW | SWP_NOSIZE | SWP_NOMOVE); - SetForegroundWindow(hwnd); - - return true; } - return false; + SetWindowPos(hwnd, HWND_TOP, 0, 0, 0, 0, + SWP_SHOWWINDOW | SWP_NOSIZE | SWP_NOMOVE); + SetForegroundWindow(hwnd); + + return true; } diff --git a/windows/runner/win32_window.h b/windows/runner/win32_window.h index f9493b6a5f..8096dd6990 100644 --- a/windows/runner/win32_window.h +++ b/windows/runner/win32_window.h @@ -91,12 +91,16 @@ class Win32Window { static void UpdateTheme(HWND const window); // Dispatches link if any. - // This method enables our app to be with a single instance too. - // This is mandatory if you want to catch further links in same app. + // This also atomically claims and retains the process single-instance mutex. + // Returns true when this process must not create another app window. bool SendAppLinkToInstance(const std::wstring& title); bool quit_on_close_ = false; + // Kept open for this Win32Window's lifetime so a second official runner + // cannot open the same application profile. + HANDLE single_instance_mutex_ = nullptr; + // window handle for top level window. HWND window_handle_ = nullptr;